commit b3847c7522892ab9184a05892db72969914743e5 Author: Ian bell Date: Wed May 14 12:46:24 2014 +0200 Initial commit for v5, but this time with the right line endings Signed-off-by: Ian bell diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..597114eb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +CoolProp/gitrevision.h merge=keepTheirs + +# Set default behaviour, in case users don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files we want to always be normalized and converted +# to native line endings on checkout. +*.c text +*.h text +*.mo text +*.order text +*.py text + +# Declare files that will always have CRLF line endings on checkout. +*.sln text eol=crlf +*.bat text eol=crlf +*.csproj text eol=crlf +*.cs text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.pdf binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..135e306c --- /dev/null +++ b/.gitignore @@ -0,0 +1,139 @@ +*~ +*.pyc +*.swp +*.o +*.obj +*.h.gch +*.lib +*.directory +*.DS_Store + +/dev/Tickets/oFiles + +/dev/figs + +/wrappers/Python/build +/wrappers/Python/CoolProp/*.o +/wrappers/Excel/CoolProp_x64.dll +/wrappers/Excel/CoolProp.dll + +/MSVC + +/Web/_build +/Web/Fluids/1-Butene.rst +/Web/Fluids/Acetone.rst +/Web/Fluids/Air.rst +/Web/Fluids/Ammonia.rst +/Web/Fluids/Argon.rst +/Web/Fluids/Benzene.rst +/Web/Fluids/CarbonDioxide.rst +/Web/Fluids/CarbonMonoxide.rst +/Web/Fluids/CarbonylSulfide.rst +/Web/Fluids/CycloPropane.rst +/Web/Fluids/Cyclopentane.rst +/Web/Fluids/D4.rst +/Web/Fluids/D5.rst +/Web/Fluids/D6.rst +/Web/Fluids/Deuterium.rst +/Web/Fluids/DimethylCarbonate.rst +/Web/Fluids/DimethylEther.rst +/Web/Fluids/Ethane.rst +/Web/Fluids/Ethanol.rst +/Web/Fluids/EthylBenzene.rst +/Web/Fluids/Ethylene.rst +/Web/Fluids/FluidInformation.rst +/Web/Fluids/Fluorine.rst +/Web/Fluids/HFE143m.rst +/Web/Fluids/Helium.rst +/Web/Fluids/Hydrogen.rst +/Web/Fluids/HydrogenSulfide.rst +/Web/Fluids/IsoButane.rst +/Web/Fluids/IsoButene.rst +/Web/Fluids/Isohexane.rst +/Web/Fluids/Isopentane.rst +/Web/Fluids/Krypton.rst +/Web/Fluids/MD2M.rst +/Web/Fluids/MD3M.rst +/Web/Fluids/MD4M.rst +/Web/Fluids/MDM.rst +/Web/Fluids/MM.rst +/Web/Fluids/Methane.rst +/Web/Fluids/Methanol.rst +/Web/Fluids/MethylLinoleate.rst +/Web/Fluids/MethylLinolenate.rst +/Web/Fluids/MethylOleate.rst +/Web/Fluids/MethylPalmitate.rst +/Web/Fluids/MethylStearate.rst +/Web/Fluids/Neon.rst +/Web/Fluids/Neopentane.rst +/Web/Fluids/Nitrogen.rst +/Web/Fluids/NitrousOxide.rst +/Web/Fluids/OrthoDeuterium.rst +/Web/Fluids/OrthoHydrogen.rst +/Web/Fluids/Oxygen.rst +/Web/Fluids/ParaDeuterium.rst +/Web/Fluids/ParaHydrogen.rst +/Web/Fluids/Propylene.rst +/Web/Fluids/Propyne.rst +/Web/Fluids/PureFluids.rst +/Web/Fluids/R11.rst +/Web/Fluids/R113.rst +/Web/Fluids/R114.rst +/Web/Fluids/R116.rst +/Web/Fluids/R12.rst +/Web/Fluids/R123.rst +/Web/Fluids/R1234yf.rst +/Web/Fluids/R1234ze(E).rst +/Web/Fluids/R1234ze(Z).rst +/Web/Fluids/R124.rst +/Web/Fluids/R125.rst +/Web/Fluids/R13.rst +/Web/Fluids/R134a.rst +/Web/Fluids/R14.rst +/Web/Fluids/R141b.rst +/Web/Fluids/R142b.rst +/Web/Fluids/R143a.rst +/Web/Fluids/R152A.rst +/Web/Fluids/R161.rst +/Web/Fluids/R21.rst +/Web/Fluids/R218.rst +/Web/Fluids/R22.rst +/Web/Fluids/R227EA.rst +/Web/Fluids/R23.rst +/Web/Fluids/R236EA.rst +/Web/Fluids/R236FA.rst +/Web/Fluids/R245fa.rst +/Web/Fluids/R32.rst +/Web/Fluids/R365MFC.rst +/Web/Fluids/R404A.rst +/Web/Fluids/R407C.rst +/Web/Fluids/R41.rst +/Web/Fluids/R410A.rst +/Web/Fluids/R507A.rst +/Web/Fluids/RC318.rst +/Web/Fluids/SES36.rst +/Web/Fluids/SulfurDioxide.rst +/Web/Fluids/SulfurHexafluoride.rst +/Web/Fluids/Toluene.rst +/Web/Fluids/Water.rst +/Web/Fluids/Xenon.rst +/Web/Fluids/cis-2-Butene.rst +/Web/Fluids/m-Xylene.rst +/Web/Fluids/n-Butane.rst +/Web/Fluids/n-Decane.rst +/Web/Fluids/n-Dodecane.rst +/Web/Fluids/n-Heptane.rst +/Web/Fluids/n-Hexane.rst +/Web/Fluids/n-Nonane.rst +/Web/Fluids/n-Octane.rst +/Web/Fluids/n-Pentane.rst +/Web/Fluids/n-Propane.rst +/Web/Fluids/n-Undecane.rst +/Web/Fluids/o-Xylene.rst +/Web/Fluids/p-Xylene.rst +/Web/Fluids/trans-2-Butene.rst + +/wrappers/Labview/CoolProp.dll +/Web/_static/doxygen +/Web/Fluids +/doc-v5 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..4590a193 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "externals/Catch"] + path = externals/Catch + url = https://github.com/philsquared/Catch.git +[submodule "externals/eigen"] + path = externals/eigen + url = https://github.com/RLovelett/eigen.git diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..ace61c50 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,28 @@ +language: python +virtualenv: + system_site_packages: true +python: + - "2.7" + - "3.2" + - "3.3" +# command to install dependencies +install: + - gcc -v + - pip -q install cython --install-option="--no-cython-compile" + - cd wrappers/Python + - python setup.py install # Install CoolProp + - cd ../SharedLibrary + - make + +# command to run tests +script: + - pwd + - cd $TRAVIS_BUILD_DIR/wrappers/Python/CoolProp/tests + - nosetests + +notifications: + email: + recipients: + - ian.h.bell@gmail.com + on_success: never # default: change + on_failure: always # default: always \ No newline at end of file diff --git a/CoolPropBibTeXLibrary.bib b/CoolPropBibTeXLibrary.bib new file mode 100644 index 00000000..f146a18c --- /dev/null +++ b/CoolPropBibTeXLibrary.bib @@ -0,0 +1,1551 @@ +% This file was created with JabRef 2.9.2. +% Encoding: ASCII + +@CONFERENCE{Akasaka-DELFT-2013, + author = {Ryo Akasaka and Yukihiro Higashi and Shigeru Koyama}, + title = {{A Fundamental Equation of State For Low-GWP Refrigerant HFO-1234ze(Z)}}, + booktitle = {4th IIR Conference on ThermophysicalProperties and Transfer Processes + of Refrigerants, Delft, The Netherlands, 2013}, + year = {2013}, + pages = {TP-052}, + owner = {Belli}, + timestamp = {2013.08.05} +} + +@ARTICLE{Akasaka-IJR-2012, + author = {Ryo Akasaka and Yohei Kayukawa}, + title = {{A fundamental equation of state for trifluoromethyl methyl ether + (HFE-143m) and its application to refrigeration cycle analysis}}, + journal = {International Journal of Refrigeration}, + year = {2012}, + volume = {35}, + pages = {1003-1013}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Aleksandrov-TE-2011, + author = {I. S. Aleksandrov and A. A. Gerasimov and B. A. Grigor'ev}, + title = {{Using Fundamental Equations of State for Calculating the Thermodynamic + Properties of Normal Undecane}}, + journal = {Thermal Engineering}, + year = {2011}, + volume = {58}, + pages = {691-698}, + number = {8}, + owner = {Belli}, + timestamp = {2013.04.11} +} + +@ARTICLE{Allal-PRE-2001, + author = {A. Allal and C. Boned and A. Baylaucq}, + title = {{Free-volume viscosity model for fluids in the dense and gaseous + states}}, + journal = {Physical Review E}, + year = {2001}, + volume = {64}, + pages = {011203-1:10}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@TECHREPORT{Arp-NIST-1998, + author = {V.D. Arp and R.D. McCarty and D.G Friend}, + title = {{Thermophysical Properties of Helium-4 from 0.8 to 1500 K with Pressures + to 2000 MPa - NIST Technical Note 1334 (revised)}}, + institution = {NIST}, + year = {1998}, + owner = {Belli}, + timestamp = {2013.08.05} +} + +@ARTICLE{Assael-JPCRD-2012A, + author = {M.J. Assael and E. Mihailidou and M.L. Huber and R.A. Perkins}, + title = {{Reference Correlation of the Thermal Conductivity of Benzene from + the Triple Point to 725 K and up to 500 MPa}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2012}, + volume = {41}, + pages = {043102-1:9}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Assael-JPCRD-2011, + author = {M. J. Assael and J.-A. M. Assael and M. L. Huber and R. A. Perkins + and Y. Takata}, + title = {{Correlation of the Thermal Conductivity of Normal and Parahydrogen + from the Triple Point to 1000 K and up to 100 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2011}, + volume = {40}, + pages = {033101-1:13}, + number = {3}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Assael-JPCRD-2013C, + author = {M. J. Assael and I. Bogdanou and S. K. Mylona and M. L. Huber and + R. A. Perkins and V. Vesovic}, + title = {{Reference Correlation of the Thermal Conductivity of n-Heptane from + the Triple Point to 600 K and up to 250 MPa}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2013}, + volume = {42}, + pages = {023101-1:9}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.28} +} + +@ARTICLE{Assael-JPCRD-2012, + author = {M. J. Assael and I. A. Koini and K. D. Antoniadis and M. L. Huber + and I. M. Abdulagatov and R. A. Perkins}, + title = {{Reference Correlation of the Thermal Conductivity of Sulfur Hexafluoride + from the Triple Point to 1000 K and up to 150 MPa}}, + journal = {Journal of Physical and Chemical Reference Data}, + year = {2012}, + volume = {41}, + pages = {023104-1:9}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Assael-JPCRD-2012B, + author = {M. J. Assael and S. K. Mylona and M. L. Huber and R. A. Perkins}, + title = {{Reference Correlation of the Thermal Conductivity of Toluene from + the Triple Point to 1000 K and up to 1000 MPa}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2012}, + volume = {41}, + pages = {023101-1:12}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Assael-JPCRD-2013B, + author = {M. J. Assael and S. K. Mylona and Ch. A. Tsiglifisi and M. L. Huber + and R. A. Perkins}, + title = {{Reference Correlation of the Thermal Conductivity of n-Hexane from + the Triple Point to 600 K and up to 500 MPa}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2013}, + volume = {42}, + pages = {013106-1:8}, + number = {1}, + owner = {Belli}, + timestamp = {2013.04.28} +} + +@ARTICLE{Assael-JPCRD-2013A, + author = {M. J. Assael and E. A. Sykioti and M. L. Huber and R. A. Perkins}, + title = {{Reference Correlation of the Thermal Conductivity of Ethanol from + the Triple Point to 600 K and up to 245 MPa}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2013}, + volume = {42}, + pages = {023102-1:10}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.28} +} + +@ARTICLE{Buecker-JPCRD-2006, + author = {D. Buecker and W. Wagner}, + title = {{A Reference Equation of State for the Thermodynamic Properties of + Ethane for Temperatures from the Melting Line to 675 K and Pressures + up to 900 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2006}, + volume = {35}, + pages = {205-266}, + number = {1}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Buecker-JPCRD-2006B, + author = {D. Buecker and W. Wagner}, + title = {{Reference Equations of State for the Thermodynamic Properties of + Fluid Phase n-Butane and Isobutane}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2006}, + volume = {35}, + pages = {929-1019}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.30} +} + +@TECHREPORT{Chichester-NIST-2008, + author = {Justin C. Chichester and Marcia L. Huber}, + title = {{NISTIR 6650: Documentation and Assessment of the Transport Property + Model for Mixtures Implemented in NIST REFPROP (Version 8.0)}}, + institution = {National Institute of Standards and Technology (NIST)}, + year = {June 2008}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Colonna-FPE-2008, + author = {P. Colonna and N.R. Nannan and A. Guardone}, + title = {{Multiparameter equations of state for siloxanes: [(CH3)3-Si-O1/2]2-[O-Si-(CH3)2]i=1,...,3, + and [O-Si-(CH3)2]6}}, + journal = {Fluid Phase Equilibria}, + year = {2008}, + volume = {263}, + pages = {115-130}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Colonna-FPE-2006, + author = {P. Colonna and N.R. Nannan and A. Guardone and E.W. Lemmon}, + title = {{Multiparameter equations of state for selected siloxanes}}, + journal = {Fluid Phase Equilibria}, + year = {2006}, + volume = {244}, + pages = {193-211}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@MISC{Therminol2007, + author = {{Eastman Chemical Company}}, + title = {{Therminol Heat Transfer Reference Disk, Version 5.0}} +} + +@ARTICLE{Fenghour-JPCRD-1995, + author = {A. Fenghour and W.A. Wakeham and V. Vesovic and J.T.R. Watson and + J. Millat and E. Vogel}, + title = {{The Viscosity of Ammonia}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1995}, + volume = {24}, + pages = {1649-1667}, + note = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Froeba-2000, + author = {A.P. Fr\"{o}ba and S. Will and A. Leipertz}, + title = {{Saturated Liquid Viscosity and Surface Tension of Alternative Refrigerants}}, + journal = {Int. J. Thermophys.}, + year = {2000}, + volume = {21}, + pages = {1225-1253}, + note = {10.1023/A:1006689724974}, + issn = {0195-928X}, + issue = {6}, + keyword = {Physics and Astronomy}, + owner = {ibell}, + publisher = {Springer Netherlands}, + timestamp = {2011.04.17}, + url = {http://dx.doi.org/10.1023/A:1006689724974} +} + +@ARTICLE{Friend-JPCRD-1991, + author = {Daniel G. Friend and Hepburn Ingham and James F. Ely}, + title = {{Thermophysical Properties of Ethane}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1991}, + volume = {20}, + pages = {275-347}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Gedanitz-PREPRINT-2013, + author = {Holger Gedanitz and Mar{\'i}a J. D{\'a}vila and Eric W. Lemmon}, + title = {{Speed of sound measurements and a fundamental equation of state + for cyclopentane}}, + year = {To be published, preprint provided by Eric Lemmon}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@CONFERENCE{Geller-PURDUE-2000, + author = {V. Geller}, + title = {{Viscosity of Mixed Refrigerants R404A, R407C, R410A, and R507A}}, + booktitle = {2000 International Refrigeration Conferences at Purdue University}, + year = {2000}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Geller-IJT-2001, + author = {V.Z. Geller and B.Z. Nemzer and U.V. Cheremnykh}, + title = {{Thermal Conductivity of the Refrigerant mixtures R404A, R407C, R410A, + and R507A}}, + journal = {Int. J. Thermophys.}, + year = {2001}, + volume = {22}, + pages = {1034-1043}, + owner = {ibell}, + timestamp = {2010.06.30} +} + +@ARTICLE{Guder-JPCRD-2009, + author = {C. Guder and W. Wagner}, + title = {{A Reference Equation of State for the Thermodynamic Properties of + Sulfur Hexafluoride SF6 for Temperatures from the Melting Line to + 625 K and Pressures up to 150 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2009}, + volume = {38}, + pages = {33-94}, + number = {1}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Hands-CRYO-1981, + author = {B.A. Hands and V.D. Arp}, + title = {{A Correlation of Thermal Conductivity Data for Helium}}, + journal = {Cryogenics}, + year = {1981}, + volume = {21}, + pages = {697-703}, + number = {12}, + owner = {Belli}, + timestamp = {2013.08.05} +} + +@ARTICLE{Heide-IJR-1997, + author = {R. Heide}, + title = {{The surface tension of HFC refrigerants and mixtures}}, + journal = {Int J. Refrig.}, + year = {1997}, + volume = {20}, + pages = {496-503}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Holland-JPCRD-1983, + author = {P.M. Holland and B.E. Eaton and H.J.M. Hanley}, + title = {{A Correlation of the Viscosity and Thermal Conductivity Data of + Gaseous and Liquid Ethylene}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1983}, + volume = {12}, + pages = {917-932}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Huber-FPE-2005, + author = {M.L. Huber and R.A. Perkins}, + title = {{Thermal conductivity correlations for minor constituent fluids in + natural gas: n-octane, n-nonane and n-decane}}, + journal = {Fluid Phase Equilibria}, + year = {2005}, + volume = {227}, + pages = {47-55}, + owner = {Belli}, + timestamp = {2013.04.14} +} + +@ARTICLE{Huber-JPCRD-2009, + author = {M.L. Huber and R.A. Perkins and A. Laesecke and D.G. Friend and J.V. + Sengers and M.J Assael and I.M. Metaxa and E. Vogel and R. Mare{\v + s} and K. Miyagawa}, + title = {{New International Formulation for the Viscosity of H2O}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2009}, + volume = {38}, + pages = {101-125}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Huber-FPE-1992, + author = {Marcia L. Huber and James F. Ely}, + title = {{Prediction of Viscosity of Refrigerants and Refrigerant Mixtures}}, + journal = {Fluid Phase Equilibria}, + year = {1992}, + volume = {80}, + pages = {239-248}, + owner = {Belli}, + timestamp = {2013.05.29} +} + +@ARTICLE{Huber-IECR-2006, + author = {Marcia L. Huber and Arno Laesecke}, + title = {{Correlation for the Viscosity of Pentafluoroethane (R125) from the + Triple Point to 500 K at Pressures up to 60 MPa}}, + journal = {Ind. Eng. Chem. Res.}, + year = {2006}, + volume = {45}, + pages = {4447-4453}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Huber-EF-2004, + author = {Marcia L. Huber and Arno Laesecke and Richard Perkins}, + title = {{Transport Properties of n-Dodecane}}, + journal = {Energy \& Fuels}, + year = {2004}, + volume = {18}, + pages = {968-975}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Huber-IECR-2003, + author = {Marcia L. Huber and Arno Laesecke and Richard A. Perkins}, + title = {{Model for the Viscosity and Thermal Conductivity of Refrigerants, + Including a New Correlation for the Viscosity of R134a}}, + journal = {Ind. Eng. Chem. Res.}, + year = {2003}, + volume = {42}, + pages = {3163-3178}, + owner = {ibell}, + timestamp = {2010.07.06} +} + +@ARTICLE{Huber-FPE-2004, + author = {Marcia L. Huber and Arno Laesecke and Hong Wei Xiang}, + title = {{Viscosity correlations for minor constituent fluids in natural gas: + n-octane, n-nonane and n-decane}}, + journal = {Fluid Phase Equilibria}, + year = {2004}, + volume = {224}, + pages = {263-270}, + owner = {Belli}, + timestamp = {2013.04.14} +} + +@ARTICLE{Huber-EF-2009, + author = {Marcia L. Huber and Eric W. Lemmon and Andrei Kazakov and Lisa S. + Ott and Thomas J. Bruno}, + title = {{Model for the Thermodynamic Properties of a Biodiesel Fuel}}, + journal = {Energy \& Fuels}, + year = {2009}, + volume = {23}, + pages = {3790-3797}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Huber-JPCRD-2012, + author = {M. L. Huber and R. A. Perkins and D. G. Friend and J. V. Sengers + and M. J. Assael and I. N. Metaxa and K. Miyagawa and R. Hellmann + and E. Vogel}, + title = {{New International Formulation for the Thermal Conductivity of H2O}}, + journal = {J. Phys. Chem Ref. Data}, + year = {2012}, + volume = {41}, + pages = {033102-1:23}, + number = {3}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Jacobsen-FPE-1992, + author = {R.T Jacobsen and S.G. Penoncello and E.W. Lemmon}, + title = {{A Fundamental Equation for Trichlorofluoromethane (R-11)}}, + journal = {Fluid Phase Equilibria}, + year = {1992}, + volume = {80}, + pages = {45-56}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Jaeschke-IJT-1995, + author = {M. Jaeschke and P. Schley}, + title = {{Ideal-Gas Thermodynamic Properties for Natural-Gas Applications}}, + journal = {Int. J. Thermophys.}, + year = {1995}, + volume = {16}, + pages = {1381-1392}, + number = {6}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Kamei-IJT-1995, + author = {A. Kamei and S. W. Beyerlein and R. T Jacobsen}, + title = {{Application of Nonlinear Regression in the Development of a Wide + Range Formulation for HCFC-22}}, + journal = {International Journal of Thermophysics}, + year = {1995}, + volume = {16}, + pages = {1155-1164}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Katti-ACE-1986, + author = {R. Katti and R.T. Jacobsen and R.B. Stewart and M. Jehangiri}, + title = {{Thermodynamic Properties of Neon for Temperatures from the Triple + Point to 700 K at Pressures to 700 MPa}}, + journal = {Advances in Cryogenic Engineering}, + year = {1986}, + volume = {31}, + pages = {1189-1197}, + owner = {Belli}, + timestamp = {2013.04.30} +} + +@ARTICLE{Kiselev-IECR-2005, + author = {S. B. Kiselev and J. F. Ely and I. M. Abdulagatov and M. L. Huber}, + title = {{Generalized SAFT-DFT/DMT Model for the Thermodynamic, Interfacial, + and Transport Properties of Associating Fluids: Application for n-Alkanols}}, + journal = {Ind. Eng. Chem. Res.}, + year = {2005}, + volume = {44}, + pages = {6916-6927}, + owner = {Belli}, + timestamp = {2013.04.14} +} + +@ARTICLE{Krauss-IJT-1996, + author = {R. Krauss and I V. C. Weiss and T. A. Edison and J. V. Sengers and + K. Stephan}, + title = {{Transport Properties of 1,1-Difluoroethane (R152a)}}, + journal = {Int. J. Thermophys}, + year = {1996}, + volume = {17}, + pages = {731-757}, + owner = {Belli}, + timestamp = {2013.04.28} +} + +@BOOK{Kunz-BOOK-2007, + title = {{The GERG-2004 Wide-Range Equation of State for Natural Gases and + Other Mixtures}}, + publisher = {VDI Verlag GmbH}, + year = {2007}, + author = {O. Kunz and R. Klimeck and W. Wagner and M. Jaeschke}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{Kunz-JCED-2012, + author = {O. Kunz and W. Wagner}, + title = {{The GERG-2008 Wide-Range Equation of State for Natural Gases and + Other Mixtures: An Expansion of GERG-2004}}, + journal = {Journal of Chemical and Engineering Data}, + year = {2012}, + volume = {57}, + pages = {3032-3091}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{Laesecke-IJR-1996, + author = {Arno Laesecke and Richard A. Perkins and John B. Howley}, + title = {{An improved correlation for the thermal conductivity of HCFC123 + (2,2-dichloro-1,1,1-trifluoroethane)}}, + journal = {Int J. Refrig.}, + year = {1996}, + volume = {19}, + pages = {231-238}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Leachman-JPCRD-2009, + author = {J.W. Leachman and R.T. Jacobsen and S.G. Penoncello and E.W. Lemmon}, + title = {{Fundamental Equations of State for Parahydrogen, Normal Hydrogen, + and Orthohydrogen}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2009}, + volume = {38}, + pages = {721-748}, + number = {3}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Lemmon-IJT-2003, + author = {E.W. Lemmon}, + title = {{Pseudo-Pure Fluid Equations of State for the Refrigerant Blends + R-410A, R-404A, R-507A, and R-407C}}, + journal = {Int. J. Thermophys.}, + year = {2003}, + volume = {24}, + pages = {991-1006}, + number = {4}, + file = {:D\:\\My_Documents\\Library\\Papers\\Lemmon 2003.pdf:PDF}, + keywords = {EOS}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@MISC{Lemmon-RP-2010, + author = {E.W. Lemmon and M.L. Huber and M.O. McLinden}, + title = {{NIST Standard Reference Database 23: Reference Fluid Thermodynamic + and Transport Properties-REFPROP, Version 9.0}}, + year = {2010}, + owner = {ibell}, + timestamp = {2011.03.05} +} + +@ARTICLE{Lemmon-JPCRD-2000, + author = {Eric Lemmon and Richard T. Jacobsen and Steven G. Penoncello and + Daniel Friend}, + title = {{Thermodynamic Properties of Air and Mixtures of Nitrogen, Argon, + and Oxygen from 60 to 2000 K at Pressures to 2000 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2000}, + volume = {29}, + pages = {331-385}, + number = {3}, + file = {:D\:\\My_Documents\\Library\\Papers\\Lemmon 2000.pdf:PDF}, + keywords = {EOS}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@UNPUBLISHED{Lemmon-PROPYLENE-2013, + author = {E.W. Lemmon and U. Overhoff and M.O. McLinden and W. Wagner}, + title = {{Equation of state for propylene}}, + note = {Personal communication with Eric Lemmon}, + year = {2010}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Lemmon-JCED-2006, + author = {E.W. Lemmon and R. Span}, + title = {{Short Fundamental Equations of State for 20 Industrial Fluids}}, + journal = {J. Chem. Eng. Data}, + year = {2006}, + volume = {51}, + pages = {785-850}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Lemmon-EF-2004, + author = {Eric W. Lemmon and Marcia L. Huber}, + title = {{Thermodynamic Properties of n-Dodecane}}, + journal = {Energy \& Fuels}, + year = {2004}, + volume = {18}, + pages = {960-967}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Lemmon-FPE-2005, + author = {Eric W. Lemmon and E. Christian Ihmels}, + title = {{Thermodynamic properties of the butenes Part II. Short fundamental + equations of state}}, + journal = {Fluid Phase Equilibria}, + year = {2005}, + volume = {228-229}, + pages = {173-187}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Lemmon-JPCRD-2005, + author = {Eric W. Lemmon and Richard T Jacobsen}, + title = {{A New Functional Form and New Fitting Techniques for Equations of + State with Application to Pentafluoroethane (HFC-125)}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2005}, + volume = {34}, + pages = {69-108}, + number = {1}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Lemmon-IJT-2004, + author = {E. W. Lemmon and R. T Jacobsen}, + title = {{Viscosity and Thermal Conductivity Equations for Nitrogen, Oxygen, + Argon, and Air}}, + journal = {International Journal of Thermophysics}, + year = {2004}, + volume = {25}, + pages = {21-69}, + number = {1}, + comment = {Critical enhancement included}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Lemmon-JPCRD-2004, + author = {Eric W. Lemmon and Richard T. Jacobsen}, + title = {{Equations of State for Mixtures of R-32, R-125, R-134a, R-143a, + and R-152a}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2004}, + volume = {33}, + pages = {593-620}, + number = {2}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{LemmonJacobsen-JPCRD-2000, + author = {Eric W. Lemmon and Richard T. Jacobsen}, + title = {{An International Standard Formulation for the Thermodynamic Properties + of 1,1,1-Trifluoroethane (HFC-143a) for Temperatures From 161 to + 450 K and Pressures to 50 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2000}, + volume = {29}, + pages = {521-552}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Lemmon-IJT-1999, + author = {E. W. Lemmon and R. T Jacobsen}, + title = {{A Generalized Model for the Thermodynamic Properties of Mixtures}}, + journal = {International Journal of Thermophysics}, + year = {1999}, + volume = {20}, + pages = {825-835}, + number = {3}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{Lemmon-JCED-2009, + author = {Eric W. Lemmon and Mark O. McLinden and Wolfgang Wagner}, + title = {{Thermodynamic Properties of Propane. III. A Reference Equation of + State for Temperatures from the Melting Line to 650 K and Pressures + up to 1000 MPa}}, + journal = {Journal of Chemical Engineering Data}, + year = {2009}, + volume = {54}, + pages = {3141-3180}, + owner = {Belli}, + timestamp = {2013.03.19} +} + +@ARTICLE{Llovell-JPCB-2013, + author = {F. Llovell and R. M. Marcos and L. F. Vega}, + title = {{Transport Properties of Mixtures by the Soft-SAFT + Free-Volume + Theory: Application to Mixtures of n-Alkanes and Hydrofluorocarbons}}, + journal = {Journal of Physical Chemistry B}, + year = {2013}, + volume = {117}, + pages = {5195-5205}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{Marsh-JCED-2002, + author = {Kenneth N. Marsh and Richard A. Perkins and Maria L. V. Ramires}, + title = {{Measurement and Correlation of the Thermal Conductivity of Propane + from 86 K to 600 K at Pressures to 70 MPa}}, + journal = {J. Chem. Eng. Data}, + year = {2002}, + volume = {47}, + pages = {932-940}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@BOOK{Marx-BOOK-1992, + title = {{Neue Zustandsgleichung f\"{u}r R 12, R 22, R 11 und R 113 - Beschreibung + des therodynamischen Zustandsverhaltens bei Temperaturen bis 525 + K und Dru\"{u}cken bis 200 MPa}}, + publisher = {VDI Verlag}, + year = {1992}, + author = {Volker Marx and Andreas Pruss and Wolfgang Wagner}, + volume = {19}, + number = {57}, + owner = {Belli}, + timestamp = {2013.05.20} +} + +@ARTICLE{McLinden-PREPRINT-2013, + author = {M.O. McLinden and E.W. Lemmon}, + title = {{Thermodynamic Properties of R-227ea, R-365mfc, R-115, and R-13I1}}, + journal = {J. Chem. Eng. Data}, + year = {To be submitted}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{McLinden-IJR-2000, + author = {Mark O. McLinden and Sanford A. Klein and Richard A. Perkins}, + title = {{An extended corresponding states model for the thermal conductivity + of refrigerants and refrigerant mixtures}}, + journal = {Int. J. Refrig.}, + year = {2000}, + volume = {23}, + pages = {43-63}, + owner = {ibell}, + timestamp = {2010.07.06} +} + +@CONFERENCE{McLinden-PURDUE-2010, + author = {Mark O. McLinden and Monika Thol and Eric W. Lemmon}, + title = {{Thermodynamic Properties of trans-1,3,3,3-tetrafluoropropene [R1234ze(E)]: + Measurements of Density and Vapor Pressure and a Comprehensive Equation + of State}}, + booktitle = {International Refrigeration and Air Conditioning Conference at Purdue, + July 12-15, 2010}, + year = {2010}, + comment = {The constants as written in the paper are not the most up-to-date + EOS constants. REFPROP 9.1 contains the updated coefficients and + they are used with permission. Also the sign of the terms for eta_k + and beta_k should be inverted in the table}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@BOOK{Melinder-BOOK-2010, + title = {{Properties of Secondary Working Fluids for Indirect Systems}}, + publisher = {IIF-IIR Publishing}, + year = {2010}, + author = {{\r{A}}ke Melinder} +} + +@ARTICLE{Meng-JCED-2012, + author = {Xianyang Meng and Jianbo Zhang and Jiangtao Wu and Zhigang Liu}, + title = {{Experimental Measurement and Modeling of the Viscosity of Dimethyl + Ether}}, + journal = {J. Chem. Eng. Data}, + year = {2012}, + volume = {57}, + pages = {988-993}, + comment = {Erratum: Limits for deltaeta_r sums should be 0-3 and 4-9. The correct + order of terms based on the original indices are 0,1,7,9,2,3,4,5,6,8}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Michailidou-JPCRD-2013, + author = {E. K. Michailidou and M. J. Assael and M. L. Huber and R. A. Perkins}, + title = {{Reference Correlation of the Viscosity of n-Hexane from the Triple + Point to 600 K and up to 100 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2013}, + volume = {42}, + pages = {033104:1-12}, + number = {3}, + owner = {Belli}, + timestamp = {2013.09.21} +} + +@ARTICLE{Mulero-JPCRD-2012, + author = {A. Mulero and I. Cachadi{\~n}a and M. I. Parra}, + title = {{Recommended Correlations for the Surface Tension of Common Fluids}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2012}, + volume = {41}, + pages = {043105-1:13}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Muzny-JCED-2013, + author = {Chris D. Muzny and Marcia L. Huber and Andrei F. Kazakov}, + title = {{Correlation for the Viscosity of Normal Hydrogen Obtained from Symbolic + Regression}}, + journal = {J. Chem. Eng. Data}, + year = {2013}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@UNPUBLISHED{OrtizVega-2010, + author = {D.O. Ortiz-Vega and K.R. Hall and V.D. Arp and E.W. Lemmon}, + title = {{Equation of state for Helium}}, + note = {Unpublished - coefficients from REPROP with permission}, + year = {2013}, + owner = {Belli}, + timestamp = {2013.08.05} +} + +@ARTICLE{Patek2006, + author = {J. P\'atek and J. Klomfar}, + title = {{A computationally effective formulation of the thermodynamic properties + of LiBr-H2O solutions from 273 to 500 K over full composition range}}, + journal = {International Journal of Refrigeration}, + year = {2006}, + volume = {29}, + pages = {566--578}, + number = {4}, + month = {June}, + doi = {10.1016/j.ijrefrig.2005.10.007}, + owner = {jowr}, + timestamp = {2013.11.22} +} + +@ARTICLE{Pan-FPE-2012, + author = {Jiang Pan and Xinfang Rui and Xiaodong Zhao and Liming Qiu}, + title = {{An equation of state for the thermodynamic properties of 1,1,1,3,3,3-hexafluoropropane + (HFC-236fa)}}, + journal = {Fluid Phase Equilibria}, + year = {2012}, + volume = {321}, + pages = {10-16}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@ARTICLE{Peng-IECF-1976, + author = {Ding-Yu Peng and Donald B. Robinson}, + title = {{A New Two-Constant Equation of State}}, + journal = {Ind. Eng. Chem. Fundamen.}, + year = {1976}, + volume = {15}, + pages = {59-64}, + number = {1}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{Penoncello-IJT-1995, + author = {S. G. Penoncello and R. T Jacobsen and A. R. H. Goodwin}, + title = {{A Thermodynamic Property Formulation for Cyclohexane}}, + journal = {Int. J. Thermophys.}, + year = {1995}, + volume = {16}, + pages = {519-531}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Penoncello-JPCRD-2003, + author = {Steven G. Penoncello and Eric W. Lemmon and Richard T Jacobsen and + Zhengjun Shan}, + title = {{A Fundamental Equation for Trifluoromethane (R-23)}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2003}, + volume = {32}, + pages = {1473-1499}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Perkins-JCED-2002B, + author = {R.A. Perkins}, + title = {{Measurement and Correlation of the Thermal Conductivity of Isobutane + from 114 K to 600 K at Pressures to 70 MPa}}, + journal = {J. Chem. Eng. Data}, + year = {2002}, + volume = {47}, + pages = {1272-1279}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Perkins-JCED-2011, + author = {Richard A. Perkins and Marcia L. Huber}, + title = {{Measurement and Correlation of the Thermal Conductivity of 2,3,3,3-Tetrafluoroprop-1-ene + (R1234yf) and trans-1,3,3,3-Tetrafluoropropene (R1234ze(E))}}, + journal = {Journal of Chemical Engineering Data}, + year = {2011}, + volume = {56}, + pages = {4868-4874}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Perkins-JCED-2006, + author = {Richard A. Perkins and Marcia L. Huber}, + title = {{Measurement and Correlation of the Thermal Conductivity of Pentafluoroethane + (R125) from 190 K to 512 K at Pressures to 70 MPa}}, + journal = {J. Chem. Eng. Data}, + year = {2006}, + volume = {51}, + pages = {898-904}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Perkins-JCED-2002A, + author = {R.A. Perkins and M.L.V. Ramires and C.A. Nieto de Castro and L. Cusco}, + title = {{Measurement and Correlation of the Thermal Conductivity of Butane + from 135 K to 600 K at Pressures to 70 MPa}}, + journal = {J. Chem. Eng. Data}, + year = {2002.}, + volume = {47}, + pages = {1263-1271}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Piazza-FPE-2013, + author = {L. Piazza and R. Span}, + title = {{An equation of state for methanol including the association term + of SAFT}}, + journal = {Fluid Phase Equilibria}, + year = {2013}, + volume = {349}, + pages = {12-24}, + owner = {Belli}, + timestamp = {2014.02.02} +} + +@ARTICLE{Piazza-FPE-2011, + author = {L. Piazza and R. Span}, + title = {{An equation of state for acetic acid including the association term + of SAFT}}, + journal = {Fluid Phase Equilibria}, + year = {2011}, + volume = {303}, + pages = {134-149}, + owner = {Belli}, + timestamp = {2014.02.27} +} + +@BOOK{Platzer-BOOK-1990, + title = {{Thermophysical Properties of Refrigerants}}, + publisher = {Springer-Verlag}, + year = {1990}, + author = {B. Platzer and A. Polt and G. Maurer}, + owner = {Belli}, + timestamp = {2013.05.20} +} + +@BOOK{Poling-BOOK-2001, + title = {{The Properties of Gases and Liquids, 5th edition}}, + publisher = {McGraw Hill}, + year = {2001}, + author = {Bruce E. Poling and John M. Prausnitz and John P. O'Connell}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Polt-CT-1992, + author = {Axel Polt and Bernhard Platzer and Gerd Maurer}, + title = {{Parameter der thermischen Zustandsgleichung von Bender f{\"u} 14 + mehratomige reine Stoffe}}, + journal = {Chem. Technik}, + year = {1992}, + volume = {22}, + pages = {216-224}, + owner = {Belli}, + timestamp = {2013.04.29} +} + +@ARTICLE{QuinonesCisneros-JPCRD-2012, + author = {S.E. Qui{\~n}ones-Cisneros and M.L. Huber and U.K. Deiters}, + title = {{Correlation for the Viscosity of Sulfur Hexafluoride (SF6) from + the Triple Point to 1000 K and Pressures to 50 MPa}}, + journal = {Journal of Physical and Chemical Reference Data}, + year = {2012}, + volume = {41}, + pages = {023102-1:11}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{QuinonesCisneros-JCED-2012, + author = {Sergio E. Qui{\~n}ones-Cisneros and Kurt A. G. Schmidt and Binod + R. Giri and Pierre Blais and Robert A. Marriott}, + title = {{Reference Correlation for the Viscosity Surface of Hydrogen Sulfide}}, + journal = {J. Chem. Eng. Data}, + year = {2012}, + volume = {57}, + pages = {3014-3018}, + owner = {Belli}, + timestamp = {2013.04.14} +} + +@ARTICLE{QuinonesCisneros-FPE-2001, + author = {Sergio E. Qui{\~n}ones-Cisneros and Claus K. Z{\'e}berg-Mikkelsen + and Erling H. Stenby}, + title = {{One parameter friction theory models for viscosity}}, + journal = {Fluid Phase Equilibria}, + year = {2001}, + volume = {176}, + pages = {1-16}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@ARTICLE{QuinonesCisneros-FPE-2000, + author = {Sergio E. Qui{\~n}ones-Cisneros and Claus K. Zeberg-Mikkelsen and + Erling H. Stenby}, + title = {{The friction theory (f-theory) for viscosity modeling}}, + journal = {Fluid Phase Equilibria}, + year = {2000}, + volume = {169}, + pages = {249-276}, + owner = {Belli}, + timestamp = {2013.07.07} +} + +@BOOK{deReuck-BOOK-1990, + title = {{Fluorine: International Thermodynamic Tables of the Fluid State + - 11}}, + publisher = {Blackwell Scientific Publications}, + year = {1990}, + author = {K.M. de Reuck}, + owner = {Belli}, + timestamp = {2013.05.17} +} + +@BOOK{deReuck-BOOK-1993, + title = {{Methanol: International Thermodynamic Tables of the Fluid State + - 12}}, + publisher = {Blackwell Scientific Publications}, + year = {1993}, + author = {K.M. de Reuck and R.J.B. Craven}, + owner = {Belli}, + timestamp = {2013.05.17} +} + +@ARTICLE{Richardson-JPCRD-2013, + author = {I.A. Richardson and J.W. Leachman and E.W. Lemmon}, + title = {Fundamental Equation of State for Deuterium}, + journal = {J. Phys. Chem Ref. Data}, + year = {2013}, + volume = {In Press}, + owner = {Belli}, + timestamp = {2013.07.28} +} + +@ARTICLE{Richter-JCED-2011, + author = {M. Richter and M.O. McLinden and E.W. Lemmon}, + title = {{Thermodynamic Properties of 2,3,3,3-Tetrafluoroprop-1-ene (R1234yf): + Vapor Pressure and p-rho-T Measurements and an Equation of State}}, + journal = {J. Chem. Eng. Data}, + year = {2011}, + volume = {56}, + pages = {3254-3264}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Rui-FPE-2013, + author = {Xinfang Rui and Jiang Pan and Yugang Wang}, + title = {{An equation of state for the thermodynamic properties of 1,1,1,2,3,3-hexafluoropropane + (R236ea)}}, + journal = {Fluid Phase Equilibria}, + year = {2013}, + volume = {341}, + pages = {78-85}, + comment = {Erratum in paper: a1 should be -17.5983849 and a2 should be 8.87150449}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@MASTERSTHESIS{Schroeder-MSTHESIS-2011, + author = {Jacob Armin Schroeder}, + title = {{A New Fundamental Equation for Ethanol}}, + school = {University of Idaho}, + year = {2011}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Setzmann-JPCRD-1991, + author = {U. Setzmann and W. Wagner}, + title = {{A New Equation of State and Tables of Thermodynamic Properties for + Methane Covering the Range from the Melting Line to 625 K at Pressures + up to 1000 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1991}, + volume = {20}, + pages = {1061-1151}, + number = {6}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Shan-ASHRAE-2000, + author = {Zhengjun Shan and Steven G. Penoncello and Richard T. Jacobsen}, + title = {{A Generalized Model for Viscosity and Thermal Conductivity of Trifluoromethane + (R-23)}}, + journal = {ASHRAE Transactions}, + year = {2000}, + pages = {DA-00-10-2}, + owner = {Belli}, + timestamp = {2013.04.29} +} + +@ARTICLE{Smukala-JPCRD-2000, + author = {J. Smukala and R. Span and W. Wagner}, + title = {{New Equation of State for Ethylene Covering the Fluid Region for + Temperatures From the Melting Line to 450 K at Pressures up to 300 + MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2000}, + volume = {29}, + pages = {1053-1121}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Span-JPCRD-2000, + author = {Roland Span and Eric W. Lemmon and Richard T. Jacobsen and Wolfgang + Wagner and Akimichi Yokozeki}, + title = {{A Reference Equation of State for the Thermodynamic Properties of + Nitrogen for Temperatures from 63.151 to 1000 K and Pressures to + 2200 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2000}, + volume = {29}, + pages = {1361-1433}, + file = {:D\:\\My_Documents\\Library\\Papers\\Span Lemmon et al 2000.pdf:PDF}, + keywords = {EOS}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Span-IJT-2003B, + author = {R. Span and W. Wagner}, + title = {{Equations of State for Technical Applications. II. Results for Nonpolar + Fluids}}, + journal = {International Journal of Thermophysics}, + year = {2003}, + volume = {24}, + pages = {41-109}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Span-IJT-2003C, + author = {R. Span and W. Wagner}, + title = {{Equations of State for Technical Applications. III. Results for + Polar Fluids}}, + journal = {International Journal of Thermophysics}, + year = {2003}, + volume = {24}, + pages = {111-162}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Span-JPCRD-1996, + author = {R. Span and W. Wagner}, + title = {{A New Equation of State for Carbon Dioxide Covering the Fluid Region + from the Triple Point Temperature to 1100 K at Pressures up to 800 + MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1996}, + volume = {25}, + pages = {1509-1596}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Span-FPE-2001, + author = {R. Span and W. Wagner and E.W. Lemmon and R.T. Jacobsen}, + title = {{Multiparameter equations of state - recent trends and future challenges}}, + journal = {Fluid Phase Equilibria}, + year = {2001}, + volume = {183-184}, + pages = {1-20}, + owner = {Belli}, + timestamp = {2013.08.18} +} + +@ARTICLE{Stewart-JPCRD-1991, + author = {Richard B. Stewart and Richard T. Jacobsen and W. Wagner}, + title = {{Thermodynamic Properties of Oxygen from the Triple Point to 300 + K with Pressures to 80 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1991}, + volume = {20}, + pages = {917-1021}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Tanaka-IJT-1996, + author = {Y. Tanaka and T. Sotani}, + title = {{Thermal Conductivity and Viscosity of 2,2-Dichloro-1,1,1-Trifluoroethane + (HCFC-123)}}, + journal = {International Journal of Thermophysics}, + year = {1996}, + volume = {17}, + pages = {293-328}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.13} +} + +@ARTICLE{Tegeler-JPCRD-1999, + author = {Ch. Tegeler and R. Span and W. Wagner}, + title = {{A New Equation of State for Argon Covering the Fluid Region for + Temperatures From the Melting Line to 700 K at Pressures up to 1000 + MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1999}, + volume = {28}, + pages = {779-850}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Thol-HTHP-2012, + author = {M. Thol and E.W. Lemmon and R. Span}, + title = {{Equation of state for benzene for temperatures from the melting + line up to 725 K with pressures up to 500 MPa}}, + journal = {High Temperatures-High Pressures}, + year = {2012}, + volume = {41}, + pages = {81-97}, + owner = {Belli}, + timestamp = {2013.04.10} +} + +@UNPUBLISHED{Thol-2012, + author = {Monika Thol and Eric W. Lemmon and Roland Span}, + title = {{Equation of State for a Refrigerant Mixture of R365mfc (1,1,1,3,3-Pentafluorobutane) + and Galden HT 55 (Perfluoropolyether)}}, + note = {Unpublished}, + year = {2012}, + owner = {Belli}, + timestamp = {2013.08.05} +} + +@ARTICLE{Thorade-EES-2013, + author = {Thorade, Matthis and Saadat, Ali}, + title = {{Partial derivatives of thermodynamic state properties for dynamic + simulation}}, + journal = {Environmental Earth Sciences}, + year = {2013}, + month = apr, + doi = {10.1007/s12665-013-2394-z}, + issn = {1866-6280}, + keywords = {defined by specifying any,energy \'{a} partial derivatives,in fluid + cycle,nation of two independent,other combi-,state can also be,state + properties,thermodynamic properties \'{a} helmholtz,\'{a} dynamic + simulation}, + owner = {jowr}, + timestamp = {2013.05.01}, + url = {http://link.springer.com/10.1007/s12665-013-2394-z} +} + +@ARTICLE{TillnerRoth-IJT-1995, + author = {R. Tillner-Roth}, + title = {{A Fundamental Equation of State for 1,1-Difluoroethane (HFC-152a)}}, + journal = {Int. J. Thermophys.}, + year = {1995}, + volume = {16}, + pages = {91-100}, + number = {1}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{TillnerRoth-JPCRD-1994, + author = {Reiner Tillner-Roth and Hans Dieter Baehr}, + title = {{A International Standard Formulation for the Thermodynamic Properties + of 1,1,1,2-Tetrafluoroethane (HFC-134a) for Temperatures from 170 + K to 455 K and Pressures up to 70 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1994}, + volume = {23}, + pages = {657-729}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@CONFERENCE{TillnerRoth-DKV-1993, + author = {R. Tillner-Roth and F. Harms-Watzenberg and H.D. Baehr}, + title = {{Eine neue Fundamentalgleichung fur Ammoniak (A new Fundamental Equation + of State for Ammonia)}}, + booktitle = {Deutscher Kaelte- und Klimatechnischer Verein Tagung 1993}, + year = {1993}, + journal = {Deutscher Kaelte- und Klimatechnischer Verein Tagung 1993}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{TillnerRoth-JPCRD-1997, + author = {R. Tillner-Roth and A. Yokozeki}, + title = {{An international standard equation of state for difluoromethane + (R-32) for temperatures from the triple point at 136.34 K to 435 + K and pressures up to 70 MPa}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1997}, + volume = {26}, + pages = {1273-1328}, + number = {6}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Tufeu-BBPC-1984, + author = {R. Tufeu and D.Y. Ivanov and Y. Garrabos and B. Le Neindre}, + title = {{Thermal Conductivity of Ammonia in a Large Temperature and Pressure + Range Including the Critical Region}}, + journal = {Bereicht der Bunsengesellschaft Phys. Chem.}, + year = {1984}, + volume = {88}, + pages = {422-427}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Vesovic-JPCRD-1990, + author = {V. Vesovic and W.A. Wakeham and G.A. Olchowy and J.V. Sengers and + J.T.R. Watson and J. Millat}, + title = {{The Transport Properties of Carbon Dioxide}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1990}, + volume = {19}, + pages = {763--808}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Vogel-JPCRD-1998, + author = {E. Vogel and C. K{\"u}chenmeister and E. Bich and A. Laesecke}, + title = {{Reference Correlation of the Viscosity of Propane}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {1998}, + volume = {27}, + pages = {947-970}, + note = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Vogel-IJT-2000, + author = {E. Vogel and C. Kuechenmeister and E. Bich}, + title = {{Viscosity Correlation for Isobutane over Wide Ranges of the Fluid + Region}}, + journal = {Int. J. Thermophys}, + year = {2000}, + volume = {21}, + pages = {343-356}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Vogel-HTHP-1999, + author = {E. Vogel and C. Kuechenmeister and E. Bich}, + title = {{Viscosity for n-Butane in the Fluid Region}}, + journal = {High Temp. - High Pressures}, + year = {1999}, + volume = {31}, + pages = {173-186}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@CONFERENCE{deVries-ICR-1995, + author = {B. de Vries and R. Tillner-Roth and H.D. Baehr}, + title = {{Thermodynamic Properties of HCFC 124}}, + booktitle = {19th International Congress of Refrigeration, The Hague, The Netherlands}, + year = {1995}, + pages = {582-589}, + owner = {Belli}, + timestamp = {2013.05.01} +} + +@ARTICLE{Wagner-JPCRD-2002, + author = {W. Wagner and A. Pruss}, + title = {{The IAPWS Formulation 1995 for the Thermodynamic Properties of Ordinary + Water Substance for General and Scientific Use}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2002}, + volume = {31}, + pages = {387-535}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Wu-IJT-2012, + author = {Jiangtao Wu and Yong Zhou}, + title = {{An Equation of State for Fluoroethane (R161)}}, + journal = {Int J Thermophys}, + year = {2012}, + volume = {33}, + pages = {220-234}, + doi = {10.1007/s10765-011-1151-3}, + owner = {Belli}, + timestamp = {2014.01.22} +} + +@ARTICLE{Wu-JPCRD-2011, + author = {Jiangtao Wu and Yong Zhou and Eric W. Lemmon}, + title = {{An Equation of State for the Thermodynamic Properties of Dimethyl + Ether}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2011}, + volume = {40}, + pages = {023104-1:16}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@ARTICLE{Younglove-JPCRD-1994, + author = {Ben A. Younglove}, + title = {{An International Standard Equation of State for the Thermodynamic + Properties of Refrigerant 123 (2,2-Dichloro-1,1,1-Trifluoroethane)}}, + journal = {J. Phys. Chem Ref. Data}, + year = {1994}, + volume = {23}, + pages = {731-779}, + number = {5}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@TECHREPORT{Zavoico2001, + author = {Alexis B. Zavoico}, + title = {{Solar Power Tower Design Basis Document}}, + institution = {Sandia Labs}, + year = {2001}, + owner = {jowr}, + timestamp = {2013.10.23}, + url = {http://prod.sandia.gov/techlib/access-control.cgi/2001/012100.pdf} +} + +@ARTICLE{Zhou-JPCRD-2012, + author = {Yong Zhou and Jiangtao Wu and Eric W. Lemmon}, + title = {{Thermodynamic Properties of o-Xylene, m-Xylene, p-Xylene, and Ethylbenzene}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2012}, + volume = {41}, + pages = {023103-1 -- 023103-26}, + number = {2}, + owner = {Belli}, + timestamp = {2013.04.08} +} + +@ARTICLE{Zhou-JPCRD-2011, + author = {Yong Zhou and Jiangtao Wu and Eric W. Lemmon}, + title = {{Thermodynamic Properties of Dimethyl Carbonate}}, + journal = {J. Phys. Chem. Ref. Data}, + year = {2011}, + volume = {40}, + pages = {043106-1:11}, + number = {4}, + owner = {Belli}, + timestamp = {2013.04.09} +} + +@comment{jabref-meta: selector_review:} + +@comment{jabref-meta: selector_publisher:} + +@comment{jabref-meta: selector_author:} + +@comment{jabref-meta: selector_journal:} + +@comment{jabref-meta: selector_keywords:} + diff --git a/Developer instructions.txt b/Developer instructions.txt new file mode 100644 index 00000000..fb0a29c3 --- /dev/null +++ b/Developer instructions.txt @@ -0,0 +1,6 @@ + +A) Copy one of the existing files that has all the required terms to a new file in the appropriate folder +B) Update all the coefficients +C) Add "FluidsList.push_back(new FLUIDNAMEClass());" to FluidClass.cpp +D) Add '#include "YOURFLUIDFILENAME.h"' to FluidClass.cpp +E) Add #include "YOURFLUIDFILENAME.cpp to AllFluids.cpp diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 00000000..2dee9736 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1826 @@ +# Doxyfile 1.8.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = CoolProp + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 5.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "An open-source fluid property and humid air property database" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc-v5 + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 31 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src \ + include + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = *_wrap.cpp + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = YES + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 00000000..5d2746dd --- /dev/null +++ b/FAQ.md @@ -0,0 +1,36 @@ + +Frequently Asked Questions +========================== + +Usage +----- + +1. My enthalpy and entropy values are not the same as what are used in REFPROP, or EES, or ... + + Enthalpy and entropy are only equivalent to within an additive constant, so you should always compare enthalpy and entropy *differences* rather than enthalpy and entropy values + +Compilation +----------- + +1. I'm on linux and I get compilation errors like + + ``` + gcc: error trying to exec 'cc1plus': execvp: No such file or directory + error: Setup script exited with error: command 'gcc' failed with exit status 1 + ``` + + This means that the g++ package is missing. On OpenSUSE you can just install the following packages in software manager: + + ``` + gcc-c++ + gcc48-c++ + libstdc++48-devel + ``` + + On ubuntu, it should be sufficient to just run + + ``` + sudo apt-get install g++ + ``` + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8c44d4bd --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright (C) 2012 Ian H. Bell + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/MakeDistro.py b/MakeDistro.py new file mode 100644 index 00000000..3b5256b3 --- /dev/null +++ b/MakeDistro.py @@ -0,0 +1,343 @@ +from __future__ import print_function +import subprocess,os,shutil + +#These should be paths to python executables that you want want use to build versions of CoolProp +PYTHONVERSIONS=['python.exe', #This is python 2.7 on my computer + 'c:\\python\\py27_x64\\python.exe', + 'c:\\python\\py32\\python.exe', + 'c:\\python\\py32_x64\\python.exe', + 'c:\\python\\py33\\python.exe', + 'c:\\python\\py33_x64\\python.exe', + ] + +if not os.path.exists('_deps'): + os.mkdir('_deps') + +def InstallPrereqs(): + """ Get the requirements for CoolProp """ + #Collect the source for Cython and put in _deps/cython-master + import urllib,zipfile + print('getting cython sources') + urllib.urlretrieve('https://github.com/cython/cython/archive/master.zip', filename = 'master.zip') + with zipfile.ZipFile('master.zip', 'r') as myzip: + myzip.extractall(path='_deps') + os.remove('master.zip') + for python_install in PYTHONVERSIONS: + for cwd in ['_deps/cython-master']: + print(subprocess.check_output([python_install, 'setup.py', 'install'], cwd = cwd)) + + +def PYPI(): + subprocess.call(['python','setup.py','sdist','upload'],cwd=os.path.join('wrappers','Python')) + +def Source(): + print(subprocess.check_output(['python','setup.py','sdist','--dist-dir=../../dist_temp/Python'],shell=True,cwd=os.path.join('wrappers','Python'))) + +def DLL_and_Excel(): + """ Build a DLL using __stdcall calling convention """ + subprocess.check_output(['BuildDLL'],shell=True,cwd=os.path.join('wrappers','Excel')) + subprocess.check_output(['BuildDLLx64'],shell=True,cwd=os.path.join('wrappers','Excel')) + #Collect the zip file and p + try: + os.makedirs(os.path.join('dist_temp','Excel and DLL')) + except os.error: + pass + + shutil.copy2(os.path.join('CoolProp','CoolProp.h'),os.path.join('dist_temp','Excel and DLL','CoolProp.h')) + shutil.copy2(os.path.join('wrappers','Excel','CoolProp.dll'),os.path.join('dist_temp','Excel and DLL','CoolProp.dll')) + shutil.copy2(os.path.join('wrappers','Excel','CoolProp_x64.dll'),os.path.join('dist_temp','Excel and DLL','CoolProp_x64.dll')) + shutil.copy2(os.path.join('wrappers','Excel','CoolProp.xlam'),os.path.join('dist_temp','Excel and DLL','CoolProp.xlam')) + shutil.copy2(os.path.join('wrappers','Excel','CoolProp.xla'),os.path.join('dist_temp','Excel and DLL','CoolProp.xla')) + shutil.copy2(os.path.join('wrappers','Excel','TestExcel.xlsx'),os.path.join('dist_temp','Excel and DLL','TestExcel.xlsx')) + shutil.copy2(os.path.join('wrappers','Excel','README.rst'),os.path.join('dist_temp','Excel and DLL','README.rst')) + +def Octave(): + try: + os.makedirs(os.path.join('dist_temp','Octave')) + os.makedirs(os.path.join('dist_temp','Octave','3.6.1')) + os.makedirs(os.path.join('dist_temp','Octave','3.6.2')) + os.makedirs(os.path.join('dist_temp','Octave','3.6.4')) + except os.error: pass + + subprocess.check_output(['OctaveBuilder.bat'],shell=True,cwd=os.path.join('wrappers','Octave')) + shutil.copy2(os.path.join('wrappers','Octave','3.6.1','CoolProp.oct'),os.path.join('dist_temp','Octave','3.6.1','CoolProp.oct')) + shutil.copy2(os.path.join('wrappers','Octave','3.6.2','CoolProp.oct'),os.path.join('dist_temp','Octave','3.6.2','CoolProp.oct')) + shutil.copy2(os.path.join('wrappers','Octave','3.6.4','CoolProp.oct'),os.path.join('dist_temp','Octave','3.6.4','CoolProp.oct')) + shutil.copy2(os.path.join('wrappers','Octave','example.m'),os.path.join('dist_temp','Octave','example.m')) + shutil.copy2(os.path.join('wrappers','Octave','README.rst'),os.path.join('dist_temp','Octave','README.rst')) + +def Csharp(): + try: + os.makedirs(os.path.join('dist_temp','C#')) + except os.error: pass + + subprocess.check_output(['BuildCsharpDLL.bat'],shell=True,cwd=os.path.join('wrappers','C#')) + shutil.copy2(os.path.join('wrappers','C#','readme.txt'),os.path.join('dist_temp','C#','readme.txt')) + shutil.copy2(os.path.join('wrappers','C#','Csharp.7z'),os.path.join('dist_temp','C#','Csharp.7z')) + +def MATLAB(): + print('MATLAB') + try: + os.makedirs(os.path.join('dist_temp','MATLAB')) + except os.error: pass + + process = subprocess.Popen(['C:\\MATLAB_32bit\\bin\\matlab','-wait','-nodesktop','-nosplash','-nojvm','-r','MATLABBuilder'],shell=True,cwd=os.path.join('wrappers','MATLAB')) + process.wait() + process = subprocess.Popen(['matlab','-nojvm','-nodesktop','-nosplash','-wait','-r','MATLABBuilder'],shell=True,cwd=os.path.join('wrappers','MATLAB')) + process.wait() + shutil.copy2(os.path.join('wrappers','MATLAB','Props.mexw64'),os.path.join('dist_temp','MATLAB','Props.mexw64')) + shutil.copy2(os.path.join('wrappers','MATLAB','HAProps.mexw64'),os.path.join('dist_temp','MATLAB','HAProps.mexw64')) + shutil.copy2(os.path.join('wrappers','MATLAB','Props.mexw32'),os.path.join('dist_temp','MATLAB','Props.mexw32')) + shutil.copy2(os.path.join('wrappers','MATLAB','HAProps.mexw32'),os.path.join('dist_temp','MATLAB','HAProps.mexw32')) + shutil.copy2(os.path.join('wrappers','MATLAB','PropsSI.mexw32'),os.path.join('dist_temp','MATLAB','PropsSI.mexw32')) + shutil.copy2(os.path.join('wrappers','MATLAB','PropsSI.mexw64'),os.path.join('dist_temp','MATLAB','PropsSI.mexw64')) + shutil.copy2(os.path.join('wrappers','MATLAB','README.rst'),os.path.join('dist_temp','MATLAB','README.rst')) + shutil.copy2(os.path.join('wrappers','MATLAB','MATLAB_sample.m'),os.path.join('dist_temp','MATLAB','example.m')) + +def Labview(): + print('Labview') + import CoolProp + version = CoolProp.__version__ + try: + os.makedirs(os.path.join('dist_temp','Labview')) + except os.error: pass + + process = subprocess.Popen(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','Labview')) + process.wait() + shutil.copy2(os.path.join('wrappers','Labview','CoolProp.dll'),os.path.join('dist_temp','Labview','CoolProp.dll')) + shutil.copy2(os.path.join('wrappers','Labview','CoolProp.llb'),os.path.join('dist_temp','Labview','CoolProp.llb')) + shutil.copy2(os.path.join('wrappers','Labview','CoolProp.vi'),os.path.join('dist_temp','Labview','CoolProp.vi')) + shutil.copy2(os.path.join('wrappers','Labview','README.rst'),os.path.join('dist_temp','Labview','README.rst')) + +def EES(): + print('EES') + import CoolProp + version = CoolProp.__version__ + try: + os.makedirs(os.path.join('dist_temp','EES')) + except os.error: pass + + subprocess.check_output(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','EES')) + subprocess.check_output(['BuildDLF.bat'],shell=True,cwd=os.path.join('wrappers','EES')) + subprocess.check_output(['BuildMSI.bat'],shell=True,cwd=os.path.join('wrappers','EES')) + subprocess.check_output('C:\EES32\ees.exe C:\EES32\Userlib\CoolProp_EES\CoolProp_EES_Sample.ees /Solve',shell=True) + + shutil.copy2(os.path.join('wrappers','EES','Debug','CoolProp_EES_installer.msi'),os.path.join('dist_temp','EES','CoolProp_EES_installer.msi')) + shutil.copy2(os.path.join('wrappers','EES','CoolProp.htm'),os.path.join('dist_temp','EES','CoolProp.htm')) + shutil.copy2(os.path.join('wrappers','EES','README.rst'),os.path.join('dist_temp','EES','README.rst')) + +def Javascript(): + print('Javascript') + import CoolProp + version = CoolProp.__version__ + try: + os.makedirs(os.path.join('dist_temp','Javascript')) + except os.error: pass + + subprocess.check_output('python build.py',shell=True,cwd=os.path.join('wrappers','Javascript')) + + shutil.copy2(os.path.join('wrappers','Javascript','index.html'),os.path.join('dist_temp','Javascript','index.html')) + shutil.copy2(os.path.join('wrappers','Javascript','coolprop.js'),os.path.join('dist_temp','Javascript','coolprop.js')) + shutil.copy2(os.path.join('wrappers','Javascript','README.rst'),os.path.join('dist_temp','Javascript','README.rst')) + +def Java(): + print('Java') + import CoolProp + version = CoolProp.__version__ + try: + os.makedirs(os.path.join('dist_temp','Java','win32')) + except os.error as E: print(E) + try: + os.makedirs(os.path.join('dist_temp','Java','x64')) + except os.error as E: print(E) + + subprocess.check_output('build_win32.bat',shell=True,cwd=os.path.join('wrappers','Java')) + subprocess.check_output('build_x64.bat',shell=True,cwd=os.path.join('wrappers','Java')) + + subprocess.check_call(['7z','a','-r','dist_temp/Java/sources.zip','wrappers/Java/*.java']) + shutil.copy2(os.path.join('wrappers','Java','win32','CoolProp.dll'),os.path.join('dist_temp','Java','win32','CoolProp.dll')) + shutil.copy2(os.path.join('wrappers','Java','x64','CoolProp.dll'),os.path.join('dist_temp','Java','x64','CoolProp.dll')) + shutil.copy2(os.path.join('wrappers','Java','README.rst'),os.path.join('dist_temp','Java','README.rst')) + +def Python(): + print('Python') + subprocess.check_output(['python','setup.py','install'],shell=True,cwd=os.path.join('wrappers','Python')) + for python_install in PYTHONVERSIONS: + subprocess.check_output([python_install,'setup.py','bdist','--format=wininst','--dist-dir=../../dist_temp/Python'],shell=True,cwd=os.path.join('wrappers','Python')) + +def Maple(): + print('Maple') + try: + os.makedirs(os.path.join('dist_temp','Maple')) + except os.error: pass + + process = subprocess.check_output(['BuildDLLx64.bat'],shell=True,cwd=os.path.join('wrappers','Maple')) + + listing = ['Analysis of a Refrigeration Cycle with CoolProp.mw','sample_file.mw','CoolProp_x64.dll'] + + for file in listing: + shutil.copy2(os.path.join('wrappers','Maple',file),os.path.join('dist_temp','Maple',file)) + +def Mathematica(): + print('Mathematica') + try: + os.makedirs(os.path.join('dist_temp','Mathematica')) + except os.error: pass + + process = subprocess.check_output(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','Mathematica')) + + listing = ['README.rst','example.nb','CoolProp.dll'] + + for file in listing: + shutil.copy2(os.path.join('wrappers','Mathematica',file),os.path.join('dist_temp','Mathematica',file)) + +def Scilab(): + print('Scilab') + try: + os.makedirs(os.path.join('dist_temp','Scilab')) + except os.error: pass + + process = subprocess.check_output(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','Scilab')) + + listing = ['README.rst','sample.sce','CoolProp_x64.dll','CoolProp.dll'] + + for file in listing: + shutil.copy2(os.path.join('wrappers','Scilab',file),os.path.join('dist_temp','Scilab',file)) + +def MathCAD(): + print('MathCAD') + try: + os.makedirs(os.path.join('dist_temp','MathCAD','Prime')) + except os.error: pass + + process = subprocess.check_output(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','MathCAD')) + process = subprocess.check_output(['BuildDLL.bat'],shell=True,cwd=os.path.join('wrappers','MathCAD','Prime')) + + shutil.copy2(os.path.join('wrappers','MathCAD','CoolPropMathcadWrapper.dll'),os.path.join('dist_temp','MathCAD','CoolPropMathcadWrapper.dll')) + shutil.copy2(os.path.join('wrappers','MathCAD','CoolPropFluidProperties.xmcd'),os.path.join('dist_temp','MathCAD','CoolPropFluidProperties.xmcd')) + shutil.copy2(os.path.join('wrappers','MathCAD','README.rst'),os.path.join('dist_temp','MathCAD','README.rst')) + + shutil.copy2(os.path.join('wrappers','MathCAD','Prime','CoolPropMathcadWrapper.dll'),os.path.join('dist_temp','MathCAD','Prime','CoolPropMathcadWrapper.dll')) + shutil.copy2(os.path.join('wrappers','MathCAD','Prime','CoolPropFluidProperties.mcdx'),os.path.join('dist_temp','MathCAD','Prime','CoolPropFluidProperties.xmcd')) + shutil.copy2(os.path.join('wrappers','MathCAD','Prime','README.rst'),os.path.join('dist_temp','MathCAD','Prime','README.rst')) + +def Modelica(): + print('Modelica') + try: + os.makedirs(os.path.join('dist_temp','Modelica')) + except os.error: pass + + process = subprocess.Popen(['BuildLIB-VS2008.bat'],shell=True,cwd=os.path.join('wrappers','Modelica')); process.wait() + process = subprocess.Popen(['BuildLIB-VS2010.bat'],shell=True,cwd=os.path.join('wrappers','Modelica')); process.wait() + + shutil.copy2(os.path.join('wrappers','Modelica','README.rst'),os.path.join('dist_temp','Modelica','README.rst')) + #shutil.copy2(os.path.join('wrappers','Modelica','src_modelica','CoolProp2Modelica.mo'),os.path.join('dist_temp','Modelica','CoolProp2Modelica.mo')) + shutil.copy2(os.path.join('wrappers','Modelica','src','CoolPropLib.h'),os.path.join('dist_temp','Modelica','CoolPropLib.h')) + shutil.copytree(os.path.join('wrappers','Modelica','bin','VS2008'),os.path.join('dist_temp','Modelica','VS2008')) + shutil.copytree(os.path.join('wrappers','Modelica','bin','VS2010'),os.path.join('dist_temp','Modelica','VS2010')) + +def UploadSourceForge(): + #Rename folder to version number + import CoolProp + try: + shutil.copytree('dist_temp',CoolProp.__version__) + except WindowsError: pass + + call_str = ['pscp','README.txt','ibell,coolprop@frs.sf.net:/home/pfs/project/c/co/coolprop/CoolProp/'] + print('Calling: '+' '.join(call_str)) + subprocess.check_output(call_str,shell=True) + + call_str = ['pscp','-r','-v',CoolProp.__version__,'ibell,coolprop@frs.sf.net:/home/pfs/project/c/co/coolprop/CoolProp/'] + print('Calling: '+' '.join(call_str)) + subprocess.check_output(call_str,shell=True) + + + +####### DOCUMENTATION STUFF ################ +def Doxygen(): + # Open Doxyfile, and update the version number in the file + lines = open('Doxyfile','r').readlines() + import CoolProp + for i in range(len(lines)): + if lines[i].startswith('PROJECT_NUMBER'): + line = lines[i].split('=')[0]+' = '+CoolProp.__version__+'\n' + lines[i]=line + break + open('Doxyfile','w').write(''.join(lines)) + + subprocess.check_output(['doxygen','Doxyfile'],shell=True) + +def RunExamples(): + subprocess.check_output(['run_examples.bat'],shell=True,cwd='Web/examples') + +def BuildDocs(): + + # Inject the revision number into the docs main pages for the link + lines = open('Web/_templates/index.html','r').readlines() + import CoolProp + languages = ['Python','Modelica','Labview','MATLAB','EES','Octave','Excel','C#','Java','Javascript','MathCAD','Maple','Mathematica','Scilab'] + for i in range(len(lines)): + if (lines[i].find('http://sourceforge.net/projects/coolprop/files/CoolProp/') > -1 + and any([lines[i].find(a) > -1 for a in languages]) + ): + oldVersion = lines[i].split('http://sourceforge.net/projects/coolprop/files/CoolProp/')[1].split('/',1)[0] + lines[i] = lines[i][:].replace(oldVersion,CoolProp.__version__) + open('Web/_templates/index.html','w').write(''.join(lines)) + + shutil.rmtree(os.path.join('Web','_build'),ignore_errors = True) + subprocess.check_output(['BuildCPDocs.bat'],shell=True,cwd='Web') + +def UploadDocs(): + call_str = ['pscp','-r','-v','Web/_build/html/*.*','ibell@web.sourceforge.net:/home/groups/coolprop/htdocs'] + print('Calling: '+' '.join(call_str)) + subprocess.check_output(call_str, shell = True) + +def Superpacks(): + + import CoolProp + subprocess.check_call(['git','archive','-o','dist_temp/CoolProp-'+CoolProp.__version__+'-source_code.zip','HEAD']) + + ## Windows superpack + try: + os.mkdir(os.path.join('dist_temp','windows_superpack')) + except WindowsError: + pass + shutil.copy2(os.path.join('dist_temp/CoolProp-'+CoolProp.__version__+'-source_code.zip'),os.path.join('dist_temp','windows_superpack','CoolProp-'+CoolProp.__version__+'-source_code.zip')) + + for folder in ['Excel and DLL','Python','C#','Octave','MATLAB','EES','Labview','Modelica','Maple','Scilab','Mathematica','Java','Javascript','MathCAD']: + shutil.copytree(os.path.join('dist_temp',folder), os.path.join('dist_temp','windows_superpack',folder)) + + subprocess.check_call(['7z','a','-r','dist_temp/CoolProp-'+CoolProp.__version__+'-windows_superpack.zip','dist_temp/windows_superpack/*.*']) + shutil.rmtree(os.path.join('dist_temp','windows_superpack')) + +if __name__=='__main__': + +# InstallPrereqs() #This is optional if you think any of the pre-reqs have been updated + + ## Always run the examples first. This serves as an integration test of + ## CoolProp + RunExamples() + +# Python() # This one must be first to ensure that version gets rebuild properly +# DLL_and_Excel() +# Source() +# Csharp() +# Octave() +# MATLAB() +# Maple() +# Mathematica() +# Scilab() +# EES() +# Javascript() +# Java() +# MathCAD() +# Labview() +# Modelica() +# Superpacks() + +# PYPI() +# UploadSourceForge() + +# Doxygen() +# BuildDocs() +# UploadDocs() \ No newline at end of file diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 00000000..47b02ff4 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,8 @@ +CoolProp is a thermophysical property database and wrappers for a selection of programming environments + +It offers similar functionality to REFPROP, but CoolProp is open-source and free, with flexible licensing terms + +It was originally developed by Ian Bell, currently a post-doc at the University of Liege, in Liege, Belgium. + +To see whats new, go to http://coolprop.sourceforge.net/changelog.html + diff --git a/TTD.txt b/TTD.txt new file mode 100644 index 00000000..59e8a40a --- /dev/null +++ b/TTD.txt @@ -0,0 +1,152 @@ +import glob + +REFPROPfluids = glob.glob('*.ppf') + glob.glob('*.fld') + +for f in REFPROPfluids: + print f.split('.')[0].rstrip()+',', + +""" +:: DONE :: +AIR +R404A +R407C +R410A +R507A +ACETONE +AMMONIA +ARGON +CO +CO2 +COS +DECANE +H2S +HELIUM +HYDROGEN +ORTHOHYD +PARAHYD +IHEXANE +IPENTANE +KRYPTON +N2O +NEOPENTN +NITROGEN +NONANE +OXYGEN +PROPANE +R116 +R1234YF +R134A +R141B +R142B +R218 +R22 +R245FA +R32 +R41 +SO2 +TOLUENE +WATER +XENON +METHANE +ETHANE +BUTANE +ISOBUTAN +D4 +D5 +D6 +MD2M +MD3M +MD4M +MDM +MM +ETHYLENE +SF6 +ETHANOL + +:: 2.4 :: +PENTANE +HEXANE +OCTANE +HEPTANE +CYCLOHEX +R1234ZE +1BUTENE +T2BUTENE +C2BUTENE +IBUTENE +MLINOLEA +MLINOLEN +MOLEATE +MPALMITA +MSTEARAT +DME +R143A + +:: 2.5 :: +DMC +R23 +C12 +OXYLENE +MXYLENE +PXYLENE +EBENZENE + +:: 3.1 :: +PROPYLEN +CYCLOPEN +R236FA +R236EA +R227EA +R123 +R152A +R227EA +R365MFC +R161 +HFE143M +BENZENE +R11 +C11 +R125 +CYCLOPRO +NEON +R124 + +:: 3.1.1 :: +PROPYNE + +:: 3.2 :: +FLUORINE +METHANOL +R114 +R13 +R14 +R21 +RC318 +R12 +R113 + +:::::::::::: QUEUE ::::::::::::: +ECS params for new fluids +Methanol + visc: Xiang +Ethylene + visc & cond: Holland 1983 +Methane + visc & cond: Friend 1989 (check these results) +NF3: + MBWR + +---------------------------------------------------------- CANT BE DONE YET +D2 + Deuterium preprint en route at some point +D2O + New EOS in a few months + +Unpublished: +C1CC6 +C3CC6 +No Helmholtz: +C4F10 (ECS) +C5F12 (ECS) +R245CA (ECS) +""" \ No newline at end of file diff --git a/Web/BridgmanDerivatives.rst b/Web/BridgmanDerivatives.rst new file mode 100644 index 00000000..f3e69edb --- /dev/null +++ b/Web/BridgmanDerivatives.rst @@ -0,0 +1,131 @@ + +.. |dvdT_p| replace:: :math:`\left(\frac{\partial V}{\partial T}\right)_P` +.. |dT| replace:: :math:`\partial T` +.. |dv| replace:: :math:`\partial V` +.. |ds| replace:: :math:`\partial S` +.. |dvdT_p| replace:: :math:`\left(\frac{\partial V}{\partial T}\right)_P` +.. |dvdT_p| replace:: :math:`\left(\frac{\partial V}{\partial T}\right)_P` + +.. |dvdT_p| replace:: :math:`\left(\frac{\partial V}{\partial T}\right)_P` + +================== ============= ==================================================================================== + p +------------------ ------------- ------------------------------------------------------------------------------------ +|dT| 1 +|dV| |dVdT_p| +|ds| :math:`c_p/T` +================== ============= ==================================================================================== + +Building a table with the held-constant variable on the right side and + +.. math:: + + (\partial T)_P=-(\partial P)_T=1 + +.. math:: + + (\partial V)_P=-(\partial P)_V=\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial S)_P=-(\partial P)_S=\frac{C_p}{T} + +.. math:: + + (\partial U)_P=-(\partial P)_U=C_P-P\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial H)_P=-(\partial P)_H=C_P + +.. math:: + + (\partial G)_P=-(\partial P)_G=-S + +.. math:: + + (\partial A)_P=-(\partial P)_A=-S-P\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial V)_T=-(\partial T)_V=-\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial S)_T=-(\partial T)_S=\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial U)_T=-(\partial T)_U=T\left(\frac{\partial V}{\partial T}\right)_P+P\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial H)_T=-(\partial T)_H=-V+T\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial G)_T=-(\partial T)_G=-V + +.. math:: + + (\partial A)_T=-(\partial T)_A=P\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial S)_V=-(\partial V)_S=\frac{C_P}{T}\left(\frac{\partial V}{\partial P}\right)_T+\left(\frac{\partial V}{\partial T}\right)_P^2 + +.. math:: + + (\partial U)_V=-(\partial V)_U=C_P\left(\frac{\partial V}{\partial P}\right)_T+T\left(\frac{\partial V}{\partial T}\right)_P^2 + +.. math:: + + (\partial H)_V=-(\partial V)_H=C_P\left(\frac{\partial V}{\partial P}\right)_T+T\left(\frac{\partial V}{\partial T}\right)_P^2-V\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial G)_V=-(\partial V)_G=-V\left(\frac{\partial V}{\partial T}\right)_P-S\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial A)_V=-(\partial V)_A=-S\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial U)_S=-(\partial S)_U=\frac{PC_P}{T}\left(\frac{\partial V}{\partial P}\right)_T+P\left(\frac{\partial V}{\partial T}\right)_P^2 + +.. math:: + + (\partial H)_S=-(\partial S)_H=-\frac{VC_P}{T} + +.. math:: + + (\partial G)_S=-(\partial S)_G=-\frac{VC_P}{T}+S\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial A)_S=-(\partial S)_A=\frac{PC_P}{T}\left(\frac{\partial V}{\partial P}\right)_T+P\left(\frac{\partial V}{\partial T}\right)_P^2+S\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial H)_U=-(\partial U)_H=-VC_P+PV\left(\frac{\partial V}{\partial T}\right)_P-PC_P\left(\frac{\partial V}{\partial P}\right)_T-PT\left(\frac{\partial V}{\partial T}\right)_P^2 + +.. math:: + + (\partial G)_U=-(\partial U)_G=-VC_P+PV\left(\frac{\partial V}{\partial T}\right)_P+ST\left(\frac{\partial V}{\partial T}\right)_P+SP\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial A)_U=-(\partial U)_A=P(C_P+S)\left(\frac{\partial V}{\partial P}\right)_T+PT\left(\frac{\partial V}{\partial T}\right)_P^2+ST\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial G)_H=-(\partial H)_G=-V(C_P+S)+TS\left(\frac{\partial V}{\partial T}\right)_P + +.. math:: + + (\partial A)_H=-(\partial H)_A=-\left[S+P\left(\frac{\partial V}{\partial T}\right)_P\right]\left[V-T\left(\frac{\partial V}{\partial T}\right)_P\right]+PC_P\left(\frac{\partial V}{\partial P}\right)_T + +.. math:: + + (\partial A)_G=-(\partial G)_A=-S\left[V+P\left(\frac{\partial V}{\partial P}\right)_T\right]-PV\left(\frac{\partial V}{\partial T}\right)_P \ No newline at end of file diff --git a/Web/BuildCPDocs.bat b/Web/BuildCPDocs.bat new file mode 100644 index 00000000..6484e963 --- /dev/null +++ b/Web/BuildCPDocs.bat @@ -0,0 +1,13 @@ +@echo off +REM ~ make latex +REM ~ cd _build/latex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ copy /Y CoolPropdoc.pdf ..\..\_static\ +REM ~ cd ..\.. + +rem sphinx-apidoc -f -o apidoc ../CoolProp +make html diff --git a/Web/BuildCPDocsLogging.bat b/Web/BuildCPDocsLogging.bat new file mode 100644 index 00000000..5257a46c --- /dev/null +++ b/Web/BuildCPDocsLogging.bat @@ -0,0 +1,13 @@ +@echo off +REM ~ make latex +REM ~ cd _build/latex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ pdflatex CoolPropdoc.tex +REM ~ copy /Y CoolPropdoc.pdf ..\..\_static\ +REM ~ cd ..\.. + +rem sphinx-apidoc -f -o apidoc ../CoolProp +make html 2>&1 | wtee log.txt diff --git a/Web/Docs/Melinder coefficients.csv b/Web/Docs/Melinder coefficients.csv new file mode 100644 index 00000000..ef7267d6 --- /dev/null +++ b/Web/Docs/Melinder coefficients.csv @@ -0,0 +1,129 @@ +#Fluid#,,,,, +DEB :: Diethylbenzene mixture,,,,, +Dowtherm J Dow Chemical Co.,,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-81,100,801,2093,0.112,0.4 +,80,817.4,2023,0.116,0.47 +,60,833,1956,0.12,0.56 +,40,849,1892,0.125,0.7 +,20,864,1830,0.129,0.91 +,0,878.5,1769,0.133,1.23 +,-20,892.5,1714,0.137,1.8 +,-40,907,1663,0.141,2.88 +,-60,921,1616,0.145,5.12 +,-80,931.3,1584,0.149,8.43 +,,,,, +#Fluid#,,,,, +HCM :: Hydrocarbon mixture (synthetic),,,,, +Therminol D12 (Gilotherm D12) Solutia,,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-81,100,702,2450,0.096,0.45 +,80,717,2360,0.1,0.56 +,60,733,2280,0.104,0.7 +,40,748,2200,0.107,0.93 +,20,762,2110,0.11,1.3 +,0,776,2030,0.113,1.93 +,-20,790,1940,0.116,3.23 +,-40,804,1850,0.118,7.06 +,-60,818,1760,0.121,23.9 +,-80,832,1670,0.124,155 +,,,,, +#Fluid#,,,,, +HFE :: Hydrofluoroether,,,,, +HFE-7100 3M Novec,,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-60,100,1479,1193,0.068,0.52 +,80,1500,1173,0.07,0.65 +,60,1522,1153,0.072,0.79 +,40,1536,1140,0.073,0.87 +,20,1550,1126,0.075,0.97 +,0,1564,1113,0.076,1.06 +,-20,1586,1093,0.078,1.21 +,-40,1607,1073,0.08,1.42 +,-60,1629,1053,0.082,1.74 +,-80,1650,1033,0.083,2.24 +,,,,, +#Fluid#,,,,, +PMS1 :: Polydimethylsiloxan 1.,,,,, +"Baysilone KT3, Bayer AG",,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-100,100,836,1777,0.101,0.95 +,80,853,1749,0.107,1.19 +,60,872,1719,0.113,1.55 +,40,890,1688,0.119,2.14 +,20,908,1656,0.125,3 +,0,925,1630,0.13,4.35 +,-20,943,1600,0.135,6.79 +,-40,963,1570,0.141,11.6 +,-60,980,1540,0.147,24.5 +,,,,, +#Fluid#,,,,, +PMS2 :: Polydimethylsiloxan 2.,,,,, +Syltherm XLT Dow Corning Co.,,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-93,100,773,1940,0.093,0.51 +,80,794,1900,0.097,0.63 +,60,814,1856,0.102,0.8 +,40,835,1810,0.107,1 +,20,855,1770,0.111,1.4 +,0,876,1730,0.115,2 +,-20,896,1688,0.119,3.1 +,-40,917,1650,0.123,5.2 +,-60,937,1600,0.127,9.4 +,-80,958,1560,0.131,20 +,,,,, +#Fluid#,,,,, +SAB :: Synthetic alkyl benzene,,,,, +"Marlotherm X, Sasol",,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-60,100,803,1970,0.111,0.39 +,80,819,1900,0.116,0.46 +,60,835,1850,0.121,0.58 +,40,851,1810,0.126,0.72 +,20,868,1780,0.132,0.95 +,0,885,1760,0.137,1.24 +,-20,899,1740,0.142,1.89 +,-40,915,1730,0.147,3.2 +,-60,931,1710,0.153,6.61 +,,,,, +#Fluid#,,,,, +HCB :: Hydrocarbon blend,,,,, +"Dynalene MV, Solutia",,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-60,60,815,1937,0.124,0.775 +,40,830,1867,0.128,0.895 +,20,845,1796,0.133,1.069 +,0,861,1726,0.138,1.336 +,-20,876,1655,0.143,1.784 +,-40,892,1584,0.148,2.634 +,-60,907,1514,0.152,4.581 +,-80,923,1443,0.157,10.71 +,,,,, +#Fluid#,,,,, +TCO :: Terpene from citrus oils,,,,, +"d-Limonene, extract from orange/lemon peel oils",,,,, +,,,,, +Tf,t,rho,cp,k,mu +C,C,kg/m3,J/kg/K,W/m/K,mPa-s +-96.7,100,779.5,2170,0.105,0.66 +,75,800,2040,0.11,0.86 +,50,820.1,1910,0.114,1.1 +,25,839.8,1780,0.119,1.4 +,0,859.2,1650,0.124,1.8 +,-25,878.3,1510,0.128,2.3 +,-50,897.1,1390,0.133,3 +,-73,914.3,1270,0.137,3.8 diff --git a/Web/Docs/Melinder coefficients.xlsx b/Web/Docs/Melinder coefficients.xlsx new file mode 100644 index 00000000..56641eed Binary files /dev/null and b/Web/Docs/Melinder coefficients.xlsx differ diff --git a/Web/Docs/SWIG/Python.html b/Web/Docs/SWIG/Python.html new file mode 100644 index 00000000..ab80d93d --- /dev/null +++ b/Web/Docs/SWIG/Python.html @@ -0,0 +1,5373 @@ + + + + + +SWIG and Python + + +

31 SWIG and Python

+ +
+ +
+ + + + +

+Caution: This chapter is under repair! +

+ +

+This chapter describes SWIG's support of Python. SWIG is compatible +with most recent Python versions including Python 3.0 and Python 2.6, +as well as older versions dating back to Python 2.0. For the best +results, +consider using Python 2.3 or newer. +

+ +

+This chapter covers most SWIG features, but certain low-level details +are covered in less depth than in earlier chapters. At the +very least, make sure you read the "SWIG +Basics" chapter. +

+ +

31.1 Overview

+ + +

+To build Python extension modules, SWIG uses a layered approach in which +parts of the extension module are defined in C and other parts are +defined in Python. The C layer contains low-level wrappers whereas +Python code +is used to define high-level features. +

+ +

+This layered approach recognizes the fact that certain aspects of +extension building are better accomplished in each language (instead +of trying to do everything in C or C++). Furthermore, by generating code + in both +languages, you get a lot more flexibility since you can enhance the +extension +module with support code in either language. +

+ +

+In describing the Python interface, this chapter starts by covering the +basics of configuration, compiling, and installing Python modules. +Next, the Python interface to common C and C++ programming features is +described. Advanced customization features such as typemaps are then +described followed by a discussion of low-level implementation +details. +

+ +

31.2 Preliminaries

+ + +

31.2.1 Running SWIG

+ + +

+Suppose that you defined a SWIG module such as the following: +

+ +
+
/* File: example.i */
+%module example
+
+%{
+#define SWIG_FILE_WITH_INIT
+#include "example.h"
+%}
+
+int fact(int n);
+
+
+ +

+The #define SWIG_FILE_WITH_INIT line inserts a macro that +specifies that the +resulting C file should be built as a python extension, inserting the +module +init code. This .i file wraps the following simple C +file: +

+ +
+
/* File: example.c */
+
+#include "example.h"
+
+int fact(int n) {
+    if (n < 0){ /* This should probably return an error, but this is simpler */
+        return 0;
+    }
+    if (n == 0) {
+        return 1;
+    }
+    else {
+        /* testing for overflow would be a good idea here */
+        return n * fact(n-1);
+    }
+}
+
+
+
+ +

+With the header file: +

+ +
+
/* File: example.h */
+
+int fact(int n);
+
+
+ +

+To build a Python module, run SWIG using the -python option: +

+ +
$ swig -python example.i
+
+ +

+If building a C++ extension, add the -c++ option: +

+ +
$ swig -c++ -python example.i
+
+ +

+This creates two different files; a C/C++ source file example_wrap.c + or +example_wrap.cxx and a Python source file example.py. + The generated C +source file contains the low-level wrappers that need to be compiled and + linked with the +rest of your C/C++ application to create an extension module. The Python + source file +contains high-level support code. This is the file that you will import +to use the module. +

+ +

+The name of the wrapper file is derived from the name of the input file. + For example, if the +input file is example.i, the name of the wrapper file is example_wrap.c. +To change this, you can use the -o option. The name of the +Python file is derived +from the module name specified with %module. If the module +name is example, +then a file example.py is created. +

+ +

+The following sections have further practical examples and details on +how you might go about compiling and using the generated files. +

+ +

31.2.2 Using distutils

+ + +

+The preferred approach to building an extension module for python is to +compile it with +distutils, which comes with all recent versions of python +(Distutils Docs). +

+ +

+Distutils takes care of making sure that your extension is built with +all the correct +flags, headers, etc. for the version of Python it is run with. Distutils + will compile your +extension into a shared object file or DLL (.so on Linux, .pyd + on +Windows, etc). In addition, distutils can handle installing your package + into +site-packages, if that is desired. A configuration file (conventionally +called: setup.py) +describes the extension (and related python modules). The distutils will +then generate all the right compiler directives to build it for you. +

+ +

+Here is a sample setup.py file for the above example: +

+ +
+
#!/usr/bin/env python
+
+"""
+setup.py file for SWIG example
+"""
+
+from distutils.core import setup, Extension
+
+
+example_module = Extension('_example',
+                           sources=['example_wrap.c', 'example.c'],
+                           )
+
+setup (name = 'example',
+       version = '0.1',
+       author      = "SWIG Docs",
+       description = """Simple swig example from docs""",
+       ext_modules = [example_module],
+       py_modules = ["example"],
+       )
+
+
+ +

+In this example, the line: example_module = Extension(....) +creates an Extension +module object, defining the name as _example, and using the +source code files: +example_wrap.c, generated by swig, and example.c, your + original c +source. The swig (and other python extension modules) tradition is for +the compiled +extension to have the name of the python portion, prefixed by an +underscore. If the name +of your python module is "example.py", then the name of the +corresponding object file +will be"_example.so" +

+ +

+The setup call then sets up distutils to build your package, +defining +some meta data, and passing in your extension module object. +Once this is saved as setup.py, you can build your extension +with these commands: +

+ +
$ swig -python example.i
+$ python setup.py build_ext --inplace
+
+ +

+And a .so, or .pyd or... will be created for you. It will build a +version that matches the +python that you run the command with. Taking apart the command line: +

+ +
    +
  • python -- the version of python you want to build for +
  • setup.py -- the name of your setup script (it can be +called anything, but + setup.py is the tradition) +
  • build_ext -- telling distutils to build extensions +
  • --inplace -- this tells distutils to put the +extension lib in the current dir. + Otherwise, it will put it inside a build hierarchy, and you'd have +to move it to use it. +
+ +

+The distutils have many other features, consult the python distutils +docs for details. +

+ +

+This same approach works on all platforms if the appropriate compiler is + installed. (it +can even build extensions to the standard Windows Python using MingGW) +

+ +

31.2.3 Hand compiling a dynamic module

+ + +

+While the preferred approach to building an extension module is to use +the distutils, some +people like to integrate building extensions with a larger build system, + and thus may wish +to compile their modules without the distutils. To do this, you need to +compile your +program using commands like this (shown for Linux): +

+ +
$ swig -python example.i
+$ gcc -O2 -fPIC -c example.c
+$ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
+$ gcc -shared example.o example_wrap.o -o _example.so
+
+ +

+The exact commands for doing this vary from platform to platform. +However, SWIG tries to guess the right options when it is installed. +Therefore, +you may want to start with one of the examples in the SWIG/Examples/python + +directory. If that doesn't work, you will need to read the man-pages +for +your compiler and linker to get the right set of options. You might +also +check the SWIG Wiki +for +additional information. +

+ +

+When linking the module, the name of the output file has to match the + name +of the module prefixed by an underscore. If the name of your module + is "example", then the +name of the corresponding object file should be +"_example.so" or "_examplemodule.so". +The name of the module is specified using the %module directive + or the + -module command line option. +

+ +

+Compatibility Note: In SWIG-1.3.13 and earlier releases, module +names did not include the leading underscore. This is because modules +were normally created as C-only extensions without the extra Python +support file (instead, creating Python code was supported as an optional +feature). This has been changed in SWIG-1.3.14 and is consistent with +other Python extension modules. For example, the socket +module actually consists of two files; socket.py and +_socket.so. Many other built-in Python modules follow a +similar convention. +

+ + +

31.2.4 Static linking

+ + +

+An alternative approach to dynamic linking is to rebuild the Python +interpreter with your extension module added to it. In the past, +this approach was sometimes necessary due to limitations in dynamic +loading +support on certain machines. However, the situation has improved +greatly +over the last few years and you should not consider this approach +unless there is really no other option. +

+ +

+The usual procedure for adding a new module to Python involves finding +the Python source, adding an entry to the Modules/Setup file, +and rebuilding the interpreter using the Python Makefile. However, +newer Python versions have changed the build process. You may need to +edit +the 'setup.py' file in the Python distribution instead. +

+ +

+In earlier versions of SWIG, the embed.i library file could be +used to +rebuild the interpreter. For example: +

+ +
%module example
+
+%inline %{
+extern int fact(int);
+extern int mod(int, int);
+extern double My_variable;
+%}
+
+%include "embed.i"       // Include code for a static version of Python
+
+
+ +

+The embed.i library file includes supporting code that +contains everything needed to rebuild Python. To rebuild the +interpreter, +you simply do something like this: +

+ +
$ swig -python example.i
+$ gcc example.c example_wrap.c \
+        -Xlinker -export-dynamic \
+        -DHAVE_CONFIG_H -I/usr/local/include/python2.1 \
+	-I/usr/local/lib/python2.1/config \
+	-L/usr/local/lib/python2.1/config -lpython2.1 -lm -ldl \
+	-o mypython
+
+
+

+You will need to supply the same libraries that were used to build +Python the first +time. This may include system libraries such as -lsocket, -lnsl, +and -lpthread. Assuming this actually works, the new version +of Python +should be identical to the default version except that your extension +module will be +a built-in part of the interpreter. +

+ +

+Comment: In practice, you should probably try to avoid static +linking if possible. Some programmers may be inclined +to use static linking in the interest of getting better performance. +However, the performance gained by static linking tends to be rather +minimal in most situations (and quite frankly not worth the extra +hassle in the opinion of this author). +

+ +

+Compatibility note: The embed.i library file is +deprecated and has not been maintained for several years. Even though +it +appears to "work" with Python 2.1, no future support is guaranteed. +If using static linking, you might want to rely on a different approach +(perhaps using distutils). +

+ +

31.2.5 Using your module

+ + +

+To use your module, simply use the Python import statement. If +all goes well, you will be able to this: +

+ +
$ python
+>>> import example
+>>> example.fact(4)
+24
+>>>
+
+ +

+A common error received by first-time users is the following: +

+ +
+
>>> import example
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+  File "example.py", line 2, in ?
+    import _example
+ImportError: No module named _example
+
+
+ +

+If you get this message, it means that you either forgot to compile the +wrapper +code into an extension module or you didn't give the extension module +the right +name. Make sure that you compiled the wrappers into a module called _example.so. + And +don't forget the leading underscore (_). +

+ +

+Another possible error is the following: +

+ +
+
>>> import example
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+ImportError: dynamic module does not define init function (init_example)
+>>>                                                               
+
+
+ +

+This error is almost always caused when a bad name is given to the +shared object file. +For example, if you created a file example.so instead of _example.so + you would +get this error. Alternatively, this error could arise if the name of +the module is +inconsistent with the module name supplied with the %module +directive. +Double-check the interface to make sure the module name and the shared +object +filename match. Another possible cause of this error is forgetting to +link the SWIG-generated +wrapper code with the rest of your application when creating the +extension module. +

+ +

+Another common error is something similar to the following: +

+ +
+
Traceback (most recent call last):
+  File "example.py", line 3, in ?
+    import example
+ImportError: ./_example.so: undefined symbol: fact
+
+
+ +

+This error usually indicates that you forgot to include some object +files or libraries in the linking of the shared library file. Make +sure you compile both the SWIG wrapper file and your original program +into a shared library file. Make sure you pass all of the required +libraries +to the linker. +

+ +

+Sometimes unresolved symbols occur because a wrapper has been created +for a function that doesn't actually exist in a library. This usually +occurs when a header file includes a declaration for a function that +was never actually implemented or it was removed from a library +without updating the header file. To fix this, you can either edit +the SWIG input file to remove the offending declaration or you can use +the %ignore directive to ignore the declaration. +

+ +

+Finally, suppose that your extension module is linked with another +library like this: +

+ +
+
$ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
+      -o _example.so
+
+
+ +

+If the foo library is compiled as a shared library, you might +encounter the following +problem when you try to use your module: +

+ +
+
>>> import example
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+ImportError: libfoo.so: cannot open shared object file: No such file or directory
+>>>                 
+
+
+ +

+This error is generated because the dynamic linker can't locate the +libfoo.so library. When shared libraries are loaded, the +system normally only checks a few standard locations such as +/usr/lib and /usr/local/lib. To fix this problem, +there are several things you can do. First, you can recompile your +extension +module with extra path information. For example, on Linux you can do +this: +

+ +
+
$ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
+      -Xlinker -rpath /home/beazley/projects/lib  \
+      -o _example.so
+
+
+ +

+Alternatively, you can set the LD_LIBRARY_PATH environment +variable to +include the directory with your shared libraries. +If setting LD_LIBRARY_PATH, be aware that setting this variable + can introduce +a noticeable performance impact on all other applications that you run. +To set it only for Python, you might want to do this instead: +

+ +
+
$ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
+
+
+ +

+Finally, you can use a command such as ldconfig (Linux) or +crle (Solaris) to add additional search paths to the default +system configuration (this requires root access and you will need to +read the man pages). +

+ +

31.2.6 Compilation of C++ extensions

+ + +

+Compilation of C++ extensions has traditionally been a tricky problem. +Since the Python interpreter is written in C, you need to take steps to +make sure C++ is properly initialized and that modules are compiled +correctly. This should be a non-issue if you're using distutils, as +it takes care of all that for you. The following is included for +historical reasons, and in case you need to compile on your own. +

+ +

+On most machines, C++ extension modules should be linked using the C++ +compiler. For example: +

+ +
$ swig -c++ -python example.i
+$ g++ -O2 -fPIC -c example.cxx
+$ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
+$ g++ -shared example.o example_wrap.o -o _example.so
+
+ +

+The -fPIC option tells GCC to generate position-independent code (PIC) +which is required for most architectures (it's not vital on x86, but +still a good idea as it allows code pages from the library to be shared +between +processes). Other compilers may need a different option specified +instead of +-fPIC. +

+ +

+In addition to this, you may need to include additional library +files to make it work. For example, if you are using the Sun C++ +compiler on +Solaris, you often need to add an extra library -lCrun like +this: +

+ +
$ swig -c++ -python example.i
+$ CC -c example.cxx
+$ CC -c example_wrap.cxx -I/usr/local/include/python2.5
+$ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
+
+ +

+Of course, the extra libraries to use are completely non-portable---you +will +probably need to do some experimentation. +

+ +

+Sometimes people have suggested that it is necessary to relink the +Python interpreter using the C++ compiler to make C++ extension modules +work. +In the experience of this author, this has never actually appeared to be +necessary. Relinking the interpreter with C++ really only includes the + +special run-time libraries described above---as long as you link your +extension +modules with these libraries, it should not be necessary to rebuild +Python. +

+ +

+If you aren't entirely sure about the linking of a C++ extension, you +might look at an existing C++ program. On many Unix machines, the +ldd command will list library dependencies. This should give +you some clues about what you might have to include when you link your +extension module. For example: +

+ +
+
$ ldd swig
+        libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
+        libm.so.6 => /lib/libm.so.6 (0x4005b000)
+        libc.so.6 => /lib/libc.so.6 (0x40077000)
+        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
+
+
+ +

+As a final complication, a major weakness of C++ is that it does not +define any sort of standard for binary linking of libraries. This +means that C++ code compiled by different compilers will not link +together properly as libraries nor is the memory layout of classes and +data structures implemented in any kind of portable manner. In a +monolithic C++ program, this problem may be unnoticed. However, in +Python, it +is possible for different extension modules to be compiled with +different C++ compilers. As long as these modules are self-contained, +this probably won't matter. However, if these modules start sharing +data, +you will need to take steps to avoid segmentation faults and other +erratic program behavior. If working with lots of software components, + you +might want to investigate using a more formal standard such as COM. +

+ +

31.2.7 Compiling for 64-bit platforms

+ + +

+On platforms that support 64-bit applications (Solaris, Irix, etc.), +special care is required when building extension modules. On these +machines, 64-bit applications are compiled and linked using a different +set of compiler/linker options. In addition, it is not generally +possible to mix +32-bit and 64-bit code together in the same application. +

+ +

+To utilize 64-bits, the Python executable will need to be recompiled +as a 64-bit application. In addition, all libraries, wrapper code, +and every other part of your application will need to be compiled for +64-bits. If you plan to use other third-party extension modules, they +will also have to be recompiled as 64-bit extensions. +

+ +

+If you are wrapping commercial software for which you have no source +code, you will be forced to use the same linking standard as used by +that software. This may prevent the use of 64-bit extensions. It may +also introduce problems on platforms that support more than one +linking standard (e.g., -o32 and -n32 on Irix). +

+ +

On the Linux x86_64 platform (Opteron or EM64T), besides of the +required compiler option -fPIC discussed above, you will need to be +careful about the libraries you link with or the library path you +use. In general, a Linux distribution will have two set of libraries, +one for native x86_64 programs (under /usr/lib64), and another for 32 +bits compatibility (under /usr/lib). Also, the compiler options -m32 +and -m64 allow you to choose the desired binary format for your python +extension. +

+ +

31.2.8 Building Python Extensions under +Windows

+ + +

+Building a SWIG extension to Python under Windows is roughly similar to +the process used with Unix. Using the distutils, it is essentially +identical. If you have the same version of the MS compiler that Python +was built with (the python2.4 and python2.5 distributed by python.org +are built with Visual Studio 2003), the standard python setup.py +build should just work. +

+ +

+As of python2.5, the distutils support building extensions with MingGW +out +of the box. Following the instruction here: +Building +Python + extensions for Windows with only free tools should get you started. +

+ +

+If you need to build it on your own, the following notes are provided: +

+ +

+You will need to create a DLL that can be loaded into the interpreter. +This section briefly describes the use of SWIG with Microsoft Visual +C++. As a starting point, many of SWIG's examples include project +files. You might want to take a quick look at these in addition to +reading this section. +

+ +

+In Developer Studio, SWIG should be invoked as a custom build option. +This is usually done as follows: +

+ +
    +
  • Open up a new workspace and use the AppWizard to select a DLL +project. + +
  • Add both the SWIG interface file (the .i file), any supporting C +files, and the name of the wrapper file that will be created by SWIG +(ie. example_wrap.c). Note : If using C++, choose a +different suffix for the wrapper file such as +example_wrap.cxx. Don't worry if the wrapper file doesn't +exist yet--Developer Studio keeps a reference to it. + +
  • Select the SWIG interface file and go to the settings menu. +Under +settings, select the "Custom Build" option. + +
  • Enter "SWIG" in the description field. + +
  • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c +$(InputPath)" in the "Build command(s) field" + +
  • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output +files(s) field". + +
  • Next, select the settings for the entire project and go to +"C++:Preprocessor". Add the include directories for your Python +installation under "Additional include directories". + +
  • Define the symbol __WIN32__ under preprocessor options. + +
  • Finally, select the settings for the entire project and go to +"Link Options". Add the Python library file to your link libraries. +For example "python21.lib". Also, set the name of the output file to +match the name of your Python module, ie. _example.pyd - Note that +_example.dll also worked with Python-2.4 and earlier. + +
  • Build your project. +
+ +

+If all went well, SWIG will be automatically invoked whenever +you build your project. Any changes made to the interface file will +result in SWIG being automatically executed to produce a new version of +the wrapper file. +

+ +

+To run your new Python extension, simply run Python +and use the import command as normal. For example : +

+ +
$ python
+>>> import example
+>>> print example.fact(4)
+24
+>>>
+
+ +

+If you get an ImportError exception when importing the module, +you may +have forgotten to include additional library files when you built your +module. +If you get an access violation or some kind of general protection fault +immediately upon import, you have a more serious problem. This +is often caused by linking your extension module against the wrong +set of Win32 debug or thread libraries. You will have to fiddle around +with +the build options of project to try and track this down. +

+ +

+Some users have reported success in building extension modules using +Cygwin +and other compilers. However, the problem of building usable DLLs with +these +compilers tends to be rather problematic. For the latest information, +you may want to consult the +SWIG Wiki. +

+ + +

31.3 A tour of basic C/C++ wrapping

+ + +

+By default, SWIG tries to build a very natural Python interface +to your C/C++ code. Functions are wrapped as functions, classes are +wrapped as classes, and so forth. +This section briefly covers the essential aspects of this wrapping. +

+ +

31.3.1 Modules

+ + +

+The SWIG %module directive specifies the name of the Python +module. If you specify `%module example', then everything is +wrapped into a Python 'example' module. Underneath the covers, +this module consists of a Python source file example.py and a +low-level +extension module _example.so. When choosing a +module name, make sure you don't use the same name as a built-in +Python command or standard module name. +

+ +

31.3.2 Functions

+ + +

+Global functions are wrapped as new Python built-in functions. For +example, +

+ +
%module example
+int fact(int n);
+
+ +

+creates a built-in function example.fact(n) that works exactly +like you think it does: +

+ +
>>> import example
+>>> print example.fact(4)
+24
+>>>
+
+ +

31.3.3 Global variables

+ + +

+C/C++ global variables are fully supported by SWIG. However, the +underlying +mechanism is somewhat different than you might expect due to the way +that +Python assignment works. When you type the following in Python +

+ +
a = 3.4
+
+ +

+"a" becomes a name for an object containing the value 3.4. If you later +type +

+ +
b = a
+
+ +

+then "a" and "b" are both names for the object containing the value +3.4. Thus, there is only one object containing 3.4 and "a" +and "b" are both names that refer to it. This is quite +different than C where a variable name refers to a memory location in +which +a value is stored (and assignment copies data into that location). +Because of this, there is no direct way to map variable +assignment in C to variable assignment in Python. +

+ +

+To provide access to C global variables, SWIG creates a special +object called `cvar' that is added to each SWIG generated +module. Global variables are then accessed as attributes of this object. +For example, consider this interface +

+ +
// SWIG interface file with global variables
+%module example
+...
+%inline %{
+extern int My_variable;
+extern double density;
+%}
+...
+
+

+Now look at the Python interface: +

+ +
>>> import example
+>>> # Print out value of a C global variable
+>>> print example.cvar.My_variable
+4
+>>> # Set the value of a C global variable
+>>> example.cvar.density = 0.8442
+>>> # Use in a math operation
+>>> example.cvar.density = example.cvar.density*1.10
+
+ +

+If you make an error in variable assignment, you will receive an +error message. For example: +

+ +
>>> example.cvar.density = "Hello"
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+TypeError: C variable 'density (double )'
+>>> 
+
+ +

+If a variable is declared as const, it is wrapped as a +read-only variable. Attempts to modify its value will result in an +error. +

+ +

+To make ordinary variables read-only, you can use the %immutable + directive. For example: +

+ +
+
%{
+extern char *path;
+%}
+%immutable;
+extern char *path;
+%mutable;
+
+
+ +

+The %immutable directive stays in effect until it is explicitly + disabled or cleared using +%mutable. +See the Creating + read-only variables section for further details. +

+ +

+If you just want to make a specific variable immutable, supply a +declaration name. For example: +

+ +
+
%{
+extern char *path;
+%}
+%immutable path;
+...
+extern char *path;      // Read-only (due to %immutable)
+
+
+ +

+If you would like to access variables using a name other than "cvar", + it can be +changed using the -globals option : +

+ +
$ swig -python -globals myvar example.i
+
+ +

+Some care is in order when importing multiple SWIG modules. +If you use the "from <file> import *" style of +importing, you will get a name clash on the variable `cvar' +and you will only be able to access global variables from the last +module loaded. To prevent this, you might consider renaming +cvar or making it private to the module by giving it a name +that starts with a leading underscore. SWIG does not create cvar +if there are no global variables in a module. +

+ +

31.3.4 Constants and enums

+ + +

+C/C++ constants are installed as Python objects containing the +appropriate value. To create a constant, use #define, enum, + or the +%constant directive. For example: +

+ +
+
#define PI 3.14159
+#define VERSION "1.0"
+
+enum Beverage { ALE, LAGER, STOUT, PILSNER };
+
+%constant int FOO = 42;
+%constant const char *path = "/usr/local";
+
+
+ +

+For enums, make sure that the definition of the enumeration actually +appears in a header +file or in the wrapper file somehow---if you just stick an enum in a +SWIG interface without +also telling the C compiler about it, the wrapper code won't compile. +

+ +

+Note: declarations declared as const are wrapped as read-only +variables and +will be accessed using the cvar object described in the +previous section. They +are not wrapped as constants. For further discussion about this, see +the SWIG Basics +chapter. +

+ +

+Constants are not guaranteed to remain constant in Python---the name +of the constant could be accidentally reassigned to refer to some +other object. Unfortunately, there is no easy way for SWIG to +generate code that prevents this. You will just have to be careful. +

+ +

31.3.5 Pointers

+ + +

+C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no +problem working with incomplete type information. Here is a rather +simple interface: +

+ +
+
%module example
+
+FILE *fopen(const char *filename, const char *mode);
+int fputs(const char *, FILE *);
+int fclose(FILE *);
+
+
+ +

+When wrapped, you will be able to use the functions in a natural way +from Python. For example: +

+ +
+
>>> import example
+>>> f = example.fopen("junk","w")
+>>> example.fputs("Hello World\n", f)
+>>> example.fclose(f)
+
+
+ +

+If this makes you uneasy, rest assured that there is no +deep magic involved. Underneath the covers, pointers to C/C++ objects +are +simply represented as opaque values using an especial python container +object: +

+ +
>>> print f
+<Swig Object at _08a71808_p_FILE>
+
+ +

+This pointer value can be freely passed around to different C functions +that +expect to receive an object of type FILE *. The only thing you + can't do is +dereference the pointer from Python. Of course, that isn't much of a +concern in this example. +

+ +

+In older versions of Swig (1.3.22 or older), pointers were represented +using a plain string object. If you have an old package that still +requires that representation, or you just feel nostalgic, you can +always retrieve it by casting the pointer object to a string: +

+ +
>>> print str(f)
+_c0671108_p_FILE
+
+ +

+Also, if you need to pass the raw pointer value to some external +python library, you can do it by casting the pointer object to an +integer: +

+ +
>>> print int(f)
+135833352
+
+ +

+However, the inverse operation is not possible, i.e., you can't build +a Swig pointer object from a raw integer value. +

+ +

+Note also that the '0' or NULL pointer is always represented by +None, no matter what type swig is addressing. In the +previous example, you can call: +

+ +
+
>>> example.fclose(None)
+
+
+ +

+and that will be equivalent to the following, but not really useful, C +code: +

+ +
+
FILE *f = NULL;
+fclose(f);
+
+
+ +

+As much as you might be inclined to modify a pointer value directly +from Python, don't. The hexadecimal encoding is not necessarily the +same as the logical memory address of the underlying object. Instead +it is the raw byte encoding of the pointer value. The encoding will +vary depending on the native byte-ordering of the platform (i.e., +big-endian vs. little-endian). Similarly, don't try to manually cast +a pointer to a new type by simply replacing the type-string. This may +not work like you expect, it is particularly dangerous when casting +C++ objects. If you need to cast a pointer or change its value, +consider writing some helper functions instead. For example: +

+ +
+
%inline %{
+/* C-style cast */
+Bar *FooToBar(Foo *f) {
+   return (Bar *) f;
+}
+
+/* C++-style cast */
+Foo *BarToFoo(Bar *b) {
+   return dynamic_cast<Foo*>(b);
+}
+
+Foo *IncrFoo(Foo *f, int i) {
+    return f+i;
+}
+%}
+
+
+ +

+Also, if working with C++, you should always try +to use the new C++ style casts. For example, in the above code, the +C-style cast may return a bogus result whereas as the C++-style cast +will return +None if the conversion can't be performed. +

+ +

31.3.6 Structures

+ + +

+If you wrap a C structure, it is wrapped by a Python class. This +provides +a very natural interface. For example, +

+ +
struct Vector {
+	double x,y,z;
+};
+
+
+ +

+is used as follows: +

+ +
>>> v = example.Vector()
+>>> v.x = 3.5
+>>> v.y = 7.2
+>>> print v.x, v.y, v.z
+7.8 -4.5 0.0
+>>> 
+
+ +

+Similar access is provided for unions and the data members of C++ +classes. +

+ +

+If you print out the value of v in the above example, you will +see +something like this: +

+ +
+
>>> print v
+<C Vector instance at _18e31408_p_Vector>
+
+
+ +

+This object is actually a Python instance that has been wrapped around a + pointer to the low-level +C structure. This instance doesn't actually do anything--it just serves + as a proxy. +The pointer to the C object can be found in the the .this +attribute. For example: +

+ +
+
>>> print v.this
+_18e31408_p_Vector
+>>>
+
+
+ +

+Further details about the Python proxy class are covered a little later. +

+ +

+const members of a structure are read-only. Data members +can also be forced to be read-only using the %immutable +directive. For example: +

+ +
+
struct Foo {
+   ...
+   %immutable;
+   int x;        /* Read-only members */
+   char *name;
+   %mutable;
+   ...
+};
+
+
+ +

+When char * members of a structure are wrapped, the contents +are assumed to be +dynamically allocated using malloc or new (depending +on whether or not +SWIG is run with the -c++ option). When the structure member is set, +the old contents will be +released and a new value created. If this is not the behavior you +want, you will have to use +a typemap (described later). +

+ +

+If a structure contains arrays, access to those arrays is managed +through pointers. For +example, consider this: +

+ +
+
struct Bar {
+    int  x[16];
+};
+
+
+ +

+If accessed in Python, you will see behavior like this: +

+ +
+
>>> b = example.Bar()
+>>> print b.x
+_801861a4_p_int
+>>> 
+
+
+ +

+This pointer can be passed around to functions that expect to receive +an int * (just like C). You can also set the value of an +array member using +another pointer. For example: +

+ +
+
>>> c = example.Bar()
+>>> c.x = b.x             # Copy contents of b.x to c.x
+
+
+ +

+For array assignment, SWIG copies the entire contents of the array +starting with the data pointed +to by b.x. In this example, 16 integers would be copied. +Like C, SWIG makes +no assumptions about bounds checking---if you pass a bad pointer, you +may get a segmentation +fault or access violation. +

+ +

+When a member of a structure is itself a structure, it is handled as a +pointer. For example, suppose you have two structures like this: +

+ +
+
struct Foo {
+   int a;
+};
+
+struct Bar {
+   Foo f;
+};
+
+
+ +

+Now, suppose that you access the f attribute of Bar +like this: +

+ +
+
>>> b = Bar()
+>>> x = b.f
+
+
+ +

+In this case, x is a pointer that points to the Foo +that is inside b. +This is the same value as generated by this C code: +

+ +
+
Bar b;
+Foo *x = &b->f;       /* Points inside b */
+
+
+ +

+Because the pointer points inside the structure, you can modify the +contents and +everything works just like you would expect. For example: +

+ +
+
>>> b = Bar()
+>>> b.f.a = 3               # Modify attribute of structure member
+>>> x = b.f                   
+>>> x.a = 3                 # Modifies the same structure
+
+
+ +

31.3.7 C++ classes

+ + +

+C++ classes are wrapped by Python classes as well. For example, if you +have this class, +

+ +
class List {
+public:
+  List();
+  ~List();
+  int  search(char *item);
+  void insert(char *item);
+  void remove(char *item);
+  char *get(int n);
+  int  length;
+};
+
+ +

+you can use it in Python like this: +

+ +
>>> l = example.List()
+>>> l.insert("Ale")
+>>> l.insert("Stout")
+>>> l.insert("Lager")
+>>> l.get(1)
+'Stout'
+>>> print l.length
+3
+>>>
+
+ +

+Class data members are accessed in the same manner as C structures. +

+ +

+Static class members present a special problem for Python. Prior to +Python-2.2, +Python classes had no support for static methods and no version of +Python +supports static member variables in a manner that SWIG can utilize. +Therefore, +SWIG generates wrappers that try to work around some of these issues. +To illustrate, +suppose you have a class like this: +

+ +
+
class Spam {
+public:
+   static void foo();
+   static int bar;
+
+};
+
+
+ +

+In Python, the static member can be access in three different ways: +

+ +
+
>>> example.Spam_foo()    # Spam::foo()
+>>> s = example.Spam()
+>>> s.foo()               # Spam::foo() via an instance
+>>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
+
+
+ +

+The first two methods of access are supported in all versions of Python. + The +last technique is only available in Python-2.2 and later versions. +

+ +

+Static member variables are currently accessed as global variables. +This means, +they are accessed through cvar like this: +

+ +
+
>>> print example.cvar.Spam_bar
+7
+
+
+ +

31.3.8 C++ inheritance

+ + +

+SWIG is fully aware of issues related to C++ inheritance. Therefore, if + you have +classes like this +

+ +
+
class Foo {
+...
+};
+
+class Bar : public Foo {
+...
+};
+
+
+ +

+those classes are wrapped into a hierarchy of Python classes that +reflect the same inheritance +structure. All of the usual Python utility functions work normally: +

+ +
+
>>> b = Bar()
+>>> instance(b,Foo)
+1
+>>> issubclass(Bar,Foo)
+1
+>>> issubclass(Foo,Bar)
+0
+
+
+ +

+Furthermore, if you have functions like this +

+ +
+
void spam(Foo *f);
+
+
+ +

+then the function spam() accepts Foo * or a pointer to + any class derived from Foo. +

+ +

+It is safe to use multiple inheritance with SWIG. +

+ +

31.3.9 Pointers, references, values, and +arrays

+ + +

+In C++, there are many different ways a function might receive +and manipulate objects. For example: +

+ +
+
void spam1(Foo *x);      // Pass by pointer
+void spam2(Foo &x);      // Pass by reference
+void spam3(const Foo &x);// Pass by const reference
+void spam4(Foo x);       // Pass by value
+void spam5(Foo x[]);     // Array of objects
+
+
+ +

+In Python, there is no detailed distinction like this--specifically, +there are only "objects". There are no pointers, references, arrays, +and so forth. Because of this, SWIG unifies all of these types +together in the wrapper code. For instance, if you actually had the +above functions, it is perfectly legal to do this: +

+ +
+
>>> f = Foo()           # Create a Foo
+>>> spam1(f)            # Ok. Pointer
+>>> spam2(f)            # Ok. Reference
+>>> spam3(f)            # Ok. Const reference
+>>> spam4(f)            # Ok. Value.
+>>> spam5(f)            # Ok. Array (1 element)
+
+
+ +

+Similar behavior occurs for return values. For example, if you had +functions like this, +

+ +
+
Foo *spam6();
+Foo &spam7();
+Foo  spam8();
+const Foo &spam9();
+
+
+ +

+then all three functions will return a pointer to some Foo +object. +Since the third function (spam8) returns a value, newly allocated memory + is used +to hold the result and a pointer is returned (Python will release this +memory +when the return value is garbage collected). The fourth case (spam9) +which returns a const reference, in most of the cases will be +treated as a returning value, and it will follow the same +allocation/deallocation process. +

+ +

31.3.10 C++ overloaded functions

+ + +

+C++ overloaded functions, methods, and constructors are mostly supported + by SWIG. For example, +if you have two functions like this: +

+ +
+
void foo(int);
+void foo(char *c);
+
+
+ +

+You can use them in Python in a straightforward manner: +

+ +
+
>>> foo(3)           # foo(int)
+>>> foo("Hello")     # foo(char *c)
+
+
+ +

+Similarly, if you have a class like this, +

+ +
+
class Foo {
+public:
+    Foo();
+    Foo(const Foo &);
+    ...
+};
+
+
+ +

+you can write Python code like this: +

+ +
+
>>> f = Foo()          # Create a Foo
+>>> g = Foo(f)         # Copy f
+
+
+ +

+Overloading support is not quite as flexible as in C++. Sometimes there +are methods that SWIG +can't disambiguate. For example: +

+ +
+
void spam(int);
+void spam(short);
+
+
+ +

+or +

+ +
+
void foo(Bar *b);
+void foo(Bar &b);
+
+
+ +

+If declarations such as these appear, you will get a warning message +like this: +

+ +
+
example.i:12: Warning(509): Overloaded spam(short) is shadowed by spam(int)
+at example.i:11.
+
+
+ +

+To fix this, you either need to ignore or rename one of the methods. +For example: +

+ +
+
%rename(spam_short) spam(short);
+...
+void spam(int);    
+void spam(short);   // Accessed as spam_short
+
+
+ +

+or +

+ +
+
%ignore spam(short);
+...
+void spam(int);    
+void spam(short);   // Ignored
+
+
+ +

+SWIG resolves overloaded functions and methods using a disambiguation +scheme that ranks and sorts +declarations according to a set of type-precedence rules. The order +in which declarations appear +in the input does not matter except in situations where ambiguity +arises--in this case, the +first declaration takes precedence. +

+ +

+Please refer to the "SWIG and C++" chapter for more information about +overloading. +

+ +

31.3.11 C++ operators

+ + +

+Certain C++ overloaded operators can be handled automatically by SWIG. +For example, +consider a class like this: +

+ +
+
class Complex {
+private:
+  double rpart, ipart;
+public:
+  Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
+  Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
+  Complex &operator=(const Complex &c);
+
+  Complex operator+=(const Complex &c) const;
+  Complex operator+(const Complex &c) const;
+  Complex operator-(const Complex &c) const;
+  Complex operator*(const Complex &c) const;
+  Complex operator-() const;
+  
+  double re() const { return rpart; }
+  double im() const { return ipart; }
+};
+
+
+ +

+When wrapped, it works like you expect: +

+ +
+
>>> c = Complex(3,4)
+>>> d = Complex(7,8)
+>>> e = c + d
+>>> e.re()
+10.0
+>>> e.im()
+12.0
+>>> c += d
+>>> c.re()
+10.0
+>>> c.im()
+12.0
+
+
+
+ +

+One restriction with operator overloading support is that SWIG is not +able to fully handle operators that aren't defined as part of the class. +For example, if you had code like this +

+ +
+
class Complex {
+...
+friend Complex operator+(double, const Complex &c);
+...
+};
+
+
+ +

+then SWIG ignores it and issues a warning. You can still wrap the +operator, +but you may have to encapsulate it in a special function. For example: +

+ +
+
%rename(Complex_add_dc) operator+(double, const Complex &);
+
+
+ +

+There are ways to make this operator appear as part of the class using +the %extend directive. +Keep reading. +

+ +

+Also, be aware that certain operators don't map cleanly to Python. For +instance, +overloaded assignment operators don't map to Python semantics and will +be ignored. +

+ +

31.3.12 C++ namespaces

+ + +

+SWIG is aware of C++ namespaces, but namespace names do not appear in +the module nor do namespaces result in a module that is broken up into +submodules or packages. For example, if you have a file like this, +

+ +
+
%module example
+
+namespace foo {
+   int fact(int n);
+   struct Vector {
+       double x,y,z;
+   };
+};
+
+
+ +

+it works in Python as follows: +

+ +
+
>>> import example
+>>> example.fact(3)
+6
+>>> v = example.Vector()
+>>> v.x = 3.4
+>>> print v.y
+0.0
+>>>
+
+
+ +

+If your program has more than one namespace, name conflicts (if any) can + be resolved using %rename +For example: +

+ +
+
%rename(Bar_spam) Bar::spam;
+
+namespace Foo {
+    int spam();
+}
+
+namespace Bar {
+    int spam();
+}
+
+
+ +

+If you have more than one namespace and your want to keep their +symbols separate, consider wrapping them as separate SWIG modules. +For example, make the module name the same as the namespace and create +extension modules for each namespace separately. If your program +utilizes thousands of small deeply nested namespaces each with +identical symbol names, well, then you get what you deserve. +

+ +

31.3.13 C++ templates

+ + +

+C++ templates don't present a huge problem for SWIG. However, in order +to create wrappers, you have to tell SWIG to create wrappers for a +particular +template instantiation. To do this, you use the %template +directive. +For example: +

+ +
+
%module example
+%{
+#include "pair.h"
+%}
+
+template<class T1, class T2>
+struct pair {
+   typedef T1 first_type;
+   typedef T2 second_type;
+   T1 first;
+   T2 second;
+   pair();
+   pair(const T1&, const T2&);
+  ~pair();
+};
+
+%template(pairii) pair<int,int>;
+
+
+ +

+In Python: +

+ +
+
>>> import example
+>>> p = example.pairii(3,4)
+>>> p.first
+3
+>>> p.second
+4
+
+
+ +

+Obviously, there is more to template wrapping than shown in this +example. +More details can be found in the SWIG and C++ + chapter. +Some more complicated +examples will appear later. +

+ +

31.3.14 C++ Smart Pointers

+ + +

+In certain C++ programs, it is common to use classes that have been +wrapped by +so-called "smart pointers." Generally, this involves the use of a +template class +that implements operator->() like this: +

+ +
+
template<class T> class SmartPtr {
+   ...
+   T *operator->();
+   ...
+}
+
+
+ +

+Then, if you have a class like this, +

+ +
+
class Foo {
+public:
+     int x;
+     int bar();
+};
+
+
+ +

+A smart pointer would be used in C++ as follows: +

+ +
+
SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
+...
+p->x = 3;                        // Foo::x
+int y = p->bar();                // Foo::bar
+
+
+ +

+To wrap this in Python, simply tell SWIG about the SmartPtr +class and the low-level +Foo object. Make sure you instantiate SmartPtr using %template + if necessary. +For example: +

+ +
+
%module example
+...
+%template(SmartPtrFoo) SmartPtr<Foo>;
+...
+
+
+ +

+Now, in Python, everything should just "work": +

+ +
+
>>> p = example.CreateFoo()          # Create a smart-pointer somehow
+>>> p.x = 3                          # Foo::x
+>>> p.bar()                          # Foo::bar
+
+
+ +

+If you ever need to access the underlying pointer returned by operator->() + itself, +simply use the __deref__() method. For example: +

+ +
+
>>> f = p.__deref__()     # Returns underlying Foo *
+
+
+ + +

31.3.15 C++ Reference Counted Objects +(ref/unref)

+ + +

+Another usual idiom in C++ is the use of reference counted +objects. Consider for example: + +

+
class RCObj  {
+  // implement the ref counting mechanism
+  int add_ref();
+  int del_ref();
+  int ref_count();
+
+public:
+  virtual ~RCObj() = 0;
+
+  int ref() const {
+    return add_ref();
+  }
+
+  int unref() const   {
+    if (ref_count() == 0 || del_ref() == 0 ) {
+	delete this;
+	return 0;
+      } 
+    return ref_count();
+  }
+};
+
+
+class A : RCObj {
+public:
+  A();
+  int foo();
+};
+
+
+class B {
+  A *_a;
+
+public:
+  B(A *a) : _a(a) { 
+    a->ref(); 
+  }
+
+  ~B() { 
+    a->unref(); 
+  }
+};
+
+int main() {
+  A *a  = new A();
+  a->ref();           // 'a' is ref here
+
+  B *b1 = new B(a);   // 'a' is ref here
+  if (1 + 1 == 2) {
+    B *b2 = new B(a); // 'a' is ref here
+    delete b2;        // 'a' is unref, but not deleted   
+  }
+
+  delete b1;          // 'a' is unref, but not deleted   
+  a->unref();         // 'a' is unref and deleted
+}
+
+
+ +

+In the example above, the 'A' class instance 'a' is a reference counted +object, which can't be deleted arbitrarily since it is shared between +the objects 'b1' and 'b2'. 'A' is derived from an Reference Counted +Object 'RCObj', which implements the ref/unref idiom. +

+ +

+To tell SWIG that 'RCObj' and all its derived classes are reference +counted objects, you use the "ref" and "unref" features, or +%ref and %unref directives (since 1.3.28). For +example: +

+ + +
+
%module example
+...
+
+%feature("ref")   RCObj "$this->ref();"
+%feature("unref") RCObj "$this->unref();"
+
+%include "rcobj.h"
+%include "A.h"
+...
+
+
+ +or, using the directive form: + + +
+
%module example
+...
+
+%ref   RCObj "$this->ref();"
+%unref RCObj "$this->unref();"
+
+%include "rcobj.h"
+%include "A.h"
+...
+
+
+ + + +

+where the code passed to the "ref" and "unref" features will be +executed as needed whenever a new object is passed to python, or when +python tries to release the shadow object instance, respectively. +

+ +

+In the python side, the use of a reference counted object is not +different than any other regular instance: +

+ +
+
def create_A():
+  a = A()         # SWIG ref 'a' (new object is passed to python)
+  b1 = B(a)       # C++  ref 'a'
+  if 1 + 1 == 2:
+     b2 = B(a)    # C++ ref 'a'
+  return a        # 'b1' and 'b2' are released, C++ unref 'a' twice
+
+a = create_A()   
+exit              # 'a' is released, SWIG unref 'a'
+
+
+ +

+Note that the user doesn't explicitly need to call 'a->ref()' nor +'a->unref()' +(as neither 'delete a'). Instead, SWIG take cares of executing the "ref" +and "unref" codes as needed. If the user doesn't specify the +"ref/unref" features, SWIG will produce a code equivalent to define +them as: +

+ +
+
%feature("ref")   ""
+%feature("unref") "delete $this;"
+
+
+ +

+In other words, SWIG will not do anything special when a new object +is passed to python, and it will always 'delete' the object when +python releases the proxy instance. +

+ + +

31.4 Further details on the Python class +interface

+ + +

+In the previous section, a high-level view of Python wrapping was +presented. A key component of this wrapping is that structures and +classes are wrapped by Python proxy classes. This provides a very +natural Python interface and allows SWIG to support a number of +advanced features such as operator overloading. However, a number +of low-level details were omitted. This section provides a brief +overview +of how the proxy classes work. +

+ +

31.4.1 Proxy classes

+ + +

+In the "SWIG basics" + and "SWIG +and C++" chapters, +details of low-level structure and class wrapping are described. To +summarize those chapters, if you +have a class like this +

+ +
+
class Foo {
+public:
+     int x;
+     int spam(int);
+     ...
+
+
+ +

+then SWIG transforms it into a set of low-level procedural wrappers. For + example: +

+ +
+
Foo *new_Foo() {
+    return new Foo();
+}
+void delete_Foo(Foo *f) {
+    delete f;
+}
+int Foo_x_get(Foo *f) {
+    return f->x;
+}
+void Foo_x_set(Foo *f, int value) {
+    f->x = value;
+}
+int Foo_spam(Foo *f, int arg1) {
+    return f->spam(arg1);
+}
+
+
+ +

+These wrappers can be found in the low-level extension module (e.g., _example). +

+ +

+Using these wrappers, SWIG generates a high-level Python proxy class +(also known as a shadow class) like this (shown +for Python 2.2): +

+ +
+
import _example
+
+class Foo(object):
+     def __init__(self):
+         self.this = _example.new_Foo()
+         self.thisown = 1
+     def __del__(self):
+         if self.thisown:
+               _example.delete_Foo(self.this)
+     def spam(self,arg1):
+         return _example.Foo_spam(self.this,arg1)
+     x = property(_example.Foo_x_get, _example.Foo_x_set)
+
+
+ +

+This class merely holds a pointer to the underlying C++ object (.this) + and dispatches methods and +member variable access to that object using the low-level accessor +functions. From a user's point of +view, it makes the class work normally: +

+ +
+
>>> f = example.Foo()
+>>> f.x = 3
+>>> y = f.spam(5)
+
+
+ +

+The fact that the class has been wrapped by a real Python class offers +certain advantages. For instance, +you can attach new Python methods to the class and you can even inherit +from it (something not supported +by Python built-in types until Python 2.2). +

+ +

31.4.2 Memory management

+ + +

+Associated with proxy object, is an ownership flag .thisown +The value of this +flag determines who is responsible for deleting the underlying C++ +object. If set to 1, +the Python interpreter will destroy the C++ object when the proxy class +is +garbage collected. If set to 0 (or if the attribute is missing), then +the destruction +of the proxy class has no effect on the C++ object. +

+ +

+When an object is created by a constructor or returned by value, Python +automatically takes +ownership of the result. For example: +

+ +
+
class Foo {
+public:
+    Foo();
+    Foo bar();
+};
+
+
+ +

+In Python: +

+ +
+
>>> f = Foo()
+>>> f.thisown
+1
+>>> g = f.bar()
+>>> g.thisown
+1
+
+
+ +

+On the other hand, when pointers are returned to Python, there is often +no way to know where +they came from. Therefore, the ownership is set to zero. For example: +

+ +
+
class Foo {
+public:
+    ...
+    Foo *spam();
+    ...
+};
+
+
+ +
+ +
+
>>> f = Foo()
+>>> s = f.spam()
+>>> print s.thisown
+0
+>>>
+
+
+ +

+This behavior is especially important for classes that act as +containers. For example, if a method returns a pointer to an object +that is contained inside another object, you definitely don't want +Python to assume ownership and destroy it! +

+ +

+A good way to indicate that ownership should be set for a returned +pointer +is to use the %newobject +directive. +

+ +

+Related to containers, ownership issues can arise whenever an object is +assigned to a member +or global variable. For example, consider this interface: +

+ +
+
%module example
+
+struct Foo {
+    int  value;
+    Foo  *next;
+};
+
+Foo *head = 0;
+
+
+ +

+When wrapped in Python, careful observation will reveal that ownership +changes whenever an object +is assigned to a global variable. For example: +

+ +
+
>>> f = example.Foo()
+>>> f.thisown
+1
+>>> example.cvar.head = f           
+>>> f.thisown
+0
+>>>
+
+
+ +

+In this case, C is now holding a reference to the object---you probably +don't want Python to destroy it. +Similarly, this occurs for members. For example: +

+ +
+
>>> f = example.Foo()
+>>> g = example.Foo()
+>>> f.thisown
+1
+>>> g.thisown
+1
+>>> f.next = g
+>>> g.thisown
+0
+>>>
+
+
+ +

+For the most part, memory management issues remain hidden. However, +there are occasionally situations where you might have to manually +change the ownership of an object. For instance, consider code like +this: +

+ +
+
class Node {
+   Object *value;
+public:
+   void set_value(Object *v) { value = v; }
+   ...
+};
+
+
+ +

+Now, consider the following Python code: +

+ +
+
>>> v = Object()           # Create an object
+>>> n = Node()             # Create a node
+>>> n.set_value(v)         # Set value
+>>> v.thisown
+1
+>>> del v
+
+
+ +

+In this case, the object n is holding a reference to +v internally. However, SWIG has no way to know that this +has occurred. Therefore, Python still thinks that it has ownership of +the +object. Should the proxy object be destroyed, then the C++ destructor +will be invoked and n will be holding a stale-pointer. If +you're lucky, you will only get a segmentation fault. +

+ +

+To work around this, it is always possible to flip the ownership flag. +For example, +

+ +
+
>>> v.thisown = 0
+
+
+ +

+It is also possible to deal with situations like this using +typemaps--an advanced topic discussed later. +

+ +

31.4.3 Python 2.2 and classic classes

+ + +

+SWIG makes every attempt to preserve backwards compatibility with +older versions of Python to the extent that it is possible. However, +in Python-2.2, an entirely new type of class system was introduced. +This new-style class system offers many enhancements including static +member functions, properties (managed attributes), and class methods. +Details about all of these changes can be found on www.python.org and is not repeated +here. +

+ +

+To address differences between Python versions, SWIG currently emits +dual-mode proxy class wrappers. In Python-2.2 and newer releases, +these wrappers encapsulate C++ objects in new-style classes that take +advantage of new features (static methods and properties). However, +if these very same wrappers are imported into an older version of +Python, +old-style classes are used instead. +

+ +

+This dual-nature of the wrapper code means that you can create extension +modules with SWIG and those modules will work with all versions of +Python +ranging from Python-1.4 to the very latest release. Moreover, the +wrappers take +advantage of Python-2.2 features when available. +

+ +

+For the most part, the interface presented to users is the same +regardless +of what version of Python is used. The only incompatibility lies in the + handling +of static member functions. In Python-2.2, they can be accessed via the +class itself. In Python-2.1 and earlier, they have to be accessed as a +global +function or through an instance (see the earlier section). +

+ +

31.5 Cross language polymorphism

+ + +

+Proxy classes provide a more natural, object-oriented way to access +extension classes. As described above, each proxy instance has an +associated C++ instance, and method calls to the proxy are passed to the +C++ instance transparently via C wrapper functions. +

+ +

+This arrangement is asymmetric in the sense that no corresponding +mechanism exists to pass method calls down the inheritance chain from +C++ to Python. In particular, if a C++ class has been extended in Python +(by extending the proxy class), these extensions will not be visible +from C++ code. Virtual method calls from C++ are thus not able access +the lowest implementation in the inheritance chain. +

+ +

+Changes have been made to SWIG 1.3.18 to address this problem and +make the relationship between C++ classes and proxy classes more +symmetric. To achieve this goal, new classes called directors are +introduced at the bottom of the C++ inheritance chain. The job of the +directors is to route method calls correctly, either to C++ +implementations higher in the inheritance chain or to Python +implementations lower in the inheritance chain. The upshot is that C++ +classes can be extended in Python and from C++ these extensions look +exactly like native C++ classes. Neither C++ code nor Python code needs +to know where a particular method is implemented: the combination of +proxy classes, director classes, and C wrapper functions takes care of +all the cross-language method routing transparently. +

+ +

31.5.1 Enabling directors

+ + +

+The director feature is disabled by default. To use directors you +must make two changes to the interface file. First, add the "directors" +option to the %module directive, like this: +

+ +
+
%module(directors="1") modulename
+
+
+ +

+Without this option no director code will be generated. Second, you +must use the %feature("director") directive to tell SWIG which classes +and methods should get directors. The %feature directive can be applied + +globally, to specific classes, and to specific methods, like this: +

+ +
+
// generate directors for all classes that have virtual methods
+%feature("director");         
+
+// generate directors for all virtual methods in class Foo
+%feature("director") Foo;      
+
+// generate a director for just Foo::bar()
+%feature("director") Foo::bar; 
+
+
+ +

+You can use the %feature("nodirector") directive to turn off +directors for specific classes or methods. So for example, +

+ +
+
%feature("director") Foo;
+%feature("nodirector") Foo::bar;
+
+
+ +

+will generate directors for all virtual methods of class Foo except +bar(). +

+ +

+Directors can also be generated implicitly through inheritance. +In the following, class Bar will get a director class that handles +the methods one() and two() (but not three()): +

+ +
+
%feature("director") Foo;
+class Foo {
+public:
+    Foo(int foo);
+    virtual void one();
+    virtual void two();
+};
+
+class Bar: public Foo {
+public:
+    virtual void three();
+};
+
+
+ +

+then at the python side you can define +

+ +
+
import mymodule
+
+class MyFoo(mymodule.Foo):
+  def __init__(self, foo):
+     mymodule.Foo(self, foo)  
+
+  def one(self):
+     print "one from python"
+
+
+ + +

31.5.2 Director classes

+ + + + + +

+For each class that has directors enabled, SWIG generates a new class +that derives from both the class in question and a special +Swig::Director class. These new classes, referred to as +director +classes, can be loosely thought of as the C++ equivalent of the Python +proxy classes. The director classes store a pointer to their underlying +Python object and handle various issues related to object ownership. +Indeed, this is quite similar to the "this" and "thisown" members of the +Python proxy classes. +

+ +

+For simplicity let's ignore the Swig::Director class and refer +to the +original C++ class as the director's base class. By default, a director +class extends all virtual methods in the inheritance chain of its base +class (see the preceding section for how to modify this behavior). +Thus all virtual method calls, whether they originate in C++ or in +Python via proxy classes, eventually end up in at the implementation in +the director class. The job of the director methods is to route these +method calls to the appropriate place in the inheritance chain. By +"appropriate place" we mean the method that would have been called if +the C++ base class and its extensions in Python were seamlessly +integrated. That seamless integration is exactly what the director +classes provide, transparently skipping over all the messy extension API +glue that binds the two languages together. +

+ +

+In reality, the "appropriate place" is one of only two possibilities: +C++ or Python. Once this decision is made, the rest is fairly easy. If +the correct implementation is in C++, then the lowest implementation of +the method in the C++ inheritance chain is called explicitly. If the +correct implementation is in Python, the Python API is used to call the +method of the underlying Python object (after which the usual virtual +method resolution in Python automatically finds the right +implementation). +

+ +

+Now how does the director decide which language should handle the method + call? +The basic rule is to handle the method in Python, unless there's a good +reason not to. The reason for this is simple: Python has the most +"extended" implementation of the method. This assertion is guaranteed, +since at a minimum the Python proxy class implements the method. If the +method in question has been extended by a class derived from the proxy +class, that extended implementation will execute exactly as it should. +If not, the proxy class will route the method call into a C wrapper +function, expecting that the method will be resolved in C++. The wrapper +will call the virtual method of the C++ instance, and since the director +extends this the call will end up right back in the director method. Now +comes the "good reason not to" part. If the director method were to +blindly +call the Python method again, it would get stuck in an infinite loop. We + avoid this +situation by adding special code to the C wrapper function that tells +the director method to not do this. The C wrapper function compares the +pointer to the Python object that called the wrapper function to the +pointer stored by the director. If these are the same, then the C +wrapper function tells the director to resolve the method by calling up +the C++ inheritance chain, preventing an infinite loop. +

+ +

+One more point needs to be made about the relationship between director +classes and proxy classes. When a proxy class instance is created in +Python, SWIG creates an instance of the original C++ class and assigns +it to .this. This is exactly what happens without directors and +is true even if directors are enabled for the particular class in +question. When a class derived from a proxy class is created, +however, SWIG then creates an instance of the corresponding C++ director +class. The reason for this difference is that user-defined subclasses +may override or extend methods of the original class, so the director +class is needed to route calls to these methods correctly. For +unmodified proxy classes, all methods are ultimately implemented in C++ +so there is no need for the extra overhead involved with routing the +calls through Python. +

+ +

31.5.3 Ownership and object destruction

+ + +

+Memory management issues are slightly more complicated with directors +than for proxy classes alone. Python instances hold a pointer to the +associated C++ director object, and the director in turn holds a pointer +back to the Python object. By default, proxy classes own their C++ +director object and take care of deleting it when they are garbage +collected. +

+ +

+This relationship can be reversed by calling the special +__disown__() method of the proxy class. After calling this +method, the .thisown flag is set to zero, and the director +class increments the reference count of the Python object. When the +director class is deleted it decrements the reference count. Assuming no +outstanding references to the Python object remain, the Python object +will be destroyed at the same time. This is a good thing, since +directors and proxies refer to each other and so must be created and +destroyed together. Destroying one without destroying the other will +likely cause your program to segfault. +

+ +

+To help ensure that no references to the Python object remain after +calling __disown__(), this method returns a weak reference to +the Python object. Weak references are only available in Python versions +2.1 and higher, so for older versions you must explicitly delete all +references. Here is an example: +

+ +
+
class Foo {
+public:
+    ...
+};
+class FooContainer {
+public:
+    void addFoo(Foo *);
+    ...
+};
+
+
+ +
+ +
+
>>> c = FooContainer()
+>>> a = Foo().__disown()__
+>>> c.addFoo(a)
+>>> b = Foo()
+>>> b = b.__disown()__
+>>> c.addFoo(b)
+>>> c.addFoo(Foo().__disown()__)
+
+
+ +

+In this example, we are assuming that FooContainer will take care of +deleting all the Foo pointers it contains at some point. Note that no +hard +references to the Foo objects remain in Python. +

+ +

31.5.4 Exception unrolling

+ + +

+With directors routing method calls to Python, and proxies routing them +to C++, the handling of exceptions is an important concern. By default, +the +directors ignore exceptions that occur during method calls that are +resolved in Python. To handle such exceptions correctly, it is necessary +to temporarily translate them into C++ exceptions. This can be done with +the %feature("director:except") directive. The following code should +suffice in most cases: +

+ +
+
%feature("director:except") {
+    if ($error != NULL) {
+        throw Swig::DirectorMethodException();
+    }
+}
+
+
+ +

+This code will check the Python error state after each method call from +a director into Python, and throw a C++ exception if an error occurred. +This exception can be caught in C++ to implement an error handler. +Currently no information about the Python error is stored in the +Swig::DirectorMethodException object, but this will likely change in +the future. +

+ +

+It may be the case that a method call originates in Python, travels up +to C++ through a proxy class, and then back into Python via a director +method. If an exception occurs in Python at this point, it would be nice +for that exception to find its way back to the original caller. This can +be done by combining a normal %exception directive with the +director:except handler shown above. Here is an example of a +suitable exception handler: +

+ +
+
%exception {
+    try { $action }
+    catch (Swig::DirectorException &e) { SWIG_fail; }
+}
+
+
+ +

+The class Swig::DirectorException used in this example is actually a +base class of Swig::DirectorMethodException, so it will trap this +exception. Because the Python error state is still set when +Swig::DirectorMethodException is thrown, Python will register the +exception as soon as the C wrapper function returns. +

+ +

31.5.5 Overhead and code bloat

+ + +

+Enabling directors for a class will generate a new director method for +every virtual method in the class' inheritance chain. This alone can +generate a lot of code bloat for large hierarchies. Method arguments +that require complex conversions to and from target language types can +result in large director methods. For this reason it is recommended that +you selectively enable directors only for specific classes that are +likely to be extended in Python and used in C++. +

+ +

+Compared to classes that do not use directors, the call routing in the +director methods does add some overhead. In particular, at least one +dynamic cast and one extra function call occurs per method call from +Python. Relative to the speed of Python execution this is probably +completely negligible. For worst case routing, a method call that +ultimately resolves in C++ may take one extra detour through Python in +order to ensure that the method does not have an extended Python +implementation. This could result in a noticeable overhead in some +cases. +

+ +

+Although directors make it natural to mix native C++ objects with Python +objects (as director objects) via a common base class pointer, one +should be aware of the obvious fact that method calls to Python objects +will be much slower than calls to C++ objects. This situation can be +optimized by selectively enabling director methods (using the %feature +directive) for only those methods that are likely to be extended in +Python. +

+ +

31.5.6 Typemaps

+ + +

+Typemaps for input and output of most of the basic types from director +classes have been written. These are roughly the reverse of the usual +input and output typemaps used by the wrapper code. The typemap +operation names are 'directorin', 'directorout', and 'directorargout'. +The director code does not currently use any of the other kinds of +typemaps. +It is not clear at this point which kinds are appropriate and +need to be supported. +

+ + +

31.5.7 Miscellaneous

+ + +

+Director typemaps for STL classes are in place, and hence you should +be able to use std::vector, std::string, etc., as you would any other +type. +

+ +

+Note: The director typemaps for return types based in const +references, such as + +

+
class Foo {
+…
+    virtual const int& bar();
+…
+};
+
+
+ +

+will work only for simple call scenarios. Usually the resulting code +is neither thread or reentrant safe. Hence, the user is advised to +avoid returning const references in director methods. For example, +the user could modify the method interface to use lvalue return +types, wherever possible, for example +

+ +
+
class Foo {
+…
+    virtual int bar();
+…
+};
+
+
+ +

+If that is not possible, the user should avoid enabling the +director feature for reentrant, recursive or threaded member +methods that return const references. +

+ + +

31.6 Common customization features

+ + +

+The last section presented the absolute basics of C/C++ wrapping. If +you do nothing but feed SWIG a header file, you will get an interface +that mimics the behavior described. However, sometimes this isn't +enough to produce a nice module. Certain types of functionality might +be missing or the interface to certain functions might be awkward. +This section describes some common SWIG features that are used to +improve your the interface to an extension module. +

+ +

31.6.1 C/C++ helper functions

+ + +

+Sometimes when you create a module, it is missing certain bits of +functionality. For +example, if you had a function like this +

+ +
+
void set_transform(Image *im, double m[4][4]);
+
+
+ +

+it would be accessible from Python, but there may be no easy way to call + it. +For example, you might get errors like this: +

+ +
+
>>> a = [
+...   [1,0,0,0],
+...   [0,1,0,0],
+...   [0,0,1,0],
+...   [0,0,0,1]]
+>>> set_transform(im,a)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+TypeError: Type error. Expected _p_a_4__double
+
+
+ +

+The problem here is that there is no easy way to construct and +manipulate a suitable +double [4][4] value to use. To fix this, you can write some +extra C helper +functions. Just use the %inline directive. For example: +

+ +
+
%inline %{
+/* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
+double (*new_mat44())[4] {
+   return (double (*)[4]) malloc(16*sizeof(double));
+}
+void free_mat44(double (*x)[4]) {
+   free(x);
+}
+void mat44_set(double x[4][4], int i, int j, double v) {
+   x[i][j] = v;
+}
+double mat44_get(double x[4][4], int i, int j) {
+   return x[i][j];
+}
+%}
+
+
+ +

+From Python, you could then write code like this: +

+ +
+
>>> a = new_mat44()
+>>> mat44_set(a,0,0,1.0)
+>>> mat44_set(a,1,1,1.0)
+>>> mat44_set(a,2,2,1.0)
+...
+>>> set_transform(im,a)
+>>>
+
+
+ +

+Admittedly, this is not the most elegant looking approach. However, it +works and it wasn't too +hard to implement. It is possible to clean this up using Python code, +typemaps, and other +customization features as covered in later sections. +

+ +

31.6.2 Adding additional Python code

+ + +

+If writing support code in C isn't enough, it is also possible to write +code in +Python. This code gets inserted in to the .py file created by +SWIG. One +use of Python code might be to supply a high-level interface to certain +functions. +For example: +

+ +
+
void set_transform(Image *im, double x[4][4]);
+
+...
+/* Rewrite the high level interface to set_transform */
+%pythoncode %{
+def set_transform(im,x):
+   a = new_mat44()
+   for i in range(4):
+       for j in range(4):
+           mat44_set(a,i,j,x[i][j])
+   _example.set_transform(im,a)
+   free_mat44(a)
+%}
+
+
+ +

+In this example, set_transform() provides a high-level Python +interface built on top of +low-level helper functions. For example, this code now seems to work: +

+ +
+
>>> a = [
+...   [1,0,0,0],
+...   [0,1,0,0],
+...   [0,0,1,0],
+...   [0,0,0,1]]
+>>> set_transform(im,a)
+>>>
+
+
+ +

+Admittedly, this whole scheme for wrapping the two-dimension array +argument is rather ad-hoc. Besides, shouldn't a Python list or a +Numeric Python array just work normally? We'll get to those examples +soon enough. For now, think of this example as an illustration of +what can be done without having to rely on any of the more advanced +customization features. +

+ +

Sometimes you may want to replace or modify the wrapper function +that SWIG creates in the proxy .py file. The Python module +in SWIG provides some features that enable you do do this. First, to +entirely replace a proxy function you can use +%feature("shadow"). For example:

+ +
+
%module example
+
+// Rewrite bar() python code
+
+%feature("shadow") Foo::bar(int) %{
+def bar(*args):
+    #do something before
+    $action
+    #do something after
+%}
+    
+class Foo {
+public:
+    int bar(int x);
+}
+
+
+ +

where $action will be replaced by the call to +the C/C++ proper method. +

+ +

+Often the proxy function created by SWIG is fine, but you simply want +to add code to it without touching the rest of the generated function +body. For these cases SWIG provides the pythonprepend and +pythonappend features which do exactly as their names suggest. + The +pythonprepend feature will insert its value at the beginning of + the +proxy function, and pythonappend will insert code at the end of + the +proxy, just before the return statement. +

+ + +
+
%module example
+
+// Add python code to bar() 
+
+%feature("pythonprepend") Foo::bar(int) %{
+   #do something before C++ call
+%}
+
+%feature("pythonappend") Foo::bar(int) %{
+   #do something after C++ call
+%}
+
+    
+class Foo {
+public:
+    int bar(int x);
+}
+
+
+ +

+Notes: Usually the pythonappend and pythonprepend +features are safer to use than the shadow feature. Also, from +SWIG version 1.3.28 you can use the directive forms +%pythonappend and %pythonprepend as follows:

+ + +
+
%module example
+
+// Add python code to bar() 
+
+%pythonprepend Foo::bar(int) %{
+   #do something before C++ call
+%}
+
+%pythonappend Foo::bar(int) %{
+   #do something after C++ call
+%}
+
+    
+class Foo {
+public:
+    int bar(int x);
+}
+
+
+ + + + +

31.6.3 Class extension with %extend

+ + +

+One of the more interesting features of SWIG is that it can extend +structures and classes with new methods--at least in the Python +interface. +Here is a simple example: +

+ +
+
%module example
+%{
+#include "someheader.h"
+%}
+
+struct Vector {
+   double x,y,z;
+};
+
+%extend Vector {
+   char *__str__() {
+       static char tmp[1024];
+       sprintf(tmp,"Vector(%g,%g,%g)", $self->x,$self->y,$self->z);
+       return tmp;
+   }
+   Vector(double x, double y, double z) {
+       Vector *v = (Vector *) malloc(sizeof(Vector));
+       v->x = x;
+       v->y = y;
+       v->z = z;
+       return v;
+   }
+};
+
+
+ +

+Now, in Python +

+ +
+
>>> v = example.Vector(2,3,4)
+>>> print v
+Vector(2,3,4)
+>>>
+
+
+ +

+%extend can be used for many more tasks than this. +For example, if you wanted to overload a Python operator, you might do +this: +

+ +
+
%extend Vector {
+    Vector __add__(Vector *other) {
+         Vector v;
+         v.x = $self->x + other->x;
+         v.y = $self->y + other->y;
+         v.z = $self->z + other->z;
+         return v;
+    }
+};
+
+
+ +

+Use it like this: +

+ +
+
>>> import example
+>>> v = example.Vector(2,3,4)
+>>> w = example.Vector(10,11,12)
+>>> print v+w
+Vector(12,14,16)
+>>> 
+
+
+ +

+%extend works with both C and C++ code. It does not modify the + underlying object +in any way---the extensions only show up in the Python interface. +

+ +

31.6.4 Exception handling with %exception

+ + +

+If a C or C++ function throws an error, you may want to convert that +error into a Python +exception. To do this, you can use the %exception directive. %exception +simply lets you rewrite part of the generated wrapper code to include an + error check. +

+ +

+In C, a function often indicates an error by returning a status code (a +negative number +or a NULL pointer perhaps). Here is a simple example of how you might +handle that: +

+ +
+
%exception malloc {
+  $action
+  if (!result) {
+     PyErr_SetString(PyExc_MemoryError,"Not enough memory");
+     return NULL;
+  }
+}
+void *malloc(size_t nbytes);
+
+
+ +

+In Python, +

+ +
+
>>> a = example.malloc(2000000000)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in ?
+MemoryError: Not enough memory
+>>>
+
+
+ +

+If a library provides some kind of general error handling framework, you + can also use +that. For example: +

+ +
+
%exception {
+   $action
+   if (err_occurred()) {
+      PyErr_SetString(PyExc_RuntimeError, err_message());
+      return NULL;
+   }
+}
+
+
+ +

+No declaration name is given to %exception, it is applied to +all wrapper functions. +

+ +

+C++ exceptions are also easy to handle. For example, you can write code + like this: +

+ +
+
%exception getitem {
+   try {
+      $action
+   } catch (std::out_of_range &e) {
+      PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
+      return NULL;
+   }
+}
+
+class Base {
+public:
+     Foo *getitem(int index);      // Exception handled added
+     ...
+};
+
+
+ +

+When raising a Python exception from C, use the PyErr_SetString() +function as shown above. The following exception types can be used as +the first argument. +

+ +
+
PyExc_ArithmeticError
+PyExc_AssertionError
+PyExc_AttributeError
+PyExc_EnvironmentError
+PyExc_EOFError
+PyExc_Exception
+PyExc_FloatingPointError
+PyExc_ImportError
+PyExc_IndexError
+PyExc_IOError
+PyExc_KeyError
+PyExc_KeyboardInterrupt
+PyExc_LookupError
+PyExc_MemoryError
+PyExc_NameError
+PyExc_NotImplementedError
+PyExc_OSError
+PyExc_OverflowError
+PyExc_RuntimeError
+PyExc_StandardError
+PyExc_SyntaxError
+PyExc_SystemError
+PyExc_TypeError
+PyExc_UnicodeError
+PyExc_ValueError
+PyExc_ZeroDivisionError
+
+
+ +

+The language-independent exception.i library file can also be +used +to raise exceptions. See the SWIG Library +chapter. +

+ +

31.7 Tips and techniques

+ + +

+Although SWIG is largely automatic, there are certain types of wrapping +problems that +require additional user input. Examples include dealing with output +parameters, +strings, binary data, and arrays. This chapter discusses the common +techniques for +solving these problems. +

+ +

31.7.1 Input and output parameters

+ + +

+A common problem in some C programs is handling parameters passed as +simple pointers. For +example: +

+ +
+
void add(int x, int y, int *result) {
+   *result = x + y;
+}
+
+
+ +

+or perhaps +

+ +
+
int sub(int *x, int *y) {
+   return *x-*y;
+}
+
+
+ +

+The easiest way to handle these situations is to use the typemaps.i + file. For example: +

+ +
+
%module example
+%include "typemaps.i"
+
+void add(int, int, int *OUTPUT);
+int  sub(int *INPUT, int *INPUT);
+
+
+ +

+In Python, this allows you to pass simple values. For example: +

+ +
+
>>> a = add(3,4)
+>>> print a
+7
+>>> b = sub(7,4)
+>>> print b
+3
+>>>
+
+
+ +

+Notice how the INPUT parameters allow integer values to be +passed instead of pointers +and how the OUTPUT parameter creates a return result. +

+ +

+If you don't want to use the names INPUT or OUTPUT, +use the %apply +directive. For example: +

+ +
+
%module example
+%include "typemaps.i"
+
+%apply int *OUTPUT { int *result };
+%apply int *INPUT  { int *x, int *y};
+
+void add(int x, int y, int *result);
+int  sub(int *x, int *y);
+
+
+ +

+If a function mutates one of its parameters like this, +

+ +
+
void negate(int *x) {
+   *x = -(*x);
+}
+
+
+ +

+you can use INOUT like this: +

+ +
+
%include "typemaps.i"
+...
+void negate(int *INOUT);
+
+
+ +

+In Python, a mutated parameter shows up as a return value. For example: +

+ +
+
>>> a = negate(3)
+>>> print a
+-3
+>>>
+
+
+ +

+Note: Since most primitive Python objects are immutable, it is not +possible to +perform in-place modification of a Python object passed as a parameter. +

+ +

+The most common use of these special typemap rules is to handle +functions that +return more than one value. For example, sometimes a function returns a + result +as well as a special error code: +

+ +
+
/* send message, return number of bytes sent, along with success code */
+int send_message(char *text, int len, int *success);
+
+
+ +

+To wrap such a function, simply use the OUTPUT rule above. For +example: +

+ +
+
%module example
+%include "typemaps.i"
+%apply int *OUTPUT { int *success };
+...
+int send_message(char *text, int *success);
+
+
+ +

+When used in Python, the function will return multiple values. +

+ +
+
bytes, success = send_message("Hello World")
+if not success:
+    print "Whoa!"
+else:
+    print "Sent", bytes
+
+
+ +

+Another common use of multiple return values are in query functions. +For example: +

+ +
+
void get_dimensions(Matrix *m, int *rows, int *columns);
+
+
+ +

+To wrap this, you might use the following: +

+ +
+
%module example
+%include "typemaps.i"
+%apply int *OUTPUT { int *rows, int *columns };
+...
+void get_dimensions(Matrix *m, int *rows, *columns);
+
+
+ +

+Now, in Python: +

+ +
+
>>> r,c = get_dimensions(m)
+
+
+ +

+Be aware that the primary purpose of the typemaps.i file is to +support primitive datatypes. +Writing a function like this +

+ +
+
void foo(Bar *OUTPUT);
+
+
+ +

+may not have the intended effect since typemaps.i does not +define an OUTPUT rule for Bar. +

+ +

31.7.2 Simple pointers

+ + +

+If you must work with simple pointers such as int * or double + * and you don't want to use +typemaps.i, consider using the cpointer.i library +file. For example: +

+ +
+
%module example
+%include "cpointer.i"
+
+%inline %{
+extern void add(int x, int y, int *result);
+%}
+
+%pointer_functions(int, intp);
+
+
+ +

+The %pointer_functions(type,name) macro generates five helper +functions that can be used to create, +destroy, copy, assign, and dereference a pointer. In this case, the +functions are as follows: +

+ +
+
int  *new_intp();
+int  *copy_intp(int *x);
+void  delete_intp(int *x);
+void  intp_assign(int *x, int value);
+int   intp_value(int *x);
+
+
+ +

+In Python, you would use the functions like this: +

+ +
+
>>> result = new_intp()
+>>> print result
+_108fea8_p_int
+>>> add(3,4,result)
+>>> print intp_value(result)
+7
+>>>
+
+
+ +

+If you replace %pointer_functions() by %pointer_class(type,name), + the interface is more class-like. +

+ +
+
>>> result = intp()
+>>> add(3,4,result)
+>>> print result.value()
+7
+
+
+ +

+See the SWIG +Library chapter for further details. +

+ +

31.7.3 Unbounded C Arrays

+ + +

+Sometimes a C function expects an array to be passed as a pointer. For +example, +

+ +
+
int sumitems(int *first, int nitems) {
+    int i, sum = 0;
+    for (i = 0; i < nitems; i++) {
+        sum += first[i];
+    }
+    return sum;
+}
+
+
+ +

+To wrap this into Python, you need to pass an array pointer as the first + argument. +A simple way to do this is to use the carrays.i library file. +For example: +

+ +
+
%include "carrays.i"
+%array_class(int, intArray);
+
+
+ +

+The %array_class(type, name) macro creates wrappers for an +unbounded array object that +can be passed around as a simple pointer like int * or double + *. +For instance, you will be able to do this in Python: +

+ +
+
>>> a = intArray(10000000)         # Array of 10-million integers
+>>> for i in xrange(10000):        # Set some values
+...     a[i] = i
+>>> sumitems(a,10000)
+49995000
+>>>
+
+
+ +

+The array "object" created by %array_class() does not +encapsulate pointers inside a special array object. In fact, there is +no bounds checking or safety of any kind (just like in C). Because of +this, the arrays created by this library are extremely low-level +indeed. You can't iterate over them nor can you even query their +length. In fact, any valid memory address can be accessed if you want +(negative indices, indices beyond the end of the array, etc.). +Needless to say, this approach is not going to suit all applications. +On the other hand, this low-level approach is extremely efficient and +well suited for applications in which you need to create buffers, +package binary data, etc. +

+ +

31.7.4 String handling

+ + +

+If a C function has an argument of char *, then a Python string +can be passed as input. For example: +

+ +
+
// C
+void foo(char *s);
+
+
+ +
+
# Python
+>>> foo("Hello")
+
+
+ +

+When a Python string is passed as a parameter, the C function receives a + pointer to the raw +data contained in the string. Since Python strings are immutable, it is + illegal +for your program to change the value. In fact, doing so will probably +crash the Python +interpreter. +

+ +

+If your program modifies the input parameter or uses it to return data, +consider +using the cstring.i library file described in the SWIG Library +chapter. +

+ +

+When functions return a char *, it is assumed to be a +NULL-terminated string. +Data is copied into a new Python string and returned. +

+ +

+If your program needs to work with binary data, you can use a typemap +to expand a Python string into a pointer/length argument pair. As luck + would have it, +just such a typemap is already defined. Just do this: +

+ +
+
%apply (char *STRING, int LENGTH) { (char *data, int size) };
+...
+int parity(char *data, int size, int initial);
+
+
+ +

+Now in Python: +

+ +
+
>>> parity("e\x09ffss\x00\x00\x01\nx", 0)
+
+
+ +

+If you need to return binary data, you might use the +cstring.i library file. The cdata.i library can +also be used to extra binary data from arbitrary pointers. +

+ +

31.7.5 Arrays

+ + +

31.7.6 String arrays

+ + +

31.7.7 STL wrappers

+ + +

31.8 Typemaps

+ + +

+This section describes how you can modify SWIG's default wrapping +behavior +for various C/C++ datatypes using the %typemap directive. +This +is an advanced topic that assumes familiarity with the Python C API as +well +as the material in the "Typemaps" +chapter. +

+ +

+Before proceeding, it should be stressed that typemaps are not a +required +part of using SWIG---the default wrapping behavior is enough in most +cases. +Typemaps are only used if you want to change some aspect of the +primitive +C-Python interface or if you want to elevate your guru status. +

+ +

31.8.1 What is a typemap?

+ + +

+A typemap is nothing more than a code generation rule that is attached +to +a specific C datatype. For example, to convert integers from Python to + C, +you might define a typemap like this: +

+ +
%module example
+
+%typemap(in) int {
+	$1 = (int) PyLong_AsLong($input);
+	printf("Received an integer : %d\n",$1);
+}
+%inline %{
+extern int fact(int n);
+%}
+
+ +

+Typemaps are always associated with some specific aspect of code +generation. +In this case, the "in" method refers to the conversion of input +arguments +to C/C++. The datatype int is the datatype to which the +typemap +will be applied. The supplied C code is used to convert values. In +this +code a number of special variable prefaced by a $ are used. +The +$1 variable is placeholder for a local variable of type int. +The $input variable is the input object of type PyObject *. +

+ +

+When this example is compiled into a Python module, it operates as +follows: +

+ +
>>> from example import *
+>>> fact(6)
+Received an integer : 6
+720
+
+ +

+In this example, the typemap is applied to all occurrences of the int + datatype. +You can refine this by supplying an optional parameter name. For +example: +

+ +
%module example
+
+%typemap(in) int nonnegative {
+	$1 = (int) PyLong_AsLong($input);
+        if ($1 < 0) {
+           PyErr_SetString(PyExc_ValueError,"Expected a nonnegative value.");
+           return NULL;
+        }
+}
+%inline %{
+extern int fact(int nonnegative);
+%}
+
+ +

+In this case, the typemap code is only attached to arguments that +exactly match int nonnegative. +

+ +

+The application of a typemap to specific datatypes and argument names +involves +more than simple text-matching--typemaps are fully integrated into the +SWIG C++ type-system. When you define a typemap for int, that + typemap +applies to int and qualified variations such as const int. + In addition, +the typemap system follows typedef declarations. For example: +

+ +
+
%typemap(in) int n {
+	$1 = (int) PyLong_AsLong($input);
+	printf("n = %d\n",$1);
+}
+%inline %{
+typedef int Integer;
+extern int fact(Integer n);    // Above typemap is applied
+%}
+
+
+ +

+Typemaps can also be defined for groups of consecutive arguments. For +example: +

+ +
+
%typemap(in) (char *str, int len) {
+    $1 = PyString_AsString($input);
+    $2 = PyString_Size($input);
+};
+
+int count(char c, char *str, int len);
+
+
+ +

+When a multi-argument typemap is defined, the arguments are always +handled as a single +Python object. This allows the function to be used like this (notice +how the length +parameter is omitted): +

+ +
+
>>> example.count('e','Hello World')
+1
+>>>
+
+
+ +

31.8.2 Python typemaps

+ + +

+The previous section illustrated an "in" typemap for converting Python +objects to C. +A variety of different typemap methods are defined by the Python module. + For example, +to convert a C integer back into a Python object, you might define an +"out" typemap +like this: +

+ +
+
%typemap(out) int {
+    $result = PyInt_FromLong((long) $1);
+}
+
+
+ +

+A detailed list of available methods can be found in the "Typemaps" +chapter. +

+ +

+However, the best source of typemap information (and examples) is +probably the Python module itself. In fact, all of SWIG's default +type handling is defined by typemaps. You can view these typemaps by +looking at the files in the SWIG library. Just take into account that +in the latest versions of swig (1.3.22+), the library files are not +very pristine clear for the casual reader, as they used to be. The +extensive use of macros and other ugly techniques in the latest +version produce a very powerful and consistent python typemap library, +but at the cost of simplicity and pedagogic value. +

+ +

+To learn how to write a simple or your first typemap, you better take +a look at the SWIG library version 1.3.20 or so. +

+ + +

31.8.3 Typemap variables

+ + +

+Within typemap code, a number of special variables prefaced with a $ + may appear. +A full list of variables can be found in the "Typemaps" +chapter. +This is a list of the most common variables: +

+ +

+$1 +

+ +
+A C local variable corresponding to the actual type specified in the +%typemap directive. For input values, this is a C local +variable +that's supposed to hold an argument value. For output values, this is +the raw result that's supposed to be returned to Python. +
+ +

+$input +

+ +
+ A PyObject * holding a raw Python object with an argument or +variable value. +
+ +

+$result +

+ +
+A PyObject * that holds the result to be returned to Python. +
+ +

+$1_name +

+ +
+The parameter name that was matched. +
+ +

+$1_type +

+ +
+The actual C datatype matched by the typemap. +
+ +

+$1_ltype +

+ +
+An assignable version of the datatype matched by the typemap (a type +that can appear on the left-hand-side of +a C assignment operation). This type is stripped of qualifiers and may +be an altered version of $1_type. +All arguments and local variables in wrapper functions are declared +using this type so that their values can be +properly assigned. +
+ +

+$symname +

+ +
+The Python name of the wrapper function being created. +
+ +

31.8.4 Useful Python Functions

+ + +

+When you write a typemap, you usually have to work directly with Python +objects. +The following functions may prove to be useful. +

+ +

+Python Integer Functions +

+ +
+
PyObject *PyInt_FromLong(long l);
+long      PyInt_AsLong(PyObject *);
+int       PyInt_Check(PyObject *);
+
+
+ +

+Python Floating Point Functions +

+ +
+
PyObject *PyFloat_FromDouble(double);
+double    PyFloat_AsDouble(PyObject *);
+int       PyFloat_Check(PyObject *);
+
+
+ +

+Python String Functions +

+ +
+
PyObject *PyString_FromString(char *);
+PyObject *PyString_FromStringAndSize(char *, lint len);
+int       PyString_Size(PyObject *);
+char     *PyString_AsString(PyObject *);
+int       PyString_Check(PyObject *);
+
+
+ +

+Python List Functions +

+ +
+
PyObject *PyList_New(int size);
+int       PyList_Size(PyObject *list);
+PyObject *PyList_GetItem(PyObject *list, int i);
+int       PyList_SetItem(PyObject *list, int i, PyObject *item);
+int       PyList_Insert(PyObject *list, int i, PyObject *item);
+int       PyList_Append(PyObject *list, PyObject *item);
+PyObject *PyList_GetSlice(PyObject *list, int i, int j);
+int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
+int       PyList_Sort(PyObject *list);
+int       PyList_Reverse(PyObject *list);
+PyObject *PyList_AsTuple(PyObject *list);
+int       PyList_Check(PyObject *);
+
+
+ +

+Python Tuple Functions +

+ +
+
PyObject *PyTuple_New(int size);
+int       PyTuple_Size(PyObject *);
+PyObject *PyTuple_GetItem(PyObject *, int i);
+int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
+PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
+int       PyTuple_Check(PyObject *);
+
+
+ +

+Python Dictionary Functions +

+ +
+
PyObject *PyDict_New();
+int       PyDict_Check(PyObject *);
+int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
+int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
+int       PyDict_DelItem(PyObject *p, PyObject *key);
+int       PyDict_DelItemString(PyObject *p, char *key);
+PyObject* PyDict_Keys(PyObject *p);
+PyObject* PyDict_Values(PyObject *p);
+PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
+PyObject* PyDict_GetItemString(PyObject *p, const char *key);
+int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
+Py_ssize_t PyDict_Size(PyObject *p);
+int       PyDict_Update(PyObject *a, PyObject *b);
+int       PyDict_Merge(PyObject *a, PyObject *b, int override);
+PyObject* PyDict_Items(PyObject *p);
+
+
+ +

+Python File Conversion Functions +

+ +
+
PyObject *PyFile_FromFile(FILE *f);
+FILE     *PyFile_AsFile(PyObject *);
+int       PyFile_Check(PyObject *);
+
+
+ +

+Abstract Object Interface +

+ +
+
write me
+
+
+ +

31.9 Typemap Examples

+ + +

+This section includes a few examples of typemaps. For more examples, +you +might look at the files "python.swg" and "typemaps.i" +in +the SWIG library. +

+ +

31.9.1 Converting Python list to a char +**

+ + +

+A common problem in many C programs is the processing of command line +arguments, which are usually passed in an array of NULL terminated +strings. The following SWIG interface file allows a Python list +object to be used as a char ** object. +

+ +
%module argv
+
+// This tells SWIG to treat char ** as a special case
+%typemap(in) char ** {
+  /* Check if is a list */
+  if (PyList_Check($input)) {
+    int size = PyList_Size($input);
+    int i = 0;
+    $1 = (char **) malloc((size+1)*sizeof(char *));
+    for (i = 0; i < size; i++) {
+      PyObject *o = PyList_GetItem($input,i);
+      if (PyString_Check(o))
+	$1[i] = PyString_AsString(PyList_GetItem($input,i));
+      else {
+	PyErr_SetString(PyExc_TypeError,"list must contain strings");
+	free($1);
+	return NULL;
+      }
+    }
+    $1[i] = 0;
+  } else {
+    PyErr_SetString(PyExc_TypeError,"not a list");
+    return NULL;
+  }
+}
+
+// This cleans up the char ** array we malloc'd before the function call
+%typemap(freearg) char ** {
+  free((char *) $1);
+}
+
+// Now a test function
+%inline %{
+int print_args(char **argv) {
+    int i = 0;
+    while (argv[i]) {
+         printf("argv[%d] = %s\n", i,argv[i]);
+         i++;
+    }
+    return i;
+}
+%}
+
+
+ +

+When this module is compiled, the wrapped C function now operates as +follows : +

+ +
>>> from argv import *
+>>> print_args(["Dave","Mike","Mary","Jane","John"])
+argv[0] = Dave
+argv[1] = Mike
+argv[2] = Mary
+argv[3] = Jane
+argv[4] = John
+5
+
+ +

+In the example, two different typemaps are used. The "in" typemap is +used to receive an input argument and convert it to a C array. Since +dynamic +memory allocation is used to allocate memory for the array, the +"freearg" typemap is used to later release this memory after the +execution of +the C function. +

+ +

31.9.2 Expanding a Python object into +multiple arguments

+ + +

+Suppose that you had a collection of C functions with arguments +such as the following: +

+ +
+
int foo(int argc, char **argv);
+
+
+ +

+In the previous example, a typemap was written to pass a Python list as +the char **argv. This +allows the function to be used from Python as follows: +

+ +
+
>>> foo(4, ["foo","bar","spam","1"])
+
+
+ +

+Although this works, it's a little awkward to specify the argument +count. To fix this, a multi-argument +typemap can be defined. This is not very difficult--you only have to +make slight modifications to the +previous example: +

+ +
+
%typemap(in) (int argc, char **argv) {
+  /* Check if is a list */
+  if (PyList_Check($input)) {
+    int i;
+    $1 = PyList_Size($input);
+    $2 = (char **) malloc(($1+1)*sizeof(char *));
+    for (i = 0; i < $1; i++) {
+      PyObject *o = PyList_GetItem($input,i);
+      if (PyString_Check(o))
+	$2[i] = PyString_AsString(PyList_GetItem($input,i));
+      else {
+	PyErr_SetString(PyExc_TypeError,"list must contain strings");
+	free($2);
+	return NULL;
+      }
+    }
+    $2[i] = 0;
+  } else {
+    PyErr_SetString(PyExc_TypeError,"not a list");
+    return NULL;
+  }
+}
+
+%typemap(freearg) (int argc, char **argv) {
+  free((char *) $2);
+}
+
+
+ +

+When writing a multiple-argument typemap, each of the types is +referenced by a variable such +as $1 or $2. The typemap code simply fills in the +appropriate values from +the supplied Python object. +

+ +

+With the above typemap in place, you will find it no longer necessary +to supply the argument count. This is automatically set by the typemap +code. For example: +

+ +
+
>>> foo(["foo","bar","spam","1"])
+
+
+ +

31.9.3 Using typemaps to return arguments

+ + +

+A common problem in some C programs is that values may be returned in +arguments rather than in the return value of a function. For example: +

+ +
/* Returns a status value and two values in out1 and out2 */
+int spam(double a, double b, double *out1, double *out2) {
+	... Do a bunch of stuff ...
+	*out1 = result1;
+	*out2 = result2;
+	return status;
+};
+
+
+ +

+A typemap can be used to handle this case as follows : +

+ +
%module outarg
+
+// This tells SWIG to treat an double * argument with name 'OutValue' as
+// an output value.  We'll append the value to the current result which 
+// is guaranteed to be a List object by SWIG.
+
+%typemap(argout) double *OutValue {
+    PyObject *o, *o2, *o3;
+    o = PyFloat_FromDouble(*$1);
+    if ((!$result) || ($result == Py_None)) {
+        $result = o;
+    } else {
+        if (!PyTuple_Check($result)) {
+            PyObject *o2 = $result;
+            $result = PyTuple_New(1);
+            PyTuple_SetItem(target,0,o2);
+        }
+        o3 = PyTuple_New(1);
+        PyTuple_SetItem(o3,0,o);
+        o2 = $result;
+        $result = PySequence_Concat(o2,o3);
+        Py_DECREF(o2);
+        Py_DECREF(o3);
+    }
+}
+
+int spam(double a, double b, double *OutValue, double *OutValue);
+
+
+ +

+The typemap works as follows. First, a check is made to see if any +previous result +exists. If so, it is turned into a tuple and the new output value is +concatenated to it. +Otherwise, the result is returned normally. For the sample function spam(), + there +are three output values--meaning that the function will return a 3-tuple + of the results. +

+ +

+As written, the function must accept 4 arguments as input values, +last two being pointers to doubles. If these arguments are only used to + hold output values (and have +no meaningful input value), an additional typemap can be written. For +example: +

+ +
%typemap(in,numinputs=0) double *OutValue(double temp) {
+    $1 = &temp;
+}
+
+
+ +

+By specifying numinputs=0, the input value is ignored. However, since +the argument still has to be set to +some meaningful value before calling C, it is set to point to a local +variable temp. When the function +stores its output value, it will simply be placed in this local +variable. As a result, the +function can now be used as follows: +

+ +
>>> a = spam(4,5)
+>>> print a
+(0, 2.45, 5.0)
+>>> x,y,z = spam(4,5)
+>>>
+
+ +

31.9.4 Mapping Python tuples into small +arrays

+ + +

+In some applications, it is sometimes desirable to pass small arrays +of numbers as arguments. For example : +

+ +
extern void set_direction(double a[4]);       // Set direction vector
+
+ +

+This too, can be handled used typemaps as follows : +

+ +
// Grab a 4 element array as a Python 4-tuple
+%typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
+  int i;
+  if (PyTuple_Check($input)) {
+    if (!PyArg_ParseTuple($input,"dddd",temp,temp+1,temp+2,temp+3)) {
+      PyErr_SetString(PyExc_TypeError,"tuple must have 4 elements");
+      return NULL;
+    }
+    $1 = &temp[0];
+  } else {
+    PyErr_SetString(PyExc_TypeError,"expected a tuple.");
+    return NULL;
+  }
+}
+
+
+ +

+This allows our set_direction function to be called from +Python as follows : +

+ +
>>> set_direction((0.5,0.0,1.0,-0.25))
+
+ +

+Since our mapping copies the contents of a Python tuple into a C +array, such an approach would not be recommended for huge arrays, but +for small structures, this approach works fine. +

+ +

31.9.5 Mapping sequences to C arrays

+ + +

+Suppose that you wanted to generalize the previous example to handle C +arrays of different sizes. To do this, you might write a typemap as +follows: +

+ +
// Map a Python sequence into any sized C double array
+%typemap(in) double[ANY](double temp[$1_dim0]) {
+  int i;
+  if (!PySequence_Check($input)) {
+      PyErr_SetString(PyExc_TypeError,"Expecting a sequence");
+      return NULL;
+  }
+  if (PyObject_Length($input) != $1_dim0) {
+      PyErr_SetString(PyExc_ValueError,"Expecting a sequence with $1_dim0 elements");
+      return NULL;
+  }
+  for (i =0; i < $1_dim0; i++) {
+      PyObject *o = PySequence_GetItem($input,i);
+      if (!PyFloat_Check(o)) {
+         Py_XDECREF(o);
+         PyErr_SetString(PyExc_ValueError,"Expecting a sequence of floats");
+         return NULL;
+      }
+      temp[i] = PyFloat_AsDouble(o);
+      Py_DECREF(o);
+  }
+  $1 = &temp[0];
+}
+
+
+ +

+In this case, the variable $1_dim0 is expanded to match the +array dimensions actually used in the C code. This allows the typemap +to be applied to types such as: +

+ +
+
void foo(double x[10]);
+void bar(double a[4], double b[8]);
+
+
+ +

+Since the above typemap code gets inserted into every wrapper function +where used, it might make sense +to use a helper function instead. This will greatly reduce the amount +of wrapper code. For example: +

+ +
+
%{
+static int convert_darray(PyObject *input, double *ptr, int size) {
+  int i;
+  if (!PySequence_Check(input)) {
+      PyErr_SetString(PyExc_TypeError,"Expecting a sequence");
+      return 0;
+  }
+  if (PyObject_Length(input) != size) {
+      PyErr_SetString(PyExc_ValueError,"Sequence size mismatch");
+      return 0;
+  }
+  for (i =0; i < size; i++) {
+      PyObject *o = PySequence_GetItem(input,i);
+      if (!PyFloat_Check(o)) {
+         Py_XDECREF(o);
+         PyErr_SetString(PyExc_ValueError,"Expecting a sequence of floats");
+         return 0;
+      }
+      ptr[i] = PyFloat_AsDouble(o);
+      Py_DECREF(o);
+  }
+  return 1;
+}
+%}
+
+%typemap(in) double [ANY](double temp[$1_dim0]) {
+   if (!convert_darray($input,temp,$1_dim0))) {
+      return NULL;
+   }
+   $1 = &temp[0];
+}
+
+
+ +

31.9.6 Pointer handling

+ + +

+Occasionally, it might be necessary to convert pointer values that have +been stored using the SWIG typed-pointer representation. Since there +are +several ways in which pointers can be represented, the following two +functions are used to safely perform this conversion: +

+ +

+ +int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int +flags) +

+ +
+Converts a Python object obj to a C pointer. The result of the + conversion is placed +into the pointer located at ptr. ty is a SWIG type +descriptor structure. +flags is used to handle error checking and other aspects of +conversion. It is the +bitwise-or of several flag values including SWIG_POINTER_EXCEPTION + and +SWIG_POINTER_DISOWN. The first flag makes the function raise +an exception on type +error. The second flag additionally +steals ownership of an object. Returns 0 on success and -1 on error. +
+ +

+ +PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own) +

+ +
+Creates a new Python pointer object. ptr is the pointer to +convert, ty is the SWIG type descriptor structure that +describes the type, and own is a flag that indicates whether or + not Python should take ownership of the +pointer. +
+ +

+Both of these functions require the use of a special SWIG +type-descriptor structure. This structure contains information about +the mangled name of the datatype, type-equivalence information, as +well as information about converting pointer values under C++ +inheritance. For a type of Foo *, the type descriptor +structure +is usually accessed as follows: +

+ +
+
Foo *f;
+if (SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, SWIG_POINTER_EXCEPTION) == -1)
+  return NULL;
+
+PyObject *obj;
+obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
+
+
+ +

+In a typemap, the type descriptor should always be accessed using the +special typemap +variable $1_descriptor. For example: +

+ +
+
%typemap(in) Foo * {
+if ((SWIG_ConvertPtr($input,(void **) &$1, $1_descriptor,SWIG_POINTER_EXCEPTION)) == -1)
+  return NULL;
+}
+
+
+ +

+If necessary, the descriptor for any type can be obtained using the $descriptor() + macro in a typemap. +For example: +

+ +
+
%typemap(in) Foo * {
+if ((SWIG_ConvertPtr($input,(void **) &$1, $descriptor(Foo *), 
+                                               SWIG_POINTER_EXCEPTION)) == -1)
+  return NULL;
+}
+
+
+ +

+Although the pointer handling functions are primarily intended for +manipulating low-level pointers, both functions are fully aware of +Python proxy classes. Specifically, +SWIG_ConvertPtr() will retrieve a pointer from any object +that has a this attribute. In addition, +SWIG_NewPointerObj() can automatically generate a proxy +class object (if applicable). +

+ + + +

31.10 Docstring Features

+ + +

+Using docstrings in Python code is becoming more and more important +and more tools are coming on the scene that take advantage of them, +everything from full-blown documentation generators to class browsers +and popup call-tips in Python-aware IDEs. Given the way that SWIG +generates the proxy code by default, your users will normally get +something like "function_name(*args)" in the popup calltip of +their IDE which is next to useless when the real function prototype +might be something like this: +

+ +
+
bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
+
+
+ +

+The features described in this section make it easy for you to add +docstrings to your modules, functions and methods that can then be +used by the various tools out there to make the programming experience +of your users much simpler. +

+ + +

31.10.1 Module docstring

+ + +

+Python allows a docstring at the beginning of the .py file +before any other statements, and it is typically used to give a +general description of the entire module. SWIG supports this by +setting an option of the %module directive. For example: +

+ +
+
%module(docstring="This is the example module's docstring") example
+
+
+ +

+When you have more than just a line or so then you can retain the easy +readability of the %module directive by using a macro. For +example: +

+ +
+
%define DOCSTRING
+"The `XmlResource` class allows program resources defining menus, 
+layout of controls on a panel, etc. to be loaded from an XML file."
+%enddef
+
+%module(docstring=DOCSTRING) xrc
+
+
+ + +

31.10.2 %feature("autodoc")

+ + +

+As alluded to above SWIG will generate all the function and method +proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword +option is used) for a parameter list and will then sort out the +individual parameters in the C wrapper code. This is nice and simple +for the wrapper code, but makes it difficult to be programmer and tool +friendly as anyone looking at the .py file will not be able +to find out anything about the parameters that the functions accept. +

+ +

But since SWIG does know everything about the function it is +possible to generate a docstring containing the parameter types, names +and default values. Since many of the docstring tools are adopting a +standard of recognizing if the first thing in the docstring is a +function prototype then using that instead of what they found from +introspection, then life is good once more. + +

SWIG's Python module provides support for the "autodoc" feature, +which when attached to a node in the parse tree will cause a docstring +to be generated that includes the name of the function, parameter +names, default values if any, and return type if any. There are also +three options for autodoc controlled by the value given to the +feature, described below. + +

31.10.2.1 %feature("autodoc", "0")

+ + +

+When the "0" option is given then the types of the parameters will +not be included in the autodoc string. For example, given +this function prototype: +

+ +
+
%feature("autodoc", "0");
+bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
+
+
+ +

+Then Python code like this will be generated: +

+ +
+
def function_name(*args, **kwargs):
+    """function_name(x, y, foo=None, bar=None) -> bool"""
+    ...
+
+
+ + +

31.10.2.2 %feature("autodoc", "1")

+ + +

+When the "1" option is used then the parameter types will be +used in the autodoc string. In addition, an attempt is made to +simplify the type name such that it makes more sense to the Python +user. Pointer, reference and const info is removed, +%rename's are evaluated, etc. (This is not always +successful, but works most of the time. See the next section for what +to do when it doesn't.) Given the example above, then turning on the +parameter types with the "1" option will result in Python code like +this: +

+ +
+
def function_name(*args, **kwargs):
+    """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
+    ...
+
+
+ + + +

31.10.2.3 %feature("autodoc", "docstring")

+ + +

+Finally, there are times when the automatically generated autodoc +string will make no sense for a Python programmer, particularly when a +typemap is involved. So if you give an explicit value for the autodoc +feature then that string will be used in place of the automatically +generated string. For example: +

+ +
+
%feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
+void GetPosition(int* OUTPUT, int* OUTPUT);
+
+
+ + +

31.10.3 %feature("docstring")

+ + +

+In addition to the autodoc strings described above, you can also +attach any arbitrary descriptive text to a node in the parse tree with +the "docstring" feature. When the proxy module is generated then any +docstring associated with classes, function or methods are output. +If an item already has an autodoc string then it is combined with the +docstring and they are output together. If the docstring is all on a +single line then it is output like this:: +

+ +
+
"""This is the docstring"""
+
+
+ +

+Otherwise, to aid readability it is output like this: +

+ +
+
"""
+This is a multi-line docstring
+with more than one line.
+"""
+
+
+ +

31.11 Python Packages

+ + +

+Using the package option of the %module directive +allows you to specify what Python package that the module will be +living in when installed. +

+ +
+
%module(package="wx") xrc
+
+
+ +

+This is useful when the .i file is %imported by +another .i file. By default SWIG will assume that the +importer is able to find the importee with just the module name, but +if they live in separate Python packages then that won't work. +However if the importee specifies what its package is with the +%module option then the Python code generated for the +importer will use that package name when importing the other module +and also in base class declarations, etc. if the package name is +different than its own. +

+ +

31.12 Python 3 Support

+ + +

+SWIG is able to support Python 3.0. The wrapper code generated by +SWIG can be compiled with both Python 2.x or 3.0. Further more, by +passing the -py3 command line option to SWIG, wrapper code +with some Python 3 specific features can be generated (see below +subsections for details of these features). The -py3 option +also +disables some incompatible features for Python 3, such as +-classic. + +

+There is a list of known-to-be-broken features in Python 3: +

+
    +
  • No more support for FILE* typemaps, because PyFile_AsFile has been + dropped + in Python 3.
  • +
  • The -apply command line option is removed and generating + code using apply() is no longer supported.
  • +
+ +

+The following are Python 3.0 new features that are currently supported +by +SWIG. +

+ +

31.12.1 Function annotation

+ + +

+The -py3 option will enable function annotation support. When +used +SWIG is able to generate proxy method definitions like this: +

+ +
  def foo(self, bar : "int" = 0) -> "void" : ...
+
+ +

+Also, even if without passing SWIG the -py3 option, the +parameter list +still could be generated: +

+ +
  def foo(self, bar = 0): ...
+
+ +

+But for overloaded function or method, the parameter list would fallback + to +*args or self, *args, and **kwargs may be +append +depend on whether you enabled the keyword argument. This fallback is due + to +all overloaded functions share the same function in SWIG generated proxy + class. +

+ +

+For detailed usage of function annotation, see PEP 3107. +

+ +

31.12.2 Buffer interface

+ + +

+Buffer protocols were revised in Python 3. SWIG also gains a series of +new typemaps to support buffer interfaces. These typemap macros are +defined in pybuffer.i, which must be included in order to use +them. +By using these typemaps, your wrapped function will be able to +accept any Python object that exposes a suitable buffer interface. +

+ +

+For example, the get_path() function puts the path string +into the memory pointed to by its argument: +

+ +
void get_path(char *s);
+
+ +

+Then you can write a typemap like this: (the following example is +applied to both Python 3.0 and 2.6, since the bytearray type +is backported to 2.6. +

+ + +
%include <pybuffer.i>
+%pybuffer_mutable_string(char *str);
+void get_path(char *s);
+
+ +

+And then on the Python side the wrapped get_path could be used +in this +way: +

+ +
>>> p = bytearray(10)
+>>> get_path(p)
+>>> print(p)
+bytearray(b'/Foo/Bar/\x00')
+
+ +

+The macros defined in pybuffer.i are similar to those in +cstring.i: +

+ +

+%pybuffer_mutable_binary(parm, size_parm) +

+ +
+ +

+The macro can be used to generate a typemap which maps a buffer of an +object to a pointer provided by parm and a size argument +provided by size_parm. For example: +

+ +
%pybuffer_mutable_binary(char *str, size_t size);
+...
+int snprintf(char *str, size_t size, const char *format, ...);
+
+ +

+In Python: +

+ +
>>> buf = bytearray(6)
+>>> snprintf(buf, "Hello world!")
+>>> print(buf)
+bytearray(b'Hello\x00')
+>>> 
+
+ +
+ +

+%pybuffer_mutable_string(parm) +

+ +
+ +

+This typemap macro requires the buffer to be a zero terminated string, +and maps the pointer of the buffer to parm. For example: +

+ +
%pybuffer_mutable_string(char *str);
+...
+size_t make_upper(char *str);
+
+ +

+In Python: +

+ +
>>> buf = bytearray(b'foo\x00')
+>>> make_upper(buf)
+>>> print(buf)
+bytearray(b'FOO\x00')
+>>>
+
+ +

+Both %pybuffer_mutable_binary and %pybuffer_mutable_string +require the provided buffer to be mutable, eg. they can accept a +bytearray type but can't accept an immutable byte +type. +

+ +
+ +

+%pybuffer_binary(parm, size_parm) +

+ +
+ +

+This macro maps an object's buffer to a pointer parm and a +size size_parm. It is similar to +%pybuffer_mutable_binary, except the +%pybuffer_binary an accept both mutable and immutable +buffers. As a result, the wrapped function should not modify the buffer. +

+ +
+ +

+%pybuffer_string(parm) +

+ +
+ +

+This macro maps an object's buffer as a string pointer parm. +It is similar to %pybuffer_mutable_string but the buffer +could be both mutable and immutable. And your function should not +modify the buffer. +

+ +
+ + +

31.12.3 Abstract base classes

+ + +

+By including pyabc.i and using the -py3 command +line option when calling SWIG, the proxy classes of the STL containers +will automatically gain an appropriate abstract base class. For +example, the following SWIG interface: +

+ +
%include <pyabc.i>
+%include <std_map.i>
+%include <std_list.i>
+
+namespace std {
+  %template(Mapii) map<int, int>;
+  %template(IntList) list<int>;
+}
+
+ +

+will generate a Python proxy class Mapii inheriting from +collections.MutableMap and a proxy class IntList +inheriting from collections.MutableSequence. +

+ +

+pyabc.i also provides a macro %pythonabc that could be +used to define an abstract base class for your own C++ class: +

+ +
%pythonabc(MySet, collections.MutableSet);
+
+ +

+For details of abstract base class, please see PEP 3119. +

+ + + + + + \ No newline at end of file diff --git a/Web/Docs/SWIG/Python_files/style.css b/Web/Docs/SWIG/Python_files/style.css new file mode 100644 index 00000000..02329e56 --- /dev/null +++ b/Web/Docs/SWIG/Python_files/style.css @@ -0,0 +1,84 @@ +div.sectiontoc { + border-style: dotted; + border-width: 2px; + padding: 2pt; +} + +h2 { + padding: 3px; + color: #000000; + border-bottom: 2px + solid #dddddd; +} + +h3, h4 { + margin-left: 1em; +} + +p,li,table,dl { + margin-left: 2em; + margin-right: 2em; +} + +div.indent { + margin-left: 4em; + margin-right: 4em; +} + +div.code { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #F0FFFF; +} + +div.targetlang { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #d7f6bb; +} + + +div.shell { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #DCDCDC; +} + +div.diagram { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #FFEBCD; +} + +ul li p { + margin-left: 0; + margin-right: 0; +} + +ol li p { + margin-left: 0; + margin-right: 0; +} + +dl dd p { + margin-left: 0; + margin-right: 0; +} + +div.indent p { + margin-left: 0; + margin-right: 0; +} + diff --git a/Web/Docs/SWIG/Windows.html b/Web/Docs/SWIG/Windows.html new file mode 100644 index 00000000..3a249701 --- /dev/null +++ b/Web/Docs/SWIG/Windows.html @@ -0,0 +1,465 @@ + + + + + +Getting started on Windows + + +

3 Getting started on Windows

+ + + + + + +

+This chapter describes SWIG usage on Microsoft Windows. +Installing SWIG and running the examples is covered as well as building +the SWIG executable. +Usage within the Unix like environments MinGW and Cygwin is also +detailed. +

+ + +

3.1 Installation on Windows

+ + +

+SWIG does not come with the usual Windows type installation program, +however it is quite easy to get started. The main steps are: +

+
    +
  • Download the swigwin zip package from the SWIG website and unzip into a directory. + This is all that needs downloading for the Windows platform. +
  • Set environment variables as described in the SWIG Windows Examples section in order to +run examples using Visual C++. +
+ +

3.1.1 Windows Executable

+ + +

+The swigwin distribution contains the SWIG Windows executable, swig.exe, + which will run on 32 bit versions of Windows, ie Windows +95/98/ME/NT/2000/XP. +If you want to build your own swig.exe have a look at Building swig.exe on Windows. +

+ + +

3.2 SWIG Windows Examples

+ + +

+Using Microsoft Visual C++ is the most common approach to compiling and +linking SWIG's output. +The Examples directory has a few Visual C++ project files (.dsp files). +These were produced by Visual C++ 6, although they should also work in +Visual C++ 5. +Later versions of Visual Studio should also be able to open and convert +these project files. +The C# examples come with .NET 2003 solution (.sln) and project files +instead of Visual C++ 6 project files. +The project files have been set up to execute SWIG in a custom build +rule for the SWIG interface (.i) file. +Alternatively run the examples using +Cygwin. + +

+More information on each of the examples is available with the examples +distributed with SWIG (Examples/index.html). + +

3.2.1 Instructions for using + the Examples with Visual Studio

+ + +

+Ensure the SWIG executable is as supplied in the SWIG root directory in +order for the examples to work. +Most languages require some environment variables to be set before + running Visual C++. +Note that Visual C++ must be re-started to pick up any changes in +environment variables. +Open up an example .dsp file, Visual C++ will create a workspace for you + (.dsw file). +Ensure the Release build is selected then do a Rebuild All from the +Build menu. +The required environment variables are displayed with their current +values. +

+

+The list of required environment variables for each module language is +also listed below. +They are usually set from the Control Panel and System properties, but +this depends on which flavour of Windows you are running. +If you don't want to use environment variables then change all +occurrences of the environment variables in the .dsp files with hard +coded values. +If you are interested in how the project files are set up there is +explanatory information in some of the language module's documentation. +

+ +

3.2.1.1 C#

+ + +

+The C# examples do not require any environment variables to be set as a +C# project file is included. +Just open up the .sln solution file in Visual Studio .NET 2003 or later, + select Release Build, and do a Rebuild All from the Build menu. +The accompanying C# and C++ project files are automatically used by the +solution file. +

+ + +

3.2.1.2 Java

+ + +

+JAVA_INCLUDE : Set this to the directory containing +jni.h
+JAVA_BIN : Set this to the bin directory containing +javac.exe

+Example using JDK1.3:
+ +JAVA_INCLUDE: D:\jdk1.3\include
+JAVA_BIN: D:\jdk1.3\bin
+
+

+ + +

3.2.1.3 Perl

+ + +

+PERL5_INCLUDE : Set this to the directory containing +perl.h
+PERL5_LIB : Set this to the Perl library including path +for linking

+Example using nsPerl 5.004_04:

+ +PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
+PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib
+
+

+ + +

3.2.1.4 Python

+ + +

+PYTHON_INCLUDE : Set this to the directory that contains + python.h
+PYTHON_LIB : Set this to the python library including +path for linking

+Example using Python 2.1.1:
+ +PYTHON_INCLUDE: D:\python21\include
+PYTHON_LIB: D:\python21\libs\python21.lib
+
+

+ + +

3.2.1.5 TCL

+ + +

+TCL_INCLUDE : Set this to the directory containing tcl.h
+TCL_LIB : Set this to the TCL library including path for + linking

+Example using ActiveTcl 8.3.3.3
+ +TCL_INCLUDE: D:\tcl\include
+TCL_LIB: D:\tcl\lib\tcl83.lib
+
+

+ + +

3.2.1.6 R

+ + +

+R_INCLUDE : Set this to the directory containing R.h
+R_LIB : Set this to the R library (Rdll.lib) including +path for linking. The library needs to be built as described in the R +README.packages file (the pexports.exe approach is the easiest).

+Example using R 2.5.1:
+ +R_INCLUDE: C:\Program Files\R\R-2.5.1\include
+R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib
+
+

+ + +

3.2.1.7 Ruby

+ + +

+RUBY_INCLUDE : Set this to the directory containing +ruby.h
+RUBY_LIB : Set this to the ruby library including path +for linking

+Example using Ruby 1.6.4:
+ +RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
+RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib
+
+

+ + +

3.2.2 Instructions for using +the Examples with other compilers

+ + +

+If you do not have access to Visual C++ you will have to set up project +files / Makefiles for your chosen compiler. There is a section in each +of the language modules detailing what needs setting up using Visual C++ + which may be of some guidance. Alternatively you may want to use Cygwin + as described in the following section. +

+ +

3.3 SWIG on Cygwin and MinGW

+ + +

+SWIG can also be compiled and run using Cygwin + or MinGW which provides a Unix like + front end to Windows and comes free with gcc, an ANSI C/C++ compiler. +However, this is not a recommended approach as the prebuilt executable +is supplied. +

+ +

3.3.1 Building swig.exe on Windows

+ + +

+If you want to replicate the build of swig.exe that comes with the +download, follow the MinGW instructions below. +This is not necessary to use the supplied swig.exe. +This information is provided for those that want to modify the SWIG +source code in a Windows environment. +Normally this is not needed, so most people will want to ignore this +section. +

+ +

3.3.1.1 Building swig.exe using +MinGW and MSYS

+ + +

+The short abbreviated instructions follow... +

+ +
    +
  • Install MinGW and MSYS from the MinGW + site. This provides a Unix environment on Windows. +
  • Follow the usual Unix instructions in the README file in +the SWIG root directory to build swig.exe from the MinGW command prompt. +
+ +

+The step by step instructions to download and install MinGW and MSYS, +then download and build the latest version of SWIG from SVN follow... +Note that the instructions for obtaining SWIG from SVN are also online +at SWIG SVN. +

+ +

+Pitfall note: +Execute the steps in the order shown and don't use spaces in path names. + In fact it is best to use the default installation directories. +

+ +
    +
  1. + Download the following packages from the MinGW download page + or MinGW +SourceForge download page. + Note that at the time of writing, the majority of these are in the +Current + release list and some are in the Snapshot or Previous release list. +
      +
    • MinGW-3.1.0-1.exe
    • +
    • MSYS-1.0.11-2004.04.30-1.exe
    • +
    • msysDTK-1.0.1.exe
    • +
    • bison-2.0-MSYS.tar.gz
    • +
    • msys-autoconf-2.59.tar.bz2
    • +
    • msys-automake-1.8.2.tar.bz2
    • +
    +
  2. + +
  3. + Install MinGW-3.1.0-1.exe (C:\MinGW is default location.) +
  4. + +
  5. + Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the +same + windows drive letter as MinGW (C:\msys\1.0 is default). + In the post install script, +
      +
    • Answer y to the "do you wish to continue with the post install?"
    • +
    • Answer y to the "do you have MinGW installed?"
    • +
    • Type in the the folder in which you installed MinGW (C:/MinGW is + default)
    • +
    +
  6. + +
  7. + Install msysDTK-1.0.1.exe to the same folder that you installed MSYS +(C:\msys\1.0 is default). +
  8. + +
  9. + Copy the following to the MSYS install folder (C:\msys\1.0 is +default): +
      +
    • msys-automake-1.8.2.tar.bz2
    • +
    • msys-autoconf-2.59.tar.bz2
    • +
    • bison-2.0-MSYS.tar.gz
    • +
    +
  10. + +
  11. + Start the MSYS command prompt and execute: +
    cd /
    +tar -jxf msys-automake-1.8.2.tar.bz2 
    +tar -jxf msys-autoconf-2.59.tar.bz2
    +tar -zxf bison-2.0-MSYS.tar.gz   
    +
    +
  12. + +
  13. + To get the latest SWIG SVN (version from Subversion source control), +type in the following: +
    mkdir /usr/src
    +cd /usr/src
    +svn co https://swig.svn.sourceforge.net/svnroot/swig/trunk swig
    +
    + + Pitfall note: +If you want to check out SWIG to a different folder to the proposed +/usr/src/swig, do not use MSYS emulated windows drive letters, because +the autotools will fail miserably on those. +
  14. + +
  15. + You are now ready to build SWIG. Execute the following commands to +build swig.exe: +
    cd /usr/src/swig
    +./autogen.sh
    +./configure
    +make
    +
    +
  16. +
+ + +

3.3.1.2 Building swig.exe using Cygwin

+ + +

+Note that SWIG can also be built using Cygwin. +However, SWIG will then require the Cygwin DLL when executing. +Follow the Unix instructions in the README file in the SWIG root +directory. +Note that the Cygwin environment will also allow one to regenerate the +autotool generated files which are supplied with the release +distribution. +These files are generated using the autogen.sh script and will +only need regenerating in circumstances such as changing the build +system. +

+ +

3.3.1.3 Building +swig.exe alternatives

+ + +

+If you don't want to install Cygwin or MinGW, use a different compiler +to build +SWIG. For example, all the source code files can be added to a Visual +C++ project +file in order to build swig.exe from the Visual C++ IDE. +

+ + +

3.3.2 Running the examples on +Windows using Cygwin

+ + +

+The examples and test-suite work as successfully on Cygwin as on any +other Unix operating system. +The modules which are known to work are Python, Tcl, Perl, Ruby, Java +and C#. +Follow the Unix instructions in the README file in the SWIG root +directory to build the examples. +

+ +

3.4 Microsoft extensions and +other Windows quirks

+ + +

+A common problem when using SWIG on Windows are the Microsoft function +calling conventions which are not in the C++ standard. +SWIG parses ISO C/C++ so cannot deal with proprietary conventions such +as __declspec(dllimport), __stdcall etc. +There is a Windows interface file, windows.i, to deal with +these calling conventions though. +The file also contains typemaps for handling commonly used Windows +specific types such as __int64, BOOL, DWORD +etc. +Include it like you would any other interface file, for example: +

+ +
%include <windows.i>
+
+__declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
+
+ + + \ No newline at end of file diff --git a/Web/Docs/SWIG/Windows_files/style.css b/Web/Docs/SWIG/Windows_files/style.css new file mode 100644 index 00000000..02329e56 --- /dev/null +++ b/Web/Docs/SWIG/Windows_files/style.css @@ -0,0 +1,84 @@ +div.sectiontoc { + border-style: dotted; + border-width: 2px; + padding: 2pt; +} + +h2 { + padding: 3px; + color: #000000; + border-bottom: 2px + solid #dddddd; +} + +h3, h4 { + margin-left: 1em; +} + +p,li,table,dl { + margin-left: 2em; + margin-right: 2em; +} + +div.indent { + margin-left: 4em; + margin-right: 4em; +} + +div.code { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #F0FFFF; +} + +div.targetlang { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #d7f6bb; +} + + +div.shell { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #DCDCDC; +} + +div.diagram { + border-style: solid; + border-width: 1px; + padding: 2pt; + margin-left: 4em; + margin-right: 4em; + background-color: #FFEBCD; +} + +ul li p { + margin-left: 0; + margin-right: 0; +} + +ol li p { + margin-left: 0; + margin-right: 0; +} + +dl dd p { + margin-left: 0; + margin-right: 0; +} + +div.indent p { + margin-left: 0; + margin-right: 0; +} + diff --git a/Web/Docs/SecFluidparser.py b/Web/Docs/SecFluidparser.py new file mode 100644 index 00000000..4f0bad9d --- /dev/null +++ b/Web/Docs/SecFluidparser.py @@ -0,0 +1,139 @@ +import pylab +import numpy as np +import scipy.stats + +class FluidClass(object): + pass + +def is_float(a): + try: + a = float(a) + return True + except ValueError: + return False + +def parse_Melinder_nonaqueous(): + + lines = open('Melinder coefficients.csv').readlines() + + #find #Fluid# dividers + dividers = [i for i in range(len(lines)) if lines[i].find('#Fluid#') > -1] + dividers.append(len(lines)) + Fluids = [] + for i in range(len(dividers)-1): + Fluid = FluidClass() + L = dividers[i] + R = dividers[i+1] + + l = lines[L:R] + l.pop(0) # #Fluid# remove + Fluid.name, Fluid.longname = l.pop(0).split(',')[0].split('::') + Fluid.description = l.pop(0).split(',')[0] + l.pop(0) #empty line + l.pop(0) #header + l.pop(0) #units + + Fluid.t,Fluid.rho,Fluid.cp,Fluid.k,Fluid.mu = [],[],[],[],[] + for line in l: + ls = line.split(',') + if is_float(ls[0]): + tf,t,rho,cp,k,mu = [float(thing) for thing in line.split(',')] + else: + if not is_float(ls[1]): + break + t,rho,cp,k,mu = [float(thing) for thing in line.split(',')[1::]] + Fluid.t.append(t) + Fluid.rho.append(rho) + Fluid.cp.append(cp) + Fluid.k.append(k) + Fluid.mu.append(mu) + pylab.plot(Fluid.t, Fluid.rho) + + Fluid.t = np.array(Fluid.t) + Fluid.rho = np.array(Fluid.rho) + Fluid.k = np.array(Fluid.k) + Fluid.mu = np.array(Fluid.mu) + Fluid.cp = np.array(Fluid.cp) + + Fluids.append(Fluid) + + pylab.close() + + + + #Create the classes + for Fluid in Fluids: + Fluid.ClassName = Fluid.name.strip()+"LiquidClass" + #String for density + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Fluid.t+273.15,Fluid.rho) + Fluid.rhostr = "{slope:g}*T_K+{intercept:g}".format(slope = slope, intercept = intercept) + #String for conductivity + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Fluid.t+273.15,Fluid.k) + Fluid.condstr = "{slope:g}*T_K+{intercept:g}".format(slope = slope/1000, intercept = intercept/1000) + #String for specific heat + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Fluid.t+273.15,Fluid.cp) + Fluid.cpstr = "{slope:g}*T_K+{intercept:g}".format(slope = slope/1000, intercept = intercept/1000) + #String for internal energy + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Fluid.t+273.15,Fluid.cp) + Fluid.ustr = "{slope:g}*(T_K*T_K-298*298)/2.0+{intercept:g}*(T_K-298)".format(slope = slope/1000, intercept = intercept/1000) + #String for entropy + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Fluid.t+273.15,Fluid.cp) + Fluid.sstr = "{slope:g}*(T_K-298)/2.0+{intercept:g}*log(T_K/298)".format(slope = slope/1000, intercept = intercept/1000) + #String for viscosity + n = np.polyfit(Fluid.t+273.15,np.log(np.array(Fluid.mu)/1000),2) + Fluid.viscstr = "exp({n0:g}*T_K*T_K+{n1:g}*T_K+{n2:g})".format(n0 = n[0], n1 = n[1], n2 = n[2]) + + Fluid.description = Fluid.description.lstrip('"') + import textwrap + print textwrap.dedent( + """ + class {ClassName:s} : public IncompressibleLiquid{{ + + public: + + // Constructor + {ClassName:s}(){{ + name = std::string("{name:s}"); + description = std::string("{description:s}"); + reference = std::string("{reference:s}"); + }}; + + ///< Destructor. No implementation + ~{ClassName:s}(){{}}; + + double rho(double T_K){{ + return {rhostr:s}; + }} + double cp(double T_K){{ + return {cpstr:s}; + }} + double u(double T_K){{ + return {ustr:s}; + }} + double s(double T_K){{ + return {sstr:s}; + }} + double visc(double T_K){{ + return {viscstr:s}; + }} + double cond(double T_K){{ + return {condstr:s}; + }} + }}; + """.format(ClassName = Fluid.ClassName, + rhostr = Fluid.rhostr, + cpstr = Fluid.cpstr, + ustr = Fluid.ustr, + viscstr = Fluid.viscstr, + sstr = Fluid.sstr, + condstr = Fluid.condstr, + name = Fluid.name.strip(), + description = Fluid.longname.strip(), + reference = Fluid.description+ ' - from Ake Melinder, 2010, \\"Properties of Secondary Working Fluids for Indirect Systems\\", IIR') + ) + +parse_Melinder_nonaqueous() + +#for i in range(len(lines)): +# if lines[i].strip() == '#Fluid#': +# print lines[i],lines[i+1],lines[i+2] \ No newline at end of file diff --git a/Web/Docs/SurfaceTensionCorrelations.xlsx b/Web/Docs/SurfaceTensionCorrelations.xlsx new file mode 100644 index 00000000..c635be73 Binary files /dev/null and b/Web/Docs/SurfaceTensionCorrelations.xlsx differ diff --git a/Web/Docs/Water Viscosity REFPROP problem.xlsx b/Web/Docs/Water Viscosity REFPROP problem.xlsx new file mode 100644 index 00000000..5d16ee2e Binary files /dev/null and b/Web/Docs/Water Viscosity REFPROP problem.xlsx differ diff --git a/Web/Docs/Water WagnerPrussCoefficients.xlsx b/Web/Docs/Water WagnerPrussCoefficients.xlsx new file mode 100644 index 00000000..a8c3c122 Binary files /dev/null and b/Web/Docs/Water WagnerPrussCoefficients.xlsx differ diff --git a/Web/EOS.rst b/Web/EOS.rst new file mode 100644 index 00000000..ca1fa9e6 --- /dev/null +++ b/Web/EOS.rst @@ -0,0 +1,550 @@ +.. _Fluid-Properties: + +Fluid Properties +================ + +.. _Props_Sample: + +Sample Code +----------- + +.. ipython:: + + In [1]: import CoolProp as CP + + In [1]: print CP.__version__ + + In [1]: print CP.__gitrevision__ + + #Import the things you need + In [1]: from CoolProp.CoolProp import Props + + In [1]: import timeit + + #Specific heat (kJ/kg/K) of 20% ethylene glycol as a function of T + In [2]: Props('C','T',298.15,'P',101.325,'EG-20%') + + #Density of Air at standard atmosphere in kg/m^3 + In [2]: Props('D','T',298.15,'P',101.325,'Air') + + #Saturation temperature of Water at 1 atm + In [2]: Props('T','P',101.325,'Q',0,'Water') + + #Saturated vapor density of R134a at 0C + In [2]: Props('H','T',273.15,'Q',1,'R134a') + + #Using properties from REFPROP to get R410A density + In [2]: Props('D','T',300,'P',100,'REFPROP-MIX:R32[0.697615]&R125[0.302385]') + + #Check that the same as using pseudo-pure + In [2]: Props('D','T',300,'P',100,'R410A') + +The documentation of the :mod:`CoolProp.CoolProp` module, or the :mod:`CoolProp.State` module are also available. + +Introduction +------------ + +Nearly all the fluids modeling in CoolProp are based on Helmholtz energy formulations. This is a convenient construction of the equation of state because all the thermodynamic properties of interest can be obtained directly from partial derivatives of the Helmholtz energy. + +It should be noted that the EOS are typically valid over the entire range of the fluid, from subcooled liquid to superheated vapor, to supercritical fluid. + +Annoyingly, different authors have selected different sets of nomenclature for the Helmholtz energy. For consistency, the nomenclature of Lemmon will be used here. Also, some authors present results on a mole-basis or mass-basis, further complicating comparisons. + +Thermodynamic properties of Fluid +--------------------------------- +In general, the EOS are based on non-dimensional terms :math:`\delta` and :math:`\tau`, where these terms are defined by + +.. math:: + + \delta=\rho/\rho_c + + \tau=T_c/T + +where :math:`\rho_c` and :math:`T_c` are the critical density of the fluid if it is a pure fluid. For pseudo-pure mixtures, the critical point is typically not used as the reducing state point, and often the maximum condensing temperature on the saturation curve is used instead. + +The non-dimensional Helmholtz energy of the fluid is given by + +.. math:: + + \alpha=\alpha^0+\alpha^r + +where :math:`\alpha^0` is the ideal-gas contribution to the Helmholtz energy, and :math:`\alpha^r` is the residual Helmholtz energy contribution which accounts for non-ideal behavior. For a given set of :math:`\delta` and :math:`\tau`, each of the terms :math:`\alpha^0` and :math:`\alpha^r` are known. The exact form of the Helmholtz energy terms is fluid dependent, but a relatively simple example is that of Nitrogen, which has the ideal-gas Helmholtz energy of + +.. math:: + + \alpha^0=\ln\delta+a_1\ln\tau+a_2+a_3\tau+a_4\tau^{-1}+a_5\tau^{-2}+a_6\tau^{-3}+a_7\ln[1-\exp(-a_8\tau)] + +and the non-dimensional residual Helmholtz energy of + +.. math:: + + \alpha^r=\sum_{k=1}^{6}{N_k\delta^{i_k}\tau^{j_k}}+\sum_{k=7}^{32}{N_k\delta^{i_k}\tau^{j_k}\exp(-\delta^{l_k})}+\sum_{k=33}^{36}{N_k\delta^{i_k}\tau^{j_k}\exp(-\phi_k(\delta-1)^2-\beta_k(\tau-\gamma_k)^2)} + +and all the terms other than :math:`\delta` and :math:`\tau` are fluid-dependent correlation parameters. + +The other thermodynamic parameters can then be obtained through analytic derivatives of the Helmholtz energy terms. For instance, the pressure is given by + +.. math:: + + p=\rho RT\left[1+\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau} \right] + +and the specific internal energy by + +.. math:: + + \frac{u}{RT}=\tau \left[\left(\frac{\partial \alpha^0}{\partial \tau}\right)_{\delta}+ \left(\frac{\partial \alpha^r}{\partial \tau}\right)_{\delta} \right] + +and the specific enthalpy by + +.. math:: + + \frac{h}{RT}=\tau \left[\left(\frac{\partial \alpha^0}{\partial \tau}\right)_{\delta}+ \left(\frac{\partial \alpha^r}{\partial \tau}\right)_{\delta} \right] +\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}+1 + +which can also be written as + +.. math:: + + \frac{h}{RT}=\frac{u}{RT}+\frac{p}{\rho RT} + +The specific entropy is given by + +.. math:: + + \frac{s}{R}=\tau \left[\left(\frac{\partial \alpha^0}{\partial \tau}\right)_{\delta}+ \left(\frac{\partial \alpha^r}{\partial \tau}\right)_{\delta} \right]-\alpha^0-\alpha^r + +and the specific heats at constant volume and constant pressure respectively are given by + +.. math:: + + \frac{c_v}{R}=-\tau^2 \left[\left(\frac{\partial^2 \alpha^0}{\partial \tau^2}\right)_{\delta}+ \left(\frac{\partial^2 \alpha^r}{\partial \tau^2}\right)_{\delta} \right] + + \frac{c_p}{R}=\frac{c_v}{R}+\dfrac{\left[1+\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}-\delta\tau\left(\frac{\partial^2 \alpha^r}{\partial \delta\partial\tau}\right)\right]^2}{\left[1+2\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}+\delta^2\left(\frac{\partial^2 \alpha^r}{\partial \delta^2}\right)_{\tau}\right]} + +The EOS is set up with temperature and density as the two independent properties, but often other inputs are known, most often temperature and pressure because they can be directly measured. As a result, if the density is desired for a known temperature and pressure, it can be obtained iteratively. The following algorithm is used to obtain a reasonable guess for the initial value for the iterative solver: + +#. If the fluid is superheated, use a guess of ideal gas (:math:`\rho=p/(RT)`) +#. If the fluid is subcooled, use a guess of saturated liquid density +#. If the fluid is supercritical, use a guess of ideal gas (:math:`\rho=p/(RT)`) +#. No solution for density as a function of temperature and pressure if the fluid is two-phase + +Saturation State +---------------- + +If the fluid is somewhere in the two-phase region, or saturation state properties are desired, saturated liquid and vapor properties can be obtained. At equilibrium, the Gibbs function of the liquid and vapor are equal, as are the pressures of the saturated liquid and vapor. For nearly all pure fluids, ancillary equations for the density of saturated liquid and saturated vapor as a function of temperature are provided, given by :math:`\rho'` and :math:`\rho''` respectively. Thus for pure fluids, for a given temperature, initial guesses for the densities of saturated liquid and vapor are given by +:math:`\rho'` and :math:`\rho''`. Using one of the densities, a guess for the saturation pressure can be obtained. Then, the saturation pressure is iteratively altered using a numerical method. For each saturation pressure, the saturated liquid and vapor densities are updated using the full EOS to match the imposed temperature and guessed pressure. Because the density is known explicitly from the EOS, Newton's method can be used to update the densities. For Newton's method, the derivative :math:`\partial \rho/\partial p` is needed, which can be given explicitly as + +.. math:: + + \frac{\partial p}{\partial \rho}=RT\left[1+2\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}+\delta^2\left(\frac{\partial^2 \alpha^r}{\partial \delta^2}\right)_{\tau}\right] + +and the value for :math:`\rho` is updated by employing + +.. math:: + + \rho_{new}=\rho_{old}-\frac{p(T,\rho_{old})-p_{guess}}{\frac{\partial p}{\partial \rho}(T,\rho_{old})} + +until :math:`\left|p(T,\rho_{old})-p_{guess}\right|` is sufficiently small. Then the numerical method calculates the Gibbs function for saturated liquid and saturated vapor, and uses the difference in Gibbs functions to update the guess for the saturation pressure. Then the densities are calculated again. At convergence, the set of :math:`\rho'`, :math:`\rho''`, and :math:`p_{sat}` are known for a given saturation temperature. If the fluid is not a pure fluid, the best that you can do is to use the ancillary equations to calculate the saturation densities and saturation pressure. + +As you might imagine, doing all this work to calculate the saturation state for pure fluids is computationally *very* expensive, so a lookup table method has been implemented for the saturation densities and saturation pressure. From Python, you can turn on the saturation lookup table with:: + + UseSaturationLUT(True) + +or use the full EOS by calling:: + + UseSaturationLUT(False) + +Properties as a function of h,p +------------------------------- + +As a reminder, the EOS is typically set up as a function of :math:`\tau=T_c/T` and :math:`\delta=\rho/\rho_c`. Thus, if you know pressure and enthalpy, you can set up a system of residuals in terms of :math:`\delta` and :math:`\tau` in order to yield back the given pressure and enthalpy. Of course you still need a good guess value to start from. See below for that. The system of equations can be given by: + +.. math:: + + f_1=\frac{\delta}{\tau}\left(1+\delta\frac{\partial \alpha^r}{\partial \delta} \right)-\frac{p_0}{\rho_cRT_c} + +.. math:: + + f_2=\left(1+\delta\frac{\partial \alpha^r}{\partial \delta} \right)+\tau \left( \frac{\partial \alpha ^0}{\partial \tau} + \frac{\partial \alpha^r}{\partial \tau} \right)-\tau\frac{h_0}{RT_c} + +where the partials can be given by + +.. math:: + + \frac{\partial f_1}{\partial \tau}=\left(1+\delta\frac{\partial \alpha^r}{\partial \delta} \right)(\frac{-\delta}{\tau^2})+\frac{\delta}{\tau}\left(\delta\frac{\partial^2 \alpha^r}{\partial \delta \partial\tau} \right) + +.. math:: + + \frac{\partial f_1}{\partial \delta}=\left(1+\delta\frac{\partial \alpha^r}{\partial \delta} \right)(\frac{1}{\tau})+\frac{\delta}{\tau}\left(\frac{\partial \alpha^r}{\partial \delta}+\delta\frac{\partial^2 \alpha^r}{\partial \delta^2} \right)=\left(\frac{1}{\tau}\right)\left(1+2\delta\frac{\partial \alpha^r}{\partial \delta} +\delta^2\frac{\partial^2 \alpha^r}{\partial \delta^2} \right) + +.. math:: + + \frac{\partial f_2}{\partial \tau}=\left(\delta\frac{\partial^2 \alpha^r}{\partial \delta \partial\tau} \right)+\left( \frac{\partial \alpha ^0}{\partial \tau} + \frac{\partial \alpha^r}{\partial \tau} \right)+\tau\left( \frac{\partial^2 \alpha ^0}{\partial \tau^2} + \frac{\partial^2 \alpha^r}{\partial \tau^2} \right)-\frac{h_0}{RT_c} + +.. math:: + + \frac{\partial f_2}{\partial \delta}=\left(\frac{\partial \alpha^r}{\partial \delta}+\delta\frac{\partial^2 \alpha^r}{\partial \delta^2} \right)+\tau\left( \frac{\partial^2 \alpha ^0}{\partial \tau \partial \delta} + \frac{\partial^2 \alpha^r}{\partial \tau \partial\delta} \right) + +and the jacobian is then + +.. math:: + + J=\left[ \begin{array}{cc} \frac{\partial f_1}{\partial \tau} & \frac{\partial f_1}{\partial \delta} \\ \frac{\partial f_2}{\partial \tau} & \frac{\partial f_2}{\partial \delta}\end{array} \right] + + +Use of Extended Corresponding States for Transport Properties +------------------------------------------------------------- + +For a limited selection of fluids, correlations are provided for the viscosity and the thermal conductivity. But for many fluids, no correlations are available, and therefore other methods must be employed. The extended corresponding states is a method of estimating the transport properties of a fluid by analogy with the transport properties of a fluid that are well defined. + +Implementing the ECS method is quite a challenge, but CoolProp is one of the only fluid property databases that properly implements it. And the onlyopen-source package that does. A multi-step method is required, which is hopefully clearly laid out here. + +To begin with, the reference fluid must be selected that the fluid of interest will be compared with. Ideally the shape of the molecules should be similar, but in practice, most fluids use R134a as the reference fluid since its thermodynamic and transport properties are well quantified with reference-quality correlations. + +Once the reference fluid has been selected, the conformal state of the reference fluid must be determined. The conformal state is the state at which the transport properties of the reference fluid and the fluid of interest are (in theory) the same. In practice, at low densities the shape factors are assumed to be unity, and the conformal temperature and molar density are obtained from + +.. math:: + + T_0 = T\frac{T_0^{c}}{T_j^c} + +.. math:: + + \overline{\rho_0} = \overline{\rho}\frac{\overline{\rho_0}^c}{\overline{\rho_j}^c} + +Exact solution for the conformal temperature + +If you have Helmholtz EOS for both the fluid and the reference fluid, you need to find a conformal temperature for the reference fluid that will yield the same compressibility factor and the residual Helmholtz energy + +.. math:: + + Z_j(T_j,\rho_j) = Z_0(T_0,\rho_0) + +.. math:: + + \alpha_j^r(T_j,\rho_j) = \alpha_0^r(T_0,\rho_0) + +where "j" is for the fluid of interest, and the subscript "0" is for the reference fluid. The left side of each equation is already known from the equation of state. Literature suggests that solving for :math:`T_0` and :math:`\rho_0` directly is quite challenging. See McLinden 2000 or Klein 1997. + +Alternatively, if the shape factors :math:`\theta` and :math:`\phi` are known, either from correlation or otherwise, the conformal temperature and density can be calculated directly. + +.. math:: + + T_0 = \frac{T}{f} = T\frac{T_0^{c}}{T_j^c\theta(T_j,\rho_j)} + +.. math:: + + \rho_0 = \rho h = \rho\frac{\rho_0^c}{\rho_j^c}\phi(T_j,\rho_j) + + +Conversion from ideal gas term to Helmholtz energy term +------------------------------------------------------- + +Much of the time the coefficients for the ideal-gas part of the Helmholtz energy are given directly, but sometimes only the gas-specific heat is provided. Therefore you need to be able to go from specific heat to ideal-gas Helmholtz Energy. The ideal-gas Helmholtz energy is given by Equation 23 from Lemmon, 2004, Equations of State for Mixtures of R-32, R-125, R-134a, R-143a, and R-152a, J. Phys. Chem. Ref. Data, Vol. 33, No. 2, 2004 or + +.. math:: + + a_0 = -RT+RT\ln\frac{\rho T}{\rho_0T_0}+h_0^0-Ts_0^0+\int_{T_0}^T c_p^0(T)dT-T\int_{T_0}^T \frac{c_p^0(T)}{T}dT + +non-dimensionalizing + +.. math:: + + \alpha_0 =\frac{a_0}{RT}= -1+\ln\frac{\rho T}{\rho_0T_0}+\frac{h_0^0}{RT}-\frac{s_0^0}{R}+\frac{1}{RT}\int_{T_0}^T c_p^0(T)dT-\frac{1}{R}\int_{T_0}^T \frac{c_p^0(T)}{T}dT + +Now we might want to do a change of variable in the integrals. If so, do a u-substitution in the integrals. + +.. math:: + + T=\frac{T_c}{\tau} + +where + +.. math:: + + dT=-\frac{T_c}{\tau^2}d\tau + +.. math:: + + \alpha_0 = -1+\ln\frac{\rho T}{\rho_0T_0}+\frac{h_0^0}{RT}-\frac{s_0^0}{R}+\frac{1}{RT}\int_{\tau_0}^{\tau} c_p^0(T)(-\frac{T_c}{\tau^2}d\tau)-\frac{1}{R}\int_{\tau_0}^{\tau} \frac{c_p^0(\tau)}{T}(-\frac{T_c}{\tau^2}d\tau) + +Simplifying and factoring the :math:`\tau` term yields + +.. math:: + + \alpha_0 = -1+\ln\frac{\rho T}{\rho_0T_0}+\frac{h_0^0}{RT}-\frac{s_0^0}{R}-\frac{\tau}{R}\int_{\tau_0}^{\tau} \frac{c_p^0(\tau)}{\tau^2}d\tau+\frac{1}{R}\int_{\tau_0}^{\tau} \frac{c_p^0(\tau)}{\tau}d\tau + +which finally yields the solution as of Equation 3 from Lemmon, 2003 (and others) + +The specific-heat contribution can then be taken as a sum of the contributions + +for a term of the form + +.. math:: + + \frac{c_p^0}{R}=\frac{(B/T)^2\exp(B/T)}{(\exp(B/T)-1)^2} + +the contribution is found from + +.. math:: + + \frac{1}{T}\int_{T_0}^T \frac{(B/T)^2\exp(B/T)}{(\exp(B/T)-1)^2} dT-\int_{T_0}^T \frac{(B/T)^2\exp(B/T)}{(\exp(B/T)-1)^2}\frac{1}{T}dT + +.. math:: + + \frac{1}{T} \left[ \frac{B}{\exp(B/T)-1 }\right|_{T_0}^T - \left[ \frac{B}{T}\left(\frac{1}{\exp(B/T)-1}+1\right) - \log[\exp(B/T)-1] \right|_{T_0}^T dT + +Factor out a B, First two terms cancel, leaving + +.. math:: + + - \left[ \frac{B}{T} - \log[\exp(B/T)-1] \right|_{T_0}^T dT + +.. math:: + + \left[\log[\exp(B/T)-1] - \frac{B}{T} \right|_{T_0}^T dT + +.. math:: + + \log[\exp(B/T)-1] - \frac{B}{T} -(\log[\exp(B/T_0)-1] - \frac{B}{T_0}) + +or in terms of :math:`\tau` + +.. math:: + + \log[\exp(B\tau/Tc)-1] - \frac{B\tau}{Tc} -(\log[\exp(B\tau_0/T_c)-1] - \frac{B\tau_0}{T_c}) + +for a term of the form + +.. math:: + + \frac{c_p^0}{R}=c + +the contribution is found from + +.. math:: + + \frac{1}{T}\int_{T_0}^T c dT-\int_{T_0}^T \frac{c}{T}dT + +.. math:: + + \frac{c}{T}(T-T_0)-c\log(T/T_0) + +or in terms of :math:`\tau` + +.. math:: + + c-\frac{cT_0\tau}{T_c}+c\log(\tau/\tau_0) + + +for a term of the form + +.. math:: + + \frac{c_p^0}{R}=cT^t, t \neq 0 + +the contribution is found from + +.. math:: + + \frac{1}{T}\int_{T_0}^T c T^t dT-\int_{T_0}^T \frac{c T^t}{T}dT + +.. math:: + + \frac{c}{T}\left(\frac{T^{t+1}}{t+1}-\frac{T_0^{t+1}}{t+1}\right)-c\left(\frac{T^{t}}{t}-\frac{T_0^{t}}{t}\right) + +.. math:: + + cT^{t}\left(\frac{1}{t+1}-\frac{1}{t}\right)-c\frac{T_0^{t+1}}{T(t+1)}+c\frac{T_0^t}{t} + +or in terms of :math:`\tau` + +.. math:: + + cT_c^{t}\tau^{-t}\left(\frac{1}{t+1}-\frac{1}{t}\right)-c\frac{T_0^{t+1}\tau}{T_c(t+1)}+c\frac{T_0^t}{t} + +.. + .. math:: + + \int\limits_{{\tau _0}}^\tau {\left[ {aT_c^t{\tau ^{ - t - 1}}} \right]d\tau } - \tau \int\limits_{{\tau _0}}^\tau {\left[ {aT_c^t{\tau ^{ - t - 2}}} \right]d\tau } \\ + + .. math:: + + aT_c^t\left( {\int\limits_{{\tau _0}}^\tau {{\tau ^{ - t - 1}}d\tau } - \tau \int\limits_{{\tau _0}}^\tau {{\tau ^{ - t - 2}}d\tau } } \right)\\ + + if :math:`t=0` + + .. math:: + + a\left( {\int\limits_{{\tau _0}}^\tau {\frac{1}{\tau }d\tau } - \tau \int\limits_{{\tau _0}}^\tau {{\tau ^{ - 2}}d\tau } } \right) + + .. math:: + + a\left( {\left[ {\ln \left( \tau \right)} \right]_{{\tau _0}}^\tau - \tau \left[ {\frac{{{\tau ^{ - 1}}}}{{ - 1}}} \right]_{{\tau _0}}^\tau } \right) + + .. math:: + a\left( \ln \left( \tau \right) - \ln \left( {{\tau _0}} \right) \right) + + + if :math:`t\neq0`: + + .. math:: + + aT_c^t\left( {\left[ {\frac{{{\tau ^{ - t}}}}{{ - t}}} \right]_{{\tau _0}}^\tau - \tau \left[ {\frac{{{\tau ^{ - t - 1}}}}{{ - t - 1}}} \right]_{{\tau _0}}^\tau } \right)\\ + + .. math:: + + aT_c^t\left( {\frac{{{\tau ^{ - t}}}}{{ - t}} - \frac{{\tau _0^{ - t}}}{{ - t}} - \tau \left[ {\frac{{{\tau ^{ - t - 1}}}}{{ - t - 1}} - \frac{{\tau _0^{ - t - 1}}}{{ - t - 1}}} \right]} \right)\\ + + .. math:: + + - aT_c^t\left( {\frac{{{\tau ^{ - t}}}}{t} - \frac{{\tau _0^{ - t}}}{t} - \left[ {\frac{{{\tau ^{ - t}}}}{{t + 1}} - \frac{{\tau _0^{ - t}}}{{t + 1}}} \right]} \right) + + .. math:: + + - aT_c^t\frac{{{\tau ^{ - t}}}}{t} + aT_c^t\frac{{{\tau ^{ - t}}}}{{t + 1}} + aT_c^t\frac{{\tau _0^{ - t}}}{t} - aT_c^t\frac{{\tau _0^{ - t}}}{{t + 1}} + + .. math:: + + - aT_c^t\frac{{{\tau ^{ - t}}}}{t} + aT_c^t\frac{{{\tau ^{ - t}}}}{{t + 1}} + aT_c^t\tau _0^{ - t}\left[ {\frac{1}{t} - \frac{1}{{t + 1}}} \right] + + .. math:: + + aT_c^t{\tau ^{ - t}}\left[ {\frac{1}{{t + 1}} - \frac{1}{t}} \right] + aT_c^t\tau _0^{ - t}\left[ {\frac{1}{t} - \frac{1}{{t + 1}}} \right]\\ + + if :math:`t = 1` + + .. math:: + + - \frac{{a{T_c}{\tau ^{ - 1}}}}{2} + \frac{{a{T_c}\tau _0^{ - 1}}}{2} + +These terms can be summarized by the following table: + +.. math:: + + \begin{array}{*{20}{c}} + {\dfrac{{c_p^0}}{R}{\rm{ Term}}}&{{\alpha ^0}{\rm{ Term}}}&{{\rm{Class Name}}}&{}&{}&{}&{}&{}\\ + {{a_k}\dfrac{{{{\left( {{b_k}/T} \right)}^2}\exp \left( {{b_k}/T} \right)}}{{{{\left( {\exp \left( {{b_k}/T} \right) - 1} \right)}^2}}}}&{{a_k}\ln \left[ {1 - \exp \left( {\frac{{ - {b_k}\tau }}{{{T_c}}}} \right)} \right]}&{{\rm{phi0\_Planck\_Einstein}}(a,b/Tc,[iStart,iEnd])}&{}&{}&{}&{}&{}\\ + {ac\frac{{{{\left( {b/T} \right)}^2}\exp \left( { - b/T} \right)}}{{{{\left( {c\exp \left( { - b/T} \right) + 1} \right)}^2}}}}&{a\ln \left[ {c + \exp \left( {\frac{{b\tau }}{{{T_c}}}} \right)} \right]}&{{\rm{phi0\_Planck\_Einstein2}}(a,b/Tc,c)}&{}&{}&{}&{}&{}\\ + {yuck}&{{a_k}{\tau ^{{b_k}}}}&{{\rm{phi0\_power}}\left( {a,b,[iStart,iEnd]} \right)}&{}&{}&{}&{}&{}\\ + a&{a - a\frac{\tau }{{{\tau _0}}} + a\ln \left( {\frac{\tau }{{{\tau _0}}}} \right)}&{{\rm{phi0\_cp0\_constant}}(a,Tc,T0)}&{}&{}&{}&{}&{}\\ + {{a_1} + {a_2}{{\left( {\frac{{{a_3}/T}}{{\sinh \left( {{a_3}/T} \right)}}} \right)}^2} + {a_4}{{\left( {\frac{{{a_5}/T}}{{\cosh \left( {{a_5}/T} \right)}}} \right)}^2}}&{yuck}&{{\rm{phi0\_cp0\_AlyLee}}(a,Tc,T0,R)}&{}&{}&{}&{}&{}\\ + {{\rm{n/a}}}&{\log (\delta ) + {a_1} + {a_2}\tau }&{{\rm{phi0\_lead(}}a1,{\rm{ }}a2{\rm{)}}}&{}&{}&{}&{}&{}\\ + {{\rm{n/a}}}&{a\log \tau }&{{\rm{phi0\_logtau}}(a)}&{}&{}&{}&{}&{} + \end{array} + +If the reference enthalpy is known, you can determine the constants from + +.. math:: + + \frac{h_0}{RT}=\tau \left[\left(\frac{\partial \alpha^0}{\partial \tau}\right)_{\delta}+ \left(\frac{\partial \alpha^r}{\partial \tau}\right)_{\delta} \right] +\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}+1 + +.. math:: + + \left(\frac{\partial \alpha^0}{\partial \tau}\right)_{\delta} = \frac{1}{\tau}\left(\frac{h_0}{RT}-\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}-1\right)- \left(\frac{\partial \alpha^r}{\partial \tau}\right)_{\delta} + +For the specific heat +The two integral terms are + +.. math:: + + - \frac{\tau }{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } + \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{\tau }d\tau } + +First derivative + +.. math:: + + \frac{d}{{d\tau }}\left[ { - \frac{\tau }{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } + \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{\tau }d\tau } } \right] = - \frac{{c_p^0}}{{\tau R}} - \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } + \frac{{c_p^0}}{{\tau R}} = - \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } + +Second Derivative + +.. math:: + + \frac{{{d^2}}}{{d{\tau ^2}}}\left[ { - \frac{\tau }{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } + \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{\tau }d\tau } } \right] = \frac{d}{{d\tau }}\left[ { - \frac{1}{R}\int_{{\tau _0}}^\tau {\frac{{c_p^0}}{{{\tau ^2}}}d\tau } } \right] = - \frac{{c_p^0}}{{{\tau ^2}R}} + + +Converting Bender and mBWR EOS +------------------------------ + +If the EOS is of the form + +.. math:: + + \frac{p}{{\rho RT}} = Z\left( {T,\rho } \right) = 1 + \sum\limits_i {{n_i}{T^{{s_i}}}{\rho ^{{r_i}}}} + \sum\limits_i {{n_i}{T^{{s_i}}}{\rho ^{{r_i}}}} \exp \left( { - {\gamma _i}{{\left( {\frac{\rho }{{{\rho _c}}}} \right)}^2}} \right) + +To convert to standard power form in CoolProp, use + +.. math:: + + \delta \sum\limits_i {{d_i}{a_i}{\tau ^{{t_i}}}{\delta ^{{d_i} - 1}}} = \sum\limits_i {{n_i}{T^{{s_i}}}{\rho ^{{r_i}}}} = \sum\limits_i {{n_i}{{\left( {\frac{{{T_c}}}{\tau }} \right)}^{{s_i}}}{{\left( {{\rho _c}\delta } \right)}^{{r_i}}}} = \sum\limits_i {{n_i}T_c^{{s_i}}\rho _c^{{r_i}}{\tau ^{ - {s_i}}}{\delta ^{{r_i}}}} + +The left-hand-side is the derivative of the residual Helmholtz energy with respect +to delta times the reduced density since + +.. math:: + + \frac{p}{\rho RT}=1+\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau} + +where + +.. math:: + + \delta : {d_i} - 1 + 1 = {r_i} \Rightarrow {d_i} = {r_i} + +.. math:: + + \tau : {t_i} = - {s_i} + +.. math:: + + c : {d_i}{a_i} = {n_i}T_c^{{s_i}}\rho _c^{{r_i}} + +.. math:: + + p = \rho RT + \sum\limits_i {{n_i}{T^{{s_i}}}{\rho ^{{r_i}}}} + \sum\limits_i {{n_i}{T^{{s_i}}}{\rho ^{{r_i}}}} \exp \left( { - {\gamma _i}{{\left( {\frac{\rho }{{{\rho _c}}}} \right)}^2}} \right){\rm{ (Eq 3}}{\rm{.28)}} + +.. math:: + + \frac{p}{{\rho RT}} = 1 + \sum\limits_i {\frac{{{n_i}}}{R}{T^{{s_i} - 1}}{\rho ^{{r_i} - 1}}} + \sum\limits_i {\frac{{{n_i}}}{R}{T^{{s_i} - 1}}{\rho ^{{r_i} - 1}}} \exp \left( { - {\gamma _i}{{\left( {\frac{\rho }{{{\rho _c}}}} \right)}^2}} \right) + +.. math:: + + \delta \sum\limits_i {{d_i}{a_i}{\tau ^{{t_i}}}{\delta ^{{d_i} - 1}}} = \sum\limits_i {\frac{{{n_i}}}{R}{{\left( {\frac{{{T_c}}}{\tau }} \right)}^{{s_i} - 1}}{{\left( {{\rho _c}\delta } \right)}^{{r_i} - 1}}} = \sum\limits_i {\frac{{{n_i}}}{R}T_c^{{s_i} - 1}\rho _c^{{r_i} - 1}{\tau ^{ - ({s_i} - 1)}}{\delta ^{{r_i} - 1}}} + +.. math:: + + \delta :1 + {d_i} - 1 = {r_i} - 1 + +.. math:: + + \tau :{t_i} = - \left( {s_i - 1} \right) + +.. math:: + + c:{d_i}{a_i} = \frac{{{n_i}}}{R}T_c^{{s_i} - 1}\rho _c^{{r_i} - 1} + +In the Bender EOS, for the exponential part you have terms that can be converted to reduced form + +.. math:: + + a_i\delta^{d_i}\tau^{t_i}\exp(-\gamma \delta^2) + +which yields the terms in the following table (from Span, 2000) + +.. math:: + + \begin{array}{*{4}{c}|*{4}{c}} + \multicolumn{4}{c}{\mbox{From Bender}} & \multicolumn{4}{c}{\mbox{Power term}}\\ + {i}&{d_i}&{t_i}&{\gamma_i}&{n_i}&{d_i}&{t_i}&{\gamma_i}\\\hline + {14}&2&3&\gamma &{{n_{14}}/(2\gamma) + {n_{17}}/(2{\gamma ^2})}&0&3&0\\ + {15}&2&4&\gamma &{{n_{15}}/(2\gamma) + {n_{17}}/(2{\gamma ^2})}&0&4&0\\ + {16}&2&5&\gamma &{{n_{16}}/(2\gamma) + {n_{17}}/(2{\gamma ^2})}&0&5&0\\ + {17}&4&3&\gamma &{ - {n_{14}}/(2\gamma) - {n_{17}}/(2{\gamma ^2})}&0&3&\gamma \\ + {18}&4&4&\gamma &{ - {n_{15}}/(2\gamma) - {n_{18}}/(2{\gamma ^2})}&0&4&\gamma \\ + {19}&4&5&\gamma &{ - {n_{16}}/(2\gamma) - {n_{19}}/(2{\gamma ^2})}&0&5&\gamma \\ + {20}&{}&{}&{}&{ - {n_{17}}/(2{\gamma})}&2&3&\gamma \\ + {21}&{}&{}&{}&{ - {n_{18}}/(2{\gamma})}&2&4&\gamma \\ + {22}&{}&{}&{}&{ - {n_{19}}/(2{\gamma})}&2&5&\gamma + \end{array} + +.. warning:: + + If the terms in the EOS are in terms of :math:`T` and :math:`\rho` rather than :math:`\tau` and :math:`\delta`, make sure to multiply appropriately by the critical densities in the exponential term. For instance in Polt paper, the first constant should be :math:`n_{14}\rho_c^2/(2\gamma)+n_{17}\rho_c^4/(2\gamma^2)/T_c^3` Be careful! diff --git a/Web/FluidInformation.rst b/Web/FluidInformation.rst new file mode 100644 index 00000000..fc06b044 --- /dev/null +++ b/Web/FluidInformation.rst @@ -0,0 +1,265 @@ +CoolProp Fluid Information +========================== +.. toctree:: + :maxdepth: 1 + + Fluids/pseudo_pure_fluids.rst + Fluids/pure_fluids.rst + +There are 4 basic classes of fluids that can be used in CoolProp, an example is provided for each one. + +Pure Fluids, Pseudo-Pure Fluids +------------------------------- +All the fluids listed in Pure-Fluids and Pseudo-Pure-Fluids sections above can be used. To use one of these fluids, do something like + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Density of dry air at 1 atm. and 25C + In [1]: Props('D','T',298,'P',101.325,'Air') + +You can also use any of the aliases of the fluids that are the listed on the fluid page. For instance, R717 is the refrigerant number for ammonia + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Density of saturated ammonia vapor at 1 atm. + In [1]: Props('D','Q',1,'P',101.325,'R717') + + #Density of saturated ammonia vapor at 1 atm. + In [1]: Props('D','Q',1,'P',101.325,'Ammonia') + + +REFPROP Fluids and Mixtures +--------------------------- +If you are on Windows and have REFPROP installed, you can use it with CoolProp. REFPROP needs to be installed in c:\\Program Files\\REFPROP. If it is somewhere else, just copy it to this location. + +It is also possible to use REFPROP on Linux. Please follow the instructions from https://github.com/jowr/librefprop.so to install the library from Fortran sources. Additionally, you also need to copy the fluid and mixture files to /opt/refprop. + +All the pure fluids in REFPROP are used just like the CoolProp fluids except that "REFPROP-" is added at the beginning of the fluid name. You can use any fluid that is included in REFPROP, but you must use the REFPROP fluid file name. For CoolProp Fluids, you can use the ``get_REFPROPName()`` function to get the REFPROP name for the fluid. + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Saturated isobutane vapor density at 1 atmosphere + In [1]: Props('D','Q',1,'P',101.325,'REFPROP-ISOBUTAN') + +You can also use mixtures in REFPROP, there is a special format for the fluid name. The fluid name is set up like this: ``"REFPROP-MIX:R32[0.697615]&R125[0.302385]"`` - this is R410A. The numbers within the brackets are the mole fractions of the components. They must add up to 1.0 + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Saturated R410 vapor density at 1 atmosphere using the mixture properties + In [1]: Props('D','Q',1,'P',101.325,'REFPROP-MIX:R32[0.697615]&R125[0.302385]') + +In Engineering Equation Solver (EES), you can compose a fluid string using something like ``a$='REFPROP-MIX:'||'R32'||'['||yy$||']'||and$||'R125'||'['||xx$||']'`` where ``yy`` and ``xx`` are mole fractions of R32 and R125 respectively. + +Incompressible Liquids +---------------------- +There is also a selection of incompressible liquids implemented. These only allow for calls with +temperature and pressure as input and provide only a subset of thermophysical properties, namely: +density, heat capacity, internal energy, enthalpy, entropy, viscosity and thermal conductivity. +Hence, the available output keys for the ``Props`` function are: "D", "C", "U", "H", "S", "V", "L", +"Tmin", Tmax" and "Psat". An internal iteration allows us to use enthalpy and pressure as inputs, +but be aware of the reduced computational efficiency. + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Density of HFE-7100 at 300 K and 1 atm. + In [1]: Props('D','T',300,'P',101.325,'HFE') + + +For refrigeration applications, 8 fluids were implemented from Aake Melinder "Properties of +Secondary Working Fluids for Indirect Systems" published in 2010 by IIR and coefficients are +obtained from a fit between -80 and +100 degrees Celsius. + +========================== =================================================== +Fluid Name Description +========================== =================================================== +``DEB`` Diethyl Benzene +``HCM`` Hydrocarbon Mixture (Therminol D12 Solutia) +``HFE`` Hydrofluoroether HFE-7100 +``PMS1`` Polydimethylsiloxan 1. +``PMS2`` Polydimethylsiloxan 2. +``SAB`` Synthetic alkyl benzene +``HCB`` Hydrocarbon blend (Dynalene MV) +``TCO`` Terpene from citrus oils +========================== =================================================== + +Some additional secondary cooling fluids are based on data compiled by Morten Juel Skovrup in +his `SecCool software `_ +provided by his employer `IPU `_. Fits have been made according to the manufacturer +data stored in the sodtware. The Aspen Temper fluids are a blend of potassium formate and sodiumpropionate +and the Zitrec S group consists mainly of potassium acetate and potassium formate. + +========================== =================================================== +Fluid Name Description +========================== =================================================== +``AS10`` Aspen Temper -10 (-10 to +27.5 C) +``AS20`` Aspen Temper -20 (-20 to +27.5 C) +``AS30`` Aspen Temper -30 (-30 to +27.5 C) +``AS40`` Aspen Temper -40 (-40 to +27.5 C) +``AS55`` Aspen Temper -55 (-55 to +27.5 C) +``ZS10`` Zitrec S -10 (-10 to +85 C) +``ZS25`` Zitrec S -25 (-25 to +85 C) +``ZS40`` Zitrec S -40 (-40 to +85 C) +``ZS45`` Zitrec S -45 (-45 to +85 C) +``ZS55`` Zitrec S -55 (-55 to +85 C) +========================== =================================================== + +There are also a few high temperature heat transfer fluids with individual temperature ranges. Please +refer to the file IncompLiquid.h for a complete overview. For these fluids, information from commercial +data sheets was used to obtain coefficients. + +========================== =================================================== +Fluid Name Description +========================== =================================================== +``TD12`` Therminol D12 (-85 to +230 C) +``TVP1`` Therminol VP-1 (+12 to +397 C) +``T72`` Therminol 72 (-10 to +380 C) +``T66`` Therminol 66 (0 to +345 C) +``DowJ`` Dowtherm J (-80 to +345 C) +``DowQ`` Dowtherm Q (-35 to +360 C) +``TX22`` Texatherm 22 (0 to +350 C) +``NaK`` Nitrate Salt Blend (+300 to +600 C) +``XLT`` Syltherm XLT (-100 to +260 C) +``HC10`` Dynalene HC-10 (-10 to +218 C) +``HC20`` Dynalene HC-20 (-20 to +210 C) +``HC30`` Dynalene HC-30 (-30 to +210 C) +``HC40`` Dynalene HC-40 (-40 to +200 C) +``HC50`` Dynalene HC-50 (-50 to +210 C) +========================== =================================================== + +All fluids are implemented with polynomials for density and heat capacity with typically 4 coefficients +and hence a third order polynomial. Thermal conductivity is a second order polynomial and viscosity and +vapour pressure are exponential functions. + +.. math:: + + \rho &= \sum_{i=0}^n C_{\rho}[i] \cdot T^i \\ + c &= \sum_{i=0}^n C_{c}[i] \cdot T^i \\ + u &= \int_{0}^{1} c\left( T \right) dT + = \sum_{i=0}^n \frac{1}{i+1} \cdot C_{c}[i] + \cdot \left( T_1^{i+1} - T_0^{i+1} \right) \\ + s &= \int_{0}^{1} \frac{c\left( T \right)}{T} dT + = C_{c}[0] \cdot \ln\left(\frac{T_1}{T_0}\right) + + \sum_{i=0}^{n-1} \frac{1}{i+1} \cdot C_{c}[i+1] + \cdot \left( T_1^{i+1} - T_0^{i+1} \right) \\ + \lambda &= \sum_{i=0}^n C_{\lambda}[i] \cdot T^i \\ + \mu &= \exp\left( \frac{C_{\mu}[0]}{T+C_{\mu}[1]} - C_{\mu}[2] \right) \\ + p_{sat} &= \exp\left( \frac{C_{sat}[0]}{T+C_{sat}[1]} - C_{sat}[2] \right) \\ + + +Brines and Solutions +-------------------- +All the brines and solutions can be accessed through the Props function. To use them, the fluid name +is something like ``"MEG-20%"`` which is a 20% by mass ethylene glycol solution. Note that these fluids +have an arbitrary reference state: Be careful with enthalpy and entropy calculations. Again, only +temperature and pressure inputs are supported directly to calculate the same subset of thermophysical +properties as above , namely: density, heat capacity, internal energy, enthalpy, entropy, viscosity +and thermal conductivity. Hence, the available output keys for the ``Props`` function are: "D", "C", +"U", "H", "S", "V", "L", "Tmin", Tmax" and "Tfreeze". An internal iteration allows us to use enthalpy +and pressure as inputs, but be aware of the reduced computational efficiency. + +.. ipython:: + + In [1]: from CoolProp.CoolProp import Props + + #Specific heat 20% mass ethylene glycol solution at 300 K and 1 atm. + In [1]: Props('C','T',300,'P',101.325,'MEG-20%') + +For Lithium-Bromide, the publication by Patek and Klomfar from 2005 was implemented based on the +source code provided by the authors. The `paper `_ +covering the equations can be found in the +`International Journal of Refrigeration `_. Data is +available for temperatures from 0 C to 225 C and for the full composition range. Use ``LiBr`` to acccess +the functions. + +A number of aqueous solutions are implemented using the coefficients from Aake Melinder "Properties of +Secondary Working Fluids for Indirect Systems" published in 2010 by IIR. According to the book, 2D +polynomials are given in a form that satisfies :math:`0 \leq i \leq 5`, :math:`0 \leq j \leq 3` +and :math:`i + j \leq 5` yielding a triangular matrix of coefficients. It is only for the freezing +temperature calculation that the implemented procedures differ from what is presented in Melinder's +book the dependency on the current temperature is removed. In CoolProp, :math:`T_{freeze}` only depends +on concentration. + +========================== =================================================== ================= ================= +Melinder Fluids Description max. T max. x +========================== =================================================== ================= ================= +``MEG`` Ethylene Glycol (C2H6O2) +100 C 60 % +``MPG`` Propylene Glycol (C3H8O2) +100 C 60 % +``MEA`` Ethyl Alcohol, Ethanol (C2H6O) +40 C 60 % +``MMA`` Methyl Alcohol, Methanol (CH4O) +40 C 60 % +``MGL`` Glycerol (C3H8O3) +40 C 60 % +``MAM`` Ammonia (NH3) +30 C 30 % +``MKC`` Potassium Carbonate (K2CO3) +40 C 40 % +``MCA`` Calcium Chloride (CaCl2) +40 C 30 % +``MMG`` Magnesium Chloride (MgCl2) +40 C 30 % +``MNA`` Sodium Chloride (NaCl) +40 C 23 % +``MKA`` Potassium Acetate (CH3CO2K) +40 C 45 % +``MKF`` Potassium Formate (CHKO2) +40 C 48 % +``MLI`` Lithium Chloride (LiCl) +40 C 24 % +========================== =================================================== ================= ================= + +Furthermore, there is a number of other secondary fluids that can be accessed in the same way. Most +information is based on the data compiled by Morten Juel Skovrup in his `SecCool software `_ +provided by his employer `IPU `_. The coefficient matrix of the SecCool-based fluids +has the same structure as mentioned above. + +For slurry ice, the concentration :math:`x` refers to the solid content and the heat capacity includes the heat of fusion. +It might be necessary to adjust the solid content during heat transfer. The implementation is based on the data available +in SecCool, which was originally recorded at the `Danish Technological Institute (DTI) `_. + +========================== =================================================== ================= ================= +SecCool Fluids Description max. T max. x +========================== =================================================== ================= ================= +``ZiAC`` ZitrecAC (corrosion inhibitor) +100 C 50 % +``IceEA`` Ethanol-water mixture with slurry ice -10 C 35 % +``IcePG`` Propylene glycol-water mixture with slurry ice -10 C 35 % +``IceNA`` Sodium chloride-water mixture with slurry ice -5 C 35 % +``PK2000`` Pekasol 2000 (Potassium acetate and formate) +100 C 100 % +========================== =================================================== ================= ================= + + + +In both of the above cases, :math:`i` is the exponent for the concentration :math:`x` and :math:`j` +is used with the temperature :math:`T`. Properties are modelled with the following polynomials: + +.. math:: + + \rho &= \sum_{i=0}^n x^i \cdot \sum_{j=0}^m C_{\rho}[i,j] \cdot T^j \\ + c &= \sum_{i=0}^n x^i \cdot \sum_{j=0}^m C_{c}[i,j] \cdot T^j \\ + u &= \int_{0}^{1} c\left( x,T \right) dT + = \sum_{i=0}^n x^i \cdot \sum_{j=0}^m \frac{1}{j+1} \cdot C_{c}[i,j] + \cdot \left( T_1^{j+1} - T_0^{j+1} \right) \\ + s &= \int_{0}^{1} \frac{c\left( x,T \right)}{T} dT + = \sum_{i=0}^n x^i \cdot \left( + C_{c}[i,0] \cdot \ln\left(\frac{T_1}{T_0}\right) + + \sum_{j=0}^{m-1} \frac{1}{j+1} \cdot C_{c}[i,j+1] \cdot \left( T_1^{j+1} - T_0^{j+1} \right) + \right) \\ + \lambda &= \sum_{i=0}^n x^i \cdot \sum_{j=0}^m C_{\lambda}[i,j] \cdot T^j \\ + \mu &= \exp \left( \sum_{i=0}^n x^i \cdot \sum_{j=0}^m C_{\mu}[i,j] \cdot T^j \right) \\ + T_{freeze} &= \sum_{i=0}^n C_{freeze}[i] \cdot x^i \\ + +Using a centered approach for the independent variables, +the fit quality can be enhanced. Therefore, all solutions have a reference temperature and concentration +in the original work by Melinder and Skovrup as well as in CoolProp: :math:`x = x_{real} - x_{ref}` +and :math:`T = T_{real} - T_{ref}`, this technique does not affect the calculation +of the derived quantity internal energy since the formula contains temperature differences. +However, integrating :math:`c(x,T)T^{-1}dT` for the entropy requires some changes due to +the logarithm. To structure the problem, we introduce a variable :math:`d(j,T_{real})`, which will be expressed by a third sum. +As a first step for simplification, one has to expand the the binomial :math:`(T_{real}-T_{ref})^n` to a series. +Only containing :math:`j` and :math:`T_{real}`, :math:`d` is independent from :math:`x` and can be +computed outside the loop for enhanced computational efficiency. An integration of the expanded binomial +then yields the final factor :math:`D` to be multiplied with the other coefficients and the concentration. + +.. math:: + + s &= \int_{0}^{1} \frac{c\left( x,T \right)}{T} dT = \sum_{i=0}^n x^i \cdot \sum_{j=0}^m C_{c}[i,j] \cdot D(j,T_0,T_1) \\ + D &= (-1)^j \cdot \ln \left( \frac{T_1}{T_0} \right) \cdot T_{ref}^j + \sum_{k=0}^{j-1} \binom{j}{k} \cdot \frac{(-1)^k}{j-k} \cdot \left( T_1^{j-k} - T_0^{j-k} \right) \cdot T_{ref}^k diff --git a/Web/FluidTemplate.ipynb b/Web/FluidTemplate.ipynb new file mode 100644 index 00000000..b0d65176 --- /dev/null +++ b/Web/FluidTemplate.ipynb @@ -0,0 +1,386 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# This block does the setup\n", + "from IPython.core.display import HTML\n", + "from IPython.display import display_html\n", + "from CoolProp.Plots.Plots import Ph,Ps\n", + "from CoolProp.CoolProp import Props, get_fluid_param_string\n", + "import CoolProp.CoolProp as CP\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline\n", + "labels = {'P' : '$p$', \n", + " 'D' : r'$\\rho$', \n", + " 'C' : '$c_p$',\n", + " 'O' : '$c_v$', \n", + " 'H' : '$h$',\n", + " 'S' : '$s$', \n", + " 'V' : '$\\mu$',\n", + " 'L' : '$\\lambda$'}\n", + "sat_labels = labels.copy()\n", + "sat_labels['I'] = '$\\sigma$'\n", + "\n", + "Fluid = 'Water'\n", + "RPFluid = 'REFPROP-'+get_fluid_param_string(Fluid,'REFPROPName')\n", + "Tt = Props(Fluid,'Tmin')\n", + "Tc = Props(Fluid,'Tcrit')\n", + "rhoc = Props(Fluid,'Tcrit')\n", + "T = np.linspace(Tt+0.01,0.99*Tc,20)\n", + "h0 = Props('H','T',0.95*Tc,'Q',1,Fluid)\n", + "s0 = Props('S','T',0.95*Tc,'Q',1,Fluid)\n", + "h0_RP = Props('H','T',0.95*Tc,'Q',1,RPFluid)\n", + "s0_RP = Props('S','T',0.95*Tc,'Q',1,RPFluid)" + ], + "language": "python", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Literature References" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from parse_bib import BibTeXerClass\n", + "BTC = BibTeXerClass()\n", + " \n", + "EOSkey = CP.get_BibTeXKey(Fluid, \"EOS\")\n", + "CP0key = CP.get_BibTeXKey(Fluid, \"CP0\")\n", + "SURFACE_TENSIONkey = CP.get_BibTeXKey(Fluid, \"SURFACE_TENSION\")\n", + "VISCOSITYkey = CP.get_BibTeXKey(Fluid, \"VISCOSITY\")\n", + "CONDUCTIVITYkey = CP.get_BibTeXKey(Fluid, \"CONDUCTIVITY\")\n", + "ECS_LENNARD_JONESkey = CP.get_BibTeXKey(Fluid, \"ECS_LENNARD_JONES\")\n", + "ECS_FITSkey = CP.get_BibTeXKey(Fluid, \"ECS_FITS\")\n", + "\n", + "BibInfo = ''\n", + "if EOSkey:\n", + " BibInfo += '

Equation of State: ' + BTC.entry2HTML(EOSkey)\n", + "if CP0key:\n", + " BibInfo += '

Ideal-Gas Specific Heat: ' + BTC.entry2HTML(CP0key)\n", + "if SURFACE_TENSIONkey:\n", + " BibInfo += '

Surface Tension: ' + BTC.entry2HTML(SURFACE_TENSIONkey)\n", + "if VISCOSITYkey:\n", + " BibInfo += '

Viscosity: ' + BTC.entry2HTML(VISCOSITYkey)\n", + "if CONDUCTIVITYkey:\n", + " BibInfo += '

Conductivity: ' + BTC.entry2HTML(CONDUCTIVITYkey)\n", + "if ECS_LENNARD_JONESkey:\n", + " BibInfo += '

Lennard-Jones Parameters for ECS: ' + BTC.entry2HTML(ECS_LENNARD_JONESkey)\n", + "if ECS_FITSkey:\n", + " BibInfo += '

ECS Correction Fit: ' + BTC.entry2HTML(ECS_FITSkey)\n", + "\n", + "display_html(HTML(BibInfo))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "

Equation of State: Wagner, W.; Pruss, A., 2002, The IAPWS Formulation 1995 for the Thermodynamic Properties of Ordinary Water Substance for General and Scientific Use, J. Phys. Chem. Ref. Data, 31:387-535

Surface Tension: Mulero, A.; Cachadi\u00f1a, I.; Parra, M. I., 2012, Recommended Correlations for the Surface Tension of Common Fluids, J. Phys. Chem. Ref. Data, 41:043105-1:13

Viscosity: Huber, M.L.; Perkins, R.A.; Laesecke, A.; Friend, D.G.; Sengers, J.V.; Assael, M.J; Metaxa, I.M.; Vogel, E.; Mare\u00161, R.; Miyagawa, K., 2009, New International Formulation for the Viscosity of H2O, J. Phys. Chem. Ref. Data, 38:101-125

Conductivity: Huber, M. L.; Perkins, R. A.; Friend, D. G.; Sengers, J. V.; Assael, M. J.; Metaxa, I. N.; Miyagawa, K.; Hellmann, R.; Vogel, E., 2012, New International Formulation for the Thermal Conductivity of H2O, J. Phys. Chem Ref. Data, 41:033102-1:23

Lennard-Jones Parameters for ECS: Poling, Bruce E.; Prausnitz, John M.; O'Connell, John P., 2001, The Properties of Gases and Liquids, 5th edition, McGraw Hill" + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 2 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Aliases" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "aliases = get_fluid_param_string(Fluid,'aliases')\n", + "if aliases:\n", + " display_html(HTML(', '.join(['\"'+alias+'\"' for alias in aliases.split(', ')])))\n", + "else:\n", + " print '\"'+Fluid+'\"'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "\"water\", \"WATER\", \"H2O\", \"h2o\"" + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 3 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Fluid Constants" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "params = dict(mm = CP.Props(Fluid,'molemass'),\n", + " Tt = CP.Props(Fluid,'Ttriple'),\n", + " pt = CP.Props(Fluid,'ptriple'),\n", + " Tc = CP.Props(Fluid,'Tcrit'),\n", + " pc = CP.Props(Fluid,'pcrit'),\n", + " rhoc = CP.Props(Fluid,'rhocrit'),\n", + " Tmin = CP.Props(Fluid,'Tmin'),\n", + " CAS = get_fluid_param_string(Fluid,'CAS'),\n", + " ASHRAE = get_fluid_param_string(Fluid,'ASHRAE34')\n", + " )\n", + "\n", + "s = \"\"\"\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Parameter Value
Triple point
Triple Point Temp. [K] {Tt:0.3f}
Triple Point Press. [kPa] {pt:0.10g}
Critical point
Critical Point Temp. [K] {Tc:0.3f}
Critical Point Press. [kPa] {pc:0.10g}
Critical Point Density. [kPa] {rhoc:0.10g}
Other Values
Mole Mass [kg/kmol] {mm:0.5f}
Minimum temperature [K] {Tmin:0.3f}
CAS number {CAS:s}
ASHRAE classification {ASHRAE:s}
\"\"\".format(**params)\n", + "HTML(s)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Parameter Value
Triple point
Triple Point Temp. [K] 273.160
Triple Point Press. [kPa] 0.611654771
Critical point
Critical Point Temp. [K] 647.096
Critical Point Press. [kPa] 22064
Critical Point Density. [kPa] 322
Other Values
Mole Mass [kg/kmol] 18.01527
Minimum temperature [K] 273.160
CAS number 7732-18-5
ASHRAE classification A1
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Saturation Property Deviations" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig = plt.figure(figsize=(13,6))\n", + "ax1 = fig.add_subplot(121)\n", + "ax2 = fig.add_subplot(122)\n", + "\n", + "for ax, Q in zip([ax1,ax2],[0,1]):\n", + " for key, label in sat_labels.iteritems():\n", + " CPval = Props(key, 'T', T, 'Q', Q, Fluid)\n", + " RPval = Props(key, 'T', T, 'Q', Q, RPFluid)\n", + " if key =='H': \n", + " CPval -= h0\n", + " RPval -= h0_RP\n", + " if key =='S': \n", + " CPval -= s0\n", + " RPval -= s0_RP\n", + " ax.semilogy(T/Tc, np.abs(CPval/RPval-1)*100, 'o', label=label)\n", + " if Q == 0:\n", + " ax.set_title('Saturated Liquid')\n", + " else:\n", + " ax.set_title('Saturated Vapor')\n", + " ax.set_ylim(1e-18,1000)\n", + " ax.set_xlabel('Reduced temperature T/Tc')\n", + " ax.set_ylabel('Absolute deviation [%]')\n", + " ax.legend(numpoints=1,loc='lower center',ncol = 5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nEBERERERERERERERERERERERERERERERERERERERERERERERERERERERERE/+/+w8iqV8KvIqwAA\nAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Along the critical isotherm where $T=T_c$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "rho = np.linspace(1e-12,1.5*rhoc)\n", + "\n", + "fig = plt.figure(figsize=(6,6))\n", + "ax = fig.add_subplot(111)\n", + "\n", + "for key, label in labels.iteritems():\n", + " CPval = Props(key, 'T', Tc, 'D', rho, Fluid)\n", + " RPval = Props(key, 'T', Tc, 'D', rho, RPFluid)\n", + " if key =='H': \n", + " CPval -= h0\n", + " RPval -= h0_RP\n", + " if key =='S': \n", + " CPval -= s0\n", + " RPval -= s0_RP\n", + " ax.semilogy(rho/rhoc, np.abs(CPval/RPval-1)*100, 'o', label=label)\n", + "\n", + "ax.set_ylim(1e-18,100)\n", + "ax.set_title('Critical isotherm Deviations from REFPROP 9.1')\n", + "ax.set_xlabel(r'Reduced density $\\rho/\\rho_c$')\n", + "ax.set_ylabel('Absolute deviation [%]')\n", + "ax.legend(numpoints=1,loc='lower center',ncol=4)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Check of p,h and p,s as inputs (X: Failure .: Success)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig = plt.figure(figsize=(10,5))\n", + "ax1 = fig.add_subplot(121)\n", + "ax2 = fig.add_subplot(122)\n", + "\n", + "Tmin = Props(Fluid,'Tmin')+3\n", + "pmin = Props('P','T',Tmin,'Q',0,Fluid)\n", + "pmax = Props(Fluid,'pcrit')*2\n", + "hmin = Props('H','T',Tmin,'Q',0,Fluid)\n", + "hmax = 2*Props('H','T',Tc-1,'Q',1,Fluid)-hmin\n", + "smin = Props('S','T',Tmin,'Q',0,Fluid)\n", + "smax = 2*Props('S','T',Tc-1,'Q',1,Fluid)-smin\n", + "\n", + "Ph(Fluid, axis = ax1, Tmin = Tmin, Tmax = Tc-0.01)\n", + "Ps(Fluid, axis = ax2, Tmin = Tmin, Tmax = Tc-0.01)\n", + "\n", + "for p in np.linspace(pmin,pmax,10):\n", + " for h in np.linspace(hmin,hmax):\n", + " _bad = False\n", + " try:\n", + " T = Props('T','H',h,'P',p,Fluid)\n", + " rho = Props('D','H',h,'P',p,Fluid)\n", + " hEOS = Props('H','T',T,'D',rho,Fluid)\n", + " except ValueError:\n", + " _bad = True\n", + " if _bad or abs(hEOS/h-1)>1e-6:\n", + " ax1.plot(h,p,'x',ms = 10)\n", + " else:\n", + " ax1.plot(h,p,'k.', ms = 1)\n", + "\n", + "for p in np.linspace(pmin,pmax,10):\n", + " for s in np.linspace(smin,smax):\n", + " _bad = False\n", + " try:\n", + " T = Props('T','S',s,'P',p,Fluid)\n", + " rho = Props('D','S',s,'P',p,Fluid)\n", + " sEOS = Props('S','T',T,'D',rho,Fluid)\n", + " except ValueError:\n", + " _bad = True\n", + " if _bad or abs(sEOS/s-1)>1e-6:\n", + " ax2.plot(s,p,'x',ms = 10)\n", + " else:\n", + " ax2.plot(s,p,'k.', ms = 1)\n", + "\n", + "plt.tight_layout()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 7 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/Web/GenerateFluidHTML.py b/Web/GenerateFluidHTML.py new file mode 100644 index 00000000..2e168d9b --- /dev/null +++ b/Web/GenerateFluidHTML.py @@ -0,0 +1,104 @@ +""" +This script will generate the fluid HTML and RST files in the Fluids folder +""" +from __future__ import print_function + +import os,sys,glob +import CoolProp +import subprocess + +def generate_notebook(fluid): + """ + Generate a new copy of the template notebook with the fluid name changed + """ + lines = open('FluidTemplate.ipynb','r').readlines() + + line_indices_with_fluid = [] + for i in range(len(lines)): + line = lines[i].strip() + if line.startswith("\"Fluid = \'") and line.endswith('\'\\n\",'): + line_indices_with_fluid.append(i) + + # Make sure only one line matches the above criteria + assert(len(line_indices_with_fluid)==1) + i = line_indices_with_fluid[0] + # Get the current fluid in the line + current_fluid = lines[i].split("\"Fluid = \'")[1].split('\'\\n\",')[0] + + # Actually replace the fluid in the line + lines[i] = lines[i].replace(current_fluid, fluid) + + # Write back to temporary file + fp = open('temp.ipynb','w') + fp.write(''.join(lines)) + fp.close() + +stub_template = """{fluid:s} +{line:s} + +View this page as an `IPython notebook `_ + +.. raw:: html + :file: {fluid}.html +""" + +def make_rst_stub(fluid): + """ + Make a stub file that will raw import the generated HTML + """ + s = stub_template.format(fluid = fluid, line = '='*len(fluid)) + fp = open(os.path.join('Fluids',fluid+'.rst'),'w') + fp.write(s) + fp.close() + +def make_html_file(fluid): + """ + Make the + """ + + call = 'runipy temp.ipynb Fluids\{fluid:s}.ipynb --quiet --html Fluids\{fluid:s}.html --template output_toggle --skip-exceptions'.format(fluid=fluid) + print('About to make HTML for '+fluid+'; call:', call) + subprocess.check_output(call, shell = True) + +index_template = """{header:s} +{line:s} + +.. toctree:: + :maxdepth: 1 + + {fluids:s} +""" + +def index_file(Fluids, header): + FluidList = '\n '.join([Fluid+'.rst' for Fluid in Fluids]) + return index_template.format(fluids = FluidList, + header = header, + line = '='*len(header)) + +# Make this function do everything so that we can use a multiprocessing Pool +def do_fluid(fluid): + pass + +if __name__=='__main__': + + if not os.path.exists('Fluids'): + print('making Fluids folder') + os.mkdir('Fluids') + + pure_fluids,pseudo_pure_fluids = [],[] + for fluid in sorted(CoolProp.__fluids__): + make_rst_stub(fluid) + generate_notebook(fluid) + make_html_file(fluid) + if CoolProp.CoolProp.IsFluidType(fluid,'PureFluid'): + pure_fluids.append(fluid) + else: + pseudo_pure_fluids.append(fluid) + + fp = open(os.path.join('Fluids','pure_fluids.rst'),'w') + fp.write(index_file(pure_fluids,"Pure Fluids")) + fp.close() + + fp = open(os.path.join('Fluids','pseudo_pure_fluids.rst'),'w') + fp.write(index_file(pseudo_pure_fluids,"Pseudo-pure Fluids")) + fp.close() \ No newline at end of file diff --git a/Web/Header.py b/Web/Header.py new file mode 100644 index 00000000..97d284a0 --- /dev/null +++ b/Web/Header.py @@ -0,0 +1,20 @@ +import matplotlib.pyplot as plt +from CoolProp.Plots import Ph +from CoolProp.Plots.SimpleCycles import SimpleCycle + +fig=plt.figure(figsize=(6,1)) +ax=fig.add_axes((0,0,1,1)) +ax.set_xlim(0,6) +ax.set_ylim(0,2) +plt.text(3,1,'CoolProp',size=50,name='Times',ha='center',va='center') +ax.axis('off') + +ax2=fig.add_axes((0,0,0.3,1)) +Ph('R410A',lw=2,color='white') +SimpleCycle(Ref='R410A',Te=280,Tc=310,DTsh=5,DTsc=5,eta_a=0.7,Ts_Ph='Ph',axis=ax2,lw=2,color='b') +ax2.set_xlim(-6,600) +ax2.set_ylim(-1000,6000) +ax2.axis('off') +plt.draw() +plt.savefig('_static/header.png',transparent=True) +plt.show() \ No newline at end of file diff --git a/Web/HowGetIt.rst b/Web/HowGetIt.rst new file mode 100644 index 00000000..83e9de78 --- /dev/null +++ b/Web/HowGetIt.rst @@ -0,0 +1,66 @@ +Downloading CoolProp +==================== + +How to get it? +-------------- + +Option 1 (easiest) +^^^^^^^^^^^^^^^^^^ + +Head to https://sourceforge.net/projects/coolprop/files/CoolProp and download the most recent version. Each language has instructions on what you should do. All the files are already compiled and should work out of the box. + +Option 1a (for Python users) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Nightly build installers are also available at https://sourceforge.net/projects/coolprop/files/CoolProp/Nightly for a limited subset of python configurations and are updated every night to be current with the main developer's personal codebase. + +.. warning:: + + Nightly build may break your code, give wacky results, or otherwise. Use at your own risk. + +Option 2 (for Python users) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CoolProp is now on `PyPI `_. If you already have `cython `_ (version > 0.17) installed and your default compiler is already configured (see below), you can just do:: + + easy_install CoolProp + +Or if you already have CoolProp installed, you can upgrade it with:: + + easy_install -U CoolProp + +Or using pip:: + + pip install CoolProp + +Option 3 (developers and the courageous) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CoolProp is an open-source project, and is actively looking for developers. The project is hosted in a git repository on github at:: + + https://github.com/ibell/coolprop + +and you can check out the sources by doing:: + + svn checkout https://github.com/ibell/coolprop coolprop-code + +or if you want to just browse the repository, you can go to https://github.com/ibell/coolprop. + +Compiler Configuration +---------------------- +If you are on OSX or linux/unix, you probably don't have to do anything at all since python will just use the most recent version of gcc. + +If you are a windows user and you have installed Visual Studio 2008 (even the `free express version `_ works) python will default to this compiler and everything should go just fine. Make sure you do not install the 2010 version since python 2.x versions are compiled with Visual Studio 2008 compiler. Yes I know that is annoying. + +The only thing that is a bit tricky if if you have not installed Visual Studio 2008 and instead want to use the MINGW compiler (a windows version of the gcc compiler). It can be installed using the `python(x,y) `_ distribution for instance. In that case, if you are running a command line build of CoolProp, you need to do something like:: + + python setup.py build --compiler=mingw32 install + +Or if you want to use ``easy_install``, you need to create a distutils configuration file called ``distutils.cfg`` located in ``c:\\Python27\\lib\\distutils\\distutils.cfg`` with the contents:: + + [build] + compiler = mingw32 + +Uninstall +--------- +If you don't want CoolProp anymore, just delete the CoolProp folder in the Lib/site-packages folder for your distribution, as well as the CoolProp .egg file in Lib/site-packages diff --git a/Web/HumidAir.ipynb b/Web/HumidAir.ipynb new file mode 100644 index 00000000..77923139 --- /dev/null +++ b/Web/HumidAir.ipynb @@ -0,0 +1,881 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Humid Air Properties" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Humid air can be modeled as a mixture of air and water vapor. In the simplest analysis, water and air are treated as ideal gases but in principle there is interaction between the air and water molecules that must be included through the use of interaction parameters.\n", + "\n", + "Because humid air is a mixture of dry air (treated as a pseudo-pure gas) and water vapor (treated as a real gas), three variables are required to fix the state by the state postulate.\n", + "\n", + "In the analysis that follows, the three parameters that are ultimately needed to calculate everything else are the dry bulb temperature $T$, the total pressure $p$, and the molar fraction of water $\\psi_w$. The molar fraction of air is simply $\\psi_a=1-\\psi_w$.\n", + "\n", + "Of course, it is not so straightforward to measure the mole fraction of water vapor molecules, so other measures are used. There are three different variables that can be used to obtain the mole fraction of water vapor without resorting to iterative methods.\n", + "\n", + "1. Humidity ratio\n", + "\n", + "The humidity ratio $W$ is the ratio of the mass of water vapor to the mass of air in the mixture. Thus the mole fraction of water can be obtained from\n", + "\n", + "$$\\psi_w=\\frac{n_w}{n}=\\frac{n_w}{n_a+n_w}=\\frac{m_w/M_w}{m_a/M_a+m_w/M_w}=\\frac{m_w}{(M_w/M_a)m_a+m_w}=\\frac{1}{(M_w/M_a)/W+1}=\\frac{W}{(M_w/M_a)+W}$$\n", + " \n", + "or\n", + "\n", + "$$\\psi_w=\\frac{W}{\\varepsilon+W}$$\n", + "\n", + "where the ratio of mole masses $\\varepsilon$ is given by $\\varepsilon=M_w/M_a$\n", + "\n", + "2. Relative Humidity\n", + "\n", + "The relative humidity $\\varphi$ is defined as the ratio of the mole fraction of water in the humid air to the saturation mole fraction of water. Because of the presence of air with the water, the pure water saturated vapor pressure $p_{w,s}$ must be multiplied by an enhancement factor $f$ that is very close to one near atmospheric conditions.\n", + "\n", + "Mathematically, the result is\n", + "\n", + "$$\\varphi=\\frac{\\psi_w}{\\psi_{w,s}}$$\n", + "\n", + "where \n", + "\n", + "$$\\psi_{w,s}=\\frac{fp_{w,s}}{p}$$\n", + " \n", + "The product $p_s$ is defined by $p_s=fp_{w,s}$, and $p_{w,s}$ is the saturation pressure of pure water (or ice) at temperature $T$. This yields the result for $\\psi_w$ of\n", + "\n", + "$$\\varphi=\\frac{\\psi_w}{p_s/p}$$\n", + "\n", + "$$\\psi_w=\\frac{\\varphi p_s}{p}$$\n", + "\n", + "3. Dewpoint temperature\n", + "\n", + "The dewpoint temperature is defined as the temperature at which the actual vapor pressure of water is equal to the saturation vapor pressure. At the given dewpoint, the vapor pressure of water is given by\n", + "\n", + "$$p_w=f(p,T_{dp})p_{w,s}(T_{dp})$$\n", + "\n", + "and the mole fraction of water vapor is obtained from\n", + "\n", + "$$ \\psi_w=\\frac{p_w}{p}$$\n", + " \n", + "Once the state has been fixed by a set of $T,p,\\psi_w$, any parameter of interest can be calculated\n", + "\n", + "Molar Volume\n", + "------------\n", + "$$p=\\frac{\\bar R T}{\\bar v}\\left( 1+\\frac{B_m}{\\bar v}+\\frac{C_m}{\\bar v^2}\\right)$$\n", + " \n", + "The bracketed term on the right hand side is the compressibility Z factor, equal to 1 for ideal gas, and is a measure of non-ideality of the air. The virial terms are given by\n", + " \n", + "$$B_m=(1-\\psi_w)^2B_{aa}+2(1-\\psi_w)\\psi_wB_{aw}+\\psi_w^2B_{ww}$$\n", + " \n", + "$$C_m=(1-\\psi_w)^3C_{aaa}+3(1-\\psi_w)^2\\psi_wC_{aaw}+3(1-\\psi_w)\\psi_w^2C_{aww}+\\psi_w^3C_{www}$$\n", + " \n", + "where the virial coefficients are described in ASRAE RP-1485 and their values are provided in :ref:`HA-Validation`. All virial terms are functions only of temperature.\n", + "\n", + "Usually the temperature is known, the water mole fraction is calculated, and $\\bar v$ is found using iterative methods, in HAProps, using a secant solver and the first guess that the compressibility factor is 1.0.\n", + " \n", + "Molar Enthalpy\n", + "--------------\n", + "\n", + "The molar enthalpy of humid air is obtained from\n", + "\n", + "$$\\bar h=(1-\\psi_w)\\bar h_a^o+\\psi_w\\bar h_w^o+\\bar R T \\left[(B_m-T\\frac{dB_m}{dT})\\frac{1}{\\bar v}+\\left(C_m-\\frac{T}{2}\\frac{dC_m}{dT}\\right) \\frac{1}{\\bar v^2}\\right]$$\n", + "\n", + "with $\\bar h$ in kJ/kmol. For both air and water, the full EOS is used to evaluate the enthalpy\n", + "\n", + "$$\\bar h_a^o=\\bar h_0+\\bar RT\\left[ 1+\\tau\\left( \\frac{\\partial \\alpha^o}{\\partial \\tau}\\right)_{\\delta}\\right]$$\n", + "\n", + "which is in kJ/kmol, using the mixture $\\bar v$ to define the parameter $\\delta=1/(\\bar v \\bar \\rho_c)$ for each fluid, and using the critical molar density for the fluid obtained from $\\bar \\rho_c=1000\\rho_c/M$ to give units of mol/m$^3$ . The offset enthalpies for air and water are given by\n", + " \n", + "$$\\bar h_{0,a}=-7,914.149298\\mbox{ kJ/kmol}$$\n", + "$$\\bar h_{0,w}=-0.01102303806\\mbox{ kJ/kmol}$$\n", + " \n", + "respectively. The enthalpy per kg of dry air is given by\n", + "\n", + "$$h=\\bar h\\frac{1+W}{M_{ha}}$$\n", + "\n", + "Enhancement factor\n", + "------------------\n", + "\n", + "The enhancement factor is a parameter that includes the impact of the air on the saturation pressure of water vapor. It is only a function of temperature and pressure, but it must be iteratively obtained due to the nature of the expression for the enhancement factor.\n", + "\n", + "$\\psi_{w,s}$ is given by $\\psi_{w,s}=fp_{w,s}/p$, where $f$ can be obtained from \n", + "\n", + "$$\\ln(f)=\\left[ \\begin{array}{l}\\left [ \\dfrac{(1+k_Tp_{w,s})(p-p_{w,s})-k_T\\dfrac{(p^2-p_{w,s}^2)}{2}}{\\overline {R} T}\\right] \\bar v_{w,s}+\\ln[1-\\beta_H(1-\\psi_{w,s})p]\\\\\n", + " +\\left[\\dfrac{(1-\\psi_{w,s})^2p}{\\bar R T}\\right] B_{aa}-2\\left[\\dfrac{(1-\\psi_{w,s})^2p}{\\bar R T}\\right]B_{aw}-\\left[\\dfrac{(p-p_{w,s}-(1-\\psi_{w,s})^2p)}{\\bar R T}\\right]B_{ww} \\\\\n", + " +\\left[\\dfrac{(1-\\psi_{w,s})^3 p^2}{(\\bar R T)^2}\\right] C_{aaa}+\\left[\\dfrac{3(1-\\psi_{w,s})^2[1-2(1-\\psi_{w,s})]p^2}{2(\\bar R T)^2}\\right]C_{aaw}\\\\\n", + " -\\left[\\dfrac{3(1-\\psi_{w,s})^2\\psi_{w,s}p^2}{(\\bar R T)^2}\\right]C_{aww}-\\left[\\dfrac{(3-2\\psi_{w,s})\\psi_{w,s}^2p^2-p_{w,s}^2}{2(\\bar R T)^2}\\right]C_{www}\\\\\n", + " -\\left[\\dfrac{(1-\\psi_{w,s})^2(-2+3\\psi_{w,s})\\psi_{w,s}p^2}{(\\bar R T)^2}\\right]B_{aa}B_{ww}\\\\\n", + " -\\left[\\dfrac{2(1-\\psi_{w,s})^3(-1+3\\psi_{w,s})p^2}{(\\bar R T)^2}\\right]B_{aa}B_{aw}\\\\\n", + " +\\left[\\dfrac{6(1-\\psi_{w,s})^2\\psi_{w,s}^2p^2}{(\\bar R T)^2}\\right]B_{ww}B_{aw}-\\left[\\dfrac{3(1-\\psi_{w,s})^4p^2}{2(\\bar R T)^2}\\right]B_{aa}^2\\\\\n", + " -\\left[\\dfrac{2(1-\\psi_{w,s})^2\\psi_{w,s}(-2+3\\psi_{w,s})p^2}{(\\bar R T)^2}\\right]B_{aw}^2-\\left[\\dfrac{p_{w,s}^2-(4-3\\psi_{w,s})(\\psi_{w,s})^3p^2}{2(\\bar R T)^2}\\right]B_{ww}^2\n", + " \\end{array}\\right]$$\n", + "\n", + "\n", + "Isothermal Compressibility\n", + "--------------------------\n", + "\n", + "For water, the isothermal compressibility [in 1/Pa] is evaluated from\n", + "\n", + "$$k_T=\\frac{1}{\\rho\\frac{\\partial p}{\\partial \\rho}}\\frac{1\\mbox{ kPa}}{1000\\mbox{ Pa}}$$\n", + " \n", + "with\n", + "$$\\frac{\\partial p}{\\partial \\rho}=RT\\left[1+2\\delta\\left(\\frac{\\partial \\alpha^r}{\\partial \\delta}\\right)_{\\tau}+\\delta^2\\left(\\frac{\\partial^2 \\alpha^r}{\\partial \\delta^2}\\right)_{\\tau}\\right]$$\n", + " \n", + "in kPa/(kg/m$^3$). And for ice,\n", + "\n", + "$$k_T=\\left( \\frac{\\partial^2 g}{\\partial p^2}\\right) \\left( \\frac{\\partial g}{\\partial p}\\right)_T^{-1}\\frac{1\\mbox{ kPa}}{1000\\mbox{ Pa}}$$\n" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Sample HAProps Code" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#import the things you need \n", + "from CoolProp.HumidAirProp import HAProps, HAProps_Aux" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Enthalpy (kJ per kg dry air) as a function of temperature, pressure, \n", + "# and relative humidity at dry bulb temperature T of 25C, pressure \n", + "# P of one atmosphere, relative humidity R of 50%\n", + "h = HAProps('H','T',298.15,'P',101.325,'R',0.5); print h" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "50.4249283433\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Temperature of saturated air at the previous enthalpy\n", + "T = HAProps('T','P',101.325,'H',h,'R',1.0); print T" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "290.962168888\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Temperature of saturated air - order of inputs doesn't matter\n", + "T = HAProps('T','H',h,'R',1.0,'P',101.325); print T" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "290.962168888\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "execfile('Validation/HAValidation.py')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " Replicating the tables from ASHRAE RP-1485\n", + " \n", + "A.6.1 Psychrometric Properties of Moist Air at 0C and Below\n", + "Saturated air at 101.325 kPa\n", + "====================================================\n", + " T Ws v h s \n", + " C kgw/kg_da m3/kgda kJ/kgda kJ/kgda/K\n", + "----------------------------------------------------\n", + " -60 0.0000067 0.6027 -60.325 -0.2488\n", + " -55 0.0000129 0.6169 -55.280 -0.2255\n", + " -50 0.0000243 0.6312 -50.222 -0.2026\n", + " -45 0.0000445 0.6454 -45.144 -0.1801\n", + " -40 0.0000793 0.6597 -40.031 -0.1580\n", + " -35 0.0001379 0.6740 -34.859 -0.1360\n", + " -30 0.0002345 0.6883 -29.593 -0.1142\n", + " -25 0.0003905 0.7027 -24.181 -0.0921\n", + " -20 0.0006373 0.7172 -18.542 -0.0696\n", + " -15 0.0010207 0.7319 -12.560 -0.0462\n", + " -10 0.0016062 0.7468 -6.070 -0.0213\n", + " -5 0.0024863 0.7622 1.165 0.0059\n", + " 0 0.0037900 0.7780 9.475 0.0366\n", + "====================================================\n", + " \n", + "A.6.2 Psychrometric Properties of Moist Air at 0C and Above\n", + "Saturated air at 101.325 kPa\n", + "====================================================\n", + " T Ws v h s \n", + " C kgw/kg_da m3/kgda kJ/kgda kJ/kgda/K\n", + "----------------------------------------------------\n", + " 0 0.0037900 0.778 9.47 0.0366\n", + " 5 0.0054247 0.794 18.64 0.0698\n", + " 10 0.0076627 0.812 29.35 0.1080\n", + " 15 0.0106941 0.830 42.12 0.1527\n", + " 20 0.0147612 0.850 57.56 0.2058\n", + " 25 0.0201746 0.872 76.51 0.2700\n", + " 30 0.0273348 0.896 100.02 0.3483\n", + " 35 0.0367629 0.924 129.47 0.4449" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 40 0.0491482 0.957 166.70 0.5651\n", + " 45 0.0654207 0.995 214.18 0.7163\n", + " 50 0.0868683 1.042 275.37 0.9082\n", + " 55 0.1153322 1.101 355.17 1.1550\n", + " 60 0.1535507 1.175 460.90 1.4776\n", + " 65 0.2057991 1.273 604.02 1.9085\n", + " 70 0.2791706 1.405 803.49 2.5012\n", + " 75 0.3863989 1.593 1093.39 3.3518\n", + " 80 0.5529205 1.881 1541.78 4.6511\n", + " 85 0.8380888 2.366 2307.48 6.8430\n", + " 90 1.4201956 3.349 3867.53 11.2556" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "====================================================\n", + " \n", + "A.8.1 Psychrometric Properties of Moist Air at 101.325 kPa \n", + "Dry Bulb temperature of 200C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 45.07 1.341 202.52 0.5561 0.0000\n", + " 0.05 55.38 1.448 346.49 1.0298 0.4849\n", + " 0.10 61.85 1.556 490.43 1.4735 0.9026\n", + " 0.20 69.95 1.771 778.25 2.3336 1.5856" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.30 75.00 1.986 1066.01 3.1751 2.1204\n", + " 0.40 78.51 2.201 1353.73 4.0058 2.5506\n", + " 0.50 81.12 2.416 1641.42 4.8294 2.9041\n", + " 0.60 83.14 2.630 1929.09 5.6479 3.1997" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.70 84.76 2.845 2216.73 6.4623 3.4506\n", + " 0.80 86.09 3.060 2504.37 7.2736 3.6662\n", + " 0.90 87.20 3.274 2791.99 8.0824 3.8535" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 1.00 88.15 3.489 3079.60 8.8890 4.0176\n", + "================================================================\n", + " \n", + "A.8.2 Psychrometric Properties of Moist Air at 1000 kPa \n", + "Dry Bulb temperature of 200C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 90.47 0.136 201.94 -0.1011 0.0000\n", + " 0.05 107.30 0.147 345.60 0.3166 4.7855\n", + " 0.10 117.69 0.158 488.97 0.7069 8.9081" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.20 130.61 0.179 775.07 1.4594 15.6487\n", + " 0.30 138.66 0.200 1060.53 2.1927 20.9270\n", + " 0.40 144.29 0.222 1345.53 2.9148 25.1723\n", + " 0.50 148.48 0.243 1630.17 3.6294 28.6608" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.60 151.75 0.264 1914.54 4.3385 31.5783\n", + " 0.70 154.38 0.284 2198.70 5.0434 34.0545\n", + " 0.80 156.55 0.305 2482.69 5.7450 36.1824\n", + " 0.90 158.37 0.326 2766.53 6.4439 38.0306" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 1.00 159.92 0.347 3050.26 7.1405 39.6510\n", + "================================================================\n", + " \n", + "A.8.3 Psychrometric Properties of Moist Air at 2000 kPa \n", + "Dry Bulb temperature of 200C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 105.92 0.068 201.34 -0.3001 0.0000\n", + " 0.05 125.81 0.074 344.62 0.0981 9.3460\n", + " 0.10 138.02 0.079 487.33 0.4716 17.3974\n", + " 0.20 153.19 0.089 771.38 1.1899 30.5616\n", + " 0.30 162.65 0.100 1054.03 1.8880 40.8700" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.40 169.27 0.110 1335.64 2.5742 49.1611\n", + " 0.50 174.23 0.120 1616.43 3.2524 55.9741\n", + " 0.60 178.10 0.130 1896.58 3.9247 61.6720\n", + " 0.70 181.22 0.140 2176.21 4.5923 66.5079\n", + " 0.80 183.80 0.150 2455.41 5.2564 70.6636\n", + " 0.90 185.97 0.160 2734.26 5.9175 74.2732\n", + " 1.00 187.83 0.169 3012.79 6.5761 77.4377\n", + "================================================================\n", + " \n", + "A.8.4 Psychrometric Properties of Moist Air at 5000 kPa \n", + "Dry Bulb temperature of 200C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 126.87 0.028 199.72 -0.5631 0.0000\n", + " 0.05 151.75 0.030 341.85 -0.1967 21.5409\n", + " 0.10 166.94 0.032 482.37 0.1531 40.0981" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.15 177.62 0.034 621.47 0.4909 56.2513\n", + " 0.20 185.71 0.036 759.34 0.8208 70.4393\n", + " 0.25 192.14 0.037 896.09 1.1450 83.0001\n", + " 0.30 197.41 0.039 1031.82 1.4646 94.1985\n", + "================================================================\n", + " \n", + "A.8.5 Psychrometric Properties of Moist Air at 10,000 kPa \n", + "Dry Bulb temperature of 200C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 142.19 0.014 197.66 -0.7620 0.0000\n", + " 0.05 171.30 0.015 337.69 -0.4296 39.4555\n", + " 0.10 188.91 0.016 473.92 -0.1009 73.4458\n", + "================================================================\n", + " \n", + "A.9.1 Psychrometric Properties of Moist Air at 101.325 kPa \n", + "Dry Bulb temperature of 320C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 54.90 1.681 326.93 0.7902 0.0000\n", + " 0.05 62.07 1.816 482.76 1.2863 0.0668" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.10 67.00 1.951 638.59 1.7524 0.1244\n", + " 0.20 73.54 2.221 950.21 2.6572 0.2185\n", + " 0.30 77.79 2.491 1261.80 3.5435 0.2922\n", + " 0.40 80.80 2.761 1573.37 4.4191 0.3515" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.50 83.07 3.030 1884.93 5.2875 0.4002\n", + " 0.60 84.85 3.300 2196.47 6.1508 0.4409\n", + " 0.70 86.28 3.570 2508.01 7.0101 0.4755\n", + " 0.80 87.46 3.840 2819.54 7.8663 0.5052" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.90 88.45 4.109 3131.07 8.7199 0.5310\n", + " 1.00 89.29 4.379 3442.59 9.5714 0.5536\n", + "================================================================\n", + " \n", + "A.9.2 Psychrometric Properties of Moist Air at 1000 kPa \n", + "Dry Bulb temperature of 320C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 107.70 0.171 326.80 0.1330 0.0000\n", + " 0.05 118.99 0.185 482.46 0.5740 0.6594" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.10 126.73 0.198 637.99 0.9870 1.2275\n", + " 0.20 137.02 0.225 948.77 1.7854 2.1563\n", + " 0.30 143.73 0.252 1259.26 2.5651 2.8836\n", + " 0.40 148.52 0.279 1569.56 3.3339 3.4686" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.50 152.14 0.306 1879.70 4.0955 3.9493\n", + " 0.60 154.98 0.333 2189.73 4.8519 4.3514\n", + " 0.70 157.28 0.360 2499.68 5.6042 4.6926\n", + " 0.80 159.18 0.387 2809.55 6.3534 4.9858" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.90 160.79 0.414 3119.37 7.0999 5.2405\n", + " 1.00 162.15 0.441 3429.15 7.8444 5.4637\n", + "================================================================\n", + " \n", + "A.9.3 Psychrometric Properties of Moist Air at 2000 kPa \n", + "Dry Bulb temperature of 320C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 126.92 0.086 326.68 -0.0659 0.0000\n", + " 0.05 140.12 0.093 482.14 0.3565 1.3188" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.10 149.16 0.099 637.35 0.7532 2.4550\n", + " 0.20 161.19 0.113 947.16 1.5187 4.3126\n", + " 0.30 169.06 0.126 1256.41 2.2654 5.7673\n", + " 0.40 174.70 0.140 1565.23 3.0010 6.9373" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.50 178.97 0.153 1873.75 3.7292 7.8987\n", + " 0.60 182.34 0.166 2182.04 4.4521 8.7027\n", + " 0.70 185.07 0.179 2490.14 5.1709 9.3851\n", + " 0.80 187.34 0.192 2798.09 5.8864 9.9716" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.90 189.24 0.206 3105.93 6.5994 10.4809\n", + " 1.00 190.88 0.219 3413.67 7.3101 10.9275\n", + "================================================================\n", + " \n", + "A.9.4 Psychrometric Properties of Moist Air at 5000 kPa \n", + "Dry Bulb temperature of 320C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 154.63 0.035 326.46 -0.3289 0.0000\n", + " 0.05 170.96 0.037 481.31 0.0647 3.2971" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.10 182.16 0.040 635.49 0.4393 6.1375\n", + " 0.15 190.54 0.043 789.13 0.8029 8.6099\n", + " 0.20 197.13 0.045 942.31 1.1599 10.7816\n", + " 0.25 202.50 0.048 1095.11 1.5121 12.7042" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.30 206.98 0.050 1247.59 1.8607 14.4182\n", + " 0.40 214.09 0.056 1551.73 2.5500 17.3432\n", + " 0.50 219.51 0.061 1855.02 3.2314 19.7467\n", + " 0.60 223.81 0.066 2157.63 3.9071 21.7568" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.70 227.32 0.071 2459.71 4.5785 23.4628\n", + " 0.80 230.24 0.076 2761.36 5.2464 24.9289\n", + " 0.90 232.72 0.081 3062.64 5.9114 26.2023\n", + " 1.00 234.84 0.085 3363.63 6.5741 27.3187" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "================================================================\n", + " \n", + "A.9.5 Psychrometric Properties of Moist Air at 10,000 kPa \n", + "Dry Bulb temperature of 320C\n", + "================================================================\n", + " W Twb v h s RH \n", + " kgw/kg_da C m3/kgda kJ/kgda kJ/kgda/K % \n", + "----------------------------------------------------------------\n", + " 0.00 176.71 0.018 326.51 -0.5279 0.0000\n", + " 0.05 195.84 0.019 480.31 -0.1628 6.5942\n", + " 0.10 208.99 0.020 632.70 0.1940 12.2750\n", + " 0.15 218.85 0.022 783.90 0.5394 17.2199" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.20 226.63 0.023 934.12 0.8776 21.5632\n", + " 0.25 232.99 0.024 1083.47 1.2106 25.4084\n", + " 0.30 238.33 0.025 1232.08 1.5398 28.8365\n", + " 0.40 246.84 0.028 1527.40 2.1891 34.6863" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.50 253.39 0.030 1820.61 2.8296 39.4934\n", + " 0.60 258.63 0.032 2112.08 3.4633 43.5136\n", + " 0.70 262.94 0.034 2402.10 4.0919 46.9257\n", + " 0.80 266.55 0.036 2690.88 4.7164 49.8578" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " 0.90 269.63 0.039 2978.59 5.3373 52.4046\n", + " 1.00 272.29 0.041 3265.36 5.9553 54.6373\n", + "================================================================\n", + "\n", + "Pure fluid Virial Coefficients\n", + "------------------------------\n", + "T Baa Caaa Bww Cwww \n", + "C m^3/mol m^6/mol^2 m^3/mol m^6/mol^2 \n", + "-60.0 -3.3064504913e-05 2.1778824938e-09 -1.1174019230e-02 -1.5162999202e-04 \n", + "-50.0 -2.8932056455e-05 2.1163899675e-09 -7.8721344601e-03 -8.7876443450e-05 \n", + "-40.0 -2.5223205510e-05 2.0616654251e-09 -5.7127237936e-03 -5.5471169827e-05 \n", + "-30.0 -2.1877241883e-05 2.0127194393e-09 -4.2586206439e-03 -3.6054469559e-05 \n", + "-20.0 -1.8844568169e-05 1.9687401829e-09 -3.2532396168e-03 -2.3880059931e-05 \n", + "-10.0 -1.6084254149e-05 1.9290560799e-09 -2.5411800904e-03 -1.6072255381e-05 \n", + "0.0 -1.3562212432e-05 1.8931073782e-09 -2.0256198165e-03 -1.0976417740e-05 \n", + "10.0 -1.1249818308e-05 1.8604242748e-09 -1.6446680868e-03 -7.5982163024e-06 \n", + "20.0 -9.1228522265e-06 1.8306099144e-09 -1.3578320706e-03 -5.3262052029e-06 \n", + "30.0 -7.1606799362e-06 1.8033270512e-09 -1.1380508933e-03 -3.7775459437e-06 \n", + "40.0 -5.3456100212e-06 1.7782874940e-09 -9.6688526113e-04 -2.7086428677e-06 \n", + "50.0 -3.6623854498e-06 1.7552436864e-09 -8.3154379347e-04 -1.9621727951e-06 \n", + "60.0 -2.0977774966e-06 1.7339819395e-09 -7.2300490095e-04 -1.4351073680e-06 \n", + "70.0 -6.4025867871e-07 1.7143169545e-09 -6.3480699108e-04 -1.0590893524e-06 \n", + "80.0 7.2026273739e-07 1.6960873599e-09 -5.6225490863e-04 -7.8820575279e-07 \n", + "90.0 1.9926598215e-06 1.6791520531e-09 -5.0189060427e-04 -5.9126042925e-07 \n", + "100.0 3.1847656914e-06 1.6633871834e-09 -4.5113452236e-04 -4.4682459202e-07 \n", + "110.0 4.3035215681e-06 1.6486836511e-09 -4.0803910950e-04 -3.4002631896e-07 \n", + "120.0 5.3551001609e-06 1.6349450222e-09 -3.7111708564e-04 -2.6044312214e-07 \n", + "130.0 6.3450090665e-06 1.6220857829e-09 -3.3922027793e-04 -2.0070289771e-07 \n", + "140.0 7.2781778723e-06 1.6100298701e-09 -3.1145310612e-04 -1.5554517129e-07 \n", + "150.0 8.1590318924e-06 1.5987094301e-09 -2.8711011151e-04 -1.2118478060e-07 \n", + "160.0 8.9915548780e-06 1.5880637641e-09 -2.6563036496e-04 -9.4876383834e-08 \n", + "170.0 9.7793425843e-06 1.5780384311e-09 -2.4656385529e-04 -7.4613666456e-08 \n", + "180.0 1.0525648716e-05 1.5685844791e-09 -2.2954647025e-04 -5.8919760770e-08 \n", + "190.0 1.1233424489e-05 1.5596577861e-09 -2.1428120144e-04 -4.6699996544e-08 \n", + "200.0 1.1905352827e-05 1.5512184922e-09 -2.0052390022e-04 -3.7137617887e-08 \n", + "T Baw Caaw Caww \n", + "C m^3/mol m^6/mol^2 m^6/mol^2 \n", + "-60.0 -6.8305808721e-05 1.0273000716e-09 -1.8214316825e-06 \n", + "-50.0 -6.1680233064e-05 1.0001595421e-09 -1.1787612409e-06 \n", + "-40.0 -5.5836203092e-05 9.7107903308e-10 -7.9593677251e-07 \n", + "-30.0 -5.0645881561e-05 9.4180678583e-10 -5.5678343751e-07 \n", + "-20.0 -4.6007498746e-05 9.1337025409e-10 -4.0128618357e-07 \n", + "-10.0 -4.1839118849e-05 8.8634392341e-10 -2.9668474376e-07 \n", + "0.0 -3.8074090909e-05 8.6101819497e-10 -2.2423408862e-07 \n", + "10.0 -3.4657682115e-05 8.3750672364e-10 -1.7276396504e-07 \n", + "20.0 -3.1544553729e-05 8.1581500536e-10 -1.3537862024e-07 \n", + "30.0 -2.8696845981e-05 7.9588431449e-10 -1.0768721224e-07 \n", + "40.0 -2.6082708793e-05 7.7761982700e-10 -8.6816421215e-08 \n", + "50.0 -2.3675162869e-05 7.6090853025e-10 -7.0839762898e-08 \n", + "60.0 -2.1451208360e-05 7.4563050528e-10 -5.8437245597e-08 \n", + "70.0 -1.9391120996e-05 7.3166589756e-10 -4.8686625860e-08 \n", + "80.0 -1.7477891584e-05 7.1889908286e-10 -4.0932107713e-08 \n", + "90.0 -1.5696776156e-05 7.0722101405e-10 -3.4699849863e-08 \n", + "100.0 -1.4034932249e-05 6.9653039669e-10 -2.9642457363e-08 \n", + "110.0 -1.2481122776e-05 6.8673412025e-10 -2.5501820730e-08 \n", + "120.0 -1.1025473368e-05 6.7774722643e-10 -2.2083805133e-08 \n", + "130.0 -9.6592722783e-06 6.6949259959e-10 -1.9240735645e-08 \n", + "140.0 -8.3748044505e-06 6.6190050073e-10 -1.6859099163e-08 \n", + "150.0 -7.1652131416e-06 6.5490802360e-10 -1.4850792059e-08 \n", + "160.0 -6.0243839304e-06 6.4845852337e-10 -1.3146812982e-08 \n", + "170.0 -4.9468470096e-06 6.4250104926e-10 -1.1692664630e-08 \n", + "180.0 -3.9276944932e-06 6.3698980018e-10 -1.0444965002e-08 \n", + "190.0 -2.9625101219e-06 6.3188361380e-10 -9.3689246298e-09 \n", + "200.0 -2.0473092535e-06 6.2714549461e-10 -8.4364506623e-09 \n", + "\n", + "Pure fluid Virial Coefficients Derivatives\n", + "------------------------------------------\n", + "T dBaa dCaaa dBww dCwww \n", + "C m^3/mol m^6/mol^2 m^3/mol m^6/mol^2 \n", + "-60.0 4.3678901718e-07 -6.5260142915e-12 4.0907134267e-04 9.7890226354e-06 \n", + "-50.0 3.9094567047e-07 -5.7926592167e-12 2.6368394754e-04 4.2599502947e-06 \n", + "-40.0 3.5183089770e-07 -5.1686581014e-12 1.7524578197e-04 2.4534393299e-06 \n", + "-30.0 3.1818443574e-07 -4.6340080568e-12 1.1972698408e-04 1.5168065377e-06 \n", + "-20.0 2.8902947780e-07 -4.1729893295e-12 8.3872099442e-05 9.6398593676e-07 \n", + "-10.0 2.6359917737e-07 -3.7731243933e-12 6.0116039515e-05 6.2432369125e-07 \n", + "0.0 2.4128450184e-07 -3.4244179438e-12 4.4005975878e-05 4.1098208661e-07 \n", + "10.0 2.2159662973e-07 -3.1187949704e-12 3.2846510930e-05 2.7460403742e-07 \n", + "20.0 2.0413943007e-07 -2.8496804340e-12 2.4963984884e-05 1.8603616949e-07 \n", + "30.0 1.8858904489e-07 -2.6116814716e-12 1.9294782853e-05 1.2767077184e-07 \n", + "40.0 1.7467855065e-07 -2.4003447122e-12 1.5148499662e-05 8.8680545113e-08 \n", + "50.0 1.6218630137e-07 -2.2119692232e-12 1.2068194612e-05 6.2299023007e-08 \n", + "60.0 1.5092697458e-07 -2.0434610819e-12 9.7459891450e-06 4.4233628528e-08 \n", + "70.0 1.4074462510e-07 -1.8922193892e-12 7.9709845791e-06 3.1722703755e-08 \n", + "80.0 1.3150724657e-07 -1.7560462466e-12 6.5964818172e-06 2.2965939524e-08 \n", + "90.0 1.2310247686e-07 -1.6330751509e-12 5.5189694206e-06 1.6775066230e-08 \n", + "100.0 1.1543417961e-07 -1.5217136531e-12 4.6644255474e-06 1.2356544597e-08 \n", + "110.0 1.0841970276e-07 -1.4205971497e-12 3.9792467564e-06 9.1745433381e-09 \n", + "120.0 1.0198766459e-07 -1.3285514223e-12 3.4241524938e-06 6.8634361312e-09 \n", + "130.0 9.6076153981e-08 -1.2445620955e-12 2.9700329278e-06 5.1712462037e-09 \n", + "140.0 9.0631258338e-08 -1.1677496028e-12 2.5950842306e-06 3.9226745555e-09 \n", + "150.0 8.5605852607e-08 -1.0973485627e-12 2.2828082790e-06 2.9946680051e-09 \n", + "160.0 8.0958597486e-08 -1.0326907048e-12 2.0206000698e-06 2.3001073053e-09 \n", + "170.0 7.6653106484e-08 -9.7319067118e-13 1.7987394663e-06 1.7768097024e-09 \n", + "180.0 7.2657249944e-08 -9.1833415579e-13 1.6096642209e-06 1.3800451723e-09 \n", + "190.0 6.8942570813e-08 -8.6766795626e-13 1.4474407409e-06 1.0773983166e-09 \n", + "200.0 6.5483792067e-08 -8.2079159614e-13 1.3073752610e-06 8.4521068723e-10 \n", + "T dBaw dCaaw dCaww \n", + "C m^3/mol m^6/mol^2 m^6/mol^2 \n", + "-60.0 7.0671067841e-07 -2.5329306643e-12 8.3652108680e-08 \n", + "-50.0 6.2109405080e-07 -2.8479923244e-12 4.8634111869e-08 \n", + "-40.0 5.4982837510e-07 -2.9396633262e-12 2.9766967562e-08 \n", + "-30.0 4.8992187794e-07 -2.8980941059e-12 1.9020412856e-08 \n", + "-20.0 4.3911281598e-07 -2.7799104397e-12 1.2604799172e-08 \n", + "-10.0 3.9566848048e-07 -2.6206893674e-12 8.6179394263e-09 \n", + "0.0 3.5824516845e-07 -2.4426731561e-12 6.0532052853e-09 \n", + "10.0 3.2578908214e-07 -2.2596007123e-12 4.3529611359e-09 \n", + "20.0 2.9746516934e-07 -2.0797672895e-12 3.1957227862e-09 \n", + "30.0 2.7260533603e-07 -1.9079803096e-12 2.3895374649e-09 \n", + "40.0 2.5067028507e-07 -1.7468190020e-12 1.8161835419e-09 \n", + "50.0 2.3122106772e-07 -1.5974502672e-12 1.4008122071e-09 \n", + "60.0 2.1389764536e-07 -1.4601590182e-12 1.0948500459e-09 \n", + "70.0 1.9840257004e-07 -1.3346933582e-12 8.6606704976e-10 \n", + "80.0 1.8448844334e-07 -1.2204888941e-12 6.9264384038e-10 \n", + "90.0 1.7194819305e-07 -1.1168137618e-12 5.5953719449e-10 \n", + "100.0 1.6060747132e-07 -1.0228614572e-12 4.5620187444e-10 \n", + "110.0 1.5031866448e-07 -9.3780925812e-13 3.7513243420e-10 \n", + "120.0 1.4095613794e-07 -8.6085397191e-13 3.1091182225e-10 \n", + "130.0 1.3241243488e-07 -7.9123279439e-13 2.5957962745e-10 \n", + "140.0 1.2459521736e-07 -7.2823445525e-13 2.1820572123e-10 \n", + "150.0 1.1742478936e-07 -6.7120410110e-13 1.8459817415e-10 \n", + "160.0 1.1083207914e-07 -6.1954421544e-13 1.5710036152e-10 \n", + "170.0 1.0475698647e-07 -5.7271310484e-13 1.3444819325e-10 \n", + "180.0 9.9147021510e-08 -5.3022196394e-13 1.1566843627e-10 \n", + "190.0 9.3956178059e-08 -4.9163118437e-13 1.0000548446e-10 \n", + "200.0 8.9143996459e-08 -4.5654633851e-13 8.6868060073e-11 \n", + "\n", + "Water saturation pressure p_ws [kPa]\n", + "T p_ws \n", + "C kPa \n", + "-60.00 1.0813475449e-03 \n", + "-30.00 3.8005139487e-02 \n", + "0.00 6.1115347506e-01 \n", + "30.00 4.2469708368e+00 \n", + "60.00 1.9946434308e+01 \n", + "90.00 7.0181765815e+01 \n", + "120.00 1.9867442048e+02 \n", + "150.00 4.7616453797e+02 \n", + "180.00 1.0028105361e+03 \n", + "210.00 1.9076749935e+03 \n", + "240.00 3.3469251443e+03 \n", + "270.00 5.5029867830e+03 \n", + "300.00 8.5879049408e+03 \n", + "\n", + "Henry Constant (zero for T < 273.15 K)\n", + "T beta_H \n", + "C 1/Pa \n", + "0.01 2.2594716179e-10 \n", + "30.01 1.3057686757e-10 \n", + "60.01 1.0117585230e-10 \n", + "90.01 9.5497883156e-11 \n", + "120.01 1.0310426319e-10 \n", + "150.01 1.2208023220e-10 \n", + "180.01 1.5413827679e-10 \n", + "210.01 2.0381389558e-10 \n", + "240.01 2.7937239532e-10 \n", + "270.01 3.9585779756e-10 \n", + "300.01 5.8395612126e-10 \n", + "\n", + "Isothermal Compressibility of water (kT) [1/Pa]\n", + "T p = 101.325 kPa p = 200.000 kPa p = 500.000 kPa p = 1000.000 kPa \n", + "-60.00 1.0771099108e-10 1.0770400843e-10 1.0768278304e-10 1.0764742021e-10 \n", + "-30.00 1.1257575753e-10 1.1256891351e-10 1.1254810951e-10 1.1251344878e-10 \n", + "0.00 1.1778484390e-10 1.1777815515e-10 1.1775782318e-10 1.1772394894e-10 \n", + "30.00 4.4769215926e-10 4.4757839136e-10 4.4723283185e-10 4.4665799039e-10 \n", + "60.00 4.4498410831e-10 4.4486168535e-10 4.4448993304e-10 4.4387184012e-10 \n", + "90.00 4.7435252886e-10 4.7420162082e-10 4.7374350233e-10 4.7298225299e-10 \n", + "120.00 9.9921266547e-06 5.3127559838e-10 5.3065807736e-10 5.2963267414e-10 \n", + "150.00 9.9549778368e-06 5.0900764947e-06 6.2035875947e-10 6.1886730491e-10 \n", + "180.00 9.9321723168e-06 5.0649930128e-06 2.0719460530e-06 1.0891981409e-06 \n", + "210.00 9.9171060788e-06 5.0489353919e-06 2.0523969176e-06 1.0591708688e-06 \n", + "240.00 9.9066182763e-06 5.0379724346e-06 2.0398484121e-06 1.0433310707e-06 \n", + "270.00 9.8990250188e-06 5.0301347121e-06 2.0312151859e-06 1.0331629008e-06 \n", + "300.00 9.8933577364e-06 5.0243339669e-06 2.0249872999e-06 1.0261419911e-06 \n", + "\n", + "Molar volume of saturated liquid water or ice (vbar_ws) [m^3/mol_H2O]\n", + "T p = 101.325 kPa p = 200.000 kPa p = 500.000 kPa p = 1000.000 kPa \n", + "-60.00 1.9483369646e-05 1.9483369439e-05 1.9483368809e-05 1.9483367760e-05 \n", + "-30.00 1.9562529421e-05 1.9562529203e-05 1.9562528542e-05 1.9562527441e-05 \n", + "0.00 1.9652071280e-05 1.9652071051e-05 1.9652070357e-05 1.9652069200e-05 \n", + "30.00 1.8094773222e-05 1.8094773222e-05 1.8094773222e-05 1.8094773222e-05 \n", + "60.00 1.8323837443e-05 1.8323837443e-05 1.8323837443e-05 1.8323837443e-05 \n", + "90.00 1.8662959891e-05 1.8662959891e-05 1.8662959891e-05 1.8662959891e-05 \n", + "120.00 1.9102048132e-05 1.9102048132e-05 1.9102048132e-05 1.9102048132e-05 \n", + "150.00 1.9645709876e-05 1.9645709876e-05 1.9645709876e-05 1.9645709876e-05 \n", + "180.00 2.0310359748e-05 2.0310359748e-05 2.0310359748e-05 2.0310359748e-05 \n", + "210.00 2.1126885602e-05 2.1126885602e-05 2.1126885602e-05 2.1126885602e-05 \n", + "240.00 2.2149039824e-05 2.2149039824e-05 2.2149039824e-05 2.2149039824e-05 \n", + "270.00 2.3473849596e-05 2.3473849596e-05 2.3473849596e-05 2.3473849596e-05 \n", + "300.00 2.5297523418e-05 2.5297523418e-05 2.5297523418e-05 2.5297523418e-05 \n", + "\n", + "Enhancement factor (f) [no units]\n", + "T p = 101.325 kPa p = 200.000 kPa p = 500.000 kPa p = 1000.000 kPa p = 10000.000 kPa \n", + "-60.00 1.0070775889e+00 1.0140339781e+00 1.0356182636e+00 1.0730973477e+00 2.2389390546e+00 \n", + "-40.00 1.0056000404e+00 1.0110608387e+00 1.0279266148e+00 1.0569409234e+00 1.8450352638e+00 \n", + "-20.00 1.0046363568e+00 1.0090315492e+00 1.0225621568e+00 1.0456875572e+00 1.6193681609e+00 \n", + "0.00 1.0041972674e+00 1.0078137837e+00 1.0189177380e+00 1.0378059899e+00 1.4778434071e+00 \n", + "40.00 1.0048337252e+00 1.0074421063e+00 1.0151963055e+00 1.0282275463e+00 1.3082438296e+00 \n", + "80.00 1.0057272574e+00 1.0097059521e+00 1.0168897804e+00 1.0272924733e+00 1.2343415716e+00 \n", + "120.00 1.0000000000e+00 1.0001669826e+00 1.0183856144e+00 1.0312270796e+00 1.2048251925e+00 \n", + "160.00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0231647562e+00 1.2031656032e+00 \n", + "200.00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.2128828351e+00 " + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "250.00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.1903237721e+00 \n", + "300.00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0480338876e+00 \n", + "350.00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 1.0000000000e+00 \n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/Web/HumidAir.rst b/Web/HumidAir.rst new file mode 100644 index 00000000..bd9ccb52 --- /dev/null +++ b/Web/HumidAir.rst @@ -0,0 +1,272 @@ +.. _Humid-Air: + +Humid Air Properties +******************** + +If you are feeling impatient, jump to :ref:`HAProps_Sample`, or to go to the code documentation :mod:`CoolProp.HumidAirProp`, otherwise, hang in there. + +Humid air can be modeled as a mixture of air and water vapor. In the simplest analysis, water and air are treated as ideal gases but in principle there is interaction between the air and water molecules that must be included through the use of interaction parameters. + +Because humid air is a mixture of dry air (treated as a pseudo-pure gas) and water vapor (treated as a real gas), three variables are required to fix the state by the state postulate. + +In the analysis that follows, the three parameters that are ultimately needed to calculate everything else are the dry bulb temperature :math:`T`, the total pressure :math:`p`, and the molar fraction of water :math:`\psi_w`. The molar fraction of air is simply :math:`\psi_a=1-\psi_w`. + +Of course, it is not so straightforward to measure the mole fraction of water vapor molecules, so other measures are used. There are three different variables that can be used to obtain the mole fraction of water vapor without resorting to iterative methods. + +1. Humidity ratio + +The humidity ratio :math:`W` is the ratio of the mass of water vapor to the mass of air in the mixture. Thus the mole fraction of water can be obtained from + +.. math:: + + \psi_w=\frac{n_w}{n}=\frac{n_w}{n_a+n_w}=\frac{m_w/M_w}{m_a/M_a+m_w/M_w}=\frac{m_w}{(M_w/M_a)m_a+m_w}=\frac{1}{(M_w/M_a)/W+1}=\frac{W}{(M_w/M_a)+W} + +or + +.. math:: + + \psi_w=\frac{W}{\varepsilon+W} + +where the ratio of mole masses :math:`\varepsilon` is given by :math:`\varepsilon=M_w/M_a` + +2. Relative Humidity + +The relative humidity :math:`\varphi` is defined as the ratio of the mole fraction of water in the humid air to the saturation mole fraction of water. Because of the presence of air with the water, the pure water saturated vapor pressure :math:`p_{w,s}` must be multiplied by an enhancement factor :math:`f` that is very close to one near atmospheric conditions. + +Mathematically, the result is + +.. math:: + + \varphi=\frac{\psi_w}{\psi_{w,s}} + +where + +.. math:: + + \psi_{w,s}=\frac{fp_{w,s}}{p} + +The product :math:`p_s` is defined by :math:`p_s=fp_{w,s}`, and :math:`p_{w,s}` is the saturation pressure of pure water (or ice) at temperature :math:`T`. This yields the result for :math:`\psi_w` of + +.. math:: + + \varphi=\frac{\psi_w}{p_s/p} + +.. math:: + + \psi_w=\frac{\varphi p_s}{p} + +3. Dewpoint temperature + +The dewpoint temperature is defined as the temperature at which the actual vapor pressure of water is equal to the saturation vapor pressure. At the given dewpoint, the vapor pressure of water is given by + +.. math:: + + p_w=f(p,T_{dp})p_{w,s}(T_{dp}) + +and the mole fraction of water vapor is obtained from + +.. math:: + + \psi_w=\frac{p_w}{p} + +Once the state has been fixed by a set of :math:`T,p,\psi_w`, any parameter of interest can be calculated + +Molar Volume +------------ +.. math:: + :label: eq1 + + p=\frac{\bar R T}{\bar v}\left( 1+\frac{B_m}{\bar v}+\frac{C_m}{\bar v^2}\right) + +The bracketed term on the right hand side is the compressibility Z factor, equal to 1 for ideal gas, and is a measure of non-ideality of the air. The virial terms are given by + +.. math:: + + B_m=(1-\psi_w)^2B_{aa}+2(1-\psi_w)\psi_wB_{aw}+\psi_w^2B_{ww} + + C_m=(1-\psi_w)^3C_{aaa}+3(1-\psi_w)^2\psi_wC_{aaw}+3(1-\psi_w)\psi_w^2C_{aww}+\psi_w^3C_{www} + +where the virial coefficients are described in ASRAE RP-1485 and their values are provided in :ref:`HA-Validation`. All virial terms are functions only of temperature. + +Usually the temperature is known, the water mole fraction is calculated, and :math:`\bar v` is found using iterative methods, in HAProps, using a secant solver and the first guess that the compressibility factor is 1.0. + +Molar Enthalpy +-------------- + +The molar enthalpy of humid air is obtained from + +.. math:: + + \bar h=(1-\psi_w)\bar h_a^o+\psi_w\bar h_w^o+\bar R T \left[(B_m-T\frac{dB_m}{dT})\frac{1}{\bar v}+\left(C_m-\frac{T}{2}\frac{dC_m}{dT}\right) \frac{1}{\bar v^2}\right] + +with :math:`\bar h` in kJ/kmol. For both air and water, the full EOS is used to evaluate the enthalpy + +.. math:: + + \bar h_a^o=\bar h_0+\bar RT\left[ 1+\tau\left( \frac{\partial \alpha^o}{\partial \tau}\right)_{\delta}\right] + +which is in kJ/kmol, using the mixture :math:`\bar v` to define the parameter :math:`\delta=1/(\bar v \bar \rho_c)` for each fluid, and using the critical molar density for the fluid obtained from :math:`\bar \rho_c=1000\rho_c/M` to give units of mol/m\ :sup:`3`\ . The offset enthalpies for air and water are given by + +.. math:: + + \bar h_{0,a}=-7,914.149298\mbox{ kJ/kmol} + + \bar h_{0,w}=-0.01102303806\mbox{ kJ/kmol} + +respectively. The enthalpy per kg of dry air is given by + +.. math:: + + h=\bar h\frac{1+W}{M_{ha}} + +Enhancement factor +------------------ + +The enhancement factor is a parameter that includes the impact of the air on the saturation pressure of water vapor. It is only a function of temperature and pressure, but it must be iteratively obtained due to the nature of the expression for the enhancement factor. + +:math:`\psi_{w,s}` is given by :math:`\psi_{w,s}=fp_{w,s}/p`, where :math:`f` can be obtained from + +.. math:: + + \ln(f)=\left[ \begin{array}{l}\left [ \dfrac{(1+k_Tp_{w,s})(p-p_{w,s})-k_T\dfrac{(p^2-p_{w,s}^2)}{2}}{\overline {R} T}\right] \bar v_{w,s}+\ln[1-\beta_H(1-\psi_{w,s})p]\\ + +\left[\dfrac{(1-\psi_{w,s})^2p}{\bar R T}\right] B_{aa}-2\left[\dfrac{(1-\psi_{w,s})^2p}{\bar R T}\right]B_{aw}-\left[\dfrac{(p-p_{w,s}-(1-\psi_{w,s})^2p)}{\bar R T}\right]B_{ww} \\ + +\left[\dfrac{(1-\psi_{w,s})^3 p^2}{(\bar R T)^2}\right] C_{aaa}+\left[\dfrac{3(1-\psi_{w,s})^2[1-2(1-\psi_{w,s})]p^2}{2(\bar R T)^2}\right]C_{aaw}\\ + -\left[\dfrac{3(1-\psi_{w,s})^2\psi_{w,s}p^2}{(\bar R T)^2}\right]C_{aww}-\left[\dfrac{(3-2\psi_{w,s})\psi_{w,s}^2p^2-p_{w,s}^2}{2(\bar R T)^2}\right]C_{www}\\ + -\left[\dfrac{(1-\psi_{w,s})^2(-2+3\psi_{w,s})\psi_{w,s}p^2}{(\bar R T)^2}\right]B_{aa}B_{ww}\\ + -\left[\dfrac{2(1-\psi_{w,s})^3(-1+3\psi_{w,s})p^2}{(\bar R T)^2}\right]B_{aa}B_{aw}\\ + +\left[\dfrac{6(1-\psi_{w,s})^2\psi_{w,s}^2p^2}{(\bar R T)^2}\right]B_{ww}B_{aw}-\left[\dfrac{3(1-\psi_{w,s})^4p^2}{2(\bar R T)^2}\right]B_{aa}^2\\ + -\left[\dfrac{2(1-\psi_{w,s})^2\psi_{w,s}(-2+3\psi_{w,s})p^2}{(\bar R T)^2}\right]B_{aw}^2-\left[\dfrac{p_{w,s}^2-(4-3\psi_{w,s})(\psi_{w,s})^3p^2}{2(\bar R T)^2}\right]B_{ww}^2 + \end{array}\right] + + +Isothermal Compressibility +-------------------------- + +For water, the isothermal compressibility [in 1/Pa] is evaluated from + +.. math:: + + k_T=\frac{1}{\rho\frac{\partial p}{\partial \rho}}\frac{1\mbox{ kPa}}{1000\mbox{ Pa}} + +with + +.. math:: + + \frac{\partial p}{\partial \rho}=RT\left[1+2\delta\left(\frac{\partial \alpha^r}{\partial \delta}\right)_{\tau}+\delta^2\left(\frac{\partial^2 \alpha^r}{\partial \delta^2}\right)_{\tau}\right] + +in kPa/(kg/m\ :sup:`3`\ ). And for ice, + +.. math:: + + k_T=\left( \frac{\partial^2 g}{\partial p^2}\right) \left( \frac{\partial g}{\partial p}\right)_T^{-1}\frac{1\mbox{ kPa}}{1000\mbox{ Pa}} + +.. _HAProps_Sample: + +Sample HAProps Code +------------------- +To use the HAProps function, import it and do some calls, do something like this + +.. ipython:: + + #import the things you need + In [1]: from CoolProp.HumidAirProp import HAProps, HAProps_Aux + + #Enthalpy (kJ per kg dry air) as a function of temperature, pressure, + # and relative humidity at dry bulb temperature T of 25C, pressure + # P of one atmosphere, relative humidity R of 50% + In [2]: h=HAProps('H','T',298.15,'P',101.325,'R',0.5); print h + + #Temperature of saturated air at the previous enthalpy + In [2]: T=HAProps('T','P',101.325,'H',h,'R',1.0); print T + + #Temperature of saturated air - order of inputs doesn't matter + In [2]: T=HAProps('T','H',h,'R',1.0,'P',101.325); print T + +.. _HA-Validation: + +Humid Air Validation +-------------------- +Values here are obtained at documentation build-time using the Humid Air Properties module + + +.. ipython:: + + In [1]: execfile('Validation/HAValidation.py') + +.. + + Appendices + ---------- + + Derivation for specific heat of humid air + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. math:: + + p = \frac{{\bar RT}}{{\bar v}}\left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\\ + + .. math:: + + 0 = \frac{d}{{dT}}\left[ {\frac{{\bar RT}}{{\bar v}}\left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)} \right]\\ + + .. math:: + + 0 = \frac{{\bar RT}}{{\bar v}}\left( {0 + \frac{d}{{dT}}\left[ {\frac{{{B_m}}}{{\bar v}}} \right] + \frac{d}{{dT}}\left[ {\frac{{{C_m}}}{{{{\bar v}^2}}}} \right]} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\bar R\left( {\frac{{\bar v - T\frac{{d\bar v}}{{dT}}}}{{{{\bar v}^2}}}} \right)\\ + + .. math:: + + 0 = \frac{{\bar RT}}{{\bar v}}\left( {0 + \frac{{\bar v\frac{{d{B_m}}}{{dT}} - {B_m}\frac{{d\bar v}}{{dT}}}}{{{{\bar v}^2}}} + \frac{{{{\bar v}^2}\frac{{d{C_m}}}{{dT}} - 2{C_m}\bar v\frac{{d\bar v}}{{dT}}}}{{{{\bar v}^4}}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\bar R\left( {\frac{{\bar v - T\frac{{d\bar v}}{{dT}}}}{{{{\bar v}^2}}}} \right)\\ + + .. math:: + + 0 = \frac{{\bar RT}}{{\bar v}}\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} - \frac{{{B_m}}}{{{{\bar v}^2}}}\frac{{d\bar v}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}} - \frac{{2{C_m}}}{{{{\bar v}^3}}}\frac{{d\bar v}}{{dT}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\bar R\left( {\frac{1}{{\bar v}} - \frac{T}{{{{\bar v}^2}}}\frac{{d\bar v}}{{dT}}} \right)\\ + + .. math:: + + 0 = \frac{T}{{\bar v}}\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} - \frac{{{B_m}}}{{{{\bar v}^2}}}\frac{{d\bar v}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}} - \frac{{2{C_m}}}{{{{\bar v}^3}}}\frac{{d\bar v}}{{dT}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\left( {\frac{1}{{\bar v}} - \frac{T}{{{{\bar v}^2}}}\frac{{d\bar v}}{{dT}}} \right)\\ + + .. math:: + + \frac{{d\bar v}}{{dT}}\left( {\frac{{{B_m}}}{{{{\bar v}^2}}}\frac{T}{{\bar v}} + \frac{{2{C_m}}}{{{{\bar v}^3}}}\frac{T}{{\bar v}} + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\frac{T}{{{{\bar v}^2}}}} \right) = \frac{T}{{\bar v}}\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\left( {\frac{1}{{\bar v}}} \right)\\ + + .. math:: + + \frac{{d\bar v}}{{dT}}\left( {\frac{{{B_m}}}{{{{\bar v}^2}}}T + \frac{{2T{C_m}}}{{{{\bar v}^3}}} + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\frac{T}{{\bar v}}} \right) = T\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\\ + + .. math:: + + \frac{{d\bar v}}{{dT}} = \frac{{T\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}}} \right) + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)}}{{\left( {\frac{{{B_m}}}{{{{\bar v}^2}}}T + \frac{{2T{C_m}}}{{{{\bar v}^3}}} + \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right)\frac{T}{{\bar v}}} \right)}}\\ + + .. math:: + + \frac{{d\bar v}}{{dT}} = \frac{{T\left( {\frac{1}{{\bar v}}\frac{{d{B_m}}}{{dT}} + \frac{1}{{{{\bar v}^2}}}\frac{{d{C_m}}}{{dT}}} \right) + Z}}{{\left( {\frac{{{B_m}}}{{{{\bar v}^2}}}T + \frac{{2T{C_m}}}{{{{\bar v}^3}}} + Z\frac{T}{{\bar v}}} \right)}}\\ + + .. math:: + + \frac{{d\bar v}}{{dT}} = \frac{{\left( {\frac{{d{B_m}}}{{dT}} + \frac{1}{{\bar v}}\frac{{d{C_m}}}{{dT}}} \right) + Z\frac{{\bar v}}{T}}}{{\left( {\frac{{{B_m}}}{{\bar v}} + \frac{{2{C_m}}}{{{{\bar v}^2}}} + Z} \right)}}\\ + + where + + .. math:: + + Z = \left( {1 + \frac{{{B_m}}}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right) + + .. math:: + + \bar h = {{\bar h}_0} + \left( {1 - {\psi _w}} \right)\bar h_a^0 + {\psi _w}\bar h_w^0 + \bar RT\left[ {\left( {{B_m} - T\frac{{d{B_m}}}{{dT}}} \right)\frac{1}{{\bar v}} + \left( {{C_m} - \frac{T}{2}\frac{{d{C_m}}}{{dT}}} \right)\frac{1}{{{{\bar v}^2}}}} \right]\\ + + .. math:: + + {{\bar c}_p} = \frac{{d\bar h}}{{dT}} = \frac{{\delta \bar h}}{{\delta T}} + \frac{{\delta \bar h}}{{\delta \bar v}}\frac{{\delta \bar v}}{{\delta T}}\\ + + .. math:: + + \frac{{\delta \bar h}}{{\delta \bar v}} = \left( {1 - {\psi _w}} \right)\frac{{d\bar h_a^0}}{{d\delta }}\frac{{d\delta }}{{d\bar v}} + {\psi _w}\frac{{d\bar h_w^0}}{{d\delta }}\frac{{d\delta }}{{d\bar v}} + \bar RT\left[ {\left( {{B_m} - T\frac{{d{B_m}}}{{dT}}} \right)\frac{{ - 1}}{{{{\bar v}^2}}} + \left( {{C_m} - \frac{T}{2}\frac{{d{C_m}}}{{dT}}} \right)\frac{{ - 2}}{{{{\bar v}^3}}}} \right]\\ + + .. math:: + + \frac{{\delta \bar h}}{{\delta T}} = \left( {1 - {\psi _w}} \right)\frac{{d\bar h_a^0}}{{d\tau }}\frac{{d\tau }}{{dT}} + {\psi _w}\frac{{d\bar h_w^0}}{{d\tau }}\frac{{d\tau }}{{dT}} + \bar R\left[ {\left( {{B_m} - T\frac{{d{B_m}}}{{dT}}} \right)\frac{1}{{\bar v}} + \left( {{C_m} - \frac{T}{2}\frac{{d{C_m}}}{{dT}}} \right)\frac{1}{{{{\bar v}^2}}}} \right] + \bar RT\left[ {\left( {\frac{{d{B_m}}}{{dT}} - \frac{{d{B_m}}}{{dT}} - T\frac{{{d^2}{B_m}}}{{d{T^2}}}} \right)\frac{1}{{\bar v}} + \left( {\frac{{d{C_m}}}{{dT}} - \frac{1}{2}\frac{{d{C_m}}}{{dT}} - \frac{T}{2}\frac{{{d^2}{C_m}}}{{d{T^2}}}} \right)\frac{1}{{{{\bar v}^2}}}} \right]\\ + + .. math:: + + \frac{{\delta \bar h}}{{\delta T}} = \left( {1 - {\psi _w}} \right)\frac{{d\bar h_a^0}}{{d\tau }}\frac{{d\tau }}{{dT}} + {\psi _w}\frac{{d\bar h_w^0}}{{d\tau }}\frac{{d\tau }}{{dT}} + \bar R\left[ {\left( {{B_m} - T\frac{{d{B_m}}}{{dT}}} \right)\frac{1}{{\bar v}} + \frac{{{C_m}}}{{{{\bar v}^2}}}} \right] + \bar R{T^2}\left[ {\left( { - \frac{{{d^2}{B_m}}}{{d{T^2}}}} \right)\frac{1}{{\bar v}} + \left( { - \frac{1}{2}\frac{{{d^2}{C_m}}}{{d{T^2}}}} \right)\frac{1}{{{{\bar v}^2}}}} \right] diff --git a/Web/Makefile b/Web/Makefile new file mode 100644 index 00000000..09bb4518 --- /dev/null +++ b/Web/Makefile @@ -0,0 +1,105 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf _build/* + +html: + $(SPHINXBUILD) -j3 -b html $(ALLSPHINXOPTS) _build/html + @echo + @echo "Build finished. The HTML pages are in _build/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml + @echo + @echo "Build finished. The HTML pages are in _build/dirhtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in _build/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in _build/qthelp, like this:" + @echo "# qcollectiongenerator _build/qthelp/sampledoc.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile _build/qthelp/sampledoc.qhc" + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex + @echo + @echo "Build finished; the LaTeX files are in _build/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes + @echo + @echo "The overview file is in _build/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in _build/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in _build/doctest/output.txt." + +sf: + cd _build/html; \ + rsync -avz . jdh2358,matplotlib@web.sf.net:/home/groups/m/ma/matplotlib/htdocs/sampledoc -essh --cvs-exclude + + +sfpdf: + cd _build/latex; \ + scp sampledoc.pdf jdh2358,matplotlib@web.sf.net:/home/groups/m/ma/matplotlib/htdocs/sampledoc/ + +rst: FluidInfoGenerator.py + python FluidInfoGenerator.py + mv Fluids/FluidInformation.rst Fluids/FluidInformation.rst.2 + rm Fluids/*.rst + mv Fluids/FluidInformation.rst.2 Fluids/FluidInformation.rst + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html + diff --git a/Web/TTSE.ipynb b/Web/TTSE.ipynb new file mode 100644 index 00000000..c0f1e6e9 --- /dev/null +++ b/Web/TTSE.ipynb @@ -0,0 +1,346 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Tabular Taylor Series Extrapolation" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lookup tables are an effective way of greatly speeding up the computational time when the state variable inputs are variables other than temperature and density (upon which the equations of state are based).\n", + "\n", + "The tables are constructed with enthalpy and pressure as the independent variables. Other inputs are also possible, but the efficiency of the lookup table method is maximized through the use of these independent variables\n", + "\n", + "TTSE was added to CoolProp as of version 3.0. As of version 4.0, bicubic interpolation (see http://en.wikipedia.org/wiki/Bicubic_interpolation) has been added, which greatly improves the accuracy at a small speed penalty (~10%) over TTSE." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Usage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The tables can be enabled by calling the function ``enable_TTSE_LUT()`` of the CoolPropStateClass (only C++), or alternatively, the ``enable_TTSE_LUT(FluidName)`` (Python + anything that calls the DLL) function. This will enable ALL thermodynamic calls for this fluid to use the TTSE method. The function ``disable_TTSE_LUT`` is used to disable the TTSE method\n", + "\n", + "Two types of tables are built:\n", + "\n", + "* Tables are constructed along each saturation curve, all the way from the triple point (or minimum) pressure to the critical pressure\n", + "* A single-phase table is constructed for the areas outside of the two-phase region\n", + "\n", + "When the single phase tables are constructed, a default range is employed, which is taken to be from the triple point pressure to the twice the critical pressure, and from the saturated liquid enthalpy at the triple point pressure to an enthalpy that is three times the latent heat at the triple point pressure plus the saturated liquid enthalpy at the triple point pressure.\n", + "\n", + "If you do not like that default range, BEFORE you call enable_TTSE_LUT(), call ``set_TTSESinglePhase_LUT_range(FluidName,hmin,hmax,pmin,pmax)``\n", + "\n", + "The single-phase (but not the two-phase) tables are stored in binary form in files for faster loading in the HOME/CoolProp-TTSEData/*FluidName* folder where HOME is your home folder. If you do not want to save the tables to file, you can call the function disable_TTSE_LUT_writing() to disable the writing of the single phase tables to file BEFORE the tables are built" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Example in Python" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#import CoolProp module\n", + "import CoolProp.CoolProp as CP" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#This will disable the TTSE method for Propane\n", + "CP.disable_TTSE_LUT_writing('Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 2, + "text": [ + "True" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#This will enable the TTSE method for Propane\n", + "In [1]: CP.enable_TTSE_LUT('Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 3, + "text": [ + "True" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Check if it is enabled for Propane\n", + "In [1]: CP.isenabled_TTSE_LUT('Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "True" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Calculate something with the tables for Propane\n", + "In [1]: CP.Props('H','P',300,'Q',0,'Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 5, + "text": [ + "165.25496936313542" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Check the range for Propane (hmin,hmax,pmin,pmax)\n", + "In [1]: CP.get_TTSESinglePhase_LUT_range('Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 6, + "text": [ + "(-196643.67321201751, 929157.9196160495, 0.00017204618151214153, 8502400.0)" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Calculate something with the tables for Propane (using TTSE method)\n", + "In [1]: CP.Props('T','P',300,'H',40,'Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 7, + "text": [ + "203.3656095382259" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Set the mode to bicubic interpolation\n", + "In [1]: CP.set_TTSE_mode('Propane','BICUBIC') # or could be 'TTSE'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 8, + "text": [ + "True" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Calculate something with the tables for Propane (using Bicubic method)\n", + "In [1]: CP.Props('T','P',300,'H',40,'Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 9, + "text": [ + "203.3656097126807" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#This will disable the TTSE method for Propane\n", + "In [1]: CP.disable_TTSE_LUT('Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "True" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Calculate something without the tables for Propane\n", + "In [1]: CP.Props('T','P',300,'H',40,'Propane')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 11, + "text": [ + "203.36560971332722" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: most other programming languages that are wrappers around the CoolProp.h header should behave in nearly exactly the same fashion, excepting perhaps the ``get_TTSESinglePhase_LUT_range`` function as it uses passing by reference." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "How it Works (TTSE)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tables are built of $T(p,h), s(p,h)$, and $\\rho(p,h)$ as well as the derivatives of each term with respect to $p$ and $h$. The property of interest is then expanded around the nearest grid point to yield representations like\n", + "\n", + "$$T = T_{i,j}+\\Delta h\\left(\\frac{\\partial T}{\\partial h}\\right)_{p}+\\Delta p\\left(\\frac{\\partial T}{\\partial p}\\right)_{h}+\\frac{1}{2}\\Delta h^2\\left(\\frac{\\partial^2 T}{\\partial h^2}\\right)_{p}+\\frac{1}{2}\\Delta p^2\\left(\\frac{\\partial^2T}{\\partial p^2}\\right)_{h}+\\Delta h\\Delta p\\left(\\frac{\\partial^2T}{\\partial p\\partial h}\\right)$$\n", + " \n", + "$$ s = s_{i,j}+\\Delta h\\left(\\frac{\\partial s}{\\partial h}\\right)_{p}+\\Delta p\\left(\\frac{\\partial s}{\\partial p}\\right)_{h}+\\frac{1}{2}\\Delta h^2\\left(\\frac{\\partial^2 s}{\\partial h^2}\\right)_{p}+\\frac{1}{2}\\Delta p^2\\left(\\frac{\\partial^2s}{\\partial p^2}\\right)_{h}+\\Delta h\\Delta p\\left(\\frac{\\partial^2s}{\\partial p\\partial h}\\right)$$\n", + " \n", + "$$ \\rho = s_{i,j}+\\Delta h\\left(\\frac{\\partial \\rho}{\\partial h}\\right)_{p}+\\Delta p\\left(\\frac{\\partial \\rho}{\\partial p}\\right)_{h}+\\frac{1}{2}\\Delta h^2\\left(\\frac{\\partial^2 \\rho}{\\partial h^2}\\right)_{p}+\\frac{1}{2}\\Delta p^2\\left(\\frac{\\partial^2\\rho}{\\partial p^2}\\right)_{h}+\\Delta h\\Delta p\\left(\\frac{\\partial^2\\rho}{\\partial p\\partial h}\\right) $$\n", + "\n", + "$$\\Delta h = h-h_i$$\n", + " \n", + "$$\\Delta p = p-p_i$$\n", + " \n", + "See the [IAPWS TTSE report](http://www.iapws.org/relguide/TTSE.pdf) for a description of the method. Analytic derivatives are used to build the tables" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "How it Works (Bicubic)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the TTSE method, the derivatives are calculated at every grid point. In the bicubic method (see [bicubic interpolation](http://en.wikipedia.org/wiki/Bicubic_interpolation)) we use the known derivatives at each grid point in order to develop $C_1$ continuous bicubic functions in each cell. The independent variables ($T,\\rho$) or ($p,h$) are normalized into unit variables that vary between 0 and 1. Then the bicubic coefficients are found for the cell, and the bicubic form is evaluated." + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/Web/TTSE.rst b/Web/TTSE.rst new file mode 100644 index 00000000..129d9d3f --- /dev/null +++ b/Web/TTSE.rst @@ -0,0 +1,90 @@ +Tabular Taylor Series Extrapolation +=================================== + +Introduction +------------ +Lookup tables are an effective way of greatly speeding up the computational time when the state variable inputs are variables other than temperature and density (upon which the equations of state are based). + +The tables are constructed with enthalpy and pressure as the independent variables. Other inputs are also possible, but the efficiency of the lookup table method is maximized through the use of these independent variables + +TTSE was added to CoolProp as of version 3.0. As of version 4.0, bicubic interpolation (see http://en.wikipedia.org/wiki/Bicubic_interpolation) has been added, which greatly improves the accuracy at a small speed penalty (~10%) over TTSE. + +Usage +----- +The tables can be enabled by calling the function ``enable_TTSE_LUT()`` of the CoolPropStateClass (only C++), or alternatively, the ``enable_TTSE_LUT(FluidName)`` (Python + anything that calls the DLL) function. This will enable ALL thermodynamic calls for this fluid to use the TTSE method. The function ``disable_TTSE_LUT`` is used to disable the TTSE method + +Two types of tables are built: + +#. Tables are constructed along each saturation curve, all the way from the triple point (or minimum) pressure to the critical pressure +#. A single-phase table is constructed for the areas outside of the two-phase region + +When the single phase tables are constructed, a default range is employed, which is taken to be from the triple point pressure to the twice the critical pressure, and from the saturated liquid enthalpy at the triple point pressure to an enthalpy that is three times the latent heat at the triple point pressure plus the saturated liquid enthalpy at the triple point pressure. + +If you do not like that default range, BEFORE you call enable_TTSE_LUT(), call ``set_TTSESinglePhase_LUT_range(FluidName,hmin,hmax,pmin,pmax)`` + +The single-phase (but not the two-phase) tables are stored in binary form in files for faster loading in the HOME/CoolProp-TTSEData/*FluidName* folder where HOME is your home folder. If you do not want to save the tables to file, you can call the function disable_TTSE_LUT_writing() to disable the writing of the single phase tables to file BEFORE the tables are built + +Example in Python +----------------- +.. ipython:: + + #import CoolProp module + In [0]: import CoolProp.CoolProp as CP + + #This will disable the TTSE method for Propane + In [1]: CP.disable_TTSE_LUT_writing('Propane') + + #This will enable the TTSE method for Propane + In [1]: CP.enable_TTSE_LUT('Propane') + + #Check if it is enabled for Propane + In [1]: CP.isenabled_TTSE_LUT('Propane') + + #Calculate something with the tables for Propane + In [1]: CP.Props('H','P',300,'Q',0,'Propane') + + #Check the range for Propane (hmin,hmax,pmin,pmax) + In [1]: CP.get_TTSESinglePhase_LUT_range('Propane') + + #Calculate something with the tables for Propane (using TTSE method) + In [1]: CP.Props('T','P',300,'H',40,'Propane') + + #Set the mode to bicubic interpolation + In [1]: CP.set_TTSE_mode('Propane','BICUBIC') # or could be 'TTSE' + + #Calculate something with the tables for Propane (using Bicubic method) + In [1]: CP.Props('T','P',300,'H',40,'Propane') + + #This will disable the TTSE method for Propane + In [1]: CP.disable_TTSE_LUT('Propane') + + #Calculate something without the tables for Propane + In [1]: CP.Props('T','P',300,'H',40,'Propane') + +Note: most other programming languages that are wrappers around the CoolProp.h header should behave in nearly exactly the same fashion, excepting perhaps the ``get_TTSESinglePhase_LUT_range`` function as it uses passing by reference. + +How it Works (TTSE) +------------------- + +Tables are built of :math:`T(p,h), s(p,h)`, and :math:`\rho(p,h)` as well as the derivatives of each term with respect to p and h. The property of interest is then expanded around the nearest grid point to yield representations like + +.. math:: + + T = T_{i,j}+\Delta h\left(\frac{\partial T}{\partial h}\right)_{p}+\Delta p\left(\frac{\partial T}{\partial p}\right)_{h}+\frac{1}{2}\Delta h^2\left(\frac{\partial^2 T}{\partial h^2}\right)_{p}+\frac{1}{2}\Delta p^2\left(\frac{\partial^2T}{\partial p^2}\right)_{h}+\Delta h\Delta p\left(\frac{\partial^2T}{\partial p\partial h}\right) + + s = s_{i,j}+\Delta h\left(\frac{\partial s}{\partial h}\right)_{p}+\Delta p\left(\frac{\partial s}{\partial p}\right)_{h}+\frac{1}{2}\Delta h^2\left(\frac{\partial^2 s}{\partial h^2}\right)_{p}+\frac{1}{2}\Delta p^2\left(\frac{\partial^2s}{\partial p^2}\right)_{h}+\Delta h\Delta p\left(\frac{\partial^2s}{\partial p\partial h}\right) + + \rho = s_{i,j}+\Delta h\left(\frac{\partial \rho}{\partial h}\right)_{p}+\Delta p\left(\frac{\partial \rho}{\partial p}\right)_{h}+\frac{1}{2}\Delta h^2\left(\frac{\partial^2 \rho}{\partial h^2}\right)_{p}+\frac{1}{2}\Delta p^2\left(\frac{\partial^2\rho}{\partial p^2}\right)_{h}+\Delta h\Delta p\left(\frac{\partial^2\rho}{\partial p\partial h}\right) + + +.. math:: + + \Delta h = h-h_i + + \Delta p = p-p_i + +See the `IAPWS TTSE report `_ for a description of the method. Analytic derivatives are used to build the tables + +How it Works (Bicubic) +---------------------- +In the TTSE method, the derivatives are calculated at every grid point. In the bicubic method (see http://en.wikipedia.org/wiki/Bicubic_interpolation) we use the known derivatives at each grid point in order to develop :math:`C_1` continuous bicubic functions in each cell. The independent variables (:math:`T,\rho`) or (:math:`p,h`) are normalized into unit variables that vary between 0 and 1. Then the bicubic coefficients are found for the cell, and the bicubic form is evaluated. \ No newline at end of file diff --git a/Web/Validation/HAValidation.py b/Web/Validation/HAValidation.py new file mode 100644 index 00000000..9ace7afc --- /dev/null +++ b/Web/Validation/HAValidation.py @@ -0,0 +1,269 @@ +from CoolProp.HumidAirProp import HAProps +import numpy as np + +print ' Replicating the tables from ASHRAE RP-1485' +print ' ' +print 'A.6.1 Psychrometric Properties of Moist Air at 0C and Below' +print 'Saturated air at 101.325 kPa' +s5=' '*5 +print '====================================================' +print "{T:8s}{W:10s}{v:10s}{h:10s}{s:10s}".format(W=s5+' Ws',v=s5+' v',h=s5+'h',s=s5+' s',T=' T') +print "{T:8s}{W:10s}{v:10s}{h:10s}{s:10s}".format(W=' kgw/kg_da',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',T=' C') +print '----------------------------------------------------' +for T in np.linspace(-60,0,13)+273.15: + h = HAProps('H','T',T,'R',1.0,'P',101.325) + Twb = HAProps('Twb','T',T,'R',1.0,'P',101.325)-273.15 + W = HAProps('W','T',T,'R',1.0,'P',101.325) + v = HAProps('V','T',T,'R',1.0,'P',101.325) + s = HAProps('S','T',T,'R',1.0,'P',101.325) + print "{T:8.0f}{W:10.7f}{v:10.4f}{h:10.3f}{s:10.4f}".format(W=W,T=T-273.15,v=v,h=h,s=s) +print '====================================================' +print ' ' +print 'A.6.2 Psychrometric Properties of Moist Air at 0C and Above' +print 'Saturated air at 101.325 kPa' +s5=' '*5 +print '====================================================' +print "{T:8s}{W:10s}{v:10s}{h:10s}{s:10s}".format(W=s5+' Ws',v=s5+' v',h=s5+'h',s=s5+' s',T=' T') +print "{T:8s}{W:10s}{v:10s}{h:10s}{s:10s}".format(W=' kgw/kg_da',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',T=' C') +print '----------------------------------------------------' +for T in np.linspace(0,90,19)+273.15: + h=HAProps('H','T',T,'R',1.0,'P',101.325) + Twb=HAProps('Twb','T',T,'R',1.0,'P',101.325)-273.15 + W=HAProps('W','T',T,'R',1.0,'P',101.325) + v=HAProps('V','T',T,'R',1.0,'P',101.325) + s=HAProps('S','T',T,'R',1.0,'P',101.325) + print "{T:8.0f}{W:10.7f}{v:10.3f}{h:10.2f}{s:10.4f}".format(W=W,T=T-273.15,v=v,h=h,s=s) +print '====================================================' +print ' ' +def HotAir(num): + from CoolProp.HumidAirProp import HAProps + if num=='8': + Temp=str(200) + T=200+273.15 + elif num=='9': + Temp=str(320) + T=320+273.15 + print 'A.'+num+'.1 Psychrometric Properties of Moist Air at 101.325 kPa ' + print 'Dry Bulb temperature of '+Temp+'C' + s5=' '*5 + print '================================================================' + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=s5+' W',Twb=s5+'Twb',v=s5+' v',h=s5+'h',s=s5+' s',R=s5+'RH') + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=' kgw/kg_da',Twb=' C',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',R=' %') + print '----------------------------------------------------------------' + for W in [0.0,0.05,0.1,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.0]: + h=HAProps('H','T',T,'W',W,'P',101.325) + Twb=HAProps('Twb','T',T,'W',W,'P',101.325)-273.15 + R=HAProps('R','T',T,'W',W,'P',101.325)*100 + v=HAProps('V','T',T,'W',W,'P',101.325) + s=HAProps('S','T',T,'W',W,'P',101.325) + print "{W:10.2f}{Twb:10.2f}{v:10.3f}{h:10.2f}{s:10.4f}{R:10.4f}".format(W=W,Twb=Twb,v=v,h=h,s=s,R=R) + print '================================================================' + print ' ' + print 'A.'+num+'.2 Psychrometric Properties of Moist Air at 1000 kPa ' + print 'Dry Bulb temperature of '+Temp+'C' + print '================================================================' + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=s5+' W',Twb=s5+'Twb',v=s5+' v',h=s5+'h',s=s5+' s',R=s5+'RH') + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=' kgw/kg_da',Twb=' C',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',R=' %') + print '----------------------------------------------------------------' + for W in [0.0,0.05,0.1,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.0]: + h=HAProps('H','T',T,'W',W,'P',1000) + Twb=HAProps('Twb','T',T,'W',W,'P',1000)-273.15 + R=HAProps('R','T',T,'W',W,'P',1000)*100 + v=HAProps('V','T',T,'W',W,'P',1000) + s=HAProps('S','T',T,'W',W,'P',1000) + print "{W:10.2f}{Twb:10.2f}{v:10.3f}{h:10.2f}{s:10.4f}{R:10.4f}".format(W=W,Twb=Twb,v=v,h=h,s=s,R=R) + print '================================================================' + print ' ' + s5=' '*5 + print 'A.'+num+'.3 Psychrometric Properties of Moist Air at 2000 kPa ' + print 'Dry Bulb temperature of '+Temp+'C' + print '================================================================' + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=s5+' W',Twb=s5+'Twb',v=s5+' v',h=s5+'h',s=s5+' s',R=s5+'RH') + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=' kgw/kg_da',Twb=' C',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',R=' %') + print '----------------------------------------------------------------' + for W in [0.0,0.05,0.1,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.0]: + h=HAProps('H','T',T,'W',W,'P',2000) + Twb=HAProps('Twb','T',T,'W',W,'P',2000)-273.15 + R=HAProps('R','T',T,'W',W,'P',2000)*100 + v=HAProps('V','T',T,'W',W,'P',2000) + s=HAProps('S','T',T,'W',W,'P',2000) + print "{W:10.2f}{Twb:10.2f}{v:10.3f}{h:10.2f}{s:10.4f}{R:10.4f}".format(W=W,Twb=Twb,v=v,h=h,s=s,R=R) + print '================================================================' + print ' ' + s5=' '*5 + print 'A.'+num+'.4 Psychrometric Properties of Moist Air at 5000 kPa ' + print 'Dry Bulb temperature of '+Temp+'C' + print '================================================================' + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=s5+' W',Twb=s5+'Twb',v=s5+' v',h=s5+'h',s=s5+' s',R=s5+'RH') + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=' kgw/kg_da',Twb=' C',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',R=' %') + print '----------------------------------------------------------------' + if Temp=='200': + Wrange = [0.0,0.05,0.1,0.15,0.20,0.25,0.30] + else: + Wrange = [0.0,0.05,0.1,0.15,0.20,0.25,0.30,0.4,0.5,0.6,0.7,0.8,0.9,1.0] + for W in Wrange: + h=HAProps('H','T',T,'W',W,'P',5000) + Twb=HAProps('Twb','T',T,'W',W,'P',5000)-273.15 + R=HAProps('R','T',T,'W',W,'P',5000)*100 + v=HAProps('V','T',T,'W',W,'P',5000) + s=HAProps('S','T',T,'W',W,'P',5000) + print "{W:10.2f}{Twb:10.2f}{v:10.3f}{h:10.2f}{s:10.4f}{R:10.4f}".format(W=W,Twb=Twb,v=v,h=h,s=s,R=R) + print '================================================================' + print ' ' + s5=' '*5 + print 'A.'+num+'.5 Psychrometric Properties of Moist Air at 10,000 kPa ' + print 'Dry Bulb temperature of '+Temp+'C' + print '================================================================' + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=s5+' W',Twb=s5+'Twb',v=s5+' v',h=s5+'h',s=s5+' s',R=s5+'RH') + print "{W:10s}{Twb:10s}{v:10s}{h:10s}{s:10s}{R:10s}".format(W=' kgw/kg_da',Twb=' C',v=' m3/kgda',h=' kJ/kgda',s=' kJ/kgda/K',R=' %') + print '----------------------------------------------------------------' + + if Temp=='200': + Wrange = [0.0,0.05,0.1] + else: + Wrange = [0.0,0.05,0.1,0.15,0.20,0.25,0.30,0.4,0.5,0.6,0.7,0.8,0.9,1.0] + for W in Wrange: + h=HAProps('H','T',T,'W',W,'P',10000) + Twb=HAProps('Twb','T',T,'W',W,'P',10000)-273.15 + R=HAProps('R','T',T,'W',W,'P',10000)*100 + v=HAProps('V','T',T,'W',W,'P',10000) + s=HAProps('S','T',T,'W',W,'P',10000) + print "{W:10.2f}{Twb:10.2f}{v:10.3f}{h:10.2f}{s:10.4f}{R:10.4f}".format(W=W,Twb=Twb,v=v,h=h,s=s,R=R) + print '================================================================' + +HotAir('8') +print ' ' +HotAir('9') +############################## +#### Virial Coefficients ##### +############################## + +def Virials(variables): + from CoolProp.HumidAirProp import HAProps_Aux + import numpy as np + + varString="%-10s"%('T') + units="%-10s"%('C') + #Build the header + for var in variables: + varString+="%-20s"%(var) + units+="%-20s" %(HAProps_Aux(var,300,100,0.0)[1]) + print varString + print units + + #Build the table + for T in np.linspace(-60,200,27)+273.15: + values="%-10.1f" %(T-273.15) + for var in variables: + values+="%-20.10e" %(HAProps_Aux(var,T,100,0.0)[0]) + print values + +print "" +print "Pure fluid Virial Coefficients" +print "------------------------------" +Virials(['Baa','Caaa','Bww','Cwww']) +Virials(['Baw','Caaw','Caww']) + +print "" +print "Pure fluid Virial Coefficients Derivatives" +print "------------------------------------------" +Virials(['dBaa','dCaaa','dBww','dCwww']) +Virials(['dBaw','dCaaw','dCaww']) + + +############################## +####### Water Saturation ##### +############################## + +print "" +print "Water saturation pressure p_ws [kPa]" +from CoolProp.HumidAirProp import HAProps_Aux +import numpy as np +Tv=np.linspace(-60,300,13)+273.15 +print "%-10s %-20s"%('T','p_ws') +print "%-10s %-20s"%('C',HAProps_Aux('p_ws',Tv[-1],100,0.0)[1]) +#Build the table +for T in Tv: + values="%-10.2f" %(T-273.15) + values+="%-20.10e" %(HAProps_Aux('p_ws',T,100,0.0)[0]) + print values + +############################## +####### Henry Constant ####### +############################## + +print "" +print "Henry Constant (zero for T < 273.15 K)" +from CoolProp.HumidAirProp import HAProps_Aux +import numpy as np +Tv=np.linspace(0,300,11)+273.16 +print "%-10s %-20s"%('T','beta_H') +print "%-10s %-20s"%('C',HAProps_Aux('beta_H',Tv[-1],100,0.0)[1]) +#Build the table +for T in Tv: + values="%-10.2f" %(T-273.15) + values+="%-20.10e" %(HAProps_Aux('beta_H',T,100,0.0)[0]) + print values + +########################################## +####### Isothermal Compressibility ####### +########################################## + +print "" +print "Isothermal Compressibility of water (kT) [1/Pa]" +from CoolProp.HumidAirProp import HAProps_Aux +import numpy as np +Tv=np.linspace(-60,300,13)+273.15 +Pv=[101.325,200,500,1000] +variables="%-10s"%('T') +for p in Pv: + variables+="%-20s"%("p = %-0.3f kPa "%(p)) +print variables +#Build the actual table +for T in Tv: + values="%-10.2f" %(T-273.15) + for p in Pv: + values+="%-20.10e" %(HAProps_Aux('kT',T,p,0.0)[0]) + print values + +########################################## +####### Saturated Molar Volume Water ##### +########################################## + +print "" +print "Molar volume of saturated liquid water or ice (vbar_ws) [m^3/mol_H2O]" +from CoolProp.HumidAirProp import HAProps_Aux +import numpy as np +Tv=np.linspace(-60,300,13)+273.15 +Pv=[101.325,200,500,1000] +variables="%-10s"%('T') +for p in Pv: + variables+="%-20s"%("p = %-0.3f kPa "%(p)) +print variables +#Build the actual table +for T in Tv: + values="%-10.2f" %(T-273.15) + for p in Pv: + values+="%-20.10e" %(HAProps_Aux('vbar_ws',T,p,0.0)[0]) + print values + +########################################## +########### Enhancement Factor ########### +########################################## + +print "" +print "Enhancement factor (f) [no units]" +from CoolProp.HumidAirProp import HAProps_Aux +import numpy as np +Tv=np.array([-60,-40,-20,0,40,80,120,160,200,250,300,350])+273.15 +Pv=[101.325,200,500,1000,10000] +variables="%-10s"%(u'T') +for p in Pv: + variables+="%-20s"%("p = %-0.3f kPa "%(p)) +print variables +#Build the actual table +for T in Tv: + values="%-10.2f" %(T-273.15) + for p in Pv: + values+="%-20.10e" %(HAProps_Aux('f',T,p,0.0)[0]) + print values \ No newline at end of file diff --git a/Web/Validation/NelsonValidation.py b/Web/Validation/NelsonValidation.py new file mode 100644 index 00000000..3fd0c4c5 --- /dev/null +++ b/Web/Validation/NelsonValidation.py @@ -0,0 +1,42 @@ +from CoolProp.HumidAirProp import HAProps + + + +print "Validation against H.F. Nelson and H.J. Sauer,\"Formulation for High-Temperature Properties for Moist Air\", HVAC&R Research v.8 #3, 2002" +print "Note: More accurate formulation employed than in Nelson. Just for sanity checking" +print "Yields a negative relative humidity for Tdb=5C,Twb=-3C, point omitted" +tdb = [5,5,5,25,25,25,25,50,50,50,50,50,50,50] +twb = [5,2,-1,25,20,15,10,50,40,30,25,22,20,19] +print " " +print "Table 6: Adiabatic Saturation" +print "P=101325 Pa, Altitude = 0 m" +print "========================================================================" +print "{Tdb:10s}{Twb:10s}{Tdp:10s}{R:10s}{W:10s}{h:10s}{v:10s}".format(W='W',Twb='Twb',Tdp='Tdp',Tdb='Tdb',v='v',h='h',s='s',R='RH') +print "{Tdb:10s}{Twb:10s}{Tdp:10s}{R:10s}{W:10s}{h:10s}{v:10s}".format(W='-',Twb='C',Tdp='C',Tdb='C',v='m^3/kg_da',h='kJ/kg_da',s='kJ/kg_da/K',R='%') +print "------------------------------------------------------------------------" +for (tdb_,twb_) in zip(tdb,twb): + h=HAProps('H','T',tdb_+273.13,'Twb',twb_+273.15,'P',101.325) + tdp=HAProps('Tdp','T',tdb_+273.13,'Twb',twb_+273.15,'P',101.325)-273.15 + W=HAProps('W','T',tdb_+273.13,'Twb',twb_+273.15,'P',101.325) + R=HAProps('R','T',tdb_+273.13,'Twb',twb_+273.15,'P',101.325)*100 + v=HAProps('V','T',tdb_+273.13,'Twb',twb_+273.15,'P',101.325) + s=0 + print "{Tdb:10.2f}{Twb:10.2f}{Tdp:10.2f}{R:10.1f}{W:10.5f}{h:10.2f}{v:10.3f}".format(W=W,Twb=twb_,Tdp=tdp,Tdb=tdb_,v=v,h=h,s=s,R=R) +print "------------------------------------------------------------------------" +print " " +print "Table 7: Adiabatic Saturation" +print "P=84,556 Pa, Altitude = 1500 m" +print "========================================================================" +print "{Tdb:10s}{Twb:10s}{Tdp:10s}{R:10s}{W:10s}{h:10s}{v:10s}".format(W='W',Twb='Twb',Tdp='Tdp',Tdb='Tdb',v='v',h='h',s='s',R='RH') +print "{Tdb:10s}{Twb:10s}{Tdp:10s}{R:10s}{W:10s}{h:10s}{v:10s}".format(W='-',Twb='C',Tdp='C',Tdb='C',v='m^3/kg_da',h='kJ/kg_da',s='kJ/kg_da/K',R='%') +print "------------------------------------------------------------------------" +for (tdb_,twb_) in zip(tdb,twb): + h=HAProps('H','T',tdb_+273.13,'Twb',twb_+273.15,'P',84.556) + tdp=HAProps('Tdp','T',tdb_+273.13,'Twb',twb_+273.15,'P',84.556)-273.15 + W=HAProps('W','T',tdb_+273.13,'Twb',twb_+273.15,'P',84.556) + R=HAProps('R','T',tdb_+273.13,'Twb',twb_+273.15,'P',84.556)*100 + v=HAProps('V','T',tdb_+273.13,'Twb',twb_+273.15,'P',84.556) + s=0 + print "{Tdb:10.2f}{Twb:10.2f}{Tdp:10.2f}{R:10.1f}{W:10.5f}{h:10.2f}{v:10.3f}".format(W=W,Twb=twb_,Tdp=tdp,Tdb=tdb_,v=v,h=h,s=s,R=R) +print "------------------------------------------------------------------------" + diff --git a/Web/_static/Coolprop.css b/Web/_static/Coolprop.css new file mode 100644 index 00000000..3222e1fc --- /dev/null +++ b/Web/_static/Coolprop.css @@ -0,0 +1,509 @@ +/** + * Alternate Sphinx design + * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl, Ian Bell. + */ + +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; + font-size: 14px; + letter-spacing: -0.01em; + line-height: 150%; + text-align: center; + /*background-color: #AFC1C4; */ + /*background-color: #BFD1D4;*/ + background-color: #d4bfc4; + + color: black; + padding: 0; + border: 1px solid #aaa; + + margin: 0px 80px 0px 80px; + min-width: 740px; +} + +a { + color: #CA7900; + text-decoration: none; +} + +a:hover { + color: #2491CF; +} + +pre { + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + padding: 0.5em; + border: 1px solid #ccc; + background-color: #f0f0f0; +} + +td.linenos pre { + padding: 0.5em 0; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +cite, code, tt { + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + +tt { + background-color: #f2f2f2; + border-bottom: 1px solid #ddd; + color: #333; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; + border: 0; +} + +tt.descclassname { + background-color: transparent; + border: 0; +} + +tt.xref { + background-color: transparent; + font-weight: bold; + border: 0; +} + +a tt { + background-color: transparent; + font-weight: bold; + border: 0; + color: #CA7900; +} + +a tt:hover { + color: #2491CF; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.refcount { + color: #060; +} + +dt:target, +.highlight { + background-color: #fbe54e; +} + +dl.class, dl.function { + border-top: 2px solid #888; +} + +dl.method, dl.attribute { + border-top: 1px solid #aaa; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +pre { + line-height: 120%; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +.first { + margin-top: 0 !important; +} + +div.document { + background-color: white; + text-align: left; + background-image: url(contents.png); + background-repeat: repeat-x; +} + +/* +div.documentwrapper { + width: 100%; +} +*/ + +div.clearer { + clear: both; +} + +div.related h3 { + display: none; +} + +div.related ul { + background-image: url(navigation.png); + height: 2em; + list-style: none; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 0; + padding-left: 10px; +} + +div.related ul li { + margin: 0; + padding: 0; + height: 2em; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: #EE9816; +} + +div.related ul li a:hover { + color: #3CA8E7; +} + +div.body { + margin: 0; + padding: 0.5em 20px 20px 20px; +} + +div.bodywrapper { + margin: 0 240px 0 0; + border-right: 1px solid #ccc; +} + +div.body a { + text-decoration: underline; +} + +div.sphinxsidebar { + margin: 0; + padding: 0.5em 15px 15px 0; + width: 210px; + float: right; + text-align: left; +/* margin-left: -100%; */ +} + +div.sphinxsidebar h4, div.sphinxsidebar h3 { + margin: 1em 0 0.5em 0; + font-size: 0.9em; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border: 1px solid #86989B; + background-color: #6699FF; /* AFC1C4*/ +} + +div.sphinxsidebar ul { + padding-left: 1.5em; + margin-top: 7px; + list-style: none; + padding: 0; + line-height: 130%; +} + +div.sphinxsidebar ul ul { + list-style: square; + margin-left: 20px; +} + +p { + margin: 0.8em 0 0.5em 0; +} + +p.rubric { + font-weight: bold; +} + +h1 { + margin: 0; + padding: 0.7em 0 0.3em 0; + font-size: 1.5em; + color: #11557C; +} + +h2 { + margin: 1.3em 0 0.2em 0; + font-size: 1.35em; + padding: 0; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: black!important; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #aaa!important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + +div.footer { + background-color: #E3EFF1; + color: #86989B; + padding: 3px 8px 3px 0; + clear: both; + font-size: 0.8em; + text-align: right; +} + +div.footer a { + color: #86989B; + text-decoration: underline; +} + +div.pagination { + margin-top: 2em; + padding-top: 0.5em; + border-top: 1px solid black; + text-align: center; +} + +div.sphinxsidebar ul.toc { + margin: 1em 0 1em 0; + padding: 0 0 0 0.5em; + list-style: none; +} + +div.sphinxsidebar ul.toc li { + margin: 0.5em 0 0.5em 0; + font-size: 0.9em; + line-height: 130%; +} + +div.sphinxsidebar ul.toc li p { + margin: 0; + padding: 0; +} + +div.sphinxsidebar ul.toc ul { + margin: 0.2em 0 0.2em 0; + padding: 0 0 0 1.8em; +} + +div.sphinxsidebar ul.toc ul li { + padding: 0; +} + +div.admonition, div.warning { + font-size: 0.9em; + margin: 1em 0 0 0; + border: 1px solid #86989B; + background-color: #f7f7f7; +} + +div.admonition p, div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition pre, div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} + +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border-bottom: 1px solid #86989B; + font-weight: bold; + background-color: #AFC1C4; +} + +div.warning { + border: 1px solid #940000; +} + +div.warning p.admonition-title { + background-color: #CF0000; + border-bottom-color: #940000; +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + + +a.headerlink { + color: #c60f0f!important; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none!important; + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover { + background-color: #ccc; + color: white!important; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +img.inheritance { + border: 0px +} + +form.pfform { + margin: 10px 0 20px 0; +} + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} diff --git a/Web/_static/expTs.png b/Web/_static/expTs.png new file mode 100644 index 00000000..3e3e95f3 Binary files /dev/null and b/Web/_static/expTs.png differ diff --git a/Web/_static/expTsSmall.jpg b/Web/_static/expTsSmall.jpg new file mode 100644 index 00000000..1970c9cc Binary files /dev/null and b/Web/_static/expTsSmall.jpg differ diff --git a/Web/_static/header.png b/Web/_static/header.png new file mode 100644 index 00000000..a0e16ba8 Binary files /dev/null and b/Web/_static/header.png differ diff --git a/Web/_static/herrick.png b/Web/_static/herrick.png new file mode 100644 index 00000000..7c218902 Binary files /dev/null and b/Web/_static/herrick.png differ diff --git a/Web/_static/icon.png b/Web/_static/icon.png new file mode 100644 index 00000000..3ec68e50 Binary files /dev/null and b/Web/_static/icon.png differ diff --git a/Web/_static/labothap.png b/Web/_static/labothap.png new file mode 100644 index 00000000..a413f7c9 Binary files /dev/null and b/Web/_static/labothap.png differ diff --git a/Web/_static/logo_ORCNext.jpg b/Web/_static/logo_ORCNext.jpg new file mode 100644 index 00000000..697ca9c5 Binary files /dev/null and b/Web/_static/logo_ORCNext.jpg differ diff --git a/Web/_static/logoulg.gif b/Web/_static/logoulg.gif new file mode 100644 index 00000000..2baed74f Binary files /dev/null and b/Web/_static/logoulg.gif differ diff --git a/Web/_static/maplesoft_logo.png b/Web/_static/maplesoft_logo.png new file mode 100644 index 00000000..c6e50972 Binary files /dev/null and b/Web/_static/maplesoft_logo.png differ diff --git a/Web/_static/navigation.png b/Web/_static/navigation.png new file mode 100644 index 00000000..1081dc14 Binary files /dev/null and b/Web/_static/navigation.png differ diff --git a/Web/_static/poster.pdf b/Web/_static/poster.pdf new file mode 100644 index 00000000..5f1e7273 Binary files /dev/null and b/Web/_static/poster.pdf differ diff --git a/Web/_static/poster_thumb.png b/Web/_static/poster_thumb.png new file mode 100644 index 00000000..571e3130 Binary files /dev/null and b/Web/_static/poster_thumb.png differ diff --git a/Web/_templates/index.html b/Web/_templates/index.html new file mode 100644 index 00000000..5680a4d6 --- /dev/null +++ b/Web/_templates/index.html @@ -0,0 +1,68 @@ +{% extends "layout.html" %} +{% set title = 'CoolProp: Fluid properties for the masses' %} + +{% block body %} + + + +

What is CoolProp?

+ +

CoolProp is an open-source, cross-platform, free property database based in C++ that includes pure fluids, pseudo-pure fluids, and humid air properties.

+ +

Languages/Environments Supported

+ + + +
    +
  • Windows (XP, 7, 8?), Mac OSX, Linux/Unix (Ubuntu and friends)
  • +
+ +

To get CoolProp head to Downloads or check out the examples + +

Documentation

+ +

Changelog is here + +

Documentation is here

+ +

C++ documentation (doxygen) is here + +

As of February 2014, 114 pure and pseudo-pure fluids are included as well as 50 incompressible liquids. + +

Getting Help

+ +

If you have found a problem with CoolProp, please file a ticket at CoolProp support ticket and we will do our best for a speedy response (usually less than 24 hours) + +

You can also join the Google group: coolprop-users@googlegroups.com

+ +

Main Developers

+ +The primary developers are: + +

Ian Bell , Sylvain Quoilin , Vincent Lemort , University of Liege, Liege, Belgium +

Jorrit Wronski , Technical University of Denmark, Kgs. Lyngby, Denmark + +

Supporters

+ +
+ + + +{% endblock %} diff --git a/Web/_templates/indexsidebar.html b/Web/_templates/indexsidebar.html new file mode 100644 index 00000000..08458c8d --- /dev/null +++ b/Web/_templates/indexsidebar.html @@ -0,0 +1,20 @@ + +

News

+ +CoolProp was awarded the Prof. Gianfranco Angelino Award for Best Poster at the ASME ORC Conference 2013 held in Rotterdam, Netherlands +
+Here's the poster (click to view PDF): + + +

Help?

+ + File github issue +
+Google group + +

Open-source projects using CoolProp

+ ThermoCycle +
+ PDSim +
+ ACHP diff --git a/Web/_templates/layout.html b/Web/_templates/layout.html new file mode 100644 index 00000000..716b4910 --- /dev/null +++ b/Web/_templates/layout.html @@ -0,0 +1,27 @@ +{% extends "!layout.html" %} + + +{% block rootrellink %} +
  • Home
  • +
  • Search
  • +
  • Examples
  • +
  • Citation
  • +
  • Code
  • +
  • Downloads!
  • +
  • Documentation »
  • +{% endblock %} + + +{% block relbar1 %} + + +
    +matplotlib +
    +{{ super() }} +{% endblock %} + +{# put the sidebar before the body #} +{% block sidebar1 %}{{ sidebar() }}{% endblock %} +{% block sidebar2 %}{% endblock %} + diff --git a/Web/_templates/search.html b/Web/_templates/search.html new file mode 100644 index 00000000..181fc29a --- /dev/null +++ b/Web/_templates/search.html @@ -0,0 +1,39 @@ +{% extends "layout.html" %} +{% set title = _('Search') %} +{% set script_files = script_files + ['_static/searchtools.js'] %} +{% block body %} +

    {{ _('Search') }}

    +

    + {% trans %}From here you can search these documents. Enter your + search words into the box below and click "search". Note that the + search function will automatically search for all of the + words. Pages containing less words won't appear in the result + list.{% endtrans %} +

    +
    + + + +
    + {% if search_performed %} +

    {{ _('Search Results') }}

    + {% if not search_results %} +

    {{ _('Your search did not match any results.') }}

    + {% endif %} + {% endif %} +
    + {% if search_results %} +
      + {% for href, caption, context in search_results %} +
    • {{ caption }} +
      {{ context|e }}
      +
    • + {% endfor %} +
    + {% endif %} +
    +{% endblock %} +{% block footer %} + {{ super() }} + +{% endblock %} diff --git a/Web/apidoc/CoolProp.Plots.rst b/Web/apidoc/CoolProp.Plots.rst new file mode 100644 index 00000000..9b2e2487 --- /dev/null +++ b/Web/apidoc/CoolProp.Plots.rst @@ -0,0 +1,35 @@ +Plots Package +============= + +:mod:`Plots` Package +-------------------- + +.. automodule:: CoolProp.Plots + :members: + :undoc-members: + :show-inheritance: + +:mod:`Plots` Module +------------------- + +.. automodule:: CoolProp.Plots.Plots + :members: + :undoc-members: + :show-inheritance: + +:mod:`PsychChart` Module +------------------------ + +.. automodule:: CoolProp.Plots.PsychChart + :members: + :undoc-members: + :show-inheritance: + +:mod:`SimpleCycles` Module +-------------------------- + +.. automodule:: CoolProp.Plots.SimpleCycles + :members: + :undoc-members: + :show-inheritance: + diff --git a/Web/apidoc/CoolProp.rst b/Web/apidoc/CoolProp.rst new file mode 100644 index 00000000..889bc959 --- /dev/null +++ b/Web/apidoc/CoolProp.rst @@ -0,0 +1,9 @@ +CoolProp Module +=============== + +.. automodule:: CoolProp.CoolProp + :synopsis: + :members: + :undoc-members: + :show-inheritance: + :exclude-members: State,HAProps,HAProps_Aux,PureFluidClass \ No newline at end of file diff --git a/Web/apidoc/HumidAirProp.rst b/Web/apidoc/HumidAirProp.rst new file mode 100644 index 00000000..fa4a109c --- /dev/null +++ b/Web/apidoc/HumidAirProp.rst @@ -0,0 +1,7 @@ +HumidAirProp Module +=================== + +.. automodule:: CoolProp.HumidAirProp + :members: HAProps, HAProps_Aux + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/Web/apidoc/Plots.rst b/Web/apidoc/Plots.rst new file mode 100644 index 00000000..00b1df46 --- /dev/null +++ b/Web/apidoc/Plots.rst @@ -0,0 +1,42 @@ +Plots Package +============= + +:mod:`CoolProp.Plots` Package +----------------------------- + +.. automodule:: CoolProp.Plots + :members: + :undoc-members: + :show-inheritance: + +:mod:`CoolProp.Plots.Common` Module +------------------------------------- + +.. automodule:: CoolProp.Plots.Common + :members: + :undoc-members: + :show-inheritance: + +:mod:`CoolProp.Plots.Plots` Module +---------------------------------- + +.. automodule:: CoolProp.Plots.Plots + :members: + :undoc-members: + :show-inheritance: + +:mod:`CoolProp.Plots.PsychChart` Module +--------------------------------------- + +.. automodule:: CoolProp.Plots.PsychChart + :members: + :undoc-members: + :show-inheritance: + +:mod:`SimpleCycles` Module +-------------------------- + +.. automodule:: CoolProp.Plots.SimpleCycles + :members: + :undoc-members: + :show-inheritance: diff --git a/Web/apidoc/State.rst b/Web/apidoc/State.rst new file mode 100644 index 00000000..dec29521 --- /dev/null +++ b/Web/apidoc/State.rst @@ -0,0 +1,6 @@ +State Module +============ + +.. automodule:: CoolProp.State + :members: State, PureFluidClass + :undoc-members: \ No newline at end of file diff --git a/Web/apidoc/modules.rst b/Web/apidoc/modules.rst new file mode 100644 index 00000000..b5f770cc --- /dev/null +++ b/Web/apidoc/modules.rst @@ -0,0 +1,10 @@ +CoolProp +======== + +.. toctree:: + :maxdepth: 4 + + CoolProp + HumidAirProp + Plots + State diff --git a/Web/changelog.rst b/Web/changelog.rst new file mode 100644 index 00000000..6c2250bc --- /dev/null +++ b/Web/changelog.rst @@ -0,0 +1,300 @@ +Changelog for CoolProp +====================== + +4.1.2 +----- +* Fixed default calling convention on 32-bit windows to set back to __stdcall. This change should fix DLL-based wrappers that want __cdecl calling convention + +4.1.1 +----- +* Fixed EES wrapper +* PropsSI function gives correct units for python + +4.1.0 +----- +* MAJOR: Added unit testing at the C++ level based on Catch +* Added EOS for Methanol from Piazza based on SAFT association term +* Added ``Prandtl`` as an output variable +* Predefined mixtures (R404A, R410A, R407C, R507A, Air) can be used with REFPROP using a fluid name like "REFPROP-MIX:R410A.mix" where R410A.mix is a predefined mixture file in the mixtures folder of REFPROP +* Export HAProps in Javascript +* Improved some edge cases for ``P``, ``S`` inputs +* Added wrappers for Maple and Mathematica +* Added PropsSI function to DLL that always takes and returns SI units +* Improved EES support for newer versions of EES that broke CoolProp support (EES strings are not case sensitive) +* Added upper-case aliases for all fluids and input variables (to support EES) +* Fixed TTSE and dylib compilation on MacOS +* Added basic wrappers for Fortran and C +* Added incompressible fluids AS10, AS20, AS30, AS40, AS55, ZS10, ZS25, ZS40, ZS45, ZS55 + +4.0.0 +----- +* API CHANGE: Some functions have been condensed, functions get_errstring, get_REFPROPname, etc. have been rolled into get_global_param_string. +* MAJOR: Code now is on github (https://github.com/ibell/coolprop) +* MAJOR: Internally all units are SI, functions should do the necessary conversions using conversion_factor() and get/set_standard_unit_system() +* MAJOR: Brines and incompressible liquids are added to CoolPropStateClass +* MAJOR: Preparing to phase out of DerivTerms function, Props now handles derivatives as well. +* Wrappers added for Java, Javascript, MathCAD, MathCAD Prime +* Improved wrapper for Labview (Thanks to the Sergei and guys at UGent) +* Improved plotting in Python (Thanks Logan) +* Improved Modelica wrapper and added incompressible fluids with p,T and p,h as state variables +* Added viscosity for n-Hexane +* Added R1233zd(E) +* Added more incompressible liquids: Therminol D12, Therminol VP-1, Therminol 72, Therminol 66, Dowtherm J, Dowtherm Q, Texatherm 22, + Nitrate Salt Blend, Syltherm XLT, Dynalene HC-10, Dynalene HC-20, Dynalene HC-30, Dynalene HC-40, Dynalene HC-50 +* Added slurry ice as incompressible solution of either water-ethanol, water-NaCl or water-propylene glycol with solid content as input +* Added corrosion inhibitor ZitrecAC, anti-freezing agent Pekasol2000 +* Added Lithium-Bromide/water as incompressible solution (Thanks to Jaroslav Pátek) + +3.3.0 (revision 660) +-------------------- +* MAJOR: Added bicubic interpolation to TTSE method. Enable by calling ``set_TTSE_mode(Fluid,"TTSE")`` or ``set_TTSE_mode(Fluid,"BICUBIC")`` (for bicubic interpolation). Default is normal TTSE interpolation +* Added deuterium and its isomers from preprint +* Isobutane aliases added +* More work on incompressible liquids + +3.2.0 (revision 619) +-------------------- +* Added the function PropsU to python wrapper which allows for use of SI of kSI set of units +* Both inputs to Props can be iterables +* Added the fluid R1234ze(Z) +* Renamed R1234ze to R1234ze(E) +* H-S works +* P-H, P-S fixed +* Fixed n-Undecane entropy +* Fixes to wetbulb temperature +* First code for Mixtures - not exposed through API +* CAS numbers added for all fluids - retrieve using the function ``get_CAS_code`` + +3.1.2 (revision 577) +-------------------- + +* Added the fluids Fluorine, Methanol, R114, R13, R14, R21, RC318, R12, R113 +* Isolines are now available for plots (H/T Jorrit Wronski) +* Environmental information on fluids is included, can be obtained using keys GWP100, ODP +* Fixed a bug in HAProps between 273.15 K and 273.16 K +* Fixed some small bugs in ECS for transport properties +* Fixed some bugs in higher derivatives of Helmholtz energy terms + +3.1.1 (revision 544) +-------------------- + +* Added the fluid Propyne +* Fixed ECS core code +* Added ECS parameters and changed reference fluids for a lot of fluids +* Fixed Air and H2S transport equations +* Fixed compilation bug for sources + +3.1 (revision 534) +------------------ + +* Added the fluids Propylene, Cyclopentane, R236FA, R236EA, R227EA, R123, R152A, R227EA, R365MFC, R161, HFE143M, Benzene, R11, Undecane, R125, Cyclopropane, Neon, R124 +* Added the viscosity and conductivity correlations for a lot of fluids +* Added surface tension, Lennard-Jones parameters for a lot of fluids +* Added enthalpy, entropy as inputs +* Added pressure, density as inputs +* CoolProp builds on Raspberry PI +* CoolProp works in MATLAB on OSX +* Python unit tests have been added in wrappers/CoolProp/CoolProp/tests - a work in progress + +3.0 (revision 325) +------------------ + +* Added Tabular Taylor Series Expansion (see documentation) +* All the way to the critical point for almost all fluids +* Support added for Modelica, Python 3.x and Labview + +2.5 (revision 247) +------------------ + +* Added EES wrapper (r245-r247) +* Saturation derivatives dhdp and d2hdp2 (r244) +* Caching of Helholtz derivatives in CPState.cpp (r243) +* Added Xylenes and EthylBenzene (r242) +* Added n-Dodecane, R23, DMC (r241) + + +2.4 (revision 240) +------------------ + +* Added the fluids R1234ze, DME, R143a, n-Pentane, n-Hexane, n-Octane, n-Heptane, CycleHexane, 1-Butene,trans-2-Butene, cis-2-Butene,IsoButene, MethylLinoleate, MethylLinolenate, MethylOleate, MethylPalmitate, MethylStearate +* Added C# wrappers (built for Windows) (r240) +* Added Phase_Trho() and Phase_Tp() functions (r240) +* Cleanup of the build process. svnrevision is saved to a file that is built in. Can access the svn revision through the functions get_svnrevision() and get_version() +* Added a genetic algorithm to build ancillaries to dev folder (r226) +* Added third partial derivatives of all the Helmholtz Energy terms (r238) +* Bugfixes: + #. Fixed Q(T,rho) (r237) (https://sourceforge.net/p/coolprop/tickets/42/) + #. dhdT and dhdrho added back (r232) + #. Surface tension now properly has the units of N/m as specified in the docs (r228) + #. Fixed bug from Reiner with V and Vda (r227) + #. Added a Brent solver to fix the solution for the saturation around the critical point (r220)(https://sourceforge.net/p/coolprop/tickets/38/) + #. Repaired saturation LUT (r214-r216) + #. Fixed bugs in IsFluidType as well as fixed bugs in Brine entropy calculations (r213) + +2.3 (revision 212) +------------------ + +* Added updated correlations for brines and subcooled liquids from Melinder 2010 (r207) +* Added aliases to docs and python and DLL (r211) +* Excel wrapper updated to catch errors and output them to a message box +* Big speed update to p,Q as inputs (as fast as REFPROP now) (r202) +* Doxygen now gets updated as well (r200) +* Bugfixes: + #. Updated inputs for brines (order doesn't matter) (r208) + #. Fixed REFPROP with single-input props (r206) + #. Fixed Manifest file for source distro (r206) + #. Fixed bug with REFPROP mixtures not being properly parsed (r205 & r212) + #. Added a backup Brent method for HAProps when solving at low humidity ratio: closed https://sourceforge.net/p/coolprop/tickets/32/ (r204) + #. Added an example to show how to get version of CoolProp: closed https://sourceforge.net/p/coolprop/tickets/34/ (r204) + #. Closed the bugs/issues in https://sourceforge.net/p/coolprop/tickets/35/ (r203) + #. Resolved memory leak with ECS (r201) + +2.2.5 (revision 199) +-------------------- + +* P,h and p,s as inputs solve for almost all fluids under almost all conditions +* Octave modules for 3.6.1 and 3.6.2 now build and run properly for VS build on Windows +* Builds properly on Linux now +* Bugfixes: + #. REFPROP.cpp bug with mixtures (r195) + #. fixes around critical point (r198) + #. Ancillaries for R134a updated in the vicinity of critical point + +2.2.4 (revision 192) +-------------------- + +* Does not die if pseudo-pure T,P are in the two-phase region +* Fixed bug with dewpoint as an input for dewpoints below 0C +* Added a CoolPropStateClass for elegantly handling inputs - internal codebase will soon transition to this entirely +* Fixed derivatives of drhodp|h and drhodh|p in two-phase region +* Improved ancillary equations for Siloxanes (were terrible!) +* Improved ancillary equations for Ethanol +* Improved ancillary equations for SES36 +* Tmin is now an option for CoolProp and REFPROP fluids - ex: Props("REFPROP-MDM","Tmin") or Props("MDM","Tmin") +* T_hp is now faster than REFPROP +* Added Excel 2003 Add-in for CoolProp - not clear it is working though +* Improved the Distro builder + + +2.2.3 (revision 172) +-------------------- + +* Added Ethylene, SF6, Ethanol, Methane, Ethane, n-Butane, Isobutane +* x(h,p) is much faster due to the avoidance of a lot of saturation routine calls +* x(p,Q) is about 200 times faster!! +* Added Quality 'Q' as an output +* Fixed properties for Air +* Fixed ancillaries for Siloxanes + +2.2.2 (revision 169) +-------------------- + +* Added MATLAB wrappers and compiled versions on Windows to batch +* Added plots to check solvers for (T,p) and (h,p) in subcooled liquid and superheated vapor regions + +2.2.1 (revision 166) +-------------------- + +* Added the fluid SES36 +* HAProps added to CoolProp wrapper and added to Excel addin +* When using pseudo-pure fluid, saturation density are calculated based on solving for density given T,P and guess value given by ancillary for density +* Improved saturated vapor ancillary for SES36 +* Changed default names: R717 -> Ammonia, R744 -> CarbonDioxide, R290 -> Propane + +2.2.0 (revision 164) +-------------------- + +* Added the Siloxanes (MM,MDM,MD2M,MD3M,MD4M,D4,D5,D6) +* Added a script that will build all the parts (Excel DLL, Python, MATLAB, etc.) and upload to Sourceforge +* Very-alpha code for use of CoolProp in Modelica +* Enthalpy and pressure are valid inputs for Brine fluids +* Added support for quantities package in Python code (If you provide quantities.Quantity instance to CoolProp.CoolProp.Props, the units will be converted to the default units for CoolProp; Default units can be obtained by calling get_index_units(iParam) as a std::string; If a string for the desired output units is passed to Props the units will be converted to the output units) +* Internals of CoolProp changed again, added a function called IProps that uses the integer indices for the input terms as well as the fluids - significant speedup. This is mostly for use with CoolProp.State.State in Python although the same principle can be used elsewhere +* Bug fixes for ECS + +2.1.0 (revision 154) +-------------------- + +* Added the fluids Hydrogen, Oxygen, and Helium +* Added the output term 'accentric' to get the accentric factor of the fluid +* Checking of input temperature now yields errors for bad temperatures below fluid min temp +* Fixed T(h,p) and T(s,p) in two-phase region +* Fixed Units on surface tension to N/m + +2.0.6 (revision 147) +-------------------- + +* Fixed entropy of humid air at above-atmospheric pressure (Typo in RP-1485) +* Added specific heat of humid air +* Changes to setup.py so that it will not build if cython version < 0.17 which is a requirement due to the use of STL containers +* Changes to plot module to allow for showing right after plot + +2.0.5 (revision 143) +-------------------- + +* Fixed wetbulb and dewpoint calculations - works correctly now +* Added wrappers for MATLAB and Octave to subversion code - not included in source distro + +2.0.4 (revision 132) +-------------------- + +* Fixed density for subcooled liquid +* Fixed setup.py for OSX (I think) +* Using cython for wrapping of CoolProp module +* CoolProp module - removed T_hp and h_sp - use Props instead +* Added IceProps function to HumidAirProps +* Added and fixed CO2 transport properties + +2.0.1 (revision 122) +-------------------- + +* Implemented the method of Akasaka to calculate the saturation state (works great). H/T to FPROPS for the recommendation +* Fixed the calculations for T(h,p) up to a subcooling of 50 K, works fine in superheated vapor +* Added the ideal-gas specific heat with key of C0 + +2.0.0 (revision 107) +-------------------- + +* MAJOR revision to the internals of CoolProp +* Entropy added for humid air (Only fully validated at atmospheric pressure) +* Added the fluids R22, R1234yf and the 20 industrial fluids from Lemmon, 2000 +* Added ECS model for calculation of transport properties (somewhat experimental) +* Added surface tension for all fluids. Property key is 'I' for surface tension +* Some functions have been removed in order to better handle errors at the C++ level. + Tcrit(), Tsat() and pcrit() are gone, in Python call Props('R134a','Tcrit') for instance to get Tcrit +* Many other bug fixes. +* Documentation to follow. + +1.4.0 (revision 75) +------------------- + +* Internal codebase rewritten in C++ to allow for better exception handling and function overloading +* All work now happens in CoolProp.cpp (inspired by FPROPS) +* Added 2-D lookup table (temperature and pressure) directly in CoolProp. Enable by calling UseSinglePhaseLUT(1) to turn on, UseSinglePhaseLUT(0) to turn off +* Compiled with the -builtin compilation flag +* Documentation updated for UseSinglePhaseLUT + +1.3.2 (revision 49) +------------------- + +* Added functions to use Isothermal compressibility correlation UseIsothermCompressCorrelation and ideal gas compressibility UseIdealGasEnthalpyCorrelations + +1.3.1 (revision 48) +------------------- + +* Updated documentation +* Added ability to use virial term correlations for Humid air by call to UseVirialCorrelation(1) + +1.3 (revision 41): +------------------ + +* Added pseudo-pure fluid Air using EOS from Lemmon +* Added EOS for ice from IAPWS +* Updated Humid Air Thermo Props to use analysis from ASHRAE RP-1845, though IAPWS-1995 is used throughout for water vapor +* Enable the use of lookup tables for refrigerant saturation properties[ call UseSaturationLUT(1) to turn on, and UseSaturationLUT(0) to turn off] Speed up is very significant! + +1.2.2 (revision 35): +-------------------- + +* Added some simple cycles for comparison of different working fluids +* Fixed quality calculations to agree with REFPROP diff --git a/Web/citation.rst b/Web/citation.rst new file mode 100644 index 00000000..2a63dd48 --- /dev/null +++ b/Web/citation.rst @@ -0,0 +1,31 @@ + +Overview +======== +A paper covering CoolProp has been published in the journal Industrial & Engineering Chemistry Research (`link to paper `_). + +As CoolProp is free to all users, we simply ask that if you use CoolProp in your academic work that you make a reference to CoolProp. + +If you use CoolProp, please cite the article (open-access) cited below, and the domain www.coolprop.org + +BibTeX +====== + +BibTeX citation:: + + @article{doi:10.1021/ie4033999, + author = {Bell, Ian H. and Wronski, Jorrit and Quoilin, Sylvain and Lemort, Vincent}, + title = {Pure and Pseudo-pure Fluid Thermophysical Property Evaluation and the Open-Source Thermophysical Property Library CoolProp}, + journal = {Industrial \& Engineering Chemistry Research}, + volume = {53}, + number = {6}, + pages = {2498-2508}, + year = {2014}, + doi = {10.1021/ie4033999}, + + URL = {http://pubs.acs.org/doi/abs/10.1021/ie4033999}, + eprint = {http://pubs.acs.org/doi/pdf/10.1021/ie4033999} + } + +See Also +======== +www.coolprop.org \ No newline at end of file diff --git a/Web/conf.py b/Web/conf.py new file mode 100644 index 00000000..84e0ba3e --- /dev/null +++ b/Web/conf.py @@ -0,0 +1,229 @@ + +# -*- coding: utf-8 -*- +# +# sampledoc documentation build configuration file, created by +# sphinx-quickstart on Tue Aug 11 05:04:40 2009. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +sys.path.append(os.path.abspath('sphinxext')) + +# -- 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 = [#'matplotlib.sphinxext.only_directives', + 'matplotlib.sphinxext.plot_directive', + 'matplotlib.sphinxext.ipython_directive', + 'sphinx.ext.intersphinx', + 'sphinx.ext.autodoc', + 'sphinx.ext.mathjax', + 'ipython_console_highlighting', + 'sphinxcontrib.napoleon' + #'inheritance_diagram', + #'numpydoc', + #'breathe' + ] + +plot_formats = [('png',80)] + +numpydoc_show_class_members = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'contents' + +# General information about the project. +project = u'CoolProp' +copyright = u'2012, Ian Bell' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +import CoolProp +ver = CoolProp.__version__ +# The short X.Y version. +version = ver.rsplit('.',1)[0] +# The full version, including alpha/beta/rc tags. +release = ver + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['_build','sphinxext'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +#This value selects what content will be inserted into the main body of an autoclass directive. +#'class' - Only the class’ docstring is inserted. This is the default. +#'init' - Only the __init__ method’s docstring is inserted. +#'both' - Both the class’ and the __init__ method’s docstring are concatenated and inserted +autoclass_content = 'both' + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +## html_theme = 'sphinxdoc' + +## html_theme='nature' + +# The style sheet to use for HTML and HTML Help pages. A file of that name +# must exist either in Sphinx' static/ path, or in one of the custom paths +# given in html_static_path. +html_style = 'Coolprop.css' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# 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'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Content template for the index page. +html_index = 'index.html' + +# Custom sidebar templates, maps page names to templates. +html_sidebars = {'index': 'indexsidebar.html', + } + +# Additional templates that should be rendered to pages, maps page names to +# template names. +html_additional_pages = {'index': 'index.html'} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'sampledocdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('contents', 'CoolPropdoc.tex', u'CoolProp Documentation', + u'Ian Bell', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff --git a/Web/contents.rst b/Web/contents.rst new file mode 100644 index 00000000..e324a832 --- /dev/null +++ b/Web/contents.rst @@ -0,0 +1,20 @@ +.. CoolProp documentation file + +********************* +Welcome to CoolProp +********************* + +CoolProp is an open-source database of fluid and humid air properties, formulated based on the most accurate formulations in open literature. It has been validated against the most accurate data available from the relevant references. + +.. toctree:: + :maxdepth: 2 + + HowGetIt.rst + examples/examples.rst + EOS.rst + citation.rst + TTSE.rst + FluidInformation.rst + HumidAir.rst + changelog.rst + apidoc/modules.rst \ No newline at end of file diff --git a/Web/examples/C++/Example.cpp b/Web/examples/C++/Example.cpp new file mode 100644 index 00000000..c8f6362f --- /dev/null +++ b/Web/examples/C++/Example.cpp @@ -0,0 +1,101 @@ +#include "CoolProp.h" +#include "HumidAirProp.h" +#include "CPState.h" +#include +#include + +#pragma GCC diagnostic ignored "-Wwrite-strings" //Ignore char* warnings + +int main() { + double T, h, p, D; + + printf("CoolProp version:\t%s\n", get_global_param_string("version").c_str()); + printf("CoolProp gitrevision:\t%s\n", get_global_param_string("gitrevision").c_str()); + printf("CoolProp fluids:\t%s\n", get_global_param_string("FluidsList").c_str()); + + printf("\n************ USING EOS *************\n"); + + printf("FLUID STATE INDEPENDENT INPUTS\n"); + printf("Critical Density Propane: %f kg/m^3\n", Props1("Propane", "rhocrit")); + + printf("\nTWO PHASE INPUTS (Pressure)\n"); + printf("Density of saturated liquid Propane at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 0, "Propane")); + printf("Density of saturated vapor R290 at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 1, "R290")); + + printf("\nTWO PHASE INPUTS (Temperature)\n"); + printf("Density of saturated liquid Propane at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 0, "Propane")); + printf("Density of saturated vapor R290 at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 1, "R290")); + + printf("\nSINGLE PHASE CYCLE (Propane)\n"); + p = Props("P", 'T', 300, 'D', 1, "Propane"); + h = Props("H", 'T', 300, 'D', 1, "Propane"); + printf("T,D -> P,H : 300,1 -> %f,%f\n", p, h); + + T = Props("T", 'P', p, 'H', h, "Propane"); + D = Props("D", 'P', p, 'H', h, "Propane"); + printf("P,H -> T,D : %f, %f -> %f, %f\n", p, h, T, D); + + printf("\n************ USING TTSE ***************\n"); + enable_TTSE_LUT("Propane"); + + printf("TWO PHASE INPUTS (Pressure)\n"); + printf("Density of saturated liquid Propane at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 0, "Propane")); + printf("Density of saturated vapor R290 at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 1, "R290")); + + printf("\nTWO PHASE INPUTS (Temperature)"); + printf("Density of saturated liquid Propane at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 0, "Propane")); + printf("Density of saturated vapor R290 at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 1, "R290")); + + printf("\nSINGLE PHASE CYCLE (propane)\n"); + p = Props("P", 'T', 300, 'D', 1, "Propane"); + h = Props("H", 'T', 300, 'D', 1, "Propane"); + printf("T,D -> P,H : 300,1 -> %f,%f", p, h); + + T = Props("T", 'P', p, 'H', h, "Propane"); + D = Props("D", 'P', p, 'H', h, "Propane"); + printf("P,H -> T,D : %f, %f -> %f, %f\n", p, h, T, D); + + disable_TTSE_LUT("Propane"); + + try + { + printf("\n************ USING REFPROP ***************\n"); + std::string RPName = std::string("REFPROP-")+get_fluid_param_string("Propane","REFPROPname"); + printf("TWO PHASE INPUTS (Pressure)"); + printf("Density of saturated liquid Propane at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 0, RPName)); + printf("Density of saturated vapor R290 at 101.325 kPa: %f kg/m^3\n", Props("D", 'P', 101.325, 'Q', 1, RPName)); + + printf("\nTWO PHASE INPUTS (Temperature)"); + printf("Density of saturated liquid Propane at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 0, RPName)); + printf("Density of saturated vapor R290 at 300 K: %f kg/m^3\n", Props("D", 'T', 300, 'Q', 1, RPName)); + + printf("\nSINGLE PHASE CYCLE (propane)\n"); + p = Props("P", 'T', 300, 'D', 1, RPName); + h = Props("H", 'T', 300, 'D', 1, RPName); + printf("T,D -> P,H : 300,1 -> %f,%f\n", p, h); + + T = Props("T", 'P', p, 'H', h, RPName); + D = Props("D", 'P', p, 'H', h, RPName); + printf("P,H -> T,D : %f, %f -> %f, %f\n", p, h, T, D); + } + catch (std::exception &e) + { + printf("\n************ CANT USE REFPROP ************\n"); + } + + printf("\n************ CHANGE UNIT SYSTEM (default is kSI) *************\n"); + set_standard_unit_system(UNIT_SYSTEM_SI); + printf("Vapor pressure of water at 373.15 K in SI units (Pa): %f\n", Props("P", 'T', 373.15, 'Q', 0, "Water")); + + set_standard_unit_system(UNIT_SYSTEM_KSI); + printf("Vapor pressure of water at 373.15 K in kSI units (kPa): %f\n", Props("P", 'T', 373.15, 'Q', 0, "Water")); + + printf("\n************ BRINES AND SECONDARY WORKING FLUIDS *************\n"); + printf("Density of 50%% (mass) ethylene glycol/water at 300 K, 101.325 kPa: %f kg/m^3\n", Props("D", 'T', 300, 'P', 101.325, "EG-50%")); + printf("Viscosity of Therminol D12 at 350 K, 101.325 kPa: %f Pa-s\n", Props("V", 'T', 350, 'P', 101.325, "TD12")); + + printf("\n************ HUMID AIR PROPERTIES *************\n"); + printf("Humidity ratio of 50%% rel. hum. air at 300 K, 101.325 kPa: %f kg_w/kg_da\n", HAProps("W", "T", 300, "P", 101.325, "R", 0.5)); + printf("Relative humidity from last calculation: %f (fractional)\n", HAProps("R", "T", 300, "P", 101.325, "W", HAProps("W", "T", 300, "P", 101.325, "R", 0.5))); + return 0; +} diff --git a/Web/examples/C++/Output.txt b/Web/examples/C++/Output.txt new file mode 100644 index 00000000..ea195fbc --- /dev/null +++ b/Web/examples/C++/Output.txt @@ -0,0 +1,57 @@ +CoolProp version: 4.1.2 +CoolProp gitrevision: 016d3219602f0ea2e5eac89f21b3ab0e54cdc941 +CoolProp fluids: Water,R134a,Helium,Oxygen,Hydrogen,ParaHydrogen,OrthoHydrogen,Argon,CarbonDioxide,Nitrogen,n-Propane,Ammonia,R1234yf,R1234ze(E),R32,R22,SES36,Ethylene,SulfurHexafluoride,Ethanol,DimethylEther,DimethylCarbonate,R143a,R23,n-Dodecane,Propylene,Cyclopentane,R236FA,R236EA,R227EA,R365MFC,R161,HFE143m,Benzene,n-Undecane,R125,CycloPropane,Neon,R124,Propyne,Fluorine,Methanol,RC318,R21,R114,R13,R14,R12,R113,R1234ze(Z),R1233zd(E),AceticAcid,R245fa,R41,CarbonMonoxide,CarbonylSulfide,n-Decane,HydrogenSulfide,Isopentane,Neopentane,Isohexane,Krypton,n-Nonane,Toluene,Xenon,R116,Acetone,NitrousOxide,SulfurDioxide,R141b,R142b,R218,Methane,Ethane,n-Butane,IsoButane,n-Pentane,n-Hexane,n-Heptane,n-Octane,CycloHexane,R152A,R123,R11,MDM,MD2M,MD3M,D6,MM,MD4M,D4,D5,1-Butene,IsoButene,cis-2-Butene,trans-2-Butene,MethylPalmitate,MethylStearate,MethylOleate,MethylLinoleate,MethylLinolenate,o-Xylene,m-Xylene,p-Xylene,EthylBenzene,Deuterium,ParaDeuterium,OrthoDeuterium,Air,R404A,R410A,R407C,R507A,R407F + +************ USING EOS ************* +FLUID STATE INDEPENDENT INPUTS +Critical Density Propane: 220.478100 kg/m^3 + +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.882952 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.416136 kg/m^3 + +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.447375 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629532 kg/m^3 + +SINGLE PHASE CYCLE (Propane) +T,D -> P,H : 300,1 -> 56.072763,634.733626 +P,H -> T,D : 56.072763, 634.733626 -> 300.000000, 1.000000 + +************ USING TTSE *************** +TWO PHASE INPUTS (Pressure) +0.189 to build both two phase tables +1.949 to build single phase table with p,h +8.712 to build single phase table for T,rho +write time: 0.066 +Density of saturated liquid Propane at 101.325 kPa: 580.882952 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.416136 kg/m^3 + +TWO PHASE INPUTS (Temperature)Density of saturated liquid Propane at 300 K: 489.447377 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629532 kg/m^3 + +SINGLE PHASE CYCLE (propane) +T,D -> P,H : 300,1 -> 56.072764,634.733626P,H -> T,D : 56.072764, 634.733626 -> 300.000000, 1.000000 + +************ USING REFPROP *************** +TWO PHASE INPUTS (Pressure)Density of saturated liquid Propane at 101.325 kPa: 580.882952 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.416136 kg/m^3 + +TWO PHASE INPUTS (Temperature)Density of saturated liquid Propane at 300 K: 489.447375 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629532 kg/m^3 + +SINGLE PHASE CYCLE (propane) +T,D -> P,H : 300,1 -> 56.072763,634.733630 +P,H -> T,D : 56.072763, 634.733630 -> 300.000000, 1.000000 + +************ CHANGE UNIT SYSTEM (default is kSI) ************* +Vapor pressure of water at 373.15 K in SI units (Pa): 101417.996660 +Vapor pressure of water at 373.15 K in kSI units (kPa): 101.417997 + +************ BRINES AND SECONDARY WORKING FLUIDS ************* +Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: 1061.179308 kg/m^3 +Viscosity of Therminol D12 at 350 K, 101.325 kPa: 0.000523 Pa-s + +************ HUMID AIR PROPERTIES ************* +Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: 0.011096 kg_w/kg_da +Relative humidity from last calculation: 0.500000 (fractional) diff --git a/Web/examples/C++/example.rst b/Web/examples/C++/example.rst new file mode 100644 index 00000000..ff1346c6 --- /dev/null +++ b/Web/examples/C++/example.rst @@ -0,0 +1,11 @@ +Example Code for C++ +==================== + +Code +---- +.. literalinclude:: Example.cpp + :language: c++ + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/C++/run_example.bat b/Web/examples/C++/run_example.bat new file mode 100644 index 00000000..ee47791e --- /dev/null +++ b/Web/examples/C++/run_example.bat @@ -0,0 +1,18 @@ +REM ******** set the variables ************ +REM call both to ensure that one works +call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +REM ******* compile all the sources from CoolProp *************** +cl /c /Ox /fp:fast /I../../../CoolProp /EHsc Example.cpp +if %errorlevel% neq 0 exit /b %errorlevel% +cl /c /Ox /MP3 /fp:fast /I../../../CoolProp /EHsc ../../../CoolProp/*.cpp +if %errorlevel% neq 0 exit /b %errorlevel% + +link *.obj /OUT:Example.exe +if %errorlevel% neq 0 exit /b %errorlevel% +erase *.obj + +call Example > Output.txt +if %errorlevel% neq 0 exit /b %errorlevel% +erase Example.exe \ No newline at end of file diff --git a/Web/examples/CSharp/Example.cs b/Web/examples/CSharp/Example.cs new file mode 100644 index 00000000..af9a25f5 --- /dev/null +++ b/Web/examples/CSharp/Example.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ConsoleApplication1 +{ + class Program + { + static void Main(string[] args) + { + double T, h, p, D; + Console.Write("CoolProp version: " + CoolProp.get_global_param_string("version") + "\n"); + Console.Write("CoolProp gitrevision: " + CoolProp.get_global_param_string("gitrevision") + "\n"); + Console.Write("CoolProp fluids: " + CoolProp.get_global_param_string("FluidsList") + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ USING EOS *************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("FLUID STATE INDEPENDENT INPUTS" + "\n"); + Console.Write("Critical Density Propane: " + CoolProp.Props1("Propane", "rhocrit") + "kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + Console.Write("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + p = CoolProp.Props("P", 'T', 300, 'D', 1, "Propane"); + h = CoolProp.Props("H", 'T', 300, 'D', 1, "Propane"); + Console.Write("T,D -> P,H " + 300 + "," + 1 + " --> " + p + ',' + h + "\n"); + T = CoolProp.Props("T", 'P', p, 'H', h, "Propane"); + D = CoolProp.Props("D", 'P', p, 'H', h, "Propane"); + Console.Write("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ USING TTSE ***************" + "\n"); + Console.Write(" " + "\n"); + CoolProp.enable_TTSE_LUT("Propane"); + Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + Console.Write("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + p = CoolProp.Props("P", 'T', 300, 'D', 1, "Propane"); + h = CoolProp.Props("H", 'T', 300, 'D', 1, "Propane"); + Console.Write("T,D -> P,H " + 300 + ","+ 1+ " --> " + p + ',' + h + "\n"); + T = CoolProp.Props("T", 'P', p, 'H', h, "Propane"); + D = CoolProp.Props("D", 'P', p, 'H', h, "Propane"); + Console.Write("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D + "\n"); + CoolProp.disable_TTSE_LUT("Propane"); + + try + { + Console.Write(" " + "\n"); + Console.Write("************ USING REFPROP ***************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + Console.Write("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3" + "\n"); + Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + p = CoolProp.Props("P",'T',300,'D',1,"Propane"); + h = CoolProp.Props("H",'T',300,'D',1,"Propane"); + Console.Write("T,D -> P,H " + 300 + "," + 1 + " --> " + p + ',' + h + "\n"); + T = CoolProp.Props("T",'P',p,'H',h,"Propane"); + D = CoolProp.Props("D",'P',p,'H',h,"Propane"); + Console.Write("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D + "\n"); + } + catch + { + Console.Write(" " + "\n"); + Console.Write("************ CANT USE REFPROP ************" + "\n"); + Console.Write(" " + "\n"); + } + + Console.Write(" " + "\n"); + Console.Write("************ CHANGE UNIT SYSTEM (default is kSI) *************" + "\n"); + Console.Write(" " + "\n"); + int SI = (int)unit_systems.UNIT_SYSTEM_SI; + int kSI = (int)unit_systems.UNIT_SYSTEM_KSI; + CoolProp.set_standard_unit_system(SI); + Console.Write("Vapor pressure of water at 373.15 K in SI units (Pa): " + CoolProp.Props("P", 'T', 373.15, 'Q', 0, "Water") + "\n"); + CoolProp.set_standard_unit_system(kSI); + Console.Write("Vapor pressure of water at 373.15 K in kSI units (kPa): " + CoolProp.Props("P", 'T', 373.15, 'Q', 0, "Water") + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ BRINES AND SECONDARY WORKING FLUIDS *************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: " + CoolProp.Props("D", 'T', 300, 'P', 101.325, "EG-50%") + "kg/m^3" + "\n"); + Console.Write("Viscosity of Therminol D12 at 350 K, 101.325 kPa: " + CoolProp.Props("V", 'T', 350, 'P', 101.325, "TD12") + "Pa-s" + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ HUMID AIR PROPERTIES *************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: " + CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5) + " kg_w/kg_da" + "\n"); + Console.Write("Relative humidity from last calculation: " + CoolProp.HAProps("R", "T", 300, "P", 101.325, "W", CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5)) + "(fractional)" + "\n"); + + //Console.Write("Enter to quit"); + //Console.ReadLine(); + } + } +} diff --git a/Web/examples/CSharp/Output.txt b/Web/examples/CSharp/Output.txt new file mode 100644 index 00000000..d4511e63 --- /dev/null +++ b/Web/examples/CSharp/Output.txt @@ -0,0 +1,60 @@ +CoolProp version: 4.1.2 +CoolProp gitrevision: 016d3219602f0ea2e5eac89f21b3ab0e54cdc941 +CoolProp fluids: Water,R134a,Helium,Oxygen,Hydrogen,ParaHydrogen,OrthoHydrogen,Argon,CarbonDioxide,Nitrogen,n-Propane,Ammonia,R1234yf,R1234ze(E),R32,R22,SES36,Ethylene,SulfurHexafluoride,Ethanol,DimethylEther,DimethylCarbonate,R143a,R23,n-Dodecane,Propylene,Cyclopentane,R236FA,R236EA,R227EA,R365MFC,R161,HFE143m,Benzene,n-Undecane,R125,CycloPropane,Neon,R124,Propyne,Fluorine,Methanol,RC318,R21,R114,R13,R14,R12,R113,R1234ze(Z),R1233zd(E),AceticAcid,R245fa,R41,CarbonMonoxide,CarbonylSulfide,n-Decane,HydrogenSulfide,Isopentane,Neopentane,Isohexane,Krypton,n-Nonane,Toluene,Xenon,R116,Acetone,NitrousOxide,SulfurDioxide,R141b,R142b,R218,Methane,Ethane,n-Butane,IsoButane,n-Pentane,n-Hexane,n-Heptane,n-Octane,CycloHexane,R152A,R123,R11,MDM,MD2M,MD3M,D6,MM,MD4M,D4,D5,1-Butene,IsoButene,cis-2-Butene,trans-2-Butene,MethylPalmitate,MethylStearate,MethylOleate,MethylLinoleate,MethylLinolenate,o-Xylene,m-Xylene,p-Xylene,EthylBenzene,Deuterium,ParaDeuterium,OrthoDeuterium,Air,R404A,R410A,R407C,R507A,R407F + +************ USING EOS ************* + +FLUID STATE INDEPENDENT INPUTS +Critical Density Propane: 220.4781kg/m^3 +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.88295195482 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.41613600878816 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.447375251959 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.6295320184622 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0727627482929,634.733625928477 +P,H -> T,D 56.0727627482929,634.733625928477 --> 300,0.999999999999999 + +************ USING TTSE *************** + +TWO PHASE INPUTS (Pressure) +0.204 to build both two phase tables +2.716 to build single phase table with p,h +14.365 to build single phase table for T,rho +write time: 0.077 +Density of saturated liquid Propane at 101.325 kPa: 580.882952265689 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.41613600655145 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.44737744117 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629531877304 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0727644058219,634.733625854333 +P,H -> T,D 56.0727644058219,634.733625854333 --> 299.999999906753,0.999999979733272 + +************ USING REFPROP *************** + +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.88295195482 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.41613600878816 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.447375251959 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.6295320184622 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0727627482929,634.733625928477 +P,H -> T,D 56.0727627482929,634.733625928477 --> 300,0.999999999999999 + +************ CHANGE UNIT SYSTEM (default is kSI) ************* + +Vapor pressure of water at 373.15 K in SI units (Pa): 101417.996659952 +Vapor pressure of water at 373.15 K in kSI units (kPa): 101.417996659952 + +************ BRINES AND SECONDARY WORKING FLUIDS ************* + +Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: 1061.17930772046kg/m^3 +Viscosity of Therminol D12 at 350 K, 101.325 kPa: 0.000522884941050795Pa-s + +************ HUMID AIR PROPERTIES ************* + +Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: 0.0110962237500952 kg_w/kg_da +Relative humidity from last calculation: 0.5(fractional) diff --git a/Web/examples/CSharp/example.rst b/Web/examples/CSharp/example.rst new file mode 100644 index 00000000..05f4ecf0 --- /dev/null +++ b/Web/examples/CSharp/example.rst @@ -0,0 +1,11 @@ +Example Code for C# +=================== + +Code +---- +.. literalinclude:: Example.cs + :language: c# + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/CSharp/run_example.bat b/Web/examples/CSharp/run_example.bat new file mode 100644 index 00000000..65903bad --- /dev/null +++ b/Web/examples/CSharp/run_example.bat @@ -0,0 +1,33 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +copy ..\..\..\wrappers\C#\Example.cs +erase *_wrap.cpp + +swig.exe -csharp -dllimport "CoolProp" -c++ -outcurrentdir ../../../CoolProp/CoolProp.i +if %errorlevel% neq 0 exit /b %errorlevel% +cl /c /I../../../CoolProp /EHsc CoolProp_wrap.cxx +if %errorlevel% neq 0 exit /b %errorlevel% + +REM ******* compile all the sources *************** +cl /c /I../../../CoolProp /EHsc ../../../CoolProp/*.cpp +if %errorlevel% neq 0 exit /b %errorlevel% +link /DLL CoolProp_wrap.obj *.obj /OUT:CoolProp.dll +if %errorlevel% neq 0 exit /b %errorlevel% + +erase *.obj +erase CoolProp_wrap.cxx +erase CoolProp.lib +erase CoolProp.exp + +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +csc *.cs /platform:x86 +if %errorlevel% neq 0 exit /b %errorlevel% +call Example > Output.txt + +REM cleanup +erase *.cs +erase Example.exe +erase CoolProp.dll +copy ..\..\..\wrappers\C#\Example.cs \ No newline at end of file diff --git a/Web/examples/Java/Example.java b/Web/examples/Java/Example.java new file mode 100644 index 00000000..0e8cb65c --- /dev/null +++ b/Web/examples/Java/Example.java @@ -0,0 +1,101 @@ +// Example for Java +// Ian Bell, 2013 + +public class Example { + static { + System.loadLibrary("CoolProp"); + } + + public static void main(String argv[]){ + + double T, h, p, D; + int SI,KSI; + System.out.println("CoolProp version: " + CoolProp.get_global_param_string("version")); + System.out.println("CoolProp gitrevision: " + CoolProp.get_global_param_string("gitrevision")); + System.out.println("CoolProp fluids: " + CoolProp.get_global_param_string("FluidsList")); + + System.out.println(" "); + System.out.println("************ USING EOS *************"); + System.out.println(" "); + System.out.println("FLUID STATE INDEPENDENT INPUTS"); + System.out.println("Critical Density Propane: " + CoolProp.Props1("Propane", "rhocrit") + "kg/m^3"); + System.out.println("TWO PHASE INPUTS (Pressure)"); + System.out.println("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("TWO PHASE INPUTS (Temperature)"); + System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("SINGLE PHASE CYCLE (propane)"); + p = CoolProp.Props("P", 'T', 300, 'D', 1, "Propane"); + h = CoolProp.Props("H", 'T', 300, 'D', 1, "Propane"); + System.out.println("T,D -> P,H " + 300 + "," + 1 + " --> " + p + ',' + h); + T = CoolProp.Props("T", 'P', p, 'H', h, "Propane"); + D = CoolProp.Props("D", 'P', p, 'H', h, "Propane"); + System.out.println("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D); + + System.out.println(" "); + System.out.println("************ USING TTSE ***************"); + System.out.println(" "); + CoolProp.enable_TTSE_LUT("Propane"); + System.out.println("TWO PHASE INPUTS (Pressure)"); + System.out.println("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("TWO PHASE INPUTS (Temperature)"); + System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("SINGLE PHASE CYCLE (propane)"); + p = CoolProp.Props("P", 'T', 300, 'D', 1, "Propane"); + h = CoolProp.Props("H", 'T', 300, 'D', 1, "Propane"); + System.out.println("T,D -> P,H " + 300 + ","+ 1+ " --> " + p + ',' + h); + T = CoolProp.Props("T", 'P', p, 'H', h, "Propane"); + D = CoolProp.Props("D", 'P', p, 'H', h, "Propane"); + System.out.println("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D); + CoolProp.disable_TTSE_LUT("Propane"); + + try + { + System.out.println(" "); + System.out.println("************ USING REFPROP ***************"); + System.out.println(" "); + System.out.println("TWO PHASE INPUTS (Pressure)"); + System.out.println("Density of saturated liquid Propane at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 101.325 kPa: " + CoolProp.Props("D", 'P', 101.325, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("TWO PHASE INPUTS (Temperature)"); + System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 300 K: " + CoolProp.Props("D", 'T', 300, 'Q', 1, "R290") + " kg/m^3"); + System.out.println("SINGLE PHASE CYCLE (propane)"); + p = CoolProp.Props("P",'T',300,'D',1,"Propane"); + h = CoolProp.Props("H",'T',300,'D',1,"Propane"); + System.out.println("T,D -> P,H " + 300 + "," + 1 + " --> " + p + ',' + h); + T = CoolProp.Props("T",'P',p,'H',h,"Propane"); + D = CoolProp.Props("D",'P',p,'H',h,"Propane"); + System.out.println("P,H -> T,D " + p + ',' + h + " --> " + T + ',' + D); + } + catch(Exception e) + { + System.out.println(" "); + System.out.println("************ CANT USE REFPROP ************"); + System.out.println(" "); + } + + System.out.println(" "); + System.out.println("************ CHANGE UNIT SYSTEM (default is kSI) *************"); + System.out.println(" "); + CoolProp.set_standard_unit_system(unit_systems.UNIT_SYSTEM_SI.swigValue()); + System.out.println("Vapor pressure of water at 373.15 K in SI units (Pa): " + CoolProp.Props("P", 'T', 373.15, 'Q', 0, "Water")); + CoolProp.set_standard_unit_system(unit_systems.UNIT_SYSTEM_KSI.swigValue()); + System.out.println("Vapor pressure of water at 373.15 K in kSI units (kPa): " + CoolProp.Props("P", 'T', 373.15, 'Q', 0, "Water")); + + System.out.println(" "); + System.out.println("************ BRINES AND SECONDARY WORKING FLUIDS *************"); + System.out.println(" "); + System.out.println("Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: " + CoolProp.Props("D", 'T', 300, 'P', 101.325, "EG-50%") + "kg/m^3"); + System.out.println("Viscosity of Therminol D12 at 350 K, 101.325 kPa: " + CoolProp.Props("V", 'T', 350, 'P', 101.325, "TD12") + "Pa-s"); + + System.out.println(" "); + System.out.println("************ HUMID AIR PROPERTIES *************"); + System.out.println(" "); + System.out.println("Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: " + CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5) + " kg_w/kg_da"); + System.out.println("Relative humidity from last calculation: " + CoolProp.HAProps("R", "T", 300, "P", 101.325, "W", CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5)) + "(fractional)"); + } +} \ No newline at end of file diff --git a/Web/examples/Java/Output.txt b/Web/examples/Java/Output.txt new file mode 100644 index 00000000..be4c3626 --- /dev/null +++ b/Web/examples/Java/Output.txt @@ -0,0 +1,57 @@ +CoolProp version: 4.1.2 +CoolProp gitrevision: 016d3219602f0ea2e5eac89f21b3ab0e54cdc941 +CoolProp fluids: Water,R134a,Helium,Oxygen,Hydrogen,ParaHydrogen,OrthoHydrogen,Argon,CarbonDioxide,Nitrogen,n-Propane,Ammonia,R1234yf,R1234ze(E),R32,R22,SES36,Ethylene,SulfurHexafluoride,Ethanol,DimethylEther,DimethylCarbonate,R143a,R23,n-Dodecane,Propylene,Cyclopentane,R236FA,R236EA,R227EA,R365MFC,R161,HFE143m,Benzene,n-Undecane,R125,CycloPropane,Neon,R124,Propyne,Fluorine,Methanol,RC318,R21,R114,R13,R14,R12,R113,R1234ze(Z),R1233zd(E),AceticAcid,R245fa,R41,CarbonMonoxide,CarbonylSulfide,n-Decane,HydrogenSulfide,Isopentane,Neopentane,Isohexane,Krypton,n-Nonane,Toluene,Xenon,R116,Acetone,NitrousOxide,SulfurDioxide,R141b,R142b,R218,Methane,Ethane,n-Butane,IsoButane,n-Pentane,n-Hexane,n-Heptane,n-Octane,CycloHexane,R152A,R123,R11,MDM,MD2M,MD3M,D6,MM,MD4M,D4,D5,1-Butene,IsoButene,cis-2-Butene,trans-2-Butene,MethylPalmitate,MethylStearate,MethylOleate,MethylLinoleate,MethylLinolenate,o-Xylene,m-Xylene,p-Xylene,EthylBenzene,Deuterium,ParaDeuterium,OrthoDeuterium,Air,R404A,R410A,R407C,R507A,R407F + +************ USING EOS ************* + +FLUID STATE INDEPENDENT INPUTS +Critical Density Propane: 220.4781kg/m^3 +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.8829519548196 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.4161360087881647 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.4473752519588 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629532018462186 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.07276274829289,634.7336259284773 +P,H -> T,D 56.07276274829289,634.7336259284773 --> 300.00000000000017,0.9999999999999992 + +************ USING TTSE *************** + +TWO PHASE INPUTS (Pressure) +0.171 to build both two phase tables +Density of saturated liquid Propane at 101.325 kPa: 580.882952265689 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.416136006551446 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.44737744117043 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.62953187730398 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.07276440582185,634.733625854333 +P,H -> T,D 56.07276440582185,634.733625854333 --> 299.99999990675275,0.9999999797332718 + +************ USING REFPROP *************** + +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.8829519548196 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.4161360087881647 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.4473752519588 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.629532018462186 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.07276274829289,634.7336259284773 +P,H -> T,D 56.07276274829289,634.7336259284773 --> 300.00000000000017,0.9999999999999992 + +************ CHANGE UNIT SYSTEM (default is kSI) ************* + +Vapor pressure of water at 373.15 K in SI units (Pa): 101417.9966599521 +Vapor pressure of water at 373.15 K in kSI units (kPa): 101.4179966599521 + +************ BRINES AND SECONDARY WORKING FLUIDS ************* + +Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: 1061.1793077204613kg/m^3 +Viscosity of Therminol D12 at 350 K, 101.325 kPa: 5.228849410507948E-4Pa-s + +************ HUMID AIR PROPERTIES ************* + +Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: 0.011096223750095191 kg_w/kg_da +Relative humidity from last calculation: 0.49999999999999994(fractional) diff --git a/Web/examples/Java/example.rst b/Web/examples/Java/example.rst new file mode 100644 index 00000000..bdfcccbd --- /dev/null +++ b/Web/examples/Java/example.rst @@ -0,0 +1,11 @@ +Example Code for Java +===================== + +Code +---- +.. literalinclude:: Example.java + :language: java + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/Java/run_example.bat b/Web/examples/Java/run_example.bat new file mode 100644 index 00000000..6476abbc --- /dev/null +++ b/Web/examples/Java/run_example.bat @@ -0,0 +1,31 @@ + +@echo on +copy ..\..\..\wrappers\Java\Example.java Example.java + +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +swig -java -c++ -outcurrentdir ../../../CoolProp/CoolProp.i +if %errorlevel% neq 0 exit /b %errorlevel% +cl /c /I../../../CoolProp /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc *.cxx +if %errorlevel% neq 0 exit /b %errorlevel% +cl /c /I../../../CoolProp /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../../CoolProp/*.cpp +if %errorlevel% neq 0 exit /b %errorlevel% +link /DLL *.obj /OUT:CoolProp.dll +if %errorlevel% neq 0 exit /b %errorlevel% +erase *.obj +erase *.exp +erase *.lib + +javac *.java +if %errorlevel% neq 0 exit /b %errorlevel% +java Example > Output.txt +if %errorlevel% neq 0 exit /b %errorlevel% + +erase *.java +erase *.class +erase CoolProp.dll +erase CoolProp_wrap.cxx +copy ..\..\..\wrappers\Java\Example.java Example.java \ No newline at end of file diff --git a/Web/examples/MATLAB/Example.m b/Web/examples/MATLAB/Example.m new file mode 100644 index 00000000..8e208b2a --- /dev/null +++ b/Web/examples/MATLAB/Example.m @@ -0,0 +1,89 @@ +% Example of CoolProp for MATLAB +% Ian Bell, 2013 + +disp(['CoolProp version: ', Props('version')]) +disp(['CoolProp gitrevision: ', Props('gitrevision')]) +disp(['CoolProp fluids: ', Props('FluidsList')]) + +disp(' ') +disp('************ USING EOS *************') +disp(' ') +disp('FLUID STATE INDEPENDENT INPUTS') +disp(['Critical Density Propane: ', num2str(Props('Propane','rhocrit')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'R290')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'R290')), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = Props('P','T',300,'D',1,'Propane'); +h = Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) +T = Props('T','P',p,'H',h,'Propane'); +D = Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D', num2str(p),',',num2str(h),'-->',num2str(T),',',num2str(D)]) + +disp([' ']) +disp(['************ USING TTSE ***************']) +disp([' ']) +Props('Propane','enable_TTSE') +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'R290')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'R290')), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = Props('P','T',300,'D',1,'Propane'); +h = Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) +T = Props('T','P',p,'H',h,'Propane'); +D = Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D ', num2str(p),',',num2str(h),' --> ',num2str(T),',',num2str(D)]) +Props('Propane','disable_TTSE') + +try + disp(' ') + disp('************ USING REFPROP ***************') + disp(' ') + disp('FLUID STATE INDEPENDENT INPUTS') + disp(['Critical Density Propane:', num2str(Props('REFPROP-Propane','rhocrit')), 'kg/m^3']) + disp(['TWO PHASE INPUTS (Pressure)']) + disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'REFPROP-Propane')), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'REFPROP-Propane')), ' kg/m^3']) + disp(['TWO PHASE INPUTS (Temperature)']) + disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'REFPROP-Propane')), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'REFPROP-Propane')), ' kg/m^3']) + disp(['SINGLE PHASE CYCLE (propane)']) + p = Props('P','T',300,'D',1,'REFPROP-Propane'); + h = Props('H','T',300,'D',1,'REFPROP-Propane'); + disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) + T = Props('T','P',p,'H',h,'REFPROP-Propane'); + D = Props('D','P',p,'H',h,'REFPROP-Propane'); + disp(['P,H -> T,D ', num2str(p),',',num2str(h),' --> ',num2str(T),',',num2str(D)]) +catch + disp(' ') + disp('************ CANT USE REFPROP ************') + disp(' ') +end + +disp(' ') +disp('************ CHANGE UNIT SYSTEM (default is kSI) *************') +disp(' ') +Props('set_UNIT_SYSTEM_SI') +disp(['Vapor pressure of water at 373.15 K in SI units (Pa): ', num2str(Props('P','T',373.15,'Q',0,'Water'))]) +Props('set_UNIT_SYSTEM_KSI') +disp(['Vapor pressure of water at 373.15 K in kSI units (kPa): ', num2str(Props('P','T',373.15,'Q',0,'Water'))]) + +disp(' ') +disp('************ BRINES AND SECONDARY WORKING FLUIDS *************') +disp(' ') +disp(['Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: ', num2str(Props('D','T',300,'P',101.325,'EG-50%')), 'kg/m^3']) +disp(['Viscosity of Therminol D12 at 350 K, 101.325 kPa: ', num2str(Props('V', 'T', 350, 'P', 101.325, 'TD12')), 'Pa-s']) + +disp(' ') +disp('************ HUMID AIR PROPERTIES *************') +disp(' ') +disp(['Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: ', num2str(HAProps('W','T',300,'P',101.325,'R',0.5)), ' kg_w/kg_da']) +disp(['Relative humidity from last calculation: ', num2str(HAProps('R','T',300,'P',101.325,'W',HAProps('W','T',300,'P',101.325,'R',0.5))), ' (fractional)']) diff --git a/Web/examples/MATLAB/MATLABBuilder.m b/Web/examples/MATLAB/MATLABBuilder.m new file mode 100644 index 00000000..8c221b5d --- /dev/null +++ b/Web/examples/MATLAB/MATLABBuilder.m @@ -0,0 +1,44 @@ + +%The path to the main folder of the CoolProp source +path_to_src = '../../../CoolProp/' + +%All the include folders we need +include_string = [' -I',path_to_src]; + +if isempty(strfind(mexext(),'32')) + mexopts_string = ' ' +else + mexopts_string = ' -f mexopts_w32.bat -DCONVENTION=__cdecl ' +end + +%List of files to be compiled to object files +main_files = dir([path_to_src,'*.cpp']); +main_files = cellfun(@(x) x, {main_files.name}, 'uniformoutput', false)'; + +%Append path to source to the list of the CoolProp main files +for i=1:size(main_files,1) + main_files{i,1} = [path_to_src,main_files{i,1}]; +end + +files=[main_files]; +o_files = ''; +cpp_files = ''; + +for i=1:size(files,1) + file = files{i,1}; + o_file = strrep(file,'.cpp','.obj'); + o_files = [o_files, ' ', o_file]; + cpp_files = [cpp_files, ' ',file]; + eval(['mex -c', include_string,mexopts_string,' -DCOOLPROP_LIB -outdir . ',file]) + disp(file) +end + +%Build the MEX files +eval(['mex ', include_string,mexopts_string,' Props.c *.obj']) +eval(['mex ', include_string,mexopts_string,' HAProps.c *.obj']) + +%Clean up - delete the obj files +delete('*.obj') + +%Quit MATLAB +quit diff --git a/Web/examples/MATLAB/Output.txt b/Web/examples/MATLAB/Output.txt new file mode 100644 index 00000000..bcdac25e --- /dev/null +++ b/Web/examples/MATLAB/Output.txt @@ -0,0 +1,64 @@ + + To get started, type one of these: helpwin, helpdesk, or demo. + For product information, visit www.mathworks.com. + +CoolProp version: 4.1.2 +CoolProp gitrevision: 016d3219602f0ea2e5eac89f21b3ab0e54cdc941 +CoolProp fluids: Water,R134a,Helium,Oxygen,Hydrogen,ParaHydrogen,OrthoHydrogen,Argon,CarbonDioxide,Nitrogen,n-Propane,Ammonia,R1234yf,R1234ze(E),R32,R22,SES36,Ethylene,SulfurHexafluoride,Ethanol,DimethylEther,DimethylCarbonate,R143a,R23,n-Dodecane,Propylene,Cyclopentane,R236FA,R236EA,R227EA,R365MFC,R161,HFE143m,Benzene,n-Undecane,R125,CycloPropane,Neon,R124,Propyne,Fluorine,Methanol,RC318,R21,R114,R13,R14,R12,R113,R1234ze(Z),R1233zd(E),AceticAcid,R245fa,R41,CarbonMonoxide,CarbonylSulfide,n-Decane,HydrogenSulfide,Isopentane,Neopentane,Isohexane,Krypton,n-Nonane,Toluene,Xenon,R116,Acetone,NitrousOxide,SulfurDioxide,R141b,R142b,R218,Methane,Ethane,n-Butane,IsoButane,n-Pentane,n-Hexane,n-Heptane,n-Octane,CycloHexane,R152A,R123,R11,MDM,MD2M,MD3M,D6,MM,MD4M,D4,D5,1-Butene,IsoButene,cis-2-Butene,trans-2-Butene,MethylPalmitate,MethylStearate,MethylOleate,MethylLinoleate,MethylLinolenate,o-Xylene,m-Xylene,p-Xylene,EthylBenzene,Deuterium,ParaDeuterium,OrthoDeuterium,Air,R404A,R410A,R407C,R507A,R407F + +************ USING EOS ************* + +FLUID STATE INDEPENDENT INPUTS +Critical Density Propane: 220.4781 kg/m^3 +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.883 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.4161 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.4474 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.6295 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0728,634.7336 +P,H -> T,D56.0728,634.7336-->300,1 + +************ USING TTSE *************** + +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.883 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.4161 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.4474 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.6295 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0728,634.7336 +P,H -> T,D 56.0728,634.7336 --> 300,1 + +************ USING REFPROP *************** + +FLUID STATE INDEPENDENT INPUTS +Critical Density Propane:220.4781kg/m^3 +TWO PHASE INPUTS (Pressure) +Density of saturated liquid Propane at 101.325 kPa: 580.883 kg/m^3 +Density of saturated vapor R290 at 101.325 kPa: 2.4161 kg/m^3 +TWO PHASE INPUTS (Temperature) +Density of saturated liquid Propane at 300 K: 489.4474 kg/m^3 +Density of saturated vapor R290 at 300 K: 21.6295 kg/m^3 +SINGLE PHASE CYCLE (propane) +T,D -> P,H 300,1 --> 56.0728,634.7336 +P,H -> T,D 56.0728,634.7336 --> 300,1 + +************ CHANGE UNIT SYSTEM (default is kSI) ************* + +Unit system set to SI +Vapor pressure of water at 373.15 K in SI units (Pa): 101417.9967 +Unit system set to KSI +Vapor pressure of water at 373.15 K in kSI units (kPa): 101.418 + +************ BRINES AND SECONDARY WORKING FLUIDS ************* + +Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: 1061.1793kg/m^3 +Viscosity of Therminol D12 at 350 K, 101.325 kPa: 0.00052288Pa-s + +************ HUMID AIR PROPERTIES ************* + +Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: 0.011096 kg_w/kg_da +Relative humidity from last calculation: 0.5 (fractional) diff --git a/Web/examples/MATLAB/example.rst b/Web/examples/MATLAB/example.rst new file mode 100644 index 00000000..3b20d16e --- /dev/null +++ b/Web/examples/MATLAB/example.rst @@ -0,0 +1,11 @@ +Example Code for MATLAB +======================= + +Code +---- +.. literalinclude:: Example.m + :language: matlab + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/MATLAB/run_example.bat b/Web/examples/MATLAB/run_example.bat new file mode 100644 index 00000000..259e7874 --- /dev/null +++ b/Web/examples/MATLAB/run_example.bat @@ -0,0 +1,7 @@ +copy ..\..\..\wrappers\MATLAB\example.m . +copy ..\..\..\wrappers\MATLAB\*rops.c . +matlab -wait -nojvm -nodesktop -r "MATLABBuilder; quit" +cl /c /I../../../CoolProp /EHsc CoolProp_wrap.cxx +matlab -nojvm -nodesktop -r "Example; quit" -logfile Output.txt +cl /c /I../../../CoolProp /EHsc CoolProp_wrap.cxx +erase *Props*.c \ No newline at end of file diff --git a/Web/examples/Octave/Example.m b/Web/examples/Octave/Example.m new file mode 100644 index 00000000..befcbf5e --- /dev/null +++ b/Web/examples/Octave/Example.m @@ -0,0 +1,90 @@ +% Example of CoolProp for Octave +% Ian Bell, 2013 + +CoolProp +disp(['CoolProp version: ', CoolProp.get_global_param_string('version')]) +disp(['CoolProp gitrevision: ', CoolProp.get_global_param_string('gitrevision')]) +disp(['CoolProp fluids: ', CoolProp.get_global_param_string('FluidsList')]) + +disp(' ') +disp('************ USING EOS *************') +disp(' ') +disp('FLUID STATE INDEPENDENT INPUTS') +disp(['Critical Density Propane: ', CoolProp.Props1('Propane','rhocrit'), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',0,'Propane'), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',1,'R290'), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', CoolProp.Props('D','T',300,'Q',0,'Propane'), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', CoolProp.Props('D','T',300,'Q',1,'R290'), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = CoolProp.Props('P','T',300,'D',1,'Propane'); +h = CoolProp.Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', 300,',', 1, ' --> ',p,',',h]) +T = CoolProp.Props('T','P',p,'H',h,'Propane'); +D = CoolProp.Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D', p,',',h,'-->',T,',',D]) + +disp([' ']) +disp(['************ USING TTSE ***************']) +disp([' ']) +CoolProp.enable_TTSE_LUT('Propane'); +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',0,'Propane'), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',1,'R290'), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', CoolProp.Props('D','T',300,'Q',0,'Propane'), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', CoolProp.Props('D','T',300,'Q',1,'R290'), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = CoolProp.Props('P','T',300,'D',1,'Propane'); +h = CoolProp.Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', 300,',',1, ' --> ',p,',',h]) +T = CoolProp.Props('T','P',p,'H',h,'Propane'); +D = CoolProp.Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D ', p,',',h,' --> ',T,',',D]) +CoolProp.disable_TTSE_LUT('Propane'); + +try + disp(' ') + disp('************ USING REFPROP ***************') + disp(' ') + disp('FLUID STATE INDEPENDENT INPUTS') + disp(['Critical Density Propane:', CoolProp.Props('REFPROP-Propane','rhocrit'), 'kg/m^3']) + disp(['TWO PHASE INPUTS (Pressure)']) + disp(['Density of saturated liquid Propane at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',0,'REFPROP-Propane'), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 101.325 kPa: ', CoolProp.Props('D','P',101.325,'Q',1,'REFPROP-Propane'), ' kg/m^3']) + disp(['TWO PHASE INPUTS (Temperature)']) + disp(['Density of saturated liquid Propane at 300 K: ', CoolProp.Props('D','T',300,'Q',0,'REFPROP-Propane'), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 300 K: ', CoolProp.Props('D','T',300,'Q',1,'REFPROP-Propane'), ' kg/m^3']) + disp(['SINGLE PHASE CYCLE (propane)']) + p = CoolProp.Props('P','T',300,'D',1,'REFPROP-Propane'); + h = CoolProp.Props('H','T',300,'D',1,'REFPROP-Propane'); + disp(['T,D -> P,H ', 300,',',1, ' --> ',p,',',h]) + T = CoolProp.Props('T','P',p,'H',h,'REFPROP-Propane'); + D = CoolProp.Props('D','P',p,'H',h,'REFPROP-Propane'); + disp(['P,H -> T,D ', p,',',h,' --> ',T,',',D]) +catch + disp(' ') + disp('************ CANT USE REFPROP ************') + disp(' ') +end + + disp([' ']) + disp('************ CHANGE UNIT SYSTEM (default is kSI) *************') + disp(' ') + CoolProp.set_standard_unit_system(CoolProp.UNIT_SYSTEM_SI) + disp(['Vapor pressure of water at 373.15 K in SI units (Pa):',CoolProp.Props('P','T',373.15,'Q',0,'Water')]); + CoolProp.set_standard_unit_system(CoolProp.UNIT_SYSTEM_KSI) + disp(['Vapor pressure of water at 373.15 K in kSI units (kPa):',CoolProp.Props('P','T',373.15,'Q',0,'Water')]); + +disp(' ') +disp('************ BRINES AND SECONDARY WORKING FLUIDS *************') +disp(' ') +disp(['Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: ', CoolProp.Props('D','T',300,'P',101.325,'EG-50%'), ' kg/m^3']) +disp(['Viscosity of Therminol D12 at 350 K, 101.325 kPa: ', CoolProp.Props('V', 'T', 350, 'P', 101.325, 'TD12'), ' Pa-s']) + +disp(' ') +disp('************ HUMID AIR PROPERTIES *************') +disp(' ') +disp(['Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: ', CoolProp.HAProps('W','T',300,'P',101.325,'R',0.5), ' kg_w/kg_da']) +disp(['Relative humidity from last calculation: ', CoolProp.HAProps('R','T',300,'P',101.325,'W',HAProps('W','T',300,'P',101.325,'R',0.5)), '(fractional)']) diff --git a/Web/examples/Octave/Output.txt b/Web/examples/Octave/Output.txt new file mode 100644 index 00000000..65b47c4d Binary files /dev/null and b/Web/examples/Octave/Output.txt differ diff --git a/Web/examples/Octave/example.rst b/Web/examples/Octave/example.rst new file mode 100644 index 00000000..f18e3ba9 --- /dev/null +++ b/Web/examples/Octave/example.rst @@ -0,0 +1,11 @@ +Example Code for Octave +======================= + +Code +---- +.. literalinclude:: Example.m + :language: octave + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/Octave/run_example.bat b/Web/examples/Octave/run_example.bat new file mode 100644 index 00000000..627f561d --- /dev/null +++ b/Web/examples/Octave/run_example.bat @@ -0,0 +1,19 @@ +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +swig -octave -c++ -outcurrentdir -o CoolProp_wrap.cpp ../../../CoolProp/CoolProp.i + if %errorlevel% neq 0 exit /b %errorlevel% + +REM : %%~nf gives just the file name, no path or extension +REM : %%f gives the full path and extension +for %%f in (..\..\..\CoolProp\*.cpp) do mkoctfile -v -c -I..\..\CoolProp -o %%~nf.o %%f + if %errorlevel% neq 0 exit /b %errorlevel% +mkoctfile -v -c -I..\..\..\CoolProp -o CoolProp_wrap.o CoolProp_wrap.cpp + if %errorlevel% neq 0 exit /b %errorlevel% +mkoctfile -v -o CoolProp.oct *.o + if %errorlevel% neq 0 exit /b %errorlevel% +erase *.o +erase CoolProp.lib +erase CoolProp.exp +erase CoolProp_wrap.cpp +octave Example.m > Output.txt + if %errorlevel% neq 0 exit /b %errorlevel% \ No newline at end of file diff --git a/Web/examples/Python/Example.py b/Web/examples/Python/Example.py new file mode 100644 index 00000000..e5ad0c56 --- /dev/null +++ b/Web/examples/Python/Example.py @@ -0,0 +1,117 @@ +# Example of CoolProp for Python +# Ian Bell, 2013 + +from __future__ import print_function + +import CoolProp +import CoolProp.CoolProp as CP + +print('CoolProp version: ', CoolProp.__version__) +print('CoolProp gitrevision: ', CoolProp.__gitrevision__) +print('CoolProp fluids: ', CoolProp.__fluids__) + + +print(' ') +print('************ USING EOS *************') +print(' ') +print('FLUID STATE INDEPENDENT INPUTS') +print('Critical Density Propane:', CP.Props('Propane', 'rhocrit'), 'kg/m^3') +print('TWO PHASE INPUTS (Pressure)') +print('Density of saturated liquid Propane at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 0, 'Propane'), 'kg/m^3') +print('Density of saturated vapor R290 at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 1, 'R290'), 'kg/m^3') +print('TWO PHASE INPUTS (Temperature)') +print('Density of saturated liquid Propane at 300 K:', + CP.Props('D', 'T', 300, 'Q', 0, 'Propane'), 'kg/m^3') +print('Density of saturated vapor R290 at 300 K:', + CP.Props('D', 'T', 300, 'Q', 1, 'R290'), 'kg/m^3') + +p = CP.Props('P', 'T', 300, 'D', 1, 'Propane') +h = CP.Props('H', 'T', 300, 'D', 1, 'Propane') +T = CP.Props('T', 'P', p, 'H', h, 'Propane') +D = CP.Props('D', 'P', p, 'H', h, 'Propane') +print('SINGLE PHASE CYCLE (propane)') +print('T,D -> P,H', 300, ',', 1, '-->', p, ',', h) +print('P,H -> T,D', p, ',', h, '-->', T, ',', D) + + +CP.enable_TTSE_LUT('Propane') +print(' ') +print('************ USING TTSE ***************') +print(' ') +print('TWO PHASE INPUTS (Pressure)') +print('Density of saturated liquid Propane at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 0, 'Propane'), 'kg/m^3') +print('Density of saturated vapor R290 at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 1, 'R290'), 'kg/m^3') +print('TWO PHASE INPUTS (Temperature)') +print('Density of saturated liquid Propane at 300 K:', + CP.Props('D', 'T', 300, 'Q', 0, 'Propane'), 'kg/m^3') +print('Density of saturated vapor R290 at 300 K:', + CP.Props('D', 'T', 300, 'Q', 1, 'R290'), 'kg/m^3') + +p = CP.Props('P', 'T', 300, 'D', 1, 'Propane') +h = CP.Props('H', 'T', 300, 'D', 1, 'Propane') +T = CP.Props('T', 'P', p, 'H', h, 'Propane') +D = CP.Props('D', 'P', p, 'H', h, 'Propane') +print('SINGLE PHASE CYCLE (propane)') +print('T,D -> P,H', 300, ',', 1, '-->', p, ',', h) +print('P,H -> T,D', p, ',', h, '-->', T, ',', D) +CP.disable_TTSE_LUT('Propane') + +try: + print(' ') + print('************ USING REFPROP ***************') + print(' ') + print('TWO PHASE INPUTS (Pressure)') + print('Density of saturated liquid Propane at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 0, 'REFPROP-Propane'), 'kg/m^3') + print('Density of saturated vapor Propane at 101.325 kPa:', + CP.Props('D', 'P', 101.325, 'Q', 1, 'REFPROP-propane'), 'kg/m^3') + print('TWO PHASE INPUTS (Temperature)') + print('Density of saturated liquid Propane at 300 K:', + CP.Props('D', 'T', 300, 'Q', 0, 'REFPROP-propane'), 'kg/m^3') + print('Density of saturated vapor Propane at 300 K:', + CP.Props('D', 'T', 300, 'Q', 1, 'REFPROP-propane'), 'kg/m^3') + + p = CP.Props('P', 'T', 300, 'D', 1, 'Propane') + h = CP.Props('H', 'T', 300, 'D', 1, 'Propane') + T = CP.Props('T', 'P', p, 'H', h, 'Propane') + D = CP.Props('D', 'P', p, 'H', h, 'Propane') + print('SINGLE PHASE CYCLE (propane)') + print('T,D -> P,H', 300, ',', 1, '-->', p, ',', h) + print('P,H -> T,D', p, ',', h, '-->', T, ',', D) +except: + print(' ') + print('************ CANT USE REFPROP ************') + print(' ') + +print(' ') +print('************ CHANGE UNIT SYSTEM (default is kSI) *************') +print(' ') +CP.set_standard_unit_system(CoolProp.UNIT_SYSTEM_SI) +print('Vapor pressure of water at 373.15 K in SI units (Pa):', + CP.Props('P', 'T', 373.15, 'Q', 0, 'Water')) +CP.set_standard_unit_system(CoolProp.UNIT_SYSTEM_KSI) +print('Vapor pressure of water at 373.15 K in kSI units (kPa):', + CP.Props('P', 'T', 373.15, 'Q', 0, 'Water')) + +print(' ') +print('************ BRINES AND SECONDARY WORKING FLUIDS *************') +print(' ') +print('Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa:', + CP.Props('D', 'T', 300, 'P', 101.325, 'EG-50%'), 'kg/m^3') +print('Viscosity of Therminol D12 at 350 K, 101.325 kPa:', + CP.Props('V', 'T', 350, 'P', 101.325, 'TD12'), 'Pa-s') + +print(' ') +print('************ HUMID AIR PROPERTIES *************') +print(' ') +print('Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa:', + CP.HAProps('W', 'T', 300, 'P', 101.325, 'R', 0.5), 'kg_w/kg_da') +print('Relative humidity from last calculation:', + CP.HAProps('R', 'T', 300, 'P', 101.325, 'W', + CP.HAProps('W', 'T', 300, 'P', 101.325, 'R', 0.5)), + '(fractional)') + diff --git a/Web/examples/Python/Output.txt b/Web/examples/Python/Output.txt new file mode 100644 index 00000000..125c880d --- /dev/null +++ b/Web/examples/Python/Output.txt @@ -0,0 +1,7 @@ +CoolProp version: 4.1.2 +CoolProp gitrevision: 67701e8f1fba5fd10cc64ae7760615fd70a8dec0 +CoolProp fluids: ['Water', 'R134a', 'Helium', 'Oxygen', 'Hydrogen', 'ParaHydrogen', 'OrthoHydrogen', 'Argon', 'CarbonDioxide', 'Nitrogen', 'n-Propane', 'Ammonia', 'R1234yf', 'R1234ze(E)', 'R32', 'R22', 'SES36', 'Ethylene', 'SulfurHexafluoride', 'Ethanol', 'DimethylEther', 'DimethylCarbonate', 'R143a', 'R23', 'n-Dodecane', 'Propylene', 'Cyclopentane', 'R236FA', 'R236EA', 'R227EA', 'R365MFC', 'R161', 'HFE143m', 'Benzene', 'n-Undecane', 'R125', 'CycloPropane', 'Neon', 'R124', 'Propyne', 'Fluorine', 'Methanol', 'RC318', 'R21', 'R114', 'R13', 'R14', 'R12', 'R113', 'R1234ze(Z)', 'R1233zd(E)', 'AceticAcid', 'R245fa', 'R41', 'CarbonMonoxide', 'CarbonylSulfide', 'n-Decane', 'HydrogenSulfide', 'Isopentane', 'Neopentane', 'Isohexane', 'Krypton', 'n-Nonane', 'Toluene', 'Xenon', 'R116', 'Acetone', 'NitrousOxide', 'SulfurDioxide', 'R141b', 'R142b', 'R218', 'Methane', 'Ethane', 'n-Butane', 'IsoButane', 'n-Pentane', 'n-Hexane', 'n-Heptane', 'n-Octane', 'CycloHexane', 'R152A', 'R123', 'R11', 'MDM', 'MD2M', 'MD3M', 'D6', 'MM', 'MD4M', 'D4', 'D5', '1-Butene', 'IsoButene', 'cis-2-Butene', 'trans-2-Butene', 'MethylPalmitate', 'MethylStearate', 'MethylOleate', 'MethylLinoleate', 'MethylLinolenate', 'o-Xylene', 'm-Xylene', 'p-Xylene', 'EthylBenzene', 'Deuterium', 'ParaDeuterium', 'OrthoDeuterium', 'Air', 'R404A', 'R410A', 'R407C', 'R507A', 'R407F'] + +************ USING EOS ************* + +FLUID STATE INDEPENDENT INPUTS diff --git a/Web/examples/Python/example.rst b/Web/examples/Python/example.rst new file mode 100644 index 00000000..b31e7b43 --- /dev/null +++ b/Web/examples/Python/example.rst @@ -0,0 +1,11 @@ +Example Code for Python +======================= + +Code +---- +.. literalinclude:: Example.py + :language: python + +Output +------ +.. literalinclude:: Output.txt \ No newline at end of file diff --git a/Web/examples/Python/plotting-old.rst b/Web/examples/Python/plotting-old.rst new file mode 100644 index 00000000..8e0b86ac --- /dev/null +++ b/Web/examples/Python/plotting-old.rst @@ -0,0 +1,74 @@ +.. _python-plotting-old: + +Old Python Plotting +=================== + +.. note:: + The python plotting API has been changed as of v4.0. Examples using the + new python plotting API can be found here :ref:`python-plotting`. Some + backwards compatability was maintained, so the following example should + still work. + +The following example can be used to create a Temperature-Entropy plot for +propane (R290): + +.. plot:: + :include-source: + + from CoolProp.Plots.Plots import Ts + + Ts('R290', show=True) + +The following example can be used to create a Pressure-Enthalpy plot for R410A: + +.. plot:: + :include-source: + + from CoolProp.Plots.Plots import Ph + + Ph('R410A', show=True) + +The available plots are: + +==== ==================== +PT Pressure-Temperature +Prho Pressure-Density +Ph Pressure-Enthalpy +Ps Pressure-Entropy +Trho Temperature-Density +Ts Temperatre-Entropy +hs Enthalpy-Entropy +==== ==================== + +The following example will overlay a simple four-component cycle on a R410A +Pressure-Enthalpy plot. + +.. plot:: + :include-source: + + from matplotlib import pyplot + from CoolProp.Plots.Plots import Ph + from CoolProp.Plots.SimpleCycles import SimpleCycle + + Ph('R410A') + SimpleCycle('R410A', 250, 300, 5, 5, 0.7) + pyplot.show() + +A more advanced example using built-in functions to draw lines of constant +properties is given below. Note the different ways to invoke drawIsoLines: + +.. plot:: + :include-source: + + from matplotlib import pyplot + from CoolProp.Plots.Plots import Ts, drawIsoLines + + Ref = 'n-Pentane' + ax = Ts(Ref) + ax.set_xlim([-0.5, 1.5]) + ax.set_ylim([300, 530]) + quality = drawIsoLines(Ref, 'Ts', 'Q', [0.3, 0.5, 0.7, 0.8], axis=ax) + isobars = drawIsoLines(Ref, 'Ts', 'P', [100, 2000], num=5, axis=ax) + isochores = drawIsoLines(Ref, 'Ts', 'D', [2, 600], num=7, axis=ax) + #isenthalps = drawIsoLines(Ref, 'Ts', 'H', [100, 300], num=5, axis=ax) + pyplot.show() diff --git a/Web/examples/Python/plotting.rst b/Web/examples/Python/plotting.rst new file mode 100644 index 00000000..12701436 --- /dev/null +++ b/Web/examples/Python/plotting.rst @@ -0,0 +1,113 @@ +.. _python-plotting: + +Python Plotting +=============== + +.. note:: + The python plotting API has been changed as of v4.0. The examples shown + on this page use the new python plotting API. Examples using the old + python plotting API can be found here :ref:`python-plotting-old`. + +The following example can be used to create a Temperature-Entropy plot for +propane (R290): + +.. plot:: + :include-source: + + from CoolProp.Plots import PropsPlot + + ts_plot = PropsPlot('R290', 'Ts') + ts_plot.show() + + +The following example can be used to create a Pressure-Enthalpy plot for R410A: + +.. plot:: + :include-source: + + from CoolProp.Plots import PropsPlot + + ph_plot = PropsPlot('R410A', 'Ph') + ph_plot.show() + +The available plots are: + +== ==================== +PT Pressure-Temperature +PD Pressure-Density +PH Pressure-Enthalpy +PS Pressure-Entropy +TD Temperature-Density +TS Temperatre-Entropy +HS Enthalpy-Entropy +== ==================== + + +The following, more advanced example, can be used to draw lines of constant +properties for n-Pentane. Note the different ways to invoke the +:py:func:`CoolProp.Plots.Plots.PropsPlot.draw_isolines` function draw: + +.. plot:: + :include-source: + + from CoolProp.Plots import PropsPlot + + ref_fluid = 'n-Pentane' + ts_plot = PropsPlot(ref_fluid, 'Ts') + ts_plot.draw_isolines('Q', [0.3, 0.5, 0.7, 0.8]) + ts_plot.draw_isolines('P', [100, 2000], num=5) + ts_plot.draw_isolines('D', [2, 600], num=7) + ts_plot.set_axis_limits([-2, 1.5, 200, 500]) + ts_plot.show() + +Some of the commonly used `Matplotlib `_ functions, +such as :func:`title`, :func:`xlabel` and :func:`ylabel` have been wrapped in +the :py:class:`CoolProp.Plots.Plots.PropsPlot` class to make the plotting of +graphs a little simpler, for example: + +.. plot:: + :include-source: + + from CoolProp.Plots import PropsPlot + + ts_plot = PropsPlot('Water', 'Ts') + ts_plot.title('Ts Graph for Water') + ts_plot.xlabel(r's $[{kJ}/{kg K}]$') + ts_plot.ylabel(r'T $[K]$') + ts_plot.grid() + ts_plot.show() + +The following two examples show how the :class:`matplotlib.pyplot` functions +and :class:`matplotlib.pyplot.axes` functions can also be used along side +the :py:class:`CoolProp.Plots.Plots.PropsPlot` class + +.. plot:: + :include-source: + + from CoolProp.Plots import PropsPlot + + ph_plot = PropsPlot('Water', 'Ph') + ax = ph_plot.axis + ax.set_yscale('log') + ax.text(400, 5500, 'Saturated Liquid', fontsize=15, rotation=40) + ax.text(2700, 3500, 'Saturated Vapour', fontsize=15, rotation=-100) + ph_plot.show() + +.. plot:: + :include-source: + + from matplotlib import pyplot + from CoolProp.Plots import PropsPlot + + ref_fluid = 'R600a' + fig = pyplot.figure(1, figsize=(10, 10), dpi=100) + for i, gtype in enumerate(['PT', 'PD', 'PS', 'PH', 'TD', 'TS', 'HS']): + ax = pyplot.subplot(4, 2, i+1) + if gtype.startswith('P'): + ax.set_yscale('log') + props_plot = PropsPlot(ref_fluid, gtype, axis=ax) + props_plot.title(gtype) + props_plot._draw_graph() + pyplot.tight_layout() + pyplot.show() + diff --git a/Web/examples/Python/run_example.bat b/Web/examples/Python/run_example.bat new file mode 100644 index 00000000..c4bd4c52 --- /dev/null +++ b/Web/examples/Python/run_example.bat @@ -0,0 +1,5 @@ +echo off +copy ..\..\..\wrappers\Python\examples\Example.py +if %errorlevel% neq 0 exit /b %errorlevel% +python Example.py > Output.txt +if %errorlevel% neq 0 exit /b %errorlevel% \ No newline at end of file diff --git a/Web/examples/examples.rst b/Web/examples/examples.rst new file mode 100644 index 00000000..b376a232 --- /dev/null +++ b/Web/examples/examples.rst @@ -0,0 +1,71 @@ +Examples +======== + +The following examples are written in Python to demonstrate some of the +functionalities of CoolProp. Similar calling conventions are used in the +wrappers for other programming languages, as can be seen in the +"other languages" section below: + +Other Languages +--------------- +.. toctree:: + :maxdepth: 1 + + C++/example.rst + MATLAB/example.rst + Octave/example.rst + CSharp/example.rst + Java/example.rst + Python/example.rst + + +Sample Props Code +------------------- +To use the Props function, import it and do some calls, do something like this + +.. ipython:: + + #import the things you need + In [1]: from CoolProp.CoolProp import Props + + # print the currently used version of coolprop + In [1]: import CoolProp; print(CoolProp.__version__) + + #Density of carbon dioxide (R744) at 100 bar and 25C + In [2]: Props('D','T',298.15,'P',10000,'R744') + + #Saturated vapor enthalpy [kJ/kg] of R134a at STP + In [2]: Props('H','T',298.15,'Q',1,'R134a') + +Or go to the :ref:`Fluid-Properties` documentation. + +All the possible input and output parameters are listed in the +:py:func:`CoolProp.CoolProp.Props` documentation + +Sample HAProps Code +------------------- +To use the HAProps function, import it and do some calls, do something like this + +.. ipython:: + + #import the things you need + In [1]: from CoolProp.HumidAirProp import HAProps, HAProps_Aux + + #Enthalpy (kJ per kg dry air) as a function of temperature, pressure, + # and relative humidity at STP + In [2]: h=HAProps('H','T',298.15,'P',101.325,'R',0.5); print h + + #Temperature of saturated air at the previous enthalpy + In [2]: T=HAProps('T','P',101.325,'H',h,'R',1.0); print T + + #Temperature of saturated air - order of inputs doesn't matter + In [2]: T=HAProps('T','H',h,'R',1.0,'P',101.325); print T + +Or go to the :ref:`Humid-Air` documentation. + +Plotting +-------- +.. toctree:: + :maxdepth: 1 + + Python/plotting.rst diff --git a/Web/examples/run_examples.bat b/Web/examples/run_examples.bat new file mode 100644 index 00000000..90daf384 --- /dev/null +++ b/Web/examples/run_examples.bat @@ -0,0 +1,24 @@ +cd C++ +echo c++ +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% +echo C# +cd ..\CSharp +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% +echo Java +cd ..\Java +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% +echo MATLAB +cd ..\MATLAB +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% +echo Octave +cd ..\Octave +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% +echo Python +cd ..\Python +call run_example.bat +if %errorlevel% neq 0 exit /b %errorlevel% \ No newline at end of file diff --git a/Web/mixtures/phase_boundary.rst b/Web/mixtures/phase_boundary.rst new file mode 100644 index 00000000..8ff9b688 --- /dev/null +++ b/Web/mixtures/phase_boundary.rst @@ -0,0 +1,112 @@ +Forming the Phase Boundary +========================== + +Overview +-------- +The analysis in this section follows the methodologies proposed in the GERG 2004 monograph published in 2007 + +System of Equations +------------------- + +Our residual vector :math:`\mathbf{F}` is equal to + +.. math:: + + F_i = \ln\phi(T,p,\mathbf{y})-\ln \phi(T,p,\mathbf{x})+\ln K_i=0, i=1,2,3... N + +.. math:: + + F_{N+1} = \sum_{i=1}^{N}(y_i-x_i)=0 + +.. math:: + + x_i = \frac{z_i}{1-\beta+\beta K_i} + +and + +.. math:: + + y_i = \frac{K_iz_i}{1-\beta+\beta K_i} + +.. math:: + + F_{N+2} = X_s - S = 0 + +and the system to be solved is equal to + +.. math:: + + \mathbf{J}\mathbf{\Delta X}= -\mathbf{F} + + +Building the Jacobian matrix +---------------------------- +This is the trickiest part of this method. There are a lot of derivatives to implement, and we want to implement all of them analytically. + +.. math:: + + \frac{\partial F_i}{\partial \ln T} = T\left[ \left(\frac{\partial \ln \phi_i}{\partial T}\right)''_{p,\mathbf{n}} -\left(\frac{\partial \ln \phi_i}{\partial T}\right)'_{p,\mathbf{n}}\right] + +.. math:: + + \frac{\partial F_i}{\partial \ln p} = p\left[ \left(\frac{\partial \ln \phi_i}{\partial p}\right)''_{T,\mathbf{n}} -\left(\frac{\partial \ln \phi_i}{\partial p}\right)'_{T,\mathbf{n}}\right] + +.. math:: + + \frac{\partial F_i}{\partial \ln K_j} = \frac{K_jz_j}{(1-\beta+\beta K_j)^2}[(1-\beta)\phi_{ij}''+\beta\phi_{ij}']+\zeta + +where :math:`\zeta = 0` for i:math:`\neq`j , and :math:`\zeta = 0` for i=j. Also + +.. math:: + + \phi_{ij} = n\left( \frac{\partial \ln \phi_i}{\partial n_j}\right)_{T,p} + +For the :math:`F_{N+1}` term, + +.. math:: + + \frac{\partial F_{N+1}}{\partial \ln K_j}=\frac{K_jz_j}{(1-\beta+\beta K_j)^2} + +and all other partials of :math:`F_{N+1}` in the Jacobian are zero. For the specified term + +.. math:: + + \frac{\partial F_{N+2}}{X_s}=1 + +and all other partials of :math:`F_{N+2}` in the Jacobian are zero. + +.. + + Onwards... + + Gerg 2004 Monograph, Eqn 7.27: + + .. math:: + + \ln \phi_i = \left( \frac{\partial n\alpha^r}{\partial n_i}\right)_{T,V,n_j}-\ln Z + + and (Kunz, 2012, Table B4) + + .. math:: + + \left( \frac{\partial n\alpha^r}{\partial n_i}\right)_{T,V,n_j} = \alpha^r + n\left( \frac{\partial \alpha^r}{\partial n_i}\right)_{T,V,n_j} + + so + + .. math:: + + \ln \phi_i = \alpha^r + n\left( \frac{\partial \alpha^r}{\partial n_i}\right)_{T,V,n_j}-\ln Z + + and its derivative w.r.t T can be obtained analytically. What about pressure? + + +The fugacity coefficient can be obtained from (Kunz, 2012, equation 29) + +From GERG Monograph p. 60: + + Since the two phases of a non-critical mixture are characterised by different compositions resulting in different values for the reducing functions and the corresponding reduced variables, a simple integral criterion which connects all phase equilibrium properties in a single relation such as Eq. (4.11) does not exist for mixtures + +Pandoc +------ + +pandoc --mathjax -s -f rst -t html5 -o phase_boundary.html phase_boundary.rst \ No newline at end of file diff --git a/Web/mixtures/phase_envelope.ipynb b/Web/mixtures/phase_envelope.ipynb new file mode 100644 index 00000000..32dc5b62 --- /dev/null +++ b/Web/mixtures/phase_envelope.ipynb @@ -0,0 +1,474 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Forming the Phase Envelope" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Overview" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The analysis in this section follows the methodologies proposed in the GERG 2004 monograph published in 2007\n", + "\n", + "System of Equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our residual vector $\\mathbf{F}$ is equal to \n", + "\n", + "$$F_i = \\ln\\phi(T,p,\\mathbf{y})-\\ln \\phi(T,p,\\mathbf{x})+\\ln K_i=0, i=1,2,3... N$$\n", + "\n", + "$$F_{N+1} = \\sum_{i=1}^{N}(y_i-x_i)=0$$\n", + " \n", + "where\n", + "\n", + "$$x_i = \\frac{z_i}{1-\\beta+\\beta K_i}$$\n", + " \n", + "and \n", + "\n", + "$$y_i = \\frac{K_iz_i}{1-\\beta+\\beta K_i}$$\n", + " \n", + "DO NOT NORMALIZE $x$ and $y$ !!!!\n", + "\n", + "$$F_{N+2} = X_s - S = 0$$\n", + " \n", + "and the system to be solved is equal to\n", + "\n", + "$$\\mathbf{J}\\mathbf{\\Delta X}= -\\mathbf{F}$$\n", + " " + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Building the Jacobian matrix" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the trickiest part of this method. There are a lot of derivatives to implement, and we want to implement all of them analytically.\n", + "\n", + "$$\\frac{\\partial F_i}{\\partial \\ln T} = T\\left[ \\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)''_{p,\\mathbf{n}} -\\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)'_{p,\\mathbf{n}}\\right]$$\n", + " \n", + "$$\\frac{\\partial F_i}{\\partial \\ln p} = p\\left[ \\left(\\frac{\\partial \\ln \\phi_i}{\\partial p}\\right)''_{T,\\mathbf{n}} -\\left(\\frac{\\partial \\ln \\phi_i}{\\partial p}\\right)'_{T,\\mathbf{n}}\\right]$$\n", + " \n", + "$$ \\frac{\\partial F_i}{\\partial \\ln K_j} = \\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}[(1-\\beta)\\phi_{ij}''+\\beta\\phi_{ij}']+\\zeta $$\n", + "\n", + "$\\zeta$ is the Kronecker delta or $\\zeta = 0$ for $i\\neq j$ , and $\\zeta = 0$ for $i=j$. Also\n", + "\n", + "$$\\phi_{ij} = n\\left( \\frac{\\partial \\ln \\phi_i}{\\partial n_j}\\right)_{T,p}$$\n", + "\n", + "For the $F_{N+1}$ term,\n", + "\n", + "$$\\frac{\\partial F_{N+1}}{\\partial \\ln K_j}=\\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}$$\n", + "\n", + "and all other partials of $F_{N+1}$ in the Jacobian are zero. For the specified term\n", + "\n", + "$$\\frac{\\partial F_{N+2}}{X_s}=1$$\n", + " \n", + "and all other partials of $F_{N+2}$ in the Jacobian are zero.\n", + "\n", + "From GERG 2004 Monograph, Eqn 7.27:\n", + "\n", + "\n", + "$$\\ln \\phi_i = \\left( \\frac{\\partial n\\alpha^r}{\\partial n_i}\\right)_{T,V,n_j}-\\ln Z$$\n", + " \n", + "and (Kunz, 2012, Table B4)\n", + "\n", + "$$\\left( \\frac{\\partial n\\alpha^r}{\\partial n_i}\\right)_{T,V,n_j} = \\alpha^r + n\\left( \\frac{\\partial \\alpha^r}{\\partial n_i}\\right)_{T,V,n_j}$$\n", + " \n", + "so\n", + "\n", + "$$\\ln \\phi_i = \\alpha^r + n\\left( \\frac{\\partial \\alpha^r}{\\partial n_i}\\right)_{T,V,n_j}-\\ln Z$$" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Density marching phase envelope construction(T,P)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another two alternatives have been proposed in A DENSITY MARCHING METHOD FOR CALCULATING PHASE ENVELOPES\n", + "Gadhiraju Venkatarathnam, I&ECR, 2014\n", + "\n", + "In this paper, density marching methods are proposed rather than methods that march in temperature, pressure, or K-factor.\n", + "\n", + "The system of equations to be solved is similar to that of the GERG 2004 formulation, where the unknowns are $\\ln(T)$, $\\ln(p)$, and $\\ln(K_i)$\n", + "\n", + "(A1) - OK\n", + "$$F_i = \\ln K_i+\\ln\\phi(T,p,\\mathbf{y})-\\ln \\phi(T,p,\\mathbf{x})=0, i=1,2,3... N$$\n", + "\n", + "(A2) - OK\n", + "$$F_{N+1} = \\sum_{i=1}^{N}\\frac{z_i(K_i-1)}{1-\\beta+\\beta K_i}=0$$\n", + " \n", + "(A3) - TYPO, should be $\\ln(\\rho)$ rather than $\\rho$, and should be all on left-hand-side\n", + "$$F_{N+2} = \\ln \\rho ''-\\ln\\rho''_{S} = 0$$\n", + "\n", + "(A6) - TYPO, missing an n to multiply the terms $\\left( \\frac{\\partial \\ln \\phi_i}{\\partial n_j}\\right)_{T,p}$\n", + "$$ \\frac{\\partial F_i}{\\partial \\ln K_j} = \\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}[(1-\\beta)\\phi_{ij}''+\\beta\\phi_{ij}']+\\zeta $$\n", + "\n", + "$\\zeta$ is the Kronecker delta or $\\zeta = 0$ for $i\\neq j$ , and $\\zeta = 0$ for $i=j$.\n", + "\n", + "(A7) - OK\n", + "$$\\frac{\\partial F_i}{\\partial \\ln T} = T\\left[ \\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)''_{p,\\mathbf{n}} -\\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)'_{p,\\mathbf{n}}\\right]$$\n", + "\n", + "(A8) - OK\n", + "$$\\frac{\\partial F_i}{\\partial \\ln p} = p\\left[ \\left(\\frac{\\partial \\ln \\phi_i}{\\partial p}\\right)''_{T,\\mathbf{n}} -\\left(\\frac{\\partial \\ln \\phi_i}{\\partial p}\\right)'_{T,\\mathbf{n}}\\right]$$\n", + " \n", + "(A9) - OK\n", + "$$\\frac{\\partial F_{N+1}}{\\partial \\ln K_j}=\\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}$$\n", + "\n", + "(A11) - OK\n", + "$$ \\frac{\\partial F_{N+2}}{\\partial \\ln K_j} = \\frac{K_jz_j(1-\\beta)\\beta}{(1-\\beta+\\beta K_j)^2}\\left(n\\left(\\frac{\\partial \\rho}{\\partial n_j}\\right)''_{T,p}\\right)\\left(\\frac{1}{\\rho''_{S}}\\right)$$\n", + "\n", + "(A12) - OK\n", + "$$\\frac{\\partial F_{N+2}}{\\partial \\ln T}=\\left(\\frac{\\partial \\rho}{\\partial T}\\right)''_{p,n}\\frac{T}{\\rho''_{S}}$$\n", + "\n", + "(A13) - OK\n", + "$$\\frac{\\partial F_{N+2}}{\\partial \\ln p}=\\left(\\frac{\\partial \\rho}{\\partial p}\\right)''_{T,n}\\frac{p}{\\rho''_{S}}$$\n" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Density marching phase envelope construction (density)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another two alternatives have been proposed in A DENSITY MARCHING METHOD FOR CALCULATING PHASE ENVELOPES\n", + "Gadhiraju Venkatarathnam, I&ECR, 2014\n", + "\n", + "In this paper, density marching methods are proposed rather than methods that march in temperature, pressure, or K-factor.\n", + "\n", + "The system of equations to be solved is similar to that of the GERG 2004 formulation, where the unknowns are $\\ln(T)$, $\\ln(p)$, and $\\ln(K_i)$\n", + "\n", + "(A14) - OK\n", + "$$F_i = \\ln K_i+\\ln\\phi(T,\\rho'',\\mathbf{y})-\\ln \\phi(T,\\rho',\\mathbf{x})=0, i=1,2,3... N$$\n", + "\n", + "(A15) - OK\n", + "$$F_{N+1} = \\sum_{i=1}^{N}\\frac{z_i(K_i-1)}{1-\\beta+\\beta K_i}=0$$\n", + " \n", + "(A16) - OK\n", + "$$F_{N+2} = p(T,\\rho',\\mathbf{y})-p(T,\\rho'',\\mathbf{x}) = 0$$\n", + "\n", + "(A17) - TYPO, missing an n to multiply the terms $\\left( \\frac{\\partial \\ln \\phi_i}{\\partial n_j}\\right)_{T,p}$\n", + "$$ \\frac{\\partial F_i}{\\partial \\ln K_j} = \\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}[(1-\\beta)\\phi_{ij}''+\\beta\\phi_{ij}']+\\zeta $$\n", + "\n", + "$\\zeta$ is the Kronecker delta or $\\zeta = 0$ for $i\\neq j$ , and $\\zeta = 0$ for $i=j$.\n", + "\n", + "(A18) - OK\n", + "$$\\frac{\\partial F_i}{\\partial \\ln T} = T\\left[ \\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)''_{p,\\mathbf{n}} -\\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)'_{p,\\mathbf{n}}\\right]$$\n", + "\n", + "(A19) - OK\n", + "$$\\frac{\\partial F_i}{\\partial \\ln \\rho'} = -\\rho'\\left(\\frac{\\partial \\ln \\phi_i}{\\partial \\rho}\\right)'_{T,n}$$\n", + " \n", + "(A20) - OK\n", + "$$\\frac{\\partial F_{N+1}}{\\partial \\ln K_j}=\\frac{K_jz_j}{(1-\\beta+\\beta K_j)^2}$$\n", + "\n", + "(A22) - TYPO Second derivative of ln(phi) with respect to rho' needs constraints, first needs to have the constraints in the right place\n", + "$$ \\frac{\\partial F_{N+2}}{\\partial \\ln K_j} = \\frac{RTK_jz_j}{(1-\\beta+\\beta K_j)^2}\\left[(1-\\beta)\\left(\\frac{\\partial \\ln \\phi_i}{\\partial \\rho}\\right)''_{T,n}+\\beta\\left(\\frac{\\partial \\ln \\phi_i}{\\partial \\rho}\\right)'_{T,n}\\right]$$\n", + "\n", + "(A23) - TYPO Should be A23\n", + "$$\\frac{\\partial F_{N+2}}{\\partial \\ln T}=T\\left[\\left(\\frac{\\partial p}{\\partial T}\\right)'_{\\rho',n}-\\left(\\frac{\\partial p}{\\partial T}\\right)''_{\\rho'',n} \\right]$$\n", + "\n", + "(A24) - TYPO Should be A24\n", + "$$\\frac{\\partial F_{N+2}}{\\partial \\ln p'}=\\rho'\\left(\\frac{\\partial p}{\\partial \\rho}\\right)'_{T,n}$$\n" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Other analytic derivatives" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Three analyic derivatives are not provided in GERG and need to be rederived:\n", + "\n", + "$$\\left(\\frac{\\partial \\ln \\phi_i}{\\partial \\rho}\\right)_{T,n}$$\n", + "\n", + "$$\\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)_{\\rho,n}$$\n", + "\n", + "$$n\\left(\\frac{\\partial \\rho}{\\partial n_j}\\right)_{T,p}$$\n", + "The last is for T,p marching, the first two are for density marching." + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Derivations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For $n\\left( \\frac{\\partial \\rho}{\\partial n_i}\\right)_{T,p,n_j}$\n", + "-----------------------------------------------------------------\n", + "\n", + "GERG 2007 Monograph Equation 7.32 gives\n", + "\n", + "$$\\left( \\frac{\\partial V}{\\partial n_i}\\right)_{T,p,n_j} = \\dfrac{-\\left(\\dfrac{\\partial p}{\\partial n_i}\\right)_{T,V,n_j}}{\\left(\\dfrac{\\partial p}{\\partial V}\\right)_{T,n}}$$\n", + "\n", + "expand the left hand side with \n", + "\n", + "$V = vn = \\dfrac{n}{\\rho}$\n", + "\n", + "n held constant in derivative, so get\n", + "\n", + "$$\\left( \\frac{\\partial V}{\\partial n_i}\\right)_{T,p,n_j} = n\\left( \\frac{\\partial (1/\\rho)}{\\partial n_i}\\right)_{T,p,n_j} = -\\frac{n}{\\rho^2}\\left( \\frac{\\partial \\rho}{\\partial n_i}\\right)_{T,p,n_j}$$\n", + "\n", + "so\n", + "\n", + "$$ n\\left( \\frac{\\partial \\rho}{\\partial n_i}\\right)_{T,p,n_j} = -\\rho^2\\left( \\frac{\\partial V}{\\partial n_i}\\right)_{T,p,n_j} $$\n", + "\n", + "For $\\left(\\frac{\\partial \\ln \\phi_i}{\\partial \\rho}\\right)_{T,n}$ and $\\left(\\frac{\\partial \\ln \\phi_i}{\\partial T}\\right)_{\\rho,n}$\n", + "--------------------------------------------------------------------------------------------------------------------------------------------\n", + "\n", + "GERG 2007 Monograph 7.27\n", + "$$\\ln \\phi_i = \\left(\\frac{\\partial n \\alpha^r}{\\partial n_i} \\right)_{T,V,n_j} - \\ln Z $$\n", + "\n", + "GERG 2007 Monograph 7.34\n", + "$$\\ln \\left(\\frac{f_i}{n_i}\\right) = \\ln\\left(\\frac{RT}{V}\\right)+\\left(\\frac{\\partial n\\alpha^r}{\\partial n_i} \\right)_{T,V,n_j}$$\n", + "\n", + "and $Z = (pV)/(nRT)$, thus\n", + "\n", + "$$\\ln \\phi_i = \\ln \\left(\\frac{f_i}{n_i}\\right) - \\ln\\left(\\frac{RT}{V}\\right) - \\ln \\left(\\frac{pV}{nRT}\\right) ?= \\ln \\left(\\frac{f_i}{n_i}\\right) -\\ln\\left(\\frac{p}{n}\\right)$$\n", + "\n", + "$$\\frac{\\partial \\left[\\ln\\left(\\frac{p}{n}\\right)\\right]}{\\partial T} = \\frac{1}{pn}\\left(\\frac{\\partial p}{\\partial T}\\right)_{\\rho,n}$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equivalent fugacities for the $i$-th component\n", + "\n", + "$$ F_k^A = \\ln f_i(T,p,\\mathbf{x})-\\ln f_i(T,p,\\mathbf{y}) = 0\\mbox{ for } k = i = 1...N $$\n", + "\n", + "Material balance\n", + "\n", + "$$ F_k^B = \\frac{z_i-x_i}{y_i-x_i}-\\frac{z_{N-1}-x_{N-1}}{y_{N-1}-x_{N-1}}\\mbox{ for }i=1..N-2; k = i+N; k = N+1..2N-2$$\n", + "\n", + "The independent variables to be obtained are\n", + "\n", + "$$ \n" + ] + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Conversion of derivatives" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To convert partial with $T$, $V$, $x_k$ held constant to one with $\\tau$, $\\delta$, $x_k$ held constant, use Gernert 3.118, or\n", + "\n", + "$$ \\frac{\\partial}{\\partial x_j} [Y]_{T,V,x_k} = \\frac{\\partial}{\\partial x_j} [Y]_{\\tau,\\delta,x_k}+\\left(\\frac{\\partial\\delta}{\\partial x_j}\\right)_{T,V,x_k}\\left.\\frac{\\partial Y}{\\partial\\delta}\\right|_{\\tau,\\bar x}+\\left(\\frac{\\partial\\tau}{\\partial x_j}\\right)_{T,V,x_k}\\left.\\frac{\\partial Y}{\\partial\\tau}\\right|_{\\delta,\\bar x} $$\n", + "\n", + "To convert pressure,\n", + "\n", + "$$ p=\\rho R T(1+\\delta \\alpha_\\delta) $$\n", + "\n", + "convert $\\rho$ and $T$ to reduced variables\n", + "\n", + "$$ p=\\rho_r(\\bar x)\\delta R \\frac{T_r(\\bar x)}{\\tau}(1+\\delta \\alpha_\\delta) = \\rho_r(\\bar x)R \\frac{T_r(\\bar x)}{\\tau}\\delta (1+\\delta \\alpha_\\delta)$$\n", + "\n", + "All the derivatives\n", + "\n", + "$$ \\frac{dp}{d\\tau}\\times\\frac{d\\tau}{dx_j} = -\\rho_r(\\bar x)\\delta R \\frac{T_r(\\bar x)}{\\tau^2}(1+\\delta \\alpha_\\delta) \\times \\frac{1}{T}\\frac{\\partial T_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{dp}{d\\delta}\\times\\frac{d\\delta}{dx_j} = \\rho_r(\\bar x) R \\frac{T_r(\\bar x)}{\\tau}[ (1+\\delta \\alpha_\\delta)+ \\delta(\\alpha_\\delta+\\delta \\alpha_{\\delta\\delta})] \\times \\frac{-\\delta}{\\rho_r}\\frac{\\partial \\rho_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{\\tau,\\delta,x_k} = \\frac{\\delta R}{\\tau}\\left[\\rho_r(\\bar x)T_r(\\bar x)(\\delta \\frac{\\partial}{\\partial x_j}[\\alpha_\\delta]_{\\tau, \\delta, x_k})+(1+\\delta \\alpha_\\delta)\\left(\\rho_r \\frac{\\partial T_r}{\\partial x_j}+T_r \\frac{\\partial \\rho_r}{\\partial x_j}\\right)\\right]$$\n", + "\n", + "with $\\delta$ factored out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Turn back into normal variables\n", + "$$ \\frac{dp}{d\\tau}\\times\\frac{d\\tau}{dx_j} = -\\frac{\\rho R}{\\tau}(1+\\delta \\alpha_\\delta)\\frac{\\partial T_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{dp}{d\\delta}\\times\\frac{d\\delta}{dx_j} = - R T[ (1+\\delta \\alpha_\\delta)+ \\delta(\\alpha_\\delta+\\delta \\alpha_{\\delta\\delta})]\\delta\\frac{\\partial \\rho_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{\\tau,\\delta,x_k} = R\\left[\\rho T (\\delta \\frac{\\partial}{\\partial x_j}[\\alpha_\\delta]_{\\tau, \\delta, x_k})+(1+\\delta \\alpha_\\delta)\\left(\\frac{\\rho}{\\tau} \\frac{\\partial T_r}{\\partial x_j}+\\delta T \\frac{\\partial \\rho_r}{\\partial x_j}\\right)\\right]$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First term cancels with a term in the third one, yielding\n", + "\n", + "$$ \\frac{dp}{d\\delta}\\times\\frac{d\\delta}{dx_j} = -\\delta R T[ (1+\\delta \\alpha_\\delta)+ \\delta(\\alpha_\\delta+\\delta \\alpha_{\\delta\\delta})]\\frac{\\partial \\rho_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{\\tau,\\delta,x_k} = \\rho R T (\\delta \\frac{\\partial}{\\partial x_j}[\\alpha_\\delta]_{\\tau, \\delta, x_k})+(1+\\delta \\alpha_\\delta)\\delta R T \\frac{\\partial \\rho_r}{\\partial x_j}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First term in first line cancels with term at end of second line, yielding\n", + "\n", + "$$ \\frac{dp}{d\\delta}\\times\\frac{d\\delta}{dx_j} = -\\delta R T[ \\delta(\\alpha_\\delta+\\delta \\alpha_{\\delta\\delta})]\\frac{\\partial \\rho_r}{\\partial x_j}|_{T,V,x_k}$$\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{\\tau,\\delta,x_k} = \\rho R T (\\delta \\frac{\\partial}{\\partial x_j}[\\alpha_\\delta]_{\\tau, \\delta, x_k})$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total equation is\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{T,V,x_k} = \\rho R T \\left(\\delta \\frac{\\partial}{\\partial x_j}[\\alpha_\\delta]_{\\tau, \\delta, x_k}-\\frac{\\delta}{\\rho_r}(\\alpha_\\delta+\\delta \\alpha_{\\delta\\delta})\\frac{\\partial \\rho_r}{\\partial x_j}|_{T,V,x_k}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ p=\\rho R T(1+\\delta \\alpha_\\delta) $$\n", + "\n", + "$$ p=\\rho R T(1+\\frac{\\rho}{\\rho_r} \\alpha_\\delta) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\frac{\\partial p}{\\partial x_j}|_{T,V,x_k} = \\rho R T \\left(\\rho\\frac{-1}{\\rho_r^2}\\left(\\frac{\\partial \\rho_r}{\\partial x_j}\\right)_{x_{k\\neq j}}\\alpha_\\delta + \\frac{\\rho}{\\rho_r}\\left(\\frac{\\partial}{\\partial x_j}\\left(\\frac{\\partial \\alpha_r}{\\partial \\delta}_{\\tau,\\bar x}\\right)\\right)_{T,V,x_{k\\neq j}}\\right)$$\n", + "\n", + "$$ \\frac{\\partial p}{\\partial x_j}|_{T,V,x_k} = \\delta\\rho R T \\left(\\frac{-1}{\\rho_r}\\left(\\frac{\\partial \\rho_r}{\\partial x_j}\\right)_{x_{k\\neq j}}\\alpha_\\delta + \\left(\\frac{\\partial}{\\partial x_j}\\left(\\frac{\\partial \\alpha_r}{\\partial \\delta}_{\\tau,\\bar x}\\right)\\right)_{T,V,x_{k\\neq j}}\\right)$$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import CoolProp.CoolProp as CP\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p = np.linspace(1000, 12000, 100)\n", + "mix = 'REFPROP-MIX:Water[0.7]&Ethanol[0.3]'\n", + "rhoL = CP.Props('D','P',p,'Q',0,mix)\n", + "rhoV = CP.Props('D','P',p,'Q',1,mix)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "plt.plot(rhoL,p,rhoV,p)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 3, + "text": [ + "[,\n", + " ]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "K_i=\\frac{y_i}{x_i}" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/Web/mixtures/reducing_parameters.rst b/Web/mixtures/reducing_parameters.rst new file mode 100644 index 00000000..27eca8ca --- /dev/null +++ b/Web/mixtures/reducing_parameters.rst @@ -0,0 +1,108 @@ + +Mixtures Information +==================== + + +Reducing Parameters +------------------- + +From Lemmon, JPCRD, 2000 for the properties of Dry Air, and also from Lemmon, JPCRD, 2004 for the properties of R404A, R410A, etc. + +.. math:: + + \rho_r(\bar x) = \left[ \sum_{i=1}^m\frac{x_i}{\rho_{c_i}}+\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}x_ix_j\zeta_{ij}\right]^{-1} + +.. math:: + + T_r(\bar x) = \sum_{i=1}^mx_iT_{c_i}+\sum_{i=1}^{m-1}\sum_{j=i+1}^mx_ix_j\xi_{ij} + +From the GERG 2008 formulation (Kunz and Wagner, JCED, 2012) + +.. math:: + + T_r(\bar x) = \sum_{i=1}^{N}x_i^2T_{c,i} + \sum_{i=1}^{N-1}\sum_{j=i+1}^{N}2x_ix_j\beta_{T,ij}\gamma_{T,ij}\frac{x_i+x_j}{\beta_{T,ij}^2x_i+x_j}(T_{c,i}T_{c,j})^{0.5} + +.. math:: + + \frac{1}{\rho_r(\bar x)}=v_r(\bar x) = \sum_{i=1}^{N}x_i^2\frac{1}{\rho_{c,i}} + \sum_{i=1}^{N-1}\sum_{j=i+1}^N2x_ix_j\beta_{v,ij}\gamma_{v,ij}\frac{x_i+x_j}{\beta^2_{v,ij}x_i+x_j}\frac{1}{8}\left(\frac{1}{\rho_{c,i}^{1/3}}+\frac{1}{\rho_{c,j}^{1/3}}\right)^{3} + +Excess Helmholtz Energy Terms +----------------------------- +From Lemmon, JPCRD, 2004 for the properties of R404A, R410A, etc. + +.. math:: + + \alpha^E(\delta,\tau,\mathbf{x}) = \sum_{i=1}^{m-1} \sum_{j=i+1}^{m} \left [ x_ix_jF_{ij} \sum_{k}N_k\delta_{d_k}\tau^{t_k}\exp(-\delta^{l_k})\right] + +where the terms :math:`N_k,d_k,t_k,l_k` correspond to the pair given by the indices :math:`i,j` + +From Lemmon, JPCRD, 2000 for the properties of Dry Air + +.. math:: + + \alpha^E(\delta,\tau,\mathbf{x}) = \left \lbrace \sum_{i=1}^{2} \sum_{j=i+1}^{3} x_ix_jF_{ij}\right\rbrace \left[-0.00195245\delta^2\tau^{-1.4}+0.00871334\delta^2\tau^{1.5} \right] + + +From Kunz and Wagner, JCED, 2012 for GERG 2008 + +.. math:: + + \alpha^E(\delta,\tau,\mathbf{x}) = \sum_{i=1}^{N-1} \sum_{j=i+1}^{N} x_ix_jF_{ij}\alpha_{ij}^r(\delta,\tau) + +where + +.. math:: + + \alpha_{ij}^r(\delta,\tau) = \sum_{k=1}^{K_{pol,ij}}\eta_{ij,k}\delta^{d_{ij,k}}\tau^{t_{ij,k}}+\sum_{k=K_{pol,ij}+1}^{K_{pol,ij}+K_{Exp,ij}}\eta_{ij,k}\delta^{d_{ij,k}}\tau^{t_{ij,k}}\exp[-\eta_{ij,k}(\delta-\varepsilon_{ij,k})^2-\beta_{ij,k}(\delta-\gamma_{ij,k})] + +and is for the particular binary pair given by the indices :math:`i,j`. This term is similar in form to other Helmholtz energy terms for pure fluids though the derivatives are slightly special. + +Appendix +-------- +To convert from the form from Lemmon for HFC and Air to that of GERG 2008, the following steps are required: + +.. math:: + + x_0T_{c0}+(1-x_0)T_{c1}+x_0(1-x_0)\xi_{01} = x_0^2T_{c0}+(1-x_0)^2T_{c1} + 2x_0(1-x_0)\beta\gamma_T\frac{x_0+(1-x_0)}{\beta x_0 + (1-x_0)}\sqrt{T_{c0}T_{c1}} + +set :math:`\beta=1`, solve for :math:`\gamma`. Equate the terms + +.. math:: + + x_0T_{c0}+(1-x_0)T_{c1}+x_0(1-x_0)\xi_{01} = x_0^2T_{c0}+(1-x_0)^2T_{c1} + 2x_0(1-x_0)\gamma_T\sqrt{T_{c0}T_{c1}} + +Move to LHS + +.. math:: + + [x_0-x_0^2]T_{c0}+[(1-x_0)-(1-x_0)^2]T_{c1}+x_0(1-x_0)\xi_{01} = 2x_0(1-x_0)\gamma_T\sqrt{T_{c0}T_{c1}} + +Factor + +.. math:: + + x_0(1-x_0)T_{c0}+(1-x_0)[1-(1-x_0)]T_{c1}+x_0(1-x_0)\xi_{01} = 2x_0(1-x_0)\gamma_T\sqrt{T_{c0}T_{c1}} + +Expand + +.. math:: + + x_0(1-x_0)T_{c0}+x_0(1-x_0)T_{c1}+x_0(1-x_0)\xi_{01} = 2x_0(1-x_0)\gamma_T\sqrt{T_{c0}T_{c1}} + +Cancel factors of :math:`x_0(1-x_0)` + +.. math:: + + T_{c0}+T_{c1}+\xi_{01} = 2\gamma_T\sqrt{T_{c0}T_{c1}} + +Answer: + +.. math:: + + \boxed{\gamma_T = \dfrac{T_{c0}+T_{c1}+\xi_{01}}{2\sqrt{T_{c0}T_{c1}}}} + +Same idea for the volume + +.. math:: + + \boxed{\gamma_v = \dfrac{v_{c0}+v_{c1}+\zeta_{01}}{\frac{1}{4}\left(\frac{1}{\rho_{c,i}^{1/3}}+\frac{1}{\rho_{c,j}^{1/3}}\right)^{3}}} \ No newline at end of file diff --git a/Web/output_toggle.tpl b/Web/output_toggle.tpl new file mode 100644 index 00000000..43e193c7 --- /dev/null +++ b/Web/output_toggle.tpl @@ -0,0 +1,54 @@ +{%- extends 'html_basic.tpl' -%} + +{% block input_group -%} +
    +{{ super() }} +
    +{% endblock input_group %} + +{%- block header -%} +{{ super() }} + + + + + + + +{%- endblock header -%} diff --git a/Web/parse_bib.py b/Web/parse_bib.py new file mode 100644 index 00000000..d31c5611 --- /dev/null +++ b/Web/parse_bib.py @@ -0,0 +1,163 @@ +# coding: utf-8 + +from pybtex.database.input import bibtex + +def accent_substitutions(name): + + mapping = [('{\\~n}','\xf1'), # ñ + ('{\\`e}','\xe8'), # è + ("{\\'e}",'\xe9'), # é + ("{\\'a}",'\xe1'), # á + ("{\\`a}",'\xe0'), # à + ("{\\'i}",'\xed'), # í + ("{\\'i}",'\xed'), # í + ('{\\\"o}','\xf6'), # ö + ('{\\\"u}','\xfc'), # ü + ('{\\v s}','\x161'), # š + ] + for old, new in mapping: + name = name.replace(old, new) + return name + +def count_substr(s, ss): + c = 0 + for e in s: + if e == ss: + c += 1 + return c + +def DE(s): + try: + return s.decode('ascii').encode('utf-8') + except UnicodeEncodeError: + print 'Decoding error for',s + +class BibTeXerClass: + + def __init__(self, fName = '../CoolProp/CoolPropBibTeXLibrary.bib'): + parser = bibtex.Parser() + bib_data = parser.parse_file('../CoolProp/CoolPropBibTeXLibrary.bib') + self.entries = bib_data.entries + + def entry2rst(self, key): + + if key.startswith('__'): + return '' + + entry = self.entries[key] + + if entry is None: + return '' + + try: + authors = '; '.join([accent_substitutions(unicode(author).decode('ascii').encode('utf-8')) for author in entry.persons['author']]) + except UnicodeEncodeError: + print 'Decoding error for',[author for author in entry.persons['author']] + + if authors.find('{') > -1 or authors.find('}') > -1: + print authors + raise ValueError("authors [{authors:s}] may not have '{{' or '}}' character".format(authors = authors)) + + fields = entry.fields + + # Strip off the opening and closing brackets + fields['title'] = fields['title'].strip() + if fields['title'].startswith('{') and fields['title'].endswith('}'): + fields['title'] = fields['title'][1:len(entry.fields['title'])-1] + + f = fields + for key in f: + f[key] = DE(f[key]) + authors = str(authors) + + if entry.type == 'article': + if 'journal' not in fields: fields['journal'] = '' + if 'volume' not in fields: fields['volume'] = '' + if 'pages' not in fields: fields['pages'] = '' + + return authors + ', ' + f['year'] + ', ' + f['title'] + ', *' + f['journal'] + '*, ' + f['volume'] + ':' + f['pages'] + + elif entry.type == 'conference': + if 'journal' not in f: f['journal'] = '' + return authors + ', ' + f['year'] + ', ' + f['title'] + ', *' + f['booktitle'] + '*' + + elif entry.type == 'mastersthesis': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', *' + f['school'] + '*' + + elif entry.type == 'unpublished': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', note: ' + f['note'] + + elif entry.type == 'book': + return authors + ', ' + f['year'] + ', *' + f['title'] + '*, ' + f['publisher'] + + elif entry.type == 'techreport': + return authors + ', ' + f['year'] + ', *' + f['title'] + '*, ' + f['institution'] + + else: + print entry + + def entry2HTML(self, key): + + if key.startswith('__'): + return '' + + entry = self.entries[key] + + if entry is None: + return '' + + try: + authors = '; '.join([accent_substitutions(unicode(author).decode('ascii').encode('utf-8')) for author in entry.persons['author']]) + except UnicodeEncodeError: + print 'Decoding error for',[author for author in entry.persons['author']] + + if authors.find('{') > -1 or authors.find('}') > -1: + print authors + raise ValueError("authors [{authors:s}] may not have '{{' or '}}' character".format(authors = authors)) + + fields = entry.fields + + # Strip off the opening and closing brackets + fields['title'] = fields['title'].strip() + if fields['title'].startswith('{') and fields['title'].endswith('}'): + fields['title'] = fields['title'][1:len(entry.fields['title'])-1] + + f = fields + for key in f: + f[key] = DE(f[key]) + authors = str(authors) + + if entry.type == 'article': + if 'journal' not in fields: fields['journal'] = '' + if 'volume' not in fields: fields['volume'] = '' + if 'pages' not in fields: fields['pages'] = '' + + return authors + ', ' + f['year'] + ', ' + f['title'] + ', ' + f['journal'] + ', ' + f['volume'] + ':' + f['pages'] + + elif entry.type == 'conference': + if 'journal' not in f: f['journal'] = '' + return authors + ', ' + f['year'] + ', ' + f['title'] + ', ' + f['booktitle'] + '' + + elif entry.type == 'mastersthesis': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', ' + f['school'] + '' + + elif entry.type == 'unpublished': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', note: ' + f['note'] + + elif entry.type == 'book': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', ' + f['publisher'] + + elif entry.type == 'techreport': + return authors + ', ' + f['year'] + ', ' + f['title'] + ', ' + f['institution'] + + else: + print entry + + def findentry(self, key): + for entry in self.entries: + if entry['key'] == key: + return entry + +if __name__=='__main__': + B = BibTeXerClass() + print B.entry2rst('Mulero-JPCRD-2012') \ No newline at end of file diff --git a/Web/sphinxext/apigen.py b/Web/sphinxext/apigen.py new file mode 100644 index 00000000..12374096 --- /dev/null +++ b/Web/sphinxext/apigen.py @@ -0,0 +1,427 @@ +"""Attempt to generate templates for module reference with Sphinx + +XXX - we exclude extension modules + +To include extension modules, first identify them as valid in the +``_uri2path`` method, then handle them in the ``_parse_module`` script. + +We get functions and classes by parsing the text of .py files. +Alternatively we could import the modules for discovery, and we'd have +to do that for extension modules. This would involve changing the +``_parse_module`` method to work via import and introspection, and +might involve changing ``discover_modules`` (which determines which +files are modules, and therefore which module URIs will be passed to +``_parse_module``). + +NOTE: this is a modified version of a script originally shipped with the +PyMVPA project, which we've adapted for NIPY use. PyMVPA is an MIT-licensed +project.""" + +# Stdlib imports +import os +import re + +# Functions and classes +class ApiDocWriter(object): + ''' Class for automatic detection and parsing of API docs + to Sphinx-parsable reST format''' + + # only separating first two levels + rst_section_levels = ['*', '=', '-', '~', '^'] + + def __init__(self, + package_name, + rst_extension='.rst', + package_skip_patterns=None, + module_skip_patterns=None, + ): + ''' Initialize package for parsing + + Parameters + ---------- + package_name : string + Name of the top-level package. *package_name* must be the + name of an importable package + rst_extension : string, optional + Extension for reST files, default '.rst' + package_skip_patterns : None or sequence of {strings, regexps} + Sequence of strings giving URIs of packages to be excluded + Operates on the package path, starting at (including) the + first dot in the package path, after *package_name* - so, + if *package_name* is ``sphinx``, then ``sphinx.util`` will + result in ``.util`` being passed for earching by these + regexps. If is None, gives default. Default is: + ['\.tests$'] + module_skip_patterns : None or sequence + Sequence of strings giving URIs of modules to be excluded + Operates on the module name including preceding URI path, + back to the first dot after *package_name*. For example + ``sphinx.util.console`` results in the string to search of + ``.util.console`` + If is None, gives default. Default is: + ['\.setup$', '\._'] + ''' + if package_skip_patterns is None: + package_skip_patterns = ['\\.tests$'] + if module_skip_patterns is None: + module_skip_patterns = ['\\.setup$', '\\._'] + self.package_name = package_name + self.rst_extension = rst_extension + self.package_skip_patterns = package_skip_patterns + self.module_skip_patterns = module_skip_patterns + + def get_package_name(self): + return self._package_name + + def set_package_name(self, package_name): + ''' Set package_name + + >>> docwriter = ApiDocWriter('sphinx') + >>> import sphinx + >>> docwriter.root_path == sphinx.__path__[0] + True + >>> docwriter.package_name = 'docutils' + >>> import docutils + >>> docwriter.root_path == docutils.__path__[0] + True + ''' + # It's also possible to imagine caching the module parsing here + self._package_name = package_name + self.root_module = __import__(package_name) + self.root_path = self.root_module.__path__[0] + self.written_modules = None + + package_name = property(get_package_name, set_package_name, None, + 'get/set package_name') + + def _get_object_name(self, line): + ''' Get second token in line + >>> docwriter = ApiDocWriter('sphinx') + >>> docwriter._get_object_name(" def func(): ") + 'func' + >>> docwriter._get_object_name(" class Klass(object): ") + 'Klass' + >>> docwriter._get_object_name(" class Klass: ") + 'Klass' + ''' + name = line.split()[1].split('(')[0].strip() + # in case we have classes which are not derived from object + # ie. old style classes + return name.rstrip(':') + + def _uri2path(self, uri): + ''' Convert uri to absolute filepath + + Parameters + ---------- + uri : string + URI of python module to return path for + + Returns + ------- + path : None or string + Returns None if there is no valid path for this URI + Otherwise returns absolute file system path for URI + + Examples + -------- + >>> docwriter = ApiDocWriter('sphinx') + >>> import sphinx + >>> modpath = sphinx.__path__[0] + >>> res = docwriter._uri2path('sphinx.builder') + >>> res == os.path.join(modpath, 'builder.py') + True + >>> res = docwriter._uri2path('sphinx') + >>> res == os.path.join(modpath, '__init__.py') + True + >>> docwriter._uri2path('sphinx.does_not_exist') + + ''' + if uri == self.package_name: + return os.path.join(self.root_path, '__init__.py') + path = uri.replace('.', os.path.sep) + path = path.replace(self.package_name + os.path.sep, '') + path = os.path.join(self.root_path, path) + # XXX maybe check for extensions as well? + if os.path.exists(path + '.py'): # file + path += '.py' + elif os.path.exists(os.path.join(path, '__init__.py')): + path = os.path.join(path, '__init__.py') + else: + return None + return path + + def _path2uri(self, dirpath): + ''' Convert directory path to uri ''' + relpath = dirpath.replace(self.root_path, self.package_name) + if relpath.startswith(os.path.sep): + relpath = relpath[1:] + return relpath.replace(os.path.sep, '.') + + def _parse_module(self, uri): + ''' Parse module defined in *uri* ''' + filename = self._uri2path(uri) + if filename is None: + # nothing that we could handle here. + return ([],[]) + f = open(filename, 'rt') + functions, classes = self._parse_lines(f) + f.close() + return functions, classes + + def _parse_lines(self, linesource): + ''' Parse lines of text for functions and classes ''' + functions = [] + classes = [] + for line in linesource: + if line.startswith('def ') and line.count('('): + # exclude private stuff + name = self._get_object_name(line) + if not name.startswith('_'): + functions.append(name) + elif line.startswith('class '): + # exclude private stuff + name = self._get_object_name(line) + if not name.startswith('_'): + classes.append(name) + else: + pass + functions.sort() + classes.sort() + return functions, classes + + def generate_api_doc(self, uri): + '''Make autodoc documentation template string for a module + + Parameters + ---------- + uri : string + python location of module - e.g 'sphinx.builder' + + Returns + ------- + S : string + Contents of API doc + ''' + # get the names of all classes and functions + functions, classes = self._parse_module(uri) + if not len(functions) and not len(classes): + print 'WARNING: Empty -',uri # dbg + return '' + + # Make a shorter version of the uri that omits the package name for + # titles + uri_short = re.sub(r'^%s\.' % self.package_name,'',uri) + + ad = '.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n' + + chap_title = uri_short + ad += (chap_title+'\n'+ self.rst_section_levels[1] * len(chap_title) + + '\n\n') + + # Set the chapter title to read 'module' for all modules except for the + # main packages + if '.' in uri: + title = 'Module: :mod:`' + uri_short + '`' + else: + title = ':mod:`' + uri_short + '`' + ad += title + '\n' + self.rst_section_levels[2] * len(title) + + if len(classes): + ad += '\nInheritance diagram for ``%s``:\n\n' % uri + ad += '.. inheritance-diagram:: %s \n' % uri + ad += ' :parts: 3\n' + + ad += '\n.. automodule:: ' + uri + '\n' + ad += '\n.. currentmodule:: ' + uri + '\n' + multi_class = len(classes) > 1 + multi_fx = len(functions) > 1 + if multi_class: + ad += '\n' + 'Classes' + '\n' + \ + self.rst_section_levels[2] * 7 + '\n' + elif len(classes) and multi_fx: + ad += '\n' + 'Class' + '\n' + \ + self.rst_section_levels[2] * 5 + '\n' + for c in classes: + ad += '\n:class:`' + c + '`\n' \ + + self.rst_section_levels[multi_class + 2 ] * \ + (len(c)+9) + '\n\n' + ad += '\n.. autoclass:: ' + c + '\n' + # must NOT exclude from index to keep cross-refs working + ad += ' :members:\n' \ + ' :undoc-members:\n' \ + ' :show-inheritance:\n' \ + ' :inherited-members:\n' \ + '\n' \ + ' .. automethod:: __init__\n' + if multi_fx: + ad += '\n' + 'Functions' + '\n' + \ + self.rst_section_levels[2] * 9 + '\n\n' + elif len(functions) and multi_class: + ad += '\n' + 'Function' + '\n' + \ + self.rst_section_levels[2] * 8 + '\n\n' + for f in functions: + # must NOT exclude from index to keep cross-refs working + ad += '\n.. autofunction:: ' + uri + '.' + f + '\n\n' + return ad + + def _survives_exclude(self, matchstr, match_type): + ''' Returns True if *matchstr* does not match patterns + + ``self.package_name`` removed from front of string if present + + Examples + -------- + >>> dw = ApiDocWriter('sphinx') + >>> dw._survives_exclude('sphinx.okpkg', 'package') + True + >>> dw.package_skip_patterns.append('^\\.badpkg$') + >>> dw._survives_exclude('sphinx.badpkg', 'package') + False + >>> dw._survives_exclude('sphinx.badpkg', 'module') + True + >>> dw._survives_exclude('sphinx.badmod', 'module') + True + >>> dw.module_skip_patterns.append('^\\.badmod$') + >>> dw._survives_exclude('sphinx.badmod', 'module') + False + ''' + if match_type == 'module': + patterns = self.module_skip_patterns + elif match_type == 'package': + patterns = self.package_skip_patterns + else: + raise ValueError('Cannot interpret match type "%s"' + % match_type) + # Match to URI without package name + L = len(self.package_name) + if matchstr[:L] == self.package_name: + matchstr = matchstr[L:] + for pat in patterns: + try: + pat.search + except AttributeError: + pat = re.compile(pat) + if pat.search(matchstr): + return False + return True + + def discover_modules(self): + ''' Return module sequence discovered from ``self.package_name`` + + + Parameters + ---------- + None + + Returns + ------- + mods : sequence + Sequence of module names within ``self.package_name`` + + Examples + -------- + >>> dw = ApiDocWriter('sphinx') + >>> mods = dw.discover_modules() + >>> 'sphinx.util' in mods + True + >>> dw.package_skip_patterns.append('\.util$') + >>> 'sphinx.util' in dw.discover_modules() + False + >>> + ''' + modules = [self.package_name] + # raw directory parsing + for dirpath, dirnames, filenames in os.walk(self.root_path): + # Check directory names for packages + root_uri = self._path2uri(os.path.join(self.root_path, + dirpath)) + for dirname in dirnames[:]: # copy list - we modify inplace + package_uri = '.'.join((root_uri, dirname)) + if (self._uri2path(package_uri) and + self._survives_exclude(package_uri, 'package')): + modules.append(package_uri) + else: + dirnames.remove(dirname) + # Check filenames for modules + for filename in filenames: + module_name = filename[:-3] + module_uri = '.'.join((root_uri, module_name)) + if (self._uri2path(module_uri) and + self._survives_exclude(module_uri, 'module')): + modules.append(module_uri) + return sorted(modules) + + def write_modules_api(self, modules,outdir): + # write the list + written_modules = [] + for m in modules: + api_str = self.generate_api_doc(m) + if not api_str: + continue + # write out to file + outfile = os.path.join(outdir, + m + self.rst_extension) + fileobj = open(outfile, 'wt') + fileobj.write(api_str) + fileobj.close() + written_modules.append(m) + self.written_modules = written_modules + + def write_api_docs(self, outdir): + """Generate API reST files. + + Parameters + ---------- + outdir : string + Directory name in which to store files + We create automatic filenames for each module + + Returns + ------- + None + + Notes + ----- + Sets self.written_modules to list of written modules + """ + if not os.path.exists(outdir): + os.mkdir(outdir) + # compose list of modules + modules = self.discover_modules() + self.write_modules_api(modules,outdir) + + def write_index(self, outdir, froot='gen', relative_to=None): + """Make a reST API index file from written files + + Parameters + ---------- + path : string + Filename to write index to + outdir : string + Directory to which to write generated index file + froot : string, optional + root (filename without extension) of filename to write to + Defaults to 'gen'. We add ``self.rst_extension``. + relative_to : string + path to which written filenames are relative. This + component of the written file path will be removed from + outdir, in the generated index. Default is None, meaning, + leave path as it is. + """ + if self.written_modules is None: + raise ValueError('No modules written') + # Get full filename path + path = os.path.join(outdir, froot+self.rst_extension) + # Path written into index is relative to rootpath + if relative_to is not None: + relpath = outdir.replace(relative_to + os.path.sep, '') + else: + relpath = outdir + idx = open(path,'wt') + w = idx.write + w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n') + w('.. toctree::\n\n') + for f in self.written_modules: + w(' %s\n' % os.path.join(relpath,f)) + idx.close() diff --git a/Web/sphinxext/docscrape.py b/Web/sphinxext/docscrape.py new file mode 100644 index 00000000..f374b3dd --- /dev/null +++ b/Web/sphinxext/docscrape.py @@ -0,0 +1,497 @@ +"""Extract reference documentation from the NumPy source tree. + +""" + +import inspect +import textwrap +import re +import pydoc +from StringIO import StringIO +from warnings import warn +4 +class Reader(object): + """A line-based string reader. + + """ + def __init__(self, data): + """ + Parameters + ---------- + data : str + String with lines separated by '\n'. + + """ + if isinstance(data,list): + self._str = data + else: + self._str = data.split('\n') # store string as list of lines + + self.reset() + + def __getitem__(self, n): + return self._str[n] + + def reset(self): + self._l = 0 # current line nr + + def read(self): + if not self.eof(): + out = self[self._l] + self._l += 1 + return out + else: + return '' + + def seek_next_non_empty_line(self): + for l in self[self._l:]: + if l.strip(): + break + else: + self._l += 1 + + def eof(self): + return self._l >= len(self._str) + + def read_to_condition(self, condition_func): + start = self._l + for line in self[start:]: + if condition_func(line): + return self[start:self._l] + self._l += 1 + if self.eof(): + return self[start:self._l+1] + return [] + + def read_to_next_empty_line(self): + self.seek_next_non_empty_line() + def is_empty(line): + return not line.strip() + return self.read_to_condition(is_empty) + + def read_to_next_unindented_line(self): + def is_unindented(line): + return (line.strip() and (len(line.lstrip()) == len(line))) + return self.read_to_condition(is_unindented) + + def peek(self,n=0): + if self._l + n < len(self._str): + return self[self._l + n] + else: + return '' + + def is_empty(self): + return not ''.join(self._str).strip() + + +class NumpyDocString(object): + def __init__(self,docstring): + docstring = textwrap.dedent(docstring).split('\n') + + self._doc = Reader(docstring) + self._parsed_data = { + 'Signature': '', + 'Summary': [''], + 'Extended Summary': [], + 'Parameters': [], + 'Returns': [], + 'Raises': [], + 'Warns': [], + 'Other Parameters': [], + 'Attributes': [], + 'Methods': [], + 'See Also': [], + 'Notes': [], + 'Warnings': [], + 'References': '', + 'Examples': '', + 'index': {} + } + + self._parse() + + def __getitem__(self,key): + return self._parsed_data[key] + + def __setitem__(self,key,val): + if not self._parsed_data.has_key(key): + warn("Unknown section %s" % key) + else: + self._parsed_data[key] = val + + def _is_at_section(self): + self._doc.seek_next_non_empty_line() + + if self._doc.eof(): + return False + + l1 = self._doc.peek().strip() # e.g. Parameters + + if l1.startswith('.. index::'): + return True + + l2 = self._doc.peek(1).strip() # ---------- or ========== + return l2.startswith('-'*len(l1)) or l2.startswith('='*len(l1)) + + def _strip(self,doc): + i = 0 + j = 0 + for i,line in enumerate(doc): + if line.strip(): break + + for j,line in enumerate(doc[::-1]): + if line.strip(): break + + return doc[i:len(doc)-j] + + def _read_to_next_section(self): + section = self._doc.read_to_next_empty_line() + + while not self._is_at_section() and not self._doc.eof(): + if not self._doc.peek(-1).strip(): # previous line was empty + section += [''] + + section += self._doc.read_to_next_empty_line() + + return section + + def _read_sections(self): + while not self._doc.eof(): + data = self._read_to_next_section() + name = data[0].strip() + + if name.startswith('..'): # index section + yield name, data[1:] + elif len(data) < 2: + yield StopIteration + else: + yield name, self._strip(data[2:]) + + def _parse_param_list(self,content): + r = Reader(content) + params = [] + while not r.eof(): + header = r.read().strip() + if ' : ' in header: + arg_name, arg_type = header.split(' : ')[:2] + else: + arg_name, arg_type = header, '' + + desc = r.read_to_next_unindented_line() + desc = dedent_lines(desc) + + params.append((arg_name,arg_type,desc)) + + return params + + + _name_rgx = re.compile(r"^\s*(:(?P\w+):`(?P[a-zA-Z0-9_.-]+)`|" + r" (?P[a-zA-Z0-9_.-]+))\s*", re.X) + def _parse_see_also(self, content): + """ + func_name : Descriptive text + continued text + another_func_name : Descriptive text + func_name1, func_name2, :meth:`func_name`, func_name3 + + """ + items = [] + + def parse_item_name(text): + """Match ':role:`name`' or 'name'""" + m = self._name_rgx.match(text) + if m: + g = m.groups() + if g[1] is None: + return g[3], None + else: + return g[2], g[1] + raise ValueError("%s is not a item name" % text) + + def push_item(name, rest): + if not name: + return + name, role = parse_item_name(name) + items.append((name, list(rest), role)) + del rest[:] + + current_func = None + rest = [] + + for line in content: + if not line.strip(): continue + + m = self._name_rgx.match(line) + if m and line[m.end():].strip().startswith(':'): + push_item(current_func, rest) + current_func, line = line[:m.end()], line[m.end():] + rest = [line.split(':', 1)[1].strip()] + if not rest[0]: + rest = [] + elif not line.startswith(' '): + push_item(current_func, rest) + current_func = None + if ',' in line: + for func in line.split(','): + push_item(func, []) + elif line.strip(): + current_func = line + elif current_func is not None: + rest.append(line.strip()) + push_item(current_func, rest) + return items + + def _parse_index(self, section, content): + """ + .. index: default + :refguide: something, else, and more + + """ + def strip_each_in(lst): + return [s.strip() for s in lst] + + out = {} + section = section.split('::') + if len(section) > 1: + out['default'] = strip_each_in(section[1].split(','))[0] + for line in content: + line = line.split(':') + if len(line) > 2: + out[line[1]] = strip_each_in(line[2].split(',')) + return out + + def _parse_summary(self): + """Grab signature (if given) and summary""" + if self._is_at_section(): + return + + summary = self._doc.read_to_next_empty_line() + summary_str = " ".join([s.strip() for s in summary]).strip() + if re.compile('^([\w., ]+=)?\s*[\w\.]+\(.*\)$').match(summary_str): + self['Signature'] = summary_str + if not self._is_at_section(): + self['Summary'] = self._doc.read_to_next_empty_line() + else: + self['Summary'] = summary + + if not self._is_at_section(): + self['Extended Summary'] = self._read_to_next_section() + + def _parse(self): + self._doc.reset() + self._parse_summary() + + for (section,content) in self._read_sections(): + if not section.startswith('..'): + section = ' '.join([s.capitalize() for s in section.split(' ')]) + if section in ('Parameters', 'Attributes', 'Methods', + 'Returns', 'Raises', 'Warns'): + self[section] = self._parse_param_list(content) + elif section.startswith('.. index::'): + self['index'] = self._parse_index(section, content) + elif section == 'See Also': + self['See Also'] = self._parse_see_also(content) + else: + self[section] = content + + # string conversion routines + + def _str_header(self, name, symbol='-'): + return [name, len(name)*symbol] + + def _str_indent(self, doc, indent=4): + out = [] + for line in doc: + out += [' '*indent + line] + return out + + def _str_signature(self): + if self['Signature']: + return [self['Signature'].replace('*','\*')] + [''] + else: + return [''] + + def _str_summary(self): + if self['Summary']: + return self['Summary'] + [''] + else: + return [] + + def _str_extended_summary(self): + if self['Extended Summary']: + return self['Extended Summary'] + [''] + else: + return [] + + def _str_param_list(self, name): + out = [] + if self[name]: + out += self._str_header(name) + for param,param_type,desc in self[name]: + out += ['%s : %s' % (param, param_type)] + out += self._str_indent(desc) + out += [''] + return out + + def _str_section(self, name): + out = [] + if self[name]: + out += self._str_header(name) + out += self[name] + out += [''] + return out + + def _str_see_also(self, func_role): + if not self['See Also']: return [] + out = [] + out += self._str_header("See Also") + last_had_desc = True + for func, desc, role in self['See Also']: + if role: + link = ':%s:`%s`' % (role, func) + elif func_role: + link = ':%s:`%s`' % (func_role, func) + else: + link = "`%s`_" % func + if desc or last_had_desc: + out += [''] + out += [link] + else: + out[-1] += ", %s" % link + if desc: + out += self._str_indent([' '.join(desc)]) + last_had_desc = True + else: + last_had_desc = False + out += [''] + return out + + def _str_index(self): + idx = self['index'] + out = [] + out += ['.. index:: %s' % idx.get('default','')] + for section, references in idx.iteritems(): + if section == 'default': + continue + out += [' :%s: %s' % (section, ', '.join(references))] + return out + + def __str__(self, func_role=''): + out = [] + out += self._str_signature() + out += self._str_summary() + out += self._str_extended_summary() + for param_list in ('Parameters','Returns','Raises'): + out += self._str_param_list(param_list) + out += self._str_section('Warnings') + out += self._str_see_also(func_role) + for s in ('Notes','References','Examples'): + out += self._str_section(s) + out += self._str_index() + return '\n'.join(out) + + +def indent(str,indent=4): + indent_str = ' '*indent + if str is None: + return indent_str + lines = str.split('\n') + return '\n'.join(indent_str + l for l in lines) + +def dedent_lines(lines): + """Deindent a list of lines maximally""" + return textwrap.dedent("\n".join(lines)).split("\n") + +def header(text, style='-'): + return text + '\n' + style*len(text) + '\n' + + +class FunctionDoc(NumpyDocString): + def __init__(self, func, role='func', doc=None): + self._f = func + self._role = role # e.g. "func" or "meth" + if doc is None: + doc = inspect.getdoc(func) or '' + try: + NumpyDocString.__init__(self, doc) + except ValueError, e: + print '*'*78 + print "ERROR: '%s' while parsing `%s`" % (e, self._f) + print '*'*78 + #print "Docstring follows:" + #print doclines + #print '='*78 + + if not self['Signature']: + func, func_name = self.get_func() + try: + # try to read signature + argspec = inspect.getargspec(func) + argspec = inspect.formatargspec(*argspec) + argspec = argspec.replace('*','\*') + signature = '%s%s' % (func_name, argspec) + except TypeError, e: + signature = '%s()' % func_name + self['Signature'] = signature + + def get_func(self): + func_name = getattr(self._f, '__name__', self.__class__.__name__) + if inspect.isclass(self._f): + func = getattr(self._f, '__call__', self._f.__init__) + else: + func = self._f + return func, func_name + + def __str__(self): + out = '' + + func, func_name = self.get_func() + signature = self['Signature'].replace('*', '\*') + + roles = {'func': 'function', + 'meth': 'method'} + + if self._role: + if not roles.has_key(self._role): + print "Warning: invalid role %s" % self._role + out += '.. %s:: %s\n \n\n' % (roles.get(self._role,''), + func_name) + + out += super(FunctionDoc, self).__str__(func_role=self._role) + return out + + +class ClassDoc(NumpyDocString): + def __init__(self,cls,modulename='',func_doc=FunctionDoc,doc=None): + if not inspect.isclass(cls): + raise ValueError("Initialise using a class. Got %r" % cls) + self._cls = cls + + if modulename and not modulename.endswith('.'): + modulename += '.' + self._mod = modulename + self._name = cls.__name__ + self._func_doc = func_doc + + if doc is None: + doc = pydoc.getdoc(cls) + + NumpyDocString.__init__(self, doc) + + @property + def methods(self): + return [name for name,func in inspect.getmembers(self._cls) + if not name.startswith('_') and callable(func)] + + def __str__(self): + out = '' + out += super(ClassDoc, self).__str__() + out += "\n\n" + + #for m in self.methods: + # print "Parsing `%s`" % m + # out += str(self._func_doc(getattr(self._cls,m), 'meth')) + '\n\n' + # out += '.. index::\n single: %s; %s\n\n' % (self._name, m) + + return out + + diff --git a/Web/sphinxext/docscrape_sphinx.py b/Web/sphinxext/docscrape_sphinx.py new file mode 100644 index 00000000..77ed271b --- /dev/null +++ b/Web/sphinxext/docscrape_sphinx.py @@ -0,0 +1,136 @@ +import re, inspect, textwrap, pydoc +from docscrape import NumpyDocString, FunctionDoc, ClassDoc + +class SphinxDocString(NumpyDocString): + # string conversion routines + def _str_header(self, name, symbol='`'): + return ['.. rubric:: ' + name, ''] + + def _str_field_list(self, name): + return [':' + name + ':'] + + def _str_indent(self, doc, indent=4): + out = [] + for line in doc: + out += [' '*indent + line] + return out + + def _str_signature(self): + return [''] + if self['Signature']: + return ['``%s``' % self['Signature']] + [''] + else: + return [''] + + def _str_summary(self): + return self['Summary'] + [''] + + def _str_extended_summary(self): + return self['Extended Summary'] + [''] + + def _str_param_list(self, name): + out = [] + if self[name]: + out += self._str_field_list(name) + out += [''] + for param,param_type,desc in self[name]: + out += self._str_indent(['**%s** : %s' % (param.strip(), + param_type)]) + out += [''] + out += self._str_indent(desc,8) + out += [''] + return out + + def _str_section(self, name): + out = [] + if self[name]: + out += self._str_header(name) + out += [''] + content = textwrap.dedent("\n".join(self[name])).split("\n") + out += content + out += [''] + return out + + def _str_see_also(self, func_role): + out = [] + if self['See Also']: + see_also = super(SphinxDocString, self)._str_see_also(func_role) + out = ['.. seealso::', ''] + out += self._str_indent(see_also[2:]) + return out + + def _str_warnings(self): + out = [] + if self['Warnings']: + out = ['.. warning::', ''] + out += self._str_indent(self['Warnings']) + return out + + def _str_index(self): + idx = self['index'] + out = [] + if len(idx) == 0: + return out + + out += ['.. index:: %s' % idx.get('default','')] + for section, references in idx.iteritems(): + if section == 'default': + continue + elif section == 'refguide': + out += [' single: %s' % (', '.join(references))] + else: + out += [' %s: %s' % (section, ','.join(references))] + return out + + def _str_references(self): + out = [] + if self['References']: + out += self._str_header('References') + if isinstance(self['References'], str): + self['References'] = [self['References']] + out.extend(self['References']) + out += [''] + return out + + def __str__(self, indent=0, func_role="obj"): + out = [] + out += self._str_signature() + out += self._str_index() + [''] + out += self._str_summary() + out += self._str_extended_summary() + for param_list in ('Parameters', 'Attributes', 'Methods', + 'Returns','Raises'): + out += self._str_param_list(param_list) + out += self._str_warnings() + out += self._str_see_also(func_role) + out += self._str_section('Notes') + out += self._str_references() + out += self._str_section('Examples') + out = self._str_indent(out,indent) + return '\n'.join(out) + +class SphinxFunctionDoc(SphinxDocString, FunctionDoc): + pass + +class SphinxClassDoc(SphinxDocString, ClassDoc): + pass + +def get_doc_object(obj, what=None, doc=None): + if what is None: + if inspect.isclass(obj): + what = 'class' + elif inspect.ismodule(obj): + what = 'module' + elif callable(obj): + what = 'function' + else: + what = 'object' + if what == 'class': + return SphinxClassDoc(obj, '', func_doc=SphinxFunctionDoc, doc=doc) + elif what in ('function', 'method'): + return SphinxFunctionDoc(obj, '', doc=doc) + else: + if doc is None: + doc = pydoc.getdoc(obj) + return SphinxDocString(doc) + diff --git a/Web/sphinxext/inheritance_diagram.py b/Web/sphinxext/inheritance_diagram.py new file mode 100644 index 00000000..407fc13f --- /dev/null +++ b/Web/sphinxext/inheritance_diagram.py @@ -0,0 +1,407 @@ +""" +Defines a docutils directive for inserting inheritance diagrams. + +Provide the directive with one or more classes or modules (separated +by whitespace). For modules, all of the classes in that module will +be used. + +Example:: + + Given the following classes: + + class A: pass + class B(A): pass + class C(A): pass + class D(B, C): pass + class E(B): pass + + .. inheritance-diagram: D E + + Produces a graph like the following: + + A + / \ + B C + / \ / + E D + +The graph is inserted as a PNG+image map into HTML and a PDF in +LaTeX. +""" + +import inspect +import os +import re +import subprocess +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + +from docutils.nodes import Body, Element +from docutils.parsers.rst import directives +from sphinx.roles import xfileref_role + +def my_import(name): + """Module importer - taken from the python documentation. + + This function allows importing names with dots in them.""" + + mod = __import__(name) + components = name.split('.') + for comp in components[1:]: + mod = getattr(mod, comp) + return mod + +class DotException(Exception): + pass + +class InheritanceGraph(object): + """ + Given a list of classes, determines the set of classes that + they inherit from all the way to the root "object", and then + is able to generate a graphviz dot graph from them. + """ + def __init__(self, class_names, show_builtins=False): + """ + *class_names* is a list of child classes to show bases from. + + If *show_builtins* is True, then Python builtins will be shown + in the graph. + """ + self.class_names = class_names + self.classes = self._import_classes(class_names) + self.all_classes = self._all_classes(self.classes) + if len(self.all_classes) == 0: + raise ValueError("No classes found for inheritance diagram") + self.show_builtins = show_builtins + + py_sig_re = re.compile(r'''^([\w.]*\.)? # class names + (\w+) \s* $ # optionally arguments + ''', re.VERBOSE) + + def _import_class_or_module(self, name): + """ + Import a class using its fully-qualified *name*. + """ + try: + path, base = self.py_sig_re.match(name).groups() + except: + raise ValueError( + "Invalid class or module '%s' specified for inheritance diagram" % name) + fullname = (path or '') + base + path = (path and path.rstrip('.')) + if not path: + path = base + try: + module = __import__(path, None, None, []) + # We must do an import of the fully qualified name. Otherwise if a + # subpackage 'a.b' is requested where 'import a' does NOT provide + # 'a.b' automatically, then 'a.b' will not be found below. This + # second call will force the equivalent of 'import a.b' to happen + # after the top-level import above. + my_import(fullname) + + except ImportError: + raise ValueError( + "Could not import class or module '%s' specified for inheritance diagram" % name) + + try: + todoc = module + for comp in fullname.split('.')[1:]: + todoc = getattr(todoc, comp) + except AttributeError: + raise ValueError( + "Could not find class or module '%s' specified for inheritance diagram" % name) + + # If a class, just return it + if inspect.isclass(todoc): + return [todoc] + elif inspect.ismodule(todoc): + classes = [] + for cls in todoc.__dict__.values(): + if inspect.isclass(cls) and cls.__module__ == todoc.__name__: + classes.append(cls) + return classes + raise ValueError( + "'%s' does not resolve to a class or module" % name) + + def _import_classes(self, class_names): + """ + Import a list of classes. + """ + classes = [] + for name in class_names: + classes.extend(self._import_class_or_module(name)) + return classes + + def _all_classes(self, classes): + """ + Return a list of all classes that are ancestors of *classes*. + """ + all_classes = {} + + def recurse(cls): + all_classes[cls] = None + for c in cls.__bases__: + if c not in all_classes: + recurse(c) + + for cls in classes: + recurse(cls) + + return all_classes.keys() + + def class_name(self, cls, parts=0): + """ + Given a class object, return a fully-qualified name. This + works for things I've tested in matplotlib so far, but may not + be completely general. + """ + module = cls.__module__ + if module == '__builtin__': + fullname = cls.__name__ + else: + fullname = "%s.%s" % (module, cls.__name__) + if parts == 0: + return fullname + name_parts = fullname.split('.') + return '.'.join(name_parts[-parts:]) + + def get_all_class_names(self): + """ + Get all of the class names involved in the graph. + """ + return [self.class_name(x) for x in self.all_classes] + + # These are the default options for graphviz + default_graph_options = { + "rankdir": "LR", + "size": '"8.0, 12.0"' + } + default_node_options = { + "shape": "box", + "fontsize": 10, + "height": 0.25, + "fontname": "Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans", + "style": '"setlinewidth(0.5)"' + } + default_edge_options = { + "arrowsize": 0.5, + "style": '"setlinewidth(0.5)"' + } + + def _format_node_options(self, options): + return ','.join(["%s=%s" % x for x in options.items()]) + def _format_graph_options(self, options): + return ''.join(["%s=%s;\n" % x for x in options.items()]) + + def generate_dot(self, fd, name, parts=0, urls={}, + graph_options={}, node_options={}, + edge_options={}): + """ + Generate a graphviz dot graph from the classes that + were passed in to __init__. + + *fd* is a Python file-like object to write to. + + *name* is the name of the graph + + *urls* is a dictionary mapping class names to http urls + + *graph_options*, *node_options*, *edge_options* are + dictionaries containing key/value pairs to pass on as graphviz + properties. + """ + g_options = self.default_graph_options.copy() + g_options.update(graph_options) + n_options = self.default_node_options.copy() + n_options.update(node_options) + e_options = self.default_edge_options.copy() + e_options.update(edge_options) + + fd.write('digraph %s {\n' % name) + fd.write(self._format_graph_options(g_options)) + + for cls in self.all_classes: + if not self.show_builtins and cls in __builtins__.values(): + continue + + name = self.class_name(cls, parts) + + # Write the node + this_node_options = n_options.copy() + url = urls.get(self.class_name(cls)) + if url is not None: + this_node_options['URL'] = '"%s"' % url + fd.write(' "%s" [%s];\n' % + (name, self._format_node_options(this_node_options))) + + # Write the edges + for base in cls.__bases__: + if not self.show_builtins and base in __builtins__.values(): + continue + + base_name = self.class_name(base, parts) + fd.write(' "%s" -> "%s" [%s];\n' % + (base_name, name, + self._format_node_options(e_options))) + fd.write('}\n') + + def run_dot(self, args, name, parts=0, urls={}, + graph_options={}, node_options={}, edge_options={}): + """ + Run graphviz 'dot' over this graph, returning whatever 'dot' + writes to stdout. + + *args* will be passed along as commandline arguments. + + *name* is the name of the graph + + *urls* is a dictionary mapping class names to http urls + + Raises DotException for any of the many os and + installation-related errors that may occur. + """ + try: + dot = subprocess.Popen(['dot'] + list(args), + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + close_fds=True) + except OSError: + raise DotException("Could not execute 'dot'. Are you sure you have 'graphviz' installed?") + except ValueError: + raise DotException("'dot' called with invalid arguments") + except: + raise DotException("Unexpected error calling 'dot'") + + self.generate_dot(dot.stdin, name, parts, urls, graph_options, + node_options, edge_options) + dot.stdin.close() + result = dot.stdout.read() + returncode = dot.wait() + if returncode != 0: + raise DotException("'dot' returned the errorcode %d" % returncode) + return result + +class inheritance_diagram(Body, Element): + """ + A docutils node to use as a placeholder for the inheritance + diagram. + """ + pass + +def inheritance_diagram_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, + state_machine): + """ + Run when the inheritance_diagram directive is first encountered. + """ + node = inheritance_diagram() + + class_names = arguments + + # Create a graph starting with the list of classes + graph = InheritanceGraph(class_names) + + # Create xref nodes for each target of the graph's image map and + # add them to the doc tree so that Sphinx can resolve the + # references to real URLs later. These nodes will eventually be + # removed from the doctree after we're done with them. + for name in graph.get_all_class_names(): + refnodes, x = xfileref_role( + 'class', ':class:`%s`' % name, name, 0, state) + node.extend(refnodes) + # Store the graph object so we can use it to generate the + # dot file later + node['graph'] = graph + # Store the original content for use as a hash + node['parts'] = options.get('parts', 0) + node['content'] = " ".join(class_names) + return [node] + +def get_graph_hash(node): + return md5(node['content'] + str(node['parts'])).hexdigest()[-10:] + +def html_output_graph(self, node): + """ + Output the graph for HTML. This will insert a PNG with clickable + image map. + """ + graph = node['graph'] + parts = node['parts'] + + graph_hash = get_graph_hash(node) + name = "inheritance%s" % graph_hash + path = '_images' + dest_path = os.path.join(setup.app.builder.outdir, path) + if not os.path.exists(dest_path): + os.makedirs(dest_path) + png_path = os.path.join(dest_path, name + ".png") + path = setup.app.builder.imgpath + + # Create a mapping from fully-qualified class names to URLs. + urls = {} + for child in node: + if child.get('refuri') is not None: + urls[child['reftitle']] = child.get('refuri') + elif child.get('refid') is not None: + urls[child['reftitle']] = '#' + child.get('refid') + + # These arguments to dot will save a PNG file to disk and write + # an HTML image map to stdout. + image_map = graph.run_dot(['-Tpng', '-o%s' % png_path, '-Tcmapx'], + name, parts, urls) + return ('%s' % + (path, name, name, image_map)) + +def latex_output_graph(self, node): + """ + Output the graph for LaTeX. This will insert a PDF. + """ + graph = node['graph'] + parts = node['parts'] + + graph_hash = get_graph_hash(node) + name = "inheritance%s" % graph_hash + dest_path = os.path.abspath(os.path.join(setup.app.builder.outdir, '_images')) + if not os.path.exists(dest_path): + os.makedirs(dest_path) + pdf_path = os.path.abspath(os.path.join(dest_path, name + ".pdf")) + + graph.run_dot(['-Tpdf', '-o%s' % pdf_path], + name, parts, graph_options={'size': '"6.0,6.0"'}) + return '\n\\includegraphics{%s}\n\n' % pdf_path + +def visit_inheritance_diagram(inner_func): + """ + This is just a wrapper around html/latex_output_graph to make it + easier to handle errors and insert warnings. + """ + def visitor(self, node): + try: + content = inner_func(self, node) + except DotException, e: + # Insert the exception as a warning in the document + warning = self.document.reporter.warning(str(e), line=node.line) + warning.parent = node + node.children = [warning] + else: + source = self.document.attributes['source'] + self.body.append(content) + node.children = [] + return visitor + +def do_nothing(self, node): + pass + +def setup(app): + setup.app = app + setup.confdir = app.confdir + + app.add_node( + inheritance_diagram, + latex=(visit_inheritance_diagram(latex_output_graph), do_nothing), + html=(visit_inheritance_diagram(html_output_graph), do_nothing)) + app.add_directive( + 'inheritance-diagram', inheritance_diagram_directive, + False, (1, 100, 0), parts = directives.nonnegative_int) diff --git a/Web/sphinxext/ipython_console_highlighting.py b/Web/sphinxext/ipython_console_highlighting.py new file mode 100644 index 00000000..217b779d --- /dev/null +++ b/Web/sphinxext/ipython_console_highlighting.py @@ -0,0 +1,114 @@ +"""reST directive for syntax-highlighting ipython interactive sessions. + +XXX - See what improvements can be made based on the new (as of Sept 2009) +'pycon' lexer for the python console. At the very least it will give better +highlighted tracebacks. +""" + +#----------------------------------------------------------------------------- +# Needed modules + +# Standard library +import re + +# Third party +from pygments.lexer import Lexer, do_insertions +from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, + PythonTracebackLexer) +from pygments.token import Comment, Generic + +from sphinx import highlighting + +#----------------------------------------------------------------------------- +# Global constants +line_re = re.compile('.*?\n') + +#----------------------------------------------------------------------------- +# Code begins - classes and functions + +class IPythonConsoleLexer(Lexer): + """ + For IPython console output or doctests, such as: + + .. sourcecode:: ipython + + In [1]: a = 'foo' + + In [2]: a + Out[2]: 'foo' + + In [3]: print a + foo + + In [4]: 1 / 0 + + Notes: + + - Tracebacks are not currently supported. + + - It assumes the default IPython prompts, not customized ones. + """ + + name = 'IPython console session' + aliases = ['ipython'] + mimetypes = ['text/x-ipython-console'] + input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") + output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") + continue_prompt = re.compile(" \.\.\.+:") + tb_start = re.compile("\-+") + + def get_tokens_unprocessed(self, text): + pylexer = PythonLexer(**self.options) + tblexer = PythonTracebackLexer(**self.options) + + curcode = '' + insertions = [] + for match in line_re.finditer(text): + line = match.group() + input_prompt = self.input_prompt.match(line) + continue_prompt = self.continue_prompt.match(line.rstrip()) + output_prompt = self.output_prompt.match(line) + if line.startswith("#"): + insertions.append((len(curcode), + [(0, Comment, line)])) + elif input_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, input_prompt.group())])) + curcode += line[input_prompt.end():] + elif continue_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, continue_prompt.group())])) + curcode += line[continue_prompt.end():] + elif output_prompt is not None: + # Use the 'error' token for output. We should probably make + # our own token, but error is typicaly in a bright color like + # red, so it works fine for our output prompts. + insertions.append((len(curcode), + [(0, Generic.Error, output_prompt.group())])) + curcode += line[output_prompt.end():] + else: + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + curcode = '' + insertions = [] + yield match.start(), Generic.Output, line + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + + +def setup(app): + """Setup as a sphinx extension.""" + + # This is only a lexer, so adding it below to pygments appears sufficient. + # But if somebody knows that the right API usage should be to do that via + # sphinx, by all means fix it here. At least having this setup.py + # suppresses the sphinx warning we'd get without it. + pass + +#----------------------------------------------------------------------------- +# Register the extension as a valid pygments lexer +highlighting.lexers['ipython'] = IPythonConsoleLexer() diff --git a/Web/sphinxext/numpydoc.py b/Web/sphinxext/numpydoc.py new file mode 100644 index 00000000..ff6c44c5 --- /dev/null +++ b/Web/sphinxext/numpydoc.py @@ -0,0 +1,116 @@ +""" +======== +numpydoc +======== + +Sphinx extension that handles docstrings in the Numpy standard format. [1] + +It will: + +- Convert Parameters etc. sections to field lists. +- Convert See Also section to a See also entry. +- Renumber references. +- Extract the signature from the docstring, if it can't be determined otherwise. + +.. [1] http://projects.scipy.org/scipy/numpy/wiki/CodingStyleGuidelines#docstring-standard + +""" + +import os, re, pydoc +from docscrape_sphinx import get_doc_object, SphinxDocString +import inspect + +def mangle_docstrings(app, what, name, obj, options, lines, + reference_offset=[0]): + if what == 'module': + # Strip top title + title_re = re.compile(r'^\s*[#*=]{4,}\n[a-z0-9 -]+\n[#*=]{4,}\s*', + re.I|re.S) + lines[:] = title_re.sub('', "\n".join(lines)).split("\n") + else: + doc = get_doc_object(obj, what, "\n".join(lines)) + lines[:] = str(doc).split("\n") + + if app.config.numpydoc_edit_link and hasattr(obj, '__name__') and \ + obj.__name__: + if hasattr(obj, '__module__'): + v = dict(full_name="%s.%s" % (obj.__module__, obj.__name__)) + else: + v = dict(full_name=obj.__name__) + lines += ['', '.. htmlonly::', ''] + lines += [' %s' % x for x in + (app.config.numpydoc_edit_link % v).split("\n")] + + # replace reference numbers so that there are no duplicates + references = [] + for l in lines: + l = l.strip() + if l.startswith('.. ['): + try: + references.append(int(l[len('.. ['):l.index(']')])) + except ValueError: + print "WARNING: invalid reference in %s docstring" % name + + # Start renaming from the biggest number, otherwise we may + # overwrite references. + references.sort() + if references: + for i, line in enumerate(lines): + for r in references: + new_r = reference_offset[0] + r + lines[i] = lines[i].replace('[%d]_' % r, + '[%d]_' % new_r) + lines[i] = lines[i].replace('.. [%d]' % r, + '.. [%d]' % new_r) + + reference_offset[0] += len(references) + +def mangle_signature(app, what, name, obj, options, sig, retann): + # Do not try to inspect classes that don't define `__init__` + if (inspect.isclass(obj) and + 'initializes x; see ' in pydoc.getdoc(obj.__init__)): + return '', '' + + if not (callable(obj) or hasattr(obj, '__argspec_is_invalid_')): return + if not hasattr(obj, '__doc__'): return + + doc = SphinxDocString(pydoc.getdoc(obj)) + if doc['Signature']: + sig = re.sub("^[^(]*", "", doc['Signature']) + return sig, '' + +def initialize(app): + try: + app.connect('autodoc-process-signature', mangle_signature) + except: + monkeypatch_sphinx_ext_autodoc() + +def setup(app, get_doc_object_=get_doc_object): + global get_doc_object + get_doc_object = get_doc_object_ + + app.connect('autodoc-process-docstring', mangle_docstrings) + app.connect('builder-inited', initialize) + app.add_config_value('numpydoc_edit_link', None, True) + +#------------------------------------------------------------------------------ +# Monkeypatch sphinx.ext.autodoc to accept argspecless autodocs (Sphinx < 0.5) +#------------------------------------------------------------------------------ + +def monkeypatch_sphinx_ext_autodoc(): + global _original_format_signature + import sphinx.ext.autodoc + + if sphinx.ext.autodoc.format_signature is our_format_signature: + return + + print "[numpydoc] Monkeypatching sphinx.ext.autodoc ..." + _original_format_signature = sphinx.ext.autodoc.format_signature + sphinx.ext.autodoc.format_signature = our_format_signature + +def our_format_signature(what, obj): + r = mangle_signature(None, what, None, obj, None, None, None) + if r is not None: + return r[0] + else: + return _original_format_signature(what, obj) diff --git a/dev/IncompressibleLiquids/Therminol_SIunit_conversion.EES b/dev/IncompressibleLiquids/Therminol_SIunit_conversion.EES new file mode 100644 index 00000000..c218df23 Binary files /dev/null and b/dev/IncompressibleLiquids/Therminol_SIunit_conversion.EES differ diff --git a/dev/IncompressibleLiquids/data_incompressible.py b/dev/IncompressibleLiquids/data_incompressible.py new file mode 100644 index 00000000..18128de1 --- /dev/null +++ b/dev/IncompressibleLiquids/data_incompressible.py @@ -0,0 +1,560 @@ +import numpy + + +class LiquidData(object): + """ + A base class that defines all the variables needed + in order to make a proper fit. You can copy this code + put in your data and some documentation for where the + information came from. + """ + Name = None # Name of the current fluid + Desc = None # Name of the current fluid + Tmin = None # Minimum temperature in K + TminPsat = None # Minimum saturation temperature in K + Tmax = None # Maximum temperature in K + T = None # Temperature for data points in K + rho = None # Density in kg/m3 + c_p = None # Heat capacity in J/(kg.K) + lam = None # Thermal conductivity in W/(m.K) + mu_dyn = None # Dynamic viscosity in Pa.s + psat = None # Saturation pressure in Pa + + + +class Example(LiquidData): + """ + Heat transfer fluid TherminolD12 by Solutia + """ + Name = "Example" + Tmin = -85 + 273.15 + TminPsat= 40 + 273.15 + Tmax = 260 + 273.15 + T = numpy.array([ 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150])+273.15 # Kelvin + rho = numpy.array([ 740, 733, 726, 717, 710, 702, 695, 687, 679, 670, 662]) # kg/m3 + c_p = numpy.array([ 2235, 2280, 2326, 2361, 2406, 2445, 2485, 2528, 2571, 2607, 2645]) # J/kg-K + lam = numpy.array([0.105, 0.104, 0.102, 0.100, 0.098, 0.096, 0.095, 0.093, 0.091, 0.089, 0.087]) # W/m-K + mu_dyn = numpy.array([0.804, 0.704, 0.623, 0.556, 0.498, 0.451, 0.410, 0.374, 0.346, 0.317, 0.289]) # Pa-s + psat = numpy.array([ 0.5, 0.9, 1.4, 2.3, 3.9, 6.0, 8.7, 12.4, 17.6, 24.4, 33.2]) # Pa + + +#class TherminolD12(LiquidData): +# """ +# Heat transfer fluid Therminol D12 by Solutia +# Source: http://twt.mpei.ac.ru/MCS/Worksheets/HEDH/.%5C..%5C..%5C..%5CTTHB%5CHEDH%5CHTF-D12.PDF +# """ +# Tmin = -85 + 273.15 +# TminPsat= 40 + 273.15 +# Tmax = 260 + 273.15 +# T = numpy.array([ 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150])+273.15 # Kelvin +# rho = numpy.array([ 740, 733, 726, 717, 710, 702, 695, 687, 679, 670, 662]) # kg/m3 +# c_p = numpy.array([ 2235, 2280, 2326, 2361, 2406, 2445, 2485, 2528, 2571, 2607, 2645])/1000. # kJ/kg-K +# lam = numpy.array([0.105, 0.104, 0.102, 0.100, 0.098, 0.096, 0.095, 0.093, 0.091, 0.089, 0.087])/1000. # kW/m-K +# mu_dyn = numpy.array([0.804, 0.704, 0.623, 0.556, 0.498, 0.451, 0.410, 0.374, 0.346, 0.317, 0.289])/1000. # Pa-s +# psat = numpy.array([ 0.5, 0.9, 1.4, 2.3, 3.9, 6.0, 8.7, 12.4, 17.6, 24.4, 33.2]) # kPa + + +class TherminolD12(LiquidData): + """ + Heat transfer fluid Therminol D12 by Solutia + Source: Therminol Heat Transfer Reference Disk + """ + T = numpy.array([-8.50000E+1, -8.00000E+1, -7.50000E+1, -7.00000E+1, -6.50000E+1, -6.00000E+1, -5.50000E+1, -5.00000E+1, -4.50000E+1, -4.00000E+1, -3.50000E+1, -3.00000E+1, -2.50000E+1, -2.00000E+1, -1.50000E+1, -1.00000E+1, -5.00000E+0, +0.00000E+0, +5.00000E+0, +1.00000E+1, +1.50000E+1, +2.00000E+1, +2.50000E+1, +3.00000E+1, +3.50000E+1, +4.00000E+1, +4.50000E+1, +5.00000E+1, +5.50000E+1, +6.00000E+1, +6.50000E+1, +7.00000E+1, +7.50000E+1, +8.00000E+1, +8.50000E+1, +9.00000E+1, +9.50000E+1, +1.00000E+2, +1.05000E+2, +1.10000E+2, +1.15000E+2, +1.20000E+2, +1.25000E+2, +1.30000E+2, +1.35000E+2, +1.40000E+2, +1.45000E+2, +1.50000E+2, +1.55000E+2, +1.60000E+2, +1.65000E+2, +1.70000E+2, +1.75000E+2, +1.80000E+2, +1.85000E+2, +1.90000E+2, +1.95000E+2, +2.00000E+2, +2.05000E+2, +2.10000E+2, +2.15000E+2, +2.20000E+2, +2.25000E+2, +2.30000E+2])+273.15 # Kelvin + rho = numpy.array([+8.35000E+2, +8.32000E+2, +8.28000E+2, +8.25000E+2, +8.22000E+2, +8.18000E+2, +8.15000E+2, +8.11000E+2, +8.08000E+2, +8.05000E+2, +8.01000E+2, +7.98000E+2, +7.94000E+2, +7.91000E+2, +7.87000E+2, +7.84000E+2, +7.80000E+2, +7.77000E+2, +7.73000E+2, +7.70000E+2, +7.66000E+2, +7.62000E+2, +7.59000E+2, +7.55000E+2, +7.52000E+2, +7.48000E+2, +7.44000E+2, +7.41000E+2, +7.37000E+2, +7.33000E+2, +7.29000E+2, +7.26000E+2, +7.22000E+2, +7.18000E+2, +7.14000E+2, +7.10000E+2, +7.06000E+2, +7.03000E+2, +6.99000E+2, +6.95000E+2, +6.91000E+2, +6.87000E+2, +6.82000E+2, +6.78000E+2, +6.74000E+2, +6.70000E+2, +6.66000E+2, +6.61000E+2, +6.57000E+2, +6.53000E+2, +6.48000E+2, +6.44000E+2, +6.39000E+2, +6.35000E+2, +6.30000E+2, +6.25000E+2, +6.20000E+2, +6.16000E+2, +6.11000E+2, +6.06000E+2, +6.00000E+2, +5.95000E+2, +5.90000E+2, +5.84000E+2]) # kg/m3 + c_p = numpy.array([+1.69400E+0, +1.71200E+0, +1.73100E+0, +1.75000E+0, +1.76800E+0, +1.78700E+0, +1.80600E+0, +1.82400E+0, +1.84300E+0, +1.86200E+0, +1.88100E+0, +1.90000E+0, +1.91900E+0, +1.93800E+0, +1.95700E+0, +1.97700E+0, +1.99600E+0, +2.01500E+0, +2.03500E+0, +2.05400E+0, +2.07300E+0, +2.09300E+0, +2.11300E+0, +2.13200E+0, +2.15200E+0, +2.17200E+0, +2.19100E+0, +2.21100E+0, +2.23100E+0, +2.25100E+0, +2.27100E+0, +2.29100E+0, +2.31200E+0, +2.33200E+0, +2.35200E+0, +2.37300E+0, +2.39300E+0, +2.41400E+0, +2.43400E+0, +2.45500E+0, +2.47600E+0, +2.49600E+0, +2.51700E+0, +2.53800E+0, +2.55900E+0, +2.58000E+0, +2.60200E+0, +2.62300E+0, +2.64400E+0, +2.66600E+0, +2.68700E+0, +2.70900E+0, +2.73100E+0, +2.75300E+0, +2.77500E+0, +2.79700E+0, +2.82000E+0, +2.84200E+0, +2.86500E+0, +2.88800E+0, +2.91100E+0, +2.93500E+0, +2.95900E+0, +2.98300E+0])*1000. # J/kg-K + lam = numpy.array([+1.24400E-1, +1.23800E-1, +1.23200E-1, +1.22500E-1, +1.21900E-1, +1.21300E-1, +1.20600E-1, +1.20000E-1, +1.19300E-1, +1.18600E-1, +1.18000E-1, +1.17300E-1, +1.16600E-1, +1.15900E-1, +1.15200E-1, +1.14500E-1, +1.13700E-1, +1.13000E-1, +1.12200E-1, +1.11500E-1, +1.10700E-1, +1.10000E-1, +1.09200E-1, +1.08400E-1, +1.07600E-1, +1.06800E-1, +1.06000E-1, +1.05200E-1, +1.04400E-1, +1.03500E-1, +1.02700E-1, +1.01900E-1, +1.01000E-1, +1.00100E-1, +9.93000E-2, +9.84000E-2, +9.75000E-2, +9.66000E-2, +9.57000E-2, +9.48000E-2, +9.39000E-2, +9.29000E-2, +9.20000E-2, +9.10000E-2, +9.01000E-2, +8.91000E-2, +8.82000E-2, +8.72000E-2, +8.62000E-2, +8.52000E-2, +8.42000E-2, +8.32000E-2, +8.22000E-2, +8.12000E-2, +8.01000E-2, +7.91000E-2, +7.80000E-2, +7.70000E-2, +7.59000E-2, +7.48000E-2, +7.38000E-2, +7.27000E-2, +7.16000E-2, +7.05000E-2]) # W/m-K + mu_dyn = numpy.array([+3.59000E-1, +1.77000E-1, +9.59000E-2, +5.64000E-2, +3.55000E-2, +2.36000E-2, +1.65000E-2, +1.20000E-2, +9.07000E-3, +7.06000E-3, +5.63000E-3, +4.60000E-3, +3.82000E-3, +3.24000E-3, +2.78000E-3, +2.41000E-3, +2.12000E-3, +1.88000E-3, +1.69000E-3, +1.52000E-3, +1.38000E-3, +1.26000E-3, +1.16000E-3, +1.07000E-3, +9.88000E-4, +9.18000E-4, +8.56000E-4, +8.00000E-4, +7.50000E-4, +7.05000E-4, +6.64000E-4, +6.26000E-4, +5.92000E-4, +5.61000E-4, +5.31000E-4, +5.04000E-4, +4.79000E-4, +4.56000E-4, +4.35000E-4, +4.14000E-4, +3.95000E-4, +3.78000E-4, +3.61000E-4, +3.45000E-4, +3.30000E-4, +3.16000E-4, +3.03000E-4, +2.90000E-4, +2.78000E-4, +2.67000E-4, +2.57000E-4, +2.46000E-4, +2.37000E-4, +2.27000E-4, +2.19000E-4, +2.10000E-4, +2.02000E-4, +1.95000E-4, +1.87000E-4, +1.80000E-4, +1.74000E-4, +1.67000E-4, +1.61000E-4, +1.56000E-4]) # Pa-s + psat = numpy.array([+4.75000E-9, +2.07000E-8, +8.08000E-8, +2.81000E-7, +8.86000E-7, +2.56000E-6, +6.82000E-6, +1.70000E-5, +3.96000E-5, +8.75000E-5, +1.84000E-4, +3.68000E-4, +7.06000E-4, +1.30000E-3, +2.33000E-3, +4.02000E-3, +6.75000E-3, +1.10000E-2, +1.76000E-2, +2.73000E-2, +4.16000E-2, +6.21000E-2, +9.10000E-2, +1.31000E-1, +1.86000E-1, +2.59000E-1, +3.56000E-1, +4.84000E-1, +6.48000E-1, +8.59000E-1, +1.13000E+0, +1.46000E+0, +1.88000E+0, +2.39000E+0, +3.01000E+0, +3.77000E+0, +4.68000E+0, +5.76000E+0, +7.05000E+0, +8.57000E+0, +1.03000E+1, +1.24000E+1, +1.48000E+1, +1.76000E+1, +2.08000E+1, +2.44000E+1, +2.85000E+1, +3.32000E+1, +3.84000E+1, +4.43000E+1, +5.09000E+1, +5.83000E+1, +6.64000E+1, +7.55000E+1, +8.55000E+1, +9.65000E+1, +1.09000E+2, +1.22000E+2, +1.36000E+2, +1.52000E+2, +1.69000E+2, +1.88000E+2, +2.08000E+2, +2.29000E+2])*1000. # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmin + Name = "TD12" + Desc = "TherminolD12" + +class TherminolVP1(LiquidData): + """ + Heat transfer fluid Therminol VP-1 by Solutia + Source: Therminol Heat Transfer Reference Disk + """ + T = numpy.array([+1.20000E+1, +1.70000E+1, +2.20000E+1, +2.70000E+1, +3.20000E+1, +3.70000E+1, +4.20000E+1, +4.70000E+1, +5.20000E+1, +5.70000E+1, +6.20000E+1, +6.70000E+1, +7.20000E+1, +7.70000E+1, +8.20000E+1, +8.70000E+1, +9.20000E+1, +9.70000E+1, +1.02000E+2, +1.07000E+2, +1.12000E+2, +1.17000E+2, +1.22000E+2, +1.27000E+2, +1.32000E+2, +1.37000E+2, +1.42000E+2, +1.47000E+2, +1.52000E+2, +1.57000E+2, +1.62000E+2, +1.67000E+2, +1.72000E+2, +1.77000E+2, +1.82000E+2, +1.87000E+2, +1.92000E+2, +1.97000E+2, +2.02000E+2, +2.07000E+2, +2.12000E+2, +2.17000E+2, +2.22000E+2, +2.27000E+2, +2.32000E+2, +2.37000E+2, +2.42000E+2, +2.47000E+2, +2.52000E+2, +2.57000E+2, +2.62000E+2, +2.67000E+2, +2.72000E+2, +2.77000E+2, +2.82000E+2, +2.87000E+2, +2.92000E+2, +2.97000E+2, +3.02000E+2, +3.07000E+2, +3.12000E+2, +3.17000E+2, +3.22000E+2, +3.27000E+2, +3.32000E+2, +3.37000E+2, +3.42000E+2, +3.47000E+2, +3.52000E+2, +3.57000E+2, +3.62000E+2, +3.67000E+2, +3.72000E+2, +3.77000E+2, +3.82000E+2, +3.87000E+2, +3.92000E+2, +3.97000E+2])+273.15 # Kelvin + rho = numpy.array([+1.07000E+3, +1.07000E+3, +1.06000E+3, +1.06000E+3, +1.05000E+3, +1.05000E+3, +1.05000E+3, +1.04000E+3, +1.04000E+3, +1.03000E+3, +1.03000E+3, +1.03000E+3, +1.02000E+3, +1.02000E+3, +1.01000E+3, +1.01000E+3, +1.01000E+3, +1.00000E+3, +9.97000E+2, +9.93000E+2, +9.88000E+2, +9.84000E+2, +9.80000E+2, +9.76000E+2, +9.72000E+2, +9.67000E+2, +9.63000E+2, +9.59000E+2, +9.55000E+2, +9.50000E+2, +9.46000E+2, +9.42000E+2, +9.37000E+2, +9.33000E+2, +9.29000E+2, +9.24000E+2, +9.20000E+2, +9.15000E+2, +9.11000E+2, +9.06000E+2, +9.02000E+2, +8.98000E+2, +8.93000E+2, +8.89000E+2, +8.84000E+2, +8.79000E+2, +8.75000E+2, +8.70000E+2, +8.65000E+2, +8.60000E+2, +8.56000E+2, +8.51000E+2, +8.46000E+2, +8.41000E+2, +8.36000E+2, +8.31000E+2, +8.25000E+2, +8.20000E+2, +8.15000E+2, +8.10000E+2, +8.04000E+2, +7.99000E+2, +7.93000E+2, +7.88000E+2, +7.82000E+2, +7.76000E+2, +7.70000E+2, +7.65000E+2, +7.59000E+2, +7.52000E+2, +7.46000E+2, +7.40000E+2, +7.33000E+2, +7.27000E+2, +7.20000E+2, +7.13000E+2, +7.06000E+2, +6.99000E+2]) # kg/m3 + c_p = numpy.array([+1.52300E+0, +1.53700E+0, +1.55200E+0, +1.56600E+0, +1.58100E+0, +1.59600E+0, +1.61000E+0, +1.62400E+0, +1.63900E+0, +1.65300E+0, +1.66800E+0, +1.68200E+0, +1.69600E+0, +1.71000E+0, +1.72400E+0, +1.73900E+0, +1.75300E+0, +1.76700E+0, +1.78100E+0, +1.79500E+0, +1.80900E+0, +1.82200E+0, +1.83600E+0, +1.85000E+0, +1.86400E+0, +1.87800E+0, +1.89100E+0, +1.90500E+0, +1.91900E+0, +1.93200E+0, +1.94600E+0, +1.95900E+0, +1.97300E+0, +1.98600E+0, +2.00000E+0, +2.01300E+0, +2.02700E+0, +2.04000E+0, +2.05400E+0, +2.06700E+0, +2.08000E+0, +2.09300E+0, +2.10700E+0, +2.12000E+0, +2.13300E+0, +2.14700E+0, +2.16000E+0, +2.17300E+0, +2.18600E+0, +2.19900E+0, +2.21300E+0, +2.22600E+0, +2.23900E+0, +2.25200E+0, +2.26600E+0, +2.27900E+0, +2.29300E+0, +2.30600E+0, +2.31900E+0, +2.33300E+0, +2.34700E+0, +2.36000E+0, +2.37400E+0, +2.38800E+0, +2.40200E+0, +2.41600E+0, +2.43100E+0, +2.44600E+0, +2.46000E+0, +2.47600E+0, +2.49100E+0, +2.50700E+0, +2.52300E+0, +2.54000E+0, +2.55800E+0, +2.57600E+0, +2.59500E+0, +2.61500E+0])*1000. # J/kg-K + lam = numpy.array([+1.37000E-1, +1.36600E-1, +1.36100E-1, +1.35600E-1, +1.35200E-1, +1.34700E-1, +1.34200E-1, +1.33600E-1, +1.33100E-1, +1.32600E-1, +1.32000E-1, +1.31500E-1, +1.30900E-1, +1.30400E-1, +1.29800E-1, +1.29200E-1, +1.28600E-1, +1.28000E-1, +1.27400E-1, +1.26800E-1, +1.26200E-1, +1.25600E-1, +1.24900E-1, +1.24300E-1, +1.23600E-1, +1.22900E-1, +1.22300E-1, +1.21600E-1, +1.20900E-1, +1.20200E-1, +1.19500E-1, +1.18700E-1, +1.18000E-1, +1.17300E-1, +1.16500E-1, +1.15800E-1, +1.15000E-1, +1.14200E-1, +1.13500E-1, +1.12700E-1, +1.11900E-1, +1.11100E-1, +1.10300E-1, +1.09400E-1, +1.08600E-1, +1.07800E-1, +1.06900E-1, +1.06000E-1, +1.05200E-1, +1.04300E-1, +1.03400E-1, +1.02500E-1, +1.01600E-1, +1.00700E-1, +9.98000E-2, +9.89000E-2, +9.79000E-2, +9.70000E-2, +9.60000E-2, +9.51000E-2, +9.41000E-2, +9.31000E-2, +9.21000E-2, +9.11000E-2, +9.01000E-2, +8.91000E-2, +8.81000E-2, +8.71000E-2, +8.60000E-2, +8.50000E-2, +8.39000E-2, +8.29000E-2, +8.18000E-2, +8.07000E-2, +7.96000E-2, +7.85000E-2, +7.74000E-2, +7.63000E-2]) # W/m-K + mu_dyn = numpy.array([+5.48000E-3, +4.68000E-3, +4.05000E-3, +3.54000E-3, +3.12000E-3, +2.78000E-3, +2.49000E-3, +2.24000E-3, +2.04000E-3, +1.86000E-3, +1.70000E-3, +1.57000E-3, +1.45000E-3, +1.34000E-3, +1.25000E-3, +1.16000E-3, +1.09000E-3, +1.02000E-3, +9.62000E-4, +9.06000E-4, +8.56000E-4, +8.10000E-4, +7.68000E-4, +7.29000E-4, +6.93000E-4, +6.60000E-4, +6.30000E-4, +6.01000E-4, +5.75000E-4, +5.51000E-4, +5.28000E-4, +5.06000E-4, +4.86000E-4, +4.67000E-4, +4.50000E-4, +4.33000E-4, +4.18000E-4, +4.03000E-4, +3.89000E-4, +3.76000E-4, +3.64000E-4, +3.52000E-4, +3.41000E-4, +3.30000E-4, +3.20000E-4, +3.10000E-4, +3.01000E-4, +2.93000E-4, +2.84000E-4, +2.77000E-4, +2.69000E-4, +2.62000E-4, +2.55000E-4, +2.48000E-4, +2.42000E-4, +2.36000E-4, +2.30000E-4, +2.25000E-4, +2.19000E-4, +2.14000E-4, +2.09000E-4, +2.04000E-4, +2.00000E-4, +1.96000E-4, +1.91000E-4, +1.87000E-4, +1.83000E-4, +1.80000E-4, +1.76000E-4, +1.72000E-4, +1.69000E-4, +1.66000E-4, +1.62000E-4, +1.59000E-4, +1.56000E-4, +1.53000E-4, +1.51000E-4, +1.48000E-4]) # Pa-s + psat = numpy.array([+5.76000E-4, +9.86000E-4, +1.65000E-3, +2.68000E-3, +4.27000E-3, +6.67000E-3, +1.02000E-2, +1.53000E-2, +2.26000E-2, +3.29000E-2, +4.71000E-2, +6.65000E-2, +9.26000E-2, +1.27000E-1, +1.73000E-1, +2.32000E-1, +3.09000E-1, +4.07000E-1, +5.30000E-1, +6.85000E-1, +8.77000E-1, +1.11000E+0, +1.40000E+0, +1.76000E+0, +2.18000E+0, +2.70000E+0, +3.31000E+0, +4.03000E+0, +4.88000E+0, +5.88000E+0, +7.05000E+0, +8.40000E+0, +9.96000E+0, +1.18000E+1, +1.38000E+1, +1.62000E+1, +1.89000E+1, +2.19000E+1, +2.53000E+1, +2.92000E+1, +3.35000E+1, +3.84000E+1, +4.37000E+1, +4.97000E+1, +5.63000E+1, +6.37000E+1, +7.17000E+1, +8.06000E+1, +9.03000E+1, +1.01000E+2, +1.13000E+2, +1.25000E+2, +1.39000E+2, +1.54000E+2, +1.70000E+2, +1.87000E+2, +2.06000E+2, +2.26000E+2, +2.48000E+2, +2.71000E+2, +2.96000E+2, +3.23000E+2, +3.51000E+2, +3.82000E+2, +4.14000E+2, +4.48000E+2, +4.85000E+2, +5.24000E+2, +5.64000E+2, +6.08000E+2, +6.54000E+2, +7.02000E+2, +7.53000E+2, +8.06000E+2, +8.62000E+2, +9.21000E+2, +9.83000E+2, +1.05000E+3])*1000. # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmin + Name = "TVP1" + Desc = "TherminolVP1" + + +class Therminol66(LiquidData): + """ + Heat transfer fluid Therminol 66 by Solutia + Source: Therminol Heat Transfer Reference Disk + """ + temp = numpy.linspace(0, 380, 30) # Celsius temperaure + def f_rho( T_C): + return -0.614254 * T_C - 0.000321 * T_C**2 + 1020.62 + def f_cp( T_C): + return 0.003313 * T_C + 0.0000008970785 * T_C**2 + 1.496005 + def f_mu( T_C): + return numpy.exp(586.375/(T_C+62.5) -2.2809 ) + def f_lam( T_C): + return -0.000033 * T_C - 0.00000015 * T_C**2 + 0.118294 + def f_psa( T_C): + return numpy.exp(-9094.51/(T_C+340) + 17.6371 ) + + T = temp + 273.15 # Kelvin + rho = f_rho(temp) # kg/m3 + c_p = f_cp(temp)*1e3 # J/kg-K + lam = f_lam(temp) # W/m-K + # Viscosity: Pa-s (dynamic = kinematic * rho) + # mm2/s /1e6 -> m2/s * kg/m3 = kg/s/m = Pa s + mu_dyn = f_mu(temp)/1e6 * rho + psat = f_psa(temp) * 1e3 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 70+273.15 + Name = "T66" + Desc = "Therminol66" + + +class Therminol72(LiquidData): + """ + Heat transfer fluid Therminol 72 by Solutia + Source: Therminol Heat Transfer Reference Disk + """ + T = numpy.array([-1.00000E+1, -5.00000E+0, +0.00000E+0, +5.00000E+0, +1.00000E+1, +1.50000E+1, +2.00000E+1, +2.50000E+1, +3.00000E+1, +3.50000E+1, +4.00000E+1, +4.50000E+1, +5.00000E+1, +5.50000E+1, +6.00000E+1, +6.50000E+1, +7.00000E+1, +7.50000E+1, +8.00000E+1, +8.50000E+1, +9.00000E+1, +9.50000E+1, +1.00000E+2, +1.05000E+2, +1.10000E+2, +1.15000E+2, +1.20000E+2, +1.25000E+2, +1.30000E+2, +1.35000E+2, +1.40000E+2, +1.45000E+2, +1.50000E+2, +1.55000E+2, +1.60000E+2, +1.65000E+2, +1.70000E+2, +1.75000E+2, +1.80000E+2, +1.85000E+2, +1.90000E+2, +1.95000E+2, +2.00000E+2, +2.05000E+2, +2.10000E+2, +2.15000E+2, +2.20000E+2, +2.25000E+2, +2.30000E+2, +2.35000E+2, +2.40000E+2, +2.45000E+2, +2.50000E+2, +2.55000E+2, +2.60000E+2, +2.65000E+2, +2.70000E+2, +2.75000E+2, +2.80000E+2, +2.85000E+2, +2.90000E+2, +2.95000E+2, +3.00000E+2, +3.05000E+2, +3.10000E+2, +3.15000E+2, +3.20000E+2, +3.25000E+2, +3.30000E+2, +3.35000E+2, +3.40000E+2, +3.45000E+2, +3.50000E+2, +3.55000E+2, +3.60000E+2, +3.65000E+2, +3.70000E+2, +3.75000E+2, +3.80000E+2])+273.15 # Kelvin + rho = numpy.array([+1.11000E+3, +1.10000E+3, +1.10000E+3, +1.09000E+3, +1.09000E+3, +1.08000E+3, +1.08000E+3, +1.07000E+3, +1.07000E+3, +1.07000E+3, +1.06000E+3, +1.06000E+3, +1.05000E+3, +1.05000E+3, +1.04000E+3, +1.04000E+3, +1.03000E+3, +1.03000E+3, +1.02000E+3, +1.02000E+3, +1.02000E+3, +1.01000E+3, +1.01000E+3, +1.00000E+3, +9.97000E+2, +9.93000E+2, +9.88000E+2, +9.84000E+2, +9.79000E+2, +9.74000E+2, +9.70000E+2, +9.65000E+2, +9.61000E+2, +9.56000E+2, +9.52000E+2, +9.47000E+2, +9.43000E+2, +9.38000E+2, +9.34000E+2, +9.29000E+2, +9.25000E+2, +9.20000E+2, +9.16000E+2, +9.11000E+2, +9.06000E+2, +9.02000E+2, +8.98000E+2, +8.93000E+2, +8.89000E+2, +8.84000E+2, +8.80000E+2, +8.75000E+2, +8.71000E+2, +8.66000E+2, +8.62000E+2, +8.57000E+2, +8.53000E+2, +8.48000E+2, +8.44000E+2, +8.39000E+2, +8.34000E+2, +8.30000E+2, +8.25000E+2, +8.21000E+2, +8.16000E+2, +8.12000E+2, +8.07000E+2, +8.03000E+2, +7.98000E+2, +7.94000E+2, +7.89000E+2, +7.85000E+2, +7.80000E+2, +7.76000E+2, +7.71000E+2, +7.66000E+2, +7.62000E+2, +7.57000E+2, +7.53000E+2]) # kg/m3 + c_p = numpy.array([+1.47100E+0, +1.48400E+0, +1.49800E+0, +1.51200E+0, +1.52500E+0, +1.53900E+0, +1.55200E+0, +1.56600E+0, +1.57900E+0, +1.59300E+0, +1.60600E+0, +1.62000E+0, +1.63400E+0, +1.64700E+0, +1.66100E+0, +1.67400E+0, +1.68800E+0, +1.70100E+0, +1.71500E+0, +1.72800E+0, +1.74200E+0, +1.75500E+0, +1.76900E+0, +1.78300E+0, +1.79600E+0, +1.81000E+0, +1.82300E+0, +1.83700E+0, +1.85000E+0, +1.86400E+0, +1.87700E+0, +1.89100E+0, +1.90500E+0, +1.91800E+0, +1.93200E+0, +1.94500E+0, +1.95900E+0, +1.97200E+0, +1.98600E+0, +1.99900E+0, +2.01300E+0, +2.02600E+0, +2.04000E+0, +2.05400E+0, +2.06700E+0, +2.08100E+0, +2.09400E+0, +2.10800E+0, +2.12100E+0, +2.13500E+0, +2.14800E+0, +2.16200E+0, +2.17600E+0, +2.18900E+0, +2.20300E+0, +2.21600E+0, +2.23000E+0, +2.24300E+0, +2.25700E+0, +2.27000E+0, +2.28400E+0, +2.29700E+0, +2.31100E+0, +2.32500E+0, +2.33800E+0, +2.35200E+0, +2.36500E+0, +2.37900E+0, +2.39200E+0, +2.40600E+0, +2.41900E+0, +2.43300E+0, +2.44600E+0, +2.46000E+0, +2.47400E+0, +2.48700E+0, +2.50100E+0, +2.51400E+0, +2.52800E+0])*1000. # J/kg-K + lam = numpy.array([+1.43200E-1, +1.42600E-1, +1.42000E-1, +1.41400E-1, +1.40800E-1, +1.40200E-1, +1.39600E-1, +1.39000E-1, +1.38400E-1, +1.37800E-1, +1.37100E-1, +1.36500E-1, +1.35900E-1, +1.35300E-1, +1.34700E-1, +1.34100E-1, +1.33500E-1, +1.32900E-1, +1.32300E-1, +1.31700E-1, +1.31100E-1, +1.30500E-1, +1.29900E-1, +1.29300E-1, +1.28700E-1, +1.28000E-1, +1.27400E-1, +1.26800E-1, +1.26200E-1, +1.25600E-1, +1.25000E-1, +1.24400E-1, +1.23800E-1, +1.23200E-1, +1.22600E-1, +1.22000E-1, +1.21400E-1, +1.20800E-1, +1.20200E-1, +1.19600E-1, +1.18900E-1, +1.18300E-1, +1.17700E-1, +1.17100E-1, +1.16500E-1, +1.15900E-1, +1.15300E-1, +1.14700E-1, +1.14100E-1, +1.13500E-1, +1.12900E-1, +1.12300E-1, +1.11700E-1, +1.11100E-1, +1.10500E-1, +1.09800E-1, +1.09200E-1, +1.08600E-1, +1.08000E-1, +1.07400E-1, +1.06800E-1, +1.06200E-1, +1.05600E-1, +1.05000E-1, +1.04400E-1, +1.03800E-1, +1.03200E-1, +1.02600E-1, +1.02000E-1, +1.01400E-1, +1.00700E-1, +1.00100E-1, +9.95000E-2, +9.89000E-2, +9.83000E-2, +9.77000E-2, +9.71000E-2, +9.65000E-2, +9.59000E-2]) # W/m-K + mu_dyn = numpy.array([+3.83000E-1, +1.19000E-1, +5.92000E-2, +3.60000E-2, +2.44000E-2, +1.77000E-2, +1.35000E-2, +1.07000E-2, +8.68000E-3, +7.21000E-3, +6.09000E-3, +5.21000E-3, +4.52000E-3, +3.96000E-3, +3.50000E-3, +3.12000E-3, +2.79000E-3, +2.52000E-3, +2.28000E-3, +2.08000E-3, +1.90000E-3, +1.75000E-3, +1.61000E-3, +1.49000E-3, +1.38000E-3, +1.29000E-3, +1.20000E-3, +1.12000E-3, +1.05000E-3, +9.86000E-4, +9.28000E-4, +8.74000E-4, +8.25000E-4, +7.79000E-4, +7.38000E-4, +6.99000E-4, +6.64000E-4, +6.31000E-4, +6.00000E-4, +5.72000E-4, +5.45000E-4, +5.20000E-4, +4.97000E-4, +4.75000E-4, +4.55000E-4, +4.36000E-4, +4.18000E-4, +4.01000E-4, +3.85000E-4, +3.70000E-4, +3.55000E-4, +3.42000E-4, +3.29000E-4, +3.17000E-4, +3.05000E-4, +2.95000E-4, +2.84000E-4, +2.74000E-4, +2.65000E-4, +2.56000E-4, +2.47000E-4, +2.39000E-4, +2.31000E-4, +2.24000E-4, +2.17000E-4, +2.10000E-4, +2.03000E-4, +1.97000E-4, +1.91000E-4, +1.85000E-4, +1.80000E-4, +1.75000E-4, +1.69000E-4, +1.65000E-4, +1.60000E-4, +1.55000E-4, +1.51000E-4, +1.47000E-4, +1.43000E-4]) # Pa-s + psat = numpy.array([+9.60000E-1, +1.05000E+0, +1.14000E+0, +1.24000E+0, +1.35000E+0, +1.47000E+0, +1.60000E+0, +1.74000E+0, +1.89000E+0, +2.06000E+0, +2.24000E+0, +2.44000E+0, +2.65000E+0, +2.88000E+0, +3.14000E+0, +3.41000E+0, +3.71000E+0, +4.03000E+0, +4.39000E+0, +4.77000E+0, +5.18000E+0, +5.63000E+0, +6.12000E+0, +6.66000E+0, +7.23000E+0, +7.86000E+0, +8.54000E+0, +9.27000E+0, +1.01000E+1, +1.10000E+1, +1.19000E+1, +1.29000E+1, +1.40000E+1, +1.52000E+1, +1.65000E+1, +1.80000E+1, +1.95000E+1, +2.12000E+1, +2.30000E+1, +2.49000E+1, +2.71000E+1, +2.94000E+1, +3.19000E+1, +3.46000E+1, +3.75000E+1, +4.07000E+1, +4.42000E+1, +4.79000E+1, +5.20000E+1, +5.64000E+1, +6.11000E+1, +6.63000E+1, +7.19000E+1, +7.79000E+1, +8.45000E+1, +9.15000E+1, +9.92000E+1, +1.08000E+2, +1.17000E+2, +1.26000E+2, +1.37000E+2, +1.48000E+2, +1.61000E+2, +1.74000E+2, +1.89000E+2, +2.04000E+2, +2.21000E+2, +2.40000E+2, +2.60000E+2, +2.81000E+2, +3.04000E+2, +3.30000E+2, +3.57000E+2, +3.86000E+2, +4.18000E+2, +4.53000E+2, +4.90000E+2, +5.30000E+2, +5.74000E+2])*1000. # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmin + Name = "T72" + Desc = "Therminol72" + + + +class DowthermJ(LiquidData): + """ + Heat transfer fluid Dowtherm J by Dow Chemicals + Source: Dow Chemicals data sheet + """ + T = numpy.array([-8.00000E+1, -7.00000E+1, -6.00000E+1, -5.00000E+1, -4.00000E+1, -3.00000E+1, -2.00000E+1, -1.00000E+1, +0.00000E+0, +1.00000E+1, +2.00000E+1, +3.00000E+1, +4.00000E+1, +5.00000E+1, +6.00000E+1, +7.00000E+1, +8.00000E+1, +9.00000E+1, +1.00000E+2, +1.10000E+2, +1.20000E+2, +1.30000E+2, +1.40000E+2, +1.50000E+2, +1.60000E+2, +1.70000E+2, +1.80000E+2, +1.81300E+2, +1.90000E+2, +2.00000E+2, +2.10000E+2, +2.20000E+2, +2.30000E+2, +2.40000E+2, +2.50000E+2, +2.60000E+2, +2.70000E+2, +2.80000E+2, +2.90000E+2, +3.00000E+2, +3.10000E+2, +3.20000E+2, +3.30000E+2, +3.40000E+2, +3.45000E+2])+273.15 # Kelvin + rho = numpy.array([+9.31300E+2, +9.27900E+2, +9.21000E+2, +9.14100E+2, +9.07100E+2, +9.00000E+2, +8.92900E+2, +8.85700E+2, +8.78500E+2, +8.71100E+2, +8.63700E+2, +8.56200E+2, +8.48700E+2, +8.41000E+2, +8.33200E+2, +8.25400E+2, +8.17400E+2, +8.09400E+2, +8.01200E+2, +7.92900E+2, +7.84400E+2, +7.75900E+2, +7.67100E+2, +7.58300E+2, +7.49200E+2, +7.40000E+2, +7.30600E+2, +7.29300E+2, +7.20900E+2, +7.11000E+2, +7.00900E+2, +6.90500E+2, +6.79800E+2, +6.68800E+2, +6.57300E+2, +6.45500E+2, +6.33100E+2, +6.20200E+2, +6.06600E+2, +5.92200E+2, +5.76900E+2, +5.60400E+2, +5.42400E+2, +5.22400E+2, +5.11400E+2]) # kg/m3 + c_p = numpy.array([+1.58400E+0, +1.59400E+0, +1.61600E+0, +1.63900E+0, +1.66300E+0, +1.68800E+0, +1.71400E+0, +1.74100E+0, +1.76900E+0, +1.79800E+0, +1.82800E+0, +1.85900E+0, +1.89000E+0, +1.92300E+0, +1.95500E+0, +1.98900E+0, +2.02300E+0, +2.05800E+0, +2.09300E+0, +2.12900E+0, +2.16500E+0, +2.20200E+0, +2.23900E+0, +2.27700E+0, +2.31500E+0, +2.35300E+0, +2.39200E+0, +2.39700E+0, +2.43200E+0, +2.47200E+0, +2.51200E+0, +2.55300E+0, +2.59400E+0, +2.63600E+0, +2.68000E+0, +2.72400E+0, +2.76900E+0, +2.81600E+0, +2.86600E+0, +2.91900E+0, +2.97600E+0, +3.04000E+0, +3.11500E+0, +3.20800E+0, +3.26500E+0])*1000. # J/kg-K + lam = numpy.array([+1.48500E-1, +1.47500E-1, +1.45300E-1, +1.43200E-1, +1.41100E-1, +1.39000E-1, +1.36800E-1, +1.34700E-1, +1.32600E-1, +1.30500E-1, +1.28400E-1, +1.26200E-1, +1.24100E-1, +1.22000E-1, +1.19900E-1, +1.17700E-1, +1.15600E-1, +1.13500E-1, +1.11400E-1, +1.09300E-1, +1.07100E-1, +1.05000E-1, +1.02900E-1, +1.00800E-1, +9.87000E-2, +9.65000E-2, +9.44000E-2, +9.41000E-2, +9.23000E-2, +9.02000E-2, +8.80000E-2, +8.59000E-2, +8.38000E-2, +8.17000E-2, +7.96000E-2, +7.74000E-2, +7.53000E-2, +7.32000E-2, +7.11000E-2, +6.90000E-2, +6.68000E-2, +6.47000E-2, +6.26000E-2, +6.05000E-2, +5.94000E-2]) # W/m-K + mu_dyn = numpy.array([+8.43000E+0, +7.11000E+0, +5.12000E+0, +3.78000E+0, +2.88000E+0, +2.25000E+0, +1.80000E+0, +1.48000E+0, +1.23000E+0, +1.05000E+0, +9.10000E-1, +7.90000E-1, +7.00000E-1, +6.30000E-1, +5.60000E-1, +5.10000E-1, +4.70000E-1, +4.30000E-1, +4.00000E-1, +3.70000E-1, +3.50000E-1, +3.30000E-1, +3.10000E-1, +2.90000E-1, +2.80000E-1, +2.70000E-1, +2.50000E-1, +2.50000E-1, +2.40000E-1, +2.30000E-1, +2.30000E-1, +2.20000E-1, +2.10000E-1, +2.00000E-1, +2.00000E-1, +1.90000E-1, +1.80000E-1, +1.80000E-1, +1.70000E-1, +1.70000E-1, +1.70000E-1, +1.60000E-1, +1.60000E-1, +1.60000E-1, +1.50000E-1])/1000. # Pa-s + psat = numpy.array([+0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +5.00000E-3, +1.00000E-2, +2.00000E-2, +3.00000E-2, +5.00000E-2, +8.00000E-2, +1.10000E-1, +1.60000E-1, +2.30000E-1, +3.20000E-1, +4.30000E-1, +5.80000E-1, +7.60000E-1, +9.80000E-1, +1.01000E+0, +1.25000E+0, +1.58000E+0, +1.97000E+0, +2.43000E+0, +2.96000E+0, +3.59000E+0, +4.30000E+0, +5.13000E+0, +6.06000E+0, +7.12000E+0, +8.31000E+0, +9.64000E+0, +1.11300E+1, +1.27900E+1, +1.46400E+1, +1.66900E+1, +1.78000E+1])*1e5 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 50 + 273.15 + Name = "DowJ" + Desc = "DowthermJ" + +class DowthermQ(LiquidData): + """ + Heat transfer fluid Dowtherm Q by Dow Chemicals + Source: Dow Chemicals data sheet + """ + T = numpy.array([-3.50000E+1, -3.00000E+1, -2.00000E+1, -1.00000E+1, +0.00000E+0, +1.00000E+1, +2.00000E+1, +3.00000E+1, +4.00000E+1, +5.00000E+1, +6.00000E+1, +7.00000E+1, +8.00000E+1, +9.00000E+1, +1.00000E+2, +1.10000E+2, +1.20000E+2, +1.30000E+2, +1.40000E+2, +1.50000E+2, +1.60000E+2, +1.70000E+2, +1.80000E+2, +1.90000E+2, +2.00000E+2, +2.10000E+2, +2.20000E+2, +2.30000E+2, +2.40000E+2, +2.50000E+2, +2.60000E+2, +2.70000E+2, +2.80000E+2, +2.90000E+2, +3.00000E+2, +3.10000E+2, +3.20000E+2, +3.30000E+2, +3.40000E+2, +3.50000E+2, +3.60000E+2])+273.15 # Kelvin + rho = numpy.array([+1.01140E+3, +1.00320E+3, +9.95600E+2, +9.88000E+2, +9.80500E+2, +9.72900E+2, +9.65400E+2, +9.57800E+2, +9.50200E+2, +9.42700E+2, +9.35100E+2, +9.27600E+2, +9.20000E+2, +9.12400E+2, +9.04900E+2, +8.97300E+2, +8.89800E+2, +8.82200E+2, +8.74600E+2, +8.67100E+2, +8.59500E+2, +8.52000E+2, +8.44400E+2, +8.36800E+2, +8.29300E+2, +8.21700E+2, +8.14200E+2, +8.06600E+2, +7.99000E+2, +7.91500E+2, +7.83900E+2, +7.76400E+2, +7.68800E+2, +7.61200E+2, +7.53700E+2, +7.46100E+2, +7.38600E+2, +7.31000E+2, +7.23400E+2, +7.15900E+2, +7.08300E+2]) # kg/m3 + c_p = numpy.array([+1.47800E+0, +1.49200E+0, +1.52500E+0, +1.55700E+0, +1.58900E+0, +1.62100E+0, +1.65300E+0, +1.68500E+0, +1.71600E+0, +1.74800E+0, +1.77900E+0, +1.81100E+0, +1.84200E+0, +1.87300E+0, +1.90400E+0, +1.93500E+0, +1.96600E+0, +1.99700E+0, +2.02700E+0, +2.05800E+0, +2.08800E+0, +2.11800E+0, +2.14800E+0, +2.17800E+0, +2.20800E+0, +2.23800E+0, +2.26800E+0, +2.29700E+0, +2.32700E+0, +2.35600E+0, +2.38600E+0, +2.41500E+0, +2.44400E+0, +2.47300E+0, +2.50200E+0, +2.53000E+0, +2.55900E+0, +2.58700E+0, +2.61600E+0, +2.64400E+0, +2.67200E+0])*1000. # J/kg-K + lam = numpy.array([+1.28000E-1, +1.27700E-1, +1.26600E-1, +1.25500E-1, +1.24400E-1, +1.23200E-1, +1.22000E-1, +1.20800E-1, +1.19500E-1, +1.18300E-1, +1.17000E-1, +1.15600E-1, +1.14300E-1, +1.12900E-1, +1.11500E-1, +1.10100E-1, +1.08700E-1, +1.07200E-1, +1.05800E-1, +1.04300E-1, +1.02800E-1, +1.01300E-1, +9.98000E-2, +9.82000E-2, +9.67000E-2, +9.52000E-2, +9.36000E-2, +9.21000E-2, +9.05000E-2, +8.89000E-2, +8.74000E-2, +8.58000E-2, +8.43000E-2, +8.27000E-2, +8.11000E-2, +7.96000E-2, +7.80000E-2, +7.65000E-2, +7.49000E-2, +7.34000E-2, +7.19000E-2]) # W/m-K + mu_dyn = numpy.array([+4.66000E+1, +2.42000E+1, +1.61000E+1, +1.09000E+1, +7.56000E+0, +5.42000E+0, +4.00000E+0, +3.04000E+0, +2.37000E+0, +1.89000E+0, +1.54000E+0, +1.28000E+0, +1.07000E+0, +9.20000E-1, +8.00000E-1, +7.00000E-1, +6.20000E-1, +5.50000E-1, +5.00000E-1, +4.50000E-1, +4.10000E-1, +3.80000E-1, +3.50000E-1, +3.30000E-1, +3.10000E-1, +2.90000E-1, +2.70000E-1, +2.60000E-1, +2.40000E-1, +2.30000E-1, +2.20000E-1, +2.10000E-1, +2.00000E-1, +1.90000E-1, +1.90000E-1, +1.80000E-1, +1.70000E-1, +1.70000E-1, +1.60000E-1, +1.60000E-1, +1.50000E-1])/1000. # Pa-s + psat = numpy.array([+0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +5.00000E-3, +1.00000E-2, +2.00000E-2, +3.00000E-2, +5.00000E-2, +7.00000E-2, +9.00000E-2, +1.30000E-1, +1.70000E-1, +2.30000E-1, +3.10000E-1, +4.00000E-1, +5.10000E-1, +6.40000E-1, +8.10000E-1, +1.00000E+0, +1.24000E+0, +1.51000E+0, +1.82000E+0, +2.19000E+0, +2.61000E+0, +3.09000E+0, +3.64000E+0, +4.25000E+0, +4.95000E+0])*1e5 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 120 + 273.15 + Name = "DowQ" + Desc = "DowthermQ" + + +class Texatherm22(LiquidData): + """ + Heat transfer fluid Texatherm 22 by Texaco + Source: Texaco data sheet + """ + T = numpy.array([+0.00000E+0, +4.00000E+1, +5.00000E+1, +1.00000E+2, +1.50000E+2, +2.00000E+2, +2.50000E+2, +3.00000E+2, +3.50000E+2])+273.15 # Kelvin + rho = numpy.array([+8.74500E+2, +8.47300E+2, +8.42500E+2, +8.10500E+2, +7.76300E+2, +7.41600E+2, +7.03200E+2, +6.68000E+2, +6.21500E+2]) # kg/m3 + c_p = numpy.array([+1.81000E+0, +1.95000E+0, +1.99000E+0, +2.18000E+0, +2.36000E+0, +2.54000E+0, +2.72000E+0, +2.90000E+0, +3.08000E+0])*1e3 # J/kg-K + lam = numpy.array([+1.35000E-1, +1.32000E-1, +1.32000E-1, +1.28000E-1, +1.25000E-1, +1.21000E-1, +1.17100E-1, +1.13000E-1, +1.10000E-1]) # W/m-K + mu_dyn = numpy.array([+4.19760E+2, +0.00000E+0, +2.31688E+1, +0.00000E+0, +2.09601E+0, +1.26072E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0])/1000. # Pa-s + psat = numpy.array([+0.00000E+0, +5.3300E-10, +4.00000E-8, +2.67000E-7, +2.27000E-5, +4.67000E-4, +6.67000E-3, +2.13000E-2, +5.33000E-2])*1e5 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 40 + 273.15 + Name = "TX22" + Desc = "Texatherm22" + + +class NitrateSalt(LiquidData): + """ + Heat transfer fluid based on 60% NaNO3 and 40% KNO3 + Source: Solar Power Tower Design Basis Document, Alexis B. Zavoico, Sandia Labs, USA + """ + temp = numpy.linspace(300, 600, 25) # Celsius temperaure + def f_rho( T_C): + return 2090 - 0.636 * T_C + def f_cp( T_C): + return 1443 + 0.172 * T_C + def f_mu( T_C): + return 22.714 - 0.120 * T_C + 2.281 * 1e-4 * T_C*T_C - 1.474 * 1e-7 * T_C*T_C*T_C + def f_lam( T_C): + return 0.443 + 1.9e-4 * T_C + + T = temp + 273.15 # Kelvin + rho = f_rho(temp) # kg/m3 + c_p = f_cp(temp) # J/kg-K + lam = f_lam(temp) # W/m-K + mu_dyn = f_mu(temp)/1e3 # Pa-s + psat = temp * 0 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "NaK" + Desc = "NitrateSalt" + + +class SylthermXLT(LiquidData): + """ + Heat transfer fluid Syltherm XLT by Dow Chemicals + Source: Dow Chemicals data sheet + """ + T = numpy.array([-1.00000E+2, -9.50000E+1, -9.00000E+1, -8.50000E+1, -8.00000E+1, -7.50000E+1, -7.00000E+1, -6.50000E+1, -6.00000E+1, -5.50000E+1, -5.00000E+1, -4.50000E+1, -4.00000E+1, -3.50000E+1, -3.00000E+1, -2.50000E+1, -2.00000E+1, -1.50000E+1, -1.00000E+1, -5.00000E+0, +0.00000E+0, +5.00000E+0, +1.00000E+1, +1.50000E+1, +2.00000E+1, +2.50000E+1, +3.00000E+1, +3.50000E+1, +4.00000E+1, +4.50000E+1, +5.00000E+1, +5.50000E+1, +6.00000E+1, +6.50000E+1, +7.00000E+1, +7.50000E+1, +8.00000E+1, +8.50000E+1, +9.00000E+1, +9.50000E+1, +1.00000E+2, +1.05000E+2, +1.10000E+2, +1.15000E+2, +1.20000E+2, +1.25000E+2, +1.30000E+2, +1.35000E+2, +1.40000E+2, +1.45000E+2, +1.50000E+2, +1.55000E+2, +1.60000E+2, +1.65000E+2, +1.70000E+2, +1.75000E+2, +1.80000E+2, +1.85000E+2, +1.90000E+2, +1.95000E+2, +2.00000E+2, +2.05000E+2, +2.10000E+2, +2.15000E+2, +2.20000E+2, +2.25000E+2, +2.30000E+2, +2.35000E+2, +2.40000E+2, +2.45000E+2, +2.50000E+2, +2.55000E+2, +2.60000E+2])+273.15 # Kelvin + rho = numpy.array([+9.78500E+2, +9.73400E+2, +9.68300E+2, +9.63100E+2, +9.58000E+2, +9.52900E+2, +9.47700E+2, +9.42600E+2, +9.37500E+2, +9.32300E+2, +9.27200E+2, +9.22000E+2, +9.16900E+2, +9.11800E+2, +9.06600E+2, +9.01500E+2, +8.96400E+2, +8.91200E+2, +8.86100E+2, +8.81000E+2, +8.75800E+2, +8.70700E+2, +8.65500E+2, +8.60400E+2, +8.55300E+2, +8.50100E+2, +8.45000E+2, +8.39900E+2, +8.34700E+2, +8.29600E+2, +8.24500E+2, +8.19300E+2, +8.14200E+2, +8.09100E+2, +8.03900E+2, +7.98800E+2, +7.93600E+2, +7.88500E+2, +7.83400E+2, +7.78200E+2, +7.73100E+2, +7.68000E+2, +7.62800E+2, +7.57700E+2, +7.52600E+2, +7.47400E+2, +7.42300E+2, +7.37200E+2, +7.32000E+2, +7.26900E+2, +7.21700E+2, +7.16600E+2, +7.11500E+2, +7.06300E+2, +7.01200E+2, +6.96100E+2, +6.90900E+2, +6.85800E+2, +6.80700E+2, +6.75500E+2, +6.70400E+2, +6.65300E+2, +6.60100E+2, +6.55000E+2, +6.49800E+2, +6.44700E+2, +6.39600E+2, +6.34400E+2, +6.29300E+2, +6.24200E+2, +6.19000E+2, +6.13900E+2, +6.08800E+2]) # kg/m3 + c_p = numpy.array([+1.52000E+0, +1.53000E+0, +1.54100E+0, +1.55100E+0, +1.56200E+0, +1.57200E+0, +1.58300E+0, +1.59300E+0, +1.60400E+0, +1.61400E+0, +1.62500E+0, +1.63500E+0, +1.64600E+0, +1.65600E+0, +1.66700E+0, +1.67700E+0, +1.68800E+0, +1.69800E+0, +1.70900E+0, +1.71900E+0, +1.73000E+0, +1.74000E+0, +1.75100E+0, +1.76100E+0, +1.77200E+0, +1.78200E+0, +1.79300E+0, +1.80300E+0, +1.81400E+0, +1.82400E+0, +1.83500E+0, +1.84500E+0, +1.85600E+0, +1.86600E+0, +1.87700E+0, +1.88700E+0, +1.89800E+0, +1.90800E+0, +1.91900E+0, +1.92900E+0, +1.94000E+0, +1.95000E+0, +1.96100E+0, +1.97100E+0, +1.98200E+0, +1.99200E+0, +2.00300E+0, +2.01300E+0, +2.02400E+0, +2.03400E+0, +2.04500E+0, +2.05500E+0, +2.06600E+0, +2.07600E+0, +2.08700E+0, +2.09700E+0, +2.10800E+0, +2.11800E+0, +2.12900E+0, +2.13900E+0, +2.15000E+0, +2.16000E+0, +2.17100E+0, +2.18100E+0, +2.19200E+0, +2.20200E+0, +2.21300E+0, +2.22300E+0, +2.23400E+0, +2.24400E+0, +2.25500E+0, +2.26500E+0, +2.27600E+0])*1e3 # J/kg-K + lam = numpy.array([+1.34100E-1, +1.33200E-1, +1.32400E-1, +1.31500E-1, +1.30600E-1, +1.29700E-1, +1.28800E-1, +1.27900E-1, +1.26900E-1, +1.26000E-1, +1.25000E-1, +1.24100E-1, +1.23100E-1, +1.22100E-1, +1.21100E-1, +1.20100E-1, +1.19100E-1, +1.18100E-1, +1.17100E-1, +1.16100E-1, +1.15000E-1, +1.14000E-1, +1.12900E-1, +1.11900E-1, +1.10800E-1, +1.09700E-1, +1.08600E-1, +1.07500E-1, +1.06400E-1, +1.05300E-1, +1.04200E-1, +1.03000E-1, +1.01900E-1, +1.00800E-1, +9.96000E-2, +9.84400E-2, +9.72800E-2, +9.61000E-2, +9.49200E-2, +9.37300E-2, +9.25300E-2, +9.13300E-2, +9.01200E-2, +8.89100E-2, +8.76800E-2, +8.64500E-2, +8.52200E-2, +8.39800E-2, +8.27300E-2, +8.14700E-2, +8.02100E-2, +7.89500E-2, +7.76700E-2, +7.64000E-2, +7.51100E-2, +7.38200E-2, +7.25300E-2, +7.12300E-2, +6.99200E-2, +6.86100E-2, +6.72900E-2, +6.59700E-2, +6.46500E-2, +6.33100E-2, +6.19800E-2, +6.06400E-2, +5.92900E-2, +5.79400E-2, +5.65800E-2, +5.52300E-2, +5.38600E-2, +5.24900E-2, +5.11200E-2]) # W/m-K + mu_dyn = numpy.array([+7.86100E+1, +5.01300E+1, +3.48600E+1, +2.58300E+1, +2.00400E+1, +1.60800E+1, +1.32200E+1, +1.10500E+1, +9.35600E+0, +7.99400E+0, +6.87900E+0, +5.95600E+0, +5.18400E+0, +4.53500E+0, +3.98600E+0, +3.52100E+0, +3.12600E+0, +2.78800E+0, +2.49900E+0, +2.25000E+0, +2.03500E+0, +1.84900E+0, +1.68700E+0, +1.54500E+0, +1.41900E+0, +1.30900E+0, +1.21000E+0, +1.12200E+0, +1.04300E+0, +9.72000E-1, +9.08000E-1, +8.49000E-1, +7.96000E-1, +7.48000E-1, +7.05000E-1, +6.65000E-1, +6.28000E-1, +5.95000E-1, +5.64000E-1, +5.36000E-1, +5.11000E-1, +4.87000E-1, +4.65000E-1, +4.45000E-1, +4.26000E-1, +4.09000E-1, +3.93000E-1, +3.77000E-1, +3.63000E-1, +3.50000E-1, +3.37000E-1, +3.25000E-1, +3.14000E-1, +3.03000E-1, +2.93000E-1, +2.84000E-1, +2.75000E-1, +2.66000E-1, +2.58000E-1, +2.51000E-1, +2.44000E-1, +2.38000E-1, +2.32000E-1, +2.26000E-1, +2.20000E-1, +2.15000E-1, +2.09000E-1, +2.04000E-1, +1.99000E-1, +1.94000E-1, +1.89000E-1, +1.85000E-1, +1.82000E-1])/1000. # Pa-s + psat = numpy.array([+0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0])*1e5 # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "XLT" + Desc = "SylthermXLT" + + +class HC50(LiquidData): + """ + Heat transfer fluid Dynalene HC-50 + Source: Dynalene + """ + T = numpy.array([+2.23150E+2,+2.33150E+2,+2.43150E+2,+2.53150E+2,+2.63150E+2,+2.73150E+2,+2.83150E+2,+2.93150E+2,+3.03150E+2,+3.13150E+2,+3.23150E+2,+3.33150E+2,+3.43150E+2,+3.53150E+2,+3.63150E+2,+3.73150E+2,+3.83150E+2,+3.93150E+2,+4.03150E+2,+4.13150E+2,+4.23150E+2,+4.33150E+2,+4.43150E+2,+4.53150E+2,+4.63150E+2,+4.73150E+2,+4.83150E+2]) # Kelvin + rho = numpy.array([+1.37800E+3,+1.37300E+3,+1.36700E+3,+1.36200E+3,+1.35600E+3,+1.35100E+3,+1.34500E+3,+1.34000E+3,+1.33400E+3,+1.32800E+3,+1.32300E+3,+1.31700E+3,+1.31200E+3,+1.30600E+3,+1.30100E+3,+1.29500E+3,+1.29000E+3,+1.28400E+3,+1.27900E+3,+1.27300E+3,+1.26700E+3,+1.26200E+3,+1.25600E+3,+1.25100E+3,+1.24500E+3,+1.24000E+3,+1.23400E+3]) # kg/m3 + c_p = numpy.array([+2.56300E+3,+2.58300E+3,+2.60200E+3,+2.62200E+3,+2.64200E+3,+2.66100E+3,+2.68100E+3,+2.70100E+3,+2.72000E+3,+2.74000E+3,+2.76000E+3,+2.78000E+3,+2.79900E+3,+2.81900E+3,+2.83900E+3,+2.85800E+3,+2.87800E+3,+2.89800E+3,+2.91700E+3,+2.93700E+3,+2.95700E+3,+2.97700E+3,+2.99600E+3,+3.01600E+3,+3.03600E+3,+3.05500E+3,+3.07500E+3]) # J/kg-K + lam = numpy.array([+4.35000E+2,+4.45000E+2,+4.55000E+2,+4.65000E+2,+4.75000E+2,+4.85000E+2,+4.95000E+2,+5.05000E+2,+5.15000E+2,+5.25000E+2,+5.35000E+2,+5.45000E+2,+5.55000E+2,+5.65000E+2,+5.75000E+2,+5.85000E+2,+5.95000E+2,+6.05000E+2,+6.15000E+2,+6.25000E+2,+6.35000E+2,+6.45000E+2,+6.55000E+2,+6.65000E+2,+6.75000E+2,+6.85000E+2,+6.94500E+2])/1e3 # W/m-K + mu_dyn = numpy.array([+3.84000E-2,+2.04000E-2,+1.25000E-2,+8.40000E-3,+5.99000E-3,+4.70000E-3,+3.80000E-3,+3.20000E-3,+2.70000E-3,+2.40000E-3,+2.40000E-3,+1.80000E-3,+1.60000E-3,+1.50000E-3,+1.30000E-3,+1.20000E-3,+1.10000E-3,+1.00000E-3,+9.40000E-4,+8.70000E-4,+8.10000E-4,+7.60000E-4,+7.10000E-4,+6.60000E-4,+6.20000E-4,+5.80000E-4,+5.50000E-4]) # Pa-s + psat = numpy.array([+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+1.58579E+3,+1.93053E+3,+3.10264E+3,+5.58475E+3,+9.85950E+3,+1.64785E+4,+2.60622E+4,+3.93691E+4,+5.72954E+4,+8.06687E+4,+1.11695E+5,+1.50995E+5,+2.00637E+5,+2.63380E+5,+3.41290E+5,+4.36438E+5,+5.53649E+5,+6.95681E+5,+8.67360E+5,+1.07282E+6]) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 20+273.15 + Name = "HC50" + Desc = "Dynalene "+Name + + +class HC40(LiquidData): + """ + Heat transfer fluid Dynalene HC-40 + Source: Dynalene + """ + T = numpy.array([+2.33150E+2,+2.43150E+2,+2.53150E+2,+2.63150E+2,+2.73150E+2,+2.83150E+2,+2.93150E+2,+3.03150E+2,+3.13150E+2,+3.23150E+2,+3.33150E+2,+3.43150E+2,+3.53150E+2,+3.63150E+2,+3.73150E+2,+3.83150E+2,+3.93150E+2,+4.03150E+2,+4.13150E+2,+4.23150E+2,+4.33150E+2,+4.38150E+2,+4.43150E+2,+4.53150E+2,+4.63150E+2,+4.73150E+2]) # Kelvin + rho = numpy.array([+1.34800E+3,+1.34300E+3,+1.33700E+3,+1.33200E+3,+1.32600E+3,+1.32100E+3,+1.31500E+3,+1.30900E+3,+1.30400E+3,+1.29800E+3,+1.29300E+3,+1.28700E+3,+1.28100E+3,+1.27600E+3,+1.27000E+3,+1.26500E+3,+1.25900E+3,+1.25300E+3,+1.24800E+3,+1.24200E+3,+1.23700E+3,+1.23400E+3,+1.23100E+3,+1.22500E+3,+1.22000E+3,+1.21400E+3]) # kg/m3 + c_p = numpy.array([+2.80000E+3,+2.82000E+3,+2.84000E+3,+2.87000E+3,+2.89000E+3,+2.91000E+3,+2.93000E+3,+2.96000E+3,+2.98000E+3,+3.00000E+3,+3.03000E+3,+3.05000E+3,+3.07000E+3,+3.09000E+3,+3.12000E+3,+3.14000E+3,+3.16000E+3,+3.19000E+3,+3.21000E+3,+3.23000E+3,+3.25000E+3,+3.27000E+3,+3.28000E+3,+3.30000E+3,+3.32000E+3,+3.35000E+3]) # J/kg-K + lam = numpy.array([+4.49000E+2,+4.59000E+2,+4.69000E+2,+4.79000E+2,+4.89000E+2,+4.99000E+2,+5.09000E+2,+5.19000E+2,+5.29000E+2,+5.39000E+2,+5.49000E+2,+5.59000E+2,+5.69000E+2,+5.79000E+2,+5.89000E+2,+5.99000E+2,+6.09000E+2,+6.19000E+2,+6.29000E+2,+6.39000E+2,+6.49000E+2,+6.54000E+2,+6.59000E+2,+6.69000E+2,+6.79000E+2,+6.89000E+2])/1e3 # W/m-K + mu_dyn = numpy.array([+1.49000E-2,+9.20000E-3,+6.50000E-3,+4.90000E-3,+3.90000E-3,+3.20000E-3,+2.70000E-3,+2.30000E-3,+1.96000E-3,+1.70000E-3,+1.50000E-3,+1.40000E-3,+1.20000E-3,+1.10000E-3,+9.90000E-4,+9.10000E-4,+8.30000E-4,+7.70000E-4,+7.10000E-4,+6.60000E-4,+6.10000E-4,+5.90000E-4,+5.70000E-4,+5.30000E-4,+5.00000E-4,+4.70000E-4]) # Pa-s + psat = numpy.array([+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+1.51685E+3,+2.20632E+3,+3.79212E+3,+6.68791E+3,+1.15142E+4,+1.87537E+4,+2.92338E+4,+4.37817E+4,+6.35007E+4,+8.96318E+4,+1.23416E+5,+1.66853E+5,+2.22701E+5,+2.92338E+5,+3.79212E+5,+4.85391E+5,+6.16391E+5,+7.74971E+5,+9.65955E+5,+1.19417E+6]) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 20+273.15 + Name = "HC40" + Desc = "Dynalene "+Name + + +class HC30(LiquidData): + """ + Heat transfer fluid Dynalene HC-30 + Source: Dynalene + """ + T = numpy.array([+2.43150E+2,+2.53150E+2,+2.63150E+2,+2.73150E+2,+2.83150E+2,+2.93150E+2,+3.03150E+2,+3.13150E+2,+3.23150E+2,+3.33150E+2,+3.43150E+2,+3.53150E+2,+3.63150E+2,+3.73150E+2,+3.83150E+2,+3.93150E+2,+4.03150E+2,+4.13150E+2,+4.23150E+2,+4.33150E+2,+4.43150E+2,+4.53150E+2,+4.63150E+2,+4.73150E+2,+4.83150E+2]) # Kelvin + rho = numpy.array([+1.30000E+3,+1.29500E+3,+1.29000E+3,+1.28500E+3,+1.28000E+3,+1.27500E+3,+1.27000E+3,+1.26500E+3,+1.26000E+3,+1.25500E+3,+1.25000E+3,+1.24400E+3,+1.23900E+3,+1.23400E+3,+1.22900E+3,+1.22400E+3,+1.21900E+3,+1.21400E+3,+1.20900E+3,+1.20400E+3,+1.19900E+3,+1.19300E+3,+1.18800E+3,+1.18300E+3,+1.17800E+3]) # kg/m3 + c_p = numpy.array([+2.96100E+3,+2.98400E+3,+3.00700E+3,+3.03100E+3,+3.05400E+3,+3.07700E+3,+3.10000E+3,+3.12300E+3,+3.14600E+3,+3.16900E+3,+3.19200E+3,+3.21500E+3,+3.23800E+3,+3.26200E+3,+3.28500E+3,+3.30800E+3,+3.33100E+3,+3.35400E+3,+3.37700E+3,+3.40000E+3,+3.42300E+3,+3.44600E+3,+3.46900E+3,+3.49300E+3,+3.51600E+3]) # J/kg-K + lam = numpy.array([+4.69000E+2,+4.79000E+2,+4.89000E+2,+4.99000E+2,+5.09000E+2,+5.19000E+2,+5.29000E+2,+5.39000E+2,+5.49000E+2,+5.59000E+2,+5.69000E+2,+5.79000E+2,+5.89000E+2,+5.99000E+2,+6.09000E+2,+6.19000E+2,+6.29000E+2,+6.39000E+2,+6.49000E+2,+6.59000E+2,+6.69000E+2,+6.79000E+2,+6.89000E+2,+6.99000E+2,+7.09000E+2])/1e3 # W/m-K + mu_dyn = numpy.array([+7.00000E-3,+5.50000E-3,+4.50000E-3,+3.70000E-3,+3.00000E-3,+2.50000E-3,+2.20000E-3,+1.90000E-3,+1.60000E-3,+1.40000E-3,+1.30000E-3,+1.10000E-3,+9.90000E-4,+8.90000E-4,+8.00000E-4,+7.30000E-4,+6.70000E-4,+6.10000E-4,+5.70000E-4,+5.20000E-4,+4.80000E-4,+4.50000E-4,+4.20000E-4,+3.90000E-4,+3.70000E-4]) # Pa-s + psat = numpy.array([+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+1.79264E+3,+2.41317E+3,+3.99896E+3,+7.17055E+3,+1.24795E+4,+2.06153E+4,+3.23364E+4,+4.86770E+4,+7.10160E+4,+9.99740E+4,+1.37895E+5,+1.86158E+5,+2.47522E+5,+3.24743E+5,+4.20580E+5,+5.39170E+5,+6.83960E+5,+8.59087E+5,+1.07145E+6,+1.32517E+6]) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 20+273.15 + Name = "HC30" + Desc = "Dynalene "+Name + + +class HC20(LiquidData): + """ + Heat transfer fluid Dynalene HC-20 + Source: Dynalene + """ + T = numpy.array([+2.53150E+2,+2.63150E+2,+2.73150E+2,+2.83150E+2,+2.93150E+2,+3.03150E+2,+3.13150E+2,+3.23150E+2,+3.33150E+2,+3.43150E+2,+3.53150E+2,+3.63150E+2,+3.73150E+2,+3.83150E+2,+3.93150E+2,+4.03150E+2,+4.13150E+2,+4.23150E+2,+4.33150E+2,+4.43150E+2,+4.53150E+2,+4.63150E+2,+4.73150E+2,+4.83150E+2]) # Kelvin + rho = numpy.array([+1.25800E+3,+1.25300E+3,+1.24800E+3,+1.24200E+3,+1.23700E+3,+1.23200E+3,+1.22700E+3,+1.22200E+3,+1.21600E+3,+1.21100E+3,+1.20600E+3,+1.20100E+3,+1.19600E+3,+1.19100E+3,+1.18500E+3,+1.18000E+3,+1.17500E+3,+1.17000E+3,+1.16500E+3,+1.15900E+3,+1.15400E+3,+1.14900E+3,+1.14400E+3,+1.13900E+3]) # kg/m3 + c_p = numpy.array([+3.11700E+3,+3.14100E+3,+3.16400E+3,+3.18800E+3,+3.21200E+3,+3.23500E+3,+3.25900E+3,+3.28200E+3,+3.30600E+3,+3.33000E+3,+3.35300E+3,+3.37700E+3,+3.40000E+3,+3.42400E+3,+3.44800E+3,+3.47100E+3,+3.49500E+3,+3.51800E+3,+3.54200E+3,+3.56600E+3,+3.58900E+3,+3.61300E+3,+3.63600E+3,+3.66000E+3]) # J/kg-K + lam = numpy.array([+4.83000E+2,+4.93000E+2,+5.03000E+2,+5.13000E+2,+5.23000E+2,+5.33000E+2,+5.43000E+2,+5.53000E+2,+5.63000E+2,+5.73000E+2,+5.83000E+2,+5.93000E+2,+6.03000E+2,+6.13000E+2,+6.23000E+2,+6.33000E+2,+6.43000E+2,+6.53000E+2,+6.63000E+2,+6.73000E+2,+6.83000E+2,+6.93000E+2,+7.03000E+2,+7.13000E+2])/1e3 # W/m-K + mu_dyn = numpy.array([+4.50000E-3,+3.60000E-3,+3.00000E-3,+2.50000E-3,+2.10000E-3,+1.80000E-3,+1.60000E-3,+1.40000E-3,+1.20000E-3,+1.10000E-3,+9.50000E-4,+8.50000E-4,+7.70000E-4,+7.00000E-4,+6.30000E-4,+5.80000E-4,+5.40000E-4,+4.90000E-4,+4.60000E-4,+4.30000E-4,+4.00000E-4,+3.70000E-4,+3.50000E-4,+3.30000E-4]) # Pa-s + psat = numpy.array([+0.00000E+0,+0.00000E+0,+0.00000E+0,+0.00000E+0,+2.06843E+3,+2.75790E+3,+4.55054E+3,+7.99792E+3,+1.37206E+4,+2.24769E+4,+3.52322E+4,+5.29517E+4,+7.72213E+4,+1.08937E+5,+1.50306E+5,+2.04085E+5,+2.71653E+5,+3.57148E+5,+4.62638E+5,+5.93639E+5,+7.52907E+5,+9.46650E+5,+1.18038E+6,+1.45962E+6]) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 20+273.15 + Name = "HC20" + Desc = "Dynalene "+Name + + +class HC10(LiquidData): + """ + Heat transfer fluid Dynalene HC-10 + Source: Dynalene + """ + T = numpy.array([+2.63150E+2,+2.73150E+2,+2.83150E+2,+2.93150E+2,+3.03150E+2,+3.13150E+2,+3.23150E+2,+3.33150E+2,+3.43150E+2,+3.53150E+2,+3.63150E+2,+3.73150E+2,+3.83150E+2,+3.93150E+2,+4.03150E+2,+4.13150E+2,+4.23150E+2,+4.33150E+2,+4.43150E+2,+4.53150E+2,+4.63150E+2,+4.73150E+2,+4.83150E+2,+4.91150E+2]) # Kelvin + rho = numpy.array([+1.20400E+3,+1.19900E+3,+1.19500E+3,+1.19000E+3,+1.18600E+3,+1.18100E+3,+1.17700E+3,+1.17200E+3,+1.16700E+3,+1.16300E+3,+1.15800E+3,+1.15400E+3,+1.14900E+3,+1.14500E+3,+1.14000E+3,+1.13600E+3,+1.13100E+3,+1.12700E+3,+1.12200E+3,+1.11800E+3,+1.11300E+3,+1.10900E+3,+1.10400E+3,+1.10100E+3]) # kg/m3 + c_p = numpy.array([+3.24600E+3,+3.27100E+3,+3.29600E+3,+3.32000E+3,+3.34500E+3,+3.37000E+3,+3.39500E+3,+3.42000E+3,+3.44400E+3,+3.46900E+3,+3.49400E+3,+3.51900E+3,+3.54400E+3,+3.56800E+3,+3.59300E+3,+3.61800E+3,+3.64300E+3,+3.66800E+3,+3.69200E+3,+3.71700E+3,+3.74200E+3,+3.76700E+3,+3.79200E+3,+3.81100E+3]) # J/kg-K + lam = numpy.array([+4.94000E+2,+5.04000E+2,+5.14000E+2,+5.24000E+2,+5.34000E+2,+5.44000E+2,+5.54000E+2,+5.64000E+2,+5.74000E+2,+5.84000E+2,+5.94000E+2,+6.04000E+2,+6.14000E+2,+6.24000E+2,+6.34000E+2,+6.44000E+2,+6.54000E+2,+6.64000E+2,+6.74000E+2,+6.84000E+2,+6.94000E+2,+7.04000E+2,+7.14000E+2,+7.22000E+2])/1e3 # W/m-K + mu_dyn = numpy.array([+3.00000E-3,+2.50000E-3,+2.10000E-3,+1.80000E-3,+1.50000E-3,+1.30000E-3,+1.20000E-3,+1.00000E-3,+9.10000E-4,+8.10000E-4,+7.30000E-4,+6.60000E-4,+6.00000E-4,+5.50000E-4,+5.10000E-4,+4.70000E-4,+4.30000E-4,+4.00000E-4,+3.70000E-4,+3.50000E-4,+3.30000E-4,+3.10000E-4,+2.90000E-4,+2.80000E-4]) # Pa-s + psat = numpy.array([+0.00000E+0,+0.00000E+0,+0.00000E+0,+2.27527E+3,+2.89580E+3,+4.75738E+3,+8.54950E+3,+1.48927E+4,+2.46143E+4,+3.87485E+4,+5.83986E+4,+8.48055E+4,+1.19969E+5,+1.65474E+5,+2.23390E+5,+2.97164E+5,+3.90243E+5,+5.05386E+5,+6.47418E+5,+8.20476E+5,+1.03146E+6,+1.28587E+6,+1.58993E+6,+1.87468E+6]) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= 20+273.15 + Name = "HC10" + Desc = "Dynalene "+Name + + + +class AS10(LiquidData): + """ + Heat transfer fluid Aspen Temper -10 by Aspen Petroleum + Source: SecCool Software + """ + T = numpy.array([2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02]) # Kelvin + rho = numpy.array([1.09160E+03, 1.09060E+03, 1.08960E+03, 1.08860E+03, 1.08760E+03, 1.08660E+03, 1.08560E+03, 1.08460E+03]) # kg/m3 + c_p = numpy.array([3.52460E+03, 3.53540E+03, 3.54550E+03, 3.55500E+03, 3.56380E+03, 3.57190E+03, 3.57940E+03, 3.58620E+03]) # J/kg-K + lam = numpy.array([5.02200E-01, 5.09600E-01, 5.17000E-01, 5.24400E-01, 5.31800E-01, 5.39200E-01, 5.46700E-01, 5.54100E-01]) # W/m-K + mu_dyn = numpy.array([3.83600E-03, 3.16000E-03, 2.61300E-03, 2.17700E-03, 1.83700E-03, 1.57700E-03, 1.38200E-03, 1.23500E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "AS10" + Desc = "Aspen Temper -10" + + +class AS20(LiquidData): + """ + Heat transfer fluid Aspen Temper -20 by Aspen Petroleum + Source: SecCool Software + """ + T = numpy.array([2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02]) # Kelvin + rho = numpy.array([1.15050E+03, 1.14970E+03, 1.14870E+03, 1.14770E+03, 1.14660E+03, 1.14540E+03, 1.14420E+03, 1.14290E+03, 1.14150E+03, 1.14000E+03]) # kg/m3 + c_p = numpy.array([3.20660E+03, 3.22280E+03, 3.23840E+03, 3.25340E+03, 3.26780E+03, 3.28150E+03, 3.29470E+03, 3.30720E+03, 3.31920E+03, 3.33050E+03]) # J/kg-K + lam = numpy.array([4.56400E-01, 4.63100E-01, 4.69800E-01, 4.76500E-01, 4.83200E-01, 4.90000E-01, 4.96700E-01, 5.03400E-01, 5.10100E-01, 5.16800E-01]) # W/m-K + mu_dyn = numpy.array([7.43800E-03, 5.91400E-03, 4.74900E-03, 3.85900E-03, 3.17900E-03, 2.65900E-03, 2.26100E-03, 1.95800E-03, 1.72500E-03, 1.54800E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "AS20" + Desc = "Aspen Temper -20" + + +class AS30(LiquidData): + """ + Heat transfer fluid Aspen Temper -30 by Aspen Petroleum + Source: SecCool Software + """ + T = numpy.array([2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02]) # Kelvin + rho = numpy.array([1.19140E+03, 1.19030E+03, 1.18910E+03, 1.18770E+03, 1.18630E+03, 1.18480E+03, 1.18330E+03, 1.18170E+03, 1.18010E+03, 1.17840E+03, 1.17680E+03, 1.17510E+03]) # kg/m3 + c_p = numpy.array([2.96950E+03, 2.99130E+03, 3.01190E+03, 3.03100E+03, 3.04890E+03, 3.06540E+03, 3.08050E+03, 3.09430E+03, 3.10670E+03, 3.11770E+03, 3.12750E+03, 3.13580E+03]) # J/kg-K + lam = numpy.array([4.25000E-01, 4.31300E-01, 4.37600E-01, 4.43900E-01, 4.50200E-01, 4.56400E-01, 4.62700E-01, 4.69000E-01, 4.75300E-01, 4.81600E-01, 4.87800E-01, 4.94100E-01]) # W/m-K + mu_dyn = numpy.array([1.56400E-02, 1.19300E-02, 9.17800E-03, 7.14000E-03, 5.62900E-03, 4.50900E-03, 3.67900E-03, 3.06400E-03, 2.60800E-03, 2.27000E-03, 2.01900E-03, 1.83400E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "AS30" + Desc = "Aspen Temper -30" + + +class AS40(LiquidData): + """ + Heat transfer fluid Aspen Temper -40 by Aspen Petroleum + Source: SecCool Software + """ + T = numpy.array([2.35000E+02, 2.40000E+02, 2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02]) # Kelvin + rho = numpy.array([1.22670E+03, 1.22560E+03, 1.22420E+03, 1.22280E+03, 1.22120E+03, 1.21960E+03, 1.21780E+03, 1.21600E+03, 1.21410E+03, 1.21220E+03, 1.21020E+03, 1.20820E+03, 1.20620E+03, 1.20420E+03]) # kg/m3 + c_p = numpy.array([2.83450E+03, 2.85970E+03, 2.88300E+03, 2.90430E+03, 2.92370E+03, 2.94120E+03, 2.95670E+03, 2.97030E+03, 2.98200E+03, 2.99170E+03, 2.99950E+03, 3.00530E+03, 3.00920E+03, 3.01120E+03]) # J/kg-K + lam = numpy.array([4.01400E-01, 4.06900E-01, 4.12400E-01, 4.17900E-01, 4.23400E-01, 4.28900E-01, 4.34400E-01, 4.39900E-01, 4.45400E-01, 4.50900E-01, 4.56400E-01, 4.61800E-01, 4.67300E-01, 4.72800E-01]) # W/m-K + mu_dyn = numpy.array([4.43400E-02, 3.01000E-02, 2.10800E-02, 1.52600E-02, 1.14300E-02, 8.84100E-03, 7.03900E-03, 5.74200E-03, 4.77600E-03, 4.03200E-03, 3.44300E-03, 2.96300E-03, 2.56600E-03, 2.23100E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "AS40" + Desc = "Aspen Temper -40" + + +class AS55(LiquidData): + """ + Heat transfer fluid Aspen Temper -55 by Aspen Petroleum + Source: SecCool Software + """ + T = numpy.array([2.20000E+02, 2.25000E+02, 2.30000E+02, 2.35000E+02, 2.40000E+02, 2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02]) # Kelvin + rho = numpy.array([1.26880E+03, 1.26780E+03, 1.26650E+03, 1.26510E+03, 1.26350E+03, 1.26180E+03, 1.25990E+03, 1.25790E+03, 1.25580E+03, 1.25350E+03, 1.25120E+03, 1.24890E+03, 1.24640E+03, 1.24400E+03, 1.24150E+03, 1.23900E+03, 1.23650E+03]) # kg/m3 + c_p = numpy.array([2.64790E+03, 2.67190E+03, 2.69470E+03, 2.71630E+03, 2.73660E+03, 2.75570E+03, 2.77350E+03, 2.79010E+03, 2.80540E+03, 2.81950E+03, 2.83240E+03, 2.84400E+03, 2.85440E+03, 2.86350E+03, 2.87140E+03, 2.87800E+03, 2.88340E+03]) # J/kg-K + lam = numpy.array([3.82400E-01, 3.85900E-01, 3.89600E-01, 3.93300E-01, 3.97200E-01, 4.01200E-01, 4.05300E-01, 4.09500E-01, 4.13900E-01, 4.18300E-01, 4.22900E-01, 4.27500E-01, 4.32300E-01, 4.37200E-01, 4.42300E-01, 4.47400E-01, 4.52600E-01]) # W/m-K + mu_dyn = numpy.array([2.93600E-01, 1.62700E-01, 9.44200E-02, 5.79500E-02, 3.78300E-02, 2.62200E-02, 1.91500E-02, 1.45600E-02, 1.14000E-02, 9.10600E-03, 7.36900E-03, 6.01200E-03, 4.93000E-03, 4.05600E-03, 3.34300E-03, 2.75900E-03, 2.27800E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "AS55" + Desc = "Aspen Temper -55" + + +class ZS10(LiquidData): + """ + Heat transfer fluid Zitrec S -10 by Arteco + Source: SecCool Software + """ + T = numpy.array([2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02, 3.05000E+02, 3.10000E+02, 3.15000E+02, 3.20000E+02, 3.25000E+02, 3.30000E+02, 3.35000E+02, 3.40000E+02, 3.45000E+02, 3.50000E+02, 3.55000E+02, 3.60000E+02]) # Kelvin + rho = numpy.array([1.10250E+03, 1.10020E+03, 1.09790E+03, 1.09550E+03, 1.09320E+03, 1.09090E+03, 1.08860E+03, 1.08630E+03, 1.08390E+03, 1.08160E+03, 1.07930E+03, 1.07700E+03, 1.07470E+03, 1.07230E+03, 1.07000E+03, 1.06770E+03, 1.06540E+03, 1.06300E+03, 1.06070E+03, 1.05840E+03]) # kg/m3 + c_p = numpy.array([3.54260E+03, 3.55520E+03, 3.56720E+03, 3.57880E+03, 3.59000E+03, 3.60070E+03, 3.61090E+03, 3.62060E+03, 3.62990E+03, 3.63870E+03, 3.64710E+03, 3.65500E+03, 3.66240E+03, 3.66940E+03, 3.67590E+03, 3.68190E+03, 3.68750E+03, 3.69260E+03, 3.69720E+03, 3.70140E+03]) # J/kg-K + lam = numpy.array([4.99700E-01, 5.06300E-01, 5.13000E-01, 5.19600E-01, 5.26200E-01, 5.32800E-01, 5.39400E-01, 5.45900E-01, 5.52500E-01, 5.59000E-01, 5.65500E-01, 5.72000E-01, 5.78500E-01, 5.84900E-01, 5.91400E-01, 5.97800E-01, 6.04300E-01, 6.10700E-01, 6.17100E-01, 6.23400E-01]) # W/m-K + mu_dyn = numpy.array([4.51900E-03, 3.75000E-03, 3.14500E-03, 2.66500E-03, 2.28200E-03, 1.97200E-03, 1.72000E-03, 1.51300E-03, 1.34200E-03, 1.20000E-03, 1.08100E-03, 9.80000E-04, 8.94000E-04, 8.21000E-04, 7.58000E-04, 7.03000E-04, 6.56000E-04, 6.14000E-04, 5.77000E-04, 5.44000E-04]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "ZS10" + Desc = "Zitrec S -10" + + +class ZS25(LiquidData): + """ + Heat transfer fluid Zitrec S -25 by Arteco + Source: SecCool Software + """ + T = numpy.array([2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02, 3.05000E+02, 3.10000E+02, 3.15000E+02, 3.20000E+02, 3.25000E+02, 3.30000E+02, 3.35000E+02, 3.40000E+02, 3.45000E+02, 3.50000E+02, 3.55000E+02, 3.60000E+02]) # Kelvin + rho = numpy.array([1.20620E+03, 1.20360E+03, 1.20090E+03, 1.19820E+03, 1.19560E+03, 1.19290E+03, 1.19030E+03, 1.18760E+03, 1.18490E+03, 1.18230E+03, 1.17960E+03, 1.17690E+03, 1.17430E+03, 1.17160E+03, 1.16890E+03, 1.16630E+03, 1.16360E+03, 1.16100E+03, 1.15830E+03, 1.15560E+03, 1.15300E+03, 1.15030E+03, 1.14760E+03]) # kg/m3 + c_p = numpy.array([3.17680E+03, 3.17880E+03, 3.18090E+03, 3.18290E+03, 3.18500E+03, 3.18710E+03, 3.18920E+03, 3.19130E+03, 3.19340E+03, 3.19550E+03, 3.19760E+03, 3.19980E+03, 3.20200E+03, 3.20410E+03, 3.20630E+03, 3.20850E+03, 3.21070E+03, 3.21290E+03, 3.21520E+03, 3.21740E+03, 3.21970E+03, 3.22200E+03, 3.22420E+03]) # J/kg-K + lam = numpy.array([4.43000E-01, 4.49600E-01, 4.56200E-01, 4.62700E-01, 4.69200E-01, 4.75600E-01, 4.81900E-01, 4.88200E-01, 4.94400E-01, 5.00600E-01, 5.06700E-01, 5.12700E-01, 5.18700E-01, 5.24600E-01, 5.30400E-01, 5.36200E-01, 5.42000E-01, 5.47700E-01, 5.53300E-01, 5.58800E-01, 5.64300E-01, 5.69800E-01, 5.75200E-01]) # W/m-K + mu_dyn = numpy.array([1.06800E-02, 8.37400E-03, 6.68600E-03, 5.42800E-03, 4.47800E-03, 3.74900E-03, 3.18300E-03, 2.73800E-03, 2.38400E-03, 2.10000E-03, 1.86800E-03, 1.67800E-03, 1.52000E-03, 1.38800E-03, 1.27500E-03, 1.17900E-03, 1.09500E-03, 1.02100E-03, 9.55000E-04, 8.95000E-04, 8.40000E-04, 7.89000E-04, 7.40000E-04]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "ZS25" + Desc = "Zitrec S -25" + + +class ZS40(LiquidData): + """ + Heat transfer fluid Zitrec S -40 by Arteco + Source: SecCool Software + """ + T = numpy.array([2.35000E+02, 2.40000E+02, 2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02, 3.05000E+02, 3.10000E+02, 3.15000E+02, 3.20000E+02, 3.25000E+02, 3.30000E+02, 3.35000E+02, 3.40000E+02, 3.45000E+02, 3.50000E+02, 3.55000E+02, 3.60000E+02]) # Kelvin + rho = numpy.array([1.28360E+03, 1.28080E+03, 1.27800E+03, 1.27510E+03, 1.27230E+03, 1.26940E+03, 1.26660E+03, 1.26380E+03, 1.26090E+03, 1.25810E+03, 1.25530E+03, 1.25240E+03, 1.24960E+03, 1.24680E+03, 1.24390E+03, 1.24110E+03, 1.23820E+03, 1.23540E+03, 1.23260E+03, 1.22970E+03, 1.22690E+03, 1.22410E+03, 1.22120E+03, 1.21840E+03, 1.21550E+03, 1.21270E+03]) # kg/m3 + c_p = numpy.array([2.69640E+03, 2.70500E+03, 2.71320E+03, 2.72100E+03, 2.72850E+03, 2.73570E+03, 2.74260E+03, 2.74940E+03, 2.75600E+03, 2.76250E+03, 2.76900E+03, 2.77540E+03, 2.78190E+03, 2.78850E+03, 2.79530E+03, 2.80220E+03, 2.80930E+03, 2.81670E+03, 2.82440E+03, 2.83250E+03, 2.84100E+03, 2.85000E+03, 2.85950E+03, 2.86950E+03, 2.88010E+03, 2.89140E+03]) # J/kg-K + lam = numpy.array([4.15100E-01, 4.20500E-01, 4.25800E-01, 4.31200E-01, 4.36500E-01, 4.41800E-01, 4.47200E-01, 4.52500E-01, 4.57800E-01, 4.63100E-01, 4.68400E-01, 4.73600E-01, 4.78900E-01, 4.84200E-01, 4.89400E-01, 4.94700E-01, 4.99900E-01, 5.05200E-01, 5.10400E-01, 5.15600E-01, 5.20800E-01, 5.26000E-01, 5.31200E-01, 5.36400E-01, 5.41600E-01, 5.46800E-01]) # W/m-K + mu_dyn = numpy.array([3.10200E-02, 2.28600E-02, 1.72100E-02, 1.32300E-02, 1.03600E-02, 8.26100E-03, 6.70400E-03, 5.53000E-03, 4.63200E-03, 3.93600E-03, 3.38900E-03, 2.95500E-03, 2.60700E-03, 2.32300E-03, 2.09100E-03, 1.89800E-03, 1.73500E-03, 1.59700E-03, 1.47900E-03, 1.37500E-03, 1.28400E-03, 1.20200E-03, 1.12700E-03, 1.05800E-03, 9.93000E-04, 9.30000E-04]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "ZS40" + Desc = "Zitrec S -40" + + +class ZS45(LiquidData): + """ + Heat transfer fluid Zitrec S -45 by Arteco + Source: SecCool Software + """ + T = numpy.array([2.30000E+02, 2.35000E+02, 2.40000E+02, 2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02, 3.05000E+02, 3.10000E+02, 3.15000E+02, 3.20000E+02, 3.25000E+02, 3.30000E+02, 3.35000E+02, 3.40000E+02, 3.45000E+02, 3.50000E+02, 3.55000E+02, 3.60000E+02]) # Kelvin + rho = numpy.array([1.30590E+03, 1.30320E+03, 1.30040E+03, 1.29760E+03, 1.29490E+03, 1.29210E+03, 1.28940E+03, 1.28660E+03, 1.28380E+03, 1.28110E+03, 1.27830E+03, 1.27550E+03, 1.27280E+03, 1.27000E+03, 1.26730E+03, 1.26450E+03, 1.26170E+03, 1.25900E+03, 1.25620E+03, 1.25340E+03, 1.25070E+03, 1.24790E+03, 1.24520E+03, 1.24240E+03, 1.23960E+03, 1.23690E+03, 1.23410E+03]) # kg/m3 + c_p = numpy.array([2.55240E+03, 2.56350E+03, 2.57450E+03, 2.58550E+03, 2.59650E+03, 2.60760E+03, 2.61860E+03, 2.62960E+03, 2.64070E+03, 2.65170E+03, 2.66270E+03, 2.67370E+03, 2.68480E+03, 2.69580E+03, 2.70680E+03, 2.71790E+03, 2.72890E+03, 2.73990E+03, 2.75090E+03, 2.76200E+03, 2.77300E+03, 2.78400E+03, 2.79510E+03, 2.80610E+03, 2.81710E+03, 2.82810E+03, 2.83920E+03]) # J/kg-K + lam = numpy.array([4.06200E-01, 4.11100E-01, 4.15900E-01, 4.20900E-01, 4.25800E-01, 4.30700E-01, 4.35700E-01, 4.40600E-01, 4.45600E-01, 4.50600E-01, 4.55700E-01, 4.60700E-01, 4.65800E-01, 4.70900E-01, 4.76000E-01, 4.81100E-01, 4.86200E-01, 4.91400E-01, 4.96600E-01, 5.01700E-01, 5.07000E-01, 5.12200E-01, 5.17400E-01, 5.22700E-01, 5.28000E-01, 5.33300E-01, 5.38600E-01]) # W/m-K + mu_dyn = numpy.array([4.97400E-02, 3.53200E-02, 2.57000E-02, 1.91400E-02, 1.45700E-02, 1.13300E-02, 8.99200E-03, 7.27000E-03, 5.98200E-03, 5.00500E-03, 4.25200E-03, 3.66500E-03, 3.20000E-03, 2.82800E-03, 2.52700E-03, 2.28000E-03, 2.07500E-03, 1.90300E-03, 1.75600E-03, 1.62900E-03, 1.51800E-03, 1.41800E-03, 1.32800E-03, 1.24400E-03, 1.16500E-03, 1.08900E-03, 1.01600E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "ZS45" + Desc = "Zitrec S -45" + + +class ZS55(LiquidData): + """ + Heat transfer fluid Zitrec S -55 by Arteco + Source: SecCool Software + """ + T = numpy.array([2.20000E+02, 2.25000E+02, 2.30000E+02, 2.35000E+02, 2.40000E+02, 2.45000E+02, 2.50000E+02, 2.55000E+02, 2.60000E+02, 2.65000E+02, 2.70000E+02, 2.75000E+02, 2.80000E+02, 2.85000E+02, 2.90000E+02, 2.95000E+02, 3.00000E+02, 3.05000E+02, 3.10000E+02, 3.15000E+02, 3.20000E+02, 3.25000E+02, 3.30000E+02, 3.35000E+02, 3.40000E+02, 3.45000E+02, 3.50000E+02, 3.55000E+02, 3.60000E+02]) # Kelvin + rho = numpy.array([1.35580E+03, 1.35280E+03, 1.34980E+03, 1.34680E+03, 1.34380E+03, 1.34070E+03, 1.33770E+03, 1.33470E+03, 1.33170E+03, 1.32870E+03, 1.32560E+03, 1.32260E+03, 1.31960E+03, 1.31660E+03, 1.31350E+03, 1.31050E+03, 1.30750E+03, 1.30450E+03, 1.30150E+03, 1.29840E+03, 1.29540E+03, 1.29240E+03, 1.28940E+03, 1.28630E+03, 1.28330E+03, 1.28030E+03, 1.27730E+03, 1.27430E+03, 1.27120E+03]) # kg/m3 + c_p = numpy.array([2.43970E+03, 2.44650E+03, 2.45350E+03, 2.46070E+03, 2.46810E+03, 2.47580E+03, 2.48380E+03, 2.49190E+03, 2.50030E+03, 2.50900E+03, 2.51780E+03, 2.52700E+03, 2.53630E+03, 2.54590E+03, 2.55570E+03, 2.56580E+03, 2.57610E+03, 2.58660E+03, 2.59740E+03, 2.60840E+03, 2.61970E+03, 2.63120E+03, 2.64290E+03, 2.65480E+03, 2.66700E+03, 2.67950E+03, 2.69210E+03, 2.70500E+03, 2.71820E+03]) # J/kg-K + lam = numpy.array([3.93100E-01, 3.97000E-01, 4.01000E-01, 4.05100E-01, 4.09100E-01, 4.13200E-01, 4.17300E-01, 4.21400E-01, 4.25600E-01, 4.29700E-01, 4.33900E-01, 4.38200E-01, 4.42400E-01, 4.46700E-01, 4.51000E-01, 4.55400E-01, 4.59700E-01, 4.64100E-01, 4.68500E-01, 4.73000E-01, 4.77500E-01, 4.82000E-01, 4.86500E-01, 4.91000E-01, 4.95600E-01, 5.00200E-01, 5.04800E-01, 5.09500E-01, 5.14200E-01]) # W/m-K + mu_dyn = numpy.array([1.44300E-01, 9.52000E-02, 6.46500E-02, 4.51300E-02, 3.23400E-02, 2.37700E-02, 1.78900E-02, 1.37800E-02, 1.08400E-02, 8.69800E-03, 7.11600E-03, 5.92500E-03, 5.01500E-03, 4.31100E-03, 3.75700E-03, 3.31700E-03, 2.96200E-03, 2.67300E-03, 2.43300E-03, 2.23300E-03, 2.06300E-03, 1.91500E-03, 1.78600E-03, 1.67000E-03, 1.56500E-03, 1.46600E-03, 1.37300E-03, 1.28300E-03, 1.19400E-03]) # Pa-s + psat = numpy.zeros(T.shape) # Pa + Tmin = numpy.min(T) + Tmax = numpy.max(T) + TminPsat= Tmax + Name = "ZS55" + Desc = "Zitrec S -55" + + +#class SylthermXLT(LiquidData): +# """ +# Heat transfer fluid Syltherm XLT by Dow Chemicals +# Source: Dow Chemicals data sheet +# """ +# T = numpy.array([-1.00000E+2, -9.50000E+1, -9.00000E+1, -8.50000E+1, -8.00000E+1, -7.50000E+1, -7.00000E+1, -6.50000E+1, -6.00000E+1, -5.50000E+1, -5.00000E+1, -4.50000E+1, -4.00000E+1, -3.50000E+1, -3.00000E+1, -2.50000E+1, -2.00000E+1, -1.50000E+1, -1.00000E+1, -5.00000E+0, +0.00000E+0, +5.00000E+0, +1.00000E+1, +1.50000E+1, +2.00000E+1, +2.50000E+1, +3.00000E+1, +3.50000E+1, +4.00000E+1, +4.50000E+1, +5.00000E+1, +5.50000E+1, +6.00000E+1, +6.50000E+1, +7.00000E+1, +7.50000E+1, +8.00000E+1, +8.50000E+1, +9.00000E+1, +9.50000E+1, +1.00000E+2, +1.05000E+2, +1.10000E+2, +1.15000E+2, +1.20000E+2, +1.25000E+2, +1.30000E+2, +1.35000E+2, +1.40000E+2, +1.45000E+2, +1.50000E+2, +1.55000E+2, +1.60000E+2, +1.65000E+2, +1.70000E+2, +1.75000E+2, +1.80000E+2, +1.85000E+2, +1.90000E+2, +1.95000E+2, +2.00000E+2, +2.05000E+2, +2.10000E+2, +2.15000E+2, +2.20000E+2, +2.25000E+2, +2.30000E+2, +2.35000E+2, +2.40000E+2, +2.45000E+2, +2.50000E+2, +2.55000E+2, +2.60000E+2])+273.15 # Kelvin +# rho = numpy.array([+9.78500E+2, +9.73400E+2, +9.68300E+2, +9.63100E+2, +9.58000E+2, +9.52900E+2, +9.47700E+2, +9.42600E+2, +9.37500E+2, +9.32300E+2, +9.27200E+2, +9.22000E+2, +9.16900E+2, +9.11800E+2, +9.06600E+2, +9.01500E+2, +8.96400E+2, +8.91200E+2, +8.86100E+2, +8.81000E+2, +8.75800E+2, +8.70700E+2, +8.65500E+2, +8.60400E+2, +8.55300E+2, +8.50100E+2, +8.45000E+2, +8.39900E+2, +8.34700E+2, +8.29600E+2, +8.24500E+2, +8.19300E+2, +8.14200E+2, +8.09100E+2, +8.03900E+2, +7.98800E+2, +7.93600E+2, +7.88500E+2, +7.83400E+2, +7.78200E+2, +7.73100E+2, +7.68000E+2, +7.62800E+2, +7.57700E+2, +7.52600E+2, +7.47400E+2, +7.42300E+2, +7.37200E+2, +7.32000E+2, +7.26900E+2, +7.21700E+2, +7.16600E+2, +7.11500E+2, +7.06300E+2, +7.01200E+2, +6.96100E+2, +6.90900E+2, +6.85800E+2, +6.80700E+2, +6.75500E+2, +6.70400E+2, +6.65300E+2, +6.60100E+2, +6.55000E+2, +6.49800E+2, +6.44700E+2, +6.39600E+2, +6.34400E+2, +6.29300E+2, +6.24200E+2, +6.19000E+2, +6.13900E+2, +6.08800E+2]) # kg/m3 +# c_p = numpy.array([+1.52000E+0, +1.53000E+0, +1.54100E+0, +1.55100E+0, +1.56200E+0, +1.57200E+0, +1.58300E+0, +1.59300E+0, +1.60400E+0, +1.61400E+0, +1.62500E+0, +1.63500E+0, +1.64600E+0, +1.65600E+0, +1.66700E+0, +1.67700E+0, +1.68800E+0, +1.69800E+0, +1.70900E+0, +1.71900E+0, +1.73000E+0, +1.74000E+0, +1.75100E+0, +1.76100E+0, +1.77200E+0, +1.78200E+0, +1.79300E+0, +1.80300E+0, +1.81400E+0, +1.82400E+0, +1.83500E+0, +1.84500E+0, +1.85600E+0, +1.86600E+0, +1.87700E+0, +1.88700E+0, +1.89800E+0, +1.90800E+0, +1.91900E+0, +1.92900E+0, +1.94000E+0, +1.95000E+0, +1.96100E+0, +1.97100E+0, +1.98200E+0, +1.99200E+0, +2.00300E+0, +2.01300E+0, +2.02400E+0, +2.03400E+0, +2.04500E+0, +2.05500E+0, +2.06600E+0, +2.07600E+0, +2.08700E+0, +2.09700E+0, +2.10800E+0, +2.11800E+0, +2.12900E+0, +2.13900E+0, +2.15000E+0, +2.16000E+0, +2.17100E+0, +2.18100E+0, +2.19200E+0, +2.20200E+0, +2.21300E+0, +2.22300E+0, +2.23400E+0, +2.24400E+0, +2.25500E+0, +2.26500E+0, +2.27600E+0])*1e3 # J/kg-K +# lam = numpy.array([+1.34100E-1, +1.33200E-1, +1.32400E-1, +1.31500E-1, +1.30600E-1, +1.29700E-1, +1.28800E-1, +1.27900E-1, +1.26900E-1, +1.26000E-1, +1.25000E-1, +1.24100E-1, +1.23100E-1, +1.22100E-1, +1.21100E-1, +1.20100E-1, +1.19100E-1, +1.18100E-1, +1.17100E-1, +1.16100E-1, +1.15000E-1, +1.14000E-1, +1.12900E-1, +1.11900E-1, +1.10800E-1, +1.09700E-1, +1.08600E-1, +1.07500E-1, +1.06400E-1, +1.05300E-1, +1.04200E-1, +1.03000E-1, +1.01900E-1, +1.00800E-1, +9.96000E-2, +9.84400E-2, +9.72800E-2, +9.61000E-2, +9.49200E-2, +9.37300E-2, +9.25300E-2, +9.13300E-2, +9.01200E-2, +8.89100E-2, +8.76800E-2, +8.64500E-2, +8.52200E-2, +8.39800E-2, +8.27300E-2, +8.14700E-2, +8.02100E-2, +7.89500E-2, +7.76700E-2, +7.64000E-2, +7.51100E-2, +7.38200E-2, +7.25300E-2, +7.12300E-2, +6.99200E-2, +6.86100E-2, +6.72900E-2, +6.59700E-2, +6.46500E-2, +6.33100E-2, +6.19800E-2, +6.06400E-2, +5.92900E-2, +5.79400E-2, +5.65800E-2, +5.52300E-2, +5.38600E-2, +5.24900E-2, +5.11200E-2]) # W/m-K +# mu_dyn = numpy.array([+7.86100E+1, +5.01300E+1, +3.48600E+1, +2.58300E+1, +2.00400E+1, +1.60800E+1, +1.32200E+1, +1.10500E+1, +9.35600E+0, +7.99400E+0, +6.87900E+0, +5.95600E+0, +5.18400E+0, +4.53500E+0, +3.98600E+0, +3.52100E+0, +3.12600E+0, +2.78800E+0, +2.49900E+0, +2.25000E+0, +2.03500E+0, +1.84900E+0, +1.68700E+0, +1.54500E+0, +1.41900E+0, +1.30900E+0, +1.21000E+0, +1.12200E+0, +1.04300E+0, +9.72000E-1, +9.08000E-1, +8.49000E-1, +7.96000E-1, +7.48000E-1, +7.05000E-1, +6.65000E-1, +6.28000E-1, +5.95000E-1, +5.64000E-1, +5.36000E-1, +5.11000E-1, +4.87000E-1, +4.65000E-1, +4.45000E-1, +4.26000E-1, +4.09000E-1, +3.93000E-1, +3.77000E-1, +3.63000E-1, +3.50000E-1, +3.37000E-1, +3.25000E-1, +3.14000E-1, +3.03000E-1, +2.93000E-1, +2.84000E-1, +2.75000E-1, +2.66000E-1, +2.58000E-1, +2.51000E-1, +2.44000E-1, +2.38000E-1, +2.32000E-1, +2.26000E-1, +2.20000E-1, +2.15000E-1, +2.09000E-1, +2.04000E-1, +1.99000E-1, +1.94000E-1, +1.89000E-1, +1.85000E-1, +1.82000E-1])/1000. # Pa-s +# psat = numpy.array([+0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0, +0.00000E+0])*1e5 # Pa +# Tmin = numpy.min(T) +# Tmax = numpy.max(T) +# TminPsat= Tmax +# Name = "XLT" +# Desc = "SylthermXLT" + + +# output +#dataObj = Therminol72() +#for i in range(len(dataObj.T)): +# print str(dataObj.T[i])+", "+str(numpy.log(dataObj.mu_dyn[i])) + +class SolutionData(LiquidData): + """ + A base class that defines all the variables needed + in order to make a proper fit for solution data. + """ + Name = None # Name of the current fluid + Desc = None # Name of the current fluid + Tmin = None # Minimum temperature in K + TminPsat = None # Minimum saturation temperature in K + Tmax = None # Maximum temperature in K + xmin = None # Minimum concentration in weight fraction + xmax = None # Minimum concentration in weight fraction + Tbase = None # Base temperature for data fit in K + xbase = None # Base concentration for data fit in weight fraction + + # Data points + x = None # Concentration data points in weight fraction + T = None # Temperature for data points in K + rho = None # Density in kg/m3 + c_p = None # Heat capacity in J/(kg.K) + lam = None # Thermal conductivity in W/(m.K) + mu_dyn = None # Dynamic viscosity in Pa.s + psat = None # Saturation pressure in Pa + Tfreeze = None # Freezing temperature in K + diff --git a/dev/IncompressibleLiquids/fit_incompressible.py b/dev/IncompressibleLiquids/fit_incompressible.py new file mode 100644 index 00000000..5dd04735 --- /dev/null +++ b/dev/IncompressibleLiquids/fit_incompressible.py @@ -0,0 +1,647 @@ +import numpy, matplotlib.pyplot +import CoolProp.CoolProp as CP +from scipy.optimize._minimize import minimize +from scipy.optimize.minpack import curve_fit +from matplotlib.ticker import MaxNLocator + +class IncompLiquidFit(object): + """ + A class for fitting data sheet data to predefined functions. + Some functions are only used during the fitting procedure. + Note that the order in which you fit the different properties + might impact the coefficients. Usually, the fitting order should be: + 1) Density + 2) Heat capacity + 3) Thermal conductivity + 4) Viscosity + 5) Vapour pressure + """ + + def __init__(self): + self.DEBUG = False + + # parameters for the different fits + self._cDensity = numpy.ones(4) # Typically 4 parameters + self._cHeatCapacity = numpy.ones(4) # Typically 4 parameters + self._cTConductivity = numpy.ones(3) # Typically 3 parameters + self._cViscosity = numpy.ones(3) # Typically 3 parameters + self._cPsat = numpy.ones(3) # Typically 3 parameters + + # bounds for fit + self._Tmin = None + self._TminPsat = None + self._Tmax = None + self._Tref = 273.15 + 25. + self._Tbase = 0.0 + + # some flags to set + self._TinC = False # Temperature in Celsius + self._DynVisc = True # Data for dynamic viscosity + self._minPoints = 3 + + self._expPoly = False # Fit exponential as polynomial + + + + + def setParams(self,fluid): + if fluid=='init': + # initial parameters for the different fits +# self._cDensity = [+9.2e+2, -0.5e+0, +2.8e-4, -1.1e-6] +# self._cHeatCapacity = [+1.0e+0, +3.6e-3, -2.9e-7, +1.7e-9] +# self._cTConductivity = [+1.1e-1, +7.8e-5, +3.5e-7] +# self._cViscosity = [+7.1e+2, +2.3e+2, +3.4e+1] +# self._cPsat = [-5.3e+3, +3.2e+1, -1.6e+1] + self._cDensity = [1, 1, 1, 1] + self._cHeatCapacity = [1, 1, 1, 1] + self._cTConductivity = [1, 1, 1] + #self._cViscosity = [+8e+2, -2e+2, +3e+1] + self._cViscosity = [+7e+2, -6e+1, +1e+1] + self._cPsat = [-5e+3, +3e+1, -1e+1] + return True + + +# elif fluid=='TherminolD12inCelsius': +# self._cDensity = [776.257 , -0.696982, -0.000131384, -0.00000209079] +# self._cHeatCapacity = [2.01422 , 0.00386884, 2.05029e-6, -1.12621e-8, 3.86282e-11] +# self._cTConductivity = [0.112994, 0.00014781, -1.61429e-7] +# self._cViscosity = [530.944, 146.4, -2.68168] +# self._cPsat = [-3562.69, 194, 13.8526] +# self._Tmin = -85.0 + 273.15 +# self._TminPsat = 40.0 + 273.15 +# self._Tmax = 260.0 + 273.15 +# elif fluid=='TherminolD12': +# self._cDensity = [1.08315084e+04,-8.21176568e+01,2.23399244e-01, -2.03753274e-04] +# self._cHeatCapacity = [2.01422 , 0.00386884, 2.05029e-6, -1.12621e-8, 3.86282e-11] +# self._cTConductivity = [0.112994, 0.00014781, -1.61429e-7] +# self._cViscosity = [530.944, 146.4, -2.68168] +# self._cPsat = [-3562.69, 194, 13.8526] +# self._Tmin = -85.0 + 273.15 +# self._TminPsat = 40.0 + 273.15 +# self._Tmax = 260.0 + 273.15 + + else: + raise (ValueError("No coefficients available for "+str(fluid))) + + + def _checkT(self,T=0): + Tmin = self.Props('Tmin') + Tmax = self.Props('Tmax') + if Tmin is None: + raise (ValueError("Please specify the minimum temperature.")) + if Tmax is None: + raise (ValueError("Please specify the maximum temperature.")) + if not (Tmin<=T<=Tmax): + raise (ValueError("Temperature out of range: "+str(T)+" not in "+str(Tmin)+"-"+str(Tmax)+". ")) + + def _checkP(self,T=0,P=0): + Psat = self.Props('Psat',T=T) + if PtolStart: + # print "Refitting with new guesses and original tolerance of "+str(tolStart) + # res = minimize(fun, res.x, method=method, args=arguments, tol=tolStart) + + if res.success: + success = True + return res.x + else: + print "Fit failed: " + print res + success = False + + elif fit[counter]=="POL": + print "Fitting exponential polynomial with "+str(len(initValues))+" coefficients." + z = numpy.polyfit(T-self._Tbase, numpy.log(xData)[:], len(initValues)-1) + return z[::-1] + + else: + raise (ValueError("Error: You used an unknown fit method.")) + + else: # just a polynomial + print "Fitting polynomial with "+str(len(initValues))+" coefficients." + z = numpy.polyfit(T-self._Tbase, xData, len(initValues)-1) + return z[::-1] + +# def fitCoefficientsCentered(self,xName,T=[],xData=[]): +# tBase = (self._Tmax-self._Tmin) / 2.0 + self._Tmin +# self.setTbase(tBase) +# return self.fitCoefficients(xName,T=T,xData=xData) + + + + +### Load the data +from data_incompressible import * + +containerList = [] +#containerList.extend([TherminolD12(), TherminolVP1(), Therminol66(), Therminol72()]) +#containerList.extend([DowthermJ(), DowthermQ()]) +#containerList.extend([Texatherm22(), NitrateSalt(), SylthermXLT()]) +#containerList.extend([HC50(), HC40(), HC30(), HC20(), HC10()]) +containerList.extend([AS10(), AS20(), AS30(), AS40(), AS55()]) +containerList.extend([ZS10(), ZS25(), ZS40(), ZS45(), ZS55()]) + + + + +def relError(A=[],B=[],PCT=False): + result = (numpy.array(A)-numpy.array(B))/numpy.array(B); + if PCT: + return result * 100. + else: + return result + +for data in containerList: + ### Some test case + liqObj = IncompLiquidFit() + liqObj.setParams("init") + liqObj.setTmin(data.Tmin) + liqObj.setTminPsat(data.TminPsat) + liqObj.setTmax(data.Tmax) + + #liqObj._cViscosity[0] = numpy.max(data.mu_dyn) + #liqObj._cPsat[0] = numpy.min(data.psat) + + numpy.set_printoptions(formatter={'float': lambda x: format(x, '+1.10E')}) + + print + print "------------------------------------------------------" + print "Fitting "+str(data.Name) + print "------------------------------------------------------" + print + print "minimum T: "+str(data.Tmin) + print "maximum T: "+str(data.Tmax) + print "min T pSat:"+str(data.TminPsat) + #liqObj.setTbase((data.Tmax-data.Tmin) / 2.0 + data.Tmin) + #liqObj.setExpPoly(True) + print "T base:"+str(liqObj._Tbase) + print + + + + # row and column sharing for test plots + #matplotlib.pyplot.subplots_adjust(top=0.85) + f, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = matplotlib.pyplot.subplots(3, 2, sharex='col') + f.set_size_inches(matplotlib.pyplot.figaspect(1.2)*1.5) + #f.suptitle("Fit for "+str(data.Desc), fontsize=14) + + ### This is the actual fitting + tData = data.T + tDat1 = numpy.linspace(numpy.min(tData)+1, numpy.max(tData)-1, 10) + Pin = 1e20 # Dummy pressure + inCP =liqObj.inCoolProp(data.Name) + print "Fluid in CoolProp: "+str(inCP) + print + + inVal = 'D' + xData = data.rho + oldCoeffs = liqObj.getCoefficients(inVal) + newCoeffs = liqObj.fitCoefficients(inVal,T=tData,xData=xData) + print "Density, old: "+str(oldCoeffs) + print "Density, new: "+str(newCoeffs) + print + liqObj.setCoefficients(inVal,newCoeffs) + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tDat1]) + ax1.plot(tData-273.15, xData, 'o', label="Data Sheet") + ax1.plot(tDat1-273.15, fData, 'o', label="Python") + if inCP: + Tmin = CP.PropsU('Tmin','T',0,'P',0,data.Name,"SI") + Tmax = CP.PropsU('Tmax','T',0,'P',0,data.Name,"SI") + tDat2 = numpy.linspace(Tmin+1, Tmax-1, 100) + ax1.plot(tDat2-273.15, CP.PropsU(inVal, 'T', tDat2, 'P', Pin*1e3, data.Name, "SI"), label="CoolProp") + ax12 = ax1.twinx() + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tData]) + ax12.plot(tData-273.15, relError(fData, xData, True), 'o', label="Error", alpha=0.25) + ax12.set_ylabel(r'$\mathregular{rel.\/Error\/(\%)}$') + ax1.set_ylabel(r'$\mathregular{Density\/(kg\/m^{-3})}$') + + inVal = 'C' + xData = data.c_p + oldCoeffs = liqObj.getCoefficients(inVal) + newCoeffs = liqObj.fitCoefficients(inVal,T=tData,xData=xData) + print "Heat c., old: "+str(oldCoeffs) + print "Heat c., new: "+str(newCoeffs) + print + liqObj.setCoefficients(inVal,newCoeffs) + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tDat1]) + ax2.plot(tData-273.15, xData/1e3, 'o', label="Data Sheet") + ax2.plot(tDat1-273.15, fData/1e3, 'o', label="Python") + if inCP: + ax2.plot(tDat2-273.15, CP.PropsU(inVal, 'T', tDat2, 'P', Pin*1e3, data.Name, "SI")/1e3, label="CoolProp") + ax22 = ax2.twinx() + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tData]) + ax22.plot(tData-273.15, relError(fData, xData, True), 'o', label="Error", alpha=0.25) + ax22.set_ylabel(r'$\mathregular{rel.\/Error\/(\%)}$') + ax2.set_ylabel(r'$\mathregular{Heat\/Cap.\/(kJ\/kg^{-1}\/K^{-1})}$') + + inVal = 'L' + xData = data.lam + oldCoeffs = liqObj.getCoefficients(inVal) + newCoeffs = liqObj.fitCoefficients(inVal,T=tData,xData=xData) + print "Th. Co., old: "+str(oldCoeffs) + print "Th. Co., new: "+str(newCoeffs) + print + liqObj.setCoefficients(inVal,newCoeffs) + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tDat1]) + ax3.plot(tData-273.15, xData*1e3, 'o', label="Data Sheet") + ax3.plot(tDat1-273.15, fData*1e3, 'o', label="Python") + if inCP: + ax3.plot(tDat2-273.15, CP.PropsU(inVal, 'T', tDat2, 'P', Pin*1e3, data.Name, "SI")*1e3, label="CoolProp") + ax32 = ax3.twinx() + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tData]) + ax32.plot(tData-273.15, relError(fData, xData, True), 'o', label="Error", alpha=0.25) + ax32.set_ylabel(r'$\mathregular{rel.\/Error\/(\%)}$') + ax3.set_ylabel(r'$\mathregular{Th.\/Cond.\/(mW\/m^{-1}\/K^{-1})}$') + + inVal = 'V' + tData = data.T[data.mu_dyn > 0] + if len(tData)>liqObj._minPoints: + tDat1 = numpy.linspace(numpy.min(tData)+1, numpy.max(tData)-1, 10) + xData = data.mu_dyn[data.mu_dyn > 0] + oldCoeffs = liqObj.getCoefficients(inVal) + newCoeffs = liqObj.fitCoefficients(inVal,T=tData,xData=xData) + print "Viscos., old: "+str(oldCoeffs) + print "Viscos., new: "+str(newCoeffs) + print + liqObj.setCoefficients(inVal,newCoeffs) + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tDat1]) + ax4.plot(tData-273.15, xData*1e3, 'o', label="Data Sheet") + ax4.plot(tDat1-273.15, fData*1e3, 'o', label="Python") + if inCP: + ax4.plot(tDat2-273.15, CP.PropsU(inVal, 'T', tDat2, 'P', Pin*1e3, data.Name, "SI")*1e3, label="CoolProp") + ax42 = ax4.twinx() + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tData]) + ax42.plot(tData-273.15, relError(fData, xData, True), 'o', label="Error", alpha=0.25) + ax42.set_ylabel(r'$\mathregular{rel.\/Error\/(\%)}$') + + ax4.set_ylabel(r'$\mathregular{Dyn.\/Viscosity\/(mPa\/s)}$') + ax4.set_yscale('log') + + inVal = 'Psat' + mask = numpy.logical_and(numpy.greater_equal(data.T,data.TminPsat),numpy.greater(data.psat,0)) + tData = data.T[mask] + if len(tData)>liqObj._minPoints: + tDat1 = numpy.linspace(numpy.min(tData)+1, numpy.max(tData)-1, 10) + xData = data.psat[mask] + oldCoeffs = liqObj.getCoefficients(inVal) + newCoeffs = liqObj.fitCoefficients(inVal,T=tData,xData=xData) + print "P sat. , old: "+str(oldCoeffs) + print "P sat. , new: "+str(newCoeffs) + print + liqObj.setCoefficients(inVal,newCoeffs) + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tDat1]) + ax5.plot(tData-273.15, xData/1e3, 'o', label="Data Sheet") + ax5.plot(tDat1-273.15, fData/1e3, 'o', label="Python") + if inCP: + ax5.plot(tDat2-273.15, CP.PropsU(inVal, 'T', tDat2, 'P', Pin*1e3, data.Name, "SI")/1e3, label="CoolProp") + ax52 = ax5.twinx() + fData = numpy.array([liqObj.Props(inVal, T=Tin, P=Pin) for Tin in tData]) + ax52.plot(tData-273.15, relError(fData, xData, True), 'o', label="Error", alpha=0.25) + ax52.set_ylabel(r'$\mathregular{rel.\/Error\/(\%)}$') + + ax5.set_ylabel(r'$\mathregular{Vap.\/Pressure\/(kPa)}$') + ax5.set_yscale('log') + + ax5.set_xlabel(ur'$\mathregular{Temperature\/(\u00B0C)}$') + ax6.set_xlabel(ur'$\mathregular{Temperature\/(\u00B0C)}$') + + #x5min,x5max = ax5.get_xlim() + #x6min,x6max = ax6.get_xlim() + #xmin, xmax = (numpy.min([x5min,x6min]),numpy.max([x5max,x6max])) + #x3min,x3max = ax3.get_xlim() + #x4min,x4max = ax4.get_xlim() + #xmin, xmax = (numpy.min([x3min,x4min]),numpy.max([x3max,x4max])) + #x1min,x1max = ax1.get_xlim() + #x2min,x2max = ax2.get_xlim() + #xmin, xmax = (numpy.min([x1min,x2min]),numpy.max([x1max,x2max])) + #xmin, xmax = (-10,30) + + xmin = numpy.round(numpy.min(data.T)-273.15-5, -1) + xmax = numpy.round(numpy.max(data.T)-273.15+5, -1) + + ax5.set_xlim([xmin,xmax]) + ax6.set_xlim(ax5.get_xlim()) + + ax5.xaxis.set_major_locator(MaxNLocator(5)) + ax6.xaxis.set_major_locator(ax5.xaxis.get_major_locator()) + + tData = numpy.array(data.Tmin + (data.Tmax-data.Tmin)/2.) + xData = numpy.array(1) + ax6.plot(tData-273.15, xData, 'o', label="Data Sheet") + ax6.plot(tData-273.15, xData, 'o', label="Python") + if inCP: + ax6.plot(tData-273.15, xData, label="CoolProp") + ax6.legend(loc=1) + ax6.text(tData-273.15, xData*1.005, 'Fits for '+str(data.Name), + verticalalignment='top', horizontalalignment='center', + backgroundcolor='white', fontsize=18) + matplotlib.pyplot.tight_layout() + matplotlib.pyplot.savefig("fit_current_std.pdf") + #TODO Remove for normal fitting + matplotlib.pyplot.savefig("fit_"+data.Name+"_std.pdf") + + ### Print the output for the C++ file + print "name = std::string(\""+data.Name+"\");" + print "description = std::string(\""+data.Desc+"\");" + print "reference = std::string(\"\");" + print "" + print "Tmin = "+str(data.Tmin)+";" + print "Tmax = "+str(data.Tmax)+";" + print "TminPsat = "+str(data.TminPsat)+";" + print "" + print "cRho.clear();" + C = liqObj.getCoefficients('D') + for Ci in C: + print "cRho.push_back(%+1.10E);" %(Ci) + + print "" + print "cHeat.clear();" + C = liqObj.getCoefficients('C') + for Ci in C: + print "cHeat.push_back(%+1.10E);" %(Ci) + + print "" + print "cCond.clear();" + C = liqObj.getCoefficients('L') + for Ci in C: + print "cCond.push_back(%+1.10E);" %(Ci) + + print "" + print "cVisc.clear();" + C = liqObj.getCoefficients('V') + for Ci in C: + print "cVisc.push_back(%+1.10E);" %(Ci) + + print "" + print "cPsat.clear();" + C = liqObj.getCoefficients('Psat') + for Ci in C: + print "cPsat.push_back(%+1.10E);" %(Ci) + + raw_input("Finished with "+data.Name+", press Enter to continue...") + + diff --git a/dev/IncompressibleLiquids/fit_incompressible_simple.py b/dev/IncompressibleLiquids/fit_incompressible_simple.py new file mode 100644 index 00000000..52e1e1d1 --- /dev/null +++ b/dev/IncompressibleLiquids/fit_incompressible_simple.py @@ -0,0 +1,333 @@ +import matplotlib.pyplot +import numpy +from scipy.optimize._minimize import minimize + +class IncompLiquidFit_simple(object): + """ + A class for fitting data sheet data to predefined functions. + Some functions are only used during the fitting procedure. + Note that the order in which you fit the different properties + might impact the coefficients. Usually, the fitting order should be: + 1) Density + 2) Heat capacity + 3) Thermal conductivity + 4) Viscosity + 5) Vapour pressure + """ + + def __init__(self): + self.DEBUG = False + + # parameters for the different fits + self._cDensity = numpy.ones(2) # Typically 2 parameters + self._cHeatCapacity = numpy.ones(2) # Typically 2 parameters + self._cTConductivity = numpy.ones(2) # Typically 2 parameters + self._cViscosity = numpy.ones(3) # Typically 3 parameters + self._cPsat = numpy.ones(3) # Typically 3 parameters + + # bounds for fit + self._Tmin = None + self._TminPsat = None + self._Tmax = None + + # some flags to set + self._TinC = False # Temperature in Celsius + self._DynVisc = True # Data for dynamic viscosity + self._minPoints = 5 + + + def setParams(self,fluid): + if fluid=='init': + # initial parameters for the different fits + self._cDensity = [+9.2e+2, -0.5e+0] + self._cHeatCapacity = [+1.0e+0, +2.9e-3] + self._cTConductivity = [+1.1e-4, +7.8e-7] + self._cViscosity = [+7.1e+0, -2.3e-2, +3.4e-5] + self._cPsat = [-5.3e+3, -3.2e+1, -1.6e+1] + else: + raise (ValueError("No coefficients available for "+str(fluid))) + + + def _checkT(self,T=0): + Tmin = self.Props('Tmin') + Tmax = self.Props('Tmax') + if Tmin is None: + raise (ValueError("Please specify the minimum temperature.")) + if Tmax is None: + raise (ValueError("Please specify the maximum temperature.")) + if not (Tmin<=T<=Tmax): + raise (ValueError("Temperature out of range: "+str(T)+" not in "+str(Tmin)+"-"+str(Tmax)+". ")) + + def _checkP(self,T=0,P=0): + Psat = self.Props('Psat',T=T) + if P1.25 or numpy.min([X_liq_STDV/X_liq_TTSE,X_vap_STDV/X_vap_TTSE])<0.75: + c_diff += 1 + print "" + print "There were problems with "+what+" for "+fluid + print "Relative difference liquid: "+str(numpy.mean((X_liq_STDV-X_liq_TTSE)/X_liq_STDV)) + print "Relative difference vapour: "+str(numpy.mean((X_vap_STDV-X_vap_TTSE)/X_vap_STDV)) + print "Average factor liquid: "+str(numpy.mean(X_liq_STDV/X_liq_TTSE)) + print "Average factor vapour: "+str(numpy.mean(X_vap_STDV/X_vap_TTSE)) + #plt.plot(numpy.append(T_liq,T_vap),numpy.append(X_liq_STDV,X_vap_STDV),label=what+", standard") + #plt.plot(numpy.append(T_liq,T_vap),numpy.append(X_liq_TTSE,X_vap_TTSE),label=what+", TTSE") + ##plt.show(block=True) + #plt.savefig("/home/jowr/tmp/viscosity/"+fluid+".png") + #plt.clf() + + +#toTest = ["L","V"] +toTest = "V" +#fluids = ["n-Pentane","R134a"] +fluids = FluidsList() +c_diff = 0 +c_unit = 0 +c_exce = 0 + +for fluid in fluids: + try: + compareProperty(fluid=fluid,what=toTest) + except ValueError: + c_exce += 1 + print "An exception occurred for "+toTest+" with "+fluid + +print "Finished testing TTSE:" +print "Errors occurred in "+str(c_exce)+" out of "+str(len(fluids))+" fluids" +print "and differences occurred in "+str(c_diff)+" fluids." \ No newline at end of file diff --git a/dev/Tickets/60.cpp b/dev/Tickets/60.cpp new file mode 100644 index 00000000..3302d88a --- /dev/null +++ b/dev/Tickets/60.cpp @@ -0,0 +1,670 @@ +#include "../../CoolProp/CoolPropTools.h" +#include "../../CoolProp/IncompBase.h" +#include "../../CoolProp/IncompLiquid.h" +#include "../../CoolProp/IncompSolution.h" + +#if defined(__ISWINDOWS__) +#include +#include "stdafx.h" +#else +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include + + +/** A class to test the different implementations, + * exposes more functions than the other ones. + */ +class IncompressibleTest : public IncompressibleClass { +public: + IncompressibleTest(){}; + ~IncompressibleTest(){}; + // Some functions need top be overwritten! + +public: + double testSi(std::vector const& coefficients, double x){ + return simplePolynomial(coefficients,x); + } + + double testHo(std::vector const& coefficients, double x){ + return baseHorner(coefficients,x); + } + + double testSiInt(std::vector const& coefficients, double T){ + return simplePolynomialInt(coefficients,T); + } + + double testHoInt(std::vector const& coefficients, double T){ + return baseHornerInt(coefficients,T); + } + + double test2sInt(std::vector const& coefficients, double T){ + return integrateIn2Steps(coefficients,T); + } + + double testSiInt(std::vector const& coefficients, double T1, double T0){ + return simplePolynomialInt(coefficients,T1,T0); + } + + double testHoInt(std::vector const& coefficients, double T1, double T0){ + return baseHornerInt(coefficients,T1,T0); + } + + double test2sInt(std::vector const& coefficients, double T1, double T0){ + return integrateIn2Steps(coefficients,T1,T0); + } + + double testSiFra(std::vector const& coefficients, double T){ + return simpleFracInt(coefficients,T); + } + + double testHoFra(std::vector const& coefficients, double T){ + return baseHornerFra(coefficients,T); + } + + double test2sFra(std::vector const& coefficients, double T){ + return fracIntIn2Steps(coefficients,T); + } + + double testSiFra(std::vector const& coefficients, double T1, double T0){ + return simpleFracInt(coefficients,T1,T0); + } + + double testHoFra(std::vector const& coefficients, double T1, double T0){ + return baseHornerFra(coefficients,T1,T0); + } + + double test2sFra(std::vector const& coefficients, double T1, double T0){ + return fracIntIn2Steps(coefficients,T1,T0); + } + + // And the same in 2D + double testSi(std::vector > const& coefficients, double x, double T){ + return simplePolynomial(coefficients,x,T); + } + + double testHo(std::vector > const& coefficients, double x, double T){ + return baseHorner(coefficients,x,T); + } + + double testSiInt(std::vector > const& coefficients, double x, double T){ + return simplePolynomialInt(coefficients,x,T); + } + + double testHoInt(std::vector > const& coefficients, double x, double T){ + return baseHornerInt(coefficients,x,T); + } + + double test2sInt(std::vector > const& coefficients, double x, double T){ + return integrateIn2Steps(coefficients,x,T,false); + } + + double testSiInt(std::vector > const& coefficients, double x, double T1, double T0){ + return simplePolynomialInt(coefficients,x,T1,T0); + } + + double testHoInt(std::vector > const& coefficients, double x, double T1, double T0){ + return baseHornerInt(coefficients,x,T1,T0); + } + + double test2sInt(std::vector > const& coefficients, double x, double T1, double T0){ + return integrateIn2Steps(coefficients,x,T1,T0); + } + + double testSiFra(std::vector > const& coefficients, double x, double T){ + return simpleFracInt(coefficients,x,T); + } + + double testHoFra(std::vector > const& coefficients, double x, double T){ + return baseHornerFra(coefficients,x,T); + } + + double test2sFra(std::vector > const& coefficients, double x, double T){ + return fracIntIn2Steps(coefficients,x,T); + } + + double testSiFra(std::vector > const& coefficients, double x, double T1, double T0){ + return simpleFracInt(coefficients,x,T1,T0); + } + + double testHoFra(std::vector > const& coefficients, double x, double T1, double T0){ + return baseHornerFra(coefficients,x,T1,T0); + } + + double test2sFra(std::vector > const& coefficients, double x, double T1, double T0){ + return fracIntIn2Steps(coefficients,x,T1,T0); + } +}; + +/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both + * windows and linux. + * Taken from http://stackoverflow.com/questions/1861294/how-to-calculate-execution-time-of-a-code-snippet-in-c + * */ +uint64_t getTimeValue() { +#if defined(__ISWINDOWS__) + /* Windows */ + FILETIME ft; + LARGE_INTEGER li; + + /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it + * to a LARGE_INTEGER structure. */ + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + + uint64_t ret = li.QuadPart; + ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */ + ret /= 10; /* From 100 nano seconds (10^-7) to 1 microsecond (10^-6) intervals */ + + return ret; +#else + /* Linux */ + struct timeval tv; + + gettimeofday(&tv, NULL); + + uint64_t ret = tv.tv_usec; + /* In micro seconds (10^-6), add the seconds (10^0) + * after converting them to microseconds (10^-6) */ + ret += (tv.tv_sec * 1000000); + + return ret; +#endif +} + +std::vector< std::vector > makeMatrix(std::vector const& coefficients){ + //IncompressibleClass::checkCoefficients(coefficients,18); + std::vector< std::vector > matrix; + std::vector tmpVector; + + tmpVector.clear(); + tmpVector.push_back(coefficients[0]); + tmpVector.push_back(coefficients[6]); + tmpVector.push_back(coefficients[11]); + tmpVector.push_back(coefficients[15]); + matrix.push_back(tmpVector); + + tmpVector.clear(); + tmpVector.push_back(coefficients[1]); + tmpVector.push_back(coefficients[7]); + tmpVector.push_back(coefficients[12]); + tmpVector.push_back(coefficients[16]); + matrix.push_back(tmpVector); + + tmpVector.clear(); + tmpVector.push_back(coefficients[2]); + tmpVector.push_back(coefficients[8]); + tmpVector.push_back(coefficients[13]); + tmpVector.push_back(coefficients[17]); + matrix.push_back(tmpVector); + + tmpVector.clear(); + tmpVector.push_back(coefficients[3]); + tmpVector.push_back(coefficients[9]); + tmpVector.push_back(coefficients[14]); + tmpVector.push_back(0.0); + matrix.push_back(tmpVector); + + tmpVector.clear(); + tmpVector.push_back(coefficients[4]); + tmpVector.push_back(coefficients[10]); + tmpVector.push_back(0.0); + tmpVector.push_back(0.0); + matrix.push_back(tmpVector); + + tmpVector.clear(); + tmpVector.push_back(coefficients[5]); + tmpVector.push_back(0.0); + tmpVector.push_back(0.0); + tmpVector.push_back(0.0); + matrix.push_back(tmpVector); + + tmpVector.clear(); + return matrix; +} + +std::map testObject(IncompressibleTest* fluid, std::vector > coeffs, int exponent, bool print){ + + std::map results; + + uint64_t runs = 10; + for (int i=1; i simCoeffs; + if (coeffs.size()>0) { + simCoeffs = coeffs[1]; + } else { + results["error"] = -_HUGE; + return results; + } + + if (print) { + std::cout << "simCoeffs: " << simCoeffs[0]; + for (int i=1; i < simCoeffs.size(); i++) { + std::cout << ", " << simCoeffs[i]; + } + std::cout << std::endl; + } + + + uint64_t start; + uint64_t end; + double time; + + double Tin = 280; + double T0 = Tin-10; + double xin = 0.25; + + // Testing the 1D functions first + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSi(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D std sim simple"] = time; + fluid->setDebug(print); + fluid->testSi(simCoeffs, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHo(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D std sim Horner"] = time; + fluid->setDebug(print); + fluid->testHo(simCoeffs, Tin); + + // Testing the 1D integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiInt(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int ind simple"] = time; + fluid->setDebug(print); + fluid->testSiInt(simCoeffs, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoInt(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int ind Horner"] = time; + fluid->setDebug(print); + fluid->testHoInt(simCoeffs, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sInt(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int ind 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sInt(simCoeffs, Tin); + + // Testing the 1D definite integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiInt(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int def simple"] = time; + fluid->setDebug(print); + fluid->testSiInt(simCoeffs, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoInt(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int def Horner"] = time; + fluid->setDebug(print); + fluid->testHoInt(simCoeffs, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sInt(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D int def 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sInt(simCoeffs, Tin, T0); + + // Testing the 1D fraction integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiFra(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra ind simple"] = time; + fluid->setDebug(print); + fluid->testSiFra(simCoeffs, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoFra(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra ind Horner"] = time; + fluid->setDebug(print); + fluid->testHoFra(simCoeffs, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sFra(simCoeffs, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra ind 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sFra(simCoeffs, Tin); + + // Testing the 1D definite fraction integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiFra(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra def simple"] = time; + fluid->setDebug(print); + fluid->testSiFra(simCoeffs, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoFra(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra def Horner"] = time; + fluid->setDebug(print); + fluid->testHoFra(simCoeffs, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sFra(simCoeffs, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["1D fra def 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sFra(simCoeffs, Tin, T0); + + // Testing the 2D functions + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSi(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D std sim simple"] = time; + fluid->setDebug(print); + fluid->testSi(coeffs, xin, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHo(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D std sim Horner"] = time; + fluid->setDebug(print); + fluid->testHo(coeffs, xin, Tin); + + // Testing the 2D integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiInt(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int ind simple"] = time; + fluid->setDebug(print); + fluid->testSiInt(coeffs, xin, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoInt(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int ind Horner"] = time; + fluid->setDebug(print); + fluid->testHoInt(coeffs, xin, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sInt(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int ind 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sInt(coeffs, xin, Tin); + + // Testing the 2D definite integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiInt(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int def simple"] = time; + fluid->setDebug(print); + fluid->testSiInt(coeffs, xin, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoInt(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int def Horner"] = time; + fluid->setDebug(print); + fluid->testHoInt(coeffs, xin, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sInt(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D int def 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sInt(coeffs, xin, Tin, T0); + + // Testing the 2D fraction integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiFra(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra ind simple"] = time; + fluid->setDebug(print); + fluid->testSiFra(coeffs, xin, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoFra(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra ind Horner"] = time; + fluid->setDebug(print); + fluid->testHoFra(coeffs, xin, Tin); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sFra(coeffs, xin, Tin+i/runs); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra ind 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sFra(coeffs, xin, Tin); + + // Testing the 2D definite fraction integrators + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestSiFra(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra def simple"] = time; + fluid->setDebug(print); + fluid->testSiFra(coeffs, xin, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itestHoFra(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra def Horner"] = time; + fluid->setDebug(print); + fluid->testHoFra(coeffs, xin, Tin, T0); + + fluid->setDebug(false); + start = getTimeValue(); + for (int i=0; itest2sFra(coeffs, xin, Tin+i/runs, T0); + } + end = getTimeValue(); + time = (end-start)*1e3/runs; + results["2D fra def 2Steps"] = time; + fluid->setDebug(print); + fluid->test2sFra(coeffs, xin, Tin, T0); + + return results; +} + +int main(int argc, const char* argv[]) { + + + + std::vector tmpVector; + std::vector > coeffs; + int exponent = 6; + + IncompressibleTest* fluid = new IncompressibleTest(); + + tmpVector.clear(); + tmpVector.push_back( 1081.6353100); + tmpVector.push_back(-2.4559523700); + tmpVector.push_back( 0.0058152057); + tmpVector.push_back(-7.500013E-05); + tmpVector.push_back(-7.575759E-07); + tmpVector.push_back( 1.666671E-07); + tmpVector.push_back(-5.6609963900); + tmpVector.push_back( 0.1002726190); + tmpVector.push_back(-0.0004797330); + tmpVector.push_back( 1.333333E-06); + tmpVector.push_back( 3.636364E-08); + tmpVector.push_back(-0.0852857143); + tmpVector.push_back( 0.0007904762); + tmpVector.push_back( 1.428571E-06); + tmpVector.push_back( 6.666668E-07); + tmpVector.push_back(-0.0037650794); + tmpVector.push_back( 3.333333E-05); + tmpVector.push_back( 6.984127E-07); + coeffs.clear(); + coeffs = makeMatrix(tmpVector); + + + std::map time = testObject(fluid, coeffs, exponent, true); + + char buff[100]; + std::map::iterator iter; + for (iter = time.begin(); iter != time.end(); ++iter) { + sprintf(buff, "%8.3f", iter->second); + std::cout << "Time consumption in " << iter->first << ": " << buff << " ns per call for 1e" << exponent << " calls." << std::endl; + } + + //std::cout << "Time consumption liquid: " << time_liq << " µs per call from 1e" << exponent << " calls." << std::endl; + + //std::cout << "Time consumption liquid: " << time_liq << " µs per call from 1e" << exponent << " calls." << std::endl; + //std::cout << "Time consumption solution: " << time_sol << " µs per call from 1e" << exponent << " calls." << std::endl; + + +// SecCoolSolution* obj = new MethanolSolution(); +// double x = 0.25; +// double T = 5.0 + 273.15; +// double p = 3e5; +// +// obj->testInputs(T + 00, p, x); +// obj->testInputs(T + 05, p, x); +// obj->testInputs(T + 10, p, x); +// obj->testInputs(T + 15, p, x); + +} + + + + + + + + +//double result = coefficients[0] * log(T); +//if (coefficients.size() > 1) { +// for (unsigned int i=1; i 1) { +// std::vector newCoeffs(coefficients.begin() + 1, coefficients.end()); +// result += polyint(newCoeffs,T); +//} diff --git a/dev/Tickets/77.py b/dev/Tickets/77.py new file mode 100644 index 00000000..c54f4dfe --- /dev/null +++ b/dev/Tickets/77.py @@ -0,0 +1,52 @@ +import matplotlib +matplotlib.use('Qt4Agg') + +import numpy +import CoolProp +import CoolProp.CoolProp as CP + + +print "Testing the derivatives and store results for "+CoolProp.__gitrevision__ + +keys = ["dpdT","dpdrho","Z","dZ_dDelta","dZ_dTau","B","dBdT","C","dCdT","phir","dphir_dTau","d2phir_dTau2","dphir_dDelta", + "d2phir_dDelta2","d2phir_dDelta_dTau","d3phir_dDelta2_dTau","phi0","dphi0_dTau","d2phi0_dTau2","dphi0_dDelta","d2phi0_dDelta2", + "IsothermalCompressibility"] + +multiply = ["VB","dBdT","VC","dCdT","dphir_dDelta","dpdT"] +keys = multiply[:] + +fluid = "n-Pentane" + +T = numpy.array([ 30,100,150,210])+273.15 +D = numpy.array([710, 20, 20,210]) + +for key in keys: + liquid = CP.DerivTerms(key,T[0],D[0],fluid) + twophase = CP.DerivTerms(key,T[1],D[1],fluid) + gaseous = CP.DerivTerms(key,T[2],D[2],fluid) + supercrit = CP.DerivTerms(key,T[3],D[3],fluid) + print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format(key,liquid,twophase,gaseous,supercrit) + +for key in keys: + liquid = CP.DerivTermsU(key,T[0],D[0],fluid,'SI') + twophase = CP.DerivTermsU(key,T[1],D[1],fluid,'SI') + gaseous = CP.DerivTermsU(key,T[2],D[2],fluid,'SI') + supercrit = CP.DerivTermsU(key,T[3],D[3],fluid,'SI') + print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format(key,liquid,twophase,gaseous,supercrit) + + +print +print "Testing Props: " +for key in keys: + liquid = CP.Props(key,"T",float(T[0]),"D",float(D[0]),fluid) + twophase = CP.Props(key,"T",float(T[1]),"D",float(D[1]),fluid) + gaseous = CP.Props(key,"T",float(T[2]),"D",float(D[2]),fluid) + supercrit = CP.Props(key,"T",float(T[3]),"D",float(D[3]),fluid) + print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format(key,liquid,twophase,gaseous,supercrit) + +for key in keys: + liquid = CP.PropsU(key,"T",float(T[0]),"D",float(D[0]),fluid,'SI') + twophase = CP.PropsU(key,"T",float(T[1]),"D",float(D[1]),fluid,'SI') + gaseous = CP.PropsU(key,"T",float(T[2]),"D",float(D[2]),fluid,'SI') + supercrit = CP.PropsU(key,"T",float(T[3]),"D",float(D[3]),fluid,'SI') + print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format(key,liquid,twophase,gaseous,supercrit) diff --git a/dev/Tickets/SF-72.py b/dev/Tickets/SF-72.py new file mode 100644 index 00000000..5fbc372c --- /dev/null +++ b/dev/Tickets/SF-72.py @@ -0,0 +1,16 @@ +import matplotlib +matplotlib.use('Qt4Agg') +from CoolProp.Plots.Plots import Ph, drawIsoLines +from CoolProp.Plots.SimpleCycles import SimpleCycle +from CoolProp.CoolProp import Props +import matplotlib.pyplot as plt + +Ref = 'Propane' +ax = Ph(Ref) +SimpleCycle(Ref,260,320,5,5,0.7) +#ax.set_xlim([200,900]) +#ax.set_ylim([300,530]) +quality = drawIsoLines(Ref, 'ph', 'Q', [0.2, 0.4, 0.6, 0.8] , axis=ax) +isobars = drawIsoLines(Ref, 'ph', 'T', [250.0, 300.0], axis=ax) +#isochores = drawIsoLines(Ref, 'Ts', 'D', [2, 600] , num=7, axis=ax) +plt.show() diff --git a/dev/Tickets/SF-73.py b/dev/Tickets/SF-73.py new file mode 100644 index 00000000..fc46f32c --- /dev/null +++ b/dev/Tickets/SF-73.py @@ -0,0 +1,23 @@ +import matplotlib +matplotlib.use('Qt4Agg') + +import matplotlib.pyplot +from CoolProp.Plots.Plots import drawIsoLines,getIsoLines,drawLines + +fluid = "n-Pentane" + +fig, ((ax1, ax2)) = matplotlib.pyplot.subplots(1, 2, sharey='row') + +drawIsoLines(fluid, 'Ts', 'Q', iValues=[0.0, 1.0], axis=ax1) # for predefined styles +drawIsoLines(fluid, 'Ts', 'Q', iValues=[0.3, 0.7], axis=ax1) # for predefined styles + +# Get the data points +saturation = getIsoLines(fluid, 'Ts', 'Q', [0.0, 1.0 ], axis=ax2) +quality = getIsoLines(fluid, 'Ts', 'Q', [0.3, 0.7 ], axis=ax2) +# define custom styles +plt_kwargs = {"color": "green","linewidth": 1.5} +drawLines(fluid,saturation,ax2,plt_kwargs=plt_kwargs) +plt_kwargs = {"color": "red","linewidth": 0.75} +drawLines(fluid,quality,ax2,plt_kwargs=plt_kwargs) + +matplotlib.pyplot.show() \ No newline at end of file diff --git a/dev/Tickets/SF-89.py b/dev/Tickets/SF-89.py new file mode 100644 index 00000000..fc007774 --- /dev/null +++ b/dev/Tickets/SF-89.py @@ -0,0 +1,34 @@ +''' +Created on 20 Sep 2013 + +@author: jowr +''' + +# New example with R407F mixture +from pyrp.refpropClasses import RefpropSI +import CoolProp.CoolProp as cp + +p = 30000 +T = 273.15 + +ref = False + +if ref: + xkg=[0.473194694453358,0.205109095413331,0.321696210133311] + names="R32|R125|R134a" + RP = RefpropSI() + RP.SETUPFLEX(xkg=xkg, FluidNames=names) + T_A,p_A,D_A,Dl_A,Dv_A,q_A,e_A,h_A,s_A,cv_A,cp_A,w_A = RP.PQFLSH(p, 0) + T_B,p_B,D_B,Dl_B,Dv_B,q_B,e_B,h_B,s_B,cv_B,cp_B,w_B = RP.PQFLSH(p, 1) + T_C,p_C,D_C,Dl_C,Dv_C,q_C,e_C,h_C,s_C,cv_C,cp_C,w_C = RP.TQFLSH(T, 0) + hlb = h_A/1000. + hrb = h_B/1000. + h200 = h_C/1000. + print "Refprop: ", hlb, hrb, h200 +else: + R407F='REFPROP-MIX:R32[0.473194694453358]&R125[0.205109095413331]&R134a[0.321696210133311]' + #R407F='REFPROP-MIX:R32[0.651669604033581]&R125[0.122438378639971]&R134a[0.225892017326446]' + hlb=cp.Props('H','P',30,'Q',0,R407F) # 30 kPa saturated liquid + hrb=cp.Props('H','P',30,'Q',1,R407F) # 30 kPa saturated vapour + h200=cp.Props('H','T',273.15,'Q',0,R407F) # saturated liquid at 0C IIR + print "CoolProp: ", hlb, hrb, h200 \ No newline at end of file diff --git a/dev/Tickets/makefile b/dev/Tickets/makefile new file mode 100644 index 00000000..86c85185 --- /dev/null +++ b/dev/Tickets/makefile @@ -0,0 +1,190 @@ +# ============================================================================ +# Name : Makefile +# Author : Jorrit Wronski (jowr@mek.dtu.dk) +# Version : 0.1 +# Copyright : Use and modify at your own risk. +# Description : Makefile for a CoolProp solver based on ExternalMedia. +# ============================================================================ +# The installation procedure should be as follows: +# 1) make header library +# 2) sudo make install +# ============================================================================ +# general commands: +RM := rm -f +CP := cp +CH := chmod 0644 +MK := mkdir -p +LD := ldconfig +LN := ln -sf +LT := libtool +AR := ar rvs + +# used for the output +MAJORVERSION =3 +MINORVERSION =3 +THENAME =CoolPropLib +LIBRARYEXTENSION =.a +THETEST =coolPropLibTest + +########################################################### +# Setting the directories for library, header and +# binary files created in this makefile. +########################################################### +SRCDIR =oFiles +# For Dymola integration +DYMDIR =/opt/dymola +LIBINST =$(DYMDIR)/bin/lib +HEADINST =$(DYMDIR)/source +# For OpenModelica integration +# LIBINST =/usr/lib/omc +# HEADINST =/usr/include/omc +# For system-wide installation +# LIBINST =/usr/local/lib +# HEADINST =/usr/local/include +BINDIR =./bin/LinuxGCC + +COOLPROPDIR=../../CoolProp + +LIBS = +OPTFLAGS =-O3 -funroll-loops -ffast-math# -ffloat-store # optimisation, remove for debugging + +# List of files to compile +OBJS = \ + $(SRCDIR)/basesolver.o \ + $(SRCDIR)/coolpropsolver.o \ + $(SRCDIR)/errorhandling.o \ + $(SRCDIR)/solvermap.o \ + $(SRCDIR)/testsolver.o + + +########################################################### +# Change these lines if you are using a different C++ +# compiler or if you would like to use other flags. +########################################################### +CPPC =g++ +DEBUGFLAGS =-g -O3 +CPPFLAGS =$(OPTFLAGS)# -Wall -pedantic -fbounds-check -ansi -Wpadded -Wpacked -malign-double -mpreferred-stack-boundary=8 + +.PHONY : install +LIBFILE =$(THENAME) +LIBRARY =lib$(THENAME) +HEADERFILE =$(THENAME) +HEADEREXTENSION =.h + + +########################################################### +# Change these lines if you have other needs regarding +# the generated shared library file. +########################################################### +ifeq ($(LIBRARYEXTENSION),.so) + install : install_dynamic + LIBFLAGS =-rdynamic -fPIC -shared -Wl,-soname,$(LIBRARY)$(LIBRARYEXTENSION).$(MAJORVERSION) +endif + + +########################################################### +# Change these lines if you have other needs regarding +# the generated static library file. +########################################################### +ifeq ($(LIBRARYEXTENSION),.a) + install : install_static + LIBFLAGS =-fPIC -static +endif + + +########################################################### +# Copy files to places recognised by the system. +########################################################### +.PHONY : install_dynamic +install_dynamic : header library + $(MK) $(HEADINST) $(LIBINST) + $(CP) $(BINDIR)/$(HEADERFILE)$(HEADEREXTENSION) $(HEADINST)/$(HEADERFILE)$(HEADEREXTENSION) + $(CP) $(BINDIR)/$(LIBRARY).so $(LIBINST)/$(LIBRARY).so.$(MAJORVERSION).$(MINORVERSION) + $(CH) $(HEADINST)/$(HEADERFILE)$(HEADEREXTENSION) + $(CH) $(LIBINST)/$(LIBRARY).so.$(MAJORVERSION).$(MINORVERSION) + $(LD) -l $(LIBINST)/$(LIBRARY).so.$(MAJORVERSION).$(MINORVERSION) + $(LN) $(LIBINST)/$(LIBRARY).so.$(MAJORVERSION) $(LIBINST)/$(LIBRARY).so + $(LD) + +.PHONY : install_static +install_static : header library + $(MK) $(HEADINST) $(LIBINST) + $(CP) $(BINDIR)/$(HEADERFILE)$(HEADEREXTENSION) $(HEADINST)/$(HEADERFILE)$(HEADEREXTENSION) + $(CP) $(BINDIR)/$(LIBRARY).a $(LIBINST)/$(LIBRARY).a + $(CH) $(HEADINST)/$(HEADERFILE)$(HEADEREXTENSION) + $(CH) $(LIBINST)/$(LIBRARY).a + $(LD) + +.PHONY : uninstall +uninstall : + $(RM) $(HEADINST)/$(HEADERFILE)$(HEADEREXTENSION) + $(RM) $(LIBINST)/$(LIBRARY)$(LIBRARYEXTENSION)* + $(RM) $(LIBINST)/$(LIBRARY).a + +.PHONY : all +all : header library + + +############################################################ +## Compile coolprop sources to static files +############################################################ +#COOLCPP_FILES := $(shell find $(COOLPROPDIR)/ -type f -name '*.cpp') +COOLCPP_FILES := $(wildcard $(COOLPROPDIR)/*.cpp) +COOLOBJ_FILES := $(addprefix $(SRCDIR)/,$(notdir $(COOLCPP_FILES:.cpp=.o))) + +# Define search path for prerequisite files +vpath %.cpp $(COOLPROPDIR):$(COOLPROPDIR)/purefluids:$(COOLPROPDIR)/pseudopurefluids:$(SRCDIR) + +.PHONY : coolprop +coolprop : $(COOLOBJ_FILES) + + +########################################################## +# Compile the C++ sources into a library file that can +# be used as shared or static object. +########################################################### +.PHONY : header +header : $(BINDIR)/$(HEADERFILE)$(HEADEREXTENSION) +$(BINDIR)/$(HEADERFILE)$(HEADEREXTENSION): $(SRCDIR)/$(HEADERFILE)$(HEADEREXTENSION) + $(MK) $(BINDIR) + $(CP) $(SRCDIR)/$(HEADERFILE)$(HEADEREXTENSION) $(BINDIR) + +.PHONY : library +library : $(BINDIR)/$(LIBRARY)$(LIBRARYEXTENSION) + +$(BINDIR)/$(LIBRARY).so: $(OBJS) $(COOLOBJ_FILES) $(SRCDIR)/$(LIBFILE).o + $(MK) $(BINDIR) + $(CPPC) $(LIBFLAGS) $(CPPFLAGS) -o $(BINDIR)/$(LIBRARY).so $(SRCDIR)/$(LIBFILE).o $(OBJS) + +$(BINDIR)/$(LIBRARY).a: $(OBJS) $(COOLOBJ_FILES) $(SRCDIR)/$(LIBFILE).o + $(MK) $(BINDIR) + $(AR) $(BINDIR)/$(LIBRARY).a $^ + + +########################################################### +# General rulesets for compilation. +########################################################### +.PHONY: clean +clean: + $(RM) **.o **.so **.a **.mod $(BINDIR)/* $(SRCDIR)/*.o + +$(SRCDIR)/%.o : %.cpp + $(CPPC) $(CPPFLAGS) -o $(SRCDIR)/$*.o -I$(COOLPROPDIR) -I$(COOLPROPDIR)/purefluids -I$(COOLPROPDIR)/pseudopurefluids -I$(SRCDIR) -c $< + +########################################################### +# Test cases +########################################################### +60 : 60.cpp $(COOLOBJ_FILES) + $(CPPC) $(CPPFLAGS) -g -o 60 -I$(COOLPROPDIR) -I$(COOLPROPDIR)/purefluids -I$(COOLPROPDIR)/pseudopurefluids -I$(SRCDIR) $< $(COOLOBJ_FILES) -ldl + + +############################################################ +## Create the documentation from annotations in the source +## files with DOXYGEN, a configuration file is needed. +############################################################ +#.PHONY : doc +#doc : doc/Doxyfile +# doxygen doc/Doxyfile +# cd doc/latex ; \ +# make all + diff --git a/dev/ancillaries/1-Butene_anc.json b/dev/ancillaries/1-Butene_anc.json new file mode 100644 index 00000000..4ee7164d --- /dev/null +++ b/dev/ancillaries/1-Butene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 87.800000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 419.28999999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.050033538550642298, + "t": [ + 0.539, + 0.946, + 3.545, + 3.783, + 4.496, + 18.106 + ], + "reducing_value": 4005100.0, + "T_r": 419.29, + "n": [ + 0.09749917163190837, + -6.023622095673614, + -9.978780101855465, + 11.257196162885533, + -4.937156322143673, + -1.4911743361627807 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 87.800000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 419.28999999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.49395022045438663, + "t": [ + 0.429, + 1.081, + 4.121, + 15.125, + 18.011, + 18.807 + ], + "reducing_value": 4240.0, + "T_r": 419.29, + "n": [ + -3.302882573914376, + -1.9359137327823328, + -4.362721415165588, + 24.301821574494937, + -191.8377573940649, + 174.69349121901325 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 87.800000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 419.28999999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.015396951311941187, + "t": [ + 1.037, + 1.176, + 1.95, + 3.798, + 5.373, + 16.675 + ], + "reducing_value": 4005100.0, + "T_r": 419.29, + "n": [ + -11.309717975642364, + 5.911539361818991, + -0.8939616477939638, + -2.3039589144938732, + -0.9566612009415151, + -1.297120238102156 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 87.800000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 419.28999999999928, + "using_tau_r": false, + "max_abserror_percentage": 0.24436140891674896, + "t": [ + 0.226, + 0.326, + 0.495, + 0.869, + 11.457, + 19.823 + ], + "reducing_value": 4240.0, + "T_r": 419.29, + "n": [ + -1.1329161154078617, + 4.576996342937427, + -2.35398267961107, + 1.6095202242190951, + 1.9936948858619448, + -8.666711070126212 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/AceticAcid_anc.json b/dev/ancillaries/AceticAcid_anc.json new file mode 100644 index 00000000..d7a82f45 --- /dev/null +++ b/dev/ancillaries/AceticAcid_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 289.80000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 590.69999999999902, + "using_tau_r": true, + "max_abserror_percentage": 0.90982856562435988, + "t": [ + 1.001, + 2.032, + 2.409, + 3.258, + 9.232, + 12.976 + ], + "reducing_value": 5817526.2731114905, + "T_r": 590.7, + "n": [ + -9.58174551112718, + 30.994111002740425, + -48.83655977160024, + 24.73248304349376, + -324.0927920320514, + 1917.3033191979387 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 289.80000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 590.69999999999902, + "using_tau_r": true, + "max_abserror_percentage": 5.3827356593878273, + "t": [ + 0.574, + 0.844, + 0.92, + 1.424, + 2.627, + 7.014 + ], + "reducing_value": 5844.938283446536, + "T_r": 590.7, + "n": [ + 5.220370341701724, + -209.98650746673673, + 244.24917360329798, + -62.1086537700349, + 23.792691599086265, + -76.09222369333516 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 289.80000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 590.69999999999902, + "using_tau_r": true, + "max_abserror_percentage": 0.56746473547253373, + "t": [ + 0.18, + 0.829, + 1.519, + 6.183, + 7.066, + 7.631 + ], + "reducing_value": 5817526.2731114905, + "T_r": 590.7, + "n": [ + 0.05089050119304307, + -5.285519841316859, + -3.071650825512276, + 210.76209320498046, + -975.2165852387217, + 844.4287532124403 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 289.80000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 590.69999999999902, + "using_tau_r": false, + "max_abserror_percentage": 4.2625496817117909, + "t": [ + 0.534, + 1.563, + 1.814, + 3.423, + 5.634, + 8.599 + ], + "reducing_value": 5844.938283446536, + "T_r": 590.7, + "n": [ + 4.940863127519307, + -49.93131631499533, + 64.19066221675779, + -44.40327764554098, + 85.91652398739252, + -146.7511477315432 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Acetone_anc.json b/dev/ancillaries/Acetone_anc.json new file mode 100644 index 00000000..acf718ec --- /dev/null +++ b/dev/ancillaries/Acetone_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 178.5, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 508.09999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.019812926978735046, + "t": [ + 0.001, + 0.884, + 0.945, + 1.521, + 3.503, + 6.996 + ], + "reducing_value": 4700000.0, + "T_r": 508.1, + "n": [ + -0.0016008456143345507, + 3.207344301426565, + -10.073384813177839, + 0.43583596844503064, + -3.5513036420695365, + -0.8398623740312517 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 178.5, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 508.09999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.73787041276290877, + "t": [ + 0.375, + 0.899, + 5.115, + 12.812, + 13.551, + 14.638 + ], + "reducing_value": 4699.999999999999, + "T_r": 508.1, + "n": [ + -2.7083518485413607, + -3.1091181958405696, + -11.940789313674161, + 6086.186843505146, + -12978.535578983987, + 7630.400461122001 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 178.5, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 508.09999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.13494503521895851, + "t": [ + 0.113, + 0.353, + 0.957, + 2.418, + 3.56, + 9.406 + ], + "reducing_value": 4700000.0, + "T_r": 508.1, + "n": [ + -0.012477394872974798, + 0.06335801593363936, + -6.63276705298341, + 0.18394326954846194, + -3.751763042387315, + -1.2246958566612094 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 178.5, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 508.09999999999917, + "using_tau_r": false, + "max_abserror_percentage": 0.29006434789575763, + "t": [ + 0.45, + 0.684, + 0.944, + 1.818, + 1.876, + 2.307 + ], + "reducing_value": 4699.999999999999, + "T_r": 508.1, + "n": [ + 7.78253597073335, + -18.960548358570204, + 22.83032556167124, + -224.35339428090518, + 232.0353784600054, + -16.31650346262528 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Air_anc.json b/dev/ancillaries/Air_anc.json new file mode 100644 index 00000000..b245a3ad --- /dev/null +++ b/dev/ancillaries/Air_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 59.750000000000007, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.53059999999968, + "using_tau_r": true, + "max_abserror_percentage": 0.11512750952304973, + "t": [ + 0.019, + 0.021, + 0.961, + 4.602, + 6.03, + 6.276 + ], + "reducing_value": 3786000.0, + "T_r": 132.5306, + "n": [ + -0.10395756133911474, + 0.09371835837432017, + -5.4508814466401105, + -7.290108160645587, + 45.79793382740606, + -43.51381453529352 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 59.750000000000007, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.53059999999968, + "using_tau_r": true, + "max_abserror_percentage": 25.735851251229036, + "t": [ + 0.163, + 1.939, + 12.953, + 17.863, + 19.161, + 19.309 + ], + "reducing_value": 11830.8, + "T_r": 132.5306, + "n": [ + -1.4696693336122673, + -11.996156433282422, + 283450.26225801674, + -128632031.37071271, + 2265337310.78254, + -2182091263.8119464 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 59.750000000000007, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.53059999999968, + "using_tau_r": true, + "max_abserror_percentage": 0.061025018657612229, + "t": [ + 0.106, + 1.124, + 1.466, + 1.724, + 5.497, + 6.121 + ], + "reducing_value": 3786000.0, + "T_r": 132.5306, + "n": [ + 0.003531827919765819, + -10.734886961617821, + 10.405219819890338, + -4.835531578778206, + -5.583509922169023, + 4.309143693912335 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 59.750000000000007, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 132.53059999999968, + "using_tau_r": false, + "max_abserror_percentage": 1.6905558486393302, + "t": [ + 0.012, + 0.502, + 1.346, + 2.91, + 4.116, + 8.191 + ], + "reducing_value": 11830.8, + "T_r": 132.5306, + "n": [ + 0.01192752147594885, + 3.009920365316921, + -2.664168754554584, + 11.846498652155946, + -18.66274199290547, + 35.85466989654467 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Ammonia_anc.json b/dev/ancillaries/Ammonia_anc.json new file mode 100644 index 00000000..8ed3b0f3 --- /dev/null +++ b/dev/ancillaries/Ammonia_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 195.495, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 405.39999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.051816320892128509, + "t": [ + 0.108, + 0.435, + 0.971, + 4.023, + 4.944, + 17.494 + ], + "reducing_value": 11333000.0, + "T_r": 405.4, + "n": [ + 0.0016131703802769548, + 0.01339903644956835, + -6.4517151211338994, + -4.349105787320862, + 1.8295554336003688, + 7.011533373126273 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 195.495, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 405.39999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.80251343075543602, + "t": [ + 0.037, + 0.04, + 0.584, + 0.585, + 2.858, + 6.099 + ], + "reducing_value": 13211.777154312385, + "T_r": 405.4, + "n": [ + 1.2911157089516188, + -1.4201786958021996, + -145.4871281248165, + 140.71212306607288, + -3.147462914747211, + -0.9907144617787934 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 195.495, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 405.39999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.05593199097324586, + "t": [ + 0.575, + 0.731, + 0.973, + 1.285, + 4.213, + 6.264 + ], + "reducing_value": 11333000.0, + "T_r": 405.4, + "n": [ + 0.26451389481308607, + -0.7119993599850943, + -5.639513556769752, + -0.4174451206068972, + -4.182083153326861, + 2.5564697890820667 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 195.495, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 405.39999999999924, + "using_tau_r": false, + "max_abserror_percentage": 0.89822358223980991, + "t": [ + 0.217, + 0.713, + 0.724, + 1.557, + 3.994, + 9.339 + ], + "reducing_value": 13211.777154312385, + "T_r": 405.4, + "n": [ + 0.6217530323464998, + 116.65648581323893, + -116.06575843470785, + 2.722640286484237, + -2.6080795358675433, + 18.393705416728867 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Argon_anc.json b/dev/ancillaries/Argon_anc.json new file mode 100644 index 00000000..5c9a90ae --- /dev/null +++ b/dev/ancillaries/Argon_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 83.806000000000012, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 150.68699999999976, + "using_tau_r": true, + "max_abserror_percentage": 0.010370375534973775, + "t": [ + 0.965, + 1.179, + 1.256, + 4.003, + 19.767, + 19.401 + ], + "reducing_value": 4863000.0, + "T_r": 150.687, + "n": [ + -3.7897875946469353, + -7.761670779754463, + 6.653230474151353, + -1.4673830883217576, + -252994.846480377, + 188134.93356309348 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 83.806000000000012, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 150.68699999999976, + "using_tau_r": true, + "max_abserror_percentage": 0.21261869573028225, + "t": [ + 0.29, + 0.329, + 0.839, + 2.946, + 6.496, + 11.57 + ], + "reducing_value": 13407.429658556124, + "T_r": 150.687, + "n": [ + 1.1883246645329462, + -3.0995804610072724, + -2.5097036910932267, + 0.6796303921537137, + -21.203752823276112, + 418.9717120034111 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 83.806000000000012, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 150.68699999999976, + "using_tau_r": true, + "max_abserror_percentage": 0.0076827157708958538, + "t": [ + 0.841, + 0.944, + 2.449, + 2.797, + 6.335, + 10.499 + ], + "reducing_value": 4863000.0, + "T_r": 150.687, + "n": [ + 1.274555697445016, + -6.537350082824229, + 2.3992572216415304, + -2.853795528373302, + -1.4260480922698553, + -1.2865724148178292 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 83.806000000000012, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 150.68699999999976, + "using_tau_r": false, + "max_abserror_percentage": 0.23496372624765005, + "t": [ + 0.272, + 0.417, + 2.551, + 7.589, + 8.392, + 10.436 + ], + "reducing_value": 13407.429658556124, + "T_r": 150.687, + "n": [ + 0.35549443267848707, + 1.7740534055789645, + 1.6692402958603285, + -1326.972748274678, + 3248.4827767066654, + -4246.807908907579 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Benzene_anc.json b/dev/ancillaries/Benzene_anc.json new file mode 100644 index 00000000..5a3cdc6b --- /dev/null +++ b/dev/ancillaries/Benzene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 278.67399999999998, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 562.01999999999862, + "using_tau_r": true, + "max_abserror_percentage": 0.090964966292772509, + "t": [ + 0.037, + 0.505, + 1.014, + 1.469, + 3.711, + 12.647 + ], + "reducing_value": 4894000.0, + "T_r": 562.02, + "n": [ + 0.005561906558935796, + -0.08662136922915314, + -6.964182734154488, + 1.1249288132278856, + -3.961859460597414, + -13.106880507410812 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 278.67399999999998, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 562.01999999999862, + "using_tau_r": true, + "max_abserror_percentage": 0.31355152586733936, + "t": [ + 0.067, + 0.387, + 0.865, + 2.692, + 2.792, + 15.611 + ], + "reducing_value": 3902.0, + "T_r": 562.02, + "n": [ + 0.016427739193323233, + -2.618439385733185, + -2.5904375872364365, + 23.553523125085235, + -27.279655904334827, + -452.1839777043696 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 278.67399999999998, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 562.01999999999862, + "using_tau_r": true, + "max_abserror_percentage": 0.19038766248324901, + "t": [ + 0.072, + 0.947, + 1.484, + 3.919, + 13.997, + 15.762 + ], + "reducing_value": 4894000.0, + "T_r": 562.02, + "n": [ + 0.006832468458489782, + -5.691705501741792, + -0.6464756350802751, + -3.158803952927384, + -1625.563215886021, + 4615.00105958263 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 278.67399999999998, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 562.01999999999862, + "using_tau_r": false, + "max_abserror_percentage": 0.35567494806839628, + "t": [ + 0.407, + 0.565, + 4.029, + 5.699, + 9.989, + 12.299 + ], + "reducing_value": 3902.0, + "T_r": 562.02, + "n": [ + 2.852587673922022, + -0.5596547795188646, + 14.872052666571532, + -66.42959110979461, + 1158.1329856052375, + -3128.774352224071 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/CarbonDioxide_anc.json b/dev/ancillaries/CarbonDioxide_anc.json new file mode 100644 index 00000000..ba88f8ae --- /dev/null +++ b/dev/ancillaries/CarbonDioxide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 216.59200000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 304.12819999999942, + "using_tau_r": true, + "max_abserror_percentage": 0.0017511543346171443, + "t": [ + 0.917, + 1.078, + 1.146, + 1.669, + 3.238, + 6.0 + ], + "reducing_value": 7377300.0, + "T_r": 304.1282, + "n": [ + -0.9288172663602211, + -16.600500683315147, + 11.947155561272234, + -0.6596029509652107, + -2.3639949455719274, + -3.6534929025030847 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 216.59200000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 304.12819999999942, + "using_tau_r": true, + "max_abserror_percentage": 0.035329219540658485, + "t": [ + 0.306, + 0.569, + 0.677, + 0.891, + 3.206, + 6.093 + ], + "reducing_value": 10624.906299999999, + "T_r": 304.1282, + "n": [ + -1.1635587811569494, + -3.64216164754343, + 2.7773118075713237, + -3.2573848494624533, + -1.9739104682508852, + -16.057319994659142 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 216.59200000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 304.12819999999942, + "using_tau_r": true, + "max_abserror_percentage": 0.0010595686337877552, + "t": [ + 0.983, + 1.322, + 1.488, + 2.807, + 3.571, + 1.941 + ], + "reducing_value": 7377300.0, + "T_r": 304.1282, + "n": [ + -5.867399337600407, + -7.10969550015274, + 11.022781986239263, + 4.8260764050219995, + -6.240803382557819, + -6.7009642572439 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 216.59200000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 304.12819999999942, + "using_tau_r": false, + "max_abserror_percentage": 0.044231974273145624, + "t": [ + 0.264, + 0.672, + 0.986, + 1.092, + 1.714, + 9.902 + ], + "reducing_value": 10624.906299999999, + "T_r": 304.1282, + "n": [ + 0.861951794789174, + 5.535795098719573, + -21.766373764605415, + 20.01416999278327, + -2.2218647220786862, + 888.2387848519858 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/CarbonMonoxide_anc.json b/dev/ancillaries/CarbonMonoxide_anc.json new file mode 100644 index 00000000..d83f0ada --- /dev/null +++ b/dev/ancillaries/CarbonMonoxide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 68.160000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.8599999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.065550513282530698, + "t": [ + 0.052, + 0.968, + 1.972, + 2.761, + 4.199, + 5.126 + ], + "reducing_value": 3494000.0, + "T_r": 132.86, + "n": [ + 0.0031655594711161982, + -5.386279334978247, + -0.44089436177701297, + 1.5403401817486662, + -5.692323589833758, + 3.03081959067228 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 68.160000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.8599999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.253613973167921, + "t": [ + 0.444, + 0.75, + 1.847, + 2.04, + 2.169, + 19.966 + ], + "reducing_value": 10850.0, + "T_r": 132.86, + "n": [ + -3.6459289142239206, + 1.5167962228564473, + -114.10174052209382, + 292.7876490687851, + -183.6056308954516, + 4746.634272544051 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 68.160000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 132.8599999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.092614792255218958, + "t": [ + 0.085, + 0.962, + 1.957, + 7.807, + 14.554, + 15.246 + ], + "reducing_value": 3494000.0, + "T_r": 132.86, + "n": [ + 0.00487539162619761, + -5.3196847481956775, + -0.24436526839538752, + -33.95291146838296, + 18449.37715414218, + -26736.728013355834 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 68.160000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 132.8599999999997, + "using_tau_r": false, + "max_abserror_percentage": 0.35662556345594787, + "t": [ + 0.44, + 0.672, + 1.334, + 3.874, + 4.413, + 9.257 + ], + "reducing_value": 10850.0, + "T_r": 132.86, + "n": [ + 3.973336124071812, + -3.262687458485425, + 3.3499432070659303, + -42.129174166388935, + 56.52859432308481, + -110.70022756120696 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/CarbonylSulfide_anc.json b/dev/ancillaries/CarbonylSulfide_anc.json new file mode 100644 index 00000000..7f870fb1 --- /dev/null +++ b/dev/ancillaries/CarbonylSulfide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 134.30000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 378.76999999999902, + "using_tau_r": true, + "max_abserror_percentage": 0.042743464291516986, + "t": [ + 1.05, + 1.227, + 1.785, + 6.353, + 8.207, + 11.103 + ], + "reducing_value": 6370000.0, + "T_r": 378.77, + "n": [ + -11.161617133348066, + 7.10392197545503, + -2.0123784114786365, + -8.915798275517139, + 13.747559787232735, + -11.14583161926877 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 134.30000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 378.76999999999902, + "using_tau_r": true, + "max_abserror_percentage": 0.33766247305977437, + "t": [ + 0.376, + 0.531, + 0.641, + 0.783, + 2.208, + 3.625 + ], + "reducing_value": 7410.0, + "T_r": 378.77, + "n": [ + 1.776086114558269, + -28.20299757513764, + 43.7268964289033, + -22.918757269308017, + 2.3656558943753296, + -4.806350485891986 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 134.30000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 378.76999999999902, + "using_tau_r": true, + "max_abserror_percentage": 0.019317469106150398, + "t": [ + 0.98, + 1.966, + 3.287, + 3.429, + 4.051, + 18.959 + ], + "reducing_value": 6370000.0, + "T_r": 378.77, + "n": [ + -5.898980404479669, + 1.4411942572733878, + -46.792325277477346, + 56.09470221996165, + -13.259873589238543, + -0.851491340049802 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 134.30000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 378.76999999999902, + "using_tau_r": false, + "max_abserror_percentage": 0.070152568429082685, + "t": [ + 0.187, + 0.539, + 0.811, + 0.921, + 1.495, + 1.774 + ], + "reducing_value": 7410.0, + "T_r": 378.77, + "n": [ + -0.006565517887508687, + 9.861398057771247, + -49.28678353119856, + 50.765489904412995, + -18.836456981431365, + 10.180262280869785 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/CycloHexane_anc.json b/dev/ancillaries/CycloHexane_anc.json new file mode 100644 index 00000000..e4a1c8e8 --- /dev/null +++ b/dev/ancillaries/CycloHexane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 279.47000000000003, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 553.59999999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.045955495698080107, + "t": [ + 0.957, + 1.635, + 1.682, + 3.513, + 4.809, + 5.858 + ], + "reducing_value": 4082400.0, + "T_r": 553.6, + "n": [ + -5.5748872145795225, + -21.018813932704997, + 21.45503312552939, + -7.489484892044892, + 11.013982397883915, + -10.70278385936846 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 279.47000000000003, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 553.59999999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.27946454665470633, + "t": [ + 0.395, + 0.432, + 0.604, + 0.994, + 4.823, + 18.36 + ], + "reducing_value": 3224.0, + "T_r": 553.6, + "n": [ + 7.91278554789447, + -14.912016731516744, + 5.351652597227101, + -3.875832207589477, + -6.953692859831638, + 3685.8600260352014 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 279.47000000000003, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 553.59999999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.023505661058897953, + "t": [ + 0.031, + 0.087, + 0.976, + 2.262, + 3.53, + 9.757 + ], + "reducing_value": 4082400.0, + "T_r": 553.6, + "n": [ + -0.001507316116386758, + 0.0019454414399892835, + -6.247176974611268, + 0.47954202162953397, + -3.680367872644098, + -5.145901784236558 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 279.47000000000003, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 553.59999999999877, + "using_tau_r": false, + "max_abserror_percentage": 0.11107314879914565, + "t": [ + 0.165, + 0.243, + 0.498, + 0.564, + 0.717, + 12.621 + ], + "reducing_value": 3224.0, + "T_r": 553.6, + "n": [ + 0.2729676351917065, + -1.106482113619369, + 27.748806842659924, + -34.01756141062687, + 9.815362300266182, + 65.7039717441813 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/CycloPropane_anc.json b/dev/ancillaries/CycloPropane_anc.json new file mode 100644 index 00000000..2eb8f219 --- /dev/null +++ b/dev/ancillaries/CycloPropane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.29999999999905, + "using_tau_r": true, + "max_abserror_percentage": 0.10977489544659047, + "t": [ + 0.135, + 0.181, + 0.421, + 0.983, + 6.3, + 16.644 + ], + "reducing_value": 5579700.0, + "T_r": 398.3, + "n": [ + -0.11955219361137283, + 0.18406121015183027, + -0.13653132075738866, + -5.797505519116896, + -20.62240936494475, + -324540.4065607637 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.29999999999905, + "using_tau_r": true, + "max_abserror_percentage": 1.9812724524870484, + "t": [ + 0.098, + 0.654, + 2.255, + 5.732, + 18.195, + 18.473 + ], + "reducing_value": 6142.9149, + "T_r": 398.3, + "n": [ + -0.33841331698570076, + -4.9703350919635545, + 5.62081036731097, + -352.4354033337558, + 14193580833.179937, + -19206776520.109684 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.29999999999905, + "using_tau_r": true, + "max_abserror_percentage": 0.1955382615515866, + "t": [ + 0.596, + 1.059, + 2.997, + 6.895, + 10.211, + 15.224 + ], + "reducing_value": 5579700.0, + "T_r": 398.3, + "n": [ + -0.3126990224115789, + -6.287859890805818, + 6.987582031173733, + -1037.2571651529406, + 45989.92002915465, + -4973989.497831943 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 398.29999999999905, + "using_tau_r": false, + "max_abserror_percentage": 1.0200689433471744, + "t": [ + 0.109, + 0.951, + 1.509, + 2.43, + 2.535, + 7.779 + ], + "reducing_value": 6142.9149, + "T_r": 398.3, + "n": [ + 0.36728670919821876, + 17.39312205196081, + -65.70893634663562, + 917.3256648476147, + -909.8353253919709, + 1550.3280904976405 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Cyclopentane_anc.json b/dev/ancillaries/Cyclopentane_anc.json new file mode 100644 index 00000000..0a0be522 --- /dev/null +++ b/dev/ancillaries/Cyclopentane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 179.69999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 511.719999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.028737273286005838, + "t": [ + 1.041, + 1.3, + 1.87, + 2.257, + 5.99, + 6.955 + ], + "reducing_value": 4571200.0, + "T_r": 511.72, + "n": [ + -9.601889908950373, + 3.974125106492668, + 2.6925579604302676, + -4.621940458120144, + -5.157782358169021, + 3.340182642033233 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 179.69999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 511.719999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.94766458281902999, + "t": [ + 0.602, + 1.076, + 3.895, + 8.292, + 8.939, + 18.105 + ], + "reducing_value": 3820.0000000000005, + "T_r": 511.72, + "n": [ + -5.935725453092267, + 1.591120947182766, + -8.958815994240467, + 198.61227335356796, + -245.69777423593865, + 469.5550522878147 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 179.69999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 511.719999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.069939629465454178, + "t": [ + 0.388, + 1.011, + 1.309, + 2.935, + 3.423, + 6.579 + ], + "reducing_value": 4571200.0, + "T_r": 511.72, + "n": [ + 0.005640145137827244, + -8.049357440969791, + 2.4664748335340834, + -1.3407752278951093, + -1.6536650781763431, + -1.270585253317597 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 179.69999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 511.719999999999, + "using_tau_r": false, + "max_abserror_percentage": 0.30360463662223447, + "t": [ + 0.545, + 1.142, + 2.232, + 6.456, + 11.186, + 11.952 + ], + "reducing_value": 3820.0000000000005, + "T_r": 511.72, + "n": [ + 4.175321169438228, + -3.3972763608243954, + 3.265444750596592, + -14.140653461920774, + 419.1357335784064, + -484.6437448434436 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/D4_anc.json b/dev/ancillaries/D4_anc.json new file mode 100644 index 00000000..2a219003 --- /dev/null +++ b/dev/ancillaries/D4_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 290.25, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 586.49999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.028925946446056727, + "t": [ + 0.87, + 0.876, + 2.397, + 4.259, + 10.207, + 13.645 + ], + "reducing_value": 1332000.0, + "T_r": 586.5, + "n": [ + 90.36983662049464, + -97.70779785443601, + -3.62818153879477, + -6.09127598868665, + -26.32182480105557, + 153.97714284240485 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 290.25, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 586.49999999999886, + "using_tau_r": true, + "max_abserror_percentage": 9.4736436869064971, + "t": [ + 0.114, + 0.23, + 1.834, + 3.647, + 11.227, + 16.17 + ], + "reducing_value": 1030.928, + "T_r": 586.5, + "n": [ + 1.4882997310050823, + -4.34717643630862, + -14.118092236565857, + 25.086940017821192, + -5022.733213778868, + 93552.36171295607 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 290.25, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 586.49999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.028925946608671094, + "t": [ + 0.893, + 1.059, + 1.151, + 2.074, + 4.392, + 16.257 + ], + "reducing_value": 1332000.0, + "T_r": 586.5, + "n": [ + 0.39146787698576685, + -22.07223693358694, + 15.421699054361437, + -4.2709891047524335, + -7.542128557150028, + 140.7032008919629 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 290.25, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 586.49999999999886, + "using_tau_r": false, + "max_abserror_percentage": 13.286210237431817, + "t": [ + 0.156, + 1.24, + 9.435, + 16.41, + 17.017, + 19.509 + ], + "reducing_value": 1030.928, + "T_r": 586.5, + "n": [ + 1.1098694118456651, + 3.8256536703025574, + -7151.436323591654, + 41771953.36308636, + -74286753.6277466, + 67304077.15677227 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/D5_anc.json b/dev/ancillaries/D5_anc.json new file mode 100644 index 00000000..a216561a --- /dev/null +++ b/dev/ancillaries/D5_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 300.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 619.14999999999895, + "using_tau_r": true, + "max_abserror_percentage": 0.01988979976886851, + "t": [ + 1.093, + 1.112, + 2.872, + 2.949, + 4.663, + 6.008 + ], + "reducing_value": 1160000.0, + "T_r": 619.15, + "n": [ + -99.31553985100548, + 92.69356966220938, + -97.33632140307553, + 97.2872457256767, + -19.31326240008969, + 11.743973719224405 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 300.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 619.14999999999895, + "using_tau_r": true, + "max_abserror_percentage": 4.0507892332894313, + "t": [ + 0.036, + 1.095, + 1.159, + 1.288, + 5.733, + 17.47 + ], + "reducing_value": 822.3684, + "T_r": 619.15, + "n": [ + -0.20715610476248955, + -587.5930484443458, + 903.2358019703372, + -328.35177101579325, + 2.7341269166587985, + -8600.632720165853 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 300.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 619.14999999999895, + "using_tau_r": true, + "max_abserror_percentage": 0.03414808081968479, + "t": [ + 0.699, + 0.709, + 0.956, + 1.042, + 2.171, + 3.725 + ], + "reducing_value": 1160000.0, + "T_r": 619.15, + "n": [ + -0.3938728785243184, + 1.0478083900910067, + -13.205862056465833, + 5.276152301686711, + -2.8042195945425252, + -6.355855261869247 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 300.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 619.14999999999895, + "using_tau_r": false, + "max_abserror_percentage": 3.8377648332722725, + "t": [ + 0.372, + 0.611, + 3.245, + 9.872, + 11.268, + 19.932 + ], + "reducing_value": 822.3684, + "T_r": 619.15, + "n": [ + 2.997850977428544, + -1.040443103596906, + 10.837940806333448, + -6631.038116112454, + 17457.941767023673, + -655905.0314011696 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/D6_anc.json b/dev/ancillaries/D6_anc.json new file mode 100644 index 00000000..65443769 --- /dev/null +++ b/dev/ancillaries/D6_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 270.19999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 645.77999999999838, + "using_tau_r": true, + "max_abserror_percentage": 0.076022532711061963, + "t": [ + 0.775, + 0.787, + 1.042, + 3.536, + 8.175, + 8.915 + ], + "reducing_value": 961000.0, + "T_r": 645.78, + "n": [ + 34.45481648119546, + -38.67596233295787, + -4.227731274421991, + -10.622093383403744, + 24.71517002775392, + -31.424451637388774 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 270.19999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 645.77999999999838, + "using_tau_r": true, + "max_abserror_percentage": 2.8375465327178273, + "t": [ + 0.522, + 0.588, + 1.175, + 9.309, + 10.264, + 13.23 + ], + "reducing_value": 627.2885477999996, + "T_r": 645.78, + "n": [ + -15.776270974992267, + 13.699167960267655, + -7.138110844583917, + -2782.2625154428233, + 5504.275783042545, + -5468.11384054501 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 270.19999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 645.77999999999838, + "using_tau_r": true, + "max_abserror_percentage": 0.030659882111727654, + "t": [ + 0.023, + 1.048, + 1.073, + 4.527, + 4.823, + 5.211 + ], + "reducing_value": 961000.0, + "T_r": 645.78, + "n": [ + 0.0009840543696606977, + -41.57124463279652, + 33.17839559625214, + -221.16595834771732, + 368.2016194959781, + -159.62000149415917 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 270.19999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 645.77999999999838, + "using_tau_r": false, + "max_abserror_percentage": 2.2116107086922021, + "t": [ + 0.59, + 0.719, + 0.755, + 3.132, + 14.519, + 14.971 + ], + "reducing_value": 627.2885477999996, + "T_r": 645.78, + "n": [ + 41.50050216018366, + -198.81152403352948, + 161.74986511225353, + -2.8794147964708507, + 15327.689037983815, + -19023.670087608214 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Deuterium_anc.json b/dev/ancillaries/Deuterium_anc.json new file mode 100644 index 00000000..90f02972 --- /dev/null +++ b/dev/ancillaries/Deuterium_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 18.724000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.0067171318805181457, + "t": [ + 1.026, + 1.438, + 1.474, + 1.966, + 15.756, + 18.491 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + -6.8424011367748685, + 21.870806001345017, + -19.797819519619072, + 0.8706987240797549, + -186.1498120750357, + 825.2792959297736 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 18.724000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.017418691130233199, + "t": [ + 0.266, + 0.576, + 1.105, + 1.725, + 2.526, + 3.959 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + -0.10109803867705139, + -4.563691481638655, + 3.3301365272696226, + -4.503537024711251, + 3.823445254078357, + -2.0240887330256525 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 18.724000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.005537849329229072, + "t": [ + 0.765, + 0.849, + 2.072, + 0.484, + 6.894, + 14.564 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + 4.632619255906051, + -8.969455942164178, + 0.5664073789158284, + -0.09981074464874193, + -0.3596187124547404, + -0.23569604663548424 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 18.724000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": false, + "max_abserror_percentage": 0.17429991279744872, + "t": [ + 0.281, + 0.319, + 1.913, + 1.992, + 6.17, + 19.493 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + -3.7327374059367657, + 5.717877520193506, + -7.7160148356330875, + 8.271326329456837, + -3.540310397292104, + 6126.25395082707 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/DimethylCarbonate_anc.json b/dev/ancillaries/DimethylCarbonate_anc.json new file mode 100644 index 00000000..48099da3 --- /dev/null +++ b/dev/ancillaries/DimethylCarbonate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 277.06, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 556.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.0056286265053384632, + "t": [ + 0.945, + 1.114, + 1.224, + 2.157, + 2.469, + 4.522 + ], + "reducing_value": 4908800.0, + "T_r": 557.0, + "n": [ + -2.597007649585314, + -15.509376515573363, + 12.767875905311987, + -1.7459847599351825, + -1.196780284722721, + -3.425253357555481 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 277.06, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 556.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.96309648652712632, + "t": [ + 0.318, + 0.882, + 0.995, + 3.273, + 5.755, + 13.354 + ], + "reducing_value": 4000.0, + "T_r": 557.0, + "n": [ + -1.8639798693880143, + -12.434353793968175, + 9.656910477455611, + -8.552325635675663, + 11.090574157797857, + -495.7580019137995 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 277.06, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 556.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.11227216504992032, + "t": [ + 0.964, + 4.159, + 4.654, + 5.049, + 9.147, + 11.03 + ], + "reducing_value": 4908800.0, + "T_r": 557.0, + "n": [ + -6.837266302374972, + 114.75387978395011, + -473.58556402509805, + 418.1739993231517, + -559.7253413542608, + 925.8612544918711 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 277.06, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 556.99999999999886, + "using_tau_r": false, + "max_abserror_percentage": 0.27167700173059695, + "t": [ + 0.221, + 0.307, + 0.394, + 5.545, + 5.765, + 19.705 + ], + "reducing_value": 4000.0, + "T_r": 557.0, + "n": [ + 0.8639422657944309, + -1.688248771620619, + 3.3308155638028083, + 152.44139464976624, + -173.70557844277656, + 36624.29817631924 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/DimethylEther_anc.json b/dev/ancillaries/DimethylEther_anc.json new file mode 100644 index 00000000..5119ba85 --- /dev/null +++ b/dev/ancillaries/DimethylEther_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 131.66, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 400.37799999999908, + "using_tau_r": true, + "max_abserror_percentage": 0.0092352896440162091, + "t": [ + 1.026, + 1.188, + 7.78, + 3.09, + 6.356, + 12.704 + ], + "reducing_value": 5336800.0, + "T_r": 400.378, + "n": [ + -9.576458382440794, + 3.8237850260211683, + 2.3534240536183586, + -2.349392868307698, + -3.348742284357154, + -1.2387250144815742 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 131.66, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 400.37799999999908, + "using_tau_r": true, + "max_abserror_percentage": 0.30997226646436449, + "t": [ + 0.499, + 0.75, + 2.338, + 11.224, + 12.48, + 12.984 + ], + "reducing_value": 5940.000000000001, + "T_r": 400.378, + "n": [ + -4.396808750959381, + 0.11053731401780381, + -2.8034901380765476, + -577.5554786721015, + 2817.238575530162, + -2327.667386669654 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 131.66, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 400.37799999999908, + "using_tau_r": true, + "max_abserror_percentage": 0.037699905539889667, + "t": [ + 0.636, + 0.966, + 1.377, + 1.958, + 3.842, + 9.564 + ], + "reducing_value": 5336800.0, + "T_r": 400.378, + "n": [ + 0.10722026973281615, + -6.488862377381296, + 0.623344116146438, + -0.4117944469977067, + -3.0220497491383966, + -0.9034795581048802 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 131.66, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 400.37799999999908, + "using_tau_r": false, + "max_abserror_percentage": 0.048778965755591486, + "t": [ + 0.572, + 0.658, + 0.713, + 0.916, + 2.977, + 19.393 + ], + "reducing_value": 5940.000000000001, + "T_r": 400.378, + "n": [ + 16.059795192018523, + -14.738564267851407, + -3.731150693384918, + 5.144676895857624, + 0.03490664751265221, + 8.503244669132489 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Ethane_anc.json b/dev/ancillaries/Ethane_anc.json new file mode 100644 index 00000000..ec096e67 --- /dev/null +++ b/dev/ancillaries/Ethane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 90.368000000000009, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 305.32199999999938, + "using_tau_r": true, + "max_abserror_percentage": 0.023914433726957007, + "t": [ + 0.871, + 0.902, + 1.663, + 2.045, + 3.946, + 14.704 + ], + "reducing_value": 4872200.0, + "T_r": 305.322, + "n": [ + 9.344483558228339, + -14.812636376983514, + -0.6873077210086483, + 0.7942400572322573, + -2.447274904672986, + 0.04047591478430641 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 90.368000000000009, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 305.32199999999938, + "using_tau_r": true, + "max_abserror_percentage": 0.16677527675037496, + "t": [ + 0.385, + 0.775, + 1.013, + 1.533, + 2.476, + 4.435 + ], + "reducing_value": 6856.886685, + "T_r": 305.322, + "n": [ + -2.6749170682059686, + 2.030707929009753, + -6.8230765701730345, + 4.330369494473089, + -2.442998212709984, + -2.2189277777818948 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 90.368000000000009, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 305.32199999999938, + "using_tau_r": true, + "max_abserror_percentage": 0.024435773999464949, + "t": [ + 0.674, + 0.972, + 1.942, + 3.341, + 4.772, + 7.604 + ], + "reducing_value": 4872200.0, + "T_r": 305.322, + "n": [ + 0.0708938064937161, + -5.874295125592951, + 0.47817350907541784, + -1.2607161303564414, + -1.4206996792387612, + 0.24201114919610817 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 90.368000000000009, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 305.32199999999938, + "using_tau_r": false, + "max_abserror_percentage": 0.26411535153354482, + "t": [ + 0.211, + 0.408, + 1.789, + 10.003, + 12.669, + 16.309 + ], + "reducing_value": 6856.886685, + "T_r": 305.322, + "n": [ + 0.2029526716447543, + 2.027464725614132, + 0.4378976432411991, + -13.592018000960584, + 57.55031435474073, + -88.68904612138073 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Ethanol_anc.json b/dev/ancillaries/Ethanol_anc.json new file mode 100644 index 00000000..69dbcd80 --- /dev/null +++ b/dev/ancillaries/Ethanol_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 159.09999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 514.7099999999989, + "using_tau_r": true, + "max_abserror_percentage": 0.042579590898705888, + "t": [ + 1.0, + 1.169, + 1.586, + 2.44, + 2.524, + 7.31 + ], + "reducing_value": 6268000.0, + "T_r": 514.71, + "n": [ + -11.192972756774067, + 5.91450813157208, + -5.1794840706987495, + 15.462343061602924, + -16.591379419702076, + -0.5994594761714971 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 159.09999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 514.7099999999989, + "using_tau_r": true, + "max_abserror_percentage": 6.3378677782403026, + "t": [ + 0.443, + 2.304, + 4.146, + 11.027, + 12.113, + 17.485 + ], + "reducing_value": 5930.0, + "T_r": 514.71, + "n": [ + -4.698337259111072, + -10.953380258011986, + 12.92351305172882, + -1017.0017776259273, + 1604.552160868234, + -1439.9265562459323 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 159.09999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 514.7099999999989, + "using_tau_r": true, + "max_abserror_percentage": 0.033827061431446204, + "t": [ + 0.971, + 2.322, + 3.072, + 3.934, + 4.465, + 19.972 + ], + "reducing_value": 6268000.0, + "T_r": 514.71, + "n": [ + -7.689152382102059, + -6.126637668761524, + 6.6239961045380715, + -7.827481023390803, + 3.1386332149218172, + -6.712235308208619 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 159.09999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 514.7099999999989, + "using_tau_r": false, + "max_abserror_percentage": 0.73711740977697726, + "t": [ + 0.596, + 1.495, + 1.561, + 2.737, + 3.606, + 4.943 + ], + "reducing_value": 5930.0, + "T_r": 514.71, + "n": [ + 7.824518623386008, + -338.93732001583646, + 368.3422016038343, + -90.14206962630433, + 80.35347134933373, + -26.00710239571597 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/EthylBenzene_anc.json b/dev/ancillaries/EthylBenzene_anc.json new file mode 100644 index 00000000..13a8b9e8 --- /dev/null +++ b/dev/ancillaries/EthylBenzene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 178.19999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.1199999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.065958151855349811, + "t": [ + 0.457, + 0.679, + 0.96, + 3.544, + 6.943, + 14.911 + ], + "reducing_value": 3622400.0, + "T_r": 617.12, + "n": [ + 0.026329220088491232, + -0.03275185377692519, + -6.510181837639293, + -3.8883599204862613, + -0.8922900194695055, + -1.9347736091269756 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 178.19999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.1199999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.48679789506540505, + "t": [ + 0.426, + 0.545, + 1.641, + 2.034, + 2.35, + 5.977 + ], + "reducing_value": 2741.016, + "T_r": 617.12, + "n": [ + -3.0745260331510194, + -0.9359433157855367, + -10.417112433984668, + 25.449706975048258, + -19.993854217365445, + -2.653264944314633 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 178.19999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.1199999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.029287453591875234, + "t": [ + 1.034, + 1.41, + 1.581, + 4.148, + 6.154, + 15.215 + ], + "reducing_value": 3622400.0, + "T_r": 617.12, + "n": [ + -10.470797927331965, + 13.630609834199861, + -10.464804307489011, + -3.597964571513027, + -0.24883120010409457, + -2.1658021554100957 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 178.19999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 617.1199999999991, + "using_tau_r": false, + "max_abserror_percentage": 0.23791944724731451, + "t": [ + 0.464, + 0.709, + 1.422, + 1.801, + 8.327, + 11.454 + ], + "reducing_value": 2741.016, + "T_r": 617.12, + "n": [ + 4.915675810263367, + -4.4212458698552295, + 5.72675775026962, + -3.746340117826641, + 4.221240347308843, + -7.214708107153519 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Ethylene_anc.json b/dev/ancillaries/Ethylene_anc.json new file mode 100644 index 00000000..6ef38e09 --- /dev/null +++ b/dev/ancillaries/Ethylene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 103.98900000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 282.3499999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.012376938726232911, + "t": [ + 1.118, + 1.461, + 2.464, + 4.298, + 1.082, + 18.676 + ], + "reducing_value": 5041800.0, + "T_r": 282.35, + "n": [ + 30.782068035093094, + -1.467121970937139, + 0.09230690543250192, + -2.5188888709008195, + -34.95537683446643, + 6.643870978349449 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 103.98900000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 282.3499999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.59591229149851266, + "t": [ + 0.165, + 0.497, + 1.478, + 5.546, + 19.239, + 19.774 + ], + "reducing_value": 7636.76598074554, + "T_r": 282.35, + "n": [ + -0.21894352062047293, + -3.4266486595099503, + -1.5160021065230918, + -4.205648419382292, + -265.8806216433561, + 474.2473840272181 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 103.98900000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 282.3499999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.012820987213224555, + "t": [ + 1.088, + 1.096, + 1.84, + 4.252, + 5.735, + 7.077 + ], + "reducing_value": 5041800.0, + "T_r": 282.35, + "n": [ + -124.41031297062331, + 119.37497252523112, + -0.6700941331427409, + -1.4552049349494574, + -2.380793838058247, + 1.8286241499129299 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 103.98900000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 282.3499999999994, + "using_tau_r": false, + "max_abserror_percentage": 0.085675036863686049, + "t": [ + 0.348, + 0.912, + 3.94, + 6.912, + 7.065, + 7.198 + ], + "reducing_value": 7636.76598074554, + "T_r": 282.35, + "n": [ + 1.8464339723391994, + 0.7268516869915771, + -1.717280185311927, + 1686.1315441396878, + -3729.1628980234227, + 2049.0293383014655 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Fluorine_anc.json b/dev/ancillaries/Fluorine_anc.json new file mode 100644 index 00000000..be4cae70 --- /dev/null +++ b/dev/ancillaries/Fluorine_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 53.481100000000005, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 144.41399999999967, + "using_tau_r": true, + "max_abserror_percentage": 0.80121304951740191, + "t": [ + 0.056, + 0.84, + 1.353, + 4.898, + 19.085, + 19.761 + ], + "reducing_value": 5172400.0, + "T_r": 144.414, + "n": [ + 0.032041854896500264, + -3.429417910548146, + -2.362258815038421, + -1.0111386038971053, + -7008.9949851880765, + 9283.126473335162 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 53.481100000000005, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 144.41399999999967, + "using_tau_r": true, + "max_abserror_percentage": 0.43897421479124343, + "t": [ + 0.135, + 0.425, + 0.545, + 1.021, + 5.359, + 14.59 + ], + "reducing_value": 15603.0, + "T_r": 144.414, + "n": [ + 0.209065655538512, + -5.869062694341366, + 3.6459137875713985, + -2.7710544718284704, + -3.720164757549319, + 23.40559168423325 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 53.481100000000005, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 144.41399999999967, + "using_tau_r": true, + "max_abserror_percentage": 1.2165925957978718, + "t": [ + 0.232, + 0.237, + 1.167, + 2.758, + 3.128, + 19.84 + ], + "reducing_value": 5172400.0, + "T_r": 144.414, + "n": [ + 12.274163862138828, + -12.629879444828052, + -6.708762919300672, + 14.195071764394564, + -14.772924246299883, + 219.66568736007514 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 53.481100000000005, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 144.41399999999967, + "using_tau_r": false, + "max_abserror_percentage": 0.046804259511246116, + "t": [ + 0.329, + 0.371, + 3.558, + 5.918, + 18.297, + 18.795 + ], + "reducing_value": 15603.0, + "T_r": 144.414, + "n": [ + -2.1267466372809594, + 4.293457721465353, + 1.136882153895534, + -2.83890898830727, + 5360.59971312227, + -6438.621729396981 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/HFE143m_anc.json b/dev/ancillaries/HFE143m_anc.json new file mode 100644 index 00000000..f348dbf7 --- /dev/null +++ b/dev/ancillaries/HFE143m_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 240.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 377.9209999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.2108735480769508, + "t": [ + 0.09, + 0.523, + 0.651, + 0.961, + 5.664, + 9.521 + ], + "reducing_value": 3635000.0, + "T_r": 377.921, + "n": [ + 0.014478661107695035, + -0.6242585291517511, + 1.2296456508104718, + -7.2843842540973975, + -31.628487819979497, + 535.477430612564 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 240.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 377.9209999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.99092940193322709, + "t": [ + 0.431, + 1.003, + 1.102, + 6.066, + 17.199, + 19.918 + ], + "reducing_value": 4648.140744, + "T_r": 377.921, + "n": [ + -4.266199685018297, + 14.465655413880627, + -17.190892941379516, + 61.40354293923954, + -19753752.67110767, + 257263004.36371782 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 240.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 377.9209999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.030182989158467066, + "t": [ + 0.01, + 0.898, + 0.985, + 2.475, + 3.907, + 9.142 + ], + "reducing_value": 3635000.0, + "T_r": 377.921, + "n": [ + 0.003507005166582647, + -0.9977558588652533, + -5.540224394968286, + -0.31084593640695357, + -3.79461617284861, + 4.758257690910974 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 240.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 377.9209999999992, + "using_tau_r": false, + "max_abserror_percentage": 0.68049633810052246, + "t": [ + 0.367, + 0.39, + 7.315, + 7.402, + 12.039, + 14.608 + ], + "reducing_value": 4648.140744, + "T_r": 377.921, + "n": [ + 0.335183935046017, + 2.07566462116046, + 112192.72531570093, + -126522.90717969429, + 891195.9272871091, + -5911298.633294987 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Helium_anc.json b/dev/ancillaries/Helium_anc.json new file mode 100644 index 00000000..e9879332 --- /dev/null +++ b/dev/ancillaries/Helium_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 2.1768000000000103, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 5.1952999999999872, + "using_tau_r": true, + "max_abserror_percentage": 0.009844391348079462, + "t": [ + 0.896, + 0.945, + 2.116, + 2.72, + 6.555, + 14.771 + ], + "reducing_value": 227600.0, + "T_r": 5.1953, + "n": [ + 2.1680719893011937, + -5.75952731195631, + 1.295833335273841, + 0.42681936101289836, + 0.49626229940990035, + -11.083693322102567 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 2.1768000000000103, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 5.1952999999999872, + "using_tau_r": true, + "max_abserror_percentage": 0.069437850935172296, + "t": [ + 0.211, + 0.693, + 0.749, + 1.118, + 1.846, + 19.915 + ], + "reducing_value": 18130.0, + "T_r": 5.1953, + "n": [ + -0.8412289332631507, + -3.590072534944493, + 2.2788760536554777, + -1.4459129841887175, + 2.0638632716793297, + -14.547720153618606 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 2.1768000000000103, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 5.1952999999999872, + "using_tau_r": true, + "max_abserror_percentage": 0.0090469902516265854, + "t": [ + 0.981, + 1.13, + 1.536, + 3.109, + 0.338, + 14.431 + ], + "reducing_value": 227600.0, + "T_r": 5.1953, + "n": [ + -2.5589967099484343, + -2.1208869241528903, + 2.0304814035943877, + 0.9702906562630098, + -0.006217789170073319, + -4.338734244510393 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 2.1768000000000103, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 5.1952999999999872, + "using_tau_r": false, + "max_abserror_percentage": 0.01468301830127583, + "t": [ + 0.402, + 0.491, + 0.941, + 1.784, + 8.213, + 9.042 + ], + "reducing_value": 18130.0, + "T_r": 5.1953, + "n": [ + 1.8225767219916278, + -0.5212838519553242, + 0.2130685389843537, + -0.44861224586106435, + 5.329845315529739, + -10.020970811883176 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/HydrogenSulfide_anc.json b/dev/ancillaries/HydrogenSulfide_anc.json new file mode 100644 index 00000000..d2302470 --- /dev/null +++ b/dev/ancillaries/HydrogenSulfide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 187.69999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 373.09999999999945, + "using_tau_r": true, + "max_abserror_percentage": 0.019173536478978015, + "t": [ + 0.512, + 0.974, + 1.577, + 2.795, + 3.791, + 7.388 + ], + "reducing_value": 9000000.0, + "T_r": 373.1, + "n": [ + 0.016005313259314074, + -5.84689331691651, + 0.378166392177876, + -0.33675173635383543, + -1.6596226528944937, + -1.8779907937289753 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 187.69999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 373.09999999999945, + "using_tau_r": true, + "max_abserror_percentage": 0.1081652393724486, + "t": [ + 0.532, + 0.681, + 0.691, + 1.195, + 6.002, + 9.033 + ], + "reducing_value": 10190.0, + "T_r": 373.1, + "n": [ + -5.046830785558678, + -38.485729404620876, + 41.23869786806366, + -2.8100720902410004, + -10.142249397446074, + 21.5382763129489 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 187.69999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 373.09999999999945, + "using_tau_r": true, + "max_abserror_percentage": 0.014061247541108379, + "t": [ + 1.003, + 1.146, + 1.668, + 4.886, + 1.558, + 9.098 + ], + "reducing_value": 9000000.0, + "T_r": 373.1, + "n": [ + -6.761826097619247, + -0.005988209650772923, + -6.882637639835571, + -2.8254550876910356, + 7.704835506786447, + 1.7417891509345698 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 187.69999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 373.09999999999945, + "using_tau_r": false, + "max_abserror_percentage": 0.12757076402429846, + "t": [ + 0.572, + 0.586, + 2.075, + 3.069, + 4.223, + 4.619 + ], + "reducing_value": 10190.0, + "T_r": 373.1, + "n": [ + 51.601033693983716, + -49.93595719794271, + 6.987088261412919, + -24.784697586038508, + 84.07792676768513, + -68.55133880200839 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Hydrogen_anc.json b/dev/ancillaries/Hydrogen_anc.json new file mode 100644 index 00000000..e7326b64 --- /dev/null +++ b/dev/ancillaries/Hydrogen_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 13.957000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.144999999999925, + "using_tau_r": true, + "max_abserror_percentage": 0.0065220369257157351, + "t": [ + 0.882, + 1.072, + 1.355, + 2.61, + 8.191, + 1.239 + ], + "reducing_value": 1296400.0, + "T_r": 33.145, + "n": [ + -0.5553870929135406, + -7.0852972599030295, + 0.006868538454095541, + 0.8295514415153659, + -0.08773773693832483, + 3.754274235303921 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 13.957000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.144999999999925, + "using_tau_r": true, + "max_abserror_percentage": 0.55513289857728187, + "t": [ + 0.473, + 6.618, + 7.083, + 9.094, + 10.577, + 19.579 + ], + "reducing_value": 15508.0, + "T_r": 33.145, + "n": [ + -3.036644018774332, + -773.9211864728516, + 1530.809493601263, + -3087.995404817007, + 3472.491545729249, + -15649.585518005188 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 13.957000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.144999999999925, + "using_tau_r": true, + "max_abserror_percentage": 0.016301560853715369, + "t": [ + 0.99, + 1.155, + 2.009, + 2.408, + 8.137, + 2.924 + ], + "reducing_value": 1296400.0, + "T_r": 33.145, + "n": [ + -4.544068673862971, + -0.13186072974088692, + 3.0474002305782255, + -3.0615550520928423, + -0.302424110535371, + 1.7087746430267654 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 13.957000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 33.144999999999925, + "using_tau_r": false, + "max_abserror_percentage": 0.83233215883319334, + "t": [ + 0.407, + 3.401, + 7.095, + 8.095, + 10.911, + 17.353 + ], + "reducing_value": 15508.0, + "T_r": 33.145, + "n": [ + 1.9546584452513824, + -5.715534926385584, + 714.2366728890577, + -1666.5447521212081, + 2698.8598951804593, + -12755.576112629806 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/IsoButane_anc.json b/dev/ancillaries/IsoButane_anc.json new file mode 100644 index 00000000..d903ede0 --- /dev/null +++ b/dev/ancillaries/IsoButane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 113.73000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 407.81699999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.019699846909193575, + "t": [ + 1.082, + 1.108, + 1.463, + 4.045, + 13.157, + 14.042 + ], + "reducing_value": 3629000.0, + "T_r": 407.817, + "n": [ + -48.02915589537987, + 43.34653680580028, + -1.4421317283854331, + -3.1322275225078413, + 5.203481182010376, + -6.173022897817098 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 113.73000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 407.81699999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.4922366156330571, + "t": [ + 0.37, + 0.502, + 1.021, + 2.003, + 3.403, + 10.717 + ], + "reducing_value": 3879.756788283995, + "T_r": 407.817, + "n": [ + -2.8656855559386294, + 0.7330458189287201, + -4.254613288675131, + 2.9956235180226516, + -5.671641417558254, + 0.14361022568133902 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 113.73000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 407.81699999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.025709437298837567, + "t": [ + 0.83, + 0.964, + 2.071, + 2.407, + 3.825, + 15.511 + ], + "reducing_value": 3629000.0, + "T_r": 407.817, + "n": [ + 0.4893216106119911, + -6.629467799666135, + 0.27190214385479383, + -0.013142408151644676, + -3.250782332365992, + -0.43922387424664594 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 113.73000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 407.81699999999915, + "using_tau_r": false, + "max_abserror_percentage": 0.26628224832738745, + "t": [ + 0.356, + 0.824, + 3.142, + 3.696, + 6.863, + 18.441 + ], + "reducing_value": 3879.756788283995, + "T_r": 407.817, + "n": [ + 2.0418147224188545, + 0.4363922893974425, + 1.915261424521202, + -2.1807762762122045, + 1.068664850362356, + -6.816247938174933 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/IsoButene_anc.json b/dev/ancillaries/IsoButene_anc.json new file mode 100644 index 00000000..b4449f78 --- /dev/null +++ b/dev/ancillaries/IsoButene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 132.40000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.08999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.14741018682782325, + "t": [ + 1.284, + 1.548, + 1.685, + 2.003, + 2.638, + 10.608 + ], + "reducing_value": 4009800.0, + "T_r": 418.09, + "n": [ + -76.08135715558664, + 397.01813873870134, + -453.7794701448892, + 150.79295360094682, + -27.032450330527833, + -1.1837914833355219 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 132.40000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.08999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.35084693470349704, + "t": [ + 0.507, + 0.607, + 1.205, + 1.898, + 3.194, + 18.774 + ], + "reducing_value": 4170.0, + "T_r": 418.09, + "n": [ + -8.729642476739642, + 6.811506526700638, + -6.411697069038467, + 5.7983193722867306, + -6.559199615514519, + -12.258975766186447 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 132.40000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.08999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.14739891561160734, + "t": [ + 0.354, + 0.969, + 4.231, + 10.316, + 16.968, + 18.914 + ], + "reducing_value": 4009800.0, + "T_r": 418.09, + "n": [ + 0.01737687722206489, + -6.134166125080951, + -3.853515831640818, + 8.384924413254762, + -243.10740943312803, + 365.4747247586171 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 132.40000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 418.08999999999907, + "using_tau_r": false, + "max_abserror_percentage": 0.62482383951145692, + "t": [ + 0.444, + 0.979, + 1.37, + 2.24, + 3.344, + 13.946 + ], + "reducing_value": 4170.0, + "T_r": 418.09, + "n": [ + 3.836064588981606, + -8.505454480687774, + 12.985006905703951, + -10.011005004151073, + 5.376836540123832, + -10.94925598220989 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Isohexane_anc.json b/dev/ancillaries/Isohexane_anc.json new file mode 100644 index 00000000..5c78420a --- /dev/null +++ b/dev/ancillaries/Isohexane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 119.60000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 497.69999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.18413094904935479, + "t": [ + 0.975, + 2.959, + 4.02, + 10.581, + 12.501, + 19.839 + ], + "reducing_value": 3040000.0, + "T_r": 497.7, + "n": [ + -6.550843209159344, + -0.2014408451919986, + -4.035853789894501, + 7.869057237839601, + -14.261734955415386, + 11.66884264219962 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 119.60000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 497.69999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.2247646109777679, + "t": [ + 0.464, + 0.777, + 1.511, + 3.227, + 5.307, + 19.158 + ], + "reducing_value": 2715.0000000000005, + "T_r": 497.7, + "n": [ + -3.4838373689586257, + -1.3801826623957218, + -0.41695283944559747, + -3.629169326872457, + -1.7995609906492396, + -3.545077267428688 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 119.60000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 497.69999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.084324290662629586, + "t": [ + 0.17, + 0.876, + 0.993, + 4.223, + 6.496, + 8.675 + ], + "reducing_value": 3040000.0, + "T_r": 497.7, + "n": [ + 0.005399475579081403, + -0.9497359767020471, + -5.626629157486642, + -5.792071323162001, + 5.1034637608227875, + -4.718394261757678 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 119.60000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 497.69999999999891, + "using_tau_r": false, + "max_abserror_percentage": 0.11167499755682098, + "t": [ + 0.607, + 0.679, + 1.285, + 2.085, + 2.358, + 2.566 + ], + "reducing_value": 2715.0000000000005, + "T_r": 497.7, + "n": [ + 29.736674024252952, + -32.776310208283974, + 12.807786215246882, + -39.16424989170224, + 54.00461957755715, + -21.62958726811339 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Isopentane_anc.json b/dev/ancillaries/Isopentane_anc.json new file mode 100644 index 00000000..60a5d068 --- /dev/null +++ b/dev/ancillaries/Isopentane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 112.65000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 460.34999999999889, + "using_tau_r": true, + "max_abserror_percentage": 0.016885314228098913, + "t": [ + 1.02, + 1.348, + 1.678, + 4.158, + 11.692, + 14.291 + ], + "reducing_value": 3378000.0, + "T_r": 460.35, + "n": [ + -8.6020554503746, + 4.597427498957886, + -2.60028502453596, + -3.205323615957216, + 0.893056340939176, + -3.317655495530999 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 112.65000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 460.34999999999889, + "using_tau_r": true, + "max_abserror_percentage": 1.1809305044249263, + "t": [ + 0.192, + 0.477, + 1.313, + 5.085, + 6.047, + 14.238 + ], + "reducing_value": 3271.0, + "T_r": 460.35, + "n": [ + -0.293842156388657, + -3.3757748736495574, + -2.160437982604624, + -8.713491274417024, + 4.916720756118398, + -0.9275607204099507 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 112.65000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 460.34999999999889, + "using_tau_r": true, + "max_abserror_percentage": 0.051564707572182567, + "t": [ + 0.984, + 1.34, + 3.251, + 3.271, + 6.059, + 15.448 + ], + "reducing_value": 3378000.0, + "T_r": 460.35, + "n": [ + -6.666263491957704, + 0.4857997813609446, + 43.79186706759248, + -46.695896367051155, + -0.7987335343861153, + -2.152696717962993 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 112.65000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 460.34999999999889, + "using_tau_r": false, + "max_abserror_percentage": 0.56090599200631086, + "t": [ + 0.335, + 0.852, + 2.009, + 4.806, + 14.584, + 15.417 + ], + "reducing_value": 3271.0, + "T_r": 460.35, + "n": [ + 1.90090139367392, + 0.5608577220827222, + 0.291792033747788, + -0.22951340206902662, + 50.602054710991816, + -59.20907806248923 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Krypton_anc.json b/dev/ancillaries/Krypton_anc.json new file mode 100644 index 00000000..e2c887ed --- /dev/null +++ b/dev/ancillaries/Krypton_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 115.77000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 209.47999999999951, + "using_tau_r": true, + "max_abserror_percentage": 0.009085871871139517, + "t": [ + 0.822, + 0.961, + 1.811, + 2.937, + 13.131, + 15.629 + ], + "reducing_value": 5525000.0, + "T_r": 209.48, + "n": [ + 0.6286380394785566, + -6.084114621397644, + 0.9243637669284523, + -1.2177291623316775, + -484.84085075238977, + 2458.926650746003 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 115.77000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 209.47999999999951, + "using_tau_r": true, + "max_abserror_percentage": 0.25111252948395446, + "t": [ + 0.487, + 0.544, + 1.593, + 3.18, + 4.851, + 14.775 + ], + "reducing_value": 10850.0, + "T_r": 209.48, + "n": [ + -5.11839525888464, + 1.8524855046540656, + -2.3327083913774804, + 5.670498376648386, + -13.437817551364956, + 2923.704628658189 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 115.77000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 209.47999999999951, + "using_tau_r": true, + "max_abserror_percentage": 0.015707812164222901, + "t": [ + 0.967, + 1.232, + 1.347, + 2.625, + 14.831, + 16.938 + ], + "reducing_value": 5525000.0, + "T_r": 209.48, + "n": [ + -4.031170740728375, + -7.4067462119583105, + 6.97753623737674, + -1.177175552979292, + -3320.220246352347, + 14166.599178573982 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 115.77000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 209.47999999999951, + "using_tau_r": false, + "max_abserror_percentage": 0.83074070055602078, + "t": [ + 0.423, + 1.611, + 2.063, + 6.632, + 12.833, + 19.438 + ], + "reducing_value": 10850.0, + "T_r": 209.48, + "n": [ + 2.546150113785161, + -5.378194265123711, + 8.373146326331726, + -116.81279901170906, + 18068.951065200818, + -1719409.740660462 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MD2M_anc.json b/dev/ancillaries/MD2M_anc.json new file mode 100644 index 00000000..7d30d80b --- /dev/null +++ b/dev/ancillaries/MD2M_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 205.19999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 599.3999999999985, + "using_tau_r": true, + "max_abserror_percentage": 0.044312950276337304, + "t": [ + 0.905, + 0.908, + 1.689, + 2.4, + 3.317, + 9.992 + ], + "reducing_value": 1227000.0, + "T_r": 599.4, + "n": [ + 156.1113572601426, + -164.62126787390693, + 1.542332070759232, + -1.6595566560133137, + -7.331305000038265, + -3.9960179968946954 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 205.19999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 599.3999999999985, + "using_tau_r": true, + "max_abserror_percentage": 1.4890727440140417, + "t": [ + 0.113, + 0.533, + 2.232, + 6.521, + 9.438, + 15.582 + ], + "reducing_value": 914.6616014999984, + "T_r": 599.4, + "n": [ + -0.11322403921855548, + -5.400575739692096, + -5.64304102079293, + -25.864491940816304, + 53.18850232422741, + -132.89980126138155 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 205.19999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 599.3999999999985, + "using_tau_r": true, + "max_abserror_percentage": 0.015911818413938406, + "t": [ + 0.947, + 1.036, + 1.62, + 1.908, + 3.756, + 13.562 + ], + "reducing_value": 1227000.0, + "T_r": 599.4, + "n": [ + -2.4298546077341765, + -8.21698111216424, + 10.985237560743148, + -10.371245604660867, + -6.479810115178545, + -7.618743506292183 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 205.19999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 599.3999999999985, + "using_tau_r": false, + "max_abserror_percentage": 0.74585995879379308, + "t": [ + 0.425, + 0.548, + 1.612, + 1.969, + 12.198, + 13.895 + ], + "reducing_value": 914.6616014999984, + "T_r": 599.4, + "n": [ + 5.149366412867287, + -3.74559401424497, + 5.916251369639319, + -4.86398948926266, + 119.61817797890352, + -210.7258774176346 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MD3M_anc.json b/dev/ancillaries/MD3M_anc.json new file mode 100644 index 00000000..a57e487f --- /dev/null +++ b/dev/ancillaries/MD3M_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 192.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 628.35999999999876, + "using_tau_r": true, + "max_abserror_percentage": 0.062049678581188594, + "t": [ + 0.991, + 1.154, + 3.408, + 7.711, + 11.313, + 18.134 + ], + "reducing_value": 945000.0, + "T_r": 628.36, + "n": [ + -8.949699956067297, + 0.4122742171095244, + -9.899582759727936, + 1.1051818846570594, + -10.457795793253178, + 11.86348703188236 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 192.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 628.35999999999876, + "using_tau_r": true, + "max_abserror_percentage": 1.0903119335155309, + "t": [ + 0.071, + 0.343, + 0.856, + 2.418, + 2.94, + 16.829 + ], + "reducing_value": 685.7981626999992, + "T_r": 628.36, + "n": [ + 0.01880314261439147, + -2.1886134791566874, + -5.398887457148687, + 9.132545382573525, + -19.85612989152667, + -35.776997465430505 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 192.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 628.35999999999876, + "using_tau_r": true, + "max_abserror_percentage": 0.025890264817562958, + "t": [ + 1.015, + 1.281, + 2.914, + 3.079, + 4.049, + 12.555 + ], + "reducing_value": 945000.0, + "T_r": 628.36, + "n": [ + -10.453673923336904, + 2.481740868042947, + -11.432996001913109, + 6.601821622186919, + -5.964966309512551, + -7.694099935065695 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 192.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 628.35999999999876, + "using_tau_r": false, + "max_abserror_percentage": 0.94124028801232384, + "t": [ + 0.371, + 0.453, + 1.774, + 2.156, + 3.401, + 7.268 + ], + "reducing_value": 685.7981626999992, + "T_r": 628.36, + "n": [ + 3.908835698000551, + -1.7671208917208399, + 9.16107326877534, + -11.915428003947813, + 5.425025736986464, + -2.1727181064864802 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MD4M_anc.json b/dev/ancillaries/MD4M_anc.json new file mode 100644 index 00000000..4a295cc7 --- /dev/null +++ b/dev/ancillaries/MD4M_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 300.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 653.19999999999868, + "using_tau_r": true, + "max_abserror_percentage": 0.20790820946308131, + "t": [ + 0.966, + 2.034, + 4.287, + 6.824, + 9.507, + 17.511 + ], + "reducing_value": 877000.0, + "T_r": 653.2, + "n": [ + -8.820757645392687, + -0.6127877907019101, + -26.27913889220715, + 82.26487645325933, + -215.38757534143105, + 3331.0966160078788 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 300.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 653.19999999999868, + "using_tau_r": true, + "max_abserror_percentage": 2.5748730719093893, + "t": [ + 0.153, + 0.35, + 0.973, + 4.373, + 8.956, + 18.867 + ], + "reducing_value": 606.0605999999999, + "T_r": 653.2, + "n": [ + 0.08238189107832351, + -2.7968804624045727, + -5.583554214981622, + -20.6920569486233, + 43.02594538959137, + -1155.2598160559462 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 300.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 653.19999999999868, + "using_tau_r": true, + "max_abserror_percentage": 0.05180314650858886, + "t": [ + 0.125, + 0.991, + 1.833, + 2.613, + 6.567, + 7.481 + ], + "reducing_value": 877000.0, + "T_r": 653.2, + "n": [ + 0.0015071534393996235, + -9.893122006817906, + 5.185077005280204, + -11.792071053769893, + -19.9746561375169, + 17.061168452194554 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 300.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 653.19999999999868, + "using_tau_r": false, + "max_abserror_percentage": 1.555158530110734, + "t": [ + 0.108, + 0.596, + 0.925, + 11.068, + 18.766, + 18.948 + ], + "reducing_value": 606.0605999999999, + "T_r": 653.2, + "n": [ + 0.4199342334140303, + 3.429189550022302, + -1.2153016662432385, + 531.3835498635794, + -2384171.350540733, + 2608505.566671457 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MDM_anc.json b/dev/ancillaries/MDM_anc.json new file mode 100644 index 00000000..f83df56b --- /dev/null +++ b/dev/ancillaries/MDM_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 187.19999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 564.08999999999912, + "using_tau_r": true, + "max_abserror_percentage": 0.024851468537323562, + "t": [ + 0.987, + 1.546, + 3.846, + 4.039, + 4.551, + 13.863 + ], + "reducing_value": 1415000.0, + "T_r": 564.09, + "n": [ + -7.936889046270078, + 0.4885306005155446, + -67.10334672914131, + 81.16754242307255, + -22.935610159360184, + -8.42878077834636 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 187.19999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 564.08999999999912, + "using_tau_r": true, + "max_abserror_percentage": 1.1286811681511688, + "t": [ + 0.361, + 0.403, + 0.889, + 4.368, + 9.333, + 12.182 + ], + "reducing_value": 1085.436621399999, + "T_r": 564.09, + "n": [ + -4.654136197604254, + 2.746428492946218, + -4.932262158034249, + -13.972748625767835, + 41.66694309398031, + -76.16608993524603 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 187.19999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 564.08999999999912, + "using_tau_r": true, + "max_abserror_percentage": 0.041863143666120983, + "t": [ + 0.935, + 0.957, + 3.712, + 3.946, + 8.929, + 15.706 + ], + "reducing_value": 1415000.0, + "T_r": 564.09, + "n": [ + 7.151644754758889, + -14.810015370529984, + -15.36961787983751, + 8.076060116129836, + -3.6452117116809757, + -5.057768713626933 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 187.19999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 564.08999999999912, + "using_tau_r": false, + "max_abserror_percentage": 2.071265696090907, + "t": [ + 0.223, + 0.968, + 3.92, + 10.353, + 13.555, + 19.388 + ], + "reducing_value": 1085.436621399999, + "T_r": 564.09, + "n": [ + 1.45291315657308, + 2.312272976677222, + -4.874255044402854, + 307.6934209444335, + -1382.6177281292519, + 4631.49982640604 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MM_anc.json b/dev/ancillaries/MM_anc.json new file mode 100644 index 00000000..53b640cf --- /dev/null +++ b/dev/ancillaries/MM_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 518.74999999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.20111645178579884, + "t": [ + 0.855, + 1.041, + 2.576, + 4.341, + 11.815, + 16.363 + ], + "reducing_value": 1939000.0, + "T_r": 518.75, + "n": [ + -1.9009492315036665, + -5.340645245910856, + -0.9843148559865389, + -6.609078226952975, + 347.0300616124387, + -6398.298737379578 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 518.74999999999898, + "using_tau_r": true, + "max_abserror_percentage": 16.01032229517174, + "t": [ + 0.662, + 2.85, + 3.956, + 6.268, + 12.261, + 13.876 + ], + "reducing_value": 1589.825, + "T_r": 518.75, + "n": [ + -7.501839129825876, + 109.24138401462254, + -471.55475994248695, + 1970.622943483528, + -204421.66641651493, + 484946.5588455783 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 518.74999999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.20111645182863125, + "t": [ + 0.941, + 1.326, + 2.071, + 7.44, + 8.26, + 13.747 + ], + "reducing_value": 1939000.0, + "T_r": 518.75, + "n": [ + -6.066365670683859, + -1.017358368453696, + -1.2952535297950865, + -359.85773789162744, + 626.9902185535459, + -3052.796872382347 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 518.74999999999898, + "using_tau_r": false, + "max_abserror_percentage": 17.956753927465808, + "t": [ + 0.712, + 1.429, + 3.552, + 4.879, + 15.966, + 18.374 + ], + "reducing_value": 1589.825, + "T_r": 518.75, + "n": [ + 10.867417370343293, + -26.426060451546014, + 247.0862159714223, + -573.747985737039, + 1763408.557605998, + -8586317.70489454 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Methane_anc.json b/dev/ancillaries/Methane_anc.json new file mode 100644 index 00000000..9cee07ea --- /dev/null +++ b/dev/ancillaries/Methane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 90.69410000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 190.56399999999954, + "using_tau_r": true, + "max_abserror_percentage": 0.0043709218045084874, + "t": [ + 0.935, + 1.03, + 1.204, + 3.176, + 5.616, + 5.744 + ], + "reducing_value": 4599200.0, + "T_r": 190.564, + "n": [ + -0.36511751226395045, + -7.477611035699516, + 2.8218785804602344, + -0.3138277099613026, + -14.181166200304828, + 13.10811727353235 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 90.69410000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 190.56399999999954, + "using_tau_r": true, + "max_abserror_percentage": 0.043503419703461166, + "t": [ + 0.392, + 0.606, + 0.631, + 1.024, + 2.03, + 4.077 + ], + "reducing_value": 10139.127999999999, + "T_r": 190.564, + "n": [ + -3.258091004501641, + 24.278993697870174, + -25.256402428812585, + -0.17494067187770526, + 0.3375209723239743, + -2.3099699792209805 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 90.69410000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 190.56399999999954, + "using_tau_r": true, + "max_abserror_percentage": 0.013146758390991664, + "t": [ + 0.963, + 1.421, + 1.438, + 1.98, + 6.338, + 6.911 + ], + "reducing_value": 4599200.0, + "T_r": 190.564, + "n": [ + -4.392486530162625, + -81.28318843036807, + 82.94698441608203, + -2.6879045537986053, + -5.671070893658749, + 4.700510293996553 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 90.69410000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 190.56399999999954, + "using_tau_r": false, + "max_abserror_percentage": 0.038166309983322932, + "t": [ + 0.309, + 0.502, + 1.402, + 3.858, + 10.533, + 19.547 + ], + "reducing_value": 10139.127999999999, + "T_r": 190.564, + "n": [ + 1.0459450372370667, + 1.137482950365497, + 0.25267850508364803, + -0.15127345979918666, + 11.30484305385285, + -1807.5949062134612 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Methanol_anc.json b/dev/ancillaries/Methanol_anc.json new file mode 100644 index 00000000..9c4d3797 --- /dev/null +++ b/dev/ancillaries/Methanol_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 175.61000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 512.49999999999875, + "using_tau_r": true, + "max_abserror_percentage": 1.1479027322796709, + "t": [ + 0.061, + 0.608, + 0.825, + 2.846, + 4.042, + 4.296 + ], + "reducing_value": 8215850.0, + "T_r": 512.5, + "n": [ + -0.0447244507994909, + 2.329401753678273, + -9.196622819856332, + -10.174860953774617, + 45.49763577474272, + -39.730762470567974 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 175.61000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 512.49999999999875, + "using_tau_r": true, + "max_abserror_percentage": 5.0615028494839231, + "t": [ + 0.155, + 0.626, + 0.74, + 1.164, + 1.17, + 15.066 + ], + "reducing_value": 8520.024867237415, + "T_r": 512.5, + "n": [ + -1.4150575213461603, + 54.70138118736733, + -107.17903730678354, + 3012.9973099493213, + -2968.802266130763, + -23.433991775839367 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 175.61000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 512.49999999999875, + "using_tau_r": true, + "max_abserror_percentage": 0.61631458418456297, + "t": [ + 0.054, + 0.298, + 0.728, + 1.284, + 3.131, + 3.97 + ], + "reducing_value": 8215850.0, + "T_r": 512.5, + "n": [ + -0.06786072630620305, + 0.37064921000560125, + -3.6850178941332135, + -5.531504842398972, + -0.1261742218723768, + -1.6655134662275959 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 175.61000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 512.49999999999875, + "using_tau_r": false, + "max_abserror_percentage": 5.4672241933203303, + "t": [ + 0.182, + 2.205, + 2.877, + 4.603, + 4.808, + 17.68 + ], + "reducing_value": 8520.024867237415, + "T_r": 512.5, + "n": [ + 1.3068237510561265, + 70.59427259347439, + -189.29658717018955, + 1579.5702126119343, + -1503.171465635914, + 1224.7374907070093 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MethylLinoleate_anc.json b/dev/ancillaries/MethylLinoleate_anc.json new file mode 100644 index 00000000..0db9da24 --- /dev/null +++ b/dev/ancillaries/MethylLinoleate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 260.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 798.99999999999795, + "using_tau_r": true, + "max_abserror_percentage": 0.13450920287816359, + "t": [ + 1.073, + 1.412, + 2.055, + 2.984, + 5.287, + 15.159 + ], + "reducing_value": 1341000.0, + "T_r": 799.0, + "n": [ + -17.49464366704072, + 15.511858887435276, + -10.309720586604545, + -1.9170805644980973, + -9.188455129890633, + -32.94817697994078 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 260.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 798.99999999999795, + "using_tau_r": true, + "max_abserror_percentage": 0.28491630688036729, + "t": [ + 0.546, + 0.747, + 1.49, + 2.948, + 5.104, + 18.424 + ], + "reducing_value": 808.4, + "T_r": 799.0, + "n": [ + -7.912131975217505, + 2.6748252367096508, + -2.3670343724631104, + -6.595246957741222, + -9.264633405839822, + -78.68814362793601 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 260.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 798.99999999999795, + "using_tau_r": true, + "max_abserror_percentage": 0.072643244755310477, + "t": [ + 1.011, + 1.432, + 2.308, + 3.026, + 4.993, + 11.346 + ], + "reducing_value": 1341000.0, + "T_r": 799.0, + "n": [ + -11.729759799987315, + 5.322853500770345, + -3.812792691428419, + -5.15160188466974, + -6.055964294506463, + -15.97775168800555 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 260.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 798.99999999999795, + "using_tau_r": false, + "max_abserror_percentage": 0.9143880760876244, + "t": [ + 0.184, + 0.675, + 0.837, + 1.161, + 1.603, + 3.506 + ], + "reducing_value": 808.4, + "T_r": 799.0, + "n": [ + -0.0228594977906372, + 42.06993524981283, + -74.81792414596138, + 55.25382502520959, + -21.334266315162196, + 3.1025069538411154 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MethylLinolenate_anc.json b/dev/ancillaries/MethylLinolenate_anc.json new file mode 100644 index 00000000..b54ff82c --- /dev/null +++ b/dev/ancillaries/MethylLinolenate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 260.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 771.99999999999807, + "using_tau_r": true, + "max_abserror_percentage": 0.54708614769352071, + "t": [ + 0.933, + 3.57, + 7.793, + 10.595, + 11.348, + 17.586 + ], + "reducing_value": 1369000.0, + "T_r": 772.0, + "n": [ + -10.101654974432517, + -12.424614583587427, + -9.022283253969261, + 467.2464970064283, + -630.9836783638218, + 508.3275711810897 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 260.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 771.99999999999807, + "using_tau_r": true, + "max_abserror_percentage": 0.926818751631453, + "t": [ + 0.443, + 0.755, + 1.565, + 2.595, + 4.024, + 4.333 + ], + "reducing_value": 847.3000000000001, + "T_r": 772.0, + "n": [ + -2.012921006619591, + -9.777603995624053, + 16.334676098140577, + -44.688343682216974, + 150.07731250993606, + -135.66611431468743 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 260.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 771.99999999999807, + "using_tau_r": true, + "max_abserror_percentage": 0.053345180846797735, + "t": [ + 1.067, + 1.304, + 2.092, + 3.573, + 8.295, + 16.56 + ], + "reducing_value": 1369000.0, + "T_r": 772.0, + "n": [ + -25.171539708995944, + 21.300715242539297, + -10.547301052562263, + -5.070148438171643, + -8.2157358110308, + -17.156009546790635 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 260.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 771.99999999999807, + "using_tau_r": false, + "max_abserror_percentage": 0.46363532488210568, + "t": [ + 0.451, + 0.512, + 0.614, + 0.912, + 1.32, + 15.284 + ], + "reducing_value": 847.3000000000001, + "T_r": 772.0, + "n": [ + -3.4225866559516347, + 10.532089346925508, + 0.07661846074876404, + -8.087103457644357, + 4.322469536788842, + 17.275840082570898 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MethylOleate_anc.json b/dev/ancillaries/MethylOleate_anc.json new file mode 100644 index 00000000..a474b68e --- /dev/null +++ b/dev/ancillaries/MethylOleate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 253.47, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 781.99999999999841, + "using_tau_r": true, + "max_abserror_percentage": 0.23214229920596186, + "t": [ + 0.558, + 0.889, + 1.288, + 3.168, + 5.744, + 8.704 + ], + "reducing_value": 1246000.0, + "T_r": 782.0, + "n": [ + 0.2957281056815285, + -8.97309766389781, + 0.48815590360975863, + -11.34276864250449, + 1.3234559810331799, + -12.138231210442147 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 253.47, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 781.99999999999841, + "using_tau_r": true, + "max_abserror_percentage": 1.5762205724130562, + "t": [ + 0.587, + 2.009, + 2.281, + 2.773, + 3.897, + 19.484 + ], + "reducing_value": 812.8499999999999, + "T_r": 782.0, + "n": [ + -8.749977488567636, + 146.83338074209553, + -279.87451233611756, + 163.6376571116443, + -46.10327133274694, + -23.68509985467464 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 253.47, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 781.99999999999841, + "using_tau_r": true, + "max_abserror_percentage": 0.11174255597712346, + "t": [ + 0.868, + 0.906, + 1.48, + 2.404, + 5.545, + 12.862 + ], + "reducing_value": 1246000.0, + "T_r": 782.0, + "n": [ + 14.372838414798984, + -25.63700682166794, + 6.6378551150443315, + -11.23105485250874, + -7.468648794751394, + -12.617144053602795 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 253.47, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 781.99999999999841, + "using_tau_r": false, + "max_abserror_percentage": 0.60431773124831611, + "t": [ + 0.506, + 0.525, + 0.762, + 2.134, + 2.905, + 3.06 + ], + "reducing_value": 812.8499999999999, + "T_r": 782.0, + "n": [ + -31.454521040135862, + 43.736786126817, + -12.491996989544091, + 23.664196742286585, + -120.4823599211856, + 101.35825428360955 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MethylPalmitate_anc.json b/dev/ancillaries/MethylPalmitate_anc.json new file mode 100644 index 00000000..4aece74a --- /dev/null +++ b/dev/ancillaries/MethylPalmitate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 302.70999999999998, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 754.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.065165772138509048, + "t": [ + 1.148, + 1.368, + 1.624, + 2.975, + 3.32, + 19.755 + ], + "reducing_value": 1350000.0, + "T_r": 755.0, + "n": [ + -49.42161889019046, + 86.39453424481549, + -53.20027068141909, + 29.0638839763908, + -32.30173734463781, + -268.73594683826116 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 302.70999999999998, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 754.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 1.7980953783183873, + "t": [ + 0.489, + 0.54, + 1.177, + 3.065, + 4.389, + 11.027 + ], + "reducing_value": 897.0, + "T_r": 755.0, + "n": [ + 4.227092755463742, + -12.213864670363002, + 2.57530354383432, + -18.011755302716594, + 8.945678039029339, + -44.300913375832856 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 302.70999999999998, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 754.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.12342121485954261, + "t": [ + 0.239, + 0.727, + 0.805, + 2.404, + 3.104, + 8.976 + ], + "reducing_value": 1350000.0, + "T_r": 755.0, + "n": [ + -0.011940892490673904, + 7.849609411099398, + -16.067278854042087, + -0.6012546974739778, + -8.893944946368688, + -8.042731785344714 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 302.70999999999998, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 754.99999999999886, + "using_tau_r": false, + "max_abserror_percentage": 0.57114391348419558, + "t": [ + 0.572, + 0.956, + 1.766, + 2.722, + 4.689, + 7.482 + ], + "reducing_value": 897.0, + "T_r": 755.0, + "n": [ + 8.115113277917509, + -10.668602921854127, + 14.100804969050921, + -14.920857658639772, + 14.097757694754387, + -11.701003403802398 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/MethylStearate_anc.json b/dev/ancillaries/MethylStearate_anc.json new file mode 100644 index 00000000..611c63fe --- /dev/null +++ b/dev/ancillaries/MethylStearate_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 311.83999999999997, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 774.99999999999818, + "using_tau_r": true, + "max_abserror_percentage": 0.13363643736091779, + "t": [ + 0.748, + 0.895, + 1.963, + 2.132, + 6.214, + 17.278 + ], + "reducing_value": 1239000.0, + "T_r": 775.0, + "n": [ + 2.1826956545780285, + -12.589076401149699, + 36.04270465112389, + -42.212867821373706, + -6.8647834615185905, + -3.7675034486843777 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 311.83999999999997, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 774.99999999999818, + "using_tau_r": true, + "max_abserror_percentage": 1.3802020091006062, + "t": [ + 0.619, + 1.153, + 2.581, + 5.272, + 8.552, + 19.512 + ], + "reducing_value": 794.3, + "T_r": 775.0, + "n": [ + -10.55735551534245, + 7.1258533777053925, + -17.33588775317371, + 16.369396695687463, + -63.311014763601946, + 2762.728336814682 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 311.83999999999997, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 774.99999999999818, + "using_tau_r": true, + "max_abserror_percentage": 0.15764897185486237, + "t": [ + 0.664, + 0.819, + 3.044, + 9.45, + 11.829, + 12.153 + ], + "reducing_value": 1239000.0, + "T_r": 775.0, + "n": [ + 2.6436427867349583, + -11.177503211907963, + -10.568451768935507, + 49.28771091585409, + -1399.884100808372, + 1433.3172721140306 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 311.83999999999997, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 774.99999999999818, + "using_tau_r": false, + "max_abserror_percentage": 0.51789917613281888, + "t": [ + 0.623, + 0.963, + 1.129, + 2.549, + 16.434, + 19.506 + ], + "reducing_value": 794.3, + "T_r": 775.0, + "n": [ + 13.378627444826547, + -39.36472953109966, + 31.2494017978262, + -2.5577833084230965, + 1973.9623113227108, + -8032.142511402829 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Neon_anc.json b/dev/ancillaries/Neon_anc.json new file mode 100644 index 00000000..e9713131 --- /dev/null +++ b/dev/ancillaries/Neon_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 24.560000000000009, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 44.491799999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.017457744592808133, + "t": [ + 0.019, + 0.9, + 1.026, + 1.808, + 2.247, + 0.954 + ], + "reducing_value": 2680000.0, + "T_r": 44.4918, + "n": [ + -0.00074500795037099, + -3.682372301668146, + -9.78153179091002, + 4.096945170441814, + -2.9886393690120436, + 7.178339654951069 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 24.560000000000009, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 44.491799999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.15713045396883452, + "t": [ + 0.408, + 0.648, + 1.315, + 2.286, + 2.901, + 11.792 + ], + "reducing_value": 23882.0, + "T_r": 44.4918, + "n": [ + -1.3474639960955583, + -2.7571994490012472, + 0.009650364682861507, + 2.0354003457571044, + -3.227001419324544, + 122.46077167651404 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 24.560000000000009, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 44.491799999999877, + "using_tau_r": true, + "max_abserror_percentage": 0.036571478006885982, + "t": [ + 0.076, + 1.009, + 2.164, + 2.343, + 6.682, + 12.207 + ], + "reducing_value": 2680000.0, + "T_r": 44.4918, + "n": [ + -0.0017954742954479522, + -5.7544156318060145, + 10.008689055942176, + -9.753815610717622, + 3.2233602357652944, + -76.50213334811278 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 24.560000000000009, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 44.491799999999877, + "using_tau_r": false, + "max_abserror_percentage": 0.43961955076889936, + "t": [ + 0.361, + 0.489, + 3.226, + 3.371, + 3.443, + 9.965 + ], + "reducing_value": 23882.0, + "T_r": 44.4918, + "n": [ + 0.22207659869985238, + 2.4573200546328224, + -1969.4302835894664, + 6749.387057643627, + -4813.477464106806, + 591.6954480241219 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Neopentane_anc.json b/dev/ancillaries/Neopentane_anc.json new file mode 100644 index 00000000..61f49c4b --- /dev/null +++ b/dev/ancillaries/Neopentane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 256.60000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 433.73999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.009973909412830384, + "t": [ + 1.011, + 1.701, + 2.3, + 2.345, + 2.698, + 6.49 + ], + "reducing_value": 3196000.0, + "T_r": 433.74, + "n": [ + -7.502312156089728, + 11.000117855992295, + -400.6256764267208, + 433.78538017962705, + -45.58182775735909, + -0.7322302008433458 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 256.60000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 433.73999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.60125359151609326, + "t": [ + 0.423, + 1.041, + 1.753, + 1.863, + 2.594, + 3.606 + ], + "reducing_value": 3270.0, + "T_r": 433.74, + "n": [ + -3.7861930152056065, + 8.462476541870759, + -339.50200633681567, + 403.5197007430728, + -111.52402460892499, + 41.26753585967676 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 256.60000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 433.73999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.011877907135438015, + "t": [ + 0.973, + 0.987, + 1.865, + 2.411, + 9.003, + 11.534 + ], + "reducing_value": 3196000.0, + "T_r": 433.74, + "n": [ + 1.4023117580169653, + -7.971208710752704, + 2.5306662744660664, + -3.6491716187944356, + -72.03663743646202, + 323.50182182555415 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 256.60000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 433.73999999999927, + "using_tau_r": false, + "max_abserror_percentage": 0.54613350915639902, + "t": [ + 0.385, + 0.435, + 3.763, + 4.175, + 6.202, + 16.14 + ], + "reducing_value": 3270.0, + "T_r": 433.74, + "n": [ + 2.811511709838611, + -0.6819933999019258, + 143.31340246450836, + -250.44132450192117, + 324.6743119533206, + -196312.80251857708 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Nitrogen_anc.json b/dev/ancillaries/Nitrogen_anc.json new file mode 100644 index 00000000..e7c0aa21 --- /dev/null +++ b/dev/ancillaries/Nitrogen_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 63.15100000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 126.19199999999978, + "using_tau_r": true, + "max_abserror_percentage": 0.019454812939090349, + "t": [ + 0.828, + 0.92, + 1.504, + 6.063, + 6.367, + 17.079 + ], + "reducing_value": 3395800.0, + "T_r": 126.192, + "n": [ + 2.1205259142559174, + -7.392634943403662, + -0.035642342804864474, + -35.2799454218023, + 37.082077471298724, + -429.32504477212177 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 63.15100000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 126.19199999999978, + "using_tau_r": true, + "max_abserror_percentage": 0.098901043557630963, + "t": [ + 0.369, + 0.556, + 0.878, + 1.049, + 4.174, + 6.303 + ], + "reducing_value": 11183.901464580624, + "T_r": 126.192, + "n": [ + -2.412387653165135, + 1.2535963572601478, + -6.375300212535008, + 3.257106728291224, + -3.263645679265735, + 1.2673447905058262 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 63.15100000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 126.19199999999978, + "using_tau_r": true, + "max_abserror_percentage": 0.0057005558882883278, + "t": [ + 0.945, + 0.976, + 1.134, + 4.43, + 4.942, + 6.222 + ], + "reducing_value": 3395800.0, + "T_r": 126.192, + "n": [ + 7.557523110967278, + -15.31423072093374, + 2.530452363947435, + -3.5464937257192077, + 2.4443140451500853, + -1.089727092432518 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 63.15100000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 126.19199999999978, + "using_tau_r": false, + "max_abserror_percentage": 0.045724092678578465, + "t": [ + 0.396, + 0.549, + 1.037, + 1.209, + 1.682, + 2.819 + ], + "reducing_value": 11183.901464580624, + "T_r": 126.192, + "n": [ + 3.423788275604014, + -2.9664673074957677, + 12.095926119341373, + -13.681823050784574, + 4.19110684294756, + -0.6241396008655289 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/NitrousOxide_anc.json b/dev/ancillaries/NitrousOxide_anc.json new file mode 100644 index 00000000..9c3598c3 --- /dev/null +++ b/dev/ancillaries/NitrousOxide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 182.33000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 309.51999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.0083179953182632715, + "t": [ + 0.985, + 1.029, + 1.616, + 3.337, + 7.323, + 1.092 + ], + "reducing_value": 7245000.0, + "T_r": 309.52, + "n": [ + 2.115457947739384, + -17.675380864870732, + -0.29834585629296156, + -2.0057540709496644, + -5.223431208153363, + 9.982409851956168 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 182.33000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 309.51999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.54067882166570769, + "t": [ + 0.428, + 2.405, + 3.115, + 4.433, + 8.312, + 8.395 + ], + "reducing_value": 10270.000000000002, + "T_r": 309.52, + "n": [ + -3.439484106428665, + -35.87348642351084, + 98.43310989645504, + -173.87569213455475, + 30857.724063434925, + -31916.967231256218 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 182.33000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 309.51999999999924, + "using_tau_r": true, + "max_abserror_percentage": 0.0067971511333864143, + "t": [ + 1.06, + 1.105, + 1.754, + 4.415, + 9.887, + 12.55 + ], + "reducing_value": 7245000.0, + "T_r": 309.52, + "n": [ + -24.198485663914695, + 18.980157921169518, + -0.9915637584760082, + -3.6052256452535647, + 52.20126113055801, + -340.2395463889685 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 182.33000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 309.51999999999924, + "using_tau_r": false, + "max_abserror_percentage": 0.68357924447878249, + "t": [ + 0.374, + 6.796, + 13.027, + 13.205, + 14.362, + 18.638 + ], + "reducing_value": 10270.000000000002, + "T_r": 309.52, + "n": [ + 2.248014962727216, + 1354.8814407985476, + -227009237.43183637, + 312935961.0720787, + -139155040.7743576, + 295107831.0429585 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/OrthoDeuterium_anc.json b/dev/ancillaries/OrthoDeuterium_anc.json new file mode 100644 index 00000000..e51a108b --- /dev/null +++ b/dev/ancillaries/OrthoDeuterium_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 18.724000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.0052491298882406667, + "t": [ + 1.011, + 1.564, + 1.694, + 2.339, + 12.299, + 12.417 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + -5.962797925166512, + 6.758820005764522, + -5.349436200589799, + 0.6830724644326415, + -321.7646727432708, + 338.2279808105484 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 18.724000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.10580823435766273, + "t": [ + 0.324, + 0.491, + 1.733, + 2.191, + 15.506, + 16.417 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + 0.2331216679164502, + -3.698059063742354, + 0.4327794907483545, + -0.5108769415735642, + 2131.2963725894447, + -3924.052231017246 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 18.724000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.01391576136706707, + "t": [ + 0.993, + 1.968, + 2.363, + 3.2, + 6.243, + 15.496 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + -5.262999856493507, + 5.457197954850728, + -6.429778369950024, + 3.0415926191682754, + -2.0017870289626956, + 70.16578895208772 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 18.724000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": false, + "max_abserror_percentage": 0.021925540249734254, + "t": [ + 0.433, + 0.632, + 0.773, + 2.187, + 2.427, + 2.681 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + 0.7561385728476524, + 7.456420463900972, + -7.667110838528095, + 31.91516196841129, + -55.84889038663615, + 25.60708660267712 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/OrthoHydrogen_anc.json b/dev/ancillaries/OrthoHydrogen_anc.json new file mode 100644 index 00000000..99072379 --- /dev/null +++ b/dev/ancillaries/OrthoHydrogen_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 14.00800000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.219999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.062810702551008291, + "t": [ + 0.326, + 1.064, + 1.831, + 1.854, + 2.235, + 14.653 + ], + "reducing_value": 1310650.0, + "T_r": 33.22, + "n": [ + -0.01809737585938931, + -6.272811023425992, + 151.4750625680904, + -156.18520413754467, + 8.016830127130035, + -8.808230339483577 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 14.00800000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.219999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.2875409563637854, + "t": [ + 0.48, + 0.716, + 6.39, + 12.856, + 16.87, + 18.364 + ], + "reducing_value": 15444.540313699812, + "T_r": 33.22, + "n": [ + -2.8577182299300046, + -0.2847217806996385, + 9.9579128118112, + -1243.1260029157054, + 26776.321922476538, + -40285.08539752482 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 14.00800000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 33.219999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.062770128861289187, + "t": [ + 0.379, + 0.414, + 0.981, + 1.167, + 2.476, + 19.461 + ], + "reducing_value": 1310650.0, + "T_r": 33.22, + "n": [ + -0.4051801286153231, + 0.5191529685153068, + -5.56347522818482, + 1.367651950727407, + 1.056012360297995, + -65.2720474474213 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 14.00800000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 33.219999999999914, + "using_tau_r": false, + "max_abserror_percentage": 0.66242024358558194, + "t": [ + 0.434, + 2.592, + 3.597, + 6.068, + 12.269, + 14.145 + ], + "reducing_value": 15444.540313699812, + "T_r": 33.22, + "n": [ + 2.136450368934771, + -9.434919244344163, + 26.99798420654703, + -73.87428692906634, + 2629.366529054487, + -5124.043586289661 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Oxygen_anc.json b/dev/ancillaries/Oxygen_anc.json new file mode 100644 index 00000000..de45c213 --- /dev/null +++ b/dev/ancillaries/Oxygen_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 54.361000000000004, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 154.58099999999973, + "using_tau_r": true, + "max_abserror_percentage": 0.0042472660650494376, + "t": [ + 1.019, + 1.177, + 2.44, + 2.493, + 5.646, + 10.887 + ], + "reducing_value": 5043000.0, + "T_r": 154.581, + "n": [ + -7.645535357219451, + 2.4214288702883655, + 9.642620060548747, + -10.094822869854763, + -1.6856689587691926, + 1.2776407609527567 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 54.361000000000004, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 154.58099999999973, + "using_tau_r": true, + "max_abserror_percentage": 0.30847172850669846, + "t": [ + 0.311, + 0.407, + 0.472, + 1.701, + 4.684, + 16.677 + ], + "reducing_value": 13630.0, + "T_r": 154.581, + "n": [ + -4.045898237284726, + 13.351580368749335, + -13.257394903986311, + -0.5839929431960236, + -2.395023810536666, + -4.561062605120816 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 54.361000000000004, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 154.58099999999973, + "using_tau_r": true, + "max_abserror_percentage": 0.018600358905673797, + "t": [ + 0.987, + 1.824, + 1.928, + 2.334, + 5.893, + 13.163 + ], + "reducing_value": 5043000.0, + "T_r": 154.581, + "n": [ + -5.590128802487688, + -5.726699763580528, + 9.483733165630566, + -3.928354204707163, + -1.5836756097644333, + 2.304993294039141 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 54.361000000000004, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 154.58099999999973, + "using_tau_r": false, + "max_abserror_percentage": 0.31331179756071137, + "t": [ + 0.398, + 0.86, + 1.704, + 2.122, + 4.266, + 18.786 + ], + "reducing_value": 13630.0, + "T_r": 154.581, + "n": [ + 2.398534228348317, + -0.9602489731250617, + 4.608521959548032, + -4.459907685966375, + 1.4756239105744295, + -71.13005503778817 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/ParaDeuterium_anc.json b/dev/ancillaries/ParaDeuterium_anc.json new file mode 100644 index 00000000..ac7a1e9b --- /dev/null +++ b/dev/ancillaries/ParaDeuterium_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 18.724000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.0068717510811833193, + "t": [ + 1.019, + 1.291, + 1.525, + 3.658, + 14.387, + 18.851 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + -6.560659054008582, + 2.3036870497088002, + 0.27016327917666433, + 0.1350815782586835, + -83.68402702066768, + 995.8259450035017 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 18.724000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.076535042283554233, + "t": [ + 0.494, + 0.62, + 1.003, + 1.005, + 19.21, + 19.85 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + -1.9157967271957959, + -2.9712091246582273, + 237.43334304651742, + -236.01792469812253, + 4664.0401630139195, + -8793.218613656329 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 18.724000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": true, + "max_abserror_percentage": 0.0046325768406907386, + "t": [ + 1.012, + 1.516, + 1.678, + 3.29, + 6.442, + 8.917 + ], + "reducing_value": 1679600.0, + "T_r": 38.34, + "n": [ + -6.007823964368566, + 4.54319186236637, + -2.68220724969741, + 0.42739425880451554, + -0.8211897181703741, + 0.6219573673883285 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 18.724000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 38.339999999999911, + "using_tau_r": false, + "max_abserror_percentage": 0.052780414966924205, + "t": [ + 0.558, + 0.941, + 0.992, + 1.011, + 4.008, + 13.336 + ], + "reducing_value": 17230.0, + "T_r": 38.34, + "n": [ + 5.337218502231972, + -37.730569203923736, + 56.189484760644554, + -21.538412148225337, + -0.63373056265043, + 48.064086849218086 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/ParaHydrogen_anc.json b/dev/ancillaries/ParaHydrogen_anc.json new file mode 100644 index 00000000..d02aa96e --- /dev/null +++ b/dev/ancillaries/ParaHydrogen_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 13.803300000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 32.937999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.0025443700352290044, + "t": [ + 0.852, + 0.986, + 1.827, + 2.355, + 3.05, + 4.286 + ], + "reducing_value": 1285800.0, + "T_r": 32.938, + "n": [ + 0.1490037759465196, + -4.78237888041144, + 1.5087203071678434, + -0.880650150281499, + 1.2942713948220537, + -0.3877150898692146 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 13.803300000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 32.937999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.051284406798368654, + "t": [ + 0.533, + 1.001, + 1.276, + 1.876, + 1.958, + 19.379 + ], + "reducing_value": 15538.0, + "T_r": 32.938, + "n": [ + -5.1023908882756785, + 15.472633152203006, + -25.539938117401427, + 65.8971290411631, + -53.56192274807538, + -9.178291109165437 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 13.803300000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 32.937999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.017479820488053299, + "t": [ + 0.935, + 1.151, + 1.456, + 3.851, + 5.737, + 13.549 + ], + "reducing_value": 1285800.0, + "T_r": 32.938, + "n": [ + -2.332391071635025, + -3.9319881688087577, + 2.7199573469254177, + 1.0763302954693428, + -0.9726696103840476, + 4.031438860139397 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 13.803300000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 32.937999999999917, + "using_tau_r": false, + "max_abserror_percentage": 0.37627402632863793, + "t": [ + 0.44, + 0.833, + 4.399, + 8.501, + 8.893, + 17.08 + ], + "reducing_value": 15538.0, + "T_r": 32.938, + "n": [ + 2.42209314197553, + -0.8105757647156946, + 5.292441752641816, + -801.4099838859875, + 965.4158391322754, + -2288.927990716296 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Propylene_anc.json b/dev/ancillaries/Propylene_anc.json new file mode 100644 index 00000000..316d9fb5 --- /dev/null +++ b/dev/ancillaries/Propylene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 87.953000000000017, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 364.2109999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.023583825097461819, + "t": [ + 0.985, + 1.914, + 3.354, + 8.871, + 9.472, + 12.201 + ], + "reducing_value": 4555000.0, + "T_r": 364.211, + "n": [ + -6.15754746767542, + 0.8043847738472081, + -2.629218877933464, + -20.055797246021456, + 23.93889034404838, + -5.927221357425409 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 87.953000000000017, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 364.2109999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.93159516574676804, + "t": [ + 0.42, + 0.56, + 1.051, + 1.479, + 3.598, + 16.862 + ], + "reducing_value": 5457.0, + "T_r": 364.211, + "n": [ + -5.13562614673855, + 4.2053374767917395, + -8.021462611933476, + 4.971018368148577, + -4.664302402572978, + -1.7964631156271889 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 87.953000000000017, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 364.2109999999991, + "using_tau_r": true, + "max_abserror_percentage": 0.039256968605339004, + "t": [ + 0.189, + 0.977, + 2.913, + 3.289, + 6.805, + 18.129 + ], + "reducing_value": 4555000.0, + "T_r": 364.211, + "n": [ + 0.001133775984851922, + -5.98182751110803, + 3.6974583382927824, + -5.973792950295522, + -0.7589187509838732, + -0.9162432153073952 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 87.953000000000017, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 364.2109999999991, + "using_tau_r": false, + "max_abserror_percentage": 0.15187793211883793, + "t": [ + 0.286, + 0.521, + 0.701, + 5.657, + 6.864, + 15.279 + ], + "reducing_value": 5457.0, + "T_r": 364.211, + "n": [ + 1.1500616940414559, + 0.7037673936905474, + 0.6950815609799416, + 1.8850870474961088, + -2.1702211585216302, + 2.21238242151199 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Propyne_anc.json b/dev/ancillaries/Propyne_anc.json new file mode 100644 index 00000000..0e23f490 --- /dev/null +++ b/dev/ancillaries/Propyne_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 402.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.012297710682296348, + "t": [ + 0.243, + 0.628, + 0.992, + 1.949, + 5.259, + 11.136 + ], + "reducing_value": 5626000.0, + "T_r": 402.38, + "n": [ + 0.0025352410381648404, + -0.03566614580246839, + -6.474512126273843, + 0.4178712360656155, + -1.9479103016021955, + -342.07305237113997 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 402.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.69359143530181022, + "t": [ + 0.192, + 0.32, + 0.321, + 0.498, + 1.309, + 7.491 + ], + "reducing_value": 6113.33, + "T_r": 402.38, + "n": [ + -5.066155131330643, + 1779.1130020151943, + -1782.2051460501207, + 4.756104080644848, + -2.3713377912727562, + 59.371736976095974 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 402.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.012366531953733606, + "t": [ + 0.775, + 0.959, + 1.864, + 4.493, + 5.159, + 19.1 + ], + "reducing_value": 5626000.0, + "T_r": 402.38, + "n": [ + 0.4371507863196512, + -6.66393075926699, + -0.2170324722957424, + 13.288458369708717, + -24.057488658628785, + 1855841.7713583934 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 402.37999999999914, + "using_tau_r": false, + "max_abserror_percentage": 1.7690932219500133, + "t": [ + 0.175, + 1.172, + 1.358, + 3.662, + 7.586, + 9.174 + ], + "reducing_value": 6113.33, + "T_r": 402.38, + "n": [ + 0.676908949567043, + 42.124365852994195, + -52.6498660929799, + 148.86365466555566, + -17709.824791659536, + 71543.36247766066 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R113_anc.json b/dev/ancillaries/R113_anc.json new file mode 100644 index 00000000..fb93054c --- /dev/null +++ b/dev/ancillaries/R113_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 236.93000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 487.20999999999879, + "using_tau_r": true, + "max_abserror_percentage": 0.0078338153913115605, + "t": [ + 1.0, + 1.296, + 2.592, + 3.34, + 4.285, + 10.465 + ], + "reducing_value": 3392200.0, + "T_r": 487.21, + "n": [ + -7.513797278929454, + 1.5095312092676123, + -1.9699733346499353, + 1.7578730760232852, + -4.592035089583662, + -0.41772646096774985 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 236.93000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 487.20999999999879, + "using_tau_r": true, + "max_abserror_percentage": 0.22136358635237441, + "t": [ + 0.547, + 0.639, + 0.644, + 1.238, + 3.962, + 5.593 + ], + "reducing_value": 2988.6591060707137, + "T_r": 487.21, + "n": [ + -53.51591930070364, + 1179.0791709251655, + -1132.4832595523026, + 1.7901473308750928, + -6.764890888618531, + 2.256439191313591 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 236.93000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 487.20999999999879, + "using_tau_r": true, + "max_abserror_percentage": 0.015131489392194997, + "t": [ + 0.835, + 0.953, + 4.22, + 7.025, + 3.741, + 11.923 + ], + "reducing_value": 3392200.0, + "T_r": 487.21, + "n": [ + 0.8302534329379594, + -7.180276103826055, + 2.042384576535874, + -3.4631098858651277, + -4.982016715257017, + 8.069342331962437 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 236.93000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 487.20999999999879, + "using_tau_r": false, + "max_abserror_percentage": 0.85566087080308773, + "t": [ + 0.344, + 0.621, + 4.847, + 6.255, + 7.527, + 9.355 + ], + "reducing_value": 2988.6591060707137, + "T_r": 487.21, + "n": [ + 2.1209299719499692, + 0.306929802490948, + 107.2647341968565, + -840.5575578947821, + 1870.9104273285336, + -1779.2226056266804 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R114_anc.json b/dev/ancillaries/R114_anc.json new file mode 100644 index 00000000..51a00b1c --- /dev/null +++ b/dev/ancillaries/R114_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.14999999999998, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.82999999999896, + "using_tau_r": true, + "max_abserror_percentage": 0.16711623182714685, + "t": [ + 0.562, + 1.474, + 1.48, + 1.671, + 19.65, + 19.907 + ], + "reducing_value": 3257000.0, + "T_r": 418.83, + "n": [ + -0.30056837663219454, + -3675.7604915544694, + 3783.892467766002, + -116.51203569138166, + 518347803.73777616, + -675455943.1429232 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.14999999999998, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.82999999999896, + "using_tau_r": true, + "max_abserror_percentage": 7.6217093881936098, + "t": [ + 0.035, + 0.539, + 2.097, + 7.751, + 12.964, + 18.768 + ], + "reducing_value": 3393.2000000000003, + "T_r": 418.83, + "n": [ + -0.25738264700819247, + -3.898251196031975, + -5.896731894914288, + 3484.356562302582, + -1305405.1150486593, + 294675355.11756265 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.14999999999998, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 418.82999999999896, + "using_tau_r": true, + "max_abserror_percentage": 0.034801214998814167, + "t": [ + 0.063, + 0.078, + 0.997, + 1.08, + 4.22, + 18.01 + ], + "reducing_value": 3257000.0, + "T_r": 418.83, + "n": [ + -0.03910964005249281, + 0.04271700821207559, + -8.460176906373917, + 2.0544163414455383, + -5.417387102558348, + 311098.3405989305 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.14999999999998, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 418.82999999999896, + "using_tau_r": false, + "max_abserror_percentage": 0.88444992856691051, + "t": [ + 0.168, + 0.377, + 0.516, + 0.603, + 3.002, + 6.719 + ], + "reducing_value": 3393.2000000000003, + "T_r": 418.83, + "n": [ + 2.5388024373334166, + -21.019533461079085, + 55.36105635703546, + -35.25092830572443, + 5.566074608205557, + -82.35558694240936 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R116_anc.json b/dev/ancillaries/R116_anc.json new file mode 100644 index 00000000..18785ecd --- /dev/null +++ b/dev/ancillaries/R116_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 173.09999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 293.0299999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.010635796325519919, + "t": [ + 0.994, + 1.389, + 3.286, + 3.827, + 6.643, + 12.512 + ], + "reducing_value": 3048000.0, + "T_r": 293.03, + "n": [ + -7.187037699453901, + 1.1679020933888262, + -6.070415204530583, + 4.623641136795351, + -8.973143537957382, + 135.12331037950565 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 173.09999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 293.0299999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.44326848370010996, + "t": [ + 0.42, + 1.175, + 2.321, + 2.482, + 19.211, + 19.828 + ], + "reducing_value": 4444.0, + "T_r": 293.03, + "n": [ + -3.2238759240828108, + -2.882263657854913, + 8.52221952834173, + -9.783624985988958, + -19811843.680679295, + 33374328.47668358 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 173.09999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 293.0299999999994, + "using_tau_r": true, + "max_abserror_percentage": 0.016719676954091156, + "t": [ + 1.007, + 1.041, + 2.032, + 4.012, + 1.929, + 18.295 + ], + "reducing_value": 3048000.0, + "T_r": 293.03, + "n": [ + -11.470078446321281, + 4.672163421603924, + -10.48503079726129, + -2.397369737948997, + 9.993759307098879, + -13131.027093052013 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 173.09999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 293.0299999999994, + "using_tau_r": false, + "max_abserror_percentage": 0.5536401970378968, + "t": [ + 0.481, + 0.603, + 1.19, + 3.414, + 9.072, + 10.136 + ], + "reducing_value": 4444.0, + "T_r": 293.03, + "n": [ + 9.032000509756, + -9.139042989359975, + 4.35812391046927, + -10.172985836578453, + 3844.9059901716128, + -8268.03247405404 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R11_anc.json b/dev/ancillaries/R11_anc.json new file mode 100644 index 00000000..a5aec9cf --- /dev/null +++ b/dev/ancillaries/R11_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 162.68000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 471.05999999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.19454432710005465, + "t": [ + 0.093, + 0.18, + 0.971, + 3.426, + 5.452, + 19.676 + ], + "reducing_value": 4394000.0, + "T_r": 471.06, + "n": [ + 0.026052457505876248, + -0.033251769926668874, + -6.052567442811702, + -1.7491910863188018, + -2.0497996257474944, + 21.07044968037653 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 162.68000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 471.05999999999898, + "using_tau_r": true, + "max_abserror_percentage": 4.9606287841396313, + "t": [ + 0.506, + 0.881, + 2.875, + 5.942, + 17.127, + 19.889 + ], + "reducing_value": 4113.0394269407725, + "T_r": 471.06, + "n": [ + -4.24333237177487, + -0.4078731288745647, + -2.249917886647205, + -5.523383725068134, + 815.8186908904237, + -2149.920110111276 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 162.68000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 471.05999999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.29909362956086483, + "t": [ + 0.304, + 0.575, + 1.226, + 1.624, + 3.082, + 5.897 + ], + "reducing_value": 4394000.0, + "T_r": 471.06, + "n": [ + 0.15114864227309924, + -1.0362484013166429, + -9.85652324799686, + 5.929859019171377, + -3.5450486869633306, + -1.2411439744310455 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 162.68000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 471.05999999999898, + "using_tau_r": false, + "max_abserror_percentage": 4.0038317449825893, + "t": [ + 0.46, + 0.473, + 0.584, + 1.778, + 4.107, + 6.191 + ], + "reducing_value": 4113.0394269407725, + "T_r": 471.06, + "n": [ + -233.14334396615303, + 275.8122390016742, + -42.633467921464685, + 4.723326547469123, + -6.867921570223379, + 7.76091118506622 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R1233zd(E)_anc.json b/dev/ancillaries/R1233zd(E)_anc.json new file mode 100644 index 00000000..30f3657b --- /dev/null +++ b/dev/ancillaries/R1233zd(E)_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 195.15000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 438.74999999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.048122351238144567, + "t": [ + 0.385, + 0.967, + 3.777, + 10.577, + 19.909, + 19.956 + ], + "reducing_value": 3570900.0, + "T_r": 438.75, + "n": [ + 0.021088508639502585, + -6.620365917686894, + -4.702884521504553, + -6.519442862795689, + -118082.29588979667, + 121247.44743084916 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 195.15000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 438.74999999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.41925700945414368, + "t": [ + 0.258, + 0.32, + 0.93, + 4.132, + 17.885, + 19.89 + ], + "reducing_value": 3670.0, + "T_r": 438.75, + "n": [ + 1.4537714001445163, + -3.954065447818449, + -3.2616476179213754, + -6.423292792416026, + -1591.9260119985602, + 4775.150913792323 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 195.15000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 438.74999999999915, + "using_tau_r": true, + "max_abserror_percentage": 0.048123977517677829, + "t": [ + 0.408, + 0.959, + 1.67, + 3.873, + 10.203, + 19.884 + ], + "reducing_value": 3570900.0, + "T_r": 438.75, + "n": [ + 0.029762994134254272, + -6.47060943833758, + -0.28794075079630876, + -4.614592689331627, + -9.236029232181323, + 659.8939410067252 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 195.15000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 438.74999999999915, + "using_tau_r": false, + "max_abserror_percentage": 0.49366683042657566, + "t": [ + 0.414, + 0.659, + 1.968, + 2.399, + 7.587, + 8.501 + ], + "reducing_value": 3670.0, + "T_r": 438.75, + "n": [ + 3.3871208714378995, + -1.54887974718069, + 7.422063780601333, + -8.33207529880846, + 90.2369693095755, + -124.63668410742086 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R1234yf_anc.json b/dev/ancillaries/R1234yf_anc.json new file mode 100644 index 00000000..2d1eec6e --- /dev/null +++ b/dev/ancillaries/R1234yf_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 220.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 367.84999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.015063742190934981, + "t": [ + 0.978, + 1.128, + 1.875, + 2.579, + 5.3, + 12.869 + ], + "reducing_value": 3382200.0, + "T_r": 367.85, + "n": [ + -6.127206406335995, + -0.9044431324757645, + 2.0918728211333275, + -3.396385591501546, + -1.9071219386505223, + -47.15549606822473 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 220.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 367.84999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.332050058237221, + "t": [ + 0.398, + 0.952, + 1.466, + 2.053, + 2.242, + 4.989 + ], + "reducing_value": 4170.0, + "T_r": 367.85, + "n": [ + -3.24158284550283, + 2.612924555839616, + -26.216566273272992, + 115.70400813769207, + -101.3078910128961, + 9.031472717572315 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 220.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 367.84999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.0068536940865948637, + "t": [ + 0.728, + 0.961, + 3.78, + 17.277, + 7.967, + 14.02 + ], + "reducing_value": 3382200.0, + "T_r": 367.85, + "n": [ + 0.21867168915151047, + -6.7020534970313275, + -3.9344883544124443, + 39309.745547798695, + 18.183182049398066, + -3883.103380695622 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 220.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 367.84999999999923, + "using_tau_r": false, + "max_abserror_percentage": 0.39921234821882479, + "t": [ + 0.365, + 1.247, + 1.765, + 2.484, + 2.593, + 16.586 + ], + "reducing_value": 4170.0, + "T_r": 367.85, + "n": [ + 2.321825326575359, + -3.520638555089873, + 20.18646332917161, + -160.37050775728997, + 147.68109685289284, + -63578.64918999199 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R1234ze(E)_anc.json b/dev/ancillaries/R1234ze(E)_anc.json new file mode 100644 index 00000000..9eff4460 --- /dev/null +++ b/dev/ancillaries/R1234ze(E)_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 168.62, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 382.51999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.022567163665065948, + "t": [ + 0.983, + 0.995, + 2.083, + 2.808, + 6.744, + 8.913 + ], + "reducing_value": 3636250.0, + "T_r": 382.52, + "n": [ + -6.2771508430471465, + -0.6442364867415747, + 1.7382781745746712, + -4.13701171551505, + -4.650293699166692, + 5.311503524553517 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 168.62, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 382.51999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.25090489761444568, + "t": [ + 0.331, + 0.371, + 1.186, + 1.428, + 3.051, + 18.679 + ], + "reducing_value": 4290.0, + "T_r": 382.52, + "n": [ + -0.34141577170134696, + -2.2642727042889206, + -10.568130441264715, + 9.002522338545985, + -5.823859071714804, + -424.82596271205927 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 168.62, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 382.51999999999907, + "using_tau_r": true, + "max_abserror_percentage": 0.0078220477906842945, + "t": [ + 0.763, + 1.073, + 1.171, + 2.287, + 4.528, + 6.38 + ], + "reducing_value": 3636250.0, + "T_r": 382.52, + "n": [ + -0.20363205737381423, + -16.08331291555217, + 10.286458977692833, + -1.7629676468624258, + -3.894744849439604, + 1.225425940200232 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 168.62, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 382.51999999999907, + "using_tau_r": false, + "max_abserror_percentage": 0.26112944130063376, + "t": [ + 0.354, + 0.525, + 0.705, + 2.397, + 19.412, + 19.777 + ], + "reducing_value": 4290.0, + "T_r": 382.52, + "n": [ + 2.500880567033856, + -1.3486007407219713, + 1.5107989377176647, + 0.08399693443404783, + 51293.78813992701, + -62530.03746597265 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R1234ze(Z)_anc.json b/dev/ancillaries/R1234ze(Z)_anc.json new file mode 100644 index 00000000..fe57d5fc --- /dev/null +++ b/dev/ancillaries/R1234ze(Z)_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 423.2699999999993, + "using_tau_r": true, + "max_abserror_percentage": 0.013861437588635894, + "t": [ + 0.993, + 1.127, + 3.259, + 4.649, + 8.29, + 18.573 + ], + "reducing_value": 3533000.0, + "T_r": 423.27, + "n": [ + -8.177106613433029, + 1.5142657359326417, + -2.790441012266599, + 0.00919594460120844, + -8.214525035988535, + -5309.748045808004 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 423.2699999999993, + "using_tau_r": true, + "max_abserror_percentage": 1.0860081017443401, + "t": [ + 0.43, + 0.95, + 4.5, + 6.507, + 8.994, + 9.048 + ], + "reducing_value": 4121.303363626818, + "T_r": 423.27, + "n": [ + -3.8008160798898456, + -1.14790031265839, + -281.54354036613495, + 6472.299051044157, + -1985193.1508489654, + 2037392.973112241 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 423.2699999999993, + "using_tau_r": true, + "max_abserror_percentage": 0.015877796614871542, + "t": [ + 0.631, + 0.974, + 3.244, + 3.59, + 7.592, + 6.934 + ], + "reducing_value": 3533000.0, + "T_r": 423.27, + "n": [ + 0.0117990424214877, + -6.803022339042438, + 5.362164910742748, + -12.094491173809551, + -254.2811081944286, + 171.34274686639145 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 423.2699999999993, + "using_tau_r": false, + "max_abserror_percentage": 0.36780472644506457, + "t": [ + 0.414, + 0.901, + 2.913, + 8.026, + 8.631, + 10.213 + ], + "reducing_value": 4121.303363626818, + "T_r": 423.27, + "n": [ + 2.8054215733649555, + -0.5782847268115662, + 6.657750631664868, + -28488.415580838606, + 68499.04449007797, + -85980.39928084945 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R123_anc.json b/dev/ancillaries/R123_anc.json new file mode 100644 index 00000000..7987d548 --- /dev/null +++ b/dev/ancillaries/R123_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 166.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 456.81999999999925, + "using_tau_r": true, + "max_abserror_percentage": 0.17838045480449427, + "t": [ + 0.031, + 1.033, + 1.146, + 3.599, + 7.019, + 19.189 + ], + "reducing_value": 3672000.0, + "T_r": 456.82, + "n": [ + -0.0031837409106559187, + -11.107846331080172, + 4.734185995995877, + -4.048957111743435, + -0.5440841196537946, + -44.6129766068101 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 166.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 456.81999999999925, + "using_tau_r": true, + "max_abserror_percentage": 3.9726696226793257, + "t": [ + 0.131, + 0.889, + 2.037, + 2.411, + 13.9, + 13.9 + ], + "reducing_value": 3616.0098345005263, + "T_r": 456.82, + "n": [ + -0.6689070209875734, + -8.512052644791224, + 28.44144763374501, + -30.129960632384645, + 0.7883516597032918, + 32.0 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 166.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 456.81999999999925, + "using_tau_r": true, + "max_abserror_percentage": 0.091919584548671995, + "t": [ + 0.069, + 0.08, + 0.958, + 1.207, + 3.265, + 5.217 + ], + "reducing_value": 3672000.0, + "T_r": 456.82, + "n": [ + -0.14999260119726984, + 0.16011082566025844, + -6.159962430056354, + -0.33227260959139665, + -2.5133322580085764, + -2.3181419404884687 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 166.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 456.81999999999925, + "using_tau_r": false, + "max_abserror_percentage": 2.1790575899734099, + "t": [ + 0.25, + 0.88, + 2.102, + 7.818, + 11.925, + 12.431 + ], + "reducing_value": 3616.0098345005263, + "T_r": 456.82, + "n": [ + 1.12312839380477, + 2.725680798383249, + -2.934171430496407, + 112.18482758921864, + -5123.982577622656, + 5683.66051261797 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R124_anc.json b/dev/ancillaries/R124_anc.json new file mode 100644 index 00000000..44eba47c --- /dev/null +++ b/dev/ancillaries/R124_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 120.00000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 395.42499999999933, + "using_tau_r": true, + "max_abserror_percentage": 0.017896115300741755, + "t": [ + 0.996, + 1.239, + 2.971, + 4.309, + 16.487, + 17.093 + ], + "reducing_value": 3624295.0, + "T_r": 395.425, + "n": [ + -7.528609644683465, + 1.132455562463, + -1.631598342265028, + -2.8282320927793774, + 18.38052289288725, + -23.827708795649023 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 120.00000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 395.42499999999933, + "using_tau_r": true, + "max_abserror_percentage": 0.41271364589423598, + "t": [ + 0.415, + 0.5, + 1.704, + 2.307, + 2.394, + 13.161 + ], + "reducing_value": 4103.279546177282, + "T_r": 395.425, + "n": [ + -3.6411060779677857, + 0.3822304251070335, + -19.603560148262865, + 181.0410898999192, + -168.52216602298836, + -2.5180916684231893 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 120.00000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 395.42499999999933, + "using_tau_r": true, + "max_abserror_percentage": 0.011933999782232085, + "t": [ + 1.003, + 1.051, + 1.163, + 2.188, + 4.015, + 19.693 + ], + "reducing_value": 3624295.0, + "T_r": 395.425, + "n": [ + -5.532034162429256, + -4.742002285997961, + 4.083301102214, + -0.8556260869752595, + -3.759805971191399, + -5.094637151194883 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 120.00000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 395.42499999999933, + "using_tau_r": false, + "max_abserror_percentage": 0.24061336574978665, + "t": [ + 0.482, + 0.651, + 0.881, + 0.914, + 5.001, + 10.577 + ], + "reducing_value": 4103.279546177282, + "T_r": 395.425, + "n": [ + 9.076759200951095, + -17.685013904231155, + 59.69226551115479, + -48.46415018361892, + 0.6023234565910854, + -1.0939055527121821 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R125_anc.json b/dev/ancillaries/R125_anc.json new file mode 100644 index 00000000..4e8109a1 --- /dev/null +++ b/dev/ancillaries/R125_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 172.52000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 339.17299999999932, + "using_tau_r": true, + "max_abserror_percentage": 0.01046187338811233, + "t": [ + 0.885, + 0.925, + 3.474, + 3.812, + 4.411, + 15.538 + ], + "reducing_value": 3617700.0, + "T_r": 339.173, + "n": [ + 6.579940225415354, + -13.12524401279829, + -10.469172276861269, + 13.618968108873503, + -8.0692357647322, + 55.965891794172045 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 172.52000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 339.17299999999932, + "using_tau_r": true, + "max_abserror_percentage": 0.41730212437529612, + "t": [ + 0.352, + 0.604, + 1.327, + 9.866, + 10.986, + 18.158 + ], + "reducing_value": 4779.0, + "T_r": 339.173, + "n": [ + -2.0301408267555248, + -1.7694859385413004, + -2.66520428063493, + -2012.3802928260302, + 4435.166819598504, + -67300.56720486972 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 172.52000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 339.17299999999932, + "using_tau_r": true, + "max_abserror_percentage": 0.019760158892956348, + "t": [ + 1.071, + 1.229, + 1.544, + 5.702, + 6.646, + 11.6 + ], + "reducing_value": 3617700.0, + "T_r": 339.173, + "n": [ + -16.660428789255334, + 14.596373821017897, + -5.275576328072681, + -27.79147283824458, + 36.817664092754455, + -69.3677852617722 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 172.52000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 339.17299999999932, + "using_tau_r": false, + "max_abserror_percentage": 0.32212323303475454, + "t": [ + 0.356, + 2.347, + 3.224, + 4.03, + 7.525, + 16.03 + ], + "reducing_value": 4779.0, + "T_r": 339.173, + "n": [ + 2.2016016101218163, + 9.66884730895765, + -38.74092529625786, + 45.90185095955414, + -68.77471029167359, + 3782.012676140688 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R12_anc.json b/dev/ancillaries/R12_anc.json new file mode 100644 index 00000000..a7861d68 --- /dev/null +++ b/dev/ancillaries/R12_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 116.09900000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 385.11999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.028365352120385268, + "t": [ + 0.433, + 0.982, + 1.318, + 3.654, + 5.875, + 15.999 + ], + "reducing_value": 4136100.0000000005, + "T_r": 385.12, + "n": [ + 0.004148665064044772, + -6.438269132397203, + 0.5001352041916829, + -2.5368777649126186, + -0.9660846422519165, + -2.2689931652353614 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 116.09900000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 385.11999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.21720112949432657, + "t": [ + 0.499, + 0.743, + 0.857, + 1.368, + 3.716, + 14.833 + ], + "reducing_value": 4672.781255944357, + "T_r": 385.12, + "n": [ + -7.9660647155295505, + 23.959910083444367, + -23.82796401904973, + 3.215927599962643, + -4.437766797843962, + -3.5598094489847374 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 116.09900000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 385.11999999999927, + "using_tau_r": true, + "max_abserror_percentage": 0.025380010837450229, + "t": [ + 0.894, + 1.009, + 1.274, + 3.0, + 4.927, + 19.696 + ], + "reducing_value": 4136100.0000000005, + "T_r": 385.12, + "n": [ + -0.4180899251614923, + -6.821426208906223, + 1.4450198472690974, + -1.4837613030063526, + -2.1731387101462754, + -5.72739817030707 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 116.09900000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 385.11999999999927, + "using_tau_r": false, + "max_abserror_percentage": 0.72990364040943501, + "t": [ + 0.391, + 0.803, + 1.301, + 2.566, + 12.555, + 16.134 + ], + "reducing_value": 4672.781255944357, + "T_r": 385.12, + "n": [ + 2.6029953147390845, + -1.289157172326326, + 1.8650658616334526, + -0.7403291941448226, + 24.389351468278143, + -67.79326638866661 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R134a_anc.json b/dev/ancillaries/R134a_anc.json new file mode 100644 index 00000000..ac00e05c --- /dev/null +++ b/dev/ancillaries/R134a_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 169.84999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.20999999999935, + "using_tau_r": true, + "max_abserror_percentage": 0.0092052815499066298, + "t": [ + 0.845, + 0.99, + 1.14, + 2.651, + 4.507, + 17.235 + ], + "reducing_value": 4059280.0, + "T_r": 374.21, + "n": [ + 0.4331478287291047, + -9.090302559074352, + 2.1476074125217703, + -1.557687007603464, + -3.5020328972698604, + 14.958442337201044 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 169.84999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.20999999999935, + "using_tau_r": true, + "max_abserror_percentage": 2.5443795326392737, + "t": [ + 0.476, + 0.966, + 1.321, + 8.491, + 13.463, + 13.463 + ], + "reducing_value": 5017.053, + "T_r": 374.21, + "n": [ + -5.147386240766544, + 5.34618043286371, + -7.611015272838434, + -28.85436432788653, + -9.079306067130748, + 64.0 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 169.84999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.20999999999935, + "using_tau_r": true, + "max_abserror_percentage": 0.017350580991559728, + "t": [ + 0.994, + 1.193, + 3.431, + 11.757, + 16.373, + 8.838 + ], + "reducing_value": 4059280.0, + "T_r": 374.21, + "n": [ + -7.752261946226358, + 1.1077288842347188, + -3.6878039562081835, + 11.428865438173393, + 58.41970100091463, + -7.937848917436551 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 169.84999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 374.20999999999935, + "using_tau_r": false, + "max_abserror_percentage": 4.6946014387711843, + "t": [ + 0.673, + 0.994, + 1.257, + 5.783, + 5.943, + 19.94 + ], + "reducing_value": 5017.053, + "T_r": 374.21, + "n": [ + 18.772731940930015, + -51.49939472178225, + 40.793536440596085, + -1481.6500471538966, + 1600.534434298925, + -67338.52423732559 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R13_anc.json b/dev/ancillaries/R13_anc.json new file mode 100644 index 00000000..a68ff515 --- /dev/null +++ b/dev/ancillaries/R13_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 98.15000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 301.87999999999948, + "using_tau_r": true, + "max_abserror_percentage": 0.12606958384904221, + "t": [ + 0.962, + 1.124, + 1.806, + 5.029, + 6.501, + 18.846 + ], + "reducing_value": 3879000.0, + "T_r": 301.88, + "n": [ + -5.512665414700078, + -0.46529356526380233, + -0.2576981218074055, + -6.198713074425052, + 4.554615222226936, + -425.4870614799572 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 98.15000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 301.87999999999948, + "using_tau_r": true, + "max_abserror_percentage": 3.322780247833268, + "t": [ + 0.187, + 0.227, + 0.259, + 2.009, + 7.396, + 14.878 + ], + "reducing_value": 5580.0, + "T_r": 301.88, + "n": [ + -44.134501251031836, + 123.82270708407191, + -83.62522157903703, + -2.647160291881159, + -5.449711245985369, + -77.38203576950463 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 98.15000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 301.87999999999948, + "using_tau_r": true, + "max_abserror_percentage": 0.12591295236392686, + "t": [ + 0.183, + 0.974, + 1.79, + 4.508, + 17.458, + 17.588 + ], + "reducing_value": 3879000.0, + "T_r": 301.88, + "n": [ + -0.0007921318343566953, + -5.996195643967384, + -0.19260162903514982, + -3.374201633035978, + 5653.865616057301, + -6159.322602726868 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 98.15000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 301.87999999999948, + "using_tau_r": false, + "max_abserror_percentage": 2.5665972823225247, + "t": [ + 0.12, + 1.19, + 1.219, + 6.955, + 8.289, + 17.746 + ], + "reducing_value": 5580.0, + "T_r": 301.88, + "n": [ + 0.5805008657064199, + 110.54560557681266, + -110.25028269746312, + 87.64846842137001, + -146.66580327727502, + 669.8318898661124 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R141b_anc.json b/dev/ancillaries/R141b_anc.json new file mode 100644 index 00000000..9fa3a972 --- /dev/null +++ b/dev/ancillaries/R141b_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 169.68000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 477.49999999999903, + "using_tau_r": true, + "max_abserror_percentage": 0.019246627466973365, + "t": [ + 0.983, + 1.631, + 2.843, + 8.359, + 9.453, + 11.517 + ], + "reducing_value": 4212000.0, + "T_r": 477.5, + "n": [ + -6.548634339175584, + 0.901672493371514, + -2.637481779917132, + -37.87631589108344, + 64.82259169597823, + -38.10709089407612 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 169.68000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 477.49999999999903, + "using_tau_r": true, + "max_abserror_percentage": 0.4790877842035246, + "t": [ + 0.279, + 0.374, + 1.89, + 1.986, + 3.019, + 8.269 + ], + "reducing_value": 3921.0000000000005, + "T_r": 477.5, + "n": [ + 0.6509988493015847, + -3.8560643644234873, + -69.71635657603578, + 75.36138733740711, + -12.174836839230538, + -0.9652029917534032 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 169.68000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 477.49999999999903, + "using_tau_r": true, + "max_abserror_percentage": 0.018460232880523897, + "t": [ + 1.049, + 1.078, + 2.184, + 4.325, + 9.594, + 16.104 + ], + "reducing_value": 4212000.0, + "T_r": 477.5, + "n": [ + -30.1815277612222, + 24.413010375904488, + -1.1112676337911325, + -3.1252752919171236, + -1.7371129089761865, + -1.7017122235679412 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 169.68000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 477.49999999999903, + "using_tau_r": false, + "max_abserror_percentage": 0.76667989709326978, + "t": [ + 0.29, + 0.341, + 2.503, + 15.166, + 18.069, + 18.242 + ], + "reducing_value": 3921.0000000000005, + "T_r": 477.5, + "n": [ + -0.9378377457620258, + 3.2148374020900103, + 1.0653350522107268, + -4378.068628183692, + 272955.32986322936, + -277906.31972088123 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R142b_anc.json b/dev/ancillaries/R142b_anc.json new file mode 100644 index 00000000..1c32ce76 --- /dev/null +++ b/dev/ancillaries/R142b_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 142.72, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 410.25999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.019960603250079867, + "t": [ + 0.416, + 0.975, + 1.491, + 3.189, + 5.386, + 4.774 + ], + "reducing_value": 4055000.0, + "T_r": 410.26, + "n": [ + 0.007504607089828755, + -6.4820128159502906, + 0.40977136350415566, + -2.402572406912058, + -1.8764909849689335, + 0.05707725832641831 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 142.72, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 410.25999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.29208892865609792, + "t": [ + 0.092, + 0.165, + 0.398, + 1.037, + 3.911, + 4.103 + ], + "reducing_value": 4438.0, + "T_r": 410.26, + "n": [ + 0.07060973078462121, + -0.1101282083100916, + -2.9297126160159235, + -2.550579057791659, + 0.8675055868776257, + -5.524200468568231 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 142.72, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 410.25999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.016702977994387247, + "t": [ + 0.993, + 1.485, + 2.56, + 3.61, + 3.733, + 14.147 + ], + "reducing_value": 4055000.0, + "T_r": 410.26, + "n": [ + -7.053583364113904, + 1.620065366585568, + -3.5992302698185896, + 30.256775801825796, + -31.3125464775288, + -0.7436150349113302 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 142.72, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 410.25999999999914, + "using_tau_r": false, + "max_abserror_percentage": 0.5611813999881976, + "t": [ + 0.247, + 0.26, + 1.896, + 3.015, + 7.62, + 15.172 + ], + "reducing_value": 4438.0, + "T_r": 410.26, + "n": [ + -9.714230485565954, + 11.7638029884687, + 2.4153342114392036, + -3.0195139591161673, + 8.696072645236315, + -74.7964429355484 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R143a_anc.json b/dev/ancillaries/R143a_anc.json new file mode 100644 index 00000000..290bc9c4 --- /dev/null +++ b/dev/ancillaries/R143a_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 161.34, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.85699999999935, + "using_tau_r": true, + "max_abserror_percentage": 0.021749642310531225, + "t": [ + 0.454, + 0.968, + 1.363, + 2.999, + 4.469, + 15.514 + ], + "reducing_value": 3761000.0, + "T_r": 345.857, + "n": [ + 0.024303276489290756, + -6.510885016909917, + 0.12842302942065706, + -1.0754739908073552, + -2.8675285594067415, + 20.271941975061065 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 161.34, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.85699999999935, + "using_tau_r": true, + "max_abserror_percentage": 0.48171502120593068, + "t": [ + 0.454, + 0.587, + 1.058, + 3.611, + 4.279, + 5.478 + ], + "reducing_value": 5128.45, + "T_r": 345.857, + "n": [ + -6.218069939810391, + 4.25938169894919, + -4.417810181991655, + 23.70234830311772, + -50.98632502013336, + 29.108143754921628 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 161.34, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.85699999999935, + "using_tau_r": true, + "max_abserror_percentage": 0.021732921956241213, + "t": [ + 0.286, + 0.768, + 0.952, + 2.711, + 4.226, + 18.933 + ], + "reducing_value": 3761000.0, + "T_r": 345.857, + "n": [ + 0.002757544974908688, + 0.38770586469190393, + -6.752272877216631, + -0.5997730155885828, + -3.2285390578912927, + 91.83265252025414 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 161.34, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 345.85699999999935, + "using_tau_r": false, + "max_abserror_percentage": 0.6288812047839043, + "t": [ + 0.381, + 0.463, + 3.927, + 4.049, + 16.046, + 19.95 + ], + "reducing_value": 5128.45, + "T_r": 345.857, + "n": [ + 2.664780959919923, + -0.254772168947589, + 97.84474908938734, + -105.1304757408368, + 13272.94203979726, + -116968.31229953805 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R14_anc.json b/dev/ancillaries/R14_anc.json new file mode 100644 index 00000000..6c3de6b9 --- /dev/null +++ b/dev/ancillaries/R14_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 120.00000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 227.50999999999948, + "using_tau_r": true, + "max_abserror_percentage": 0.33080645372851603, + "t": [ + 0.063, + 0.359, + 1.297, + 1.319, + 2.397, + 5.575 + ], + "reducing_value": 3750000.0, + "T_r": 227.51, + "n": [ + 0.02977525843409753, + -0.18722735733648588, + -172.7753199533091, + 169.90412537233442, + -4.8505113444549774, + -0.3348515793791319 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 120.00000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 227.50999999999948, + "using_tau_r": true, + "max_abserror_percentage": 5.1008927560194151, + "t": [ + 0.736, + 0.901, + 2.569, + 5.322, + 12.251, + 18.19 + ], + "reducing_value": 7109.4194, + "T_r": 227.51, + "n": [ + -24.42524992497142, + 25.211693075765005, + -26.691222148617776, + 157.32675143002658, + -23298.685615045863, + 1035275.9594118744 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 120.00000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 227.50999999999948, + "using_tau_r": true, + "max_abserror_percentage": 0.056557492124520437, + "t": [ + 0.008, + 0.571, + 0.981, + 1.703, + 3.774, + 12.925 + ], + "reducing_value": 3750000.0, + "T_r": 227.51, + "n": [ + 0.008252828633147618, + -0.04268492478666484, + -6.191901989609247, + 0.35599848378130283, + -2.9637839791302523, + 25.20051432671624 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 120.00000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 227.50999999999948, + "using_tau_r": false, + "max_abserror_percentage": 4.3969071246018343, + "t": [ + 0.602, + 1.14, + 3.047, + 9.942, + 12.357, + 18.15 + ], + "reducing_value": 7109.4194, + "T_r": 227.51, + "n": [ + 5.827780226789797, + -7.357043181841783, + 21.151996405133726, + -14035.045227608716, + 101927.9835601533, + -2047064.5653545645 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R152A_anc.json b/dev/ancillaries/R152A_anc.json new file mode 100644 index 00000000..25fb4af2 --- /dev/null +++ b/dev/ancillaries/R152A_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 154.56, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 386.41099999999932, + "using_tau_r": true, + "max_abserror_percentage": 0.16059785174262764, + "t": [ + 0.085, + 0.94, + 1.166, + 4.638, + 6.935, + 17.582 + ], + "reducing_value": 4520000.0, + "T_r": 386.411, + "n": [ + -8.058110929331818e-05, + -5.144477525553562, + -1.521963154763345, + -6.312478722604828, + 5.544700008436013, + -111.12850271670084 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 154.56, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 386.41099999999932, + "using_tau_r": true, + "max_abserror_percentage": 1.6145478143872904, + "t": [ + 0.162, + 0.168, + 0.621, + 0.787, + 2.442, + 7.345 + ], + "reducing_value": 5571.452362568319, + "T_r": 386.411, + "n": [ + -24.05629942535681, + 24.599913141549887, + -10.746520376686876, + 5.86362610412505, + -3.7063275045589696, + -4.904962359487088 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 154.56, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 386.41099999999932, + "using_tau_r": true, + "max_abserror_percentage": 0.12140204459119008, + "t": [ + 0.049, + 0.993, + 1.692, + 3.445, + 15.803, + 17.838 + ], + "reducing_value": 4520000.0, + "T_r": 386.411, + "n": [ + -0.002091012267118934, + -6.995494450649338, + 0.9348417755500018, + -3.706406451221934, + -66.08072669965013, + 122.73360925177805 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 154.56, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 386.41099999999932, + "using_tau_r": false, + "max_abserror_percentage": 2.4821150192861241, + "t": [ + 0.091, + 0.499, + 16.122, + 16.122, + 19.05, + 19.528 + ], + "reducing_value": 5571.452362568319, + "T_r": 386.411, + "n": [ + 0.27636163699950356, + 2.512764633534828, + 162.80865128111427, + 345.16760517849104, + -475.5953680253087, + -1773.7454734026196 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R161_anc.json b/dev/ancillaries/R161_anc.json new file mode 100644 index 00000000..9e191530 --- /dev/null +++ b/dev/ancillaries/R161_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 130.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 375.24999999999937, + "using_tau_r": true, + "max_abserror_percentage": 0.030832559045790298, + "t": [ + 0.361, + 0.847, + 0.865, + 2.188, + 2.386, + 5.603 + ], + "reducing_value": 5010000.0, + "T_r": 375.25, + "n": [ + -0.007844518150924242, + 25.45019959482669, + -31.3504385516059, + 1.1481149665076051, + -2.6194902114004543, + -3.261988824418926 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 130.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 375.24999999999937, + "using_tau_r": true, + "max_abserror_percentage": 0.20059504347491597, + "t": [ + 0.148, + 0.482, + 0.891, + 2.774, + 4.26, + 6.784 + ], + "reducing_value": 6280.0, + "T_r": 375.25, + "n": [ + -0.3089763166551767, + -2.9925531954627664, + -1.8199815337621044, + -1.0253004294209247, + -2.9173025831139583, + -1.6688506440273063 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 130.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 375.24999999999937, + "using_tau_r": true, + "max_abserror_percentage": 0.028081837897198092, + "t": [ + 0.358, + 0.979, + 2.041, + 2.312, + 7.268, + 8.389 + ], + "reducing_value": 5010000.0, + "T_r": 375.25, + "n": [ + 0.004114007295473757, + -6.483344699665786, + 4.717832719212871, + -6.0036159561286375, + -8.92774506978172, + 6.727500969566306 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 130.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 375.24999999999937, + "using_tau_r": false, + "max_abserror_percentage": 0.09082481888231797, + "t": [ + 0.331, + 0.379, + 0.459, + 3.341, + 6.576, + 6.669 + ], + "reducing_value": 6280.0, + "T_r": 375.25, + "n": [ + 7.345119166859648, + -11.515617231318577, + 6.89480557431733, + -1.9186452820369757, + 183.43884409350315, + -184.35734585122438 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R218_anc.json b/dev/ancillaries/R218_anc.json new file mode 100644 index 00000000..2b97fb70 --- /dev/null +++ b/dev/ancillaries/R218_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 125.45000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.01999999999936, + "using_tau_r": true, + "max_abserror_percentage": 0.018024375182712493, + "t": [ + 1.008, + 1.599, + 1.665, + 2.07, + 4.314, + 17.759 + ], + "reducing_value": 2640000.0, + "T_r": 345.02, + "n": [ + -8.242713023595973, + 19.087798455338692, + -17.233089915234846, + -1.422792519033736, + -3.3648176664863447, + -10.213938754091759 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 125.45000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.01999999999936, + "using_tau_r": true, + "max_abserror_percentage": 0.092019595422410116, + "t": [ + 0.372, + 0.41, + 0.775, + 1.882, + 4.237, + 8.879 + ], + "reducing_value": 3340.0000000000005, + "T_r": 345.02, + "n": [ + 3.329585797093735, + -6.844734619770494, + -1.1111833788437069, + -2.0711985469576675, + -4.658013576000995, + 0.29142793495095165 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 125.45000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.01999999999936, + "using_tau_r": true, + "max_abserror_percentage": 0.056443721758769883, + "t": [ + 1.014, + 1.081, + 1.41, + 3.247, + 5.671, + 11.776 + ], + "reducing_value": 2640000.0, + "T_r": 345.02, + "n": [ + -12.499645349068787, + 6.002828616549345, + 0.016915019734164472, + -3.5468006592555676, + -1.0346388890887666, + -2.2559550336938123 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 125.45000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 345.01999999999936, + "using_tau_r": false, + "max_abserror_percentage": 0.30131835528779405, + "t": [ + 0.517, + 0.714, + 1.159, + 3.98, + 5.488, + 19.277 + ], + "reducing_value": 3340.0000000000005, + "T_r": 345.02, + "n": [ + 7.303753750603384, + -7.730626041358162, + 3.674253188196436, + -3.58395389631866, + 5.552496612344577, + -211.54319300173208 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R21_anc.json b/dev/ancillaries/R21_anc.json new file mode 100644 index 00000000..f7f0a5f7 --- /dev/null +++ b/dev/ancillaries/R21_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 451.47999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.06815685685508388, + "t": [ + 0.091, + 0.987, + 2.079, + 2.561, + 2.725, + 15.503 + ], + "reducing_value": 5181200.0, + "T_r": 451.48, + "n": [ + 0.0018788440318928358, + -6.563138713373014, + 4.137852310206907, + -6.289887616085091, + 0.10742860069097583, + -79.5502994261936 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 451.47999999999917, + "using_tau_r": true, + "max_abserror_percentage": 2.1714980536021722, + "t": [ + 0.194, + 0.256, + 0.429, + 4.632, + 9.16, + 13.215 + ], + "reducing_value": 5110.765599999999, + "T_r": 451.48, + "n": [ + -7.33498076512952, + 12.676510112148431, + -10.046553362223358, + -16.99517541299311, + 222.23399842968522, + -1233.3931692026647 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 451.47999999999917, + "using_tau_r": true, + "max_abserror_percentage": 0.058267854389759677, + "t": [ + 0.363, + 0.784, + 0.926, + 3.236, + 19.172, + 19.986 + ], + "reducing_value": 5181200.0, + "T_r": 451.48, + "n": [ + 0.015053861978396133, + 0.960309329970009, + -6.9145776997149255, + -2.9343265925945237, + 1384.3706348421958, + -2744.0923786590133 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 451.47999999999917, + "using_tau_r": false, + "max_abserror_percentage": 2.5271428508743421, + "t": [ + 0.122, + 0.902, + 1.769, + 5.732, + 16.703, + 19.838 + ], + "reducing_value": 5110.765599999999, + "T_r": 451.48, + "n": [ + 0.5619681997988593, + 4.92151800722533, + -5.5582908804962186, + 30.01966721829401, + -42929.54870444089, + 216673.96540670822 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R227EA_anc.json b/dev/ancillaries/R227EA_anc.json new file mode 100644 index 00000000..bc56aa92 --- /dev/null +++ b/dev/ancillaries/R227EA_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 146.34999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.8999999999993, + "using_tau_r": true, + "max_abserror_percentage": 0.014130102564613445, + "t": [ + 0.889, + 0.919, + 1.495, + 3.227, + 3.53, + 3.663 + ], + "reducing_value": 2925000.0, + "T_r": 374.9, + "n": [ + 10.093738859898867, + -16.82115838958235, + -0.07297852700598685, + -14.198048704342424, + 50.7816690049031, + -41.683491945535145 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 146.34999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.8999999999993, + "using_tau_r": true, + "max_abserror_percentage": 0.79209687006245311, + "t": [ + 0.434, + 0.676, + 0.691, + 4.287, + 4.613, + 19.251 + ], + "reducing_value": 3495.0, + "T_r": 374.9, + "n": [ + -6.947050225285722, + 123.4065348806111, + -122.5651518640378, + -9.994885618440552, + 3.478879029818986, + 245.61726193605475 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 146.34999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 374.8999999999993, + "using_tau_r": true, + "max_abserror_percentage": 0.010578535119587507, + "t": [ + 0.987, + 1.312, + 1.927, + 3.476, + 3.578, + 2.248 + ], + "reducing_value": 2925000.0, + "T_r": 374.9, + "n": [ + -7.109161477135856, + -0.43619976868074284, + 5.934481777381213, + 39.44778344273422, + -41.38716737709299, + -8.362365023243223 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 146.34999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 374.8999999999993, + "using_tau_r": false, + "max_abserror_percentage": 0.2727146007857062, + "t": [ + 0.12, + 0.35, + 2.248, + 2.467, + 3.208, + 12.192 + ], + "reducing_value": 3495.0, + "T_r": 374.9, + "n": [ + -0.037180636267061765, + 2.2565260411325867, + 16.777771835065064, + -22.313716095609287, + 6.793310681390873, + -10.89306852102585 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R22_anc.json b/dev/ancillaries/R22_anc.json new file mode 100644 index 00000000..a5f92a2a --- /dev/null +++ b/dev/ancillaries/R22_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 115.73000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.29499999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.01948277890697625, + "t": [ + 0.999, + 1.272, + 1.692, + 2.74, + 4.539, + 15.876 + ], + "reducing_value": 4990000.0, + "T_r": 369.295, + "n": [ + -7.2670371701641265, + 1.2860929616388512, + -0.10790119794275199, + -0.989473291657183, + -2.9393096353041623, + 0.488431917326884 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 115.73000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.29499999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.69073539646080651, + "t": [ + 0.343, + 0.528, + 1.104, + 4.839, + 7.214, + 11.11 + ], + "reducing_value": 6058.220000000001, + "T_r": 369.295, + "n": [ + -1.7899191799956613, + -1.332183889152018, + -2.5626654031276335, + -5.6750215901718954, + 0.6059879695747222, + 3.499235901423112 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 115.73000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.29499999999928, + "using_tau_r": true, + "max_abserror_percentage": 0.021684799425192303, + "t": [ + 0.806, + 0.979, + 1.977, + 2.453, + 4.897, + 8.097 + ], + "reducing_value": 4990000.0, + "T_r": 369.295, + "n": [ + 0.14078959771894048, + -6.6171269814683065, + 1.6782909752933965, + -2.5338941612118235, + -2.979681135700748, + 0.4341331068854343 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 115.73000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 369.29499999999928, + "using_tau_r": false, + "max_abserror_percentage": 0.33144702491900713, + "t": [ + 0.351, + 0.588, + 3.365, + 5.022, + 6.849, + 16.221 + ], + "reducing_value": 6058.220000000001, + "T_r": 369.295, + "n": [ + 1.854194439375902, + 0.5825631843499427, + 3.174073656022523, + -10.117473443656856, + 12.021023952475513, + -39.819978547168276 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R236EA_anc.json b/dev/ancillaries/R236EA_anc.json new file mode 100644 index 00000000..a16e2761 --- /dev/null +++ b/dev/ancillaries/R236EA_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 243.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 412.43999999999926, + "using_tau_r": true, + "max_abserror_percentage": 0.034501016229349091, + "t": [ + 0.072, + 0.159, + 0.28, + 0.975, + 3.343, + 5.012 + ], + "reducing_value": 3420000.0, + "T_r": 412.44, + "n": [ + -0.01366195244731475, + 0.028884775034159767, + -0.014637027617221486, + -6.940549344871703, + -2.9156270677455987, + -3.8449530863570414 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 243.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 412.43999999999926, + "using_tau_r": true, + "max_abserror_percentage": 3.254039687333421, + "t": [ + 0.463, + 1.088, + 4.746, + 7.264, + 10.426, + 11.817 + ], + "reducing_value": 3715.9999999999995, + "T_r": 412.44, + "n": [ + -4.265462216604608, + -0.5723936371527714, + -242.68126932071, + 5628.347652868032, + -158549.1553855615, + 335529.06839972973 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 243.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 412.43999999999926, + "using_tau_r": true, + "max_abserror_percentage": 0.13035323047732028, + "t": [ + 0.746, + 1.129, + 1.707, + 3.441, + 18.257, + 18.723 + ], + "reducing_value": 3420000.0, + "T_r": 412.44, + "n": [ + -1.086198070243854, + -8.147203344085657, + 3.4106562858664127, + -6.799234376411155, + 3319544.8718597437, + -4916875.643568467 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 243.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 412.43999999999926, + "using_tau_r": false, + "max_abserror_percentage": 1.85243167933693, + "t": [ + 0.643, + 0.695, + 1.291, + 2.156, + 5.361, + 12.859 + ], + "reducing_value": 3715.9999999999995, + "T_r": 412.44, + "n": [ + 73.91473114602317, + -84.48156059389362, + 27.6288904418195, + -25.47850648952525, + 91.75937442449276, + -17637.12637362363 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R236FA_anc.json b/dev/ancillaries/R236FA_anc.json new file mode 100644 index 00000000..4fae10dc --- /dev/null +++ b/dev/ancillaries/R236FA_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 179.59999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.06999999999931, + "using_tau_r": true, + "max_abserror_percentage": 0.28623680659642936, + "t": [ + 0.39, + 1.035, + 2.14, + 2.75, + 6.783, + 19.623 + ], + "reducing_value": 3200000.0, + "T_r": 398.07, + "n": [ + -0.07455034494245859, + -8.044729321497613, + 6.37817405215639, + -9.393255336834992, + -2.374713790526613, + -957.7075963285336 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 179.59999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.06999999999931, + "using_tau_r": true, + "max_abserror_percentage": 0.54865421576639761, + "t": [ + 0.436, + 1.661, + 2.91, + 3.307, + 5.447, + 6.392 + ], + "reducing_value": 3626.0, + "T_r": 398.07, + "n": [ + -3.799841638369613, + -7.207160418715132, + 47.73949958715277, + -59.040754885379386, + 33.03413077298916, + -27.228555278145553 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 179.59999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 398.06999999999931, + "using_tau_r": true, + "max_abserror_percentage": 0.029205453110847657, + "t": [ + 0.017, + 0.253, + 0.971, + 2.069, + 3.12, + 5.366 + ], + "reducing_value": 3200000.0, + "T_r": 398.07, + "n": [ + -0.0049249850273236865, + 0.012816148225752128, + -6.97674339296593, + 0.34709652116366274, + -3.3890300356223824, + -3.905418212194194 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 179.59999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 398.06999999999931, + "using_tau_r": false, + "max_abserror_percentage": 0.12903740875118697, + "t": [ + 0.177, + 0.276, + 0.561, + 0.741, + 1.15, + 3.764 + ], + "reducing_value": 3626.0, + "T_r": 398.07, + "n": [ + -0.6129462210275856, + 2.32975618477472, + 0.44026610528146576, + 0.18569408128843393, + 0.41600763700797233, + 0.3257761223988926 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R23_anc.json b/dev/ancillaries/R23_anc.json new file mode 100644 index 00000000..3fbe821c --- /dev/null +++ b/dev/ancillaries/R23_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 118.02000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 299.29299999999944, + "using_tau_r": true, + "max_abserror_percentage": 0.010075585009383659, + "t": [ + 1.014, + 1.178, + 2.077, + 3.82, + 3.866, + 12.722 + ], + "reducing_value": 4832000.0, + "T_r": 299.293, + "n": [ + -9.122332373664854, + 3.016924110443656, + -0.5967906858271617, + 9.579184584147457, + -12.877039154975156, + 0.4375260704699433 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 118.02000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 299.29299999999944, + "using_tau_r": true, + "max_abserror_percentage": 0.33657907146142918, + "t": [ + 0.475, + 0.852, + 1.451, + 1.751, + 2.978, + 14.67 + ], + "reducing_value": 7519.999999999999, + "T_r": 299.293, + "n": [ + -5.0704437393717505, + 4.7882747149545795, + -23.58027456800221, + 23.333602102883393, + -9.217295829606783, + 4.050830873748802 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 118.02000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 299.29299999999944, + "using_tau_r": true, + "max_abserror_percentage": 0.012654997293293224, + "t": [ + 0.996, + 1.088, + 1.946, + 2.549, + 4.598, + 9.592 + ], + "reducing_value": 4832000.0, + "T_r": 299.293, + "n": [ + -7.936902891620701, + 1.264449855550644, + 1.434041724133205, + -2.403496757193404, + -2.608881526209462, + 0.682818906962693 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 118.02000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 299.29299999999944, + "using_tau_r": false, + "max_abserror_percentage": 0.14053018994538702, + "t": [ + 0.212, + 0.25, + 0.358, + 0.841, + 9.921, + 17.541 + ], + "reducing_value": 7519.999999999999, + "T_r": 299.293, + "n": [ + -3.3533086837494186, + 5.426490146945459, + -0.27772667131392875, + 1.022401312663457, + 8.263580367250993, + -245.19616208727248 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R245fa_anc.json b/dev/ancillaries/R245fa_anc.json new file mode 100644 index 00000000..ee75635e --- /dev/null +++ b/dev/ancillaries/R245fa_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 171.05000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 427.15999999999934, + "using_tau_r": true, + "max_abserror_percentage": 0.018077333401533835, + "t": [ + 1.141, + 1.179, + 1.287, + 3.64, + 5.737, + 7.077 + ], + "reducing_value": 3651000.0, + "T_r": 427.16, + "n": [ + -125.12984314778919, + 152.9911248662765, + -35.27317598226143, + -4.102406386050718, + 0.25362281678701887, + -1.994325281027591 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 171.05000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 427.15999999999934, + "using_tau_r": true, + "max_abserror_percentage": 0.63750710104577557, + "t": [ + 0.383, + 0.46, + 1.442, + 1.848, + 3.855, + 12.963 + ], + "reducing_value": 3849.9999999999995, + "T_r": 427.16, + "n": [ + -2.215307322989694, + -1.1625687686537725, + -7.315572965034845, + 5.341825675363525, + -7.602957384362923, + 17.028040285012285 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 171.05000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 427.15999999999934, + "using_tau_r": true, + "max_abserror_percentage": 0.040993994916882492, + "t": [ + 0.01, + 0.975, + 2.763, + 4.376, + 4.413, + 6.994 + ], + "reducing_value": 3651000.0, + "T_r": 427.16, + "n": [ + 0.0004869832757370176, + -6.919145483936883, + -1.296447452384627, + -109.63729861885537, + 107.66538794686012, + -3.4622351305818055 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 171.05000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 427.15999999999934, + "using_tau_r": false, + "max_abserror_percentage": 0.67268271417491032, + "t": [ + 0.42, + 0.565, + 1.624, + 1.967, + 4.012, + 15.818 + ], + "reducing_value": 3849.9999999999995, + "T_r": 427.16, + "n": [ + 5.25176887594682, + -4.096294176783149, + 10.999081251417799, + -11.640705049730522, + 4.081973016432867, + -133.73894447755137 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R32_anc.json b/dev/ancillaries/R32_anc.json new file mode 100644 index 00000000..18f20657 --- /dev/null +++ b/dev/ancillaries/R32_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 136.34, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 351.2549999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.014552255075406251, + "t": [ + 0.825, + 0.962, + 1.345, + 2.81, + 3.343, + 3.702 + ], + "reducing_value": 5782000.0, + "T_r": 351.255, + "n": [ + 0.7749641243552982, + -7.69732080181333, + 0.6436919306295109, + -2.862828303715926, + 8.09924761745426, + -8.871716790404001 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 136.34, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 351.2549999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.88878820762530175, + "t": [ + 0.069, + 0.425, + 1.18, + 8.115, + 12.06, + 16.085 + ], + "reducing_value": 8150.084599999999, + "T_r": 351.255, + "n": [ + -0.06522522852577171, + -3.3577643698607456, + -2.746299718061842, + -64.77289013657663, + 511.3349286855849, + -1525.315265366156 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 136.34, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 351.2549999999992, + "using_tau_r": true, + "max_abserror_percentage": 0.01115469543861991, + "t": [ + 0.531, + 0.979, + 2.203, + 2.382, + 3.421, + 3.558 + ], + "reducing_value": 5782000.0, + "T_r": 351.255, + "n": [ + 0.019194334673139708, + -6.794802163795212, + 9.276391392786632, + -12.327153852761946, + 28.46579606476374, + -28.570870718190093 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 136.34, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 351.2549999999992, + "using_tau_r": false, + "max_abserror_percentage": 0.26499733941445225, + "t": [ + 0.358, + 0.676, + 0.831, + 0.88, + 2.592, + 16.556 + ], + "reducing_value": 8150.084599999999, + "T_r": 351.255, + "n": [ + 3.0283368557227064, + -13.30754793568124, + 53.97035773548243, + -41.10515088784585, + 0.6410010855629815, + -18.757652443918627 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R365MFC_anc.json b/dev/ancillaries/R365MFC_anc.json new file mode 100644 index 00000000..1c77ea63 --- /dev/null +++ b/dev/ancillaries/R365MFC_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 239.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 459.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.011549392315912677, + "t": [ + 0.959, + 1.095, + 1.357, + 2.43, + 4.143, + 6.68 + ], + "reducing_value": 3266000.0, + "T_r": 460.0, + "n": [ + -3.5153740894977616, + -7.176938320983536, + 5.166558678229452, + -3.5278281028276717, + -1.4779765313329785, + -2.866915101721763 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 239.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 459.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 1.0623577336764445, + "t": [ + 0.326, + 1.306, + 2.168, + 3.262, + 5.147, + 15.037 + ], + "reducing_value": 3200.0, + "T_r": 460.0, + "n": [ + -2.321900801891659, + -12.318486255432273, + 29.90077432524069, + -52.89208803147019, + 57.15577614474706, + -6130.399386014779 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 239.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 459.99999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.010216992707168249, + "t": [ + 0.991, + 1.975, + 2.924, + 3.462, + 7.169, + 12.273 + ], + "reducing_value": 3266000.0, + "T_r": 460.0, + "n": [ + -7.611425283264201, + 3.9042179746841317, + -14.051415772751833, + 9.298084346936626, + -12.226784626997082, + 58.35959676825318 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 239.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 459.99999999999886, + "using_tau_r": false, + "max_abserror_percentage": 0.19814530537414221, + "t": [ + 0.197, + 0.347, + 0.68, + 4.264, + 5.751, + 18.372 + ], + "reducing_value": 3200.0, + "T_r": 460.0, + "n": [ + 0.26150334292302974, + 1.2960567437114034, + 1.1054962724493822, + -1.9624874038489026, + 6.877950747305875, + -9775.478987767088 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R404A_anc.json b/dev/ancillaries/R404A_anc.json new file mode 100644 index 00000000..939ae251 --- /dev/null +++ b/dev/ancillaries/R404A_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.26999999999919, + "using_tau_r": true, + "max_abserror_percentage": 0.0075592841378480102, + "t": [ + 0.951, + 1.13, + 2.426, + 2.778, + 5.072, + 16.153 + ], + "reducing_value": 3734800.0, + "T_r": 345.27, + "n": [ + -5.364477716661244, + -1.4230007624991121, + 3.314690272990208, + -5.181329955404622, + -3.360484849212965, + -551.2801078830697 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.26999999999919, + "using_tau_r": true, + "max_abserror_percentage": 1.2085148467457896, + "t": [ + 0.485, + 0.989, + 1.431, + 2.495, + 7.812, + 15.329 + ], + "reducing_value": 4939.999999999999, + "T_r": 345.27, + "n": [ + -5.211849919504925, + 6.798109425092868, + -13.038945243933242, + 9.654798311425768, + -320.35292894913766, + 80023.04183470446 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 345.26999999999919, + "using_tau_r": true, + "max_abserror_percentage": 0.0054984474830988006, + "t": [ + 0.688, + 0.743, + 0.963, + 3.561, + 4.194, + 10.201 + ], + "reducing_value": 3734800.0, + "T_r": 345.27, + "n": [ + 0.5635840402585297, + -0.5827522825709982, + -6.4663745582192815, + -2.8281654415264432, + -0.7995458853560359, + -11.354572861041914 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 345.26999999999919, + "using_tau_r": false, + "max_abserror_percentage": 0.7483321289055711, + "t": [ + 0.066, + 0.377, + 8.99, + 13.98, + 15.982, + 17.954 + ], + "reducing_value": 4939.999999999999, + "T_r": 345.27, + "n": [ + -0.011777381218307114, + 2.4984547682678704, + 5367.932468376006, + -3732982.2139762687, + 33474569.015986394, + -80262239.93679684 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R407C_anc.json b/dev/ancillaries/R407C_anc.json new file mode 100644 index 00000000..9a6068e6 --- /dev/null +++ b/dev/ancillaries/R407C_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 359.34499999999912, + "using_tau_r": true, + "max_abserror_percentage": 0.01660405084527028, + "t": [ + 0.289, + 0.798, + 1.03, + 2.282, + 3.477, + 10.467 + ], + "reducing_value": 4631700.0, + "T_r": 359.345, + "n": [ + -0.02526319311536476, + -1.4911994937454576, + -5.422666319606085, + 0.46047437701559923, + -4.5527752103859545, + -22.506926177764264 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 359.34499999999912, + "using_tau_r": true, + "max_abserror_percentage": 0.071581860353342464, + "t": [ + 0.36, + 0.53, + 1.61, + 2.842, + 3.565, + 7.376 + ], + "reducing_value": 5260.000046401775, + "T_r": 359.345, + "n": [ + -0.7403294274768993, + -3.4984730053164657, + -3.707063870074722, + 9.58842271173753, + -15.235025525549892, + 7.7277234094710305 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 359.34499999999912, + "using_tau_r": true, + "max_abserror_percentage": 0.0093179454061953493, + "t": [ + 0.446, + 1.145, + 1.222, + 1.436, + 4.271, + 4.452 + ], + "reducing_value": 4631700.0, + "T_r": 359.345, + "n": [ + 0.16728493073329312, + -53.38279226938705, + 60.42641909765115, + -14.171031944447838, + -2.416970185723638, + -0.6842647633262893 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 359.34499999999912, + "using_tau_r": false, + "max_abserror_percentage": 0.51024255100416971, + "t": [ + 0.478, + 1.487, + 1.826, + 2.271, + 3.413, + 4.019 + ], + "reducing_value": 5260.000046401775, + "T_r": 359.345, + "n": [ + 5.484626525085367, + -132.94290476910828, + 390.0966131363964, + -414.8227131759332, + 424.49338909908334, + -294.0732646506709 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R407F_anc.json b/dev/ancillaries/R407F_anc.json new file mode 100644 index 00000000..046f1651 --- /dev/null +++ b/dev/ancillaries/R407F_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 353.80399999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.006709338517751906, + "t": [ + 0.544, + 1.021, + 2.453, + 2.649, + 4.511, + 19.063 + ], + "reducing_value": 4754610.0, + "T_r": 355.804, + "n": [ + -0.38361210624877035, + -6.8166799637146385, + 6.670093638416114, + -7.979857034701732, + -4.130000783307335, + 208.07536824399065 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 353.80399999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.07565166107470489, + "t": [ + 0.443, + 0.467, + 0.592, + 0.665, + 5.731, + 7.406 + ], + "reducing_value": 5816.413452386901, + "T_r": 355.804, + "n": [ + 214.85210396827435, + -313.11182553492205, + 201.19155503500085, + -109.12625937992796, + -33.24262430077338, + 53.63446483594108 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 353.80399999999997, + "using_tau_r": true, + "max_abserror_percentage": 0.0076164208883788831, + "t": [ + 0.439, + 1.07, + 1.092, + 3.569, + 5.912, + 14.442 + ], + "reducing_value": 4754610.0, + "T_r": 355.804, + "n": [ + 0.1159845587659482, + -45.14203725344806, + 38.76580743774572, + -3.6246669768527813, + 1.2125998610343205, + -241.6797313155363 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 353.80399999999997, + "using_tau_r": false, + "max_abserror_percentage": 13.623013683467789, + "t": [ + 1.486, + 1.821, + 4.222, + 4.715, + 5.653, + 9.733 + ], + "reducing_value": 5816.413452386901, + "T_r": 355.804, + "n": [ + 249.94339776889024, + -496.98148269019805, + 23067.350828436676, + -49252.977921350845, + 37505.03529944621, + -48333.84743728163 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R410A_anc.json b/dev/ancillaries/R410A_anc.json new file mode 100644 index 00000000..bc6396c5 --- /dev/null +++ b/dev/ancillaries/R410A_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 344.49399999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.0064675030312377757, + "t": [ + 1.018, + 1.285, + 1.862, + 3.869, + 5.725, + 10.878 + ], + "reducing_value": 4901200.0, + "T_r": 344.494, + "n": [ + -8.81630527169583, + 3.0101820364714076, + -1.0140011045291613, + -3.736880461403412, + 1.478360466811462, + -34.64742822281509 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 344.49399999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.9578523644759418, + "t": [ + 0.676, + 0.844, + 1.394, + 2.411, + 3.149, + 7.808 + ], + "reducing_value": 6323.999999999999, + "T_r": 344.494, + "n": [ + -25.00709732482156, + 34.83593078562833, + -33.0203056956001, + 61.19129776625034, + -63.32155175461899, + 149.8912653231937 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 344.49399999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.00095157166312143104, + "t": [ + 1.002, + 1.579, + 2.313, + 2.841, + 3.77, + 5.337 + ], + "reducing_value": 4901200.0, + "T_r": 344.494, + "n": [ + -7.393982466686463, + 1.4712516902869381, + -0.10468488716031096, + -2.612149622992068, + 0.24139536090585145, + -2.688737604664642 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 344.49399999999923, + "using_tau_r": false, + "max_abserror_percentage": 7.697047402658308, + "t": [ + 0.732, + 1.165, + 2.775, + 3.462, + 15.531, + 15.944 + ], + "reducing_value": 6323.999999999999, + "T_r": 344.494, + "n": [ + 17.62376356934577, + -34.49248423230781, + 229.4790425881445, + -332.5139608181856, + 23058076.978355706, + -31889422.797179773 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R41_anc.json b/dev/ancillaries/R41_anc.json new file mode 100644 index 00000000..fd418352 --- /dev/null +++ b/dev/ancillaries/R41_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 129.81999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 317.27999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.15645750589323715, + "t": [ + 0.46, + 0.927, + 2.874, + 5.487, + 19.242, + 19.913 + ], + "reducing_value": 5897000.0, + "T_r": 317.28, + "n": [ + 0.12971871512357153, + -5.9852575632628975, + -1.435680721064538, + -1.6875218267186987, + -4576.732357704876, + 6338.17799782736 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 129.81999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 317.27999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.48436112208114501, + "t": [ + 0.471, + 0.914, + 1.181, + 6.61, + 8.764, + 19.551 + ], + "reducing_value": 9300.0, + "T_r": 317.28, + "n": [ + -4.548581015916281, + 2.6834555626875343, + -3.8161276706535663, + -15.526729016233224, + 21.743182012896813, + -33.19736982637592 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 129.81999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 317.27999999999923, + "using_tau_r": true, + "max_abserror_percentage": 0.15638113977944901, + "t": [ + 0.321, + 0.945, + 0.945, + 3.51, + 6.214, + 19.933 + ], + "reducing_value": 5897000.0, + "T_r": 317.28, + "n": [ + 0.039268780221147596, + 0.8889694467325728, + -6.90749554283487, + -2.0706202534383804, + -0.8793688751729696, + -73.19636369827167 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 129.81999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 317.27999999999923, + "using_tau_r": false, + "max_abserror_percentage": 0.8215334421917353, + "t": [ + 0.408, + 2.476, + 3.081, + 3.478, + 4.372, + 18.469 + ], + "reducing_value": 9300.0, + "T_r": 317.28, + "n": [ + 2.597706385655882, + -22.310070383317598, + 139.51691751158674, + -170.32067961108578, + 59.24775396461156, + -887.3638436688191 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/R507A_anc.json b/dev/ancillaries/R507A_anc.json new file mode 100644 index 00000000..e68170b8 --- /dev/null +++ b/dev/ancillaries/R507A_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 343.66499999999996, + "using_tau_r": true, + "max_abserror_percentage": 0.0033108458033170862, + "t": [ + 0.934, + 1.317, + 1.36, + 1.517, + 2.953, + 4.281 + ], + "reducing_value": 3704900.0, + "T_r": 343.765, + "n": [ + -3.506064016514385, + -115.18699076403108, + 141.5972032989957, + -30.266964825300732, + 0.667184221216585, + -4.547368841632091 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 343.66499999999996, + "using_tau_r": true, + "max_abserror_percentage": 0.12368519354006846, + "t": [ + 0.11, + 0.26, + 0.286, + 0.563, + 2.03, + 2.811 + ], + "reducing_value": 4964.029650250053, + "T_r": 343.765, + "n": [ + 3.975317800427674, + -74.1368924572824, + 75.98726158051952, + -11.56733447604713, + 3.084500064878586, + -6.722628041295302 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 343.66499999999996, + "using_tau_r": true, + "max_abserror_percentage": 0.0029257924663905754, + "t": [ + 0.997, + 1.739, + 2.101, + 3.071, + 6.549, + 5.486 + ], + "reducing_value": 3704900.0, + "T_r": 343.765, + "n": [ + -7.291485093580165, + 3.989053632187489, + -4.617714085589758, + 0.4125533312094876, + 8.897382199467017, + -10.46532521391475 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 343.66499999999996, + "using_tau_r": false, + "max_abserror_percentage": 0.019343662717119514, + "t": [ + 0.093, + 0.162, + 0.914, + 1.425, + 2.269, + 7.339 + ], + "reducing_value": 4964.029650250053, + "T_r": 343.765, + "n": [ + -1.1909272837212852, + 2.4301888224201074, + 3.512171521080571, + -3.7013727137258634, + 2.358426436855713, + -3.9469718132522256 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/RC318_anc.json b/dev/ancillaries/RC318_anc.json new file mode 100644 index 00000000..e34ef4ea --- /dev/null +++ b/dev/ancillaries/RC318_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 233.34999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 388.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.019138741986390873, + "t": [ + 0.757, + 0.927, + 1.008, + 3.144, + 7.985, + 9.574 + ], + "reducing_value": 2777500.0, + "T_r": 388.38, + "n": [ + 0.6272221156142272, + -5.660532994783813, + -1.6700293408866094, + -3.773490208362589, + -12.207260334963234, + 16.852569052164345 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 233.34999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 388.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.28830963833799128, + "t": [ + 0.117, + 0.455, + 0.746, + 1.132, + 8.848, + 9.296 + ], + "reducing_value": 3099.38, + "T_r": 388.38, + "n": [ + 0.06881363274511793, + -4.9709012896577605, + 3.1335807931630963, + -4.8498027190461865, + -3405.1114368231356, + 4685.608624866425 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 233.34999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 388.37999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.019138662643680693, + "t": [ + 1.017, + 1.071, + 2.454, + 3.687, + 9.48, + 0.506 + ], + "reducing_value": 2777500.0, + "T_r": 388.38, + "n": [ + -15.102617412971505, + 8.53184439256971, + -1.3014556054852215, + -3.286800573693744, + -8.150652838303959, + 0.020748299859318566 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 233.34999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 388.37999999999914, + "using_tau_r": false, + "max_abserror_percentage": 0.54646702636829136, + "t": [ + 0.52, + 0.979, + 2.105, + 2.269, + 3.362, + 4.954 + ], + "reducing_value": 3099.38, + "T_r": 388.38, + "n": [ + 6.172092166054074, + -13.109692547967464, + 382.2970506693918, + -475.82711917828664, + 190.84639492080177, + -142.60801162239488 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/SES36_anc.json b/dev/ancillaries/SES36_anc.json new file mode 100644 index 00000000..e63372df --- /dev/null +++ b/dev/ancillaries/SES36_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 449.69999999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.017640975882415866, + "t": [ + 0.974, + 2.779, + 2.844, + 3.772, + 7.421, + 0.05 + ], + "reducing_value": 2849000.0, + "T_r": 450.7, + "n": [ + -6.90981348357958, + 89.16905194351246, + -105.02405729377713, + 22.318938930206983, + 1.47576936609016, + 0.0011044975714101391 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 449.69999999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.92086151860601984, + "t": [ + 0.255, + 0.735, + 9.593, + 11.754, + 13.881, + 14.759 + ], + "reducing_value": 2800.0, + "T_r": 450.7, + "n": [ + -1.0565695975523393, + -4.865397232556856, + -2857.7245742569876, + 37955.160377325, + -247064.37597197696, + 251925.03410020104 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 449.69999999999999, + "using_tau_r": true, + "max_abserror_percentage": 0.019782329236750495, + "t": [ + 1.04, + 1.088, + 5.154, + 3.311, + 3.736, + 17.742 + ], + "reducing_value": 2849000.0, + "T_r": 450.7, + "n": [ + -20.411570888161084, + 13.911281348192677, + 3.400129319687265, + -19.83249137881619, + 23.65583392345494, + -10.204040663233801 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 449.69999999999999, + "using_tau_r": false, + "max_abserror_percentage": 32.94120614200753, + "t": [ + 2.448, + 3.217, + 5.164, + 7.701, + 8.763, + 17.504 + ], + "reducing_value": 2800.0, + "T_r": 450.7, + "n": [ + 514.1312054060722, + -1848.2456018708629, + 8650.456163417914, + -72548.98608130115, + 94049.29472462909, + -496673.06801196904 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/SulfurDioxide_anc.json b/dev/ancillaries/SulfurDioxide_anc.json new file mode 100644 index 00000000..131abef4 --- /dev/null +++ b/dev/ancillaries/SulfurDioxide_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 197.69999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 430.63999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.038603551098104205, + "t": [ + 0.054, + 0.303, + 0.962, + 2.441, + 4.086, + 7.163 + ], + "reducing_value": 7884000.0, + "T_r": 430.64, + "n": [ + -0.004409358780634517, + 0.023504159919188104, + -6.289629332573044, + -0.7188570157243328, + -3.1262175770534815, + -0.40365131803574894 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 197.69999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 430.63999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.29391708564611152, + "t": [ + 0.374, + 0.417, + 1.321, + 5.232, + 9.533, + 14.482 + ], + "reducing_value": 8195.0, + "T_r": 430.64, + "n": [ + 1.0280623430324556, + -4.535655163708297, + -2.6324475896031925, + -7.070153809118907, + -2.7025088444376912, + 172.3490226686549 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 197.69999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 430.63999999999891, + "using_tau_r": true, + "max_abserror_percentage": 0.11026707702719296, + "t": [ + 0.277, + 0.828, + 0.893, + 2.77, + 5.132, + 5.245 + ], + "reducing_value": 7884000.0, + "T_r": 430.64, + "n": [ + -0.01541318834753553, + 5.736549166205164, + -11.904114521692316, + -1.6686228028226027, + -13.207056333610284, + 10.603528318065084 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 197.69999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 430.63999999999891, + "using_tau_r": false, + "max_abserror_percentage": 0.52046167411816668, + "t": [ + 0.429, + 1.303, + 1.358, + 1.968, + 12.316, + 18.012 + ], + "reducing_value": 8195.0, + "T_r": 430.64, + "n": [ + 3.223449710407596, + -77.05672749784918, + 85.25360653529852, + -9.647788575068123, + 455.1933494065884, + -10290.419671830146 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/SulfurHexafluoride_anc.json b/dev/ancillaries/SulfurHexafluoride_anc.json new file mode 100644 index 00000000..cffc66e8 --- /dev/null +++ b/dev/ancillaries/SulfurHexafluoride_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 223.55500000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 318.72319999999939, + "using_tau_r": true, + "max_abserror_percentage": 0.0071986271347523889, + "t": [ + 0.721, + 0.9, + 0.96, + 1.683, + 3.649, + 5.325 + ], + "reducing_value": 3754983.0, + "T_r": 318.7232, + "n": [ + 0.13866254916941095, + 0.8361075774534089, + -7.3007117139128805, + 0.28277858186797933, + -4.001104677792867, + 3.3226792275810393 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 223.55500000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 318.72319999999939, + "using_tau_r": true, + "max_abserror_percentage": 0.25160354237053761, + "t": [ + 0.452, + 0.51, + 1.021, + 1.739, + 8.69, + 16.008 + ], + "reducing_value": 5082.317411198119, + "T_r": 318.7232, + "n": [ + -8.935879409973415, + 7.030558315225393, + -4.599609615155371, + 1.6300884890508534, + -2145.5926123421355, + 7242407.029292246 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 223.55500000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 318.72319999999939, + "using_tau_r": true, + "max_abserror_percentage": 0.00038142233819149496, + "t": [ + 0.888, + 1.017, + 1.742, + 3.975, + 4.849, + 1.549 + ], + "reducing_value": 3754983.0, + "T_r": 318.7232, + "n": [ + -0.3409184825729817, + -7.189246611969527, + -4.574500860459857, + -2.1124260160105846, + -0.884461264916517, + 5.474973854948071 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 223.55500000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 318.72319999999939, + "using_tau_r": false, + "max_abserror_percentage": 0.22597643431585546, + "t": [ + 0.162, + 0.34, + 1.704, + 5.628, + 6.422, + 9.099 + ], + "reducing_value": 5082.317411198119, + "T_r": 318.7232, + "n": [ + -0.09723399675840705, + 2.15858946914358, + 1.7637219963539608, + -1153.263728198288, + 3460.272067774808, + -16941.095002681574 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Toluene_anc.json b/dev/ancillaries/Toluene_anc.json new file mode 100644 index 00000000..b4544f7d --- /dev/null +++ b/dev/ancillaries/Toluene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 178.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 591.74999999999875, + "using_tau_r": true, + "max_abserror_percentage": 0.0095391286082047166, + "t": [ + 1.081, + 1.11, + 2.974, + 5.067, + 13.97, + 17.253 + ], + "reducing_value": 4126000.0, + "T_r": 591.75, + "n": [ + -41.682551388800405, + 35.681619568443324, + -2.4647898129932573, + -2.2965822444409394, + 1.6090346729113876, + -6.971566618092907 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 178.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 591.74999999999875, + "using_tau_r": true, + "max_abserror_percentage": 0.61045217027305698, + "t": [ + 0.4, + 0.697, + 3.764, + 8.691, + 19.351, + 19.782 + ], + "reducing_value": 3169.0, + "T_r": 591.75, + "n": [ + -2.079525851134041, + -3.0632853262137703, + -5.643041080974643, + 3.9792497484198788, + -2638.7103858281944, + 2945.506923819063 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 178.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 591.74999999999875, + "using_tau_r": true, + "max_abserror_percentage": 0.013628695855705253, + "t": [ + 1.041, + 1.184, + 3.013, + 5.82, + 8.325, + 15.907 + ], + "reducing_value": 4126000.0, + "T_r": 591.75, + "n": [ + -11.639922828598088, + 5.650211353764286, + -2.6974053250328165, + -3.164119945892499, + 1.8859792463505036, + -5.2234698853395525 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 178.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 591.74999999999875, + "using_tau_r": false, + "max_abserror_percentage": 0.81979670868705945, + "t": [ + 0.413, + 1.151, + 1.592, + 6.141, + 12.914, + 18.579 + ], + "reducing_value": 3169.0, + "T_r": 591.75, + "n": [ + 2.731439741297877, + -1.4311921172736468, + 1.7220225715861872, + -1.3959592517619432, + 25.019574322670564, + -106.28098773992355 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Water_anc.json b/dev/ancillaries/Water_anc.json new file mode 100644 index 00000000..77db4c1f --- /dev/null +++ b/dev/ancillaries/Water_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 273.16000000000003, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 647.09599999999853, + "using_tau_r": true, + "max_abserror_percentage": 0.01384518934277601, + "t": [ + 1.018, + 1.206, + 2.327, + 5.753, + 4.215, + 14.951 + ], + "reducing_value": 22064000.0, + "T_r": 647.096, + "n": [ + -9.75639641045262, + 3.3357600887120102, + -1.10029278432831, + 0.02037617155190105, + -2.6668589845604367, + 6.676721087238668 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 273.16000000000003, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 647.09599999999853, + "using_tau_r": true, + "max_abserror_percentage": 0.24572030547718171, + "t": [ + 0.21, + 0.262, + 0.701, + 3.909, + 4.076, + 17.459 + ], + "reducing_value": 17873.72799560906, + "T_r": 647.096, + "n": [ + 0.9791749335365787, + -2.6190679042770215, + -3.9166443712365235, + -20.313306821636637, + 16.497589490043744, + -125.36580458432083 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 273.16000000000003, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 647.09599999999853, + "using_tau_r": true, + "max_abserror_percentage": 0.015027600651340567, + "t": [ + 1.091, + 1.107, + 2.247, + 2.917, + 9.963, + 3.376 + ], + "reducing_value": 22064000.0, + "T_r": 647.096, + "n": [ + -86.4054293321618, + 80.46357460741712, + -4.106663588117775, + 9.324398078701453, + 0.3843684347038061, + -9.322932534449132 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 273.16000000000003, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 647.09599999999853, + "using_tau_r": false, + "max_abserror_percentage": 0.14434134863475778, + "t": [ + 0.276, + 0.455, + 7.127, + 9.846, + 11.707, + 17.805 + ], + "reducing_value": 17873.72799560906, + "T_r": 647.096, + "n": [ + 0.8157021355019343, + 2.0434712177006693, + -78.58278372496308, + 1026.4273940070307, + -2290.5642779377695, + 8420.141408210317 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/Xenon_anc.json b/dev/ancillaries/Xenon_anc.json new file mode 100644 index 00000000..145a14c2 --- /dev/null +++ b/dev/ancillaries/Xenon_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 161.40000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 289.73299999999949, + "using_tau_r": true, + "max_abserror_percentage": 0.003330663663103639, + "t": [ + 1.057, + 1.12, + 3.837, + 4.253, + 9.273, + 1.349 + ], + "reducing_value": 5842000.0, + "T_r": 289.733, + "n": [ + -16.19625075039699, + 11.57828555218498, + -0.8039722338089157, + -0.44871260923308376, + -3.2943901833234577, + -0.38871476100259306 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 161.40000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 289.73299999999949, + "using_tau_r": true, + "max_abserror_percentage": 0.55708784824759494, + "t": [ + 0.415, + 0.698, + 2.925, + 14.138, + 18.611, + 19.123 + ], + "reducing_value": 8400.0, + "T_r": 289.733, + "n": [ + -2.3064783393038195, + -1.620761716561509, + -2.202094575030882, + 84230.43322373286, + -29642269.39439326, + 40329098.33422997 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 161.40000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 289.73299999999949, + "using_tau_r": true, + "max_abserror_percentage": 0.011854794678511915, + "t": [ + 0.927, + 0.954, + 1.098, + 1.658, + 4.602, + 7.358 + ], + "reducing_value": 5842000.0, + "T_r": 289.733, + "n": [ + 11.759823036499577, + -19.398618185657206, + 2.5732301247266913, + 0.020967271862947154, + -1.9842834228505148, + 1.309146521589442 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 161.40000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 289.73299999999949, + "using_tau_r": false, + "max_abserror_percentage": 0.442478347100006, + "t": [ + 0.084, + 0.346, + 2.447, + 5.49, + 6.019, + 15.158 + ], + "reducing_value": 8400.0, + "T_r": 289.733, + "n": [ + -0.07701425735191812, + 2.124910237054726, + 3.0205260680663732, + -192.08348472998213, + 269.9245321947838, + -15087.387586364559 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/cis-2-Butene_anc.json b/dev/ancillaries/cis-2-Butene_anc.json new file mode 100644 index 00000000..e3b472e1 --- /dev/null +++ b/dev/ancillaries/cis-2-Butene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 134.30000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 435.74999999999909, + "using_tau_r": true, + "max_abserror_percentage": 0.2486366837373688, + "t": [ + 0.374, + 0.967, + 1.328, + 1.817, + 3.932, + 7.404 + ], + "reducing_value": 4225500.0, + "T_r": 435.75, + "n": [ + 0.04889427368224387, + -6.630115219199998, + 1.085463127003139, + -0.8224811391469051, + -3.0113284495745924, + -0.7621234290339737 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 134.30000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 435.74999999999909, + "using_tau_r": true, + "max_abserror_percentage": 0.36720202981660455, + "t": [ + 0.539, + 0.554, + 0.74, + 3.876, + 7.701, + 19.761 + ], + "reducing_value": 4244.0, + "T_r": 435.75, + "n": [ + -84.9269743250438, + 89.02084598490362, + -9.271866684444854, + -4.116354594069339, + -1.1445772731784132, + 16.852533778316815 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 134.30000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 435.74999999999909, + "using_tau_r": true, + "max_abserror_percentage": 0.24855875518168258, + "t": [ + 0.331, + 0.886, + 1.813, + 2.731, + 2.888, + 8.459 + ], + "reducing_value": 4225500.0, + "T_r": 435.75, + "n": [ + 0.0677302414418938, + -4.8343076872999236, + -5.4106633030712565, + 41.30992857221284, + -40.52816223536726, + -0.6515323361189119 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 134.30000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 435.74999999999909, + "using_tau_r": false, + "max_abserror_percentage": 0.13490879855498905, + "t": [ + 0.26, + 0.351, + 0.795, + 0.831, + 1.18, + 2.144 + ], + "reducing_value": 4244.0, + "T_r": 435.75, + "n": [ + -2.0818345732351684, + 6.807747893614343, + -111.04784929056088, + 120.09826778110036, + -12.601532453548211, + 1.7960675631510878 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/m-Xylene_anc.json b/dev/ancillaries/m-Xylene_anc.json new file mode 100644 index 00000000..aaf378c0 --- /dev/null +++ b/dev/ancillaries/m-Xylene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 225.30000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.88999999999896, + "using_tau_r": true, + "max_abserror_percentage": 0.011448642296418843, + "t": [ + 0.932, + 0.948, + 1.792, + 2.065, + 3.546, + 6.706 + ], + "reducing_value": 3534600.0, + "T_r": 616.89, + "n": [ + 16.462027456851953, + -23.613777199675944, + 2.341442695879726, + -2.172024345368255, + -3.2181295708930437, + -1.3831666730887018 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 225.30000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.88999999999896, + "using_tau_r": true, + "max_abserror_percentage": 1.2356743428769246, + "t": [ + 0.054, + 0.43, + 1.276, + 2.589, + 2.714, + 8.624 + ], + "reducing_value": 2665.0, + "T_r": 616.89, + "n": [ + -0.07808901638966609, + -3.249336299391575, + -5.108399766940012, + 68.16749399679267, + -70.92698933428645, + 1.963032740598388 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 225.30000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.88999999999896, + "using_tau_r": true, + "max_abserror_percentage": 0.019676450599204198, + "t": [ + 0.851, + 0.937, + 2.972, + 3.057, + 4.361, + 5.208 + ], + "reducing_value": 3534600.0, + "T_r": 616.89, + "n": [ + 2.4225991542349563, + -9.171820614479033, + 24.85348223089516, + -29.695524816912616, + 4.675951352907592, + -4.550257595781603 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 225.30000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 616.88999999999896, + "using_tau_r": false, + "max_abserror_percentage": 0.020112847012532242, + "t": [ + 0.262, + 0.821, + 0.965, + 0.987, + 1.389, + 2.441 + ], + "reducing_value": 2665.0, + "T_r": 616.89, + "n": [ + 1.1684596769577356, + -11.068326498191913, + 239.3508126040545, + -235.63804962721167, + 9.613596620997477, + -0.5483150812209723 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Butane_anc.json b/dev/ancillaries/n-Butane_anc.json new file mode 100644 index 00000000..14ddec54 --- /dev/null +++ b/dev/ancillaries/n-Butane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 134.89500000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 425.12499999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.02366371569104686, + "t": [ + 0.743, + 0.984, + 1.886, + 2.16, + 3.286, + 4.231 + ], + "reducing_value": 3796000.0, + "T_r": 425.125, + "n": [ + 0.06986482880463143, + -6.689091326409199, + 4.774874567188075, + -5.7054710938841655, + 1.8437119133933968, + -3.735372218319482 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 134.89500000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 425.12499999999898, + "using_tau_r": true, + "max_abserror_percentage": 1.1838723681035446, + "t": [ + 0.448, + 1.717, + 4.443, + 7.472, + 13.095, + 14.725 + ], + "reducing_value": 3922.7696129878086, + "T_r": 425.125, + "n": [ + -3.756767939636941, + -2.819084986331516, + 2.3817493893256763, + -27.835034497609627, + 409.95394459399324, + -539.2138907428523 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 134.89500000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 425.12499999999898, + "using_tau_r": true, + "max_abserror_percentage": 0.02500890020828983, + "t": [ + 0.978, + 1.371, + 1.499, + 1.748, + 4.108, + 4.752 + ], + "reducing_value": 3796000.0, + "T_r": 425.125, + "n": [ + -5.805352213973263, + -11.51448089471748, + 18.238781113551752, + -7.570052478022171, + -1.4755071099444654, + -1.328641564172384 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 134.89500000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 425.12499999999898, + "using_tau_r": false, + "max_abserror_percentage": 0.21170510433432543, + "t": [ + 0.501, + 0.742, + 0.917, + 1.387, + 9.328, + 12.623 + ], + "reducing_value": 3922.7696129878086, + "T_r": 425.125, + "n": [ + 7.6544950329552, + -16.928503641708495, + 14.176327512939299, + -2.3511736019127136, + 5.431931351600508, + -13.286388570143172 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Decane_anc.json b/dev/ancillaries/n-Decane_anc.json new file mode 100644 index 00000000..6c3b9181 --- /dev/null +++ b/dev/ancillaries/n-Decane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 243.5, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.69999999999857, + "using_tau_r": true, + "max_abserror_percentage": 0.077484029442786984, + "t": [ + 0.297, + 0.55, + 0.987, + 1.227, + 2.854, + 4.712 + ], + "reducing_value": 2103000.0, + "T_r": 617.7, + "n": [ + -0.018658701477170855, + 0.11385848199518148, + -8.950810509531753, + 1.828978043951727, + -3.8508051312012306, + -3.0325059558496923 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 243.5, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.69999999999857, + "using_tau_r": true, + "max_abserror_percentage": 0.17672413193676739, + "t": [ + 0.219, + 0.452, + 1.016, + 1.126, + 2.035, + 4.148 + ], + "reducing_value": 1640.0000000000002, + "T_r": 617.7, + "n": [ + 0.14176862633564324, + -4.281435009034745, + -7.136194974307151, + 6.849154519985906, + -3.913871220272946, + -5.556483531473428 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 243.5, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 617.69999999999857, + "using_tau_r": true, + "max_abserror_percentage": 0.077569270446931071, + "t": [ + 0.594, + 1.088, + 1.552, + 1.959, + 4.124, + 18.652 + ], + "reducing_value": 2103000.0, + "T_r": 617.7, + "n": [ + -0.20911143417151587, + -11.744433715974306, + 10.972105872724544, + -8.360362692229996, + -4.336166080704403, + -26.146244680867692 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 243.5, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 617.69999999999857, + "using_tau_r": false, + "max_abserror_percentage": 0.22413706273485268, + "t": [ + 0.49, + 0.778, + 1.234, + 5.192, + 18.677, + 19.549 + ], + "reducing_value": 1640.0000000000002, + "T_r": 617.7, + "n": [ + 4.827666872341155, + -3.7319669690993447, + 1.9076750287466657, + 0.16459343086669795, + 1666.7748855066088, + -2460.441820959505 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Dodecane_anc.json b/dev/ancillaries/n-Dodecane_anc.json new file mode 100644 index 00000000..5508dc66 --- /dev/null +++ b/dev/ancillaries/n-Dodecane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 263.60000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 658.09999999999854, + "using_tau_r": true, + "max_abserror_percentage": 0.031298283408331962, + "t": [ + 0.435, + 0.972, + 1.704, + 2.29, + 3.72, + 9.501 + ], + "reducing_value": 1817000.0, + "T_r": 658.1, + "n": [ + 0.01855892414806427, + -7.941228211958365, + 0.7027032448570503, + -1.6469727356969044, + -6.161545669379877, + -1.4874349910776694 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 263.60000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 658.09999999999854, + "using_tau_r": true, + "max_abserror_percentage": 1.4284240304967444, + "t": [ + 0.369, + 1.31, + 1.357, + 1.383, + 3.194, + 4.632 + ], + "reducing_value": 1330.0, + "T_r": 658.1, + "n": [ + -3.1027406450131076, + 659.6310704998223, + -2132.1075657465976, + 1475.1968821648827, + -19.394230255247603, + 6.056907847881279 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 263.60000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 658.09999999999854, + "using_tau_r": true, + "max_abserror_percentage": 0.031299066244705465, + "t": [ + 0.68, + 0.975, + 2.262, + 2.456, + 4.412, + 14.813 + ], + "reducing_value": 1817000.0, + "T_r": 658.1, + "n": [ + 0.07432358695136501, + -8.095550434658023, + 8.823108680318432, + -12.031829724482998, + -4.2537714590653755, + -3.0093802692458955 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 263.60000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 658.09999999999854, + "using_tau_r": false, + "max_abserror_percentage": 0.062261337701441377, + "t": [ + 0.312, + 0.314, + 0.53, + 1.689, + 5.186, + 6.344 + ], + "reducing_value": 1330.0, + "T_r": 658.1, + "n": [ + 169.6307007144784, + -170.78856038865672, + 4.362812034890246, + -0.46704708251799704, + 3.942637021143127, + -4.234606611460045 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Heptane_anc.json b/dev/ancillaries/n-Heptane_anc.json new file mode 100644 index 00000000..f96b0680 --- /dev/null +++ b/dev/ancillaries/n-Heptane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 182.55000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 540.12999999999874, + "using_tau_r": true, + "max_abserror_percentage": 0.18026733581983923, + "t": [ + 0.695, + 0.948, + 2.259, + 5.399, + 7.582, + 7.692 + ], + "reducing_value": 2736000.0, + "T_r": 540.13, + "n": [ + 0.25104409608498446, + -6.845140939717869, + -1.2228515021938513, + -14.455325847673445, + 286.78777701022443, + -278.9908782467837 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 182.55000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 540.12999999999874, + "using_tau_r": true, + "max_abserror_percentage": 3.7069247114844162, + "t": [ + 0.061, + 0.718, + 1.921, + 2.015, + 2.746, + 9.877 + ], + "reducing_value": 2315.3230474441625, + "T_r": 540.13, + "n": [ + -0.29457754530864466, + -7.274148490152896, + 75.40064985046571, + -79.02485215998952, + 1.254951249920929, + -6.677464890274236 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 182.55000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 540.12999999999874, + "using_tau_r": true, + "max_abserror_percentage": 0.061001060180121414, + "t": [ + 0.006, + 1.018, + 1.502, + 3.003, + 6.048, + 6.315 + ], + "reducing_value": 2736000.0, + "T_r": 540.13, + "n": [ + -0.001547608055848768, + -8.278553452057723, + 2.2800315192023684, + -4.304490300717095, + 0.8703765102176411, + -2.80944123395076 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 182.55000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 540.12999999999874, + "using_tau_r": false, + "max_abserror_percentage": 2.5843922865022684, + "t": [ + 0.124, + 0.664, + 1.294, + 10.615, + 11.227, + 13.607 + ], + "reducing_value": 2315.3230474441625, + "T_r": 540.13, + "n": [ + 0.35147807402250625, + 4.121792126592887, + -2.4954273570574026, + 2938.5470325829165, + -4682.169465017815, + 2501.072581290023 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Hexane_anc.json b/dev/ancillaries/n-Hexane_anc.json new file mode 100644 index 00000000..986bf707 --- /dev/null +++ b/dev/ancillaries/n-Hexane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 177.83000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 507.81999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.29405229176480141, + "t": [ + 0.549, + 0.794, + 2.19, + 2.321, + 2.77, + 15.614 + ], + "reducing_value": 3034000.0, + "T_r": 507.82, + "n": [ + 0.8528029596767168, + -5.384032997988009, + -90.91548667688265, + 118.30086404230913, + -33.3965271266182, + 1.2595931573516512 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 177.83000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 507.81999999999886, + "using_tau_r": true, + "max_abserror_percentage": 1.0104195769602642, + "t": [ + 0.428, + 1.221, + 2.201, + 3.574, + 3.995, + 16.403 + ], + "reducing_value": 2705.877875067769, + "T_r": 507.82, + "n": [ + -3.360986048771016, + -4.224147421152148, + 6.878988884363569, + -30.350141590045336, + 21.988568810045702, + -48.53840141194605 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 177.83000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 507.81999999999886, + "using_tau_r": true, + "max_abserror_percentage": 0.28647356377460298, + "t": [ + 0.159, + 0.914, + 1.136, + 3.283, + 7.567, + 8.012 + ], + "reducing_value": 3034000.0, + "T_r": 507.82, + "n": [ + 0.01624870043431449, + -4.6856725397462045, + -1.944931617943695, + -2.699572110510845, + -24.96422210280747, + 25.571553247591133 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 177.83000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 507.81999999999886, + "using_tau_r": false, + "max_abserror_percentage": 0.90243448406011062, + "t": [ + 0.623, + 0.673, + 0.865, + 0.889, + 1.141, + 2.833 + ], + "reducing_value": 2705.877875067769, + "T_r": 507.82, + "n": [ + -418.4662126032291, + 862.7834590549915, + -4812.159872858643, + 4546.279879423712, + -177.86740434610275, + 2.641529465078265 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Nonane_anc.json b/dev/ancillaries/n-Nonane_anc.json new file mode 100644 index 00000000..d04f81e5 --- /dev/null +++ b/dev/ancillaries/n-Nonane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 219.69999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 594.54999999999882, + "using_tau_r": true, + "max_abserror_percentage": 0.042955185553161801, + "t": [ + 0.695, + 1.023, + 1.153, + 2.471, + 3.113, + 4.262 + ], + "reducing_value": 2281000.0, + "T_r": 594.55, + "n": [ + 0.17512979712645566, + -13.890353079088916, + 7.363037542847803, + -3.8800351715589256, + 1.688059255455581, + -4.696846069919248 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 219.69999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 594.54999999999882, + "using_tau_r": true, + "max_abserror_percentage": 0.15234619512934922, + "t": [ + 0.501, + 1.115, + 1.413, + 3.576, + 9.883, + 18.14 + ], + "reducing_value": 1810.0, + "T_r": 594.55, + "n": [ + -5.1536130968369545, + 2.1332285795020645, + -3.593065172775762, + -5.8548285122141905, + -4.752281189935403, + 67.88348941881152 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 219.69999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 594.54999999999882, + "using_tau_r": true, + "max_abserror_percentage": 0.042955186429660674, + "t": [ + 0.741, + 1.137, + 1.152, + 1.563, + 3.91, + 8.223 + ], + "reducing_value": 2281000.0, + "T_r": 594.55, + "n": [ + 0.11848542849564217, + -206.06912532030728, + 204.6308137723198, + -6.785269035908729, + -4.84298916029439, + -0.44076934607962737 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 219.69999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 594.54999999999882, + "using_tau_r": false, + "max_abserror_percentage": 0.13820499271136599, + "t": [ + 0.587, + 0.686, + 0.729, + 0.846, + 1.5, + 1.824 + ], + "reducing_value": 1810.0, + "T_r": 594.55, + "n": [ + -23.198712622058476, + 402.39535606636224, + -525.0132880466338, + 158.57173971120517, + -19.07334776671177, + 9.495727034290677 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Octane_anc.json b/dev/ancillaries/n-Octane_anc.json new file mode 100644 index 00000000..838ce648 --- /dev/null +++ b/dev/ancillaries/n-Octane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 216.37, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 569.31999999999869, + "using_tau_r": true, + "max_abserror_percentage": 0.033449567091570209, + "t": [ + 0.49, + 1.015, + 1.367, + 2.45, + 5.086, + 6.784 + ], + "reducing_value": 2497000.0, + "T_r": 569.32, + "n": [ + 0.012215760119276425, + -9.015880958846303, + 3.0337666003844825, + -3.3225607356333495, + -4.49734520248938, + 1.2758391696209577 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 216.37, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 569.31999999999869, + "using_tau_r": true, + "max_abserror_percentage": 1.7487141276920637, + "t": [ + 0.083, + 0.387, + 0.453, + 3.255, + 11.847, + 19.244 + ], + "reducing_value": 2056.4, + "T_r": 569.32, + "n": [ + -0.28818593722704483, + 7.16566368663188, + -12.089045783083211, + -6.9190060351908285, + 31.47207439558071, + -833.7529582567691 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 216.37, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 569.31999999999869, + "using_tau_r": true, + "max_abserror_percentage": 0.032591676844151429, + "t": [ + 0.633, + 0.795, + 0.961, + 3.059, + 4.43, + 4.557 + ], + "reducing_value": 2497000.0, + "T_r": 569.32, + "n": [ + 0.2719726132924461, + -0.48708059237933493, + -6.67956803636084, + -3.319035552509312, + 8.82048901491816, + -11.290630744556589 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 216.37, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 569.31999999999869, + "using_tau_r": false, + "max_abserror_percentage": 1.6284908206273374, + "t": [ + 0.385, + 0.997, + 1.308, + 3.718, + 5.702, + 15.156 + ], + "reducing_value": 2056.4, + "T_r": 569.32, + "n": [ + 1.8711197605157706, + 6.362866515681488, + -7.771183246226491, + 12.226059321950915, + -20.5321471354057, + 269.9131977143042 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Pentane_anc.json b/dev/ancillaries/n-Pentane_anc.json new file mode 100644 index 00000000..c935db7d --- /dev/null +++ b/dev/ancillaries/n-Pentane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 143.47, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 469.69999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.029330284037554222, + "t": [ + 0.137, + 1.119, + 1.123, + 1.477, + 3.969, + 12.951 + ], + "reducing_value": 3370000.0, + "T_r": 469.7, + "n": [ + 0.0002920351277984843, + -468.97717292372954, + 465.7564333009324, + -3.372619624545633, + -3.4063439897011767, + -1.5154480392091865 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 143.47, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 469.69999999999914, + "using_tau_r": true, + "max_abserror_percentage": 3.2828728664463958, + "t": [ + 0.482, + 1.994, + 4.101, + 9.312, + 18.36, + 19.107 + ], + "reducing_value": 3215.5775884221466, + "T_r": 469.7, + "n": [ + -4.317782477894743, + -2.2050235507345954, + -2.7959424348848843, + -5.048155874145048, + 472.4781512909357, + -547.9642656628733 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 143.47, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 469.69999999999914, + "using_tau_r": true, + "max_abserror_percentage": 0.037281145106771163, + "t": [ + 0.642, + 0.976, + 1.848, + 3.17, + 3.871, + 7.841 + ], + "reducing_value": 3370000.0, + "T_r": 469.7, + "n": [ + 0.04748174519828376, + -6.629115738167101, + 0.6562557112100337, + -2.28440361956112, + -1.308924059672944, + -1.1435668798949066 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 143.47, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 469.69999999999914, + "using_tau_r": false, + "max_abserror_percentage": 3.114298806470317, + "t": [ + 0.389, + 1.069, + 18.567, + 18.567, + 19.512, + 19.95 + ], + "reducing_value": 3215.5775884221466, + "T_r": 469.7, + "n": [ + 2.3841375525242356, + 0.19925431521697065, + 5225.0215429825175, + 38711.30119718553, + -196165.0631164374, + 157517.76191925188 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Propane_anc.json b/dev/ancillaries/n-Propane_anc.json new file mode 100644 index 00000000..39269055 --- /dev/null +++ b/dev/ancillaries/n-Propane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 85.52500000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.88999999999908, + "using_tau_r": true, + "max_abserror_percentage": 0.016222893634509905, + "t": [ + 1.05, + 1.084, + 2.259, + 4.287, + 7.66, + 18.584 + ], + "reducing_value": 4251200.0, + "T_r": 369.89, + "n": [ + -23.998635747391152, + 18.313017605233238, + -0.42240851966839504, + -2.7378298813798962, + 0.257888414168987, + -1.3113462226130785 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 85.52500000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.88999999999908, + "using_tau_r": true, + "max_abserror_percentage": 1.171965141592346, + "t": [ + 0.431, + 1.339, + 2.091, + 6.822, + 8.214, + 19.706 + ], + "reducing_value": 5000.000000000001, + "T_r": 369.89, + "n": [ + -3.401360845132903, + -1.9443653795380451, + -0.4101211459709529, + -15.598374206544214, + 15.844867806184942, + -15.298907422332046 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 85.52500000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 369.88999999999908, + "using_tau_r": true, + "max_abserror_percentage": 0.052848154416440529, + "t": [ + 0.408, + 0.858, + 1.034, + 2.934, + 3.281, + 9.968 + ], + "reducing_value": 4251200.0, + "T_r": 369.89, + "n": [ + 0.021647852905706602, + -1.6369978591606182, + -4.493052504871183, + 5.182655875995273, + -7.542401679816551, + -0.4920693750863155 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 85.52500000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 369.88999999999908, + "using_tau_r": false, + "max_abserror_percentage": 0.42186420750061071, + "t": [ + 0.368, + 0.875, + 3.009, + 9.51, + 15.381, + 17.001 + ], + "reducing_value": 5000.000000000001, + "T_r": 369.89, + "n": [ + 2.104068052280433, + 0.3371892411622086, + 0.4401223810964251, + -3.5679018989260567, + 59.93889697061387, + -70.9402469085883 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/n-Undecane_anc.json b/dev/ancillaries/n-Undecane_anc.json new file mode 100644 index 00000000..f0740b3e --- /dev/null +++ b/dev/ancillaries/n-Undecane_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 247.541, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 638.79999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.028665513140624377, + "t": [ + 0.815, + 0.956, + 1.711, + 2.145, + 2.489, + 4.966 + ], + "reducing_value": 1990400.0, + "T_r": 638.8, + "n": [ + 0.8040569545010193, + -8.927688754737275, + 2.5684650093939636, + 0.2630553673389813, + -5.911470647893336, + -3.90418335245277 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 247.541, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 638.79999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.36078029593357153, + "t": [ + 0.114, + 0.502, + 2.414, + 6.87, + 7.716, + 17.382 + ], + "reducing_value": 1514.9168636385564, + "T_r": 638.8, + "n": [ + -0.01863953746670564, + -5.244844013064549, + -5.268565622296316, + -30.286979391565204, + 29.074334485348842, + 38.30739718468596 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 247.541, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 638.79999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.0090962110092740467, + "t": [ + 1.009, + 1.828, + 1.913, + 2.737, + 3.348, + 15.828 + ], + "reducing_value": 1990400.0, + "T_r": 638.8, + "n": [ + -9.763587049588974, + 75.16493963299233, + -83.66843167165366, + 20.19196534644341, + -16.387755533243997, + -13.169821486724286 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 247.541, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 638.79999999999893, + "using_tau_r": false, + "max_abserror_percentage": 0.42065816862388861, + "t": [ + 0.168, + 0.347, + 3.361, + 4.368, + 6.495, + 9.941 + ], + "reducing_value": 1514.9168636385564, + "T_r": 638.8, + "n": [ + -0.2507776704326597, + 2.658034605719594, + 10.787268907367727, + -26.226638455433513, + 40.387200723053795, + -53.26173978894778 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/o-Xylene_anc.json b/dev/ancillaries/o-Xylene_anc.json new file mode 100644 index 00000000..92715bcd --- /dev/null +++ b/dev/ancillaries/o-Xylene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 247.98500000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 630.25899999999899, + "using_tau_r": true, + "max_abserror_percentage": 0.039449754905374057, + "t": [ + 1.027, + 1.366, + 3.242, + 6.238, + 8.766, + 9.965 + ], + "reducing_value": 3737500.0, + "T_r": 630.259, + "n": [ + -8.892854416654904, + 2.889636735975203, + -4.545597673937891, + 4.948864373864568, + -33.03401570602496, + 33.5772554741618 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 247.98500000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 630.25899999999899, + "using_tau_r": true, + "max_abserror_percentage": 1.3810529438713082, + "t": [ + 0.041, + 0.47, + 0.602, + 3.963, + 9.65, + 15.203 + ], + "reducing_value": 2684.5000000000005, + "T_r": 630.259, + "n": [ + -0.05612298788265898, + -1.1710766690915488, + -4.043955284669913, + -7.601531777020512, + 34.00048793856129, + -267.1634261051362 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 247.98500000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 630.25899999999899, + "using_tau_r": true, + "max_abserror_percentage": 0.037461331727350888, + "t": [ + 1.111, + 1.156, + 1.998, + 3.199, + 5.528, + 7.601 + ], + "reducing_value": 3737500.0, + "T_r": 630.259, + "n": [ + -40.23194106786901, + 34.55252883118712, + -0.8596814216655824, + -3.137628550668386, + -0.7730882264500827, + -1.1362454591454407 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 247.98500000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 630.25899999999899, + "using_tau_r": false, + "max_abserror_percentage": 0.5196254660005506, + "t": [ + 0.102, + 0.561, + 0.718, + 5.254, + 13.734, + 13.785 + ], + "reducing_value": 2684.5000000000005, + "T_r": 630.259, + "n": [ + 0.08168792579534072, + 6.203503021781052, + -3.8477589500686986, + 4.572403149688544, + -31656.07188921996, + 32296.361131648908 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/p-Xylene_anc.json b/dev/ancillaries/p-Xylene_anc.json new file mode 100644 index 00000000..cae8e255 --- /dev/null +++ b/dev/ancillaries/p-Xylene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 286.39999999999998, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.16799999999876, + "using_tau_r": true, + "max_abserror_percentage": 0.017971643821823591, + "t": [ + 1.005, + 1.232, + 1.271, + 2.955, + 4.359, + 5.234 + ], + "reducing_value": 3531500.0, + "T_r": 616.168, + "n": [ + -6.922693475136246, + -18.802630900264262, + 19.915248950746882, + -4.280178590137178, + 2.8220366354716795, + -4.222238595872705 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 286.39999999999998, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.16799999999876, + "using_tau_r": true, + "max_abserror_percentage": 0.36870096485427384, + "t": [ + 0.395, + 0.408, + 0.546, + 0.651, + 2.515, + 3.948 + ], + "reducing_value": 2693.92, + "T_r": 616.168, + "n": [ + -140.15017077353872, + 166.06393987589922, + -51.309204629695124, + 20.70756142612646, + -2.7902945630383784, + -2.9836742600472896 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 286.39999999999998, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 616.16799999999876, + "using_tau_r": true, + "max_abserror_percentage": 0.018225495845447526, + "t": [ + 1.036, + 1.227, + 1.257, + 2.906, + 7.04, + 15.693 + ], + "reducing_value": 3531500.0, + "T_r": 616.168, + "n": [ + -9.878207210625316, + -7.74531501639431, + 11.727352138248827, + -3.624494325992903, + -3.512921513732143, + 56.69266520413931 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 286.39999999999998, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 616.16799999999876, + "using_tau_r": false, + "max_abserror_percentage": 0.2129362347877306, + "t": [ + 0.097, + 0.41, + 0.617, + 6.974, + 11.02, + 11.7 + ], + "reducing_value": 2693.92, + "T_r": 616.168, + "n": [ + 0.056706544072533206, + 2.34587948519851, + 0.15533070291116807, + 26.985091589824126, + -1912.6053845039978, + 2496.549996560909 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/ancillaries/trans-2-Butene_anc.json b/dev/ancillaries/trans-2-Butene_anc.json new file mode 100644 index 00000000..d13c6479 --- /dev/null +++ b/dev/ancillaries/trans-2-Butene_anc.json @@ -0,0 +1,108 @@ +{ + "ANCILLARIES": { + "pV": { + "Tmin": 167.59999999999999, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 428.60999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.20177588482968023, + "t": [ + 0.166, + 0.996, + 1.861, + 3.171, + 13.469, + 19.684 + ], + "reducing_value": 4027300.0, + "T_r": 428.61, + "n": [ + -0.008641938102009184, + -6.741491214502838, + 1.5953056102326129, + -3.6687386884417528, + -12.58878880233942, + 81.94195408868505 + ], + "type": "pV" + }, + "rhoV": { + "Tmin": 167.59999999999999, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 428.60999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.36732425375808342, + "t": [ + 0.5, + 0.567, + 1.284, + 1.423, + 3.202, + 4.206 + ], + "reducing_value": 4213.0, + "T_r": 428.61, + "n": [ + -11.847750420878857, + 9.875166115230318, + -18.597606560563445, + 16.601983399575353, + -4.263122348267767, + -0.8330225303697664 + ], + "type": "rhoV" + }, + "pL": { + "Tmin": 167.59999999999999, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "Tmax": 428.60999999999893, + "using_tau_r": true, + "max_abserror_percentage": 0.2049880396507886, + "t": [ + 0.318, + 0.981, + 5.585, + 6.385, + 9.241, + 12.62 + ], + "reducing_value": 4027300.0, + "T_r": 428.61, + "n": [ + -0.02697376915863493, + -6.245788479207671, + -21.959477077005555, + 24.065860332295973, + 1.6305031975105153, + -27.489279853508943 + ], + "type": "pL" + }, + "rhoL": { + "Tmin": 167.59999999999999, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "Tmax": 428.60999999999893, + "using_tau_r": false, + "max_abserror_percentage": 0.75710043910827141, + "t": [ + 0.164, + 0.372, + 4.422, + 10.565, + 14.651, + 19.157 + ], + "reducing_value": 4213.0, + "T_r": 428.61, + "n": [ + -0.0369377281462134, + 2.376898316062288, + 5.366934661033568, + -439.1416046445223, + 4838.585432319588, + -19854.73815702274 + ], + "type": "rhoLnoexp" + } + } +} diff --git a/dev/builder/main.py b/dev/builder/main.py new file mode 100644 index 00000000..b1692654 --- /dev/null +++ b/dev/builder/main.py @@ -0,0 +1,138 @@ +from __future__ import print_function +import os +import json +import sys +import subprocess +import util +import platform + +def stdout_check_call(*args, **kwargs): + print('calling: '+args[0]) + subprocess.check_call(*args, shell = True, stdout = sys.stdout, stderr = sys.stdout, **kwargs) + +def find_VS_compiler(compilers, bits, ver): + for c in compilers: + if int(c['bits']) == bits and ver == c['ver']: + return c + raise ValueError('no VS compiler found') + +def newest_VS_compiler(compilers, bits): + joined = [(float(c['ver']),c) for c in compilers if int(c['bits']) == bits] + joined = sorted(joined) + joined.reverse() + return joined[0][1] + +def build_target(target, project_root, cpp_sources, project_name = 'Java'): + """ + + """ + if 'name_suffix' in target: + suffix = '-' + target['name_suffix'] + else: + suffix = '' + build_name = platform.system() + '-' + target['compiler'] + '-' + str(target['bitness'])+'bit' + suffix + build_path = os.path.join(project_name, build_name) + try: + os.makedirs(build_path) + except: + pass + dist_path = os.path.join(project_name, build_name) + + # Add any other sources needed + if 'sources' in target: + cpp_sources += target['sources'] + + # Replace macros in sources + for i,source in enumerate(cpp_sources): + cpp_sources[i] = source.replace("%PACKAGE_HOME%", project_root) + + # Check that the platform agrees with this platform + if platform.system() not in target['platform']: + print('skipped this run since this platform is invalid:'+str(target)) + + # Do any sort of preliminary processing needed based on the pre key + if 'pre' in target: + if not isinstance(target['pre'], basestring): + raise ValueError("target['pre'] is not a string: "+str(target['pre'])) + if target['pre'] != '': + stdout_check_call(target['pre']) + + # Get compiler name + compiler = target['compiler'] + if not isinstance(compiler, basestring): + raise ValueError("compiler is not a string: "+str(compiler)) + + # Do the compilation step + VS_keys = ['VS+','VS8.0','VS9.0','VS10.0','VS11.0','VS12.0','VS13.0','VS14.0','VS15.0'] + + if compiler in VS_keys: + vs_installs = util.find_VS_installations() + if compiler == 'VS+': + selected_compiler = newest_VS_compiler(vs_installs, int(target['bitness'])) + else: + selected_compiler = find_VS_compiler(vs_installs, int(target['bitness']), compiler.lstrip('VS')) + + ### *************** COMPILE ******************** + call_dict = dict(c_flags = target['c_flags'], + cpp_sources = ' '.join(cpp_sources), + bin_path = '"' + selected_compiler['bin_path'] + '"' + ) + + for file in cpp_sources: + call_dict['file'] = file + + path,ofile = os.path.split(file) + + # Get the output file name in the build folder + call_dict['ofile'] = os.path.join(build_path, ofile.rsplit('.',1)[0]+'.obj') + # Build the string to be run + compile_string = 'cl /nologo /c {c_flags} /Fo{ofile} {file}'.format(**call_dict) + # Actually run the build command using the environment for the selected compiler + stdout_check_call(compile_string, env = selected_compiler['env']) + + if 'link_type' in target: + if target['link_type'] == 'DLL': + ### *************************** LINK *************************** + call_dict = dict(link_flags = target['link_flags'], + bin_path = '"' + selected_compiler['bin_path'] + '"', + build_path = build_path, + link_fname = target['link_fname'] + ) + link_string = 'link /DLL /nologo {build_path}/*.obj {link_flags} /OUT:{build_path}/{link_fname}'.format(**call_dict) + # Actually run the link command using the environment for the selected compiler + stdout_check_call(link_string, env = selected_compiler['env']) + + elif compiler == 'GCC': + pass + elif compiler == 'clang': + pass + else: + raise ValueError() + + # Do the post step + if 'post' in target: + if not isinstance(target['post'], basestring): + raise ValueError("target['post'] is not a string: "+str(target['post'])) + if target['post'] != '': + stdout_check_call(target['post']) + +def build_all_targets(project_root, project_name): + json_file_name = os.path.relpath(os.path.join(project_root,'build.json')) + + if not os.path.exists(json_file_name): + raise OSError('File [{json_file_name}] does not exist'.format(**vars())) + + # Load the JSON file + project = json.load(open(json_file_name,'r')) + + # Find all the C++ sources that will need to be compiled for sure + cpp_sources = util.find_cpp_sources(os.path.join('..','..','src')) + + for target in project: + build_target(target, project_root = project_root, cpp_sources = cpp_sources, project_name = project_name) + +if __name__=='__main__': +# build_all_targets(project_root = '../../wrappers/EES', project_name = 'EES') +# build_all_targets(project_root = '../../wrappers/C#', project_name = 'Csharp') +# build_all_targets(project_root = '../../wrappers/Java', project_name = 'Java') + build_all_targets(project_root = '../../wrappers/SharedLibrary', project_name = 'SharedLibrary') \ No newline at end of file diff --git a/dev/builder/util.py b/dev/builder/util.py new file mode 100644 index 00000000..9f2e0c3f --- /dev/null +++ b/dev/builder/util.py @@ -0,0 +1,110 @@ +from __future__ import print_function +import os, subprocess, sys +import subprocess +import itertools +import platform + +def validate_pair(ob): + try: + if not (len(ob) == 2): + print("Unexpected result:", ob, file=sys.stderr) + raise ValueError + except: + return False + return True + +def consume(iter): + try: + while True: next(iter) + except StopIteration: + pass + +# See http://stackoverflow.com/questions/1214496/how-to-get-environment-from-a-subprocess-in-python +def get_environment_from_batch_command(env_cmd, opts = None, initial=None): + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. + + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + if not isinstance(env_cmd, (list, tuple)): + env_cmd = [env_cmd] + # construct the command that will alter the environment + env_cmd = subprocess.list2cmdline(env_cmd) + # create a tag so we can tell in the output when the proc is done + tag = 'Done running command' + # construct a cmd.exe command to do accomplish this + cmd = 'cmd.exe /s /c "{env_cmd} {opts} && echo "{tag}" && set"'.format(**vars()) + # launch the process + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell = True, env=initial) + if proc.returncode == 0: + return None + # parse the output sent to stdout + lines = proc.stdout + # consume whatever output occurs until the tag is reached + consume(itertools.takewhile(lambda l: tag not in l, lines)) + # define a way to handle each KEY=VALUE line + handle_line = lambda l: l.rstrip().split('=',1) + # parse key/values into pairs + pairs = map(handle_line, lines) + # make sure the pairs are valid + valid_pairs = filter(validate_pair, pairs) + # Upper case for the pair + for i in range(len(valid_pairs)): + valid_pairs[i][0] = valid_pairs[i][0].upper() + # construct a dictionary of the pairs + result = dict(valid_pairs) + # let the process finish + proc.communicate() + + return result + +def find_VS_installations(): + # Only on windows + if platform.system() != 'Windows': return None + + installations = [] + + # Use environmental variables to file candidate program files folders on this system + program_file_paths = set([os.environ[k] for k in ['PROGRAMFILES','PROGRAMFILES(X86)','ProgramW6432']]) + for ver in ['8.0','9.0','10.0','11.0','12.0','13.0','14.0','15.0']: + for PF_path in program_file_paths: + for bitness in ['x86','amd64']: + + bat_path = os.path.join(PF_path,'Microsoft Visual Studio '+ver,'VC','vcvarsall.bat') + bin_path = os.path.join(PF_path,'Microsoft Visual Studio '+ver,'VC','bin') + + # Skip if this compiler bat file doesn't exist + if not os.path.exists(bat_path): + continue + + env = get_environment_from_batch_command(bat_path, opts = bitness) + + if 'LIB' not in env: continue + + if bitness =='x86': + bits = 32 + elif bitness == 'amd64': + bits = 64 + + installations.append(dict(ver = ver, bits = bits, bin_path = bin_path, env = env)) + return installations + +def find_cpp_sources(root = os.path.join('..','..','src'), extensions = ['.cpp'], skip_files = None): + file_listing = [] + for path, dirs, files in os.walk(root): + for file in files: + n,ext = os.path.splitext(file) + fname = os.path.relpath(os.path.join(path, file)) + if skip_files is not None and fname in skip_files: + continue + + if ext in extensions: + file_listing.append(fname) + return file_listing + +if __name__=='__main__': + print("don't run me") \ No newline at end of file diff --git a/dev/environmental_data_from_DTU/DTU_environmental.json b/dev/environmental_data_from_DTU/DTU_environmental.json new file mode 100644 index 00000000..bab81199 --- /dev/null +++ b/dev/environmental_data_from_DTU/DTU_environmental.json @@ -0,0 +1,1146 @@ +{ + "10024-97-2": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": 320.0, + "GWP20": 290.0, + "GWP500": 180.0, + "HH": 1, + "Name": "NitrousOxide", + "ODP": -1.0, + "PH": 0 + }, + "106-97-8": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Butane", + "ODP": -1.0, + "PH": 0 + }, + "106-98-9": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "1-Butene", + "ODP": -1.0, + "PH": 0 + }, + "107-46-0": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "MM", + "ODP": -1.0, + "PH": 1 + }, + "107-51-7": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MDM", + "ODP": -1.0, + "PH": 0 + }, + "107-83-5": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Isohexane", + "ODP": -1.0, + "PH": 1 + }, + "108-88-3": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 3.3, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Toluene", + "ODP": -1.0, + "PH": 0 + }, + "109-66-0": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Pentane", + "ODP": -1.0, + "PH": 0 + }, + "110-54-3": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 3.1, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Hexane", + "ODP": -1.0, + "PH": 0 + }, + "110-82-7": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "CycloHexane", + "ODP": -1.0, + "PH": 0 + }, + "111-65-9": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Octane", + "ODP": -1.0, + "PH": 0 + }, + "111-84-2": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Nonane", + "ODP": -1.0, + "PH": 0 + }, + "112-39-0": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MethylPalmitate", + "ODP": -1.0, + "PH": 0 + }, + "112-40-3": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Dodecane", + "ODP": -1.0, + "PH": 0 + }, + "112-61-8": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "MethylStearate", + "ODP": -1.0, + "PH": 0 + }, + "112-62-9": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "MethylOleate", + "ODP": -1.0, + "PH": 0 + }, + "112-63-0": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "MethylLinoleate", + "ODP": -1.0, + "PH": -1 + }, + "115-07-1": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.1, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Propylene", + "ODP": -1.0, + "PH": 1 + }, + "115-10-6": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 1.0, + "GWP20": 1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "DimethylEther", + "ODP": -1.0, + "PH": 2 + }, + "115-11-7": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Isobutene", + "ODP": -1.0, + "PH": 2 + }, + "115-25-3": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 10300.0, + "GWP20": 7310.0, + "GWP500": 14700.0, + "HH": 1, + "Name": "RC318", + "ODP": -1.0, + "PH": 2 + }, + "124-18-5": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Decane", + "ODP": -1.0, + "PH": 0 + }, + "124-38-9": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 1.0, + "GWP20": 1.0, + "GWP500": 1.0, + "HH": 1, + "Name": "CarbonDioxide", + "ODP": -1.0, + "PH": 0 + }, + "1333-74-0": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Hydrogen", + "ODP": -1.0, + "PH": 0 + }, + "1333-74-0o": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "OrthoHydrogen", + "ODP": -1.0, + "PH": -1 + }, + "1333-74-0p": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "ParaHydrogen", + "ODP": -1.0, + "PH": -1 + }, + "141-62-8": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MD2M", + "ODP": -1.0, + "PH": 0 + }, + "141-63-9": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MD3M", + "ODP": -1.0, + "PH": 0 + }, + "142-82-5": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Heptane", + "ODP": -1.0, + "PH": 0 + }, + "1717-00-6": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": 725.0, + "GWP20": 2250.0, + "GWP500": 220.0, + "HH": 1, + "Name": "R141b", + "ODP": 0.12, + "PH": 0 + }, + "2551-62-4": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": 22800.0, + "GWP20": 16300.0, + "GWP500": 32600.0, + "HH": 1, + "Name": "SulfurHexafluoride", + "ODP": -1.0, + "PH": 0 + }, + "2837-89-0": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 609.0, + "GWP20": 2070.0, + "GWP500": 185.0, + "HH": 1, + "Name": "R124", + "ODP": 0.022, + "PH": 0 + }, + "287-92-3": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Cyclopentane", + "ODP": -1.0, + "PH": 1 + }, + "29118-24-9": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": 6.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R1234ze(E)", + "ODP": -1.0, + "PH": 0 + }, + "301-00-8": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "MethylLinolenate", + "ODP": -1.0, + "PH": -1 + }, + "306-83-2": { + "ASHRAE34": "B1", + "FH": 1, + "GWP100": 77.0, + "GWP20": 273.0, + "GWP500": 24.0, + "HH": 2, + "Name": "R123", + "ODP": 0.02, + "PH": 0 + }, + "353-36-6": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 10.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "R161", + "ODP": -1.0, + "PH": -1 + }, + "354-33-6": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": 3500.0, + "GWP20": 6350.0, + "GWP500": 1100.0, + "HH": 1, + "Name": "R125", + "ODP": -1.0, + "PH": 0 + }, + "406-58-6": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 794.0, + "GWP20": 2520.0, + "GWP500": 241.0, + "HH": -1, + "Name": "R365MFC", + "ODP": -1.0, + "PH": -1 + }, + "420-46-2": { + "ASHRAE34": "A2", + "FH": 1, + "GWP100": 4470.0, + "GWP20": 5890.0, + "GWP500": 1590.0, + "HH": 1, + "Name": "R143a", + "ODP": -1.0, + "PH": 0 + }, + "431-63-0": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 1200.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "R236EA", + "ODP": -1.0, + "PH": -1 + }, + "431-89-0": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 3220.0, + "GWP20": 5310.0, + "GWP500": 1040.0, + "HH": 1, + "Name": "R227EA", + "ODP": -1.0, + "PH": 0 + }, + "460-73-1": { + "ASHRAE34": "B1", + "FH": 0, + "GWP100": 1030.0, + "GWP20": 3380.0, + "GWP500": 314.0, + "HH": 2, + "Name": "R245fa", + "ODP": -1.0, + "PH": 1 + }, + "463-58-1": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": 27.0, + "GWP20": 97.0, + "GWP500": -1.0, + "HH": 3, + "Name": "CarbonylSulfide", + "ODP": -1.0, + "PH": 1 + }, + "463-82-1": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Neopentane", + "ODP": -1.0, + "PH": 0 + }, + "540-97-6": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D6", + "ODP": -1.0, + "PH": -1 + }, + "541-02-6": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D5", + "ODP": -1.0, + "PH": -1 + }, + "556-67-2": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D4", + "ODP": -1.0, + "PH": -1 + }, + "590-18-1": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "cis-2-Butene", + "ODP": -1.0, + "PH": 1 + }, + "593-53-3": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 92.0, + "GWP20": 323.0, + "GWP500": 28.0, + "HH": 2, + "Name": "R41", + "ODP": -1.0, + "PH": 2 + }, + "616-38-6": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "DimethylCarbonate", + "ODP": -1.0, + "PH": 0 + }, + "624-64-6": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "trans-2-Butene", + "ODP": -1.0, + "PH": 1 + }, + "630-08-0": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "CarbonMonoxide", + "ODP": -1.0, + "PH": 3 + }, + "64-17-5": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Ethanol", + "ODP": -1.0, + "PH": 0 + }, + "67-56-1": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 2.8, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Methanol", + "ODP": -1.0, + "PH": 0 + }, + "67-64-1": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 0.5, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Acetone", + "ODP": -1.0, + "PH": 0 + }, + "679-86-7": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "R245CA", + "ODP": -1.0, + "PH": -1 + }, + "690-39-1": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 9810.0, + "GWP20": 8100.0, + "GWP500": 7660.0, + "HH": 1, + "Name": "R236FA", + "ODP": -1.0, + "PH": 1 + }, + "71-43-2": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Benzene", + "ODP": -1.0, + "PH": 0 + }, + "74-82-8": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 25.0, + "GWP20": 72.0, + "GWP500": 7.6, + "HH": 0, + "Name": "Methane", + "ODP": -1.0, + "PH": 0 + }, + "74-84-0": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 2.9, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Ethane", + "ODP": -1.0, + "PH": 0 + }, + "74-85-1": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 6.8, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Ethylene", + "ODP": -1.0, + "PH": 2 + }, + "74-98-6": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Propane", + "ODP": -1.0, + "PH": 0 + }, + "74-99-7": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Propyne", + "ODP": -1.0, + "PH": 1 + }, + "7439-90-9": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Krypton", + "ODP": -1.0, + "PH": 0 + }, + "7440-01-9": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Neon", + "ODP": -1.0, + "PH": 0 + }, + "7440-37-1": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 0.0, + "GWP20": 0.0, + "GWP500": 0.0, + "HH": 0, + "Name": "Argon", + "ODP": -1.0, + "PH": 0 + }, + "7440-59-7": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Helium", + "ODP": -1.0, + "PH": 0 + }, + "7440-63-3": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Xenon", + "ODP": -1.0, + "PH": 3 + }, + "7446-09-5": { + "ASHRAE34": "B1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 3, + "Name": "SulfurDioxide", + "ODP": -1.0, + "PH": 0 + }, + "75-10-5": { + "ASHRAE34": "A2", + "FH": 4, + "GWP100": 675.0, + "GWP20": 2330.0, + "GWP500": 205.0, + "HH": 1, + "Name": "R32", + "ODP": -1.0, + "PH": 1 + }, + "75-19-4": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "CycloPropane", + "ODP": -1.0, + "PH": 0 + }, + "75-28-5": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "IsoButane", + "ODP": -1.0, + "PH": 0 + }, + "75-37-6": { + "ASHRAE34": "A2", + "FH": 4, + "GWP100": 124.0, + "GWP20": 437.0, + "GWP500": 38.0, + "HH": 1, + "Name": "R152A", + "ODP": -1.0, + "PH": 1 + }, + "75-43-4": { + "ASHRAE34": "B1", + "FH": -1, + "GWP100": 151.0, + "GWP20": 530.0, + "GWP500": 46.0, + "HH": -1, + "Name": "R21", + "ODP": -1.0, + "PH": -1 + }, + "75-45-6": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1810.0, + "GWP20": 5160.0, + "GWP500": 549.0, + "HH": 1, + "Name": "R22", + "ODP": 0.05, + "PH": 0 + }, + "75-46-7": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 14800.0, + "GWP20": 12000.0, + "GWP500": 12200.0, + "HH": 1, + "Name": "R23", + "ODP": -1.0, + "PH": 0 + }, + "75-68-3": { + "ASHRAE34": "A2", + "FH": 1, + "GWP100": 2310.0, + "GWP20": 5490.0, + "GWP500": 705.0, + "HH": 1, + "Name": "R142b", + "ODP": 0.07, + "PH": 0 + }, + "75-69-4": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 4750.0, + "GWP20": 6730.0, + "GWP500": 1620.0, + "HH": 1, + "Name": "R11", + "ODP": 1.0, + "PH": 0 + }, + "75-71-8": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 10900.0, + "GWP20": 11000.0, + "GWP500": 5200.0, + "HH": 1, + "Name": "R12", + "ODP": 1.0, + "PH": 0 + }, + "75-72-9": { + "ASHRAE34": "A1", + "FH": -1, + "GWP100": 14400.0, + "GWP20": 10800.0, + "GWP500": 16400.0, + "HH": -1, + "Name": "R13", + "ODP": -1.0, + "PH": -1 + }, + "75-73-0": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 7390.0, + "GWP20": 5210.0, + "GWP500": 11200.0, + "HH": -1, + "Name": "R14", + "ODP": -1.0, + "PH": -1 + }, + "754-12-1": { + "ASHRAE34": "A2L", + "FH": 2, + "GWP100": 4.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R1234yf", + "ODP": -1.0, + "PH": 0 + }, + "76-13-1": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 6130.0, + "GWP20": 6540.0, + "GWP500": 2700.0, + "HH": 1, + "Name": "R113", + "ODP": 1.0, + "PH": 0 + }, + "76-14-2": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 10000.0, + "GWP20": 8040.0, + "GWP500": 8730.0, + "HH": 1, + "Name": "R114", + "ODP": 1.0, + "PH": 0 + }, + "76-15-3": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 7370.0, + "GWP20": 5310.0, + "GWP500": 9990.0, + "HH": 1, + "Name": "R115", + "ODP": 0.44, + "PH": 1 + }, + "76-16-4": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R116", + "ODP": -1.0, + "PH": 1 + }, + "76-19-7": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 8830.0, + "GWP20": 6310.0, + "GWP500": 12500.0, + "HH": 2, + "Name": "R218", + "ODP": -1.0, + "PH": 1 + }, + "7664-41-7": { + "ASHRAE34": "B2", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 3, + "Name": "Ammonia", + "ODP": -1.0, + "PH": 0 + }, + "7727-37-9": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Nitrogen", + "ODP": -1.0, + "PH": 0 + }, + "7732-18-5": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Water", + "ODP": -1.0, + "PH": 0 + }, + "7782-39-0": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 0.0, + "GWP20": 0.0, + "GWP500": 0.0, + "HH": -1, + "Name": "Deuterium", + "ODP": -1.0, + "PH": -1 + }, + "7782-41-4": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 4, + "Name": "Fluorine", + "ODP": -1.0, + "PH": 0 + }, + "7782-44-7": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Oxygen", + "ODP": -1.0, + "PH": 0 + }, + "7783-06-4": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 4, + "Name": "HydrogenSulfide", + "ODP": -1.0, + "PH": 0 + }, + "7783-54-2": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": 17200.0, + "GWP20": 12300.0, + "GWP500": 20700.0, + "HH": 1, + "Name": "NitrogenTrifluoride", + "ODP": -1.0, + "PH": 3 + }, + "7789-20-0": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "DeuteriumOxide", + "ODP": -1.0, + "PH": -1 + }, + "78-78-4": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Isopentane", + "ODP": -1.0, + "PH": 0 + }, + "811-97-2": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1430.0, + "GWP20": 3830.0, + "GWP500": 435.0, + "HH": 1, + "Name": "R134a", + "ODP": -1.0, + "PH": 0 + }, + "AIR.PPF": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Air", + "ODP": -1.0, + "PH": 0 + }, + "R404A.PPF": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 3900.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R404A", + "ODP": 0.0, + "PH": 0 + }, + "R407C.PPF": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1800.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R407C", + "ODP": -1.0, + "PH": 0 + }, + "R410A.PPF": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 2088.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R410A", + "ODP": -1.0, + "PH": 0 + }, + "R507A.PPF": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 3985.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R507A", + "ODP": -1.0, + "PH": 0 + } +} \ No newline at end of file diff --git a/dev/environmental_data_from_DTU/build_DTU_JSON.py b/dev/environmental_data_from_DTU/build_DTU_JSON.py new file mode 100644 index 00000000..75de1e82 --- /dev/null +++ b/dev/environmental_data_from_DTU/build_DTU_JSON.py @@ -0,0 +1,356 @@ + + +import glob,os + +# Build a map from REFPROP name to CAS code +RP2CAS = {} +for file in glob.glob('C:\\Program Files (x86)\\REFPROP\\fluids\\*.fld'): + lines = open(file,'r').readlines() + root,RPFluid = os.path.split(file) + + for line in lines: + if line.find('CAS number') > -1: + CAS_number = line.split('!')[0].strip() + if not CAS_number: + raise ValueError(file+line) + RP2CAS[RPFluid.split('.')[0]] = CAS_number + break + +# Handle pseudo-pure fluids +for file in glob.glob('C:\\Program Files (x86)\\REFPROP\\fluids\\*.ppf'): + root,RPFluid = os.path.split(file) + RP2CAS[RPFluid.split('.')[0]] = RPFluid + +fluid_lookup = """1BUTENE butene 1-Butene 419.29 * * * - - - 2.59 0.5 1 0.983 1.079 - - - - - - - - - +ACETONE propanone Acetone 508.1 - 0.5 - - - - 1.46 0.1 0.2 0.16 9.40E-02 - - - - - - 1.39E+04 - - +AIR air Air 132.5306 - - - - - - N/A - - - - - - - - - - - - - +AMMONIA ammonia Ammonia 405.4 R-717 X X X - - - N/A - - - 1.0E-01 - - - - - - 1.0E+06 3.50E-01 1.60E+00 +ARGON argon Argon 150.687 R-740 0 0 0 - - - N/A - - - - - - - - - - - - - +BENZENE benzene Benzene 562.02 * * * - - - 3.65 0.4 0.2 0.318 2.2E-01 1.9E+03 8.4E-05 2.8E-03 6.4E-05 1.3E-03 1.6E-05 - - - +BUTANE butane n-Butane 425.125 R-600 N/A 3 N/A - - - 2.15 0.5 0.4 0.485 3.52E-01 - - - - - - - - - +C12 dodecane n-Dodecane 658.1 X X X - - - 2.19 0.3 0.4 0.452 3.57E-01 - - - - - - - - - +C1CC6 methylcyclohexane CoolProp error: Your fluid name [] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid - 0.639 - - - - N/A 0.5 0.6 0.392 1.87 - - - - - - - - - +C2BUTENE cis-2-butene cis-2-Butene 435.75 * * * - - - 2.57 0.4 1 1.15 - - - - - - - - - +C3CC6 propylcyclohexane CoolProp error: Your fluid name [] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid * * * - - - - - - - 2.57 - - - - - - - - - +C4F10 perfluorobutane CoolProp error: Your fluid name [] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid 6330 8860 12500 - - - N/A - - - - - - - - - - - - - +C5F12 perfluoropentane CoolProp error: Your fluid name [] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid 6510 9160 13300 - - - N/A - - - - - - - - - - - - - +CF3I trifluoroiodomethane CoolProp error: Your fluid name [] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid 1* 0.4* 0.1* - - - N/A - - - - - - - - - - - - - +CO carbon monoxide CarbonMonoxide 132.86 - 1.6* - - - - 0.331 0.04 0.03 0.032 2.70E-02 - - - - - - - - - +CO2 carbon dioxide CarbonDioxide 304.1282 1 1 1 - - - 0.108 - - - - - - - - - - - - - +COS carbonyl sulphide CarbonylSulfide 378.77 97 27 - - - - N/A - - - - - - - - - - - - - +CYCLOHEX cyclohexane CycloHexane 553.64 X X X - - - N/A N/A N/A N/A N/A - - - - - - - - - +CYCLOPEN cyclopentane Cyclopentane 511.72 * * * - - - N/A N/A N/A N/A N/A - - - - - - - - - +CYCLOPRO cyclopropane CycloPropane 398.3 * * * - - - N/A N/A N/A N/A N/A - - - - - - - - - +D2 deuterium Deuterium CoolProp error: Your fluid name [Deuterium] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid 0 0 0 - - - N/A - - - - - - - - - - - - - +D2O deuterium oxide DeuteriumOxide CoolProp error: Your fluid name [DeuteriumOxide] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid - - - - - - N/A - - - - - - - - - - - - - +D4 octamethylcyclotetrasiloxane D4 586.5 N/A N/A N/A - - - N/A - - - - - - - - - - - - - +D5 decamethylcyclotetrasiloxane D5 619.15 N/A N/A N/A - - - N/A - - - - - - - - - - - - - +D6 dodecamethylcyclotetrasiloxane D6 645.78 N/A N/A N/A - - - N/A - - - - - - - - - - - - - +DECANE decane n-Decane 617.7 * * * - - - 2.45 0.4 0.5 0.509 3.84E-01 - - - - - - - - - +DMC dimethyl carbonate DimethylCarbonate 557 N/A N/A N/A - - - N/A - - - 2.50E-02 - - - - - - - - - +DME dimethylether DimethylEther 400.378 1 1 <<1 - - - 1.66 0.3 0.3 1.89E-01 - - - - - - - - - +ETHANE ethane Ethane 305.322 R-170 N/A 2.9 N/A - - - 1.46 0.1 0.1 0.121 1.23E-01 - - - - - - - - - +ETHANOL ethanol Ethanol 514.71 - - - - - - 1.95 0.2 0.3 0.317 3.99E-01 - - - - - - 1.56E+06 - - +ETHYLENE ethene Ethylene 282.35 R-1150 N/A 6.8 N/A - - - 3.45 1 1 1 1.0E+00 6.4E-01 1.4E-11 7.9E-11 9.0E-12 7.1E-11 1.3E-12 - - - +FLUORINE fluorine Fluorine CoolProp error: Your fluid name [Fluorine] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid - - - - - - 4.86 - - - - - - - - - - - - - +H2S hydrogen sulfide HydrogenSulfide 373.1 - - - - - - 6.89 - - - - 2.2E-01 - - - - - 2.3E+09 - - +HELIUM helium Helium 5.1953 R-704 - - - - - - N/A - - - - - - - - - - - - +HEPTANE heptane n-Heptane 540.13 * * * - - - 2.58 0.5 0.5 0.592 - - - - - - - - - +HEXANE hexane n-Hexane 507.82 * 3.1 * - - - 2.57 0.5 0.4 0.495 4.94E-01 - - - - - - - - - +HYDROGEN Hydrogen 33.145 R-702 - - - - - - N/A - - - 4.94E-01 - - - - - - - - - +IBUTENE 2-methyl-1-propene/methylpropene/isobutene/isobutylene Isobutene 418.09 * * * - - - N/A 0.6 0.6 6.27E-01 - - - - - - 6.67E+04 +IHEXANE 2-methylpentane (methylpentane) Isohexane 497.7 * * * - - - N/A - - - - - - - - - - - - +IPENTANE 2-methylbutane Isopentane 460.35 * * * - - - 1.8 0.3 0.3 4.05E-01 - - - - - - - - - +ISOBUTAN 2-methylpropane IsoButane 407.817 * * * - - - 1.74 0.4 0.3 3.07E-01 - - - - - - - - - +KRYPTON kr Krypton 209.48 R-784 - - - - - - N/A - - - - - - - - - - - - - +MD2M decamethyltetrasiloxane MD2M 599.4 * * * - - - N/A - - - - - - - - - - - - +MD3M dodecamethylcyclotetrasiloxane MD3M 628.36 * * * - - - N/A - - - - - - - - - - - - +MD4M tetradecamethylhexasiloxane MD4M 653.2 * * * - - - N/A - - - - - - - - - - - - +MDM octamethyltrisiloxane MDM 564.09 * * * - - - N/A - - - - - - - - - - - - +METHANE methane Methane 190.564 72 25 7.6 - - - 2.72 0.007 0.007 6.00E-03 - - - - - - - - - +METHANOL methanol Methanol CoolProp error: Your fluid name [Methanol] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid N/A 2.8 N/A - - - 1.44 0.2 0.1 0.178 1.40E-01 - - - - - - 1.37E+04 - - +MLINOLEA methyl linoleate (methyl (z,z)-9,12-octadecadienoate) MethylLinoleate 799 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +MLINOLEN methyl linolenate (methyl (z,z,z)-9,12,15-octadecatrienoate) MethylLinolenate 772 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +MM hexamethyldisiloxane MM 518.75 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +MOLEATE methyl oleate (methyl cis-9-octadecenoate) MethylOleate 782 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +MPALMITA methyl hexadecanoate MethylPalmitate 755 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +MSTEARAT methyl octadecanoate MethylStearate 775 N/A N/A N/A - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +N2O nitrous oxide NitrousOxide 309.52 290 320 180 - - - N/A N/A N/A N/A N/A - - - - - - - - - +NEON neon Neon 44.4918 R-720 - - - - - - N/A N/A N/A N/A N/A - - - - - - - - - +NEOPENTN neopentane (2,2-dimethylpropane) Neopentane 433.74 * * * - - - 2.25 - - - 1.73E-01 - - - - - - - - - +NF3 nitrogen trifluoride NitrogenTrifluoride CoolProp error: Your fluid name [NitrogenTrifluoride] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid 12300 17200 20700 - - - N/A - - - - - - - - - - - - +NITROGEN nitrogen Nitrogen 126.192 R-728 - - - - - - N/A - - - - - - - - - - - - +NONANE nonane n-Nonane 594.55 * * * - - - 2.29 0.4 0.5 0.463 4.14E-01 - - - - - - - - - +OCTANE octane n-Octane 569.32 * * * - - - 2.41 0.5 0.5 0.544 4.53E-01 - - - - - - - - - +ORTHOHYD orthohydrogen OrthoHydrogen 33.22 - - - - - - N/A - - - - - - - - - - - - - +OXYGEN oxygen Oxygen 154.581 - - - - - - N/A - - - - - - - - - - - - - +PARAHYD parahydrogen ParaHydrogen 32.938 - - - - - - N/A - - - - - - - - - - - - - +PENTANE pentane n-Pentane 469.7 R-601 * * * - - - N/A 0.3 0.4 0.387 3.95E-01 - - - - - - - - - +PROPANE propane n-Propane 369.89 R-290 * 3 * - - - 2.24 0.5 0.4 0.518 1.76E-01 - - - - - - - - - +PROPYLEN propylene Propylene 364.211 * 3.1 * - - - 2.64 0.6 1 1.06 1.12E+00 - - - - - - - - - +PROPYNE propyne/methylacetylene Propyne CoolProp error: Your fluid name [Propyne] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid * * * - - - N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +R11 trichlorofluoromethane R11 471.06 CFC-11 6730 4750 1620 1 1 1 541 - - - - - - - - - - - - - +R113 1,1,2-trichloro-1,2,2-trifluoroethane R113 CoolProp error: Your fluid name [R113] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid CFC-113 6540 6130 2700 0.8 0.8 1 659 - - - - - - - - - - - - - +R114 1,2-dichloro-1,1,2,2-tetrafluoroethane R114 CoolProp error: Your fluid name [R114] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid CFC-114 8040 10000 8730 1 1 1 1110 - - - - - - - - - - - - - +R115 chloropentafluoroethane R115 CoolProp error: Your fluid name [R115] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid CFC-115 5310 7370 9990 0.6 0.6 0.44 1080 - - - - - - - - - - - - - +R116 hexafluoroethane/perfluoroethane R116 293.03 FC-116 N/A 9200-12200 (2003) N/A - - - 1380 - - - - - - - - - - - - - +R12 dichlorodifluoromethane R12 CoolProp error: Your fluid name [R12] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid CFC-12 11000 10900 5200 1 1 1 1040 - - - - - - - - - - - - - +R123 2,2-dichloro-1,1,1-trifluoroethane R123 456.82 HCFC-123 273 77 24 0.02 0.02 0.02 12.3 - - - - - - - - - - - - - +R1234YF 2,3,3,3-tetrafluoroprop-1-ene R1234yf 367.85 R-1234yf/HFO-1234yf N/A 4 N/A - - - N/A - - - - - - - - - - - - - +R1234ZE trans-1,3,3,3-tetrafluoropropene R1234ze(E) 382.52 R-1234ze N/A 6 N/A - - - N/A - - - - - - - - - - - - - +R124 1-chloro-1,2,2,2-tetrafluoroethane R124 395.425 HCFC-124 2070 609 185 0.022 0.022 0.022 55.3 - - - - - - - - - - - - - +R125 pentafluoroethane R125 339.173 HFC-125 6350 3500 1100 - - - 354 - - - - - - - - - - - - - +R13 chlorotrifluoromethane R13 CoolProp error: Your fluid name [R13] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid CFC-13 10800 14400 16400 1 1 - 1390 - - - - - - - - - - - - - +R134A 1,1,1,2-tetrafluoroethane R134a 374.21 HFC-134a 3830 1430 435 - - - 144 - - - - - - - - - - - - - +R14 tetrafluoromethane/perfluoromethane R14 CoolProp error: Your fluid name [R14] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid FC-14 5210 7390 11200 - - - 697 - - - - - - - - - - - - - +R141B 1,1-dichloro-1-fluoroethane R141b CoolProp error: Your fluid name [R141B] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid HCFC-141b 2250 725 220 0.11 0.11 0.12 80.6 - - - - - - - - - - - - - +R142B 1-chloro-1,1-difluoroethane R142b CoolProp error: Your fluid name [R142B] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid HCFC-142b 5490 2310 705 0.065 0.065 0.07 228 - - - - - - - - - - - - - +R143A 1,1,1-trifluoroethane R143a 345.857 HFC-143a 5890 4470 1590 - - - 487 - - - - - - - - - - - - - +R152A 1,1-difluoroethane R152A 386.411 HFC-152a 437 124 38 - - - 15.5 - - - - - - - - - - - - - +R161 fluoroethane/ethylfluoride R161 375.25 N/A 10 N/A - - - N/A - - - - - - - - - - - - - +R21 dichlorofluoromethane R21 CoolProp error: Your fluid name [R21] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid HCFC-21 530 151 46 0.04 0.04 N/A N/A - - - - - - - - - - - - - +R218 octafluoropropane/perfluoropropane R218 345.02 F-218 6310 8830 12500 - - - N/A - - - - - - - - - - - - - +R22 chlorodifluoromethane R22 369.295 HCFC-22 5160 1810 549 0.055 0.055 0.05 194 - - - - - - - - - - - - - +R227EA 1,1,1,2,3,3,3-heptafluoropropane R227EA 374.9 HFC-227ea 5310 3220 1040 - - - 365 - - - - - - - - - - - - - +R23 trifluoromethane R23 299.293 HFC-23 12000 14800 12200 - - - 1340 - - - - - - - - - - - - - +R236EA 1,1,1,2,3,3-hexafluoropropane R236EA 412.44 HFC-236ea N/A 1200 N/A - - - N/A - - - - - - - - - - - - - +R236FA 1,1,1,3,3,3-hexafluoropropane R236FA 398.07 HFC-236fa 8100 9810 7660 - - - N/A - - - - - - - - - - - - - +R245CA 1,1,2,2,3-pentafluoropropane R245CA CoolProp error: Your fluid name [R245CA] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid HFC-245ca N/A N/A N/A - - - 67.5 - - - - - - - - - - - - - +R245FA 1,1,1,3,3-pentafluoropropane R245fa 427.16 HFC-245fa 3380 1030 314 - - - N/A - - - - - - - - - - - - - +R32 difluoromethane R32 351.255 HFC-32 2330 675 205 - - - 64.2 - - - - - - - - - - - - - +R365MFC 1,1,1,3,3-pentafluorobutane R365MFC 460 HFC-365mfc 2520 794 241 - - - N/A - - - - - - - - - - - - - +R404A 44% r-125, 52% r143a, r134a R404A 345.27 Blend N/A 3900 N/A 0.04 0 0 N/A - - - - - - - - - - - - - +R407C 23% r-32, 25% r-125, 52% r134a R407C 359.345 Blend N/A 1800 N/A 0 N/A N/A N/A - - - - - - - - - - - - - +R41 fluoromethane R41 317.28 HFC-41 323 92 28 - - - N/A - - - - - - - - - - - - - +R410A 50% r-32, 50% r-125 R410A 344.494 Blend N/A 2088 N/A - - - N/A - - - - - - - - - - - - - +R507A 50% r-125, 50% r-143a R507A 343.765 Blend N/A 3985 N/A - - - N/A - - - - - - - - - - - - - +RC318 octafluorocyclobutane/perfluorocyclobutane RC318 CoolProp error: Your fluid name [RC318] is not a CoolProp fluid, a REFPROP fluid, a brine or a liquid FC-C318 7310 10300 14700 - - - 1010 - - - - - - - - - - - - - +SF6 sulfur hexafluoride/sulphur hexafluoride SulfurHexafluoride 318.7232 16300 22800 32600 - - - 2760 - - - - - - - - - - - - - +SO2 sulfur dioxide/sulphur dioxide SulfurDioxide 430.64 R-764 ** ** ** - - - N/A - - - - - - - - - - - - - +T2BUTENE trans-2-butene trans-2-Butene 428.61 C4H8 * * * - - - 2.57 - - - 1.13E+00 - - - - - - - - - +TOLUENE methylbenzane Toluene 591.75 N/A 3.3 N/A - - - 1.95 0.5 0.6 0.565 6.4E-01 3.3E-01 7.0E-05 7.0E-04 5.0E-05 5.8E-04 1.6E-05 2.6E+05 - - +WATER Water 647.096 *** *** *** - - - N/A - - - - - - - - - - - - - +XENON Xenon 289.733 - - - - - - N/A - - - - - - - - - - - - -""" + +name_dict,ODP_dict,GWP20_dict,GWP100_dict,GWP500_dict = {},{},{},{},{} + +for row in fluid_lookup.split('\n'): + a = row.split('\t') + # Refprop fluid name + RPName = a[0].strip() + + # CAS number for this fluid + CAS = RP2CAS[RPName] + + name_dict[CAS] = a[2].strip() + ODP_dict[CAS] = a[10].strip() + GWP20_dict[CAS] = a[5].strip() + GWP100_dict[CAS] = a[6].strip() + GWP500_dict[CAS] = a[7].strip() + +ASHRAE34data = """R11 A1 +R12 A1 +R13 A1 +R21 B1 +R22 A1 +R23 A1 +R30 B2 +R32 A2 +R40 B2 +METHANE A3 +R113 A1 +R114 A1 +R115 A1 +R116 A1 +R123 B1 +R124 A1 +R125F A1 +R134A A1 +R142B A2 +R143A A2 +R152A A2 +ETHANE A3 +DME A3 +R218 A1 +R227EA A1 +R236FA A1 +R245FA B1 +PROPANE A3 +RC318 A1 +BUTANE A3 +ISOBUTANE A3 +IPENTANE A3 +HYDROGEN A3 +HELIUM A1 +AMMONIA B2 +WATER A1 +NEON A1 +NITROGEN A1 +ARGON A1 +CO2 A1 +SO2 B1 +ETHYLENE A3 +PROPYLEN A3 +R404A A1 +R507A A1 +R410A A1 +R407C A1 +R1234YF A2L""" + +ASHRAE34_dict = {} +for row in ASHRAE34data.split('\n'): + a = row.split('\t') + if a[0] in RP2CAS: + ASHRAE34_dict[RP2CAS[a[0]]] = a[1] + else: + print 'Missing CAS number for ' + a[0] + +fluids = """:'1BUTENE.FLD','ACETONE.FLD','AIR.PPF','AMMONIA.FLD','ARGON.FLD', +:'BENZENE.FLD','BUTANE.FLD','C1CC6.FLD','C2BUTENE.FLD','C3CC6.FLD', +:'C4F10.FLD','C5F12.FLD','C12.FLD','CF3I.FLD','CO.FLD','CO2.FLD', +:'COS.FLD','CYCLOHEX.FLD','CYCLOPEN.FLD','CYCLOPRO.FLD','D2.FLD', +:'D2O.FLD','D4.FLD','D5.FLD','D6.FLD','DECANE.FLD','DMC.FLD', +:'DME.FLD','ETHANE.FLD','ETHANOL.FLD','ETHYLENE.FLD','FLUORINE.FLD' +:,'H2S.FLD','HELIUM.FLD','HEPTANE.FLD','HEXANE.FLD','HYDROGEN.FLD', +:'IBUTENE.FLD','IHEXANE.FLD','IPENTANE.FLD','ISOBUTAN.FLD', +:'KRYPTON.FLD','MD2M.FLD','MD3M.FLD','MDM.FLD','METHANE.FLD', +:'METHANOL.FLD','MLINOLEA.FLD','MLINOLEN.FLD','MM.FLD', +:'MOLEATE.FLD','MPALMITA.FLD','MSTEARAT.FLD','N2O.FLD','NEON.FLD', +:'NEOPENTN.FLD','NF3.FLD','NITROGEN.FLD','NONANE.FLD', +:'OCTANE.FLD','ORTHOHYD.FLD','OXYGEN.FLD','PARAHYD.FLD', +:'PENTANE.FLD','PROPANE.FLD','PROPYLEN.FLD','PROPYNE.FLD', +:'R32.FLD','R41.FLD','R115.FLD','R116.FLD','R124.FLD','R125.FLD', +:'R141B.FLD','R142B.FLD','R143A.FLD','R161.FLD','R218.FLD', +:'R227EA.FLD','R236EA.FLD','R236FA.FLD','R245CA.FLD','R245FA.FLD', +:'R365MFC.FLD','R507A.PPF','R1234YF.FLD','R1234ZE.FLD','SF6.FLD', +:'SO2.FLD','T2BUTENE.FLD','TOLUENE.FLD','WATER.FLD','XENON.FLD', +:'R11.FLD','R12.FLD','R13.FLD','R14.FLD','R21.FLD','R22.FLD', +:'R23.FLD','R113.FLD','R114.FLD','R123.FLD','R134A.FLD','R152A.FLD', +:'R404A.PPF','R407C.PPF','R410A.PPF','RC318.FLD'""" + +HH = """:'0','2','0','3','0', +:'2','1','2','0','NA', +:'1','NA','2','1','1','1', +:'3','1','2','2','NA', +:'NA','NA','NA','NA','2','2', +:'1','1','2','2','4' +:,'4','0','1','2','0', +:'1','2','1','1', +:'0','1','1','1','0', +:'2','NA','NA','2', +:'2','1','0','1','0', +:'1','1','0','2', +:'2','NA','0','NA', +:'2','1','1','1', +:'1','2','1','1','1','1', +:'1','1','1','NA','2', +:'1','NA','1','NA','2', +:'NA','1','1','1','1', +:'3','0','2','0','0', +:'1','1','NA','NA','NA','1', +:'1','1','1','2','1','1', +:'1','1','1','1'""" + +FH = """:'4','3','0','1','0', +:'3','4','3','4','NA', +:'0','NA','2','0','4','0', +:'4','3','3','2','NA', +:'NA','NA','NA','NA','2','3', +:'4','4','3','4','3' +:,'4','0','3','3','4', +:'4','3','4','4', +:'0','2','2','2','4', +:'3','NA','NA','3', +:'1','0','1','0','0', +:'4','0','0','3', +:'3','NA','0','NA', +:'4','4','4','4', +:'4','3','0','0','1','1', +:'1','1','1','NA','1', +:'0','NA','0','NA','0', +:'NA','1','2','2','0', +:'0','4','3','0','0', +:'1','1','NA','NA','NA','1', +:'1','0','0','1','1','4', +:'1','1','1','0' """ + +PH = """:'0','0','0','0','0', +:'0','0','0','1','NA', +:'0','NA','0','0','3','0', +:'1','0','1','0','NA', +:'NA','NA','NA','NA','0','0', +:'2','0','0','2','0' +:,'0','0','0','0','0', +:'2','1','0','0', +:'0','0','0','0','0', +:'0','NA','NA','1', +:'0','0','0','0','0', +:'0','3','0','0', +:'0','NA','0','NA', +:'0','0','1','1', +:'1','2','1','1','0','0', +:'0','0','0','NA','1', +:'0','NA','1','NA','1', +:'NA','0','0','0','0', +:'0','1','0','0','3', +:'0','0','NA','NA','NA','0', +:'0','0','0','0','0','1', +:'0','0','0','2'""" + +pp_fluids = fluids.replace(':','').replace('\n','').replace('.FLD','').replace('.PPF','').replace("'",'').split(",") +pp_HH = HH.replace(':','').replace('\n','').replace("'",'').split(",") +pp_FH = FH.replace(':','').replace('\n','').replace("'",'').split(",") +pp_PH = PH.replace(':','').replace('\n','').replace("'",'').split(",") + +HH_dict = {RP2CAS[k]:v for k,v in zip(pp_fluids,pp_HH)} +FH_dict = {RP2CAS[k]:v for k,v in zip(pp_fluids,pp_FH)} +PH_dict = {RP2CAS[k]:v for k,v in zip(pp_fluids,pp_PH)} + +def get_env_data(fluid): + a = dict( + HH = HH_dict[fluid], + FH = FH_dict[fluid], + PH = PH_dict[fluid], + ODP = ODP_dict[fluid], + GWP20 = GWP20_dict[fluid], + GWP100 = GWP100_dict[fluid], + GWP500 = GWP500_dict[fluid] + ) + + for k,v in a.iteritems(): + try: + a[k] = int(v) + except ValueError: + try: + a[k] = float(v) + except ValueError: + a[k] = -1 + + for term in ['GWP100','GWP20','GWP500','ODP']: + try: + a[term] = float(a[term]) + except TypeError: + a[term] = -1 + + if fluid in ASHRAE34_dict: + a['ASHRAE34'] = ASHRAE34_dict[fluid] + else: + a['ASHRAE34'] = 'UNKNOWN' + + a['Name'] = name_dict[fluid] + + return a + +import json + +code = {} +for fluid in pp_fluids: + fluid = RP2CAS[fluid] + if name_dict[fluid]: + code[fluid] = get_env_data(fluid) + else: + continue + +f = open('DTU_environmental.json','w') +f.write(json.dumps(code, sort_keys=True, indent=2, separators=(',', ': '))) +f.close() \ No newline at end of file diff --git a/dev/fitter/BuildLIB-VS2010.bat b/dev/fitter/BuildLIB-VS2010.bat new file mode 100644 index 00000000..1ee5086b --- /dev/null +++ b/dev/fitter/BuildLIB-VS2010.bat @@ -0,0 +1,10 @@ +REM ******** set the variables ************ +REM call both to ensure that one works +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources from CoolProp *************** +cl /c /MP3 /I../../CoolProp /DEBUG /EHsc /MD ../../CoolProp/*.cpp + +lib *.obj /OUT:CoolPropLib.lib +erase *.obj diff --git a/dev/fitter/DataTypes.cpp b/dev/fitter/DataTypes.cpp new file mode 100644 index 00000000..7aca1bbe --- /dev/null +++ b/dev/fitter/DataTypes.cpp @@ -0,0 +1,81 @@ +#include +#include +class EOSFitter; +#include "DataTypes.h" +#include "Fitter.h" + +double NonlinearExperimentalDataPoint::residual(const std::vector &n) +{ + double summer = a_0(n); + for (unsigned int i = 1; i < n.size(); i++) + { + summer -= n[i]*a_i(i); + } + return summer; +} + +double LinearExperimentalDataPoint::residual(const std::vector &n) +{ + double summer = a_0(); + for (unsigned int i = 1; i < n.size(); i++) + { + summer -= n[i]*a_i(i); + } + return summer; +} + + +PressureDataPoint::PressureDataPoint(EOSFitter* EOS, double T, double rho, double p, double variance) +{ + this->EOS = EOS; + this->T = T; + this->rho = rho; + this->p = p; + this->tau = EOS->Tr/this->T; + this->delta = this->rho/EOS->rhor; + this->log_tau = log(tau); + this->log_delta = log(delta); + this->variance = variance; +} +/// The part that does not depend on the coefficients +double PressureDataPoint::a_0() +{ + double rhoRT = this->rho*EOS->R*this->T; + return this->p/rhoRT-1; +} +/// The part that multiplies the coefficients +double PressureDataPoint::a_i(int i) +{ + return delta*EOS->dA_dDelta(log_tau, log_delta, delta, i); +} + +SpecificHeatCPDataPoint::SpecificHeatCPDataPoint(EOSFitter* EOS, double T, double rho, double cp, double variance) +{ + this->EOS = EOS; + this->T = T; + this->rho = rho; + this->cp = cp; + this->cp_over_R = this->cp/EOS->R; + this->tau = EOS->Tr/this->T; + this->delta = this->rho/EOS->rhor; + this->log_tau = log(tau); + this->log_delta = log(delta); + this->variance = variance; +} +/// The part that does not depend on the coefficients +/// Here it requires that the coefficients be passed in to calculate the precorrelation factor +double SpecificHeatCPDataPoint::a_0(const std::vector &n) +{ + // Only calculate this function once to save on calls + double _dalpha_ddelta = EOS->dalphar_dDelta(log_tau, log_delta, delta); + // The precorrelation factor + double e_cp = (pow(1+delta*_dalpha_ddelta-delta*tau*EOS->d2alphar_dDelta_dTau(log_tau, log_delta, delta),(int)2) + /(1+2*delta*_dalpha_ddelta+delta*delta*EOS->d2alphar_dDelta2(log_tau, log_delta, delta))); + // The a_0 term + return cp_over_R+tau*tau*EOS->d2alpha0_dTau2(tau, delta)-e_cp; +}; +/// The part that multiplies the coefficients +double SpecificHeatCPDataPoint::a_i(int i) +{ + return -pow(tau,(int)2)*EOS->d2A_dTau2(log_tau, log_delta, delta, i); +} \ No newline at end of file diff --git a/dev/fitter/DataTypes.h b/dev/fitter/DataTypes.h new file mode 100644 index 00000000..8cffa37d --- /dev/null +++ b/dev/fitter/DataTypes.h @@ -0,0 +1,61 @@ +#ifndef FITTER_DATATYPES_H +#define FITTER_DATATYPES_H + +class ExperimentalDataPoint +{ +public: + EOSFitter* EOS; + double T, /// The temperature [K] + rho, /// The density [mol/m^3] + p, /// The pressure [Pa] + tau, /// The reciprocal reduced temperature [-] + delta, /// The reduced density [-] + log_tau, /// The natural logarithm of the reciprocal reduced temperature + log_delta, /// The natural logarithm of the reduced density + variance; /// The total variance of the datapoint + virtual double residual(const std::vector &n) = 0; + double sum_squares(const std::vector &n) + { + return pow(residual(n)/variance,(int)2); + } +}; + +class NonlinearExperimentalDataPoint : public ExperimentalDataPoint +{ +public: + virtual double a_0(const std::vector &n) = 0; + virtual double a_i(int i) = 0; + double residual(const std::vector &n); +}; + +class LinearExperimentalDataPoint : public ExperimentalDataPoint +{ +public: + virtual double a_0(void) = 0; + virtual double a_i(int i) = 0; + double residual(const std::vector &n); +}; + +class PressureDataPoint : public LinearExperimentalDataPoint +{ +public: + PressureDataPoint(EOSFitter* EOS, double T, double rho, double p, double variance); + /// The part that does not depend on the coefficients + double a_0(void); + /// The part that multiplies the coefficients + double a_i(int i); +}; + +class SpecificHeatCPDataPoint : public NonlinearExperimentalDataPoint +{ +public: + double cp, cp_over_R; + SpecificHeatCPDataPoint(EOSFitter* EOS, double T, double rho, double cp, double variance); + /// The part that does not depend on the coefficients + /// Here it requires that the coefficients be passed in to calculate the precorrelation factor + double a_0(const std::vector &n); + /// The part that multiplies the coefficients + double a_i(int i); +}; + +#endif \ No newline at end of file diff --git a/dev/fitter/Fitter.cpp b/dev/fitter/Fitter.cpp new file mode 100644 index 00000000..44c168b4 --- /dev/null +++ b/dev/fitter/Fitter.cpp @@ -0,0 +1,145 @@ +#include +#include "Eigen/Dense" +#include "Helmholtz.h" + +class EOSFitter; +#include "DataTypes.h" +#include "Fitter.h" + +EOSFitter::EOSFitter() +{ + this->Tr = Tr; + this->rhor = rhor; + this->R = R; +}; +double EOSFitter::dA_dDelta(double log_tau, double log_delta, double delta, int i) +{ + return alphar.dA_dDelta(log_tau, log_delta, delta, i); +}; +double EOSFitter::d2A_dTau2(double log_tau, double log_delta, double delta, int i) +{ + return alphar.d2A_dTau2(log_tau, log_delta, delta, i); +}; +double EOSFitter::dalphar_dDelta(double log_tau, double log_delta, double delta) +{ + double summer = 0; + for (unsigned int i = 0; i < alphar.n.size(); i++) + { + summer += alphar.n[i]*alphar.dA_dDelta(log_tau, log_delta, delta, i); + } + return summer; +}; +double EOSFitter::d2alphar_dDelta2(double log_tau, double log_delta, double delta) +{ + double summer = 0; + for (unsigned int i = 0; i < alphar.n.size(); i++) + { + summer += alphar.n[i]*alphar.d2A_dDelta2(log_tau, log_delta, delta, i); + } + return summer; +}; +double EOSFitter::d2alphar_dTau2(double log_tau, double log_delta, double delta) +{ + double summer = 0; + for (unsigned int i = 0; i < alphar.n.size(); i++) + { + summer += alphar.n[i]*alphar.d2A_dTau2(log_tau, log_delta, delta, i); + } + return summer; +}; +double EOSFitter::d2alpha0_dTau2(double tau, double delta) +{ + double summer = 0; + for (std::vector::iterator it = alpha0.begin(); it != alpha0.end(); it++){ + summer += (*it)->dTau2(tau,delta); + } + return summer; +}; +double EOSFitter::d2alphar_dDelta_dTau(double log_tau, double log_delta, double delta) +{ + double summer = 0; + for (unsigned int i = 0; i < alphar.n.size(); i++) + { + summer += alphar.n[i]*alphar.d2A_dDelta_dTau(log_tau, log_delta, delta, i); + } + return summer; +}; +/// Set the coefficients in the EOS +void EOSFitter::set_n(const std::vector &n) +{ + alphar.n = n; +}; + +void EOSFitter::solve_for_n(std::vector &n, bool non_linear_terms_enabled) +{ + Eigen::MatrixXd A = Eigen::MatrixXd::Random(21, 21); + Eigen::VectorXd Q = Eigen::VectorXd::Random(21); + + // Build the A matrix and the Q vector + for (int i = 1; i <= A.rows(); i++) + { + // The i-th row of the A matrix (Span 2000 Eq. 4.9) + for (int j = 1; j <= A.cols(); j++) + { + // The entry for the j-th column and i-th row + double summer = 0; + for (unsigned int m = 0; m < linear_data_points.size(); m++) + { + LinearExperimentalDataPoint &pt = *linear_data_points[m]; + summer += (pt.a_i(i)*pt.a_i(j))/pow(pt.variance,(int)2); + } + if (non_linear_terms_enabled) + { + for (unsigned int m = 0; m < nonlinear_data_points.size(); m++) + { + NonlinearExperimentalDataPoint &pt = *nonlinear_data_points[m]; + summer += (pt.a_i(i)*pt.a_i(j))/pow(pt.variance,(int)2); + } + } + A(i-1,j-1) = summer; + } + // The i-th entry in the Q column vector + double summer = 0; + for (unsigned int m = 0; m < linear_data_points.size(); m++) + { + LinearExperimentalDataPoint &pt = *linear_data_points[m]; + summer += (pt.a_i(i)*pt.a_0())/pow(pt.variance,(int)2); + } + if (non_linear_terms_enabled) + { + for (unsigned int m = 0; m < nonlinear_data_points.size(); m++) + { + NonlinearExperimentalDataPoint &pt = *nonlinear_data_points[m]; + summer += (pt.a_i(i)*pt.a_0(n))/pow(pt.variance,(int)2); + } + } + Q(i-1) = summer; + } + + Eigen::VectorXd N = A.colPivHouseholderQr().solve(Q); + for (unsigned int i = 0; i < n.size()-1; i++) + { + n[i+1] = N(i); + } + + double relative_error = (A*N - Q).norm() / Q.norm(); +}; + +double EOSFitter::sum_squares(std::vector &n, bool non_linear_terms_enabled) +{ + double summer = 0; + for (unsigned int m = 0; m < linear_data_points.size(); m++) + { + LinearExperimentalDataPoint &pt = *linear_data_points[m]; + summer += pt.sum_squares(n); + } + if (non_linear_terms_enabled) + { + for (unsigned int m = 0; m < nonlinear_data_points.size(); m++) + { + NonlinearExperimentalDataPoint &pt = *nonlinear_data_points[m]; + summer += pt.sum_squares(n); + } + } + return summer; +} \ No newline at end of file diff --git a/dev/fitter/Fitter.h b/dev/fitter/Fitter.h new file mode 100644 index 00000000..7b3b9010 --- /dev/null +++ b/dev/fitter/Fitter.h @@ -0,0 +1,46 @@ +#ifndef FITTER_FITTER_H +#define FITTER_FITTER_H + +#include +#include "DataTypes.h" +#include "Helmholtz.h" + +class EOSFitter +{ +public: + double Tr, /// The reducing temperature for tau [K] + rhor, /// The reducing density for delta [mol/m^3] + R; /// The universal gas constant [J/mol/K] + std::vector linear_data_points; + std::vector nonlinear_data_points; + phir_power alphar; // Temporary for now + std::vector alpha0; /// A vector of instances of the phi_BC classes for the ideal-gas Helmholtz energy contribution + EOSFitter(); + + double dA_dDelta(double log_tau, double log_delta, double delta, int i); + double d2A_dTau2(double log_tau, double log_delta, double delta, int i); + double dalphar_dDelta(double log_tau, double log_delta, double delta); + double d2alphar_dDelta2(double log_tau, double log_delta, double delta); + double d2alphar_dTau2(double log_tau, double log_delta, double delta); + double d2alpha0_dTau2(double tau, double delta); + double d2alphar_dDelta_dTau(double log_tau, double log_delta, double delta); + /// Set the coefficients in the EOS + void set_n(const std::vector &n); + + void solve_for_n(std::vector &n, bool non_linear_terms_enabled); + double sum_squares(std::vector &n, bool non_linear_terms_enabled); +}; + +class EOSFitterFixedForm : public EOSFitter +{ +public: + + EOSFitterFixedForm(double Tr, double rhor, double R) + { + this->Tr = Tr; + this->rhor = rhor; + this->R = R; + }; +}; + +#endif \ No newline at end of file diff --git a/dev/fitter/HEF/HEF.sln b/dev/fitter/HEF/HEF.sln new file mode 100644 index 00000000..0b41173a --- /dev/null +++ b/dev/fitter/HEF/HEF.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HEF", "HEF.vcxproj", "{47D1379F-5D11-4FD8-A2A9-AB5155D26F79}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47D1379F-5D11-4FD8-A2A9-AB5155D26F79}.Debug|Win32.ActiveCfg = Debug|Win32 + {47D1379F-5D11-4FD8-A2A9-AB5155D26F79}.Debug|Win32.Build.0 = Debug|Win32 + {47D1379F-5D11-4FD8-A2A9-AB5155D26F79}.Release|Win32.ActiveCfg = Release|Win32 + {47D1379F-5D11-4FD8-A2A9-AB5155D26F79}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dev/fitter/HEF/HEF.vcxproj b/dev/fitter/HEF/HEF.vcxproj new file mode 100644 index 00000000..52a4dc29 --- /dev/null +++ b/dev/fitter/HEF/HEF.vcxproj @@ -0,0 +1,85 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {47D1379F-5D11-4FD8-A2A9-AB5155D26F79} + HEF + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + Level3 + Disabled + C:\Users\Belli\Documents\Code\CoolProp\CoolProp;%(AdditionalIncludeDirectories) + MultiThreadedDLL + false + false + + + true + C:\Users\Belli\Documents\Code\CoolProp\dev\fitter;%(AdditionalLibraryDirectories) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;CoolPropLib.lib;%(AdditionalDependencies) + + + + + Level3 + Full + true + true + Default + true + C:\Users\Belli\Documents\Code\CoolProp\CoolProp;%(AdditionalIncludeDirectories) + + + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;CoolPropLib.lib;%(AdditionalDependencies) + C:\Users\Belli\Documents\Code\CoolProp\dev\fitter;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/fitter/main.cpp b/dev/fitter/main.cpp new file mode 100644 index 00000000..ffe49009 --- /dev/null +++ b/dev/fitter/main.cpp @@ -0,0 +1,111 @@ +#include +#include "Eigen/Dense" +#include "time.h" +#include "Helmholtz.h" +#include "CoolProp.h" + +class EOSFitter; +#include "Fitter.h" +#include "DataTypes.h" + + +int main() +{ + double n[]={0.0, 0.5586817e-3, 0.4982230e0, 0.2458698e-0, 0.8570145e-3, 0.4788584e-3, -0.1800808e-1, 0.2671641e0, -0.4781652e1, 0.1423987e1, 0.3324062e0, -0.7485907e-2, 0.1017263e-3, -0.5184567e+0, -0.8692288e-1, 0.2057144e+0, -0.5000457e-2, 0.4603262e-3, -0.3497836e-2, 0.6995038e-2, -0.1452184e-1, -0.1285458e-3}; + double d[]={0,2,1,3,6,6,1,1,2,5,2,2,4,1,4,1,2,4,1,5,3,10}; + double t[]={0.0,-1.0/2.0,0.0,0.0,0.0,3.0/2.0,3.0/2.0,2.0,2.0,1.0,3.0,5.0,1.0,5.0,5.0,6.0,10.0,10.0,10.0,18.0,22.0,50.0}; + double c[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,4.0}; + + std::vector nv(n,n+sizeof(n)/sizeof(double)); + + double mm = Props1SI("R134a","molemass"); + double rhoL, rhoV; + bool supercritical_T; + + double Tr = Props1SI("R134a","Treduce"); + EOSFitter* pEOS = new EOSFitterFixedForm(Props1SI("R134a","Treduce"),Props1SI("R134a","rhoreduce")/mm*1000,8.314471); + EOSFitter &EOS = *pEOS; + + // ---------------------------- + // Generate "experimental" data + // ---------------------------- + for (double T = 250; T < 500; T+=10) + { + if (T < Tr) + { + rhoL = PropsSI("D","T",T,"Q",0,"R134a"); + rhoV = PropsSI("D","T",T,"Q",1,"R134a"); + supercritical_T = false; + } + else + { + rhoL = -1; + rhoV = -1; + supercritical_T = true; + } + + for (double rho = 1e-10; rho < 1200; rho *= 1.5) + { + if (!supercritical_T && (rho < rhoL && rho > rhoV)){ continue; } + double p = PropsSI("P","T",T,"D",rho,"R134a"); + double rhobar = rho/mm*1000; + double cp = PropsSI("C","T",T,"D",rho,"R134a"); // [J/kg/K]; convert to J/mol/K by *mm/1000 + double variance = 1; // TODO; change this + EOS.linear_data_points.push_back(new PressureDataPoint(pEOS,T,rho/mm*1000,p,variance)); + EOS.nonlinear_data_points.push_back(new SpecificHeatCPDataPoint(pEOS,T,rho/mm*1000,cp*mm/1000,variance*100)); + } + } + + // Setup the EOS + EOS.alphar = phir_power(n,d,t,c,1,21,22); + + static const double a0[]={ + 0.0, //[0] + -1.019535, //[1] + 9.047135, //[2] + -1.629789, //[3] + -9.723916, //[4] + -3.927170 //[5] + }; + static const double t0[]={ + 0.0, //[0] + 0.0, //[1] + 0.0, //[2] + 0.0, //[3] + -1.0/2.0, //[4] + -3.0/4.0 //[5] + }; + + // phi0=log(delta)+a0[1]+a0[2]*tau+a0[3]*log(tau)+a0[4]*pow(tau,-1.0/2.0)+a0[5]*pow(tau,-3.0/4.0); + EOS.alpha0.push_back(new phi0_lead(a0[1],a0[2])); + EOS.alpha0.push_back(new phi0_logtau(a0[3])); + EOS.alpha0.push_back(new phi0_power(a0,t0,4,5,6)); + + /*for (unsigned int i = 0; i < EOS.nonlinear_data_points.size();i++) + { + std::cout << EOS.nonlinear_data_points[i]->residual(nv) << std::endl; + }*/ + + // Set the coefficients in the preliminary EOS + EOS.set_n(nv); + std::cout << format("before fit x2 %g\n",EOS.sum_squares(nv,false)); + // Solve for n without nonlinear terms to get an approximate solution + EOS.solve_for_n(nv, false); + std::cout << format("solved for n x2 %g\n",EOS.sum_squares(nv,false)); + EOS.set_n(nv); + std::cout << format("applied n x2 %g\n",EOS.sum_squares(nv,true)); + + for (int iter = 0; iter < 5; iter++) + { + EOS.set_n(nv); + + // Turn on the nonlinear terms and try again + EOS.solve_for_n(nv, true); + + std::cout << nv[1] << " " << nv[2] << std::endl; + + std::cout << format("iter: %d x2 %g\n",iter, EOS.sum_squares(nv,true)); + } + + double rr = 0; +} \ No newline at end of file diff --git a/dev/fluids/1-Butene.json b/dev/fluids/1-Butene.json new file mode 100644 index 00000000..c629b4fc --- /dev/null +++ b/dev/fluids/1-Butene.json @@ -0,0 +1,258 @@ +{ + "ALIASES": [ + "1Butene", + "1BUTENE", + "1-BUTENE", + "Butene" + ], + "ANCILLARIES": { + "pL": { + "T_r": 419.29, + "Tmax": 419.2899999999993, + "Tmin": 87.80000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015396951311941187, + "n": [ + -11.309717975642364, + 5.911539361818991, + -0.8939616477939638, + -2.3039589144938732, + -0.9566612009415151, + -1.297120238102156 + ], + "reducing_value": 4005100.0, + "t": [ + 1.037, + 1.176, + 1.95, + 3.798, + 5.373, + 16.675 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 419.29, + "Tmax": 419.2899999999993, + "Tmin": 87.80000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0500335385506423, + "n": [ + 0.09749917163190837, + -6.023622095673614, + -9.978780101855465, + 11.257196162885533, + -4.937156322143673, + -1.4911743361627807 + ], + "reducing_value": 4005100.0, + "t": [ + 0.539, + 0.946, + 3.545, + 3.783, + 4.496, + 18.106 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 419.29, + "Tmax": 419.2899999999993, + "Tmin": 87.80000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.24436140891674896, + "n": [ + -1.1329161154078617, + 4.576996342937427, + -2.35398267961107, + 1.6095202242190951, + 1.9936948858619448, + -8.666711070126212 + ], + "reducing_value": 4240.0, + "t": [ + 0.226, + 0.326, + 0.495, + 0.869, + 11.457, + 19.823 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 419.29, + "Tmax": 419.2899999999993, + "Tmin": 87.80000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.49395022045438663, + "n": [ + -3.302882573914376, + -1.9359137327823328, + -4.362721415165588, + 24.301821574494937, + -191.8377573940649, + 174.69349121901325 + ], + "reducing_value": 4240.0, + "t": [ + 0.429, + 1.081, + 4.121, + 15.125, + 18.011, + 18.807 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 419.29, + "a": [ + 0.05644 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.248 + ] + } + }, + "CAS": "106-98-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "1-Butene", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-FPE-2005", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 87.8, + "Ttriple_units": "K", + "accentric": 0.191860647355, + "accentric_units": "-", + "alpha0": [ + { + "a1": -0.00101126, + "a2": 2.3869174, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.9197, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.9406, + 6.5395, + 14.535, + 5.8971 + ], + "t": [ + 0.6534856543203987, + 2.268119917002552, + 5.072861265472584, + 13.71842877244866 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.78084, + -2.8258, + 0.99403, + 0.017951, + 0.088889, + 0.00024673, + 0.22846, + -0.074009, + -0.22913, + -0.062334, + -0.025385, + 0.01104 + ], + "t": [ + 0.12, + 1.3, + 1.74, + 2.1, + 0.28, + 0.69, + 0.75, + 2, + 4.4, + 4.7, + 15, + 14 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.05610631999999999, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 5.94529946e-07, + "ptriple_units": "Pa", + "reducing_state": { + "T": 419.29, + "T_units": "K", + "p": 4005100, + "p_units": "Pa", + "rhomolar": 4240, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14581.83824668767, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 8.148005394321945e-10, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "1-Butene" +} \ No newline at end of file diff --git a/dev/fluids/AceticAcid.json b/dev/fluids/AceticAcid.json new file mode 100644 index 00000000..4b46bd15 --- /dev/null +++ b/dev/fluids/AceticAcid.json @@ -0,0 +1,260 @@ +{ + "ALIASES": [ + "ACETICACID" + ], + "ANCILLARIES": { + "pL": { + "T_r": 590.7, + "Tmax": 590.699999999999, + "Tmin": 289.8, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5674647354725337, + "n": [ + 0.05089050119304307, + -5.285519841316859, + -3.071650825512276, + 210.76209320498046, + -975.2165852387217, + 844.4287532124403 + ], + "reducing_value": 5817526.2731114905, + "t": [ + 0.18, + 0.829, + 1.519, + 6.183, + 7.066, + 7.631 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 590.7, + "Tmax": 590.699999999999, + "Tmin": 289.8, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9098285656243599, + "n": [ + -9.58174551112718, + 30.994111002740425, + -48.83655977160024, + 24.73248304349376, + -324.0927920320514, + 1917.3033191979387 + ], + "reducing_value": 5817526.2731114905, + "t": [ + 1.001, + 2.032, + 2.409, + 3.258, + 9.232, + 12.976 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 590.7, + "Tmax": 590.699999999999, + "Tmin": 289.8, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.262549681711791, + "n": [ + 4.940863127519307, + -49.93131631499533, + 64.19066221675779, + -44.40327764554098, + 85.91652398739252, + -146.7511477315432 + ], + "reducing_value": 5844.938283446536, + "t": [ + 0.534, + 1.563, + 1.814, + 3.423, + 5.634, + 8.599 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 590.7, + "Tmax": 590.699999999999, + "Tmin": 289.8, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 5.382735659387827, + "n": [ + 5.220370341701724, + -209.98650746673673, + 244.24917360329798, + -62.1086537700349, + 23.792691599086265, + -76.09222369333516 + ], + "reducing_value": 5844.938283446536, + "t": [ + 0.574, + 0.844, + 0.92, + 1.424, + 2.627, + 7.014 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "64-19-7", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Piazza-FPE-2011", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 289.8, + "Ttriple_units": "K", + "accentric": 0.48092, + "accentric_units": "-", + "alpha0": [ + { + "a1": -3.94616949, + "a2": 5.4848793, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.6676653, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.210687796, + -0.781330239, + 0.130979005 + ], + "t": [ + -1, + -2, + -3 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 6.28891793 + ], + "t": [ + 2.09502491 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 2, + 6, + 3, + 3, + 3, + 4, + 4, + 5, + 5, + 5, + 5, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 3 + ], + "n": [ + -1.5624834164583, + -0.87470366957096, + 4.6968858010355, + 0.0097367136204905, + -0.0049055972708048, + 24.499997808125, + -31.443235067567, + -1.3768156877983, + 1.4849435860881, + 1.1374909453775, + -2.6039791873344, + -0.030484923493199, + 5.3316386834696, + -5.673395219364, + -0.12678556644053 + ], + "t": [ + -1, + 1.375, + 1, + 1.375, + 0.75, + -0.25, + 0, + 2.25, + 0.125, + 2.125, + 1.25, + 2.25, + 2.125, + 2.375, + 14 + ], + "type": "ResidualHelmholtzPower" + }, + { + "a": 1, + "epsilonbar": 12.2735737, + "kappabar": 1.09117041e-05, + "m": 1.01871348, + "type": "ResidualHelmholtzAssociating", + "vbarn": 0.0444215309 + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.06005196, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1075.589508, + "ptriple_units": "Pa", + "reducing_state": { + "T": 590.7, + "T_units": "K", + "p": 5817526.273111491, + "p_units": "Pa", + "rhomolar": 5844.938283446536, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 17521.26343475435, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.8334697179759745, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "AceticAcid" +} \ No newline at end of file diff --git a/dev/fluids/Acetone.json b/dev/fluids/Acetone.json new file mode 100644 index 00000000..d624651e --- /dev/null +++ b/dev/fluids/Acetone.json @@ -0,0 +1,254 @@ +{ + "ALIASES": [ + "acetone", + "ACETONE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 508.1, + "Tmax": 508.09999999999917, + "Tmin": 178.5, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1349450352189585, + "n": [ + -0.012477394872974798, + 0.06335801593363936, + -6.63276705298341, + 0.18394326954846194, + -3.751763042387315, + -1.2246958566612094 + ], + "reducing_value": 4700000.0, + "t": [ + 0.113, + 0.353, + 0.957, + 2.418, + 3.56, + 9.406 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 508.1, + "Tmax": 508.09999999999917, + "Tmin": 178.5, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019812926978735046, + "n": [ + -0.0016008456143345507, + 3.207344301426565, + -10.073384813177839, + 0.43583596844503064, + -3.5513036420695365, + -0.8398623740312517 + ], + "reducing_value": 4700000.0, + "t": [ + 0.001, + 0.884, + 0.945, + 1.521, + 3.503, + 6.996 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 508.1, + "Tmax": 508.09999999999917, + "Tmin": 178.5, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.29006434789575763, + "n": [ + 7.78253597073335, + -18.960548358570204, + 22.83032556167124, + -224.35339428090518, + 232.0353784600054, + -16.31650346262528 + ], + "reducing_value": 4699.999999999999, + "t": [ + 0.45, + 0.684, + 0.944, + 1.818, + 1.876, + 2.307 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 508.1, + "Tmax": 508.09999999999917, + "Tmin": 178.5, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7378704127629088, + "n": [ + -2.7083518485413607, + -3.1091181958405696, + -11.940789313674161, + 6086.186843505146, + -12978.535578983987, + 7630.400461122001 + ], + "reducing_value": 4699.999999999999, + "t": [ + 0.375, + 0.899, + 5.115, + 12.812, + 13.551, + 14.638 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 508.1, + "a": [ + 0.0633 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.16 + ] + } + }, + "CAS": "67-64-1", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 0.5, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Acetone", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 178.5, + "Ttriple_units": "K", + "accentric": 0.3071, + "accentric_units": "-", + "alpha0": [ + { + "a1": -9.4883659997, + "a2": 7.1422719708, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.7072, + 7.0675, + 11.012 + ], + "t": [ + 0.6101161188742373, + 6.849045463491438, + 3.101751623696123 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.90041, + -2.1267, + -0.083409, + 0.065683, + 0.00016527, + -0.039663, + 0.72085, + 0.0092318, + -0.17217, + -0.14961, + -0.076124, + -0.018166 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.05807914, + "molar_mass_units": "kg/mol", + "p_max": 700000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2.326486782, + "ptriple_units": "Pa", + "reducing_state": { + "T": 508.1, + "T_units": "K", + "p": 4700000, + "p_units": "Pa", + "rhomolar": 4699.999999999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 15722.94256896055, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.001567864714047582, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Acetone" +} \ No newline at end of file diff --git a/dev/fluids/Air.json b/dev/fluids/Air.json new file mode 100644 index 00000000..06c58e93 --- /dev/null +++ b/dev/fluids/Air.json @@ -0,0 +1,300 @@ +{ + "ALIASES": [ + "air", + "AIR" + ], + "ANCILLARIES": { + "pL": { + "T_r": 132.5306, + "Tmax": 132.53059999999968, + "Tmin": 59.75000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06102501865761223, + "n": [ + 0.003531827919765819, + -10.734886961617821, + 10.405219819890338, + -4.835531578778206, + -5.583509922169023, + 4.309143693912335 + ], + "reducing_value": 3786000.0, + "t": [ + 0.106, + 1.124, + 1.466, + 1.724, + 5.497, + 6.121 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 132.5306, + "Tmax": 132.53059999999968, + "Tmin": 59.75000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11512750952304973, + "n": [ + -0.10395756133911474, + 0.09371835837432017, + -5.4508814466401105, + -7.290108160645587, + 45.79793382740606, + -43.51381453529352 + ], + "reducing_value": 3786000.0, + "t": [ + 0.019, + 0.021, + 0.961, + 4.602, + 6.03, + 6.276 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 132.5306, + "Tmax": 132.53059999999968, + "Tmin": 59.75000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.6905558486393302, + "n": [ + 0.01192752147594885, + 3.009920365316921, + -2.664168754554584, + 11.846498652155946, + -18.66274199290547, + 35.85466989654467 + ], + "reducing_value": 11830.8, + "t": [ + 0.012, + 0.502, + 1.346, + 2.91, + 4.116, + 8.191 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 132.5306, + "Tmax": 132.53059999999968, + "Tmin": 59.75000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 25.735851251229036, + "n": [ + -1.4696693336122673, + -11.996156433282422, + 283450.26225801674, + -128632031.37071271, + 2265337310.78254, + -2182091263.8119464 + ], + "reducing_value": 11830.8, + "t": [ + 0.163, + 1.939, + 12.953, + 17.863, + 19.161, + 19.309 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "AIR.PPF", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Air", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JPCRD-2000", + "T_max": 2000, + "T_max_units": "K", + "Ttriple": 59.75, + "Ttriple_units": "K", + "accentric": 0.0816749632704, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "n": [ + 6.057194e-08, + -2.10274769e-05, + -0.000158860716, + -13.841928076, + 17.275266575, + -0.00019536342 + ], + "t": [ + -3, + -2, + -1, + 0, + 1, + 1.5 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "a": 2.490888032, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 0.791309509, + 0.212236768 + ], + "t": [ + 25.36365, + 16.90741 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + }, + { + "c": [ + 0.6666666666666666 + ], + "n": [ + -0.197938904 + ], + "t": [ + 87.31279 + ], + "type": "IdealGasHelmholtzPlanckEinstein2" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 3, + 4, + 4, + 4, + 6, + 1, + 3, + 5, + 6, + 1, + 3, + 11, + 1, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.118160747229, + 0.713116392079, + -1.61824192067, + 0.0714140178971, + -0.0865421396646, + 0.134211176704, + 0.0112626704218, + -0.0420533228842, + 0.0349008431982, + 0.000164957183186, + -0.101365037912, + -0.17381369097, + -0.0472103183731, + -0.0122523554253, + -0.146629609713, + -0.0316055879821, + 0.000233594806142, + 0.0148287891978, + -0.00938782884667 + ], + "t": [ + 0, + 0.33, + 1.01, + 0, + 0, + 0.15, + 0, + 0.2, + 0.35, + 1.35, + 1.6, + 0.8, + 0.95, + 1.25, + 3.6, + 6, + 3.25, + 3.5, + 15 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.02896546, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 2431.633659, + "ptriple_units": "Pa", + "reducing_state": { + "T": 132.6312, + "T_units": "K", + "p": 3785020, + "p_units": "Pa", + "rhomolar": 10447.7, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3.452387774956794e+100, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 3.452387774956794e+100, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Air" +} \ No newline at end of file diff --git a/dev/fluids/Ammonia.json b/dev/fluids/Ammonia.json new file mode 100644 index 00000000..76f28216 --- /dev/null +++ b/dev/fluids/Ammonia.json @@ -0,0 +1,294 @@ +{ + "ALIASES": [ + "NH3", + "ammonia", + "R717", + "AMMONIA" + ], + "ANCILLARIES": { + "pL": { + "T_r": 405.4, + "Tmax": 405.39999999999924, + "Tmin": 195.495, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05593199097324586, + "n": [ + 0.26451389481308607, + -0.7119993599850943, + -5.639513556769752, + -0.4174451206068972, + -4.182083153326861, + 2.5564697890820667 + ], + "reducing_value": 11333000.0, + "t": [ + 0.575, + 0.731, + 0.973, + 1.285, + 4.213, + 6.264 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 405.4, + "Tmax": 405.39999999999924, + "Tmin": 195.495, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05181632089212851, + "n": [ + 0.0016131703802769548, + 0.01339903644956835, + -6.4517151211338994, + -4.349105787320862, + 1.8295554336003688, + 7.011533373126273 + ], + "reducing_value": 11333000.0, + "t": [ + 0.108, + 0.435, + 0.971, + 4.023, + 4.944, + 17.494 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 405.4, + "Tmax": 405.39999999999924, + "Tmin": 195.495, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8982235822398099, + "n": [ + 0.6217530323464998, + 116.65648581323893, + -116.06575843470785, + 2.722640286484237, + -2.6080795358675433, + 18.393705416728867 + ], + "reducing_value": 13211.777154312385, + "t": [ + 0.217, + 0.713, + 0.724, + 1.557, + 3.994, + 9.339 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 405.4, + "Tmax": 405.39999999999924, + "Tmin": 195.495, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.802513430755436, + "n": [ + 1.2911157089516188, + -1.4201786958021996, + -145.4871281248165, + 140.71212306607288, + -3.147462914747211, + -0.9907144617787934 + ], + "reducing_value": 13211.777154312385, + "t": [ + 0.037, + 0.04, + 0.584, + 0.585, + 2.858, + 6.099 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 405.4, + "a": [ + 0.1028, + -0.09453 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.211, + 5.585 + ] + } + }, + "CAS": "7664-41-7", + "ENVIRONMENTAL": { + "ASHRAE34": "B2", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 3, + "Name": "Ammonia", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "TillnerRoth-DKV-1993", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 195.495, + "Ttriple_units": "K", + "accentric": 0.25601, + "accentric_units": "-", + "alpha0": [ + { + "a1": -15.81502, + "a2": 4.255726, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 11.47434, + -1.296211, + 0.5706757 + ], + "t": [ + 0.3333333333333333, + -1.5, + -1.75 + ], + "type": "IdealGasHelmholtzPower" + } + ], + "alphar": [ + { + "d": [ + 2, + 1, + 4, + 1, + 15, + 3, + 3, + 1, + 8, + 2, + 1, + 8, + 1, + 2, + 3, + 2, + 4, + 3, + 1, + 2, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3 + ], + "n": [ + 0.04554431, + 0.7238548, + 0.0122947, + -1.858814, + 2.141882e-11, + -0.0143002, + 0.3441324, + -0.2873571, + 2.352589e-05, + -0.03497111, + 0.02397852, + 0.001831117, + -0.04085375, + 0.2379275, + -0.03548972, + -0.1823729, + 0.02281556, + -0.006663444, + -0.008847486, + 0.002272635, + -0.0005588655 + ], + "t": [ + -0.5, + 0.5, + 1, + 1.5, + 3, + 0, + 3, + 4, + 4, + 5, + 3, + 5, + 6, + 8, + 8, + 10, + 10, + 5, + 7.5, + 15, + 30 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.01703026, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 6091.223108, + "ptriple_units": "Pa", + "reducing_state": { + "T": 405.4, + "T_units": "K", + "p": 11333000, + "p_units": "Pa", + "rhomolar": 13211.77715431239, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 43035.27755672421, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 3.763788357868352, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Ammonia" +} \ No newline at end of file diff --git a/dev/fluids/Argon.json b/dev/fluids/Argon.json new file mode 100644 index 00000000..9d916661 --- /dev/null +++ b/dev/fluids/Argon.json @@ -0,0 +1,386 @@ +{ + "ALIASES": [ + "argon", + "ARGON" + ], + "ANCILLARIES": { + "pL": { + "T_r": 150.687, + "Tmax": 150.68699999999976, + "Tmin": 83.80600000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.007682715770895854, + "n": [ + 1.274555697445016, + -6.537350082824229, + 2.3992572216415304, + -2.853795528373302, + -1.4260480922698553, + -1.2865724148178292 + ], + "reducing_value": 4863000.0, + "t": [ + 0.841, + 0.944, + 2.449, + 2.797, + 6.335, + 10.499 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 150.687, + "Tmax": 150.68699999999976, + "Tmin": 83.80600000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.010370375534973775, + "n": [ + -3.7897875946469353, + -7.761670779754463, + 6.653230474151353, + -1.4673830883217576, + -252994.846480377, + 188134.93356309348 + ], + "reducing_value": 4863000.0, + "t": [ + 0.965, + 1.179, + 1.256, + 4.003, + 19.767, + 19.401 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 150.687, + "Tmax": 150.68699999999976, + "Tmin": 83.80600000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.23496372624765005, + "n": [ + 0.35549443267848707, + 1.7740534055789645, + 1.6692402958603285, + -1326.972748274678, + 3248.4827767066654, + -4246.807908907579 + ], + "reducing_value": 13407.429658556124, + "t": [ + 0.272, + 0.417, + 2.551, + 7.589, + 8.392, + 10.436 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 150.687, + "Tmax": 150.68699999999976, + "Tmin": 83.80600000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.21261869573028225, + "n": [ + 1.1883246645329462, + -3.0995804610072724, + -2.5097036910932267, + 0.6796303921537137, + -21.203752823276112, + 418.9717120034111 + ], + "reducing_value": 13407.429658556124, + "t": [ + 0.29, + 0.329, + 0.839, + 2.946, + 6.496, + 11.57 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 150.687, + "a": [ + 0.037 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.25 + ] + } + }, + "CAS": "7440-37-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 0.0, + "GWP20": 0.0, + "GWP500": 0.0, + "HH": 0, + "Name": "Argon", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Tegeler-JPCRD-1999", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 83.806, + "Ttriple_units": "K", + "accentric": -0.00219, + "accentric_units": "-", + "alpha0": [ + { + "a1": 8.31666243, + "a2": -4.94651164, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 4, + 1, + 1, + 3, + 4, + 4, + 5, + 7, + 10, + 10, + 2, + 2, + 4, + 4, + 8, + 3, + 5, + 5, + 6, + 6, + 7, + 7, + 8, + 9, + 5, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 4, + 4 + ], + "n": [ + 0.088722304990011, + 0.70514805167298, + -1.682011565409, + -0.14909014431486, + -0.1202480460094, + -0.12164978798599, + 0.40035933626752, + -0.27136062699129, + 0.24211924579645, + 0.005788958318557, + -0.041097335615341, + 0.024710761541614, + -0.32181391750702, + 0.33230017695794, + 0.031019986287345, + -0.030777086002437, + 0.093891137419581, + -0.090643210682031, + -0.00045778349276654, + -8.2659729025197e-05, + 0.00013013415603147, + -0.011397840001996, + -0.024455169960535, + -0.064324067175955, + 0.058889471093674, + -0.00064933552112965, + -0.013889862158435, + 0.4048983929691, + -0.38612519594749, + -0.18817142332233, + 0.15977647596482, + 0.053985518513856, + -0.028953417958014, + -0.013025413381384, + 0.0028948696775778, + -0.0022647134304796, + 0.0017616456196368 + ], + "t": [ + 0, + 0.25, + 1, + 2.75, + 4, + 0, + 0.25, + 0.75, + 2.75, + 0, + 2, + 0.75, + 3, + 3.5, + 1, + 2, + 4, + 3, + 0, + 0.5, + 1, + 1, + 7, + 5, + 6, + 6, + 10, + 13, + 14, + 11, + 14, + 8, + 14, + 6, + 7, + 24, + 22 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 250, + 375, + 300, + 225 + ], + "d": [ + 2, + 1, + 2, + 3 + ], + "epsilon": [ + 1, + 1, + 1, + 1 + ], + "eta": [ + 20, + 20, + 20, + 20 + ], + "gamma": [ + 1.11, + 1.14, + 1.17, + 1.11 + ], + "n": [ + 0.0058552454482774, + -0.69251908270028, + 1.5315490030516, + -0.0027380447449783 + ], + "t": [ + 3, + 1, + 0, + 0 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.039948, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 68892.47708, + "ptriple_units": "Pa", + "reducing_state": { + "T": 150.687, + "T_units": "K", + "p": 4863000, + "p_units": "Pa", + "rhomolar": 13407.42965855612, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 35465.09209833706, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 101.5092253011949, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Argon" +} \ No newline at end of file diff --git a/dev/fluids/Benzene.json b/dev/fluids/Benzene.json new file mode 100644 index 00000000..5956b9c3 --- /dev/null +++ b/dev/fluids/Benzene.json @@ -0,0 +1,295 @@ +{ + "ALIASES": [ + "benzene", + "BENZENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 562.02, + "Tmax": 562.0199999999986, + "Tmin": 278.674, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.190387662483249, + "n": [ + 0.006832468458489782, + -5.691705501741792, + -0.6464756350802751, + -3.158803952927384, + -1625.563215886021, + 4615.00105958263 + ], + "reducing_value": 4894000.0, + "t": [ + 0.072, + 0.947, + 1.484, + 3.919, + 13.997, + 15.762 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 562.02, + "Tmax": 562.0199999999986, + "Tmin": 278.674, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.09096496629277251, + "n": [ + 0.005561906558935796, + -0.08662136922915314, + -6.964182734154488, + 1.1249288132278856, + -3.961859460597414, + -13.106880507410812 + ], + "reducing_value": 4894000.0, + "t": [ + 0.037, + 0.505, + 1.014, + 1.469, + 3.711, + 12.647 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 562.02, + "Tmax": 562.0199999999986, + "Tmin": 278.674, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3556749480683963, + "n": [ + 2.852587673922022, + -0.5596547795188646, + 14.872052666571532, + -66.42959110979461, + 1158.1329856052375, + -3128.774352224071 + ], + "reducing_value": 3902.0, + "t": [ + 0.407, + 0.565, + 4.029, + 5.699, + 9.989, + 12.299 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 562.02, + "Tmax": 562.0199999999986, + "Tmin": 278.674, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.31355152586733936, + "n": [ + 0.016427739193323233, + -2.618439385733185, + -2.5904375872364365, + 23.553523125085235, + -27.279655904334827, + -452.1839777043696 + ], + "reducing_value": 3902.0, + "t": [ + 0.067, + 0.387, + 0.865, + 2.692, + 2.792, + 15.611 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 562.02, + "a": [ + 0.07298, + -0.0007802, + -0.0001756 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.232, + 0.8635, + 0.3065 + ] + } + }, + "CAS": "71-43-2", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Benzene", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Thol-HTHP-2012", + "T_max": 725, + "T_max_units": "K", + "Ttriple": 278.674, + "Ttriple_units": "K", + "accentric": 0.2108369732700151, + "accentric_units": "-", + "alpha0": [ + { + "a1": -0.6740687105, + "a2": 2.5560188958, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.94645, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.36374, + 18.649, + 4.01834 + ], + "t": [ + 7.32358279064802, + 2.6885164229031, + 1.120956549588983 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.03513062, + 2.229707, + -3.100459, + -0.5763224, + 0.2504179, + -0.7049091, + -0.1393433, + 0.8319673, + -0.3310741, + -0.02793578 + ], + "t": [ + 1, + 0.3, + 0.744, + 1.174, + 0.68, + 2.5, + 3.67, + 1.26, + 2.6, + 0.95 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.867, + 1.766, + 1.824, + 297.5 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.7289, + 0.9074, + 0.7655, + 0.8711 + ], + "eta": [ + 1.032, + 1.423, + 1.071, + 14.35 + ], + "gamma": [ + 1.118, + 0.6392, + 0.6536, + 1.164 + ], + "n": [ + 0.7087408, + -0.3723906, + -0.06267414, + -0.86295 + ], + "t": [ + 1, + 2.47, + 3.35, + 0.75 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07811180000000001, + "molar_mass_units": "kg/mol", + "p_max": 500000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 4783.772578, + "ptriple_units": "Pa", + "reducing_state": { + "T": 562.02, + "T_units": "K", + "p": 4894000, + "p_units": "Pa", + "rhomolar": 3902, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11446.45205146822, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.07174574079405, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Benzene" +} \ No newline at end of file diff --git a/dev/fluids/CarbonDioxide.json b/dev/fluids/CarbonDioxide.json new file mode 100644 index 00000000..010bb997 --- /dev/null +++ b/dev/fluids/CarbonDioxide.json @@ -0,0 +1,449 @@ +{ + "ALIASES": [ + "R744", + "co2", + "CO2", + "carbondioxide", + "CARBONDIOXIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 304.1282, + "Tmax": 304.1281999999994, + "Tmin": 216.592, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0010595686337877552, + "n": [ + -5.867399337600407, + -7.10969550015274, + 11.022781986239263, + 4.8260764050219995, + -6.240803382557819, + -6.7009642572439 + ], + "reducing_value": 7377300.0, + "t": [ + 0.983, + 1.322, + 1.488, + 2.807, + 3.571, + 1.941 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 304.1282, + "Tmax": 304.1281999999994, + "Tmin": 216.592, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0017511543346171443, + "n": [ + -0.9288172663602211, + -16.600500683315147, + 11.947155561272234, + -0.6596029509652107, + -2.3639949455719274, + -3.6534929025030847 + ], + "reducing_value": 7377300.0, + "t": [ + 0.917, + 1.078, + 1.146, + 1.669, + 3.238, + 6.0 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 304.1282, + "Tmax": 304.1281999999994, + "Tmin": 216.592, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.044231974273145624, + "n": [ + 0.861951794789174, + 5.535795098719573, + -21.766373764605415, + 20.01416999278327, + -2.2218647220786862, + 888.2387848519858 + ], + "reducing_value": 10624.906299999999, + "t": [ + 0.264, + 0.672, + 0.986, + 1.092, + 1.714, + 9.902 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 304.1282, + "Tmax": 304.1281999999994, + "Tmin": 216.592, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.035329219540658485, + "n": [ + -1.1635587811569494, + -3.64216164754343, + 2.7773118075713237, + -3.2573848494624533, + -1.9739104682508852, + -16.057319994659142 + ], + "reducing_value": 10624.906299999999, + "t": [ + 0.306, + 0.569, + 0.677, + 0.891, + 3.206, + 6.093 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 304.128, + "a": [ + 0.07863 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.254 + ] + } + }, + "CAS": "124-38-9", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 1.0, + "GWP20": 1.0, + "GWP500": 1.0, + "HH": 1, + "Name": "CarbonDioxide", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Span-JPCRD-1996", + "T_max": 1100, + "T_max_units": "K", + "Ttriple": 216.592, + "Ttriple_units": "K", + "accentric": 0.22394, + "accentric_units": "-", + "alpha0": [ + { + "a1": 8.37304456, + "a2": -3.70454304, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.99427042, + 0.62105248, + 0.41195293, + 1.04028922, + 0.08327678 + ], + "t": [ + 3.15163, + 6.1119, + 6.77708, + 11.32384, + 27.08792 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + }, + { + "a1": -14.49798188289838, + "a2": 8.820179669088471, + "type": "IdealGasEnthalpyEntropyOffset" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 1, + 2, + 4, + 5, + 5, + 5, + 6, + 6, + 6, + 1, + 1, + 4, + 4, + 4, + 7, + 8, + 2, + 3, + 3, + 5, + 5, + 6, + 7, + 8, + 10, + 4, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 5, + 6 + ], + "n": [ + 0.388568232032, + 2.93854759427, + -5.5867188535, + -0.767531995925, + 0.317290055804, + 0.548033158978, + 0.122794112203, + 2.16589615432, + 1.58417351097, + -0.231327054055, + 0.0581169164314, + -0.553691372054, + 0.489466159094, + -0.0242757398435, + 0.0624947905017, + -0.121758602252, + -0.370556852701, + -0.0167758797004, + -0.11960736638, + -0.0456193625088, + 0.0356127892703, + -0.00744277271321, + -0.00173957049024, + -0.0218101212895, + 0.0243321665592, + -0.0374401334235, + 0.143387157569, + -0.134919690833, + -0.0231512250535, + 0.0123631254929, + 0.00210583219729, + -0.000339585190264, + 0.00559936517716, + -0.000303351180556 + ], + "t": [ + 0, + 0.75, + 1, + 2, + 0.75, + 2, + 0.75, + 1.5, + 1.5, + 2.5, + 0, + 1.5, + 2, + 0, + 1, + 2, + 3, + 6, + 3, + 6, + 8, + 6, + 0, + 7, + 12, + 16, + 22, + 24, + 16, + 24, + 8, + 2, + 28, + 14 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 325, + 300, + 300, + 275, + 275 + ], + "d": [ + 2, + 2, + 2, + 3, + 3 + ], + "epsilon": [ + 1, + 1, + 1, + 1, + 1 + ], + "eta": [ + 25, + 25, + 25, + 15, + 20 + ], + "gamma": [ + 1.16, + 1.19, + 1.19, + 1.25, + 1.22 + ], + "n": [ + -213.654886883, + 26641.5691493, + -24027.2122046, + -283.41603424, + 212.472844002 + ], + "t": [ + 1, + 0, + 1, + 3, + 3 + ], + "type": "ResidualHelmholtzGaussian" + }, + { + "A": [ + 0.7, + 0.7, + 0.7 + ], + "B": [ + 0.3, + 0.3, + 1 + ], + "C": [ + 10, + 10, + 12.5 + ], + "D": [ + 275, + 275, + 275 + ], + "a": [ + 3.5, + 3.5, + 3 + ], + "b": [ + 0.875, + 0.925, + 0.875 + ], + "beta": [ + 0.3, + 0.3, + 0.3 + ], + "n": [ + -0.666422765408, + 0.726086323499, + 0.0550686686128 + ], + "type": "ResidualHelmholtzNonAnalytic" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0440098, + "molar_mass_units": "kg/mol", + "p_max": 800000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 517964.3433, + "ptriple_units": "Pa", + "reducing_state": { + "T": 304.1282, + "T_units": "K", + "p": 7377300, + "p_units": "Pa", + "rhomolar": 10624.9063, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 26777.19637087835, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 312.6907221828656, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "CarbonDioxide" +} \ No newline at end of file diff --git a/dev/fluids/CarbonMonoxide.json b/dev/fluids/CarbonMonoxide.json new file mode 100644 index 00000000..0ea24b39 --- /dev/null +++ b/dev/fluids/CarbonMonoxide.json @@ -0,0 +1,259 @@ +{ + "ALIASES": [ + "CO", + "CARBONMONOXIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 132.86, + "Tmax": 132.8599999999997, + "Tmin": 68.16000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.09261479225521896, + "n": [ + 0.00487539162619761, + -5.3196847481956775, + -0.24436526839538752, + -33.95291146838296, + 18449.37715414218, + -26736.728013355834 + ], + "reducing_value": 3494000.0, + "t": [ + 0.085, + 0.962, + 1.957, + 7.807, + 14.554, + 15.246 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 132.86, + "Tmax": 132.8599999999997, + "Tmin": 68.16000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0655505132825307, + "n": [ + 0.0031655594711161982, + -5.386279334978247, + -0.44089436177701297, + 1.5403401817486662, + -5.692323589833758, + 3.03081959067228 + ], + "reducing_value": 3494000.0, + "t": [ + 0.052, + 0.968, + 1.972, + 2.761, + 4.199, + 5.126 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 132.86, + "Tmax": 132.8599999999997, + "Tmin": 68.16000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.35662556345594787, + "n": [ + 3.973336124071812, + -3.262687458485425, + 3.3499432070659303, + -42.129174166388935, + 56.52859432308481, + -110.70022756120696 + ], + "reducing_value": 10850.0, + "t": [ + 0.44, + 0.672, + 1.334, + 3.874, + 4.413, + 9.257 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 132.86, + "Tmax": 132.8599999999997, + "Tmin": 68.16000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.253613973167921, + "n": [ + -3.6459289142239206, + 1.5167962228564473, + -114.10174052209382, + 292.7876490687851, + -183.6056308954516, + 4746.634272544051 + ], + "reducing_value": 10850.0, + "t": [ + 0.444, + 0.75, + 1.847, + 2.04, + 2.169, + 19.966 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 132.86, + "a": [ + 0.02843 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.148 + ] + } + }, + "CAS": "630-08-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "CarbonMonoxide", + "ODP": -1.0, + "PH": 3 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 68.16, + "Ttriple_units": "K", + "accentric": 0.0497, + "accentric_units": "-", + "alpha0": [ + { + "a1": -3.3728318564, + "a2": 3.3683460039, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -9.111274701235156e-05 + ], + "t": [ + -1.5 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 1.0128 + ], + "t": [ + 23.25003763359927 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.90554, + -2.4515, + 0.53149, + 0.024173, + 0.072156, + 0.00018818, + 0.19405, + -0.043268, + -0.12778, + -0.027896, + -0.034154, + 0.016329 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0280101, + "molar_mass_units": "kg/mol", + "p_max": 100000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 15536.87666, + "ptriple_units": "Pa", + "reducing_state": { + "T": 132.86, + "T_units": "K", + "p": 3494000, + "p_units": "Pa", + "rhomolar": 10850, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 30329.56214318188, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 27.71177905101628, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "CarbonMonoxide" +} \ No newline at end of file diff --git a/dev/fluids/CarbonylSulfide.json b/dev/fluids/CarbonylSulfide.json new file mode 100644 index 00000000..ef1c8209 --- /dev/null +++ b/dev/fluids/CarbonylSulfide.json @@ -0,0 +1,256 @@ +{ + "ALIASES": [ + "COS", + "CARBONYLSULFIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 378.77, + "Tmax": 378.769999999999, + "Tmin": 134.3, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019317469106150398, + "n": [ + -5.898980404479669, + 1.4411942572733878, + -46.792325277477346, + 56.09470221996165, + -13.259873589238543, + -0.851491340049802 + ], + "reducing_value": 6370000.0, + "t": [ + 0.98, + 1.966, + 3.287, + 3.429, + 4.051, + 18.959 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 378.77, + "Tmax": 378.769999999999, + "Tmin": 134.3, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.042743464291516986, + "n": [ + -11.161617133348066, + 7.10392197545503, + -2.0123784114786365, + -8.915798275517139, + 13.747559787232735, + -11.14583161926877 + ], + "reducing_value": 6370000.0, + "t": [ + 1.05, + 1.227, + 1.785, + 6.353, + 8.207, + 11.103 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 378.77, + "Tmax": 378.769999999999, + "Tmin": 134.3, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07015256842908268, + "n": [ + -0.006565517887508687, + 9.861398057771247, + -49.28678353119856, + 50.765489904412995, + -18.836456981431365, + 10.180262280869785 + ], + "reducing_value": 7410.0, + "t": [ + 0.187, + 0.539, + 0.811, + 0.921, + 1.495, + 1.774 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 378.77, + "Tmax": 378.769999999999, + "Tmin": 134.3, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.33766247305977437, + "n": [ + 1.776086114558269, + -28.20299757513764, + 43.7268964289033, + -22.918757269308017, + 2.3656558943753296, + -4.806350485891986 + ], + "reducing_value": 7410.0, + "t": [ + 0.376, + 0.531, + 0.641, + 0.783, + 2.208, + 3.625 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 378.77, + "a": [ + 0.07246 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.407 + ] + } + }, + "CAS": "463-58-1", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": 27.0, + "GWP20": 97.0, + "GWP500": -1.0, + "HH": 3, + "Name": "CarbonylSulfide", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 650, + "T_max_units": "K", + "Ttriple": 134.3, + "Ttriple_units": "K", + "accentric": 0.0978, + "accentric_units": "-", + "alpha0": [ + { + "a1": -3.6587449805, + "a2": 3.7349245016, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.1651, + 0.93456, + 1.0623, + 0.34269 + ], + "t": [ + 2.027615703461204, + 3.59848984872086, + 8.382395649074637, + 33.87015867148929 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.94374, + -2.5348, + 0.59058, + -0.021488, + 0.082083, + 0.00024689, + 0.21226, + -0.041251, + -0.22333, + -0.050828, + -0.028333, + 0.016983 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0600751, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 64.43457747, + "ptriple_units": "Pa", + "reducing_state": { + "T": 378.77, + "T_units": "K", + "p": 6370000, + "p_units": "Pa", + "rhomolar": 7410, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 22517.88586815158, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.05771851535442867, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "CarbonylSulfide" +} \ No newline at end of file diff --git a/dev/fluids/CycloHexane.json b/dev/fluids/CycloHexane.json new file mode 100644 index 00000000..e6b8f72d --- /dev/null +++ b/dev/fluids/CycloHexane.json @@ -0,0 +1,335 @@ +{ + "ALIASES": [ + "Cyclohexane", + "CYCLOHEXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 553.6, + "Tmax": 553.5999999999988, + "Tmin": 279.47, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.023505661058897953, + "n": [ + -0.001507316116386758, + 0.0019454414399892835, + -6.247176974611268, + 0.47954202162953397, + -3.680367872644098, + -5.145901784236558 + ], + "reducing_value": 4082400.0, + "t": [ + 0.031, + 0.087, + 0.976, + 2.262, + 3.53, + 9.757 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 553.6, + "Tmax": 553.5999999999988, + "Tmin": 279.47, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04595549569808011, + "n": [ + -5.5748872145795225, + -21.018813932704997, + 21.45503312552939, + -7.489484892044892, + 11.013982397883915, + -10.70278385936846 + ], + "reducing_value": 4082400.0, + "t": [ + 0.957, + 1.635, + 1.682, + 3.513, + 4.809, + 5.858 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 553.6, + "Tmax": 553.5999999999988, + "Tmin": 279.47, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11107314879914565, + "n": [ + 0.2729676351917065, + -1.106482113619369, + 27.748806842659924, + -34.01756141062687, + 9.815362300266182, + 65.7039717441813 + ], + "reducing_value": 3224.0, + "t": [ + 0.165, + 0.243, + 0.498, + 0.564, + 0.717, + 12.621 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 553.6, + "Tmax": 553.5999999999988, + "Tmin": 279.47, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2794645466547063, + "n": [ + 7.91278554789447, + -14.912016731516744, + 5.351652597227101, + -3.875832207589477, + -6.953692859831638, + 3685.8600260352014 + ], + "reducing_value": 3224.0, + "t": [ + 0.395, + 0.432, + 0.604, + 0.994, + 4.823, + 18.36 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 553.64, + "a": [ + 0.06485 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.263 + ] + } + }, + "CAS": "110-82-7", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "CycloHexane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-PREPRINT-2014", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 279.47, + "Ttriple_units": "K", + "accentric": 0.20926, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0.991141, + "a2": 1.63455, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 0.83775, + 16.036, + 24.636, + 7.1715 + ], + "t": [ + 1.396315028901734, + 1.69978323699422, + 3.946893063583815, + 8.11958092485549 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0548405, + 1.60777, + -2.376, + -0.51375, + 0.18584, + -0.90075, + -0.5629, + 0.2903, + -0.3279, + -0.03178 + ], + "t": [ + 1, + 0.37, + 0.79, + 1.075, + 0.37, + 2.4, + 2.5, + 0.5, + 3, + 1.06 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.38, + 4.2, + 1.2, + 0.9, + 1.2, + 2.6, + 5.3, + 4.4, + 4.2, + 25 + ], + "d": [ + 1, + 1, + 3, + 3, + 2, + 2, + 3, + 2, + 3, + 2 + ], + "epsilon": [ + 0.73, + 0.75, + 0.48, + 2.32, + 0.2, + 1.33, + 0.68, + 1.11, + 1.47, + 0.99 + ], + "eta": [ + 0.99, + 1.43, + 0.97, + 1.93, + 0.92, + 1.27, + 0.87, + 0.82, + 1.4, + 3 + ], + "gamma": [ + 0.65, + 0.63, + 1.14, + 0.09, + 0.56, + 0.4, + 1.01, + 0.45, + 0.85, + 0.86 + ], + "n": [ + 0.8669, + -0.1963, + -0.1426, + 0.004198, + 0.1777, + -0.04434, + -0.03861, + 0.074, + 0.02036, + 0.0027278 + ], + "t": [ + 1.6, + 0.37, + 1.33, + 2.5, + 0.9, + 0.5, + 0.73, + 0.2, + 1.5, + 1.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.3144621, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.08415948000000001, + "molar_mass_units": "kg/mol", + "p_max": 250000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 5240.240247, + "ptriple_units": "Pa", + "reducing_state": { + "T": 553.6, + "T_units": "K", + "p": 4082400, + "p_units": "Pa", + "rhomolar": 3224, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9403.351008678657, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.264642210488062, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "CycloHexane" +} \ No newline at end of file diff --git a/dev/fluids/CycloPropane.json b/dev/fluids/CycloPropane.json new file mode 100644 index 00000000..f0cdc83e --- /dev/null +++ b/dev/fluids/CycloPropane.json @@ -0,0 +1,290 @@ +{ + "ALIASES": [ + "cyclopropane", + "Cyclopropane", + "CYCLOPROPANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 398.3, + "Tmax": 398.29999999999905, + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1955382615515866, + "n": [ + -0.3126990224115789, + -6.287859890805818, + 6.987582031173733, + -1037.2571651529406, + 45989.92002915465, + -4973989.497831943 + ], + "reducing_value": 5579700.0, + "t": [ + 0.596, + 1.059, + 2.997, + 6.895, + 10.211, + 15.224 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 398.3, + "Tmax": 398.29999999999905, + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.10977489544659047, + "n": [ + -0.11955219361137283, + 0.18406121015183027, + -0.13653132075738866, + -5.797505519116896, + -20.62240936494475, + -324540.4065607637 + ], + "reducing_value": 5579700.0, + "t": [ + 0.135, + 0.181, + 0.421, + 0.983, + 6.3, + 16.644 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 398.3, + "Tmax": 398.29999999999905, + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.0200689433471744, + "n": [ + 0.36728670919821876, + 17.39312205196081, + -65.70893634663562, + 917.3256648476147, + -909.8353253919709, + 1550.3280904976405 + ], + "reducing_value": 6142.9149, + "t": [ + 0.109, + 0.951, + 1.509, + 2.43, + 2.535, + 7.779 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 398.3, + "Tmax": 398.29999999999905, + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.9812724524870484, + "n": [ + -0.33841331698570076, + -4.9703350919635545, + 5.62081036731097, + -352.4354033337558, + 14193580833.179937, + -19206776520.109684 + ], + "reducing_value": 6142.9149, + "t": [ + 0.098, + 0.654, + 2.255, + 5.732, + 18.195, + 18.473 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "75-19-4", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "CycloPropane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Polt-CT-1992", + "BibTeX_EOS": "Polt-CT-1992", + "T_max": 473, + "T_max_units": "K", + "Ttriple": 145.7, + "Ttriple_units": "K", + "accentric": 0.1305495663687517, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 398.3, + "c": [ + 6.378038040672545, + -0.04582023302189515, + 0.0002558503477107775, + -3.908517142596848e-07, + 2.051746651955177e-10 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0, + 2, + 2, + 2, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -1.15634007067133, + 2.52574627508968, + -2.82266128097357, + 0.283576801605235, + -0.0842720496332253, + 0.931088565988454, + -1.0529683988751, + 0.432021581602768, + -0.251108864340636, + 0.127725892482498, + 0.0483622335785703, + -0.0116474078333994, + 0.00033400656553506, + -1.37016097592368, + 2.12444673007915, + -0.578908942731662, + 0.304945770506538, + -0.184276165170077, + -0.292111460404481, + 1.37016097592368, + -2.12444673007915, + 0.578908942731662 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.3143, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.042081, + "molar_mass_units": "kg/mol", + "p_max": 28000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 342702.2037, + "ptriple_units": "Pa", + "reducing_state": { + "T": 398.3, + "T_units": "K", + "p": 5579700, + "p_units": "Pa", + "rhomolar": 6142.9149, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2.376369382856871e+100, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.376369382856871e+100, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "CycloPropane" +} \ No newline at end of file diff --git a/dev/fluids/Cyclopentane.json b/dev/fluids/Cyclopentane.json new file mode 100644 index 00000000..a9f0bf43 --- /dev/null +++ b/dev/fluids/Cyclopentane.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [ + "CycloPentane", + "cyclopentane", + "CYCLOPENTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 511.72, + "Tmax": 511.719999999999, + "Tmin": 179.7, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06993962946545418, + "n": [ + 0.005640145137827244, + -8.049357440969791, + 2.4664748335340834, + -1.3407752278951093, + -1.6536650781763431, + -1.270585253317597 + ], + "reducing_value": 4571200.0, + "t": [ + 0.388, + 1.011, + 1.309, + 2.935, + 3.423, + 6.579 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 511.72, + "Tmax": 511.719999999999, + "Tmin": 179.7, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028737273286005838, + "n": [ + -9.601889908950373, + 3.974125106492668, + 2.6925579604302676, + -4.621940458120144, + -5.157782358169021, + 3.340182642033233 + ], + "reducing_value": 4571200.0, + "t": [ + 1.041, + 1.3, + 1.87, + 2.257, + 5.99, + 6.955 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 511.72, + "Tmax": 511.719999999999, + "Tmin": 179.7, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.30360463662223447, + "n": [ + 4.175321169438228, + -3.3972763608243954, + 3.265444750596592, + -14.140653461920774, + 419.1357335784064, + -484.6437448434436 + ], + "reducing_value": 3820.0000000000005, + "t": [ + 0.545, + 1.142, + 2.232, + 6.456, + 11.186, + 11.952 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 511.72, + "Tmax": 511.719999999999, + "Tmin": 179.7, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.94766458281903, + "n": [ + -5.935725453092267, + 1.591120947182766, + -8.958815994240467, + 198.61227335356796, + -245.69777423593865, + 469.5550522878147 + ], + "reducing_value": 3820.0000000000005, + "t": [ + 0.602, + 1.076, + 3.895, + 8.292, + 8.939, + 18.105 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "287-92-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Cyclopentane", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Gedanitz-PREPRINT-2013", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 179.7, + "Ttriple_units": "K", + "accentric": 0.201112573380599, + "accentric_units": "-", + "alpha0": [ + { + "a1": 3.2489131288, + "a2": 2.6444166315, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 0.96, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.34, + 18.6, + 13.9, + 4.86 + ], + "t": [ + 0.2345032439615415, + 2.540451809583366, + 5.276322989134683, + 10.35722660830141 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0536938, + 1.60394, + -2.41244, + -0.474009, + 0.203482, + -0.965616, + -0.344543, + 0.353975, + -0.231373, + -0.0379099 + ], + "t": [ + 1, + 0.29, + 0.8, + 1.14, + 0.5, + 2, + 1.5, + 1, + 3.36, + 0.95 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.15, + 1.61, + 0.66, + 2.72 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.68, + 0.97, + 0.84, + 0.66 + ], + "eta": [ + 0.82, + 1.19, + 0.79, + 1.52 + ], + "gamma": [ + 1.08, + 0.36, + 0.09, + 1.48 + ], + "n": [ + 0.867586, + -0.381827, + -0.108741, + -0.0976984 + ], + "t": [ + 1, + 2.5, + 2.5, + 1.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07013290000000001, + "molar_mass_units": "kg/mol", + "p_max": 250000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 8.854271418, + "ptriple_units": "Pa", + "reducing_state": { + "T": 511.72, + "T_units": "K", + "p": 4571200, + "p_units": "Pa", + "rhomolar": 3820.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12107.59623891635, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.00592693841039708, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Cyclopentane" +} \ No newline at end of file diff --git a/dev/fluids/D4.json b/dev/fluids/D4.json new file mode 100644 index 00000000..87fd7d2e --- /dev/null +++ b/dev/fluids/D4.json @@ -0,0 +1,251 @@ +{ + "ALIASES": [ + "Octamethylcyclotetrasiloxane", + "OCTAMETHYLCYCLOTETRASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 586.5, + "Tmax": 586.4999999999989, + "Tmin": 290.25, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028925946608671094, + "n": [ + 0.39146787698576685, + -22.07223693358694, + 15.421699054361437, + -4.2709891047524335, + -7.542128557150028, + 140.7032008919629 + ], + "reducing_value": 1332000.0, + "t": [ + 0.893, + 1.059, + 1.151, + 2.074, + 4.392, + 16.257 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 586.5, + "Tmax": 586.4999999999989, + "Tmin": 290.25, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028925946446056727, + "n": [ + 90.36983662049464, + -97.70779785443601, + -3.62818153879477, + -6.09127598868665, + -26.32182480105557, + 153.97714284240485 + ], + "reducing_value": 1332000.0, + "t": [ + 0.87, + 0.876, + 2.397, + 4.259, + 10.207, + 13.645 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 586.5, + "Tmax": 586.4999999999989, + "Tmin": 290.25, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 13.286210237431817, + "n": [ + 1.1098694118456651, + 3.8256536703025574, + -7151.436323591654, + 41771953.36308636, + -74286753.6277466, + 67304077.15677227 + ], + "reducing_value": 1030.928, + "t": [ + 0.156, + 1.24, + 9.435, + 16.41, + 17.017, + 19.509 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 586.5, + "Tmax": 586.4999999999989, + "Tmin": 290.25, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 9.473643686906497, + "n": [ + 1.4882997310050823, + -4.34717643630862, + -14.118092236565857, + 25.086940017821192, + -5022.733213778868, + 93552.36171295607 + ], + "reducing_value": 1030.928, + "t": [ + 0.114, + 0.23, + 1.834, + 3.647, + 11.227, + 16.17 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "556-67-2", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D4", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2006", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 290.25, + "Ttriple_units": "K", + "accentric": 0.592, + "accentric_units": "-", + "alpha0": [ + { + "a1": 29.18574340067077, + "a2": -14.02099419676275, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 448.503917912145, + "Tc": 586.49127187, + "cp_over_R": -2.19568963609475, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 448.503917912145, + "Tc": 586.49127187, + "c": [ + 0.171652511428266, + -0.000119093551580906, + 3.60816657991031e-08 + ], + "t": [ + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.05392408, + -2.22981918, + 0.77573923, + -0.6937405, + 0.18721557, + 0.0004219333, + 0.70301835, + 0.047851888, + -0.8025348, + -0.18968872, + -0.022211781, + 0.0060103354 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.29661576, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 69.60923767, + "ptriple_units": "Pa", + "reducing_state": { + "T": 586.49127187, + "T_units": "K", + "p": 1332000, + "p_units": "Pa", + "rhomolar": 1035.122310000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3200.441443603881, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.02885594486307443, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "D4" +} \ No newline at end of file diff --git a/dev/fluids/D5.json b/dev/fluids/D5.json new file mode 100644 index 00000000..bdc96ce4 --- /dev/null +++ b/dev/fluids/D5.json @@ -0,0 +1,251 @@ +{ + "ALIASES": [ + "Decamethylcyclopentasiloxane", + "DECAMETHYLCYCLOPENTASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 619.15, + "Tmax": 619.149999999999, + "Tmin": 300.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03414808081968479, + "n": [ + -0.3938728785243184, + 1.0478083900910067, + -13.205862056465833, + 5.276152301686711, + -2.8042195945425252, + -6.355855261869247 + ], + "reducing_value": 1160000.0, + "t": [ + 0.699, + 0.709, + 0.956, + 1.042, + 2.171, + 3.725 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 619.15, + "Tmax": 619.149999999999, + "Tmin": 300.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01988979976886851, + "n": [ + -99.31553985100548, + 92.69356966220938, + -97.33632140307553, + 97.2872457256767, + -19.31326240008969, + 11.743973719224405 + ], + "reducing_value": 1160000.0, + "t": [ + 1.093, + 1.112, + 2.872, + 2.949, + 4.663, + 6.008 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 619.15, + "Tmax": 619.149999999999, + "Tmin": 300.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.8377648332722725, + "n": [ + 2.997850977428544, + -1.040443103596906, + 10.837940806333448, + -6631.038116112454, + 17457.941767023673, + -655905.0314011696 + ], + "reducing_value": 822.3684, + "t": [ + 0.372, + 0.611, + 3.245, + 9.872, + 11.268, + 19.932 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 619.15, + "Tmax": 619.149999999999, + "Tmin": 300.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.050789233289431, + "n": [ + -0.20715610476248955, + -587.5930484443458, + 903.2358019703372, + -328.35177101579325, + 2.7341269166587985, + -8600.632720165853 + ], + "reducing_value": 822.3684, + "t": [ + 0.036, + 1.095, + 1.159, + 1.288, + 5.733, + 17.47 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "541-02-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D5", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2006", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 226, + "Ttriple_units": "K", + "accentric": 0.658, + "accentric_units": "-", + "alpha0": [ + { + "a1": -7.87509994783932, + "a2": 8.32698146948877, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 484.050286854327, + "Tc": 619.23462341, + "cp_over_R": -4.19725991019033, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 484.050286854327, + "Tc": 619.23462341, + "c": [ + 0.223886736283434, + -0.000168790032608204, + 6.01361096651718e-08 + ], + "t": [ + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.40844725, + -2.29248044, + 0.42851607, + -0.73506382, + 0.16103808, + 0.00029643278, + 0.82412481, + 0.15214274, + -0.6849589, + -0.055703624, + 0.013055391, + -0.031853761 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.3707697, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 27.51166528, + "ptriple_units": "Pa", + "reducing_state": { + "T": 619.23462341, + "T_units": "K", + "p": 1161460, + "p_units": "Pa", + "rhomolar": 789.0902699999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2.69709202235242e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.69709202235242e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "D5" +} \ No newline at end of file diff --git a/dev/fluids/D6.json b/dev/fluids/D6.json new file mode 100644 index 00000000..7e43948e --- /dev/null +++ b/dev/fluids/D6.json @@ -0,0 +1,242 @@ +{ + "ALIASES": [ + "Dodecamethylcyclohexasiloxane", + "DODECAMETHYLCYCLOHEXASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 645.78, + "Tmax": 645.7799999999984, + "Tmin": 270.2, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.030659882111727654, + "n": [ + 0.0009840543696606977, + -41.57124463279652, + 33.17839559625214, + -221.16595834771732, + 368.2016194959781, + -159.62000149415917 + ], + "reducing_value": 961000.0, + "t": [ + 0.023, + 1.048, + 1.073, + 4.527, + 4.823, + 5.211 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 645.78, + "Tmax": 645.7799999999984, + "Tmin": 270.2, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07602253271106196, + "n": [ + 34.45481648119546, + -38.67596233295787, + -4.227731274421991, + -10.622093383403744, + 24.71517002775392, + -31.424451637388774 + ], + "reducing_value": 961000.0, + "t": [ + 0.775, + 0.787, + 1.042, + 3.536, + 8.175, + 8.915 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 645.78, + "Tmax": 645.7799999999984, + "Tmin": 270.2, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.211610708692202, + "n": [ + 41.50050216018366, + -198.81152403352948, + 161.74986511225353, + -2.8794147964708507, + 15327.689037983815, + -19023.670087608214 + ], + "reducing_value": 627.2885477999996, + "t": [ + 0.59, + 0.719, + 0.755, + 3.132, + 14.519, + 14.971 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 645.78, + "Tmax": 645.7799999999984, + "Tmin": 270.2, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.8375465327178273, + "n": [ + -15.776270974992267, + 13.699167960267655, + -7.138110844583917, + -2782.2625154428233, + 5504.275783042545, + -5468.11384054501 + ], + "reducing_value": 627.2885477999996, + "t": [ + 0.522, + 0.588, + 1.175, + 9.309, + 10.264, + 13.23 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "540-97-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "D6", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2008", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 270.2, + "Ttriple_units": "K", + "accentric": 0.736, + "accentric_units": "-", + "alpha0": [ + { + "a1": -7.938561730464921, + "a2": 8.452340963237452, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 518.109977174843, + "Tc": 645.78, + "c": [ + 56.37158920013201, + 118.0111016069331, + 1792.1, + 82.5909330141469, + 786.8 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.69156186, + -3.37962568, + 0.38609039, + 0.064598995, + 0.10589012, + 4.5456825e-05, + 0.74169279, + -0.088102648, + -0.17373336, + -0.10951368, + -0.062695695, + 0.037459986 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.444924, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.1597530382, + "ptriple_units": "Pa", + "reducing_state": { + "T": 645.78, + "T_units": "K", + "p": 961000, + "p_units": "Pa", + "rhomolar": 627.2885477999996, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2245.073821584233, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 7.111827573678096e-05, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "D6" +} \ No newline at end of file diff --git a/dev/fluids/Deuterium.json b/dev/fluids/Deuterium.json new file mode 100644 index 00000000..03c155b3 --- /dev/null +++ b/dev/fluids/Deuterium.json @@ -0,0 +1,347 @@ +{ + "ALIASES": [ + "deuterium", + "DEUTERIUM", + "D2" + ], + "ANCILLARIES": { + "pL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.005537849329229072, + "n": [ + 4.632619255906051, + -8.969455942164178, + 0.5664073789158284, + -0.09981074464874193, + -0.3596187124547404, + -0.23569604663548424 + ], + "reducing_value": 1679600.0, + "t": [ + 0.765, + 0.849, + 2.072, + 0.484, + 6.894, + 14.564 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006717131880518146, + "n": [ + -6.8424011367748685, + 21.870806001345017, + -19.797819519619072, + 0.8706987240797549, + -186.1498120750357, + 825.2792959297736 + ], + "reducing_value": 1679600.0, + "t": [ + 1.026, + 1.438, + 1.474, + 1.966, + 15.756, + 18.491 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.17429991279744872, + "n": [ + -3.7327374059367657, + 5.717877520193506, + -7.7160148356330875, + 8.271326329456837, + -3.540310397292104, + 6126.25395082707 + ], + "reducing_value": 17230.0, + "t": [ + 0.281, + 0.319, + 1.913, + 1.992, + 6.17, + 19.493 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0174186911302332, + "n": [ + -0.10109803867705139, + -4.563691481638655, + 3.3301365272696226, + -4.503537024711251, + 3.823445254078357, + -2.0240887330256525 + ], + "reducing_value": 17230.0, + "t": [ + 0.266, + 0.576, + 1.105, + 1.725, + 2.526, + 3.959 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 38.34, + "a": [ + 0.009376 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.258 + ] + } + }, + "CAS": "7782-39-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 0.0, + "GWP20": 0.0, + "GWP500": 0.0, + "HH": -1, + "Name": "Deuterium", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Richardson-JPCRD-2013", + "T_max": 600, + "T_max_units": "K", + "Ttriple": 18.724, + "Ttriple_units": "K", + "accentric": -0.136290274128, + "accentric_units": "-", + "alpha0": [ + { + "a1": -2.0677351753, + "a2": 2.4237151502, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -3.54145, + 3.0326, + -3.52422, + -1.73421, + -3.57135, + 2.14858, + 6.23107, + -3.30425, + 6.23098, + -3.57137, + 3.32901, + 0.97782 + ], + "t": [ + 187.1178925404277, + 225.2217005738132, + 23.54460093896714, + 4.723526343244653, + 11.43714136671883, + 131.3041210224309, + 7.039645279081897, + 5.996348461137194, + 17.38132498695879, + 11.81011997913406, + 5.007824726134585, + 30.97548252477829 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 2, + 1, + 1, + 3, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2 + ], + "n": [ + 0.006267958, + 10.53609, + -10.14149, + 0.356061, + 0.1824472, + -1.129638, + -0.0549812, + -0.6791329, + 1.347918, + -0.8657582, + 1.719146, + -1.917977, + 0.1233365, + -0.07936891 + ], + "t": [ + 1, + 0.462, + 0.5584, + 0.627, + 1.201, + 0.309, + 1.314, + 1.1166, + 1.25, + 1.25, + 1.395, + 1.627, + 1, + 2.5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.613, + 0.584, + 0.57, + 1.056, + 1.01, + 1.025, + 1.029 + ], + "d": [ + 1, + 1, + 2, + 3, + 3, + 1, + 3 + ], + "epsilon": [ + 1.46, + 1.7864, + 1.647, + 0.541, + 0.969, + 1.892, + 1.076 + ], + "eta": [ + 0.868, + 0.636, + 0.668, + 0.65, + 0.745, + 0.782, + 0.693 + ], + "gamma": [ + 0.6306, + 0.711, + 0.6446, + 0.8226, + 0.992, + 1.2184, + 1.203 + ], + "n": [ + 1.686617, + -4.240326, + 1.857114, + -0.5903705, + 1.520171, + 2.361373, + -2.297315 + ], + "t": [ + 0.635, + 0.664, + 0.7082, + 2.25, + 1.524, + 0.67, + 0.709 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.3144621, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0040282, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 17189.10197, + "ptriple_units": "Pa", + "reducing_state": { + "T": 38.34, + "T_units": "K", + "p": 1679600, + "p_units": "Pa", + "rhomolar": 17230, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 43350.35393172985, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 113.0018950964478, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Deuterium" +} \ No newline at end of file diff --git a/dev/fluids/DimethylCarbonate.json b/dev/fluids/DimethylCarbonate.json new file mode 100644 index 00000000..97c88706 --- /dev/null +++ b/dev/fluids/DimethylCarbonate.json @@ -0,0 +1,305 @@ +{ + "ALIASES": [ + "DMC", + "dimethylcarbonate", + "DIMETHYLCARBONATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 557.0, + "Tmax": 556.9999999999989, + "Tmin": 277.06, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11227216504992032, + "n": [ + -6.837266302374972, + 114.75387978395011, + -473.58556402509805, + 418.1739993231517, + -559.7253413542608, + 925.8612544918711 + ], + "reducing_value": 4908800.0, + "t": [ + 0.964, + 4.159, + 4.654, + 5.049, + 9.147, + 11.03 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 557.0, + "Tmax": 556.9999999999989, + "Tmin": 277.06, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.005628626505338463, + "n": [ + -2.597007649585314, + -15.509376515573363, + 12.767875905311987, + -1.7459847599351825, + -1.196780284722721, + -3.425253357555481 + ], + "reducing_value": 4908800.0, + "t": [ + 0.945, + 1.114, + 1.224, + 2.157, + 2.469, + 4.522 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 557.0, + "Tmax": 556.9999999999989, + "Tmin": 277.06, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.27167700173059695, + "n": [ + 0.8639422657944309, + -1.688248771620619, + 3.3308155638028083, + 152.44139464976624, + -173.70557844277656, + 36624.29817631924 + ], + "reducing_value": 4000.0, + "t": [ + 0.221, + 0.307, + 0.394, + 5.545, + 5.765, + 19.705 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 557.0, + "Tmax": 556.9999999999989, + "Tmin": 277.06, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9630964865271263, + "n": [ + -1.8639798693880143, + -12.434353793968175, + 9.656910477455611, + -8.552325635675663, + 11.090574157797857, + -495.7580019137995 + ], + "reducing_value": 4000.0, + "t": [ + 0.318, + 0.882, + 0.995, + 3.273, + 5.755, + 13.354 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "616-38-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "DimethylCarbonate", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-JPCRD-2011", + "T_max": 600, + "T_max_units": "K", + "Ttriple": 277.06, + "Ttriple_units": "K", + "accentric": 0.346, + "accentric_units": "-", + "alpha0": [ + { + "a1": 4.9916462, + "a2": -0.1709449, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 8.28421, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.48525, + 0.822585, + 16.2453, + 1.15925 + ], + "t": [ + 0.03770197486535009, + 2.405745062836625, + 3.001795332136445, + 13.27648114901257 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 5, + 1, + 1, + 2, + 3, + 4, + 1, + 2, + 7, + 1, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2 + ], + "n": [ + 0.00052683187, + 1.353396, + -2.649283, + -0.2785412, + 0.1742554, + 0.031606252, + 0.399866, + 1.178144, + -0.0235281, + -1.015, + -0.7880436, + -0.12696 + ], + "t": [ + 1, + 0.227, + 1.05, + 1.06, + 0.5, + 0.78, + 1.3, + 1.347, + 0.706, + 2, + 2.5, + 4.262 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.24, + 0.821, + 15.45, + 2.21, + 437, + 0.743 + ], + "d": [ + 1, + 1, + 2, + 2, + 3, + 3 + ], + "epsilon": [ + 0.6734, + 0.9239, + 0.8636, + 1.0507, + 0.8482, + 0.7522 + ], + "eta": [ + 0.9667, + 1.5154, + 1.0591, + 1.6642, + 12.4856, + 0.9662 + ], + "gamma": [ + 1.2827, + 0.4317, + 1.1217, + 1.1871, + 1.1243, + 0.4203 + ], + "n": [ + 1.2198, + -0.4883, + -0.0033293, + -0.0035387, + -0.51172, + -0.16882 + ], + "t": [ + 1, + 2.124, + 0.4, + 3.5, + 0.5, + 2.7 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0900779, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2226.523726, + "ptriple_units": "Pa", + "reducing_state": { + "T": 557, + "T_units": "K", + "p": 4908800, + "p_units": "Pa", + "rhomolar": 4000, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12111.18713006095, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.9680689047177409, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "DimethylCarbonate" +} \ No newline at end of file diff --git a/dev/fluids/DimethylEther.json b/dev/fluids/DimethylEther.json new file mode 100644 index 00000000..103e6f4a --- /dev/null +++ b/dev/fluids/DimethylEther.json @@ -0,0 +1,296 @@ +{ + "ALIASES": [ + "DIMETHYLETHER" + ], + "ANCILLARIES": { + "pL": { + "T_r": 400.378, + "Tmax": 400.3779999999991, + "Tmin": 131.66, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.037699905539889667, + "n": [ + 0.10722026973281615, + -6.488862377381296, + 0.623344116146438, + -0.4117944469977067, + -3.0220497491383966, + -0.9034795581048802 + ], + "reducing_value": 5336800.0, + "t": [ + 0.636, + 0.966, + 1.377, + 1.958, + 3.842, + 9.564 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 400.378, + "Tmax": 400.3779999999991, + "Tmin": 131.66, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009235289644016209, + "n": [ + -9.576458382440794, + 3.8237850260211683, + 2.3534240536183586, + -2.349392868307698, + -3.348742284357154, + -1.2387250144815742 + ], + "reducing_value": 5336800.0, + "t": [ + 1.026, + 1.188, + 7.78, + 3.09, + 6.356, + 12.704 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 400.378, + "Tmax": 400.3779999999991, + "Tmin": 131.66, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.048778965755591486, + "n": [ + 16.059795192018523, + -14.738564267851407, + -3.731150693384918, + 5.144676895857624, + 0.03490664751265221, + 8.503244669132489 + ], + "reducing_value": 5940.000000000001, + "t": [ + 0.572, + 0.658, + 0.713, + 0.916, + 2.977, + 19.393 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 400.378, + "Tmax": 400.3779999999991, + "Tmin": 131.66, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3099722664643645, + "n": [ + -4.396808750959381, + 0.11053731401780381, + -2.8034901380765476, + -577.5554786721015, + 2817.238575530162, + -2327.667386669654 + ], + "reducing_value": 5940.000000000001, + "t": [ + 0.499, + 0.75, + 2.338, + 11.224, + 12.48, + 12.984 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 400.378, + "a": [ + 0.063157 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.2595 + ] + } + }, + "CAS": "115-10-6", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 1.0, + "GWP20": 1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "DimethylEther", + "ODP": -1.0, + "PH": 2 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Wu-JPCRD-2011", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 131.66, + "Ttriple_units": "K", + "accentric": 0.196, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.980976, + "a2": 3.171218, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.039, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.641, + 2.123, + 8.992, + 6.191 + ], + "t": [ + 0.901647942694154, + 2.432701097462898, + 4.785477723551244, + 10.36520488138709 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7, + 1 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1, + 1 + ], + "n": [ + 0.029814139, + 1.43517, + -2.64964, + -0.29515532, + 0.17035607, + -0.94642918, + -0.099250514, + 1.1264071, + -0.76936548, + -0.020717696, + 0.24527037 + ], + "t": [ + 1, + 0.4366, + 1.011, + 1.137, + 0.45, + 2.83, + 1.5, + 1.235, + 2.675, + 0.7272, + 1.816 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.28719, + 0.806235, + 0.777942, + 197.681 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.672698, + 0.924246, + 0.750815, + 0.800022 + ], + "eta": [ + 0.965336, + 1.50858, + 0.963855, + 9.72643 + ], + "gamma": [ + 1.27772, + 0.43075, + 0.429607, + 1.13849 + ], + "n": [ + 1.1863438, + -0.49398368, + -0.16388716, + -0.027583584 + ], + "t": [ + 1.783, + 3.779, + 3.282, + 1.059 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.04606844, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2.210728317, + "ptriple_units": "Pa", + "reducing_state": { + "T": 400.378, + "T_units": "K", + "p": 5336800, + "p_units": "Pa", + "rhomolar": 5940.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 19149.49715074463, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.002019896781384355, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "DimethylEther" +} \ No newline at end of file diff --git a/dev/fluids/Ethane.json b/dev/fluids/Ethane.json new file mode 100644 index 00000000..f41a6c7f --- /dev/null +++ b/dev/fluids/Ethane.json @@ -0,0 +1,418 @@ +{ + "ALIASES": [ + "ethane", + "ETHANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 305.322, + "Tmax": 305.3219999999994, + "Tmin": 90.36800000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.02443577399946495, + "n": [ + 0.0708938064937161, + -5.874295125592951, + 0.47817350907541784, + -1.2607161303564414, + -1.4206996792387612, + 0.24201114919610817 + ], + "reducing_value": 4872200.0, + "t": [ + 0.674, + 0.972, + 1.942, + 3.341, + 4.772, + 7.604 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 305.322, + "Tmax": 305.3219999999994, + "Tmin": 90.36800000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.023914433726957007, + "n": [ + 9.344483558228339, + -14.812636376983514, + -0.6873077210086483, + 0.7942400572322573, + -2.447274904672986, + 0.04047591478430641 + ], + "reducing_value": 4872200.0, + "t": [ + 0.871, + 0.902, + 1.663, + 2.045, + 3.946, + 14.704 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 305.322, + "Tmax": 305.3219999999994, + "Tmin": 90.36800000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2641153515335448, + "n": [ + 0.2029526716447543, + 2.027464725614132, + 0.4378976432411991, + -13.592018000960584, + 57.55031435474073, + -88.68904612138073 + ], + "reducing_value": 6856.886685, + "t": [ + 0.211, + 0.408, + 1.789, + 10.003, + 12.669, + 16.309 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 305.322, + "Tmax": 305.3219999999994, + "Tmin": 90.36800000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.16677527675037496, + "n": [ + -2.6749170682059686, + 2.030707929009753, + -6.8230765701730345, + 4.330369494473089, + -2.442998212709984, + -2.2189277777818948 + ], + "reducing_value": 6856.886685, + "t": [ + 0.385, + 0.775, + 1.013, + 1.533, + 2.476, + 4.435 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 305.322, + "a": [ + 0.07602, + -0.02912 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.32, + 1.676 + ] + } + }, + "CAS": "74-84-0", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 2.9, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Ethane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Buecker-JPCRD-2006", + "T_max": 675, + "T_max_units": "K", + "Ttriple": 90.368, + "Ttriple_units": "K", + "accentric": 0.099, + "accentric_units": "-", + "alpha0": [ + { + "a1": 9.212802589, + "a2": -4.68224855, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.003039265, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.117433359, + 3.467773215, + 6.94194464, + 5.970850948 + ], + "t": [ + 1.409105233, + 4.009917071, + 6.596709834, + 13.97981027 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 2, + 4, + 1, + 1, + 2, + 2, + 3, + 6, + 6, + 7, + 9, + 10, + 2, + 4, + 4, + 5, + 5, + 6, + 8, + 9, + 2, + 3, + 3, + 3, + 4, + 4, + 5, + 5, + 6, + 11, + 14, + 3, + 3, + 4, + 8, + 10 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 4 + ], + "n": [ + 0.83440745735241, + -1.4287360607171, + 0.34430242210927, + -0.42096677920265, + 0.012094500886549, + -0.57976201597341, + -0.033127037870838, + -0.1175165489413, + -0.11160957833067, + 0.062181592654406, + 0.098481795434443, + -0.098268582682358, + -0.00023977831007049, + 0.00069885663328821, + 1.9665987803305e-05, + -0.014586152207928, + 0.046354100536781, + 0.0060764622180645, + -0.0026447330147828, + -0.042931872689904, + 0.0029987786517263, + 0.005291933517501, + -0.0010383897798198, + -0.054260348214694, + -0.21959362918493, + 0.35362456650354, + -0.12477390173714, + 0.18425693591517, + -0.16192256436754, + -0.082770876149064, + 0.050160758096437, + 0.0093614326336655, + -0.00027839186242864, + 2.3560274071481e-05, + 0.0039238329738527, + -0.00076488325813618, + -0.004994430444073, + 0.0018593386407186, + -0.00061404353331199 + ], + "t": [ + 0.25, + 1, + 0.25, + 0.75, + 0.75, + 2, + 4.25, + 0.75, + 2.25, + 3, + 1, + 1.25, + 2.75, + 1, + 2, + 2.5, + 5.5, + 7, + 0.5, + 5.5, + 2.5, + 4, + 2, + 10, + 16, + 18, + 20, + 14, + 18, + 12, + 19, + 7, + 15, + 9, + 26, + 28, + 28, + 22, + 13 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 150, + 150, + 150, + 275, + 400 + ], + "d": [ + 1, + 1, + 3, + 3, + 2 + ], + "epsilon": [ + 1, + 1, + 1, + 1, + 1 + ], + "eta": [ + 15, + 15, + 15, + 20, + 20 + ], + "gamma": [ + 1.05, + 1.05, + 1.05, + 1.22, + 1.16 + ], + "n": [ + -0.0023312179367924, + 0.002930104790876, + -0.00026912472842883, + 184.13834111814, + -10.397127984854 + ], + "t": [ + 0, + 3, + 3, + 0, + 3 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.03006904, + "molar_mass_units": "kg/mol", + "p_max": 900000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1.142108115, + "ptriple_units": "Pa", + "reducing_state": { + "T": 305.322, + "T_units": "K", + "p": 4872200, + "p_units": "Pa", + "rhomolar": 6856.886685, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 21667.74788890113, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.001520439053820902, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Ethane" +} \ No newline at end of file diff --git a/dev/fluids/Ethanol.json b/dev/fluids/Ethanol.json new file mode 100644 index 00000000..276de62f --- /dev/null +++ b/dev/fluids/Ethanol.json @@ -0,0 +1,353 @@ +{ + "ALIASES": [ + "C2H6O", + "ethanol", + "ETHANOL" + ], + "ANCILLARIES": { + "pL": { + "T_r": 514.71, + "Tmax": 514.7099999999989, + "Tmin": 159.1, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.033827061431446204, + "n": [ + -7.689152382102059, + -6.126637668761524, + 6.6239961045380715, + -7.827481023390803, + 3.1386332149218172, + -6.712235308208619 + ], + "reducing_value": 6268000.0, + "t": [ + 0.971, + 2.322, + 3.072, + 3.934, + 4.465, + 19.972 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 514.71, + "Tmax": 514.7099999999989, + "Tmin": 159.1, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04257959089870589, + "n": [ + -11.192972756774067, + 5.91450813157208, + -5.1794840706987495, + 15.462343061602924, + -16.591379419702076, + -0.5994594761714971 + ], + "reducing_value": 6268000.0, + "t": [ + 1.0, + 1.169, + 1.586, + 2.44, + 2.524, + 7.31 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 514.71, + "Tmax": 514.7099999999989, + "Tmin": 159.1, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7371174097769773, + "n": [ + 7.824518623386008, + -338.93732001583646, + 368.3422016038343, + -90.14206962630433, + 80.35347134933373, + -26.00710239571597 + ], + "reducing_value": 5930.0, + "t": [ + 0.596, + 1.495, + 1.561, + 2.737, + 3.606, + 4.943 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 514.71, + "Tmax": 514.7099999999989, + "Tmin": 159.1, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 6.337867778240303, + "n": [ + -4.698337259111072, + -10.953380258011986, + 12.92351305172882, + -1017.0017776259273, + 1604.552160868234, + -1439.9265562459323 + ], + "reducing_value": 5930.0, + "t": [ + 0.443, + 2.304, + 4.146, + 11.027, + 12.113, + 17.485 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 513.9, + "a": [ + 0.05 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 0.952 + ] + } + }, + "CAS": "64-17-5", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Ethanol", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Schroeder-MSTHESIS-2011", + "T_max": 650, + "T_max_units": "K", + "Ttriple": 159.1, + "Ttriple_units": "K", + "accentric": 0.644, + "accentric_units": "-", + "alpha0": [ + { + "a1": -12.7531, + "a2": 9.39094, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.43069, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.14326, + 5.09206, + 6.60138, + 5.70777 + ], + "t": [ + 0.816771, + 2.59175, + 3.80408, + 8.58736 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 1, + 1, + 3, + 3, + 2, + 2, + 6, + 6, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 1 + ], + "n": [ + 0.058200796, + 0.94391227, + -0.80941908, + 0.55359038, + -1.4269032, + 0.13448717, + 0.42671978, + -1.1700261, + -0.92405872, + 0.34891808, + -0.9132772, + 0.022629481, + -0.15513423, + 0.21055146, + -0.2199769, + -0.0065857238 + ], + "t": [ + 1, + 1.04, + 2.72, + 1.174, + 1.329, + 0.195, + 2.43, + 1.274, + 4.16, + 3.3, + 4.177, + 2.5, + 0.81, + 2.02, + 1.606, + 0.86 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.207, + 0.0895, + 0.581, + 0.947, + 2.356, + 27.01, + 4.542, + 1.287, + 3.09 + ], + "d": [ + 1, + 1, + 2, + 3, + 3, + 2, + 2, + 2, + 1 + ], + "epsilon": [ + 0.779, + 0.805, + 1.869, + 0.694, + 1.312, + 2.054, + 0.441, + 0.793, + 0.313 + ], + "eta": [ + 1.075, + 0.463, + 0.876, + 1.108, + 0.741, + 4.032, + 2.453, + 2.3, + 3.143 + ], + "gamma": [ + 1.194, + 1.986, + 1.583, + 0.756, + 0.495, + 1.002, + 1.077, + 1.493, + 1.542 + ], + "n": [ + 0.75564749, + 0.1069411, + -0.069533844, + -0.24947395, + 0.027177891, + -0.0009053953, + -0.12310953, + -0.08977971, + -0.39512601 + ], + "t": [ + 2.5, + 3.72, + 1.19, + 3.25, + 3, + 2, + 2, + 1, + 1 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.04606844, + "molar_mass_units": "kg/mol", + "p_max": 280000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.0007350470775, + "ptriple_units": "Pa", + "reducing_state": { + "T": 514.71, + "T_units": "K", + "p": 6268000, + "p_units": "Pa", + "rhomolar": 5930, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 19729.08885611082, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 5.557847680758439e-07, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Ethanol" +} \ No newline at end of file diff --git a/dev/fluids/EthylBenzene.json b/dev/fluids/EthylBenzene.json new file mode 100644 index 00000000..47aa410c --- /dev/null +++ b/dev/fluids/EthylBenzene.json @@ -0,0 +1,277 @@ +{ + "ALIASES": [ + "ethylbenzene", + "ETHYLBENZENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 617.12, + "Tmax": 617.1199999999991, + "Tmin": 178.2, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.029287453591875234, + "n": [ + -10.470797927331965, + 13.630609834199861, + -10.464804307489011, + -3.597964571513027, + -0.24883120010409457, + -2.1658021554100957 + ], + "reducing_value": 3622400.0, + "t": [ + 1.034, + 1.41, + 1.581, + 4.148, + 6.154, + 15.215 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 617.12, + "Tmax": 617.1199999999991, + "Tmin": 178.2, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06595815185534981, + "n": [ + 0.026329220088491232, + -0.03275185377692519, + -6.510181837639293, + -3.8883599204862613, + -0.8922900194695055, + -1.9347736091269756 + ], + "reducing_value": 3622400.0, + "t": [ + 0.457, + 0.679, + 0.96, + 3.544, + 6.943, + 14.911 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 617.12, + "Tmax": 617.1199999999991, + "Tmin": 178.2, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2379194472473145, + "n": [ + 4.915675810263367, + -4.4212458698552295, + 5.72675775026962, + -3.746340117826641, + 4.221240347308843, + -7.214708107153519 + ], + "reducing_value": 2741.016, + "t": [ + 0.464, + 0.709, + 1.422, + 1.801, + 8.327, + 11.454 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 617.12, + "Tmax": 617.1199999999991, + "Tmin": 178.2, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.48679789506540505, + "n": [ + -3.0745260331510194, + -0.9359433157855367, + -10.417112433984668, + 25.449706975048258, + -19.993854217365445, + -2.653264944314633 + ], + "reducing_value": 2741.016, + "t": [ + 0.426, + 0.545, + 1.641, + 2.034, + 2.35, + 5.977 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "100-41-4", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-JPCRD-2012", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 178.2, + "Ttriple_units": "K", + "accentric": 0.304, + "accentric_units": "-", + "alpha0": [ + { + "a1": 5.70409, + "a2": -0.52414353, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 4.2557889, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 9.7329909, + 11.201832, + 25.440749 + ], + "t": [ + 0.9479517759917034, + 7.16230230749287, + 2.710980036297641 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 5, + 1, + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0018109418, + -0.076824284, + 0.041823789, + 1.5059649, + -2.4122441, + -0.47788846, + 0.18814732, + -1.0657412, + -0.20797007, + 1.1222031, + -0.99300799, + -0.027300984 + ], + "t": [ + 1, + 1, + 0.92, + 0.27, + 0.962, + 1.033, + 0.513, + 2.31, + 3.21, + 1.26, + 2.29, + 1 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 2.437, + 1.488, + 4, + 418.6 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.5494, + 0.7235, + 0.493, + 0.8566 + ], + "eta": [ + 1.178, + 1.07, + 1.775, + 15.45 + ], + "gamma": [ + 1.2667, + 0.4237, + 0.8573, + 1.15 + ], + "n": [ + 1.3757894, + -0.44477155, + -0.07769742, + -2.16719 + ], + "t": [ + 0.6, + 3.6, + 2.1, + 0.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.106165, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.004002961392, + "ptriple_units": "Pa", + "reducing_state": { + "T": 617.12, + "T_units": "K", + "p": 3622400, + "p_units": "Pa", + "rhomolar": 2741.016, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9123.237141963473, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.702209571410398e-06, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "EthylBenzene" +} \ No newline at end of file diff --git a/dev/fluids/Ethylene.json b/dev/fluids/Ethylene.json new file mode 100644 index 00000000..e3a1436d --- /dev/null +++ b/dev/fluids/Ethylene.json @@ -0,0 +1,380 @@ +{ + "ALIASES": [ + "ethylene", + "ETHYLENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 282.35, + "Tmax": 282.3499999999994, + "Tmin": 103.98900000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.012820987213224555, + "n": [ + -124.41031297062331, + 119.37497252523112, + -0.6700941331427409, + -1.4552049349494574, + -2.380793838058247, + 1.8286241499129299 + ], + "reducing_value": 5041800.0, + "t": [ + 1.088, + 1.096, + 1.84, + 4.252, + 5.735, + 7.077 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 282.35, + "Tmax": 282.3499999999994, + "Tmin": 103.98900000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.012376938726232911, + "n": [ + 30.782068035093094, + -1.467121970937139, + 0.09230690543250192, + -2.5188888709008195, + -34.95537683446643, + 6.643870978349449 + ], + "reducing_value": 5041800.0, + "t": [ + 1.118, + 1.461, + 2.464, + 4.298, + 1.082, + 18.676 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 282.35, + "Tmax": 282.3499999999994, + "Tmin": 103.98900000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.08567503686368605, + "n": [ + 1.8464339723391994, + 0.7268516869915771, + -1.717280185311927, + 1686.1315441396878, + -3729.1628980234227, + 2049.0293383014655 + ], + "reducing_value": 7636.76598074554, + "t": [ + 0.348, + 0.912, + 3.94, + 6.912, + 7.065, + 7.198 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 282.35, + "Tmax": 282.3499999999994, + "Tmin": 103.98900000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5959122914985127, + "n": [ + -0.21894352062047293, + -3.4266486595099503, + -1.5160021065230918, + -4.205648419382292, + -265.8806216433561, + 474.2473840272181 + ], + "reducing_value": 7636.76598074554, + "t": [ + 0.165, + 0.497, + 1.478, + 5.546, + 19.239, + 19.774 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 282.35, + "a": [ + 0.0477 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.17 + ] + } + }, + "CAS": "74-85-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 6.8, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Ethylene", + "ODP": -1.0, + "PH": 2 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Smukala-JPCRD-2000", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 103.989, + "Ttriple_units": "K", + "accentric": 0.0866, + "accentric_units": "-", + "alpha0": [ + { + "a1": 8.68815523, + "a2": -4.47960564, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.49395851, + 3.0027152, + 2.5126584, + 3.99064217 + ], + "t": [ + 4.43266896, + 5.74840149, + 7.8027825, + 15.5851154 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 4, + 1, + 1, + 3, + 4, + 5, + 7, + 10, + 11, + 1, + 1, + 2, + 2, + 4, + 4, + 6, + 7, + 4, + 5, + 6, + 6, + 7, + 8, + 9, + 10 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ], + "n": [ + 1.861742910067, + -3.0913708460844, + -0.17384817095516, + 0.08037098569284, + 0.23682707317354, + 0.021922786610247, + 0.11827885813193, + -0.021736384396776, + 0.044007990661139, + 0.12554058863881, + -0.13167945577241, + -0.0052116984575897, + 0.00015236081265419, + -2.4505335342756e-05, + 0.28970524924022, + -0.18075836674288, + 0.15057272878461, + -0.14093151754458, + 0.022755109070253, + 0.014026070529061, + 0.0061697454296214, + -0.00041286083451333, + 0.012885388714785, + -0.069128692157093, + 0.10936225568483, + -0.0081818875271794, + -0.05641847211717, + 0.0016517867750633, + 0.0095904006517001, + -0.0026236572984886 + ], + "t": [ + 0.5, + 1, + 2.5, + 0, + 2, + 0.5, + 1, + 4, + 1.25, + 2.75, + 2.25, + 1, + 0.75, + 0.5, + 2.5, + 3.5, + 4, + 6, + 1.5, + 5, + 4.5, + 15, + 20, + 23, + 22, + 29, + 19, + 15, + 13, + 10 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 325, + 300, + 300, + 300, + 300 + ], + "d": [ + 2, + 2, + 2, + 3, + 3 + ], + "epsilon": [ + 1, + 1, + 1, + 1, + 1 + ], + "eta": [ + 25, + 25, + 25, + 25, + 25 + ], + "gamma": [ + 1.16, + 1.19, + 1.19, + 1.19, + 1.19 + ], + "n": [ + -50.242414011355, + 7484.6420119299, + -6873.4299232625, + -935.77982814338, + 941.33024786113 + ], + "t": [ + 1, + 0, + 1, + 2, + 3 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.02805376, + "molar_mass_units": "kg/mol", + "p_max": 300000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 122.0267638, + "ptriple_units": "Pa", + "reducing_state": { + "T": 282.35, + "T_units": "K", + "p": 5041800, + "p_units": "Pa", + "rhomolar": 7636.76598074554, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 23333.76164627406, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.1411854791624635, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Ethylene" +} \ No newline at end of file diff --git a/dev/fluids/Fluorine.json b/dev/fluids/Fluorine.json new file mode 100644 index 00000000..e1ff706f --- /dev/null +++ b/dev/fluids/Fluorine.json @@ -0,0 +1,377 @@ +{ + "ALIASES": [ + "fluorine", + "FLUORINE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 144.414, + "Tmax": 144.41399999999967, + "Tmin": 53.481100000000005, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.2165925957978718, + "n": [ + 12.274163862138828, + -12.629879444828052, + -6.708762919300672, + 14.195071764394564, + -14.772924246299883, + 219.66568736007514 + ], + "reducing_value": 5172400.0, + "t": [ + 0.232, + 0.237, + 1.167, + 2.758, + 3.128, + 19.84 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 144.414, + "Tmax": 144.41399999999967, + "Tmin": 53.481100000000005, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8012130495174019, + "n": [ + 0.032041854896500264, + -3.429417910548146, + -2.362258815038421, + -1.0111386038971053, + -7008.9949851880765, + 9283.126473335162 + ], + "reducing_value": 5172400.0, + "t": [ + 0.056, + 0.84, + 1.353, + 4.898, + 19.085, + 19.761 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 144.414, + "Tmax": 144.41399999999967, + "Tmin": 53.481100000000005, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.046804259511246116, + "n": [ + -2.1267466372809594, + 4.293457721465353, + 1.136882153895534, + -2.83890898830727, + 5360.59971312227, + -6438.621729396981 + ], + "reducing_value": 15603.0, + "t": [ + 0.329, + 0.371, + 3.558, + 5.918, + 18.297, + 18.795 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 144.414, + "Tmax": 144.41399999999967, + "Tmin": 53.481100000000005, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.43897421479124343, + "n": [ + 0.209065655538512, + -5.869062694341366, + 3.6459137875713985, + -2.7710544718284704, + -3.720164757549319, + 23.40559168423325 + ], + "reducing_value": 15603.0, + "t": [ + 0.135, + 0.425, + 0.545, + 1.021, + 5.359, + 14.59 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 144.414, + "a": [ + 0.03978 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.218 + ] + } + }, + "CAS": "7782-41-4", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 4, + "Name": "Fluorine", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "deReuck-BOOK-1990", + "BibTeX_EOS": "deReuck-BOOK-1990", + "T_max": 300, + "T_max_units": "K", + "Ttriple": 53.4811, + "Ttriple_units": "K", + "accentric": 0.0449, + "accentric_units": "-", + "alpha0": [ + { + "n": [ + 3.0717001e-06, + -5.2985762e-05, + -16.372517, + 3.6884682e-05, + 4.3887271 + ], + "t": [ + -4, + -3, + 1, + 2, + 0 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "a": 2.5011231, + "type": "IdealGasHelmholtzLogTau" + }, + { + "c": [ + -1 + ], + "n": [ + 1.012767 + ], + "t": [ + 8.9057501 + ], + "type": "IdealGasHelmholtzPlanckEinstein2" + }, + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 8, + 9 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 1.51144749736, + -2.98666288409, + 3.29644905098, + -2.98458624201, + -2.28688966459, + -1.094921934, + 3.04775277572, + 0.115689564208, + -1.16100171627, + 0.295656394476, + 0.0711482542928, + -0.00171363832155, + 0.000665317955515 + ], + "t": [ + 0, + 0.5, + 1.5, + 2, + 0.5, + 1, + 0.5, + 2, + 0.5, + 1, + 0, + 0.5, + 0 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 4, + 4, + 4, + 5, + 6, + 7, + 8, + 12, + 4, + 6, + 6 + ], + "g": [ + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 1.078102576, + 2.156205153, + 3.234307729, + 3.234307729 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + 5.06026676251, + -6.2926843544, + 6.17784808739, + -1.55366191788, + -2.87170687343, + 3.17214480494, + -2.67969025215, + 2.71865479252, + -1.07191065039, + 1.26597342291, + -0.706244695489, + 0.268707888826, + 0.0527251190274, + 0.0544411481926, + 0.000228949994105, + -5.479082643040001e-10, + -0.096427322495, + 0.000368084486225 + ], + "t": [ + 1, + 3, + 4, + 5, + 1, + 4, + 5, + 1, + 3, + 5, + 4, + 4, + 1, + 1, + 5, + 30, + 20, + 25 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31448, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.03799681000000001, + "molar_mass_units": "kg/mol", + "p_max": 20000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 238.8103329, + "ptriple_units": "Pa", + "reducing_state": { + "T": 144.414, + "T_units": "K", + "p": 5172400, + "p_units": "Pa", + "rhomolar": 15603, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 44917.13573008027, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.5374094722802236, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Fluorine" +} \ No newline at end of file diff --git a/dev/fluids/HFE143m.json b/dev/fluids/HFE143m.json new file mode 100644 index 00000000..2a67593f --- /dev/null +++ b/dev/fluids/HFE143m.json @@ -0,0 +1,261 @@ +{ + "ALIASES": [ + "HFE-143m", + "HFE143M", + "HFE-143M", + "RE143A", + "RE143a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 377.921, + "Tmax": 377.9209999999992, + "Tmin": 240.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.030182989158467066, + "n": [ + 0.003507005166582647, + -0.9977558588652533, + -5.540224394968286, + -0.31084593640695357, + -3.79461617284861, + 4.758257690910974 + ], + "reducing_value": 3635000.0, + "t": [ + 0.01, + 0.898, + 0.985, + 2.475, + 3.907, + 9.142 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 377.921, + "Tmax": 377.9209999999992, + "Tmin": 240.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2108735480769508, + "n": [ + 0.014478661107695035, + -0.6242585291517511, + 1.2296456508104718, + -7.2843842540973975, + -31.628487819979497, + 535.477430612564 + ], + "reducing_value": 3635000.0, + "t": [ + 0.09, + 0.523, + 0.651, + 0.961, + 5.664, + 9.521 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 377.921, + "Tmax": 377.9209999999992, + "Tmin": 240.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6804963381005225, + "n": [ + 0.335183935046017, + 2.07566462116046, + 112192.72531570093, + -126522.90717969429, + 891195.9272871091, + -5911298.633294987 + ], + "reducing_value": 4648.140744, + "t": [ + 0.367, + 0.39, + 7.315, + 7.402, + 12.039, + 14.608 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 377.921, + "Tmax": 377.9209999999992, + "Tmin": 240.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9909294019332271, + "n": [ + -4.266199685018297, + 14.465655413880627, + -17.190892941379516, + 61.40354293923954, + -19753752.67110767, + 257263004.36371782 + ], + "reducing_value": 4648.140744, + "t": [ + 0.431, + 1.003, + 1.102, + 6.066, + 17.199, + 19.918 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "421-14-7", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Akasaka-IJR-2012", + "T_max": 4220, + "T_max_units": "K", + "Ttriple": 240, + "Ttriple_units": "K", + "accentric": 0.2888713656700324, + "accentric_units": "-", + "alpha0": [ + { + "a1": -17.97705674077087, + "a2": 12.92642879298097, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 273.15, + "Tc": 377.921, + "cp_over_R": 2.449945107759098, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 273.15, + "Tc": 377.921, + "c": [ + 0.03509543360059424, + -2.345308276941699e-05, + 5.592658198860973e-09 + ], + "t": [ + 1 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 3, + 5, + 7, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3 + ], + "n": [ + 7.7715884, + -8.704257, + -0.28095049, + 0.14540153, + 0.0092291277, + -0.2141651, + 0.099475155, + 0.023247135, + -0.012873573, + -0.057366549, + 0.3650465, + -0.25433763, + -0.090896436, + 0.083503619, + 0.015477603, + -0.016641941, + 0.0052410163 + ], + "t": [ + 0.682, + 0.851, + 1.84, + 1.87, + 0.353, + 3.92, + 1.14, + 0.104, + 1.19, + 6.58, + 6.73, + 7.99, + 7.31, + 7.45, + 16.5, + 24.8, + 10.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.10004, + "molar_mass_units": "kg/mol", + "p_max": 7200000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 65359.39301, + "ptriple_units": "Pa", + "reducing_state": { + "T": 377.921, + "T_units": "K", + "p": 3635000, + "p_units": "Pa", + "rhomolar": 4648.140744, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12615.3284879174, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 34.01957819070063, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "HFE143m" +} \ No newline at end of file diff --git a/dev/fluids/Helium.json b/dev/fluids/Helium.json new file mode 100644 index 00000000..c4cc1324 --- /dev/null +++ b/dev/fluids/Helium.json @@ -0,0 +1,326 @@ +{ + "ALIASES": [ + "helium", + "HELIUM", + "He" + ], + "ANCILLARIES": { + "pL": { + "T_r": 5.1953, + "Tmax": 5.195299999999987, + "Tmin": 2.1768000000000103, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009046990251626585, + "n": [ + -2.5589967099484343, + -2.1208869241528903, + 2.0304814035943877, + 0.9702906562630098, + -0.006217789170073319, + -4.338734244510393 + ], + "reducing_value": 227600.0, + "t": [ + 0.981, + 1.13, + 1.536, + 3.109, + 0.338, + 14.431 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 5.1953, + "Tmax": 5.195299999999987, + "Tmin": 2.1768000000000103, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009844391348079462, + "n": [ + 2.1680719893011937, + -5.75952731195631, + 1.295833335273841, + 0.42681936101289836, + 0.49626229940990035, + -11.083693322102567 + ], + "reducing_value": 227600.0, + "t": [ + 0.896, + 0.945, + 2.116, + 2.72, + 6.555, + 14.771 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 5.1953, + "Tmax": 5.195299999999987, + "Tmin": 2.1768000000000103, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01468301830127583, + "n": [ + 1.8225767219916278, + -0.5212838519553242, + 0.2130685389843537, + -0.44861224586106435, + 5.329845315529739, + -10.020970811883176 + ], + "reducing_value": 18130.0, + "t": [ + 0.402, + 0.491, + 0.941, + 1.784, + 8.213, + 9.042 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 5.1953, + "Tmax": 5.195299999999987, + "Tmin": 2.1768000000000103, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0694378509351723, + "n": [ + -0.8412289332631507, + -3.590072534944493, + 2.2788760536554777, + -1.4459129841887175, + 2.0638632716793297, + -14.547720153618606 + ], + "reducing_value": 18130.0, + "t": [ + 0.211, + 0.693, + 0.749, + 1.118, + 1.846, + 19.915 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 5.1953, + "a": [ + 0.0004656, + 0.001889, + -0.002006 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.04, + 2.468, + 2.661 + ] + } + }, + "CAS": "7440-59-7", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Helium", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "OrtizVega-2010", + "T_max": 2000, + "T_max_units": "K", + "Ttriple": 2.1768, + "Ttriple_units": "K", + "accentric": -0.385, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0.1871304489697973, + "a2": 0.4848903984696551, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 1, + 3, + 2, + 2, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.009288766, + 0.9258069, + -1.718156, + 0.7606137, + -1.024864, + 0.1052455, + -0.1875722, + -0.1287812, + -0.002227619, + 0.1823465, + -0.04450014, + -8.729033e-05 + ], + "t": [ + 1, + 0.28, + 0.735, + 0.64, + 0.82, + 1.16, + 1.28, + 2, + 0.41, + 1.33, + 4.2, + 0.6 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.0385, + 19.8246, + 9.3799, + 0.8073, + 0.031, + 0.0061, + 0.3581, + 0.7518, + 7.4629 + ], + "d": [ + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 2 + ], + "epsilon": [ + 0.6914, + 0.859, + 0.8787, + 2.7182, + 2.0301, + 0.89, + 1.179, + 0.568, + 1.6412 + ], + "eta": [ + 1.0833, + 18.3824, + 5.0573, + 0.2832, + 6.0582, + 0.2444, + 0.0539, + 0.185, + 0.5941 + ], + "gamma": [ + 1.9776, + 1.6178, + 0.4371, + 0.5355, + 0.7777, + 0.4832, + 0.8162, + 1.2896, + 0.3577 + ], + "n": [ + 0.0385432, + -0.9585106, + -0.0545401, + -0.0368726, + -0.001021851, + 0.06166348, + 0.02493437, + -0.008127424, + -0.008233032 + ], + "t": [ + 3, + 1, + 8.2, + 1, + 2.71, + 1, + 1, + 2, + 1 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.004002602, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 5042.757189, + "ptriple_units": "Pa", + "reducing_state": { + "T": 5.1953, + "T_units": "K", + "p": 227600, + "p_units": "Pa", + "rhomolar": 18130, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 36459.45454859136, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 293.9108313933456, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Helium" +} \ No newline at end of file diff --git a/dev/fluids/Hydrogen.json b/dev/fluids/Hydrogen.json new file mode 100644 index 00000000..1efcf97f --- /dev/null +++ b/dev/fluids/Hydrogen.json @@ -0,0 +1,304 @@ +{ + "ALIASES": [ + "hydrogen", + "HYDROGEN", + "H2", + "R702" + ], + "ANCILLARIES": { + "pL": { + "T_r": 33.145, + "Tmax": 33.144999999999925, + "Tmin": 13.957000000000011, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01630156085371537, + "n": [ + -4.544068673862971, + -0.13186072974088692, + 3.0474002305782255, + -3.0615550520928423, + -0.302424110535371, + 1.7087746430267654 + ], + "reducing_value": 1296400.0, + "t": [ + 0.99, + 1.155, + 2.009, + 2.408, + 8.137, + 2.924 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 33.145, + "Tmax": 33.144999999999925, + "Tmin": 13.957000000000011, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006522036925715735, + "n": [ + -0.5553870929135406, + -7.0852972599030295, + 0.006868538454095541, + 0.8295514415153659, + -0.08773773693832483, + 3.754274235303921 + ], + "reducing_value": 1296400.0, + "t": [ + 0.882, + 1.072, + 1.355, + 2.61, + 8.191, + 1.239 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 33.145, + "Tmax": 33.144999999999925, + "Tmin": 13.957000000000011, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8323321588331933, + "n": [ + 1.9546584452513824, + -5.715534926385584, + 714.2366728890577, + -1666.5447521212081, + 2698.8598951804593, + -12755.576112629806 + ], + "reducing_value": 15508.0, + "t": [ + 0.407, + 3.401, + 7.095, + 8.095, + 10.911, + 17.353 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 33.145, + "Tmax": 33.144999999999925, + "Tmin": 13.957000000000011, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5551328985772819, + "n": [ + -3.036644018774332, + -773.9211864728516, + 1530.809493601263, + -3087.995404817007, + 3472.491545729249, + -15649.585518005188 + ], + "reducing_value": 15508.0, + "t": [ + 0.473, + 6.618, + 7.083, + 9.094, + 10.577, + 19.579 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 33.145, + "a": [ + -1.4165, + 0.746383, + 0.675625 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 0.63882, + 0.659804, + 0.619149 + ] + } + }, + "CAS": "1333-74-0", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Hydrogen", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Leachman-JPCRD-2009", + "T_max": 1000, + "T_max_units": "K", + "Ttriple": 13.957, + "Ttriple_units": "K", + "accentric": -0.219, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.4579856475, + "a2": 1.888076782, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.616, + -0.4117, + -0.792, + 0.758, + 1.217 + ], + "t": [ + 16.0205159149, + 22.6580178006, + 60.0090511389, + 74.9434303817, + 206.9392065168 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "n": [ + -6.93643, + 0.01, + 2.1101, + 4.52059, + 0.732564, + -1.34086, + 0.130985, + -0.777414, + 0.351944 + ], + "t": [ + 0.6844, + 1, + 0.989, + 0.489, + 0.803, + 1.1444, + 1.409, + 1.754, + 1.311 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.171, + 0.2245, + 0.1304, + 0.2785, + 0.3967 + ], + "d": [ + 2, + 1, + 3, + 1, + 1 + ], + "epsilon": [ + 1.506, + 0.156, + 1.736, + 0.67, + 1.662 + ], + "eta": [ + 1.685, + 0.489, + 0.103, + 2.506, + 1.607 + ], + "gamma": [ + 0.7164, + 1.3444, + 1.4517, + 0.7204, + 1.5445 + ], + "n": [ + -0.0211716, + 0.0226312, + 0.032187, + -0.0231752, + 0.0557346 + ], + "t": [ + 4.187, + 5.646, + 0.791, + 7.249, + 2.986 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.00201588, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7357.828142, + "ptriple_units": "Pa", + "reducing_state": { + "T": 33.145, + "T_units": "K", + "p": 1296400, + "p_units": "Pa", + "rhomolar": 15508, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 38198.13818258921, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 64.44810198985165, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Hydrogen" +} \ No newline at end of file diff --git a/dev/fluids/HydrogenSulfide.json b/dev/fluids/HydrogenSulfide.json new file mode 100644 index 00000000..81986ccd --- /dev/null +++ b/dev/fluids/HydrogenSulfide.json @@ -0,0 +1,261 @@ +{ + "ALIASES": [ + "H2S", + "HYDROGENSULFIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 373.1, + "Tmax": 373.09999999999945, + "Tmin": 187.7, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01406124754110838, + "n": [ + -6.761826097619247, + -0.005988209650772923, + -6.882637639835571, + -2.8254550876910356, + 7.704835506786447, + 1.7417891509345698 + ], + "reducing_value": 9000000.0, + "t": [ + 1.003, + 1.146, + 1.668, + 4.886, + 1.558, + 9.098 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 373.1, + "Tmax": 373.09999999999945, + "Tmin": 187.7, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019173536478978015, + "n": [ + 0.016005313259314074, + -5.84689331691651, + 0.378166392177876, + -0.33675173635383543, + -1.6596226528944937, + -1.8779907937289753 + ], + "reducing_value": 9000000.0, + "t": [ + 0.512, + 0.974, + 1.577, + 2.795, + 3.791, + 7.388 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 373.1, + "Tmax": 373.09999999999945, + "Tmin": 187.7, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.12757076402429846, + "n": [ + 51.601033693983716, + -49.93595719794271, + 6.987088261412919, + -24.784697586038508, + 84.07792676768513, + -68.55133880200839 + ], + "reducing_value": 10190.0, + "t": [ + 0.572, + 0.586, + 2.075, + 3.069, + 4.223, + 4.619 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 373.1, + "Tmax": 373.09999999999945, + "Tmin": 187.7, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1081652393724486, + "n": [ + -5.046830785558678, + -38.485729404620876, + 41.23869786806366, + -2.8100720902410004, + -10.142249397446074, + 21.5382763129489 + ], + "reducing_value": 10190.0, + "t": [ + 0.532, + 0.681, + 0.691, + 1.195, + 6.002, + 9.033 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 373.1, + "a": [ + 0.078557 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.2074 + ] + } + }, + "CAS": "7783-06-4", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 4, + "Name": "HydrogenSulfide", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 760, + "T_max_units": "K", + "Ttriple": 187.7, + "Ttriple_units": "K", + "accentric": 0.1005, + "accentric_units": "-", + "alpha0": [ + { + "a1": -4.0740770957, + "a2": 3.7632137341, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.002753352822675789 + ], + "t": [ + -1.5 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 1.1364, + 1.9721 + ], + "t": [ + 4.886089520235862, + 10.62717770034843 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.87641, + -2.0367, + 0.21634, + -0.050199, + 0.066994, + 0.00019076, + 0.20227, + -0.0045348, + -0.2223, + -0.034714, + -0.014885, + 0.0074154 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.03408088, + "molar_mass_units": "kg/mol", + "p_max": 170000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 23258.85584, + "ptriple_units": "Pa", + "reducing_state": { + "T": 373.1, + "T_units": "K", + "p": 9000000, + "p_units": "Pa", + "rhomolar": 10190, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 29116.27758075055, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 15.02516830469272, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "HydrogenSulfide" +} \ No newline at end of file diff --git a/dev/fluids/IsoButane.json b/dev/fluids/IsoButane.json new file mode 100644 index 00000000..4d5a36b9 --- /dev/null +++ b/dev/fluids/IsoButane.json @@ -0,0 +1,341 @@ +{ + "ALIASES": [ + "isobutane", + "Isobutane", + "ISOBUTANE", + "R600A", + "R600a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 407.817, + "Tmax": 407.81699999999915, + "Tmin": 113.73000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.025709437298837567, + "n": [ + 0.4893216106119911, + -6.629467799666135, + 0.27190214385479383, + -0.013142408151644676, + -3.250782332365992, + -0.43922387424664594 + ], + "reducing_value": 3629000.0, + "t": [ + 0.83, + 0.964, + 2.071, + 2.407, + 3.825, + 15.511 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 407.817, + "Tmax": 407.81699999999915, + "Tmin": 113.73000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019699846909193575, + "n": [ + -48.02915589537987, + 43.34653680580028, + -1.4421317283854331, + -3.1322275225078413, + 5.203481182010376, + -6.173022897817098 + ], + "reducing_value": 3629000.0, + "t": [ + 1.082, + 1.108, + 1.463, + 4.045, + 13.157, + 14.042 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 407.817, + "Tmax": 407.81699999999915, + "Tmin": 113.73000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.26628224832738745, + "n": [ + 2.0418147224188545, + 0.4363922893974425, + 1.915261424521202, + -2.1807762762122045, + 1.068664850362356, + -6.816247938174933 + ], + "reducing_value": 3879.756788283995, + "t": [ + 0.356, + 0.824, + 3.142, + 3.696, + 6.863, + 18.441 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 407.817, + "Tmax": 407.81699999999915, + "Tmin": 113.73000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4922366156330571, + "n": [ + -2.8656855559386294, + 0.7330458189287201, + -4.254613288675131, + 2.9956235180226516, + -5.671641417558254, + 0.14361022568133902 + ], + "reducing_value": 3879.756788283995, + "t": [ + 0.37, + 0.502, + 1.021, + 2.003, + 3.403, + 10.717 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 407.81, + "a": [ + -0.01639, + 0.06121 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 2.102, + 1.304 + ] + } + }, + "CAS": "75-28-5", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "IsoButane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Buecker-JPCRD-2006B", + "T_max": 575, + "T_max_units": "K", + "Ttriple": 113.73, + "Ttriple_units": "K", + "accentric": 0.183531783208, + "accentric_units": "-", + "alpha0": [ + { + "a1": 11.60865546, + "a2": -5.29450411, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.05956619, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.94641014, + 4.09475197, + 15.6632824, + 9.73918122 + ], + "t": [ + 0.951277902, + 2.387895885, + 4.346904269, + 10.36885864 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + }, + { + "a1": -17.60843812203014, + "a2": 10.31357488125467, + "type": "IdealGasEnthalpyEntropyOffset" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 4, + 4, + 1, + 1, + 2, + 7, + 8, + 8, + 1, + 2, + 3, + 3, + 4, + 5, + 5, + 10, + 2, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3 + ], + "n": [ + 2.0686820727966, + -3.6400098615204, + 0.51968754427244, + 0.17745845870123, + -0.12361807851599, + 0.045145314010528, + 0.03047647996598, + 0.75508387706302, + -0.85885381015629, + 0.036324009830684, + -0.01954879945055, + -0.004445239290496, + 0.004641076366646, + -0.071444097992825, + -0.080765060030713, + 0.15560460945053, + 0.0020318752160332, + -0.10624883571689, + 0.039807690546305, + 0.016371431292386, + 0.00053212200682628, + -0.0078681561156387, + -0.0030981191888963 + ], + "t": [ + 0.5, + 1, + 1.5, + 0, + 0.5, + 0.5, + 0.75, + 2, + 2.5, + 2.5, + 1.5, + 1, + 1.5, + 4, + 7, + 3, + 7, + 3, + 1, + 6, + 0, + 6, + 13 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 150, + 200 + ], + "d": [ + 1, + 2 + ], + "epsilon": [ + 0.85, + 1 + ], + "eta": [ + 10, + 10 + ], + "gamma": [ + 1.16, + 1.13 + ], + "n": [ + -0.042276036810382, + -0.0053001044558079 + ], + "t": [ + 2, + 0 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0581222, + "molar_mass_units": "kg/mol", + "p_max": 35000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.02287944697, + "ptriple_units": "Pa", + "reducing_state": { + "T": 407.817, + "T_units": "K", + "p": 3629000, + "p_units": "Pa", + "rhomolar": 3879.756788283995, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12737.63993166686, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.420164552028876e-05, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "IsoButane" +} \ No newline at end of file diff --git a/dev/fluids/IsoButene.json b/dev/fluids/IsoButene.json new file mode 100644 index 00000000..9f3ca344 --- /dev/null +++ b/dev/fluids/IsoButene.json @@ -0,0 +1,256 @@ +{ + "ALIASES": [ + "Isobutene", + "ISOBUTENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 418.09, + "Tmax": 418.08999999999907, + "Tmin": 132.4, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.14739891561160734, + "n": [ + 0.01737687722206489, + -6.134166125080951, + -3.853515831640818, + 8.384924413254762, + -243.10740943312803, + 365.4747247586171 + ], + "reducing_value": 4009800.0, + "t": [ + 0.354, + 0.969, + 4.231, + 10.316, + 16.968, + 18.914 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 418.09, + "Tmax": 418.08999999999907, + "Tmin": 132.4, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.14741018682782325, + "n": [ + -76.08135715558664, + 397.01813873870134, + -453.7794701448892, + 150.79295360094682, + -27.032450330527833, + -1.1837914833355219 + ], + "reducing_value": 4009800.0, + "t": [ + 1.284, + 1.548, + 1.685, + 2.003, + 2.638, + 10.608 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 418.09, + "Tmax": 418.08999999999907, + "Tmin": 132.4, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6248238395114569, + "n": [ + 3.836064588981606, + -8.505454480687774, + 12.985006905703951, + -10.011005004151073, + 5.376836540123832, + -10.94925598220989 + ], + "reducing_value": 4170.0, + "t": [ + 0.444, + 0.979, + 1.37, + 2.24, + 3.344, + 13.946 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 418.09, + "Tmax": 418.08999999999907, + "Tmin": 132.4, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.35084693470349704, + "n": [ + -8.729642476739642, + 6.811506526700638, + -6.411697069038467, + 5.7983193722867306, + -6.559199615514519, + -12.258975766186447 + ], + "reducing_value": 4170.0, + "t": [ + 0.507, + 0.607, + 1.205, + 1.898, + 3.194, + 18.774 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 418.09, + "a": [ + 0.0545 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.23 + ] + } + }, + "CAS": "115-11-7", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Isobutene", + "ODP": -1.0, + "PH": 2 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-FPE-2005", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 132.4, + "Ttriple_units": "K", + "accentric": 0.1925934521621, + "accentric_units": "-", + "alpha0": [ + { + "a1": -0.12737888, + "a2": 2.3125128, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.8924, + 7.832, + 7.2867, + 8.7293 + ], + "t": [ + 0.9543399746466072, + 3.037623478198474, + 4.795618168336961, + 9.60797914324667 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.77111, + -2.7971, + 1.0118, + 0.02073, + 0.085086, + 0.00021968, + 0.20633, + -0.078843, + -0.23726, + -0.080211, + -0.027001, + 0.013072 + ], + "t": [ + 0.12, + 1.3, + 1.74, + 2.1, + 0.28, + 0.69, + 0.75, + 2, + 4.4, + 4.7, + 15, + 14 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.05610631999999999, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.6761899733, + "ptriple_units": "Pa", + "reducing_state": { + "T": 418.09, + "T_units": "K", + "p": 4009800, + "p_units": "Pa", + "rhomolar": 4170, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 13666.73347813296, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0006143704326081906, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "IsoButene" +} \ No newline at end of file diff --git a/dev/fluids/Isohexane.json b/dev/fluids/Isohexane.json new file mode 100644 index 00000000..0a87dc82 --- /dev/null +++ b/dev/fluids/Isohexane.json @@ -0,0 +1,256 @@ +{ + "ALIASES": [ + "ihexane", + "ISOHEXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 497.7, + "Tmax": 497.6999999999989, + "Tmin": 119.60000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.08432429066262959, + "n": [ + 0.005399475579081403, + -0.9497359767020471, + -5.626629157486642, + -5.792071323162001, + 5.1034637608227875, + -4.718394261757678 + ], + "reducing_value": 3040000.0, + "t": [ + 0.17, + 0.876, + 0.993, + 4.223, + 6.496, + 8.675 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 497.7, + "Tmax": 497.6999999999989, + "Tmin": 119.60000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1841309490493548, + "n": [ + -6.550843209159344, + -0.2014408451919986, + -4.035853789894501, + 7.869057237839601, + -14.261734955415386, + 11.66884264219962 + ], + "reducing_value": 3040000.0, + "t": [ + 0.975, + 2.959, + 4.02, + 10.581, + 12.501, + 19.839 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 497.7, + "Tmax": 497.6999999999989, + "Tmin": 119.60000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11167499755682098, + "n": [ + 29.736674024252952, + -32.776310208283974, + 12.807786215246882, + -39.16424989170224, + 54.00461957755715, + -21.62958726811339 + ], + "reducing_value": 2715.0000000000005, + "t": [ + 0.607, + 0.679, + 1.285, + 2.085, + 2.358, + 2.566 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 497.7, + "Tmax": 497.6999999999989, + "Tmin": 119.60000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2247646109777679, + "n": [ + -3.4838373689586257, + -1.3801826623957218, + -0.41695283944559747, + -3.629169326872457, + -1.7995609906492396, + -3.545077267428688 + ], + "reducing_value": 2715.0000000000005, + "t": [ + 0.464, + 0.777, + 1.511, + 3.227, + 5.307, + 19.158 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 497.7, + "a": [ + 0.05024 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.194 + ] + } + }, + "CAS": "107-83-5", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Isohexane", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 119.6, + "Ttriple_units": "K", + "accentric": 0.2797, + "accentric_units": "-", + "alpha0": [ + { + "a1": 6.9259123919, + "a2": -0.3128629679, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.9127, + 16.871, + 19.257, + 14.075 + ], + "t": [ + 0.6530038175607796, + 2.310628892907374, + 4.816154309825196, + 11.84046614426361 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.1027, + -2.9699, + 1.0295, + -0.21238, + 0.11897, + 0.00027738, + 0.40103, + -0.034238, + -0.43584, + -0.11693, + -0.019262, + 0.0080783 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.08617535999999999, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7.673974446e-06, + "ptriple_units": "Pa", + "reducing_state": { + "T": 497.7, + "T_units": "K", + "p": 3040000, + "p_units": "Pa", + "rhomolar": 2715.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9370.770983488099, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 7.71968171674387e-09, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Isohexane" +} \ No newline at end of file diff --git a/dev/fluids/Isopentane.json b/dev/fluids/Isopentane.json new file mode 100644 index 00000000..36787f6d --- /dev/null +++ b/dev/fluids/Isopentane.json @@ -0,0 +1,257 @@ +{ + "ALIASES": [ + "ipentane", + "R601a", + "ISOPENTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 460.35, + "Tmax": 460.3499999999989, + "Tmin": 112.65000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.051564707572182567, + "n": [ + -6.666263491957704, + 0.4857997813609446, + 43.79186706759248, + -46.695896367051155, + -0.7987335343861153, + -2.152696717962993 + ], + "reducing_value": 3378000.0, + "t": [ + 0.984, + 1.34, + 3.251, + 3.271, + 6.059, + 15.448 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 460.35, + "Tmax": 460.3499999999989, + "Tmin": 112.65000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.016885314228098913, + "n": [ + -8.6020554503746, + 4.597427498957886, + -2.60028502453596, + -3.205323615957216, + 0.893056340939176, + -3.317655495530999 + ], + "reducing_value": 3378000.0, + "t": [ + 1.02, + 1.348, + 1.678, + 4.158, + 11.692, + 14.291 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 460.35, + "Tmax": 460.3499999999989, + "Tmin": 112.65000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5609059920063109, + "n": [ + 1.90090139367392, + 0.5608577220827222, + 0.291792033747788, + -0.22951340206902662, + 50.602054710991816, + -59.20907806248923 + ], + "reducing_value": 3271.0, + "t": [ + 0.335, + 0.852, + 2.009, + 4.806, + 14.584, + 15.417 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 460.35, + "Tmax": 460.3499999999989, + "Tmin": 112.65000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.1809305044249263, + "n": [ + -0.293842156388657, + -3.3757748736495574, + -2.160437982604624, + -8.713491274417024, + 4.916720756118398, + -0.9275607204099507 + ], + "reducing_value": 3271.0, + "t": [ + 0.192, + 0.477, + 1.313, + 5.085, + 6.047, + 14.238 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 460.35, + "a": [ + 0.051 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.209 + ] + } + }, + "CAS": "78-78-4", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Isopentane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 112.65, + "Ttriple_units": "K", + "accentric": 0.2274, + "accentric_units": "-", + "alpha0": [ + { + "a1": 2.5822330405, + "a2": 1.1609103419, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.4056, + 9.5772, + 15.765, + 12.119 + ], + "t": [ + 0.9601390246551537, + 2.409036602584989, + 4.494406429890301, + 9.108287172803301 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0963, + -3.0402, + 1.0317, + -0.1541, + 0.11535, + 0.00029809, + 0.39571, + -0.045881, + -0.35804, + -0.10107, + -0.035484, + 0.018156 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07214878, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 8.952745179e-05, + "ptriple_units": "Pa", + "reducing_state": { + "T": 460.35, + "T_units": "K", + "p": 3378000, + "p_units": "Pa", + "rhomolar": 3271, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 10935.8752298512, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 9.561583001422481e-08, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Isopentane" +} \ No newline at end of file diff --git a/dev/fluids/Krypton.json b/dev/fluids/Krypton.json new file mode 100644 index 00000000..c08fdb5c --- /dev/null +++ b/dev/fluids/Krypton.json @@ -0,0 +1,241 @@ +{ + "ALIASES": [ + "krypton", + "KRYPTON" + ], + "ANCILLARIES": { + "pL": { + "T_r": 209.48, + "Tmax": 209.4799999999995, + "Tmin": 115.77000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0157078121642229, + "n": [ + -4.031170740728375, + -7.4067462119583105, + 6.97753623737674, + -1.177175552979292, + -3320.220246352347, + 14166.599178573982 + ], + "reducing_value": 5525000.0, + "t": [ + 0.967, + 1.232, + 1.347, + 2.625, + 14.831, + 16.938 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 209.48, + "Tmax": 209.4799999999995, + "Tmin": 115.77000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009085871871139517, + "n": [ + 0.6286380394785566, + -6.084114621397644, + 0.9243637669284523, + -1.2177291623316775, + -484.84085075238977, + 2458.926650746003 + ], + "reducing_value": 5525000.0, + "t": [ + 0.822, + 0.961, + 1.811, + 2.937, + 13.131, + 15.629 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 209.48, + "Tmax": 209.4799999999995, + "Tmin": 115.77000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8307407005560208, + "n": [ + 2.546150113785161, + -5.378194265123711, + 8.373146326331726, + -116.81279901170906, + 18068.951065200818, + -1719409.740660462 + ], + "reducing_value": 10850.0, + "t": [ + 0.423, + 1.611, + 2.063, + 6.632, + 12.833, + 19.438 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 209.48, + "Tmax": 209.4799999999995, + "Tmin": 115.77000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.25111252948395446, + "n": [ + -5.11839525888464, + 1.8524855046540656, + -2.3327083913774804, + 5.670498376648386, + -13.437817551364956, + 2923.704628658189 + ], + "reducing_value": 10850.0, + "t": [ + 0.487, + 0.544, + 1.593, + 3.18, + 4.851, + 14.775 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 209.48, + "a": [ + 0.0447 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.245 + ] + } + }, + "CAS": "7439-90-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Krypton", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 750, + "T_max_units": "K", + "Ttriple": 115.77, + "Ttriple_units": "K", + "accentric": -0.00089, + "accentric_units": "-", + "alpha0": [ + { + "a1": -3.7506412806, + "a2": 3.7798018435, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.83561, + -2.3725, + 0.54567, + 0.014361, + 0.066502, + 0.0001931, + 0.16818, + -0.033133, + -0.15008, + -0.022897, + -0.021454, + 0.0069397 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.083798, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 73502.83748, + "ptriple_units": "Pa", + "reducing_state": { + "T": 209.48, + "T_units": "K", + "p": 5525000, + "p_units": "Pa", + "rhomolar": 10850, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 29197.23261176175, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 78.42355224696817, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Krypton" +} \ No newline at end of file diff --git a/dev/fluids/MD2M.json b/dev/fluids/MD2M.json new file mode 100644 index 00000000..bf07419e --- /dev/null +++ b/dev/fluids/MD2M.json @@ -0,0 +1,242 @@ +{ + "ALIASES": [ + "Decamethyltetrasiloxane", + "DECAMETHYLTETRASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 599.4, + "Tmax": 599.3999999999985, + "Tmin": 205.2, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015911818413938406, + "n": [ + -2.4298546077341765, + -8.21698111216424, + 10.985237560743148, + -10.371245604660867, + -6.479810115178545, + -7.618743506292183 + ], + "reducing_value": 1227000.0, + "t": [ + 0.947, + 1.036, + 1.62, + 1.908, + 3.756, + 13.562 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 599.4, + "Tmax": 599.3999999999985, + "Tmin": 205.2, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.044312950276337304, + "n": [ + 156.1113572601426, + -164.62126787390693, + 1.542332070759232, + -1.6595566560133137, + -7.331305000038265, + -3.9960179968946954 + ], + "reducing_value": 1227000.0, + "t": [ + 0.905, + 0.908, + 1.689, + 2.4, + 3.317, + 9.992 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 599.4, + "Tmax": 599.3999999999985, + "Tmin": 205.2, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7458599587937931, + "n": [ + 5.149366412867287, + -3.74559401424497, + 5.916251369639319, + -4.86398948926266, + 119.61817797890352, + -210.7258774176346 + ], + "reducing_value": 914.6616014999984, + "t": [ + 0.425, + 0.548, + 1.612, + 1.969, + 12.198, + 13.895 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 599.4, + "Tmax": 599.3999999999985, + "Tmin": 205.2, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.4890727440140417, + "n": [ + -0.11322403921855548, + -5.400575739692096, + -5.64304102079293, + -25.864491940816304, + 53.18850232422741, + -132.89980126138155 + ], + "reducing_value": 914.6616014999984, + "t": [ + 0.113, + 0.533, + 2.232, + 6.521, + 9.438, + 15.582 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "141-62-8", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MD2M", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2008", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 205.2, + "Ttriple_units": "K", + "accentric": 0.668, + "accentric_units": "-", + "alpha0": [ + { + "a1": -7.756334333038524, + "a2": 8.304835522982922, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 467.506025761878, + "Tc": 599.4, + "c": [ + 39.91834959574101, + 93.46354164160995, + 1813.8, + 62.70993515884111, + 795.1 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.33840331, + -2.62939393, + 0.4398383, + -0.53496715, + 0.1818844, + 0.00040774609, + 1.13444506, + 0.05774631, + -0.5917498, + -0.11020225, + -0.034942635, + 0.007646298 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.310685, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.000479509938, + "ptriple_units": "Pa", + "reducing_state": { + "T": 599.4, + "T_units": "K", + "p": 1227000, + "p_units": "Pa", + "rhomolar": 914.6616014999984, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3032.115488664193, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.811052609114695e-07, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MD2M" +} \ No newline at end of file diff --git a/dev/fluids/MD3M.json b/dev/fluids/MD3M.json new file mode 100644 index 00000000..8abeaa82 --- /dev/null +++ b/dev/fluids/MD3M.json @@ -0,0 +1,242 @@ +{ + "ALIASES": [ + "Dodecamethylpentasiloxane", + "DODECAMETHYLPENTASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 628.36, + "Tmax": 628.3599999999988, + "Tmin": 192.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.025890264817562958, + "n": [ + -10.453673923336904, + 2.481740868042947, + -11.432996001913109, + 6.601821622186919, + -5.964966309512551, + -7.694099935065695 + ], + "reducing_value": 945000.0, + "t": [ + 1.015, + 1.281, + 2.914, + 3.079, + 4.049, + 12.555 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 628.36, + "Tmax": 628.3599999999988, + "Tmin": 192.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.062049678581188594, + "n": [ + -8.949699956067297, + 0.4122742171095244, + -9.899582759727936, + 1.1051818846570594, + -10.457795793253178, + 11.86348703188236 + ], + "reducing_value": 945000.0, + "t": [ + 0.991, + 1.154, + 3.408, + 7.711, + 11.313, + 18.134 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 628.36, + "Tmax": 628.3599999999988, + "Tmin": 192.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9412402880123238, + "n": [ + 3.908835698000551, + -1.7671208917208399, + 9.16107326877534, + -11.915428003947813, + 5.425025736986464, + -2.1727181064864802 + ], + "reducing_value": 685.7981626999992, + "t": [ + 0.371, + 0.453, + 1.774, + 2.156, + 3.401, + 7.268 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 628.36, + "Tmax": 628.3599999999988, + "Tmin": 192.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.090311933515531, + "n": [ + 0.01880314261439147, + -2.1886134791566874, + -5.398887457148687, + 9.132545382573525, + -19.85612989152667, + -35.776997465430505 + ], + "reducing_value": 685.7981626999992, + "t": [ + 0.071, + 0.343, + 0.856, + 2.418, + 2.94, + 16.829 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "141-63-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MD3M", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2008", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 192, + "Ttriple_units": "K", + "accentric": 0.722, + "accentric_units": "-", + "alpha0": [ + { + "a1": -7.835183629103501, + "a2": 8.367692358068204, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 503.022623775204, + "Tc": 628.36, + "c": [ + 55.71009199381512, + 115.1245683430048, + 2117.1, + 88.79697953159261, + 908.5 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.20540386, + -2.42914797, + 0.69016432, + -0.69268041, + 0.18506046, + 0.00031161436, + 0.99862519, + 0.074229034, + -0.80259136, + -0.20865337, + -0.036461791, + 0.019174051 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.384839, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2.057747644e-07, + "ptriple_units": "Pa", + "reducing_state": { + "T": 628.36, + "T_units": "K", + "p": 945000, + "p_units": "Pa", + "rhomolar": 685.7981626999992, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2541.796114376564, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.289360613297565e-10, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MD3M" +} \ No newline at end of file diff --git a/dev/fluids/MD4M.json b/dev/fluids/MD4M.json new file mode 100644 index 00000000..527df0b9 --- /dev/null +++ b/dev/fluids/MD4M.json @@ -0,0 +1,240 @@ +{ + "ALIASES": [ + "Tetradecamethylhexasiloxane", + "TETRADECAMETHYLHEXASILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 653.2, + "Tmax": 653.1999999999987, + "Tmin": 300.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05180314650858886, + "n": [ + 0.0015071534393996235, + -9.893122006817906, + 5.185077005280204, + -11.792071053769893, + -19.9746561375169, + 17.061168452194554 + ], + "reducing_value": 877000.0, + "t": [ + 0.125, + 0.991, + 1.833, + 2.613, + 6.567, + 7.481 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 653.2, + "Tmax": 653.1999999999987, + "Tmin": 300.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2079082094630813, + "n": [ + -8.820757645392687, + -0.6127877907019101, + -26.27913889220715, + 82.26487645325933, + -215.38757534143105, + 3331.0966160078788 + ], + "reducing_value": 877000.0, + "t": [ + 0.966, + 2.034, + 4.287, + 6.824, + 9.507, + 17.511 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 653.2, + "Tmax": 653.1999999999987, + "Tmin": 300.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.555158530110734, + "n": [ + 0.4199342334140303, + 3.429189550022302, + -1.2153016662432385, + 531.3835498635794, + -2384171.350540733, + 2608505.566671457 + ], + "reducing_value": 606.0605999999999, + "t": [ + 0.108, + 0.596, + 0.925, + 11.068, + 18.766, + 18.948 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 653.2, + "Tmax": 653.1999999999987, + "Tmin": 300.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.5748730719093893, + "n": [ + 0.08238189107832351, + -2.7968804624045727, + -5.583554214981622, + -20.6920569486233, + 43.02594538959137, + -1155.2598160559462 + ], + "reducing_value": 606.0605999999999, + "t": [ + 0.153, + 0.35, + 0.973, + 4.373, + 8.956, + 18.867 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "107-52-8", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2006", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 214.15, + "Ttriple_units": "K", + "accentric": 0.8246471472642924, + "accentric_units": "-", + "alpha0": [ + { + "a1": -8.139550790894862, + "a2": 8.769441336438911, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 532.723355998617, + "Tc": 653.2, + "cp_over_R": -2.41398371417933, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 532.723355998617, + "Tc": 653.2, + "c": [ + 0.268026640777671, + -0.000157724988429812, + 3.44219091723443e-08 + ], + "t": [ + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.18492421, + -1.87465636, + -0.06571351, + -0.61812689, + 0.19535804, + 0.0005067874, + 1.23544082, + 0.049462708, + -0.73685283, + -0.19991438, + -0.055118673, + 0.028325885 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.45899328, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1.093376954, + "ptriple_units": "Pa", + "reducing_state": { + "T": 653.2, + "T_units": "K", + "p": 877470, + "p_units": "Pa", + "rhomolar": 622.3569399999996, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2.178681134503756e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.178681134503756e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MD4M" +} \ No newline at end of file diff --git a/dev/fluids/MDM.json b/dev/fluids/MDM.json new file mode 100644 index 00000000..249e3233 --- /dev/null +++ b/dev/fluids/MDM.json @@ -0,0 +1,242 @@ +{ + "ALIASES": [ + "Octamethyltrisiloxane", + "OCTAMETHYLTRISILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 564.09, + "Tmax": 564.0899999999991, + "Tmin": 187.2, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04186314366612098, + "n": [ + 7.151644754758889, + -14.810015370529984, + -15.36961787983751, + 8.076060116129836, + -3.6452117116809757, + -5.057768713626933 + ], + "reducing_value": 1415000.0, + "t": [ + 0.935, + 0.957, + 3.712, + 3.946, + 8.929, + 15.706 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 564.09, + "Tmax": 564.0899999999991, + "Tmin": 187.2, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.024851468537323562, + "n": [ + -7.936889046270078, + 0.4885306005155446, + -67.10334672914131, + 81.16754242307255, + -22.935610159360184, + -8.42878077834636 + ], + "reducing_value": 1415000.0, + "t": [ + 0.987, + 1.546, + 3.846, + 4.039, + 4.551, + 13.863 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 564.09, + "Tmax": 564.0899999999991, + "Tmin": 187.2, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.071265696090907, + "n": [ + 1.45291315657308, + 2.312272976677222, + -4.874255044402854, + 307.6934209444335, + -1382.6177281292519, + 4631.49982640604 + ], + "reducing_value": 1085.436621399999, + "t": [ + 0.223, + 0.968, + 3.92, + 10.353, + 13.555, + 19.388 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 564.09, + "Tmax": 564.0899999999991, + "Tmin": 187.2, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.1286811681511688, + "n": [ + -4.654136197604254, + 2.746428492946218, + -4.932262158034249, + -13.972748625767835, + 41.66694309398031, + -76.16608993524603 + ], + "reducing_value": 1085.436621399999, + "t": [ + 0.361, + 0.403, + 0.889, + 4.368, + 9.333, + 12.182 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "107-51-7", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MDM", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2008", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 187.2, + "Ttriple_units": "K", + "accentric": 0.5297, + "accentric_units": "-", + "alpha0": [ + { + "a1": -7.468857958439935, + "a2": 7.890869311590564, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 425.676967, + "Tc": 564.09, + "c": [ + 33.08688753777751, + 73.71484322756754, + 1829.6, + 49.67242658343187, + 802.6 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.19735372, + -2.40380622, + 0.3256564, + -0.19971259, + 0.11206277, + 0.00015893999, + 0.51234323, + -0.020660361, + -0.38978114, + -0.1186931, + -0.037203537, + 0.018359984 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.23653146, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.0007991110509, + "ptriple_units": "Pa", + "reducing_state": { + "T": 564.09, + "T_units": "K", + "p": 1415000, + "p_units": "Pa", + "rhomolar": 1085.436621399999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3930.818760661736, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 5.135191499435775e-07, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MDM" +} \ No newline at end of file diff --git a/dev/fluids/MM.json b/dev/fluids/MM.json new file mode 100644 index 00000000..4fc0eb23 --- /dev/null +++ b/dev/fluids/MM.json @@ -0,0 +1,251 @@ +{ + "ALIASES": [ + "Hexamethyldisiloxane", + "HEXAMETHYLDISILOXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 518.75, + "Tmax": 518.749999999999, + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.20111645182863125, + "n": [ + -6.066365670683859, + -1.017358368453696, + -1.2952535297950865, + -359.85773789162744, + 626.9902185535459, + -3052.796872382347 + ], + "reducing_value": 1939000.0, + "t": [ + 0.941, + 1.326, + 2.071, + 7.44, + 8.26, + 13.747 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 518.75, + "Tmax": 518.749999999999, + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.20111645178579884, + "n": [ + -1.9009492315036665, + -5.340645245910856, + -0.9843148559865389, + -6.609078226952975, + 347.0300616124387, + -6398.298737379578 + ], + "reducing_value": 1939000.0, + "t": [ + 0.855, + 1.041, + 2.576, + 4.341, + 11.815, + 16.363 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 518.75, + "Tmax": 518.749999999999, + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 17.956753927465808, + "n": [ + 10.867417370343293, + -26.426060451546014, + 247.0862159714223, + -573.747985737039, + 1763408.557605998, + -8586317.70489454 + ], + "reducing_value": 1589.825, + "t": [ + 0.712, + 1.429, + 3.552, + 4.879, + 15.966, + 18.374 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 518.75, + "Tmax": 518.749999999999, + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 16.01032229517174, + "n": [ + -7.501839129825876, + 109.24138401462254, + -471.55475994248695, + 1970.622943483528, + -204421.66641651493, + 484946.5588455783 + ], + "reducing_value": 1589.825, + "t": [ + 0.662, + 2.85, + 3.956, + 6.268, + 12.261, + 13.876 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "107-46-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "MM", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Colonna-FPE-2006", + "T_max": 673, + "T_max_units": "K", + "Ttriple": 204.93, + "Ttriple_units": "K", + "accentric": 0.418, + "accentric_units": "-", + "alpha0": [ + { + "a1": 8.673203925289393, + "a2": -6.135769396208712, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 373.400735665744, + "Tc": 518.69997204, + "cp_over_R": 6.24140654992885, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 373.400735665744, + "Tc": 518.69997204, + "c": [ + 0.0891626070783569, + -5.00332432414229e-05, + 8.41905535312405e-09 + ], + "t": [ + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.01686012, + -2.19713029, + 0.75443188, + -0.68003426, + 0.19082162, + 0.0010530133, + 0.6284595, + 0.030903042, + -0.83948727, + -0.20262381, + -0.035131597, + 0.025902341 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.16237752, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1316.986384, + "ptriple_units": "Pa", + "reducing_state": { + "T": 518.69997204, + "T_units": "K", + "p": 1939390, + "p_units": "Pa", + "rhomolar": 1874.67076, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 6.158487948331765e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 6.158487948331765e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MM" +} \ No newline at end of file diff --git a/dev/fluids/Methane.json b/dev/fluids/Methane.json new file mode 100644 index 00000000..5e7bcf08 --- /dev/null +++ b/dev/fluids/Methane.json @@ -0,0 +1,404 @@ +{ + "ALIASES": [ + "CH4", + "methane", + "METHANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 190.564, + "Tmax": 190.56399999999954, + "Tmin": 90.69410000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.013146758390991664, + "n": [ + -4.392486530162625, + -81.28318843036807, + 82.94698441608203, + -2.6879045537986053, + -5.671070893658749, + 4.700510293996553 + ], + "reducing_value": 4599200.0, + "t": [ + 0.963, + 1.421, + 1.438, + 1.98, + 6.338, + 6.911 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 190.564, + "Tmax": 190.56399999999954, + "Tmin": 90.69410000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0043709218045084874, + "n": [ + -0.36511751226395045, + -7.477611035699516, + 2.8218785804602344, + -0.3138277099613026, + -14.181166200304828, + 13.10811727353235 + ], + "reducing_value": 4599200.0, + "t": [ + 0.935, + 1.03, + 1.204, + 3.176, + 5.616, + 5.744 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 190.564, + "Tmax": 190.56399999999954, + "Tmin": 90.69410000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03816630998332293, + "n": [ + 1.0459450372370667, + 1.137482950365497, + 0.25267850508364803, + -0.15127345979918666, + 11.30484305385285, + -1807.5949062134612 + ], + "reducing_value": 10139.127999999999, + "t": [ + 0.309, + 0.502, + 1.402, + 3.858, + 10.533, + 19.547 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 190.564, + "Tmax": 190.56399999999954, + "Tmin": 90.69410000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.043503419703461166, + "n": [ + -3.258091004501641, + 24.278993697870174, + -25.256402428812585, + -0.17494067187770526, + 0.3375209723239743, + -2.3099699792209805 + ], + "reducing_value": 10139.127999999999, + "t": [ + 0.392, + 0.606, + 0.631, + 1.024, + 2.03, + 4.077 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 190.564, + "a": [ + 0.03825, + -0.006024, + -0.0007065 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.191, + 5.422, + 0.6161 + ] + } + }, + "CAS": "74-82-8", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 25.0, + "GWP20": 72.0, + "GWP500": 7.6, + "HH": 0, + "Name": "Methane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Setzmann-JPCRD-1991", + "T_max": 625, + "T_max_units": "K", + "Ttriple": 90.6941, + "Ttriple_units": "K", + "accentric": 0.01142, + "accentric_units": "-", + "alpha0": [ + { + "a1": 9.91243972, + "a2": -6.33270087, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.0016, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 0.008449, + 4.6942, + 3.4865, + 1.6572, + 1.4115 + ], + "t": [ + 3.400432401, + 10.26951575, + 20.43932747, + 29.93744884, + 79.13351945 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 4, + 4, + 8, + 9, + 10, + 1, + 1, + 1, + 2, + 4, + 5, + 6, + 1, + 2, + 3, + 4, + 4, + 3, + 5, + 5, + 8, + 2, + 3, + 4, + 4, + 4, + 5, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ], + "n": [ + 0.04367901028, + 0.6709236199, + -1.765577859, + 0.8582330241, + -1.206513052, + 0.512046722, + -0.0004000010791, + -0.01247842423, + 0.03100269701, + 0.001754748522, + -3.171921605e-06, + -2.24034684e-06, + 2.947056156e-07, + 0.1830487909, + 0.1511883679, + -0.4289363877, + 0.06894002446, + -0.01408313996, + -0.0306305483, + -0.02969906708, + -0.01932040831, + -0.1105739959, + 0.09952548995, + 0.008548437825, + -0.06150555662, + -0.04291792423, + -0.0181320729, + 0.0344590476, + -0.00238591945, + -0.01159094939, + 0.06641693602, + -0.0237154959, + -0.03961624905, + -0.01387292044, + 0.03389489599, + -0.002927378753 + ], + "t": [ + -0.5, + 0.5, + 1, + 0.5, + 1, + 1.5, + 4.5, + 0, + 1, + 3, + 1, + 3, + 3, + 0, + 1, + 2, + 0, + 0, + 2, + 2, + 5, + 5, + 5, + 2, + 4, + 12, + 8, + 10, + 10, + 10, + 14, + 12, + 18, + 22, + 18, + 14 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 200, + 250, + 250, + 250 + ], + "d": [ + 2, + 0, + 0, + 0 + ], + "epsilon": [ + 1, + 1, + 1, + 1 + ], + "eta": [ + 20, + 40, + 40, + 40 + ], + "gamma": [ + 1.07, + 1.11, + 1.11, + 1.11 + ], + "n": [ + 9.324799946e-05, + -6.287171518, + 12.71069467, + -6.423953466 + ], + "t": [ + 2, + 0, + 1, + 2 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0160428, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 11696.06412, + "ptriple_units": "Pa", + "reducing_state": { + "T": 190.564, + "T_units": "K", + "p": 4599200, + "p_units": "Pa", + "rhomolar": 10139.128, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 28141.83192295947, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 15.63154286998348, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Methane" +} \ No newline at end of file diff --git a/dev/fluids/Methanol.json b/dev/fluids/Methanol.json new file mode 100644 index 00000000..7a23bbfa --- /dev/null +++ b/dev/fluids/Methanol.json @@ -0,0 +1,299 @@ +{ + "ALIASES": [ + "methanol", + "METHANOL" + ], + "ANCILLARIES": { + "pL": { + "T_r": 512.5, + "Tmax": 512.4999999999987, + "Tmin": 175.61, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.616314584184563, + "n": [ + -0.06786072630620305, + 0.37064921000560125, + -3.6850178941332135, + -5.531504842398972, + -0.1261742218723768, + -1.6655134662275959 + ], + "reducing_value": 8215850.0, + "t": [ + 0.054, + 0.298, + 0.728, + 1.284, + 3.131, + 3.97 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 512.5, + "Tmax": 512.4999999999987, + "Tmin": 175.61, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.1479027322796709, + "n": [ + -0.0447244507994909, + 2.329401753678273, + -9.196622819856332, + -10.174860953774617, + 45.49763577474272, + -39.730762470567974 + ], + "reducing_value": 8215850.0, + "t": [ + 0.061, + 0.608, + 0.825, + 2.846, + 4.042, + 4.296 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 512.5, + "Tmax": 512.4999999999987, + "Tmin": 175.61, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 5.46722419332033, + "n": [ + 1.3068237510561265, + 70.59427259347439, + -189.29658717018955, + 1579.5702126119343, + -1503.171465635914, + 1224.7374907070093 + ], + "reducing_value": 8520.024867237415, + "t": [ + 0.182, + 2.205, + 2.877, + 4.603, + 4.808, + 17.68 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 512.5, + "Tmax": 512.4999999999987, + "Tmin": 175.61, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 5.061502849483923, + "n": [ + -1.4150575213461603, + 54.70138118736733, + -107.17903730678354, + 3012.9973099493213, + -2968.802266130763, + -23.433991775839367 + ], + "reducing_value": 8520.024867237415, + "t": [ + 0.155, + 0.626, + 0.74, + 1.164, + 1.17, + 15.066 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 513.38, + "a": [ + 0.22421, + -0.21408, + 0.083233 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.3355, + 1.677, + 4.4402 + ] + } + }, + "CAS": "67-56-1", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 2.8, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Methanol", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Piazza-FPE-2013", + "T_max": 580, + "T_max_units": "K", + "Ttriple": 175.61, + "Ttriple_units": "K", + "accentric": 0.5720322, + "accentric_units": "-", + "alpha0": [ + { + "a1": 13.9864114647, + "a2": 3200.6369296, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.1950423807804, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.585735321498174, + -0.06899642310301084, + 0.008650264506162275 + ], + "t": [ + -1, + -2, + -3 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 4.70118076896145 + ], + "t": [ + 3.7664265756 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 4, + 5, + 7, + 1, + 1, + 3, + 4, + 5, + 1, + 7, + 9, + 2, + 3, + 4, + 6, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 3 + ], + "n": [ + 0.096352729792779, + -1.0848826325874, + 0.029919647090261, + -0.0017963419593895, + 4.7354317752015e-05, + 1.0013578850486, + -1.2555691488591, + 0.854697257175, + -0.058295570793694, + 0.026935675584229, + 0.11504892676606, + -0.0051081766133636, + 0.0019167368789348, + -0.28618221186953, + 0.48168213019845, + -0.33081091251828, + 0.09284208331363, + -0.035936470747247 + ], + "t": [ + -0.125, + 1.5, + 0, + -0.875, + 1.25, + 0.25, + 2, + 1.75, + 2.5, + 2.375, + 6.875, + 5.875, + 5, + 18.5, + 19, + 17.5, + 14, + 12 + ], + "type": "ResidualHelmholtzPower" + }, + { + "a": 2, + "epsilonbar": 5.46341463, + "kappabar": 0.00148852832, + "m": 0.977118832, + "type": "ResidualHelmholtzAssociating", + "vbarn": 0.204481952 + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.03204216, + "molar_mass_units": "kg/mol", + "p_max": 500000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.1867637574, + "ptriple_units": "Pa", + "reducing_state": { + "T": 512.5, + "T_units": "K", + "p": 8215850, + "p_units": "Pa", + "rhomolar": 8520.024867237415, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 28227.34381723926, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0001279546715210285, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Methanol" +} \ No newline at end of file diff --git a/dev/fluids/MethylLinoleate.json b/dev/fluids/MethylLinoleate.json new file mode 100644 index 00000000..a5f59396 --- /dev/null +++ b/dev/fluids/MethylLinoleate.json @@ -0,0 +1,279 @@ +{ + "ALIASES": [ + "METHYLLINOLEATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 799.0, + "Tmax": 798.999999999998, + "Tmin": 260.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07264324475531048, + "n": [ + -11.729759799987315, + 5.322853500770345, + -3.812792691428419, + -5.15160188466974, + -6.055964294506463, + -15.97775168800555 + ], + "reducing_value": 1341000.0, + "t": [ + 1.011, + 1.432, + 2.308, + 3.026, + 4.993, + 11.346 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 799.0, + "Tmax": 798.999999999998, + "Tmin": 260.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1345092028781636, + "n": [ + -17.49464366704072, + 15.511858887435276, + -10.309720586604545, + -1.9170805644980973, + -9.188455129890633, + -32.94817697994078 + ], + "reducing_value": 1341000.0, + "t": [ + 1.073, + 1.412, + 2.055, + 2.984, + 5.287, + 15.159 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 799.0, + "Tmax": 798.999999999998, + "Tmin": 260.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9143880760876244, + "n": [ + -0.0228594977906372, + 42.06993524981283, + -74.81792414596138, + 55.25382502520959, + -21.334266315162196, + 3.1025069538411154 + ], + "reducing_value": 808.4, + "t": [ + 0.184, + 0.675, + 0.837, + 1.161, + 1.603, + 3.506 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 799.0, + "Tmax": 798.999999999998, + "Tmin": 260.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2849163068803673, + "n": [ + -7.912131975217505, + 2.6748252367096508, + -2.3670343724631104, + -6.595246957741222, + -9.264633405839822, + -78.68814362793601 + ], + "reducing_value": 808.4, + "t": [ + 0.546, + 0.747, + 1.49, + 2.948, + 5.104, + 18.424 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "112-63-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "MethylLinoleate", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Huber-EF-2009", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 238.1, + "Ttriple_units": "K", + "accentric": 0.8054063870556485, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 799, + "c": [ + 22.97031008102499 + ], + "t": [ + 0.020213 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 52.60358084073167, + 34.54482738049993, + 38.72236264672008 + ], + "t": [ + 3.81991239048811, + 0.9344568210262828, + 2.032953692115144 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.03183187, + 1.927286, + -3.685053, + 0.08449312, + -0.9766643, + -0.4323178, + 2.00047, + -1.75203, + -0.01726895 + ], + "t": [ + 1, + 0.2, + 1.2, + 1, + 2.2, + 2.5, + 1.8, + 1.92, + 1.47 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.9, + 0.65, + 0.75 + ], + "d": [ + 1, + 1, + 3 + ], + "epsilon": [ + 0.79, + 0.9, + 0.76 + ], + "eta": [ + 1.1, + 1.6, + 1.1 + ], + "gamma": [ + 1.14, + 0.65, + 0.77 + ], + "n": [ + 2.116515, + -0.7884271, + -0.3811699 + ], + "t": [ + 1.7, + 2.3, + 2.1 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.29447206, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7.719884129e-09, + "ptriple_units": "Pa", + "reducing_state": { + "T": 799, + "T_units": "K", + "p": 1341000, + "p_units": "Pa", + "rhomolar": 808.4, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3153.235854714205, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 3.900590310452233e-12, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MethylLinoleate" +} \ No newline at end of file diff --git a/dev/fluids/MethylLinolenate.json b/dev/fluids/MethylLinolenate.json new file mode 100644 index 00000000..e5dcbb57 --- /dev/null +++ b/dev/fluids/MethylLinolenate.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [ + "METHYLLINOLENATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 772.0, + "Tmax": 771.9999999999981, + "Tmin": 260.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.053345180846797735, + "n": [ + -25.171539708995944, + 21.300715242539297, + -10.547301052562263, + -5.070148438171643, + -8.2157358110308, + -17.156009546790635 + ], + "reducing_value": 1369000.0, + "t": [ + 1.067, + 1.304, + 2.092, + 3.573, + 8.295, + 16.56 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 772.0, + "Tmax": 771.9999999999981, + "Tmin": 260.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5470861476935207, + "n": [ + -10.101654974432517, + -12.424614583587427, + -9.022283253969261, + 467.2464970064283, + -630.9836783638218, + 508.3275711810897 + ], + "reducing_value": 1369000.0, + "t": [ + 0.933, + 3.57, + 7.793, + 10.595, + 11.348, + 17.586 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 772.0, + "Tmax": 771.9999999999981, + "Tmin": 260.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4636353248821057, + "n": [ + -3.4225866559516347, + 10.532089346925508, + 0.07661846074876404, + -8.087103457644357, + 4.322469536788842, + 17.275840082570898 + ], + "reducing_value": 847.3000000000001, + "t": [ + 0.451, + 0.512, + 0.614, + 0.912, + 1.32, + 15.284 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 772.0, + "Tmax": 771.9999999999981, + "Tmin": 260.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.926818751631453, + "n": [ + -2.012921006619591, + -9.777603995624053, + 16.334676098140577, + -44.688343682216974, + 150.07731250993606, + -135.66611431468743 + ], + "reducing_value": 847.3000000000001, + "t": [ + 0.443, + 0.755, + 1.565, + 2.595, + 4.024, + 4.333 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "301-00-8", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "MethylLinolenate", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Huber-EF-2009", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 218.65, + "Ttriple_units": "K", + "accentric": 1.142605258673496, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 772, + "c": [ + 9.572622290387171 + ], + "t": [ + 0.214648 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 34.92452677692582, + 9.794043446174333, + 57.11499178781286 + ], + "t": [ + 1.571554404145078, + 0.7496787564766839, + 3.626670984455958 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04070829, + 2.412375, + -3.756194, + -0.1526466, + 0.04682918, + -1.470958, + -0.76455, + 1.908964, + -1.629366, + -0.01242073 + ], + "t": [ + 1, + 0.15, + 1.24, + 1.6, + 1.28, + 2.9, + 3.15, + 2.16, + 2.8, + 1.4 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.9, + 0.65, + 0.75 + ], + "d": [ + 1, + 1, + 3 + ], + "epsilon": [ + 0.79, + 0.9, + 0.76 + ], + "eta": [ + 1.1, + 1.6, + 1.1 + ], + "gamma": [ + 1.14, + 0.65, + 0.77 + ], + "n": [ + 2.180707, + -0.7537264, + -0.4347781 + ], + "t": [ + 2.5, + 3, + 3.1 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.29245618, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 8.281383742e-12, + "ptriple_units": "Pa", + "reducing_state": { + "T": 772, + "T_units": "K", + "p": 1369000, + "p_units": "Pa", + "rhomolar": 847.3000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3281.983110581293, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 4.556783070257036e-15, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MethylLinolenate" +} \ No newline at end of file diff --git a/dev/fluids/MethylOleate.json b/dev/fluids/MethylOleate.json new file mode 100644 index 00000000..3d6cadf0 --- /dev/null +++ b/dev/fluids/MethylOleate.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [ + "METHYLOLEATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 782.0, + "Tmax": 781.9999999999984, + "Tmin": 253.47, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11174255597712346, + "n": [ + 14.372838414798984, + -25.63700682166794, + 6.6378551150443315, + -11.23105485250874, + -7.468648794751394, + -12.617144053602795 + ], + "reducing_value": 1246000.0, + "t": [ + 0.868, + 0.906, + 1.48, + 2.404, + 5.545, + 12.862 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 782.0, + "Tmax": 781.9999999999984, + "Tmin": 253.47, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.23214229920596186, + "n": [ + 0.2957281056815285, + -8.97309766389781, + 0.48815590360975863, + -11.34276864250449, + 1.3234559810331799, + -12.138231210442147 + ], + "reducing_value": 1246000.0, + "t": [ + 0.558, + 0.889, + 1.288, + 3.168, + 5.744, + 8.704 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 782.0, + "Tmax": 781.9999999999984, + "Tmin": 253.47, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6043177312483161, + "n": [ + -31.454521040135862, + 43.736786126817, + -12.491996989544091, + 23.664196742286585, + -120.4823599211856, + 101.35825428360955 + ], + "reducing_value": 812.8499999999999, + "t": [ + 0.506, + 0.525, + 0.762, + 2.134, + 2.905, + 3.06 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 782.0, + "Tmax": 781.9999999999984, + "Tmin": 253.47, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.5762205724130562, + "n": [ + -8.749977488567636, + 146.83338074209553, + -279.87451233611756, + 163.6376571116443, + -46.10327133274694, + -23.68509985467464 + ], + "reducing_value": 812.8499999999999, + "t": [ + 0.587, + 2.009, + 2.281, + 2.773, + 3.897, + 19.484 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "112-62-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "MethylOleate", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Huber-EF-2009", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 253.47, + "Ttriple_units": "K", + "accentric": 0.9058493599879012, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 782, + "c": [ + 10.85318466404121 + ], + "t": [ + 0.146118 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 28.23955628210667, + 40.38356254011078, + 51.91670619613609 + ], + "t": [ + 0.7845639386189258, + 1.797071611253197, + 3.667212276214834 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04596121, + 2.2954, + -3.554366, + -0.2291674, + 0.06854534, + -1.535778, + -0.7334697, + 1.7127, + -1.471394, + -0.01724678 + ], + "t": [ + 1, + 0.34, + 1.14, + 1.4, + 0.6, + 3.3, + 4.1, + 1.9, + 3.8, + 1.3 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.9, + 0.65, + 0.75 + ], + "d": [ + 1, + 1, + 3 + ], + "epsilon": [ + 0.79, + 0.9, + 0.76 + ], + "eta": [ + 1.1, + 1.6, + 1.1 + ], + "gamma": [ + 1.14, + 0.65, + 0.77 + ], + "n": [ + 2.11547, + -0.7555374, + -0.4134269 + ], + "t": [ + 3.4, + 3.8, + 4 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.29648794, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 3.781866105e-07, + "ptriple_units": "Pa", + "reducing_state": { + "T": 782, + "T_units": "K", + "p": 1246000, + "p_units": "Pa", + "rhomolar": 812.8499999999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3048.236151846261, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.794893849114351e-10, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MethylOleate" +} \ No newline at end of file diff --git a/dev/fluids/MethylPalmitate.json b/dev/fluids/MethylPalmitate.json new file mode 100644 index 00000000..4e9ab87b --- /dev/null +++ b/dev/fluids/MethylPalmitate.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [ + "METHYLPALMITATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 755.0, + "Tmax": 754.9999999999989, + "Tmin": 302.71, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1234212148595426, + "n": [ + -0.011940892490673904, + 7.849609411099398, + -16.067278854042087, + -0.6012546974739778, + -8.893944946368688, + -8.042731785344714 + ], + "reducing_value": 1350000.0, + "t": [ + 0.239, + 0.727, + 0.805, + 2.404, + 3.104, + 8.976 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 755.0, + "Tmax": 754.9999999999989, + "Tmin": 302.71, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06516577213850905, + "n": [ + -49.42161889019046, + 86.39453424481549, + -53.20027068141909, + 29.0638839763908, + -32.30173734463781, + -268.73594683826116 + ], + "reducing_value": 1350000.0, + "t": [ + 1.148, + 1.368, + 1.624, + 2.975, + 3.32, + 19.755 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 755.0, + "Tmax": 754.9999999999989, + "Tmin": 302.71, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5711439134841956, + "n": [ + 8.115113277917509, + -10.668602921854127, + 14.100804969050921, + -14.920857658639772, + 14.097757694754387, + -11.701003403802398 + ], + "reducing_value": 897.0, + "t": [ + 0.572, + 0.956, + 1.766, + 2.722, + 4.689, + 7.482 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 755.0, + "Tmax": 754.9999999999989, + "Tmin": 302.71, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.7980953783183873, + "n": [ + 4.227092755463742, + -12.213864670363002, + 2.57530354383432, + -18.011755302716594, + 8.945678039029339, + -44.300913375832856 + ], + "reducing_value": 897.0, + "t": [ + 0.489, + 0.54, + 1.177, + 3.065, + 4.389, + 11.027 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "112-39-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "MethylPalmitate", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Huber-EF-2009", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 302.71, + "Ttriple_units": "K", + "accentric": 0.910316178, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 755, + "c": [ + 14.49629032366697 + ], + "t": [ + 0.0801627 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 41.56848444495333, + 34.76324173080383, + 36.27879196658549 + ], + "t": [ + 3.910423841059603, + 0.9730503311258278, + 2.110662251655629 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04282821, + 2.443162, + -3.75754, + -0.1588526, + 0.0405599, + -1.52409, + -0.7686167, + 1.79995, + -1.590967, + -0.01267681 + ], + "t": [ + 1, + 0.36, + 1.22, + 1.45, + 0.7, + 3, + 3.9, + 2.2, + 2.9, + 1.25 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.9, + 0.65, + 0.75 + ], + "d": [ + 1, + 1, + 3 + ], + "epsilon": [ + 0.79, + 0.9, + 0.76 + ], + "eta": [ + 1.1, + 1.6, + 1.1 + ], + "gamma": [ + 1.14, + 0.65, + 0.77 + ], + "n": [ + 2.198347, + -0.7737211, + -0.431452 + ], + "t": [ + 2.6, + 3, + 3.2 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.27045066, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.01640128652, + "ptriple_units": "Pa", + "reducing_state": { + "T": 755, + "T_units": "K", + "p": 1350000, + "p_units": "Pa", + "rhomolar": 897, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 3181.439786123884, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 6.517312696695113e-06, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MethylPalmitate" +} \ No newline at end of file diff --git a/dev/fluids/MethylStearate.json b/dev/fluids/MethylStearate.json new file mode 100644 index 00000000..ddc304d0 --- /dev/null +++ b/dev/fluids/MethylStearate.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [ + "METHYLSTEARATE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 775.0, + "Tmax": 774.9999999999982, + "Tmin": 311.84, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.15764897185486237, + "n": [ + 2.6436427867349583, + -11.177503211907963, + -10.568451768935507, + 49.28771091585409, + -1399.884100808372, + 1433.3172721140306 + ], + "reducing_value": 1239000.0, + "t": [ + 0.664, + 0.819, + 3.044, + 9.45, + 11.829, + 12.153 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 775.0, + "Tmax": 774.9999999999982, + "Tmin": 311.84, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1336364373609178, + "n": [ + 2.1826956545780285, + -12.589076401149699, + 36.04270465112389, + -42.212867821373706, + -6.8647834615185905, + -3.7675034486843777 + ], + "reducing_value": 1239000.0, + "t": [ + 0.748, + 0.895, + 1.963, + 2.132, + 6.214, + 17.278 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 775.0, + "Tmax": 774.9999999999982, + "Tmin": 311.84, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5178991761328189, + "n": [ + 13.378627444826547, + -39.36472953109966, + 31.2494017978262, + -2.5577833084230965, + 1973.9623113227108, + -8032.142511402829 + ], + "reducing_value": 794.3, + "t": [ + 0.623, + 0.963, + 1.129, + 2.549, + 16.434, + 19.506 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 775.0, + "Tmax": 774.9999999999982, + "Tmin": 311.84, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.3802020091006062, + "n": [ + -10.55735551534245, + 7.1258533777053925, + -17.33588775317371, + 16.369396695687463, + -63.311014763601946, + 2762.728336814682 + ], + "reducing_value": 794.3, + "t": [ + 0.619, + 1.153, + 2.581, + 5.272, + 8.552, + 19.512 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "112-61-8", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "MethylStearate", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Huber-EF-2009", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 311.84, + "Ttriple_units": "K", + "accentric": 1.01756, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 775, + "c": [ + 29.72106947981784 + ], + "t": [ + -0.0916606 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 33.30818842134534, + 49.19097688945251, + 56.85291862189204 + ], + "t": [ + 0.7176387096774193, + 1.692709677419355, + 3.646077419354839 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.03959635, + 2.466654, + -3.89595, + -0.1167375, + 0.04127229, + -1.403734, + -0.6465264, + 1.934675, + -1.608124, + -0.01113813 + ], + "t": [ + 1, + 0.3, + 1.25, + 1.65, + 0.8, + 3.1, + 3.4, + 2.3, + 3.8, + 1.2 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.9, + 0.65, + 0.75 + ], + "d": [ + 1, + 1, + 3 + ], + "epsilon": [ + 0.79, + 0.9, + 0.76 + ], + "eta": [ + 1.1, + 1.6, + 1.1 + ], + "gamma": [ + 1.14, + 0.65, + 0.77 + ], + "n": [ + 2.125325, + -0.7772671, + -0.4183684 + ], + "t": [ + 3.2, + 3.8, + 3.8 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.29850382, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.006010947189, + "ptriple_units": "Pa", + "reducing_state": { + "T": 775, + "T_units": "K", + "p": 1239000, + "p_units": "Pa", + "rhomolar": 794.3, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2851.430203644649, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.318621202355879e-06, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "MethylStearate" +} \ No newline at end of file diff --git a/dev/fluids/Neon.json b/dev/fluids/Neon.json new file mode 100644 index 00000000..dec83e34 --- /dev/null +++ b/dev/fluids/Neon.json @@ -0,0 +1,313 @@ +{ + "ALIASES": [ + "neon", + "NEON" + ], + "ANCILLARIES": { + "pL": { + "T_r": 44.4918, + "Tmax": 44.49179999999988, + "Tmin": 24.56000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03657147800688598, + "n": [ + -0.0017954742954479522, + -5.7544156318060145, + 10.008689055942176, + -9.753815610717622, + 3.2233602357652944, + -76.50213334811278 + ], + "reducing_value": 2680000.0, + "t": [ + 0.076, + 1.009, + 2.164, + 2.343, + 6.682, + 12.207 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 44.4918, + "Tmax": 44.49179999999988, + "Tmin": 24.56000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.017457744592808133, + "n": [ + -0.00074500795037099, + -3.682372301668146, + -9.78153179091002, + 4.096945170441814, + -2.9886393690120436, + 7.178339654951069 + ], + "reducing_value": 2680000.0, + "t": [ + 0.019, + 0.9, + 1.026, + 1.808, + 2.247, + 0.954 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 44.4918, + "Tmax": 44.49179999999988, + "Tmin": 24.56000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.43961955076889936, + "n": [ + 0.22207659869985238, + 2.4573200546328224, + -1969.4302835894664, + 6749.387057643627, + -4813.477464106806, + 591.6954480241219 + ], + "reducing_value": 23882.0, + "t": [ + 0.361, + 0.489, + 3.226, + 3.371, + 3.443, + 9.965 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 44.4918, + "Tmax": 44.49179999999988, + "Tmin": 24.56000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.15713045396883452, + "n": [ + -1.3474639960955583, + -2.7571994490012472, + 0.009650364682861507, + 2.0354003457571044, + -3.227001419324544, + 122.46077167651404 + ], + "reducing_value": 23882.0, + "t": [ + 0.408, + 0.648, + 1.315, + 2.286, + 2.901, + 11.792 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 44.4918, + "a": [ + 0.012254, + 0.02728, + -0.025715 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.4136, + 1.4517, + 1.6567 + ] + } + }, + "CAS": "7440-01-9", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Neon", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Katti-ACE-1986", + "T_max": 723, + "T_max_units": "K", + "Ttriple": 24.56, + "Ttriple_units": "K", + "accentric": -0.0384492992736859, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 6, + 6, + 6, + 1, + 2, + 2, + 2, + 2, + 2, + 4, + 8, + 8, + 8, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 2, + 2, + 4, + 6, + 6, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + 3.532653449, + -4.513954384, + -0.1524027959, + 2.188568609, + -7.44299997, + 7.755627402, + -3.122553128, + 1.014206899, + -0.05289214086, + 0.1566849239, + -0.222852705, + -0.01410150942, + 0.07036229719, + -0.05882048367, + 0.01571172741, + 0.001292202769, + 0.0007902035603, + -0.0003794403616, + 0.04652799333, + 0.04524001818, + -0.2383421991, + 0.00629359013, + -0.001272313644, + -1.75235256e-07, + 0.007188419232, + -0.05403006914, + 0.07578222187, + -0.03808588254, + 0.006034022431 + ], + "t": [ + 0.5, + 0.75, + 3.5, + 0.5, + 0.75, + 1, + 1.5, + 2.5, + 0.25, + 0.5, + 2.5, + 1, + 3, + 4, + 5, + 1, + 5, + 6, + 4, + 1, + 5, + 8, + 12, + 32, + 10, + 6, + 7, + 8, + 9 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31434, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.020179, + "molar_mass_units": "kg/mol", + "p_max": 700000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 43432.0764, + "ptriple_units": "Pa", + "reducing_state": { + "T": 44.4918, + "T_units": "K", + "p": 2680000, + "p_units": "Pa", + "rhomolar": 23882, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 62060.12963247318, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 220.1827660676654, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Neon" +} \ No newline at end of file diff --git a/dev/fluids/Neopentane.json b/dev/fluids/Neopentane.json new file mode 100644 index 00000000..6d7fd9ff --- /dev/null +++ b/dev/fluids/Neopentane.json @@ -0,0 +1,245 @@ +{ + "ALIASES": [ + "neopentn", + "NEOPENTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 433.74, + "Tmax": 433.73999999999927, + "Tmin": 256.6, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.011877907135438015, + "n": [ + 1.4023117580169653, + -7.971208710752704, + 2.5306662744660664, + -3.6491716187944356, + -72.03663743646202, + 323.50182182555415 + ], + "reducing_value": 3196000.0, + "t": [ + 0.973, + 0.987, + 1.865, + 2.411, + 9.003, + 11.534 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 433.74, + "Tmax": 433.73999999999927, + "Tmin": 256.6, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009973909412830384, + "n": [ + -7.502312156089728, + 11.000117855992295, + -400.6256764267208, + 433.78538017962705, + -45.58182775735909, + -0.7322302008433458 + ], + "reducing_value": 3196000.0, + "t": [ + 1.011, + 1.701, + 2.3, + 2.345, + 2.698, + 6.49 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 433.74, + "Tmax": 433.73999999999927, + "Tmin": 256.6, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.546133509156399, + "n": [ + 2.811511709838611, + -0.6819933999019258, + 143.31340246450836, + -250.44132450192117, + 324.6743119533206, + -196312.80251857708 + ], + "reducing_value": 3270.0, + "t": [ + 0.385, + 0.435, + 3.763, + 4.175, + 6.202, + 16.14 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 433.74, + "Tmax": 433.73999999999927, + "Tmin": 256.6, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6012535915160933, + "n": [ + -3.7861930152056065, + 8.462476541870759, + -339.50200633681567, + 403.5197007430728, + -111.52402460892499, + 41.26753585967676 + ], + "reducing_value": 3270.0, + "t": [ + 0.423, + 1.041, + 1.753, + 1.863, + 2.594, + 3.606 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "463-82-1", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Neopentane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 256.6, + "Ttriple_units": "K", + "accentric": 0.1961, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0.8702452614, + "a2": 1.6071746358, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 14.422, + 12.868, + 17.247, + 12.663 + ], + "t": [ + 1.636925346982063, + 3.977036934569097, + 7.562133997325587, + 17.9531516576751 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.1136, + -3.1792, + 1.1411, + -0.10467, + 0.11754, + 0.00034058, + 0.29553, + -0.074765, + -0.31474, + -0.099401, + -0.039569, + 0.023177 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07214878, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 35400.94733, + "ptriple_units": "Pa", + "reducing_state": { + "T": 433.74, + "T_units": "K", + "p": 3196000, + "p_units": "Pa", + "rhomolar": 3270, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8701.706626683947, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 16.95177504859362, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Neopentane" +} \ No newline at end of file diff --git a/dev/fluids/Nitrogen.json b/dev/fluids/Nitrogen.json new file mode 100644 index 00000000..a053552e --- /dev/null +++ b/dev/fluids/Nitrogen.json @@ -0,0 +1,389 @@ +{ + "ALIASES": [ + "nitrogen", + "NITROGEN", + "N2" + ], + "ANCILLARIES": { + "pL": { + "T_r": 126.192, + "Tmax": 126.19199999999978, + "Tmin": 63.15100000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.005700555888288328, + "n": [ + 7.557523110967278, + -15.31423072093374, + 2.530452363947435, + -3.5464937257192077, + 2.4443140451500853, + -1.089727092432518 + ], + "reducing_value": 3395800.0, + "t": [ + 0.945, + 0.976, + 1.134, + 4.43, + 4.942, + 6.222 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 126.192, + "Tmax": 126.19199999999978, + "Tmin": 63.15100000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01945481293909035, + "n": [ + 2.1205259142559174, + -7.392634943403662, + -0.035642342804864474, + -35.2799454218023, + 37.082077471298724, + -429.32504477212177 + ], + "reducing_value": 3395800.0, + "t": [ + 0.828, + 0.92, + 1.504, + 6.063, + 6.367, + 17.079 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 126.192, + "Tmax": 126.19199999999978, + "Tmin": 63.15100000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.045724092678578465, + "n": [ + 3.423788275604014, + -2.9664673074957677, + 12.095926119341373, + -13.681823050784574, + 4.19110684294756, + -0.6241396008655289 + ], + "reducing_value": 11183.901464580624, + "t": [ + 0.396, + 0.549, + 1.037, + 1.209, + 1.682, + 2.819 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 126.192, + "Tmax": 126.19199999999978, + "Tmin": 63.15100000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.09890104355763096, + "n": [ + -2.412387653165135, + 1.2535963572601478, + -6.375300212535008, + 3.257106728291224, + -3.263645679265735, + 1.2673447905058262 + ], + "reducing_value": 11183.901464580624, + "t": [ + 0.369, + 0.556, + 0.878, + 1.049, + 4.174, + 6.303 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 126.192, + "a": [ + 0.02898 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.246 + ] + } + }, + "CAS": "7727-37-9", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Nitrogen", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Span-JPCRD-2000", + "T_max": 1100, + "T_max_units": "K", + "Ttriple": 63.151, + "Ttriple_units": "K", + "accentric": 0.0372, + "accentric_units": "-", + "alpha0": [ + { + "a1": -12.76952708, + "a2": -0.00784163, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.0001934819, + -1.247742e-05, + 6.678326e-08 + ], + "t": [ + -1, + -2, + -3 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 1.012941 + ], + "t": [ + 26.65788 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 2, + 3, + 3, + 1, + 1, + 1, + 3, + 3, + 4, + 6, + 6, + 7, + 7, + 8, + 8, + 1, + 2, + 3, + 4, + 5, + 8, + 4, + 5, + 5, + 8, + 3, + 5, + 6, + 9 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4 + ], + "n": [ + 0.924803575275, + -0.492448489428, + 0.661883336938, + -1.92902649201, + -0.0622469309629, + 0.349943957581, + 0.564857472498, + -1.61720005987, + -0.481395031883, + 0.421150636384, + -0.0161962230825, + 0.172100994165, + 0.00735448924933, + 0.0168077305479, + -0.00107626664179, + -0.0137318088513, + 0.000635466899859, + 0.00304432279419, + -0.0435762336045, + -0.0723174889316, + 0.0389644315272, + -0.021220136391, + 0.00408822981509, + -5.51990017984e-05, + -0.0462016716479, + -0.00300311716011, + 0.0368825891208, + -0.0025585684622, + 0.00896915264558, + -0.0044151337035, + 0.00133722924858, + 0.000264832491957 + ], + "t": [ + 0.25, + 0.875, + 0.5, + 0.875, + 0.375, + 0.75, + 0.5, + 0.75, + 2, + 1.25, + 3.5, + 1, + 0.5, + 3, + 0, + 2.75, + 0.75, + 2.5, + 4, + 6, + 6, + 3, + 3, + 6, + 16, + 11, + 15, + 12, + 12, + 7, + 4, + 16 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 325, + 325, + 300, + 275 + ], + "d": [ + 1, + 1, + 3, + 2 + ], + "epsilon": [ + 1, + 1, + 1, + 1 + ], + "eta": [ + 20, + 20, + 15, + 25 + ], + "gamma": [ + 1.16, + 1.16, + 1.13, + 1.25 + ], + "n": [ + 19.6688194015, + -20.911560073, + 0.0167788306989, + 2627.67566274 + ], + "t": [ + 0, + 1, + 2, + 3 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.02801348, + "molar_mass_units": "kg/mol", + "p_max": 2200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 12519.78349, + "ptriple_units": "Pa", + "reducing_state": { + "T": 126.192, + "T_units": "K", + "p": 3395800, + "p_units": "Pa", + "rhomolar": 11183.90146458062, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 30957.16390402974, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 24.07364223019857, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Nitrogen" +} \ No newline at end of file diff --git a/dev/fluids/NitrousOxide.json b/dev/fluids/NitrousOxide.json new file mode 100644 index 00000000..427bda4c --- /dev/null +++ b/dev/fluids/NitrousOxide.json @@ -0,0 +1,254 @@ +{ + "ALIASES": [ + "N2O", + "NITROUSOXIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 309.52, + "Tmax": 309.51999999999924, + "Tmin": 182.33, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006797151133386414, + "n": [ + -24.198485663914695, + 18.980157921169518, + -0.9915637584760082, + -3.6052256452535647, + 52.20126113055801, + -340.2395463889685 + ], + "reducing_value": 7245000.0, + "t": [ + 1.06, + 1.105, + 1.754, + 4.415, + 9.887, + 12.55 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 309.52, + "Tmax": 309.51999999999924, + "Tmin": 182.33, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.008317995318263272, + "n": [ + 2.115457947739384, + -17.675380864870732, + -0.29834585629296156, + -2.0057540709496644, + -5.223431208153363, + 9.982409851956168 + ], + "reducing_value": 7245000.0, + "t": [ + 0.985, + 1.029, + 1.616, + 3.337, + 7.323, + 1.092 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 309.52, + "Tmax": 309.51999999999924, + "Tmin": 182.33, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6835792444787825, + "n": [ + 2.248014962727216, + 1354.8814407985476, + -227009237.43183637, + 312935961.0720787, + -139155040.7743576, + 295107831.0429585 + ], + "reducing_value": 10270.000000000002, + "t": [ + 0.374, + 6.796, + 13.027, + 13.205, + 14.362, + 18.638 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 309.52, + "Tmax": 309.51999999999924, + "Tmin": 182.33, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5406788216657077, + "n": [ + -3.439484106428665, + -35.87348642351084, + 98.43310989645504, + -173.87569213455475, + 30857.724063434925, + -31916.967231256218 + ], + "reducing_value": 10270.000000000002, + "t": [ + 0.428, + 2.405, + 3.115, + 4.433, + 8.312, + 8.395 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 309.52, + "a": [ + 0.07087 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.204 + ] + } + }, + "CAS": "10024-97-2", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": 320.0, + "GWP20": 290.0, + "GWP500": 180.0, + "HH": 1, + "Name": "NitrousOxide", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 182.33, + "Ttriple_units": "K", + "accentric": 0.1613, + "accentric_units": "-", + "alpha0": [ + { + "a1": -4.4262736272, + "a2": 4.3120475243, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.1769, + 1.6145, + 0.48393 + ], + "t": [ + 2.839881106229, + 7.663478935125356, + 17.598216593435 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.88045, + -2.4235, + 0.38237, + 0.068917, + 0.00020367, + 0.13122, + 0.46032, + -0.0036985, + -0.23263, + -0.00042859, + -0.04281, + -0.023038 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0440128, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 87837.43923, + "ptriple_units": "Pa", + "reducing_state": { + "T": 309.52, + "T_units": "K", + "p": 7245000, + "p_units": "Pa", + "rhomolar": 10270, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 28113.36563491833, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 59.33941145458979, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "NitrousOxide" +} \ No newline at end of file diff --git a/dev/fluids/OrthoDeuterium.json b/dev/fluids/OrthoDeuterium.json new file mode 100644 index 00000000..743c9ee4 --- /dev/null +++ b/dev/fluids/OrthoDeuterium.json @@ -0,0 +1,324 @@ +{ + "ALIASES": [ + "orthodeuterium", + "ORTHODEUTERIUM" + ], + "ANCILLARIES": { + "pL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01391576136706707, + "n": [ + -5.262999856493507, + 5.457197954850728, + -6.429778369950024, + 3.0415926191682754, + -2.0017870289626956, + 70.16578895208772 + ], + "reducing_value": 1679600.0, + "t": [ + 0.993, + 1.968, + 2.363, + 3.2, + 6.243, + 15.496 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.005249129888240667, + "n": [ + -5.962797925166512, + 6.758820005764522, + -5.349436200589799, + 0.6830724644326415, + -321.7646727432708, + 338.2279808105484 + ], + "reducing_value": 1679600.0, + "t": [ + 1.011, + 1.564, + 1.694, + 2.339, + 12.299, + 12.417 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.021925540249734254, + "n": [ + 0.7561385728476524, + 7.456420463900972, + -7.667110838528095, + 31.91516196841129, + -55.84889038663615, + 25.60708660267712 + ], + "reducing_value": 17230.0, + "t": [ + 0.433, + 0.632, + 0.773, + 2.187, + 2.427, + 2.681 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.10580823435766273, + "n": [ + 0.2331216679164502, + -3.698059063742354, + 0.4327794907483545, + -0.5108769415735642, + 2131.2963725894447, + -3924.052231017246 + ], + "reducing_value": 17230.0, + "t": [ + 0.324, + 0.491, + 1.733, + 2.191, + 15.506, + 16.417 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "7782-39-0o", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Richardson-JPCRD-2013", + "T_max": 600, + "T_max_units": "K", + "Ttriple": 18.724, + "Ttriple_units": "K", + "accentric": -0.136290274128, + "accentric_units": "-", + "alpha0": [ + { + "a1": -2.0672670563, + "a2": 2.4234599781, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.04482, + -4.65391, + -4.65342, + 3.46313, + -4.58637, + -4.6503, + -4.65124, + 2.67024, + 15.20455, + 0.87164, + -4.7608, + 4.32447 + ], + "t": [ + 41.49713093375065, + 12.56129368805425, + 12.32133541992697, + 9.447052686489306, + 53.15597287428273, + 12.08137715179969, + 12.81429316640584, + 70.77203964527908, + 16.13458528951487, + 225.4042775169536, + 25.08346374543558, + 6.604068857589984 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 2, + 1, + 1, + 3, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2 + ], + "n": [ + 0.006267958, + 10.53609, + -10.14149, + 0.356061, + 0.1824472, + -1.129638, + -0.0549812, + -0.6791329, + 1.347918, + -0.8657582, + 1.719146, + -1.917977, + 0.1233365, + -0.07936891 + ], + "t": [ + 1, + 0.462, + 0.5584, + 0.627, + 1.201, + 0.309, + 1.314, + 1.1166, + 1.25, + 1.25, + 1.395, + 1.627, + 1, + 2.5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.613, + 0.584, + 0.57, + 1.056, + 1.01, + 1.025, + 1.029 + ], + "d": [ + 1, + 1, + 2, + 3, + 3, + 1, + 3 + ], + "epsilon": [ + 1.46, + 1.7864, + 1.647, + 0.541, + 0.969, + 1.892, + 1.076 + ], + "eta": [ + 0.868, + 0.636, + 0.668, + 0.65, + 0.745, + 0.782, + 0.693 + ], + "gamma": [ + 0.6306, + 0.711, + 0.6446, + 0.8226, + 0.992, + 1.2184, + 1.203 + ], + "n": [ + 1.686617, + -4.240326, + 1.857114, + -0.5903705, + 1.520171, + 2.361373, + -2.297315 + ], + "t": [ + 0.635, + 0.664, + 0.7082, + 2.25, + 1.524, + 0.67, + 0.709 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.3144621, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0040282, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 17189.10197, + "ptriple_units": "Pa", + "reducing_state": { + "T": 38.34, + "T_units": "K", + "p": 1679600, + "p_units": "Pa", + "rhomolar": 17230, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 43350.35393172985, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 113.0018950964478, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "OrthoDeuterium" +} \ No newline at end of file diff --git a/dev/fluids/OrthoHydrogen.json b/dev/fluids/OrthoHydrogen.json new file mode 100644 index 00000000..ddd2e47f --- /dev/null +++ b/dev/fluids/OrthoHydrogen.json @@ -0,0 +1,286 @@ +{ + "ALIASES": [ + "Orthohydrogen", + "orthohydrogen", + "ORTHOHYDROGEN" + ], + "ANCILLARIES": { + "pL": { + "T_r": 33.22, + "Tmax": 33.219999999999914, + "Tmin": 14.00800000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06277012886128919, + "n": [ + -0.4051801286153231, + 0.5191529685153068, + -5.56347522818482, + 1.367651950727407, + 1.056012360297995, + -65.2720474474213 + ], + "reducing_value": 1310650.0, + "t": [ + 0.379, + 0.414, + 0.981, + 1.167, + 2.476, + 19.461 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 33.22, + "Tmax": 33.219999999999914, + "Tmin": 14.00800000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06281070255100829, + "n": [ + -0.01809737585938931, + -6.272811023425992, + 151.4750625680904, + -156.18520413754467, + 8.016830127130035, + -8.808230339483577 + ], + "reducing_value": 1310650.0, + "t": [ + 0.326, + 1.064, + 1.831, + 1.854, + 2.235, + 14.653 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 33.22, + "Tmax": 33.219999999999914, + "Tmin": 14.00800000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6624202435855819, + "n": [ + 2.136450368934771, + -9.434919244344163, + 26.99798420654703, + -73.87428692906634, + 2629.366529054487, + -5124.043586289661 + ], + "reducing_value": 15444.540313699812, + "t": [ + 0.434, + 2.592, + 3.597, + 6.068, + 12.269, + 14.145 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 33.22, + "Tmax": 33.219999999999914, + "Tmin": 14.00800000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2875409563637854, + "n": [ + -2.8577182299300046, + -0.2847217806996385, + 9.9579128118112, + -1243.1260029157054, + 26776.321922476538, + -40285.08539752482 + ], + "reducing_value": 15444.540313699812, + "t": [ + 0.48, + 0.716, + 6.39, + 12.856, + 16.87, + 18.364 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "1333-74-0o", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "OrthoHydrogen", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Leachman-JPCRD-2009", + "T_max": 1000, + "T_max_units": "K", + "Ttriple": 14.008, + "Ttriple_units": "K", + "accentric": -0.219, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.4675442336, + "a2": 1.8845068862, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.54151, + -2.3661, + 1.00365, + 1.22447 + ], + "t": [ + 25.7676098736, + 43.4677904877, + 66.044551475, + 209.7531607465 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "n": [ + -6.83148, + 0.01, + 2.11505, + 4.38353, + 0.211292, + -1.00939, + 0.142086, + -0.87696, + 0.804927 + ], + "t": [ + 0.7333, + 1, + 1.1372, + 0.5136, + 0.5638, + 1.6248, + 1.829, + 2.404, + 2.105 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.4555, + 0.4046, + 0.0869, + 0.4415, + 0.5743 + ], + "d": [ + 2, + 1, + 3, + 1, + 1 + ], + "epsilon": [ + 0.6366, + 0.3876, + 0.9437, + 0.3976, + 0.9626 + ], + "eta": [ + 1.169, + 0.894, + 0.04, + 2.072, + 1.306 + ], + "gamma": [ + 1.5444, + 0.6627, + 0.763, + 0.6587, + 1.4327 + ], + "n": [ + -0.710775, + 0.0639688, + 0.0710858, + -0.087654, + 0.647088 + ], + "t": [ + 4.1, + 7.658, + 1.259, + 7.589, + 3.946 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.00201594, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7559.882341, + "ptriple_units": "Pa", + "reducing_state": { + "T": 33.22, + "T_units": "K", + "p": 1310650, + "p_units": "Pa", + "rhomolar": 15444.54031369981, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 38198.76565183698, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 65.87296564338153, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "OrthoHydrogen" +} \ No newline at end of file diff --git a/dev/fluids/Oxygen.json b/dev/fluids/Oxygen.json new file mode 100644 index 00000000..11e025b4 --- /dev/null +++ b/dev/fluids/Oxygen.json @@ -0,0 +1,362 @@ +{ + "ALIASES": [ + "oxygen", + "OXYGEN", + "O2" + ], + "ANCILLARIES": { + "pL": { + "T_r": 154.581, + "Tmax": 154.58099999999973, + "Tmin": 54.361000000000004, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.018600358905673797, + "n": [ + -5.590128802487688, + -5.726699763580528, + 9.483733165630566, + -3.928354204707163, + -1.5836756097644333, + 2.304993294039141 + ], + "reducing_value": 5043000.0, + "t": [ + 0.987, + 1.824, + 1.928, + 2.334, + 5.893, + 13.163 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 154.581, + "Tmax": 154.58099999999973, + "Tmin": 54.361000000000004, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.004247266065049438, + "n": [ + -7.645535357219451, + 2.4214288702883655, + 9.642620060548747, + -10.094822869854763, + -1.6856689587691926, + 1.2776407609527567 + ], + "reducing_value": 5043000.0, + "t": [ + 1.019, + 1.177, + 2.44, + 2.493, + 5.646, + 10.887 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 154.581, + "Tmax": 154.58099999999973, + "Tmin": 54.361000000000004, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.31331179756071137, + "n": [ + 2.398534228348317, + -0.9602489731250617, + 4.608521959548032, + -4.459907685966375, + 1.4756239105744295, + -71.13005503778817 + ], + "reducing_value": 13630.0, + "t": [ + 0.398, + 0.86, + 1.704, + 2.122, + 4.266, + 18.786 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 154.581, + "Tmax": 154.58099999999973, + "Tmin": 54.361000000000004, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.30847172850669846, + "n": [ + -4.045898237284726, + 13.351580368749335, + -13.257394903986311, + -0.5839929431960236, + -2.395023810536666, + -4.561062605120816 + ], + "reducing_value": 13630.0, + "t": [ + 0.311, + 0.407, + 0.472, + 1.701, + 4.684, + 16.677 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 154.581, + "a": [ + 0.03843 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.225 + ] + } + }, + "CAS": "7782-44-7", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Oxygen", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Stewart-JPCRD-1991", + "T_max": 300, + "T_max_units": "K", + "Ttriple": 54.361, + "Ttriple_units": "K", + "accentric": 0.0222, + "accentric_units": "-", + "alpha0": [ + { + "a1": -20.50872815151507, + "a2": 6.753607739210779, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 154.581, + "c": [ + 1.06778, + 1.66961e-08 + ], + "t": [ + -1.5, + 2 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "T0": 298.15, + "Tc": 154.581, + "cp_over_R": 3.50042, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "n": [ + 1.01258 + ], + "t": [ + 14.50663406240094 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + }, + { + "c": [ + 0.6666666666666666 + ], + "n": [ + 0.944365 + ], + "t": [ + 74.91476960299131 + ], + "type": "IdealGasHelmholtzPlanckEinstein2" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 3, + 6, + 7, + 7, + 8, + 1, + 1, + 2, + 2, + 3, + 3, + 5, + 6, + 7, + 8, + 10, + 2, + 3, + 3, + 4, + 4, + 5, + 5, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ], + "n": [ + 0.3983768749, + -1.846157454, + 0.4183473197, + 0.02370620711, + 0.09771730573, + 0.03017891294, + 0.02273353212, + 0.01357254086, + -0.04052698943, + 0.0005454628515, + 0.0005113182277, + 2.953466883e-07, + -8.687645072e-05, + -0.2127082589, + 0.08735941958, + 0.127550919, + -0.09067701064, + -0.03540084206, + -0.03623278059, + 0.0132769929, + -0.0003254111865, + -0.008313582932, + 0.002124570559, + -0.0008325206232, + -2.626173276e-05, + 0.002599581482, + 0.009984649663, + 0.002199923153, + -0.02591350486, + -0.1259630848, + 0.1478355637, + -0.01011251078 + ], + "t": [ + 0, + 1.5, + 2.5, + -0.5, + 1.5, + 2, + 0, + 1, + 2.5, + 0, + 2, + 5, + 2, + 5, + 6, + 3.5, + 5.5, + 3, + 7, + 6, + 8.5, + 4, + 6.5, + 5.5, + 22, + 11, + 18, + 11, + 23, + 17, + 18, + 23 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31434, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0319988, + "molar_mass_units": "kg/mol", + "p_max": 80000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 146.277647, + "ptriple_units": "Pa", + "reducing_state": { + "T": 154.581, + "T_units": "K", + "p": 5043000, + "p_units": "Pa", + "rhomolar": 13630, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 40816.30337657147, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.3237995947960466, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Oxygen" +} \ No newline at end of file diff --git a/dev/fluids/ParaDeuterium.json b/dev/fluids/ParaDeuterium.json new file mode 100644 index 00000000..c10ccbe5 --- /dev/null +++ b/dev/fluids/ParaDeuterium.json @@ -0,0 +1,322 @@ +{ + "ALIASES": [ + "paradeuterium", + "PARADEUTERIUM" + ], + "ANCILLARIES": { + "pL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.004632576840690739, + "n": [ + -6.007823964368566, + 4.54319186236637, + -2.68220724969741, + 0.42739425880451554, + -0.8211897181703741, + 0.6219573673883285 + ], + "reducing_value": 1679600.0, + "t": [ + 1.012, + 1.516, + 1.678, + 3.29, + 6.442, + 8.917 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006871751081183319, + "n": [ + -6.560659054008582, + 2.3036870497088002, + 0.27016327917666433, + 0.1350815782586835, + -83.68402702066768, + 995.8259450035017 + ], + "reducing_value": 1679600.0, + "t": [ + 1.019, + 1.291, + 1.525, + 3.658, + 14.387, + 18.851 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.052780414966924205, + "n": [ + 5.337218502231972, + -37.730569203923736, + 56.189484760644554, + -21.538412148225337, + -0.63373056265043, + 48.064086849218086 + ], + "reducing_value": 17230.0, + "t": [ + 0.558, + 0.941, + 0.992, + 1.011, + 4.008, + 13.336 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 38.34, + "Tmax": 38.33999999999991, + "Tmin": 18.72400000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07653504228355423, + "n": [ + -1.9157967271957959, + -2.9712091246582273, + 237.43334304651742, + -236.01792469812253, + 4664.0401630139195, + -8793.218613656329 + ], + "reducing_value": 17230.0, + "t": [ + 0.494, + 0.62, + 1.003, + 1.005, + 19.21, + 19.85 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "7782-39-0p", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Richardson-JPCRD-2013", + "T_max": 600, + "T_max_units": "K", + "Ttriple": 18.724, + "Ttriple_units": "K", + "accentric": -0.136290274128, + "accentric_units": "-", + "alpha0": [ + { + "a1": -2.0683998716, + "a2": 2.4241000701, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.28527, + 1.11376, + -2.491, + 6.38763, + 6.17406, + -3.13698, + -3.14254, + -2.29511, + -3.37, + 1.13634, + 0.72512 + ], + "t": [ + 132.1857068335941, + 26.10328638497652, + 6.820552947313511, + 11.40323422013563, + 8.145539906103286, + 9.984350547730829, + 9.30620761606677, + 7.686489306207615, + 17.79864371413667, + 6.416275430359937, + 7.227438706311946 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 2, + 1, + 1, + 3, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2 + ], + "n": [ + 0.006267958, + 10.53609, + -10.14149, + 0.356061, + 0.1824472, + -1.129638, + -0.0549812, + -0.6791329, + 1.347918, + -0.8657582, + 1.719146, + -1.917977, + 0.1233365, + -0.07936891 + ], + "t": [ + 1, + 0.462, + 0.5584, + 0.627, + 1.201, + 0.309, + 1.314, + 1.1166, + 1.25, + 1.25, + 1.395, + 1.627, + 1, + 2.5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.613, + 0.584, + 0.57, + 1.056, + 1.01, + 1.025, + 1.029 + ], + "d": [ + 1, + 1, + 2, + 3, + 3, + 1, + 3 + ], + "epsilon": [ + 1.46, + 1.7864, + 1.647, + 0.541, + 0.969, + 1.892, + 1.076 + ], + "eta": [ + 0.868, + 0.636, + 0.668, + 0.65, + 0.745, + 0.782, + 0.693 + ], + "gamma": [ + 0.6306, + 0.711, + 0.6446, + 0.8226, + 0.992, + 1.2184, + 1.203 + ], + "n": [ + 1.686617, + -4.240326, + 1.857114, + -0.5903705, + 1.520171, + 2.361373, + -2.297315 + ], + "t": [ + 0.635, + 0.664, + 0.7082, + 2.25, + 1.524, + 0.67, + 0.709 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.3144621, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0040282, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 17189.10197, + "ptriple_units": "Pa", + "reducing_state": { + "T": 38.34, + "T_units": "K", + "p": 1679600, + "p_units": "Pa", + "rhomolar": 17230, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 43350.35393172985, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 113.0018950964478, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "ParaDeuterium" +} \ No newline at end of file diff --git a/dev/fluids/ParaHydrogen.json b/dev/fluids/ParaHydrogen.json new file mode 100644 index 00000000..677524bb --- /dev/null +++ b/dev/fluids/ParaHydrogen.json @@ -0,0 +1,303 @@ +{ + "ALIASES": [ + "Parahydrogen", + "parahydrogen", + "PARAHYDROGEN" + ], + "ANCILLARIES": { + "pL": { + "T_r": 32.938, + "Tmax": 32.93799999999992, + "Tmin": 13.80330000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0174798204880533, + "n": [ + -2.332391071635025, + -3.9319881688087577, + 2.7199573469254177, + 1.0763302954693428, + -0.9726696103840476, + 4.031438860139397 + ], + "reducing_value": 1285800.0, + "t": [ + 0.935, + 1.151, + 1.456, + 3.851, + 5.737, + 13.549 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 32.938, + "Tmax": 32.93799999999992, + "Tmin": 13.80330000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0025443700352290044, + "n": [ + 0.1490037759465196, + -4.78237888041144, + 1.5087203071678434, + -0.880650150281499, + 1.2942713948220537, + -0.3877150898692146 + ], + "reducing_value": 1285800.0, + "t": [ + 0.852, + 0.986, + 1.827, + 2.355, + 3.05, + 4.286 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 32.938, + "Tmax": 32.93799999999992, + "Tmin": 13.80330000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.37627402632863793, + "n": [ + 2.42209314197553, + -0.8105757647156946, + 5.292441752641816, + -801.4099838859875, + 965.4158391322754, + -2288.927990716296 + ], + "reducing_value": 15538.0, + "t": [ + 0.44, + 0.833, + 4.399, + 8.501, + 8.893, + 17.08 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 32.938, + "Tmax": 32.93799999999992, + "Tmin": 13.80330000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.051284406798368654, + "n": [ + -5.1023908882756785, + 15.472633152203006, + -25.539938117401427, + 65.8971290411631, + -53.56192274807538, + -9.178291109165437 + ], + "reducing_value": 15538.0, + "t": [ + 0.533, + 1.001, + 1.276, + 1.876, + 1.958, + 19.379 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 32.938, + "a": [ + 0.005314 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.06 + ] + } + }, + "CAS": "1333-74-0p", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "ParaHydrogen", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Leachman-JPCRD-2009", + "T_max": 1000, + "T_max_units": "K", + "Ttriple": 13.8033, + "Ttriple_units": "K", + "accentric": -0.219, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.4485891134, + "a2": 1.884521239, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.30256, + 13.0289, + -47.7365, + 50.0013, + -18.6261, + 0.993973, + 0.536078 + ], + "t": [ + 15.14967511472, + 25.0925982148, + 29.4735563787, + 35.4059141417, + 40.724998482, + 163.7925799988, + 309.2173173842 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "n": [ + -7.33375, + 0.01, + 2.60375, + 4.66279, + 0.68239, + -1.47078, + 0.135801, + -1.05327, + 0.328239 + ], + "t": [ + 0.6855, + 1, + 1, + 0.489, + 0.774, + 1.133, + 1.386, + 1.619, + 1.162 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.194, + 0.2019, + 0.0301, + 0.2383, + 0.3253 + ], + "d": [ + 2, + 1, + 3, + 1, + 1 + ], + "epsilon": [ + 1.5487, + 0.1785, + 1.28, + 0.6319, + 1.7104 + ], + "eta": [ + 1.7437, + 0.5516, + 0.0634, + 2.1341, + 1.777 + ], + "gamma": [ + 0.8048, + 1.5248, + 0.6648, + 0.6832, + 1.493 + ], + "n": [ + -0.0577833, + 0.0449743, + 0.0703464, + -0.0401766, + 0.11951 + ], + "t": [ + 3.96, + 5.276, + 0.99, + 6.791, + 3.19 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.00201588, + "molar_mass_units": "kg/mol", + "p_max": 2000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7041.086751, + "ptriple_units": "Pa", + "reducing_state": { + "T": 32.938, + "T_units": "K", + "p": 1285800, + "p_units": "Pa", + "rhomolar": 15538, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 38184.94839776529, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 62.31256337798966, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "ParaHydrogen" +} \ No newline at end of file diff --git a/dev/fluids/Propylene.json b/dev/fluids/Propylene.json new file mode 100644 index 00000000..f2de18d5 --- /dev/null +++ b/dev/fluids/Propylene.json @@ -0,0 +1,336 @@ +{ + "ALIASES": [ + "propylene", + "PROPYLENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 364.211, + "Tmax": 364.2109999999991, + "Tmin": 87.95300000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.039256968605339004, + "n": [ + 0.001133775984851922, + -5.98182751110803, + 3.6974583382927824, + -5.973792950295522, + -0.7589187509838732, + -0.9162432153073952 + ], + "reducing_value": 4555000.0, + "t": [ + 0.189, + 0.977, + 2.913, + 3.289, + 6.805, + 18.129 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 364.211, + "Tmax": 364.2109999999991, + "Tmin": 87.95300000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.02358382509746182, + "n": [ + -6.15754746767542, + 0.8043847738472081, + -2.629218877933464, + -20.055797246021456, + 23.93889034404838, + -5.927221357425409 + ], + "reducing_value": 4555000.0, + "t": [ + 0.985, + 1.914, + 3.354, + 8.871, + 9.472, + 12.201 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 364.211, + "Tmax": 364.2109999999991, + "Tmin": 87.95300000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.15187793211883793, + "n": [ + 1.1500616940414559, + 0.7037673936905474, + 0.6950815609799416, + 1.8850870474961088, + -2.1702211585216302, + 2.21238242151199 + ], + "reducing_value": 5457.0, + "t": [ + 0.286, + 0.521, + 0.701, + 5.657, + 6.864, + 15.279 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 364.211, + "Tmax": 364.2109999999991, + "Tmin": 87.95300000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.931595165746768, + "n": [ + -5.13562614673855, + 4.2053374767917395, + -8.021462611933476, + 4.971018368148577, + -4.664302402572978, + -1.7964631156271889 + ], + "reducing_value": 5457.0, + "t": [ + 0.42, + 0.56, + 1.051, + 1.479, + 3.598, + 16.862 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 364.211, + "a": [ + 0.05268 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.186 + ] + } + }, + "CAS": "115-07-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.1, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Propylene", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-PROPYLENE-2013", + "T_max": 575, + "T_max_units": "K", + "Ttriple": 87.953, + "Ttriple_units": "K", + "accentric": 0.146, + "accentric_units": "-", + "alpha0": [ + { + "a1": 4.9916462, + "a2": -0.1709449, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.544, + 4.013, + 8.923, + 6.02 + ], + "t": [ + 0.8895942187358427, + 2.671528317376466, + 5.304617378387802, + 11.85301926630442 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 2, + 3, + 1, + 1, + 3, + 2, + 2, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04341002, + 1.136592, + -0.8528611, + 0.5216669, + -1.382953, + 0.1214347, + -0.5984662, + -1.391883, + -1.008434, + 0.1961249, + -0.360693, + -0.002407175 + ], + "t": [ + 1, + 0.205, + 0.56, + 0.676, + 1, + 0.5, + 1, + 1.94, + 2, + 1, + 2.66, + 0.83 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 0.77, + 0.83, + 0.607, + 0.4, + 0.66, + 0.07, + 3.1, + 387, + 41 + ], + "d": [ + 1, + 1, + 2, + 3, + 3, + 2, + 1, + 2, + 3 + ], + "epsilon": [ + 0.78, + 0.82, + 1.94, + 0.69, + 1.96, + 1.3, + 0.38, + 0.91, + 0.7 + ], + "eta": [ + 1.07, + 0.66, + 1.2, + 1.12, + 1.47, + 1.93, + 3.3, + 15.4, + 6 + ], + "gamma": [ + 1.21, + 1.08, + 0.83, + 0.56, + 1.22, + 1.81, + 1.54, + 1.12, + 1.4 + ], + "n": [ + 0.7432121, + 0.1475162, + -0.02503391, + -0.2734409, + 0.006378889, + 0.0150294, + -0.03162971, + -0.04107194, + -1.190241 + ], + "t": [ + 1.6, + 2.5, + 3, + 2.5, + 2.72, + 4, + 4, + 1, + 4 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.04207974, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.0007471728687, + "ptriple_units": "Pa", + "reducing_state": { + "T": 364.211, + "T_units": "K", + "p": 4555000, + "p_units": "Pa", + "rhomolar": 5457, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 18254.53452723806, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.022108934557587e-06, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Propylene" +} \ No newline at end of file diff --git a/dev/fluids/Propyne.json b/dev/fluids/Propyne.json new file mode 100644 index 00000000..8d04dfd0 --- /dev/null +++ b/dev/fluids/Propyne.json @@ -0,0 +1,319 @@ +{ + "ALIASES": [ + "propyne", + "PROPYNE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 402.38, + "Tmax": 402.37999999999914, + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.012366531953733606, + "n": [ + 0.4371507863196512, + -6.66393075926699, + -0.2170324722957424, + 13.288458369708717, + -24.057488658628785, + 1855841.7713583934 + ], + "reducing_value": 5626000.0, + "t": [ + 0.775, + 0.959, + 1.864, + 4.493, + 5.159, + 19.1 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 402.38, + "Tmax": 402.37999999999914, + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.012297710682296348, + "n": [ + 0.0025352410381648404, + -0.03566614580246839, + -6.474512126273843, + 0.4178712360656155, + -1.9479103016021955, + -342.07305237113997 + ], + "reducing_value": 5626000.0, + "t": [ + 0.243, + 0.628, + 0.992, + 1.949, + 5.259, + 11.136 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 402.38, + "Tmax": 402.37999999999914, + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.7690932219500133, + "n": [ + 0.676908949567043, + 42.124365852994195, + -52.6498660929799, + 148.86365466555566, + -17709.824791659536, + 71543.36247766066 + ], + "reducing_value": 6113.33, + "t": [ + 0.175, + 1.172, + 1.358, + 3.662, + 7.586, + 9.174 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 402.38, + "Tmax": 402.37999999999914, + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6935914353018102, + "n": [ + -5.066155131330643, + 1779.1130020151943, + -1782.2051460501207, + 4.756104080644848, + -2.3713377912727562, + 59.371736976095974 + ], + "reducing_value": 6113.33, + "t": [ + 0.192, + 0.32, + 0.321, + 0.498, + 1.309, + 7.491 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 402.38, + "a": [ + 0.05801 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.205 + ] + } + }, + "CAS": "74-99-7", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "Propyne", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "Polt-CT-1992", + "BibTeX_EOS": "Polt-CT-1992", + "T_max": 474, + "T_max_units": "K", + "Ttriple": 170.5, + "Ttriple_units": "K", + "accentric": 0.204, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 402.38, + "c": [ + 1.649840044261093, + 0.02333952849909193, + -1.673911795340558e-05, + 6.980952359188388e-09, + -1.29200161168108e-12 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + -0.986950667682466, + 4.59528109357232, + -8.86063623531859, + 5.56346955560542, + -1.57450028544218, + -0.15906875357343, + 0.235738270184042, + 0.440755494598713, + 0.196126150614333, + -0.367759650330219, + 0.00792931851007852, + 0.00247509085735293, + 0.00832903610194452, + 1.02590136933231, + -2.20786016506394, + 1.07889905203761 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 1.65533788, + 1.65533788, + 1.65533788, + 1.65533788, + 1.65533788, + 1.65533788 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -3.821884669859, + 8.30345065618981, + -4.4832307260286, + -1.02590136933231, + 2.20786016506394, + -1.07889905203761 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.3143, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.04006000000000001, + "molar_mass_units": "kg/mol", + "p_max": 31800000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 263566.906, + "ptriple_units": "Pa", + "reducing_state": { + "T": 402.38, + "T_units": "K", + "p": 5626000, + "p_units": "Pa", + "rhomolar": 6113.33, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 2.496255616575137e+100, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.496255616575137e+100, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Propyne" +} \ No newline at end of file diff --git a/dev/fluids/R11.json b/dev/fluids/R11.json new file mode 100644 index 00000000..891985dd --- /dev/null +++ b/dev/fluids/R11.json @@ -0,0 +1,274 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 471.06, + "Tmax": 471.059999999999, + "Tmin": 162.68, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2990936295608648, + "n": [ + 0.15114864227309924, + -1.0362484013166429, + -9.85652324799686, + 5.929859019171377, + -3.5450486869633306, + -1.2411439744310455 + ], + "reducing_value": 4394000.0, + "t": [ + 0.304, + 0.575, + 1.226, + 1.624, + 3.082, + 5.897 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 471.06, + "Tmax": 471.059999999999, + "Tmin": 162.68, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.19454432710005465, + "n": [ + 0.026052457505876248, + -0.033251769926668874, + -6.052567442811702, + -1.7491910863188018, + -2.0497996257474944, + 21.07044968037653 + ], + "reducing_value": 4394000.0, + "t": [ + 0.093, + 0.18, + 0.971, + 3.426, + 5.452, + 19.676 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 471.06, + "Tmax": 471.059999999999, + "Tmin": 162.68, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.003831744982589, + "n": [ + -233.14334396615303, + 275.8122390016742, + -42.633467921464685, + 4.723326547469123, + -6.867921570223379, + 7.76091118506622 + ], + "reducing_value": 4113.0394269407725, + "t": [ + 0.46, + 0.473, + 0.584, + 1.778, + 4.107, + 6.191 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 471.06, + "Tmax": 471.059999999999, + "Tmin": 162.68, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.960628784139631, + "n": [ + -4.24333237177487, + -0.4078731288745647, + -2.249917886647205, + -5.523383725068134, + 815.8186908904237, + -2149.920110111276 + ], + "reducing_value": 4113.0394269407725, + "t": [ + 0.506, + 0.881, + 2.875, + 5.942, + 17.127, + 19.889 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 471.11, + "a": [ + 0.06212 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.247 + ] + } + }, + "CAS": "75-69-4", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 4750.0, + "GWP20": 6730.0, + "GWP500": 1620.0, + "HH": 1, + "Name": "R11", + "ODP": 1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Jacobsen-FPE-1992", + "BibTeX_EOS": "Span-IJT-2003C", + "T_max": 595, + "T_max_units": "K", + "Ttriple": 162.68, + "Ttriple_units": "K", + "accentric": 0.1887506482528083, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 471.11, + "cp_over_R": 4.00564923248634, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 298, + "Tc": 471.11, + "c": [ + 0.0002228874581905608 + ], + "t": [ + 1 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 1, + 2, + 1, + 2, + 1, + 2 + ], + "t": [ + 3.313613168898983, + 2.586756086688884, + 1.634512228566577, + 1.215500498821931, + 1.06738046316147, + 0.7360191462715714 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.0656383, + -3.2495206, + 0.87823894, + 0.087611569, + 0.00029950049, + 0.42896949, + 0.70828452, + -0.017391823, + -0.37626522, + 0.011605284, + -0.089550567, + -0.030063991 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.137368, + "molar_mass_units": "kg/mol", + "p_max": 100000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 6.691548081, + "ptriple_units": "Pa", + "reducing_state": { + "T": 471.06, + "T_units": "K", + "p": 4394000, + "p_units": "Pa", + "rhomolar": 4113.039426940773, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12962.56328885987, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.004947861179952363, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R11" +} \ No newline at end of file diff --git a/dev/fluids/R113.json b/dev/fluids/R113.json new file mode 100644 index 00000000..4199c075 --- /dev/null +++ b/dev/fluids/R113.json @@ -0,0 +1,277 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 487.21, + "Tmax": 487.2099999999988, + "Tmin": 236.93, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015131489392194997, + "n": [ + 0.8302534329379594, + -7.180276103826055, + 2.042384576535874, + -3.4631098858651277, + -4.982016715257017, + 8.069342331962437 + ], + "reducing_value": 3392200.0, + "t": [ + 0.835, + 0.953, + 4.22, + 7.025, + 3.741, + 11.923 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 487.21, + "Tmax": 487.2099999999988, + "Tmin": 236.93, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.00783381539131156, + "n": [ + -7.513797278929454, + 1.5095312092676123, + -1.9699733346499353, + 1.7578730760232852, + -4.592035089583662, + -0.41772646096774985 + ], + "reducing_value": 3392200.0, + "t": [ + 1.0, + 1.296, + 2.592, + 3.34, + 4.285, + 10.465 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 487.21, + "Tmax": 487.2099999999988, + "Tmin": 236.93, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8556608708030877, + "n": [ + 2.1209299719499692, + 0.306929802490948, + 107.2647341968565, + -840.5575578947821, + 1870.9104273285336, + -1779.2226056266804 + ], + "reducing_value": 2988.6591060707137, + "t": [ + 0.344, + 0.621, + 4.847, + 6.255, + 7.527, + 9.355 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 487.21, + "Tmax": 487.2099999999988, + "Tmin": 236.93, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2213635863523744, + "n": [ + -53.51591930070364, + 1179.0791709251655, + -1132.4832595523026, + 1.7901473308750928, + -6.764890888618531, + 2.256439191313591 + ], + "reducing_value": 2988.6591060707137, + "t": [ + 0.547, + 0.639, + 0.644, + 1.238, + 3.962, + 5.593 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 487.21, + "a": [ + 0.0556 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.24 + ] + } + }, + "CAS": "76-13-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 6130.0, + "GWP20": 6540.0, + "GWP500": 2700.0, + "HH": 1, + "Name": "R113", + "ODP": 1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Marx-BOOK-1992", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 236.93, + "Ttriple_units": "K", + "accentric": 0.252535, + "accentric_units": "-", + "alpha0": [ + { + "a1": 13.1479282, + "a2": -5.4053715, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.9999966, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 12.4464495, + 2.72181845, + 0.692712415, + 3.32248298 + ], + "t": [ + 1.04971737, + 3.29788641, + 8.62650812, + 3.29670446 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 3, + 4, + 8, + 8, + 3, + 3, + 3, + 5, + 1, + 2, + 2, + 9, + 3, + 7, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 4 + ], + "n": [ + 0.8432092286, + -2.019185967, + 0.2920612996, + 0.05323107661, + 0.003214971931, + 4.667858574e-05, + -1.227522799e-06, + 0.8167288718, + -1.340790803, + 0.4065752705, + -0.1534754634, + -0.02414435149, + -0.02113056197, + -0.03565436205, + 0.001364654968, + -0.01251838755, + -0.001385761351, + 0.0007206335486 + ], + "t": [ + 0.5, + 1.5, + 1.5, + -0.5, + 2, + 0, + 3, + -0.5, + 0, + 2, + 1.5, + 6, + 2, + 10, + 6, + 18, + 15, + 33 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.187375, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1871.427547, + "ptriple_units": "Pa", + "reducing_state": { + "T": 487.21, + "T_units": "K", + "p": 3392200, + "p_units": "Pa", + "rhomolar": 2988.659106070714, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9098.726940322524, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.9520516197832899, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R113" +} \ No newline at end of file diff --git a/dev/fluids/R114.json b/dev/fluids/R114.json new file mode 100644 index 00000000..881a38e6 --- /dev/null +++ b/dev/fluids/R114.json @@ -0,0 +1,316 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 418.83, + "Tmax": 418.82999999999896, + "Tmin": 273.15, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03480121499881417, + "n": [ + -0.03910964005249281, + 0.04271700821207559, + -8.460176906373917, + 2.0544163414455383, + -5.417387102558348, + 311098.3405989305 + ], + "reducing_value": 3257000.0, + "t": [ + 0.063, + 0.078, + 0.997, + 1.08, + 4.22, + 18.01 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 418.83, + "Tmax": 418.82999999999896, + "Tmin": 273.15, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.16711623182714685, + "n": [ + -0.30056837663219454, + -3675.7604915544694, + 3783.892467766002, + -116.51203569138166, + 518347803.73777616, + -675455943.1429232 + ], + "reducing_value": 3257000.0, + "t": [ + 0.562, + 1.474, + 1.48, + 1.671, + 19.65, + 19.907 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 418.83, + "Tmax": 418.82999999999896, + "Tmin": 273.15, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8844499285669105, + "n": [ + 2.5388024373334166, + -21.019533461079085, + 55.36105635703546, + -35.25092830572443, + 5.566074608205557, + -82.35558694240936 + ], + "reducing_value": 3393.2000000000003, + "t": [ + 0.168, + 0.377, + 0.516, + 0.603, + 3.002, + 6.719 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 418.83, + "Tmax": 418.82999999999896, + "Tmin": 273.15, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 7.62170938819361, + "n": [ + -0.25738264700819247, + -3.898251196031975, + -5.896731894914288, + 3484.356562302582, + -1305405.1150486593, + 294675355.11756265 + ], + "reducing_value": 3393.2000000000003, + "t": [ + 0.035, + 0.539, + 2.097, + 7.751, + 12.964, + 18.768 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 418.83, + "a": [ + 0.05239 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.258 + ] + } + }, + "CAS": "76-14-2", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 10000.0, + "GWP20": 8040.0, + "GWP500": 8730.0, + "HH": 1, + "Name": "R114", + "ODP": 1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Platzer-BOOK-1990", + "BibTeX_EOS": "Platzer-BOOK-1990", + "T_max": 507, + "T_max_units": "K", + "Ttriple": 180.63, + "Ttriple_units": "K", + "accentric": 0.2523, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 418.83, + "c": [ + 2.007414931364566, + 0.06662223065231744, + -0.0001211907268430731, + 1.385112968303604e-07, + -7.290244178478347e-11 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 1.07938940032879, + -1.99243731009857, + -0.155135220175231, + -0.121465858429101, + -0.0165038674558161, + -0.186916017480622, + 0.308074956770949, + 0.115861545567346, + 0.027635877981389, + 0.108043424159349, + 0.0460684822539207, + -0.174822007470687, + 0.0317531741331376, + -0.340776521025164, + 0.323001398918284, + -0.0424950543505197 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 1.21104, + 1.21104, + 1.21104, + 1.21104, + 1.21104, + 1.21104 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -1.66940287525002, + 4.08693538568874, + -2.4173923391137, + 0.340776521025164, + -0.323001398918284, + 0.0424950543505197 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.170921, + "molar_mass_units": "kg/mol", + "p_max": 21000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 88162.38676, + "ptriple_units": "Pa", + "reducing_state": { + "T": 418.83, + "T_units": "K", + "p": 3257000, + "p_units": "Pa", + "rhomolar": 3393.2, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 5.850656151087344e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 5.850656151087344e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R114" +} \ No newline at end of file diff --git a/dev/fluids/R116.json b/dev/fluids/R116.json new file mode 100644 index 00000000..a7086b67 --- /dev/null +++ b/dev/fluids/R116.json @@ -0,0 +1,253 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 293.03, + "Tmax": 293.0299999999994, + "Tmin": 173.1, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.016719676954091156, + "n": [ + -11.470078446321281, + 4.672163421603924, + -10.48503079726129, + -2.397369737948997, + 9.993759307098879, + -13131.027093052013 + ], + "reducing_value": 3048000.0, + "t": [ + 1.007, + 1.041, + 2.032, + 4.012, + 1.929, + 18.295 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 293.03, + "Tmax": 293.0299999999994, + "Tmin": 173.1, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01063579632551992, + "n": [ + -7.187037699453901, + 1.1679020933888262, + -6.070415204530583, + 4.623641136795351, + -8.973143537957382, + 135.12331037950565 + ], + "reducing_value": 3048000.0, + "t": [ + 0.994, + 1.389, + 3.286, + 3.827, + 6.643, + 12.512 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 293.03, + "Tmax": 293.0299999999994, + "Tmin": 173.1, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5536401970378968, + "n": [ + 9.032000509756, + -9.139042989359975, + 4.35812391046927, + -10.172985836578453, + 3844.9059901716128, + -8268.03247405404 + ], + "reducing_value": 4444.0, + "t": [ + 0.481, + 0.603, + 1.19, + 3.414, + 9.072, + 10.136 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 293.03, + "Tmax": 293.0299999999994, + "Tmin": 173.1, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.44326848370010996, + "n": [ + -3.2238759240828108, + -2.882263657854913, + 8.52221952834173, + -9.783624985988958, + -19811843.680679295, + 33374328.47668358 + ], + "reducing_value": 4444.0, + "t": [ + 0.42, + 1.175, + 2.321, + 2.482, + 19.211, + 19.828 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 293.03, + "a": [ + 0.047593, + -0.0073402 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.2666, + 1.9892 + ] + } + }, + "CAS": "76-16-4", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R116", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 425, + "T_max_units": "K", + "Ttriple": 173.1, + "Ttriple_units": "K", + "accentric": 0.2566, + "accentric_units": "-", + "alpha0": [ + { + "a1": -10.7088650331, + "a2": 8.9148979056, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.4818, + 7.0622, + 7.9951 + ], + "t": [ + 0.6483977749718459, + 2.122649558065727, + 5.016551206361124 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.1632, + -2.8123, + 0.77202, + -0.14331, + 0.10227, + 0.00024629, + 0.30893, + -0.028499, + -0.30343, + -0.068793, + -0.027218, + 0.010665 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.13801182, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 26083.73415, + "ptriple_units": "Pa", + "reducing_state": { + "T": 293.03, + "T_units": "K", + "p": 3048000, + "p_units": "Pa", + "rhomolar": 4444, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12303.98435269038, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 18.43851575195629, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R116" +} \ No newline at end of file diff --git a/dev/fluids/R12.json b/dev/fluids/R12.json new file mode 100644 index 00000000..cdda8119 --- /dev/null +++ b/dev/fluids/R12.json @@ -0,0 +1,295 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 385.12, + "Tmax": 385.11999999999927, + "Tmin": 116.09900000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.02538001083745023, + "n": [ + -0.4180899251614923, + -6.821426208906223, + 1.4450198472690974, + -1.4837613030063526, + -2.1731387101462754, + -5.72739817030707 + ], + "reducing_value": 4136100.0000000005, + "t": [ + 0.894, + 1.009, + 1.274, + 3.0, + 4.927, + 19.696 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 385.12, + "Tmax": 385.11999999999927, + "Tmin": 116.09900000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028365352120385268, + "n": [ + 0.004148665064044772, + -6.438269132397203, + 0.5001352041916829, + -2.5368777649126186, + -0.9660846422519165, + -2.2689931652353614 + ], + "reducing_value": 4136100.0000000005, + "t": [ + 0.433, + 0.982, + 1.318, + 3.654, + 5.875, + 15.999 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 385.12, + "Tmax": 385.11999999999927, + "Tmin": 116.09900000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.729903640409435, + "n": [ + 2.6029953147390845, + -1.289157172326326, + 1.8650658616334526, + -0.7403291941448226, + 24.389351468278143, + -67.79326638866661 + ], + "reducing_value": 4672.781255944357, + "t": [ + 0.391, + 0.803, + 1.301, + 2.566, + 12.555, + 16.134 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 385.12, + "Tmax": 385.11999999999927, + "Tmin": 116.09900000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.21720112949432657, + "n": [ + -7.9660647155295505, + 23.959910083444367, + -23.82796401904973, + 3.215927599962643, + -4.437766797843962, + -3.5598094489847374 + ], + "reducing_value": 4672.781255944357, + "t": [ + 0.499, + 0.743, + 0.857, + 1.368, + 3.716, + 14.833 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 385.12, + "a": [ + -0.000124, + 0.05662 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 0.4318, + 1.263 + ] + } + }, + "CAS": "75-71-8", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 10900.0, + "GWP20": 11000.0, + "GWP500": 5200.0, + "HH": 1, + "Name": "R12", + "ODP": 1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Marx-BOOK-1992", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 116.099, + "Ttriple_units": "K", + "accentric": 0.1794783173435512, + "accentric_units": "-", + "alpha0": [ + { + "a1": 10.0100905, + "a2": -4.66434985, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.00361975, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.16062357, + 0.371258136, + 3.56226039, + 2.12152336 + ], + "t": [ + 3.72204562, + 6.30985083, + 1.78037889, + 1.07087607 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 4, + 6, + 8, + 1, + 1, + 5, + 7, + 12, + 12, + 14, + 1, + 9, + 1, + 1, + 3, + 3, + 5, + 9 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 3, + 4 + ], + "n": [ + 2.075343402, + -2.962525996, + 0.01001589616, + 0.01781347612, + 0.02556929157, + 0.002352142637, + -8.495553314e-05, + -0.01535945599, + -0.2108816776, + -0.01654228806, + -0.0118131613, + -4.16029583e-05, + 2.784861664e-05, + 1.618686433e-06, + -0.1064614686, + 0.0009369665207, + 0.02590095447, + -0.04347025025, + 0.1012308449, + -0.1100003438, + -0.003361012009, + 0.0003789190008 + ], + "t": [ + 0.5, + 1, + 2, + 2.5, + -0.5, + 0, + 0, + -0.5, + 1.5, + 2.5, + -0.5, + 0, + 0.5, + -0.5, + 4, + 4, + 2, + 4, + 12, + 14, + 0, + 14 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.120913, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.2425501953, + "ptriple_units": "Pa", + "reducing_state": { + "T": 385.12, + "T_units": "K", + "p": 4136100.000000001, + "p_units": "Pa", + "rhomolar": 4672.781255944357, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 15125.26924010347, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0002513257531784137, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R12" +} \ No newline at end of file diff --git a/dev/fluids/R123.json b/dev/fluids/R123.json new file mode 100644 index 00000000..aa02a51d --- /dev/null +++ b/dev/fluids/R123.json @@ -0,0 +1,259 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 456.82, + "Tmax": 456.81999999999925, + "Tmin": 166.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.091919584548672, + "n": [ + -0.14999260119726984, + 0.16011082566025844, + -6.159962430056354, + -0.33227260959139665, + -2.5133322580085764, + -2.3181419404884687 + ], + "reducing_value": 3672000.0, + "t": [ + 0.069, + 0.08, + 0.958, + 1.207, + 3.265, + 5.217 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 456.82, + "Tmax": 456.81999999999925, + "Tmin": 166.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.17838045480449427, + "n": [ + -0.0031837409106559187, + -11.107846331080172, + 4.734185995995877, + -4.048957111743435, + -0.5440841196537946, + -44.6129766068101 + ], + "reducing_value": 3672000.0, + "t": [ + 0.031, + 1.033, + 1.146, + 3.599, + 7.019, + 19.189 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 456.82, + "Tmax": 456.81999999999925, + "Tmin": 166.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.17905758997341, + "n": [ + 1.12312839380477, + 2.725680798383249, + -2.934171430496407, + 112.18482758921864, + -5123.982577622656, + 5683.66051261797 + ], + "reducing_value": 3616.0098345005263, + "t": [ + 0.25, + 0.88, + 2.102, + 7.818, + 11.925, + 12.431 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 456.82, + "Tmax": 456.81999999999925, + "Tmin": 166.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.9726696226793257, + "n": [ + -0.6689070209875734, + -8.512052644791224, + 28.44144763374501, + -30.129960632384645, + 0.7883516597032918, + 32.0 + ], + "reducing_value": 3616.0098345005263, + "t": [ + 0.131, + 0.889, + 2.037, + 2.411, + 13.9, + 13.9 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 456.831, + "a": [ + 0.056151 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.2367 + ] + } + }, + "CAS": "306-83-2", + "ENVIRONMENTAL": { + "ASHRAE34": "B1", + "FH": 1, + "GWP100": 77.0, + "GWP20": 273.0, + "GWP500": 24.0, + "HH": 2, + "Name": "R123", + "ODP": 0.02, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Younglove-JPCRD-1994", + "BibTeX_EOS": "Span-IJT-2003C", + "T_max": 523, + "T_max_units": "K", + "Ttriple": 166, + "Ttriple_units": "K", + "accentric": 0.2819224970363519, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 456.82, + "cp_over_R": 2.046009, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 298, + "Tc": 456.82, + "c": [ + 0.04866685127621383, + -5.586658475955018e-05, + 2.823486262027407e-08 + ], + "t": [ + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.116973, + -3.074593, + 0.51063873, + 0.094478812, + 0.00029532752, + 0.66974438, + 0.96438575, + -0.014865424, + -0.49221959, + -0.022831038, + -0.1407486, + -0.025117301 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.152931, + "molar_mass_units": "kg/mol", + "p_max": 76000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 4.153442717, + "ptriple_units": "Pa", + "reducing_state": { + "T": 456.82, + "T_units": "K", + "p": 3672000, + "p_units": "Pa", + "rhomolar": 3616.009834500526, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11612.8148830159, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.003009801496735872, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R123" +} \ No newline at end of file diff --git a/dev/fluids/R1233zd(E).json b/dev/fluids/R1233zd(E).json new file mode 100644 index 00000000..0060c986 --- /dev/null +++ b/dev/fluids/R1233zd(E).json @@ -0,0 +1,286 @@ +{ + "ALIASES": [ + "R1233zdE", + "R1233ZDE", + "R1233ZD(E)" + ], + "ANCILLARIES": { + "pL": { + "T_r": 438.75, + "Tmax": 438.74999999999915, + "Tmin": 195.15, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04812397751767783, + "n": [ + 0.029762994134254272, + -6.47060943833758, + -0.28794075079630876, + -4.614592689331627, + -9.236029232181323, + 659.8939410067252 + ], + "reducing_value": 3570900.0, + "t": [ + 0.408, + 0.959, + 1.67, + 3.873, + 10.203, + 19.884 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 438.75, + "Tmax": 438.74999999999915, + "Tmin": 195.15, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04812235123814457, + "n": [ + 0.021088508639502585, + -6.620365917686894, + -4.702884521504553, + -6.519442862795689, + -118082.29588979667, + 121247.44743084916 + ], + "reducing_value": 3570900.0, + "t": [ + 0.385, + 0.967, + 3.777, + 10.577, + 19.909, + 19.956 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 438.75, + "Tmax": 438.74999999999915, + "Tmin": 195.15, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.49366683042657566, + "n": [ + 3.3871208714378995, + -1.54887974718069, + 7.422063780601333, + -8.33207529880846, + 90.2369693095755, + -124.63668410742086 + ], + "reducing_value": 3670.0, + "t": [ + 0.414, + 0.659, + 1.968, + 2.399, + 7.587, + 8.501 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 438.75, + "Tmax": 438.74999999999915, + "Tmin": 195.15, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4192570094541437, + "n": [ + 1.4537714001445163, + -3.954065447818449, + -3.2616476179213754, + -6.423292792416026, + -1591.9260119985602, + 4775.150913792323 + ], + "reducing_value": 3670.0, + "t": [ + 0.258, + 0.32, + 0.93, + 4.132, + 17.885, + 19.89 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "102687-65-0", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 195.15, + "Ttriple_units": "K", + "accentric": 0.305, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 438.75, + "c": [ + 4 + ], + "t": [ + 0 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 8.962, + 11.94 + ], + "t": [ + 0.9116809116809117, + 4.330484330484331 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.03920261, + 1.639052, + -1.997147, + -0.6603372, + 0.1498682, + -1.408791, + -0.7920426, + 0.8549678, + -0.530192, + -0.01408562 + ], + "t": [ + 1, + 0.24, + 0.83, + 1.17, + 0.6, + 2.2, + 2.88, + 1.1, + 2, + 1.07 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.27, + 0.82, + 0.94, + 20, + 32 + ], + "d": [ + 1, + 1, + 3, + 2, + 3 + ], + "epsilon": [ + 0.77, + 0.976, + 1.08, + 0.62, + 0.61 + ], + "eta": [ + 1.215, + 1.5, + 1.1, + 2.52, + 4.55 + ], + "gamma": [ + 1.32, + 0.82, + 0.66, + 0.66, + 1.39 + ], + "n": [ + 1.335117, + -0.5441797, + -0.05862723, + -0.04123614, + -0.6619106 + ], + "t": [ + 1.27, + 1.94, + 2, + 1.5, + 1 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1304961896, + "molar_mass_units": "kg/mol", + "p_max": 100000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 250.2655781, + "ptriple_units": "Pa", + "reducing_state": { + "T": 438.75, + "T_units": "K", + "p": 3570900, + "p_units": "Pa", + "rhomolar": 3670, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11408.66354648404, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.1543187791572448, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R1233zd(E)" +} \ No newline at end of file diff --git a/dev/fluids/R1234yf.json b/dev/fluids/R1234yf.json new file mode 100644 index 00000000..b6a3ebb6 --- /dev/null +++ b/dev/fluids/R1234yf.json @@ -0,0 +1,299 @@ +{ + "ALIASES": [ + "R1234YF" + ], + "ANCILLARIES": { + "pL": { + "T_r": 367.85, + "Tmax": 367.8499999999992, + "Tmin": 220.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006853694086594864, + "n": [ + 0.21867168915151047, + -6.7020534970313275, + -3.9344883544124443, + 39309.745547798695, + 18.183182049398066, + -3883.103380695622 + ], + "reducing_value": 3382200.0, + "t": [ + 0.728, + 0.961, + 3.78, + 17.277, + 7.967, + 14.02 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 367.85, + "Tmax": 367.8499999999992, + "Tmin": 220.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015063742190934981, + "n": [ + -6.127206406335995, + -0.9044431324757645, + 2.0918728211333275, + -3.396385591501546, + -1.9071219386505223, + -47.15549606822473 + ], + "reducing_value": 3382200.0, + "t": [ + 0.978, + 1.128, + 1.875, + 2.579, + 5.3, + 12.869 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 367.85, + "Tmax": 367.8499999999992, + "Tmin": 220.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3992123482188248, + "n": [ + 2.321825326575359, + -3.520638555089873, + 20.18646332917161, + -160.37050775728997, + 147.68109685289284, + -63578.64918999199 + ], + "reducing_value": 4170.0, + "t": [ + 0.365, + 1.247, + 1.765, + 2.484, + 2.593, + 16.586 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 367.85, + "Tmax": 367.8499999999992, + "Tmin": 220.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.332050058237221, + "n": [ + -3.24158284550283, + 2.612924555839616, + -26.216566273272992, + 115.70400813769207, + -101.3078910128961, + 9.031472717572315 + ], + "reducing_value": 4170.0, + "t": [ + 0.398, + 0.952, + 1.466, + 2.053, + 2.242, + 4.989 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 367.85, + "a": [ + 0.06274 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.394 + ] + } + }, + "CAS": "754-12-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A2L", + "FH": 2, + "GWP100": 4.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R1234yf", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Richter-JCED-2011", + "T_max": 410, + "T_max_units": "K", + "Ttriple": 220, + "Ttriple_units": "K", + "accentric": 0.276, + "accentric_units": "-", + "alpha0": [ + { + "a1": -12.837928, + "a2": 8.042605, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 4.944, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.549, + 1.537, + 2.03, + 7.455 + ], + "t": [ + 1.951882560826424, + 2.384123963572108, + 12.13809976892755, + 4.770966426532554 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04592563, + 1.546958, + -2.355237, + -0.4827835, + 0.1758022, + -1.210006, + -0.6177084, + 0.6805262, + -0.6968555, + -0.02695779 + ], + "t": [ + 1, + 0.32, + 0.929, + 0.94, + 0.38, + 2.28, + 1.76, + 0.97, + 2.44, + 1.05 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.42, + 2.31, + 0.89, + 80, + 108 + ], + "d": [ + 1, + 1, + 3, + 3, + 2 + ], + "epsilon": [ + 0.712, + 0.91, + 0.677, + 0.718, + 1.64 + ], + "eta": [ + 1.02, + 1.336, + 1.055, + 5.84, + 16.2 + ], + "gamma": [ + 1.13, + 0.67, + 0.46, + 1.28, + 1.2 + ], + "n": [ + 1.389966, + -0.4777136, + -0.1975184, + -1.147646, + 0.0003428541 + ], + "t": [ + 1.4, + 3, + 3.5, + 1, + 3.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1140415928, + "molar_mass_units": "kg/mol", + "p_max": 30000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 31507.55885, + "ptriple_units": "Pa", + "reducing_state": { + "T": 367.85, + "T_units": "K", + "p": 3382200, + "p_units": "Pa", + "rhomolar": 4170, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11633.08448763467, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 17.58443653644202, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R1234yf" +} \ No newline at end of file diff --git a/dev/fluids/R1234ze(E).json b/dev/fluids/R1234ze(E).json new file mode 100644 index 00000000..9c7e2b93 --- /dev/null +++ b/dev/fluids/R1234ze(E).json @@ -0,0 +1,288 @@ +{ + "ALIASES": [ + "R1234ZEE", + "R1234zeE", + "R1234ZE(E)" + ], + "ANCILLARIES": { + "pL": { + "T_r": 382.52, + "Tmax": 382.5199999999991, + "Tmin": 168.62, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.007822047790684294, + "n": [ + -0.20363205737381423, + -16.08331291555217, + 10.286458977692833, + -1.7629676468624258, + -3.894744849439604, + 1.225425940200232 + ], + "reducing_value": 3636250.0, + "t": [ + 0.763, + 1.073, + 1.171, + 2.287, + 4.528, + 6.38 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 382.52, + "Tmax": 382.5199999999991, + "Tmin": 168.62, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.022567163665065948, + "n": [ + -6.2771508430471465, + -0.6442364867415747, + 1.7382781745746712, + -4.13701171551505, + -4.650293699166692, + 5.311503524553517 + ], + "reducing_value": 3636250.0, + "t": [ + 0.983, + 0.995, + 2.083, + 2.808, + 6.744, + 8.913 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 382.52, + "Tmax": 382.5199999999991, + "Tmin": 168.62, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.26112944130063376, + "n": [ + 2.500880567033856, + -1.3486007407219713, + 1.5107989377176647, + 0.08399693443404783, + 51293.78813992701, + -62530.03746597265 + ], + "reducing_value": 4290.0, + "t": [ + 0.354, + 0.525, + 0.705, + 2.397, + 19.412, + 19.777 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 382.52, + "Tmax": 382.5199999999991, + "Tmin": 168.62, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2509048976144457, + "n": [ + -0.34141577170134696, + -2.2642727042889206, + -10.568130441264715, + 9.002522338545985, + -5.823859071714804, + -424.82596271205927 + ], + "reducing_value": 4290.0, + "t": [ + 0.331, + 0.371, + 1.186, + 1.428, + 3.051, + 18.679 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "29118-24-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": 6.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R1234ze(E)", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "McLinden-PURDUE-2010", + "T_max": 410, + "T_max_units": "K", + "Ttriple": 168.62, + "Ttriple_units": "K", + "accentric": 0.313, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 6.259, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.303, + 8.597, + 2.333 + ], + "t": [ + 1.806441493255255, + 4.457283279305657, + 11.02164592701035 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04434245, + 1.646369, + -2.437488, + -0.517056, + 0.1815626, + -1.210104, + -0.5944653, + 0.7521992, + -0.6747216, + -0.02448183 + ], + "t": [ + 1, + 0.31, + 0.923, + 1.06, + 0.44, + 2.08, + 2.32, + 1.25, + 2, + 1 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.64, + 1.57, + 1.49, + 257, + 45 + ], + "d": [ + 1, + 1, + 3, + 3, + 2 + ], + "epsilon": [ + 0.711, + 0.856, + 0.753, + 0.772, + 1.88 + ], + "eta": [ + 1, + 1.4, + 1.134, + 7.68, + 24 + ], + "gamma": [ + 1.13, + 0.61, + 0.65, + 1.13, + 1.34 + ], + "n": [ + 1.379434, + -0.4697024, + -0.2036158, + -0.08407447, + 0.0005109529000000002 + ], + "t": [ + 0.93, + 1.93, + 2.69, + 1, + 2 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1140415928, + "molar_mass_units": "kg/mol", + "p_max": 15000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 231.2817567, + "ptriple_units": "Pa", + "reducing_state": { + "T": 382.52, + "T_units": "K", + "p": 3636250, + "p_units": "Pa", + "rhomolar": 4290, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8.768730560908124e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 8.768730560908124e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R1234ze(E)" +} \ No newline at end of file diff --git a/dev/fluids/R1234ze(Z).json b/dev/fluids/R1234ze(Z).json new file mode 100644 index 00000000..fbc094ea --- /dev/null +++ b/dev/fluids/R1234ze(Z).json @@ -0,0 +1,255 @@ +{ + "ALIASES": [ + "R1234ZE(Z)" + ], + "ANCILLARIES": { + "pL": { + "T_r": 423.27, + "Tmax": 423.2699999999993, + "Tmin": 273.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015877796614871542, + "n": [ + 0.0117990424214877, + -6.803022339042438, + 5.362164910742748, + -12.094491173809551, + -254.2811081944286, + 171.34274686639145 + ], + "reducing_value": 3533000.0, + "t": [ + 0.631, + 0.974, + 3.244, + 3.59, + 7.592, + 6.934 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 423.27, + "Tmax": 423.2699999999993, + "Tmin": 273.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.013861437588635894, + "n": [ + -8.177106613433029, + 1.5142657359326417, + -2.790441012266599, + 0.00919594460120844, + -8.214525035988535, + -5309.748045808004 + ], + "reducing_value": 3533000.0, + "t": [ + 0.993, + 1.127, + 3.259, + 4.649, + 8.29, + 18.573 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 423.27, + "Tmax": 423.2699999999993, + "Tmin": 273.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.36780472644506457, + "n": [ + 2.8054215733649555, + -0.5782847268115662, + 6.657750631664868, + -28488.415580838606, + 68499.04449007797, + -85980.39928084945 + ], + "reducing_value": 4121.303363626818, + "t": [ + 0.414, + 0.901, + 2.913, + 8.026, + 8.631, + 10.213 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 423.27, + "Tmax": 423.2699999999993, + "Tmin": 273.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.0860081017443401, + "n": [ + -3.8008160798898456, + -1.14790031265839, + -281.54354036613495, + 6472.299051044157, + -1985193.1508489654, + 2037392.973112241 + ], + "reducing_value": 4121.303363626818, + "t": [ + 0.43, + 0.95, + 4.5, + 6.507, + 8.994, + 9.048 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "29118-25-0", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Akasaka-DELFT-2013", + "T_max": 430, + "T_max_units": "K", + "Ttriple": 273, + "Ttriple_units": "K", + "accentric": 0.3274, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298, + "Tc": 423.27, + "c": [ + -1.6994, + 0.05794646443168663, + -5.539762719017151e-05, + 1.998892498570471e-08 + ], + "t": [ + 0, + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 3, + 5, + 7, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3 + ], + "n": [ + 7.7652368, + -8.7025756, + -0.28352251, + 0.14534501, + 0.0092092105, + -0.24997382, + 0.09667436, + 0.024685924, + -0.013255083, + -0.06423133, + 0.36638206, + -0.25548847, + -0.095592361, + 0.086271444, + 0.015997412, + -0.013127234, + 0.004229399 + ], + "t": [ + 0.685, + 0.8494, + 1.87, + 2, + 0.142, + 4.2, + 0.08, + 0, + 1.1, + 5.5, + 6.6, + 8.4, + 7.2, + 7.6, + 8.5, + 23, + 18 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1140415928, + "molar_mass_units": "kg/mol", + "p_max": 6000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 67802.93936, + "ptriple_units": "Pa", + "reducing_state": { + "T": 423.27, + "T_units": "K", + "p": 3533000, + "p_units": "Pa", + "rhomolar": 4126.696132921778, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11250.73553652318, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 31.07753309192204, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R1234ze(Z)" +} \ No newline at end of file diff --git a/dev/fluids/R124.json b/dev/fluids/R124.json new file mode 100644 index 00000000..780b4aa1 --- /dev/null +++ b/dev/fluids/R124.json @@ -0,0 +1,283 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 395.425, + "Tmax": 395.42499999999933, + "Tmin": 120.00000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.011933999782232085, + "n": [ + -5.532034162429256, + -4.742002285997961, + 4.083301102214, + -0.8556260869752595, + -3.759805971191399, + -5.094637151194883 + ], + "reducing_value": 3624295.0, + "t": [ + 1.003, + 1.051, + 1.163, + 2.188, + 4.015, + 19.693 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 395.425, + "Tmax": 395.42499999999933, + "Tmin": 120.00000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.017896115300741755, + "n": [ + -7.528609644683465, + 1.132455562463, + -1.631598342265028, + -2.8282320927793774, + 18.38052289288725, + -23.827708795649023 + ], + "reducing_value": 3624295.0, + "t": [ + 0.996, + 1.239, + 2.971, + 4.309, + 16.487, + 17.093 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 395.425, + "Tmax": 395.42499999999933, + "Tmin": 120.00000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.24061336574978665, + "n": [ + 9.076759200951095, + -17.685013904231155, + 59.69226551115479, + -48.46415018361892, + 0.6023234565910854, + -1.0939055527121821 + ], + "reducing_value": 4103.279546177282, + "t": [ + 0.482, + 0.651, + 0.881, + 0.914, + 5.001, + 10.577 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 395.425, + "Tmax": 395.42499999999933, + "Tmin": 120.00000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.412713645894236, + "n": [ + -3.6411060779677857, + 0.3822304251070335, + -19.603560148262865, + 181.0410898999192, + -168.52216602298836, + -2.5180916684231893 + ], + "reducing_value": 4103.279546177282, + "t": [ + 0.415, + 0.5, + 1.704, + 2.307, + 2.394, + 13.161 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 395.425, + "a": [ + 0.05175 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.197 + ] + } + }, + "CAS": "2837-89-0", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 609.0, + "GWP20": 2070.0, + "GWP500": 185.0, + "HH": 1, + "Name": "R124", + "ODP": 0.022, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "deVries-ICR-1995", + "T_max": 470, + "T_max_units": "K", + "Ttriple": 75, + "Ttriple_units": "K", + "accentric": 0.2880950842214292, + "accentric_units": "-", + "alpha0": [ + { + "a1": -11.669406, + "a2": 9.8760443, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.175638, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -7.389735, + 0.8736831, + -0.1115133 + ], + "t": [ + -1, + -2, + -3 + ], + "type": "IdealGasHelmholtzPower" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 3, + 5, + 6, + 8, + 2, + 12, + 1, + 1, + 1, + 1, + 15, + 3, + 3, + 4, + 9 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 4, + 4 + ], + "n": [ + -0.01262962, + 2.168373, + -3.330033, + 0.1610361, + -9.666145e-05, + 0.0119131, + -0.002880217, + 0.001681346, + 1.594968e-05, + 0.1289674, + 1.182213e-05, + -0.4713997, + -0.2412873, + 0.6868066, + -0.08621095, + 4.728645e-06, + 0.01487933, + -0.03001338, + 0.001849606, + 0.0004126073 + ], + "t": [ + 2, + 0.5, + 1, + 0.5, + 2.5, + -1, + 1, + 0, + -0.5, + 1.5, + 1, + 2.5, + -0.25, + 1, + 5, + 2, + 15, + 20, + 15, + 45 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1364762, + "molar_mass_units": "kg/mol", + "p_max": 40000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.026738379, + "ptriple_units": "Pa", + "reducing_state": { + "T": 395.425, + "T_units": "K", + "p": 3624295, + "p_units": "Pa", + "rhomolar": 4103.279546177282, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 7.327284903888004e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 7.327284903888004e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R124" +} \ No newline at end of file diff --git a/dev/fluids/R125.json b/dev/fluids/R125.json new file mode 100644 index 00000000..42550ff7 --- /dev/null +++ b/dev/fluids/R125.json @@ -0,0 +1,304 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 339.173, + "Tmax": 339.1729999999993, + "Tmin": 172.52, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019760158892956348, + "n": [ + -16.660428789255334, + 14.596373821017897, + -5.275576328072681, + -27.79147283824458, + 36.817664092754455, + -69.3677852617722 + ], + "reducing_value": 3617700.0, + "t": [ + 1.071, + 1.229, + 1.544, + 5.702, + 6.646, + 11.6 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 339.173, + "Tmax": 339.1729999999993, + "Tmin": 172.52, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01046187338811233, + "n": [ + 6.579940225415354, + -13.12524401279829, + -10.469172276861269, + 13.618968108873503, + -8.0692357647322, + 55.965891794172045 + ], + "reducing_value": 3617700.0, + "t": [ + 0.885, + 0.925, + 3.474, + 3.812, + 4.411, + 15.538 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 339.173, + "Tmax": 339.1729999999993, + "Tmin": 172.52, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.32212323303475454, + "n": [ + 2.2016016101218163, + 9.66884730895765, + -38.74092529625786, + 45.90185095955414, + -68.77471029167359, + 3782.012676140688 + ], + "reducing_value": 4779.0, + "t": [ + 0.356, + 2.347, + 3.224, + 4.03, + 7.525, + 16.03 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 339.173, + "Tmax": 339.1729999999993, + "Tmin": 172.52, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4173021243752961, + "n": [ + -2.0301408267555248, + -1.7694859385413004, + -2.66520428063493, + -2012.3802928260302, + 4435.166819598504, + -67300.56720486972 + ], + "reducing_value": 4779.0, + "t": [ + 0.352, + 0.604, + 1.327, + 9.866, + 10.986, + 18.158 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 339.173, + "a": [ + 0.05252 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.237 + ] + } + }, + "CAS": "354-33-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": 3500.0, + "GWP20": 6350.0, + "GWP500": 1100.0, + "HH": 1, + "Name": "R125", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JPCRD-2005", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 172.52, + "Ttriple_units": "K", + "accentric": 0.3052, + "accentric_units": "-", + "alpha0": [ + { + "a1": 37.2674, + "a2": 8.88404, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -49.8651 + ], + "t": [ + -0.1 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 2.303, + 5.086, + 7.3 + ], + "t": [ + 0.92578, + 2.22895, + 5.03283 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 4, + 1, + 1, + 2, + 2, + 3, + 4, + 5, + 1, + 5, + 1, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 2, + 3, + 3 + ], + "m": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1.7, + 7, + 6 + ], + "n": [ + 5.28076, + -8.67658, + 0.7501127, + 0.7590023, + 0.01451899, + 4.777189, + -3.330988, + 3.775673, + -2.290919, + 0.8888268, + -0.6234864, + -0.04127263, + -0.08455389, + -0.1308752, + 0.008344962, + -1.532005, + -0.05883649, + 0.02296658 + ], + "t": [ + 0.669, + 1.05, + 2.75, + 0.956, + 1, + 2, + 2.75, + 2.38, + 3.37, + 3.47, + 2.63, + 3.45, + 0.72, + 4.23, + 0.2, + 4.5, + 29, + 24 + ], + "type": "ResidualHelmholtzLemmon2005" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1200214, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2914.046009, + "ptriple_units": "Pa", + "reducing_state": { + "T": 339.173, + "T_units": "K", + "p": 3617700, + "p_units": "Pa", + "rhomolar": 4779, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14086.46410777493, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.038282831772791, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R125" +} \ No newline at end of file diff --git a/dev/fluids/R13.json b/dev/fluids/R13.json new file mode 100644 index 00000000..76e54baf --- /dev/null +++ b/dev/fluids/R13.json @@ -0,0 +1,316 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 301.88, + "Tmax": 301.8799999999995, + "Tmin": 98.15000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.12591295236392686, + "n": [ + -0.0007921318343566953, + -5.996195643967384, + -0.19260162903514982, + -3.374201633035978, + 5653.865616057301, + -6159.322602726868 + ], + "reducing_value": 3879000.0, + "t": [ + 0.183, + 0.974, + 1.79, + 4.508, + 17.458, + 17.588 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 301.88, + "Tmax": 301.8799999999995, + "Tmin": 98.15000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1260695838490422, + "n": [ + -5.512665414700078, + -0.46529356526380233, + -0.2576981218074055, + -6.198713074425052, + 4.554615222226936, + -425.4870614799572 + ], + "reducing_value": 3879000.0, + "t": [ + 0.962, + 1.124, + 1.806, + 5.029, + 6.501, + 18.846 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 301.88, + "Tmax": 301.8799999999995, + "Tmin": 98.15000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.5665972823225247, + "n": [ + 0.5805008657064199, + 110.54560557681266, + -110.25028269746312, + 87.64846842137001, + -146.66580327727502, + 669.8318898661124 + ], + "reducing_value": 5580.0, + "t": [ + 0.12, + 1.19, + 1.219, + 6.955, + 8.289, + 17.746 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 301.88, + "Tmax": 301.8799999999995, + "Tmin": 98.15000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.322780247833268, + "n": [ + -44.134501251031836, + 123.82270708407191, + -83.62522157903703, + -2.647160291881159, + -5.449711245985369, + -77.38203576950463 + ], + "reducing_value": 5580.0, + "t": [ + 0.187, + 0.227, + 0.259, + 2.009, + 7.396, + 14.878 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 302, + "a": [ + 0.05045 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.269 + ] + } + }, + "CAS": "75-72-9", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": -1, + "GWP100": 14400.0, + "GWP20": 10800.0, + "GWP500": 16400.0, + "HH": -1, + "Name": "R13", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "Platzer-BOOK-1990", + "BibTeX_EOS": "Platzer-BOOK-1990", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 92, + "Ttriple_units": "K", + "accentric": 0.174586327798, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 301.88, + "c": [ + 2.476645849617115, + 0.01807426857890603, + 2.194553494132547e-05, + -8.58106190653448e-08, + 6.3199170578182e-11 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 0.761143010172, + -1.94465098795, + 0.940938700406, + -1.08107050239, + 0.117501564976, + 0.228305167217, + -0.403338888789, + 0.37558571342, + -0.0617543677315, + 0.170326226881, + 0.0536612457231, + -0.151603010301, + 0.0252033265074, + -0.62834655992, + 0.792797111341, + -0.134038992692 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 0.98230055, + 0.98230055, + 0.98230055, + 0.98230055, + 0.98230055, + 0.98230055 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -0.0399863840975, + 0.436410910529, + -0.448724904991, + 0.62834655992, + -0.792797111341, + 0.134038992692 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.104459, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.907038977, + "ptriple_units": "Pa", + "reducing_state": { + "T": 301.88, + "T_units": "K", + "p": 3879000, + "p_units": "Pa", + "rhomolar": 5580, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9.573133956863457e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 9.573133956863457e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R13" +} \ No newline at end of file diff --git a/dev/fluids/R134a.json b/dev/fluids/R134a.json new file mode 100644 index 00000000..884d15e1 --- /dev/null +++ b/dev/fluids/R134a.json @@ -0,0 +1,287 @@ +{ + "ALIASES": [ + "R134A" + ], + "ANCILLARIES": { + "pL": { + "T_r": 374.21, + "Tmax": 374.20999999999935, + "Tmin": 169.85, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.017350580991559728, + "n": [ + -7.752261946226358, + 1.1077288842347188, + -3.6878039562081835, + 11.428865438173393, + 58.41970100091463, + -7.937848917436551 + ], + "reducing_value": 4059280.0, + "t": [ + 0.994, + 1.193, + 3.431, + 11.757, + 16.373, + 8.838 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 374.21, + "Tmax": 374.20999999999935, + "Tmin": 169.85, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.00920528154990663, + "n": [ + 0.4331478287291047, + -9.090302559074352, + 2.1476074125217703, + -1.557687007603464, + -3.5020328972698604, + 14.958442337201044 + ], + "reducing_value": 4059280.0, + "t": [ + 0.845, + 0.99, + 1.14, + 2.651, + 4.507, + 17.235 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 374.21, + "Tmax": 374.20999999999935, + "Tmin": 169.85, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.694601438771184, + "n": [ + 18.772731940930015, + -51.49939472178225, + 40.793536440596085, + -1481.6500471538966, + 1600.534434298925, + -67338.52423732559 + ], + "reducing_value": 5017.053, + "t": [ + 0.673, + 0.994, + 1.257, + 5.783, + 5.943, + 19.94 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 374.21, + "Tmax": 374.20999999999935, + "Tmin": 169.85, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.5443795326392737, + "n": [ + -5.147386240766544, + 5.34618043286371, + -7.611015272838434, + -28.85436432788653, + -9.079306067130748, + 64.0 + ], + "reducing_value": 5017.053, + "t": [ + 0.476, + 0.966, + 1.321, + 8.491, + 13.463, + 13.463 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 374.21, + "a": [ + 0.05801 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.241 + ] + } + }, + "CAS": "811-97-2", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1430.0, + "GWP20": 3830.0, + "GWP500": 435.0, + "HH": 1, + "Name": "R134a", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "TillnerRoth-JPCRD-1994", + "T_max": 455, + "T_max_units": "K", + "Ttriple": 169.85, + "Ttriple_units": "K", + "accentric": 0.32684, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.019535, + "a2": 9.047135, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1.629789, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -9.723916, + -3.92717 + ], + "t": [ + -0.5, + -0.75 + ], + "type": "IdealGasHelmholtzPower" + } + ], + "alphar": [ + { + "d": [ + 2, + 1, + 3, + 6, + 6, + 1, + 1, + 2, + 5, + 2, + 2, + 4, + 1, + 4, + 1, + 2, + 4, + 1, + 5, + 3, + 10 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 4 + ], + "n": [ + 0.05586817, + 0.498223, + 0.02458698, + 0.0008570145, + 0.0004788584, + -1.800808, + 0.2671641, + -0.04781652, + 0.01423987, + 0.3324062, + -0.007485907, + 0.0001017263, + -0.5184567, + -0.08692288, + 0.2057144, + -0.005000457, + 0.0004603262, + -0.003497836, + 0.006995038, + -0.01452184, + -0.0001285458 + ], + "t": [ + -0.5, + 0, + 0, + 0, + 1.5, + 1.5, + 2, + 2, + 1, + 3, + 5, + 1, + 5, + 5, + 6, + 10, + 10, + 10, + 18, + 22, + 50 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.102032, + "molar_mass_units": "kg/mol", + "p_max": 70000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 389.5637886, + "ptriple_units": "Pa", + "reducing_state": { + "T": 374.18, + "T_units": "K", + "p": 4059280, + "p_units": "Pa", + "rhomolar": 4978.830171000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 15594.17453546275, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.2761416512149696, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R134a" +} \ No newline at end of file diff --git a/dev/fluids/R14.json b/dev/fluids/R14.json new file mode 100644 index 00000000..05fa21aa --- /dev/null +++ b/dev/fluids/R14.json @@ -0,0 +1,316 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 227.51, + "Tmax": 227.50999999999948, + "Tmin": 120.00000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.056557492124520437, + "n": [ + 0.008252828633147618, + -0.04268492478666484, + -6.191901989609247, + 0.35599848378130283, + -2.9637839791302523, + 25.20051432671624 + ], + "reducing_value": 3750000.0, + "t": [ + 0.008, + 0.571, + 0.981, + 1.703, + 3.774, + 12.925 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 227.51, + "Tmax": 227.50999999999948, + "Tmin": 120.00000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.330806453728516, + "n": [ + 0.02977525843409753, + -0.18722735733648588, + -172.7753199533091, + 169.90412537233442, + -4.8505113444549774, + -0.3348515793791319 + ], + "reducing_value": 3750000.0, + "t": [ + 0.063, + 0.359, + 1.297, + 1.319, + 2.397, + 5.575 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 227.51, + "Tmax": 227.50999999999948, + "Tmin": 120.00000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 4.396907124601834, + "n": [ + 5.827780226789797, + -7.357043181841783, + 21.151996405133726, + -14035.045227608716, + 101927.9835601533, + -2047064.5653545645 + ], + "reducing_value": 7109.4194, + "t": [ + 0.602, + 1.14, + 3.047, + 9.942, + 12.357, + 18.15 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 227.51, + "Tmax": 227.50999999999948, + "Tmin": 120.00000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 5.100892756019415, + "n": [ + -24.42524992497142, + 25.211693075765005, + -26.691222148617776, + 157.32675143002658, + -23298.685615045863, + 1035275.9594118744 + ], + "reducing_value": 7109.4194, + "t": [ + 0.736, + 0.901, + 2.569, + 5.322, + 12.251, + 18.19 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 227.51, + "a": [ + 0.0423 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.24 + ] + } + }, + "CAS": "75-73-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 7390.0, + "GWP20": 5210.0, + "GWP500": 11200.0, + "HH": -1, + "Name": "R14", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "Platzer-BOOK-1990", + "BibTeX_EOS": "Platzer-BOOK-1990", + "T_max": 623, + "T_max_units": "K", + "Ttriple": 89.54, + "Ttriple_units": "K", + "accentric": 0.1785, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 227.51, + "c": [ + 3.946282613411975, + -0.008858129431283382, + 0.0001393877086940782, + -3.005436298807747e-07, + 2.050274501811892e-10 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 1.03999039734947, + -2.4579202542559, + 0.799614558381524, + -0.749498955282594, + 0.152177772596398, + -0.293408332036298, + 0.717794503774445, + -0.0426467444751902, + 0.226562749725952, + -0.39109169477402, + -0.0257394805543082, + 0.0554844886106659, + 0.00610988262947185, + -0.33469874882651, + 0.586690904512625, + -0.147068929694523 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 0.99832625, + 0.99832625, + 0.99832625, + 0.99832625, + 0.99832625, + 0.99832625 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -0.190315426348019, + 0.716157134745809, + -0.703161905301754, + 0.33469874882651, + -0.586690904512625, + 0.147068929694523 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0880046, + "molar_mass_units": "kg/mol", + "p_max": 51000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 11294.32904, + "ptriple_units": "Pa", + "reducing_state": { + "T": 227.51, + "T_units": "K", + "p": 3750000, + "p_units": "Pa", + "rhomolar": 7109.4194, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 1.136304238642071e+100, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.136304238642071e+100, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R14" +} \ No newline at end of file diff --git a/dev/fluids/R141b.json b/dev/fluids/R141b.json new file mode 100644 index 00000000..6d18c3d6 --- /dev/null +++ b/dev/fluids/R141b.json @@ -0,0 +1,255 @@ +{ + "ALIASES": [ + "R141B" + ], + "ANCILLARIES": { + "pL": { + "T_r": 477.5, + "Tmax": 477.49999999999903, + "Tmin": 169.68, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.018460232880523897, + "n": [ + -30.1815277612222, + 24.413010375904488, + -1.1112676337911325, + -3.1252752919171236, + -1.7371129089761865, + -1.7017122235679412 + ], + "reducing_value": 4212000.0, + "t": [ + 1.049, + 1.078, + 2.184, + 4.325, + 9.594, + 16.104 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 477.5, + "Tmax": 477.49999999999903, + "Tmin": 169.68, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019246627466973365, + "n": [ + -6.548634339175584, + 0.901672493371514, + -2.637481779917132, + -37.87631589108344, + 64.82259169597823, + -38.10709089407612 + ], + "reducing_value": 4212000.0, + "t": [ + 0.983, + 1.631, + 2.843, + 8.359, + 9.453, + 11.517 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 477.5, + "Tmax": 477.49999999999903, + "Tmin": 169.68, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7666798970932698, + "n": [ + -0.9378377457620258, + 3.2148374020900103, + 1.0653350522107268, + -4378.068628183692, + 272955.32986322936, + -277906.31972088123 + ], + "reducing_value": 3921.0000000000005, + "t": [ + 0.29, + 0.341, + 2.503, + 15.166, + 18.069, + 18.242 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 477.5, + "Tmax": 477.49999999999903, + "Tmin": 169.68, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4790877842035246, + "n": [ + 0.6509988493015847, + -3.8560643644234873, + -69.71635657603578, + 75.36138733740711, + -12.174836839230538, + -0.9652029917534032 + ], + "reducing_value": 3921.0000000000005, + "t": [ + 0.279, + 0.374, + 1.89, + 1.986, + 3.019, + 8.269 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 477.5, + "a": [ + 7.3958e-05, + 0.059941 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 0.066331, + 1.2214 + ] + } + }, + "CAS": "1717-00-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 1, + "GWP100": 725.0, + "GWP20": 2250.0, + "GWP500": 220.0, + "HH": 1, + "Name": "R141b", + "ODP": 0.12, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 169.68, + "Ttriple_units": "K", + "accentric": 0.2195, + "accentric_units": "-", + "alpha0": [ + { + "a1": -15.5074814985, + "a2": 9.1871858933, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 6.8978, + 7.8157, + 3.2039 + ], + "t": [ + 1.05130890052356, + 3.290052356020942, + 9.63979057591623 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.1469, + -3.6799, + 1.3469, + 0.083329, + 0.00025137, + 0.3272, + 0.46946, + -0.029829, + -0.31621, + -0.026219, + -0.078043, + -0.020498 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.11694962, + "molar_mass_units": "kg/mol", + "p_max": 400000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 6.492735177, + "ptriple_units": "Pa", + "reducing_state": { + "T": 477.5, + "T_units": "K", + "p": 4212000, + "p_units": "Pa", + "rhomolar": 3921.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12559.6898931719, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.004602980802102235, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R141b" +} \ No newline at end of file diff --git a/dev/fluids/R142b.json b/dev/fluids/R142b.json new file mode 100644 index 00000000..43ae3ba4 --- /dev/null +++ b/dev/fluids/R142b.json @@ -0,0 +1,255 @@ +{ + "ALIASES": [ + "R142B" + ], + "ANCILLARIES": { + "pL": { + "T_r": 410.26, + "Tmax": 410.25999999999914, + "Tmin": 142.72, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.016702977994387247, + "n": [ + -7.053583364113904, + 1.620065366585568, + -3.5992302698185896, + 30.256775801825796, + -31.3125464775288, + -0.7436150349113302 + ], + "reducing_value": 4055000.0, + "t": [ + 0.993, + 1.485, + 2.56, + 3.61, + 3.733, + 14.147 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 410.26, + "Tmax": 410.25999999999914, + "Tmin": 142.72, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019960603250079867, + "n": [ + 0.007504607089828755, + -6.4820128159502906, + 0.40977136350415566, + -2.402572406912058, + -1.8764909849689335, + 0.05707725832641831 + ], + "reducing_value": 4055000.0, + "t": [ + 0.416, + 0.975, + 1.491, + 3.189, + 5.386, + 4.774 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 410.26, + "Tmax": 410.25999999999914, + "Tmin": 142.72, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5611813999881976, + "n": [ + -9.714230485565954, + 11.7638029884687, + 2.4153342114392036, + -3.0195139591161673, + 8.696072645236315, + -74.7964429355484 + ], + "reducing_value": 4438.0, + "t": [ + 0.247, + 0.26, + 1.896, + 3.015, + 7.62, + 15.172 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 410.26, + "Tmax": 410.25999999999914, + "Tmin": 142.72, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2920889286560979, + "n": [ + 0.07060973078462121, + -0.1101282083100916, + -2.9297126160159235, + -2.550579057791659, + 0.8675055868776257, + -5.524200468568231 + ], + "reducing_value": 4438.0, + "t": [ + 0.092, + 0.165, + 0.398, + 1.037, + 3.911, + 4.103 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 410.26, + "a": [ + 0.05685 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.237 + ] + } + }, + "CAS": "75-68-3", + "ENVIRONMENTAL": { + "ASHRAE34": "A2", + "FH": 1, + "GWP100": 2310.0, + "GWP20": 5490.0, + "GWP500": 705.0, + "HH": 1, + "Name": "R142b", + "ODP": 0.07, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 470, + "T_max_units": "K", + "Ttriple": 142.72, + "Ttriple_units": "K", + "accentric": 0.2321, + "accentric_units": "-", + "alpha0": [ + { + "a1": -12.6016527149, + "a2": 8.3160183265, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 5.0385, + 6.8356, + 4.0591, + 2.8136 + ], + "t": [ + 1.152927411885146, + 3.061473212109394, + 6.086384244137864, + 16.67235411690148 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.0038, + -2.7662, + 0.42921, + 0.081363, + 0.00024174, + 0.48246, + 0.75542, + -0.00743, + -0.4146, + -0.016558, + -0.10644, + -0.021704 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.10049503, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 3.632651717, + "ptriple_units": "Pa", + "reducing_state": { + "T": 410.26, + "T_units": "K", + "p": 4055000, + "p_units": "Pa", + "rhomolar": 4438, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14438.99364774879, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.003061859597935982, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R142b" +} \ No newline at end of file diff --git a/dev/fluids/R143a.json b/dev/fluids/R143a.json new file mode 100644 index 00000000..85bde1c1 --- /dev/null +++ b/dev/fluids/R143a.json @@ -0,0 +1,282 @@ +{ + "ALIASES": [ + "R143A" + ], + "ANCILLARIES": { + "pL": { + "T_r": 345.857, + "Tmax": 345.85699999999935, + "Tmin": 161.34, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.021732921956241213, + "n": [ + 0.002757544974908688, + 0.38770586469190393, + -6.752272877216631, + -0.5997730155885828, + -3.2285390578912927, + 91.83265252025414 + ], + "reducing_value": 3761000.0, + "t": [ + 0.286, + 0.768, + 0.952, + 2.711, + 4.226, + 18.933 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 345.857, + "Tmax": 345.85699999999935, + "Tmin": 161.34, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.021749642310531225, + "n": [ + 0.024303276489290756, + -6.510885016909917, + 0.12842302942065706, + -1.0754739908073552, + -2.8675285594067415, + 20.271941975061065 + ], + "reducing_value": 3761000.0, + "t": [ + 0.454, + 0.968, + 1.363, + 2.999, + 4.469, + 15.514 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 345.857, + "Tmax": 345.85699999999935, + "Tmin": 161.34, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6288812047839043, + "n": [ + 2.664780959919923, + -0.254772168947589, + 97.84474908938734, + -105.1304757408368, + 13272.94203979726, + -116968.31229953805 + ], + "reducing_value": 5128.45, + "t": [ + 0.381, + 0.463, + 3.927, + 4.049, + 16.046, + 19.95 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 345.857, + "Tmax": 345.85699999999935, + "Tmin": 161.34, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4817150212059307, + "n": [ + -6.218069939810391, + 4.25938169894919, + -4.417810181991655, + 23.70234830311772, + -50.98632502013336, + 29.108143754921628 + ], + "reducing_value": 5128.45, + "t": [ + 0.454, + 0.587, + 1.058, + 3.611, + 4.279, + 5.478 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 345.857, + "a": [ + 0.05416 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.255 + ] + } + }, + "CAS": "420-46-2", + "ENVIRONMENTAL": { + "ASHRAE34": "A2", + "FH": 1, + "GWP100": 4470.0, + "GWP20": 5890.0, + "GWP500": 1590.0, + "HH": 1, + "Name": "R143a", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "LemmonJacobsen-JPCRD-2000", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 161.34, + "Ttriple_units": "K", + "accentric": 0.261489646224, + "accentric_units": "-", + "alpha0": [ + { + "a1": 5.903087, + "a2": 7.307253, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 273.15, + "Tc": 345.857, + "c": [ + 1.0578 + ], + "t": [ + 0.33 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 4.4402, + 3.7515 + ], + "t": [ + 5.178440800677737, + 2.379596191489546 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 3, + 5, + 7, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3 + ], + "n": [ + 7.7736443, + -8.70185, + -0.27779799, + 0.1460922, + 0.0089581616, + -0.20552116, + 0.10653258, + 0.023270816, + -0.013247542, + -0.04279387, + 0.36221685, + -0.25671899, + -0.092326113, + 0.083774837, + 0.017128445, + -0.01725611, + 0.0049080492 + ], + "t": [ + 0.67, + 0.833, + 1.7, + 1.82, + 0.35, + 3.9, + 0.95, + 0, + 1.19, + 7.2, + 5.9, + 7.65, + 7.5, + 7.45, + 15.5, + 22, + 19 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.08404099999999999, + "molar_mass_units": "kg/mol", + "p_max": 150000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1074.945443, + "ptriple_units": "Pa", + "reducing_state": { + "T": 345.857, + "T_units": "K", + "p": 3761000, + "p_units": "Pa", + "rhomolar": 5128.45, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 15832.07605236137, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.8036952601578995, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R143a" +} \ No newline at end of file diff --git a/dev/fluids/R152A.json b/dev/fluids/R152A.json new file mode 100644 index 00000000..179be08c --- /dev/null +++ b/dev/fluids/R152A.json @@ -0,0 +1,253 @@ +{ + "ALIASES": [ + "R152a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 386.411, + "Tmax": 386.4109999999993, + "Tmin": 154.56, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.12140204459119008, + "n": [ + -0.002091012267118934, + -6.995494450649338, + 0.9348417755500018, + -3.706406451221934, + -66.08072669965013, + 122.73360925177805 + ], + "reducing_value": 4520000.0, + "t": [ + 0.049, + 0.993, + 1.692, + 3.445, + 15.803, + 17.838 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 386.411, + "Tmax": 386.4109999999993, + "Tmin": 154.56, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.16059785174262764, + "n": [ + -8.058110929331818e-05, + -5.144477525553562, + -1.521963154763345, + -6.312478722604828, + 5.544700008436013, + -111.12850271670084 + ], + "reducing_value": 4520000.0, + "t": [ + 0.085, + 0.94, + 1.166, + 4.638, + 6.935, + 17.582 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 386.411, + "Tmax": 386.4109999999993, + "Tmin": 154.56, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.482115019286124, + "n": [ + 0.27636163699950356, + 2.512764633534828, + 162.80865128111427, + 345.16760517849104, + -475.5953680253087, + -1773.7454734026196 + ], + "reducing_value": 5571.452362568319, + "t": [ + 0.091, + 0.499, + 16.122, + 16.122, + 19.05, + 19.528 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 386.411, + "Tmax": 386.4109999999993, + "Tmin": 154.56, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.6145478143872904, + "n": [ + -24.05629942535681, + 24.599913141549887, + -10.746520376686876, + 5.86362610412505, + -3.7063275045589696, + -4.904962359487088 + ], + "reducing_value": 5571.452362568319, + "t": [ + 0.162, + 0.168, + 0.621, + 0.787, + 2.442, + 7.345 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 386.411, + "a": [ + 0.05808 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.2115 + ] + } + }, + "CAS": "75-37-6", + "ENVIRONMENTAL": { + "ASHRAE34": "A2", + "FH": 4, + "GWP100": 124.0, + "GWP20": 437.0, + "GWP500": 38.0, + "HH": 1, + "Name": "R152A", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "TillnerRoth-IJT-1995", + "BibTeX_EOS": "Span-IJT-2003C", + "T_max": 471, + "T_max_units": "K", + "Ttriple": 154.56, + "Ttriple_units": "K", + "accentric": 0.275217114532099, + "accentric_units": "-", + "alpha0": [ + { + "a1": 10.87227, + "a2": 6.839515, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -20.78887, + -0.6539092, + 0.03342831 + ], + "t": [ + -0.25, + -2, + -4 + ], + "type": "IdealGasHelmholtzPower" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.95702326, + -2.3707196, + 0.18748463, + 0.063800843, + 0.00016625977, + 0.082208165, + 0.57243518, + 0.0039476701, + -0.23848654, + -0.080711618, + -0.073103558, + -0.015538724 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.066051, + "molar_mass_units": "kg/mol", + "p_max": 58000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 64.08986801, + "ptriple_units": "Pa", + "reducing_state": { + "T": 386.411, + "T_units": "K", + "p": 4520000, + "p_units": "Pa", + "rhomolar": 5571.452362568319, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 18031.06754931742, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.04989696663288685, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R152A" +} \ No newline at end of file diff --git a/dev/fluids/R161.json b/dev/fluids/R161.json new file mode 100644 index 00000000..fcb1fd59 --- /dev/null +++ b/dev/fluids/R161.json @@ -0,0 +1,298 @@ +{ + "ALIASES": [ + "Fluoroethane", + "FLUOROETHANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 375.25, + "Tmax": 375.2499999999994, + "Tmin": 130.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028081837897198092, + "n": [ + 0.004114007295473757, + -6.483344699665786, + 4.717832719212871, + -6.0036159561286375, + -8.92774506978172, + 6.727500969566306 + ], + "reducing_value": 5010000.0, + "t": [ + 0.358, + 0.979, + 2.041, + 2.312, + 7.268, + 8.389 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 375.25, + "Tmax": 375.2499999999994, + "Tmin": 130.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.030832559045790298, + "n": [ + -0.007844518150924242, + 25.45019959482669, + -31.3504385516059, + 1.1481149665076051, + -2.6194902114004543, + -3.261988824418926 + ], + "reducing_value": 5010000.0, + "t": [ + 0.361, + 0.847, + 0.865, + 2.188, + 2.386, + 5.603 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 375.25, + "Tmax": 375.2499999999994, + "Tmin": 130.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.09082481888231797, + "n": [ + 7.345119166859648, + -11.515617231318577, + 6.89480557431733, + -1.9186452820369757, + 183.43884409350315, + -184.35734585122438 + ], + "reducing_value": 6280.0, + "t": [ + 0.331, + 0.379, + 0.459, + 3.341, + 6.576, + 6.669 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 375.25, + "Tmax": 375.2499999999994, + "Tmin": 130.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.20059504347491597, + "n": [ + -0.3089763166551767, + -2.9925531954627664, + -1.8199815337621044, + -1.0253004294209247, + -2.9173025831139583, + -1.6688506440273063 + ], + "reducing_value": 6280.0, + "t": [ + 0.148, + 0.482, + 0.891, + 2.774, + 4.26, + 6.784 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 375.3, + "a": [ + 0.05385 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.111 + ] + } + }, + "CAS": "353-36-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 10.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "R161", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Wu-IJT-2012", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 130, + "Ttriple_units": "K", + "accentric": 0.2162428410661867, + "accentric_units": "-", + "alpha0": [ + { + "a1": -6.9187, + "a2": 5.4788, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.059, + 9.253, + 6.088 + ], + "t": [ + 1.11925383077948, + 4.125249833444371, + 10.34510326449034 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 3, + 4, + 2, + 7, + 1, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2 + ], + "n": [ + 1.511, + -2.3, + -0.457, + 0.1683, + 0.04133, + 0.62187, + -0.0265, + -1.03, + -0.285, + -0.476 + ], + "t": [ + 0.37, + 0.97, + 1.14, + 0.744, + 1, + 1.26, + 1, + 1.8, + 3, + 2.25 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 2.7, + 5.2, + 3.9, + 4.7, + 413 + ], + "d": [ + 1, + 1, + 3, + 3, + 3 + ], + "epsilon": [ + 0.683, + 0.892, + 0.785, + 1.33, + 0.86 + ], + "eta": [ + 0.96, + 1.35, + 1.26, + 1.23, + 16.8 + ], + "gamma": [ + 0.9, + 0.69, + 0.67, + 0.67, + 1.15 + ], + "n": [ + 0.82, + -0.3532, + -0.116, + -0.0220583, + -1.63148 + ], + "t": [ + 1, + 1.2, + 5.3, + 1, + 4 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0480595, + "molar_mass_units": "kg/mol", + "p_max": 5000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 5.512269452, + "ptriple_units": "Pa", + "reducing_state": { + "T": 375.25, + "T_units": "K", + "p": 5010000, + "p_units": "Pa", + "rhomolar": 6280, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 19913.22529395975, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.005100738577476638, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R161" +} \ No newline at end of file diff --git a/dev/fluids/R21.json b/dev/fluids/R21.json new file mode 100644 index 00000000..b4ddd22a --- /dev/null +++ b/dev/fluids/R21.json @@ -0,0 +1,316 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 451.48, + "Tmax": 451.47999999999917, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05826785438975968, + "n": [ + 0.015053861978396133, + 0.960309329970009, + -6.9145776997149255, + -2.9343265925945237, + 1384.3706348421958, + -2744.0923786590133 + ], + "reducing_value": 5181200.0, + "t": [ + 0.363, + 0.784, + 0.926, + 3.236, + 19.172, + 19.986 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 451.48, + "Tmax": 451.47999999999917, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06815685685508388, + "n": [ + 0.0018788440318928358, + -6.563138713373014, + 4.137852310206907, + -6.289887616085091, + 0.10742860069097583, + -79.5502994261936 + ], + "reducing_value": 5181200.0, + "t": [ + 0.091, + 0.987, + 2.079, + 2.561, + 2.725, + 15.503 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 451.48, + "Tmax": 451.47999999999917, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.527142850874342, + "n": [ + 0.5619681997988593, + 4.92151800722533, + -5.5582908804962186, + 30.01966721829401, + -42929.54870444089, + 216673.96540670822 + ], + "reducing_value": 5110.765599999999, + "t": [ + 0.122, + 0.902, + 1.769, + 5.732, + 16.703, + 19.838 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 451.48, + "Tmax": 451.47999999999917, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.171498053602172, + "n": [ + -7.33498076512952, + 12.676510112148431, + -10.046553362223358, + -16.99517541299311, + 222.23399842968522, + -1233.3931692026647 + ], + "reducing_value": 5110.765599999999, + "t": [ + 0.194, + 0.256, + 0.429, + 4.632, + 9.16, + 13.215 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 451.48, + "a": [ + 0.06924 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.259 + ] + } + }, + "CAS": "75-43-4", + "ENVIRONMENTAL": { + "ASHRAE34": "B1", + "FH": -1, + "GWP100": 151.0, + "GWP20": 530.0, + "GWP500": 46.0, + "HH": -1, + "Name": "R21", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "Platzer-BOOK-1990", + "BibTeX_EOS": "Platzer-BOOK-1990", + "T_max": 473, + "T_max_units": "K", + "Ttriple": 142.8, + "Ttriple_units": "K", + "accentric": 0.2061, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 451.48, + "c": [ + 2.941888561986215, + 0.01573866857206258, + 4.012367529660798e-06, + -3.085298103142579e-08, + 2.125677686617732e-11 + ], + "t": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 0.50467662375195, + -0.732431416212257, + -0.868403860880684, + 0.146234705622829, + -0.280576335158724, + 0.864743657302055, + -2.70767234069002, + 3.30476391081085, + -0.210878239585469, + 0.449531450327333, + 0.120779813434928, + -0.277297954448155, + 0.030544129220629, + -44.3864848810647, + 9.26505601085111, + -0.551709104525115 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 0.07470252, + 0.07470252, + 0.07470252, + 0.07470252, + 0.07470252, + 0.07470252 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + 1.21128809697908, + 0.167119476809363, + -0.0504876793555323, + 44.3864848810647, + -9.26505601085111, + 0.551709104525115 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1029227, + "molar_mass_units": "kg/mol", + "p_max": 138000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 872.8349799, + "ptriple_units": "Pa", + "reducing_state": { + "T": 451.48, + "T_units": "K", + "p": 5181200, + "p_units": "Pa", + "rhomolar": 5110.765599999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9.716029602798992e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 9.716029602798992e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R21" +} \ No newline at end of file diff --git a/dev/fluids/R218.json b/dev/fluids/R218.json new file mode 100644 index 00000000..776ab641 --- /dev/null +++ b/dev/fluids/R218.json @@ -0,0 +1,251 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 345.02, + "Tmax": 345.01999999999936, + "Tmin": 125.45000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05644372175876988, + "n": [ + -12.499645349068787, + 6.002828616549345, + 0.016915019734164472, + -3.5468006592555676, + -1.0346388890887666, + -2.2559550336938123 + ], + "reducing_value": 2640000.0, + "t": [ + 1.014, + 1.081, + 1.41, + 3.247, + 5.671, + 11.776 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 345.02, + "Tmax": 345.01999999999936, + "Tmin": 125.45000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.018024375182712493, + "n": [ + -8.242713023595973, + 19.087798455338692, + -17.233089915234846, + -1.422792519033736, + -3.3648176664863447, + -10.213938754091759 + ], + "reducing_value": 2640000.0, + "t": [ + 1.008, + 1.599, + 1.665, + 2.07, + 4.314, + 17.759 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 345.02, + "Tmax": 345.01999999999936, + "Tmin": 125.45000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.30131835528779405, + "n": [ + 7.303753750603384, + -7.730626041358162, + 3.674253188196436, + -3.58395389631866, + 5.552496612344577, + -211.54319300173208 + ], + "reducing_value": 3340.0000000000005, + "t": [ + 0.517, + 0.714, + 1.159, + 3.98, + 5.488, + 19.277 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 345.02, + "Tmax": 345.01999999999936, + "Tmin": 125.45000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.09201959542241012, + "n": [ + 3.329585797093735, + -6.844734619770494, + -1.1111833788437069, + -2.0711985469576675, + -4.658013576000995, + 0.29142793495095165 + ], + "reducing_value": 3340.0000000000005, + "t": [ + 0.372, + 0.41, + 0.775, + 1.882, + 4.237, + 8.879 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 345.02, + "a": [ + 0.04322 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.224 + ] + } + }, + "CAS": "76-19-7", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 8830.0, + "GWP20": 6310.0, + "GWP500": 12500.0, + "HH": 2, + "Name": "R218", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 440, + "T_max_units": "K", + "Ttriple": 125.45, + "Ttriple_units": "K", + "accentric": 0.3172, + "accentric_units": "-", + "alpha0": [ + { + "a1": -15.6587335175, + "a2": 11.4531412796, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 7.2198, + 7.2692, + 11.599 + ], + "t": [ + 0.9448727609993625, + 1.724537707958959, + 4.315691843951075 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.327, + -3.8433, + 0.922, + 0.1136, + 0.00036195, + 1.1001, + 1.1896, + -0.025147, + -0.65923, + -0.027969, + -0.1833, + -0.02163 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.18801933, + "molar_mass_units": "kg/mol", + "p_max": 20000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2.018573558, + "ptriple_units": "Pa", + "reducing_state": { + "T": 345.02, + "T_units": "K", + "p": 2640000, + "p_units": "Pa", + "rhomolar": 3340.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 10686.98548996255, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.001935680262154043, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R218" +} \ No newline at end of file diff --git a/dev/fluids/R22.json b/dev/fluids/R22.json new file mode 100644 index 00000000..c455f7a6 --- /dev/null +++ b/dev/fluids/R22.json @@ -0,0 +1,374 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 369.295, + "Tmax": 369.2949999999993, + "Tmin": 115.73000000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.021684799425192303, + "n": [ + 0.14078959771894048, + -6.6171269814683065, + 1.6782909752933965, + -2.5338941612118235, + -2.979681135700748, + 0.4341331068854343 + ], + "reducing_value": 4990000.0, + "t": [ + 0.806, + 0.979, + 1.977, + 2.453, + 4.897, + 8.097 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 369.295, + "Tmax": 369.2949999999993, + "Tmin": 115.73000000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01948277890697625, + "n": [ + -7.2670371701641265, + 1.2860929616388512, + -0.10790119794275199, + -0.989473291657183, + -2.9393096353041623, + 0.488431917326884 + ], + "reducing_value": 4990000.0, + "t": [ + 0.999, + 1.272, + 1.692, + 2.74, + 4.539, + 15.876 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 369.295, + "Tmax": 369.2949999999993, + "Tmin": 115.73000000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3314470249190071, + "n": [ + 1.854194439375902, + 0.5825631843499427, + 3.174073656022523, + -10.117473443656856, + 12.021023952475513, + -39.819978547168276 + ], + "reducing_value": 6058.220000000001, + "t": [ + 0.351, + 0.588, + 3.365, + 5.022, + 6.849, + 16.221 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 369.295, + "Tmax": 369.2949999999993, + "Tmin": 115.73000000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6907353964608065, + "n": [ + -1.7899191799956613, + -1.332183889152018, + -2.5626654031276335, + -5.6750215901718954, + 0.6059879695747222, + 3.499235901423112 + ], + "reducing_value": 6058.220000000001, + "t": [ + 0.343, + 0.528, + 1.104, + 4.839, + 7.214, + 11.11 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 369.295, + "a": [ + 3.0587, + -2.99856 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.41809, + 1.42291 + ] + } + }, + "CAS": "75-45-6", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1810.0, + "GWP20": 5160.0, + "GWP500": 549.0, + "HH": 1, + "Name": "R22", + "ODP": 0.05, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Kamei-IJT-1995", + "T_max": 550, + "T_max_units": "K", + "Ttriple": 115.73, + "Ttriple_units": "K", + "accentric": 0.22082, + "accentric_units": "-", + "alpha0": [ + { + "a1": -15.86079407387002, + "a2": 11.68367319965483, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 273.15, + "Tc": 369.295, + "cp_over_R": 4.00526140446, + "type": "IdealGasHelmholtzCP0Constant" + }, + { + "T0": 273.15, + "Tc": 369.295, + "c": [ + 0.000120662553 + ], + "t": [ + 1 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "t": [ + 11.78545471777306, + 5.240144329059424, + 5.111575732138263, + 4.589509308276581, + 4.34795618678834, + 3.147982615524174, + 2.322026780757931, + 1.640223615266927, + 1.437630674663887 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 5, + 6, + 7, + 7, + 7, + 8, + 8, + 2, + 2, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 6, + 6, + 6, + 8, + 8, + 8 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 4, + 2, + 2, + 4, + 2, + 2, + 4 + ], + "n": [ + 0.0695645445236, + 25.2275419999, + -202.351148311, + 350.063090302, + -223.134648863, + 48.8345904592, + 0.0108874958556, + 0.590315073614, + -0.689043767432, + 0.284224445844, + 0.125436457897, + -0.0113338666416, + -0.063138895917, + 0.00974021015232, + -0.000408406844722, + 0.00074194877357, + 0.000315912525922, + 8.76009723338e-06, + -0.000110343340301, + -7.05323356879e-05, + 0.23585073151, + -0.192640494729, + 0.00375218008557, + -4.48926036678e-05, + 0.0198120520635, + -0.0356958425255, + 0.0319594161562, + 2.60284291078e-06, + -0.00897629021967, + 0.0345482791645, + -0.00411831711251, + 0.00567428536529, + -0.00563368989908, + 0.00191384919423, + -0.00178930036389 + ], + "t": [ + -1, + 1.75, + 2.25, + 2.5, + 2.75, + 3, + 5.5, + 1.5, + 1.75, + 3.5, + 1, + 4.5, + 1.5, + 0.5, + 4.5, + 1, + 4, + 5, + -0.5, + 3.5, + 5, + 7, + 12, + 15, + 3.5, + 3.5, + 8, + 15, + 25, + 3, + 9, + 19, + 2, + 7, + 13 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.086468, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.3794696733, + "ptriple_units": "Pa", + "reducing_state": { + "T": 369.295, + "T_units": "K", + "p": 4990000, + "p_units": "Pa", + "rhomolar": 6058.220000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 19906.50360279436, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0003944515301070936, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R22" +} \ No newline at end of file diff --git a/dev/fluids/R227EA.json b/dev/fluids/R227EA.json new file mode 100644 index 00000000..ed82915f --- /dev/null +++ b/dev/fluids/R227EA.json @@ -0,0 +1,317 @@ +{ + "ALIASES": [ + "R227ea" + ], + "ANCILLARIES": { + "pL": { + "T_r": 374.9, + "Tmax": 374.8999999999993, + "Tmin": 146.35, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.010578535119587507, + "n": [ + -7.109161477135856, + -0.43619976868074284, + 5.934481777381213, + 39.44778344273422, + -41.38716737709299, + -8.362365023243223 + ], + "reducing_value": 2925000.0, + "t": [ + 0.987, + 1.312, + 1.927, + 3.476, + 3.578, + 2.248 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 374.9, + "Tmax": 374.8999999999993, + "Tmin": 146.35, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.014130102564613445, + "n": [ + 10.093738859898867, + -16.82115838958235, + -0.07297852700598685, + -14.198048704342424, + 50.7816690049031, + -41.683491945535145 + ], + "reducing_value": 2925000.0, + "t": [ + 0.889, + 0.919, + 1.495, + 3.227, + 3.53, + 3.663 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 374.9, + "Tmax": 374.8999999999993, + "Tmin": 146.35, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2727146007857062, + "n": [ + -0.037180636267061765, + 2.2565260411325867, + 16.777771835065064, + -22.313716095609287, + 6.793310681390873, + -10.89306852102585 + ], + "reducing_value": 3495.0, + "t": [ + 0.12, + 0.35, + 2.248, + 2.467, + 3.208, + 12.192 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 374.9, + "Tmax": 374.8999999999993, + "Tmin": 146.35, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7920968700624531, + "n": [ + -6.947050225285722, + 123.4065348806111, + -122.5651518640378, + -9.994885618440552, + 3.478879029818986, + 245.61726193605475 + ], + "reducing_value": 3495.0, + "t": [ + 0.434, + 0.676, + 0.691, + 4.287, + 4.613, + 19.251 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 374.9, + "a": [ + 0.06127, + -0.009516, + -0.00192 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.192, + 0.9795, + 1.421 + ] + } + }, + "CAS": "431-89-0", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 3220.0, + "GWP20": 5310.0, + "GWP500": 1040.0, + "HH": 1, + "Name": "R227EA", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "McLinden-PREPRINT-2013", + "T_max": 475, + "T_max_units": "K", + "Ttriple": 146.35, + "Ttriple_units": "K", + "accentric": 0.3576047602255754, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 11.43, + 12.83 + ], + "t": [ + 1.07495332088557, + 3.809015737530008 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 2, + 4, + 1, + 3, + 6, + 6, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2 + ], + "n": [ + 2.024341, + -2.60593, + 0.4957216, + -0.824082, + 0.06543703, + -1.02461, + 0.6247065, + 0.2997521, + -0.353917, + -1.232043, + -0.8824483 + ], + "t": [ + 0.34, + 0.77, + 0.36, + 0.9, + 1, + 2.82, + 2.1, + 0.9, + 1.13, + 3.8, + 2.75 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.72, + 5.2, + 2.31, + 1.02, + 5.63, + 50.9, + 1.56 + ], + "d": [ + 1, + 2, + 1, + 1, + 4, + 2, + 1 + ], + "epsilon": [ + 1.13, + 0.71, + 1.2, + 1.7, + 0.546, + 0.896, + 0.747 + ], + "eta": [ + 0.83, + 2.19, + 2.44, + 3.65, + 8.88, + 8.23, + 2.01 + ], + "gamma": [ + 0.414, + 1.051, + 1.226, + 1.7, + 0.904, + 1.42, + 0.926 + ], + "n": [ + 0.1349661, + -0.2662928, + 0.1764733, + 0.01536163, + -0.004667185, + -11.70854, + 0.9114512 + ], + "t": [ + 1.5, + 2.5, + 2.5, + 5.4, + 4, + 1, + 3.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.17002886, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 7.331567153, + "ptriple_units": "Pa", + "reducing_state": { + "T": 374.9, + "T_units": "K", + "p": 2925000, + "p_units": "Pa", + "rhomolar": 3495, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11046.68969808219, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.006026313356105609, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R227EA" +} \ No newline at end of file diff --git a/dev/fluids/R23.json b/dev/fluids/R23.json new file mode 100644 index 00000000..3405928b --- /dev/null +++ b/dev/fluids/R23.json @@ -0,0 +1,275 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 299.293, + "Tmax": 299.29299999999944, + "Tmin": 118.02000000000001, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.012654997293293224, + "n": [ + -7.936902891620701, + 1.264449855550644, + 1.434041724133205, + -2.403496757193404, + -2.608881526209462, + 0.682818906962693 + ], + "reducing_value": 4832000.0, + "t": [ + 0.996, + 1.088, + 1.946, + 2.549, + 4.598, + 9.592 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 299.293, + "Tmax": 299.29299999999944, + "Tmin": 118.02000000000001, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.010075585009383659, + "n": [ + -9.122332373664854, + 3.016924110443656, + -0.5967906858271617, + 9.579184584147457, + -12.877039154975156, + 0.4375260704699433 + ], + "reducing_value": 4832000.0, + "t": [ + 1.014, + 1.178, + 2.077, + 3.82, + 3.866, + 12.722 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 299.293, + "Tmax": 299.29299999999944, + "Tmin": 118.02000000000001, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.14053018994538702, + "n": [ + -3.3533086837494186, + 5.426490146945459, + -0.27772667131392875, + 1.022401312663457, + 8.263580367250993, + -245.19616208727248 + ], + "reducing_value": 7519.999999999999, + "t": [ + 0.212, + 0.25, + 0.358, + 0.841, + 9.921, + 17.541 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 299.293, + "Tmax": 299.29299999999944, + "Tmin": 118.02000000000001, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3365790714614292, + "n": [ + -5.0704437393717505, + 4.7882747149545795, + -23.58027456800221, + 23.333602102883393, + -9.217295829606783, + 4.050830873748802 + ], + "reducing_value": 7519.999999999999, + "t": [ + 0.475, + 0.852, + 1.451, + 1.751, + 2.978, + 14.67 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 299.293, + "a": [ + -0.32359, + 0.37702 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.6055, + 1.5232 + ] + } + }, + "CAS": "75-46-7", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 14800.0, + "GWP20": 12000.0, + "GWP500": 12200.0, + "HH": 1, + "Name": "R23", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Penoncello-JPCRD-2003", + "T_max": 425, + "T_max_units": "K", + "Ttriple": 118.02, + "Ttriple_units": "K", + "accentric": 0.262964892496154, + "accentric_units": "-", + "alpha0": [ + { + "a1": -8.31386064, + "a2": 6.55087253, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.999, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 2.371, + 3.237, + 2.61, + 0.8274 + ], + "t": [ + 2.485858339486724, + 4.874821663052594, + 7.133477896242144, + 16.4086697650797 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 2, + 3, + 5, + 1, + 2, + 2, + 4, + 4, + 4, + 2, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 4 + ], + "n": [ + 7.041529, + -8.259512, + 0.00805304, + -0.08617615, + 0.00633341, + -0.1863285, + 0.328051, + 0.5191023, + 0.06916144, + -0.005045875, + -0.01744221, + -0.05003972, + 0.04729813, + -0.06164031, + 0.01583585, + -0.00179579, + -0.001099007 + ], + "t": [ + 0.744, + 0.94, + 4.3, + 1.46, + 0.68, + 4.8, + 1.5, + 2.07, + 0.09, + 9.6, + 0.19, + 11.2, + 0.27, + 1.6, + 10.3, + 14, + 15 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07001385, + "molar_mass_units": "kg/mol", + "p_max": 120000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 58.04099433, + "ptriple_units": "Pa", + "reducing_state": { + "T": 299.293, + "T_units": "K", + "p": 4832000, + "p_units": "Pa", + "rhomolar": 7519.999999999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 24307.66608253263, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0591864606267919, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R23" +} \ No newline at end of file diff --git a/dev/fluids/R236EA.json b/dev/fluids/R236EA.json new file mode 100644 index 00000000..8bb1075f --- /dev/null +++ b/dev/fluids/R236EA.json @@ -0,0 +1,301 @@ +{ + "ALIASES": [ + "R236ea" + ], + "ANCILLARIES": { + "pL": { + "T_r": 412.44, + "Tmax": 412.43999999999926, + "Tmin": 243.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.13035323047732028, + "n": [ + -1.086198070243854, + -8.147203344085657, + 3.4106562858664127, + -6.799234376411155, + 3319544.8718597437, + -4916875.643568467 + ], + "reducing_value": 3420000.0, + "t": [ + 0.746, + 1.129, + 1.707, + 3.441, + 18.257, + 18.723 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 412.44, + "Tmax": 412.43999999999926, + "Tmin": 243.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03450101622934909, + "n": [ + -0.01366195244731475, + 0.028884775034159767, + -0.014637027617221486, + -6.940549344871703, + -2.9156270677455987, + -3.8449530863570414 + ], + "reducing_value": 3420000.0, + "t": [ + 0.072, + 0.159, + 0.28, + 0.975, + 3.343, + 5.012 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 412.44, + "Tmax": 412.43999999999926, + "Tmin": 243.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.85243167933693, + "n": [ + 73.91473114602317, + -84.48156059389362, + 27.6288904418195, + -25.47850648952525, + 91.75937442449276, + -17637.12637362363 + ], + "reducing_value": 3715.9999999999995, + "t": [ + 0.643, + 0.695, + 1.291, + 2.156, + 5.361, + 12.859 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 412.44, + "Tmax": 412.43999999999926, + "Tmin": 243.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.254039687333421, + "n": [ + -4.265462216604608, + -0.5723936371527714, + -242.68126932071, + 5628.347652868032, + -158549.1553855615, + 335529.06839972973 + ], + "reducing_value": 3715.9999999999995, + "t": [ + 0.463, + 1.088, + 4.746, + 7.264, + 10.426, + 11.817 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 412.44, + "a": [ + 0.306974, + -0.247277 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.12614, + 1.09899 + ] + } + }, + "CAS": "431-63-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 1200.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": -1, + "Name": "R236EA", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Rui-FPE-2013", + "T_max": 412, + "T_max_units": "K", + "Ttriple": 170, + "Ttriple_units": "K", + "accentric": 0.3687823803991404, + "accentric_units": "-", + "alpha0": [ + { + "a1": -14.121424135, + "a2": 10.2355589225, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.762, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 0.7762, + 10.41, + 12.18, + 3.332 + ], + "t": [ + 0.3491416933372127, + 0.93346911065852, + 3.724178062263602, + 17.26554165454369 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.051074, + 2.5584, + -2.918, + -0.71485, + 0.15534, + -1.5894, + -0.784, + 0.85767, + -0.67235, + -0.017953 + ], + "t": [ + 1, + 0.264, + 0.5638, + 1.306, + 0.2062, + 2.207, + 2.283, + 1.373, + 2.33, + 0.6376 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.3, + 2.479, + 1.068, + 79.85, + 49.06 + ], + "d": [ + 1, + 1, + 3, + 3, + 2 + ], + "epsilon": [ + 0.7119, + 0.9102, + 0.678, + 0.7091, + 1.727 + ], + "eta": [ + 1.019, + 1.341, + 1.034, + 5.264, + 24.44 + ], + "gamma": [ + 1.13, + 0.6691, + 0.465, + 1.28, + 0.8781 + ], + "n": [ + 1.3165, + -0.42023, + -0.28053, + -1.4134, + -6.2617e-06 + ], + "t": [ + 1.08, + 1.67, + 3.502, + 4.357, + 0.6945 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1520384, + "molar_mass_units": "kg/mol", + "p_max": 6000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 17498.1884, + "ptriple_units": "Pa", + "reducing_state": { + "T": 412.44, + "T_units": "K", + "p": 3420000, + "p_units": "Pa", + "rhomolar": 3716, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 6.577285738339787e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 6.577285738339787e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R236EA" +} \ No newline at end of file diff --git a/dev/fluids/R236FA.json b/dev/fluids/R236FA.json new file mode 100644 index 00000000..41f01557 --- /dev/null +++ b/dev/fluids/R236FA.json @@ -0,0 +1,297 @@ +{ + "ALIASES": [ + "R236fa" + ], + "ANCILLARIES": { + "pL": { + "T_r": 398.07, + "Tmax": 398.0699999999993, + "Tmin": 179.6, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.029205453110847657, + "n": [ + -0.0049249850273236865, + 0.012816148225752128, + -6.97674339296593, + 0.34709652116366274, + -3.3890300356223824, + -3.905418212194194 + ], + "reducing_value": 3200000.0, + "t": [ + 0.017, + 0.253, + 0.971, + 2.069, + 3.12, + 5.366 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 398.07, + "Tmax": 398.0699999999993, + "Tmin": 179.6, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.28623680659642936, + "n": [ + -0.07455034494245859, + -8.044729321497613, + 6.37817405215639, + -9.393255336834992, + -2.374713790526613, + -957.7075963285336 + ], + "reducing_value": 3200000.0, + "t": [ + 0.39, + 1.035, + 2.14, + 2.75, + 6.783, + 19.623 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 398.07, + "Tmax": 398.0699999999993, + "Tmin": 179.6, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.12903740875118697, + "n": [ + -0.6129462210275856, + 2.32975618477472, + 0.44026610528146576, + 0.18569408128843393, + 0.41600763700797233, + 0.3257761223988926 + ], + "reducing_value": 3626.0, + "t": [ + 0.177, + 0.276, + 0.561, + 0.741, + 1.15, + 3.764 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 398.07, + "Tmax": 398.0699999999993, + "Tmin": 179.6, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5486542157663976, + "n": [ + -3.799841638369613, + -7.207160418715132, + 47.73949958715277, + -59.040754885379386, + 33.03413077298916, + -27.228555278145553 + ], + "reducing_value": 3626.0, + "t": [ + 0.436, + 1.661, + 2.91, + 3.307, + 5.447, + 6.392 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 398.07, + "a": [ + 0.05389 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.249 + ] + } + }, + "CAS": "690-39-1", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 9810.0, + "GWP20": 8100.0, + "GWP500": 7660.0, + "HH": 1, + "Name": "R236FA", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Pan-FPE-2012", + "T_max": 400, + "T_max_units": "K", + "Ttriple": 179.6, + "Ttriple_units": "K", + "accentric": 0.3769117976336991, + "accentric_units": "-", + "alpha0": [ + { + "a1": -17.5983849, + "a2": 8.87150449, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 9.175, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 9.8782, + 18.236, + 49.934 + ], + "t": [ + 2.416660386364208, + 6.014017635089306, + 13.03288366367724 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.04453255, + 1.777017, + -2.230519, + -0.6708606, + 0.1587907, + -1.425119, + -0.6461628, + 0.8469985, + -0.5635356, + -0.01535611 + ], + "t": [ + 1.07, + 0.222, + 0.66, + 1.33, + 0.227, + 2.33, + 1.94, + 1.53, + 2.65, + 0.722 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.42, + 2.31, + 0.89, + 80, + 108 + ], + "d": [ + 1, + 1, + 3, + 3, + 2 + ], + "epsilon": [ + 0.712, + 0.91, + 0.677, + 0.718, + 1.64 + ], + "eta": [ + 1.02, + 1.336, + 1.055, + 5.84, + 16.2 + ], + "gamma": [ + 1.13, + 0.67, + 0.46, + 1.28, + 1.2 + ], + "n": [ + 1.156362, + -0.407031, + -0.2172753, + -1.007176, + -6.902909e-05 + ], + "t": [ + 1.11, + 2.31, + 3.68, + 4.23, + 0.614 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1520384, + "molar_mass_units": "kg/mol", + "p_max": 70000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 160.3267788, + "ptriple_units": "Pa", + "reducing_state": { + "T": 398.07, + "T_units": "K", + "p": 3200000, + "p_units": "Pa", + "rhomolar": 3626, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 11234.48790273794, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.1074107170975478, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R236FA" +} \ No newline at end of file diff --git a/dev/fluids/R245fa.json b/dev/fluids/R245fa.json new file mode 100644 index 00000000..650372d1 --- /dev/null +++ b/dev/fluids/R245fa.json @@ -0,0 +1,257 @@ +{ + "ALIASES": [ + "R245FA" + ], + "ANCILLARIES": { + "pL": { + "T_r": 427.16, + "Tmax": 427.15999999999934, + "Tmin": 171.05, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.04099399491688249, + "n": [ + 0.0004869832757370176, + -6.919145483936883, + -1.296447452384627, + -109.63729861885537, + 107.66538794686012, + -3.4622351305818055 + ], + "reducing_value": 3651000.0, + "t": [ + 0.01, + 0.975, + 2.763, + 4.376, + 4.413, + 6.994 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 427.16, + "Tmax": 427.15999999999934, + "Tmin": 171.05, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.018077333401533835, + "n": [ + -125.12984314778919, + 152.9911248662765, + -35.27317598226143, + -4.102406386050718, + 0.25362281678701887, + -1.994325281027591 + ], + "reducing_value": 3651000.0, + "t": [ + 1.141, + 1.179, + 1.287, + 3.64, + 5.737, + 7.077 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 427.16, + "Tmax": 427.15999999999934, + "Tmin": 171.05, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6726827141749103, + "n": [ + 5.25176887594682, + -4.096294176783149, + 10.999081251417799, + -11.640705049730522, + 4.081973016432867, + -133.73894447755137 + ], + "reducing_value": 3849.9999999999995, + "t": [ + 0.42, + 0.565, + 1.624, + 1.967, + 4.012, + 15.818 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 427.16, + "Tmax": 427.15999999999934, + "Tmin": 171.05, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.6375071010457756, + "n": [ + -2.215307322989694, + -1.1625687686537725, + -7.315572965034845, + 5.341825675363525, + -7.602957384362923, + 17.028040285012285 + ], + "reducing_value": 3849.9999999999995, + "t": [ + 0.383, + 0.46, + 1.442, + 1.848, + 3.855, + 12.963 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 427.16, + "a": [ + 0.073586, + 0.0103, + -0.02663 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.0983, + 0.60033, + 0.72765 + ] + } + }, + "CAS": "460-73-1", + "ENVIRONMENTAL": { + "ASHRAE34": "B1", + "FH": 0, + "GWP100": 1030.0, + "GWP20": 3380.0, + "GWP500": 314.0, + "HH": 2, + "Name": "R245fa", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 440, + "T_max_units": "K", + "Ttriple": 171.05, + "Ttriple_units": "K", + "accentric": 0.3776, + "accentric_units": "-", + "alpha0": [ + { + "a1": -13.4283638514, + "a2": 9.87236538, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 5.5728, + 10.385, + 12.554 + ], + "t": [ + 0.5197115834815994, + 2.364453600524394, + 5.735555763648281 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 1.2904, + -3.2154, + 0.50693, + 0.093148, + 0.00027638, + 0.71458, + 0.87252, + -0.015077, + -0.40645, + -0.11701, + -0.13062, + -0.022952 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.13404794, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 12.51480599, + "ptriple_units": "Pa", + "reducing_state": { + "T": 427.16, + "T_units": "K", + "p": 3651000, + "p_units": "Pa", + "rhomolar": 3850, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12292.47138861426, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.008801981575100712, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R245fa" +} \ No newline at end of file diff --git a/dev/fluids/R32.json b/dev/fluids/R32.json new file mode 100644 index 00000000..8b0c4cac --- /dev/null +++ b/dev/fluids/R32.json @@ -0,0 +1,281 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 351.255, + "Tmax": 351.2549999999992, + "Tmin": 136.34, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01115469543861991, + "n": [ + 0.019194334673139708, + -6.794802163795212, + 9.276391392786632, + -12.327153852761946, + 28.46579606476374, + -28.570870718190093 + ], + "reducing_value": 5782000.0, + "t": [ + 0.531, + 0.979, + 2.203, + 2.382, + 3.421, + 3.558 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 351.255, + "Tmax": 351.2549999999992, + "Tmin": 136.34, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01455225507540625, + "n": [ + 0.7749641243552982, + -7.69732080181333, + 0.6436919306295109, + -2.862828303715926, + 8.09924761745426, + -8.871716790404001 + ], + "reducing_value": 5782000.0, + "t": [ + 0.825, + 0.962, + 1.345, + 2.81, + 3.343, + 3.702 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 351.255, + "Tmax": 351.2549999999992, + "Tmin": 136.34, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.26499733941445225, + "n": [ + 3.0283368557227064, + -13.30754793568124, + 53.97035773548243, + -41.10515088784585, + 0.6410010855629815, + -18.757652443918627 + ], + "reducing_value": 8150.084599999999, + "t": [ + 0.358, + 0.676, + 0.831, + 0.88, + 2.592, + 16.556 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 351.255, + "Tmax": 351.2549999999992, + "Tmin": 136.34, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8887882076253018, + "n": [ + -0.06522522852577171, + -3.3577643698607456, + -2.746299718061842, + -64.77289013657663, + 511.3349286855849, + -1525.315265366156 + ], + "reducing_value": 8150.084599999999, + "t": [ + 0.069, + 0.425, + 1.18, + 8.115, + 12.06, + 16.085 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 351.255, + "a": [ + 0.07147 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.246 + ] + } + }, + "CAS": "75-10-5", + "ENVIRONMENTAL": { + "ASHRAE34": "A2", + "FH": 4, + "GWP100": 675.0, + "GWP20": 2330.0, + "GWP500": 205.0, + "HH": 1, + "Name": "R32", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "TillnerRoth-JPCRD-1997", + "T_max": 435, + "T_max_units": "K", + "Ttriple": 136.34, + "Ttriple_units": "K", + "accentric": 0.2769, + "accentric_units": "-", + "alpha0": [ + { + "a1": -8.258096, + "a2": 6.353098, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.004486, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.160761, + 2.645151, + 5.794987, + 1.129475 + ], + "t": [ + 2.2718538, + 11.914421, + 5.1415638, + 32.768217 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 2, + 5, + 1, + 1, + 3, + 8, + 4, + 4, + 4, + 8, + 3, + 5, + 1, + 1, + 3, + 1, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 3, + 1, + 4, + 1, + 2, + 2, + 1, + 1, + 1, + 1 + ], + "n": [ + 1.046634, + -0.5451165, + -0.002448595, + -0.04877002, + 0.03520158, + 0.00162275, + 2.377225e-05, + 0.029149, + 0.003386203, + -0.004202444, + 0.0004782025, + -0.005504323, + -0.02418396, + 0.4209034, + -0.4616537, + -1.200513, + -2.59155, + -1.400145, + 0.8263017 + ], + "t": [ + 0.25, + 1, + -0.25, + -1, + 2, + 2, + 0.75, + 0.25, + 18, + 26, + -1, + 25, + 1.75, + 4, + 5, + 1, + 1.5, + 1, + 0.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314471, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.052024, + "molar_mass_units": "kg/mol", + "p_max": 70000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 47.99989366, + "ptriple_units": "Pa", + "reducing_state": { + "T": 351.255, + "T_units": "K", + "p": 5782000, + "p_units": "Pa", + "rhomolar": 8150.084599999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 27473.2983250474, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.04235884267931883, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R32" +} \ No newline at end of file diff --git a/dev/fluids/R365MFC.json b/dev/fluids/R365MFC.json new file mode 100644 index 00000000..6a8e4922 --- /dev/null +++ b/dev/fluids/R365MFC.json @@ -0,0 +1,292 @@ +{ + "ALIASES": [ + "R365mfc" + ], + "ANCILLARIES": { + "pL": { + "T_r": 460.0, + "Tmax": 459.99999999999886, + "Tmin": 239.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.010216992707168249, + "n": [ + -7.611425283264201, + 3.9042179746841317, + -14.051415772751833, + 9.298084346936626, + -12.226784626997082, + 58.35959676825318 + ], + "reducing_value": 3266000.0, + "t": [ + 0.991, + 1.975, + 2.924, + 3.462, + 7.169, + 12.273 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 460.0, + "Tmax": 459.99999999999886, + "Tmin": 239.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.011549392315912677, + "n": [ + -3.5153740894977616, + -7.176938320983536, + 5.166558678229452, + -3.5278281028276717, + -1.4779765313329785, + -2.866915101721763 + ], + "reducing_value": 3266000.0, + "t": [ + 0.959, + 1.095, + 1.357, + 2.43, + 4.143, + 6.68 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 460.0, + "Tmax": 459.99999999999886, + "Tmin": 239.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1981453053741422, + "n": [ + 0.26150334292302974, + 1.2960567437114034, + 1.1054962724493822, + -1.9624874038489026, + 6.877950747305875, + -9775.478987767088 + ], + "reducing_value": 3200.0, + "t": [ + 0.197, + 0.347, + 0.68, + 4.264, + 5.751, + 18.372 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 460.0, + "Tmax": 459.99999999999886, + "Tmin": 239.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.0623577336764445, + "n": [ + -2.321900801891659, + -12.318486255432273, + 29.90077432524069, + -52.89208803147019, + 57.15577614474706, + -6130.399386014779 + ], + "reducing_value": 3200.0, + "t": [ + 0.326, + 1.306, + 2.168, + 3.262, + 5.147, + 15.037 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 460, + "a": [ + 0.0534 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.21 + ] + } + }, + "CAS": "406-58-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": -1, + "GWP100": 794.0, + "GWP20": 2520.0, + "GWP500": 241.0, + "HH": -1, + "Name": "R365MFC", + "ODP": -1.0, + "PH": -1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "McLinden-PREPRINT-2013", + "T_max": 500, + "T_max_units": "K", + "Ttriple": 239, + "Ttriple_units": "K", + "accentric": 0.3774170462154469, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 17.47, + 16.29 + ], + "t": [ + 1.236956521739131, + 4.852173913043479 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 2, + 2, + 4, + 1, + 3, + 6, + 6, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2 + ], + "n": [ + 2.20027, + -2.8624, + 0.384559, + -0.621227, + 0.0665967, + -1.19383, + 0.635935, + 0.461728, + -0.533472, + -1.07101, + 0.13929 + ], + "t": [ + 0.24, + 0.67, + 0.5, + 1.25, + 1, + 3.35, + 2.5, + 0.96, + 1.07, + 5.6, + 6.9 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.07, + 1.08, + 10.9, + 22.6 + ], + "d": [ + 1, + 1, + 1, + 2 + ], + "epsilon": [ + 1.02, + 0.62, + 0.53, + 0.48 + ], + "eta": [ + 0.97, + 0.94, + 2.15, + 2.66 + ], + "gamma": [ + 1.48, + 1.49, + 1.01, + 1.16 + ], + "n": [ + -0.385506, + 0.885653, + 0.226303, + -0.166116 + ], + "t": [ + 3, + 3.6, + 5, + 1.25 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.14807452, + "molar_mass_units": "kg/mol", + "p_max": 35000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 2478.418202, + "ptriple_units": "Pa", + "reducing_state": { + "T": 460, + "T_units": "K", + "p": 3266000, + "p_units": "Pa", + "rhomolar": 3200, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 9298.14395424287, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.251254102751831, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R365MFC" +} \ No newline at end of file diff --git a/dev/fluids/R404A.json b/dev/fluids/R404A.json new file mode 100644 index 00000000..c3ffd700 --- /dev/null +++ b/dev/fluids/R404A.json @@ -0,0 +1,291 @@ +{ + "ALIASES": [ + "R404a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 345.27, + "Tmax": 345.2699999999992, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.005498447483098801, + "n": [ + 0.5635840402585297, + -0.5827522825709982, + -6.4663745582192815, + -2.8281654415264432, + -0.7995458853560359, + -11.354572861041914 + ], + "reducing_value": 3734800.0, + "t": [ + 0.688, + 0.743, + 0.963, + 3.561, + 4.194, + 10.201 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 345.27, + "Tmax": 345.2699999999992, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.00755928413784801, + "n": [ + -5.364477716661244, + -1.4230007624991121, + 3.314690272990208, + -5.181329955404622, + -3.360484849212965, + -551.2801078830697 + ], + "reducing_value": 3734800.0, + "t": [ + 0.951, + 1.13, + 2.426, + 2.778, + 5.072, + 16.153 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 345.27, + "Tmax": 345.2699999999992, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7483321289055711, + "n": [ + -0.011777381218307114, + 2.4984547682678704, + 5367.932468376006, + -3732982.2139762687, + 33474569.015986394, + -80262239.93679684 + ], + "reducing_value": 4939.999999999999, + "t": [ + 0.066, + 0.377, + 8.99, + 13.98, + 15.982, + 17.954 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 345.27, + "Tmax": 345.2699999999992, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.2085148467457896, + "n": [ + -5.211849919504925, + 6.798109425092868, + -13.038945243933242, + 9.654798311425768, + -320.35292894913766, + 80023.04183470446 + ], + "reducing_value": 4939.999999999999, + "t": [ + 0.485, + 0.989, + 1.431, + 2.495, + 7.812, + 15.329 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "R404A.PPF", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 3900.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R404A", + "ODP": 0.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-IJT-2003", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.293, + "accentric_units": "-", + "alpha0": [ + { + "a1": 7.00407, + "a2": 7.98695, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -18.8664 + ], + "t": [ + -0.3 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 0.63078, + 3.5979, + 5.0335 + ], + "t": [ + 1.19617, + 2.32861, + 5.00188 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 4, + 6, + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 7, + 2, + 3, + 4, + 4, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3 + ], + "n": [ + 6.10984, + -7.79453, + 0.0183377, + 0.26227, + -0.00351688, + 0.0116181, + 0.00105992, + 0.850922, + -0.520084, + -0.0464225, + 0.62119, + -0.195505, + 0.336159, + -0.0376062, + -0.00636579, + -0.0758262, + -0.0221041, + 0.0310441, + 0.0132798, + 0.0689437, + -0.0507525, + 0.0161382 + ], + "t": [ + 0.67, + 0.91, + 5.96, + 0.7, + 6, + 0.3, + 0.7, + 1.7, + 3.3, + 7, + 2.05, + 4.3, + 2.7, + 1.8, + 1.25, + 12, + 6, + 8.7, + 11.6, + 13, + 17, + 16 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0976038, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 21264.27382, + "ptriple_units": "Pa", + "reducing_state": { + "T": 345.27, + "T_units": "K", + "p": 3734800, + "p_units": "Pa", + "rhomolar": 4939.999999999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14209.11070707527, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 13.01041553482517, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R404A" +} \ No newline at end of file diff --git a/dev/fluids/R407C.json b/dev/fluids/R407C.json new file mode 100644 index 00000000..02c648e5 --- /dev/null +++ b/dev/fluids/R407C.json @@ -0,0 +1,287 @@ +{ + "ALIASES": [ + "R407c" + ], + "ANCILLARIES": { + "pL": { + "T_r": 359.345, + "Tmax": 359.3449999999991, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.00931794540619535, + "n": [ + 0.16728493073329312, + -53.38279226938705, + 60.42641909765115, + -14.171031944447838, + -2.416970185723638, + -0.6842647633262893 + ], + "reducing_value": 4631700.0, + "t": [ + 0.446, + 1.145, + 1.222, + 1.436, + 4.271, + 4.452 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 359.345, + "Tmax": 359.3449999999991, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01660405084527028, + "n": [ + -0.02526319311536476, + -1.4911994937454576, + -5.422666319606085, + 0.46047437701559923, + -4.5527752103859545, + -22.506926177764264 + ], + "reducing_value": 4631700.0, + "t": [ + 0.289, + 0.798, + 1.03, + 2.282, + 3.477, + 10.467 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 359.345, + "Tmax": 359.3449999999991, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5102425510041697, + "n": [ + 5.484626525085367, + -132.94290476910828, + 390.0966131363964, + -414.8227131759332, + 424.49338909908334, + -294.0732646506709 + ], + "reducing_value": 5260.000046401775, + "t": [ + 0.478, + 1.487, + 1.826, + 2.271, + 3.413, + 4.019 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 359.345, + "Tmax": 359.3449999999991, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07158186035334246, + "n": [ + -0.7403294274768993, + -3.4984730053164657, + -3.707063870074722, + 9.58842271173753, + -15.235025525549892, + 7.7277234094710305 + ], + "reducing_value": 5260.000046401775, + "t": [ + 0.36, + 0.53, + 1.61, + 2.842, + 3.565, + 7.376 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "R407C.PPF", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 1800.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R407C", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-IJT-2003", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.363, + "accentric_units": "-", + "alpha0": [ + { + "a1": 2.13194, + "a2": 8.05008, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -14.3914 + ], + "t": [ + -0.4 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 1.4245, + 3.9419, + 3.1209 + ], + "t": [ + 2.40437, + 5.25122, + 13.3632 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 2, + 2, + 3, + 3, + 5, + 5, + 5, + 1, + 1, + 4, + 4, + 2, + 4, + 5, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3 + ], + "n": [ + 1.0588, + -1.12018, + 0.629064, + -0.351953, + 0.00455978, + -1.75725, + -1.12009, + 0.0277353, + 0.898881, + -1.17591, + 0.0818591, + -0.0794097, + -1.04047e-05, + 0.233779, + -0.29179, + 0.0154776, + -0.0314579, + -0.00442552, + -0.0101254, + 0.00915953, + -0.003615 + ], + "t": [ + 0.241, + 0.69, + 2.58, + 1.15, + 0.248, + 2.15, + 2.43, + 5.3, + 0.76, + 1.48, + 0.24, + 2.86, + 8, + 3.3, + 4.7, + 0.45, + 8.4, + 16.2, + 26, + 16, + 8.7 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.08620359999999999, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 11311.51123, + "ptriple_units": "Pa", + "reducing_state": { + "T": 359.345, + "T_units": "K", + "p": 4631700, + "p_units": "Pa", + "rhomolar": 5260.000046401775, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 17036.32270806373, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 6.864730526475812, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R407C" +} \ No newline at end of file diff --git a/dev/fluids/R407F.json b/dev/fluids/R407F.json new file mode 100644 index 00000000..8ccb795d --- /dev/null +++ b/dev/fluids/R407F.json @@ -0,0 +1,245 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 355.804, + "Tmax": 353.804, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.007616420888378883, + "n": [ + 0.1159845587659482, + -45.14203725344806, + 38.76580743774572, + -3.6246669768527813, + 1.2125998610343205, + -241.6797313155363 + ], + "reducing_value": 4754610.0, + "t": [ + 0.439, + 1.07, + 1.092, + 3.569, + 5.912, + 14.442 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 355.804, + "Tmax": 353.804, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006709338517751906, + "n": [ + -0.38361210624877035, + -6.8166799637146385, + 6.670093638416114, + -7.979857034701732, + -4.130000783307335, + 208.07536824399065 + ], + "reducing_value": 4754610.0, + "t": [ + 0.544, + 1.021, + 2.453, + 2.649, + 4.511, + 19.063 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 355.804, + "Tmax": 353.804, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 13.62301368346779, + "n": [ + 249.94339776889024, + -496.98148269019805, + 23067.350828436676, + -49252.977921350845, + 37505.03529944621, + -48333.84743728163 + ], + "reducing_value": 5816.413452386901, + "t": [ + 1.486, + 1.821, + 4.222, + 4.715, + 5.653, + 9.733 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 355.804, + "Tmax": 353.804, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07565166107470489, + "n": [ + 214.85210396827435, + -313.11182553492205, + 201.19155503500085, + -109.12625937992796, + -33.24262430077338, + 53.63446483594108 + ], + "reducing_value": 5816.413452386901, + "t": [ + 0.443, + 0.467, + 0.592, + 0.665, + 5.731, + 7.406 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "R407F.ppf", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.360036864771, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 355.804, + "c": [ + 1.44 + ], + "t": [ + 0.256551293851 + ], + "type": "IdealGasHelmholtzCP0PolyT" + }, + { + "n": [ + 2.000227, + 5.359371, + 3.496132 + ], + "t": [ + 1.958784611752538, + 4.842811210666547, + 10.89081376263336 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + }, + { + "a1": -15.43197779494592, + "a2": 11.90245830296599, + "type": "IdealGasEnthalpyEntropyOffset" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.919875, + -1.82678, + -0.352996, + 0.0588362, + 0.000129927, + 0.259443, + 0.708701, + 0.0179878, + -0.305208, + -0.0510867, + -0.0910294, + -0.0300902 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0820583, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 13568.23857, + "ptriple_units": "Pa", + "reducing_state": { + "T": 355.804, + "T_units": "K", + "p": 4754610, + "p_units": "Pa", + "rhomolar": 5816.413452386901, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 17707.25386371137, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 8.242572413460806, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R407F" +} \ No newline at end of file diff --git a/dev/fluids/R41.json b/dev/fluids/R41.json new file mode 100644 index 00000000..6bc3da48 --- /dev/null +++ b/dev/fluids/R41.json @@ -0,0 +1,258 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 317.28, + "Tmax": 317.27999999999923, + "Tmin": 129.82, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.156381139779449, + "n": [ + 0.039268780221147596, + 0.8889694467325728, + -6.90749554283487, + -2.0706202534383804, + -0.8793688751729696, + -73.19636369827167 + ], + "reducing_value": 5897000.0, + "t": [ + 0.321, + 0.945, + 0.945, + 3.51, + 6.214, + 19.933 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 317.28, + "Tmax": 317.27999999999923, + "Tmin": 129.82, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.15645750589323715, + "n": [ + 0.12971871512357153, + -5.9852575632628975, + -1.435680721064538, + -1.6875218267186987, + -4576.732357704876, + 6338.17799782736 + ], + "reducing_value": 5897000.0, + "t": [ + 0.46, + 0.927, + 2.874, + 5.487, + 19.242, + 19.913 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 317.28, + "Tmax": 317.27999999999923, + "Tmin": 129.82, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8215334421917353, + "n": [ + 2.597706385655882, + -22.310070383317598, + 139.51691751158674, + -170.32067961108578, + 59.24775396461156, + -887.3638436688191 + ], + "reducing_value": 9300.0, + "t": [ + 0.408, + 2.476, + 3.081, + 3.478, + 4.372, + 18.469 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 317.28, + "Tmax": 317.27999999999923, + "Tmin": 129.82, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.484361122081145, + "n": [ + -4.548581015916281, + 2.6834555626875343, + -3.8161276706535663, + -15.526729016233224, + 21.743182012896813, + -33.19736982637592 + ], + "reducing_value": 9300.0, + "t": [ + 0.471, + 0.914, + 1.181, + 6.61, + 8.764, + 19.551 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 317.28, + "a": [ + 0.05049 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.242 + ] + } + }, + "CAS": "593-53-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 92.0, + "GWP20": 323.0, + "GWP500": 28.0, + "HH": 2, + "Name": "R41", + "ODP": -1.0, + "PH": 2 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 425, + "T_max_units": "K", + "Ttriple": 129.82, + "Ttriple_units": "K", + "accentric": 0.2004, + "accentric_units": "-", + "alpha0": [ + { + "a1": -4.867644116, + "a2": 4.2527951258, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.0268688568 + ], + "t": [ + -1 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 5.6936, + 2.9351 + ], + "t": [ + 5.802445789208271, + 13.33837619768028 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.85316, + -2.6366, + 0.69129, + 0.054681, + 0.00012796, + -0.37093, + 0.3392, + -0.0017413, + -0.095417, + -0.078852, + -0.030729, + -0.011497 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.03403291999999999, + "molar_mass_units": "kg/mol", + "p_max": 70000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 344.1990645, + "ptriple_units": "Pa", + "reducing_state": { + "T": 317.28, + "T_units": "K", + "p": 5897000, + "p_units": "Pa", + "rhomolar": 9300, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 29560.79016087918, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.3193201649680486, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R41" +} \ No newline at end of file diff --git a/dev/fluids/R410A.json b/dev/fluids/R410A.json new file mode 100644 index 00000000..b57c38f7 --- /dev/null +++ b/dev/fluids/R410A.json @@ -0,0 +1,287 @@ +{ + "ALIASES": [ + "R410a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 344.494, + "Tmax": 344.49399999999923, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.000951571663121431, + "n": [ + -7.393982466686463, + 1.4712516902869381, + -0.10468488716031096, + -2.612149622992068, + 0.24139536090585145, + -2.688737604664642 + ], + "reducing_value": 4901200.0, + "t": [ + 1.002, + 1.579, + 2.313, + 2.841, + 3.77, + 5.337 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 344.494, + "Tmax": 344.49399999999923, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.006467503031237776, + "n": [ + -8.81630527169583, + 3.0101820364714076, + -1.0140011045291613, + -3.736880461403412, + 1.478360466811462, + -34.64742822281509 + ], + "reducing_value": 4901200.0, + "t": [ + 1.018, + 1.285, + 1.862, + 3.869, + 5.725, + 10.878 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 344.494, + "Tmax": 344.49399999999923, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 7.697047402658308, + "n": [ + 17.62376356934577, + -34.49248423230781, + 229.4790425881445, + -332.5139608181856, + 23058076.978355706, + -31889422.797179773 + ], + "reducing_value": 6323.999999999999, + "t": [ + 0.732, + 1.165, + 2.775, + 3.462, + 15.531, + 15.944 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 344.494, + "Tmax": 344.49399999999923, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9578523644759418, + "n": [ + -25.00709732482156, + 34.83593078562833, + -33.0203056956001, + 61.19129776625034, + -63.32155175461899, + 149.8912653231937 + ], + "reducing_value": 6323.999999999999, + "t": [ + 0.676, + 0.844, + 1.394, + 2.411, + 3.149, + 7.808 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "R410A.PPF", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 2088.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R410A", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-IJT-2003", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.296, + "accentric_units": "-", + "alpha0": [ + { + "a1": 36.8871, + "a2": 7.15807, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -46.87575 + ], + "t": [ + -0.1 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 2.0623, + 5.9751, + 1.5612 + ], + "t": [ + 2.02326, + 5.00154, + 11.2484 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 5, + 1, + 2, + 3, + 5, + 5, + 5, + 1, + 1, + 4, + 4, + 9, + 2, + 2, + 4, + 5, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 3 + ], + "n": [ + 0.987252, + -1.03017, + 1.17666, + -0.138991, + 0.00302373, + -2.53639, + -1.9668, + -0.83048, + 0.172477, + -0.261116, + -0.0745473, + 0.679757, + -0.652431, + 0.0553849, + -0.071097, + -0.000875332, + 0.020076, + -0.0139761, + -0.018511, + 0.0171939, + -0.00482049 + ], + "t": [ + 0.44, + 1.2, + 2.97, + 2.95, + 0.2, + 1.93, + 1.78, + 3, + 0.2, + 0.74, + 3, + 2.1, + 4.3, + 0.25, + 7, + 4.7, + 13, + 16, + 25, + 17, + 7.4 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07258540000000001, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 29009.78159, + "ptriple_units": "Pa", + "reducing_state": { + "T": 344.494, + "T_units": "K", + "p": 4901200, + "p_units": "Pa", + "rhomolar": 6323.999999999999, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 19509.68726442668, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 17.79784917798893, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R410A" +} \ No newline at end of file diff --git a/dev/fluids/R507A.json b/dev/fluids/R507A.json new file mode 100644 index 00000000..9c6c302f --- /dev/null +++ b/dev/fluids/R507A.json @@ -0,0 +1,291 @@ +{ + "ALIASES": [ + "R507a" + ], + "ANCILLARIES": { + "pL": { + "T_r": 343.765, + "Tmax": 343.66499999999996, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0029257924663905754, + "n": [ + -7.291485093580165, + 3.989053632187489, + -4.617714085589758, + 0.4125533312094876, + 8.897382199467017, + -10.46532521391475 + ], + "reducing_value": 3704900.0, + "t": [ + 0.997, + 1.739, + 2.101, + 3.071, + 6.549, + 5.486 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 343.765, + "Tmax": 343.66499999999996, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0033108458033170862, + "n": [ + -3.506064016514385, + -115.18699076403108, + 141.5972032989957, + -30.266964825300732, + 0.667184221216585, + -4.547368841632091 + ], + "reducing_value": 3704900.0, + "t": [ + 0.934, + 1.317, + 1.36, + 1.517, + 2.953, + 4.281 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 343.765, + "Tmax": 343.66499999999996, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019343662717119514, + "n": [ + -1.1909272837212852, + 2.4301888224201074, + 3.512171521080571, + -3.7013727137258634, + 2.358426436855713, + -3.9469718132522256 + ], + "reducing_value": 4964.029650250053, + "t": [ + 0.093, + 0.162, + 0.914, + 1.425, + 2.269, + 7.339 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 343.765, + "Tmax": 343.66499999999996, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.12368519354006846, + "n": [ + 3.975317800427674, + -74.1368924572824, + 75.98726158051952, + -11.56733447604713, + 3.084500064878586, + -6.722628041295302 + ], + "reducing_value": 4964.029650250053, + "t": [ + 0.11, + 0.26, + 0.286, + 0.563, + 2.03, + 2.811 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "R507A.PPF", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 1, + "GWP100": 3985.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "R507A", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-IJT-2003", + "T_max": 450, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.286, + "accentric_units": "-", + "alpha0": [ + { + "a1": 9.93541, + "a2": 7.9985, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -21.6054 + ], + "t": [ + -0.25 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 0.95006, + 4.1887, + 5.5184 + ], + "t": [ + 1.05886, + 2.37081, + 5.14305 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 4, + 6, + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 7, + 2, + 3, + 4, + 4, + 2, + 3, + 5 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3 + ], + "n": [ + 6.24982, + -8.07855, + 0.0264843, + 0.286215, + -0.00507076, + 0.0109552, + 0.00116124, + 1.38469, + -0.922473, + -0.0503562, + 0.822098, + -0.277727, + 0.358172, + -0.0126426, + -0.0060701, + -0.0815653, + -0.0233323, + 0.0352952, + 0.0159566, + 0.0755927, + -0.0542007, + 0.0170451 + ], + "t": [ + 0.692, + 0.943, + 5.8, + 0.77, + 5.84, + 0.24, + 0.69, + 2, + 3, + 7, + 2.2, + 4.3, + 2.7, + 1.2, + 1.23, + 12, + 6, + 8.5, + 11.5, + 13, + 17, + 16.2 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.09885920000000001, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 23221.94234, + "ptriple_units": "Pa", + "reducing_state": { + "T": 343.765, + "T_units": "K", + "p": 3704900, + "p_units": "Pa", + "rhomolar": 4964.029650250053, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14129.85672581585, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 14.22637763151535, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "R507A" +} \ No newline at end of file diff --git a/dev/fluids/RC318.json b/dev/fluids/RC318.json new file mode 100644 index 00000000..b6c18f54 --- /dev/null +++ b/dev/fluids/RC318.json @@ -0,0 +1,314 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 388.38, + "Tmax": 388.37999999999914, + "Tmin": 233.35, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019138662643680693, + "n": [ + -15.102617412971505, + 8.53184439256971, + -1.3014556054852215, + -3.286800573693744, + -8.150652838303959, + 0.020748299859318566 + ], + "reducing_value": 2777500.0, + "t": [ + 1.017, + 1.071, + 2.454, + 3.687, + 9.48, + 0.506 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 388.38, + "Tmax": 388.37999999999914, + "Tmin": 233.35, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019138741986390873, + "n": [ + 0.6272221156142272, + -5.660532994783813, + -1.6700293408866094, + -3.773490208362589, + -12.207260334963234, + 16.852569052164345 + ], + "reducing_value": 2777500.0, + "t": [ + 0.757, + 0.927, + 1.008, + 3.144, + 7.985, + 9.574 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 388.38, + "Tmax": 388.37999999999914, + "Tmin": 233.35, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5464670263682914, + "n": [ + 6.172092166054074, + -13.109692547967464, + 382.2970506693918, + -475.82711917828664, + 190.84639492080177, + -142.60801162239488 + ], + "reducing_value": 3099.38, + "t": [ + 0.52, + 0.979, + 2.105, + 2.269, + 3.362, + 4.954 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 388.38, + "Tmax": 388.37999999999914, + "Tmin": 233.35, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2883096383379913, + "n": [ + 0.06881363274511793, + -4.9709012896577605, + 3.1335807931630963, + -4.8498027190461865, + -3405.1114368231356, + 4685.608624866425 + ], + "reducing_value": 3099.38, + "t": [ + 0.117, + 0.455, + 0.746, + 1.132, + 8.848, + 9.296 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 388.38, + "a": [ + 0.0507 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.25 + ] + } + }, + "CAS": "115-25-3", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": 10300.0, + "GWP20": 7310.0, + "GWP500": 14700.0, + "HH": 1, + "Name": "RC318", + "ODP": -1.0, + "PH": 2 + }, + "EOS": [ + { + "BibTeX_CP0": "Platzer-BOOK-1990", + "BibTeX_EOS": "Platzer-BOOK-1990", + "T_max": 623, + "T_max_units": "K", + "Ttriple": 233.35, + "Ttriple_units": "K", + "accentric": 0.355345, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 388.38, + "c": [ + 2.911028455074322, + 0.06984062483537816, + -6.093191543939451e-05, + 1.857067747732578e-08 + ], + "t": [ + 0, + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 0, + 0, + 0 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "n": [ + 1.09415573664603, + -2.68265247887176, + 1.73403070801418, + -1.63611253452478, + 0.304834511239559, + 0.102771559991302, + -0.023236791408773, + 0.166151971110653, + -0.0250103944487447, + 0.0935681090149423, + 0.043192919662493, + -0.133439867188959, + 0.025541668325497, + -1.04729119771286, + 1.38034128674154, + -0.333625770182218 + ], + "t": [ + 0, + 1, + 2, + 3, + 4, + 0, + 1, + 2, + 0, + 1, + 0, + 1, + 1, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "d": [ + 2, + 2, + 2, + 0, + 0, + 0 + ], + "g": [ + 0.99944, + 0.99944, + 0.99944, + 0.99944, + 0.99944, + 0.99944 + ], + "l": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "n": [ + -0.510485822124397, + 1.81840742529488, + -1.38530904967474, + 1.04729119771286, + -1.38034128674154, + 0.333625770182218 + ], + "t": [ + 3, + 4, + 5, + 3, + 4, + 5 + ], + "type": "ResidualHelmholtzExponential" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.2000312, + "molar_mass_units": "kg/mol", + "p_max": 60000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 19461.05608, + "ptriple_units": "Pa", + "reducing_state": { + "T": 388.38, + "T_units": "K", + "p": 2777500, + "p_units": "Pa", + "rhomolar": 3099.38, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8645.167219803367, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 10.1574489163613, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "RC318" +} \ No newline at end of file diff --git a/dev/fluids/SES36.json b/dev/fluids/SES36.json new file mode 100644 index 00000000..315ed399 --- /dev/null +++ b/dev/fluids/SES36.json @@ -0,0 +1,262 @@ +{ + "ALIASES": [], + "ANCILLARIES": { + "pL": { + "T_r": 450.7, + "Tmax": 449.7, + "Tmin": 200.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019782329236750495, + "n": [ + -20.411570888161084, + 13.911281348192677, + 3.400129319687265, + -19.83249137881619, + 23.65583392345494, + -10.204040663233801 + ], + "reducing_value": 2849000.0, + "t": [ + 1.04, + 1.088, + 5.154, + 3.311, + 3.736, + 17.742 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 450.7, + "Tmax": 449.7, + "Tmin": 200.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.017640975882415866, + "n": [ + -6.90981348357958, + 89.16905194351246, + -105.02405729377713, + 22.318938930206983, + 1.47576936609016, + 0.0011044975714101391 + ], + "reducing_value": 2849000.0, + "t": [ + 0.974, + 2.779, + 2.844, + 3.772, + 7.421, + 0.05 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 450.7, + "Tmax": 449.7, + "Tmin": 200.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 32.94120614200753, + "n": [ + 514.1312054060722, + -1848.2456018708629, + 8650.456163417914, + -72548.98608130115, + 94049.29472462909, + -496673.06801196904 + ], + "reducing_value": 2800.0, + "t": [ + 2.448, + 3.217, + 5.164, + 7.701, + 8.763, + 17.504 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 450.7, + "Tmax": 449.7, + "Tmin": 200.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9208615186060198, + "n": [ + -1.0565695975523393, + -4.865397232556856, + -2857.7245742569876, + 37955.160377325, + -247064.37597197696, + 251925.03410020104 + ], + "reducing_value": 2800.0, + "t": [ + 0.255, + 0.735, + 9.593, + 11.754, + 13.881, + 14.759 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "SES36.ppf", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Thol-2012", + "T_max": 725, + "T_max_units": "K", + "Ttriple": 200, + "Ttriple_units": "K", + "accentric": 0.352, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 12.09, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 85.26 + ], + "t": [ + 4.874639449744842 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0675748, + 1.76939, + -2.7609, + -0.566938, + 0.243576, + -1.50937, + -0.774081, + 0.953907, + -1.43736, + -0.0458514 + ], + "t": [ + 1, + 0.3, + 0.947, + 1.08, + 0.44, + 1.7, + 1.5, + 1.35, + 2.1, + 0.97 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.7, + 1.55, + 1.07, + 87 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.713, + 0.917, + 0.69, + 0.748 + ], + "eta": [ + 1.023, + 1.383, + 1, + 7 + ], + "gamma": [ + 1.1, + 0.64, + 0.5, + 1.26 + ], + "n": [ + 2.46053, + -0.903158, + -0.288664, + 0.061038 + ], + "t": [ + 0.8, + 2, + 2.5, + 4 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.18485, + "molar_mass_units": "kg/mol", + "p_max": 500000000, + "p_max_units": "Pa", + "pseudo_pure": true, + "ptriple": 573.2898712, + "ptriple_units": "Pa", + "reducing_state": { + "T": 450.7, + "T_units": "K", + "p": 2849000, + "p_units": "Pa", + "rhomolar": 2800, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 5.409791723018664e+99, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 5.409791723018664e+99, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "SES36" +} \ No newline at end of file diff --git a/dev/fluids/SulfurDioxide.json b/dev/fluids/SulfurDioxide.json new file mode 100644 index 00000000..53987a2c --- /dev/null +++ b/dev/fluids/SulfurDioxide.json @@ -0,0 +1,265 @@ +{ + "ALIASES": [ + "SO2", + "SULFURDIOXIDE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 430.64, + "Tmax": 430.6399999999989, + "Tmin": 197.7, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.11026707702719296, + "n": [ + -0.01541318834753553, + 5.736549166205164, + -11.904114521692316, + -1.6686228028226027, + -13.207056333610284, + 10.603528318065084 + ], + "reducing_value": 7884000.0, + "t": [ + 0.277, + 0.828, + 0.893, + 2.77, + 5.132, + 5.245 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 430.64, + "Tmax": 430.6399999999989, + "Tmin": 197.7, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.038603551098104205, + "n": [ + -0.004409358780634517, + 0.023504159919188104, + -6.289629332573044, + -0.7188570157243328, + -3.1262175770534815, + -0.40365131803574894 + ], + "reducing_value": 7884000.0, + "t": [ + 0.054, + 0.303, + 0.962, + 2.441, + 4.086, + 7.163 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 430.64, + "Tmax": 430.6399999999989, + "Tmin": 197.7, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5204616741181667, + "n": [ + 3.223449710407596, + -77.05672749784918, + 85.25360653529852, + -9.647788575068123, + 455.1933494065884, + -10290.419671830146 + ], + "reducing_value": 8195.0, + "t": [ + 0.429, + 1.303, + 1.358, + 1.968, + 12.316, + 18.012 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 430.64, + "Tmax": 430.6399999999989, + "Tmin": 197.7, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2939170856461115, + "n": [ + 1.0280623430324556, + -4.535655163708297, + -2.6324475896031925, + -7.070153809118907, + -2.7025088444376912, + 172.3490226686549 + ], + "reducing_value": 8195.0, + "t": [ + 0.374, + 0.417, + 1.321, + 5.232, + 9.533, + 14.482 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 430.64, + "a": [ + 0.0803, + 0.0139, + -0.0114 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 0.928, + 1.57, + 0.364 + ] + } + }, + "CAS": "7446-09-5", + "ENVIRONMENTAL": { + "ASHRAE34": "B1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 3, + "Name": "SulfurDioxide", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 197.7, + "Ttriple_units": "K", + "accentric": 0.2557, + "accentric_units": "-", + "alpha0": [ + { + "a1": -4.5328346436, + "a2": 4.4777967379, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + -0.01560057996 + ], + "t": [ + -1 + ], + "type": "IdealGasHelmholtzPower" + }, + { + "n": [ + 1.062, + 1.9401 + ], + "t": [ + 1.799647036968233, + 4.298253761842839 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + 0.93061, + -1.9528, + -0.17467, + 0.061524, + 0.00017711, + 0.21615, + 0.51353, + 0.010419, + -0.25286, + -0.05472, + -0.059856, + -0.016523 + ], + "t": [ + 0.25, + 1.25, + 1.5, + 0.25, + 0.875, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0640638, + "molar_mass_units": "kg/mol", + "p_max": 35000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1660.220193, + "ptriple_units": "Pa", + "reducing_state": { + "T": 430.64, + "T_units": "K", + "p": 7884000, + "p_units": "Pa", + "rhomolar": 8195, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 25289.99470236515, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 1.012062400446851, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "SulfurDioxide" +} \ No newline at end of file diff --git a/dev/fluids/SulfurHexafluoride.json b/dev/fluids/SulfurHexafluoride.json new file mode 100644 index 00000000..7d59c8a2 --- /dev/null +++ b/dev/fluids/SulfurHexafluoride.json @@ -0,0 +1,411 @@ +{ + "ALIASES": [ + "SULFURHEXAFLUORIDE", + "SF6" + ], + "ANCILLARIES": { + "pL": { + "T_r": 318.7232, + "Tmax": 318.7231999999994, + "Tmin": 223.555, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.00038142233819149496, + "n": [ + -0.3409184825729817, + -7.189246611969527, + -4.574500860459857, + -2.1124260160105846, + -0.884461264916517, + 5.474973854948071 + ], + "reducing_value": 3754983.0, + "t": [ + 0.888, + 1.017, + 1.742, + 3.975, + 4.849, + 1.549 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 318.7232, + "Tmax": 318.7231999999994, + "Tmin": 223.555, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.007198627134752389, + "n": [ + 0.13866254916941095, + 0.8361075774534089, + -7.3007117139128805, + 0.28277858186797933, + -4.001104677792867, + 3.3226792275810393 + ], + "reducing_value": 3754983.0, + "t": [ + 0.721, + 0.9, + 0.96, + 1.683, + 3.649, + 5.325 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 318.7232, + "Tmax": 318.7231999999994, + "Tmin": 223.555, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.22597643431585546, + "n": [ + -0.09723399675840705, + 2.15858946914358, + 1.7637219963539608, + -1153.263728198288, + 3460.272067774808, + -16941.095002681574 + ], + "reducing_value": 5082.317411198119, + "t": [ + 0.162, + 0.34, + 1.704, + 5.628, + 6.422, + 9.099 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 318.7232, + "Tmax": 318.7231999999994, + "Tmin": 223.555, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2516035423705376, + "n": [ + -8.935879409973415, + 7.030558315225393, + -4.599609615155371, + 1.6300884890508534, + -2145.5926123421355, + 7242407.029292246 + ], + "reducing_value": 5082.317411198119, + "t": [ + 0.452, + 0.51, + 1.021, + 1.739, + 8.69, + 16.008 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 318.723, + "a": [ + 0.0538, + -4.064e-05 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.271, + 0.2116 + ] + } + }, + "CAS": "2551-62-4", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": 22800.0, + "GWP20": 16300.0, + "GWP500": 32600.0, + "HH": 1, + "Name": "SulfurHexafluoride", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Guder-JPCRD-2009", + "T_max": 650, + "T_max_units": "K", + "Ttriple": 223.555, + "Ttriple_units": "K", + "accentric": 0.21, + "accentric_units": "-", + "alpha0": [ + { + "a1": 11.638611086, + "a2": -6.392241811, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.66118232, + 7.87885103, + 3.45981679 + ], + "t": [ + 1.617282065, + 2.747115139, + 4.232907175 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 6, + 1, + 2, + 2, + 2, + 3, + 6, + 2, + 2, + 4, + 4, + 2, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.54958259132835, + -0.87905033269396, + -0.84656969731452, + 0.27692381593529, + -4.9864958372345, + 4.8879127058055, + 0.036917081634281, + 0.00037030130305087, + 0.039389132911585, + 0.00042477413690006, + -0.02415001386389, + 0.059447650642255, + -0.38302880142267, + 0.32606800951983, + -0.029955940562031, + -0.086579186671173, + 4.1600684707562, + -4.1398128855814, + -0.55842159922714, + 0.56531382776891, + 0.0082612463415545, + -0.01020099533808 + ], + "t": [ + 0.125, + 1.25, + 1.875, + 0.125, + 1.5, + 1.625, + 1.5, + 5.625, + 0.625, + 0.25, + 6, + 0.25, + 4.75, + 5.375, + 5.875, + 2, + 5.875, + 6, + 5.625, + 5.75, + 0, + 0.5 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 150, + 150, + 150, + 150, + 225, + 300, + 350, + 350, + 350, + 350, + 400, + 400, + 400, + 400 + ], + "d": [ + 1, + 3, + 4, + 1, + 1, + 4, + 3, + 4, + 4, + 4, + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.85, + 0.85, + 0.85, + 0.85, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "eta": [ + 10, + 10, + 10, + 10, + 11, + 25, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30 + ], + "gamma": [ + 1.13, + 1.13, + 1.13, + 1.16, + 1.19, + 1.19, + 1.16, + 1.16, + 1.16, + 1.16, + 1.22, + 1.22, + 1.22, + 1.22 + ], + "n": [ + -0.021662523861406, + 0.034650943893908, + -0.028694281385812, + 0.0084007238998053, + -0.26969359922498, + 9.0415215646344, + -3.7233103557977, + -2752.4670823704, + 5771.1861697319, + -3023.4003119748, + 2225277.843536, + -2305606.5559032, + 6391885.2944475, + -6079209.1415592 + ], + "t": [ + 4, + 1, + 3, + 2, + 4, + 3, + 4, + 1, + 2, + 3, + 3, + 4, + 3, + 4 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1460554192, + "molar_mass_units": "kg/mol", + "p_max": 150000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 231424.4739, + "ptriple_units": "Pa", + "reducing_state": { + "T": 318.7232, + "T_units": "K", + "p": 3754983, + "p_units": "Pa", + "rhomolar": 5082.317411198119, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12632.35639762951, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 133.9289768359154, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "SulfurHexafluoride" +} \ No newline at end of file diff --git a/dev/fluids/Toluene.json b/dev/fluids/Toluene.json new file mode 100644 index 00000000..aa821a33 --- /dev/null +++ b/dev/fluids/Toluene.json @@ -0,0 +1,258 @@ +{ + "ALIASES": [ + "toluene", + "TOLUENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 591.75, + "Tmax": 591.7499999999987, + "Tmin": 178.0, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.013628695855705253, + "n": [ + -11.639922828598088, + 5.650211353764286, + -2.6974053250328165, + -3.164119945892499, + 1.8859792463505036, + -5.2234698853395525 + ], + "reducing_value": 4126000.0, + "t": [ + 1.041, + 1.184, + 3.013, + 5.82, + 8.325, + 15.907 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 591.75, + "Tmax": 591.7499999999987, + "Tmin": 178.0, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009539128608204717, + "n": [ + -41.682551388800405, + 35.681619568443324, + -2.4647898129932573, + -2.2965822444409394, + 1.6090346729113876, + -6.971566618092907 + ], + "reducing_value": 4126000.0, + "t": [ + 1.081, + 1.11, + 2.974, + 5.067, + 13.97, + 17.253 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 591.75, + "Tmax": 591.7499999999987, + "Tmin": 178.0, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.8197967086870594, + "n": [ + 2.731439741297877, + -1.4311921172736468, + 1.7220225715861872, + -1.3959592517619432, + 25.019574322670564, + -106.28098773992355 + ], + "reducing_value": 3169.0, + "t": [ + 0.413, + 1.151, + 1.592, + 6.141, + 12.914, + 18.579 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 591.75, + "Tmax": 591.7499999999987, + "Tmin": 178.0, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.610452170273057, + "n": [ + -2.079525851134041, + -3.0632853262137703, + -5.643041080974643, + 3.9792497484198788, + -2638.7103858281944, + 2945.506923819063 + ], + "reducing_value": 3169.0, + "t": [ + 0.4, + 0.697, + 3.764, + 8.691, + 19.351, + 19.782 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 591.75, + "a": [ + 0.06897 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.291 + ] + } + }, + "CAS": "108-88-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 3.3, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "Toluene", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 178, + "Ttriple_units": "K", + "accentric": 0.2657, + "accentric_units": "-", + "alpha0": [ + { + "a1": 3.5241174832, + "a2": 1.1360823464, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 1.6994, + 8.0577, + 17.059, + 8.4567, + 8.6423 + ], + "t": [ + 0.3210815378115758, + 1.346852555978031, + 2.735952682720744, + 5.191381495564005, + 13.37558090409801 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.96464, + -2.7855, + 0.86712, + -0.1886, + 0.11804, + 0.00025181, + 0.57196, + -0.029287, + -0.43351, + -0.1254, + -0.028207, + 0.014076 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.09213842, + "molar_mass_units": "kg/mol", + "p_max": 500000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.03939347882, + "ptriple_units": "Pa", + "reducing_state": { + "T": 591.75, + "T_units": "K", + "p": 4126000, + "p_units": "Pa", + "rhomolar": 3169, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 10580.04981301902, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.662208671588402e-05, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Toluene" +} \ No newline at end of file diff --git a/dev/fluids/Water.json b/dev/fluids/Water.json new file mode 100644 index 00000000..172e1ea0 --- /dev/null +++ b/dev/fluids/Water.json @@ -0,0 +1,491 @@ +{ + "ALIASES": [ + "water", + "WATER", + "H2O", + "h2o" + ], + "ANCILLARIES": { + "pL": { + "T_r": 647.096, + "Tmax": 647.0959999999985, + "Tmin": 273.16, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.015027600651340567, + "n": [ + -86.4054293321618, + 80.46357460741712, + -4.106663588117775, + 9.324398078701453, + 0.3843684347038061, + -9.322932534449132 + ], + "reducing_value": 22064000.0, + "t": [ + 1.091, + 1.107, + 2.247, + 2.917, + 9.963, + 3.376 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 647.096, + "Tmax": 647.0959999999985, + "Tmin": 273.16, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01384518934277601, + "n": [ + -9.75639641045262, + 3.3357600887120102, + -1.10029278432831, + 0.02037617155190105, + -2.6668589845604367, + 6.676721087238668 + ], + "reducing_value": 22064000.0, + "t": [ + 1.018, + 1.206, + 2.327, + 5.753, + 4.215, + 14.951 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 647.096, + "Tmax": 647.0959999999985, + "Tmin": 273.16, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.14434134863475778, + "n": [ + 0.8157021355019343, + 2.0434712177006693, + -78.58278372496308, + 1026.4273940070307, + -2290.5642779377695, + 8420.141408210317 + ], + "reducing_value": 17873.72799560906, + "t": [ + 0.276, + 0.455, + 7.127, + 9.846, + 11.707, + 17.805 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 647.096, + "Tmax": 647.0959999999985, + "Tmin": 273.16, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2457203054771817, + "n": [ + 0.9791749335365787, + -2.6190679042770215, + -3.9166443712365235, + -20.313306821636637, + 16.497589490043744, + -125.36580458432083 + ], + "reducing_value": 17873.72799560906, + "t": [ + 0.21, + 0.262, + 0.701, + 3.909, + 4.076, + 17.459 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 647.096, + "a": [ + -0.1306, + 0.2151 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 2.471, + 1.233 + ] + } + }, + "CAS": "7732-18-5", + "ENVIRONMENTAL": { + "ASHRAE34": "A1", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Water", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Wagner-JPCRD-2002", + "T_max": 1273, + "T_max_units": "K", + "Ttriple": 273.16, + "Ttriple_units": "K", + "accentric": 0.3442920843, + "accentric_units": "-", + "alpha0": [ + { + "a1": -8.3204464837497, + "a2": 6.6832105275932, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.00632, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 0.012436, + 0.97315, + 1.2795, + 0.96956, + 0.24873 + ], + "t": [ + 1.28728967, + 3.53734222, + 7.74073708, + 9.24437796, + 27.5075105 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 4, + 5, + 7, + 9, + 10, + 11, + 13, + 15, + 1, + 2, + 2, + 2, + 3, + 4, + 4, + 4, + 5, + 6, + 6, + 7, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 12, + 3, + 4, + 4, + 5, + 14, + 3, + 6, + 6, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 6, + 6, + 6, + 6 + ], + "n": [ + 0.0125335479355233, + 7.8957634722828, + -8.7803203303561, + 0.31802509345418, + -0.26145533859358, + -0.0078199751687981, + 0.0088089493102134, + -0.66856572307965, + 0.20433810950965, + -6.6212605039687e-05, + -0.19232721156002, + -0.25709043003438, + 0.16074868486251, + -0.040092828925807, + 3.9343422603254e-07, + -7.5941377088144e-06, + 0.00056250979351888, + -1.5608652257135e-05, + 1.1537996422951e-09, + 3.6582165144204e-07, + -1.3251180074668e-12, + -6.2639586912454e-10, + -0.10793600908932, + 0.017611491008752, + 0.22132295167546, + -0.40247669763528, + 0.58083399985759, + 0.0049969146990806, + -0.031358700712549, + -0.74315929710341, + 0.4780732991548, + 0.020527940895948, + -0.13636435110343, + 0.014180634400617, + 0.0083326504880713, + -0.029052336009585, + 0.038615085574206, + -0.020393486513704, + -0.0016554050063734, + 0.0019955571979541, + 0.00015870308324157, + -1.638856834253e-05, + 0.043613615723811, + 0.034994005463765, + -0.076788197844621, + 0.022446277332006, + -6.2689710414685e-05, + -5.5711118565645e-10, + -0.19905718354408, + 0.31777497330738, + -0.11841182425981 + ], + "t": [ + -0.5, + 0.875, + 1, + 0.5, + 0.75, + 0.375, + 1, + 4, + 6, + 12, + 1, + 5, + 4, + 2, + 13, + 9, + 3, + 4, + 11, + 4, + 13, + 1, + 7, + 1, + 9, + 10, + 10, + 3, + 7, + 10, + 10, + 6, + 10, + 10, + 1, + 2, + 3, + 4, + 8, + 6, + 9, + 8, + 16, + 22, + 23, + 23, + 10, + 50, + 44, + 46, + 50 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 150, + 150, + 250 + ], + "d": [ + 3, + 3, + 3 + ], + "epsilon": [ + 1, + 1, + 1 + ], + "eta": [ + 20, + 20, + 20 + ], + "gamma": [ + 1.21, + 1.21, + 1.25 + ], + "n": [ + -31.306260323435, + 31.546140237781, + -2521.3154341695 + ], + "t": [ + 0, + 1, + 4 + ], + "type": "ResidualHelmholtzGaussian" + }, + { + "A": [ + 0.32, + 0.32 + ], + "B": [ + 0.2, + 0.2 + ], + "C": [ + 28, + 32 + ], + "D": [ + 700, + 800 + ], + "a": [ + 3.5, + 3.5 + ], + "b": [ + 0.85, + 0.95 + ], + "beta": [ + 0.3, + 0.3 + ], + "n": [ + -0.14874640856724, + 0.31806110878444 + ], + "type": "ResidualHelmholtzNonAnalytic" + } + ], + "gas_constant": 8.314371357587, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.018015268, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 611.654771, + "ptriple_units": "Pa", + "reducing_state": { + "T": 647.096, + "T_units": "K", + "p": 22064000, + "p_units": "Pa", + "rhomolar": 17873.72799560906, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 55496.95891263704, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.2694886833193984, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Water" +} \ No newline at end of file diff --git a/dev/fluids/Xenon.json b/dev/fluids/Xenon.json new file mode 100644 index 00000000..730cfe81 --- /dev/null +++ b/dev/fluids/Xenon.json @@ -0,0 +1,244 @@ +{ + "ALIASES": [ + "Xe", + "xenon", + "XENON" + ], + "ANCILLARIES": { + "pL": { + "T_r": 289.733, + "Tmax": 289.7329999999995, + "Tmin": 161.4, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.011854794678511915, + "n": [ + 11.759823036499577, + -19.398618185657206, + 2.5732301247266913, + 0.020967271862947154, + -1.9842834228505148, + 1.309146521589442 + ], + "reducing_value": 5842000.0, + "t": [ + 0.927, + 0.954, + 1.098, + 1.658, + 4.602, + 7.358 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 289.733, + "Tmax": 289.7329999999995, + "Tmin": 161.4, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.003330663663103639, + "n": [ + -16.19625075039699, + 11.57828555218498, + -0.8039722338089157, + -0.44871260923308376, + -3.2943901833234577, + -0.38871476100259306 + ], + "reducing_value": 5842000.0, + "t": [ + 1.057, + 1.12, + 3.837, + 4.253, + 9.273, + 1.349 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 289.733, + "Tmax": 289.7329999999995, + "Tmin": 161.4, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.442478347100006, + "n": [ + -0.07701425735191812, + 2.124910237054726, + 3.0205260680663732, + -192.08348472998213, + 269.9245321947838, + -15087.387586364559 + ], + "reducing_value": 8400.0, + "t": [ + 0.084, + 0.346, + 2.447, + 5.49, + 6.019, + 15.158 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 289.733, + "Tmax": 289.7329999999995, + "Tmin": 161.4, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5570878482475949, + "n": [ + -2.3064783393038195, + -1.620761716561509, + -2.202094575030882, + 84230.43322373286, + -29642269.39439326, + 40329098.33422997 + ], + "reducing_value": 8400.0, + "t": [ + 0.415, + 0.698, + 2.925, + 14.138, + 18.611, + 19.123 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 289.733, + "a": [ + -0.11538, + 0.16598 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.0512, + 1.098 + ] + } + }, + "CAS": "7440-63-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 0, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "Xenon", + "ODP": -1.0, + "PH": 3 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 750, + "T_max_units": "K", + "Ttriple": 161.4, + "Ttriple_units": "K", + "accentric": 0.00363, + "accentric_units": "-", + "alpha0": [ + { + "a1": -3.8227178129, + "a2": 3.8416395351, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.5, + "type": "IdealGasHelmholtzLogTau" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.83115, + -2.3553, + 0.53904, + 0.014382, + 0.066309, + 0.00019649, + 0.14996, + -0.035319, + -0.15929, + -0.027521, + -0.023305, + 0.0086941 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.131293, + "molar_mass_units": "kg/mol", + "p_max": 700000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 81747.79907, + "ptriple_units": "Pa", + "reducing_state": { + "T": 289.733, + "T_units": "K", + "p": 5842000, + "p_units": "Pa", + "rhomolar": 8400, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 22592.29218261004, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 62.61612339419351, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "Xenon" +} \ No newline at end of file diff --git a/dev/fluids/cis-2-Butene.json b/dev/fluids/cis-2-Butene.json new file mode 100644 index 00000000..6f442967 --- /dev/null +++ b/dev/fluids/cis-2-Butene.json @@ -0,0 +1,245 @@ +{ + "ALIASES": [ + "Cis-2-Butene", + "CIS-2-BUTENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 435.75, + "Tmax": 435.7499999999991, + "Tmin": 134.3, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.24855875518168258, + "n": [ + 0.0677302414418938, + -4.8343076872999236, + -5.4106633030712565, + 41.30992857221284, + -40.52816223536726, + -0.6515323361189119 + ], + "reducing_value": 4225500.0, + "t": [ + 0.331, + 0.886, + 1.813, + 2.731, + 2.888, + 8.459 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 435.75, + "Tmax": 435.7499999999991, + "Tmin": 134.3, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2486366837373688, + "n": [ + 0.04889427368224387, + -6.630115219199998, + 1.085463127003139, + -0.8224811391469051, + -3.0113284495745924, + -0.7621234290339737 + ], + "reducing_value": 4225500.0, + "t": [ + 0.374, + 0.967, + 1.328, + 1.817, + 3.932, + 7.404 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 435.75, + "Tmax": 435.7499999999991, + "Tmin": 134.3, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.13490879855498905, + "n": [ + -2.0818345732351684, + 6.807747893614343, + -111.04784929056088, + 120.09826778110036, + -12.601532453548211, + 1.7960675631510878 + ], + "reducing_value": 4244.0, + "t": [ + 0.26, + 0.351, + 0.795, + 0.831, + 1.18, + 2.144 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 435.75, + "Tmax": 435.7499999999991, + "Tmin": 134.3, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.36720202981660455, + "n": [ + -84.9269743250438, + 89.02084598490362, + -9.271866684444854, + -4.116354594069339, + -1.1445772731784132, + 16.852533778316815 + ], + "reducing_value": 4244.0, + "t": [ + 0.539, + 0.554, + 0.74, + 3.876, + 7.701, + 19.761 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "590-18-1", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "cis-2-Butene", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-FPE-2005", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 134.3, + "Ttriple_units": "K", + "accentric": 0.20235958587, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0.2591542, + "a2": 2.4189888, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.9687, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.2375, + 7.0437, + 11.414, + 7.3722 + ], + "t": [ + 0.5691336775674125, + 2.714859437751004, + 4.800917957544463, + 10.09064830751578 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.77827, + -2.8064, + 1.003, + 0.013762, + 0.085514, + 0.00021268, + 0.22962, + -0.072442, + -0.23722, + -0.074071, + -0.026547, + 0.012032 + ], + "t": [ + 0.12, + 1.3, + 1.74, + 2.1, + 0.28, + 0.69, + 0.75, + 2, + 4.4, + 4.7, + 15, + 14 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.05610631999999999, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.263649665, + "ptriple_units": "Pa", + "reducing_state": { + "T": 435.75, + "T_units": "K", + "p": 4225500, + "p_units": "Pa", + "rhomolar": 4244, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 14083.99244573583, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0002361583020722408, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "cis-2-Butene" +} \ No newline at end of file diff --git a/dev/fluids/m-Xylene.json b/dev/fluids/m-Xylene.json new file mode 100644 index 00000000..c9acbe52 --- /dev/null +++ b/dev/fluids/m-Xylene.json @@ -0,0 +1,276 @@ +{ + "ALIASES": [ + "mXylene", + "m-xylene", + "M-XYLENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 616.89, + "Tmax": 616.889999999999, + "Tmin": 225.3, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.019676450599204198, + "n": [ + 2.4225991542349563, + -9.171820614479033, + 24.85348223089516, + -29.695524816912616, + 4.675951352907592, + -4.550257595781603 + ], + "reducing_value": 3534600.0, + "t": [ + 0.851, + 0.937, + 2.972, + 3.057, + 4.361, + 5.208 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 616.89, + "Tmax": 616.889999999999, + "Tmin": 225.3, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.011448642296418843, + "n": [ + 16.462027456851953, + -23.613777199675944, + 2.341442695879726, + -2.172024345368255, + -3.2181295708930437, + -1.3831666730887018 + ], + "reducing_value": 3534600.0, + "t": [ + 0.932, + 0.948, + 1.792, + 2.065, + 3.546, + 6.706 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 616.89, + "Tmax": 616.889999999999, + "Tmin": 225.3, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.020112847012532242, + "n": [ + 1.1684596769577356, + -11.068326498191913, + 239.3508126040545, + -235.63804962721167, + 9.613596620997477, + -0.5483150812209723 + ], + "reducing_value": 2665.0, + "t": [ + 0.262, + 0.821, + 0.965, + 0.987, + 1.389, + 2.441 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 616.89, + "Tmax": 616.889999999999, + "Tmin": 225.3, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.2356743428769246, + "n": [ + -0.07808901638966609, + -3.249336299391575, + -5.108399766940012, + 68.16749399679267, + -70.92698933428645, + 1.963032740598388 + ], + "reducing_value": 2665.0, + "t": [ + 0.054, + 0.43, + 1.276, + 2.589, + 2.714, + 8.624 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "108-38-3", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-JPCRD-2012", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 225.3, + "Ttriple_units": "K", + "accentric": 0.326, + "accentric_units": "-", + "alpha0": [ + { + "a1": 12.652887, + "a2": 0.45975624, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 1.169909, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.44312, + 2.862794, + 24.83298, + 16.26077 + ], + "t": [ + 0.259365527079382, + 0.3079965634067662, + 2.160839047480102, + 5.667136766684498 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 8, + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 1.2791017e-05, + 0.041063111, + 1.505996, + -2.3095875, + -0.46969, + 0.171031, + -1.001728, + -0.3945766, + 0.6970578, + -0.3002876, + -0.024311 + ], + "t": [ + 1, + 0.91, + 0.231, + 0.772, + 1.205, + 0.323, + 2.7, + 3.11, + 0.768, + 4.1, + 0.818 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 1.66, + 1.9354, + 1.0323, + 78 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.713, + 0.9169, + 0.6897, + 0.7245 + ], + "eta": [ + 1.0244, + 1.3788, + 0.9806, + 6.3563 + ], + "gamma": [ + 1.1013, + 0.6515, + 0.4975, + 1.26 + ], + "n": [ + 0.815488, + -0.330647, + -0.123393, + -0.54661 + ], + "t": [ + 2, + 2.9, + 3.83, + 0.5 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.106165, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 3.123267493, + "ptriple_units": "Pa", + "reducing_state": { + "T": 616.89, + "T_units": "K", + "p": 3534600, + "p_units": "Pa", + "rhomolar": 2665, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8676.641643114928, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.001667496167675007, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "m-Xylene" +} \ No newline at end of file diff --git a/dev/fluids/n-Butane.json b/dev/fluids/n-Butane.json new file mode 100644 index 00000000..81acf4b1 --- /dev/null +++ b/dev/fluids/n-Butane.json @@ -0,0 +1,333 @@ +{ + "ALIASES": [ + "nButane", + "butane", + "BUTANE", + "N-BUTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 425.125, + "Tmax": 425.124999999999, + "Tmin": 134.895, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.02500890020828983, + "n": [ + -5.805352213973263, + -11.51448089471748, + 18.238781113551752, + -7.570052478022171, + -1.4755071099444654, + -1.328641564172384 + ], + "reducing_value": 3796000.0, + "t": [ + 0.978, + 1.371, + 1.499, + 1.748, + 4.108, + 4.752 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 425.125, + "Tmax": 425.124999999999, + "Tmin": 134.895, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.02366371569104686, + "n": [ + 0.06986482880463143, + -6.689091326409199, + 4.774874567188075, + -5.7054710938841655, + 1.8437119133933968, + -3.735372218319482 + ], + "reducing_value": 3796000.0, + "t": [ + 0.743, + 0.984, + 1.886, + 2.16, + 3.286, + 4.231 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 425.125, + "Tmax": 425.124999999999, + "Tmin": 134.895, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.21170510433432543, + "n": [ + 7.6544950329552, + -16.928503641708495, + 14.176327512939299, + -2.3511736019127136, + 5.431931351600508, + -13.286388570143172 + ], + "reducing_value": 3922.7696129878086, + "t": [ + 0.501, + 0.742, + 0.917, + 1.387, + 9.328, + 12.623 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 425.125, + "Tmax": 425.124999999999, + "Tmin": 134.895, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.1838723681035446, + "n": [ + -3.756767939636941, + -2.819084986331516, + 2.3817493893256763, + -27.835034497609627, + 409.95394459399324, + -539.2138907428523 + ], + "reducing_value": 3922.7696129878086, + "t": [ + 0.448, + 1.717, + 4.443, + 7.472, + 13.095, + 14.725 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 425.125, + "a": [ + 0.05138 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.209 + ] + } + }, + "CAS": "106-97-8", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Butane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Buecker-JPCRD-2006B", + "T_max": 340, + "T_max_units": "K", + "Ttriple": 134.895, + "Ttriple_units": "K", + "accentric": 0.200810094644, + "accentric_units": "-", + "alpha0": [ + { + "a1": 12.54882924, + "a2": -5.46976878, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3.24680487, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 5.54913289, + 11.4648996, + 7.59987584, + 9.66033239 + ], + "t": [ + 0.774840445, + 3.340602552, + 4.970513096, + 9.975553778 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 4, + 4, + 1, + 1, + 2, + 7, + 8, + 8, + 1, + 2, + 3, + 3, + 4, + 5, + 5, + 10, + 2, + 6 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3 + ], + "n": [ + 2.5536998241635, + -4.4585951806696, + 0.82425886369063, + 0.11215007011442, + -0.035910933680333, + 0.016790508518103, + 0.032734072508724, + 0.95571232982005, + -1.0003385753419, + 0.085581548803855, + -0.025147918369616, + -0.0015202958578918, + 0.004706068232642, + -0.097845414174006, + -0.04831790415876, + 0.17841271865468, + 0.018173836739334, + -0.11399068074953, + 0.019329896666669, + 0.001157587740101, + 0.00015253808698116, + -0.043688558458471, + -0.0082403190629989 + ], + "t": [ + 0.5, + 1, + 1.5, + 0, + 0.5, + 0.5, + 0.75, + 2, + 2.5, + 2.5, + 1.5, + 1, + 1.5, + 4, + 7, + 3, + 7, + 3, + 1, + 6, + 0, + 6, + 13 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 150, + 200 + ], + "d": [ + 1, + 2 + ], + "epsilon": [ + 0.85, + 1 + ], + "eta": [ + 10, + 10 + ], + "gamma": [ + 1.16, + 1.13 + ], + "n": [ + -0.028390056949441, + 0.0014904666224681 + ], + "t": [ + 2, + 0 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.0581222, + "molar_mass_units": "kg/mol", + "p_max": 12000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.6656588872, + "ptriple_units": "Pa", + "reducing_state": { + "T": 425.125, + "T_units": "K", + "p": 3796000, + "p_units": "Pa", + "rhomolar": 3922.769612987809, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 12645.04606150976, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0005936113826349512, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Butane" +} \ No newline at end of file diff --git a/dev/fluids/n-Decane.json b/dev/fluids/n-Decane.json new file mode 100644 index 00000000..cfec7f99 --- /dev/null +++ b/dev/fluids/n-Decane.json @@ -0,0 +1,258 @@ +{ + "ALIASES": [ + "Decane", + "decane", + "DECANE", + "N-DECANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 617.7, + "Tmax": 617.6999999999986, + "Tmin": 243.5, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07756927044693107, + "n": [ + -0.20911143417151587, + -11.744433715974306, + 10.972105872724544, + -8.360362692229996, + -4.336166080704403, + -26.146244680867692 + ], + "reducing_value": 2103000.0, + "t": [ + 0.594, + 1.088, + 1.552, + 1.959, + 4.124, + 18.652 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 617.7, + "Tmax": 617.6999999999986, + "Tmin": 243.5, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.07748402944278698, + "n": [ + -0.018658701477170855, + 0.11385848199518148, + -8.950810509531753, + 1.828978043951727, + -3.8508051312012306, + -3.0325059558496923 + ], + "reducing_value": 2103000.0, + "t": [ + 0.297, + 0.55, + 0.987, + 1.227, + 2.854, + 4.712 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 617.7, + "Tmax": 617.6999999999986, + "Tmin": 243.5, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.22413706273485268, + "n": [ + 4.827666872341155, + -3.7319669690993447, + 1.9076750287466657, + 0.16459343086669795, + 1666.7748855066088, + -2460.441820959505 + ], + "reducing_value": 1640.0000000000002, + "t": [ + 0.49, + 0.778, + 1.234, + 5.192, + 18.677, + 19.549 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 617.7, + "Tmax": 617.6999999999986, + "Tmin": 243.5, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.1767241319367674, + "n": [ + 0.14176862633564324, + -4.281435009034745, + -7.136194974307151, + 6.849154519985906, + -3.913871220272946, + -5.556483531473428 + ], + "reducing_value": 1640.0000000000002, + "t": [ + 0.219, + 0.452, + 1.016, + 1.126, + 2.035, + 4.148 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 617.7, + "a": [ + 0.05473 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.29 + ] + } + }, + "CAS": "124-18-5", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Decane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 675, + "T_max_units": "K", + "Ttriple": 243.5, + "Ttriple_units": "K", + "accentric": 0.4884, + "accentric_units": "-", + "alpha0": [ + { + "a1": 13.9361966549, + "a2": -10.5265128286, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 18.109, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 25.685, + 28.233, + 12.417, + 10.035 + ], + "t": [ + 1.931358264529707, + 3.46446495062328, + 7.710862878419944, + 17.58458798769629 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0461, + -2.4807, + 0.74372, + -0.52579, + 0.15315, + 0.00032865, + 0.84178, + 0.055424, + -0.73555, + -0.18507, + -0.020775, + 0.012335 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.14228168, + "molar_mass_units": "kg/mol", + "p_max": 800000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1.404183642, + "ptriple_units": "Pa", + "reducing_state": { + "T": 617.7, + "T_units": "K", + "p": 2103000, + "p_units": "Pa", + "rhomolar": 1640, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 5406.411318574519, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0006936528125986273, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Decane" +} \ No newline at end of file diff --git a/dev/fluids/n-Dodecane.json b/dev/fluids/n-Dodecane.json new file mode 100644 index 00000000..9397a7ee --- /dev/null +++ b/dev/fluids/n-Dodecane.json @@ -0,0 +1,260 @@ +{ + "ALIASES": [ + "nDodecane", + "Dodecane", + "DODECANE", + "N-DODECANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 658.1, + "Tmax": 658.0999999999985, + "Tmin": 263.6, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.031299066244705465, + "n": [ + 0.07432358695136501, + -8.095550434658023, + 8.823108680318432, + -12.031829724482998, + -4.2537714590653755, + -3.0093802692458955 + ], + "reducing_value": 1817000.0, + "t": [ + 0.68, + 0.975, + 2.262, + 2.456, + 4.412, + 14.813 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 658.1, + "Tmax": 658.0999999999985, + "Tmin": 263.6, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03129828340833196, + "n": [ + 0.01855892414806427, + -7.941228211958365, + 0.7027032448570503, + -1.6469727356969044, + -6.161545669379877, + -1.4874349910776694 + ], + "reducing_value": 1817000.0, + "t": [ + 0.435, + 0.972, + 1.704, + 2.29, + 3.72, + 9.501 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 658.1, + "Tmax": 658.0999999999985, + "Tmin": 263.6, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.06226133770144138, + "n": [ + 169.6307007144784, + -170.78856038865672, + 4.362812034890246, + -0.46704708251799704, + 3.942637021143127, + -4.234606611460045 + ], + "reducing_value": 1330.0, + "t": [ + 0.312, + 0.314, + 0.53, + 1.689, + 5.186, + 6.344 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 658.1, + "Tmax": 658.0999999999985, + "Tmin": 263.6, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.4284240304967444, + "n": [ + -3.1027406450131076, + 659.6310704998223, + -2132.1075657465976, + 1475.1968821648827, + -19.394230255247603, + 6.056907847881279 + ], + "reducing_value": 1330.0, + "t": [ + 0.369, + 1.31, + 1.357, + 1.383, + 3.194, + 4.632 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 658.1, + "a": [ + 0.0154, + 0.048 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 4.18, + 1.17 + ] + } + }, + "CAS": "112-40-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 2, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Dodecane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-EF-2004", + "T_max": 800, + "T_max_units": "K", + "Ttriple": 263.6, + "Ttriple_units": "K", + "accentric": 0.574182221240689, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 22.085, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 37.776, + 29.369, + 12.461, + 7.7733 + ], + "t": [ + 1.944993162133414, + 3.645342653092235, + 8.661297675125361, + 21.07430481689713 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.38031, + -2.85352, + 0.288897, + -0.165993, + 0.0923993, + 0.000282772, + 0.956627, + 0.0353076, + -0.445008, + -0.118911, + -0.0366475, + 0.0184223 + ], + "t": [ + 0.32, + 1.23, + 1.5, + 1.4, + 0.07, + 0.8, + 2.16, + 1.1, + 4.1, + 5.6, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.17033484, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.6262109235, + "ptriple_units": "Pa", + "reducing_state": { + "T": 658.1, + "T_units": "K", + "p": 1817000, + "p_units": "Pa", + "rhomolar": 1330, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 4529.141934352717, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0002857525844969409, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Dodecane" +} \ No newline at end of file diff --git a/dev/fluids/n-Heptane.json b/dev/fluids/n-Heptane.json new file mode 100644 index 00000000..016979b1 --- /dev/null +++ b/dev/fluids/n-Heptane.json @@ -0,0 +1,269 @@ +{ + "ALIASES": [ + "nHeptane", + "Heptane", + "HEPTANE", + "N-HEPTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 540.13, + "Tmax": 540.1299999999987, + "Tmin": 182.55, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.061001060180121414, + "n": [ + -0.001547608055848768, + -8.278553452057723, + 2.2800315192023684, + -4.304490300717095, + 0.8703765102176411, + -2.80944123395076 + ], + "reducing_value": 2736000.0, + "t": [ + 0.006, + 1.018, + 1.502, + 3.003, + 6.048, + 6.315 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 540.13, + "Tmax": 540.1299999999987, + "Tmin": 182.55, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.18026733581983923, + "n": [ + 0.25104409608498446, + -6.845140939717869, + -1.2228515021938513, + -14.455325847673445, + 286.78777701022443, + -278.9908782467837 + ], + "reducing_value": 2736000.0, + "t": [ + 0.695, + 0.948, + 2.259, + 5.399, + 7.582, + 7.692 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 540.13, + "Tmax": 540.1299999999987, + "Tmin": 182.55, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 2.5843922865022684, + "n": [ + 0.35147807402250625, + 4.121792126592887, + -2.4954273570574026, + 2938.5470325829165, + -4682.169465017815, + 2501.072581290023 + ], + "reducing_value": 2315.3230474441625, + "t": [ + 0.124, + 0.664, + 1.294, + 10.615, + 11.227, + 13.607 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 540.13, + "Tmax": 540.1299999999987, + "Tmin": 182.55, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.706924711484416, + "n": [ + -0.29457754530864466, + -7.274148490152896, + 75.40064985046571, + -79.02485215998952, + 1.254951249920929, + -6.677464890274236 + ], + "reducing_value": 2315.3230474441625, + "t": [ + 0.061, + 0.718, + 1.921, + 2.015, + 2.746, + 9.877 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 540.13, + "a": [ + 0.07765, + -0.02599 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.319, + 1.6 + ] + } + }, + "CAS": "142-82-5", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Heptane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Jaeschke-IJT-1995", + "BibTeX_EOS": "Span-IJT-2003B", + "T_max": 310, + "T_max_units": "K", + "Ttriple": 182.55, + "Ttriple_units": "K", + "accentric": 0.349, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.599437140443368, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 371.533277446, + "Tc": 540.13, + "c": [ + 4, + 13.7266, + 169.789, + 30.4707, + 836.195 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + }, + { + "T0": 371.533277446, + "Tc": 540.13, + "c": [ + 0, + 43.5561, + 1760.46, + 0, + 0 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0543748, + -2.6500682, + 0.81730048, + -0.30451391, + 0.12253869, + 0.00027266473, + 0.49865826, + -0.00071432815, + -0.54236896, + -0.13801822, + -0.0061595287, + 0.0004860251 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.100202, + "molar_mass_units": "kg/mol", + "p_max": 100000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.1754903981, + "ptriple_units": "Pa", + "reducing_state": { + "T": 540.13, + "T_units": "K", + "p": 2736000, + "p_units": "Pa", + "rhomolar": 2315.323047444163, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 7745.676592920418, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0001156384998550007, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Heptane" +} \ No newline at end of file diff --git a/dev/fluids/n-Hexane.json b/dev/fluids/n-Hexane.json new file mode 100644 index 00000000..3ff6a62b --- /dev/null +++ b/dev/fluids/n-Hexane.json @@ -0,0 +1,269 @@ +{ + "ALIASES": [ + "nHexane", + "Hexane", + "HEXANE", + "N-HEXANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 507.82, + "Tmax": 507.81999999999886, + "Tmin": 177.83, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.286473563774603, + "n": [ + 0.01624870043431449, + -4.6856725397462045, + -1.944931617943695, + -2.699572110510845, + -24.96422210280747, + 25.571553247591133 + ], + "reducing_value": 3034000.0, + "t": [ + 0.159, + 0.914, + 1.136, + 3.283, + 7.567, + 8.012 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 507.82, + "Tmax": 507.81999999999886, + "Tmin": 177.83, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2940522917648014, + "n": [ + 0.8528029596767168, + -5.384032997988009, + -90.91548667688265, + 118.30086404230913, + -33.3965271266182, + 1.2595931573516512 + ], + "reducing_value": 3034000.0, + "t": [ + 0.549, + 0.794, + 2.19, + 2.321, + 2.77, + 15.614 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 507.82, + "Tmax": 507.81999999999886, + "Tmin": 177.83, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.9024344840601106, + "n": [ + -418.4662126032291, + 862.7834590549915, + -4812.159872858643, + 4546.279879423712, + -177.86740434610275, + 2.641529465078265 + ], + "reducing_value": 2705.877875067769, + "t": [ + 0.623, + 0.673, + 0.865, + 0.889, + 1.141, + 2.833 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 507.82, + "Tmax": 507.81999999999886, + "Tmin": 177.83, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.0104195769602642, + "n": [ + -3.360986048771016, + -4.224147421152148, + 6.878988884363569, + -30.350141590045336, + 21.988568810045702, + -48.53840141194605 + ], + "reducing_value": 2705.877875067769, + "t": [ + 0.428, + 1.221, + 2.201, + 3.574, + 3.995, + 16.403 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 507.82, + "a": [ + 0.210952, + -0.158485 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.0962, + 1.05893 + ] + } + }, + "CAS": "110-54-3", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": 3.1, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Hexane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Jaeschke-IJT-1995", + "BibTeX_EOS": "Span-IJT-2003B", + "T_max": 548, + "T_max_units": "K", + "Ttriple": 177.83, + "Ttriple_units": "K", + "accentric": 0.299, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.570859897210351, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 341.864512243, + "Tc": 507.82, + "c": [ + 4, + 11.6977, + 182.326, + 26.8142, + 859.207 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + }, + { + "T0": 341.864512243, + "Tc": 507.82, + "c": [ + 0, + 38.6164, + 1826.59, + 0, + 0 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0553238, + -2.6120616, + 0.76613883, + -0.29770321, + 0.11879908, + 0.00027922861, + 0.4634759, + 0.011433197, + -0.48256969, + -0.093750559, + -0.0067273247, + -0.0051141584 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.08617535999999999, + "molar_mass_units": "kg/mol", + "p_max": 92000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1.277140421, + "ptriple_units": "Pa", + "reducing_state": { + "T": 507.82, + "T_units": "K", + "p": 3034000, + "p_units": "Pa", + "rhomolar": 2705.877875067769, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8839.368780630628, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0008638949474676791, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Hexane" +} \ No newline at end of file diff --git a/dev/fluids/n-Nonane.json b/dev/fluids/n-Nonane.json new file mode 100644 index 00000000..6045633f --- /dev/null +++ b/dev/fluids/n-Nonane.json @@ -0,0 +1,257 @@ +{ + "ALIASES": [ + "nonane", + "NONANE", + "N-NONANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 594.55, + "Tmax": 594.5499999999988, + "Tmin": 219.7, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.042955186429660674, + "n": [ + 0.11848542849564217, + -206.06912532030728, + 204.6308137723198, + -6.785269035908729, + -4.84298916029439, + -0.44076934607962737 + ], + "reducing_value": 2281000.0, + "t": [ + 0.741, + 1.137, + 1.152, + 1.563, + 3.91, + 8.223 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 594.55, + "Tmax": 594.5499999999988, + "Tmin": 219.7, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.0429551855531618, + "n": [ + 0.17512979712645566, + -13.890353079088916, + 7.363037542847803, + -3.8800351715589256, + 1.688059255455581, + -4.696846069919248 + ], + "reducing_value": 2281000.0, + "t": [ + 0.695, + 1.023, + 1.153, + 2.471, + 3.113, + 4.262 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 594.55, + "Tmax": 594.5499999999988, + "Tmin": 219.7, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.138204992711366, + "n": [ + -23.198712622058476, + 402.39535606636224, + -525.0132880466338, + 158.57173971120517, + -19.07334776671177, + 9.495727034290677 + ], + "reducing_value": 1810.0, + "t": [ + 0.587, + 0.686, + 0.729, + 0.846, + 1.5, + 1.824 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 594.55, + "Tmax": 594.5499999999988, + "Tmin": 219.7, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.15234619512934922, + "n": [ + -5.1536130968369545, + 2.1332285795020645, + -3.593065172775762, + -5.8548285122141905, + -4.752281189935403, + 67.88348941881152 + ], + "reducing_value": 1810.0, + "t": [ + 0.501, + 1.115, + 1.413, + 3.576, + 9.883, + 18.14 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 594.55, + "a": [ + 0.05388 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.262 + ] + } + }, + "CAS": "111-84-2", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Nonane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2006", + "T_max": 600, + "T_max_units": "K", + "Ttriple": 219.7, + "Ttriple_units": "K", + "accentric": 0.4433, + "accentric_units": "-", + "alpha0": [ + { + "a1": 10.7927224829, + "a2": -8.2418318753, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 16.349, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 24.926, + 24.842, + 11.188, + 17.483 + ], + "t": [ + 2.053654024051804, + 3.774283071230343, + 8.423177192834919, + 19.71911529728366 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.1151, + -2.702, + 0.83416, + -0.38828, + 0.1376, + 0.00028185, + 0.62037, + 0.015847, + -0.61726, + -0.15043, + -0.012982, + 0.0044325 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1282551, + "molar_mass_units": "kg/mol", + "p_max": 800000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.4444854177, + "ptriple_units": "Pa", + "reducing_state": { + "T": 594.55, + "T_units": "K", + "p": 2281000, + "p_units": "Pa", + "rhomolar": 1810, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 6051.949931805821, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0002433600391426276, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Nonane" +} \ No newline at end of file diff --git a/dev/fluids/n-Octane.json b/dev/fluids/n-Octane.json new file mode 100644 index 00000000..8494460c --- /dev/null +++ b/dev/fluids/n-Octane.json @@ -0,0 +1,271 @@ +{ + "ALIASES": [ + "nOctane", + "Octane", + "OCTANE", + "N-OCTANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 569.32, + "Tmax": 569.3199999999987, + "Tmin": 216.37, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03259167684415143, + "n": [ + 0.2719726132924461, + -0.48708059237933493, + -6.67956803636084, + -3.319035552509312, + 8.82048901491816, + -11.290630744556589 + ], + "reducing_value": 2497000.0, + "t": [ + 0.633, + 0.795, + 0.961, + 3.059, + 4.43, + 4.557 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 569.32, + "Tmax": 569.3199999999987, + "Tmin": 216.37, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03344956709157021, + "n": [ + 0.012215760119276425, + -9.015880958846303, + 3.0337666003844825, + -3.3225607356333495, + -4.49734520248938, + 1.2758391696209577 + ], + "reducing_value": 2497000.0, + "t": [ + 0.49, + 1.015, + 1.367, + 2.45, + 5.086, + 6.784 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 569.32, + "Tmax": 569.3199999999987, + "Tmin": 216.37, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.6284908206273374, + "n": [ + 1.8711197605157706, + 6.362866515681488, + -7.771183246226491, + 12.226059321950915, + -20.5321471354057, + 269.9131977143042 + ], + "reducing_value": 2056.4, + "t": [ + 0.385, + 0.997, + 1.308, + 3.718, + 5.702, + 15.156 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 569.32, + "Tmax": 569.3199999999987, + "Tmin": 216.37, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.7487141276920637, + "n": [ + -0.28818593722704483, + 7.16566368663188, + -12.089045783083211, + -6.9190060351908285, + 31.47207439558071, + -833.7529582567691 + ], + "reducing_value": 2056.4, + "t": [ + 0.083, + 0.387, + 0.453, + 3.255, + 11.847, + 19.244 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 569.32, + "a": [ + 0.34338, + -0.50634, + 0.2238 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.6607, + 1.9632, + 2.3547 + ] + } + }, + "CAS": "111-65-9", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 3, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Octane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Jaeschke-IJT-1995", + "BibTeX_EOS": "Span-IJT-2003B", + "T_max": 548, + "T_max_units": "K", + "Ttriple": 216.37, + "Ttriple_units": "K", + "accentric": 0.395, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.601873998562896, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 398.773831136, + "Tc": 569.32, + "c": [ + 4, + 15.6865, + 158.922, + 33.8029, + 815.064 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + }, + { + "T0": 398.773831136, + "Tc": 569.32, + "c": [ + 0, + 48.1731, + 1693.07, + 0, + 0 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0722545, + -2.4632951, + 0.65386674, + -0.36324974, + 0.1271327, + 0.00030713573, + 0.52656857, + 0.019362863, + -0.58939427, + -0.14069964, + -0.0078966331, + 0.0033036598 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.1142285, + "molar_mass_units": "kg/mol", + "p_max": 96000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 1.988916188, + "ptriple_units": "Pa", + "reducing_state": { + "T": 569.32, + "T_units": "K", + "p": 2497000, + "p_units": "Pa", + "rhomolar": 2056.4, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 6686.391815025597, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.001105704645608448, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Octane" +} \ No newline at end of file diff --git a/dev/fluids/n-Pentane.json b/dev/fluids/n-Pentane.json new file mode 100644 index 00000000..01a88b5c --- /dev/null +++ b/dev/fluids/n-Pentane.json @@ -0,0 +1,272 @@ +{ + "ALIASES": [ + "nPentane", + "Pentane", + "PENTANE", + "N-PENTANE", + "R601" + ], + "ANCILLARIES": { + "pL": { + "T_r": 469.7, + "Tmax": 469.69999999999914, + "Tmin": 143.47, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03728114510677116, + "n": [ + 0.04748174519828376, + -6.629115738167101, + 0.6562557112100337, + -2.28440361956112, + -1.308924059672944, + -1.1435668798949066 + ], + "reducing_value": 3370000.0, + "t": [ + 0.642, + 0.976, + 1.848, + 3.17, + 3.871, + 7.841 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 469.7, + "Tmax": 469.69999999999914, + "Tmin": 143.47, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.029330284037554222, + "n": [ + 0.0002920351277984843, + -468.97717292372954, + 465.7564333009324, + -3.372619624545633, + -3.4063439897011767, + -1.5154480392091865 + ], + "reducing_value": 3370000.0, + "t": [ + 0.137, + 1.119, + 1.123, + 1.477, + 3.969, + 12.951 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 469.7, + "Tmax": 469.69999999999914, + "Tmin": 143.47, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.114298806470317, + "n": [ + 2.3841375525242356, + 0.19925431521697065, + 5225.0215429825175, + 38711.30119718553, + -196165.0631164374, + 157517.76191925188 + ], + "reducing_value": 3215.5775884221466, + "t": [ + 0.389, + 1.069, + 18.567, + 18.567, + 19.512, + 19.95 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 469.7, + "Tmax": 469.69999999999914, + "Tmin": 143.47, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 3.2828728664463958, + "n": [ + -4.317782477894743, + -2.2050235507345954, + -2.7959424348848843, + -5.048155874145048, + 472.4781512909357, + -547.9642656628733 + ], + "reducing_value": 3215.5775884221466, + "t": [ + 0.482, + 1.994, + 4.101, + 9.312, + 18.36, + 19.107 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 469.7, + "a": [ + 0.08015, + 0.004384, + -0.03437 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.408, + 1.031, + 1.818 + ] + } + }, + "CAS": "109-66-0", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 2, + "Name": "n-Pentane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "Jaeschke-IJT-1995", + "BibTeX_EOS": "Span-IJT-2003B", + "T_max": 573, + "T_max_units": "K", + "Ttriple": 143.47, + "Ttriple_units": "K", + "accentric": 0.251, + "accentric_units": "-", + "alpha0": [ + { + "a1": -1.548185641277708, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 309.213623675, + "Tc": 469.7, + "c": [ + 4, + 8.95043, + 178.67, + 21.836, + 840.538 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + }, + { + "T0": 309.213623675, + "Tc": 469.7, + "c": [ + 0, + 33.4032, + 1774.25, + 0, + 0 + ], + "type": "IdealGasHelmholtzCP0AlyLee" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 1.0968643, + -2.9988888, + 0.99516887, + -0.16170709, + 0.1133446, + 0.00026760595, + 0.40979882, + -0.040876423, + -0.38169482, + -0.10931957, + -0.032073223, + 0.016877016 + ], + "t": [ + 0.25, + 1.125, + 1.5, + 1.375, + 0.25, + 0.875, + 0.625, + 1.75, + 3.625, + 3.625, + 14.5, + 12 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.31451, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.07214878, + "molar_mass_units": "kg/mol", + "p_max": 69000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.07632218395, + "ptriple_units": "Pa", + "reducing_state": { + "T": 469.7, + "T_units": "K", + "p": 3370000, + "p_units": "Pa", + "rhomolar": 3215.577588422147, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 10566.39007740751, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 6.399383717983962e-05, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Pentane" +} \ No newline at end of file diff --git a/dev/fluids/n-Propane.json b/dev/fluids/n-Propane.json new file mode 100644 index 00000000..833a4cc9 --- /dev/null +++ b/dev/fluids/n-Propane.json @@ -0,0 +1,324 @@ +{ + "ALIASES": [ + "Propane", + "propane", + "R290", + "C3H8", + "PROPANE", + "N-PROPANE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 369.89, + "Tmax": 369.8899999999991, + "Tmin": 85.52500000000002, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.05284815441644053, + "n": [ + 0.021647852905706602, + -1.6369978591606182, + -4.493052504871183, + 5.182655875995273, + -7.542401679816551, + -0.4920693750863155 + ], + "reducing_value": 4251200.0, + "t": [ + 0.408, + 0.858, + 1.034, + 2.934, + 3.281, + 9.968 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 369.89, + "Tmax": 369.8899999999991, + "Tmin": 85.52500000000002, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.016222893634509905, + "n": [ + -23.998635747391152, + 18.313017605233238, + -0.42240851966839504, + -2.7378298813798962, + 0.257888414168987, + -1.3113462226130785 + ], + "reducing_value": 4251200.0, + "t": [ + 1.05, + 1.084, + 2.259, + 4.287, + 7.66, + 18.584 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 369.89, + "Tmax": 369.8899999999991, + "Tmin": 85.52500000000002, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4218642075006107, + "n": [ + 2.104068052280433, + 0.3371892411622086, + 0.4401223810964251, + -3.5679018989260567, + 59.93889697061387, + -70.9402469085883 + ], + "reducing_value": 5000.000000000001, + "t": [ + 0.368, + 0.875, + 3.009, + 9.51, + 15.381, + 17.001 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 369.89, + "Tmax": 369.8899999999991, + "Tmin": 85.52500000000002, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.171965141592346, + "n": [ + -3.401360845132903, + -1.9443653795380451, + -0.4101211459709529, + -15.598374206544214, + 15.844867806184942, + -15.298907422332046 + ], + "reducing_value": 5000.000000000001, + "t": [ + 0.431, + 1.339, + 2.091, + 6.822, + 8.214, + 19.706 + ], + "type": "rhoV", + "using_tau_r": true + }, + "surface_tension": { + "BibTeX": "Mulero-JPCRD-2012", + "Tc": 369.89, + "a": [ + 0.05334, + -0.01748 + ], + "description": "sigma = sum(a_i*(1-T/Tc)^n_i)", + "n": [ + 1.235, + 4.404 + ] + } + }, + "CAS": "74-98-6", + "ENVIRONMENTAL": { + "ASHRAE34": "A3", + "FH": 4, + "GWP100": 3.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 1, + "Name": "n-Propane", + "ODP": -1.0, + "PH": 0 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-JCED-2009", + "T_max": 650, + "T_max_units": "K", + "Ttriple": 85.525, + "Ttriple_units": "K", + "accentric": 0.1521, + "accentric_units": "-", + "alpha0": [ + { + "a1": -4.970583, + "a2": 4.29352, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 3, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 3.043, + 5.874, + 9.337, + 7.922 + ], + "t": [ + 1.062478, + 3.344237, + 5.363757, + 11.762957 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 4, + 1, + 1, + 2, + 2, + 1, + 3, + 6, + 6, + 2, + 3 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2 + ], + "n": [ + 0.042910051, + 1.7313671, + -2.4516524, + 0.34157466, + -0.46047898, + -0.66847295, + 0.20889705, + 0.19421381, + -0.22917851, + -0.60405866, + 0.066680654 + ], + "t": [ + 1, + 0.33, + 0.8, + 0.43, + 0.9, + 2.46, + 2.09, + 0.88, + 1.09, + 3.25, + 4.62 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 2.33, + 3.47, + 3.15, + 3.19, + 0.92, + 18.8, + 547.8 + ], + "d": [ + 1, + 1, + 1, + 2, + 2, + 4, + 1 + ], + "epsilon": [ + 1.283, + 0.6936, + 0.788, + 0.473, + 0.8577, + 0.271, + 0.948 + ], + "eta": [ + 0.963, + 1.977, + 1.917, + 2.307, + 2.546, + 3.28, + 14.6 + ], + "gamma": [ + 0.684, + 0.829, + 1.419, + 0.817, + 1.5, + 1.426, + 1.093 + ], + "n": [ + 0.017534618, + 0.33874242, + 0.22228777, + -0.23219062, + -0.09220694, + -0.47575718, + -0.017486824 + ], + "t": [ + 0.76, + 2.5, + 2.75, + 3.05, + 2.55, + 8.4, + 6.75 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.04409562, + "molar_mass_units": "kg/mol", + "p_max": 1000000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.0001720461815, + "ptriple_units": "Pa", + "reducing_state": { + "T": 369.89, + "T_units": "K", + "p": 4251200, + "p_units": "Pa", + "rhomolar": 5000.000000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 16625.78187096635, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 2.420412863780354e-07, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Propane" +} \ No newline at end of file diff --git a/dev/fluids/n-Undecane.json b/dev/fluids/n-Undecane.json new file mode 100644 index 00000000..a5fa2f82 --- /dev/null +++ b/dev/fluids/n-Undecane.json @@ -0,0 +1,250 @@ +{ + "ALIASES": [ + "Undecane", + "UNDECANE", + "N-UNDECANE", + "C11" + ], + "ANCILLARIES": { + "pL": { + "T_r": 638.8, + "Tmax": 638.7999999999989, + "Tmin": 247.541, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.009096211009274047, + "n": [ + -9.763587049588974, + 75.16493963299233, + -83.66843167165366, + 20.19196534644341, + -16.387755533243997, + -13.169821486724286 + ], + "reducing_value": 1990400.0, + "t": [ + 1.009, + 1.828, + 1.913, + 2.737, + 3.348, + 15.828 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 638.8, + "Tmax": 638.7999999999989, + "Tmin": 247.541, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.028665513140624377, + "n": [ + 0.8040569545010193, + -8.927688754737275, + 2.5684650093939636, + 0.2630553673389813, + -5.911470647893336, + -3.90418335245277 + ], + "reducing_value": 1990400.0, + "t": [ + 0.815, + 0.956, + 1.711, + 2.145, + 2.489, + 4.966 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 638.8, + "Tmax": 638.7999999999989, + "Tmin": 247.541, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.4206581686238886, + "n": [ + -0.2507776704326597, + 2.658034605719594, + 10.787268907367727, + -26.226638455433513, + 40.387200723053795, + -53.26173978894778 + ], + "reducing_value": 1514.9168636385564, + "t": [ + 0.168, + 0.347, + 3.361, + 4.368, + 6.495, + 9.941 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 638.8, + "Tmax": 638.7999999999989, + "Tmin": 247.541, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3607802959335715, + "n": [ + -0.01863953746670564, + -5.244844013064549, + -5.268565622296316, + -30.286979391565204, + 29.074334485348842, + 38.30739718468596 + ], + "reducing_value": 1514.9168636385564, + "t": [ + 0.114, + 0.502, + 2.414, + 6.87, + 7.716, + 17.382 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "1120-21-4", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Aleksandrov-TE-2011", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 247.541, + "Ttriple_units": "K", + "accentric": 0.5390371013718567, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0, + "a2": 0, + "type": "IdealGasHelmholtzLead" + }, + { + "a": -1, + "type": "IdealGasHelmholtzLogTau" + }, + { + "T0": 298.15, + "Tc": 638.8, + "c": [ + -1158848, + 20321.8, + -119.4274, + 0.4284215, + -0.0004157728, + 1.61828e-07 + ], + "t": [ + -2, + -1, + 0, + 1, + 2, + 3 + ], + "type": "IdealGasHelmholtzCP0PolyT" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 3, + 7, + 2, + 1, + 1, + 2, + 5, + 1, + 1, + 4, + 2 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 3 + ], + "n": [ + -0.66172706, + 1.3375396, + -2.5608399, + 0.1067891, + 0.00028873614, + 0.049587209, + 5.5407101e-08, + 0.99754712, + 1.5774025, + 0.0013108354, + -0.59326961, + -0.093001876, + -0.17960228, + -0.022560853 + ], + "t": [ + 1.5, + 0.25, + 1.25, + 0.25, + 0.875, + 1.375, + 0, + 2.375, + 2, + 2.125, + 3.5, + 6.5, + 4.75, + 12.5 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.15630826, + "molar_mass_units": "kg/mol", + "p_max": 500000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 0.4460559186, + "ptriple_units": "Pa", + "reducing_state": { + "T": 638.8, + "T_units": "K", + "p": 1990400, + "p_units": "Pa", + "rhomolar": 1514.916863638556, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 4962.061358602959, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0002167513070507905, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "n-Undecane" +} \ No newline at end of file diff --git a/dev/fluids/o-Xylene.json b/dev/fluids/o-Xylene.json new file mode 100644 index 00000000..e9ecbabd --- /dev/null +++ b/dev/fluids/o-Xylene.json @@ -0,0 +1,280 @@ +{ + "ALIASES": [ + "oXylene", + "o-xylene", + "O-XYLENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 630.259, + "Tmax": 630.258999999999, + "Tmin": 247.985, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03746133172735089, + "n": [ + -40.23194106786901, + 34.55252883118712, + -0.8596814216655824, + -3.137628550668386, + -0.7730882264500827, + -1.1362454591454407 + ], + "reducing_value": 3737500.0, + "t": [ + 1.111, + 1.156, + 1.998, + 3.199, + 5.528, + 7.601 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 630.259, + "Tmax": 630.258999999999, + "Tmin": 247.985, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.03944975490537406, + "n": [ + -8.892854416654904, + 2.889636735975203, + -4.545597673937891, + 4.948864373864568, + -33.03401570602496, + 33.5772554741618 + ], + "reducing_value": 3737500.0, + "t": [ + 1.027, + 1.366, + 3.242, + 6.238, + 8.766, + 9.965 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 630.259, + "Tmax": 630.258999999999, + "Tmin": 247.985, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.5196254660005506, + "n": [ + 0.08168792579534072, + 6.203503021781052, + -3.8477589500686986, + 4.572403149688544, + -31656.07188921996, + 32296.361131648908 + ], + "reducing_value": 2684.5000000000005, + "t": [ + 0.102, + 0.561, + 0.718, + 5.254, + 13.734, + 13.785 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 630.259, + "Tmax": 630.258999999999, + "Tmin": 247.985, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 1.3810529438713082, + "n": [ + -0.05612298788265898, + -1.1710766690915488, + -4.043955284669913, + -7.601531777020512, + 34.00048793856129, + -267.1634261051362 + ], + "reducing_value": 2684.5000000000005, + "t": [ + 0.041, + 0.47, + 0.602, + 3.963, + 9.65, + 15.203 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "95-47-6", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-JPCRD-2012", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 247.985, + "Ttriple_units": "K", + "accentric": 0.312, + "accentric_units": "-", + "alpha0": [ + { + "a1": 10.137376, + "a2": -0.91282993, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.748798, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 4.754892, + 6.915052, + 25.84813, + 10.93886 + ], + "t": [ + 0.3569960920827787, + 0.9948291099373432, + 2.738556688599449, + 7.83963418213782 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 5, + 1, + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0036765156, + -0.13918171, + 0.014104203, + 1.5398899, + -2.3600925, + -0.44359159, + 0.19596977, + -1.0909408, + -0.21890801, + 1.1179223, + -0.93563815, + -0.018102996 + ], + "t": [ + 1, + 0.6, + 0.91, + 0.3, + 0.895, + 1.167, + 0.435, + 2.766, + 3.8, + 1.31, + 3, + 0.77 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 2.442, + 1.342, + 3, + 450 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.552, + 0.728, + 0.498, + 0.894 + ], + "eta": [ + 1.1723, + 1.095, + 1.6166, + 20.4 + ], + "gamma": [ + 1.2655, + 0.3959, + 0.7789, + 1.162 + ], + "n": [ + 1.4172368, + -0.57134695, + -0.081944041, + -40.682878 + ], + "t": [ + 1.41, + 4.8, + 1.856, + 2 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.106165, + "molar_mass_units": "kg/mol", + "p_max": 70000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 22.80577639, + "ptriple_units": "Pa", + "reducing_state": { + "T": 630.259, + "T_units": "K", + "p": 3737500, + "p_units": "Pa", + "rhomolar": 2684.500000000001, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8647.212407085435, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.0110625353483808, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "o-Xylene" +} \ No newline at end of file diff --git a/dev/fluids/p-Xylene.json b/dev/fluids/p-Xylene.json new file mode 100644 index 00000000..28929679 --- /dev/null +++ b/dev/fluids/p-Xylene.json @@ -0,0 +1,280 @@ +{ + "ALIASES": [ + "pXylene", + "p-xylene", + "P-XYLENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 616.168, + "Tmax": 616.1679999999988, + "Tmin": 286.4, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.018225495845447526, + "n": [ + -9.878207210625316, + -7.74531501639431, + 11.727352138248827, + -3.624494325992903, + -3.512921513732143, + 56.69266520413931 + ], + "reducing_value": 3531500.0, + "t": [ + 1.036, + 1.227, + 1.257, + 2.906, + 7.04, + 15.693 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 616.168, + "Tmax": 616.1679999999988, + "Tmin": 286.4, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.01797164382182359, + "n": [ + -6.922693475136246, + -18.802630900264262, + 19.915248950746882, + -4.280178590137178, + 2.8220366354716795, + -4.222238595872705 + ], + "reducing_value": 3531500.0, + "t": [ + 1.005, + 1.232, + 1.271, + 2.955, + 4.359, + 5.234 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 616.168, + "Tmax": 616.1679999999988, + "Tmin": 286.4, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2129362347877306, + "n": [ + 0.056706544072533206, + 2.34587948519851, + 0.15533070291116807, + 26.985091589824126, + -1912.6053845039978, + 2496.549996560909 + ], + "reducing_value": 2693.92, + "t": [ + 0.097, + 0.41, + 0.617, + 6.974, + 11.02, + 11.7 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 616.168, + "Tmax": 616.1679999999988, + "Tmin": 286.4, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.36870096485427384, + "n": [ + -140.15017077353872, + 166.06393987589922, + -51.309204629695124, + 20.70756142612646, + -2.7902945630383784, + -2.9836742600472896 + ], + "reducing_value": 2693.92, + "t": [ + 0.395, + 0.408, + 0.546, + 0.651, + 2.515, + 3.948 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "106-42-3", + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Zhou-JPCRD-2012", + "T_max": 700, + "T_max_units": "K", + "Ttriple": 286.4, + "Ttriple_units": "K", + "accentric": 0.324, + "accentric_units": "-", + "alpha0": [ + { + "a1": 5.9815241, + "a2": -0.52477835, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 4.2430504, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 5.2291378, + 19.549862, + 16.656178, + 5.9390291 + ], + "t": [ + 0.6718946780748107, + 2.038405110294595, + 4.299152179275782, + 10.84282208748263 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 5, + 1, + 4, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 7 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 1, + 2, + 1 + ], + "n": [ + 0.0010786811, + -0.103161822, + 0.0421544125, + 1.47865376, + -2.4266, + -0.46575193, + 0.190290995, + -1.06376565, + -0.209934069, + 1.25159879, + -0.951328356, + -0.0269980032 + ], + "t": [ + 1, + 0.83, + 0.83, + 0.281, + 0.932, + 1.1, + 0.443, + 2.62, + 2.5, + 1.2, + 3, + 0.778 + ], + "type": "ResidualHelmholtzPower" + }, + { + "beta": [ + 2.445, + 1.483, + 4.971, + 413 + ], + "d": [ + 1, + 1, + 3, + 3 + ], + "epsilon": [ + 0.54944, + 0.7234, + 0.4926, + 0.8459 + ], + "eta": [ + 1.179, + 1.065, + 1.764, + 13.675 + ], + "gamma": [ + 1.267, + 0.4242, + 0.864, + 1.1465 + ], + "n": [ + 1.3710318, + -0.494160616, + -0.0724317468, + -3.69464746 + ], + "t": [ + 1.13, + 4.5, + 2.2, + 2 + ], + "type": "ResidualHelmholtzGaussian" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.106165, + "molar_mass_units": "kg/mol", + "p_max": 200000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 580.0850025, + "ptriple_units": "Pa", + "reducing_state": { + "T": 616.168, + "T_units": "K", + "p": 3531500, + "p_units": "Pa", + "rhomolar": 2693.92, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 8164.996595154399, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.2438612134796824, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "p-Xylene" +} \ No newline at end of file diff --git a/dev/fluids/trans-2-Butene.json b/dev/fluids/trans-2-Butene.json new file mode 100644 index 00000000..ad8fc6ea --- /dev/null +++ b/dev/fluids/trans-2-Butene.json @@ -0,0 +1,245 @@ +{ + "ALIASES": [ + "Trans-2-Butene", + "TRANS-2-BUTENE" + ], + "ANCILLARIES": { + "pL": { + "T_r": 428.61, + "Tmax": 428.60999999999893, + "Tmin": 167.6, + "description": "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.2049880396507886, + "n": [ + -0.02697376915863493, + -6.245788479207671, + -21.959477077005555, + 24.065860332295973, + 1.6305031975105153, + -27.489279853508943 + ], + "reducing_value": 4027300.0, + "t": [ + 0.318, + 0.981, + 5.585, + 6.385, + 9.241, + 12.62 + ], + "type": "pL", + "using_tau_r": true + }, + "pV": { + "T_r": 428.61, + "Tmax": 428.60999999999893, + "Tmin": 167.6, + "description": "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.20177588482968023, + "n": [ + -0.008641938102009184, + -6.741491214502838, + 1.5953056102326129, + -3.6687386884417528, + -12.58878880233942, + 81.94195408868505 + ], + "reducing_value": 4027300.0, + "t": [ + 0.166, + 0.996, + 1.861, + 3.171, + 13.469, + 19.684 + ], + "type": "pV", + "using_tau_r": true + }, + "rhoL": { + "T_r": 428.61, + "Tmax": 428.60999999999893, + "Tmin": 167.6, + "description": "rho' = rhoc*(1+sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.7571004391082714, + "n": [ + -0.0369377281462134, + 2.376898316062288, + 5.366934661033568, + -439.1416046445223, + 4838.585432319588, + -19854.73815702274 + ], + "reducing_value": 4213.0, + "t": [ + 0.164, + 0.372, + 4.422, + 10.565, + 14.651, + 19.157 + ], + "type": "rhoLnoexp", + "using_tau_r": false + }, + "rhoV": { + "T_r": 428.61, + "Tmax": 428.60999999999893, + "Tmin": 167.6, + "description": "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))", + "max_abserror_percentage": 0.3673242537580834, + "n": [ + -11.847750420878857, + 9.875166115230318, + -18.597606560563445, + 16.601983399575353, + -4.263122348267767, + -0.8330225303697664 + ], + "reducing_value": 4213.0, + "t": [ + 0.5, + 0.567, + 1.284, + 1.423, + 3.202, + 4.206 + ], + "type": "rhoV", + "using_tau_r": true + } + }, + "CAS": "624-64-6", + "ENVIRONMENTAL": { + "ASHRAE34": "UNKNOWN", + "FH": 4, + "GWP100": -1.0, + "GWP20": -1.0, + "GWP500": -1.0, + "HH": 0, + "Name": "trans-2-Butene", + "ODP": -1.0, + "PH": 1 + }, + "EOS": [ + { + "BibTeX_CP0": "", + "BibTeX_EOS": "Lemmon-FPE-2005", + "T_max": 525, + "T_max_units": "K", + "Ttriple": 167.6, + "Ttriple_units": "K", + "accentric": 0.21007683443616, + "accentric_units": "-", + "alpha0": [ + { + "a1": 0.5917816, + "a2": 2.1427758, + "type": "IdealGasHelmholtzLead" + }, + { + "a": 2.9988, + "type": "IdealGasHelmholtzLogTau" + }, + { + "n": [ + 5.3276, + 13.29, + 9.6745, + 0.40087 + ], + "t": [ + 0.8445906535078509, + 3.739996733627307, + 8.700216980471756, + 10.5620494155526 + ], + "type": "IdealGasHelmholtzPlanckEinstein" + } + ], + "alphar": [ + { + "d": [ + 1, + 1, + 1, + 2, + 3, + 7, + 2, + 5, + 1, + 4, + 3, + 4 + ], + "l": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3 + ], + "n": [ + 0.81107, + -2.8846, + 1.0265, + 0.016591, + 0.086511, + 0.00023256, + 0.22654, + -0.072182, + -0.24849, + -0.071374, + -0.024737, + 0.011843 + ], + "t": [ + 0.12, + 1.3, + 1.74, + 2.1, + 0.28, + 0.69, + 0.75, + 2, + 4.4, + 4.7, + 15, + 14 + ], + "type": "ResidualHelmholtzPower" + } + ], + "gas_constant": 8.314472, + "gas_constant_units": "J/mol/K", + "molar_mass": 0.05610631999999999, + "molar_mass_units": "kg/mol", + "p_max": 50000000, + "p_max_units": "Pa", + "pseudo_pure": false, + "ptriple": 74.8166908, + "ptriple_units": "Pa", + "reducing_state": { + "T": 428.61, + "T_units": "K", + "p": 4027300, + "p_units": "Pa", + "rhomolar": 4213, + "rhomolar_units": "mol/m^3" + }, + "rhoLtriple": 13140.73776925106, + "rhoLtriple_units": "mol/m^3", + "rhoVtriple": 0.05370865474193402, + "rhoVtriple_units": "mol/m^3" + } + ], + "NAME": "trans-2-Butene" +} \ No newline at end of file diff --git a/dev/generate_headers.py b/dev/generate_headers.py new file mode 100644 index 00000000..ab521900 --- /dev/null +++ b/dev/generate_headers.py @@ -0,0 +1,86 @@ +""" +In this module, we do some of the preparatory work that is needed to get +CoolProp ready to build. This includes setting the correct versions in the +headers, generating the fluid files, etc. +""" +from __future__ import division, print_function +from datetime import datetime +import subprocess +import os +import sys + +def version_to_file(root_dir): + print('*** Generating version.h ***') + # Get the version from the version.txt file + version = open(os.path.join(root_dir,'version.txt'),'r').read().strip() + + # Format the string to be written + string_for_file = '//Generated by the preprocess.py script on {t:s}\n\nstatic char version [] ="{v:s}";'.format(t = str(datetime.now()),v = version) + + # Include path relative to the root + include_dir = os.path.join(root_dir,'include') + + # The name of the file to be written into + file_name = os.path.join(include_dir,'version.h') + + # Write to file + f = open(file_name,'w') + f.write(string_for_file) + f.close() + +def gitrev_to_file(root_dir): + """ + If a git repo, use git to update the gitrevision. If not a git repo, read + the gitrevision from the gitrevision.txt file. Otherwise, fail. + """ + print('*** Generating gitrevision.h ***') + + try: + try: + subprocess.check_call('git --version', shell=True) + print('git is accessible at the command line') + except subprocess.CalledProcessError: + print('git was not found') + return + p = subprocess.Popen('git rev-parse HEAD', + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell = True) + stdout, stderr = p.communicate() + + # Include path relative to the root + include_dir = os.path.join(root_dir,'include') + + if p.returncode != 0: + print('tried to update git revision, but it failed for some reason (building from zip file?)') + gitstring = '//Generated by the preprocess.py script on {t:s}\n\n std::string gitrevision = \"???????\";' + f = open(os.path.join(include_dir,'gitrevision.h'),'w') + f.write(gitstring) + f.close() + return + else: + rev = stdout.strip() + print('git revision is', rev) + + gitstring = '//Generated by the preprocess.py script on {t:s}\n\nstd::string gitrevision = \"{rev:s}\";'.format(t = str(datetime.now()), rev = rev) + + try: + is_hash = rev.find(' ') == -1 # python 2.x + except TypeError: + is_hash = ' ' not in str(rev) # python 3.x + + if not is_hash: + raise ValueError('No hash returned from call to git, got '+rev+' instead') + + f = open(os.path.join(include_dir,'gitrevision.h'),'w') + f.write(gitstring) + f.close() + + except (subprocess.CalledProcessError,OSError): + pass + +if __name__=='__main__': + version_to_file(root_dir = '..') + gitrev_to_file(root_dir = '..') + import JSON_to_CPP + JSON_to_CPP.TO_CPP(root_dir = '..') \ No newline at end of file diff --git a/dev/genetic.py b/dev/genetic.py new file mode 100644 index 00000000..6b34e4ff --- /dev/null +++ b/dev/genetic.py @@ -0,0 +1,343 @@ +from __future__ import division + +import glob +import string +import random +import numpy as np +from scipy.odr import * +import json +import matplotlib.pyplot as plt +import CoolProp +import CoolProp.CoolProp as CP + +#LIBRARY = [i/6.0 for i in range(1,151)]+[0.35+i/2000 for i in range(1,100)]+[0.05+0.001*i for i in range(1,100)]+[i+0.5 for i in range(10)] +LIBRARY = [i/1000 for i in range(1,20000)] + +class Sample(object): + def __init__(self,v): + self.v = v + +class GeneticAncillaryFitter(object): + def __init__(self, + num_samples = 100, # Have this many chromos in the sample group + num_selected = 20, # Have this many chromos in the selected group + mutation_factor = 2, # Randomly mutate 1/n of the chromosomes + num_powers = 5, # How many powers in the fit + Ref = 'R407C', + value = 'rhoV', + addTr = True, + values = None, + Tlims = None + ): + self.num_samples = num_samples + self.num_selected = num_selected + self.mutation_factor = mutation_factor + self.num_powers = num_powers + self.addTr = addTr + self.value = value + self.Ref = Ref + + #Thermodynamics + from CoolProp.CoolProp import Props + + if values is None: + self.Tc = Props(Ref,'Tcrit') + self.pc = Props(Ref,'pcrit') + self.rhoc = Props(Ref,'rhocrit') + self.Tmin = Props(Ref,'Tmin') + if Tlims is None: + self.T = np.append(np.linspace(self.Tmin+1e-14, self.Tc-1,150), np.logspace(np.log10(self.Tc-1), np.log10(self.Tc)-1e-15,40)) + else: + self.T = np.linspace(Tlims[0],Tlims[1]) + self.pL = Props('P','T',self.T,'Q',0,Ref) + self.pV = Props('P','T',self.T,'Q',1,Ref) + self.rhoL = Props('D','T',self.T,'Q',0,Ref) + self.rhoV = Props('D','T',self.T,'Q',1,Ref) + else: + self.Tc = values['Tcrit'] + self.pc = values['pcrit'] + self.rhoc = values['rhocrit'] + self.Tmin = values['Tmin'] + self.T = values['T'] + self.p = values['p'] + self.rhoL = values['rhoL'] + self.rhoV = values['rhoV'] + + self.logpLpc = (np.log(self.pL)-np.log(self.pc)) + self.logpVpc = (np.log(self.pV)-np.log(self.pc)) + self.rhoLrhoc = np.array(self.rhoL)/self.rhoc + self.rhoVrhoc = np.array(self.rhoV)/self.rhoc + self.logrhoLrhoc = np.log(self.rhoL)-np.log(self.rhoc) + self.logrhoVrhoc = np.log(self.rhoV)-np.log(self.rhoc) + + self.x = 1.0-self.T/self.Tc + + MM = Props(Ref,'molemass') + self.T_r = self.Tc + + if self.value == 'pL': + self.LHS = self.logpLpc.copy() + self.EOS_value = self.pL.copy() + if self.addTr == False: + self.description = "p' = pc*exp(sum(n_i*theta^t_i))" + else: + self.description = "p' = pc*exp(Tc/T*sum(n_i*theta^t_i))" + self.reducing_value = self.pc*1000 + elif self.value == 'pV': + self.LHS = self.logpVpc.copy() + self.EOS_value = self.pV.copy() + if self.addTr == False: + self.description = "p'' = pc*exp(sum(n_i*theta^t_i))" + else: + self.description = "p'' = pc*exp(Tc/T*sum(n_i*theta^t_i))" + self.reducing_value = self.pc*1000 + elif self.value == 'rhoL': + self.LHS = self.logrhoLrhoc.copy() + self.EOS_value = self.rhoL + if self.addTr == False: + self.description = "rho' = rhoc*exp(sum(n_i*theta^t_i))" + else: + self.description = "rho' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))" + self.reducing_value = self.rhoc/MM*1000 + elif self.value == 'rhoV': + self.LHS = self.logrhoVrhoc.copy() + self.EOS_value = self.rhoV + if self.addTr == False: + self.description = "rho'' = rhoc*exp(sum(n_i*theta^t_i))" + else: + self.description = "rho'' = rhoc*exp(Tc/T*sum(n_i*theta^t_i))" + self.reducing_value = self.rhoc/MM*1000 + elif self.value == 'rhoLnoexp': + self.LHS = (self.rhoLrhoc-1).copy() + self.EOS_value = self.rhoL + self.description = "rho' = rhoc*(1+sum(n_i*theta^t_i))" + self.reducing_value = self.rhoc/MM*1000 + else: + raise ValueError + + if self.value == 'rhoLnoexp' and self.addTr: + raise ValueError('Invalid combination') + + if self.addTr: + self.LHS *= self.T/self.Tc + + def generate_random_chromosomes(self,): + ''' + Create a list of random chromosomes to seed our alogrithm. + ''' + chromos = [] + while len(chromos) < self.num_samples: + chromos.append(Sample(sorted(random.sample(LIBRARY,self.num_powers)))) + return chromos + + def fitness(self, chromo): + ''' + Fitness of a chromo is the sum of the squares of the error of the correlation + ''' + + # theta^t where the i-th row is equal to theta^t[i] + # We need these terms later on to build the A and b matrices + theta_t = (self.x.reshape(-1, 1)**chromo.v).T + + # TODO: more numpy broadcasting should speed this up even more + # Another few times faster ought to be possible + I = len(chromo.v) + A = np.zeros((I,I)) + b = np.zeros((I,1)) + for i in range(I): + for j in range(I): + A[i,j] = np.sum(theta_t[i]*theta_t[j]) + b[i] = np.sum(theta_t[i]*self.LHS) + + # If you end up with a singular matrix, quit this run + try: + n = np.linalg.solve(A, b).T + except np.linalg.linalg.LinAlgError as E: + chromo.fitness = 1e99 + return + + chromo.beta = n + RHS = np.sum(n * self.x.reshape(-1, 1)**chromo.v, axis = 1) + + if self.addTr: + RHS *= self.Tc/self.T + + if self.value in ['pL','pV']: + fit_value = np.exp(RHS)*self.pc + elif self.value in ['rhoL','rhoV']: + fit_value = np.exp(RHS)*self.rhoc + elif self.value == 'rhoLnoexp': + fit_value = self.rhoc*(1+RHS) + else: + raise ValueError + + max_abserror = np.max(np.abs((fit_value/self.EOS_value)-1)*100) + + chromo.fitness = max_abserror + chromo.fit_value = fit_value + chromo.max_abserror = max_abserror + + return chromo.fitness + + def tourny_select_chromo(self, samples): + ''' + Randomly select two chromosomes from the samples, then return the one + with the best fitness. + ''' + a = random.choice(samples) + b = random.choice(samples) + if a.fitness < b.fitness: + return a + else: + return b + + def breed(self, a, b): + ''' + Breed two chromosomes by splicing them in a random spot and combining + them together to form two new chromos. + ''' + splice_pos = random.randrange(len(a.v)) + new_a = a.v[:splice_pos] + b.v[splice_pos:] + new_b = b.v[:splice_pos] + a.v[splice_pos:] + return Sample(sorted(new_a)), Sample(sorted(new_b)) + + def mutate(self, chromo): + ''' + Mutate a chromosome by changing one of the parameters, but only if it improves the fitness + ''' + v = chromo.v + if hasattr(chromo,'fitness'): + old_fitness = chromo.fitness + else: + old_fitness = self.fitness(chromo) + + for i in range(10): + pos = random.randrange(len(chromo.v)) + chromo.v[pos] = random.choice(LIBRARY) + new_fitness = self.fitness(chromo) + if new_fitness < old_fitness: + return chromo + else: + return Sample(sorted(v)) + + def run(self): + # Create a random sample of chromos + samples = self.generate_random_chromosomes() + + # Calculate the fitness for the initial chromosomes + for chromo in samples: + self.fitness(chromo) +# print '#' + + decorated = [(sample.fitness,sample) for sample in samples] + decorated.sort() + samples = [s for sv,s in decorated] + values = [sv for sv,s in decorated] + plt.plot(values[0:len(values)//2]) + plt.close() + + # Main loop: each generation select a subset of the sample and breed from + # them. + generation = -1 + while generation < 0 or samples[0].fitness > 0.02 or (generation < 3 and generation < 15): + generation += 1 + + # Generate the selected group from sample- take the top 10% of samples + # and tourny select to generate the rest of selected. + ten_percent = int(len(samples)*.1) + selected = samples[:ten_percent] + while len(selected) < self.num_selected: + selected.append(self.tourny_select_chromo(samples)) + + # Generate the solution group by breeding random chromos from selected + solution = [] + while len(solution) < self.num_samples: + solution.extend(self.breed(random.choice(selected), + random.choice(selected))) + + # Apply a mutation to a subset of the solution set + mutate_indices = random.sample(range(len(solution)), len(solution)//self.mutation_factor) + for i in mutate_indices: + solution[i] = self.mutate(solution[i]) + + for chromo in solution: + self.fitness(chromo) +# print '#' + + decorated = [(sample.fitness,sample) for sample in solution] + decorated.sort() + samples = [s for sv,s in decorated] + +# print '------------------ Top 10 values ---------------' +# for sample in samples[0:10]: +# print sample.v, sample.fitness, sample.max_abserror + +# print '// Max error is ',samples[0].max_abserror,'% between',np.min(self.T),'and',np.max(self.T),'K' +# print str(samples[0].v), samples[0].beta.tolist() + + # Print useful stats about this generation + (min, median, max) = [samples[0].fitness, samples[len(samples)//2].fitness, samples[-1].fitness] +# print("{0} best value: {1}. fitness: best {2}, median {3}, worst {4}".format(generation, samples[0].v, min, median, max)) + + # If the string representations of all the chromosomes are the same, stop + if len(set([str(s.v) for s in samples[0:5]])) == 1: + break + + self.fitness(samples[0]) + + print self.value + print '// Max error is ',samples[0].max_abserror,'% between',np.min(self.T),'and',np.max(self.T),'K' +# print str(samples[0].v), samples[0].beta.tolist() + + j = dict() + j['n'] = samples[0].beta.squeeze().tolist() + j['t'] = samples[0].v + j['Tmin'] = np.min(self.T) + j['Tmax'] = np.max(self.T) + j['type'] = self.value + j['using_tau_r'] = self.addTr + j['reducing_value'] = self.reducing_value + j['T_r'] = self.Tc + + # Informational, not used + j['max_abserror_percentage'] = samples[0].max_abserror + j['description'] = self.description + + return j + +def build_ancillaries(name, **kwargs): + + j = dict() + j['ANCILLARIES'] = dict() + gaf = GeneticAncillaryFitter(Ref = name, value = 'pL', addTr = True, num_powers = 6, **kwargs) + j['ANCILLARIES']['pL'] = gaf.run() + gaf = GeneticAncillaryFitter(Ref = name, value = 'pV', addTr = True, num_powers = 6, **kwargs) + j['ANCILLARIES']['pV'] = gaf.run() + gaf = GeneticAncillaryFitter(Ref = name, value = 'rhoLnoexp', addTr = False, num_powers = 6, **kwargs) + j['ANCILLARIES']['rhoL'] = gaf.run() + gaf = GeneticAncillaryFitter(Ref = name, value = 'rhoV', addTr = True, num_powers = 6, **kwargs) + j['ANCILLARIES']['rhoV'] = gaf.run() + + fp = open(os.path.join('ancillaries',name+'_anc.json'),'w') + print >> fp, json.dumps(j, indent = 2) + fp.close() + +def build_all_ancillaries(): + for fluid in sorted(CoolProp.__fluids__): + print fluid + if fluid in ['SES36']: + build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-1]) + elif fluid == 'R507A': + build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-0.1]) + elif fluid == 'R407F': + build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-2]) + else: + build_ancillaries(fluid) + +if __name__ == "__main__": + +# fluid = 'R407F' +# build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-2]) + + build_all_ancillaries() +# inject_ancillaries() diff --git a/dev/inject_melting_curves.py b/dev/inject_melting_curves.py new file mode 100644 index 00000000..723a9ebd --- /dev/null +++ b/dev/inject_melting_curves.py @@ -0,0 +1,245 @@ +Simon_curves = { + "n-Propane" : { + "T_0" : 85.3, "a" : 7.180e8, "c" : 1.283, "p_0" : 0.0, "T_max" : 168.63, "BibTeX" : "Reeves-JCP-1964" + }, + "n-Pentane" : { + "T_0" : 143.5, "a" : 6.600e8, "c" : 1.649, "p_0" : 0.0, "T_max" : 156.2, "BibTeX" : "Reeves-JCP-1964" + }, + "Isopentane" : { + "T_0" : 112.5, "a" : 5.916e8, "c" : 1.563, "p_0" : 0, "T_max" : 212.16, "BibTeX" : "Reeves-JCP-1964" + }, + "Propylene" : [ + { + "T_0" : 86.0, "a" : 3.196e8, "c" : 2.821, "p_0" : 0, "T_min": 86.0, "T_max" : 129, "BibTeX" : "Reeves-JCP-1964" + }, + { + "T_0" : 109.6, "a" : 3.064e8, "c" : 3.871, "p_0" : 4.450e8, "T_min": 129, "T_max" : 145.3, "BibTeX" : "Reeves-JCP-1964" + } + ], + "Cyclohexane" : { + "T_0" : 279.7, "a" : 383.4e6, "c" : 1.41, "p_0" : 0, "T_max" : 401.7, "BibTeX" : "Penoncello-IJT-1995" + }, + "Krypton" : { + "T_0" : 1, "a" : 109479.2307, "c" : 1.6169841, "p_0" : -237497645.7, "T_max" : 168.7, "BibTeX" : "Michels-PHYSICA-1962" + }, + "Xenon" : { + "T_0" : 1, "a" : 80890.5544859, "c" : 1.5891650, "p_0" : -260932309.446, "T_max" : 366.4, "BibTeX" : "Michels-PHYSICA-1962" + }, + "CarbonMonoxide" : { + "T_0" : 1, "a" : 19560.8, "c" : 2.10747, "p_0" : -142921439.2, "T_max" : 87.5, "BibTeX" : "Barreiros-JCT-1982" + }, + "Oxygen": { + "T_0" : 1, "a" : 227606.348, "c" : 1.769, "p_0" : -266999247.652, "T_max" : 63.1, "BibTeX" : "Younglove-NIST-1982" + }, + "ParaHydrogen": [ + { + "T_0" : 1, "a" : 125746.643, "c" : 1.955, "p_0" : -21155737.752, "T_min" : 13.8033, "T_max" : 22, "BibTeX" : "Younglove-NIST-1982" + }, + { + "T_0" : 1, "a" : 248578.596, "c" : 1.764739, "p_0" : -26280332.904, "T_min" : 22, "T_max" : 164.5, "BibTeX" : "Younglove-NIST-1982" + } + ] +} + +polynomial_in_Tr = { + "Argon" : { + "T_t" : 83.8058, "a" : [-7476.2665, 9959.0613], "t" : [1.05,1.275], "p_t" : 68891, "T_max" : 254.0, "BibTeX" : "Tegeler-JPCRD-1999" + }, + "Fluorine" : { + "T_t" : 53.4811, "a" : [988043.478261], "t" : [2.1845], "p_t" : 252, "T_max" : 55.4, "BibTeX" : "deReuck-BOOK-1990" + }, + "Nitrogen" : { + "T_t" : 63.151, "a" : [12798.61], "t" : [1.78963], "p_t" : 12523, "T_max" : 283.8, "BibTeX" : "Span-JPCRD-2000" + }, + "Ethane" : { + "T_t" : 90.368, "a" : [2.23626315e8, 1.05262374e8], "t" : [1.0, 2.55], "p_t" : 1.14, "T_max" : 110.2, "BibTeX" : "Buecker-JCRD-2006" + }, + "Isobutane" : { + "T_t" : 113.73, "a" : [1.9536371309e9], "t" : [6.12], "p_t" : 0.0219, "T_max" : 124.9, "BibTeX" : "Buecker-JPCRD-2006B" + }, + "Ethylene" : [ + { + "T_t" : 103.989, "a" : [2947001.84], "t" : [2.045], "p_t" : 122.65, "T_min" : 103.989, "T_max" : 110.369, "BibTeX" : "Smukala-JPCRD-2000" + }, + { + "T_t" : 110.369, "a" : [6.82693421], "t" : [1.089], "p_t" : 46.8e6, "T_min" : 110.369, "T_max" : 188, "BibTeX" : "Smukala-JPCRD-2000" + } + ], + "n-Butane" : { + "T_t" : 134.895, "a" : [5.585582364e8], "t" : [2.206], "p_t" : 0.653, "T_max" : 163.9, "BibTeX" : "Buecker-JPCRD-2006B" + } +} + +polynomial_in_theta = { + "Methanol" : { + "T_t" : 175.61, "a" : [5.330770e9, 4.524780e9, 3.888861e10], "t" : [1, 1.5, 4], "p_t" : 0.187, "T_max" : 245.9, "BibTeX" : "deReuck-BOOK-1993" + }, + "CarbonDioxide" : { + "T_t" : 216.592, "a" : [1955.5390, 2055.4593], "t" : [1, 2], "p_t" : 517950, "T_max" : 327.6, "BibTeX" : "Span-JPCRD-1996" + } +} + +import json, numpy as np, matplotlib.pyplot as plt, pandas + +ip = 1 +irho = 1 +Nrow,Ncol = 5,5 + +figp = plt.figure(figsize = (20,20)) +figrho = plt.figure(figsize = (20,20)) + +def plot_rho(T, rho, fit = False): + x, y = (T-T[0])/(T[len(T)-1]-T[0]), (rho-rho[0])/(rho[len(rho)-1]-rho[0]) + + c = np.polyfit(x, y, 3) + yfit = np.polyval(c, x) + err = yfit - y + rms = np.sqrt(np.mean(np.power(err,2))) + + rhofit = yfit*(rho[len(rho)-1]-rho[0])+rho[0] + if fit: + return T, (rhofit/rho-1)*100 + else: + return x, y + +def simon(): + global ip, irho + + for fluid, values in Simon_curves.iteritems(): + axp = figp.add_subplot(Nrow, Ncol, ip); ip += 1 + axrho = figrho.add_subplot(Nrow, Ncol, irho); irho += 1 + axp.set_xlabel('T [K]') + axp.set_ylabel('p [Pa]') + axrho.set_xlabel('T [K]') + axrho.set_ylabel('rho [mol/m$^3$]') + axp.set_title(fluid) + axrho.set_title(fluid) + + if not isinstance(values, list): + values = [values] + df = pandas.read_csv('melting_curves/'+fluid+'.mlt',names=['T','p','rho']) + axp.plot(df['T'], df['p'], 'o', mfc='none') + x,y = plot_rho(df['T'],df['rho'],fit = True) + axrho.plot(x,y, 'o', mfc='none') + else: + for i in ['I','II']: + df = pandas.read_csv('melting_curves/'+fluid+'-'+i+'.mlt',names=['T','p','rho']) + axp.plot(df['T'], df['p'], 'o', mfc='none') + x,y = plot_rho(df['T'],df['rho'],fit = True) + axrho.plot(x,y, 'o', mfc='none') + + for i,value in enumerate(values): + Tmin = value.get('T_min',min(df['T'])) + Tmax = value['T_max'] + + T = np.linspace(Tmin, Tmax, 200) + T_0 = value['T_0'] + p_0 = value['p_0'] + a = value['a'] + c = value['c'] + + p = p_0 + a*((T/T_0)**c - 1) + + axp.plot(T, p) + +def Tr(): + global ip, irho + for fluid, values in polynomial_in_Tr.iteritems(): + + axp = figp.add_subplot(Nrow, Ncol, ip); ip += 1 + axrho = figrho.add_subplot(Nrow, Ncol, irho); irho += 1 + axp.set_xlabel('T [K]') + axp.set_ylabel('p [Pa]') + axrho.set_xlabel('T [K]') + axrho.set_ylabel('rho [mol/m$^3$]') + axp.set_title(fluid) + axrho.set_title(fluid) + + if fluid == 'Ethylene': + T = [104.003, 104.059, 104.13, 104.2, 104.27, 104.41, 104.55, 104.69, 104.83, 104.969, 105.108, 105.386, 106.077, 106.764, 107.446, 111.384, 119.283, 127.136, 158.146, 188.621] + p = np.array([0.1, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 50, 75, 100, 200, 300])*1e6 + + axp.plot(T,p,'*') + + if not isinstance(values, list): + values = [values] + df = pandas.read_csv('melting_curves/'+fluid+'.mlt',names=['T','p','rho']) + axp.plot(df['T'], df['p'], 'o', mfc='none') + x,y = plot_rho(df['T'],df['rho'],fit = True) + axrho.plot(x,y, 'o', mfc='none') + + else: + for i in ['I','II']: + df = pandas.read_csv('melting_curves/'+fluid+'-'+i+'.mlt',names=['T','p','rho']) + axp.plot(df['T'], df['p'], 'o', mfc='none') + x,y = plot_rho(df['T'],df['rho'],fit = True) + axrho.plot(x,y, 'o', mfc='none') + + for i,value in enumerate(values): + Tmin = value.get('T_min',min(df['T'])) + Tmax = value['T_max'] + T = np.linspace(Tmin, Tmax, 200) + + a = value['a'] + t = value['t'] + T_t = value['T_t'] + p_t = value['p_t'] + + RHS = 0 + for i in range(len(a)): + RHS += a[i]*((T/T_t)**t[i] - 1) + + p = p_t*(RHS + 1) + + axp.plot(T, p) + + +def theta(): + global ip, irho + for fluid, value in polynomial_in_theta.iteritems(): + + axp = figp.add_subplot(Nrow, Ncol, ip); ip += 1 + axrho = figrho.add_subplot(Nrow, Ncol, irho); irho += 1 + axp.set_xlabel('T [K]') + axp.set_ylabel('p [Pa]') + axrho.set_xlabel('T [K]') + axrho.set_ylabel('rho [mol/m$^3$]') + axp.set_title(fluid) + axrho.set_title(fluid) + + a = value['a'] + t = value['t'] + T_t = value['T_t'] + p_t = value['p_t'] + + Tmin = T_t + Tmax = value['T_max'] + T = np.linspace(Tmin, Tmax, 200) + + RHS = 0 + for i in range(len(a)): + RHS += a[i]*(T/T_t - 1)**t[i] + + p = p_t*(RHS + 1) + + df = pandas.read_csv('melting_curves/' + fluid + '.mlt', names=['T','p','rho']) + + axp.plot(df['T'], df['p'], 'o', mfc='none') + + axp.plot(T, p) + + x,y = plot_rho(df['T'],df['rho'],fit = True) + axrho.plot(x,y, 'o', mfc='none') + +if __name__=='__main__': + simon() + Tr() + theta() + + figp.tight_layout() + figrho.tight_layout() + + figp.savefig('p.pdf') + figrho.savefig('rho.pdf') + + plt.close() \ No newline at end of file diff --git a/dev/mixtures/JSON_to_C++.py b/dev/mixtures/JSON_to_C++.py new file mode 100644 index 00000000..d9b30a2c --- /dev/null +++ b/dev/mixtures/JSON_to_C++.py @@ -0,0 +1,32 @@ +import json as pyjson + +values = [ + ('mixture_excess_term.json','../../CoolProp/mixture_excess_JSON.h','mixture_excess_JSON'), + ('mixture_reducing_parameters.json','../../CoolProp/mixture_reducing_JSON.h','mixture_reducing_JSON') +] + +for infile,outfile,variable in values: + # Check you haven't messed up the JSON file and it will still load + pyjson.loads(open(infile,'r').read()) + + json = open(infile,'r').read() + + # Escape all existing quotations + json = json.replace('"','\\"') + + # Split into lines + json = json.split('\n') + + # Add " to beginning and end of every line and end line with comma + for i,line in enumerate(json): + json[i] = '"'+line+'",' + + # Back together + json = '\n'.join(json) + + # Header/footer + json = '// File generated by the script dev/mixtures/JSON_to_C++.py\n\n// C array of std::string lines\nstd::string '+variable+'_c_lines[] = {"",\n' + json + '};'+'\n\n// Combined into a single std::string \nstd::vector '+variable+'_lines('+variable+'_c_lines, '+variable+'_c_lines + sizeof('+variable+'_c_lines) / sizeof(std::string)); \n\nstd::string '+variable+' = strjoin('+variable+'_lines,"");' + + f = open(outfile,'w') + + print>>f, json \ No newline at end of file diff --git a/dev/mixtures/KunzWagner2012_TableA6.txt b/dev/mixtures/KunzWagner2012_TableA6.txt new file mode 100644 index 00000000..29f5ec54 --- /dev/null +++ b/dev/mixtures/KunzWagner2012_TableA6.txt @@ -0,0 +1,15 @@ +Methane/Nitrogen 1.0 +Methane/CarbonDioxide 1.0 +Methane/Ethane 1.0 +Methane/Propane 1.0 +Methane/n-Butane 1.0 +Methane/Isobutane 0.771035405688 +Methane/Hydrogen 1.0 +Nitrogen/CarbonDioxide 1.0 +Nitrogen/Ethane 1.0 +Ethane/Propane 0.130424765150 +Ethane/n-Butane 0.281570073085 +Ethane/Isobutane 0.260632376098 +Propane/n-Butane 0.312572600489e-1 +Propane/Isobutane -0.551609771024e-1 +n-Butane/Isobutane -0.551240293009e-1 \ No newline at end of file diff --git a/dev/mixtures/KunzWagner2012_TableA7.txt b/dev/mixtures/KunzWagner2012_TableA7.txt new file mode 100644 index 00000000..9bd9dfde --- /dev/null +++ b/dev/mixtures/KunzWagner2012_TableA7.txt @@ -0,0 +1,162 @@ +Methane/Nitrogen +1 1 0.000 -0.98038985517335e-2 +2 4 1.850 0.42487270143005e-3 +3 1 7.850 -0.34800214576142e-1 1.000 0.5 1.000 0.5 +4 2 5.400 -0.13333813013896 1.000 0.5 1.000 0.5 +5 2 0.000 -0.11993694974627e-1 0.250 0.5 2.500 0.5 +6 2 0.750 0.69243379775168e-1 0.000 0.5 3.000 0.5 +7 2 2.800 -0.31022508148249 0.000 0.5 3.000 0.5 +8 2 4.450 0.24495491753226 0.000 0.5 3.000 0.5 +9 3 4.250 0.22369816716981 0.000 0.5 3.000 0.5 + +Methane/CarbonDioxide +1 1 2.600 -0.10859387354942 +2 2 1.950 0.80228576727389e-1 +3 3 0.000 -0.93303985115717e-2 +4 1 3.950 0.40989274005848e-1 1.000 0.5 1.000 0.5 +5 2 7.950 -0.24338019772494 0.500 0.5 2.000 0.5 +6 3 8.000 0.23855347281124 0.000 0.5 3.000 0.5 + +Methane/Ethane +1 3 0.650 -0.80926050298746e-3 +2 4 1.550 -0.75381925080059e-3 +3 1 3.100 -0.41618768891219e-1 1.000 0.5 1.000 0.5 +4 2 5.900 -0.23452173681569 1.000 0.5 1.000 0.5 +5 2 7.050 0.14003840584586 1.000 0.5 1.000 0.5 +6 2 3.350 0.63281744807738e-1 0.875 0.5 1.250 0.5 +7 2 1.200 -0.34660425848809e-1 0.750 0.5 1.500 0.5 +8 2 5.800 -0.23918747334251 0.500 0.5 2.000 0.5 +9 2 2.700 0.19855255066891e-2 0.000 0.5 3.000 0.5 +10 3 0.450 0.61777746171555e1 0.000 0.5 3.000 0.5 +11 3 0.550 -0.69575358271105e1 0.000 0.5 3.000 0.5 +12 3 1.950 0.10630185306388e1 0.000 0.5 3.000 0.5 + +Methane/Propane +1 3 1.850 0.13746429958576e-1 +2 3 3.950 -0.74425012129552e-2 +3 4 0.000 -0.45516600213685e-2 +4 4 1.850 -0.54546603350237e-2 +5 4 3.850 0.23682016824471e-2 +6 1 5.250 0.18007763721438 0.250 0.5 0.750 0.5 +7 1 3.850 -0.44773942932486 0.250 0.5 1.000 0.5 +8 1 0.200 0.19327374888200e-1 0.000 0.5 2.000 0.5 +9 2 6.500 -0.30632197804624 0.000 0.5 3.000 0.5 + +Nitrogen/Carbon Dioxide +1 2 1.850 0.28661625028399 +2 3 1.400 -0.10919833861247 +3 1 3.200 -0.11374032082270e1 0.250 0.5 0.750 0.5 +4 1 2.500 0.76580544237358 0.250 0.5 1.000 0.5 +5 1 8.000 0.42638000926819e-2 0.000 0.5 2.000 0.5 +6 2 3.750 0.17673538204534 0.000 0.5 3.000 0.5 + +Nitrogen/Ethane +1 2 0.000 -0.47376518126608 +2 2 0.050 0.48961193461001 +3 3 0.000 -0.57011062090535e-2 +4 1 3.650 -0.19966820041320 1.000 0.5 1.000 0.5 +5 2 4.900 -0.69411103101723 1.000 0.5 1.000 0.5 +6 2 4.450 0.69226192739021 0.875 0.5 1.250 0.5 + +Methane/Hydrogen +1 1 2.000 -0.25157134971934 +2 3 -1.000 -0.62203841111983e-2 +3 3 1.750 0.88850315184396e-1 +4 4 1.400 -0.35592212573239e-1 + +Methane/n-Butane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Methane/Isobutane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Ethane/Propane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Ethane/n-Butane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Ethane/Isobutane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Propane/n-Butane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +Propane/Isobutane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + +n-Butane/Isobutane +1 1 1.000 0.25574776844118e1 +2 1 1.550 -0.79846357136353e1 +3 1 1.700 0.47859131465806e1 +4 2 0.250 -0.73265392369587 +5 2 1.350 0.13805471345312e1 +6 3 0.000 0.28349603476365 +7 3 1.250 -0.49087385940425 +8 4 0.000 -0.10291888921447 +9 4 0.700 0.11836314681968 +10 4 5.400 0.55527385721943e-4 + diff --git a/dev/mixtures/KunzWagner2012_TableA8.txt b/dev/mixtures/KunzWagner2012_TableA8.txt new file mode 100644 index 00000000..cb83d527 --- /dev/null +++ b/dev/mixtures/KunzWagner2012_TableA8.txt @@ -0,0 +1,210 @@ +CH4-N2 0.998721377 1.013950311 0.998098830 0.979273013 +CH4-CO2 0.999518072 1.002806594 1.022624490 0.975665369 +CH4-C2H6 0.997547866 1.006617867 0.996336508 1.049707697 +CH4-C3H8 1.004827070 1.038470657 0.989680305 1.098655531 +CH4-nC4H10 0.979105972 1.045375122 0.994174910 1.171607691 +CH4-iC4H10 1.011240388 1.054319053 0.980315756 1.161117729 +CH4-nC5H12 0.948330120 1.124508039 0.992127525 1.249173968 +CH4-iC5H12 1.0 1.343685343 1.0 1.188899743 +CH4-nC6H14 0.958015294 1.052643846 0.981844797 1.330570181 +CH4-nC7H16 0.962050831 1.156655935 0.977431529 1.379850328 +CH4-nC8H18 0.994740603 1.116549372 0.957473785 1.449245409 +CH4-nC9H20 1.002852287 1.141895355 0.947716769 1.528532478 +CH4-nC10H22 1.033086292 1.146089637 0.937777823 1.568231489 +CH4-H2 1.0 1.018702573 1.0 1.352643115 +CH4-O2 1.0 1.0 1.0 0.950000000 +CH4-CO 0.997340772 1.006102927 0.987411732 0.987473033 +CH4-H2O 1.012783169 1.585018334 1.063333913 0.775810513 +CH4-H2S 1.012599087 1.040161207 1.011090031 0.961155729 +CH4-He 1.0 0.881405683 1.0 3.159776855 +CH4-Ar 1.034630259 1.014678542 0.990954281 0.989843388 +N2-CO2 0.977794634 1.047578256 1.005894529 1.107654104 +N2-C2H6 0.978880168 1.042352891 1.007671428 1.098650964 +N2-C3H8 0.974424681 1.081025408 1.002677329 1.201264026 +N2-nC4H10 0.996082610 1.146949309 0.994515234 1.304886838 +N2-iC4H10 0.986415830 1.100576129 0.992868130 1.284462634 +N2-nC5H12 1.0 1.078877166 1.0 1.419029041 +N2-iC5H12 1.0 1.154135439 1.0 1.381770770 +N2-nC6H14 1.0 1.195952177 1.0 1.472607971 +N2-nC7H16 1.0 1.404554090 1.0 1.520975334 +N2-nC8H18 1.0 1.186067025 1.0 1.733280051 +N2-nC9H20 1.0 1.100405929 0.956379450 1.749119996 +N2-nC10H22 1.0 1.0 0.957934447 1.822157123 +N2-H2 0.972532065 0.970115357 0.946134337 1.175696583 +N2-CO 1.0 1.008690943 1.0 0.993425388 +N2-H2O 1.0 1.094749685 1.0 0.968808467 +N2-O2 0.999521770 0.997082328 0.997190589 0.995157044 +N2-H2S 0.910394249 1.256844157 1.004692366 0.960174200 +N2-He 0.969501055 0.932629867 0.692868765 1.471831580 +N2-Ar 1.004166412 1.002212182 0.999069843 0.990034831 +CO2-C2H6 1.002525718 1.032876701 1.013871147 0.900949530 +CO2-C3H8 0.996898004 1.047596298 1.033620538 0.908772477 +CO2-nC4H10 1.174760923 1.222437324 1.018171004 0.911498231 +CO2-iC4H10 1.076551882 1.081909003 1.023339824 0.929982936 +CO2-nC5H12 1.024311498 1.068406078 1.027000795 0.979217302 +CO2-iC5H12 1.060793104 1.116793198 1.019180957 0.961218039 +CO2-nC6H14 1.0 0.851343711 1.0 1.038675574 +CO2-nC7H16 1.205469976 1.164585914 1.011806317 1.046169823 +CO2-nC8H18 1.026169373 1.104043935 1.029690780 1.074455386 +CO2-nC9H20 1.0 0.973386152 1.007688620 1.140671202 +CO2-nC10H22 1.000151132 1.183394668 1.020028790 1.145512213 +CO2-H2 0.904142159 1.152792550 0.942320195 1.782924792 +CO2-O2 1.0 1.0 1.0 1.0 +CO2-CO 1.0 1.0 1.0 1.0 +CO2-H2O 0.949055959 1.542328793 0.997372205 0.775453996 +CO2-H2S 0.906630564 1.024085837 1.016034583 0.926018880 +CO2-He 0.846647561 0.864141549 0.768377630 3.207456948 +CO2-Ar 1.008392428 1.029205465 0.996512863 1.050971635 +C2H6-C3H8 0.997607277 1.003034720 0.996199694 1.014730190 +C2H6-nC4H10 0.999157205 1.006179146 0.999130554 1.034832749 +C2H6-iC4H10 1.0 1.006616886 1.0 1.033283811 +C2H6-nC5H12 0.993851009 1.026085655 0.998688946 1.066665676 +C2H6-iC5H12 a 1.0 1.045439935 1.0 1.021150247 +C2H6-nC6H14 1.0 1.169701102 1.0 1.092177796 +C2H6-nC7H16 1.0 1.057666085 1.0 1.134532014 +C2H6-nC8H18 1.007469726 1.071917985 0.984068272 1.168636194 +C2H6-nC9H20 a 1.0 1.143534730 1.0 1.056033030 +C2H6-nC10H22 0.995676258 1.098361281 0.970918061 1.237191558 +C2H6-H2 0.925367171 1.106072040 0.932969831 1.902008495 +C2H6-O2 1.0 1.0 1.0 1.0 +C2H6-CO 1.0 1.201417898 1.0 1.069224728 +C2H6-H2O 1.0 1.0 1.0 1.0 +C2H6-H2S 1.010817909 1.030988277 0.990197354 0.902736660 +C2H6-He 1.0 1.0 1.0 1.0 +C2H6-Ar 1.0 1.0 1.0 1.0 +C3H8-nC4H10 0.999795868 1.003264179 1.000310289 1.007392782 +C3H8-iC4H10 0.999243146 1.001156119 0.998012298 1.005250774 +C3H8-nC5H12 1.044919431 1.019921513 0.996484021 1.008344412 +C3H8-iC5H12 1.040459289 0.999432118 0.994364425 1.003269500 +C3H8-nC6H14 1.0 1.057872566 1.0 1.025657518 +C3H8-nC7H16 1.0 1.079648053 1.0 1.050044169 +C3H8-nC8H18 1.0 1.102764612 1.0 1.063694129 +C3H8-nC9H20 1.0 1.199769134 1.0 1.109973833 +C3H8-nC10H22 0.984104227 1.053040574 0.985331233 1.140905252 +C3H8-H2 1.0 1.074006110 1.0 2.308215191 +C3H8-O2 1.0 1.0 1.0 1.0 +C3H8-CO 1.0 1.108143673 1.0 1.197564208 +C3H8-H2O 1.0 1.011759763 1.0 0.600340961 +C3H8-H2S 0.936811219 1.010593999 0.992573556 0.905829247 +C3H8-He 1.0 1.0 1.0 1.0 +C3H8-Ar 1.0 1.0 1.0 1.0 +nC4H10-iC4H10 1.000880464 1.000414440 1.000077547 1.001432824 +nC4H10-nC5H12 1.0 1.018159650 1.0 1.002143640 +nC4H10-iC5H12 a 1.0 1.002728434 1.0 1.000792201 +nC4H10-nC6H14 1.0 1.034995284 1.0 1.009157060 +nC4H10-nC7H16 1.0 1.019174227 1.0 1.021283378 +nC4H10-nC8H18 1.0 1.046905515 1.0 1.033180106 +nC4H10-nC9H20 a 1.0 1.049219137 1.0 1.014096448 +nC4H10-nC10H22 0.976951968 1.027845529 0.993688386 1.076466918 +nC4H10-H2 1.0 1.232939523 1.0 2.509259945 +nC4H10-O2 1.0 1.0 1.0 1.0 +nC4H10-CO a 1.0 1.084740904 1.0 1.173916162 +nC4H10-H2O 1.0 1.223638763 1.0 0.615512682 +nC4H10-H2S 0.908113163 1.033366041 0.985962886 0.926156602 +nC4H10-He 1.0 1.0 1.0 1.0 +nC4H10-Ar 1.0 1.214638734 1.0 1.245039498 +iC4H10-nC5H12 a 1.0 1.002779804 1.0 1.002495889 +iC4H10-iC5H12 a 1.0 1.002284353 1.0 1.001835788 +iC4H10-nC6H14 a 1.0 1.010493989 1.0 1.006018054 +iC4H10-nC7H16 a 1.0 1.021668316 1.0 1.009885760 +iC4H10-nC8H18 a 1.0 1.032807063 1.0 1.013945424 +iC4H10-nC9H20 a 1.0 1.047298475 1.0 1.017817492 +iC4H10-nC10H22 a 1.0 1.060243344 1.0 1.021624748 +iC4H10-H2 a 1.0 1.147595688 1.0 1.895305393 +iC4H10-O2 1.0 1.0 1.0 1.0 +iC4H10-CO a 1.0 1.087272232 1.0 1.161390082 +iC4H10-H2O 1.0 1.0 1.0 1.0 +iC4H10-H2S 1.012994431 0.988591117 0.974550548 0.937130844 +iC4H10-He 1.0 1.0 1.0 1.0 +iC4H10-Ar 1.0 1.0 1.0 1.0 +nC5H12-iC5H12 a 1.0 1.000024335 1.0 1.000050537 +nC5H12-nC6H14 a 1.0 1.002480637 1.0 1.000761237 +nC5H12-nC7H16 a 1.0 1.008972412 1.0 1.002441051 +nC5H12-nC8H18 1.0 1.069223964 1.0 1.016422347 +nC5H12-nC9H20 1.0 1.034910633 1.0 1.103421755 +nC5H12-nC10H22 1.0 1.016370338 1.0 1.049035838 +nC5H12-H2 a 1.0 1.188334783 1.0 2.013859174 +nC5H12-O2 1.0 1.0 1.0 1.0 +nC5H12-CO a 1.0 1.119954454 1.0 1.206043295 +nC5H12-H2O 1.0 0.956677310 1.0 0.447666011 +nC5H12-H2S 0.984613203 1.076539234 0.962006651 0.959065662 +nC5H12-He 1.0 1.0 1.0 1.0 +nC5H12-Ar 1.0 1.0 1.0 1.0 +iC5H12-nC6H14 a 1.0 1.002995876 1.0 1.001204174 +iC5H12-nC7H16 a 1.0 1.009928206 1.0 1.003194615 +iC5H12-nC8H18 a 1.0 1.017880545 1.0 1.005647480 +iC5H12-nC9H20 a 1.0 1.028994325 1.0 1.008191499 +iC5H12-nC10H22 a 1.0 1.039372957 1.0 1.010825138 +iC5H12-H2 a 1.0 1.184340443 1.0 1.996386669 +iC5H12-O2 1.0 1.0 1.0 1.0 +iC5H12-CO a 1.0 1.116694577 1.0 1.199326059 +iC5H12-H2O 1.0 1.0 1.0 1.0 +iC5H12-H2S 1.0 0.835763343 1.0 0.982651529 +iC5H12-He 1.0 1.0 1.0 1.0 +iC5H12-Ar 1.0 1.0 1.0 1.0 +nC6H14-nC7H16 1.0 1.001508227 1.0 0.999762786 +nC6H14-nC8H18 a 1.0 1.006268954 1.0 1.001633952 +nC6H14-nC9H20 1.0 1.020761680 1.0 1.055369591 +nC6H14-nC10H22 1.001516371 1.013511439 0.997641010 1.028939539 +nC6H14-H2 1.0 1.243461678 1.0 3.021197546 +nC6H14-O2 1.0 1.0 1.0 1.0 +nC6H14-CO a 1.0 1.155145836 1.0 1.233272781 +nC6H14-H2O 1.0 1.170217596 1.0 0.569681333 +nC6H14-H2S 0.754473958 1.339283552 0.985891113 0.956075596 +nC6H14-He 1.0 1.0 1.0 1.0 +nC6H14-Ar 1.0 1.0 1.0 1.0 +nC7H16-nC8H18 1.0 1.006767176 1.0 0.998793111 +nC7H16-nC9H20 1.0 1.001370076 1.0 1.001150096 +nC7H16-nC10H22 1.0 1.002972346 1.0 1.002229938 +nC7H16-H2 1.0 1.159131722 1.0 3.169143057 +nC7H16-O2 1.0 1.0 1.0 1.0 +nC7H16-CO a 1.0 1.190354273 1.0 1.256123503 +nC7H16-H2O 1.0 1.0 1.0 1.0 +nC7H16-H2S 0.828967164 1.087956749 0.988937417 1.013453092 +nC7H16-He 1.0 1.0 1.0 1.0 +nC7H16-Ar 1.0 1.0 1.0 1.0 +nC8H18-nC9H20 a 1.0 1.001357085 1.0 1.000235044 +nC8H18-nC10H22 1.0 1.002553544 1.0 1.007186267 +nC8H18-H2 a 1.0 1.305249405 1.0 2.191555216 +nC8H18-O2 1.0 1.0 1.0 1.0 +nC8H18-CO a 1.0 1.219206702 1.0 1.276565536 +nC8H18-H2O 1.0 0.599484191 1.0 0.662072469 +nC8H18-H2S 1.0 1.0 1.0 1.0 +nC8H18-He 1.0 1.0 1.0 1.0 +nC8H18-Ar 1.0 1.0 1.0 1.0 +nC9H20-nC10H22 a 1.0 1.000810520 1.0 1.000182392 +nC9H20-H2 a 1.0 1.342647661 1.0 2.234354040 +nC9H20-O2 1.0 1.0 1.0 1.0 +nC9H20-CO a 1.0 1.252151449 1.0 1.294070556 +nC9H20-H2O 1.0 1.0 1.0 1.0 +nC9H20-H2S 1.0 1.082905109 1.0 1.086557826 +nC9H20-He 1.0 1.0 1.0 1.0 +nC9H20-Ar 1.0 1.0 1.0 1.0 +nC10H22-H2 1.695358382 1.120233729 1.064818089 3.786003724 +nC10H22-O2 1.0 1.0 1.0 1.0 +nC10H22-CO 1.0 0.870184960 1.049594632 1.803567587 +nC10H22-H2O 1.0 0.551405318 0.897162268 0.740416402 +nC10H22-H2S 0.975187766 1.171714677 0.973091413 1.103693489 +nC10H22-He 1.0 1.0 1.0 1.0 +nC10H22-Ar 1.0 1.0 1.0 1.0 +H2-O2 1.0 1.0 1.0 1.0 +H2-CO 1.0 1.121416201 1.0 1.377504607 +H2-H2O 1.0 1.0 1.0 1.0 +H2-H2S 1.0 1.0 1.0 1.0 +H2-He 1.0 1.0 1.0 1.0 +H2-Ar 1.0 1.0 1.0 1.0 +O2-CO 1.0 1.0 1.0 1.0 +O2-H2O 1.0 1.143174289 1.0 0.964767932 +O2-H2S 1.0 1.0 1.0 1.0 +O2-He 1.0 1.0 1.0 1.0 +O2-Ar 0.999746847 0.993907223 1.000023103 0.990430423 +CO-H2O 1.0 1.0 1.0 1.0 +CO-H2S 0.795660392 1.101731308 1.025536736 1.022749748 +CO-He 1.0 1.0 1.0 1.0 +CO-Ar 1.0 1.159720623 1.0 0.954215746 +H2O-H2S 1.0 1.014832832 1.0 0.940587083 +H2O-He 1.0 1.0 1.0 1.0 +H2O-Ar 1.0 1.038993495 1.0 1.070941866 +H2S-He 1.0 1.0 1.0 1.0 +H2S-Ar 1.0 1.0 1.0 1.0 +He-Ar 1.0 1.0 1.0 1.0 \ No newline at end of file diff --git a/dev/mixtures/TableA7_to_JSON.py b/dev/mixtures/TableA7_to_JSON.py new file mode 100644 index 00000000..f5b01699 --- /dev/null +++ b/dev/mixtures/TableA7_to_JSON.py @@ -0,0 +1,63 @@ +from CoolProp.CoolProp import get_fluid_param_string + +lines = open('KunzWagner2012_TableA7.txt','r').read() + +template = """{{"Name1" : "{Name1:s}", +"Name2" : "{Name2:s}", +"CAS1" : "{CAS1:s}", +"CAS2" : "{CAS2:s}", +"d" : {d:s}, +"t" : {t:s}, +"n" : {n:s}, +"eta" : {eta:s}, +"epsilon" : {epsilon:s}, +"beta": {beta:s}, +"gamma": {gamma:s} +}},""" + +chunks = lines.split('\n\n') + +for chunk in chunks: + lines = chunk.split('\n') + + D,T,N,ETA,EPSILON,BETA,GAMMA = [0],[0],[0],[0],[0],[0],[0] + names = lines.pop(0) + + for line in lines: + vals = line.strip().split(' ') + + if len(vals) == 4: + i, d, t, n = vals + eta = 0 + epsilon = 0 + beta = 0 + gamma = 0 + else: + i, d, t, n, eta, epsilon, beta, gamma = vals + + D.append(int(d)) + T.append(float(t)) + N.append(float(n)) + ETA.append(float(eta)) + EPSILON.append(float(epsilon)) + BETA.append(float(beta)) + GAMMA.append(float(gamma)) + + name1,name2 = names.split('/') + + CAS1 = get_fluid_param_string(name1,'CAS') + CAS2 = get_fluid_param_string(name2,'CAS') + + print template.format(Name1 = name1, + Name2 = name2, + CAS1 = CAS1, + CAS2 = CAS2, + d = str(D), + t = str(T), + n = str(N), + eta = str(ETA), + epsilon= str(EPSILON), + beta = str(BETA), + gamma = str(GAMMA) + ) + \ No newline at end of file diff --git a/dev/mixtures/TableA8_to_JSON.py b/dev/mixtures/TableA8_to_JSON.py new file mode 100644 index 00000000..899d0f6b --- /dev/null +++ b/dev/mixtures/TableA8_to_JSON.py @@ -0,0 +1,79 @@ +from CoolProp.CoolProp import get_fluid_param_string + +# Map from chemical formula to name +name_map = {'CH4':'Methane', + 'N2': 'Nitrogen', + 'O2': 'Oxygen', + 'CO2': 'CarbonDioxide', + 'CO': 'CarbonMonoxide', + 'H2S': 'HydrogenSulfide', + 'H2': 'Hydrogen', + 'H2O': 'Water', + 'He': 'Helium', + 'Ar': 'Argon', + 'C2H6': 'Ethane', + 'C3H8': 'Propane', + 'nC4H10': 'n-Butane', + 'iC4H10': 'IsoButane', + 'nC5H12': 'n-Pentane', + 'iC5H12': 'Isopentane', + 'nC6H14': 'n-Hexane', + 'nC7H16': 'n-Heptane', + 'nC8H18': 'n-Octane', + 'nC9H20': 'n-Nonane', + 'nC10H22': 'n-Decane', + } + +F_factors = {} +lines = open('KunzWagner2012_TableA6.txt','r').readlines() +for line in lines: + names,F = line.strip().split(' ') + name1,name2 = names.split('/') + CAS1 = get_fluid_param_string(name1,'CAS') + CAS2 = get_fluid_param_string(name2,'CAS') + F_factors[(CAS1,CAS2)] = F + F_factors[(CAS2,CAS1)] = F + +lines = open('KunzWagner2012_TableA8.txt','r').readlines() + +template = """{{"Name1" : "{Name1:s}", +"Name2" : "{Name2:s}", +"CAS1" : "{CAS1:s}", +"CAS2" : "{CAS2:s}", +"betaV" : {betaV:s}, +"gammaV" : {gammaV:s}, +"betaT" : {betaT:s}, +"gammaT" : {gammaT:s}, +"F" : {F:s} +}},""" + +for line in lines: + vals = line.strip().split(' ') + + if len(vals) == 6: + names, a, betav,gammav,betaT,gammaT = vals + else: + names, betav,gammav,betaT,gammaT = vals + + name1,name2 = names.split('-') + name1 = name_map[name1] + name2 = name_map[name2] + + CAS1 = get_fluid_param_string(name1,'CAS') + CAS2 = get_fluid_param_string(name2,'CAS') + + if (CAS1,CAS2) in F_factors: + F = F_factors[(CAS1,CAS2)] + else: + F = '0.0' + + print template.format(Name1 = name1, + Name2 = name2, + CAS1 = CAS1, + CAS2 = CAS2, + betaV = betav, + gammaV = gammav, + betaT = betaT, + gammaT = gammaT, + F = F) + \ No newline at end of file diff --git a/dev/mixtures/mixture_excess_term.json b/dev/mixtures/mixture_excess_term.json new file mode 100644 index 00000000..7a61ba5f --- /dev/null +++ b/dev/mixtures/mixture_excess_term.json @@ -0,0 +1,197 @@ +[ +{ + "Type" : "MultipleFluids", + "BibTeX" : "Lemmon-JPCRD-2004", + "Model" : "Lemmon-JPCRD-2004", + "Coeffs" : [{"Name1" : "R32", + "Name2" : "R125", + "CAS1" : "75-10-5", + "CAS2" : "354-33-6", + "n" : [0.0,-0.0072955, 0.078035, 0.61007, 0.64246, 0.014965, -0.34049, 0.085658, -0.064429], + "t" : [0.0,4.5, 0.57, 1.9, 1.2, 0.5, 2.6, 11.4, 4.5], + "d" : [0.0, 2, 5, 1, 3, 9, 2, 3, 6], + "l" : [0.0, 1, 1, 2, 2, 2, 3, 3, 3] + }, + {"Name1" : "R32", + "Name2" : "R134a", + "CAS1" : "75-10-5", + "CAS2" : "811-97-2", + "n" : [0.0,0.22909, 0.094074, 0.00039876, 0.021113], + "t" : [0.0,1.9, 0.25, 0.07, 2.0], + "d" : [0.0, 1, 3, 8, 1], + "l" : [0.0, 1, 1, 1, 2] + }, + {"Name1" : ["R125", "R125", "R134a", "R134a"], + "Name2" : ["R134a", "R143a", "R143a", "R152A"], + "CAS1" : ["354-33-6", "354-33-6", "811-97-2", "811-97-2"], + "CAS2" : ["811-97-2", "420-46-2", "420-46-2", "75-37-6"], + "n" : [0.0,-0.013073, 0.018259,0.0000081299,0.0078496], + "t" : [0.0,7.4, 0.35, 10.0, 5.3], + "d" : [0.0, 1, 3, 11, 2], + "l" : [0.0, 1, 1, 3, 2] + } + ] +} +, +{ + "Type" : "MultipleFluids", + "BibTeX" : "Lemmon-JPCRD-2000", + "Model" : "Lemmon-JPCRD-2000", + "Coeffs" : [ + {"Name1" : ["Nitrogen", "Nitrogen", "Argon"], + "Name2" : ["Argon", "Oxygen", "Oxygen"], + "CAS1" : ["7727-37-9", "7727-37-9", "7440-37-1"], + "CAS2" : ["7440-37-1", "7782-44-7", "7782-44-7"], + "N" : [0.0, -0.00195245, 0.00871334], + "t" : [0, -1.4, 1.5], + "d" : [0, 2, 2] + } + ] +} +, +{ + "Type" : "MultipleFluids", + "BibTeX" : "Kunz-JCED-2012", + "Model" : "Kunz-JCED-2012", + "Coeffs" : [ + {"note" : "Binary specific departure function", + "Name1" : "Methane", + "Name2" : "Nitrogen", + "CAS1" : "74-82-8", + "CAS2" : "7727-37-9", + "F" : 1.0, + "Npower" : 2, + "d" : [1, 4, 1, 2, 2, 2, 2, 2, 3], + "t" : [0.0, 1.85, 7.85, 5.4, 0.0, 0.75, 2.8, 4.45, 4.25], + "n" : [-0.0098038985517335, 0.00042487270143005, -0.034800214576142, -0.13333813013896, -0.011993694974627, 0.069243379775168, -0.31022508148249, 0.24495491753226, 0.22369816716981], + "eta" : [0.0, 0.0, 1.0, 1.0, 0.25, 0.0, 0.0, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 1.0, 1.0, 2.5, 3.0, 3.0, 3.0, 3.0], + "gamma": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] + }, + {"note" : "Binary specific departure function", + "Name1" : "Methane", + "Name2" : "CarbonDioxide", + "CAS1" : "74-82-8", + "CAS2" : "124-38-9", + "F" : 1.0, + "Npower" : 3, + "d" : [1, 2, 3, 1, 2, 3], + "t" : [2.6, 1.95, 0.0, 3.95, 7.95, 8.0], + "n" : [-0.10859387354942, 0.080228576727389, -0.0093303985115717, 0.040989274005848, -0.24338019772494, 0.23855347281124], + "eta" : [0.0, 0.0, 0.0, 1.0, 0.5, 0.0], + "epsilon" : [0.0, 0.0, 0.0, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 0.0, 1.0, 2.0, 3.0], + "gamma": [0.0, 0.0, 0.0, 0.5, 0.5, 0.5] + }, + {"note" : "Binary specific departure function", + "Name1" : "Methane", + "Name2" : "Ethane", + "CAS1" : "74-82-8", + "CAS2" : "74-84-0", + "F" : 1.0, + "Npower" : 2, + "d" : [3, 4, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3], + "t" : [0.65, 1.55, 3.1, 5.9, 7.05, 3.35, 1.2, 5.8, 2.7, 0.45, 0.55, 1.95], + "n" : [-0.00080926050298746, -0.00075381925080059, -0.041618768891219, -0.23452173681569, 0.14003840584586, 0.063281744807738, -0.034660425848809, -0.23918747334251, 0.0019855255066891, 6.1777746171555, -6.9575358271105, 1.0630185306388], + "eta" : [0.0, 0.0, 1.0, 1.0, 1.0, 0.875, 0.75, 0.5, 0.0, 0.0, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 1.0, 1.0, 1.0, 1.25, 1.5, 2.0, 3.0, 3.0, 3.0, 3.0], + "gamma": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] + }, + {"note" : "Binary specific departure function", + "Name1" : "Methane", + "Name2" : "Propane", + "CAS1" : "74-82-8", + "CAS2" : "74-98-6", + "F" : 1.0, + "Npower" : 5, + "d" : [3, 3, 4, 4, 4, 1, 1, 1, 2], + "t" : [1.85, 3.95, 0.0, 1.85, 3.85, 5.25, 3.85, 0.2, 6.5], + "n" : [0.013746429958576, -0.0074425012129552, -0.0045516600213685, -0.0054546603350237, 0.0023682016824471, 0.18007763721438, -0.44773942932486, 0.0193273748882, -0.30632197804624], + "eta" : [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 1.0, 2.0, 3.0], + "gamma": [0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] + }, + {"note" : "Binary specific departure function", + "Name1" : "Nitrogen", + "Name2" : "CarbonDioxide", + "CAS1" : "7727-37-9", + "CAS2" : "124-38-9", + "F" : 1.0, + "Npower" : 2, + "d" : [2, 3, 1, 1, 1, 2], + "t" : [1.85, 1.4, 3.2, 2.5, 8.0, 3.75], + "n" : [0.28661625028399, -0.10919833861247, -1.137403208227, 0.76580544237358, 0.0042638000926819, 0.17673538204534], + "eta" : [0.0, 0.0, 0.25, 0.25, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 0.75, 1.0, 2.0, 3.0], + "gamma": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5] + }, + {"note" : "Binary specific departure function", + "Name1" : "Nitrogen", + "Name2" : "Ethane", + "CAS1" : "7727-37-9", + "CAS2" : "74-84-0", + "F" : 1.0, + "Npower" : 3, + "d" : [2, 2, 3, 1, 2, 2], + "t" : [0.0, 0.05, 0.0, 3.65, 4.9, 4.45], + "n" : [-0.47376518126608, 0.48961193461001, -0.0057011062090535, -0.1996682004132, -0.69411103101723, 0.69226192739021], + "eta" : [0.0, 0.0, 0.0, 1.0, 1.0, 0.875], + "epsilon" : [0.0, 0.0, 0.0, 0.5, 0.5, 0.5], + "beta": [0.0, 0.0, 0.0, 1.0, 1.0, 1.25], + "gamma": [0.0, 0.0, 0.0, 0.5, 0.5, 0.5] + }, + { + "note" : "Binary specific departure function", + "Name1" : "Methane", + "Name2" : "Hydrogen", + "CAS1" : "74-82-8", + "CAS2" : "1333-74-0", + "F" : 1.0, + "Npower" : 4, + "d" : [1, 3, 3, 4], + "t" : [2.0, -1.0, 1.75, 1.4], + "n" : [-0.25157134971934, -0.0062203841111983, 0.088850315184396, -0.035592212573239], + "eta" : [0.0, 0.0, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.0, 0.0], + "beta": [0.0, 0.0, 0.0, 0.0], + "gamma": [0.0, 0.0, 0.0, 0.0] + }, + { + "note" : "Generalized departure function for important alkanes", + "Name1" : ["Methane","Methane","Ethane","Ethane","Ethane","Propane","Propane","n-Butane"], + "Name2" : ["n-Butane","Isobutane","Propane","n-Butane","Isobutane","n-Butane","Isobutane","Isobutane"], + "CAS1" : ["74-82-8","74-82-8","74-84-0","74-84-0", "74-84-0","74-98-6","74-98-6","106-97-8"], + "CAS2" : ["106-97-8","75-28-5","74-98-6","106-97-8", "75-28-5","106-97-8", "75-28-5","75-28-5"], + "F" : [1.0, 0.771035405688, 0.130424765150, 0.281570073085, 0.260632376098, 0.312572600489e-1,-0.551609771024e-1,-0.551240293009e-1], + "Npower" : 10, + "d" : [1, 1, 1, 2, 2, 3, 3, 4, 4, 4], + "t" : [1.0, 1.55, 1.7, 0.25, 1.35, 0.0, 1.25, 0.0, 0.7, 5.4], + "n" : [2.5574776844118, -7.9846357136353, 4.7859131465806, -0.73265392369587, 1.3805471345312, 0.28349603476365, -0.49087385940425, -0.10291888921447, 0.11836314681968, 5.5527385721943e-05], + "eta" : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "epsilon" : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "beta": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "gamma": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + } + ] +} +, +{ + "Type" : "MultipleFluids", + "BibTeX" : "", + "Model" : "Lemmon-JPCRD-2004", + "Coeffs" : [{"Name1" : "Ethanol", + "Name2" : "Water", + "CAS1" : "64-17-5", + "CAS2" : "7732-18-5", + "n" : [0.0, 1.09765e+00, 1.94679e+00, -2.16809e+00, -1.37077e-01, 4.86690e-02, 1.04024e+00], + "t" : [0.0, 0.26, 7.3, 5.3, 2.3, 0.7, 3.3], + "d" : [0.0, 2, 3, 5, 5, 7, 6], + "l" : [0.0, 1, 2, 2, 1, 1, 2] + } + ] +} +] \ No newline at end of file diff --git a/dev/mixtures/mixture_reducing_parameters.json b/dev/mixtures/mixture_reducing_parameters.json new file mode 100644 index 00000000..8a51aaad --- /dev/null +++ b/dev/mixtures/mixture_reducing_parameters.json @@ -0,0 +1,2210 @@ +[ +{ + "Type" : "MultipleFluids", + "BibTeX" : "Lemmon-JPCRD-2004", + "Model" : "Lemmon-JPCRD-2004", + "Coeffs" : [{"Name1" : "R32", + "Name2" : "R125", + "CAS1" : "75-10-5", + "CAS2" : "354-33-6", + "xi" : 28.95, + "zeta" : -6.008e-6, + "F" : 1.0 + }, + {"Name1" : "R32", + "Name2" : "R134a", + "CAS1" : "75-10-5", + "CAS2" : "811-97-2", + "xi" : 7.909, + "zeta" : -2.039e-6, + "F" : 1.0 + }, + {"Name1" : "R125", + "Name2" : "R134a", + "CAS1" : "354-33-6", + "CAS2" : "811-97-2", + "xi" : -0.4326, + "zeta" : -0.3453e-6, + "F" : 1.0 + }, + {"Name1" : "R125", + "Name2" : "R143a", + "CAS1" : "354-33-6", + "CAS2" : "420-46-2", + "xi" : 5.551, + "zeta" : -0.4452e-6, + "F" : 1.1697 + }, + {"Name1" : "R134a", + "Name2" : "R143a", + "CAS1" : "811-97-2", + "CAS2" : "420-46-2", + "xi" : 2.324, + "zeta" : 0.6182e-6, + "F" : 0.5557 + }, + {"Name1" : "R134a", + "Name2" : "R152a", + "CAS1" : "811-97-2", + "CAS2" : "75-37-6", + "xi" : 4.202, + "zeta" : 4.223e-6, + "F" : 2.0 + } + ] +} +, +{ + "Type" : "MultipleFluids", + "BibTeX" : "Lemmon-JPCRD-2000", + "Model" : "Lemmon-JPCRD-2000", + "Coeffs" : [{"Name1" : "Nitrogen", + "Name2" : "Argon", + "CAS1" : "7727-37-9", + "CAS2" : "7440-37-1", + "xi" : -1.237713, + "zeta" : -0.76031e-6, + "F" : 1.121527 + }, + {"Name1" : "Nitrogen", + "Name2" : "Oxygen", + "CAS1" : "7727-37-9", + "CAS2" : "7782-44-7", + "xi" : -0.856350, + "zeta" : -0.41847e-6, + "F" : 1.0 + }, + {"Name1" : "Argon", + "Name2" : "Oxygen", + "CAS1" : "7440-37-1", + "CAS2" : "7782-44-7", + "xi" : -2.115126, + "zeta" : -0.41232e-6, + "F" : 0.597203 + } + ] +}, +{ + "Type" : "MultipleFluids", + "BibTeX" : "Kunz-JCED-2012", + "Model" : "Kunz-JCED-2012", + "Coeffs" : [ + {"Name1" : "Methane", + "Name2" : "Nitrogen", + "CAS1" : "74-82-8", + "CAS2" : "7727-37-9", + "betaV" : 0.998721377, + "gammaV" : 1.013950311, + "betaT" : 0.998098830, + "gammaT" : 0.979273013, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "CarbonDioxide", + "CAS1" : "74-82-8", + "CAS2" : "124-38-9", + "betaV" : 0.999518072, + "gammaV" : 1.002806594, + "betaT" : 1.022624490, + "gammaT" : 0.975665369, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "Ethane", + "CAS1" : "74-82-8", + "CAS2" : "74-84-0", + "betaV" : 0.997547866, + "gammaV" : 1.006617867, + "betaT" : 0.996336508, + "gammaT" : 1.049707697, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "Propane", + "CAS1" : "74-82-8", + "CAS2" : "74-98-6", + "betaV" : 1.004827070, + "gammaV" : 1.038470657, + "betaT" : 0.989680305, + "gammaT" : 1.098655531, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "n-Butane", + "CAS1" : "74-82-8", + "CAS2" : "106-97-8", + "betaV" : 0.979105972, + "gammaV" : 1.045375122, + "betaT" : 0.994174910, + "gammaT" : 1.171607691, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "IsoButane", + "CAS1" : "74-82-8", + "CAS2" : "75-28-5", + "betaV" : 1.011240388, + "gammaV" : 1.054319053, + "betaT" : 0.980315756, + "gammaT" : 1.161117729, + "F" : 0.771035405688 + }, + {"Name1" : "Methane", + "Name2" : "n-Pentane", + "CAS1" : "74-82-8", + "CAS2" : "109-66-0", + "betaV" : 0.948330120, + "gammaV" : 1.124508039, + "betaT" : 0.992127525, + "gammaT" : 1.249173968, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "Isopentane", + "CAS1" : "74-82-8", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.343685343, + "betaT" : 1.0, + "gammaT" : 1.188899743, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "n-Hexane", + "CAS1" : "74-82-8", + "CAS2" : "110-54-3", + "betaV" : 0.958015294, + "gammaV" : 1.052643846, + "betaT" : 0.981844797, + "gammaT" : 1.330570181, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "n-Heptane", + "CAS1" : "74-82-8", + "CAS2" : "142-82-5", + "betaV" : 0.962050831, + "gammaV" : 1.156655935, + "betaT" : 0.977431529, + "gammaT" : 1.379850328, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "n-Octane", + "CAS1" : "74-82-8", + "CAS2" : "111-65-9", + "betaV" : 0.994740603, + "gammaV" : 1.116549372, + "betaT" : 0.957473785, + "gammaT" : 1.449245409, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "n-Nonane", + "CAS1" : "74-82-8", + "CAS2" : "111-84-2", + "betaV" : 1.002852287, + "gammaV" : 1.141895355, + "betaT" : 0.947716769, + "gammaT" : 1.528532478, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "n-Decane", + "CAS1" : "74-82-8", + "CAS2" : "124-18-5", + "betaV" : 1.033086292, + "gammaV" : 1.146089637, + "betaT" : 0.937777823, + "gammaT" : 1.568231489, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "Hydrogen", + "CAS1" : "74-82-8", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.018702573, + "betaT" : 1.0, + "gammaT" : 1.352643115, + "F" : 1.0 + }, + {"Name1" : "Methane", + "Name2" : "Oxygen", + "CAS1" : "74-82-8", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 0.950000000, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "CarbonMonoxide", + "CAS1" : "74-82-8", + "CAS2" : "630-08-0", + "betaV" : 0.997340772, + "gammaV" : 1.006102927, + "betaT" : 0.987411732, + "gammaT" : 0.987473033, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "Water", + "CAS1" : "74-82-8", + "CAS2" : "7732-18-5", + "betaV" : 1.012783169, + "gammaV" : 1.585018334, + "betaT" : 1.063333913, + "gammaT" : 0.775810513, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "HydrogenSulfide", + "CAS1" : "74-82-8", + "CAS2" : "7783-06-4", + "betaV" : 1.012599087, + "gammaV" : 1.040161207, + "betaT" : 1.011090031, + "gammaT" : 0.961155729, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "Helium", + "CAS1" : "74-82-8", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 0.881405683, + "betaT" : 1.0, + "gammaT" : 3.159776855, + "F" : 0 + }, + {"Name1" : "Methane", + "Name2" : "Argon", + "CAS1" : "74-82-8", + "CAS2" : "7440-37-1", + "betaV" : 1.034630259, + "gammaV" : 1.014678542, + "betaT" : 0.990954281, + "gammaT" : 0.989843388, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "CarbonDioxide", + "CAS1" : "7727-37-9", + "CAS2" : "124-38-9", + "betaV" : 0.977794634, + "gammaV" : 1.047578256, + "betaT" : 1.005894529, + "gammaT" : 1.107654104, + "F" : 1.0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Ethane", + "CAS1" : "7727-37-9", + "CAS2" : "74-84-0", + "betaV" : 0.978880168, + "gammaV" : 1.042352891, + "betaT" : 1.007671428, + "gammaT" : 1.098650964, + "F" : 1.0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Propane", + "CAS1" : "7727-37-9", + "CAS2" : "74-98-6", + "betaV" : 0.974424681, + "gammaV" : 1.081025408, + "betaT" : 1.002677329, + "gammaT" : 1.201264026, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Butane", + "CAS1" : "7727-37-9", + "CAS2" : "106-97-8", + "betaV" : 0.996082610, + "gammaV" : 1.146949309, + "betaT" : 0.994515234, + "gammaT" : 1.304886838, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "IsoButane", + "CAS1" : "7727-37-9", + "CAS2" : "75-28-5", + "betaV" : 0.986415830, + "gammaV" : 1.100576129, + "betaT" : 0.992868130, + "gammaT" : 1.284462634, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Pentane", + "CAS1" : "7727-37-9", + "CAS2" : "109-66-0", + "betaV" : 1.0, + "gammaV" : 1.078877166, + "betaT" : 1.0, + "gammaT" : 1.419029041, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Isopentane", + "CAS1" : "7727-37-9", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.154135439, + "betaT" : 1.0, + "gammaT" : 1.381770770, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Hexane", + "CAS1" : "7727-37-9", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.195952177, + "betaT" : 1.0, + "gammaT" : 1.472607971, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Heptane", + "CAS1" : "7727-37-9", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.404554090, + "betaT" : 1.0, + "gammaT" : 1.520975334, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Octane", + "CAS1" : "7727-37-9", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.186067025, + "betaT" : 1.0, + "gammaT" : 1.733280051, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Nonane", + "CAS1" : "7727-37-9", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.100405929, + "betaT" : 0.956379450, + "gammaT" : 1.749119996, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "n-Decane", + "CAS1" : "7727-37-9", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 0.957934447, + "gammaT" : 1.822157123, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Hydrogen", + "CAS1" : "7727-37-9", + "CAS2" : "1333-74-0", + "betaV" : 0.972532065, + "gammaV" : 0.970115357, + "betaT" : 0.946134337, + "gammaT" : 1.175696583, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "CarbonMonoxide", + "CAS1" : "7727-37-9", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.008690943, + "betaT" : 1.0, + "gammaT" : 0.993425388, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Water", + "CAS1" : "7727-37-9", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.094749685, + "betaT" : 1.0, + "gammaT" : 0.968808467, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Oxygen", + "CAS1" : "7727-37-9", + "CAS2" : "7782-44-7", + "betaV" : 0.999521770, + "gammaV" : 0.997082328, + "betaT" : 0.997190589, + "gammaT" : 0.995157044, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "HydrogenSulfide", + "CAS1" : "7727-37-9", + "CAS2" : "7783-06-4", + "betaV" : 0.910394249, + "gammaV" : 1.256844157, + "betaT" : 1.004692366, + "gammaT" : 0.960174200, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Helium", + "CAS1" : "7727-37-9", + "CAS2" : "7440-59-7", + "betaV" : 0.969501055, + "gammaV" : 0.932629867, + "betaT" : 0.692868765, + "gammaT" : 1.471831580, + "F" : 0 + }, + {"Name1" : "Nitrogen", + "Name2" : "Argon", + "CAS1" : "7727-37-9", + "CAS2" : "7440-37-1", + "betaV" : 1.004166412, + "gammaV" : 1.002212182, + "betaT" : 0.999069843, + "gammaT" : 0.990034831, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Ethane", + "CAS1" : "124-38-9", + "CAS2" : "74-84-0", + "betaV" : 1.002525718, + "gammaV" : 1.032876701, + "betaT" : 1.013871147, + "gammaT" : 0.900949530, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Propane", + "CAS1" : "124-38-9", + "CAS2" : "74-98-6", + "betaV" : 0.996898004, + "gammaV" : 1.047596298, + "betaT" : 1.033620538, + "gammaT" : 0.908772477, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Butane", + "CAS1" : "124-38-9", + "CAS2" : "106-97-8", + "betaV" : 1.174760923, + "gammaV" : 1.222437324, + "betaT" : 1.018171004, + "gammaT" : 0.911498231, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "IsoButane", + "CAS1" : "124-38-9", + "CAS2" : "75-28-5", + "betaV" : 1.076551882, + "gammaV" : 1.081909003, + "betaT" : 1.023339824, + "gammaT" : 0.929982936, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Pentane", + "CAS1" : "124-38-9", + "CAS2" : "109-66-0", + "betaV" : 1.024311498, + "gammaV" : 1.068406078, + "betaT" : 1.027000795, + "gammaT" : 0.979217302, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Isopentane", + "CAS1" : "124-38-9", + "CAS2" : "78-78-4", + "betaV" : 1.060793104, + "gammaV" : 1.116793198, + "betaT" : 1.019180957, + "gammaT" : 0.961218039, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Hexane", + "CAS1" : "124-38-9", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 0.851343711, + "betaT" : 1.0, + "gammaT" : 1.038675574, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Heptane", + "CAS1" : "124-38-9", + "CAS2" : "142-82-5", + "betaV" : 1.205469976, + "gammaV" : 1.164585914, + "betaT" : 1.011806317, + "gammaT" : 1.046169823, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Octane", + "CAS1" : "124-38-9", + "CAS2" : "111-65-9", + "betaV" : 1.026169373, + "gammaV" : 1.104043935, + "betaT" : 1.029690780, + "gammaT" : 1.074455386, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Nonane", + "CAS1" : "124-38-9", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 0.973386152, + "betaT" : 1.007688620, + "gammaT" : 1.140671202, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "n-Decane", + "CAS1" : "124-38-9", + "CAS2" : "124-18-5", + "betaV" : 1.000151132, + "gammaV" : 1.183394668, + "betaT" : 1.020028790, + "gammaT" : 1.145512213, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Hydrogen", + "CAS1" : "124-38-9", + "CAS2" : "1333-74-0", + "betaV" : 0.904142159, + "gammaV" : 1.152792550, + "betaT" : 0.942320195, + "gammaT" : 1.782924792, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Oxygen", + "CAS1" : "124-38-9", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "CarbonMonoxide", + "CAS1" : "124-38-9", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Water", + "CAS1" : "124-38-9", + "CAS2" : "7732-18-5", + "betaV" : 0.949055959, + "gammaV" : 1.542328793, + "betaT" : 0.997372205, + "gammaT" : 0.775453996, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "HydrogenSulfide", + "CAS1" : "124-38-9", + "CAS2" : "7783-06-4", + "betaV" : 0.906630564, + "gammaV" : 1.024085837, + "betaT" : 1.016034583, + "gammaT" : 0.926018880, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Helium", + "CAS1" : "124-38-9", + "CAS2" : "7440-59-7", + "betaV" : 0.846647561, + "gammaV" : 0.864141549, + "betaT" : 0.768377630, + "gammaT" : 3.207456948, + "F" : 0 + }, + {"Name1" : "CarbonDioxide", + "Name2" : "Argon", + "CAS1" : "124-38-9", + "CAS2" : "7440-37-1", + "betaV" : 1.008392428, + "gammaV" : 1.029205465, + "betaT" : 0.996512863, + "gammaT" : 1.050971635, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Propane", + "CAS1" : "74-84-0", + "CAS2" : "74-98-6", + "betaV" : 0.997607277, + "gammaV" : 1.003034720, + "betaT" : 0.996199694, + "gammaT" : 1.014730190, + "F" : 0.130424765150 + }, + {"Name1" : "Ethane", + "Name2" : "n-Butane", + "CAS1" : "74-84-0", + "CAS2" : "106-97-8", + "betaV" : 0.999157205, + "gammaV" : 1.006179146, + "betaT" : 0.999130554, + "gammaT" : 1.034832749, + "F" : 0.281570073085 + }, + {"Name1" : "Ethane", + "Name2" : "IsoButane", + "CAS1" : "74-84-0", + "CAS2" : "75-28-5", + "betaV" : 1.0, + "gammaV" : 1.006616886, + "betaT" : 1.0, + "gammaT" : 1.033283811, + "F" : 0.260632376098 + }, + {"Name1" : "Ethane", + "Name2" : "n-Pentane", + "CAS1" : "74-84-0", + "CAS2" : "109-66-0", + "betaV" : 0.993851009, + "gammaV" : 1.026085655, + "betaT" : 0.998688946, + "gammaT" : 1.066665676, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Isopentane", + "CAS1" : "74-84-0", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.045439935, + "betaT" : 1.0, + "gammaT" : 1.021150247, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "n-Hexane", + "CAS1" : "74-84-0", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.169701102, + "betaT" : 1.0, + "gammaT" : 1.092177796, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "n-Heptane", + "CAS1" : "74-84-0", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.057666085, + "betaT" : 1.0, + "gammaT" : 1.134532014, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "n-Octane", + "CAS1" : "74-84-0", + "CAS2" : "111-65-9", + "betaV" : 1.007469726, + "gammaV" : 1.071917985, + "betaT" : 0.984068272, + "gammaT" : 1.168636194, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "n-Nonane", + "CAS1" : "74-84-0", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.143534730, + "betaT" : 1.0, + "gammaT" : 1.056033030, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "n-Decane", + "CAS1" : "74-84-0", + "CAS2" : "124-18-5", + "betaV" : 0.995676258, + "gammaV" : 1.098361281, + "betaT" : 0.970918061, + "gammaT" : 1.237191558, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Hydrogen", + "CAS1" : "74-84-0", + "CAS2" : "1333-74-0", + "betaV" : 0.925367171, + "gammaV" : 1.106072040, + "betaT" : 0.932969831, + "gammaT" : 1.902008495, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Oxygen", + "CAS1" : "74-84-0", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "CarbonMonoxide", + "CAS1" : "74-84-0", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.201417898, + "betaT" : 1.0, + "gammaT" : 1.069224728, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Water", + "CAS1" : "74-84-0", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "HydrogenSulfide", + "CAS1" : "74-84-0", + "CAS2" : "7783-06-4", + "betaV" : 1.010817909, + "gammaV" : 1.030988277, + "betaT" : 0.990197354, + "gammaT" : 0.902736660, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Helium", + "CAS1" : "74-84-0", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Ethane", + "Name2" : "Argon", + "CAS1" : "74-84-0", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Butane", + "CAS1" : "74-98-6", + "CAS2" : "106-97-8", + "betaV" : 0.999795868, + "gammaV" : 1.003264179, + "betaT" : 1.000310289, + "gammaT" : 1.007392782, + "F" : 0.312572600489e-1 + }, + {"Name1" : "Propane", + "Name2" : "IsoButane", + "CAS1" : "74-98-6", + "CAS2" : "75-28-5", + "betaV" : 0.999243146, + "gammaV" : 1.001156119, + "betaT" : 0.998012298, + "gammaT" : 1.005250774, + "F" : -0.551609771024e-1 + }, + {"Name1" : "Propane", + "Name2" : "n-Pentane", + "CAS1" : "74-98-6", + "CAS2" : "109-66-0", + "betaV" : 1.044919431, + "gammaV" : 1.019921513, + "betaT" : 0.996484021, + "gammaT" : 1.008344412, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Isopentane", + "CAS1" : "74-98-6", + "CAS2" : "78-78-4", + "betaV" : 1.040459289, + "gammaV" : 0.999432118, + "betaT" : 0.994364425, + "gammaT" : 1.003269500, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Hexane", + "CAS1" : "74-98-6", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.057872566, + "betaT" : 1.0, + "gammaT" : 1.025657518, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Heptane", + "CAS1" : "74-98-6", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.079648053, + "betaT" : 1.0, + "gammaT" : 1.050044169, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Octane", + "CAS1" : "74-98-6", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.102764612, + "betaT" : 1.0, + "gammaT" : 1.063694129, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Nonane", + "CAS1" : "74-98-6", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.199769134, + "betaT" : 1.0, + "gammaT" : 1.109973833, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "n-Decane", + "CAS1" : "74-98-6", + "CAS2" : "124-18-5", + "betaV" : 0.984104227, + "gammaV" : 1.053040574, + "betaT" : 0.985331233, + "gammaT" : 1.140905252, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Hydrogen", + "CAS1" : "74-98-6", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.074006110, + "betaT" : 1.0, + "gammaT" : 2.308215191, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Oxygen", + "CAS1" : "74-98-6", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "CarbonMonoxide", + "CAS1" : "74-98-6", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.108143673, + "betaT" : 1.0, + "gammaT" : 1.197564208, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Water", + "CAS1" : "74-98-6", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.011759763, + "betaT" : 1.0, + "gammaT" : 0.600340961, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "HydrogenSulfide", + "CAS1" : "74-98-6", + "CAS2" : "7783-06-4", + "betaV" : 0.936811219, + "gammaV" : 1.010593999, + "betaT" : 0.992573556, + "gammaT" : 0.905829247, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Helium", + "CAS1" : "74-98-6", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Propane", + "Name2" : "Argon", + "CAS1" : "74-98-6", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "IsoButane", + "CAS1" : "106-97-8", + "CAS2" : "75-28-5", + "betaV" : 1.000880464, + "gammaV" : 1.000414440, + "betaT" : 1.000077547, + "gammaT" : 1.001432824, + "F" : -0.551240293009e-1 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Pentane", + "CAS1" : "106-97-8", + "CAS2" : "109-66-0", + "betaV" : 1.0, + "gammaV" : 1.018159650, + "betaT" : 1.0, + "gammaT" : 1.002143640, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Isopentane", + "CAS1" : "106-97-8", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.002728434, + "betaT" : 1.0, + "gammaT" : 1.000792201, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Hexane", + "CAS1" : "106-97-8", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.034995284, + "betaT" : 1.0, + "gammaT" : 1.009157060, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Heptane", + "CAS1" : "106-97-8", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.019174227, + "betaT" : 1.0, + "gammaT" : 1.021283378, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Octane", + "CAS1" : "106-97-8", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.046905515, + "betaT" : 1.0, + "gammaT" : 1.033180106, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Nonane", + "CAS1" : "106-97-8", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.049219137, + "betaT" : 1.0, + "gammaT" : 1.014096448, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "n-Decane", + "CAS1" : "106-97-8", + "CAS2" : "124-18-5", + "betaV" : 0.976951968, + "gammaV" : 1.027845529, + "betaT" : 0.993688386, + "gammaT" : 1.076466918, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Hydrogen", + "CAS1" : "106-97-8", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.232939523, + "betaT" : 1.0, + "gammaT" : 2.509259945, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Oxygen", + "CAS1" : "106-97-8", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "CarbonMonoxide", + "CAS1" : "106-97-8", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.084740904, + "betaT" : 1.0, + "gammaT" : 1.173916162, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Water", + "CAS1" : "106-97-8", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.223638763, + "betaT" : 1.0, + "gammaT" : 0.615512682, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "HydrogenSulfide", + "CAS1" : "106-97-8", + "CAS2" : "7783-06-4", + "betaV" : 0.908113163, + "gammaV" : 1.033366041, + "betaT" : 0.985962886, + "gammaT" : 0.926156602, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Helium", + "CAS1" : "106-97-8", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Butane", + "Name2" : "Argon", + "CAS1" : "106-97-8", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.214638734, + "betaT" : 1.0, + "gammaT" : 1.245039498, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Pentane", + "CAS1" : "75-28-5", + "CAS2" : "109-66-0", + "betaV" : 1.0, + "gammaV" : 1.002779804, + "betaT" : 1.0, + "gammaT" : 1.002495889, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Isopentane", + "CAS1" : "75-28-5", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.002284353, + "betaT" : 1.0, + "gammaT" : 1.001835788, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Hexane", + "CAS1" : "75-28-5", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.010493989, + "betaT" : 1.0, + "gammaT" : 1.006018054, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Heptane", + "CAS1" : "75-28-5", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.021668316, + "betaT" : 1.0, + "gammaT" : 1.009885760, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Octane", + "CAS1" : "75-28-5", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.032807063, + "betaT" : 1.0, + "gammaT" : 1.013945424, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Nonane", + "CAS1" : "75-28-5", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.047298475, + "betaT" : 1.0, + "gammaT" : 1.017817492, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "n-Decane", + "CAS1" : "75-28-5", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.060243344, + "betaT" : 1.0, + "gammaT" : 1.021624748, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Hydrogen", + "CAS1" : "75-28-5", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.147595688, + "betaT" : 1.0, + "gammaT" : 1.895305393, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Oxygen", + "CAS1" : "75-28-5", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "CarbonMonoxide", + "CAS1" : "75-28-5", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.087272232, + "betaT" : 1.0, + "gammaT" : 1.161390082, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Water", + "CAS1" : "75-28-5", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "HydrogenSulfide", + "CAS1" : "75-28-5", + "CAS2" : "7783-06-4", + "betaV" : 1.012994431, + "gammaV" : 0.988591117, + "betaT" : 0.974550548, + "gammaT" : 0.937130844, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Helium", + "CAS1" : "75-28-5", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "IsoButane", + "Name2" : "Argon", + "CAS1" : "75-28-5", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Isopentane", + "CAS1" : "109-66-0", + "CAS2" : "78-78-4", + "betaV" : 1.0, + "gammaV" : 1.000024335, + "betaT" : 1.0, + "gammaT" : 1.000050537, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "n-Hexane", + "CAS1" : "109-66-0", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.002480637, + "betaT" : 1.0, + "gammaT" : 1.000761237, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "n-Heptane", + "CAS1" : "109-66-0", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.008972412, + "betaT" : 1.0, + "gammaT" : 1.002441051, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "n-Octane", + "CAS1" : "109-66-0", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.069223964, + "betaT" : 1.0, + "gammaT" : 1.016422347, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "n-Nonane", + "CAS1" : "109-66-0", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.034910633, + "betaT" : 1.0, + "gammaT" : 1.103421755, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "n-Decane", + "CAS1" : "109-66-0", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.016370338, + "betaT" : 1.0, + "gammaT" : 1.049035838, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Hydrogen", + "CAS1" : "109-66-0", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.188334783, + "betaT" : 1.0, + "gammaT" : 2.013859174, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Oxygen", + "CAS1" : "109-66-0", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "CarbonMonoxide", + "CAS1" : "109-66-0", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.119954454, + "betaT" : 1.0, + "gammaT" : 1.206043295, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Water", + "CAS1" : "109-66-0", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 0.956677310, + "betaT" : 1.0, + "gammaT" : 0.447666011, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "HydrogenSulfide", + "CAS1" : "109-66-0", + "CAS2" : "7783-06-4", + "betaV" : 0.984613203, + "gammaV" : 1.076539234, + "betaT" : 0.962006651, + "gammaT" : 0.959065662, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Helium", + "CAS1" : "109-66-0", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Pentane", + "Name2" : "Argon", + "CAS1" : "109-66-0", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "n-Hexane", + "CAS1" : "78-78-4", + "CAS2" : "110-54-3", + "betaV" : 1.0, + "gammaV" : 1.002995876, + "betaT" : 1.0, + "gammaT" : 1.001204174, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "n-Heptane", + "CAS1" : "78-78-4", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.009928206, + "betaT" : 1.0, + "gammaT" : 1.003194615, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "n-Octane", + "CAS1" : "78-78-4", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.017880545, + "betaT" : 1.0, + "gammaT" : 1.005647480, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "n-Nonane", + "CAS1" : "78-78-4", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.028994325, + "betaT" : 1.0, + "gammaT" : 1.008191499, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "n-Decane", + "CAS1" : "78-78-4", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.039372957, + "betaT" : 1.0, + "gammaT" : 1.010825138, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "Hydrogen", + "CAS1" : "78-78-4", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.184340443, + "betaT" : 1.0, + "gammaT" : 1.996386669, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "Oxygen", + "CAS1" : "78-78-4", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "CarbonMonoxide", + "CAS1" : "78-78-4", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.116694577, + "betaT" : 1.0, + "gammaT" : 1.199326059, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "Water", + "CAS1" : "78-78-4", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "HydrogenSulfide", + "CAS1" : "78-78-4", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 0.835763343, + "betaT" : 1.0, + "gammaT" : 0.982651529, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "Helium", + "CAS1" : "78-78-4", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Isopentane", + "Name2" : "Argon", + "CAS1" : "78-78-4", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "n-Heptane", + "CAS1" : "110-54-3", + "CAS2" : "142-82-5", + "betaV" : 1.0, + "gammaV" : 1.001508227, + "betaT" : 1.0, + "gammaT" : 0.999762786, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "n-Octane", + "CAS1" : "110-54-3", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.006268954, + "betaT" : 1.0, + "gammaT" : 1.001633952, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "n-Nonane", + "CAS1" : "110-54-3", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.020761680, + "betaT" : 1.0, + "gammaT" : 1.055369591, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "n-Decane", + "CAS1" : "110-54-3", + "CAS2" : "124-18-5", + "betaV" : 1.001516371, + "gammaV" : 1.013511439, + "betaT" : 0.997641010, + "gammaT" : 1.028939539, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "Hydrogen", + "CAS1" : "110-54-3", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.243461678, + "betaT" : 1.0, + "gammaT" : 3.021197546, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "Oxygen", + "CAS1" : "110-54-3", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "CarbonMonoxide", + "CAS1" : "110-54-3", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.155145836, + "betaT" : 1.0, + "gammaT" : 1.233272781, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "Water", + "CAS1" : "110-54-3", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.170217596, + "betaT" : 1.0, + "gammaT" : 0.569681333, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "HydrogenSulfide", + "CAS1" : "110-54-3", + "CAS2" : "7783-06-4", + "betaV" : 0.754473958, + "gammaV" : 1.339283552, + "betaT" : 0.985891113, + "gammaT" : 0.956075596, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "Helium", + "CAS1" : "110-54-3", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Hexane", + "Name2" : "Argon", + "CAS1" : "110-54-3", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "n-Octane", + "CAS1" : "142-82-5", + "CAS2" : "111-65-9", + "betaV" : 1.0, + "gammaV" : 1.006767176, + "betaT" : 1.0, + "gammaT" : 0.998793111, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "n-Nonane", + "CAS1" : "142-82-5", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.001370076, + "betaT" : 1.0, + "gammaT" : 1.001150096, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "n-Decane", + "CAS1" : "142-82-5", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.002972346, + "betaT" : 1.0, + "gammaT" : 1.002229938, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "Hydrogen", + "CAS1" : "142-82-5", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.159131722, + "betaT" : 1.0, + "gammaT" : 3.169143057, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "Oxygen", + "CAS1" : "142-82-5", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "CarbonMonoxide", + "CAS1" : "142-82-5", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.190354273, + "betaT" : 1.0, + "gammaT" : 1.256123503, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "Water", + "CAS1" : "142-82-5", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "HydrogenSulfide", + "CAS1" : "142-82-5", + "CAS2" : "7783-06-4", + "betaV" : 0.828967164, + "gammaV" : 1.087956749, + "betaT" : 0.988937417, + "gammaT" : 1.013453092, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "Helium", + "CAS1" : "142-82-5", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Heptane", + "Name2" : "Argon", + "CAS1" : "142-82-5", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "n-Nonane", + "CAS1" : "111-65-9", + "CAS2" : "111-84-2", + "betaV" : 1.0, + "gammaV" : 1.001357085, + "betaT" : 1.0, + "gammaT" : 1.000235044, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "n-Decane", + "CAS1" : "111-65-9", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.002553544, + "betaT" : 1.0, + "gammaT" : 1.007186267, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "Hydrogen", + "CAS1" : "111-65-9", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.305249405, + "betaT" : 1.0, + "gammaT" : 2.191555216, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "Oxygen", + "CAS1" : "111-65-9", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "CarbonMonoxide", + "CAS1" : "111-65-9", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.219206702, + "betaT" : 1.0, + "gammaT" : 1.276565536, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "Water", + "CAS1" : "111-65-9", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 0.599484191, + "betaT" : 1.0, + "gammaT" : 0.662072469, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "HydrogenSulfide", + "CAS1" : "111-65-9", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "Helium", + "CAS1" : "111-65-9", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Octane", + "Name2" : "Argon", + "CAS1" : "111-65-9", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "n-Decane", + "CAS1" : "111-84-2", + "CAS2" : "124-18-5", + "betaV" : 1.0, + "gammaV" : 1.000810520, + "betaT" : 1.0, + "gammaT" : 1.000182392, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "Hydrogen", + "CAS1" : "111-84-2", + "CAS2" : "1333-74-0", + "betaV" : 1.0, + "gammaV" : 1.342647661, + "betaT" : 1.0, + "gammaT" : 2.234354040, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "Oxygen", + "CAS1" : "111-84-2", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "CarbonMonoxide", + "CAS1" : "111-84-2", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.252151449, + "betaT" : 1.0, + "gammaT" : 1.294070556, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "Water", + "CAS1" : "111-84-2", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "HydrogenSulfide", + "CAS1" : "111-84-2", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 1.082905109, + "betaT" : 1.0, + "gammaT" : 1.086557826, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "Helium", + "CAS1" : "111-84-2", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Nonane", + "Name2" : "Argon", + "CAS1" : "111-84-2", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "Hydrogen", + "CAS1" : "124-18-5", + "CAS2" : "1333-74-0", + "betaV" : 1.695358382, + "gammaV" : 1.120233729, + "betaT" : 1.064818089, + "gammaT" : 3.786003724, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "Oxygen", + "CAS1" : "124-18-5", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "CarbonMonoxide", + "CAS1" : "124-18-5", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 0.870184960, + "betaT" : 1.049594632, + "gammaT" : 1.803567587, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "Water", + "CAS1" : "124-18-5", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 0.551405318, + "betaT" : 0.897162268, + "gammaT" : 0.740416402, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "HydrogenSulfide", + "CAS1" : "124-18-5", + "CAS2" : "7783-06-4", + "betaV" : 0.975187766, + "gammaV" : 1.171714677, + "betaT" : 0.973091413, + "gammaT" : 1.103693489, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "Helium", + "CAS1" : "124-18-5", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "n-Decane", + "Name2" : "Argon", + "CAS1" : "124-18-5", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "Oxygen", + "CAS1" : "1333-74-0", + "CAS2" : "7782-44-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "CarbonMonoxide", + "CAS1" : "1333-74-0", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.121416201, + "betaT" : 1.0, + "gammaT" : 1.377504607, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "Water", + "CAS1" : "1333-74-0", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "HydrogenSulfide", + "CAS1" : "1333-74-0", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "Helium", + "CAS1" : "1333-74-0", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Hydrogen", + "Name2" : "Argon", + "CAS1" : "1333-74-0", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Oxygen", + "Name2" : "CarbonMonoxide", + "CAS1" : "7782-44-7", + "CAS2" : "630-08-0", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Oxygen", + "Name2" : "Water", + "CAS1" : "7782-44-7", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.143174289, + "betaT" : 1.0, + "gammaT" : 0.964767932, + "F" : 0 + }, + {"Name1" : "Oxygen", + "Name2" : "HydrogenSulfide", + "CAS1" : "7782-44-7", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Oxygen", + "Name2" : "Helium", + "CAS1" : "7782-44-7", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Oxygen", + "Name2" : "Argon", + "CAS1" : "7782-44-7", + "CAS2" : "7440-37-1", + "betaV" : 0.999746847, + "gammaV" : 0.993907223, + "betaT" : 1.000023103, + "gammaT" : 0.990430423, + "F" : 0 + }, + {"Name1" : "CarbonMonoxide", + "Name2" : "Water", + "CAS1" : "630-08-0", + "CAS2" : "7732-18-5", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "CarbonMonoxide", + "Name2" : "HydrogenSulfide", + "CAS1" : "630-08-0", + "CAS2" : "7783-06-4", + "betaV" : 0.795660392, + "gammaV" : 1.101731308, + "betaT" : 1.025536736, + "gammaT" : 1.022749748, + "F" : 0 + }, + {"Name1" : "CarbonMonoxide", + "Name2" : "Helium", + "CAS1" : "630-08-0", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "CarbonMonoxide", + "Name2" : "Argon", + "CAS1" : "630-08-0", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.159720623, + "betaT" : 1.0, + "gammaT" : 0.954215746, + "F" : 0 + }, + {"Name1" : "Water", + "Name2" : "HydrogenSulfide", + "CAS1" : "7732-18-5", + "CAS2" : "7783-06-4", + "betaV" : 1.0, + "gammaV" : 1.014832832, + "betaT" : 1.0, + "gammaT" : 0.940587083, + "F" : 0 + }, + {"Name1" : "Water", + "Name2" : "Helium", + "CAS1" : "7732-18-5", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Water", + "Name2" : "Argon", + "CAS1" : "7732-18-5", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.038993495, + "betaT" : 1.0, + "gammaT" : 1.070941866, + "F" : 0 + }, + {"Name1" : "HydrogenSulfide", + "Name2" : "Helium", + "CAS1" : "7783-06-4", + "CAS2" : "7440-59-7", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "HydrogenSulfide", + "Name2" : "Argon", + "CAS1" : "7783-06-4", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + }, + {"Name1" : "Helium", + "Name2" : "Argon", + "CAS1" : "7440-59-7", + "CAS2" : "7440-37-1", + "betaV" : 1.0, + "gammaV" : 1.0, + "betaT" : 1.0, + "gammaT" : 1.0, + "F" : 0 + } + ] +}, +{ + "Type" : "MultipleFluids", + "BibTeX" : "", + "Model" : "Kunz-JCED-2012", + "Coeffs" : [{"Name1" : "Ethanol", + "Name2" : "Water", + "CAS1" : "64-17-5", + "CAS2" : "7732-18-5", + "betaV" : 1.0624092, + "gammaV" : 0.8687762, + "betaT" : 0.971761, + "gammaT" : 0.93996768, + "F" : 0.3285109 + } + ] +} +] \ No newline at end of file diff --git a/dev/package_json.py b/dev/package_json.py new file mode 100644 index 00000000..8e8915c8 --- /dev/null +++ b/dev/package_json.py @@ -0,0 +1,271 @@ +from __future__ import print_function +import os, json, glob, textwrap + +json_options = {'indent' : 2, 'sort_keys' : True} + +# Data from Mulero, JPCRD, 2012 +# CAS codes added from CoolProp 4.2, and wikipedia where necessary +Mulero_data = """67-64-1 Acetone 0.0633 1.160 +7664-41-7 Ammonia 0.1028 1.211 -0.09453 5.585 +7440-37-1 Argon 0.037 1.25 +71-43-2 Benzene 0.07298 1.232 -0.0007802 0.8635 -0.0001756 0.3065 +106-97-8 n-Butane 0.05138 1.209 +106-98-9 1-Butene 0.05644 1.248 +112-40-3 n-Dodecane 0.0154 4.180 0.0480 1.170 +355-25-9 Decafluorobutane 0.04429 1.242 +124-38-9 CarbonDioxide 0.07863 1.254 +630-08-0 CarbonMonoxide 0.02843 1.148 +463-58-1 CarbonylSulfide 0.07246 1.407 +110-82-7 Cyclohexane 0.06485 1.263 +124-18-5 n-Decane 0.05473 1.290 +7782-39-0 Deuterium 0.009376 1.258 +7789-20-0 D2O -0.1423 2.645 0.2094 1.214 +115-10-6 DimethylEther 0.063157 1.2595 +74-84-0 Ethane 0.07602 1.320 -0.02912 1.676 +64-17-5 Ethanol 0.05 0.952 +74-85-1 Ethylene 0.0477 1.170 +7782-41-4 Fluorine 0.03978 1.218 +7440-59-7 Helium 0.0004656 1.040 0.001889 2.468 -0.002006 2.661 +142-82-5 n-Heptane 0.07765 1.319 -0.02599 1.600 +110-54-3 n-Hexane 0.210952 1.0962 -0.158485 1.05893 +1333-74-0 Hydrogen -1.4165 0.63882 0.746383 0.659804 0.675625 0.619149 +7783-06-4 HydrogenSulfide 0.078557 1.2074 +75-28-5 Isobutane -0.01639 2.102 0.06121 1.304 +115-11-7 Isobutene 0.0545 1.230 +107-83-5 Isohexane 0.05024 1.194 +78-78-4 Isopentane 0.051 1.209 +7439-90-9 Krypton 0.0447 1.245 +74-82-8 Methane 0.03825 1.191 -0.006024 5.422 -0.0007065 0.6161 +67-56-1 Methanol 0.22421 1.3355 -0.21408 1.677 0.083233 4.4402 +7440-01-9 Neon 0.012254 1.4136 0.02728 1.4517 -0.025715 1.6567 +7727-37-9 Nitrogen 0.02898 1.246 +10024-97-2 NitrousOxide 0.07087 1.204 +111-84-2 n-Nonane 0.05388 1.262 +111-65-9 n-Octane 0.34338 1.6607 -0.50634 1.9632 0.2238 2.3547 +7782-44-7 Oxygen 0.03843 1.225 +1333-74-0p Parahydrogen 0.005314 1.060 +109-66-0 n-Pentane 0.08015 1.408 0.004384 1.031 -0.03437 1.818 +678-26-2 Perfluoropentane 0.04394 1.254 +74-98-6 n-Propane 0.05334 1.235 -0.01748 4.404 +115-07-1 Propylene 0.05268 1.186 +74-99-7 Propyne 0.05801 1.205 +75-69-4 R11 0.06212 1.247 +75-71-8 R12 -0.000124 0.4318 0.05662 1.263 +75-72-9 R13 0.05045 1.269 +75-73-0 R14 0.0423 1.24 +75-43-4 R21 0.06924 1.259 +75-45-6 R22 3.0587 1.41809 -2.99856 1.42291 +75-46-7 R23 -0.32359 1.6055 0.37702 1.5232 +75-10-5 R32 0.07147 1.246 +593-53-3 R41 0.05049 1.242 +76-13-1 R113 0.0556 1.24 +76-14-2 R114 0.05239 1.258 +76-15-3 R115 0.04771 1.246 +76-16-4 R116 0.047593 1.2666 -0.0073402 1.9892 +306-83-2 R123 0.056151 1.2367 +2837-89-0 R124 0.05175 1.197 +354-33-6 R125 0.05252 1.237 +811-97-2 R134a 0.05801 1.241 +1717-00-6 R141b 7.3958e-5 0.066331 0.059941 1.2214 +75-68-3 R142b 0.05685 1.237 +420-46-2 R143a 0.05416 1.255 +75-37-6 R152a 0.05808 1.2115 +353-36-6 R161 0.05385 1.111 +76-19-7 R218 0.04322 1.224 +431-89-0 R227ea 0.06127 1.192 -0.009516 0.9795 -0.00192 1.421 +431-63-0 R236ea 0.306974 1.12614 -0.247277 1.09899 +690-39-1 R236fa 0.05389 1.249 +679-86-7 R245ca 0.069297 1.2795 -0.022419 3.1368 +460-73-1 R245fa 0.073586 1.0983 0.0103 0.60033 -0.02663 0.72765 +406-58-6 R365mfc 0.0534 1.210 +754-12-1 R1234yf 0.06274 1.394 +115-25-3 RC318 0.0507 1.250 +7446-09-5 SulfurDioxide 0.0803 0.928 0.0139 1.570 -0.0114 0.364 +2551-62-4 SulfurHexafluoride 0.0538 1.271 -4.064e-5 0.2116 +108-88-3 Toluene 0.06897 1.291 +2314-97-8 Trifluoroiodomethane 0.05767 1.298 +7732-18-5 Water -0.1306 2.471 0.2151 1.233 +7440-63-3 Xenon -0.11538 1.0512 0.16598 1.098""" + +def inject_surface_tension(root_dir): + print("*** Injecting surface tension curves from Mulero") + Tc_dict = {'Argon':150.687, + 'Benzene':562.02, + '1-Butene':419.29, #Butene from Mulero + 'CarbonMonoxide':132.86, + 'Cyclohexane':553.64, + 'D2O':643.847, + 'n-Decane':617.7, + 'Ethane':305.322, + 'Fluorine':144.414, + 'Helium':5.1953, + 'Isobutane':407.81, + 'Isobutene':418.09, + 'Isopentane':460.35, + 'Methanol':513.38, + 'Nitrogen':126.192, + 'n-Nonane':594.55, + 'Oxygen':154.581, + 'Parahydrogen':32.938, + 'Perfluorobutane':386.326, + 'n-Propane':369.89, + 'Propyne':402.38, + 'R11':471.11, + 'R113':487.21, + 'R114':418.83, + 'R115':353.1, + 'R123':456.831, + 'R1234yf':367.85, + 'R124':395.425, + 'R125':339.173, + 'R134a':374.21, + 'R14':227.51, + 'R142b':410.26, + 'R143a':345.857, + 'R152a':386.411, + 'R21':451.48, + 'R218':345.02, + 'R227ea':374.9, + 'R32':351.255, + 'R365mfc':460, + 'RC318':388.38, + 'SulfurDioxide':430.64, + 'Toluene':591.75, + 'Trifluoroiodomethane':396.44, + 'Water':647.096, + 'Acetone':508.1, + 'n-Butane':425.125, + 'CarbonDioxide':304.128, + 'DimethylEther':400.378, + 'n-Dodecane':658.1, #Decane in Mulero + 'Ethylene':282.35, + 'n-Heptane':540.13, + 'n-Hexane':507.82, + 'HydrogenSulfide':373.1, + 'Isohexane':497.7, + 'Krypton':209.48, + 'NitrousOxide':309.52, + 'n-Pentane':469.7, + 'R116':293.03, + 'R13':302, + 'R23':299.293, + 'R245ca':447.57, + 'Xenon':289.733, + 'CarbonylSulfide':378.77, + 'Hydrogen':33.145, + 'Methane':190.564, + 'n-Octane':569.32, + 'Perfluoropentane':420.555, + 'Propylene':364.211, + 'R12':385.12, + 'R141b':477.5, + 'R161':375.3, + 'R22':369.295, + 'R236ea':412.44, + 'R236fa':398.07, + 'R245fa':427.16, + 'R41':317.28, + 'SulfurHexafluoride':318.723, + 'Ammonia':405.4, + 'Deuterium':38.34, + 'Ethanol':513.9, + 'Neon':44.4918, + 'Decafluorobutane':113.3+273.15 # According to http://encyclopedia.airliquide.com/Encyclopedia.asp?GasID=19#GeneralData, not in Mulero + } + + import glob, numpy as np, json, os + for row in Mulero_data.split('\n'): + row = row.split(' ') + cas = row.pop(0) + name = row.pop(0) + a = row[0:len(row):2] + a = [float(_) for _ in a] + n = row[1:len(row):2] + n = [float(_) for _ in n] + if name not in Tc_dict: + raise ValueError( 'could not find Tc for ' + name) + continue + Tc = Tc_dict[name] + + # The dictionary of values for the surface tension + j_st = dict(Tc = Tc, + a = np.array(a).tolist(), + n = n, + BibTeX = 'Mulero-JPCRD-2012', + description = 'sigma = sum(a_i*(1-T/Tc)^n_i)' + ) + + fname = os.path.join(root_dir,'dev','fluids',name+'.json') + if not os.path.exists(fname): + print(fname+' does not exist') + continue + + j = json.load(open(fname,'r')) + + j['ANCILLARIES']['surface_tension'] = j_st + + fp = open(fname, 'w') + fp.write(json.dumps(j, **json_options)) + fp.close() + +def inject_environmental_data(root_dir): + print('*** Injecting environmental data from DTU') + j = json.load(open(os.path.join(root_dir,'dev','environmental_data_from_DTU','DTU_environmental.json'),'r')) + + for CAS, data in j.iteritems(): + fname = os.path.join(root_dir,'dev','fluids',data['Name']+'.json') + if os.path.isfile(fname): + fluid = json.load(open(fname,'r')) + fluid['ENVIRONMENTAL'] = data + fp = open(fname, 'w') + fp.write(json.dumps(fluid, **json_options)) + else: + print('Could not inject environmental data for',data['Name']) + +def inject_ancillaries(root_dir): + print('*** Injecting saturation ancillary curves') + master = [] + + for file in glob.glob(os.path.join(root_dir,'dev','fluids','*.json')): + path, file_name = os.path.split(file) + fluid_name = file_name.split('.')[0] + # Load the fluid file + fluid = json.load(open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'), 'r')) + + # Load the ancillary + anc = json.load(open(os.path.join(root_dir,'dev','ancillaries',fluid_name+'_anc.json'),'r')) + # Apply the ancillary by merging dictionaries + fluid.update(anc) + # Write fluid back to file + fp = open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'),'w') + fp.write(json.dumps(fluid, **json_options)) + +def package_json(root_dir): + + master = [] + + inject_ancillaries(root_dir) + inject_surface_tension(root_dir) + inject_environmental_data(root_dir) + + print('*** Combining fluid JSON files in JSON format in dev folder...') + for file in glob.glob(os.path.join(root_dir,'dev','fluids','*.json')): + + path, file_name = os.path.split(file) + fluid_name = file_name.split('.')[0] + + # Load the fluid file + fluid = json.load(open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'), 'r')) + + master += [fluid] + + fp = open(os.path.join(root_dir,'dev','all_fluids_verbose.json'),'w') + fp.write(json.dumps(master, **json_options)) + fp.close() + + fp = open(os.path.join(root_dir,'dev','all_fluids.json'),'w') + fp.write(json.dumps(master)) + fp.close() + +if __name__=='__main__': + package_json(root_dir = '..') \ No newline at end of file diff --git a/dev/pseudo-pure/Helmholtz/Helmholtz.i b/dev/pseudo-pure/Helmholtz/Helmholtz.i new file mode 100644 index 00000000..d1c7c430 --- /dev/null +++ b/dev/pseudo-pure/Helmholtz/Helmholtz.i @@ -0,0 +1,47 @@ +%module helmholtz + +//// *************************** EXCEPTION HANDLING **************************** +//// *************************** EXCEPTION HANDLING **************************** +//// *************************** EXCEPTION HANDLING **************************** +%include exception.i + +// A generic exception handler. Any exceptions thrown in C++ will be caught here +%exception { + try { + $action + } + catch(std::exception &e) { + SWIG_exception(SWIG_RuntimeError,e.what()); + } + catch(...) { + SWIG_exception(SWIG_RuntimeError,"Unknown exception"); + } +} + +// This allows for the use of STL vectors +%include "std_vector.i" +// This allows for the use of STL strings +%include "std_string.i" + +namespace std { + %template(vectord) vector; +}; + +%ignore phir_power::phir_power(); +%ignore phir_power::phir_power(std::vector,std::vector< double>,std::vector< double>,int,int); +%ignore phir_power::phir_power(const double [],const double [], const double [],int,int,int); +%ignore phir_power::phir_power(double [],double [],double [],int,int,int); +%ignore phir_power::phir_power(double const [],double const [],double const [],double const [],int,int,int); +%ignore phir_power::phir_power(double [],double [],double [],double [],int,int,int); +%ignore phi0_Planck_Einstein::phi0_Planck_Einstein(double [],double [],int,int,int); +%ignore phi0_Planck_Einstein::phi0_Planck_Einstein(double const [],double const [],int,int,int); +%ignore phi0_Planck_Einstein::phi0_Planck_Einstein(double,double); + +// This stuff will get included verbatim in CoolProp_wrap.cpp +%{ +#include "../../../CoolProp/Helmholtz.h" +#include "../../../CoolProp/CoolPropTools.h" +%} + +// This is where the parsing actually happens +%include "../../../CoolProp/Helmholtz.h" \ No newline at end of file diff --git a/dev/pseudo-pure/Helmholtz/__init__.py b/dev/pseudo-pure/Helmholtz/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dev/pseudo-pure/Helmholtz/setup.py b/dev/pseudo-pure/Helmholtz/setup.py new file mode 100644 index 00000000..679833cd --- /dev/null +++ b/dev/pseudo-pure/Helmholtz/setup.py @@ -0,0 +1,25 @@ + +from distutils.core import setup, Extension +import subprocess,shutil,os,sys + +sys.argv += ['build_ext','--inplace','--reswig'] + +if '--reswig' in sys.argv: + import subprocess + subprocess.check_output(['swig','-python','-outcurrentdir','-c++','-I../../../CoolProp','Helmholtz.i']) + sys.argv.remove('--reswig') + +commons = dict() + +helm_module = Extension('_helmholtz', + sources=['Helmholtz_wrap.cxx', '../../../CoolProp/Helmholtz.cpp', '../../../CoolProp/CoolPropTools.cpp'], + **commons + ) + +setup (name = 'EOSTerms', + version = '0.0.0', + author = "Ian Bell", + author_email = 'ian.h.bell@gmail.com', + description = """ helmholtz energy terms for EOS fitting """, + ext_modules = [helm_module], + ) diff --git a/dev/pseudo-pure/fit_pseudo-pure_eos.py b/dev/pseudo-pure/fit_pseudo-pure_eos.py new file mode 100644 index 00000000..624d1f66 --- /dev/null +++ b/dev/pseudo-pure/fit_pseudo-pure_eos.py @@ -0,0 +1,557 @@ +import numpy as np +from CoolProp.CoolProp import Props + +import matplotlib.pyplot as plt +import matplotlib.mlab as mlab + +import scipy.optimize +import scipy.stats +import random +import h5py +from templates import * + +indices = [] +class TermLibrary(): + """ + Build a term library using the coefficients from Wagner and Pruss (IAPWS95) + """ + def __init__(self): + L,D,T = [],[],[] + + for i in range(1,6): + for j in range(-4,9): + T.append(float(j)/8.0) + D.append(float(i)) + L.append(float(0)) + for i in range(1,16): + for j in range(1,16): + T.append(float(j)) + D.append(float(i)) + L.append(float(1)) + for i in range(1,13): + for j in range(1,11): + T.append(float(j)) + D.append(float(i)) + L.append(float(2)) + for i in range(1,6): + for j in range(10,24): + T.append(float(j)) + D.append(float(i)) + L.append(float(3)) + for i in range(1,10): + for j in range(10,21): + T.append(float(j)) + D.append(float(i)*2) + L.append(float(4)) + + self.T = T + self.D = D + self.L = L + +from Helmholtz import helmholtz + +def rsquared(x, y): + """ Return R^2 where x and y are array-like.""" + + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y) + return r_value**2 + +def get_fluid_constants(Ref): + if Ref == 'R407F': + RefString = 'REFPROP-MIX:R32[0.47319469]&R125[0.2051091]&R134a[0.32169621]' + elif Ref == 'R410A': + RefString = 'REFPROP-MIX:R32[0.6976147]&R125[0.3023853]' + + LIBRARY = TermLibrary() + + # Coefficients for HFC blends + LIBRARY.N = np.array([9.87252E-01, -1.03017E+00, 1.17666E+00, 6.10984E+00, -7.79453E+00, 1.83377E-02, 1.05880E+00, -1.12018E+00, 6.29064E-01, 6.24982E+00, -8.07855E+00, 2.64843E-02, -2.53639E+00, 8.50922E-01, -5.20084E-01, -4.64225E-02, -1.75725E+00, 1.38469E+00, -9.22473E-01, -5.03562E-02, 6.79757E-01, -6.52431E-01, 2.33779E-01, -2.91790E-01, -1.38991E-01, 2.62270E-01, -3.51688E-03, -3.51953E-01, 2.86215E-01, -5.07076E-03, -1.96680E+00, 6.21190E-01, -1.95505E-01, -1.12009E+00, 2.77353E-02, 8.22098E-01, -2.77727E-01, -7.58262E-02, -8.15653E-02, 2.00760E-02, -1.39761E-02, 6.89437E-02, -4.42552E-03, 7.55927E-02, -8.30480E-01, 3.36159E-01, 8.98881E-01, -1.17591E+00, 3.58172E-01, -2.21041E-02, -2.33323E-02, -5.07525E-02, -5.42007E-02, 1.16181E-02, 1.09552E-02, -3.76062E-02, -1.26426E-02, 5.53849E-02, -7.10970E-02, 3.10441E-02, 1.32798E-02, 1.54776E-02, -3.14579E-02, 3.52952E-02, 1.59566E-02, -1.85110E-02, -1.01254E-02, 3.02373E-03, 4.55978E-03, 1.72477E-01, -2.61116E-01, -7.45473E-02, 8.18591E-02, -7.94097E-02, -1.04047E-05, 1.71939E-02, 1.61382E-02, 9.15953E-03, 1.70451E-02, 1.05992E-03, 1.16124E-03, -4.82049E-03, -3.61575E-03, -6.36579E-03, -6.07010E-03, -8.75332E-04]) + LIBRARY.T = np.array([0.44, 1.2, 2.97, 0.67, 0.91, 5.96, 0.241, 0.69, 2.58, 0.692, 0.943, 5.8, 1.93, 1.7, 3.3, 7, 2.15, 2, 3, 7, 2.1, 4.3, 3.3, 4.7, 2.95, 0.7, 6, 1.15, 0.77, 5.84, 1.78, 2.05, 4.3, 2.43, 5.3, 2.2, 4.3, 12, 12, 13, 16, 13, 16.2, 13, 3, 2.7, 0.76, 1.48, 2.7, 6, 6, 17, 17, 0.3, 0.24, 1.8, 1.2, 0.25, 7, 8.7, 11.6, 0.45, 8.4, 8.5, 11.5, 25, 26, 0.2, 0.248, 0.2, 0.74, 3, 0.24, 2.86, 8, 17, 16, 16, 16.2, 0.7, 0.69, 7.4, 8.7, 1.25, 1.23, 4.7]) + LIBRARY.D = np.array([1.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 9]) + LIBRARY.L = np.array([0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 1, 2]) + + global indices + indices = set() + while len(indices) < 23: + indices.add(random.randint(0, len(LIBRARY.T)-1)) + print indices, len(LIBRARY.T) + + T0 = np.array([LIBRARY.T[i] for i in indices]) + D0 = np.array([LIBRARY.D[i] for i in indices]) + L0 = np.array([LIBRARY.L[i] for i in indices]) + N0 = np.array([LIBRARY.N[i] for i in indices]) + + # Values from Span short(2003) (polar) +# D0 = np.array([0, 1.0, 1.0, 1.0, 3.0, 7.0, 1.0, 2.0, 5.0, 1.0, 1.0, 4.0, 2.0]) +# L0 = np.array([0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0]) +# T0 = np.array([0, 0.25, 1.25, 1.5, 0.25, 0.875, 2.375, 2.0, 2.125, 3.5, 6.5, 4.75, 12.5]) +# N0 = 0.5*np.ones_like(D0) + + # values from R410A + N0 = np.array([0.0, 0.987252, -1.03017, 1.17666, -0.138991, 0.00302373, -2.53639, -1.96680, -0.830480, 0.172477, -0.261116, -0.0745473, 0.679757, -0.652431, 0.0553849, -0.0710970, -0.000875332, 0.0200760, -0.0139761, -0.0185110, 0.0171939, -0.00482049]) + T0 = np.array([0.0,0.44,1.2,2.97,2.95,0.2,1.93,1.78,3.0,0.2,0.74,3.0,2.1,4.3,0.25,7.0,4.7,13.0,16.0,25.0,17.0,7.4]) + D0 = np.array([0,1.0,1,1,2,5,1,2,3,5,5,5,1,1,4,4,9,2,2,4,5,6]) + L0 = np.array([0,0.0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]) + + indices = set() + while len(indices) < 5: + indices.add(random.randint(0, len(LIBRARY.T)-1)) + print indices, len(LIBRARY.T) + + T0 = np.append(T0, [LIBRARY.T[i] for i in indices]) + D0 = np.append(D0, [LIBRARY.D[i] for i in indices]) + L0 = np.append(L0, [LIBRARY.L[i] for i in indices]) + N0 = np.append(N0, [LIBRARY.N[i] for i in indices]) + + + # values from R407C +# N0 = np.array([0.0, 1.0588,-1.12018, 0.629064,-0.351953, 0.00455978,-1.75725,-1.12009, 0.0277353, 0.898881,-1.17591, 0.0818591,-0.0794097,-0.0000104047, 0.233779,-0.291790, 0.0154776,-0.0314579,-0.00442552,-0.0101254, 0.00915953,-0.003615]) +# T0 = np.array([0.0,0.241,0.69,2.58,1.15,0.248,2.15,2.43,5.3,0.76,1.48,0.24,2.86,8.0,3.3,4.7,0.45,8.4,16.2,26.0,16.0,8.7]) +# D0 = np.array([0.0,1,1,1,2,5,1,2,2,3,3,5,5,5,1,1,4,4,2,4,5,6]) +# L0 = np.array([0.0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3]) + + return RefString, N0, T0, D0, L0 + +class IdealPartFitter(object): + def __init__(self, Ref): + self.Ref = Ref + self.RefString, N0, T0, D0, L0 = get_fluid_constants(Ref) + self.molemass = Props(self.RefString,'molemass') + self.Tc = Props(self.RefString, 'Tcrit') + self.rhoc = Props(self.RefString, 'rhocrit') + self.pc = Props(self.RefString, 'pcrit') + self.T = np.linspace(100, 450, 200) + self.tau = self.Tc/self.T + self.C = Props('C', 'T', self.T, 'D', 1e-15, self.RefString) + R = 8.314472/self.molemass + self.cp0_R = self.C/R + + def cp0_R_from_fit(self, a_e): + a = a_e[0:len(a_e)//2] + e = a_e[len(a_e)//2::] + u1 = e[1]/self.T + u2 = e[2]/self.T + u3 = e[3]/self.T + return a[0]*self.T**e[0]+a[1]*u1**2*np.exp(u1)/(np.exp(u1)-1)**2+a[2]*u2**2*np.exp(u2)/(np.exp(u2)-1)**2+a[3]*u3**2*np.exp(u3)/(np.exp(u3)-1)**2 + + def OBJECTIVE_cp0_R(self, a_e): + cp0_R_fit = self.cp0_R_from_fit(a_e) + RMS = np.sqrt(np.mean(np.power((self.cp0_R-cp0_R_fit)/self.cp0_R, 2))) + return RMS + + def fit(self): + a_e = [2.8749, 2.0623, 5.9751, 1.5612, 0.1, 697.0, 1723.0, 3875.0] + + a_e = scipy.optimize.minimize(self.OBJECTIVE_cp0_R, a_e).x + + self.a = a_e[0:len(a_e)//2] + self.e = a_e[len(a_e)//2::] + + cp0_over_R_check = 1-self.tau**2*self.d2phi0_dTau2(self.tau) + + plt.plot(self.T, (self.cp0_R_from_fit(a_e)/self.cp0_R-1)*100, '-', self.T, (cp0_over_R_check/self.cp0_R-1)*100, '^') + plt.xlabel('Temperature [K]') + plt.ylabel('($c_{p0}/R$ (fit) / $c_{p0}/R$ (REFPROP) -1)*100 [%]') + plt.savefig('cp0.pdf') + plt.close() + + def d2phi0_dTau2(self, tau): + d = [] + for _tau in tau: + #lead term is killed + d.append(helmholtz.phi0_logtau(-1.0).dTau2(_tau, _tau) + + helmholtz.phi0_cp0_poly(self.a[0],self.e[0],self.Tc,298.15).dTau2(_tau, _tau) + + helmholtz.phi0_Planck_Einstein(self.a,self.e/self.Tc,1,len(self.a)-1).dTau2(_tau, _tau) + ) + return np.array(d) + +class ResidualPartFitter(object): + + def __init__(self, Ref, IPF): + self.Ref = Ref + self.IPF = IPF + self.RefString, self.N0, self.T0, self.D0, self.L0 = get_fluid_constants(Ref) + self.Tc = Props(self.RefString,'Tcrit') + self.rhoc = Props(self.RefString,'rhocrit') + molemass = Props(self.RefString,'molemass') + self.R = 8.314472/ molemass + + def termwise_Rsquared(self): + + keepers = [] + values = [] + print len(self.N0), 'terms at start' + for i in range(len(self.N0)): + + n = helmholtz.vectord([float(1)]) + d = helmholtz.vectord([self.D0[i]]) + t = helmholtz.vectord([self.T0[i]]) + l = helmholtz.vectord([self.L0[i]]) + + self.phir = helmholtz.phir_power(n, d, t, l, 0, 0) + + PPF = self.evaluate_EOS(np.array(list(n))) + + R2 = rsquared(PPF.p,self.phir.dDeltaV(self.tauV,self.deltaV)) + + values.append((R2,i)) + if R2 > 0.9: + keepers.append(i) + + values,indices = zip(*reversed(sorted(values))) + + keepers = list(indices[0:30]) + + self.N0 = self.N0[keepers] + self.T0 = self.T0[keepers] + self.D0 = self.D0[keepers] + self.L0 = self.L0[keepers] + + print len(self.N0), 'terms at end' + + def generate_1phase_data(self): + + Tc = Props(self.RefString, 'Tcrit') + rhoc = Props(self.RefString, 'rhocrit') + TTT, RHO, PPP, CPP, CVV, AAA = [], [], [], [], [], [] + + for _T in np.linspace(220, 450, 100): + print _T + for _rho in np.logspace(np.log10(1e-2), np.log10(rhoc), 100): + try: + if _T > Tc: + p = Props('P', 'T', _T, 'D', _rho, self.RefString) + cp = Props('C', 'T', _T, 'D', _rho, self.RefString) + cv = Props('O', 'T', _T, 'D', _rho, self.RefString) + a = Props('A', 'T', _T, 'D', _rho, self.RefString) + else: + DL = Props('D', 'T', _T, 'Q', 0, self.RefString) + DV = Props('D', 'T', _T, 'Q', 1, self.RefString) + if _rho < DV or _rho > DL: + p = Props('P', 'T', _T, 'D', _rho, self.RefString) + cp = Props('C', 'T', _T, 'D', _rho, self.RefString) + cv = Props('O', 'T', _T, 'D', _rho, self.RefString) + a = Props('A', 'T', _T, 'D', _rho, self.RefString) + else: + p = None + if p is not None: + TTT.append(_T) + RHO.append(_rho) + PPP.append(p) + CPP.append(cp) + CVV.append(cv) + AAA.append(a) + + except ValueError as VE: + print VE + pass + + for _rho in np.linspace(rhoc, 3.36*rhoc, 50): + try: + if _T > Tc: + p = Props('P', 'T', _T, 'D', _rho, self.RefString) + cp = Props('C', 'T', _T, 'D', _rho, self.RefString) + cv = Props('O', 'T', _T, 'D', _rho, self.RefString) + a = Props('A', 'T', _T, 'D', _rho, self.RefString) + else: + DL = Props('D', 'T', _T, 'Q', 0, self.RefString) + DV = Props('D', 'T', _T, 'Q', 1, self.RefString) + if _rho < DV or _rho > DL: + p = Props('P', 'T', _T, 'D', _rho, self.RefString) + cp = Props('C', 'T', _T, 'D', _rho, self.RefString) + cv = Props('O', 'T', _T, 'D', _rho, self.RefString) + a = Props('A', 'T', _T, 'D', _rho, self.RefString) + else: + p = None + if p is not None: + TTT.append(_T) + RHO.append(_rho) + PPP.append(p) + CPP.append(cp) + CVV.append(cv) + AAA.append(a) + + except ValueError as VE: + print VE + pass + + h = h5py.File('T_rho_p.h5','w') + grp = h.create_group(self.Ref) + grp.create_dataset("T",data = np.array(TTT),compression = "gzip") + grp.create_dataset("rho", data = np.array(RHO),compression = "gzip") + grp.create_dataset("p", data = np.array(PPP),compression = "gzip") + grp.create_dataset("cp", data = np.array(CPP),compression = "gzip") + grp.create_dataset("cv", data = np.array(CVV),compression = "gzip") + grp.create_dataset("speed_sound", data = np.array(AAA),compression = "gzip") + h.close() + + def load_data(self): + h = h5py.File('T_rho_p.h5','r') + self.T = h.get(self.Ref + '/T').value + self.rho = h.get(self.Ref + '/rho').value + self.p = h.get(self.Ref + '/p').value + self.cp = h.get(self.Ref + '/cp').value + self.cv = h.get(self.Ref + '/cv').value + self.speed_sound = h.get(self.Ref + '/speed_sound').value + + self.tau = self.Tc/self.T + self.delta = self.rho/self.rhoc + self.tauV = helmholtz.vectord(self.tau) + self.deltaV = helmholtz.vectord(self.delta) + + # Get the derivative d2phi0_dTau2 from the ideal part fitter + self.d2phi0_dTau2 = self.IPF.d2phi0_dTau2(self.tau) + + def evaluate_EOS(self, N): + + self.phir.n = helmholtz.vectord(N) + + dDelta = self.phir.dDeltaV(self.tauV, self.deltaV) + dTau2 = self.phir.dTau2V(self.tauV, self.deltaV) + dDelta2 = self.phir.dDelta2V(self.tauV, self.deltaV) + dDelta_dTau = self.phir.dDelta_dTauV(self.tauV, self.deltaV) + + # Evaluate the pressure + p = (self.rho*self.R*self.T)*(1 + self.delta*dDelta) + # Evaluate the specific heat at constant volume + cv_over_R = -self.tau**2*(self.d2phi0_dTau2 + dTau2) + cv = cv_over_R*self.R + # Evaluate the specific heat at constant pressure + cp_over_R = cv_over_R+(1.0+self.delta*dDelta-self.delta*self.tau*dDelta_dTau)**2/(1+2*self.delta*dDelta+self.delta**2*dDelta2) + cp = cp_over_R*self.R + # Evaluate the speed of sound + w = np.sqrt(1000*self.R*self.T*cp_over_R/cv_over_R*(1+2*self.delta*dDelta+self.delta**2*dDelta2)) + + class stub: pass + PPF = stub() + PPF.p = np.array(p, ndmin = 1).T + PPF.cp = np.array(cp, ndmin = 1).T + PPF.cv = np.array(cv, ndmin = 1).T + PPF.w = np.array(w, ndmin = 1).T + + return PPF + + def OBJECTIVE(self, N): + PPF = self.evaluate_EOS(N) + +## plt.plot(PPF.p, self.p); plt.show() +## plt.plot(PPF.cp, self.cp); plt.show() +## plt.plot(PPF.cv, self.cv); plt.show() +## plt.plot(PPF.w, self.speed_sound); plt.show() + w_p = 1.0 + w_cv = 1.0 + w_w = 1.0 + w_cp = 1.0 + w_total = (w_p+w_cv+w_w+w_cp)/4 + + w_p_norm = w_p/w_total + w_cv_norm = w_cv/w_total + w_cp_norm = w_cp/w_total + w_w_norm = w_w/w_total + residuals = np.r_[(PPF.p/self.p-1),(PPF.cv/self.cv-1),(PPF.cp/self.cp-1)]#,(PPF.w**2/self.speed_sound**2-1)] + RMS = np.sqrt(np.mean(np.power(residuals, 2))) + + print 'RMS:',RMS*100, '% Max',np.max(np.abs(residuals))*100,'%' + self.RMS = RMS + self.MaxError = np.max(np.abs(residuals)) + return RMS + + def fit(self): + + # Kill off some not as good terms + #self.termwise_Rsquared() + + # Load up the residual Helmholtz term with parameters + n = helmholtz.vectord(self.N0) + d = helmholtz.vectord(self.D0) + t = helmholtz.vectord(self.T0) + l = helmholtz.vectord(self.L0) + self.phir = helmholtz.phir_power(n, d, t, l, 1, len(self.N0)-1) + + # Solve for the coefficients + Nbounds = [(-10,10) for _ in range(len(self.N0))] + tbounds = [(-1,30) for _ in range(len(self.T0))] + print self.OBJECTIVE(np.array(list(self.N0))) + #self.N = self.N0 + #self.N = scipy.optimize.minimize(self.OBJECTIVE, np.array(list(self.N0)), bounds = Nbounds, options = dict(maxiter = 5)).x + self.N = scipy.optimize.minimize(self.OBJECTIVE, np.array(list(self.N0)), method = 'L-BFGS-B', bounds = Nbounds, options = dict(maxiter = 100)).x + + # Write the coefficients to HDF5 file + h = h5py.File('fit_coeffs.h5','w') + grp = h.create_group(self.Ref) + grp.create_dataset("n", data = np.array(self.N), compression = "gzip") + print self.N + #grp.create_dataset("t", data = np.array(self.N[len(self.N)//2::]), compression = "gzip") + h.close() + + def evaluate_REFPROP(self, Ref, T, rho): + + p,cp,cv,w = [],[],[],[] + R = 8.314472/Props(Ref,'molemass') + for _T,_rho in zip(T, rho): + p.append(Props("P",'T',_T,'D',_rho,Ref)) + cp.append(Props("C",'T',_T,'D',_rho,Ref)) + cv.append(Props("O",'T',_T,'D',_rho,Ref)) + w.append(Props("A",'T',_T,'D',_rho,Ref)) + + class stub: pass + PPF = stub() + PPF.p = np.array(p, ndmin = 1).T + PPF.cp = np.array(cp, ndmin = 1).T + PPF.cv = np.array(cv, ndmin = 1).T + PPF.w = np.array(w, ndmin = 1).T + + return PPF + + def check(self): + # Load the coefficients from file + h = h5py.File('fit_coeffs.h5','r') + grp = h.get(self.Ref) + n = grp.get('n').value + h.close() + + print n + + import matplotlib.colors as colors + cNorm = colors.LogNorm(vmin=1e-3, vmax=50) + PPF = self.evaluate_EOS(np.array(list(n))) + self.OBJECTIVE(np.array(list(n))) + + print 'max error (p)',np.max(np.abs(PPF.p/self.p-1)*100),'%' + SC1 = plt.scatter(self.rho, self.T, s = 8, c = np.abs(PPF.p/self.p-1)*100, edgecolors = 'none', cmap = plt.get_cmap('jet'), norm = cNorm) + plt.gca().set_xscale('log') + cb = plt.colorbar() + cb.set_label('abs(PPF.p/self.p-1)*100') + plt.savefig('pressure.png') + plt.show() + + print 'max error (cp)',np.max(np.abs(PPF.cp/self.cp-1)*100),'%' + SC1 = plt.scatter(self.rho, self.T, s = 8, c = np.abs(PPF.cp/self.cp-1)*100, edgecolors = 'none', cmap = plt.get_cmap('jet'), norm = cNorm) + plt.gca().set_xscale('log') + cb = plt.colorbar() + cb.set_label('abs(PPF.cp/self.cp-1)*100') + plt.savefig('cp.png') + plt.show() + +## plt.plot(self.T,PPF.p/self.p,'.'); plt.show() +## plt.plot(self.T,PPF.cp/self.cp,'.'); plt.show() +## plt.plot(self.T,PPF.cv/self.cv,'.'); plt.show() +## plt.plot(self.T,PPF.w/self.speed_sound,'.'); plt.show() + +class PPFFitterClass(object): + + def __init__(self, Ref, regenerate_data = True, fit = True): + + self.Ref = Ref + + self.IPF = IdealPartFitter(Ref) + self.IPF.fit() + for i in range(1): + + self.RPF = ResidualPartFitter(Ref, IPF = self.IPF) + if regenerate_data: + self.RPF.generate_1phase_data() + + self.RPF.load_data() + + if fit: + self.RPF.fit() + + f = open('results.txt','a+') + print >> f, indices, self.RPF.RMS, self.RPF.MaxError + f.close() + + self.RPF.check() + quit() + self.output_files() + + def contour_plot(values): + """ + Parameters + ---------- + values : iterable, same size as T and rho + """ + + plt.semilogx(self.RPF.rho,self.RPF.T,'o') + plt.show() + + # Generate a regular grid to interpolate the data. + xi = np.linspace(min(self.RPF.T), max(self.RPF.T), 100) + yi = np.linspace(min(self.RPF.rho), max(self.RPF.rho), 100) + xi, yi = np.meshgrid(xi, yi) + # Interpolate using delaunay triangularization + zi = mlab.griddata(np.array(self.RPF.T),np.array(self.RPF.rho),np.array(values),xi,yi) + cont = plt.contourf(yi,xi,zi,30) + plt.colorbar() + plt.show() + + def output_files(self): + h = h5py.File('fit_coeffs.h5','r') + n = h.get(self.Ref+'/n').value + #t = h.get(self.Ref+'/t').value + + # Output the header file + header = PPF_h_template.format(Ref = self.Ref, RefUpper = self.Ref.upper()) + + acoeffs = '0, '+', '.join(['{a:0.6f}'.format(a=_) for _ in self.IPF.a]) + # First one doesn't get divided by critical temperature, later ones do + bcoeffs = '0, ' + bcoeffs += str(self.IPF.e[0])+', ' + bcoeffs += ', '.join(['{b:0.4f}/{Tcrit:g}'.format(b=_,Tcrit = self.IPF.Tc) for _ in self.IPF.e[1::]]) + + ncoeffs = ', '.join(['{a:0.6g}'.format(a=_) for _ in n]) + tcoeffs = ', '.join(['{a:0.6g}'.format(a=_) for _ in self.RPF.T0]) + dcoeffs = ', '.join(['{a:0.6g}'.format(a=_) for _ in self.RPF.D0]) + lcoeffs = ', '.join(['{a:0.6g}'.format(a=_) for _ in self.RPF.L0]) + + import sys + sys.path.append('..') + from fit_ancillary_ODRPACK import saturation_pressure, saturation_density + pL = saturation_pressure(self.IPF.RefString, self.IPF.Ref, LV = 'L') + pV = saturation_pressure(self.IPF.RefString, self.IPF.Ref, LV = 'V') + rhoL = saturation_density(self.IPF.RefString, self.IPF.Ref, form='A', LV='L', add_critical = False) + rhoV = saturation_density(self.IPF.RefString, self.IPF.Ref, form='B', LV='V', add_critical = False) + + code = PPF_cpp_template.format(Ref = self.Ref, + RefUpper = self.Ref.upper(), + acoeffs = acoeffs, + bcoeffs = bcoeffs, + Ncoeffs = ncoeffs, + tcoeffs = tcoeffs, + dcoeffs = dcoeffs, + Lcoeffs = lcoeffs, + N_phir = len(n), + N_cp0 = len(self.IPF.a), + molemass = self.IPF.molemass, + Ttriple = 200, + accentric = 0.7, + pcrit = self.IPF.pc, + Tcrit = self.IPF.Tc, + rhocrit = self.IPF.rhoc, + pL = pL, + pV = pV, + rhoL = rhoL, + rhoV = rhoV + ) + + f = open(self.IPF.Ref+'.h','w') + f.write(header) + f.close() + + f = open(self.IPF.Ref+'.cpp','w') + f.write(code) + f.close() + +if __name__=='__main__': + Ref = 'R407F' + + PPFFitterClass(Ref) + + + + + + + + + \ No newline at end of file diff --git a/dev/pseudo-pure/setup.py b/dev/pseudo-pure/setup.py new file mode 100644 index 00000000..87a104c3 --- /dev/null +++ b/dev/pseudo-pure/setup.py @@ -0,0 +1,14 @@ +from distutils.core import setup +from Cython.Build import cythonize + +import sys,numpy +import Cython +Cython.Compiler.Options.annotate = True +sys.argv += ['build_ext','--inplace'] + +setup( + name = "", + ext_modules = cythonize('summer.pyx'), # accepts a glob pattern + include_dirs = [numpy.get_include()] +) + diff --git a/dev/pseudo-pure/summer.pxd b/dev/pseudo-pure/summer.pxd new file mode 100644 index 00000000..bcd3aa25 --- /dev/null +++ b/dev/pseudo-pure/summer.pxd @@ -0,0 +1,9 @@ +cimport numpy as np +cimport cython + +cdef class PPF_summer: + cdef public np.ndarray n,t,d,L,tau,delta + cdef int IL0 + + cpdef set_constants(self, np.ndarray t, np.ndarray d, np.ndarray l, int IL0) + cpdef dphir_dDelta(self) \ No newline at end of file diff --git a/dev/pseudo-pure/summer.pyx b/dev/pseudo-pure/summer.pyx new file mode 100644 index 00000000..a246f917 --- /dev/null +++ b/dev/pseudo-pure/summer.pyx @@ -0,0 +1,43 @@ + +cimport cython + +import numpy as np +from libc.math cimport exp, log + +@cython.boundscheck(False) +cdef class PPF_summer: + + def __init__(self, tau, delta): + self.tau = tau + self.delta = delta + + cpdef set_constants(self, np.ndarray t, np.ndarray d, np.ndarray l, int IL0): + self.t = t + self.d = d + self.L = l + self.IL0 = IL0 + + cpdef dphir_dDelta(self): + cdef int i, j + + dphir_dDelta = np.zeros_like(self.tau) + cdef double [:] dphir_dDelta_view = dphir_dDelta + cdef long [:] d = self.d + cdef double [:] t = self.t + cdef long [:] L = self.L + cdef double [:] n = self.n + + cdef double [:] tau = self.tau + cdef double [:] delta = self.delta + + for j in xrange(len(self.tau)): + log_tau = log(tau[j]) + log_delta = log(delta[j]) + for i in xrange(len(self.t)): + if i < self.IL0: + dphir_dDelta_view[j] += d[i]*n[i]*exp((d[i]-1)*log_delta+t[i]*log_tau) + else: + dphir_dDelta_view[j] += n[i]*exp((d[i]-1)*log_delta+t[i]*log_tau-delta[j]**L[i])*(d[i]-L[i]*delta[j]**L[i]) + + return dphir_dDelta + \ No newline at end of file diff --git a/dev/pseudo-pure/templates.py b/dev/pseudo-pure/templates.py new file mode 100644 index 00000000..dd4a361a --- /dev/null +++ b/dev/pseudo-pure/templates.py @@ -0,0 +1,81 @@ +# A template the for the .h file +PPF_h_template = """ +#ifndef {RefUpper:s}_H +#define {RefUpper:s}_H + + class {Ref:s}Class : public Fluid{{ + + public: + {Ref:s}Class(); + ~{Ref:s}Class(){{}}; + double psatL(double); + double psatV(double); + double rhosatL(double); + double rhosatV(double); + }}; +#endif +""" + +PPF_cpp_template = """ +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#else +#include +#endif + +#include "math.h" +#include "stdio.h" +#include +#include "CoolProp.h" +#include "FluidClass.h" +#include "{Ref:s}.h" + +{Ref:s}Class::{Ref:s}Class() +{{ + // Constants for the ideal-gas contribution + static double a[]={{{acoeffs:s}}}; + static double b[]={{{bcoeffs:s}}}; + + // Constants for the residual contribution + static double N[]={{{Ncoeffs:s}}}; + static double t[]={{{tcoeffs:s}}}; + static double d[]={{{dcoeffs:s}}}; + static double l[]={{{Lcoeffs:s}}}; + + // Other fluid parameters + params.molemass = {molemass:g}; //[kg/kmol] + params.Ttriple = {Ttriple:g}; //[K] + params.accentricfactor = {accentric:g}; //[-] + params.R_u = 8.314472; + isPure = false; + + // Critical parameters + crit.rho = {rhocrit:g}; + crit.p = PressureUnit({pcrit:g},UNIT_KPA); + crit.T = {Tcrit:g}; + crit.v = 1.0/crit.rho; + + phirlist.push_back(new phir_power(N,d,t,l,1,{N_phir:d}-1,{N_phir:d})); + + phi0list.push_back(new phi0_lead(0, 0)); + phi0list.push_back(new phi0_logtau(-1.0)); + phi0list.push_back(new phi0_cp0_poly(a[1],b[1],crit.T,298.15)); + phi0list.push_back(new phi0_Planck_Einstein(a,b,2,{N_cp0:d},{N_cp0:d}+1)); + + // Adjust to the IIR reference state (h=200 kJ/kg, s = 1 kJ/kg for sat. liq at 0C) + params.HSReferenceState = "IIR"; + + // Limits of EOS + limits.Tmin = params.Ttriple; + + name.assign("{Ref:s}"); +}} +{pL:s} +{pV:s} +{rhoL:s} +{rhoV:s} +""" + diff --git a/dev/scripts/all_flash_plots.py b/dev/scripts/all_flash_plots.py new file mode 100644 index 00000000..bb673433 --- /dev/null +++ b/dev/scripts/all_flash_plots.py @@ -0,0 +1,41 @@ +import matplotlib.pyplot as plt +import CoolProp.CoolProp as CP +import itertools, numpy as np + +variables = ['T','P','H','S','U','D'] + +for fluid in ['Water','CO2','n-Propane']: + T = np.linspace(CP.Props(fluid,'Tmin'),CP.Props(fluid,'Tcrit'),1000) + + fig = plt.figure(1, figsize=(10, 10), dpi=100) + for i, types in enumerate(itertools.combinations(variables,2)): + ax = plt.subplot(5, 3, i+1) + + types = list(types) + + if types[0] in ['T','P'] and types != ['T','P']: + types[0],types[1] = types[1],types[0] + + xL = CP.Props(types[0],'T',T,'Q',0,fluid) + yL = CP.Props(types[1],'T',T,'Q',0,fluid) + xV = CP.Props(types[0],'T',T,'Q',1,fluid) + yV = CP.Props(types[1],'T',T,'Q',1,fluid) + xc = CP.Props(types[0],'T',CP.Props(fluid,'Tcrit'),'Q',1,fluid) + yc = CP.Props(types[1],'T',CP.Props(fluid,'Tcrit'),'Q',1,fluid) + + ax.plot(xL,yL,'k') + ax.plot(xV,yV,'k') + ax.plot(xc,yc,'o') + + if types[0] in ['P','D']: + ax.set_xscale('log') + if types[1] in ['P','D']: + ax.set_yscale('log') + + plt.title(' '.join(types)) + plt.xlabel(types[0]) + plt.ylabel(types[1]) + + plt.tight_layout() + plt.savefig('AllFlash'+fluid+'.pdf') + plt.show() \ No newline at end of file diff --git a/dev/scripts/check_TTSE.py b/dev/scripts/check_TTSE.py new file mode 100644 index 00000000..48d1d392 --- /dev/null +++ b/dev/scripts/check_TTSE.py @@ -0,0 +1,110 @@ +from CoolProp.Plots import Ph +import CoolProp.CoolProp as CP +import matplotlib.pyplot as plt +import matplotlib.colors as colors +import matplotlib.cm as cmx +import matplotlib.ticker +import numpy as np +import random + +fig = plt.figure(figsize=(10,5)) +ax1 = fig.add_axes((0.08,0.1,0.32,0.83)) +ax2 = fig.add_axes((0.50,0.1,0.32,0.83)) + +Ref = 'R245fa' + +T = np.linspace(CP.Props(Ref,'Tmin')+0.1,CP.Props(Ref,'Tcrit')-0.01,300) +pV = CP.Props('P','T',T,'Q',1,Ref) +hL = CP.Props('H','T',T,'Q',0,Ref) +hV = CP.Props('H','T',T,'Q',1,Ref) + +HHH1, PPP1, EEE1 = [], [], [] +HHH2, PPP2, EEE2 = [], [], [] + +cNorm = colors.LogNorm(vmin=1e-12, vmax=10) +scalarMap = cmx.ScalarMappable(norm = cNorm, cmap = plt.get_cmap('jet')) + +for a_useless_counter in range(40000): + + h = random.uniform(100,590) + p = 10**random.uniform(np.log10(100),np.log10(7000)) + + try: + # Using the EOS + CP.disable_TTSE_LUT(Ref) + rhoEOS = CP.Props('D','P',p,'H',h,Ref) + TEOS = CP.Props('T','P',p,'H',h,Ref) +## cpEOS = CP.Props('C','P',p,'H',h,Ref) + + # Using the TTSE method + CP.enable_TTSE_LUT(Ref) + CP.set_TTSE_mode(Ref,"TTSE") + rhoTTSE = CP.Props('D','P',p,'H',h,Ref) + TTTSE = CP.Props('T','P',p,'H',h,Ref) +## cpTTSE = CP.Props('C','P',p,'H',h,Ref) + + # Using the Bicubic method + CP.enable_TTSE_LUT(Ref) + CP.set_TTSE_mode(Ref,"BICUBIC") + rhoBICUBIC = CP.Props('D','P',p,'H',h,Ref) + TBICUBIC = CP.Props('T','P',p,'H',h,Ref) +## cpBICUBIC = CP.Props('C','P',p,'H',h,Ref) + +## errorTTSE = abs(TTTSE/TEOS-1)*100 +## errorBICUBIC = abs(TBICUBIC/TEOS-1)*100 + errorTTSE = abs(rhoTTSE/rhoEOS-1)*100 + errorBICUBIC = abs(rhoBICUBIC/rhoEOS-1)*100 +## errorTTSE = abs(cpTTSE/cpEOS-1)*100 +## errorBICUBIC = abs(cpBICUBIC/cpEOS-1)*100 + HHH1.append(h) + PPP1.append(p) + EEE1.append(errorTTSE) + + HHH2.append(h) + PPP2.append(p) + EEE2.append(errorBICUBIC) + + except ValueError as VE: + print VE + pass + +SC1 = ax1.scatter(HHH1, PPP1, s = 8, c = EEE1, edgecolors = 'none', cmap = plt.get_cmap('jet'), norm = cNorm) +SC2 = ax2.scatter(HHH2, PPP2, s = 8, c = EEE2, edgecolors = 'none', cmap = plt.get_cmap('jet'), norm = cNorm) + +ax1.set_title('Error in Density from TTSE') +ax2.set_title('Error in Density from Bicubic') + +for ax in [ax1, ax2]: + + ax.set_xlim(150, 550) + ax.set_ylim(100, 7000) + + ax.set_yscale('log') + + ticks = [100,200,400,600,800,1000,2000, 4000, 6000] + labels = [str(tick) for tick in ticks] + ax.set_yticks(ticks) + ax.set_yticklabels(labels) + ax.get_yaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter()) + + ticks = [150,250,350,450,550] + labels = [str(tick) for tick in ticks] + ax.set_xticks(ticks) + ax.set_xticklabels(labels) + + ax.tick_params(axis='y',which='minor', left='off') + + ax.set_xlabel('Enthalpy [kJ/kg]') + ax.set_ylabel('Pressure [kPa]') + + ax.plot(hL,pV,'k',lw = 4) + ax.plot(hV,pV,'k',lw = 4) + +cbar_ax = fig.add_axes([0.85, 0.15, 0.06, 0.7]) +CB = fig.colorbar(SC1, cax=cbar_ax) +CB.set_label(r'$(\rho/\rho_{EOS}-1)\times 100$ [%]') +#CB.set_label(r'$(T/T_{EOS}-1)\times 100$ [%]') + +plt.savefig('TTSE_BICUBIC.png', dpi = 300, transparent = True) +plt.savefig('TTSE_BICUBIC.pdf') +plt.close() \ No newline at end of file diff --git a/dev/scripts/check_hs.py b/dev/scripts/check_hs.py new file mode 100644 index 00000000..c66196f3 --- /dev/null +++ b/dev/scripts/check_hs.py @@ -0,0 +1,74 @@ +from CoolProp.Plots.Plots import hs +import CoolProp +from CoolProp.CoolProp import Props +import matplotlib.pyplot as plt +import numpy as np + +Fluid = 'Nitrogen' + +fig = plt.figure() +ax = fig.add_subplot(111) + +for Fluid in CoolProp.__fluids__: + + if Fluid == 'SES36': + continue + + ax.cla() + + h_crit = Props('H','T',Props(Fluid,"Tcrit"),'D',Props(Fluid,"rhocrit"),Fluid) + s_crit = Props('S','T',Props(Fluid,"Tcrit"),'D',Props(Fluid,"rhocrit"),Fluid) + + hL_Tmin = Props('H','T',Props(Fluid,"Tmin"),'Q',0,Fluid) + hV_Tmin = Props('H','T',Props(Fluid,"Tmin"),'Q',1,Fluid) + sL_Tmin = Props('S','T',Props(Fluid,"Tmin"),'Q',0,Fluid) + sV_Tmin = Props('S','T',Props(Fluid,"Tmin"),'Q',1,Fluid) + + hs(Fluid, axis = ax) + plt.plot(s_crit,h_crit,'rd') + plt.plot([sL_Tmin,sV_Tmin],[hL_Tmin,hV_Tmin],'--') + plt.gca().axhline(h_crit) + plt.gca().axhline(hV_Tmin) + + # Two-Phase + for T in np.linspace(Props(Fluid,"Tmin")+0.1,Props(Fluid,"Tcrit")-1e-3,30): + for Q in np.linspace(0, 1, 30): + try: + h = Props("H",'Q',Q,'T',T,Fluid) + s = Props("S",'Q',Q,'T',T,Fluid) + T = Props("T",'S',s,'H',h,Fluid) + #ax.plot(s,h,'o',mfc='none') + except ValueError as VE: + print T, Q , '|||', '"T","S",',s,',"H",',h,',"'+Fluid+'"', '|||', VE + ax.plot(s,h,'o',mfc='none') + + + for h in np.linspace(hL_Tmin, hV_Tmin + 1500,100): + for s in np.linspace(sL_Tmin+0.01,sV_Tmin,100): + try: + h_pmax = Props('H','S',s,'P',6*Props(Fluid,'pcrit'),Fluid) + except ValueError: + h_pmax = 0 + htriple_s = (hV_Tmin-hL_Tmin)/(sV_Tmin-sL_Tmin)*(s-sL_Tmin)+hL_Tmin + if h < htriple_s or h > h_pmax: continue + try: + T = Props("T",'S',s,'H',h,Fluid) + #ax.plot(s,h,'o',mfc='none',ms=6) + except ValueError: + ax.plot(s,h,'s',mfc='none') + + +## if Fluid =='Propane': +## ps = Props("P",'T',300,'Q',0,Fluid); +## hL = Props("H",'Q',0,'T',300,Fluid); +## sL = Props("S",'Q',0,'T',300,Fluid); +## h = Props("H",'P',ps,'T',299.5,Fluid); +## s = Props("S",'P',ps,'T',299.5,Fluid); +## print s,h,sL,hL +## plt.plot(s,h,'o') +## plt.plot(sL,hL,'d') +## plt.gca().axvline(s) +## plt.gca().axhline(268.75968916316691) + + fig.savefig('figs/'+Fluid+'.png',dpi=200) + fig.savefig('figs/'+Fluid+'.pdf') diff --git a/dev/scripts/derivative_tester.py b/dev/scripts/derivative_tester.py new file mode 100644 index 00000000..77c52b19 --- /dev/null +++ b/dev/scripts/derivative_tester.py @@ -0,0 +1,216 @@ +from __future__ import division +from CoolProp.CoolProp import Props, DerivTerms + +def finite_diff(Output,Input1,Val1,Input2,Val2,Fluid, index,deriv,order,type = 'centered',dx = 1e-3): + def f(index, dx): + if index == 1: + return Props(Output,Input1,Val1+dx,Input2,Val2,Fluid) + else: + return Props(Output,Input1,Val1,Input2,Val2+dx,Fluid) + + if deriv == 1: + if order == 1: + return (f(index,dx)-f(index,0))/(dx) + elif order == 2: + return (f(index,dx)-f(index,-dx))/(2*dx) + elif order == 4: + return (f(index,-2*dx)-8*f(index,-dx)+8*f(index,dx)-f(index,2*dx))/(12*dx) + elif deriv == 2: + if order == 2: + return (f(index,-dx)-2*f(index,0)+f(index,dx))/(dx**2) + elif order == 4: + return (-f(index,-2*dx)+16*f(index,-dx)-30*f(index,0)+16*f(index,dx)-f(index,2*dx))/(12*dx**2) + else: + raise ValueError + else: + raise ValueError + +## fluid = 'Water' +## T = 647.74374374374372#647#Props(fluid,'Tcrit')+1 +## rho = 322.32199999#358#Props(fluid,'rhocrit')+1 +## H = Props('H','T',T,'D',rho,fluid) +## P = Props('P','T',T,'D',rho,fluid) +## print T,rho,H,P + +fluid = 'R125' +T = 300 +rho = 1.5 +H = Props('H','T',T,'D',rho,fluid) +P = Props('P','T',T,'D',rho,fluid) +print T,rho,H,P + +dpdT__rho = DerivTerms('dpdT|rho',T,rho,fluid) +dpdrho__T = DerivTerms('dpdrho|T',T,rho,fluid) +dhdT__rho = DerivTerms('dhdT|rho',T,rho,fluid) +dhdrho__T = DerivTerms('dhdrho|T',T,rho,fluid) +print '*******************************************' +print 'CHECKING DERIVATIVES FROM EOS' +print '*******************************************' +dpdT__rho_num = finite_diff('P','T',T,'D',rho,fluid,1,1,4) +print 'dpdT|rho' +print dpdT__rho +print dpdT__rho_num + +dpdrho__T_num = finite_diff('P','T',T,'D',rho,fluid,2,1,4) +print 'dpdrho|T' +print dpdrho__T +print dpdrho__T_num + +dhdT__rho_num = finite_diff('H','T',T,'D',rho,fluid,1,1,4) +print 'dhdT|rho' +print dhdT__rho +print dhdT__rho_num + +dhdrho__T_num = finite_diff('H','T',T,'D',rho,fluid,2,1,4) +print 'dhdrho|T' +print dhdrho__T +print dhdrho__T_num +print +print '*******************************************' +print 'CHECKING HELMHOLTZ DERIVATIVES' +print '*******************************************' +dx = 1e-10 +Tc = Props(fluid,'Tcrit') +rhoc = Props(fluid,'rhocrit') +delta = rho/rhoc +tau = Tc/T + +def f(dx): + rho = rhoc*(delta+dx) + return DerivTerms('dphir_dDelta',T,rho,fluid) +print 'd2phir_dDelta2' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d2phir_dDelta2',T,rho,fluid) + +def f(dx): + rho = rhoc*(delta+dx) + return DerivTerms('d2phir_dDelta2',T,rho,fluid) +print 'd3phir_dDelta3' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d3phir_dDelta3',T,rho,fluid) + +def f(dx): + rho = rhoc*(delta+dx) + return DerivTerms('dphir_dTau',T,rho,fluid) +print 'd2phir_dDelta_dTau' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d2phir_dDelta_dTau',T,rho,fluid) + +def f(dx): + rho = rhoc*(delta+dx) + return DerivTerms('d2phir_dTau2',T,rho,fluid) +print 'd3phir_dDelta_dTau2' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d3phir_dDelta_dTau2',T,rho,fluid) + +def f(dx): + T = Tc/(tau+dx) + return DerivTerms('d2phir_dDelta2',T,rho,fluid) +print 'd3phir_dDelta2_dTau' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d3phir_dDelta2_dTau',T,rho,fluid) + +def f(dx): + T = Tc/(tau+dx) + return DerivTerms('dphir_dTau',T,rho,fluid) +print 'd2phir_dTau2' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d2phir_dTau2',T,rho,fluid) + +def f(dx): + T = Tc/(tau+dx) + return DerivTerms('d2phir_dTau2',T,rho,fluid) +print 'd3phir_dTau3' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d3phir_dTau3',T,rho,fluid) + +def f(dx): + T = Tc/(tau+dx) + return DerivTerms('dphi0_dTau',T,rho,fluid) +print 'd2phi0_dTau2' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d2phi0_dTau2',T,rho,fluid) + +def f(dx): + T = Tc/(tau+dx) + return DerivTerms('d2phi0_dTau2',T,rho,fluid) +print 'd3phi0_dTau3' +print (f(-2*dx)-8*f(-dx)+8*f(dx)-f(2*dx))/(12*dx) +print DerivTerms('d3phi0_dTau3',T,rho,fluid) +print +print '*******************************************' +print 'CHECKING FIRST DERIVATIVES OF PROPERTIES' +print '*******************************************' + +A = dpdT__rho*dhdrho__T-dpdrho__T*dhdT__rho + +dT_dh_num = finite_diff('T','H',H,'P',P,fluid,1,1,4) +dT_dh = 1/Props('C','T',T,'D',rho,fluid) +print 'dTdh|p' +print dT_dh +print dT_dh_num + +dT_dp_num = finite_diff('T','H',H,'P',P,fluid,2,1,4) +dT_dp = 1/A*dhdrho__T +print 'dTdp|h' +print dT_dp +print dT_dp_num + +drho_dh_num = finite_diff('D','H',H,'P',P,fluid,1,1,4) +drho_dh = 1/A*dpdT__rho +print 'drhodh|p' +print drho_dh_num +print drho_dh_num + +drho_dp_num = finite_diff('D','H',H,'P',P,fluid,2,1,4) +drho_dp = -1/A*dhdT__rho +print 'drhodp|h' +print drho_dp +print drho_dp_num + +ds_dh_num = finite_diff('S','H',H,'P',P,fluid,1,1,4) +ds_dh = 1/T +print 'dsdh|p' +print ds_dh +print ds_dh_num + +ds_dp_num = finite_diff('S','H',H,'P',P,fluid,2,1,4) +ds_dp = -1/(T*rho) +print 'dsdp|h' +print ds_dp +print ds_dp_num + + +print +print '*******************************************' +print 'CHECKING SECOND DERIVATIVES OF PROPERTIES' +print '*******************************************' + +## d2T_dh2_num = finite_diff('T','H',H,'P',P,fluid,1,2,4) +## d2T_dh2 = 1/Props('C','T',T,'D',rho,fluid) +## print 'dTdh|p' +## print dT_dh +## print dT_dh_num + +d2s_dh2 = -(1/T/T)*dT_dh +d2s_dh2_num = finite_diff('S','H',H,'P',P,fluid,1,2,4,dx = 10) +print 'd2sdh2|p' +print d2s_dh2 +print d2s_dh2_num + +d2s_dp2 = 1/(T**2*rho)*dT_dp+1/(T*rho**2)*drho_dp +d2s_dp2_num = finite_diff('S','H',H,'P',P,fluid,2,2,4,dx = 10) +print 'd2sdp2|h' +print d2s_dp2 +print d2s_dp2_num + +d2s_dhdp = -(1/T/T)*dT_dp +d2s_dhdp_num = finite_diff('S','H',H,'P',P,fluid,1,2,4) +print 'd2s_dhdp' +print d2s_dhdp +print d2s_dhdp_num + +## d2s_dhdp = -(1/T/T)*dT_dp +## print d2s_dhdp +## d2s_dhdp = 1/(T**2*rho)*dT_dh+1/(T*rho**2)*drho_dh +## print d2s_dhdp diff --git a/dev/scripts/fit_ancillary_ODRPACK.py b/dev/scripts/fit_ancillary_ODRPACK.py new file mode 100644 index 00000000..ebc9f91a --- /dev/null +++ b/dev/scripts/fit_ancillary_ODRPACK.py @@ -0,0 +1,360 @@ +from __future__ import division +import numpy as np +from scipy.odr import * +import scipy.optimize, random +import matplotlib.pyplot as plt +import textwrap +import random +from CoolProp.CoolProp import Props, get_REFPROPname + +def rsquared(x, y): + """ + Return R^2 where x and y are array-like. + + from http://stackoverflow.com/questions/893657/how-do-i-calculate-r-squared-using-python-and-numpy + """ + import scipy.stats + slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y) + return r_value**2 + +def saturation_density(Ref, ClassName, form = 'A', LV = 'L', perc_error_allowed = 0.3, fName = None, add_critical = True): + """ + + Parameters + ---------- + Ref : string + The fluid name for the fluid that will be used to generate the saturation data + ClassName : The name of the class that will be used in the C++ code + form : string + If ``'A'``, use a term of the form + """ + + if fName is None: + Tc = Props(Ref,'Tcrit') + pc = Props(Ref,'pcrit') + rhoc = Props(Ref,'rhocrit') + Tmin = Props(Ref,'Tmin') + print Ref,Tmin,Props(Ref,'Ttriple') + + TT = np.linspace(Tmin, Tc-1, 1000) + TT = list(TT) + # Add temperatures around the critical temperature + if add_critical: + for dT in [1e-10,1e-9,1e-8,1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1]: + TT.append(Tc-dT) + TT = np.array(sorted(TT)) + + p = Props('P','T',TT,'Q',0,Ref) + rhoL = Props('D','T',TT,'Q',0,Ref) + rhoV = Props('D','T',TT,'Q',1,Ref) + else: + Tc = 423.27 + pc = 3533 + rhoc = 470 + Tmin = 273 + lines = open(fName,'r').readlines() + TT,p,rhoL,rhoV = [],[],[],[] + for line in lines: + _T,_p,_rhoL,_rhoV = line.split(' ') + TT.append(float(_T)) + p.append(float(_p)) + rhoL.append(float(_rhoL)) + rhoV.append(float(_rhoV)) + + TT = np.array(TT) + + # Start with a large library of potential powers + n = [i/6.0 for i in range(1,200)]#+[0.35+i/200.0 for i in range(1,70)]+[0.05+0.01*i for i in range(1,70)] + + x = 1.0-TT/Tc + + if LV == 'L': + rho_EOS = rhoL + elif LV == 'V': + rho_EOS = rhoV + else: + raise ValueError + + if form == 'A': + y = np.array(rho_EOS)/rhoc-1 + elif form == 'B': + y = (np.log(rho_EOS)-np.log(rhoc))*TT/Tc + else: + raise ValueError + + max_abserror = 0 + while len(n) > 3: + print max_abserror, len(n) + + def f_p(B, x): + # B is a vector of the parameters. + # x is an array of the current x values. + return sum([_B*x**(_n) for _B,_n in zip(B,n)]) + + linear = Model(f_p) + mydata = Data(x, y) + myodr = ODR(mydata, linear, beta0=[0]*len(n)) + myoutput = myodr.run() + + beta = myoutput.beta + sd = myoutput.sd_beta + + if form == 'A': + rho_fit = (f_p(myoutput.beta,x)+1)*rhoc + elif form == 'B': + rho_fit = np.exp(f_p(myoutput.beta,x)*Tc/TT)*rhoc + else: + raise ValueError + + print 'first,last',TT[0],TT[-1],rho_fit[0],rho_fit[-1], rho_EOS[0], rho_EOS[-1] + + max_abserror = np.max(np.abs(rho_fit/rho_EOS-1))*100 + + dropped_indices = [i for i in range(len(n)) if abs(sd[i])<1e-15 ] + if dropped_indices: + for i in reversed(sorted(dropped_indices)): + n.pop(i) + print 'popping...', len(n), 'terms remaining' + continue + + if max_abserror > perc_error_allowed: + break # The last good run will be used + else: + print max_abserror + Ncoeffs = str(list(myoutput.beta)).lstrip('[').rstrip(']') + tcoeffs = str(n).lstrip('[').rstrip(']') + maxerror = max_abserror + if form == 'A': + code_template = textwrap.dedent( + """ + for (int i=1; i<={count:d}; i++) + {{ + summer += N[i]*pow(theta,t[i]); + }} + return reduce.rho*(summer+1); + """.format(count = len(n)) + ) + elif form == 'B': + code_template = textwrap.dedent( + """ + for (int i=1; i<={count:d}; i++) + {{ + summer += N[i]*pow(theta,t[i]); + }} + return reduce.rho*exp(reduce.T/T*summer); + """.format(count = len(n)) + ) + else: + raise ValueError + + # Find the least significant entry (the one with the largest relative standard error) + # and remove it + n.pop(np.argmax(np.abs(sd/beta))) + + #Remove elements that are not + template = textwrap.dedent( + """ + double {name:s}Class::rhosat{LV:s}(double T) + {{ + // Maximum absolute error is {error:f} % between {Tmin:f} K and {Tmax:f} K + const double t[] = {{0, {tcoeffs:s}}}; + const double N[] = {{0, {Ncoeffs:s}}}; + double summer=0,theta; + theta=1-T/reduce.T; + \t{code:s} + }} + """) + the_string = template.format(tcoeffs = tcoeffs, + Ncoeffs = Ncoeffs, + name = ClassName, + Tmin = Tmin, + Tmax = TT[-1], + error = maxerror, + code = code_template, + LV = LV + ) + f = open('anc.txt','a') + f.write(the_string) + f.close() + return the_string + +def saturation_pressure_brute(Ref, ClassName): + + Tc = Props(Ref,'Tcrit') + pc = Props(Ref,'pcrit') + rhoc = Props(Ref,'rhocrit') + Tmin = Props(Ref,'Tmin') + + TT = np.linspace(Tmin+1e-6, Tc-0.00001, 300) + p = np.array([Props('P','T',T,'Q',0,Ref) for T in TT]) + rhoL = np.array([Props('D','T',T,'Q',0,Ref) for T in TT]) + rhoV = np.array([Props('D','T',T,'Q',1,Ref) for T in TT]) + + Np = 10 + + max_abserror = 99999 + bbest = [] + + x = 1.0-TT/Tc + y = (np.log(rhoL)-np.log(rhoc))*TT/Tc + + def f_p(B, x): + # B is a vector of the parameters. + # x is an array of the current x values. + return sum([_B*x**(_n) for _B,_n in zip(B,b)]) + + linear = Model(f_p) + mydata = Data(x, y) + + for attempt in range(300): + + n = [i/6.0 for i in range(1,100)]+[0.35+i/200.0 for i in range(1,70)]+[0.05+0.01*i for i in range(1,70)] + b = [] + for _ in range(6): + i = random.randint(0,len(n)-1) + b.append(n.pop(i)) + + myodr = ODR(mydata, linear, beta0 = [1]*len(b)) + myoutput = myodr.run() + + b = np.array(b) + + keepers = np.abs(myoutput.sd_beta/myoutput.beta) < 0.1 + if any(keepers): + b = b[keepers] + + myodr = ODR(mydata, linear, beta0 = [1]*len(b)) + myoutput = myodr.run() + + rho_fit = np.exp(f_p(myoutput.beta, x)*Tc/TT)*rhoc + abserror = np.max(np.abs(rho_fit/rhoL-1))*100 + print '.' + if abserror < max_abserror: + max_abserror = abserror + bbest = b + betabest = myoutput.beta + print abserror, myoutput.sum_square, myoutput.sd_beta/myoutput.beta + +def saturation_pressure(Ref, ClassName, fName = None, LV = None): + + if fName is None: + Tc = Props(Ref,'Tcrit') + pc = Props(Ref,'pcrit') + rhoc = Props(Ref,'rhocrit') + Tmin = Props(Ref,'Tmin') + + TT = np.linspace(Tmin+1e-6, Tc-0.00001, 300) + pL = Props('P','T',TT,'Q',0,Ref) + pV = Props('P','T',TT,'Q',1,Ref) + rhoL = Props('D','T',TT,'Q',0,Ref) + rhoV = Props('D','T',TT,'Q',1,Ref) + else: + Tc = 423.27 + pc = 3533 + rhoc = 470 + Tmin = 273 + lines = open(fName,'r').readlines() + TT,p,rhoL,rhoV = [],[],[],[] + for line in lines: + _T,_p,_rhoL,_rhoV = line.split(' ') + TT.append(float(_T)) + p.append(float(_p)) + rhoL.append(float(_rhoL)) + rhoV.append(float(_rhoV)) + + TT = np.array(TT) + + Np = 60 + n = range(1,Np) + max_abserror = 0 + while len(n) > 3: + + def f_p(B, x): + # B is a vector of the parameters. + # x is an array of the current x values. + return sum([_B*x**(_n/2.0) for _B,_n in zip(B,n)]) + + x = 1.0-TT/Tc + if LV == 'L': + y = (np.log(pL)-np.log(pc))*TT/Tc + elif LV == 'V' or LV is None: + y = (np.log(pV)-np.log(pc))*TT/Tc + + linear = Model(f_p) + mydata = Data(x, y) + myodr = ODR(mydata, linear, beta0=[0]*len(n)) + myoutput = myodr.run() + + beta = myoutput.beta + sd = myoutput.sd_beta + + p_fit = np.exp(f_p(myoutput.beta,x)*Tc/TT)*pc + if LV == 'L': + max_abserror = np.max(np.abs((p_fit/pL)-1)*100) + elif LV == 'V' or LV is None: + max_abserror = np.max(np.abs((p_fit/pV)-1)*100) + + print max_abserror + psat_error = max_abserror + + dropped_indices = [i for i in range(len(n)) if abs(sd[i])<1e-15 ] + if dropped_indices: + #for i in reversed(dropped_indices): + # randomly drop one of them + n.pop(random.choice(dropped_indices)) + continue + + if max_abserror < 0.5: #Max error is 0.5% + Ncoeffs = str(list(myoutput.beta)).lstrip('[').rstrip(']') + tcoeffs = str(n).lstrip('[').rstrip(']') + maxerror = max_abserror + N = len(n) + else: + break + + # Find the least significant entry (the one with the largest standard error) + # and remove it + n.pop(np.argmax(sd)) + + #Remove elements that are not + import textwrap + template = textwrap.dedent( + """ + double {name:s}Class::psat{LV:s}(double T) + {{ + // Maximum absolute error is {psat_error:f} % between {Tmin:f} K and {Tmax:f} K + const double t[]={{0, {tcoeffs:s}}}; + const double N[]={{0, {Ncoeffs:s}}}; + double summer=0,theta; + theta=1-T/reduce.T; + for (int i=1;i<={N:d};i++) + {{ + summer += N[i]*pow(theta,t[i]/2); + }} + return reduce.p.Pa*exp(reduce.T/T*summer); + }} + """) + the_string = template.format(N = len(n)+1, + tcoeffs = tcoeffs, + Ncoeffs = Ncoeffs, + name = ClassName, + Tmin = Tmin, + Tmax = TT[-1], + psat_error = maxerror, + LV = LV if LV in ['L','V'] else '' + ) + + f = open('anc.txt','a') + f.write(the_string) + f.close() + return the_string + +if __name__ == '__main__': + for RPFluid,Fluid in [('REFPROP-MIX:R32[0.47319469]&R125[0.2051091]&R134a[0.32169621]','R407F'), + #for RPFluid,Fluid in [('R11','R11'), + ]: + # saturation_pressure_brute(RPFluid, Fluid + # saturation_pressure(RPFluid, Fluid, LV = 'L') + # saturation_pressure(RPFluid, Fluid, LV = 'V') + saturation_density(RPFluid, Fluid, form='A', LV='L') + saturation_density(RPFluid, Fluid, form='B', LV='V', perc_error_allowed = 0.4) diff --git a/dev/scripts/fit_avoid_ECS.py b/dev/scripts/fit_avoid_ECS.py new file mode 100644 index 00000000..b7680949 --- /dev/null +++ b/dev/scripts/fit_avoid_ECS.py @@ -0,0 +1,166 @@ +from CoolProp import CoolProp as CP +from PDSim.misc.datatypes import Collector +import numpy as np +import matplotlib.pyplot as plt +from scipy.odr import * +import textwrap + +# +#fluid = 'Propane' +#Rfluid = 'REFPROP-propane' +#e_k = 263.88 +#sigma = 0.49748 +# +fluid = 'DimethylEther' +Rfluid = 'REFPROP-DME' +e_k = 329.72 +sigma = 0.5529 +molemass = CP.Props(fluid,'molemass') + +Ttriple = CP.Props(fluid,'Ttriple') +Tcrit = CP.Props(fluid,'Tcrit') +rhocrit = CP.Props(fluid,'rhocrit') +n = 6 +m = 3 +NP = 1 +Nb = 0 +N = (n-1)*(m+1)+3+Nb + +mu,mu_dilute,RHO,TTT = Collector(),Collector(),Collector(),Collector() + +rhomax = CP.Props('D','T',Ttriple,'Q',0,fluid) +#Build a database of "experimental" data +for T in np.linspace(Ttriple,Tcrit+30,400): + for rho in np.linspace(1e-10,rhomax,400): + muval = CP.Props('V','T',T,'D',rho,Rfluid) + mudilute = CP.viscosity_dilute(fluid,T,rho,e_k,sigma) + + #Want positive value, and single-phase + if (muval > 0 and T > Tcrit or rho > CP.rhosatL_anc(fluid,T) or rho < CP.rhosatV_anc(fluid,T)): + mu << muval + mu_dilute << mudilute + TTT << T + RHO << rho + +from CoolProp.Plots.Plots import Trho +Trho(fluid) +plt.plot(RHO.vec,TTT.vec,'.') +plt.show() + +#tau = np.array(TTT.vec)/Tcrit +tau = np.array(TTT.vec)/Tcrit +delta = np.array(RHO.vec)/rhocrit +Tstar = np.array(TTT.vec)/e_k + +#Define the objective function +def OBJECTIVE_fit(c,x): + tau = x[0,:] + delta = x[1,:] + #Unpack the inputs into e matrix and f vector + e = np.zeros((n+1,m+1)) + + sum = 0 + k = 0 + for i in range(2,n+1): + for j in range(0,m+1): + e[i][j] = c[k] + sum += e[i][j]*delta**i/tau**j + k += 1 + + for o in range(0,NP): + f1 = c[k+o*3] + g1 = c[k+1+o*3] + g2 = c[k+2+o*3] + + delta_0 = g1*(1+g2*tau**0.5) + sum += f1*(delta/(delta_0-delta)-delta/delta_0) + return sum + np.array(mu_dilute.vec) + +print 'starting fit' +XXX = np.r_[np.array(tau,ndmin = 2), np.array(delta,ndmin=2)] +mod = Model(OBJECTIVE_fit) +mydata = Data(XXX.copy(), np.array(mu.vec)) +beta0 = [1 for _ in range(N)] +myodr = ODR(mydata, mod, beta0=beta0) +myoutput = myodr.run() +myoutput.pprint() +print myoutput.sum_square +YFIT = OBJECTIVE_fit(myoutput.beta,XXX) +plt.plot(np.array(mu.vec),YFIT/np.array(mu.vec),'o') +plt.show() + +rel_error = (YFIT)/np.array(mu.vec)-1 +MAE = np.mean(np.abs(rel_error))*100 +SSE = np.sum(np.power(YFIT-np.array(mu.vec),2)) +print SSE + +def write_output(c): + e = np.zeros((n+1,m+1)) + k = 0 + edata = '' + for i in range(2,n+1): + erow = '' + for j in range(0,m+1): + e[i][j] = c[k] + erow += 'e[{i:d}][{j:d}] = {val:0.16g}; '.format(val = e[i][j],i=i,j=j) + k += 1 + edata += erow + '\n' + f1 = c[k] + g1 = c[k+1] + g2 = c[k+2] + + template = textwrap.dedent( + """ + double {name:s}Class::viscosity_Trho(double T, double rho) + {{ + // This function was generated by fitting REFPROP ECS data + // to the functional form of Vogel, 1998 (propane viscosity) + // The script entitled dev/fit_avoid_ECS.py was used to make this + // function. The mean absolute error of the fit is equal to + // {MAE:g} % + + double delta_0, sum, DELTA_H_eta, e_k, sigma, tau, delta; + double e[{n:d}+1][{m:d}+1]; + + tau = T/reduce.T; //[Opposite to normal definition] + delta = rho/reduce.rho; + + // Load the coefficients + double f1 = {f1:0.16g}, g1 = {g1:0.16g}, g2 = {g2:0.16g}; + for (int i=0;i<={n:d};i++){{ for(int j=0;j<={m:d};j++){{ e[i][j]=0.0; }} }} + {edata:s} + delta_0=g1*(1+g2*sqrt(tau)); //[no units] + sum=0; + for (int i=2;i<={n:d};i++){{ + for (int j=0;j<={m:d};j++){{ + sum += e[i][j]*pow(delta,i)/pow(tau,j); + }} + }} + DELTA_H_eta = sum + f1*(delta/(delta_0-delta)-delta/delta_0); //[Pa-s] + + try{{ + // Get the ECS params for the fluid if it has them + ECSParams(&e_k,&sigma); + }} + catch(NotImplementedError) + {{ + throw ValueError(format("Your fluid does not implement ECSParams")); + }} + + return viscosity_dilute(T,e_k,sigma) + DELTA_H_eta; + }} + """ + ) + + values = dict(f1 = f1, + g1 = g1, + g2 = g2, + n = n, + m = m, + name = fluid, + edata = edata, + MAE = MAE) + + print template.format(**values) + +write_output(myoutput.beta) diff --git a/dev/scripts/fit_shape_factor.py b/dev/scripts/fit_shape_factor.py new file mode 100644 index 00000000..8a01b4b2 --- /dev/null +++ b/dev/scripts/fit_shape_factor.py @@ -0,0 +1,235 @@ +from CoolProp import CoolProp as CP +from PDSim.misc.datatypes import Collector +import numpy as np +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +from scipy.odr import * +import textwrap + +fluid_REF = 'Propane' +Tcrit_REF = CP.Props(fluid_REF,'Tcrit') +omega_REF = CP.Props(fluid_REF,"accentric") +molemass_REF = CP.Props(fluid_REF,'molemass') +rhocrit_REF = CP.Props(fluid_REF,'rhocrit') +Zcrit_REF = CP.DerivTerms('Z',Tcrit_REF,rhocrit_REF,fluid_REF) + +fluid = 'DimethylEther' +molemass = CP.Props(fluid,'molemass') +Ttriple = CP.Props(fluid,'Ttriple') +Tcrit = CP.Props(fluid,'Tcrit') +omega = CP.Props(fluid,"accentric") +rhocrit = CP.Props(fluid,'rhocrit') +pcrit = CP.Props(fluid,'pcrit') +Zcrit = CP.DerivTerms('Z',Tcrit,rhocrit,fluid) + +N = 12 + +RHO,TTT,RHO0,TTT0 = Collector(),Collector(),Collector(),Collector() + +rhomax = CP.Props('D','T',Ttriple,'Q',0,fluid) +#Build a database of "experimental" data +for T in np.linspace(Ttriple,Tcrit+50,80): + for rho in np.linspace(1e-10,rhomax,80): + T0,rho0 = CP.conformal_Trho(fluid, fluid_REF, T, rho) + + p = CP.Props('P', 'T', T, 'D', rho, fluid) + + ar = CP.DerivTerms("phir",T,rho,fluid) + ar_REF = CP.DerivTerms("phir",T0,rho0,fluid_REF) + Z = CP.DerivTerms("Z",T,rho,fluid) + Z_REF = CP.DerivTerms("Z",T0,rho0,fluid_REF) + + #goodstate = ((T > Tcrit and p > pcrit) or (T CP.rhosatL_anc(fluid,T) )) + goodstate = (T > Tcrit or rho > CP.rhosatL_anc(fluid,T) or rho < CP.rhosatV_anc(fluid,T) ) + #goodstate = True + + #Want positive value, and single-phase + if ((T0/T)>0.1 and T/T0*Tcrit_REF/Tcrit < 3 and T0/T < 1e6 and goodstate): + if abs((ar-ar_REF)*2+(Z-Z_REF)**2) > 1e-5: + print ar-ar_REF,Z-Z_REF + TTT << T + RHO << rho + TTT0 << T0 + RHO0 << rho0 + +tau = Tcrit/np.array(TTT.vec) +delta = np.array(RHO.vec)/rhocrit +THETA = np.array(TTT.vec)/np.array(TTT0.vec)*Tcrit_REF/Tcrit +PHI = np.array(RHO0.vec)/np.array(RHO.vec)*rhocrit/rhocrit_REF #Ratio of MOLAR densities - here the molar masses cancel out to make phi non-dimensional + +from CoolProp.Plots.Plots import Trho +Trho(fluid) +#plt.plot(RHO.vec,TTT.vec,'.') +#plt.show() + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') +ax.scatter(np.array(RHO.vec),np.array(TTT.vec),THETA) +plt.close('all') + +print 'rhomin = ',np.min(RHO.vec) + +#Define the objective function +def OBJECTIVE_theta(c,x): + tau = x[0,:] + delta = x[1,:] + + A1 = c[0]-c[1]*np.log(tau) + A2 = c[2]-c[3]*np.log(tau) + A3 = c[4]-c[5]*np.log(tau) + A4 = c[6]-c[7]*np.log(tau)**2 + DELTA = (delta-1)**2+(tau-1)**2 + PSI_theta = c[8]*delta*np.exp(-c[9]*DELTA**2) + return 1+(omega-omega_REF)*(A1+A2*np.exp(-delta**2)+A3*np.exp(-delta**c[10])+A4*np.exp(-delta**c[11])+PSI_theta) + +#Define the objective function +def OBJECTIVE_phi(c,x): + tau = x[0,:] + delta = x[1,:] + + A1 = c[0]-c[1]*np.log(tau) + A2 = c[2]-c[3]*np.log(tau) + A3 = c[4]-c[5]*np.log(tau) + A4 = c[6]-c[7]*np.log(tau)**2 + DELTA = (delta-1)**2+(tau-1)**2 + PSI_theta = c[8]*delta*np.exp(-c[9]*DELTA**2) + return Zcrit_REF/Zcrit*(1+(omega-omega_REF)*(A1+A2*np.exp(-delta**2)+A3*np.exp(-delta**c[10])+A4*np.exp(-delta**c[11])+PSI_theta)) + +print 'starting fit for theta' +XXX = np.r_[np.array(tau,ndmin = 2), np.array(delta,ndmin=2)] + +def fit_theta(): + mod = Model(OBJECTIVE_theta) + mydata = Data(XXX.copy(), THETA) + beta0 = [100 for _ in range(N)] + myodr = ODR(mydata, mod, beta0=beta0) + myoutput = myodr.run() + myoutput.pprint() + print myoutput.sum_square + YFIT = OBJECTIVE_theta(myoutput.beta,XXX) + plt.plot(THETA,YFIT,'o',mfc='none') + plt.show() + ERR = YFIT-THETA + MAE = np.mean(np.abs(YFIT/THETA-1))*100 + from CoolProp.Plots.Plots import Trho + Trho(fluid) + plt.plot(np.array(RHO.vec)[np.abs(ERR)<5e-2],np.array(TTT.vec)[np.abs(ERR)<5e-2],'.') + plt.show() + + return myoutput.beta,MAE + +def fit_phi(): + mod = Model(OBJECTIVE_phi) + mydata = Data(XXX.copy(), PHI) + beta0 = [100 for _ in range(N)] + myodr = ODR(mydata, mod, beta0=beta0) + myoutput = myodr.run() + myoutput.pprint() + print myoutput.sum_square + YFIT = OBJECTIVE_theta(myoutput.beta,XXX) + plt.plot(PHI,YFIT,'o',mfc='none') + plt.show() + ERR = YFIT-PHI + from CoolProp.Plots.Plots import Trho + Trho(fluid) + plt.plot(np.array(RHO.vec)[np.abs(ERR)<5e-2],np.array(TTT.vec)[np.abs(ERR)<5e-2],'.') + MAE = np.mean(np.abs(YFIT/PHI-1))*100 + plt.show() + + return myoutput.beta,MAE + +c,theta_MAE = fit_theta() +d,phi_MAE = fit_phi() + +def write_output(c,d, theta_MAE, phi_MAE): + import time + from datetime import date + cdata = ', '.join(['{val:0.16g}'.format(val = v) for v in c]) + ddata = ', '.join(['{val:0.16g}'.format(val = v) for v in d]) + name = fluid + rhomin = np.min(RHO.vec) + timestamp = date.fromtimestamp(time.time()).strftime("%A, %d. %B %Y") + template = textwrap.dedent( + """ + double {name:s}Class::viscosity_Trho(double T, double rho) + {{ + /* + Fitting of shape factor curves to R134a data. This method is employed because solving + for the shape factors is computationally very expensive and not very nice + convergence behavior is experienced. Thus we can use the ECS method, + but with about the execution time of a conventional viscosity correlation. + + This function code was automatically generated by the fit_shape_factor.py + script in the dev/ folder on {timestamp:s} + + Mean absolute errors of shape factor prediction: + theta = {theta_MAE:g} % + phi = {phi_MAE:g} % + */ + + double e_k, sigma, tau, delta, A1, A2, A3, A4, theta, Tc, Tc0, T0, rho0; + double DELTA, PSI_theta, psi, f, h, F_eta, M, M0, delta_omega, rho0bar; + double B1, B2, B3, B4, PSI_phi, Zc, Zc0, rhoc0, rhoc, log_tau, phi, rhobar; + + double c[] = {{{cdata:s}}}; + double d[] = {{{ddata:s}}}; + + tau = reduce.T/T; + delta = rho/reduce.rho; + + R134aClass R134a = R134aClass(); + R134a.post_load(); + delta_omega = params.accentricfactor-R134a.params.accentricfactor; + + Zc = reduce.p/(reduce.rho*R()*reduce.T); + Zc0 = R134a.reduce.p/(R134a.reduce.rho*R134a.R()*R134a.reduce.T); + Tc = reduce.T; + Tc0 = R134a.reduce.T; + rhoc = reduce.rho; + rhoc0 = R134a.reduce.rho; + M = params.molemass; + M0 = R134a.params.molemass; + + rhobar = rho/M; + + if (rho > {rhomin:g}) + {{ + DELTA = pow(delta-1,2)+pow(tau-1,2); + log_tau = log(tau); + + A1 = c[0]-c[1]*log_tau; + A2 = c[2]-c[3]*log_tau; + A3 = c[4]-c[5]*log_tau; + A4 = c[6]-c[7]*pow(log_tau,2); + PSI_theta = c[8]*delta*exp(-c[9]*pow(DELTA,2)); + theta = 1+(delta_omega)*(A1+A2*exp(-pow(delta,2))+A3*exp(-pow(delta,c[10]))+A4*exp(-pow(delta,c[11]))+PSI_theta); + + B1 = d[0]-d[1]*log_tau; + B2 = d[2]-d[3]*log_tau; + B3 = d[4]-d[5]*log_tau; + B4 = d[6]-d[7]*pow(log_tau,2); + PSI_phi = d[8]*delta*exp(-d[9]*pow(DELTA,2)); + phi = Zc0/Zc*(1+(delta_omega)*(B1+B2*exp(-pow(delta,2))+B3*exp(-pow(delta,d[10]))+B4*exp(-pow(delta,d[11]))+PSI_phi)); + }} + else + {{ + // Assume unity shape factors at low density + theta = 1.0; phi = 1.0; + }} + T0 = T*Tc0/theta/Tc; + h = M/M0*rhoc0/rhoc*phi; + rho0bar = rhobar*h; + rho0 = M0*rho0bar; + + psi = ECS_psi_viscosity(delta); + f = T/T0; + F_eta = sqrt(f)*pow(h,-2.0/3.0)*sqrt(M/M0); + ECSParams(&e_k,&sigma); + return viscosity_dilute(T,e_k,sigma) + R134a.viscosity_background(T0,rho0*psi)*F_eta; + }} + """ + ) + + print template.format(**locals()) + +write_output(c,d,theta_MAE,phi_MAE) diff --git a/dev/scripts/generate_constants_module.py b/dev/scripts/generate_constants_module.py new file mode 100644 index 00000000..6476dfeb --- /dev/null +++ b/dev/scripts/generate_constants_module.py @@ -0,0 +1,147 @@ +import os,shutil + +""" + +A little script to wrap the params enum for use in Cython code + +Ian Bell, Feb 2013 + +""" + +def params_constants(): + fName = os.path.join('..','..','CoolProp','GlobalConstants.h') + + contents = open(fName,'r').read().replace('\n','') + + # Find the block that is something like : + """ + /* These are constants for the input and output parameters */ + enum params { + /* Properties and others */ + iB, iT, iP, iD, iC, iC0, iO, iU, iH, iS, iA, iG, iQ, iV, iL, iTfreeze, iPsat, iI, iDpdT, iDrhodT_p, iCritSplineT, iPrandtl, + /* Constants */ + iMM, iTmax, iTmin, iAccentric, iDipole, iODP, iGWP20, iGWP100, iGWP500, + /* Reduced quantities; triple point and critical point */ + iRhoreduce, iTreduce, iPtriple, iTtriple, iHcrit, iPcrit, iRhocrit, iScrit, iTcrit, + /* Phase identifiers */ + iPhase, iPHASE_LIQUID, iPHASE_GAS, iPHASE_SUPERCRITICAL, iPHASE_TWOPHASE, + /* Derivatives */ + iDERdh_dp__rho, iDERdh_dp__v, iDERZ, iDERdZ_dDelta, iDERdZ_dTau, iDERB, iDERdB_dT, iDERC, iDERdC_dT, iDERphir, + iDERdphir_dTau, iDERdphir_dDelta, iDERd2phir_dTau2, iDERd2phir_dDelta2, iDERd2phir_dDelta_dTau, iDERd3phir_dDelta3, + iDERd3phir_dDelta2_dTau, iDERd3phir_dDelta_dTau2, iDERd3phir_dTau3, iDERphi0, iDERdphi0_dTau, iDERd2phi0_dTau2, + iDERdphi0_dDelta, iDERd2phi0_dDelta2, iDERd2phi0_dDelta_dTau, iDERd3phi0_dTau3, iDERdp_dT__rho, + iDERdp_drho__T, iDERdh_dT__rho, iDERdh_drho__T, iDERdrho_dT__p, iDERdrho_dh__p, + iDERdrho_dp__h, iDERrho_smoothed, iDERdrho_smoothed_dh, iDERdrho_smoothed_dp, iDERdrhodh_constp_smoothed, + iDERdrhodp_consth_smoothed, iDERIsothermalCompressibility, + }; + """ + + left = contents.find('{', contents.find('enum params')); + right = contents.find('}') + entries = contents[left+1:right].split(',') + print entries + import re + entries = [re.sub(r"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/", "", e.strip()) for e in entries] + entries = filter(lambda e: len(e) > 0, entries) + + #Write the PXD definition file + pxd_output_file = open('param_constants_header.pxd','w') + pxd_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\n\ncdef extern from "CoolProp.h":\n\tenum params:\n') + for param in entries: + param = param.strip() + pxd_output_file.write('\t\t'+param+'\n') + pxd_output_file.close() + + #Write the PYX implementation file + pyx_output_file = open('param_constants.pyx','w') + pyx_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\ncimport param_constants_header\n\n') + for param in entries: + param = param.strip() + pyx_output_file.write(param+' = '+'param_constants_header.'+param+'\n') + pyx_output_file.close() + + shutil.copy2('param_constants_header.pxd',os.path.join('..','..','wrappers','Python','CoolProp','param_constants_header.pxd')) + shutil.copy2('param_constants.pyx',os.path.join('..','..','wrappers','Python','CoolProp','param_constants.pyx')) + +def phase_constants(): + + fName = os.path.join('..','..','CoolProp','GlobalConstants.h') + with open(fName,'r') as f: + lines = f.readlines() + + #Find the line that is something like : enum phases {iLiquid, iSupercritical, iGas, iTwoPhase}; + + the_line = None + for line in lines: + if line.find('enum phases') > -1: + the_line = line.strip() + break + + if the_line is None: + raise ValueError('enum params line was not found in CoolProp.h') + else: + the_line = the_line.replace('}','{') + the_params = the_line.split('{')[1].split(',') + + #Write the PXD definition file + pxd_output_file = open('phase_constants_header.pxd','w') + pxd_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\n\ncdef extern from "CoolProp.h":\n\tenum phase:\n') + for param in the_params: + param = param.strip() + pxd_output_file.write('\t\t'+param+'\n') + pxd_output_file.close() + + #Write the PYX implementation file + pyx_output_file = open('phase_constants.pyx','w') + pyx_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\ncimport phase_constants_header\n\n') + for param in the_params: + param = param.strip() + pyx_output_file.write(param+' = '+'phase_constants_header.'+param+'\n') + pyx_output_file.close() + + shutil.copy2('phase_constants_header.pxd',os.path.join('..','..','wrappers','Python','CoolProp','phase_constants_header.pxd')) + shutil.copy2('phase_constants.pyx',os.path.join('..','..','wrappers','Python','CoolProp','phase_constants.pyx')) + +def unit_systems_constants(): + + fName = os.path.join('..','..','CoolProp','GlobalConstants.h') + with open(fName,'r') as f: + lines = f.readlines() + + #Find the line that is something like : enum phases {iLiquid, iSupercritical, iGas, iTwoPhase}; + + the_line = None + for line in lines: + if line.find('enum unit_systems') > -1: + the_line = line.strip() + break + + if the_line is None: + raise ValueError('unit_systems line was not found in CoolProp.h') + else: + the_line = the_line.replace('}','{') + the_params = the_line.split('{')[1].split(',') + + #Write the PXD definition file + pxd_output_file = open('unit_systems_constants_header.pxd','w') + pxd_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\n\ncdef extern from "CoolProp.h":\n\tenum unit_systems:\n') + for param in the_params: + param = param.strip() + pxd_output_file.write('\t\t'+param+'\n') + pxd_output_file.close() + + #Write the PYX implementation file + pyx_output_file = open('unit_systems_constants.pyx','w') + pyx_output_file.write('#This file is automatically generated by the generate_constants_module.py script in dev/scripts.\n#DO NOT MODIFY THE CONTENTS OF THIS FILE!\ncimport unit_systems_constants_header\n\n') + for param in the_params: + param = param.strip() + pyx_output_file.write(param+' = '+'unit_systems_constants_header.'+param+'\n') + pyx_output_file.close() + + shutil.copy2('unit_systems_constants_header.pxd',os.path.join('..','..','wrappers','Python','CoolProp','unit_systems_constants_header.pxd')) + shutil.copy2('unit_systems_constants.pyx',os.path.join('..','..','wrappers','Python','CoolProp','unit_systems_constants.pyx')) + +if __name__=='__main__': + params_constants() + phase_constants() + unit_systems_constants() \ No newline at end of file diff --git a/dev/scripts/peng-robinson.py b/dev/scripts/peng-robinson.py new file mode 100644 index 00000000..0331aa76 --- /dev/null +++ b/dev/scripts/peng-robinson.py @@ -0,0 +1,22 @@ +from __future__ import division + +from CoolProp import CoolProp as CP + +Fluid = 'CO2' +R = 8.314472/CP.Props(Fluid,'molemass') +Tc = CP.Props(Fluid,'Tcrit') +pc = CP.Props(Fluid,'pcrit') +w = CP.Props(Fluid,'accentric') + +a = 0.457235*R**2*Tc**2/pc +b = 0.077796*R*Tc/pc +kappa = 0.37464+1.54226*w-0.26992*w**2 + +T = 298.15 +rho = 1000 +v = 1/rho +Tr = T/Tc +alpha = (1+kappa*(1-Tr**0.5))**2 + +p = R*T/(v-b)-a*alpha/(v**2+2*b*v-b**2) +print p, CP.Props('P', 'T', T, 'D', rho, Fluid) \ No newline at end of file diff --git a/dev/scripts/setup.py b/dev/scripts/setup.py new file mode 100644 index 00000000..54d78118 --- /dev/null +++ b/dev/scripts/setup.py @@ -0,0 +1,14 @@ +from distutils.core import setup +from Cython.Build import cythonize + +import sys,numpy +import Cython +Cython.Compiler.Options.annotate = True +sys.argv += ['build_ext','--inplace'] + +setup( + name = "My hello app", + ext_modules = cythonize('summer.pyx'), # accepts a glob pattern + include_dirs = [numpy.get_include()] +) + diff --git a/dev/scripts/speed_test_TTSE_BICUBIC.py b/dev/scripts/speed_test_TTSE_BICUBIC.py new file mode 100644 index 00000000..b6ed5597 --- /dev/null +++ b/dev/scripts/speed_test_TTSE_BICUBIC.py @@ -0,0 +1,31 @@ +import timeit +import CoolProp.CoolProp as CP + +def time_check(N, h, p, TTSE = False, mode = 'TTSE'): + + if TTSE: + if mode =='TTSE': + setup = "import CoolProp; import CoolProp.CoolProp as CP; CP.enable_TTSE_LUT('Water'); CP.set_TTSE_mode('Water','TTSE'); CP.Props('T','H',500,'P',10000,'Water'); IWater = CP.get_Fluid_index('Water'); from CoolProp.param_constants import iT,iH,iP,iD" + elif mode =='BICUBIC': + setup = "import CoolProp; import CoolProp.CoolProp as CP; CP.enable_TTSE_LUT('Water'); CP.set_TTSE_mode('Water','BICUBIC'); CP.Props('T','H',500,'P',10000,'Water'); IWater = CP.get_Fluid_index('Water'); from CoolProp.param_constants import iT,iH,iP,iD" + else: + raise ValueError() + else: + setup = "import CoolProp.CoolProp as CP; IWater = CP.get_Fluid_index('Water'); CP.disable_TTSE_LUT('Water'); from CoolProp.param_constants import iT,iH,iP,iD" + + time = timeit.Timer("CP.IProps(iD,iH,"+str(h)+",iP,"+str(p)+",IWater)",setup).timeit(N)/N*1e6 + value = CP.Props('D','H',h,'P',p,'Water') + + return time, value + +values = dict(subcooled = (500,10000), twophase = (2000,10000), superheated = (3000,10000), supercritical = (2000,30000)) + +N = 10000 +for k in ['subcooled','twophase','superheated','supercritical']: + h, p = values[k] + + time_EOS, value_EOS = time_check(N, h, p, TTSE = False) + time_TTSE, value_TTSE = time_check(N, h, p, TTSE = True) + time_BICUBIC, value_BICUBIC = time_check(N, h, p, TTSE = True, mode='BICUBIC') + + print k, h, p, (value_TTSE/value_EOS-1.0)*100, (value_BICUBIC/value_EOS-1.0)*100, time_EOS/time_TTSE, time_EOS/time_BICUBIC \ No newline at end of file diff --git a/dev/scripts/summer.pyx b/dev/scripts/summer.pyx new file mode 100644 index 00000000..637674c7 --- /dev/null +++ b/dev/scripts/summer.pyx @@ -0,0 +1,22 @@ + +cimport cython + +import numpy as np + + +@cython.boundscheck(False) +cpdef sum_function( double [:] B, double [:] x, double [:] n, double [:] out): + + + cdef int i,j + cdef double aa + cdef double do + cdef int Nx = len(x) + cdef int Nn = len(n) + + out[:] = 0 + + for i in xrange(Nx): + for j in range(Nn): + out[i] += B[j]*x[i]**n[j] + \ No newline at end of file diff --git a/dev/scripts/test_R245_fit.py b/dev/scripts/test_R245_fit.py new file mode 100644 index 00000000..8bf80306 --- /dev/null +++ b/dev/scripts/test_R245_fit.py @@ -0,0 +1,31 @@ +from CoolProp import CoolProp as CP +from PDSim.misc.datatypes import Collector +import numpy as np +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt + +fluid = 'R245fa' +Ttriple = CP.Props(fluid,'Ttriple') +Tcrit = CP.Props(fluid,'Tcrit') + +RHO,TTT,RHO0,TTT0,ERR = Collector(),Collector(),Collector(),Collector(),Collector() + +rhomax = CP.Props('D','T',Ttriple,'Q',0,'R245fa') +#Build a database of "experimental" data +for T in np.linspace(Ttriple,Tcrit+50,80): + for rho in np.linspace(1e-10,rhomax,80): + if (T > Tcrit or rho > CP.rhosatL_anc(fluid,T) or rho < CP.rhosatV_anc(fluid,T) ): + h = CP.Props('H','T',T,'D',rho,'R245fa') + p = CP.Props('P','T',T,'D',rho,'R245fa') + + RHO << rho + TTT << T + ERR << h + TTT0 << p + +fig = plt.figure() +ax1 = fig.add_subplot(121, projection='3d') +ax1.scatter(np.array(RHO.vec),np.array(TTT.vec),ERR.vec) +ax2 = fig.add_subplot(122, projection='3d') +ax2.scatter(np.array(RHO.vec),np.array(TTT.vec),TTT0.vec) +plt.show() diff --git a/dev/scripts/validate_TTSE.py b/dev/scripts/validate_TTSE.py new file mode 100644 index 00000000..a62e56ff --- /dev/null +++ b/dev/scripts/validate_TTSE.py @@ -0,0 +1,193 @@ +import matplotlib +matplotlib.use('WXAgg') +import CoolProp +from CoolProp.Plots import Ph +from CoolProp.Plots.Plots import Trho,Ps,PT,Prho +import CoolProp.CoolProp as CP +import matplotlib.pyplot as plt +from matplotlib.colors import LogNorm +import random +import numpy as np +from math import log,exp +random.seed() + +def check_Trho(N=5000,param='P',fluid='R245fa'): + values = [] + CP.enable_TTSE_LUT(fluid) + try: + CP.Props('D','P',CP.Props(fluid,'ptriple')+1,'Q',1,fluid) + except: + return [] + #CP.set_TTSESinglePhase_LUT_size(fluid,500,500) + hmin,hmax,pmin,pmax = CP.get_TTSESinglePhase_LUT_range(fluid) + for i in range(N): + x1 = random.random() + h = x1*hmin+(1-x1)*hmax + x2 = random.random() + logp = x2*log(pmin)+(1-x2)*log(pmax) + p = exp(logp) + try: + try: + #Get the T,rho from the EOS directly without the LUT + CP.disable_TTSE_LUT(fluid) + s = CP.Props('S','P',p,'H',h,fluid) + T = CP.Props('T','P',p,'H',h,fluid) + rho = CP.Props('D','P',p,'H',h,fluid) + except: + print 'EOS failed: ', p,h + raise + #Now get p,h from the T,rho + CP.enable_TTSE_LUT(fluid) + val = CP.Props(param,'T',T,'D',rho,fluid) + CP.disable_TTSE_LUT(fluid) + valREFPROP = CP.Props(param,'T',T,'D',rho,fluid) + #print T,rho,val,valREFPROP,(val/valREFPROP-1)*100 + if abs(val-valREFPROP)>0.00001: + raise ValueError + except ValueError: + print 'TTSE failed: ', T,rho + values.append((T,rho,0,0)) + pass + return values + + +fluid = 'R245fa' +values = check_Trho(param='P',fluid=fluid) +if len(values) == 0: + print 'good' + +T,rho,values_withTTSE,values_noTTSE = zip(*values) + +CP.disable_TTSE_LUT(fluid) +Trho(fluid) + +plt.plot(rho,T,'.',mfc='none') +plt.savefig('Trho_TTSE_Validation.png',dpi=300) +plt.gca().set_xscale('log') +plt.show() + +quit() + +def check_Pother(N=5000,param='T',other='S',fluid='R245fa'): + values = [] + CP.enable_TTSE_LUT(fluid) + try: + CP.Props('D','P',CP.Props(fluid,'ptriple')+1,'Q',1,fluid) + except: + return [] + #CP.set_TTSESinglePhase_LUT_size(fluid,500,500) + hmin,hmax,pmin,pmax = CP.get_TTSESinglePhase_LUT_range(fluid) + for i in range(N): + x1 = random.random() + h = x1*hmin+(1-x1)*hmax + x2 = random.random() + logp = x2*log(pmin)+(1-x2)*log(pmax) + p = exp(logp) + try: + try: + #Get the T,rho from the EOS directly without the LUT + CP.disable_TTSE_LUT(fluid) + s = CP.Props('S','P',p,'H',h,fluid) + T = CP.Props('T','P',p,'H',h,fluid) + rho = CP.Props('D','P',p,'H',h,fluid) + except: + print 'EOS failed: ', p,h + raise + #Now get p,h from the T,rho + CP.enable_TTSE_LUT(fluid) + if other =='S': + other_val = s + elif other =='T': + other_val = T + elif other == 'D': + other_val = rho + else: + raise ValueError + val = CP.Props(param,'P',p,other,other_val,fluid) + except ValueError: + print 'TTSE failed: ', p,other_val + values.append((p,other_val,0,0)) + pass + return values + +fluid = 'R245fa' +for other in ['D','T','S']: + if other == 'D': + param = 'T' + elif other == 'T': + param = 'D' + elif other == 'S': + param = 'T' + values = check_Pother(other=other) + if len(values) == 0: + print 'good: ',other + continue + + p,othervals,values_withTTSE,values_noTTSE = zip(*values) + + CP.disable_TTSE_LUT(fluid) + if other =='D': + Prho(fluid) + elif other =='S': + Ps(fluid) + elif other =='T': + PT(fluid) + + plt.plot(othervals,p,'.',mfc='none') + plt.gca().set_yscale('log') + plt.savefig('P'+other+'_TTSE_Validation.png',dpi=300) + plt.show() + +quit() + +def check(N=5000,param='D',fluid = 'R245fa'): + values = [] + CP.enable_TTSE_LUT(fluid) + + try: + CP.Props('D','P',CP.Props(fluid,'ptriple')+1,'Q',1,fluid) + except: + return [] + #CP.set_TTSESinglePhase_LUT_size(fluid,500,500) + hmin,hmax,pmin,pmax = CP.get_TTSESinglePhase_LUT_range(fluid) + for i in range(N): + x1 = random.random() + h = x1*hmin+(1-x1)*hmax + x2 = random.random() + logp = x2*log(pmin)+(1-x2)*log(pmax) + p = exp(logp) + try: + CP.enable_TTSE_LUT(fluid) + value_withTTSE = CP.Props(param,'P',p,'H',h,fluid) + CP.disable_TTSE_LUT(fluid) + value_noTTSE = CP.Props(param,'P',p,'H',h,fluid) + values.append((h,p,value_withTTSE,value_noTTSE)) + except ValueError: + pass + + return values + +Ncols = 10 +Nrows = 10 +for parameter in ['D','T','S','C']: + fig = plt.figure(figsize=(40,40)) + for Index,fluid in enumerate(sorted(CoolProp.__fluids__)): + print fluid + ax = fig.add_subplot(Ncols,Nrows,Index+1) + ax.set_title(fluid) + values = check(fluid = fluid, param = parameter) + if len(values) == 0: + continue + h,p,values_withTTSE,values_noTTSE = zip(*values) + ax = fig.add_subplot(Ncols,Nrows,Index+1) + CP.disable_TTSE_LUT(fluid) + Ph(fluid) + CP.enable_TTSE_LUT(fluid) + error = (np.array(values_withTTSE)/np.array(values_noTTSE)-1)*100 + plt.scatter(h,p,s=8,c=np.abs(error),norm = LogNorm(),edgecolor='none',vmin = 1e-16, vmax = 10) + plt.gca().set_yscale('log') + plt.colorbar() + + plt.savefig(parameter+'_TTSE.png',dpi=200) + plt.tight_layout() + plt.close() \ No newline at end of file diff --git a/dev/scripts/viscosity_builder.py b/dev/scripts/viscosity_builder.py new file mode 100644 index 00000000..b04caa5b --- /dev/null +++ b/dev/scripts/viscosity_builder.py @@ -0,0 +1,118 @@ +from math import sqrt,exp +from CoolProp.CoolProp import Props +import numpy as np +import matplotlib.pyplot as plt +from scipy.odr import * +from math import log +E_K = {'REFPROP-Ammonia':386, + 'REFPROP-Argon':143.2 + } +SIGMA = {'REFPROP-Ammonia':0.2957, + 'REFPROP-Argon':0.335 + } + +E_K['REFPROP-Propane']=263.88 +SIGMA['REFPROP-Propane']=0.49748 +E_K['REFPROP-R32']=289.65 +SIGMA['REFPROP-R32']=0.4098 +E_K['REFPROP-R245fa'] = 329.72 +SIGMA['REFPROP-R245fa'] = 0.5529 + + +def viscosity_dilute(fluid,T,e_k,sigma): + """ + T in [K], e_k in [K], sigma in [nm] + viscosity returned is in [Pa-s] + """ + + Tstar = T/e_k + molemass = Props(fluid,'molemass') + if fluid == 'Propane' or fluid == 'REFPROP-Propane': + a = [0.25104574,-0.47271238,0,0.060836515,0] + theta_star = exp(a[0]*pow(log(Tstar),0)+a[1]*pow(log(Tstar),1)+a[3]*pow(log(Tstar),3)); + eta_star = 0.021357*sqrt(molemass*T)/(pow(sigma,2)*theta_star)/1e6; + return eta_star + + # From Neufeld, 1972, Journal of Chemical Physics - checked coefficients + OMEGA_2_2 = 1.16145*pow(Tstar,-0.14874)+ 0.52487*exp(-0.77320*Tstar)+2.16178*exp(-2.43787*Tstar) + # Using the leading constant from McLinden, 2000 since the leading term from Huber 2003 gives crazy values + eta_star = 26.692e-3*sqrt(molemass*T)/(pow(sigma,2)*OMEGA_2_2)/1e6 + return eta_star + +def viscosity_linear(fluid, T, rho, e_k, sigma): + """ + Implements the method of Vogel 1998 (Propane) for the linear part + """ + N_A=6.02214129e23 + molemass = Props(fluid,'molemass') + Tstar = T/e_k + b= [-19.572881,219.73999,-1015.3226,2471.01251,-3375.1717,2491.6597,-787.26086,14.085455,-0.34664158] + s = sum([b[i]*pow(Tstar,-0.25*i) for i in range(7)]) + + B_eta_star = s+b[7]*pow(Tstar,-2.5)+b[8]*pow(Tstar,-5.5) #//[no units] + B_eta = N_A*pow(sigma/1e9,3)*B_eta_star #[m3/mol] + return viscosity_dilute(fluid,T,e_k,sigma)*B_eta*rho/molemass*1000 + +from PDSim.misc.datatypes import Collector +RHO = Collector() +TT = Collector() +DELTA = Collector() +TAU = Collector() +VV = Collector() +VV0 = Collector() +VV1 = Collector() +VVH = Collector() + +fluid = 'REFPROP-R32' +Tc = Props(fluid,'Tcrit') +rhoc = Props(fluid,'rhocrit') +for T in np.linspace(290,Props(fluid,'Tcrit')-0.1,100): + rhoV = Props('D','T',T,'Q',1,fluid) + rhoL = Props('D','T',T,'Q',0,fluid) + rhomax = Props('D','T',Props(fluid,'Tmin'),'Q',0,fluid) + for rho in list(np.linspace(rhoL,rhomax,100)):#+list(np.linspace(rhoV,0.0001,100)): + #for rho in list(np.linspace(rhoV,0.0001,100)): + mu_0 = viscosity_dilute(fluid,T,E_K[fluid],SIGMA[fluid]) + mu_1 = viscosity_linear(fluid,T,rho,E_K[fluid],SIGMA[fluid]) + mu = Props('V','T',T,'D',rho,fluid) + VV << mu + VV0 << mu_0 + VV1 << mu_1 + VVH << mu-mu_0-mu_1 + TT << T + RHO << rho + DELTA << rho/rhoc + TAU << Tc/T + +def f_RHS(E, DELTA_TAU, VV): + k = 0 + sum = 0 + DELTA = DELTA_TAU[0,:] + TAU = DELTA_TAU[1,:] + for i in range(2,5): + for j in range(3): + sum += E[k]*DELTA**i/TAU**j + k += 1 +# f1,f2,f3,g1,g2 = E[k],E[k+1],E[k+2],E[k+3],E[k+4] +# DELTA0 = g1*(1+g2*np.sqrt(TAU)) +# sum += (f1+f2/TAU+f3/TAU/TAU)*(DELTA/(DELTA0-DELTA)-DELTA/DELTA0) + print np.mean(np.abs(((sum/VV-1)*100))),'%' + return sum + +log_muH = np.log(VVH.v().T) + +x = np.c_[DELTA.v().T, TAU.v().T].T +y = VVH.v() + +linear = Model(f_RHS, extra_args = (y,) ) +mydata = Data(x, y) +myodr = ODR(mydata, linear, beta0=np.array([0.1]*17),) +myoutput = myodr.run() +E = myoutput.beta +print E + +#plt.plot(TT.vec, y,'b.',TT.vec, f_RHS(E, x, y),'r.') +#plt.show() +#plt.plot() +plt.plot(y.T,f_RHS(E, x, y)) +plt.show() \ No newline at end of file diff --git a/doc/notebooks/Acetic acid specific heat check.ipynb b/doc/notebooks/Acetic acid specific heat check.ipynb new file mode 100644 index 00000000..2286c4e2 --- /dev/null +++ b/doc/notebooks/Acetic acid specific heat check.ipynb @@ -0,0 +1,80 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\n", + "import CoolProp\n", + "import CoolProp.CoolProp as CP\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Tc = 590.7\n", + "rhoc = 351\n", + "b_0 =3.66766530\n", + "b_1 =-0.210687796\n", + "b_2 =-0.781330239\n", + "b_3 =0.130979005\n", + "b_4 =2.09502491\n", + "b_5 =6.28891793\n", + "k_1 =-3.94616949\n", + "k_2 =5.48487930\n", + "\n", + "T = np.array([290,450])\n", + "tau = Tc/T\n", + "c_0 = b_0+1\n", + "c_1 = b_1/(-0.5)\n", + "c_2 = b_2/(-1.0/6.0)\n", + "c_3 = b_3/(-1.0/12.0)\n", + "c_4 = b_4\n", + "c_5 = b_5\n", + "R = 8.314472/60.05196\n", + "cp = R*(c_0+c_1/tau+c_2/tau**2+c_3/tau**3+c_5*(c_4*tau)**2*np.exp(-c_4*tau)/(1-np.exp(-c_4*tau))**2)\n", + "print cp" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[ 1.0342473 1.45158917]\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/AllFirstPartialDerivatives.ipynb b/doc/notebooks/AllFirstPartialDerivatives.ipynb new file mode 100644 index 00000000..a8b1a109 --- /dev/null +++ b/doc/notebooks/AllFirstPartialDerivatives.ipynb @@ -0,0 +1,98 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Jacobians to get derivatives in terms of $\\tau$ and $\\delta$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Based on the paper \"On the Use of Jacobians in Thermodynamics\" of Benjamin Carroll, Journal Chemical Education, 1965\n", + "\n", + "Express a partial derivative as\n", + "$$\\left(\\frac{\\partial T}{\\partial P}\\right)_H = \\frac{\\partial(T,H)}{\\partial(P,H)} = \\left| \\begin{array}{cc} \\left(\\frac{\\partial T}{\\partial P}\\right)_H & \\left(\\frac{\\partial H}{\\partial P}\\right)_H \\\\ \\left(\\frac{\\partial T}{\\partial H}\\right)_P & \\left(\\frac{\\partial H}{\\partial H}\\right)_P \\end{array} \\right| = \\left(\\frac{\\partial T}{\\partial P}\\right)_H\\left(\\frac{\\partial H}{\\partial H}\\right)_P-\\left(\\frac{\\partial T}{\\partial H}\\right)_P\\left(\\frac{\\partial H}{\\partial P}\\right)_H$$\n", + "\n", + "$\\left(\\frac{\\partial H}{\\partial P}\\right)_H = 0$ and $\\left(\\frac{\\partial H}{\\partial H}\\right)_P = 1$\n", + "\n", + "If there is a common term and it is in the same column, it is the thing held constant (see above).\n", + "\n", + "If there is a common term and it is in the opposite column, it is the thing held constant, but you need to add a sign change:\n", + "\n", + "$$ \\frac{\\partial(T,H)}{\\partial(H,P)} = -\\left(\\frac{\\partial T}{\\partial P}\\right)_H$$\n", + "\n", + "You can do a change of variables by applying it to numerator and denominator\n", + "\n", + "$$ \\left(\\frac{\\partial T}{\\partial P}\\right)_H = \\frac{\\partial(T,H)}{\\partial(P,H)} = \\frac{\\frac{\\partial(T,H)}{\\partial(x,y)}}{\\frac{\\partial(P,H)}{\\partial(x,y)}}$$\n", + "\n", + "Where... (drumroll please)... we can use $\\tau$ and $\\delta$ as the independent variables $x$ and $y$. So we can express the Jacobian in terms of $\\tau$ and $\\delta$ directly.\n", + "\n", + "$$ \\left(\\frac{\\partial T}{\\partial P}\\right)_h = \\frac{\\partial(T,h)}{\\partial(P,h)} = \\frac{\\displaystyle\\frac{\\partial(T,h)}{\\partial(\\tau,\\delta)}}{\\displaystyle\\frac{\\partial(P,h)}{\\partial(\\tau,\\delta)}} = \\displaystyle\\frac{\\left| \\begin{array}{cc} \\left(\\frac{\\partial T}{\\partial \\tau}\\right)_\\delta & \\left(\\frac{\\partial h}{\\partial \\tau}\\right)_\\delta \\\\ \\left(\\frac{\\partial T}{\\partial \\delta}\\right)_\\tau & \\left(\\frac{\\partial h}{\\partial \\delta}\\right)_\\tau \\end{array} \\right|}{\\left| \\begin{array}{cc} \\left(\\frac{\\partial P}{\\partial \\tau}\\right)_\\delta & \\left(\\frac{\\partial h}{\\partial \\tau}\\right)_\\delta \\\\ \\left(\\frac{\\partial P}{\\partial \\delta}\\right)_\\tau & \\left(\\frac{\\partial h}{\\partial \\delta}\\right)_\\tau \\end{array} \\right|} = \\frac{\\left(\\frac{\\partial T}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial h}{\\partial \\delta}\\right)_\\tau-\\left(\\frac{\\partial T}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial h}{\\partial \\tau}\\right)_\\delta}{\\left(\\frac{\\partial P}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial h}{\\partial \\delta}\\right)_\\tau-\\left(\\frac{\\partial P}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial h}{\\partial \\tau}\\right)_\\delta}$$\n", + "\n", + "Or more generally\n", + "\n", + "$$ \\left(\\frac{\\partial A}{\\partial B}\\right)_C = \\frac{\\left(\\frac{\\partial A}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_\\tau-\\left(\\frac{\\partial A}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta}{\\left(\\frac{\\partial B}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_\\tau-\\left(\\frac{\\partial B}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta} = \\frac{N}{D}$$\n", + "\n", + "The duplicated derivatives should be cached for speed. Anyway, they will be cached since we will use an AbstractState instance. Just need to calculate all partial derivatives of fundamental variables (T,p,$\\rho$,h,u,s) with respect to $\\tau$ and $\\delta$. 12 derivatives, all easy to numerically validate and 2 are trivial ($dT/d\\tau$ and $d\\rho/d\\delta$)\n", + "\n", + "As also derived in \"Partial derivatives of thermodynamic state properties for dynamic simulation\", Matthis Thorade & Ali Saadat., 2013, DOI 10.1007/s12665-013-2394-z\n" + ] + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Second partial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\\left(\\frac{\\partial N}{\\partial \\delta}\\right)_{\\tau} = \\left(\\frac{\\partial A}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial^2 C}{\\partial \\delta^2}\\right)_{\\tau}+\\left(\\frac{\\partial^2 A}{\\partial \\tau\\partial\\delta}\\right)\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_{\\tau}-\\left(\\frac{\\partial A}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial^2 C}{\\partial \\tau\\partial\\delta}\\right)-\\left(\\frac{\\partial^2 A}{\\partial \\delta^2}\\right)_{\\tau}\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta$$\n", + "\n", + "$$\\left(\\frac{\\partial D}{\\partial \\delta}\\right)_{\\tau} = \\left(\\frac{\\partial B}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial^2 C}{\\partial \\delta^2}\\right)_{\\tau}+\\left(\\frac{\\partial^2 B}{\\partial \\tau\\partial\\delta}\\right)\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_{\\tau}-\\left(\\frac{\\partial B}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial^2 C}{\\partial \\tau\\partial\\delta}\\right)-\\left(\\frac{\\partial^2 B}{\\partial \\delta^2}\\right)_{\\tau}\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\\left(\\frac{\\partial N}{\\partial \\tau}\\right)_{\\delta} = \\left(\\frac{\\partial A}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial^2 C}{\\partial \\delta\\partial\\tau}\\right)+\\left(\\frac{\\partial^2 A}{\\partial \\tau^2}\\right)_\\delta\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_{\\tau}-\\left(\\frac{\\partial A}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial^2 C}{\\partial \\tau^2}\\right)_\\delta-\\left(\\frac{\\partial^2 A}{\\partial \\delta\\partial\\tau}\\right)\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta$$\n", + "\n", + "$$\\left(\\frac{\\partial D}{\\partial \\tau}\\right)_{\\delta} = \\left(\\frac{\\partial B}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial^2 C}{\\partial \\delta\\partial\\tau}\\right)+\\left(\\frac{\\partial^2 B}{\\partial \\tau^2}\\right)_\\delta\\left(\\frac{\\partial C}{\\partial \\delta}\\right)_{\\tau}-\\left(\\frac{\\partial B}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial^2 C}{\\partial \\tau^2}\\right)_\\delta-\\left(\\frac{\\partial^2 B}{\\partial \\delta\\partial\\tau}\\right)\\left(\\frac{\\partial C}{\\partial \\tau}\\right)_\\delta$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\\frac{\\partial}{\\partial \\tau}\\left( \\left(\\frac{\\partial A}{\\partial B}\\right)_C \\right)_\\delta = \\frac{D\\left(\\frac{\\partial N}{\\partial \\tau}\\right)_{\\delta}-N\\left(\\frac{\\partial D}{\\partial \\tau}\\right)_{\\delta}}{D^2}$$\n", + "\n", + "$$\\frac{\\partial}{\\partial \\delta}\\left( \\left(\\frac{\\partial A}{\\partial B}\\right)_C \\right)_\\tau = \\frac{D\\left(\\frac{\\partial N}{\\partial \\delta}\\right)_{\\tau}-N\\left(\\frac{\\partial D}{\\partial \\delta}\\right)_{\\tau}}{D^2}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\frac{\\partial}{\\partial D}\\left(\\left(\\frac{\\partial A}{\\partial B}\\right)_C\\right)_E = \\frac{\\frac{\\partial}{\\partial \\tau}\\left( \\left(\\frac{\\partial A}{\\partial B}\\right)_C \\right)_\\delta\\left(\\frac{\\partial E}{\\partial \\delta}\\right)_\\tau-\\frac{\\partial}{\\partial \\delta}\\left(\\left(\\frac{\\partial A}{\\partial B}\\right)_C\\right)_\\tau\\left(\\frac{\\partial E}{\\partial \\tau}\\right)_\\delta}{\\left(\\frac{\\partial D}{\\partial \\tau}\\right)_\\delta\\left(\\frac{\\partial E}{\\partial \\delta}\\right)_\\tau-\\left(\\frac{\\partial D}{\\partial \\delta}\\right)_\\tau\\left(\\frac{\\partial E}{\\partial \\tau}\\right)_\\delta}$$\n" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/AssociatingFluids.ipynb b/doc/notebooks/AssociatingFluids.ipynb new file mode 100644 index 00000000..08cd9535 --- /dev/null +++ b/doc/notebooks/AssociatingFluids.ipynb @@ -0,0 +1,605 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from sympy import *\n", + "init_session(quiet=True)\n", + "init_printing()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "IPython console for SymPy 0.7.3 (Python 2.7.2-32-bit) (ground types: python)\n" + ] + } + ], + "prompt_number": 30 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Associating Fluids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Yields a Helmholtz energy term in the form\n", + "\n", + "$$\\alpha^{ass} = A\\left(\\ln X-\\frac{X}{2}+\\frac{1}{2} \\right) $$\n", + "where\n", + "\n", + "$$X = \\frac{2}{\\sqrt{1+4\\bar\\Delta\\delta}+1}$$\n", + "\n", + "$$\\bar\\Delta(\\delta,\\tau) = g(\\eta(\\delta))[\\exp(\\bar\\varepsilon\\tau)-1]\\bar\\kappa$$\n", + "\n", + "$$\\eta = \\bar v_n\\delta $$\n", + "\n", + "$$ g(\\eta) = \\frac{1}{2}\\frac{2-\\eta}{(1-\\eta)^3} $$" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Derivatives of $g$ and $\\bar\\Delta$ with respect to $\\tau$ and $\\delta$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\frac{dg}{d\\eta} = 0.5\\frac{5-2\\eta}{(1-\\eta)^4} $$\n", + "\n", + "$$ \\frac{d^2g}{d\\eta^2} = 3\\frac{3-\\eta}{(1-\\eta)^5} $$\n", + "\n", + "$$ \\frac{d^3g}{d\\eta^3} = 6\\frac{7-2\\eta}{(1-\\eta)^6} $$\n", + "\n", + "$$\\left(\\frac{\\partial \\bar \\Delta}{\\partial \\delta} \\right)_{\\tau} = \\frac{dg(\\eta)}{d\\eta}[\\exp(\\bar\\varepsilon\\tau)-1]\\bar\\kappa\\bar v_n \\qquad \\mbox{(Eq. A35)} $$ \n", + "\n", + "$$\\left(\\frac{\\partial \\bar \\Delta}{\\partial \\tau} \\right)_{\\delta} = g(\\eta)\\bar\\kappa\\exp(\\bar\\varepsilon\\tau)\\bar \\varepsilon \\qquad \\mbox{(Eq. A55)}$$\n", + "\n", + "$$\\left(\\frac{\\partial^2 \\bar \\Delta}{\\partial \\delta^2} \\right)_{\\tau} = \\frac{d^2g(\\eta)}{d\\eta^2}[\\exp(\\bar\\varepsilon\\tau)-1]\\bar\\kappa\\bar v_n^2 \\qquad \\mbox{(Eq. A76)} $$ \n", + "\n", + "$$\\left(\\frac{\\partial^2 \\bar \\Delta}{\\partial \\tau^2} \\right)_{\\delta} = g(\\eta)\\bar\\kappa\\exp(\\bar\\varepsilon\\tau)\\bar \\varepsilon^2 \\qquad \\mbox{(Eq. A83)}$$\n", + "\n", + "$$\\frac{\\partial^2 \\bar \\Delta}{\\partial \\tau\\partial\\delta} = \\frac{dg(\\eta)}{d\\eta}\\exp(\\bar\\varepsilon\\tau)\\bar\\varepsilon\\bar\\kappa\\bar v_n \\qquad \\mbox{(Eq. A89)}$$" + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Newly derived terms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Following the patterns of the derivatives\n", + "\n", + "$$\\left(\\frac{\\partial^3 \\bar \\Delta}{\\partial \\tau^3} \\right)_{\\delta} = g(\\eta)\\bar\\kappa\\exp(\\bar\\varepsilon\\tau)\\bar \\varepsilon^3 $$\n", + "\n", + "$$\\frac{\\partial^3 \\bar \\Delta}{\\partial\\delta\\partial \\tau^2} = \\frac{dg(\\eta)}{d\\eta}\\bar\\kappa\\exp(\\bar\\varepsilon\\tau)\\bar \\varepsilon^2\\bar v_n$$\n", + "\n", + "$$\\frac{\\partial^3 \\bar \\Delta}{\\partial \\tau\\partial\\delta^2} = \\frac{d^2g(\\eta)}{d\\eta^2}\\exp(\\bar\\varepsilon\\tau)\\bar\\varepsilon\\bar\\kappa\\bar v_n^2$$\n", + "\n", + "$$\\left(\\frac{\\partial^3 \\bar \\Delta}{\\partial \\delta^3} \\right)_{\\tau} = \\frac{d^3g(\\eta)}{d\\eta^3}[\\exp(\\bar\\varepsilon\\tau)-1]\\bar\\kappa\\bar v_n^3 $$ " + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Derivatives of $X$ with respect to $\\tau$ and $\\delta$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\left(\\frac{\\partial X}{\\partial \\bar\\Delta}\\right)_{\\delta} = -\\frac{\\delta X^2}{2\\bar\\Delta\\delta X+1} $$\n", + "\n", + "$$ \\left(\\frac{\\partial X}{\\partial \\delta}\\right)_{\\bar\\Delta} = -\\frac{\\bar\\Delta X^2}{2\\bar\\Delta\\delta X+1} $$\n", + "\n", + "$$X_{\\delta} = \\left(\\frac{\\partial X}{\\partial \\delta}\\right)_{\\bar\\Delta}+\\left(\\frac{\\partial X}{\\partial \\bar\\Delta}\\right)_{\\delta}\\left(\\frac{\\partial \\bar \\Delta}{\\partial\\delta}\\right)_{\\tau} \\qquad\\mbox{(Eq. A32)}$$\n", + "\n", + "$$X_{\\delta} = -\\frac{X^2}{2\\bar\\Delta\\delta X+1}\\left[\\bar\\Delta+\\delta\\left(\\frac{\\partial \\bar\\Delta}{\\partial\\delta}\\right)_{\\tau}\\right] \\qquad\\mbox{(Eq. A36)}$$\n", + "\n", + "$$X_{\\tau} = \\left(\\frac{\\partial X}{\\partial \\bar\\Delta}\\right)_{\\tau,\\delta}\\left(\\frac{\\partial \\bar \\Delta}{\\partial\\tau}\\right)_{\\delta} \\qquad\\mbox{(Eq. A54)}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$X_{\\delta\\delta} = \\left(\\frac{\\partial X_\\delta}{\\partial \\delta}\\right)_{X,\\bar\\Delta,\\bar\\Delta_\\delta}+\\frac{\\partial X_\\delta}{\\partial X}\\left(\\frac{\\partial X}{\\partial \\delta}\\right)_{\\bar\\Delta}\n", + "+\\frac{\\partial X_\\delta}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}+\\frac{\\partial X_\\delta}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}+\\frac{\\partial X_\\delta}{\\partial \\bar\\Delta_\\delta}\\frac{\\partial \\bar\\Delta_\\delta}{\\partial \\delta}\\qquad \\mbox{(Eq. A74)}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$X_{\\tau\\tau} = \\frac{\\partial X_\\tau}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}\n", + "+\\frac{\\partial X_\\tau}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}+\\frac{\\partial X_\\tau}{\\partial \\bar\\Delta_\\tau}\\frac{\\partial \\bar\\Delta_\\tau}{\\partial \\tau}\\qquad \\mbox{(Eq. A81)}$$\n", + "\n", + "$$X_{\\tau\\tau} = \\frac{2\\bar\\Delta_{\\tau}^2\\delta^2X^3(\\bar\\Delta\\delta X+1)}{(2\\bar\\Delta\\delta X+1)^3}+\\frac{2\\delta^2 X^3\\bar\\Delta_{\\tau}^2}{(2\\bar\\Delta\\delta X+1)^2}-\\frac{\\delta X^2\\bar\\Delta_{\\tau\\tau}}{1+2\\bar\\Delta\\delta X}$$\n", + "\n", + "$$X_{\\tau\\tau} = X_{\\tau\\tau}(X(\\bar\\Delta(\\tau)),\\bar\\Delta,\\bar\\Delta_\\tau,\\bar\\Delta_{\\tau\\tau})$$" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Third order partials" + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Based on derivatives of $X_{\\tau\\tau}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$X_{\\tau\\tau\\tau} = \\frac{\\partial X_{\\tau\\tau}}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}\n", + "+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta_\\tau}\\frac{\\partial \\bar\\Delta_\\tau}{\\partial \\tau}+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta_{\\tau\\tau}}\\frac{\\partial \\bar\\Delta_{\\tau\\tau}}{\\partial \\tau}$$\n", + "\n", + "$$X_{\\delta\\tau\\tau} = \\frac{\\partial X_{\\tau\\tau}}{\\partial\\delta} + \\frac{\\partial X_{\\tau\\tau}}{\\partial X}\\frac{\\partial X}{\\partial \\delta}+ \\frac{\\partial X_{\\tau\\tau}}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}\n", + "+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta_\\tau}\\frac{\\partial \\bar\\Delta_\\tau}{\\partial \\delta}+\\frac{\\partial X_{\\tau\\tau}}{\\partial \\bar\\Delta_{\\tau\\tau}}\\frac{\\partial \\bar\\Delta_{\\tau\\tau}}{\\partial \\delta}$$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "X,delta,Delta,Delta_t,Delta_tt = symbols('X,delta,Delta,Delta_t,Delta_tt')\n", + "X_tt = (2*Delta_t**2*delta**2*X**3*(Delta*delta*X+1)/(2*Delta*delta*X+1)**3\n", + " +(2*delta**2*X**3*Delta_t**2)/(2*Delta*delta*X+1)**2\n", + " -(delta*X**2*Delta_tt)/(2*Delta*delta*X+1)\n", + " )\n", + "print 'dX = '+ccode(simplify(diff(X_tt,X)))\n", + "print 'ddelta = '+ccode(simplify(diff(X_tt,delta)))\n", + "print 'dDelta = '+ccode(simplify(diff(X_tt,Delta)))\n", + "print 'dDelta_t = '+ccode(simplify(diff(X_tt,Delta_t)))\n", + "print 'dDelta_tt = '+ccode(simplify(diff(X_tt,Delta_tt)))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "dX = 2*X*delta*(-6*Delta*pow(Delta_t, 2)*pow(X, 2)*pow(delta, 2)*(Delta*X*delta + 1) + 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) - Delta_tt*pow(2*Delta*X*delta + 1, 3) + X*delta*(Delta*Delta_tt + 3*pow(Delta_t, 2))*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4)\n", + "ddelta = pow(X, 2)*(-12*Delta*pow(Delta_t, 2)*pow(X, 2)*pow(delta, 2)*(Delta*X*delta + 1) + 2*pow(Delta_t, 2)*X*delta*(-Delta*X*delta + 2)*(2*Delta*X*delta + 1) - Delta_tt*pow(2*Delta*X*delta + 1, 3) + 2*X*delta*(Delta*Delta_tt + 2*pow(Delta_t, 2))*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta = 2*pow(X, 3)*pow(delta, 2)*(-6*pow(Delta_t, 2)*X*delta*(Delta*X*delta + 1) - 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) + Delta_tt*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta_t = 4*Delta_t*pow(X, 3)*pow(delta, 2)*(3*Delta*X*delta + 2)/pow(2*Delta*X*delta + 1, 3)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta_tt = -pow(X, 2)*delta/(2*Delta*X*delta + 1)\n" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Based on derivatives of $X_{\\delta\\delta}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$X_{\\delta\\delta\\delta} = \\frac{X_{\\delta\\delta}}{\\partial \\delta} + \\frac{\\partial X_{\\delta\\delta}}{\\partial X}\\frac{\\partial X}{\\partial \\delta}+\\frac{\\partial X_{\\delta\\delta}}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}\n", + "+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\delta}+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta_\\delta}\\frac{\\partial \\bar\\Delta_\\delta}{\\partial \\delta}+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta_{\\delta\\delta}}\\frac{\\partial \\bar\\Delta_{\\delta\\delta}}{\\partial \\delta}$$\n", + "\n", + "$$X_{\\delta\\delta\\tau} = \\frac{\\partial X_{\\delta\\delta}}{\\partial X}\\frac{\\partial X}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}\n", + "+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta}\\frac{\\partial \\bar\\Delta}{\\partial \\tau}+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta_\\delta}\\frac{\\partial \\bar\\Delta_\\delta}{\\partial \\tau}+\\frac{\\partial X_{\\delta\\delta}}{\\partial \\bar\\Delta_{\\delta\\delta}}\\frac{\\partial \\bar\\Delta_{\\delta\\delta}}{\\partial \\tau}$$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "X,delta,Delta,Delta_d,Delta_dd = symbols('X,delta,Delta,Delta_d,Delta_dd')\n", + " \n", + "X_dd = (X**2*(2*Delta**2*X-Delta_d)/(2*Delta*delta*X+1)**2\n", + " -(Delta+delta*Delta_d)*2*(Delta*delta*X**2+X)/(2*Delta*delta*X+1)**2*(-Delta*X**2/(2*Delta*delta*X+1))\n", + " -(Delta+delta*Delta_d)*2*(Delta*delta*X**2+X)/(2*Delta*delta*X+1)**2*(-delta*X**2/(2*Delta*delta*X+1))*Delta_d\n", + " +X**2*(2*delta**2*X*Delta_d-1)/(2*Delta*delta*X+1)**2*Delta_d\n", + " -delta*X**2/(2*Delta*delta*X+1)*Delta_dd\n", + " )\n", + "\n", + "print 'dX = '+ccode(simplify(diff(X_dd,X)))\n", + "print 'ddelta = '+ccode(simplify(diff(X_dd,delta)))\n", + "print 'dDelta = '+ccode(simplify(diff(X_dd,Delta)))\n", + "print 'dDelta_d = '+ccode(simplify(diff(X_dd,Delta_d)))\n", + "print 'dDelta_dd = '+ccode(simplify(diff(X_dd,Delta_dd)))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "dX = 2*X*(-6*Delta*pow(X, 2)*delta*pow(Delta + Delta_d*delta, 2)*(Delta*X*delta + 1) - Delta_dd*delta*pow(2*Delta*X*delta + 1, 3) + 2*X*(2*Delta*X*delta + 1)*(-Delta*Delta_d*delta*(2*Delta_d*X*pow(delta, 2) - 1) - Delta*delta*(2*pow(Delta, 2)*X - Delta_d) + Delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + Delta_d*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1)) + pow(2*Delta*X*delta + 1, 2)*(3*pow(Delta, 2)*X + Delta*Delta_dd*X*pow(delta, 2) + Delta*X*(Delta + Delta_d*delta) + pow(Delta_d, 2)*X*pow(delta, 2) + Delta_d*X*delta*(Delta + Delta_d*delta) + Delta_d*(2*Delta_d*X*pow(delta, 2) - 1) - Delta_d))/pow(2*Delta*X*delta + 1, 4)\n", + "ddelta = pow(X, 2)*(-24*pow(Delta, 4)*pow(X, 3)*delta - 8*pow(Delta, 3)*Delta_d*pow(X, 3)*pow(delta, 2) - 18*pow(Delta, 3)*pow(X, 2) + 8*pow(Delta, 2)*Delta_d*pow(X, 2)*delta - 4*pow(Delta, 2)*Delta_dd*pow(X, 2)*pow(delta, 2) + 10*Delta*pow(Delta_d, 2)*pow(X, 2)*pow(delta, 2) + 12*Delta*Delta_d*X - 4*Delta*Delta_dd*X*delta + 8*pow(Delta_d, 2)*X*delta - Delta_dd)/(16*pow(Delta, 4)*pow(X, 4)*pow(delta, 4) + 32*pow(Delta, 3)*pow(X, 3)*pow(delta, 3) + 24*pow(Delta, 2)*pow(X, 2)*pow(delta, 2) + 8*Delta*X*delta + 1)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta = pow(X, 3)*(-8*pow(Delta, 2)*Delta_d*pow(X, 2)*pow(delta, 3) + 8*pow(Delta, 2)*Delta_dd*pow(X, 2)*pow(delta, 4) + 10*pow(Delta, 2)*X*delta - 24*Delta*pow(Delta_d, 2)*pow(X, 2)*pow(delta, 4) + 8*Delta*Delta_d*X*pow(delta, 2) + 8*Delta*Delta_dd*X*pow(delta, 3) + 8*Delta - 18*pow(Delta_d, 2)*X*pow(delta, 3) + 12*Delta_d*delta + 2*Delta_dd*pow(delta, 2))/(16*pow(Delta, 4)*pow(X, 4)*pow(delta, 4) + 32*pow(Delta, 3)*pow(X, 3)*pow(delta, 3) + 24*pow(Delta, 2)*pow(X, 2)*pow(delta, 2) + 8*Delta*X*delta + 1)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta_d = 2*pow(X, 2)*(2*X*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + (2*Delta*X*delta + 1)*(2*Delta_d*X*pow(delta, 2) - 1))/pow(2*Delta*X*delta + 1, 3)" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "dDelta_dd = -pow(X, 2)*delta/(2*Delta*X*delta + 1)\n" + ] + } + ], + "prompt_number": 32 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Derivatives with respect to $\\tau$ and $\\delta$ of each term" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\frac{\\partial \\alpha^{ass}}{\\partial \\tau} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\tau} \\quad \\quad \\mathrm{(Eq. A52/A53)}$$ \n", + "\n", + "$$ \\frac{\\partial \\alpha^{ass}}{\\partial \\delta} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\delta} \\quad \\quad \\mathrm{(Eq. A29/A30)}$$\n", + "\n", + "$$ \\frac{\\partial^2 \\alpha^{ass}}{\\partial \\delta^2} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\delta\\delta} -A\\frac{X_{\\delta}^2}{X^2} \\quad \\quad \\mathrm{(Eq. A72/A73)}$$\n", + "\n", + "$$ \\frac{\\partial^2 \\alpha^{ass}}{\\partial \\tau^2} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\tau\\tau} -A\\frac{X_{\\tau}^2}{X^2} \\quad \\quad \\mathrm{(Eq. A79/A80)}$$\n", + "\n", + "$$ \\frac{\\partial^2 \\alpha^{ass}}{\\partial \\tau\\partial\\delta} = A\\left[-\\frac{X_{\\tau}}{X^2}\\right]X_{\\delta}+AX_{\\delta\\tau}\\left[\\frac{1}{X}-\\frac{1}{2}\\right] \\quad \\quad \\mathrm{(Eq. A86/A87)}$$\n" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Newly Derived Terms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\frac{\\partial^3 \\alpha^{ass}}{\\partial \\tau^3} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\tau\\tau\\tau} + A\\left[-\\frac{X_{\\tau}}{X^2}\\right]X_{\\tau\\tau} -A\\frac{X^2(2X_{\\tau}X_{\\tau\\tau})-X_{\\tau}^2(2XX_{\\tau})}{X^4} $$\n", + "\n", + "$$ \\frac{\\partial^3 \\alpha^{ass}}{\\partial \\delta\\partial \\tau^2} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\delta\\tau\\tau} + A\\left[-\\frac{X_{\\delta}}{X^2}\\right]X_{\\tau\\tau} -A\\frac{X^2(2X_{\\tau}X_{\\tau\\delta})-X_{\\tau}^2(2XX_{\\delta})}{X^4} $$\n", + "\n", + "$$ \\frac{\\partial^3 \\alpha^{ass}}{\\partial \\delta^2\\partial \\tau} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\delta\\delta\\tau} + A\\left[-\\frac{X_{\\tau}}{X^2}\\right]X_{\\delta\\delta} -A\\frac{X^2(2X_{\\delta}X_{\\tau\\delta})-X_{\\delta}^2(2XX_{\\tau})}{X^4} $$\n", + "\n", + "$$ \\frac{\\partial^3 \\alpha^{ass}}{\\partial \\delta^3} = A\\left[\\frac{1}{X}-\\frac{1}{2}\\right]X_{\\delta\\delta\\delta} + A\\left[-\\frac{X_{\\delta}}{X^2}\\right]X_{\\delta\\delta} -A\\frac{X^2(2X_{\\delta}X_{\\delta\\delta})-X_{\\delta}^2(2XX_{\\delta})}{X^4} $$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from __future__ import division\n", + "from math import exp, log\n", + "\n", + "A = 2\n", + "\n", + "class Methanol(object):\n", + " \n", + " m = 0.977118832\n", + " vbarn = 0.204481952\n", + " kappabar = 0.148854832e-2\n", + " epsilonbar = 5.46341463\n", + " \n", + " def X(self, delta, Deltabar):\n", + " return 2/((1+4*Deltabar*delta)**0.5+1)\n", + " \n", + " def dX_dDeltabar__constdelta(self, delta, Deltabar):\n", + " X = self.X(delta,Deltabar)\n", + " return -delta*X**2/(2*Deltabar*delta*X+1)\n", + " \n", + " def dX_ddelta__constDeltabar(self, delta, Deltabar):\n", + " X = self.X(delta,Deltabar)\n", + " return -Deltabar*X**2/(2*Deltabar*delta*X+1)\n", + " \n", + " def dX_dtau(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " return self.dX_dDeltabar__constdelta(delta, Deltabar)*self.dDeltabar_dtau__constdelta(tau, delta)\n", + " \n", + " def dX_ddelta(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " return (self.dX_ddelta__constDeltabar(delta, Deltabar)\n", + " + self.dX_dDeltabar__constdelta(delta, Deltabar)*self.dDeltabar_ddelta__consttau(tau, delta))\n", + " \n", + " def d2X_dtau2(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " beta = self.dDeltabar_dtau__constdelta(tau, delta)\n", + " d_dXdtau_dbeta = -delta*X**2/(2*Deltabar*delta*X+1)\n", + " d_dXdtau_dDeltabar = 2*delta**2*X**3/(2*Deltabar*delta*X+1)**2*beta\n", + " d_dXdtau_dX = -2*beta*delta*X*(Deltabar*delta*X+1)/(2*Deltabar*delta*X+1)**2\n", + " dbeta_dtau = self.d2Deltabar_dtau2__constdelta(tau, delta)\n", + " dX_dDeltabar = self.dX_dDeltabar__constdelta(delta, Deltabar)\n", + " val = d_dXdtau_dX*dX_dDeltabar*beta+d_dXdtau_dDeltabar*beta+d_dXdtau_dbeta*dbeta_dtau\n", + " #print val, self.X_tt(X,delta,Deltabar,beta,dbeta_dtau)\n", + " return val\n", + " \n", + " def X_tt(self, X, delta, Delta, Delta_t, Delta_tt):\n", + " return (2*Delta_t**2*delta**2*X**3*(Delta*delta*X+1)/(2*Delta*delta*X+1)**3\n", + " +(2*delta**2*X**3*Delta_t**2)/(2*Delta*delta*X+1)**2\n", + " -(delta*X**2*Delta_tt)/(2*Delta*delta*X+1)\n", + " )\n", + " \n", + " def d3X_dtau3(self, tau, delta):\n", + " Delta = self.Deltabar(tau, delta)\n", + " Delta_t = self.dDeltabar_dtau__constdelta(tau, delta)\n", + " Delta_tt = self.d2Deltabar_dtau2__constdelta(tau, delta)\n", + " dX_dDeltabar = self.dX_dDeltabar__constdelta(tau, delta)\n", + " dDeltabar_dtau = self.dDeltabar_dtau__constdelta(tau, delta)\n", + " dDeltabart_dtau = self.d2Deltabar_dtau2__constdelta(tau, delta)\n", + " dDeltabartt_dtau = self.d3Deltabar_dtau3__constdelta(tau, delta)\n", + " X = self.X(delta, Delta)\n", + " d = delta\n", + " t = tau\n", + " \n", + " dXtt_dDeltabartt = (-d*X**2)/(1+2*Delta*d*X)\n", + " dXtt_dDeltabart = ((4*Delta_t*d**2*X**3*(Delta*d*X+1))/(2*Delta*d*X+1)**3\n", + " +(4*d**2*X**3*Delta_t)/(2*Delta*d*X+1)**2\n", + " )\n", + " dXtt_dDeltabar = ((-12*Delta_t**2*d**3*X**4*(Delta*d*X+1))/(2*Delta*d*X+1)**4\n", + " -(6*d**3*X**4*Delta_t**2)/(2*Delta*d*X+1)**3\n", + " +(2*d**2*X**3*Delta_tt)/(2*Delta*d*X+1)**2\n", + " )\n", + " dXtt_dX = (-(12*Delta_t**2*Delta*d**3*X**3*(Delta*d*X+1))/(2*Delta*d*X+1)**4\n", + " +2*d**2*X**2*(3*Delta_t**2+Delta_tt*Delta)/(2*Delta*d*X+1)**2\n", + " -(2*d*X*Delta_tt)/(2*Delta*d*X+1)\n", + " )\n", + " \n", + " print '1', dXtt_dDeltabartt, (self.X_tt(X,delta,Delta,Delta_t,Delta_tt+1e-8)-self.X_tt(X,delta,Delta,Delta_t,Delta_tt-1e-8))/(2e-8)\n", + " print '2', dXtt_dDeltabart, (self.X_tt(X,delta,Delta,Delta_t+1e-8,Delta_tt)-self.X_tt(X,delta,Delta,Delta_t-1e-8,Delta_tt))/(2e-8)\n", + " print '3', dXtt_dDeltabar, (self.X_tt(X,delta,Delta+1e-8,Delta_t,Delta_tt)-self.X_tt(X,delta,Delta-1e-8,Delta_t,Delta_tt))/(2e-8)\n", + " print '4', dXtt_dX, (self.X_tt(X+1e-8,delta,Delta,Delta_t,Delta_tt)-self.X_tt(X-1e-8,delta,Delta,Delta_t,Delta_tt))/(2e-8)\n", + " \n", + " return (dXtt_dX*dX_dDeltabar*dDeltabar_dtau\n", + " +dXtt_dDeltabar*dDeltabar_dtau\n", + " +dXtt_dDeltabart*dDeltabart_dtau\n", + " +dXtt_dDeltabartt*dDeltabartt_dtau)\n", + " \n", + " def d2X_ddeltadtau(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " alpha = self.dDeltabar_ddelta__consttau(tau, delta)\n", + " beta = self.dDeltabar_dtau__constdelta(tau, delta)\n", + " dalpha_dtau = self.d2Deltabar_ddelta_dtau(tau, delta)\n", + " d_dXddelta_dDeltabar = X**2*(2*delta**2*X*alpha-1)/(2*Deltabar*delta*X+1)**2\n", + " d_dXddelta_dalpha = -delta*X**2/(2*Deltabar*delta*X+1)\n", + " d_dXddelta_dX = -(Deltabar+delta*alpha)*2*(Deltabar*delta*X**2+X)/(2*Deltabar*delta*X+1)**2\n", + " dX_dDeltabar = self.dX_dDeltabar__constdelta(delta, Deltabar)\n", + " return d_dXddelta_dX*dX_dDeltabar*beta+d_dXddelta_dDeltabar*beta+d_dXddelta_dalpha*dalpha_dtau\n", + " \n", + " def d2X_ddelta2(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " alpha = self.dDeltabar_ddelta__consttau(tau, delta)\n", + " dalpha_ddelta = self.d2Deltabar_ddelta2__consttau(tau, delta)\n", + " d_dXddelta_dDeltabar = X**2*(2*delta**2*X*alpha-1)/(2*Deltabar*delta*X+1)**2\n", + " d_dXddelta_dalpha = -delta*X**2/(2*Deltabar*delta*X+1)\n", + " d_dXddelta_dX = -(Deltabar+delta*alpha)*2*(Deltabar*delta*X**2+X)/(2*Deltabar*delta*X+1)**2\n", + " dX_dDeltabar = self.dX_dDeltabar__constdelta(delta, Deltabar)\n", + " dX_ddelta_constall = X**2*(2*Deltabar**2*X-alpha)/(2*Deltabar*delta*X+1)**2\n", + " return (dX_ddelta_constall\n", + " + d_dXddelta_dX*self.dX_ddelta__constDeltabar(delta, Deltabar)\n", + " + d_dXddelta_dX*dX_dDeltabar*alpha\n", + " + d_dXddelta_dDeltabar*alpha\n", + " + d_dXddelta_dalpha*dalpha_ddelta)\n", + " \n", + " def g(self, eta):\n", + " return 0.5*(2-eta)/(1-eta)**3\n", + " \n", + " def dg_deta(self, eta):\n", + " return 0.5*(5-2*eta)/(1-eta)**4\n", + " \n", + " def d2g_deta2(self, eta):\n", + " return 3*(3-eta)/(1-eta)**5\n", + " \n", + " def d3g_deta3(self, eta):\n", + " return 6*(7-2*eta)/(1-eta)**6\n", + " \n", + " def eta(self, delta):\n", + " return self.vbarn*delta\n", + " \n", + " def Deltabar(self, tau, delta):\n", + " return self.g(self.eta(delta))*(exp(self.epsilonbar*tau)-1)*self.kappabar\n", + " \n", + " def dDeltabar_ddelta__consttau(self, tau, delta):\n", + " return self.dg_deta(self.eta(delta))*(exp(self.epsilonbar*tau)-1)*self.kappabar*self.vbarn\n", + " \n", + " def d2Deltabar_ddelta2__consttau(self, tau, delta):\n", + " return self.d2g_deta2(self.eta(delta))*(exp(self.epsilonbar*tau)-1)*self.kappabar*self.vbarn**2\n", + " \n", + " def dDeltabar_dtau__constdelta(self, tau, delta):\n", + " return self.g(self.eta(delta))*self.kappabar*exp(self.epsilonbar*tau)*self.epsilonbar\n", + " \n", + " def d2Deltabar_dtau2__constdelta(self, tau, delta):\n", + " return self.g(self.eta(delta))*self.kappabar*exp(self.epsilonbar*tau)*self.epsilonbar**2\n", + " \n", + " def d3Deltabar_dtau3__constdelta(self, tau, delta):\n", + " return self.g(self.eta(delta))*self.kappabar*exp(self.epsilonbar*tau)*self.epsilonbar**3\n", + " \n", + " def d2Deltabar_ddelta_dtau(self, tau, delta):\n", + " return self.dg_deta(self.eta(delta))*exp(self.epsilonbar*tau)*self.epsilonbar*self.kappabar*self.vbarn\n", + " \n", + " def base(self, tau, delta):\n", + " X = self.X(delta, self.Deltabar(tau, delta))\n", + " return 2*(log(X)-X/2.0+0.5)\n", + " \n", + " def dDelta(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " return 2*(1/X-0.5)*self.dX_ddelta(tau, delta)\n", + " \n", + " def dTau(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " return 2*(1/X-0.5)*self.dX_dtau(tau, delta)\n", + " \n", + " def dTau2(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " X_tau = self.dX_dtau(tau, delta)\n", + " X_tautau = self.d2X_dtau2(tau, delta)\n", + " return 2*(1/X-0.5)*X_tautau-2*(X_tau/X)**2\n", + " \n", + " def dDeltadTau(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " X_delta = self.dX_ddelta(tau, delta)\n", + " X_tau = self.dX_dtau(tau, delta)\n", + " X_deltatau = self.d2X_ddeltadtau(tau, delta)\n", + " return 2*(-X_tau/X**2)*X_delta+2*X_deltatau*(1/X-0.5)\n", + " \n", + " def dDelta2(self, tau, delta):\n", + " Deltabar = self.Deltabar(tau, delta)\n", + " X = self.X(delta, Deltabar)\n", + " X_delta = self.dX_ddelta(tau, delta)\n", + " X_deltadelta = self.d2X_ddelta2(tau, delta)\n", + " return 2*(1/X-0.5)*X_deltadelta-2*(X_delta/X)**2\n", + " \n", + " def dTau3(self, tau, delta):\n", + " X = self.X(delta, Deltabar)\n", + " X_t = self.dX_dtau(tau, delta)\n", + " X_tt = self.d2X_dtau2(tau, delta)\n", + " X_ttt = self.d3X_dtau3(tau, delta)\n", + " return (A*(1/X-1/2)*X_ttt\n", + " +A*(-X_t/X**2)*X_tt\n", + " -2*A*(X**2*(X_t*X_tt)-X_t**2*(X*X_t))/X**4\n", + " )\n", + " \n", + "M = Methanol()\n", + "\n", + "#print M.base(0.5,0.5)\n", + "Deltabar = M.Deltabar(0.5,0.5)\n", + "#print M.dX_dDeltabar__constdelta(0.5,Deltabar),(M.X(0.5,Deltabar+1e-8)-M.X(0.5,Deltabar))/1e-8\n", + "\n", + "print 'ttt', M.d3X_dtau3(0.5,0.5),(M.d2X_dtau2(0.5+1e-8,0.5)-M.d2X_dtau2(0.5-1e-8,0.5))/2e-8\n", + "print 'd',M.dDelta(0.5,0.5), (M.base(0.5,0.5+1e-8)-M.base(0.5,0.5))/1e-8\n", + "print 't',M.dTau(0.5,0.5), (M.base(0.5+1e-8,0.5)-M.base(0.5,0.5))/1e-8\n", + "print 'tt',M.dTau2(0.5,0.5), (M.dTau(0.5+1e-8,0.5)-M.dTau(0.5,0.5))/1e-8\n", + "print 'ttt',M.dTau3(0.5,0.5), (M.dTau2(0.5+1e-8,0.5)-M.dTau2(0.5,0.5))/1e-8\n", + "print 'dt',M.dDeltadTau(0.5,0.5), (M.dTau(0.5,0.5+1e-8)-M.dTau(0.5,0.5))/1e-8\n", + "print 'dd',M.dDelta2(0.5,0.5), (M.dDelta(0.5,0.5+1e-8)-M.dDelta(0.5,0.5))/1e-8" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ttt 1 -0.473370012679 -0.473370015408\n", + "2 0.295697260234 0.295697258346\n", + "3 0.354430230606 0.354430232385\n", + "4 -0.811327611566 -0.77524633102\n", + "-1.95954772419 -1.93168185336\n", + "d -0.0351186626009 -0.0351186635328\n", + "t -0.0796836538477 -0.0796836374661\n", + "tt -0.422816696531 -0.422816709422\n", + "ttt 1 -0.473370012679 -0.473370015408\n", + "2 0.295697260234 0.295697258346\n", + "3 0.354430230606 0.354430232385\n", + "4 -0.811327611566 -0.77524633102\n", + "-2.20666413982 -2.17802790803\n", + "dt -0.199708453268 -0.199708456716\n", + "dd -0.0354391474199 -0.0354391481439\n" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/Saturation_Routines_Pure_Fluid.ipynb b/doc/notebooks/Saturation_Routines_Pure_Fluid.ipynb new file mode 100644 index 00000000..5e7e251e --- /dev/null +++ b/doc/notebooks/Saturation_Routines_Pure_Fluid.ipynb @@ -0,0 +1,159 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Saturation density specified" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Two residuals are \n", + "\n", + "1. Equating pressure of the two phases\n", + "\n", + " $r_1 = \\delta''[1+\\delta''\\alpha_{\\delta}^r(\\tau,\\delta'')]-\\delta'[1+\\delta'\\alpha_{\\delta}^r(\\tau,\\delta')]$ \n", + "\n", + "2. Equating Gibbs energy of the two phases\n", + "\n", + " $r_2 = \\delta''\\alpha_{\\delta}^r(\\tau,\\delta'')+\\alpha^r(\\tau,\\delta'')+\\ln\\delta''-[\\delta'\\alpha_{\\delta}^r(\\tau,\\delta')+\\alpha^r(\\tau,\\delta')+\\ln\\delta']$\n", + " \n", + "Independent (unknown) variables are either $\\tau,\\delta'$ or $\\tau,\\delta''$. Obtain all the partial derivatives:\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\tau}\\right|_{\\delta',\\delta''} = (\\delta'')^2\\alpha^r_{\\delta\\tau}(\\tau,\\delta'')-(\\delta')^2\\alpha^r_{\\delta\\tau}(\\tau,\\delta')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = [1+\\delta''\\alpha^r_{\\delta}(\\tau,\\delta'')]+\\delta''[\\delta''\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')+\\alpha^r_{\\delta}(\\tau,\\delta'')] = 1+2\\delta''\\alpha^r_{\\delta}(\\tau,\\delta'')+(\\delta'')^2\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = -[1+\\delta'\\alpha^r_{\\delta}(\\tau,\\delta')]-\\delta'[\\delta'\\alpha^r_{\\delta\\delta}(\\tau,\\delta')+\\alpha^r_{\\delta}(\\tau,\\delta')] = -1-2\\delta'\\alpha^r_{\\delta}(\\tau,\\delta')-(\\delta')^2\\alpha^r_{\\delta\\delta}(\\tau,\\delta')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\tau}\\right|_{\\delta',\\delta''} = \\delta''\\alpha^r_{\\delta\\tau}(\\tau,\\delta'') + \\alpha^r_{\\tau}(\\tau,\\delta'')-[\\delta'\\alpha^r_{\\delta\\tau}(\\tau,\\delta') + \\alpha^r_{\\tau}(\\tau,\\delta')]$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = \\delta''\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')+\\alpha^r_{\\delta}(\\tau,\\delta'') +\\alpha^r_{\\delta}(\\tau,\\delta'') +\\displaystyle\\frac{1}{\\delta''} = \\delta''\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')+2\\alpha^r_{\\delta}(\\tau,\\delta'') +\\displaystyle\\frac{1}{\\delta''} $\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = -\\delta'\\alpha^r_{\\delta\\delta}(\\tau,\\delta')-\\alpha^r_{\\delta}(\\tau,\\delta') -\\alpha^r_{\\delta}(\\tau,\\delta') -\\displaystyle\\frac{1}{\\delta'} = -\\delta'\\alpha^r_{\\delta\\delta}(\\tau,\\delta')-2\\alpha^r_{\\delta}(\\tau,\\delta') -\\displaystyle\\frac{1}{\\delta'} $\n", + "If $\\delta'$ is imposed, the Jacobian is given by\n", + "\n", + "$\\mathbf{J} = \\left[ \\begin{array}{cc} \\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\tau}\\right|_{\\delta',\\delta''} & \\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta''}\\right|_{\\tau,\\delta'} \\\\ \\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\tau}\\right|_{\\delta',\\delta''} & \\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta''}\\right|_{\\tau,\\delta'}\\end{array} \\right]$\n", + "\n", + "with the increment $\\mathbf{v}$ obtained from \n", + "\n", + "$\\mathbf{J}\\left[\\begin{array}{c}\\Delta \\tau \\\\ \\Delta\\delta''\\end{array}\\right] = -\\left[\\begin{array}{c}r_1 \\\\ r_2\\end{array}\\right]$\n", + "\n", + "If $\\delta''$ is imposed, the Jacobian is given by\n", + "\n", + "$\\mathbf{J} = \\left[ \\begin{array}{cc} \\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\tau}\\right|_{\\delta',\\delta''} & \\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta'}\\right|_{\\tau,\\delta''} \\\\ \\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\tau}\\right|_{\\delta',\\delta''} & \\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta'}\\right|_{\\tau,\\delta''}\\end{array} \\right]$\n", + "\n", + "with the increment $\\mathbf{v}$ obtained from \n", + "\n", + "$\\mathbf{J}\\left[\\begin{array}{c}\\Delta \\tau \\\\ \\Delta\\delta'\\end{array}\\right] = -\\left[\\begin{array}{c}r_1 \\\\ r_2\\end{array}\\right]$\n", + "The method needs to start off with decent guesses for densities and temperature, which can be obtained by the ancillaries. First solve $\\rho(T)=\\rho_{spec}$ to get $T$, then use $T$ to get the other density using the ancillary. And then kick into the full Newton-Raphson solution.\n", + "Or alternatively, use $\\ln\\delta'$ and $\\ln\\delta''$ as independent variables, would bring liquid an vapor density values closer in magnitude. Rather than being 16 orders of magnitude different, they would be much closer to one order of magnitude in difference. For instance:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Propane at triple point \n", + "rhoL = 16625.80554 #mol/m3\n", + "rhoV = 0.0000002419454458 #mol/m3\n", + "from math import log10\n", + "print log10(rhoL), log10(rhoV)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4.22078269657 -6.61628254831\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That should help with the truncation error. But make sure to distribute through the \\delta in order to avoid truncation in internal calculation" + ] + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Saturation pressure/enthalpy/entropy/internal energy specified" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Three residuals are \n", + "\n", + "1. Equating pressure of the two phases\n", + "\n", + " $r_1 = \\delta''[1+\\delta''\\alpha_{\\delta}^r(\\tau,\\delta'')]-\\delta'[1+\\delta'\\alpha_{\\delta}^r(\\tau,\\delta')]$ \n", + "\n", + "2. Equating Gibbs energy of the two phases\n", + "\n", + " $r_2 = \\delta''\\alpha_{\\delta}^r(\\tau,\\delta'')+\\alpha^r(\\tau,\\delta'')+\\ln\\delta''-[\\delta'\\alpha_{\\delta}^r(\\tau,\\delta')+\\alpha^r(\\tau,\\delta')+\\ln\\delta']$\n", + " \n", + "3. Specified value must equal the desired value\n", + "\n", + " $r_3 = \\ln(X_S) - \\ln(X_{specified})$ for $p$\n", + " \n", + " $r_3 = X_S - X_{specified}$ for $h$, $s$, $u$\n", + " \n", + "Three unknowns are $\\tau$, $\\ln\\delta'$, $\\ln\\delta''$.\n", + "\n", + "For the first two residuals, the partials can be obtained in the same way as for density imposed\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\tau}\\right|_{\\delta',\\delta''} = (\\delta'')^2\\alpha^r_{\\delta\\tau}(\\tau,\\delta'')-(\\delta')^2\\alpha^r_{\\delta\\tau}(\\tau,\\delta')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = 1+2\\delta''\\alpha^r_{\\delta}(\\tau,\\delta'')+(\\delta'')^2\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_1}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = -1-2\\delta'\\alpha^r_{\\delta}(\\tau,\\delta')-(\\delta')^2\\alpha^r_{\\delta\\delta}(\\tau,\\delta')$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\tau}\\right|_{\\delta',\\delta''} = \\delta''\\alpha^r_{\\delta\\tau}(\\tau,\\delta'') + \\alpha^r_{\\tau}(\\tau,\\delta'')-[\\delta'\\alpha^r_{\\delta\\tau}(\\tau,\\delta') + \\alpha^r_{\\tau}(\\tau,\\delta')]$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = \\delta''\\alpha^r_{\\delta\\delta}(\\tau,\\delta'')+2\\alpha^r_{\\delta}(\\tau,\\delta'') +\\displaystyle\\frac{1}{\\delta''} $\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_2}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = -\\delta'\\alpha^r_{\\delta\\delta}(\\tau,\\delta')-2\\alpha^r_{\\delta}(\\tau,\\delta') -\\displaystyle\\frac{1}{\\delta'} $\n", + "\n", + "The third residual's partials when one of h,s,u are specified can be obtained from\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\tau}\\right|_{\\delta', \\delta''} = \\left.\\displaystyle\\frac{\\partial X_S}{\\partial \\tau}\\right|_{\\delta',\\delta''}$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = \\left.\\displaystyle\\frac{\\partial X_S}{\\partial \\delta'}\\right|_{\\tau,\\delta''}$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = \\left.\\displaystyle\\frac{\\partial X_S}{\\partial \\delta''}\\right|_{\\tau,\\delta'}$\n", + "\n", + "Or when $\\ln p$ is specified\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\tau}\\right|_{\\delta', \\delta''} = \\dfrac{1}{X_S}\\left.\\dfrac{\\partial X_S}{\\partial \\tau}\\right|_{\\delta',\\delta''}$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\delta'}\\right|_{\\tau,\\delta''} = \\dfrac{1}{X_S}\\left.\\dfrac{\\partial X_S}{\\partial \\delta'}\\right|_{\\tau,\\delta''}$\n", + "\n", + "$\\left.\\displaystyle\\frac{\\partial r_3}{\\partial \\delta''}\\right|_{\\tau,\\delta'} = \\dfrac{1}{X_S}\\left.\\dfrac{\\partial X_S}{\\partial \\delta''}\\right|_{\\tau,\\delta'}$\n" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/braindump/General solution for pressure ancillary equation.ipynb b/doc/notebooks/braindump/General solution for pressure ancillary equation.ipynb new file mode 100644 index 00000000..26a7ae6d --- /dev/null +++ b/doc/notebooks/braindump/General solution for pressure ancillary equation.ipynb @@ -0,0 +1,276 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import CoolProp\n", + "import CoolProp.CoolProp as CP\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Calculate the saturation curves for all fluids\n", + "acc = [CP.Props(fluid,'accentric') for fluid in CoolProp.__fluids__]\n", + "mm = [CP.Props(fluid,'molemass') for fluid in CoolProp.__fluids__]\n", + "pc = [CP.Props(fluid,'pcrit') for fluid in CoolProp.__fluids__]\n", + "Tc = [CP.Props(fluid,'Tcrit') for fluid in CoolProp.__fluids__]\n", + "\n", + "ms = []\n", + "for fluid in CoolProp.__fluids__:\n", + " Tc = CP.Props(fluid,'Tcrit')\n", + " rhoc = CP.Props(fluid,'rhocrit')\n", + " pc = CP.Props(fluid,'pcrit')\n", + " T = np.linspace(CP.Props(fluid,'Tmin'),Tc-0.5,200)\n", + " pV = CP.Props('P','T',T,'Q',1,fluid)\n", + " plt.plot(Tc/T-1,np.log(pV/pc))\n", + " \n", + " # m is the mean slope in plot coordinates\n", + " ms.append(np.mean(np.log(pV/pc)/(Tc/T-1)))\n", + " \n", + " \n", + "plt.xlabel('$T_c/T-1$')\n", + "plt.ylabel('$\\ln(p/p_c)$')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 2, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "plt.plot(acc,ms,'o')\n", + "m,b = np.polyfit(acc,ms,1)\n", + "plt.plot(acc,m*np.array(acc)+b)\n", + "print m,b\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "-6.08930221451 -5.42477887222\n" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nk6wA0riq84EAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Final solution is \n", + "\n", + "\n", + "$$m = -6.08930221451 \\omega -5.42477887222$$\n", + "\n", + "and \n", + "\n", + "$$\\ln\\left(\\frac{p}{p_c}\\right)=m\\left(\\frac{T_c}{T}-1\\right)$$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "acc = np.array([CP.Props(fluid,'accentric') for fluid in CoolProp.__fluids__])\n", + "mm = np.array([CP.Props(fluid,'molemass') for fluid in CoolProp.__fluids__])\n", + "pc = np.array([CP.Props(fluid,'pcrit') for fluid in CoolProp.__fluids__])\n", + "Tc = np.array([CP.Props(fluid,'Tcrit') for fluid in CoolProp.__fluids__])\n", + "rhoc = np.array([CP.Props(fluid,'rhocrit') for fluid in CoolProp.__fluids__])\n", + "\n", + "plt.plot(Tc, acc, 'o')\n", + "\n", + "a = np.polyfit(Tc,acc,3)\n", + "x = np.linspace(np.min(Tc),np.max(Tc))\n", + "y = np.polyval(a,x)\n", + "plt.plot(x,y)\n", + "plt.xlabel('$T_c$')\n", + "plt.ylabel('$\\omega$')\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[ 6.67228479e-09 -7.20464352e-06 3.16947758e-03 -2.88760012e-01]\n" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n517Hz2rH+88wk8gB7BVnnruAXzD/pmC/v2d74AfgKOZi6y8wu/vt+vcMmFDM1ZEtML8BWD1gDsXH\nPNwthswbmKqG2VRPI3Cr/asA72N2tzizW6yNKJgFUgNIAe6wYZx5nBey2i3GmsBFjte1gO8x++rt\nFieY/z//wfE60RGjHeMEmIM5AJ3HbnHegDmjsobjfjMxW512i9MSd2EOCG3HHOyx0mzMfsXzmGMx\nj+J+MSTASMy4twAxAYzzVszuoLUUTDXsacNYr8fs916LOcX0Rcdxu8WZx3khq91ibIn5d1yL+TDJ\n+2/FbnGC+cBbDazD/KZc16Zx1gKOUJCUwZ5xvkTBVN2ZmL0OdoxTRERERERERERERERERERERERE\nRERERERERERERCQ4/QFYCAzBXMU7w/H6F4K7lpyIiPjRA5glIMDcD+FKx+v+1oQjIiLBoJ3Ta+eN\njdoWPVFERKSo1pgb74hUSOqDFfGPjsBPVgch4i9KHiL+0QFYZXUQIiISXL6nYLc2kQonxOoARCqY\nG4BHMGdd7QV2Aw0xN9zqgrnBlYiISKkmU4G385TKSS0PEf9rjDm+eDlma0RERERERERERERERERE\nREREREREREREREREREREREREJEj8PzSwsmfXGylCAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "acc = np.array([CP.Props(fluid,'accentric') for fluid in CoolProp.__fluids__])\n", + "mm = np.array([CP.Props(fluid,'molemass') for fluid in CoolProp.__fluids__])\n", + "pc = np.array([CP.Props(fluid,'pcrit') for fluid in CoolProp.__fluids__])\n", + "Tc = np.array([CP.Props(fluid,'Tcrit') for fluid in CoolProp.__fluids__])\n", + "rhoc = np.array([CP.Props(fluid,'rhocrit') for fluid in CoolProp.__fluids__])\n", + "\n", + "plt.plot(mm, Tc, 'o')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 5, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nfxQLGG7yXX5XAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a,b,c,d = [],[],[],[]\n", + "for fluid in CoolProp.__fluids__:\n", + " Tc = CP.Props(fluid,'Tcrit')\n", + " Tt = CP.Props(fluid,'Ttriple')\n", + " rhoc = CP.Props(fluid,'rhocrit')\n", + " pc = CP.Props(fluid,'pcrit')\n", + " T = np.linspace(CP.Props(fluid,'Tmin'),Tc-0.5,200)\n", + " rhoV = CP.Props('D','T',T,'Q',1,fluid)\n", + " x = (Tc/T-1)/(Tc/Tt-1)\n", + " y = np.log(rhoV/rhoc)*(T/Tc)**1.5\n", + " plt.plot(x,y)\n", + " pf = np.polyfit(x,y,3)\n", + " a.append(pf[0])\n", + " b.append(pf[1])\n", + " c.append(pf[2])\n", + " d.append(pf[3])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 53 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "acc = np.array([CP.Props(fluid,'accentric') for fluid in CoolProp.__fluids__])\n", + "mm = np.array([CP.Props(fluid,'molemass') for fluid in CoolProp.__fluids__])\n", + "pc = np.array([CP.Props(fluid,'pcrit') for fluid in CoolProp.__fluids__])\n", + "Tc = np.array([CP.Props(fluid,'Tcrit') for fluid in CoolProp.__fluids__])\n", + "rhoc = np.array([CP.Props(fluid,'rhocrit') for fluid in CoolProp.__fluids__])\n", + "\n", + "plt.plot(pc,d,'o')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 31, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEACAYAAABYq7oeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X2UVPWd5/F3SwENCtIShwZB21QyIw7Hs+KGwXWWrrix\nC8OamNlV8CGSKK4PQDvjrEFpWkqROWrOZKVBY1acORjGh5jMukol2ExM02fcEE1ACQhRWojy0ICI\nNCgNFqn943er6+He20/33q6nz+ucOn3r1n341aW43/t7BhERERERERERERERERERERERERERkaI1\nHdgOvAcscPj8BuBtYDPwOnDRwCVNRETyYRCwA6gBBgNvARNztrkUONNang5sGKjEiYhIflwKrM14\nf6/1clMF7A40RSIi4tlpHvc/B/gw4/1ua52bW4CfezyniIgELORx/2Qftv0qcDNwmcdziohIwLwG\nhz3AhIz3E3AuNroIeApT53DY6UDhcDjZ1tbmMTkiImWnDfhSvhORK4RJWA0wBOcK6XMxldZTezhW\nUozFixfnOwkFQ9ciTdciTdcijb6V4PSa15xDApgHvIppufQ0sA24zfr8R8D9mIroH1rrPgemeDyv\niIgEyGtwAPiF9cr0o4zlOdZLRESKhNfWShKASCSS7yQUDF2LNF2LNF2L4FXkOwEZrOIzERHprYqK\nCgjgXq6cg4iI2Cg4iIiIjYKDiIjYKDiIiIiNgoOIiNgoOIiIiI2Cg4iI2Cg4iIiIjYKDiIjYKDiI\niIiNgoOIiNgoOIiIiI2Cg4iI2Cg4iIiIjYKDiIjYKDiIiIiNgoOIiNgoOIiIiI2Cg4iI2Cg4iIiI\njYKDiIjYKDiIiIhNKN8JKFfxeCtNTc2cOBFi6NAE9fV1zJgxLd/JEhEBFBzyIh5v5a67XqWtbWnX\nura2BgAFCBEpCCpWyoOmpuaswADQ1raU5cvX5SlFIiLZFBzy4MQJ5wxbZ+egAU6JiIgzP4LDdGA7\n8B6wwGWbJuvzt4GLfThnURs6NOG4vrLy1ACnRETEmdfgMAhYgQkQFwLXARNztvk68CXgy8D/AH7o\n8ZxFr76+jnC4IWtdOLyQ+fOvyFOKRESyea2QngLsAHZZ758Hvglsy9jmG8Aqa/k3wChgDLDf47mL\nVqrSefnyRjo7B1FZeYr586erMlpECobX4HAO8GHG+93AX/Vim/GUcXAAEyAUDESkUHktVkr2cruK\nfu4nIiJ54DXnsAeYkPF+AiZn0N024611NrFYrGs5EokQiUQ8Jk9EpLS0tLTQ0tIS+Hlyn+j7KgT8\nAfgvwF7gDUyldGadw9eBedbfqcBj1t9cyWRSGQoRkb6oqKgA7/dyG685hwTmxv8qpuXS05jAcJv1\n+Y+An2MCww7gU+C7Hs8pIiIB8z3aeKCcg4hIHwWVc1APaRERsVFwEBERGwUHERGxUXAQEREbBQcR\nEbFRcBARERsFBxERsVFwEBERGwUHERGxUXAQEREbBQcREbFRcBARERsFBxERsVFwEBERGwUHERGx\nUXAQEREbBQcREbFRcBARERsFBxERsVFwEBERGwUHERGxUXAQEREbBQcREbFRcBARERsFBxERsVFw\nEBERGwUHERGxUXAQEREbBQcREbHxGhzOAtYB7wLNwCiHbSYAvwK2AluAeo/nFBGRgHkNDvdigsOf\nA7+03uf6HPg74C+BqcBcYKLH84qISIC8BodvAKus5VXA1Q7btANvWcvHgG3AOI/nFRGRAFV43P8w\nUJVxrI8z3jupAdZjchHHcj5LJpNJj8kRESkvFRUV4P1ebhPqxTbrgGqH9Q0575PWy80ZwE+Bu7AH\nBgBisVjXciQSIRKJ9CJ5IiLlo6WlhZaWlsDP4zXabAcimKKjsZiK5wscthsMrAF+ATzmcizlHERE\n+iionIPXOoeXgdnW8mzgJYdtKoCngXdwDwwiIlJAvEabs4CfAOcCu4BrgU8wFc5PATOAvwZagc2k\ni53uA9bmHEs5BxGRPgoq5+D7AT1QcBAR6aNCLVYSEZESpOAgIiI2Cg4iImKj4CAiIjYKDiIiYqPg\nICIiNgoOIiJio+AgIiI2Cg4iImKj4CAiIjYKDiIiYqPgICIiNgoOIiJio+AgIiI2Cg4iImKj4CAi\nIjYKDiIiYqPgICIiNgoOIiJio+AgIiI2Cg4iImKj4CAiIjYKDiIiYhPKdwIKTTzeSlNTMydOhBg6\nNEF9fR0zZkzLd7JERAaUgkOGeLyVu+56lba2pV3r2toaABQgRKSsVOQ7ARmSyWQyrwmIRhfR3PyQ\nw/pG1q5dkocUZQs6V6Nck0jxqaiogADu5co5ZDhxwvlydHYOGuCU2AWdq1GuSUQyqUI6w9ChCcf1\nlZWnetw3Hm8lGl1EJBIjGl1EPN7qa9qampqzbtwAbW1LWb58XVEcX0SKi5ecw1nAC8B5wC7gWuAT\nl20HAb8FdgNXeThnoOrr62hra8i6SYbDC5k/f3q3+w3EU3fQuZpCzjWJyMDzEhzuBdYBjwILrPf3\numx7F/AOMMLD+QKXupEvX95IZ+cgKitPMX/+9B5v8O5P3Y2+BYeOjt3AIsw/WQKoA6b1KlfTG15y\nTSJSerwEh28AtdbyKqAF5+AwHvg6sBS428P5+uT66xfw4ovvkEyeTkXFp1xzzYU8++wjPe43Y8a0\nPt/Qg37qjsdb2bWrEsisLG/gtNOWM3XqV305R39zTSJSmrwEhzHAfmt5v/Xeyf8C7gFGejhXn1x/\n/QKee+5j4JWudc89dyuwoFcBoq+Cfupuamrm8OEVOWuX8qc/zWXDhn2+nKO/uSYRKU09BYd1QLXD\n+oac90nrleu/AgeATUCkp8TEYrGu5UgkQiTS4y6OXnzxHTIDg/EUL754Fc8+269Ddivop27nnEkr\ncIgNGz4lGl3kS7PT/uSaRGRgtbS00NLSEvh5vLSN3Y654bcDY4FfARfkbPMPwLcxheSVmNzDz4Cb\nHI7nWz+HUGgWp049b1s/aNAsEgn7ej/E460sX74u46n7Ct9utPb+F63Aq5iSOiMcbmDZsqhu7iJl\nJqh+Dl4O+ChwCHgEU9cwCvcKaTD1E/8T99ZK/Q4OuZ23fvnLTZw6FbdtFwpdxeef5+Yo8i8We4IV\nK9aTSAwjFDrOvHm1xGJ3dn0ej7cyZ85LtLf/wFqziOz6B6NQOuuJyMApxE5wDwM/AW4h3ZQVYBzw\nFDDDYR/fu0A7NSMdPryOzz671UpGyhyuueZCv0/vWSz2BEuXbiaReKFr3dKltwNPdAWIGTOmsXIl\n3H//XHbuPEZHx3FOOVRnqNmpiPil6IfPcBvyYsyYKIcODelza6WB9oUvzOTQoRds60ePnsVHHzkX\ngRX6MB8iMnAKMedQENyakV5wwaW0tMQGNjH9kEgMc1lf6bqPmp2KSNCKPjgMZOetIAamC4WOu6zv\ndN1HzU5FJGhFHxzq6+t48815Wf0AqqrmMn/+TN/OEY+30tj4PNu2HaOz81zgcmCaL0NkzJtXy9Kl\nt5NIPNm1LhS6jXnzuj9msTQ71UivIsWp6IPDm29u4ciRA0AjZginUxw5cpA339zi82ilT2SsNUGh\nrS3K7NmPM2nSa/2+8ZlK5ydYsWIWiUQloVAn8+ZNy2qtFLSgbuAa6VVE/JDsj9Gjr01C0vYaPXpm\nv46Xq66uwfH4cGcSFmatC4cXJtesWd+n469Zsz5ZV9eQrK1dnKyra+jz/l6tWbM+GQ57/x5O3K5d\nNLrIh5SLSDKZdOuA7FnR5xz6U6HbF24V3qbjd3bRVV8H2yuEJ+sgBw3USK8ixavo53PoT4VuX3R0\nHHD55AJML+XseRv6cuMrhDkUgryBa6RXkeJV9MFh3rxaQqHbs9b1pkK3905iH0pqIXAFZviKdZgA\ncScwm9df38TkyXN6NdlPITxZB3kDr6+vIxzOvnamye0Vno8tIsEq+mKloCt0R44cj2mddB3wF8Ap\nYDqQCj4HgJcAU2GdSMCmTQ3ceONTrF7tXDyUqgDevHmH4zkH8sk6yD4TanIrUryKvod00NK9kZ3H\nMzJDRTmN19TI5Mkf87vfPZ61NruewWkAvYUsWzawN9AgBw0UkWAV4sB7fgs0OPS3uWb6Zh4l90Zu\nipc+Ax5z2DNGVdVOPv54VdZa5xFW11FV9QFTppyrG7OI9ImGz/DAS6ugdNHIOnbv/ogPPvhvHD2a\nBAYDc4Fmlz1PYeorstnrGaYB07joohhr18Z68W1ERIJX9BXSveG1VdCMGdNYu3YJW7b8iI6OnzFp\n0rmYwPAqZi7n3NlPFwJ7qKk53XYsteARkWJQFsHB71ZB48adgXnijwKPY2ZJvRK4HlNxfYAhQ46y\nZIl9TiO14BGRYlBQxUpBDePg99O6vYXPq8BtmGatgxg2bBvf+95XHdOuFjwiUgwKqkI6HF6Y06TS\nn6kvneocvLYKymzh09Gxm4qKoYwYcbZa+xQYDfwnpa4sWis5DRHi1wQ2hdxcUzewYDg/FGiubSkt\nZRscamtjRTFpT3/Z+z00U1n5ARMnnsGSJbN0E/NAM+ZJOSjbpqyl3oon3ZIq3SGusxM2bYK77tLw\n1l4UwvAkIsWqoForlVIrnni8lWh0EZFIjGh0ketYS+kbWDPZHewGfhC+UqNmwyL9V1A5h2XLokXX\nisepvgDodae79A1MT7l+01zbIv1XUHUOhTi2UnfsFZ6tDBv2OKedNohPP/0ipoNcOhg4lXWnj1GB\n09hNKh/3ppAbIoj4oWzrHApNZk5hy5ZtHDr0gvWJqTM4fvyFjK1TxWTmZuSUC0jdqBobn2Hbtjvo\n7Pxh12eF8pRbzK2pimWubZFCo+DgonfFRbGMPex1BuZ9I6ngkCrrdjr2xo0rrafcwipWK4TZ6kRk\n4Ck4OHC7IY4ceZi2ticyttyNGco7BHzocjSTW0jlAnq62RbaDTfIaURFpHApODhwuyFWVc3OWNMK\njCRdT7DI8VhVVX9gypTGrlxANLrI9WabOnchFd+oOahIeVJwcOB2Q4QTGcvNwA8y3tdh6hhyh+i4\nI+sG73bsPXuOFmTxjZqDipSngurnUCjcbog1NWdk9MVwmpchCnwTmM2QIVdz443ju2m6mm3fvn2e\nhhUPikaRFSlPXpo/nQW8AJwH7AKuBT5x2G4UsBL4S8z4GDcDGxy289SU1c8WNd0N1Adm4p833niP\nw4efd9i7EVgCNHDxxfvZuHFlr45dWXmIrVtvwORIDmIu5Viqqtr58Y/vzGvuQc1BRQpXIY6t9Cjw\nkfV3AVAF3Ouw3SpgPfBPmMft04EjDtv1OzgEMcCa0w0R0nUCHR272bWrksOHV2TstRCYTqp1Uij0\nTS677GJbsHI6dmPjM2zaNAaT+3iJzCKr6uq7Wbnyat2QRcQmqODgxXZgjLVcbb3PdSbwfi+Pl+yr\nNWvWJ+vqGpKjRt2UhIYkrE9CsusVjS7q8zG7O1c4vDDr+EOGXJmERUmYbf3NPj/c1LUcDi9Mrlmz\n3vX4F198h7XtHTnHMK/Jk+/07buISOnAacRSH3ipcxiDmQIN6+8Yh23Ox5SR/DOwEXgKGO7hnF1S\nuYXm5of45JNVmFZDr2JaERl+tqhxasF08uQUTBHSeOtv7pP9GV1LPdUfnDx5CtPi6SPHz3fuPNaP\nVIuI9E9PrZXWYXIFuRpy3rtFrxAwGZgHvAk8hil6ut/pZLFYrGs5EokQiURcE+Z0s3brdOYH51ZG\nqcple0slmANkTxPqFqzi8Vbefz81fMYslxSc7ENqRaRUtbS00NLSEvh5egoO3TVJ2Y8JHO3AWOCA\nwza7rdeb1vuf4lwvAWQHh564NzfN7nTmF+dWRnVUVNxCMvm09b4R+CMwwkpHdk7CLVg1NTVz/PiT\n1rszsAeahdTUnN7/xItIych9cH7ggQcCOY+Xfg4vA7OBR6y/Lzls047pOvznwLvA14CtHs7Zxa1J\naG6nM784j/C5lmTyE95/v5FUUDI5hmkMGfJ1Tp5M9Z5OUF29l/nzv+N47OxAdxOmDj91zFNUV7ez\nZInzviIiQfASHB4GfgLcQropK8A4TN3CDOv9fOBfgCFAG/BdD+fs4jYcc26nM7+kjpk79hFMt1pK\npUdOra6+mRMnvsjJk5mjrN7teuyOjsxhOBLAJcA+qqp2MmXKucyf/x3H7+TWfLeYB8oTkcJQSM2f\nrIr33iuU9ve56Thw4BCbNj1h285tyO45c16ivT2zt3UD1dX7WLnSOSik9nNqvnvjjeewevUezZss\nUiYKsSmr33rddCvVhLW2dnGyrq6h2yai+VBbu9ixOWpt7WLbtnV1Df1quuq23+jR1zqu97NZr4gU\nDgJqylp0YysV+hDS8XgrW7Zsc/zs6NGDRKOLsop73CrWR4w4u9vzuO2XSAxzXK+B8kSkL4ouODQ2\nPkNbWzVmLoUEUOfbENL9LatP7bd37zHa2vZx/HgtuS2Oqqv/jr17O9m4MV0PYYYB328/IKZlU3fp\ncauQD4WOux5PRKS3iio4xOOtbNs2mOzpNE2uweuTcX9zJE77mTQlgJnAMEKhQwwfPoT33/9Z1r5t\nbUsJh2cTDtsr1qdOHd9tetwq5G+8sZbVqzVvsoh4U0iVGFbxmbtodBHNzfZ5lqGRaBRPcy27HXv0\n6JlMmjTRNSfhvF8r8CzwZNeayso76Oy8Dnvfh5tYsGAqGzbsy6pYb2pqdkxPZqW2W4V8oVTUi0jw\nNIc07uXslZV/ZP78OYEc+9ChiaxfHwOccxLO+zWTGRgAa27odO/t9PrzeOWVrXzhC1UApAJkd5Ps\nZBc3Jbnnnsuz0lSIM8qJSHEpquDgVs5+4YUjPN8M3Y6dORVoW1sFjY3PZJ3LeT+3y7oj570ZxfWd\nd1bS2fl419ru6iKOHj1Y0BXyIlIaimqyH7eJZx58cKan48bjrRw8+DGVlTdhAkFq8L6bSU8FGgMe\nYtu2wcTj6cH96uvrqK6+xdovZv39TcbRWzM+O4LpQR3D5CLM8N6dnedlpaetbSkVFUMdv2syeaIg\nJwUSkdJSVDkHt17KXp6Y0xXK6U5rlZV3EAo9zLFjNWRPBWqKh1Ito+LxVhobn+fQodT0oZdjio3+\nBrgV+DZmpNjMm/ntGdtBZeXtdHZeb0vXiBFn8+CDl9u+6/e//5rj91BTVRHxU1EFB/Benp7bPPTg\nwY+zAgOYADB58lzeeeconZ32Y6TK/XODSnqw2n/F5BC+D7ySs/eThEJXcdllr1m9qRNs2mT/Pq+/\n/jsikT+zVbI3NTU7fi81VRWRUhV4T0KnCXsqK7/t2KP4zDNnJ0eM+JbDBD6mt7FbD2Uz6U8yCYut\nl32bqqqbuk0T3JeE9clQ6Lbk4sWP9/gdwuH7Cq6XuEixK/SRGFJQD+n+ycwpbNmyjUOHXsj6vLPz\nXMf9jhyZACwhFLqdRAJSxUCpPgNuxTvp0VlP4fZvdv756UmAUrmgq6++ikTiEms/UxeRSExjxYpZ\nxGJ32rb3s2hNRLIV+kgM5cb3iGp/ynZ6kl+frKy83fHJPT1e0cxkbe3iZDS6qOvpofucQ2r/9Un4\nTtbngwff4vgEMnz4DY7HGz78Bt+vi4h0z+3/dyGOUYZyDn1nny0us9lpK6Y/QohQ6I9MnjyXtrZP\nrRyDeXJPmTTpAlpaYlnHduqhbEYvr8DMyTANuA34Cum5GbYxYULC8cnj5Mkjjt/Bbb2IBKe7fkbl\noqSDg/0fODWdZ5TMVkTHjsGRIw188YtJNm2y97LOrexNFVVVVn7E6NEzGTt2LOecM4KpUy+xejq/\nxsaNj3H06N+S2+lt1Ki5tuOcOBEiFEqSSFyLmSIj5TbGjavs57cXkf5y6/dUTg0/Sjo4ZP8Dp3IK\nH2HmKfp51rZtbUu5+OI5juMcZY5L5FQW+dlnt5NMHufXv052DbERicRYv96eQ0iNtuo8JtM8zBxJ\nZwOdwDQmTtzXvy8vIv3mNnZZOY1RVtLBIf0PnJ1TMJ3Q7EaOHM+SJfa+BZnFQPaiKjh+/Em2bm1k\n69YlbN58NytX9vzk4XQcWIEpgjK5l3L7MYoUCjX8KLHg4DTE9bJlUWbPfjynlZL7jbunfhRuZZGp\nVkrt7T/g/vvn8uCDM7t98nA7TlXVB1x0Uawsf4wihaTcxygrmeDg1vRs2bIokyZNZP36zK1TdQ99\nzzK6j8GULovcufNYj08ebseZMuVc1q6N9ZgOEZEglUxwcCqmSU0CNHRobksvc4MePXoWkyZd0Ken\ndOdWSmYAvbSTQPdPHirTFJFCVjLBobumZ/fcc7nDjXgty5bd2edsY2aO4N//fQeffvonYC7pVkkL\nqak5vU/HKdcyTREpXEUfHFL1DG+//SFm9NM6MpuPpuoRwL8bcSpHEI+3MmfOKtrb1wGvAaeorm5n\nyZLv9CrNbvMxiIjkW1HNBJfLfYrOKDCNcHghy5YF+zTe11nXnNIcDpu6EQUIEemroGaCK+rg4Da1\nZ1XVdUyZ8qWCmR6zp/GdIHv6TxGR3tI0oQ7c6hkuuugvCqbFjz2nEHPcrpy65YtI4Svq4DBQXdyd\n+k/0NkfS/fhOaeXULV9ECl9RB4eBaA7qVEewefPdjB37DCNHjqejYzcwhJEj/8wxcLiP76QmrCJS\nuIo6OAxEc1Cn/hPt7T+gvb0RM91n9jSguWO+23M3/e9jUQi85KJEpDycBawD3sWMaDfKZbv7gK3A\n74FngaEu2+V3UHQXtbXOs7mZuSF6HvO9lGZuc/4uC4vyu4iUCgpwPod7McHhUWCB9f7enG1qgFuB\nicAJ4AVgFrDKw3kHVPfDZfQ85nspdXbrrhd6MX4fEXHnJTh8A6i1llcBLdiDQwfwOTAcczcdDuzx\ncM4BL9bofriMZsd9ciuXS2UAL02AIlI+vASHMcB+a3m/9T7Xx8A/Ah8AxzEF9P/W3xN2N68rEEjQ\nyH3yP3r0IHv3dtLenjq2vXJ56tTxRKOLSq5cXhOgiJSPnoLDOqDaYX1Dznu3cq8w8LeY4qUjwIvA\nDcC/9CmVFrdijcbGOXR0jAlsMvDcJ3/TK9oEi46O/VRUzGXEiLOprDzF1KnjWb16T0lOTK7BAkXK\nR0/B4YpuPtuPCRztwFjggMM2/xH4f8Ah6/2/Av8Jl+AQi8W6liORCJFIJOtzt2KNXbuOcfjwyqx1\nQZaFd1dMFI0uKtly+VKqPxEpVi0tLbS0tAR+Hi/FSi8Ds4FHrL8vOWyzHTO12TDMvJdfA95wO2Bm\ncHDiXjns3AAqH2XhpV4uXyr1JyLFKvfB+YEHHgjkPKd52PdhTM7iXUyD/4et9eOAuLX8NvAM8Ftg\ns7Xuf/f3hPX1dYTD2SVa4bD7ENn5KAtXubyIlIKiG3jPaRRUwGGk0+BHZHVLX6GkRURKn0Zl7UEs\n9gQrVqwnkRhGKHScefNqicXu9DF5vdfXYbz9Prd6MIuUD43K2o14vJXVq/dkDYW9enUDX/lKa15u\njPkql++uqa8ChIj0hZc6h4Lh3nN3XZ5SlB+6DiLil5IIDqXeQqi3dB1ExC8lUaxkWgi1YoazCGHm\nTKgruxZCaiklIn4piZzDpZeOIxR6FngIM9PaQ4RCzzJ16tj8JmyAuTX1TbXoEhHprZLIOfz613tJ\nJJ7MWpdIPMmGDY15SlF+qAeziPilJIKDytrT1INZRPxQEsVKKmsXEfFXSQQHlbWLiPirZHpI57NX\nsohIvgTVQ7okcg4pqeDiJciIiEiJVEhr2AgREX+VRM5Bw0aIiPirJIKDmrKKiPirJIKDmrKKiPir\nJIKDmrKKiPhLTVlFRIqYZoITEREb9XMQEZEBo+AgIiI2Cg4iImKj4CAiIjYKDiIiYlMyYys1NTVz\n4kSIoUMT1NfXqRmriIgHRR8cNOieiIj/ir5YSYPuiYj4r+iDgwbdExHxn5fgcA2wFTgFTO5mu+nA\nduA9YIGH8znSoHsiIv7zEhx+D3wLaO1mm0HACkyAuBC4Dpjo4Zw2pTjoXktLS76TUDB0LdJ0LdJ0\nLYLnJThsB97tYZspwA5gF/A58DzwTQ/ntJkxYxrLlkWJRhuprY0RjTaybNn0oq6M1g8/TdciTdci\nTdcieEG3VjoH+DDj/W7gr/w+yYwZ04o6GIiIFJqegsM6oNph/ULglV4cX8OsiogUIT+Gef0V8PfA\nRofPpgIxTJ0DwH3An4BHHLbdAYR9SI+ISDlpA76U70Q4+RVwictnIUzCa4AhwFv4XCEtIiKF5VuY\n+oTjQDvwC2v9OCCesd2VwB8wOYP7BjKBIiIiIiJSQgLtJFdAdgGbgU3AG9a6szCV/u8CzcCojO3v\nw1yT7UBdxvpLMH1M3gOWBZpi//wTsB+T7hQ/v/tQ4AVr/QbgPH+T7yunaxHDtOTbZL2uzPisVK/F\nBEyR9FZgC1BvrS/H34XbtYhRfr+LLoMwxU01wGBKu05iJ+aHn+lR4HvW8gLgYWv5Qsy1GIy5NjtI\nNx54A9N/BODnpCv7C9l/Bi4m+4bo53e/E3jCWp6J6U9TqJyuxWLgbodtS/laVAP/wVo+A1P0PJHy\n/F24XYty/F10uRRYm/H+XutVinYCo3PWbQfGWMvV1nswTwWZuai1mJZfY4FtGetnAU/6ntJg1JB9\nQ/Tzu68l3X8mBBz0K9EBqcEeHP7eYbtyuBYpLwFfo7x/Fympa5HX30W+B95z6iR3Tp7SErQk8G/A\nb4FbrXVjMEUMWH9T/ynGYa5FSuq65K7fQ/FeLz+/e+bvKAEcwZ5LK3TzgbeBp0kXpZTLtajB5KZ+\ng34XNZhrscF6n7ffRb6DQzl1krsM849+JTAXU7yQKUl5XY9M5fzdAX4InI8pWtgH/GN+kzOgzgB+\nBtwFHM35rNx+F2cAP8Vci2Pk+XeR7+CwB1MZkzKB7MhXSvZZfw8C/wdTLrifdA/0scABazn3uozH\nXJc91nLm+j0BpTdofnz33Rn7nGsth4AzgY/9T3JgDpC+Ea4kXWZc6tdiMCYw/BhTlALl+7tIXYvV\npK9FXn8X+Q4OvwW+TLqT3Ezg5XwmKCDDgRHW8umY1gW/x3zX2db62aR/FC9jyguHYJ4cvoypaGoH\nOjBlhxVZX7jrAAAAv0lEQVTAtzP2KTZ+fPf/63Cs/w78MuC0+21sxvK3SNdHlPK1qMAUlbwDPJax\nvhx/F27Xohx/F1nKoZPc+ZjWBW9hmqqlvudZmHoIp2Z7CzHXZDsQzVifaqq2A2gKNNX+eQ7YC5zE\nlHt+F3+/+1DgJ6Sb6dUE8B38knstbgaewTRzfhtzMxyTsX2pXou/xgyl8xbppprTKc/fhdO1uJLy\n/F2IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIj07P8DzzbA6CMsTpkAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/braindump/iPRSV.ipynb b/doc/notebooks/braindump/iPRSV.ipynb new file mode 100644 index 00000000..223384e7 --- /dev/null +++ b/doc/notebooks/braindump/iPRSV.ipynb @@ -0,0 +1,377 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The iPSRV from Teus van der Stelt et al.\n", + "$$\\kappa = \\kappa_0+\\kappa_1\\left\\lbrace \\sqrt{[A-D(T_r+B)]^2+E}+A-D(T_r+B) \\right\\rbrace\\sqrt{T_r+C}$$\n", + "$$\\kappa_0 = 0.378893 + 1.4897153\\omega-0.17131848\\omega^2+0.0196554\\omega^3$$\n", + "$$ p = \\frac{RT}{v-b}-\\frac{a}{v^2+2 b v-b^2}$$\n", + "with\n", + "A = 1.1\n", + "B = 0.25\n", + "C = 0.2\n", + "D = 1.2\n", + "E = 0.01\n", + "\n", + "For ethanol, the value $\\kappa_1$ is -0.03374\n", + "\n", + "For water, the value $\\kappa_1$ is -0.06635" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from CoolProp.CoolProp import Props\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 64 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "kappa_dict = dict(Ethanol = -0.03374,\n", + " Water = -0.06635,\n", + " Propane = 0.03161)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 65 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Pure Fluids" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "T = 300 #[K]\n", + "p = 3000 #[kPa]\n", + "Fluid = 'Propane'\n", + "rhoc = Props(Fluid,'rhocrit') #[kg/m^3]\n", + "omega = Props(Fluid,'accentric') #[-]\n", + "R = 8.314472/(Props(Fluid,'molemass'))\n", + "Tc = Props(Fluid,'Tcrit')\n", + "pc = Props(Fluid,'pcrit')\n", + "T_r = T/Tc\n", + "kappa_1 = kappa_dict[Fluid]\n", + "rho_EOS = Props('D','T',T,'P',p,Fluid)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 66 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Ts = np.linspace(Props(Fluid,'Ttriple'),Tc,300)\n", + "ps = Props('P','T',Ts,'Q',1,Fluid)\n", + "plt.plot(Ts,ps)\n", + "plt.xlabel('T [K]')\n", + "plt.ylabel('p [kPa]')\n", + "plt.yscale('log')\n", + "plt.plot(T,p,'o')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 67, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 67 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = 1.1\n", + "B = 0.25\n", + "C = 0.2\n", + "D = 1.2\n", + "E = 0.01\n", + "kappa_0 = 0.378893 + 1.4897153*omega-0.17131848*omega**2+0.0196554*omega**3\n", + "kappa = kappa_0+kappa_1*(sqrt((A-D*(T_r+B))**2+E)+A-D*(T_r+B) )*sqrt(T_r+C)\n", + "alpha = (1+kappa*(1-sqrt(T_r)))**2\n", + "a = 0.457235*R**2*Tc**2/pc*alpha\n", + "b = 0.077796*R*Tc/pc" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 68 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = a*p/(R*R*T*T)\n", + "B = b*p/(R*T)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 69 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Z = np.linspace(0,1)\n", + "def f(Z):\n", + " return 1*Z**3+(-1+B)*Z**2+ (A-3*B*B-2*B)*Z -A*B+B**2+B**3\n", + "plt.plot(Z,f(Z))\n", + "plt.axhline(0,linestyle = '--')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 70, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nJEmSVNz+P4qdeORFAjw6AAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 70 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Z = np.roots([1,B-1,A-2*B-3*B*B,-A*B+B**2+B**3])\n", + "rho = p/(Z*R*T) # Z = p/(rho*R*T)\n", + "rho" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 71, + "text": [ + "array([ 69.42536782-63.64922759j, 69.42536782+63.64922759j,\n", + " 518.88328530 +0.j ])" + ] + } + ], + "prompt_number": 71 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "rho_EOS" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 72, + "text": [ + "495.5913139092507" + ] + } + ], + "prompt_number": 72 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Mixtures" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "components = ['Ethanol','Water']\n", + "z = [0.4, 0.6]\n", + "#T = 562.8969961 #[K]\n", + "T = 400 #[K]\n", + "p = 12e6 #[Pa]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 117 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "omega = np.array([Props(f,'accentric') for f in components]) #[-]\n", + "R = 8.314472 #[J/mol/K]\n", + "Tc = [Props(f,'Tcrit') for f in components] #[K]\n", + "pc = [Props(f,'pcrit')*1000 for f in components] #[Pa]\n", + "\n", + "A = 1.1\n", + "B = 0.25\n", + "C = 0.2\n", + "D = 1.2\n", + "E = 0.01\n", + "\n", + "kappa_0 = 0.378893 + 1.4897153*omega-0.17131848*omega**2+0.0196554*omega**3\n", + "kappa_1 = [kappa_dict[f] for f in components]\n", + "\n", + "a,b = 0,0\n", + "for i in range(len(components)):\n", + " \n", + " b += z[i]*0.077796*R*Tc[i]/pc[i]\n", + " \n", + " for j in range(len(components)):\n", + " kappa_i = kappa_0[i]+kappa_1[i]*(sqrt((A-D*(T/Tc[i]+B))**2+E)+A-D*(T/Tc[i]+B) )*sqrt(T/Tc[i]+C)\n", + " alpha_i = (1+kappa_i*(1-sqrt(T/Tc[i])))**2\n", + " a_i = 0.457235*R**2*Tc[i]**2/pc[i]*alpha_i\n", + " \n", + " kappa_j = kappa_0[j]+kappa_1[j]*(sqrt((A-D*(T/Tc[j]+B))**2+E)+A-D*(T/Tc[j]+B) )*sqrt(T/Tc[j]+C)\n", + " alpha_j = (1+kappa_j*(1-sqrt(T/Tc[j])))**2\n", + " a_j = 0.457235*R**2*Tc[j]**2/pc[j]*alpha_j\n", + " \n", + " if i != j:\n", + " k_ij = -0.3\n", + " else:\n", + " k_ij = 0\n", + " \n", + " a += z[i]*z[j]*(a_i*a_j)**0.5*(1-k_ij)\n", + "\n", + "AA = a*p/(R**2*T**2)\n", + "BB = b*p/(R*T)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 118 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "coeffs = [1,BB-1,AA-2*BB-3*BB**2,-AA*BB+BB**2+BB**3]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 119 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Z = np.linspace(0,1)\n", + "def f(Z):\n", + " return sum([a*Z**b for (a,b) in zip(coeffs,reversed(range(len(coeffs))))])\n", + "plt.plot(Z,f(Z))\n", + "plt.axhline(0,linestyle = '--')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 120, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\niIiIv/0/GIpr6V1/g5sAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 120 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Z = np.roots(coeffs)\n", + "rho = p/(Z*R*T) # Z = p/(rho*R*T), rho in [mol/m^3]\n", + "rho" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 121, + "text": [ + "array([ 1234.16865590-3249.94868206j, 1234.16865590+3249.94868206j,\n", + " 24827.37270034 +0.j ])" + ] + } + ], + "prompt_number": 121 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/fitting/Fitting Ancillary Equations.ipynb b/doc/notebooks/fitting/Fitting Ancillary Equations.ipynb new file mode 100644 index 00000000..0fa8dc63 --- /dev/null +++ b/doc/notebooks/fitting/Fitting Ancillary Equations.ipynb @@ -0,0 +1,104 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from CoolProp.CoolProp import Props\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Linearly Fitting Ancillary Equations" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Form of the Ancillary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each ancillary equation can be decomposed into a form like\n", + "$$ L = \\sum_{i} n_i\\Theta^{t_i} $$\n", + "where $\\Theta = 1-\\dfrac{T}{T_c}$ and the left hand side $L$ depends on the form to be fit. \n", + "\n", + "Four forms are commonly used depending on the curve being fit\n", + "\n", + "Saturated liquid:\n", + "$$ L = \\dfrac{\\rho'}{\\rho_c}-1 $$\n", + "\n", + "Saturated vapor:\n", + "$$ L = \\log\\left(\\dfrac{\\rho''}{\\rho_c}\\right)\\dfrac{T}{T_c} $$\n", + "\n", + "Saturation pressure:\n", + "$$ L = \\log\\left(\\dfrac{p''}{p_c}\\right)\\dfrac{T}{T_c} $$\n", + "\n", + "The left hand side and right hand side can be evaluated for a large number of \"experimental\" data points obtained from the EOS.\n", + "\n", + "The best fit coefficients $n_i$ will yield the ancillary values\n", + "\n", + "$$\\sum_m L_m = \\sum_m\\left[\\sum_{i=0}^{I-1} n_i\\Theta_m^{t_i}\\right]$$\n", + "\n", + "The residual is then given by \n", + "\n", + "$$ \\zeta = a_{0}- \\sum_{i=0}^{I-1}n_ia_{i}$$\n", + "\n", + "where $a_0$ is $L$, and $a_i$ is $\\Theta^{t_i}$\n", + "\n", + "The sum of the squares of the residuals over the $M$ \"measured\" data points is given by\n", + "\n", + "$$ \\chi^2 = \\sum_{m=0}^{M-1}\\left(a_{0,m}- \\sum_{i=0}^{I-1}n_ia_{i,m}\\right)^2\\cdot \\frac{1}{\\sigma_m}$$\n", + "\n", + "We then build a $\\mathbf{A}$ matrix and $\\mathbf{b}$ vector, following the methods of Span (2000, p. 64) where the entries are\n", + "\n", + "$$ a_{ij} = \\sum_{m=0}^{M-1}\\left(\\Theta_m^{t_i}\\Theta_m^{t_j} \\right) $$\n", + "\n", + "and \n", + "\n", + "$$ b_{i} = \\sum_{m=0}^{M-1}\\left(\\Theta_m^{t_i}L_m \\right) $$\n", + "\n", + "And then solve the matrix equation\n", + "\n", + "$$\\mathbf{A}\\mathbf{n} = \\mathbf{b} $$\n", + "\n", + "to get $\\mathbf{n}$" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/fitting/Setting up residuals.ipynb b/doc/notebooks/fitting/Setting up residuals.ipynb new file mode 100644 index 00000000..bb84a4ee --- /dev/null +++ b/doc/notebooks/fitting/Setting up residuals.ipynb @@ -0,0 +1,81 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from CoolProp.CoolProp import Props\n", + "from math import sqrt\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.optimize\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Residual Terms" + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Pressure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Presssure is given by\n", + "$$ \\frac{p}{\\rho R T} = 1+\\delta\\sum_{i=1}^I n_i\\left(\\frac{\\partial A_i(\\tau,\\delta)}{\\partial\\delta} \\right)_{\\tau} $$\n", + "Set up as a residual\n", + "$$ \\zeta = \\frac{p}{\\rho R T} - 1-\\delta\\sum_{i=1}^I n_i\\left(\\frac{\\partial A_i(\\tau,\\delta)}{\\partial\\delta} \\right)_{\\tau} $$\n", + "combine \n", + "$$ \\zeta = \\frac{p-\\rho R T}{\\rho R T} -\\delta\\sum_{i=1}^I n_i\\left(\\frac{\\partial A_i(\\tau,\\delta)}{\\partial\\delta} \\right)_{\\tau} $$\n", + "$$ \\zeta = \\frac{p-\\rho R T}{\\rho R T} -\\frac{\\rho}{\\rho_r}\\sum_{i=1}^I n_i\\left(\\frac{\\partial A_i(\\tau,\\delta)}{\\partial\\delta} \\right)_{\\tau} $$\n", + "We can divide through by $\\rho$ since we know $\\rho$ is non-zero\n", + "$$ \\zeta = \\frac{p-\\rho R T}{\\rho^2 R T} -\\sum_{i=1}^I n_i\\left(\\frac{1}{\\rho_r}\\frac{\\partial A_i(\\tau,\\delta)}{\\partial\\delta} \\right)_{\\tau} $$\n", + "to yield the solution from Span, 2000" + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Specific heat at constant volume" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Specific heat at constant volume\n", + "$$ \\frac{c_v}{R} = " + ], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/doc/notebooks/to_download_mathjax.ipynb b/doc/notebooks/to_download_mathjax.ipynb new file mode 100644 index 00000000..06c8f218 --- /dev/null +++ b/doc/notebooks/to_download_mathjax.ipynb @@ -0,0 +1,32 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.external import mathjax; mathjax.install_mathjax()" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/include/AbstractState.h b/include/AbstractState.h new file mode 100644 index 00000000..30c9bfb6 --- /dev/null +++ b/include/AbstractState.h @@ -0,0 +1,401 @@ +/* + * AbstractState.h + * + * Created on: 21 Dec 2013 + * Author: jowr + */ + +#ifndef ABSTRACTSTATE_H_ +#define ABSTRACTSTATE_H_ + +#include "CachedElement.h" +#include "Exceptions.h" +#include "DataStructures.h" + +#include + +namespace CoolProp { + +//! The mother of all state classes +/*! +This class provides the basic properties based on interrelations of the +properties, their derivatives and the Helmholtz energy terms. It does not +provide the mechanism to update the values. This has to be implemented in +a subclass. Most functions are defined as virtual functions allowing us +redefine them later, for example to implement the TTSE technique. The +functions defined here are always used as a fall-back. + +This base class does not perform any checks on the two-phase conditions and +alike. Most of the functions defined here only apply to compressible single +state substances. Make sure you are aware of all the assumptions we made +when using this class. + +Add build table function to Abstract State +Interpolator inherit AS implemented by TTSE BICUBIC + +*/ +class AbstractState { +protected: + + /// Some administrative variables + long _fluid_type; + long _phase; + bool _forceSinglePhase, _forceTwoPhase; + + //~ bool isCompressibleFluid(void){ + //~ return !(_fluid_type == FLUID_TYPE_INCOMPRESSIBLE_LIQUID + //~ || _fluid_type == FLUID_TYPE_INCOMPRESSIBLE_SOLUTION); + //~ } + + //~ bool checkCompressible(void){ + //~ if (!this->isCompressibleFluid()){throw ValueError(ERR_NOT_COMPRESSIBLE);} + //~ return true; + //~ } + + bool isHomogeneousPhase(void){ + return (this->_phase==iphase_liquid || this->_phase==iphase_gas || this->_phase == iphase_supercritical); + } + + bool isTwoPhase(void){ + return (this->_phase==iphase_twophase); + } + + //~ bool checkTwoPhase(void){ + //~ if (!this->isCompressibleFluid()){throw ValueError(ERR_NOT_A_TWO_PHASE_FLUID);} + //~ if (!this->isTwoPhase()&&!_forceTwoPhase){throw ValueError(ERR_NOT_A_TWO_PHASE_STATE);} + //~ return true; + //~ } + + //~ bool checkSinglePhase(void){ + //~ if (!this->isHomogeneousPhase()||!_forceSinglePhase){throw ValueError(ERR_NOT_A_TWO_PHASE_FUNCTION);} + //~ return true; + //~ } + + + /// Two important points + SimpleState _critical, _reducing; + + /// Molar mass [mol/kg] + CachedElement _molar_mass; + + /// Universal gas constant [J/mol/K] + CachedElement _gas_constant; + + /// Bulk values + double _rhomolar, _T, _p, _Q, _R; + + CachedElement _tau, _delta; + + /// Transport properties + CachedElement _viscosity, _conductivity, _surface_tension; + + CachedElement _hmolar, _smolar, _umolar, _logp, _logrhomolar, _cpmolar, _cvmolar, _speed_sound; + + /// Ancillary values + CachedElement _rhoLanc, _rhoVanc, _pLanc, _pVanc, _TLanc, _TVanc; + + CachedElement _fugacity_coefficient; + + /// Smoothing values + double _rhospline, _dsplinedp, _dsplinedh; + + /// Cached low-level elements for in-place calculation of other properties + CachedElement _alpha0, _dalpha0_dTau, _dalpha0_dDelta, _d2alpha0_dTau2, _d2alpha0_dDelta_dTau, + _d2alpha0_dDelta2, _d3alpha0_dTau3, _d3alpha0_dDelta_dTau2, _d3alpha0_dDelta2_dTau, + _d3alpha0_dDelta3, _alphar, _dalphar_dTau, _dalphar_dDelta, _d2alphar_dTau2, _d2alphar_dDelta_dTau, + _d2alphar_dDelta2, _d3alphar_dTau3, _d3alphar_dDelta_dTau2, _d3alphar_dDelta2_dTau, + _d3alphar_dDelta3; + + CachedElement _dalphar_dDelta_lim, _d2alphar_dDelta2_lim, + _d2alphar_dDelta_dTau_lim, _d3alphar_dDelta2_dTau_lim; + + /// Two-Phase variables + CachedElement _rhoLmolar, _rhoVmolar; + + // ---------------------------------------- + // Property accessors to be optionally implemented by the backend + // for properties that are not always calculated + // ---------------------------------------- + /// Using this backend, calculate the molar enthalpy in J/mol + virtual long double calc_hmolar(void){throw NotImplementedError("calc_hmolar is not implemented for this backend");}; + /// Using this backend, calculate the molar entropy in J/mol/K + virtual long double calc_smolar(void){throw NotImplementedError("calc_smolar is not implemented for this backend");}; + /// Using this backend, calculate the molar internal energy in J/mol + virtual long double calc_umolar(void){throw NotImplementedError("calc_umolar is not implemented for this backend");}; + /// Using this backend, calculate the molar constant-pressure specific heat in J/mol/K + virtual long double calc_cpmolar(void){throw NotImplementedError("calc_cpmolar is not implemented for this backend");}; + /// Using this backend, calculate the molar constant-volume specific heat in J/mol/K + virtual long double calc_cvmolar(void){throw NotImplementedError("calc_cvmolar is not implemented for this backend");}; + /// Using this backend, calculate the speed of sound in m/s + virtual long double calc_speed_sound(void){throw NotImplementedError("calc_speed_sound is not implemented for this backend");}; + /// Using this backend, calculate the isothermal compressibility \f$ \kappa = -\frac{1}{v}\left.\frac{\partial v}{\partial p}\right|_T=\frac{1}{\rho}\left.\frac{\partial \rho}{\partial p}\right|_T\f$ in 1/Pa + virtual long double calc_isothermal_compressibility(void){throw NotImplementedError("calc_isothermal_compressibility is not implemented for this backend");}; + /// Using this backend, calculate the isobaric expansion coefficient \f$ \beta = \frac{1}{v}\left.\frac{\partial v}{\partial T}\right|_p = -\frac{1}{\rho}\left.\frac{\partial \rho}{\partial T}\right|_p\f$ in 1/K + virtual long double calc_isobaric_expansion_coefficient(void){throw NotImplementedError("calc_isobaric_expansion_coefficient is not implemented for this backend");}; + /// Using this backend, calculate the viscosity in Pa-s + virtual long double calc_viscosity(void){throw NotImplementedError("calc_viscosity is not implemented for this backend");}; + /// Using this backend, calculate the thermal conductivity in W/m/K + virtual long double calc_conductivity(void){throw NotImplementedError("calc_conductivity is not implemented for this backend");}; + /// Using this backend, calculate the surface tension in N/m + virtual long double calc_surface_tension(void){throw NotImplementedError("calc_surface_tension is not implemented for this backend");}; + /// Using this backend, calculate the molar mass in kg/mol + virtual long double calc_molar_mass(void){throw NotImplementedError("calc_molar_mass is not implemented for this backend");}; + /// Using this backend, calculate the pressure in Pa + virtual long double calc_pressure(void){throw NotImplementedError("calc_pressure is not implemented for this backend");}; + /// Using this backend, calculate the universal gas constant \f$R_u\f$ in J/mol/K + virtual long double calc_gas_constant(void){throw NotImplementedError("calc_gas_constant is not implemented for this backend");}; + /// Using this backend, calculate the fugacity coefficient (dimensionless) + virtual long double calc_fugacity_coefficient(int i){throw NotImplementedError("calc_fugacity_coefficient is not implemented for this backend");}; + + + // Derivatives of residual helmholtz energy + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r\f$ (dimensionless) + virtual long double calc_alphar(void){throw NotImplementedError("calc_alphar is not implemented for this backend");}; + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r_{\delta}\f$ (dimensionless) + virtual long double calc_dalphar_dDelta(void){throw NotImplementedError("calc_dalphar_dDelta is not implemented for this backend");}; + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r_{\tau}\f$ (dimensionless) + virtual long double calc_dalphar_dTau(void){throw NotImplementedError("calc_dalphar_dTau is not implemented for this backend");}; + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r_{\delta\delta}\f$ (dimensionless) + virtual long double calc_d2alphar_dDelta2(void){throw NotImplementedError("calc_d2alphar_dDelta2 is not implemented for this backend");}; + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r_{\delta\tau}\f$ (dimensionless) + virtual long double calc_d2alphar_dDelta_dTau(void){throw NotImplementedError("calc_d2alphar_dDelta_dTau is not implemented for this backend");}; + /// Using this backend, calculate the residual Helmholtz energy term \f$\alpha^r_{\tau\tau}\f$ (dimensionless) + virtual long double calc_d2alphar_dTau2(void){throw NotImplementedError("calc_d2alphar_dTau2 is not implemented for this backend");}; + + // Derivatives of ideal-gas helmholtz energy + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0\f$ (dimensionless) + virtual long double calc_alpha0(void){throw NotImplementedError("calc_alpha0 is not implemented for this backend");}; + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0_{\delta}\f$ (dimensionless) + virtual long double calc_dalpha0_dDelta(void){throw NotImplementedError("calc_dalpha0_dDelta is not implemented for this backend");}; + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0_{\tau}\f$ (dimensionless) + virtual long double calc_dalpha0_dTau(void){throw NotImplementedError("calc_dalpha0_dTau is not implemented for this backend");}; + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0_{\delta\delta}\f$ (dimensionless) + virtual long double calc_d2alpha0_dDelta_dTau(void){throw NotImplementedError("calc_d2alpha0_dDelta_dTau is not implemented for this backend");}; + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0_{\delta\tau}\f$ (dimensionless) + virtual long double calc_d2alpha0_dDelta2(void){throw NotImplementedError("calc_d2alpha0_dDelta2 is not implemented for this backend");}; + /// Using this backend, calculate the ideal-gas Helmholtz energy term \f$\alpha^0_{\tau\tau}\f$ (dimensionless) + virtual long double calc_d2alpha0_dTau2(void){throw NotImplementedError("calc_d2alpha0_dTau2 is not implemented for this backend");}; + + virtual void calc_reducing_state(void){throw NotImplementedError("calc_reducing_state is not implemented for this backend");}; + + /// Using this backend, calculate the maximum temperature in K + virtual long double calc_Tmax(void){throw NotImplementedError("calc_Tmax is not implemented for this backend");}; + /// Using this backend, calculate the maximum pressure in Pa + virtual long double calc_pmax(void){throw NotImplementedError("calc_pmax is not implemented for this backend");}; + + /// Using this backend, calculate the 20-year global warming potential (GWP) + virtual long double calc_GWP20(void){throw NotImplementedError("calc_GWP20 is not implemented for this backend");}; + /// Using this backend, calculate the 100-year global warming potential (GWP) + virtual long double calc_GWP100(void){throw NotImplementedError("calc_GWP100 is not implemented for this backend");}; + /// Using this backend, calculate the 500-year global warming potential (GWP) + virtual long double calc_GWP500(void){throw NotImplementedError("calc_GWP500 is not implemented for this backend");}; + /// Using this backend, calculate the ozone depletion potential (ODP) + virtual long double calc_ODP(void){throw NotImplementedError("calc_ODP is not implemented for this backend");}; + /// Using this backend, calculate the flame hazard + virtual long double calc_flame_hazard(void){throw NotImplementedError("calc_flame_hazard is not implemented for this backend");}; + /// Using this backend, calculate the health hazard + virtual long double calc_health_hazard(void){throw NotImplementedError("calc_health_hazard is not implemented for this backend");}; + /// Using this backend, calculate the physical hazard + virtual long double calc_physical_hazard(void){throw NotImplementedError("calc_physical_hazard is not implemented for this backend");}; + + /// Calculate the first partial derivative for the desired derivative + virtual long double calc_first_partial_deriv(int Of, int Wrt, int Constant){throw NotImplementedError("calc_first_partial_deriv is not implemented for this backend");}; + + /// Using this backend, calculate the reduced density (rho/rhoc) + virtual long double calc_reduced_density(void){throw NotImplementedError("calc_reduced_density is not implemented for this backend");}; + /// Using this backend, calculate the reciprocal reduced temperature (Tc/T) + virtual long double calc_reciprocal_reduced_temperature(void){throw NotImplementedError("calc_reciprocal_reduced_temperature is not implemented for this backend");}; + + /// Using this backend, calculate the second virial coefficient + virtual long double calc_Bvirial(void){throw NotImplementedError("calc_Bvirial is not implemented for this backend");}; + /// Using this backend, calculate the third virial coefficient + virtual long double calc_Cvirial(void){throw NotImplementedError("calc_Cvirial is not implemented for this backend");}; + /// Using this backend, calculate the derivative dB/dT + virtual long double calc_dBvirial_dT(void){throw NotImplementedError("calc_dBvirial_dT is not implemented for this backend");}; + /// Using this backend, calculate the derivative dC/dT + virtual long double calc_dCvirial_dT(void){throw NotImplementedError("calc_dCvirial_dT is not implemented for this backend");}; + + /// Using this backend, get the name of the fluid + virtual std::string calc_name(void){throw NotImplementedError("calc_name is not implemented for this backend");}; + + /// Using this backend, get the triple point temperature in K + virtual long double calc_Ttriple(void){throw NotImplementedError("calc_Ttriple is not implemented for this backend");}; + +public: + + virtual long double calc_melt_p_T(long double T){throw NotImplementedError("calc_melt_p_T is not implemented for this backend");}; + virtual long double calc_melt_T_p(long double p){throw NotImplementedError("calc_melt_T_p is not implemented for this backend");}; + virtual long double calc_melt_rho_T(long double T){throw NotImplementedError("calc_melt_rho_T is not implemented for this backend");}; + + AbstractState(){}; + virtual ~AbstractState(){}; + + + + /// A factory function to return a pointer to a new-allocated instance of one of the backends. + /** + Very Important!! : You must ensure to delete the backend instance that is created, otherwise there will be a memory leak + + The backend that is selected is based on the string passed in: + + 1. If it starts with "REFPROP-", or no backend specification is provided, the function will assume that the backend is the CORE backend (for backwards-compatibility reasons) + 2. If it starts with "REFPROP-", the REFPROP backend will be used. The remaining part of the string should then + either be + 1. A pure or pseudo-pure fluid name (eg. "PROPANE" or "R410A"), yielding a REFPROPBackend instance. + 2. A string that encodes the components of the mixture with a vertical bar between them (e.g. "R32|R125"), yielding a REFPROPMixtureBackend instance. + 3. If it starts with "TTSE", the TTSE backend will be used, yielding a TTSEBackend instance + 4. If it starts with "BICUBIC", the BICUBIC backend will be used, yielding a BICUBICBackend instance + + */ + static AbstractState * factory(const std::string &backend, const std::string &fluid_string); + + bool clear(); + virtual void update(long input_pair, double Value1, double Value2) = 0; + virtual void set_mole_fractions(const std::vector &mole_fractions) = 0; + virtual void set_mass_fractions(const std::vector &mass_fractions) = 0; + + void set_mole_fractions(const std::vector &mole_fractions){set_mole_fractions(std::vector(mole_fractions.begin(), mole_fractions.end()));}; + void set_mass_fractions(const std::vector &mass_fractions){set_mass_fractions(std::vector(mass_fractions.begin(), mass_fractions.end()));}; + + // The derived classes must implement this function to define whether they use mole fractions (true) or mass fractions (false) + virtual bool using_mole_fractions(void) = 0; + + const CoolProp::SimpleState & get_reducing(){return _reducing;}; + + double keyed_output(int key); + + long double first_partial_deriv(int Of, int Wrt, int Constant){return calc_first_partial_deriv(Of,Wrt,Constant);}; + + // Limits + double Tmax(void); + double pmax(void); + double Ttriple(void); + + std::string name(){return calc_name();}; + + // ---------------------------------------- + // Bulk properties - temperature and density are directly calculated every time + // All other parameters are calculated on an as-needed basis + // ---------------------------------------- + double T(void) {return _T;}; + double rhomolar(void){return _rhomolar;}; + double p(void) {return _p;}; + double Q(void) {return _Q;}; + + double tau(void); + double delta(void); + + double molar_mass(void); + double gas_constant(void); + + double Bvirial(void); + double dBvirial_dT(void); + double Cvirial(void); + double dCvirial_dT(void); + + double hmolar(void); + double smolar(void); + double umolar(void); + double cpmolar(void); + double cvmolar(void); + double speed_sound(void); + double isothermal_compressibility(void); + double isobaric_expansion_coefficient(void); + double fugacity_coefficient(int i); + //double fundamental_derivative_of_gas_dynamics(void); + + // ---------------------------------------- + // Transport properties + // ---------------------------------------- + double viscosity(void); + double conductivity(void); + double surface_tension(void); + + // ---------------------------------------- + // Helmholtz energy and derivatives + // ---------------------------------------- + /// Return the derivative \f$ \alpha^0 \f$ + long double alpha0(void){ + if (!_alpha0) _alpha0 = calc_alpha0(); + return _alpha0; + }; + long double dalpha0_dDelta(void){ + if (!_dalpha0_dDelta) _dalpha0_dDelta = calc_dalpha0_dDelta(); + return _dalpha0_dDelta; + }; + long double dalpha0_dTau(void){ + if (!_dalpha0_dTau) _dalpha0_dTau = calc_dalpha0_dTau(); + return _dalpha0_dTau; + }; + long double d2alpha0_dDelta2(void){ + if (!_d2alpha0_dDelta2) _d2alpha0_dDelta2 = calc_d2alpha0_dDelta2(); + return _d2alpha0_dDelta2; + }; + long double d2alpha0_dDelta_dTau(void){ + if (!_d2alpha0_dDelta_dTau) _d2alpha0_dDelta_dTau = calc_d2alpha0_dDelta_dTau(); + return _d2alpha0_dDelta_dTau; + }; + long double d2alpha0_dTau2(void){ + if (!_d2alpha0_dTau2) _d2alpha0_dTau2 = calc_d2alpha0_dTau2(); + return _d2alpha0_dTau2; + }; + /* + virtual double d3alpha0_dDelta3(void) = 0; + virtual double d3alpha0_dDelta2_dTau(void) = 0; + virtual double d3alpha0_dDelta_dTau2(void) = 0; + virtual double d3alpha0_dTau3(void) = 0; + */ + + long double alphar(void){ + if (!_alphar) _alphar = calc_alphar(); + return _alphar; + }; + long double dalphar_dDelta(void){ + if (!_dalphar_dDelta) _dalphar_dDelta = calc_dalphar_dDelta(); + return _dalphar_dDelta; + }; + long double dalphar_dTau(void){ + if (!_dalphar_dTau) _dalphar_dTau = calc_dalphar_dTau(); + return _dalphar_dTau; + }; + long double d2alphar_dDelta2(void){ + if (!_d2alphar_dDelta2) _d2alphar_dDelta2 = calc_d2alphar_dDelta2(); + return _d2alphar_dDelta2; + }; + long double d2alphar_dDelta_dTau(void){ + if (!_d2alphar_dDelta_dTau) _d2alphar_dDelta_dTau = calc_d2alphar_dDelta_dTau(); + return _d2alphar_dDelta_dTau; + }; + long double d2alphar_dTau2(void){ + if (!_d2alphar_dTau2) _d2alphar_dTau2 = calc_d2alphar_dTau2(); + return _d2alphar_dTau2; + }; + /* + virtual double d3alphar_dDelta3(void) = 0; + virtual double d3alphar_dDelta2_dTau(void) = 0; + virtual double d3alphar_dDelta_dTau2(void) = 0; + virtual double d3alphar_dTau3(void) = 0; + + virtual double dalphar_dDelta_lim(void) = 0; + virtual double d2alphar_dDelta2_lim(void) = 0; + virtual double d2alphar_dDelta_dTau_lim(void) = 0; + virtual double d3alphar_dDelta2_dTau_lim(void) = 0; + */ +}; + +class AbstractStateWrapper +{ +protected: + AbstractState *p; +public: + AbstractStateWrapper(){this->p = NULL;}; + AbstractStateWrapper(const std::string &backend, const std::string &fluid_string){ + this->p = AbstractState::factory(backend, fluid_string); + }; + ~AbstractStateWrapper(){delete this->p;}; + void update(long input_pair, double Value1, double Value2){ this->p->update(input_pair,Value1,Value2); }; + double keyed_output(int key) { return this->p->keyed_output(key); } +}; + +} /* namespace CoolProp */ +#endif /* ABSTRACTSTATE_H_ */ diff --git a/include/CachedElement.h b/include/CachedElement.h new file mode 100644 index 00000000..90026b00 --- /dev/null +++ b/include/CachedElement.h @@ -0,0 +1,82 @@ +/* + * CachedElement.h + * + * Created on: 21 Dec 2013 + * Author: jowr + */ + +#ifndef CACHEDELEMENT_H_ +#define CACHEDELEMENT_H_ + +#include "CoolPropTools.h" +#include "DataStructures.h" + +namespace CoolProp { + +/*! +A class that contains the magic to cache a value. + +Includes an "=" assignment operator and casting to boolean +so you can do something like:: + +double CoolPropStateClassSI::d3phir_dTau3(double tau, double delta){ + if (cache.d3phir_dTau3) { + return cache.d3phir_dTau3; + } else { + cache.d3phir_dTau3 = pFluid->d3phir_dTau3(tau,delta); + return cache.d3phir_dTau3; + } +}; +*/ + +class CachedElement { + +private: + bool is_cached; + long double value; +public: + /// Default constructor + CachedElement() { + this->clear(); + }; + + /// Function to carry out the caching + void _do_cache(double value) + { + this->value = value; + this->is_cached = true; + } + + /// Assignment operator - sets the value and sets the flag + void operator=(const double& value) { + _do_cache(value); + }; + + /// Cast to boolean, for checking if cached + operator bool() {return is_cached;}; + + /// Cast to double, for returning value + operator double() { + if (is_cached) {return static_cast(value); } + else { + throw std::exception(); + } + } + operator long double() { + if (is_cached) {return value; } + else { + throw std::exception(); + } + } + /// Clear the flag and the value + void clear() { + is_cached = false; + this->value = _HUGE; + }; + long double &pt(){ + return this->value; + } +}; + +} /* namespace CoolProp */ +#endif /* CACHEDELEMENT_H_ */ diff --git a/include/CoolProp.h b/include/CoolProp.h new file mode 100644 index 00000000..a230f9ff --- /dev/null +++ b/include/CoolProp.h @@ -0,0 +1,183 @@ +/* +Add some pre-processor directives to this file so that it can either be built as +usual, or if the COOLPROP_LIB macro is defined, it will export the functions in +this file for building a static or dynamic library. + +The __stdcall calling convention is used by default. By providing the macro CONVENTION, the +calling convention can be changed at build time. + +Any functions that are exported to DLL must also add the "EXPORT_CODE function_name CONVENTION ..." code +to the CoolProp.cpp implementation. See the Props function for instance +*/ + +/*! \mainpage CoolProp Core Code Documentation + +Welcome to the home page for the C++ sources of CoolProp. This information may be useful for developers or just the plain inquisitive + +You might want to start by looking at CoolProp.h +*/ + +#ifndef CoolProp_H +#define CoolProp_H + + #include + #include + + namespace CoolProp { + + /*/// Return a fluid value that does not depend on the thermodynamic state + /// @param FluidName The name of the fluid + /// @param Output The name of the output parameter, some options are "Ttriple", "Tcrit", "pcrit", "Tmin", "molemass", "rhocrit", "accentric" (not all parameters are valid for all fluids) + /// @returns val The value, or _HUGE if not valid + double Props1SI(std::string FluidName,std::string Output);*/ + /// Return a value that depends on the thermodynamic state + /// @param Output The output parameter, one of "T","D","H",etc. + /// @param Name1 The first state variable name, one of "T","D","H",etc. + /// @param Prop1 The first state variable value + /// @param Name2 The second state variable name, one of "T","D","H",etc. + /// @param Prop2 The second state variable value + /// @param FluidName The fluid name + double PropsSI(const std::string &Output, const std::string &Name1, double Prop1, const std::string &Name2, double Prop2, const std::string &FluidName); + /// Return a value that depends on the thermodynamic state + /// @param Output The output parameter, one of "T","D","H",etc. + /// @param Name1 The first state variable name, one of "T","D","H",etc. + /// @param Prop1 The first state variable value + /// @param Name2 The second state variable name, one of "T","D","H",etc. + /// @param Prop2 The second state variable value + /// @param FluidName The fluid name + /// @param x The mole or mass fractions depending on the requirements of the backend + double PropsSI(const std::string &Output, const std::string &Name1, double Prop1, const std::string &Name2, double Prop2, const std::string &FluidName, const std::vector &x); + + /// Return a value that depends on the thermodynamic state + /// @param Output The output parameter, one of "T","D","H",etc. + /// @param Name1 The first state variable name, one of "T","D","H",etc. + /// @param Prop1 The first state variable value + /// @param Name2 The second state variable name, one of "T","D","H",etc. + /// @param Prop2 The second state variable value + /// @param FluidName The fluid name + /// @param z The mole or mass fractions depending on the requirements of the backend + std::vector PropsSI(const std::string &Output, const std::string &Name1, const std::vector &Prop1, const std::string &Name2, const std::vector Prop2, const std::string &FluidName, const std::vector &z); + + /** + \overload + \sa PropsSI(std::string &Output, std::string &Name1, double Prop1, std::string &Name2, double Prop2, std::string &FluidName, const std::vector &x); + */ + double PropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *FluidName, const std::vector &x); + + /// Get the debug level + /// @returns level The level of the verbosity for the debugging output (0-10) 0: no debgging output + int get_debug_level(); + /// Set the debug level + /// @param level The level of the verbosity for the debugging output (0-10) 0: no debgging output + void set_debug_level(int level); + + /// Set the global error string + /// @param error The error string to use + void set_error_string(std::string error); + /// An internal function to set the global warning string + /// @param warning The string to set as the warning string + void set_warning_string(std::string warning); + + /// Get a globally-defined string + /// @param ParamName A string, one of "version", "errstring", "warnstring", "gitrevision", "FluidsList", "fluids_list" + /// @returns str The string, or an error message if not valid input + std::string get_global_param_string(std::string ParamName); + + /*/// Get a long that represents the fluid type + /// @param FluidName The fluid name as a string + /// @returns long element from global type enumeration + long getFluidType(std::string FluidName); + /// Get a string for a value from a fluid (numerical values can be obtained from Props1 function) + /// @param FluidName The name of the fluid + /// @param ParamName A string, one of "aliases", "CAS", "CAS_number", "ASHRAE34", "REFPROPName","REFPROP_name", "TTSE_mode" + /// @returns str The string, or an error message if not valid input + std::string get_fluid_param_string(std::string FluidName, std::string ParamName); + /// Returns the BibTeX key from the bibtex library of CoolProp corresponding to the item requested + /// @param FluidName The name of the fluid + /// @param item String, one of "EOS","CP0", "VISCOSITY", "CONDUCTIVITY", "ECS_LENNARD_JONES", "ECS_FITS", "SURFACE_TENSION" + /// @returns key the BibTeX key + std::string get_BibTeXKey(std::string FluidName, std::string item); + /// Add a REFPROP fluid to the fluid listing in CoolProp + bool add_REFPROP_fluid(std::string FluidName); + /// Get the parameter index for a given parameter + /// @param param The string for an input or output parameter + /// @returns index The parameter index (for use in IProps or elsewhere); -1 if not found + long get_param_index(std::string param); + /// Set the reference state for a pointer to a fluid (not exposed) + /// @param pFluid A pointer to a Fluid instance + /// @param reference_state The reference state to use, one of "IIR" (h=200 kJ/kg, s=1 kJ/kg/K at 0C sat. liq.) "ASHRAE" (h=0,s=0 @ -40C sat liq), "NBP" (h=0,s=0 @ 1.0 bar sat liq.) + //int set_reference_stateP(Fluid *pFluid, std::string reference_state); + /// Set the reference state based on a string representation (consistent naming with RFPROP) + /// @param FluidName The name of the fluid + /// @param reference_state The reference state to use, one of "IIR" (h=200 kJ/kg, s=1 kJ/kg/K at 0C sat. liq.) "ASHRAE" (h=0,s=0 @ -40C sat liq), "NBP" (h=0,s=0 @ 1.0 bar sat liq.) + //int set_reference_stateS(std::string FluidName, std::string reference_state);*/ + /// Set the reference state based on a state point + /// @param FluidName The name of the fluid + /// @param T Temperature at reference state [K] + /// @param rho Density at reference state [kg/m^3] + /// @param h0 Enthalpy at reference state [kJ/kg] + /// @param s0 Entropy at references state [kJ/kg/K] + //int set_reference_stateD(std::string FluidName, double T, double rho, double h0, double s0); + + /* + /// Return the phase of the given state point with temperature, pressure as inputs + /// @param FluidName The name of the fluid + /// @param T Temperature [K] + /// @param p Pressure [kPa] + /// @returns Phase as string, one of ""Two-Phase","Supercritical","Gas","Liquid" + std::string Phase(std::string FluidName, double T, double p); + /// Return the phase of the given state point with temperature, density as inputs + /// @param FluidName The name of the fluid + /// @param T Temperature [K] + /// @param rho Density [kg/m^3] + /// @returns Phase as string, one of ""Two-Phase","Supercritical","Gas","Liquid" + std::string Phase_Trho(std::string FluidName, double T, double rho); + /// Return the phase of the given state point with temperature, pressure as inputs + /// @param FluidName The name of the fluid + /// @param T Temperature [K] + /// @param p Pressure [kPa] + /// @returns Phase as string, one of ""Two-Phase","Supercritical","Gas","Liquid" + std::string Phase_Tp(std::string FluidName, double T, double p); + /// Return some low level derivative terms, see source for a complete list + /// @param Term String, some options are "phir" (residual Helmholtz energy),"dphir_dDelta", "dphir_dTau", etc. + /// @param T Temperature [K] + /// @param rho Density [kg/m^3] + /// @param FluidName String + double DerivTerms(std::string Term, double T, double rho, std::string FluidName); + /// Return some low level derivative terms, see source for a complete list + /// @param iTerm long desired output + /// @param T Temperature [K] + /// @param rho Density [kg/m^3] + /// @param pFluid Pointer to Fluid instance + double DerivTerms(long iTerm, double T, double rho, Fluid * pFluid);*/ + /*/// Return a fluid value that does not depend on the thermodynamic state + /// @param FluidName The name of the fluid + /// @param Output The name of the output parameter, some options are "Ttriple", "Tcrit", "pcrit", "Tmin", "molemass", "rhocrit", "accentric" (not all parameters are valid for all fluids) + /// @returns val The value, or _HUGE if not valid + double Props1(std::string FluidName,std::string Output); + /// Return a value that depends on the thermodynamic state + /// @param Output The output parameter, one of "T","D","H",etc. + /// @param Name1 The first state variable name, one of "T","D","H",etc. + /// @param Prop1 The first state variable value + /// @param Name2 The second state variable name, one of "T","D","H",etc. + /// @param Prop2 The second state variable value + /// @param FluidName The fluid name + double Props(std::string Output,std::string Name1, double Prop1, std::string Name2, double Prop2, std::string FluidName); + /// Return a value that depends on the thermodynamic state + /// @param Output The output parameter, one of "T","D","H",etc. + /// @param Name1 The first state variable name, one of "T","D","H",etc. + /// @param Prop1 The first state variable value + /// @param Name2 The second state variable name, one of "T","D","H",etc. + /// @param Prop2 The second state variable value + /// @param FluidName The fluid name + double Props(std::string Output,char Name1, double Prop1, char Name2, double Prop2, std::string FluidName);*/ + + + + //// **************** DEPRECATION WARNING *********************** + ///// Nearly deprecated function + //void set_phase(std::string Phase_str); + + } /* namespace CoolProp */ +#endif + diff --git a/include/CoolPropDLL.h b/include/CoolPropDLL.h new file mode 100644 index 00000000..1f1b5781 --- /dev/null +++ b/include/CoolPropDLL.h @@ -0,0 +1,157 @@ +#ifndef COOLPROPDLL_H +#define COOLPROPDLL_H + + #include "PlatformDetermination.h" + + #if defined(COOLPROP_LIB) + # ifndef EXPORT_CODE + # if defined(__ISWINDOWS__) + # define EXPORT_CODE extern "C" __declspec(dllexport) + # else + # define EXPORT_CODE extern "C" + # endif + # endif + # ifndef CONVENTION + # if defined(__ISWINDOWS__) + # define CONVENTION __stdcall + # else + # define CONVENTION + # endif + # endif + #else + # ifndef EXPORT_CODE + # define EXPORT_CODE + # endif + # ifndef CONVENTION + # define CONVENTION + # endif + #endif + + // Hack for PowerPC compilation to only use extern "C" + #if defined(__powerpc__) || defined(EXTERNC) + # undef EXPORT_CODE + # define EXPORT_CODE extern "C" + #endif + + // Functions with the call type like + // EXPORT_CODE void CONVENTION AFunction(double, double); + // will be exported to the DLL + + /* + #################################################################################### + Overloads for DLL wrapping puposes + + These functions take strings which are 0-terminated. These functions pass directly to + equivalently named functions in CoolProp.h that take std::string + #################################################################################### + */ + + /** + \overload + \sa Props1SI(std::string, std::string) + */ + EXPORT_CODE double CONVENTION Props1SI(const char *FluidName, const char* Output); + /** + \overload + \sa PropsSI(std::string, std::string, double, std::string, double, std::string) + */ + EXPORT_CODE double CONVENTION PropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *Ref); + /** + \overload + \sa Props(std::string, std::string, double, std::string, double, std::string) + */ + EXPORT_CODE double CONVENTION PropsS(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *Ref); + /** + \overload + \sa Props(std::string, std::string, double, std::string, double, std::string) + */ + EXPORT_CODE double CONVENTION Props(const char *Output, const char Name1, double Prop1, const char Name2, double Prop2, const char *Ref); + /** + \overload + \sa Props1(std::string, std::string) + */ + EXPORT_CODE double CONVENTION Props1(const char *FluidName, const char *Output); + /** + \overload + \sa IsFluidType(std::string, std::string) + */ + EXPORT_CODE int CONVENTION IsFluidType(const char *Ref, const char *Type); + + // When using SWIG, it is extremely difficult to deal with char* for output strings, so just use + // the std::string version since SWIG can handle std::string just fine + #if defined(SWIG) + std::string get_global_param_string(std::string ParamName); + std::string get_fluid_param_string(std::string FluidName, std::string ParamName); + #else + EXPORT_CODE long CONVENTION get_global_param_string(const char *param, char *Output); + EXPORT_CODE long CONVENTION get_fluid_param_string(const char *fluid, const char *param, char *Output); + #endif + + /** + \overload + \sa set_reference_stateS(std::string, std::string) + */ + EXPORT_CODE int CONVENTION set_reference_stateS(const char *Ref, const char *reference_state); + /** + \overload + \sa set_reference_stateD(std::string, double, double, double, double) + */ + EXPORT_CODE int CONVENTION set_reference_stateD(const char *Ref, double T, double rho, double h0, double s0); + /* + #################################################################################### + Implemented functions + + These functions take inputs that are compatible with DLL passing and are + implemented in CoolPropDLL.cpp + #################################################################################### + */ + + /** + \brief FORTRAN 77 style wrapper of the PropsSI function + \sa PropsSI(std::string, std::string, double, std::string, double, std::string) + */ + EXPORT_CODE void CONVENTION F77PropsSI(const char *Output, const char *Name1, double *Prop1, const char *Name2, double *Prop2, const char * Ref, double *output); + /** + + */ + EXPORT_CODE double CONVENTION PropsSIZ(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *FluidName, const double *z, int n); + + // This version uses the indices in place of the strings for speed. Get the parameter indices + // from get_param_index('D') for instance and the Fluid index from get_Fluid_index('Air') for instance + EXPORT_CODE double CONVENTION IPropsSI(long iOutput, long iName1, double Prop1, long iName2, double Prop2, long iFluid); + EXPORT_CODE double CONVENTION IProps(long iOutput, long iName1, double Prop1, long iName2, double Prop2, long iFluid); + + /// Convert from degrees Fahrenheit to Kelvin (useful primarily for testing) + EXPORT_CODE double CONVENTION F2K(double T_F); + /// Convert from Kelvin to degrees Fahrenheit (useful primarily for testing) + EXPORT_CODE double CONVENTION K2F(double T_K); + + EXPORT_CODE long CONVENTION get_param_index(const char *param); + EXPORT_CODE long CONVENTION redirect_stdout(const char *file); + + // --------------------------------- + // Getter and setter for debug level + // --------------------------------- + + /// Get the debug level + /// @returns level The level of the verbosity for the debugging output (0-10) 0: no debgging output + EXPORT_CODE int CONVENTION get_debug_level(); + /// Set the debug level + /// @param level The level of the verbosity for the debugging output (0-10) 0: no debgging output + EXPORT_CODE void CONVENTION set_debug_level(int level); + + // --------------------------------- + // Humid Air Properties + // --------------------------------- + + + EXPORT_CODE double CONVENTION HAPropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *Name3, double Prop3); + + /** + \brief FORTRAN 77 style wrapper of the HAPropsSI function + */ + EXPORT_CODE void CONVENTION F77HAPropsSI(const char *Output, const char *Name1, double *Prop1, const char *Name2, double *Prop2, const char *Name3, double *Prop3, double *output); + + + +#endif diff --git a/include/CoolPropTools.h b/include/CoolPropTools.h new file mode 100644 index 00000000..41695157 --- /dev/null +++ b/include/CoolPropTools.h @@ -0,0 +1,248 @@ +#ifndef COOLPROPTOOLS_H +#define COOLPROPTOOLS_H + + #define _CRT_SECURE_NO_WARNINGS + + #include "PlatformDetermination.h" + + #include + #include + #include + #include "float.h" + + #ifndef M_PI + # define M_PI 3.14159265358979323846 + #endif + + #ifndef COOLPROP_OK + #define COOLPROP_OK 1 + #endif + + #ifdef HUGE_VAL + # define _HUGE HUGE_VAL + #else + // GCC Version of huge value macro + #ifdef HUGE + # define _HUGE HUGE + #endif + #endif + + #if defined(_MSC_VER) + // Microsoft version of math.h doesn't include acosh or asinh, so we just define them here. + // It was included from Visual Studio 2013 + #if _MSC_VER < 1800 + static double acosh(double x) + { + return log(x + sqrt(x*x - 1.0)); + } + static double asinh(double value) + { + if(value>0){ + return log(value + sqrt(value * value + 1)); + } + else{ + return -log(-value + sqrt(value * value + 1)); + } + } + #endif + #endif + + #if defined(__powerpc__) + // PPC version of math.h doesn't include acosh or asinh, so we just define them here + static double acosh(double x) + { + return log(x + sqrt(x*x - 1.0) ); + } + static double asinh(double value) + { + if(value>0){ + return log(value + sqrt(value * value + 1)); + } + else{ + return -log(-value + sqrt(value * value + 1)); + } + } + #endif + + #if defined(__powerpc__) + #undef min + #undef max + #undef EOS + #endif + + inline bool ValidNumber(double x) + { + // Idea from http://www.johndcook.com/IEEE_exceptions_in_cpp.html + return (x <= DBL_MAX && x >= -DBL_MAX); + }; + + /// Define the deprecated macro to give compile-time warnings + #ifdef __GNUC__ + #define DEPRECATED(func) func __attribute__ ((deprecated)) + #elif defined(_MSC_VER) + #define DEPRECATED(func) __declspec(deprecated) func + #else + #pragma message("WARNING: You need to implement DEPRECATED for this compiler") + #define DEPRECATED(func) func + #endif + + #include + #include + #include + #include + #include + #include + #include + + /// The following code for the trim functions was taken from http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring + // trim from start + inline std::string &strlstrip(std::string &s) { + s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); + return s; + } + // trim from end + inline std::string &strrstrip(std::string &s) { + s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); + return s; + } + // trim from both ends + inline std::string &strstrip(std::string &s) { + return strlstrip(strrstrip(s)); + } + + // Get all the contents of a file and dump into a STL string + // Thanks to http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring + std::string get_file_contents(const char *filename); + + // Missing string printf + std::string format(const char* fmt, ...); + // Missing string split - like in Python + std::vector strsplit(std::string s, char del); + + inline std::string upper(const std::string str_) + { + std::string str = str_; + std::transform(str.begin(), str.end(), str.begin(), ::toupper); + return str; + } + + std::string strjoin(std::vector strings, std::string delim); + + void MatInv_2(double A[2][2] , double B[2][2]); + + double root_sum_square(std::vector x); + double interp1d(std::vector *x, std::vector *y, double x0); + double powInt(double x, int y); + + template T LinearInterp(T x0, T x1, T y0, T y1, T x) + { + return (y1-y0)/(x1-x0)*(x-x0)+y0; + }; + template T LinearInterp(std::vector x, std::vector y, std::size_t i0, std::size_t i1, T val) + { + return LinearInterp(x[i0],x[i1],y[i0],y[i1],val); + }; + + template T QuadInterp(T x0, T x1, T x2, T f0, T f1, T f2, T x) + { + /* Quadratic interpolation. + Based on method from Kreyszig, + Advanced Engineering Mathematics, 9th Edition + */ + T L0, L1, L2; + L0=((x-x1)*(x-x2))/((x0-x1)*(x0-x2)); + L1=((x-x0)*(x-x2))/((x1-x0)*(x1-x2)); + L2=((x-x0)*(x-x1))/((x2-x0)*(x2-x1)); + return L0*f0+L1*f1+L2*f2; + }; + template T QuadInterp(std::vector x, std::vector y, int i0, int i1, int i2, T val) + { + return QuadInterp(x[i0],x[i1],x[i2],y[i0],y[i1],y[i2],val); + }; + + template T CubicInterp( T x0, T x1, T x2, T x3, T f0, T f1, T f2, T f3, T x) + { + /* + Lagrange cubic interpolation as from + http://nd.edu/~jjwteach/441/PdfNotes/lecture6.pdf + */ + T L0,L1,L2,L3; + L0=((x-x1)*(x-x2)*(x-x3))/((x0-x1)*(x0-x2)*(x0-x3)); + L1=((x-x0)*(x-x2)*(x-x3))/((x1-x0)*(x1-x2)*(x1-x3)); + L2=((x-x0)*(x-x1)*(x-x3))/((x2-x0)*(x2-x1)*(x2-x3)); + L3=((x-x0)*(x-x1)*(x-x2))/((x3-x0)*(x3-x1)*(x3-x2)); + return L0*f0+L1*f1+L2*f2+L3*f3; + }; + template T CubicInterp(std::vector x, std::vector y, int i0, int i1, int i2, int i3, T val) + { + return CubicInterp(x[i0],x[i1],x[i2],x[i3],y[i0],y[i1],y[i2],y[i3],val); + }; + + template T is_in_closed_range( T x1, T x2, T x) + { + if (x1 > x2) + { + std::swap(x1, x2); + } + + return (x >= x1 && x <= x2); + }; + + void solve_cubic(double a, double b, double c, double d, int &N, double &x0, double &x1, double &x2); + + inline double min3(double x1, double x2, double x3){return std::min(std::min(x1, x2), x3);}; + inline double max3(double x1, double x2, double x3){return std::max(std::max(x1, x2), x3);}; + + inline bool double_equal(double a, double b){return fabs(a - b) <= 1 * DBL_EPSILON * std::max(fabs(a), fabs(b));}; + + template T max_abs_value(std::vector x) + { + T max = 0; + std::size_t N = x.size(); + for (std::size_t i = 0; i < N; ++i) + { + T axi = fabs(x[i]); + if (axi > max){ max = axi; } + } + return max; + } + + inline int Kronecker_delta(int i, int j){if (i == j) {return 1;} else {return 0;}}; + + class Dictionary + { + private: + std::map numbers; + std::map strings; + std::map > double_vectors; + public: + Dictionary(){}; + void add_string(std::string s1, std::string s2){ strings.insert(std::pair(s1, s2));} + void add_number(std::string s1, double d){ numbers.insert(std::pair(s1, d));} + void add_double_vector(std::string s1, std::vector d){ double_vectors.insert(std::pair >(s1, d));} + std::string get_string(std::string s) + { + if (strings.find(s) != strings.end()){ return strings[s]; } else{ throw std::exception(); } + }; + double get_number(std::string s) + { + if (numbers.find(s) != numbers.end()){ return numbers[s]; } else{ throw std::exception(); } + }; + std::vector get_double_vector(std::string s) + { + if (double_vectors.find(s) != double_vectors.end()){ return double_vectors[s]; } else{ throw std::exception(); } + }; + }; + +#define CATCH_ALL_ERRORS_RETURN_HUGE(x) try{ \ + x \ + } \ + catch(const std::exception& e){ \ + std::cout << e.what() << std::endl; \ + return _HUGE; \ + } \ + catch(...){ \ + return _HUGE; \ + } + +#endif diff --git a/include/DataStructures.h b/include/DataStructures.h new file mode 100644 index 00000000..49e3a7e5 --- /dev/null +++ b/include/DataStructures.h @@ -0,0 +1,236 @@ +/* + * DataStructures.h + * + * Created on: 21 Dec 2013 + * Author: jowr + */ + +#ifndef DATASTRUCTURES_H_ +#define DATASTRUCTURES_H_ + +#include "Exceptions.h" +#include +namespace CoolProp { + +struct SimpleState +{ + double rhomolar, T, p, hmolar, smolar, umolar; +}; + +/// -------------------------------------------------- +/// Define some constants that will be used throughout +/// -------------------------------------------------- +/// These are constants for the input and output parameters +/// The structure is taken directly from the AbstractState class. +// +// !! If you add a parameter, update the map in the corresponding CPP file !! +enum parameters{ + + // General parameters + imolar_mass, irhomolar_reducing, irhomolar_critical, iT_reducing, iT_critical, + + // Bulk properties + iT, iP, iQ, iTau, iDelta, + + // Molar specific thermodynamic properties + iDmolar, iHmolar, iSmolar, iCpmolar, iCp0molar, iCvmolar, iUmolar, iGmolar, + + // Mass specific thermodynamic properties + iDmass, iHmass, iSmass, iCpmass, iCp0mass, iCvmass, iUmass, iGmass, + + // Smoothing functions for density + idrhodh_constp_smoothed, idrhodp_consth_smoothed, irho_smoothed, + + // Transport properties + iviscosity, iconductivity, isurface_tension, iPrandtl, + + // Derivative-based terms + ispeed_sound, iisothermal_compressibility, iisobaric_expansion_coefficient, + + // Fundamental derivative of gas dynamics + ifundamental_derivative_of_gas_dynamics, id2pdv2_consts, + + // Derivatives of the residual non-dimensionalized Helmholtz energy with respect to the EOS variables + ialphar, idalphar_dtau_constdelta, idalphar_ddelta_consttau, + + // Derivatives of the ideal-gas non-dimensionalized Helmholtz energy with respect to the EOS variables + ialpha0, idalpha0_dtau_constdelta, idalpha0_ddelta_consttau, + + // Other functions and derivatives + iBvirial, iCvirial, iZ, idBvirial_dT, idCvirial_dT, idZdDelta, idZdTau, + + // Environmental parameters + iGWP20, iGWP100, iGWP500, iFH, iHH, iPH, iODP +}; +// !! If you add a parameter, update the map in the corresponding CPP file !! + +/// Return information about the parameter +/// @param key The key, one of iT, iP, etc. +/// @param info The thing you want, one of "IO" ("IO" if input/output, "O" if output only), "short" (very short description), "long" (a longer description), "units" +std::string get_parameter_information(int key, std::string info); +/// Return the integer key corresponding to the parameter name ("Dmolar" for instance) +int get_parameter_index(const std::string ¶m_name); + +/// These are constants for the phases of the fluid +enum phases {iphase_liquid, iphase_supercritical, iphase_gas, iphase_twophase, iphase_unknown}; + +/// These are unit types for the fluid +enum fluid_types{FLUID_TYPE_PURE, FLUID_TYPE_PSEUDOPURE, FLUID_TYPE_REFPROP, FLUID_TYPE_INCOMPRESSIBLE_LIQUID, FLUID_TYPE_INCOMPRESSIBLE_SOLUTION, FLUID_TYPE_UNDEFINED}; + +// !! If you add a parameter, update the map in the corresponding CPP file !! +/// These are input pairs that can be used (in each pair, input keys are sorted alphabetically) +enum input_pairs{ + QT_INPUTS, ///< Molar quality, Temperature in K + PQ_INPUTS, ///< Pressure in Pa, Molar quality + + PT_INPUTS, ///< Pressure in Pa, Temperature in K + + DmassT_INPUTS, ///< Mass density in kg/m^3, Temperature in K + DmolarT_INPUTS, ///< Molar density in mol/m^3, Temperature in K + HmolarT_INPUTS, ///< Enthalpy in J/mol, Temperature in K + HmassT_INPUTS, ///< Enthalpy in J/kg, Temperature in K + SmolarT_INPUTS, ///< Entropy in J/mol/K, Temperature in K + SmassT_INPUTS, ///< Entropy in J/kg/K, Temperature in K + TUmolar_INPUTS, ///< Temperature in K, Internal energy in J/mol + TUmass_INPUTS, ///< Temperature in K, Internal energy in J/kg + + DmassP_INPUTS, ///< Mass density in kg/m^3, Pressure in Pa + DmolarP_INPUTS, ///< Molar density in mol/m^3, Pressure in Pa + HmassP_INPUTS, ///< Enthalpy in J/kg, Pressure in Pa + HmolarP_INPUTS, ///< Enthalpy in J/mol, Pressure in Pa + PSmass_INPUTS, ///< Pressure in Pa, Entropy in J/kg/K + PSmolar_INPUTS, ///< Pressure in Pa, Entropy in J/mol/K + PUmass_INPUTS, ///< Pressure in Pa, Internal energy in J/kg + PUmolar_INPUTS, ///< Pressure in Pa, Internal energy in J/mol + + HmassSmass_INPUTS, ///< Enthalpy in J/kg, Entropy in J/kg/K + HmolarSmolar_INPUTS, ///< Enthalpy in J/mol, Entropy in J/mol/K + SmassUmass_INPUTS, ///< Entropy in J/kg/K, Internal energy in J/kg + SmolarUmolar_INPUTS, ///< Entropy in J/mol/K, Internal energy in J/mol + + DmassHmass_INPUTS, ///< Mass density in kg/m^3, Enthalpy in J/kg + DmolarHmolar_INPUTS, ///< Molar density in mol/m^3, Enthalpy in J/mol + DmassSmass_INPUTS, ///< Mass density in kg/m^3, Entropy in J/kg/K + DmolarSmolar_INPUTS, ///< Molar density in mol/m^3, Entropy in J/mol/K + DmassUmass_INPUTS, ///< Mass density in kg/m^3, Internal energy in J/kg + DmolarUmolar_INPUTS, ///< Molar density in mol/m^3, Internal energy in J/mol +}; +// !! If you add or remove a parameter, update the map in the corresponding CPP file !! + +inline bool match_pair(long key1, long key2, long x1, long x2, bool &swap) +{ + swap = !(key1 == x1); + return ((key1 == x1 && key2 == x2) || (key2 == x1 && key1 == x2)); +}; +template long generate_update_pair(long key1, T value1, long key2, T value2, T &out1, T&out2) + { + long pair; + bool swap; + + if (match_pair(key1, key2, iQ, iT, swap)){ + pair = QT_INPUTS; ///< Molar quality, Temperature in K + } + else if (match_pair(key1, key2, iP, iQ, swap)){ + pair = PQ_INPUTS; ///< Pressure in Pa, Molar quality + } + else if (match_pair(key1, key2, iP, iT, swap)){ + pair = PT_INPUTS; ///< Pressure in Pa, Temperature in K + } + else if (match_pair(key1, key2, iDmolar, iT, swap)){ + pair = DmolarT_INPUTS; // Molar density in mol/m^3, Temperature in K + } + else if (match_pair(key1, key2, iDmass, iT, swap)){ + pair = DmassT_INPUTS; // Mass density in kg/m^3, Temperature in K + } + else if (match_pair(key1, key2, iHmolar, iT, swap)){ + pair = HmolarT_INPUTS; // Enthalpy in J/mol, Temperature in K + } + else if (match_pair(key1, key2, iHmass, iT, swap)){ + pair = HmassT_INPUTS; // Enthalpy in J/kg, Temperature in K + } + else if (match_pair(key1, key2, iSmolar, iT, swap)){ + pair = SmolarT_INPUTS; // Entropy in J/mol/K, Temperature in K + } + else if (match_pair(key1, key2, iSmass, iT, swap)){ + pair = SmassT_INPUTS; // Entropy in J/kg/K, Temperature in K + } + else if (match_pair(key1, key2, iT, iUmolar, swap)){ + pair = TUmolar_INPUTS; // Temperature in K, Internal energy in J/mol + } + else if (match_pair(key1, key2, iT, iUmass, swap)){ + pair = TUmass_INPUTS; // Temperature in K, Internal energy in J/kg + } + else if (match_pair(key1, key2, iDmass, iHmass, swap)){ + pair = DmassHmass_INPUTS; // Mass density in kg/m^3, Enthalpy in J/kg + } + else if (match_pair(key1, key2, iDmolar, iHmolar, swap)){ + pair = DmolarHmolar_INPUTS; // Molar density in mol/m^3, Enthalpy in J/mol + } + else if (match_pair(key1, key2, iDmass, iSmass, swap)){ + pair = DmassSmass_INPUTS; // Mass density in kg/m^3, Entropy in J/kg/K + } + else if (match_pair(key1, key2, iDmolar, iSmolar, swap)){ + pair = DmolarSmolar_INPUTS; // Molar density in mol/m^3, Entropy in J/mol/K + } + else if (match_pair(key1, key2, iDmass, iUmass, swap)){ + pair = DmassUmass_INPUTS; // Mass density in kg/m^3, Internal energy in J/kg + } + else if (match_pair(key1, key2, iDmolar, iUmolar, swap)){ + pair = DmolarUmolar_INPUTS; // Molar density in mol/m^3, Internal energy in J/mol + } + else if (match_pair(key1, key2, iDmass, iP, swap)){ + pair = DmassP_INPUTS; // Mass density in kg/m^3, Pressure in Pa + } + else if (match_pair(key1, key2, iDmolar, iP, swap)){ + pair = DmolarP_INPUTS; // Molar density in mol/m^3, Pressure in Pa + } + else if (match_pair(key1, key2, iHmass, iP, swap)){ + pair = HmassP_INPUTS; // Enthalpy in J/kg, Pressure in Pa + } + else if (match_pair(key1, key2, iHmolar, iP, swap)){ + pair = HmolarP_INPUTS; // Enthalpy in J/mol, Pressure in Pa + } + else if (match_pair(key1, key2, iP, iSmass, swap)){ + pair = PSmass_INPUTS; // Pressure in Pa, Entropy in J/kg/K + } + else if (match_pair(key1, key2, iP, iSmolar, swap)){ + pair = PSmolar_INPUTS; // Pressure in Pa, Entropy in J/mol/K + } + else if (match_pair(key1, key2, iP, iUmass, swap)){ + pair = PUmass_INPUTS; // Pressure in Pa, Internal energy in J/kg + } + else if (match_pair(key1, key2, iP, iUmolar, swap)){ + pair = PUmolar_INPUTS; // Pressure in Pa, Internal energy in J/mol + } + else + throw ValueError("Invalid set of inputs to generate_update_pair"); + + /* + HmassSmass_INPUTS, ///< Enthalpy in J/kg, Entropy in J/kg/K + HmolarSmolar_INPUTS, ///< Enthalpy in J/mol, Entropy in J/mol/K + SmassUmass_INPUTS, ///< Entropy in J/kg/K, Internal energy in J/kg + SmolarUmolar_INPUTS, ///< Entropy in J/mol/K, Internal energy in J/mol + */ + + if (!swap) + { + out1 = value1; + out2 = value2; + } + else + { + out1 = value2; + out2 = value1; + } + return pair; + }; + +/// Return the short description of an input pair key ("DmolarT_INPUTS" for instance) +std::string get_input_pair_short_desc(int pair); +/// Return the long description of an input pair key ("Molar density in mol/m^3, Temperature in K" for instance) +std::string get_input_pair_long_desc(int pair); + + + +} /* namespace CoolProp */ +#endif /* DATASTRUCTURES_H_ */ diff --git a/include/Exceptions.h b/include/Exceptions.h new file mode 100644 index 00000000..2c7388e9 --- /dev/null +++ b/include/Exceptions.h @@ -0,0 +1,104 @@ + + +#ifndef CPEXCEPTIONS_H +#define CPEXCEPTIONS_H + +#include +#include + +namespace CoolProp +{ + +class CoolPropBaseError: public std::exception +{ +protected: + std::string err; // Can be accessed by subclasses since it is protected +public: + CoolPropBaseError() throw() {}; + ~CoolPropBaseError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class NotImplementedError: public CoolPropBaseError +{ +public: + NotImplementedError() throw() {}; + NotImplementedError(std::string errstring) throw(){err=errstring;}; + ~NotImplementedError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class SolutionError: public CoolPropBaseError +{ +public: + SolutionError()throw() {}; + SolutionError(std::string errstring) throw(){err=errstring;}; + ~SolutionError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class ValueError: public CoolPropBaseError +{ +public: + ValueError() throw() {}; + ValueError(std::string errstring) throw(){err=errstring;}; + ~ValueError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class AttributeError: public CoolPropBaseError +{ +public: + AttributeError() throw() {}; + AttributeError(std::string errstring) throw() {err=errstring;}; + ~AttributeError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class OutOfRangeError: public ValueError +{ +public: + OutOfRangeError() throw() {}; + OutOfRangeError(std::string errstring) throw() {err=errstring;}; + ~OutOfRangeError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class WrongFluidError: public ValueError +{ +public: + WrongFluidError() throw() {}; + WrongFluidError(std::string errstring) throw() {err=errstring;}; + ~WrongFluidError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class CompositionError: public ValueError +{ +public: + CompositionError() throw() {}; + CompositionError(std::string errstring) throw() {err=errstring;}; + ~CompositionError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class InputError: public ValueError +{ +public: + InputError() throw() {}; + InputError(std::string errstring) throw() {err=errstring;}; + ~InputError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +class NotAvailableError: public ValueError +{ +public: + NotAvailableError() throw() {}; + NotAvailableError(std::string errstring) throw() {err=errstring;}; + ~NotAvailableError() throw() {}; + virtual const char* what() const throw(){ return err.c_str(); } +}; + +}; /* namespace CoolProp */ +#endif diff --git a/include/Helmholtz.h b/include/Helmholtz.h new file mode 100644 index 00000000..ff05f75e --- /dev/null +++ b/include/Helmholtz.h @@ -0,0 +1,1244 @@ + +#ifndef HELMHOLTZ_H +#define HELMHOLTZ_H + +#include +#include "rapidjson\rapidjson_include.h" + +namespace CoolProp{ + +/// The base class class for the Helmholtz energy terms +/** + +Residual Helmholtz Energy Terms: + +Term | Helmholtz Energy Contribution +---------- | ------------------------------ +ResidualHelmholtzPower | \f$ \alpha_r=\left\lbrace\begin{array}{cc}\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} & l_i=0\\ \displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\delta^{l_i}) & l_i\neq 0\end{array}\right.\f$ +ResidualHelmholtzExponential | \f$ \alpha_r=\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\gamma_i\delta^{l_i}) \f$ +ResidualHelmholtzGaussian | \f$ \alpha_r=\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\eta_i(\delta-\epsilon_i)^2-\beta_i(\tau-\gamma_i)^2)\f$ +ResidualHelmholtzGERG2008Gaussian | \f$ \alpha_r=\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\eta_i(\delta-\epsilon_i)^2-\beta_i(\delta-\gamma_i))\f$ +ResidualHelmholtzLemmon2005 | \f$ \alpha_r=\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\delta^{l_i}) \exp(-\tau^{m_i})\f$ +ResidualHelmholtzNonAnalytic | \f$ \begin{array}{c}\alpha_r&=&\displaystyle\sum_i n_i \Delta^{b_i}\delta\psi \\ \Delta & = & \theta^2+B_i[(\delta-1)^2]^{a_i}\\ \theta & = & (1-\tau)+A_i[(\delta-1)^2]^{1/(2\beta_i)}\\ \psi & = & \exp(-C_i(\delta-1)^2-D_i(\tau-1)^2) \end{array}\f$ +ResidualHelmholtzSAFTAssociating | \f$ \alpha_r = am\left(\ln X-\frac{X}{2}+\frac{1}{2}\right); \f$ + + +Ideal-Gas Helmholtz Energy Terms: + +Term | Helmholtz Energy Contribution +---------- | ------------------------------ +IdealHelmholtzLead | \f$ \alpha_0 = n_1 + n_2\tau + \ln\delta \f$ +IdealHelmholtzEnthalpyEntropyOffset | \f$ \alpha_0 = \displaystyle\frac{\Delta s}{R_u/M}+\frac{\Delta h}{(R_u/M)T}\tau \f$ +IdealHelmholtzLogTau | \f$ \alpha_0 = n_1\log\tau \f$ +IdealHelmholtzPower | \f$ \alpha_0 = \displaystyle\sum_i n_i\tau^{t_i} \f$ +IdealHelmholtzPlanckEinstein | \f$ \alpha_0 = \displaystyle\sum_i n_i\log[1-\exp(-\theta_i\tau)] \f$ +IdealHelmholtzPlanckEinstein2 | \f$ \alpha_0 = \displaystyle\sum_i n_i\log[c_i+\exp(\theta_i\tau)] \f$ +*/ +class BaseHelmholtzTerm{ +public: + BaseHelmholtzTerm(){}; + virtual ~BaseHelmholtzTerm(){}; + /// Returns the base, non-dimensional, Helmholtz energy term (no derivatives) [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double base(const long double &tau, const long double &delta) throw() = 0; + /// Returns the first partial derivative of Helmholtz energy term with respect to tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dTau(const long double &tau, const long double &delta) throw() = 0; + /// Returns the second partial derivative of Helmholtz energy term with respect to tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dTau2(const long double &tau, const long double &delta) throw() = 0; + /// Returns the second mixed partial derivative (delta1,dtau1) of Helmholtz energy term with respect to delta and tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta_dTau(const long double &tau, const long double &delta) throw() = 0; + /// Returns the first partial derivative of Helmholtz energy term with respect to delta [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta(const long double &tau, const long double &delta) throw() = 0; + /// Returns the second partial derivative of Helmholtz energy term with respect to delta [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta2(const long double &tau, const long double &delta) throw() = 0; + /// Returns the third mixed partial derivative (delta2,dtau1) of Helmholtz energy term with respect to delta and tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta2_dTau(const long double &tau, const long double &delta) throw() = 0; + /// Returns the third mixed partial derivative (delta1,dtau2) of Helmholtz energy term with respect to delta and tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta_dTau2(const long double &tau, const long double &delta) throw() = 0; + /// Returns the third partial derivative of Helmholtz energy term with respect to tau [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dTau3(const long double &tau, const long double &delta) throw() = 0; + /// Returns the third partial derivative of Helmholtz energy term with respect to delta [-] + /** @param tau Reciprocal reduced temperature where \f$\tau=T_c / T\f$ + * @param delta Reduced density where \f$\delta = \rho / \rho_c \f$ + */ + virtual long double dDelta3(const long double &tau, const long double &delta) throw() = 0; +}; + +// ############################################################################# +// ############################################################################# +// ############################################################################# +// RESIDUAL TERMS +// ############################################################################# +// ############################################################################# +// ############################################################################# + +struct ResidualHelmholtzPowerElement +{ + long double n,d,t,ld; + int l; +}; +/// Power term +/*! +Term of the form +\f[ +\alpha_r=\left\lbrace\begin{array}{cc}\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} & l_i=0\\ \displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\delta^{l_i}) & l_i\neq 0\end{array}\right. +\f] +*/ +class ResidualHelmholtzPower : public BaseHelmholtzTerm{ + +public: + /*std::vector d, ///< The power for the delta terms + t, ///< The powers for the tau terms + l; ///< The powers for delta in the exp terms*/ + std::vector s; + std::size_t N; + std::vector elements; + // Default Constructor + ResidualHelmholtzPower(){N = 0;}; + // Constructor + ResidualHelmholtzPower(const std::vector &n, const std::vector &d, + const std::vector &t, const std::vector &l) + { + N = n.size(); + s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzPowerElement el; + el.n = n[i]; + el.d = d[i]; + el.t = t[i]; + el.ld = l[i]; + el.l = (int)el.ld; + elements.push_back(el); + } + }; + + ///< Destructor for the alphar_power class. No implementation + ~ResidualHelmholtzPower(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +struct ResidualHelmholtzExponentialElement +{ + long double n,d,t,g,l; +}; +/** +Term of the form +\f[ \alpha_r=\displaystyle\sum_i n_i \delta^{d_i} \tau^{t_i} \exp(-\gamma_i\delta^{l_i}) \f] +*/ +class ResidualHelmholtzExponential : public BaseHelmholtzTerm{ + +public: + std::vector s; + std::size_t N; + std::vector elements; + // Default Constructor + ResidualHelmholtzExponential(){N = 0;}; + // Constructor + ResidualHelmholtzExponential(const std::vector &n, const std::vector &d, + const std::vector &t, const std::vector &g, + const std::vector &l) + { + N = n.size(); + s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzExponentialElement el; + el.d = d[i]; + el.t = t[i]; + el.g = g[i]; + el.l = l[i]; + el.n = n[i]; + elements.push_back(el); + } + } + + ///< Destructor for the alphar_power class. No implementation + ~ResidualHelmholtzExponential(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +struct ResidualHelmholtzGaussianElement +{ + long double n, d, t, eta, epsilon, beta, gamma; +}; +class ResidualHelmholtzGaussian : public BaseHelmholtzTerm{ + +public: + std::size_t N; ///< The number of terms + std::vector elements; + std::vector s; + // Default Constructor + ResidualHelmholtzGaussian(){N = 0;}; + // Constructor + ResidualHelmholtzGaussian(const std::vector &n, + const std::vector &d, + const std::vector &t, + const std::vector &eta, + const std::vector &epsilon, + const std::vector &beta, + const std::vector &gamma + ) + { + N = n.size(); + this->s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzGaussianElement el; + el.n = n[i]; + el.d = d[i]; + el.t = t[i]; + el.eta = eta[i]; + el.epsilon = epsilon[i]; + el.beta = beta[i]; + el.gamma = gamma[i]; + elements.push_back(el); + } + }; + + ///< Destructor for the alphar_power class. No implementation + ~ResidualHelmholtzGaussian(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +class ResidualHelmholtzGERG2008Gaussian : public BaseHelmholtzTerm{ + +public: + std::vector s; + std::size_t N; + std::vector elements; + /// Default Constructor + ResidualHelmholtzGERG2008Gaussian(){N = 0;}; + /// Constructor + ResidualHelmholtzGERG2008Gaussian(const std::vector &n, + const std::vector &d, + const std::vector &t, + const std::vector &eta, + const std::vector &epsilon, + const std::vector &beta, + const std::vector &gamma) + { + N = n.size(); + s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzGaussianElement el; + el.n = n[i]; + el.d = d[i]; + el.t = t[i]; + el.eta = eta[i]; + el.epsilon = epsilon[i]; + el.beta = beta[i]; + el.gamma = gamma[i]; + elements.push_back(el); + } + }; + + ///< Destructor. No implementation + ~ResidualHelmholtzGERG2008Gaussian(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw() {return _HUGE;}; // TODO: calculate this derivative + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +struct ResidualHelmholtzLemmon2005Element{ + long double n, d, t, ld, md; + int l, m; +}; +class ResidualHelmholtzLemmon2005 : public BaseHelmholtzTerm{ +public: + std::size_t N; + std::vector s; ///< Summation container + std::vector elements; + // Default Constructor + ResidualHelmholtzLemmon2005(){N = 0;}; + // Constructor + ResidualHelmholtzLemmon2005(const std::vector &n, + const std::vector &d, + const std::vector &t, + const std::vector &l, + const std::vector &m) + { + N = n.size(); + s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzLemmon2005Element el; + el.n = n[i]; + el.d = d[i]; + el.t = t[i]; + el.ld = l[i]; + el.md = m[i]; + el.l = (int)el.ld; + el.m = (int)el.md; + elements.push_back(el); + } + }; + + ///< Destructor. No implementation + ~ResidualHelmholtzLemmon2005(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +struct ResidualHelmholtzNonAnalyticElement +{ + long double n, a, b, beta, A, B, C, D; +}; +class ResidualHelmholtzNonAnalytic : public BaseHelmholtzTerm{ + +public: + std::size_t N; + std::vector s; + std::vector elements; + /// Default Constructor + ResidualHelmholtzNonAnalytic(){N = 0;}; + /// Destructor. No implementation + ~ResidualHelmholtzNonAnalytic(){}; + /// Constructor + ResidualHelmholtzNonAnalytic(const std::vector &n, + const std::vector &a, + const std::vector &b, + const std::vector &beta, + const std::vector &A, + const std::vector &B, + const std::vector &C, + const std::vector &D + ) + { + N = n.size(); + s.resize(N); + for (std::size_t i = 0; i < n.size(); ++i) + { + ResidualHelmholtzNonAnalyticElement el; + el.n = n[i]; + el.a = a[i]; + el.b = b[i]; + el.beta = beta[i]; + el.A = A[i]; + el.B = B[i]; + el.C = C[i]; + el.D = D[i]; + elements.push_back(el); + } + }; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +class ResidualHelmholtzSAFTAssociating : public BaseHelmholtzTerm{ + +protected: + double a, m,epsilonbar, vbarn, kappabar; + + long double Deltabar(const long double &tau, const long double &delta); + long double dDeltabar_ddelta__consttau(const long double &tau, const long double &delta); + long double d2Deltabar_ddelta2__consttau(const long double &tau, const long double &delta); + long double dDeltabar_dtau__constdelta(const long double &tau, const long double &delta); + long double d2Deltabar_dtau2__constdelta(const long double &tau, const long double &delta); + long double d2Deltabar_ddelta_dtau(const long double &tau, const long double &delta); + long double d3Deltabar_dtau3__constdelta(const long double &tau, const long double &delta); + long double d3Deltabar_ddelta_dtau2(const long double &tau, const long double &delta); + long double d3Deltabar_ddelta3__consttau(const long double &tau, const long double &delta); + long double d3Deltabar_ddelta2_dtau(const long double &tau, const long double &delta); + + long double X(const long double &delta, const long double &Deltabar); + long double dX_dDeltabar__constdelta(const long double &delta, const long double &Deltabar); + long double dX_ddelta__constDeltabar(const long double &delta, const long double &Deltabar); + long double dX_dtau(const long double &tau, const long double &delta); + long double dX_ddelta(const long double &tau, const long double &delta); + long double d2X_dtau2(const long double &tau, const long double &delta); + long double d2X_ddeltadtau(const long double &tau, const long double &delta); + long double d2X_ddelta2(const long double &tau, const long double &delta); + + long double d3X_dtau3(const long double &tau, const long double &delta); + long double d3X_ddelta3(const long double &tau, const long double &delta); + long double d3X_ddeltadtau2(const long double &tau, const long double &delta); + long double d3X_ddelta2dtau(const long double &tau, const long double &delta); + + long double g(const long double &eta); + long double dg_deta(const long double &eta); + long double d2g_deta2(const long double &eta); + long double d3g_deta3(const long double &eta); + long double eta(const long double &delta); + +public: + /// Default constructor + ResidualHelmholtzSAFTAssociating(){ disabled = true; }; + // Constructor + ResidualHelmholtzSAFTAssociating(double a, double m, double epsilonbar, double vbarn, double kappabar) + : a(a), m(m), epsilonbar(epsilonbar), vbarn(vbarn), kappabar(kappabar) + { + disabled = false; + }; + + bool disabled; + + //Destructor. No Implementation + ~ResidualHelmholtzSAFTAssociating(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(); + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau(const long double &tau, const long double &delta) throw(); + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(); + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(); + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(); + long double dTau3(const long double &tau, const long double &delta) throw(); +}; + +class ResidualHelmholtzContainer +{ + +public: + ResidualHelmholtzPower Power; + ResidualHelmholtzExponential Exponential; + ResidualHelmholtzGaussian Gaussian; + ResidualHelmholtzLemmon2005 Lemmon2005; + ResidualHelmholtzNonAnalytic NonAnalytic; + ResidualHelmholtzSAFTAssociating SAFT; + + long double base(long double tau, long double delta) + { + return (Power.base(tau, delta) + Exponential.base(tau, delta) + +Gaussian.base(tau, delta) + Lemmon2005.base(tau, delta) + +NonAnalytic.base(tau, delta) + SAFT.base(tau,delta)); + }; + + long double dDelta(long double tau, long double delta) + { + return (Power.dDelta(tau, delta) + Exponential.dDelta(tau, delta) + + Gaussian.dDelta(tau, delta) + Lemmon2005.dDelta(tau, delta) + + NonAnalytic.dDelta(tau, delta) + SAFT.dDelta(tau,delta)); + }; + long double dTau(long double tau, long double delta) + { + return (Power.dTau(tau, delta) + Exponential.dTau(tau, delta) + + Gaussian.dTau(tau, delta) + Lemmon2005.dTau(tau, delta) + + NonAnalytic.dTau(tau, delta) + SAFT.dTau(tau,delta)); + }; + + long double dDelta2(long double tau, long double delta) + { + return (Power.dDelta2(tau, delta) + Exponential.dDelta2(tau, delta) + +Gaussian.dDelta2(tau, delta) + Lemmon2005.dDelta2(tau, delta) + +NonAnalytic.dDelta2(tau, delta) + SAFT.dDelta2(tau,delta)); + }; + long double dDelta_dTau(long double tau, long double delta) + { + return (Power.dDelta_dTau(tau, delta) + Exponential.dDelta_dTau(tau, delta) + + Gaussian.dDelta_dTau(tau, delta) + Lemmon2005.dDelta_dTau(tau, delta) + + NonAnalytic.dDelta_dTau(tau, delta) + SAFT.dDelta_dTau(tau,delta)); + }; + long double dTau2(long double tau, long double delta) + { + return (Power.dTau2(tau, delta) + Exponential.dTau2(tau, delta) + + Gaussian.dTau2(tau, delta) + Lemmon2005.dTau2(tau, delta) + + NonAnalytic.dTau2(tau, delta) + SAFT.dTau2(tau,delta)); + }; + + long double dDelta3(long double tau, long double delta) + { + return (Power.dDelta3(tau, delta) + Exponential.dDelta3(tau, delta) + +Gaussian.dDelta3(tau, delta) + Lemmon2005.dDelta3(tau, delta) + +NonAnalytic.dDelta3(tau, delta) + SAFT.dDelta3(tau,delta)); + }; + long double dDelta2_dTau(long double tau, long double delta) + { + return (Power.dDelta2_dTau(tau, delta) + Exponential.dDelta2_dTau(tau, delta) + + Gaussian.dDelta2_dTau(tau, delta) + Lemmon2005.dDelta2_dTau(tau, delta) + + NonAnalytic.dDelta2_dTau(tau, delta) + SAFT.dDelta2_dTau(tau,delta)); + }; + long double dDelta_dTau2(long double tau, long double delta) + { + return (Power.dDelta_dTau2(tau, delta) + Exponential.dDelta_dTau2(tau, delta) + + Gaussian.dDelta_dTau2(tau, delta) + Lemmon2005.dDelta_dTau2(tau, delta) + + NonAnalytic.dDelta_dTau2(tau, delta) + SAFT.dDelta_dTau2(tau,delta)); + }; + long double dTau3(long double tau, long double delta) + { + return (Power.dTau3(tau, delta) + Exponential.dTau3(tau, delta) + +Gaussian.dTau3(tau, delta) + Lemmon2005.dTau3(tau, delta) + +NonAnalytic.dTau3(tau, delta) + SAFT.dTau3(tau,delta)); + }; +}; + + +// ############################################################################# +// ############################################################################# +// ############################################################################# +// IDEAL GAS TERMS +// ############################################################################# +// ############################################################################# +// ############################################################################# + +/// The leading term in the EOS used to set the desired reference state +/** +\f[ +\alpha_0 = \log(\delta)+a_1+a_2\tau +\f] +*/ +class IdealHelmholtzLead : public BaseHelmholtzTerm{ + +private: + long double a1, a2; + bool enabled; +public: + // Default constructor + IdealHelmholtzLead(){enabled = false;}; + + // Constructor + IdealHelmholtzLead(const long double a1, const long double a2) + :a1(a1), a2(a2) + {enabled = true;}; + + //Destructor + ~IdealHelmholtzLead(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc){ + el.AddMember("type","IdealHelmholtzLead",doc.GetAllocator()); + el.AddMember("a1", static_cast(a1), doc.GetAllocator()); + el.AddMember("a2", static_cast(a2), doc.GetAllocator()); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return log(delta)+a1+a2*tau; + }; + long double dDelta(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return 1.0/delta; + }; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return a2; + }; + long double dDelta2(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return -1.0/delta/delta; + }; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return 2/delta/delta/delta; + }; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau3(const long double &tau, const long double &delta) throw(){return 0.0;}; +}; + +/// The term in the EOS used to shift the reference state of the fluid +/** +\f[ +\alpha_0 = a_1+a_2\tau +\f] +*/ +class IdealHelmholtzEnthalpyEntropyOffset : public BaseHelmholtzTerm{ +private: + long double a1,a2; // Use these variables internally + bool enabled; +public: + IdealHelmholtzEnthalpyEntropyOffset(){enabled = false;}; + + // Constructor + IdealHelmholtzEnthalpyEntropyOffset(long double a1, long double a2):a1(a1), a2(a2){enabled = true;}; + + //Destructor + ~IdealHelmholtzEnthalpyEntropyOffset(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc){ + el.AddMember("type","IdealHelmholtzEnthalpyEntropyOffset",doc.GetAllocator()); + el.AddMember("a1", static_cast(a1), doc.GetAllocator()); + el.AddMember("a2", static_cast(a2), doc.GetAllocator()); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return a1+a2*tau; + }; + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return a2; + }; + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau3(const long double &tau, const long double &delta) throw(){return 0.0;}; +}; + + +/** +\f[ +\alpha_0 = a_1\ln\tau +\f] +*/ +class IdealHelmholtzLogTau : public BaseHelmholtzTerm +{ +private: + long double a1; + bool enabled; +public: + + /// Default constructor + IdealHelmholtzLogTau(){enabled = false;}; + + // Constructor + IdealHelmholtzLogTau(long double a1){this->a1=a1; enabled = true;}; + + bool is_enabled(){return enabled;}; + + //Destructor + ~IdealHelmholtzLogTau(){}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc){ + el.AddMember("type", "IdealHelmholtzLogTau", doc.GetAllocator()); + el.AddMember("a1", static_cast(a1), doc.GetAllocator()); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return a1*log(tau); + }; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return a1/tau; + }; + long double dTau2(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return -a1/tau/tau; + }; + long double dTau3(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return 2*a1/tau/tau/tau; + }; + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0.0;}; +}; + +/** +\f[ +\alpha_0 = \displaystyle\sum_i n_i\tau^{t_i} +\f] +*/ +class IdealHelmholtzPower : public BaseHelmholtzTerm{ + +private: + std::vector n, t; // Use these variables internally + std::size_t N; + bool enabled; +public: + IdealHelmholtzPower(){enabled = false;}; + // Constructor + IdealHelmholtzPower(const std::vector &n, const std::vector &t) + :n(n), t(t) + { + this->N = n.size(); + enabled = true; + }; + + //Destructor + ~IdealHelmholtzPower(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc) + { + el.AddMember("type","IdealHelmholtzPower",doc.GetAllocator()); + cpjson::set_long_double_array("n",n,el,doc); + cpjson::set_long_double_array("t",t,el,doc); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i = 0; i n,theta; // Use these variables internally + std::size_t N; + bool enabled; +public: + IdealHelmholtzPlanckEinstein(){N = 0; enabled = false;} + // Constructor with std::vector instances + IdealHelmholtzPlanckEinstein(std::vector n, std::vector theta) + :n(n), theta(theta) + { + N = n.size(); + enabled = true; + }; + + //Destructor + ~IdealHelmholtzPlanckEinstein(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc) + { + el.AddMember("type","IdealHelmholtzPlanckEinstein",doc.GetAllocator()); + cpjson::set_long_double_array("n",n,el,doc); + cpjson::set_long_double_array("theta",theta,el,doc); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*log(1.0-exp(-theta[i]*tau));} return s; + }; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*theta[i]*(1.0/(1.0-exp(-theta[i]*tau))-1.0);} return s; + }; + long double dTau2(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s -= n[i]*pow(theta[i],2)*exp(theta[i]*tau)/pow(1.0-exp(theta[i]*tau),2);} return s; + }; + long double dTau3(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*pow(theta[i],2)*theta[i]*exp(theta[i]*tau)*(exp(theta[i]*tau)+1)/pow(exp(theta[i]*tau)-1,3);} return s; + }; + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0;}; +}; + +/** +\f[ +\alpha_0 = \displaystyle\sum_i n_i\log[c_i+\exp(\theta_i\tau)] +\f] +*/ +class IdealHelmholtzPlanckEinstein2 : public BaseHelmholtzTerm{ + +private: + std::vector n,theta,c; // Use these variables internally + std::size_t N; + bool enabled; +public: + IdealHelmholtzPlanckEinstein2(){N = 0; enabled = false;} + // Constructor with std::vector instances + IdealHelmholtzPlanckEinstein2(const std::vector &n, + const std::vector &theta, + const std::vector &c) + :n(n), theta(theta), c(c) + { + N = n.size(); + enabled = true; + }; + + //Destructor + ~IdealHelmholtzPlanckEinstein2(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc) + { + el.AddMember("type","IdealHelmholtzPlanckEinstein2",doc.GetAllocator()); + cpjson::set_long_double_array("n",n,el,doc); + cpjson::set_long_double_array("theta",theta,el,doc); + cpjson::set_long_double_array("c",c,el,doc); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*log(c[i]+exp(theta[i]*tau));} return s; + }; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*theta[i]*exp(tau*theta[i])/(c[i]+exp(theta[i]*tau));} return s; + }; + long double dTau2(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*pow(theta[i],2)*c[i]*exp(tau*theta[i])/pow(c[i]+exp(tau*theta[i]),2);} return s; + }; + long double dTau3(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + long double s=0; for (std::size_t i=0; i < N; ++i){s += n[i]*pow(theta[i],2)*c[i]*(-theta[i])*exp(theta[i]*tau)*(exp(theta[i]*tau)-c[i])/pow(exp(theta[i]*tau)+c[i],3);} return s; + }; + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0;}; +}; + +class IdealHelmholtzCP0Constant : public BaseHelmholtzTerm{ + +private: + double cp_over_R,Tc,T0,tau0; // Use these variables internally + bool enabled; +public: + /// Default constructor + IdealHelmholtzCP0Constant(){enabled = false;}; + + /// Constructor with just a single double value + IdealHelmholtzCP0Constant(long double cp_over_R, long double Tc, long double T0) + : cp_over_R(cp_over_R), Tc(Tc), T0(T0) + { + enabled = true; + }; + + /// Destructor + ~IdealHelmholtzCP0Constant(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc) + { + el.AddMember("type","IdealGasHelmholtzCP0Constant", doc.GetAllocator()); + el.AddMember("cp_over_R", cp_over_R, doc.GetAllocator()); + el.AddMember("Tc", Tc, doc.GetAllocator()); + el.AddMember("T0", T0, doc.GetAllocator()); + }; + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return cp_over_R-cp_over_R*tau/tau0+cp_over_R*log(tau/tau0); + }; + long double dTau(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return cp_over_R/tau-cp_over_R/tau0; + }; + long double dTau2(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return -cp_over_R/(tau*tau); + }; + long double dTau3(const long double &tau, const long double &delta) throw(){ + if (!enabled){return 0.0;} + return 2*cp_over_R/(tau*tau*tau); + }; + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0.0;}; +}; + +class IdealHelmholtzCP0PolyT : public BaseHelmholtzTerm{ +private: + std::vector c, t; + long double Tc, T0, tau0; // Use these variables internally + std::size_t N; + bool enabled; +public: + /// Destructor + IdealHelmholtzCP0PolyT(){N = 0; enabled = false;}; + + /// Constructor with std::vectors + IdealHelmholtzCP0PolyT(const std::vector &c, const std::vector &t, double Tc, double T0) + : c(c), t(t), Tc(Tc), T0(T0) + { + tau0 = Tc/T0; + enabled = true; + }; + + /// Destructor + ~IdealHelmholtzCP0PolyT(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + // Term and its derivatives + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau3(const long double &tau, const long double &delta) throw(); + +}; + +/// Term in the ideal-gas specific heat equation that is based on Aly-Lee formulation +/** Specific heat is of the form: +\f[ +\frac{c_p^0}{R_u} = A + B\left(\frac{C/T}{\sinh(C/T)}\right)^2 + D\left(\frac{E/T}{\cosh(E/T)}\right)^2 +\f] +Second partial of ideal-gas Helmholtz energy given directly by specific heat (\f$\displaystyle\alpha_{\tau\tau}^0=-\frac{1}{\tau^2}\frac{c_p^0}{R_u} \f$) - this is obtained by real gas \f$c_p\f$ relationship, and killing off residual Helmholtz terms +\f[ +\alpha^0_{\tau\tau} = -\frac{A}{\tau^2} - \frac{B}{\tau^2}\left(\frac{C/T}{\sinh(C/T)}\right)^2 - \frac{D}{\tau^2}\left(\frac{E/T}{\cosh(E/T)}\right)^2 +\f] +or in terms of \f$ \tau \f$: +\f[ +\alpha^0_{\tau\tau} = -\frac{A}{\tau^2} - \frac{BC^2}{T_c^2}\left(\frac{1}{\sinh(C\tau/T_c)}\right)^2 - \frac{DE^2}{T_c^2}\left(\frac{1}{\cosh(E\tau/T_c)}\right)^2 +\f] +Third partial: +\f[ +\alpha^0_{\tau\tau\tau} = 2\frac{A}{\tau^3} + 2\frac{BC^3}{T_c^3}\frac{\cosh(C\tau/T_c)}{\sinh^3(C\tau/T_c)} +2 \frac{DE^3}{T_c^3}\frac{\sinh(E\tau/T_c)}{\cosh^3(E\tau/T_c)} +\f] +Now coming back to the ideal gas Helmholtz energy definition: +\f[ +\alpha^0 = -\tau\displaystyle\int_{\tau_0}^{\tau} \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau+\displaystyle\int_{\tau_0}^{\tau} \frac{1}{\tau}\frac{c_p^0}{R_u}d\tau +\f] +Applying derivative +\f[ +\alpha^0_{\tau} = -\displaystyle\int_{\tau_0}^{\tau} \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau-\tau\frac{\partial}{\partial \tau}\left[\displaystyle\int_{\tau_0}^{\tau} \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau \right]+\frac{\partial}{\partial \tau}\left[\displaystyle\int_{\tau_0}^{\tau} \frac{1}{\tau}\frac{c_p^0}{R_u}d\tau \right] +\f] +Fundamental theorem of calculus +\f[ +\alpha^0_{\tau} = -\int_{\tau_0}^{\tau} \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau-\tau \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau+\frac{1}{\tau}\frac{c_p^0}{R_u} +\f] +Last two terms cancel, leaving +\f[ +\alpha^0_{\tau} = -\int_{\tau_0}^{\tau} \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau +\f] +Another derivative yields (from fundamental theorem of calculus) +\f[ +\alpha^0_{\tau\tau} = - \frac{1}{\tau^2}\frac{c_p^0}{R_u} +\f] + +see also Jaeschke and Schley, 1995, (http://link.springer.com/article/10.1007%2FBF02083547#page-1) +*/ +class IdealHelmholtzCP0AlyLee : public BaseHelmholtzTerm{ +private: + std::vector c; + long double Tc, tau0, T0; // Use these variables internally + bool enabled; +public: + IdealHelmholtzCP0AlyLee(){enabled = false;}; + + /// Constructor with std::vectors + IdealHelmholtzCP0AlyLee(std::vector c, double Tc, double T0) + :c(c), Tc(Tc), T0(T0) + { + tau0=Tc/T0; + enabled = true; + }; + + /// Destructor + ~IdealHelmholtzCP0AlyLee(){}; + + bool is_enabled(){return enabled;}; + + void to_json(rapidjson::Value &el, rapidjson::Document &doc); + + + /// The antiderivative given by \f$ \displaystyle\int \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau \f$ + /** + sympy code for this derivative: + + from sympy import * + a1,a2,a3,a4,a5,Tc,tau = symbols('a1,a2,a3,a4,a5,Tc,tau', real = True) + integrand = a1 + a2*(a3/Tc/sinh(a3*tau/Tc))**2 + a4*(a5/Tc/cosh(a5*tau/Tc))**2 + integrand = integrand.rewrite(exp) + antideriv = trigsimp(integrate(integrand,tau)) + display(antideriv) + print latex(antideriv) + print ccode(antideriv) + + \f[ + \displaystyle\int \frac{1}{\tau^2}\frac{c_p^0}{R_u}d\tau = -\frac{a_0}{\tau}+\frac{2a_1a_2}{T_c\left[\exp\left(-\frac{2a_2\tau}{T_c}\right)-1\right]}+\frac{2a_3a_4}{T_c\left[\exp\left(-\frac{2a_4\tau}{T_c}\right)+1\right]} + \f] + */ + long double anti_deriv_cp0_tau2(const long double &tau); + + /// The antiderivative given by \f$ \displaystyle\int \frac{1}{\tau}\frac{c_p^0}{R_u}d\tau \f$ + /** + sympy code for this derivative: + + a_0,a_1,a_2,a_3,a_4,Tc,tau = symbols('a_0,a_1,a_2,a_3,a_4,Tc,tau', real = True) + integrand = a_0/tau + a_1/tau*(a_2*tau/Tc/sinh(a_2*tau/Tc))**2 + a_3/tau*(a_4*tau/Tc/cosh(a_4*tau/Tc))**2 + + term2 = a_1/tau*(a_2*tau/Tc/sinh(a_2*tau/Tc))**2 + term2 = term2.rewrite(exp) # Unpack the sinh to exp functions + antideriv2 = trigsimp(integrate(term2,tau)) + display(antideriv2) + print latex(antideriv2) + print ccode(antideriv2) + + term3 = a_3/tau*(a_4*tau/Tc/cosh(a_4*tau/Tc))**2 + term3 = term3.rewrite(exp) # Unpack the cosh to exp functions + antideriv3 = factor(trigsimp(integrate(term3,tau).rewrite(exp))) + display(antideriv3) + print latex(antideriv3) + print ccode(antideriv3) + + Can be broken into three parts (trick is to express \f$sinh\f$ and \f$cosh\f$ in terms of \f$exp\f$ function) + + Term 2: + \f[ + \displaystyle\int \frac{a_1a_2^2}{T_c^2}\frac{\tau}{\sinh\left(\displaystyle\frac{a_2\tau}{T_c}\right)^2} d\tau = \frac{2 a_{1} a_{2} \tau}{- Tc + Tc e^{- \frac{2 a_{2}}{Tc} \tau}} + a_{1} \log{\left (-1 + e^{- \frac{2 a_{2}}{Tc} \tau} \right )} + \frac{2 a_{1}}{Tc} a_{2} \tau + \f] + + Term 3: + \f[ + \displaystyle\int \frac{a_1a_2^2}{T_c^2}\frac{\tau}{\cosh\left(\displaystyle\frac{a_2\tau}{T_c}\right)^2} d\tau = - \frac{a_{3}}{Tc \left(e^{\frac{2 a_{4}}{Tc} \tau} + 1\right)} \left(Tc e^{\frac{2 a_{4}}{Tc} \tau} \log{\left (e^{\frac{2 a_{4}}{Tc} \tau} + 1 \right )} + Tc \log{\left (e^{\frac{2 a_{4}}{Tc} \tau} + 1 \right )} - 2 a_{4} \tau e^{\frac{2 a_{4}}{Tc} \tau}\right) + \f] + */ + long double anti_deriv_cp0_tau(const long double &tau); + + long double base(const long double &tau, const long double &delta) throw(); + long double dDelta(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau(const long double &tau, const long double &delta) throw(); + long double dDelta2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau2(const long double &tau, const long double &delta) throw(); + long double dDelta3(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta2_dTau(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dDelta_dTau2(const long double &tau, const long double &delta) throw(){return 0.0;}; + long double dTau3(const long double &tau, const long double &delta) throw(); + +}; + + +class IdealHelmholtzContainer +{ + +public: + IdealHelmholtzLead Lead; + IdealHelmholtzEnthalpyEntropyOffset EnthalpyEntropyOffset; + IdealHelmholtzLogTau LogTau; + IdealHelmholtzPower Power; + IdealHelmholtzPlanckEinstein PlanckEinstein; + IdealHelmholtzPlanckEinstein2 PlanckEinstein2; + + IdealHelmholtzCP0Constant CP0Constant; + IdealHelmholtzCP0PolyT CP0PolyT; + IdealHelmholtzCP0AlyLee CP0AlyLee; + + long double base(const long double &tau, const long double &delta) + { + return (Lead.base(tau, delta) + EnthalpyEntropyOffset.base(tau, delta) + + LogTau.base(tau, delta) + Power.base(tau, delta) + + PlanckEinstein.base(tau, delta) + PlanckEinstein2.base(tau, delta) + + CP0Constant.base(tau, delta) + CP0PolyT.base(tau, delta) + + CP0AlyLee.base(tau, delta) + ); + }; + long double dDelta(const long double &tau, const long double &delta) + { + return (Lead.dDelta(tau, delta) + EnthalpyEntropyOffset.dDelta(tau, delta) + + LogTau.dDelta(tau, delta) + Power.dDelta(tau, delta) + + PlanckEinstein.dDelta(tau, delta) + PlanckEinstein2.dDelta(tau, delta) + + CP0Constant.dDelta(tau, delta) + CP0PolyT.dDelta(tau, delta) + + CP0AlyLee.dDelta(tau, delta) + ); + }; + long double dTau(const long double &tau, const long double &delta) + { + return (Lead.dTau(tau, delta) + EnthalpyEntropyOffset.dTau(tau, delta) + + LogTau.dTau(tau, delta) + Power.dTau(tau, delta) + + PlanckEinstein.dTau(tau, delta) + PlanckEinstein2.dTau(tau, delta) + + CP0Constant.dTau(tau, delta) + CP0PolyT.dTau(tau, delta) + + CP0AlyLee.dTau(tau, delta) + ); + }; + long double dDelta2(const long double &tau, const long double &delta) + { + return (Lead.dDelta2(tau, delta) + EnthalpyEntropyOffset.dDelta2(tau, delta) + + LogTau.dDelta2(tau, delta) + Power.dDelta2(tau, delta) + + PlanckEinstein.dDelta2(tau, delta) + PlanckEinstein2.dDelta2(tau, delta) + + CP0Constant.dDelta2(tau, delta) + CP0PolyT.dDelta2(tau, delta) + + CP0AlyLee.dDelta2(tau, delta) + ); + }; + long double dDelta_dTau(const long double &tau, const long double &delta) + { + return (Lead.dDelta_dTau(tau, delta) + EnthalpyEntropyOffset.dDelta_dTau(tau, delta) + + LogTau.dDelta_dTau(tau, delta) + Power.dDelta_dTau(tau, delta) + + PlanckEinstein.dDelta_dTau(tau, delta) + PlanckEinstein2.dDelta_dTau(tau, delta) + + CP0Constant.dDelta_dTau(tau, delta) + CP0PolyT.dDelta_dTau(tau, delta) + + CP0AlyLee.dDelta_dTau(tau, delta) + ); + }; + long double dTau2(const long double &tau, const long double &delta) + { + return (Lead.dTau2(tau, delta) + EnthalpyEntropyOffset.dTau2(tau, delta) + + LogTau.dTau2(tau, delta) + Power.dTau2(tau, delta) + + PlanckEinstein.dTau2(tau, delta) + PlanckEinstein2.dTau2(tau, delta) + + CP0Constant.dTau2(tau, delta) + CP0PolyT.dTau2(tau, delta) + + CP0AlyLee.dTau2(tau, delta)); + }; + long double dDelta3(const long double &tau, const long double &delta) + { + return (Lead.dDelta3(tau, delta) + EnthalpyEntropyOffset.dDelta3(tau, delta) + + LogTau.dDelta3(tau, delta) + Power.dDelta3(tau, delta) + + PlanckEinstein.dDelta3(tau, delta) + PlanckEinstein2.dDelta3(tau, delta) + + CP0Constant.dDelta3(tau, delta) + CP0PolyT.dDelta3(tau, delta) + + CP0AlyLee.dDelta3(tau, delta) + ); + }; + long double dDelta2_dTau(const long double &tau, const long double &delta) + { + return (Lead.dDelta2_dTau(tau, delta) + EnthalpyEntropyOffset.dDelta2_dTau(tau, delta) + + LogTau.dDelta2_dTau(tau, delta) + Power.dDelta2_dTau(tau, delta) + + PlanckEinstein.dDelta2_dTau(tau, delta) + PlanckEinstein2.dDelta2_dTau(tau, delta) + + CP0Constant.dDelta2_dTau(tau, delta) + CP0PolyT.dDelta2_dTau(tau, delta) + + CP0AlyLee.dDelta2_dTau(tau, delta) + ); + }; + long double dDelta_dTau2(const long double &tau, const long double &delta) + { + return (Lead.dDelta_dTau2(tau, delta) + EnthalpyEntropyOffset.dDelta_dTau2(tau, delta) + + LogTau.dDelta_dTau2(tau, delta) + Power.dDelta_dTau2(tau, delta) + + PlanckEinstein.dDelta_dTau2(tau, delta) + PlanckEinstein2.dDelta_dTau2(tau, delta) + + CP0Constant.dDelta_dTau2(tau, delta) + CP0PolyT.dDelta_dTau2(tau, delta) + + CP0AlyLee.dDelta_dTau2(tau, delta) + ); + }; + long double dTau3(const long double &tau, const long double &delta) + { + return (Lead.dTau3(tau, delta) + EnthalpyEntropyOffset.dTau3(tau, delta) + + LogTau.dTau3(tau, delta) + Power.dTau3(tau, delta) + + PlanckEinstein.dTau3(tau, delta) + PlanckEinstein2.dTau3(tau, delta) + + CP0Constant.dTau3(tau, delta) + CP0PolyT.dTau3(tau, delta) + + CP0AlyLee.dTau3(tau, delta) + ); + }; +}; + +}; + + + +#endif \ No newline at end of file diff --git a/include/HumidAirProp.h b/include/HumidAirProp.h new file mode 100644 index 00000000..f16e495b --- /dev/null +++ b/include/HumidAirProp.h @@ -0,0 +1,40 @@ + + +#ifndef HUMAIR_H +#define HUMAIR_H + +#include "CoolPropTools.h" + +namespace HumidAir +{ +// ----------------------- +// Standard I/O function +// ----------------------- +double HAPropsSI(const char *OutputName, const char *Input1Name, double Input1, const char *Input2Name, double Input2, const char *Input3Name, double Input3); + +// ----------------------- +// Extra I/O function +// ----------------------- +double HAProps_Aux(const char* OutputName, double T, double p, double W, char *units); + +// Properties for Ice Ih at temperatures below 273.16 K +double IceProps(const char* Name, double T, double p); + +//Turn on the use of virial correlations for air and water +void UseVirialCorrelations(int flag); +void UseIsothermCompressCorrelation(int flag); +void UseIdealGasEnthalpyCorrelations(int flag); + +// -------------- +// Help functions +// -------------- +void HAHelp(void); +int returnHumAirCode(const char * Code); + +// ---------------------- +// Other simple functions +// ---------------------- +double cair_sat(double T); + +} /* namespace HumidAir */ +#endif diff --git a/include/Ice.h b/include/Ice.h new file mode 100644 index 00000000..b96a4bd5 --- /dev/null +++ b/include/Ice.h @@ -0,0 +1,14 @@ +#ifndef ICE_H +#define ICE_H + +double psub_Ice(double T); +double g_Ice(double T,double p); +double dg_dp_Ice(double T, double p); +double dg2_dp2_Ice(double T, double p); +double IsothermCompress_Ice(double T, double p); +double dg_dT_Ice(double T, double p); +double h_Ice(double T, double p); +double s_Ice(double T, double p); +double rho_Ice(double T, double p); + +#endif \ No newline at end of file diff --git a/include/MatrixMath.h b/include/MatrixMath.h new file mode 100644 index 00000000..1700107e --- /dev/null +++ b/include/MatrixMath.h @@ -0,0 +1,439 @@ +#ifndef MATRIXMATH_H +#define MATRIXMATH_H + +#include "CoolPropTools.h" +#include "Exceptions.h" + +#include +#include +#include // inner_product +#include +#include "float.h" + +namespace CoolProp{ + +///// Publish the linear algebra solver +//template std::vector linsolve(std::vector > const& A, std::vector const& b); +//template std::vector > linsolve(std::vector > const& A, std::vector > const& B); +// +///// Some shortcuts and regularly needed operations +//template std::size_t num_rows (std::vector > const& in); +//template std::size_t num_cols (std::vector > const& in); +//template std::size_t max_cols (std::vector > const& in); +//template std::vector get_row (std::vector > const& in, size_t row); +//template std::vector get_col (std::vector > const& in, size_t col); +//template bool is_squared(std::vector > const& in); +//template std::vector > make_squared(std::vector > const& in); +// +///// Define some basic math operations for vectors +//template T multiply( std::vector const& A, std::vector const& B); +//template std::vector multiply(std::vector > const& A, std::vector const& B); +//template std::vector > multiply(std::vector > const& A, std::vector > const& B); +// +//template T dot_product(std::vector const& a, std::vector const& b); +//template std::vector cross_product(std::vector const& a, std::vector const& b); +// +//template std::vector > transpose(std::vector > const& in); +//template std::vector > invert(std::vector > const& in); +// +//template std::string vec_to_string( T const& a); +//template std::string vec_to_string( std::vector const& a); +//template std::string vec_to_string(std::vector > const& A); +// +//template std::string vec_to_string( std::vector const& a, const char *fmt); +//template std::string vec_to_string(std::vector > const& A, const char *fmt); + +// Forward definitions +template std::size_t num_rows (std::vector > const& in); +template std::size_t max_cols (std::vector > const& in); + +template bool is_squared(std::vector > const& in){ + std::size_t cols = max_cols(in); + if (cols!=num_rows(in)) { return false;} + else { + for (std::size_t i = 0; i < in.size(); i++) { + if (cols!=in[i].size()) {return false; } + } + } + return true; +}; +template std::size_t max_cols (std::vector > const& in){ + std::size_t cols = 0; + std::size_t col = 0; + for (std::size_t i = 0; i < in.size(); i++) { + col = in[i].size(); + if (cols std::size_t num_rows (std::vector > const& in){ return in.size(); } +template std::size_t num_cols (std::vector > const& in){ + if (num_rows(in)>0) { + if (is_squared(in)) { + return in[0].size(); + } else { + return max_cols(in); + } + } else { + return 0; + } +}; + + +/* +Owe a debt of gratitude to http://sole.ooz.ie/en - very clear treatment of GJ +*/ +template void swap_rows(std::vector > *A, size_t row1, size_t row2) +{ + for (size_t col = 0; col < (*A)[0].size(); col++){ + std::swap((*A)[row1][col],(*A)[row2][col]); + } +}; +template void subtract_row_multiple(std::vector > *A, size_t row, T multiple, size_t pivot_row) +{ + for (size_t col = 0; col < (*A)[0].size(); col++){ + (*A)[row][col] -= multiple*(*A)[pivot_row][col]; + } +}; +template void divide_row_by(std::vector > *A, size_t row, T value) +{ + for (size_t col = 0; col < (*A)[0].size(); col++){ + (*A)[row][col] /= value; + } +}; + +template size_t get_pivot_row(std::vector > *A, size_t col) +{ + int index = col; + T max = 0, val; + + for (size_t row = col; row < (*A).size(); row++) + { + val = (*A)[row][col]; + if (fabs(val) > max) + { + max = fabs(val); + index = row; + } + } + return index; +}; + + +template std::vector > linsolve_Gauss_Jordan(std::vector > const& A, std::vector > const& B) { + std::vector > AB; + std::vector > X; + size_t pivot_row; + T pivot_element; + + size_t NrowA = num_rows(A); + size_t NrowB = num_rows(B); + size_t NcolA = num_cols(A); + size_t NcolB = num_cols(B); + + if (NrowA!=NrowB) throw ValueError(format("You have to provide matrices with the same number of rows: %d is not %d. ",NrowA,NrowB)); + + AB.resize(NrowA, std::vector(NcolA+NcolB, 0)); + X.resize(NrowA, std::vector(NcolB, 0)); + + // Build the augmented matrix + for (size_t row = 0; row < NrowA; row++){ + for (size_t col = 0; col < NcolA; col++){ + AB[row][col] = A[row][col]; + } + for (size_t col = NcolA; col < NcolA+NcolB; col++){ + AB[row][col] = B[row][col-NcolA]; + } + } + + for (size_t col = 0; col < NcolA; col++){ + // Find the pivot value + pivot_row = get_pivot_row(&AB, col); + + if (fabs(AB[pivot_row][col]) < 10*DBL_EPSILON){ throw ValueError(format("Zero occurred in row %d, the matrix is singular. ",pivot_row));} + + if (pivot_row>=col){ + // Swap pivot row and current row + swap_rows(&AB, col, pivot_row); + } + // Get the pivot element + pivot_element = AB[col][col]; + // Divide the pivot row by the pivot element + divide_row_by(&AB,col,pivot_element); + + if (col < NrowA-1) + { + // All the rest of the rows, subtract the value of the [r][c] combination + for (size_t row = col + 1; row < NrowA; row++) + { + subtract_row_multiple(&AB,row,AB[row][col],col); + } + } + } + for (int col = NcolA - 1; col > 0; col--) + { + for (int row = col - 1; row >=0; row--) + { + subtract_row_multiple(&AB,row,AB[row][col],col); + } + } + // Set the output value + for (size_t row = 0; row < NrowA; row++){ + for (size_t col = 0; col < NcolB; col++){ + X[row][col] = AB[row][NcolA+col]; + } + } + return X; +}; + + +//std::vector > linsolve_Gauss_Jordan_reimpl(std::vector > const& A, std::vector > const& B) { +// std::vector > AB; +// std::vector > X; +// size_t pivot_row; +// double pivot_element; +// double tmp_element; +// +// size_t NrowA = num_rows(A); +// size_t NrowB = num_rows(B); +// size_t NcolA = num_cols(A); +// size_t NcolB = num_cols(B); +// +// if (NrowA!=NrowB) throw ValueError(format("You have to provide matrices with the same number of rows: %d is not %d. ",NrowA,NrowB)); +// +// AB.resize(NrowA, std::vector(NcolA+NcolB, 0)); +// X.resize(NrowA, std::vector(NcolB, 0)); +// +// // Build the augmented matrix +// for (size_t row = 0; row < NrowA; row++){ +// for (size_t col = 0; col < NcolA; col++){ +// AB[row][col] = A[row][col]; +// } +// for (size_t col = NcolA; col < NcolA+NcolB; col++){ +// AB[row][col] = B[row][col-NcolA]; +// } +// } +// +// for (size_t col = 0; col < NcolA; col++){ +// // Find the pivot row +// pivot_row = 0; +// pivot_element = 0.0; +// for (size_t row = col; row < NrowA; row++){ +// tmp_element = fabs(AB[row][col]); +// if (tmp_element>pivot_element) { +// pivot_element = tmp_element; +// pivot_row = row; +// } +// } +// // Check for errors +// if (AB[pivot_row][col]<1./_HUGE) throw ValueError(format("Zero occurred in row %d, the matrix is singular. ",pivot_row)); +// // Swap the rows +// if (pivot_row>col) { +// for (size_t colInt = 0; colInt < NcolA; colInt++){ +// std::swap(AB[pivot_row][colInt],AB[pivot_row][colInt]); +// } +// } +// // Process the entries below current element +// for (size_t row = col; row < NrowA; row++){ +// // Entries to the right of current element (until end of A) +// for (size_t colInt = col+1; colInt < NcolA; colInt++){ +// // All entries in augmented matrix +// for (size_t colFull = col; colFull < NcolA+NcolB; colFull++){ +// AB[colInt][colFull] -= AB[col][colFull] * AB[colInt][col] / AB[col][col]; +// } +// AB[colInt][col] = 0.0; +// } +// } +// } +// return AB; +//} + + + + + + +template std::vector > linsolve(std::vector > const& A, std::vector > const& B){ + return linsolve_Gauss_Jordan(A, B); +}; + +template std::vector linsolve(std::vector > const& A, std::vector const& b){ + std::vector > B; + for (size_t i = 0; i < b.size(); i++){ + B.push_back(std::vector(1,b[i])); + } + B = linsolve(A, B); + B[0].resize(B.size(),0.0); + for (size_t i = 1; i < B.size(); i++){ + B[0][i] = B[i][0]; + } + return B[0]; +}; + + + +template std::vector get_row(std::vector< std::vector > const& in, size_t row) { return in[row]; }; +template std::vector get_col(std::vector< std::vector > const& in, size_t col) { + std::size_t sizeX = in.size(); + if (sizeX<1) throw ValueError(format("You have to provide values, a vector length of %d is not valid. ",sizeX)); + size_t sizeY = in[0].size(); + if (sizeY<1) throw ValueError(format("You have to provide values, a vector length of %d is not valid. ",sizeY)); + std::vector out; + for (std::size_t i = 0; i < sizeX; i++) { + sizeY = in[i].size(); + if (sizeY-1 std::vector > make_squared(std::vector > const& in){ + std::size_t cols = max_cols(in); + std::size_t rows = num_rows(in); + std::size_t maxVal = 0; + std::vector > out; + std::vector tmp; + + if (cols>rows) {maxVal = cols; } + else {maxVal = rows; } + out.clear(); + for (std::size_t i = 0; i < in.size(); i++) { + tmp.clear(); + for (std::size_t j = 0; j < in[i].size(); j++) { + tmp.push_back(in[i][j]); + } + while (maxVal>tmp.size()) { + tmp.push_back(0.0); + } + out.push_back(tmp); + } + // Check rows + tmp.clear(); + tmp.resize(maxVal,0.0); + while (maxVal>out.size()) { + out.push_back(tmp); + } + return out; +}; + +template T multiply( std::vector const& a, std::vector const& b){ + return dot_product(a,b); + +}; +template std::vector multiply(std::vector > const& A, std::vector const& b){ + std::vector > B; + for (size_t i = 0; i < b.size(); i++){ + B.push_back(std::vector(1,b[i])); + } + B = multiply(A, B); + B[0].resize(B.size(),0.0); + for (size_t i = 1; i < B.size(); i++){ + B[0][i] = B[i][0]; + } + return B[0]; +} + +template std::vector > multiply(std::vector > const& A, std::vector > const& B){ + if (num_cols(A) != num_rows(B)){ + throw ValueError(format("You have to provide matrices with the same columns and rows: %d is not equal to %d. ",num_cols(A),num_rows(B))); + } + size_t rows = num_rows(A); + size_t cols = num_cols(B); + T tmp; + std::vector > outVec; + std::vector tmpVec; + outVec.clear(); + for (size_t i = 0; i < rows; i++){ + tmpVec.clear(); + for (size_t j = 0; j < cols; j++){ + tmp = 0.0; + for (size_t k = 0; k < num_cols(A); k++){ + tmp += A[i][k] * B[k][j]; + } + tmpVec.push_back(tmp); + } + outVec.push_back(tmpVec); + } + return outVec; +}; + +template T dot_product(std::vector const& a, std::vector const& b){ + if (a.size()==b.size()){ + return std::inner_product(a.begin(), a.end(), b.begin(), 0.0); + } + throw ValueError(format("You have to provide vectors with the same length: %d is not equal to %d. ",a.size(),b.size())); +}; + +template std::vector cross_product(std::vector const& a, std::vector const& b){ + throw NotImplementedError("The cross product function has not been implemented, yet"); +}; + +template std::vector< std::vector > transpose(std::vector > const& in){ + size_t sizeX = in.size(); + if (sizeX<1) throw ValueError(format("You have to provide values, a vector length of %d is not a valid. ",sizeX)); + size_t sizeY = in[0].size(); + size_t sizeYOld = sizeY; + if (sizeY<1) throw ValueError(format("You have to provide values, a vector length of %d is not a valid. ",sizeY)); + std::vector< std::vector > out(sizeY,std::vector(sizeX)); + for (size_t i = 0; i < sizeX; ++i){ + sizeY = in[i].size(); + if (sizeY!=sizeYOld) throw ValueError(format("You have to provide a rectangular matrix: %d is not equal to %d. ",sizeY,sizeYOld)); + for (size_t j = 0; j < sizeY; ++j){ + out[j][i] = in[i][j]; + } + } + return out; +}; + +template std::vector< std::vector > invert(std::vector > const& in){ + if (!is_squared(in)) throw ValueError(format("Only square matrices can be inverted: %d is not equal to %d. ",num_rows(in),num_cols(in))); + std::vector > identity; + // Build the identity matrix + size_t dim = num_rows(in); + identity.resize(dim, std::vector(dim, 0)); + for (size_t row = 0; row < dim; row++){ + identity[row][row] = 1.0; + } + return linsolve(in,identity); +}; + +template std::string vec_to_string( T const& a){ + std::stringstream out; + out << format("[ %7.3f ]",a); + return out.str(); +}; + +template std::string vec_to_string( std::vector const& a) { + return vec_to_string(a,"%7.3g"); +}; +template std::string vec_to_string( std::vector const& a, const char *fmt) { + if (a.size()<1) { + return std::string(""); + } else { + std::stringstream out; + out << format("[ "); + out << format(fmt,a[0]); + for (size_t j = 1; j < a.size(); j++) { + out << ", "; + out << format(fmt,a[j]); + } + out << " ]"; + return out.str(); + } +}; + +template std::string vec_to_string(std::vector > const& A) { + return vec_to_string(A, "%7.3g"); +} + +template std::string vec_to_string(std::vector > const& A, const char *fmt) { + std::stringstream out; + for (size_t j = 0; j < A.size(); j++) { + out << vec_to_string(A[j], fmt); + } + return out.str(); +} + +}; /* namespace CoolProp */ +#endif diff --git a/include/PlatformDetermination.h b/include/PlatformDetermination.h new file mode 100644 index 00000000..ee0ca9d7 --- /dev/null +++ b/include/PlatformDetermination.h @@ -0,0 +1,12 @@ +#ifndef PLATFORMDETERMINATION_H +#define PLATFORMDETERMINATION_H + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(__WIN64__) +# define __ISWINDOWS__ +#elif __APPLE__ +# define __ISAPPLE__ +#elif __linux +# define __ISLINUX__ +#endif + +#endif \ No newline at end of file diff --git a/include/PolyMath.h b/include/PolyMath.h new file mode 100644 index 00000000..4fd1457a --- /dev/null +++ b/include/PolyMath.h @@ -0,0 +1,638 @@ +#ifndef POLYMATH_H +#define POLYMATH_H + +#include "CoolPropTools.h" +#include "Exceptions.h" + +#include +#include +#include "Solvers.h" +//#include // inner_product +//#include +//#include "float.h" + +namespace CoolProp{ + +/// The base class for Polynomials +class BasePolynomial{ + +protected: + bool DEBUG; + +public: + // Constructor + BasePolynomial(); + // Destructor. No implementation + virtual ~BasePolynomial(){}; + +protected: + /// Basic checks for coefficient vectors. + /** Starts with only the first coefficient dimension + * and checks the vector length against parameter n. */ + bool checkCoefficients(const std::vector &coefficients, const unsigned int n); + bool checkCoefficients(const std::vector< std::vector > &coefficients, const unsigned int rows, const unsigned int columns); + + /** Integrating coefficients for polynomials is done by dividing the + * original coefficients by (i+1) and elevating the order by 1 + * through adding a zero as first coefficient. + * Some reslicing needs to be applied to integrate along the x-axis. + * In the brine/solution equations, reordering of the parameters + * avoids this expensive operation. However, it is included for the + * sake of completeness. + */ + std::vector integrateCoeffs(const std::vector &coefficients); + std::vector< std::vector > integrateCoeffs(const std::vector< std::vector > &coefficients, bool axis); + + /** Deriving coefficients for polynomials is done by multiplying the + * original coefficients with i and lowering the order by 1. + * + * It is not really deprecated, but untested and therefore a warning + * is issued. Please check this method before you use it. + */ + std::vector deriveCoeffs(const std::vector &coefficients); + std::vector< std::vector > deriveCoeffs(const std::vector< std::vector > &coefficients, unsigned int axis); + +private: + /** The core of the polynomial wrappers are the different + * implementations that follow below. In case there are + * new calculation schemes available, please do not delete + * the implementations, but mark them as deprecated. + * The old functions are good for debugging since the + * structure is easier to read than the backward Horner-scheme + * or the recursive Horner-scheme. + */ + + /// Simple polynomial function generator. <- Deprecated due to poor performance, use Horner-scheme instead + /** Base function to produce n-th order polynomials + * based on the length of the coefficient vector. + * Starts with only the first coefficient at T^0. */ + DEPRECATED(long double simplePolynomial(const std::vector &coefficients, long double T)); + DEPRECATED(long double simplePolynomial(const std::vector > &coefficients, long double x, long double T)); + + /// Simple integrated polynomial function generator. + /** Base function to produce integrals of n-th order polynomials based on + * the length of the coefficient vector. + * Starts with only the first coefficient at T^0 */ + ///Indefinite integral in T-direction + long double simplePolynomialInt(const std::vector &coefficients, long double T); + ///Indefinite integral in T-direction only + long double simplePolynomialInt(const std::vector > &coefficients, long double x, long double T); + + /// Simple integrated polynomial function generator divided by independent variable. + /** Base function to produce integrals of n-th order + * polynomials based on the length of the coefficient + * vector. Starts with only the first coefficient at T^0 */ + ///Indefinite integral of a polynomial divided by its independent variable + long double simpleFracInt(const std::vector &coefficients, long double T); + ///Indefinite integral of a polynomial divided by its 2nd independent variable + long double simpleFracInt(const std::vector > &coefficients, long double x, long double T); + + /** Simple integrated centred(!) polynomial function generator divided by independent variable. + * We need to rewrite some of the functions in order to + * use central fit. Having a central temperature Tbase + * allows for a better fit, but requires a different + * formulation of the fracInt function group. Other + * functions are not affected. + * Starts with only the first coefficient at T^0 */ + ///Helper function to calculate the D vector: + long double factorial(long double nValue); + long double binom(long double nValue, long double nValue2); + std::vector fracIntCentralDvector(int m, long double T, long double Tbase); + ///Indefinite integral of a centred polynomial divided by its independent variable + long double fracIntCentral(const std::vector &coefficients, long double T, long double Tbase); + + /// Horner function generator implementations + /** Represent polynomials according to Horner's scheme. + * This avoids unnecessary multiplication and thus + * speeds up calculation. + */ + long double baseHorner(const std::vector &coefficients, long double T); + long double baseHorner(const std::vector< std::vector > &coefficients, long double x, long double T); + ///Indefinite integral in T-direction + long double baseHornerInt(const std::vector &coefficients, long double T); + ///Indefinite integral in T-direction only + long double baseHornerInt(const std::vector > &coefficients, long double x, long double T); + ///Indefinite integral of a polynomial divided by its independent variable + long double baseHornerFracInt(const std::vector &coefficients, long double T); + ///Indefinite integral of a polynomial divided by its 2nd independent variable + long double baseHornerFracInt(const std::vector > &coefficients, long double x, long double T); + + /** Alternatives + * Simple functions that heavily rely on other parts of this file. + * We still need to check which combinations yield the best + * performance. + */ + ///Derivative in T-direction + long double deriveIn2Steps(const std::vector &coefficients, long double T); + ///Derivative in terms of x(axis=true) or T(axis=false). + long double deriveIn2Steps(const std::vector< std::vector > &coefficients, long double x, long double T, bool axis); + ///Indefinite integral in T-direction + long double integrateIn2Steps(const std::vector &coefficients, long double T); + ///Indefinite integral in terms of x(axis=true) or T(axis=false). + long double integrateIn2Steps(const std::vector< std::vector > &coefficients, long double x, long double T, bool axis); + ///Indefinite integral in T-direction of a polynomial divided by its independent variable + long double fracIntIn2Steps(const std::vector &coefficients, long double T); + ///Indefinite integral in T-direction of a polynomial divided by its 2nd independent variable + long double fracIntIn2Steps(const std::vector > &coefficients, long double x, long double T); + ///Indefinite integral of a centred polynomial divided by its 2nd independent variable + long double fracIntCentral2Steps(const std::vector > &coefficients, long double x, long double T, long double Tbase); + +public: + /** Here we define the functions that should be used by the + * respective implementations. Please do no use any other + * method since this would break the purpose of this interface. + * Note that the functions below are supposed to be aliases + * to implementations declared elsewhere in this file. + */ + + /** Everything related to the normal polynomials goes in this + * section, holds functions for both evaluation and solving + * of polynomials. + */ + /// Evaluates a one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input + inline long double polyval(const std::vector &coefficients, long double x){ + return baseHorner(coefficients,x); + } + + /// Evaluates a two-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param y long double value that represents the current input in the 2nd dimension + inline long double polyval(const std::vector< std::vector > &coefficients, long double x, long double y){ + return baseHorner(coefficients,x,y); + } + + + /** Everything related to the integrated polynomials goes in this + * section, holds functions for both evaluation and solving + * of polynomials. + */ + /// Evaluates the indefinite integral of a one-dimensional polynomial + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current input + inline long double polyint(const std::vector &coefficients, long double T){ + return baseHornerInt(coefficients,T); + } + + /// Evaluates the indefinite integral of a two-dimensional polynomial along the 2nd axis (T) + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + inline long double polyint(const std::vector< std::vector > &coefficients, long double x, long double T){ + return baseHornerInt(coefficients,x,T); + } + + + /** Everything related to the derived polynomials goes in this + * section, holds functions for both evaluation and solving + * of polynomials. + */ + /// Evaluates the derivative of a one-dimensional polynomial + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current input + inline long double polyder(const std::vector &coefficients, long double T){ + return deriveIn2Steps(coefficients,T); + } + + /// Evaluates the derivative of a two-dimensional polynomial along the 2nd axis (T) + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + inline long double polyder(const std::vector< std::vector > &coefficients, long double x, long double T){ + return deriveIn2Steps(coefficients,x,T,false); + } + + + /** Everything related to the polynomials divided by one variable goes in this + * section, holds functions for both evaluation and solving + * of polynomials. + */ + /// Evaluates the indefinite integral of a one-dimensional polynomial divided by its independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current position + inline long double polyfracval(const std::vector &coefficients, long double T){ + return baseHornerFracInt(coefficients,T); + } + + /// Evaluates the indefinite integral of a two-dimensional polynomial divided by its 2nd independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + inline long double polyfracval(const std::vector< std::vector > &coefficients, long double x, long double T){ + return baseHornerFracInt(coefficients,x,T); + } + + /// Evaluates the indefinite integral of a one-dimensional polynomial divided by its independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current position + inline long double polyfracint(const std::vector &coefficients, long double T){ + return baseHornerFracInt(coefficients,T); + } + + /// Evaluates the indefinite integral of a two-dimensional polynomial divided by its 2nd independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + inline long double polyfracint(const std::vector< std::vector > &coefficients, long double x, long double T){ + return baseHornerFracInt(coefficients,x,T); + } + + /// Evaluates the indefinite integral of a centred one-dimensional polynomial divided by its independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current position + /// @param Tbase central temperature for fitted function + inline long double polyfracintcentral(const std::vector &coefficients, long double T, long double Tbase){ + return fracIntCentral(coefficients,T,Tbase); + } + + /// Evaluates the indefinite integral of a centred two-dimensional polynomial divided by its 2nd independent variable + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + /// @param Tbase central temperature for fitted function + inline long double polyfracintcentral(const std::vector< std::vector > &coefficients, long double x, long double T, long double Tbase){ + return fracIntCentral2Steps(coefficients,x,T,Tbase); + } + + /// Evaluates an exponential function for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param T long double value that represents the current input + /// @param n int value that determines the kind of exponential function + long double expval(const std::vector &coefficients, long double T, int n); + + /// Evaluates an exponential function for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param T long double value that represents the current input in the 2nd dimension + /// @param n int value that determines the kind of exponential function + long double expval(const std::vector< std::vector > &coefficients, long double x, long double T, int n); +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/// The classes for Polynomials +class PolynomialImpl1D : public BasePolynomial{ +protected: + std::vector coefficients; + /// A nested class that is used by the solvers to calculate + /// residuals and derivatives during the solution process. + class Residual : public FuncWrapper1D { + private: + PolynomialImpl1D *poly; + long double y; + Residual(); + public: + Residual(PolynomialImpl1D *poly, long double y); + virtual double call(double x); + virtual double deriv(double x); + }; + class ResidualInt : public Residual { + public: + virtual double call(double x); + virtual double deriv(double x); + }; + class ResidualDer : public Residual { + public: + virtual double call(double x); + virtual double deriv(double x); + }; +private: + PolynomialImpl1D(); +public: + PolynomialImpl1D(const std::vector &coefficients); + virtual ~PolynomialImpl1D(){}; + /// Evaluates a one-dimensional polynomial for the given coefficients + /// @param x long double value that represents the current input + virtual long double eval(long double x); + /// Evaluates the indefinite integral of a one-dimensional polynomial + /// @param x long double value that represents the current input + virtual long double integ(long double x); + /// Evaluates the derivative of a one-dimensional polynomial + /// @param x long double value that represents the current input + virtual long double deriv(long double x); + /// Solves a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solve(long double y, long double x0); + /// Solves a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solve(long double y, long double xmin, long double xmax); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveInt(long double y, long double x0); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveInt(long double y, long double xmin, long double xmax); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveDer(long double y, long double x0); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveDer(long double y, long double xmin, long double xmax); +}; + +class PolynomialImpl2D : public BasePolynomial{ +protected: + std::vector< std::vector > coefficients; + /// A nested class that is used by the solvers to calculate + /// residuals and derivatives during the solution process. + class Residual : public FuncWrapper1D { + private: + PolynomialImpl2D *poly; + long double x, y; + Residual(); + public: + Residual(PolynomialImpl2D *poly, long double y, long double x); + virtual double call(double z); + virtual double deriv(double z); + }; + class ResidualInt : public Residual { + public: + virtual double call(double z); + virtual double deriv(double z); + }; + class ResidualDer : public Residual { + public: + virtual double call(double z); + virtual double deriv(double z); + }; +private: + PolynomialImpl2D(); +public: + PolynomialImpl2D(const std::vector< std::vector > &coefficients); + virtual ~PolynomialImpl2D(){}; + /// Evaluates a two-dimensional polynomial for the given coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double eval(long double x, long double z); + /// Evaluates the indefinite integral of a two-dimensional polynomial along the 2nd axis (z) + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double integ(long double x, long double z); + /// Evaluates the derivative of a two-dimensional polynomial along the 2nd axis (z) + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double deriv(long double x, long double z); + /// Solves a two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solve(long double y, long double x, long double z0); + /// Solves a two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solve(long double y, long double x, long double zmin, long double zmax); + /// Solves an integrated two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solveInt(long double y, long double x, long double z0); + /// Solves an integrated two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solveInt(long double y, long double x, long double zmin, long double zmax); + /// Solves the derivative of a two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solveDer(long double y, long double x, long double z0); + /// Solves the derivative of a two-dimensional polynomial for the 2nd input (z) + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solveDer(long double y, long double x, long double zmin, long double zmax); +}; + +class PolynomialFrac1D : public PolynomialImpl1D{ +private: + PolynomialFrac1D(); +public: + PolynomialFrac1D(const std::vector &coefficients); + virtual ~PolynomialFrac1D(){}; + /// Evaluates a one-dimensional polynomial for the given coefficients + /// @param x long double value that represents the current input + virtual long double eval(long double x); + /// Evaluates the indefinite integral of a one-dimensional polynomial + /// @param x long double value that represents the current input + virtual long double integ(long double x); + /// Evaluates the derivative of a one-dimensional polynomial + /// @param x long double value that represents the current input + virtual long double deriv(long double x); + /// Solves a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solve(long double y, long double x0); + /// Solves a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solve(long double y, long double xmin, long double xmax); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveInt(long double y, long double x0); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveInt(long double y, long double xmin, long double xmax); + // virtual long double solveIntCentral(long double y, long double xBase, long double x0); // TODO: implement solveIntCentral with x0 + /// Solves an integrated one-dimensional polynomial + /// @param y long double value that represents the current function output + /// @param xBase long double value that represents the central value for x + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveIntCentral(long double y, long double xBase, long double xmin, long double xmax); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveDer(long double y, long double x0); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveDer(long double y, long double xmin, long double xmax); + // virtual long double solveDerCentral(long double y, long double xBase, long double x0); // TODO: implement solveDerCentral with x0 + // virtual long double solveDerCentral(long double y, long double xBase, long double xmin, long double xmax); // TODO: implement solveDerCentral with xmin, xmax + + + + + + + + + /// Solves a one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solve(const std::vector &coefficients, long double y, long double x0); + /// Solves a two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solve(const std::vector< std::vector > &coefficients, long double y, long double x, long double z0); + /// Solves a one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solve(const std::vector &coefficients, long double y, long double xmin, long double xmax); + /// Solves a two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solve(const std::vector< std::vector > &coefficients, long double y, long double x, long double zmin, long double zmax); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveInt(const std::vector &coefficients, long double y, long double x0); + /// Solves an integrated two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solveInt(const std::vector< std::vector > &coefficients, long double y, long double x, long double z0); + /// Solves an integrated one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveInt(const std::vector &coefficients, long double y, long double xmin, long double xmax); + /// Solves an integrated two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solveInt(const std::vector< std::vector > &coefficients, long double y, long double x, long double zmin, long double zmax); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x0 long double value that represents the first guess for x + virtual long double solveDer(const std::vector &coefficients, long double y, long double x0); + /// Solves the derivative of a one-dimensional polynomial for the given coefficients + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param xmin long double value that represents the lower limit for x + /// @param xmax long double value that represents the upper limit for x + virtual long double solveDer(const std::vector &coefficients, long double y, long double xmin, long double xmax); + + + + + + + + + + + /// Solves the derivative of a two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param z0 long double value that represents the first guess for z + virtual long double solveDer(const std::vector< std::vector > &coefficients, long double y, long double x, long double z0); + /// Solves the derivative of a two-dimensional polynomial for the 2nd input (z) + /// @param coefficients vector containing the ordered coefficients + /// @param y long double value that represents the current function output + /// @param x long double value that represents the current input in the 1st dimension + /// @param zmin long double value that represents the lower limit for z + /// @param zmax long double value that represents the upper limit for z + virtual long double solveDer(const std::vector< std::vector > &coefficients, long double y, long double x, long double zmin, long double zmax); + // virtual long double solveDerCentral(long double y, long double x, long double zBase, long double z0); // TODO: implement solveDerCentral with z0 + // virtual long double solveDerCentral(long double y, long double x, long double zBase, long double zmin, long double zmax); // TODO: implement solveDerCentral with zmin, zmax + + + + + + + + + + + +}; + +class PolynomialFrac2D : public PolynomialImpl2D{ +private: + PolynomialFrac2D(); +public: + PolynomialFrac2D(const std::vector< std::vector > &coefficients); + virtual ~PolynomialFrac2D(){}; + /// Evaluates a two-dimensional polynomial for the given coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double eval(long double x, long double z); + /// Evaluates the indefinite integral of a two-dimensional polynomial along the 2nd axis (z) + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double integ(long double x, long double z); + /// Evaluates the indefinite integral of a two-dimensional polynomial along the 2nd axis (z) + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + /// @param zBase long double value that represents the central value for z + virtual long double integCentral(long double x, long double z, long double zBase); + /// Evaluates the derivative of a two-dimensional polynomial along the 2nd axis (z) + /// @param coefficients vector containing the ordered coefficients + /// @param x long double value that represents the current input in the 1st dimension + /// @param z long double value that represents the current input in the 2nd dimension + virtual long double deriv(long double x, long double z); + + +}; + + +}; /* namespace CoolProp */ +#endif diff --git a/include/Solvers.h b/include/Solvers.h new file mode 100644 index 00000000..30eacef0 --- /dev/null +++ b/include/Solvers.h @@ -0,0 +1,39 @@ +#ifndef SOLVERS_H +#define SOLVERS_H + +#include +#include +#include "Exceptions.h" + +namespace CoolProp +{ + +class FuncWrapper1D +{ +public: + FuncWrapper1D(){}; + virtual ~FuncWrapper1D(){}; + virtual double call(double) = 0; + virtual double deriv(double){throw NotImplementedError("deriv function not implemented");}; +}; + +class FuncWrapperND +{ +public: + FuncWrapperND(){}; + virtual ~FuncWrapperND(){}; + virtual std::vector call(std::vector) = 0;// must be provided + virtual std::vector > Jacobian(std::vector){std::vector > J; return J;}; // optional +}; + +// Single-Dimensional solvers +double Brent(FuncWrapper1D &f, double a, double b, double macheps, double t, int maxiter, std::string &errstr); +double Secant(FuncWrapper1D &f, double x0, double dx, double ftol, int maxiter, std::string &errstring); +double BoundedSecant(FuncWrapper1D &f, double x0, double xmin, double xmax, double dx, double ftol, int maxiter, std::string &errstring); +double Newton(FuncWrapper1D &f, double x0, double ftol, int maxiter, std::string &errstring); + +// Multi-Dimensional solvers +std::vector NDNewtonRaphson_Jacobian(FuncWrapperND *f, std::vector x0, double tol, int maxiter, std::string *errstring); + +}; /*namespace CoolProp*/ +#endif diff --git a/include/SpeedTest.h b/include/SpeedTest.h new file mode 100644 index 00000000..afd76dde --- /dev/null +++ b/include/SpeedTest.h @@ -0,0 +1,12 @@ +#ifndef SPEEDTEST_H +#define SPEEDTEST_H + +#include + +namespace CoolProp{ + +void compare_REFPROP_and_CoolProp(std::string fluid, int inputs, double val1, double val2, std::size_t N); + +} /* namespace CoolProp */ + +#endif \ No newline at end of file diff --git a/include/Tests.h b/include/Tests.h new file mode 100644 index 00000000..c55f78dc --- /dev/null +++ b/include/Tests.h @@ -0,0 +1,12 @@ +#ifndef TESTS_H +#define TESTS_H + +#include +#include + +void run_tests(); +int run_fast_tests(); +int run_not_slow_tests(); +int run_user_defined_tests(const std::vector & tests_or_tags); + +#endif \ No newline at end of file diff --git a/include/rapidjson/rapidjson/document.h b/include/rapidjson/rapidjson/document.h new file mode 100644 index 00000000..83d95a33 --- /dev/null +++ b/include/rapidjson/rapidjson/document.h @@ -0,0 +1,821 @@ +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +#include "reader.h" +#include "internal/strfunc.h" +#include // placement new + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4127) // conditional expression is constant +#endif + +namespace rapidjson { + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +#pragma pack (push, 4) +template > +class GenericValue { +public: + //! Name-value pair in an object. + struct Member { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. + }; + + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef Member* MemberIterator; //!< Member iterator for iterating in object. + typedef const Member* ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() : flags_(kNullFlag) {} + + //! Copy constructor is not permitted. +private: + GenericValue(const GenericValue& rhs); + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + GenericValue(Type type) { + static const unsigned defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kConstStringFlag, + kNumberFlag | kIntFlag | kUintFlag | kInt64Flag | kUint64Flag | kDoubleFlag + }; + RAPIDJSON_ASSERT(type <= kNumberType); + flags_ = defaultFlags[type]; + memset(&data_, 0, sizeof(data_)); + } + + //! Constructor for boolean value. + GenericValue(bool b) : flags_(b ? kTrueFlag : kFalseFlag) {} + + //! Constructor for int value. + GenericValue(int i) : flags_(kNumberIntFlag) { + data_.n.i64 = i; + if (i >= 0) + flags_ |= kUintFlag | kUint64Flag; + } + + //! Constructor for unsigned value. + GenericValue(unsigned u) : flags_(kNumberUintFlag) { + data_.n.u64 = u; + if (!(u & 0x80000000)) + flags_ |= kIntFlag | kInt64Flag; + } + + //! Constructor for int64_t value. + GenericValue(int64_t i64) : flags_(kNumberInt64Flag) { + data_.n.i64 = i64; + if (i64 >= 0) { + flags_ |= kNumberUint64Flag; + if (!(i64 & 0xFFFFFFFF00000000LL)) + flags_ |= kUintFlag; + if (!(i64 & 0xFFFFFFFF80000000LL)) + flags_ |= kIntFlag; + } + else if (i64 >= -2147483648LL) + flags_ |= kIntFlag; + } + + //! Constructor for uint64_t value. + GenericValue(uint64_t u64) : flags_(kNumberUint64Flag) { + data_.n.u64 = u64; + if (!(u64 & 0x8000000000000000ULL)) + flags_ |= kInt64Flag; + if (!(u64 & 0xFFFFFFFF00000000ULL)) + flags_ |= kUintFlag; + if (!(u64 & 0xFFFFFFFF80000000ULL)) + flags_ |= kIntFlag; + } + + //! Constructor for double value. + GenericValue(double d) : flags_(kNumberDoubleFlag) { data_.n.d = d; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) { + RAPIDJSON_ASSERT(s != NULL); + flags_ = kConstStringFlag; + data_.s.str = s; + data_.s.length = length; + } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s) { SetStringRaw(s, internal::StrLen(s)); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) { SetStringRaw(s, length, allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) { SetStringRaw(s, internal::StrLen(s), allocator); } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(flags_) { + case kArrayFlag: + for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(data_.a.elements); + break; + + case kObjectFlag: + for (Member* m = data_.o.members; m != data_.o.members + data_.o.size; ++m) { + m->name.~GenericValue(); + m->value.~GenericValue(); + } + Allocator::Free(data_.o.members); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(data_.s.str)); + break; + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + memcpy(this, &rhs, sizeof(GenericValue)); + rhs.flags_ = kNullFlag; + return *this; + } + + //! Assignment with primitive types. + /*! \tparam T Either Type, int, unsigned, int64_t, uint64_t, const Ch* + \param value The value to be assigned. + */ + template + GenericValue& operator=(T value) { + this->~GenericValue(); + new (this) GenericValue(value); + return *this; + } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(flags_ & kTypeMask); } + bool IsNull() const { return flags_ == kNullFlag; } + bool IsFalse() const { return flags_ == kFalseFlag; } + bool IsTrue() const { return flags_ == kTrueFlag; } + bool IsBool() const { return (flags_ & kBoolFlag) != 0; } + bool IsObject() const { return flags_ == kObjectFlag; } + bool IsArray() const { return flags_ == kArrayFlag; } + bool IsNumber() const { return (flags_ & kNumberFlag) != 0; } + bool IsInt() const { return (flags_ & kIntFlag) != 0; } + bool IsUint() const { return (flags_ & kUintFlag) != 0; } + bool IsInt64() const { return (flags_ & kInt64Flag) != 0; } + bool IsUint64() const { return (flags_ & kUint64Flag) != 0; } + bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; } + bool IsString() const { return (flags_ & kStringFlag) != 0; } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; } + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the value associated with the object's name. + GenericValue& operator[](const Ch* name) { + if (Member* member = FindMember(name)) + return member->value; + else { + static GenericValue NullValue; + return NullValue; + } + } + const GenericValue& operator[](const Ch* name) const { return const_cast(*this)[name]; } + + //! Member iterators. + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.members; } + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; } + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return data_.o.members; } + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; } + + //! Check whether a member exists in the object. + bool HasMember(const Ch* name) const { return FindMember(name) != 0; } + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. + \return The value itself for fluent API. + \note The ownership of name and value will be transfered to this object if success. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + Object& o = data_.o; + if (o.size >= o.capacity) { + if (o.capacity == 0) { + o.capacity = kDefaultObjectCapacity; + o.members = (Member*)allocator.Malloc(o.capacity * sizeof(Member)); + } + else { + SizeType oldCapacity = o.capacity; + o.capacity *= 2; + o.members = (Member*)allocator.Realloc(o.members, oldCapacity * sizeof(Member), o.capacity * sizeof(Member)); + } + } + o.members[o.size].name.RawAssign(name); + o.members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + GenericValue& AddMember(const Ch* name, Allocator& nameAllocator, GenericValue& value, Allocator& allocator) { + GenericValue n(name, internal::StrLen(name), nameAllocator); + return AddMember(n, value, allocator); + } + + GenericValue& AddMember(const Ch* name, GenericValue& value, Allocator& allocator) { + GenericValue n(name, internal::StrLen(name)); + return AddMember(n, value, allocator); + } + + template + GenericValue& AddMember(const Ch* name, T value, Allocator& allocator) { + GenericValue n(name, internal::StrLen(name)); + GenericValue v(value); + return AddMember(n, v, allocator); + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Removing member is implemented by moving the last member. So the ordering of members is changed. + */ + bool RemoveMember(const Ch* name) { + RAPIDJSON_ASSERT(IsObject()); + if (Member* m = FindMember(name)) { + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(data_.o.members != 0); + + Member* last = data_.o.members + (data_.o.size - 1); + if (data_.o.size > 1 && m != last) { + // Move the last one to this place + m->name = last->name; + m->value = last->value; + } + else { + // Only one left, just destroy + m->name.~GenericValue(); + m->value.~GenericValue(); + } + --data_.o.size; + return true; + } + return false; + } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + for (SizeType i = 0; i < data_.a.size; ++i) + data_.a.elements[i].~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \param index Zero-based index of element. + \note +\code +Value a(kArrayType); +a.PushBack(123); +int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type. +int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work. +int z = a[0u].GetInt(); // This works too. +\endcode + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return data_.a.elements[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements; } + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements + data_.a.size; } + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator The allocator for allocating memory. It must be the same one use previously. + \return The value itself for fluent API. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + data_.a.elements = (GenericValue*)allocator.Realloc(data_.a.elements, data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a value at the end of the array. + /*! \param value The value to be appended. + \param allocator The allocator for allocating memory. It must be the same one use previously. + \return The value itself for fluent API. + \note The ownership of the value will be transfered to this object if success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : data_.a.capacity * 2, allocator); + data_.a.elements[data_.a.size++].RawAssign(value); + return *this; + } + + template + GenericValue& PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + data_.a.elements[--data_.a.size].~GenericValue(); + return *this; + } + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(flags_ & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(flags_ & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(flags_ & kUint64Flag); return data_.n.u64; } + + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((flags_ & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((flags_ & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((flags_ & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((flags_ & kInt64Flag) != 0) return (double)data_.n.i64; // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((flags_ & kUint64Flag) != 0); return (double)data_.n.u64; // uint64_t -> double (may lose precision) + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return data_.s.str; } + + //! Get the length of string. + /*! Since rapidjson permits "\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return data_.s.length; } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + */ + GenericValue& SetString(const Ch* s, SizeType length) { this->~GenericValue(); SetStringRaw(s, length); return *this; } + + //! Set this value as a string without copying source string. + /*! \param s source string pointer. + \return The value itself for fluent API. + */ + GenericValue& SetString(const Ch* s) { return SetString(s, internal::StrLen(s)); } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use document.GetAllocator(). + \return The value itself for fluent API. + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, length, allocator); return *this; } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use document.GetAllocator(). + \return The value itself for fluent API. + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { SetString(s, internal::StrLen(s), allocator); return *this; } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + const GenericValue& Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: handler.Null(); break; + case kFalseType: handler.Bool(false); break; + case kTrueType: handler.Bool(true); break; + + case kObjectType: + handler.StartObject(); + for (Member* m = data_.o.members; m != data_.o.members + data_.o.size; ++m) { + handler.String(m->name.data_.s.str, m->name.data_.s.length, false); + m->value.Accept(handler); + } + handler.EndObject(data_.o.size); + break; + + case kArrayType: + handler.StartArray(); + for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v) + v->Accept(handler); + handler.EndArray(data_.a.size); + break; + + case kStringType: + handler.String(data_.s.str, data_.s.length, false); + break; + + case kNumberType: + if (IsInt()) handler.Int(data_.n.i.i); + else if (IsUint()) handler.Uint(data_.n.u.u); + else if (IsInt64()) handler.Int64(data_.n.i64); + else if (IsUint64()) handler.Uint64(data_.n.u64); + else handler.Double(data_.n.d); + break; + } + return *this; + } + +private: + template + friend class GenericDocument; + + enum { + kBoolFlag = 0x100, + kNumberFlag = 0x200, + kIntFlag = 0x400, + kUintFlag = 0x800, + kInt64Flag = 0x1000, + kUint64Flag = 0x2000, + kDoubleFlag = 0x4000, + kStringFlag = 0x100000, + kCopyFlag = 0x200000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0xFF // bitwise-and with mask of 0xFF can be optimized by compiler + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct String { + const Ch* str; + SizeType length; + unsigned hashcode; //!< reserved + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct Object { + Member* members; + SizeType size; + SizeType capacity; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct Array { + GenericValue* elements; + SizeType size; + SizeType capacity; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + Number n; + Object o; + Array a; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + //! Find member by name. + Member* FindMember(const Ch* name) { + RAPIDJSON_ASSERT(name); + RAPIDJSON_ASSERT(IsObject()); + + SizeType length = internal::StrLen(name); + + Object& o = data_.o; + for (Member* member = o.members; member != data_.o.members + data_.o.size; ++member) + if (length == member->name.data_.s.length && memcmp(member->name.data_.s.str, name, length * sizeof(Ch)) == 0) + return member; + + return 0; + } + const Member* FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& alloctaor) { + flags_ = kArrayFlag; + data_.a.elements = (GenericValue*)alloctaor.Malloc(count * sizeof(GenericValue)); + memcpy(data_.a.elements, values, count * sizeof(GenericValue)); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& alloctaor) { + flags_ = kObjectFlag; + data_.o.members = (Member*)alloctaor.Malloc(count * sizeof(Member)); + memcpy(data_.o.members, members, count * sizeof(Member)); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(const Ch* s, SizeType length) { + RAPIDJSON_ASSERT(s != NULL); + flags_ = kConstStringFlag; + data_.s.str = s; + data_.s.length = length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(const Ch* s, SizeType length, Allocator& allocator) { + RAPIDJSON_ASSERT(s != NULL); + flags_ = kCopyStringFlag; + data_.s.str = (Ch *)allocator.Malloc((length + 1) * sizeof(Ch)); + data_.s.length = length; + memcpy(const_cast(data_.s.str), s, length * sizeof(Ch)); + const_cast(data_.s.str)[length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) { + memcpy(this, &rhs, sizeof(GenericValue)); + rhs.flags_ = kNullFlag; + } + + Data data_; + unsigned flags_; +}; +#pragma pack (pop) + +//! Value with UTF8 encoding. +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \implements Handler + \tparam Encoding encoding for both parsing and string storage. + \tparam Alloactor allocator for allocating memory for the DOM, and the stack during parsing. +*/ +template > +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! \param allocator Optional allocator for allocating stack memory. + \param stackCapacity Initial capacity of stack in bytes. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseError_(0), errorOffset_(0) {} + + //! Parse JSON text from an input stream. + /*! \tparam parseFlags Combination of ParseFlag. + \param stream Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(Stream& stream) { + ValueType::SetNull(); // Remove existing root if exist + GenericReader reader; + if (reader.template Parse(stream, *this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + this->RawAssign(*stack_.template Pop(1)); // Add this-> to prevent issue 13. + parseError_ = 0; + errorOffset_ = 0; + } + else { + parseError_ = reader.GetParseError(); + errorOffset_ = reader.GetErrorOffset(); + ClearStack(); + } + return *this; + } + + //! Parse JSON text from a mutable string. + /*! \tparam parseFlags Combination of ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string. + /*! \tparam parseFlags Combination of ParseFlag (must not contain kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Whether a parse error was occured in the last parsing. + bool HasParseError() const { return parseError_ != 0; } + + //! Get the message of parsing error. + const char* GetParseError() const { return parseError_; } + + //! Get the offset in character of the parsing error. + size_t GetErrorOffset() const { return errorOffset_; } + + //! Get the allocator of this document. + Allocator& GetAllocator() { return stack_.GetAllocator(); } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + friend class GenericReader; // for Reader to call the following private handler functions + + // Implementation of Handler + void Null() { new (stack_.template Push()) ValueType(); } + void Bool(bool b) { new (stack_.template Push()) ValueType(b); } + void Int(int i) { new (stack_.template Push()) ValueType(i); } + void Uint(unsigned i) { new (stack_.template Push()) ValueType(i); } + void Int64(int64_t i) { new (stack_.template Push()) ValueType(i); } + void Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); } + void Double(double d) { new (stack_.template Push()) ValueType(d); } + + void String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + } + + void StartObject() { new (stack_.template Push()) ValueType(kObjectType); } + + void EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator()); + } + + void StartArray() { new (stack_.template Push()) ValueType(kArrayType); } + + void EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + } + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + } + + static const size_t kDefaultStackCapacity = 1024; + internal::Stack stack_; + const char* parseError_; + size_t errorOffset_; +}; + +typedef GenericDocument > Document; + +} // namespace rapidjson + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/include/rapidjson/rapidjson/filestream.h b/include/rapidjson/rapidjson/filestream.h new file mode 100644 index 00000000..88589496 --- /dev/null +++ b/include/rapidjson/rapidjson/filestream.h @@ -0,0 +1,46 @@ +#ifndef RAPIDJSON_FILESTREAM_H_ +#define RAPIDJSON_FILESTREAM_H_ + +#include + +namespace rapidjson { + +//! Wrapper of C file stream for input or output. +/*! + This simple wrapper does not check the validity of the stream. + \implements Stream +*/ +class FileStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileStream(FILE* fp) : fp_(fp), count_(0) { Read(); } + char Peek() const { return current_; } + char Take() { char c = current_; Read(); return c; } + size_t Tell() const { return count_; } + void Put(char c) { fputc(c, fp_); } + + // Not implemented + char* PutBegin() { return 0; } + size_t PutEnd(char*) { return 0; } + +private: + void Read() { + RAPIDJSON_ASSERT(fp_ != 0); + int c = fgetc(fp_); + if (c != EOF) { + current_ = (char)c; + count_++; + } + else + current_ = '\0'; + } + + FILE* fp_; + char current_; + size_t count_; +}; + +} // namespace rapidjson + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/include/rapidjson/rapidjson/internal/pow10.h b/include/rapidjson/rapidjson/internal/pow10.h new file mode 100644 index 00000000..bf3a9afb --- /dev/null +++ b/include/rapidjson/rapidjson/internal/pow10.h @@ -0,0 +1,54 @@ +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +namespace rapidjson { +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n positive/negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-308...1e308: 617 * 8 bytes = 4936 bytes + 1e-308,1e-307,1e-306,1e-305,1e-304,1e-303,1e-302,1e-301,1e-300, + 1e-299,1e-298,1e-297,1e-296,1e-295,1e-294,1e-293,1e-292,1e-291,1e-290,1e-289,1e-288,1e-287,1e-286,1e-285,1e-284,1e-283,1e-282,1e-281,1e-280, + 1e-279,1e-278,1e-277,1e-276,1e-275,1e-274,1e-273,1e-272,1e-271,1e-270,1e-269,1e-268,1e-267,1e-266,1e-265,1e-264,1e-263,1e-262,1e-261,1e-260, + 1e-259,1e-258,1e-257,1e-256,1e-255,1e-254,1e-253,1e-252,1e-251,1e-250,1e-249,1e-248,1e-247,1e-246,1e-245,1e-244,1e-243,1e-242,1e-241,1e-240, + 1e-239,1e-238,1e-237,1e-236,1e-235,1e-234,1e-233,1e-232,1e-231,1e-230,1e-229,1e-228,1e-227,1e-226,1e-225,1e-224,1e-223,1e-222,1e-221,1e-220, + 1e-219,1e-218,1e-217,1e-216,1e-215,1e-214,1e-213,1e-212,1e-211,1e-210,1e-209,1e-208,1e-207,1e-206,1e-205,1e-204,1e-203,1e-202,1e-201,1e-200, + 1e-199,1e-198,1e-197,1e-196,1e-195,1e-194,1e-193,1e-192,1e-191,1e-190,1e-189,1e-188,1e-187,1e-186,1e-185,1e-184,1e-183,1e-182,1e-181,1e-180, + 1e-179,1e-178,1e-177,1e-176,1e-175,1e-174,1e-173,1e-172,1e-171,1e-170,1e-169,1e-168,1e-167,1e-166,1e-165,1e-164,1e-163,1e-162,1e-161,1e-160, + 1e-159,1e-158,1e-157,1e-156,1e-155,1e-154,1e-153,1e-152,1e-151,1e-150,1e-149,1e-148,1e-147,1e-146,1e-145,1e-144,1e-143,1e-142,1e-141,1e-140, + 1e-139,1e-138,1e-137,1e-136,1e-135,1e-134,1e-133,1e-132,1e-131,1e-130,1e-129,1e-128,1e-127,1e-126,1e-125,1e-124,1e-123,1e-122,1e-121,1e-120, + 1e-119,1e-118,1e-117,1e-116,1e-115,1e-114,1e-113,1e-112,1e-111,1e-110,1e-109,1e-108,1e-107,1e-106,1e-105,1e-104,1e-103,1e-102,1e-101,1e-100, + 1e-99, 1e-98, 1e-97, 1e-96, 1e-95, 1e-94, 1e-93, 1e-92, 1e-91, 1e-90, 1e-89, 1e-88, 1e-87, 1e-86, 1e-85, 1e-84, 1e-83, 1e-82, 1e-81, 1e-80, + 1e-79, 1e-78, 1e-77, 1e-76, 1e-75, 1e-74, 1e-73, 1e-72, 1e-71, 1e-70, 1e-69, 1e-68, 1e-67, 1e-66, 1e-65, 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, + 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, + 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, + 1e-19, 1e-18, 1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n <= 308); + return n < -308 ? 0.0 : e[n + 308]; +} + +} // namespace internal +} // namespace rapidjson + +#endif // RAPIDJSON_POW10_ diff --git a/include/rapidjson/rapidjson/internal/stack.h b/include/rapidjson/rapidjson/internal/stack.h new file mode 100644 index 00000000..966893b3 --- /dev/null +++ b/include/rapidjson/rapidjson/internal/stack.h @@ -0,0 +1,82 @@ +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +namespace rapidjson { +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + Stack(Allocator* allocator, size_t stack_capacity) : allocator_(allocator), own_allocator_(0), stack_(0), stack_top_(0), stack_end_(0), stack_capacity_(stack_capacity) { + RAPIDJSON_ASSERT(stack_capacity_ > 0); + if (!allocator_) + own_allocator_ = allocator_ = new Allocator(); + stack_top_ = stack_ = (char*)allocator_->Malloc(stack_capacity_); + stack_end_ = stack_ + stack_capacity_; + } + + ~Stack() { + Allocator::Free(stack_); + delete own_allocator_; // Only delete if it is owned by the stack + } + + void Clear() { /*stack_top_ = 0;*/ stack_top_ = stack_; } + + template + T* Push(size_t count = 1) { + // Expand the stack if needed + if (stack_top_ + sizeof(T) * count >= stack_end_) { + size_t new_capacity = stack_capacity_ * 2; + size_t size = GetSize(); + size_t new_size = GetSize() + sizeof(T) * count; + if (new_capacity < new_size) + new_capacity = new_size; + stack_ = (char*)allocator_->Realloc(stack_, stack_capacity_, new_capacity); + stack_capacity_ = new_capacity; + stack_top_ = stack_ + size; + stack_end_ = stack_ + stack_capacity_; + } + T* ret = (T*)stack_top_; + stack_top_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stack_top_ -= count * sizeof(T); + return (T*)stack_top_; + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return (T*)(stack_top_ - sizeof(T)); + } + + template + T* Bottom() { return (T*)stack_; } + + Allocator& GetAllocator() { return *allocator_; } + size_t GetSize() const { return stack_top_ - stack_; } + size_t GetCapacity() const { return stack_capacity_; } + +private: + Allocator* allocator_; + Allocator* own_allocator_; + char *stack_; + char *stack_top_; + char *stack_end_; + size_t stack_capacity_; +}; + +} // namespace internal +} // namespace rapidjson + +#endif // RAPIDJSON_STACK_H_ diff --git a/include/rapidjson/rapidjson/internal/strfunc.h b/include/rapidjson/rapidjson/internal/strfunc.h new file mode 100644 index 00000000..bbf444fe --- /dev/null +++ b/include/rapidjson/rapidjson/internal/strfunc.h @@ -0,0 +1,24 @@ +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +namespace rapidjson { +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + const Ch* p = s; + while (*p != '\0') + ++p; + return SizeType(p - s); +} + +} // namespace internal +} // namespace rapidjson + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/include/rapidjson/rapidjson/prettywriter.h b/include/rapidjson/rapidjson/prettywriter.h new file mode 100644 index 00000000..238ff5ff --- /dev/null +++ b/include/rapidjson/rapidjson/prettywriter.h @@ -0,0 +1,156 @@ +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +namespace rapidjson { + +//! Writer with indentation and spacing. +/*! + \tparam Stream Type of ouptut stream. + \tparam Encoding Encoding of both source strings and output. + \tparam Allocator Type of allocator for allocating memory of stack. +*/ +template, typename Allocator = MemoryPoolAllocator<> > +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param stream Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of + */ + PrettyWriter(Stream& stream, Allocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(stream, allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\t', '\n', '\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //@name Implementation of Handler. + //@{ + + PrettyWriter& Null() { PrettyPrefix(kNullType); Base::WriteNull(); return *this; } + PrettyWriter& Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); Base::WriteBool(b); return *this; } + PrettyWriter& Int(int i) { PrettyPrefix(kNumberType); Base::WriteInt(i); return *this; } + PrettyWriter& Uint(unsigned u) { PrettyPrefix(kNumberType); Base::WriteUint(u); return *this; } + PrettyWriter& Int64(int64_t i64) { PrettyPrefix(kNumberType); Base::WriteInt64(i64); return *this; } + PrettyWriter& Uint64(uint64_t u64) { PrettyPrefix(kNumberType); Base::WriteUint64(u64); return *this; } + PrettyWriter& Double(double d) { PrettyPrefix(kNumberType); Base::WriteDouble(d); return *this; } + + PrettyWriter& String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kStringType); + Base::WriteString(str, length); + return *this; + } + + PrettyWriter& StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + Base::WriteStartObject(); + return *this; + } + + PrettyWriter& EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::stream_.Put('\n'); + WriteIndent(); + } + Base::WriteEndObject(); + return *this; + } + + PrettyWriter& StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + Base::WriteStartArray(); + return *this; + } + + PrettyWriter& EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::stream_.Put('\n'); + WriteIndent(); + } + Base::WriteEndArray(); + return *this; + } + + //@} + + //! Simpler but slower overload. + PrettyWriter& String(const Ch* str) { return String(str, internal::StrLen(str)); } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::stream_.Put(','); // add comma if it is not the first element in array + Base::stream_.Put('\n'); + } + else + Base::stream_.Put('\n'); + WriteIndent(); + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::stream_.Put(','); + Base::stream_.Put('\n'); + } + else { + Base::stream_.Put(':'); + Base::stream_.Put(' '); + } + } + else + Base::stream_.Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else + RAPIDJSON_ASSERT(type == kObjectType || type == kArrayType); + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(Base::stream_, indentChar_, count); + } + + Ch indentChar_; + unsigned indentCharCount_; +}; + +} // namespace rapidjson + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/include/rapidjson/rapidjson/rapidjson.h b/include/rapidjson/rapidjson/rapidjson.h new file mode 100644 index 00000000..7acb2aa4 --- /dev/null +++ b/include/rapidjson/rapidjson/rapidjson.h @@ -0,0 +1,525 @@ +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +// Copyright (c) 2011-2012 Milo Yip (miloyip@gmail.com) +// Version 0.11 + +#include // malloc(), realloc(), free() +#include // memcpy() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +// Here defines int64_t and uint64_t types in global namespace. +// If user have their own definition, can define RAPIDJSON_NO_INT64DEFINE to disable this. +#ifndef RAPIDJSON_NO_INT64DEFINE +#ifdef _MSC_VER +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! GCC provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + RAPIDJSON_LITTLEENDIAN or RAPIDJSON_BIGENDIAN. +*/ +#ifndef RAPIDJSON_ENDIAN +#ifdef __BYTE_ORDER__ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +#else +#define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +#endif // __BYTE_ORDER__ +#else +#define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN // Assumes little endian otherwise. +#endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD + +// Enable SSE2 optimization. +//#define RAPIDJSON_SSE2 + +// Enable SSE4.2 optimization. +//#define RAPIDJSON_SSE42 + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +namespace rapidjson { +//! Use 32-bit array/string indices even for 64-bit platform, instead of using size_t. +/*! User may override the SizeType by defining RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +} // namespace rapidjson +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! By default, rapidjson uses C assert() for assertion. + User can override it by defining RAPIDJSON_ASSERT(x) macro. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +namespace rapidjson { + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \implements Allocator +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { return malloc(size); } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { (void)originalSize; return realloc(originalPtr, newSize); } + static void Free(void *ptr) { free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \implements Allocator +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = new BaseAllocator(); + AddChunk(chunk_capacity_); + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(char *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = (ChunkHeader*)buffer; + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + delete ownBaseAllocator_; + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while(chunkHead_ != 0 && chunkHead_ != (ChunkHeader *)userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + size = (size + 3) & ~3; // Force aligning size to 4 + + if (chunkHead_->size + size > chunkHead_->capacity) + AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size); + + char *buffer = (char *)(chunkHead_ + 1) + chunkHead_->size; + RAPIDJSON_ASSERT(((uintptr_t)buffer & 3) == 0); // returned buffer is aligned to 4 + chunkHead_->size += size; + + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == (char *)(chunkHead_ + 1) + chunkHead_->size - originalSize) { + size_t increment = newSize - originalSize; + increment = (increment + 3) & ~3; // Force aligning size to 4 + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + RAPIDJSON_ASSERT(((uintptr_t)originalPtr & 3) == 0); // returned buffer is aligned to 4 + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + void* newBuffer = Malloc(newSize); + RAPIDJSON_ASSERT(newBuffer != 0); // Do not handle out-of-memory explicitly. + return memcpy(newBuffer, originalPtr, originalSize); + } + + //! Frees a memory block (concept Allocator) + static void Free(void *) {} // Do nothing + +private: + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + */ + void AddChunk(size_t capacity) { + ChunkHeader* chunk = (ChunkHeader*)baseAllocator_->Malloc(sizeof(ChunkHeader) + capacity); + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + char *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. + + //! \brief Encode a Unicode codepoint to a buffer. + //! \param buffer pointer to destination buffer to store the result. It should have sufficient size of encoding one character. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + //! \returns the pointer to the next character after the encoded data. + static Ch* Encode(Ch *buffer, unsigned codepoint); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + \tparam CharType Type for storing 8-bit UTF-8 data. Default is char. + \implements Encoding +*/ +template +struct UTF8 { + typedef CharType Ch; + + static Ch* Encode(Ch *buffer, unsigned codepoint) { + if (codepoint <= 0x7F) + *buffer++ = codepoint & 0xFF; + else if (codepoint <= 0x7FF) { + *buffer++ = 0xC0 | ((codepoint >> 6) & 0xFF); + *buffer++ = 0x80 | ((codepoint & 0x3F)); + } + else if (codepoint <= 0xFFFF) { + *buffer++ = 0xE0 | ((codepoint >> 12) & 0xFF); + *buffer++ = 0x80 | ((codepoint >> 6) & 0x3F); + *buffer++ = 0x80 | (codepoint & 0x3F); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + *buffer++ = 0xF0 | ((codepoint >> 18) & 0xFF); + *buffer++ = 0x80 | ((codepoint >> 12) & 0x3F); + *buffer++ = 0x80 | ((codepoint >> 6) & 0x3F); + *buffer++ = 0x80 | (codepoint & 0x3F); + } + return buffer; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \implements Encoding +*/ +template +struct UTF16 { + typedef CharType Ch; + + static Ch* Encode(Ch* buffer, unsigned codepoint) { + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + *buffer++ = static_cast(codepoint); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + *buffer++ = static_cast((v >> 10) + 0xD800); + *buffer++ = (v & 0x3FF) + 0xDC00; + } + return buffer; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam Ch Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \implements Encoding +*/ +template +struct UTF32 { + typedef CharType Ch; + + static Ch *Encode(Ch* buffer, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + *buffer++ = codepoint; + return buffer; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put() and PutEnd(). + + For write-only stream, only need to implement Put(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + for (size_t i = 0; i < n; i++) + stream.Put(c); +} + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \implements Stream +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return src_ - head_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \implements Stream +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return src_ - head_; } + + // Write + Ch* PutBegin() { return dst_ = src_; } + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + size_t PutEnd(Ch* begin) { return dst_ - begin; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +typedef GenericInsituStringStream > InsituStringStream; + +/////////////////////////////////////////////////////////////////////////////// +// Type + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6, //!< number +}; + +} // namespace rapidjson + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/include/rapidjson/rapidjson/reader.h b/include/rapidjson/rapidjson/reader.h new file mode 100644 index 00000000..f90b9d2d --- /dev/null +++ b/include/rapidjson/rapidjson/reader.h @@ -0,0 +1,683 @@ +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +// Copyright (c) 2011 Milo Yip (miloyip@gmail.com) +// Version 0.1 + +#include "rapidjson.h" +#include "internal/pow10.h" +#include "internal/stack.h" +#include + +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4127) // conditional expression is constant +#endif + +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(msg, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + parseError_ = msg; \ + errorOffset_ = offset; \ + longjmp(jmpbuf_, 1); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +namespace rapidjson { + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +//! Combination of parseFlags +enum ParseFlag { + kParseDefaultFlags = 0, //!< Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer. + kParseInsituFlag = 1 //!< In-situ(destructive) parsing. +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. +\code +concept Handler { + typename Ch; + + void Null(); + void Bool(bool b); + void Int(int i); + void Uint(unsigned i); + void Int64(int64_t i); + void Uint64(uint64_t i); + void Double(double d); + void String(const Ch* str, SizeType length, bool copy); + void StartObject(); + void EndObject(SizeType memberCount); + void StartArray(); + void EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \implements Handler +*/ +template > +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + void Default() {} + void Null() { Default(); } + void Bool(bool) { Default(); } + void Int(int) { Default(); } + void Uint(unsigned) { Default(); } + void Int64(int64_t) { Default(); } + void Uint64(uint64_t) { Default(); } + void Double(double) { Default(); } + void String(const Ch*, SizeType, bool) { Default(); } + void StartObject() { Default(); } + void EndObject(SizeType) { Default(); } + void StartArray() { Default(); } + void EndArray(SizeType) { Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param stream A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(Stream& stream) { + Stream s = stream; // Use a local copy for optimization + while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') + s.Take(); + stream = s; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + static const char whitespace[16] = " \n\r\t"; + __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); + + for (;;) { + __m128i s = _mm_loadu_si128((const __m128i *)p); + unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r == 0) // all 16 characters are whitespace + p += 16; + else { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + if (_BitScanForward(&offset, r)) + return p + offset; +#else + if (r != 0) + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + static const char whitespaces[4][17] = { + " ", + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; + + __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); + __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); + __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); + __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); + + for (;;) { + __m128i s = _mm_loadu_si128((const __m128i *)p); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = ~_mm_movemask_epi8(x); + if (r == 0) // all 16 characters are whitespace + p += 16; + else { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + if (_BitScanForward(&offset, r)) + return p + offset; +#else + if (r != 0) + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +#endif // RAPIDJSON_SSE2 + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& stream) { + stream.src_ = const_cast(SkipWhitespace_SIMD(stream.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& stream) { + stream.src_ = SkipWhitespace_SIMD(stream.src_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam Encoding Encoding of both the stream and the parse output. + \tparam Allocator Allocator type for stack. +*/ +template > +class GenericReader { +public: + typedef typename Encoding::Ch Ch; + + //! Constructor. + /*! \param allocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseError_(0), errorOffset_(0) {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of ParseFlag. + \tparam Stream Type of input stream. + \tparam Handler Type of handler which must implement Handler concept. + \param stream Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool Parse(Stream& stream, Handler& handler) { + parseError_ = 0; + errorOffset_ = 0; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4611) // interaction between '_setjmp' and C++ object destruction is non-portable +#endif + if (setjmp(jmpbuf_)) { +#ifdef _MSC_VER +#pragma warning(pop) +#endif + stack_.Clear(); + return false; + } + + SkipWhitespace(stream); + + if (stream.Peek() == '\0') + RAPIDJSON_PARSE_ERROR("Text only contains white space(s)", stream.Tell()); + else { + switch (stream.Peek()) { + case '{': ParseObject(stream, handler); break; + case '[': ParseArray(stream, handler); break; + default: RAPIDJSON_PARSE_ERROR("Expect either an object or array at root", stream.Tell()); + } + SkipWhitespace(stream); + + if (stream.Peek() != '\0') + RAPIDJSON_PARSE_ERROR("Nothing should follow the root object or array.", stream.Tell()); + } + + return true; + } + + bool HasParseError() const { return parseError_ != 0; } + const char* GetParseError() const { return parseError_; } + size_t GetErrorOffset() const { return errorOffset_; } + +private: + // Parse object: { string : value, ... } + template + void ParseObject(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == '{'); + stream.Take(); // Skip '{' + handler.StartObject(); + SkipWhitespace(stream); + + if (stream.Peek() == '}') { + stream.Take(); + handler.EndObject(0); // empty object + return; + } + + for (SizeType memberCount = 0;;) { + if (stream.Peek() != '"') { + RAPIDJSON_PARSE_ERROR("Name of an object member must be a string", stream.Tell()); + break; + } + + ParseString(stream, handler); + SkipWhitespace(stream); + + if (stream.Take() != ':') { + RAPIDJSON_PARSE_ERROR("There must be a colon after the name of object member", stream.Tell()); + break; + } + SkipWhitespace(stream); + + ParseValue(stream, handler); + SkipWhitespace(stream); + + ++memberCount; + + switch(stream.Take()) { + case ',': SkipWhitespace(stream); break; + case '}': handler.EndObject(memberCount); return; + default: RAPIDJSON_PARSE_ERROR("Must be a comma or '}' after an object member", stream.Tell()); + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == '['); + stream.Take(); // Skip '[' + handler.StartArray(); + SkipWhitespace(stream); + + if (stream.Peek() == ']') { + stream.Take(); + handler.EndArray(0); // empty array + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(stream, handler); + ++elementCount; + SkipWhitespace(stream); + + switch (stream.Take()) { + case ',': SkipWhitespace(stream); break; + case ']': handler.EndArray(elementCount); return; + default: RAPIDJSON_PARSE_ERROR("Must be a comma or ']' after an array element.", stream.Tell()); + } + } + } + + template + void ParseNull(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == 'n'); + stream.Take(); + + if (stream.Take() == 'u' && stream.Take() == 'l' && stream.Take() == 'l') + handler.Null(); + else + RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1); + } + + template + void ParseTrue(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == 't'); + stream.Take(); + + if (stream.Take() == 'r' && stream.Take() == 'u' && stream.Take() == 'e') + handler.Bool(true); + else + RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell()); + } + + template + void ParseFalse(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == 'f'); + stream.Take(); + + if (stream.Take() == 'a' && stream.Take() == 'l' && stream.Take() == 's' && stream.Take() == 'e') + handler.Bool(false); + else + RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1); + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(Stream& stream) { + Stream s = stream; // Use a local copy for optimization + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = s.Take(); + codepoint <<= 4; + codepoint += c; + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else + RAPIDJSON_PARSE_ERROR("Incorrect hex digit after \\u escape", s.Tell() - 1); + } + stream = s; // Restore stream + return codepoint; + } + + // Parse string, handling the prefix and suffix double quotes and escaping. + template + void ParseString(Stream& stream, Handler& handler) { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const Ch escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 + + Stream s = stream; // Use a local copy for optimization + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + Ch *head; + SizeType len; + if (parseFlags & kParseInsituFlag) + head = s.PutBegin(); + else + len = 0; + +#define RAPIDJSON_PUT(x) \ + do { \ + if (parseFlags & kParseInsituFlag) \ + s.Put(x); \ + else { \ + *stack_.template Push() = x; \ + ++len; \ + } \ + } while(false) + + for (;;) { + Ch c = s.Take(); + if (c == '\\') { // Escape + Ch e = s.Take(); + if ((sizeof(Ch) == 1 ) && escape[(unsigned char)e]) + RAPIDJSON_PUT(escape[(unsigned char)e]); + else if (e == 'u') { // Unicode + unsigned codepoint = ParseHex4(s); + if (codepoint >= 0xD800 && codepoint <= 0xDBFF) { // Handle UTF-16 surrogate pair + if (s.Take() != '\\' || s.Take() != 'u') { + RAPIDJSON_PARSE_ERROR("Missing the second \\u in surrogate pair", s.Tell() - 2); + return; + } + unsigned codepoint2 = ParseHex4(s); + if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF) { + RAPIDJSON_PARSE_ERROR("The second \\u in surrogate pair is invalid", s.Tell() - 2); + return; + } + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + + Ch buffer[4]; + SizeType count = SizeType(Encoding::Encode(buffer, codepoint) - &buffer[0]); + + if (parseFlags & kParseInsituFlag) + for (SizeType i = 0; i < count; i++) + s.Put(buffer[i]); + else { + memcpy(stack_.template Push(count), buffer, count * sizeof(Ch)); + len += count; + } + } + else { + RAPIDJSON_PARSE_ERROR("Unknown escape character", stream.Tell() - 1); + return; + } + } + else if (c == '"') { // Closing double quote + if (parseFlags & kParseInsituFlag) { + size_t length = s.PutEnd(head); + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + RAPIDJSON_PUT('\0'); // null-terminate the string + handler.String(head, SizeType(length), false); + } + else { + RAPIDJSON_PUT('\0'); + handler.String(stack_.template Pop(len), len - 1, true); + } + stream = s; // restore stream + return; + } + else if (c == '\0') { + RAPIDJSON_PARSE_ERROR("lacks ending quotation before the end of string", stream.Tell() - 1); + return; + } + else if ((unsigned)c < 0x20) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + RAPIDJSON_PARSE_ERROR("Incorrect unescaped character in string", stream.Tell() - 1); + return; + } + else + RAPIDJSON_PUT(c); // Normal character, just copy + } +#undef RAPIDJSON_PUT + } + + template + void ParseNumber(Stream& stream, Handler& handler) { + Stream s = stream; // Local copy for optimization + // Parse minus + bool minus = false; + if (s.Peek() == '-') { + minus = true; + s.Take(); + } + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i; + bool try64bit = false; + if (s.Peek() == '0') { + i = 0; + s.Take(); + } + else if (s.Peek() >= '1' && s.Peek() <= '9') { + i = s.Take() - '0'; + + if (minus) + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i >= 214748364) { // 2^31 = 2147483648 + if (i != 214748364 || s.Peek() > '8') { + try64bit = true; + break; + } + } + i = i * 10 + (s.Take() - '0'); + } + else + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i >= 429496729) { // 2^32 - 1 = 4294967295 + if (i != 429496729 || s.Peek() > '5') { + try64bit = true; + break; + } + } + i = i * 10 + (s.Take() - '0'); + } + } + else { + RAPIDJSON_PARSE_ERROR("Expect a value here.", stream.Tell()); + return; + } + + // Parse 64bit int + uint64_t i64 = 0; + bool useDouble = false; + if (try64bit) { + i64 = i; + if (minus) + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i64 >= 922337203685477580uLL) // 2^63 = 9223372036854775808 + if (i64 != 922337203685477580uLL || s.Peek() > '8') { + useDouble = true; + break; + } + i64 = i64 * 10 + (s.Take() - '0'); + } + else + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i64 >= 1844674407370955161uLL) // 2^64 - 1 = 18446744073709551615 + if (i64 != 1844674407370955161uLL || s.Peek() > '5') { + useDouble = true; + break; + } + i64 = i64 * 10 + (s.Take() - '0'); + } + } + + // Force double for big integer + double d = 0.0; + if (useDouble) { + d = (double)i64; + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (d >= 1E307) { + RAPIDJSON_PARSE_ERROR("Number too big to store in double", stream.Tell()); + return; + } + d = d * 10 + (s.Take() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + if (s.Peek() == '.') { + if (!useDouble) { + d = try64bit ? (double)i64 : (double)i; + useDouble = true; + } + s.Take(); + + if (s.Peek() >= '0' && s.Peek() <= '9') { + d = d * 10 + (s.Take() - '0'); + --expFrac; + } + else { + RAPIDJSON_PARSE_ERROR("At least one digit in fraction part", stream.Tell()); + return; + } + + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (expFrac > -16) { + d = d * 10 + (s.Peek() - '0'); + --expFrac; + } + s.Take(); + } + } + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (s.Peek() == 'e' || s.Peek() == 'E') { + if (!useDouble) { + d = try64bit ? (double)i64 : (double)i; + useDouble = true; + } + s.Take(); + + bool expMinus = false; + if (s.Peek() == '+') + s.Take(); + else if (s.Peek() == '-') { + s.Take(); + expMinus = true; + } + + if (s.Peek() >= '0' && s.Peek() <= '9') { + exp = s.Take() - '0'; + while (s.Peek() >= '0' && s.Peek() <= '9') { + exp = exp * 10 + (s.Take() - '0'); + if (exp > 308) { + RAPIDJSON_PARSE_ERROR("Number too big to store in double", stream.Tell()); + return; + } + } + } + else { + RAPIDJSON_PARSE_ERROR("At least one digit in exponent", s.Tell()); + return; + } + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + if (useDouble) { + d *= internal::Pow10(exp + expFrac); + handler.Double(minus ? -d : d); + } + else { + if (try64bit) { + if (minus) + handler.Int64(-(int64_t)i64); + else + handler.Uint64(i64); + } + else { + if (minus) + handler.Int(-(int)i); + else + handler.Uint(i); + } + } + + stream = s; // restore stream + } + + // Parse any JSON value + template + void ParseValue(Stream& stream, Handler& handler) { + switch (stream.Peek()) { + case 'n': ParseNull (stream, handler); break; + case 't': ParseTrue (stream, handler); break; + case 'f': ParseFalse (stream, handler); break; + case '"': ParseString(stream, handler); break; + case '{': ParseObject(stream, handler); break; + case '[': ParseArray (stream, handler); break; + default : ParseNumber(stream, handler); + } + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + jmp_buf jmpbuf_; //!< setjmp buffer for fast exit from nested parsing function calls. + const char* parseError_; + size_t errorOffset_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader > Reader; + +} // namespace rapidjson + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/include/rapidjson/rapidjson/stringbuffer.h b/include/rapidjson/rapidjson/stringbuffer.h new file mode 100644 index 00000000..269ae107 --- /dev/null +++ b/include/rapidjson/rapidjson/stringbuffer.h @@ -0,0 +1,49 @@ +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "rapidjson.h" +#include "internal/stack.h" + +namespace rapidjson { + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \implements Stream +*/ +template +struct GenericStringBuffer { + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + + void Clear() { stack_.Clear(); } + + const char* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + size_t Size() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericStringBuffer > StringBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +} // namespace rapidjson + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/include/rapidjson/rapidjson/writer.h b/include/rapidjson/rapidjson/writer.h new file mode 100644 index 00000000..e842104c --- /dev/null +++ b/include/rapidjson/rapidjson/writer.h @@ -0,0 +1,241 @@ +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "rapidjson.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include // snprintf() or _sprintf_s() +#include // placement new + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4127) // conditional expression is constant +#endif + +namespace rapidjson { + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output stream. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam Stream Type of ouptut stream. + \tparam Encoding Encoding of both source strings and output. + \implements Handler +*/ +template, typename Allocator = MemoryPoolAllocator<> > +class Writer { +public: + typedef typename Encoding::Ch Ch; + + Writer(Stream& stream, Allocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + stream_(stream), level_stack_(allocator, levelDepth * sizeof(Level)) {} + + //@name Implementation of Handler + //@{ + Writer& Null() { Prefix(kNullType); WriteNull(); return *this; } + Writer& Bool(bool b) { Prefix(b ? kTrueType : kFalseType); WriteBool(b); return *this; } + Writer& Int(int i) { Prefix(kNumberType); WriteInt(i); return *this; } + Writer& Uint(unsigned u) { Prefix(kNumberType); WriteUint(u); return *this; } + Writer& Int64(int64_t i64) { Prefix(kNumberType); WriteInt64(i64); return *this; } + Writer& Uint64(uint64_t u64) { Prefix(kNumberType); WriteUint64(u64); return *this; } + Writer& Double(double d) { Prefix(kNumberType); WriteDouble(d); return *this; } + + Writer& String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kStringType); + WriteString(str, length); + return *this; + } + + Writer& StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + WriteStartObject(); + return *this; + } + + Writer& EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + WriteEndObject(); + return *this; + } + + Writer& StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + WriteStartArray(); + return *this; + } + + Writer& EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + WriteEndArray(); + return *this; + } + //@} + + //! Simpler but slower overload. + Writer& String(const Ch* str) { return String(str, internal::StrLen(str)); } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : inArray(inArray_), valueCount(0) {} + bool inArray; //!< true if in array, otherwise in object + size_t valueCount; //!< number of values in this level + }; + + static const size_t kDefaultLevelDepth = 32; + + void WriteNull() { + stream_.Put('n'); stream_.Put('u'); stream_.Put('l'); stream_.Put('l'); + } + + void WriteBool(bool b) { + if (b) { + stream_.Put('t'); stream_.Put('r'); stream_.Put('u'); stream_.Put('e'); + } + else { + stream_.Put('f'); stream_.Put('a'); stream_.Put('l'); stream_.Put('s'); stream_.Put('e'); + } + } + + void WriteInt(int i) { + if (i < 0) { + stream_.Put('-'); + i = -i; + } + WriteUint((unsigned)i); + } + + void WriteUint(unsigned u) { + char buffer[10]; + char *p = buffer; + do { + *p++ = (u % 10) + '0'; + u /= 10; + } while (u > 0); + + do { + --p; + stream_.Put(*p); + } while (p != buffer); + } + + void WriteInt64(int64_t i64) { + if (i64 < 0) { + stream_.Put('-'); + i64 = -i64; + } + WriteUint64((uint64_t)i64); + } + + void WriteUint64(uint64_t u64) { + char buffer[20]; + char *p = buffer; + do { + *p++ = char(u64 % 10) + '0'; + u64 /= 10; + } while (u64 > 0); + + do { + --p; + stream_.Put(*p); + } while (p != buffer); + } + + //! \todo Optimization with custom double-to-string converter. + void WriteDouble(double d) { + char buffer[100]; +#if _MSC_VER + int ret = sprintf_s(buffer, sizeof(buffer), "%0.16g", d); +#else + int ret = snprintf(buffer, sizeof(buffer), "%0.16g", d); +#endif + RAPIDJSON_ASSERT(ret >= 1); + for (int i = 0; i < ret; i++) + stream_.Put(buffer[i]); + } + + void WriteString(const Ch* str, SizeType length) { + static const char hexDigits[] = "0123456789ABCDEF"; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + stream_.Put('\"'); + for (const Ch* p = str; p != str + length; ++p) { + if ((sizeof(Ch) == 1) && escape[(unsigned char)*p]) { + stream_.Put('\\'); + stream_.Put(escape[(unsigned char)*p]); + if (escape[(unsigned char)*p] == 'u') { + stream_.Put('0'); + stream_.Put('0'); + stream_.Put(hexDigits[(*p) >> 4]); + stream_.Put(hexDigits[(*p) & 0xF]); + } + } + else + stream_.Put(*p); + } + stream_.Put('\"'); + } + + void WriteStartObject() { stream_.Put('{'); } + void WriteEndObject() { stream_.Put('}'); } + void WriteStartArray() { stream_.Put('['); } + void WriteEndArray() { stream_.Put(']'); } + + void Prefix(Type type) { + (void)type; + if (level_stack_.GetSize() != 0) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + stream_.Put(','); // add comma if it is not the first element in array + else // in object + stream_.Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else + RAPIDJSON_ASSERT(type == kObjectType || type == kArrayType); + } + + Stream& stream_; + internal::Stack level_stack_; + +private: + // Prohibit assignment for VC C4512 warning + Writer& operator=(const Writer& w); +}; + +} // namespace rapidjson + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/include/rapidjson/rapidjson_include.h b/include/rapidjson/rapidjson_include.h new file mode 100644 index 00000000..a040e20e --- /dev/null +++ b/include/rapidjson/rapidjson_include.h @@ -0,0 +1,128 @@ +#ifndef RAPIDJSON_COOLPROP_H +#define RAPIDJSON_COOLPROP_H + +// On PowerPC, we are going to use the stdint.h integer types and not let rapidjson use its own +#if defined(__powerpc__) +typedef unsigned int UINT32; +#include "stdint.h" +#define RAPIDJSON_NO_INT64DEFINE +#endif + +#include "Exceptions.h" +#include "CoolPropTools.h" + +#include "rapidjson/rapidjson.h" +#include "rapidjson/document.h" +#include "rapidjson/filestream.h" // wrapper of C stream for prettywriter as output +#include "rapidjson/prettywriter.h" // for stringify JSON +#include "rapidjson/stringbuffer.h" // for string buffer + +#include + +namespace cpjson +{ + /// A convenience function to get a double from a JSON value, including error checking + inline double get_double(rapidjson::Value &v, std::string m) + { + if (!v.HasMember(m.c_str())){ throw CoolProp::ValueError(format("Does not have member [%s]",m.c_str())); } + rapidjson::Value &el = v[m.c_str()]; + if (!el.IsNumber()){ throw CoolProp::ValueError(format("Member [%s] is not a number",m.c_str())); } + else + { + return el.GetDouble(); + } + }; + /// A convenience function to get a bool from a JSON value, including error checking + inline bool get_bool(rapidjson::Value &v, std::string m) + { + if (!v.HasMember(m.c_str())){ throw CoolProp::ValueError(format("Does not have member [%s]",m.c_str())); } + rapidjson::Value &el = v[m.c_str()]; + if (!el.IsBool()){ throw CoolProp::ValueError(format("Member [%s] is not a boolean",m.c_str())); } + else + { + return el.GetBool(); + } + }; + /// A convenience function to get a string from a JSON value, including error checking + inline std::string get_string(rapidjson::Value &v, std::string m) + { + if (!v.HasMember(m.c_str())){ throw CoolProp::ValueError(format("Does not have member [%s]",m.c_str())); } + rapidjson::Value &el = v[m.c_str()]; + if (!el.IsString()){ throw CoolProp::ValueError(format("Member [%s] is not a string",m.c_str())); } + else + { + return el.GetString(); + } + }; + + /// A convenience function to get a double array compactly + inline std::vector get_double_array(rapidjson::Value &v) + { + std::vector out; + if (!v.IsArray()) { throw CoolProp::ValueError("input is not an array"); } + for (rapidjson::Value::ValueIterator itr = v.Begin(); itr != v.End(); ++itr) + { + if (!itr->IsNumber()){throw CoolProp::ValueError("input is not a number");} + out.push_back(itr->GetDouble()); + } + return out; + }; + + /// A convenience function to get a long double array compactly + inline std::vector get_long_double_array(rapidjson::Value &v) + { + std::vector out; + if (!v.IsArray()) { throw CoolProp::ValueError("input is not an array"); } + for (rapidjson::Value::ValueIterator itr = v.Begin(); itr != v.End(); ++itr) + { + if (!itr->IsNumber()){throw CoolProp::ValueError("input is not a number");} + out.push_back(itr->GetDouble()); + } + return out; + }; + + /// A convenience function to get a string array compactly + inline std::vector get_string_array(rapidjson::Value &v) + { + std::vector out; + if (!v.IsArray()) { throw CoolProp::ValueError("input is not an array"); } + for (rapidjson::Value::ValueIterator itr = v.Begin(); itr != v.End(); ++itr) + { + out.push_back(itr->GetString()); + } + return out; + }; + + /// A convenience function to get a std::string from a JSON value + inline std::string to_string(rapidjson::Value &v) + { + rapidjson::StringBuffer buffer; + rapidjson::PrettyWriter writer(buffer); + v.Accept(writer); + return buffer.GetString(); + }; + + /// A convenience function to set a double array compactly + inline void set_double_array(const char *key, const std::vector &vec, rapidjson::Value &value, rapidjson::Document &doc) + { + rapidjson::Value _v(rapidjson::kArrayType); + for (unsigned int i = 0; i < vec.size(); ++i) + { + _v.PushBack(vec[i],doc.GetAllocator()); + } + value.AddMember(key, _v, doc.GetAllocator()); + }; + + /// A convenience function to set a double array compactly + inline void set_long_double_array(const char *key, const std::vector &vec, rapidjson::Value &value, rapidjson::Document &doc) + { + rapidjson::Value _v(rapidjson::kArrayType); + for (unsigned int i = 0; i < vec.size(); ++i) + { + _v.PushBack(static_cast(vec[i]), doc.GetAllocator()); + } + value.AddMember(key, _v, doc.GetAllocator()); + }; + +} +#endif diff --git a/nightly_build.py b/nightly_build.py new file mode 100644 index 00000000..11c53da6 --- /dev/null +++ b/nightly_build.py @@ -0,0 +1,60 @@ +""" +A script for making nightly builds. + +Uses whatever the default python distro is on the building computer + +To Use: + - SSH key should be uploaded to SF servers and key managed by pageant on building computer + - Add a shortcut to the .ppk private key file to the Startup folder in windows so that pageant will be started and key loaded at logon - you will be asked for password when you log in + - Windows Task should be setup in the task scheduler that will run python.exe with argument nightly_build.py in the source folder + +Change ibell to your sourceforge name below +""" + +def make_temp_folder(): + while True: + try: + os.mkdir('dist_tmp') + break + except WindowsError: + pass + +def delete_temp_folder(): + if os.path.exists('dist_tmp'): + shutil.rmtree('dist_tmp') + +def delete_py_build_folder(): + if os.path.exists(os.path.join('wrappers','Python','build')): + shutil.rmtree(os.path.join('wrappers','Python','build')) + +import subprocess, os, shutil, glob + +for compiler in ['msvc','mingw32']: + delete_temp_folder() + delete_py_build_folder() + make_temp_folder() + + if compiler == 'msvc': + compiler_string = [] + elif compiler == 'mingw32': + compiler_string = ['--compiler=mingw32'] + else: + raise ValueError + + call_str = ['python','setup.py','build']+compiler_string+['bdist_msi','--dist-dir=../../dist_tmp'] + print 'Calling: '+' '.join(call_str) + print subprocess.check_output(call_str,cwd=os.path.join('wrappers','Python')) + + fpath = glob.glob('dist_tmp/*.msi')[0] + fName = fpath.split(os.sep,1)[1] + old_name = fpath + if compiler == 'mingw32': + root, ext = fName.rsplit('.', 1) + # Upload the MINGW32 version with a different name (with '-MINGW32' appended) + fName = root + '-mingw32.' + ext + + call_str = ['pscp',old_name,'ibell,coolprop@frs.sf.net:/home/pfs/project/c/co/coolprop/CoolProp/Nightly/'+fName] + print 'Calling: '+' '.join(call_str) + print subprocess.check_output(call_str) + + delete_temp_folder() \ No newline at end of file diff --git a/src/AbstractState.cpp b/src/AbstractState.cpp new file mode 100644 index 00000000..ef0dc38b --- /dev/null +++ b/src/AbstractState.cpp @@ -0,0 +1,310 @@ +/* + * AbstractState.cpp + * + * Created on: 21 Dec 2013 + * Author: jowr + */ + +#include "math.h" +#include "AbstractState.h" +#include "Backends\REFPROPBackend.h" +#include "Backends\HelmholtzEOSBackend.h" +#include "Backends\IncompressibleBackend.h" +#include "Fluids\FluidLibrary.h" + +namespace CoolProp { + +AbstractState * AbstractState::factory(const std::string &backend, const std::string &fluid_string) +{ + static std::string HEOS_string = "HEOS"; + if (!backend.compare("HEOS")) + { + if (fluid_string.find('&') == -1){ + return new HelmholtzEOSBackend(&get_fluid(fluid_string)); + } + else{ + // Split at the '&' + std::vector components = strsplit(fluid_string,'&'); + + return new HelmholtzEOSMixtureBackend(components); + } + } + else if (!backend.compare("REFPROP")) + { + if (fluid_string.find('&') == -1){ + return new REFPROPBackend(fluid_string); + } + else{ + // Split at the '&' + std::vector components = strsplit(fluid_string,'&'); + + return new REFPROPMixtureBackend(components); + } + } + else if (!backend.compare("INCOMP")) + { + return new IncompressibleBackend(fluid_string); + } + else if (!backend.compare("BRINE")) + { + throw ValueError("BRINE backend not yet implemented"); + } + else if (!backend.compare("TREND")) + { + throw ValueError("TREND backend not yet implemented"); + } + else if (!backend.compare("?")) + { + std::size_t idel = fluid_string.find("::"); + // Backend has not been specified, and we have to figure out what the backend is by parsing the string + if (idel == -1) // No '::' found, no backend specified, try HEOS, otherwise a failure + { + // Figure out what backend to use + return factory(HEOS_string, fluid_string); + } + else + { + // Split string at the '::' into two std::string, call again + return factory(std::string(fluid_string.begin(), fluid_string.begin() + idel), std::string(fluid_string.begin()+idel+2, fluid_string.end())); + } + + } + else + { + throw ValueError(format("Invalid backend name [%s] to factory function",backend.c_str())); + } +} + +bool AbstractState::clear() { + // Reset all instances of CachedElement and overwrite + // the internal double values with -_HUGE + this->_fluid_type = FLUID_TYPE_UNDEFINED; + this->_phase = iphase_unknown; + this->_forceSinglePhase = false; + this->_forceTwoPhase = false; + this->_R = _HUGE; + + /// Ancillary curve values + this->_rhoLanc.clear(); + this->_rhoVanc.clear(); + this->_pVanc.clear(); + this->_pLanc.clear(); + this->_TVanc.clear(); + this->_TLanc.clear(); + + this->_critical.T = -_HUGE; + this->_critical.hmolar = -_HUGE; + this->_critical.p = -_HUGE; + this->_critical.rhomolar = -_HUGE; + this->_critical.smolar = -_HUGE; + + this->_reducing.T = -_HUGE; + this->_reducing.hmolar = -_HUGE; + this->_reducing.p = -_HUGE; + this->_reducing.rhomolar = -_HUGE; + this->_reducing.smolar = -_HUGE; + + /// Bulk values + this->_rhomolar = -_HUGE; + this->_T = -_HUGE; + this->_p = -_HUGE; + this->_Q = -_HUGE; + this->_tau.clear(); + this->_delta.clear(); + + this->_umolar.clear(); + this->_cpmolar.clear(); + this->_cvmolar.clear(); + this->_speed_sound.clear(); + this->_hmolar.clear(); + this->_smolar.clear(); + this->_logp.clear(); + this->_logrhomolar.clear(); + + ///// Smoothing values + //this->rhospline = -_HUGE; + //this->dsplinedp = -_HUGE; + //this->dsplinedh = -_HUGE; + + /// Cached low-level elements for in-place calculation of other properties + this->_alpha0.clear(); + this->_dalpha0_dTau.clear(); + this->_dalpha0_dDelta.clear(); + this->_d2alpha0_dTau2.clear(); + this->_d2alpha0_dDelta_dTau.clear(); + this->_d2alpha0_dDelta2.clear(); + this->_d3alpha0_dTau3.clear(); + this->_d3alpha0_dDelta_dTau2.clear(); + this->_d3alpha0_dDelta2_dTau.clear(); + this->_d3alpha0_dDelta3.clear(); + this->_alphar.clear(); + this->_dalphar_dTau.clear(); + this->_dalphar_dDelta.clear(); + this->_d2alphar_dTau2.clear(); + this->_d2alphar_dDelta_dTau.clear(); + this->_d2alphar_dDelta2.clear(); + this->_d3alphar_dTau3.clear(); + this->_d3alphar_dDelta_dTau2.clear(); + this->_d3alphar_dDelta2_dTau.clear(); + this->_d3alphar_dDelta3.clear(); + + this->_dalphar_dDelta_lim.clear(); + this->_d2alphar_dDelta2_lim.clear(); + this->_d2alphar_dDelta_dTau_lim.clear(); + this->_d3alphar_dDelta2_dTau_lim.clear(); + + return true; +} + +double AbstractState::keyed_output(int key) +{ + switch (key) + { + case iQ: + return Q(); + case iT: + return T(); + case iP: + return p(); + case iDmolar: + return rhomolar(); + case iDmass: + return rhomolar()*molar_mass(); + case iHmolar: + return hmolar(); + case iHmass: + return hmolar()/molar_mass(); + case iSmolar: + return smolar(); + case iSmass: + return smolar()/molar_mass(); + case iUmolar: + return umolar(); + case iUmass: + return umolar()/molar_mass(); + case imolar_mass: + return molar_mass(); + case iT_reducing: + return get_reducing().T; + case irhomolar_reducing: + return get_reducing().rhomolar; + //case iT_critical: + // return get_critical().T; + //case irhomolar_critical: + // return get_critical().rhomolar; // TODO + case ialpha0: + return alpha0(); + case idalpha0_ddelta_consttau: + return dalpha0_dDelta(); + case idalpha0_dtau_constdelta: + return dalpha0_dTau(); + case iBvirial: + return Bvirial(); + case idBvirial_dT: + return dBvirial_dT(); + case iCvirial: + return Cvirial(); + case idCvirial_dT: + return dCvirial_dT(); + case iisothermal_compressibility: + return isothermal_compressibility(); + default: + throw ValueError(format("This input [%d: \"%s\"] is not valid for keyed_output",key,get_parameter_information(key,"short").c_str())); + } +} + +double AbstractState::tau(void){ + if (!_tau) _tau = calc_reciprocal_reduced_temperature(); + return _tau; +} +double AbstractState::delta(void){ + if (!_delta) _delta = calc_reduced_density(); + return _delta; +} +double AbstractState::Tmax(void){ + return calc_Tmax(); +} +double AbstractState::Ttriple(void){ + return calc_Ttriple(); +} +double AbstractState::pmax(void){ + return calc_pmax(); +} + +double AbstractState::hmolar(void){ + if (!_hmolar) _hmolar = calc_hmolar(); + return _hmolar; +} +double AbstractState::smolar(void){ + if (!_smolar) _smolar = calc_smolar(); + return _smolar; +} +double AbstractState::umolar(void){ + if (!_umolar) _umolar = calc_umolar(); + return _umolar; +} +double AbstractState::cpmolar(void){ + if (!_cpmolar) _cpmolar = calc_cpmolar(); + return _cpmolar; +} +double AbstractState::cvmolar(void){ + if (!_cvmolar) _cvmolar = calc_cvmolar(); + return _cvmolar; +} +double AbstractState::speed_sound(void){ + if (!_speed_sound) _speed_sound = calc_speed_sound(); + return _speed_sound; +} +double AbstractState::viscosity(void){ + if (!_viscosity) _viscosity = calc_viscosity(); + return _viscosity; +} +double AbstractState::conductivity(void){ + if (!_conductivity) _conductivity = calc_conductivity(); + return _conductivity; +} +double AbstractState::surface_tension(void){ + if (!_surface_tension) _surface_tension = calc_surface_tension(); + return _surface_tension; +} +double AbstractState::molar_mass(void){ + if (!_molar_mass) _molar_mass = calc_molar_mass(); + return _molar_mass; +} +double AbstractState::gas_constant(void){ + if (!_gas_constant) _gas_constant = calc_gas_constant(); + return _gas_constant; +} +double AbstractState::fugacity_coefficient(int i){ + // TODO: Cache the fug. coeff for each component + return calc_fugacity_coefficient(i); +} +double AbstractState::isothermal_compressibility(void){ + return 1.0/_rhomolar*first_partial_deriv(iDmolar, iP, iT); +} +double AbstractState::isobaric_expansion_coefficient(void){ + return -1.0/pow(_rhomolar,2)*first_partial_deriv(iDmolar, iT, iP); +} +double AbstractState::Bvirial(void){ return calc_Bvirial(); } +double AbstractState::Cvirial(void){ return calc_Cvirial(); } +double AbstractState::dBvirial_dT(void){ return calc_dBvirial_dT(); } +double AbstractState::dCvirial_dT(void){ return calc_dCvirial_dT(); } + +// // ---------------------------------------- +// // Smoothing functions for density +// // ---------------------------------------- +// /// A smoothed version of the derivative using a spline curve in the region of x=0 to x=xend +// virtual double AbstractState::drhodh_constp_smoothed(double xend); +// /// A smoothed version of the derivative using a spline curve in the region of x=0 to x=xend +// virtual double AbstractState::drhodp_consth_smoothed(double xend); +// /// Density corresponding to the smoothed derivatives in the region of x=0 to x=xend +// virtual void AbstractState::rho_smoothed(double xend, double *rho_spline, double *dsplinedh, double *dsplinedp); +// +// +// // ---------------------------------------- +// // Transport properties // TODO: Fix it! +// // ---------------------------------------- +// +// virtual double AbstractState::surface_tension(void); + +} /* namespace CoolProp */ diff --git a/src/Backends/ExcessHEFunction.cpp b/src/Backends/ExcessHEFunction.cpp new file mode 100644 index 00000000..efce1cd1 --- /dev/null +++ b/src/Backends/ExcessHEFunction.cpp @@ -0,0 +1,376 @@ +#include "ExcessHEFunction.h" +#include "mixture_excess_term_JSON.h" + +namespace CoolProp{ + +static MixtureExcessHELibrary mixtureexcesslibrary; + +MixtureExcessHELibrary::MixtureExcessHELibrary() +{ + rapidjson::Document dd; + + dd.Parse<0>(mixture_excess_term_JSON.c_str()); + if (dd.HasParseError()){throw ValueError();} + + // Iterate over the papers in the listing + for (rapidjson::Value::ValueIterator itr = dd.Begin(); itr != dd.End(); ++itr) + { + // Iterate over the coeffs in the entry + rapidjson::Value &Coeffs = (*itr)["Coeffs"]; + std::string model = cpjson::get_string(*itr, "Model"); + std::string BibTeX = cpjson::get_string(*itr, "BibTeX"); + for (rapidjson::Value::ValueIterator itr_coeff = Coeffs.Begin(); itr_coeff != Coeffs.End(); ++itr_coeff) + { + std::vector CAS1V, Name1V, CAS2V, Name2V; + + if ((itr_coeff->HasMember("Name1") && (*itr_coeff)["Name1"].IsString()) + && (itr_coeff->HasMember("Name2") && (*itr_coeff)["Name2"].IsString()) + && (itr_coeff->HasMember("CAS1") && (*itr_coeff)["CAS1"].IsString()) + && (itr_coeff->HasMember("CAS2") && (*itr_coeff)["CAS2"].IsString())) + { + // Turn the strings into one-element vectors + CAS1V = std::vector(1,cpjson::get_string(*itr_coeff,"CAS1")); + Name1V = std::vector(1,cpjson::get_string(*itr_coeff,"Name1")); + CAS2V = std::vector(1,cpjson::get_string(*itr_coeff,"CAS2")); + Name2V = std::vector(1,cpjson::get_string(*itr_coeff,"Name2")); + } + else + { + CAS1V = cpjson::get_string_array((*itr_coeff)["CAS1"]); + Name1V = cpjson::get_string_array((*itr_coeff)["Name1"]); + CAS2V = cpjson::get_string_array((*itr_coeff)["CAS2"]); + Name2V = cpjson::get_string_array((*itr_coeff)["Name2"]); + } + + for (unsigned int i = 0; i < CAS1V.size(); ++i) + { + // Get the vector of CAS numbers + std::vector CAS; + CAS.resize(2); + CAS[0] = CAS1V[i]; + CAS[1] = CAS2V[i]; + + // Sort the CAS number vector + std::sort(CAS.begin(), CAS.end()); + + // Get the empty dictionary to be filled by the appropriate reducing parameter filling function + Dictionary d; + + // Populate the dictionary with common terms + d.add_string("model", model); + d.add_string("name1", Name1V[i]); + d.add_string("name2", Name2V[i]); + d.add_string("bibtex", BibTeX); + + if (!model.compare("Kunz-JCED-2012")) + { + parse_Kunz_JCED_2012(d, *itr_coeff, i); + } + else if (!model.compare("Lemmon-JPCRD-2004")) + { + parse_Lemmon_JPCRD_2004(d, *itr_coeff); + } + else if (!model.compare("Lemmon-JPCRD-2000")) + { + parse_Lemmon_JPCRD_2000(d, *itr_coeff); + } + else + { + throw ValueError(); + } + + // If not in map, add new entry to map with dictionary + if (excess_map.find(CAS) == excess_map.end()) + { + // One-element vector of the dictionary + std::vector vd(1, d); + // Pair for adding to map + std::pair, std::vector > p(CAS, vd); + // Add + excess_map.insert(p); + } + else // If already in map, add entry to the end of the vector + { + // Append dictionary to listing + excess_map[CAS].push_back(d); + } + } + } + } +} + +void ExcessTerm::construct(const std::vector &components) +{ + std::string _model; + N = components.size(); + + F.resize(N, std::vector(N, 0)); + DepartureFunctionMatrix.resize(N, std::vector(N, NULL)); + + for (unsigned int i = 0; i < N; ++i) + { + for (unsigned int j = 0; j < N; ++j) + { + if (i == j){ continue; } + + std::string CAS1 = components[i]->CAS; + std::vector CAS(2,""); + CAS[0] = components[i]->CAS; + CAS[1] = components[j]->CAS; + std::sort(CAS.begin(), CAS.end()); + + std::vector & vd = mixtureexcesslibrary.excess_map[CAS]; + if (vd.size() != 1) { throw NotImplementedError(); } + // Get a reference to the dictionary itself to save a few dereferences + Dictionary &dic = vd[0]; + + std::string model = dic.get_string("model"); + + if (!model.compare("Kunz-JCED-2012")) + { + F[i][j] = dic.get_number("F"); + + std::vector n = dic.get_double_vector("n"); + std::vector d = dic.get_double_vector("d"); + std::vector t = dic.get_double_vector("t"); + // Terms for the gaussian + std::vector eta = dic.get_double_vector("eta"); + std::vector epsilon = dic.get_double_vector("epsilon"); + std::vector beta = dic.get_double_vector("beta"); + std::vector gamma = dic.get_double_vector("gamma"); + int Npower = static_cast(dic.get_number("Npower")); + DepartureFunctionMatrix[i][j] = new GERG2008DepartureFunction(n,d,t,eta,epsilon,beta,gamma,Npower); + } + else if (!model.compare("Lemmon-JPCRD-2004") || !model.compare("Lemmon-JPCRD-2000")) + { + throw NotImplementedError(); + } + else + { + throw ValueError(); + } + } + } +} + +ExcessTerm::~ExcessTerm() +{ + std::size_t N = DepartureFunctionMatrix.size(); + if (DepartureFunctionMatrix.empty()){return;} + for (unsigned int i = 0; i < N; i++) + { + for (unsigned int j = 0; j < N; j++) + { + delete DepartureFunctionMatrix[i][j]; // It is safe to delete NULL + DepartureFunctionMatrix[i][j] = NULL; + } + } + DepartureFunctionMatrix.clear(); +} +double ExcessTerm::alphar(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->alphar(tau,delta); + } + } + return summer; +} +double ExcessTerm::dalphar_dTau(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->dalphar_dTau(tau,delta); + } + } + return summer; +} +double ExcessTerm::dalphar_dDelta(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->dalphar_dDelta(tau,delta); + } + } + return summer; +} +double ExcessTerm::d2alphar_dDelta2(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->d2alphar_dDelta2(tau,delta); + } + } + return summer; +} +double ExcessTerm::d2alphar_dTau2(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->d2alphar_dTau2(tau,delta); + } + } + return summer; +} +double ExcessTerm::d2alphar_dDelta_dTau(double tau, double delta, const std::vector &x) +{ + double summer = 0; + for (unsigned int i = 0; i < N-1; i++) + { + for (unsigned int j = i + 1; j < N; j++) + { + summer += x[i]*x[j]*F[i][j]*DepartureFunctionMatrix[i][j]->d2alphar_dDelta_dTau(tau,delta); + } + } + return summer; +} +double ExcessTerm::dalphar_dxi(double tau, double delta, const std::vector &x, unsigned int i) +{ + double summer = 0; + for (unsigned int k = 0; k < N; k++) + { + if (i != k) + { + summer += x[k]*F[i][k]*DepartureFunctionMatrix[i][k]->alphar(tau,delta); + } + } + return summer; +} +double ExcessTerm::d2alphardxidxj(double tau, double delta, const std::vector &x, unsigned int i, unsigned int j) +{ + if (i != j) + { + return F[i][j]*DepartureFunctionMatrix[i][j]->alphar(tau,delta); + } + else + { + return 0; + } +} +double ExcessTerm::d2alphar_dxi_dTau(double tau, double delta, const std::vector &x, unsigned int i) +{ + double summer = 0; + for (unsigned int k = 0; k < N; k++) + { + if (i != k) + { + summer += x[k]*F[i][k]*DepartureFunctionMatrix[i][k]->dalphar_dTau(tau,delta); + } + } + return summer; +} +double ExcessTerm::d2alphar_dxi_dDelta(double tau, double delta, const std::vector &x, unsigned int i) +{ + double summer = 0; + for (unsigned int k = 0; k < N; k++) + { + if (i != k) + { + summer += x[k]*F[i][k]*DepartureFunctionMatrix[i][k]->dalphar_dDelta(tau,delta); + } + } + return summer; +} + +GERG2008DepartureFunction::GERG2008DepartureFunction(const std::vector &n,const std::vector &d,const std::vector &t, + const std::vector &eta,const std::vector &epsilon,const std::vector &beta, + const std::vector &gamma, int Npower) +{ + + /// Break up into power and gaussian terms + { + std::vector _n(n.begin(), n.begin()+Npower); + std::vector _d(d.begin(), d.begin()+Npower); + std::vector _t(t.begin(), t.begin()+Npower); + std::vector _l(Npower, 0.0); + phi1 = ResidualHelmholtzPower(_n, _d, _t, _l); + } + if (n.size() == Npower) + { + using_gaussian = false; + } + else + { + using_gaussian = true; + std::vector _n(n.begin()+Npower, n.end()); + std::vector _d(d.begin()+Npower, d.end()); + std::vector _t(t.begin()+Npower, t.end()); + std::vector _eta(eta.begin()+Npower, eta.end()); + std::vector _epsilon(epsilon.begin()+Npower, epsilon.end()); + std::vector _beta(beta.begin()+Npower, beta.end()); + std::vector _gamma(gamma.begin()+Npower, gamma.end()); + phi2 = ResidualHelmholtzGERG2008Gaussian(_n, _d, _t, _eta, _epsilon, _beta, _gamma); + } +} + +double GERG2008DepartureFunction::alphar(double tau, double delta) +{ + if (using_gaussian){ + return phi1.base(tau, delta) + phi2.base(tau, delta); + } + else{ + return phi1.base(tau, delta); + } +} +double GERG2008DepartureFunction::dalphar_dDelta(double tau, double delta) +{ + if (using_gaussian){ + return phi1.dDelta(tau, delta) + phi2.dDelta(tau, delta); + } + else{ + return phi1.dDelta(tau, delta); + } +} +double GERG2008DepartureFunction::d2alphar_dDelta2(double tau, double delta) +{ + if (using_gaussian){ + return phi1.dDelta2(tau, delta) + phi2.dDelta2(tau, delta); + } + else{ + return phi1.dDelta2(tau, delta); + } +} +double GERG2008DepartureFunction::d2alphar_dDelta_dTau(double tau, double delta) +{ + if (using_gaussian){ + return phi1.dDelta_dTau(tau, delta) + phi2.dDelta_dTau(tau, delta); + } + else{ + return phi1.dDelta_dTau(tau, delta); + } +} +double GERG2008DepartureFunction::dalphar_dTau(double tau, double delta) +{ + if (using_gaussian){ + return phi1.dTau(tau, delta) + phi2.dTau(tau, delta); + } + else{ + return phi1.dTau(tau, delta); + } +} +double GERG2008DepartureFunction::d2alphar_dTau2(double tau, double delta) +{ + if (using_gaussian){ + return phi1.dTau2(tau, delta) + phi2.dTau2(tau, delta); + } + else{ + return phi1.dTau2(tau, delta); + } +} + +} /* namespace CoolProp */ diff --git a/src/Backends/ExcessHEFunction.h b/src/Backends/ExcessHEFunction.h new file mode 100644 index 00000000..6f8c8b5d --- /dev/null +++ b/src/Backends/ExcessHEFunction.h @@ -0,0 +1,124 @@ +#ifndef EXCESSHE_FUNCTIONS_H +#define EXCESSHE_FUNCTIONS_H + +#include +#include "../Fluids/CoolPropFluid.h" + +namespace CoolProp{ + +typedef std::vector > STLMatrix; + +/// A container for the mixing parameters for CoolProp mixtures +/** + +*/ +class MixtureExcessHELibrary +{ +public: + /// Map from sorted pair of CAS numbers to excess term dictionary. + std::map, std::vector > excess_map; + MixtureExcessHELibrary(); + + /// Parse a term from GERG 2008 + void parse_Kunz_JCED_2012(Dictionary &d, rapidjson::Value &val, int i) + { + assert(val.HasMember("F")); + if (val["F"].IsDouble()) + { + d.add_number("F",val["F"].GetDouble()); + } + else + { + std::vector F = cpjson::get_double_array(val["F"]); + assert(static_cast(i) < F.size()); + d.add_number("F", F[i]); + } + d.add_number("Npower", cpjson::get_double(val,"Npower")); + + // Terms for the power + d.add_double_vector("n", cpjson::get_double_array(val["n"])); + d.add_double_vector("d", cpjson::get_double_array(val["d"])); + d.add_double_vector("t", cpjson::get_double_array(val["t"])); + // Terms for the gaussian + d.add_double_vector("eta", cpjson::get_double_array(val["eta"])); + d.add_double_vector("epsilon", cpjson::get_double_array(val["epsilon"])); + d.add_double_vector("beta", cpjson::get_double_array(val["beta"])); + d.add_double_vector("gamma", cpjson::get_double_array(val["gamma"])); + + }; + + /// Parse a term from HFC mixtures + void parse_Lemmon_JPCRD_2004(Dictionary &d, rapidjson::Value &val) + { + }; + + /// Parse a term from Air + void parse_Lemmon_JPCRD_2000(Dictionary &d, rapidjson::Value &val) + { + }; +}; + +/*! +The abstract base class for departure functions for the excess part of the Helmholtz energy +*/ +class DepartureFunction +{ +public: + DepartureFunction(){}; + virtual ~DepartureFunction(){}; + + /// The excess Helmholtz energy of the binary pair + /// Pure-virtual function (must be implemented in derived class + virtual double alphar(double tau, double delta) = 0; + virtual double dalphar_dDelta(double tau, double delta) = 0; + virtual double d2alphar_dDelta2(double tau, double delta) = 0; + virtual double d2alphar_dDelta_dTau(double tau, double delta) = 0; + virtual double dalphar_dTau(double tau, double delta) = 0; + virtual double d2alphar_dTau2(double tau, double delta) = 0; +}; + +class ExcessTerm +{ +public: + unsigned int N; + std::vector > DepartureFunctionMatrix; + std::vector > F; + + ExcessTerm(){}; + void construct(const std::vector &components); + ~ExcessTerm(); + + double alphar(double tau, double delta, const std::vector &x); + double dalphar_dDelta(double tau, double delta, const std::vector &x); + double d2alphar_dDelta2(double tau, double delta, const std::vector &x); + double d2alphar_dDelta_dTau(double tau, double delta, const std::vector &x); + double dalphar_dTau(double tau, double delta, const std::vector &x); + double d2alphar_dTau2(double tau, double delta, const std::vector &x); + double dalphar_dxi(double tau, double delta, const std::vector &x, unsigned int i); + double d2alphardxidxj(double tau, double delta, const std::vector &x, unsigned int i, unsigned int j); + double d2alphar_dxi_dTau(double tau, double delta, const std::vector &x, unsigned int i); + double d2alphar_dxi_dDelta(double tau, double delta, const std::vector &x, unsigned int i); +}; + +class GERG2008DepartureFunction : public DepartureFunction +{ +protected: + bool using_gaussian; + ResidualHelmholtzPower phi1; + ResidualHelmholtzGERG2008Gaussian phi2; +public: + GERG2008DepartureFunction(){}; + GERG2008DepartureFunction(const std::vector &n,const std::vector &d,const std::vector &t, + const std::vector &eta,const std::vector &epsilon,const std::vector &beta, + const std::vector &gamma, int Npower); + ~GERG2008DepartureFunction(){}; + double alphar(double tau, double delta); + double dalphar_dDelta(double tau, double delta); + double d2alphar_dDelta_dTau(double tau, double delta); + double dalphar_dTau(double tau, double delta); + double d2alphar_dDelta2(double tau, double delta); + double d2alphar_dTau2(double tau, double delta); +}; + +} /* namespace CoolProp */ +#endif \ No newline at end of file diff --git a/src/Backends/FlashRoutines.cpp b/src/Backends/FlashRoutines.cpp new file mode 100644 index 00000000..e1e5318b --- /dev/null +++ b/src/Backends/FlashRoutines.cpp @@ -0,0 +1,377 @@ +#include "VLERoutines.h" +#include "FlashRoutines.h" +#include "HelmholtzEOSMixtureBackend.h" + +namespace CoolProp{ + +void FlashRoutines::PT_flash(HelmholtzEOSMixtureBackend &HEOS) +{ + // Find the phase, while updating all internal variables possible + HEOS.T_phase_determination_pure_or_pseudopure(iP, HEOS._p); + + if (!HEOS.isHomogeneousPhase()) + { + throw ValueError("twophase not implemented yet"); + } + else + { + // Find density + HEOS._rhomolar = HEOS.solver_rho_Tp(HEOS._T, HEOS._p); + } +} + +void FlashRoutines::QT_flash(HelmholtzEOSMixtureBackend &HEOS) +{ + if (HEOS.is_pure_or_pseudopure) + { + if (!(HEOS.components[0]->pEOS->pseudo_pure)) + { + // Set some imput options + SaturationSolvers::saturation_T_pure_options options; + options.omega = 1.0; + options.use_guesses = false; + // Actually call the solver + SaturationSolvers::saturation_T_pure(&HEOS, HEOS._T, options); + // Load the outputs + HEOS._p = HEOS._Q*HEOS.SatV->p() + (1- HEOS._Q)*HEOS.SatL->p(); + HEOS._rhomolar = 1/(HEOS._Q/HEOS.SatV->rhomolar() + (1 - HEOS._Q)/HEOS.SatL->rhomolar()); + } + else{ + // Pseudo-pure fluid + long double rhoLanc, rhoVanc, rhoLsat, rhoVsat; + long double psatLanc = HEOS.components[0]->ancillaries.pL.evaluate(HEOS._T); // These ancillaries are used explicitly + long double psatVanc = HEOS.components[0]->ancillaries.pV.evaluate(HEOS._T); // These ancillaries are used explicitly + try{ + rhoLanc = HEOS.components[0]->ancillaries.rhoL.evaluate(HEOS._T); + rhoVanc = HEOS.components[0]->ancillaries.rhoV.evaluate(HEOS._T); + + if (!ValidNumber(rhoLanc) || !ValidNumber(rhoVanc)) + { + throw ValueError("pseudo-pure failed"); + } + + rhoLsat = HEOS.solver_rho_Tp(HEOS._T, psatLanc, rhoLanc); + rhoVsat = HEOS.solver_rho_Tp(HEOS._T, psatVanc, rhoLanc); + if (!ValidNumber(rhoLsat) || !ValidNumber(rhoVsat) || + fabs(rhoLsat/rhoLanc-1) > 0.1 || fabs(rhoVanc/rhoVsat-1) > 0.1) + { + throw ValueError("pseudo-pure failed"); + } + } + catch (std::exception &){ + // Near the critical point, the behavior is not very nice, so we will just use the ancillary near the critical point + rhoLsat = rhoLanc; + rhoVsat = rhoVanc; + } + HEOS._p = HEOS._Q*psatVanc + (1-HEOS._Q)*psatLanc; + HEOS._rhomolar = 1/(HEOS._Q/rhoVsat + (1-HEOS._Q)/rhoLsat); + } + } + else + { + // Set some imput options + SaturationSolvers::mixture_VLE_IO options; + options.sstype = SaturationSolvers::imposed_T; + options.Nstep_max = 5; + + // Get an extremely rough guess by interpolation of ln(p) v. T curve where the limits are mole-fraction-weighted + long double pguess = SaturationSolvers::saturation_preconditioner(&HEOS, HEOS._T, SaturationSolvers::imposed_T, HEOS.mole_fractions); + + // Use Wilson iteration to obtain updated guess for pressure + pguess = SaturationSolvers::saturation_Wilson(&HEOS, HEOS._Q, HEOS._T, SaturationSolvers::imposed_T, HEOS.mole_fractions, pguess); + + // Actually call the successive substitution solver + SaturationSolvers::successive_substitution(&HEOS, HEOS._Q, HEOS._T, pguess, HEOS.mole_fractions, HEOS.K, options); + } +} +void FlashRoutines::PQ_flash(HelmholtzEOSMixtureBackend &HEOS) +{ + if (HEOS.is_pure_or_pseudopure) + { + double pc = HEOS.components[0]->pEOS->reduce.p; + double Tc = HEOS.components[0]->pEOS->reduce.T; + double Tt = HEOS.components[0]->pEOS->Ttriple; + double pt = HEOS.components[0]->pEOS->ptriple; + double Tsat_guess = 1/(1/Tc-(1/Tt-1/Tc)/log(pc/pt)*log(HEOS._p/pc)); + + if (HEOS.components[0]->pEOS->pseudo_pure){ + // It is a psedo-pure mixture + throw NotImplementedError("PQ_flash not implemented for pseudo-pure fluids"); + } + else{ + // It is a pure fluid + + // Set some imput options + SaturationSolvers::saturation_PHSU_pure_options options; + // Specified variable is pressure + options.specified_variable = SaturationSolvers::saturation_PHSU_pure_options::IMPOSED_PV; + // Use logarithm of delta as independent variables + options.use_logdelta = false; + // Actually call the solver + SaturationSolvers::saturation_PHSU_pure(&HEOS, HEOS._p, options); + + // Load the outputs + HEOS._p = HEOS._Q*HEOS.SatV->p() + (1 - HEOS._Q)*HEOS.SatL->p(); + HEOS._rhomolar = 1/(HEOS._Q/HEOS.SatV->rhomolar() + (1 - HEOS._Q)/HEOS.SatL->rhomolar()); + HEOS._T = HEOS.SatL->T(); + } + } + else + { + // Set some imput options + SaturationSolvers::mixture_VLE_IO io; + io.sstype = SaturationSolvers::imposed_p; + io.Nstep_max = 20; + + // Get an extremely rough guess by interpolation of ln(p) v. T curve where the limits are mole-fraction-weighted + long double Tguess = SaturationSolvers::saturation_preconditioner(&HEOS, HEOS._p, SaturationSolvers::imposed_p, HEOS.mole_fractions); + + // Use Wilson iteration to obtain updated guess for temperature + Tguess = SaturationSolvers::saturation_Wilson(&HEOS, HEOS._Q, HEOS._p, SaturationSolvers::imposed_p, HEOS.mole_fractions, Tguess); + + // Actually call the successive substitution solver + SaturationSolvers::successive_substitution(&HEOS, HEOS._Q, Tguess, HEOS._p, HEOS.mole_fractions, HEOS.K, io); + + PhaseEnvelope::PhaseEnvelope_GV ENV_GV; + ENV_GV.build(&HEOS, HEOS.mole_fractions, HEOS.K, io); + } +} +// D given and one of P,H,S,U +void FlashRoutines::PHSU_D_flash(HelmholtzEOSMixtureBackend &HEOS, int other) +{ + // Define the residual to be driven to zero + class solver_resid : public FuncWrapper1D + { + public: + + HelmholtzEOSMixtureBackend *HEOS; + long double r, eos, rhomolar, value, T; + int other; + + solver_resid(HelmholtzEOSMixtureBackend *HEOS, long double rhomolar, long double value, int other) : HEOS(HEOS), rhomolar(rhomolar), value(value), other(other){}; + double call(double T){ + this->T = T; + switch(other) + { + case iP: + eos = HEOS->calc_pressure_nocache(T, rhomolar); break; + case iSmolar: + eos = HEOS->calc_smolar_nocache(T, rhomolar); break; + case iHmolar: + eos = HEOS->calc_hmolar_nocache(T, rhomolar); break; + case iUmolar: + eos = HEOS->calc_umolar_nocache(T, rhomolar); break; + default: + throw ValueError(format("Input not supported")); + } + + r = eos - value; + return r; + }; + }; + + std::string errstring; + + if (HEOS.imposed_phase_index > -1) + { + // Use the phase defined by the imposed phase + HEOS._phase = HEOS.imposed_phase_index; + } + else + { + if (HEOS.is_pure_or_pseudopure) + { + CoolPropFluid * component = HEOS.components[0]; + HelmholtzEOSMixtureBackend *Sat; + long double rhoLtriple = component->pEOS->rhoLtriple; + long double rhoVtriple = component->pEOS->rhoVtriple; + // Check if in the "normal" region + if (HEOS._rhomolar >= rhoVtriple && HEOS._rhomolar <= rhoLtriple) + { + long double yL, yV, value, y_solid; + long double TLtriple = component->pEOS->Ttriple; //TODO: separate TL and TV for ppure + long double TVtriple = component->pEOS->Ttriple; //TODO: separate TL and TV for ppure + + // First check if solid (below the line connecting the triple point values) - this is an error for now + switch (other) + { + case iSmolar: + yL = HEOS.calc_smolar_nocache(TLtriple, rhoLtriple); yV = HEOS.calc_smolar_nocache(TVtriple, rhoVtriple); value = HEOS._smolar; break; + case iHmolar: + yL = HEOS.calc_hmolar_nocache(TLtriple, rhoLtriple); yV = HEOS.calc_hmolar_nocache(TVtriple, rhoVtriple); value = HEOS._hmolar; break; + case iUmolar: + yL = HEOS.calc_umolar_nocache(TLtriple, rhoLtriple); yV = HEOS.calc_umolar_nocache(TVtriple, rhoVtriple); value = HEOS._umolar; break; + case iP: + yL = HEOS.calc_pressure_nocache(TLtriple, rhoLtriple); yV = HEOS.calc_pressure_nocache(TVtriple, rhoVtriple); value = HEOS._p; break; + default: + throw ValueError(format("Input is invalid")); + } + y_solid = (yV-yL)/(1/rhoVtriple-1/rhoLtriple)*(1/HEOS._rhomolar-1/rhoLtriple) + yL; + + if (value < y_solid){ throw ValueError(format("Other input [%d:%g] is solid", other, value));} + + // Check if other is above the saturation value. + SaturationSolvers::saturation_D_pure_options options; + options.omega = 1; + options.use_logdelta = false; + if (HEOS._rhomolar > HEOS._crit.rhomolar) + { + options.imposed_rho = SaturationSolvers::saturation_D_pure_options::IMPOSED_RHOL; + SaturationSolvers::saturation_D_pure(&HEOS, HEOS._rhomolar, options); + // SatL and SatV have the saturation values + Sat = HEOS.SatL; + } + else + { + options.imposed_rho = SaturationSolvers::saturation_D_pure_options::IMPOSED_RHOV; + SaturationSolvers::saturation_D_pure(&HEOS, HEOS._rhomolar, options); + // SatL and SatV have the saturation values + Sat = HEOS.SatV; + } + + // If it is above, it is not two-phase and either liquid, vapor or supercritical + if (value > Sat->keyed_output(other)) + { + solver_resid resid(&HEOS, HEOS._rhomolar, value, other); + + HEOS._T = Brent(resid, Sat->keyed_output(iT), HEOS.Tmax(), DBL_EPSILON, 1e-12, 100, errstring); + HEOS._Q = 10000; + HEOS.calc_pressure(); + } + else + { + throw NotImplementedError("Two-phase for PHSU_D_flash not supported yet"); + } + + } + // Check if vapor/solid region below triple point vapor density + else if (HEOS._rhomolar < component->pEOS->rhoVtriple) + { + long double y, value; + long double TVtriple = component->pEOS->Ttriple; //TODO: separate TL and TV for ppure + + // If value is above the value calculated from X(Ttriple, _rhomolar), it is vapor + switch (other) + { + case iSmolar: + y = HEOS.calc_smolar_nocache(TVtriple, HEOS._rhomolar); value = HEOS._smolar; break; + case iHmolar: + y = HEOS.calc_hmolar_nocache(TVtriple, HEOS._rhomolar); value = HEOS._hmolar; break; + case iUmolar: + y = HEOS.calc_umolar_nocache(TVtriple, HEOS._rhomolar); value = HEOS._umolar; break; + case iP: + y = HEOS.calc_pressure_nocache(TVtriple, HEOS._rhomolar); value = HEOS._p; break; + default: + throw ValueError(format("Input is invalid")); + } + if (value > y) + { + solver_resid resid(&HEOS, HEOS._rhomolar, value, other); + + HEOS._T = Brent(resid, TVtriple, HEOS.Tmax(), DBL_EPSILON, 1e-12, 100, errstring); + HEOS._Q = 10000; + HEOS.calc_pressure(); + } + else + { + throw ValueError(format("D < DLtriple")); + } + + } + // Check in the liquid/solid region above the triple point density + else + { + long double y, value; + long double TLtriple = component->pEOS->Ttriple; //TODO: separate TL and TV for ppure + + // If value is above the value calculated from X(Ttriple, _rhomolar), it is vapor + switch (other) + { + case iSmolar: + y = HEOS.calc_smolar_nocache(TLtriple, HEOS._rhomolar); value = HEOS._smolar; break; + case iHmolar: + y = HEOS.calc_hmolar_nocache(TLtriple, HEOS._rhomolar); value = HEOS._hmolar; break; + case iUmolar: + y = HEOS.calc_umolar_nocache(TLtriple, HEOS._rhomolar); value = HEOS._umolar; break; + case iP: + y = HEOS.calc_pressure_nocache(TLtriple, HEOS._rhomolar); value = HEOS._p; break; + default: + throw ValueError(format("Input is invalid")); + } + if (value > y) + { + solver_resid resid(&HEOS, HEOS._rhomolar, value, other); + + HEOS._T = Brent(resid, TLtriple, HEOS.Tmax(), DBL_EPSILON, 1e-12, 100, errstring); + HEOS._Q = 10000; + HEOS.calc_pressure(); + } + else + { + throw ValueError(format("D < DLtriple")); + } + } + } + else + throw NotImplementedError("PHSU_D_flash not ready for mixtures"); + } +} +void FlashRoutines::HSU_P_flash(HelmholtzEOSMixtureBackend &HEOS, int other) +{ + throw NotImplementedError("HSU_P_flash Not implemented yet"); +} +void FlashRoutines::DHSU_T_flash(HelmholtzEOSMixtureBackend &HEOS, int other) +{ + if (HEOS.imposed_phase_index > -1) + { + // Use the phase defined by the imposed phase + HEOS._phase = HEOS.imposed_phase_index; + } + else + { + if (HEOS.is_pure_or_pseudopure) + { + // Find the phase, while updating all internal variables possible + switch (other) + { + case iDmolar: + HEOS.T_phase_determination_pure_or_pseudopure(iDmolar, HEOS._rhomolar); break; + case iSmolar: + HEOS.T_phase_determination_pure_or_pseudopure(iSmolar, HEOS._smolar); break; + case iHmolar: + HEOS.T_phase_determination_pure_or_pseudopure(iHmolar, HEOS._hmolar); break; + case iUmolar: + HEOS.T_phase_determination_pure_or_pseudopure(iUmolar, HEOS._umolar); break; + default: + throw ValueError(format("Input is invalid")); + } + } + else + { + HEOS._phase = iphase_gas; + throw NotImplementedError("DHSU_T_flash does not support mixtures (yet)"); + // Find the phase, while updating all internal variables possible + } + } + + if (HEOS.isHomogeneousPhase() && !ValidNumber(HEOS._p)) + { + switch (other) + { + case iDmolar: + break; + case iHmolar: + HEOS._rhomolar = HEOS.solver_for_rho_given_T_oneof_HSU(HEOS._T, HEOS._hmolar, iHmolar); break; + case iSmolar: + HEOS._rhomolar = HEOS.solver_for_rho_given_T_oneof_HSU(HEOS._T, HEOS._smolar, iSmolar); break; + case iUmolar: + HEOS._rhomolar = HEOS.solver_for_rho_given_T_oneof_HSU(HEOS._T, HEOS._umolar, iUmolar); break; + default: + break; + } + HEOS.calc_pressure(); + HEOS._Q = -1; + } +} + +} /* namespace CoolProp */ \ No newline at end of file diff --git a/src/Backends/FlashRoutines.h b/src/Backends/FlashRoutines.h new file mode 100644 index 00000000..e3eb06fc --- /dev/null +++ b/src/Backends/FlashRoutines.h @@ -0,0 +1,45 @@ +/** +This file contains flash routines in which the state is unknown, +and a solver of some kind must be used to obtain temperature and +density, the two state variables upon which the equation of +state is based. +*/ + +// *************************************************************** +// ******************* FLASH ROUTINES ************************** +// *************************************************************** + +#ifndef FLASHROUTINES_H +#define FLASHROUTINES_H + +#include "HelmholtzEOSMixtureBackend.h" + +namespace CoolProp{ + +class FlashRoutines{ +public: + + /// Flash for given pressure and (molar) quality + static void PQ_flash(HelmholtzEOSMixtureBackend &HEOS); + + /// Flash for given temperature and (molar) quality + static void QT_flash(HelmholtzEOSMixtureBackend &HEOS); + + /// Flash for given temperature and pressure + static void PT_flash(HelmholtzEOSMixtureBackend &HEOS); + + /// A generic flash routine for the pairs (T,D), (T,H), (T,S), and (T,U). Similar analysis is needed + /// @param other The index for the other input, see CoolProp::parameters; allowed values are iDmolar, iHmolar, iSmolar, iUmolar + static void DHSU_T_flash(HelmholtzEOSMixtureBackend &HEOS, int other); + + /// A generic flash routine for the pairs (P,H), (P,S), and (P,U). Similar analysis is needed + /// @param other The index for the other input, see CoolProp::parameters; allowed values are iHmolar, iSmolar, iUmolar + static void HSU_P_flash(HelmholtzEOSMixtureBackend &HEOS, int other); + + /// A generic flash routine for the pairs (D,P), (D,H), (D,S), and (D,U). Similar analysis is needed + /// @param other The index for the other input, see CoolProp::parameters; allowed values are iP, iHmolar, iSmolar, iUmolar + static void PHSU_D_flash(HelmholtzEOSMixtureBackend &HEOS, int other); +}; + +} /* namespace CoolProp */ +#endif /* FLASHROUTINES_H */ \ No newline at end of file diff --git a/src/Backends/HelmholtzEOSBackend.cpp b/src/Backends/HelmholtzEOSBackend.cpp new file mode 100644 index 00000000..1466ea28 --- /dev/null +++ b/src/Backends/HelmholtzEOSBackend.cpp @@ -0,0 +1,19 @@ +/* + * AbstractBackend.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#else +#include +#endif + +#include + +#include "HelmholtzEOSBackend.h" diff --git a/src/Backends/HelmholtzEOSBackend.h b/src/Backends/HelmholtzEOSBackend.h new file mode 100644 index 00000000..1e4b85b2 --- /dev/null +++ b/src/Backends/HelmholtzEOSBackend.h @@ -0,0 +1,24 @@ +/* + * AbstractBackend.h + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#ifndef HELMHOLTZEOSBACKEND_H_ +#define HELMHOLTZEOSBACKEND_H_ + +#include +#include "HelmholtzEOSMixtureBackend.h" + +namespace CoolProp { + +class HelmholtzEOSBackend : public HelmholtzEOSMixtureBackend { +public: + HelmholtzEOSBackend(); + HelmholtzEOSBackend(CoolPropFluid *pFluid){set_components(std::vector(1,pFluid));}; + virtual ~HelmholtzEOSBackend(){}; +}; + +} /* namespace CoolProp */ +#endif /* HELMHOLTZEOSBACKEND_H_ */ diff --git a/src/Backends/HelmholtzEOSMixtureBackend.cpp b/src/Backends/HelmholtzEOSMixtureBackend.cpp new file mode 100644 index 00000000..ff18a310 --- /dev/null +++ b/src/Backends/HelmholtzEOSMixtureBackend.cpp @@ -0,0 +1,1803 @@ +/* + * AbstractBackend.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#else +#include +#endif + +#include +//#include "CoolProp.h" + +#include "HelmholtzEOSMixtureBackend.h" +#include "../Fluids/FluidLibrary.h" +#include "Solvers.h" +#include "MatrixMath.h" +#include "VLERoutines.h" +#include "FlashRoutines.h" + +namespace CoolProp { + +HelmholtzEOSMixtureBackend::HelmholtzEOSMixtureBackend(std::vector &component_names, bool generate_SatL_and_SatV) { + std::vector components; + components.resize(component_names.size()); + + for (unsigned int i = 0; i < components.size(); ++i) + { + components[i] = &(get_library().get(component_names[i])); + } + + /// Set the components and associated flags + set_components(components, generate_SatL_and_SatV); +} +HelmholtzEOSMixtureBackend::HelmholtzEOSMixtureBackend(std::vector components, bool generate_SatL_and_SatV) { + + /// Set the components and associated flags + set_components(components, generate_SatL_and_SatV); +} +void HelmholtzEOSMixtureBackend::set_components(std::vector components, bool generate_SatL_and_SatV) { + + // Copy the components + this->components = components; + + if (components.size() == 1){ + is_pure_or_pseudopure = true; + mole_fractions = std::vector(1, 1); + } + else{ + is_pure_or_pseudopure = false; + } + + // Set the excess Helmholtz energy if a mixture + if (!is_pure_or_pseudopure) + { + // Set the reducing model + set_reducing_function(); + set_excess_term(); + } + + imposed_phase_index = -1; + + // Top-level class can hold copies of the base saturation classes, + // saturation classes cannot hold copies of the saturation classes + if (generate_SatL_and_SatV) + { + SatL = new HelmholtzEOSMixtureBackend(components, false); + SatL->specify_phase(iphase_liquid); + SatV = new HelmholtzEOSMixtureBackend(components, false); + SatV->specify_phase(iphase_gas); + } + else + { + SatL = NULL; SatV = NULL; + } +} +void HelmholtzEOSMixtureBackend::set_mole_fractions(const std::vector &mole_fractions) +{ + if (mole_fractions.size() != components.size()) + { + throw ValueError(format("size of mole fraction vector [%d] does not equal that of component vector [%d]",mole_fractions.size(), components.size())); + } + this->mole_fractions = mole_fractions; + this->K.resize(mole_fractions.size()); + this->lnK.resize(mole_fractions.size()); +}; +void HelmholtzEOSMixtureBackend::set_reducing_function() +{ + Reducing.set(ReducingFunction::factory(components)); +} +void HelmholtzEOSMixtureBackend::set_excess_term() +{ + Excess.construct(components); +} +long double HelmholtzEOSMixtureBackend::calc_gas_constant(void) +{ + double summer = 0; + for (unsigned int i = 0; i < components.size(); ++i) + { + summer += mole_fractions[i]*components[i]->gas_constant(); + } + return summer; +} +long double HelmholtzEOSMixtureBackend::calc_molar_mass(void) +{ + double summer = 0; + for (unsigned int i = 0; i < components.size(); ++i) + { + summer += mole_fractions[i]*components[i]->molar_mass(); + } + return summer; +} +long double HelmholtzEOSMixtureBackend::calc_surface_tension(void) +{ + if (is_pure_or_pseudopure) + { + return components[0]->ancillaries.surface_tension.evaluate(_T); + } + else + { + throw NotImplementedError(format("surface tension not implemented for mixtures")); + } +} +long double HelmholtzEOSMixtureBackend::calc_Ttriple(void) +{ + double summer = 0; + for (unsigned int i = 0; i < components.size(); ++i){ + summer += mole_fractions[i]*components[i]->pEOS->Ttriple; + } + return summer; +} +std::string HelmholtzEOSMixtureBackend::calc_name(void) +{ + if (components.size() != 1){ + throw ValueError(format("calc_name is only valid for pure and pseudo-pure fluids, %d components", components.size())); + } + else{ + return components[0]->name; + } +} +long double HelmholtzEOSMixtureBackend::calc_Tmax(void) +{ + double summer = 0; + for (unsigned int i = 0; i < components.size(); ++i) + { + summer += mole_fractions[i]*components[i]->pEOS->limits.Tmax; + } + return summer; +} +long double HelmholtzEOSMixtureBackend::calc_pmax(void) +{ + double summer = 0; + for (unsigned int i = 0; i < components.size(); ++i) + { + summer += mole_fractions[i]*components[i]->pEOS->limits.pmax; + } + return summer; +} + +void HelmholtzEOSMixtureBackend::update_TP_guessrho(long double T, long double p, long double rho_guess) +{ + double rho = solver_rho_Tp(T, p, rho_guess); + update(DmolarT_INPUTS, rho, T); +} + +void HelmholtzEOSMixtureBackend::mass_to_molar_inputs(long &input_pair, double &value1, double &value2) +{ + // Check if a mass based input, convert it to molar units + + switch(input_pair) + { + case DmassT_INPUTS: ///< Mass density in kg/m^3, Temperature in K + case HmassT_INPUTS: ///< Enthalpy in J/kg, Temperature in K + case SmassT_INPUTS: ///< Entropy in J/kg/K, Temperature in K + case TUmass_INPUTS: ///< Temperature in K, Internal energy in J/kg + case DmassP_INPUTS: ///< Mass density in kg/m^3, Pressure in Pa + case HmassP_INPUTS: ///< Enthalpy in J/kg, Pressure in Pa + case PSmass_INPUTS: ///< Pressure in Pa, Entropy in J/kg/K + case PUmass_INPUTS: ///< Pressure in Pa, Internal energy in J/kg + case HmassSmass_INPUTS: ///< Enthalpy in J/kg, Entropy in J/kg/K + case SmassUmass_INPUTS: ///< Entropy in J/kg/K, Internal energy in J/kg + case DmassHmass_INPUTS: ///< Mass density in kg/m^3, Enthalpy in J/kg + case DmassSmass_INPUTS: ///< Mass density in kg/m^3, Entropy in J/kg/K + case DmassUmass_INPUTS: ///< Mass density in kg/m^3, Internal energy in J/kg + { + // Set the cache value for the molar mass if it hasn't been set yet + molar_mass(); + + // Molar mass (just for compactness of the following switch) + long double mm = static_cast(_molar_mass); + + switch(input_pair) + { + case DmassT_INPUTS: input_pair = DmolarT_INPUTS; value1 /= mm; break; + case HmassT_INPUTS: input_pair = HmolarT_INPUTS; value1 *= mm; break; + case SmassT_INPUTS: input_pair = SmolarT_INPUTS; value1 *= mm; break; + case TUmass_INPUTS: input_pair = TUmolar_INPUTS; value2 *= mm; break; + case DmassP_INPUTS: input_pair = DmolarP_INPUTS; value1 /= mm; break; + case HmassP_INPUTS: input_pair = HmolarP_INPUTS; value1 *= mm; break; + case PSmass_INPUTS: input_pair = PSmolar_INPUTS; value2 *= mm; break; + case PUmass_INPUTS: input_pair = PUmolar_INPUTS; value2 *= mm; break; + case HmassSmass_INPUTS: input_pair = HmolarSmolar_INPUTS; value1 *= mm; value2 *= mm; break; + case SmassUmass_INPUTS: input_pair = SmolarUmolar_INPUTS; value1 *= mm; value2 *= mm; break; + case DmassHmass_INPUTS: input_pair = DmolarHmolar_INPUTS; value1 /= mm; value2 *= mm; break; + case DmassSmass_INPUTS: input_pair = DmolarSmolar_INPUTS; value1 /= mm; value2 *= mm; break; + case DmassUmass_INPUTS: input_pair = DmolarUmolar_INPUTS; value1 /= mm; value2 *= mm; break; + } + + } + default: + return; + } +} +void HelmholtzEOSMixtureBackend::update(long input_pair, double value1, double value2 ) +{ + clear(); + + if (is_pure_or_pseudopure == false && mole_fractions.size() == 0) { + throw ValueError("Mole fractions must be set"); + } + + mass_to_molar_inputs(input_pair, value1, value2); + + // Set the mole-fraction weighted gas constant for the mixture + // (or the pure/pseudo-pure fluid) if it hasn't been set yet + gas_constant(); + + // Reducing state + calc_reducing_state(); + + switch(input_pair) + { + case PT_INPUTS: + _p = value1; _T = value2; FlashRoutines::PT_flash(*this); break; + case DmolarT_INPUTS: + _rhomolar = value1; _T = value2; FlashRoutines::DHSU_T_flash(*this, iDmolar); break; + case SmolarT_INPUTS: + _smolar = value1; _T = value2; FlashRoutines::DHSU_T_flash(*this, iSmolar); break; + case HmolarT_INPUTS: + _hmolar = value1; _T = value2; FlashRoutines::DHSU_T_flash(*this, iHmolar); break; + case TUmolar_INPUTS: + _T = value1; _umolar = value2; FlashRoutines::DHSU_T_flash(*this, iUmolar); break; + case DmolarP_INPUTS: + _rhomolar = value1; _p = value2; FlashRoutines::PHSU_D_flash(*this, iP); break; + case DmolarHmolar_INPUTS: + _rhomolar = value1; _hmolar = value2; FlashRoutines::PHSU_D_flash(*this, iHmolar); break; + case DmolarSmolar_INPUTS: + _rhomolar = value1; _smolar = value2; FlashRoutines::PHSU_D_flash(*this, iSmolar); break; + case DmolarUmolar_INPUTS: + _rhomolar = value1; _umolar = value2; FlashRoutines::PHSU_D_flash(*this, iUmolar); break; + case HmolarP_INPUTS: + _hmolar = value1; _p = value2; FlashRoutines::HSU_P_flash(*this, iHmolar); break; + case PSmolar_INPUTS: + _p = value1; _smolar = value2; FlashRoutines::HSU_P_flash(*this, iSmolar); break; + case PUmolar_INPUTS: + _p = value1; _umolar = value2; FlashRoutines::HSU_P_flash(*this, iUmolar); break; + case QT_INPUTS: + _Q = value1; _T = value2; FlashRoutines::QT_flash(*this); break; + case PQ_INPUTS: + _p = value1; _Q = value2; FlashRoutines::PQ_flash(*this); break; + default: + throw ValueError(format("This pair of inputs [%s] is not yet supported", get_input_pair_short_desc(input_pair).c_str())); + } + // Check the values that must always be set + //if (_p < 0){ throw ValueError("p is less than zero");} + if (!ValidNumber(_p)){ throw ValueError("p is not a valid number");} + //if (_T < 0){ throw ValueError("T is less than zero");} + if (!ValidNumber(_T)){ throw ValueError("T is not a valid number");} + if (_rhomolar < 0){ throw ValueError("rhomolar is less than zero");} + if (!ValidNumber(_rhomolar)){ throw ValueError("rhomolar is not a valid number");} + if (!ValidNumber(_Q)){ throw ValueError("Q is not a valid number");} + + // Set the reduced variables + _tau = _reducing.T/_T; + _delta = _rhomolar/_reducing.rhomolar; +} + +long double HelmholtzEOSMixtureBackend::calc_Bvirial() +{ + return 1/get_reducing().rhomolar*calc_alphar_deriv_nocache(0,1,mole_fractions,_tau,1e-12); +} +long double HelmholtzEOSMixtureBackend::calc_dBvirial_dT() +{ + long double dtau_dT =-get_reducing().T/pow(_T,2); + return 1/get_reducing().rhomolar*calc_alphar_deriv_nocache(1,1,mole_fractions,_tau,1e-12)*dtau_dT; +} +long double HelmholtzEOSMixtureBackend::calc_Cvirial() +{ + return 1/pow(get_reducing().rhomolar,2)*calc_alphar_deriv_nocache(0,2,mole_fractions,_tau,1e-12); +} +long double HelmholtzEOSMixtureBackend::calc_dCvirial_dT() +{ + long double dtau_dT =-get_reducing().T/pow(_T,2); + return 1/pow(get_reducing().rhomolar,2)*calc_alphar_deriv_nocache(1,2,mole_fractions,_tau,1e-12)*dtau_dT; +} +void HelmholtzEOSMixtureBackend::p_phase_determination_pure_or_pseudopure(int other, long double value) +{ + // Check supercritical pressure + if (_p > _crit.p) + { + _Q = 1e9; + switch (other) + { + case iT: + { + if (_T > _crit.T){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_liquid; return; + } + } + case iDmolar: + { + if (_rhomolar < _crit.rhomolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_liquid; return; + } + } + case iSmolar: + { + if (_smolar.pt() > _crit.smolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_liquid; return; + } + } + case iHmolar: + { + if (_hmolar.pt() > _crit.hmolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_liquid; return; + } + } + case iUmolar: + { + if (_umolar.pt() > _crit.umolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_liquid; return; + } + } + default: + { + throw ValueError("supercritical pressure but other invalid for now"); + } + } + } + // Check between triple point pressure and psat_max + else if (_p > components[0]->pEOS->ptriple && _p < _crit.p) + { + _TLanc = components[0]->ancillaries.pL.invert(_p); + _TVanc = components[0]->ancillaries.pV.invert(_p); + + switch (other) + { + case iT: + { + long double p_vap = 0.98*static_cast(_pVanc); + long double p_liq = 1.02*static_cast(_pLanc); + + if (value < p_vap){ + this->_phase = iphase_gas; _Q = -1000; return; + } + else if (value > p_liq){ + this->_phase = iphase_liquid; _Q = 1000; return; + } + break; + } + default: + { + // Always calculate the densities using the ancillaries + _rhoVanc = components[0]->ancillaries.rhoV.evaluate(_T); + _rhoLanc = components[0]->ancillaries.rhoL.evaluate(_T); + long double rho_vap = 0.95*static_cast(_rhoVanc); + long double rho_liq = 1.05*static_cast(_rhoLanc); + switch (other) + { + case iDmolar: + { + if (value < rho_vap){ + this->_phase = iphase_gas; return; + } + else if (value > rho_liq){ + this->_phase = iphase_liquid; return; + } + break; + } + default: + { + // If it is not density, update the states + SatV->update(DmolarT_INPUTS, rho_vap, _T); + SatL->update(DmolarT_INPUTS, rho_liq, _T); + + // First we check ancillaries + switch (other) + { + case iSmolar: + { + if (value > SatV->calc_smolar()){ + this->_phase = iphase_gas; return; + } + if (value < SatL->calc_smolar()){ + this->_phase = iphase_liquid; return; + } + break; + } + case iHmolar: + { + if (value > SatV->calc_hmolar()){ + this->_phase = iphase_gas; return; + } + else if (value < SatL->calc_hmolar()){ + this->_phase = iphase_liquid; return; + } + } + case iUmolar: + { + if (value > SatV->calc_umolar()){ + this->_phase = iphase_gas; return; + } + else if (value < SatL->calc_umolar()){ + this->_phase = iphase_liquid; return; + } + break; + } + default: + throw ValueError(format("invalid input for other to T_phase_determination_pure_or_pseudopure")); + } + } + } + } + } + + // Determine Q based on the input provided + if (!is_pure_or_pseudopure){throw ValueError("possibly two-phase inputs not supported for pseudo-pure for now");} + + // Actually have to use saturation information sadly + // For the given temperature, find the saturation state + // Run the saturation routines to determine the saturation densities and pressures + HelmholtzEOSMixtureBackend HEOS(components); + SaturationSolvers::saturation_T_pure_options options; + SaturationSolvers::saturation_T_pure(&HEOS, _T, options); + + long double Q; + + if (other == iP) + { + if (value > 100*DBL_EPSILON + HEOS.SatL->p()){ + this->_phase = iphase_liquid; _Q = -1000; return; + } + else if (value < HEOS.SatV->p()-100*DBL_EPSILON){ + this->_phase = iphase_gas; _Q = 1000; return; + } + else{ + throw ValueError(format("subcrit T, funny p")); + } + } + + switch (other) + { + case iDmolar: + Q = (1/value-1/HEOS.SatL->rhomolar())/(1/HEOS.SatV->rhomolar()-1/HEOS.SatL->rhomolar()); break; + case iSmolar: + Q = (value - HEOS.SatL->smolar())/(HEOS.SatV->smolar() - HEOS.SatV->smolar()); break; + case iHmolar: + Q = (value - HEOS.SatL->hmolar())/(HEOS.SatV->hmolar() - HEOS.SatV->hmolar()); break; + case iUmolar: + Q = (value - HEOS.SatL->umolar())/(HEOS.SatV->umolar() - HEOS.SatV->umolar()); break; + default: + throw ValueError(format("bad input for other")); + } + + if (Q < -100*DBL_EPSILON){ + this->_phase = iphase_liquid; _Q = -1000; return; + } + else if (Q > 1+100*DBL_EPSILON){ + this->_phase = iphase_gas; _Q = 1000; return; + } + else{ + this->_phase = iphase_twophase; + } + _Q = Q; + // Load the outputs + _p = _Q*HEOS.SatV->p() + (1-_Q)*HEOS.SatL->p(); + _rhomolar = 1/(_Q/HEOS.SatV->rhomolar() + (1-_Q)/HEOS.SatL->rhomolar()); + return; + } + else if (_p < components[0]->pEOS->ptriple) + { + throw NotImplementedError(format("for now, we don't support p [%g Pa] below ptriple [%g Pa]",_p, components[0]->pEOS->ptriple)); + } +} +void HelmholtzEOSMixtureBackend::T_phase_determination_pure_or_pseudopure(int other, long double value) +{ + // T is known, another input P, T, H, S, U is given (all molar) + if (_T < _crit.T) + { + // Start to think about the saturation stuff + // First try to use the ancillary equations if you are far enough away + // You know how accurate the ancillary equations are thanks to using CoolProp code to refit them + switch (other) + { + case iP: + { + _pLanc = components[0]->ancillaries.pL.evaluate(_T); + _pVanc = components[0]->ancillaries.pV.evaluate(_T); + long double p_vap = 0.98*static_cast(_pVanc); + long double p_liq = 1.02*static_cast(_pLanc); + + if (value < p_vap){ + this->_phase = iphase_gas; _Q = -1000; return; + } + else if (value > p_liq){ + this->_phase = iphase_liquid; _Q = 1000; return; + } + break; + } + default: + { + // Always calculate the densities using the ancillaries + _rhoVanc = components[0]->ancillaries.rhoV.evaluate(_T); + _rhoLanc = components[0]->ancillaries.rhoL.evaluate(_T); + long double rho_vap = 0.95*static_cast(_rhoVanc); + long double rho_liq = 1.05*static_cast(_rhoLanc); + switch (other) + { + case iDmolar: + { + if (value < rho_vap){ + this->_phase = iphase_gas; return; + } + else if (value > rho_liq){ + this->_phase = iphase_liquid; return; + } + break; + } + default: + { + // If it is not density, update the states + SatV->update(DmolarT_INPUTS, rho_vap, _T); + SatL->update(DmolarT_INPUTS, rho_liq, _T); + + // First we check ancillaries + switch (other) + { + case iSmolar: + { + if (value > SatV->calc_smolar()){ + this->_phase = iphase_gas; return; + } + if (value < SatL->calc_smolar()){ + this->_phase = iphase_liquid; return; + } + break; + } + case iHmolar: + { + if (value > SatV->calc_hmolar()){ + this->_phase = iphase_gas; return; + } + else if (value < SatL->calc_hmolar()){ + this->_phase = iphase_liquid; return; + } + } + case iUmolar: + { + if (value > SatV->calc_umolar()){ + this->_phase = iphase_gas; return; + } + else if (value < SatL->calc_umolar()){ + this->_phase = iphase_liquid; return; + } + break; + } + default: + throw ValueError(format("invalid input for other to T_phase_determination_pure_or_pseudopure")); + } + } + } + } + } + + // Determine Q based on the input provided + if (!is_pure_or_pseudopure){throw ValueError("possibly two-phase inputs not supported for pseudo-pure for now");} + + // Actually have to use saturation information sadly + // For the given temperature, find the saturation state + // Run the saturation routines to determine the saturation densities and pressures + HelmholtzEOSMixtureBackend HEOS(components); + SaturationSolvers::saturation_T_pure_options options; + SaturationSolvers::saturation_T_pure(&HEOS, _T, options); + + long double Q; + + if (other == iP) + { + if (value > 100*DBL_EPSILON + HEOS.SatL->p()){ + this->_phase = iphase_liquid; _Q = -1000; return; + } + else if (value < HEOS.SatV->p()-100*DBL_EPSILON){ + this->_phase = iphase_gas; _Q = 1000; return; + } + else{ + throw ValueError(format("subcrit T, funny p")); + } + } + + switch (other) + { + case iDmolar: + Q = (1/value-1/HEOS.SatL->rhomolar())/(1/HEOS.SatV->rhomolar()-1/HEOS.SatL->rhomolar()); break; + case iSmolar: + Q = (value - HEOS.SatL->smolar())/(HEOS.SatV->smolar() - HEOS.SatV->smolar()); break; + case iHmolar: + Q = (value - HEOS.SatL->hmolar())/(HEOS.SatV->hmolar() - HEOS.SatV->hmolar()); break; + case iUmolar: + Q = (value - HEOS.SatL->umolar())/(HEOS.SatV->umolar() - HEOS.SatV->umolar()); break; + default: + throw ValueError(format("bad input for other")); + } + + if (Q < -100*DBL_EPSILON){ + this->_phase = iphase_liquid; _Q = -1000; return; + } + else if (Q > 1+100*DBL_EPSILON){ + this->_phase = iphase_gas; _Q = 1000; return; + } + else{ + this->_phase = iphase_twophase; + } + _Q = Q; + // Load the outputs + _p = _Q*HEOS.SatV->p() + (1-_Q)*HEOS.SatL->p(); + _rhomolar = 1/(_Q/HEOS.SatV->rhomolar() + (1-_Q)/HEOS.SatL->rhomolar()); + return; + } + else if (_T > _crit.T && _T > components[0]->pEOS->Ttriple) + { + _Q = 1e9; + switch (other) + { + case iP: + { + if (_p > _crit.p){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_gas; return; + } + } + case iDmolar: + { + if (_rhomolar > _crit.rhomolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_gas; return; + } + } + case iSmolar: + { + if (_smolar.pt() > _crit.smolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_gas; return; + } + } + case iHmolar: + { + if (_hmolar.pt() > _crit.hmolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_gas; return; + } + } + case iUmolar: + { + if (_umolar.pt() > _crit.umolar){ + this->_phase = iphase_supercritical; return; + } + else{ + this->_phase = iphase_gas; return; + } + } + default: + { + throw ValueError("supercritical temp but other invalid for now"); + } + } + } + else + { + throw ValueError(format("For now, we don't support T [%g K] below Ttriple [%g K]", _T, components[0]->pEOS->Ttriple)); + } +} +//void HelmholtzEOSMixtureBackend::DmolarT_phase_determination_pure_or_pseudopure() +//{ +// if (_T < _crit.T) +// { +// // Start to think about the saturation stuff +// // First try to use the ancillary equations if you are far enough away +// // You know how accurate the ancillary equations are thanks to using CoolProp code to refit them +// if (_rhomolar < 0.95*components[0]->ancillaries.rhoV.evaluate(_T)){ +// this->_phase = iphase_gas; return; +// } +// else if (_rhomolar > 1.05*components[0]->ancillaries.rhoL.evaluate(_T)){ +// this->_phase = iphase_liquid; return; +// } +// else{ +// // Actually have to use saturation information sadly +// // For the given temperature, find the saturation state +// // Run the saturation routines to determine the saturation densities and pressures +// HelmholtzEOSMixtureBackend HEOS(components); +// SaturationSolvers::saturation_T_pure_options options; +// SaturationSolvers::saturation_T_pure(&HEOS, _T, options); +// +// long double Q = (1/_rhomolar-1/HEOS.SatL->rhomolar())/(1/HEOS.SatV->rhomolar()-1/HEOS.SatL->rhomolar()); +// if (Q < -100*DBL_EPSILON){ +// this->_phase = iphase_liquid; +// } +// else if (Q > 1+100*DBL_EPSILON){ +// this->_phase = iphase_gas; +// } +// else{ +// this->_phase = iphase_twophase; +// } +// _Q = Q; +// // Load the outputs +// _p = _Q*HEOS.SatV->p() + (1-_Q)*HEOS.SatL->p(); +// _rhomolar = 1/(_Q/HEOS.SatV->rhomolar() + (1-_Q)/HEOS.SatL->rhomolar()); +// return; +// } +// } +// // Now check the states above the critical temperature. +// +// // Calculate the pressure if it is not already cached. +// calc_pressure(); +// +// if (_T > _crit.T && _p > _crit.p){ +// this->_phase = iphase_supercritical; return; +// } +// else if (_T > _crit.T && _p < _crit.p){ +// this->_phase = iphase_gas; return; +// } +// else if (_T < _crit.T && _p > _crit.p){ +// this->_phase = iphase_liquid; return; +// } +// /*else if (p < params.ptriple){ +// return iphase_gas; +// }*/ +// else{ +// throw ValueError(format("phase cannot be determined")); +// } +//} + +//void HelmholtzEOSMixtureBackend::PT_phase_determination() +//{ +// if (_T < _crit.T) +// { +// // Start to think about the saturation stuff +// // First try to use the ancillary equations if you are far enough away +// // Ancillary equations are good to within 1% in pressure in general +// // Some industrial fluids might not be within 3% +// if (_p > 1.05*components[0]->ancillaries.pL.evaluate(_T)){ +// this->_phase = iphase_liquid; return; +// } +// else if (_p < 0.95*components[0]->ancillaries.pV.evaluate(_T)){ +// this->_phase = iphase_gas; return; +// } +// else{ +// throw NotImplementedError("potentially two phase inputs not possible yet"); +// //// Actually have to use saturation information sadly +// //// For the given temperature, find the saturation state +// //// Run the saturation routines to determine the saturation densities and pressures +// //// Use the passed in variables to save calls to the saturation routine so the values can be re-used again +// //saturation_T(T, enabled_TTSE_LUT, pL, pV, rhoL, rhoV); +// //double Q = (1/rho-1/rhoL)/(1/rhoV-1/rhoL); +// //if (Q < -100*DBL_EPSILON){ +// // this->_phase = iphase_liquid; return; +// //} +// //else if (Q > 1+100*DBL_EPSILON){ +// // this->_phase = iphase_gas; return; +// //} +// //else{ +// // this->_phase = iphase_twophase; return; +// //} +// } +// } +// // Now check the states above the critical temperature. +// if (_T > _crit.T && _p > _crit.p){ +// this->_phase = iphase_supercritical; return; +// } +// else if (_T > _crit.T && _p < _crit.p){ +// this->_phase = iphase_gas; return; +// } +// else if (_T < _crit.T && _p > _crit.p){ +// this->_phase = iphase_liquid; return; +// } +// /*else if (p < params.ptriple){ +// return iphase_gas; +// }*/ +// else{ +// throw ValueError(format("phase cannot be determined")); +// } +//} + +void get_dtau_ddelta(HelmholtzEOSMixtureBackend *HEOS, int index, long double &dtau, long double &ddelta) +{ + long double rhor = HEOS->get_reducing().rhomolar, + dT_dtau = -pow(HEOS->T(), 2)/HEOS->get_reducing().T, + R = HEOS->gas_constant(), + delta = HEOS->delta(), + tau = HEOS->tau(), + rho = HEOS->rhomolar(); + + switch (index) + { + case iT: + dtau = dT_dtau; ddelta = 0; break; + case iDmolar: + dtau = 0; ddelta = rhor; break; + case iP: + // dp/ddelta|tau + ddelta = rhor*R*HEOS->T()*(1+2*delta*HEOS->dalphar_dDelta()+pow(delta, 2)*HEOS->d2alphar_dDelta2()); + // dp/dtau|delta + dtau = dT_dtau*rho*R*(1+delta*HEOS->dalphar_dDelta()-tau*delta*HEOS->d2alphar_dDelta_dTau()); + break; + case iHmolar: + // dh/dtau|delta + dtau = dT_dtau*R*(-pow(tau,2)*(HEOS->d2alpha0_dTau2()+HEOS->d2alphar_dTau2()) + (1+delta*HEOS->dalphar_dDelta()-tau*delta*HEOS->d2alphar_dDelta_dTau())); + // dh/ddelta|tau + ddelta = rhor*HEOS->T()*R/rho*(tau*delta*HEOS->d2alphar_dDelta_dTau()+delta*HEOS->dalphar_dDelta()+pow(delta,2)*HEOS->d2alphar_dDelta2()); + break; + case iSmolar: + // ds/dtau|delta + dtau = dT_dtau*R/HEOS->T()*(-pow(tau,2)*(HEOS->d2alpha0_dTau2()+HEOS->d2alphar_dTau2())); + // ds/ddelta|tau + ddelta = rhor*R/rho*(-(1+delta*HEOS->dalphar_dDelta()-tau*delta*HEOS->d2alphar_dDelta_dTau())); + break; + case iUmolar: + // du/dtau|delta + dtau = dT_dtau*R*(-pow(tau,2)*(HEOS->d2alpha0_dTau2()+HEOS->d2alphar_dTau2())); + // du/ddelta|tau + ddelta = rhor*HEOS->T()*R/rho*(tau*delta*HEOS->d2alphar_dDelta_dTau()); + break; + case iTau: + dtau = 1; ddelta = 0; break; + case iDelta: + dtau = 0; ddelta = 1; break; + default: + throw ValueError(format("input to get_dtau_ddelta[%s] is invalid",get_parameter_information(index,"short").c_str())); + } +} +long double HelmholtzEOSMixtureBackend::calc_first_partial_deriv(int Of, int Wrt, int Constant) +{ + long double dOf_dtau, dOf_ddelta, dWrt_dtau, dWrt_ddelta, dConstant_dtau, dConstant_ddelta; + + get_dtau_ddelta(this, Of, dOf_dtau, dOf_ddelta); + get_dtau_ddelta(this, Wrt, dWrt_dtau, dWrt_ddelta); + get_dtau_ddelta(this, Constant, dConstant_dtau, dConstant_ddelta); + + return (dOf_dtau*dConstant_ddelta-dOf_ddelta*dConstant_dtau)/(dWrt_dtau*dConstant_ddelta-dWrt_ddelta*dConstant_dtau); +} + +long double HelmholtzEOSMixtureBackend::calc_pressure_nocache(long double T, long double rhomolar) +{ + SimpleState reducing = calc_reducing_state_nocache(mole_fractions); + long double delta = rhomolar/reducing.rhomolar; + long double tau = reducing.T/T; + + // Calculate derivative if needed + int nTau = 0, nDelta = 1; + long double dalphar_dDelta = calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, tau, delta); + + // Get pressure + return rhomolar*gas_constant()*T*(1+delta*dalphar_dDelta); +} +//long double HelmholtzEOSMixtureBackend::solver_for_T_given_rho_oneof_PHSU(long double T, long double value, int other, int rhomin, int rhomax) +//{ +// +//} +long double HelmholtzEOSMixtureBackend::solver_for_rho_given_T_oneof_HSU(long double T, long double value, int other) +{ + long double ymelt, yc, ymin, y; + + // Define the residual to be driven to zero + class solver_resid : public FuncWrapper1D + { + public: + int other; + long double T, value, r, eos, rhomolar; + HelmholtzEOSMixtureBackend *HEOS; + + solver_resid(HelmholtzEOSMixtureBackend *HEOS, long double T, long double value, int other){ + this->HEOS = HEOS; this->T = T; this->value = value; this->other = other; + }; + double call(double rhomolar){ + this->rhomolar = rhomolar; + switch(other) + { + case iSmolar: + eos = HEOS->calc_smolar_nocache(T,rhomolar); break; + case iHmolar: + eos = HEOS->calc_hmolar_nocache(T,rhomolar); break; + case iUmolar: + eos = HEOS->calc_umolar_nocache(T,rhomolar); break; + default: + throw ValueError(format("Input not supported")); + } + + r = eos-value; + return r; + }; + }; + solver_resid resid(this, T, value, other); + std::string errstring; + + // Supercritical temperature + if (_T > _crit.T) + { + long double rhomelt = components[0]->pEOS->rhoLtriple; + long double rhoc = components[0]->pEOS->reduce.rhomolar; + long double rhomin = 1e-10; + + switch(other) + { + + case iSmolar: + { + ymelt = calc_smolar_nocache(_T, rhomelt); + yc = calc_smolar_nocache(_T, rhoc); + ymin = calc_smolar_nocache(_T, rhomin); + y = _smolar; + break; + } + case iHmolar: + { + ymelt = calc_hmolar_nocache(_T, rhomelt); + yc = calc_hmolar_nocache(_T, rhoc); + ymin = calc_hmolar_nocache(_T, rhomin); + y = _hmolar; + break; + } + case iUmolar: + { + ymelt = calc_umolar_nocache(_T, rhomelt); + yc = calc_umolar_nocache(_T, rhoc); + ymin = calc_umolar_nocache(_T, rhomin); + y = _umolar; + break; + } + default: + throw ValueError(); + } + + if (is_in_closed_range(ymelt, yc, y)) + { + long double rhomolar = Brent(resid, rhomelt, rhoc, LDBL_EPSILON, 1e-12, 100, errstring); + return rhomolar; + } + else if (is_in_closed_range(yc, ymin, y)) + { + long double rhomolar = Brent(resid, rhoc, rhomin, LDBL_EPSILON, 1e-12, 100, errstring); + return rhomolar; + } + else + { + throw ValueError(); + } + } + // Subcritical temperature liquid + else if (_phase == iphase_liquid) + { + long double ymelt, yL, y; + long double rhomelt = components[0]->pEOS->rhoLtriple; + long double rhoL = static_cast(_rhoLanc); + + switch(other) + { + case iSmolar: + { + ymelt = calc_smolar_nocache(_T, rhomelt); yL = calc_smolar_nocache(_T, rhoL); y = _smolar; break; + } + case iHmolar: + { + ymelt = calc_hmolar_nocache(_T, rhomelt); yL = calc_hmolar_nocache(_T, rhoL); y = _hmolar; break; + } + case iUmolar: + { + ymelt = calc_umolar_nocache(_T, rhomelt); yL = calc_umolar_nocache(_T, rhoL); y = _umolar; break; + } + default: + throw ValueError(); + } + + long double rhomolar_guess = (rhomelt-rhoL)/(ymelt-yL)*(y-yL) + rhoL; + + long double rhomolar = Secant(resid, rhomolar_guess, 0.0001*rhomolar_guess, 1e-12, 100, errstring); + return rhomolar; + } + // Subcritical temperature gas + else if (_phase == iphase_gas) + { + long double rhomin = 1e-14; + long double rhoV = static_cast(_rhoVanc); + + try + { + long double rhomolar = Brent(resid, rhomin, rhoV, LDBL_EPSILON, 1e-12, 100, errstring); + return rhomolar; + } + catch(std::exception &) + { + throw ValueError(); + } + } +} +long double HelmholtzEOSMixtureBackend::solver_rho_Tp(long double T, long double p, long double rhomolar_guess) +{ + int phase; + + // Define the residual to be driven to zero + class solver_TP_resid : public FuncWrapper1D + { + public: + long double T, p, r, peos, rhomolar; + HelmholtzEOSMixtureBackend *HEOS; + + solver_TP_resid(HelmholtzEOSMixtureBackend *HEOS, long double T, long double p){ + this->HEOS = HEOS; this->T = T; this->p = p; + }; + double call(double rhomolar){ + this->rhomolar = rhomolar; + peos = HEOS->calc_pressure_nocache(T, rhomolar); + r = (peos-p)/p; + return r; + }; + }; + solver_TP_resid resid(this,T,p); + std::string errstring; + + if (imposed_phase_index > -1) + phase = imposed_phase_index; + else + phase = _phase; + if (rhomolar_guess < 0) // Not provided + { + rhomolar_guess = solver_rho_Tp_SRK(T, p, phase); + + if (phase == iphase_gas && rhomolar_guess < 0)// If the guess is bad, probably high temperature, use ideal gas + { + rhomolar_guess = p/(gas_constant()*T); + } + else + { + _rhoLanc = components[0]->ancillaries.rhoL.evaluate(T); + if (phase == iphase_liquid && rhomolar_guess < static_cast(_rhoLanc)) + { + rhomolar_guess = static_cast(_rhoLanc); + } + } + } + + try{ + double rhomolar = Secant(resid, rhomolar_guess, 0.0001*rhomolar_guess, 1e-10, 100, errstring); + return rhomolar; + } + catch(std::exception &) + { + return _HUGE; + } +} +long double HelmholtzEOSMixtureBackend::solver_rho_Tp_SRK(long double T, long double p, int phase) +{ + long double rhomolar, R_u = gas_constant(), a = 0, b = 0, k_ij = 0; + + for (std::size_t i = 0; i < components.size(); ++i) + { + long double Tci = components[i]->pEOS->reduce.T, pci = components[i]->pEOS->reduce.p, accentric_i = components[i]->pEOS->accentric; + long double m_i = 0.480+1.574*accentric_i-0.176*pow(accentric_i, 2); + long double b_i = 0.08664*R_u*Tci/pci; + b += mole_fractions[i]*b_i; + + long double a_i = 0.42747*pow(R_u*Tci,2)/pci*pow(1+m_i*(1-sqrt(T/Tci)),2); + + for (std::size_t j = 0; j < components.size(); ++j) + { + long double Tcj = components[j]->pEOS->reduce.T, pcj = components[j]->pEOS->reduce.p, accentric_j = components[j]->pEOS->accentric; + long double m_j = 0.480+1.574*accentric_j-0.176*pow(accentric_j, 2); + + long double a_j = 0.42747*pow(R_u*Tcj,2)/pcj*pow(1+m_j*(1-sqrt(T/Tcj)),2); + + if (i == j){ + k_ij = 0; + } + else{ + k_ij = 0; + } + + a += mole_fractions[i]*mole_fractions[j]*sqrt(a_i*a_j)*(1-k_ij); + } + } + + long double A = a*p/pow(R_u*T,2); + long double B = b*p/(R_u*T); + + //Solve the cubic for solutions for Z = p/(rho*R*T) + double Z0, Z1, Z2; int Nsolns; + solve_cubic(1, -1, A-B-B*B, -A*B, Nsolns, Z0, Z1, Z2); + + // Determine the guess value + if (Nsolns == 1){ + rhomolar = p/(Z0*R_u*T); + } + else{ + long double rhomolar0 = p/(Z0*R_u*T); + long double rhomolar1 = p/(Z1*R_u*T); + long double rhomolar2 = p/(Z2*R_u*T); + + // Check if only one solution is positive, return the solution if that is the case + if (rhomolar0 > 0 && rhomolar1 <= 0 && rhomolar2 <= 0){ return rhomolar0; } + if (rhomolar0 <= 0 && rhomolar1 > 0 && rhomolar2 <= 0){ return rhomolar1; } + if (rhomolar0 <= 0 && rhomolar1 <= 0 && rhomolar2 > 0){ return rhomolar2; } + + switch(phase) + { + case iphase_liquid: + rhomolar = max3(rhomolar0, rhomolar1, rhomolar2); break; + case iphase_gas: + rhomolar = min3(rhomolar0, rhomolar1, rhomolar2); break; + default: + throw ValueError("Bad phase to solver_rho_Tp_SRK"); + }; + } + return rhomolar; +} + +long double HelmholtzEOSMixtureBackend::calc_pressure(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivative if needed + long double dar_dDelta = dalphar_dDelta(); + long double R_u = gas_constant(); + + // Get pressure + _p = _rhomolar*R_u*_T*(1+_delta.pt()*dar_dDelta); + + //std::cout << format("p: %13.12f %13.12f %10.9f %10.9f %10.9f %10.9f %g\n",_T,_rhomolar,_tau,_delta,mole_fractions[0],dar_dDelta,_p); + //if (_p < 0){ + // throw ValueError("Pressure is less than zero"); + //} + + return static_cast(_p); +} +long double HelmholtzEOSMixtureBackend::calc_hmolar_nocache(long double T, long double rhomolar) +{ + // Calculate the reducing parameters + long double delta = rhomolar/_reducing.rhomolar; + long double tau = _reducing.T/T; + + // Calculate derivatives if needed, or just use cached values + // Calculate derivative if needed + long double dar_dDelta = calc_alphar_deriv_nocache(0, 1, mole_fractions, tau, delta); + long double dar_dTau = calc_alphar_deriv_nocache(1, 0, mole_fractions, tau, delta); + long double da0_dTau = calc_alpha0_deriv_nocache(1, 0, mole_fractions, tau, delta, _reducing.T, _reducing.rhomolar); + long double R_u = gas_constant(); + + // Get molar enthalpy + return R_u*T*(1 + tau*(da0_dTau+dar_dTau) + delta*dar_dDelta); +} +long double HelmholtzEOSMixtureBackend::calc_hmolar(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double da0_dTau = dalpha0_dTau(); + long double dar_dTau = dalphar_dTau(); + long double dar_dDelta = dalphar_dDelta(); + long double R_u = gas_constant(); + + // Get molar enthalpy + _hmolar = R_u*_T*(1 + _tau.pt()*(da0_dTau+dar_dTau) + _delta.pt()*dar_dDelta); + + return static_cast(_hmolar); +} +long double HelmholtzEOSMixtureBackend::calc_smolar_nocache(long double T, long double rhomolar) +{ + // Calculate the reducing parameters + long double delta = rhomolar/_reducing.rhomolar; + long double tau = _reducing.T/T; + + // Calculate derivatives if needed, or just use cached values + // Calculate derivative if needed + long double dar_dTau = calc_alphar_deriv_nocache(1, 0, mole_fractions, tau, delta); + long double ar = calc_alphar_deriv_nocache(0, 0, mole_fractions, tau, delta); + long double da0_dTau = calc_alpha0_deriv_nocache(1, 0, mole_fractions, tau, delta, _reducing.T, _reducing.rhomolar); + long double a0 = calc_alpha0_deriv_nocache(0, 0, mole_fractions, tau, delta, _reducing.T, _reducing.rhomolar); + long double R_u = gas_constant(); + + // Get molar entropy + return R_u*(tau*(da0_dTau+dar_dTau) - a0 - ar); +} +long double HelmholtzEOSMixtureBackend::calc_smolar(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double da0_dTau = dalpha0_dTau(); + long double ar = alphar(); + long double a0 = alpha0(); + long double dar_dTau = dalphar_dTau(); + long double R_u = gas_constant(); + + // Get molar entropy + _smolar = R_u*(_tau.pt()*(da0_dTau+dar_dTau) - a0 - ar); + + return static_cast(_smolar); +} +long double HelmholtzEOSMixtureBackend::calc_umolar_nocache(long double T, long double rhomolar) +{ + // Calculate the reducing parameters + long double delta = rhomolar/_reducing.rhomolar; + long double tau = _reducing.T/T; + + // Calculate derivatives + long double dar_dTau = calc_alphar_deriv_nocache(1, 0, mole_fractions, tau, delta); + long double da0_dTau = calc_alpha0_deriv_nocache(1, 0, mole_fractions, tau, delta, _reducing.T, _reducing.rhomolar); + long double R_u = gas_constant(); + + // Get molar internal energy + return R_u*T*tau*(da0_dTau+dar_dTau); +} +long double HelmholtzEOSMixtureBackend::calc_umolar(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double da0_dTau = dalpha0_dTau(); + long double dar_dTau = dalphar_dTau(); + long double R_u = gas_constant(); + + // Get molar internal energy + _umolar = R_u*_T*_tau.pt()*(da0_dTau+dar_dTau); + + return static_cast(_umolar); +} +long double HelmholtzEOSMixtureBackend::calc_cvmolar(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double d2ar_dTau2 = d2alphar_dTau2(); + long double d2a0_dTau2 = d2alpha0_dTau2(); + long double R_u = static_cast(_gas_constant); + + // Get cv + _cvmolar = -R_u*pow(_tau.pt(),2)*(d2ar_dTau2 + d2a0_dTau2); + + return static_cast(_cvmolar); +} +long double HelmholtzEOSMixtureBackend::calc_cpmolar(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double d2a0_dTau2 = d2alpha0_dTau2(); + long double dar_dDelta = dalphar_dDelta(); + long double d2ar_dDelta2 = d2alphar_dDelta2(); + long double d2ar_dDelta_dTau = d2alphar_dDelta_dTau(); + long double d2ar_dTau2 = d2alphar_dTau2(); + long double R_u = static_cast(_gas_constant); + + // Get cp + _cpmolar = R_u*(-pow(_tau.pt(),2)*(d2ar_dTau2 + d2a0_dTau2)+pow(1+_delta.pt()*dar_dDelta-_delta.pt()*_tau.pt()*d2ar_dDelta_dTau,2)/(1+2*_delta.pt()*dar_dDelta+pow(_delta.pt(),2)*d2ar_dDelta2)); + + return static_cast(_cpmolar); +} +long double HelmholtzEOSMixtureBackend::calc_speed_sound(void) +{ + // Calculate the reducing parameters + _delta = _rhomolar/_reducing.rhomolar; + _tau = _reducing.T/_T; + + // Calculate derivatives if needed, or just use cached values + long double d2a0_dTau2 = d2alpha0_dTau2(); + long double dar_dDelta = dalphar_dDelta(); + long double d2ar_dDelta2 = d2alphar_dDelta2(); + long double d2ar_dDelta_dTau = d2alphar_dDelta_dTau(); + long double d2ar_dTau2 = d2alphar_dTau2(); + long double R_u = static_cast(_gas_constant); + long double mm = static_cast(_molar_mass); + + // Get speed of sound + _speed_sound = sqrt(R_u*_T/mm*(1+2*_delta.pt()*dar_dDelta+pow(_delta.pt(),2)*d2ar_dDelta2 - pow(1+_delta.pt()*dar_dDelta-_delta.pt()*_tau.pt()*d2ar_dDelta_dTau,2)/(pow(_tau.pt(),2)*(d2ar_dTau2 + d2a0_dTau2)))); + + return static_cast(_speed_sound); +} + +long double HelmholtzEOSMixtureBackend::calc_fugacity_coefficient(int i) +{ + return exp(mixderiv_ln_fugacity_coefficient(i)); +} + +SimpleState HelmholtzEOSMixtureBackend::calc_reducing_state_nocache(const std::vector & mole_fractions) +{ + SimpleState reducing; + if (is_pure_or_pseudopure){ + reducing = components[0]->pEOS->reduce; + + } + else{ + reducing.T = Reducing.p->Tr(mole_fractions); + reducing.rhomolar = Reducing.p->rhormolar(mole_fractions); + } + return reducing; +} +void HelmholtzEOSMixtureBackend::calc_reducing_state(void) +{ + _reducing = calc_reducing_state_nocache(mole_fractions); + _crit = _reducing; +} +long double HelmholtzEOSMixtureBackend::calc_alphar_deriv_nocache(const int nTau, const int nDelta, const std::vector &mole_fractions, const long double &tau, const long double &delta) +{ + if (is_pure_or_pseudopure) + { + if (nTau == 0 && nDelta == 0){ + return components[0]->pEOS->baser(tau, delta); + } + else if (nTau == 0 && nDelta == 1){ + return components[0]->pEOS->dalphar_dDelta(tau, delta); + } + else if (nTau == 1 && nDelta == 0){ + return components[0]->pEOS->dalphar_dTau(tau, delta); + } + else if (nTau == 0 && nDelta == 2){ + return components[0]->pEOS->d2alphar_dDelta2(tau, delta); + } + else if (nTau == 1 && nDelta == 1){ + return components[0]->pEOS->d2alphar_dDelta_dTau(tau, delta); + } + else if (nTau == 2 && nDelta == 0){ + return components[0]->pEOS->d2alphar_dTau2(tau, delta); + } + else if (nTau == 0 && nDelta == 3){ + return components[0]->pEOS->d3alphar_dDelta3(tau, delta); + } + else if (nTau == 1 && nDelta == 2){ + return components[0]->pEOS->d3alphar_dDelta2_dTau(tau, delta); + } + else if (nTau == 2 && nDelta == 1){ + return components[0]->pEOS->d3alphar_dDelta_dTau2(tau, delta); + } + else if (nTau == 3 && nDelta == 0){ + return components[0]->pEOS->d3alphar_dTau3(tau, delta); + } + else + { + throw ValueError(); + } + } + else{ + + std::size_t N = mole_fractions.size(); + long double summer = 0; + if (nTau == 0 && nDelta == 0){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->baser(tau, delta); } + return summer + Excess.alphar(tau, delta, mole_fractions); + } + else if (nTau == 0 && nDelta == 1){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->dalphar_dDelta(tau, delta); } + return summer + Excess.dalphar_dDelta(tau, delta, mole_fractions); + } + else if (nTau == 1 && nDelta == 0){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->dalphar_dTau(tau, delta); } + return summer + Excess.dalphar_dTau(tau, delta, mole_fractions); + } + else if (nTau == 0 && nDelta == 2){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d2alphar_dDelta2(tau, delta); } + return summer + Excess.d2alphar_dDelta2(tau, delta, mole_fractions); + } + else if (nTau == 1 && nDelta == 1){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d2alphar_dDelta_dTau(tau, delta); } + return summer + Excess.d2alphar_dDelta_dTau(tau, delta, mole_fractions); + } + else if (nTau == 2 && nDelta == 0){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d2alphar_dTau2(tau, delta); } + return summer + Excess.d2alphar_dTau2(tau, delta, mole_fractions); + } + /*else if (nTau == 0 && nDelta == 3){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d3alphar_dDelta3(tau, delta); } + return summer + pExcess.d3alphar_dDelta3(tau, delta); + } + else if (nTau == 1 && nDelta == 2){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d3alphar_dDelta2_dTau(tau, delta); } + return summer + pExcess.d3alphar_dDelta2_dTau(tau, delta); + } + else if (nTau == 2 && nDelta == 1){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d3alphar_dDelta_dTau2(tau, delta); } + return summer + pExcess.d3alphar_dDelta_dTau2(tau, delta); + } + else if (nTau == 3 && nDelta == 0){ + for (unsigned int i = 0; i < N; ++i){ summer += mole_fractions[i]*components[i]->pEOS->d3alphar_dTau3(tau, delta); } + return summer + pExcess.d3alphar_dTau3(tau, delta); + }*/ + else + { + throw ValueError(); + } + } +} +long double HelmholtzEOSMixtureBackend::calc_alpha0_deriv_nocache(const int nTau, const int nDelta, const std::vector &mole_fractions, + const long double &tau, const long double &delta, const long double &Tr, const long double &rhor) +{ + if (is_pure_or_pseudopure) + { + if (nTau == 0 && nDelta == 0){ + return components[0]->pEOS->base0(tau, delta); + } + else if (nTau == 0 && nDelta == 1){ + return components[0]->pEOS->dalpha0_dDelta(tau, delta); + } + else if (nTau == 1 && nDelta == 0){ + return components[0]->pEOS->dalpha0_dTau(tau, delta); + } + else if (nTau == 0 && nDelta == 2){ + return components[0]->pEOS->d2alpha0_dDelta2(tau, delta); + } + else if (nTau == 1 && nDelta == 1){ + return components[0]->pEOS->d2alpha0_dDelta_dTau(tau, delta); + } + else if (nTau == 2 && nDelta == 0){ + return components[0]->pEOS->d2alpha0_dTau2(tau, delta); + } + else if (nTau == 0 && nDelta == 3){ + return components[0]->pEOS->d3alpha0_dDelta3(tau, delta); + } + else if (nTau == 1 && nDelta == 2){ + return components[0]->pEOS->d3alpha0_dDelta2_dTau(tau, delta); + } + else if (nTau == 2 && nDelta == 1){ + return components[0]->pEOS->d3alpha0_dDelta_dTau2(tau, delta); + } + else if (nTau == 3 && nDelta == 0){ + return components[0]->pEOS->d3alpha0_dTau3(tau, delta); + } + else + { + throw ValueError(); + } + } + else{ + // See Table B5, GERG 2008 from Kunz Wagner, JCED, 2012 + std::size_t N = mole_fractions.size(); + long double summer = 0; + long double tau_i, delta_i, rho_ci, T_ci; + for (unsigned int i = 0; i < N; ++i){ + rho_ci = components[i]->pEOS->reduce.rhomolar; + T_ci = components[i]->pEOS->reduce.T; + tau_i = T_ci*tau/Tr; + delta_i = delta*rhor/rho_ci; + + if (nTau == 0 && nDelta == 0){ + summer += mole_fractions[i]*(components[i]->pEOS->base0(tau_i, delta_i)+log(mole_fractions[i])); + } + else if (nTau == 0 && nDelta == 1){ + summer += mole_fractions[i]*rhor/rho_ci*components[i]->pEOS->dalpha0_dDelta(tau_i, delta_i); + } + else if (nTau == 1 && nDelta == 0){ + summer += mole_fractions[i]*T_ci/Tr*components[i]->pEOS->dalpha0_dTau(tau_i, delta_i); + } + else if (nTau == 0 && nDelta == 2){ + summer += mole_fractions[i]*pow(rhor/rho_ci,2)*components[i]->pEOS->d2alpha0_dDelta2(tau_i, delta_i); + } + else if (nTau == 1 && nDelta == 1){ + summer += mole_fractions[i]*rhor/rho_ci*T_ci/Tr*components[i]->pEOS->d2alpha0_dDelta_dTau(tau_i, delta_i); + } + else if (nTau == 2 && nDelta == 0){ + summer += mole_fractions[i]*pow(T_ci/Tr,2)*components[i]->pEOS->d2alpha0_dTau2(tau_i, delta_i); + } + else + { + throw ValueError(); + } + } + return summer; + } +} +long double HelmholtzEOSMixtureBackend::calc_alphar(void) +{ + const int nTau = 0, nDelta = 0; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} +long double HelmholtzEOSMixtureBackend::calc_dalphar_dDelta(void) +{ + const int nTau = 0, nDelta = 1; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} +long double HelmholtzEOSMixtureBackend::calc_dalphar_dTau(void) +{ + const int nTau = 1, nDelta = 0; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} +long double HelmholtzEOSMixtureBackend::calc_d2alphar_dTau2(void) +{ + const int nTau = 2, nDelta = 0; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} +long double HelmholtzEOSMixtureBackend::calc_d2alphar_dDelta_dTau(void) +{ + const int nTau = 1, nDelta = 1; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} +long double HelmholtzEOSMixtureBackend::calc_d2alphar_dDelta2(void) +{ + const int nTau = 0, nDelta = 2; + return calc_alphar_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta); +} + +long double HelmholtzEOSMixtureBackend::calc_alpha0(void) +{ + const int nTau = 0, nDelta = 0; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} +long double HelmholtzEOSMixtureBackend::calc_dalpha0_dDelta(void) +{ + const int nTau = 0, nDelta = 1; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} +long double HelmholtzEOSMixtureBackend::calc_dalpha0_dTau(void) +{ + const int nTau = 1, nDelta = 0; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} +long double HelmholtzEOSMixtureBackend::calc_d2alpha0_dDelta2(void) +{ + const int nTau = 0, nDelta = 2; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} +long double HelmholtzEOSMixtureBackend::calc_d2alpha0_dDelta_dTau(void) +{ + const int nTau = 1, nDelta = 1; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} +long double HelmholtzEOSMixtureBackend::calc_d2alpha0_dTau2(void) +{ + const int nTau = 2, nDelta = 0; + return calc_alpha0_deriv_nocache(nTau, nDelta, mole_fractions, _tau, _delta, _reducing.T, _reducing.rhomolar); +} + + +long double HelmholtzEOSMixtureBackend::mixderiv_dalphar_dxi(int i) +{ + return components[i]->pEOS->baser(_tau, _delta) + Excess.dalphar_dxi(_tau, _delta, mole_fractions, i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d2alphar_dxi_dTau(int i) +{ + return components[i]->pEOS->dalphar_dTau(_tau, _delta) + Excess.d2alphar_dxi_dTau(_tau, _delta, mole_fractions, i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d2alphar_dxi_dDelta(int i) +{ + return components[i]->pEOS->dalphar_dDelta(_tau, _delta) + Excess.d2alphar_dxi_dDelta(_tau, _delta, mole_fractions, i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d2alphardxidxj(int i, int j) +{ + return 0 + Excess.d2alphardxidxj(_tau, _delta, mole_fractions, i, j); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_ln_fugacity_coefficient(int i) +{ + return alphar() + mixderiv_ndalphar_dni__constT_V_nj(i)-log(1+_delta.pt()*dalphar_dDelta()); +} +long double HelmholtzEOSMixtureBackend::mixderiv_dln_fugacity_coefficient_dT__constrho_n(int i) +{ + double dtau_dT = -_tau.pt()/_T; //[1/K] + return (dalphar_dTau() + mixderiv_d_ndalphardni_dTau(i)-1/(1+_delta.pt()*dalphar_dDelta())*(_delta.pt()*d2alphar_dDelta_dTau()))*dtau_dT; +} +long double HelmholtzEOSMixtureBackend::mixderiv_dln_fugacity_coefficient_drho__constT_n(int i) +{ + double ddelta_drho = 1/_reducing.rhomolar; //[m^3/mol] + return (dalphar_dDelta() + mixderiv_d_ndalphardni_dDelta(i)-1/(1+_delta.pt()*dalphar_dDelta())*(_delta.pt()*d2alphar_dDelta2()+dalphar_dDelta()))*ddelta_drho; +} +long double HelmholtzEOSMixtureBackend::mixderiv_dnalphar_dni__constT_V_nj(int i) +{ + // GERG Equation 7.42 + return alphar() + mixderiv_ndalphar_dni__constT_V_nj(i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d2nalphar_dni_dT(int i) +{ + return -_tau.pt()/_T*(dalphar_dTau() + mixderiv_d_ndalphardni_dTau(i)); +} +long double HelmholtzEOSMixtureBackend::mixderiv_dln_fugacity_coefficient_dT__constp_n(int i) +{ + double T = _reducing.T/_tau.pt(); + long double R_u = static_cast(_gas_constant); + return mixderiv_d2nalphar_dni_dT(i) + 1/T-mixderiv_partial_molar_volume(i)/(R_u*T)*mixderiv_dpdT__constV_n(); +} +long double HelmholtzEOSMixtureBackend::mixderiv_partial_molar_volume(int i) +{ + return -mixderiv_ndpdni__constT_V_nj(i)/mixderiv_ndpdV__constT_n(); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_dln_fugacity_coefficient_dp__constT_n(int i) +{ + // GERG equation 7.30 + long double R_u = static_cast(_gas_constant); + double partial_molar_volume = mixderiv_partial_molar_volume(i); // [m^3/mol] + double term1 = partial_molar_volume/(R_u*_T); // m^3/mol/(N*m)*mol = m^2/N = 1/Pa + double term2 = 1.0/p(); + return term1 - term2; +} + +long double HelmholtzEOSMixtureBackend::mixderiv_dln_fugacity_coefficient_dxj__constT_p_xi(int i, int j) +{ + // Gernert 3.115 + long double R_u = static_cast(_gas_constant); + // partial molar volume is -dpdn/dpdV, so need to flip the sign here + return mixderiv_d2nalphar_dni_dxj__constT_V(i,j) - mixderiv_partial_molar_volume(i)/(R_u*_T)*mixderiv_dpdxj__constT_V_xi(j); +} +long double HelmholtzEOSMixtureBackend::mixderiv_dpdxj__constT_V_xi(int j) +{ + // Gernert 3.130 + long double R_u = static_cast(_gas_constant); + return _rhomolar*R_u*_T*(mixderiv_ddelta_dxj__constT_V_xi(j)*dalphar_dDelta()+_delta.pt()*mixderiv_d_dalpharddelta_dxj__constT_V_xi(j)); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_d_dalpharddelta_dxj__constT_V_xi(int j) +{ + // Gernert Equation 3.134 (Catch test provided) + return d2alphar_dDelta2()*mixderiv_ddelta_dxj__constT_V_xi(j) + + d2alphar_dDelta_dTau()*mixderiv_dtau_dxj__constT_V_xi(j) + + mixderiv_d2alphar_dxi_dDelta(j); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_dalphar_dxj__constT_V_xi(int j) +{ + //Gernert 3.119 (Catch test provided) + return dalphar_dDelta()*mixderiv_ddelta_dxj__constT_V_xi(j)+dalphar_dTau()*mixderiv_dtau_dxj__constT_V_xi(j)+mixderiv_dalphar_dxi(j); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d_ndalphardni_dxj__constT_V_xi(int i, int j) +{ + // Gernert 3.118 + return mixderiv_d_ndalphardni_dxj__constdelta_tau_xi(i,j) + + mixderiv_ddelta_dxj__constT_V_xi(j)*mixderiv_d_ndalphardni_dDelta(i) + + mixderiv_dtau_dxj__constT_V_xi(j)*mixderiv_d_ndalphardni_dTau(i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_ddelta_dxj__constT_V_xi(int j) +{ + // Gernert 3.121 (Catch test provided) + return -_delta.pt()/_reducing.rhomolar*Reducing.p->drhormolardxi__constxj(mole_fractions,j); +} +long double HelmholtzEOSMixtureBackend::mixderiv_dtau_dxj__constT_V_xi(int j) +{ + // Gernert 3.122 (Catch test provided) + return 1/_T*Reducing.p->dTrdxi__constxj(mole_fractions,j); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_dpdT__constV_n() +{ + long double R_u = static_cast(_gas_constant); + return _rhomolar*R_u*(1+_delta.pt()*dalphar_dDelta()-_delta.pt()*_tau.pt()*d2alphar_dDelta_dTau()); +} +long double HelmholtzEOSMixtureBackend::mixderiv_dpdrho__constT_n() +{ + long double R_u = static_cast(_gas_constant); + return R_u*_T*(1+2*_delta.pt()*dalphar_dDelta()+pow(_delta.pt(),2)*d2alphar_dDelta2()); +} +long double HelmholtzEOSMixtureBackend::mixderiv_ndpdV__constT_n() +{ + long double R_u = static_cast(_gas_constant); + return -pow(_rhomolar,2)*R_u*_T*(1+2*_delta.pt()*dalphar_dDelta()+pow(_delta.pt(),2)*d2alphar_dDelta2()); +} +long double HelmholtzEOSMixtureBackend::mixderiv_ndpdni__constT_V_nj(int i) +{ + // Eqn 7.64 and 7.63 + long double R_u = static_cast(_gas_constant); + double ndrhorbar_dni__constnj = Reducing.p->ndrhorbardni__constnj(mole_fractions,i); + double ndTr_dni__constnj = Reducing.p->ndTrdni__constnj(mole_fractions,i); + double summer = 0; + for (unsigned int k = 0; k < mole_fractions.size(); ++k) + { + summer += mole_fractions[k]*mixderiv_d2alphar_dxi_dDelta(k); + } + double nd2alphar_dni_dDelta = _delta.pt()*d2alphar_dDelta2()*(1-1/_reducing.rhomolar*ndrhorbar_dni__constnj)+_tau.pt()*d2alphar_dDelta_dTau()/_reducing.T*ndTr_dni__constnj+mixderiv_d2alphar_dxi_dDelta(i)-summer; + return _rhomolar*R_u*_T*(1+_delta.pt()*dalphar_dDelta()*(2-1/_reducing.rhomolar*ndrhorbar_dni__constnj)+_delta.pt()*nd2alphar_dni_dDelta); +} + +long double HelmholtzEOSMixtureBackend::mixderiv_ndalphar_dni__constT_V_nj(int i) +{ + double term1 = _delta.pt()*dalphar_dDelta()*(1-1/_reducing.rhomolar*Reducing.p->ndrhorbardni__constnj(mole_fractions,i)); + double term2 = _tau.pt()*dalphar_dTau()*(1/_reducing.T)*Reducing.p->ndTrdni__constnj(mole_fractions,i); + + double s = 0; + for (unsigned int k = 0; k < mole_fractions.size(); k++) + { + s += mole_fractions[k]*mixderiv_dalphar_dxi(k); + } + double term3 = mixderiv_dalphar_dxi(i); + return term1 + term2 + term3 - s; +} +long double HelmholtzEOSMixtureBackend::mixderiv_ndln_fugacity_coefficient_dnj__constT_p(int i, int j) +{ + long double R_u = static_cast(_gas_constant); + return mixderiv_nd2nalphardnidnj__constT_V(j, i) + 1 - mixderiv_partial_molar_volume(j)/(R_u*_T)*mixderiv_ndpdni__constT_V_nj(i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_nddeltadni__constT_V_nj(int i) +{ + return _delta.pt()-_delta.pt()/_reducing.rhomolar*Reducing.p->ndrhorbardni__constnj(mole_fractions, i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_ndtaudni__constT_V_nj(int i) +{ + return _tau.pt()/_reducing.T*Reducing.p->ndTrdni__constnj(mole_fractions, i); +} +long double HelmholtzEOSMixtureBackend::mixderiv_d_ndalphardni_dxj__constdelta_tau_xi(int i, int j) +{ + double line1 = _delta.pt()*mixderiv_d2alphar_dxi_dDelta(j)*(1-1/_reducing.rhomolar*Reducing.p->ndrhorbardni__constnj(mole_fractions, i)); + double line2 = -_delta.pt()*dalphar_dDelta()*(1/_reducing.rhomolar)*(Reducing.p->d_ndrhorbardni_dxj__constxi(mole_fractions, i, j)-1/_reducing.rhomolar*Reducing.p->drhormolardxi__constxj(mole_fractions,j)*Reducing.p->ndrhorbardni__constnj(mole_fractions,i)); + double line3 = _tau.pt()*mixderiv_d2alphar_dxi_dTau(j)*(1/_reducing.T)*Reducing.p->ndTrdni__constnj(mole_fractions, i); + double line4 = _tau.pt()*dalphar_dTau()*(1/_reducing.T)*(Reducing.p->d_ndTrdni_dxj__constxi(mole_fractions,i,j)-1/_reducing.T*Reducing.p->dTrdxi__constxj(mole_fractions,j)*Reducing.p->ndTrdni__constnj(mole_fractions, i)); + double s = 0; + for (unsigned int m = 0; m < mole_fractions.size(); m++) + { + s += mole_fractions[m]*mixderiv_d2alphardxidxj(j,m); + } + double line5 = mixderiv_d2alphardxidxj(i,j)-mixderiv_dalphar_dxi(j)-s; + return line1+line2+line3+line4+line5; +} +long double HelmholtzEOSMixtureBackend::mixderiv_nd2nalphardnidnj__constT_V(int i, int j) +{ + double line0 = mixderiv_ndalphar_dni__constT_V_nj(j); // First term from 7.46 + double line1 = mixderiv_d_ndalphardni_dDelta(i)*mixderiv_nddeltadni__constT_V_nj(j); + double line2 = mixderiv_d_ndalphardni_dTau(i)*mixderiv_ndtaudni__constT_V_nj(j); + double summer = 0; + for (unsigned int k = 0; k < mole_fractions.size(); k++) + { + summer += mole_fractions[k]*mixderiv_d_ndalphardni_dxj__constdelta_tau_xi(i, k); + } + double line3 = mixderiv_d_ndalphardni_dxj__constdelta_tau_xi(i, j)-summer; + return line0 + line1 + line2 + line3; +} +long double HelmholtzEOSMixtureBackend::mixderiv_d_ndalphardni_dDelta(int i) +{ + // The first line + double term1 = (_delta.pt()*d2alphar_dDelta2()+dalphar_dDelta())*(1-1/_reducing.rhomolar*Reducing.p->ndrhorbardni__constnj(mole_fractions, i)); + + // The second line + double term2 = _tau.pt()*d2alphar_dDelta_dTau()*(1/_reducing.T)*Reducing.p->ndTrdni__constnj(mole_fractions, i); + + // The third line + double term3 = mixderiv_d2alphar_dxi_dDelta(i); + for (unsigned int k = 0; k < mole_fractions.size(); k++) + { + term3 -= mole_fractions[k]*mixderiv_d2alphar_dxi_dDelta(k); + } + return term1 + term2 + term3; +} + +long double HelmholtzEOSMixtureBackend::mixderiv_d_ndalphardni_dTau(int i) +{ + // The first line + double term1 = _delta.pt()*d2alphar_dDelta_dTau()*(1-1/_reducing.rhomolar*Reducing.p->ndrhorbardni__constnj(mole_fractions, i)); + + // The second line + double term2 = (_tau.pt()*d2alphar_dTau2()+dalphar_dTau())*(1/_reducing.T)*Reducing.p->ndTrdni__constnj(mole_fractions, i); + + // The third line + double term3 = mixderiv_d2alphar_dxi_dTau(i); + for (unsigned int k = 0; k < mole_fractions.size(); k++) + { + term3 -= mole_fractions[k]*mixderiv_d2alphar_dxi_dTau(k); + } + return term1 + term2 + term3; +} + + +} /* namespace CoolProp */ diff --git a/src/Backends/HelmholtzEOSMixtureBackend.h b/src/Backends/HelmholtzEOSMixtureBackend.h new file mode 100644 index 00000000..d4a70123 --- /dev/null +++ b/src/Backends/HelmholtzEOSMixtureBackend.h @@ -0,0 +1,411 @@ + +#ifndef HELMHOLTZEOSMIXTUREBACKEND_H_ +#define HELMHOLTZEOSMIXTUREBACKEND_H_ + +#include "AbstractState.h" +#include "../Fluids/CoolPropFluid.h" +#include "ReducingFunctions.h" +#include "ExcessHEFunction.h" +#include "Solvers.h" + +#include + +namespace CoolProp { + +class FlashRoutines; + +class HelmholtzEOSMixtureBackend : public AbstractState { +protected: + std::vector components; ///< The components that are in use + + bool is_pure_or_pseudopure; ///< A flag for whether the substance is a pure or pseudo-pure fluid (true) or a mixture (false) + std::vector mole_fractions; ///< The mole fractions of the components + std::vector mole_fractions_liq, ///< The mole fractions of the saturated liquid + mole_fractions_vap, ///< The mole fractions of the saturated vapor + K, ///< The K factors for the components + lnK; ///< The natural logarithms of the K factors of the components + + SimpleState _crit; + int imposed_phase_index; +public: + HelmholtzEOSMixtureBackend(){SatL = NULL; SatV = NULL; imposed_phase_index = -1;}; + HelmholtzEOSMixtureBackend(std::vector components, bool generate_SatL_and_SatV = true); + HelmholtzEOSMixtureBackend(std::vector &component_names, bool generate_SatL_and_SatV = true); + virtual ~HelmholtzEOSMixtureBackend(){}; + ReducingFunctionContainer Reducing; + ExcessTerm Excess; + + friend class FlashRoutines; // Allows the routines in the FlashRoutines class to have access to all the protected members and methods of this class + + // Helmholtz EOS backend uses mole fractions + bool using_mole_fractions(){return true;} + + const std::vector &get_components(){return components;}; + std::vector &get_K(){return K;}; + std::vector &get_lnK(){return lnK;}; + + HelmholtzEOSMixtureBackend *SatL, *SatV; ///< + + void update(long input_pair, double value1, double value2); + + void update_TP_guessrho(long double T, long double p, long double rho_guess); + + /// Set the components of the mixture + /** + @param components The components that are to be used in this mixture + @param generate_SatL_and_SatV true if SatL and SatV classes should be added, false otherwise. Added so that saturation classes can be added without infinite recursion of adding saturation classes + */ + void set_components(std::vector components, bool generate_SatL_and_SatV = true); + + /** + \brief Specify the phase - this phase will always be used in calculations + @param phase_index The index from CoolProp::phases + */ + void specify_phase(int phase_index){imposed_phase_index = phase_index;}; + + void set_reducing_function(); + void set_excess_term(); + + /// Set the mole fractions + /** + @param mole_fractions The vector of mole fractions of the components + */ + void set_mole_fractions(const std::vector &mole_fractions); + + const std::vector &get_mole_fractions(){return mole_fractions;}; + + /// Set the mass fractions + /** + @param mass_fractions The vector of mass fractions of the components + */ + void set_mass_fractions(const std::vector &mass_fractions){throw std::exception();}; + + long double calc_molar_mass(void); + long double calc_gas_constant(void); + + long double calc_Bvirial(void); + long double calc_Cvirial(void); + long double calc_dBvirial_dT(void); + long double calc_dCvirial_dT(void); + + long double calc_pressure(void); + long double calc_cvmolar(void); + long double calc_cpmolar(void); + long double calc_hmolar(void); + long double calc_smolar(void); + long double calc_pressure_nocache(long double T, long double rhomolar); + long double calc_smolar_nocache(long double T, long double rhomolar); + long double calc_hmolar_nocache(long double T, long double rhomolar); + long double calc_umolar_nocache(long double T, long double rhomolar); + long double calc_umolar(void); + long double calc_speed_sound(void); + long double calc_fugacity_coefficient(int i); + + long double calc_alphar(void); + long double calc_dalphar_dDelta(void); + long double calc_dalphar_dTau(void); + long double calc_d2alphar_dDelta2(void); + long double calc_d2alphar_dDelta_dTau(void); + long double calc_d2alphar_dTau2(void); + + long double calc_alpha0(void); + long double calc_dalpha0_dDelta(void); + long double calc_dalpha0_dTau(void); + long double calc_d2alpha0_dDelta2(void); + long double calc_d2alpha0_dDelta_dTau(void); + long double calc_d2alpha0_dTau2(void); + + long double calc_surface_tension(void); + + long double calc_Tmax(void); + long double calc_pmax(void); + long double calc_Ttriple(void); + + std::string calc_name(void); + + long double calc_alphar_deriv_nocache(const int nTau, const int nDelta, const std::vector & mole_fractions, const long double &tau, const long double &delta); + + /** + \brief Take derivatives of the ideal-gas part of the Helmholtz energy, don't use any cached values, or store any cached values + + @param nTau How many derivatives with respect to \f$\tau\f$ to take + @param nDelta How many derivatives with respect to \f$\delta\f$ to take + @param mole_fractions Mole fractions + @param tau Reciprocal reduced temperature where \f$\tau=T_r / T\f$ + @param delta Reduced density where \f$\delta = \rho / \rho_r \f$ + @param Tr Reducing temperature of the mixture [K] + @param rhor Reducing molar density of the mixture [mol/m^3] + + \f[ + \alpha^0 = \displaystyle\sum_{i=1}^{N}x_i[\alpha^0_{oi}(\rho,T) + \ln x_i] + \f] + where in this case, we use the \f$\alpha^0\f$ for the given fluid, which uses the inputs \f$\tau_i\f$ and \f$\delta_i\f$, so we do the conversion between mixture and component reduced states with + \f[ + \tau_i = \frac{T_{c,i}}{T} = \frac{\tau T_{c,i}}{T_r} + \f] + \f[ + \delta_i = \frac{\rho}{\rho_{c,i}} = \frac{\delta\rho_r}{\rho_{c,i}} + \f] + + \sa Table B5, GERG 2008 from Kunz Wagner, JCED, 2012 + */ + long double calc_alpha0_deriv_nocache(const int nTau, const int nDelta, const std::vector & mole_fractions, const long double &tau, const long double &delta, const long double &Tr, const long double &rhor); + + void calc_reducing_state(void); + SimpleState calc_reducing_state_nocache(const std::vector & mole_fractions); + + /** + In a general way we can calculate any first partial derivative based on calculating derivatives with respect to the fundamental variables of the EOS, \f$\tau\f$ and \f$\delta\f$ + \f[ + \left(\frac{\partial A}{\partial B}\right)_C = \frac{\left(\frac{\partial A}{\partial \tau}\right)_\delta\left(\frac{\partial C}{\partial \delta}\right)_\tau-\left(\frac{\partial A}{\partial \delta}\right)_\tau\left(\frac{\partial C}{\partial \tau}\right)_\delta}{\left(\frac{\partial B}{\partial \tau}\right)_\delta\left(\frac{\partial C}{\partial \delta}\right)_\tau-\left(\frac{\partial B}{\partial \delta}\right)_\tau\left(\frac{\partial C}{\partial \tau}\right)_\delta} + \f] + */ + long double calc_first_partial_deriv(int Of, int Wrt, int Constant); + + void mass_to_molar_inputs(long &input_pair, double &value1, double &value2); + + // *************************************************************** + // *************************************************************** + // ************* PHASE DETERMINATION ROUTINES ****************** + // *************************************************************** + // *************************************************************** + void T_phase_determination_pure_or_pseudopure(int other, long double value); + void p_phase_determination_pure_or_pseudopure(int other, long double value); + void DmolarP_phase_determination(); + + + // *************************************************************** + // *************************************************************** + // ******************* SOLVER ROUTINES ************************* + // *************************************************************** + // *************************************************************** + + long double solver_rho_Tp(long double T, long double p, long double rho_guess = -1); + long double solver_rho_Tp_SRK(long double T, long double p, int phase); + long double solver_for_rho_given_T_oneof_HSU(long double T, long double value, int other); + + + + + + + + + // *************************************************************** + // *************************************************************** + // ***************** MIXTURE DERIVATIVES *********************** + // *************************************************************** + // *************************************************************** + + + long double mixderiv_dalphar_dxi(int i); + long double mixderiv_d2alphar_dxi_dTau(int i); + long double mixderiv_d2alphar_dxi_dDelta(int i); + long double mixderiv_d2alphardxidxj(int i, int j); + + /*! The derivative term + \f[ + \left(\frac{\partial p}{\partial T} \right)_{V,\bar n} = \rho R(1+\delta \alpha_{\delta}^r-\delta \tau \alpha^r_{\delta\tau}) + \f] + GERG 2004 Monograph equation 7.61 + */ + long double mixderiv_dpdT__constV_n(); + + long double mixderiv_dpdrho__constT_n(); + + /*! The derivative term + \f[ + n\left(\frac{\partial p}{\partial V} \right)_{T,\bar n} = -\rho^2 RT(1+2\delta \alpha_{\delta}^r+\delta^2\alpha^r_{\delta\delta}) + \f] + GERG 2004 Monograph equation 7.62 + */ + long double mixderiv_ndpdV__constT_n(); + + /*! The derivative term + \f[ + n\left(\frac{\partial p}{\partial n_i} \right)_{T,V,n_j} = \rho RT\left[1+\delta\alpha_{\delta}^r\left[2- \frac{1}{\rho_r}\cdot n\left( \frac{\partial \rho_r}{\partial n_i}\right)_{n_j}\right] +\delta\cdot n\left(\frac{\partial\alpha_{\delta}^r}{\partial n_i}\right)_{T,V,n_j}\right] + \f] + GERG 2004 Monograph equation 7.63 + */ + long double mixderiv_ndpdni__constT_V_nj(int i); + + /// GERG 2004 monograph Eqn. 7.32 + /*! The partial molar volume + \f[ + \hat v_i = \left( \frac{\partial V}{\partial n_i}\right)_{T,p,n_j} = \frac{-\left(\dfrac{\partial p}{\partial n_i}\right)_{T,V,n_j}}{\left(\dfrac{\partial p}{\partial V}\right)_{T,\bar n}} + \f] + */ + long double mixderiv_partial_molar_volume(int i); + + /*! + Natural logarithm of the fugacity coefficient + */ + long double mixderiv_ln_fugacity_coefficient(int i); + + /*! + Derivative of the natural logarithm of the fugacity coefficient with respect to T + */ + long double mixderiv_dln_fugacity_coefficient_dT__constrho_n(int i); + + /*! + Derivative of the natural logarithm of the fugacity coefficient with respect to T + */ + long double mixderiv_dln_fugacity_coefficient_drho__constT_n(int i); + + /// GERG 2004 Monograph Eqn. 7.29 + /** The derivative term + \f[ + \left(\frac{\partial \ln \phi_i}{\partial T} \right)_{p,\bar n} = \left(\frac{\partial^2n\alpha^r}{\partial T\partial n_i} \right)_{V,n_j} + \frac{1}{T}-\frac{\hat v}{RT}\left(\frac{\partial p}{\partial T}\right)_{V,\bar n} + \f] + */ + long double mixderiv_dln_fugacity_coefficient_dT__constp_n(int i); + + /// Table B4, Kunz, JCED, 2012 for the original term and the subsequent substitutions + /*! The derivative term + \f[ + n\left(\frac{\partial \phi^r}{\partial n_i} \right)_{T,V,n_j} + \f] + which is equal to + \f{eqnarray*}{ + n\left(\frac{\partial \phi^r}{\partial n_i} \right)_{T,V,n_j} &=& \delta \phi^r_{\delta}\left[ 1-\frac{1}{\rho_r}\left[\left(\frac{\partial \rho_r}{\partial x_i}\right)_{x_j} - \sum_{k=1}^N x_k\left(\frac{\partial \rho_r}{\partial x_k}\right)_{x_j} \right]\right]\\ + && +\tau \phi^r_{\tau}\frac{1}{T_r}\left[\left(\frac{\partial T_r}{\partial x_i}\right)_{x_j} - \sum_{k=1}^N x_k\left(\frac{\partial T_r}{\partial x_k}\right)_{x_j} \right]\\ + && +\phi^r_{x_i}-\sum_{k=1}^{N}x_k\phi^r_{x_k} + \f} + */ + long double mixderiv_ndalphar_dni__constT_V_nj(int i); + + /// GERG Equation 7.42 + long double mixderiv_dnalphar_dni__constT_V_nj(int i); + + /// GERG 2004 Monograph Eqn. 7.30 + /** + The derivative term + \f[ + \left(\frac{\partial \ln \phi_i}{\partial p} \right)_{T,\bar n} = \frac{\hat v_i}{RT}-\frac{1}{p} + \f] + */ + long double mixderiv_dln_fugacity_coefficient_dp__constT_n(int i); + + ///GERG 2004 Monograph Equation 7.31 + /** The derivative term + \f[ + n\left(\frac{\partial \ln \phi_i}{\partial n_j}\right)_{T,p} = n\left(\frac{\partial^2n\alpha^r}{\partial n_j \partial n_i} \right)_{T,V}+1+\frac{n}{RT}\frac{\left(\frac{\partial p}{\partial n_j}\right)_{T,V,n_i}\left(\frac{\partial p}{\partial n_i}\right)_{T,V,n_j}}{\left(\frac{\partial p}{\partial V}\right)_{T,\bar n}} + \f] + which is also equal to + \f[ + n\left(\frac{\partial \ln \phi_i}{\partial n_j}\right)_{T,p} = n\left(\frac{\partial^2n\alpha^r}{\partial n_j \partial n_i} \right)_{T,V}+1-\frac{\hat v_i}{RT}\left[n\left(\frac{\partial p}{\partial n_j}\right)_{T,V,n_i}\right] + \f] + */ + long double mixderiv_ndln_fugacity_coefficient_dnj__constT_p(int i, int j); + + /// Gernert Equation 3.115 + /// Catch test provided + long double mixderiv_dln_fugacity_coefficient_dxj__constT_p_xi(int i, int j); + + /// Gernert Equation 3.130 + /// Catch test provided + long double mixderiv_dpdxj__constT_V_xi(int j); + + /// Gernert Equation 3.117 + long double mixderiv_d2nalphar_dni_dxj__constT_V(int i, int j){ return mixderiv_d_ndalphardni_dxj__constT_V_xi(i, j) + mixderiv_dalphar_dxj__constT_V_xi(j);}; + + /// Gernert Equation 3.119 + /// Catch test provided + long double mixderiv_dalphar_dxj__constT_V_xi(int j); + + /// Gernert Equation 3.118 + /// Catch test provided + long double mixderiv_d_ndalphardni_dxj__constT_V_xi(int i, int j); + + /// Gernert Equation 3.134 + /// Catch test provided + long double mixderiv_d_dalpharddelta_dxj__constT_V_xi(int j); + + /// Gernert Equation 3.121 + /// Catch test provided + long double mixderiv_ddelta_dxj__constT_V_xi(int j); + + /// Gernert Equation 3.122 + /// Catch test provided + long double mixderiv_dtau_dxj__constT_V_xi(int j); + + /// GERG 2004 Monograph, equations 7.44 and 7.51 + /** The derivative term + \f[ + \left(\frac{\partial^2n\alpha^r}{\partial T\partial n_i} \right)_{V,n_j} = \left( \frac{\partial}{\partial T}\left(\frac{\partial n \alpha^r}{\partial n_i}\right)_{T,V,n_j} \right)_{V,\bar n} + \f] + \f[ + \left(\frac{\partial^2n\alpha^r}{\partial T\partial n_i} \right)_{V,n_j} = -\frac{\tau}{T}\left[\alpha_{\tau}^r +\left( \frac{\partial}{\partial \tau}\left(n\left(\frac{\partial \alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\delta,\bar x}\right] + \f] + */ + long double mixderiv_d2nalphar_dni_dT(int i); + + /// GERG 2004 Monograph Equation 7.51 and Table B4, Kunz, JCED, 2012 + /** The derivative term + \f{eqnarray*}{ + \frac{\partial }{\partial \tau} \left( n\left(\frac{\partial \phi^r}{\partial n_i} \right)_{T,V,n_j} \right) &=& \delta \phi^r_{\delta\tau}\left[ 1-\frac{1}{\rho_r}\left[\left(\frac{\partial \rho_r}{\partial x_i}\right)_{x_j} - \sum_{k=1}^N x_k\left(\frac{\partial \rho_r}{\partial x_k}\right)_{x_j} \right]\right]\\ + && +(\tau \phi^r_{\tau\tau}+\phi^r_{\tau})\frac{1}{T_r}\left[\left(\frac{\partial T_r}{\partial x_i}\right)_{x_j} - \sum_{k=1}^N x_k\left(\frac{\partial T_r}{\partial x_k}\right)_{x_j} \right]\\ + && +\phi^r_{x_i\tau}-\sum_{k=1}^{N}x_k\phi^r_{x_k\tau} + \f} + */ + long double mixderiv_d_ndalphardni_dTau(int i); + + /// GERG 2004 Monograph Equation 7.50 and Table B4, Kunz, JCED, 2012 + /** The derivative term + \f{eqnarray*}{ + \left(\frac{\partial }{\partial \delta} \left( n\left(\frac{\partial \phi^r}{\partial n_i} \right)_{T,V,n_j} \right)\right)_{\tau,\bar x} &=& (\alpha_{\delta}^r+\delta\alpha_{\delta\delta}^r)\left[1-\frac{1}{\rho_r}\cdot n\left(\frac{\partial \rho_r}{\partial n_i}\right)_{n_j} \right] \\ + &+&\tau\alpha^r_{\delta\tau}\frac{1}{T_r}\cdot n\left(\frac{\partial T_r}{\partial n_i}\right)_{n_j}\\ + &+&\phi^r_{\delta x_i}-\sum_{k=1}^{N}x_k\phi^r_{\delta x_k} + \f} + */ + long double mixderiv_d_ndalphardni_dDelta(int i); + + /** GERG 2004 Monograph equation 7.41: + \f[ + n\left(\frac{\partial^2n\alpha^r}{\partial n_i \partial n_j} \right)_{T,V} = n\left( \frac{\partial}{\partial n_j}\left(\frac{\partial n\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)_{T,V,n_i} + \f] + and + GERG 2004 Monograph equation 7.46: + \f[ + n\left( \frac{\partial}{\partial n_j}\left(\frac{\partial n\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)_{T,V,n_i} = n\left( \frac{\partial \alpha^r}{\partial n_j}\right)_{T,V,n_i} + n\left( \frac{\partial}{\partial n_j}\left(n\left(\frac{\partial \alpha^r}{\partial n_i}\right)_{T,V,n_j} \right) \right)_{T,V,n_i} + \f] + GERG 2004 Monograph equation 7.47: + \f{eqnarray*}{ + n\left( \frac{\partial}{\partial n_j}\left(n\left(\frac{\partial \alpha^r}{\partial n_i}\right)_{T,V,n_j} \right) \right)_{T,V,n_i} &=& \left( \frac{\partial}{\partial \delta}\left(n\left(\frac{\partial\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\tau,\bar x}\cdot n\left(\frac{\partial\delta}{\partial n_j}\right)_{T,V,n_i}\\ + &+& \left( \frac{\partial}{\partial \tau}\left(n\left(\frac{\partial\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\tau,\bar x}\cdot n\left(\frac{\partial\tau}{\partial n_j}\right)_{T,V,n_i}\\ + &+& \left( \frac{\partial}{\partial x_j}\left(n\left(\frac{\partial\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\delta,\tau,x_i}-\sum_{k=1}^{N}x_k \left( \frac{\partial}{\partial x_k}\left(n\left(\frac{\partial\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\delta,\tau,x_i}\\ + \f} + */ + long double mixderiv_nd2nalphardnidnj__constT_V(int i, int j); + + /// GERG 2004 Monograph equation 7.48 + /** The derivative term + \f[ + n\left(\frac{\partial \delta}{\partial n_i} \right)_{T,V,n_j} = \delta - \frac{\delta}{\rho_r}\cdot n\left(\frac{\partial \rho_r}{\partial n_i} \right)_{n_j} + \f] + */ + long double mixderiv_nddeltadni__constT_V_nj(int i); + + /// GERG 2004 Monograph equation 7.49 + /** The derivative term + \f[ + n\left(\frac{\partial \tau}{\partial n_i} \right)_{T,V,n_j} = \frac{\tau}{T_r}\cdot n\left(\frac{\partial T_r}{\partial n_i} \right)_{n_j} + \f] + */ + long double mixderiv_ndtaudni__constT_V_nj(int i); + + /// \brief GERG 2004 Monograph equation 7.52 + /** The derivative term + \f{eqnarray*}{ + \left( \frac{\partial}{\partial x_j}\left(n\left(\frac{\partial\alpha^r}{\partial n_i}\right)_{T,V,n_j}\right)\right)_{\delta,\tau,x_i} &=& \delta\alpha_{\delta x_j}^{r}\left[ 1-\frac{1}{\rho_r}\cdot n\left(\frac{\partial \rho_r}{\partial n_i}\right)_{n_j}\right] \\ + &-& \delta\alpha_{\delta}^{r}\frac{1}{\rho_r}\left[ \left(\frac{\partial}{\partial x_j}\left(n\left(\frac{\partial \rho_r}{\partial n_i}\right)_{n_j}\right)\right)_{x_i}-\frac{1}{\rho_r}\left(\frac{\partial \rho_r}{\partial x_j}\right)_{x_i}\cdot n\left(\frac{\partial \rho_r}{\partial n_i}\right)_{n_j}\right] \\ + &+& \tau\alpha_{\tau x_j}^r\frac{1}{T_r}\cdot n\left(\frac{\partial T_r}{\partial n_i}\right)_{n_j}\\ + &+& \tau\alpha_{\tau}^{r}\frac{1}{T_r}\left[ \left(\frac{\partial}{\partial x_j}\left(n\left(\frac{\partial T_r}{\partial n_i}\right)_{n_j}\right)\right)_{x_i}-\frac{1}{T_r}\left(\frac{\partial T_r}{\partial x_j}\right)_{x_i}\cdot n\left(\frac{\partial T_r}{\partial n_i}\right)_{n_j}\right] \\ + &+& \alpha_{x_ix_j}^r-\alpha_{x_j}^r-\sum_{m=1}^Nx_m\alpha_{x_jx_m}^r + \f} + */ + long double mixderiv_d_ndalphardni_dxj__constdelta_tau_xi(int i, int j); +}; + +} /* namespace CoolProp */ +#endif /* HELMHOLTZEOSMIXTUREBACKEND_H_ */ diff --git a/src/Backends/IncompressibleBackend.h b/src/Backends/IncompressibleBackend.h new file mode 100644 index 00000000..4bd10263 --- /dev/null +++ b/src/Backends/IncompressibleBackend.h @@ -0,0 +1,64 @@ + +#ifndef INCOMPRESSIBLEBACKEND_H_ +#define INCOMPRESSIBLEBACKEND_H_ + +#include "AbstractState.h" +#include "Exceptions.h" + +#include + +namespace CoolProp { + +class IncompressibleBackend : public AbstractState { +protected: + int Ncomp; + bool _mole_fractions_set; + static bool _REFPROP_supported; + std::vector mass_fractions; +public: + IncompressibleBackend(){}; + virtual ~IncompressibleBackend(){}; + + /// The instantiator + /// @param fluid_names The vector of strings of the fluid components, without file ending + IncompressibleBackend(const std::string & fluid_names){ }; + + // Incompressible backend uses mole fractions + bool using_mole_fractions(){return false;} + + /// Updating function for incompressible fluid + /** + In this function we take a pair of thermodynamic states, those defined in the input_pairs + enumeration and update all the internal variables that we can. REFPROP calculates + a lot of other state variables each time you use a flash routine so we cache all the + outputs that we can, which saves on computational time. + + @param input_pair Integer key from CoolProp::input_pairs to the two inputs that will be passed to the function + @param value1 First input value + @param value2 Second input value + */ + void update(long input_pair, double value1, double value2){throw CoolProp::NotImplementedError("Update not implemented yet for incompressible fluids");}; + + /// Set the mole fractions + /** + @param mole_fractions The vector of mole fractions of the components + */ + void set_mole_fractions(const std::vector &mole_fractions){throw CoolProp::NotImplementedError("Cannot set mole fractions for incompressible fluid");}; + + /// Set the mass fractions + /** + @param mass_fractions The vector of mass fractions of the components + */ + void set_mass_fractions(const std::vector &mass_fractions){this->mass_fractions = mass_fractions;}; + + /// Check if the mole fractions have been set, etc. + void check_status(); + + /// Get the viscosity [Pa-s] + long double calc_viscosity(void){throw NotImplementedError();}; + /// Get the thermal conductivity [W/m/K] (based on the temperature and density in the state class) + long double calc_conductivity(void){throw NotImplementedError();}; +}; + +} /* namespace CoolProp */ +#endif /* INCOMPRESSIBLEBACKEND_H_ */ diff --git a/src/Backends/REFPROPBackend.cpp b/src/Backends/REFPROPBackend.cpp new file mode 100644 index 00000000..d57f395a --- /dev/null +++ b/src/Backends/REFPROPBackend.cpp @@ -0,0 +1,43 @@ +/* + * AbstractBackend.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#include "REFPROPBackend.h" + +#include "CoolPropTools.h" + +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#else +#include +#endif + +#include + +namespace CoolProp { + +REFPROPBackend::REFPROPBackend(const std::string & fluid_name) { + // Do the REFPROP instantiation for this fluid + + // Try to add this fluid to REFPROP - might want to think about making array of + // components and setting mole fractions if they change a lot. + std::vector component_names(1,fluid_name); + set_REFPROP_fluids(component_names); + + // Set the mole fraction to 1 in the base class (we can't set the mole fraction in this class, + // otherwise a NotImplementedError will be returned) + std::vector x(1, 1.0); // (one element with value of 1.0) + REFPROPMixtureBackend::set_mole_fractions(x); +} + +REFPROPBackend::~REFPROPBackend() { + // TODO Auto-generated destructor stub +} + +} /* namespace CoolProp */ diff --git a/src/Backends/REFPROPBackend.h b/src/Backends/REFPROPBackend.h new file mode 100644 index 00000000..373140b0 --- /dev/null +++ b/src/Backends/REFPROPBackend.h @@ -0,0 +1,30 @@ +/* + * AbstractBackend.h + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#ifndef REFPROPBACKEND_H_ +#define REFPROPBACKEND_H_ + +#include "REFPROPMixtureBackend.h" + +namespace CoolProp { + +/** +This backend is used for pure and pseudo-pure fluids powered by +REFPROP. It hides all the implementation of mixture properties +and exposes just the pure fluid interface. +*/ +class REFPROPBackend : public REFPROPMixtureBackend { +public: + + REFPROPBackend(); + REFPROPBackend(const std::string &fluid_name); + + virtual ~REFPROPBackend(); +}; + +} /* namespace CoolProp */ +#endif /* REFPROPBACKEND_H_ */ diff --git a/src/Backends/REFPROPMixtureBackend.cpp b/src/Backends/REFPROPMixtureBackend.cpp new file mode 100644 index 00000000..0b8015f4 --- /dev/null +++ b/src/Backends/REFPROPMixtureBackend.cpp @@ -0,0 +1,1198 @@ +/* + * AbstractBackend.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +/*! +From REFPROP: +temperature K +pressure, fugacity kPa +density mol/L +composition mole fraction +quality mole basis (moles vapor/total moles) +enthalpy, internal energy J/mol +Gibbs, Helmholtz free energy J/mol +entropy, heat capacity J/(mol.K) +speed of sound m/s +Joule-Thomson coefficient K/kPa +d(p)/d(rho) kPa.L/mol +d2(p)/d(rho)2 kPa.(L/mol)^2 +viscosity microPa.s (10^-6 Pa.s) +thermal conductivity W/(m.K) +dipole moment debye +surface tension N/m +*/ + +#include "CoolPropTools.h" +#if defined(__ISWINDOWS__) + #include + HINSTANCE RefpropdllInstance=NULL; + char refpropPath[] = ""; +#elif defined(__ISLINUX__) + #include + void *RefpropdllInstance=NULL; + char refpropPath[] = "/opt/refprop"; +#elif defined(__ISAPPLE__) + #include + void *RefpropdllInstance=NULL; + char refpropPath[] = "/opt/refprop"; +#else + #pragma error +#endif + +#include "REFPROP_lib.h" +#include "REFPROPMixtureBackend.h" +#include "Exceptions.h" + +#include +#include +#include +#include +#include + + + +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#else +#include +#endif + +// Some constants for REFPROP... defined by macros for ease of use +#define refpropcharlength 255 +#define filepathlength 255 +#define lengthofreference 3 +#define errormessagelength 255 +#define ncmax 20 // Note: ncmax is the max number of components +#define numparams 72 +#define maxcoefs 50 + +std::string LoadedREFPROPRef; + +// Some constants for REFPROP... defined by macros for ease of use +#define refpropcharlength 255 +#define filepathlength 255 +#define lengthofreference 3 +#define errormessagelength 255 +#define ncmax 20 // Note: ncmax is the max number of components +#define numparams 72 +#define maxcoefs 50 + +// Check windows +#if _WIN32 || _WIN64 + #if _WIN64 + #define ENV64BIT + #else + #define ENV32BIT + #endif +#endif + +// Check GCC +#if __GNUC__ + #if __x86_64__ || __ppc64__ + #define ENV64BIT + #else + #define ENV32BIT + #endif +#endif + +static char rel_path_HMC_BNC[] = "HMX.BNC"; +static char default_reference_state[] = "DEF"; + +// Define functions as pointers and initialise them to NULL +// Declare the functions for direct access + RPVersion_POINTER RPVersion; + SETPATHdll_POINTER SETPATHdll; + ABFL1dll_POINTER ABFL1dll; + ABFL2dll_POINTER ABFL2dll; + ACTVYdll_POINTER ACTVYdll; + AGdll_POINTER AGdll; + CCRITdll_POINTER CCRITdll; + CP0dll_POINTER CP0dll; + CRITPdll_POINTER CRITPdll; + CSATKdll_POINTER CSATKdll; + CV2PKdll_POINTER CV2PKdll; + CVCPKdll_POINTER CVCPKdll; + CVCPdll_POINTER CVCPdll; + DBDTdll_POINTER DBDTdll; + DBFL1dll_POINTER DBFL1dll; + DBFL2dll_POINTER DBFL2dll; + DDDPdll_POINTER DDDPdll; + DDDTdll_POINTER DDDTdll; + DEFLSHdll_POINTER DEFLSHdll; + DHD1dll_POINTER DHD1dll; + DHFLSHdll_POINTER DHFLSHdll; + DHFL1dll_POINTER DHFL1dll; + DHFL2dll_POINTER DHFL2dll; + DIELECdll_POINTER DIELECdll; + DOTFILLdll_POINTER DOTFILLdll; + DPDD2dll_POINTER DPDD2dll; + DPDDKdll_POINTER DPDDKdll; + DPDDdll_POINTER DPDDdll; + DPDTKdll_POINTER DPDTKdll; + DPDTdll_POINTER DPDTdll; + DPTSATKdll_POINTER DPTSATKdll; + DSFLSHdll_POINTER DSFLSHdll; + DSFL1dll_POINTER DSFL1dll; + DSFL2dll_POINTER DSFL2dll; + ENTHALdll_POINTER ENTHALdll; + ENTROdll_POINTER ENTROdll; + ESFLSHdll_POINTER ESFLSHdll; + FGCTYdll_POINTER FGCTYdll; + FPVdll_POINTER FPVdll; + FUGCOFdll_POINTER FUGCOFdll; + GERG04dll_POINTER GERG04dll; + GETFIJdll_POINTER GETFIJdll; + GETKTVdll_POINTER GETKTVdll; + GIBBSdll_POINTER GIBBSdll; + HSFLSHdll_POINTER HSFLSHdll; + INFOdll_POINTER INFOdll; + LIMITKdll_POINTER LIMITKdll; + LIMITSdll_POINTER LIMITSdll; + LIMITXdll_POINTER LIMITXdll; + MELTPdll_POINTER MELTPdll; + MELTTdll_POINTER MELTTdll; + MLTH2Odll_POINTER MLTH2Odll; + NAMEdll_POINTER NAMEdll; + PDFL1dll_POINTER PDFL1dll; + PDFLSHdll_POINTER PDFLSHdll; + PEFLSHdll_POINTER PEFLSHdll; + PHFL1dll_POINTER PHFL1dll; + PHFLSHdll_POINTER PHFLSHdll; + PQFLSHdll_POINTER PQFLSHdll; + PREOSdll_POINTER PREOSdll; + PRESSdll_POINTER PRESSdll; + PSFL1dll_POINTER PSFL1dll; + PSFLSHdll_POINTER PSFLSHdll; + PUREFLDdll_POINTER PUREFLDdll; + QMASSdll_POINTER QMASSdll; + QMOLEdll_POINTER QMOLEdll; + RESIDUALdll_POINTER RESIDUALdll; + SATDdll_POINTER SATDdll; + SATEdll_POINTER SATEdll; + SATHdll_POINTER SATHdll; + SATPdll_POINTER SATPdll; + SATSdll_POINTER SATSdll; + SATTdll_POINTER SATTdll; + SETAGAdll_POINTER SETAGAdll; + SETKTVdll_POINTER SETKTVdll; + SETMIXdll_POINTER SETMIXdll; + SETMODdll_POINTER SETMODdll; + SETREFdll_POINTER SETREFdll; + SETUPdll_POINTER SETUPdll; +// SPECGRdll_POINTER SPECGRdll; // not found in library + SUBLPdll_POINTER SUBLPdll; + SUBLTdll_POINTER SUBLTdll; + SURFTdll_POINTER SURFTdll; + SURTENdll_POINTER SURTENdll; + TDFLSHdll_POINTER TDFLSHdll; + TEFLSHdll_POINTER TEFLSHdll; + THERM0dll_POINTER THERM0dll; + THERM2dll_POINTER THERM2dll; + THERM3dll_POINTER THERM3dll; + THERMdll_POINTER THERMdll; + THFLSHdll_POINTER THFLSHdll; + TPFLSHdll_POINTER TPFLSHdll; + TPFL2dll_POINTER TPFL2dll; + TPRHOdll_POINTER TPRHOdll; + TQFLSHdll_POINTER TQFLSHdll; + TRNPRPdll_POINTER TRNPRPdll; + TSFLSHdll_POINTER TSFLSHdll; + VIRBdll_POINTER VIRBdll; + VIRCdll_POINTER VIRCdll; + WMOLdll_POINTER WMOLdll; + XMASSdll_POINTER XMASSdll; + XMOLEdll_POINTER XMOLEdll; + +void *getFunctionPointer(char * name) +{ + #if defined(__ISWINDOWS__) + return (void *) GetProcAddress(RefpropdllInstance,name); + #elif defined(__ISLINUX__) + return dlsym(RefpropdllInstance,name); + #elif defined(__ISAPPLE__) + return dlsym(RefpropdllInstance,name); + #else + throw CoolProp::NotImplementedError("This function should not be called."); + return NULL; + #endif +} + +//#include +//void *RefpropdllInstance=NULL; +//char refpropPath[] = "/opt/refprop"; + +//Moved pointer handling to a function, helps to maintain +//an overview and structures OS dependent parts +double setFunctionPointers() +{ + if (RefpropdllInstance==NULL) + { + printf("REFPROP is not loaded, make sure you call this function after loading the library.\n"); + return -_HUGE; + } + // set the pointers, platform independent + RPVersion = (RPVersion_POINTER) getFunctionPointer((char *)RPVersion_NAME); + ABFL1dll = (ABFL1dll_POINTER) getFunctionPointer((char *)ABFL1dll_NAME); + ABFL2dll = (ABFL2dll_POINTER) getFunctionPointer((char *)ABFL2dll_NAME); + ACTVYdll = (ACTVYdll_POINTER) getFunctionPointer((char *)ACTVYdll_NAME); + AGdll = (AGdll_POINTER) getFunctionPointer((char *)AGdll_NAME); + CCRITdll = (CCRITdll_POINTER) getFunctionPointer((char *)CCRITdll_NAME); + CP0dll = (CP0dll_POINTER) getFunctionPointer((char *)CP0dll_NAME); + CRITPdll = (CRITPdll_POINTER) getFunctionPointer((char *)CRITPdll_NAME); + CSATKdll = (CSATKdll_POINTER) getFunctionPointer((char *)CSATKdll_NAME); + CV2PKdll = (CV2PKdll_POINTER) getFunctionPointer((char *)CV2PKdll_NAME); + CVCPKdll = (CVCPKdll_POINTER) getFunctionPointer((char *)CVCPKdll_NAME); + CVCPdll = (CVCPdll_POINTER) getFunctionPointer((char *)CVCPdll_NAME); + DBDTdll = (DBDTdll_POINTER) getFunctionPointer((char *)DBDTdll_NAME); + DBFL1dll = (DBFL1dll_POINTER) getFunctionPointer((char *)DBFL1dll_NAME); + DBFL2dll = (DBFL2dll_POINTER) getFunctionPointer((char *)DBFL2dll_NAME); + DDDPdll = (DDDPdll_POINTER) getFunctionPointer((char *)DDDPdll_NAME); + DDDTdll = (DDDTdll_POINTER) getFunctionPointer((char *)DDDTdll_NAME); + DEFLSHdll = (DEFLSHdll_POINTER) getFunctionPointer((char *)DEFLSHdll_NAME); + DHD1dll = (DHD1dll_POINTER) getFunctionPointer((char *)DHD1dll_NAME); + DHFLSHdll = (DHFLSHdll_POINTER) getFunctionPointer((char *)DHFLSHdll_NAME); + DIELECdll = (DIELECdll_POINTER) getFunctionPointer((char *)DIELECdll_NAME); + DOTFILLdll = (DOTFILLdll_POINTER) getFunctionPointer((char *)DOTFILLdll_NAME); + DPDD2dll = (DPDD2dll_POINTER) getFunctionPointer((char *)DPDD2dll_NAME); + DPDDKdll = (DPDDKdll_POINTER) getFunctionPointer((char *)DPDDKdll_NAME); + DPDDdll = (DPDDdll_POINTER) getFunctionPointer((char *)DPDDdll_NAME); + DPDTKdll = (DPDTKdll_POINTER) getFunctionPointer((char *)DPDTKdll_NAME); + DPDTdll = (DPDTdll_POINTER) getFunctionPointer((char *)DPDTdll_NAME); + DPTSATKdll = (DPTSATKdll_POINTER) getFunctionPointer((char *)DPTSATKdll_NAME); + DSFLSHdll = (DSFLSHdll_POINTER) getFunctionPointer((char *)DSFLSHdll_NAME); + ENTHALdll = (ENTHALdll_POINTER) getFunctionPointer((char *)ENTHALdll_NAME); + ENTROdll = (ENTROdll_POINTER) getFunctionPointer((char *)ENTROdll_NAME); + ESFLSHdll = (ESFLSHdll_POINTER) getFunctionPointer((char *)ESFLSHdll_NAME); + FGCTYdll = (FGCTYdll_POINTER) getFunctionPointer((char *)FGCTYdll_NAME); + FPVdll = (FPVdll_POINTER) getFunctionPointer((char *)FPVdll_NAME); + FUGCOFdll = (FUGCOFdll_POINTER) getFunctionPointer((char *)FUGCOFdll_NAME); + GERG04dll = (GERG04dll_POINTER) getFunctionPointer((char *)GERG04dll_NAME); + GETFIJdll = (GETFIJdll_POINTER) getFunctionPointer((char *)GETFIJdll_NAME); + GETKTVdll = (GETKTVdll_POINTER) getFunctionPointer((char *)GETKTVdll_NAME); + GIBBSdll = (GIBBSdll_POINTER) getFunctionPointer((char *)GIBBSdll_NAME); + HSFLSHdll = (HSFLSHdll_POINTER) getFunctionPointer((char *)HSFLSHdll_NAME); + INFOdll = (INFOdll_POINTER) getFunctionPointer((char *)INFOdll_NAME); + LIMITKdll = (LIMITKdll_POINTER) getFunctionPointer((char *)LIMITKdll_NAME); + LIMITSdll = (LIMITSdll_POINTER) getFunctionPointer((char *)LIMITSdll_NAME); + LIMITXdll = (LIMITXdll_POINTER) getFunctionPointer((char *)LIMITXdll_NAME); + MELTPdll = (MELTPdll_POINTER) getFunctionPointer((char *)MELTPdll_NAME); + MELTTdll = (MELTTdll_POINTER) getFunctionPointer((char *)MELTTdll_NAME); + MLTH2Odll = (MLTH2Odll_POINTER) getFunctionPointer((char *)MLTH2Odll_NAME); + NAMEdll = (NAMEdll_POINTER) getFunctionPointer((char *)NAMEdll_NAME); + PDFL1dll = (PDFL1dll_POINTER) getFunctionPointer((char *)PDFL1dll_NAME); + PDFLSHdll = (PDFLSHdll_POINTER) getFunctionPointer((char *)PDFLSHdll_NAME); + PEFLSHdll = (PEFLSHdll_POINTER) getFunctionPointer((char *)PEFLSHdll_NAME); + PHFL1dll = (PHFL1dll_POINTER) getFunctionPointer((char *)PHFL1dll_NAME); + PHFLSHdll = (PHFLSHdll_POINTER) getFunctionPointer((char *)PHFLSHdll_NAME); + PQFLSHdll = (PQFLSHdll_POINTER) getFunctionPointer((char *)PQFLSHdll_NAME); + PREOSdll = (PREOSdll_POINTER) getFunctionPointer((char *)PREOSdll_NAME); + PRESSdll = (PRESSdll_POINTER) getFunctionPointer((char *)PRESSdll_NAME); + PSFL1dll = (PSFL1dll_POINTER) getFunctionPointer((char *)PSFL1dll_NAME); + PSFLSHdll = (PSFLSHdll_POINTER) getFunctionPointer((char *)PSFLSHdll_NAME); + PUREFLDdll = (PUREFLDdll_POINTER) getFunctionPointer((char *)PUREFLDdll_NAME); + RESIDUALdll = (RESIDUALdll_POINTER) getFunctionPointer((char *)RESIDUALdll_NAME); + QMASSdll = (QMASSdll_POINTER) getFunctionPointer((char *)QMASSdll_NAME); + QMOLEdll = (QMOLEdll_POINTER) getFunctionPointer((char *)QMOLEdll_NAME); + SATDdll = (SATDdll_POINTER) getFunctionPointer((char *)SATDdll_NAME); + SATEdll = (SATEdll_POINTER) getFunctionPointer((char *)SATEdll_NAME); + SATHdll = (SATHdll_POINTER) getFunctionPointer((char *)SATHdll_NAME); + SATPdll = (SATPdll_POINTER) getFunctionPointer((char *)SATPdll_NAME); + SATSdll = (SATSdll_POINTER) getFunctionPointer((char *)SATSdll_NAME); + SATTdll = (SATTdll_POINTER) getFunctionPointer((char *)SATTdll_NAME); + SETAGAdll = (SETAGAdll_POINTER) getFunctionPointer((char *)SETAGAdll_NAME); + SETKTVdll = (SETKTVdll_POINTER) getFunctionPointer((char *)SETKTVdll_NAME); + SETMIXdll = (SETMIXdll_POINTER) getFunctionPointer((char *)SETMIXdll_NAME); + SETMODdll = (SETMODdll_POINTER) getFunctionPointer((char *)SETMODdll_NAME); + SETREFdll = (SETREFdll_POINTER) getFunctionPointer((char *)SETREFdll_NAME); + SETUPdll = (SETUPdll_POINTER) getFunctionPointer((char *)SETUPdll_NAME); +// SPECGRdll = (SPECGRdll_POINTER) getFunctionPointer((char *)SPECGRdll_NAME); // not in library + SUBLPdll = (SUBLPdll_POINTER) getFunctionPointer((char *)SUBLPdll_NAME); + SUBLTdll = (SUBLTdll_POINTER) getFunctionPointer((char *)SUBLTdll_NAME); + SURFTdll = (SURFTdll_POINTER) getFunctionPointer((char *)SURFTdll_NAME); + SURTENdll = (SURTENdll_POINTER) getFunctionPointer((char *)SURTENdll_NAME); + TDFLSHdll = (TDFLSHdll_POINTER) getFunctionPointer((char *)TDFLSHdll_NAME); + TEFLSHdll = (TEFLSHdll_POINTER) getFunctionPointer((char *)TEFLSHdll_NAME); + THERM0dll = (THERM0dll_POINTER) getFunctionPointer((char *)THERM0dll_NAME); + THERM2dll = (THERM2dll_POINTER) getFunctionPointer((char *)THERM2dll_NAME); + THERM3dll = (THERM3dll_POINTER) getFunctionPointer((char *)THERM3dll_NAME); + THERMdll = (THERMdll_POINTER) getFunctionPointer((char *)THERMdll_NAME); + THFLSHdll = (THFLSHdll_POINTER) getFunctionPointer((char *)THFLSHdll_NAME); + TPFLSHdll = (TPFLSHdll_POINTER) getFunctionPointer((char *)TPFLSHdll_NAME); + TPRHOdll = (TPRHOdll_POINTER) getFunctionPointer((char *)TPRHOdll_NAME); + TQFLSHdll = (TQFLSHdll_POINTER) getFunctionPointer((char *)TQFLSHdll_NAME); + TRNPRPdll = (TRNPRPdll_POINTER) getFunctionPointer((char *)TRNPRPdll_NAME); + TSFLSHdll = (TSFLSHdll_POINTER) getFunctionPointer((char *)TSFLSHdll_NAME); + VIRBdll = (VIRBdll_POINTER) getFunctionPointer((char *)VIRBdll_NAME); + VIRCdll = (VIRCdll_POINTER) getFunctionPointer((char *)VIRCdll_NAME); + WMOLdll = (WMOLdll_POINTER) getFunctionPointer((char *)WMOLdll_NAME); + XMASSdll = (XMASSdll_POINTER) getFunctionPointer((char *)XMASSdll_NAME); + XMOLEdll = (XMOLEdll_POINTER) getFunctionPointer((char *)XMOLEdll_NAME); + return COOLPROP_OK; +} + +std::string get_REFPROP_fluid_path() +{ + std::string rpPath = refpropPath; + #if defined(__ISWINDOWS__) + return rpPath; + #elif defined(__ISLINUX__) + return rpPath + std::string("/fluids/"); + #elif defined(__ISAPPLE__) + return rpPath + std::string("/fluids/"); + #else + throw CoolProp::NotImplementedError("This function should not be called."); + return rpPath; + #endif +} +bool load_REFPROP() +{ + // If REFPROP is not loaded + if (RefpropdllInstance==NULL) + { + // Load it + #if defined(__ISWINDOWS__) + #if defined(ENV64BIT) + // 64-bit code here. + TCHAR refpropdllstring[100] = TEXT("refprp64.dll"); + RefpropdllInstance = LoadLibrary(refpropdllstring); + #elif defined (ENV32BIT) + // 32-bit code here. + TCHAR refpropdllstring[100] = TEXT("refprop.dll"); + RefpropdllInstance = LoadLibrary(refpropdllstring); + #else + // INCREASE ROBUSTNESS. ALWAYS THROW AN ERROR ON THE ELSE. + #error "Must define either ENV32BIT or ENV64BIT" + #endif + + #elif defined(__ISLINUX__) + RefpropdllInstance = dlopen ("librefprop.so", RTLD_LAZY); + #elif defined(__ISAPPLE__) + RefpropdllInstance = dlopen ("librefprop.dylib", RTLD_LAZY); + #else + throw CoolProp::NotImplementedError("We should not reach this point."); + RefpropdllInstance = NULL; + #endif + + if (RefpropdllInstance==NULL) + { + #if defined(__ISWINDOWS__) + printf("Could not load refprop.dll \n\n"); + throw CoolProp::AttributeError("Could not load refprop.dll, make sure it is in your system search path. In case you run 64bit and you have a REFPROP license, try installing the 64bit DLL from NIST."); + #elif defined(__ISLINUX__) + fputs (dlerror(), stderr); + printf("Could not load librefprop.so \n\n"); + throw CoolProp::AttributeError("Could not load librefprop.so, make sure it is in your system search path."); + #elif defined(__ISAPPLE__) + fputs (dlerror(), stderr); + printf("Could not load librefprop.dylib \n\n"); + throw CoolProp::AttributeError("Could not load librefprop.dylib, make sure it is in your system search path."); + #else + throw CoolProp::NotImplementedError("Something is wrong with the platform definition, you should not end up here."); + #endif + return false; + } + + #if defined(__ISWINDOWS__) + + // Get data associated with path using the windows libraries, + // and if you can (result == 0), the path exists + #ifdef __MINGW32__ + struct stat buf; + if ( stat( "c:\\Program Files\\REFPROP\\fluids", &buf) != 0){ + throw CoolProp::ValueError("REFPROP fluid files must be copied to c:\\Program Files\\REFPROP\\fluids"); + } + #else + struct _stat buf; + if ( _stat( "c:\\Program Files\\REFPROP\\fluids", &buf) != 0){ + throw CoolProp::ValueError("REFPROP fluid files must be copied to c:\\Program Files\\REFPROP\\fluids"); + } + #endif + #endif + + if (setFunctionPointers()!=COOLPROP_OK) + { + printf("There was an error setting the REFPROP function pointers, check types and names in header file.\n"); + throw CoolProp::AttributeError("There was an error setting the REFPROP function pointers, check types and names in header file."); + return false; + } + return true; + } + return true; +} + +namespace CoolProp { + +REFPROPMixtureBackend::REFPROPMixtureBackend(const std::vector& fluid_names) { + // Do the REFPROP instantiation for this fluid + _mole_fractions_set = false; + + // Try to add this fluid to REFPROP - might want to think about making array of + // components and setting mole fractions if they change a lot. + this->set_REFPROP_fluids(fluid_names); + +} + +REFPROPMixtureBackend::~REFPROPMixtureBackend() { + // TODO Auto-generated destructor stub +} + +bool REFPROPMixtureBackend::_REFPROP_supported = true; // initialise with true +bool REFPROPMixtureBackend::REFPROP_supported () { + /* + * Here we build the bridge from macro definitions + * into the actual code. This is also going to be + * the central place to handle error messages on + * unsupported platforms. + */ + + // Abort check if Refprop has been loaded. + if (RefpropdllInstance!=NULL) return true; + + // Store result of previous check. + if (_REFPROP_supported) { + // Either Refprop is supported or it is the first check. + std::string rpv(RPVersion_NAME); + if (rpv.compare("NOTAVAILABLE")!=0) { + // Function names were defined in "REFPROP_lib.h", + // This platform theoretically supports Refprop. + if (load_REFPROP()) { + return true; + } + else { + printf("Good news: It is possible to use REFPROP on your system! However, the library \n"); + printf("could not be loaded. Please make sure that REFPROP is available on your system.\n\n"); + printf("Neither found in current location nor found in system PATH.\n"); + printf("If you already obtained a copy of REFPROP from http://www.nist.gov/srd/, \n"); + printf("add location of REFPROP to the PATH environment variable or your library path.\n\n"); + printf("In case you do not use Windows, have a look at https://github.com/jowr/librefprop.so \n"); + printf("to find instructions on how to compile your own version of the REFPROP library.\n\n"); + _REFPROP_supported = false; + return false; + } + } else { + // No definition of function names, we do not expect + // the Refprop library to be available. + _REFPROP_supported = false; + return false; + } + } else { + return false; + } + return false; +} + +void REFPROPMixtureBackend::set_REFPROP_fluids(const std::vector &fluid_names) +{ + long ierr=0; + char component_string[10000], herr[errormessagelength]; + std::string components_joined = strjoin(fluid_names,"|"); + std::string fdPath = get_REFPROP_fluid_path(); + long N = static_cast(fluid_names.size()); + + assert(N < 20); + + // Check platform support + if(!REFPROP_supported()){ + throw NotImplementedError("You cannot use the REFPROPMixtureBackend."); + } + + // Build the mixture string + for (unsigned int j = 0; j < (unsigned int)N; j++) + { + if (j == 0){ + components_joined = fdPath + fluid_names[j]+".fld"; + } + else{ + components_joined += "|" + fdPath + fluid_names[j]+".fld"; + } + } + + // Load REFPROP if it isn't loaded yet + load_REFPROP(); + + // If the name of the refrigerant doesn't match + // that of the currently loaded refrigerant + if (LoadedREFPROPRef.compare(components_joined)) + { + char path_HMX_BNC[refpropcharlength]; + //strcpy(path_HMX_BNC,fdPath.c_str()); + strcpy(path_HMX_BNC, rel_path_HMC_BNC); + strcpy(component_string, components_joined.c_str()); + + //...Call SETUP to initialize the program + SETUPdll(&N, component_string, path_HMX_BNC, default_reference_state, + &ierr, herr, + 10000, // Length of component_string (see PASS_FTN.for from REFPROP) + refpropcharlength, // Length of path_HMX_BNC + lengthofreference, // Length of reference + errormessagelength // Length of error message + ); + + if (ierr == 0) // Success + { + Ncomp = N; + mole_fractions.resize(N); + mole_fractions_liq.resize(N); + mole_fractions_vap.resize(N); + } + else if (ierr > 0) // Error + { + throw ValueError(format("%s",herr)); + } + else // Warning + { + throw ValueError(format("%s",herr)); + } + } +} +void REFPROPMixtureBackend::set_mole_fractions(const std::vector &mole_fractions) +{ + if (mole_fractions.size() != Ncomp) + { + throw ValueError(format("size of mole fraction vector [%d] does not equal that of component vector [%d]",mole_fractions.size(), Ncomp)); + } + this->mole_fractions.resize(mole_fractions.size()); + for (std::size_t i = 0; i < mole_fractions.size(); ++i) + { + this->mole_fractions[i] = static_cast(mole_fractions[i]); + } + _mole_fractions_set = true; +} +void REFPROPMixtureBackend::set_mass_fractions(const std::vector &mole_fractions) +{ + throw NotImplementedError("Mass fractions not currently supported"); +} +void REFPROPMixtureBackend::check_status(void) +{ + if (!_mole_fractions_set){ throw ValueError("Mole fractions not yet set");} +} +double REFPROPMixtureBackend::calc_melt_Tmax() +{ + long ierr; + char herr[255]; + double tmin,tmax,Dmax_mol_L,pmax_kPa, Tmax_melt; + char htyp[] = "EOS"; + LIMITSdll(htyp, &(mole_fractions[0]), &tmin, &tmax, &Dmax_mol_L, &pmax_kPa, 3); + // Get the maximum temperature for the melting curve by using the maximum pressure + MELTPdll(&pmax_kPa, &(mole_fractions[0]), + &Tmax_melt, + &ierr,herr,errormessagelength); // Error message + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); } + //else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + return Tmax_melt; +} +long double REFPROPMixtureBackend::calc_melt_p_T(long double T) +{ + double _T = static_cast(T), p_kPa; + long ierr; + char herr[255]; + + if (T > calc_melt_Tmax()) + { + throw ValueError(format("Melting temperature [%g] is out of range",T)); + } + + MELTTdll(&_T, &(mole_fractions[0]), + &p_kPa, + &ierr,herr,errormessagelength); // Error message + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); } + //else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + return p_kPa*1000; +} +long double REFPROPMixtureBackend::calc_melt_T_p(long double p) +{ + throw NotImplementedError(); +} +long double REFPROPMixtureBackend::calc_melt_rho_T(long double T) +{ + throw NotImplementedError(); +} + +long double REFPROPMixtureBackend::calc_viscosity(void) +{ + double eta, tcx, rhomol_L = 0.001*_rhomolar; + long ierr; + char herr[255]; + TRNPRPdll(&_T,&rhomol_L,&(mole_fractions[0]), // Inputs + &eta,&tcx, // Outputs + &ierr,herr,errormessagelength); // Error message + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); } + //else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + _viscosity = 1e-6*eta; + _conductivity = tcx; + return static_cast(_viscosity); +} +long double REFPROPMixtureBackend::calc_conductivity(void) +{ + // Calling viscosity also caches conductivity, use that to save calls + calc_viscosity(); + return static_cast(_conductivity); +} +long double REFPROPMixtureBackend::calc_surface_tension(void) +{ + double sigma, rho_mol_L = 0.001*_rhomolar; + long ierr; + char herr[255]; + SURFTdll(&_T, &rho_mol_L, &(mole_fractions[0]), // Inputs + &sigma, // Outputs + &ierr, herr, errormessagelength); // Error message + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); } + //else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + _surface_tension = sigma; + return static_cast(_surface_tension); +} +long double REFPROPMixtureBackend::calc_fugacity_coefficient(int i) +{ + double rho_mol_L = 0.001*_rhomolar; + long ierr; + std::vector fug_cof; + fug_cof.resize(mole_fractions.size()); + char herr[255]; + FUGCOFdll(&_T, &rho_mol_L, &(mole_fractions[0]), // Inputs + &(fug_cof[0]), // Outputs + &ierr, herr, errormessagelength); // Error message + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); } + //else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + return static_cast(fug_cof[i]); +} + +void REFPROPMixtureBackend::update(long input_pair, double value1, double value2) +{ + double rho_mol_L=_HUGE, rhoLmol_L=_HUGE, rhoVmol_L=_HUGE, + hmol=_HUGE,emol=_HUGE,smol=_HUGE,cvmol=_HUGE,cpmol=_HUGE, + w=_HUGE,q=_HUGE, mm=_HUGE, p_kPa = _HUGE; + long ierr; + char herr[255]; + + clear(); + + // Check that mole fractions have been set, etc. + check_status(); + + // Get the molar mass of the fluid for the given composition + WMOLdll(&(mole_fractions[0]), &mm); // returns mole mass in kg/kmol + _molar_mass = 0.001*mm; // [kg/mol] + + + + switch(input_pair) + { + case PT_INPUTS: + { + // Unit conversion for REFPROP + p_kPa = 0.001*value1; _T = value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + TPFLSHdll(&_T,&p_kPa,&(mole_fractions[0]),&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions[0]), // Saturation terms + &q,&emol,&hmol,&smol,&cvmol,&cpmol,&w, + &ierr,herr,errormessagelength); // + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = value1; + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmolarT_INPUTS: + { + // Unit conversion for REFPROP + _rhomolar = value1; rho_mol_L = 0.001*value1; _T = value2; // Want rho in [mol/L] in REFPROP + + // Use flash routine to find properties + TDFLSHdll(&_T,&rho_mol_L,&(mole_fractions[0]),&p_kPa, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&hmol,&smol,&cvmol,&cpmol,&w, + &ierr,herr,errormessagelength); + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmassT_INPUTS: + { + // Call again, but this time with molar units + // D: [kg/m^3] / [kg/mol] -> [mol/m^3] + update(DmolarT_INPUTS, value1 / (double)_molar_mass, value2); + return; + } + case DmolarP_INPUTS: + { + // Unit conversion for REFPROP + rho_mol_L = 0.001*value1; p_kPa = 0.001*value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + // from REFPROP: subroutine PDFLSH (p,D,z,t,Dl,Dv,x,y,q,e,h,s,cv,cp,w,ierr,herr) + PDFLSHdll(&p_kPa,&rho_mol_L,&(mole_fractions[0]),&_T, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&hmol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _rhomolar = value1; + _p = value2; + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmassP_INPUTS: + { + // Call again, but this time with molar units + // D: [kg/m^3] / [kg/mol] -> [mol/m^3] + update(DmolarP_INPUTS, value1 / (double)_molar_mass, value2); + return; + } + case DmolarHmolar_INPUTS: + { + // Unit conversion for REFPROP + _rhomolar = value1; rho_mol_L = 0.001*value1; hmol = value2; // Want rho in [mol/L] in REFPROP + + // Use flash routine to find properties + // from REFPROP: subroutine DHFLSH (D,h,z,t,p,Dl,Dv,x,y,q,e,s,cv,cp,w,ierr,herr) + DHFLSHdll(&rho_mol_L,&hmol,&(mole_fractions[0]),&_T,&p_kPa, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&smol,&cvmol,&cpmol,&w, + &ierr,herr,errormessagelength); + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmassHmass_INPUTS: + { + // Call again, but this time with molar units + // D: [kg/m^3] / [kg/mol] -> [mol/m^3] + // H: [J/kg] * [kg/mol] -> [J/mol] + update(DmolarHmolar_INPUTS, value1 / (double)_molar_mass, value2 * (double)_molar_mass); + return; + } + case DmolarSmolar_INPUTS: + { + // Unit conversion for REFPROP + _rhomolar = value1; rho_mol_L = 0.001*value1; smol = value2; // Want rho in [mol/L] in REFPROP + + // Use flash routine to find properties + // from REFPROP: subroutine DSFLSH (D,s,z,t,p,Dl,Dv,x,y,q,e,h,cv,cp,w,ierr,herr) + DSFLSHdll(&rho_mol_L,&smol,&(mole_fractions[0]),&_T,&p_kPa, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&hmol,&cvmol,&cpmol,&w, + &ierr,herr,errormessagelength); + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmassSmass_INPUTS: + { + // Call again, but this time with molar units + // D: [kg/m^3] / [kg/mol] -> [mol/m^3] + // S: [J/kg/K] * [kg/mol] -> [J/mol/K] + update(DmolarSmolar_INPUTS, value1 / (double)_molar_mass, value2 * (double)_molar_mass ); + return; + } + case DmolarUmolar_INPUTS: + { + // Unit conversion for REFPROP + _rhomolar = value1; rho_mol_L = 0.001*value1; emol = value2; // Want rho in [mol/L] in REFPROP + + // Use flash routine to find properties + // from REFPROP: subroutine DEFLSH (D,e,z,t,p,Dl,Dv,x,y,q,h,s,cv,cp,w,ierr,herr) + DEFLSHdll(&rho_mol_L,&emol,&(mole_fractions[0]),&_T,&p_kPa, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&hmol,&hmol,&cvmol,&cpmol,&w, + &ierr,herr,errormessagelength); + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case DmassUmass_INPUTS: + { + // Call again, but this time with molar units + // D: [kg/m^3] / [kg/mol] -> [mol/m^3] + // U: [J/mol] * [kg/mol] -> [J/mol] + update(DmolarUmolar_INPUTS, value1 / (double)_molar_mass, value2 * (double)_molar_mass); + return; + } + case HmolarP_INPUTS: + { + // Unit conversion for REFPROP + hmol = value1; p_kPa = 0.001*value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + PHFLSHdll(&p_kPa,&hmol,&(mole_fractions[0]),&_T,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = value2; + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case HmassP_INPUTS: + { + // Call again, but this time with molar units + // H: [J/kg] * [kg/mol] -> [J/mol] + update(HmolarP_INPUTS, value1 * (double)_molar_mass, value2); + return; + } + case PSmolar_INPUTS: + { + // Unit conversion for REFPROP + p_kPa = 0.001*value1; smol = value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + PSFLSHdll(&p_kPa,&smol,&(mole_fractions[0]),&_T,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&hmol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = value1; + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case PSmass_INPUTS: + { + // Call again, but this time with molar units + // S: [J/kg/K] * [kg/mol] -> [J/mol/K] + update(PSmolar_INPUTS, value1, value2*(double)_molar_mass); + return; + } + case PUmolar_INPUTS: + { + // Unit conversion for REFPROP + p_kPa = 0.001*value1; emol = value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + // from REFPROP: subroutine PEFLSH (p,e,z,t,D,Dl,Dv,x,y,q,h,s,cv,cp,w,ierr,herr) + PEFLSHdll(&p_kPa,&emol,&(mole_fractions[0]),&_T,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&hmol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = value1; + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case PUmass_INPUTS: + { + // Call again, but this time with molar units + // U: [J/kg] * [kg/mol] -> [J/mol] + update(PUmolar_INPUTS, value1, value2*(double)_molar_mass); + return; + } + case HmolarSmolar_INPUTS: + { + // Unit conversion for REFPROP + hmol = value1; smol = value2; + + HSFLSHdll(&hmol,&smol,&(mole_fractions[0]),&_T,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case HmassSmass_INPUTS: + { + // Call again, but this time with molar units + // H: [J/kg] * [kg/mol] -> [J/mol/K] + // S: [J/kg/K] * [kg/mol] -> [J/mol/K] + update(HmolarSmolar_INPUTS, value1 * (double)_molar_mass, value2 * (double)_molar_mass); + return; + } + case SmolarUmolar_INPUTS: + { + // Unit conversion for REFPROP + smol = value1; emol = value2; + + // from REFPROP: subroutine ESFLSH (e,s,z,t,p,D,Dl,Dv,x,y,q,h,cv,cp,w,ierr,herr) + ESFLSHdll(&emol,&smol,&(mole_fractions[0]),&_T,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case SmassUmass_INPUTS: + { + // Call again, but this time with molar units + // S: [J/kg/K] * [kg/mol] -> [J/mol/K], + // U: [J/kg] * [kg/mol] -> [J/mol] + update(SmolarUmolar_INPUTS, value1 * (double)_molar_mass, value2 * (double)_molar_mass); + return; + } + case SmolarT_INPUTS: + { + // Unit conversion for REFPROP + smol = value1; _T = value2; + + /* + c additional input--only for THFLSH, TSFLSH, and TEFLSH + c kr--flag specifying desired root for multi-valued inputs: + c 1 = return lower density root + c 2 = return higher density root + */ + long kr = 1; + + // from REFPROP: subroutine TSFLSH (t,s,z,kr,p,D,Dl,Dv,x,y,q,e,h,cv,cp,w,ierr,herr) + TSFLSHdll(&_T,&smol,&(mole_fractions[0]),&kr,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&hmol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case SmassT_INPUTS: + { + // Call again, but this time with molar units + // S: [J/kg/K] * [kg/mol] -> [J/mol/K] + update(SmolarT_INPUTS, value1 * (double)_molar_mass, value2 ); + return; + } + case HmolarT_INPUTS: + { + // Unit conversion for REFPROP + hmol = value1; _T = value2; + + /* + c additional input--only for THFLSH, TSFLSH, and TEFLSH + c kr--flag specifying desired root for multi-valued inputs: + c 1 = return lower density root + c 2 = return higher density root + */ + long kr = 1; + + // from REFPROP: subroutine THFLSH (t,h,z,kr,p,D,Dl,Dv,x,y,q,e,s,cv,cp,w,ierr,herr) + THFLSHdll(&_T,&hmol,&(mole_fractions[0]),&kr,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&emol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case HmassT_INPUTS: + { + // Call again, but this time with molar units + // H: [J/kg] * [kg/mol] -> [J/mol] + update(HmolarT_INPUTS, value1 * (double)_molar_mass, value2 ); + return; + } + case TUmolar_INPUTS: + { + // Unit conversion for REFPROP + _T = value1; emol = value2; + + /* + c additional input--only for THFLSH, TSFLSH, and TEFLSH + c kr--flag specifying desired root for multi-valued inputs: + c 1 = return lower density root + c 2 = return higher density root + */ + long kr = 1; + + // from REFPROP: subroutine TEFLSH (t,e,z,kr,p,D,Dl,Dv,x,y,q,h,s,cv,cp,w,ierr,herr) + TEFLSHdll(&_T,&emol,&(mole_fractions[0]),&kr,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &q,&hmol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case TUmass_INPUTS: + { + // Call again, but this time with molar units + // U: [J/kg] * [kg/mol] -> [J/mol] + update(TUmolar_INPUTS, value1, value2 * (double)_molar_mass); + return; + } + case PQ_INPUTS: + { + /* From REFPROP: + additional input--only for TQFLSH and PQFLSH + kq--flag specifying units for input quality + kq = 1 quality on MOLAR basis [moles vapor/total moles] + kq = 2 quality on MASS basis [mass vapor/total mass] + */ + long kq = 1; + + // Unit conversion for REFPROP + p_kPa = 0.001*value1; _Q = value2; // Want p in [kPa] in REFPROP + + // Use flash routine to find properties + PQFLSHdll(&p_kPa,&_Q,&(mole_fractions[0]),&kq,&_T,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &emol,&hmol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = value1; + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + case QT_INPUTS: + { + /* From REFPROP: + additional input--only for TQFLSH and PQFLSH + kq--flag specifying units for input quality + kq = 1 quality on MOLAR basis [moles vapor/total moles] + kq = 2 quality on MASS basis [mass vapor/total mass] + */ + long kq = 1; + + // Unit conversion for REFPROP + _Q = value1; _T = value2; + + // Use flash routine to find properties + TQFLSHdll(&_T,&_Q,&(mole_fractions[0]),&kq,&p_kPa,&rho_mol_L, + &rhoLmol_L,&rhoVmol_L,&(mole_fractions_liq[0]),&(mole_fractions_vap[0]), // Saturation terms + &emol,&hmol,&smol,&cvmol,&cpmol,&w, // Other thermodynamic terms + &ierr,herr,errormessagelength); // Error terms + + if (ierr > 0) { throw ValueError(format("%s",herr).c_str()); }// TODO: else if (ierr < 0) {set_warning(format("%s",herr).c_str());} + + // Set all cache values that can be set with unit conversion to SI + _p = p_kPa*1000; // 1000 for conversion from kPa to Pa + _rhomolar = rho_mol_L*1000; // 1000 for conversion from mol/L to mol/m3 + if (0) + { + _rhoLmolar = rhoLmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + _rhoVmolar = rhoVmol_L*1000; // 1000 for conversion from mol/L to mol/m3 + } + break; + } + default: + { + throw ValueError(format("This pair of inputs [%s] is not yet supported", get_input_pair_short_desc(input_pair).c_str())); + } + + }; + // Set these common variables that are used in every flash calculation + _hmolar = hmol; + _smolar = smol; + _umolar = emol; + _cvmolar = cvmol; + _cpmolar = cpmol; + _speed_sound = w; +} + +} /* namespace CoolProp */ diff --git a/src/Backends/REFPROPMixtureBackend.h b/src/Backends/REFPROPMixtureBackend.h new file mode 100644 index 00000000..1cce9f7d --- /dev/null +++ b/src/Backends/REFPROPMixtureBackend.h @@ -0,0 +1,91 @@ +/* + * AbstractBackend.h + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#ifndef REFPROPMIXTUREBACKEND_H_ +#define REFPROPMIXTUREBACKEND_H_ + +#include "AbstractState.h" + +#include + +namespace CoolProp { + +class REFPROPMixtureBackend : public AbstractState { +protected: + int Ncomp; + bool _mole_fractions_set; + static bool _REFPROP_supported; + std::vector mole_fractions, mass_fractions; + std::vector mole_fractions_liq, mole_fractions_vap; +public: + REFPROPMixtureBackend(){}; + + /// The instantiator + /// @param fluid_names The vector of strings of the fluid components, without file ending + REFPROPMixtureBackend(const std::vector& fluid_names); + virtual ~REFPROPMixtureBackend(); + + // REFPROP backend uses mole fractions + bool using_mole_fractions(){return true;} + + /// Updating function for REFPROP + /** + In this function we take a pair of thermodynamic states, those defined in the input_pairs + enumeration and update all the internal variables that we can. REFPROP calculates + a lot of other state variables each time you use a flash routine so we cache all the + outputs that we can, which saves on computational time. + + @param input_pair Integer key from CoolProp::input_pairs to the two inputs that will be passed to the function + @param value1 First input value + @param value2 Second input value + */ + void update(long input_pair, + double value1, + double value2 + ); + + /// Returns true if REFPROP is supported on this platform + bool REFPROP_supported(void); + + /// Set the fluids in REFPROP DLL by calling the SETUPdll function + /** + @param fluid_names The vector of strings of the fluid components, without file ending + */ + void set_REFPROP_fluids(const std::vector &fluid_names); + + /// Set the mole fractions + /** + @param mole_fractions The vector of mole fractions of the components + */ + void set_mole_fractions(const std::vector &mole_fractions); + + /// Set the mass fractions + /** + @param mass_fractions The vector of mass fractions of the components + */ + void set_mass_fractions(const std::vector &mass_fractions); + + /// Check if the mole fractions have been set, etc. + void check_status(); + + /// Get the viscosity [Pa-s] (based on the temperature and density in the state class) + long double calc_viscosity(void); + /// Get the thermal conductivity [W/m/K] (based on the temperature and density in the state class) + long double calc_conductivity(void); + /// Get the surface tension [N/m] (based on the temperature in the state class). Invalid for temperatures above critical point or below triple point temperature + long double calc_surface_tension(void); + + long double calc_fugacity_coefficient(int i); + + long double calc_melt_p_T(long double T); + long double calc_melt_T_p(long double p); + long double calc_melt_rho_T(long double T); + double calc_melt_Tmax(); +}; + +} /* namespace CoolProp */ +#endif /* REFPROPMIXTUREBACKEND_H_ */ diff --git a/src/Backends/REFPROP_lib.h b/src/Backends/REFPROP_lib.h new file mode 100644 index 00000000..6741433c --- /dev/null +++ b/src/Backends/REFPROP_lib.h @@ -0,0 +1,893 @@ + +#ifndef REFPROP_LIB_H +#define REFPROP_LIB_H + +/* +// The idea here is to have a common header for Windows +// and gcc-like systems. The Windows branch should cover the +// functions provided by the .dll and the gcc part covers +// the compiled .so/.dym file. Name changes caused by gfortran +// are respected and should be accounted for. +*/ +// Get the platform identifiers +#include "CoolPropTools.h" + +// Do some manual changes to the function names +// if needed, uses CoolProp platform detection. +#if defined(__ISWINDOWS__) +// Define compiler specific calling conventions +// for the shared library. +# define CALLCONV __stdcall // __declspec(dllexport) +// Do not redefine function names for the shared library, +// in this case it is the REFPROP.dll and no special +// names are needed. Macros still need a value for the +// name function used below. +# define RPVersion RPVersion +# define SETPATHdll SETPATHdll +# define ABFL1dll ABFL1dll +# define ABFL2dll ABFL2dll +# define ACTVYdll ACTVYdll +# define AGdll AGdll +# define CCRITdll CCRITdll +# define CP0dll CP0dll +# define CRITPdll CRITPdll +# define CSATKdll CSATKdll +# define CV2PKdll CV2PKdll +# define CVCPKdll CVCPKdll +# define CVCPdll CVCPdll +# define DBDTdll DBDTdll +# define DBFL1dll DBFL1dll +# define DBFL2dll DBFL2dll +# define DDDPdll DDDPdll +# define DDDTdll DDDTdll +# define DEFLSHdll DEFLSHdll +# define DHD1dll DHD1dll +# define DHFL1dll DHFL1dll +# define DHFL2dll DHFL2dll +# define DHFLSHdll DHFLSHdll +# define DIELECdll DIELECdll +# define DOTFILLdll DOTFILLdll +# define DPDD2dll DPDD2dll +# define DPDDKdll DPDDKdll +# define DPDDdll DPDDdll +# define DPDTKdll DPDTKdll +# define DPDTdll DPDTdll +# define DPTSATKdll DPTSATKdll +# define DSFLSHdll DSFLSHdll +# define DSFL1dll DSFL1dll +# define DSFL2dll DSFL2dll +# define ENTHALdll ENTHALdll +# define ENTROdll ENTROdll +# define ESFLSHdll ESFLSHdll +# define FGCTYdll FGCTYdll +# define FUGCOFdll FUGCOFdll +# define FPVdll FPVdll +# define GERG04dll GERG04dll +# define GETFIJdll GETFIJdll +# define GETKTVdll GETKTVdll +# define GIBBSdll GIBBSdll +# define HSFLSHdll HSFLSHdll +# define INFOdll INFOdll +# define LIMITKdll LIMITKdll +# define LIMITSdll LIMITSdll +# define LIMITXdll LIMITXdll +# define MELTPdll MELTPdll +# define MELTTdll MELTTdll +# define MLTH2Odll MLTH2Odll +# define NAMEdll NAMEdll +# define PDFL1dll PDFL1dll +# define PDFLSHdll PDFLSHdll +# define PEFLSHdll PEFLSHdll +# define PHFL1dll PHFL1dll +# define PHFLSHdll PHFLSHdll +# define PQFLSHdll PQFLSHdll +# define PREOSdll PREOSdll +# define PRESSdll PRESSdll +# define PSFL1dll PSFL1dll +# define PSFLSHdll PSFLSHdll +# define PUREFLDdll PUREFLDdll +# define QMASSdll QMASSdll +# define QMOLEdll QMOLEdll +# define RESIDUALdll RESIDUALdll +# define SATDdll SATDdll +# define SATEdll SATEdll +# define SATHdll SATHdll +# define SATPdll SATPdll +# define SATSdll SATSdll +# define SATTdll SATTdll +# define SETAGAdll SETAGAdll +# define SETKTVdll SETKTVdll +# define SETMIXdll SETMIXdll +# define SETMODdll SETMODdll +# define SETREFdll SETREFdll +# define SETUPdll SETUPdll +//# define SPECGRdll SPECGRdll // not found in library +# define SUBLPdll SUBLPdll +# define SUBLTdll SUBLTdll +# define SURFTdll SURFTdll +# define SURTENdll SURTENdll +# define TDFLSHdll TDFLSHdll +# define TEFLSHdll TEFLSHdll +# define THERM0dll THERM0dll +# define THERM2dll THERM2dll +# define THERM3dll THERM3dll +# define THERMdll THERMdll +# define THFLSHdll THFLSHdll +# define TPFLSHdll TPFLSHdll +# define TPFL2dll TPFL2dll +# define TPRHOdll TPRHOdll +# define TQFLSHdll TQFLSHdll +# define TRNPRPdll TRNPRPdll +# define TSFLSHdll TSFLSHdll +# define VIRBdll VIRBdll +# define VIRCdll VIRCdll +# define WMOLdll WMOLdll +# define XMASSdll XMASSdll +# define XMOLEdll XMOLEdll +#elif defined(__ISLINUX__) // defined(__ISWINDOWS__) +// Define compiler specific calling conventions +// for the shared library. +# define CALLCONV +// Define function names for the shared library, +// in this case it is the librefprop.so and the +// names might change on some systems during +// the compilation of the Fortran files. +// Possible other branches for this code could be: +// # if !defined(_AIX) +// # if !defined(__hpux) +// # ifdef _CRAY +// However, I cannot test that and therefore do not include it. +# define RPVersion rpversion_ +# define SETPATHdll setpathdll_ +# define ABFL1dll abfl1dll_ +# define ABFL2dll abfl2dll_ +# define ACTVYdll actvydll_ +# define AGdll agdll_ +# define CCRITdll ccritdll_ +# define CP0dll cp0dll_ +# define CRITPdll critpdll_ +# define CSATKdll csatkdll_ +# define CV2PKdll cv2pkdll_ +# define CVCPKdll cvcpkdll_ +# define CVCPdll cvcpdll_ +# define DBDTdll dbdtdll_ +# define DBFL1dll dbfl1dll_ +# define DBFL2dll dbfl2dll_ +# define DDDPdll dddpdll_ +# define DDDTdll dddtdll_ +# define DEFLSHdll deflshdll_ +# define DHD1dll dhd1dll_ +# define DHFL1dll dhfl1dll_ +# define DHFL2dll dhfl2dll_ +# define DHFLSHdll dhflshdll_ +# define DIELECdll dielecdll_ +# define DOTFILLdll dotfilldll_ +# define DPDD2dll dpdd2dll_ +# define DPDDKdll dpddkdll_ +# define DPDDdll dpdddll_ +# define DPDTKdll dpdtkdll_ +# define DPDTdll dpdtdll_ +# define DPTSATKdll dptsatkdll_ +# define DSFLSHdll dsflshdll_ +# define DSFL1dll dsfl1dll_ +# define DSFL2dll dsfl2dll_ +# define ENTHALdll enthaldll_ +# define ENTROdll entrodll_ +# define ESFLSHdll esflshdll_ +# define FGCTYdll fgctydll_ +# define FUGCOFdll fugcofdll_ +# define FPVdll fpvdll_ +# define GERG04dll gerg04dll_ +# define GETFIJdll getfijdll_ +# define GETKTVdll getktvdll_ +# define GIBBSdll gibbsdll_ +# define HSFLSHdll hsflshdll_ +# define INFOdll infodll_ +# define LIMITKdll limitkdll_ +# define LIMITSdll limitsdll_ +# define LIMITXdll limitxdll_ +# define MELTPdll meltpdll_ +# define MELTTdll melttdll_ +# define MLTH2Odll mlth2odll_ +# define NAMEdll namedll_ +# define PDFL1dll pdfl1dll_ +# define PDFLSHdll pdflshdll_ +# define PEFLSHdll peflshdll_ +# define PHFL1dll phfl1dll_ +# define PHFLSHdll phflshdll_ +# define PQFLSHdll pqflshdll_ +# define PREOSdll preosdll_ +# define PRESSdll pressdll_ +# define PSFL1dll psfl1dll_ +# define PSFLSHdll psflshdll_ +# define PUREFLDdll pureflddll_ +# define QMASSdll qmassdll_ +# define QMOLEdll qmoledll_ +# define RESIDUALdll residualdll_ +# define SATDdll satddll_ +# define SATEdll satedll_ +# define SATHdll sathdll_ +# define SATPdll satpdll_ +# define SATSdll satsdll_ +# define SATTdll sattdll_ +# define SETAGAdll setagadll_ +# define SETKTVdll setktvdll_ +# define SETMIXdll setmixdll_ +# define SETMODdll setmoddll_ +# define SETREFdll setrefdll_ +# define SETUPdll setupdll_ +//# define SPECGRdll specgrdll_ // not found in library +# define SUBLPdll sublpdll_ +# define SUBLTdll subltdll_ +# define SURFTdll surftdll_ +# define SURTENdll surtendll_ +# define TDFLSHdll tdflshdll_ +# define TEFLSHdll teflshdll_ +# define THERM0dll therm0dll_ +# define THERM2dll therm2dll_ +# define THERM3dll therm3dll_ +# define THERMdll thermdll_ +# define THFLSHdll thflshdll_ +# define TPFLSHdll tpflshdll_ +# define TPFL2dll tpfl2dll_ +# define TPRHOdll tprhodll_ +# define TQFLSHdll tqflshdll_ +# define TRNPRPdll trnprpdll_ +# define TSFLSHdll tsflshdll_ +# define VIRBdll virbdll_ +# define VIRCdll vircdll_ +# define WMOLdll wmoldll_ +# define XMASSdll xmassdll_ +# define XMOLEdll xmoledll_ +#elif defined(__ISAPPLE__) // defined(__ISLINUX__) +// Define compiler specific calling conventions +// for the shared library. +# define CALLCONV +# define RPVersion rpversion_ +# define SETPATHdll setpathdll_ +# define ABFL1dll abfl1dll_ +# define ABFL2dll abfl2dll_ +# define ACTVYdll actvydll_ +# define AGdll agdll_ +# define CCRITdll ccritdll_ +# define CP0dll cp0dll_ +# define CRITPdll critpdll_ +# define CSATKdll csatkdll_ +# define CV2PKdll cv2pkdll_ +# define CVCPKdll cvcpkdll_ +# define CVCPdll cvcpdll_ +# define DBDTdll dbdtdll_ +# define DBFL1dll dbfl1dll_ +# define DBFL2dll dbfl2dll_ +# define DDDPdll dddpdll_ +# define DDDTdll dddtdll_ +# define DEFLSHdll deflshdll_ +# define DHD1dll dhd1dll_ +# define DHFL1dll dhfl1dll_ +# define DHFL2dll dhfl2dll_ +# define DHFLSHdll dhflshdll_ +# define DIELECdll dielecdll_ +# define DOTFILLdll dotfilldll_ +# define DPDD2dll dpdd2dll_ +# define DPDDKdll dpddkdll_ +# define DPDDdll dpdddll_ +# define DPDTKdll dpdtkdll_ +# define DPDTdll dpdtdll_ +# define DPTSATKdll dptsatkdll_ +# define DSFLSHdll dsflshdll_ +# define DSFL1dll dsfl1dll_ +# define DSFL2dll dsfl2dll_ +# define ENTHALdll enthaldll_ +# define ENTROdll entrodll_ +# define ESFLSHdll esflshdll_ +# define FGCTYdll fgctydll_ +# define FUGCOFdll fugcofdll_ +# define FPVdll fpvdll_ +# define GERG04dll gerg04dll_ +# define GETFIJdll getfijdll_ +# define GETKTVdll getktvdll_ +# define GIBBSdll gibbsdll_ +# define HSFLSHdll hsflshdll_ +# define INFOdll infodll_ +# define LIMITKdll limitkdll_ +# define LIMITSdll limitsdll_ +# define LIMITXdll limitxdll_ +# define MELTPdll meltpdll_ +# define MELTTdll melttdll_ +# define MLTH2Odll mlth2odll_ +# define NAMEdll namedll_ +# define PDFL1dll pdfl1dll_ +# define PDFLSHdll pdflshdll_ +# define PEFLSHdll peflshdll_ +# define PHFL1dll phfl1dll_ +# define PHFLSHdll phflshdll_ +# define PQFLSHdll pqflshdll_ +# define PREOSdll preosdll_ +# define PRESSdll pressdll_ +# define PSFL1dll psfl1dll_ +# define PSFLSHdll psflshdll_ +# define PUREFLDdll pureflddll_ +# define QMASSdll qmassdll_ +# define QMOLEdll qmoledll_ +# define RESIDUALdll residualdll_ +# define SATDdll satddll_ +# define SATEdll satedll_ +# define SATHdll sathdll_ +# define SATPdll satpdll_ +# define SATSdll satsdll_ +# define SATTdll sattdll_ +# define SETAGAdll setagadll_ +# define SETKTVdll setktvdll_ +# define SETMIXdll setmixdll_ +# define SETMODdll setmoddll_ +# define SETREFdll setrefdll_ +# define SETUPdll setupdll_ +//# define SPECGRdll specgrdll_ // not found in library +# define SUBLPdll sublpdll_ +# define SUBLTdll subltdll_ +# define SURFTdll surftdll_ +# define SURTENdll surtendll_ +# define TDFLSHdll tdflshdll_ +# define TEFLSHdll teflshdll_ +# define THERM0dll therm0dll_ +# define THERM2dll therm2dll_ +# define THERM3dll therm3dll_ +# define THERMdll thermdll_ +# define THFLSHdll thflshdll_ +# define TPFLSHdll tpflshdll_ +# define TPFL2dll tpfl2dll_ +# define TPRHOdll tprhodll_ +# define TQFLSHdll tqflshdll_ +# define TRNPRPdll trnprpdll_ +# define TSFLSHdll tsflshdll_ +# define VIRBdll virbdll_ +# define VIRCdll vircdll_ +# define WMOLdll wmoldll_ +# define XMASSdll xmassdll_ +# define XMOLEdll xmoledll_ +#else // #elif defined(__ISAPPLE__) +// Set some dummy names for the compiler +# define CALLCONV +# define RPVersion NOTAVAILABLE +# define SETPATHdll setpathdll +# define ABFL1dll abfl1dll +# define ABFL2dll abfl2dll +# define ACTVYdll actvydll +# define AGdll agdll +# define CCRITdll ccritdll +# define CP0dll cp0dll +# define CRITPdll critpdll +# define CSATKdll csatkdll +# define CV2PKdll cv2pkdll +# define CVCPKdll cvcpkdll +# define CVCPdll cvcpdll +# define DBDTdll dbdtdll +# define DBFL1dll dbfl1dll +# define DBFL2dll dbfl2dll +# define DDDPdll dddpdll +# define DDDTdll dddtdll +# define DEFLSHdll deflshdll +# define DHD1dll dhd1dll +# define DHFL1dll dhfl1dll +# define DHFL2dll dhfl2dll +# define DHFLSHdll dhflshdll +# define DIELECdll dielecdll +# define DOTFILLdll dotfilldll +# define DPDD2dll dpdd2dll +# define DPDDKdll dpddkdll +# define DPDDdll dpdddll +# define DPDTKdll dpdtkdll +# define DPDTdll dpdtdll +# define DPTSATKdll dptsatkdll +# define DSFLSHdll dsflshdll +# define DSFL1dll dsfl1dll +# define DSFL2dll dsfl2dll +# define ENTHALdll enthaldll +# define ENTROdll entrodll +# define ESFLSHdll esflshdll +# define FGCTYdll fgctydll +# define FPVdll fpvdll +# define GERG04dll gerg04dll +# define GETFIJdll getfijdll +# define GETKTVdll getktvdll +# define GIBBSdll gibbsdll +# define HSFLSHdll hsflshdll +# define INFOdll infodll +# define LIMITKdll limitkdll +# define LIMITSdll limitsdll +# define LIMITXdll limitxdll +# define MELTPdll meltpdll +# define MELTTdll melttdll +# define MLTH2Odll mlth2odll +# define NAMEdll namedll +# define PDFL1dll pdfl1dll +# define PDFLSHdll pdflshdll +# define PEFLSHdll peflshdll +# define PHFL1dll phfl1dll +# define PHFLSHdll phflshdll +# define PQFLSHdll pqflshdll +# define PREOSdll preosdll +# define PRESSdll pressdll +# define PSFL1dll psfl1dll +# define PSFLSHdll psflshdll +# define PUREFLDdll pureflddll +# define QMASSdll qmassdll +# define QMOLEdll qmoledll +# define RESIDUALdll residualdll +# define SATDdll satddll +# define SATEdll satedll +# define SATHdll sathdll +# define SATPdll satpdll +# define SATSdll satsdll +# define SATTdll sattdll +# define SETAGAdll setagadll +# define SETKTVdll setktvdll +# define SETMIXdll setmixdll +# define SETMODdll setmoddll +# define SETREFdll setrefdll +# define SETUPdll setupdll +//# define SPECGRdll specgrdll // not found in library +# define SUBLPdll sublpdll +# define SUBLTdll subltdll +# define SURFTdll surftdll +# define SURTENdll surtendll +# define TDFLSHdll tdflshdll +# define TEFLSHdll teflshdll +# define THERM0dll therm0dll +# define THERM2dll therm2dll +# define THERM3dll therm3dll +# define THERMdll thermdll +# define THFLSHdll thflshdll +# define TPFLSHdll tpflshdll +# define TPFL2dll tpfl2dll +# define TPRHOdll tprhodll +# define TQFLSHdll tqflshdll +# define TRNPRPdll trnprpdll +# define TSFLSHdll tsflshdll +# define VIRBdll virbdll +# define VIRCdll vircdll +# define WMOLdll wmoldll +# define XMASSdll xmassdll +# define XMOLEdll xmoledll +#endif // else branch +// +// +// Only continue if function names have been defined. +// We might want to include some more tests here... +#if defined(RPVersion) +// define new macros for function names +// http://stackoverflow.com/questions/195975/how-to-make-a-char-string-from-a-c-macros-value +#include +#define STR_VALUE(arg) #arg +#define FUNCTION_NAME(name) STR_VALUE(name) +// +// Prepare the strings to be used by the functions that +// handle the library later on. +#define RPVersion_NAME FUNCTION_NAME(RPVersion) +#define SETPATHdll_NAME FUNCTION_NAME(SETPATHdll) +#define ABFL1dll_NAME FUNCTION_NAME(ABFL1dll) +#define ABFL2dll_NAME FUNCTION_NAME(ABFL2dll) +#define ACTVYdll_NAME FUNCTION_NAME(ACTVYdll) +#define AGdll_NAME FUNCTION_NAME(AGdll) +#define CCRITdll_NAME FUNCTION_NAME(CCRITdll) +#define CP0dll_NAME FUNCTION_NAME(CP0dll) +#define CRITPdll_NAME FUNCTION_NAME(CRITPdll) +#define CSATKdll_NAME FUNCTION_NAME(CSATKdll) +#define CV2PKdll_NAME FUNCTION_NAME(CV2PKdll) +#define CVCPKdll_NAME FUNCTION_NAME(CVCPKdll) +#define CVCPdll_NAME FUNCTION_NAME(CVCPdll) +#define DBDTdll_NAME FUNCTION_NAME(DBDTdll) +#define DBFL1dll_NAME FUNCTION_NAME(DBFL1dll) +#define DBFL2dll_NAME FUNCTION_NAME(DBFL2dll) +#define DDDPdll_NAME FUNCTION_NAME(DDDPdll) +#define DDDTdll_NAME FUNCTION_NAME(DDDTdll) +#define DEFLSHdll_NAME FUNCTION_NAME(DEFLSHdll) +#define DHD1dll_NAME FUNCTION_NAME(DHD1dll) +#define DHFL1dll_NAME FUNCTION_NAME(DHFL1dll) +#define DHFL2dll_NAME FUNCTION_NAME(DHFL2dll) +#define DHFLSHdll_NAME FUNCTION_NAME(DHFLSHdll) +#define DIELECdll_NAME FUNCTION_NAME(DIELECdll) +#define DOTFILLdll_NAME FUNCTION_NAME(DOTFILLdll) +#define DPDD2dll_NAME FUNCTION_NAME(DPDD2dll) +#define DPDDKdll_NAME FUNCTION_NAME(DPDDKdll) +#define DPDDdll_NAME FUNCTION_NAME(DPDDdll) +#define DPDTKdll_NAME FUNCTION_NAME(DPDTKdll) +#define DPDTdll_NAME FUNCTION_NAME(DPDTdll) +#define DPTSATKdll_NAME FUNCTION_NAME(DPTSATKdll) +#define DSFLSHdll_NAME FUNCTION_NAME(DSFLSHdll) +#define DSFL1dll_NAME FUNCTION_NAME(DSFL1dll) +#define DSFL2dll_NAME FUNCTION_NAME(DSFL2dll) +#define ENTHALdll_NAME FUNCTION_NAME(ENTHALdll) +#define ENTROdll_NAME FUNCTION_NAME(ENTROdll) +#define ESFLSHdll_NAME FUNCTION_NAME(ESFLSHdll) +#define FGCTYdll_NAME FUNCTION_NAME(FGCTYdll) +#define FUGCOFdll_NAME FUNCTION_NAME(FUGCOFdll) +#define FPVdll_NAME FUNCTION_NAME(FPVdll) +#define GERG04dll_NAME FUNCTION_NAME(GERG04dll) +#define GETFIJdll_NAME FUNCTION_NAME(GETFIJdll) +#define GETKTVdll_NAME FUNCTION_NAME(GETKTVdll) +#define GIBBSdll_NAME FUNCTION_NAME(GIBBSdll) +#define HSFLSHdll_NAME FUNCTION_NAME(HSFLSHdll) +#define INFOdll_NAME FUNCTION_NAME(INFOdll) +#define LIMITKdll_NAME FUNCTION_NAME(LIMITKdll) +#define LIMITSdll_NAME FUNCTION_NAME(LIMITSdll) +#define LIMITXdll_NAME FUNCTION_NAME(LIMITXdll) +#define MELTPdll_NAME FUNCTION_NAME(MELTPdll) +#define MELTTdll_NAME FUNCTION_NAME(MELTTdll) +#define MLTH2Odll_NAME FUNCTION_NAME(MLTH2Odll) +#define NAMEdll_NAME FUNCTION_NAME(NAMEdll) +#define PDFL1dll_NAME FUNCTION_NAME(PDFL1dll) +#define PDFLSHdll_NAME FUNCTION_NAME(PDFLSHdll) +#define PEFLSHdll_NAME FUNCTION_NAME(PEFLSHdll) +#define PHFL1dll_NAME FUNCTION_NAME(PHFL1dll) +#define PHFLSHdll_NAME FUNCTION_NAME(PHFLSHdll) +#define PQFLSHdll_NAME FUNCTION_NAME(PQFLSHdll) +#define PREOSdll_NAME FUNCTION_NAME(PREOSdll) +#define PRESSdll_NAME FUNCTION_NAME(PRESSdll) +#define PSFL1dll_NAME FUNCTION_NAME(PSFL1dll) +#define PSFLSHdll_NAME FUNCTION_NAME(PSFLSHdll) +#define PUREFLDdll_NAME FUNCTION_NAME(PUREFLDdll) +#define QMASSdll_NAME FUNCTION_NAME(QMASSdll) +#define QMOLEdll_NAME FUNCTION_NAME(QMOLEdll) +#define RESIDUALdll_NAME FUNCTION_NAME(RESIDUALdll) +#define SATDdll_NAME FUNCTION_NAME(SATDdll) +#define SATEdll_NAME FUNCTION_NAME(SATEdll) +#define SATHdll_NAME FUNCTION_NAME(SATHdll) +#define SATPdll_NAME FUNCTION_NAME(SATPdll) +#define SATSdll_NAME FUNCTION_NAME(SATSdll) +#define SATTdll_NAME FUNCTION_NAME(SATTdll) +#define SETAGAdll_NAME FUNCTION_NAME(SETAGAdll) +#define SETKTVdll_NAME FUNCTION_NAME(SETKTVdll) +#define SETMIXdll_NAME FUNCTION_NAME(SETMIXdll) +#define SETMODdll_NAME FUNCTION_NAME(SETMODdll) +#define SETREFdll_NAME FUNCTION_NAME(SETREFdll) +#define SETUPdll_NAME FUNCTION_NAME(SETUPdll) +//#define SPECGRdll_NAME FUNCTION_NAME(SPECGRdll) // not found in library +#define SUBLPdll_NAME FUNCTION_NAME(SUBLPdll) +#define SUBLTdll_NAME FUNCTION_NAME(SUBLTdll) +#define SURFTdll_NAME FUNCTION_NAME(SURFTdll) +#define SURTENdll_NAME FUNCTION_NAME(SURTENdll) +#define TDFLSHdll_NAME FUNCTION_NAME(TDFLSHdll) +#define TEFLSHdll_NAME FUNCTION_NAME(TEFLSHdll) +#define THERM0dll_NAME FUNCTION_NAME(THERM0dll) +#define THERM2dll_NAME FUNCTION_NAME(THERM2dll) +#define THERM3dll_NAME FUNCTION_NAME(THERM3dll) +#define THERMdll_NAME FUNCTION_NAME(THERMdll) +#define THFLSHdll_NAME FUNCTION_NAME(THFLSHdll) +#define TPFLSHdll_NAME FUNCTION_NAME(TPFLSHdll) +#define TPFL2dll_NAME FUNCTION_NAME(TPFL2dll) +#define TPRHOdll_NAME FUNCTION_NAME(TPRHOdll) +#define TQFLSHdll_NAME FUNCTION_NAME(TQFLSHdll) +#define TRNPRPdll_NAME FUNCTION_NAME(TRNPRPdll) +#define TSFLSHdll_NAME FUNCTION_NAME(TSFLSHdll) +#define VIRBdll_NAME FUNCTION_NAME(VIRBdll) +#define VIRCdll_NAME FUNCTION_NAME(VIRCdll) +#define WMOLdll_NAME FUNCTION_NAME(WMOLdll) +#define XMASSdll_NAME FUNCTION_NAME(XMASSdll) +#define XMOLEdll_NAME FUNCTION_NAME(XMOLEdll) +// +// I'll try to follow this example from: +// http://www.gershnik.com/tips/cpp.asp +// function type: typedef void [compiler stuff] func_t(int, float); +// function declaration: func_t func; +// pointer type: typedef func_t * func_ptr; +#ifdef __cplusplus +extern "C" { +#endif + // For C calling conventions, replaced all "double &" with "double *", and "long &" with "long *" + typedef void (CALLCONV RPVersion_TYPE)( char* ); + typedef void (CALLCONV SETPATHdll_TYPE)( const char* ); + // + typedef void (CALLCONV ABFL1dll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV ABFL2dll_TYPE)(double *,double *,double *,long *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV ACTVYdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV AGdll_TYPE)(double *,double *,double *,double *,double *); + typedef void (CALLCONV CCRITdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV CP0dll_TYPE)(double *,double *,double *); + typedef void (CALLCONV CRITPdll_TYPE)(double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV CSATKdll_TYPE)(long *,double *,long *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV CV2PKdll_TYPE)(long *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV CVCPKdll_TYPE)(long *,double *,double *,double *,double *); + typedef void (CALLCONV CVCPdll_TYPE)(double *,double *,double *,double *,double *); + typedef void (CALLCONV DBDTdll_TYPE)(double *,double *,double *); + typedef void (CALLCONV DBFL1dll_TYPE)(double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DBFL2dll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DDDPdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DDDTdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DEFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DHD1dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV DHFL1dll_TYPE)(double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DHFL2dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DHFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DIELECdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DOTFILLdll_TYPE)(long *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DPDD2dll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DPDDKdll_TYPE)(long *,double *,double *,double *); + typedef void (CALLCONV DPDDdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DPDTKdll_TYPE)(long *,double *,double *,double *); + typedef void (CALLCONV DPDTdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV DPTSATKdll_TYPE)(long *,double *,long *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DSFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DSFL1dll_TYPE)(double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV DSFL2dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV ENTHALdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV ENTROdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV ESFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV FGCTYdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV FPVdll_TYPE)(double *,double *,double *,double *,double *); + typedef void (CALLCONV FUGCOFdll_TYPE)(double *,double *,double *,double*, long *,char*,long ); + typedef void (CALLCONV GERG04dll_TYPE)(long *,long *,long *,char*,long ); + typedef void (CALLCONV GETFIJdll_TYPE)(char*,double *,char*,char*,long ,long ,long ); + typedef void (CALLCONV GETKTVdll_TYPE)(long *,long *,char*,double *,char*,char*,char*,char*,long ,long ,long ,long ,long ); + typedef void (CALLCONV GIBBSdll_TYPE)(double *,double *,double *,double *,double *); + typedef void (CALLCONV HSFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV INFOdll_TYPE)(long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV LIMITKdll_TYPE)(char*,long *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ,long ); + typedef void (CALLCONV LIMITSdll_TYPE)(char*,double *,double *,double *,double *,double *,long ); + typedef void (CALLCONV LIMITXdll_TYPE)(char*,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ,long ); + typedef void (CALLCONV MELTPdll_TYPE)(double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV MELTTdll_TYPE)(double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV MLTH2Odll_TYPE)(double *,double *,double *); + typedef void (CALLCONV NAMEdll_TYPE)(long *,char*,char*,char*,long ,long ,long ); + typedef void (CALLCONV PDFL1dll_TYPE)(double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PDFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PEFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PHFL1dll_TYPE)(double *,double *,double *,long *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PHFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PQFLSHdll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PREOSdll_TYPE)(long *); + typedef void (CALLCONV PRESSdll_TYPE)(double *,double *,double *,double *); + typedef void (CALLCONV PSFL1dll_TYPE)(double *,double *,double *,long *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PSFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV PUREFLDdll_TYPE)(long *); + typedef void (CALLCONV QMASSdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV QMOLEdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV RESIDUALdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV SATDdll_TYPE)(double *,double *,long *,long *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SATEdll_TYPE)(double *,double *,long *,long *,long *,double *,double *,double *,long *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SATHdll_TYPE)(double *,double *,long *,long *,long *,double *,double *,double *,long *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SATPdll_TYPE)(double *,double *,long *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SATSdll_TYPE)(double *,double *,long *,long *,long *,double *,double *,double *,long *,double *,double *,double *,long *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SATTdll_TYPE)(double *,double *,long *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SETAGAdll_TYPE)(long *,char*,long ); + typedef void (CALLCONV SETKTVdll_TYPE)(long *,long *,char*,double *,char*,long *,char*,long ,long ,long ); + typedef void (CALLCONV SETMIXdll_TYPE)(char*,char*,char*,long *,char*,double *,long *,char*,long ,long ,long ,long ,long ); + typedef void (CALLCONV SETMODdll_TYPE)(long *,char*,char*,char*,long *,char*,long ,long ,long ,long ); + typedef void (CALLCONV SETREFdll_TYPE)(char*,long *,double *,double *,double *,double *,double *,long *,char*,long ,long ); + typedef void (CALLCONV SETUPdll_TYPE)(long *,char*,char*,char*,long *,char*,long ,long ,long ,long ); + //typedef void (CALLCONV SETUPdll_TYPE)(long *,char*,char*,char*,long *,char*); +// typedef void (CALLCONV SPECGRdll_TYPE)(double *,double *,double *,double *); // not found in library + typedef void (CALLCONV SUBLPdll_TYPE)(double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SUBLTdll_TYPE)(double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SURFTdll_TYPE)(double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV SURTENdll_TYPE)(double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TDFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TEFLSHdll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV THERM0dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV THERM2dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV THERM3dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV THERMdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *); + typedef void (CALLCONV THFLSHdll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TPFLSHdll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TPFL2dll_TYPE)(double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TPRHOdll_TYPE)(double *,double *,double *,long *,long *,double *,long *,char*,long ); + typedef void (CALLCONV TQFLSHdll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TRNPRPdll_TYPE)(double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV TSFLSHdll_TYPE)(double *,double *,double *,long *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,double *,long *,char*,long ); + typedef void (CALLCONV VIRBdll_TYPE)(double *,double *,double *); + typedef void (CALLCONV VIRCdll_TYPE)(double *,double *,double *); + typedef void (CALLCONV WMOLdll_TYPE)(double *,double *); + typedef void (CALLCONV XMASSdll_TYPE)(double *,double *,double *); + typedef void (CALLCONV XMOLEdll_TYPE)(double *,double *,double *); + // + // Diabled because we prefer pointers here! +// // Declare the functions for direct access, +// RPVersion_TYPE RPVersion; +// SETPATHdll_TYPE SETPATHdll; +// ABFL1dll_TYPE ABFL1dll; +// ABFL2dll_TYPE ABFL2dll; +// ACTVYdll_TYPE ACTVYdll; +// AGdll_TYPE AGdll; +// CCRITdll_TYPE CCRITdll; +// CP0dll_TYPE CP0dll; +// CRITPdll_TYPE CRITPdll; +// CSATKdll_TYPE CSATKdll; +// CV2PKdll_TYPE CV2PKdll; +// CVCPKdll_TYPE CVCPKdll; +// CVCPdll_TYPE CVCPdll; +// DBDTdll_TYPE DBDTdll; +// DBFL1dll_TYPE DBFL1dll; +// DBFL2dll_TYPE DBFL2dll; +// DDDPdll_TYPE DDDPdll; +// DDDTdll_TYPE DDDTdll; +// DEFLSHdll_TYPE DEFLSHdll; +// DHD1dll_TYPE DHD1dll; +// DHFLSHdll_TYPE DHFLSHdll; +// DHFL1dll_TYPE DHFL1dll; +// DHFL2dll_TYPE DHFL2dll; +// DIELECdll_TYPE DIELECdll; +// DOTFILLdll_TYPE DOTFILLdll; +// DPDD2dll_TYPE DPDD2dll; +// DPDDKdll_TYPE DPDDKdll; +// DPDDdll_TYPE DPDDdll; +// DPDTKdll_TYPE DPDTKdll; +// DPDTdll_TYPE DPDTdll; +// DPTSATKdll_TYPE DPTSATKdll; +// DSFLSHdll_TYPE DSFLSHdll; +// DSFL1dll_TYPE DSFL1dll; +// DSFL2dll_TYPE DSFL2dll; +// ENTHALdll_TYPE ENTHALdll; +// ENTROdll_TYPE ENTROdll; +// ESFLSHdll_TYPE ESFLSHdll; +// FGCTYdll_TYPE FGCTYdll; +// FPVdll_TYPE FPVdll; +// GERG04dll_TYPE GERG04dll; +// GETFIJdll_TYPE GETFIJdll; +// GETKTVdll_TYPE GETKTVdll; +// GIBBSdll_TYPE GIBBSdll; +// HSFLSHdll_TYPE HSFLSHdll; +// INFOdll_TYPE INFOdll; +// LIMITKdll_TYPE LIMITKdll; +// LIMITSdll_TYPE LIMITSdll; +// LIMITXdll_TYPE LIMITXdll; +// MELTPdll_TYPE MELTPdll; +// MELTTdll_TYPE MELTTdll; +// MLTH2Odll_TYPE MLTH2Odll; +// NAMEdll_TYPE NAMEdll; +// PDFL1dll_TYPE PDFL1dll; +// PDFLSHdll_TYPE PDFLSHdll; +// PEFLSHdll_TYPE PEFLSHdll; +// PHFL1dll_TYPE PHFL1dll; +// PHFLSHdll_TYPE PHFLSHdll; +// PQFLSHdll_TYPE PQFLSHdll; +// PREOSdll_TYPE PREOSdll; +// PRESSdll_TYPE PRESSdll; +// PSFL1dll_TYPE PSFL1dll; +// PSFLSHdll_TYPE PSFLSHdll; +// PUREFLDdll_TYPE PUREFLDdll; +// QMASSdll_TYPE QMASSdll; +// QMOLEdll_TYPE QMOLEdll; +// SATDdll_TYPE SATDdll; +// SATEdll_TYPE SATEdll; +// SATHdll_TYPE SATHdll; +// SATPdll_TYPE SATPdll; +// SATSdll_TYPE SATSdll; +// SATTdll_TYPE SATTdll; +// SETAGAdll_TYPE SETAGAdll; +// SETKTVdll_TYPE SETKTVdll; +// SETMIXdll_TYPE SETMIXdll; +// SETMODdll_TYPE SETMODdll; +// SETREFdll_TYPE SETREFdll; +// SETUPdll_TYPE SETUPdll; +//// SPECGRdll_TYPE SPECGRdll; // not found in library +// SUBLPdll_TYPE SUBLPdll; +// SUBLTdll_TYPE SUBLTdll; +// SURFTdll_TYPE SURFTdll; +// SURTENdll_TYPE SURTENdll; +// TDFLSHdll_TYPE TDFLSHdll; +// TEFLSHdll_TYPE TEFLSHdll; +// THERM0dll_TYPE THERM0dll; +// THERM2dll_TYPE THERM2dll; +// THERM3dll_TYPE THERM3dll; +// THERMdll_TYPE THERMdll; +// THFLSHdll_TYPE THFLSHdll; +// TPFLSHdll_TYPE TPFLSHdll; +// TPFL2dll_TYPE TPFL2dll; +// TPRHOdll_TYPE TPRHOdll; +// TQFLSHdll_TYPE TQFLSHdll; +// TRNPRPdll_TYPE TRNPRPdll; +// TSFLSHdll_TYPE TSFLSHdll; +// VIRBdll_TYPE VIRBdll; +// VIRCdll_TYPE VIRCdll; +// WMOLdll_TYPE WMOLdll; +// XMASSdll_TYPE XMASSdll; +// XMOLEdll_TYPE XMOLEdll; + // + // Define explicit function pointers + typedef RPVersion_TYPE * RPVersion_POINTER; + typedef SETPATHdll_TYPE * SETPATHdll_POINTER; + typedef ABFL1dll_TYPE * ABFL1dll_POINTER; + typedef ABFL2dll_TYPE * ABFL2dll_POINTER; + typedef ACTVYdll_TYPE * ACTVYdll_POINTER; + typedef AGdll_TYPE * AGdll_POINTER; + typedef CCRITdll_TYPE * CCRITdll_POINTER; + typedef CP0dll_TYPE * CP0dll_POINTER; + typedef CRITPdll_TYPE * CRITPdll_POINTER; + typedef CSATKdll_TYPE * CSATKdll_POINTER; + typedef CV2PKdll_TYPE * CV2PKdll_POINTER; + typedef CVCPKdll_TYPE * CVCPKdll_POINTER; + typedef CVCPdll_TYPE * CVCPdll_POINTER; + typedef DBDTdll_TYPE * DBDTdll_POINTER; + typedef DBFL1dll_TYPE * DBFL1dll_POINTER; + typedef DBFL2dll_TYPE * DBFL2dll_POINTER; + typedef DDDPdll_TYPE * DDDPdll_POINTER; + typedef DDDTdll_TYPE * DDDTdll_POINTER; + typedef DEFLSHdll_TYPE * DEFLSHdll_POINTER; + typedef DHD1dll_TYPE * DHD1dll_POINTER; + typedef DHFLSHdll_TYPE * DHFLSHdll_POINTER; + typedef DHFL1dll_TYPE * DHFL1dll_POINTER; + typedef DHFL2dll_TYPE * DHFL2dll_POINTER; + typedef DIELECdll_TYPE * DIELECdll_POINTER; + typedef DOTFILLdll_TYPE * DOTFILLdll_POINTER; + typedef DPDD2dll_TYPE * DPDD2dll_POINTER; + typedef DPDDKdll_TYPE * DPDDKdll_POINTER; + typedef DPDDdll_TYPE * DPDDdll_POINTER; + typedef DPDTKdll_TYPE * DPDTKdll_POINTER; + typedef DPDTdll_TYPE * DPDTdll_POINTER; + typedef DPTSATKdll_TYPE * DPTSATKdll_POINTER; + typedef DSFLSHdll_TYPE * DSFLSHdll_POINTER; + typedef DSFL1dll_TYPE * DSFL1dll_POINTER; + typedef DSFL2dll_TYPE * DSFL2dll_POINTER; + typedef ENTHALdll_TYPE * ENTHALdll_POINTER; + typedef ENTROdll_TYPE * ENTROdll_POINTER; + typedef ESFLSHdll_TYPE * ESFLSHdll_POINTER; + typedef FGCTYdll_TYPE * FGCTYdll_POINTER; + typedef FPVdll_TYPE * FPVdll_POINTER; + typedef FUGCOFdll_TYPE * FUGCOFdll_POINTER; + typedef GERG04dll_TYPE * GERG04dll_POINTER; + typedef GETFIJdll_TYPE * GETFIJdll_POINTER; + typedef GETKTVdll_TYPE * GETKTVdll_POINTER; + typedef GIBBSdll_TYPE * GIBBSdll_POINTER; + typedef HSFLSHdll_TYPE * HSFLSHdll_POINTER; + typedef INFOdll_TYPE * INFOdll_POINTER; + typedef LIMITKdll_TYPE * LIMITKdll_POINTER; + typedef LIMITSdll_TYPE * LIMITSdll_POINTER; + typedef LIMITXdll_TYPE * LIMITXdll_POINTER; + typedef MELTPdll_TYPE * MELTPdll_POINTER; + typedef MELTTdll_TYPE * MELTTdll_POINTER; + typedef MLTH2Odll_TYPE * MLTH2Odll_POINTER; + typedef NAMEdll_TYPE * NAMEdll_POINTER; + typedef PDFL1dll_TYPE * PDFL1dll_POINTER; + typedef PDFLSHdll_TYPE * PDFLSHdll_POINTER; + typedef PEFLSHdll_TYPE * PEFLSHdll_POINTER; + typedef PHFL1dll_TYPE * PHFL1dll_POINTER; + typedef PHFLSHdll_TYPE * PHFLSHdll_POINTER; + typedef PQFLSHdll_TYPE * PQFLSHdll_POINTER; + typedef PREOSdll_TYPE * PREOSdll_POINTER; + typedef PRESSdll_TYPE * PRESSdll_POINTER; + typedef PSFL1dll_TYPE * PSFL1dll_POINTER; + typedef PSFLSHdll_TYPE * PSFLSHdll_POINTER; + typedef PUREFLDdll_TYPE * PUREFLDdll_POINTER; + typedef QMASSdll_TYPE * QMASSdll_POINTER; + typedef QMOLEdll_TYPE * QMOLEdll_POINTER; + typedef RESIDUALdll_TYPE * RESIDUALdll_POINTER; + typedef SATDdll_TYPE * SATDdll_POINTER; + typedef SATEdll_TYPE * SATEdll_POINTER; + typedef SATHdll_TYPE * SATHdll_POINTER; + typedef SATPdll_TYPE * SATPdll_POINTER; + typedef SATSdll_TYPE * SATSdll_POINTER; + typedef SATTdll_TYPE * SATTdll_POINTER; + typedef SETAGAdll_TYPE * SETAGAdll_POINTER; + typedef SETKTVdll_TYPE * SETKTVdll_POINTER; + typedef SETMIXdll_TYPE * SETMIXdll_POINTER; + typedef SETMODdll_TYPE * SETMODdll_POINTER; + typedef SETREFdll_TYPE * SETREFdll_POINTER; + typedef SETUPdll_TYPE * SETUPdll_POINTER; +// typedef SPECGRdll_TYPE * SPECGRdll_POINTER; // not found in library + typedef SUBLPdll_TYPE * SUBLPdll_POINTER; + typedef SUBLTdll_TYPE * SUBLTdll_POINTER; + typedef SURFTdll_TYPE * SURFTdll_POINTER; + typedef SURTENdll_TYPE * SURTENdll_POINTER; + typedef TDFLSHdll_TYPE * TDFLSHdll_POINTER; + typedef TEFLSHdll_TYPE * TEFLSHdll_POINTER; + typedef THERM0dll_TYPE * THERM0dll_POINTER; + typedef THERM2dll_TYPE * THERM2dll_POINTER; + typedef THERM3dll_TYPE * THERM3dll_POINTER; + typedef THERMdll_TYPE * THERMdll_POINTER; + typedef THFLSHdll_TYPE * THFLSHdll_POINTER; + typedef TPFLSHdll_TYPE * TPFLSHdll_POINTER; + typedef TPFL2dll_TYPE * TPFL2dll_POINTER; + typedef TPRHOdll_TYPE * TPRHOdll_POINTER; + typedef TQFLSHdll_TYPE * TQFLSHdll_POINTER; + typedef TRNPRPdll_TYPE * TRNPRPdll_POINTER; + typedef TSFLSHdll_TYPE * TSFLSHdll_POINTER; + typedef VIRBdll_TYPE * VIRBdll_POINTER; + typedef VIRCdll_TYPE * VIRCdll_POINTER; + typedef WMOLdll_TYPE * WMOLdll_POINTER; + typedef XMASSdll_TYPE * XMASSdll_POINTER; + typedef XMOLEdll_TYPE * XMOLEdll_POINTER; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus +#endif // defined(RPversion) +#endif // REFPROP_LIB_H diff --git a/src/Backends/ReducingFunctions.cpp b/src/Backends/ReducingFunctions.cpp new file mode 100644 index 00000000..9cc9d7bb --- /dev/null +++ b/src/Backends/ReducingFunctions.cpp @@ -0,0 +1,363 @@ +#include "ReducingFunctions.h" +#include "mixture_reducing_parameters_JSON.h" // Creates the variable mixture_reducing_parameters_JSON +namespace CoolProp{ + +static MixingParameterLibrary mixturelibrary; + +MixingParameterLibrary::MixingParameterLibrary() +{ + rapidjson::Document dd; + + dd.Parse<0>(mixture_reducing_parameters_JSON.c_str()); + if (dd.HasParseError()){throw ValueError();} + + // Iterate over the papers in the listing + for (rapidjson::Value::ValueIterator itr = dd.Begin(); itr != dd.End(); ++itr) + { + // Iterate over the coeffs in the entry + rapidjson::Value &Coeffs = (*itr)["Coeffs"]; + std::string model = cpjson::get_string(*itr, "Model"); + std::string BibTeX = cpjson::get_string(*itr, "BibTeX"); + for (rapidjson::Value::ValueIterator itr_coeff = Coeffs.Begin(); itr_coeff != Coeffs.End(); ++itr_coeff) + { + // Get the vector of CAS numbers + std::vector CAS; + CAS.resize(2); + CAS[0] = cpjson::get_string(*itr_coeff, "CAS1"); + CAS[1] = cpjson::get_string(*itr_coeff, "CAS2"); + std::string name1 = cpjson::get_string(*itr_coeff, "Name1"); + std::string name2 = cpjson::get_string(*itr_coeff, "Name2"); + + // Sort the CAS number vector + std::sort(CAS.begin(), CAS.end()); + + // Get the empty dictionary to be filled by the appropriate reducing parameter filling function + Dictionary d; + + // A sort was carried out, names/CAS were swapped + bool swapped = CAS[0].compare(cpjson::get_string(*itr_coeff, "CAS1")) != 0; + + if (swapped){ + std::swap(name1,name2); + } + + // Populate the dictionary with common terms + d.add_string("model", model); + d.add_string("name1", name1); + d.add_string("name2", name2); + d.add_string("bibtex", BibTeX); + + if (!model.compare("Kunz-JCED-2012")) + { + parse_Kunz_JCED_2012(d, *itr_coeff, swapped); + } + else if (!model.compare("Lemmon-JPCRD-2004")) + { + parse_Lemmon_JPCRD_2004(d, *itr_coeff, swapped); + } + else if (!model.compare("Lemmon-JPCRD-2000")) + { + parse_Lemmon_JPCRD_2000(d, *itr_coeff, swapped); + } + else + { + throw ValueError(); + } + + // If not in map, add new entry to map with dictionary + if (reducing_map.find(CAS) == reducing_map.end()) + { + // One-element vector of the dictionary + std::vector vd(1, d); + // Pair for adding to map + std::pair, std::vector > p(CAS, vd); + // Add + reducing_map.insert(p); + } + else // If already in map, add entry to the end of the vector + { + // Append dictionary to listing + reducing_map[CAS].push_back(d); + } + } + } +} + +ReducingFunction *ReducingFunction::factory(const std::vector &components) +{ + std::string _model; + std::size_t N = components.size(); + + STLMatrix beta_v, gamma_v, beta_T, gamma_T; + beta_v.resize(N, std::vector(N, 0)); + gamma_v.resize(N, std::vector(N, 0)); + beta_T.resize(N, std::vector(N, 0)); + gamma_T.resize(N, std::vector(N, 0)); + + for (unsigned int i = 0; i < N; ++i) + { + for (unsigned int j = 0; j < N; ++j) + { + if (i == j){ continue; } + + std::string CAS1 = components[i]->CAS; + std::vector CAS(2,""); + CAS[0] = components[i]->CAS; + CAS[1] = components[j]->CAS; + std::sort(CAS.begin(), CAS.end()); + + /// swapped is true if a swap occured. + bool swapped = (CAS1.compare(CAS[0]) != 0); + + std::vector & vd = mixturelibrary.reducing_map[CAS]; + if (vd.size() != 1) { throw NotImplementedError(); } + // Get a reference to the dictionary itself to save a few dereferences + Dictionary &d = vd[0]; + + std::string model = d.get_string("model"); + + if (!model.compare("Kunz-JCED-2012")) + { + if (swapped) + { + beta_v[i][j] = 1/d.get_number("betaV"); + beta_T[i][j] = 1/d.get_number("betaT"); + } + else + { + beta_v[i][j] = d.get_number("betaV"); + beta_T[i][j] = d.get_number("betaT"); + } + gamma_v[i][j] = d.get_number("gammaV"); + gamma_T[i][j] = d.get_number("gammaT"); + } + else if (!model.compare("Lemmon-JPCRD-2004") || !model.compare("Lemmon-JPCRD-2000")) + { + LemmonAirHFCReducingFunction::convert_to_GERG(components,i,j,d,beta_T[i][j],beta_v[i][j],gamma_T[i][j],gamma_v[i][j]); + } + else + { + throw ValueError(); + } + } + } + return new GERG2008ReducingFunction(components,beta_v, gamma_v, beta_T, gamma_T); +} + +long double ReducingFunction::d_ndTrdni_dxj__constxi(const std::vector &x, int i, int j) +{ + long double s = 0; + for (unsigned int k = 0; k < N; k++) + { + s += x[k]*d2Trdxidxj(x,j,k); + } + return d2Trdxidxj(x,i,j)-dTrdxi__constxj(x,j)-s; +} +long double ReducingFunction::d_ndrhorbardni_dxj__constxi(const std::vector &x, int i, int j) +{ + long double s = 0; + for (unsigned int k = 0; k < N; k++) + { + s += x[k]*d2rhormolardxidxj(x,j,k); + } + return d2rhormolardxidxj(x,j,i)-drhormolardxi__constxj(x,j)-s; +} +long double ReducingFunction::ndrhorbardni__constnj(const std::vector &x, int i) +{ + long double summer_term1 = 0; + for (unsigned int j = 0; j < N; j++) + { + summer_term1 += x[j]*drhormolardxi__constxj(x,j); + } + return drhormolardxi__constxj(x,i)-summer_term1; +} +long double ReducingFunction::ndTrdni__constnj(const std::vector &x, int i) +{ + // GERG Equation 7.54 + long double summer_term1 = 0; + for (unsigned int j = 0; j < N; j++) + { + summer_term1 += x[j]*dTrdxi__constxj(x,j); + } + return dTrdxi__constxj(x,i)-summer_term1; +} + +long double GERG2008ReducingFunction::Tr(const std::vector &x) +{ + long double Tr = 0; + for (unsigned int i = 0; i < N; i++) + { + double xi = x[i], Tci = pFluids[i]->pEOS->reduce.T; + Tr += xi*xi*Tci; + + // The last term is only used for the pure component, as it is sum_{i=1}^{N-1}sum_{j=1}^{N} + if (i==N-1){ break; } + + for (unsigned int j = i+1; j < N; j++) + { + Tr += c_Y_ij(i, j, beta_T, gamma_T, T_c)*f_Y_ij(x, i, j, beta_T); + } + } + return Tr; +} +long double GERG2008ReducingFunction::dTrdxi__constxj(const std::vector &x, int i) +{ + // See Table B9 from Kunz Wagner 2012 (GERG 2008) + long double xi = x[i]; + long double dTr_dxi = 2*xi*pFluids[i]->pEOS->reduce.T; + for (int k = 0; k < i; k++) + { + dTr_dxi += c_Y_ji(k,i,beta_T,gamma_T,T_c)*dfYkidxi__constxk(x,k,i,beta_T); + } + for (unsigned int k = i+1; k < N; k++) + { + dTr_dxi += c_Y_ij(i,k,beta_T,gamma_T,T_c)*dfYikdxi__constxk(x,i,k,beta_T); + } + return dTr_dxi; +} +long double GERG2008ReducingFunction::d2Trdxi2__constxj(const std::vector &x, int i) +{ + // See Table B9 from Kunz Wagner 2012 (GERG 2008) + long double d2Tr_dxi2 = 2*pFluids[i]->pEOS->reduce.T; + for (int k = 0; k < i; k++) + { + d2Tr_dxi2 += c_Y_ij(k,i,beta_T,gamma_T,T_c)*d2fYkidxi2__constxk(x,k,i,beta_T); + } + for (unsigned int k = i+1; k < N; k++) + { + d2Tr_dxi2 += c_Y_ij(i,k,beta_T,gamma_T,T_c)*d2fYikdxi2__constxk(x,i,k,beta_T); + } + return d2Tr_dxi2; +} +long double GERG2008ReducingFunction::d2Trdxidxj(const std::vector &x, int i, int j) +{ + if (i == j) + { + return d2Trdxi2__constxj(x,i); + } + else + { + // See Table B9 from Kunz Wagner 2012 (GERG 2008) + return c_Y_ij(i, j, beta_T, gamma_T, T_c)*d2fYijdxidxj(x, i, j, beta_T); + } +} +long double GERG2008ReducingFunction::dvrmolardxi__constxj(const std::vector &x, int i) +{ + // See Table B9 from Kunz Wagner 2012 (GERG 2008) + long double xi = x[i]; + long double dvrbar_dxi = 2*xi/pFluids[i]->pEOS->reduce.rhomolar; + + for (int k = 0; k < i; k++) + { + dvrbar_dxi += c_Y_ij(k, i, beta_v, gamma_v, v_c)*dfYkidxi__constxk(x, k, i, beta_v); + } + for (unsigned int k = i+1; k < N; k++) + { + dvrbar_dxi += c_Y_ij(i, k, beta_v, gamma_v, v_c)*dfYikdxi__constxk(x, i, k, beta_v); + } + return dvrbar_dxi; +} +long double GERG2008ReducingFunction::d2vrmolardxidxj(const std::vector &x, int i, int j) +{ + if (i == j) + { + return d2vrmolardxi2__constxj(x, i); + } + else + { + return c_Y_ij(i, j, beta_v, gamma_v, v_c)*d2fYijdxidxj(x, i, j, beta_v); + } +} +long double GERG2008ReducingFunction::drhormolardxi__constxj(const std::vector &x, int i) +{ + return -pow(rhormolar(x),2)*dvrmolardxi__constxj(x,i); +} +long double GERG2008ReducingFunction::d2vrmolardxi2__constxj(const std::vector &x, int i) +{ + // See Table B9 from Kunz Wagner 2012 (GERG 2008) + double d2vrbardxi2 = 2/pFluids[i]->pEOS->reduce.rhomolar; + + for (int k = 0; k < i; k++) + { + d2vrbardxi2 += c_Y_ij(k, i, beta_v, gamma_v, v_c)*d2fYkidxi2__constxk(x, k, i, beta_v); + } + for (unsigned int k = i+1; k < N; k++) + { + d2vrbardxi2 += c_Y_ij(i, k, beta_v, gamma_v, v_c)*d2fYikdxi2__constxk(x, i, k, beta_v); + } + return d2vrbardxi2; +} +long double GERG2008ReducingFunction::d2rhormolardxi2__constxj(const std::vector &x, int i) +{ + long double rhor = this->rhormolar(x); + long double dvrbardxi = this->dvrmolardxi__constxj(x,i); + return 2*pow(rhor,(int)3)*pow(dvrbardxi,(int)2)-pow(rhor,(int)2)*this->d2vrmolardxi2__constxj(x,i); +} +long double GERG2008ReducingFunction::d2rhormolardxidxj(const std::vector &x, int i, int j) +{ + double rhor = this->rhormolar(x); + double dvrbardxi = this->dvrmolardxi__constxj(x,i); + double dvrbardxj = this->dvrmolardxi__constxj(x,j); + return 2*pow(rhor,(int)3)*dvrbardxi*dvrbardxj-pow(rhor,(int)2)*this->d2vrmolardxidxj(x,i,j); +} + +long double GERG2008ReducingFunction::rhormolar(const std::vector &x) +{ + double vrbar = 0; + for (unsigned int i = 0; i < N; i++) + { + double xi = x[i]; + vrbar += xi*xi/pFluids[i]->pEOS->reduce.rhomolar; + + if (i == N-1){ break; } + + for (unsigned int j = i+1; j < N; j++) + { + vrbar += c_Y_ij(i, j, beta_v, gamma_v, v_c)*f_Y_ij(x, i, j, beta_v); + } + } + return 1/vrbar; +} +long double GERG2008ReducingFunction::dfYkidxi__constxk(const std::vector &x, int k, int i, std::vector< std::vector< long double> > &beta) +{ + double xk = x[k], xi = x[i], beta_Y = beta[k][i]; + return xk*(xk+xi)/(beta_Y*beta_Y*xk+xi)+xk*xi/(beta_Y*beta_Y*xk+xi)*(1-(xk+xi)/(beta_Y*beta_Y*xk+xi)); +} +long double GERG2008ReducingFunction::dfYikdxi__constxk(const std::vector &x, int i, int k, std::vector< std::vector< long double> > &beta) +{ + double xk = x[k], xi = x[i], beta_Y = beta[i][k]; + return xk*(xi+xk)/(beta_Y*beta_Y*xi+xk)+xi*xk/(beta_Y*beta_Y*xi+xk)*(1-beta_Y*beta_Y*(xi+xk)/(beta_Y*beta_Y*xi+xk)); +} +long double GERG2008ReducingFunction::c_Y_ij(int i, int j, std::vector< std::vector< long double> > &beta, std::vector< std::vector< long double> > &gamma, std::vector< std::vector< long double> > &Y_c) +{ + return 2*beta[i][j]*gamma[i][j]*Y_c[i][j]; +} +long double GERG2008ReducingFunction::c_Y_ji(int j, int i, std::vector< std::vector< long double> > &beta, std::vector< std::vector< long double> > &gamma, std::vector< std::vector< long double> > &Y_c) +{ + return 2/beta[i][j]*gamma[i][j]*Y_c[i][j]; +} +long double GERG2008ReducingFunction::f_Y_ij(const std::vector &x, int i, int j, std::vector< std::vector< long double> > &beta) +{ + double xi = x[i], xj = x[j], beta_Y = beta[i][j]; + return xi*xj*(xi+xj)/(beta_Y*beta_Y*xi+xj); +} +long double GERG2008ReducingFunction::d2fYikdxi2__constxk(const std::vector &x, int i, int k, std::vector< std::vector< long double> > &beta) +{ + double xi = x[i], xk = x[k], beta_Y = beta[i][k]; + return 1/(beta_Y*beta_Y*xi+xk)*(1-beta_Y*beta_Y*(xi+xk)/(beta_Y*beta_Y*xi+xk))*(2*xk-xi*xk*2*beta_Y*beta_Y/(beta_Y*beta_Y*xi+xk)); +} +long double GERG2008ReducingFunction::d2fYkidxi2__constxk(const std::vector &x, int k, int i, std::vector< std::vector< long double> > &beta) +{ + double xi = x[i], xk = x[k], beta_Y = beta[k][i]; + return 1/(beta_Y*beta_Y*xk+xi)*(1-(xk+xi)/(beta_Y*beta_Y*xk+xi))*(2*xk-xk*xi*2/(beta_Y*beta_Y*xk+xi)); +} +long double GERG2008ReducingFunction::d2fYijdxidxj(const std::vector &x, int i, int j, std::vector< std::vector< long double> > &beta) +{ + double xi = x[i], xj = x[j], beta_Y = beta[i][j], beta_Y2 = beta_Y*beta_Y; + return (xi+xj)/(beta_Y2*xi+xj) + xj/(beta_Y2*xi+xj)*(1-(xi+xj)/(beta_Y2*xi+xj)) + +xi/(beta_Y2*xi+xj)*(1-beta_Y2*(xi+xj)/(beta_Y2*xi+xj)) + -xi*xj/pow(beta_Y2*xi+xj,(int)2)*(1+beta_Y2-2*beta_Y2*(xi+xj)/(beta_Y2*xi+xj)); +} + + +} /* namespace CoolProp */ diff --git a/src/Backends/ReducingFunctions.h b/src/Backends/ReducingFunctions.h new file mode 100644 index 00000000..6d34eaad --- /dev/null +++ b/src/Backends/ReducingFunctions.h @@ -0,0 +1,231 @@ +#ifndef DEPARTURE_FUNCTIONS_H +#define DEPARTURE_FUNCTIONS_H + +#include +#include "../Fluids/CoolPropFluid.h" + +namespace CoolProp{ + +typedef std::vector > STLMatrix; + +/// A container for the mixing parameters for CoolProp mixtures +/** + +*/ +class MixingParameterLibrary +{ +public: + /// Map from sorted pair of CAS numbers to reducing parameter map. The reducing parameter map is a map from key (string) to value (double) + std::map, std::vector > reducing_map; + MixingParameterLibrary(); + + /// Parse a term from GERG 2008 + void parse_Kunz_JCED_2012(Dictionary &d, rapidjson::Value &val, bool swapped) + { + d.add_number("gammaV", cpjson::get_double(val, "gammaV")); + d.add_number("gammaT", cpjson::get_double(val, "gammaT")); + + double betaV = cpjson::get_double(val, "betaV"); + double betaT = cpjson::get_double(val, "betaT"); + if (swapped){ + d.add_number("betaV", 1/betaV); + d.add_number("betaT", 1/betaT); + } + else{ + d.add_number("betaV", betaV); + d.add_number("betaT", betaT); + } + }; + + /// Parse a term from HFC mixtures + void parse_Lemmon_JPCRD_2004(Dictionary &d, rapidjson::Value &val, bool swapped) + { + d.add_number("xi", cpjson::get_double(val, "xi")); + d.add_number("zeta", cpjson::get_double(val, "zeta")); + }; + + /// Parse a term from Air + void parse_Lemmon_JPCRD_2000(Dictionary &d, rapidjson::Value &val, bool swapped) + { + d.add_number("xi", cpjson::get_double(val, "xi")); + d.add_number("zeta", cpjson::get_double(val, "zeta")); + }; +}; + +/*! +An abstract base class for the reducing function to allow for +Lemmon-Jacobsen, GERG, or other reducing function to yield the +reducing parameters \f$ \rho_r \f$ and \f$ T_r \f$ +*/ +class ReducingFunction +{ +protected: + unsigned int N; +public: + ReducingFunction(){}; + virtual ~ReducingFunction(){}; + + /// A factory function to generate the required reducing function + static ReducingFunction *factory(const std::vector &components); + + /// The reduced temperature + virtual long double Tr(const std::vector &x) = 0; + /// The derivative of reduced temperature with respect to component i mole fraction + virtual long double dTrdxi__constxj(const std::vector &x, int i) = 0; + /// The molar reducing density + virtual long double rhormolar(const std::vector &x) = 0; + ///Derivative of the molar reducing density with respect to component i mole fraction + virtual long double drhormolardxi__constxj(const std::vector &x, int i) = 0; + + virtual long double d2rhormolardxi2__constxj(const std::vector &x, int i) = 0; + virtual long double d2rhormolardxidxj(const std::vector &x, int i, int j) = 0; + virtual long double d2Trdxi2__constxj(const std::vector &x, int i) = 0; + virtual long double d2Trdxidxj(const std::vector &x, int i, int j) = 0; + + /*! GERG 2004 Monograph equation 7.56: + \f[ + \left(\frac{\partial}{\partial x_j}\left(n\left(\frac{\partial T_r}{\partial n_i} \right)_{n_j}\right)\right)_{x_i} = \left(\frac{\partial^2T_r}{\partial x_j \partial x_i}\right)-\left(\frac{\partial T_r}{\partial x_j}\right)_{x_i}-\sum_{k=1}^Nx_k\left(\frac{\partial^2T_r}{\partial x_j \partial x_k}\right) + \f] + */ + long double d_ndTrdni_dxj__constxi(const std::vector &x, int i, int j); + /*! GERG 2004 Monograph equation 7.55: + \f[ + \left(\frac{\partial}{\partial x_j}\left(n\left(\frac{\partial \rho_r}{\partial n_i} \right)_{n_j}\right)\right)_{x_i} = \left(\frac{\partial^2\rho_r}{\partial x_j \partial x_i}\right)-\left(\frac{\partial \rho_r}{\partial x_j}\right)_{x_i}-\sum_{k=1}^Nx_k\left(\frac{\partial^2\rho_r}{\partial x_j \partial x_k}\right) + \f] + */ + long double d_ndrhorbardni_dxj__constxi(const std::vector &x, int i, int j); + + long double ndrhorbardni__constnj(const std::vector &x, int i); + long double ndTrdni__constnj(const std::vector &x, int i); +}; + +/*! +The Reducing parameter model used by the GERG-2008 formulation to yield the +reducing parameters \f$ \rho_r \f$ and \f$ T_r \f$ and derivatives thereof +*/ +class GERG2008ReducingFunction : public ReducingFunction +{ +private: + GERG2008ReducingFunction(const GERG2008ReducingFunction& that); // No copying +protected: + STLMatrix v_c; ///< \f$ v_{c,ij} = \frac{1}{8}\left(v_{c,i}^{1/3}+v_{c,j}^{1/3}\right)^{3}\f$ from GERG-2008 + STLMatrix T_c; ///< \f$ T_{c,ij} = \sqrt{T_{c,i}T_{c,j}} \f$ from GERG=2008 + STLMatrix beta_v; ///< \f$ \beta_{v,ij} \f$ from GERG-2008 + STLMatrix gamma_v; ///< \f$ \gamma_{v,ij} \f$ from GERG-2008 + STLMatrix beta_T; ///< \f$ \beta_{T,ij} \f$ from GERG-2008 + STLMatrix gamma_T; ///< \f$ \gamma_{T,ij} \f$ from GERG-2008 + std::vector pFluids; ///< List of pointers to fluids + +public: + GERG2008ReducingFunction(std::vector pFluids, STLMatrix beta_v, STLMatrix gamma_v, STLMatrix beta_T, STLMatrix gamma_T) + { + this->pFluids = pFluids; + this->beta_v = beta_v; + this->gamma_v = gamma_v; + this->beta_T = beta_T; + this->gamma_T = gamma_T; + this->N = pFluids.size(); + T_c.resize(N,std::vector(N,0)); + v_c.resize(N,std::vector(N,0)); + for (unsigned int i = 0; i < N; ++i) + { + for (unsigned int j = 0; j < N; j++) + { + T_c[i][j] = sqrt(pFluids[i]->pEOS->reduce.T*pFluids[j]->pEOS->reduce.T); + v_c[i][j] = 1.0/8.0*pow(pow(pFluids[i]->pEOS->reduce.rhomolar, -1.0/3.0)+pow(pFluids[j]->pEOS->reduce.rhomolar, -1.0/3.0),(int)3); + } + } + }; + + /// Default destructor + ~GERG2008ReducingFunction(){}; + /// The reduced temperature + long double Tr(const std::vector &x); + /// The derivative of reduced temperature with respect to component i mole fraction + long double dTrdxi__constxj(const std::vector &x, int i); + /// The molar reducing density + long double rhormolar(const std::vector &x); + ///Derivative of the molar reducing density with respect to component i mole fraction + long double drhormolardxi__constxj(const std::vector &x, int i); + long double dvrmolardxi__constxj(const std::vector &x, int i); + + long double d2vrmolardxi2__constxj(const std::vector &x, int i); + long double d2rhormolardxi2__constxj(const std::vector &x, int i); + long double d2vrmolardxidxj(const std::vector &x, int i, int j); + long double d2rhormolardxidxj(const std::vector &x, int i, int j); + long double d2Trdxi2__constxj(const std::vector &x, int i); + long double d2Trdxidxj(const std::vector &x, int i, int j); + + long double c_Y_ij(int i, int j, std::vector< std::vector< long double> > &beta, std::vector< std::vector< long double> > &gamma, std::vector< std::vector< long double> > &Y_c); + long double c_Y_ji(int j, int i, std::vector< std::vector< long double> > &beta, std::vector< std::vector< long double> > &gamma, std::vector< std::vector< long double> > &Y_c); + long double f_Y_ij(const std::vector &x, int i, int j, std::vector< std::vector< long double> > &beta); + + long double dfYkidxi__constxk(const std::vector &x, int k, int i,std::vector< std::vector< long double> > &beta); + long double dfYikdxi__constxk(const std::vector &x, int i, int k, std::vector< std::vector< long double> > &beta); + long double d2fYkidxi2__constxk(const std::vector &x, int k, int i, std::vector< std::vector< long double> > &beta); + long double d2fYikdxi2__constxk(const std::vector &x, int i, int k, std::vector< std::vector< long double> > &beta); + long double d2fYijdxidxj(const std::vector &x, int i, int k, std::vector< std::vector< long double> > &beta); +}; + +/*! From Lemmon, JPCRD, 2000 for the properties of Dry Air, and also from Lemmon, JPCRD, 2004 for the properties of R404A, R410A, etc. +\f[ +\rho_r(\bar x) = \left[ \sum_{i=1}^m\frac{x_i}{\rho_{c_i}}+\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}x_ix_j\zeta_{ij}\right]^{-1} +\f] +\f[ +T_r(\bar x) = \sum_{i=1}^mx_iT_{c_i}+\sum_{i=1}^{m-1}\sum_{j=i+1}^mx_ix_j\xi_{ij} +\f] + +These can be converted to the form of GERG by the following equations: +\f[ +\beta_T = 1\ \ \ \ \beta_v = 1 +\f] +and +\f[ + \boxed{\gamma_T = \dfrac{T_{c0}+T_{c1}+\xi_{01}}{2\sqrt{T_{c0}T_{c1}}}} +\f] +and +\f[ + \boxed{\gamma_v = \dfrac{v_{c0}+v_{c1}+\zeta_{01}}{\frac{1}{4}\left(\frac{1}{\rho_{c,i}^{1/3}}+\frac{1}{\rho_{c,j}^{1/3}}\right)^{3}}} +\f] +*/ +class LemmonAirHFCReducingFunction +{ +protected: + LemmonAirHFCReducingFunction(const LemmonAirHFCReducingFunction &); +public: + /// Set the coefficients based on reducing parameters loaded from JSON + static void convert_to_GERG(const std::vector &pFluids, int i, int j, Dictionary d, long double &beta_T, long double &beta_v, long double &gamma_T, long double &gamma_v) + { + long double xi_ij = d.get_number("xi"); + long double zeta_ij = d.get_number("zeta"); + beta_T = 1; + beta_v = 1; + gamma_T = (pFluids[i]->pEOS->reduce.T + pFluids[j]->pEOS->reduce.T + xi_ij)/(2*sqrt(pFluids[i]->pEOS->reduce.T*pFluids[j]->pEOS->reduce.T)); + long double v_i = 1/pFluids[i]->pEOS->reduce.rhomolar; + long double v_j = 1/pFluids[j]->pEOS->reduce.rhomolar; + long double one_third = 1.0/3.0; + gamma_v = (v_i + v_j + zeta_ij)/(0.25*pow(pow(v_i, one_third)+pow(v_j, one_third),(int)3)); + }; +}; + +class ReducingFunctionContainer +{ +private: + ReducingFunctionContainer(const ReducingFunctionContainer&); + ReducingFunctionContainer& operator=(const ReducingFunctionContainer&); +public: + ReducingFunction *p; + ReducingFunctionContainer(){ + p = NULL; + }; + void set(ReducingFunction *pReducing){p = pReducing;}; + ReducingFunctionContainer(ReducingFunction *pReducing){ + p = pReducing; + }; + ~ReducingFunctionContainer(){delete(p);}; + +}; + + +} /* namespace CoolProp */ +#endif \ No newline at end of file diff --git a/src/Backends/VLERoutines.cpp b/src/Backends/VLERoutines.cpp new file mode 100644 index 00000000..2412ac77 --- /dev/null +++ b/src/Backends/VLERoutines.cpp @@ -0,0 +1,905 @@ + +#include "HelmholtzEOSMixtureBackend.h" +#include "VLERoutines.h" +#include "MatrixMath.h" + +namespace CoolProp { + +void SaturationSolvers::saturation_PHSU_pure(HelmholtzEOSMixtureBackend *HEOS, long double specified_value, saturation_PHSU_pure_options &options) +{ + /* + This function is inspired by the method of Akasaka: + + R. Akasaka,"A Reliable and Useful Method to Determine the Saturation State from + Helmholtz Energy Equations of State", + Journal of Thermal Science and Technology v3 n3,2008 + + Ancillary equations are used to get a sensible starting point + */ + std::vector negativer(3,_HUGE), v; + std::vector > J(3, std::vector(3,_HUGE)); + + HEOS->calc_reducing_state(); + const SimpleState & reduce = HEOS->get_reducing(); + HelmholtzEOSMixtureBackend *SatL = HEOS->SatL, *SatV = HEOS->SatV; + const std::vector & mole_fractions = HEOS->get_mole_fractions(); + const long double R_u = HEOS->gas_constant(); + + long double T, rhoL,rhoV; + long double deltaL=0, deltaV=0, tau=0, error; + int iter=0; + + // Use the density ancillary function as the starting point for the solver + try + { + if (options.specified_variable == saturation_PHSU_pure_options::IMPOSED_PL || options.specified_variable == saturation_PHSU_pure_options::IMPOSED_PV) + { + // Invert liquid density ancillary to get temperature + // TODO: fit inverse ancillaries too + T = HEOS->get_components()[0]->ancillaries.pL.invert(specified_value); + } + else + { + throw ValueError(format("options.specified_variable to saturation_PHSU_pure [%d] is invalid",options.specified_variable)); + } + + // Evaluate densities from the ancillary equations + rhoV = HEOS->get_components()[0]->ancillaries.rhoV.evaluate(T); + rhoL = HEOS->get_components()[0]->ancillaries.rhoL.evaluate(T); + + // Apply a single step of Newton's method to improve guess value for liquid + // based on the error between the gas pressure (which is usually very close already) + // and the liquid pressure, which can sometimes (especially at low pressure), + // be way off, and often times negative + SatL->update(DmolarT_INPUTS, rhoL, T); + SatV->update(DmolarT_INPUTS, rhoV, T); + rhoL += -(SatL->p()-SatV->p())/SatL->first_partial_deriv(iP, iDmolar, iT); + + deltaL = rhoL/reduce.rhomolar; + deltaV = rhoV/reduce.rhomolar; + tau = reduce.T/T; + } + catch(NotImplementedError &) + { + throw; + } + + do{ + /*if (get_debug_level()>8){ + std::cout << format("%s:%d: right before the derivs with deltaL = %g deltaV = %g tau = %g\n",__FILE__,__LINE__,deltaL, deltaV, tau).c_str(); + }*/ + + // Calculate once to save on calls to EOS + SatL->update(DmolarT_INPUTS, rhoL, T); + SatV->update(DmolarT_INPUTS, rhoV, T); + + double pL = SatL->p(); + double pV = SatV->p(); + + // These derivatives are needed for both cases + double alpharL = SatL->alphar(); + double alpharV = SatV->alphar(); + double dalphar_dtauL = SatL->dalphar_dTau(); + double dalphar_dtauV = SatV->dalphar_dTau(); + double d2alphar_ddelta_dtauL = SatL->d2alphar_dDelta_dTau(); + double d2alphar_ddelta_dtauV = SatV->d2alphar_dDelta_dTau(); + double dalphar_ddeltaL = SatL->dalphar_dDelta(); + double dalphar_ddeltaV = SatV->dalphar_dDelta(); + double d2alphar_ddelta2L = SatL->d2alphar_dDelta2(); + double d2alphar_ddelta2V = SatV->d2alphar_dDelta2(); + + // -r_1 + negativer[0] = -(deltaV*(1+deltaV*dalphar_ddeltaV)-deltaL*(1+deltaL*dalphar_ddeltaL)); + // -r_2 + negativer[1] = -(deltaV*dalphar_ddeltaV+alpharV+log(deltaV)-deltaL*dalphar_ddeltaL-alpharL-log(deltaL)); + switch (options.specified_variable){ + case saturation_PHSU_pure_options::IMPOSED_PL: + // -r_3 + negativer[2] = -(pL/specified_value - 1); break; + case saturation_PHSU_pure_options::IMPOSED_PV: + // -r_3 + negativer[2] = -(pV/specified_value - 1); break; + default: + throw ValueError(format("options.specified_variable to saturation_PHSU_pure [%d] is invalid",options.specified_variable)); + } + + // dr1_dtau + J[0][0] = pow(deltaV,2)*d2alphar_ddelta_dtauV-pow(deltaL,2)*d2alphar_ddelta_dtauL; + // dr2_dtau + J[1][0] = deltaV*d2alphar_ddelta_dtauV+dalphar_dtauV-deltaL*d2alphar_ddelta_dtauL-dalphar_dtauL; + + if (options.use_logdelta){ + // dr_1/d_log(delta'') + J[0][1] = -deltaL-2*pow(deltaL,2)*dalphar_ddeltaL-pow(deltaL,3)*d2alphar_ddelta2L; + // dr_2/d_log(delta'') + J[1][1] = -pow(deltaL,2)*d2alphar_ddelta2L-2*deltaL*dalphar_ddeltaL-1; + } + else{ + // dr_1/ddelta'' + J[0][1] = -1-2*deltaL*dalphar_ddeltaL-pow(deltaL,2)*d2alphar_ddelta2L; + // dr_2/ddelta'' + J[1][1] = -1/deltaL-2*dalphar_ddeltaL-deltaL*d2alphar_ddelta2L; + } + + if (options.use_logdelta){ + // dr_1/d_log(delta'') + J[0][2] = deltaV+2*pow(deltaV,2)*dalphar_ddeltaV+pow(deltaV,3)*d2alphar_ddelta2V; + // dr_2/d_log(delta'') + J[1][2] = 1+2*deltaV*dalphar_ddeltaV+1+pow(deltaV,2)*d2alphar_ddelta2V; + } + else{ + // dr_1/ddelta'' + J[0][2] = 1+2*deltaV*dalphar_ddeltaV+pow(deltaV,2)*d2alphar_ddelta2V; + // dr_2/ddelta'' + J[1][2] = deltaV*d2alphar_ddelta2V+2*dalphar_ddeltaV+1/deltaV; + } + + switch (options.specified_variable){ + case saturation_PHSU_pure_options::IMPOSED_PL: + // dr_3/dtau + J[2][0] = SatL->first_partial_deriv(iP,iTau,iDelta)/specified_value; + if (options.use_logdelta){ + // dr_3/d(log(delta')) + J[2][1] = deltaL*SatL->first_partial_deriv(iP,iDelta,iTau)/specified_value; + } + else{ + // dr_3/ddelta' + J[2][1] = SatL->first_partial_deriv(iP,iDelta,iTau)/specified_value; + } + // dr_3/ddelta'' (liquid pressure not a function of vapor density) + J[2][2] = 0; + break; + case saturation_PHSU_pure_options::IMPOSED_PV: + // dr_3/dtau + J[2][0] = SatV->first_partial_deriv(iP,iTau,iDelta)/specified_value; + // dr_3/ddelta' (vapor pressure not a function of liquid density) + J[2][1] = 0; + if (options.use_logdelta){ + // dr_3/d(log(delta'') + J[2][2] = deltaV*SatV->first_partial_deriv(iP,iDelta,iTau)/specified_value; + } + else{ + // dr_3/ddelta'' + J[2][2] = SatV->first_partial_deriv(iP,iDelta,iTau)/specified_value; + } + break; + default: + throw ValueError(format("options.specified_variable to saturation_PHSU_pure [%d] is invalid",options.specified_variable)); + } + + v = linsolve(J, negativer); + + tau += options.omega*v[0]; + + if (options.use_logdelta){ + deltaL = exp(log(deltaL)+options.omega*v[1]); + deltaV = exp(log(deltaV)+options.omega*v[2]); + } + else{ + deltaL += options.omega*v[1]; + deltaV += options.omega*v[2]; + } + + rhoL = deltaL*reduce.rhomolar; + rhoV = deltaV*reduce.rhomolar; + T = reduce.T/tau; + + error = sqrt(pow(negativer[0], 2)+pow(negativer[1], 2)+pow(negativer[2], 2)); + iter++; + if (T < 0) + { + throw SolutionError(format("saturation_PHSU_pure solver T < 0")); + } + if (iter > 200){ + throw SolutionError(format("saturation_PHSU_pure solver did not converge after 100 iterations with specified value: %g with index %d",specified_value, options.specified_variable)); + } + } + while (error > 1e-11); +} +void SaturationSolvers::saturation_D_pure(HelmholtzEOSMixtureBackend *HEOS, long double rhomolar, saturation_D_pure_options &options) +{ + /* + This function is inspired by the method of Akasaka: + + R. Akasaka,"A Reliable and Useful Method to Determine the Saturation State from + Helmholtz Energy Equations of State", + Journal of Thermal Science and Technology v3 n3,2008 + + Ancillary equations are used to get a sensible starting point + */ + std::vector r(2,_HUGE), v; + std::vector > J(2, std::vector(2,_HUGE)); + + HEOS->calc_reducing_state(); + const SimpleState & reduce = HEOS->get_reducing(); + HelmholtzEOSMixtureBackend *SatL = HEOS->SatL, *SatV = HEOS->SatV; + const std::vector & mole_fractions = HEOS->get_mole_fractions(); + + long double T, rhoL,rhoV; + long double deltaL=0, deltaV=0, tau=0, error; + int iter=0; + + // Use the density ancillary function as the starting point for the solver + try + { + if (options.imposed_rho == saturation_D_pure_options::IMPOSED_RHOL) + { + // Invert liquid density ancillary to get temperature + // TODO: fit inverse ancillaries too + T = HEOS->get_components()[0]->ancillaries.rhoL.invert(rhomolar); + rhoV = HEOS->get_components()[0]->ancillaries.rhoV.evaluate(T); + rhoL = rhomolar; + } + else if (options.imposed_rho == saturation_D_pure_options::IMPOSED_RHOV) + { + // Invert vapor density ancillary to get temperature + // TODO: fit inverse ancillaries too + T = HEOS->get_components()[0]->ancillaries.rhoV.invert(rhomolar); + rhoL = HEOS->get_components()[0]->ancillaries.rhoL.evaluate(T); + rhoV = rhomolar; + } + else + { + throw ValueError(format("imposed rho to saturation_D_pure [%d%] is invalid",options.imposed_rho)); + } + + deltaL = rhoL/reduce.rhomolar; + deltaV = rhoV/reduce.rhomolar; + tau = reduce.T/T; + } + catch(NotImplementedError &e) + { + throw e; + } + + do{ + /*if (get_debug_level()>8){ + std::cout << format("%s:%d: right before the derivs with deltaL = %g deltaV = %g tau = %g\n",__FILE__,__LINE__,deltaL, deltaV, tau).c_str(); + }*/ + + // Calculate once to save on calls to EOS + SatL->update(DmolarT_INPUTS, rhoL, T); + SatV->update(DmolarT_INPUTS, rhoV, T); + + double pL = SatL->p(); + double pV = SatV->p(); + + // These derivatives are needed for both cases + double dalphar_dtauL = SatL->dalphar_dTau(); + double dalphar_dtauV = SatV->dalphar_dTau(); + double d2alphar_ddelta_dtauL = SatL->d2alphar_dDelta_dTau(); + double d2alphar_ddelta_dtauV = SatV->d2alphar_dDelta_dTau(); + double alpharL = SatL->alphar(); + double alpharV = SatV->alphar(); + double dalphar_ddeltaL = SatL->dalphar_dDelta(); + double dalphar_ddeltaV = SatV->dalphar_dDelta(); + + + // -r_1 + r[0] = -(deltaV*(1+deltaV*dalphar_ddeltaV)-deltaL*(1+deltaL*dalphar_ddeltaL)); + // -r_2 + r[1] = -(deltaV*dalphar_ddeltaV+alpharV+log(deltaV)-deltaL*dalphar_ddeltaL-alpharL-log(deltaL)); + + // dr1_dtau + J[0][0] = pow(deltaV,2)*d2alphar_ddelta_dtauV-pow(deltaL,2)*d2alphar_ddelta_dtauL; + // dr2_dtau + J[1][0] = deltaV*d2alphar_ddelta_dtauV+dalphar_dtauV-deltaL*d2alphar_ddelta_dtauL-dalphar_dtauL; + + if (options.imposed_rho == saturation_D_pure_options::IMPOSED_RHOL) + { + double d2alphar_ddelta2V = SatV->d2alphar_dDelta2(); + if (options.use_logdelta) + { + J[0][1] = deltaV+2*pow(deltaV,2)*dalphar_ddeltaV+pow(deltaV,3)*d2alphar_ddelta2V; + J[1][1] = pow(deltaV,2)*d2alphar_ddelta2V+2*deltaV*dalphar_ddeltaV+1; + } + else + { + J[0][1] = 1+2*deltaV*dalphar_ddeltaV+pow(deltaV,2)*d2alphar_ddelta2V; + J[1][1] = deltaV*d2alphar_ddelta2V+2*dalphar_ddeltaV+1/deltaV; + } + } + else if (options.imposed_rho == saturation_D_pure_options::IMPOSED_RHOV) + { + double d2alphar_ddelta2L = SatL->d2alphar_dDelta2(); + if (options.use_logdelta) + { + J[0][1] = -deltaL-2*pow(deltaL,2)*dalphar_ddeltaL-pow(deltaL,3)*d2alphar_ddelta2L; + J[1][1] = -pow(deltaL,2)*d2alphar_ddelta2L-2*deltaL*dalphar_ddeltaL-1; + } + else + { + J[0][1] = -1-2*deltaL*dalphar_ddeltaL-pow(deltaL,2)*d2alphar_ddelta2L; + J[1][1] = -deltaL*d2alphar_ddelta2L-2*dalphar_ddeltaL-1/deltaL; + } + } + + double DET = J[0][0]*J[1][1]-J[0][1]*J[1][0]; + + v = linsolve(J, r); + + tau += options.omega*v[0]; + + if (options.imposed_rho == saturation_D_pure_options::IMPOSED_RHOL) + { + if (options.use_logdelta) + deltaV = exp(log(deltaV)+options.omega*v[1]); + else + deltaV += v[1]; + } + else + { + if (options.use_logdelta) + deltaL = exp(log(deltaL)+options.omega*v[1]); + else + deltaL += v[1]; + } + + rhoL = deltaL*reduce.rhomolar; + rhoV = deltaV*reduce.rhomolar; + T = reduce.T/tau; + + error = sqrt(pow(r[0], 2)+pow(r[1], 2)); + iter++; + if (T < 0) + { + throw SolutionError(format("saturation_D_pure solver T < 0")); + } + if (iter > 200){ + throw SolutionError(format("saturation_D_pure solver did not converge after 100 iterations with rho: %g mol/m^3",rhomolar)); + } + } + while (error > 1e-9); +} +void SaturationSolvers::saturation_T_pure(HelmholtzEOSMixtureBackend *HEOS, long double T, saturation_T_pure_options &options) +{ + // Set some imput options + SaturationSolvers::saturation_T_pure_Akasaka_options _options; + _options.omega = 1.0; + _options.use_guesses = false; + // Actually call the solver + SaturationSolvers::saturation_T_pure_Akasaka(HEOS, T, _options); +} +void SaturationSolvers::saturation_T_pure_Akasaka(HelmholtzEOSMixtureBackend *HEOS, long double T, saturation_T_pure_Akasaka_options &options) +{ + // Start with the method of Akasaka + + /* + This function implements the method of Akasaka + + R. Akasaka,"A Reliable and Useful Method to Determine the Saturation State from + Helmholtz Energy Equations of State", + Journal of Thermal Science and Technology v3 n3,2008 + + Ancillary equations are used to get a sensible starting point + */ + + HEOS->calc_reducing_state(); + const SimpleState & reduce = HEOS->get_reducing(); + long double R_u = HEOS->calc_gas_constant(); + HelmholtzEOSMixtureBackend *SatL = HEOS->SatL, *SatV = HEOS->SatV; + + long double rhoL,rhoV,JL,JV,KL,KV,dJL,dJV,dKL,dKV; + long double DELTA, deltaL=0, deltaV=0, tau=0, error, PL, PV, stepL, stepV; + int iter=0; + // Use the density ancillary function as the starting point for the solver + try + { + if (options.use_guesses) + { + // Use the guesses provided in the options structure + rhoL = options.rhoL; + rhoV = options.rhoV; + } + else + { + // If very close to the critical temp, evaluate the ancillaries for a slightly lower temperature + if (T > 0.99*HEOS->get_reducing().T){ + rhoL = HEOS->get_components()[0]->ancillaries.rhoL.evaluate(T-1); + rhoV = HEOS->get_components()[0]->ancillaries.rhoV.evaluate(T-1); + } + else{ + rhoL = HEOS->get_components()[0]->ancillaries.rhoL.evaluate(T); + rhoV = HEOS->get_components()[0]->ancillaries.rhoV.evaluate(T); + } + } + + // Apply a single step of Newton's method to improve guess value for liquid + // based on the error between the gas pressure (which is usually very close already) + // and the liquid pressure, which can sometimes (especially at low pressure), + // be way off, and often times negative + SatL->update(DmolarT_INPUTS, rhoL, T); + SatV->update(DmolarT_INPUTS, rhoV, T); + rhoL += -(SatL->p()-SatV->p())/SatL->first_partial_deriv(iP, iDmolar, iT); + + deltaL = rhoL/reduce.rhomolar; + deltaV = rhoV/reduce.rhomolar; + tau = reduce.T/T; + } + catch(NotImplementedError &) + { + /*double Tc = crit.T; + double pc = crit.p.Pa; + double w = 6.67228479e-09*Tc*Tc*Tc-7.20464352e-06*Tc*Tc+3.16947758e-03*Tc-2.88760012e-01; + double q = -6.08930221451*w -5.42477887222; + double pt = exp(q*(Tc/T-1))*pc;*/ + + //double rhoL = density_Tp_Soave(T, pt, 0), rhoV = density_Tp_Soave(T, pt, 1); + + //deltaL = rhoL/reduce.rhomolar; + //deltaV = rhoV/reduce.rhomolar; + //tau = reduce.T/T; + } + //if (get_debug_level()>5){ + // std::cout << format("%s:%d: Akasaka guess values deltaL = %g deltaV = %g tau = %g\n",__FILE__,__LINE__,deltaL, deltaV, tau).c_str(); + // } + + do{ + /*if (get_debug_level()>8){ + std::cout << format("%s:%d: right before the derivs with deltaL = %g deltaV = %g tau = %g\n",__FILE__,__LINE__,deltaL, deltaV, tau).c_str(); + }*/ + + // Calculate once to save on calls to EOS + SatL->update(DmolarT_INPUTS, rhoL, T); + SatV->update(DmolarT_INPUTS, rhoV, T); + double alpharL = SatL->alphar(); + double alpharV = SatV->alphar(); + double dalphar_ddeltaL = SatL->dalphar_dDelta(); + double dalphar_ddeltaV = SatV->dalphar_dDelta(); + double d2alphar_ddelta2L = SatL->d2alphar_dDelta2(); + double d2alphar_ddelta2V = SatV->d2alphar_dDelta2(); + + JL = deltaL * (1 + deltaL*dalphar_ddeltaL); + JV = deltaV * (1 + deltaV*dalphar_ddeltaV); + KL = deltaL*dalphar_ddeltaL + alpharL + log(deltaL); + KV = deltaV*dalphar_ddeltaV + alpharV + log(deltaV); + + PL = R_u*reduce.rhomolar*T*JL; + PV = R_u*reduce.rhomolar*T*JV; + + // At low pressure, the magnitude of d2alphar_ddelta2L and d2alphar_ddelta2V are enormous, truncation problems arise for all the partials + dJL = 1 + 2*deltaL*dalphar_ddeltaL + deltaL*deltaL*d2alphar_ddelta2L; + dJV = 1 + 2*deltaV*dalphar_ddeltaV + deltaV*deltaV*d2alphar_ddelta2V; + dKL = 2*dalphar_ddeltaL + deltaL*d2alphar_ddelta2L + 1/deltaL; + dKV = 2*dalphar_ddeltaV + deltaV*d2alphar_ddelta2V + 1/deltaV; + + DELTA = dJV*dKL-dJL*dKV; + + error = fabs(KL-KV)+fabs(JL-JV); + + // Get the predicted step + stepL = options.omega/DELTA*( (KV-KL)*dJV-(JV-JL)*dKV); + stepV = options.omega/DELTA*( (KV-KL)*dJL-(JV-JL)*dKL); + + if (deltaL+stepL > 1 && deltaV+stepV < 1 && deltaV+stepV > 0){ + deltaL += stepL; deltaV += stepV; + rhoL = deltaL*reduce.rhomolar; rhoV = deltaV*reduce.rhomolar; + } + else{ + throw ValueError(format("rhosatPure_Akasaka failed")); + } + iter++; + if (iter > 100){ + throw SolutionError(format("Akasaka solver did not converge after 100 iterations")); + } + } + while (error > 1e-10 && fabs(stepL) > 10*DBL_EPSILON*fabs(stepL) && fabs(stepV) > 10*DBL_EPSILON*fabs(stepV)); +} + +void SaturationSolvers::x_and_y_from_K(long double beta, const std::vector &K, const std::vector &z, std::vector &x, std::vector &y) +{ + for (unsigned int i=0; i < K.size(); i++) + { + double denominator = (1-beta+beta*K[i]); // Common denominator + x[i] = z[i]/denominator; + y[i] = K[i]*z[i]/denominator; + } + //normalize_vector(x); + //normalize_vector(y); +} + +long double SaturationSolvers::successive_substitution(HelmholtzEOSMixtureBackend *HEOS, const long double beta, long double T, long double p, const std::vector &z, + std::vector &K, mixture_VLE_IO &options) +{ + int iter = 1; + long double change, f, df, deriv_liq, deriv_vap; + std::size_t N = z.size(); + std::vector x, y, ln_phi_liq, ln_phi_vap; + ln_phi_liq.resize(N); ln_phi_vap.resize(N); x.resize(N); y.resize(N); + + x_and_y_from_K(beta, K, z, x, y); + HelmholtzEOSMixtureBackend *SatL = new HelmholtzEOSMixtureBackend(HEOS->get_components()), + *SatV = new HelmholtzEOSMixtureBackend(HEOS->get_components()); + SatL->specify_phase(iphase_liquid); + SatV->specify_phase(iphase_gas); + + SatL->set_mole_fractions(x); + SatV->set_mole_fractions(y); + long double rhomolar_liq = SatL->solver_rho_Tp_SRK(T, p, iphase_liquid); // [mol/m^3] + long double rhomolar_vap = SatV->solver_rho_Tp_SRK(T, p, iphase_gas); // [mol/m^3] + + do + { + + SatL->update_TP_guessrho(T, p, rhomolar_liq); + SatV->update_TP_guessrho(T, p, rhomolar_vap); + + f = 0; + df = 0; + + for (std::size_t i = 0; i < N; ++i) + { + ln_phi_liq[i] = SatL->mixderiv_ln_fugacity_coefficient(i); + ln_phi_vap[i] = SatV->mixderiv_ln_fugacity_coefficient(i); + + if (options.sstype == imposed_p){ + deriv_liq = SatL->mixderiv_dln_fugacity_coefficient_dT__constp_n(i); + deriv_vap = SatV->mixderiv_dln_fugacity_coefficient_dT__constp_n(i); + } + else if (options.sstype == imposed_T){ + deriv_liq = SatL->mixderiv_dln_fugacity_coefficient_dp__constT_n(i); + deriv_vap = SatV->mixderiv_dln_fugacity_coefficient_dp__constT_n(i); + } + else {throw ValueError();} + + K[i] = exp(ln_phi_liq[i]-ln_phi_vap[i]); + + f += z[i]*(K[i]-1)/(1-beta+beta*K[i]); + + double dfdK = K[i]*z[i]/pow(1-beta+beta*K[i],(int)2); + df += dfdK*(deriv_liq-deriv_vap); + } + + change = -f/df; + + if (options.sstype == imposed_p){ + T += change; + } + else if (options.sstype == imposed_T){ + p += change; + } + + x_and_y_from_K(beta, K, z, x, y); + SatL->set_mole_fractions(x); + SatV->set_mole_fractions(y); + + iter += 1; + if (iter > 50) + { + return _HUGE; + //throw ValueError(format("saturation_p was unable to reach a solution within 50 iterations")); + } + rhomolar_liq = SatL->rhomolar(); + rhomolar_vap = SatV->rhomolar(); + } + while(fabs(f) > 1e-12 || iter < options.Nstep_max); + + SatL->update_TP_guessrho(T, p, rhomolar_liq); + SatV->update_TP_guessrho(T, p, rhomolar_vap); + + double pL = SatL->calc_pressure(); + double pV = SatV->calc_pressure(); + + + options.rhomolar_liq = SatL->rhomolar(); + options.rhomolar_vap = SatV->rhomolar(); + options.p = pL; + options.T = T; + options.x = SatL->get_mole_fractions(); + options.y = SatV->get_mole_fractions(); + + delete SatL; delete SatV; +} + +void SaturationSolvers::newton_raphson_VLE_GV::resize(unsigned int N) +{ + this->N = N; + x.resize(N); + y.resize(N); + phi_ij_liq.resize(N); + phi_ij_vap.resize(N); + dlnphi_drho_liq.resize(N); + dlnphi_drho_vap.resize(N); + + r.resize(N+2); + negative_r.resize(N+2); + J.resize(N+2, std::vector(N+2, 0)); + + neg_dFdS.resize(N+2); + dXdS.resize(N+2); + + // Fill the vector -dFdS with zeros (Gerg Eqn. 7.132) + std::fill(neg_dFdS.begin(), neg_dFdS.end(), (double)0.0); + // Last entry is 1 + neg_dFdS[N+1] = 1.0; +} +void SaturationSolvers::newton_raphson_VLE_GV::check_Jacobian(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, mixture_VLE_IO &IO) +{ + // Reset all the variables and resize + pre_call(); + std::size_t N = K.size(); + resize(N); + + SatL = new HelmholtzEOSMixtureBackend(HEOS->get_components()), + SatV = new HelmholtzEOSMixtureBackend(HEOS->get_components()); + SatL->specify_phase(iphase_liquid); + SatV->specify_phase(iphase_gas); + + long double rhomolar_liq0 = IO.rhomolar_liq; + const long double rhomolar_vap0 = IO.rhomolar_vap; + long double T0 = IO.T; + long double beta0 = IO.beta; + + // Build the Jacobian and residual vectors for given inputs of K_i,T,p + build_arrays(HEOS,beta0,T0,rhomolar_liq0,rhomolar_vap0,z,K); + + // Make copies of the base + std::vector r0 = r; + STLMatrix J0 = J; + STLMatrix Jnum = J; + + for (std::size_t i = 0; i < N+2; ++i) + { + for (std::size_t j = 0; j < N+2; ++j) + { + Jnum[i][j] = _HUGE; + } + } + + for (std::size_t j = 0; j < N; ++j) + { + std::vector KK = K; + KK[j] += 1e-6; + build_arrays(HEOS,beta0,T0,rhomolar_liq0,rhomolar_vap0,z,KK); + std::vector r1 = r; + for (std::size_t i = 0; i < N+2; ++i) + { + Jnum[i][j] = (r1[i]-r0[i])/(log(KK[j])-log(K[j])); + } + std::cout << vec_to_string(get_col(Jnum,j),"%12.11f") << std::endl; + std::cout << vec_to_string(get_col(J,j),"%12.11f") << std::endl; + } + + build_arrays(HEOS,beta0,T0+1e-6,rhomolar_liq0,rhomolar_vap0,z,K); + std::vector r1 = r, JN = r; + for (std::size_t i = 0; i < r.size(); ++i) + { + Jnum[i][N] = (r1[i]-r0[i])/(log(T0+1e-6)-log(T0)); + } + std::cout << vec_to_string(get_col(Jnum,N),"%12.11f") << std::endl; + std::cout << vec_to_string(get_col(J,N),"%12.11f") << std::endl; + + // Build the Jacobian and residual vectors for given inputs of K_i,T,p + build_arrays(HEOS,beta0,T0,rhomolar_liq0+1e-3,rhomolar_vap0,z,K); + std::vector r2 = r, JNp1 = r; + for (std::size_t i = 0; i < r.size(); ++i) + { + Jnum[i][N+1] = (r2[i]-r0[i])/(log(rhomolar_liq0+1e-3)-log(rhomolar_liq0)); + } + std::cout << vec_to_string(get_col(Jnum, N+1),"%12.11f") << std::endl; + std::cout << vec_to_string(get_col(J,N+1),"%12.11f") << std::endl; + + delete SatL; delete SatV; +} +void SaturationSolvers::newton_raphson_VLE_GV::call(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, mixture_VLE_IO &IO) +{ + int iter = 0; + + // Reset all the variables and resize + pre_call(); + resize(K.size()); + + SatL = new HelmholtzEOSMixtureBackend(HEOS->get_components()), + SatV = new HelmholtzEOSMixtureBackend(HEOS->get_components()); + SatL->specify_phase(iphase_liquid); // So it will always just use single-phase solution + SatV->specify_phase(iphase_gas); // So it will always just use single-phase solution + + do + { + // Build the Jacobian and residual vectors for given inputs of K_i,T,p + build_arrays(HEOS,IO.beta,IO.T,IO.rhomolar_liq,IO.rhomolar_vap,z,K); + + // Solve for the step; v is the step with the contents + // [delta(lnK0), delta(lnK1), ..., delta(lnT), delta(lnrho')] + std::vector v = linsolve(J, negative_r); + + max_rel_change = max_abs_value(v); + + // Set the variables again, the same structure independent of the specified variable + for (unsigned int i = 0; i < N; i++) + { + K[i] = exp(log(K[i]) + v[i]); + if (!ValidNumber(K[i])) + { + throw ValueError(format("K[i] (%g) is invalid",K[i]).c_str()); + } + } + IO.T = exp(log(IO.T) + v[N]); + IO.rhomolar_liq = exp(log(IO.rhomolar_liq) + v[N+1]); + + if (fabs(IO.T) > 1e6) + { + /*std::cout << "J = " << vec_to_string(J,"%16.15g"); + std::cout << "nr = " << vec_to_string(r,"%16.15g");*/ + throw ValueError("Temperature or p has bad value"); + } + + //std::cout << iter << " " << T << " " << p << " " << error_rms << std::endl; + iter++; + } + while(this->error_rms > 1e-8 && max_rel_change > 1000*LDBL_EPSILON && iter < IO.Nstep_max); + Nsteps = iter; + IO.p = p; + IO.x = x; // Mole fractions in liquid + IO.y = y; // Mole fractions in vapor +} + +void SaturationSolvers::newton_raphson_VLE_GV::build_arrays(HelmholtzEOSMixtureBackend *HEOS, long double beta, long double T, long double rhomolar_liq, const long double rhomolar_vap, const std::vector &z, std::vector &K) +{ + // Step 0: + // -------- + // Calculate the mole fractions in liquid and vapor phases + x_and_y_from_K(beta, K, z, x, y); + + // Set the mole fractions in the classes + SatL->set_mole_fractions(x); + SatV->set_mole_fractions(y); + + // Update the liquid and vapor classes + SatL->update(DmolarT_INPUTS, rhomolar_liq, T); + SatV->update(DmolarT_INPUTS, rhomolar_vap, T); + + // For diagnostic purposes calculate the pressures (no derivatives are evaluated) + long double p_liq = SatL->p(); + long double p_vap = SatV->p(); + p = 0.5*(p_liq+p_vap); + + // Step 2: + // ------- + // Build the residual vector and the Jacobian matrix + + // For the residuals F_i + for (unsigned int i = 0; i < N; ++i) + { + long double ln_phi_liq = SatL->mixderiv_ln_fugacity_coefficient(i); + long double phi_iT_liq = SatL->mixderiv_dln_fugacity_coefficient_dT__constrho_n(i); + dlnphi_drho_liq[i] = SatL->mixderiv_dln_fugacity_coefficient_drho__constT_n(i); + for (unsigned int j = 0; j < N; ++j) + { + // I think this is wrong. + phi_ij_liq[j] = SatL->mixderiv_ndln_fugacity_coefficient_dnj__constT_p(i,j) + (SatL->mixderiv_partial_molar_volume(i)/(SatL->gas_constant()*T)-1/p)*SatL->mixderiv_ndpdni__constT_V_nj(i); // 7.126 from GERG monograph + } + + long double ln_phi_vap = SatV->mixderiv_ln_fugacity_coefficient(i); + long double phi_iT_vap = SatV->mixderiv_dln_fugacity_coefficient_dT__constrho_n(i); + dlnphi_drho_vap[i] = SatV->mixderiv_dln_fugacity_coefficient_drho__constT_n(i); + for (unsigned int j = 0; j < N; ++j) + { + // I think this is wrong. + phi_ij_vap[j] = SatV->mixderiv_ndln_fugacity_coefficient_dnj__constT_p(i,j) + (SatV->mixderiv_partial_molar_volume(i)/(SatV->gas_constant()*T)-1/p)*SatV->mixderiv_ndpdni__constT_V_nj(i); ; // 7.126 from GERG monograph + } + + r[i] = log(K[i]) + ln_phi_vap - ln_phi_liq; + // dF_i/d(ln(K_j)) + for (unsigned int j = 0; j < N; ++j) + { + J[i][j] = K[j]*z[j]/pow(1-beta+beta*K[j],(int)2)*((1-beta)*phi_ij_vap[j]+beta*phi_ij_liq[j])+Kronecker_delta(i,j); + } + // dF_{i}/d(ln(T)) + J[i][N] = T*(phi_iT_vap-phi_iT_liq); + // dF_{i}/d(ln(rho')) + J[i][N+1] = -rhomolar_liq*dlnphi_drho_liq[i]; + } + + double summer1 = 0; + for (unsigned int i = 0; i < N; ++i) + { + // Although the definition of this term is given by + // y[i]-x[i], when x and y are normalized, you get + // the wrong values. Why? No idea. + summer1 += z[i]*(K[i]-1)/(1-beta+beta*K[i]); + } + r[N] = summer1; + + // For the residual term F_{N}, only non-zero derivatives are with respect + // to ln(K[i]) + for (unsigned int j = 0; j < N; ++j) + { + J[N][j] = K[j]*z[j]/pow(1-beta+beta*K[j],(int)2); + } + + // For the residual term F_{N+1} = p'-p'' + r[N+1] = p_liq-p_vap; + for (unsigned int j = 0; j < N; ++j) + { + J[N+1][j] = HEOS->gas_constant()*T*K[j]*z[j]/pow(1-beta+beta*K[j],(int)2)*((1-beta)*dlnphi_drho_vap[j]+beta*dlnphi_drho_liq[j]); + } + // dF_{N+1}/d(ln(T)) + J[N+1][N] = T*(SatL->mixderiv_dpdT__constV_n() - SatV->mixderiv_dpdT__constV_n()); + // dF_{N+1}/d(ln(rho')) + J[N+1][N+1] = rhomolar_liq*SatL->mixderiv_dpdrho__constT_n(); + + // Flip all the signs of the entries in the residual vector since we are solving Jv = -r, not Jv=r + // Also calculate the rms error of the residual vector at this step + error_rms = 0; + for (unsigned int i = 0; i < N+2; ++i) + { + negative_r[i] = -r[i]; + error_rms += r[i]*r[i]; // Sum the squares + } + error_rms = sqrt(error_rms); // Square-root (The R in RMS) +} + +void PhaseEnvelope::PhaseEnvelope_GV::build(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, SaturationSolvers::mixture_VLE_IO &IO) +{ + // Use the residual function based on ln(K_i), ln(T) and ln(rho') as independent variables. rho'' is specified + SaturationSolvers::newton_raphson_VLE_GV NRVLE; + SaturationSolvers::mixture_VLE_IO IO_NRVLE = IO; + bubble.resize(z.size()); + dew.resize(z.size()); + + // HACK + IO_NRVLE.beta = 1.0; + IO_NRVLE.Nstep_max = 30; + int iter = 0; + long double factor = IO_NRVLE.rhomolar_vap*0.01; + for (;;) + { + if (iter > 0){ IO_NRVLE.rhomolar_vap += factor;} + if (iter == 2 || (factor > 2 && factor < 0.24)) + { + long double x = log(IO_NRVLE.rhomolar_vap); + IO_NRVLE.T = exp(LinearInterp(dew.lnrhomolar_vap,dew.lnT,iter-2,iter-1,x)); + IO_NRVLE.rhomolar_liq = exp(LinearInterp(dew.lnrhomolar_vap,dew.lnrhomolar_liq,iter-2,iter-1,x)); + for (std::size_t i = 0; i < K.size(); ++i) + { + K[i] = exp(LinearInterp(dew.lnrhomolar_vap,dew.lnK[i],iter-2,iter-1,x)); + } + } + else if (iter == 3) + { + long double x = log(IO_NRVLE.rhomolar_vap); + IO_NRVLE.T = exp(QuadInterp(dew.lnrhomolar_vap,dew.lnT,iter-3,iter-2,iter-1,x)); + IO_NRVLE.rhomolar_liq = exp(QuadInterp(dew.lnrhomolar_vap,dew.lnrhomolar_liq,iter-3,iter-2,iter-1,x)); + for (std::size_t i = 0; i < K.size(); ++i) + { + K[i] = exp(QuadInterp(dew.lnrhomolar_vap,dew.lnK[i],iter-3,iter-2,iter-1,x)); + } + } + else if (iter > 3) + { + long double x = log(IO_NRVLE.rhomolar_vap); + IO_NRVLE.T = exp(CubicInterp(dew.lnrhomolar_vap, dew.lnT, iter-4, iter-3, iter-2, iter-1, x)); + IO_NRVLE.rhomolar_liq = exp(CubicInterp(dew.lnrhomolar_vap, dew.lnrhomolar_liq, iter-4, iter-3, iter-2, iter-1, x)); + for (std::size_t i = 0; i < K.size(); ++i) + { + K[i] = exp(CubicInterp(dew.lnrhomolar_vap, dew.lnK[i], iter-4, iter-3, iter-2, iter-1, x)); + } + } + /*if (IO_NRVLE.T > 344) + { + NRVLE.check_Jacobian(HEOS,z,K,IO_NRVLE); + }*/ + NRVLE.call(HEOS,z,K,IO_NRVLE); + dew.store_variables(IO_NRVLE.T,IO_NRVLE.p,IO_NRVLE.rhomolar_liq,IO_NRVLE.rhomolar_vap,K,IO_NRVLE.x,IO_NRVLE.y); + iter ++; + std::cout << format("%g %g %g %g %g %d %g\n",IO_NRVLE.p,IO_NRVLE.rhomolar_liq,IO_NRVLE.rhomolar_vap,IO_NRVLE.T,K[0],NRVLE.Nsteps,factor); + if (iter < 5){continue;} + if (NRVLE.Nsteps > 10) + { + factor /= 5; + } + else if (NRVLE.Nsteps > 5) + { + factor /= 1.2; + } + else if (NRVLE.Nsteps <= 4) + { + factor *= 1.2; + } + // Min step is 0.1 mol/m^3 + factor = std::max(factor,static_cast(0.1)); + } +} + +} /* namespace CoolProp*/ \ No newline at end of file diff --git a/src/Backends/VLERoutines.h b/src/Backends/VLERoutines.h new file mode 100644 index 00000000..e767f7ad --- /dev/null +++ b/src/Backends/VLERoutines.h @@ -0,0 +1,265 @@ + +#ifndef VLEROUTINES_H +#define VLEROUTINES_H + +#include "HelmholtzEOSMixtureBackend.h" + +namespace CoolProp{ + +namespace SaturationSolvers +{ + struct saturation_T_pure_Akasaka_options{ + bool use_guesses; ///< true to start off at the values specified by rhoL, rhoV + long double omega, rhoL, rhoV, pL, pV; + }; + struct saturation_T_pure_options{ + bool use_guesses; ///< true to start off at the values specified by rhoL, rhoV + long double omega, rhoL, rhoV, pL, pV; + }; + + struct saturation_D_pure_options{ + enum imposed_rho_options{IMPOSED_RHOL, IMPOSED_RHOV}; + bool use_guesses, ///< True to start off at the values specified by rhoL, rhoV, T + use_logdelta; ///< True to use partials with respect to log(delta) rather than delta + long double omega, rhoL, rhoV, pL, pV; + int imposed_rho; + saturation_D_pure_options(){ use_logdelta = true; omega = 1.0;} // Defaults + }; + + enum sstype_enum {imposed_T, imposed_p}; + struct mixture_VLE_IO + { + int sstype, Nstep_max; + long double rhomolar_liq, rhomolar_vap, p, T, beta; + std::vector x,y,K; + }; + + /*! Returns the natural logarithm of K for component i using the method from Wilson as in + \f[ + \ln K_i = \ln\left(\frac{p_{c,i}}{p}\right)+5.373(1+\omega_i)\left(1-\frac{T_{c,i}}{T}\right) + \f] + @param HEOS The Helmholtz EOS mixture backend + @param T Temperature [K] + @param p Pressure [Pa] + @param i Index of component [-] + */ + static long double Wilson_lnK_factor(HelmholtzEOSMixtureBackend *HEOS, long double T, long double p, int i){ + EquationOfState *EOS = (HEOS->get_components())[i]->pEOS; + return log(EOS->reduce.p/p)+5.373*(1 + EOS->accentric)*(1-EOS->reduce.T/T); + }; + + void saturation_D_pure(HelmholtzEOSMixtureBackend *HEOS, long double rhomolar, saturation_D_pure_options &options); + void saturation_T_pure(HelmholtzEOSMixtureBackend *HEOS, long double T, saturation_T_pure_options &options); + void saturation_T_pure_Akasaka(HelmholtzEOSMixtureBackend *HEOS, long double T, saturation_T_pure_Akasaka_options &options); + + /** + */ + struct saturation_PHSU_pure_options{ + enum specified_variable_options{IMPOSED_HL, IMPOSED_HV, IMPOSED_PL, IMPOSED_PV, IMPOSED_SL, IMPOSED_SV, IMPOSED_UL, IMPOSED_UV, IMPOSED_INVALID_INPUT}; + bool use_guesses, ///< True to start off at the values specified by rhoL, rhoV, T + use_logdelta; ///< True to use partials with respect to log(delta) rather than delta + int specified_variable; + long double omega, rhoL, rhoV, pL, pV; + saturation_PHSU_pure_options(){ specified_variable = IMPOSED_INVALID_INPUT; use_guesses = true; omega = 1.0; } + }; + /** + + */ + void saturation_PHSU_pure(HelmholtzEOSMixtureBackend *HEOS, long double specified_value, saturation_PHSU_pure_options &options); + + long double successive_substitution(HelmholtzEOSMixtureBackend *HEOS, const long double beta, long double T, long double p, const std::vector &z, std::vector &K, mixture_VLE_IO &options); + void x_and_y_from_K(long double beta, const std::vector &K, const std::vector &z, std::vector &x, std::vector &y); + + /*! A wrapper function around the residual to find the initial guess for the bubble point temperature + \f[ + r = \sum_i \frac{z_i(K_i-1)}{1-beta+beta*K_i} + \f] + */ + class WilsonK_resid : public FuncWrapper1D + { + public: + int input_type; + double T, p, beta; + const std::vector *z; + std::vector *K; + HelmholtzEOSMixtureBackend *HEOS; + + WilsonK_resid(HelmholtzEOSMixtureBackend *HEOS, double beta, double imposed_value, int input_type, const std::vector &z, std::vector &K){ + this->z = &z; this->K = &K; this->HEOS = HEOS; this->beta = beta; this->input_type = input_type; + if (input_type == imposed_T){ + this->T = imposed_value; + } + else{ + this->p = imposed_value; + } + }; + double call(double input_value){ + double summer = 0; + if (input_type == imposed_T){ + p = input_value; // Iterate on pressure + } + else{ + T = input_value; // Iterate on temperature, pressure imposed + } + for (unsigned int i = 0; i< (*z).size(); i++) { + (*K)[i] = exp(Wilson_lnK_factor(HEOS,T,p,i)); + summer += (*z)[i]*((*K)[i]-1)/(1-beta+beta*(*K)[i]); + } + return summer; + }; + }; + inline double saturation_preconditioner(HelmholtzEOSMixtureBackend *HEOS, double input_value, int input_type, const std::vector &z) + { + double ptriple = 0, pcrit = 0, Ttriple = 0, Tcrit = 0; + + for (unsigned int i = 0; i < z.size(); i++) + { + EquationOfState *EOS = (HEOS->get_components())[i]->pEOS; + + ptriple += EOS->ptriple*z[i]; + pcrit += EOS->reduce.p*z[i]; + Ttriple += EOS->Ttriple*z[i]; + Tcrit += EOS->reduce.T*z[i]; + } + + if (input_type == imposed_T) + { + return exp(log(pcrit/ptriple)/(Tcrit-Ttriple)*(input_value-Ttriple)+log(ptriple)); + } + else if (input_type == imposed_p) + { + return 1/(1/Tcrit-(1/Ttriple-1/Tcrit)/log(pcrit/ptriple)*log(input_value/pcrit)); + } + else{ throw ValueError();} + } + inline double saturation_Wilson(HelmholtzEOSMixtureBackend *HEOS, double beta, double input_value, int input_type, const std::vector &z, double guess) + { + double T; + + std::string errstr; + + // Find first guess for T using Wilson K-factors + WilsonK_resid Resid(HEOS, beta, input_value, input_type, z, HEOS->get_K()); + T = Secant(Resid, guess, 0.001, 1e-10, 100, errstr); + + if (!ValidNumber(T)){throw ValueError("saturation_p_Wilson failed to get good T");} + return T; + } + struct SuccessiveSubstitutionStep + { + long double T,p; + }; + + /*! + A class to do newton raphson solver for VLE given guess values for vapor-liquid equilibria. This class will then be included in the Mixture class + + A class is used rather than a function so that it is easier to store iteration histories, additional output values, etc. + */ + class newton_raphson_VLE_GV + { + public: + long double error_rms, rhobar_liq, rhobar_vap, T, p, max_rel_change; + unsigned int N; + bool logging; + int Nsteps; + STLMatrix J; + HelmholtzEOSMixtureBackend *SatL, *SatV; + std::vector K, x, y, phi_ij_liq, phi_ij_vap, dlnphi_drho_liq, dlnphi_drho_vap, r, negative_r, dXdS, neg_dFdS; + std::vector step_logger; + + newton_raphson_VLE_GV(){}; + + void resize(unsigned int N); + + // Reset the state of all the internal variables + void pre_call() + { + K.clear(); x.clear(); y.clear(); phi_ij_liq.clear(); + phi_ij_vap.clear(); dlnphi_drho_liq.clear(), dlnphi_drho_vap.clear(), + step_logger.clear(); error_rms = 1e99; Nsteps = 0; + rhobar_liq = _HUGE; rhobar_vap = _HUGE; T = _HUGE; p = _HUGE; + }; + + /*! Call the Newton-Raphson VLE Solver + + This solver must be passed reasonable guess values for the mole fractions, + densities, etc. You may want to take a few steps of successive substitution + before you start with Newton Raphson. + + @param HEOS Temperature [K] + @param z Pressure [Pa] + @param z Bulk mole fractions [-] + @param K Array of K-factors [-] + */ + void call(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, mixture_VLE_IO &IO); + + /*! Build the arrays for the Newton-Raphson solve + + This method builds the Jacobian matrix, the sensitivity matrix, etc. + + @param beta Void fraction [-] (0: bubble, 1: dew) + @param T Temperature [K] + @param p Pressure [Pa] + @param z Bulk mole fractions [-] + @param K Array of K-factors [-] + */ + void build_arrays(HelmholtzEOSMixtureBackend *HEOS, long double beta, long double T, long double rhomolar_liq, const long double rho_vapor, const std::vector &z, std::vector & K); + + /** Check the derivatives in the Jacobian using numerical derivatives. + */ + void check_Jacobian(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, mixture_VLE_IO &IO); + }; +}; + +namespace PhaseEnvelope +{ + class PhaseEnvelopeLog + { + public: + std::vector< std::vector > K, lnK, x, y; + std::vector T, p, lnT, lnp, rhomolar_liq, rhomolar_vap, lnrhomolar_liq, lnrhomolar_vap; + void resize(std::size_t N) + { + K.resize(N); + lnK.resize(N); + x.resize(N); + y.resize(N); + } + void store_variables(const long double T, + const long double p, + const long double rhomolar_liq, + const long double rhomolar_vap, + const std::vector & K, + const std::vector & x, + const std::vector & y) + { + std::size_t N = K.size(); + this->p.push_back(p); + this->T.push_back(T); + this->lnT.push_back(log(T)); + this->lnp.push_back(log(p)); + this->rhomolar_liq.push_back(rhomolar_liq); + this->rhomolar_vap.push_back(rhomolar_vap); + this->lnrhomolar_liq.push_back(log(rhomolar_liq)); + this->lnrhomolar_vap.push_back(log(rhomolar_vap)); + for (unsigned int i = 0; i < N; i++) + { + this->K[i].push_back(K[i]); + this->lnK[i].push_back(log(K[i])); + this->x[i].push_back(x[i]); + this->y[i].push_back(y[i]); + } + }; + }; + class PhaseEnvelope_GV + { + public: + PhaseEnvelopeLog bubble, dew; + + void build(HelmholtzEOSMixtureBackend *HEOS, const std::vector &z, std::vector &K, SaturationSolvers::mixture_VLE_IO &IO); + }; +}; + +} /* namespace CoolProp*/ + +#endif \ No newline at end of file diff --git a/src/CMake/CMakeLists.txt b/src/CMake/CMakeLists.txt new file mode 100644 index 00000000..e8e25be5 --- /dev/null +++ b/src/CMake/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required (VERSION 2.8) +project (CoolProp) + +# Offer the user the choice of overriding the directories +set (PROJECT_SRC_DIR src CACHE PATH "Project directory for source files") +set (PROJECT_BIN_DIR bin CACHE PATH "Build directory for executables") +set (PROJECT_LIB_DIR lib CACHE PATH "Build directory for libraries") +set (PROJECT_INC_DIR include CACHE PATH "Build directory for header files") + +# The version number. +set (CoolProp_VERSION_MAJOR 5) +set (CoolProp_VERSION_MINOR 0) +set (CoolProp_VERSION_PATCH 0) +set (CoolProp_VERSION ${CoolProp_VERSION_MAJOR}.${CoolProp_VERSION_MINOR}.${CoolProp_VERSION_PATCH}) + +FIND_PACKAGE(Git) +EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} describe --match=CatchMeIfYouCan --always --abbrev=40 + OUTPUT_VARIABLE CoolProp_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + +# configure a header file to pass some of the CMake settings +# to the source code +configure_file ( + "${PROJECT_SRC_DIR}/CoolPropConfig.h.in" + "${PROJECT_SRC_DIR}/CoolPropConfig.h" + ) + +# add the binary tree to the search path for include files +# so that we will find CoolPropConfig.h +include_directories("${PROJECT_SRC_DIR}" "${PROJECT_BIN_DIR}" "${PROJECT_LIB_DIR}" "${PROJECT_INC_DIR}") + +# add the executable +add_executable(CoolProp ${PROJECT_SRC_DIR}/CoolPropMain.cpp) diff --git a/src/CMake/src/CoolPropConfig.h b/src/CMake/src/CoolPropConfig.h new file mode 100644 index 00000000..082c10d9 --- /dev/null +++ b/src/CMake/src/CoolPropConfig.h @@ -0,0 +1,3 @@ +// the configured options and settings for CoolProp +#define CoolProp_VERSION "5.0.0" +#define CoolProp_REVISION "" diff --git a/src/CMake/src/CoolPropConfig.h.in b/src/CMake/src/CoolPropConfig.h.in new file mode 100644 index 00000000..7d49e71c --- /dev/null +++ b/src/CMake/src/CoolPropConfig.h.in @@ -0,0 +1,3 @@ +// the configured options and settings for CoolProp +#define CoolProp_VERSION "@CoolProp_VERSION@" +#define CoolProp_REVISION "${CoolProp_REVISION}" \ No newline at end of file diff --git a/src/CMake/src/CoolPropMain.cpp b/src/CMake/src/CoolPropMain.cpp new file mode 100644 index 00000000..c67467bd --- /dev/null +++ b/src/CMake/src/CoolPropMain.cpp @@ -0,0 +1,23 @@ +// A simple program that computes the square root of a number +#include +#include +#include +#include "CoolPropConfig.h" + +int main (int argc, char *argv[]) +{ + if (argc < 2) + { + fprintf(stdout,"%s Version %s (%s)\n", + argv[0], + CoolProp_VERSION, + CoolProp_REVISION); + fprintf(stdout,"Usage: %s number\n",argv[0]); + return 1; + } + double inputValue = atof(argv[1]); + double outputValue = sqrt(inputValue); + fprintf(stdout,"The square root of %g is %g\n", + inputValue, outputValue); + return 0; +} diff --git a/src/CoolProp.cpp b/src/CoolProp.cpp new file mode 100644 index 00000000..c56a13af --- /dev/null +++ b/src/CoolProp.cpp @@ -0,0 +1,827 @@ +#include "CoolProp.h" +#include "AbstractState.h" + +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#endif + +#if defined(__ISWINDOWS__) +#include +#else +#ifndef DBL_EPSILON + #include + #define DBL_EPSILON std::numeric_limits::epsilon() +#endif +#endif + +#include +#include +#include +#include +#include +#include +#include "CoolPropTools.h" +#include "Solvers.h" +#include "Fluids\FluidLibrary.h" + +namespace CoolProp +{ + +static int debug_level = 0; +static std::string error_string; +static std::string warning_string; + +void set_debug_level(int level){debug_level = level;} +int get_debug_level(void){return debug_level;} + +//// This is very hacky, but pull the git revision from the file +#include "gitrevision.h" // Contents are like "std::string gitrevision = "aa121435436ggregrea4t43t433";" +#include "version.h" // Contents are like "char version [] = "2.5";" + +//int global_Phase = -1; + +void set_warning_string(std::string warning){ + warning_string = warning; +} +void set_error_string(std::string error){ + error_string = error; +} +// +//static int IsCoolPropFluid(std::string FluidName) +//{ +// // Try to get the fluid from Fluids by name +// try +// { +// pFluid = Fluids.get_fluid(FluidName); +// } +// catch (NotImplementedError &) +// { +// return false; +// } +// // If NULL, didn't find it (or its alias) +// if (pFluid!=NULL) +// { +// return true; +// } +// else +// return false; +//} +// +//static int IsBrine(const char* Ref) +//{ +// // First check whether it is one of the Brines that does +// // not have a pure-fluid equivalent in CoolProp +// if ( +// strcmp(Ref,"HC-10")==0 || +// strncmp(Ref,"PG-",3)==0 || +// strncmp(Ref,"EG-",3)==0 || +// strncmp(Ref,"EA-",3)==0 || +// strncmp(Ref,"MA-",3)==0 || +// strncmp(Ref,"Glycerol-",9)==0 || +// strncmp(Ref,"K2CO3-",6)==0 || +// strncmp(Ref,"CaCl2-",6)==0 || +// strncmp(Ref,"MgCl2-",6)==0 || +// strncmp(Ref,"NaCl-",5)==0 || +// strncmp(Ref,"KAC-",4)==0 || +// strncmp(Ref,"KFO-",4)==0 || +// strncmp(Ref,"LiCl-",4)==0 || +// strncmp(Ref,"NH3/H2O-",8)==0 +// ) +// { +// return 1; +// } +// // Then check for diluants that are also pure fluids in CoolProp +// else if ( (strncmp(Ref,"Methanol-",9)==0 && Ref[8] == '-') || +// (strncmp(Ref,"Ethanol-",8)==0 && Ref[7] == '-') || +// (strncmp(Ref,"NH3-",4)==0 && Ref[3] == '-') +// ) +// { +// return 1; +// } +// else +// { +// return 0; +// } +//} +// +//long getFluidType(std::string FluidName){ +// if (IsREFPROP(FluidName)) { return FLUID_TYPE_REFPROP;} +// else if(IsIncompressibleLiquid(FluidName)){ return FLUID_TYPE_INCOMPRESSIBLE_LIQUID;} +// // TODO SOLUTION: Check if working +// else if(IsIncompressibleSolution(FluidName)){ return FLUID_TYPE_INCOMPRESSIBLE_SOLUTION; } +// else { +// // Try to get the index of the fluid +// long iFluid = get_Fluid_index(FluidName); +// // If iFluid is greater than -1, it is a CoolProp Fluid, otherwise not +// if (iFluid > -1) { +// // Get a pointer to the fluid object +// pFluid = get_fluid(iFluid); +// if (pFluid->pure()) { return FLUID_TYPE_PURE;} +// else { return FLUID_TYPE_PSEUDOPURE; } +// } else { +// throw ValueError(format("Bad Fluid name [%s] - not a CoolProp fluid",FluidName.c_str())); +// } +// } +// return -1; +//} +// +//EXPORT_CODE int CONVENTION IsFluidType(const char *Ref, const char *Type) +//{ +// pFluid = Fluids.get_fluid(Ref); +// +// if (IsBrine(Ref)){ // TODO Solution: Remove this part +// if (!strcmp(Type,"Brine")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else if (IsIncompressibleSolution(Ref)){ +// if (!strcmp(Type,"Solution")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else if (IsIncompressibleLiquid(Ref)){ +// if (!strcmp(Type,"Liquid")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else if (IsREFPROP(Ref)){ +// if (!strcmp(Type,"PureFluid")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else if (!pFluid->pure()){ +// if (!strcmp(Type,"PseudoPure") || !strcmp(Type,"PseudoPureFluid")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else if (pFluid->pure()){ +// if (!strcmp(Type,"PureFluid")){ +// return 1; +// } +// else{ +// return 0; +// } +// } +// else +// { +// return 0; +// } +//} +// +// +//std::string Phase_Trho(std::string Fluid, double T, double rho) +//{ +// try{ +// // Try to load the CoolProp Fluid +// pFluid = Fluids.get_fluid(Fluid); +// double pL,pV,rhoL,rhoV; +// return pFluid->phase_Trho(T,rho, pL, pV, rhoL, rhoV); +// } +// catch(NotImplementedError &){ +// return std::string(""); +// } +// return std::string(""); +//} +// +//std::string Phase(std::string Fluid, double T, double p) +//{ +// try{ +// // Try to load the CoolProp Fluid +// pFluid = Fluids.get_fluid(Fluid); +// double pL,pV,rhoL,rhoV; +// return pFluid->phase_Tp(T, p, pL, pV, rhoL, rhoV); +// } +// catch(NotImplementedError &){ +// return std::string(""); +// } +// return std::string(""); +//} +// +//std::string Phase_Tp(std::string Fluid, double T, double p) +//{ +// return Phase(Fluid,T,p); +//} +// + +bool has_fractions_in_string(const std::string &fluid_string) +{ + // Start at the "::" if it is found to chop off the delimiter between backend and fluid + std::size_t i = fluid_string.find("::"); + // If can find both "&" and "]", it must have mole fractions encoded as string + return fluid_string.find("&",i+2) != -1 && fluid_string.find("]",i+2); +} +std::string extract_fractions(const std::string &fluid_string, std::vector &fractions) +{ + fractions.clear(); + std::vector names; + std::string all_pairs, backend_string; + // Start at the "::" if it is found to chop off the delimiter between backend and fluid + int i = fluid_string.find("::"); + + // If no backend/fluid delimiter + if (i < 0){ + // Just use the full string + backend_string = ""; + all_pairs = fluid_string; + } + else{ + // Part including the :: + backend_string = fluid_string.substr(0, i+2); + // Keep the part after "::" + all_pairs = fluid_string.substr(i+2); + } + + // Break up into pairs (like "Methane[0.5]") + std::vector pairs = strsplit(all_pairs, '&'); + + for (std::size_t i = 0; i < pairs.size(); ++i) + { + std::string fluid = pairs[i]; + + // Must end with ']' + if (fluid[fluid.size()-1] != ']') + throw ValueError(format("Fluid entry [%s] must end with ']' character",pairs[i].c_str())); + + // Split at '[', but first remove the ']' from the end by taking a substring + std::vector name_fraction = strsplit(fluid.substr(0, fluid.size()-1), '['); + + if (name_fraction.size() != 2){throw ValueError(format("Could not break [%s] into name/fraction", fluid.substr(0, fluid.size()-1).c_str()));} + + // Convert fraction to a double + char *pEnd; + std::string &name = name_fraction[0], &fraction = name_fraction[1]; + double f = strtod(fraction.c_str(), &pEnd); + + // If pEnd points to the last character in the string, it wasn't able to do the conversion + if (pEnd == &(fraction[fraction.size()-1])){throw ValueError(format("Could not convert [%s] into number", fraction.c_str()));} + + // And add to vector + fractions.push_back(f); + + // Add name + names.push_back(name); + } + + // Join fluids back together + return backend_string + strjoin(names, "&"); +} + +// Internal function to do the actual calculations, make this a wrapped function so +// that error bubbling can be done properly +double _PropsSI(const std::string &Output, const std::string &Name1, double Prop1, const std::string &Name2, double Prop2, const std::string &Ref, const std::vector &z) +{ + static std::string unknown_backend = "?"; + double x1, x2; + if (get_debug_level()>5){ + std::cout << format("%s:%d: _PropsSI(%s,%s,%g,%s,%g,%s)\n",__FILE__,__LINE__,Output.c_str(),Name1.c_str(),Prop1,Name2.c_str(),Prop2,Ref.c_str()).c_str(); + } + + // Convert all the input and output parameters to integers + long iOutput = get_parameter_index(Output); + long iName1 = get_parameter_index(Name1); + long iName2 = get_parameter_index(Name2); + + // The state we are going to use + AbstractState *State = NULL; + try + { + // We are going to let the factory function determine which backend to use + // + // Generate the State class pointer using the factory function with unknown backend + State = AbstractState::factory(unknown_backend, Ref); + + if (State == NULL){ throw ValueError("unable to instantiate AbstractState*");} + + if (State->using_mole_fractions()){ + State->set_mole_fractions(z); + } + else{ + State->set_mass_fractions(z); + } + + // Obtain the input pair + long pair = generate_update_pair(iName1, Prop1, iName2, Prop2, x1, x2); + + // First check if it is a trivial input (critical/max parameters for instance) + // TODO: check for trivial inputs that do not require the use of the eos + /*if (State->is_trivial_output(iOutput)) + { + double val = State->trivial_keyed_output(iOutput); + delete(State); + return val; + };*/ + + // Update the state + State->update(pair, x1, x2); + + // Return the desired output + double val = State->keyed_output(iOutput); + + // Free the pointer to the State class + delete (State); + + // Return the value + return val; + } + catch(...){ + delete(State); throw; + } +} +double PropsSI(const std::string &Output, const std::string &Name1, double Prop1, const std::string &Name2, double Prop2, const std::string &Ref, const std::vector &z) +{ + CATCH_ALL_ERRORS_RETURN_HUGE(return _PropsSI(Output,Name1,Prop1,Name2,Prop2,Ref,z);) +} +double PropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *FluidName, const std::vector &x) +{ + std::string _Output = Output, _Name1 = Name1, _Name2 = Name2, _FluidName = FluidName; + return PropsSI(_Output,_Name1,Prop1,_Name2,Prop2,_FluidName, x); +} +double PropsSI(const std::string &Output, const std::string &Name1, double Prop1, const std::string &Name2, double Prop2, const std::string &Ref) +{ + // In this function the error catching happens; + try{ + // Extract fractions if they are encoded in the fluid string + if (has_fractions_in_string(Ref)) + { + std::vector fractions; + // Extract the fractions and reformulate the list of fluids REFPROP::Methane[0.5]&Ethane[0.5] -> REFPROP::Methane&Ethane and [0.5,0.5] + std::string Ref2 = extract_fractions(Ref, fractions); + return _PropsSI(Output, Name1, Prop1, Name2, Prop2, Ref2, fractions); + } + else + { + // Here it must be a pure fluid since the fractions are not coded in the string. If not, it will fail internally + return _PropsSI(Output, Name1, Prop1, Name2, Prop2, Ref, std::vector(1,1)); + } + } + catch(const std::exception& e){ set_error_string(e.what()); return _HUGE; } + catch(...){ return _HUGE; } +} +std::vector PropsSI(const std::string &Output, const std::string &Name1, const std::vector &Prop1, const std::string &Name2, const std::vector Prop2, const std::string &Ref, const std::vector &z) +{ + std::vector out(Prop1.size(), _HUGE); + if (Prop1.size() != Prop2.size()) + { + std::cout << format("Sizes of Prop1 [%d] and Prop2 [%d] to PropsSI are not the same", Prop1.size(), Prop2.size()) << std::endl; + return out; + } + for (std::size_t i = 0; i < Prop1.size(); ++i) + { + out[i] = PropsSI(Output,Name1,Prop1[i],Name2,Prop2[i],Ref,z); + } + return out; +} +double Props1SI(std::string FluidName,std::string Output) +{ + return PropsSI(Output,"",0,"",0,FluidName); +} + + +//EXPORT_CODE double CONVENTION IProps(long iOutput, long iName1, double Prop1, long iName2, double Prop2, long iFluid) +//{ +// Prop1 = convert_from_unit_system_to_SI(iName1, Prop1, get_standard_unit_system()); +// Prop2 = convert_from_unit_system_to_SI(iName2, Prop2, get_standard_unit_system()); +// double out = IPropsSI(iOutput,iName1,Prop1,iName2,Prop2,iFluid); +// return convert_from_SI_to_unit_system(iOutput,out,get_standard_unit_system()); +//} +//double _CoolProp_Fluid_PropsSI(long iOutput, long iName1, double Prop1, long iName2, double Prop2, Fluid *pFluid) +//{ +// double val = _HUGE, T = _HUGE; +// // This private method uses the indices directly for speed +// +// if (get_debug_level()>3){ +// std::cout << format("%s:%d: _CoolProp_Fluid_PropsSI(%d,%d,%g,%d,%g,%s)\n",__FILE__,__LINE__,iOutput,iName1, Prop1, iName2, Prop2, pFluid->get_name().c_str()).c_str(); +// } +// if (iName1 == iT){ +// T = Prop1;} +// else if (iName2 == iT){ +// T = Prop2;} +// +// // Generate a State instance wrapped around the Fluid instance +// CoolPropStateClassSI CPS(pFluid); +// +// // Check if it is an output that doesn't require a state input +// // Deal with it and return +// switch (iOutput) +// { +// case iI: +// { +// if (!ValidNumber(T)){throw ValueError(format("T must be provided as an input to use this output").c_str());} +// return CPS.pFluid->surface_tension_T(T); +// } +// case iRhosatLanc: +// { +// if (!ValidNumber(T)){throw ValueError(format("T must be provided as an input to use this output").c_str());} +// return CPS.pFluid->rhosatL(T); +// } +// case iRhosatVanc: +// { +// if (!ValidNumber(T)){throw ValueError(format("T must be provided as an input to use this output").c_str());} +// return CPS.pFluid->rhosatV(T); +// } +// case iPsatLanc: +// { +// if (!ValidNumber(T)){throw ValueError(format("T must be provided as an input to use this output").c_str());} +// if (CPS.pFluid->pure()){ +// return CPS.pFluid->psat(T); +// } +// else{ +// return CPS.pFluid->psatL(T); +// } +// } +// case iPsatVanc: +// { +// if (!ValidNumber(T)){throw ValueError(format("T must be provided as an input to use this output").c_str());} +// if (CPS.pFluid->pure()){ +// return CPS.pFluid->psat(T); +// } +// else{ +// return CPS.pFluid->psatV(T); +// } +// } +// case iMM: +// case iPcrit: +// case iTcrit: +// case iTtriple: +// case iPtriple: +// case iPmax: +// case iTmax: +// case iRhocrit: +// case iTmin: +// case iAccentric: +// case iPHASE_LIQUID: +// case iPHASE_GAS: +// case iPHASE_SUPERCRITICAL: +// case iPHASE_TWOPHASE: +// case iGWP20: +// case iGWP100: +// case iGWP500: +// case iODP: +// case iCritSplineT: +// case iScrit: +// case iHcrit: +// case iTreduce: +// case iRhoreduce: +// return CPS.keyed_output(iOutput); +// } +// +// // Update the class +// CPS.update(iName1,Prop1,iName2,Prop2); +// +// // Debug +// if (get_debug_level()>9){std::cout << format("%s:%d: State update successful\n",__FILE__,__LINE__).c_str();} +// +// // Get the output +// val = CPS.keyed_output(iOutput); +// +// // Debug +// if (get_debug_level()>5){std::cout << format("%s:%d: _CoolProp_Fluid_PropsSI returns: %g\n",__FILE__,__LINE__,val).c_str();} +// +// // Return the value +// return val; +//} +//EXPORT_CODE double CONVENTION IPropsSI(long iOutput, long iName1, double Prop1, long iName2, double Prop2, long iFluid) +//{ +// pFluid = Fluids.get_fluid(iFluid); +// // Didn't work +// if (pFluid == NULL){ +// err_string=std::string("CoolProp error: ").append(format("%d is an invalid fluid index to IProps",iFluid)); +// return _HUGE; +// } +// else{ +// // In this function the error catching happens; +// try{ +// // This is already converted to the right units since we take in SI units +// return _CoolProp_Fluid_PropsSI(iOutput,iName1,Prop1,iName2,Prop2,pFluid); +// } +// catch(std::exception &e){ +// err_string=std::string("CoolProp error: ").append(e.what()); +// return _HUGE; +// } +// catch(...){ +// err_string=std::string("CoolProp error: Indeterminate error"); +// return _HUGE; +// } +// } +//} + +///// Calculate some interesting derivatives +//double _CoolProp_Deriv_Terms(long iTerm, double T, double rho, Fluid * pFluid) +//{ +// double val = _HUGE; +// // This private method uses the indices directly for speed +// +// if (get_debug_level()>3){ +// std::cout<<__FILE__<<" _CoolProp_Deriv_Terms return: "<5){ +// std::cout<<__FILE__<<" _CoolProp_Deriv_Terms return: "<5){ +// std::cout<<__FILE__<<": "<params.molemass)); +// double delta_a2 = -deltah/((8314.472/pFluid->params.molemass)*pFluid->reduce.T); +// pFluid->phi0list.push_back(new phi0_enthalpy_entropy_offset(delta_a1, delta_a2)); +// return 0; +// } +// else if (!reference_state.compare("ASHRAE")) +// { +// CoolPropStateClassSI CPS(pFluid); +// CPS.update(iT,233.15,iQ,0); +// // Get current values for the enthalpy and entropy +// double h1 = CPS.h(); +// double s1 = CPS.s(); +// double deltah = h1-0; // offset from 0 kJ/kg enthalpy +// double deltas = s1-0; // offset from 0 kJ/kg/K entropy +// double delta_a1 = deltas/((8314.472/pFluid->params.molemass)); +// double delta_a2 = -deltah/((8314.472/pFluid->params.molemass)*pFluid->reduce.T); +// pFluid->phi0list.push_back(new phi0_enthalpy_entropy_offset(delta_a1, delta_a2)); +// return 0; +// } +// else if (!reference_state.compare("NBP")) +// { +// CoolPropStateClassSI CPS(pFluid); +// CPS.update(iP,101325.0,iQ,0); // Saturated boiling point at 1 atmosphere +// // Get current values for the enthalpy and entropy +// double h1 = CPS.h(); +// double s1 = CPS.s(); +// double deltah = h1-0; // offset from 0 kJ/kg enthalpy +// double deltas = s1-0; // offset from 0 kJ/kg/K entropy +// double delta_a1 = deltas/((8314.472/pFluid->params.molemass)); +// double delta_a2 = -deltah/((8314.472/pFluid->params.molemass)*pFluid->reduce.T); +// pFluid->phi0list.push_back(new phi0_enthalpy_entropy_offset(delta_a1, delta_a2)); +// return 0; +// } +// else +// { +// return -1; +// } +// +//} +//int set_reference_stateD(std::string Ref, double T, double rho, double h0, double s0) +//{ +// pFluid=Fluids.get_fluid(Ref); +// if (pFluid!=NULL) +// { +// CoolPropStateClassSI CPS(pFluid); +// CPS.update(iT,T,iD,rho); +// // Get current values for the enthalpy and entropy +// double h1 = CPS.h(); +// double s1 = CPS.s(); +// double deltah = h1-h0; // offset from given enthalpy in SI units +// double deltas = s1-s0; // offset from given enthalpy in SI units +// double delta_a1 = deltas/((8314.472/pFluid->params.molemass)); +// double delta_a2 = -deltah/((8314.472/pFluid->params.molemass)*pFluid->reduce.T); +// pFluid->phi0list.push_back(new phi0_enthalpy_entropy_offset(delta_a1, delta_a2)); +// return 0; +// } +// else{ +// return -1; +// } +//} + +//std::string get_BibTeXKey(std::string Ref, std::string item) +//{ +// pFluid=Fluids.get_fluid(Ref); +// if (pFluid!=NULL) +// { +// +// if (!item.compare("EOS")){ return pFluid->BibTeXKeys.EOS; } +// else if (!item.compare("CP0")){ return pFluid->BibTeXKeys.CP0; } +// else if (!item.compare("VISCOSITY")){ return pFluid->BibTeXKeys.VISCOSITY; } +// else if (!item.compare("CONDUCTIVITY")){ return pFluid->BibTeXKeys.CONDUCTIVITY; } +// else if (!item.compare("ECS_LENNARD_JONES")){ return pFluid->BibTeXKeys.ECS_LENNARD_JONES; } +// else if (!item.compare("ECS_FITS")){ return pFluid->BibTeXKeys.ECS_FITS; } +// else if (!item.compare("SURFACE_TENSION")){ return pFluid->BibTeXKeys.SURFACE_TENSION; } +// else{ return "Bad key";} +// } +// else{ +// return std::string(""); +// } +//} +std::string get_global_param_string(std::string ParamName) +{ + if (!ParamName.compare("version")){ + return version; + } + else if (!ParamName.compare("gitrevision")){ + return gitrevision; + } + else if (!ParamName.compare("errstring")){ + std::string temp = error_string; + error_string = std::string(""); + return temp; + } + else if (!ParamName.compare("warnstring")){ + std::string temp = warning_string; + warning_string = std::string(""); + return temp; + } + else if (!ParamName.compare("FluidsList") || !ParamName.compare("fluids_list") || !ParamName.compare("fluidslist")){ + return get_fluid_list(); + } + else{ + return format("Input value [%s] is invalid",ParamName.c_str()).c_str(); + } +}; +//std::string get_fluid_param_string(std::string FluidName, std::string ParamName) +//{ +// try{ +// pFluid = Fluids.get_fluid(FluidName); +// // Didn't work +// if (pFluid == NULL){ +// err_string=std::string("CoolProp error: ").append(format("%s is an invalid fluid for get_fluid_param_string",FluidName.c_str())); +// return format("%s is an invalid fluid for get_fluid_param_string",FluidName.c_str()).c_str(); +// } +// else{ +// if (!ParamName.compare("aliases")) +// { +// std::vector v = pFluid->get_aliases(); +// return strjoin(v,", "); +// } +// else if (!ParamName.compare("CAS") || !ParamName.compare("CAS_number")) +// { +// return pFluid->params.CAS; +// } +// else if (!ParamName.compare("ASHRAE34")) +// { +// return pFluid->environment.ASHRAE34; +// } +// else if (!ParamName.compare("REFPROPName") || !ParamName.compare("REFPROP_name") || !ParamName.compare("REFPROPname")) +// { +// return pFluid->get_REFPROPname(); +// } +// else if (!ParamName.compare("TTSE_mode")) +// { +// int mode = pFluid->TTSESinglePhase.get_mode(); +// switch (mode) +// { +// case TTSE_MODE_TTSE: +// return "TTSE"; +// case TTSE_MODE_BICUBIC: +// return "BICUBIC"; +// default: +// throw ValueError("TTSE mode is invalid"); +// } +// } +// else +// { +// return format("Input value [%s] is invalid for Fluid [%s]",ParamName.c_str(),FluidName.c_str()).c_str(); +// } +// } +// } +// catch(std::exception &e) +// { +// return(std::string("CoolProp error: ").append(e.what())); +// } +// catch(...){ +// return(std::string("CoolProp error: Indeterminate error")); +// } +//} + +} /* namespace CoolProp */ \ No newline at end of file diff --git a/src/CoolProp.i b/src/CoolProp.i new file mode 100644 index 00000000..7a56faf3 --- /dev/null +++ b/src/CoolProp.i @@ -0,0 +1,42 @@ +%module CoolProp + +%ignore CoolProp::AbstractState::set_mole_fractions(const std::vector< long double> &); +%ignore CoolProp::AbstractState::set_mass_fractions(const std::vector< long double> &); + +%include "std_string.i" // This %include allows the use of std::string natively +%include "std_vector.i" // This allows for the use of STL vectors natively(ish) +%include "exception.i" // + +// Instantiate templates used by example +namespace std { + %template(LongDoubleVector) vector; + %template(DoubleVector) vector; +} + +%exception { + try { + $action + } catch (std::exception &e) { + SWIG_exception(SWIG_RuntimeError, e.what()); + } catch (...) { + SWIG_exception(SWIG_RuntimeError, "unknown exception"); + } +} + +// +%rename(CoolProp_SimpleState) CoolProp::SimpleState; + +#ifdef SWIGOCTAVE + %ignore DerivTerms(char *Term, double T, double rho, Fluid * pFluid, bool SinglePhase, bool TwoPhase); +#endif + +// This stuff will get included verbatim in CoolProp_wrap +%{ +#include "AbstractState.h" +#include "DataStructures.h" +#include "CoolProp.h" +%} + +%include "AbstractState.h" +%include "DataStructures.h" +%include "CoolProp.h" \ No newline at end of file diff --git a/src/CoolPropDLL.cpp b/src/CoolPropDLL.cpp new file mode 100644 index 00000000..c783aac6 --- /dev/null +++ b/src/CoolPropDLL.cpp @@ -0,0 +1,180 @@ +#if defined(_MSC_VER) +#define _CRTDBG_MAP_ALLOC +#define _CRT_SECURE_NO_WARNINGS +#include +#endif + +#include "CoolPropDLL.h" +#include "CoolProp.h" +#include "HumidAirProp.h" +#include "DataStructures.h" +#include "Exceptions.h" + + +double convert_from_kSI_to_SI(long iInput, double value) +{ + if (get_debug_level() > 8){ + std::cout << format("%s:%d: convert_from_kSI_to_SI(i=%d,value=%g)\n",__FILE__,__LINE__,iInput,value).c_str(); + } + + switch (iInput) + { + case CoolProp::iP: + case CoolProp::iCpmass: + case CoolProp::iCp0mass: + case CoolProp::iSmass: + case CoolProp::iGmass: + case CoolProp::iCvmass: + case CoolProp::iHmass: + case CoolProp::iUmass: + case CoolProp::iconductivity: + return value*1000.0; + case CoolProp::iDmass: + case CoolProp::ispeed_sound: + case CoolProp::iQ: + case CoolProp::iviscosity: + case CoolProp::iT: + case CoolProp::iPrandtl: + case CoolProp::isurface_tension: + return value; + default: + throw CoolProp::ValueError(format("index [%d] is invalid in convert_from_kSI_to_SI",iInput).c_str()); + break; + } + return _HUGE; +} + +double convert_from_SI_to_kSI(long iInput, double value) +{ + if (get_debug_level() > 8){ + std::cout << format("%s:%d: convert_from_SI_to_kSI(%d,%g)\n",__FILE__,__LINE__,iInput,value).c_str(); + } + + switch (iInput) + { + case CoolProp::iP: + case CoolProp::iCpmass: + case CoolProp::iCp0mass: + case CoolProp::iSmass: + case CoolProp::iGmass: + case CoolProp::iCvmass: + case CoolProp::iHmass: + case CoolProp::iUmass: + case CoolProp::iconductivity: + return value/1000.0; + case CoolProp::iDmass: + case CoolProp::iQ: + case CoolProp::ispeed_sound: + case CoolProp::iviscosity: + case CoolProp::iT: + case CoolProp::isurface_tension: + return value; + default: + throw CoolProp::ValueError(format("index [%d] is invalid in convert_from_SI_to_kSI", iInput).c_str()); + break; + } + return _HUGE; +} + +EXPORT_CODE long CONVENTION redirect_stdout(const char* file){ + freopen(file, "a+", stdout); + return 0; +} +//EXPORT_CODE int CONVENTION set_reference_stateS(const char *Ref, const char *reference_state) +//{ +// return set_reference_stateS(std::string(Ref), std::string(reference_state)); +//} +//EXPORT_CODE int CONVENTION set_reference_stateD(const char *Ref, double T, double rho, double h0, double s0) +//{ +// return set_reference_stateD(std::string(Ref), T, rho, h0, s0); +//} + +// All the function interfaces that point to the single-input Props function +EXPORT_CODE double CONVENTION Props1(const char *FluidName, const char *Output){ + return PropsS(Output, "", 0, "", 0, FluidName); +} +EXPORT_CODE double CONVENTION PropsS(const char *Output, const char* Name1, double Prop1, const char* Name2, double Prop2, const char * Ref){ + double val = Props(Output,Name1[0],Prop1,Name2[0],Prop2,Ref); + return val; +} +EXPORT_CODE double CONVENTION Props(const char *Output, char Name1, double Prop1, char Name2, double Prop2, const char * Ref) +{ + try + { + // Get parameter indices + std::string sName1 = std::string(1, Name1), sName2 = std::string(1, Name2); + long iOutput = get_param_index(Output); + long iName1 = CoolProp::get_parameter_index(sName1); + long iName2 = CoolProp::get_parameter_index(sName2); + + // Convert inputs to SI + Prop1 = convert_from_kSI_to_SI(iName1, Prop1); + Prop2 = convert_from_kSI_to_SI(iName2, Prop2); + + // Call the SI function + double val = PropsSI(Output, sName1.c_str(), Prop1, sName2.c_str(), Prop2, Ref); + + // Convert back to unit system + return convert_from_SI_to_kSI(iOutput, val); + } + catch(std::exception &e){CoolProp::set_error_string(e.what()); return _HUGE;} + catch(...){CoolProp::set_error_string("Undefined error"); return _HUGE;} +} +EXPORT_CODE double CONVENTION Props1SI(const char *FluidName, const char *Output) +{ + std::string _Output = Output, _FluidName = FluidName; + return CoolProp::PropsSI(_Output, "", 0, "", 0, _FluidName); +} +EXPORT_CODE double CONVENTION PropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char * FluidName) +{ + std::string _Output = Output, _Name1 = Name1, _Name2 = Name2, _FluidName = FluidName; + return CoolProp::PropsSI(_Output, _Name1, Prop1, _Name2, Prop2, _FluidName); +} +EXPORT_CODE double CONVENTION PropsSIZ(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char * FluidName, const double *z, int n) +{ + std::string _Output = Output, _Name1 = Name1, _Name2 = Name2, _FluidName = FluidName; + return CoolProp::PropsSI(_Output, _Name1, Prop1, _Name2, Prop2, _FluidName, std::vector(z, z+n)); +} +EXPORT_CODE void CONVENTION F77PropsSI(const char *Output, const char *Name1, double *Prop1, const char *Name2, double *Prop2, const char * FluidName, double *output) +{ + std::string _Output = Output, _Name1 = Name1, _Name2 = Name2, _FluidName = FluidName; + *output = CoolProp::PropsSI(_Output, _Name1, *Prop1, _Name2, *Prop2, _FluidName); +} + +EXPORT_CODE double CONVENTION K2F(double T){ + return T * 9 / 5 - 459.67; +} +EXPORT_CODE double CONVENTION F2K(double T_F){ + return (T_F + 459.67) * 5 / 9; +} +EXPORT_CODE int CONVENTION get_debug_level(){ + return CoolProp::get_debug_level(); +} +EXPORT_CODE void CONVENTION set_debug_level(int level){ + CoolProp::set_debug_level(level); +} +EXPORT_CODE long CONVENTION get_param_index(const char * param){ + return CoolProp::get_parameter_index(param); +} +#ifndef SWIG +EXPORT_CODE long CONVENTION get_global_param_string(const char *param, char * Output) +{ + strcpy(Output,CoolProp::get_global_param_string(param).c_str()); + return 0; +} +//EXPORT_CODE long CONVENTION get_fluid_param_string(const char *fluid, const char *param, char * Output) +//{ +// strcpy(Output, get_fluid_param_string(std::string(fluid), std::string(param)).c_str()); +// return 0; +//} +#endif + + +EXPORT_CODE double CONVENTION HAPropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char * Name3, double Prop3) +{ + return HumidAir::HAPropsSI(Output, Name1, Prop1, Name2, Prop2, Name3, Prop3); +} +EXPORT_CODE void CONVENTION F77HAPropsSI(const char *Output, const char *Name1, double *Prop1, const char *Name2, double *Prop2, const char * Name3, double * Prop3, double *output) +{ + *output = HumidAir::HAPropsSI(Output, Name1, *Prop1, Name2, *Prop2, Name3, *Prop3); +} diff --git a/src/CoolPropTools.cpp b/src/CoolPropTools.cpp new file mode 100644 index 00000000..2a2efbad --- /dev/null +++ b/src/CoolPropTools.cpp @@ -0,0 +1,215 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include +#include "math.h" +#include "stdio.h" +#include "float.h" +#include +#include "CoolPropTools.h" + +double root_sum_square(std::vector x) +{ + double sum = 0; + for (unsigned int i=0; i strsplit(std::string s, char del) +{ + int iL = 0, iR = 0, N; + N = s.size(); + std::vector v; + // Find the first instance of the delimiter + iR = s.find_first_of(del); + // Delimiter not found, return the same string again + if (iR < 0){ + v.push_back(s); + return v; + } + while (iR != N-1) + { + v.push_back(s.substr(iL,iR-iL)); + iL = iR; + iR = s.find_first_of(del,iR+1); + // Move the iL to the right to avoid the delimiter + iL += 1; + if (iR == (int)std::string::npos) + { + v.push_back(s.substr(iL,N-iL)); + break; + } + } + return v; +} + +double interp1d(std::vector *x, std::vector *y, double x0) +{ + unsigned int i,L,R,M; + L=0; + R=(*x).size()-1; + M=(L+R)/2; + // Use interval halving to find the indices which bracket the density of interest + while (R-L>1) + { + if (x0 >= (*x)[M]) + { L=M; M=(L+R)/2; continue;} + if (x0 < (*x)[M]) + { R=M; M=(L+R)/2; continue;} + } + i=L; + if (i<(*x).size()-2) + { + // Go "forwards" with the interpolation range + return QuadInterp((*x)[i],(*x)[i+1],(*x)[i+2],(*y)[i],(*y)[i+1],(*y)[i+2],x0); + } + else + { + // Go "backwards" with the interpolation range + return QuadInterp((*x)[i],(*x)[i-1],(*x)[i-2],(*y)[i],(*y)[i-1],(*y)[i-2],x0); + } +} +double powInt(double x, int y) +{ + // Raise a double to an integer power + // Overload not provided in math.h + int i; + double product=1.0; + double x_in; + int y_in; + + if (y==0) + { + return 1.0; + } + + if (y<0) + { + x_in=1/x; + y_in=-y; + } + else + { + x_in=x; + y_in=y; + } + + if (y_in==1) + { + return x_in; + } + + product=x_in; + for (i=1;i0 && p<0) + { + t0 = -2.0*fabs(q)/q*sqrt(-p/3.0)*cosh(1.0/3.0*acosh(-3.0*fabs(q)/(2.0*p)*sqrt(-3.0/p))); + } + else + { + t0 = -2.0*sqrt(p/3.0)*sinh(1.0/3.0*asinh(3.0*q/(2.0*p)*sqrt(3.0/p))); + } + N = 1; + x0 = t0-b/(3*a); + x1 = t0-b/(3*a); + x2 = t0-b/(3*a); + } + else //(DELTA>0) + { + // Three real roots + double t0 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-0*2.0*M_PI/3.0); + double t1 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-1*2.0*M_PI/3.0); + double t2 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-2*2.0*M_PI/3.0); + + N = 3; + x0 = t0-b/(3*a); + x1 = t1-b/(3*a); + x2 = t2-b/(3*a); + } +} + +std::string strjoin(std::vector strings, std::string delim) +{ + // Empty input vector + if (strings.empty()){return "";} + + std::string output = strings[0]; + for (unsigned int i = 1; i < strings.size(); i++) + { + output += format("%s%s",delim.c_str(),strings[i].c_str()); + } + return output; +} diff --git a/src/DataStructures.cpp b/src/DataStructures.cpp new file mode 100644 index 00000000..618c1d52 --- /dev/null +++ b/src/DataStructures.cpp @@ -0,0 +1,207 @@ + + +#include "DataStructures.h" +#include "Exceptions.h" +#include "CoolPropTools.h" + +namespace CoolProp{ + +struct parameter_info +{ + int key; + std::string short_desc, IO, units, description; +public: + parameter_info(int key, std::string short_desc, std::string IO, std::string units, std::string description): key(key), short_desc(short_desc), IO(IO), units(units), description(description){}; +}; + +parameter_info parameter_info_list[] = { + /// Input/Output parameters + parameter_info(iT, "T", "IO", "K", "Temperature"), + parameter_info(iP, "P", "IO", "Pa", "Pressure"), + parameter_info(iDmolar, "Dmolar","IO","mol/m^3","Molar density"), + parameter_info(iHmolar, "Hmolar","IO","J/mol","Molar specific enthalpy"), + parameter_info(iSmolar, "Smolar","IO","J/mol/K","Molar specific entropy"), + parameter_info(iUmolar, "Umolar","IO","J/mol","Molar specific internal energy"), + parameter_info(iDmass, "Dmass","IO","kg/m^3","Mass density"), + parameter_info(iHmass, "Hmass","IO","J/kg","Mass specific enthalpy"), + parameter_info(iSmass, "Smass","IO","J/kg/K","Mass specific entropy"), + parameter_info(iUmass, "Umass","IO","J/kg","Mass specific internal energy"), + parameter_info(iQ, "Q","IO","mol/mol","Mass vapor quality"), + parameter_info(iDelta, "Delta","IO","-","Reduced density (rho/rhoc)"), + parameter_info(iTau, "Tau","IO","-","Reciprocal reduced temperature (Tc/T)"), + /// Output only + parameter_info(iCpmolar, "Cpmolar","O","J/mol/K","Molar specific constant presssure specific heat"), + parameter_info(iCpmass, "Cpmass","O","J/kg/K","Mass specific constant presssure specific heat"), + parameter_info(iCvmolar, "Cvmolar","O","J/mol/K","Molar specific constant volume specific heat"), + parameter_info(iCvmass, "Cvmass","O","J/kg/K","Mass specific constant volume specific heat"), + parameter_info(iGWP20, "GWP20","O","-","20-year gobal warming potential"), + parameter_info(iGWP100, "GWP100","O","-","100-year gobal warming potential"), + parameter_info(iGWP500, "GWP500","O","-","500-year gobal warming potential"), + parameter_info(iFH, "FH","O","-","Flammability hazard"), + parameter_info(iHH, "HH","O","-","Health hazard"), + parameter_info(iPH, "PH","O","-","Physical hazard"), + parameter_info(iODP, "ODP","O","-","Ozone depletion potential"), + parameter_info(iBvirial, "Bvirial","O","-","Second virial coefficient"), + parameter_info(iCvirial, "Cvirial","O","-","Third virial coefficient"), + parameter_info(idBvirial_dT, "dBvirial_dT","O","-","Derivative of second virial coefficient with respect to T"), + parameter_info(idCvirial_dT, "dCvirial_dT","O","-","Derivative of third virial coefficient with respect to T"), + parameter_info(imolar_mass, "molar_mass","O","kg/mol","Molar mass"), + parameter_info(irhomolar_reducing, "rhomolar_reducing","O","mol/m^3","Molar density at reducing point"), + parameter_info(irhomolar_critical, "rhomolar_critical","O","mol/m^3","Molar density at critical point"), + parameter_info(iT_reducing, "T_reducing","O","K","Temperature at the reducing point"), + parameter_info(iT_critical, "T_critical","O","K","Temperature at the critical point"), + parameter_info(iisothermal_compressibility, "isothermal_compressibility","O","1/Pa","Isothermal compressibility") +}; + +class ParameterInformation +{ +public: + std::map short_desc_map, description_map, IO_map, units_map; + std::map index_map; + ParameterInformation() + { + int N = sizeof(parameter_info_list)/sizeof(parameter_info_list[0]); + for (int i = 0; i < N; ++i) + { + parameter_info &el = parameter_info_list[i]; + short_desc_map.insert(std::pair(el.key, el.short_desc)); + IO_map.insert(std::pair(el.key, el.IO)); + units_map.insert(std::pair(el.key, el.units)); + description_map.insert(std::pair(el.key, el.description)); + index_map.insert(std::pair(el.short_desc, el.key)); + } + // Backward compatibility aliases + index_map.insert(std::pair("D", iDmass)); + index_map.insert(std::pair("H", iHmass)); + index_map.insert(std::pair("S", iSmass)); + index_map.insert(std::pair("U", iUmass)); + index_map.insert(std::pair("C", iCpmass)); + index_map.insert(std::pair("O", iCvmass)); + } +}; + +static ParameterInformation parameter_information; + +std::string get_parameter_information(int key, std::string info) +{ + std::map *M; + std::map::iterator it; + + // Hook up the right map (since they are all of the same type) + if (!info.compare("IO")){ + M = &(parameter_information.IO_map); + } + else if (!info.compare("short")){ + M = &(parameter_information.short_desc_map); + } + else if (!info.compare("long")){ + M = &(parameter_information.description_map); + } + else if (!info.compare("units")){ + M = &(parameter_information.units_map); + } + else + throw ValueError(format("Bad info string [%s] to get_parameter_information",info.c_str())); + + // Try to find it + it = (*M).find(key); + // If equal to end, not found + if (it != (*M).end()) + { + // Found it, return it + return it->second; + } + else + { + throw ValueError(format("Unable to match the key [%d] in get_parameter_information for info [%s]",key, info.c_str())); + } +} + +int get_parameter_index(const std::string ¶m_name) +{ + std::map::iterator it; + // Try to find it + it = parameter_information.index_map.find(param_name); + // If equal to end, not found + if (it != parameter_information.index_map.end()) + { + // Found, return it + return it->second; + } + else + { + throw ValueError(format("Your input name [%s] is not valid in get_parameter_index (names are case sensitive)",param_name.c_str())); + } +} + +struct input_pair_info +{ + int key; + std::string short_desc, long_desc; +public: + input_pair_info(int key, std::string short_desc, std::string long_desc): key(key), short_desc(short_desc), long_desc(long_desc){}; +}; + +input_pair_info input_pair_list[] = { + input_pair_info(QT_INPUTS,"QT_INPUTS","Molar quality, Temperature in K"), + input_pair_info(PQ_INPUTS,"PQ_INPUTS","Pressure in Pa, Molar quality"), + input_pair_info(PT_INPUTS, "PT_INPUTS","Pressure in Pa, Temperature in K"), + + input_pair_info(DmassT_INPUTS, "DmassT_INPUTS", "Mass density in kg/m^3, Temperature in K"), + input_pair_info(DmolarT_INPUTS, "DmolarT_INPUTS", "Molar density in mol/m^3, Temperature in K"), + input_pair_info(HmassT_INPUTS, "HmassT_INPUTS", "Enthalpy in J/kg, Temperature in K"), + input_pair_info(HmolarT_INPUTS, "HmolarT_INPUTS", "Enthalpy in J/mol, Temperature in K"), + input_pair_info(SmassT_INPUTS, "SmassT_INPUTS", "Entropy in J/kg/K, Temperature in K"), + input_pair_info(SmolarT_INPUTS, "SmolarT_INPUTS", "Entropy in J/mol/K, Temperature in K"), + input_pair_info(TUmass_INPUTS, "TUmass_INPUTS", "Temperature in K, Internal energy in J/kg"), + input_pair_info(TUmolar_INPUTS, "TUmolar_INPUTS", "Temperature in K, Internal energy in J/mol"), + + input_pair_info(DmassP_INPUTS, "DmassP_INPUTS", "Mass density in kg/m^3, Pressure in Pa"), + input_pair_info(DmolarP_INPUTS, "DmolarP_INPUTS", "Molar density in mol/m^3, Pressure in Pa"), + input_pair_info(HmassP_INPUTS, "HmassP_INPUTS", "Enthalpy in J/kg, Pressure in Pa"), + input_pair_info(HmolarP_INPUTS, "HmolarP_INPUTS", "Enthalpy in J/mol, Pressure in Pa"), + input_pair_info(PSmass_INPUTS, "PSmass_INPUTS", "Pressure in Pa, Entropy in J/kg/K"), + input_pair_info(PSmolar_INPUTS, "PSmolar_INPUTS", "Pressure in Pa, Entropy in J/mol/K "), + input_pair_info(PUmass_INPUTS, "PUmass_INPUTS", "Pressure in Pa, Internal energy in J/kg"), + input_pair_info(PUmolar_INPUTS, "PUmolar_INPUTS", "Pressure in Pa, Internal energy in J/mol"), + + input_pair_info(DmassHmass_INPUTS, "DmassHmass_INPUTS","Mass density in kg/m^3, Enthalpy in J/kg"), + input_pair_info(DmolarHmolar_INPUTS, "DmolarHmolar_INPUTS","Molar density in mol/m^3, Enthalpy in J/mol"), + input_pair_info(DmassSmass_INPUTS, "DmassSmass_INPUTS","Mass density in kg/m^3, Entropy in J/kg/K"), + input_pair_info(DmolarSmolar_INPUTS, "DmolarSmolar_INPUTS","Molar density in mol/m^3, Entropy in J/mol/K"), + input_pair_info(DmassUmass_INPUTS, "DmassUmass_INPUTS","Mass density in kg/m^3, Internal energy in J/kg"), + input_pair_info(DmolarUmolar_INPUTS, "DmolarUmolar_INPUTS","Molar density in mol/m^3, Internal energy in J/mol"), + + input_pair_info(HmassSmass_INPUTS, "HmassSmass_INPUTS", "Enthalpy in J/kg, Entropy in J/kg/K"), + input_pair_info(HmolarSmolar_INPUTS, "HmolarSmolar_INPUTS", "Enthalpy in J/mol, Entropy in J/mol/K"), + input_pair_info(SmassUmass_INPUTS, "SmassUmass_INPUTS", "Entropy in J/kg/K, Internal energy in J/kg"), + input_pair_info(SmolarUmolar_INPUTS, "SmolarUmolar_INPUTS", "Entropy in J/mol/K, Internal energy in J/mol"), +}; + +class InputPairInformation +{ +public: + std::map short_desc_map, long_desc_map; + InputPairInformation() + { + int N = sizeof(input_pair_list)/sizeof(input_pair_list[0]); + for (int i = 0; i < N; ++i) + { + short_desc_map.insert(std::pair(input_pair_list[i].key, input_pair_list[i].short_desc)); + long_desc_map.insert(std::pair(input_pair_list[i].key, input_pair_list[i].long_desc)); + } + } +}; + +static InputPairInformation input_pair_information; + +std::string get_input_pair_short_desc(int pair) +{ + return input_pair_information.short_desc_map[pair]; +} +std::string get_input_pair_long_desc(int pair) +{ + return input_pair_information.long_desc_map[pair]; +} + +} /* namespace CoolProp */ \ No newline at end of file diff --git a/src/Fluids/CoolPropFluid.cpp b/src/Fluids/CoolPropFluid.cpp new file mode 100644 index 00000000..d18095dc --- /dev/null +++ b/src/Fluids/CoolPropFluid.cpp @@ -0,0 +1,12 @@ +/* + * CoolPropFluid.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#include "CoolPropFluid.h" + +namespace CoolProp { + +} /* namespace CoolProp */ diff --git a/src/Fluids/CoolPropFluid.h b/src/Fluids/CoolPropFluid.h new file mode 100644 index 00000000..f77affe7 --- /dev/null +++ b/src/Fluids/CoolPropFluid.h @@ -0,0 +1,353 @@ +/* + * CoolPropFluid.h + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#ifndef COOLPROPFLUID_H_ +#define COOLPROPFLUID_H_ + +#include "DataStructures.h" +#include "Helmholtz.h" +#include "Solvers.h" + +#include +#include +#include +#include +#include +#include + +namespace CoolProp { + +struct BibTeXKeysStruct +{ + std::string EOS, + CP0, + VISCOSITY, + CONDUCTIVITY, + ECS_LENNARD_JONES, + ECS_FITS, + SURFACE_TENSION; +}; + +struct EnvironmentalFactorsStruct +{ + double GWP20, GWP100, GWP500, ODP, HH, PH, FH; + std::string ASHRAE34; +}; + +/// A set of limits for the eos parameters +struct EOSLimits +{ + double Tmin, Tmax, rhomax, pmax; +}; + +class ViscosityCorrelation +{ +public: + double dilute(double T, double rhomolar); + double residual(double T, double rhomolar); + double critical(double T, double rhomolar); +}; +class ThermalConductivityCorrelation +{ +public: + double dilute(double T, double rhomolar); + double residual(double T, double rhomolar); + double critical(double T, double rhomolar); +}; + +/** +The surface tension correlation class uses correlations for the surface tension that are all +of the form + +\f[ +\sigma = \sum_{i=0}^{k-1}a_i\left(1-\frac{T}{\tilde T_c}\right)^{n_i} +\f] + +where \f$ \tilde T_c \f$ is the critical temperature used for the correlation which is +almost always equal to the critical temperature of the equation of state. Result for +surface tension is in N/m +*/ +class SurfaceTensionCorrelation +{ + std::vector a, n, s; + long double Tc; + std::string BibTeX; + std::size_t N; +public: + + SurfaceTensionCorrelation(){}; + SurfaceTensionCorrelation(rapidjson::Value &json_code) + { + a = cpjson::get_long_double_array(json_code["a"]); + n = cpjson::get_long_double_array(json_code["n"]); + + Tc = cpjson::get_double(json_code,"Tc"); + BibTeX = cpjson::get_string(json_code,"BibTeX"); + + this->N = n.size(); + s = n; + }; + long double evaluate(long double T) + { + long double THETA = 1-T/Tc; + for (std::size_t i = 0; i < N; ++i) + { + s[i] = a[i]*pow(THETA, n[i]); + } + return std::accumulate(s.begin(), s.end(), 0.0); + } +}; +/** +*/ +class SaturationAncillaryFunction +{ +private: + std::vector n, t, s; + bool using_tau_r; + double Tmax, Tmin, reducing_value, T_r; + int type; + enum ancillaryfunctiontypes{TYPE_NOT_EXPONENTIAL = 0, TYPE_EXPONENTIAL = 1}; + std::size_t N; +public: + + SaturationAncillaryFunction(){}; + SaturationAncillaryFunction(rapidjson::Value &json_code) + { + n = cpjson::get_double_array(json_code["n"]); + t = cpjson::get_double_array(json_code["t"]); + Tmin = cpjson::get_double(json_code,"Tmin"); + Tmax = cpjson::get_double(json_code,"Tmax"); + reducing_value = cpjson::get_double(json_code,"reducing_value"); + using_tau_r = cpjson::get_bool(json_code,"using_tau_r"); + T_r = cpjson::get_double(json_code,"T_r"); + std::string type = cpjson::get_string(json_code,"type"); + + if (!type.compare("rhoLnoexp")) + this->type = TYPE_NOT_EXPONENTIAL; + else + this->type = TYPE_EXPONENTIAL; + this->N = n.size(); + s = n; + }; + double evaluate(double T) + { + double THETA = 1-T/T_r; + + for (std::size_t i = 0; i < N; ++i) + { + s[i] = n[i]*pow(THETA, t[i]); + } + double summer = std::accumulate(s.begin(), s.end(), 0.0); + + if (type == TYPE_NOT_EXPONENTIAL) + { + return reducing_value*(1+summer); + } + else + { + double tau_r_value; + if (using_tau_r) + tau_r_value = T_r/T; + else + tau_r_value = 1.0; + return reducing_value*exp(tau_r_value*summer); + } + } + double invert(double value) + { + // Invert the ancillary curve to get the temperature as a function of the output variable + // Define the residual to be driven to zero + class solver_resid : public FuncWrapper1D + { + public: + int other; + SaturationAncillaryFunction *anc; + long double T, value, r, current_value; + + solver_resid(SaturationAncillaryFunction *anc, long double value) : anc(anc), value(value){}; + + double call(double T){ + this->T = T; + current_value = anc->evaluate(T); + r = current_value - value; + return r; + }; + }; + solver_resid resid(this, value); + std::string errstring; + + return Brent(resid,Tmin,Tmax,DBL_EPSILON,1e-12,100,errstring); + } +}; + +class MeltingLine +{ +}; + +struct Ancillaries +{ + SaturationAncillaryFunction pL, pV, rhoL, rhoV; + MeltingLine melting_line; + SurfaceTensionCorrelation surface_tension; +}; + +/// The core class for an equation of state +/** + This class holds the absolute minimum information to evaluate the equation + of state. This includes the reducing state, limits on the equation of state, + the coefficients for the Helmholtz derivative terms. + + It does NOT include derived parameters like specific heat, enthalpy, etc. +*/ +class EquationOfState{ +public: + EquationOfState(){}; + ~EquationOfState(){}; + SimpleState reduce; ///< Reducing state used for the EOS (usually, but not always, the critical point) + EOSLimits limits; ///< Limits on the EOS + double R_u, ///< The universal gas constant used for this EOS (usually, but not always, 8.314472 J/mol/K) + molar_mass, ///< The molar mass in kg/mol (note NOT kg/kmol) + accentric, ///< The accentric factor \f$ \omega = -log_{10}\left(\frac{p_s(T/T_c=0.7)}{p_c}\right)-1\f$ + Ttriple, ///< Triple point temperature (K) + ptriple, ///< Triple point pressure (Pa) + rhoLtriple, ///< Density of liquid at triple point pressure (mol/m^3) + rhoVtriple; ///< Density of vapor at triple point pressure (mol/m^3) + bool pseudo_pure; ///< Is a pseudo-pure fluid (true) or pure fluid (false) + ResidualHelmholtzContainer alphar; ///< The residual Helmholtz energy + IdealHelmholtzContainer alpha0; ///< The ideal Helmholtz energy + + /// Validate the EOS that was just constructed + void validate() + { + assert(R_u < 9 && R_u > 8); + assert(molar_mass > 0.001 && molar_mass < 1); + }; + long double baser(const long double &tau, const long double &delta) throw() + { + return alphar.base(tau, delta); + }; + // First partials + long double dalphar_dDelta(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta(tau, delta); + }; + long double dalphar_dTau(const long double &tau, const long double &delta) throw() + { + return alphar.dTau(tau, delta); + }; + // Second partials + long double d2alphar_dDelta2(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta2(tau, delta); + }; + long double d2alphar_dDelta_dTau(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta_dTau(tau, delta); + }; + long double d2alphar_dTau2(const long double &tau, const long double &delta) throw() + { + return alphar.dTau2(tau, delta); + }; + // Third partials + long double d3alphar_dDelta3(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta3(tau, delta); + }; + long double d3alphar_dDelta2_dTau(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta2_dTau(tau, delta); + }; + long double d3alphar_dDelta_dTau2(const long double &tau, const long double &delta) throw() + { + return alphar.dDelta_dTau2(tau, delta); + }; + long double d3alphar_dTau3(const long double &tau, const long double &delta) throw() + { + return alphar.dTau3(tau, delta); + }; + + + long double base0(const long double &tau, const long double &delta) throw() + { + return alpha0.base(tau, delta); + }; + // First partials + long double dalpha0_dDelta(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta(tau, delta); + }; + long double dalpha0_dTau(const long double &tau, const long double &delta) throw() + { + return alpha0.dTau(tau, delta); + }; + // Second partials + long double d2alpha0_dDelta2(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta2(tau, delta); + }; + long double d2alpha0_dDelta_dTau(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta_dTau(tau, delta); + }; + long double d2alpha0_dTau2(const long double &tau, const long double &delta) throw() + { + return alpha0.dTau2(tau, delta); + }; + // Third partials + long double d3alpha0_dDelta3(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta3(tau, delta); + }; + long double d3alpha0_dDelta2_dTau(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta2_dTau(tau, delta); + }; + long double d3alpha0_dDelta_dTau2(const long double &tau, const long double &delta) throw() + { + return alpha0.dDelta_dTau2(tau, delta); + }; + long double d3alpha0_dTau3(const long double &tau, const long double &delta) throw() + { + return alpha0.dTau3(tau, delta); + }; +}; + +/// A thermophysical property provider for critical and reducing values as well as derivatives of Helmholtz energy +/** +This fluid instance is populated using an entry from a JSON file +*/ +class CoolPropFluid { + protected: + // Transport property data + std::string ECSReferenceFluid; ///< A string that gives the name of the fluids that should be used for the ECS method for transport properties + double ECS_qd; ///< The critical qd parameter for the Olchowy-Sengers cross-over term + public: + CoolPropFluid(){}; + virtual ~CoolPropFluid(){}; + EquationOfState *pEOS; ///< A pointer to the currently used EOS + std::vector EOSVector; ///< The equations of state that could be used for this fluid + + std::string name; ///< The name of the fluid + std::string REFPROPname; ///< The REFPROP-compliant name if REFPROP-"name" is not a compatible fluid name. If not included, "name" is assumed to be a valid name for REFPROP + std::string CAS; ///< The CAS number of the fluid + std::vector aliases; ///< A vector of aliases of names for the fluid + + std::vector viscosity_vector; ///< The viscosity correlations that could be used for this fluid + std::vector thermal_conductivity_vector; ///< The thermal conductivity correlations that could be used for this fluid + std::vector surface_tension_vector; ///< The surface tension correlations that could be used for this fluid + + BibTeXKeysStruct BibTeXKeys; + EnvironmentalFactorsStruct environment; + Ancillaries ancillaries; + + double gas_constant(){ return pEOS->R_u; }; + double molar_mass(){ return pEOS->molar_mass; }; +}; + + +} /* namespace CoolProp */ +#endif /* COOLPROPFLUID_H_ */ diff --git a/src/Fluids/FluidLibrary.cpp b/src/Fluids/FluidLibrary.cpp new file mode 100644 index 00000000..86e1dc1a --- /dev/null +++ b/src/Fluids/FluidLibrary.cpp @@ -0,0 +1,33 @@ + +#include "FluidLibrary.h" +#include "../Backends/ReducingFunctions.h" +#include "all_fluids_JSON.h" // Makes a std::string variable called all_fluids_JSON + +namespace CoolProp{ + +static JSONFluidLibrary library; + +void load() +{ + rapidjson::Document dd; + // This json formatted string comes from the all_fluids_JSON.h header which is a C++-escaped version of the JSON file + dd.Parse<0>(all_fluids_JSON.c_str()); + if (dd.HasParseError()){throw ValueError("Unable to load all_fluids.json");} else{library.add_many(dd);} +} + +JSONFluidLibrary & get_library(void){ + if (library.is_empty()){ load(); } + return library; +} + +CoolPropFluid& get_fluid(std::string fluid_string){ + if (library.is_empty()){ load(); } + return library.get(fluid_string); +} + +std::string get_fluid_list(void){ + if (library.is_empty()){ load(); } + return library.get_fluid_list(); +}; + +} /* namespace CoolProp */ \ No newline at end of file diff --git a/src/Fluids/FluidLibrary.h b/src/Fluids/FluidLibrary.h new file mode 100644 index 00000000..3d9f6b33 --- /dev/null +++ b/src/Fluids/FluidLibrary.h @@ -0,0 +1,422 @@ + +#ifndef FLUIDLIBRARY_H +#define FLUIDLIBRARY_H + +#include "CoolPropFluid.h" + +#include "rapidjson/rapidjson_include.h" + +#include +#include + + +namespace CoolProp{ + +/// A container for the fluid parameters for the CoolProp fluids +/** +This container holds copies of all of the fluid instances for the fluids that are loaded in CoolProp. +New fluids can be added by passing in a rapidjson::Value instance to the add_one function, or +a rapidjson array of fluids to the add_many function. +*/ +class JSONFluidLibrary +{ + /// Map from CAS code to JSON instance. For pseudo-pure fluids, use name in place of CAS code since no CASE number is defined for mixtures + std::map fluid_map; + std::vector name_vector; + std::map string_to_index_map; + bool _is_empty; +protected: + + /// Parse the contributions to the residual Helmholtz energy + void parse_alphar(rapidjson::Value &alphar, EquationOfState &EOS) + { + for (rapidjson::Value::ValueIterator itr = alphar.Begin(); itr != alphar.End(); ++itr) + { + // A reference for code cleanness + rapidjson::Value &contribution = *itr; + + // Get the type (required!) + std::string type = contribution["type"].GetString(); + + if (!type.compare("ResidualHelmholtzPower")) + { + if (EOS.alphar.Power.N > 0){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector d = cpjson::get_long_double_array(contribution["d"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + std::vector l = cpjson::get_long_double_array(contribution["l"]); + EOS.alphar.Power = ResidualHelmholtzPower(n,d,t,l); + } + else if (!type.compare("ResidualHelmholtzGaussian")) + { + if (EOS.alphar.Gaussian.N > 0){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector d = cpjson::get_long_double_array(contribution["d"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + std::vector eta = cpjson::get_long_double_array(contribution["eta"]); + std::vector epsilon = cpjson::get_long_double_array(contribution["epsilon"]); + std::vector beta = cpjson::get_long_double_array(contribution["beta"]); + std::vector gamma = cpjson::get_long_double_array(contribution["gamma"]); + EOS.alphar.Gaussian = ResidualHelmholtzGaussian(n,d,t,eta,epsilon,beta,gamma); + } + else if (!type.compare("ResidualHelmholtzNonAnalytic")) + { + if (EOS.alphar.NonAnalytic.N > 0){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector a = cpjson::get_long_double_array(contribution["a"]); + std::vector b = cpjson::get_long_double_array(contribution["b"]); + std::vector beta = cpjson::get_long_double_array(contribution["beta"]); + std::vector A = cpjson::get_long_double_array(contribution["A"]); + std::vector B = cpjson::get_long_double_array(contribution["B"]); + std::vector C = cpjson::get_long_double_array(contribution["C"]); + std::vector D = cpjson::get_long_double_array(contribution["D"]); + EOS.alphar.NonAnalytic = ResidualHelmholtzNonAnalytic(n,a,b,beta,A,B,C,D); + } + else if (!type.compare("ResidualHelmholtzLemmon2005")) + { + if (EOS.alphar.Lemmon2005.N > 0){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector d = cpjson::get_long_double_array(contribution["d"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + std::vector l = cpjson::get_long_double_array(contribution["l"]); + std::vector m = cpjson::get_long_double_array(contribution["m"]); + EOS.alphar.Lemmon2005 = ResidualHelmholtzLemmon2005(n,d,t,l,m); + } + else if (!type.compare("ResidualHelmholtzExponential")) + { + if (EOS.alphar.Exponential.N > 0){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector d = cpjson::get_long_double_array(contribution["d"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + std::vector g = cpjson::get_long_double_array(contribution["g"]); + std::vector l = cpjson::get_long_double_array(contribution["l"]); + EOS.alphar.Exponential = ResidualHelmholtzExponential(n,d,t,g,l); + } + else if (!type.compare("ResidualHelmholtzAssociating")) + { + if (EOS.alphar.SAFT.disabled == false){throw ValueError("Cannot add ");} + long double a = cpjson::get_double(contribution,"a"); + long double m = cpjson::get_double(contribution,"m"); + long double epsilonbar = cpjson::get_double(contribution,"epsilonbar"); + long double vbarn = cpjson::get_double(contribution,"vbarn"); + long double kappabar = cpjson::get_double(contribution,"kappabar"); + EOS.alphar.SAFT = ResidualHelmholtzSAFTAssociating(a,m,epsilonbar,vbarn,kappabar); + } + else + { + throw ValueError(format("Unsupported Residual helmholtz type: %s",type.c_str())); + } + } + }; + + /// Parse the contributions to the ideal-gas Helmholtz energy + void parse_alpha0(rapidjson::Value &alpha0, EquationOfState &EOS) + { + if (!alpha0.IsArray()){throw ValueError();} + for (rapidjson::Value::ValueIterator itr = alpha0.Begin(); itr != alpha0.End(); ++itr) + { + // A reference for code cleanness + rapidjson::Value &contribution = *itr; + + // Get the type (required!) + std::string type = contribution["type"].GetString(); + + if (!type.compare("IdealGasHelmholtzLead")) + { + if (EOS.alpha0.Lead.is_enabled() == true){throw ValueError("Cannot add ");} + long double a1 = cpjson::get_double(contribution,"a1"); + long double a2 = cpjson::get_double(contribution,"a2"); + EOS.alpha0.Lead = IdealHelmholtzLead(a1, a2); + } + else if (!type.compare("IdealGasHelmholtzPower")) + { + if (EOS.alpha0.Power.is_enabled() == true){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + EOS.alpha0.Power = IdealHelmholtzPower(n, t); + } + else if (!type.compare("IdealGasHelmholtzLogTau")) + { + if (EOS.alpha0.LogTau.is_enabled() == true){throw ValueError("Cannot add ");} + long double a = cpjson::get_double(contribution,"a"); + EOS.alpha0.LogTau = IdealHelmholtzLogTau(a); + } + else if (!type.compare("IdealGasHelmholtzPlanckEinstein")) + { + if (EOS.alpha0.PlanckEinstein.is_enabled() == true){throw ValueError("Cannot add ");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + EOS.alpha0.PlanckEinstein = IdealHelmholtzPlanckEinstein(n, t); + } + else if (!type.compare("IdealGasHelmholtzPlanckEinstein2")) + { + if (EOS.alpha0.PlanckEinstein2.is_enabled() == true){throw ValueError("Cannot add");} + std::vector n = cpjson::get_long_double_array(contribution["n"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + std::vector c = cpjson::get_long_double_array(contribution["c"]); + EOS.alpha0.PlanckEinstein2 = IdealHelmholtzPlanckEinstein2(n, t, c); + } + else if (!type.compare("IdealGasHelmholtzEnthalpyEntropyOffset")) + { + if (EOS.alpha0.EnthalpyEntropyOffset.is_enabled() == true){throw ValueError("Cannot add ");} + long double a1 = cpjson::get_double(contribution, "a1"); + long double a2 = cpjson::get_double(contribution, "a2"); + EOS.alpha0.EnthalpyEntropyOffset = IdealHelmholtzEnthalpyEntropyOffset(a1, a2); + } + else if (!type.compare("IdealGasHelmholtzCP0Constant")) + { + if (EOS.alpha0.CP0Constant.is_enabled() == true){throw ValueError("Cannot add ");} + long double cp_over_R = cpjson::get_double(contribution, "cp_over_R"); + long double Tc = cpjson::get_double(contribution, "Tc"); + long double T0 = cpjson::get_double(contribution, "T0"); + EOS.alpha0.CP0Constant = IdealHelmholtzCP0Constant(cp_over_R, Tc, T0); + } + else if (!type.compare("IdealGasHelmholtzCP0PolyT")) + { + if (EOS.alpha0.CP0PolyT.is_enabled() == true){throw ValueError("Cannot add ");} + std::vector c = cpjson::get_long_double_array(contribution["c"]); + std::vector t = cpjson::get_long_double_array(contribution["t"]); + long double Tc = cpjson::get_double(contribution, "Tc"); + long double T0 = cpjson::get_double(contribution, "T0"); + EOS.alpha0.CP0PolyT = IdealHelmholtzCP0PolyT(c, t, Tc, T0); + } + else if (!type.compare("IdealGasHelmholtzCP0AlyLee")) + { + if (EOS.alpha0.CP0AlyLee.is_enabled() == true){std::cout << "Cannot add IdealGasHelmholtzCP0AlyLee\n";} + std::vector c = cpjson::get_long_double_array(contribution["c"]); + long double Tc = cpjson::get_double(contribution, "Tc"); + long double T0 = cpjson::get_double(contribution, "T0"); + EOS.alpha0.CP0AlyLee = IdealHelmholtzCP0AlyLee(c, Tc, T0); + } + else + { + std::cout << format("Unsupported ideal-gas Helmholtz type: %s\n",type.c_str()); + //throw ValueError(format("Unsupported ideal-gas Helmholtz type: %s",type.c_str())); + } + } + }; + + /// Parse the environmental parameters (ODP, GWP, etc.) + void parse_environmental(rapidjson::Value &json, CoolPropFluid &fluid) + { + fluid.environment.ASHRAE34 = cpjson::get_string(json,"ASHRAE34"); + fluid.environment.GWP20 = cpjson::get_double(json,"GWP20"); + fluid.environment.GWP100 = cpjson::get_double(json,"GWP100"); + fluid.environment.GWP500 = cpjson::get_double(json,"GWP500"); + fluid.environment.HH = cpjson::get_double(json,"HH"); + fluid.environment.FH = cpjson::get_double(json,"FH"); + fluid.environment.PH = cpjson::get_double(json,"PH"); + fluid.environment.ODP = cpjson::get_double(json,"ODP"); + } + + /// Parse the Equation of state JSON entry + void parse_EOS(rapidjson::Value &EOS_json, CoolPropFluid &fluid) + { + EquationOfState E; + fluid.EOSVector.push_back(E); + + EquationOfState &EOS = fluid.EOSVector.at(fluid.EOSVector.size()-1); + + // Universal gas constant [J/mol/K] + EOS.R_u = cpjson::get_double(EOS_json,"gas_constant"); + EOS.molar_mass = cpjson::get_double(EOS_json,"molar_mass"); + EOS.accentric = cpjson::get_double(EOS_json,"accentric"); + EOS.Ttriple = cpjson::get_double(EOS_json, "Ttriple"); + EOS.ptriple = cpjson::get_double(EOS_json, "ptriple"); + EOS.rhoLtriple = cpjson::get_double(EOS_json, "rhoLtriple"); + EOS.rhoVtriple = cpjson::get_double(EOS_json, "rhoVtriple"); + EOS.pseudo_pure = cpjson::get_bool(EOS_json, "pseudo_pure"); + EOS.limits.Tmax = cpjson::get_double(EOS_json, "T_max"); + EOS.limits.pmax = cpjson::get_double(EOS_json, "p_max"); + + rapidjson::Value &reducing_state = EOS_json["reducing_state"]; + + // Reducing state + EOS.reduce.T = cpjson::get_double(reducing_state,"T"); + EOS.reduce.rhomolar = cpjson::get_double(reducing_state,"rhomolar"); + EOS.reduce.p = cpjson::get_double(reducing_state,"p"); + + + parse_alphar(EOS_json["alphar"], EOS); + parse_alpha0(EOS_json["alpha0"], EOS); + + // Validate the equation of state that was just created + EOS.validate(); + + } + + /// Parse the list of possible equations of state + void parse_EOS_listing(rapidjson::Value &EOS_array, CoolPropFluid & fluid) + { + for (rapidjson::Value::ValueIterator itr = EOS_array.Begin(); itr != EOS_array.End(); ++itr) + { + parse_EOS(*itr,fluid); + } + + // Set the EOS pointer to the first EOS + fluid.pEOS = &(fluid.EOSVector[0]); + }; + + /// Parse the reducing state for the given EOS + void parse_reducing_state(rapidjson::Value &alphar) + { + }; + + /// Parse the critical state for the given EOS + void parse_crit_state(rapidjson::Value &alphar) + { + }; + + /// Parse the critical state for the given EOS + void parse_ancillaries(rapidjson::Value &ancillaries, CoolPropFluid & fluid) + { + if (!ancillaries.HasMember("pL") || !ancillaries.HasMember("pV") || !ancillaries.HasMember("rhoL") || !ancillaries.HasMember("rhoV")){throw ValueError("Ancillary curves are missing");}; + fluid.ancillaries.pL = SaturationAncillaryFunction(ancillaries["pL"]); + fluid.ancillaries.pV = SaturationAncillaryFunction(ancillaries["pV"]); + fluid.ancillaries.rhoL = SaturationAncillaryFunction(ancillaries["rhoL"]); + fluid.ancillaries.rhoV = SaturationAncillaryFunction(ancillaries["rhoV"]); + }; + + /// Parse the surface_tension + void parse_surface_tension(rapidjson::Value &surface_tension, CoolPropFluid & fluid) + { + fluid.ancillaries.surface_tension = SurfaceTensionCorrelation(surface_tension); + }; + + /// Validate the fluid file that was just constructed + void validate(CoolPropFluid & fluid) + { + assert(fluid.EOSVector.size() > 0); + assert(fluid.CAS.length() > 0); + assert(fluid.name.length() > 0); + } +public: + + // Default constructor; + JSONFluidLibrary(){ + _is_empty = true; + }; + bool is_empty(void){ return _is_empty;}; + + /// Add all the fluid entries in the rapidjson::Value instance passed in + void add_many(rapidjson::Value &listing) + { + for (rapidjson::Value::ValueIterator itr = listing.Begin(); itr != listing.End(); ++itr) + { + add_one(*itr); + } + }; + void add_one(rapidjson::Value &fluid_json) + { + _is_empty = false; + + // Get the next index for this fluid + std::size_t index = fluid_map.size(); + + // Add index->fluid mapping + fluid_map[index] = CoolPropFluid(); + + // Create an instance of the fluid + CoolPropFluid &fluid = fluid_map[index]; + + // Fluid name + fluid.name = fluid_json["NAME"].GetString(); name_vector.push_back(fluid.name); + // CAS number + fluid.CAS = fluid_json["CAS"].GetString(); + + // Aliases + fluid.aliases = cpjson::get_string_array(fluid_json["ALIASES"]); + + // EOS + parse_EOS_listing(fluid_json["EOS"],fluid); + + // Validate the fluid + validate(fluid); + + // Ancillaries for saturation + if (!fluid_json.HasMember("ANCILLARIES")){throw ValueError(format("Ancillary curves are missing for fluid [%s]",fluid.name.c_str()));}; + parse_ancillaries(fluid_json["ANCILLARIES"],fluid); + + // Surface tension + if (!(fluid_json["ANCILLARIES"].HasMember("surface_tension"))){ + std::cout << format("Surface tension curves are missing for fluid [%s]\n", fluid.name.c_str()) ; + } + else{ + parse_surface_tension(fluid_json["ANCILLARIES"]["surface_tension"], fluid); + } + + // Parse the environmental parameters + if (!(fluid_json.HasMember("ENVIRONMENTAL"))){ + std::cout << format("Environmental data are missing for fluid [%s]\n", fluid.name.c_str()) ; + } + else{ + parse_environmental(fluid_json["ENVIRONMENTAL"], fluid); + } + + // If the fluid is ok... + + // Add CAS->index mapping + string_to_index_map[fluid.CAS] = index; + + // Add name->index mapping + string_to_index_map[fluid.name] = index; + + // Add the aliases + for (std::size_t i = 0; i < fluid.aliases.size(); ++i) + { + string_to_index_map[fluid.aliases[i]] = index; + } + + }; + /// Get a CoolPropFluid instance stored in this library + /** + @param key Either a CAS number or the name (CAS number should be preferred) + */ + CoolPropFluid& get(std::string key) + { + std::map::iterator it; + // Try to find it + it = string_to_index_map.find(key); + // If it is found + if (it != string_to_index_map.end()){ + return get(it->second); + } + else{ + throw ValueError(format("key [%s] was not found in string_to_index_map in JSONFluidLibrary",key.c_str())); + } + }; + /// Get a CoolPropFluid instance stored in this library + /** + @param key The index of the fluid in the map + */ + CoolPropFluid& get(std::size_t key) + { + std::map::iterator it; + // Try to find it + it = fluid_map.find(key); + // If it is found + if (it != fluid_map.end()){ + return it->second; + } + else{ + throw ValueError(format("key [%d] was not found in JSONFluidLibrary",key)); + } + }; + /// Return a comma-separated list of fluid names + std::string get_fluid_list(void) + { + return strjoin(name_vector, ","); + }; +}; + +/// Get a reference to the library instance +JSONFluidLibrary & get_library(void); + +/// Get a comma-separated-list of fluids that are included +std::string get_fluid_list(void); + +/// Get the fluid structure returned as a reference +CoolPropFluid& get_fluid(std::string fluid_string); + +} /* namespace CoolProp */ +#endif \ No newline at end of file diff --git a/src/Fluids/Incompressible.cpp b/src/Fluids/Incompressible.cpp new file mode 100644 index 00000000..f2382558 --- /dev/null +++ b/src/Fluids/Incompressible.cpp @@ -0,0 +1,21 @@ +/* + * Incompressible.cpp + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#include "Incompressible.h" + +namespace CoolProp { + +Incompressible::Incompressible() { + // TODO Auto-generated constructor stub + +} + +Incompressible::~Incompressible() { + // TODO Auto-generated destructor stub +} + +} /* namespace CoolProp */ diff --git a/src/Fluids/Incompressible.h b/src/Fluids/Incompressible.h new file mode 100644 index 00000000..24e6b759 --- /dev/null +++ b/src/Fluids/Incompressible.h @@ -0,0 +1,22 @@ +/* + * Incompressible.h + * + * Created on: 20 Dec 2013 + * Author: jowr + */ + +#ifndef INCOMPRESSIBLE_H_ +#define INCOMPRESSIBLE_H_ + +//#include "AbstractFluid.h" + +namespace CoolProp { + +class Incompressible{ +public: + Incompressible(); + virtual ~Incompressible(); +}; + +} /* namespace CoolProp */ +#endif /* INCOMPRESSIBLE_H_ */ diff --git a/src/Helmholtz.cpp b/src/Helmholtz.cpp new file mode 100644 index 00000000..418c6d25 --- /dev/null +++ b/src/Helmholtz.cpp @@ -0,0 +1,1826 @@ +#include +#include "Helmholtz.h" + +namespace CoolProp{ + +void ResidualHelmholtzPower::to_json(rapidjson::Value &el, rapidjson::Document &doc) +{ + el.AddMember("type","ResidualHelmholtzPower",doc.GetAllocator()); + rapidjson::Value _n(rapidjson::kArrayType), _d(rapidjson::kArrayType), _t(rapidjson::kArrayType), _l(rapidjson::kArrayType); + for (unsigned int i = 0; i <= N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + _n.PushBack((double)el.n,doc.GetAllocator()); + _d.PushBack((double)el.d,doc.GetAllocator()); + _t.PushBack((double)el.t,doc.GetAllocator()); + _l.PushBack((double)el.l,doc.GetAllocator()); + } + el.AddMember("n",_n,doc.GetAllocator()); + el.AddMember("d",_d,doc.GetAllocator()); + el.AddMember("t",_t,doc.GetAllocator()); + el.AddMember("l",_l,doc.GetAllocator()); +} +long double ResidualHelmholtzPower::base(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li > 0){ + s[i] = ni*exp(ti*log_tau+di*log_delta-pow(delta,li)); + } + else{ + s[i] = ni*exp(ti*log_tau+di*log_delta); + } + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dDelta(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, lid = el.ld, pow_delta_li; + int li = el.l; + if (li > 0){ + pow_delta_li = pow(delta, li); + s[i] = ni*(di-lid*pow_delta_li)*exp(ti*log_tau+(di-1)*log_delta-pow_delta_li); + } + else{ + s[i] = ni*di*exp(ti*log_tau+(di-1)*log_delta); + } + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + s[i] = ni*ti*exp((ti-1)*log_tau+di*log_delta-pow(delta, li)); + } + else + s[i] = ni*ti*exp((ti-1)*log_tau+di*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; + +long double ResidualHelmholtzPower::dDelta2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + s[i] = ni*((di-li*pow_delta_li)*(di-1.0-li*pow_delta_li) - li*li*pow_delta_li)*exp(ti*log_tau+(di-2)*log_delta-pow_delta_li); + } + else + s[i] = ni*di*(di-1.0)*exp(ti*log_tau+(di-2)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dDelta_dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(di-li*pow_delta_li)*exp((ti-1)*log_tau+(di-1)*log_delta-pow_delta_li); + } + else + s[i] = ni*di*ti*exp((ti-1)*log_tau+(di-1)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dTau2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(ti-1)*exp((ti-2)*log_tau+di*log_delta-pow_delta_li); + } + else + s[i] = ni*ti*(ti-1)*exp((ti-2)*log_tau+di*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dDelta3(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + long double bracket = (di*(di-1)*(di-2)+pow_delta_li*(-2*li+6*di*li-3*di*di*li-3*di*li*li+3*li*li-li*li*li)+pow_delta_li*pow_delta_li*(3*di*li*li-3*li*li+3*li*li*li)-li*li*li*pow_delta_li*pow_delta_li*pow_delta_li); + s[i] = ni*bracket*exp(ti*log_tau+(di-3)*log_delta-pow_delta_li); + } + else + s[i] = ni*di*(di-1.0)*(di-2)*exp(ti*log_tau+(di-3)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dDelta2_dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(((di-li*pow_delta_li))*(di-1-li*pow_delta_li)-li*li*pow_delta_li)*exp((ti-1)*log_tau+(di-2)*log_delta-pow_delta_li); + } + else + s[i] = ni*di*ti*(di-1)*exp((ti-1)*log_tau+(di-2)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dDelta_dTau2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li>0) + { + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(ti-1)*(di-li*pow_delta_li)*exp((ti-2)*log_tau+(di-1)*log_delta-pow_delta_li); + } + else + s[i] = ni*ti*(ti-1)*di*exp((ti-2)*log_tau+(di-1)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzPower::dTau3(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzPowerElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t; + int li = el.l; + if (li > 0) + { + s[i] = ni*ti*(ti-1)*(ti-2)*exp((ti-3)*log_tau+di*log_delta-pow(delta,li)); + } + else + s[i] = ni*ti*(ti-1)*(ti-2)*exp((ti-3)*log_tau+di*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; + +void ResidualHelmholtzExponential::to_json(rapidjson::Value &el, rapidjson::Document &doc) +{ + el.AddMember("type","ResidualHelmholtzExponential",doc.GetAllocator()); + rapidjson::Value _n(rapidjson::kArrayType), _d(rapidjson::kArrayType), _t(rapidjson::kArrayType), _l(rapidjson::kArrayType), _g(rapidjson::kArrayType); + for (unsigned int i=0; i<=N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + _n.PushBack((double)el.n, doc.GetAllocator()); + _d.PushBack((double)el.d, doc.GetAllocator()); + _t.PushBack((double)el.t, doc.GetAllocator()); + _l.PushBack((double)el.l, doc.GetAllocator()); + _g.PushBack((double)el.g, doc.GetAllocator()); + } + el.AddMember("n",_n,doc.GetAllocator()); + el.AddMember("d",_d,doc.GetAllocator()); + el.AddMember("t",_t,doc.GetAllocator()); + el.AddMember("l",_l,doc.GetAllocator()); + el.AddMember("g",_g,doc.GetAllocator()); +} +long double ResidualHelmholtzExponential::base(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + s[i] = ni*exp(ti*log_tau+di*log_delta-gi*pow(delta, li)); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dDelta(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*(di-gi*li*pow_delta_li)*exp(ti*log_tau+(di-1)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*ti*exp((ti-1)*log_tau+di*log_delta-gi*pow(delta,li)); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; + +long double ResidualHelmholtzExponential::dDelta2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + // Typo in Span, 2000, re-derived from Sympy + double bracket = di*di - 2*di*pow(delta,li)*gi*li - di + pow(delta,2*li)*gi*gi*li*li - pow(delta,li)*gi*li*li + pow(delta,li)*gi*li; + s[i] = ni*bracket*exp(ti*log_tau+(di-2)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dDelta_dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(di-gi*li*pow_delta_li)*exp((ti-1)*log_tau+(di-1)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dTau2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(ti-1)*exp((ti-2)*log_tau+di*log_delta-gi*pow(delta,li)); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dDelta3(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + // >> n_i, tau, t_i, d_i, delta, g_i, l_i = symbols(' n_i tau t_i d_i delta g_i l_i') + // >> phir = n_i*tau**t_i*delta**d_i*exp(-g_i*pow(delta,l_i)) + // >> simplify(diff(diff(diff(phir,delta),delta),delta)) + long double pow_delta_2li = pow(delta,2*li); + long double pow_delta_3li = pow(delta,3*li); + long double bracket = di*di*di - 3*di*di*pow_delta_li*gi*li - 3*di*di + 3*di*pow_delta_2li*gi*gi*li*li - 3*di*pow_delta_li*gi*li*li + 6*di*pow_delta_li*gi*li + 2*di - pow_delta_3li*gi*gi*gi*li*li*li + 3*pow_delta_2li*gi*gi*li*li*li - 3*pow_delta_2li*gi*gi*li*li - pow_delta_li*gi*li*li*li + 3*pow_delta_li*gi*li*li - 2*pow_delta_li*gi*li; + s[i] = ni*bracket*exp(ti*log_tau+(di-3)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dDelta2_dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + // Typo in Span, 2000, re-derived from Sympy + long double bracket = di*di - 2*di*pow(delta,li)*gi*li - di + pow(delta,2*li)*gi*gi*li*li - pow(delta, li)*gi*li*li + pow(delta,li)*gi*li; + s[i] = ni*ti*bracket*exp((ti-1)*log_tau+(di-2)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dDelta_dTau2(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(ti-1)*(di-gi*li*pow_delta_li)*exp((ti-2)*log_tau+(di-1)*log_delta-gi*pow_delta_li); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; +long double ResidualHelmholtzExponential::dTau3(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta), pow_delta_li; + for (std::size_t i = 0; i < N; ++i) + { + ResidualHelmholtzExponentialElement &el = elements[i]; + long double ni = el.n, di = el.d, ti = el.t, gi = el.g, li = el.l; + pow_delta_li = pow(delta, li); + s[i] = ni*ti*(ti-1)*(ti-2)*exp((ti-3)*log_tau+di*log_delta-gi*pow(delta,li)); + } + return std::accumulate(s.begin(), s.end(), 0.0); +}; + + + +void ResidualHelmholtzGaussian::to_json(rapidjson::Value &el, rapidjson::Document &doc) +{ + el.AddMember("type","ResidualHelmholtzGaussian",doc.GetAllocator()); + rapidjson::Value _n(rapidjson::kArrayType), _d(rapidjson::kArrayType), _t(rapidjson::kArrayType), + _eta(rapidjson::kArrayType), _epsilon(rapidjson::kArrayType), _beta(rapidjson::kArrayType), _gamma(rapidjson::kArrayType); + for (unsigned int i=0; i<=N; ++i) + { + ResidualHelmholtzGaussianElement &el = elements[i]; + _n.PushBack((double)el.n,doc.GetAllocator()); + _d.PushBack((double)el.d,doc.GetAllocator()); + _t.PushBack((double)el.t,doc.GetAllocator()); + _eta.PushBack((double)el.eta,doc.GetAllocator()); + _epsilon.PushBack((double)el.epsilon,doc.GetAllocator()); + _beta.PushBack((double)el.beta,doc.GetAllocator()); + _gamma.PushBack((double)el.gamma,doc.GetAllocator()); + } + el.AddMember("n",_n,doc.GetAllocator()); + el.AddMember("d",_d,doc.GetAllocator()); + el.AddMember("t",_t,doc.GetAllocator()); + el.AddMember("eta",_eta,doc.GetAllocator()); + el.AddMember("epsilon",_epsilon,doc.GetAllocator()); + el.AddMember("beta",_beta,doc.GetAllocator()); + el.AddMember("gamma",_gamma,doc.GetAllocator()); +} +long double ResidualHelmholtzGaussian::base(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + for (std::size_t i=0; i0 && mi == 0){ + long double pow_delta_li = pow(delta,li); + s[i] = ni*(di-li*pow_delta_li)*exp(ti*log_tau+(di-1)*log_delta-pow_delta_li); + } + else + s[i] = ni*di*exp(ti*log_tau+(di-1)*log_delta); + } + return std::accumulate(s.begin(), s.end(), 0.0); +} +long double ResidualHelmholtzLemmon2005::dTau(const long double &tau, const long double &delta) throw() +{ + if (N==0){return 0.0;} + long double log_tau = log(tau), log_delta = log(delta); + for (std::size_t i=0; ig(this->eta(delta))*(exp(this->epsilonbar*tau)-1)*this->kappabar; +} +long double ResidualHelmholtzSAFTAssociating::dDeltabar_ddelta__consttau(const long double &tau, const long double &delta) +{ + return this->dg_deta(this->eta(delta))*(exp(this->epsilonbar*tau)-1)*this->kappabar*this->vbarn; +} +long double ResidualHelmholtzSAFTAssociating::d2Deltabar_ddelta2__consttau(const long double &tau, const long double &delta) +{ + return this->d2g_deta2(this->eta(delta))*(exp(this->epsilonbar*tau)-1)*this->kappabar*pow(this->vbarn,(int)2); +} +long double ResidualHelmholtzSAFTAssociating::dDeltabar_dtau__constdelta(const long double &tau, const long double &delta) +{ + return this->g(this->eta(delta))*this->kappabar*exp(this->epsilonbar*tau)*this->epsilonbar; +} +long double ResidualHelmholtzSAFTAssociating::d2Deltabar_dtau2__constdelta(const long double &tau, const long double &delta) +{ + return this->g(this->eta(delta))*this->kappabar*exp(this->epsilonbar*tau)*pow(this->epsilonbar,(int)2); +} +long double ResidualHelmholtzSAFTAssociating::d2Deltabar_ddelta_dtau(const long double &tau, const long double &delta) +{ + return this->dg_deta(this->eta(delta))*exp(this->epsilonbar*tau)*this->epsilonbar*this->kappabar*this->vbarn; +} +long double ResidualHelmholtzSAFTAssociating::d3Deltabar_dtau3__constdelta(const long double &tau, const long double &delta) +{ + return this->g(this->eta(delta))*this->kappabar*exp(this->epsilonbar*tau)*pow(this->epsilonbar,(int)3); +} +long double ResidualHelmholtzSAFTAssociating::d3Deltabar_ddelta_dtau2(const long double &tau, const long double &delta) +{ + return this->dg_deta(this->eta(delta))*this->kappabar*exp(this->epsilonbar*tau)*pow(this->epsilonbar,(int)2)*this->vbarn; +} +long double ResidualHelmholtzSAFTAssociating::d3Deltabar_ddelta2_dtau(const long double &tau, const long double &delta) +{ + return this->d2g_deta2(this->eta(delta))*exp(this->epsilonbar*tau)*this->epsilonbar*this->kappabar*pow(this->vbarn,(int)2); +} +long double ResidualHelmholtzSAFTAssociating::d3Deltabar_ddelta3__consttau(const long double &tau, const long double &delta) +{ + return this->d3g_deta3(this->eta(delta))*(exp(this->epsilonbar*tau)-1)*this->kappabar*pow(this->vbarn,(int)3); +} + +long double ResidualHelmholtzSAFTAssociating::X(const long double &delta, const long double &Deltabar) +{ + return 2/(sqrt(1+4*Deltabar*delta)+1); +} +long double ResidualHelmholtzSAFTAssociating::dX_dDeltabar__constdelta(const long double &delta, const long double &Deltabar) +{ + long double X = this->X(delta,Deltabar); + return -delta*X*X/(2*Deltabar*delta*X+1); +} +long double ResidualHelmholtzSAFTAssociating::dX_ddelta__constDeltabar(const long double &delta, const long double &Deltabar) +{ + long double X = this->X(delta,Deltabar); + return -Deltabar*X*X/(2*Deltabar*delta*X+1); +} +long double ResidualHelmholtzSAFTAssociating::dX_dtau(const long double &tau, const long double &delta) +{ + long double Deltabar = this->Deltabar(tau, delta); + return this->dX_dDeltabar__constdelta(delta, Deltabar)*this->dDeltabar_dtau__constdelta(tau, delta); +} +long double ResidualHelmholtzSAFTAssociating::dX_ddelta(const long double &tau, const long double &delta) +{ + long double Deltabar = this->Deltabar(tau, delta); + return (this->dX_ddelta__constDeltabar(delta, Deltabar) + + this->dX_dDeltabar__constdelta(delta, Deltabar)*this->dDeltabar_ddelta__consttau(tau, delta)); +} +long double ResidualHelmholtzSAFTAssociating::d2X_dtau2(const long double &tau, const long double &delta) +{ + long double Deltabar = this->Deltabar(tau, delta); + long double X = this->X(delta, Deltabar); + long double beta = this->dDeltabar_dtau__constdelta(tau, delta); + long double d_dXdtau_dbeta = -delta*X*X/(2*Deltabar*delta*X+1); + long double d_dXdtau_dDeltabar = 2*delta*delta*X*X*X/pow(2*Deltabar*delta*X+1,2)*beta; + long double d_dXdtau_dX = -2*beta*delta*X*(Deltabar*delta*X+1)/pow(2*Deltabar*delta*X+1,2); + long double dbeta_dtau = this->d2Deltabar_dtau2__constdelta(tau, delta); + long double dX_dDeltabar = this->dX_dDeltabar__constdelta(delta, Deltabar); + return d_dXdtau_dX*dX_dDeltabar*beta+d_dXdtau_dDeltabar*beta+d_dXdtau_dbeta*dbeta_dtau; +} +long double ResidualHelmholtzSAFTAssociating::d2X_ddeltadtau(const long double &tau, const long double &delta) +{ + long double Deltabar = this->Deltabar(tau, delta); + long double X = this->X(delta, Deltabar); + long double alpha = this->dDeltabar_ddelta__consttau(tau, delta); + long double beta = this->dDeltabar_dtau__constdelta(tau, delta); + long double dalpha_dtau = this->d2Deltabar_ddelta_dtau(tau, delta); + long double d_dXddelta_dDeltabar = X*X*(2*delta*delta*X*alpha-1)/pow(2*Deltabar*delta*X+1,2); + long double d_dXddelta_dalpha = -delta*X*X/(2*Deltabar*delta*X+1); + long double d_dXddelta_dX = -(Deltabar+delta*alpha)*2*(Deltabar*delta*X*X+X)/pow(2*Deltabar*delta*X+1,2); + long double dX_dDeltabar = this->dX_dDeltabar__constdelta(delta, Deltabar); + return d_dXddelta_dX*dX_dDeltabar*beta+d_dXddelta_dDeltabar*beta+d_dXddelta_dalpha*dalpha_dtau; +} +long double ResidualHelmholtzSAFTAssociating::d2X_ddelta2(const long double &tau, const long double &delta) +{ + long double Deltabar = this->Deltabar(tau, delta); + long double X = this->X(delta, Deltabar); + long double alpha = this->dDeltabar_ddelta__consttau(tau, delta); + long double dalpha_ddelta = this->d2Deltabar_ddelta2__consttau(tau, delta); + + long double dX_ddelta_constall = X*X*(2*Deltabar*Deltabar*X-alpha)/pow(2*Deltabar*delta*X+1,2); + long double d_dXddelta_dX = -(Deltabar+delta*alpha)*2*(Deltabar*delta*X*X+X)/pow(2*Deltabar*delta*X+1,2); + long double d_dXddelta_dDeltabar = X*X*(2*delta*delta*X*alpha-1)/pow(2*Deltabar*delta*X+1,2); + long double d_dXddelta_dalpha = -delta*X*X/(2*Deltabar*delta*X+1); + + long double dX_dDeltabar = this->dX_dDeltabar__constdelta(delta, Deltabar); + long double dX_ddelta = this->dX_ddelta__constDeltabar(delta, Deltabar); + + long double val = (dX_ddelta_constall + + d_dXddelta_dX*dX_ddelta + + d_dXddelta_dX*dX_dDeltabar*alpha + + d_dXddelta_dDeltabar*alpha + + d_dXddelta_dalpha*dalpha_ddelta); + return val; +} +long double ResidualHelmholtzSAFTAssociating::d3X_dtau3(const long double &tau, const long double &delta) +{ + long double Delta = this->Deltabar(tau, delta); + long double X = this->X(delta, Delta); + long double dX_dDelta = this->dX_dDeltabar__constdelta(delta, Delta); + long double Delta_t = this->dDeltabar_dtau__constdelta(tau, delta); + long double Delta_tt = this->d2Deltabar_dtau2__constdelta(tau, delta); + long double Delta_ttt = this->d3Deltabar_dtau3__constdelta(tau, delta); + long double dXtt_dX = 2*X*delta*(-6*Delta*pow(Delta_t, 2)*pow(X, 2)*pow(delta, 2)*(Delta*X*delta + 1) + 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) - Delta_tt*pow(2*Delta*X*delta + 1, 3) + X*delta*(Delta*Delta_tt + 3*pow(Delta_t, 2))*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4); + long double dXtt_dDelta = 2*pow(X, 3)*pow(delta, 2)*(-6*pow(Delta_t, 2)*X*delta*(Delta*X*delta + 1) - 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) + Delta_tt*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4); + long double dXtt_dDelta_t = 4*Delta_t*pow(X, 3)*pow(delta, 2)*(3*Delta*X*delta + 2)/pow(2*Delta*X*delta + 1, 3); + long double dXtt_dDelta_tt = -pow(X, 2)*delta/(2*Delta*X*delta + 1); + return dXtt_dX*dX_dDelta*Delta_t+dXtt_dDelta*Delta_t + dXtt_dDelta_t*Delta_tt + dXtt_dDelta_tt*Delta_ttt; +} +long double ResidualHelmholtzSAFTAssociating::d3X_ddeltadtau2(const long double &tau, const long double &delta) +{ + long double Delta = this->Deltabar(tau, delta); + long double X = this->X(delta, Delta); + long double dX_ddelta = this->dX_ddelta__constDeltabar(delta, Delta); + long double dX_dDelta = this->dX_dDeltabar__constdelta(delta, Delta); + long double Delta_t = this->dDeltabar_dtau__constdelta(tau, delta); + long double Delta_d = this->dDeltabar_ddelta__consttau(tau, delta); + long double Delta_dt = this->d2Deltabar_ddelta_dtau(tau, delta); + long double Delta_tt = this->d2Deltabar_dtau2__constdelta(tau, delta); + long double Delta_dtt = this->d3Deltabar_ddelta_dtau2(tau, delta); + long double dXtt_ddelta = pow(X, 2)*(-12*Delta*pow(Delta_t, 2)*pow(X, 2)*pow(delta, 2)*(Delta*X*delta + 1) + 2*pow(Delta_t, 2)*X*delta*(-Delta*X*delta + 2)*(2*Delta*X*delta + 1) - Delta_tt*pow(2*Delta*X*delta + 1, 3) + 2*X*delta*(Delta*Delta_tt + 2*pow(Delta_t, 2))*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4); + long double dXtt_dX = 2*X*delta*(-6*Delta*pow(Delta_t, 2)*pow(X, 2)*pow(delta, 2)*(Delta*X*delta + 1) + 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) - Delta_tt*pow(2*Delta*X*delta + 1, 3) + X*delta*(Delta*Delta_tt + 3*pow(Delta_t, 2))*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4); + long double dXtt_dDelta = 2*pow(X, 3)*pow(delta, 2)*(-6*pow(Delta_t, 2)*X*delta*(Delta*X*delta + 1) - 3*pow(Delta_t, 2)*X*delta*(2*Delta*X*delta + 1) + Delta_tt*pow(2*Delta*X*delta + 1, 2))/pow(2*Delta*X*delta + 1, 4); + long double dXtt_dDelta_t = 4*Delta_t*pow(X, 3)*pow(delta, 2)*(3*Delta*X*delta + 2)/pow(2*Delta*X*delta + 1, 3); + long double dXtt_dDelta_tt = -pow(X, 2)*delta/(2*Delta*X*delta + 1); + return dXtt_ddelta + dXtt_dX*dX_ddelta + dXtt_dX*dX_dDelta*Delta_d + dXtt_dDelta*Delta_d + dXtt_dDelta_t*Delta_dt + dXtt_dDelta_tt*Delta_dtt; +} + +long double ResidualHelmholtzSAFTAssociating::d3X_ddelta2dtau(const long double &tau, const long double &delta) +{ + long double Delta = this->Deltabar(tau, delta); + long double X = this->X(delta, Delta); + long double dX_dDelta = this->dX_dDeltabar__constdelta(delta, Delta); + long double Delta_t = this->dDeltabar_dtau__constdelta(tau, delta); + long double Delta_d = this->dDeltabar_ddelta__consttau(tau, delta); + long double Delta_dd = this->d2Deltabar_ddelta2__consttau(tau, delta); + long double Delta_dt = this->d2Deltabar_ddelta_dtau(tau, delta); + long double Delta_ddt = this->d3Deltabar_ddelta2_dtau(tau, delta); + long double dXdd_dX = 2*X*(-6*Delta*pow(X, 2)*delta*pow(Delta + Delta_d*delta, 2)*(Delta*X*delta + 1) - Delta_dd*delta*pow(2*Delta*X*delta + 1, 3) + 2*X*(2*Delta*X*delta + 1)*(-Delta*Delta_d*delta*(2*Delta_d*X*pow(delta, 2) - 1) - Delta*delta*(2*pow(Delta, 2)*X - Delta_d) + Delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + Delta_d*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1)) + pow(2*Delta*X*delta + 1, 2)*(3*pow(Delta, 2)*X + Delta*Delta_dd*X*pow(delta, 2) + Delta*X*(Delta + Delta_d*delta) + pow(Delta_d, 2)*X*pow(delta, 2) + Delta_d*X*delta*(Delta + Delta_d*delta) + Delta_d*(2*Delta_d*X*pow(delta, 2) - 1) - Delta_d))/pow(2*Delta*X*delta + 1, 4); + long double dXdd_dDelta = pow(X, 3)*(-8*pow(Delta, 2)*Delta_d*pow(X, 2)*pow(delta, 3) + 8*pow(Delta, 2)*Delta_dd*pow(X, 2)*pow(delta, 4) + 10*pow(Delta, 2)*X*delta - 24*Delta*pow(Delta_d, 2)*pow(X, 2)*pow(delta, 4) + 8*Delta*Delta_d*X*pow(delta, 2) + 8*Delta*Delta_dd*X*pow(delta, 3) + 8*Delta - 18*pow(Delta_d, 2)*X*pow(delta, 3) + 12*Delta_d*delta + 2*Delta_dd*pow(delta, 2))/(16*pow(Delta, 4)*pow(X, 4)*pow(delta, 4) + 32*pow(Delta, 3)*pow(X, 3)*pow(delta, 3) + 24*pow(Delta, 2)*pow(X, 2)*pow(delta, 2) + 8*Delta*X*delta + 1); + long double dXdd_dDelta_d = 2*pow(X, 2)*(2*X*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + (2*Delta*X*delta + 1)*(2*Delta_d*X*pow(delta, 2) - 1))/pow(2*Delta*X*delta + 1, 3); + long double dXdd_dDelta_dd = -pow(X, 2)*delta/(2*Delta*X*delta + 1); + + return dXdd_dX*dX_dDelta*Delta_t + dXdd_dDelta*Delta_t + dXdd_dDelta_d*Delta_dt + dXdd_dDelta_dd*Delta_ddt; +} + +double Xdd(double X, double delta, double Delta, double Delta_d, double Delta_dd) +{ + return Delta*pow(X, 2)*(2*Delta + 2*Delta_d*delta)*(Delta*pow(X, 2)*delta + X)/pow(2*Delta*X*delta + 1, 3) + Delta_d*pow(X, 2)*delta*(2*Delta + 2*Delta_d*delta)*(Delta*pow(X, 2)*delta + X)/pow(2*Delta*X*delta + 1, 3) + Delta_d*pow(X, 2)*(2*Delta_d*X*pow(delta, 2) - 1)/pow(2*Delta*X*delta + 1, 2) - Delta_dd*pow(X, 2)*delta/(2*Delta*X*delta + 1) + pow(X, 2)*(2*pow(Delta, 2)*X - Delta_d)/pow(2*Delta*X*delta + 1, 2); +} + +long double ResidualHelmholtzSAFTAssociating::d3X_ddelta3(const long double &tau, const long double &delta) +{ + long double Delta = this->Deltabar(tau, delta); + long double X = this->X(delta, Delta); + long double dX_ddelta = this->dX_ddelta__constDeltabar(delta, Delta); + long double dX_dDelta = this->dX_dDeltabar__constdelta(delta, Delta); + long double Delta_d = this->dDeltabar_ddelta__consttau(tau, delta); + long double Delta_dd = this->d2Deltabar_ddelta2__consttau(tau, delta); + long double Delta_ddd = this->d3Deltabar_ddelta3__consttau(tau, delta); + + long double dXdd_dX = 2*X*(-6*Delta*pow(X, 2)*delta*pow(Delta + Delta_d*delta, 2)*(Delta*X*delta + 1) - Delta_dd*delta*pow(2*Delta*X*delta + 1, 3) + 2*X*(2*Delta*X*delta + 1)*(-Delta*Delta_d*delta*(2*Delta_d*X*pow(delta, 2) - 1) - Delta*delta*(2*pow(Delta, 2)*X - Delta_d) + Delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + Delta_d*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1)) + pow(2*Delta*X*delta + 1, 2)*(3*pow(Delta, 2)*X + Delta*Delta_dd*X*pow(delta, 2) + Delta*X*(Delta + Delta_d*delta) + pow(Delta_d, 2)*X*pow(delta, 2) + Delta_d*X*delta*(Delta + Delta_d*delta) + Delta_d*(2*Delta_d*X*pow(delta, 2) - 1) - Delta_d))/pow(2*Delta*X*delta + 1, 4); + long double dXdd_ddelta = pow(X, 2)*(-24*pow(Delta, 4)*pow(X, 3)*delta - 8*pow(Delta, 3)*Delta_d*pow(X, 3)*pow(delta, 2) - 18*pow(Delta, 3)*pow(X, 2) + 8*pow(Delta, 2)*Delta_d*pow(X, 2)*delta - 4*pow(Delta, 2)*Delta_dd*pow(X, 2)*pow(delta, 2) + 10*Delta*pow(Delta_d, 2)*pow(X, 2)*pow(delta, 2) + 12*Delta*Delta_d*X - 4*Delta*Delta_dd*X*delta + 8*pow(Delta_d, 2)*X*delta - Delta_dd)/(16*pow(Delta, 4)*pow(X, 4)*pow(delta, 4) + 32*pow(Delta, 3)*pow(X, 3)*pow(delta, 3) + 24*pow(Delta, 2)*pow(X, 2)*pow(delta, 2) + 8*Delta*X*delta + 1); + long double dXdd_dDelta = pow(X, 3)*(-8*pow(Delta, 2)*Delta_d*pow(X, 2)*pow(delta, 3) + 8*pow(Delta, 2)*Delta_dd*pow(X, 2)*pow(delta, 4) + 10*pow(Delta, 2)*X*delta - 24*Delta*pow(Delta_d, 2)*pow(X, 2)*pow(delta, 4) + 8*Delta*Delta_d*X*pow(delta, 2) + 8*Delta*Delta_dd*X*pow(delta, 3) + 8*Delta - 18*pow(Delta_d, 2)*X*pow(delta, 3) + 12*Delta_d*delta + 2*Delta_dd*pow(delta, 2))/(16*pow(Delta, 4)*pow(X, 4)*pow(delta, 4) + 32*pow(Delta, 3)*pow(X, 3)*pow(delta, 3) + 24*pow(Delta, 2)*pow(X, 2)*pow(delta, 2) + 8*Delta*X*delta + 1); + long double dXdd_dDelta_d = 2*pow(X, 2)*(2*X*delta*(Delta + Delta_d*delta)*(Delta*X*delta + 1) + (2*Delta*X*delta + 1)*(2*Delta_d*X*pow(delta, 2) - 1))/pow(2*Delta*X*delta + 1, 3); + long double dXdd_dDelta_dd = -pow(X, 2)*delta/(2*Delta*X*delta + 1); + + return dXdd_ddelta + dXdd_dX*(dX_ddelta + dX_dDelta*Delta_d) + dXdd_dDelta*Delta_d + dXdd_dDelta_d*Delta_dd + dXdd_dDelta_dd*Delta_ddd; +} +long double ResidualHelmholtzSAFTAssociating::g(const long double &eta) +{ + return 0.5*(2-eta)/pow(1-eta,(int)3); +} +long double ResidualHelmholtzSAFTAssociating::dg_deta(const long double &eta) +{ + return 0.5*(5-2*eta)/pow(1-eta,(int)4); +} +long double ResidualHelmholtzSAFTAssociating::d2g_deta2(const long double &eta) +{ + return 3*(3-eta)/pow(1-eta,(int)5); +} +long double ResidualHelmholtzSAFTAssociating::d3g_deta3(const long double &eta) +{ + return 6*(7-2*eta)/pow(1-eta,(int)6); +} +long double ResidualHelmholtzSAFTAssociating::eta(const long double &delta){ + return this->vbarn*delta; +} +long double ResidualHelmholtzSAFTAssociating::base(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + return this->m*this->a*((log(X)-X/2.0+0.5)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + return this->m*this->a*(1/X-0.5)*this->dX_ddelta(tau, delta); +} +long double ResidualHelmholtzSAFTAssociating::dTau(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + return this->m*this->a*(1/X-0.5)*this->dX_dtau(tau, delta); +} +long double ResidualHelmholtzSAFTAssociating::dTau2(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_tau = this->dX_dtau(tau, delta); + long double X_tautau = this->d2X_dtau2(tau, delta); + return this->m*this->a*((1/X-0.5)*X_tautau-pow(X_tau/X, 2)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta2(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_delta = this->dX_ddelta(tau, delta); + long double X_deltadelta = this->d2X_ddelta2(tau, delta); + return this->m*this->a*((1/X-0.5)*X_deltadelta-pow(X_delta/X,2)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta_dTau(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_delta = this->dX_ddelta(tau, delta); + long double X_tau = this->dX_dtau(tau, delta); + long double X_deltatau = this->d2X_ddeltadtau(tau, delta); + return this->m*this->a*((-X_tau/X/X)*X_delta+X_deltatau*(1/X-0.5)); +} +long double ResidualHelmholtzSAFTAssociating::dTau3(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_t = this->dX_dtau(tau, delta); + long double X_tt = this->d2X_dtau2(tau, delta); + long double X_ttt = this->d3X_dtau3(tau, delta); + return this->m*this->a*((1/X-1.0/2.0)*X_ttt+(-X_t/pow(X,(int)2))*X_tt-2*(pow(X,(int)2)*(X_t*X_tt)-pow(X_t,(int)2)*(X*X_t))/pow(X,(int)4)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta_dTau2(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_t = this->dX_dtau(tau, delta); + long double X_d = this->dX_ddelta(tau, delta); + long double X_tt = this->d2X_dtau2(tau, delta); + long double X_dt = this->d2X_ddeltadtau(tau, delta); + long double X_dtt = this->d3X_ddeltadtau2(tau, delta); + return this->m*this->a*((1/X-1.0/2.0)*X_dtt-X_d/pow(X,(int)2)*X_tt-2*(pow(X,(int)2)*(X_t*X_dt)-pow(X_t,(int)2)*(X*X_d))/pow(X,(int)4)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta2_dTau(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_t = this->dX_dtau(tau, delta); + long double X_d = this->dX_ddelta(tau, delta); + long double X_dd = this->d2X_ddelta2(tau, delta); + long double X_dt = this->d2X_ddeltadtau(tau, delta); + long double X_ddt = this->d3X_ddelta2dtau(tau, delta); + return this->m*this->a*((1/X-1.0/2.0)*X_ddt-X_t/pow(X,(int)2)*X_dd-2*(pow(X,(int)2)*(X_d*X_dt)-pow(X_d,(int)2)*(X*X_t))/pow(X,(int)4)); +} +long double ResidualHelmholtzSAFTAssociating::dDelta3(const long double &tau, const long double &delta) throw() +{ + if (disabled){return 0;} + long double X = this->X(delta, this->Deltabar(tau, delta)); + long double X_d = this->dX_ddelta(tau, delta); + long double X_dd = this->d2X_ddelta2(tau, delta); + long double X_ddd = this->d3X_ddelta3(tau, delta); + return this->m*this->a*((1/X-1.0/2.0)*X_ddd-X_d/pow(X,(int)2)*X_dd-2*(pow(X,(int)2)*(X_d*X_dd)-pow(X_d,(int)2)*(X*X_d))/pow(X,(int)4)); +} + + +void IdealHelmholtzCP0PolyT::to_json(rapidjson::Value &el, rapidjson::Document &doc) +{ + el.AddMember("type","IdealGasCP0Poly", doc.GetAllocator()); + + rapidjson::Value _c(rapidjson::kArrayType), _t(rapidjson::kArrayType); + for (std::size_t i=0; i< N; ++i) + { + _c.PushBack(static_cast(c[i]), doc.GetAllocator()); + _t.PushBack(static_cast(t[i]), doc.GetAllocator()); + } + el.AddMember("c",_c,doc.GetAllocator()); + el.AddMember("t",_t,doc.GetAllocator()); + el.AddMember("Tc", static_cast(Tc), doc.GetAllocator()); + el.AddMember("T0", static_cast(T0), doc.GetAllocator()); +} +long double IdealHelmholtzCP0PolyT::base(const long double &tau, const long double &delta) throw() +{ + double sum=0; + for (std::size_t i = 0; i < N; ++i){ + if (fabs(t[i])<10*DBL_EPSILON) + { + sum += c[i]-c[i]*tau/tau0+c[i]*log(tau/tau0); + } + else if (fabs(t[i]+1) < 10*DBL_EPSILON) + { + sum += c[i]*tau/Tc*log(tau0/tau)+c[i]/Tc*(tau-tau0); + } + else + { + sum += -c[i]*pow(Tc,t[i])*pow(tau,-t[i])/(t[i]*(t[i]+1))-c[i]*pow(T0,t[i]+1)*tau/(Tc*(t[i]+1))+c[i]*pow(T0,t[i])/t[i]; + } + } + return sum; +} +long double IdealHelmholtzCP0PolyT::dTau(const long double &tau, const long double &delta) throw() +{ + double sum=0; + for (std::size_t i = 0; i < N; ++i){ + if (fabs(t[i])<10*DBL_EPSILON) + { + sum += c[i]/tau-c[i]/tau0; + } + else if (fabs(t[i]+1) < 10*DBL_EPSILON) + { + sum += c[i]/Tc*log(tau0/tau); + } + else + { + sum += c[i]*pow(Tc,t[i])*pow(tau,-t[i]-1)/(t[i]+1)-c[i]*pow(Tc,t[i])/(pow(tau0,t[i]+1)*(t[i]+1)); + } + } + return sum; +} +long double IdealHelmholtzCP0PolyT::dTau2(const long double &tau, const long double &delta) throw() +{ + double sum=0; + for (std::size_t i = 0; i < N; ++i){ + if (fabs(t[i])<10*DBL_EPSILON) + { + sum += -c[i]/(tau*tau); + } + else if (fabs(t[i]+1) < 10*DBL_EPSILON) + { + sum += -c[i]/(tau*Tc); + } + else + { + sum += -c[i]*pow(Tc/tau,t[i])/(tau*tau); + } + } + return sum; +} +long double IdealHelmholtzCP0PolyT::dTau3(const long double &tau, const long double &delta) throw() +{ + double sum=0; + for (std::size_t i = 0; i < N; ++i){ + if (fabs(t[i])<10*DBL_EPSILON) + { + sum += 2*c[i]/(tau*tau*tau); + } + else if (fabs(t[i]+1) < 10*DBL_EPSILON) + { + sum += c[i]/(tau*tau*Tc); + } + else + { + sum += c[i]*pow(Tc/tau,t[i])*(t[i]+2)/(tau*tau*tau); + } + } + return sum; +} + +void IdealHelmholtzCP0AlyLee::to_json(rapidjson::Value &el, rapidjson::Document &doc){ + el.AddMember("type","IdealGasHelmholtzCP0AlyLee",doc.GetAllocator()); + rapidjson::Value _n(rapidjson::kArrayType); + for (std::size_t i=0; i<=4; ++i) + { + _n.PushBack(static_cast(c[i]),doc.GetAllocator()); + } + el.AddMember("c",_n,doc.GetAllocator()); + el.AddMember("Tc",static_cast(Tc),doc.GetAllocator()); + el.AddMember("T0",static_cast(T0),doc.GetAllocator()); +} +long double IdealHelmholtzCP0AlyLee::base(const long double &tau, const long double &delta) throw() +{ + if (!enabled){ return 0.0;} + return -tau*(anti_deriv_cp0_tau2(tau)-anti_deriv_cp0_tau2(tau0))+(anti_deriv_cp0_tau(tau)-anti_deriv_cp0_tau(tau0)); +} +long double IdealHelmholtzCP0AlyLee::dTau(const long double &tau, const long double &delta) throw() +{ + if (!enabled){ return 0.0;} + return -(anti_deriv_cp0_tau2(tau) - anti_deriv_cp0_tau2(tau0)); +} +long double IdealHelmholtzCP0AlyLee::anti_deriv_cp0_tau2(const long double &tau) +{ + return -c[0]/tau + 2*c[1]*c[2]/(Tc*(exp(-(2*c[2]*tau)/Tc)-1)) + 2*c[3]*c[4]/(Tc*(exp(-(2*c[4]*tau)/Tc)+1)); +} +long double IdealHelmholtzCP0AlyLee::anti_deriv_cp0_tau(const long double &tau) +{ + long double term1 = c[0]*log(tau); + long double term2 = 2*c[1]*c[2]*tau/(-Tc + Tc*exp(-2*c[2]*tau/Tc)) + c[1]*log(-1 + exp(-2*c[2]*tau/Tc)) + 2*c[1]*c[2]*tau/Tc; + long double term3 = -c[3]*(Tc*exp(2*c[4]*tau/Tc)*log(exp(2*c[4]*tau/Tc) + 1) + Tc*log(exp(2*c[4]*tau/Tc) + 1) - 2*c[4]*tau*exp(2*c[4]*tau/Tc))/(Tc*(exp(2*c[4]*tau/Tc) + 1)); + return term1 + term2 + term3; +} +long double IdealHelmholtzCP0AlyLee::dTau2(const long double &tau, const long double &delta) throw() +{ + if (!enabled){ return 0.0;} + return -c[0]/pow(tau,2) - c[1]*pow(c[2]/Tc/sinh(c[2]*tau/Tc),2) - c[3]*pow(c[4]/Tc/cosh(c[4]*tau/Tc),2); +} +long double IdealHelmholtzCP0AlyLee::dTau3(const long double &tau, const long double &delta) throw() +{ + if (!enabled){ return 0.0;} + return 2*c[0]/pow(tau,3) + 2*c[1]*pow(c[2]/Tc,3)*cosh(c[2]*tau/Tc)/pow(sinh(c[2]*tau/Tc),3) + 2*c[3]*pow(c[4]/Tc,3)*sinh(c[4]*tau/Tc)/pow(cosh(c[4]*tau/Tc),3); +} + +}; /* namespace CoolProp */ + + +/* +IdealHelmholtzEnthalpyEntropyOffset EnthalpyEntropyOffset; +IdealHelmholtzPlanckEinstein PlanckEinstein; +IdealHelmholtzPlanckEinstein2 PlanckEinstein2; + +IdealHelmholtzCP0Constant CP0Constant; +IdealHelmholtzCP0PolyT CP0PolyT; +IdealHelmholtzCP0AlyLee CP0AlyLee; +*/ + +#ifdef ENABLE_CATCH +#include +#include "catch.hpp" + +class HelmholtzConsistencyFixture +{ +public: + long double numerical, analytic; + CoolProp::BaseHelmholtzTerm *Lead, *LogTau, *IGPower, *PlanckEinstein, *PlanckEinstein2; + + HelmholtzConsistencyFixture(){ + Lead = new CoolProp::IdealHelmholtzLead(1,3); + LogTau = new CoolProp::IdealHelmholtzLogTau(1.5); + { + std::vector n(4,0), t(4,1); n[0] = -0.1; n[2] = 0.1; t[1] = -1; t[2] = -2; t[3] = 2; + IGPower = new CoolProp::IdealHelmholtzPower(n,t); + } + { + std::vector n(4,0), t(4,1); n[0] = -0.1; n[2] = 0.1; t[1] = -1; t[2] = -2; t[3] = 2; + PlanckEinstein = new CoolProp::IdealHelmholtzPlanckEinstein(n, t); + } + { + std::vector n(4,0), t(4,1), c(4,1); n[0] = -0.1; n[2] = 0.1; t[1] = -1; t[2] = -2; t[3] = 2; + PlanckEinstein2 = new CoolProp::IdealHelmholtzPlanckEinstein2(n, t, c); + } + } + void call(std::string d, CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double ddelta) + { + if (!d.compare("dTau")){return dTau(term,tau,delta,ddelta);} + else if (!d.compare("dTau2")){return dTau2(term,tau,delta,ddelta);} + else if (!d.compare("dTau3")){return dTau3(term,tau,delta,ddelta);} + else if (!d.compare("dDelta")){ return dDelta(term,tau,delta,ddelta);} + else if (!d.compare("dDelta2")){return dDelta2(term,tau,delta,ddelta);} + else if (!d.compare("dDelta3")){return dDelta3(term,tau,delta,ddelta);} + else{ + throw CoolProp::ValueError("don't understand deriv type"); + } + } + CoolProp::BaseHelmholtzTerm * get(std::string t) + { + if (!t.compare("Lead")){return Lead;} + else if (!t.compare("LogTau")){return LogTau;} + else if (!t.compare("IGPower")){return IGPower;} + else if (!t.compare("PlanckEinstein")){return PlanckEinstein;} + else if (!t.compare("PlanckEinstein2")){return PlanckEinstein2;} + else{ + throw CoolProp::ValueError("don't understand helmholtz type"); + } + } + void dTau(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double dtau){ + long double term_plus = term->base(tau + dtau, delta); + long double term_minus = term->base(tau - dtau, delta); + numerical = (term_plus - term_minus)/(2*dtau); + analytic = term->dTau(tau, delta); + }; + void dTau2(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double dtau){ + long double term_plus = term->dTau(tau + dtau, delta); + long double term_minus = term->dTau(tau - dtau, delta); + numerical = (term_plus - term_minus)/(2*dtau); + analytic = term->dTau2(tau, delta); + }; + void dTau3(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double dtau){ + long double term_plus = term->dTau2(tau + dtau, delta); + long double term_minus = term->dTau2(tau - dtau, delta); + numerical = (term_plus - term_minus)/(2*dtau); + analytic = term->dTau3(tau, delta); + }; + void dDelta(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double ddelta){ + long double term_plus = term->base(tau, delta + ddelta); + long double term_minus = term->base(tau, delta - ddelta); + numerical = (term_plus - term_minus)/(2*ddelta); + analytic = term->dDelta(tau, delta); + }; + void dDelta2(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double ddelta){ + long double term_plus = term->dDelta(tau, delta + ddelta); + long double term_minus = term->dDelta(tau, delta - ddelta); + numerical = (term_plus - term_minus)/(2*ddelta); + analytic = term->dDelta2(tau, delta); + }; + void dDelta3(CoolProp::BaseHelmholtzTerm * term, long double tau, long double delta, long double ddelta){ + long double term_plus = term->dDelta2(tau, delta + ddelta); + long double term_minus = term->dDelta2(tau, delta - ddelta); + numerical = (term_plus - term_minus)/(2*ddelta); + analytic = term->dDelta3(tau, delta); + }; + double err(double v1, double v2) + { + if (fabs(v2) > 1e-15){ + return fabs((v1-v2)/v2); + } + else{ + return fabs(v1-v2); + } + } +}; + +std::string terms[] = {"Lead","LogTau","IGPower","PlanckEinstein","PlanckEinstein2"}; +std::string derivs[] = {"dTau","dTau2","dTau3","dDelta","dDelta2","dDelta3"}; + +TEST_CASE_METHOD(HelmholtzConsistencyFixture, "Helmholtz energy derivatives", "[helmholtz]") +{ + CoolProp::BaseHelmholtzTerm * term; + std::size_t n = sizeof(terms)/sizeof(terms[0]); + for (std::size_t i = 0; i < n; ++i) + { + term = get(terms[i]); + for (std::size_t j = 0; j < sizeof(derivs)/sizeof(derivs[0]); ++j) + { + call(derivs[j], term, 1.3, 0.7, 1e-6); + CAPTURE(derivs[j]); + CAPTURE(numerical); + CAPTURE(analytic); + CAPTURE(terms[i]); + CHECK(err(analytic, numerical) < 1e-8); + } + } +} + +#endif + diff --git a/src/HumidAirProp.cpp b/src/HumidAirProp.cpp new file mode 100644 index 00000000..23be61f2 --- /dev/null +++ b/src/HumidAirProp.cpp @@ -0,0 +1,1773 @@ +#if defined(_MSC_VER) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "HumidAirProp.h" +#include "AbstractState.h" +#include "Solvers.h" +#include "CoolPropTools.h" +#include "Ice.h" +#include "CoolProp.h" + +#include +#include "math.h" +#include "time.h" +#include "stdio.h" +#include +#include + +CoolProp::AbstractStateWrapper Water("HEOS", "Water"); +CoolProp::AbstractStateWrapper Air("HEOS", "Air"); + +namespace HumidAir +{ +enum givens{GIVEN_TDP,GIVEN_HUMRAT,GIVEN_V,GIVEN_TWB,GIVEN_RH,GIVEN_ENTHALPY,GIVEN_T,GIVEN_P,GIVEN_VISC,GIVEN_COND}; + +static double epsilon=0.621945,R_bar=8.314472; +static int FlagUseVirialCorrelations=0,FlagUseIsothermCompressCorrelation=0,FlagUseIdealGasEnthalpyCorrelations=0; +double f_factor(double T, double p); + +// A couple of convenience functions that are needed quite a lot +static double MM_Air(void) +{ + return Air.keyed_output(CoolProp::imolar_mass); +} +static double MM_Water(void) +{ + return Water.keyed_output(CoolProp::imolar_mass); +} +static double B_Air(double T) +{ + Air.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Air.keyed_output(CoolProp::iBvirial); +} +static double dBdT_Air(double T) +{ + Air.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Air.keyed_output(CoolProp::idBvirial_dT); +} +static double B_Water(double T) +{ + Water.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Water.keyed_output(CoolProp::iBvirial); +} +static double dBdT_Water(double T) +{ + Water.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Water.keyed_output(CoolProp::idBvirial_dT); +} +static double C_Air(double T) +{ + Air.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Air.keyed_output(CoolProp::iCvirial); +} +static double dCdT_Air(double T) +{ + Air.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Air.keyed_output(CoolProp::idCvirial_dT); +} +static double C_Water(double T) +{ + Water.update(CoolProp::DmolarT_INPUTS,1e-20,T); + return Water.keyed_output(CoolProp::iCvirial); +} +static double dCdT_Water(double T) +{ + Water.update(CoolProp::DmolarT_INPUTS,1e-12,T); + return Water.keyed_output(CoolProp::idCvirial_dT); +} +void UseVirialCorrelations(int flag) +{ + if (flag==0 || flag==1) + { + FlagUseVirialCorrelations=flag; + } + else + { + printf("UseVirialCorrelations takes an integer, either 0 (no) or 1 (yes)\n"); + } + +} +void UseIsothermCompressCorrelation(int flag) +{ + if (flag==0 || flag==1) + { + FlagUseIsothermCompressCorrelation=flag; + } + else + { + printf("UseIsothermCompressCorrelation takes an integer, either 0 (no) or 1 (yes)\n"); + } +} +void UseIdealGasEnthalpyCorrelations(int flag) +{ + if (flag==0 || flag==1) + { + FlagUseIdealGasEnthalpyCorrelations=flag; + } + else + { + printf("UseIdealGasEnthalpyCorrelations takes an integer, either 0 (no) or 1 (yes)\n"); + } +} +static double Brent_HAProps_T(char *OutputName, char *Input1Name, double Input1, char *Input2Name, double Input2, double TargetVal, double T_min, double T_max) +{ + double T; + class BrentSolverResids : public CoolProp::FuncWrapper1D + { + private: + double Input1,Input2,TargetVal; + char *OutputName,*Input1Name,*Input2Name; + public: + double rhoL, rhoV; + BrentSolverResids(char *OutputName, char *Input1Name, double Input1, char *Input2Name, double Input2, double TargetVal) + { + this->OutputName = OutputName; + this->Input1Name = Input1Name; + this->Input2Name = Input2Name; + this->Input1 = Input1; + this->Input2 = Input2; + this->TargetVal = TargetVal; + }; + ~BrentSolverResids(){}; + + double call(double T){ + return HAPropsSI(OutputName,(char *)"T",T,Input1Name,Input1,Input2Name,Input2)-TargetVal; + } + }; + + BrentSolverResids BSR = BrentSolverResids(OutputName, Input1Name, Input1, Input2Name, Input2, TargetVal); + + std::string errstr; + T = CoolProp::Brent(BSR,T_min,T_max,1e-7,1e-4,50,errstr); + + return T; +} + +static double Secant_HAProps_T(char *OutputName, char *Input1Name, double Input1, char *Input2Name, double Input2, double TargetVal, double T_guess) +{ + // Use a secant solve in order to yield a target output value for HAProps by altering T + double x1=0,x2=0,x3=0,y1=0,y2=0,eps=5e-7,f=999,T=300,change; + int iter=1; + + while ((iter<=3 || (fabs(f)>eps && fabs(change)>1e-10)) && iter<100) + { + if (iter==1){x1=T_guess; T=x1;} + if (iter==2){x2=T_guess+0.001; T=x2;} + if (iter>2) {T=x2;} + f=HAPropsSI(OutputName,(char *)"T",T,Input1Name,Input1,Input2Name,Input2)-TargetVal; + if (iter==1){y1=f;} + if (iter>1) + { + y2=f; + x3=x2-y2/(y2-y1)*(x2-x1); + change = y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + } + return T; +} + +static double Secant_HAProps_W(const char *OutputName, const char *Input1Name, double Input1, const char *Input2Name, double Input2, double TargetVal, double W_guess) +{ + // Use a secant solve in order to yield a target output value for HAProps by altering humidity ratio + double x1=0,x2=0,x3=0,y1=0,y2=0,eps=1e-8,f=999,W=0.0001; + int iter=1; + + while ((iter<=3 || fabs(f)>eps) && iter<100) + { + if (iter == 1){x1 = W_guess; W = x1;} + if (iter == 2){x2 = W_guess+0.001; W = x2;} + if (iter > 2) {W = x2;} + f = HAPropsSI(OutputName,(char *)"W",W,Input1Name,Input1,Input2Name,Input2)-TargetVal; + if (iter == 1){y1 = f;} + if (iter > 1) + { + y2=f; + x3=x2-y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + } + return W; +} + +// Mixed virial components +static double _B_aw(double T) +{ + // Returns value in m^3/mol + double a[]={0,0.665687e2,-0.238834e3,-0.176755e3}; + double b[]={0,-0.237,-1.048,-3.183}; + double rhobarstar=1000,Tstar=100; + return 1/rhobarstar*(a[1]*pow(T/Tstar,b[1])+a[2]*pow(T/Tstar,b[2])+a[3]*pow(T/Tstar,b[3]))/1000; // Correlation has units of dm^3/mol, to convert to m^3/mol, divide by 1000 +} + +static double _dB_aw_dT(double T) +{ + // Returns value in m^3/mol + double a[]={0,0.665687e2,-0.238834e3,-0.176755e3}; + double b[]={0,-0.237,-1.048,-3.183}; + double rhobarstar=1000,Tstar=100; + return 1/rhobarstar/Tstar*(a[1]*b[1]*pow(T/Tstar,b[1]-1)+a[2]*b[2]*pow(T/Tstar,b[2]-1)+a[3]*b[3]*pow(T/Tstar,b[3]-1))/1000; // Correlation has units of dm^3/mol/K, to convert to m^3/mol/K, divide by 1000 +} + +static double _C_aaw(double T) +{ + // Function return has units of m^6/mol^2 + double c[]={0,0.482737e3,0.105678e6,-0.656394e8,0.294442e11,-0.319317e13}; + double rhobarstar=1000,Tstar=1,summer=0; int i; + for (i=1;i<=5;i++) + { + summer+=c[i]*pow(T/Tstar,1-i); + } + return 1.0/rhobarstar/rhobarstar*summer/1e6; // Correlation has units of dm^6/mol^2, to convert to m^6/mol^2 divide by 1e6 +} + +static double _dC_aaw_dT(double T) +{ + // Function return in units of m^6/mol^2/K + double c[]={0,0.482737e3,0.105678e6,-0.656394e8,0.294442e11,-0.319317e13}; + double rhobarstar=1000,Tstar=1,summer=0; int i; + for (i=2;i<=5;i++) + { + summer+=c[i]*(1-i)*pow(T/Tstar,-i); + } + return 1.0/rhobarstar/rhobarstar/Tstar*summer/1e6; // Correlation has units of dm^6/mol^2/K, to convert to m^6/mol^2/K divide by 1e6 +} + +static double _C_aww(double T) +{ + // Function return has units of m^6/mol^2 + double d[]={0,-0.1072887e2,0.347804e4,-0.383383e6,0.334060e8}; + double rhobarstar=1,Tstar=1,summer=0; int i; + for (i=1;i<=4;i++) + { + summer+=d[i]*pow(T/Tstar,1-i); + } + return -1.0/rhobarstar/rhobarstar*exp(summer)/1e6; // Correlation has units of dm^6/mol^2, to convert to m^6/mol^2 divide by 1e6 +} + +static double _dC_aww_dT(double T) +{ + // Function return in units of m^6/mol^2/K + double d[]={0,-0.1072887e2,0.347804e4,-0.383383e6,0.334060e8}; + double rhobarstar=1,Tstar=1,summer1=0,summer2=0; int i; + for (i=1;i<=4;i++) + { + summer1+=d[i]*pow(T/Tstar,1-i); + } + for (i=2;i<=4;i++) + { + summer2+=d[i]*(1-i)*pow(T/Tstar,-i); + } + return -1.0/rhobarstar/rhobarstar/Tstar*exp(summer1)*summer2/1e6; // Correlation has units of dm^6/mol^2/K, to convert to m^6/mol^2/K divide by 1e6 +} + + +static double B_m(double T, double psi_w) +{ + // Bm has units of m^3/mol + double B_aa,B_ww,B_aw; + if (FlagUseVirialCorrelations==1) + { + B_aa=-0.000721183853646 +1.142682674467e-05*T -8.838228412173e-08*pow(T,2) + +4.104150642775e-10*pow(T,3) -1.192780880645e-12*pow(T,4) +2.134201312070e-15*pow(T,5) + -2.157430412913e-18*pow(T,6) +9.453830907795e-22*pow(T,7); + B_ww=-10.8963128394 +2.439761625859e-01*T -2.353884845100e-03*pow(T,2) + +1.265864734412e-05*pow(T,3) -4.092175700300e-08*pow(T,4) +7.943925411344e-11*pow(T,5) + -8.567808759123e-14*pow(T,6) +3.958203548563e-17*pow(T,7); + } + else + { + B_aa = B_Air(T); // [m^3/mol] + B_ww = B_Water(T); // [m^3/mol] + } + + B_aw=_B_aw(T); // [m^3/mol] + return pow(1-psi_w,2)*B_aa+2*(1-psi_w)*psi_w*B_aw+psi_w*psi_w*B_ww; +} + +static double dB_m_dT(double T, double psi_w) +{ + //dBm_dT has units of m^3/mol/K + double dB_dT_aa,dB_dT_ww,dB_dT_aw; + if (FlagUseVirialCorrelations) + { + dB_dT_aa=1.65159324353e-05 -3.026130954749e-07*T +2.558323847166e-09*pow(T,2) -1.250695660784e-11*pow(T,3) +3.759401946106e-14*pow(T,4) -6.889086380822e-17*pow(T,5) +7.089457032972e-20*pow(T,6) -3.149942145971e-23*pow(T,7); + dB_dT_ww=0.65615868848 -1.487953162679e-02*T +1.450134660689e-04*pow(T,2) -7.863187630094e-07*pow(T,3) +2.559556607010e-09*pow(T,4) -4.997942221914e-12*pow(T,5) +5.417678681513e-15*pow(T,6) -2.513856275241e-18*pow(T,7); + } + else + { + dB_dT_aa=dBdT_Air(T); // [m^3/mol] + dB_dT_ww=dBdT_Water(T); // [m^3/mol] + } + dB_dT_aw=_dB_aw_dT(T); // [m^3/mol] + return pow(1-psi_w,2)*dB_dT_aa+2*(1-psi_w)*psi_w*dB_dT_aw+psi_w*psi_w*dB_dT_ww; +} + +static double C_m(double T, double psi_w) +{ + // Cm has units of m^6/mol^2 + double C_aaa,C_www,C_aww,C_aaw; + if (FlagUseVirialCorrelations) + { + C_aaa=1.29192158975e-08 -1.776054020409e-10*T +1.359641176409e-12*pow(T,2) + -6.234878717893e-15*pow(T,3) +1.791668730770e-17*pow(T,4) -3.175283581294e-20*pow(T,5) + +3.184306136120e-23*pow(T,6) -1.386043640106e-26*pow(T,7); + C_www=-0.580595811134 +1.365952762696e-02*T -1.375986293288e-04*pow(T,2) + +7.687692259692e-07*pow(T,3) -2.571440816920e-09*pow(T,4) +5.147432221082e-12*pow(T,5) + -5.708156494894e-15*pow(T,6) +2.704605721778e-18*pow(T,7); + } + else + { + C_aaa=C_Air(T); //[m^6/mol^2] + C_www=C_Water(T); //[m^6/mol^2] + } + C_aaw=_C_aaw(T); //[m^6/mol^2] + C_aww=_C_aww(T); //[m^6/mol^2] + return pow(1-psi_w,3)*C_aaa+3*pow(1-psi_w,2)*psi_w*C_aaw+3*(1-psi_w)*psi_w*psi_w*C_aww+pow(psi_w,3)*C_www; +} + +static double dC_m_dT(double T, double psi_w) +{ + // dCm_dT has units of m^6/mol^2/K + + double Tj,tau_Air,tau_Water,dC_dT_aaa,dC_dT_www,dC_dT_aww,dC_dT_aaw; + // NDG for fluid EOS for virial terms + Tj=132.6312; + tau_Air=Tj/T; + tau_Water=Water.keyed_output(CoolProp::iT_reducing)/T; + if (FlagUseVirialCorrelations) + { + dC_dT_aaa=-2.46582342273e-10 +4.425401935447e-12*T -3.669987371644e-14*pow(T,2) +1.765891183964e-16*pow(T,3) -5.240097805744e-19*pow(T,4) +9.502177003614e-22*pow(T,5) -9.694252610339e-25*pow(T,6) +4.276261986741e-28*pow(T,7); + dC_dT_www=0.0984601196142 -2.356713397262e-03*T +2.409113323685e-05*pow(T,2) -1.363083778715e-07*pow(T,3) +4.609623799524e-10*pow(T,4) -9.316416405390e-13*pow(T,5) +1.041909136255e-15*pow(T,6) -4.973918480607e-19*pow(T,7); + } + else + { + dC_dT_aaa=dCdT_Air(T); // [m^6/mol^2] + dC_dT_www=dCdT_Water(T); // [m^6/mol^2] + } + dC_dT_aaw=_dC_aaw_dT(T); // [m^6/mol^2] + dC_dT_aww=_dC_aww_dT(T); // [m^6/mol^2] + return pow(1-psi_w,3)*dC_dT_aaa+3*pow(1-psi_w,2)*psi_w*dC_dT_aaw+3*(1-psi_w)*psi_w*psi_w*dC_dT_aww+pow(psi_w,3)*dC_dT_www; +} +double HumidityRatio(double psi_w) +{ + return psi_w*epsilon/(1-psi_w); +} + +static double HenryConstant(double T) +{ + // Result has units of 1/Pa + double p_ws,beta_N2,beta_O2,beta_Ar,beta_a,tau,Tr,Tc=647.096; + Tr=T/Tc; + tau=1-Tr; + Water.update(CoolProp::QT_INPUTS, 1.0, T); + p_ws = Water.keyed_output(CoolProp::iP); //[Pa] + beta_N2=p_ws*exp(-9.67578/Tr+4.72162*pow(tau,0.355)/Tr+11.70585*pow(Tr,-0.41)*exp(tau)); + beta_O2=p_ws*exp(-9.44833/Tr+4.43822*pow(tau,0.355)/Tr+11.42005*pow(Tr,-0.41)*exp(tau)); + beta_Ar=p_ws*exp(-8.40954/Tr+4.29587*pow(tau,0.355)/Tr+10.52779*pow(Tr,-0.41)*exp(tau)); + beta_a=1/(0.7812/beta_N2+0.2095/beta_O2+0.0093/beta_Ar); + return 1/(1.01325*beta_a); +} +double isothermal_compressibility(double T, double p) +{ + double k_T; + + if (T> 273.16) + { + if (FlagUseIsothermCompressCorrelation) + { + k_T = 1.6261876614E-22*pow(T,6) - 3.3016385196E-19*pow(T,5) + 2.7978984577E-16*pow(T,4) + - 1.2672392901E-13*pow(T,3) + 3.2382864853E-11*pow(T,2) - 4.4318979503E-09*T + 2.5455947289E-07; + } + else + { + Water.update(CoolProp::PT_INPUTS, p, T); + k_T = Water.keyed_output(CoolProp::iisothermal_compressibility); + } + } + else + { + k_T = IsothermCompress_Ice(T,p); //[1/Pa] + } + return k_T; +} +double f_factor(double T, double p) +{ + double f=0,Rbar=8.314371,eps=1e-8,Tj; + double x1=0,x2=0,x3,y1=0,y2,change=_HUGE; + int iter=1; + double p_ws,tau_Air,tau_Water,B_aa,B_aw,B_ww,C_aaa,C_aaw,C_aww,C_www, + line1,line2,line3,line4,line5,line6,line7,line8,k_T,beta_H,LHS,RHS,psi_ws, + vbar_ws; + + // Saturation pressure [Pa] + if (T>273.16) + { + // It is liquid water + p_ws=CoolProp::PropsSI("P","T",T,"Q",0,"Water"); + beta_H = HenryConstant(T); //[1/Pa] + Water.update(CoolProp::PT_INPUTS, p, T); + vbar_ws = 1.0/Water.keyed_output(CoolProp::iDmolar); //[m^3/mol] + } + else + { + // It is ice + p_ws = psub_Ice(T); // [Pa] + beta_H = 0; + vbar_ws = dg_dp_Ice(T,p)*MM_Water(); //[m^3/mol] + } + + k_T = isothermal_compressibility(T,p); //[1/Pa] + + // Hermann: In the iteration process of the enhancement factor in Eq. (3.25), k_T is set to zero for pw,s (T) > p. + if (p_ws>p) + { + k_T=0; + beta_H=0; + } + + // NDG for fluid EOS for virial terms + Tj=132.6312; + tau_Air=Tj/T; + tau_Water=Water.keyed_output(CoolProp::iT_reducing)/T; + if (FlagUseVirialCorrelations) + { + B_aa=-0.000721183853646 +1.142682674467e-05*T -8.838228412173e-08*pow(T,2) + +4.104150642775e-10*pow(T,3) -1.192780880645e-12*pow(T,4) +2.134201312070e-15*pow(T,5) + -2.157430412913e-18*pow(T,6) +9.453830907795e-22*pow(T,7); + B_ww=-10.8963128394 +2.439761625859e-01*T -2.353884845100e-03*pow(T,2) + +1.265864734412e-05*pow(T,3) -4.092175700300e-08*pow(T,4) +7.943925411344e-11*pow(T,5) + -8.567808759123e-14*pow(T,6) +3.958203548563e-17*pow(T,7); + C_aaa=1.29192158975e-08 -1.776054020409e-10*T +1.359641176409e-12*pow(T,2) + -6.234878717893e-15*pow(T,3) +1.791668730770e-17*pow(T,4) -3.175283581294e-20*pow(T,5) + +3.184306136120e-23*pow(T,6) -1.386043640106e-26*pow(T,7); + C_www=-0.580595811134 +1.365952762696e-02*T -1.375986293288e-04*pow(T,2) + +7.687692259692e-07*pow(T,3) -2.571440816920e-09*pow(T,4) +5.147432221082e-12*pow(T,5) + -5.708156494894e-15*pow(T,6) +2.704605721778e-18*pow(T,7); + } + else + { + B_aa = B_Air(T); // [m^3/mol] + C_aaa = C_Air(T); // [m^6/mol^2] + B_ww = B_Water(T); // [m^3/mol] + C_www = C_Water(T); // [m^6/mol^2] + } + B_aw = _B_aw(T); //[m^3/mol] + C_aaw = _C_aaw(T); //[m^6/mol^2] + C_aww = _C_aww(T); //[m^6/mol^2] + + // Use a little secant loop to find f iteratively + // Start out with a guess value of 1 for f + while ((iter<=3 || change>eps) && iter<100) + { + if (iter==1){x1=1.00; f=x1;} + if (iter==2){x2=1.00+0.000001; f=x2;} + if (iter>2) {f=x2;} + + // Left-hand-side of Equation 3.25 + LHS=log(f); + // Eqn 3.24 + psi_ws=f*p_ws/p; + + // All the terms forming the RHS of Eqn 3.25 + line1=((1+k_T*p_ws)*(p-p_ws)-k_T*(p*p-p_ws*p_ws)/2.0)/(Rbar*T)*vbar_ws+log(1-beta_H*(1-psi_ws)*p); + line2=pow(1-psi_ws,2)*p/(Rbar*T)*B_aa-2*pow(1-psi_ws,2)*p/(Rbar*T)*B_aw-(p-p_ws-pow(1-psi_ws,2)*p)/(Rbar*T)*B_ww; + line3=pow(1-psi_ws,3)*p*p/pow(Rbar*T,2)*C_aaa+(3*pow(1-psi_ws,2)*(1-2*(1-psi_ws))*p*p)/(2*pow(Rbar*T,2))*C_aaw; + line4=-3*pow(1-psi_ws,2)*psi_ws*p*p/pow(Rbar*T,2)*C_aww-((3-2*psi_ws)*psi_ws*psi_ws*p*p-p_ws*p_ws)/(2*pow(Rbar*T,2))*C_www; + line5=-(pow(1-psi_ws,2)*(-2+3*psi_ws)*psi_ws*p*p)/pow(Rbar*T,2)*B_aa*B_ww; + line6=-(2*pow(1-psi_ws,3)*(-1+3*psi_ws)*p*p)/pow(Rbar*T,2)*B_aa*B_aw; + line7=(6*pow(1-psi_ws,2)*psi_ws*psi_ws*p*p)/pow(Rbar*T,2)*B_ww*B_aw-(3*pow(1-psi_ws,4)*p*p)/(2*pow(Rbar*T,2))*B_aa*B_aa; + line8=-(2*pow(1-psi_ws,2)*psi_ws*(-2+3*psi_ws)*p*p)/pow(Rbar*T,2)*B_aw*B_aw-(p_ws*p_ws-(4-3*psi_ws)*pow(psi_ws,3)*p*p)/(2*pow(Rbar*T,2))*B_ww*B_ww; + RHS=line1+line2+line3+line4+line5+line6+line7+line8; + + if (iter==1){y1=LHS-RHS;} + if (iter>1) + { + y2=LHS-RHS; + x3=x2-y2/(y2-y1)*(x2-x1); + change=fabs(y2/(y2-y1)*(x2-x1)); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + } + if (f>=1.0) + return f; + else + return 1.0; +} +void HAHelp(void) +{ + printf("Sorry, Need to update!"); +} +int returnHumAirCode(const char * Code) +{ + if (!strcmp(Code,"GIVEN_TDP")) + return GIVEN_TDP; + else if (!strcmp(Code,"GIVEN_HUMRAT")) + return GIVEN_HUMRAT; + else if (!strcmp(Code,"GIVEN_TWB")) + return GIVEN_TWB; + else if (!strcmp(Code,"GIVEN_RH")) + return GIVEN_RH; + else if (!strcmp(Code,"GIVEN_ENTHALPY")) + return GIVEN_ENTHALPY; + else + { + fprintf(stderr,"Code to returnHumAirCode in HumAir.c [%s] not understood",Code); + return -1; + } +} +double Viscosity(double T, double p, double psi_w) +{ + /* + Using the method of: + + P.T. Tsilingiris, 2009, Thermophysical and transport properties of humid air at temperature range between 0 and 100 oC, Energy Conversion and Management, 49, 1098-1010 + + but using the detailed measurements for pure fluid from IAPWS formulations + */ + double mu_a,mu_w,Phi_av,Phi_va,Ma,Mw; + Mw=MM_Water(); + Ma=MM_Air(); + // Viscosity of dry air at dry-bulb temp and total pressure + Air.update(CoolProp::PT_INPUTS,p,T); + mu_a=Air.keyed_output(CoolProp::iviscosity); + // Viscosity of pure saturated water at dry-bulb temperature + Water.update(CoolProp::PQ_INPUTS,p,1); + mu_w=Water.keyed_output(CoolProp::iviscosity); + Phi_av=sqrt(2.0)/4.0*pow(1+Ma/Mw,-0.5)*pow(1+sqrt(mu_a/mu_w)*pow(Mw/Ma,0.25),2); //[-] + Phi_va=sqrt(2.0)/4.0*pow(1+Mw/Ma,-0.5)*pow(1+sqrt(mu_w/mu_a)*pow(Ma/Mw,0.25),2); //[-] + return (1-psi_w)*mu_a/((1-psi_w)+psi_w*Phi_av)+psi_w*mu_w/(psi_w+(1-psi_w)*Phi_va); +} +double Conductivity(double T, double p, double psi_w) +{ + /* + Using the method of: + + P.T. Tsilingiris, 2009, Thermophysical and transport properties of humid air at temperature range between 0 and 100 oC, Energy Conversion and Management, 49, 1098-1010 + + but using the detailed measurements for pure fluid from IAPWS formulations + */ + double mu_a,mu_w,k_a,k_w,Phi_av,Phi_va,Ma,Mw; + Mw=MM_Water(); + Ma=MM_Air(); + + // Viscosity of dry air at dry-bulb temp and total pressure + Air.update(CoolProp::PT_INPUTS,p,T); + mu_a=Air.keyed_output(CoolProp::iviscosity); + k_a=Air.keyed_output(CoolProp::iconductivity); + // Viscosity of pure saturated water at dry-bulb temperature + Water.update(CoolProp::PQ_INPUTS,p,1); + mu_w=Water.keyed_output(CoolProp::iviscosity); + k_w=Water.keyed_output(CoolProp::iconductivity); + Phi_av=sqrt(2.0)/4.0*pow(1+Ma/Mw,-0.5)*pow(1+sqrt(mu_a/mu_w)*pow(Mw/Ma,0.25),2); //[-] + Phi_va=sqrt(2.0)/4.0*pow(1+Mw/Ma,-0.5)*pow(1+sqrt(mu_w/mu_a)*pow(Ma/Mw,0.25),2); //[-] + return (1-psi_w)*k_a/((1-psi_w)+psi_w*Phi_av)+psi_w*k_w/(psi_w+(1-psi_w)*Phi_va); +} +double MolarVolume(double T, double p, double psi_w) +{ + // Output in m^3/mol + int iter; + double v_bar0, v_bar=0, R_bar=8.314472,x1=0,x2=0,x3,y1=0,y2,resid,eps,Bm,Cm; + + // ----------------------------- + // Iteratively find molar volume + // ----------------------------- + + // Start by assuming it is an ideal gas to get initial guess + v_bar0=R_bar*T/p; + + //Bring outside the loop since not a function of v_bar + Bm=B_m(T,psi_w); + Cm=C_m(T,psi_w); + + iter=1; eps=1e-11; resid=999; + while ((iter<=3 || fabs(resid)>eps) && iter<100) + { + if (iter==1){x1=v_bar0; v_bar=x1;} + if (iter==2){x2=v_bar0+0.000001; v_bar=x2;} + if (iter>2) {v_bar=x2;} + + // want v_bar in m^3/mol and R_bar in J/mol-K + resid = (p-(R_bar)*T/v_bar*(1+Bm/v_bar+Cm/(v_bar*v_bar)))/p; + + if (iter==1){y1=resid;} + if (iter>1) + { + y2=resid; + x3=x2-y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + } + return v_bar; +} +double IdealGasMolarEnthalpy_Water(double T, double vmolar) +{ + double hbar_w_0, tau, rhomolar, hbar_w; + // Ideal-Gas contribution to enthalpy of water + hbar_w_0 = -0.01102303806;//[J/mol] + tau = Water.keyed_output(CoolProp::iT_reducing)/T; + rhomolar = 1/vmolar; //[mol/m^3] + Water.update(CoolProp::DmolarT_INPUTS, rhomolar, T); + hbar_w = hbar_w_0+R_bar*T*(1+tau*Water.keyed_output(CoolProp::idalpha0_dtau_constdelta)); + return hbar_w; +} +double IdealGasMolarEntropy_Water(double T, double p) +{ + double sbar_w, tau, R_bar; + R_bar = 8.314371; //[J/mol/K] + tau = Water.keyed_output(CoolProp::iT_reducing)/T; + Water.update(CoolProp::DmolarT_INPUTS,p/(R_bar*T),T); + sbar_w = R_bar*(tau*Water.keyed_output(CoolProp::idalpha0_dtau_constdelta)-Water.keyed_output(CoolProp::ialpha0)); //[kJ/kmol/K] + return sbar_w; +} +double IdealGasMolarEnthalpy_Air(double T, double vmolar) +{ + double hbar_a_0, tau, rhomolar, hbar_a, R_bar_Lemmon; + // Ideal-Gas contribution to enthalpy of air + hbar_a_0 = -7914.149298; //[J/mol] + // Tj is given by 132.6312 K + tau = 132.6312/T; + rhomolar = 1/vmolar; //[mol/m^3] + R_bar_Lemmon = 8.314510; //[J/mol/K] + Air.update(CoolProp::DmolarT_INPUTS, rhomolar, T); + double dd = Air.keyed_output(CoolProp::idalpha0_dtau_constdelta); + hbar_a = hbar_a_0 + R_bar_Lemmon*T*(1+tau*Air.keyed_output(CoolProp::idalpha0_dtau_constdelta)); //[J/mol] + return hbar_a; +} +double IdealGasMolarEntropy_Air(double T, double vmolar_a) +{ + double sbar_0_Lem, tau, sbar_a, R_bar_Lemmon = 8.314510, T0=273.15, p0=101325, vmolar_a_0; + + // Ideal-Gas contribution to entropy of air + sbar_0_Lem=-196.1375815; //[J/mol/K] + + // Tj and rhoj are given by 132.6312 and 302.5507652 respectively + tau = 132.6312/T; //[no units] + + vmolar_a_0 = R_bar_Lemmon*T0/p0; //[m^3/mol] + + Air.update(CoolProp::DmolarT_INPUTS,1/vmolar_a_0,T); + + sbar_a=sbar_0_Lem+R_bar_Lemmon*(tau*Air.keyed_output(CoolProp::idalpha0_dtau_constdelta)-Air.keyed_output(CoolProp::ialpha0))+R_bar_Lemmon*log(vmolar_a/vmolar_a_0); //[J/mol/K] + + return sbar_a; //[J/mol/K] +} + +double MolarEnthalpy(double T, double p, double psi_w, double vmolar) +{ + // In units of kJ/kmol + + // vbar (molar volume) in m^3/kg + + double hbar_0, hbar_a, hbar_w, hbar, R_bar=8.314472; + // ---------------------------------------- + // Enthalpy + // ---------------------------------------- + // Constant for enthalpy + // Not clear why getting rid of this term yields the correct values in the table, but enthalpies are equal to an additive constant, so not a big deal + hbar_0=0.0;//2.924425468; //[kJ/kmol] + + if (FlagUseIdealGasEnthalpyCorrelations){ + hbar_w = 2.7030251618E-03*T*T + 3.1994361015E+01*T + 3.6123174929E+04; + hbar_a = 9.2486716590E-04*T*T + 2.8557221776E+01*T - 7.8616129429E+03; + } + else{ + hbar_w = IdealGasMolarEnthalpy_Water(T, vmolar); + hbar_a = IdealGasMolarEnthalpy_Air(T, vmolar); + } + + hbar = hbar_0+(1-psi_w)*hbar_a+psi_w*hbar_w+R_bar*T*((B_m(T,psi_w)-T*dB_m_dT(T,psi_w))/vmolar+(C_m(T,psi_w)-T/2.0*dC_m_dT(T,psi_w))/(vmolar*vmolar)); + return hbar; //[J/mol] +} +double MassEnthalpy(double T, double p, double psi_w) +{ + double vmolar = MolarVolume(T, p, psi_w); //[m^3/mol_ha] + double h_bar = MolarEnthalpy(T, p, psi_w, vmolar); //[J/mol_ha] + double W = HumidityRatio(psi_w); //[kg_w/kg_da] + double M_ha = MM_Water()*psi_w+(1-psi_w)*0.028966; // [kg_ha/mol_ha] + // (1+W) is kg_ha/kg_da + return h_bar*(1+W)/M_ha; //[J/kg_da] +} + +double MolarEntropy(double T, double p, double psi_w, double v_bar) +{ + // In units of J/mol/K + + // Serious typo in RP-1485 - should use total pressure rather than + // reference pressure in density calculation for water vapor molar entropy + + // vbar (molar volume) in m^3/mol + double x1=0,x2=0,x3=0,y1=0,y2=0,eps=1e-8,f=999,R_bar_Lem=8.314510; + int iter=1; + double sbar_0,sbar_a=0,sbar_w=0,sbar,R_bar=8.314472,vbar_a_guess, Baa, Caaa,vbar_a=0; + double B,dBdT,C,dCdT; + // Constant for entropy + sbar_0=0.02366427495; //[J/mol/K] + + // Calculate vbar_a, the molar volume of dry air + // B_m, C_m, etc. functions take care of the units + Baa = B_m(T,0); + B = B_m(T,psi_w); + dBdT = dB_m_dT(T,psi_w); + Caaa = C_m(T,0); + C = C_m(T,psi_w); + dCdT = dC_m_dT(T,psi_w); + + vbar_a_guess = R_bar_Lem*T/p; //[m^3/mol] since p in [Pa] + + while ((iter<=3 || fabs(f)>eps) && iter<100) + { + if (iter==1){x1=vbar_a_guess; vbar_a=x1;} + if (iter==2){x2=vbar_a_guess+0.001; vbar_a=x2;} + if (iter>2) {vbar_a=x2;} + f=R_bar_Lem*T/vbar_a*(1+Baa/vbar_a+Caaa/pow(vbar_a,2))-p; + if (iter==1){y1=f;} + if (iter>1) + { + y2=f; + x3=x2-y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + if (iter>100){ return _HUGE; } + } + + if (FlagUseIdealGasEnthalpyCorrelations){ + std::cout << "Not implemented" << std::endl; + } + else{ + sbar_w=IdealGasMolarEntropy_Water(T,p); + sbar_a=IdealGasMolarEntropy_Air(T,vbar_a); + } + if (psi_w!=0){ + sbar = sbar_0+(1-psi_w)*sbar_a+psi_w*sbar_w-R_bar*( (B+T*dBdT)/v_bar+(C+T*dCdT)/(2*pow(v_bar,2))+(1-psi_w)*log(1-psi_w)+psi_w*log(psi_w)); + } + else{ + sbar = sbar_0+sbar_a; + } + return sbar; //[kJ/kmol/K] +} + +double DewpointTemperature(double T, double p, double psi_w) +{ + int iter; + double p_w,eps,resid,Tdp=0,x1=0,x2=0,x3,y1=0,y2,T0; + double p_ws_dp,f_dp; + + // Make sure it isn't dry air, return an impossible temperature otherwise + if ((1-psi_w)<1e-16) + { + return -1; + } + // ------------------------------------------ + // Iteratively find the dewpoint temperature + // ------------------------------------------ + + // The highest dewpoint temperature possible is the dry-bulb temperature. + // When they are equal, the air is saturated (R=1) + + p_w = psi_w*p; + + // 0.61165... is the triple point pressure of water in kPa + if (p_w > 0.6116547241637944){ + Water.update(CoolProp::PQ_INPUTS, p, 1.0); + T0 = Water.keyed_output(CoolProp::iT); + } + else{ + T0 = 268; + } + // A good guess for Tdp is that enhancement factor is unity, which yields + // p_w_s = p_w, and get guess for T from saturation temperature + + iter=1; eps=1e-8; resid=999; + while ((iter<=3 || fabs(resid)>eps) && iter<100) + { + if (iter==1){x1 = T0; Tdp=x1;} + if (iter==2){x2 = x1 + 0.1; Tdp=x2;} + if (iter>2) {Tdp=x2;} + + if (Tdp >= 273.16) + { + // Saturation pressure at dewpoint [kPa] + Water.update(CoolProp::QT_INPUTS, 0.0, Tdp); + p_ws_dp = Water.keyed_output(CoolProp::iP); + } + else + { + // Sublimation pressure at icepoint [kPa] + p_ws_dp=psub_Ice(Tdp); + } + // Enhancement Factor at dewpoint temperature [-] + f_dp=f_factor(Tdp,p); + // Error between target and actual pressure [kPa] + resid=p_w-p_ws_dp*f_dp; + + if (iter==1){y1=resid;} + if (iter>1) + { + y2=resid; + x3=x2-y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + } + iter=iter+1; + } + return Tdp; +} + +class WetBulbSolver : public CoolProp::FuncWrapper1D +{ +private: + double _T,_p,_W,LHS,v_bar_w,M_ha; +public: + WetBulbSolver(double T, double p, double psi_w){ + _T = T; + _p = p; + _W = epsilon*psi_w/(1-psi_w); + + //These things are all not a function of Twb + v_bar_w = MolarVolume(T,p,psi_w); + M_ha = MM_Water()*psi_w+(1-psi_w)*28.966; + LHS = MolarEnthalpy(T,p,psi_w,v_bar_w)*(1+_W)/M_ha; + }; + ~WetBulbSolver(){}; + double call(double Twb) + { + double epsilon=0.621945; + double f_wb,p_ws_wb,p_s_wb,W_s_wb,h_w,M_ha_wb,psi_wb,v_bar_wb; + + // Enhancement Factor at wetbulb temperature [-] + f_wb=f_factor(Twb,_p); + if (Twb > 273.16) + { + // Saturation pressure at wetbulb temperature [Pa] + Water.update(CoolProp::QT_INPUTS,0,Twb); + p_ws_wb= Water.keyed_output(CoolProp::iP); + } + else + { + // Sublimation pressure at wetbulb temperature [kPa] + p_ws_wb=psub_Ice(Twb); + } + + // Vapor pressure + p_s_wb = f_wb*p_ws_wb; + // wetbulb humidity ratio + W_s_wb = epsilon*p_s_wb/(_p-p_s_wb); + // wetbulb water mole fraction + psi_wb = W_s_wb/(epsilon+W_s_wb); + if (Twb > 273.16) + { + // Enthalpy of water [J/kg_water] + Water.update(CoolProp::PT_INPUTS, _p, Twb); + h_w = Water.keyed_output(CoolProp::iHmass); //[J/kg_water] + } + else + { + // Enthalpy of ice [J/kg_water] + h_w=h_Ice(Twb,_p); + } + // Mole masses of wetbulb and humid air + + M_ha_wb=MM_Water()*psi_wb+(1-psi_wb)*28.966; + v_bar_wb=MolarVolume(Twb,_p,psi_wb); + double RHS = (MolarEnthalpy(Twb,_p,psi_wb,v_bar_wb)*(1+W_s_wb)/M_ha_wb+(_W-W_s_wb)*h_w); + if (!ValidNumber(LHS-RHS)){throw CoolProp::ValueError();} + return LHS - RHS; + } +}; + +class WetBulbTminSolver : public CoolProp::FuncWrapper1D +{ +public: + double p,hair_dry,r, RHS; + WetBulbTminSolver(double p, double hair_dry){ + this->p = p; + this->hair_dry = hair_dry; + }; + ~WetBulbTminSolver(){}; + double call(double Ts) + { + RHS = HAPropsSI("H","T",Ts,"P",p,"R",1); + if (!ValidNumber(RHS)){throw CoolProp::ValueError();} + r = RHS - this->hair_dry; + return r; + } +}; + +double WetbulbTemperature(double T, double p, double psi_w) +{ + // ------------------------------------------ + // Iteratively find the wetbulb temperature + // ------------------------------------------ + // + // If the temperature is less than the saturation temperature of water + // for the given atmospheric pressure, the highest wetbulb temperature that is possible is the dry bulb + // temperature + // + // If the temperature is above the saturation temperature corresponding to the atmospheric pressure, + // then the maximum value for the wetbulb temperature is the saturation temperature + double Tmax = T; + Water.update(CoolProp::PQ_INPUTS,p,1.0); + double Tsat = Water.keyed_output(CoolProp::iT); + if (T >= Tsat) + { + Tmax = Tsat; + } + + // Instantiate the solver container class + WetBulbSolver WBS(T, p, psi_w); + + std::string errstr; + + double return_val; + try{ + return_val = Secant(WBS,Tmax,0.0001,1e-8,50,errstr); + + // Solution obtained is out of range (T>Tmax) + if (return_val > Tmax) {throw CoolProp::ValueError();} + } + catch(std::exception &) + { + // The lowest wetbulb temperature that is possible for a given dry bulb temperature + // is the saturated air temperature which yields the enthalpy of dry air at dry bulb temperature + + try{ + double hair_dry = MassEnthalpy(T,p,0); + + // Directly solve for the saturated temperature that yields the enthalpy desired + WetBulbTminSolver WBTS(p,hair_dry); + double Tmin = Brent(WBTS,210,Tsat-1,1e-12,1e-12,50,errstr); + + return_val = Brent(WBS,Tmin-30,Tmax-1,1e-12,1e-12,50,errstr); + } + catch(std::exception) + { + return_val = _HUGE; + } + } + return return_val; +} +static int Name2Type(const char *Name) +{ + if (!strcmp(Name,"Omega") || !strcmp(Name,"HumRat") || !strcmp(Name,"W")) + return GIVEN_HUMRAT; + else if (!strcmp(Name,"Tdp") || !strcmp(Name,"T_dp") || !strcmp(Name,"DewPoint") || !strcmp(Name,"D")) + return GIVEN_TDP; + else if (!strcmp(Name,"Twb") || !strcmp(Name,"T_wb") || !strcmp(Name,"WetBulb") || !strcmp(Name,"B")) + return GIVEN_TWB; + else if (!strcmp(Name,"Enthalpy") || !strcmp(Name,"H")) + return GIVEN_ENTHALPY; + else if (!strcmp(Name,"RH") || !strcmp(Name,"RelHum") || !strcmp(Name,"R")) + return GIVEN_RH; + else if (!strcmp(Name,"Tdb") || !strcmp(Name,"T_db") || !strcmp(Name,"T")) + return GIVEN_T; + else if (!strcmp(Name,"P")) + return GIVEN_P; + else if (!strcmp(Name,"V") || !strcmp(Name,"Vda")) + return GIVEN_V; + else if (!strcmp(Name,"mu") || !strcmp(Name,"Visc") || !strcmp(Name,"M")) + return GIVEN_VISC; + else if (!strcmp(Name,"k") || !strcmp(Name,"Conductivity") || !strcmp(Name,"K")) + return GIVEN_COND; + else + printf("Sorry, your input [%s] was not understood to Name2Type in HumAir.c. Acceptable values are T,P,R,W,D,B,H,M,K and aliases thereof\n",Name); + return -1; +} +int TypeMatch(int TypeCode, const char *Input1Name, const char *Input2Name, const char *Input3Name) +{ + // Return the index of the input variable that matches the input, otherwise return -1 for failure + if (TypeCode==Name2Type(Input1Name)) + return 1; + if (TypeCode==Name2Type(Input2Name)) + return 2; + if (TypeCode==Name2Type(Input3Name)) + return 3; + else + return -1; +} +double MoleFractionWater(double T, double p, int HumInput, double InVal) +{ + double p_ws,f,W,epsilon=0.621945,Tdp,p_ws_dp,f_dp,p_w_dp,p_s,RH; + + if (HumInput==GIVEN_HUMRAT) //(2) + { + W=InVal; + return W/(epsilon+W); + } + else if (HumInput==GIVEN_RH) + { + if (T>=273.16) + { + // Saturation pressure [Pa] + Water.update(CoolProp::QT_INPUTS,0,T); + p_ws= Water.keyed_output(CoolProp::iP);; + } + else + { + // Sublimation pressure [Pa] + p_ws=psub_Ice(T); + + } + // Enhancement Factor [-] + f=f_factor(T,p); + + // Saturation pressure [Pa] + p_s=f*p_ws; + RH=InVal; + W=epsilon*RH*p_s/(p-RH*p_s); + return W/(epsilon+W); + } + else if (HumInput==GIVEN_TDP) + { + Tdp=InVal; + // Saturation pressure at dewpoint [Pa] + if (Tdp>=273.16) + { + Water.update(CoolProp::QT_INPUTS,0,Tdp); + p_ws_dp = Water.keyed_output(CoolProp::iP); //[Pa] + } + else{ + // Sublimation pressure [Pa] + p_ws_dp=psub_Ice(Tdp); + } + + // Enhancement Factor at dewpoint temperature [-] + f_dp=f_factor(Tdp,p); + // Water vapor pressure at dewpoint [Pa] + p_w_dp=f_dp*p_ws_dp; + // Water mole fraction [-] + return p_w_dp/p; + } + else + { + return -1000000; + } +} + +double RelativeHumidity(double T, double p, double psi_w) +{ + double p_ws, f, p_s, W; + if (T >= 273.16){ + // Saturation pressure [Pa] + Water.update(CoolProp::QT_INPUTS, 0, T); + p_ws = Water.keyed_output(CoolProp::iP); //[Pa] + } + else{ + // sublimation pressure [Pa] + p_ws = psub_Ice(T); + } + // Enhancement Factor [-] + f = f_factor(T,p); + + // Saturation pressure [Pa] + p_s = f*p_ws; + // Find humidity ratio + W = HumidityRatio(psi_w); + // Find relative humidity using W/e=phi*p_s/(p-phi*p_s) + return W/epsilon*p/(p_s*(1+W/epsilon)); +} +double HAPropsSI(const char *OutputName, const char *Input1Name, double Input1, const char *Input2Name, double Input2, const char *Input3Name, double Input3) +{ + try + { + int In1Type, In2Type, In3Type,iT,iW,iTdp,iRH,ip,Type1,Type2; + double vals[3],p,T,RH,W,Tdp,psi_w,M_ha,v_bar,h_bar,s_bar,MainInputValue,SecondaryInputValue,T_guess; + double Value1,Value2,W_guess; + char MainInputName[100], SecondaryInputName[100],Name1[100],Name2[100]; + + vals[0]=Input1; + vals[1]=Input2; + vals[2]=Input3; + + // First figure out what kind of inputs you have, convert names to Macro expansions + In1Type=Name2Type(Input1Name); + In2Type=Name2Type(Input2Name); + In3Type=Name2Type(Input3Name); + + // Pressure must be included + ip=TypeMatch(GIVEN_P,Input1Name,Input2Name,Input3Name); + if (ip>0) + p=vals[ip-1]; + else + return -1000; + + // ----------------------------------------------------------------------------------------------------- + // Check whether the remaining values give explicit solution for mole fraction of water - nice and fast + // ----------------------------------------------------------------------------------------------------- + + // Find the codes if they are there + iT= TypeMatch(GIVEN_T,Input1Name,Input2Name,Input3Name); + iRH= TypeMatch(GIVEN_RH,Input1Name,Input2Name,Input3Name); + iW= TypeMatch(GIVEN_HUMRAT,Input1Name,Input2Name,Input3Name); + iTdp= TypeMatch(GIVEN_TDP,Input1Name,Input2Name,Input3Name); + + if (iT>0) // Found T (or alias) as an input + { + T=vals[iT-1]; + if (iRH>0) //Relative Humidity is provided + { + RH=vals[iRH-1]; + psi_w=MoleFractionWater(T,p,GIVEN_RH,RH); + } + else if (iW>0) + { + W=vals[iW-1]; + psi_w=MoleFractionWater(T,p,GIVEN_HUMRAT,W); + } + else if (iTdp>0) + { + Tdp=vals[iTdp-1]; + psi_w=MoleFractionWater(T,p,GIVEN_TDP,Tdp); + } + else + { + // Temperature and pressure are known, figure out which variable holds the other value + if (In1Type!=GIVEN_T && In1Type!=GIVEN_P) + { + strcpy(SecondaryInputName,Input1Name); + SecondaryInputValue=Input1; + } + else if (In2Type!=GIVEN_T && In2Type!=GIVEN_P) + { + strcpy(SecondaryInputName,Input2Name); + SecondaryInputValue=Input2; + } + else if (In3Type!=GIVEN_T && In3Type!=GIVEN_P) + { + strcpy(SecondaryInputName,Input3Name); + SecondaryInputValue=Input3; + } + else{ + return _HUGE; + } + // Find the value for W + W_guess=0.0001; + W=Secant_HAProps_W(SecondaryInputName,"P",p,"T",T,SecondaryInputValue,W_guess); + // Mole fraction of water + psi_w=MoleFractionWater(T,p,GIVEN_HUMRAT,W); + // And on to output... + } + } + else + { + // Need to iterate to find dry bulb temperature since temperature is not provided + + // Pick one input, and alter T to match the other input + + // Get the variables and their values that are NOT pressure for simplicity + // because you know you need pressure as an input and you already have + // its value in variable p + if (ip==1) // Pressure is in slot 1 + { + strcpy(Name1,Input2Name); + Value1=Input2; + strcpy(Name2,Input3Name); + Value2=Input3; + } + else if (ip==2) // Pressure is in slot 2 + { + strcpy(Name1,Input1Name); + Value1=Input1; + strcpy(Name2,Input3Name); + Value2=Input3; + } + else if (ip==3) // Pressure is in slot 3 + { + strcpy(Name1,Input1Name); + Value1=Input1; + strcpy(Name2,Input2Name); + Value2=Input2; + } + else{ + return _HUGE; + } + + // Get the integer type codes + Type1=Name2Type(Name1); + Type2=Name2Type(Name2); + + // First, if one of the inputs is something that can potentially yield + // an explicit solution at a given iteration of the solver, use it + if (Type1==GIVEN_RH || Type1==GIVEN_HUMRAT || Type1==GIVEN_TDP) + { + // First input variable is a "nice" one + + // MainInput is the one that you are using in the call to HAProps + MainInputValue=Value1; + strcpy(MainInputName,Name1); + // SecondaryInput is the one that you are trying to match + SecondaryInputValue=Value2; + strcpy(SecondaryInputName,Name2); + } + else if (Type2==GIVEN_RH || Type2==GIVEN_HUMRAT || Type2==GIVEN_TDP) + { + // Second input variable is a "nice" one + + // MainInput is the one that you are using in the call to HAProps + MainInputValue=Value2; + strcpy(MainInputName,Name2); + // SecondaryInput is the one that you are trying to match + SecondaryInputValue=Value1; + strcpy(SecondaryInputName,Name1); + } + else + { + printf("Sorry, but currently at least one of the variables as an input to HAProps() must be temperature, relative humidity, humidity ratio, or dewpoint\n Eventually will add a 2-D NR solver to find T and psi_w simultaneously, but not included now\n"); + return -1000; + } + + double T_min = 210; + double T_max = 450; + + T = -1; + + // First try to use the secant solver to find T at a few different temperatures + for (T_guess = 210; T_guess < 450; T_guess += 60) + { + try{ + T = Secant_HAProps_T(SecondaryInputName,(char *)"P",p,MainInputName,MainInputValue,SecondaryInputValue,T_guess); + double val = HAPropsSI(SecondaryInputName,(char *)"T",T,(char *)"P",p,MainInputName,MainInputValue); + if (!ValidNumber(T) || !ValidNumber(val) || !(T_min < T && T < T_max) || fabs(val-SecondaryInputValue)>1e-6) + { + throw CoolProp::ValueError(); + } + else + { + break; + } + } + catch (std::exception &){}; + } + + if (T < 0) // No solution found using secant + { + // Use the Brent's method solver to find T + T = Brent_HAProps_T(SecondaryInputName,(char *)"P",p,MainInputName,MainInputValue,SecondaryInputValue,T_min,T_max); + } + + // If you want the temperature, return it + if (Name2Type(OutputName)==GIVEN_T) + return T; + else + { + // Otherwise, find psi_w for further calculations in the following section + W=HAPropsSI((char *)"W",(char *)"T",T,(char *)"P",p,MainInputName,MainInputValue); + psi_w=MoleFractionWater(T,p,GIVEN_HUMRAT,W); + } + } + M_ha=(1-psi_w)*0.028966+MM_Water()*psi_w; //[kg_ha/mol_ha] + + // ----------------------------------------------------------------- + // Calculate and return the desired value for known set of T,p,psi_w + // ----------------------------------------------------------------- + if (!strcmp(OutputName,"Vda") || !strcmp(OutputName,"V")) + { + v_bar = MolarVolume(T,p,psi_w); //[m^3/mol_ha] + W = HumidityRatio(psi_w); //[kg_w/kg_a] + return v_bar*(1+W)/M_ha; //[m^3/kg_da] + } + else if (!strcmp(OutputName,"Vha")) + { + v_bar = MolarVolume(T,p,psi_w); //[m^3/mol_ha] + return v_bar/M_ha; //[m^3/kg_ha] + } + else if (!strcmp(OutputName,"Y")) + { + return psi_w; //[mol_w/mol] + } + else if (!strcmp(OutputName,"Hda") || !strcmp(OutputName,"H")) + { + return MassEnthalpy(T,p,psi_w); + } + else if (!strcmp(OutputName,"Hha")) + { + v_bar = MolarVolume(T, p, psi_w); //[m^3/mol_ha] + h_bar = MolarEnthalpy(T, p, psi_w,v_bar); //[J/mol_ha] + return h_bar/M_ha; //[kJ/kg_ha] + } + else if (!strcmp(OutputName,"S") || !strcmp(OutputName,"Entropy")) + { + v_bar = MolarVolume(T, p, psi_w); //[m^3/mol_ha] + s_bar = MolarEntropy(T, p, psi_w, v_bar); //[kJ/kmol_ha] + W = HumidityRatio(psi_w); //[kg_w/kg_da] + return s_bar*(1+W)/M_ha; //[kJ/kg_da] + } + else if (!strcmp(OutputName,"C") || !strcmp(OutputName,"cp")) + { + double v_bar1,v_bar2,h_bar1,h_bar2, cp_bar, dT = 1e-3; + v_bar1=MolarVolume(T-dT,p,psi_w); //[m^3/mol_ha] + h_bar1=MolarEnthalpy(T-dT,p,psi_w,v_bar1); //[kJ/kmol_ha] + v_bar2=MolarVolume(T+dT,p,psi_w); //[m^3/mol_ha] + h_bar2=MolarEnthalpy(T+dT,p,psi_w,v_bar2); //[kJ/kmol_ha] + W=HumidityRatio(psi_w); //[kg_w/kg_da] + cp_bar = (h_bar2-h_bar1)/(2*dT); + return cp_bar*(1+W)/M_ha; //[kJ/kg_da] + } + else if (!strcmp(OutputName,"Cha") || !strcmp(OutputName,"cp_ha")) + { + double v_bar1,v_bar2,h_bar1,h_bar2, cp_bar, dT = 1e-3; + v_bar1=MolarVolume(T-dT,p,psi_w); //[m^3/mol_ha] + h_bar1=MolarEnthalpy(T-dT,p,psi_w,v_bar1); //[kJ/kmol_ha] + v_bar2=MolarVolume(T+dT,p,psi_w); //[m^3/mol_ha] + h_bar2=MolarEnthalpy(T+dT,p,psi_w,v_bar2); //[kJ/kmol_ha] + W=HumidityRatio(psi_w); //[kg_w/kg_da] + cp_bar = (h_bar2-h_bar1)/(2*dT); + return cp_bar/M_ha; //[kJ/kg_da] + } + else if (!strcmp(OutputName,"Tdp") || !strcmp(OutputName,"D")) + { + return DewpointTemperature(T,p,psi_w); //[K] + } + else if (!strcmp(OutputName,"Twb") || !strcmp(OutputName,"T_wb") || !strcmp(OutputName,"WetBulb") || !strcmp(OutputName,"B")) + { + return WetbulbTemperature(T,p,psi_w); //[K] + } + else if (!strcmp(OutputName,"Omega") || !strcmp(OutputName,"HumRat") || !strcmp(OutputName,"W")) + { + return HumidityRatio(psi_w); + } + else if (!strcmp(OutputName,"RH") || !strcmp(OutputName,"RelHum") || !strcmp(OutputName,"R")) + { + return RelativeHumidity(T,p,psi_w); + } + else if (!strcmp(OutputName,"mu") || !strcmp(OutputName,"Visc") || !strcmp(OutputName,"M")) + { + return Viscosity(T,p,psi_w); + } + else if (!strcmp(OutputName,"k") || !strcmp(OutputName,"Conductivity") || !strcmp(OutputName,"K")) + { + return Conductivity(T,p,psi_w); + } + else + { + return -1000; + } + } + catch (std::exception &e) + { + CoolProp::set_error_string(e.what()); + return _HUGE; + } + catch (...) + { + return _HUGE; + } +} + +double HAProps_Aux(const char* Name,double T, double p, double W, char *units) +{ + // This function provides some things that are not usually needed, but could be interesting for debug purposes. + + // Requires W since it is nice and fast and always defined. Put a dummy value if you want something that doesn't use humidity + + // Takes temperature, pressure, and humidity ratio W as inputs; + double psi_w,Tj,tau_Water,tau_Air,B_aa,C_aaa,B_ww,C_www,B_aw,C_aaw,C_aww,v_bar; + + Tj=132.6312; + tau_Air=Tj/T; + tau_Water=Water.keyed_output(CoolProp::iT_critical)/T; + + try{ + if (!strcmp(Name,"Baa")) + { + B_aa=B_Air(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return B_aa; + } + else if (!strcmp(Name,"Caaa")) + { + C_aaa=C_Air(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_aaa; + } + else if (!strcmp(Name,"Bww")) + { + B_ww=B_Water(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return B_ww; + } + else if (!strcmp(Name,"Cwww")) + { + C_www=C_Water(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_www; + } + else if (!strcmp(Name,"dBaa")) + { + B_aa=dBdT_Air(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return B_aa; + } + else if (!strcmp(Name,"dCaaa")) + { + C_aaa=dCdT_Air(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_aaa; + } + else if (!strcmp(Name,"dBww")) + { + B_ww=dBdT_Water(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return B_ww; + } + else if (!strcmp(Name,"dCwww")) + { + C_www=dCdT_Water(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_www; + } + else if (!strcmp(Name,"Baw")) + { + B_aw=_B_aw(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return B_aw; + } + else if (!strcmp(Name,"Caww")) + { + C_aww=_C_aww(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_aww; + } + else if (!strcmp(Name,"Caaw")) + { + C_aaw=_C_aaw(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return C_aaw; + } + else if (!strcmp(Name,"dBaw")) + { + double dB_aw=_dB_aw_dT(T); // [m^3/mol] + strcpy(units,"m^3/mol"); + return dB_aw; + } + else if (!strcmp(Name,"dCaww")) + { + double dC_aww=_dC_aww_dT(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return dC_aww; + } + else if (!strcmp(Name,"dCaaw")) + { + double dC_aaw=_dC_aaw_dT(T); // [m^6/mol^2] + strcpy(units,"m^6/mol^2"); + return dC_aaw; + } + else if (!strcmp(Name,"beta_H")) + { + strcpy(units,"1/Pa"); + return HenryConstant(T); + } + else if (!strcmp(Name,"kT")) + { + strcpy(units,"1/Pa"); + if (T>273.16) + { + Water.update(CoolProp::PT_INPUTS, p, T); + return Water.keyed_output(CoolProp::iisothermal_compressibility); + } + else + return IsothermCompress_Ice(T,p); //[1/Pa] + } + else if (!strcmp(Name,"p_ws")) + { + strcpy(units,"Pa"); + if (T>273.16) + { + Water.update(CoolProp::QT_INPUTS, 0, T); + return Water.keyed_output(CoolProp::iP); + } + else + return psub_Ice(T); + } + else if (!strcmp(Name,"vbar_ws")) + { + strcpy(units,"m^3/mol"); + if (T>273.16) + { + Water.update(CoolProp::QT_INPUTS, 0, T); + return 1.0/Water.keyed_output(CoolProp::iDmolar); + } + else + { + // It is ice + return dg_dp_Ice(T,p)*MM_Water()/1000/1000; //[m^3/mol] + } + } + else if (!strcmp(Name,"f")) + { + strcpy(units,"-"); + return f_factor(T,p); + } + // Get psi_w since everything else wants it + psi_w=MoleFractionWater(T,p,GIVEN_HUMRAT,W); + if (!strcmp(Name,"Bm")) + { + strcpy(units,"m^3/mol"); + return B_m(T,psi_w); + } + else if (!strcmp(Name,"Cm")) + { + strcpy(units,"m^6/mol^2"); + return C_m(T,psi_w); + } + else if (!strcmp(Name,"hvirial")) + { + v_bar=MolarVolume(T,p,psi_w); + return 8.3145*T*((B_m(T,psi_w)-T*dB_m_dT(T,psi_w))/v_bar+(C_m(T,psi_w)-T/2.0*dC_m_dT(T,psi_w))/(v_bar*v_bar)); + } + //else if (!strcmp(Name,"ha")) + //{ + // delta=1.1/322; tau=132/T; + // return 1+tau*DerivTerms("dphi0_dTau",tau,delta,"Water"); + //} + //else if (!strcmp(Name,"hw")) + //{ + // //~ return Props('D','T',T,'P',p,"Water")/322; tau=647/T; + // delta=1000/322; tau=647/T; + // //~ delta=rho_Water(T,p,TYPE_TP);tau=647/T; + // return 1+tau*DerivTerms("dphi0_dTau",tau,delta,"Water"); + //} + else if (!strcmp(Name,"hbaro_w")) + { + v_bar=MolarVolume(T,p,psi_w); + return IdealGasMolarEnthalpy_Water(T,v_bar); + } + else if (!strcmp(Name,"hbaro_a")) + { + v_bar=MolarVolume(T,p,psi_w); + return IdealGasMolarEnthalpy_Air(T,v_bar); + } + else + { + printf("Sorry I didn't understand your input [%s] to HAProps_Aux\n",Name); + return -1; + } + } + catch(std::exception &) + { + return _HUGE; + } + return _HUGE; +} +double cair_sat(double T) +{ + // Air saturation specific heat + // Based on a correlation from EES, good from 250K to 300K. + // No error bound checking is carried out + // T: [K] + // cair_s: [kJ/kg-K] + return 2.14627073E+03-3.28917768E+01*T+1.89471075E-01*T*T-4.86290986E-04*T*T*T+4.69540143E-07*T*T*T*T; +} + +double IceProps(const char* Name, double T, double p) +{ + if (!strcmp(Name,"s")) + { + return s_Ice(T,p*1000.0); + } + else if (!strcmp(Name,"rho")) + { + return rho_Ice(T,p*1000.0); + } + else if (!strcmp(Name,"h")) + { + return h_Ice(T,p*1000.0); + } + else + { + return 1e99; + } +} + +} /* namespace HumidAir */ + +#ifdef ENABLE_CATCH +#include +#include "catch.hpp" + +TEST_CASE("Check HA Virials from Table A.2.1","[RP1485]") +{ + SECTION("B_aa") + { + CHECK(fabs(HumidAir::B_Air(-60+273.15)/(-33.065/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Air(0+273.15)/(-13.562/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Air(200+273.15)/(11.905/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Air(350+273.15)/(18.949/1e6)-1) < 1e-3); + } + SECTION("B_ww") + { + CHECK(fabs(HumidAir::B_Water(-60+273.15)/(-11174/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Water(0+273.15)/(-2025.6/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Water(200+273.15)/(-200.52/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::B_Water(350+273.15)/(-89.888/1e6)-1) < 1e-3); + } + SECTION("B_aw") + { + CHECK(fabs(HumidAir::_B_aw(-60+273.15)/(-68.306/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::_B_aw(0+273.15)/(-38.074/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::_B_aw(200+273.15)/(-2.0472/1e6)-1) < 1e-3); + CHECK(fabs(HumidAir::_B_aw(350+273.15)/(7.5200/1e6)-1) < 1e-3); + } + + SECTION("C_aaa") + { + CHECK(fabs(HumidAir::C_Air(-60+273.15)/(2177.9/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::C_Air(0+273.15)/(1893.1/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::C_Air(200+273.15)/(1551.2/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::C_Air(350+273.15)/(1464.7/1e12)-1) < 1e-3); + } + SECTION("C_www") + { + CHECK(fabs(HumidAir::C_Water(-60+273.15)/(-1.5162999202e-04)-1) < 1e-3); // Relaxed criterion for this parameter + CHECK(fabs(HumidAir::C_Water(0+273.15)/(-10981960/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::C_Water(200+273.15)/(-0.00000003713759442)-1) < 1e-3); + CHECK(fabs(HumidAir::C_Water(350+273.15)/(-0.000000001198914198)-1) < 1e-3); + } + SECTION("C_aaw") + { + CHECK(fabs(HumidAir::_C_aaw(-60+273.15)/(1027.3/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aaw(0+273.15)/(861.02/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aaw(200+273.15)/(627.15/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aaw(350+273.15)/(583.79/1e12)-1) < 1e-3); + } + SECTION("C_aww") + { + CHECK(fabs(HumidAir::_C_aww(-60+273.15)/(-1821432/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aww(0+273.15)/(-224234/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aww(200+273.15)/(-8436.5/1e12)-1) < 1e-3); + CHECK(fabs(HumidAir::_C_aww(350+273.15)/(-2486.9/1e12)-1) < 1e-3); + } +} +TEST_CASE("Enhancement factor from Table A.3","[RP1485]") +{ + CHECK(fabs(HumidAir::f_factor(-60+273.15,101325)/(1.00708)-1) < 1e-3); + CHECK(fabs(HumidAir::f_factor( 80+273.15,101325)/(1.00573)-1) < 1e-3); + CHECK(fabs(HumidAir::f_factor(-60+273.15,10000e3)/(2.23918)-1) < 1e-3); + CHECK(fabs(HumidAir::f_factor(300+273.15,10000e3)/(1.04804)-1) < 1e-3); +} +TEST_CASE("Isothermal compressibility from Table A.5","[RP1485]") +{ + CHECK(fabs(HumidAir::isothermal_compressibility(-60+273.15,101325)/(0.10771e-9)-1) < 1e-3); + CHECK(fabs(HumidAir::isothermal_compressibility( 80+273.15,101325)/(0.46009e-9)-1) < 1e-2); // Relaxed criterion for this parameter + CHECK(fabs(HumidAir::isothermal_compressibility(-60+273.15,10000e3)/(0.10701e-9)-1) < 1e-3); + CHECK(fabs(HumidAir::isothermal_compressibility(300+273.15,10000e3)/(3.05896e-9)-1) < 1e-3); +} +TEST_CASE("Henry constant from Table A.6","[RP1485]") +{ + CHECK(fabs(HumidAir::HenryConstant(0+273.15)/(0.22600e-9)-1) < 1e-3); + CHECK(fabs(HumidAir::HenryConstant(300+273.15)/(0.58389e-9)-1) < 1e-3); +} + +// A structure to hold the values for one call to HAProps +struct hel +{ +public: + std::string in1,in2,in3,out; + double v1, v2, v3, expected; + hel(std::string in1, double v1, std::string in2, double v2, std::string in3, double v3, std::string out, double expected) + { + this->in1 = in1; this->in2 = in2; this->in3 = in3; + this->v1 = v1; this->v2 = v2; this->v3 = v3; + this->expected = expected; this->out = out; + }; +}; +hel table_A11[] ={hel("T",473.15,"W",0.00,"P",101325,"B",45.07+273.15), + hel("T",473.15,"W",0.00,"P",101325,"V",1.341), + hel("T",473.15,"W",0.00,"P",101325,"H",202520), + hel("T",473.15,"W",0.00,"P",101325,"S",555.8), + hel("T",473.15,"W",0.50,"P",101325,"B",81.12+273.15), + hel("T",473.15,"W",0.50,"P",101325,"V",2.416), + hel("T",473.15,"W",0.50,"P",101325,"H",1641400), + hel("T",473.15,"W",0.50,"P",101325,"S",4829.5), + hel("T",473.15,"W",1.00,"P",101325,"B",88.15+273.15), + hel("T",473.15,"W",1.00,"P",101325,"V",3.489), + hel("T",473.15,"W",1.00,"P",101325,"H",3079550), + hel("T",473.15,"W",1.00,"P",101325,"S",8889.0)}; + +hel table_A12[] ={hel("T",473.15,"W",0.00,"P",1e6,"B",90.47+273.15), + hel("T",473.15,"W",0.00,"P",1e6,"V",0.136), + hel("T",473.15,"W",0.00,"P",1e6,"H",201940), + hel("T",473.15,"W",0.00,"P",1e6,"S",-101.1), // Using CoolProp 4.2, this value seems incorrect from report + hel("T",473.15,"W",0.50,"P",1e6,"B",148.49+273.15), + hel("T",473.15,"W",0.50,"P",1e6,"V",0.243), + hel("T",473.15,"W",0.50,"P",1e6,"H",1630140), + hel("T",473.15,"W",0.50,"P",1e6,"S",3630.2), + hel("T",473.15,"W",1.00,"P",1e6,"B",159.92+273.15), + hel("T",473.15,"W",1.00,"P",1e6,"V",0.347), + hel("T",473.15,"W",1.00,"P",1e6,"H",3050210), + hel("T",473.15,"W",1.00,"P",1e6,"S",7141.3)}; + +hel table_A15[] ={hel("T",473.15,"W",0.10,"P",1e7,"B",188.92+273.15), + hel("T",473.15,"W",0.10,"P",1e7,"V",0.016), + hel("T",473.15,"W",0.10,"P",1e7,"H",473920), + hel("T",473.15,"W",0.10,"P",1e7,"S",-90.1), + hel("T",473.15,"W",0.10,"P",1e7,"R",0.734594), + }; + +class HAPropsConsistencyFixture +{ +public: + std::vector inputs; + std::string in1,in2,in3,out; + double v1, v2, v3, expected, actual; + void set_table(hel h[], int nrow){ + int h1 = sizeof(h), h2 = sizeof(h[0]); + inputs = std::vector(h, h + nrow); + }; + void set_values(hel &h){ + this->in1 = h.in1; this->in2 = h.in2; this->in3 = h.in3; + this->v1 = h.v1; this->v2 = h.v2; this->v3 = h.v3; + this->expected = h.expected; this->out = h.out; + }; + void call(){ + actual = HumidAir::HAPropsSI(out.c_str(), in1.c_str(), v1, in2.c_str(), v2, in3.c_str(), v3); + } +}; + +TEST_CASE_METHOD(HAPropsConsistencyFixture, "ASHRAE RP1485 Tables", "[RP1485]") +{ + SECTION("Table A.15") + { + set_table(table_A15, 5); + for (std::size_t i = 0; i < inputs.size(); ++i){ + set_values(inputs[i]); + call(); + CAPTURE(out); + CAPTURE(actual); + CAPTURE(expected); + CHECK(fabs(actual/expected-1) < 0.01); + } + } + SECTION("Table A.11") + { + set_table(table_A11, 12); + for (std::size_t i = 0; i < inputs.size(); ++i){ + set_values(inputs[i]); + call(); + CAPTURE(out); + CAPTURE(actual); + CAPTURE(expected); + CHECK(fabs(actual/expected-1) < 0.01); + } + } + SECTION("Table A.12") + { + set_table(table_A12, 12); + for (std::size_t i = 0; i < inputs.size(); ++i){ + set_values(inputs[i]); + call(); + CAPTURE(out); + CAPTURE(actual); + CAPTURE(expected); + CHECK(fabs(actual/expected-1) < 0.01); + } + } + +} +#endif /* CATCH_ENABLED */ + diff --git a/src/Ice.cpp b/src/Ice.cpp new file mode 100644 index 00000000..c93f7b87 --- /dev/null +++ b/src/Ice.cpp @@ -0,0 +1,144 @@ + +#ifndef __powerpc__ +#include +#include +#include +static std::complex t1 ( 0.368017112855051e-1, 0.510878114959572e-1); +static std::complex r1 ( 0.447050716285388e2, 0.656876847463481e2); +static std::complex t2 ( 0.337315741065416, 0.335449415919309); +static std::complex r20 (-0.725974574329220e2, -0.781008427112870e2); +static std::complex r21 (-0.557107698030123e-4, 0.464578634580806e-4); +static std::complex r22 ( 0.234801409215913e-10,-0.285651142904972e-10); +#endif + +#include "Ice.h" + +static double T_t = 273.16, ///< Triple point temperature in K + p_t = 611.657, ///< Triple point pressure in Pa + p_0 = 101325; ///< Ambient pressure in Pa + +// Complex Constants for EOS +static double g00=-0.632020233449497e6; +static double g01= 0.655022213658955; +static double g02=-0.189369929326131e-7; +static double g03= 0.339746123271053e-14; +static double g04=-0.556464869058991e-21; +static double s0= -0.332733756492168e4; + +double IsothermCompress_Ice(double T, double p) +{ + #ifndef __powerpc__ + // Inputs in K, Pa, Output in 1/Pa + return -dg2_dp2_Ice(T,p)/dg_dp_Ice(T,p); + #else + return 1e99; + #endif +} +double psub_Ice(double T) +{ + #ifndef __powerpc__ + double a[]={0,-0.212144006e2,0.273203819e2,-0.610598130e1}; + double b[]={0,0.333333333e-2,0.120666667e1,0.170333333e1}; + double summer=0,theta; + theta=T/T_t; + for (int i=1;i<=3;i++) + { + summer+=a[i]*pow(theta,b[i]); + } + return p_t*exp(1/theta*summer); + #else + return 1e99; + #endif +} + +double g_Ice(double T,double p) +{ + #ifndef __powerpc__ + std::complex r2,term1,term2; + double g0,theta,pi,pi_0; + theta= T/T_t; pi=p/p_t; pi_0=p_0/p_t; + g0=g00*pow(pi-pi_0,0.0)+g01*pow(pi-pi_0,1.0)+g02*pow(pi-pi_0,2.0)+g03*pow(pi-pi_0,3.0)+g04*pow(pi-pi_0,4.0); + r2=r20*pow(pi-pi_0,0.0)+r21*pow(pi-pi_0,1.0)+r22*pow(pi-pi_0,2.0); + // The two terms of the summation + term1=r1*((t1-theta)*log(t1-theta)+(t1+theta)*log(t1+theta)-2.0*t1*log(t1)-theta*theta/t1); + term2=r2*((t2-theta)*log(t2-theta)+(t2+theta)*log(t2+theta)-2.0*t2*log(t2)-theta*theta/t2); + return g0-s0*T_t*theta+T_t*real(term1+term2); + #else + return 1e99; + #endif +} + +double dg_dp_Ice(double T, double p) +{ + #ifndef __powerpc__ + std::complex r2_p; + double g0_p,theta,pi,pi_0; + theta= T/T_t; pi=p/p_t; pi_0=p_0/p_t; + g0_p=g01*1.0/p_t*pow(pi-pi_0,1-1.0)+g02*2.0/p_t*pow(pi-pi_0,2-1.0)+g03*3.0/p_t*pow(pi-pi_0,3-1.0)+g04*4.0/p_t*pow(pi-pi_0,4-1.0); + r2_p=r21*1.0/p_t*pow(pi-pi_0,1-1.0)+r22*2.0/p_t*pow(pi-pi_0,2-1.0); + return g0_p+T_t*real(r2_p*((t2-theta)*log(t2-theta)+(t2+theta)*log(t2+theta)-2.0*t2*log(t2)-theta*theta/t2)); + #else + return 1e99; + #endif +} + +double dg2_dp2_Ice(double T, double p) +{ + #ifndef __powerpc__ + std::complex r2_pp; + double g0_pp,theta,pi,pi_0; + theta= T/T_t; pi=p/p_t; pi_0=p_0/p_t; + g0_pp=g02*2.0*(2.0-1.0)/p_t/p_t*pow(pi-pi_0,2.0-2.0)+g03*3.0*(3.0-1.0)/p_t/p_t*pow(pi-pi_0,3.0-2.0)+g04*4.0*(4.0-1.0)/p_t/p_t*pow(pi-pi_0,4-2.0); + r2_pp=r22*2.0/p_t/p_t; + return g0_pp+T_t*real(r2_pp*((t2-theta)*log(t2-theta)+(t2+theta)*log(t2+theta)-2.0*t2*log(t2)-theta*theta/t2)); + #else + return 1e99; + #endif +} + +double dg_dT_Ice(double T, double p) +{ + #ifndef __powerpc__ + std::complex r2,term1,term2; + double theta,pi,pi_0; + theta= T/T_t; pi=p/p_t; pi_0=p_0/p_t; + r2=r20*pow(pi-pi_0,0.0)+r21*pow(pi-pi_0,1.0)+r22*pow(pi-pi_0,2.0); + // The two terms of the summation + term1=r1*(-log(t1-theta)+log(t1+theta)-2.0*theta/t1); + term2=r2*(-log(t2-theta)+log(t2+theta)-2.0*theta/t2); + return -s0+real(term1+term2); + #else + return 1e99; + #endif +} + +double h_Ice(double T, double p) +{ + #ifndef __powerpc__ + // Returned value is in units of J/kg + return g_Ice(T,p)-T*dg_dT_Ice(T,p); + #else + return 1e99; + #endif +} + +double rho_Ice(double T, double p) +{ + #ifndef __powerpc__ + // Returned value is in units of kg/m3 + return 1/g_Ice(T,p); + #else + return 1e99; + #endif +} + +double s_Ice(double T, double p) +{ + #ifndef __powerpc__ + // Returned value is in units of J/kg/K + return -dg_dT_Ice(T,p); + #else + return 1e99; + #endif +} + diff --git a/src/MatrixMath.cpp b/src/MatrixMath.cpp new file mode 100644 index 00000000..7254865c --- /dev/null +++ b/src/MatrixMath.cpp @@ -0,0 +1,400 @@ + +#include "MatrixMath.h" + +#include "CoolPropTools.h" +#include "Exceptions.h" + +#include +#include +#include +#include +#include + +namespace CoolProp{ + +///* +//Owe a debt of gratitude to http://sole.ooz.ie/en - very clear treatment of GJ +//*/ +//template void swap_rows(std::vector > *A, size_t row1, size_t row2) +//{ +// for (size_t col = 0; col < (*A)[0].size(); col++){ +// std::swap((*A)[row1][col],(*A)[row2][col]); +// } +//} +//template void subtract_row_multiple(std::vector > *A, size_t row, T multiple, size_t pivot_row) +//{ +// for (size_t col = 0; col < (*A)[0].size(); col++){ +// (*A)[row][col] -= multiple*(*A)[pivot_row][col]; +// } +//} +//template void divide_row_by(std::vector > *A, size_t row, T value) +//{ +// for (size_t col = 0; col < (*A)[0].size(); col++){ +// (*A)[row][col] /= value; +// } +//} +// +//template size_t get_pivot_row(std::vector > *A, size_t col) +//{ +// int index = col; +// T max = 0, val; +// +// for (size_t row = col; row < (*A).size(); row++) +// { +// val = (*A)[row][col]; +// if (fabs(val) > max) +// { +// max = fabs(val); +// index = row; +// } +// } +// return index; +//} +// +// +//template std::vector > linsolve_Gauss_Jordan(std::vector > const& A, std::vector > const& B) { +// std::vector > AB; +// std::vector > X; +// size_t pivot_row; +// T pivot_element; +// +// size_t NrowA = num_rows(A); +// size_t NrowB = num_rows(B); +// size_t NcolA = num_cols(A); +// size_t NcolB = num_cols(B); +// +// if (NrowA!=NrowB) throw ValueError(format("You have to provide matrices with the same number of rows: %d is not %d. ",NrowA,NrowB)); +// +// AB.resize(NrowA, std::vector(NcolA+NcolB, 0)); +// X.resize(NrowA, std::vector(NcolB, 0)); +// +// // Build the augmented matrix +// for (size_t row = 0; row < NrowA; row++){ +// for (size_t col = 0; col < NcolA; col++){ +// AB[row][col] = A[row][col]; +// } +// for (size_t col = NcolA; col < NcolA+NcolB; col++){ +// AB[row][col] = B[row][col-NcolA]; +// } +// } +// +// for (size_t col = 0; col < NcolA; col++){ +// // Find the pivot value +// pivot_row = get_pivot_row(&AB, col); +// +// if (fabs(AB[pivot_row][col]) < 10*DBL_EPSILON){ throw ValueError(format("Zero occurred in row %d, the matrix is singular. ",pivot_row));} +// +// if (pivot_row>=col){ +// // Swap pivot row and current row +// swap_rows(&AB, col, pivot_row); +// } +// // Get the pivot element +// pivot_element = AB[col][col]; +// // Divide the pivot row by the pivot element +// divide_row_by(&AB,col,pivot_element); +// +// if (col < NrowA-1) +// { +// // All the rest of the rows, subtract the value of the [r][c] combination +// for (size_t row = col + 1; row < NrowA; row++) +// { +// subtract_row_multiple(&AB,row,AB[row][col],col); +// } +// } +// } +// for (int col = NcolA - 1; col > 0; col--) +// { +// for (int row = col - 1; row >=0; row--) +// { +// subtract_row_multiple(&AB,row,AB[row][col],col); +// } +// } +// // Set the output value +// for (size_t row = 0; row < NrowA; row++){ +// for (size_t col = 0; col < NcolB; col++){ +// X[row][col] = AB[row][NcolA+col]; +// } +// } +// return X; +//} +// +// +////std::vector > linsolve_Gauss_Jordan_reimpl(std::vector > const& A, std::vector > const& B) { +//// std::vector > AB; +//// std::vector > X; +//// size_t pivot_row; +//// double pivot_element; +//// double tmp_element; +//// +//// size_t NrowA = num_rows(A); +//// size_t NrowB = num_rows(B); +//// size_t NcolA = num_cols(A); +//// size_t NcolB = num_cols(B); +//// +//// if (NrowA!=NrowB) throw ValueError(format("You have to provide matrices with the same number of rows: %d is not %d. ",NrowA,NrowB)); +//// +//// AB.resize(NrowA, std::vector(NcolA+NcolB, 0)); +//// X.resize(NrowA, std::vector(NcolB, 0)); +//// +//// // Build the augmented matrix +//// for (size_t row = 0; row < NrowA; row++){ +//// for (size_t col = 0; col < NcolA; col++){ +//// AB[row][col] = A[row][col]; +//// } +//// for (size_t col = NcolA; col < NcolA+NcolB; col++){ +//// AB[row][col] = B[row][col-NcolA]; +//// } +//// } +//// +//// for (size_t col = 0; col < NcolA; col++){ +//// // Find the pivot row +//// pivot_row = 0; +//// pivot_element = 0.0; +//// for (size_t row = col; row < NrowA; row++){ +//// tmp_element = fabs(AB[row][col]); +//// if (tmp_element>pivot_element) { +//// pivot_element = tmp_element; +//// pivot_row = row; +//// } +//// } +//// // Check for errors +//// if (AB[pivot_row][col]<1./_HUGE) throw ValueError(format("Zero occurred in row %d, the matrix is singular. ",pivot_row)); +//// // Swap the rows +//// if (pivot_row>col) { +//// for (size_t colInt = 0; colInt < NcolA; colInt++){ +//// std::swap(AB[pivot_row][colInt],AB[pivot_row][colInt]); +//// } +//// } +//// // Process the entries below current element +//// for (size_t row = col; row < NrowA; row++){ +//// // Entries to the right of current element (until end of A) +//// for (size_t colInt = col+1; colInt < NcolA; colInt++){ +//// // All entries in augmented matrix +//// for (size_t colFull = col; colFull < NcolA+NcolB; colFull++){ +//// AB[colInt][colFull] -= AB[col][colFull] * AB[colInt][col] / AB[col][col]; +//// } +//// AB[colInt][col] = 0.0; +//// } +//// } +//// } +//// return AB; +////} +// +// +// +// +// +// +//template std::vector > linsolve(std::vector > const& A, std::vector > const& B){ +// return linsolve_Gauss_Jordan(A, B); +//} +// +//template std::vector linsolve(std::vector > const& A, std::vector const& b){ +// std::vector > B; +// for (size_t i = 0; i < b.size(); i++){ +// B.push_back(std::vector(1,b[i])); +// } +// B = linsolve(A, B); +// B[0].resize(B.size(),0.0); +// for (size_t i = 1; i < B.size(); i++){ +// B[0][i] = B[i][0]; +// } +// return B[0]; +//} +// +// +///// Some shortcuts and regularly needed operations +//template std::size_t num_rows (std::vector > const& in){ return in.size(); } +//template std::size_t num_cols (std::vector > const& in){ +// if (num_rows(in)>0) { +// if (is_squared(in)) { +// return in[0].size(); +// } else { +// return max_cols(in); +// } +// } else { +// return 0; +// } +//} +//template std::size_t max_cols (std::vector > const& in){ +// std::size_t cols = 0; +// std::size_t col = 0; +// for (std::size_t i = 0; i < in.size(); i++) { +// col = in[i].size(); +// if (cols std::vector get_row(std::vector< std::vector > const& in, size_t row) { return in[row]; } +//template std::vector get_col(std::vector< std::vector > const& in, size_t col) { +// std::size_t sizeX = in.size(); +// if (sizeX<1) throw ValueError(format("You have to provide values, a vector length of %d is not valid. ",sizeX)); +// size_t sizeY = in[0].size(); +// if (sizeY<1) throw ValueError(format("You have to provide values, a vector length of %d is not valid. ",sizeY)); +// std::vector out; +// for (std::size_t i = 0; i < sizeX; i++) { +// sizeY = in[i].size(); +// if (sizeY-1 bool is_squared(std::vector > const& in){ +// std::size_t cols = max_cols(in); +// if (cols!=num_rows(in)) { return false;} +// else { +// for (std::size_t i = 0; i < in.size(); i++) { +// if (cols!=in[i].size()) {return false; } +// } +// } +// return true; +//} +//template std::vector > make_squared(std::vector > const& in){ +// std::size_t cols = max_cols(in); +// std::size_t rows = num_rows(in); +// std::size_t maxVal = 0; +// std::vector > out; +// std::vector tmp; +// +// if (cols>rows) {maxVal = cols; } +// else {maxVal = rows; } +// out.clear(); +// for (std::size_t i = 0; i < in.size(); i++) { +// tmp.clear(); +// for (std::size_t j = 0; j < in[i].size(); j++) { +// tmp.push_back(in[i][j]); +// } +// while (maxVal>tmp.size()) { +// tmp.push_back(0.0); +// } +// out.push_back(tmp); +// } +// // Check rows +// tmp.clear(); +// tmp.resize(maxVal,0.0); +// while (maxVal>out.size()) { +// out.push_back(tmp); +// } +// return out; +//} +// +//template T multiply( std::vector const& a, std::vector const& b){ +// return dot_product(a,b); +// +//} +//template std::vector multiply(std::vector > const& A, std::vector const& b){ +// std::vector > B; +// for (size_t i = 0; i < b.size(); i++){ +// B.push_back(std::vector(1,b[i])); +// } +// B = multiply(A, B); +// B[0].resize(B.size(),0.0); +// for (size_t i = 1; i < B.size(); i++){ +// B[0][i] = B[i][0]; +// } +// return B[0]; +//} +// +//template std::vector > multiply(std::vector > const& A, std::vector > const& B){ +// if (num_cols(A) != num_rows(B)){ +// throw ValueError(format("You have to provide matrices with the same columns and rows: %d is not equal to %d. ",num_cols(A),num_rows(B))); +// } +// size_t rows = num_rows(A); +// size_t cols = num_cols(B); +// T tmp; +// std::vector > outVec; +// std::vector tmpVec; +// outVec.clear(); +// for (size_t i = 0; i < rows; i++){ +// tmpVec.clear(); +// for (size_t j = 0; j < cols; j++){ +// tmp = 0.0; +// for (size_t k = 0; k < num_cols(A); k++){ +// tmp += A[i][k] * B[k][j]; +// } +// tmpVec.push_back(tmp); +// } +// outVec.push_back(tmpVec); +// } +// return outVec; +//} +// +//template T dot_product(std::vector const& a, std::vector const& b){ +// if (a.size()==b.size()){ +// return std::inner_product(a.begin(), a.end(), b.begin(), 0.0); +// } +// throw ValueError(format("You have to provide vectors with the same length: %d is not equal to %d. ",a.size(),b.size())); +//} +// +//template std::vector cross_product(std::vector const& a, std::vector const& b){ +// throw NotImplementedError("The cross product function has not been implemented, yet"); +//} +// +//template std::vector< std::vector > transpose(std::vector > const& in){ +// size_t sizeX = in.size(); +// if (sizeX<1) throw ValueError(format("You have to provide values, a vector length of %d is not a valid. ",sizeX)); +// size_t sizeY = in[0].size(); +// size_t sizeYOld = sizeY; +// if (sizeY<1) throw ValueError(format("You have to provide values, a vector length of %d is not a valid. ",sizeY)); +// std::vector< std::vector > out(sizeY,std::vector(sizeX)); +// for (size_t i = 0; i < sizeX; ++i){ +// sizeY = in[i].size(); +// if (sizeY!=sizeYOld) throw ValueError(format("You have to provide a rectangular matrix: %d is not equal to %d. ",sizeY,sizeYOld)); +// for (size_t j = 0; j < sizeY; ++j){ +// out[j][i] = in[i][j]; +// } +// } +// return out; +//} +// +//template std::vector< std::vector > invert(std::vector > const& in){ +// if (!is_squared(in)) throw ValueError(format("Only square matrices can be inverted: %d is not equal to %d. ",num_rows(in),num_cols(in))); +// std::vector > identity; +// // Build the identity matrix +// size_t dim = num_rows(in); +// identity.resize(dim, std::vector(dim, 0)); +// for (size_t row = 0; row < dim; row++){ +// identity[row][row] = 1.0; +// } +// return linsolve(in,identity); +//} +// +//template std::string vec_to_string( T const& a){ +// std::stringstream out; +// out << format("[ %7.3f ]",a); +// return out.str(); +//} +// +//template std::string vec_to_string( std::vector const& a) { +// return vec_to_string(a,"%7.3g"); +//} +//template std::string vec_to_string( std::vector const& a, const char *fmt) { +// if (a.size()<1) { +// return std::string(""); +// } else { +// std::stringstream out; +// out << format("[ "); +// out << format(fmt,a[0]); +// for (size_t j = 1; j < a.size(); j++) { +// out << ", "; +// out << format(fmt,a[j]); +// } +// out << " ]"; +// return out.str(); +// } +//} +// +//template std::string vec_to_string(std::vector > const& A) { +// return vec_to_string(A, "%7.3g"); +//} +// +//template std::string vec_to_string(std::vector > const& A, const char *fmt) { +// std::stringstream out; +// for (size_t j = 0; j < A.size(); j++) { +// out << vec_to_string(A[j], fmt); +// } +// return out.str(); +//} + + +}; /* namespace CoolProp */ diff --git a/src/PolyMath.cpp b/src/PolyMath.cpp new file mode 100644 index 00000000..5ab75e7c --- /dev/null +++ b/src/PolyMath.cpp @@ -0,0 +1,818 @@ + +#include "PolyMath.h" + +#include "CoolPropTools.h" +#include "Exceptions.h" + +#include +#include +//#include +//#include +#include + +#include "Solvers.h" + +namespace CoolProp{ + +BasePolynomial::BasePolynomial(){ + this->DEBUG = false; +} + +/// Basic checks for coefficient vectors. +/** Starts with only the first coefficient dimension + * and checks the vector length against parameter n. */ +bool BasePolynomial::checkCoefficients(const std::vector &coefficients, unsigned int n){ + if (coefficients.size() == n){ + return true; + } else { + throw ValueError(format("The number of coefficients %d does not match with %d. ",coefficients.size(),n)); + } + return false; +} + +bool BasePolynomial::checkCoefficients(std::vector< std::vector > const& coefficients, unsigned int rows, unsigned int columns){ + if (coefficients.size() == rows){ + bool result = true; + for(unsigned int i=0; i BasePolynomial::integrateCoeffs(std::vector const& coefficients){ + std::vector newCoefficients; + unsigned int sizeX = coefficients.size(); + if (sizeX<1) throw ValueError(format("You have to provide coefficients, a vector length of %d is not a valid. ",sizeX)); + // pushing a zero elevates the order by 1 + newCoefficients.push_back(0.0); + for(unsigned int i=0; i > BasePolynomial::integrateCoeffs(std::vector< std::vector > const& coefficients, bool axis){ + std::vector< std::vector > newCoefficients; + unsigned int sizeX = coefficients.size(); + if (sizeX<1) throw ValueError(format("You have to provide coefficients, a vector length of %d is not a valid. ",sizeX)); + + if (axis==true){ + std::vector< std::vector > tmpCoefficients; + tmpCoefficients = transpose(coefficients); + unsigned int sizeY = tmpCoefficients.size(); + for(unsigned int i=0; i BasePolynomial::deriveCoeffs(std::vector const& coefficients){ + std::vector newCoefficients; + unsigned int sizeX = coefficients.size(); + if (sizeX<1) throw ValueError(format("You have to provide coefficients, a vector length of %d is not a valid. ",sizeX)); + // skipping the first element lowers the order + for(unsigned int i=1; i > BasePolynomial::deriveCoeffs(const std::vector< std::vector > &coefficients, unsigned int axis){ + std::vector< std::vector > newCoefficients; + unsigned int sizeX = coefficients.size(); + if (sizeX<1) throw ValueError(format("You have to provide coefficients, a vector length of %d is not a valid. ",sizeX)); + + if (axis==0){ + std::vector< std::vector > tmpCoefficients; + tmpCoefficients = transpose(coefficients); + unsigned int sizeY = tmpCoefficients.size(); + for(unsigned int i=0; i const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running simplePolynomial(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0.; + for(unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} +long double BasePolynomial::simplePolynomial(std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running simplePolynomial(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0; + for(unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/// Simple integrated polynomial function generator. +/** Base function to produce integrals of n-th order + * polynomials based on the length of the coefficient + * vector. + * Starts with only the first coefficient at T^0 */ +///Indefinite integral in T-direction +long double BasePolynomial::simplePolynomialInt(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running simplePolynomialInt(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0.; + for(unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in y-direction only +long double BasePolynomial::simplePolynomialInt(std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running simplePolynomialInt(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0.; + for(unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/// Simple integrated polynomial function generator divided by independent variable. +/** Base function to produce integrals of n-th order + * polynomials based on the length of the coefficient + * vector. + * Starts with only the first coefficient at T^0 */ +long double BasePolynomial::simpleFracInt(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running simpleFracInt(std::vector, " << T << "): "; + } + long double result = coefficients[0] * log(T); + if (coefficients.size() > 1) { + for (unsigned int i=1; iDEBUG) { + std::cout << result << std::endl; + } + return result; +} + +long double BasePolynomial::simpleFracInt(std::vector< std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running simpleFracInt(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0; + for (unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/** Simple integrated centred(!) polynomial function generator divided by independent variable. + * We need to rewrite some of the functions in order to + * use central fit. Having a central temperature Tbase + * allows for a better fit, but requires a different + * formulation of the fracInt function group. Other + * functions are not affected. + * Starts with only the first coefficient at T^0 */ + +///Helper functions to calculate binomial coefficients: http://rosettacode.org/wiki/Evaluate_binomial_coefficients#C.2B.2B +//long double BasePolynomial::factorial(long double nValue){ +// long double result = nValue; +// long double result_next; +// long double pc = nValue; +// do { +// result_next = result*(pc-1); +// result = result_next; +// pc--; +// } while(pc>2); +// nValue = result; +// return nValue; +//} +//long double BasePolynomial::factorial(long double nValue){ +// if (nValue == 0) return (1); +// else return (nValue * factorial(nValue - 1)); +//} +long double BasePolynomial::factorial(long double nValue){ + long double value = 1; + for(int i = 2; i <= nValue; i++){ + value = value * i; + } + return value; +} + +long double BasePolynomial::binom(long double nValue, long double nValue2){ + long double result; + if(nValue2 == 1) return nValue; + result = (factorial(nValue)) / (factorial(nValue2)*factorial((nValue - nValue2))); + nValue2 = result; + return nValue2; +} + +///Helper functions to calculate the D vector: +std::vector BasePolynomial::fracIntCentralDvector(int m, long double T, long double Tbase){ + std::vector D; + long double tmp; + if (m<1) throw ValueError(format("You have to provide coefficients, a vector length of %d is not a valid. ",m)); + for (int j=0; j const& coefficients, long double T, long double Tbase){ + if (this->DEBUG) { + std::cout << "Running fracIntCentral(std::vector, " << T << ", " << Tbase << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + int m = coefficients.size(); + std::vector D = fracIntCentralDvector(m, T, Tbase); + long double result = 0; + for(int j=0; jDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/// Horner function generator implementations +/** Represent polynomials according to Horner's scheme. + * This avoids unnecessary multiplication and thus + * speeds up calculation. + */ +long double BasePolynomial::baseHorner(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHorner(std::vector, " << T << "): "; + } + long double result = 0; + for(int i=coefficients.size()-1; i>=0; i--) { + result *= T; + result += coefficients[i]; + } + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +long double BasePolynomial::baseHorner(std::vector< std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHorner(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0; + for(int i=coefficients.size()-1; i>=0; i--) { + result *= x; + result += baseHorner(coefficients[i], T); + } + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction +long double BasePolynomial::baseHornerInt(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHornerInt(std::vector, " << T << "): "; + } + long double result = 0; + for(int i=coefficients.size()-1; i>=0; i--) { + result *= T; + result += coefficients[i]/(i+1.); + } + result = result * T; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction only +long double BasePolynomial::baseHornerInt(std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHornerInt(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0; + for(int i=coefficients.size()-1; i>=0; i--) { + result *= x; + result += baseHornerInt(coefficients[i], T); + } + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction of a polynomial divided by its independent variable +long double BasePolynomial::baseHornerFracInt(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHornerFra(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = 0; + if (coefficients.size() > 1) { + for(int i=coefficients.size()-1; i>=1; i--) { + result *= T; + result += coefficients[i]/(i); + } + result *= T; + } + result += coefficients[0] * log(T); + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction of a polynomial divided by its 2nd independent variable +long double BasePolynomial::baseHornerFracInt(std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running baseHornerFra(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + + long double result = 0; + for(int i=coefficients.size()-1; i>=0; i--) { + result *= x; + result += baseHornerFracInt(coefficients[i], T); + } + + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/** Alternatives + * Simple functions that heavily rely on other parts of this file. + * We still need to check which combinations yield the best + * performance. + */ +///Derivative in T-direction +long double BasePolynomial::deriveIn2Steps(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running deriveIn2Steps(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = polyval(deriveCoeffs(coefficients),T); + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Derivative in terms of x(axis=true) or T(axis=false). +long double BasePolynomial::deriveIn2Steps(std::vector< std::vector > const& coefficients, long double x, long double T, bool axis){ + if (this->DEBUG) { + std::cout << "Running deriveIn2Steps(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = polyval(deriveCoeffs(coefficients,axis),x,T); + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction +long double BasePolynomial::integrateIn2Steps(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running integrateIn2Steps(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = polyval(integrateCoeffs(coefficients),T); + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in terms of x(axis=true) or T(axis=false). +long double BasePolynomial::integrateIn2Steps(std::vector< std::vector > const& coefficients, long double x, long double T, bool axis){ + if (this->DEBUG) { + std::cout << "Running integrateIn2Steps(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = polyval(integrateCoeffs(coefficients,axis),x,T); + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction of a polynomial divided by its independent variable +long double BasePolynomial::fracIntIn2Steps(std::vector const& coefficients, long double T){ + if (this->DEBUG) { + std::cout << "Running fracIntIn2Steps(std::vector, " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + long double result = coefficients[0] * log(T); + if (coefficients.size() > 1) { + std::vector newCoeffs(coefficients.begin() + 1, coefficients.end()); + result += polyint(newCoeffs,T); + } + this->DEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction of a polynomial divided by its 2nd independent variable +long double BasePolynomial::fracIntIn2Steps(std::vector > const& coefficients, long double x, long double T){ + if (this->DEBUG) { + std::cout << "Running fracIntIn2Steps(std::vector, " << x << ", " << T << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + std::vector newCoeffs; + for (unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + +///Indefinite integral in T-direction of a centred polynomial divided by its 2nd independent variable +long double BasePolynomial::fracIntCentral2Steps(std::vector > const& coefficients, long double x, long double T, long double Tbase){ + if (this->DEBUG) { + std::cout << "Running fracIntCentral2Steps(std::vector, " << x << ", " << T << ", " << Tbase << "): "; + } + bool db = this->DEBUG; + this->DEBUG = false; + std::vector newCoeffs; + for (unsigned int i=0; iDEBUG = db; + if (this->DEBUG) { + std::cout << result << std::endl; + } + return result; +} + + +/** Here we define the functions that should be used by the + * respective implementations. Please do no use any other + * method since this would break the purpose of this interface. + */ + +/// Evaluates an exponential function for the given coefficients +/// @param coefficients vector containing the ordered coefficients +/// @param T long double value that represents the current input +/// @param n int value that determines the kind of exponential function +long double BasePolynomial::expval(std::vector const& coefficients, long double T, int n){ + long double result = 0.; + if (n==1) { + checkCoefficients(coefficients,3); + result = exp(coefficients[0]/(T+coefficients[1]) - coefficients[2]); + } else if (n==2) { + result = exp(polyval(coefficients, T)); + } else { + throw ValueError(format("There is no function defined for this input (%d). ",n)); + } + return result; +} + +/// Evaluates an exponential function for the given coefficients +/// @param coefficients vector containing the ordered coefficients +/// @param x long double value that represents the current input in the 1st dimension +/// @param T long double value that represents the current input in the 2nd dimension +/// @param n int value that determines the kind of exponential function +long double BasePolynomial::expval(std::vector< std::vector > const& coefficients, long double x, long double T, int n){ + long double result = 0.; + if (n==2) { + result = exp(polyval(coefficients, x, T)); + } else { + throw ValueError(format("There is no function defined for this input (%d). ",n)); + } + return result; +} + + + + + + +/** Here are the real implementations, use these classes if possible. + * It is not the most flexible way, but the classes below include + * the polynomial solvers and should be easy to use. + */ +PolynomialImpl1D::Residual::Residual(PolynomialImpl1D *poly, long double y) { + this->poly=poly; + this->y=y; +} + +virtual double PolynomialImpl1D::Residual::call(double x) { + return poly->eval(x) - y; +} + +virtual double PolynomialImpl1D::Residual::deriv(double x) { + return poly->deriv(x); +} + +virtual double PolynomialImpl1D::ResidualInt::call(double x) { + return poly->integ(x) - y; +} + +virtual double PolynomialImpl1D::ResidualInt::deriv(double x) { + return poly->eval(x); +} + +virtual double PolynomialImpl1D::ResidualDer::call(double x) { + return poly->deriv(x) - y; +} + +virtual double PolynomialImpl1D::ResidualDer::deriv(double x) { + throw CoolProp::NotImplementedError("Second derivatives have not been implemented."); + // TODO: implement call of derivative function + return 0.0; +} + +PolynomialImpl1D::PolynomialImpl1D(const std::vector &coefficients){ + this->coefficients=coefficients; +} + +virtual long double PolynomialImpl1D::eval(long double x){ + return this->polyval(this->coefficients, x); +} + +virtual long double PolynomialImpl1D::integ(long double x){ + return this->polyint(this->coefficients, x); +} + +virtual long double PolynomialImpl1D::deriv(long double x){ + return this->polyder(this->coefficients, x); +} + +virtual long double PolynomialImpl1D::solve(long double y, long double x0){ + Residual resid(this, y); + std::string errstring; + return Newton(resid, x0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl1D::solve(long double y, long double xmin, long double xmax){ + Residual resid(this, y); + std::string errstring; + return Brent(resid,xmin,xmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + +virtual long double PolynomialImpl1D::solveInt(long double y, long double x0){ + ResidualInt resid(this, y); + std::string errstring; + return Newton(resid, x0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl1D::solveInt(long double y, long double xmin, long double xmax){ + ResidualInt resid(this, y); + std::string errstring; + return Brent(resid,xmin,xmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + +virtual long double PolynomialImpl1D::solveDer(long double y, long double x0){ + ResidualDer resid(this, y); + std::string errstring; + return Newton(resid, x0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl1D::solveDer(long double y, long double xmin, long double xmax){ + ResidualDer resid(this, y); + std::string errstring; + return Brent(resid,xmin,xmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + + +PolynomialImpl2D::Residual::Residual(PolynomialImpl2D *poly, long double y, long double x) { + this->poly=poly; + this->y=y; + this->x=x; +} + +virtual double PolynomialImpl2D::Residual::call(double z) { + return poly->eval(x,z) - y; +} + +virtual double PolynomialImpl2D::Residual::deriv(double z) { + return poly->deriv(x,z); +} + +virtual double PolynomialImpl2D::ResidualInt::call(double z) { + return poly->integ(x,z) - y; +} + +virtual double PolynomialImpl2D::ResidualInt::deriv(double z) { + return poly->eval(x,z); +} + +virtual double PolynomialImpl2D::ResidualDer::call(double z) { + return poly->deriv(x,z) - y; +} + +virtual double PolynomialImpl2D::ResidualDer::deriv(double z) { + throw CoolProp::NotImplementedError("Second derivatives have not been implemented."); + // TODO: implement call of derivative function + return 0.0; +} + +PolynomialImpl2D::PolynomialImpl2D(const std::vector< std::vector > &coefficients){ + this->coefficients=coefficients; +} + +virtual long double PolynomialImpl2D::eval(long double x, long double z){ + return this->polyval(this->coefficients, x, z); +} + +virtual long double PolynomialImpl2D::integ(long double x, long double z){ + return this->polyint(this->coefficients, x, z); +} + +virtual long double PolynomialImpl2D::deriv(long double x, long double z){ + return this->polyder(this->coefficients, x, z); +} + +virtual long double PolynomialImpl2D::solve(long double y, long double x, long double z0){ + Residual resid(this, y, x); + std::string errstring; + return Newton(resid, z0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl2D::solve(long double y, long double x, long double zmin, long double zmax){ + Residual resid(this, y, x); + std::string errstring; + return Brent(resid,zmin,zmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + +virtual long double PolynomialImpl2D::solveInt(long double y, long double x, long double z0){ + ResidualInt resid(this, y, x); + std::string errstring; + return Newton(resid, z0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl2D::solveInt(long double y, long double x, long double zmin, long double zmax){ + ResidualInt resid(this, y, x); + std::string errstring; + return Brent(resid,zmin,zmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + +virtual long double PolynomialImpl2D::solveDer(long double y, long double x, long double z0){ + ResidualDer resid(this, y, x); + std::string errstring; + return Newton(resid, z0, DBL_EPSILON*1e3, 100, errstring); +} + +virtual long double PolynomialImpl2D::solveDer(long double y, long double x, long double zmin, long double zmax){ + ResidualDer resid(this, y, x); + std::string errstring; + return Brent(resid,zmin,zmax,DBL_EPSILON, DBL_EPSILON*1e3,100,errstring); +} + + + + + + + + + + + + +} + +//int main() { +// +// SimpleIncompressible* liquid = new DowthermQClass(); +// long double AT = 150.0 + 273.15; +// long double Ap = 3e5; +// liquid->testInputs(AT,Ap); +// +// +// SecCoolSolution* obj = new MethanolSolution(); +// long double x = 0.25; +// long double T = 5.0 + 273.15; +// long double p = 3e5; +// +// obj->testInputs(T+00,p,x); +// obj->testInputs(T+05,p,x); +// obj->testInputs(T+10,p,x); +// obj->testInputs(T+15,p,x); +// +// +//} diff --git a/src/Solvers.cpp b/src/Solvers.cpp new file mode 100644 index 00000000..3e0b71dd --- /dev/null +++ b/src/Solvers.cpp @@ -0,0 +1,336 @@ +#include +#include "Solvers.h" +#include "math.h" +#include "MatrixMath.h" +#include +#include "CoolPropTools.h" + +namespace CoolProp{ + +/** +In this formulation of the Multi-Dimensional Newton-Raphson solver the Jacobian matrix is known. +Therefore, the dx vector can be obtained from + +J(x)dx=-f(x) + +for a given value of x. The pointer to the class FuncWrapperND that is passed in must implement the call() and Jacobian() +functions, each of which take the vector x. The data is managed using std::vector vectors + +@param f A pointer to an subclass of the FuncWrapperND class that implements the call() and Jacobian() functions +@param x0 The initial guess value for the solution +@param tol The root-sum-square of the errors from each of the components +@param maxiter The maximum number of iterations +@param errstring A string with the returned error. If the length of errstring is zero, no errors were found +@returns If no errors are found, the solution. Otherwise, _HUGE, the value for infinity +*/ +std::vector NDNewtonRaphson_Jacobian(FuncWrapperND *f, std::vector x0, double tol, int maxiter, std::string *errstring) +{ + int iter=0; + *errstring=std::string(""); + std::vector f0,v,negative_f0; + std::vector > J; + double error = 999; + while (iter==0 || fabs(error)>tol){ + f0 = f->call(x0); + J = f->Jacobian(x0); + + // Negate f0 + negative_f0 = f0; + for (unsigned int i = 0; imaxiter){ + *errstring=std::string("reached maximum number of iterations"); + x0[0]=_HUGE; + } + iter++; + } + return x0; +} + +/** +In the newton function, a 1-D Newton-Raphson solver is implemented using exact solutions. An initial guess for the solution is provided. + +@param f A pointer to an instance of the FuncWrapper1D class that implements the call() function +@param x0 The inital guess for the solution +@param ftol The absolute value of the tolerance accepted for the objective function +@param maxiter Maximum number of iterations +@param errstring A pointer to the std::string that returns the error from Secant. Length is zero if no errors are found +@returns If no errors are found, the solution, otherwise the value _HUGE, the value for infinity +*/ +double Newton(FuncWrapper1D &f, double x0, double ftol, int maxiter, std::string &errstring) +{ + double x, dx, fval=999; + int iter=1; + errstring.clear(); + x = x0; + while (iter < 2 || fabs(fval) > ftol) + { + fval = f.call(x); + dx = -fval/f.deriv(x); + x += dx; + + if (fabs(dx/x) < 10*DBL_EPSILON) + { + return x; + } + + if (iter>maxiter) + { + errstring= "reached maximum number of iterations"; + throw SolutionError(format("Newton reached maximum number of iterations")); + } + iter=iter+1; + } + return x; +} + +/** +In the secant function, a 1-D Newton-Raphson solver is implemented. An initial guess for the solution is provided. + +@param f A pointer to an instance of the FuncWrapper1D class that implements the call() function +@param x0 The inital guess for the solutionh +@param dx The initial amount that is added to x in order to build the numerical derivative +@param tol The absolute value of the tolerance accepted for the objective function +@param maxiter Maximum number of iterations +@param errstring A pointer to the std::string that returns the error from Secant. Length is zero if no errors are found +@returns If no errors are found, the solution, otherwise the value _HUGE, the value for infinity +*/ +double Secant(FuncWrapper1D &f, double x0, double dx, double tol, int maxiter, std::string &errstring) +{ + double x1=0,x2=0,x3=0,y1=0,y2=0,x,fval=999; + int iter=1; + errstring = ""; + + if (fabs(dx)==0){ errstring="dx cannot be zero"; return _HUGE;} + while (iter<=2 || fabs(fval)>tol) + { + if (iter==1){x1=x0; x=x1;} + if (iter==2){x2=x0+dx; x=x2;} + if (iter>2) {x=x2;} + fval=f.call(x); + if (!ValidNumber(fval)){throw ValueError("Residual function in secant returned invalid number");}; + if (iter==1){y1=fval;} + if (iter>1) + { + double deltax = x2-x1; + if (fabs(deltax)<1e-14) + { + if (fabs(fval) < tol*10) + { + return x; + } + else + { + throw ValueError("Step is small but not solved to tolerance"); + } + } + y2=fval; + x3=x2-y2/(y2-y1)*(x2-x1); + y1=y2; x1=x2; x2=x3; + + } + if (iter>maxiter) + { + errstring=std::string("reached maximum number of iterations"); + throw SolutionError(format("Secant reached maximum number of iterations")); + } + iter=iter+1; + } + return x3; +} + +/** +In the secant function, a 1-D Newton-Raphson solver is implemented. An initial guess for the solution is provided. + +@param f A pointer to an instance of the FuncWrapper1D class that implements the call() function +@param x0 The inital guess for the solution +@param xmax The upper bound for the solution +@param xmin The lower bound for the solution +@param dx The initial amount that is added to x in order to build the numerical derivative +@param tol The absolute value of the tolerance accepted for the objective function +@param maxiter Maximum number of iterations +@param errstring A pointer to the std::string that returns the error from Secant. Length is zero if no errors are found +@returns If no errors are found, the solution, otherwise the value _HUGE, the value for infinity +*/ +double BoundedSecant(FuncWrapper1D &f, double x0, double xmin, double xmax, double dx, double tol, int maxiter, std::string &errstring) +{ + double x1=0,x2=0,x3=0,y1=0,y2=0,x,fval=999; + int iter=1; + errstring = ""; + + if (fabs(dx)==0){ errstring = "dx cannot be zero"; return _HUGE;} + while (iter<=3 || fabs(fval)>tol) + { + if (iter==1){x1=x0; x=x1;} + if (iter==2){x2=x0+dx; x=x2;} + if (iter>2) {x=x2;} + fval=f.call(x); + if (iter==1){y1=fval;} + if (iter>1) + { + y2=fval; + x3=x2-y2/(y2-y1)*(x2-x1); + // Check bounds, go half the way to the limit if limit is exceeded + if (x3 < xmin) + { + x3 = (xmin + x2)/2; + } + if (x3 > xmax) + { + x3 = (xmax + x2)/2; + } + y1=y2; x1=x2; x2=x3; + + } + if (iter>maxiter) + { + errstring = "reached maximum number of iterations"; + throw SolutionError(format("BoundedSecant reached maximum number of iterations")); + } + iter=iter+1; + } + return x3; +} + +/** + +This function implements a 1-D bounded solver using the algorithm from Brent, R. P., Algorithms for Minimization Without Derivatives. +Englewood Cliffs, NJ: Prentice-Hall, 1973. Ch. 3-4. + +a and b must bound the solution of interest and f(a) and f(b) must have opposite signs. If the function is continuous, there must be +at least one solution in the interval [a,b]. + +@param f A pointer to an instance of the FuncWrapper1D class that must implement the class() function +@param a The minimum bound for the solution of f=0 +@param b The maximum bound for the solution of f=0 +@param macheps The machine precision +@param t Tolerance (absolute) +@param maxiter Maximum numer of steps allowed. Will throw a SolutionError if the solution cannot be found +@param errstr A pointer to the error string returned. If length is zero, no errors found. +*/ +double Brent(FuncWrapper1D &f, double a, double b, double macheps, double t, int maxiter, std::string &errstr) +{ + int iter; + errstr.clear(); + double fa,fb,c,fc,m,tol,d,e,p,q,s,r; + fa = f.call(a); + fb = f.call(b); + + // If one of the boundaries is to within tolerance, just stop + if (fabs(fb) < t) { return b;} + if (!ValidNumber(fb)){ + throw ValueError(format("Brent's method f(b) is NAN for b = %g",b).c_str()); + } + if (fabs(fa) < t) { return a;} + if (!ValidNumber(fa)){ + throw ValueError(format("Brent's method f(a) is NAN for a = %g",a).c_str()); + } + if (fa*fb>0){ + throw ValueError(format("Inputs in Brent [%f,%f] do not bracket the root. Function values are [%f,%f]",a,b,fa,fb)); + } + + c=a; + fc=fa; + iter=1; + if (fabs(fc)tol && fb!=0){ + // See if a bisection is forced + if (fabs(e)0){ + q=-q; + } + else{ + p=-p; + } + s=e; + e=d; + m=0.5*(c-b); + if (2*p<3*m*q-fabs(tol*q) || ptol){ + b+=d; + } + else if (m>0){ + b+=tol; + } + else{ + b+=-tol; + } + fb=f.call(b); + if (!ValidNumber(fb)){ + throw ValueError(format("Brent's method f(t) is NAN for t = %g",b).c_str()); + } + if (fb*fc>0){ + // Goto int: from Brent ALGOL code + c=a; + fc=fa; + d=e=b-a; + } + if (fabs(fc)maxiter){ + throw SolutionError(std::string("Brent's method reached maximum number of steps of %d ", maxiter));} + } + return b; +} + +}; /* namespace CoolProp */ diff --git a/src/SpeedTest.cpp b/src/SpeedTest.cpp new file mode 100644 index 00000000..e5022a02 --- /dev/null +++ b/src/SpeedTest.cpp @@ -0,0 +1,37 @@ +#include "SpeedTest.h" +#include "AbstractState.h" +#include "DataStructures.h" + +#include + +namespace CoolProp{ + +void compare_REFPROP_and_CoolProp(std::string fluid, int inputs, double val1, double val2, std::size_t N) +{ + time_t t1,t2; + double dx = 1/((double)N); + + AbstractState *State = AbstractState::factory("HEOS", fluid); + t1 = clock(); + for (std::size_t ii = 0; ii < N; ++ii) + { + State->update(inputs, val1+ii*dx, val2 - ii*dx); + } + t2 = clock(); + delete State; + double elap = ((double)(t2-t1))/CLOCKS_PER_SEC/((double)N)*1e6; + printf("Elapsed time for CoolProp is %g us/call\n",elap); + + State = AbstractState::factory("REFPROP", fluid); + t1 = clock(); + for (std::size_t ii = 0; ii < N; ++ii) + { + State->update(inputs, val1+ii*dx, val2 - ii*dx); + } + t2 = clock(); + delete State; + elap = ((double)(t2-t1))/CLOCKS_PER_SEC/((double)N)*1e6; + printf("Elapsed time for REFPROP is %g us/call\n",elap); +} + +} /* namespace CoolProp */ \ No newline at end of file diff --git a/src/Tests/CoolProp-Tests.cpp b/src/Tests/CoolProp-Tests.cpp new file mode 100644 index 00000000..42da5797 --- /dev/null +++ b/src/Tests/CoolProp-Tests.cpp @@ -0,0 +1,48 @@ + + +// ############################################ +// TESTS +// ############################################ + +#if defined(ENABLE_CATCH) + +#include "../Catch/catch.hpp" + +TEST_CASE("State Class Instantiation","") +{ + SECTION("Bad Fluid") + { + } + SECTION("Pure Fluid") + { + } + SECTION("Pseudo-Pure Fluid") + { + } + SECTION("Mixture") + { + } + SECTION("Brine from Melinder") + { + } + SECTION("Incompressible Liquid") + { + } + SECTION("REFPROP Pure Fluid") + { + } + SECTION("REFPROP Pseudo-Pure Fluid") + { + } + SECTION("REFPROP Mixture") + { + } + SECTION("Component names and fractions not the same length") + { + } + SECTION("Component names and fractions ARE the same length") + { + } +} + +#endif \ No newline at end of file diff --git a/src/Tests/Tests.cpp b/src/Tests/Tests.cpp new file mode 100644 index 00000000..288c3aa8 --- /dev/null +++ b/src/Tests/Tests.cpp @@ -0,0 +1,204 @@ + + + +#include "AbstractState.h" +#include "DataStructures.h" + +#include + +#if defined ENABLE_CATCH + + #include "Tests.h" + + #define CATCH_CONFIG_RUNNER + #include "Catch.hpp" + + static int inputs[] = { + CoolProp::DmolarT_INPUTS, + CoolProp::SmolarT_INPUTS, + CoolProp::HmolarT_INPUTS, + CoolProp::TUmolar_INPUTS, + + CoolProp::DmolarP_INPUTS, + CoolProp::DmolarHmolar_INPUTS, + CoolProp::DmolarSmolar_INPUTS, + CoolProp::DmolarUmolar_INPUTS, + + /* + CoolProp::HmolarP_INPUTS, + CoolProp::PSmolar_INPUTS, + CoolProp::PUmolar_INPUTS, + */ + + /* + CoolProp::HmolarSmolar_INPUTS, + CoolProp::HmolarUmolar_INPUTS, + CoolProp::SmolarUmolar_INPUTS + */ + }; + + class ConsistencyFixture + { + protected: + long double hmolar, pmolar, smolar, umolar, rhomolar, T, p, x1, x2; + CoolProp::AbstractState *pState; + int pair; + public: + ConsistencyFixture(){ + pState = NULL; + } + ~ConsistencyFixture(){ + delete pState; + } + void set_backend(std::string backend, std::string fluid_name){ + pState = CoolProp::AbstractState::factory(backend, fluid_name); + } + void set_pair(int pair){ + this->pair = pair; + } + void set_TP(long double T, long double p) + { + this->T = T; this->p = p; + CoolProp::AbstractState &State = *pState; + + // Start with T,P as inputs, cycle through all the other pairs that are supported + State.update(CoolProp::PT_INPUTS, p, T); + + // Set the other state variables + rhomolar = State.rhomolar(); hmolar = State.hmolar(); smolar = State.smolar(); umolar = State.umolar(); + } + void get_variables() + { + CoolProp::AbstractState &State = *pState; + + switch (pair) + { + /// In this group, T is one of the known inputs, iterate for the other one (easy) + case CoolProp::HmolarT_INPUTS: + x1 = hmolar; x2 = T; break; + case CoolProp::SmolarT_INPUTS: + x1 = smolar; x2 = T; break; + case CoolProp::TUmolar_INPUTS: + x1 = T; x2 = umolar; break; + case CoolProp::DmolarT_INPUTS: + x1 = rhomolar; x2 = T; break; + + /// In this group, D is one of the known inputs, iterate for the other one (a little bit harder) + case CoolProp::DmolarHmolar_INPUTS: + x1 = rhomolar; x2 = hmolar; break; + case CoolProp::DmolarSmolar_INPUTS: + x1 = rhomolar; x2 = smolar; break; + case CoolProp::DmolarUmolar_INPUTS: + x1 = rhomolar; x2 = umolar; break; + case CoolProp::DmolarP_INPUTS: + x1 = rhomolar; x2 = p; break; + + /// In this group, p is one of the known inputs (a little less easy) + case CoolProp::HmolarP_INPUTS: + x1 = hmolar; x2 = p; break; + case CoolProp::PSmolar_INPUTS: + x1 = p; x2 = smolar; break; + case CoolProp::PUmolar_INPUTS: + x1 = p; x2 = umolar; break; + + case CoolProp::HmolarSmolar_INPUTS: + x1 = hmolar; x2 = smolar; break; + case CoolProp::SmolarUmolar_INPUTS: + x1 = smolar; x2 = umolar; break; + } + } + void single_phase_consistency_check() + { + CoolProp::AbstractState &State = *pState; + State.update(pair, x1, x2); + + // Make sure we end up back at the same temperature and pressure we started out with + if(fabs(T-State.T()) > 1e-2) throw CoolProp::ValueError(format("Error on T [%g K] is greater than 1e-2",fabs(State.T()-T))); + if(fabs(p-State.p())/p*100 > 1e-2) throw CoolProp::ValueError(format("Error on p [%g %%] is greater than 1e-2 %%",fabs(p-State.p())/p )); + } + }; + + TEST_CASE_METHOD(ConsistencyFixture, "Test all input pairs for CO2 using all valid backends", "[]") + { + CHECK_NOTHROW(set_backend("HEOS", "CO2")); + + int inputsN = sizeof(inputs)/sizeof(inputs[0]); + for (double p = 600000; p < 800000000.0; p *= 5) + { + for (double T = 220; T < pState->Tmax(); T += 5) + { + CHECK_NOTHROW(set_TP(T, p)); + + for (int i = 0; i < inputsN; ++i) + { + int pair = inputs[i]; + std::string pair_desc = CoolProp::get_input_pair_short_desc(pair); + set_pair(pair); + CAPTURE(pair_desc); + CAPTURE(T); + CAPTURE(p); + get_variables(); + CAPTURE(x1); + CAPTURE(x2); + CHECK_NOTHROW(single_phase_consistency_check()); + } + } + } + } + + static Catch::Session session; // There must be exactly one instance + + int run_fast_tests() + { + Catch::ConfigData &config = session.configData(); + config.testsOrTags.clear(); + config.testsOrTags.push_back("[fast]"); + session.useConfigData(config); + return session.run(); + } + + int run_not_slow_tests() + { + Catch::ConfigData &config = session.configData(); + config.testsOrTags.clear(); + config.testsOrTags.push_back("~[slow]"); + session.useConfigData(config); + + time_t t1, t2; + t1 = clock(); + session.run(); + t2 = clock(); + printf("Elapsed time for not slow tests: %g s",(double)(t2-t1)/CLOCKS_PER_SEC); + + return 1; + } + + int run_user_defined_tests(const std::vector & tests_or_tags) + { + Catch::ConfigData &config = session.configData(); + config.testsOrTags.clear(); + for (unsigned int i = 0; i < tests_or_tags.size(); i++) + { + config.testsOrTags.push_back(tests_or_tags[i]); + } + session.useConfigData(config); + + time_t t1, t2; + t1 = clock(); + session.run(); + t2 = clock(); + printf("Elapsed time for user defined tests: %g s",(double)(t2-t1)/CLOCKS_PER_SEC); + + return 1; + } + + void run_tests() + { + Catch::ConfigData &config = session.configData(); + config.testsOrTags.clear(); + //config.shouldDebugBreak = true; + session.useConfigData(config); + session.run(); + } + +#endif \ No newline at end of file diff --git a/src/l10n/english.h b/src/l10n/english.h new file mode 100644 index 00000000..fdaf19fe --- /dev/null +++ b/src/l10n/english.h @@ -0,0 +1,19 @@ +/* + * english.h + * + * Created on: 21 Dec 2013 + * Author: jowr + */ + +#ifndef ENGLISH_H_ +#define ENGLISH_H_ + +namespace CoolProp { + +const std::string ERR_NOT_A_TWO_PHASE_FLUID("This is not a two-phase fluid. Please select another fluid or avoid two-phase functions."); +const std::string ERR_NOT_A_TWO_PHASE_STATE("This is not a two-phase state, update state with a two-phase set of inputs"); +const std::string ERR_NOT_COMPRESSIBLE("This function is invalid for incompressible fluids."); +const std::string ERR_NOT_A_TWO_PHASE_FUNCTION("This function is invalid in the two-phase region."); + +} /* namespace CoolProp */ +#endif /* ENGLISH_H_ */ diff --git a/src/main.cxx b/src/main.cxx new file mode 100644 index 00000000..cbde1ad0 --- /dev/null +++ b/src/main.cxx @@ -0,0 +1,399 @@ + +//#include + +#include "Backends/REFPROPMixtureBackend.h" +#include "Backends/REFPROPBackend.h" +#include +#include "AbstractState.h" +#include "DataStructures.h" +#include +#include "CoolProp.h" +using namespace CoolProp; + +#include "rapidjson/rapidjson_include.h" +#include "Fluids\FluidLibrary.h" +#include "Tests.h" +#include "CoolPropDLL.h" +#include "SpeedTest.h" + +void generate_melting_curve_data(const char* file_name, const char *fluid_name, double Tmin, double Tmax) +{ + + FILE *fp; + fp = fopen(file_name,"w"); + AbstractState *State = AbstractState::factory(std::string("REFPROP"),std::string(fluid_name)); + for (double T = Tmin; T < Tmax; T += 0.1) + { + try{ + double pp = State->calc_melt_p_T(T); + State->update(PT_INPUTS,pp,T); + double rho = State->rhomolar(); + State->update(DmolarT_INPUTS,rho,T); + double pp2 = State->p(); + if (fabs(pp2-pp) > 0.01) + { + double rr = 0; + } + //printf("%g,%g,%g\n",T,pp,rho); + fprintf(fp, "%g,%g,%g\n",T,pp,rho); + } + catch(std::exception &e) + { + + std::cout << fluid_name << " " << e.what() << std::endl; + break; + } + } + fclose(fp); + delete State; +} +int main() +{ + if (0) + { + generate_melting_curve_data("Ethylene-I.mlt","ethylene",103.989,110.369); + generate_melting_curve_data("Ethylene-II.mlt","ethylene",110.369,450); + generate_melting_curve_data("Propylene-I.mlt","propylen",87.953,109.6); + generate_melting_curve_data("Propylene-II.mlt","propylen",109.6,575); + generate_melting_curve_data("ParaHydrogen-I.mlt","parahyd",13.8033,22); + generate_melting_curve_data("ParaHydrogen-II.mlt","parahyd",22,2000); + + generate_melting_curve_data("n-Propane.mlt","propane",85.53,2000); + generate_melting_curve_data("n-Butane.mlt","butane",134.9,2000); + generate_melting_curve_data("n-Pentane.mlt","pentane",143.5,2000); + generate_melting_curve_data("IsoButane.mlt","isobutan",113.73,2000); + generate_melting_curve_data("Isopentane.mlt","ipentane",112.66,2000); + generate_melting_curve_data("Argon.mlt","argon",83.8058,2000); + generate_melting_curve_data("Ethane.mlt","ethane",90.37,2000); + generate_melting_curve_data("Nitrogen.mlt","nitrogen",63.151,2000); + generate_melting_curve_data("Fluorine.mlt","fluorine",53.4811,2000); + generate_melting_curve_data("Methane.mlt","methane",90.70,2000); + generate_melting_curve_data("Methanol.mlt","methanol",175.61,2000); + generate_melting_curve_data("Krypton.mlt","krypton",115.775,2000); + generate_melting_curve_data("Xenon.mlt","xenon",161.405,2000); + generate_melting_curve_data("CarbonMonoxide.mlt","co",68.16,2000); + generate_melting_curve_data("Oxygen.mlt","oxygen",54.361,2000); + generate_melting_curve_data("CycloHexane.mlt","cyclohex",279.7,2000); + generate_melting_curve_data("CarbonDioxide.mlt","CO2",217,2000); + } + if (1) + { + CoolProp::compare_REFPROP_and_CoolProp("Water",QT_INPUTS,1,350,100000); + } + if (0) + { + std::vector ss = strsplit(get_global_param_string("FluidsList"),','); + + for (std::vector::iterator it = ss.begin(); it != ss.end(); ++it) + { + AbstractState *S = AbstractState::factory("HEOS", (*it)); + S->update(QT_INPUTS, 0, S->Ttriple()); + std::cout << format("%s %17.15g\n", S->name(), S->p()); + } + } + if (1) + { + + + std::vector tags; + tags.push_back("[RP1485]"); + run_user_defined_tests(tags); + //run_tests(); + std::string fl = get_global_param_string("FluidsList"); + double rr = PropsSI("D", "P", 3e5, "T", 300, "Nitrogen"); + AbstractState *AS = AbstractState::factory("HEOS","Nitrogen"); + + AS->update(DmolarT_INPUTS, 40, 300); + double p1 = AS->umolar(); + double d1 = AS->rhomolar(); + double T1 = AS->delta(); + double dpdT_constrho = AS->first_partial_deriv(iUmolar, iDelta, iTau); + AS->update(DmolarT_INPUTS, 40+1e-6, 300); + double p2 = AS->umolar(); + double d2 = AS->rhomolar(); + double T2 = AS->delta(); + + double dpdT_constrho2 = (p2-p1)/(T2-T1); + + AS->update(PT_INPUTS, 101000, 300); + + std::vector T(2,300), P(2,101325), o, z(1,1); + std::string in1 = "Dmass", in2 = "T", in3 = "P", Ref = "Nitrogen"; + T[1] = 400; + o = PropsSI(in1,in2,T,in3,P,Ref,z); + double tr = 0; + } + if (1) + { + // First type (slowest, most string processing, exposed in DLL) + double r0A = PropsSI("Dmolar","T",298,"P",1e5,"Propane[0.5]&Ethane[0.5]"); // Default backend is HEOS + double r0B = PropsSI("Dmolar","T",298,"P",1e5,"HEOS::Propane[0.5]&Ethane[0.5]"); + double r0C = PropsSI("Dmolar","T",298,"P",1e5,"REFPROP::Propane[0.5]&Ethane[0.5]"); + + std::vector z(2,0.5); + // Second type (C++ only, a bit faster) + double r1A = PropsSI("Dmolar","T",298,"P",1e5,"Propane&Ethane", z); + double r1B = PropsSI("Dmolar","T",298,"P",1e5,"HEOS::Propane&Ethane", z); + double r1C = PropsSI("Dmolar","T",298,"P",1e5,"REFPROP::Propane&Ethane", z); + + const double *pz = &(z[0]); + int n = z.size(); + // Third type (DLL) + double r2A = PropsSIZ("Dmolar","T",298,"P",1e5,"Propane&Ethane", pz, n); + double r2B = PropsSIZ("Dmolar","T",298,"P",1e5,"HEOS::Propane&Ethane", pz, n); + double r2C = PropsSIZ("Dmolar","T",298,"P",1e5,"REFPROP::Propane&Ethane", pz, n); + + double tt = 0; + } + + if (0) + { + //AbstractState *propane = AbstractState::factory("HEOS","CO2"); + //propane->update(DmolarP_INPUTS,203.69, 600000); + //double d1 = propane->rhomolar(); + //AbstractState *propaneRP = AbstractState::factory("REFPROP","propane"); + //propaneRP->update(QT_INPUTS,1,85.525); + //double d2 = propaneRP->rhomolar(); + //double rr = (d2/d1-1)*100; + //delete(propane); delete(propaneRP); + run_tests(); + } + if (0) + { + struct element + { + double d,t,ld; + int l; + }; + double n[] = {0.0125335479355233, 7.8957634722828, -8.7803203303561, 0.31802509345418, -0.26145533859358, -0.0078199751687981, 0.0088089493102134, -0.66856572307965, 0.20433810950965, -6.621260503968699e-005, -0.19232721156002, -0.25709043003438, 0.16074868486251, -0.040092828925807, 3.9343422603254e-007, -7.5941377088144e-006, 0.00056250979351888, -1.5608652257135e-005, 1.1537996422951e-009, 3.6582165144204e-007, -1.3251180074668e-012, -6.2639586912454e-010, -0.10793600908932, 0.017611491008752, 0.22132295167546, -0.40247669763528, 0.58083399985759, 0.0049969146990806, -0.031358700712549, -0.74315929710341, 0.4780732991548, 0.020527940895948, -0.13636435110343, 0.014180634400617, 0.008332650488071301, -0.029052336009585, 0.038615085574206, -0.020393486513704, -0.0016554050063734, 0.0019955571979541, 0.00015870308324157, -1.638856834253e-005, 0.043613615723811, 0.034994005463765, -0.076788197844621, 0.022446277332006, -6.2689710414685e-005, -5.5711118565645e-010, -0.19905718354408, 0.31777497330738, -0.11841182425981 }; + double d[] = {1, 1, 1, 2, 2, 3, 4, 1, 1, 1, 2, 2, 3, 4, 4, 5, 7, 9, 10, 11, 13, 15, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 7, 9, 9, 9, 9, 9, 10, 10, 12, 3, 4, 4, 5, 14, 3, 6, 6, 6 }; + double t[] = {-0.5, 0.875, 1, 0.5, 0.75, 0.375, 1, 4, 6, 12, 1, 5, 4, 2, 13, 9, 3, 4, 11, 4, 13, 1, 7, 1, 9, 10, 10, 3, 7, 10, 10, 6, 10, 10, 1, 2, 3, 4, 8, 6, 9, 8, 16, 22, 23, 23, 10, 50, 44, 46, 50 }; + double l[] = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 6, 6, 6, 6 }; + double summer = 0; + std::vector elements; + for (std::size_t i = 0; i < 51; ++i) + { + element el; + el.d = d[i]; + el.t = t[i]; + el.l = (int)l[i]; + el.ld = (double)l[i]; + elements.push_back(el); + } + + long N = 1000000; + double t1 = clock(); + for (std::size_t ii = 0; ii < N; ++ii) + { + double delta = 1.3, tau = 0.7; + double log_tau = log(tau), log_delta = log(delta); + for (int jj = 0; jj < 51; ++jj) + { + double di = d[jj], ti = t[jj], lid = l[jj]; + int li = (int)lid; + double pow_delta_li; + if (li > 0){ + pow_delta_li = pow(delta, li); + summer += (di-lid*pow_delta_li)*exp(ti*log_tau+(di-1)*log_delta-pow_delta_li); + } + else{ + summer += di*exp(ti*log_tau+(di-1)*log_delta); + } + } + } + double t2 = clock(); + double elap = (t2-t1)/CLOCKS_PER_SEC/((double)N)*1e6; + printf("%g %g\n",elap, summer); + + } + if (0) + { + AbstractState *MixRP = AbstractState::factory(std::string("REFPROP"),std::string("propane")); + MixRP->update(QT_INPUTS, 0, 330); + long double s1 = MixRP->surface_tension(); + + AbstractState *Mix = AbstractState::factory(std::string("HEOS"), std::string("propane")); + Mix->update(QT_INPUTS, 0, 330); + long double s2 = Mix->surface_tension(); + delete Mix; delete MixRP; + } + if (0) + { + + double T = 300; + + AbstractState *MixRP = AbstractState::factory(std::string("REFPROP"), std::string("propane")); + { + long N = 100000; + double t1 = clock(), summer = 0; + for (std::size_t ii = 0; ii < N; ++ii) + { + MixRP->update(QT_INPUTS, 0.0, T+10/((double)N)*ii); + summer += MixRP->p(); + } + double t2 = clock(); + double elap = (t2-t1)/CLOCKS_PER_SEC/((double)N)*1e6; + printf("%g %g\n",elap, summer); + } + double p2 = MixRP->p(); + double cv2 = MixRP->cvmolar(); + double cp2 = MixRP->cpmolar(); + double T2 = MixRP->T(); + + AbstractState *Mix = AbstractState::factory(std::string("CORE"),std::string("n-Propane")); + { + long N = 100000; + double t1 = clock(), summer = 0; + for (std::size_t ii = 0; ii < N; ++ii) + { + Mix->update(QT_INPUTS, 0.0, T+10/((double)N)*ii); + summer += Mix->p(); + } + double t2 = clock(); + double elap = (t2-t1)/CLOCKS_PER_SEC/((double)N)*1e6; + printf("%g %g\n",elap, summer); + } + double p1 = Mix->p(); + double cv1 = Mix->cvmolar(); + double cp1 = Mix->cpmolar(); + double T1 = Mix->T(); + + delete Mix; delete MixRP; + double rr = 0; + } + if (1) + { + int N = 2; + std::vector z(N, 1.0/N); + double Q = 1, T = 250, p = 300000; + + int inputs = PQ_INPUTS; double val1 = p, val2 = Q; + + AbstractState *MixRP = AbstractState::factory(std::string("REFPROP"), std::string("Ethane,propane")); + MixRP->set_mole_fractions(z); + MixRP->update(inputs, val1, val2); + double p2 = MixRP->p(); + double rho2 = MixRP->rhomolar(); + double cv2 = MixRP->cvmolar(); + double cp2 = MixRP->cpmolar(); + double w2 = MixRP->speed_sound(); + double h2 = MixRP->hmolar(); + double s2 = MixRP->smolar(); + double phi20 = MixRP->fugacity_coefficient(0); + double phi21 = MixRP->fugacity_coefficient(1); + + AbstractState *Mix = AbstractState::factory(std::string("CORE"), std::string("Ethane,n-Propane")); + Mix->set_mole_fractions(z); + Mix->update(inputs, val1, val2); + double p1 = Mix->p(); + double cv1 = Mix->cvmolar(); + double cp1 = Mix->cpmolar(); + double w1 = Mix->speed_sound(); + double h1 = Mix->hmolar(); + double s1 = Mix->smolar(); + double phi10 = Mix->fugacity_coefficient(0); + double phi11 = Mix->fugacity_coefficient(1); + + delete Mix; delete MixRP; + double rr = 0; + } + if (0) + { + int N = 2; + std::vector z(N, 1.0/N); + double Q = 0, T = 250, p = 300000; + + AbstractState *Mix = AbstractState::factory(std::string("CORE"),std::string("Ethane,n-Propane")); + Mix->set_mole_fractions(z); + + for (double T = 210; ;T += 0.1) + { + Mix->update(QT_INPUTS, Q, T); + std::cout << format(" %g %g\n",Mix->p(),Mix->T()); + } + delete(Mix); + } + if(0) + { + time_t t1,t2; + + std::size_t N = 1000000; + AbstractState *State = AbstractState::factory(std::string("CORE"), std::string("Water")); + double p = State->p(); + double summer = 0; + t1 = clock(); + for (std::size_t ii = 0; ii < N; ++ii) + { + //AbstractState *State = new REFPROPBackend("Methane"); + //summer += EOS->dalphar_dDelta(0.7,1.3); + /*for (int i = 0; i < 50; i++) + { + summer += exp(1.3+1e-10*ii+1e-10*i); + } + summer += log(0.7-1e-10*ii);*/ + //summer += log(1.3); + State->update(PT_INPUTS,101325,300); + summer += State->p(); + } + t2 = clock(); + delete State; + double elap = ((double)(t2-t1))/CLOCKS_PER_SEC/((double)N)*1e6; + printf("%g %g\n",elap, summer/((double)N)); + double eee = 0; + return 0; + + } + + + + if (0) + { + AbstractState *State = AbstractState::factory(std::string("REFPROP"), std::string("Methane|Ethane")); + std::vector x(2,0.5); + State->set_mole_fractions(x); + State->update(DmassT_INPUTS,1,250); + double hh = State->hmolar(); + double mu = State->viscosity(); + double sigma = State->surface_tension(); + delete State; + } + if (0) + { + time_t t1,t2; + t1 = clock(); + long N = 100000; + for (long ii = 0; ii < N; ii++) + { + AbstractState *State = AbstractState::factory(std::string("REFPROP"), std::string("Methane")); + //AbstractState *State = new REFPROPBackend("Methane"); + delete State; + } + t2 = clock(); + double elap = ((double)(t2-t1))/CLOCKS_PER_SEC/((double)N)*1e6; + printf("%g\n",elap); + } + + if(0) + { + AbstractState *State = AbstractState::factory(std::string("REFPROP"), std::string("Methane")); + State->update(DmassT_INPUTS,1,300); + double hh = State->hmolar(); + double mu = State->viscosity(); + + time_t t1,t2; + t1 = clock(); + for (long ii = 0; ii < 1000000; ii++) + { + State->update(PQ_INPUTS,300000,1-ii*1e-6); + //State->update(DmassT_INPUTS,1-ii*1e-10,180); + //double hh1 = State->hmolar(); + //double mu2 = State->viscosity(); + } + t2 = clock(); + double elap = ((double)(t2-t1))/CLOCKS_PER_SEC; + printf("%g\n",elap); + + //double sigma = State->surface_tension(); + delete State; + } +} \ No newline at end of file diff --git a/version.txt b/version.txt new file mode 100644 index 00000000..d9678f93 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +5.0.0dev \ No newline at end of file diff --git a/wrappers/C#/BuildCsharpDLL.bat b/wrappers/C#/BuildCsharpDLL.bat new file mode 100644 index 00000000..2f4d308f --- /dev/null +++ b/wrappers/C#/BuildCsharpDLL.bat @@ -0,0 +1,24 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +erase *_wrap.cpp + +swig.exe -csharp -dllimport "CoolProp" -c++ -I../../include -outcurrentdir ../../src/CoolProp.i +cl /c /I../../include /EHsc CoolProp_wrap.cxx + +REM ******* compile all the sources *************** +cl /c /MP3 /O2 /I../../include /EHsc /DNDEBUG /DCOOLPROP_LIB ../../src/*.cpp +cl /c /MP3 /O2 /I../../include /EHsc /DNDEBUG /DCOOLPROP_LIB ../../src/Backends/*.cpp +cl /c /MP3 /O2 /I../../include /EHsc /DNDEBUG /DCOOLPROP_LIB ../../src/Fluids/*.cpp +cl /c /MP3 /O2 /I../../include /EHsc /DNDEBUG /DCOOLPROP_LIB ../../src/Tests/*.cpp + +link /DLL CoolProp_wrap.obj *.obj /OUT:CoolProp.dll +dumpbin /EXPORTS CoolProp.dll > exports.txt +erase *.obj +erase CoolProp_wrap.cxx +erase CoolProp.lib +erase CoolProp.exp + +rem **** Make a zip file using 7-zip *** +7z a -r Csharp.7z *.cs CoolProp.dll \ No newline at end of file diff --git a/wrappers/C#/Example.cs b/wrappers/C#/Example.cs new file mode 100644 index 00000000..bb3345e5 --- /dev/null +++ b/wrappers/C#/Example.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ConsoleApplication1 +{ + class Program + { + static void Main(string[] args) + { + AbstractState State = AbstractState.factory("HEOS","Water"); + State.update((int)input_pairs.PT_INPUTS, 1e5, 300); + double hmol = State.hmolar(); + Console.Write("Hmol: " + hmol + " J/kg" + "\n"); + + double T, h, p, D; + //Console.Write("CoolProp version: " + CoolProp.get_global_param_string("version") + "\n"); + //Console.Write("CoolProp gitrevision: " + CoolProp.get_global_param_string("gitrevision") + "\n"); + //Console.Write("CoolProp fluids: " + CoolProp.get_global_param_string("FluidsList") + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ USING EOS *************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("FLUID STATE INDEPENDENT INPUTS" + "\n"); + //Console.Write("Critical Density Propane: " + CoolProp.Props1SI("Propane", "rhocrit") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + Console.Write("Density of saturated liquid Propane at 101325 Pa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 101325 Pa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 1, "R290") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "Propane") + " kg/m^3" + "\n"); + Console.Write("Density of saturated vapor R290 at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 1, "R290") + " kg/m^3" + "\n"); + Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + p = CoolProp.PropsSI("P", "T", 300, "D", 1, "Propane"); + h = CoolProp.PropsSI("H", "T", 300, "D", 1, "Propane"); + Console.Write("T,D -> P,H " + 300 + "," + 1 + " --> " + p + "," + h + "\n"); + T = CoolProp.PropsSI("T", "P", p, "H", h, "Propane"); + D = CoolProp.PropsSI("D", "P", p, "H", h, "Propane"); + Console.Write("P,H -> T,D " + p + "," + h + " --> " + T + "," + D + "\n"); + + //~ Console.Write(" " + "\n"); + //~ Console.Write("************ USING TTSE ***************" + "\n"); + //~ Console.Write(" " + "\n"); + //~ //CoolProp.enable_TTSE_LUT("Propane"); + //~ Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + //~ Console.Write("Density of saturated liquid Propane at 101325 Pa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "Propane") + " kg/m^3" + "\n"); + //~ Console.Write("Density of saturated vapor R290 at 101325 Pa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 1, "R290") + " kg/m^3" + "\n"); + //~ Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + //~ Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "Propane") + " kg/m^3" + "\n"); + //~ Console.Write("Density of saturated vapor R290 at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 1, "R290") + " kg/m^3" + "\n"); + //~ Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + //~ p = CoolProp.PropsSI("P", "T", 300, "D", 1, "Propane"); + //~ h = CoolProp.PropsSI("H", "T", 300, "D", 1, "Propane"); + //~ Console.Write("T,D -> P,H " + 300 + ","+ 1+ " --> " + p + "," + h + "\n"); + //~ T = CoolProp.PropsSI("T", "P", p, "H", h, "Propane"); + //~ D = CoolProp.PropsSI("D", "P", p, "H", h, "Propane"); + //~ Console.Write("P,H -> T,D " + p + "," + h + " --> " + T + "," + D + "\n"); + //CoolProp.disable_TTSE_LUT("Propane"); + + try + { + Console.Write(" " + "\n"); + Console.Write("************ USING REFPROP ***************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("TWO PHASE INPUTS (Pressure)" + "\n"); + Console.Write("Density of saturated liquid Propane at 101325 Pa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "REFPROP::Propane") + " kg/m^3" + "\n"); + Console.Write("TWO PHASE INPUTS (Temperature)" + "\n"); + Console.Write("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "REFPROP::Propane") + " kg/m^3" + "\n"); + Console.Write("SINGLE PHASE CYCLE (propane)" + "\n"); + p = CoolProp.PropsSI("P","T",300,"D",1,"REFPROP::Propane"); + h = CoolProp.PropsSI("H","T",300,"D",1,"REFPROP::Propane"); + Console.Write("T,D -> P,H " + 300 + "," + 1 + " --> " + p + "," + h + "\n"); + T = CoolProp.PropsSI("T","P",p,"H",h,"REFPROP::Propane"); + D = CoolProp.PropsSI("D","P",p,"H",h,"REFPROP::Propane"); + Console.Write("P,H -> T,D " + p + "," + h + " --> " + T + "," + D + "\n"); + } + catch + { + Console.Write(" " + "\n"); + Console.Write("************ CANT USE REFPROP ************" + "\n"); + Console.Write(" " + "\n"); + } + + Console.Write(" " + "\n"); + Console.Write("************ BRINES AND SECONDARY WORKING FLUIDS *************" + "\n"); + Console.Write(" " + "\n"); + Console.Write("Density of 50% (mass) ethylene glycol/water at 300 K, 101325 Pa: " + CoolProp.PropsSI("D", "T", 300, "P", 101325, "EG-50%") + " kg/m^3" + "\n"); + Console.Write("Viscosity of Therminol D12 at 350 K, 101325 kPa: " + CoolProp.PropsSI("V", "T", 350, "P", 101325, "INCOMP::TD12") + " Pa-s" + "\n"); + + Console.Write(" " + "\n"); + Console.Write("************ HUMID AIR PROPERTIES *************" + "\n"); + Console.Write(" " + "\n"); + //Console.Write("Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: " + CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5) + " kg_w/kg_da" + "\n"); + //Console.Write("Relative humidity from last calculation: " + CoolProp.HAProps("R", "T", 300, "P", 101.325, "W", CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5)) + "(fractional)" + "\n"); + + //Console.Write("Enter to quit"); + //Console.ReadLine(); + } + } +} diff --git a/wrappers/C#/README.txt b/wrappers/C#/README.txt new file mode 100644 index 00000000..b30697f8 --- /dev/null +++ b/wrappers/C#/README.txt @@ -0,0 +1,28 @@ +Ian Bell, Ph.D. (ian.h.bell@gmail.com) +November 2013 + +Info +---- +These are the files needed for Csharp applications on Windows. A similar build process should be used for +non-Windows application though no knowledge is available for non-Windows applications + +To Use +------ + +Copy all the .cs files to a location you want. You will need to have a copy of some version of C#. + +At the command prompt, run:: + + call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + csc *.cs /platform:x86 + call Example + +where you might need to update the path to visual studio depending on your version installed. The `/platform:x86` is important to ensure that it uses 32-bit calling conventions to avoid PINVOKE errors! + +Alternatively, you can add all the .cs files to a visual studio project. + +Build +----- +The build batch file BuildCsharpDLL.bat should be run to generate the C# files. This requires SWIG! + +Make sure you keep it in "x86" rather than "Any CPU" architecture so that it uses 32-bit calling conventions. Otherwise you will get PINVOKE errors!!! diff --git a/wrappers/C#/VSCsharp/CoolProp.NET.csproj b/wrappers/C#/VSCsharp/CoolProp.NET.csproj new file mode 100644 index 00000000..7acc2b1e --- /dev/null +++ b/wrappers/C#/VSCsharp/CoolProp.NET.csproj @@ -0,0 +1,140 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21} + Exe + Properties + ConsoleApplication1 + CoolProp.NET + v3.5 + 512 + false + ConsoleApplication1.Program + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + prompt + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + false + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + Always + + + + + \ No newline at end of file diff --git a/wrappers/C#/VSCsharp/CoolProp.NET.sln b/wrappers/C#/VSCsharp/CoolProp.NET.sln new file mode 100644 index 00000000..7e780d7a --- /dev/null +++ b/wrappers/C#/VSCsharp/CoolProp.NET.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C# Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoolProp.NET", "CoolProp.NET.csproj", "{DA2EAA1B-8AED-423F-A86C-CF492C21EA21}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Debug|x86.ActiveCfg = Debug|x86 + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Debug|x86.Build.0 = Debug|x86 + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Release|Any CPU.Build.0 = Release|Any CPU + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Release|x86.ActiveCfg = Release|x86 + {DA2EAA1B-8AED-423F-A86C-CF492C21EA21}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/wrappers/C#/VSCsharp/CoolProp.NET.suo b/wrappers/C#/VSCsharp/CoolProp.NET.suo new file mode 100644 index 00000000..eafae62d Binary files /dev/null and b/wrappers/C#/VSCsharp/CoolProp.NET.suo differ diff --git a/wrappers/C#/VSCsharp/CoolProp.cs b/wrappers/C#/VSCsharp/CoolProp.cs new file mode 100644 index 00000000..2ada1c0f --- /dev/null +++ b/wrappers/C#/VSCsharp/CoolProp.cs @@ -0,0 +1,260 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class CoolProp { + public static string get_global_param_string(string ParamName) { + string ret = CoolPropPINVOKE.get_global_param_string(ParamName); + if (CoolPropPINVOKE.SWIGPendingException.Pending) throw CoolPropPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string get_fluid_param_string(string FluidName, string ParamName) { + string ret = CoolPropPINVOKE.get_fluid_param_string(FluidName, ParamName); + if (CoolPropPINVOKE.SWIGPendingException.Pending) throw CoolPropPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static double PropsS(string Output, string Name1, double Prop1, string Name2, double Prop2, string Ref) { + double ret = CoolPropPINVOKE.PropsS(Output, Name1, Prop1, Name2, Prop2, Ref); + return ret; + } + + public static double Props(string Output, char Name1, double Prop1, char Name2, double Prop2, string Ref) { + double ret = CoolPropPINVOKE.Props(Output, Name1, Prop1, Name2, Prop2, Ref); + return ret; + } + + public static double Props1(string Ref, string Output) { + double ret = CoolPropPINVOKE.Props1(Ref, Output); + return ret; + } + + public static double IProps(int iOutput, int iName1, double Prop1, int iName2, double Prop2, int iFluid) { + double ret = CoolPropPINVOKE.IProps(iOutput, iName1, Prop1, iName2, Prop2, iFluid); + return ret; + } + + public static int IsFluidType(string Ref, string Type) { + int ret = CoolPropPINVOKE.IsFluidType(Ref, Type); + return ret; + } + + public static double DerivTerms(string Term, double T, double rho, string Ref) { + double ret = CoolPropPINVOKE.DerivTerms(Term, T, rho, Ref); + return ret; + } + + public static int Phase(string Fluid, double T, double p, string Phase_str) { + int ret = CoolPropPINVOKE.Phase(Fluid, T, p, Phase_str); + return ret; + } + + public static int Phase_Trho(string Fluid, double T, double p, string Phase_str) { + int ret = CoolPropPINVOKE.Phase_Trho(Fluid, T, p, Phase_str); + return ret; + } + + public static int Phase_Tp(string Fluid, double T, double rho, string Phase_str) { + int ret = CoolPropPINVOKE.Phase_Tp(Fluid, T, rho, Phase_str); + return ret; + } + + public static void set_phase(string Phase_str) { + CoolPropPINVOKE.set_phase(Phase_str); + } + + public static double F2K(double T_F) { + double ret = CoolPropPINVOKE.F2K(T_F); + return ret; + } + + public static double K2F(double T) { + double ret = CoolPropPINVOKE.K2F(T); + return ret; + } + + public static int get_param_index(string param) { + int ret = CoolPropPINVOKE.get_param_index(param); + return ret; + } + + public static int get_Fluid_index(string param) { + int ret = CoolPropPINVOKE.get_Fluid_index(param); + return ret; + } + + public static int get_index_units(int param, string units) { + int ret = CoolPropPINVOKE.get_index_units(param, units); + return ret; + } + + public static double rhosatL_anc(string Fluid, double T) { + double ret = CoolPropPINVOKE.rhosatL_anc(Fluid, T); + return ret; + } + + public static double rhosatV_anc(string Fluid, double T) { + double ret = CoolPropPINVOKE.rhosatV_anc(Fluid, T); + return ret; + } + + public static double psatL_anc(string Fluid, double T) { + double ret = CoolPropPINVOKE.psatL_anc(Fluid, T); + return ret; + } + + public static double psatV_anc(string Fluid, double T) { + double ret = CoolPropPINVOKE.psatV_anc(Fluid, T); + return ret; + } + + public static bool enable_TTSE_LUT(string FluidName) { + bool ret = CoolPropPINVOKE.enable_TTSE_LUT(FluidName); + return ret; + } + + public static bool isenabled_TTSE_LUT(string FluidName) { + bool ret = CoolPropPINVOKE.isenabled_TTSE_LUT(FluidName); + return ret; + } + + public static bool disable_TTSE_LUT(string FluidName) { + bool ret = CoolPropPINVOKE.disable_TTSE_LUT(FluidName); + return ret; + } + + public static bool enable_TTSE_LUT_writing(string FluidName) { + bool ret = CoolPropPINVOKE.enable_TTSE_LUT_writing(FluidName); + return ret; + } + + public static bool isenabled_TTSE_LUT_writing(string FluidName) { + bool ret = CoolPropPINVOKE.isenabled_TTSE_LUT_writing(FluidName); + return ret; + } + + public static bool disable_TTSE_LUT_writing(string FluidName) { + bool ret = CoolPropPINVOKE.disable_TTSE_LUT_writing(FluidName); + return ret; + } + + public static bool set_TTSESat_LUT_size(string FluidName, int arg1) { + bool ret = CoolPropPINVOKE.set_TTSESat_LUT_size(FluidName, arg1); + return ret; + } + + public static bool set_TTSESinglePhase_LUT_size(string FluidName, int Np, int Nh) { + bool ret = CoolPropPINVOKE.set_TTSESinglePhase_LUT_size(FluidName, Np, Nh); + return ret; + } + + public static bool set_TTSESinglePhase_LUT_range(string FluidName, double hmin, double hmax, double pmin, double pmax) { + bool ret = CoolPropPINVOKE.set_TTSESinglePhase_LUT_range(FluidName, hmin, hmax, pmin, pmax); + return ret; + } + + public static bool get_TTSESinglePhase_LUT_range(string FluidName, SWIGTYPE_p_double hmin, SWIGTYPE_p_double hmax, SWIGTYPE_p_double pmin, SWIGTYPE_p_double pmax) { + bool ret = CoolPropPINVOKE.get_TTSESinglePhase_LUT_range(FluidName, SWIGTYPE_p_double.getCPtr(hmin), SWIGTYPE_p_double.getCPtr(hmax), SWIGTYPE_p_double.getCPtr(pmin), SWIGTYPE_p_double.getCPtr(pmax)); + return ret; + } + + public static int set_TTSE_mode(string FluidName, string Value) { + int ret = CoolPropPINVOKE.set_TTSE_mode(FluidName, Value); + return ret; + } + + public static int set_reference_stateS(string Ref, string reference_state) { + int ret = CoolPropPINVOKE.set_reference_stateS(Ref, reference_state); + return ret; + } + + public static int set_reference_stateD(string Ref, double T, double rho, double h0, double s0) { + int ret = CoolPropPINVOKE.set_reference_stateD(Ref, T, rho, h0, s0); + return ret; + } + + public static int get_standard_unit_system() { + int ret = CoolPropPINVOKE.get_standard_unit_system(); + return ret; + } + + public static void set_standard_unit_system(int val) { + CoolPropPINVOKE.set_standard_unit_system(val); + } + + public static double viscosity_dilute(string FluidName, double T) { + double ret = CoolPropPINVOKE.viscosity_dilute(FluidName, T); + return ret; + } + + public static double viscosity_residual(string FluidName, double T, double rho) { + double ret = CoolPropPINVOKE.viscosity_residual(FluidName, T, rho); + return ret; + } + + public static double conductivity_critical(string FluidName, double T, double rho) { + double ret = CoolPropPINVOKE.conductivity_critical(FluidName, T, rho); + return ret; + } + + public static double conductivity_background(string FluidName, double T, double rho) { + double ret = CoolPropPINVOKE.conductivity_background(FluidName, T, rho); + return ret; + } + + public static double conformal_Trho(string FluidName, string ReferenceFluidName, double T, double rho, SWIGTYPE_p_double Tconform, SWIGTYPE_p_double rhoconform) { + double ret = CoolPropPINVOKE.conformal_Trho(FluidName, ReferenceFluidName, T, rho, SWIGTYPE_p_double.getCPtr(Tconform), SWIGTYPE_p_double.getCPtr(rhoconform)); + return ret; + } + + public static double HAProps(string OutputName, string Input1Name, double Input1, string Input2Name, double Input2, string Input3Name, double Input3) { + double ret = CoolPropPINVOKE.HAProps(OutputName, Input1Name, Input1, Input2Name, Input2, Input3Name, Input3); + return ret; + } + + public static double HAProps_Aux(string OutputName, double T, double p, double W, string units) { + double ret = CoolPropPINVOKE.HAProps_Aux(OutputName, T, p, W, units); + return ret; + } + + public static double IceProps(string Name, double T, double p) { + double ret = CoolPropPINVOKE.IceProps(Name, T, p); + return ret; + } + + public static void UseVirialCorrelations(int flag) { + CoolPropPINVOKE.UseVirialCorrelations(flag); + } + + public static void UseIsothermCompressCorrelation(int flag) { + CoolPropPINVOKE.UseIsothermCompressCorrelation(flag); + } + + public static void UseIdealGasEnthalpyCorrelations(int flag) { + CoolPropPINVOKE.UseIdealGasEnthalpyCorrelations(flag); + } + + public static void HAHelp() { + CoolPropPINVOKE.HAHelp(); + } + + public static int returnHumAirCode(string Code) { + int ret = CoolPropPINVOKE.returnHumAirCode(Code); + return ret; + } + + public static double cair_sat(double T) { + double ret = CoolPropPINVOKE.cair_sat(T); + return ret; + } + +} diff --git a/wrappers/C#/VSCsharp/CoolPropPINVOKE.cs b/wrappers/C#/VSCsharp/CoolPropPINVOKE.cs new file mode 100644 index 00000000..77555382 --- /dev/null +++ b/wrappers/C#/VSCsharp/CoolPropPINVOKE.cs @@ -0,0 +1,340 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +class CoolPropPINVOKE { + + protected class SWIGExceptionHelper { + + public delegate void ExceptionDelegate(string message); + public delegate void ExceptionArgumentDelegate(string message, string paramName); + + static ExceptionDelegate applicationDelegate = new ExceptionDelegate(SetPendingApplicationException); + static ExceptionDelegate arithmeticDelegate = new ExceptionDelegate(SetPendingArithmeticException); + static ExceptionDelegate divideByZeroDelegate = new ExceptionDelegate(SetPendingDivideByZeroException); + static ExceptionDelegate indexOutOfRangeDelegate = new ExceptionDelegate(SetPendingIndexOutOfRangeException); + static ExceptionDelegate invalidCastDelegate = new ExceptionDelegate(SetPendingInvalidCastException); + static ExceptionDelegate invalidOperationDelegate = new ExceptionDelegate(SetPendingInvalidOperationException); + static ExceptionDelegate ioDelegate = new ExceptionDelegate(SetPendingIOException); + static ExceptionDelegate nullReferenceDelegate = new ExceptionDelegate(SetPendingNullReferenceException); + static ExceptionDelegate outOfMemoryDelegate = new ExceptionDelegate(SetPendingOutOfMemoryException); + static ExceptionDelegate overflowDelegate = new ExceptionDelegate(SetPendingOverflowException); + static ExceptionDelegate systemDelegate = new ExceptionDelegate(SetPendingSystemException); + + static ExceptionArgumentDelegate argumentDelegate = new ExceptionArgumentDelegate(SetPendingArgumentException); + static ExceptionArgumentDelegate argumentNullDelegate = new ExceptionArgumentDelegate(SetPendingArgumentNullException); + static ExceptionArgumentDelegate argumentOutOfRangeDelegate = new ExceptionArgumentDelegate(SetPendingArgumentOutOfRangeException); + + [DllImport("CoolProp", EntryPoint="SWIGRegisterExceptionCallbacks_CoolProp")] + public static extern void SWIGRegisterExceptionCallbacks_CoolProp( + ExceptionDelegate applicationDelegate, + ExceptionDelegate arithmeticDelegate, + ExceptionDelegate divideByZeroDelegate, + ExceptionDelegate indexOutOfRangeDelegate, + ExceptionDelegate invalidCastDelegate, + ExceptionDelegate invalidOperationDelegate, + ExceptionDelegate ioDelegate, + ExceptionDelegate nullReferenceDelegate, + ExceptionDelegate outOfMemoryDelegate, + ExceptionDelegate overflowDelegate, + ExceptionDelegate systemExceptionDelegate); + + [DllImport("CoolProp", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_CoolProp")] + public static extern void SWIGRegisterExceptionCallbacksArgument_CoolProp( + ExceptionArgumentDelegate argumentDelegate, + ExceptionArgumentDelegate argumentNullDelegate, + ExceptionArgumentDelegate argumentOutOfRangeDelegate); + + static void SetPendingApplicationException(string message) { + SWIGPendingException.Set(new System.ApplicationException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingArithmeticException(string message) { + SWIGPendingException.Set(new System.ArithmeticException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingDivideByZeroException(string message) { + SWIGPendingException.Set(new System.DivideByZeroException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingIndexOutOfRangeException(string message) { + SWIGPendingException.Set(new System.IndexOutOfRangeException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingInvalidCastException(string message) { + SWIGPendingException.Set(new System.InvalidCastException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingInvalidOperationException(string message) { + SWIGPendingException.Set(new System.InvalidOperationException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingIOException(string message) { + SWIGPendingException.Set(new System.IO.IOException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingNullReferenceException(string message) { + SWIGPendingException.Set(new System.NullReferenceException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingOutOfMemoryException(string message) { + SWIGPendingException.Set(new System.OutOfMemoryException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingOverflowException(string message) { + SWIGPendingException.Set(new System.OverflowException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingSystemException(string message) { + SWIGPendingException.Set(new System.SystemException(message, SWIGPendingException.Retrieve())); + } + + static void SetPendingArgumentException(string message, string paramName) { + SWIGPendingException.Set(new System.ArgumentException(message, paramName, SWIGPendingException.Retrieve())); + } + static void SetPendingArgumentNullException(string message, string paramName) { + Exception e = SWIGPendingException.Retrieve(); + if (e != null) message = message + " Inner Exception: " + e.Message; + SWIGPendingException.Set(new System.ArgumentNullException(paramName, message)); + } + static void SetPendingArgumentOutOfRangeException(string message, string paramName) { + Exception e = SWIGPendingException.Retrieve(); + if (e != null) message = message + " Inner Exception: " + e.Message; + SWIGPendingException.Set(new System.ArgumentOutOfRangeException(paramName, message)); + } + + static SWIGExceptionHelper() { + SWIGRegisterExceptionCallbacks_CoolProp( + applicationDelegate, + arithmeticDelegate, + divideByZeroDelegate, + indexOutOfRangeDelegate, + invalidCastDelegate, + invalidOperationDelegate, + ioDelegate, + nullReferenceDelegate, + outOfMemoryDelegate, + overflowDelegate, + systemDelegate); + + SWIGRegisterExceptionCallbacksArgument_CoolProp( + argumentDelegate, + argumentNullDelegate, + argumentOutOfRangeDelegate); + } + } + + protected static SWIGExceptionHelper swigExceptionHelper = new SWIGExceptionHelper(); + + public class SWIGPendingException { + [ThreadStatic] + private static Exception pendingException = null; + private static int numExceptionsPending = 0; + + public static bool Pending { + get { + bool pending = false; + if (numExceptionsPending > 0) + if (pendingException != null) + pending = true; + return pending; + } + } + + public static void Set(Exception e) { + if (pendingException != null) + throw new ApplicationException("FATAL: An earlier pending exception from unmanaged code was missed and thus not thrown (" + pendingException.ToString() + ")", e); + pendingException = e; + lock(typeof(CoolPropPINVOKE)) { + numExceptionsPending++; + } + } + + public static Exception Retrieve() { + Exception e = null; + if (numExceptionsPending > 0) { + if (pendingException != null) { + e = pendingException; + pendingException = null; + lock(typeof(CoolPropPINVOKE)) { + numExceptionsPending--; + } + } + } + return e; + } + } + + + protected class SWIGStringHelper { + + public delegate string SWIGStringDelegate(string message); + static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString); + + [DllImport("CoolProp", EntryPoint="SWIGRegisterStringCallback_CoolProp")] + public static extern void SWIGRegisterStringCallback_CoolProp(SWIGStringDelegate stringDelegate); + + static string CreateString(string cString) { + return cString; + } + + static SWIGStringHelper() { + SWIGRegisterStringCallback_CoolProp(stringDelegate); + } + } + + static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); + + + static CoolPropPINVOKE() { + } + + + [DllImport("CoolProp", EntryPoint="CSharp_get_global_param_string")] + public static extern string get_global_param_string(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_get_fluid_param_string")] + public static extern string get_fluid_param_string(string jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_PropsS")] + public static extern double PropsS(string jarg1, string jarg2, double jarg3, string jarg4, double jarg5, string jarg6); + + [DllImport("CoolProp", EntryPoint="CSharp_Props")] + public static extern double Props(string jarg1, char jarg2, double jarg3, char jarg4, double jarg5, string jarg6); + + [DllImport("CoolProp", EntryPoint="CSharp_Props1")] + public static extern double Props1(string jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_IProps")] + public static extern double IProps(int jarg1, int jarg2, double jarg3, int jarg4, double jarg5, int jarg6); + + [DllImport("CoolProp", EntryPoint="CSharp_IsFluidType")] + public static extern int IsFluidType(string jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_DerivTerms")] + public static extern double DerivTerms(string jarg1, double jarg2, double jarg3, string jarg4); + + [DllImport("CoolProp", EntryPoint="CSharp_Phase")] + public static extern int Phase(string jarg1, double jarg2, double jarg3, string jarg4); + + [DllImport("CoolProp", EntryPoint="CSharp_Phase_Trho")] + public static extern int Phase_Trho(string jarg1, double jarg2, double jarg3, string jarg4); + + [DllImport("CoolProp", EntryPoint="CSharp_Phase_Tp")] + public static extern int Phase_Tp(string jarg1, double jarg2, double jarg3, string jarg4); + + [DllImport("CoolProp", EntryPoint="CSharp_set_phase")] + public static extern void set_phase(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_F2K")] + public static extern double F2K(double jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_K2F")] + public static extern double K2F(double jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_get_param_index")] + public static extern int get_param_index(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_get_Fluid_index")] + public static extern int get_Fluid_index(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_get_index_units")] + public static extern int get_index_units(int jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_rhosatL_anc")] + public static extern double rhosatL_anc(string jarg1, double jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_rhosatV_anc")] + public static extern double rhosatV_anc(string jarg1, double jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_psatL_anc")] + public static extern double psatL_anc(string jarg1, double jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_psatV_anc")] + public static extern double psatV_anc(string jarg1, double jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_enable_TTSE_LUT")] + public static extern bool enable_TTSE_LUT(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_isenabled_TTSE_LUT")] + public static extern bool isenabled_TTSE_LUT(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_disable_TTSE_LUT")] + public static extern bool disable_TTSE_LUT(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_enable_TTSE_LUT_writing")] + public static extern bool enable_TTSE_LUT_writing(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_isenabled_TTSE_LUT_writing")] + public static extern bool isenabled_TTSE_LUT_writing(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_disable_TTSE_LUT_writing")] + public static extern bool disable_TTSE_LUT_writing(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_set_TTSESat_LUT_size")] + public static extern bool set_TTSESat_LUT_size(string jarg1, int jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_set_TTSESinglePhase_LUT_size")] + public static extern bool set_TTSESinglePhase_LUT_size(string jarg1, int jarg2, int jarg3); + + [DllImport("CoolProp", EntryPoint="CSharp_set_TTSESinglePhase_LUT_range")] + public static extern bool set_TTSESinglePhase_LUT_range(string jarg1, double jarg2, double jarg3, double jarg4, double jarg5); + + [DllImport("CoolProp", EntryPoint="CSharp_get_TTSESinglePhase_LUT_range")] + public static extern bool get_TTSESinglePhase_LUT_range(string jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4, HandleRef jarg5); + + [DllImport("CoolProp", EntryPoint="CSharp_set_TTSE_mode")] + public static extern int set_TTSE_mode(string jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_set_reference_stateS")] + public static extern int set_reference_stateS(string jarg1, string jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_set_reference_stateD")] + public static extern int set_reference_stateD(string jarg1, double jarg2, double jarg3, double jarg4, double jarg5); + + [DllImport("CoolProp", EntryPoint="CSharp_get_standard_unit_system")] + public static extern int get_standard_unit_system(); + + [DllImport("CoolProp", EntryPoint="CSharp_set_standard_unit_system")] + public static extern void set_standard_unit_system(int jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_viscosity_dilute")] + public static extern double viscosity_dilute(string jarg1, double jarg2); + + [DllImport("CoolProp", EntryPoint="CSharp_viscosity_residual")] + public static extern double viscosity_residual(string jarg1, double jarg2, double jarg3); + + [DllImport("CoolProp", EntryPoint="CSharp_conductivity_critical")] + public static extern double conductivity_critical(string jarg1, double jarg2, double jarg3); + + [DllImport("CoolProp", EntryPoint="CSharp_conductivity_background")] + public static extern double conductivity_background(string jarg1, double jarg2, double jarg3); + + [DllImport("CoolProp", EntryPoint="CSharp_conformal_Trho")] + public static extern double conformal_Trho(string jarg1, string jarg2, double jarg3, double jarg4, HandleRef jarg5, HandleRef jarg6); + + [DllImport("CoolProp", EntryPoint="CSharp_HAProps")] + public static extern double HAProps(string jarg1, string jarg2, double jarg3, string jarg4, double jarg5, string jarg6, double jarg7); + + [DllImport("CoolProp", EntryPoint="CSharp_HAProps_Aux")] + public static extern double HAProps_Aux(string jarg1, double jarg2, double jarg3, double jarg4, string jarg5); + + [DllImport("CoolProp", EntryPoint="CSharp_IceProps")] + public static extern double IceProps(string jarg1, double jarg2, double jarg3); + + [DllImport("CoolProp", EntryPoint="CSharp_UseVirialCorrelations")] + public static extern void UseVirialCorrelations(int jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_UseIsothermCompressCorrelation")] + public static extern void UseIsothermCompressCorrelation(int jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_UseIdealGasEnthalpyCorrelations")] + public static extern void UseIdealGasEnthalpyCorrelations(int jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_HAHelp")] + public static extern void HAHelp(); + + [DllImport("CoolProp", EntryPoint="CSharp_returnHumAirCode")] + public static extern int returnHumAirCode(string jarg1); + + [DllImport("CoolProp", EntryPoint="CSharp_cair_sat")] + public static extern double cair_sat(double jarg1); +} diff --git a/wrappers/C#/VSCsharp/Program.cs b/wrappers/C#/VSCsharp/Program.cs new file mode 100644 index 00000000..9ddd3bca --- /dev/null +++ b/wrappers/C#/VSCsharp/Program.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ConsoleApplication1 +{ + class Program + { + static void Main(string[] args) + { + double T, rho, h; + T = CoolProp.Props1("R410A","Tcrit"); + + Console.Write("The critical temperature of R410A is: " + T + " K\n"); + + rho = CoolProp.Props("D",'T',298.15,'P',101.325,"Air"); + Console.Write("Density of air at STP is "+rho+" kg/m3\n"); + + h = CoolProp.Props("D",'T',275,'Q',1.0,"R290"); + Console.Write("The saturated vapor enthalpy of Propane at 275 K is: "+h+" kJ/kg\n"); + + Console.Write("Enter to quit"); + Console.ReadLine(); + } + } +} diff --git a/wrappers/C#/VSCsharp/SWIGTYPE_p_Fluid.cs b/wrappers/C#/VSCsharp/SWIGTYPE_p_Fluid.cs new file mode 100644 index 00000000..7f65a714 --- /dev/null +++ b/wrappers/C#/VSCsharp/SWIGTYPE_p_Fluid.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_Fluid { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_Fluid(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_Fluid() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_Fluid obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/wrappers/C#/VSCsharp/SWIGTYPE_p_double.cs b/wrappers/C#/VSCsharp/SWIGTYPE_p_double.cs new file mode 100644 index 00000000..c3c3309d --- /dev/null +++ b/wrappers/C#/VSCsharp/SWIGTYPE_p_double.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_double { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_double(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_double() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_double obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/wrappers/C#/VSCsharp/SWIGTYPE_p_int.cs b/wrappers/C#/VSCsharp/SWIGTYPE_p_int.cs new file mode 100644 index 00000000..e34ce85c --- /dev/null +++ b/wrappers/C#/VSCsharp/SWIGTYPE_p_int.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_int { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_int(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_int() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_int obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/wrappers/C#/VSCsharp/_params.cs b/wrappers/C#/VSCsharp/_params.cs new file mode 100644 index 00000000..75a5760c --- /dev/null +++ b/wrappers/C#/VSCsharp/_params.cs @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum _params { + iB, + iT, + iP, + iD, + iC, + iC0, + iO, + iU, + iH, + iS, + iA, + iG, + iQ, + iV, + iL, + iI, + iMM, + iTcrit, + iTtriple, + iTreduce, + iPtriple, + iPcrit, + iRhocrit, + iRhoreduce, + iAccentric, + iDpdT, + iDrhodT_p, + iTmin, + iDipole, + iPhase, + iPHASE_LIQUID, + iPHASE_GAS, + iPHASE_SUPERCRITICAL, + iPHASE_TWOPHASE, + iODP, + iGWP20, + iGWP100, + iGWP500, + iCritSplineT, + iHcrit, + iScrit +} diff --git a/wrappers/C#/VSCsharp/phases.cs b/wrappers/C#/VSCsharp/phases.cs new file mode 100644 index 00000000..e90237f7 --- /dev/null +++ b/wrappers/C#/VSCsharp/phases.cs @@ -0,0 +1,15 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum phases { + iLiquid, + iSupercritical, + iGas, + iTwoPhase +} diff --git a/wrappers/C#/VSCsharp/unit_constants.cs b/wrappers/C#/VSCsharp/unit_constants.cs new file mode 100644 index 00000000..f960a607 --- /dev/null +++ b/wrappers/C#/VSCsharp/unit_constants.cs @@ -0,0 +1,16 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum unit_constants { + UNIT_KPA, + UNIT_PA, + UNIT_BAR, + UNIT_KG_M3, + UNIT_KG_L +} diff --git a/wrappers/C#/VSCsharp/unit_systems.cs b/wrappers/C#/VSCsharp/unit_systems.cs new file mode 100644 index 00000000..4fb7df43 --- /dev/null +++ b/wrappers/C#/VSCsharp/unit_systems.cs @@ -0,0 +1,15 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.8 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum unit_systems { + UNIT_SYSTEM_SI, + UNIT_SYSTEM_KSI, + UNIT_SYSTEM_KSI_MOLAR, + UNIT_SYSTEM_SI_MOLAR +} diff --git a/wrappers/C#/build.json b/wrappers/C#/build.json new file mode 100644 index 00000000..e4286fa3 --- /dev/null +++ b/wrappers/C#/build.json @@ -0,0 +1,26 @@ +[ +{ +"pre" : "swig -csharp -dllimport \"CoolProp\" -c++ -outdir Csharp -o Csharp/CoolProp_wrap.cxx -I../../include ../../src/CoolProp.i", +"sources" : ["Csharp/CoolProp_wrap.cxx"], +"platform" : ["Windows"], +"compiler" : "VS+", +"bitness" : 32, +"c_flags" : "/MP3 /O2 /EHsc /I../../include", +"link_type" : "DLL", +"link_fname" : "CoolProp.dll", +"link_flags" : "", +"post" : "" +}, +{ +"pre" : "swig -csharp -dllimport \"CoolProp\" -c++ -outdir Csharp -o Csharp/CoolProp_wrap.cxx -I../../include ../../src/CoolProp.i", +"sources" : ["Csharp/CoolProp_wrap.cxx"], +"platform" : ["Windows"], +"compiler" : "VS+", +"bitness" : 64, +"c_flags" : "/MP3 /O2 /EHsc /I../../include", +"link_type" : "DLL", +"link_fname" : "CoolProp.dll", +"link_flags" : "", +"post" : "" +} +] \ No newline at end of file diff --git a/wrappers/C#/exports.txt b/wrappers/C#/exports.txt new file mode 100644 index 00000000..4900fec7 --- /dev/null +++ b/wrappers/C#/exports.txt @@ -0,0 +1,162 @@ +Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 536F9ABF time date stamp Sun May 11 17:43:59 2014 + 0.00 version + 1 ordinal base + 136 number of functions + 136 number of names + + ordinal hint RVA name + + 1 0 00005DA0 _CSharp_AbstractState_Q@4 + 2 1 00005AD0 _CSharp_AbstractState_T@4 + 3 2 000058F0 _CSharp_AbstractState_Tmax@4 + 4 3 00006DA0 _CSharp_AbstractState_alpha0@4 + 5 4 00007460 _CSharp_AbstractState_alphar@4 + 6 5 00004B40 _CSharp_AbstractState_calc_melt_T_p@8 + 7 6 000049E0 _CSharp_AbstractState_calc_melt_p_T@8 + 8 7 00004CA0 _CSharp_AbstractState_calc_melt_rho_T@8 + 9 8 000050E0 _CSharp_AbstractState_clear@4 + 10 9 00006BC0 _CSharp_AbstractState_conductivity@4 + 11 A 00006520 _CSharp_AbstractState_cpmolar@4 + 12 B 00006610 _CSharp_AbstractState_cvmolar@4 + 13 C 00007100 _CSharp_AbstractState_d2alpha0_dDelta2@4 + 14 D 00007220 _CSharp_AbstractState_d2alpha0_dDelta_dTau@4 + 15 E 00007340 _CSharp_AbstractState_d2alpha0_dTau2@4 + 16 F 000077C0 _CSharp_AbstractState_d2alphar_dDelta2@4 + 17 10 000078E0 _CSharp_AbstractState_d2alphar_dDelta_dTau@4 + 18 11 00007A00 _CSharp_AbstractState_d2alphar_dTau2@4 + 19 12 00006EC0 _CSharp_AbstractState_dalpha0_dDelta@4 + 20 13 00006FE0 _CSharp_AbstractState_dalpha0_dTau@4 + 21 14 00007580 _CSharp_AbstractState_dalphar_dDelta@4 + 22 15 000076A0 _CSharp_AbstractState_dalphar_dTau@4 + 23 16 00005F80 _CSharp_AbstractState_delta@4 + 24 17 00004EF0 _CSharp_AbstractState_factory@8 + 25 18 000057B0 _CSharp_AbstractState_first_partial_deriv@16 + 26 19 000069D0 _CSharp_AbstractState_fugacity_coefficient@8 + 27 1A 00006160 _CSharp_AbstractState_gas_constant@4 + 28 1B 000055B0 _CSharp_AbstractState_get_reducing@4 + 29 1C 00006250 _CSharp_AbstractState_hmolar@4 + 30 1D 000068E0 _CSharp_AbstractState_isobaric_expansion_coefficient@4 + 31 1E 000067F0 _CSharp_AbstractState_isothermal_compressibility@4 + 32 1F 000056B0 _CSharp_AbstractState_keyed_output@8 + 33 20 00006070 _CSharp_AbstractState_molar_mass@4 + 34 21 00005CB0 _CSharp_AbstractState_p@4 + 35 22 000059E0 _CSharp_AbstractState_pmax@4 + 36 23 00005BC0 _CSharp_AbstractState_rhomolar@4 + 37 24 000053C0 _CSharp_AbstractState_set_mass_fractions@8 + 38 25 000052D0 _CSharp_AbstractState_set_mole_fractions@8 + 39 26 00006340 _CSharp_AbstractState_smolar@4 + 40 27 00006700 _CSharp_AbstractState_speed_sound@4 + 41 28 00006CB0 _CSharp_AbstractState_surface_tension@4 + 42 29 00005E90 _CSharp_AbstractState_tau@4 + 43 2A 00006430 _CSharp_AbstractState_umolar@4 + 44 2B 000051E0 _CSharp_AbstractState_update@24 + 45 2C 000054B0 _CSharp_AbstractState_using_mole_fractions@4 + 46 2D 00006AD0 _CSharp_AbstractState_viscosity@4 + 47 2E 00007BB0 _CSharp_CoolProp_SimpleState_T_get@4 + 48 2F 00007B80 _CSharp_CoolProp_SimpleState_T_set@12 + 49 30 00007C70 _CSharp_CoolProp_SimpleState_hmolar_get@4 + 50 31 00007C40 _CSharp_CoolProp_SimpleState_hmolar_set@12 + 51 32 00007C10 _CSharp_CoolProp_SimpleState_p_get@4 + 52 33 00007BE0 _CSharp_CoolProp_SimpleState_p_set@12 + 53 34 00007B50 _CSharp_CoolProp_SimpleState_rhomolar_get@4 + 54 35 00007B20 _CSharp_CoolProp_SimpleState_rhomolar_set@12 + 55 36 00007CD0 _CSharp_CoolProp_SimpleState_smolar_get@4 + 56 37 00007CA0 _CSharp_CoolProp_SimpleState_smolar_set@12 + 57 38 00007D30 _CSharp_CoolProp_SimpleState_umolar_get@4 + 58 39 00007D00 _CSharp_CoolProp_SimpleState_umolar_set@12 + 59 3A 00002C90 _CSharp_DoubleVector_Add@12 + 60 3B 000033F0 _CSharp_DoubleVector_AddRange@8 + 61 3C 00002C70 _CSharp_DoubleVector_Clear@4 + 62 3D 000045A0 _CSharp_DoubleVector_Contains@12 + 63 3E 000034A0 _CSharp_DoubleVector_GetRange@12 + 64 3F 00004650 _CSharp_DoubleVector_IndexOf@12 + 65 40 000037A0 _CSharp_DoubleVector_Insert@16 + 66 41 00003930 _CSharp_DoubleVector_InsertRange@12 + 67 42 00004720 _CSharp_DoubleVector_LastIndexOf@12 + 68 43 00004810 _CSharp_DoubleVector_Remove@12 + 69 44 00003AF0 _CSharp_DoubleVector_RemoveAt@8 + 70 45 00003C50 _CSharp_DoubleVector_RemoveRange@12 + 71 46 00003F10 _CSharp_DoubleVector_Repeat@12 + 72 47 000040A0 _CSharp_DoubleVector_Reverse__SWIG_0@4 + 73 48 00004110 _CSharp_DoubleVector_Reverse__SWIG_1@12 + 74 49 00004390 _CSharp_DoubleVector_SetRange@12 + 75 4A 00002D00 _CSharp_DoubleVector_capacity@4 + 76 4B 00003120 _CSharp_DoubleVector_getitem@8 + 77 4C 00002FC0 _CSharp_DoubleVector_getitemcopy@8 + 78 4D 00002D30 _CSharp_DoubleVector_reserve@8 + 79 4E 00003290 _CSharp_DoubleVector_setitem@16 + 80 4F 00002CD0 _CSharp_DoubleVector_size@4 + 81 50 000010D0 _CSharp_LongDoubleVector_Add@8 + 82 51 000018B0 _CSharp_LongDoubleVector_AddRange@8 + 83 52 000010B0 _CSharp_LongDoubleVector_Clear@4 + 84 53 00001960 _CSharp_LongDoubleVector_GetRange@12 + 85 54 00001C60 _CSharp_LongDoubleVector_Insert@12 + 86 55 00001E00 _CSharp_LongDoubleVector_InsertRange@12 + 87 56 00001FC0 _CSharp_LongDoubleVector_RemoveAt@8 + 88 57 00002120 _CSharp_LongDoubleVector_RemoveRange@12 + 89 58 000023E0 _CSharp_LongDoubleVector_Repeat@8 + 90 59 00002590 _CSharp_LongDoubleVector_Reverse__SWIG_0@4 + 91 5A 00002600 _CSharp_LongDoubleVector_Reverse__SWIG_1@12 + 92 5B 00002880 _CSharp_LongDoubleVector_SetRange@12 + 93 5C 00001180 _CSharp_LongDoubleVector_capacity@4 + 94 5D 000015D0 _CSharp_LongDoubleVector_getitem@8 + 95 5E 00001440 _CSharp_LongDoubleVector_getitemcopy@8 + 96 5F 000011B0 _CSharp_LongDoubleVector_reserve@8 + 97 60 00001740 _CSharp_LongDoubleVector_setitem@12 + 98 61 00001150 _CSharp_LongDoubleVector_size@4 + 99 62 00008710 _CSharp_PropsSI__SWIG_0@32 + 100 63 00008A80 _CSharp_PropsSI__SWIG_1@36 + 101 64 00008E70 _CSharp_PropsSI__SWIG_2@28 + 102 65 00004E00 _CSharp_delete_AbstractState@4 + 103 66 00007E90 _CSharp_delete_CoolProp_SimpleState@4 + 104 67 000048F0 _CSharp_delete_DoubleVector@4 + 105 68 00002A90 _CSharp_delete_LongDoubleVector@4 + 106 69 00009500 _CSharp_get_debug_level@0 + 107 6A 000085A0 _CSharp_get_input_pair_long_desc@4 + 108 6B 00008430 _CSharp_get_input_pair_short_desc@4 + 109 6C 00008180 _CSharp_get_parameter_index@4 + 110 6D 00007F60 _CSharp_get_parameter_information@8 + 111 6E 000082F0 _CSharp_match_pair@20 + 112 6F 00007D60 _CSharp_new_CoolProp_SimpleState@0 + 113 70 00002D60 _CSharp_new_DoubleVector__SWIG_0@0 + 114 71 00002DB0 _CSharp_new_DoubleVector__SWIG_1@4 + 115 72 00002E30 _CSharp_new_DoubleVector__SWIG_2@4 + 116 73 000011E0 _CSharp_new_LongDoubleVector__SWIG_0@0 + 117 74 00001230 _CSharp_new_LongDoubleVector__SWIG_1@4 + 118 75 000012B0 _CSharp_new_LongDoubleVector__SWIG_2@4 + 119 76 000095E0 _CSharp_set_debug_level@4 + 120 77 000096A0 _CSharp_set_error_string@4 + 121 78 000097F0 _CSharp_set_warning_string@4 + 122 79 000159F0 _F2K@8 + 123 7A 000159D0 _K2F@8 + 124 7B 00016770 _Props1@8 + 125 7C 00015E40 _Props1SI@8 + 126 7D 00016580 _Props@32 + 127 7E 00016730 _PropsS@32 + 128 7F 00015C00 _PropsSI@32 + 129 80 00015F70 _PropsSIZ@40 + 130 81 00001070 _SWIGRegisterExceptionArgumentCallbacks_CoolProp@12 + 131 82 00001000 _SWIGRegisterExceptionCallbacks_CoolProp@44 + 132 83 000010A0 _SWIGRegisterStringCallback_CoolProp@4 + 133 84 00015A10 _get_debug_level@0 + 134 85 00015DD0 _get_param_index@4 + 135 86 000159B0 _redirect_stdout@4 + 136 87 00015A20 _set_debug_level@4 + + Summary + + 6000 .data + 95000 .rdata + 8000 .reloc + 7F000 .text diff --git a/wrappers/C#/run_example.bat b/wrappers/C#/run_example.bat new file mode 100644 index 00000000..121fcb32 --- /dev/null +++ b/wrappers/C#/run_example.bat @@ -0,0 +1,3 @@ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +csc *.cs /platform:x86 +call Example \ No newline at end of file diff --git a/wrappers/EES/BuildDLF.bat b/wrappers/EES/BuildDLF.bat new file mode 100644 index 00000000..4b5d2066 --- /dev/null +++ b/wrappers/EES/BuildDLF.bat @@ -0,0 +1,12 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +cl /c /MP3 /I../../CoolProp /EHsc ../../CoolProp/*.cpp + +REM ******* compile the wrapper *************** +cl /c /EHsc /I../../CoolProp main.cpp +link /DLL *.obj /OUT:COOLPROP_EES.dlf + +erase *.obj \ No newline at end of file diff --git a/wrappers/EES/BuildDLFGCC.bat b/wrappers/EES/BuildDLFGCC.bat new file mode 100644 index 00000000..ab09bf78 --- /dev/null +++ b/wrappers/EES/BuildDLFGCC.bat @@ -0,0 +1,5 @@ +REM ******* compile all the sources from CoolProp*************** +g++ -c -Wall -I../../CoolProp ../../CoolProp/*.cpp +g++ -c -Wall -I../../CoolProp main.cpp +g++ -shared -o COOLPROP_EES.dlf *.o -Wl +erase *.o \ No newline at end of file diff --git a/wrappers/EES/BuildDLL.bat b/wrappers/EES/BuildDLL.bat new file mode 100644 index 00000000..47003b1c --- /dev/null +++ b/wrappers/EES/BuildDLL.bat @@ -0,0 +1,13 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +cl /c /MP3 /I../../CoolProp /EHsc /DCOOLPROP_LIB /D"CONVENTION=__cdecl" ../../CoolProp/*.cpp + +mkdir dll +link /DLL *.obj /OUT:dll\CoolProp.dll +copy dll\CoolProp.dll . +dumpbin /EXPORTS CoolProp.dll > exports.txt +erase *.obj +erase *.exp \ No newline at end of file diff --git a/wrappers/EES/BuildInnoInstaller.iss b/wrappers/EES/BuildInnoInstaller.iss new file mode 100644 index 00000000..83c40d2f --- /dev/null +++ b/wrappers/EES/BuildInnoInstaller.iss @@ -0,0 +1,41 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "CoolProp" +#define MyAppVersion "4.2" +#define MyAppPublisher "University of Liege" +#define MyAppURL "coolprop.sf.net" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. +; Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{AECD4969-A5A5-4AF4-97AD-544A3890BF1C} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName=c:\ees32\Userlib\COOLPROP_EES +DisableDirPage=yes +DefaultGroupName=CoolProp_EES +OutputBaseFilename=SetupCOOLPROP_EES +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Files] +Source: "C:\Users\Belli\Documents\Code\CoolProp\wrappers\EES\CoolProp.htm"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\Belli\Documents\Code\CoolProp\wrappers\EES\CoolProp.LIB"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\Belli\Documents\Code\CoolProp\wrappers\EES\COOLPROP_EES.dlf"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\Belli\Documents\Code\CoolProp\wrappers\EES\CoolProp_EES_Sample.EES"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\Belli\Documents\Code\CoolProp\wrappers\EES\coolpropsi.LIB"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" + diff --git a/wrappers/EES/CoolProp.htm b/wrappers/EES/CoolProp.htm new file mode 100644 index 00000000..47acff58 --- /dev/null +++ b/wrappers/EES/CoolProp.htm @@ -0,0 +1,197 @@ + + + + + + CoolProp for EES + + + + +

    General Information

    + +

    The CoolProp library is a standard interface between EES and the CoolProp +library. CoolProp is a fluid property database written by Ian Bell and is open-source and free. In +addition, REFPROP can be called through CoolProp if is installed on the +computer

    + +

    + +

    The general call looks like:

    + +

    out = coolprop(output$ +,inputvar1$,input1,inputvar2$,input2,fluid$)

    + +

    A modified SI system of units is used in CoolProp. The units employed are +shown below.

    + +

    + +

    Example

    + +

    The following example retrieves the enthalpy of “Methane”. The +thermodynamic state is given by two variables : p and T, that are set to 1 bar +(100 kPa) and 15 °C (288.15 K) respectively:

    + +

    h = +coolprop('H',’P',100,’T’,288.15,’Methane’)

    + +

    + +

    A complete list of fluids that can be used in CoolProp() can be found at Fluid +Information

    + +

    + +

    The EES function coolprop() uses the same fluids and inputs as the function +Props +from the python wrappers. The documentation there is generally more up-to-date. +

    + +

    + +

    Also refer to the example file at +c:\EES32\Userlib\CoolProp_EES\CoolProp_EES_Sample.ees

    + +

    + +

    Fluid Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Thermophysical propertySymbolUnitsInput/Output
    Pressure (absolute)PkPaBoth
    TemperatureTKBoth
    DensityDkg/m3Both
    Specific EnthalpyHkJ/kgBoth
    Specific EntropySkJ/kg/KBoth
    QualityQkg/kgBoth
    Specific Internal EnergyUkJ/kgOutput only
    Specific Gibbs FunctionGkJ/kgOutput only
    Specific Heat at Constant VolumeOkJ/kg/KOutput only
    Specific Heat at Constant PressureCkJ/kg/KOutput only
    Speed of SoundAm/sOutput only
    Surface TensionIN/mOutput only
    ViscosityVPa·sOutput only
    Thermal ConductivityLkW/m/KOutput only
    Critical TemperatureTcritKOutput only
    Critical PressurepcritkPaOutput only
    Minimum TemperatureTminKOutput only
    + +

    + +

    The following combinations of inputs are valid (in either order):

    +
      +
    • T,P
    • +
    • T,Q
    • +
    • T,D
    • +
    • P,H
    • +
    • P,S
    • +
    • P,Q
    • +
    + +

    + + diff --git a/wrappers/EES/CoolProp_EES_Sample.EES b/wrappers/EES/CoolProp_EES_Sample.EES new file mode 100644 index 00000000..2a14603e Binary files /dev/null and b/wrappers/EES/CoolProp_EES_Sample.EES differ diff --git a/wrappers/EES/CopyDLF.bat b/wrappers/EES/CopyDLF.bat new file mode 100644 index 00000000..cfbbe0a9 --- /dev/null +++ b/wrappers/EES/CopyDLF.bat @@ -0,0 +1,2 @@ +copy COOLPROP_EES.dlf c:\EES32\Userlib\COOLPROP_EES\ +copy CoolProp.dll c:\EES32\Userlib\COOLPROP_EES\ \ No newline at end of file diff --git a/wrappers/EES/README.rst b/wrappers/EES/README.rst new file mode 100644 index 00000000..d13c4082 --- /dev/null +++ b/wrappers/EES/README.rst @@ -0,0 +1,20 @@ +CoolProp for EES + +Ian Bell, January 2013 + +Run the installer to install the CoolProp wrapper for EES. + +You can see the docs at ``_ + +There is an example file included in the c:\\EES\\Userlib\\CoolProp_EES folder when installed + + +Debug +----- +1. Create a new DLL project in Visual Studio 2010 (or similar). +2. Add main.cpp and all cpp files in ROOT/CoolProp folder into the project +3. Set the output file to c:\EES32\Userlib\COOLPROP_EES\COOLPROP_EES.dlf +4. Set the include folder to ROOT/CoolProp +5. Set c:\EES32\ees as the command to run in Debugging +6. Build +7. Load your failing EES file \ No newline at end of file diff --git a/wrappers/EES/build.json b/wrappers/EES/build.json new file mode 100644 index 00000000..1f07ee7c --- /dev/null +++ b/wrappers/EES/build.json @@ -0,0 +1,14 @@ +[ +{ +"pre" : "", +"sources" : ["%PACKAGE_HOME%/main.cpp"], +"platform" : ["Windows"], +"compiler" : "VS+", +"bitness" : 32, +"c_flags" : "/MP /I../../include /EHsc", +"link_type" : "DLL", +"link_fname" : "COOLPROP_EES.dlf", +"link_flags" : "", +"post" : "" +} +] \ No newline at end of file diff --git a/wrappers/EES/exports.txt b/wrappers/EES/exports.txt new file mode 100644 index 00000000..7cc629db --- /dev/null +++ b/wrappers/EES/exports.txt @@ -0,0 +1,76 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 535908FE time date stamp Thu Apr 24 14:52:14 2014 + 0.00 version + 1 ordinal base + 50 number of functions + 50 number of names + + ordinal hint RVA name + + 1 0 000A6950 DerivTerms + 2 1 000A6930 F2K + 3 2 001070D0 HAProps + 4 3 001088A0 HAProps_Aux + 5 4 0009EC70 IProps + 6 5 0009F650 IPropsSI + 7 6 0009C5F0 IsFluidType + 8 7 000A6910 K2F + 9 8 000A6CA0 Phase + 10 9 000A6D10 Phase_Tp + 11 A 000A6D80 Phase_Trho + 12 B 000A67A0 Props + 13 C 000A66E0 Props1 + 14 D 000A6720 Props1SI + 15 E 000A6760 PropsS + 16 F 000A68A0 PropsSI + 17 10 000CA9B0 conductivity_background + 18 11 000CA930 conductivity_critical + 19 12 000CA530 conformal_Trho + 20 13 000A6EA0 disable_TTSE_LUT + 21 14 000A6F60 disable_TTSE_LUT_writing + 22 15 000A6E20 enable_TTSE_LUT + 23 16 000A6EE0 enable_TTSE_LUT_writing + 24 17 000A69A0 fromSI + 25 18 000A6A40 get_Fluid_index + 26 19 000A7090 get_TTSESinglePhase_LUT_range + 27 1A 000A6A20 get_debug_level + 28 1B 000A6C30 get_fluid_param_string + 29 1C 000A6BD0 get_global_param_string + 30 1D 000A6BA0 get_param_index + 31 1E 000A7150 get_standard_unit_system + 32 1F 000A6E60 isenabled_TTSE_LUT + 33 20 000A6F20 isenabled_TTSE_LUT_writing + 34 21 000CAB90 psatL_anc + 35 22 000CAC40 psatV_anc + 36 23 000A6620 redirect_stdout + 37 24 000CAA10 rhosatL_anc + 38 25 000CAAD0 rhosatV_anc + 39 26 000A6FA0 set_TTSESat_LUT_size + 40 27 000A7030 set_TTSESinglePhase_LUT_range + 41 28 000A6FE0 set_TTSESinglePhase_LUT_size + 42 29 000A6A70 set_TTSE_mode + 43 2A 000A6A30 set_debug_level + 44 2B 000A6DF0 set_phase + 45 2C 000A6690 set_reference_stateD + 46 2D 000A6650 set_reference_stateS + 47 2E 000A7160 set_standard_unit_system + 48 2F 000A69E0 toSI + 49 30 000CA7E0 viscosity_dilute + 50 31 000CA860 viscosity_residual + + Summary + + 20000 .data + 9C000 .rdata + 25000 .reloc + 1FC000 .text diff --git a/wrappers/EES/main.cpp b/wrappers/EES/main.cpp new file mode 100644 index 00000000..dede55cc --- /dev/null +++ b/wrappers/EES/main.cpp @@ -0,0 +1,179 @@ +//============================================================================================// +// // +// EES - CoolProp interface // +// ------------------------- // +// // +// This dll is an interface between EES and CoolProp. // +// In EES, external functions need to be implemented in dynamic librairies. The first // +// argument sent by EES is a 256 characters char variable. The second argument is pointer // +// structure conaining "double" values. The third argument is a linked list for the // +// input data // +// // +// The arguments are defined as follows : // +// - The string variable contains the the definition of the fluids and of their // +// concentrations with the input strings concatenated to the fluid name joined by | // +// (e.g. "R134a|T|P|D" or "REFPROP-R134a|O|T|P" or // +// "REFPROP-MIX:R32[0.697615]&R125[0.302385]|V|P|H" (R410A)) // +// - mode, which is -1 if to return a default form of the call as string, normal mode // +// otherwise // +// - The last value is a linked list of the input values // +// // +// The file needs to be built in coolprop_ees.dlf, which is the standard extension // +// for EES external functions. If CoolProp has been built to the static library // +// CoolPropStaticLibrary.lib, you can build (with visual studio) CoolProp_EES.dlf with: // +// // +// link /DEBUG /DLL main.obj CoolPropStaticLibrary.lib /OUT:COOLPROP_EES.dlf // +// // +// Only one unit system is used (modified SI - see help). Future versions might // +// include a detection of EES current unit system and its definition in the dll // +// // +// Ian Bell // +// Thermodynamics Laboratory // +// University of Liège // +// // +// January 2013 // +//============================================================================================// + +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include +#include "CoolProp.h" +#include "CoolPropTools.h" + +static const bool EES_DEBUG = false; + +// Structure for handling ees calling syntax +struct EesParamRec { + double value; + struct EesParamRec *next; +}; + +// Tell C++ to use the "C" style calling conventions rather than the C++ mangled names + +extern "C" +{ + __declspec (dllexport) double COOLPROP_EES(char fluid[256], int mode, struct EesParamRec *input_rec) + { + double In1 = _HUGE, In2 = _HUGE, out; // Two inputs, one output + int NInputs; // Ninputs is the number of inputs + char NInputs_string[3], err_str[1000]; + std::string fluid_string = fluid; + + std::string ErrorMsg, Outstr, In1str, In2str, Fluidstr; + std::vector fluid_split; + + if (mode==-1) { + strcpy(fluid,"T = coolprop('D','P',101.325,'Q',0,'R134a')"); + return 0; + } + + // Split the string that is passed in at the '~' delimiter that was used to join it + fluid_split = strsplit(fluid_string,'~'); + if (fluid_split.size() != 4) + { + sprintf(err_str,"fluid[%s] length[%d] not 4 elements long",fluid_string.c_str(),fluid_split.size()); + strcpy(fluid,err_str); + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"%s %s %g %s %g %s\n",Outstr.c_str(),In1str.c_str(),In1,In2str.c_str(),In2,Fluidstr.c_str()); + fprintf(fp,"%s\n",err_str); + fclose(fp); + } + return 0; + } + else{ + Fluidstr = upper(fluid_split[0]); + Outstr = upper(fluid_split[1]); + In1str = upper(fluid_split[2]); + In2str = upper(fluid_split[3]); + } + + // Check the number of inputs + NInputs = 0; + EesParamRec * aninput_rec = input_rec; + while (aninput_rec != 0) + { + aninput_rec = aninput_rec->next; + NInputs++; + }; + if (NInputs != 2) { + sprintf(NInputs_string,"%d", NInputs); + strcpy(fluid,NInputs_string); + return 0; + } + + // Get the inputs from the pointer structure sent by EES: + In1= input_rec->value; + input_rec=input_rec->next; + In2=input_rec->value; + + //This block can be used to debug the code by writing output or intermediate values to a text file + + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"%s %s %g %s %g %s\n",Outstr.c_str(),In1str.c_str(),In1,In2str.c_str(),In2,Fluidstr.c_str()); + fclose(fp); + } + + if (EES_DEBUG) + { + // This redirect standard output to file2.txt + freopen("log_stdout.txt", "w", stdout); + set_debug_level(10); // Maximum debugging + } + + try + { + out = PropsS(Outstr.c_str(), In1str.c_str(), In1, In2str.c_str(), In2, Fluidstr.c_str()); + } + catch(...) + { + std::string err_str = format("Uncaught error: \"%s\",\"%s\",%g,\"%s\",%g,\"%s\"\n",Outstr.c_str(),In1str.c_str(),In1,In2str.c_str(),In2,Fluidstr.c_str()); + strcpy(fluid, err_str.c_str()); + return 0.0; + } + + if (!ValidNumber(out)) + { + std::string err_str = CoolProp::get_global_param_string("errstring"); + // There was an error + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"Error: %s \n",err_str.c_str()); + fclose(fp); + } + strcpy(fluid,err_str.c_str()); + return 0.0; + } + else + { + // Check if there was a warning + std::string warn_string = CoolProp::get_global_param_string("warnstring"); + if (!warn_string.empty()) + { + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"Warning: %s \n",warn_string.c_str()); + fclose(fp); + } + // There was a warning, write it back + strcpy(fluid, warn_string.c_str()); + } + return out; + } + } + +}; + + diff --git a/wrappers/EES/test/BuildTest.bat b/wrappers/EES/test/BuildTest.bat new file mode 100644 index 00000000..4037c09f --- /dev/null +++ b/wrappers/EES/test/BuildTest.bat @@ -0,0 +1,15 @@ +cd .. +call BuildDLL +copy CoolProp.dll test +cd test + +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources from CoolProp*************** +cl /EHsc /I../../../CoolProp testdll.cpp ../../../CoolProp/CoolPropTools.cpp + +erase *.obj + +testdll.exe \ No newline at end of file diff --git a/wrappers/EES/test/testdll.cpp b/wrappers/EES/test/testdll.cpp new file mode 100644 index 00000000..ad2baff7 --- /dev/null +++ b/wrappers/EES/test/testdll.cpp @@ -0,0 +1,147 @@ +//============================================================================================// +// // +// EES - CoolProp interface // +// ------------------------- // +// // +// This dll is an interface between EES and CoolProp. // +// In EES, external functions need to be implemented in dynamic librairies. The first // +// argument sent by EES is a 256 characters char variable. The second argument is pointer // +// structure conaining "double" values. The third argument is a linked list for the // +// input data // +// // +// The arguments are defined as follows : // +// - The string variable contains the the definition of the fluids and of their // +// concentrations with the input strings concatenated to the fluid name joined by | // +// (e.g. "R134a|T|P|D" or "REFPROP-R134a|O|T|P" or // +// "REFPROP-MIX:R32[0.697615]&R125[0.302385]|V|P|H" (R410A)) // +// - mode, which is -1 if to return a default form of the call as string, normal mode // +// otherwise // +// - The last value is a linked list of the input values // +// // +// The file needs to be built in coolprop_ees.dlf, which is the standard extension // +// for EES external functions. If CoolProp has been built to the static library // +// CoolPropStaticLibrary.lib, you can build (with visual studio) CoolProp_EES.dlf with: // +// // +// link /DEBUG /DLL main.obj CoolPropStaticLibrary.lib /OUT:COOLPROP_EES.dlf // +// // +// Only one unit system is used (modified SI - see help). Future versions might // +// include a detection of EES current unit system and its definition in the dll // +// // +// Ian Bell // +// Thermodynamics Laboratory // +// University of Liège // +// // +// January 2013 // +//============================================================================================// + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +#include "CoolPropTools.h" +#include +#include + +#include + +HINSTANCE CoolPropdllInstance; + +typedef double (__stdcall *fp_PropsSdllTYPE)(char*, char*, double, char*, double, char*); +fp_PropsSdllTYPE PropsSdll; + +typedef double (__stdcall *fp_set_debug_leveldllTYPE)(int); +fp_set_debug_leveldllTYPE set_debug_leveldll; + +typedef double (__stdcall *fp_get_global_param_stringdllTYPE)(char*, char*); +fp_get_global_param_stringdllTYPE get_global_param_stringdll; + +static const bool EES_DEBUG = false; + +// Structure for handling ees calling syntax + +// Tell C++ to use the "C" style calling conventions rather than the C++ mangled names +int main() +{ + double In1 = _HUGE, In2 = _HUGE, out; // Two inputs, one output + int NInputs; // Ninputs is the number of inputs + char NInputs_string[3], err_str[1000]; + + std::string ErrorMsg, Outstr, In1str, In2str, Fluidstr; + std::vector fluid_split; + + Outstr = "S"; + In1str = "P"; + In1 = 2449.047245069126; + In2str = "H"; + In2 = 306.720082386865; + Fluidstr = "R134A"; + + //This block can be used to debug the code by writing output or intermediate values to a text file + + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"%s %s %g %s %g %s\n",Outstr.c_str(),In1str.c_str(),In1,In2str.c_str(),In2,Fluidstr.c_str()); + fclose(fp); + } + + // 32-bit code here. + TCHAR coolpropdllstring[100] = TEXT("CoolProp.dll"); + CoolPropdllInstance = LoadLibrary(coolpropdllstring); + + if (CoolPropdllInstance == NULL) + { + printf("CoolProp.dll could not be loaded"); + return 0; + } + PropsSdll = (fp_PropsSdllTYPE) GetProcAddress(CoolPropdllInstance,"_PropsS@32"); + set_debug_leveldll = (fp_set_debug_leveldllTYPE) GetProcAddress(CoolPropdllInstance,"_set_debug_level@4"); + get_global_param_stringdll = (fp_get_global_param_stringdllTYPE) GetProcAddress(CoolPropdllInstance,"_get_global_param_string@8"); + + out = PropsSdll((char*)Outstr.c_str(),(char*)In1str.c_str(),In1,(char*)In2str.c_str(),In2,(char*)Fluidstr.c_str()); + + printf(format("output: %g\n",out).c_str()); + + if (fabs(out)>1e90) + { + char err_chars[10000]; + get_global_param_stringdll("errstring",err_chars); + std::string err_str = err_chars; + // There was an error + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"Error: %s \n",err_str.c_str()); + fclose(fp); + } + printf(err_str.c_str()); + return 0; + } + else + { + // Check if there was a warning + char warn_chars[10000]; + get_global_param_stringdll("warnstring",warn_chars); + std::string warn_string = warn_chars; + if (!warn_string.empty()) + { + if (EES_DEBUG) + { + FILE *fp; + fp = fopen("log.txt","a+"); + fprintf(fp,"Warning: %s \n",warn_string.c_str()); + fclose(fp); + } + // There was a warning, write it back + printf(warn_string.c_str()); + } + return out; + } + return 0; +} + + diff --git a/wrappers/EES/thermodynamique-small2.bmp b/wrappers/EES/thermodynamique-small2.bmp new file mode 100644 index 00000000..a6e39c5f Binary files /dev/null and b/wrappers/EES/thermodynamique-small2.bmp differ diff --git a/wrappers/Excel/BuildDLL.bat b/wrappers/Excel/BuildDLL.bat new file mode 100644 index 00000000..5644cf85 --- /dev/null +++ b/wrappers/Excel/BuildDLL.bat @@ -0,0 +1,16 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +cl /c /MP3 /O2 /EHsc /DNDEBUG /I../../include /DCOOLPROP_LIB ../../src/*.cpp +cl /c /MP3 /O2 /EHsc /DNDEBUG /I../../include /DCOOLPROP_LIB ../../src/Backends/*.cpp +cl /c /MP3 /O2 /EHsc /DNDEBUG /I../../include /DCOOLPROP_LIB ../../src/Fluids/*.cpp +cl /c /MP3 /O2 /EHsc /DNDEBUG /I../../include /DCOOLPROP_LIB ../../src/Tests/*.cpp + +link /DLL *.obj /OUT:CoolProp.dll +dumpbin /EXPORTS CoolProp.dll > exports.txt + +erase *.obj +erase *.exp +erase *.lib \ No newline at end of file diff --git a/wrappers/Excel/BuildDLLx64.bat b/wrappers/Excel/BuildDLLx64.bat new file mode 100644 index 00000000..bd266374 --- /dev/null +++ b/wrappers/Excel/BuildDLLx64.bat @@ -0,0 +1,12 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 + +REM ******* compile all the sources *************** +cl /c /MP3 /I../../CoolProp /EHsc /DCOOLPROP_LIB ../../CoolProp/*.cpp + +link /DLL CoolProp.obj *.obj /OUT:CoolProp_x64.dll +dumpbin /EXPORTS CoolProp_x64.dll > exports_x64.txt +erase *.obj +erase *.exp +erase *.lib diff --git a/wrappers/Excel/CoolProp.xla b/wrappers/Excel/CoolProp.xla new file mode 100644 index 00000000..4147611e Binary files /dev/null and b/wrappers/Excel/CoolProp.xla differ diff --git a/wrappers/Excel/CoolProp.xlam b/wrappers/Excel/CoolProp.xlam new file mode 100644 index 00000000..b297d664 Binary files /dev/null and b/wrappers/Excel/CoolProp.xlam differ diff --git a/wrappers/Excel/README.rst b/wrappers/Excel/README.rst new file mode 100644 index 00000000..840ffd52 --- /dev/null +++ b/wrappers/Excel/README.rst @@ -0,0 +1,32 @@ +CoolProp for Excel +------------------ + +Ian Bell, 2012, ian.h.bell@gmail.com + +Installation +------------ +(for Excel 2010, though other versions follow a similar protocol) + +Part 1: +^^^^^^^ +1. Copy the file CoolProp.dll to c:\\CoolProp folder if you have 32-bit Excel, the CoolProp_x64.dll if you have 64-bit Excel. It can't hurt to copy both if you don't know which version you have. + +Part 2: +^^^^^^^ +1. Open Excel +2. Go to the menu File-->Options-->Add-Ins +3. At the bottom, select Manage: Excel Add-ins, then click the Go.. button +4. Click the browse button +5. Browse to the file CoolProp.xlam you downloaded, select it +6. Make sure the CoolProp Add-in is selected. +7. Open the file TestExcel.xlsx and try to re-evaluate one of the cells - they should work now + +Part 3 (optional): +^^^^^^^^^^^^^^^^^^ +1. If you have REFPROP installed, make sure you have a copy of REFPROP installed + in c:\\Program Files\\REFPROP, if not, copy your REFPROP to this location. + Alternatively you can also modify the paths in the TestExcel.xlam file + +Notes +----- +The DLL is built using the __stdcall calling convention on 32-bit windows \ No newline at end of file diff --git a/wrappers/Excel/TestExcel.xlsx b/wrappers/Excel/TestExcel.xlsx new file mode 100644 index 00000000..1bf3599e Binary files /dev/null and b/wrappers/Excel/TestExcel.xlsx differ diff --git a/wrappers/Excel/copy_dll.bat b/wrappers/Excel/copy_dll.bat new file mode 100644 index 00000000..3cd6b68c --- /dev/null +++ b/wrappers/Excel/copy_dll.bat @@ -0,0 +1 @@ +copy CoolProp.dll c:\CoolProp \ No newline at end of file diff --git a/wrappers/Excel/exports.txt b/wrappers/Excel/exports.txt new file mode 100644 index 00000000..e3312673 --- /dev/null +++ b/wrappers/Excel/exports.txt @@ -0,0 +1,39 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 536FE6F7 time date stamp Sun May 11 23:09:11 2014 + 0.00 version + 1 ordinal base + 13 number of functions + 13 number of names + + ordinal hint RVA name + + 1 0 000090F0 _F2K@8 + 2 1 000090D0 _K2F@8 + 3 2 00009D40 _Props1@8 + 4 3 00009C60 _Props1SI@8 + 5 4 00009A80 _Props@32 + 6 5 00009D00 _PropsS@32 + 7 6 00009540 _PropsSI@32 + 8 7 00009D70 _PropsSIZ@40 + 9 8 00009110 _get_debug_level@0 + 10 9 00009790 _get_global_param_string@8 + 11 A 00009710 _get_param_index@4 + 12 B 000090B0 _redirect_stdout@4 + 13 C 00009120 _set_debug_level@4 + + Summary + + 6000 .data + 91000 .rdata + 8000 .reloc + 6C000 .text diff --git a/wrappers/Excel/exports_x64.txt b/wrappers/Excel/exports_x64.txt new file mode 100644 index 00000000..29542d17 --- /dev/null +++ b/wrappers/Excel/exports_x64.txt @@ -0,0 +1,80 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp_x64.dll + +File Type: DLL + + Section contains the following exports for CoolProp_x64.dll + + 00000000 characteristics + 52FDF25C time date stamp Fri Feb 14 11:39:24 2014 + 0.00 version + 1 ordinal base + 51 number of functions + 51 number of names + + ordinal hint RVA name + + 1 0 000D11C0 DerivTerms + 2 1 000D0C00 F2K + 3 2 00144DD0 HAProps + 4 3 001469D0 HAProps_Aux + 5 4 00004ED0 IProps + 6 5 00001BB0 IsFluidType + 7 6 000D0BD0 K2F + 8 7 000D1EB0 Phase + 9 8 000D1F60 Phase_Tp + 10 9 000D2010 Phase_Trho + 11 A 000D0C30 PrintSaturationTable + 12 B 000D0990 Props + 13 C 000D0B50 Props1 + 14 D 000D0A50 Props1SI + 15 E 000D0930 PropsS + 16 F 000D0AA0 PropsSI + 17 10 000D1AC0 conductivity_background + 18 11 000D1A30 conductivity_critical + 19 12 000D1590 conformal_Trho + 20 13 000D21A0 disable_TTSE_LUT + 21 14 000D2290 disable_TTSE_LUT_writing + 22 15 000D2100 enable_TTSE_LUT + 23 16 000D21F0 enable_TTSE_LUT_writing + 24 17 000D1270 fromSI + 25 18 000D1320 get_Fluid_index + 26 19 000D2410 get_TTSESinglePhase_LUT_range + 27 1A 000D12F0 get_debug_level + 28 1B 000D1DE0 get_fluid_param_string + 29 1C 000D1D50 get_global_param_string + 30 1D 000D1360 get_index_units + 31 1E 000D1550 get_param_index + 32 1F 000D24E0 get_standard_unit_system + 33 20 000D2150 isenabled_TTSE_LUT + 34 21 000D2240 isenabled_TTSE_LUT_writing + 35 22 000D1C50 psatL_anc + 36 23 000D1CD0 psatV_anc + 37 24 000D0800 redirect_stdout + 38 25 000D1B30 rhosatL_anc + 39 26 000D1BC0 rhosatV_anc + 40 27 000D22E0 set_TTSESat_LUT_size + 41 28 000D2390 set_TTSESinglePhase_LUT_range + 42 29 000D2330 set_TTSESinglePhase_LUT_size + 43 2A 000D13D0 set_TTSE_mode + 44 2B 000D1300 set_debug_level + 45 2C 000D20C0 set_phase + 46 2D 000D08C0 set_reference_stateD + 47 2E 000D0840 set_reference_stateS + 48 2F 000D2500 set_standard_unit_system + 49 30 000D12B0 toSI + 50 31 000D1910 viscosity_dilute + 51 32 000D19A0 viscosity_residual + + Summary + + 29000 .data + 2A000 .pdata + D3000 .rdata + 7000 .reloc + 28D000 .text + 7000 data + 2000 text diff --git a/wrappers/Fluent/README.rst b/wrappers/Fluent/README.rst new file mode 100644 index 00000000..0b9345d2 --- /dev/null +++ b/wrappers/Fluent/README.rst @@ -0,0 +1,77 @@ +CoolProp wrapper for FLUENT +=========================== + +Contributors +------------ +Primary CoolProp Developer: Ian Bell, University of Liege, Belgium (ian.h.bell@gmail.com) +FLUENT experts: Joris Degroote and Iva Papes, University of Gent, Belgium +First release: October 17, 2013 + +Requirements +------------ +A linux version of FLUENT +g++ + +To Build +-------- + +Let us call the directory the directory where the Fluent wrapper is (coolprop/wrappers/Fluent) as CUSTOM_DIRECTORY. + +1. Make sure you are in the CUSTOM_DIRECTORY + +2. Make sure your case/mesh and UDF files are in the same directory as compile.sh (CUSTOM_DIRECTORY). + + a. If they are not, move your case/mesh and UDF files to CUSTOM_DIRECTORY. Do NOT move compile.sh. + + b. By default, an UDF example (UDF.c and properties.c) has been included in CUSTOM_DIRECTORY. + +3. Run the script compile.sh (sh compile.sh SOLVER FLUENT_BIN_PATH), this should generate the libudf folder. + + a. SOLVER is the type of solver you want to run (2d, 2ddp, 3d, 3ddp) + + b. FLUENT_BIN_FOLDER is the path of your Fluent's installation bin folder (i.e. /home/ansys_inc/v145/fluent/bin) + + c. An example of how to run the shell file: sh compile.sh 2ddp /home/ansys_inc/v145/fluent/bin + + d. The script will compile all .c files in CUSTOM_DIRECTORY as Fluent UDFs and all .h files as UDF headers. + + e. Several warnings may show up, those should not be a problem. + +4. Run Fluent. + + a. Make sure it runs the same solver as specified in the SOLVER variable (2d, 2ddp, 3d, 3ddp) + +5. Open your case/mesh. + +6. Compile the UDFs. + + a. Using the Fluent interface, go to Define > User-Defined > Functions > Compiled + + b. Select the .c files in CUSTOM_DIRECTORY as UDFs and .h files, if any, as headers + + c. Make sure "libudf" is written in the Library field + + d. Hit Load + +7. The default UDF.c provided by the Coolprop wrapper is an EXECUTE_ON_DEMAND file. + + a. To check if it is working: Define > User-defined > Execute on Demand + + b. Select "call_coolprop::libudf" and hit execute + +8. The default properties.c provided integrates thermal conductivity, density, viscosity and specific heat from Coolprop library with the Fluent solver. Do not load UDF.c and properties.c simultaneously. + + a. After loading properties.c, go to the Materials tab and change the model of each property listed above to user-defined and select the corresponding function (libudf::viscosity, libudf::density, libudf::specificHeat or libudf::thermalConductivity) + + b. The fluid is, by default, carbon dioxide. To change the working fluid, you have to change the FLUID variable in the properties.c UDF file BEFORE running compile.sh. A full list of fluids supported by Coolprop may be found here: http://coolprop.sourceforge.net/Fluids/FluidInformation.html + + c. If the operating pressure in your Fluent case is different than atmospheric (101325 Pa), you will also have to change gauge variable in properties.c + + c. Specific heat is currently only a function of temperature in the Fluent wrapper. + + +Note: If no argument is specified when running the shell file (step 3), then the script will assume Fluent can be run from command line (fluent) and the solver is 2d double precision (2ddp) + +Warning +------- +Absolutely no guarantee of utility or accuracy can be made, although we have done our best to ensure useful and accurate results. Caveat emptor! diff --git a/wrappers/Fluent/UDF.c b/wrappers/Fluent/UDF.c new file mode 100644 index 00000000..2e73bd7c --- /dev/null +++ b/wrappers/Fluent/UDF.c @@ -0,0 +1,15 @@ +#include "udf.h" + +double Props (char*, char, double, char, double, char*); + +DEFINE_ON_DEMAND(call_coolprop) +{ + real p, t, r; + + p = 100000.0; + t = 300.0; + + r = Props((char*)"D",'T',t,'P',p/1000,(char*)"Air"); + + Message("p = %lf, t = %lf => r = %lf\n", p, t, r); +} diff --git a/wrappers/Fluent/compile.sh b/wrappers/Fluent/compile.sh new file mode 100644 index 00000000..c198d8db --- /dev/null +++ b/wrappers/Fluent/compile.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Warning: this script deletes directory libudf before creating a new one + +# Warning: read README.rst before editing the variables SOLVER and FLUENT_BIN_FOLDER + +SOLVER="$1" +FLUENT_BIN_FOLDER="$2" + +if [ "$SOLVER" = "" ] +then + $SOLVER = "2ddp" #compiles 2d double precision by default +fi + +FLUENT_COMPILER=g++ + +HOME=`pwd` + +# Copy CoolProp sources to a local folder called coolprop +mkdir coolprop +cp -r ../../CoolProp ./coolprop/CoolProp + +cd coolprop +g++ -c CoolProp/*.cpp -ICoolProp -fPIC -D_GNU_SOURCE -ansi -O -Wall -DPTR_RESTRICT= +cd $HOME + +echo exit > exit.jou +if [ "$FLUENT_BIN_FOLDER" = "" ] +then + fluent $SOLVER -g -env -i exit.jou > FluentEnvironment.dat 2>&1 +else + $FLUENT_BIN_FOLDER"/fluent" $SOLVER -g -env -i exit.jou > FluentEnvironment.dat 2>&1 +fi +rm exit.jou +FLUENT_INC=`cat FluentEnvironment.dat | grep FLUENT_INC | sed 's/FLUENT[_A-Z]*=//'` +FLUENT_ARCH=`cat FluentEnvironment.dat | grep FLUENT_ARCH | sed 's/FLUENT[_A-Z]*=//'` +FLUENT_PROD_DIR=`cat FluentEnvironment.dat | grep FLUENT_PROD_DIR | sed 's/FLUENT[_A-Z]*=//'` +PATH_MAKEFILE1=$FLUENT_PROD_DIR"/src/makefile.udf" +PATH_MAKEFILE2=$FLUENT_PROD_DIR"/src/makefile.udf2" +PATH_LIBRARY="libudf/"$FLUENT_ARCH"/"$SOLVER +rm -rf libudf/ +mkdir libudf +cp $PATH_MAKEFILE2 libudf/makefile +mkdir libudf/src +cp $PATH_MAKEFILE1 libudf/src/makefile +mkdir libudf/$FLUENT_ARCH +mkdir $PATH_LIBRARY +mkdir ${PATH_LIBRARY}"_host" +mkdir ${PATH_LIBRARY}"_node" +udfNames="" +echo -n CSOURCES= > ${PATH_LIBRARY}/user.udf +for file in *.c +do + echo -n $file" " >> ${PATH_LIBRARY}/user.udf + udfNames=$udfNames" "$file +done +echo -n -e "\n"HSOURCES= >> ${PATH_LIBRARY}/user.udf +for file in *.h +do + if [$file != "*.h"] + then + echo -n $file" " >> ${PATH_LIBRARY}/user.udf + fi +done +echo -e "\n"FLUENT_INC=$FLUENT_INC >> ${PATH_LIBRARY}/user.udf +echo GPU_SUPPORT=off >> ${PATH_LIBRARY}/user.udf +cp ${PATH_LIBRARY}/user.udf ${PATH_LIBRARY}_host/user.udf +cp ${PATH_LIBRARY}/user.udf ${PATH_LIBRARY}_node/user.udf +cp *.c libudf/src/ +cp *.h libudf/src/ +cd libudf && make "FLUENT_ARCH=$FLUENT_ARCH" "SOURCES=$udfNames" "FLUENT_INC=$FLUENT_INC" "CC=$FLUENT_COMPILER" "CFLAGS_LNAMD64=-D_lnamd64 -D_GNU_SOURCE -fpic -shared -ansi -O -Wall -DPTR_RESTRICT= " +cd $HOME +cp coolprop/*.o ${PATH_LIBRARY} +cp coolprop/*.o ${PATH_LIBRARY}"_host" +cp coolprop/*.o ${PATH_LIBRARY}"_node" +cd ${PATH_LIBRARY} && g++ -shared -lm -ldl *.o -o libudf.so +cd $HOME +cd ${PATH_LIBRARY}"_host" && g++ -shared -lm -ldl *.o -o libudf.so +cd $HOME +cd ${PATH_LIBRARY}"_node" && g++ -shared -lm -ldl *.o -o libudf.so + +rm -rf coolprop diff --git a/wrappers/Fluent/properties.c b/wrappers/Fluent/properties.c new file mode 100644 index 00000000..0839d088 --- /dev/null +++ b/wrappers/Fluent/properties.c @@ -0,0 +1,97 @@ +/* +* UDF TO CALCULATE FLUID PROPERTIES BASED ON THE OPEN-SOURCE +* THERMODYNAMIC LIBRARY COOLPROP +*/ + +/* PropsSI() is faster if you use temperature and density as + * independent state variables */ + +#include "udf.h" + +const char* FLUID = "CarbonDioxide"; +const real gauge = 101325; //operating pressure in pascal (as defined in fluent) + +double PropsSI (char*, char*, double, char*, double, char*); + + +/* REAL GAS VISCOSITY */ +DEFINE_PROPERTY(cell_viscosity, c, t) +{ + real viscosity; + real temperature = C_T(c, t); + real density = C_R(c, t); + viscosity = PropsSI((char*)"V", (char*)"T", temperature, (char*)"D", density, (char*)FLUID); + return viscosity; +} + +/* REAL GAS THERMAL CONDUCTIVITY */ +DEFINE_PROPERTY(cell_thermalConductivity, c, t) +{ + real thermalConductivity; + real temperature = C_T(c, t); + real density = C_R(c, t); + thermalConductivity = PropsSI((char*)"L", (char*)"T", temperature, (char*)"D", density, (char*)FLUID); + return thermalConductivity; +} + +/* REAL GAS SPECIFIC MASS */ +DEFINE_PROPERTY(cell_density, c, t) +{ + real density; + real temperature = C_T(c, t); + real pressure = C_P(c, t)+gauge; + density = PropsSI((char*)"D",(char*)"T", temperature, (char*)"P", pressure, (char*)FLUID); + return density; +} + +/* REAL GAS SPECIFIC HEAT */ +DEFINE_SPECIFIC_HEAT(cell_specificHeat, temperature, Tref, enthalpy, yi) +{ + real density; + density = 1.7730; + + /* The following commented code is supposed to get the pressure + from the cell to use with Coolprop. Left commented because + specific heat depends very little on pressure. Will increase + computational time significantly. */ + + /* + * Domain *domain = Get_Domain(1); + * Thread *t; + * cell_t c; + * thread_loop_c(t, domain) + * { + * begin_c_loop(c, t) + * { + * pressure = C_P(c, t); + * }end_c_loop(c, t) + * } + */ + + real specificHeat; + + specificHeat = PropsSI((char*)"C",(char*)"T", temperature, (char*)"D", density, (char*)FLUID); + *enthalpy = specificHeat*(temperature-Tref); + return specificHeat; +} + +/* Execute on demand UDF to test if the library was built correctly */ +DEFINE_ON_DEMAND(call_coolprop) +{ + real p, t, density, specificHeat, thermalConductivity, enthalpy, viscosity; + + p = 100000.0; + t = 300.0; + + density = PropsSI((char*)"D",(char*)"T",t,(char*)"P",p,(char*)FLUID); + specificHeat = PropsSI((char*)"C",(char*)"T",t,(char*)"D",density,(char*)FLUID); + viscosity = PropsSI((char*)"V",(char*)"T",t,(char*)"D",density,(char*)FLUID); + thermalConductivity = PropsSI((char*)"L",(char*)"T",t,(char*)"D",density,(char*)FLUID); + enthalpy = PropsSI((char*)"H",(char*)"T",t,(char*)"D",density,(char*)FLUID); + + Message("p = %lf, T = %lf => density = %lf\n", p, t, density); + Message("p = %lf, T = %lf => specific heat = %lf\n", p, t, specificHeat); + Message("p = %lf, T = %lf => viscosity = %lf\n", p, t, viscosity); + Message("p = %lf, T = %lf => thermal conductivity = %lf\n", p, t, thermalConductivity); + Message("p = %lf, T = %lf => enthalpy = %lf\n", p, t, enthalpy); +} diff --git a/wrappers/Fortran/README.rst b/wrappers/Fortran/README.rst new file mode 100644 index 00000000..254c6a60 --- /dev/null +++ b/wrappers/Fortran/README.rst @@ -0,0 +1,17 @@ + + +To Use on Windows +================= + +Prerequisites: + +* Visual Studio Express +* gfortran + +1. Go to the SharedLibrary folder (../SharedLibrary), build the DLL using the build.bat file + +2. Run the script build.bat to make the executable example.exe + +3. Copy the file CoolProp.dll from ../SharedLibrary to this folder + +4. Run the file example.exe \ No newline at end of file diff --git a/wrappers/Fortran/build.bat b/wrappers/Fortran/build.bat new file mode 100644 index 00000000..90a70d26 --- /dev/null +++ b/wrappers/Fortran/build.bat @@ -0,0 +1,13 @@ +@echo off +REM Some Windows commands to compile the Fortran interface for F77 +setlocal +set comPath=C:\MinGW32-xy\bin +set FC=%comPath%\gfortran +set CC=%comPath%\gcc +REM set comPath=C:\MinGW32\bin +REM set FC=%comPath%\g77 +REM set CC=%comPath%\gcc +%FC% -g -c examplef.for +%CC% -g -c coolpropIF.c +%FC% -g -o example examplef.o coolpropIF.o -L../SharedLibrary -lCoolProp +endlocal \ No newline at end of file diff --git a/wrappers/Fortran/build.bsh b/wrappers/Fortran/build.bsh new file mode 100644 index 00000000..51659782 --- /dev/null +++ b/wrappers/Fortran/build.bsh @@ -0,0 +1,8 @@ +#!/bin/bash +gfortran -g -c examplef.for +gcc -g -c coolpropIF.c +gfortran -g -o example examplef.o coolpropIF.o -lCoolProp -ldl -lgfortran + +# gfortran -g -c examplef.for +# g++ -g -c examplecpp.cpp +# g++ -g -o example examplef.o examplecpp.o -lCoolProp -ldl -lgfortran diff --git a/wrappers/Fortran/coolpropIF.c b/wrappers/Fortran/coolpropIF.c new file mode 100644 index 00000000..66052c9f --- /dev/null +++ b/wrappers/Fortran/coolpropIF.c @@ -0,0 +1,98 @@ + +#include +#include + +typedef int bool; +#define false 0 +#define true 1 + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(__WIN64__) +# define CONVENTION __declspec(dllexport) +#endif + +#ifndef CONVENTION +# define CONVENTION +#endif + +double CONVENTION Props1 (char * FluidName, char * Output); +double CONVENTION Props (char * Output,char Name1, double Prop1, char Name2, double Prop2, char * FluidName); +double CONVENTION PropsSI(char * Output,char Name1, double Prop1, char Name2, double Prop2, char * FluidName); +double CONVENTION DerivTerms(char * Term, double T, double rho, char * FluidName); +int CONVENTION set_reference_stateS(char * FluidName, char * reference_state); +bool CONVENTION enable_TTSE_LUT(char *FluidName); +bool CONVENTION isenabled_TTSE_LUT(char *FluidName); +bool CONVENTION disable_TTSE_LUT(char *FluidName); +int CONVENTION set_TTSE_mode(char *FluidName, char * Value); + + +void CONVENTION propsmod_(char *Output, char *Name1, double *Prop1, char *Name2, double *Prop2, char *FluidName, double *resu) +{ + /* return Props(std::string(Output), Name1, Prop1, Name2, Prop2, std::string(FluidName)); */ + *resu = Props(Output, *Name1, *Prop1, *Name2, *Prop2, FluidName); +} + +/* Create pointer-only functions for Fortran avoiding underscores for f77 */ +double CONVENTION props1_(char *FluidName, char *Output) +{ + /* return Props1(std::string(FluidName), std::string(Output)); */ + return Props1(FluidName, Output); +} + +double CONVENTION props_(char *Output, char *Name1, double *Prop1, char *Name2, double *Prop2, char *FluidName) +{ + /* return Props(std::string(Output), Name1, Prop1, Name2, Prop2, std::string(FluidName)); */ + return Props(Output, *Name1, *Prop1, *Name2, *Prop2, FluidName); +} + +double CONVENTION propssi_(char *Output, char *Name1, double *Prop1, char *Name2, double *Prop2, char *FluidName) +{ + /* return Props(std::string(Output), Name1, Prop1, Name2, Prop2, std::string(FluidName)); */ + return PropsSI(Output, *Name1, *Prop1, *Name2, *Prop2, FluidName); +} + +double CONVENTION derivterms_(char *Term, double *T, double *rho, char *FluidName) +{ + /* return DerivTerms(std::string(Term), T, rho, std::string(FluidName)); */ + return DerivTerms(Term, *T, *rho, FluidName); +} + +int CONVENTION setreferencestates_(char *FluidName, char *reference_state) +{ + /* return set_reference_stateS(std::string(FluidName), std::string(reference_state)); */ + return set_reference_stateS(FluidName, reference_state); +} +/* int set_reference_stateS(std::string FluidName, std::string reference_state); */ + +/* Enable the TTSE */ +int CONVENTION enablettselut_(char *FluidName) +{ + if (enable_TTSE_LUT(FluidName)) return 1; + else return 0; +} +/* bool CONVENTION enable_TTSE_LUT(char *FluidName); */ + +/* Check if TTSE is enabled */ +int CONVENTION isenabledttselut_(char *FluidName) +{ + if (isenabled_TTSE_LUT(FluidName)) return 1; + else return 0; +} +/* bool CONVENTION isenabled_TTSE_LUT(char *FluidName); */ + +/* Disable the TTSE */ +int CONVENTION disablettselut_(char *FluidName) +{ + if (disable_TTSE_LUT(FluidName)) return 1; + else return 0; +} +/* bool CONVENTION disable_TTSE_LUT(char *FluidName); */ + +/* Set the TTSE mode (normal or bicubic) */ +int CONVENTION setttsemode_(char *FluidName, char *Value) +{ + return set_TTSE_mode(FluidName, Value); +} +/* int CONVENTION set_TTSE_mode(char *FluidName, char * Value); */ + + + diff --git a/wrappers/Fortran/examplef.for b/wrappers/Fortran/examplef.for new file mode 100644 index 00000000..e183838c --- /dev/null +++ b/wrappers/Fortran/examplef.for @@ -0,0 +1,67 @@ +! Example fortran file +! + double precision T,Q,D,h,s + character(LEN=32) Ref + character(LEN=2) Output, Name1, Name2 + double precision outVal,Prop1,Prop2 + + integer inte + + T = 285 + Q = 0 + D = 1250; + + Output = "P"//CHAR(0) + Name1 = "T"//CHAR(0) + Prop1 = T + Name2 = "Q"//CHAR(0) + Prop2 = Q + Ref = "R134a"//CHAR(0) + +! Output(LEN(Output):LEN(Output)) = CHAR(0) +! Name1(LEN(Name1):LEN(Name1)) = CHAR(0) +! Name2(LEN(Name2):LEN(Name2)) = CHAR(0) +! Ref(LEN(Ref):LEN(Ref)) = CHAR(0) + + write(*,*) "Saturation pressure for R134a: " + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "Result was: ", outVal/1e2, " bar" + write(*,*) "-----------------------------------------------" + + Output = "S"//CHAR(0) + + + + outVal = props1(Ref , "Tcrit"//CHAR(0)) + write(*,*) "Tcrit from props1 : ", outVal + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "S from standard props : ", outVal + outVal = 0.0 + CALL propsmod(Output, Name1, Prop1, Name2, Prop2, Ref, outVal) + write(*,*) "S from modified props : ", outVal + outVal = derivterms("dpdrho"//CHAR(0), Prop1, D, Ref) + write(*,*) "dpdrho from derivterms: ", outVal + inte = setreferencestates(Ref, "IIR"//CHAR(0)) + write(*,*) "reference to IIR : ", inte + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "S from standard props : ", outVal + inte = setreferencestates(Ref, "ASHRAE"//CHAR(0)) + write(*,*) "reference to ASHRAE : ", inte + outVal = props(Output, Name1, Prop1, Name2,Prop2, Ref) + write(*,*) "S from standard props : ", outVal + inte = enablettselut(Ref) + write(*,*) "enabling TTSE : ", inte + inte = isenabledttselut(Ref) + write(*,*) "state of TTSE : ", inte + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "S from TTSE props : ", outVal + inte = setttsemode(Ref , "bicubic"//CHAR(0)) + write(*,*) "TTSE mode to bicubic : ", inte + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "S from bicubic props : ", outVal + inte = disablettselut(Ref) + write(*,*) "Disabling TTSE : ", inte + outVal = props(Output, Name1, Prop1, Name2, Prop2, Ref) + write(*,*) "S from standard props : ", outVal + + end program diff --git a/wrappers/Java/Example.java b/wrappers/Java/Example.java new file mode 100644 index 00000000..4602806b --- /dev/null +++ b/wrappers/Java/Example.java @@ -0,0 +1,91 @@ +// Example for Java +// Ian Bell, 2013 + +public class Example { + static { + System.loadLibrary("CoolProp"); + } + + public static void main(String argv[]){ + + double T, h, p, D; + int SI,KSI; + System.out.println("CoolProp version: " + CoolProp.get_global_param_string("version")); + System.out.println("CoolProp gitrevision: " + CoolProp.get_global_param_string("gitrevision")); + System.out.println("CoolProp fluids: " + CoolProp.get_global_param_string("FluidsList")); + + System.out.println(" "); + System.out.println("************ USING EOS *************"); + System.out.println(" "); + System.out.println("FLUID STATE INDEPENDENT INPUTS"); + //System.out.println("Critical Density Propane: " + CoolProp.Props1SI("Propane", "rhocrit") + "kg/m^3"); + System.out.println("TWO PHASE INPUTS (Pressure)"); + System.out.println("Density of saturated liquid Propane at 101325 kPa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 101325 kPa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 1, "R290") + " kg/m^3"); + System.out.println("TWO PHASE INPUTS (Temperature)"); + System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "Propane") + " kg/m^3"); + System.out.println("Density of saturated vapor R290 at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 1, "R290") + " kg/m^3"); + System.out.println("SINGLE PHASE CYCLE (propane)"); + p = CoolProp.PropsSI("P", "T", 300, "D", 1, "Propane"); + h = CoolProp.PropsSI("H", "T", 300, "D", 1, "Propane"); + System.out.println("T,D -> P,H " + 300 + "," + 1 + " --> " + p + "," + h); + T = CoolProp.PropsSI("T", "P", p, "H", h, "Propane"); + D = CoolProp.PropsSI("D", "P", p, "H", h, "Propane"); + System.out.println("P,H -> T,D " + p + "," + h + " --> " + T + "," + D); + + //~ System.out.println(" "); + //~ System.out.println("************ USING TTSE ***************"); + //~ System.out.println(" "); + //~ CoolProp.enable_TTSE_LUT("Propane"); + //~ System.out.println("TWO PHASE INPUTS (Pressure)"); + //~ System.out.println("Density of saturated liquid Propane at 101325 kPa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "Propane") + " kg/m^3"); + //~ System.out.println("Density of saturated vapor R290 at 101325 kPa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 1, "R290") + " kg/m^3"); + //~ System.out.println("TWO PHASE INPUTS (Temperature)"); + //~ System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "Propane") + " kg/m^3"); + //~ System.out.println("Density of saturated vapor R290 at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 1, "R290") + " kg/m^3"); + //~ System.out.println("SINGLE PHASE CYCLE (propane)"); + //~ p = CoolProp.PropsSI("P", "T", 300, "D", 1, "Propane"); + //~ h = CoolProp.PropsSI("H", "T", 300, "D", 1, "Propane"); + //~ System.out.println("T,D -> P,H " + 300 + ","+ 1+ " --> " + p + "," + h); + //~ T = CoolProp.PropsSI("T", "P", p, "H", h, "Propane"); + //~ D = CoolProp.PropsSI("D", "P", p, "H", h, "Propane"); + //~ System.out.println("P,H -> T,D " + p + "," + h + " --> " + T + "," + D); + //~ CoolProp.disable_TTSE_LUT("Propane"); + + try + { + System.out.println(" "); + System.out.println("************ USING REFPROP ***************"); + System.out.println(" "); + System.out.println("TWO PHASE INPUTS (Pressure)"); + System.out.println("Density of saturated liquid Propane at 101325 kPa: " + CoolProp.PropsSI("D", "P", 101325, "Q", 0, "REFPROP::Propane") + " kg/m^3"); + System.out.println("TWO PHASE INPUTS (Temperature)"); + System.out.println("Density of saturated liquid Propane at 300 K: " + CoolProp.PropsSI("D", "T", 300, "Q", 0, "REFPROP::Propane") + " kg/m^3"); + System.out.println("SINGLE PHASE CYCLE (propane)"); + p = CoolProp.PropsSI("P","T",300,"D",1,"REFPROP::Propane"); + h = CoolProp.PropsSI("H","T",300,"D",1,"REFPROP::Propane"); + System.out.println("T,D -> P,H " + 300 + "," + 1 + " --> " + p + "," + h); + T = CoolProp.PropsSI("T","P",p,"H",h,"REFPROP::Propane"); + D = CoolProp.PropsSI("D","P",p,"H",h,"REFPROP::Propane"); + System.out.println("P,H -> T,D " + p + "," + h + " --> " + T + "," + D); + } + catch(Exception e) + { + System.out.println(" "); + System.out.println("************ CANT USE REFPROP ************"); + System.out.println(" "); + } + + System.out.println(" "); + System.out.println("************ BRINES AND SECONDARY WORKING FLUIDS *************"); + System.out.println(" "); + System.out.println("Density of 50% (mass) ethylene glycol/water at 300 K, 101325 kPa: " + CoolProp.PropsSI("D", "T", 300, "P", 101325, "EG-50%") + "kg/m^3"); + System.out.println("Viscosity of Therminol D12 at 350 K, 101325 kPa: " + CoolProp.PropsSI("V", "T", 350, "P", 101325, "TD12") + "Pa-s"); + + //~ System.out.println(" "); + //~ System.out.println("************ HUMID AIR PROPERTIES *************"); + //~ System.out.println(" "); + //~ System.out.println("Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: " + CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5) + " kg_w/kg_da"); + //~ System.out.println("Relative humidity from last calculation: " + CoolProp.HAProps("R", "T", 300, "P", 101.325, "W", CoolProp.HAProps("W", "T", 300, "P", 101.325, "R", 0.5)) + "(fractional)"); + } +} \ No newline at end of file diff --git a/wrappers/Java/README.rst b/wrappers/Java/README.rst new file mode 100644 index 00000000..a7c4bedc --- /dev/null +++ b/wrappers/Java/README.rst @@ -0,0 +1,31 @@ +Building +======== + +Requirements +------------ +SWIG (http://www.swig.org/) +A compiler (the Visual Studio 2010 C++ Express version should be fine) + +To Build +-------- +Run the script build_x64.bat - adjust the paths if necessary to the include folders for your java installation + +If on 32-bit windows, run the build_win32.bat file + +Each script will put the DLL in the corresponding folder (win32 for 32-bit, x64 for 64-bit) + +Running +======= +At the console, run:: + + javac *.java + java runme + +which should output:: + + 702.820647167934 + +Hiccups +======= +If the bin folder of the installation for java is not on the path, you may need to add it. + diff --git a/wrappers/Java/build.json b/wrappers/Java/build.json new file mode 100644 index 00000000..a994ee5c --- /dev/null +++ b/wrappers/Java/build.json @@ -0,0 +1,25 @@ +[ +{ +"pre" : "swig -java -c++ -outdir Java -o Java/CoolProp_wrap.cxx -I../../include ../../src/CoolProp.i", +"sources" : ["Java/CoolProp_wrap.cxx"], +"platform" : ["Windows"], +"compiler" : "VS10.0", +"bitness" : 32, +"c_flags" : "/MP3 /O2 /EHsc /I../../include /I\"C:/Program Files/Java/jdk1.7.0_40/include\" /I\"C:/Program Files/Java/jdk1.7.0_40/include/win32\" ", +"link_type" : "DLL", +"link_fname" : "CoolProp.dll", +"link_flags" : "", +"post" : "" +}, +{ +"pre" : "swig -java -c++ -outdir Java -I../../include ../../src/CoolProp.i", +"platform" : ["Windows"], +"compiler" : "VS10.0", +"bitness" : 64, +"c_flags" : "/MP3 /O2 /EHsc /I../../include /I\"C:/Program Files/Java/jdk1.7.0_40/include\" /I\"C:/Program Files/Java/jdk1.7.0_40/include/win32\" ", +"link_type" : "DLL", +"link_fname" : "CoolProp.dll", +"link_flags" : "", +"post" : "erase *.obj " +} +] \ No newline at end of file diff --git a/wrappers/Java/build_win32.bat b/wrappers/Java/build_win32.bat new file mode 100644 index 00000000..29426c77 --- /dev/null +++ b/wrappers/Java/build_win32.bat @@ -0,0 +1,22 @@ + +@echo on +erase CoolProp.dll +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +swig -java -c++ -outcurrentdir -I../../include ../../src/CoolProp.i +cl /c /MP3 /I../../include /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc *.cxx +cl /c /MP3 /I../../include /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../src/*.cpp +cl /c /MP3 /I../../include /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../src/Backends/*.cpp +cl /c /MP3 /I../../include /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../src/Fluids/*.cpp +cl /c /MP3 /I../../include /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../src/Tests/*.cpp + +link /DLL *.obj /OUT:CoolProp.dll +dumpbin /EXPORTS CoolProp.dll > exports.txt +mkdir win32 +move CoolProp.dll win32 +erase *.obj +erase *.exp +erase *.lib \ No newline at end of file diff --git a/wrappers/Java/build_x64.bat b/wrappers/Java/build_x64.bat new file mode 100644 index 00000000..7842645e --- /dev/null +++ b/wrappers/Java/build_x64.bat @@ -0,0 +1,17 @@ +@echo on +erase CoolProp.dll +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 + +REM ******* compile all the sources *************** +swig -java -c++ -outcurrentdir ../../CoolProp/CoolProp.i +cl /c /I../../CoolProp /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc *.cxx +cl /c /MP3 /I../../CoolProp /I"C:\Program Files\Java\jdk1.7.0_40\include" /I"C:\Program Files\Java\jdk1.7.0_40\include\win32" /EHsc ../../CoolProp/*.cpp +link /DLL *.obj /OUT:CoolProp.dll +dumpbin /EXPORTS CoolProp.dll > exports_x64.txt +mkdir x64 +move CoolProp.dll x64 +erase *.obj +erase *.exp +erase *.lib \ No newline at end of file diff --git a/wrappers/Java/exports.txt b/wrappers/Java/exports.txt new file mode 100644 index 00000000..8f0dca43 --- /dev/null +++ b/wrappers/Java/exports.txt @@ -0,0 +1,122 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 536FA972 time date stamp Sun May 11 18:46:42 2014 + 0.00 version + 1 ordinal base + 96 number of functions + 96 number of names + + ordinal hint RVA name + + 1 0 000130A0 _Java_CoolPropJNI_AbstractState_1Q@20 + 2 1 00012DA0 _Java_CoolPropJNI_AbstractState_1T@20 + 3 2 00012BA0 _Java_CoolPropJNI_AbstractState_1Tmax@20 + 4 3 000141B0 _Java_CoolPropJNI_AbstractState_1alpha0@20 + 5 4 00014990 _Java_CoolPropJNI_AbstractState_1alphar@20 + 6 5 00011BF0 _Java_CoolPropJNI_AbstractState_1calc_1melt_1T_1p@28 + 7 6 00011A60 _Java_CoolPropJNI_AbstractState_1calc_1melt_1p_1T@28 + 8 7 00011D80 _Java_CoolPropJNI_AbstractState_1calc_1melt_1rho_1T@28 + 9 8 000122F0 _Java_CoolPropJNI_AbstractState_1clear@20 + 10 9 00013FB0 _Java_CoolPropJNI_AbstractState_1conductivity@20 + 11 A 000138A0 _Java_CoolPropJNI_AbstractState_1cpmolar@20 + 12 B 000139A0 _Java_CoolPropJNI_AbstractState_1cvmolar@20 + 13 C 000145A0 _Java_CoolPropJNI_AbstractState_1d2alpha0_1dDelta2@20 + 14 D 000146F0 _Java_CoolPropJNI_AbstractState_1d2alpha0_1dDelta_1dTau@20 + 15 E 00014840 _Java_CoolPropJNI_AbstractState_1d2alpha0_1dTau2@20 + 16 F 00014D80 _Java_CoolPropJNI_AbstractState_1d2alphar_1dDelta2@20 + 17 10 00014ED0 _Java_CoolPropJNI_AbstractState_1d2alphar_1dDelta_1dTau@20 + 18 11 00015020 _Java_CoolPropJNI_AbstractState_1d2alphar_1dTau2@20 + 19 12 00014300 _Java_CoolPropJNI_AbstractState_1dalpha0_1dDelta@20 + 20 13 00014450 _Java_CoolPropJNI_AbstractState_1dalpha0_1dTau@20 + 21 14 00014AE0 _Java_CoolPropJNI_AbstractState_1dalphar_1dDelta@20 + 22 15 00014C30 _Java_CoolPropJNI_AbstractState_1dalphar_1dTau@20 + 23 16 000132A0 _Java_CoolPropJNI_AbstractState_1delta@20 + 24 17 00012010 _Java_CoolPropJNI_AbstractState_1factory@16 + 25 18 00012A30 _Java_CoolPropJNI_AbstractState_1first_1partial_1deriv@32 + 26 19 00013DA0 _Java_CoolPropJNI_AbstractState_1fugacity_1coefficient@24 + 27 1A 000134A0 _Java_CoolPropJNI_AbstractState_1gas_1constant@20 + 28 1B 000127F0 _Java_CoolPropJNI_AbstractState_1get_1reducing@20 + 29 1C 000135A0 _Java_CoolPropJNI_AbstractState_1hmolar@20 + 30 1D 00013CA0 _Java_CoolPropJNI_AbstractState_1isobaric_1expansion_1coefficient@20 + 31 1E 00013BA0 _Java_CoolPropJNI_AbstractState_1isothermal_1compressibility@20 + 32 1F 00012920 _Java_CoolPropJNI_AbstractState_1keyed_1output@24 + 33 20 000133A0 _Java_CoolPropJNI_AbstractState_1molar_1mass@20 + 34 21 00012FA0 _Java_CoolPropJNI_AbstractState_1p@20 + 35 22 00012CA0 _Java_CoolPropJNI_AbstractState_1pmax@20 + 36 23 00012EA0 _Java_CoolPropJNI_AbstractState_1rhomolar@20 + 37 24 000125F0 _Java_CoolPropJNI_AbstractState_1set_1mass_1fractions@32 + 38 25 000124F0 _Java_CoolPropJNI_AbstractState_1set_1mole_1fractions@32 + 39 26 000136A0 _Java_CoolPropJNI_AbstractState_1smolar@20 + 40 27 00013AA0 _Java_CoolPropJNI_AbstractState_1speed_1sound@20 + 41 28 000140B0 _Java_CoolPropJNI_AbstractState_1surface_1tension@20 + 42 29 000131A0 _Java_CoolPropJNI_AbstractState_1tau@20 + 43 2A 000137A0 _Java_CoolPropJNI_AbstractState_1umolar@20 + 44 2B 000123F0 _Java_CoolPropJNI_AbstractState_1update@40 + 45 2C 000126F0 _Java_CoolPropJNI_AbstractState_1using_1mole_1fractions@20 + 46 2D 00013EB0 _Java_CoolPropJNI_AbstractState_1viscosity@20 + 47 2E 00015200 _Java_CoolPropJNI_CoolProp_1SimpleState_1T_1get@20 + 48 2F 000151D0 _Java_CoolPropJNI_CoolProp_1SimpleState_1T_1set@28 + 49 30 000152C0 _Java_CoolPropJNI_CoolProp_1SimpleState_1hmolar_1get@20 + 50 31 00015290 _Java_CoolPropJNI_CoolProp_1SimpleState_1hmolar_1set@28 + 51 32 00015260 _Java_CoolPropJNI_CoolProp_1SimpleState_1p_1get@20 + 52 33 00015230 _Java_CoolPropJNI_CoolProp_1SimpleState_1p_1set@28 + 53 34 000151A0 _Java_CoolPropJNI_CoolProp_1SimpleState_1rhomolar_1get@20 + 54 35 00015170 _Java_CoolPropJNI_CoolProp_1SimpleState_1rhomolar_1set@28 + 55 36 00015320 _Java_CoolPropJNI_CoolProp_1SimpleState_1smolar_1get@20 + 56 37 000152F0 _Java_CoolPropJNI_CoolProp_1SimpleState_1smolar_1set@28 + 57 38 00015380 _Java_CoolPropJNI_CoolProp_1SimpleState_1umolar_1get@20 + 58 39 00015350 _Java_CoolPropJNI_CoolProp_1SimpleState_1umolar_1set@28 + 59 3A 000116F0 _Java_CoolPropJNI_DoubleVector_1add@28 + 60 3B 00011610 _Java_CoolPropJNI_DoubleVector_1capacity@20 + 61 3C 000116D0 _Java_CoolPropJNI_DoubleVector_1clear@20 + 62 3D 00011730 _Java_CoolPropJNI_DoubleVector_1get@24 + 63 3E 00011690 _Java_CoolPropJNI_DoubleVector_1isEmpty@20 + 64 3F 00011660 _Java_CoolPropJNI_DoubleVector_1reserve@28 + 65 40 00011850 _Java_CoolPropJNI_DoubleVector_1set@32 + 66 41 000115C0 _Java_CoolPropJNI_DoubleVector_1size@20 + 67 42 00011030 _Java_CoolPropJNI_LongDoubleVector_1add@28 + 68 43 00010F50 _Java_CoolPropJNI_LongDoubleVector_1capacity@20 + 69 44 00011010 _Java_CoolPropJNI_LongDoubleVector_1clear@20 + 70 45 000110E0 _Java_CoolPropJNI_LongDoubleVector_1get@24 + 71 46 00010FD0 _Java_CoolPropJNI_LongDoubleVector_1isEmpty@20 + 72 47 00010FA0 _Java_CoolPropJNI_LongDoubleVector_1reserve@28 + 73 48 00011220 _Java_CoolPropJNI_LongDoubleVector_1set@32 + 74 49 00010F00 _Java_CoolPropJNI_LongDoubleVector_1size@20 + 75 4A 00015E80 _Java_CoolPropJNI_PropsSI_1_1SWIG_10@40 + 76 4B 00016350 _Java_CoolPropJNI_PropsSI_1_1SWIG_11@52 + 77 4C 000168D0 _Java_CoolPropJNI_PropsSI_1_1SWIG_12@60 + 78 4D 00011F10 _Java_CoolPropJNI_delete_1AbstractState@16 + 79 4E 00015510 _Java_CoolPropJNI_delete_1CoolProp_1SimpleState@16 + 80 4F 00011970 _Java_CoolPropJNI_delete_1DoubleVector@16 + 81 50 00011350 _Java_CoolPropJNI_delete_1LongDoubleVector@16 + 82 51 00017250 _Java_CoolPropJNI_get_1debug_1level@8 + 83 52 00017760 _Java_CoolPropJNI_get_1global_1param_1string@12 + 84 53 00015D00 _Java_CoolPropJNI_get_1input_1pair_1long_1desc@12 + 85 54 00015B80 _Java_CoolPropJNI_get_1input_1pair_1short_1desc@12 + 86 55 00015880 _Java_CoolPropJNI_get_1parameter_1index@12 + 87 56 000155F0 _Java_CoolPropJNI_get_1parameter_1information@16 + 88 57 00015A30 _Java_CoolPropJNI_match_1pair@32 + 89 58 000153B0 _Java_CoolPropJNI_new_1CoolProp_1SimpleState@8 + 90 59 000114F0 _Java_CoolPropJNI_new_1DoubleVector_1_1SWIG_10@8 + 91 5A 00011550 _Java_CoolPropJNI_new_1DoubleVector_1_1SWIG_11@16 + 92 5B 00010E30 _Java_CoolPropJNI_new_1LongDoubleVector_1_1SWIG_10@8 + 93 5C 00010E90 _Java_CoolPropJNI_new_1LongDoubleVector_1_1SWIG_11@16 + 94 5D 00017350 _Java_CoolPropJNI_set_1debug_1level@12 + 95 5E 00017420 _Java_CoolPropJNI_set_1error_1string@12 + 96 5F 000175C0 _Java_CoolPropJNI_set_1warning_1string@12 + + Summary + + 6000 .data + 98000 .rdata + 8000 .reloc + 97000 .text diff --git a/wrappers/Java/exports_x64.txt b/wrappers/Java/exports_x64.txt new file mode 100644 index 00000000..b818b9c7 --- /dev/null +++ b/wrappers/Java/exports_x64.txt @@ -0,0 +1,108 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 52FDF51A time date stamp Fri Feb 14 11:51:06 2014 + 0.00 version + 1 ordinal base + 79 number of functions + 79 number of names + + ordinal hint RVA name + + 1 0 000D8980 Java_CoolPropJNI_COOLPROP_1OK_1get + 2 1 000D9920 Java_CoolPropJNI_CubicInterp + 3 2 000DAC90 Java_CoolPropJNI_DerivTerms + 4 3 000DB1E0 Java_CoolPropJNI_F2K + 5 4 000DD050 Java_CoolPropJNI_HAHelp + 6 5 000DCAE0 Java_CoolPropJNI_HAProps + 7 6 000DCD60 Java_CoolPropJNI_HAProps_1Aux + 8 7 000DAAD0 Java_CoolPropJNI_IProps + 9 8 000DCEE0 Java_CoolPropJNI_IceProps + 10 9 000DAB90 Java_CoolPropJNI_IsFluidType + 11 A 000DB240 Java_CoolPropJNI_K2F + 12 B 000D9CF0 Java_CoolPropJNI_Kronecker_1delta + 13 C 000D8940 Java_CoolPropJNI_M_1PI_1get + 14 D 000D95E0 Java_CoolPropJNI_MatInv_12 + 15 E 000DADD0 Java_CoolPropJNI_Phase + 16 F 000DB030 Java_CoolPropJNI_Phase_1Tp + 17 10 000DAF00 Java_CoolPropJNI_Phase_1Trho + 18 11 000DA4D0 Java_CoolPropJNI_Props + 19 12 000DA9C0 Java_CoolPropJNI_Props1 + 20 13 000DA8B0 Java_CoolPropJNI_Props1SI + 21 14 000DA280 Java_CoolPropJNI_PropsS + 22 15 000DA660 Java_CoolPropJNI_PropsSI + 23 16 000D9820 Java_CoolPropJNI_QuadInterp + 24 17 000DD020 Java_CoolPropJNI_UseIdealGasEnthalpyCorrelations + 25 18 000DCFF0 Java_CoolPropJNI_UseIsothermCompressCorrelation + 26 19 000DCFC0 Java_CoolPropJNI_UseVirialCorrelations + 27 1A 000D89C0 Java_CoolPropJNI_ValidNumber + 28 1B 000DD110 Java_CoolPropJNI_cair_1sat + 29 1C 000DC860 Java_CoolPropJNI_conductivity_1background + 30 1D 000DC780 Java_CoolPropJNI_conductivity_1critical + 31 1E 000DC940 Java_CoolPropJNI_conformal_1Trho + 32 1F 000DBC40 Java_CoolPropJNI_disable_1TTSE_1LUT + 33 20 000DBE20 Java_CoolPropJNI_disable_1TTSE_1LUT_1writing + 34 21 000D9C80 Java_CoolPropJNI_double_1equal + 35 22 000DBB00 Java_CoolPropJNI_enable_1TTSE_1LUT + 36 23 000DBCE0 Java_CoolPropJNI_enable_1TTSE_1LUT_1writing + 37 24 000D8DA0 Java_CoolPropJNI_format + 38 25 000DB2A0 Java_CoolPropJNI_fromSI + 39 26 000DB5A0 Java_CoolPropJNI_get_1Fluid_1index + 40 27 000DC140 Java_CoolPropJNI_get_1TTSESinglePhase_1LUT_1range + 41 28 000DB790 Java_CoolPropJNI_get_1debug_1level + 42 29 000D8C50 Java_CoolPropJNI_get_1file_1contents + 43 2A 000D9F30 Java_CoolPropJNI_get_1fluid_1param_1string + 44 2B 000D9D50 Java_CoolPropJNI_get_1global_1param_1string + 45 2C 000DB640 Java_CoolPropJNI_get_1index_1units + 46 2D 000DB500 Java_CoolPropJNI_get_1param_1index + 47 2E 000DC570 Java_CoolPropJNI_get_1standard_1unit_1system + 48 2F 000D9720 Java_CoolPropJNI_interp1d + 49 30 000DBBA0 Java_CoolPropJNI_isenabled_1TTSE_1LUT + 50 31 000DBD80 Java_CoolPropJNI_isenabled_1TTSE_1LUT_1writing + 51 32 000D9BF0 Java_CoolPropJNI_max3 + 52 33 000D9B60 Java_CoolPropJNI_min3 + 53 34 000D97B0 Java_CoolPropJNI_powInt + 54 35 000DB980 Java_CoolPropJNI_psatL_1anc + 55 36 000DBA40 Java_CoolPropJNI_psatV_1anc + 56 37 000DB6F0 Java_CoolPropJNI_redirect_1stdout + 57 38 000DD070 Java_CoolPropJNI_returnHumAirCode + 58 39 000DB800 Java_CoolPropJNI_rhosatL_1anc + 59 3A 000DB8C0 Java_CoolPropJNI_rhosatV_1anc + 60 3B 000D9630 Java_CoolPropJNI_root_1sum_1square + 61 3C 000DBEC0 Java_CoolPropJNI_set_1TTSESat_1LUT_1size + 62 3D 000DC030 Java_CoolPropJNI_set_1TTSESinglePhase_1LUT_1range + 63 3E 000DBF70 Java_CoolPropJNI_set_1TTSESinglePhase_1LUT_1size + 64 3F 000DC260 Java_CoolPropJNI_set_1TTSE_1mode + 65 40 000DB7D0 Java_CoolPropJNI_set_1debug_1level + 66 41 000DB160 Java_CoolPropJNI_set_1phase + 67 42 000DC460 Java_CoolPropJNI_set_1reference_1stateD + 68 43 000DC360 Java_CoolPropJNI_set_1reference_1stateS + 69 44 000DC5B0 Java_CoolPropJNI_set_1standard_1unit_1system + 70 45 000D9A70 Java_CoolPropJNI_solve_1cubic + 71 46 000D9300 Java_CoolPropJNI_strjoin + 72 47 000D8A10 Java_CoolPropJNI_strlstrip + 73 48 000D8B30 Java_CoolPropJNI_strrstrip + 74 49 000D8F00 Java_CoolPropJNI_strsplit + 75 4A 000D8BC0 Java_CoolPropJNI_strstrip + 76 4B 000DB3D0 Java_CoolPropJNI_toSI + 77 4C 000D9120 Java_CoolPropJNI_upper + 78 4D 000DC5E0 Java_CoolPropJNI_viscosity_1dilute + 79 4E 000DC6A0 Java_CoolPropJNI_viscosity_1residual + + Summary + + 29000 .data + 2B000 .pdata + D4000 .rdata + 7000 .reloc + 293000 .text + 7000 data + 2000 text diff --git a/wrappers/Javascript/README.rst b/wrappers/Javascript/README.rst new file mode 100644 index 00000000..a280861f --- /dev/null +++ b/wrappers/Javascript/README.rst @@ -0,0 +1,18 @@ +Wrapper of CoolProp for Javascript +================================== + +Ian Bell, University of Liege, October 2013 + +Requirements +------------ +emscripten (https://github.com/kripken/emscripten) +A compiler (the Visual Studio 2010 C++ Express version should be fine) +python + +To Build +-------- +Run the script build.py + +To Run +------ +Open index.html in a browser \ No newline at end of file diff --git a/wrappers/Javascript/build.py b/wrappers/Javascript/build.py new file mode 100644 index 00000000..00e8932e --- /dev/null +++ b/wrappers/Javascript/build.py @@ -0,0 +1,39 @@ + +import subprocess, os +import glob2 as glob + +exports = ['-s','EXPORTED_FUNCTIONS=\"[\'_main\',\'_F2K\',\'_PropsSI\',\'_get_global_param_string\']\"'] +optimization = '-D__ISLINUX__ -O2 -s DISABLE_EXCEPTION_CATCHING=0' + +def compile_sources(): + for f in glob.glob(os.path.join('..','..','src','**','*.cpp')): + + call = [r'em++.bat',optimization,f,'-I../../include','-c','-DEXTERNC']+ exports + print 'Calling:',' '.join(call) + subprocess.check_output(' '.join(call), shell = True) + +def link(): + call = [r'C:\Users\Belli\Downloads\emsdk-1.16.0-portable-64bit\emscripten\1.16.0\em++',optimization,'-v','-o','coolprop.js']+glob.glob('*.o')+['-DEXTERNC'] + exports + print 'Calling:',' '.join(call) + subprocess.check_output(' '.join(call), shell = True) + +def closure_compiler(): + call = ['java','-Xmx1024m','-jar','compiler.jar','--js','coolprop.js','--js_output_file','coolprop2.js','--compilation_level','ADVANCED_OPTIMIZATIONS','--language_in','ECMASCRIPT5'] + print 'Using the closure compiler, this will take a while... (from https://developers.google.com/closure/compiler/)' + print 'Calling:',' '.join(call) + subprocess.check_output(' '.join(call), shell = True) + +def cleanup(): + for file in glob.glob('*.o'): + print 'removing',file + os.remove(file) + +def run(): + os.startfile('index.html') + +if __name__=='__main__': + compile_sources() + link() + #closure_compiler() + cleanup() + #run() \ No newline at end of file diff --git a/wrappers/Javascript/build_linux.sh b/wrappers/Javascript/build_linux.sh new file mode 100644 index 00000000..ea31cf7f --- /dev/null +++ b/wrappers/Javascript/build_linux.sh @@ -0,0 +1,10 @@ +em++ -O2 ../../CoolProp/*.cpp -I../../CoolProp -c -s EXPORTED_FUNCTIONS="['_main','_F2K','_Props1','_PropsS']" +em++ -O2 -o coolprop.js ../../CoolProp/CoolPropDLL.cpp *.o -I../../CoolProp -DEXTERNC -s EXPORTED_FUNCTIONS="['_main','_F2K','_Props1','_PropsS']" + +# Can only use compression with HTML :( +# --compression ~/Code/emscripten/third_party/lzma.js/lzma-native,/home/xubuntu/Code/emscripten/third_party/lzma.js/lzma-decoder.js,LZMA.decompress + +# Using closure compiler to compress javascript file +#java -jar compiler.jar --js precursor.js --js_output_file coolprop.js --compilation_level ADVANCED_OPTIMIZATIONS --language_in ECMASCRIPT5 + +rm *.o \ No newline at end of file diff --git a/wrappers/Javascript/index.html b/wrappers/Javascript/index.html new file mode 100644 index 00000000..e6637ad0 --- /dev/null +++ b/wrappers/Javascript/index.html @@ -0,0 +1,98 @@ + + + + +CoolProp Javascript example + + + + + + + + + + +
    + + +
    +
    + + + +
    +
    + + + +
    + + +
    + +
    +
    +

    +

    + + + + + + \ No newline at end of file diff --git a/wrappers/Labview/BuildDLL.bat b/wrappers/Labview/BuildDLL.bat new file mode 100644 index 00000000..6ecfb849 --- /dev/null +++ b/wrappers/Labview/BuildDLL.bat @@ -0,0 +1,14 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" +REM ******* compile all the sources *************** + +cl /MP3 /O2 /Oi /GL /I "..\..\CoolProp" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LABVIEW_RT_EXPORTS" /D "COOLPROP_LIB" /D "CONVENTION=__cdecl" /D "_WINDLL" /FD /EHsc /MT /Gy /W3 /c /Zi /TP ..\..\CoolProp\*.cpp + +link /OUT:"CoolProp.dll" /INCREMENTAL:NO /NOLOGO /DLL /MANIFEST:NO /DEBUG /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib *.obj + +dumpbin /EXPORTS CoolProp.dll > exports.txt +erase *.obj +erase *.pdb +erase *.idb +erase *.lib +erase *.exp diff --git a/wrappers/Labview/CoolProp & Labview.docx b/wrappers/Labview/CoolProp & Labview.docx new file mode 100644 index 00000000..99dbccc4 Binary files /dev/null and b/wrappers/Labview/CoolProp & Labview.docx differ diff --git a/wrappers/Labview/CoolProp.vi b/wrappers/Labview/CoolProp.vi new file mode 100644 index 00000000..303707ab Binary files /dev/null and b/wrappers/Labview/CoolProp.vi differ diff --git a/wrappers/Labview/Coolprop.llb b/wrappers/Labview/Coolprop.llb new file mode 100644 index 00000000..912341ed Binary files /dev/null and b/wrappers/Labview/Coolprop.llb differ diff --git a/wrappers/Labview/README.rst b/wrappers/Labview/README.rst new file mode 100644 index 00000000..add3189e --- /dev/null +++ b/wrappers/Labview/README.rst @@ -0,0 +1,39 @@ +Labview wrapper of CoolProp +============================ + +by Ian Bell, Arnaud Legros, Jan Nolens and Sergei Gusev + +University of Liege, Ghent University + +October 2013 + +Available libraries +------------------- +CoolProp.vi: +Basic Library to get the properties from CoolProp.dll + +CoolProp.llb +More advanced library, allowing to compute thermodynamic diagrams, real-time calculation of properties, +measurement processing, etc. + +See the Diagrams_coolprop.vi in the LLB to get started. To use, you must update the path to the CoolProp.dll file in the VI. + +To Install +---------- +1. Copy the files CoolProp.vi, Coolprop.llb and CoolProp.dll from this folder to somewhere you want +2. Add CoolProp module to your code + +To Use +------ +Call it using the same sorts of input parameters as Props function : http://coolprop.sourceforge.net/apidoc/CoolProp.html#CoolProp.CoolProp.Props + +Notes +----- +Wrapper currently in its infancy, absolutely no error checking is carried out, use at your own risk. + +For Developers +-------------- + +1. To regenerate DLL, run the build script (wrappers/Labview/BuildDLL.bat). You will need to have Visual Studio 2010 installed, or change the path to vcvarsall.bat in build script +2. Uses __cdecl in combination with extern "C" to make Labview happy +3. For realtime targets, instructions are here: http://www.ni.com/white-paper/5694/en diff --git a/wrappers/Labview/exports.txt b/wrappers/Labview/exports.txt new file mode 100644 index 00000000..9e22ee98 --- /dev/null +++ b/wrappers/Labview/exports.txt @@ -0,0 +1,77 @@ +Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp.dll + +File Type: DLL + + Section contains the following exports for CoolProp.dll + + 00000000 characteristics + 52FDF54F time date stamp Fri Feb 14 11:51:59 2014 + 0.00 version + 1 ordinal base + 51 number of functions + 51 number of names + + ordinal hint RVA name + + 1 0 000788D0 DerivTerms = _DerivTerms + 2 1 00078480 F2K = _F2K + 3 2 000BF110 HAProps = _HAProps + 4 3 000C0150 HAProps_Aux = _HAProps_Aux + 5 4 00074CB0 IProps = _IProps + 6 5 00072B40 IsFluidType = _IsFluidType + 7 6 00078460 K2F = _K2F + 8 7 00079850 Phase = _Phase_Tp + 9 8 00079850 Phase_Tp = _Phase_Tp + 10 9 000798F0 Phase_Trho = _Phase_Trho + 11 A 000784A0 PrintSaturationTable = _PrintSaturationTable + 12 B 00078280 Props = _Props + 13 C 000783E0 Props1 = _Props1 + 14 D 00078320 Props1SI = _Props1SI + 15 E 00078240 PropsS = _PropsS + 16 F 00078360 PropsSI = _PropsSI + 17 10 00079380 conductivity_background = _conductivity_background + 18 11 000792F0 conductivity_critical = _conductivity_critical + 19 12 00078FA0 conformal_Trho = _conformal_Trho + 20 13 00079A90 disable_TTSE_LUT = _disable_TTSE_LUT + 21 14 00079BA0 disable_TTSE_LUT_writing = _disable_TTSE_LUT_writing + 22 15 000799E0 enable_TTSE_LUT = _enable_TTSE_LUT + 23 16 00079AF0 enable_TTSE_LUT_writing = _enable_TTSE_LUT_writing + 24 17 00078960 fromSI = _fromSI + 25 18 000789E0 get_Fluid_index = _get_Fluid_index + 26 19 00079D40 get_TTSESinglePhase_LUT_range = _get_TTSESinglePhase_LUT_range + 27 1A 000789C0 get_debug_level = _get_debug_level + 28 1B 000797A0 get_fluid_param_string = _get_fluid_param_string + 29 1C 00079710 get_global_param_string = _get_global_param_string + 30 1D 00078A30 get_index_units = _get_index_units + 31 1E 00078F50 get_param_index = _get_param_index + 32 1F 00079E40 get_standard_unit_system = _get_standard_unit_system + 33 20 00079A40 isenabled_TTSE_LUT = _isenabled_TTSE_LUT + 34 21 00079B50 isenabled_TTSE_LUT_writing = _isenabled_TTSE_LUT_writing + 35 22 00079570 psatL_anc = _psatL_anc + 36 23 00079640 psatV_anc = _psatV_anc + 37 24 00078130 redirect_stdout = _redirect_stdout + 38 25 000793F0 rhosatL_anc = _rhosatL_anc + 39 26 000794B0 rhosatV_anc = _rhosatV_anc + 40 27 00079C00 set_TTSESat_LUT_size = _set_TTSESat_LUT_size + 41 28 00079CC0 set_TTSESinglePhase_LUT_range = _set_TTSESinglePhase_LUT_range + 42 29 00079C60 set_TTSESinglePhase_LUT_size = _set_TTSESinglePhase_LUT_size + 43 2A 00078A90 set_TTSE_mode = _set_TTSE_mode + 44 2B 000789D0 set_debug_level = _set_debug_level + 45 2C 00079990 set_phase = _set_phase + 46 2D 000781D0 set_reference_stateD = _set_reference_stateD + 47 2E 00078150 set_reference_stateS = _set_reference_stateS + 48 2F 00079E50 set_standard_unit_system = _set_standard_unit_system + 49 30 00078990 toSI = _toSI + 50 31 00079190 viscosity_dilute = _viscosity_dilute + 51 32 00079230 viscosity_residual = _viscosity_residual + + Summary + + 1F000 .data + 70000 .rdata + 21000 .reloc + 175000 .text diff --git a/wrappers/Labview/vxWorks/Makefile b/wrappers/Labview/vxWorks/Makefile new file mode 100644 index 00000000..738498b0 --- /dev/null +++ b/wrappers/Labview/vxWorks/Makefile @@ -0,0 +1,72 @@ +# These variables control the compiler and linker flags. Change them as +# appropriate. +DEBUG_MODE = 0 + +ADDED_CFLAGS = -D__powerpc__ -DDISABLE_CATCH + +ifeq ($(DEBUG_MODE),1) +OBJ_DIR := PPC603gnu_DEBUG +CFLAGS = -g -mlongcall +else +OBJ_DIR := PPC603gnu +CFLAGS = -Os -fstrength-reduce -fno-builtin -fno-strict-aliasing -mlongcall +endif + +LINKFLAGS = $(CFLAGS) -v +LIBPATH = + +# List all the *compiled* object files here, under the OBJ_DIR +# directory. Make will automatically locate the source file and +# compile it. +OBJECTS := $(subst ../../../CoolProp/,$(OBJ_DIR)/,$(subst .cpp,.o,$(wildcard ../../../CoolProp/*.cpp))) + +# This is the name of the output shared library. +PROJECT_TARGETS := $(OBJ_DIR)/CoolProp.out + +# If you have other VxWorks .a files to reference, list them here. +LIBS = +LIBPATH = + +# Everything after this line should not need to be modified for +# basic compilation. However, significant changes to the build structure +# will probably involve modifying these lines. + +WIND_BASE := $(subst \,/,$(WIND_BASE)) + +CPU = PPC603 +TOOL_FAMILY = gnu +TOOL = gnu +CC_ARCH_SPEC = -mcpu=603 -mstrict-align -mno-implicit-fp + +IDE_INCLUDES = -I$(WIND_BASE)/target/h -I$(WIND_BASE)/target/h/wrn/coreip -I../../../CoolProp + +# This basic rule compiles a .c file into a .o file. It can be adapted to +# all other source files that gcc can compile, including assembly (.s) and +# C++ (.cpp, .cc, .C, .cxx) files. To enable support for those extensions, +# copy this rule and modify its extension and compile flags for the +# required source file type. +$(OBJ_DIR)/%.o : ../../../CoolProp/%.c + ccppc $(CFLAGS) $(CC_ARCH_SPEC) -ansi -Wall -MD -MP $(ADDED_CFLAGS) $(IDE_INCLUDES) $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o "$@" -c "$<" + +# Adapted rule for .cpp files +$(OBJ_DIR)/%.o : ../../../CoolProp/%.cpp + c++ppc $(CFLAGS) $(CC_ARCH_SPEC) -ansi -Wall -MD -MP $(ADDED_CFLAGS) $(IDE_INCLUDES) $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o "$@" -c "$<" + +all : check_objectdir $(PROJECT_TARGETS) + +$(PROJECT_TARGETS) : $(OBJECTS) + rm -f "$@" ctdt.c;nmppc $(OBJECTS) | tclsh $(WIND_BASE)/host/resource/hutils/tcl/munch.tcl -c ppc > ctdt.c + ccppc $(LINKFLAGS) $(CC_ARCH_SPEC) -fdollars-in-identifiers -Wall $(ADDED_CFLAGS) $(IDE_INCLUDES) $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o ctdt.o -c ctdt.c + ccppc -r -nostdlib -Wl,-X -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT -o "$@" $(OBJECTS) $(LIBPATH) $(LIBS) $(ADDED_LIBPATH) $(ADDED_LIBS) ctdt.o + rm -f ctdt.c ctdt.o + + +check_objectdir : + @if [ ! -d "$(OBJ_DIR)" ]; then\ + mkdir -p $(OBJ_DIR);\ + fi + +clean : + rm -f $(OBJECTS) $(PROJECT_TARGETS) $(wildcard $(OBJ_DIR)/*.unstripped) + +.DUMMY: check_objectdir clean diff --git a/wrappers/Labview/vxWorks/README.rst b/wrappers/Labview/vxWorks/README.rst new file mode 100644 index 00000000..06844bbd --- /dev/null +++ b/wrappers/Labview/vxWorks/README.rst @@ -0,0 +1,29 @@ +Steps +----- + +1. Download a WinXP 32-bit version virtual box image +2. Install Winxp 32-bit virtual box image, install 7zip, tortoisegit, git +3. Take the updated_vxworks63gccdist.ZIP from (http://www.ni.com/white-paper/5694/en/) and extract to c:\\gccdist so that you have folders c:\\gccdist\\docs, c:\\gccdist\\supplemental, c:\\gccdist\\WindRiver +4. Check out coolprop sources +5. Open a console and cd to CoolProp sources +6. cd to wrappers/Labview/vxWorks +7. run build.bat (It can take a really long time (several minutes) for some reason for Mixtures.cpp, be patient) +8. Upload the generated file CoolProp.out to ni-rt/system folder using the National Instruments Measurement & Automation Explorer. Right click on the unit, then file transfer. Also see http://www.ni.com/white-paper/3365/en/ + +Debugging +--------- +1. Go to the IP address of the cRIO in your browser (I found IE worked better than Chrome for this) +2. Create a new session +3. Go to the console (You will need to have this enabled on your cRIO) +4. Try to run the VI on the cRIO, it will try to load the module and print out the errors that occur (if any) when loading the module + +Fixing Problems +--------------- +Make variables static if at all possible +Do not enable Catch (it uses language features that are incompatible with vxWorks cRIO) + +To be determined: What do do about _Dtest, _Nan, _Inf ?? + +See Also +-------- +https://decibel.ni.com/content/docs/DOC-13537 \ No newline at end of file diff --git a/wrappers/Labview/vxWorks/build.bat b/wrappers/Labview/vxWorks/build.bat new file mode 100644 index 00000000..5b8b2c68 --- /dev/null +++ b/wrappers/Labview/vxWorks/build.bat @@ -0,0 +1,4 @@ +call c:\gccdist\supp\setup-gcc.bat +make +nmppc PPC603gnu/CoolProp.out > exports.txt +for %%f in (PPC603gnu/*.o) do nmppc PPC603gnu/%%f > %%~nf.txt \ No newline at end of file diff --git a/wrappers/MATLAB/HAProps.c b/wrappers/MATLAB/HAProps.c new file mode 100644 index 00000000..8f55a04d --- /dev/null +++ b/wrappers/MATLAB/HAProps.c @@ -0,0 +1,51 @@ +#include "mex.h" /*--This one is required*/ + +/* Prototype for the Props function to be called. Can't use the CoolProp.h header because there are a lot of + c++ parts in the header that cannot be easily hidden when compiling */ +double HAProps(char *Output, char* Name1, double Prop1, char* Name2, double Prop2, char* Name3, double Prop3); + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int npol,Nel; + int m,n,u,v,k,Output_len,Name1_len,Name2_len,Name3_len; + int *c,status; + double *d,Prop1,Prop2,Prop3,x,y; + char *Output,*Name1,*Name2,*Name3,errstr[1000]; + mxArray *cMat[1]; + + /* Create matrix for the return argument. */ + plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL); + + if (nrhs == 7 && mxIsChar (prhs[0]) && mxIsChar (prhs[1]) && mxIsChar (prhs[3]) && mxIsChar (prhs[5])) + { + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Output_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Output = mxCalloc(Output_len, sizeof(char)); + status = mxGetString(prhs[0], Output, Output_len); + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Name1_len=(mxGetM(prhs[1]) * mxGetN(prhs[1])) + 1; + Name1 = mxCalloc(Name1_len, sizeof(char)); + mxGetString(prhs[1], Name1, Name1_len); + + Name2_len=(mxGetM(prhs[3]) * mxGetN(prhs[3])) + 1; + Name2 = mxCalloc(Name2_len, sizeof(char)); + mxGetString(prhs[3], Name2, Name2_len); + + Name3_len=(mxGetM(prhs[5]) * mxGetN(prhs[5])) + 1; + Name3 = mxCalloc(Name3_len, sizeof(char)); + mxGetString(prhs[5], Name3, Name3_len); + + Prop1 = mxGetScalar(prhs[2]); + Prop2 = mxGetScalar(prhs[4]); + Prop3 = mxGetScalar(prhs[6]); + + x = HAProps(Output,Name1,Prop1,Name2,Prop2,Name3,Prop3); + *mxGetPr(plhs[0])=x; + } + else + { + mexErrMsgTxt("Bad inputs to HAProps"); + } +} \ No newline at end of file diff --git a/wrappers/MATLAB/MATLABBuilder.m b/wrappers/MATLAB/MATLABBuilder.m new file mode 100644 index 00000000..92387338 --- /dev/null +++ b/wrappers/MATLAB/MATLABBuilder.m @@ -0,0 +1,42 @@ + +%The path to the main folder of the CoolProp source +path_to_src = '../../CoolProp/' + +%All the include folders we need +include_string = [' -I',path_to_src]; + +if isempty(strfind(mexext(),'32')) + mexopts_string = ' ' +else + mexopts_string = ' -f mexopts_w32.bat -DCONVENTION=__cdecl ' +end + +%List of files to be compiled to object files +main_files = dir([path_to_src,'*.cpp']); +main_files = cellfun(@(x) x, {main_files.name}, 'uniformoutput', false)'; + +%Append path to source to the list of the CoolProp main files +for i=1:size(main_files,1) + main_files{i,1} = [path_to_src,main_files{i,1}]; +end + +files=[main_files]; +o_files = ''; +cpp_files = ''; + +for i=1:size(files,1) + file = files{i,1}; + o_file = strrep(file,'.cpp','.obj'); + o_files = [o_files, ' ', o_file]; + cpp_files = [cpp_files, ' ',file]; + eval(['mex -c', include_string,mexopts_string,' -DCOOLPROP_LIB -outdir . ',file]) + disp(file) +end + +%Build the MEX files +eval(['mex ', include_string,mexopts_string,' Props.c *.obj']) +eval(['mex ', include_string,mexopts_string,' PropsSI.c *.obj']) +eval(['mex ', include_string,mexopts_string,' HAProps.c *.obj']) + +%Clean up - delete the obj files +delete('*.obj') diff --git a/wrappers/MATLAB/MATLABBuilder_OSX.m b/wrappers/MATLAB/MATLABBuilder_OSX.m new file mode 100644 index 00000000..c70f27d1 --- /dev/null +++ b/wrappers/MATLAB/MATLABBuilder_OSX.m @@ -0,0 +1,41 @@ + +%The path to the main folder of the CoolProp source +path_to_src = '../../CoolProp/' + +%All the include folders we need +include_string = [' -I',path_to_src]; +% Add ",' -ldl'" to the above in order to compile with refprop support on +% Linux: include_string = [' -I',path_to_src,' -ldl']; + +%List of files to be compiled to object files +bare_files = dir([path_to_src,'*.cpp']); +bare_files = cellfun(@(x) x, {bare_files.name}, 'uniformoutput', false)'; + +% A copy +main_files = bare_files; + +%Append path to source to the list of the CoolProp main files +for i=1:size(main_files,1) + main_files{i,1} = [path_to_src,main_files{i,1}]; +end + +files = main_files; +o_files = ''; + +for i=1:size(files,1) + file = files{i,1}; + o_file = strrep(bare_files{i,1},'.cpp','.o'); + o_files = [o_files,' ',o_file]; + disp(file); + eval(['mex -DEXTERNC -c', include_string,' -outdir . ',file]) +end + +%Build the MEX files +eval(['mex -v ', include_string,' Props.c ', o_files]) +eval(['mex -v ', include_string,' HAProps.c ', o_files]) + +%Clean up - delete the obj files +delete('*.o') + +%Quit MATLAB +%quit diff --git a/wrappers/MATLAB/MATLAB_sample.m b/wrappers/MATLAB/MATLAB_sample.m new file mode 100644 index 00000000..05449873 --- /dev/null +++ b/wrappers/MATLAB/MATLAB_sample.m @@ -0,0 +1,19 @@ +disp 'Critical temperature of R410A' +Tc = Props('R410A','Tcrit') +disp 'should yield 344.494' + +disp 'Density of carbon dioxide (R744) at 100 bar and 25C' +rho = Props('D','T',298.15,'P',10000,'R744') +disp 'should yield 817.6342521183478' + +disp 'Saturated vapor enthalpy [kJ/kg] of R134a at STP' +rho = Props('H','T',298.15,'Q',1,'R134a') +disp 'should yield 412.333953231868' + +disp 'Enthalpy (kJ per kg dry air) as a function of temperature, pressure, and 50% relative humidity at STP' +h = HAProps('H','T',298.15,'P',101.325,'R',0.5) +disp 'should yield 50.4323691981' + +disp('Temperature of saturated air at the previous enthalpy') +T = HAProps('T','P',101.325,'H',h,'R',1.0) +disp 'should yield 290.962139387' \ No newline at end of file diff --git a/wrappers/MATLAB/Props.c b/wrappers/MATLAB/Props.c new file mode 100644 index 00000000..cccbf3d8 --- /dev/null +++ b/wrappers/MATLAB/Props.c @@ -0,0 +1,172 @@ +#include "mex.h" /*--This one is required*/ + +/* Prototype for the Props function to be called. Can't use the CoolProp.h header because there are a lot of + c++ parts in the header that cannot be easily hidden when compiling */ +double Props(char *Output, char Name1, double Prop1, char Name2, double Prop2, char * Ref); +double Props1(char *Output, char * Ref); +long get_global_param_string(char*, char*); +long get_fluid_param_string(char *fluid, char *param, char * Output); +long get_standard_unit_system(void); +void set_standard_unit_system(long); +#include "GlobalConstants.h" +#include "float.h" + +bool ValidNumber(double x) +{ + // Idea from http://www.johndcook.com/IEEE_exceptions_in_cpp.html + return (x <= DBL_MAX && x >= -DBL_MAX); +}; + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int npol,Nel; + int m,n,u,v,k,Output_len,Name1_len,Name2_len,Ref_len,Param_len; + int *c,status; + double *d,Prop1,Prop2,x,y; + char *Output,*Name1,*Name2,*Ref,*Param,errstr[1000],errstr2[1000],fluidslist[10000]; + double val; + mxArray *cMat[1]; + + if (nrhs == 2 && mxIsChar (prhs[0]) && mxIsChar (prhs[1])) + { + /* Get the refrigerant (it is a string) (+1 for the NULL terminator)*/ + Ref_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + status = mxGetString(prhs[0], Ref, Ref_len); + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Output_len=(mxGetM(prhs[1]) * mxGetN(prhs[1])) + 1; + Output = mxCalloc(Output_len, sizeof(char)); + status = mxGetString(prhs[1], Output, Output_len); + + /* Try to shortcut to get the strings for the fluid */ + if (!strcmp(Output,"aliases") || !strcmp(Output,"CAS") || !strcmp(Output,"CAS_number") || !strcmp(Output,"ASHRAE34") || !strcmp(Output,"REFPROPName") || !strcmp(Output,"REFPROP_name") || !strcmp(Output,"TTSE_mode")) + { + get_fluid_param_string(Ref,Output,fluidslist); + plhs[0] = mxCreateString(fluidslist); + return; + } + else if (!strcmp(Output,"enable_TTSE")) + { + enable_TTSE_LUT(Ref); + return; + } + else if (!strcmp(Output,"disable_TTSE")) + { + disable_TTSE_LUT(Ref); + return; + } + + /* Ok, now try to get the values for the fluid */ + + /* Create matrix for the return argument. */ + plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL); + + /* Get the value*/ + val = Props1(Ref,Output); + /* If it is a good value, return it*/ + if (ValidNumber(val)) + { + *mxGetPr(plhs[0]) = val; + } + /* Otherwise there was an error, return the CoolProp error*/ + else + { + get_global_param_string("errstring",errstr); + sprintf(errstr2,"CoolProp Error: %s",errstr); + mexErrMsgTxt(errstr2); + } + } + else if (nrhs == 6 && mxIsChar (prhs[0]) && mxIsChar (prhs[1]) && mxIsChar (prhs[3]) && mxIsChar (prhs[5]) ) + { + /* Create matrix for the return argument. */ + plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL); + + /* Get the refrigerant (it is a string) (+1 for the NULL terminator)*/ + Ref_len=(mxGetM(prhs[5]) * mxGetN(prhs[5])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Output_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Output = mxCalloc(Output_len, sizeof(char)); + + status = mxGetString(prhs[5], Ref, Ref_len); + status = mxGetString(prhs[0], Output, Output_len); + + Name1_len=(mxGetM(prhs[1]) * mxGetN(prhs[1])) + 1; + Name1 = mxCalloc(Name1_len, sizeof(char)); + mxGetString(prhs[1], Name1, Name1_len); + + Name2_len=(mxGetM(prhs[3]) * mxGetN(prhs[3])) + 1; + Name2 = mxCalloc(Name2_len, sizeof(char)); + mxGetString(prhs[3], Name2, Name2_len); + + Prop1 = mxGetScalar(prhs[2]); + Prop2 = mxGetScalar(prhs[4]); + + val = Props(Output,Name1[0],Prop1,Name2[0],Prop2,Ref); + + /* If it is a good value, return it */ + if (ValidNumber(val)) + { + *mxGetPr(plhs[0]) = val; + } + /* Otherwise there was an error, return the CoolProp error*/ + else + { + get_global_param_string("errstring",errstr); + sprintf(errstr2,"CoolProp Error: %s",errstr); + mexErrMsgTxt(errstr2); + } + } + else if (nrhs == 1 && mxIsChar (prhs[0])) + { + Ref_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + status = mxGetString(prhs[0], Ref, Ref_len); + + if (!strcmp(Ref,"FluidsList")){ + get_global_param_string("FluidsList",fluidslist); + } + else if (!strcmp(Ref,"version")){ + get_global_param_string("version",fluidslist); + } + else if (!strcmp(Ref,"gitrevision")){ + get_global_param_string("gitrevision", fluidslist); + } + else if (!strcmp(Ref,"set_UNIT_SYSTEM_SI")) + { + set_standard_unit_system(UNIT_SYSTEM_SI); + mexPrintf("Unit system set to SI\n"); + return; + } + else if (!strcmp(Ref,"set_UNIT_SYSTEM_KSI")) + { + set_standard_unit_system(UNIT_SYSTEM_KSI); + mexPrintf("Unit system set to KSI\n"); + return; + } + else if (!strcmp(Ref,"get_unit_system")) + { + switch (get_standard_unit_system()) + { + case UNIT_SYSTEM_SI: + plhs[0] = mxCreateString("UNIT_SYSTEM_SI"); break; + case UNIT_SYSTEM_KSI: + plhs[0] = mxCreateString("UNIT_SYSTEM_SI"); break; + } + return; + } + else + { + sprintf(errstr2,"single input is invalid: %s",Ref); + mexErrMsgTxt(errstr2); + } + plhs[0] = mxCreateString(fluidslist); + return; + } + else + { + mexErrMsgTxt("Props must either receive two strings or the signature Props(Output,Param1,Value1,Param2,Value2,FluidName)"); + } +} diff --git a/wrappers/MATLAB/PropsSI.c b/wrappers/MATLAB/PropsSI.c new file mode 100644 index 00000000..13886df2 --- /dev/null +++ b/wrappers/MATLAB/PropsSI.c @@ -0,0 +1,148 @@ +#include "mex.h" /*--This one is required*/ + +/* Prototype for the Props function to be called. Can't use the CoolProp.h header because there are a lot of + c++ parts in the header that cannot be easily hidden when compiling */ +double PropsSI(char *Output, char *Name1, double Prop1, char *Name2, double Prop2, char * Ref); +double Props1(char *Output, char * Ref); +long get_global_param_string(char*, char*); +long get_fluid_param_string(char *fluid, char *param, char * Output); +long get_standard_unit_system(void); +void set_standard_unit_system(long); +#include "GlobalConstants.h" +#include "float.h" + +bool ValidNumber(double x) +{ + // Idea from http://www.johndcook.com/IEEE_exceptions_in_cpp.html + return (x <= DBL_MAX && x >= -DBL_MAX); +}; + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int npol,Nel; + int m,n,u,v,k,Output_len,Name1_len,Name2_len,Ref_len,Param_len; + int *c,status; + double *d,Prop1,Prop2,x,y; + char *Output,*Name1,*Name2,*Ref,*Param,errstr[1000],errstr2[1000],fluidslist[10000]; + double val; + mxArray *cMat[1]; + + if (nrhs == 2 && mxIsChar (prhs[0]) && mxIsChar (prhs[1])) + { + /* Get the refrigerant (it is a string) (+1 for the NULL terminator)*/ + Ref_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + status = mxGetString(prhs[0], Ref, Ref_len); + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Output_len=(mxGetM(prhs[1]) * mxGetN(prhs[1])) + 1; + Output = mxCalloc(Output_len, sizeof(char)); + status = mxGetString(prhs[1], Output, Output_len); + + /* Try to shortcut to get the strings for the fluid */ + if (!strcmp(Output,"aliases") || !strcmp(Output,"CAS") || !strcmp(Output,"CAS_number") || !strcmp(Output,"ASHRAE34") || !strcmp(Output,"REFPROPName") || !strcmp(Output,"REFPROP_name") || !strcmp(Output,"TTSE_mode")) + { + get_fluid_param_string(Ref,Output,fluidslist); + plhs[0] = mxCreateString(fluidslist); + return; + } + else if (!strcmp(Output,"enable_TTSE")) + { + enable_TTSE_LUT(Ref); + return; + } + else if (!strcmp(Output,"disable_TTSE")) + { + disable_TTSE_LUT(Ref); + return; + } + + /* Ok, now try to get the values for the fluid */ + + /* Create matrix for the return argument. */ + plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL); + + /* Get the value*/ + val = Props1(Ref,Output); + /* If it is a good value, return it*/ + if (ValidNumber(val)) + { + *mxGetPr(plhs[0]) = val; + } + /* Otherwise there was an error, return the CoolProp error*/ + else + { + get_global_param_string("errstring",errstr); + sprintf(errstr2,"CoolProp Error: %s",errstr); + mexErrMsgTxt(errstr2); + } + } + else if (nrhs == 6 && mxIsChar (prhs[0]) && mxIsChar (prhs[1]) && mxIsChar (prhs[3]) && mxIsChar (prhs[5]) ) + { + /* Create matrix for the return argument. */ + plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL); + + /* Get the refrigerant (it is a string) (+1 for the NULL terminator)*/ + Ref_len=(mxGetM(prhs[5]) * mxGetN(prhs[5])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + mxGetString(prhs[5], Ref, Ref_len); + + /* Get the output (it is a string) (+1 for the NULL terminator)*/ + Output_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Output = mxCalloc(Output_len, sizeof(char)); + mxGetString(prhs[0], Output, Output_len); + + Name1_len=(mxGetM(prhs[1]) * mxGetN(prhs[1])) + 1; + Name1 = mxCalloc(Name1_len, sizeof(char)); + mxGetString(prhs[1], Name1, Name1_len); + + Name2_len=(mxGetM(prhs[3]) * mxGetN(prhs[3])) + 1; + Name2 = mxCalloc(Name2_len, sizeof(char)); + mxGetString(prhs[3], Name2, Name2_len); + + Prop1 = mxGetScalar(prhs[2]); + Prop2 = mxGetScalar(prhs[4]); + + val = PropsSI(Output,Name1,Prop1,Name2,Prop2,Ref); + + /* If it is a good value, return it */ + if (ValidNumber(val)) + { + *mxGetPr(plhs[0]) = val; + } + /* Otherwise there was an error, return the CoolProp error*/ + else + { + get_global_param_string("errstring",errstr); + sprintf(errstr2,"CoolProp Error: %s",errstr); + mexErrMsgTxt(errstr2); + } + } + else if (nrhs == 1 && mxIsChar (prhs[0])) + { + Ref_len=(mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; + Ref = mxCalloc(Ref_len, sizeof(char)); + status = mxGetString(prhs[0], Ref, Ref_len); + + if (!strcmp(Ref,"FluidsList")){ + get_global_param_string("FluidsList",fluidslist); + } + else if (!strcmp(Ref,"version")){ + get_global_param_string("version",fluidslist); + } + else if (!strcmp(Ref,"gitrevision")){ + get_global_param_string("gitrevision", fluidslist); + } + else + { + sprintf(errstr2,"single input is invalid: %s",Ref); + mexErrMsgTxt(errstr2); + } + plhs[0] = mxCreateString(fluidslist); + return; + } + else + { + mexErrMsgTxt("Props must either receive two strings or the signature Props(Output,Param1,Value1,Param2,Value2,FluidName)"); + } +} diff --git a/wrappers/MATLAB/README.rst b/wrappers/MATLAB/README.rst new file mode 100644 index 00000000..cf7fcbaa --- /dev/null +++ b/wrappers/MATLAB/README.rst @@ -0,0 +1,58 @@ +The *.mexw64 files in this folder are wrappers of CoolProp for 64-bit MATLAB on Windows +The *.mexw32 files in this folder are wrappers of CoolProp for 32-bit MATLAB on Windows +You can tell what type of MATLAB you have when you start up MATLAB. It will say on the splash screen + +Place them somewhere on the MATLAB path, or add their containing folder to the MATLAB path. + +For Users +========= +There is an example file called MATLAB_sample.m that when run will demonstrate calling both +Props (for fluid properties) and HAProps(for humid air properties) + +Due to the poor integration of MATLAB and C/C++ code, the wrapper for MATLAB is +a mess compared with other languages, and does not follow the +semantics of the other languages. + +The "normal" calls of Props(Ref,Output) and Props(Output,Name1,Val1,Name2,Val2,Fluid) +work just like the other wrappers. Here is a summary of the other hacky things +that have been added to the MATLAB wrapper: + +For a given fluid, you can use one of the following types of calls to get the given output:: + + Props(Fluid,'aliases') : Returns a comma separated string of aliases for a given fluid + Props(Fluid,'CAS') : Returns CAS code for the given fluid + Props(Fluid,'ASHRAE34') : Returns ASHRAE 34 safety code + Props(Fluid,'REFPROPName') : Returns REFPROP name for fluid + Props(Fluid,'TTSE_mode') : Returns TTSE mode, one of 'TTSE' or 'BICUBIC' + Props(Fluid,'enable_TTSE') : Turn on tabular interpolation for a given fluid + Props(Fluid,'disable_TTSE') : Turn on tabular interpolation for a given fluid + +Or you can get a global constant using a call like:: + + Props('FluidsList') : Returns a comma separated string of fluids in CoolProp + Props('version') : Returns the version of Coolprop in Use + Props('gitrevision') : Returns the git revision + Props('set_UNIT_SYSTEM_SI') : Set the unit system to SI units + Props('set_UNIT_SYSTEM_KSI') : Set the unit system to kilo-SI units + Props('get_unit_system') : Get the unit system in use, one of 'UNIT_SYSTEM_SI' or 'UNIT_SYSTEM_KSI' + +For Developers +============== +To build the mex files on windows, you should enter these commands at the command prompt:: + + git clone https://github.com/ibell/coolprop coolprop-code + cd coolprop-code/wrappers/MATLAB + matlab -r MATLABBuilder.m + +You will need to have git installed (google it). You will also need a compiler installed (Visual studio express works). You might need to run mex -setup to select the compiler + +On OSX/Linux, the same idea. Do this:: + + git clone https://github.com/ibell/coolprop coolprop-code + cd coolprop-code/wrappers/MATLAB + # Change line 6 MATLABBuilder_OSX.m according to instructions in file. + matlab -r MATLABBuilder_OSX.m + +Please send an email to ian.h.bell@gmail.com if it works or if you have problems + +(c) Ian Bell, 2012- \ No newline at end of file diff --git a/wrappers/MATLAB/example.m b/wrappers/MATLAB/example.m new file mode 100644 index 00000000..8e208b2a --- /dev/null +++ b/wrappers/MATLAB/example.m @@ -0,0 +1,89 @@ +% Example of CoolProp for MATLAB +% Ian Bell, 2013 + +disp(['CoolProp version: ', Props('version')]) +disp(['CoolProp gitrevision: ', Props('gitrevision')]) +disp(['CoolProp fluids: ', Props('FluidsList')]) + +disp(' ') +disp('************ USING EOS *************') +disp(' ') +disp('FLUID STATE INDEPENDENT INPUTS') +disp(['Critical Density Propane: ', num2str(Props('Propane','rhocrit')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'R290')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'R290')), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = Props('P','T',300,'D',1,'Propane'); +h = Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) +T = Props('T','P',p,'H',h,'Propane'); +D = Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D', num2str(p),',',num2str(h),'-->',num2str(T),',',num2str(D)]) + +disp([' ']) +disp(['************ USING TTSE ***************']) +disp([' ']) +Props('Propane','enable_TTSE') +disp(['TWO PHASE INPUTS (Pressure)']) +disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'R290')), ' kg/m^3']) +disp(['TWO PHASE INPUTS (Temperature)']) +disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'Propane')), ' kg/m^3']) +disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'R290')), ' kg/m^3']) +disp(['SINGLE PHASE CYCLE (propane)']) +p = Props('P','T',300,'D',1,'Propane'); +h = Props('H','T',300,'D',1,'Propane'); +disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) +T = Props('T','P',p,'H',h,'Propane'); +D = Props('D','P',p,'H',h,'Propane'); +disp(['P,H -> T,D ', num2str(p),',',num2str(h),' --> ',num2str(T),',',num2str(D)]) +Props('Propane','disable_TTSE') + +try + disp(' ') + disp('************ USING REFPROP ***************') + disp(' ') + disp('FLUID STATE INDEPENDENT INPUTS') + disp(['Critical Density Propane:', num2str(Props('REFPROP-Propane','rhocrit')), 'kg/m^3']) + disp(['TWO PHASE INPUTS (Pressure)']) + disp(['Density of saturated liquid Propane at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',0,'REFPROP-Propane')), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 101.325 kPa: ', num2str(Props('D','P',101.325,'Q',1,'REFPROP-Propane')), ' kg/m^3']) + disp(['TWO PHASE INPUTS (Temperature)']) + disp(['Density of saturated liquid Propane at 300 K: ', num2str(Props('D','T',300,'Q',0,'REFPROP-Propane')), ' kg/m^3']) + disp(['Density of saturated vapor R290 at 300 K: ', num2str(Props('D','T',300,'Q',1,'REFPROP-Propane')), ' kg/m^3']) + disp(['SINGLE PHASE CYCLE (propane)']) + p = Props('P','T',300,'D',1,'REFPROP-Propane'); + h = Props('H','T',300,'D',1,'REFPROP-Propane'); + disp(['T,D -> P,H ', num2str(300),',',num2str(1), ' --> ',num2str(p),',',num2str(h)]) + T = Props('T','P',p,'H',h,'REFPROP-Propane'); + D = Props('D','P',p,'H',h,'REFPROP-Propane'); + disp(['P,H -> T,D ', num2str(p),',',num2str(h),' --> ',num2str(T),',',num2str(D)]) +catch + disp(' ') + disp('************ CANT USE REFPROP ************') + disp(' ') +end + +disp(' ') +disp('************ CHANGE UNIT SYSTEM (default is kSI) *************') +disp(' ') +Props('set_UNIT_SYSTEM_SI') +disp(['Vapor pressure of water at 373.15 K in SI units (Pa): ', num2str(Props('P','T',373.15,'Q',0,'Water'))]) +Props('set_UNIT_SYSTEM_KSI') +disp(['Vapor pressure of water at 373.15 K in kSI units (kPa): ', num2str(Props('P','T',373.15,'Q',0,'Water'))]) + +disp(' ') +disp('************ BRINES AND SECONDARY WORKING FLUIDS *************') +disp(' ') +disp(['Density of 50% (mass) ethylene glycol/water at 300 K, 101.325 kPa: ', num2str(Props('D','T',300,'P',101.325,'EG-50%')), 'kg/m^3']) +disp(['Viscosity of Therminol D12 at 350 K, 101.325 kPa: ', num2str(Props('V', 'T', 350, 'P', 101.325, 'TD12')), 'Pa-s']) + +disp(' ') +disp('************ HUMID AIR PROPERTIES *************') +disp(' ') +disp(['Humidity ratio of 50% rel. hum. air at 300 K, 101.325 kPa: ', num2str(HAProps('W','T',300,'P',101.325,'R',0.5)), ' kg_w/kg_da']) +disp(['Relative humidity from last calculation: ', num2str(HAProps('R','T',300,'P',101.325,'W',HAProps('W','T',300,'P',101.325,'R',0.5))), ' (fractional)']) diff --git a/wrappers/MATLAB/mexopts_w32.bat b/wrappers/MATLAB/mexopts_w32.bat new file mode 100644 index 00000000..2a45c677 --- /dev/null +++ b/wrappers/MATLAB/mexopts_w32.bat @@ -0,0 +1,62 @@ +@echo off +rem MSVC100OPTS.BAT +rem +rem Compile and link options used for building MEX-files +rem using the Microsoft Visual C++ compiler version 10.0 +rem +rem $Revision: 1.1.6.2 $ $Date: 2010/07/23 14:10:55 $ +rem Copyright 2007-2009 The MathWorks, Inc. +rem +rem StorageVersion: 1.0 +rem C++keyFileName: MSVC100OPTS.BAT +rem C++keyName: Microsoft Visual C++ 2010 +rem C++keyManufacturer: Microsoft +rem C++keyVersion: 10.0 +rem C++keyLanguage: C++ +rem +rem ******************************************************************** +rem General parameters +rem ******************************************************************** + +set MATLAB=%MATLAB% +set VSINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio 10.0 +set VCINSTALLDIR=%VSINSTALLDIR%\VC +rem In this case, LINKERDIR is being used to specify the location of the SDK +set LINKERDIR=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\ +set PATH=%VCINSTALLDIR%\bin;%VCINSTALLDIR%\VCPackages;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\Common7\Tools;%LINKERDIR%\bin;%MATLAB_BIN%;%PATH% +set INCLUDE=%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\ATLMFC\INCLUDE;%LINKERDIR%\include;%INCLUDE% +set LIB=%VCINSTALLDIR%\LIB;%VCINSTALLDIR%\ATLMFC\LIB;%LINKERDIR%\lib;%MATLAB%\extern\lib\win32;%LIB% +set MW_TARGET_ARCH=win32 + +rem ******************************************************************** +rem Compiler parameters +rem ******************************************************************** +set COMPILER=cl +set COMPFLAGS=/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD +set OPTIMFLAGS=/O2 /Oy- /DNDEBUG +set DEBUGFLAGS=/Z7 +set NAME_OBJECT=/Fo + +rem ******************************************************************** +rem Linker parameters +rem ******************************************************************** +set LIBLOC=%MATLAB%\extern\lib\win32\microsoft +set LINKER=link +set LINKFLAGS=/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map" +set LINKOPTIMFLAGS= +set LINKDEBUGFLAGS=/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb" +set LINK_FILE= +set LINK_LIB= +set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%" +set RSP_FILE_INDICATOR=@ + +rem ******************************************************************** +rem Resource compiler parameters +rem ******************************************************************** +set RC_COMPILER=rc /fo "%OUTDIR%mexversion.res" +set RC_LINKER= + +set POSTLINK_CMDS=del "%LIB_NAME%.x" "%LIB_NAME%.exp" +set POSTLINK_CMDS1=mt -outputresource:"%OUTDIR%%MEX_NAME%%MEX_EXT%;2" -manifest "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest" +set POSTLINK_CMDS2=del "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest" +set POSTLINK_CMDS3=del "%OUTDIR%%MEX_NAME%%MEX_EXT%.map" diff --git a/wrappers/Maple/Analysis of a Refrigeration Cycle with CoolProp.mw b/wrappers/Maple/Analysis of a Refrigeration Cycle with CoolProp.mw new file mode 100644 index 00000000..4f849907 --- /dev/null +++ b/wrappers/Maple/Analysis of a Refrigeration Cycle with CoolProp.mw @@ -0,0 +1,397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5WWlpKOlBOPlQ6RHVKRVJIQkJgTlxcQE5kXFxRZ214WFlKVk1sXWBRUWx5ZHhOVmBZcHRWZ3BUc1VqPFFVQj1uQkBKPWBSTERTWlxcUmpIcGs8Vmp5eVJUVkZoa01sckNsd3dwSlY8cnBZWGddWWc9UDxUS1s8THM8VTw9VUJkUk5AVFRldk89dVdld0RVbUhtS21UdFd1WXd4VU9lWFF1eG51eG5hbUdBdFlRV25tVnRcXFRkUXdoeXhneE9DRG8+UFNjZG5OUFRERU9fYDxKSExqcmV2SlxcbExNU2NKRDtOWkxPY2M6TTtKPExUREVPX0pjOmZmaFBkZ3ZqWmBsPWllVG9pOldhQXFuY19mbEhjb1BvXFxhc0xPdGZXc0F5XVRfYVZZY0V5dnF5bD1gZERHX188RV9MPmxMT2NTWHF2eXZHVm1iZ3lkaGpuQGdaeG1wdndSZm5AUF5bbmBYT3J2SGp0Zm9SeGE6V3J3aWhUYG1nT3RuV24/Z2lvUWhkdmxMT2NjWkRbPlpgQV55QXlZeWhNeVtpeXU8Z2Fxd2RiUXJHVmdicGRrQWdgaHZNWWZ1eGJjaXFpRmE/cGNWb2FZSWF0eG9WPnBMT2NjSmNaTEBqTlBkRHBcXFJwY1dheEpxaHR2Z1dRW1RPYFZ2XkVWcEd3bWh5dWxYbUhBYWhHZ3Jod0V4YHg+Y1lJeVNZbE5RWzxOXVNIZ0ppbHFnYTxXeHVZaUNvZEJwYXBxam1PXFxeWW5OUGREW0w7Xz5Ec01VWUBJd1V1eHdEU29xSktZcF1YdG5YVl5NbFh5WEtJb3Z4V1ZFTEV4SnBod1tYd2hJdUxUTll0dXV4dkNNeVFZd2l5TllNU2A8TkdBUkxVVmA8bnhJalhMeVxceVdWPVM9aXFvUVhaVVNjZG5OYk5KPEpnUXhzWVVYXFxuSWh5WnFTVEFwXkVKd0BZb19wZV9pRHBxdXd0TV54ZHl2V1ZjaVl5XFxpeG53dVBoZW5veEtXc2J5eGhuYVd4a3lxdldZbWNZbllBcU9gXFxhQWA+XmJMV2RAXnhAWHRJeG55WHFuYXFsP2JFR19fYGxMO046RmhzUXRHeFtLSXlld2RMUW1fVnJuV3RdWHVCeWdvQHc7eGZxQXRGV24/d2ZoVmU+d2V0SHdbTnlkaXVJWHR5d2FsaGtkUGJKcXNgV2pYVmlwX2p4X3lqcWB0YXZvd3hKYGR5UWI8Tm54dmxXSGg8R2N4TmNjZk5GX19cXDxibFl4WjtjWGN4d1dpWT9WbD90WVlUXWlXQVFnaVlCYFlZcU9Ia1N0XldHaEVZUm93VVFpRW9HUnVpRG9nd3d4Q0tmRHdSeHdGY0l0V1lGbmN1Zk10Q1N4QUd3SHlGcFF0Zj1ESnd2Q0tpcEl4Z114bXdZU2lSXWNjYEN5O19Gd3ljTkNDS194cXdXcnNkeFV3P3dGbXlXS21VaE9UREVJZmFSVHdpXFx4dVNVeXRkTVlgdVltUUVMU2Nkbk5CO0NJXnNHdkNkbFFmRG1pak9oXj93a3VCRE1Jdz9XcWloZkVlbWdJc3dFPkd2RXloeEtyeEFFUnFjQnNoTGFFa01zZGlybl15TElZbm15Q1VHY2F4XW1kUEtneXlHeEdYVWNJdWNIR1VJWEt1RHVkWWFZeUNUZWdmUl9iQWFGPk1ZWGNXU0NFYWdnXVVEXltiQU1SS3dDW1tCcUdXVVVoT3FUUHlpd2d5X1t4SFdoUHFiZ2lkX2lZdFlDY1N5dHVZVjt3dWl5UUNDRlNzaGt4X2l5UGdFSHlEV2tZSWl2Vm9TXndSXj1kVUNlTW1UY2NmTkJ1SWQ6X0VDcFVUWXNGbXNbYXU9SXZfbE9JPFZTaW1AQVdjYXF4TXlBeVV5RUt3dXZhdVNqbVNHaGxkWVBSWVVNXWpeSFNxeFFrYU93PHF3dU93RXZweFJiPVJnVVlXSXdBUXR1cHNVQVI9aVlncVNaeXR5PHheZHdScFdMeWxocVlmXFxObFRZcHVrYnhPO0RsXFxsTUZNUnZkeUtQa3I9Uz9dUXJ5UEI8a0JdcUxpdFF5eXJ1ckVFbXZdbExNa3ZcXHJheU1odXNNYE5KbWxXbW1RXWx2RHM9QXdUeExzbVZwVVhIaE1FUG5pSWxobW1TSVlFQFJOTUxTUFRERT9tSDtDR195REU9UnZrdW1Rdk1NdXB3ZVtBV3drV3ZdWXVjWWtxeEFFV3N5ZXZtZVhxeXZZZGJ5VE95djxXRFFtYnV5WXN5R3g/UlxcT1VbT3NKQUZDb3VYS0Ngc2ZCeVduO2VaPWRRW2JeWXJMb0NMXUY+d3lEU1JAXXNlQVl4dVlJY3lieUNYYVJ5X2h0RVNzRVZERUdfV2M/YWJzP0RfT0ZUPVVma0ZCc3ZaP2R2YUZOQXRrV3ZmSVlIeVhYaWRsd0dneVhbb3NCb0dweUZ4VXM9P1h3bXhRQXlhRURJUVRERU9jTlpseG9JV2dLSHh3dndDYWliaHdicGk7YXZ2WXZQP3hheWtpXmFXcHltcWxBRndfdml1aWRUV3BqP21Yd3FrQXViUWRwYGlkZ3dXZmdBd194YF5wUV9RbmxCYGJeWWJdcFs7eXl3UXRUaGZuZ3h1eWVJd3Jmbl1oUXdUcWhtUWRoQWpFT2FIR2NreF1UQWhyXm1VaGhYb2xzV251V3VneW9VaWlZYG5VaXZ5cWdKXnVpPl5EWWxsQGpzZ2xGcXlnd3FhaGdRSGt0T1tnWW48bmFdTmB3d3FCV2dBSHlnTmtSaWZvV2B5cVtqRmdrd3I7b3NrT3NRUGREU2NzUkhDQnM7czpxSVZlRV1zVk9jc1N5ZHRxY0pnRkFDSU5LWG5RcltLeW13VHk/YnhleGZnWG55VFlhaVNveVtZWXljVF5RRmI7Y2pdZnhrVF47Q0JPeWlZZmldWVtjeXNpRmlbZW1heE1XeWpdV2FTZEVDVWpvZXdFZUV3YlxcYXVcXFNHb3dCPGFVanVpVllodVFIQ11WcWV2WWtEWmtXeU1IO0VleGVlbW90eE1jdFNkYWVZSVlHXVdEY3dzdV91O21CeT1kP3V1b0NHUUlJSWFSZ2NYcmlWXFx3Q1xcZ2VaRWN2V1dQPXZUT1NERUV2Z3luVWVOX0JfX2RMTVNzRExKWFI/THdfdWxaeG5edE1BcFNaaG5yeWtxZXE8cFlnYW1vYVhDeW54UFJdZHVsbFM9YEp4ZXc/WU1jWW5RcHFCcGtTTVhaTVBVeGtIaGtLeU55cXltXFx4d3hNVlVSSXVXV1FTWWx5WnlKYllyeXh4O3htVVh3Sk1tXl1Ndnh2TElOX3lNQz1QZXR2WHFYQ0V1VGhKcVVZSkhQUVFqRkxMS2B5aHVza1FUVElWQ1lSS3Rya1FOS2VwbHB4YUV2cEFOQWBVXkl4PURtWkxQZ2V4QmFNPFROYXFRS1F4ZEFzXlxcTFxcbVdtWU5nXVVEeVZGRU9fYFxcWkBcXEpYXks+akNxW0k+dEh3X21QYlo+anRYa3BoaEpBckNJWmJ3Y0tRYGk+dWpwanhpeXFwZT13XXRheW9eeF5xc1xcX2A+XmZdaWhpPmVFd3d5Z3RTR15rQWFKVnZzd3k9Vm1iaXhpb2lVVmxKVl9leGRpUHlzWF5oaF5Ldl86bnJiZnV2YHdCV3FAWWhzb2VzQG5TX152QWE8T3RaXnBPYF5TeHdoeHNAaHVoSW1pcXRRV15qTmVib2FYYWxpSVtBXl5lZ3ZgVmVaT2s+WWJRcW09QGRVQWs9eGZlYWxIR2lWcWNLZm1gcXRXcG5TR2xTVnlnd2E9VnA9WVxcY3l3QE53anFdS0hdaXFsdmZjSGBucHd5UVBebW9kUF5eQkdxbUllSEl2YEZfWXheX2BsTE9zW1FiOk9rdG5yV25DU2VFR1dDSWI8Q0JBTU9UaVNTeG91bXl0bHl2VXhweWpicWpHdVNLeXNYYFlwbHB5ZXNMSFlGXVBwbE1tYFN3bWxxZW9nQU9kbXBpcXFJVXRCeUpeQW9dcGtUWFRzSVVaQE5FPmtnUHR0WG9fSGtEYF9iT2h5UXFBaV5xWHE6RnBVdm5XR21sYGdWcXRQYF5CTmxzeXJmWWtJX2NUP3VNaXlnaHNLeFpaSV1qP15CTmRYRl5UWHNSYFpOdl5CbmhVT2hoTndsaWA7PmtXVmdCR2JsYFtZYWdxSG50SHl1T25GZ2lGSHdHUHlIUGl3VmhWZmpfUWM9T2c+SF89T21sXmpTeGhMYXdNeXVdeGVrcXBjcWlDV2I8YGJ1Rm5DX3lQbnZyQXJqYG1ib21Fb1s+SHZMaFxcY29eeWhnRV9cXFZgcXJhbWhXaVhfXm9YXkhpc19WcGg/cTxmaHRQbWNGdFd2dGJeXVBmb1VAd2Nnbk5kTEhRTTxsd0VwYXh3VERUYG1RZ1hrPVRtcFB2PlVxaUFTRjxPRGhpSUZgVUF4c3dpdEB4cE9oUW5jP3BrTl9zXXFwYkloP2F2b3hmaFh2SUdmal5JR1lgdWN1QXNZbVlGd3l4eXZ5Z3lFY2lsaXZRQ3hxeUdZZXhPTUlURURKX2h0eXZUS3JzV2VWcUJTZVlxV3VWaVlTdXVtb2NZV3M6TVNTPWJiV3NzV2RrUWZQc0ZBW2NOO2N3UVhCSUJtU1hVV2djR2dCVUZWS0hoZ3dCW0NLO2RIU1VvV3VWQVdQTWVhO3NSWUhLaXM/W0RQeXc6O1lbQWRRS1NbU2dsW0Zwa1RtQURXc0RST2lUWVNKeWldd0ZgXWlmRUdeV1JgX1Z1d2NDV1NUP2hZbVJdZ1ZDa0NwWVlgXUVCTXM+YUlRZ1dLY2lcXEdzaVNoYXFjQndJY1l1XFxXWW89ZWFNdHd1VEI/Y3JhWE1XdERdRFZXc2w/c3Z5ZD9xV0xPRkVDRElnSXJBRnlpd1lbRV5nZGV3VFlLSGpVSHNDSDtVdXFfV1tPVXdvU2VtY3lrZXFnSW9BeV1hdGZdSGJlYmR1dDpPV1lJdkxxZz1lSUBFWWxzV1tRUlRNaGZFVUNvZElTVHNbZWBZdHhHREpTaUxpUktZUldtd2lpeDxpWUJddktJWF9VSGBhVmNLSTxPR1NXQkFZeEY9aW5ZY0lJdVBxdlZJR01zc2tFSUFBYlhlUltHc1ZtQk9tWHFxdlNXZm5feTpXZFdLUkB1RmFdSEI7c0tPVW9PUj1naW9NZ1BdSVRLd2d3WE91dEd5aFZRU3FDZ0l5ZnlxeE1beERjUnhbV0d1ZFdNeWBneUlLWEVFSV5RZGNtaFxcc3ZAS3NMcVdCRVNud1NkU0VLPXZTTVRucWNFW1Z1aVVVO0VnVUJea3ZtRVZvO0NgeWdlWVJaW2VpcXdtU0hvV1lIcXlaU3ZSW2hFWVNzbWVgY1lAPVhWZUZrZ3V3a3VsbUZQcWVSW2JXS2V1RUlnPXhWV0RzZ1NoQ1NLR1h3Z2J3eWl1YWlIVVlJO1U8Q0ZWaXJkX2JTcWRCVUVRX2NBP2lOR1hMT2RAbUleR1lxW1I9R0dNc3ZDZ1lcXHNyPE9pbVlmTmNVdkt5X21SdTtCQG9IV1lZaXNZWTtJPmFCXk1XbE1kVVFCamFXO0d1bUtDYmd3dm14U21CT3lCPT9iWl1JaGlpXXFDdENWd1F5SltyYWdoZUFUSUdUYUNyUmVneWN3bldSdGVJSXNYO2FpPGloeEV3ZXdVdz1UZUFJVm92TXFJSztERGdJcndDVltVdTtYX3NzRztJXWliOndEc19zOnNyVmdoVWFZZklYY3lyREFUd293W1t3ZnVkbktWeV1jYT9TbllHb2dnPHVnQktGZUNZWFljR1tyW0d0bmlEY0hUSWVwRGVRb1BLd1RwcV1tcGVrR0V0ZlVwP1VuTVlwa0xuW1lvcXhZbWh0XFxNbmtkUFVBbkNcXHdxVHZLeVRpSFRvUFVbeXd3THd1ZVV3dXJSZHhvYXRycHF4cG10ZFRmWXVYSVVEXVVqPHRFVVJkdU1sYWpGeU1iSW5keHZfbVVveXN4eXJhSXlpWVVORHZiTExYUUxgTVVVbXBmZW5NbVNYQXRvPG1mcVZfUHBebFFXSWpvYXFCVFNTVWs+VHlfTFdRdWpVZFRGSVJfVXRrRW86aXREXW5GTGpFPUxeSE5VRGo7bHVPdG52XFx1dGRTb1luYFxccGlpSnNcXE46WUxncVlVXFxTQFxcdHFxbEZ4b154TkM9ak89TE5NbF5BSkttcFdod3hkUng9Tmh4U0JdSz5ZbV1hakJ1eF1ES0NwakNAdldFcFR5TEFgTWp4Z1pOeWdmd2l3bllIbGA/Y0BBW0B4XlR5bVNueHNnbUBvYUxIeUQ/Yz55eFVPZGFpXnZ5Y2ZnWlxcdlpmWGdtQXBSUGFkaGdMQHM8VnNNT2JCcG9ZWVtzaHZvT3NuR3U7V188Zls9aFpmQFpZRXlJdj5LVUtxTGRleT1USkFkbnhWS1VGQjtjT1t0d0dSO0dZZj9VWWtTPG9Ib0dEYmNCaHVYY294XVFVWElYbWlzbkd4RllIST9JSldZal92UFd3aXdJXmNYVmtnbUlnZU1CbD1JO2NGcz1kSFF4d3VleHN4PVlJY0ljYXV4Xm1ld3NVOz92cXlpbGlCTll0VVlTVXdYZnFmSXl5YnFXREt0PD10VHdkUFlDUXlnW1dDSXVJQ09HT09zW1NFcVtoaVlYeUtpRW9IaXV1V3FSOm1jWF1JRnVkV3dYZGNCWGViWVVFWE9ZPW94TlV1VVF1ZkV5dm1HQmNyblVmP1VkRF9UZmFFUz9WXFxNRHg/eU55VUpHQ1J3SW5PQkc7ZEB1ZlVbeXU9Vmp3ZUN1QkJHc15rc2NFV14/SGdvaUlzeG9BVElPRk1TWU9FdU1XaEdNZGRBRWJlSVBnc1lbZjtjUkQ9VFlbQm91dE5xeFhRVU9leWc/VHllaURVeE5DRTt5dT9VYndNV3VlYlVBaGF1d0JjWXl5aWlHZm11c3hTR05RaF5lZ3hTRmRrdHlHR2xPWF9pVFlVZk1tSGZ3ZmV3Z3Z5ZzxtY2NHUkB5WFNXUnRbVkA7cng7VXFRZUJjd1N5Q0pJWVxcS2hTeVhxR1VOcURQV3ZYc0ZMeXRwZWZ1T2dWV1Jsa0NuQXVDZ3l0YVNka3lCUWNzUVdCZWdXQXhHcWg6SVhocWhaTWlfQWJycVZaR0J1VVJ3aWdEY0l5Y0dCd2h1QWhHbUJLaXY7SWhaV3hQX0lqUVI8R0lZY1huX0VqZWNsS2dYb2NgZ3d0aWQ6X3hOZWJNT3hBSUdBUWRKU3lXP0dbeWVcXFNGXFxBdlVvaE9lc3RRUko/RmxrSER3WEJNSF5XV1hpZmV5aFQ9RUldckNjVEpPZkNBaG09RF9BWXY/Rl1dSEY9eWddcVJRcENpTlFtT1tkU0ZZVXFNeV1ga1pEd295d0ZdT2ZZeF5YU1pMTnk8TVNpcnZgbGNEeGRZdEJFU1Bwbmdkc2ZIbUxNeU1dWGRUajpgdGRlUFhlT0E8VndcXHVCPHNbQUpYSFJIYVU8TVhyQFNYVW1oSVQ+TUtRcUx5RVZUdVRUYFZXbFFsPXFIeW5oSUtCYHM+QU0/eVV4UFBBZFdfSFlkaXddWVV3dG9EYHFBPFhCXFx0d0FqaHRxW3FRdGh4a3hWbFV3c2l0bW10TFF2X2RYdHF2SXVNYHhTeFV5cGB1XVVNR3FOd1F4QFlMQllRPlxcSl5cXE5QV111WWN5RnFJcGd0P2llV3V4eHZZVnFOcF93VmlXZltueXhrRmFCUVpRZ2g9T2N0V2lkYHBSWXhcXFM7Q0NTR1ReQ2Zjb3Jpd1RLR2JTXUZdW1RfRVJlS1hMUWdfW3RKdWlxdVNGVUhLP1ViP2M8O3I7WVhdVVREP1lOaURSS0RuX1Zid2VQc0NvSVRZT0ZQU2h4d1dCVWReT2Nkd2ZfPXNXQVJXVURLR2VQVWNVO2N0SVJMXWdgX0JaSVZkR3ZtaVJ3R3hQZVlHbWhmZXVQSVhvSXlxdUluSVZ0R3lQWXVWO0hKc2VVQ1dzbUJsT3hSW2ZAZXZDQVk7eUJjW3Y/P2dtd1JIdWY/RXNWWXk9TXM8dWhcXE1HakdmPGtUQW1nQ3dTRFliPnF0aWVFTWdibW1TYEVpbUVZYFtWcz13RUFZQndGSz1CR2VFYj9zbGVlVzt5X1NCY1VDYFlWSFt2SGFWTWtDc0FkSDtkaUVFSmt1RltVXFxBZkJnaXRJcnlla2d1dUxMTGFdUTx0alJAdW1dVVp1d21US0xEVm5VT05hc0htdmRVWUVJSklxbV15a0tUUFlRbGBhVV11UD9YWVJRUUVYU2NMUkxMTExoTGB0UEtZcENkV3BFbnNdc0FMSj5MTl9xWW1AVnRQd2Rlaj5obURMUG5ZTU5cXHZATUpNRFRebE9MWXZeUUxLVFVDQFhIaXhNXVlvQFR0eHZuTFRyXFxKQHFTQ0FOX0xROkBYQkxUYUxSVnhySk1rTEB3XllZa2RQVnhvRkVtcUhPTzxweWVqdHV4O1xcdmlgUHhsTFo8TlJlUWlMVmhhSllha0tocXVFbTphc1k9cWpAVFFIblc9amZ5TzpdUWx4Vkl0eFtAU1VcXHdrcFhPTFl5TW1uRXV4ZVhNbXdWbXNjTE9KYVlGRW9lQWt0PHZdWWxvbHVtRVc9aE1BSXlFbExuaG9cXFl1bFF0cGlNRklQbXVvb3FxRmlQTnlsb3RgcGBcXGd5d0tgYVlQZEM+Y2BZckRvc0tJZHVWZkNWZEJxc2tnc2FBcUJAbVNnZ1A+Yk55Xzpxc0NmeGhZaXRJYXRHblRgYHVvXmBQYT14aT8+bz1gb09gbz1gbDpJXkl5dDxIYj1QWm91dmVpYGlzY11lW3lmazt3dEBQd1FRZEVyWlRtXUVuZm1VQ2RUWUlSTD11dmVTW2BNblRLVFlLW0F1PV1LYGFUcjx0VVVPTnFwQXhNdD1zSjxsZ1h5X0RSWT1sW2FUREVPPlBOZWVWeFRPYVBqdXhTXmBzQ3FTYG1VU1VvU1BQXW1XQ1FqcUlTYUxsWXBSRlFRS3RuXFxcXEpkdXlePE9uXFxqQ01zbll1R1FqU0VxeUF3P01tUEBPZWV4U21WPk1RRDxVTUFuQ3hqRVxcWVdBdGtQdXNQUTxEeU9kdF08am1Ra01tbV9ES0xBbUNwal51VGQ9VEl4d0dFT11tTldtTWNRcXd0SlJ0VD5AS0lJdmJoVEhpWEFRSj14dmhsUkNETUxAS1VEeERpT2loUmhId1BwdWhJa0JVcVtFc008S0loTj1sWUpEeW5Acz5Id09YWXdkakJ1c2NMVEtES01oT0tkdT1IVmJ1VVN0WFh0S0ZkcGNAS2dIeWppbWtNVmdBbHRMcVxcQUxCQE5bTWxhUVdWXVVNSVFZbXBZeW48UHZgQFZjYU08XVhBXVF0YE49SVlpSG5SUXZCaG1sUHJrdFFGSUtbcXhGSFhgbWo9eFBwdW9yTHdiTFlGZVFRSHZaVG1wUFJFVFhMPGpWWFhYXXlcXE11c1hWQXRNZWVKWmRXPXFyR0hQR2haWT91dFhlbVdsR3d4VllcXDxQYlhHcll3cEh4c0NZXFxxcGNRPmNcXGh3SU5vbEhiUFB4VEFmVUl4YlB5cmhoVT90ck9tPE53OnZsYlhyb3Zsa3h1S3dvd2lrdGl3aVdjOkF0eWJrR1U7SVhKQUdzP2ZvV3RSPXZWV0hJaUlxdWk8P1VuR1ZhaWhRUVhZUWReT0hnXVNqbHI9aU1hVVFobHBJPVBLVUpjYVhDcEtAWU06eHlIWVVoRWtXdWtuWHd1PW5BYU9nbVVScXBWQG9gYVBIaHBfUVVzcXRPeFRseXVRcVVwRVVyeEtfUXZ1aHdlbHZEaUpRZFVOSHV4PUtCXVFAWW5NZU1oQW1YRFNtSW9XVUpseE1RXUptYW1oaFZBZEpDSWpKaFlnWXVQaFFNXFxTZmxXc11WVUV4RGRVYWFYdmB0TjxKSU15VEBLXXlrO21tUUR1XVRRWmhSYGBvSkhxYGxPRmxQPEBOZnRSUlBYdER2ZkRXVHlMP21URGB5P11VbVFwXkVxP21KU0xVRlRVaFxcWXBMT1t4dUBlTmdFbHZ1cWZ0UnVQTUdwa3d1WHh4bXdteFNFdUt0bURcXFJHUXNcXHRLcz1ydWRrbl1ORVlTWFlLc01VU0BNSzxsU3FOW2VSbkBPXFxkam49VEBVUWJUb1lsV25MUUtATkFFS3lxSmt0Sk5odGNlWFFNVHhNeHNwV290TFN4dV1tcz5hbEM9WGZRb3VoSz1VV29US1BcXHNUZWs8eG1qeWxCYFlfXFxqPVxcS29EeWphd1xcSVM8YE1wZEtDPUtGcUpWdHRqWHVGcFA9aFl5TGpCVVBaZVNYYVlNZFhkbnJwbnddT1xcQnFoTHBjSEZdQ15mPmFndk5rWXZ3VVZsaFZxck50bE9zcUhedldsbVl0cGVwX3JPQUlyZ1lrYWNAUVJMXWZ3RUNHcWhqaUl2bUZDU3ZleURPZ3dDP1NNT0VSY2c/ZXI+P0NwP3JVUXl3P1NBVUNaUUlWeWJ4V0ZwXVk8P1d1TXdUV2RCeWVFSWJTV1JcXHNiW3lzP0l5Vl1GRnFFRW9iZ2lYbTtzYW1EWm9jO1F3cltZP1tVbWFFOkNTSk9jYW9IaW1zb0NEOztSPDt0bVdHPUFYZGdCWllic3djZ3NGcE9FZz9SVmdGdTtnRVFXSD1UUTtSTTtSVXVIXFxlU0VfR2JtckR3Z1VxQk53V1VQbVxcRHFlYHRwcFl2P1t4YHdcXFlrdXBpUEFuRl5tZVFaTl9sRz5oQ3hzQlB1QT5oU2Blc3Zycj5lZ0hsdW5cXHJ2WmA+aGg+Xld5ZDtndWJ4Wl1fYWRQd2pgWl5xamVvb2NXZ3FoXXleeGNmc2lfcnB5dFhXcl5pYEFiTVd5amVZS3FCZU10cT1mQWFzeHFYYWlyVnV2VGxRZnVZUFRtdGV1cFlxO01LZnh5TmxrU1hzb1xcYUZ5bjxhWl5meGdwYUF2W1ZHbTo+X05DU0VZc3lEdEdCS0N1YG9GP1Fzcz1WZXFXZF1zZFdja0NJTWlHeUFmOkVEUXdycXd3XFxVZGI7V0xtclZzdmdZZlBrQ0tJR2V3ZEpZR1l3WFxcY2VqT1hDY1RlZ3RKVVVqaWJleXdgd2ZxbWNuZ2hrYXlvVWdjYXlvWVdieWlORVlZWWllSVRUQ2VUR2ZbcXV0Y2lcXFV2a114cFlDSFVmWHF1WFFSaztoPFN4bGNSV1VpQXVyY1l1cV1JPHVIeFt4bmNXV2lJUGtFbU14ZGdybk1zS1lTYml0SVlJQ29kZjtFYHVpUF9HXFxLaG9Vd1BNeTtpSFFRdFJXZD1XVj1xYkdbeERZY2hbd3JPaElXWDpNRnBjV1RhRFVxY3ZpRWFBR0w/aHRjRkl3UlhDRTtJSXVRU0hVaUxBSV9hc09hR0dbZUJJRlZjUmRBc01RWD5RZk5jVm5pVF5haF9TY1ZlRkNFU2RDZ0NHRGlBeXBhZk9JY05XWE1NQ2BNV1ddUnBDVGZxZGpdQk53d2pxR21tck9pRz1VZUljUl5XQmBLVDtXdkptVU9DWFpvV0FpZmRdeXFLZ1xcS0htVXRUVUNcXG9FSUl4O0NIYWlUR1F3d0N1VmdFVFFXREFXaFtjSWtjX2NFQElGdkNXZGlWd3FJZndXPldFc0tjQ0Vja3NkTF9EYVNCZ3NyWVVmW1lzSlV5XFxjRUxHdkxrZFBHeVtlaHJrVD1BdlNzSUlTZ0NHYlxcY3R0U3JtQVVzRVZgP2RiO3ZBP3Q7X1lXdXZvdXhWQ0ZcXEtSX0lDUVVjS3NHPVFEQnVza2hMeFRPPUFUQFFxeXFNc2hZXXBQZURKRV1UdERRZ3VKbGR5c0BPTW1OVUBTRklYRHF2PWR3bVFRbkRRTURxVFhzVmFOWEhVRWxKZFV1TVVtbzxPWUV3dnRuO21SYElPWllQZD1LPW1saTxLcElKWlBxSGBwcGVSUDxSTnR2X3RUX0hKYnBzcnR4VkFMPlRWVWlRcXh1SGF2OlFRVHhMP0xXUFxcd1xccFlRQE9TcVBaZVZZVHVrUE9pZVlWTWxaaXNoUFI9XFxsVHF5WmVYdGRTXVF2VFB1cmBOQlFKeXRwZnVMQk1WX2xRQzxKa2hNb0VxOj11TExvbmRTP3F5WkROYnRYREFXPlxcT2pwU1h1S1VxS0ZoV1RpUD5JUWhRS3lcXHJ0YUtbaHdDSXladXhbcFd1dGtIXFx4UkhVXFxIbVZ4THBRVV11cVd5aklYb09AU0RMdz5wSjtpcUFcXHVrWFJVZHVrSXBtdXNweG5CZU1BTXZ2TW9gdG1wTFBpZXRuQE5MVUxXcGtRSHl2cE5FPGxfZVZYaGxzVG95ZG1GZVNEUGpJaVd1dXJjbXBrVG9CQHNoUHI6REtpZG9XWW5NXFx4QXhsWVVTWW1xc0lqRllWaWBxX0lSdFlwaWB1OnVNcmVyU1xceGF0bFY9UndpeXdRd1ZBamh0eVl4bV9QeWBgUW1hdVRNeVl1VXVJU1VxcVlcXHVtSG14VFlXaXVuZXVZaHlEZHR1TVl0dG9mWXJ2SW5TUW5JYVlhcVZ0YXRxbVdbSHBjcFJ1PG1xbFFedE1zUHhBYXhheWxWeFJpQVlDWXhieG9peFBQRFJFXFx2W1lSeT14W21OWURXbFxcUXZcXFNpUVlheW9NeXd3cXdBTG5lbVdoXFxMXFxEVHdpcll1WUZwb3RRd1FRdUJ4SkJka088TER4S2RYeElJUWVhb2pRTnlpdXlcXFlUcHl4WXRZSFdleHdMeXB2aE9wWXlldFR2eWxcXDxgS3l3Y3BgbEZtVmF4Wl9waVlvUVd0Z25LQ2luaWNpXWZxY2ljaWNuZWNkWXNPdVV1UUVXZ2dkWVlxeVd2V2hKU1JKR0ltQUlAPWc/VUlraUNsbXZoV2U/UVVwPVVXd2ZGT0lfTWNwTWZnU2ZtZ2NoWWRbSVVZU0NdTUdMWXV1c2ZqeWhOXUdrSVdsQXVOTVJgc3ZqPHFaRHNCVVdGTU1KWGs9dFdnaFc6cHRcXEh3YmVNTFhPXkFYQnRvU1RYW1RTRE1NUGFYZDxrQFlxX21NZlhQeEBLUWV5Z3BKOlFKZUF0dj1TREFMVnlSZWR5dEx5TD1NTHR0blxcdE1EeD5FajtodFRRdUJYVXBgS0xIcHZdUDxJTm5MdWtsVWxESmtgTm9cXHhXQVB1SW5DQHA+PlxcTk5tX0d1T09pU1ZgZ1ZsW3BsPGl4T0FiSUh2SVFcXFJmb0tnbFxcdl1MTmBUP25UeF5cXF9mPVFsUVZjPmFoSmFbZ0hxY1BrQkBbU3l2cHh3ckFqWmFtRHhcXElvXVJGZ0BfZnJAbF1nYG9edFtpbWNxdVlIYjxAalFfcVxcUV1IYGNpRlxcS3FxanFeV1ZcXD53ZEVwdWNeW25PbVN4ZlQ/cVhvWmVPZ1lRbV1RdmVmdTpWYGpWcENZXlo+WlpHc09gZjpoX3VQZUVQcE1QXU5gXlpXYlNZZGBeWmpua2lOYzpfb1lRW0h4Y1BJallBazxmWkp2WlppZndZZUBuWkBOdVBva2tvYXg+Z2k+Ylh3cGxBb0NpTUdZWElZa09oS3lSbml4QXd1c3FjWEVpUF1GQml1WW9IcG1UbWFicFNWb2N5Om1iVWticFVzPF91XkdZSEt1W1FlO2NGQXl0X3NFcFFFVGVzUE1IZFdkV3lIX0FlPGVFYklIRVFpSD9pSElzcHdYXmtXZG9zXmF5QUl5UnFidFdkX0VWZl9nQ2l0Vm1nW0lkbHNlZF90O1VCS2lTUDtVREF0WF1YREliW1NDZj93QEFibW1iQ3NiP2tSU0VVX1dobnNFPz1TQnF0d1NEbkF5bWNCQ3lic0VGcV9ZWW9Vb0l4aUNHTFFobT90c3VleElyV19IUnVnTHl3d0d2PGtYWnVDbFtZTW1pclVzPUllX11XVHFoVW9HeW95aE15b3dVeFNmOm9CPk10QXFndG9leGN4Z1lVdGtoZ11ZdEdSeXd5X3d5Wz9Gakl3UXlVcGFZP01SdEFZandyQXlyYmlzaWVZdU9Cb1llUj9XdmlyQXVJPHVHeT94PG1GX3NVS11mPFtCO3N1Z21GbHVEPlFCcnlpYWlpaVlDb2tGWVt5Onl3SlllTzt5QUlocmtXVmVXQUNnc1lTPz1Ual13Z0tjUl1pRUVkO3dJeVloST94TjtVZ11oXWtkTj11bG1TWEFoO2VoXz1HZlV5Sk95SE94Vk1mW1FXZ11VXFxXQjxJQlNlZkJTQ00/ZmdVdXBJc1lFU2BdZ15rRFNFU0lZeDtRc0xBWF5JRGxVYnFPaGlJaVZXRWw7ZENjR0NfU1k9REpnUkNBU1htZ0h1YlphWFRLWXNzcmVJUldNV01VVj53U2BVZFs/ckpHS3FYUDtIUE9QUF15SnFVb1NATkxxVUJVcFR1dWpMdT9AUndcXG52VWpoRXZFSUpaZFd3TU12dHRxVXI6ZFlKPGtgZFJlVHlnQFBkaFRebXNPRUxQSWx2TFBtTExIRGpqVW55ZFJJcXNyPVY7VFNqPFFEbGxGQHJxTHVhVXVyVHdlTWpfZXBDPHVQVVBYYXZvdU9EXUpCaFdnbEtwRExJdHJlSU08RVZveEtScVRvYVJSdVRXYVlxcHZhPVdFZXRSWG5vXFxTVUxZZWxNcWBxTzxLZ21YYE1zYnhUXFxYWUJIc0tgbGBVcUJodVFQdW5cXFN5QXJzbE9XQFNARFltcFl1PFdBZU9TSHV2QEo7cHA+WXJIaExvPVlZRGtWeVhdYGtZWVdDYFlrPltzQW9pTnReRm5ORm9pSXhcXFZrQm5ncnBlRU52dXlqQEZnbE9nTHhhaD52a1BdRGBvT1l0Zk5mPGh3dlB3dEZhU3Fwd2ZbdklycWFaWmhnTkl4Yz53Xm5wZmFvcD5xWkNCQWN4YUJaT3NURWI+VUlFT2NvPVhIUUdZR2JkSXRBVXhyU3JGaXM/W2NFV0hCb0RGaWJMb1lFU3lVPVR4TVRVPWRva2ldQ2NlTWRgYVZndVldXUNsb3hXW3NrU2g+T0RtTUNtbHNtcE5aZXVAVVRFVW9NZFZeaGxtRFdGSU1hUU9BTXR2TVdJWUpMcExNPVBfRU93QGtHRXFGXVFYVHhcXGRKQ013Vkx0bmRsdlxcTkxEV0NhTG15a25OYHNfaWFGcV1Jc2FBd2tpd3VYW0leX0ZRbXhgaD1pcWNgdl1heV15bGx4Yz95Y1hmdUtxYzxvb3NYa1hpeUxZdFNec2FHc1p3Y09wX3dvdWteeE9YcVhQdkpucENHaWx3dmJmYFVnc0hIaF55aGhpXV14c1h3aGFPZ3N5Z3RmaUdmZW93eE1pZ195aXJRa1U+dz92cmlgbkdYZ0lYZm1fb3l5eGl5bV1PeDtRbVZYX3hgclp5ZWw+d1luZkdoWnRJWjxGeGxlRVNWaWNSUk9VV214UEFTTUV4Y3dTeE1iQ3lidUVnSm1yX09XVWlSRD90dk94XFx5dGpDVHJ5eHlBeVZzdz1DQ3NVdlVfaHBPQjxPaGZDcnJBZ1R5QlxcQ0Y+XVlYZUl3YWJ4PVM8VVhseUNAVVhsWWlEX3h2PXRibVZWSWk7U3Rrd2NoPXVKb0l5V2hYcXRXS3JSZURHZUNTX0ZkbXdzT0ZfdWV3Q0ZHcXd2V0VNc0dkUWh3ZVJpeXk8VUlNS1VTS2RtXUZUY2VYa0ZOSUk8SWViUWZpcUg+a0c6Q3dOVVNNR2NER3R4O0JGdWhmb0Q8WXRBSVJdO3RaP3NuYXNHaWc7O3RmZUhMa2lrQ2VrYUM7O3hXTVZgU0ZcXD12QFdjb1djRENiZU1ZTkt5c1tSYD1JWD9manNmS1NXdVtzWUVWSGl4RndDUz1XbHVmeF1TUnNCSDtkQW9USkNJT1dIWz9ISFl2T1VWWF9ibT1CaElCcFl5T1N3PENTO3VZdF1TXmVPeUl2d0h3clRsUUVtOkh3bElUaGxZcWRrWVh1ZlBNOnBNT21WWVRMUkxuY3FscFlXY0hNPEhqbFVNZEltRXFxZzx1YElrUlFKTmxyUE1tdFhXWEBreVh3PnBOP010UmBZQ0R0QER3XVVUYkh3ZWFvaElUc0RPQUlrdk12ZVFRUVlzTlRQP3Fwc3l0O1V3UHhuQ0FPTDxPW1hvP1lqPmlrWnVUZ0hwdGRZZW1TaFxcSlZ0WFxcTWtpPHN2YGtiVVR3cWpmYFNfPGpJPHJlTW1STVhNaUtKTXBfdXhxRXBkdGpadHlMPUo6PEw6YE5cXEBOZFhXR0Vqam1vVWRNY21vXFxxUkxRc0xIakZoWW9ZalZYeTtRbGZUd2FJVkFZcU1NUD1hbnBEVlllbVN4S0BBbTtgTT5wUU1sckF5alVxVWVIUDp4al1MWUtlVzptVFdATVFUUVlgT0todVFFUUxwdk1lUENgd21gTWdUcT08TWN5a2lgb0ZNcXNteGVRcD1wdl9YdHFNd1poVmNxSk5oWERkdFVgWWJ5dWpBdk1Ib3VxUW1Zb2lEbltkUGt1U3ZpeXl1V1V5UGtUdF5obV1UVnNYTHVRcGFvbXh3eW94dkpBa1R4Zll3cV1JcHBoeXh4dVxcY2RXVHVxWXZBck1HZ2B1VGV1ZGk7ZklzaXhhWVRbRXR3YnhJd1R5ZW9nd0F3dUNReV11VEt1VVl1SVdleG9XZ3NVRTpTeUBTUnhbdWtxWWF5V3ZXZENfQnhrWF9vRVRnY3FhaXF5aDxReGhjSD5NRmVRVUZzc1VrZnlnVD5jckxrREo/ZEVjRGNDYnBZUkxtY11bWEBRR291SDpXVV49V1pLSE95WEE7RmVhVmhvaEhtZmVFR2xPZ0hLdDpbc1Y9dUM/V2FTQzxdRGVRZ2JRdnhvd2xHU0tveE1tZjpTSFN3aTxhRUhnU0xVWGRTdkg7dEpBWGpDZUpVdWFnWUdrZ0NdUng/QjtnSG1PWGhbVUV5Y0Y9YzxzVXE7VEFnZk9ZQ3ZDUkI9Q0ZXdHNHWVBzSEdDQ0NjU3FRYnBVaFJhVjxnaWBHSHVNZ1NBY1JNSERJZjtNSExBYz5HdlxcRXNHY1hlP0I/T1J1YWdbQXhdS0ZeRXNKS3Ntb2ZARWZjd0RuT0lmZ1lqc0drU2ZjQ3drQ1N3S2dAQ1htRUVYXXZtT2JPd1lKY0Rgc0NKYVNyTVVNSVRvQFBnUEtASFdOPGtBXFxTR0FSXm1WR3VZZ3BUPVFXcj1SRFxcVU10T1FhVkVcXHY9PVVteG8+WXBZcVJxUXBUQW5KSU1YaWtcXD1tOlxcd2htVG5FbW9AV1BQTDtUc09hdVVxcFRVWGlgb3U9Ul5AUEZEbT1NUWxhcGFEblk8bFtMb3NFcVBZcEI9U2xxdVdQTUlwVGVVcFB1UztcXG9aaGw6SHFISWtBPVd4UEplbHRhWE5AbG5bQXB1YFlzdHhrQVJlZU1IZG5SZWtBVGxAZVI8ZE9KaUpQRVVtXXVrRXFhcU1DSFNsYW9zUGxfPEtJYVF3YVBxSU1ZbEtWQG54dW5zTFhxVVBYeHB4QXlBaVdtbUpdSWt1RU9FVW9uWXheZHRIVU9qaHVncGtEYFdKSE5VSVJFYExTeVN3RG1ZPFB5TE9lRFZwZWxPSFRyVHRwUW5FcGtYSXlORVh5eUs+eG13TVlhQVd0UXNIdVl5ZEtIWW1RSFl4WWpVcXhKSXRlcFRecXVSVHI9WXhjQXVfVWtOeW9wTUpsQXhwaXFXREtCbFRmdHd5TXlzYHR3VW9RRFc8QVRpSXdHZXV5SFdVcU9ETFU7VGxSVFd4YFZHbW1WVVhxVFlHbXVucXJxbHJGUXZaeXdbUW13ZFlaeVh4dU5UeEtTdFdKWXBIUVFFSEtIaFhMdXlBeFN5TW1IcVF1eXFMdWtRSE9aaFFJSWpNTVRAUVRydW5jSWxcXHlTS3h4bHB3cEx4VU1VWEBsXFxUS3dJcVRkbHZwWXFVblY9bGN0cFBgU3lodnREeXBgcjpobEZ1cUBtbD48czxgbmBUc15lb0I9c1pNWDtUcWN1dmZITlZkazpNTTp4a2dNUEZNeGF1c21IVmFFTV5NTV51Vz1VdHRIVGdgb0NUVVJoS1VJS1dYT1ZgS1hJamtJa2pwVmlsbVNYclBJT1ZRV2VcXFheRE9LbHZMRHJkYVlKPFRSTWxqPXJgaHF4PVBVUHBDWVJVbW5pPE9bSEw+PXJYTU1tZU5OeGp0TFllTE5GXXBBaVhSYGp0PVBpVHg9VXBcXERyYEhTUFVtW3hzS1xcVVk8V0RlU0dcXGtvXVhBRHg6dXlkaUxXWHNdaFZHQXFGQXJ1bW5oZG8/RWtGbWx2VHY9TXRsZFhCVHdlSGxCVGplRUtOZVRCQFVcXE1SW2Fzc0BTZVxcbD9NeF1ZVWRtTkFIa1dUeGZkV0FNd3U8dHNRV114WU9dUmxtU0RAVE1odGNFTl1kd1hAeExNdV5MVGBBUU15U1tMcUU8SltMdnFJcW9tUUFRV2tMUmhwVldBVlFpWXFZcWZIUEJVeD9EVmdcXFJERFlDUXRIXVNgPW10RFVadHRHaGt0aEpASVVnPXBUcEs6THJncUpCUFhcXHlwb1V3VFFMbElqVmBzP0BqOkByclB1P2BQU0R3PGFvZkFSQ3FYXUh3PHV5O0xxW2h5a1BYalhMW2lNRklQPWFZb3BLbUF3bTxLcTxzbmxvb2x5SGlsOkB1anFxUlhScnhZdFlMeGhSbWVOWnRSRGFZRHRtbXF3bW1wVXhrdW1TZlxcd2ZNdWthbHdtV2xVTV9gTVlIVVBEUXlVTDpcXHBnQVFkdVF4WE1cXGh4UnFza0B1aWluPWhRU3hyZGFtUURSQFlQVl12aGhyPUhWXURSXFxtdXU8UlpMTU94bFhYcl1dWWBIbVRMcnFsb19ES05ES2tZVHFpT1l4dEFJUztUcG54VUlha0ZNV010T2F1eGd4cFhxUlVtcGZla0lJa05IUEBxeGlQTWdIa09hbWZQUHh0TWd1dGNEWHdwT3ZAeF9lV29pbldVckpJUk5QdVdWZllBdXJBaXJfd1N3ZldodXh2YmxQdUtQdGhOY2N3Xl9udllYdWBWbz9AZ2V4Y0B5c21QXUdAXl9vc01PdXJBc2JOd0lXdWtHX2dHX055cT5BeV9va2NPW0J4Y20/c2lXWnVJX10/Xm1vbVlGYmxJaVtWYFhoZVN2eHBPZXVYdEZJYmd4YT9ha0lWcGRGY11oY0x3XUNXaU5OYHlvY2tGXFx2d2pDT3RGeF1zTm1VQWh0aGNdeXk7cWlSbnJuQWtiTnVhV3ByV3VtP2hmV3JSaGBvZnNZd2FCeHZcXEB2bGhreWhqQGZ4S19aZ1ZtQV9eaj5mdW90UXF5Sl53bUlibF50ZEBmdWFsZD9yUlB3PUFrZFlyaEhnWXBoY3BbZmlycVd4cU9kZ3ltYkNuXVRAb0Zdd1VrQ2N4UWdQUVJuUXhBWUNHZWdmd3k9O3M9Z0Z3O0htT0NHcXNGSVhnU3Rwa1g8c1NmT2l1cVJFU0I8U0Q/VXNMcUlcXFt3dUtWQm91ZkdDX1tjcF1URkN3TFFlTT9jTjtDW2F1bUN2ZHNpcFNpRD9DV1V5VldnRHNGOlNSSGFpSENjZkdGO2VEXW9Wa1ViOjtURGFpSVVHQXFVdXVJcE9WUENnaF1Xcl9WaXN2TUVoSF15Q3djZW11X3FpY114dldXeXVHXmliPnNTTGdlXkNjbG9zYVljUW9HRWloV1FoS0loZkdpUF13d01kbGdzV3FlbkNpXFxpZGJhREFDVkU7ZFFzWEs/R0hxZFdndEB3QmlJaUFXRjpjd2xrZnI7RF5BVDo7Vm5Fc0FxaVJ3c1JBeHBXZGBDdFlNZUBDQ3NNVHRnd1VxeU47QmlVd1JhV29nRVdPdWd1ck9xUmpPdVlPWGprckZjd0BddGNzZE5NZlg9ZGdbcztzZF5zcz9dd1JIdGtgVWxJcGlUdm9dTkZ5bk5NSkx4eFphU3VhSkxxb1FJdUl1VllQS0tYeEpZczxsUE49bmdMUGlBUVttUWh5WEtJbTpgT1lsd0V4b2pgUHZhdXdJcHhNT2w9cFtldExMUW1BbV9gWEBRbV9cXHlzbXVUaHJ2SXJFSHhAWHlZdHNbdEp4XU9RdFJgZU1zRFNOTGtKWG9mWFdvaXN1eG1aWFN5cXlkTXFscWxHRXdhSU8+YGpmdXdDYVZBeFdzVXVVSXVJVFJgQWpKd3k9UXNTSV1bUWhNcW9pPnM8WF9oZ2VOaXJWR2hleW1FPlxcSWFaanBzRE5vTkZbTGdncF9aQ05uWF5eQldjYkhjQk9sZGFec0hjSmZrZmZfSmBsU05fSnBjRVhbQ05kXXFocGZoaz5qbElbVkZkeEhdXm91Und2SEl4bk50S2h0UGFwa1dsS0ZfPj5ePkhrSV5tQUlibG5ocV5uXFxeXUxwbUs/Zldedl1PcF9WYkdZYkVhW0Q+a3RwaDpxYF5BYkBOdTtHdXJJX25eW1tAZ1ROajs+cnNWdlZ2YV1Zc0pXcFxcR3JyV2BWcW93d11USGJeeXRLYWA+QW9feWJzUWFiRmp1cWZOZ3FNT2d5TndZYGBZaHFEYGZmYWRZeHZgWGVuaGdsSGN1XmRZcGJOR3ZQeWA8PmZ5P25gPmdqcGZCcFpNcFtJV3lcXD9pVFdwSllkQ2BdQ2lhXUFgWWd4Zm9obmdjdj9iVl5vSWliR2hgYW5tS3FvYndmbj9sT3BcXElIZTppZkZudG5nXUY/bE5pWjpGcWNpb3RHZlNoW21vZ0lIZ0FWbGlWbk9BZ1N2dm1XY0JfdXM/ZndHZWRwXk5ubE5Id3FBaDpvY2huXktwY1pZbGFBdUpOcnBfZT5mYltIaj12cl5nX2lpeV9RZ1xcYF9zYXZJeG95RmpuYFpoVnldTmBwWHV2Vl9wWXZFQWtCdm54YFpGeV5zcXlwZ2Bgb187V2hRP2dVaGtgZnRkaWBnaHRCSWRfYG9qTmVJVndGcG1OUWB2bnhaWWpraGdwXndhPmpOV2VIRltvcXc7eHM7WGM8P2FeWW9rWWJiYWZIXnZEdmJaTmRvX25vSHJASGNfV215d3JraXVXR3lxeHFpR3NraWlrQG5pdmNmSGdUaV1xZnVOVl9ZcWpHZ3BTUHJhUXFUcXFpXnI9VnZacXA7aXRwP3FncWM8aGV2cWJiX2ZISXhsP1pGP3BIXnhSSHVwdmFSQG1lb3BpP2xzR194QWM/V25aSGVHZ2JsX1VLVHR5dmttSV9jZl1tRUpDZUVVRnR3c2ZdVV5bR2htZHdlV0t1RlhhSXVDeWhdVFg7RlJTSUBxZm1zeFk/aG49ZWhpWWBdRj1fRXJdeGt3aHdfZGB3ZmE/RV4/RkNDdmhJaENLaWBxdWE7d295WXlpU3Q9WXVxZWZld0NfZGM/dmVlcjxjV3BnSFJZdWVteXBhYlVxVGhbY0ZNaVBdQ2VZRWFld0RpVmRpdlBjVVxccWVUZWJQc0NHS3RUZ2J3YVVwUXVPVVNjaWhJeUlvU2l5WUNRQ3RTQ0c7cUVIT2VRdVRaT1NLQUdPeWd5a3k9d0NLWUJxaXVFVXVwV3dVP3dNdVlteVlid1dad2VYXXhcXHdEa0d1TklHYWdXRmdjd2lncWdyXUNUR2NDR2NoP3VIbXVVSHF3cFdmUGVnRGdldWdXVXF0Vk1GX3FzYUNlQl9nTldTRGF1QltTTEljPUFGTGlTc01WYEVTY0NVS1djRmlZU091Yk1XbW1VSW1jQ21lU2NUcWBLP01KYmVMRFV5XVRQQmFvRnhsU2xZST1tYWlWVz1sdkBvWV1UaklRSnhwcklMTEBQRFBsb2lrbjx2Pm1Pc2VUV011amRvTmRqWmhwXnFuX011aWVzSFBPQElyXmhMPlVPcmFLUElZa0RyYFxcdW1EdGRgUV1Bc0dFVFxcXFxRWUF5Tz1wQGFKOnF1TmhUT0RUTGBxRFh2Zm1LWll1bkhsXkBTVXBWU3VtRzxXUzxSblxcWV1tb29kb0RMcFtNVmt4a1dEcUc8ckFwUD1kdkY8b0hAdXZATUpBWTp5eDxYcHlVWUtIb1dMdWFFU0l1b2FoTWdJUmo9dHBJWWo9c0pleEZYT3Bdamx5dk9pUVBRWUZIbztgUlVVeWRITHM9cnNcXE1rUFNPWVZteHA9QG47QGpaaFVPVHZKcVdpSVFZWFhYQG1KUHFITXZBTVhXTHdnPVdaYXI8YFM/UVdtYFZcXDxMQ0BrWXl2OlxceVpcXFU6XFx5bWRPU0h3PmB2VEBXa3hVQ0RTXWFKaUh3QWx2R3hTa2lUO1RMT0F1c2htRWhqeWhWR0RVWlRQWFFxc1l4VVBrX1lrR0VzO0xOQ01xdExZS3R2YkRzXXltcF1zaVBQWVxccUhRb2Y8Skk8Snd0dkk9WGxMVT1hbkFYUm9wV1hhc2A9T2hYVnFMckJwTj9xUldNamBcXHJHXVVCUU1vYVJAeHZcXDxOTWRXO0R2a1V1SlRPTWV3cUhOTUVKSERRdVh5UGlva2Bybm1UVVBqaXFvQ0BNVXhrUzxOSHBQVWlsbWFQXFxcXFZNQHJXQVhnaXBrYHJrbUxmcG1QaVY8aHJoZXJgQW1CWXRQZE5tcVJyaHdAPHBHbU5sXXBBYU9zPEplZHdBTFlGQVJeRVBBQVRBbFFweEtwbVlgRHNrTHlIcFFdaE9SVGpIRVN1YVdyVVViTVVMSEtWRFRwaE9JaVBJXFxPVHVyW0FQWVBxYTxObHZzWnBnTWdqQ3FrdWdiOz5gUGhsb1liXmBtTXh2eFBfbE9nQnFrT2ZoYElwRUd3YVdlbUhrPEFoWWdfTV5ydE93Z2llaUl3UXdcXHd4amhpaVxcSV10UHlweGpieVpxYWFbQGM9Z21kaXhYT2FvZ3NEb2FwR3JaQVpPWW9PQHVzWVtAVnlzSGtpdnlfaHhucGdvSXRnZ3ZZVnF2R15RSVpZPmxRaGdWV3V4R2RfV2pxeW9TT25IWFxcZ2lnVj5kZz9yO2ZhZE9cXEhZXWJZd3RPdEZOb3hXcHdIcVRudFFpZWxxYlRIbVZAbj9XW2B5clNfeU1YbWNZd2RZeHd5Z3hXalh4aUhJcW5RblFQZ21Jb19ZY1FAdHVwdWhYbGJhYFRmY3R2d1ZZaFxcWF9aVmRYd2pIcWA+cHJnd2V2WGBweHdTcG1RcWNaZ1pjWHNOSFtueF9fT1pveV48X3NASHViaGNXR2JEWV92Xm1BT2BHbmhxeHNKYXdSbmBsblxcaHZwR2dxTG5rQ0B3andyX0d0XmBcXF5uXlR5dz9xYztnXURAXFxTcHhYSGRGeXBAX1xcYl5gTWllRV9cXDpHaGNWcWdIaUQ+anFhbDxea01uZEVHXl1mZzxhZ0pmdlxcQGdTVnRZVl1wX2xHZ2peQFtvcF1SZ3RZYGdjZ3c/d2tDZnV0Vm9CSXFXeGBnVmJOP2RYXl1QSVxcY0hvSFlfeEFePk5hQWZaRmFxOkh2a3ZsVXBeQWlaOkl5PlBabmlxQFdmWkldSUZ3OkltRT9aSFlmR2dnVGdqZz9fbVBmQm5bdldfOl5rQV5cXGJ4YlVHZkBnZGtGbWtRaUdIYU9OdT1OeFtXcmVRdUJAZUpRY1phXVZpdmJ4XFxdSVpsSWBZZ2hqSHc9YWRFZ3dNd3ZJeXdrQXVJYWZJUF52Pl5TVmpWb2x4bl1gcGU9aWhpXmtyaHRqVnZfaGBkRnRyT2VZWWxYZ3VyZnd2eHdGV2hlb2FPPnNyRlpKYVpEP3hycWpDT1pNTnVacG5rVls9Rm9UQGdzYWlXYWpid3FxYG5LUV1beGM9aEhHSGJVVmZ3Z0JnZW1LSD9JVVZHY0JHRkRLVT1Zdj9xY21pY1BLRkJBVWM7ZFtRVkE/V3lNR15LUnlxREdzc2VLREhJVkxddllzd3Rzdk0/Y25LYnNVQ3VTZnV1eEpBd1hnaVtvWD1dRnZNSE1RSHhXQjp5Zks7RDpPWEVLeGY7Vz87dVV1ZTttRmZvYj1xRmRVaDphQ0F5Vj9XdGdBZz9DVFphc1RhdnVvaV5rV1M/eUVLYj1TVF5zeHJzSEE/Qzo9eWJXaFxcYVc7XUc6U0dUUWk+ZVlMUWZ4RVVBd1ZVV0g9aWhLeXNVU2M9Y0c9a0ZTX2ZvWVRCUVdxa3I+Y3dwdXI/O0ZxYVJNP1JpQVJCSWJYU0hWV2NsSWRBcXJgVUJJbWRpUXlVQ3JpO0M+bXRIR1JMVVRQb2ZfP2hIY3doVXVra3NiU0NgY2JVX3NWX3dwb2M9aVh4aE5aRHVpTFhLVGpjSXNPYU1ESUprUW53RVJRSVhrdltyTnVlb3c+d2deb3JQUWZvZ15fZ3Q8Z3dSZ2FWeXVBZ3REcF5DZnl3ZmBvSW9NSWNFd2piR3c8SGlub3dAWFxcXFxodEhmcHc/YndvdGhwZTx5cWFubmFHd212dXVYbFhWaVBXZ0NvY3VuYERRXFx1YGZaUGN1dl5NaV0/aWFJd3JteG1mX3BiX2dgaGVPcWBFeGxjVlpIdmFvd2l5Z3JhcW1HR186eG1weGl4d2U/YWxNcGV4cWpfaHluYXFPWXhzVl91YGNUSXlieGBHd21UVmpYcHVYbl15aG5Fd2xMWXF5eXFZcW5Vb2d2SGpob3FbcVpUSG1IWGdGcGZhb2ZjeWpZeXlYZnVvd3JnYXg7eWF2WWZQYVpbV2VyV25OT29XZ2VteGVzV3ZlaWBzR2dwPndyaGBlWHJdR3h3T2dmX2pwcWtGUGRvcGRfT2xKcXc+aW15dmdeT15ycWZWXnlEcXBwZ2ZJYWNjYW1ZdmFgPl86Z3FtUWpeb2JTQHNhUW5JXmNISGtuPnZeTltOaGdBQV5YWWpOYGp0TmBlZl9sR3Bib2hzb2NvaWpQRmBWSV9jVnVNZmFgck9dQ2xDZWpdQnZ5RHE9RFVnUmtXSHBvdVlVdnZtRDtvY15fUmthdnhlWG93Vzxld1VvV2NHeVlFdFRDQ0pzYlB3ZndlRnZtQmc/VWd3VDp5VU9dSVhBdGVPd1g/Qjs9SHhRRFhvVz0/SDpxRG9FUl1JVG1LdUlTV0RfREJjd2Zpd1VhSVhrYkZfaEZdaGI7YnBJRVZXV3ZVUlJhVEFZdD5fZkk9V1ljY3hxRUlXdz11QkBTWXc/R1FvYltzVVpjVUphVFphRVZNU0VrdlNfVGNvdEdLZ3B3U21vSDpFZE5PZ3Bjd1NfV3RhZ1NDd2trRlQ9RVE7V3c7UnhLV0BJVHdHVkJ5Q0JzY0dvdV9bVl55bmhJa3BBVExhTHF5T0pwa2BIdGBJUkNtVW1FT0ZVVU88dnFpa1lka2FMdU88a2JRSkJETkI9U2J5V11dcz9hdXFBbVd0TGVoVmNZbz5FS0pEdW50U09NTkZMc3BlcFZwb1NNTEZ1dnZ1UXh0TGc9cVhFdFtpeWJFa05gU19QXl5XYWU+bT9fd0pHXXNudnVnXXJQaXRIb11XeTx3bVVvcnZpWkVGd292Z3Ngb2dwc25mXFxFaF8/PmJuQWk9bmJfT1pmRnJIbnVgTmE9UXNod15BT2hOaFpacGZHX25MQXJOPmpQT2BdX2hQUWtraGhubmhRd3BNUXNuSF1jaF9SZmNwaGBTd11EQWlTaXJRdnJuYF5ieWdUb15lX2dBWG5tPmNIT3hyYW9wX2ZDd25PeXh2SGBUWFtLPlpbYHJBaWVbd190Z2NwaWZZSWpYVmBuSXY8WGtoTlthcWZYR3lSeGtqSW9Cdms9cHRJQXlGYGZHWGVYV3VNUXVVcGRBT3V2WGFOV3hjd3VCPmNIWXV4RltKXmI7aWBLR209dmpEQGRCYG5zSWNUT2I7R2xyT3lgZnBrUV5hSXFEeG9FcVxcSHluXXhed09dZFl3T19iPXdvPmlbY050a09zVGh2blF2TXlgXlhwUWlcXD1gYHk/cUlQd3dGXFxacVpXQF1XaEc/RkJBYnhHWEFZRm51VkRdZmNneEVtQmJpdWFhRUF1RXRxdHdFd2R5WF15eWtDZ0JbQkRZU0RhU0VVeVxcX3NkO1JKb2h5T3RdV2lzQ3RmZWZoeWVmbVRHUWdZTXlzWVJ3WXhjYWNvdXJsbUhvWUdoTXU+SVZ3VVZJU0I/WXNIZUJrPUhLSVl0VXl0QXdfc0R4X2V5O0hBUXVudXd3W1h5aUl5U2ZjdWJGX1dZUWk/b3dyZ3hQS1VyP1drY3NGYVJVeWVXSXhGT0ddYXg8XWZqdXdYZ3VrV1h1ZURTWWhBcUdTd0lJb3RYc1hGb2lDcWJAT1Rad1heU3hARHRcXGlqRTxXZE1ZYFhXbXRxZnh0bmBzWlxcdWNYeHJAcmR1WVBxcWZUTGpgXz1GZG5xdVxcQGluaW5yRmZLcGtMaWJ0bnZfT2B5cVpwRm1naHVVSGRKR3g+WW5XdnJEX3BJaHFHcW9XPl1Kd1o6SVtndlo9eGNjSGM9dmJpUGpAUXJyVnhIUV1JP3ZEZ2I9ZmdARnlQSWBUP2dNUW1TV2xyaFtlTnVdaWNDYW49V2xCZmVwaFtrV1s8SGZRR3lhZnRIcHFEcGBZTmdUXlxcV0dmXFxebkdnbEo/YVR5YFJXdFthaWc+X2g/cHlxalhHallJZ3ZpYWBna0lAWnRxYF1faVxcTmpqZ3RXV1pHSXZUcHhxQFpidndnYGJueVxcYGhjSmFxWl9ndGdrXUBhRHlac0daS0BweEZfVHl2PVFnXFxfcHBAYlVwXmNnazpwdEI/XFxNbltIRmJWUVs8d3VKRlxcZFdgbmdtd25tUW5mR3d4R05jaXBqSFB2TGF2W0Z0Z3F3b2FdR3lqbUd0a19fYVFaW2ZnYGheVlZ0QkdmRkd2ZE5kZW9fanhnQEFtdUhxPkZyYEFcXEtZdW93dWdvdUlwbD1hZ2ZIc1FXckNAb19xYnVXcFRObUJgbD5HdHFQcmF5aUp2XnNxYDtRXm8/c2hvZ0NwZD8/a2hod0dOa1Z2XFxuP3RcXE9jY1Zkb3htQkB0YGhjTlZkVGlsTj9zYHZzUWZtXVZ0X2hvcHhoVUZyZHNgZ0k/dVQ/V2ljd2hVcVhYO2N4ZUVmQ0lOZXd4O3RdbVRubVdwVUlBd3ZMcXg9SXZ4Q0laW0I+aWhFZ2RTQ3dGaXVKS2VjRXlDW1J1a0JjVXNGbWVUd1RbP0daWWQ/cWhFUWJjWWRrXXVaQXQ6Y0dSPUVxPUhZc1RaYUlKa0VHc3hRQXdjZ2lNZVc/XXhkd2h4S1JtbXdHRVM+O0lnb3M/PUVYWXVwc0lVT2l5aVhVc1RLUWZfU1NMdXhLZ1VDV1R5dXJUZ3NOWVZmQ0JTb3h3YXR3aVlga0Z5QVldZ2R0d0VVaWY7S1JjVXk7a1haZ3lqYVR5eWlyVVl1V2h2SUNFU3ljaVJldVRLdVNpdUVVP1dCc3JMd1Y9SUdhR3RDeWZYb1JRc2lbaWNuZXlvdUled3d5VXdVQ3ZzdVhZSVlBY3lEeVd2V1NLP2NTP3dfZ3VkZWhzSVVuR0RFVVh3b1hnYXVPU0lxd1daPUg+RXVVd0VJT3JLU3dCW1ZIPWdHRUVZRUVZQVg8SVhOdUNudWlRY3NZd2Vub2lkVXNJR0ZXaURURXR4c3JeTXRWSVJgW0drT0hXb1JiZ3VOTUY9R1VCYWRKQXJMaXdZTUg+P1dEd3NETXdwX0VMZVJOaWlJd1RGW2Jya1VyUWR0W1J5b0RnSXNEVUk/Z3NvVWZ2QXhEa2hrV2VBQ3hSR1RiYVhEa0lBa2lYd3ZNaUdHW3JkW0Y9dWZfSXU+O3k+Q1ZiV0VMYUhHSXRmX0I9P0hlWXVLWVY8VXN0YVdUZUJabWc7R1hNT0Z5VUJXQ2VjO1Y6UUdCVXlDXXRHR3NLS3VuO1Zuc0JnP0ZsQ3Q8XVRkW3VtRXJmb3RGQWI6P0hDS0JbTVdAQ1ZOaUZVX2VJa2NcXEFCcmlYXU1TX1llYWlCbktFXWFXcGdSYENJWUd4Rz1CQ0lnUE1SOmlnb1NIWD1nTz9oVk1UVUVZY1VEZFtHWj9SZT1idENEV1NDSWFmW1NWXFxlREJldWlbZHA7V3Z5Uj5HRXk9cm5lRU9TU0B1ZE9JdD5FVW1zSGVHV2phY2BhRmppVkY7R3VfYnVvVm5LVGdzRmFHY3drZls9U0FzRllbSHVRZWBfR1FfZFxcZ2lac1NvUWNDY3RFb0hzQ0NOXWdDa2VCY2hfRVJydWNdb3lYUWNCZ2ldQWVmO1lsa3ZlaVZvYUVQeVdBcVJvUXh3YXRjb0VldUVsT2l1RVVFb1ZTXXBCeU5bTHRyWU5faHZQbG4+eG9VQFB1XFxSQERyQ015bmhMQ21xUnhwWkFOYmBsTE1Tc2lSUVBXVFltV21MOlVNZ3VLb0xzUEFRQmBsbFBrXnFRZUx3ck1PX2F1SWlqOklVbHVWRHBOOmxsVmlRd2VUVElxXWhZWVFzP1RKVmRTYGR3dkhTeTxWTVVud1BXWU11eFluUGRzXVBVSWVRb3VNTTxMTWxxcV1QXWhlTkBrUVdoTXl4SXlvZXdxSUhsYE9pdXFsb2ZockF2Zlh4c2BpXW9rTXBweUdoXVBvQm5sWXFbPmlteWhxd2d5blFrRXhlRWdzYFdqeGhpb3lkb3dpQG94THdnaXdhZ0ZlbGBscGBhd2FcXGlXdW53dXdPd3J4dD9XeD5paFhvY1Z3dGFwbVJhXW1GeFRXcXhXYkJeb1dpd3hIZ1VPdGFBcnh3Z25OXVtJeFtJcGNHc3hhZkRhXWVhakJpZjxxXFxVSWU/Z2tfcXNCR19JP2FIUXBjR2E+TmRHd19eV2lMaGFRQEg9RnhjYmZpckBBc0w7Z047SE5JY047aUFzaF9DR0ZJaWljWEhXY3BVckZFZV1ZZVxcRXJ4Z1hCc3JOZ0VNVXhTW2I9S0VER2U6QWVvP2c9T3lkS0ZWZWNJW2VPc1ZSaXlFVVZoYUJqb0JFP3NjS0M8VXhbR0hdWVVLeVVLQ2Zpd0JoUUNlYWlHc2JvbUM9VXdLPUVvT2dhT2ZDaXNSYWdJcUlNO3RWO3I+U1NBdVk8XUZnY3U9R2dgd1dGeVg+Y3dYR1c/R1k/TUJdZ1NbYXZ1TWdnVUN1XXhsSUl4VVVNbUVKQ0JKY2M7U2ZXP1Zta2dEP1Y8O2hCRWhJU0NESWZjP3ZWcUVMTWVeaVlcXFt0Xl1HSmV2XFxnc2ppdDp3ZUJndD4/aGlBY0FTRGZjUnBLR2pjRkU7ZXJfR0plWWtVcnhxVEZNRndzVXB3SWFZVkVXVExhRkFbeG5dSGo/RlttdmJZRVVzSG5pZ2NFQ0BjUktrc0pxRmh5Rm5fRXBTQ3VNVltPQndNUlV3Yk5Td0xPVHRDWUtdc21ddVZzY2dVVEdlU2w7WHZ1Z0hBZEJBRld1YjptRGtndHVVU3BdWWN1ZUNHdHZld19lR013ZHRBSWJlQmtVWEhhdHVlckNNQ0JtckldRnM/eVtLSFhxVkN1dEZFZD07eD9jVlJVQl4/ZFFzY1RZWG1BdWtrQ0xzQz9DdDtVRl1TU1xcSVRERUdfX1hfR0JjQXg6P3NFXWJQSXNfa0hJX2deTVdJTUlOaXVDX3NOQ1NwcXI+W2ZPYWZ3R0dbZXM6a1dQdUdUS2Z3d0Nxd1Y6dXdlSWdMYXNyVUZvYWlTc3VheURbQVlARWl0U1JTP1NZeVJgU0hpU1dbTXRJeWVIW2NJd2I8W1VjVXlRZUdUd3N4XUZNQ0V1eXJUZUdYeUldT0dDVXV5YXJCYWJ0RXdAW2hndXdOTXd4SVh5d2JkP0Nbc2RcXGFXYmNFWmlDU0FZdElFbmV0UW9pYndGVUdDdXNYYElJYVF0XXNDeVtyWXl3c1d3SE11a2dZdWNHVUVoXFxTRGJPdWl5SXhJdm9DZlN1dHRZVEhFZj9VY1FfUl1Ndko7ZGY/REBxaFZHdVNJdWpBWVBxZGZZQnNpR2xtZWI7SUlTSVNXR0JxR0lXc3RzRnNHSGBtdU8/Y1JbRGVVaEI9V3dNSUZrVFRdRmpDdDtbaEI/ZXBVRnVbRT9rWT1JY3ZdUjtbdmtxRGtDeGJFZWpnZ1hDV3lVQ0hJRjs/ZHBnQ2dZZEplSGBxVE1Nd1R3dEZtRGRdSTpzeEZBV1pZdVlldG89cllRVkBBQms9ZE1rY0pnSFVbYkhfdVI9aGJFRUc/Qm53Q3VlY1lbQkZZWWY7eUFDVjpRQjx1SUFtWExfaGFtVFlXQlxcQURqb1ZAbWJLR2dmb0JFY1ZucXRvXUZiW3lYO2dQXWNTS2RTZVVRQ2R5U0NCQ2JPUUhuQWVPSVlOV1VPS3d2ZVg8b3hTQ2RGXUhkS1dVcXNjdHQ/dHJqXXhXbG5iPUpoWUtOPFdpeFRvRHQ6eG09QVZnUG5tRG1NcHRePHZSUWtDQFZfVXJ4VXVzPFZNQE5MPW9jQHRnYVhHVWxmWHB2PHJ4dVlHVXlAQXFRZHVgVHg9dXVlXFxvX0xLXFxxdlJdWXdcXGB0X2tfXmRHP3RCQXlIcGRXRnJfYkdpaUBJZWE9Y3VBd2NVeGU7eUVBYnJrRkZVWHNbaWlVUnlzVm9HRVNPRk5jaGJtcnNtVltrcklTeVdzU15BV29fVGNFQ3lhZ11ZaWZBREhnc2BFVmlNVXllZk5BU3dFdXlfYmJhUzxbSUFhZWZzd3ddV2l5WWh5V2Z1VXBjY0xDR0tVQz1PQmdRaGdVYklpQkZVUlp5UktdUlphaUdgd21xSz10dlNRVERFT19BSmI9UkRQbUBlTG9pd0JVSldldVRxck1tS2JYd2Bob1NlVzttdGpxUlRIUU5QSmRUT0FQeU11eFdIWU5RTnR4WGFhVmRxUVlBbUJlVk9YUXBkUUVVUj1FTW9NeEVFVUFFdENRUXldVlxcTV1bQXV2WGhpT3d4SXJYUF1VQGRfZ21ZUWRVSXhMZ2V1YGhyZmh5WXRaPl5EQGl2RnhWT2lzWV1RcFtjQV1QUW9GeG93Z3ZET2F3YWttPndSWXZJP2hQb29XTnBsbmFAc05vWFJPSUdFZEtbd3VzeV9zaUZ1VXh5c0lJdF5hZkhvd2pZdlljVUV1V3hVeXVLSDtvRl5xeXV1d1t3YnFjSUprV3lld19zZEBxdjxnZz11VXBzSUBbVk1vSEpZaG1TSFtJeEl3SXRBQ2dnSXNhZE5JeWRTQ0Z5aHZzWUlfR3k9ZF5Dd0hLQ0pzeVxca3ZCZWJuW0RXa3dJX0haP0ZMW3Y+XVhcXG1JXFxjaVZxU2dZRFM7RkVHYnQ7cz1PZXZzc2NLaDo7WHdjV0ZlZ0pLWVA7VnhHc1RBY0JVaG1DdU5JRFs/SVtVRWM9VlVBSFNvaTtNR2Blc0RveE5HVWR1QkJVZWdFZXNfQjphVVtrSHNPQktDQmpzd21hWFJBdUtJdTpHYnBbc1dfV3hrYztPZVFraFVrSVBTVkdddlJBdG9tU3VRdF49QklfUztvRG5BV1xcVWJwR1J1T1Rra0ldO0lAY1ZjQVNQTUlDO2ZfQ0VqY0NdaXdgZWhWa1ZQP0M9Q2JrP2JzUXRcXG9JSmNjRHN2c0FSbT1mRztCSz9iUz9HRm1HYVl2cWVSVW9DW2dJOkN4PVFXPUtzRltjPXNITUtDYWV3WFF5PV1UR3dEbV9IPVdVaT9JS0dnTHNkeW9WbFVWRkFpWmF1ckFyWl9ZSldCYmVVYjtjbGNzPWF3Zk1SR0dFQj1CPE15XFxdc2BbYz1ZaXdrQmF5Y2VLUlFVdnZlRlg9ZztTQkM9aHhHSFA7SF1VZVdVRWNXZWo/cnBtR1t3d21jR1NxWHlJcl5RV1B5Yz1jWFZVZkRldG1NYk1Rd2xJRGA/ZUNDZUNvaWFLRFtFaFVHUnVtdUc/dXZ3WHY9VGRrRlNXVmZzSUltQjtBV1Vddk1HeVt3WG9tR09zRkxXZWJxUU5NbXVVTkdgVF5QV0dYTElEeHZka0JNV3JxdVZESlNFUUxlWV1MU2Nkbk5wSz5cXFJuPVVHZW1FQHNzbG1dPE9ZXFxyXkhqT0V0O1xcTURha3RMSj89TXZxVnRESlNlcVo9cGd1dVpQWUNNSlpZcl48TmdhUVM8d0JIT0x5U2l0eHFtcXRVS0dZd2VJU2lYdHZIdV9tU3VwcXN1aXNoZ3lpcWNXZWRxaXZAXWU+a1pndGRnbmh5W1RPXWNnbW1fd2xPd1F3XzpJeD5Gc3JoeUN4dmJ5c3loaEVmZXlBeW1Hb2F5cXRnd0RXdl1OXmJxeFV2Z1p4Z1ZHaT9maWR5bXh5Z2Jocmp3cnJZZ1FfeVF2YkpAZXBgaT9mcXJRckVAaXVuZHZwaW1ZWllebkloeUN5XWx5d2leaXB5ZWJhbm9ZXWJ5bEhBYW1obU5Rb3lpY0Zfa015dXhfeWlQcmpfaGlYcW5pX25weU5ZdFxcZ3hySG5kcXhoaV1DYWg+cWZtWW1kZ152bnlBeXR3QWxYZ3l0WWN0UF5HaWJhQWlLdnJkUXJgb2ptP29lQHNcXEBqQklxaWFiREZfQm9rXz9nZXdtTUdoVFRbQ3RYV3Q+UXlDO1Vqb3NDYXlOQ3JSWXRKX2hxR1ZuV0VMVUlNV1JNP3Q8YUlhU2VEY1RxZ2I9cWV0SXhGP3VGPVI8Q0U8Y1dXY3diS0h3R1JyYXVkc2VlO3VTVWVtWVQ+S2JAaVlXV1Jdd3JNcWlaU2ZHP2JXS2lTYXZEYWJYaXJzWUlgT1VbPWVTcWJbU1JYR3RKW0hGRUVqaWQ6cWhfZ3lUeUg+W2JpY2k6c0M6O0JCO1JMQ1RKY0Q8UWJ4SWZ0R2NzZ0ZvV3RvO0M+U0lZdUJ0W0ZoO0J3O2NAO3V1W3N0P3hRU2d3QXR2XUNPYWhdQUlCU3NiT2lpR0JISURrV2dJQVdoPURzT1c6V3VWQ0Q9b2ZbY1NoXWJja0N3WVVLcUNBQWdkT1ZGYWRuTVh3P3lPYXJtaWJdc1hTX2Vja0RWT1hAc1hbd3JFUXlLPXVFWXVMR0RPcWJQbUI+XVdUQUQ/W3RjWWhJbVM6cVZKPXdRUXZYUUc9c1ZiRVdSYWZDbVJrQ3VeZ0ZSS1JNQ2k7U2ZnPXZ2U0Zkb3Ngd1dvW0hLbWZ0VUlbR3RpW3hXaUhfWXZibVZmR3dCd1JbV0JzVXheX2NXWUhHa1NaP1NrX1loSVNZc1JVdVZgZ1g6c3Z4Q2RbdXVtR3J5Q2VwQ2NGeVY/dVRzSVhMXWk/WVhJeVhuV1VjRVk6TXhuS0Y/bWU7ZWZOT1RERVM6TUNlTUN0Q0JTX0lNY2c8YVc9XWZxZ0ZTPFdVaG9zbXNcXGBXVVhYd0BTZlBzOlxcVnFMbWN4dlhoWGZRcHBoWWFcXE9YPFRabHBAYU5aZHh2ZFJ2XFxqPDxNUWRvd0xreE15YlVxc3F0V1RtR113bGVSXk1sU2l0Z1lLZHRvV190cHhfV3F4Ym92SnBtckBmOnd2Rz5aTFZjc3ZtVGhfWF5qP1l4QEB3SW9fVkFjeV9pb2lfZ3dqXmdseXF3bXhjWmhwZXhsTWdwUHduQ0h4a09xb3lecT54cHl1cmB3R2B4dFlzWHFiaVBpV1ldcnZlQVleSWZhPndteXl0eVljcXZleVleVF5dWG5ueUZ5cnl5SGheZllhdWF5UU50dXl5WnlrYnlteGZ4cV5lSHlaWGl5SE95b3h1dnddd0h5UW91O1dqQm9jYm9fOmlreU5xSHB5c3l3eEZiSXFnWXFzb2FxbGlwaXhucXd5cHl3bmhlaXdMO3ROX2V1UXJRY2hza1ZVSWluUWRRZ2lWb2d1cXlxYUhTUWlzcVJwXWRBRXF2YXJtREtqTWtteVhkPVFTYWxWbEpXYXQ7VVhiWE5JPG5eaXVtTHA9aXFnTEtKUG9meHY+aHJMbVBNUXFKRExDSW9CZEtMRUpydFY8ZFdcXFxcUEBxcVZESkF4cFdkUFM9c0tMTnBoVjpFUFZkbmVscj5Fc1FIbD1AWUJda1ZcXHJfWVBicHR1SVFBaWpDQHZAaVdddVJsZVNaPFhGZXNNcXlUbFBsVUx1ZG5xYHBTaXNGPFN3PVZvVE5wdHI9cFNqeHZDQE91bFhJeG5DYHJKZW88WXVnSFVIbEo7PHZPTG1JbEtXWFduYEtGPVNCUWpbTXZWVE1UeU8/dXZCRHA+XVJKaGtcXFZnYD5scVBaWklpZm9yYWd3QEFqQz9vUUFgZ19qUEdaOlh1dElzUkFnTGdoTWZiRWllO3dvVFZsZG5dQVZcXFNPWz5Gb1xcT25DSHVlaVpHWVxcWF9db3djTV5feT5wWndhbEZiZVhpVEl0V3FibVFwSGF5Xj9rU3ZeallkV1ZnVFZobm5edD5rcG52PmllPEl2d2h0QldxblZ3QUdlYUl5X2luUkFnaW5iR1lsW2F5aXlgQVlnXFxIbz15dnBgXUBmcl5Qb0xmXnBeWktgc0xBYnBWXFxgQWNWPnFaXnNEcW15d1tgSVpnb2hOeW9kT1pkV2Jjdm5zYWY+b2lqR3NuYXZrQWJyaWdgVmxgV25hV15lR2tCSV94RmlNUWtcXHBjUFBqXFxvdXVmakNeYkRwYF5gbExPQ0hvO0RPZmFRYFR1WHhqW3FYU1BwXFxJdWtFTXJUb1ZgVlNddDtkTV9sa0NNUXF0cnRpang8eWNBUndldnZIUm9RTmhIdGRIanRkV1VZTVNAeWZAVHlITFxccGxNPFRfYG1hTGo6aHNbbHVsbXh0TXFkcWxHXXhqcXh3aGdzQGdXUWhUSWB0ZmNxcWdZZmd5R2JTQGdsRmU+TnZMaGtlSGdhYWRNcGlsQXdIcHB3d29SQXBEcGVzWWNBWWc8YFpHd2JURlpLV3VLRlpATmVGeGh2QHduT11keGRjWXZZYXE/cHBJcGNhcWNQeGhXeHFIcGFuUXNtQGdYYXk/Xm8/P11VZl1dSHlFcFxcS3F4Z1d1Yk9pYG9qeHl1eWZpVHhhaGBhaWlaYUd0QXZ5cnljY2FqTXB0cGhlSVhraG5pZ2ZtdE95U154Y3l5bUlodEh2dFhnY3l1eFZ4SV55c0ZmZ1FhVE5kXmh2aFl1eU9dR0h5ZGhkbklqeU55QmZlOmBqQEhrc2dwXVd1UEFtTU5pWnlwVFFgQlhcXD9vblt3dnhAeV9eeEx5ZHZQbHhYeW9Zb3N5eFlneUt5XUp5Zk9ncWJYWm9vdXZId0tBdFNWdG9Yc0hXdEZpcF9BYEZfZkd1T29yam1TdUdVSFlURnFkTEVTdV9zam1Gb21UWVV0ZEFYcXdzP2FHZT9zcXFTeHlVa2NXTkdzZGlXRz1Xak9zVmFIQ0F3OltSQVFVSnFYPltnZz1lam95TmtlR19nPnNpYj9yclNZZT1CQztUdWNWbElZWm9iRENXWmVnTVd0b3dnYlVTTElZdVtnXU9IRlVlPkdCUmF5dU9GPEFocW9Yb11ZVFdScXFCZk12P3NVSFtnU1tURldUbWdjSl9IWk1YWz1SVUdyS21mRmVnbVF3VHlEO2NXaXlIVD1EdUVidWV0TXlYQllEVktpUXd3dW1HRUN2OkdzXnNCTklXaUNUUFtIVztVUD9iSVlDOm15bHF5ZD1lcVtCYGFUWmtJUHlHPmtVRz1GWWt0WUtGam12QmVyXktURktES2N0UnlZPUFlYUVZYFNFc0tzXFxld0NLcmhxSEc9SVdFZkdtaFRrRkRfRGF5dEpPdD5tZUxpeV51ZUVjaFdXUkdTRW1LaFA9RF87Uz5teVxcO0RkO3l3XWJ4ZUZOQ2RZR1ddQWlJc0ZybVhAd3hcXFNUZlNXTHdCYz1FR0NjV0tURU14ZmF1RFtmYG9EaEd3S1VkWUN1O0dYTnd0UXF0YElIQ1F0YldpXmNDeD1SdGlpXnFCaG9TTGticFlFPWlZeD1FSFtmd01ZZlNVXFxfQ21BZ0ZVZT9FZGVtckJtdF5RU2JZd2dxVmJLRFdrd1tBVXJnWVtLQz9bY0NVdGo/Y1Z3YkhhVXddd0RFR19fZFl3RUtLVEB1Y0dHRHVxYlBDSUVpZ1M9Q2M/d01Nc0tvU3B3d3VZUnRjSWJBREBreFB3QlhjZmdZSXFhclZ3ZGVPQ1p1aWZJWWVJdVY9d3BnU0lXdEhnVXU9c3FDc2JvY1hNSVlvU3VDeFJNWWR1dlhNdW5HWUVTeVRdYklbV0lZZk1rVGhjZk1xU3RrZElnRVlTRV1XR3hNWEljdXRBd3BLWWB1dz5jQ29xdHJbYmdpRmFlZ113UnFdY0pxZ2tHQ3BDdVxcc3Y7d2lrQXVPX2h0ZXJsS2leWURZbWZVeUhpdVdlVXh1bUdyQ2V4O1lrSXVuZXhneUNBZ3Zoc2VReVJhbUVtX2NYYVloSXNuP1ZLUVZwQ3J0Z3lbd0ZiVXVId3Y8YWlcXGt4b2doaj1ZOm9zVEFYdlNXVDt5X191Yj10UkF1YmNZaXFnQT13W2dndT9lamNjVV9CP1dHYGl4TUlTZWtETFlzSGVJQG90WGNpTFd2SVVoc0llPW9iWUNZYklSdEd2QXd0THF4YW1oY0tIbGdkQG9iQEd3PmlYZUl3PHdkVz1TYWNnVXVVYlFZWmFpdW9ZdFVFd0t5SllSZF9pR21ibl1FP1VzUW1nXFx3RGNPWEhdVVFnZV5zVlxcXVlGb0VzPXg7bUZKO0Y9VXNPeXVPV2dIT3dyc0hKdUV4c1hZcVlVc3l4Y3lzeVZLSVNlaVR1d1V0RVZrR1lPb1ZMQUZJO3hWaWU9aVlgcWVhZUVrVWRbd2NhUXZ1S2RRYWhmX3I8P0JAT0k+T2JQUUc6YWlES2VIZ0lHY3dyaWN3PUhbR3ZWY0RPQ1ZMV2hDa2NeYUJZRWJQPURfYUdLSUNcXGFYYEFYVWN4QldySXFCOmd3dEFSWGVlcWFod3NZPUFibHFpRG90Tl1TdVFJTUNpYFF5O3NSd1dnVFNYYUdXTVdjPXlIQ1V5Unl5U0FXcjtSPk15TjtiWHdzSFN2dD14dGVDQm1yQWtGVD9zUmtjbD9kUT1nPE1JQ2VFZE9VYj9VQVt5ST1CVldZUnlJO1VkQGdVbUNCQXd0X01yPE11W09FZ2lVdztUXT1GSHNZTDtRQXB4OkRsaGBZY1hyQ1R2clxcTXlgbnFMS21Yc3NNT0ZQd3FwdlxcdFhyZHV1bWxaSHFUbVBjXU1xaFpJQWtGZ2tuPm5BSHVTcFt3WHdBcHNZUWxtYW5yX2BpeGJNZ19IZnRlWXNSRnU+QW07eXheUHdjd3FGZmdsZ148YWp1R2pOcVtuQXg/R1BTV0xBSUlZQ2FtaUpHRk4/Rmc7dGJDeWBhWT5TQmppRj9RclFRVUxpQ0dJbHV1WWdMWEB0U0VASk88VVl0SnFtcWA9V11cXG9pcGtZPFFdeU5seUxjYVJQRE1LSGxgTG9kSWtIeHBudXBxaW5HaVRcXGVQPFBOX0BwXFxseVpsbUJQUkVUa05kWENAT0xxVGt4WXRhVERFT19geXZUTEpIbVpYWT5JdDs8UV9JdWdwdnNEeXBIbVpldmZgdUJRSnlVcFRYc2tUdVtXYktGbDpJW1dBa0FoZ19wZE13X1d2az1vc0BebWlQcj5nY0tXdWp4az15XlxcV2lKXmpeT1tpUGBpUGRDRmJ0PmNHV2RXVnRMP15ZdnJsUWddZ3FIZ2hvSWZVP2ZZeWtHYGp3dl11cWV1SXhpPl88TnRoaHZyd3dFb2NfeGt2aHY8Z3dib2dEaXZPaGVNb2c/dnZNcHg/R2dvVm1nR25pZmFIYGxNZ3Z0X1dfWWZLdWNZV3lHRFlhcjt5dnJjeWRfc2RlaEB5clFdSWl1ZVFdaGxxY2dxWFlfdUFRWF5tc2R5dXhjeD1tVnFnWHlldEtpdHNFRT5pUmA/QlFPRnFpU2FLQkxTQmtrVmtHYl1HU2M7VnJhdUZDdEhHZTpnd29pR2NLaFppdFFPdV5PY1dvc1VNaW5vZENNWUFXWTxLdT9vVFpVYj5VYnI7VzpVdU1FdFBDZG1DYkhvVE91eG5tRml1c2JdSWZ1VWVxcnlPQnhDRlpjSF1dRT9VU1VHRGt3Uz1Hc3hpV01PcltfZz9PQ1ZZZmZxdVRveHlBcldVdF0/ZGI7cmdBZ1xcO0I9aUhnQUVXUUhzO1JabXhuP1VXV2hlbXJhZUNEUUg/QVlaeXg6d3VqaVU7Q2I6eVc+dVg8Q2I6O3hBQ2I6eVVKd0VHbVN2a3R0PXVPU1hibVVeU0RST1NmbVdvW0M8dXdDbWdaeWZeQ1c+SWZtUVlkW2dnQXVnT3VcXEVicW9IcU10SGd3OkN5dW9WblFiRFV0Xmt0PUNDUztnY1l4QF1EYnlXdGtDXmlEPVtzZz1lWD1kPFNnP0VYb2tEYnNYam9WQ3FkWUtEQEVSSz1vcnB2WkxSd2xORklQQElKbT1yV1hsUElwVFxcUl89am1RbG5YbXhEVW1EUFV4TV5UT210cEdwVEBQcTxgUmBIeG54eExoWGR1dnZgTjxdWHlRb2Y8c2x5eG9FTFp1cVdYV25EU2xcXHNjUWxHPVJcXEV5eFBTPExUREVfYz5eZ3FhWk5eWXF5dVhcXGp5Yz1OXldQYj9waERPa0BfXFxxQHRsQG5gVmN3X21weWBtRl5MQFxcaz5gWFZ3QUhpWlFaYlljbXhhc0FeaEhhOmBhRGZ4UmZ3QT9xVXFdPz52S2ZgZF5jeGhmb1d2cGB3TnBgb2ZcXEM+XFxTdl9zPmdTP2RoTnNmUG1sV3I+T2RgYV1Ydm1EZ2pVeXRYYF1saGFuWF5EYVpzR29DZ2JmUGl0V3ZdV2dEaXNtaVtUWHM8YWlhSGFQSWdZd25RSGdGSWNUUGtzQWFneXB4P2tmT2pnSXNoeXdDcGNQdmpXYFxcUUhlV1BcXFNma0JIbXhuaDtOXWY/W1NRa0M/Z3FObzpveEJQeWZxbU95aWFmW1pgWmpvWnJgb1RXYEtuc05vb1dYaGE/Y0FHW2RYaUBhYUV5dGtIbTpPXFxqb2lHQWE7WGpeXnRlTmF0aVxcYVdfcUZjeVFtYlhyTUl5eV5ncF54U1Zsb1hpaVBfZXd0bnhnOmlsUHFtRk9oTlhfO1dzdVlfbm5vZEllcD5kXUFfVD9gQVBdUF9iO2Z4cXl4PHlnPVd5bj5aaldqakFqYHlvVD5vbEZbO1dpUHhbOmBdcl94bmFiRUhjTFFgT291S2lkZ2huck9pXFxIc1pRaV93aU9Ia0VBa1RxanBRaFJedURwc3VOcl1PZjx3dUhudFxcYF1NVnRWQHVKP3BgXl5zZ2lkRmtWR19wR3BgeHVePltXQGdjYW1XbmRtaWpiUWRaXlxcRWBbO094VlZsYG5gbVZkPVdwTGd4Y0lhb25iTT90XFxBbV5Za3J2W2dhZV5fbT1JYm4+bmtQbDxXXFx5XnZsRmJAbmhuSWg7QHRzZmJKbmpSUXlBQHZ0aGN1UW1SQWpmQHBjPmVaSGtfPmNTZ2p3V2lCSFtbZ2RCV2BQTm1CSGREP3dhUW1RdmBzT2hDP2NaZnBNbmlaX2N0UHI+aWpjRnNuR2REWHdOcG1zd2dyRnNAZmpSeVpKZl90eGFmd2lld2J0SGFReHVdbmdSdmVLaHFaUWxwYW9UWHdtZnBOUGRER3k/Vl5aVlt0Z2FdQXFhVmJBXmFLUHBsV19jdmFGdndWR1pWd2BBaXNfRnNLb29JWGtCeWhqWHNeVlpDeHBLb2RVXmFbTnBEb2N3R3U6QGZ2R3h3eW9dV1xcaEBySU5mZV50PVZqPV9jVGBnbFZvbnBwX0ZjTkd2T19nPW9rRHBiPld3TmZqZlh1ZUdfdWBxYGltYFlrYj51UGF2dnBud19tTUhxd0F3blBeYlZhcUljTEdgQT94XFxua2hJcXFJZFxcVl11WHdhT3Y/YGY9V3VZWXZTSHBVR1pCSWxgcGBdT21uSWxOWGRVaHhGP21hT2NPYGpDT2dgZnBNaHBOUXVJZm1NRmJRXnNLSW92T1t3SV1kbl5UaWxnP2VaWXc+eGl4SHhPQVxcT2ZtW15xYF5gW0hdUT9mcXdmTVdnRl9neFZbR25ubl9qZEZeW2hxSmldPHF5XXlqZWFpWF5wUXY+WXd0W0VoZVR1O1g9YUlCdXZAQ3hTO3RoU3dlb2JzVUg6TUlAX1Rzc1JJY1RTeVY/Q2lwO0JoeVRHa1RvPVNYZXRoZ0lEW3Y9W1NpW1RfYXhac3NBZVJNd0NWV0NnUVNZZVQ+R3RUb0ZUQ0I9U1hyaVVqXUZoc3ZYX2h4PURoXVhfS0hzV1JaU1RnP3NWX2NGSWlqXVhZd3dbc3VKb1hKdWhdXUk9UUVQT0N1SWRaZ3NCX3lPZUhIRXlNXXdOZ0VqQ1M6Q1Q8VWVyS0hSR3hzRXRUXUZ3a0c9YWZvQ0RaS0dHQVJBd0NBd3VEZXRebUdBQ3M7eVg+d3M/b2hBUWRXO2VdZXQ+b0lRa3ZnZVhFQWReb3dZVVJkdXJvUWNhS3VpSVVtc3dAX2M9U2lpQWU8RVloPVY9a0NrXXdvXXg7T1dTS1hUY3VJQ1hZR0RLb3JKWXhscXVeSURSP3RWQHdqYXNOYHZ4ZHBzdG5HQFFqTHk8YHNrSExXeHVjRXhxcXJ4eHFZWVNzSXlQeFZYSFlgYE0+UFRiZXZEaWxjYUpeWXdJeGtMSXQ9aFFuXW10RUs9YVI6cWpTYFdyUXRraHlnZHZaPUtGQW9aYXd3XFxQdnRvV2BzUmRLQkVPeUBNTGlTPklvdkxQTnRTbHl0d211SnRTTD13YUFORnh1P3RWWHRXO1V0W1l4ZFV5PlVMYFFSTGhzVHBuPGRLbGlPanlqQEFWcDx0c2BPdkFyYF1vUElObGVYUk1UQ0luakVTREF0c3ltbWVOSnBTRDxVb0R1dkh1VlhLeGFKTHVvVHlTblxceGRxWEVtSltIV0lhU0V1UkVQalNUVG08UnJhdURUbFBIUj9MUztNTGphWWU9TU1Fbl9MS0JYU11tUT50bmFdbHlgcWhJT1plb1FFdkFoVFM8SmVpT01Ic1VobW1IdVlEanJEcVhoeF9EUkBNWFpFV0poS3B0UFVIeHN1TTx1dlxcTG9PVXQ+SGtXcFBeWXJgeUtrSG10aFFNQExJWEpSSVNlTVleaG1WaVV5PUtlaHNqaVNScVVnQW5pWExDbFRGTE1BdXVmPXNTaVJkcFlKXFxOWVhyPVRNYW1ZT3lUSkBLblhLXkhKU0xyc3RvQ1BNQkl1QHB0aERQSnlWR11rQlRueEVWRlBZZUxxeWF3OnhLYVVYXUFtd2RWdlVVbj12OkRyYFFtR3FuUEFWT11NWlRRZ0BrQWFqTml2a0hrTlhNT0lzcjxXUV1ueHFXd3VLVmVXQWxSR3R0bFxcTmhscnZ5UkFUUEpITmtAUkVZb1htcUB0c2g8dnJ4U01VeVhZbExJdFhgbmd0TENgdz9oa3ZlT0NYbTpBUEhNcGRsVV5odGx4dlRBS2llUnI8a1FAd0VJckxwV0w8TVFQVEx4a0xNU2NVTlp0TXVoeHNMVXlAb1Fwc1dFUDpVd1BseGpRU1ZheVhRS2dkVGl0dXhQb0hUS2NZU115UFtUUWlQUVlsb15lbmJZcmxBVG5scndJS0E9WXdwcVZxcTp0WF48U3FEeWdsa05weFhcXGxwdExGVFVzdE5HQGxGcXNrSVJjQHZGYVJoSU5XRFJCXFxuPFhyS1FPSnVLbVBNUmhUZ2FUPlhWdWFLXFxIUFNAVG5QUj1wc1NUbFpsa0dBUUZMWT5EU2NNTUF0VnVQd0doWUdVTEhxbFVJVzxtdnBRWGJNVXdoa3dFb1JxeFl1dm1BdlZkS154a21IdWhIakFVVzxZbnhQTWtEUVJNdFFlVjpkSzxFdElJbXJoUW1tS1xcUFNjPXZBdHNESFVIWWtbPHc+SHZ0VG0+ZFBGPXlXSU5JQG1KRVJKbUtCZXJYSFVnSVRvQHFBWVZsSWo+YWpCbHVrdFVneVVzPFVLSVFBXVNeTU9uWFdrdVU/SEtJYW9DWGpEVGxqbHNAbUtMRU5cXHFWPlVLWm11XllTQVxcV0RAUFRRTEFVbURcXFhMbHJESEtRWG9HcXBabU5fd1pwP3lwZ3NscHBOT2FUYVtcXE9aXFxYXktHa0pebj1peGZvZnRoYkVhdG1ocVFZdFhPYU93X0RfcEF2XUtQb0M/cWJYaFBAY1BBYGtYanRIXlFnZE1gXFxKdndDcG5DX3NRR15HP11aSFxcO3hjW051RVZobz5cXDpBYkBHbnZnaGBJaUlhYl9RbGtAcE1hd2ZpZUtGblA+aj1ZX2FedU1WbWA+Yzt4dj9ZaF4/ZU0+cmB4b20/bl5IZ1ZeZUxHWkxWZkN3bWc+X1pWdl1RXj93cnVHYEVJc3Z2eHNQbGNhWlhmWmw+a3FpbDxZaV1od1ZGXFxLQF9lWXNNcWlaX1xceXB1RT9tTHFyVHlxSXZbcFByVGZ0TE9jbElkREdfY19aPm52TXZldV9nTnBxb0F5UnZxcnZgaG53XVhgUHh4a0ZeU1duWEF3d2B5PEFcXGBOaEFfeDxBc1RHdnJOdDo+d1tnWjxXaFQ+dU9XXUlWaHBQXkhAbnNIdGNoc2xBW1JYb2xGbWVeYmB3dXFgbVJ5X1pAaEtJWnNAYVpZc2thazxubElRcjtRdXFGbF9gcz1gWlp5ZmRIbk1OcVtgW2ZZbXBudnNOdGp2ZltfbUQ/YWZXYkpGbmlHXXhpdF5QWmJRaURYYFlXZUpuXFxqP3FUV3dGcGtNR2ZheWs/SFxcOkZkOj5oPl9lVD9vSnFfOndfPFF2aGZkPl5mcWFvSVl1Z1dtdlZaWEl2aU9aeV9bSnhqYEhgO09aW0BdaElvbHhxQHFtU3FcXGdAd2lIdGxJWklwck93bVhIbWRHaFlubHFxdGI/bmhYYkVRYmVAcGdPcD93ckhmdENnbUBhdlxcPlxcdF9dOk50UXZ4UT9hWUFjbT5rPEdcXG9pZFxcQGtBT3RbVmpycWt4X2BHRmhqV3h5PnBzcGRHd3dZcHhvSXJwYXFjd2VVcGFHWWBUb2xLSF1XRmhFcV09ZmdFcXRgV2xIUGRJeWdKdlxcSnZaQ0diclBweGFtZHlcXEBhWkhpd2pJZVthYkRYYFRXbj1QXFxaT25fSVtZSHNWXmBzPnROR3BwZnJyXmQ6YWJFbnZjP3lFPl5JVmxqQHI7bnJQYXJGUVpdR2c8X2JVYXlYXl1aeGNiYXJKUHJbdlxccnBdYllcXEhZamlgW2FGX05pdVxcT3g8SGBTSGc/X28+dndfcGFNWHg+ZnlTYHZtVlpBXnN1SGFtTm5rWWdsT2ZAd2FsZmlvRmxIQWJIUHRvbltcXHdtOmlwYkFwbUh3UnhhdWBePVlrS3Bsckh0aHZ2ZEdAT1hWdWVQVUVVO1hEWURsa2R2QXR3bUNOX1JbX2RMQHV5TFB3ZFFHVVBtVFBuQFY7UWp3cVVwcXV3WFlzYFlRYWxjQVNPUHNZPU9reFF4aXh4SUxUZW5YXWRUP3Q9d3JpPm9tWWtqd3JeV2x4SHhyQWFXV3hOQWF3RmBQQWY6PmpPV24/cF5kV2tmcVpLdmZnUHBQPnlWPmdzSHg7eW5iWXFxb2E8d3N5RmZPZnVxYXRtYGhXaXFJWHRjWGdQeHBXdnhucXNLZl1wV3BQZ25lbmdyZE1hTHBpcFdIc2xUdGRpbUVgWVxcUXdVPHdiaU5tQVd4QVJpZFlcXFl3S3l4SnlKeER4Oz1xWllUSUhVWHFwd3FuQXBtXFxReEB1bmA9d3h5blloVF9hc1l5T1FMd3hlUEh5bXlJdFddUVh5VmRIWEFAWFVcXFN5WWtGWWtnVHFAPXFWbFdNTVNzWVNheUtgcU1teHFDRHJbUG15aHVwWE9zWFRydFlTeU47QVFqdFdPPVZuSW5rdW1oT3RcXGhzTUZaZ2dtSD53c2ZiOm9iVVBlVUZuR19gPW5gcU9qU3ZbUG95YV9rU0hcXDxpc2w+Zz5GWmtGbEBQWkhBY1g+cFlXbG5uZmhmaElXbXRGd2A+c2pWWnBBa1xcRlpqP3ZAeHM+XmNMQG4/QWpzXlxcUHZiWkhscm5ocnByYEhkcnFxPGd5P1hqbmBkOlZbYF9kOj5sUmdiQVFbeWFkTVdsWnBhPz9gUE9fSmhbWldbQV94S2dwS3Z2WVZab0drTGhnTXBhdW5maXBdZkh0THBlZ2h4P3BeWldtdG9aaHZkOl5pO25tc2dcXHduYmpfbUBXdUhwZF5ZWmVAeTtmcD1ecmR4bl1fYXNIcndOaUdvYU1gcGpub0puZV5JYnhua1o+WztQXk5eXFxiWVpUWXBWR2BLPmx0dnVrdmI8Z3VSdmFqV1xcbnlcXD4/WkhHeUdBYj1YZHZfZ25nX3J2cD1gY2JnY0FgYDtuXm5wdEBGYUA/bkdOZUhhZj1ZZnlebVNWdl5HWjxpamVXeWZhaEVYdWhXcnVRd2J2ZFxcXl47bmU8eXZGUWdRXnVqeHFUV2JbWF5YR3JGXnNJTm5qZnJwd2k6SWNSZmhicWVJWHhlYGRuQ1h5ZEg9d2JlVVlneG1VV1NjU1JLeVN5VjxZeTxhVEVLZW5bY3V1Z0tBaT5rcm55c19vRlxcW0NuR2ZXd3RVa3JeYVdQQWVaU2lZb1ZseVhaR0NhVXJidWRcXHdjaFVEdHFWcWdoTHNybl93QU13eV9JcD9IaVN4bm9kZk93P3lJT19yQXFza3N1VndHVz9nXFxtd2drZ01bVkQ/aGlRdGJNWV5HZXlrVD1PaGlzQ2ZPZDphZExNZEljR1VtaGZFZkdZZXFTdEt5UlljaVlZc3hfeWxZc2M9V2I9R147RnlbeVt5Q2NBaV1xY3VLVkBxVkJhZnk9V01BYmZrdlFbZ0pJYzpRVXhPWUNzdHJpcnFheV9lWXZvZW5Bd0JVYlhbdW1TVlZLRT9jZXRfZlFvc0pVeUhlVU55UkF5c2VnYlN5VmdZYk95dUlXZ2RzQlRVZWxVZFxcO0Z5VWY6U3lVcUdyY2N4X2c6PUg6RXhVcUdSQXNaV0VZeWNYXUlJR0JmeUZ4b3lNS0lzQXdfXXhVdWdyRWJ0a3dYbXVwc2d5d1Q7b3ZfZVdBUWJSXUl3V1dOd3hddWVXcVdJV1VnYWRzbXV0V2ZjaWdkb2leVWVAZ2Vsd3dxbXNjS1M6PVRxSVlleXRqeXhtaXRZXWVFT2lBYVRzdWZiT1hrd0VnYXVcXE91Q295UnFJdWdYW2dFcnNEeWd3dUlzUEdicGllXFxhaElLYnRRY0J5ZXhFd1RLWWlZc1k9UnlReVl5SV9ReEttU0JNc05DV1JRaG1dZFBVR0xhVnlxRXc/WXhzV0FVZWtna0F5dVVoU3VBVHlMdTtQeWt5eHd5eXBpT3RRcmlxVVRUb01xcE1cXFZmZXBkdEteYXZjaW1daFVvWHlCbXRUQHFnSXBDRHRmWEpsQU1BQHNHPFE+bXdtWFB0XFxSZ2FrQ3BTP0lqY1xcS1pkVkpgTmY9dVRVS0BoVkJcXFdePW5nVW88aVJ2VW47RHRLYG9ueUpTcHJ3QXJiZUtSYXBtPFZndVJXPXc+bVlKQVZGbFRlXFxXUGB0TklYcUVXW1BOWDxOWjxOcTx4azx0SGV1VFVubGRNYlF5SmZfUE93W1l2amFtXFx2W3JvW2dIXWhQYEJmdXVWdm1famRebUV4dk8/cmBBZE9OdXhmdFxcd3VAPm1UUHBJZ2o7dmhaVl46bnhlX1xcQ0F0SEByQFdgXlZuQmdkY0d1YUliUm5qR3BwWl5zb19mSD5kVlBrQz5yYkh0VD5eaUdrP2ZrWm5nYnZcXEt4cGpAc21YZDtoaTpuZklBWmc/Z1g+dFk+YXFXbklWdU5XcXNGW1tIa29XYV1wcWl3eFVfYXhXY3RRX2ZxcUlOeHBGb08/ZGZVRj9oPT1pSElSbF10OlRKTT1Xc2xyVVB1S2VNWlFNb1FKPll1T2hYcG1RcWVTcWFSdXhrS1RtYlFUTnhUQFFXdUxXVmx4UllQeFxcTjs9U0pdUU14Vz9keFtcXG5rQVZ3UFN1XVR3QEplcW1OUVVNVFc/ZFBVUXRUTUtIWW1cXFB5aGVZVjxQWUFud0VXPkhWeVVOdUxPSER2ZVlzcEB0PkF3STxrQkFuUnlQWWFKS2lyR211R0V1ZllVXz1zQ2BTc01RXmRQWlxcd2lUcnNIVz5NTlJRWXZReXJxdjxsTk08X0hpeWl5XkZJXTx3dVJQbFNfbGxZaEhvYVpoZDpAYl1HbF9IZjpGbjpxeW5mb0BueG9PXjs+XU1wcXhwcXBYeGtvZ2l3Z2lXZXc/Zz1OdUxgdUhYZklBYV1ha2hwcnRWb2h3cFlZaFNWbHdRbztGcWF3dGZmX2RZb1RmcHNAZkc+W2ZpbGtQdXF4amdnbW8/YUNpc11nX3RvaGxocmtRdlledW1WY3FeZ1dgblV2bVNQbkFedHFfal1fb2J4XFxIUWZYR21OcWs8cHhfWF5JPmBUUXVRZmdEPmJwbnhbZ3J2WWlxY2pxSEpLYkl1WXVxVkBzdjpDc3JpeWlzSXJJZzxjVXhjaWRhY29fWD9PQmZBQltBeUVnWVlXaWhxR3RXd2tpV3ZPZ0l5cmRXWGhtWWJJV3RheHFtV2BITTp0eUxYWEhtdmx0UmFwVmN5UU9JWHJpeWlQb0ZJWT1kcUZMbnlheEV4dGxESzpwTj5kdlxccHVxSU9sWGptPW53PXBfVXFUWWxdcXV1SU90cXlXeEtNeW95YHhGQFVZQFRZYVdNdXZYRHVzTFE7dU93ZHdybU5OdGx3TXhETHdjaFRjcWtBcXBrZW1pWHlZdWxteVduWUxfdXlvaWx5TG5BdXBpcW5peHV0SGtVeWprSHJzVVZkaHNxTE1qeHlYeFl4UVlSeVhueHhtUW9pQVFhWWxEYFNbaHFoQVF5cHddeWxNWXl5VHlnbU1tXFxraWhsaVlva21SWXBRalFtbUV3RllMUUV4P0l5QlB3eUx1OnBZeTxucGl5eHl2eHhTYVxcb1JdU1lBVGdFcnNBTWU8V0RweXRZT3lMbnFwcWpVTnFIXVp2W2l0bFl4dmlZY2FpO013Sz1iYHlnaV95WWtJQWN3cF9GX3lIT1Vpa2tGSkFDd1d4UXdzWlF4eHdZUVlGdmtnaWlUZ3FJVltoTXNCPFVXPFlnWk9Ja2NIPXdUVll2ZHFEUF1WPU10XVN2eGN1aW93Y3lCQFVCdD1YRnlmR1lkO2N3TnV4dXFHb0l1Y113cklJXk1XTXV2bz9XUz90cj94X0FCcll2T1dVdUlkO3N2TkdSeGNjUHNWbm9iTT9pPFtoRjtpd0FUVU1CTE9UW1VUVkNySEN2OktyWmtDZW1iZF9FR3dDSU9jXWFEanlVXj9ibltIWFN4ZFFJbW94SktSQnF4P21TV0F2YDt0Yj1yVk9DX0VoQGtibVdVZUFUbT9GQzt4d0FCQnFiSUNDeHVDTmRYdlBzOl1MVEBMcllsWnBXZllyRGhxbjxycUh2VVVUWnRPRlBRYGVwUzxOWj1Ob0RzZT1PR0FRPWF5RWR5Z0Vzckh5Rj1WTEhKPFVqRjxQdmx0RkxuQm1YTFBSZ0FLVElKR1hrYU1wTVh1QkBWZ1RqS0RKYklsTnhLSVlXSEFrWFFsWz1zW1VtX2lRSlBVXVBqXnVqcHRTQ2xrbVlSWW1RV3h0PVhweFhRWFBMVmhVWGxRb2xOdFFUWl1ZXFxdcEBVUk1QbF54b1lhUU14Sj5xVkp4TFtwTj1VSl5dVVVQb0N0c0VxeWVMUj5ITVxcaVdqTGp4UW1IWVJcXGVzbXBWR1FMdz1WVGFWQXl1cVRLVj1NSVxca011cVR0Sk54V3k8eVdhUEtxcW5lTXREcl94VzxAS0JVdkVYdGxcXFZSaFlcXE1KZWF3V2RZZnBwOnlucnFwOm1uWVRNdUFtcWlVVEVxeEh1aXFNaVRWX1V3cFFwSVVsS1FPU01QYklrQnlTPlF5aXlORUlLeVxcUmBhUVV4Vz9dalRNT3VJTGZNbGJUVD1xdHVtU0J4dnI9VXBheGFdVENZVERFdVFMeDtobHZVS3J1cWppamk8eERFcXdxWUxJU2FEWFhQcGVsb3JQanBsV1ZBc1poeVV5dXhxWHJpeUhZUWlhVjw8eFN5c3htUD50djpwcGlsWWtZa3NZcXVoUUNseUttcz5hcj5kdW5VdEddS2xIbndAcWdxcFVRVl5VdmRYb2hQdnl4eFhZWWldS0JZbmd1a3ZMeEJUbVVlUWpBcj1cXHBwZXdUQUx2eGtJeGtBUE1KXFxwSXRyW1lKU01xbkVXcm1RdGlqZ0FRQXFNSUhQdnFzcW1xTXFUaGxrWXFxd1VRaXVSeUVUaEx1PnBZWl1PTGFKd1lNU0RNW2hTVXBQP1F3QElxckF2Vl1sYUVzP0V0a0R1WUxNSkBVOmFrXXl2T0l3XkhZb0xVdXRxSHVyR1l3W2hMPWRUVEVRUlV0S3VWdk12QVR5XFxxcVRkT01VdVFdS09BdUhcXHlYaFVtXFxYZXFrY0xxdElwS01xbElsS0x5eFlsXWF4R2lzXWB4WXR4aXFuZWxNVGRuWXRXVWBuQXlSYUVNamBLbFBzV3VWUGlvc01qPklWcGFyPDxrd1F4R3R4bERValBKOlRLOmx3WFR4UHhMWHBMeHF5cnlvVl1MeHVKWnRKa0BYb1xcTHJsTFR4a3lcXHFeUUpYZVlBQFZfcU0+SHJ4cVJTSHNPeVhibVM6XFx2aXF5dXl1YHl1SlFqWmhNYnVTS0VqQFFKZVxceXJ0c1B4V29QT2llVGdRWHVpanBJVTtwWD10cjpVU0p4Tmh1dUt5TGVoTmNMT1lsVG9tcV9Rak1hTGNRcWBcXHRYQHFsUVNPeVRGaExASUpUeGtITWprcHBfQVJVTWxgaHQ6VVFLdW91ZWtbaGpjYXRRWU5HXU9bQVJYXWt4UGtAZE9NTGtqPXJTXU1eVXZ5bW1nTXRJcG1lRXRveXNvRHdhVHFUXVhdcXNQZHludVRNcE1UVFdMWVBNUFVdPFBdTUw7aXNiXFx2eERQZWhzW01VUmVrQERwUmhUPlBWcGhSTVFrVl1TSHFQY11ZdEhTXVB3bVhXbEhTSXFTbmRMO0RXS3FzY3BqXFxUWUdNd29BTE9RS2Vwd0xwTGM8UHlgcFFZdk9MeU9ZUk9MVXF0cWBwUXRJcT1AWHJAUHlNakllSnBoS1BpWHB4TVJgVDt5SkdcXE49cVJKUVJ5QVI8PXZxVlt5WHJWcW46PlpUXnhDX2I7X2RXTnVBWWVsRnA8cGQ7bmNfWWN1V29WaGxWXl49bnZAZ3lAV2BqQG5hUHNlZndwTmdNQWxcXF5eOlZ5Rm5xX19uc0hweG5eR0FeeHBcXEd2cT8+Wlk/XFxbbnRiQWFlVl88UXliPl9eSXFSbmNqQXNmb1tsPlxcUmlkX2ddZ1dbXnBvaXBuR09vWmhqQ15bYmFiVz9eaD50Qj9jPT9eWmh0O0hjUndxQz90QVZ0aT5tQGhzQE5gXl5gQlZtdWB0Xl5hPldnQV9zPEhcXGh4bW92ZmRnal5BcnJGa2VQaWpnb1Nhc0NJaVBWaUB5ZF9QZ3ZpZlZHd11XXFxrZmdEd3ZIaWBKVmNGaGFGSXZmRmxcXEZdP0hxP0ZqOkhlS2F5dHB0SkdlbWBvWj50eE9fUnZbRV52c150aWdyXU90c150XXh1Uz5eSj93QV5wQD9bO2BrP0dgZU9aYmZvQHBiVGF3Y1F1O2ddXVFhYndhb2ZtXWBaZ3lvVEB4eHBta2ZxPD5wQWloWXBgbUlmVGl5clF5aWFrc2FjcWBua3lha3ZdXU9vb1Z2QXd1c1l0THlpZ0FgU1dwUUF4TUB5YVFidFd3YUdnd2lsXFxAZkdeXFxhTnJOdmN4eV5MVm9UbmxqcXBGQV1raV1cXGZuTXhrRFBmQ3hoZ0ZlQ0ZrQ0hhWXFtTW50Z0FcXGBObEF4alNIZ2N2Ynhwdl1nckRoXFxbSXk6RnFwWWE6SWA6d2F4PnloV3drQGJSdnVrb18+Pm5WPlpUdl1Kblt1aWFJV2E7PnZ3UXBRaHFGeGFidnV4d2h1UWpteXN5dnl2b19tRnVBd3hWV29vPmNVdmxRYXFgaWBuR3g/eVxcbVdpTHh2WU9pY2luVnlhZT5eQEZnX3FxXWldaUF2eFBmdV5aZ0lyaV9nSVdcXEp4WlV3WmRxWnNHaGVBYndAeVpZaXFYZmx4YV5udz5wYVdRbj9oYVRxYnJQZEt3X2BneDxHckRQdXNWc3VJZXd5W1k+XFxSQGJaZ2JKWFxcRWd3QFFzUUZwd2loPUFvUnldVUZnbHBkXklrS3FaaXBgV0hxZnhtSGhkOlF2XmZaYm5rWXh1PVlfPVB5Xz9uWU9bWGdyVGhgXnliUVF1WUF2ZmZjOj5uW29qPz5mR05qOkZacm5yREFhUE9zVz9qeG9pQEhxSFlfSUFhY25oZk9tWndhOlFgbl5cXGhwXj1gbWxGOl10PU95eV15a3l4SkF3XmFDcVd3b3dFeV9lR3lpZl9nS11WYXV4UXNJTEdVUUlHZW1kbUV1PWl5RVFSbFlIYF1Zc2tTb2tGST1GR21HU0NCO09yeHdZY0F0SV9mOlt1SUdFTGV2SFd4cW95bnlUTXVjQXV1eEl4cXNVPWFWW110c3NHbVFiU3dIV1l0QHlmXUN5YFl5WGlVSVN0ZW9zdkNHO112VEljRWdIT1FHdHNHYkNodDtZakNTPkV0cDtVTUVDdU9mOmdEWD1ESEdFcGdTSTtXSVVSTHFzU0NzVGdjZ1FDUm9XUz90aEVyZj1nXW1UPEtlVktST1ViR29SRT1IclticFNiUVV0Rzt1b1lSeW1DbU9HSVNoVHNTaT9UPWFnRENjaVN5dmNXdFVmcl1CPVtXOnNpa2NUYTtSbFtTTT9kXnNnW11XeEl4dkNCanFSbFlJWl1QUUB1eHBSS0RMUkBSW1hUWlxcTGZNTU9VTFZ5TGZsajpoVVtUcnJscGlRUHhNTlI9UVllUEpVdj5MamZtbV1QTW94bG9wT3RgeXhUSlpZSk1QU1Z0dTtNVjpseFRsWXZdVmddbGBcXEtHYXBDQHA/bUtiWUpWVEo7WUpybHZqaXBAZF1zUGFab3I+TnRudnNNcWlBPmBZV2ZtcF5Nb3JISG9QUF5dZ3RKeWI/cW9mVlpeUXZTWGFDQVp1PmZKZltMR2RrRlxcTGBfOl9aam5iSEhsV0hqSEZrdUBlS15cXGZ5bUdeaHBBXFxVWFxcPl5mQVhyXFx2YDxudFJAcE1AaWJobEteXTtRb1BQYm5OaXNeXWtgdlZYX09wYHlmXFxtdmVGX2xtXnBVZnY9YWVId15vWXRgV2VHdmVVPm5bTnBRYWp0cGdydltReXV0PnJRZ1tbTmJXQVplQWNiQV9HX25gSFpdaFtrcF5mP1tGP14+eHJtQXRHWWk+UGlAWW1AYGxAUG1wR3Ntb2t1QV5NeXdhdnRcXFdzb3ZibndrZk5cXFtRb2dXZVxcTnJPaHNDUGRedmdCT2Q8Vm5jSGtXVm1ieWtCZnBbTl5vTlxcT2hpYXBwZVdfXFxYbldhXV1OcmtwZGpIdlhYbF1JbkdYcj53dGl5dExPY2xJbGE+WnNBdG4+dmloYHVJQldTWFtHO0FyeFNTTD1CZGdncFVyX0NIOkN0cFlpXztHY01CTW9mbnd3aD9mdj1ibj1XXUtkXm1yTENGTklWVWlkTjtXWUt0QklDQnVCbmdDYXNldk1YRlVSXVFlWGV2T1d1Qz1IcGt4dlt0X0VjRXVmeHVEU1Nkd3FTOm1oSVVGVWdXV290R3N0TllTbWdScWlTcEN5W01yYFFCZElHcWF0ckN0Ok9ZW0tyYVt2c0dnYFNlWjt2X0dyW19ETztJOld0YmtUTkF4TFd3ZUlnanl3dW9YSFV0SW9oRj14RUFXa09CXXNmZlt3X1d0UV94TElnRVd5YmFkP2Vpdk94Qjt2OnNSPVFlQ2d4aVF3cHlDUDt3dXNZPVFFUGFUdll4dXVVPWF2XFxtWXl1Q3FTQlRHQlJHRXdPd0ZpaHZBSHhlaHRZeVdZSVhrdnBLVm9xdWhfaT09Zk89YkNjZG9jdjtRT05IV3FZdXlAdUlUeF1UcXR0a3lgUzpdbV1tdXBFamhUc2RdUVpBbUd0UUhYc3k8WWNFdkFsUVRZVndtUzo9V1pobTp5dXFgcWpVTlVIbVtldllVV2xsT05xVl5tcHdNV3VMd3R1bWN5amVIdWpgcmVpb0h1bVdNeEBMUE1dVGpscGpEcTxET2xVc09sU1dIc2tYcnI9bmdtWEZIWEZJWWRRdVthbkpJWVlhc1s8bFU8bV5FcnlddnZMdF95WXZpd1FEcHNpdEF4dWpFUnJseFJ5d2RlcGxQdkJ1TUhsWVZEVUttdlZVbEtcXG9ybXdPPXZvSXdjRVNVeW48TFlgTU0+XFxOSklMTWBLYll2VlVNQEl5b0hKOkVWPGVZVHlxVm1taVhOPkVKaF1QZ0hRRUhQeUV2PkBtVkxPT1RPT0FvUVl2aj1wOkx5RWV0d2R5XkFZTXBUSWR4bDxZQFF3cGFZPzxLZ11MXzxtQEVyYVlKW2xXd1VKYj1SYExtTFV5QEBKPnhrcFxcSld0UFZ1dnc9WFB0dUh4VktQb008blhYcF1VTUlJa2dAdFBBb3d5cmRod29ValpUTWBUeXBMeUB0cUJUTTtMb0s8c1JRV2tBamV5cFpUdnZ0TDpxWEJBUVd4c0ZdcFxcPWpFcVZwcVdjPHBJZF9XWHRHZ1o8SHNSaFpTP3JmPndDSHBgdl9gYV9pWW9rWGJ4cXRDZ108d1xcXU5beXZqa2ZyRG9yQWdpP25wZV5wPG5uTk9vaD5hc1debnhnT0FhRXdjbEhbVT5jWGBmPFFwREdcXG0+am9pd01QYUlpYl9Qbl1gZztJZFhYXkhIeVReaVFZcmphcFRhcmA/bG1xaD5vc2x1bGFUd11Xc3FuS0BtYFhSUkB4aUh4a0VyZHhRblRRd2RsOnBYZUhLX2V5Oz1KbkhMW1VLSHB5SkFQW1V5aElXPWxZRzxRUFFVPXBOaVVqQ3BPRlVyamhNUWFxP0xwY1xcUmI9S3BUVm50S3BxeVxcYU1oPHc9ZW9MVHhHQFZsbHRMYVZHWVhsaGxlZWs+eG1TQFhuRFl5cWhUcW9IT2VzR2RKbmVVUWlqQF9RcHBicHZMWG1mUFxca3ZkdE9fV1h3ZUddWVBfS0BmeW5gZkZoR1lnSWB1X1heVklzcGBpX25tPW9gPk9yVWhhbEdcXEN4XV1WXFxeQGNERFtjRnNBd1hdZ0A7QlpHRVpZRVpXRVlpVWxBZF47RXBlUllxZUVLWDpTdF87YmA9V2Y7alVNSmt4T1xcRWtLTHNWWFNZVXBuYExKcVFSVUxsXFxsRVB4eUVsXmxSOm1PVVVvOlFvdEVMWmlWSWRXQlFrO1BLZ2hVSnlSdWB0cV1XPVFPVVFvO1BLPVhsV1VQVFxcVGZkdkZBcnRJd25IWUZAdVhVbWdNbE9ZeV51dkZVa3B1U2NMVE1lb0p1b0FdcUxlWFFxb2NtUFVRb3NVTnZQVUNgbkFAVV9kUTtleT9wcF5ldTxwTUBMTExhb1ZhSkBlcVhcXE1iTUpcXD1Kall1Rkh5Tll1WF1QeVxcTmA8eVJFamA9cmRtS1hxV3ZFUFhxeVxcaGtbcFBcXFlrQEBOQmFwbGRza3lvUD1OdGl0SEhPT3RNYXVrb3RyOkBPdllsPDx0aGVxY112XXRTWHFYO01xRz12aWVOdmVNZlVZXm1SV21vU1Rsb3RPbXBZYmx4aUFwa0RXdGV0U3ReVnFxblZ0bVZlWElpU1ZmUWBnVU51XVd1bnlrSEFpc2hmc2h3eGZ2UmhmbmlacXhnYFF1YFBhcHlcXEZIXFx2P3Bvdl5ob2lIUG9TZ2VBWHZycXVARnRdWWx4ZmdTcGpzaWtIQHZdVlpnQXZnZmtNTmBhT11xVnVvb3JrQUpNWHBjZGtDdT1JZEp5Qzo7aGNNZmBDcnNTRVpFRVRvU1JJd3E/dmZjVUtxdkY9QlJBeEVTYlNfdExlWHlzQmBDZlpJaD1pdEphdUJDVE9vZGM7RHhHWVxcR3JnZXJcXGNyZElyZGNldD9nQEFCR2tGTHVDSV9IYndpaFd3VDtDbXdyQ01ZQmVXQTtEPT1TVklydD9DUWVYaz9GbGFDUltjVGFCZ1Fnd21VckdZYDtSTm1UR1t0b213TV9STklHW11zVT9zXj1SaW1GXFxrVlpfZUtldHA9TGpUUldxUEtRS0N5al5UbVFkUkFsdlJtUVpoWUw9SkJ5WElxcDxVTFlcXFFBRFRAXFxTYEBuY0RSbkVyOmFqeGhyckBQY0l4bj1XW3lOQVlNRm1yUFhva2RVcUBuSHFOdjx0WGFrY0xQTDxNTnVKXFxNSkdRS0Z5b1BUbWZUdmhtU1FcXE9YYXhRP29cXEFhUld2dXdld1BcXGM/aUxWb1txZFVYXFxgTlpuVnU7PnZbT1pPZ2Q+eVpUWV9VeGc9VmZ5YW90d1xcOnl2PV5mQk5tYUhvUD9cXGRnZGpua2J5XWRpWktHcm9PeEdveUxeWkA+eFJhcEJXZ3VuckJ3anlocnJGXlNebkVPXzo/dUBRXUtPZkNfbHVOXFw6QGQ+RnZvSXBneXdxRmx3UGo8bmNAQF9VdnR1T3NyUXJSSXA9Rmdnb2A8cGhMeF9seV1DTl5BV2I8SVxcb0BjQHBeQVFwOnh0dV9pS0deWE5ncmZfZE9daGlbcE9iSWdjcT9jZ29ePHBoSFZmVk5nWF9cXExOdXRZd3JxZ3hIXFxjZ3NrUG5dT3VgcWtGR11lRl1zUWNPUF1LUGx2X2hdbmRlR2ZHZ21qSWhRZ3c7T1paWV88aGR3X2lBRnJqZ2A9bmxCQHFlcHlqVmJsZ3NVcHZcXD5fPVFtbmdeP1FnYT5iQFBrSj5bckloUk9gPHBxWnhpYllbcFh1bWlfO1ZwVEBuc1BcXGJebUlmb0dodz0+c1M+Y0lYYVBHc2l5akZAajpXbktnd01xYmRocERnakd3XXBRb1FObzpfc3ZneFxcX2dieGJDd2N3UHJDRm9YX3BseGtwZndTaG5XT1tiYV9oWFpaP2lmUHZBPl07WVtPRl5sdmttWWduV3ltV3RmV2p1UGlqUGJxaXdUaGR1aXBnPmBYT1pSZ253WHZzSF1Pb3lGdm94aXhOb3hKQXB0UWhmYXFUZm9ZP3VFd25mbndPX1pieGJ3QHdkYHdyVnNlaGFgZ2pxSG1MZmZlQWxhaWtKZnI7R3c7cXRqYWh1UHFYX2RWT3RMaGZkZ2hiVnVmdls/Z3J1SWVtT25NWHljV2BeXmlBeGE9Tmx5aWF3ZlxcSllkZFlqVmFdZm9wXXBwbW9iZVdcXHhZbENZYT1Yd1peWlNZcEc/eXA/eVtGeTpGXztRc3NebXV4ZElmZGNXeEJXbG9eXFxBYVtRQXVIdl1lVm86ZmthbnNleWZtQF1KYFxceT50eFlbd29eaT50bXlsbklwSUhqcFZqTF53ZUdwYD9wSHlyOldbOmBlUz5nbU5cXFxcaXhGPmdNYFxcTmhbamZxXU9zYWlqRmh0YnhbS2hvUldcXERfcTpIeDpxdVNvZVpBcFN3cFdpdmVHZzpobWFfc0hRWkNHa3dRYWVgaGd5WVlJbW91cmtjZUtDUWVYSVFyP21mXmVXSGNFQVlTSlNyQz9EeWN2W3NDRHlDSllSeGFYPGNpYWlyQFtXQUlIXkNVUGdPbkhsVkxsbWBYUU13dXh4UHVTcWFPTkRPQ1FKR3RUO0xKP21zRnVYSXVPT3V2Vml2VnBtcGxVQWhMUURKWmFTQHFqYHVWVGB0c3RWRzxPbT53OmZmQj9zYUhsXkFiYD5fRVZcXGF3Z1ZWb1dweEg+eFNJZktXW0NBeVdxeEBgbUlZaXVZXFxlb3BQWXJcXHdlWXldRmdwW1dtTEhvV0hqSj5dTkhxakldQ252dUhiaXFqdmlnVFdbcmd1ZFZjbW9tUVd0O1N0R1RoU3NXcURYdXZPaXI6R1lqP0NzW1VlV2ZEaVY9T2Rza2N1XURJR1Z5TUlNY3JkX1JeW2ZmVWN4WWNCXUhIO1RNUWVPaUNqb2JKPWhXXWRCcXVTW3hfdWlOX2JLeWlcXGNWYm1VUXFDYWVmXV1nZ1Npa1VJQ0VZQ0tCcF1IZ1dlWE1CPGtVY2lpSFFIZFtkdHFoRVliVHFlY1tlXVlEXUNEXFxtRVNlaHRTRnZRV013aW5taXRtdlVTUkN1dFU/ZUljeVRfeEFvZGpDeUBtaFF5ZT1hZ2pfaEQ/QmdDVHBZV0xBSVtHc15dc1BdaVZZSElVZGpPdm9fdG1ddFZ5SXBtYkRpRGM7ZnQ7aUhDUmc9Y0JRY01bRFA9eURjVmFbeEZtSUhRSUxDckI9dlNPdF9nUlpfQ1pzU189VDpveVV5aGl1R19VRUx1Z0JRR2pldWA7QmFJc0hhdXdXWXFHV0RzV01jQ3hxeWw7QllPc0VxRG1HSHZ1RHh3d1xcQ3NidWRdR3hUSVdVeXZvb3hxTXZyPUZqQ2dOZ0dLY0VwV1hlcXRnb3NzTVNBYVhURWNUeUdEd3U8PWVBQUh4aXBrVXRWPHM8VFJjVUpLZFNcXFhtXlBqS2hwdlF4Q0lrVVlRVFBxeV1xeWhOaER3eVxcTU5td2tdeVdUdGhpV0t5dWlkbnNIcG5RT1VJS3JBTkxNc1xcSHliXVBvdUtJVE9TXXA6VE5xeUtgRFhLUFRzaVNQPG5ZTHY8ZFFiaUxcXERyU1BuXFxdUFpNdGZJeWtxc0pNbmBgUl10UXNgUUpwcUxwbVl4U0pATE1gTnlZTVZpcmV4dnlldUtsWWd4SnhFaklEUVY9cFdwbkJRcTpYVWlodkJQdnNEall0U15ETUloT0VJeDxtbUdtWUxkV2hgbk5JbElVT3M8cl9RbWBJWGc9UlBRdEZkb2t4bl51akBoV2N5cEhMd29EcGdMVHFoajpcXFJsSEx2YXFsXFx4VHlPSnlUcWlXOj15T11RcExqZFB2V0FwbEVvaXFVYjxuUHBWaXFxPHhVdElSOkxyYkh2W1BRb2hWWG1KbEBuRmRsbmBNP1lWW2l4a2BQQFh3bXFTU0xscVFtZ2FqZmR3SWhMWmR1bnBRSVBzTllrRGhMS0l3X2B3QFhQT2VuWEVOYD1qPl12O0RvWHlYO2xMWVh1cHB2Xm11RVlZWExVYFhSRFFSZ3VOPVFSX1FZdW1SSEB5VmRRa01MVkh4bT12QFVKcHFub0RWQVlUXFx0ckdEeFxcTGxJPHVQPFZGUExRQVJ3RU9AbW5kTlxcSnFfbU9aclliUj9aWklzQVdyVWB3a2dkSWluUVd1T1BqX0hqR1lcXE14c2deaVFecF1JbFxcZnlMXng+QW1LeW1eR2dUb2FTPmpTSXQ+UWNZUGxeZ29zeWZecF1DUHNQcWpdX11TaWNXUWtdX2NTQXFub2lbdmNeX2pkQG5ZWGZ3QWZYeWd2VmJmcWVDd3VcXF5eXFxPYGhodnhedF1ReFdOWlxcYXdzQV9URmdcXElpQz5kckdbWz5jU0dga05wPkBaUWZ1Z1d5bz5heWFfXldyaUhzbmBbZmFpRmdzWVl2dkZaZEB0eEBpZW94WXBtZXBwRGhsZVF4amluR19wV1d0UVBjS1FkcFlySG9ia29qc09wZ2FfeW9sc2FgTT5sRm9heGdrPWB3O15mYUdweVleO3Z5UWlsW2llX3Bfb3BjQHh4T3dvT0lpXz9peUdvS3F5eGZxT0d0SG5cXEE+Wj9PbEJfYkNgYlRucmNGX3JGdG5QYWxhbU5YY1Z3a1ppdmtBX2JXbmFfXkI+alpgbkVxY154d01Hb0twbj5YZ2BxaF1Zd05QZDpfZ3RRZkZgYEp4eU1XW0Y+dFtOYkJ5d0tWaEJfYG9xaXZpeWV4bl1XZVZuWz9nbUU+cGpJcnVWWmt2W113eVJGa2tZZE4/ZnBgdDpXc3FAY0NPaEdvb2ZHXFxCYnFLeHI/Ql1nQ0BXU2VdRl9JZUpjZF1HY0xXQ1xcP3ZyQ1lpaVNiaXZiX3VxQVNZdWNvR1JzTUdXQXZkY1hFX0duX1Y9Q1RwTUJSa1JOV0dEeVRrVU1PcFNcXHR0UV1zOnlrYWlsYF1XPGxzZnFNPE1Ob2R5P3B0TFlScElKOmFsXllSUm1vQ2ByZ0VPSklWZk13TXVST1BKQXl4cGRwRlFrQVBLamBTYFh4U11OUDxZbVxcbjpAclBsS1VJeHdVTEVBczpcXG9jRE5cXGByZVF3anh0OlRWY3RqY3h2WnlWbXhNPnlKPm1tV0FUdWhyZFlZeHB5R2lXV3hQWkRWPjxSRHBwVWlwTWlXTGRZeFBxO1lPX1hZdE1URVBxTnVzXmlWRURKdlB1bmh1cVFXeHF4eHFYYzxKZ0RsOmxOR1hWXkVXZUhtSlxcW2d4cVxcUVxcd29nd2Z3Z0ZcXD9BYEJwck5Xc2dAWlV5cVlxd0NAWjo+anlfdWRPZlFwbnBBaUdwXUdQX2V5dDphX2loXFxzblpmWF5TV2ViYGlqT3dZPmJKPmp5aGduaWNEaXBoaG9hT24/PmN3cGVFb2thX2dMTnJjaVtGSXNOcHBYR2thYWlWR19bTmNIUHZNUG9cXGZeX15eZldvaXBhZlZcXG1meHU+bWBmbmpmZ1p3dnU/YlRxcHRPb0RncnVvbUlxZmxnYWhWa05IcGlPZl9hZkhQdW1pX1l5aG5WdG1pX2xXcUhXc2tQYmVRdURxcHVxcU9GaVlYWlZ3Z1NhbU1AeUY+X2tJeFd2ZGl5bDtOaWtOal54d2FecVZAYmZoeVVRcV5fcjx5dXJ2YFBHdG9vX2lmazxxdj9gbHNQZUFfb0xHaU9RcV15alZAY0NndDx3WnQ/d15IX1BWbWdpcVV4cl1GZXFmeURxcndxeHNZW0V2XnJhcEZ5ckxgbWlvXVNgaXZRY0A+dndhYDxIaFBWXjppaD5PZld5Zk1QeFFZbUBmeWdJeHBGa0FRb0tZZW9Gd1BxXFxjX2JLVltNcG9TZ1xcO3lqUUdtP3lxaXFnQ1F2d3lxUVZcXHFZbj9XW3lGcWZoaVU+XURnaWt4YUtQYDxuXFw8X2BkSW1Kd3FHeGk9R2xAT25nSGhLT3V5b2FIWHVXUGNJPltFYHRST15sT11XZm5ZYXZgblpTR3htd2tcXHF4SV9zRk93O191QFZpdVV4Q0RJSUQ6UUQ6P3ZJTUZTW0lKX2dCaWdlV0VoWWZXR2JOb2NHU2M8TUZHX0c8WXJYT2d3X1duYVldYUVmUXVMb2JnZUVuQWhmTWhvPEpQWVA+QGw8aUpHdVFWWG5URXc8YU1RWW9YdG5ZPUpGZ29EaWdReHY8UXN1b2tmYG4/eG1hZnA8SGJsTmpOcGRXWWFmYHVJeHJET2FyZ2E+P2xCd3c/Rl1DX2Q/cG5tUGN0Z19idl47QHE6T19AT2ZKeVxcXmBnQ05mSD5tXUldeE9dO0dgOlRxPWY7XWI+bVQ6Y2RWc0RfZ1I6O1N0SWhiZ2lZP1VeSWlhaVNIcUhMO2RdQ0dzR0dWcUU8VURBV1RzbVd5U2lMeVdGd3Y6W2l5Y2NgT0I6SXVAeWVdWWhCXUJVTVM9cVZvVXh3eWZQW2VaQUVDUWhec0JucUhrP0RJc2N4dXNXU1hWbXRVSUJKZVVvZUk+eXZcXHB4bmBNUVl4Qk1xcXR5RkxZUUF3Tz1OQklKYHVQZXFLbUFrak10PmlLW01OZVVzVkRqTjxYTFVMXVR4W1xcUkRYeFdcXG1OeHBneVNgTVhYPXc7QXFrSHVRTGpLUHlCPFFVaFFFQWxKTVlwYVdmUFR0QGxtbHFlTXdLPVN3YUxWVFFTZE5FPVFuVFhpQEpld3dkaG5Mb2FnRlxcVUFyUnlnYHhyTnBzeU9vWXlePWZfd05gWFdpd29uUEFdPW9sZldkaElqTGlbXlFxdXFqckl4d2FuZllvZmhqWkdjbXhwQmhcXGp3cVNvZl5ubV1AYT92YEx4cVVZWkdxa09IeHhXd1FvdV9Wd0N5bktAakhPZ09vZF0+Xk5QeUs/cVlwZl8/d1JgXFxMaHlDR3lMUHNCVl9VcXVsZlpocHhtTm9TSWJfPndjWF5KZ2tAVmJNX2VvQGFBT3lPPnZYV2BvT3FXeGxxXm1ZaF9KQG5sb3FXSWFUX2FLT2xqV3JjdnJuQHFpRmRtUHg7UVpOVm9weXRwWWdDVndVXnVHZ1xcZmBfdlFrb2lhT3hfcVdtc1ldeU5dUXFzZmZoY1ZqSWZ1c2lfbkh5Rj9oV1BkQXd5VFhoaG9dU2BpVl94S3F3SUdzXWlcXGo+ZXVgWmV5dUlwa1FwdTo+aVpOYVRZZUpPdFpQdDpmblVuZl1OZ0B5W11RZnVpZ15uXFx5X3VjWWNeeXZhWWZneFp5cGBuUVpkQG1Gd2hAaGFjRnN0eHlcXF9fRFFlPUFxS1hna0dedXFfaHd2W0lyRm95cEl2SHBgcE50akdxQ09tVmFeeEZlTnhpRGBuP0hrTEZbRUl3Zj47a2lIX1JiQVZcXG9HeEdSUGtVR09UeHdoV01pSUlUU1FSZFFITEtlSXVnRmN1QU9mWldWQGFTUEFjUT1pc3l5TV9FXXdVS2t0RHNETVN1eU90QnNXPENXWV1iXWVpOlt2X0V4clFXUWl4XTtTRVtYTUNzcHN1QGt3W3lCQUtTWnlpQ3dzR2NjXXlVeXNldGdpXU9TREVkQE1UWFlmX09GY0tZRWlpVU9IPlt1PUFHQUVGXVFjcU9CeD1FWW1JU1NTWXNCZEVTQWlkZE9CW2lFOztCYF9WYkFYXFw/Qkp3dkB3VjtPdEQ9cktbcltJWHZrRWNTWV5HVnZVZ05nWUM7R0Z3V1pfQmVJVnZ1Q15teV0/eXZNeHZXZ3lRSl9QUWhIeEhEbGZUc2p4dDt0c1dAT2RFTFZVUUJUcU5kU0BtbU9dWXZcXExCUG5mYHJxRVdFXUtheFg9XFxYa3FKW1lxdlRrbWlLSEF2b0hKW3FYWnlsZ01UbGxqbnhPU01VdG1PcnFzXFw9eGF1V0Jkb2V5cmF1dUl4dltRcU9QbWtlU0hsXkg+d05gY0phZFV4cnFHW15AXXNYYztoW29BbEJOXm1eW1tQb1BeZGBQa0hHdUR4ZWJZc0phZ1JAXXBucDtYbk1xZURYd3BveXNwbk1RZ0hedHNgXT5fcVteZUp4Y0hpXV4+b25WdHlGXnJHYk9ub2J2Z19xYXZObWR4b0BPbE5pZE1mYU5XcERHcWk/XktQbF9BXVFXaElgXFxdTmt3Vl9HV15lT2xUVm1jSVpzb2d1YWdRVnI8b2pAZmF3eHE8UWRwQHJTeHRAP2VkX15xWVtseXI8P2FDYW9mUGdwPmlTRmxqPnhGcWlAb15DYHFiYHheeWNDQWlyaVxcS2Z5TkhxZnlseGdoWUlzc0ZjSGdmeGhdZWBubVdcXEs/Y1NecW9XdWJPcGFGbnVveURwdHR2cHJpYWRBdF9QXWVgZUpZdTtJYWlxbEVxXT1XX2p4dHBeX1Z3YGl4ZmxObEN5Ylh2cXdIcHBgWmVAeEVBcjo+bDxveFxcUFtkeHlYcGVhYG5zWWpyQHg8b19IUHY8bnI8UXI8QVpaT24+UW5ZdlxcW15pPW9xQnhndmhxdWheWmhaOmliTG95bVl3PUdvXW5fRFBkXFx4b3JuXT1eXkhmcztBbXReZzpmW0VmX193ZD5Xa3lZeF5hYl5wYGNZXnNZd09JbmY+bklOXmtHZltoeT1xczppaW9hZ2Zxdz9PYFxcbnc6WV0/QFpgWHF5XmteSHVPP1tHX2FAR2tQVl5RUWl3V3JXV3VGQGZebl15cXdfUGRIWF1cXGFyXFxxY2N3dEhIcUB2bj9BcGtPb2c/ak1JeXZRY2hOXUJweGFfaWtpbEhYYXZocl1naUV2dnFHdGZYc3FQcFZGa2JQazt4ZFtIXFxTT3lHbm1GaFxcRkdeR1BjTVF4bUFpaUluXFxgYk5PbUZudXhhbnBHX3hBdW12Y0FgXltYb3g+W0ReYGtOZXVIX3c+ZD9AX0pHZkx5bF5wZU0+YmNmeXZIdG95bVl2ZUxAW2xpcT1BY15veGVGW1Y+bFs/XkROY0M/dGBpdjxhXFx5T2p1P2hyRmh5aW1iP2Y6Plp3eXBVWG1gX2RhZ3k9bm1sV3NTYGZaP3NgbnlfTlxccmF2RmhrRUlpXUlcXFo/aj1Ac2xmbk14dz5peUlxY0tXXlxcVmRdPl5qUFtHb2BeWFpaX3FMcG1LX3lQQFxcSnhzWGldQj9uXXlmXk5yRXBnXkhtWUlzaEFkUGdicFFab15fbGhtXnddQm5kSk9kT2BdXXhaa1lqZldqeT9qUmllY29nUU9sP2lwW1ZiSk9tS1ZdeUFfd05uS2BtZXdwbT54aFF4Wm9hT29seEZ5ZV9ka3dtPUd5Vk9rUnZudVdqc19faFFuY2l1Ul9dTlhkc0BuXFxJWnhobFdJZE1mYWdmXnc+bXRHbXVQXFxSV19GR3BlSXhLUGNnUWB5UWBJUHRJV2BtdmBtP2M/eXNAb15DcW9aVlxcRmFlcEFkTj5zblF5bFlcXDxJc3BGYUF5YHBgaFhxcmlhakZeaGJoX2V2ZGNGd1xcYW1YR2BPaV9jP2BpaGBlb2JaeWJOYW9mVls+aWFTUGNeV2c9V29YUXlAP2lpTmg8eWFHcGZFP3JuQHBscG9lWG1fSW9TTmpUQWtXTlxcanFpPz5saHd5bHB3b2BiXFw/ZUlwdEhJdmFfbEtoYz5IbWU/X0dmeGhYX1Nfd0hHXkNGd3h3XFxTYHVeT3liYWNPUXdORndXZ2RjWGhcXHZrZ3lcXHBwXkRxZEpGbmpgX3dYdV5vYVBea0tPY0VBdk5IY1hpb09ZZE1ncGhIbllfc2xBcXNgaW9XYmJeeVZgbUFoXFxtV3BJSW1KYGN4TnhCWWZXb1peR3RHRmBJYGFsQXNddmt2Tlh2dWhBdVVZdUV5Xlt2a3FOYGhhdXNYdHZ5cU1IWnNnZW1wbHZOeEJNWDpqY1VuQnluWnRrdkx4QllOSWBRbDtdaWdHeHk9QlxcRWJHcWhdO1NFZ0M6O0I6O1JMRWRNQ2RlP0RSPz4zOlwiXHtcfQ==LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlKyEpRiotJS5CT1VORFNfSEVJR0hURzYjJCIkIXBGKi0lKUNISUxEUkVORzYi +Analysis of a Vapor-Compression +Refrigeration Cycle + + +
    +<Text-field style="Heading 1" layout="Heading 1">Introduction</Text-field> + + +This application analyzes this refrigeration cycle. Heat losses and gains over the compressor, condensor, throttle and evaporator will be calculated, together with the coefficient of performance. + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5OWnNrOkxSPkQ6O1JrWVZiU19aUkxDVEpjRFhvWHV1eFlTdUBpWVl5WXZBZXJHY01bRmh3dG5lY2RdWEJfY0xvZVxcSUNrT1RuZWI8ZVZqV3RbZ2NCdUJqT0Q+S2hGW2ZKX2NcXF9kV3FDWU1UOmFpUkFiQEN1Qj9CVUlIPD9UWV1Hbz9zWllDQz1VQD9VVFVlQllVR0VJU1VURUFXPkFzV3V0QmliZFNXYFNockdXUU9JO1VoQmt1VE9JPz1IeHV1cXVFbGFYXFw/U1RfZnJZZUl5cllLQnNNSVhJZEFtdXdvd3dJaVlzRVVdR1BTdDpmYm1XXFxFRDpEVUViZkJeZV9KTDpFVD91alRhV3dYVGZ0akxVVUFRTmJ0b2NwVVVYUWJtUW1NeV1UUFhVWVxcZWtqPXk8WW9AdExfTXlYQFRmPHZcXFlxOkxzclBMU1RYQ01tRE1xU1xcdnRcXFlHdG1LXFxWZ2V3Ql1vTkx5RFB2YlV0bnlVc11YYlhZXFxYUExUbWt4clFRamhJbldIeXlxeE1dU3lNb1FJcEp5TUVoTkBQcVVxcGxwVztkdlRFa1BtTldReEp1aklVeEFNVnRhUm9JUExUUEJpWHJRTXhUTlldWTtBdEBgVTtdd1hxWUlwTFg9a1J0S2Fdc1lMcWVYTmtcXHBqVXRxZUpGaVlYVXNKT2N5UFxcR2d4dFhqTEdjQGBhZW5qQHdqQGZmYkFldldgWlFhWnloQHheSGFibXddeHBuSUFbZFF1dEluaVBibHhyY1FzYHdkUnByWj9uPGBmcVBsRD9nQWFrS3hkRmZrZl5qb3B2eFdwbGBwaUdnSHh2WW9rPWl3U3BwZ2ZnQGdeVkhwOmh2YldcXFNXZT1YX2BYaXNmZGd2cWphdHk+aHdnWkdednlmeVVuZnM+am9ubz5HcWlgbkVZbHZgYWlIZ0dxbDtua2dwY2dPdmxfYGRodnBeZW1HdW1nW1RXc2FfdEFPY25ebFVWaUhmcVdebmdGZVVncDxwZ1U/aE9xZ11odXVWXFxtcV5waWtnb3BvYHdKb25WcHFzUHJvV3k8cW1KYVtleFtKd2FlRnRfSW5wdnBpSGFjWWxeQHlGUHlgP19lYXhARmVVR3ZoP2xdcG86P3NNXmhJb2M/XmVoaGx1dm1TcXBbdm5ZcGl2YWZEbmhOR2p2d2RMYWNlRnRUbltuQXdnP3JlXnJVYWxnUWVoV3JNd3dzPnl2T21gYXduX2ZrcXNmaGNCUW14UV54V1teZ2dXSGU9V3hOaGZ1Pl5leFxcYVZdPGZyU0drUFFwTHBeT0dsdFdtbFBjQWFlQXhuWFlocj5oc1ZrTWhrR0BuT1B4UWdsZlF5bUhbeFh4dkZoWE5oP09sWWZoVUFkTmFpXFx4XUVOd2pnXFxfV107R2NFXmReUWNed3VTSXdGVnlIX3JpUWFrZmg8eVxccGF4ZUlxUlh3amFoTXh4SGFqdkZmWVhedVl1VD93TWB2RXduaGhvZ25oaXdpbWhzW1d4Z3Z3P3BcXHBnaHBOdlVRaXZvamV4dDtQaGdgYlBxbGBXZmRPZ3ROaVRuX1JRXFxNeHRBSHFGYWxGaWZyT2VoQGI+eWFZdnFoPmFXcWpiX3N5RnZCeGNMSXdxWWluTndUYWlTQXd5cDw7ZmI/Vz1tWmxcXGxcXEpMOjpCWlNXOzxSUDs8SmxwPEM9O3d1PWZmT2R0bWJGPVRxa0Vxb3ltZUd3UUJeZ2VIZ3hZa2RIaUNsP2Vpb1llX1hHYVk/Y0lAQ2JPX1hnZUU+X3VaZWZNZVlNO1V4SXJETVNQUUZRa1hpYVNGWWVcXGVyamtUYG93Q29zQl1XQHFFeXlWcUF0SGFpTHFIZ2FYXFxpRVZVRXdxV2R5eWpLeXRBaGFhSVlFVWNpdTt1Rndnc11vQ1FNVFN1YlBLeV1FSFFdSXZRRGVBVFtxVExhcnl3Qj1vU2FXSGZndnVHWFplRmc/Q25HRlFdd1RrV2hvSWhvQ0lvRFg9Y05LWHRrcmRZd1lTY3l5cm89cmlhQ0ldZUNvdnZzdXI9Vk15RFlLd0tXR1ptQmlndVV5VWppZE5hQ1BFVUFReXVTeFhBSWpPZEx1dFxcU3V3b1V3V2dyQWRlZXh0W2hWSXdfTVJgb1RcXFN3bk1GRUNWZ1ZoX1lwaUdnUFdfZmhhRUh5aEB1VW9sU05wSFZaY1dqaHZ5T2BkRz92PnBdTnBlQUltQ2BtcG5bZmBuXmdfbHhrUld4SmBjZGlsTW94ZFhmO2B5YFhcXHdgYWlIR0BTSGhvSGVXXFxRWE5VWFN5V3Z0VV88d3A9V25UUztETW10V0dUT2NNVmxwbXhBbWZobHNsV1Y8VUNFc1RdVmVlcmtNTlVoT2lZeFRMWFdwU1BYdnVdeXhJWVl4dz5hbFFoTFNcXE5ndXBpXFx3Q2RzclBLdVBwZXB2XUFrRWhsTmJeW1U7P2RhO3dYX2VEO2lQXWdrQ2lwc1NTdWZtZ2ZzZXZ5T2RUYWRta3Nxa1dFd1hGeUlLd3lzQUY6ZWNCd0VKY1NzT3ZnZ1ZfY2Nxc0VVWXhTQUlqT0xlRVQ6QUtIUW9zTU9fVFNVSHBreFV4RVlYVVhwTVFsdXVTdEtnPHVWcWtYaU9WTWNvV11ucHBGd1o+d3RqUGxIZ2NAZnBqcHZqSHlGSV5bR2lMWGd1cVxcZUZnP0F2dl52RGBcXFdOZ2VXXURQbUlfeF1HYldubzxuY0FxcW1YdFNueFdAbUR4b095XnZHZkl3cXhocEJpaHhQeVhncFBeaHFxY2tpbFtwaT1waGdHX1BwZl9YdF1PdU5GeHVmeF12b2tmaVBfb15gdG9AX1JWcXF4cVNxcHZYY3Vwaj1ocGNvbk12dVdpcGNweGdmeWw/aVFvaW1paD9OXnhJaVRHb0p3a3Vecj1QeWRZXFxGX28/T2VYeGBXSHNvZ25dZ15ncGNwRnVhT2ZjQjo7VFFRZlRlR2djR0dRRWhbVXI/RnlldmNTcz5jQnFvWXdReVBVcnBnV1VxWGZBdUtBdEpBcmxDQlNVY3RFSHRLSVR5dFF5UnhPZlJxZ1l1aXhjV0p1U0lrRXY7SWo7SFpDQkZRZDtlYnJHeWpJdj1hRz9bRF1fZXddeEt5UllHWWBJRVNBQ2xfSEpNVml3aXhReXF5aXlpeUFzRXY9ZDxzRE5paGJnVkxbaGBFZEtBbWtYb2VYV1VxcGdlb2dob2xBbT9YajxYcXRleGRhdVZhdWZhd2ZJd015bl9JakZEVVZdVU54TVtpbkV1bGJwVztlVUVQdW5cXFF2XFx5VllYSUlvQXlKSWxNdnlyeV15QXF4cHF4YHF2YGlrVXRQbEBYSl1LcV11a3VqV3FXWUlwXXVyeGhZdWFOVnVWYG1WeER5XllsX2huX3hLeDx5WklsQW1NW0V5WmB3cnBxUGRqaUBQdFF5dGFzWmhRdF14YmRqP0xTQ21Zb3VOSW1tbnRYdWFUU1hLSmhwYkhPTVl0TVF3UmRXTVVUTUFyOkFKRVxcSl94dE1ZdE1xdVhxb1h0a0doa2tAUjptdFxccHRWPXFqRVJ3PHV3WFlxZExnTHM/WXdPdVhheXRgdVZhRVVUPE5lRVRlXXNgVHFQcGxQbGxATHM/YXlzaU9obE9sYFA6bXRcXEZgRUFrV1ZhcD9wbj5kaG52T3FhVm91R05wUGZgQmFxWnBsbXBrOz5qZmhaOj5qZjw+OkJTWjpQWlVQd29IdXR3blJvWzpnXVp4bVk+XlVhZm53Wk12Y3ZGblI/Ul9TOjtkbz9SO1VYUE14b2t2bHNlcWdDP21Wdm9YUGNTT09FV2NFT2FjVXFGbT9vZmhaQk90dFhqSHdpPlFkQlFxPEZgZFB1ZGljU1leQW9rVkdxbGdqSEhgOm90UE9rPXlqSVZzZEdzbD9vbUFvV2BbZG9tSk9xVG5gdF50YEF4P2h0XVdwX0dlWT5xSnldTGF1ZGh0U09qdEZkPXZfSXB3bll5VVh4WXBrb2hidW5hcmZ2Tl5mdkhyZ0huSElbcWB5QVF4bFF5SEdleFd0WlZnZVZfYnduYXhuU29bb3FfdEdpWFdocE9hTHlaZ1doYm5gXVFrQXltR1dgSV52QGZ1PXB5Ql9fYHdgQHhoSWZ3TkdoUml3RXZybT9kWV5fW0BxdE9hdFlcXEVXW29Pa2NBc1Jud3NHXWJHW0hhW00/W3VhdUdZc0d5dV5gZzxJXFw9dmFqUWNNWXRNWWBsTmBMV2lZWGttQWxNUWxvQXh2SXltYV9BXm5pQGlJP3dDSW1iV2VwZ1o8b11nPmFTQGFrQHVNTmthZ21lWHJdaGpRTl50b1pYSG1CVmF3eVpWV3NdeHI9UHR0XmVtWGl1aWFbSWttRnRuWXRreGdjb3RmVmZWQWlEZnh4b11RcXV3WGljdmZlaHJWYXVWYHRzXnRvaHhiblxcRUhwSk5wYVdwU1FnZFl4UkZyYHhiVlF1VXdlXVZbW2dvc3hhb2FoPHFhQWhzYUdpaElzbnZiUT9eUE53b0hvUT5dZ1Zyc3ZjW3B3RGdeb09gTk5vXFxWZ2VPYGhHc1Q/Xm1mcVhgaElvYz9yVFdjPXVyUHVmcGJzT1Q+PVZod0JNZUZoVVY7Y3NiTWNwXWhjRWZIZWdoeUNBcVZqS0hsS0hqO0hqXXZCSURlTXZEQWRUX2dZP3VNdWdGXWhbU0JxS2NvV0J4dVZKaVd3Z3c+XVhiZ1N5TWdhP1hKaWVSa2dIdVR4O3Z0R1JDX0VpVXVPeWNzb0ZIbVdsd3dmYUBLeHRnZz9vZVlReHFlQ009Z0ljY0dnY0w/aWl1aXdxSFFJeTpPaVA7Z0JtWGlhU2Z1dkpVZV1FWVlXSWttZWk9RlBLdGZtV1U9SEVRdE5pREI/eVVhRWRHZ1FZREQ/eUFjRUVDY1NbUm5Td25ZSFlhR11lcmdlSG5JVG9JaWBhSD9PeUhdVU9VdmxfSEpNdExnZT1HZHFbV0dBZ0pnUm5nZ19ndmF5RGlrRF1Nc3FpV1VxWGttT2dwT3E8cERUeE1ddmVUbmhoUnBgTmJVbmlxVWVMU1NxcGNVSkV4TGJIcFdIdzxxdz1VamZoWmZhY214W1dHdHJ2YERCOl8/Xz9bXjo+TDo7Pjs+O2dhW3VFUWZwX2l3aXVIcWg9d0lNdWN5X1lmaWh5TXlwaUlmU0Q6O0ZlRVRyc1dHT1lZTVhJYVVVP3Vmc2NZZXdZYXhySWJheUVYP3lQeURFaXhobWdZdWl4b1l3UVl4Z0RaP0d1U3RJXVlpS3lueXRTXUZeZUdEdXdFZ0l5YXg9YXJdeWd5ZXdDY3dOXXZnQ0VSTXZxQ3RMUXRsc1ZWaWJPbXlwb2hwT3hnP2ZWVWl0ZUhxSWVYZXdpVXlxeXd2V1lnVVl2W1hZc3duXWlTbXJXR1deYWJdaWhvU2l5WXlWWUNUdVR1RUVwVVlfU1dPWWJTSXVTbWlBW2RFUXZcXFFmdD10TmF0TlVHWUd3ZVliaXFDZ3VUSXNIeVV5dXNTYnVJTXlYYEdSV1VjbF1SZkd1PmF0b1Fyb0dyaW9kW2lHZlV1cGdTdztJeW1RWXhzQXlYPFBwUmBtVmBTVEl5PTxzVF1MQnF2aXVTdlh5Z1V2S1lvd1ltcDx1RUlYPnVWQXFrV2x2QHF3Zkl1bWh3Z2l3dj9kdFFucEF5a1l2ZEl4cGl3VVlnbHdvVHdnclBpO1h2b2hkPXBgXlFlb2l4O3lcXHBRZ2lebXN2ZWxJXUVHXUtpdE9pblh2d1NZcEFPdlB4Xz1mXkhOZXNJdmNYdm9QeGVfd2NJd2NIcUlAeVBBb3FBdklxbXJxZVNPXWhAYldXa0RHeGZZcElxY0l3Y1lncXRnaGNHZ0NpdmxHc0Bxb3F4cFFYeF5AZDxgbFdgbVZgYWxfdkJQW1RpeGV5dElga0ZgdFhJc2p5dnlxdnhJYmdBdWVfbT5gY1BRbnZudXhxZ2F4ZHVGXFx5cG5waW9Ld3lCcHg+eXhEUXR2b3RKQXRaVnVyRm9nXl5lZ3ZjQW87eHdBZnJdRmp0UHk+WXZNeF5Jb3RYSXJUWXh5V3BbWW1pXnd3eWlpUWhjYWFTV2tsR3V2aXdpYWBnP3lFaWNBVnZJV3N0R3lXV2l1V3lfWGNRcHhoaXVFV11sTmNaRl9iV21UUG1ed2dpcHhUUGRMRmJ1XnBXeG9WYG8/R11nd2l0UWVuSXdER2ltTmRXcWNHZ2NHb2NIb2tJeGtJaVNtdm87bVxcaXleYW5KaHVvWFdRdVNJdVNHbHVBZXJydE1EVXRAbXFzSFdeRFBiWU93WVB5XFx3U2FzcXRTUFFuaGlYUjxVSDxyVGVPWWVWOlB3PUlZQkFKOjxsb0BaWlo6RmVFPlo6RkU6S2hQO0I6S0BKYlxcTGhZTU9lUHhkcWtVbndVdEBQTkdFbT9ZS05BdURsc3RlU1BRTllUU1lsWUJRUjo8VTtJVEdAVz1tSjo8amZqZkpeS147PmJQUVo6PmJQPT5abFxcbFxcSlxcSjxCWlBaOjxCOkNNOl5GOjtzVD4+PjpSUDpcXEZcXEZyTmNFZFVob3FTT0N4d2NTb1F1RFdJPTxKTkB0dGB4O1B3amlqUWVLcE15XVRQdURVZENQcWVvb1hpYVNGRFRfTXFvQFRmPHZsVFZyQE5PWG9vTW1lcFY7PEo6ZXdaQVlnPFpEWWRRcWZPT21AZnhBTmltUHBRcW9AYFtoZ1tvb2NyaGlbaXY7cHRwQGdJSGR0UG09X3VwRml3eHJpeW1xSWVYcG9ocGdRd2M7QlpvQ2xvSGJxRW55UlxcRUh1R0RzZ3U9VUlPPWhkRVZZV2lzW0RFR2lmR0hjU0JgXVVrQVhwR3dnY3JYSWVScWRPY2NAcXVnQ1dVQWRRXVM7dVlMcUhOc0NrPUpORWt2VHVKaFFbQFlcXElxdFxcUVQ9WVtMcHZcXHVMPG1NdU52RXZfSUpoQFJCWW4/dE5tTVF5QFF0bVZcXFxcd255TUJ4Uztxd2d5eD54TkhhUnNxdDo8Sm89VFFxbEo9dWFBcHNhb2t0TztxU1tVSzo8TmVVS0FhUW5ZWzpQb05fc21BbG9xeF9BbnVGaFFPa2NwZXE/aHNoYVJXdGB5X2lAZ0ZuY3RPb1J5aHBPYT1xcU1edVFROjtUUXFmQ1N1Ol1HXkd1RldERndUUDtnaFdCeHVmPUFXVWtISGFHSE1ZZGVDVXV3Rl1SZVVYUmFXYEFESGVSQDtCTkVFVV1HUFNWY1tmWF1IQ19iYUVEO2xwdFhXO2lxZj5aOmM6PE5lQzpCOl8/SkJRRVs+SjpDWm9VZmNHZ2N3WXlpeU1ZdE1lP0VUXUdVdWN0ZVVXVUtzW3dyUkVFWXF0VWdYWUVCS0lmcF9FQHFzV21XaXFCOktHSkl2PXlidU1ZdG1iQXdiWUtZYklmSXlZeFl4TEtpbVdobV9HUE9VRFF1YkF0Wj10TXllWXVjcE1ZSG9Eczt3aD1JRWNpTVViVlNpYXdKT2h2QndiSHdteGZvWHZld1BpT09icUlqQW5dUmFxc1doWXdlWWF1VmFdRXludFlwcE5pYE9eZkl3YmBuWGdobGdfTmd4SEd5QlZFZVNiXVdmXUhZc1VzT1g/eXdxeXV5dXl3UUR0T1RycUdoa0dsX1lkQ3V0V0U+ZWdtV3RLd3ZOZ3dYSWVSd2hyd1d4U2NTPXVxX0hlbWlDSWc6V2N4PXk6W1Rzd2hZcVlVTUNTQVJaO0hzQ0ljY0JoR0V0d1JGY1NHZVN1d1hpcXdkUXdMd0JmU2dkTXNUQXM8PV1ZUXQ6YF1XTmdtP3k8UXdraG5ZRnVfSXJId3F5SHVUV2p0aGBtX29udm9HX2tSXmRpdmB1P3FHR2B4SGE+QXdKdnRSbmxwb1xcRVloSllhZnhddmBdT2FlcG9xZlNvV1djRVdzQ1dSb2VYb0VZc0Vxb2JoX2RwT0duZVZWb3docXdIb2NIU1dXW2NEZ3NUQXdfSVlHUVRQUXdDbWhKeUVFR2lMQ3hSWXVbXXZTXVhiV3VRa2NhVWVLZ1lUd1ZvYWZMYWlQdURudUN0WUZrP2VXQUVDSXR1Z0ZLU2dld3JRT0dwVXNEP1hHbWU/d2dzW0RVR1hjd2RucVNnc2NPa1VCP1M/V3NRZ0Nab1ZmQUhCPXdYZ0l1bVQ/b3dMUXRMT3lRYWVbd2dpd1M8dWhxd2hRTVJxR2ZbR2Jfa1RrR1Vld2RvT1VhR3lOdVdqZ0hZP0lwT0lvR0NdT1VuS0VUZ3ldRXhcXEtISkt4PmN1ZXdGT292b0d4TFtIWFVzVGlpd3FFWVd1YnV3R2FIeE1lV1NCZVl1Snd4S1NYX2F4bD1CYm9TZ3FiS0dkS0NjVVl0YXdTWU9Jb013dGl4ZXFWYnF3cTtTZHN3WGlpVT90Z19zZlBxbl1LVXhTV2htQ2BSWEV0SmFtPVlXRTxReG1saVVeYHdmYWdzWU9vXFxvZU1xXnl4ZHhHQE9zTklWSk9TUWViaF95b3NIX1V0QENDV0VFW3V0aGdVbHlYXXFyR19Ha09DQ1FVdz9GVndVU2tZQ29IVFV2U2FSUGlWXU1pUXFGSW9YU21WUWFld0F5Q3lXcGN4VUFzb2NiQXlyQWl5eHVpbz1zPXVDd1tmeHVyXmVHOk9DcW9Zd1F5aFNiPmNnTkFpZFtYR3l5SE1FcHF3V1lHVVtIT0V3REF5ZltoTDtzamVzSW9ZRHNna11mbWVoY1dEYGVzY11jb0NYYEtFSWVSb01kTW1GUHd0VEtiaEF5R1FIbnFWWmVXb2lGQEVzXVlXbXlkTV11VVVSeT9pYVt3dUNEeU9pQUFJWFVXQzt4Vl1Jc2F2TUdHeV1ZPVNCPVt5Vj1CTkVUYnF4bmF4dl95bFlzWWtZckl2QkFzQlVZdVVpb3lpTD9pdW14Zkl5XXdJdFlGc1lXZ21YQEV3ZVF1T2doXFxndXVrdlk/WFJzZjpTRWFZRXVdaHJlZ2NRQz5deWdtQ0Fnc2FHd0FxVV1reTt1cjxRZ1pbU3FRVV1JV2JXWDxlaVR1SUlDdXJzZWNjeXJReUdJR1ZrSXddeF5XWFNneD1NcltnQlVdeW9LeXllVUVpVmd3ZnlzYmVrWVRLRVRreGdZdVFfVFRRc1h5VUVVU0VzSVE7Qk91Vl1xckdnSUBXZ1F1Z0Rdckh3Y0lXZUFpck5ld2VbVG9bZ1R3ZFNNVj9wTEVockxxeW1sWXQ8WFpQa2loU0dZd108c2lMWG1xdkdxdFdkcXF0dXZVbGZoSkptbUdhcEdxblhcXFZUYVVhQXFDWGxKaUs+TEpleFd1ZE47YW9UeGxNUHdaUU93YW5PSVRRUU1HVHBPaVldPEtdcXNRZXlzcHF3YW5McWxcXHBMOmVPS1VtckRYX1FzT0RLV0lwa0hQbVxcWFFwbFBwUkdMUEhQS1dtc01FT3htdFR0bFtBdUB0akg8cXZodHNFckZwWWZ4dE1Mc2F1U1tJc2F0bVZsTVhsVF9oT0FNVztcXHRecHJAcVJZSFZrRVhrYXRjWFRdWXZdcXZ3cE1PaWtRaGo+cFdRdVRRdVhxdVBfdFJrUXBwZXZPUG9PeVJYaVlYaEtLbFZjVVNLVUtacHZvZFBvZE1wPFNQUVNTWE9zWE9fdG9TTHF4VWo+VHBmdUt1VVl1RXFBXFxWS0xwcHBzYlhrZWV2cWhOeTxxVXhXeEh5YFhtaE15b3lveWVvaEh5Y2VXZ2Vxb3F0VVVNR0xNUVF1PDxvS0F0d0xXUlhtVVhsSmltVmBtblRSUWV4cD1Ockh4bERVVXhLQ3RUc2lRd1B4RFlPUFltVkhteE15TXltZHhKQ2VxbnRvWXVxeGhxd2hZUXFvV014UVhVa0BKYkhQZ2xqYXVtd21QPWlrUWhOZVVxdVhxX1xcWHNIeGxEZWdGdUFXYXVveGZQa1JhcU1OZXdwZERvZW9PdVhWaXM/WmRfa3NXdl9nXFx0eG5IZ21sVmdMRltXWWJATml1Pl5lV2RKaHFtRnlrX2tIcGtocHlRYGpfYFxcY1B4cXF3dXh3WEFxa1dub0FjZ2B5ZGB2P3hdeV95a2F3ZmFvdmF0Znh2RHlzVE55dFF5Xm5nSXBdd05za2llOmZgVk5xYGlhWnZkcXFoOmlrUUhzVGdtdlFgdnFpeUl4XXlyTXBnTFBsR0dmVGBoOnBkVz9uUGBkUHZtb154bmF4Qk92bFlkPT5kTWB0R3hsQW9iQF9zdT9iaHBxa1FwZj9gT2duRWlrUVh3aFZnT09zVHhqVl5kdk9zaUheeVhaaHB2P05nZEhgU2doaUhueGleT1Zwdm5pbElzYWZpeHZdeVhAZWdsc1d2X2VuZ0NuU1JRZXVyRWVYcUM+aXNBbFFWVXhZTHhEaWxldEt3XFx4SkF1UkF1eWF5SXl5YkhOTHVxeHR5dll4QXFrV1RXY0VXc1h2SFhRUGFwcVBwaGVVbVVYbVl2SXhRaERtd3F0VXVXY1hYcHFRc2F2TVh4YXlzRWFNWVxcWWpJcmlcXFlbWUtmWGw6THhwXXZCSUxvQW5sdFBRcXZwPFRkWEtTYXBUYVdwVHhcXGRVR0FRdHFOa1xcUW5cXFBuWWtZXXk8bVBGcFh1aFVAeW9MeVNEbXRgTVB1VGFpbnlcXHlfRll0UGluWGZpZElvYXBlckd2P1BqWXhyXkZtVFl0TVleW2lpa1F2P3l1eHF4cVBgPk9ud3ldeEl2WV52cWheeV5icHg8T2VGUVVNUXlvWXdfVUJiY2RoX2JoVVZdVXZpcVlxWUltVXJlQ0d1c0l5c3l3eXd5dXlTd1ZYR1RbV2VsVWdSVXJTVVVdaVdCWXI9WXJ3ZVl3TXdSTWJ2cUNEPXRoV2dIX1ZCYVlJY0V0W2huX2heU2hYWWhhdXM/V0NRa2V3bXhTbUhTXFx0PUR1QFFvPV1XU0xZdTxwcG1uVXVLRWFuUFhwUE1UUGFxYUhwdnVoeEd5X1FsV0FqPG9pXk9gaXhiWWZpTmdwX0BzVUFsd1lxS0hsS25bWVFaYnhdU2F1ckdlcFBrTE9bUWF5R3hsZW9gZWdlaHZ0U1lwYWd0XXFMZ1I8b2g+eUR4ZUhvY0h3R3hAWUVMXXRkd2hbb1d5T1hoYXVzS3ZQO1J3R0hpXWlmU2U7RUdkZUZuZXNdTWlMS2lgaWNRV1dyRUNOcXZrUVVjP1dZPVlbaUJtU3h4XXldeUVRZ3ZVXVV5b1l3WURJXUlrWWdZZXlkaXNxc3VOYWNFYWJoW1VyP0Z1PVhTa1NHO0pDTVdjQU9gYExVdEt4PHlaeVV3aXRZRXNQQHhteG13YXd1dXd3eG5IcVdLYWtNXFxVRklYXj1ZPUhuTGx1bXlOWWBZbFV0R3VQS2hwQ2FWeUF3aXV5cHlXR3lubGlSRG12T1hvb01ScE12XkVLVXhUdlVzTXl1d3FnRFF0a15eOk5wcFBoQj90RHFmU09icVhuXVh2cFh1aFdsTF9yVnFjWHdxeGNXZ2VHW0I8S1R4UXM6RVNWRUVzX2NpZXhhTHlNWXFoUXFlZWtvTFRnaFZnYXhuYXhxbHFraUtTaUtLeHJxdXV3dXA+VG12PFF5bXl2cFRIcHU8XFx0b3BSZGFTdkRzdWV4aGB2cVxcTnlkbWl0WXNZc2ZFUjpcXHRnbXRUYFZ1PU9feWpJeXZNQHRvSHVmdXF4aXhpaHM8dFQ8cFRwcHVJaVFxYXVyQXlyYFRHZXZEZHVCXU5cXFRYUVBXdXFsVW1XW1RXUVhwR2VZSWVPZ2RPbFhQbEV4XFxpcmJdUFRtbHJocEBkb3ZFU3lseWt5a1lZWWlpUW89a1xcaXBRcVV1PXg7eUpzSFhiPEpscHRUTHFJYFFsQXNZdXlveVVFcWpUTU9XVVdiUVNOSW9KaVF3TXluYFR3UFBgRXNIXVlLeHhqcXd1eHdEZW5ucXl1eXdFYVNpZXFvcXR0dXNURXk8bHFwaXBpSG1TcVhoYXVzRHl4bE15XXlreVl1eXB5VU93XXVgZEpnYHFTRHN4RXVlVVFtbXZGaXRleFRfWVdNeFVGdUNlY3FHdDo7UlBxdFhDZz1dVGJxaHBvaHhNd011ZUxnQ2NHWUk7U1NxWXhPeERZRz1VUj1NaENjdXF3V1lFZFhBckF1RXddRl9HdHVzd3ZXWHNReF9FY3ZlSGp5WXl5eHllVlppZXFtdWNTeTtjWFdnaHl1eHF1WXFrSHBrZlNjZ293eXZ5c3lhZ3Q7QlJ1aGhlVWNZdnBjVkpRZ3FTdFhxdXhrSXhrR3VLU2xZdHN5c3lheUlFWWldV0E9QkpnaGNDdWdxWGNDVEhrRXY7R1U/VEM9aT9pcj9lWF5rU2d1dlFvZFBPQ3VHSFFHY0VtZEFNRkt3eXJ5Y3lBeWl3eXRMbHJQbGlwdEtMVmtAbT5pb0ZRUUlQUGNwUmxwVFA8dHFscWtPbztJdmN4blhQaVxcSWthXnN5Z2xybmdNaVpnUF49X3ZRWV5rV19JeHZheXZjaVs9PlpTV2k9Z2NHZ2NsaHBOUGNxSHFzSGVkZmVTQWlkWGJzaGpUP15MUHBsSHR4aXJpbmlrWXVZcXlwWXZJeGFIYWFsYFpqaXVxd3VXWHdmbmdkaGtpT3JmYWQ6T25FeXZtaV53eWRwV2JYb2lzaWZtYXdZR3lbcVxcY3leVUhhYmdcXHNpclJIY3k/d0pJXnBYXjo+bEdGdUx4aG9naHdAeVxcWWs/aG1mWXlpeXF5WWxZYHleaW1xb3VDT29cXFdkVEFwW1dieHd4VmlvP2BvT2BsV25dWG5kSXhaQG5aXll5Qkd5X2ZcXHVuZ21IW1RncnZ4ZV1JdW14Zm1Zd2NwXTo+cHBRaFBPY15paj9oanleeVt5W1Nha3l3cld2aFZ5aFlpaXNpZWVXZUVGZXV4aXlxaW9fdlZPcGdWcktReFxccHJnb3g7V29YeW5zV1tKV3BvP1s6PmRsTmxUVmhtV2hgaW1uTnRzaHlwWXVHYVpLUGtwdndlYGdlcHlAbmJFWGtFcGZjP18/Z3dHVm1aXl5od113X3hLZ2hZYWJPWGhld2NWYW08cGRzRmlsYW52eFpvaWZFWXlpWGx1eGc9Pl9mSG9YV211Pm1yT3ZDZnI8bl9QSGNwbmF0QXddRnVwcW5ldmZfUGh3YWM8YG5AYXhuYXA+Q1VleE5nY2BneExnaGA9dERFclRnU1xcZUR2a1dtQUNUZUdrVVNoZXRvS3JjWXRhR3NUPUJzYXZmX3ZlXXNfbUlpVUVEX3NyZXdmS2VGYVRNSVhEQWZPZ0dtcWZHVWVwW1dSQWhcXGtGUWFFbk9VR1toW3NpbFFzZUt3O3VYcXVYUHdHYztWXU1YeEVSZV94cHF4VFdpRWt2T1lWOjtkV2hYQWRteEFrX0Bsb2VKXFxdSmdtUFB0TFFkbmhoU1Q8eXN4c3dtb29ocG9Ib2NIT2M8Vz9xdGdYVVFxWWlcXGpkcW9ldWxQcGxOdXBCUExZSFFXYVZyQE5PaXdUTWpQVVBIUVZRTHhnWHNhQG1XaG1naHd4YW46XFxMcExXYVRqVHhOTnBPVFVuPWVXSHRVUmVRcFRVUGh4dDxVRWRqbnRwZGVYUEh2QWxPQXlSTUB0cFRWVG1VVWlvR2h4aTxRTkFXYHlxXml2PVhVPWVtTWxXc2VqczxQX2FrUG1QZ1Vva3VUSURTdXFOUXVzX0BseFVXanBLc2F3YXVRVUF1UkFtW2RTeVR4U3hzZmhZeGh0V2hwYFVKbGBKT21vcWB3VFVWVnFva05fV2ZdV3ZySGhdTWFrYF9mbHBcXDpvcFxceGxhaWBhd25dZmlKcWBBUGZtbm9yT3dTYWBtZlo9cHdDQWRmblxcam5adWhna3FcXGJneUN3eEpxc19hZUVWeVZWanhBQ0dndltYbnFXQ3dpdlt3bXVIaXNoU3VnVkdkeGFSb0NWRVlGcWFpdl9Zc2tGUXVDQ2F4YFNkYFFUWk1XXWdFSXlpb1V3VFdlVVdTbVVpQVF3aFVSUD9jTHVDcGV3VGlkQVlzbXFXRm1HQj10RHdiWWtZckNXYUdCOmt0UEV4WD94P2dJW19SP0d3RFtidktVak1YRFVTTnljZHlFaG9DSVFzYUN2Pz9jX01FWD9Udjtxd2h5Y3BVaFB2bGFzPj11Y3lRSnRNWnhrU2xtclRMT3hSVU1tb2R4YkRWb0FsZnB1XkV2V1VxcGVzdnhybGBXeXlxbmluaWRsZnFxRGlUVnV0WHVxeGV1ZmlLeHR3WE13bEFvaFVLT1xccGRgTWk9V2I9cXRleGRgU2dtV2htT2lJdzo8b2lsUnRFd2tBVWBZdm1QVDtUdWZ4UElMeGJ5V0NpTEJoanRlV2R5TWRoTXJldEpQUHdodXF5ZXhIcV95RU1pTWVpXmVnPldkc0VVZ1FVdGFzQ0lHaFVDUltoYHFVPEF3YkFnYF14b3dqPzxsV2RxUGRYSW1TP1xcVT9tcUJ5Tk1VVm9wbl9oUV5QT1tRTUU8V0BVd2pYbkdVa0Fpb189a3lIcWZUU0dlbUxkWEVpT3FgbHI8V29Qb2hVUlB1UF9ddEZYbEZwdHJEb2ZUTU1YS1hcXHBcXHlTeWF4SVVseGxLOlxcdXJcXFdJPHlXSFJxaG9xTVdzbExBUHVueW50TUtBZHVDSHZkYVhfWUpzbE5sPXRXcVBeXXByUXdnYXJUVXhQYGxPWXB3dVZhWFBmWVFrZGxjTVJIaG9IYWw9bVhQPHZHbXY7ZWxhTUxTZE5ITHVkcW9lZXNqTU9CaXd1eVdSZXVQVE5iZW9pbXlReHF2aU5VeEs6RHVsWFlhTVZ1dGpUYU1wVFVcXD1TXFxhVlhBUmZcXG5TZ2c7YWtPeGZAb21Kd3k8X2k8WV9pWF9Eb2lBRlxcR1F5QF50dT5la3dpR2ZpSnhgXFxmcGZRc1tOeEBwdHZxXm1BeGt5cll2aWhZaFlYX0JJaT9JcWxoclxcR3BkZnlfSGNKTm8+X2F0X3hiSXI9eFpFZnBRWWZAaW9gX3VCUGM/aWdLUGpQX2NJd2NFYWxvVm5rRmlkT2dEaFtCPmpeaXNuT15HUWNsSHFQeXNKbmVieW9iWWFKR3VmRnhYWGxhb21zb2ZiP2diaW1xb3VTV3NWWV1VVl1fTl10T2l0T2h0Z2RPdnBbVm0/QHZUb1tQcW5mcGdNUF1NWGtRXnBQUXFQcGBeP1piTm9CX15scHJaaGRfeHR4aXl1WWh3Z2RnXl1paF9md1xcalhvXXF4eFl5aXlfTD90TGhwOj5kbHZ5d3lVdUReTUlzXXVjeWdQS2hwP2JvZVdEQWlXTVVUTUdMPXRkR3NkV2ZuYVZnO2JEO2ZZc0JoZ3RoW0NWb1NhUXdVPUhQb1JPc1ZnT2M6UUZLX3ltWXl3eWhXcVhVR0ledXhoaXU/TWlgc2ZueVY+SUI6ZUV0YXRhb0lfUVhPd1Z5S2ZEV2hQYUdhVWNLRURYRWlsZVJkUXVZeXl4eXhgQWQ6PUZKPXhoaXZPVVU+R1VxU2hgPGpcXElxcGV3VFlKSVxcUWp1dFd1WEtocHM8T1hJbEhVd0NBVFlweW55bldwc3JpTFxcZWpncVV4RHdHeUxwQW9tPEpaRHNpcFlvWW9VeVd5aHVlaXhUaFE6WWxvaFZFUXVeWHBIeG5heG5ZVVlnaXA8YFg6eWxobVheZU86XFxsOlBLRUR1UnFpcXBxb3BsY2F3VXlwaXZ0UWBka2lxZm53c3h2WFBqYWdndFhzdU9bVWlRT2hoZ0dySUVYPUJkXWVLSUJXbUNxRWJKZWlkaVZ1bXZNRWhpW2hHaXdXYWZOV3c/c3JRb0dXTVl3aXhRaXY7eWV3SXVZZ2l0UXdlV3Vxd1d5Z3ZQV1ViV1dtZ2dlVUNvdXJfX0NRSXRQO2h1RXluRVVFZVVFO0ZRQ3RbR3Jad2Z5c2lVaUdjeXhtXWhYeXVrP0dpdXdAU2hqa3dsQ0lTTXRVO3lmRXVsZ3JmZUlQZ1N3eUN4PXg9T1JXZUJOdWRGd1k+d0I6O0JAW1JMQ1RKY0RTVVdneWNqP0U7VVVOQWl3dXd3d3hOWWJ1d3d4V2VHd0I6X2dtX3dGYVJSWXRLRVNRc3ZCRWZUV1R4VXdxW1RoY1dScXV2VXhHeXhXeVhZR3luWWJJa0lyRXdfd2RYUVllaUdsb0hNU0hFc1ZhdVZtQWlsP0lhP2Zna1VWUWV3c3RMSXNJO2JWUWZQSWlPSWRhWWdvWWNiVWN2ZURnbURtP3R1bUJmQ1hfVWdxdXhsdXZXd1hUd1N5QXhBd0l2QXdBdUlMX3J3aXNpbVlNXXRzcVRrSXhURUM/cXRQcVRPW2hhdXNYZ3diQXdiS1dKUVVdcWhKdXJoZVZgV2NFV2NgeVZbVXg7O0ZFRWQ/P2hQYXVpRVc6bXRJc2d0UXJkSWhhRXlqO3dsQVZhd3VMWWRXUXM9Z2ZjbVVVP0VrO2dYbWl2XVZyZXhycXZKU2Z1Q0Jtd0M8X2RtP1VYV2JYeUZLQXZfQWdgUUdXdUh2d2hWUVhFX3RFdWZJdWVQX2Rvb0Ryd0lySXJJS0VVU0VXa0NBRWRIZWVTdVRPeWlwZ1V1b1hDbXREWUJTPVhzaVZnbUVxUUloO1ZWUWU/ZWd2dXhWSXQ8O1JwaVZnUXN4ZVZdeXZrY3JWRWNyXXdnQUhsYUd0W3RnWUNBWWhHQXN4Y3NtT1lMRVdYVWdFS2lBY3lLP1VGcVdGX3ZiaXVMP2NPaXRdWVNPU2lfY3dDcVNAPXRwc2JcXFVIaGN4TG91Y2d2a09TWWl2d19XZHlpdGl0aU9ld11zUlV2Ol11eFV5Z3l4VllYSWlpcXF1VT11RUFYaU1nZHllVUdlaW9WYmVEdTtXZ0dYdWhrQ1FwRUBuWFxcUXZBeD1hV3Y+c2Ngb29AZWtXZj9ncUVAdXNZc3R3eW1wYj1XaFxcWGZSd2RaXnZDZ2BjYGBpaGtRQG5rUWVQcXdneXg+WXV1V2BHeG1gd3I6UXlwXnh4X3ZtV2lzR1xcdklzWWB5Q3l0eHB4b2BsYUZeeV94S3liUXBfV09pY2luUXBteW95c1lgYW9zdll3eXB5ZVllaWdxb1ltWWF5QFFlQXZ0V2dlVWF0TmFeb3FxPmh2TFF0TGF4bmF4SGhddU5jSl5wP1BvaGd0dW9kTVBzdUhaVj5aRlF0a0dheWdtV0hrPm9lS0F0VlhyZVdbcm5pUHhnXWBwXlZhaGFxbXFzeUd5UXhpQ0FoZE54dXBqT1lybUFxdnZoV2dweUFydFBxdHBrV1ZhYFBnPmF3bXBwWmZ1Xmlva25nQXdiQWd0PXB0UHFkaD90Qj5eUW5iOz9xbF55TGZnbnBybUhbbV9vQ1hdVnZbR3d4VGF2S3FfRWF3VFhwWXZhc2lzYHBpVWZ2R0d2dXB3dFh3a3hyWFZpd2l4UVljak9fbGljT3F5RVhgVXdlQXhqQVhwdkB5YUBqd0l0YGl1UmBpd1F5b1l2QXlrZXhydXBoZ1FmRUlaWnZcXHRJX3ZwUlBXTXVORlFtTUFNZU1Gc1M/UmBrZFFcXEpXaVc9TXdPeVZgTHJUUXdFZz55Zmg9RFB5R2hJQ3VxUz55U3JrSEh3dFRNQnZfZ2hFaV9xZGlvWW9ZZ0w/aVVvSGdNR2RhY2RvaWhnZFRtVExPWGhtV0hNdGV3Z2l3U0x3Z15FUnVvZGRxVHBhQ0ZZaT9HU2Ntc1BXQjptcz9nZ1NVR1RpaV1teUNzYmtNQ2pHWHhHaEFVY1FRZWg/Uj55dWBBWFJhWVRvWWZpSFxceUVuXUdmT0M8YVhpZ0hYb2J0c0ZOWWdvWXhKZ2M9YWdjeXJReVdIRXZqSXddd0ZXV3Nmd0VcXGlDZzt1XFx5Z0t5eWVRVWhTV3djeV95aUA9VURbdVdXSXFNU2hbUlxcQ2Q8X3VqR1ZvU1Vod3hyT2c6TURsbVZxQ1NpbWlzcVZAX3dmO1lKUVVlYVRta1c/QXI6QVJAP2lPX2RXYWlzVWh0b0ZySXVhdWVvSXl2XVdyPFN1SG1wSHVOWWpPVG1lUVZZUVJrYEpsaXlCRG9RPFM7YFluSXRBdXF2aXZpdE9XTXFuSXJBdE1eWE1hdGtdaXBxZHQ6eUtraHF3aHV2dHBidXl4aXlfeEtUZU9BcXJeWXZBeWtlQG5PUG5wdGt1PVU9PFJTbHd0YFRqQW9nQHF1dFVjcVd5aHlwWVlpd3ddd2t3bl47UHlCWV5JYHlzeW15SXlRdnFyaXJHV21wZm9rcXNDWXdkV3ZRd15vX250YHdhb2hwb2RYXm94Zm9xQG87V0doS1VUbFF0TFF0akF4ak93XklvbV5RcFQ/WnNpamd4cFlZZlVeXXQ+dmxRdWVQeHdZd0FRaXdGbkRwX0V5YWk/X0JhbmhPb0d4XVdgWmFIRWdZd2VZQ2VJeWFkWjtXbV9naGVmVmdkRFlVT2NobHFFcl90QTtSeGFVOz91RmVkQGNndHV4T2V1PGtVUUdVZU9TVWVUXUtTYG93U1loQWFpPU1YQ1FicFNlcmdkd0FCb2VTZ29WVkNnX1VVOztCXmVXb0NXYj1XckV4P3lET1lWQ1lIQ2VoTHlCZ212cmd4dWl5YFV3a0l0XXdSbU1pbXFCOjtSRmlzR2lUXVl1WHVURXV1O3VSQXViXj11W1dSQV9IXVFmVHdJeFl2eWt5dXlpeVl5THNCZ2dIaGVnQXFXX2lXRndjSVdneXFYb2VYV1tJcj1kb21COktobj9pcj9ZZGFMbGhMT2V5b2BZW1lLWT1wVVlvY0h5dmVVR2hZWUxsW3VMaWxVTnhvPm1NeWR4TllUZD1WQ1hqcGRWVnFrR2hrY0h2bHFQQG1SQD1VbT1KWnFqXlBTU2RNV2RQXWx0bklzYXRtQnFUV2BvZ3ROQ01Qc1FZTnV5eWZncWh1UE95WmhwQGV3VXlweWV2YXZhS1dCVVI9VWJGQ3ZWWVY6O0tcXHVOYXROX2BSU2V1XFxdT29YVEF1UkFldFdxV2lwSm1wVExgdz95TFldWVpJakFcXHRTQXN5eHl3eXdfWUtldFRJXXdseFJwWXhZRnFvTmlFYHRzTl46XmR1RnViV29CaGBFaF5lcWp3WG9lWGNcXG5wRHdfWUFlUVdsWT9tXkl1VXZndkh4YlluSVBvd09eeXh1aXZbXnZ2RF9pRXh5d1l5cVltYVZiY1BrUHBbW0laWmZmPnFrSXhrVXhsYz9lXW5kT0dwbHlwZFhlPnZ0T1F3UXhea1dpaGF1c2hxdXd4ZFhpVj9zUT9fT3BvTllxX0hfandvVkdxXFxWcHB2aXFOYE1PX1Q/WmpQZVRPZUxod21Jd015bk1vaDpvX1tRcXV3eGhRZ0lAdVR5c1Rnc2JvdFFganVeaGJBbGRhaGlHaGtHeHhZeWl5d2RRd3ROaW5BZ2tRZklvaXd2ckl4XVFQY1RhcTp5ZGBBYWxOYDxJYFQ/Wkpha1VPeWJQX3BmZT5Rb2RucEBRaVRmZVFXeFlZb15Wd3BoZ1VhbkRhZFt5aGRhdGNGeTx4eGdZdXE+YGo+ZFJ5d0xvbnleYXZeaV5Bc0tGa1VXaFpvdkg/Wzo+bmhQXlBnZGtwZmNORl13UklmZD91QG9iQE9ldkF5ZVF3W1lJUE9zbGdmX2dWeXF5d1FnS3VUeG9WY1dJQXVSQWVGQmN2WVVXeVFXX01iTEN2ZFFGVFVYWl9zS01WWGFpXWdCOlt0YWNEa09oS19VV0NoZ2dnZ2d1V2l1b1tFa2d4T2doXFxHZ2NHd1ZJaW11VklxZXdbWGJBZHRDVkRNZ0lxST1fWVNRaHljRls/R11hdm5jU29dSXlpZFFtVUNNV0NDZFljY15fV0l1U0lTd1I7YnRzY1JFeWVlV2RZSEVFRE9DaG9ZWFBTc3RPaXRxd1VpQ0xFdERNdlRneU1bc1RbRm5lRmVldnl3eFZZWElPSXlNU2w7SWNBRmVPR0V3Z1JbdnFbZGxRcmlzZ1FZWWpBdjttY0hRQmJ3U2xnZU51clxcVWR0QWJLZUhJX1JmdVRRdVRXa2ViS2lob0N5TUNMRVhEeWR3W0l2W0dfQ2dTWWl1b1ZWX0lPX1hlTURPXWZEPVhUVUVBV1RMP1lQT3ZSbWZWVXhnQ05aZVBjaFE8RGo6TXFCaGxHWW5mZVhtZVd1XFxOZVVvWGByYXhzamBwbmBOa1VPP01vdmlVV0F0W0hNR2RyU2xuTUl0S0l4allySXR0PUlyQDxKQkVNa1hWXVVWTERwZVhLTERPWGVWVUF1VVl1VXVzS1RVaUlVZU11ckhYXXVsO21NRV11ZFhtT2BteXRZWFVTbkBNVXVyblR1UHhXd2h4UEVZVnF1WHFTVUVQOlBRXlBZPDxsTmhVV0RwTD1ZQnFMb1hhcUdxaHF0QW90UE9hb19gUWFpZFdwU2F0PUBlZm5yPElaOmBod0ZaYkBrT3doWUBucUBkbHBcXDo+bElfcmBvd0M+YmRAZVxcbmxmaFo6XnZGZ2VQQV1CXlpsXmhwWGRfaGE7PmxvQFo6UHhBX2dgcW06XnRzbl9aVmc7PlpzPnNKWVxcOmdzbm9wPW90PD5aREFiV1FmcFZiYVdhb0Z1TVJQUUI6S1NLQ2hTV2FXWWJLQGtfVmc7PjpRSG5hQkpYUVVJTmVjXFx3UmZtYlg/QkRLdGNJRUJRVTo7Z3VDRXRNQmJXckhxWEJRVTo7Ujthc0hxc2RXdU5TdE07QlNVQzo7R15fc3dDQmJXdU5TRGtfVmc7QlpzVlNLWTw7VFdnd0pZRDpDXVp2eUJoc0pZXFw6YGJmV2dlV19FTmtmaFo6YkNBdE1UV2FVUUVVU0VdVVdUU1BROkdFWGtFSFFoYTtiZXl0aXdJbkF0PXVXdkd4QHNoTl1GZUVCOjxweXV5eFV3TUVzS3FvaHBvTmhtZ0FTZFRTXlRzWXVtSXlybFVOZUVabFdoPXFtOl5uYmhheF95cmBhSnhxdXF4Z1lubmheZUc6aUM+UVZrZ3I/aXJ1dXd3d3RmeXNoU1h2TVNzU2doU2dPd2lOb2heZUc6bFRUUG1UcFF2QXg9YVdIaVhsVGtUZWpMcXA8XXU+UU46PGpEeWxfSVM/cVZLVW9iUHRQaG5BbXQ8XlxcQE9kS1dnUHBwZUR3PVJQUUI6S3hLX1ROUVRUcVRIa2NRUUI6ZWNSdWl4ZXk6TnhaQXNLWF5kP2t0T3NrUWVscFxcOj5kUlZ5cGl3TXdbRmFvd15pckFgRWhuTD50QGBbOj5aU0s6YD9cXFZnPEo6ZHY7SXFLPUpKdWpcXFhSZ21LWT1ZT0FWYXhRbFR2b1hNSXRudGVXaEFuYVxcTEU8cURMUE1Uc05ga2N0blR4bm9dWUVZUWtQdFlVb1NYbGQ8cnVdTmVFSjpkUlxcdXhIYXJ2SE9MWU9fTU1geVZkeHRrQHRZVGtzUHZbTHdoVXVkRVNJYUw7RE1XTHdYQHdGYHJgXXdreVBKaVFuWFBPTXVUVWxWaU1OQFNoQHlaaHRiVVJAPmVPTmxAb2o/YGFlV21GWF9ab3JjaHVVeXdLUXJFRmxVZnJ5SG1ncG9IWF1HeF9Db3dNUWRRcXFOaXA6PmpEd15bckZfSEVBRG5VZ2VxdTxtSF9xUkFvQj1PSDt1VEBRZFBtVlJlRTtVU1BRQjpLeEVVdjpRZWxXSGJxaGM/aHBvRVFnaFZzZ0dhZFZJUnFXUmVPZHBXVmxvRDo7VExDdFtvV1k9dU1LZWtlZ0hNV3djVVdjV1RdSWh1VFZbUnBHdUxpdmd3cml5ZXFJeUhdU3NVZ2FjV0NRXXNOc19oW3NuaVpnYG9vX2R5WmxnaWhJa21GZGlRc2BBZlE/Xl5JW3R4XmFQWmhgZGlWdVxcaV1teWNeZm1mZ2JQUVo6TmdEb3RnP3NDWGtsT2BBT2ZtcWxWV1xcTU9fWkF0PGhzZ0F3V1FcXGVQa1xccWxtQWw7Plo/WW94d2RPWHFsXnBxT2dzSWtOeXJYcGtyaWg7Z2c9R3RyQWhvP2pxWHJPSEBBZEFVQ3R3ZGFnUldVQzo7Z2hfY0Z3SXBrU1tNWGBZWGdlY0tzZFBXZFpfaHJhWFZ1QnZZYkhTZWdFWUpdaWJpaHVVeVVnV0hTZWlreUlfR0hVV3BlQlxca3lzUXdiTVNwZ3JGV1R1R2RcXEV0XmtZRVtHXFw7QmZtaWpvRG5HRj08OjxqZkpeQzpWeEpIWlpAbHBocG5geXZRdj9RZklpdnhoZ1VxX0hpc2tgcENRZTo+b0FPXFxuSHRxd29PVmlobnhHV11SX3RPX2pwXmY6PlpCXUJdOm90PD5aOm9UPHM6dXdQcXB0TFFVPFM8SVlCQVpYR3d3ZnB1UXJAWXJmbmdveVtkUWU6PmJoaGJcXEh0Q1hpRndcXFNRYXJXanRHcFppXl9ndFBBb05pcDpCVVFmcFF4dm92ZmF1Y09JXVdodXVWPFtHTEtoUDtCSj1UcGlHR1FVUnlYXFxNc1VfdXBdV2NFVUh3SGdTZT1dY3g/V29JVkhDRWw/dFk/V3BtdHVbaU9hY2tjdktBdlBBVGFhYlVtUnFTWXdnc2BNYmhfVF1nRndnRWF3dVlhZVtPU3B1c1VNaVNpVXhVU2NzRmVTQnVnaGtveT9zYmRBZ1FRdTt1V0RJeE1tWWhLaFA7QmRrdXN5aVNBeEd5RHBxeXl3WEFvaFF3VnhxZzo9c01bWGVJV2FFU0k/Z0RDdFJNRltddXdnRUxzSFhJZVJxRG1baUZHdEx5U3Bbd211SEFPdk07c1tNYnRNckNZd2BdVWt5RmdVUkBZWURvQ29VeTxJeEJZSGxZVG1hZnhBSFdrRWc7SWttRmRpY2FXeVo9VHhbZGVjc1ZZdmlZdGs7Z3E/ZlVpY0tfRXdXVUZBVkhdaUdjWXZVZXNxRE1vSVFtV3JrVUU7Ql93eGR1eWBDQ1RRWHlXQ1E9UnlbVGV5WERdd15rY1dPdV9jQkdRUlFJaE9JZ0d5VUhvdnJjVEk9c1RFR2F1SDtBd1NHY2pXdHk9ck8/WUd1aWFbRztJZW5bVVlJSUJ1eVNtQ0J5dmprVU1zWU9HdHZrZWNtd1g/VHZ1Qj11ZVdvRFZfZEl5SW9NUklreD5ZQ0ZHeVNTck1dWWhLd1RRRVxcd3dPZUJHeVZlV0VoW3R5WXhjPXRCcVZ0cXJ5RUlzQ0Ria1I/VXlySWdpc0V1ZXNxeXd5SGtseXFTZFFIcFhkaXZWQXZKSUpReHR4UG5HZFRZQVBubW9vbUpTcVNKdVN2dW1vVHBdTHhhRU5maFBxeVZvaFlteHdmYVh0YWtEcVRtTG5wXXNYWHRWWWtFYG9nQFlDQHBtTFVzTHVuVFNWTE1nYE5IdVZyQE1NeVVTUHI6TEtkVXlNR3dPaXRJYHFPUHhAYGRIR2dDZ2NzcHJtSGs8Xlpnb2hNXmNPb2A+Z25OZm1KUGROaWZJcXg9X21DcHdOcV48cW14SV11b3htd2RhSGtzXmBnTmRmaFpGV11sZ3RqTmVzTnJFRmxfeWVqd3BJV3hxeWhQVmZ0WWR3cGd3QWVBb2pgUT1lZE0/dlNtaV5xUmlVSW9zc0NtSGNZUlFdQ1JtVzpndEldZ0RdaGhPd1VbY2ZxdlNvWTxPWUhNd2FLV2dPdWpDd2E7WF9LVUB3YlRRSElBU29jSVlMUlxccHA9aVhdSXFBZHVnVVJgVWxtcHR2aHJYdFFkWXdIXU9QZHBfXFxRSj1rUGhRZFF1ZGVOeVBNR3lNa1FRSGFuWHlSRmVUUXBWWWFNZnhNPklQYExybG1KZHVYcV9jYnh0YFdwX2Z0TnB1a3Z5PlhyclZhUkFhaXl0XWhecEZgdEl4SndqS1FzZV9nRF94XUdtcGZgWHheTkZ4SVlhUE50R3FeRUlbdHdmXFxOZVVYXmtxaUZpX1BYX0pGWG1DT0FpZndzYj1IV2FjTmFIdVtJaEV1bklZPG1nVWNzV0FlVnV5PF1ZQE94a2l0UElUcGtZW2NHeElpbmdIVjtmXVNXZXdIVlVZZ3NpWmNpc0F1TXlnWXdJUUdGZ1NCc3lTWTtSVztTc2dlSnlDWVFVVHFod291bnN5UkV5ZHVUZmVySE9ZWFVERm1ZWE9YaldHUFd1QU1TdXN4bldDWmN3Ok1ocG9mP1NEdT1VUFlHPWF4YFl2QldnUlV0QTtCTktEU1VVa3FUYTtWdkd5UnFlc09TR3FoR0NlPmdKXmVPTFhWbk1QYmhqb1R3c0h4W0VZTGBMU0hxcUhOPTxPU1R2aGxMa3lyWWF1bkxuY3VVY3ltc0lWSXFWUFxcU0NBd0dVc15lT2xEVUtUbkBJUWZpbT9QUXZ1S1pgTm5ZV3htbWBFUEp1dFxccHNFdVZFVUtuSFhydHBqdVZdSUo6RFVFUGtlRFZtdGtLcHY+aXFvbFNZcExiPUpiPE5oaVY7PEo6blxcOj5abFxcSkQ6O0JeOjxSUFFKOjxUUz1xeHBMOkxLY1l0VXRQVHlQZz1PO2FVUl10XmVPOlZkRXddeD9zPD9aU1drTHFncW9sUHBmR3ZcXGheZUp4cWxhbF9PajxYZXlwaXdXb1tXdXBoZ3VuaGZBZ2I/Z1pHbTpgbz9ncVJmXVdmd2VZd112ZUtfZ1F5b1l3bXA+b2F4WkluXVY+XVI+bDpuZkNBamZkU291PXdjaVtpZGhMd0BKYnBRPEx4ZUFNWnFyTXlQYHBtYXV4cFBcXHFhd1NZaHBVUHdHTGNmcV13UkloQ0lzQ3lEWV1Za2dmX2diX0dCbG9EU1tHcVFHWndWWG9kXFxLeFxcV1I9R1JhV3RTa0dAYXhNZXhvc2VFd1JZY1lOYUdsS0VVU0V1T2l0b2hnVXVQUXVUUUdJR3lkRVRqdVRpb1VXV2VVV2VXZ2V3Y1l0YWh2O2RbU2NFV2NsWUZ2X1hjUURPaUdkQ0JRYXlORVhXWXVnWXR2SmdJb1h1WEpNS1ZBbGF0cVF4S0l0S1VVVW1hVnV1WG5Bd0tFa1VNalBkUkxBdEpBdFhxdXg9eWpJdnF0dXZVVHhdV2R0VWlgVXNQdFF5dEFRcjtkWGdsdEp0amFcXE5jVU5YdXJTSGtuRFdzUHFoZHN4SFFybHVRcXVOdVd4ZUxASHE7WGxaaGxHdE1ZbUxERVN4ZVhMZHF1dXhoaVR1aFl3aHF3YHBeVGpmaFJYaFJnQVZKWXRZVHBlRXRGRFdTbW1YPFdfUG53cFl3UXF2PFdkTVdUPE1SPHZ1UFJjaXhuYXhGeGtJWG9NaUpAcXJAQXNUXWxXZFdCaXRTYHB0VXhrSUpRZVJ4SHFFdExoPG9BVHFxdXdgQVRTTHM/WXdPdVZdPFdtWHBtYE9HPFRRb3dcXGlzQUldSWFhWFdlVU54VD9vbVZkPmZyPk5zQmF5c2lfaG5fbGBgOm90XFx2eGJobUZOZ1tnc1tXeFNYYjxReF5GX0JXc1FxamZvbEtWYXBfd1pZczxHcVJ4cG1AdmxxZ0pocEJ5ckRAXU95b0xobWJhc2FReVRRZkt3WmVnckBvd1FRWzpeZmdOdFBwc1BwPGlXRUtXc211aFNCOjtqZ1BuPG1QV3l5UHh3QkVUQkl3UXhvP0xNOkxXSnR2W1RKOjxSV1VLTmh0ZFhRQXVsYGFqaD1KXmVPSnVUZDx5OmhYdFh1X1VKYmBNbkhOPTw6XFxUYGVQc3RXY2xYUVhvRVVXTVhwU1F1ZlRKdWhwa3B5P3RqdHRxVVFVYHRuVnRVYHRQcmhQTklRW3FseUFtXXRvWFR0VkxWVmhPWHRZb214TVxcSjptdDxkbF1cXHdtdFdYTG5cXFlzT0l2S1FqTXRWXFxwdXJNS0hWYUBPZFt5cEp5XUVoXmxpc1dZdUtAZ1dpbENfW3RZXmtmeWBudGxObF14aEVIXVBoc1tAdUZYX3hucUdhZ0huW3VhdWx5a1JPbmM/YW9hbHdYYGtoX2VOdUpYcFlAXjpOUEtHRFF3TD10bz1yaWFYPllycEtZYE1GZmF3VlN0eXlHW3lWSE92UlF3TnFGaHNSb3Nkd2tFTEl4Qz11d2d5WHNldU1YRE1GamFiaVtHPVd2a3l2RFtidkNSXT1pRWVjaWVJQFNXSUFIX1VTc2dld2FCOztkbz9SX1doaWF3bk15Rj9oT3FkXW9YT0lVRXFzPGlYaltVdkdHPTtGZUVqV2xwdWRwQ0BwYXhZQGFRXFxQbWJFck91UEphU1NQbVF4dl9MT1dMbVBEY0pxdXJPczpOX0x2dltWXklXbkBQeUhWZWl3cWFeYWtPdj5gQklkXFxHWFB1V0lpaHhzQ3RXdUBfY3hxYm9xRmFlZ3NVYz5XaGtddFFpdXVjRHlFUmlXSWJhc2B3Zz5hdmNTV215ZF1pRVNzdnNDUjpbdG8/Z0J1VGhfVXNLVlI7RVI7d2NJd2NHeElVV3NzSERRWWlTQ0NvSHFXSWJTQlZFY25pRW15U3JbY01PYm9ZVnZvWUlvVmNvSXdDZnhpQkFnc2BveU9DVE09WD9LVltjc1BzWTttZk1bYk15U1NBSWpdV3ZnSV1pWV9VSTs9Ql9bVkVnZnlndGhlaWlLRW9nVE5hSFBDVER1YklzRVA/Zk91Y1VTRVVjcz5pVnNnZkxzSUU/ZW1VZFJlYnNhd05paHJHcmlvRFNLV1ZpaXV1UG9sT0VVSmZQcjpEVVVob1dUUXBdVWs8cGJMWERdVVA+bkxecHF4cHlGeV5ZbGZ2akRGcnNIZGNnbXV2aGhYcXVYbV9BbE1QdXk+aFV4XndRd1JPXUpIZERnW0dmW0w/YGpgXWJYRztYUkFybD1TcT9YRll2b09HX3VCQGtCVFNNUFl5Q0lzYmBRVlRwPkRVRVBVYmhWT01zbEBPOkZlRU5kUD5aQkVPWWJQaVg6O3NMc3ZARUI6YF86UlBibj1JWFVVO21ob19odmF5XFxpclxcXVNzcWlnVXVoa3NHSWg+R0I6X2dnd1hMW2hLeVhpZ0RdTXNwaVNVO1V2P0JKbUduR0Y9O0I6amZeb3BneXRpaFBOWjo+bG9AX3ZwbFBwXFxvQWZIWHBrQHJocF06b3RcXEBvU1dhdVZhRVF0OkdxZm5faE5vQWZjR2djZmZbSmhwYmhgVXFwZ1dkSW5zWXhhSVF0OkdxRm9jSG9eZ2F5O15mZ05nQUh1X29uZl93SHFtd1ZzPEZiU09rVFl2QXlrZXRwaXdVSVVaO0ZlRVRlXWZGP3dkUXdMdWNxYXdTWVJWUWZuSVJlc0l2Y1h2b1R4ZWN3Y0l3W0dNW2RXc3hsP1JbaUl1YXdtV3RNWXRRdWdYZVVUTVVsRXFeVVZRWXVVWXVUUXVEUWw7RXBNbVhsTVhsQXNLWE5kPFdReW9ZdVFsTFBcXHRZU01QWlRXS3htUVV5cWRReE1TdVFTeWFzSVRZcHRUVlltZT1XYj1sZ11tTnFMTGhwbGFYTkFiRmZyXUZqdFB5PllWSXNNX0VmZ1I/P2ZHQ2lkY3lsSXlhd1N3RXllc1VkP3ZxPXVYcXV4RXdMaUZzWXNRZ2JMO1NES3Vgb2Zgd0hYQVk9b3RdPVRRUVZHa3V4cXc7R0Jnd3k/d3I8dVN2X1RDeVdNTWdVSWdjR2dDSWtdWXZdWVhtVVhgaVBSPFJrcVlsTVRCcXdUaXBFTVRQcG5dPWxvQFVNWHhhdEtkdVJYYXdTYXlEPW9UbHVndWo7eFdHPFJ3VG5HRHF0UWtUeXZYPXV1aW1pZVlLaE47PEpeZU9ESHZnSFRpYExveHlBWEtAREo6YnJrWW55WUFjaF11RmJLVzs7ZmQ/WHZvaFRfZXlTSVxcZ3lOVXlFaVNBY3Nbc0llVXVqO3k+eXhcXHdTeWVlP1dCOltWZzxycHluaWhSWXBTdkRZdVlxV2hXaURxZUx4dFFVOjxqT2RXQkFKOjxUUVFOX2hzWXFtcnV4VWFPQDxKWnBvPzxKOlZbOkJsb0Q6O0JsQko+WjpvVFo6Sjo8SlM7XlxcQHZ4Yl9vWnZtWEFxS3FxY1diS3BuRlF2Pz5abHBcXFRRdEF4XWxAXFw6Pm5wQXRAYDtaU1tCXUI9QkpCSkJOWWR5eXNaSUl0T3VmbVVsd0Q6O0I6O1JMRWRNQ2RlP0RSPz4zOlwiXHtcfQ==LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlSWpGKi0lLkJPVU5EU19IRUlHSFRHNiMkIiUhKVFGKi0lKUNISUxEUkVORzYi + + + +Additionally, a P-h-T chart with the refrigeration cycle will be plotted. + +The compressor, condenser, throttle and evaporator are analyzed separately from each other. Calculations are performed by analyzing the specific energy change aross each component with this equation (a statement of the conservation of energy), + +q - w= \316\224h + \316\224KE + \316\224PE + +where + +w is the work done by the component +\316\224KE and \316\224PE are the changes in kinetic and potential energy +\316\224h is the change in specific enthalpy +q is the heat transferred to the system + +Thermophysical properties are provided by the open source C++ CoolProp library (coolprop.org). Once compiled and linked to Maple, CoolProp lets you access the properties of pure fluids, pseudo-pure fluids, and humid air with a function call. + +This application comes with a CoolProp DLL for 64-bit Windows. You may need to compile CoolProp on your own computing environment for a compatible library. + +While this application uses R134a as the refrigerant, you can investigate the effect of other fluids by replacing references to R134a with your preferred fluid (such as R744). +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Load the CoolProp DLL</Text-field> + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2Ji1GLDYlUShyZXN0YXJ0RicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUrZXhlY3V0YWJsZUdGNkY3RitGOkY9Rjc= + + + + + +Ensure the path to the DLL is correctly referenced by define_external() + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEmUHJvcHNGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEjOj1GJ0YyLyUmZmVuY2VHRjEvJSpzZXBhcmF0b3JHRjEvJSlzdHJldGNoeUdGMS8lKnN5bW1ldHJpY0dGMS8lKGxhcmdlb3BHRjEvJS5tb3ZhYmxlbGltaXRzR0YxLyUnYWNjZW50R0YxLyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGSS1GLDYlUTBkZWZpbmVfZXh0ZXJuYWxGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2OC1GLDYjUSFGJy1GIzYoLUY2Ni1RIidGJ0YyRjlGO0Y9Rj9GQUZDRkUvRkhRLDAuMTExMTExMWVtRicvRktRJjAuMGVtRidGK0ZZLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjItRjY2LVEiLEYnRjJGOS9GPFEldHJ1ZUYnRj1GP0ZBRkNGRS9GSEZpbi9GS1EsMC4zMzMzMzMzZW1GJy1GIzYpLUYsNiVRJExJQkYnRi9GMi1GNjYtUSI9RidGMkY5RjtGPUY/RkFGQ0ZFRkdGSi1JI21zR0YkNiNRNWM6XFxDb29sUHJvcF94NjQuZGxsRidGVEZqbkZdb0YyRl9vLUYjNilGVC1GIzYoRlktRiw2JVEnT3V0cHV0RidGL0YyRllGam5GXW9GMi1GNjYtUSM6OkYnRjJGOUY7Rj1GP0ZBRkNGRUZkb0Zobi1GLDYlUSdzdHJpbmdGJ0YvRjJGam5GXW9GMkZfby1GIzYpRlQtRiM2KEZZLUYsNiVRJEluMUYnRi9GMkZZRmpuRl1vRjJGanAtRiw2JVElY2hhckYnRi9GMkZqbkZdb0YyRl9vLUYjNilGVC1GIzYoRlktRiw2JVElVmFsMUYnRi9GMkZZRmpuRl1vRjJGanAtRlA2JC1JJW1zdWJHRiQ2JS1GLDYlUSZmbG9hdEYnRi9GMi1GIzYmLUkjbW5HRiQ2JFEiOEYnRjJGam5GXW9GMi8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnRjJGam5GXW9GMkZfby1GIzYpRlQtRiM2KEZZLUYsNiVRJEluMkYnRi9GMkZZRmpuRl1vRjJGanBGZ3FGam5GXW9GMkZfby1GIzYpRlQtRiM2KEZZLUYsNiVRJVZhbDJGJ0YvRjJGWUZqbkZdb0YyRmpwRmFyRmpuRl1vRjJGX28tRiM2KUZULUYjNihGWS1GLDYlUSZGbHVpZEYnRi9GMkZZRmpuRl1vRjJGanBGXXFGam5GXW9GMkZfby1GIzYoLUYsNiVRJ1JFVFVSTkYnRi9GMkZqcEZhckZqbkZdb0YyRlRGam5GXW9GMkYyLUY2Ni1RIjpGJ0YyRjlGO0Y9Rj9GQUZDRkVGR0ZKRlRGam5GXW9GMg== + + + + + +Valid calling sequences for Props() are documented at coolprop.org + + +
    + +
    +<Text-field style="Heading 1" layout="Heading 1">Compressor</Text-field> + + +Consider the energy flows in the compressor. For an adiabatic process, q = 0. Also \316\224KE = 0 and \316\224PE = 0. Hence -w = \316\224h + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5Cc3J0S2I6YndBVWVZWlE+XFxDX2I7X2RyT3VnaW15P2tVZmR1eHJhZnBQUWVucF9wYGx0QF9ocHVeZ3VoSG5XWV9ReGxwVl9uV19iZmNQP3dcXE5wZ3ldPHFkREhjZVlfXk5qVU9fPk5xP2hqZWdlPmF2SXZ3Z09eUXBoW3hpbkh2P29oaW5gY055eHBwP3BnZj5faVh1UWhodXhwQ2doZ1B0aFdjeV9fT093VE9rc3hzRkljSG9eQ2FzZmFmcUZzRmFeWXlfRVFgc0ZhU0htRmFpbGFtYWFtc29tbV9nU2BjQD9qWlZfYkdbaEZaPj5lWz5balBlQVdwbVhwckBbOmh0PE5tVVhtVVFwX1dbd3lyX0RlR3VvPXdKSWZrSXhrTXlJV1M7O1VHcVdQdUNYW0lCVUVueUVAaURqT2VXYWdIYXNGQXRAY3lBR1g/W2dQO0hlX1Nqa2c6Z3Q8a1ZPR0NAaURqcGpTZWprZUpmcGxrVG9qbG9PXFx0TF1VPFBzZEV5bGl2dXl4aXluR1hKQWxLalBMcFFsRElYa29kbUdncXF3V2FnPVhydD5gaj5qRVFacWI6U0c+Q0JQPVs8P2pPTkpRQzs9Yk9LQmY/RD47VVs7Q2pPUjpnRDw/QmVbOjtoPD1EWmViWkJQPUM8PmRLUF1uZm9fV2JBd3J5cHNZeG9acVtReWdSQWh4X2lWXmE7bnREWWtCZ2NZR3FNR3JXTnVVeGQ8bl5ySFpKXlpSR25kQF9XbnduSHlMPmg9TndOR1tZaHNNZnZpYGVbYHRSeHVYWHFpcWs6T2xPVmldSW1CWGlLeWJjTnVFUHU7TnNndmU+eWg+Xm9QWWRocXRFQGFyTmE/RnhYb152b2tDQWZgVmxlZnhub3BpPndIdmxcXFBsaWZoPl5qSk9fXW53Tl9vS1hhOkdxX1lrcnFraldaZmBfdXhhYmlcXExYbGNOdW53YnJId0xobGg+W093Y05gZ1NfdVVfdFZ3W0xHd2pvXFxSdmh5P3NPYGtXQGNReGV4QG9pQVtFUXVicFs+UGVtYWNOeWZeUHM/Zm5jSHNeQHZGTmhVcWZpZ2hgR1pkVnBWcW9jcXFEb3BSV3Q+cGxbUUVndGY9eUtjWVhBaVU9R2tPYl9nZkZTckJRQnVJUlFzRj5DcmNTR2pdaHVfYlJpcm5NVWJzZ1Y9WFVZc19jVHBpRT9RU3NzVUFNeWNJeXRdSGplQmZvdkpddF1VY2RHVVFfWHJ3R0pfeEB5clZxdHNRSVFTcldvZTpXaGJZZWJbWUFVaXldR11XRXk9cmRNaEhrZFpvdEdLVHZ1VFlXRVpfd3JraHRjQl9zaDpxR053VGhfeU1ZQz47Z0V5dWVBdGttVmx1b3JsU0pZS1loWDtNeWt5cXRVUXFpeU1oV3lIeHFgeEF4b1JcXHZOUHRHbVRrTXlQRHZAXFxMVUlQS2lPWj1ZT1hVaGB5TVl3eUBvXVhzaURsRG1KUmhQVEx2ZUBNQFVKUExuaUxqV3h5cXl0ZXRYTGF4cWx4O1lLQXVVaWl5blFsO11uQE1vTHF5VVlxdWVVQ0FySm1YcnFRa1xcUlhwUkpdSmVgdWxldGh0eVJddVVgS3JcXHh5dE1KdFhDSHQ6aGpjaWw7WU9zVFR0YXNVeVl3VVZZcW9ORHJ0eVdvWFF4YHRjUGx1TFlFbE1FdWx1VEtMcXVScVk+XW1gZFdzaHVFaFZobWtTRVFfUW9sdVJMRW5DYHdyQXBURHQ9SW5SWE51WFNRPU9eaUxuZE9laG9rdFQ/cXBTYVdfZUpsYG1TWXFsdWxaaHZDPHVVeFRQZFVDTVE+VHU6UXFdaWxMXFx1OmRVSFl3YXRSP2hNVXVVO2lsOlxcb2B0dF9YTnhpWXlhWV15Vz14T1tRZGZwdlBJbXd4eXg+X3Y/eEl4W1tvZDtWb1NJY1dHcWVBd1V4eW15cWl3YUdYZzs+ZWc+YmRpbGpxZlZXW20/Wz13ZFRnbWRGYnJecWVIeWpvb2J5XztJcHl4d3ZvWlFwWmpQbUd3c3ZoXXVQeHByOnNQPkRKUD9mP0RqQE5uPXBmVG5cXEBYSGFtUj1vQ2VubFhVX1l5Sz1LQEhWO3BPZERVb1BPO1lQXFx5Vj5sWURldEd4Sz1cXG9gRGxSTE9peVRyaHlMRVJfTXBVVXRbcXFSdVdkVFBgdXNYXFxuaVxcdWd0dUlgbEI8d2xlTm9xdFFNeWM8U0NEa0tQb2FNUDppS2pkb2RkbFdRU3l4SkhUbXV4bmJ1UVxcTXNGQExEbHhkaW9pQFZcXHV2SUlLPmhWP1BzSVVXY0RTdlxcU0ZEa15IeVd0TlxcTXlkWU9TZFRvYVJAPHJUQW1YaHdcXFBwVWVWeDxXO0xzXFxxV3dIckZoVUJVd2V4VV5Ab0FJTk5hbnN5SmZwVDxlWEtIdWdoSkhIcEdxbD88bHNPZGhncW9ZY15pWz9wXjxGaltganlwZHJwYGJeb0loYG9mZHBPbERPdVtndFRQeURuZnFQcV1GaGlfdG1ObEJAcVdJZUk+cnh2a1lhc2VZX3ZYdURRcExvXFxrdm9LSHdbZ21XaE15WXlpeWdZdXF3WG9lWFNjQmVhd2dZdVBJWERVZ0xndVQ/RUNPQ0NFcltVQ2pRZF5jaWJzWHJJR1V3ZF9BeG9vVmQ9VlhVV0dTdzpBcjpBeXJBeWJBd2JJZj11YlBxZ1dVdU1ZdE15dFF5aGtVdkBdSHBRd15vR0hTQmw9UnVhYlthZ2NZZHNzaWxtc19fRmJxVWB1RU9Rd2VVRVlld2NfVGZLQ2VJYj1zQnJxeEZhc0ZJRkNlR2djR0ZPdUhvY0g7SGRzd05lVFpTaU9xd0lLSWdFWUVLSWlbeV9xdGlbc1xcZWdkd0hKVXdmcVRYV3hDPWJIdVNJdUR3V1M/X2JmcWNXU0lUUXVUYWdIU0VsV1VleWY9Z3hdeWN5S2R5O0RDX1JAbVJAPXM+UWg8TXJxQWJeS2JPX2VUUXlab0Rkd2JLQUJkXXh5WVVMSXdNeWZJd0V5a0dhb1hkTVdER1RFZVhCcXRMV2Q6bVJRc1hFO2hUc2doQ1M+ZXdDWWRhQ0VvV2htV2hmaWdrRVNpcWl1cUdLVXdtSXlCT1VkcWRbcWg7a1RdaWhPTXRbWXJBR2NRSXRLSXRddXJIZ3NHaXNrTVdxQVNcXFtnQ1lSOmNoOmd0Zkt3S19ScG9kS1VTeUlJb3dmX0NEb19UW1V1cGdXbnlpY09XPUt4SjtWT1lnX1lzUXd3Sl9SXk9kT2dWTlF4cXVSXmNpc3F2VV9yZVNob19UWXNYTjtoVHNTZ3FTQ112RVFEWl92UVFkcVVVPmVHT0l2cG9ETlFCUFV2P2VHeFNmcG1WYG1iS1VTaENCdVVjU3VVTFNoQWFjVF11Wj1yZF1pYndYb1dVTFNmcEtEQ19jYXF0c2lGZHVjQk1GbEdlQT9SV29IVklXOlFXXFxLV2F3ZmFHY1RJdltJVkhlR3NhQ0ZPVVBbYlpdV2JhQz47VW1RV2NFV0M7U1RPZVRPRmE9YnZbQlRBVmlFeFpbQlxcb2R2W0I+Q05mcFZLVVVVVXU6YE48aGxGZE87WHM9QExCUHVKYE5QTFFdWXhzQXhydExqUG0/UHV5YWw+bWs7RFRFbVM8dG5QcFBSZHBCTFI6XFxfX3BbQ3ddeV95a3BiSk5aO1FzPG5xSl5KcG5KdEs8PVZOUWxBQHI9QExCdndFT2JiYVtaZ2BjZnB2SWhoR2diYVs8QFxcOlZvc2ByPEBcXEh2XXhec1l2dlBwWls+XFxvYHNQUV5CRlpqUG08X2FCRmpBXmlreXBSZnBmPls7Rm5tPmpPYV9cXElubU5oSUZqeVhzPEBcXF5JWlk/Wzw/WmZwckV4Wls+bGlWc1hGYGJuWls+YGRHW2hfZWs+cmRPW2Rndjs/W0RgdERpZ2dub1I+Zm9uZXRPako+a2ZPcGxAWzw/OkdVPlliSjtjVE1IZV9SZ3NDPD1GZEVZSktCaFtUP2l4OkFyOkFSZ3NjQXlGcz9na0lYZV92W1tpclF2RXd3dld4SENVTWl0ZXdUWVVpcGV3QGljVVt3Z3d1eFV5R3d0W094b09kRkFYSHl4aXl1WU1oXkVDWmVXcjtVcz9jTk1XcUljVE14U3VFeD15W014aEV5XWtCbFlXSWlldXNEQ19SQkFCTUVGW1NTT2dDdmN0aXVpd3FYT1FnT1VTUW9HP1tnR0tDZV91aWd1dGdYZUNZQltSZ2dzYFV5X3lkWT1pQ2dGTHVzVkdJbUlzYXNlSnVER19DakdUTnFmTEVHdEtJU1l5X1VzUEdCUHFiQGdUSGV3ZXdneE95WFlZaUlkP2lGVVVHYW9kUkVWTnFjSG9jTGd1X09lb1NZPkFSYUFYX1FzT0t4PmtnWXVpSHVCdz13W3diSklyPE94TElJeXVycXV1d3VUX1dEcldZcXF3Z1dVcW9WX0NEYF91bWVmPVVJV29zQXlFeV1FUGdoS2lHZUVnZnFYdUN5QFN5cGl3XVtIQ3F0SGVTR0VYbm1kaXNVSF1GT21YbldjcG1TaFdIb0t5eVt5allCO1FTQnF5c3l2WU94RENlRm1idG1Zbj13QW1Fc11CUGdETG1US2F5V1tHS0dieFVyT095b1FEYHdkaXNVYHNyXT9jSGVSS3dJWkVmS21IOlFXRj9ZSktidktWYEV4XFw7eUxJd25paXV1eG5hVFhFaWxlRnNNQmpJVVtPVUVfQ2RDaVBbWVp3WFhFVGV5aXhleXRVV0dHaTxrdHQ9dFZhdVZhcj5hQlk7WEpVdERnRGU7c3NlVnBlZWZNZ19xUlVlU25NaT9TU0lfVHlFRkpRaUtDeEFlVXVlaGB3ZWZ1dl1JSUtTZmF3U1lvRkBFZ013Vj9BdkBpZmBLQk8/QkdBaXNZd0hBWEdvRGZHaHRVd0ltSE9FZE5Nd3NjSHFzSE1XVlQ9WHlnR0VNZ1M9Vkc9eUR3VGRnWEFNSGpXZ3RdUnhNR2VFdV9RVW1vVkdZaElxSWU/U15VWXVVaT9vcmRfU0JTZ3JfRk13SGhvVj9lRFFJSGFVU0JYS1hsdnI8VHN1eT9hV29EeUxwTmZFbVZAdl5Yak9VdmlFdEF5SlVZdndIUElkWTx4TGRgT1JwT3FxU1JldUxRTE9ZbGZkUURlTm9VUkxgcV5leGRpdGdkT2dMTXJMVWVJX21JclRwcXJGXnJQaVdOd15QYV1JXWNHX0JHXFxMVmV4Z2xtQW9hX15obm9fYV5QVmlmR2VhTm5eZ3NrYWY6SWBSTmNfT2BGPm92UXdcXEdzOnhyU3hodU5bSV5eeEBmWD9rclBsaGFad19hSUllY0drUEljUGZdX1BSWHFbcHhXUHlGZXhXYE1gbXdLWGs+QWxyQFdjbXNASWtFWWpDRHRLYEppWWpreFA+aVZAWUtYXUxoSFFoaWthRXNPcHQ7dU93QVFdaXc+XU9jUUtvWXNQXVNJbXJIXW5jVW9PSU9qaG9WUFNFXVhXYFZfaVhhcXNXbHV3eW5QdHk/eExYPW91YVBAVUxSbVRjcXhFYFlTXFx1VVBOVVxcT1VdTUxAUU10U0NgbWFBcWlUcUBITWVNc0VNU0ZMUVdZd1F5b21NVGdYdWFNcFZ4c2RMVT1ldD9hV2Vddmk9S2RZd3FpdlA8U19wSlhJdGNcXFZzZWxPYGpGSFlCXFxydGlURXFsZ1RXSkxUR1F2QDxxdVlSaEBvQXF2RT1zV0FSa2luQkhYTllsZXRWPXBKd2lWXFxkTW9hWEBYdHNwblg9WHBQT1R5V3V1WGlYT1M8TUQ9V2dBc0txd0xdT2NxbzpJU2g8UmZNUEhwcHBwcEBJU0F0UEFBUWVAcTppWXFkWE1NWGU8U2BZcU5hdGBRS3BgdWxpbkVMd0xVWV1JckNhd0hoVWRUT1tYcG08U0NMeE08VmE9VHJwUnRAcXZkWERgb2NFVkNkbUpRbklNWDtMeV15a3lsdGZIVV1Fd1hpWXNQUGZld1BRbVZ0VGZ5bkltSkdleWZcXHNgVHl3XWxfeGt4THliXFxNSHRVeGBZc0VQQXVXY0VXU3lxeXV5SGltdUR2QDxST11UZGRsVF1OY1Bqbjx5b3hWSXFNcmFvSmVYb1l3aXhxUD10cWlKZnBuamlqZWlQWGxyX1FYT2RRcXlyYj1KXk1Udzx5WllqaHVwVTxwPG1MSmltdXRYcGRXVGFwZGV0ZDxyRERtV3VReWF5bVFrT1RPdnFZeWR5QVxcb0pIbz9xdGpBVXVwWGdZVWllcW9AbXdhd1hpcVVRT1lFdW5EbTxMVHZkVVNUcmNhT0I9VGl1eGNQdT1sb19pbUdQbkRpTXJtcWpFdjxJdW14VmNVdnN5dll4eVxcWWtpbFBpbXVmZXJDbVRmQFdTVXRbSXJieFByQHBBdFFcXFluU0V5XVB1ZGBtWGFRQUBsWDxNSWBOZEVZQ1FVVVVVc1hKamRRd2R5c3l2WXhUZD1QRTxwZFVyak1OUGB4cEFtY1hXRW1ubGBvWUZgckBucGBweD54OllaZXl0aXh2aXZnWGFxc0l1YXdtV09xbkdvSEhmV09nUG5kb05yW3B2XWFyeW5sY1BoVnBtSFhiQkhqSEhqVF5qSEhzb2F1bXdzd3d5d0VxO2dxcXdXWXlkWWdpb3NZd0l5R1dNcWZha2VyTUJqb1Q/RWdDYWZaYUNUWUNXXVM/X0NNX1lrV0deU0NGWUduPUVPbUlVV2dSPWVZUWZSdWVRP1NrR0d2O2Y/RXhKQ3ldO2NLS1Y9d0RNUWJ1b1hbRWleYWZoZXV0Z1huXVhObWVqO1Nga2RWTWJQb2RQc2I9SVRhVXdISWU7a3RcXD9JTWFXYT1HPVlkZ19Zd0tESkN3anVlUktkaWNXRT14QmtVb29jTkVzYWVSP2VJX0d5Z0tzb0lzSG9oZG94Uk9jTT9VdkVjdmVnVHlySndIb2NId194TFlTYXNTWF9HZHNlUF9SSGV3TXlTeWNpaGV1dE95UmtjV01WTFNyVF10YFF4VXlHQF9jSF1VRlVDP0VlYUtUbEFjRFVZZz94U2FnS1tHR3lXS1FnaUd2bD94cmVUcV1mRnljUUVSSWVJb2F0RXlHeV9ncltEanV4aGl1RXNEaDtkaVN5Y3lmWW9lckNYXFxZZWltaVtzZnBRd09ZZ3RzdlFLYl9ldHM7dE47cz1bd2RpVG5pRERBeWZlQmVZd3ZjY1RRY1RXeUF1RXddeEV5R3lfdFI7RHJPRmNfaHZFZD1haEdvQmVfVkxfZFVHVWNpVEZ3dERnc11ZRGRnWVBFcmlBRFZPeWV5RFlfZ2xJV1JTY2tjSG55Z3dveFRJdW13VmVBWTo9ckZrVzpzc1JbVFJDUlRLdlB1U1hvVGRrdj11UmFpRXdNRURbRHJ3RD9HeWdjZl1jVj9peE9XdW5Rcj47RUN5Vk9neTxbQ09DWTxbdnlPRGxnc0dpc1JLaWRvZmNldlBRc2h5RUhjclZDdV5DRGRpeHVlYlJtc3lbUz8/Z2FdRl9nZHRVdmM/dFpXVmxfdF9lVHNhZ25RSFhZRUVxdmlvdmxZVU5Zd0VXZnZxQ2NjdW8/WVBpR2xVWF1ZZHZDYz9vdW91dkdTZ3E7V3ZBVWtDZVJxb1dhdHVQU19QVGxJaz9MdzptdkJVV2tAUnRJa1h0VXNFTllFbmRIWXhcXHQ7UXljeW5ZQG9JaFhtcXZHZXB0PHhTVXNvXUpiaFdnaHhCUFk/SFVPdG07aUpHcVh0WU9QXW9SdU5DcHBpcFV3UFlnUXVvWFVxcFd3cXl1eXdxbFdWQXBcXEFqOkhTQFVKPkl0XlR1Wj1xWWlXS0lZPUR1ZmBPYHB5Y2hRW0RLeFRXX1xcVmdJWT1kcmN1Tz48bztsUj08TkI8cFRwVXZlVWc9c0xtVzpVTmNNV2RNd1JJcF11ckl4TWFVc2N1UXNhdk1wWHVsdnJxSmZwVkxheG5heEtYTkE9UV1gVXF5d1l5UW9Nd05sb0k8Vm9kSl1YTl1UTj1Zcj1pbkdwWU1VVE11U0l1c3BucFtRXztuZF1mYG1WYD1BXXd2aGhhZUtZZWZncnBOZk5AYz9pajxeb0BWYERnZ3dJd015bkVHXV9vaE5weXFuc3ZmbDpodG5PbVdobV9XZ2tQdHlRdHFHa0hpd1V5cD1IZDpRZ15wdmBxdlJoXU9XZk5IdUtRcVlod1k+cFRobUtvZkFXY2FHdmVRd2RRZnBfdDxXW0hXWlBRYU52ZXFncU5IdEdYXXFueG9peDtIZDpRZ0RSdHlTeEdXS1lVV2NFV1tjS1FJRWVGP1tnUFNEb0F3U3dJRHFGUE9kZWdnZ2djUmN1a1dWQTtFP1tnQE1Xdl1ZdktEQz9na0tTeEFHa0tTVTtpSj1iT0FTQHViQXdiQ0d0TGFXSktIWV90Sll5dm1JaktDUmVjTlNDZUNGRlVTU2NmaE9EU0NUZG13Q0lIP2liPFtnQEdTZ1tnPkdIRHFia1lpdE9pOj9DWmVITEdUZ0FoTEtoXT9WTjtoVENHcEFzWE9pR01FW3dTQlNHO1tnQFlIZGdFUE1SWEVHcjxVR1RsQD1VQ0xSWUBKZUhPbnRQcXRSd1FZR0B0YVxcak9ASlBVdlNkdEhUT1t1az1FcmI8RmNjak9EPm9JO2tUTUNIZEdEUE1Sd21Gaks7b1JSRUM8dWU6U2djW1hoYXVza3hCcUVbZU5lSFNfaE1QTXJYRHU9SFQ6UVdeYFA8UVNSPXdNTHJEc05bY2RdYk8/RF1XRXFrVz5pQz1bZ0BHO21FdGFSd29ZRk9kPG1iO1FZYkF0W2NlW2VGbVVYbVVVcF9Xc1F5ZXlna2FYTjtQQFVZcGF3S3hxTkFtS3VqanBOYEh3eT1OSjxyR1RKZnBqY211alBMbFRvQXRLWFxcbkdMeXlYWXFxV1J0VDpRVXVkVmxETWRRUmdYVXFwa0F4dmNVeEFtSk9oS2lQdHk9TVE9YlBRZ2VXZ3VoaXVxcFhwW012YGVgY2pub0duX11vbmN3dFNpcGFxZk9Ia1N2ZFZZYDpRZ3RmXFxTaGRoX2VFV1pmQF46UWdqUGtGUV9GWF9eb3VSQVpsaWNxeXdZeWNVdjpzQlJseExsUWU8Vm9kbWJ4Tz9xUHJcXG89VEo9PHFbPVg9PE5CZmpaPnJERlpQP1s8d1plUHFEd2p1Zl07YGZDR3BlXmxUVnNoSFtZQHhTYWFLd2d2Vlxca3dkXkFebGhhQ1dpUE9hYGBxeGB3Rl92THZhZT54V2dkWmFdO1Zvc2lmcXlrX195RHZwWUdcXGFoamNGdm1fY0BWYExRYG1RXj9wbUhxaFNuaUReal9YcndHcFhhRHRzWEBSWT1xVUVLUUV5SUVyTWROYEhSZFVOdUhKQ3RtPkRSVllxcmh1clhOVnhSdXhRYmlMTFhsY0h5eHVRVmxTcXVzdmV4Y3luSjxMTmhvaVxcVGFtbG9tTURRUExsS1RcXG5OUFVYUVNwcHJjQXhaXWxwPXdQYVBkYFg6PWxUQXhqUHc9SVFsQE9yUW5YVFVuYHJxZGxzYW9UPXdBZVFIREpHeVlfPFZXQXRLSXhpWHhhWW93TUxleVBmPVFZTWxZUVZYcXNWdVVaRGdZcl8/Z0U/WXRLST9fR2lnQkhfaEdxZkBbZ3FbRFQ/Qz5rYkxrWVpRaUI9VUNfdG5pZHVjVGl5RW9zZ25rdGVndGlxQl5lZUVlVmpfUmFtSFpJY1c/U3VZQ1VdWHFdRmhpY3RtUkxDRHFPdEFRVXdZcls/VUt1Y0dLYlU7aEJ1SFpzSHBfZkdhZG1naFZddkJxQkF5RmdtRUF3Z09TclBlY3dLRUpFVHVZVVxcPVhjX3RRP2RJW0lCa3VYX3dqcVRhPUlXPXZecXhyZ0h5PUhrdUdzd2dzaVk7ZWNiRVVfaWN2X3RJS1hnW1ZCP1NcXGlTUFlkRGlYYF91d0lmO3ViR3FkaUtzVGdVbEFDVm9IQWdHWndZakVyV0NTP29GWmlDYkVzUEdkQGtYTnV1cEd1ZFV2bU9XVm9iZ3NyPG94Y09SalVCWjtDak9SSjtWPz9CZVtCO2tUQktna1tnYW14aF9ocVN5SUF2RE9ST1VUP21qeEVMZm1Zd0FNaGhOXm1ZRVFZYHV3ZXlyeFl2PXhZVmRZTXRUTUxQdWhWV2F5W2lNa0lxXFx5VHhdVUc9S1dcXE9CTEpmcHJEXUttZVJeUVNnWFFSbXZKcHNCYVlCbGxPQVltZE4/ZVJhXVJfUHVBdHZrQFVPdGBaZ15bR2VvWW1PWWtNTmpleHBVaHJQSXV3WWZLXnVUP3JkQG5tVmlRb3d0Tm1XcXVPYWlSP1xceFFcXFZWeXVxc2FPZ3VpYWZpb0hHXmNgbENhZHRmYD92X0tQZk1ncmx2Wk9gY0Bmdm1nQ013O0t1VFtXSXd4QGFJTmVlQUVyZEl1W1dVb01TRl9Za1dHTktYZD11Y3VzPl9HZnFIeU1TRFdpX09yeENWcjtJY0FWO1dpZENVRUd5dFFjWVlnaztWT3NiaG9Jblt5RT9odnNGS3NEU2l2SVVIRFNIc1dVXkl4b0F0d1F4SWdWVFVDYFFyQlVnaXFIUzt4clN2U2lFTkdoPUVES0t5VkFVaG1TRm9zal9YSEV1XlVSY09lPjtmWl9JVUdickN0Ol1kYVFYQ0diWWF4X191ZHNSSXFlYVdWSl1YPF93ZlNXS2dGQmFEVm9iUnV1QHlTaz93dUVyYWVnc2tnXFxXaVRLWEtpWUVJeUlPVjxHR3FjaEhvWFE/SGtFSFdtdlhlaWtFaWdvdHFXcm5JY1JNdE9Ld1Fnc0NHZF5LeERPc19fUlBjdGlRdEl1dT1NeUZteE1NZEFXZm9dWGldWUZ3dmI7RGNZRm5peU1TUlxceUddc3g7a2RyU0hMP1R2cVVqSVVHP2RydUl1Z1I9T0hSa3dxVXlnaXJtP1ZzT1llO0lgQWZzV1JreUZdc1VAQ3Nla1NCUUhTX0RWR1JXZVdoZ2l1d3RPO2RmVWdaQ2h0W1dpU3diWHBUbUpSRXdAdUxxcHJMWW9SZUpCZXRxWFJfdFVqZFNAQVBAbXJKaVdReVNldXBKVFN0VWpdbVh3eVJhZVlHdWpaXFxualxcWF9tcztBamp1VnhddkJdV3hBeUJBUnhYdGxcXFRudHNabXFHZEx1dVZzcEpMTXNKZXRxTFVfUHE9RUxuRHBxeG5SWUtGaVBoUXZWSFJUaVc+QHd3XFxLR0RMZVBTc0VwP3lSSVBZbEh1blBuUUFyTElyX3RzUXhORlFwc3RxdGlvdlxceVZ1TlBoVEZhcXFJeEZRUmhldFJheEtscGZ1TXNcXHZPTFZsdG1KSU5vXFx0THVYQV14YWFXZnBtcWxPYERtSE1vV2xSYXFLd1lWY0RubXRtb1FtZUlrRUhNZmB0d0lsdllKa0FSPVBXQUxzb1VwdmxNU2FSP013QXVscHVMVmBzWDxsSW1SPm1Vdl1VakhPR2VXXmVTW1Rxb3BRVGlMU0F0VWV5RERwOzxMWmVaakllW2ZeSWhxW15dXj5lUD9vWF9fZVlmR2dDa3ZdX1lGdXVcXEN1SjtWT1F0Zml3VUFpQD1EVkFCQktCZj9EWmViWjtyREBKZVxcSlJFTkI8QDtwOlRfPF5vSmpKPFY/QG5UPHM8RHhmeG5IZW08aVk8YG87VFdRdVRRbHdNXFxKcV5aUkNkT2J4eUVuRWhKY3djR0Y8S0Y6PEo6YG5cXHROXFx0VFs8UDs7MTpcIlx7XH0=LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlIUcjRiotJS5CT1VORFNfSEVJR0hURzYjJCIlXUJGKi0lKUNISUxEUkVORzYi + + + + + +Therefore the enthalpy at points 1 and 2 are (in kJ kg-1) + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYtLUkjbWlHRiQ2JVEjaDFGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEmUHJvcHNGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2Mi1GLDYjUSFGJy1JI21zR0YkNiNRIkhGJy1GNjYtUSIsRidGMkY5L0Y8USV0cnVlRidGPUY/RkFGQ0ZFL0ZIUSYwLjBlbUYnL0ZLUSwwLjMzMzMzMzNlbUYnLUZYNiNRIlRGJ0Zlbi1JI21uR0YkNiRRJDI1M0YnRjJGZW4tRlg2I1EiUUYnRmVuLUZibzYkUSIxRidGMkZlbi1GWDYjUSZSMTM0YUYnRlQvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjFGMkYyRlQtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGW28vJSZkZXB0aEdGaHAvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmRwNiZGZnBGaXBGW3EvRl5xUSVhdXRvRidGVEZecEZhcEYyLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2JVEjaDJGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEmUHJvcHNGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2Mi1GLDYjUSFGJy1JI21zR0YkNiNRIkhGJy1GNjYtUSIsRidGMkY5L0Y8USV0cnVlRidGPUY/RkFGQ0ZFL0ZIUSYwLjBlbUYnL0ZLUSwwLjMzMzMzMzNlbUYnLUZYNiNRIlRGJ0Zlbi1JI21uR0YkNiRRJDM0M0YnRjJGZW4tRlg2I1EiUEYnRmVuLUZibzYkUSUxMDAwRidGMkZlbi1GWDYjUSZSMTM0YUYnRlQvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjFGMkYyRlRGXnBGYXBGMg== + + +JCIzU1FaWmVgaGtRISM6 + + +JCIzJCo0ZCg0V1UlPVghIzo= + + + + +The work done by the compressor (w) is + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2JVEvd29ya0NvbXByZXNzb3JGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEjaDFGJ0YvRjItRjY2LVEoJm1pbnVzO0YnRjJGOUY7Rj1GP0ZBRkNGRS9GSFEsMC4yMjIyMjIyZW1GJy9GS0ZTLUYsNiVRI2gyRidGL0YyLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjI= + + +JCEqJDNGUWwhIig= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEncHJlc3MxRicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZJLUYsNiVRJlByb3BzRidGL0YyLUkobWZlbmNlZEdGJDYkLUYjNjItRiw2I1EhRictSSNtc0dGJDYjUSJQRictRjY2LVEiLEYnRjJGOS9GPFEldHJ1ZUYnRj1GP0ZBRkNGRS9GSFEmMC4wZW1GJy9GS1EsMC4zMzMzMzMzZW1GJy1GWDYjUSJURidGZW4tSSNtbkdGJDYkUSQyNTNGJ0YyRmVuLUZYNiNRIlFGJ0Zlbi1GYm82JFEiMUYnRjJGZW4tRlg2I1EmUjEzNGFGJ0ZULyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjJGMkZecEZhcEYy + + +JCIzaChwd1ZHcCg9OCEjOg== + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEncHJlc3MyRicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZJLUkjbW5HRiQ2JFElMTAwMEYnRjItRjY2LVEiOkYnRjJGOUY7Rj1GP0ZBRkNGRUZHRkovJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjFGMg== + + +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Condenser</Text-field> + + +For the condenser, w = 0, \316\224KE = 0 and \316\224PE = 0. Hence q = \316\224h + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5GWm1cXHE/WzxKOlRqOmFNXUM9XVNMQ1RKY0RYb1h1dXhNS3U+dWVBSVh2eWRfdUN3Q2lYU2dRZ2d2Q2NOQ0dVcUdmU2Nec0JlcUdlcUhrQVY/d2JUUWJaVXM9cUZaWVhCXUluSXI9RWZQS0N4SXc7YXZqT1dtX0dnP0Zyb0JTVXc9a0hfSXZzPXRYS0VUWWNVdWRMUWlgS2ZhQ3dHRXheaUd1WWVTX0ZXU3VTX0ZNX1NsU2ReaXl0W0leU3g+eVVUR1NsSXNpWUltWXlHeXNNd3NhaVpXeGVrWDs7RlNDSkNBW0JvQjtTQD1CWkNFOzpKWlFQeXBwX2hsbl1yTUxTUHB3c1l2U2lwYnhUd0htRV1KdkVwRklqR2lLY3VRdmBtWXhLbHFrPDxYRU1QZFlqQ0VLZXRVOj1PW2lsRV1VRGVrXlV4ZW11PD1xV01TVmhvb1RNR1R1SXVSdlV1TUV5dkVYZT1Pak1OVVVZdUFKSkFxZE11VWRtRFRrRnFYUGVxc3BURE1vWkFYa1Vvd2V3QXR2RWVxPmV1UD92VHBhXUdpc2ByZk9kcFd5PGh2ZWFmRFFGVVlgU1Z0S0RUWXM6ZXVrPVJddE51aFlzSXlUWXVpQG12QEpaYVZsbE49bW1eSWp4dG1meG5tSXRcXHV2Sll2Y3hucTxXUnFZY3RMaWRybER2X2lQPEhcXHFnXl1nak5ZW0h5X0FYbFtobm5haWo+ZVVnYGdvdXhPYVxcWWtDQGlQUFtWPmplV29jV2dmeGRNeVpcXEdkQFdvRmdjSEljPT5wR1deQU9pYVFcXDtAYlxcdmR0WG5WPltWbnBxeGVRX2s/T3FFQGJ1V2xjT3ZDYG5VWW5JQXdHcGNvSWl2b21SZ2hfcWhnVnlkb2RjXnJxcVs6b3RvTm1WPmdpZnNTeF1bX3R1RmB1T1plWHVlQWlHcF9Db2JfcF5oP2NnYGVwaHl3WHR1Ql1jY1d3RVtdWFA/Zm5ddVllcUVFWT5FeENcXG9odW9daVB0YHFUcEpacUtHQG1ZRG5GeG1NaHFuaHZqSWpEbXNZdHFZPVNhQHZeXXVZSFN3VHNTdXVYdXRlXVhzZVBHPG5vWXdqVXBkdHBKRXNfWE5ZZVdHcVdhXVJZYVRjeHRgaVFYeVRCVU9FWHVFYXh1YXRcXFlVTj1vVlh3d1xcVjpNUDxkbUpoWFBtdkFddGtdTGZ0eGBVU0JwUVdxSllJS3lAU3dIc19ham9od1xcPHdvUE1FUHFRQW92PG9yPXM6ZXNzQXNqaHRmXU5TRGpwaXRgVXhdbHVeTEpbQFVZcXFRTVZqUU1PWFRKZFRhZU9DQUtuTW1UcXZBXXRrZVA9ZG5UbFBkcG93UHJUcVhdYW1JaHI+QHhJQHlkQHlFYXg/YXBKbXlLaHR3dFJsTEpXPFVWdWxXeE1LdXNSUGx3ZVFuZG50cHRsYHNkcVhdd2FzcW5EWFxcSlFnZk5zaGhuUGldUG93X2BfeXBbSGljPWZtU1ZrR0htWUZ2d1ZhXFx5cz5xdkRWZmxYdG1PcFp3bUxPZEZRd3BXcGBZbmVXc1thY0Z5ZHdBbmlnbkNRXVh3WndvYlpYbFJ5YHlOYllXaGVob2Nnd2JGdW9od2NuYGlgZ0VubGxmc0RxaE1HcnNhZ3ZXb2puW01hX3h2d0FZZHhQYk1weXJfYWZeb3FJXXdGaV1JYFRFbm1HZEdXOjtGUzxSX2R4WXRWVnlYdF1xQlVRYEFWTVF1O3B2ZT1MVGBrbnVvXFxJWU9Ybl5Mbm55T3JQV0luaGBWdlF3bGdxdF9na1R4Y3Bhb1c+Z1Rxa0NhZW5Xb0lZX21fZFdIWkRfXzw+Z3ZnYGd3dFRJamBmd1Jwcz93cHBhcT9AaV9Rd18/WmZZd21uZFVpd214ZmdBYndXYVNRX2BRblFPZXNWY2dxX2xHY2o/WkdhY0BXcVBxW25OZ0FhZ2hRcWxObXhQdm1RZ0xIXllAbkRwWkphdl5fcGVndzpXb2dhZHNBeWpfYXhoXFxFaHNfWG5eVz5JYmRNaXhpaD1zQ3BXWHZPZXM/d2Bzc1U9WFZVRWZzVUFpVkdHQkpfY0c7Q0ZxQkZpVXE/dVVjVGBxRnNRRkFJRWtXQlo/Zk9rdEhbSGV1cmZtR3RndGFpVHRnZFxcQ0VkbXY8YVY6S0lwd3NidXRUSWJgZ3dSX3M/dWh4YWl0SUlkYURPQVd3ZVRJeWlid1ZwVVI/R3lOS3VLT0hNZ0hFY1V5c3k8V0dEPUJnYXc6YXlFQ2lbRVdydVdvZ2lUd3JsUXN5XVlDXXVpa1NzP3g+b2h4b1dBVWlkS2Z5U0ZATUNVV0d2a3k6eVVVdXRZc3ZocUldVUVzYXhjWXR0T1ddVVY9bXlRbXVfdWU6cVhXZVVXdUZPZXl3aXk9V2I9Z3VXaXVHO1lMP3Z2bUlyd1RHZ2JdRWZEU3dLRWVRT1hlVVdfb0hBV3JcXENnaXVSU0VTO11yUXdSTEVmTmVUSXdIQltYQXd2WT1kRmdkZ2tHaGtVc09YP19IPlVmd0V5bGl2P09TdVdZb1F3T0l3Y0lXU3NkSF14bVNXV3dZW2dIanNmPlFVTnl4ZmNUV1l2SWtYQWVFWXdZO01IUD13ZGtjR2djZ19nZj9oZTt0dnVIaF11Uk1VVE1ZckF4W0FyOkFSPW1lWm9zb1dCR3F2TT1HR3FiYU94WEVkZW93a1l5cldWeGlCQ0FVSEl5bXl2RXVJWmlJd2NJXVdmXU9oRklkP3FjdmdzSEliZ3FYcXVYcXNIcXN0UXl0WW9Jd01HaT1zZ3NnWXVpUHdFPGllV2dlQFt4VlN3WFVJSkFZeGNiUD1TYVViT3FJeEFCcV1zeT9GU2NTV1lpcXVzc1FpQGNlXldpdVdZQmVYZ1F1b0N1W11lU0dlS2d4b1l5cXl3aV9Vc09YcXF3V1VpZWtWVXN0SFt0R3lmYltETGl2ZUF2UDtleUVSbEtleFFZRXljXUVHUHNnWXVpSHFJO1VIQ3lTV19DREljQ0dDZ3lSdEtEQz91UlVUcWtXZ0FyblFUTF1WPnF1UkdJW0tIbHFjT0lkcWtHUndZO15jcHFcXF95c29gcUtZdVVZX3VXa2ZBXFxudnVyQXlyWW5Bd2tuWHJWeXhpeXVxWF9TZndTZl5ieF0+WG55PmZjeFtPZ2hecWNbX3RISHVdWXNxV189R2xbd2psSGxeX2BwSHBrSG5XQXFqR3Y8ZmJuXm1MZmtAZ3BeX2VZd2VxeG4/V3FQcVtuUGFZUG5PcXZZP2BMWXVSSXdNeW5vWGpGeGNYYGFTbl1YbmZBQHJLVnF1WHFBb2tWRmxxbltZbmF2SXhdeWJwP2NNQXA8b2xrUHRJX3haQXZaVmk9bmNjZltwcWZyZl9DQXdETnU7b2JneXBUaHE7PmxGREpfYzpcXE5dajo8QjtqQnROY3RMQTxWW0BLblhtVHl2OmFPaGxPRGRYPFRMdURwb1BYZnV3VEVKSGRVQW1NYnVzXl1sU0BRbVRQbXF5d1lZYFxcTHFwVWRMc25cXE9YTXRTbXVJXFxOUkV5YGhqS1lRa1VTbGxsbERsV3R0PEhxUkxTeGVZdzxUV2lWaUl0dEVtQnV3PmlMQ0FXUkhrbUxPcE1WRV1KXVFsbEVYTVRweEluW1FXbE1zQGl3Y2hWS0x0ZHlXPWlSWmF5a0FZWWV3Z0F3ZVV5PHFWPXFMXll2YHVTYlRrREBzeVl2SXhYcHVQUXB1Q1hVTEhUeHhKYXhTWXB2V0BXZ0VxcVRVPHlRXFxZUElocnhodnZQWWt1Vl9cXG92VFllZXNfVFJtSHhmbVFpaVRxeFVEXW1PUXJFZXFQXFxwdEFMb2VvcURMeDx1SFBYQXVUZVhNblhuZmx4a2hOcWx3VXVXSGFuP2BTZlxcdHF4WFo8akZdbnFNVFlIeGtJeD9oaj9QUEk8b3ZtV3R4bmF4dnNZeGFhTUVBV1lxdV5hbUxYWD9RT1VFcWZsbUJtT090U3B0alFYS0NhbmZweFBIVFBVWU1EcWFFb0Z4UXhETVZZWXJFTlBheFVpdF9Fd2xEb2FFUW1xWHZ4cnVhamhJTE9YVWJheG1oUk1UTE1cXFhKXXVPZVNFQVhOSHl0ZFF3ZE95ZW1uWGp4UE1zaHZUaXBlZVdzeFV2bE1JVVV3cE1vbGpkXVV4VFhZYHdwbVJuaVNTdHBNSGtjeW9gYU9dYW9WWVBAdHZtWXNLUHJfVHlOUU1TUVhFZE1RaXNLeVl1QXZ2TVBQeHNBXXA8ZG5pcFZ0QHhAaE54WEx4RWx0VWxNRFI9QHJsUFlKPHByRVV3RVVdVXk8TFZzXVJuXXlbXXJsTFFneFhcXGFPRVlOd2hwdl1ZcXF3V2R4b1VrP1V2Xl11WWBLY3lKX3V2TERKX3FvdFBPdD1vcmhVdWRqd0RNZkB0d2FPTkVxZFFyOmlyZ3lWQV15U0B1VmVTPXBxT2BwT3h5Z1huP3BzOnlwSWlrd21yPXh3SlRxaWhuREx3YlFVeGFXXFw8dlVZUUg9VHZ0eGVUb1RFdmNsVXdxcWx1bkdFcURkWTp5bk9kcVtpdmZdWVB5cFddWTxgb0p5cFltWWJEeVFZS05pTFBYV2xgdDx1VmFZblB5WV51V248U214VHU8d1k8TXJ5d2V4VEdAV3N5WHdpeWlgdF9MWWdJdWlkcml1TmVIUjpJdmlAT1lkclBMd21sdEZtclxcbXc9eXZAYFhDcGtYTHZnYUpWaFZ1dXRBcXVYdGt1VWxLPFJVVHB3WHddYVRJeGplZXc6TmxLPjpHRDo6OkpaYVBRbWtucVlxdVZePFhvaW5wVXlJdFB4RXlrUXhpRVldQEpubVhsbHFXXWt4WVFucHhzZFhGbXV4SVdkQXdxWGx5QXllTXdpdXVyZHhRYVlzUXhfWG9lWGtJTEtKQWxoeHM/eXJzWFVhPVNAUVd2VVB4WXZJaXJVeVZ4UVhLXXllVHlQbVdmTXhZRFBqPFBqSG9IcXROeHl3RFlsYU5ZbFZyZHg9YXVwdW9jeW5jQHJ5cXF5QXhzYVRbTE55aE1raXlBSXJoeGtTdFhZPnlocXNZeV1CSHRbdlp4T2ReT2Bkd2BQeXRRSXl4T3Jjdm9Zd3FQcWducXhwcXBFWWd0VmB1SV5rT2N1SGlmUXhxeVxcP1ljX1h3PXdtS1FmYVdpbklyYUl1eUZhanlebnl4cVlncW5kUXdkXUdwUnZlSz9hXFxHZ2NHZ1l5Y29OYXJGXUloZUhnaXJgZWJBaVlmYV5paFxcQWM+QXZaQWZjWW5zUHBsUGBuXmA+eWY/ZnNpQWBYYXFzV2R1aGlkYXRjcGB2Z2pUR2RyQXJHeHJTZmV4TmdhYXNmWWpDRnhaSXVkWFxcT2F4YkF3YnBodV9nZl9jQFheWV9kbkZhUGZ2QXZjdW5zYnZhR2h3cmBxO1l1P0F3T3lsUXZddU5kTm5wYHdtS2ldaHd1eGh5XFxpckVodVdpdUl3bXhmWj1IYnNJdEZgYlxcXm1HSGJNTmBLb2RkVmBtVmBUX19wZ2hvZ19mXl9ueFVNVm95Yll5c0RXRXk/aWxhcm5XR01HeFdpZUs/Z1JXR0ZHVnZVaVJzVUpzRFlTSUw9U251WHFVc0ldZnZpdVBHc2JbdG89dFNFSEtjQ19TdmlBdkNBd3V3WGlxaFlJUkBpdFlrQ3d1eFpNdll3RVZZSU5FdXdFc3Jdd2x5eHd3YnhhWW5RV1txZ11XcldvYkBvYnBtWHBtRmBrRmJvZkthQnVRVmt3aHF3VHhxSHF3VVNPVEZncj5XZUljZXRHaFRvSW9Vd21td1BXVXhBRVNZWEZ1Zk1RaHRHWW5Bd0txdmBxVmNdRD87dHJ3Y1Zfd15rZXVzWGhdWXZdaUdzVlM7Z2FlVT4/VXJxd2JFV2tJdHlrU2dneXZrWUZfVmZFUj1RR3BZQkp1WUs9VVZDWVxcUVdWRVQ8O0JCbUo6Ozs6Ojo8cUdVcGFBcnZxdmpJVmlJdD1lS2RFbXFYTGptbGd5VWp1bnh4dFhgWXh2cE0+WmJwbjs6Ojs7Ojo6OjpOYVN5eTs+d1JfeUhhY2xnb10+Wjo+WjpGYz9vYz5vbzw/Zjw8MjpcIlx7XH0=LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlXVZGKi0lLkJPVU5EU19IRUlHSFRHNiMkIiUhPiJGKi0lKUNISUxEUkVORzYi + + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEjaDNGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEmUHJvcHNGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2Mi1GLDYjUSFGJy1JI21zR0YkNiNRIkhGJy1GNjYtUSIsRidGMkY5L0Y8USV0cnVlRidGPUY/RkFGQ0ZFL0ZIUSYwLjBlbUYnL0ZLUSwwLjMzMzMzMzNlbUYnLUZYNiNRIlRGJ0Zlbi1JI21uR0YkNiRRJDMwM0YnRjJGZW4tRlg2I1EiUEYnRmVuLUZibzYkUSUxMDAwRidGMkZlbi1GWDYjUSZSMTM0YUYnRlQvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjFGMkYyRl5wRmFwRjI= + + +JCIzOHcyOyE+JipcVCMhIzo= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEjaDNGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEoJm1pbnVzO0YnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSwwLjIyMjIyMjJlbUYnLyUncnNwYWNlR0ZJLUYsNiVRI2gyRidGL0YyLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjI= + + +JCErXnNXLkAhIig= + + +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Throttle</Text-field> +For the throttle, q = 0, w = 0, \316\224KE = 0 and \316\224PE = 0. Hence \316\224h = 0 + + + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5ib0JyS2I6QnY/dz1NYE1eZENfYjtfZHJPdWdpbWdfY052dlB2ckFmYGtwXkdQbFVWXFxUVnQ+Z2NxR19rXm5cXGlba25oa0hcXGhXaU9ocnBRcVZBZTphWj1mc2d3bGRXdXVYZ01WamBAXVpmbjt5bEluX3FmcF9Hd0E+YFtIXFxCaG9KV15pZm9SX2dFRm5DZmk7QWVEZ2ZHUG1wbm5eTm1MV3RAX2NGd3hYSG1hR11gd2VgR21TaW1TaGZwd3l5eVtVSHVTaXVhb2pTeF1hYWFhSW1tb21hZnNpeXhtP1xcTkBhZ0ZyXz5qOkBePl5aWz5bQk5iOj9cXDxAalpebExQZUBYY1pOb2hwb2heZj1OWjxwamRwcXhwXUJOcktWYjo/XFw8TDw6Ojo6Ojo6Ojo6OjpHVz9HZW9PVktxclZfZWVTdl1RWW5feU5xckdXdll5WUlbQl1HZ2lPR2c/Zz9dWWFVeEZlQ3VfRzxxZmlHR0lRd1hDQ1VpZ0VVeUhxVXl3dFg/cmVvUnZJeWh1dU1ZZl9Vc1RnZGpPYkRbSEE9QkllYm9zY11JR2tpSE9dWE9fU3N5YmdDQkRPR1RvWEBRQ1tdcnBZeWRfZ01jSHh1eVZxdVxcX2lHU1Rrd2hJY0ZHdVVKUXZkR1hsVUZNU1Q8cXZqP2M+Z3Vrc2hxa1VNP0hZcWlXWUdUaUlDcVVCY1k7QVNsaUhvW2hKR0Ztd1JxRWhFV3JdT1Jgc1Jqd2dkP1dYa0hDdVVnS0hSXVZCYXlYQXVVeVVKQ1hiY2JKW1djS1NlRUNtT1ZeUWN3cWdzU1hRb2RQc2N3VWNScWlCO1Y/V1k+SXV1W0M8Q0RIP3N5XVdxcXh0U1VET2l1YWlwVVlmbWNSbWl3TWNEXXVWd1ZEa3NVa2Nya0Rjd1g+SWR0U2Q+d0ZcXENWPl1yS09SSl9pdm9GWT1UYWVzW2dnX09lXXlDQDtEUD1IXFxfR2hPZWZhSGVNZVV1Zzp1VFpPVVRJU0ZXV3JZRWxjSDxfaXVjdD9pc0BlV3ltSVBJSElvV3Z3VEx3WGJZVXBnZXVdWGpZZHdZVztXVTxXeTxHZ19Xd2dtZ0lXY0B3d29lZ2Fnd0lVV1Bhd3g7eTtxY2h3VFg/cm9FQjxvYmNJY0R5U2hrc2d1V3l5VnNzdGtjWFdvWFxcUWlicURIP1JLZUlsSWdwbWdmP1h1a2c+W2daTXJ0UWJfZXdxUUV4SWJlS0I+Y0NQUXl3aVVxd3hFU1VOeURWRVdjc0llWUlIU1JCc1JWP0VndVdidVlDV1d5P1hTc1Q8O0M8PVJqY2R0S2J5UVlpcVRaaXNvcUhJVUdRbWltVUVoU0N0UWJAbVg+c1VFUVVzYXdUV1I7d2hiQUM8Q1JdaWhnQXl3c3VrXVVAO0lcXD1Hc19nWl9oQmdTXFxrZGo7ZktlQldfWV9rZUZFQ1dPYl1ReFNtSFY/eUVbdlZBZVJDclpfcmJFc0dlbFpoUz9kbWZVUTtgVk9FTlM9bHlBTkpNUmFweHJgSmZFVEVoS0N1b0M9d0JocGRAbk1IV0F4U1BRcHNtU0FsUWt4TW5BdUBNcWg8eU51TXE8cmtMbHZQbHZcXE1LUW88cFNUcXNOYXJCdGxXVU48WFZDYXNgPXBTXUxWdFBCQUpcXER3dERrS1xcdGRQamhMVHVscWV1VHNsT1VNeF9Ud0BUTVFpWEd5clNpT0V0TVFIb19Ac0RJcjt0TnFMalRlVEpJb2d1Ult5eFdwTUlpVHFYeT51bUU8TGB0cV1sa3lQamhcXHFXYHNmQXZJUFJWVFhOWXZAXFxsY1FRZ0l3PGFTWkRvO0BuZkRUa3hucFlTVnR3VlhWcGhsUmV0VXl0WElrblBOZWVUYGxKXk1saUxOUFFvPHBTaGhNRXFzTFR1QkRxS0Fqd2RRW3FNa210anFwRmV3a0VZPUVTV1FyZHBRVkl5XlVwPFBVTz10Q3FwTTxwWkVqPExReD1LVHFNVUlYZ3F1Y3RzT0FZd0l4ZGB4bmVtYEVWXXBsTWVLO2FQeV12PEBxTl1MP1RQZlVKUWFyPnBrUkxqOkBOPlxcSls8S0JMUjo9TDxgdEREVU1hdWJBd2Jhd2Zhb251c0pBdEpUdUJ5c0l5cm9JSjxQcWVYcG1YdF1JeEJ1eE5cXExOPHRlWHJbQUo8QFg+cVJiUHF0UHlLeFJYREtZeVVVVVVFWGs9XFxKR0B0XXVrd2x4ZFlvaXBqZmFOTTxtTVhsPVhrPVxcSk1sVkJEVjxEalpNTkdETkY9TkpcXFNqSE4+SEs+TGpDYFA+QFA7cEplZHRBZFZSR3JZd2l3aWhsT2hsR3dMaW5Fb2xmRnlfeWxZP3VaYHNQaF9Vb2xpdmV4cGNKdmprTmJaPm9bQGtzcHdocXc7SGo7TmlXSG1TSFtzYWhmX2dGaGdCWFpOYWNecW5FVltFdmhnUXU/d29eT2A7cFtKXmRnWG1xdmdweXhxWWBsUWZAdmx3cWxGXmZjR2djRnBSaGxPaFpAUHZOT2NeYG9MeG13XmlyQWhVV2VVP3lBX3JKRm1uTmlHQXNCQWNJd2NRcHg8RnNvVnRJdl12Pmk6b3NUYGtfeXhLcFxcRXdeRFZdVVZdS3loPmhcXE5oXFxbWHZrQWlIaF11blxcbGFcXFJHa1NWW2NheUtua1xcWHlQdmhwWVtkYG9mYF5KRnZXSGY/VmI/QXZdXmheYGRPX2ROX3JTSW1db11zeG5heG5dWG49T3VNX29ocG9wV3FXSXdjeGR2SVo+Vl5xV3lEWGtFaG5oWGxmaF1TTl9BWHJbaGduZmN4aWVUZnBKRnVhcXNXWF5NVltqYGxlR2dXZ2VXT3hHWHB2VnhGWWA+R25CaHJVeWd5aHVYcXVoSGliQXhyWXZJWGxFbm5IQHZyQXlyaW11dmhid3NZdml2SXhbeWpZTmVmbmxmYXdmP3BPUG5CbmBxdmBpSXVteGpKP2ZISXhneHBYUV5yYWhXTnRdTnBZd2l3ZTp1RVhrRWBzRXdBeFtZcklvSXRBd3F5dXl1RnF1Q3ZPVEhDcj1zQkhbRXNLWD4/RlpnV2RZZFd3SXltZWZfVD5hUmZjc09XZVVXU1htWWo9WEpHZT1NaD5hVlRDYzxVVkhvQz5zRD9fd3BVSVNbSXBnU0hJeG15c3lzSHJdZ15leGRpdF9pbkNgUVl4a1l4dVtNWGxNbDx5dmxQcGw8VFJQTEJMbHdZTHNZTklBeV95bFltTl49az5AV11MS3lteXN5dmlxcXVxa01scmttcXhReWVNbmpFdWxuY1FoZGxebmM+ZHl5Y1RIaUlvdmFeXkt2dVpBZnZRdF9YY1xcWWVEeGxjTmdAdmZDYWc/RndYdndXWXFRaHh5UWBsTmB4YXlteWNUQXF2R21ZX2dFQXk+UVpcXHlvWkBuOmhaXWFmS0Z1U0dkeUBsRk9gb29cXDtXZUxOXkJxZ3NWa3lHb2F5YHBuYGBuaD9ha2FAZER5XT9WYk5JXVJwbVhwXk1gY2lHX0ZHdXRoaGVWc3JIakx4ckt2c0hxc1B2XFxRVnBOd1xcdGh2YXFzV1hmaVB2Yj9jd2dpd0hmeUFmW155a0BmYmFzU1hgZl5eXFx3bmRmaUhXXFxxYGlHR2ljT3FISWRBeXNTV2dCYV5yb15ocV5Nd1xcSmhheUFeUXhiXklgVVZycEh3eHd4cXl4bU5bY2lkaT9cXF1OeGFubUZZdEl3YUc/eEt5cURmckZfWl9QY0hhdlBOaVNJbW5uZEphb0JOdEdnYXBfd1JWdWhob2dobHReZT1IX05YdklIa3hJYFh5aXlpaXRGXVRxd2JBd2Jwb2hwZG1eZE5mZ1t4XFxHX3dWYHBHQXA9P3JLdmJPQG15P2J3ZmlxWHVXbmFyTmZGeGJIcHNZVmxuYF5YRnRrT2xSR2I8eGt2QHBiT1pdbmt3UV1aV1tPQHhBYWhsYXZDaWNVcGBrT2Jsd2Rxd2hxcGhTUVxcXFxhXFxsUXZMeWZueG5bV2JpR2NRR1xccz5oa3dmclF1Y092WEZmXFxRZXBgXTtheVVBaFU/X21QeVRPc1xcPnFpd3V4bmx5eWJxYGF2UFtXQV1EZmxteXJIWWxqWGZDcGpuT11UR15SUWROQXZTUFhVU0JRdGFVRmhRZmZxVXl3dWhjZkFvWEJTVF1TeFlhU11pdWdDaXJhc1pzc2VRc05nWD5JUmc7eGlNeFRfSFZtaDphWUg/WWxNWExdU1RjVWpPdUx1RklfZ0R3SWBLd0tLSGVlU1tbbGR0SjxpdmZpW1teZmNZYGF3bz5YXltvZ3JHaEFWbWlpcVVnZF5Yd3VAdG9OZm1hXW54c295Y2VfbTtodFFRZE9RW0R4eElAckxPZkhfYHFoams+eEFpc09Ga2x4cnBmYXdmYVRxZmhOd2lIXFxxYXleUHg8ZnZbVm9paG5OTmo9Vlo9XmddUG5cXFBiW3ljbl5uam5geEFtZFBvZEBdPGB4WV9eVGZiTUBzYHh1XFxJbGBWaD5ZYG1WYGZWY1NobE5PX3lJbmBuXXNuXXhBYVt2aTxobkdRdFlHYHROYWQ/dF9WdldgeHZRY2VmaU9feVQ/cUFmYnlmaW9RZUp4YkdGaVU+aHdIYkVwcV5QaT5fX3RHdnZheXZncE9PXWtPdTxBYXNZXFxBPmdIcF13TnN2R3BLd1tJZndYd2lpdlxcbmBmRWBmR2dlZUB2WmdqUnZgXmlvTkhiUUF4TnZsYWdtVVdcXD1XdlpAdV5ncF1eWkpWbkpgXVNfbFI/YURAdW1QYEBHXkU+Z05AZGJIW3lfbUpgZDtxbmQ/ZXFwZ1dpa1V2YHI+c1Zva1JAd0tGdENIYWduYUB2a2ZoXFx5X3NyV3A+b2JkZ19cXEdmbD5cXFZfdFxcWGlgbltBbnJNaGhcXFBrPGdbc1lbc3l2a25vdT5bPmZwTEBtY09cXHlnX1ZQYkRmYGF5a25hdk14Y0BgeXM+YkphaUJOZ0xgbHlAXj9QaWp5XndGeVV3cGhHanlWcFxcPm1LSGxbSGM9SGRiXnRDeGFQPms6UVtUaFxcO0d0Zj9nUnBpVkZsPGd5cllsVEdiWj5tZHFrck5bP1htcGZnTElreT5eUmBeQk5nWF9qS05iW0BlRj5uQUdgbGZgRXFdR0laO1d4Wz5deFZeZHBwTk5pdm5tT1ZfUD9rdU9jRVdjb09fQHhia1dxU0dcXE5pUFlkYWlGZTtZeXF5d0VYSXd0ZWl0XXN0dG1YcG1Ubk9oWnlzXj1DZHl0RU9kQHlFZW9UZ09oU2FXW0lIbE1GdV1od2VUY0VZR01HbFt4TmlUeUd3V11jcT9yU0FCO0F0a3lkW0dmW0dyO0lSd1F3SF1mbW9zY2NSXkdmP0lVTVNVZF9ESXdkSGloUldDWEtiSXlZQk9kX1NXYFtCUXFnV1Vnc0tiS3NyWV1YZ29ZTGVFTkV4Q1VzSHVid0VEV0FDb2dGQGFZcHdkdlNiYF9oPE9Vd3NUQk9IeHlmWWNiZGVFaz9kcHNpO1FFXUl0clFISmVlZVFIT1tFPFFkU2dHWWVHal9zRj9DRG9pRnVGeGFmTktXWGV5bmNJd2NzcFtEeFN2U09lUkN2bFdXZkNSSHdHTEVIVWF5aFVlQVlkZ2NoUk1kXFxfZmJjYmpFdj9BWVZPYkxZSXh1ZWZJRmB5Yzp5dkdxSFZVeGttWEVHaUtbREtDVkVtRj9ZSG5HZmpJeUFvRU5LY1N1aERxUnZdWVFxZ2xtaExTZ053aUNPZTpFWVZzWWlZZ1ZLcmdteG9jVGppVERNcnA/Yj5zdkZfdGNVY3JZVVhNVmtrRXlpRmVlVGBhRWdFdll5Q2VjaUVjST5faFR1Z2R3V3hZVTxlWU9nclZxY1I/VVtVSENXU01zQm9Zdkl1Q0lfU0FjVk1jRUN3WUVPRF07RVxcaXg+WWVkZXVaVUNeT3VBY0RzR0NPTVhsa0VtS3JpVUJAU0daRXlyUUJzP2JNYWNwaXliY2VAQ2hmaHVlQHdhcU5FXXVZaXBldUxFVXBFSHFCZE9AeHZ5UE1UUVJjRXlZXWtQXVFebW1TVFVDXVJpZW9cXHlwVGxZWUV2Yz1tVERSPHFrR0lrO3V4bGhwb2h0Omx5bmhuSnB5bT11QHFrV1RRTmh5PD1QWURsV2RtanFvRV15UHVsRnVVZUVuWXFSamF5Vm1wbHl3QXBtZl12TUFrPHRuQ1FPYlFwbFBwUkFVQEBVRHVmeGFwbEFzTFF4eWZyYF5tSW5eX2ZkZEliXVdeYV5iRWZedldfSndlSD9wakBxXFxOd3JQc0NAdlNWcVRPazxWZllhcWlmdjx5cjpQYnl4b15wdEg/d0VOY3JwY0hWX0JPX2VWX0VITlV0XnN5ZGtTVT1HaEtiQWVpOmV2SXV2PF9HRWdyb011TWlWR1tUPUlUXll3XlFpYFF5V1VUWEtjXVtibFVYYXV3TndmO1FJS2t1T1tkc2lnanFocV9mZTtUZm9TS0NoSmliTXd5eF10VFVpWElDa09VSW9Jb3dzVUNSYWVTXkliVVN4Z29pXmtEW0dESnNJeEF5XU9kO2tVZ1V4eVFWZUdyXXdVZ3dVeW9lR0tDWF9Jc01Idm1Iaj9nSFtkPFNUaWdlbWNnXFxveUNrdlVXVEBfR1k/SW9FdztXQkFbQ2B5R2B1Y1ZhdVZhR0hxUkFtYlZlcmtRZnlTVWpjQjtHVFl3d1JPWHhFckBxckBFcFNkcU5MVGFgeWFlcE5McE9BV1NxWG9lWG9Qc05YVXhdbV5obltIc2FtVDxkakNobF55bWpMbWxNcW1Vaz9RUHhsUUhxSlJBV11pdlF4VXBMbHlAUmFMWVNRcFdZcXF1WW1pc3FMU2B1VHlMWF5Bc1F1VXdlckY9VnVVWXVQd189U2Z4T05peWFVc1lhc0RATldoWVdZW1lAYFRoaFBoZGtPZXFIdEtJdEJYaF9Id0R5bWRWZUJ3eWROdj5gbWBXbUdBc0JGbW9HdEFOYGFWdE1ZdF1XZl1fcEdxZHJOaW5JdEFna155Y1toX15wW2VxbXdWaVJ5bm5vW0NeZU14WkJOZ2lgdVZhdU13bkhnYXY/eWpvZmBvalo+XFxRSXVsXmt5Zl5ObnFrcXJVdmZJcW1fV3Vhb3NWSHJMWV5DZ2paRm13YHdmYXdIcXNIb2pXaXV1eGhZZHltdVpteVxcV1RCbUhpaWVxbXVLU1JiT3hsUVg6c2ROPUNsTXI9UURkUVVHa0NIS3RwQ0lfeWl4UXllaXNxc3VuO2V5Q0lEQ3duS2VUT2VSUUVaXVZbR3Y8V2RNQ1JMcXRncHluWXRJdVRpUHhJZmlraXJRTnFQeWVkUG5KUGJvb3JZZm1ASXlteXZrQF1hT3A/X3JMZ3BwcHBEV1xcWXBkZkBlW19heU90UkZpbXF2R1F0akhrcEFeRG5jbF9aY3FaTXdjWV9daWlxeXd5eEl3TXluTWZobGZnZ2dnUW9vVkdsTEZrSl5eQ2lda1ZcXHNvZWxPak5ZWl13WztxYkF3YmNXdVtBaFJeZ3hveGdZdVF3ZVl3c3Z5X3dZY25peG9JX0VZYz9OakNHXlxcQGx0Z3lOeV9ed2NHP19UPndjSXdbcG1cXEhgRVlwTUl2RFhrRWhya3lcXGRxWnZveFN5Zk4+cD1AcE5OYkpIYXhObmpJcj14WmZJZ1JpbXV2aHZwZWlGYlNYbVVYb1lhdD9eXFw6RmxfWVVpdUVRZkprRHlRVHZJaHRleGQ9dk9PWEJLSHdzeFZZWFNFVVN1RGhbVVptQ0tPYl9NQmtxd1dZaV5ZRG9neEVZaG1XaGlxaXVxR1NzaUV3RGlLaF1FWDxZZD1NdUM/eXFjZktbRkt3Ql5vZ1t5Q3lbeTpxckJDY0lLd1dLREJfYlpjQkFLdEFFWWtTclFxdVhxeVxcWWNpa1hwbVhsR3dpR2VtaWZSYVVoc1Y8S2RNR3lMbVRPRWd5d2l5QXhbWXJbQ0NXXVZIU1NFVVNFU0NFY3RISVVHRWhIdVhxdXg6SGpKYHJCTHdobVBwbFBQbVRQTWphPE5iVFFKTVJabGpJVUo8PUtMPGtldXRoaFY9QGtbcW1UaGx0XXVOXFxSO2lTcm1XXFxkWGtkVWh0dFtYUkFAUGx5Sj50THBlbUdpc0dhVjpxTGY8UmBUbEBdUWc8UVtVSktVU2BgbGZ0bWtETHE8TEZtTUs9SkVdTExIU114dFJsdkZhWHJcXE11bFhmQW5RPWxhaGxMbU9qVVY9eWpmUFk9QE9eZWprYU9xaE5eUE9OcHFjTFFiaXZFeWxNcVhmaXhhQUxKXFxrYlBSO1V4WERWaGVteWBUbWFLQ2h0TFxcVTw8S0JMQkNSOj1EPEtKQl5KOjo6W1ZGX0hCYWRLc1RIT0ReY1V4S1N0SVlycVlnTXVRa0lvbXhUT1lka1ZaO2c7b3ZSO0RQd2NEWXZeW2RqWUdTT3VmbWhLY0lUeUNAV0Q8V0ZgUUJFeVJDbWRDQXZRb1JdYUlvY0Z0XWhZeVRPXXQ8bUhrS3hcXHVUSk1nU0VSc3NFdE1iOltlbEVVaVtYYztYa0dycHFXW0V1d09SYEVXWWVEaFFGSltkPGVSRkVJdWV3XFx3Q3BtdGpZZ3VrUjs/c1VTWXVJY01xclZfZWVTbm9BV3NXPVd2S3V0SjtCPE9IZEVlVT1YYW11REdIWVtJX3V0ZWd5Pk1jcll4V3FpYXdSRXFkb1NHW2VCXWxPPkh5WlVrbEFVcUxNXFw9S3NFalpQV0lgdVdRckdAWDtoVEdhSkdAdFVATExgdHVMVkI8S2RkVEpkVTxRUlxcaE5rcGtFTFI6PVhLUFNkcXI/cG9cXF13XXh1SkhxS1xcS0Zsaz5Vd11VcUBoeWhkc1V5alV0U0hEdlNEUD5cXEpbPE5CPmpaXmpqX1pMWWNZcHRmSHVXSXJnb29TbnFSR3FYdmQ9bmRKQWhXUXlaQWlBb3dgeXFdUUI9SGtLaWtxdTtRVWhvcnd5V1ZFQ1o7ZVJjVXh1eUpzVGlpYnlpQjxHSzx0U294cW5RdWV0U1pRUzpEcj5Ad3RVbUVgU1p5WXFIdkQ9SjthcmJRdHlRTXJYbmE8VjxkTGJscztFTXh0SkBpTVhNbU5cXGxqPExJZUpXUXJneU9IUUt0WHN3aW9WQU1xYXdUWFJcXHFtaVV4UG1QTnhtb2lNWXFLYGFwPz1YeERKO3hSO1hrOk1SdmVMbkV0VXlVdmhMblV1SHh1bWlNWXh3TmxsXmlZVl1qa0VyPkFRXFxlb2U8d3JATjpEVDt1SmU8cVpkTmJAbl1kb1l5dW9VWXk8VEVdSjxQUU49dDs9WD5RV3c9eDtdTFdEUkNMcDxQdVA9dDs9UkplUDtAb1pYakxUW04/dDtXa1xcTl5QeWBWcWI/Zl1KXltvVmlsd20/eWQ7d15RcWFWQWFcXE5mQk5aPEBcXFZGaGRPZ09PaXRwY00/ZktXczo/XFxUP2VtdnF3cWpFQFo+ZmBNQXRKQWxWcW12YXl2X2VZPl5iWHFUUG1UUHF1WHFfWGlETltEPndPSXZqU0pDdkJHRGRnZ2dnVG93RTxLYlRTR2FzRkFfQ1g9c0hNdT1VeWtFWDo/VjxhQ1tbU1o7REZdZltbYkNbQjxHQ3BbYmpDYjpMTkdCSjtDYDtNPj47YVJUS3JQcXRQPWU6PUZSP1NPbVRQTU46TGpKPEw+QE5aPEs7RFJCTEo8Pj5iTHdVeXlSYj9Zb1tCP3dXdj9EOjtCOjtSTEVkTUNkZT9EUj8+MzpcIlx7XH0=LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlU0BGKi0lLkJPVU5EU19IRUlHSFRHNiMkIiVTQUYqLSUpQ0hJTERSRU5HNiI= + + + + + + + + + +Enthalpy at h4 + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEjaDRGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEjaDNGJ0YvRjIvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjFGMg== + + +JCIzOHcyOyE+JipcVCMhIzo= + + + + +Saturation pressure of R134a at 253 K + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEncHJlc3M0RicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZJLUYsNiVRJ3ByZXNzMUYnRi9GMi8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUrZXhlY3V0YWJsZUdGMUYy + + +JCIzaChwd1ZHcCg9OCEjOg== + + + + +Quality at P = press4 and H = h4 + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KEYrLUYjNigtRiw2JVEmUHJvcHNGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEwJkFwcGx5RnVuY3Rpb247RidGOS8lJmZlbmNlR0Y4LyUqc2VwYXJhdG9yR0Y4LyUpc3RyZXRjaHlHRjgvJSpzeW1tZXRyaWNHRjgvJShsYXJnZW9wR0Y4LyUubW92YWJsZWxpbWl0c0dGOC8lJ2FjY2VudEdGOC8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRlAtSShtZmVuY2VkR0YkNiQtRiM2MkYrLUkjbXNHRiQ2I1EiUUYnLUY9Ni1RIixGJ0Y5RkAvRkNRJXRydWVGJ0ZERkZGSEZKRkxGTi9GUlEsMC4zMzMzMzMzZW1GJy1GWTYjUSJQRidGZm4tRiw2JVEncHJlc3M0RidGNkY5RmZuLUZZNiNRIkhGJ0Zmbi1GLDYlUSNoNEYnRjZGOUZmbi1GWTYjUSZSMTM0YUYnRisvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjhGOUY5RlxwRl9wRjlGK0ZccEZfcEY5RitGXHBGX3BGOQ== + + +JCIzcyJwb0JKNVw+JCEjPQ== + + +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Evaporator</Text-field> + + +For the evaporator, w = 0, \316\224KE = 0 and \316\224PE = 0. Hence q = \316\224h + + + + + + + + + +TUZOV3RLVWI8b2I8Uj1NRExDZE5GWmVcXGs/WzxKOkx4SmlrXXM8V1RMQ1RKY0RYb1h1dXhNS3VAbVg6SVh2XWheQXZNTXddR3NjQ2ZMPUhbW3RbX0dFPWRJQ1hSPUdQT1hCV1RQc3JAP1JWa2RERVZFY0VzQWRHbUM8U3VaPVNWc0VcXHNEVF9yZGNGcFtCTFNjbG9YSENkVlF0aEN4O01jR2Nma01Tamd1QlVTTFlTakl0ZklzcWN4R2FjbmtFd2loXmFzRm9SVHd3YUFkQlFod1NGSW91dUl3d3dIbXF2c014c2FpPlxcVWNZS0hEWl4+PltGWjxOO0RaQz5bOl5eWlo6OkJDSjo8V1V0ckZddVBNT2ZJS0BpeGlgeWtgV1RteFBtWXlQeHNVWHB4b3h1UE5gc0l5SnJ1VDs8dVlAakRQVj5kdmBReXdtcXhFc0pMVHNIcWNBcVl5d0lBVWtoeUxhVz5MUURQVFJZTk9oTEFBdEA8UFtZdllBcU1UclBQc2RwdDtxUUd4UVlVbk9VbnZxb154V0RJbkddbF1tTGd1dGV0Uj1FbFpxVFBdUWRcXE1ZWXdLRE9QYE1IXUpNbG5pdVFPbEtAaXJ1PUxXUXg/RG9nPHd2bFVzZG1RWG9eTVNPYWt0TFd5aXNxaExHeXZFaGtFQFZ5SU09bW5PRWtnRFRZWEw9SXV2TXFScXlycFFxRW9odXNIXVdOZW9ecHNlSW5XVHBhdVBjSFVLeFlTRXVxUVBLQVJ5cXBgSVZpSE5qdG9YSXZlZExgcG86aVdGTXlyeUxvPU9KVW5rUVRlXFxsTVF5aXFLP2BucmV1WXhMc1FvTnl5XWxreGVwYU1KZHRXRkBLa0BqWElKSGRSbXFVY3RUYVRyYHlreGhZOmlvSHR5cnl5dnB2P1VOV3l2Y1FxT0VUZ215Q2hNdERQeGFPQj1ycj10TXRPdTxzVHVKclRNalBXdUFKZHlWXlVQR1lrRGFSTVlPV0hYdnhzamxLUnVvZGxyPXBRQ0lsd3hVZVBMalB4Wl1MdDxyWFF5Z0xxQHVRYEBzdzxyPE1TdWVOTUxTYFhKT0h5U01ZcElwXj1YTFl2Y2hUa1RSa0B1dUBTXm1QX1RRb1B1VG1RSDxtVEVrRUVNQ3l2Q0B3SWFWPnlMX3VyZUh5WD1gR2h0OnFedEdyP0hadVB3Y2duRz5cXGBuZWBhdkxxeEY/ZnhGXUR4WlFPZG1JamR3cXBPZVhfa19Oc0hnb3JQXztWYzxpY3NhXFxDX1t1XnhKP1pocHc/dlxcaXZkY3hldXZzWHBncFB4RHB0XFxPaEVZXFxuaWpJV2FreHlQSVttT2JOcWRyeGJ3QW5FeFpPeGJ3WWhzTlt4PnRmV2NrUG5jP19YaFthcFt4QGRIcWFIZlxcaEBtcz5vXk91Okl2Sj9uaE9bYVZiXFxQaFheZ0VJYXZeb092Wm5YZEhnbFh3W1JHdEFpYUxhbWVQX1FhZWVXdWNGeUBIaE1pXnVpb0tJb2hmaW9Qd2BgbXFnY0ZGW0I+cndAcW1OOl9CPlxcTlo+XjtGWjpgWj5iPls6SkpxeUhIWEJcXGtwcXhwcXRPVU1VVE1cXHlVa2lOQWFKYFh3ZFF3dHRvZFl3ZVlNUjxNYkl3Y0l2UkBsOmhvcUBwakBQeGxRSE13O1FXdVl5dXlvTk11UXhYaGF1U0BtUkBMa0BzS0hXWWFKdlxcWWt0bElZVWVsc1RpclxcXVJkaWtIcGtocG9oUFRaPFZ5WFlxcXdnYG9mYFF1bXhmYXVzWFhXWHhRZVRVVXReWGpNPHB4UVZoTFVAaFlIUVVrbXRobExtZXZEaUx3WUpzYXZDWWxdVE5dTG51TU50RE9cXElQb1lMYFh1V2l1V2F1VmFVWXVVeUV4XFxpanI9TlhIdVNJdUtkampVWXVVcWBVU2pIcnVNUF1IU3BlbUNEdGhlbFlkTXBwdj1xUlddT2BETXRMdWl4UXhdeVJBdVlETF9AeGhpdXVQTj5Ea3k8VV54bmF4Vmo9WGpNWGxNeEdZbXFMbmpIV2N4eGtZdkFJeGtJeFRoVlZlcWlQU1hFbHdUUHc9c2dtbk5YeT9JbXR1TmRUdHE8dXNlVzpZckhAbk11dERYTFlwcnRFcE1EeGFMa11keE1sWExkbkhdSlxcaWtVdFBueEtdQVhyXFxVX3hPVlhZeXFTbHlLWU14UFR5PV11SmVxd1BMSlFqb1B2RlFOVHVZdVl5dVF2O3VXaXV3PmFyPmRKPGx4VVRNVVRVVE1VTHFqW3hMUXRMZWBOWnh4bklVY1RUZ2VwR1Bzb21zb3lWTml2R2BsYWFZXFxJbWdAb2tFdmxlV05EU3ZMbXhUbmZEdmdsWVZ1TUp1V15VajtQbWVZb1lcXFFneWs/cXNQSVdLbUpZaWxXWVdKTU9XeWxOTXBOUVV5aVhjRVRTdUtubG9nRXFkUVhHdUp5dFVveXdkZVY8TG10cFRWSHVwbFBwXFxwQXRUaXBVX2FWVkxVP21sX2VPO3R0UXl0ZXhwS1xcbG9AUU5gS2xcXHRjYW1QZFdzUVZ3eEtAeGo+PUtCSXd2SXdMWVVNcHRYaVdgTEx2VG1GWXdFZUpxTHE7ZU5xXXJpaW5FWEtmeHhJSW9pSG9qUHNMUHldTVdkSFNPeUpgYHQ/bFplaWtieF5CXmx2P294eHg8WXduaWNlVmY6bmVnR3FgZnd4V3lfdl89R3lzd2t4UVxcRXF5aHB0YD5uc1hnP0ltR1ddQXBcXHROd25eXVRpa1hfeXBvaHBPd25ZbE5RY2l4b25ublZwXU55cWlZYV15bEx2d21PZFpIb2VhXzxHY11nXmVfZz1IcVFIa0Z4YXBAXWJueUhfYE5GbVBPdkZPYHh2bz9vaGdwYVlpb1J4dVE/azpnaGVXckVQc0hPd2ZpYU5gXz5xcXBgZU1QcGZWbG5WZ1ZfdGhgZ3Nwbkx5cWVobkM+d2ppcFxcYXhJYHU7SGo7TndbTmU/d3FiTnF4aXZiUGM+Z2VMT2RqT2locWQ6b3hQeGVebnZ5YXdtZmtHcGdqVlxca25kY0dsckZla3lzUG9idFZdZz9fOmhxUXBqd0lsPnBdVVBFT2RzeVlIV0RMO3RbWVc/SVc9P2I8dVhxdUhvQURnPVJFdWNscXNib1RxX1NCd2lAcUhSZVd2ZUdRYVJlW2hSQ2JRX2Y+bUZOY1N1VUVZWWlwTVRCeUZDRVVtbUNhU1c/SUJIdUZcXEF2WlFWTl9kYml5Y3l2P3dDZENyZkV1PkdicXV3RWdkOkVJR09EWUVTT0t3RFVmUWtzUHF1Wk9kWE1zY0VlRF9UTW1TUUFjTlVHdk92dFlJTE1ZbUdlPmF3Zj9rT3FUU1hPWVlZdjxVYmB0RHVuU1VVa1hUV2RTTnlsWVh0aERrdWh0dkFxU0h5Zz1yPGlwY2RQVUR4bEh3VXlWd2hYbj1ZbXhTSHVOT3hrc1FwcHlscHBMc3huam1qbmxMTFBrR3BOb11tR2V3YVBvPWlTREFNU3hSdUlxSk1QVVRZYVl1ZGhwVXBKcTxPYVhwTHVxaUB5dF1uXFxBbnc9VnhUTWV5eGNldV1lVkFVdG9wWF5oV209T05cXFRQeHVGbUpIVHV1UHFzQHdQRVZBcHlcXFFraFFuWHlOX1ByWWlYPmlQbGFOUFFrTVlrT1RXYElqXFxAd05xTGpIdmRtTW1IWGFdakhdT2lkTnc8S2BBVDtcXE5aWG9yaU1xcE9vcG9HbXZFWWo+XFxaZ3hkbGdsXFxGW0JYbnBgcWZxbUFgeHNWeGVQbVVAdT4+bDpAYGpeZWlQZXJWY2F3eHZebl1gc2lQYWxhcmA+aj5eajtnZm1Ic2hJaUJna0d5b0RHbW1GcEM+XjtGaEJBZkRodW1BbFRHYD1JW1pGWkt3YTxmZ1N4al5PeT5oXzpRXWhHZWdWaGxPaEx3cUtecFVXXmpoZG1BbGR3c2lQYGNPZk1OdT9Rd2RRZ2ZuXFxNeV5dWXRAXnBJUXVUUXVOYXROQXI6QXI+YXI+d3ZZcVpgYHZIaV1BdmQ+V3VxdltjSHZzaWRgYGNmT2J1QHRoR3N4VmBtVmh1cXhnWW1xdmd0RnZIYG1oR21PdmhrUXY/Z3FHPmdGSWJgUF5PUXc+UWVxdltDZnRlUG5FTmtcXFFyPFFqcHBdOmBuWEFcXEZJW3M+aUZBdUlfXFxnYF5xXlxcb2ZnY3BkZ3ZaY0Bpal9nTk50WF5uUV5nc29bTHd1OnZeXkF2bFF4bEl5bXl2Qz9idWFocXdoRVFwZlFsYHdnTWBvV3hqPj5dR2ZbR0ZrWEFlZXBsY0BfY2laRWZtdF9sR1h2OlBlcGliXFxGXFxrQWo+XmpNQXFeX11qaHZTeXZAcWBaSGB1QW9jP2p1VnV3b2dGP2JLRmlcXEFrTWhJbXhzR0g7c2RRd2RjW1k6VVdHR2dWY3hMb2laaVU7O3ZUXUZaXFxeOj5oWXB0RlhacGltdXZ4WXhwaWdvUlF4aVB5dHF1aG9nbHFxXFxYXlN3ZGtfZVVHa1RXbDpQdldfc3dPeVNRa2dWaUlfXWFwbVpYZFN3REJ0RXI6W3VFX0I+YEpuZVFBZXVvSEw6REtidUp3UXVuaVNIeW06eEtaTUxKaXBDPHF4cHFIRVc6VW9mYXdmQVdJTFl1VVlzTE1ePG53TXl0UXlueEplVVdlXWxAXFxwRFFzRFFTU3lSbDxTOlVRYllXQEBrXFw8cXRQcURFajpVU1R2ZmBvZm54clFuX1Y/djpAbDpwcHBRakFvYkBfcEFZbl1Ybj5AXmZ5a3lGZGphcGs/YktPXVdwaF1Bakh4cnRHckxZakF2W1hncXRncHVYcXV4cHF4XFxCXlo+R1xcRnZqPWlfc0hmcV51UGhpXFx4dmtmYG9mbj95ZVF3ZFFZbGF2Y1ZAcHZPXUM+d2J2aUlwbXJxdnNgeE9fYHd5a2tYZFBgd1p4bmF4Yk5gYWtJYWZOXFxKT2RpV2ZlPmRsPmZXRlxcbWdsYXZpWWZhdF9mXFxBXlpRdXF5cnloaXRXdml2bWBBd053cHF3X3J5aXlvcXlheUV5b3hnZ2txZUB2WkF2cHF4cD95cU4+W1JBbmZueXRXaXV3ZXlwaWdvZXl5ZG5OXT5feWs/bXU+bkc+eVtJdmdIW2NOeW55cENZZ3k+ZXdYX0tRXFxGZ25MT25RT3BuYHBuSHFzSG9ZZ206PmVRX3Y+V25pUXhfWXNcXFZ5Rl93dnFvd3d5R1l4aXZ3d1lgbHl1aXhva19rVWFhO3Z0WGZ1S3BuWGFrV1B5VU90aGhhSEZvYm5cXGJ3ZVFud3lhbU12eXdBX20/X1RhcVFeeVtJdllwbVhBeXd5d3hHc1VgWjppZ0M+eU1RamZOXTp4aVpfXVE+anVRXFxqeXJ5bmNFd3hgR2c6TlpqUGw9d3I7dnRQd21Cd3lMcHF4RmhBd2lgeXV3eXJheG93aWBxd3lxXnFhP1p0XmE7ZmxLYXV1aXJpbmF2Xl1oeXlbPmdTaXg6QFpCP0J1Rkp1Zz9vR3ZreXBhck1Dc0RJdT5bRlpnR0hlWVE/eW5pRWllREphWHlJQ0FHdlhDdDo7Uzo9QlpDQjtCOktcXFo6OlpaaHlucGZQX3VpTnF1aHFhbmtVX3Bfb3VOX2hkVndkbmtlV19LeF5ZeHNNP3A6PnRFblo6TlxcSjpCWjo6Ojo8dkZ1eUFcXFFZXW1IaGo7d2E6Qjo7UkxFZE1DZGU/RFI/PjM6XCJce1x9LSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlcVVGKi0lLkJPVU5EU19IRUlHSFRHNiMkIiVJNkYqLSUpQ0hJTERSRU5HNiI= + + + + + +Heat extracted by evaporator + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KEYrLUYjNiotRiw2JVEvaGVhdEV2YXBvcmF0b3JGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGOS8lJmZlbmNlR0Y4LyUqc2VwYXJhdG9yR0Y4LyUpc3RyZXRjaHlHRjgvJSpzeW1tZXRyaWNHRjgvJShsYXJnZW9wR0Y4LyUubW92YWJsZWxpbWl0c0dGOC8lJ2FjY2VudEdGOC8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRlAtRiw2JVEjaDRGJ0Y2RjktRj02LVEoJm1pbnVzO0YnRjlGQEZCRkRGRkZIRkpGTC9GT1EsMC4yMjIyMjIyZW1GJy9GUkZaLUYsNiVRI2gxRidGNkY5LyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0Y4RjlGK0ZpbkZcb0Y5RitGaW5GXG9GOQ== + + +JCErbyxpXDkhIig= + + +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Coefficient of Performance</Text-field> + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2Ji1JJm1mcmFjR0YkNigtRiM2Ji1GLDYlUS9oZWF0RXZhcG9yYXRvckYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjtGPC1GIzYmLUYsNiVRL3dvcmtDb21wcmVzc29yRidGOUY8Rj9GQkY8LyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZOLyUpYmV2ZWxsZWRHRjtGP0ZCRjxGK0Y/RkJGPA== + + +JCIrMjM4PEEhIio= + + +
    +
    +<Text-field style="Heading 1" layout="Heading 1">Plot the Refrigeration Cycle on a P-h-T Chart</Text-field> + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KEYrLUYjNigtRiw2JVEld2l0aEYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUTAmQXBwbHlGdW5jdGlvbjtGJ0Y5LyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGUC1JKG1mZW5jZWRHRiQ2JC1GIzYmLUYsNiVRJnBsb3RzRidGNkY5LyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0Y4RjlGOUZlbkZobkY5RitGZW5GaG5GOS1GPTYtUSI6RidGOUZARkJGREZGRkhGSkZML0ZPUSwwLjI3Nzc3NzhlbUYnL0ZSRl5vRmVuRmhuRjk= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEpaXNvdGhlcm1GJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkktRiw2JVEsY29udG91cnBsb3RGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2TS1GNjYtUSInRidGMkY5RjtGPUY/RkFGQ0ZFL0ZIUSwwLjExMTExMTFlbUYnL0ZLUSYwLjBlbUYnLUYsNiVRJlByb3BzRidGL0YyRlQtRlA2JC1GIzYyLUYsNiNRIUYnLUkjbXNHRiQ2I1EiVEYnLUY2Ni1RIixGJ0YyRjkvRjxRJXRydWVGJ0Y9Rj9GQUZDRkUvRkhGWi9GS1EsMC4zMzMzMzMzZW1GJy1GYG82I1EiSEYnRmNvLUYsNiVRImhGJ0YvRjJGY28tRmBvNiNRIlBGJ0Zjby1GLDYlUSJwRidGL0YyRmNvLUZgbzYjUSZSMTM0YUYnRlxvLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjJGMkZjb0ZecC1GNjYtUSI9RidGMkY5RjtGPUY/RkFGQ0ZFRkdGSi1JI21uR0YkNiRRJDE1MEYnRjItRjY2LVEjLi5GJ0YyRjlGO0Y9Rj9GQUZDRkUvRkhRLDAuMjIyMjIyMmVtRidGWS1GY3E2JFEkNDYwRidGMkZjb0ZkcEZfcS1GY3E2JFEjNjBGJ0YyRmZxLUZjcTYkUSYxMDAwMEYnRjJGY28tSSVtc3ViR0YkNiUtRiw2JVElYXhpc0YnRi9GMi1GIzYmLUZjcTYkUSIxRidGMkZqcEZdcUYyLyUvc3Vic2NyaXB0c2hpZnRHUSIwRidGX3EtRlA2Ji1GIzYoRlxvLUYjNigtRiw2JVEqZ3JpZGxpbmVzRidGL0YyRl9xLUZQNiYtRiM2KEZcby1GIzYpLUYsNiVRJmNvbG9yRidGL0YyRl9xLUZgbzYjUS9MaWdodFN0ZWVsQmx1ZUYnRlxvRmpwRl1xRjJGXG9GanBGXXFGMkYyLyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRmpwRl1xRjJGXG9GanBGXXFGMkYyRmd0Rmp0RmNvLUZlcjYlRmdyLUYjNiYtRmNxNiRRIjJGJ0YyRmpwRl1xRjJGX3NGX3EtRlA2Ji1GIzYqRlxvLUYjNigtRiw2JVElbW9kZUYnRi9GMkZfcS1GLDYlUSRsb2dGJ0YvRjJGanBGXXFGMkZjby1GIzYoRmhzRl9xLUZQNiYtRiM2Ky1GY3E2JFEiOEYnRjJGY28tRiM2KC1GLDYlUSlzdWJ0aWNrc0YnRi9GMkZfcS1GY3E2JFEiNEYnRjJGanBGXXFGMkZjb0ZfdEZcb0ZqcEZdcUYyRjJGZ3RGanRGanBGXXFGMkZcb0ZqcEZdcUYyRjJGZ3RGanRGY28tRiw2JVEpY29udG91cnNGJ0YvRjJGX3EtRlA2Ji1GIzYoRlxvLUYjNigtRiw2JVEkc2VxRidGL0YyLUY2Ni1RMCZBcHBseUZ1bmN0aW9uO0YnRjJGOUY7Rj1GP0ZBRkNGRUZob0ZZLUZQNiQtRiM2K0Zcby1GIzYmLUZjcTYkUSQyNjBGJ0YyLUY2Ni1RIitGJ0YyRjlGO0Y9Rj9GQUZDRkVGaXEvRktGanEtRiw2JVEiaUYnRi9GMkYyRmNvLUYjNilGXXlGX3EtRiM2KC1GY3E2JEZhc0YyRmZxLUZjcTYkUSQyMDBGJ0YyRmpwRl1xRjJGXG9GanBGXXFGMkZjby1GY3E2JFEjMjBGJ0YyRmpwRl1xRjJGMkZqcEZdcUYyRlxvRmpwRl1xRjJGMkZndEZqdEZjby1GLDYlUSp0aGlja25lc3NGJ0YvRjJGX3FGZHlGY29GYXRGX3EtRmBvNiNRKURhcmtHcmF5RidGY28tRiw2JVElZ3JpZEYnRi9GMkZfcS1GUDYmLUYjNihGYnFGY29GYnFGanBGXXFGMkYyRmd0Rmp0RmpwRl1xRjJGMkZcby1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZaLyUmZGVwdGhHRl5bbC8lKmxpbmVicmVha0dRJWF1dG9GJy1GNjYtUSI6RidGMkY5RjtGPUY/RkFGQ0ZFRkdGSkZqcEZdcUYy + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUS1pc290aGVybVRleHRGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGNy8lJmZlbmNlR0Y2LyUqc2VwYXJhdG9yR0Y2LyUpc3RyZXRjaHlHRjYvJSpzeW1tZXRyaWNHRjYvJShsYXJnZW9wR0Y2LyUubW92YWJsZWxpbWl0c0dGNi8lJ2FjY2VudEdGNi8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRk4tRiw2JVEpdGV4dHBsb3RGJ0Y0RjctSShtZmVuY2VkR0YkNiQtRiM2KS1GVTYmLUYjNihGKy1GIzYoLUYsNiVRJHNlcUYnRjRGNy1GOzYtUTAmQXBwbHlGdW5jdGlvbjtGJ0Y3Rj5GQEZCRkRGRkZIRkovRk1RJjAuMGVtRicvRlBGYG8tRlU2JC1GIzYqLUZVNiYtRiM2LS1GLDYlUSZQcm9wc0YnRjRGNy1GVTYkLUYjNjJGKy1JI21zR0YkNiNRIkhGJy1GOzYtUSIsRidGN0Y+L0ZBUSV0cnVlRidGQkZERkZGSEZKRl9vL0ZQUSwwLjMzMzMzMzNlbUYnLUZicDYjUSJURidGZXAtRiM2Ji1JI21uR0YkNiRRJDI2MEYnRjctRjs2LVEiK0YnRjdGPkZARkJGREZGRkhGSi9GTVEsMC4yMjIyMjIyZW1GJy9GUEZpcS1GLDYlUSJpRidGNEY3RjdGZXAtRmJwNiNRIlBGJ0ZlcC1GYnE2JFElNDAwMEYnRjdGZXAtRmJwNiNRJlIxMzRhRidGKy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUrZXhlY3V0YWJsZUdGNkY3RjdGZXBGYXJGZXAtRiw2JVEoc3ByaW50ZkYnRjRGNy1GVTYkLUYjNixGKy1GYnA2I1ElJWF+S0YnRmVwLUY7Ni1RIn5GJ0Y3Rj5GQEZCRkRGRkZIRkpGX29GYW9GYXFGZXFGW3JGZ3JGanJGN0Y3RitGZ3JGanJGN0Y3LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRmVwLUYjNilGW3ItRjs2LVEiPUYnRjdGPkZARkJGREZGRkhGSkZMRk8tRiM2KC1GYnE2JFEiMEYnRjctRjs2LVEjLi5GJ0Y3Rj5GQEZCRkRGRkZIRkpGaHFGYW8tRmJxNiRRJDIwMEYnRjdGZ3JGanJGN0YrRmdyRmpyRjdGZXAtRmJxNiRRIzIwRidGN0ZnckZqckY3RjdGZ3JGanJGN0YrRmdyRmpyRjdGN0Zpc0ZcdEZlcC1GIzYoLUYsNiVRJWZvbnRGJ0Y0RjdGYXQtRlU2Ji1GIzYoLUYsNiVRKkhlbHZldGljYUYnRjRGN0ZlcC1GLDYlUSdOb3JtYWxGJ0Y0RjdGZ3JGanJGN0Y3RmlzRlx0RmdyRmpyRjdGK0ZnckZqckY3RjdGZ3JGanJGNy1GOzYtUSI6RidGN0Y+RkBGQkZERkZGSEZKRkxGT0ZnckZqckY3 + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUTB0d29QaGFzZUVudkxlZnRGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGNy8lJmZlbmNlR0Y2LyUqc2VwYXJhdG9yR0Y2LyUpc3RyZXRjaHlHRjYvJSpzeW1tZXRyaWNHRjYvJShsYXJnZW9wR0Y2LyUubW92YWJsZWxpbWl0c0dGNi8lJ2FjY2VudEdGNi8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRk4tRiw2JVEqcG9pbnRwbG90RidGNEY3LUkobWZlbmNlZEdGJDYkLUYjNi4tRlU2Ji1GIzYoRistRiM2KC1GLDYlUSRzZXFGJ0Y0RjctRjs2LVEwJkFwcGx5RnVuY3Rpb247RidGN0Y+RkBGQkZERkZGSEZKL0ZNUSYwLjBlbUYnL0ZQRmBvLUZVNiQtRiM2KS1GVTYmLUYjNilGKy1GIzYoLUYsNiVRJlByb3BzRidGNEY3RlxvLUZVNiQtRiM2MkYrLUkjbXNHRiQ2I1EiSEYnLUY7Ni1RIixGJ0Y3Rj4vRkFRJXRydWVGJ0ZCRkRGRkZIRkpGX28vRlBRLDAuMzMzMzMzM2VtRictRmRwNiNRIlBGJ0ZncC1GLDYlUSJpRidGNEY3RmdwLUZkcDYjUSJRRidGZ3AtSSNtbkdGJDYkUSIxRidGN0ZncC1GZHA2I1EmUjEzNGFGJ0YrLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0Y2RjdGN0ZeckZhckY3RmdwRmFxRl5yRmFyRjdGNy8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0ZncC1GIzYpRmFxLUY7Ni1RIj1GJ0Y3Rj5GQEZCRkRGRkZIRkpGTEZPLUYjNigtRmhxNiRRIjBGJ0Y3LUY7Ni1RIy4uRidGN0Y+RkBGQkZERkZGSEZKL0ZNUSwwLjIyMjIyMjJlbUYnRmFvLUZocTYkUSU0MDMwRidGN0ZeckZhckY3RitGXnJGYXJGN0YrRl5yRmFyRjdGN0ZeckZhckY3RitGXnJGYXJGN0Y3RmNyRmZyRmdwLUYsNiVRKGNvbm5lY3RGJ0Y0RjdGW3MtRiw2JUZbcUY0RjdGZ3AtRiw2JVEqdGhpY2tuZXNzRidGNEY3RltzRmBzRl5yRmFyRjdGN0ZeckZhckY3LUY7Ni1RIjpGJ0Y3Rj5GQEZCRkRGRkZIRkpGTEZPRl5yRmFyRjc= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUTF0d29QaGFzZUVudlJpZ2h0RicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnRjcvJSZmZW5jZUdGNi8lKnNlcGFyYXRvckdGNi8lKXN0cmV0Y2h5R0Y2LyUqc3ltbWV0cmljR0Y2LyUobGFyZ2VvcEdGNi8lLm1vdmFibGVsaW1pdHNHRjYvJSdhY2NlbnRHRjYvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZOLUYsNiVRKnBvaW50cGxvdEYnRjRGNy1JKG1mZW5jZWRHRiQ2JC1GIzYuLUZVNiYtRiM2KEYrLUYjNigtRiw2JVEkc2VxRidGNEY3LUY7Ni1RMCZBcHBseUZ1bmN0aW9uO0YnRjdGPkZARkJGREZGRkhGSi9GTVEmMC4wZW1GJy9GUEZgby1GVTYkLUYjNiktRlU2Ji1GIzYpRistRiM2KC1GLDYlUSZQcm9wc0YnRjRGN0Zcby1GVTYkLUYjNjJGKy1JI21zR0YkNiNRIkhGJy1GOzYtUSIsRidGN0Y+L0ZBUSV0cnVlRidGQkZERkZGSEZKRl9vL0ZQUSwwLjMzMzMzMzNlbUYnLUZkcDYjUSJQRidGZ3AtRiw2JVEiaUYnRjRGN0ZncC1GZHA2I1EiUUYnRmdwLUkjbW5HRiQ2JFEiMEYnRjdGZ3AtRmRwNiNRJlIxMzRhRidGKy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUrZXhlY3V0YWJsZUdGNkY3RjdGXnJGYXJGN0ZncEZhcUZeckZhckY3RjcvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGZ3AtRiM2KUZhcS1GOzYtUSI9RidGN0Y+RkBGQkZERkZGSEZKRkxGTy1GIzYoRmdxLUY7Ni1RIy4uRidGN0Y+RkBGQkZERkZGSEZKL0ZNUSwwLjIyMjIyMjJlbUYnRmFvLUZocTYkUSU0MDQwRidGN0ZeckZhckY3RitGXnJGYXJGN0YrRl5yRmFyRjdGN0ZeckZhckY3RitGXnJGYXJGN0Y3RmNyRmZyRmdwLUYsNiVRKGNvbm5lY3RGJ0Y0RjdGW3MtRiw2JUZbcUY0RjdGZ3AtRiw2JVEqdGhpY2tuZXNzRidGNEY3RltzRmdxRl5yRmFyRjdGN0ZeckZhckY3LUY7Ni1RIjpGJ0Y3Rj5GQEZCRkRGRkZIRkpGTEZPRl5yRmFyRjc= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2JVEocXVhbGl0eUYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUSomY29sb25lcTtGJ0YyLyUmZmVuY2VHRjEvJSpzZXBhcmF0b3JHRjEvJSlzdHJldGNoeUdGMS8lKnN5bW1ldHJpY0dGMS8lKGxhcmdlb3BHRjEvJS5tb3ZhYmxlbGltaXRzR0YxLyUnYWNjZW50R0YxLyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGSS1GLDYlUSRzZXFGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2Ly1GLDYlUSpwb2ludHBsb3RGJ0YvRjItRlA2JC1GIzYyLUZQNiYtRiM2KC1GLDYjUSFGJy1GIzYoRkwtRjY2LVEwJkFwcGx5RnVuY3Rpb247RidGMkY5RjtGPUY/RkFGQ0ZFL0ZIUSYwLjBlbUYnL0ZLRmJvLUZQNiQtRiM2Ki1GUDYmLUYjNilGaW4tRiM2KC1GLDYlUSZQcm9wc0YnRi9GMkZeby1GUDYkLUYjNjJGaW4tSSNtc0dGJDYjUSJIRictRjY2LVEiLEYnRjJGOS9GPFEldHJ1ZUYnRj1GP0ZBRkNGRUZhby9GS1EsMC4zMzMzMzMzZW1GJy1GZnA2I1EiUEYnRmlwLUYsNiVRInBGJ0YvRjJGaXAtRmZwNiNRIlFGJ0ZpcC1GLDYlUSJxRidGL0YyRmlwLUZmcDYjUSZSMTM0YUYnRmluLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0YxRjJGMkZfckZickYyRmlwRmNxRl9yRmJyRjJGMi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0ZpcC1GIzYpRmNxLUY2Ni1RIj1GJ0YyRjlGO0Y9Rj9GQUZDRkVGR0ZKLUYjNigtSSNtbkdGJDYkUSM2MEYnRjItRjY2LVEjLi5GJ0YyRjlGO0Y9Rj9GQUZDRkUvRkhRLDAuMjIyMjIyMmVtRidGY28tRmJzNiRRJTQwMDBGJ0YyRl9yRmJyRjJGaW5GX3JGYnJGMkZpcC1GYnM2JFEkMTAwRidGMkZfckZickYyRjJGX3JGYnJGMkZpbkZfckZickYyRjJGZHJGZ3JGaXAtRiw2JVEoY29ubmVjdEYnRi9GMkZccy1GLDYlRl1xRi9GMkZpcC1GLDYlUSZjb2xvckYnRi9GMkZccy1GZnA2I1ErTGlnaHRHcmVlbkYnRmlwLUYsNiVRKnRoaWNrbmVzc0YnRi9GMkZccy1GYnM2JFEiMEYnRjJGX3JGYnJGMkYyRmlwRmlxRlxzLUZiczYkUSQwLjFGJ0YyRmVzLUZiczYkUSQwLjlGJ0YyRmlwRmF1Rl9yRmJyRjJGMi1GNjYtUSI6RidGMkY5RjtGPUY/RkFGQ0ZFRkdGSkZfckZickYy + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUSxxdWFsaXR5VGV4dEYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUSomY29sb25lcTtGJ0Y3LyUmZmVuY2VHRjYvJSpzZXBhcmF0b3JHRjYvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGNi8lKGxhcmdlb3BHRjYvJS5tb3ZhYmxlbGltaXRzR0Y2LyUnYWNjZW50R0Y2LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTi1GLDYlUSl0ZXh0cGxvdEYnRjRGNy1JKG1mZW5jZWRHRiQ2JC1GIzYpLUZVNiYtRiM2KEYrLUYjNigtRiw2JVEkc2VxRidGNEY3LUY7Ni1RMCZBcHBseUZ1bmN0aW9uO0YnRjdGPkZARkJGREZGRkhGSi9GTVEmMC4wZW1GJy9GUEZgby1GVTYkLUYjNiotRlU2Ji1GIzYsRistRiM2KC1GLDYlUSZQcm9wc0YnRjRGN0Zcby1GVTYkLUYjNjRGKy1JI21zR0YkNiNRIkhGJy1GOzYtUSIsRidGN0Y+L0ZBUSV0cnVlRidGQkZERkZGSEZKRl9vL0ZQUSwwLjMzMzMzMzNlbUYnLUZkcDYjUSJQRidGZ3AtSSNtbkdGJDYkUSQxNTBGJ0Y3RmdwLUZkcDYjUSJRRidGZ3AtRmJxNiRRJTAuMDFGJ0Y3LUY7Ni1RJyZzZG90O0YnRjdGPkZARkJGREZGRkhGSkZfb0Zhby1GLDYlUSJxRidGNEY3RmdwLUZkcDYjUSZSMTM0YUYnRisvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lK2V4ZWN1dGFibGVHRjZGN0Y3RmRyRmdyRjdGZ3BGYXFGZ3AtRiM2KC1GLDYlUShzcHJpbnRmRidGNEY3RlxvLUZVNiQtRiM2KUYrLUZkcDYjUSUlYSUlRidGZ3BGXnJGZHJGZ3JGN0Y3RmRyRmdyRjdGK0ZkckZnckY3RjcvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGZ3AtRiM2KUZeci1GOzYtUSI9RidGN0Y+RkBGQkZERkZGSEZKRkxGTy1GIzYoLUZicTYkUSMxMEYnRjctRjs2LVEjLi5GJ0Y3Rj5GQEZCRkRGRkZIRkovRk1RLDAuMjIyMjIyMmVtRidGYW8tRmJxNiRRIzkwRidGN0ZkckZnckY3RitGZHJGZ3JGN0ZncEZidEZkckZnckY3RjdGZHJGZ3JGN0YrRmRyRmdyRjdGN0Zlc0Zoc0ZncC1GIzYoLUYsNiVRJWZvbnRGJ0Y0RjdGXXQtRlU2Ji1GIzYoLUYsNiVRKkhlbHZldGljYUYnRjRGN0ZncC1GLDYlUSdOb3JtYWxGJ0Y0RjdGZHJGZ3JGN0Y3RmVzRmhzRmRyRmdyRjdGK0ZkckZnckY3RjdGZHJGZ3JGNy1GOzYtUSI6RidGN0Y+RkBGQkZERkZGSEZKRkxGT0ZkckZnckY3 + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUSZjeWNsZUYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUSomY29sb25lcTtGJ0Y3LyUmZmVuY2VHRjYvJSpzZXBhcmF0b3JHRjYvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGNi8lKGxhcmdlb3BHRjYvJS5tb3ZhYmxlbGltaXRzR0Y2LyUnYWNjZW50R0Y2LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTi1GLDYlUSpwb2ludHBsb3RGJ0Y0RjctSShtZmVuY2VkR0YkNiQtRiM2Mi1GVTYmLUYjNi4tRlU2Ji1GIzYoLUYsNiVRI2gxRidGNEY3LUY7Ni1RIixGJ0Y3Rj4vRkFRJXRydWVGJ0ZCRkRGRkZIRkovRk1RJjAuMGVtRicvRlBRLDAuMzMzMzMzM2VtRictRiw2JVEncHJlc3MxRidGNEY3LyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0Y2RjdGNy8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Zeby1GVTYmLUYjNigtRiw2JVEjaDJGJ0Y0RjdGXm8tRiw2JVEncHJlc3MyRidGNEY3RmpvRl1wRjdGN0ZfcEZicEZeby1GVTYmLUYjNigtRiw2JVEjaDNGJ0Y0RjdGXm9GXHFGam9GXXBGN0Y3Rl9wRmJwRl5vLUZVNiYtRiM2KEZjcUZeby1GLDYlUSdwcmVzczRGJ0Y0RjdGam9GXXBGN0Y3Rl9wRmJwRl5vRmduRmpvRl1wRjdGN0ZfcEZicEZeby1GLDYlUShjb25uZWN0RidGNEY3LUY7Ni1RIj1GJ0Y3Rj5GQEZCRkRGRkZIRkpGTEZPLUYsNiVGYm9GNEY3Rl5vLUYsNiVRJmNvbG9yRidGNEY3RmByLUkjbXNHRiQ2I1EoRGFya1JlZEYnRl5vLUYsNiVRKnRoaWNrbmVzc0YnRjRGN0Zgci1JI21uR0YkNiRRIjJGJ0Y3RmpvRl1wRjdGN0Zqb0ZdcEY3LUY7Ni1RIjpGJ0Y3Rj5GQEZCRkRGRkZIRkpGTEZPRmpvRl1wRjc= + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEoZGlzcGxheUYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSShtZmVuY2VkR0YkNiQtRiM2Si1GLDYlUSlpc290aGVybUYnRi9GMi1JI21vR0YkNi1RIixGJ0YyLyUmZmVuY2VHRjEvJSpzZXBhcmF0b3JHUSV0cnVlRicvJSlzdHJldGNoeUdGMS8lKnN5bW1ldHJpY0dGMS8lKGxhcmdlb3BHRjEvJS5tb3ZhYmxlbGltaXRzR0YxLyUnYWNjZW50R0YxLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdRLDAuMzMzMzMzM2VtRictRiw2JVEtaXNvdGhlcm1UZXh0RidGL0YyRj0tRiw2JVEwdHdvUGhhc2VFbnZMZWZ0RidGL0YyRj0tRiw2JVExdHdvUGhhc2VFbnZSaWdodEYnRi9GMkY9LUYsNiVRJmN5Y2xlRidGL0YyRj0tRiw2JVEocXVhbGl0eUYnRi9GMkY9LUYsNiVRLHF1YWxpdHlUZXh0RidGL0YyRj0tRiw2JVEldmlld0YnRi9GMi1GPjYtUSI9RidGMkZBL0ZERjFGRkZIRkpGTEZOL0ZRUSwwLjI3Nzc3NzhlbUYnL0ZURmpvLUY2NiYtRiM2Ki1GLDYjUSFGJy1GIzYoLUkjbW5HRiQ2JFEkMTUwRidGMi1GPjYtUSMuLkYnRjJGQUZob0ZGRkhGSkZMRk4vRlFRLDAuMjIyMjIyMmVtRicvRlRGUi1GZnA2JFEkNDYwRidGMi8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUrZXhlY3V0YWJsZUdGMUYyRj0tRiM2KC1GZnA2JFEkMTAwRidGMkZpcC1GZnA2JFElNTAwMEYnRjJGYnFGZXFGMkZgcEZicUZlcUYyRjIvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGPS1GLDYlUSZ0aXRsZUYnRi9GMkZlby1JI21zR0YkNiNRNlAtaC1UfkNoYXJ0fmZvcn5SMTM0YUYnRj0tRiw2JVEqdGl0bGVmb250RidGL0YyRmVvLUY2NiYtRiM2KC1GLDYlUSpIZWx2ZXRpY2FGJ0YvRjJGPS1GZnA2JFEjMTRGJ0YyRmJxRmVxRjJGMkZfckZickY9LUYsNiVRJ2xhYmVsc0YnRi9GMkZlby1GNjYmLUYjNipGYHAtRmlyNiNRMUVudGhhbHB5fihrSi9rZylGJ0Y9LUZpcjYjUS9QcmVzc3VyZX4oa1BhKUYnRmBwRmJxRmVxRjJGMkZfckZickY9LUYsNiVRMGxhYmVsZGlyZWN0aW9uc0YnRi9GMkZlby1GNjYmLUYjNigtRiw2JVEraG9yaXpvbnRhbEYnRi9GMkY9LUYsNiVRKXZlcnRpY2FsRidGL0YyRmJxRmVxRjJGMkZfckZickY9LUYsNiVRKmxhYmVsZm9udEYnRi9GMkZlby1GNjYmLUYjNihGY3NGPS1GZnA2JFEjMTJGJ0YyRmJxRmVxRjJGMkZfckZickZicUZlcUYyRjJGYnFGZXFGMg== + + +LSUlUExPVEc2Uy0lJVJPT1RHNictJSlCT1VORFNfWEc2IyQiJDUnISIiLSUpQk9VTkRTX1lHNiMkIiQhRyEiIi0lLUJPVU5EU19XSURUSEc2IyQiJSEpWyEiIi0lLkJPVU5EU19IRUlHSFRHNiMkIiVTTiEiIi0lKUNISUxEUkVORzYiLSUnQ1VSVkVTRzYkLSUmQ09MT1JHNiYlJFJHQkckIihedWknISIoJCIoXnVpJyEiKCQiKF51aSchIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNiQtJSZDT0xPUkc2JiUkUkdCRyQiKF51aSchIigkIihedWknISIoJCIoXnVpJyEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2W2dsNyQ3JCQiMExUSl41JUdWISM3JCIwW21oKFFXdyoqISM2NyQkIjBLaTg9KXlGViEjNyQiMHY2JFwlZnYpKiohIzY3JDckJCIwS2k4PSl5RlYhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjBiIXo4S2xGViEjNyQiL2wuJHAoKSoqKSoqISM1NyQ3JCQiMD5qaGslNEZWISM3JCIwLCsrKysrKyIhIzU3JCQiMGIhejhLbEZWISM3JCIvbC4kcCgpKiopKiohIzU3JDckJCIvTyZITyFIS1YhIzYkIjBpVydcZzczKiohIzY3JCQiMCdSS0JdLEtWISM3JCIwZSI9WGgiSCIqKiEjNjckNyQkIjAnUktCXSxLViEjNyQiMGUiPVhoIkgiKiohIzY3JCQiME5LKGZMJj5MJSEjNyQiMCJScUhuKlIiKiohIzY3JDckJCIwM0VBdC04TCUhIzckIjAlKnBlcGNgIyoqISM2NyQkIjBOSyhmTCY+TCUhIzckIjAiUnFIbipSIioqISM2NyQ3JCQiMDNFQXQtOEwlISM3JCIwJSpwZXBjYCMqKiEjNjckJCIweDo1XyMzSlYhIzckIjBqKmYjZUgjSCoqISM2NyQ3JCQiMCNHbiJlJGZJViEjNyQiLyRlbEMoelAqKiEjNTckJCIweDo1XyMzSlYhIzckIjBqKmYjZUgjSCoqISM2NyQ3JCQiMCNHbiJlJGZJViEjNyQiLyRlbEMoelAqKiEjNTckJCIwJTRSN3BASVYhIzckIjBAZmFtWFclKiohIzY3JDckJCIweTJLYigpKUhWISM3JCIwbVlzelAtJioqISM2NyQkIjAlNFI3cEBJViEjNyQiMEBmYW1YVyUqKiEjNjckNyQkIjB5MktiKCkpSFYhIzckIjBtWXN6UC0mKiohIzY3JCQiMDBuYltjJEhWISM3JCIwIls3TF5rZioqISM2NyQ3JCQiL3RNRFk9SFYhIzYkIjAtTnpNeUUnKiohIzY3JCQiMDBuYltjJEhWISM3JCIwIls3TF5rZioqISM2NyQ3JCQiL3RNRFk9SFYhIzYkIjAtTnpNeUUnKiohIzY3JCQiMCVwPCQ+LCZHViEjNyQiMCdwWlAiR1soKiohIzY3JDckJCIwYGV3eCVbR1YhIzckIjBRQicpKik9XigqKiEjNjckJCIwJXA8JD4sJkdWISM3JCIwJ3BaUCJHWygqKiEjNjckNyQkIjBgZXd4JVtHViEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBMVEpeNSVHViEjNyQiMFttaChRV3cqKiEjNjckNyQkIjAnZXc3LTxPViEjNyQiMF9qRzBbOSUpKiEjNjckJCIwSHkkM2BpTlYhIzckIjB4UjxSODImKSohIzY3JDckJCIwSHkkM2BpTlYhIzckIjB4UjxSODImKSohIzY3JCQiMGlDIip6KlxOViEjNyQiMC5UMS9qRyYpKiEjNjckNyQkIjAuNC55JypbTCUhIzckIjA4R0MlUjpqKSohIzY3JCQiMGlDIip6KlxOViEjNyQiMC5UMS9qRyYpKiEjNjckNyQkIjAuNC55JypbTCUhIzckIjA4R0MlUjpqKSohIzY3JCQiMERocngvWUwlISM3JCIwV1pmVnQibykqISM2NyQ3JCQiMFZWQ11yVEwlISM3JCIwXDtKXCVmdikqISM2NyQkIjBEaHJ4L1lMJSEjNyQiMFdaZlZ0Im8pKiEjNjckNyQkIjBWVkNdclRMJSEjNyQiL2w2JFwlZnYpKiEjNTckJCIwJSl5KEhfckxWISM3JCIwJ1tGeGlZJCkpKiEjNjckNyQkIjB0ZTFYXE1MJSEjNyQiMCdbIVEvTiEpKSkqISM2NyQkIjAlKXkoSF9yTFYhIzckIjAnW0Z4aVkkKSkqISM2NyQ3JCQiMHRlMVhcTUwlISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMDRCajVKR0wlISM3JCIwJlIvRjx1KSopKiEjNjckNyQkIjBZYm1nSUZMJSEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMDRCajVKR0wlISM3JCIwJlIvRjx1KSopKiEjNjckNyQkIjBZYm1nSUZMJSEjNyQiMEEkXCVmdi8hKiohIzY3JCQiL08mSE8hSEtWISM2JCIwaVcnXGc3MyoqISM2NyQ3JCQiMDh5RDFdK00lISM3JCIwMDI/al1qeCohIzY3JCQiMEhYJHojPSRSViEjNyQiMCd6SFExXil5KiEjNjckNyQkIjBIWCR6Iz0kUlYhIzckIjAnekhRMV4peSohIzY3JCQiMDI9RShbOVJWISM3JCIwUTBoMzg5eiohIzY3JDckJCIwQnE7KUhkUVYhIzckIjBMJykqKT1eNCEpKiEjNjckJCIwMj1FKFs5UlYhIzckIjBRMGgzODl6KiEjNjckNyQkIjBCcTspSGRRViEjNyQiMEwnKSopPV40ISkqISM2NyQkIjBEVD9iQyNRViEjNyQiMG4iPitZIW8hKSohIzY3JDckJCIwbmlLL0p5TCUhIzckIjBwdSdSPFI4KSohIzY3JCQiMERUP2JDI1FWISM3JCIwbiI+K1khbyEpKiEjNjckNyQkIjBuaUsvSnlMJSEjNyQiMHB1J1I8UjgpKiEjNjckJCIvZWZqKjR0TCUhIzYkIjA0d1d0eEAjKSohIzY3JDckJCIwXktFVyM0UFYhIzckIjAwai5IS2UjKSohIzY3JCQiL2Vmaio0dEwlISM2JCIwNHdXdHhAIykqISM2NyQ3JCQiMF5LRVcjNFBWISM3JCIwMGouSEtlIykqISM2NyQkIjBLMjUwLGtMJSEjNyQiMHYqUnBFYFApKiEjNjckNyQkIjAlR01jck5PViEjNyQiMFReNSVHRlEpKiEjNjckJCIwSzI1MCxrTCUhIzckIjB2KlJwRWBQKSohIzY3JDckJCIwJUdNY3JOT1YhIzckIjBUXjUlR0ZRKSohIzY3JCQiMCdldzctPE9WISM3JCIwX2pHMFs5JSkqISM2NyQ3JCQiMFIhUjcqSFJNJSEjNyQiMFBZdzQjeTcoKiEjNjckJCIwSmxrI0cnUU0lISM3JCIwem5UTG5RciohIzY3JDckJCIwSmxrI0cnUU0lISM3JCIveTtNdCdRciohIzU3JCQiMGhcNFJZUU0lISM3JCIwSEU7OU5UciohIzY3JDckJCIwZHNUcSc0VlYhIzckIjA7Y1speUlFKCohIzY3JCQiMGhcNFJZUU0lISM3JCIwSEU7OU5UciohIzY3JDckJCIwZHNUcSc0VlYhIzckIjA7Y1speUlFKCohIzY3JCQiMFl3Zl4kKkdNJSEjNyQiLyM0KVI1akgoKiEjNTckNyQkIi93Jyp6U0xVViEjNiQiMF9XYlZbKFEoKiEjNjckJCIwWXdmXiQqR00lISM3JCIvIzQpUjVqSCgqISM1NyQ3JCQiL3cnKnpTTFVWISM2JCIwX1diVlsoUSgqISM2NyQkIjBtUHRxWT5NJSEjNyQiMGIlZSdbMl51KiEjNjckNyQkIjBoZzskXGRUViEjNyQiMClHQicpKik9XigqISM2NyQkIjBtUHRxWT5NJSEjNyQiMGIlZSdbMl51KiEjNjckNyQkIjBoZzskXGRUViEjNyQiMClHQicpKik9XigqISM2NyQkIjBVSlAhZitUViEjNyQiMGY4JnlZY2coKiEjNjckNyQkIjA0QlFCPjNNJSEjNyQiMENAcGBIT3cqISM2NyQkIjBVSlAhZitUViEjNyQiMGY4JnlZY2coKiEjNjckNyQkIjA0QlFCPjNNJSEjNyQiMENAcGBIT3cqISM2NyQkIjAlRz5aNTJTViEjNyQiMCp5WCxHK3coKiEjNjckNyQkIjBKOFQncDFTViEjNyQiLyc0dzNxZ3gqISM1NyQkIjAlRz5aNTJTViEjNyQiMCp5WCxHK3coKiEjNjckNyQkIjBKOFQncDFTViEjNyQiLyc0dzNxZ3gqISM1NyQkIjA4eUQxXStNJSEjNyQiMDAyP2pdangqISM2NyQ3JCQiMG0tQXc0eU0lISM3JCIwNCkzTT1vXScqISM2NyQkIjBYJT0iZVp4TSUhIzckIjAqZnMhZWs7bCohIzY3JDckJCIwWCU9ImVaeE0lISM3JCIwKmZzIWVrO2wqISM2NyQkIjBwX3kqPXRaViEjNyQiMF8nKipbVSI+bCohIzY3JDckJCIwd2sjUk0ncE0lISM3JCIwTjk5ODBUbSohIzY3JCQiMHBfeSo9dFpWISM3JCIwXycqKltVIj5sKiEjNjckNyQkIjB3ayNSTSdwTSUhIzckIjBOOTk4MFRtKiEjNjckJCIwKDRpeTR2WVYhIzckIjBkUChwK11uJyohIzY3JDckJCIwYiEqXCJIPVlWISM3JCIwci1Ab1hsbiohIzY3JCQiMCg0aXk0dllWISM3JCIwZFAocCtdbicqISM2NyQ3JCQiMGIhKlwiSD1ZViEjNyQiMHItQG9YbG4qISM2NyQkIjBgYSQ+a3hYViEjNyQiMG5kdlxsSW8qISM2NyQ3JCQiMFkiSCcpZlNYViEjNyQiMDIiektpKSopbyohIzY3JCQiMGBhJD5reFhWISM3JCIwbmR2XGxJbyohIzY3JDckJCIwWSJIJylmU1hWISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwInosZSIzW00lISM3JCIwYXE4dDUnKXAqISM2NyQ3JCQiMCRvTUVFaldWISM3JCIwV3pNeUU5cSohIzY3JCQiMCJ6LGUiM1tNJSEjNyQiMGFxOHQ1JylwKiEjNjckNyQkIjAkb01FRWpXViEjNyQiMFd6TXlFOXEqISM2NyQkIjBSIVI3KkhSTSUhIzckIjBQWXc0I3k3KCohIzY3JDckJCIwI1wsNycqb15WISM3JCIvL2YiUigqKiplKiEjNTckJCIwd0ghUjkjNE4lISM3JCIwYXN6UC0+ZyohIzY3JDckJCIwd0ghUjkjNE4lISM3JCIwYXN6UC0+ZyohIzY3JCQiL1RfZUdzXVYhIzYkIjBaaWlBLV1nKiEjNjckNyQkIjA4aSxVQSxOJSEjNyQiMCI0bUdITTknKiEjNjckJCIvVF9lR3NdViEjNiQiMFppaUEtXWcqISM2NyQ3JCQiMDhpLFVBLE4lISM3JCIwIjRtR0hNOScqISM2NyQkIjAoKXBdPz4oXFYhIzckIjAmej1WNG0/JyohIzY3JDckJCIweVoqPXJLXFYhIzckIjBGXCR6TXlFJyohIzY3JCQiMCgpcF0/PihcViEjNyQiMCZ6PVY0bT8nKiEjNjckNyQkIjB5Wio9cktcViEjNyQiMEZcJHpNeUUnKiEjNjckJCIwKVwuZUBzW1YhIzckIjBZXHBaKUhPJyohIzY3JDckJCIwdDwuXk4mW1YhIzckIjBqUCsuQyNSJyohIzY3JCQiMClcLmVAc1tWISM3JCIwWVxwWilITycqISM2NyQ3JCQiMHQ8Ll5OJltWISM3JCIwalArLkMjUicqISM2NyQkIjBtLUF3NHlNJSEjNyQiMDQpM009b10nKiEjNjckNyQkIjA+Rj1ZcGJOJSEjNyQiMFpyW2cib0kmKiEjNjckJCIwQXEtdnRcTiUhIzckIjB1SVhpKnBSJiohIzY3JDckJCIwQXEtdnRcTiUhIzckIjB1SVhpKnBSJiohIzY3JCQiMD5dKT1eIltOJSEjNyQiMC0neSlRPUBhKiEjNjckNyQkIi8xIzNpYlROJSEjNiQiLyI+XzxTQGIqISM1NyQkIjA+XSk9XiJbTiUhIzckIjAtJ3kpUT1AYSohIzY3JDckJCIvMSMzaWJUTiUhIzYkIi8iPl88U0BiKiEjNTckJCIwemg4JTR5YFYhIzckIjAzXSZ6XCh5YiohIzY3JDckJCIwOFMkUThNYFYhIzckIjBZMmZzIWVrJiohIzY3JCQiMHpoOCU0eWBWISM3JCIwM10melwoeWIqISM2NyQ3JCQiMDhTJFE4TWBWISM3JCIwWTJmcyFlayYqISM2NyQkIjAyIVwuUHZfViEjNyQiMDFwKD0kNE9kKiEjNjckNyQkIjBVNG4oM2BfViEjNyQiMCNlZnc3LXgmKiEjNjckJCIwMiFcLlB2X1YhIzckIjAxcCg9JDRPZCohIzY3JDckJCIwVTRuKDNgX1YhIzckIjAjZWZ3Ny14JiohIzY3JCQiMEgnW0RMdF5WISM3JCIvTTppO0sqZSohIzU3JDckJCIwQyJIMVVzXlYhIzckIjA9JUdGPVkqZSohIzY3JCQiMEgnW0RMdF5WISM3JCIvTTppO0sqZSohIzU3JDckJCIwQyJIMVVzXlYhIzckIjA9JUdGPVkqZSohIzY3JCQiMCNcLDcnKm9eViEjNyQiLy9mIlIoKioqZSohIzU3JDckJCIwWFI7SlwlZlYhIzckIjA7PEAkKXpFWiohIzY3JCQiMDcyZV5CImZWISM3JCIwJCopM3JvXHglKiEjNjckNyQkIjA3MmVeQiJmViEjNyQiMCQqKTNyb1x4JSohIzY3JCQiLzQqKT5ULmZWISM2JCIwdlNMO0cpeSUqISM2NyQ3JCQiMEtLLmsmR2VWISM3JCIwSHg8VVAqKlsqISM2NyQkIi80Kik+VC5mViEjNiQiMHZTTDtHKXklKiEjNjckNyQkIjBLSy5rJkdlViEjNyQiMEh4PFVQKipbKiEjNjckJCIwRncmKSp5J3pOJSEjNyQiL0ozLHZvJVwqISM1NyQ3JCQiL2hkWDxYZFYhIzYkIjBsbEMoelAtJiohIzY3JCQiMEZ3JikqeSd6TiUhIzckIi9KMyx2byVcKiEjNTckNyQkIi9oZFg8WGRWISM2JCIwbGxDKHpQLSYqISM2NyQkIjBqKTRtKjNwTiUhIzckIjBPQXZZQjBeKiEjNjckNyQkIjA3I3AtPWljViEjNyQiMC1hSl89W14qISM2NyQkIjBqKTRtKjNwTiUhIzckIjBPQXZZQjBeKiEjNjckNyQkIjA3I3AtPWljViEjNyQiMC1hSl89W14qISM2NyQkIjBHUVRDZGVOJSEjNyQiMCJveThqTEUmKiEjNjckNyQkIjAuQlx5JnpiViEjNyQiMFFVUTJmc18qISM2NyQkIjBHUVRDZGVOJSEjNyQiMCJveThqTEUmKiEjNjckNyQkIjAuQlx5JnpiViEjNyQiMFFVUTJmc18qISM2NyQkIjA+Rj1ZcGJOJSEjNyQiMFpyW2cib0kmKiEjNjckNyQkIjBzXjk7SExPJSEjNyQiMGNmcy1WZlQqISM2NyQkIjB1YFRwOkRPJSEjNyQiMFxOJG9ZdEYlKiEjNjckNyQkIjB1YFRwOkRPJSEjNyQiMFxOJG9ZdEYlKiEjNjckJCIwJVE2Zm5HaVYhIzckIjAzJCo0M3g1ViohIzY3JDckJCIwOFBtYGg7TyUhIzckIjAmUS0+XzxTJSohIzY3JCQiMCVRNmZuR2lWISM3JCIwMyQqNDN4NVYqISM2NyQ3JCQiMDhQbWBoO08lISM3JCIwJlEtPl88UyUqISM2NyQkIjAiPVdQWD5oViEjNyQiME9Cd3k+cVcqISM2NyQ3JCQiMHp3aVk2M08lISM3JCIwQDcocGRoXyUqISM2NyQkIjAiPVdQWD5oViEjNyQiME9Cd3k+cVcqISM2NyQ3JCQiMHp3aVk2M08lISM3JCIwQDcocGRoXyUqISM2NyQkIjBLdDwqKTQsTyUhIzckIjAoWzstI1FIWSohIzY3JDckJCIwTi5hWGwqZlYhIzckIjBkKy9LY11ZKiEjNjckJCIwS3Q8Kik0LE8lISM3JCIwKFs7LSNRSFkqISM2NyQ3JCQiME4uYVhsKmZWISM3JCIwZCsvS2NdWSohIzY3JCQiMFhSO0pcJWZWISM3JCIwOzxAJCl6RVoqISM2NyQ3JCQiMClSRTYhNHNPJSEjNyQiMHpsMDhQL08qISM2NyQkIjB1Ly00XG9PJSEjNyQiMG8kKlsiPmBsJCohIzY3JDckJCIwdS8tNFxvTyUhIzckIjBvJCpbIj5gbCQqISM2NyQkIjAlUSpRbFduTyUhIzckIjA4S1YmMy1uJCohIzY3JDckJCIwIkhgKCpSKGZPJSEjNyQiMC8jZWxDKHpQKiEjNjckJCIwJVEqUWxXbk8lISM3JCIwOEtWJjMtbiQqISM2NyQ3JCQiMCJIYCgqUihmTyUhIzckIjAvI2VsQyh6UCohIzY3JCQiL19dUnVobFYhIzYkIjAtOk13dklRKiEjNjckNyQkIjBrJD5LSjVsViEjNyQiLy9GO0lUIVIqISM1NyQkIi9fXVJ1aGxWISM2JCIwLTpNd3ZJUSohIzY3JDckJCIwayQ+S0o1bFYhIzckIi8vRjtJVCFSKiEjNTckJCIwaWxkPilca1YhIzckIjBUKCpcNjAiKlIqISM2NyQ3JCQiME9QI29rQmtWISM3JCIwd2VwY2BHUyohIzY3JCQiMGlsZD4pXGtWISM3JCIwVCgqXDYwIipSKiEjNjckNyQkIjBPUCNva0JrViEjNyQiMHdlcGNgR1MqISM2NyQkIjBOMGIkb1FqViEjNyQiMCNbZSk9NF5UKiEjNjckNyQkIjBBN0woUlBqViEjNyQiMDdadzYlSDolKiEjNjckJCIwTjBiJG9RalYhIzckIjAjW2UpPTReVCohIzY3JDckJCIwQTdMKFJQalYhIzckIjA3Wnc2JUg6JSohIzY3JCQiMHNeOTtITE8lISM3JCIwY2ZzLVZmVCohIzY3JDckJCIwRHc1JykpM3JWISM3JCIwYjAiSG81MSQqISM2NyQkIi9ISjBEUnFWISM2JCIwQlNAcnBkSiohIzY3JDckJCIvSEowRFJxViEjNiQiMEJTQHJwZEoqISM2NyQkIjAjW1dwXj1xViEjNyQiLyVIY05uJz0kKiEjNTckNyQkIjA2JHBmLF1wViEjNyQiLydHR0U1I0ckKiEjNTckJCIwI1tXcF49cVYhIzckIi8lSGNObic9JCohIzU3JDckJCIwNiRwZixdcFYhIzckIi8nR0dFNSNHJCohIzU3JCQiMF49LGFIIXBWISM3JCIwLk5lUDhbTCohIzY3JDckJCIwdSwlZUBob1YhIzckIjAncF44M2xTJCohIzY3JCQiMF49LGFIIXBWISM3JCIwLk5lUDhbTCohIzY3JDckJCIwdSwlZUBob1YhIzckIjAncF44M2xTJCohIzY3JCQiL3hBM0EpeU8lISM2JCIwPjoyeks0TiohIzY3JDckJCIwbT5DWkd4TyUhIzckIjBLMFVPIjRgJCohIzY3JCQiL3hBM0EpeU8lISM2JCIwPjoyeks0TiohIzY3JDckJCIwbT5DWkd4TyUhIzckIjBLMFVPIjRgJCohIzY3JCQiMClSRTYhNHNPJSEjNyQiMHpsMDhQL08qISM2NyQ3JCQiMF4pKTNyb1xQJSEjNyQiMGwhUTxUIkhEKiEjNjckJCIwQkhkXz9cUCUhIzckIjBWKXBlcGNgIyohIzY3JDckJCIwQkhkXz9cUCUhIzckIjBWKXBlcGNgIyohIzY3JCQiL08jW3MwXFAlISM2JCIwJXlZPypvUEQqISM2NyQ3JCQiLyhSPypmK3VWISM2JCIweidRNHYrbSMqISM2NyQkIi9PI1tzMFxQJSEjNiQiMCV5WT8qb1BEKiEjNjckNyQkIi8oUj8qZit1ViEjNiQiMHonUTR2K20jKiEjNjckJCIwajtYIT1ydFYhIzckIjA8XSk9eC5xIyohIzY3JDckJCIwWSs/JmY0dFYhIzckIjA6disxWyV5IyohIzY3JCQiMGo7WCE9cnRWISM3JCIwPF0pPXgucSMqISM2NyQ3JCQiMFkrPyZmNHRWISM3JCIwOnYrMVsleSMqISM2NyQkIi9makFtX3NWISM2JCIwZSIqeVx5aUcqISM2NyQ3JCQiMG1KZVAhPnNWISM3JCIwXmoyaCkpM0gqISM2NyQkIi9makFtX3NWISM2JCIwZSIqeVx5aUcqISM2NyQ3JCQiMG1KZVAhPnNWISM3JCIwXmoyaCkpM0gqISM2NyQkIjA0MC0zXThQJSEjNyQiMChbJlxkIlwtJCohIzY3JDckJCIwJ1sqKkgjKkdyViEjNyQiMCg9WGgiSExJKiEjNjckJCIwNDAtM104UCUhIzckIjAoWyZcZCJcLSQqISM2NyQ3JCQiMCdbKipIIypHclYhIzckIjAoPVhoIkhMSSohIzY3JCQiMER3NScpKTNyViEjNyQiMGIwIkhvNTEkKiEjNjckNyQkIjB5KzJjWyl5ViEjNyQiMEAmKmZjQzM/KiEjNjckJCIwL3h4OkMneVYhIzckIjApXCVmdi9RPyohIzY3JDckJCIwL3h4OkMneVYhIzckIjApXCVmdi9RPyohIzY3JCQiMDAraFJgJnlWISM3JCIwL2JwPV5aPyohIzY3JDckJCIwREolZThweFYhIzckIjBNTG1JWGlAKiEjNjckJCIwMCtoUmAmeVYhIzckIjAvYnA9Xlo/KiEjNjckNyQkIjBESiVlOHB4ViEjNyQiME1MbUlYaUAqISM2NyQkIjBSQk5PR3RQJSEjNyQiMHNDYHU+NkEqISM2NyQ3JCQiMHQmenVKd3dWISM3JCIwckB0JmVvRyMqISM2NyQkIjBSQk5PR3RQJSEjNyQiMHNDYHU+NkEqISM2NyQ3JCQiMHQmenVKd3dWISM3JCIwckB0JmVvRyMqISM2NyQkIjBkRFZWN2hQJSEjNyQiMGhdVDZmdUIqISM2NyQ3JCQiMG9ZWWRSZVAlISM3JCIwMjUhM2s3VCMqISM2NyQkIjBkRFZWN2hQJSEjNyQiMGhdVDZmdUIqISM2NyQ3JCQiMG9ZWWRSZVAlISM3JCIwMjUhM2s3VCMqISM2NyQkIjBeKSkzcm9cUCUhIzckIjBsIVE8VCJIRCohIzY3JDckJCIwLzgwVEdGUSUhIzckIjAzIlF1SXpcIiohIzY3JCQiMFY6byc+UyNRJSEjNyQiMGEiPmBEL2EiKiEjNjckNyQkIjBWOm8nPlMjUSUhIzckIjBhIj5gRC9hIiohIzY3JCQiL1g0cmlII1ElISM2JCIwOEZ0PUdhOiohIzY3JDckJCIwKGZHUi9YIlElISM3JCIvKnpRNSRbbSIqISM1NyQkIi9YNHJpSCNRJSEjNiQiMDhGdD1HYToqISM2NyQ3JCQiMChmR1IvWCJRJSEjNyQiLyp6UTUkW20iKiEjNTckJCIwLSlHXSlRNVElISM3JCIwXykpcGYrPjwqISM2NyQ3JCQiMG9FR2wuMFElISM3JCIwRW9YbEIqeSIqISM2NyQkIjAtKUddKVE1USUhIzckIjBfKSlwZis+PCohIzY3JDckJCIwb0VHbC4wUSUhIzckIjBFb1hsQip5IiohIzY3JCQiMHgjUj00enpWISM3JCIwPjo0ZVUkKT0qISM2NyQ3JCQiMEEqeXM6Y3pWISM3JCIwaWNfP2s4PiohIzY3JCQiMHgjUj00enpWISM3JCIwPjo0ZVUkKT0qISM2NyQ3JCQiMEEqeXM6Y3pWISM3JCIwaWNfP2s4PiohIzY3JCQiMHkrMmNbKXlWISM3JCIwQCYqZmNDMz8qISM2NyQ3JCQiMEpELkUzbVElISM3JCIwRHNCTCR5KjQqISM2NyQkIjAoSDg6ZUQnUSUhIzckIjA0US9OIUcvIiohIzY3JDckJCIwKEg4OmVEJ1ElISM3JCIwNFEvTiFHLyIqISM2NyQkIjBleDZpUWhRJSEjNyQiLzNrRGl5MCIqISM1NyQ3JCQiMCYpZUU0JkcmUSUhIzckIjBYRTYhNHM7IiohIzY3JCQiMGV4NmlRaFElISM3JCIvM2tEaXkwIiohIzU3JDckJCIwJillRTQmRyZRJSEjNyQiMFhFNiE0czsiKiEjNjckJCIwaCpceHUlW1ElISM3JCIwKXkwbW5PQSIqISM2NyQ3JCQiMHAlUVAjPlZRJSEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMGgqXHh1JVtRJSEjNyQiMCl5MG1uT0EiKiEjNjckNyQkIjBwJVFQIz5WUSUhIzckIjAiWyI9WGgiSCIqISM2NyQkIjBMNHJBbU5RJSEjNyQiMG5FVGU6KlEiKiEjNjckNyQkIi96RjojZUxRJSEjNiQiMD0uRCstOzkqISM2NyQkIjBMNHJBbU5RJSEjNyQiMG5FVGU6KlEiKiEjNjckNyQkIi96RjojZUxRJSEjNiQiMD0uRCstOzkqISM2NyQkIjAvODBUR0ZRJSEjNyQiMDMiUXVJelwiKiEjNjckNyQkIjBkUCw2KVshUiUhIzckIjBLQ0xwZjIwKiEjNjckJCIvXCcpKmUoPSFSJSEjNiQiMGwlb1oiPVgwKiEjNjckNyQkIi9cJykqZSg9IVIlISM2JCIwbCVvWiI9WDAqISM2NyQkIjA8VWQlXDMhUiUhIzckIjBjNVsoMyJlMCohIzY3JDckJCIwIilbbD4oPipRJSEjNyQiMCx0JClwZXAxKiEjNjckJCIwPFVkJVwzIVIlISM3JCIwYzVbKDMiZTAqISM2NyQ3JCQiMCIpW2w+KD4qUSUhIzckIjAsdCQpcGVwMSohIzY3JCQiMHh3Pm5lKClRJSEjNyQiMDhgImVTXXMhKiEjNjckNyQkIjAmeU0pejYjKVElISM3JCIwUGghXCMqUnohKiEjNjckJCIweHc+bmUoKVElISM3JCIwOGAiZVNdcyEqISM2NyQ3JCQiMCZ5TSl6NiMpUSUhIzckIjBQaCFcIypSeiEqISM2NyQkIjBIMCc+RlcoUSUhIzckIjBhWGs5ayIqMyohIzY3JDckJCIwZl9aT0pzUSUhIzckIjB0XCgqelI9NCohIzY3JCQiMEgwJz5GVyhRJSEjNyQiMGFYazlrIiozKiEjNjckNyQkIjBmX1pPSnNRJSEjNyQiMHRcKCp6Uj00KiEjNjckJCIwSkQuRTNtUSUhIzckIjBEc0JMJHkqNCohIzY3JDckJCIwJSlcKmZ6TyVSJSEjNyQiMCpvQTlyby0hKiEjNjckJCIwRTpIPio+JVIlISM3JCIvNyRcJWZ2LyEqISM1NyQ3JCQiMEU6SD4qPiVSJSEjNyQiLzckXCVmdi8hKiEjNTckJCIwNCdwcipSVFIlISM3JCIwOk4jeXBbMCEqISM2NyQ3JCQiLyVSZGspPSRSJSEjNiQiMGM+Y1wnPjwhKiEjNjckJCIwNCdwcipSVFIlISM3JCIwOk4jeXBbMCEqISM2NyQ3JCQiLyVSZGspPSRSJSEjNiQiMGM+Y1wnPjwhKiEjNjckJCIwMEBHNHhGUiUhIzckIjBmITRNdkhBISohIzY3JDckJCIwZkolR0s9I1IlISM3JCIwI3pJWXFqSCEqISM2NyQkIjAwQEc0eEZSJSEjNyQiMGYhNE12SEEhKiEjNjckNyQkIjBmSiVHSz0jUiUhIzckIjAjeklZcWpIISohIzY3JCQiMF9aTylcVSJSJSEjNyQiMEM+dWJ0IVIhKiEjNjckNyQkIjAneXUuSD0iUiUhIzckIjBIJypwZng/LyohIzY3JCQiMF9aTylcVSJSJSEjNyQiMEM+dWJ0IVIhKiEjNjckNyQkIjAneXUuSD0iUiUhIzckIjBIJypwZng/LyohIzY3JCQiMGRQLDYpWyFSJSEjNyQiMEtDTHBmMjAqISM2NyQ3JCQiL0B3NHlDKVIlISM2JCIvNDF5RmBiKikhIzU3JCQiMEwpSFw4RShSJSEjNyQiMDdtR0hNdScqKSEjNjckNyQkIjBMKUhcOEUoUiUhIzckIjA3bUdITXUnKikhIzY3JCQiMFI7NWoycFIlISM3JCIwKm87Njp0ciopISM2NyQ3JCQiMFd1blVOaVIlISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwUjs1ajJwUiUhIzckIjAqbzs2OnRyKikhIzY3JDckJCIwV3VuVU5pUiUhIzckIjBbYU4lWygpeiopISM2NyQkIjAqNEFTeV4mUiUhIzckIjB2I3plJEcnKSkqKSEjNjckNyQkIi9IQUlaQCZSJSEjNiQiMCVHQyVSOkIqKikhIzY3JCQiMCo0QVN5XiZSJSEjNyQiMHYjemUkRycpKSopISM2NyQ3JCQiL0hBSVpAJlIlISM2JCIwJUdDJVI6QioqKSEjNjckJCIwJSlcKmZ6TyVSJSEjNyQiMCpvQTlyby0hKiEjNjckNyQkIjBQdSZmdzctVyEjNyQiLjdxV3EjNCopISIqNyQkIi8zIj5BPDlTJSEjNiQiMG43LDRzdyIqKSEjNjckNyQkIi8zIj5BPDlTJSEjNiQiMG43LDRzdyIqKSEjNjckJCIwKXorRGE6LFchIzckIjA9MUteKnk/KikhIzY3JDckJCIwaEtlSXEuUyUhIzckIjAuLDNrNywkKikhIzY3JCQiMCl6K0RhOixXISM3JCIwPTFLXip5PyopISM2NyQ3JCQiMGhLZUlxLlMlISM3JCIwLiwzazcsJCopISM2NyQkIjBzMEhORSgqUiUhIzckIjB5VFdKN3kkKikhIzY3JDckJCIwJj04XyhHJCpSJSEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMHMwSE5FKCpSJSEjNyQiMHlUV0o3eSQqKSEjNjckNyQkIjAmPThfKEckKlIlISM3JCIwUipbIj5gRCUqKSEjNjckJCIwZDB1KCkzJClSJSEjNyQiMCdRdEp6emEqKSEjNjckNyQkIjBld0VfI0gpUiUhIzckIjB3eEB1JCpcJiopISM2NyQkIjBkMHUoKTMkKVIlISM3JCIwJ1F0Snp6YSopISM2NyQ3JCQiMGV3RV8jSClSJSEjNyQiMHd4QHUkKlwmKikhIzY3JCQiL0B3NHlDKVIlISM2JCIvNDF5RmBiKikhIzU3JDckJCIwaidRNHYrMVchIzckIjBNKSk9WGdRJykpISM2NyQkIjA3T0Y9ZWNTJSEjNyQiMEJmdCkpNHonKSkhIzY3JDckJCIwN09GPWVjUyUhIzckIjBCZnQpKTR6JykpISM2NyQkIi9HP25lXzBXISM2JCIwVjsoXFVYcCkpISM2NyQ3JCQiMDRLNHkqZS9XISM3JCIwZlohUS9OISkpKSEjNjckJCIvRz9uZV8wVyEjNiQiMFY7KFxVWHApKSEjNjckNyQkIjA0SzR5KmUvVyEjNyQiMGZaIVEvTiEpKSkhIzY3JCQiMCYqR1kkZTAvVyEjNyQiMEFBKClRM20pKSkhIzY3JDckJCIwZUYiem9fLlchIzckIjAmZnQpKTR6IyopKSEjNjckJCIwJipHWSRlMC9XISM3JCIwQUEoKVEzbSkpKSEjNjckNyQkIjBlRiJ6b18uVyEjNyQiMCZmdCkpNHojKikpISM2NyQkIjAnR284emYtVyEjNyQiMG56QnBCUCEqKSEjNjckNyQkIjBgYCdSJXBDUyUhIzckIjBKQyVSOkIwKikhIzY3JCQiMCdHbzh6Zi1XISM3JCIwbnpCcEJQISopISM2NyQ3JCQiMGBgJ1IlcENTJSEjNyQiMEpDJVI6QjAqKSEjNjckJCIwUHUmZnc3LVchIzckIi43cVdxIzQqKSEiKjckNyQkIi8qKT5mdCkpNFchIzYkIjBMLCo+UEY+KSkhIzY3JCQiMCR6KFt3JiopM1chIzckIjA5JUhOIyllSSkpISM2NyQ3JCQiMCR6KFt3JiopM1chIzckIjA5JUhOIyllSSkpISM2NyQkIjAsWSdlPV4zVyEjNyQiMF5nN3IpKlwkKSkhIzY3JDckJCIwRT9CLTZ5UyUhIzckIi9EKWZ5R0klKSkhIzU3JCQiMCxZJ2U9XjNXISM3JCIwXmc3cikqXCQpKSEjNjckNyQkIjBFP0ItNnlTJSEjNyQiL0QpZnlHSSUpKSEjNTckJCIwUSF5YTwsMlchIzckIjBNM0NGXEEmKSkhIzY3JDckJCIveWd6PXQxVyEjNiQiMCgzbk8kcGEmKSkhIzY3JCQiMFEheWE8LDJXISM3JCIwTTNDRlxBJikpISM2NyQ3JCQiL3lnej10MVchIzYkIjAoM25PJHBhJikpISM2NyQkIjBqJ1E0disxVyEjNyQiME0pKT1YZ1EnKSkhIzY3JDckJCIwOzYhNHN3OFchIzckIjBZTyc0K1x2KCkhIzY3JCQiMGwuXTshSDhXISM3JCIvMmFLZyMzeSkhIzU3JDckJCIwbC5dOyFIOFchIzckIi8yYUtnIzN5KSEjNTckJCIwWTc2RitKVCUhIzckIi88a09YJ0h5KSEjNTckNyQkIjB6I1EnMyQ9N1chIzckIjAxSEtlbUt6KSEjNjckJCIwWTc2RitKVCUhIzckIi88a09YJ0h5KSEjNTckNyQkIjB6I1EnMyQ9N1chIzckIjAxSEtlbUt6KSEjNjckJCIwJ3luaWhiNlchIzckIjBuNWo+Yy4hKSkhIzY3JDckJCIwQFIpWzwzNlchIzckIjBVPFI4MmQhKSkhIzY3JCQiMCd5bmloYjZXISM3JCIwbjVqPmMuISkpISM2NyQ3JCQiMEBSKVs8MzZXISM3JCIwVTxSODJkISkpISM2NyQkIjBCP2o1RCtUJSEjNyQiMFRFXisxeCIpKSEjNjckNyQkIjBOXCI0aCkqNFchIzckIjB5MFlvWiI9KSkhIzY3JCQiMEI/ajVEK1QlISM3JCIwVEVeKzF4IikpISM2NyQ3JCQiME5cIjRoKSo0VyEjNyQiMHkwWW9aIj0pKSEjNjckJCIvKik+ZnQpKTRXISM2JCIwTCwqPlBGPikpISM2NyQ3JCQiMFZCKWVxazxXISM3JCIwdVM/c3BDdCkhIzY3JCQiMEZNMCdcaztXISM3JCIwaHYvUS9OdSkhIzY3JDckJCIwRk0wJ1xrO1chIzckIjBodi9RL051KSEjNjckJCIwWjRzO1BpVCUhIzckIjA+OihIXi1bKCkhIzY3JDckJCIwOCpmTTRfOlchIzckIjAoUjtKXCVmdikhIzY3JCQiMFo0cztQaVQlISM3JCIwPjooSF4tWygpISM2NyQ3JCQiMDgqZk00XzpXISM3JCIwKFI7SlwlZnYpISM2NyQkIi9YJTN6Z1lUJSEjNiQiMGVUXEQ/YncpISM2NyQ3JCQiMF9CJFxGUzlXISM3JCIwTV89WyZRbygpISM2NyQkIi9YJTN6Z1lUJSEjNiQiMGVUXEQ/YncpISM2NyQ3JCQiMF9CJFxGUzlXISM3JCIwTV89WyZRbygpISM2NyQkIjA7NiE0c3c4VyEjNyQiMFlPJzQrXHYoKSEjNjckNyQkIjBwTiczcF9AVyEjNyQiMGMkNEVwPiFwKSEjNjckJCIwRCtRXik+QFchIzckIjA8QXg8VVBwKSEjNjckNyQkIjBEK1FeKT5AVyEjNyQiMDxBeDxVUHApISM2NyQkIjBHaXcyaDVVJSEjNyQiMEEpPlVlQiZwKSEjNjckNyQkIjBLdC1KXitVJSEjNyQiMGA1JUdGPTEoKSEjNjckJCIwR2l3Mmg1VSUhIzckIjBBKT5VZUImcCkhIzY3JDckJCIwS3QtSl4rVSUhIzckIjBgNSVHRj0xKCkhIzY3JCQiMD5gWFRQJT5XISM3JCIwYSIzIWYjKUdyKSEjNjckNyQkIjBLXnIzNSo9VyEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMD5gWFRQJT5XISM3JCIwYSIzIWYjKUdyKSEjNjckNyQkIjBLXnIzNSo9VyEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMFxWdSN5I3lUJSEjNyQiMChRJlI/JVtJKCkhIzY3JDckJCIwbEZoIVt4PFchIzckIjBEKHlIUTFKKCkhIzY3JCQiMFxWdSN5I3lUJSEjNyQiMChRJlI/JVtJKCkhIzY3JDckJCIwbEZoIVt4PFchIzckIjBEKHlIUTFKKCkhIzY3JCQiMFZCKWVxazxXISM3JCIwdVM/c3BDdCkhIzY3JDckJCIwJ3pXZW5TRFchIzckIjBsJlEmW1InWycpISM2NyQkIjBrMWZydVlVJSEjNyQiMDNkY18/a2wpISM2NyQ3JCQiMGsxZnJ1WVUlISM3JCIwM2RjXz9rbCkhIzY3JCQiMFwkeXg5T0NXISM3JCIvJ0h2O3MoZicpISM1NyQ3JCQiL09dcCo0TlUlISM2JCIwWFhqMmgpbycpISM2NyQkIjBcJHl4OU9DVyEjNyQiLydIdjtzKGYnKSEjNTckNyQkIi9PXXAqNE5VJSEjNiQiMFhYajJoKW8nKSEjNjckJCIwJlJuJT0uRlUlISM3JCIvUCRbJipIdm4pISM1NyQ3JCQiMFkzZ0leQlUlISM3JCIwIlEuRjtJIm8pISM2NyQkIjAmUm4lPS5GVSUhIzckIi9QJFsmKkh2bikhIzU3JDckJCIwWTNnSV5CVSUhIzckIjAiUS5GO0kibykhIzY3JCQiMHBOJzNwX0BXISM3JCIwYyQ0RXA+IXApISM2NyQ3JCQiMEFnIzNtR0hXISM3JCIwPUtGRnF4ZykhIzY3JCQiMDM4IjRVP0dXISM3JCIuI2Z0KSk0PicpISIqNyQ3JCQiMDM4IjRVP0dXISM3JCIuI2Z0KSk0PicpISIqNyQkIjBDdDdsSXhVJSEjNyQiMF8jUXV6M0MnKSEjNjckNyQkIjBLNCl6Oy1GVyEjNyQiME8hR0MlUjpqKSEjNjckJCIwQ3Q3bEl4VSUhIzckIjBfI1F1ejNDJykhIzY3JDckJCIwSzQpejstRlchIzckIjBPIUdDJVI6aikhIzY3JCQiMDEzIT1uLkVXISM3JCIwPEAsL2c+aykhIzY3JDckJCIwcDhaTFhlVSUhIzckIjBzb1woKnpSaykhIzY3JCQiMDEzIT1uLkVXISM3JCIwPEAsL2c+aykhIzY3JDckJCIwcDhaTFhlVSUhIzckIjBzb1woKnpSaykhIzY3JCQiMCd6V2VuU0RXISM3JCIwbCZRJltSJ1snKSEjNjckNyQkIjBccyFlaztMVyEjNyQiMEZaLGVzdmMpISM2NyQkIjB1PFdkJSpIViUhIzckIjBiUTNuTyRwJikhIzY3JDckJCIwdTxXZCUqSFYlISM3JCIwYlEzbk8kcCYpISM2NyQkIjAmcEY3cyJIViUhIzckIjBuQGEnZThxJikhIzY3JDckJCIvZkYueHlKVyEjNiQiMCNwX0BzeCJlKSEjNjckJCIwJnBGN3MiSFYlISM3JCIwbkBhJ2U4cSYpISM2NyQ3JCQiL2ZGLnh5SlchIzYkIjAjcF9Ac3giZSkhIzY3JCQiMCJIJ1IjNDxKVyEjNyQiMDsiNDBlPCllKSEjNjckNyQkIi8xU2VyZUlXISM2JCIwRzpBeDxVZikhIzY3JCQiMCJIJ1IjNDxKVyEjNyQiMDsiNDBlPCllKSEjNjckNyQkIi8xU2VyZUlXISM2JCIwRzpBeDxVZikhIzY3JCQiMHonbzkuV0hXISM3JCIwQyVvcWE7MScpISM2NyQ3JCQiMEoiWyYqR1JIVyEjNyQiMGsuSEtlbWcpISM2NyQkIjB6J285LldIVyEjNyQiMEMlb3FhOzEnKSEjNjckNyQkIjBKIlsmKkdSSFchIzckIjBrLkhLZW1nKSEjNjckJCIwQWcjM21HSFchIzckIjA9S0ZGcXhnKSEjNjckNyQkIjB2JSl5SVlxViUhIzckIjBMUU9RPyFHJikhIzY3JCQiMCczaCs2bE9XISM3JCIwWnQoPV0sSyYpISM2NyQ3JCQiMCczaCs2bE9XISM3JCIwWnQoPV0sSyYpISM2NyQkIjBGSUVAcGtWJSEjNyQiMC0keVlhJ1FgKSEjNjckNyQkIjAqbzIoKWVVTlchIzckIjAkPVlwYlhXJikhIzY3JCQiMEZJRUBwa1YlISM3JCIwLSR5WWEnUWApISM2NyQ3JCQiMCpvMigpZVVOVyEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwditibyVvTVchIzckIjA0a3Qqei1fJikhIzY3JDckJCIwViR6KDQyVVYlISM3JCIwPl0sNycqb2IpISM2NyQkIjB2K2JvJW9NVyEjNyQiMDRrdCp6LV8mKSEjNjckNyQkIjBVJHooNDJVViUhIzckIjA+XSw3JypvYikhIzY3JCQiMFxzIWVrO0xXISM3JCIwRlosZXN2YykhIzY3JDckJCIwLShwZGgjNFclISM3JCIwZTM6ISkpMypbKSEjNjckJCIwLTtbPmouVyUhIzckIjBSM25PJHAlXCkhIzY3JDckJCIwLTtbPmouVyUhIzckIjBSM25PJHAlXCkhIzY3JCQiMGAnW2AjKTRTVyEjNyQiMFcqXCwhW3RcKSEjNjckNyQkIjBlQSE9JT4iUlchIzckIjB2J1I8UjgyJikhIzY3JCQiMGAnW2AjKTRTVyEjNyQiMFcqXCwhW3RcKSEjNjckNyQkIjBlQSE9JT4iUlchIzckIjB2J1I8UjgyJikhIzY3JCQiLy1PI1F1I1FXISM2JCIwYi1ucU9jXikhIzY3JDckJCIwbl8+OyMpeVYlISM3JCIwNiYzb1dkPiYpISM2NyQkIi8tTyNRdSNRVyEjNiQiMGItbnFPY14pISM2NyQ3JCQiMG5fPjsjKXlWJSEjNyQiMDYmM29XZD4mKSEjNjckJCIwdiUpeUlZcVYlISM3JCIwTFFPUT8hRyYpISM2NyQ3JCQiMEc0disxW1clISM3JCIwbSNSO292XSUpISM2NyQkIjA9JzRzOThXVyEjNyQiL0xrOTxQZCUpISM1NyQ3JCQiMD0nNHM5OFdXISM3JCIvTGs5PFBkJSkhIzU3JCQiMEhfKGVvIVFXJSEjNyQiL255T2FkZyUpISM1NyQ3JCQiMEwmUkEqb0dXJSEjNyQiMG1KYEU3KXAlKSEjNjckJCIwSF8oZW8hUVclISM3JCIvbnlPYWRnJSkhIzU3JDckJCIwTCZSQSpvR1clISM3JCIwbUpgRTcpcCUpISM2NyQkIjA9RDFfVT5XJSEjNyQiMHVwdSpRKip5JSkhIzY3JDckJCIwMiZmKilIaFRXISM3JCIwLj9nIkdEI1spISM2NyQkIjA9RDFfVT5XJSEjNyQiMHVwdSpRKip5JSkhIzY3JDckJCIwMiZmKilIaFRXISM3JCIwLj9nIkdEI1spISM2NyQkIjAtKHBkaCM0VyUhIzckIjBlMzohKSkzKlspISM2NyQ3JCQiMGJAdCZlb1tXISM3JCIvSlt6USs4JSkhIzU3JCQiL0UrPmwmelclISM2JCIwQXlEMV0rVSkhIzY3JDckJCIvRSs+bCZ6VyUhIzYkIjBBeUQxXStVKSEjNjckJCIwKFxiOHdmWlchIzckIjB6ZU5ZUk5VKSEjNjckNyQkIjAkWyNIKlxuWVchIzckIjBlbUtoIVxLJSkhIzY3JCQiMChcYjh3ZlpXISM3JCIwemVOWVJOVSkhIzY3JDckJCIwJFsjSCpcbllXISM3JCIwZW1LaCFcSyUpISM2NyQkIi9PLGM7cFhXISM2JCIwIyl6W1AiNFUlKSEjNjckNyQkIjBVbSs9K2FXJSEjNyQiMCVcJlI7SlxXKSEjNjckJCIvTyxjO3BYVyEjNiQiMCMpeltQIjRVJSkhIzY3JDckJCIwVW0rPSthVyUhIzckIjAlXCZSO0pcVykhIzY3JCQiMEc0disxW1clISM3JCIwbSNSO292XSUpISM2NyQ3JCQiMCJRODJkY19XISM3JCIwcjQ8JSk0ZVApISM2NyQkIjBkaCh5KVE9WCUhIzckIjA4ODBUR0ZRKSEjNjckNyQkIjBkaCh5KVE9WCUhIzckIjA4ODBUR0ZRKSEjNjckJCIwSCgpUjl0OVglISM3JCIwXnc4bUppUSkhIzY3JDckJCIwOT9ZPVEwWCUhIzckIi86P2gqb15SKSEjNTckJCIwSCgpUjl0OVglISM3JCIwXnc4bUppUSkhIzY3JDckJCIwOT9ZPVEwWCUhIzckIi86P2gqb15SKSEjNTckJCIweEA1UkMmXFchIzckIi9WOiV6P1xTKSEjNTckNyQkIjA4I1wnSFcjXFchIzckIjAnKSopPV40d1MpISM2NyQkIjB4QDVSQyZcVyEjNyQiL1Y6JXo/XFMpISM1NyQ3JCQiMDgjXCdIVyNcVyEjNyQiMCcpKik9XjR3UykhIzY3JCQiMGJAdCZlb1tXISM3JCIvSlt6USs4JSkhIzU3JDckJCIwM1lwYlhrWCUhIzckIjBtQD0oXDpSJCkhIzY3JCQiMGBiKFshemRYJSEjNyQiMDBbJWVuU1gkKSEjNjckNyQkIjBgYihbIXpkWCUhIzckIjAwWyVlblNYJCkhIzY3JCQiMCo+OThoVmJXISM3JCIvPTsiXFYnWyQpISM1NyQ3JCQiMGYweCtmV1glISM3JCIwVE8iNHQleU4pISM2NyQkIjAqPjk4aFZiVyEjNyQiLz07IlxWJ1skKSEjNTckNyQkIjBmMHgrZldYJSEjNyQiMFRPIjR0JXlOKSEjNjckJCIwdUU3UFZNWCUhIzckIjBWeUJudHVPKSEjNjckNyQkIjBFMDwnZTlgVyEjNyQiMHhDKWZ5R3EkKSEjNjckJCIwdUU3UFZNWCUhIzckIjBWeUJudHVPKSEjNjckNyQkIjBFMDwnZTlgVyEjNyQiMHhDKWZ5R3EkKSEjNjckJCIwIlE4MmRjX1chIzckIjByNDwlKTRlUCkhIzY3JDckJCIwTWVuU0QuWSUhIzckIjBUZyEpKSo+SUkpISM2NyQkIjAsTFtbeChmVyEjNyQiMChIUTFeMzMkKSEjNjckNyQkIjAsTFtbeChmVyEjNyQiMChIUTFeMzMkKSEjNjckJCIwJWU1QyMqW2ZXISM3JCIweChmJkdtMkopISM2NyQ3JCQiMCo0PUd6VmVXISM3JCIwTHJxbEQwSykhIzY3JCQiMCVlNUMjKltmVyEjNyQiMHgoZiZHbTJKKSEjNjckNyQkIjAqND1HelZlVyEjNyQiMExycWxEMEspISM2NyQkIjBcRyR6N1hkVyEjNyQiMFovd1NUKEgkKSEjNjckNyQkIjAzcFNOMHJYJSEjNyQiMHBmeD9tSEwpISM2NyQkIjBcRyR6N1hkVyEjNyQiMFovd1NUKEgkKSEjNjckNyQkIjAzcFNOMHJYJSEjNyQiMHBmeD9tSEwpISM2NyQkIjAzWXBiWGtYJSEjNyQiMG1APShcOlIkKSEjNjckNyQkIjBocWxEMFVZJSEjNyQiMGs8RC8nUW4jKSEjNjckJCIvKnBMZk1RWSUhIzYkIjApeUphTXdxIykhIzY3JDckJCIvKnBMZk1RWSUhIzYkIjApeUphTXdxIykhIzY3JCQiMDBjKjRfampXISM3JCIwYy83RyJmcyMpISM2NyQ3JCQiMDwwVE92Q1klISM3JCIwQzFdKy9LRykhIzY3JCQiMDBjKjRfampXISM3JCIwYy83RyJmcyMpISM2NyQ3JCQiMDwwVE92Q1klISM3JCIwQzFdKy9LRykhIzY3JCQiMFAib0czYmhXISM3JCIwLSRmKkg6PEgpISM2NyQ3JCQiMCRbLzBLN2hXISM3JCIwaCVwYlhrJkgpISM2NyQkIjBQIm9HM2JoVyEjNyQiMC0kZipIOjxIKSEjNjckNyQkIjAkWy8wSzdoVyEjNyQiMGglcGJYayZIKSEjNjckJCIwTWVuU0QuWSUhIzckIjBUZyEpKSo+SUkpISM2NyQ3JCQiMChHUTFeM29XISM3JCIwZitIbk1BQikhIzY3JCQiMEcmKTNzXXpZJSEjNyQiL0dELT1XTCMpISM1NyQ3JCQiMEcmKTNzXXpZJSEjNyQiL0dELT1XTCMpISM1NyQkIjBfc1oibyh5WSUhIzckIjB5QSN6JzRUQikhIzY3JDckJCIwLjhEb3JsWSUhIzckIjA7VEhOIyllQykhIzY3JCQiMF9zWiJvKHlZJSEjNyQiMHlBI3onNFRCKSEjNjckNyQkIjAuOERvcmxZJSEjNyQiMDtUSE4jKWVDKSEjNjckJCIwRUNNdldkWSUhIzckIjAxZzllJ1FgIykhIzY3JDckJCIwMXJMeio+bFchIzckIjBfSE8hSEtlIykhIzY3JCQiMEVDTXZXZFklISM3JCIwMWc5ZSdRYCMpISM2NyQ3JCQiMDFyTHoqPmxXISM3JCIwX0hPIUhLZSMpISM2NyQkIjBocWxEMFVZJSEjNyQiMGs8RC8nUW4jKSEjNjckNyQkIjA5Jj5jXCc+WiUhIzckIjAjeS5RQ2IoPikhIzY3JCQiMEIjPio9RjJaJSEjNyQiMDN3M3FnJjMjKSEjNjckNyQkIjBCIz4qPUYyWiUhIzckIjAzdzNxZyYzIykhIzY3JCQiMDZSJSp6TitaJSEjNyQiMCp6bVtrdTkjKSEjNjckNyQkIjBjYkNXTiRwVyEjNyQiMFdrOkQsNUEpISM2NyQkIjA2UiUqek4rWiUhIzckIjAqem1ba3U5IykhIzY3JDckJCIwY2JDV04kcFchIzckIjBXazpELDVBKSEjNjckJCIwKEdRMV4zb1chIzckIjBmK0huTUFCKSEjNjckNyQkIi91KzFbJWVaJSEjNiQiMF5mL1lBTDspISM2NyQkIjBcJXBOQCVcWiUhIzckIjAqNCIpWyFSNzwpISM2NyQ3JCQiMFwlcE5AJVxaJSEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMDNeJT1uVXVXISM3JCIwQFZ6Mid5diIpISM2NyQ3JCQiMCJbUT0vYHRXISM3JCIwTypcKmZ6Tz0pISM2NyQkIjAzXiU9blV1VyEjNyQiMEBWejIneXYiKSEjNjckNyQkIjAiW1E9L2B0VyEjNyQiME4qXCpmek89KSEjNjckJCIwUlVRYTxBWiUhIzckIjB5PSxDNWA+KSEjNjckNyQkIjAkeVdoZjdzVyEjNyQiMHIoPV0sNyc+KSEjNjckJCIwUlVRYTxBWiUhIzckIjB5PSxDNWA+KSEjNjckNyQkIjAkeVdoZjdzVyEjNyQiMHIoPV0sNyc+KSEjNjckJCIwOSY+Y1wnPlolISM3JCIwI3kuUUNiKD4pISM2NyQ3JCQiMG4+ZWxDKHpXISM3JCIwaWBub0ImSCIpISM2NyQkIjAlKT1OcTsjelchIzckIjAiZnUnUjxSOCkhIzY3JDckJCIwJSk9TnE7I3pXISM3JCIwImZ1J1I8UjgpISM2NyQkIjAlUnZYLSMqeVchIzckIjBpKXApcCdcTyIpISM2NyQ3JCQiMF41TiNceXhXISM3JCIwRk11JXpOWSIpISM2NyQkIjAlUnZYLSMqeVchIzckIjBpKXApcCdcTyIpISM2NyQ3JCQiMF41TiNceXhXISM3JCIwRk11JXpOWSIpISM2NyQkIjBybk5EZ21aJSEjNyQiMGx4XCFRPWMiKSEjNjckNyQkIjA6TzRaZ2paJSEjNyQiMGpBIilcKXplIikhIzY3JCQiMHJuTkRnbVolISM3JCIwbHhcIVE9YyIpISM2NyQ3JCQiMDpPNFpnalolISM3JCIwakEiKVwpemUiKSEjNjckJCIvdSsxWyVlWiUhIzYkIjBeZi9ZQUw7KSEjNjckNyQkIjAkPmowWGckWyUhIzckIjA0Iio+TFJoNCkhIzY3JCQiMEJoYCxeTlslISM3JCIwJDNvV2RmJzQpISM2NyQ3JCQiMEJoYCxeTlslISM3JCIwJDNvV2RmJzQpISM2NyQkIjBwMSYzIj5OWyUhIzckIjAjM1ZtJnBvNCkhIzY3JDckJCIwc1hTNCo0I1slISM3JCIwPnBgSE8hNCIpISM2NyQkIjBwMSYzIj5OWyUhIzckIjAjM1ZtJnBvNCkhIzY3JDckJCIwc1hTNCo0I1slISM3JCIwPnBgSE8hNCIpISM2NyQkIi8qNGAuMjdbJSEjNiQiMDxdem1CbjYpISM2NyQ3JCQiMCwkZm5YbCFbJSEjNyQiMGJkZyVvWkAiKSEjNjckJCIvKjRgLjI3WyUhIzYkIjA8XXptQm42KSEjNjckNyQkIjAsJGZuWGwhWyUhIzckIjBiZGclb1pAIikhIzY3JCQiMG4+ZWxDKHpXISM3JCIwaWBub0ImSCIpISM2NyQ3JCQiL1VXYlZbKFslISM2JCIwKGVPWGA7aiEpISM2NyQkIjAqSCcqKSpIWidbJSEjNyQiMDYvTGs5PDIpISM2NyQ3JCQiMCpIJyopKkhaJ1slISM3JCIwNi9Mazk8MikhIzY3JCQiMGwjUnUwJ2VbJSEjNyQiMCZlbj03I3AyKSEjNjckNyQkIjA8SmVMM11bJSEjNyQiMFojKlI+YlQzKSEjNjckJCIwbCNSdTAnZVslISM3JCIwJmVuPTcjcDIpISM2NyQ3JCQiMDxKZUwzXVslISM3JCIwWiMqUj5iVDMpISM2NyQkIjAkPmowWGckWyUhIzckIjA0Iio+TFJoNCkhIzY3JDckJCIwWWNfP2s4XCUhIzckIjAiZnFwZ2RJISkhIzY3JCQiMCwlcEltITRcJSEjNyQiMC5SNypIUk0hKSEjNjckNyQkIjAsJXBJbSE0XCUhIzckIjAuUjcqSFJNISkhIzY3JCQiMGJsMF5CMVwlISM3JCIwUERIKnp3TyEpISM2NyQ3JCQiLzNEIXpAJSpbJSEjNiQiMFJGPmFMby8pISM2NyQkIjBibDBeQjFcJSEjNyQiMFBESCp6d08hKSEjNjckNyQkIi8zRCF6QCUqWyUhIzYkIjBSRj5hTG8vKSEjNjckJCIwQC5UIXpBKVslISM3JCIwIik9KVIqKilvMCkhIzY3JDckJCIwVDRvVVd6WyUhIzckIjB2OkU0dSNmISkhIzY3JCQiMEAuVCF6QSlbJSEjNyQiMCIpPSlSKiopbzApISM2NyQ3JCQiMFQ0b1VXelslISM3JCIwdjpFNHUjZiEpISM2NyQkIi9VV2JWWyhbJSEjNiQiMChlT1hgO2ohKSEjNjckNyQkIjB0b10wV19cJSEjNyQiLzo3dCZlJCkqeiEjNTckJCIwLzZGKFsqUVwlISM3JCIwSmkpKik9XjQhKSEjNjckNyQkIjAvNkYoWypRXCUhIzckIjBKaSkqKT1eNCEpISM2NyQkIjA8QlVuWklcJSEjNyQiL3J3eVdiOyEpISM1NyQ3JCQiMHpOOE8oUiNcJSEjNyQiMG5dMFdfPi0pISM2NyQkIjA8QlVuWklcJSEjNyQiL3J3eVdiOyEpISM1NyQ3JCQiMHpOOE8oUiNcJSEjNyQiMG5dMFdfPi0pISM2NyQkIjBZY18/azhcJSEjNyQiMCJmcXBnZEkhKSEjNjckNyQkIjAqNClbIVI3KlwlISM3JCIwaHhddjFsJ3ohIzY3JCQiMEgxWFdGJSlcJSEjNyQiMEIoelAtPnN6ISM2NyQ3JCQiMEgxWFdGJSlcJSEjNyQiMEIoelAtPnN6ISM2NyQkIjBEJHA6Mil6XCUhIzckIjA4Nyc9ZSZlKHohIzY3JDckJCIwSD45eTRwXCUhIzckIjBmJlspeUlZKXohIzY3JCQiMEQkcDoyKXpcJSEjNyQiMDg3Jz1lJmUoeiEjNjckNyQkIjBIPjl5NHBcJSEjNyQiMGYmWyl5SVkpeiEjNjckJCIwYmhoLipcJlwlISM3JCIwalBZdmBpKnohIzY3JDckJCIwa1MkZicqUiZcJSEjNyQiMCZSPFI4MigqeiEjNjckJCIwYmhoLipcJlwlISM3JCIwalBZdmBpKnohIzY3JDckJCIwa1MkZicqUiZcJSEjNyQiMCZSPFI4MigqeiEjNjckJCIwdG9dMFdfXCUhIzckIi86N3QmZSQpKnohIzU3JDckJCIwRSRwYVArLlghIzckIjBEWlw4JSpcJHohIzY3JCQiL2IlR1wiWyxYISM2JCIwXj9rODR0JXohIzY3JDckJCIvYiVHXCJbLFghIzYkIjBeP2s4NHQleiEjNjckJCIwX11BITRcK1ghIzckIjBeKT13a09ieiEjNjckNyQkIjBvOXdGXioqXCUhIzckIjAoKTNyb1woZnohIzY3JCQiMF9dQSE0XCtYISM3JCIwXik9d2tPYnohIzY3JDckJCIwbzl3Rl4qKlwlISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjAqNClbIVI3KlwlISM3JCIwaHhddjFsJ3ohIzY3JDckJCIwXzBYZyQpb10lISM3JCIvLlIoeUNRIXohIzU3JCQiMGUnejpBNjFYISM3JCIwVmJWWygpKjR6ISM2NyQ3JCQiMGUnejpBNjFYISM3JCIwVmJWWygpKjR6ISM2NyQkIjBCU0lqKmYwWCEjNyQiMENKblovVCJ6ISM2NyQ3JCQiMGtjaiU+Yy9YISM3JCIwelZdLkdDI3ohIzY3JCQiMEJTSWoqZjBYISM3JCIwQ0puWi9UInohIzY3JDckJCIwa2NqJT5jL1ghIzckIjB6Vl0uR0MjeiEjNjckJCIwSCQ+PSZISV0lISM3JCIwImZKd2Z5TXohIzY3JDckJCIwcyhvZyM+SV0lISM3JCIwOktkZW9bJHohIzY3JCQiMEgkPj0mSEldJSEjNyQiMCJmSndmeU16ISM2NyQ3JCQiMHMob2cjPkldJSEjNyQiMDpLZGVvWyR6ISM2NyQkIjBFJHBhUCsuWCEjNyQiMERaXDglKlwkeiEjNjckNyQkIjB6PFZYajJeJSEjNyQiMFVzN3BuSCh5ISM2NyQkIjBPXVlLSiM0WCEjNyQiLyh5SFExXil5ISM1NyQ3JCQiME9dWUtKIzRYISM3JCIvKHlIUTFeKXkhIzU3JCQiMCNSWVopKT4zWCEjNyQiMHdoMm5ITCp5ISM2NyQ3JCQiMCNlIj5ub3ddJSEjNyQiMDFuTyRwYSgqeSEjNjckJCIwI1JZWikpPjNYISM3JCIwd2gybkhMKnkhIzY3JDckJCIwI2UiPm5vd10lISM3JCIwMW5PJHBhKCp5ISM2NyQkIjBfMFhnJClvXSUhIzckIi8uUih5Q1EheiEjNTckNyQkIjAwSVRJVlleJSEjNyQiMDtzLlpHQyV5ISM2NyQkIjBLIVInKSplUl4lISM3JCIwaTg0dCV5WnkhIzY3JDckJCIwSyFSJykqZVJeJSEjNyQiMGk4NHQleVp5ISM2NyQkIjBSKUduIylbOFghIzckIjBiZDFJKVteeSEjNjckNyQkIjBXJkdca1A3WCEjNyQiMCk+ZyJHRC0neSEjNjckJCIwUilHbiMpWzhYISM3JCIwYmQxSSlbXnkhIzY3JDckJCIwVyZHXGtQN1ghIzckIjApPmciR0QtJ3khIzY3JCQiMGspeXd2IzNeJSEjNyQiMEYhcEUtWXN5ISM2NyQ3JCQiME0pPjs6ITNeJSEjNyQiME0hSEtlbXN5ISM2NyQkIjBrKXl3diMzXiUhIzckIjBGIXBFLVlzeSEjNjckNyQkIjBNKT47OiEzXiUhIzckIjBNIUhLZW1zeSEjNjckJCIwejxWWGoyXiUhIzckIjBVczdwbkgoeSEjNjckNyQkIjBLVVI6QiY9WCEjNyQiMDEleih6ekAieSEjNjckJCIwWms8NVVyXiUhIzckIi9wYEhPIUgjeSEjNTckNyQkIjBaazw1VXJeJSEjNyQiL3BgSE8hSCN5ISM1NyQkIjBYOmM0emheJSEjNyQiMCUpUiJSKD4vJHkhIzY3JDckJCIwQTtPU1piXiUhIzckIjBFRC09V2AkeSEjNjckJCIwWDpjNHpoXiUhIzckIjAlKVIiUig+LyR5ISM2NyQ3JCQiMEE7T1NaYl4lISM3JCIwRUQtPVdgJHkhIzY3JCQiMDBJVElWWV4lISM3JCIwO3MuWkdDJXkhIzY3JDckJCIwZmFQKy5DXyUhIzckIjBmdUMjNEEjeSghIzY3JCQiMERpUTBsPl8lISM3JCIwIz1aeD5lJnkoISM2NyQ3JCQiMERpUTBsPl8lISM3JCIwIz1aeD5lJnkoISM2NyQkIjAwciJwTWxAWCEjNyQiMDZZUUsmKXp5KCEjNjckNyQkIi91IVtyXS5fJSEjNiQiMD1nIkdELSl6KCEjNjckJCIwMHIicE1sQFghIzckIjA2WVFLJil6eSghIzY3JDckJCIvdSFbcl0uXyUhIzYkIjA9ZyJHRC0peighIzY3JCQiLyozU00rKj1YISM2JCIwPV5yamAjNHkhIzY3JDckJCIwJj1eISlSdT1YISM3JCIwYVspeUlZNXkhIzY3JCQiLyozU00rKj1YISM2JCIwPV5yamAjNHkhIzY3JDckJCIwJj1eISlSdT1YISM3JCIwYVspeUlZNXkhIzY3JCQiMEtVUjpCJj1YISM3JCIwMSV6KHp6QCJ5ISM2NyQ3JCQiMCZvY2BHR0VYISM3JCIwJWUlenNORHYoISM2NyQkIjBmSlQhM0BEWCEjNyQiL140dzNxZ3ghIzU3JDckJCIwZkpUITNARFghIzckIi9eNHczcWd4ISM1NyQkIjAxaTAoelZDWCEjNyQiMFUiPS9raG14ISM2NyQ3JCQiMCRbdiRlJWVCWCEjNyQiMFkkeUU5OXR4ISM2NyQkIjAxaTAoelZDWCEjNyQiMFUiPS9raG14ISM2NyQ3JCQiMCRbdiRlJWVCWCEjNyQiMFkkeUU5OXR4ISM2NyQkIjBmYVArLkNfJSEjNyQiMGZ1QyM0QSN5KCEjNjckNyQkIjA3ekxxaSxgJSEjNyQiMEswJEcqNEpzKCEjNjckJCIwKlIlXCVwN0lYISM3JCIwLUlTQXpMcyghIzY3JDckJCIwKlIlXCVwN0lYISM3JCIwLUlTQXpMcyghIzY3JCQiMC0lemIxNUlYISM3JCIwSjRtPHlOcyghIzY3JDckJCIweFZiUyJbR1ghIzckIjBRPVp4PmV0KCEjNjckJCIwLSV6YjE1SVghIzckIjBKNG08eU5zKCEjNjckNyQkIjB4VmJTIltHWCEjNyQiMFE9Wng+ZXQoISM2NyQkIjBCLjNlYHNfJSEjNyQiMCdSXE54OVh4ISM2NyQ3JCQiMGE5d1dWb18lISM3JCIwdTFhS2cjW3ghIzY3JCQiMEIuM2Vgc18lISM3JCIwJ1JcTng5WHghIzY3JDckJCIwYTl3V1ZvXyUhIzckIjB1MWFLZyNbeCEjNjckJCIwJm9jYEdHRVghIzckIjAlZSV6c05EdighIzY3JDckJCIwUSI+YEQvTVghIzckIjBhcnNXWFJwKCEjNjckJCIwImVgWk9WTFghIzckIi9MbEEiKVwpcCghIzU3JDckJCIwImVgWk9WTFghIzckIi9MbEEiKVwpcCghIzU3JCQiMHMjPnUtKUhgJSEjNyQiMCI+JylvVSE+cSghIzY3JDckJCIwZnouY3c8YCUhIzckIjBtVExuUTRyKCEjNjckJCIwcyM+dS0pSGAlISM3JCIwIj4nKW9VIT5xKCEjNjckNyQkIjBmei5jdzxgJSEjNyQiMG1UTG5RNHIoISM2NyQkIjA3ekxxaSxgJSEjNyQiMEswJEcqNEpzKCEjNjckNyQkIjBsLklTQXpgJSEjNyQiME50RHI+XW0oISM2NyQkIjApKnkxVWtuYCUhIzckIjBldzctPE9uKCEjNjckNyQkIjApKnkxVWtuYCUhIzckIjBldzctPE9uKCEjNjckJCIwKnpARDkqZWAlISM3JCIwPHRLREgsbyghIzY3JDckJCIwJXBdXGY0TlghIzckIjAlXCc+ZGRnbyghIzY3JCQiMCp6QEQ5KmVgJSEjNyQiMDx0S0RILG8oISM2NyQ3JCQiMCVwXVxmNE5YISM3JCIwJVwnPmRkZ28oISM2NyQkIjBRIj5gRC9NWCEjNyQiMGFyc1dYUnAoISM2NyQ3JCQiMCJmIkdELT1hJSEjNyQiL1ZFXU5LT3chIzU3JCQiMDhSOCIqPSxhJSEjNyQiMCcpKiopPmZ0W3chIzY3JDckJCIwOFI4Iio9LGElISM3JCIwJykqKik+ZnRbdyEjNjckJCIwJ2YjNEhNKVFYISM3JCIwJCopM1lERGV3ISM2NyQ3JCQiMGJfJlIjUiVRWCEjNyQiMEEpZXFrPGh3ISM2NyQkIjAnZiM0SE0pUVghIzckIjAkKikzWUREZXchIzY3JDckJCIwYl8mUiNSJVFYISM3JCIwQSllcWs8aHchIzY3JCQiMGsuSVNBemAlISM3JCIwTnREcj5dbSghIzY3JDckJCIwPUdFNSNvWFghIzckIjBWcFsnKWV5ZyghIzY3JCQiMDYheSkpWz5YWCEjNyQiMHlNeUU5OWgoISM2NyQ3JCQiMDYheSkpWz5YWCEjNyQiMHlNeUU5OWgoISM2NyQkIjBzcXE2O1thJSEjNyQiMEFBJzM1Pjl3ISM2NyQ3JCQiMDRvUHYnXFZYISM3JCIwOUImPVsmUWkoISM2NyQkIjBzcXE2O1thJSEjNyQiMEFBJzM1Pjl3ISM2NyQ3JCQiMDRvUHYnXFZYISM3JCIwOUImPVsmUWkoISM2NyQkIjA8dSc+ITQ9YSUhIzckIjAkemdyT0ZPdyEjNjckNyQkIjB6IVFvZyE9YSUhIzckIi86QHBgSE93ISM1NyQkIjA8dSc+ITQ9YSUhIzckIjAkemdyT0ZPdyEjNjckNyQkIjB6IVFvZyE9YSUhIzckIi86QHBgSE93ISM1NyQkIjAiZiJHRC09YSUhIzckIjBIay1iQmpqKCEjNjckNyQkIjBXU0MmPmNcWCEjNyQiMCY0PDdhZ3p2ISM2NyQkIjBIIlJoa2dbWCEjNyQiMDFlaztMbGUoISM2NyQ3JCQiMEgiUmhrZ1tYISM3JCIwMWVrO0xsZSghIzY3JCQiMDphXiVcJnlhJSEjNyQiMFVDRmcxP2YoISM2NyQ3JCQiMGNrb2IoKm9hJSEjNyQiMFRZcnJ0KilmKCEjNjckJCIwOmFeJVwmeWElISM3JCIwVUNGZzE/ZighIzY3JDckJCIwY2tvYigqb2ElISM3JCIwVFlycnQqKWYoISM2NyQkIjA9R0U1I29YWCEjNyQiMFZwWycpZXlnKCEjNjckNyQkIjByX0EhPVdgWCEjNyQiMEhvMmNhOmIoISM2NyQkIjAnZjp1Li9fWCEjNyQiMEwiM2w/bGh2ISM2NyQ3JCQiMCdmOnUuL19YISM3JCIwTCIzbD9saHYhIzY3JCQiMERSJz1iIzRiJSEjNyQiMEJLblM/KHB2ISM2NyQ3JCQiMCpleDM0S11YISM3JCIwcHBkaCM0dXYhIzY3JCQiMERSJz1iIzRiJSEjNyQiMEJLblM/KHB2ISM2NyQ3JCQiMCpleDM0S11YISM3JCIwcHBkaCM0dXYhIzY3JCQiMFdTQyY+Y1xYISM3JCIwJjQ8N2FnenYhIzY3JDckJCIwKFwxXztLZFghIzckIjApWzYhKikqcEJ2ISM2NyQkIjA2WSoqR0xzYiUhIzckIjBEO0lUSVZfKCEjNjckNyQkIjA2WSoqR0xzYiUhIzckIjBEO0lUSVZfKCEjNjckJCIwR2NudWhyYiUhIzckIjBAXjs5VltfKCEjNjckNyQkIjAvKlEmPSdcYlghIzckIjBoL1AnNHhPdiEjNjckJCIwR2NudWhyYiUhIzckIjBAXjs5VltfKCEjNjckNyQkIjAvKlEmPSdcYlghIzckIjBoL1AnNHhPdiEjNjckJCIwLmpBInktYVghIzckIjA9XTtdS3RhKCEjNjckNyQkIjBiZiR5andgWCEjNyQiMChIUjk6QFx2ISM2NyQkIjAuakEieS1hWCEjNyQiMD1dO11LdGEoISM2NyQ3JCQiMGJmJHlqd2BYISM3JCIwKEhSOTpAXHYhIzY3JCQiMHJfQSE9V2BYISM3JCIwSG8yY2E6YighIzY3JDckJCIwQ3g9XSw3YyUhIzckIjAyTi15UGdcKCEjNjckJCIwLnptZj8yYyUhIzckIjBgUjtKXCUqXCghIzY3JDckJCIwLnptZj8yYyUhIzckIjBgUjtKXCUqXCghIzY3JCQiMCkpZkUsRi5jJSEjNyQiLiwhPkxELXYhIio3JDckJCIwX1wjUk0oKmVYISM3JCIwKnlLaSkqKT1eKCEjNjckJCIwKSlmRSxGLmMlISM3JCIuLCE+TEQtdiEiKjckNyQkIjBfXCNSTSgqZVghIzckIjAqeUtpKSopPV4oISM2NyQkIjAoXDFfO0tkWCEjNyQiMClbNiEqKSpwQnYhIzY3JDckJCIvJipvXjgzbFghIzYkIjBqVEJAYCZvdSEjNjckJCIwKT0oemlHVWMlISM3JCIwIkdFNSNvWFooISM2NyQ3JCQiMCk9KHppR1VjJSEjNyQiMCJHRTUjb1haKCEjNjckJCIwdVY2UkJOYyUhIzckIi93T05QY3p1ISM1NyQ3JCQiMCY9JWVsckNjJSEjNyQiMDxeNHczcVsoISM2NyQkIjB1VjZSQk5jJSEjNyQiL3dPTlBjenUhIzU3JDckJCIwJj0lZWxyQ2MlISM3JCIwPF40dzNxWyghIzY3JCQiMEN4PV0sN2MlISM3JCIwMk4teVBnXCghIzY3JDckJCIweCw6P2gqb1ghIzckIjBRY3BWUTdXKCEjNjckJCIwNmEtKW92blghIzckIjA0JykpM3JvXHUhIzY3JDckJCIwNmEtKW92blghIzckIjA0JykpM3JvXHUhIzY3JCQiMHVOaG1dbmMlISM3JCIwJ2VkJDN2blgoISM2NyQ3JCQiMG11JFEuKmZjJSEjNyQiMFh1JmZ3N2l1ISM2NyQkIjB1TmhtXW5jJSEjNyQiMCdlZCQzdm5YKCEjNjckNyQkIjBtdSRRLipmYyUhIzckIjBYdSZmdzdpdSEjNjckJCIvJipvXjgzbFghIzYkIjBpVEJAYCZvdSEjNjckNyQkIjAuOTgwVEdkJSEjNyQiMFckPSgpZTM5dSEjNjckJCIwKmU8TltJclghIzckIjBQNHYrMVtVKCEjNjckNyQkIjAqZTxOW0lyWCEjNyQiMFA0disxW1UoISM2NyQkIjBNKkh3JjMrZCUhIzckIjB0KWUsIykpUVYoISM2NyQ3JCQiMHVZTygqRyZwWCEjNyQiMHQoPmVsQ1B1ISM2NyQkIjBNKkh3JjMrZCUhIzckIjB0KWUsIykpUVYoISM2NyQ3JCQiMHVZTygqRyZwWCEjNyQiMHQoPmVsQ1B1ISM2NyQkIjB4LDo/aCpvWCEjNyQiMFFjcFZRN1coISM2NyQ3JCQiL2o3LDRzd1ghIzYkIjA+JT02JCozKFEoISM2NyQkIjBeIXAxUW13WCEjNyQiMEhXYU4lWyhRKCEjNjckNyQkIjBeIXAxUW13WCEjNyQiMEhXYU4lWyhRKCEjNjckJCIwSChvZFtod1ghIzckIjBLKyd5ViN5USghIzY3JDckJCIvO1NfPihbZCUhIzYkIjBsS2ghXCMqKlIoISM2NyQkIjBIKG9kW2h3WCEjNyQiMEsrJ3lWI3lRKCEjNjckNyQkIi87U18+KFtkJSEjNiQiMGxLaCFcIyoqUighIzY3JCQiMFlhMiFvSHRYISM3JCIwbSNIPVQhNFQoISM2NyQ3JCQiMCw0Qy4oM3RYISM3JCIwLEBvWGxCVCghIzY3JCQiMFlhMiFvSHRYISM3JCIwbSNIPVQhNFQoISM2NyQ3JCQiMCw0Qy4oM3RYISM3JCIwLEBvWGxCVCghIzY3JCQiMC45ODBUR2QlISM3JCIwVyQ9KCllMzl1ISM2NyQ3JCQiMGNRNHYrMWUlISM3JCIwc0M5IlxDZ3QhIzY3JCQiMFIjUVUjZS1lJSEjNyQiMGRuU0QuRU8oISM2NyQ3JCQiMFIjUVUjZS1lJSEjNyQiMGRuU0QuRU8oISM2NyQkIjBBPyV6PScqelghIzckIi55WXdeWU8oISIqNyQ3JCQiMCgpRzBvZCV5WCEjNyQiMCRmdi9RL3Z0ISM2NyQkIjBBPyV6PScqelghIzckIi55WXdeWU8oISIqNyQ3JCQiMCgpRzBvZCV5WCEjNyQiMCRmdi9RL3Z0ISM2NyQkIi9qNyw0c3dYISM2JCIwPiU9NiQqMyhRKCEjNjckNyQkIjAkM3YrMVslZSUhIzckIjBSQCN6MGFMdCEjNjckJCIwT2pyV3FRZSUhIzckIjAmM3BfQHNQdCEjNjckNyQkIjBPanJXcVFlJSEjNyQiMCYzcF9Ac1B0ISM2NyQkIjBPN294UExlJSEjNyQiMGleQmMnUVR0ISM2NyQ3JCQiLyNIR1hoP2UlISM2JCIwQHpMcWksTighIzY3JCQiME83b3hQTGUlISM3JCIwaV5CYydRVHQhIzY3JDckJCIvI0hHWGg/ZSUhIzYkIjBAekxxaSxOKCEjNjckJCIwY1E0disxZSUhIzckIjBzQzkiXENndCEjNjckNyQkIjA0ajBYZyQpZSUhIzckIjAiR1tVJXBwSSghIzY3JCQiMFEsaSQpKlwoZSUhIzckIjA3OTgwVEdKKCEjNjckNyQkIjBRLGkkKSpcKGUlISM3JCIwNzk4MFRHSighIzY3JCQiMC0pUU4/dSdlJSEjNyQiMGRpN1VJIT10ISM2NyQ3JCQiMGNLMXAjbyZlJSEjNyQiMFwtP2ciR0R0ISM2NyQkIjAtKVFOP3UnZSUhIzckIjBkaTdVSSE9dCEjNjckNyQkIjBjSzFwI28mZSUhIzckIjBcLT9nIkdEdCEjNjckJCIwJDN2KzFbJWUlISM3JCIwUUAjejBhTHQhIzY3JDckJCIwT3YuSVNBZiUhIzckIjBWZkQhW18hRyghIzY3JCQiMGNdIjRlOSJmJSEjNyQiL3UkKlwqZnpHKCEjNTckNyQkIjBjXSI0ZTkiZiUhIzckIi91JCpcKmZ6RyghIzU3JCQiL1o/dlM8IWYlISM2JCIwWm80PyZlJUgoISM2NyQ3JCQiMCpmcCl6PyQqZSUhIzckIjB3RDFdKy9JKCEjNjckJCIvWj92UzwhZiUhIzYkIjBabzQ/JmUlSCghIzY3JDckJCIwKmZwKXo/JCplJSEjNyQiMHdEMV0rL0koISM2NyQkIjA0ajBYZyQpZSUhIzckIjAiR1tVJXBwSSghIzY3JDckJCIwaSg9XSw3J2YlISM3JCIwYHpjNStVRCghIzY3JCQiL2MhKmV4IVtmJSEjNiQiMG9nJlspeUlFKCEjNjckNyQkIi9jISpleCFbZiUhIzYkIjBvZyZbKXlJRSghIzY3JCQiMGhyPUdMT2YlISM3JCIwayRbckcwcnMhIzY3JDckJCIvSyRwPHZIZiUhIzYkIjAvXCMqUj5iRighIzY3JCQiMGhyPUdMT2YlISM3JCIwayRbckcwcnMhIzY3JDckJCIvSyRwPHZIZiUhIzYkIjAvXCMqUj5iRighIzY3JCQiME92LklTQWYlISM3JCIwVmZEIVtfIUcoISM2NyQ3JCQiMCopKioqKioqKioqKmYlISM3JCIwNy8uKCopKXpBKCEjNjckJCIwJltBb11bKWYlISM3JCIwJ1I9Wng+UXMhIzY3JDckJCIwJltBb11bKWYlISM3JCIwJ1I9Wng+UXMhIzY3JCQiL3Zkdio9cmYlISM2JCIwJioqZTdjVlpzISM2NyQ3JCQiMCpIJ3A/WG1mJSEjNyQiMEtzeUhRMUQoISM2NyQkIi92ZHYqPXJmJSEjNiQiMCYqKmU3Y1ZacyEjNjckNyQkIjAqSCdwP1htZiUhIzckIjBLc3lIUTFEKCEjNjckJCIwaSg9XSw3J2YlISM3JCIwYHpjNStVRCghIzYtJSZDT0xPUkc2JiUkUkdCRyQiKF51aSchIigkIihedWknISIoJCIoXnVpJyEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2Z15uNyQ3JCQiMGMtQG9YbCRSISM3JCIwNHVwSXJqKSkqISM2NyQkIjBSaCMzZ1xPUiEjNyQiMCdbIVEvTiEpKSkqISM2NyQ3JCQiMFJoIzNnXE9SISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMDAjXC0zXE9SISM3JCIwWj9FLDYjKSkpKiEjNjckNyQkIjBGbFF3RGgkUiEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMDAjXC0zXE9SISM3JCIwWj9FLDYjKSkpKiEjNjckNyQkIjBGbFF3RGgkUiEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMFUrIjM+M09SISM3JCIvL1JqRSc+ISoqISM1NyQ3JCQiMCw9aCFwdk5SISM3JCIwZSI9WGgiSCIqKiEjNjckJCIwVSsiMz4zT1IhIzckIi8vUmpFJz4hKiohIzU3JDckJCIwLD1oIXB2TlIhIzckIjBlIj1YaCJIIioqISM2NyQkIjAmPko0W25OUiEjNyQiMGtYbWIzZCIqKiEjNjckNyQkIjA6XHhVKlFOUiEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMCY+SjRbbk5SISM3JCIwa1htYjNkIioqISM2NyQ3JCQiMDpceFUqUU5SISM3JCIwJSpwZXBjYCMqKiEjNjckJCIwSFlcXHBfJFIhIzckIjBgTiNHKFslSCoqISM2NyQ3JCQiMGFIL0tCXSRSISM3JCIvJGVsQyh6UCoqISM1NyQkIjBIWVxccF8kUiEjNyQiMGBOI0coWyVIKiohIzY3JDckJCIwYUgvS0JdJFIhIzckIi8kZWxDKHpQKiohIzU3JCQiMDo/PSZmJ1skUiEjNyQiMGNKL0EkPVYqKiEjNjckNyQkIjAlM2p3JmVZJFIhIzckIjBtWXN6UC0mKiohIzY3JCQiMDo/PSZmJ1skUiEjNyQiMGNKL0EkPVYqKiEjNjckNyQkIjAlM2p3JmVZJFIhIzckIjBtWXN6UC0mKiohIzY3JCQiL0ciKm9UWU1SISM2JCIwQ3Imbz8icCYqKiEjNjckNyQkIjA3dW89JkhNUiEjNyQiMC1Oek15RScqKiEjNjckJCIvRyIqb1RZTVIhIzYkIjBDciZvPyJwJioqISM2NyQ3JCQiMDd1bz0mSE1SISM3JCIwLU56TXlFJyoqISM2NyQkIjBqXSFIVDFNUiEjNyQiMCozc0ZganEqKiEjNjckNyQkIjBMKVtVSiRSJFIhIzckIjBRQicpKik9XigqKiEjNjckJCIwal0hSFQxTVIhIzckIjAqM3NGYGpxKiohIzY3JDckJCIwTClbVUokUiRSISM3JCIwUUInKSopPV4oKiohIzY3JCQiMCwmKlwjZW1MUiEjNyQiMCMzNEBJTiUpKiohIzY3JDckJCIwTGgkUUNkTFIhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjAsJipcI2VtTFIhIzckIjAjMzRASU4lKSoqISM2NyQ3JCQiMExoJFFDZExSISM3JCIwdjYkXCVmdikqKiEjNjckJCIwZnEjUiNwSyRSISM3JCIwIlxyL18xKSoqKiEjNjckNyQkIjA7YjoxOEskUiEjNyQiMCwrKysrKysiISM1NyQkIjBmcSNSI3BLJFIhIzckIjAiXHIvXzEpKioqISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMFFjXyt5KmUoKiEjNjckJCIvPWZlNUdTUiEjNiQiMENAcGBIT3cqISM2NyQ3JCQiLz1mZTVHU1IhIzYkIjBDQHBgSE93KiEjNjckJCIwRWlFQ2wtJVIhIzckIjBsYG1cVlR3KiEjNjckNyQkIjAlKVEzKmYqKVJSISM3JCIvJzR3M3FneCohIzU3JCQiMEVpRUNsLSVSISM3JCIwbGBtXFZUdyohIzY3JDckJCIwJSlRMypmKilSUiEjNyQiLyc0dzNxZ3gqISM1NyQkIjAkeTBEI1EpUlIhIzckIjBcRydlSyZ6eCohIzY3JDckJCIwTmxtUzcmUlIhIzckIjAnekhRMV4peSohIzY3JCQiMCR5MEQjUSlSUiEjNyQiMFxHJ2VLJnp4KiEjNjckNyQkIjBObG1TNyZSUiEjNyQiMCd6SFExXil5KiEjNjckJCIwO3luOTglUlIhIzckIi9CRC1vdiJ6KiEjNTckNyQkIjBMI3AjSEkiUlIhIzckIjBMJykqKT1eNCEpKiEjNjckJCIwO3luOTglUlIhIzckIi9CRC1vdiJ6KiEjNTckNyQkIjBMI3AjSEkiUlIhIzckIjBMJykqKT1eNCEpKiEjNjckJCIwazcvKioqKSpRUiEjNyQiLzlOJD1hYiEpKiEjNTckNyQkIjA0PEBrXChRUiEjNyQiMHB1J1I8UjgpKiEjNjckJCIwazcvKioqKSpRUiEjNyQiLzlOJD1hYiEpKiEjNTckNyQkIjA0PEBrXChRUiEjNyQiMHB1J1I8UjgpKiEjNjckJCIwJzNoVihvJlFSISM3JCIwdUU6V1gkPikqISM2NyQ3JCQiMG05Z1dxJFFSISM3JCIwMGouSEtlIykqISM2NyQkIjAnM2hWKG8mUVIhIzckIjB1RTpXWCQ+KSohIzY3JDckJCIwbTlnV3EkUVIhIzckIjAwai5IS2UjKSohIzY3JCQiLzo0IlJcIlFSISM2JCIwPXhkaUlKJCkqISM2NyQ3JCQiMGAuT3AjKnokUiEjNyQiMFReNSVHRlEpKiEjNjckJCIvOjQiUlwiUVIhIzYkIjA9eGRpSUokKSohIzY3JDckJCIwYC5PcCMqeiRSISM3JCIwVF41JUdGUSkqISM2NyQkIjA9JGU8PnRQUiEjNyQiMGtwXXk0cCUpKiEjNjckNyQkIjBmKjN4amhQUiEjNyQiMHhSPFI4MiYpKiEjNjckJCIwPSRlPD50UFIhIzckIjBrcF15NHAlKSohIzY3JDckJCIwZiozeGpoUFIhIzckIjB4UjxSODImKSohIzY3JCQiMCIqWzxKO3QkUiEjNyQiMGtiZCZIb2cpKiEjNjckNyQkIjA3WnVbVHMkUiEjNyQiMDhHQyVSOmopKiEjNjckJCIwIipbPEo7dCRSISM3JCIwa2JkJkhvZykqISM2NyQ3JCQiMDdadVtUcyRSISM3JCIwOEdDJVI6aikqISM2NyQkIjBXZ29iLXAkUiEjNyQiMFp0OT5dVygpKiEjNjckNyQkIjBSR1osb28kUiEjNyQiMFw7SlwlZnYpKiEjNjckJCIwV2dvYi1wJFIhIzckIjBadDk+XVcoKSohIzY3JDckJCIwUkdaLG9vJFIhIzckIjBcO0pcJWZ2KSohIzY3JCQiMGMtQG9YbCRSISM3JCIwNHVwSXJqKSkqISM2NyQ3JCQiMDRGPFEwViVSISM3JCIwVTBZOXpsaiohIzY3JCQiLzl3Yyk+VSVSISM2JCIwalArLkMjUicqISM2NyQ3JCQiLzl3Yyk+VSVSISM2JCIwalArLkMjUicqISM2NyQkIjBaXWcxNVUlUiEjNyQiMGtVXmxIJlInKiEjNjckNyQkIjAnbzxfKj1RJVIhIzckIjAqZnMhZWs7bCohIzY3JCQiMFpdZzE1VSVSISM3JCIwa1VebEgmUicqISM2NyQ3JCQiMCdvPF8qPVElUiEjNyQiMCpmcyFlaztsKiEjNjckJCIwKD5wb013VlIhIzckIjBbXicpPi1NbCohIzY3JDckJCIwbmk1aj5NJVIhIzckIjBOOTk4MFRtKiEjNjckJCIwKD5wb013VlIhIzckIjBbXicpPi1NbCohIzY3JDckJCIwbmk1aj5NJVIhIzckIjBOOTk4MFRtKiEjNjckJCIwTyFbbCo9TCVSISM3JCIwb3p0LW9zbSohIzY3JDckJCIwdSo+Jik9LVZSISM3JCIwci1Ab1hsbiohIzY3JCQiME8hW2wqPUwlUiEjNyQiMG96dC1vc20qISM2NyQ3JCQiMHUqPiYpPS1WUiEjNyQiMHItQG9YbG4qISM2NyQkIjBGQjthd0clUiEjNyQiMDtlKCk9RjZvKiEjNjckNyQkIjAsR0VxREUlUiEjNyQiMDIiektpKSopbyohIzY3JCQiMEZCO2F3RyVSISM3JCIwO2UoKT1GNm8qISM2NyQ3JCQiMCxHRXFERSVSISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwJWVKemhWVVIhIzckIjBZeClSKHpccCohIzY3JDckJCIwJHBOdDVCVVIhIzckIjBXek15RTlxKiEjNjckJCIwJWVKemhWVVIhIzckIjBZeClSKHpccCohIzY3JDckJCIwJHBOdDVCVVIhIzckIjBWek15RTlxKiEjNjckJCIwI0goUid5Kj4lUiEjNyQiL1RdRmQjKTMoKiEjNTckNyQkIjBNaScpKXokPSVSISM3JCIveTtNdCdRciohIzU3JCQiMCNIKFIneSo+JVIhIzckIi9UXUZkIykzKCohIzU3JDckJCIwTWknKSl6JD0lUiEjNyQiL3k7TXQnUXIqISM1NyQkIi9wMXo6Y1RSISM2JCIwL0xZP2xFcyohIzY3JDckJCIvQSN5Vlk5JVIhIzYkIjA7Y1speUlFKCohIzY3JCQiL3AxejpjVFIhIzYkIjAvTFk/bEVzKiEjNjckNyQkIjBAQXlWWTklUiEjNyQiMDtjWyl5SUUoKiEjNjckJCIwSG8qM3Q3VFIhIzckIjBfejhBKVxPKCohIzY3JDckJCIwYyNvNWswVFIhIzckIjBfV2JWWyhRKCohIzY3JCQiMEhvKjN0N1RSISM3JCIwX3o4QSlcTygqISM2NyQ3JCQiMGMjbzVrMFRSISM3JCIwX1diVlsoUSgqISM2NyQkIjBrNiFRXXBTUiEjNyQiMDF1eiNbS10oKiEjNjckNyQkIjA+VSIpKnltU1IhIzckIjApR0InKSopPV4oKiEjNjckJCIwazYhUV1wU1IhIzckIjAxdXojW0tdKCohIzY3JDckJCIwPlUiKSp5bVNSISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMCNbIj5gRC8lUiEjNyQiMFFjXyt5KmUoKiEjNjckNyQkIjBOUjpCJj1bUiEjNyQiL2EhKVIhRyo9JiohIzU3JCQiMC4+J29hIXolUiEjNyQiMFFVUTJmc18qISM2NyQ3JCQiMC4+J29hIXolUiEjNyQiMFFVUTJmc18qISM2NyQkIjA2MVgxc3klUiEjNyQiMEIieUdLRUcmKiEjNjckNyQkIi9jUCwkKltaUiEjNiQiMHVJWGkqcFImKiEjNjckJCIwNjFYMXN5JVIhIzckIjBCInlHS0VHJiohIzY3JDckJCIvY1AsJCpbWlIhIzYkIjB1SVhpKnBSJiohIzY3JCQiMCIpM2JeMXUlUiEjNyQiMCdHISlSbD5VJiohIzY3JDckJCIwL2NDI1syWlIhIzckIi8iPl88U0BiKiEjNTckJCIwIikzYl4xdSVSISM3JCIwJ0chKVJsPlUmKiEjNjckNyQkIjAvY0MjWzJaUiEjNyQiLyI+XzxTQGIqISM1NyQkIjA4Vj1BVnAlUiEjNyQiL0dAPkU3YyYqISM1NyQ3JCQiMCgqKjQ8P21ZUiEjNyQiMFkyZnMhZWsmKiEjNjckJCIwOFY9QVZwJVIhIzckIi9HQD5FN2MmKiEjNTckNyQkIjAoKio0PD9tWVIhIzckIjBZMmZzIWVrJiohIzY3JCQiMG03KmZAW1lSISM3JCIwd3JFYVQrZCohIzY3JDckJCIweCYpZigzRFlSISM3JCIwI2VmdzcteCYqISM2NyQkIjBtNypmQFtZUiEjNyQiMHdyRWFUK2QqISM2NyQ3JCQiMHgmKWYoM0RZUiEjNyQiMCNlZnc3LXgmKiEjNjckJCIvWSlvSkJnJVIhIzYkIjBfRjhOYFJlKiEjNjckNyQkIi5aKilRVGUlUiEjNSQiMD0lR0Y9WSplKiEjNjckJCIvWSlvSkJnJVIhIzYkIjBfRjhOYFJlKiEjNjckNyQkIi5aKilRVGUlUiEjNSQiMD0lR0Y9WSplKiEjNjckJCIvUWR0bWNYUiEjNiQiMEgncDEiZXlmKiEjNjckNyQkIjA3N1VhTGElUiEjNyQiMGFzelAtPmcqISM2NyQkIi9RZHRtY1hSISM2JCIwSCdwMSJleWYqISM2NyQ3JCQiMDc3VWFMYSVSISM3JCIwYnN6UC0+ZyohIzY3JCQiMDpKNEA3XiVSISM3JCIwPWUpcGV2NicqISM2NyQ3JCQiMDt6MkxGXSVSISM3JCIwIjRtR0hNOScqISM2NyQkIjA6SjRAN14lUiEjNyQiMD1lKXBldjYnKiEjNjckNyQkIjA7ejJMRl0lUiEjNyQiMCI0bUdITTknKiEjNjckJCIwUChRNypmWSVSISM3JCIweFRScFljaSohIzY3JDckJCIwUidRUEZpV1IhIzckIjBGXCR6TXlFJyohIzY3JCQiMFAoUTcqZlklUiEjNyQiMHhUUnBZY2kqISM2NyQ3JCQiMFInUVBGaVdSISM3JCIwRlwkek15RScqISM2NyQkIjA0RjxRMFYlUiEjNyQiMFUwWTl6bGoqISM2NyQ3JCQiMGleODNsPyZSISM3JCIwKUg2U2p5MCUqISM2NyQkIjBuYSJvS3ReUiEjNyQiMDdadzYlSDolKiEjNjckNyQkIjBuYSJvS3ReUiEjNyQiMDdadzYlSDolKiEjNjckJCIwKjNeLj5wXlIhIzckIjBVT1ZwIVw7JSohIzY3JDckJCIwOGl5JDNJXlIhIzckIjBcTiRvWXRGJSohIzY3JCQiMCozXi4+cF5SISM3JCIwVU9WcCFcOyUqISM2NyQ3JCQiMDhpeSQzSV5SISM3JCIwXE4kb1l0RiUqISM2NyQkIjB1KEhIZj9eUiEjNyQiME5DeVwqW0klKiEjNjckNyQkIjAmUjQxLSgzJlIhIzckIjAmUS0+XzxTJSohIzY3JCQiMHUoSEhmP15SISM3JCIwTkN5XCpbSSUqISM2NyQ3JCQiMCZSNDEtKDMmUiEjNyQiMCZRLT5fPFMlKiEjNjckJCIwTDJgUUEyJlIhIzckIi8yIyozMFtXJSohIzU3JDckJCIwPlUmZjhXXVIhIzckIjBANyhwZGhfJSohIzY3JCQiMEwyYFFBMiZSISM3JCIvMiMqMzBbVyUqISM1NyQ3JCQiMD5VJmY4V11SISM3JCIwQDcocGRoXyUqISM2NyQkIjAyKVxbN0NdUiEjNyQiMDgyOiFRWWUlKiEjNjckNyQkIjByQSIpRzkrJlIhIzckIjBkKy9LY11ZKiEjNjckJCIwMilcWzdDXVIhIzckIjA4MjohUVllJSohIzY3JDckJCIwckEiKUc5KyZSISM3JCIwZCsvS2NdWSohIzY3JCQiME5NQF1pKFxSISM3JCIwaVgjSCVSQ1oqISM2NyQ3JCQiMEVlIXkqKWVcUiEjNyQiMCQqKTNyb1x4JSohIzY3JCQiME5NQF1pKFxSISM3JCIwaVgjSCVSQ1oqISM2NyQ3JCQiMEVlIXkqKWVcUiEjNyQiMCQqKTNyb1x4JSohIzY3JCQiME1nbDcnR1xSISM3JCIwZmheWDJrWyohIzY3JDckJCIwQngoPmE7XFIhIzckIjBIeDxVUCoqWyohIzY3JCQiME1nbDcnR1xSISM3JCIwZmheWDJrWyohIzY3JDckJCIwQngoPmE7XFIhIzckIjBIeDxVUCoqWyohIzY3JCQiMDR3KSk0NylbUiEjNyQiL0ZvX3pPKyYqISM1NyQ3JCQiMEElbyhmVihbUiEjNyQiMGxsQyh6UC0mKiEjNjckJCIwNHcpKTQ3KVtSISM3JCIvRm9fek8rJiohIzU3JDckJCIwQSVvKGZWKFtSISM3JCIwbGxDKHpQLSYqISM2NyQkIjBSO05TUyRbUiEjNyQiMCh6cnI0SzkmKiEjNjckNyQkIjA4ZFNdQiRbUiEjNyQiMC1hSl89W14qISM2NyQkIjBSO05TUyRbUiEjNyQiMCh6cnI0SzkmKiEjNjckNyQkIjA4ZFNdQiRbUiEjNyQiMC1hSl89W14qISM2NyQkIjBOUjpCJj1bUiEjNyQiL2EhKVIhRyo9JiohIzU3JDckJCIwKVE7SlwlZiZSISM3JCIwNkBTdVBwSCohIzY3JCQiMEg8OSVIcmJSISM3JCIwKD1YaCJITEkqISM2NyQ3JCQiMEg8OSVIcmJSISM3JCIwKD1YaCJITEkqISM2NyQkIjAuQVRyI29iUiEjNyQiMGszeCUqcFRJKiEjNjckNyQkIi8iR185al8mUiEjNiQiMEJTQHJwZEoqISM2NyQkIjAuQVRyI29iUiEjNyQiMGszeCUqcFRJKiEjNjckNyQkIi8iR185al8mUiEjNiQiMEJTQHJwZEoqISM2NyQkIjA4YTRtdV4mUiEjNyQiMG0nSFkmUiM9JCohIzY3JDckJCIwV3o8RjpbJlIhIzckIi8nR0dFNSNHJCohIzU3JCQiMDhhNG11XiZSISM3JCIwbSdIWSZSIz0kKiEjNjckNyQkIjBXejxGOlsmUiEjNyQiLydHR0U1I0ckKiEjNTckJCIwM3FiQnBZJlIhIzckIjAkSC0+MklLJCohIzY3JDckJCIwJjRWMSRwViZSISM3JCIwJ3BeODNsUyQqISM2NyQkIjAzcWJCcFkmUiEjNyQiMCRILT4ySUskKiEjNjckNyQkIjAmNFYxJHBWJlIhIzckIjAncF44M2xTJCohIzY3JCQiMGoheTlrO2FSISM3JCIvRUNTTk5ZJCohIzU3JDckJCIwdGdkQkRSJlIhIzckIjBLMFVPIjRgJCohIzY3JCQiMGoheTlrO2FSISM3JCIvRUNTTk5ZJCohIzU3JDckJCIwdGdkQkRSJlIhIzckIjBLMFVPIjRgJCohIzY3JCQiMCg+dHdobWBSISM3JCIwIypHKzMpUmckKiEjNjckNyQkIjBYO3QvJFtgUiEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMCg+dHdobWBSISM3JCIwIypHKzMpUmckKiEjNjckNyQkIjBYO3QvJFtgUiEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMEY/eFxvSiZSISM3JCIwMyhROVdWdSQqISM2NyQ3JCQiLW1GRi9gUiEiKiQiMC8jZWxDKHpQKiEjNjckJCIwRj94XG9KJlIhIzckIjAzKFE5V1Z1JCohIzY3JDckJCItbUZGL2BSISIqJCIwLyNlbEMoelAqISM2NyQkIi9fXWRMbl9SISM2JCIwbTsjM0VZKVEqISM2NyQ3JCQiMDM9TEUvRSZSISM3JCIvL0Y7SVQhUiohIzU3JCQiL19dZExuX1IhIzYkIjBtOyMzRVkpUSohIzY3JDckJCIwMz1MRS9FJlIhIzckIi8vRjtJVCFSKiEjNTckJCIwPGdEdCE9X1IhIzckIjBiYXB0I1stJSohIzY3JDckJCIwQDU0a25AJlIhIzckIjB3ZXBjYEdTKiEjNjckJCIwPGdEdCE9X1IhIzckIjBiYXB0I1stJSohIzY3JDckJCIwQDU0a25AJlIhIzckIjB3ZXBjYEdTKiEjNjckJCIwaV44M2w/JlIhIzckIjApSDZTankwJSohIzY3JDckJCIwOnc0eUMpZlIhIzckIjAnR1xPLTwjPiohIzY3JCQiMC5YengnUWZSISM3JCIwKVwlZnYvUT8qISM2NyQ3JCQiMC5YengnUWZSISM3JCIwKVwlZnYvUT8qISM2NyQkIjAjeV4tdEtmUiEjNyQiMDNdbCopKlIwIyohIzY3JDckJCIwNjk+WT8qZVIhIzckIjBNTG1JWGlAKiEjNjckJCIwI3leLXRLZlIhIzckIjAzXWwqKSpSMCMqISM2NyQ3JCQiMDY5Plk/KmVSISM3JCIwTUxtSVhpQCohIzY3JCQiMDYoeWkiKXplUiEjNyQiLzk9M3JgPiMqISM1NyQ3JCQiMGA5OD5jJWVSISM3JCIwckB0JmVvRyMqISM2NyQkIjA2KHlpIil6ZVIhIzckIi85PTNyYD4jKiEjNTckNyQkIjBgOTg+YyVlUiEjNyQiMHJAdCZlb0cjKiEjNjckJCIwaDUoWz1GZVIhIzckIjBGKltmX21MIyohIzY3JDckJCIvLiZwJVIqeiZSISM2JCIwMjUhM2s3VCMqISM2NyQkIjBoNShbPUZlUiEjNyQiMEYqW2ZfbUwjKiEjNjckNyQkIi8uJnAlUip6JlIhIzYkIjAyNSEzazdUIyohIzY3JCQiL0NoSiRbeCZSISM2JCIwY0BDVyV5WiMqISM2NyQ3JCQiMHJeY3JMdiZSISM3JCIwVilwZXBjYCMqISM2NyQkIi9DaEokW3gmUiEjNiQiMGNAQ1cleVojKiEjNjckNyQkIjByXmNyTHYmUiEjNyQiMFYpcGVwY2AjKiEjNjckJCIvJSoqKSllRnMmUiEjNiQiMCU+VUhaKj1FKiEjNjckNyQkIjAlUXYkW3ZxJlIhIzckIjB6J1E0dittIyohIzY3JCQiLyUqKikpZUZzJlIhIzYkIjAlPlVIWio9RSohIzY3JDckJCIwJVF2JFt2cSZSISM3JCIweidRNHYrbSMqISM2NyQkIjBaTmZmNG4mUiEjNyQiMChcWyo+JypmRiohIzY3JDckJCIwNnJwQj5tJlIhIzckIjA6disxWyV5IyohIzY3JCQiMFpOZmY0biZSISM3JCIwKFxbKj4nKmZGKiEjNjckNyQkIjA2cnBCPm0mUiEjNyQiMDp2KzFbJXkjKiEjNjckJCIwLCg+RVY+Y1IhIzckIjBGZHckKikzIUgqISM2NyQ3JCQiMFhaJGZcO2NSISM3JCIwXmoyaCkpM0gqISM2NyQkIjAsKD5FVj5jUiEjNyQiMEZkdyQqKTMhSCohIzY3JDckJCIwWFokZlw7Y1IhIzckIjBeajJoKSkzSCohIzY3JCQiMClRO0pcJWYmUiEjNyQiMDZAU3VQcEgqISM2NyQ3JCQiMFQpeUlZcWpSISM3JCIvd1koKnlIIjQqISM1NyQkIjBWISkqeUxvalIhIzckIjB0XCgqelI9NCohIzY3JDckJCIwViEpKnlMb2pSISM3JCIwdFwoKnpSPTQqISM2NyQkIjA2c2dOIW9qUiEjNyQiMCdIWE53Ij40KiEjNjckNyQkIjBqP3ZIKD5qUiEjNyQiMDRRL04hRy8iKiEjNjckJCIwNnNnTiFvalIhIzckIjAnSFhOdyI+NCohIzY3JDckJCIwaj92SCg+alIhIzckIjA0US9OIUcvIiohIzY3JCQiMG53S1ZESidSISM3JCIwI1FCPnY4MSIqISM2NyQ3JCQiLyRbKTRNcmlSISM2JCIwWEU2ITRzOyIqISM2NyQkIjBud0tWREonUiEjNyQiMCNRQj52ODEiKiEjNjckNyQkIi8kWyk0TXJpUiEjNiQiMFhFNiE0czsiKiEjNjckJCIwLyxeZXREJ1IhIzckIi4mUld2TT8iKiEiKjckNyQkIjBkJFEmcEpBJ1IhIzckIjAiWyI9WGgiSCIqISM2NyQkIjAvLF5ldEQnUiEjNyQiLiZSV3ZNPyIqISIqNyQ3JCQiMGQkUSZwSkEnUiEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMEt4dXhDPydSISM3JCIwaHQsI3lhTSIqISM2NyQ3JCQiL2phVEB2aFIhIzYkIjA9LkQrLTs5KiEjNjckJCIwS3h1eEM/J1IhIzckIjBodCwjeWFNIiohIzY3JDckJCIvamFUQHZoUiEjNiQiMD0uRCstOzkqISM2NyQkIjBILWopKnk5J1IhIzckIjBYYlFVUShbIiohIzY3JDckJCIwLilvR1pGaFIhIzckIjBhIj5gRC9hIiohIzY3JCQiMEgtaikqeTknUiEjNyQiMFhiUVVRKFsiKiEjNjckNyQkIjAuKW9HWkZoUiEjNyQiMGEiPmBEL2EiKiEjNjckJCIwJCkqZiI9TzQnUiEjNyQiL3ZiXiU+SDsqISM1NyQ3JCQiMEgkPlclKnpnUiEjNyQiLyp6UTUkW20iKiEjNTckJCIwJCkqZiI9TzQnUiEjNyQiL3ZiXiU+SDsqISM1NyQ3JCQiMEgkPlclKnpnUiEjNyQiLyp6UTUkW20iKiEjNTckJCIwRj9sTCdSZ1IhIzckIjAlPlAqKTQ0eCIqISM2NyQ3JCQiMHg+LkZFLidSISM3JCIwRW9YbEIqeSIqISM2NyQkIjBGP2xMJ1JnUiEjNyQiMCU+UCopNDR4IiohIzY3JDckJCIweD4uRkUuJ1IhIzckIjBFb1hsQip5IiohIzY3JCQiMCZmJkdVZilmUiEjNyQiMERYeDdgNz4qISM2NyQ3JCQiMHdEOT5iKWZSISM3JCIwaWNfP2s4PiohIzY3JCQiMCZmJkdVZilmUiEjNyQiMERYeDdgNz4qISM2NyQ3JCQiMHdEOT5iKWZSISM3JCIwaWNfP2s4PiohIzY3JCQiMDp3NHlDKWZSISM3JCIwJ0dcTy08Iz4qISM2NyQ3JCQiMG8rMVslZW5SISM3JCIwKD5FQyJRVCoqKSEjNjckJCIwOU1tY2ByJ1IhIzckIi83JFwlZnYvISohIzU3JDckJCIwOU1tY2ByJ1IhIzckIi83JFwlZnYvISohIzU3JCQiMCI9YkMpKjNuUiEjNyQiMCRwaE4/TTEhKiEjNjckNyQkIi87Sl00bG1SISM2JCIwYz5jXCc+PCEqISM2NyQkIjAiPWJDKSozblIhIzckIjAkcGhOP00xISohIzY3JDckJCIvO0pdNGxtUiEjNiQiMGM+Y1wnPjwhKiEjNjckJCIwPXYlXE1ebVIhIzckIjBQKjQwMmo/ISohIzY3JDckJCIwKWUoUmxdaCdSISM3JCIwI3pJWXFqSCEqISM2NyQkIjA9diVcTV5tUiEjNyQiMFAqNDAyaj8hKiEjNjckNyQkIjApZShSbF1oJ1IhIzckIjAjeklZcWpIISohIzY3JCQiMCJbZGcuJWYnUiEjNyQiMG47dyQpM1wuKiEjNjckNyQkIjBDdyVlRWxsUiEjNyQiMEgnKnBmeD8vKiEjNjckJCIwIltkZy4lZidSISM3JCIwbjt3JCkzXC4qISM2NyQ3JCQiMEN3JWVFbGxSISM3JCIwSCcqcGZ4Py8qISM2NyQkIjAqejpHMFBsUiEjNyQiMC54JEdsPFwhKiEjNjckNyQkIi91QFpwOmxSISM2JCIwbCVvWiI9WDAqISM2NyQkIjAqejpHMFBsUiEjNyQiMC54JEdsPFwhKiEjNjckNyQkIi91QFpwOmxSISM2JCIwbCVvWiI9WDAqISM2NyQkIjBibzojUiFbJ1IhIzckIjAoem52UVZqISohIzY3JDckJCIwTV9aXWpZJ1IhIzckIjAsdCQpcGVwMSohIzY3JCQiMGJvOiNSIVsnUiEjNyQiMCh6bnZRVmohKiEjNjckNyQkIjBNX1pdalknUiEjNyQiMCx0JClwZXAxKiEjNjckJCIwMFElMzBDa1IhIzckIjBPMkwpNG94ISohIzY3JDckJCIwKj0lNEpzVCdSISM3JCIwUGghXCMqUnohKiEjNjckJCIwMFElMzBDa1IhIzckIjBPMkwpNG94ISohIzY3JDckJCIwKj0lNEpzVCdSISM3JCIwUGghXCMqUnohKiEjNjckJCIwVCl5SVlxalIhIzckIi93WSgqeUgiNCohIzU3JDckJCIwJUhUSVZZclIhIzckIjB2JipHJCo9MCEqKSEjNjckJCIvM0NJYkVyUiEjNiQiMEpDJVI6QjAqKSEjNjckNyQkIi8zQ0liRXJSISM2JCIwSkMlUjpCMCopISM2NyQkIjAqM3YneU03KFIhIzckIjB0cCtjbmYhKikhIzY3JDckJCIwYUAmPkh1cVIhIzckIjBuNyw0c3ciKikhIzY3JCQiMCozdid5TTcoUiEjNyQiMHRwK2NuZiEqKSEjNjckNyQkIjBhQCY+SHVxUiEjNyQiMG43LDRzdyIqKSEjNjckJCIwUnpsJT1qcVIhIzckIjBaViM0OU0/KikhIzY3JDckJCIwMU1ieUEtKFIhIzckIjAuLDNrNywkKikhIzY3JCQiMFJ6bCU9anFSISM3JCIwWlYjNDlNPyopISM2NyQ3JCQiMDFNYnlBLShSISM3JCIwLiwzazcsJCopISM2NyQkIjAxRnVZSysoUiEjNyQiMGUiPVNRcU0qKSEjNjckNyQkIjBFJlw4XnFwUiEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMDFGdVlLKyhSISM3JCIwZSI9U1FxTSopISM2NyQ3JCQiMEUmXDhecXBSISM3JCIwUipbIj5gRCUqKSEjNjckJCIwMXdmaE8lcFIhIzckIjAvOyhmXDBcKikhIzY3JDckJCIwYTMoeSkqPXBSISM3JCIwd3hAdSQqXCYqKSEjNjckJCIwMXdmaE8lcFIhIzckIjAvOyhmXDBcKikhIzY3JDckJCIwYTMoeSkqPXBSISM3JCIwd3hAdSQqXCYqKSEjNjckJCIwKno8Y1UlKW9SISM3JCIwTk1NKVtSaiopISM2NyQ3JCQiMF5waDF4J29SISM3JCIwN21HSE11JyopISM2NyQkIjAqejxjVSUpb1IhIzckIjBOTU0pW1JqKikhIzY3JDckJCIwXnBoMXgnb1IhIzckIjA3bUdITXUnKikhIzY3JCQiMF5TTE5iI29SISM3JCIvZWRBUHN4KikhIzU3JDckJCIvKXBbbG0ib1IhIzYkIjBbYU4lWygpeiopISM2NyQkIjBeU0xOYiNvUiEjNyQiL2VkQVBzeCopISM1NyQ3JCQiLylwW2xtIm9SISM2JCIwW2FOJVsoKXoqKSEjNjckJCIwd2tMKClwdydSISM3JCIwcndrZVQ/KiopISM2NyQ3JCQiL0VwRCdldydSISM2JCIwJUdDJVI6QioqKSEjNjckJCIwd2tMKClwdydSISM3JCIwcndrZVQ/KiopISM2NyQ3JCQiL0VwRCdldydSISM2JCIwJUdDJVI6QioqKSEjNjckJCIwbysxWyVlblIhIzckIjAoPkVDIlFUKiopISM2NyQ3JCQiMEBELT1XYChSISM3JCIwdiNcQ25GNSkpISM2NyQkIjB3NVg3K10oUiEjNyQiMHkwWW9aIj0pKSEjNjckNyQkIjB3NVg3K10oUiEjNyQiMHkwWW9aIj0pKSEjNjckJCIwdikqZm9XXChSISM3JCIwYTdOa0clPikpISM2NyQ3JCQiMFU+KXooZVcoUiEjNyQiMDklSE4jKWVJKSkhIzY3JCQiMHYpKmZvV1woUiEjNyQiMGE3TmtHJT4pKSEjNjckNyQkIjBVPil6KGVXKFIhIzckIjA5JUhOIyllSSkpISM2NyQkIjBsXGd2O1YoUiEjNyQiMCwqPkBFKVEkKSkhIzY3JDckJCIwQD10MT9SKFIhIzckIi9EKWZ5R0klKSkhIzU3JCQiMGxcZ3Y7VihSISM3JCIwLCo+QEUpUSQpKSEjNjckNyQkIjBAPXQxP1IoUiEjNyQiL0QpZnlHSSUpKSEjNTckJCIwNm0iZUVwdFIhIzckIjBqXzpKQyRbKSkhIzY3JDckJCIwcmJYJ1JRdFIhIzckIjAoM25PJHBhJikpISM2NyQkIjA2bSJlRXB0UiEjNyQiMGpfOkpDJFspKSEjNjckNyQkIjByYlgnUlF0UiEjNyQiMCgzbk8kcGEmKSkhIzY3JCQiMCY9Ll5CMnRSISM3JCIwO19xJVF2aSkpISM2NyQ3JCQiMHhXOVhdRyhSISM3JCIwQmZ0KSk0eicpKSEjNjckJCIwJj0uXkIydFIhIzckIjA7X3ElUXZpKSkhIzY3JDckJCIweFc5WF1HKFIhIzckIjBCZnQpKTR6JykpISM2NyQkIi9yQCl6YkMoUiEjNiQiMCJ5XVc4PHgpKSEjNjckNyQkIjAjKVshMyY+QihSISM3JCIwZlohUS9OISkpKSEjNjckJCIvckApemJDKFIhIzYkIjAieV1XODx4KSkhIzY3JDckJCIwIylbITMmPkIoUiEjNyQiMGZaIVEvTiEpKSkhIzY3JCQiME1uImZIJT0oUiEjNyQiMHNiUiRwZCIqKSkhIzY3JDckJCIwbCZHNzZ6clIhIzckIjAmZnQpKTR6IyopKSEjNjckJCIwTW4iZkglPShSISM3JCIwc2JSJHBkIiopKSEjNjckNyQkIjBsJkc3NnpyUiEjNyQiMCZmdCkpNHojKikpISM2NyQkIjAlSFRJVllyUiEjNyQiMHYmKkckKj0wISopISM2NyQ3JCQiMFpQKy5DI3pSISM3JCIvXmNWPEVCKCkhIzU3JCQiMDRialNxKXlSISM3JCIwRCh5SFExSigpISM2NyQ3JCQiMDRialNxKXlSISM3JCIwRCh5SFExSigpISM2NyQkIjAkSCpmKDQiKXlSISM3JCIwZSVmbiMpUUsoKSEjNjckNyQkIjA8O046NCR5UiEjNyQiMGh2L1EvTnUpISM2NyQkIjAkSCpmKDQiKXlSISM3JCIwZSVmbiMpUUsoKSEjNjckNyQkIjA8O046NCR5UiEjNyQiMGh2L1EvTnUpISM2NyQkIjBEdD82YyJ5UiEjNyQiMFZheGdHcHUpISM2NyQ3JCQiMDYtPHFdeChSISM3JCIwKFI7SlwlZnYpISM2NyQkIjBEdD82YyJ5UiEjNyQiMFZheGdHcHUpISM2NyQ3JCQiMDYtPHFdeChSISM3JCIwKFI7SlwlZnYpISM2NyQkIjBCPz1RMHYoUiEjNyQiMDs3TnBiOXcpISM2NyQ3JCQiMDgiNERdPnhSISM3JCIwTV89WyZRbygpISM2NyQkIjBCPz1RMHYoUiEjNyQiMDs3TnBiOXcpISM2NyQ3JCQiMDgiNERdPnhSISM3JCIwTV89WyZRbygpISM2NyQkIjA8YnF0ZW8oUiEjNyQiMFddJHoncGZ4KSEjNjckNyQkIjB0IVIrQGt3UiEjNyQiLzJhS2cjM3kpISM1NyQkIjA8YnF0ZW8oUiEjNyQiMFddJHoncGZ4KSEjNjckNyQkIjB0IVIrQGt3UiEjNyQiLzJhS2cjM3kpISM1NyQkIjBGR1k4O2koUiEjNyQiMCpwaS4yWiF6KSEjNjckNyQkIjAoM3UwPjR3UiEjNyQiMDFIS2VtS3opISM2NyQkIjBGR1k4O2koUiEjNyQiMCpwaS4yWiF6KSEjNjckNyQkIjAoM3UwPjR3UiEjNyQiMDFIS2VtS3opISM2NyQkIjBjeVZgeGIoUiEjNyQiMC47XiopZVwhKSkhIzY3JDckJCIwa1MoPVdhdlIhIzckIjBVPFI4MmQhKSkhIzY3JCQiMGN5VmB4YihSISM3JCIwLjteKillXCEpKSEjNjckNyQkIjBrUyg9V2F2UiEjNyQiMFU8UjgyZCEpKSEjNjckJCIwQEQtPVdgKFIhIzckIjB2I1xDbkY1KSkhIzY3JDckJCIwdVwpelE1JClSISM3JCIwTzlFUUkkUicpISM2NyQkIjAuI0c9XylHKVIhIzckIjBzb1woKnpSaykhIzY3JDckJCIwLiNHPV8pRylSISM3JCIwc29cKCp6UmspISM2NyQkIjAkKW8kXG8lRylSISM3JCIwIilvMjgvW2spISM2NyQ3JCQiMDNZJXlGSSMpUiEjNyQiMDNkY18/a2wpISM2NyQkIjAkKW8kXG8lRylSISM3JCIwIilvMjgvW2spISM2NyQ3JCQiMDNZJXlGSSMpUiEjNyQiMDNkY18/a2wpISM2NyQkIjBGVSN6RzsjKVIhIzckIjBscyYpelAlZicpISM2NyQ3JCQiMEgkb0BMcyIpUiEjNyQiMFhYajJoKW8nKSEjNjckJCIwRlUjekc7IylSISM3JCIwbHMmKXpQJWYnKSEjNjckNyQkIjBIJG9ATHMiKVIhIzckIjBYWGoyaClvJykhIzY3JCQiMGVCbFAkWyIpUiEjNyQiMEpcPTlkU24pISM2NyQ3JCQiMGYncD5vOSIpUiEjNyQiMCJRLkY7SSJvKSEjNjckJCIwZUJsUCRbIilSISM3JCIwSlw9OWRTbikhIzY3JDckJCIwZidwPm85IilSISM3JCIwIlEuRjtJIm8pISM2NyQkIjBYP3lHMzMpUiEjNyQiMG4pekpCbSlvKSEjNjckNyQkIjAteXhDdDApUiEjNyQiMDxBeDxVUHApISM2NyQkIjBYP3lHMzMpUiEjNyQiMG4pekpCbSlvKSEjNjckNyQkIjAteXhDdDApUiEjNyQiMDxBeDxVUHApISM2NyQkIjAjZUpwdjghKVIhIzckIjAtPSozTkQuKCkhIzY3JDckJCIwciozJGUtKylSISM3JCIwYDUlR0Y9MSgpISM2NyQkIjAjZUpwdjghKVIhIzckIjAtPSozTkQuKCkhIzY3JDckJCIwciozJGUtKylSISM3JCIwYDUlR0Y9MSgpISM2NyQkIjAtYSpwNlp6UiEjNyQiMChbInAkMyR5cikhIzY3JDckJCIwJXoqKil6TSV6UiEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMC1hKnA2WnpSISM3JCIwKFsicCQzJHlyKSEjNjckNyQkIjAleioqKXpNJXpSISM3JCIwKikpNHpLaT0oKSEjNjckJCIwWlArLkMjelIhIzckIi9eY1Y8RUIoKSEjNTckNyQkIi5pJ0hQKXApUiEjNSQiME0rSVRXJGUmKSEjNjckJCIwcDh3P1xrKVIhIzckIjBiUTNuTyRwJikhIzY3JDckJCIwcDh3P1xrKVIhIzckIjBiUTNuTyRwJikhIzY3JCQiMCZcVF07TicpUiEjNyQiMHdmQlNqOGQpISM2NyQ3JCQiMCNwPWh0JWUpUiEjNyQiMCNwX0BzeCJlKSEjNjckJCIwJlxUXTtOJylSISM3JCIwd2ZCU2o4ZCkhIzY3JDckJCIwJHA9aHQlZSlSISM3JCIwI3BfQHN4ImUpISM2NyQkIi9IR3Y0ayYpUiEjNiQiMGByJSlwIzMnZSkhIzY3JDckJCIwOC96bVtfKVIhIzckIjBHOkF4PFVmKSEjNjckJCIvSEd2NGsmKVIhIzYkIjBgciUpcCMzJ2UpISM2NyQ3JCQiMDgvem1bXylSISM3JCIwRzpBeDxVZikhIzY3JCQiMFpEYjNOXClSISM3JCIwOTYwbCd5KycpISM2NyQ3JCQiMGJzMzVgWSlSISM3JCIway5IS2VtZykhIzY3JCQiMFpEYjNOXClSISM3JCIwOTYwbCd5KycpISM2NyQ3JCQiMGNzMzVgWSlSISM3JCIway5IS2VtZykhIzY3JCQiMHRLIUdSQiUpUiEjNyQiMCpIeEdhWjonKSEjNjckNyQkIjAqR05JMTElKVIhIzckIi4jZnQpKTQ+JykhIio3JCQiMHRLIUdSQiUpUiEjNyQiMCpIeEdhWjonKSEjNjckNyQkIjAqR05JMTElKVIhIzckIi4jZnQpKTQ+JykhIio3JCQiMGNOJ1x1YCQpUiEjNyQiMEpUUD9cLGopISM2NyQ3JCQiMHhHTkJyTSlSISM3JCIwTyFHQyVSOmopISM2NyQkIjBjTidcdWAkKVIhIzckIjBKVFA/XCxqKSEjNjckNyQkIjB4R05Cck0pUiEjNyQiME8hR0MlUjpqKSEjNjckJCIwdVwpelE1JClSISM3JCIwTzlFUUkkUicpISM2NyQ3JCQiMEZ1JXpOJzMqUiEjNyQiMGB6IXk1PSFbKSEjNjckJCIwcigzMiplMipSISM3JCIwLj9nIkdEI1spISM2NyQ3JCQiMHIoMzIqZTIqUiEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwLFZ1IipRMipSISM3JCIwQiJ6UURsI1spISM2NyQ3JCQiLzRBY0o4ISpSISM2JCIwUjNuTyRwJVwpISM2NyQkIjAsVnUiKlEyKlIhIzckIjBCInpRRGwjWykhIzY3JDckJCIvNEFjSjghKlIhIzYkIjBSM25PJHAlXCkhIzY3JCQiMERBJ29WKioqKVIhIzckIjB5WSNcL1soXCkhIzY3JDckJCIwVCkqZng1JiopUiEjNyQiMHYnUjxSODImKSEjNjckJCIwREEnb1YqKiopUiEjNyQiMHlZI1wvWyhcKSEjNjckNyQkIjBUKSpmeDUmKilSISM3JCIwdidSPFI4MiYpISM2NyQkIjBWZE4tYiMqKVIhIzckIjB0NVRuIkg3JikhIzY3JDckJCIwMWJVdCIqKSkpUiEjNyQiMDYmM29XZD4mKSEjNjckJCIwVmROLWIjKilSISM3JCIwdDVUbiJINyYpISM2NyQ3JCQiMDFiVXQiKikpKVIhIzckIjA2JjNvV2Q+JikhIzY3JCQiMC9FJD0zXykpUiEjNyQiMFxaJD1rM0YmKSEjNjckNyQkIjBaKzUrdyMpKVIhIzckIjBadCg9XSxLJikhIzY3JCQiMC9FJD0zXykpUiEjNyQiMFxaJD1rM0YmKSEjNjckNyQkIjBaKzUrdyMpKVIhIzckIjBadCg9XSxLJikhIzY3JCQiMEtyVHAieigpUiEjNyQiMHdkLihbJz1hKSEjNjckNyQkIjBDdyZbTm0oKVIhIzckIjAkPVlwYlhXJikhIzY3JCQiMEtyVHAieigpUiEjNyQiMHdkLihbJz1hKSEjNjckNyQkIjBDdyZbTm0oKVIhIzckIjAkPVlwYlhXJikhIzY3JCQiMGJuK2ZucSlSISM3JCIwYzxlQUZtYikhIzY3JDckJCIwVmNgTWFxKVIhIzckIjA+XSw3JypvYikhIzY3JCQiMGJuK2ZucSlSISM3JCIwYzxlQUZtYikhIzY3JDckJCIwVmNgTWFxKVIhIzckIjA+XSw3JypvYikhIzY3JCQiLmknSFApcClSISM1JCIwTStJVFckZSYpISM2NyQ3JCQiMGAnR0hNdSUqUiEjNyQiMFsqPSxhci8lKSEjNjckJCIwI2ZQXD9mJSpSISM3JCIwJykqKT1eNHdTKSEjNjckNyQkIjAjZlBcP2YlKlIhIzckIjAnKSopPV40d1MpISM2NyQkIjBObiM+PmMlKlIhIzckIjBpJClcXiI+MyUpISM2NyQ3JCQiMG5IKFJWJVIqUiEjNyQiMEF5RDFdK1UpISM2NyQkIjBObiM+PmMlKlIhIzckIjBpJClcXiI+MyUpISM2NyQ3JCQiMG5IKFJWJVIqUiEjNyQiMEF5RDFdK1UpISM2NyQkIjBLdHQ2J3kkKlIhIzckIjBSMXBqPkpVKSEjNjckNyQkIjB1JWUtLUkkKlIhIzckIjBlbUtoIVxLJSkhIzY3JCQiMEt0dDYneSQqUiEjNyQiMFIxcGo+SlUpISM2NyQ3JCQiMHUlZS0tSSQqUiEjNyQiMGVtS2ghXEslKSEjNjckJCIwaTB3ImYsJCpSISM3JCIwOiMpZXpIIVElKSEjNjckNyQkIjAoRz8xJ2ZFKlIhIzckIjAlXCZSO0pcVykhIzY3JCQiMGkwdyJmLCQqUiEjNyQiMDojKWV6SCFRJSkhIzY3JDckJCIwKEc/MSdmRSpSISM3JCIwJVwmUjtKXFcpISM2NyQkIi9AbV43RCMqUiEjNiQiMFY9NEBBSFgpISM2NyQ3JCQiMEg2dl5BPypSISM3JCIvTGs5PFBkJSkhIzU3JCQiL0BtXjdEIypSISM2JCIwVj00QEFIWCkhIzY3JDckJCIwSDZ2XkE/KlIhIzckIi9Mazk8UGQlKSEjNTckJCIwQV5WMCNcIipSISM3JCIvKVs1NCh6biUpISM1NyQ3JCQiME51ZiEqKVEiKlIhIzckIjBtSmBFNylwJSkhIzY3JCQiMEFeVjAjXCIqUiEjNyQiLylbNTQoem4lKSEjNTckNyQkIjBOdWYhKilRIipSISM3JCIwbUpgRTcpcCUpISM2NyQkIjBGdSV6TiczKlIhIzckIjBgeiF5NT0hWykhIzY3JDckJCIvKSk0ektpKSpSISM2JCIwJWZDQyJIPUwpISM2NyQkIjBAY29taCYpKlIhIzckIjBwZng/bUhMKSEjNjckNyQkIjBAY29taCYpKlIhIzckIjBwZng/bUhMKSEjNjckJCIwQnJJKClbJikqUiEjNyQiMHknMyh5L0tMKSEjNjckNyQkIjBmV1ZsISp5KlIhIzckIjAwWyVlblNYJCkhIzY3JCQiMEJySSgpWyYpKlIhIzckIjB5JzMoeS9LTCkhIzY3JDckJCIwZldWbCEqeSpSISM3JCIwMFslZW5TWCQpISM2NyQkIjB2enJMUngqUiEjNyQiMDRTYTJUI1skKSEjNjckNyQkIjB2ZFJWQnMqUiEjNyQiMFRPIjR0JXlOKSEjNjckJCIwdnpyTFJ4KlIhIzckIjA0U2EyVCNbJCkhIzY3JDckJCIwdmRSVkJzKlIhIzckIjBUTyI0dCV5TikhIzY3JCQiMGhweSVlJHAqUiEjNyQiMCNIc3Z6RGokKSEjNjckNyQkIjByYl8oKmZsKlIhIzckIjB4QylmeUdxJCkhIzY3JCQiMGhweSVlJHAqUiEjNyQiMCNIc3Z6RGokKSEjNjckNyQkIjByYl8oKmZsKlIhIzckIjB4QylmeUdxJCkhIzY3JCQiME9HNUxRaCpSISM3JCIwQHRic2IjeSQpISM2NyQ3JCQiMCkpRydRLSFmKlIhIzckIjA4ODBUR0ZRKSEjNjckJCIwT0c1TFFoKlIhIzckIjBAdGJzYiN5JCkhIzY3JDckJCIwKSlHJ1EtIWYqUiEjNyQiMDg4MFRHRlEpISM2NyQkIjAjNGk3bk0mKlIhIzckIjAkNFFpWEIkUikhIzY3JDckJCIwNDs3PldfKlIhIzckIi86P2gqb15SKSEjNTckJCIwIzRpN25NJipSISM3JCIwJDRRaVhCJFIpISM2NyQ3JCQiMDQ7Nz5XXypSISM3JCIvOj9oKm9eUikhIzU3JCQiMGAnR0hNdSUqUiEjNyQiMFsqPSxhci8lKSEjNjckNyQkIjAxNipHSl0tUyEjNyQiLW0oPT45RSkhIik3JCQiMGQqUSdvISk+KyUhIzckIjApeUphTXdxIykhIzY3JDckJCIwZCpRJ28hKT4rJSEjNyQiMCl5SmFNd3EjKSEjNjckJCIwQT54K289KyUhIzckIjAneW9SKip6cyMpISM2NyQ3JCQiME9cXCUqKUcsUyEjNyQiMEMxXSsvS0cpISM2NyQkIjBBPngrbz0rJSEjNyQiMCd5b1IqKnpzIykhIzY3JDckJCIwT1xcJSopRyxTISM3JCIwQzFdKy9LRykhIzY3JCQiLz5aMiZHNSslISM2JCIwRClIMkIkekcpISM2NyQ3JCQiMEpUJSk+LDErJSEjNyQiMGglcGJYayZIKSEjNjckJCIvPloyJkc1KyUhIzYkIjBEKUgyQiR6RykhIzY3JDckJCIwSlQlKT4sMSslISM3JCIwaCVwYlhrJkgpISM2NyQkIjAzX3ZZJj4rUyEjNyQiMDsiPWdSLy4kKSEjNjckNyQkIjAsIio9VDwqKipSISM3JCIwKEhRMV4zMyQpISM2NyQkIjAzX3ZZJj4rUyEjNyQiMDsiPWdSLy4kKSEjNjckNyQkIjAsIio9VDwqKipSISM3JCIwKEhRMV4zMyQpISM2NyQkIjBEZSozKW8kKipSISM3JCIwLV47Ok4iPSQpISM2NyQ3JCQiMGY2aWFQIyoqUiEjNyQiMExycWxEMEspISM2NyQkIjBEZSozKW8kKipSISM3JCIwLV47Ok4iPSQpISM2NyQ3JCQiMGY2aWFQIyoqUiEjNyQiMExycWxEMEspISM2NyQkIi8pKTR6S2kpKlIhIzYkIjAlZkNDIkg9TCkhIzY3JDckJCIwTEIoeUhRMVMhIzckIjBZc0kpW1AkPikhIzY3JCQiMHo1M3pCaSslISM3JCIwcig9XSw3Jz4pISM2NyQ3JCQiMHo1M3pCaSslISM3JCIwcig9XSw3Jz4pISM2NyQkIjBEUCQpKnk9MVMhIzckIjBKMWdtWG4+KSEjNjckNyQkIjBOMl0mZl0wUyEjNyQiMDN3M3FnJjMjKSEjNjckJCIwRFAkKSp5PTFTISM3JCIwSjFnbVhuPikhIzY3JDckJCIwTjJdJmZdMFMhIzckIjAzdzNxZyYzIykhIzY3JCQiMCg0b0UkNGArJSEjNyQiLio+OUwrNyMpISIqNyQ3JCQiMDlVZlAjei9TISM3JCIwV2s6RCw1QSkhIzY3JCQiMCg0b0UkNGArJSEjNyQiLio+OUwrNyMpISIqNyQ3JCQiMDlVZlAjei9TISM3JCIwV2s6RCw1QSkhIzY3JCQiL0AnendQVyslISM2JCIwQFpkWlFzQSkhIzY3JDckJCIwQnE6LCQzL1MhIzckIi9HRC09V0wjKSEjNTckJCIvQCd6d1BXKyUhIzYkIjBAWmRaUXNBKSEjNjckNyQkIjBCcTosJDMvUyEjNyQiL0dELT1XTCMpISM1NyQkIjBWOyFHSmQuUyEjNyQiMCdSZV85WFUjKSEjNjckNyQkIjAwLjIjeVAuUyEjNyQiMDtUSE4jKWVDKSEjNjckJCIwVjshR0pkLlMhIzckIjAnUmVfOVhVIykhIzY3JDckJCIwMC4yI3lQLlMhIzckIjA7VEhOIyllQykhIzY3JCQiMEckbztgci1TISM3JCIwMTBRYFV3RCkhIzY3JDckJCIwaUFGd3dFKyUhIzckIjBfSE8hSEtlIykhIzY3JCQiMEckbztgci1TISM3JCIwMTBRYFV3RCkhIzY3JDckJCIwaUFGd3dFKyUhIzckIjBfSE8hSEtlIykhIzY3JCQiMDE2KkdKXS1TISM3JCItbSg9PjlFKSEiKTckNyQkIjBmTiZHR0U1UyEjNyQiMDxXQUYsdzcpISM2NyQkIjApeic9XyUpKTRTISM3JCIwImZ1J1I8UjgpISM2NyQ3JCQiMCl6Jz1fJSkpNFMhIzckIjAiZnUnUjxSOCkhIzY3JCQiMEFcTHcmejRTISM3JCIwM20nPV1UTiIpISM2NyQ3JCQiMGpXR1VWIjRTISM3JCIwRk11JXpOWSIpISM2NyQkIjBBXEx3Jno0UyEjNyQiMDNtJz1dVE4iKSEjNjckNyQkIjBqV0dVViI0UyEjNyQiMEZNdSV6TlkiKSEjNjckJCIuLSU0QikpM1MhIzUkIjAlb0I6WHldIikhIzY3JDckJCIwXFF2Im9TM1MhIzckIjBqQSIpXCl6ZSIpISM2NyQkIi4tJTRCKSkzUyEjNSQiMCVvQjpYeV0iKSEjNjckNyQkIjBcUXYib1MzUyEjNyQiMGpBIilcKXplIikhIzY3JCQiMHo+OFF3eislISM3JCIwYyZbISkpSGg7KSEjNjckNyQkIjBObihmWW4yUyEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMHo+OFF3eislISM3JCIwYyZbISkpSGg7KSEjNjckNyQkIjBObihmWW4yUyEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMClHb3V5MjJTISM3JCIwL0gjXDlYIj0pISM2NyQ3JCQiLz4xMXAlcCslISM2JCIwTipcKmZ6Tz0pISM2NyQkIjApR291eTIyUyEjNyQiMC9II1w5WCI9KSEjNjckNyQkIi8+MTFwJXArJSEjNiQiME4qXCpmek89KSEjNjckJCIwTEIoeUhRMVMhIzckIjBZc0kpW1AkPikhIzY3JDckJCIwJ3lNeUU5OVMhIzckIjBjdVE4K1MxKSEjNjckJCIwbkJ2O2xPLCUhIzckIjA2L0xrOTwyKSEjNjckNyQkIjBuQnY7bE8sJSEjNyQiMDYvTGs5PDIpISM2NyQkIjBaYTBbW04sJSEjNyQiL3J4NCo+TzIpISM1NyQ3JCQiMF9nTF0qKkcsJSEjNyQiMFojKlI+YlQzKSEjNjckJCIwWmEwW1tOLCUhIzckIi9yeDQqPk8yKSEjNTckNyQkIjBfZ0xdKipHLCUhIzckIjBaIypSPmJUMykhIzY3JCQiLz0kUV8oZjdTISM2JCIwbSM9ZCc0IiozKSEjNjckNyQkIjA4VSUpZVFALCUhIzckIjAkM29XZGYnNCkhIzY3JCQiLz0kUV8oZjdTISM2JCIwbSM9ZCc0IiozKSEjNjckNyQkIjA4VSUpZVFALCUhIzckIjAkM29XZGYnNCkhIzY3JCQiMCJ6TGpZbDZTISM3JCIvQ1VXTWQvIikhIzU3JDckJCIwI0chUlAjUTZTISM3JCIwPnBgSE8hNCIpISM2NyQkIjAiekxqWWw2UyEjNyQiL0NVV01kLyIpISM1NyQ3JCQiMCNHIVJQI1E2UyEjNyQiMD5wYEhPITQiKSEjNjckJCIwSjYweT4yLCUhIzckIjAqemxeOyw/IikhIzY3JDckJCIwYT44IjNqNVMhIzckIjBiZGclb1pAIikhIzY3JCQiMEo2MHk+MiwlISM3JCIwKnpsXjssPyIpISM2NyQ3JCQiMGE+OCIzajVTISM3JCIwYmRnJW9aQCIpISM2NyQkIjBmTiZHR0U1UyEjNyQiMDxXQUYsdzcpISM2NyQ3JCQiMDdnIkdELT1TISM3JCIwPXUncFFbLSEpISM2NyQkIi9rQ05GZDxTISM2JCIwSmkpKik9XjQhKSEjNjckNyQkIi9rQ05GZDxTISM2JCIwSmkpKik9XjQhKSEjNjckJCIwOyFmWCJldSwlISM3JCIwMWtfYkA4LCkhIzY3JDckJCIwJ2ZJMDZ5O1MhIzckIjBuXTBXXz4tKSEjNjckJCIwOyFmWCJldSwlISM3JCIwMWtfYkA4LCkhIzY3JDckJCIwJ2ZJMDZ5O1MhIzckIjBuXTBXXz4tKSEjNjckJCIwZCJwd25ZO1MhIzckIi9qTiMpMyVwLSkhIzU3JDckJCIwRCNmK1gqZiwlISM3JCIwLlI3KkhSTSEpISM2NyQkIjBkInB3blk7UyEjNyQiL2pOIykzJXAtKSEjNTckNyQkIjBEI2YrWCpmLCUhIzckIjAuUjcqSFJNISkhIzY3JCQiMHZWZTglWzpTISM3JCIwMHdMQUtELykhIzY3JDckJCIwLCkqeidHQDpTISM3JCIwUkY+YUxvLykhIzY3JCQiMHZWZTglWzpTISM3JCIwMHdMQUtELykhIzY3JDckJCIwLCkqeidHQDpTISM3JCIwUkY+YUxvLykhIzY3JCQiMEp6PTQ1WCwlISM3JCIwQjAqKSpmNGUhKSEjNjckNyQkIjBWO1o6T1csJSEjNyQiMHY6RTR1I2YhKSEjNjckJCIwSno9NDVYLCUhIzckIjBCMCopKmY0ZSEpISM2NyQ3JCQiMFY7WjpPVywlISM3JCIwdjpFNHUjZiEpISM2NyQkIjAneU15RTk5UyEjNyQiMGN1UTgrUzEpISM2NyQ3JCQiMFJzelAtPi0lISM3JCIwbUlwXWxIJXohIzY3JCQiMFBTXno5Oy0lISM3JCIwXj9rODR0JXohIzY3JDckJCIwUFNeejk7LSUhIzckIjBeP2s4NHQleiEjNjckJCIwYWBjTFE6LSUhIzckIjAkNF0/a1pbeiEjNjckNyQkIjBmPiQpbyZ6P1MhIzckIjAoKTNyb1woZnohIzY3JCQiMGFgY0xROi0lISM3JCIwJDRdP2taW3ohIzY3JDckJCIwZj4kKW8mej9TISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjBUQSkzTF0/UyEjNyQiME9UWXROVSd6ISM2NyQ3JCQiMHZqWCE+KSo+UyEjNyQiMEIoelAtPnN6ISM2NyQkIjBUQSkzTF0/UyEjNyQiME9UWXROVSd6ISM2NyQ3JCQiMHZqWCE+KSo+UyEjNyQiMEIoelAtPnN6ISM2NyQkIjAoKnpQcnglPlMhIzckIjB4MmkhWycqenohIzY3JDckJCIwJio+YVF0Ij5TISM3JCIwZiZbKXlJWSl6ISM2NyQkIjAoKnpQcnglPlMhIzckIjB4MmkhWycqenohIzY3JDckJCIwJio+YVF0Ij5TISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBcRFlTaCU9UyEjNyQiMHJCSTVrYyp6ISM2NyQ3JCQiMGkzYjJxJD1TISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBcRFlTaCU9UyEjNyQiMHJCSTVrYyp6ISM2NyQ3JCQiMGkzYjJxJD1TISM3JCIwJlI8UjgyKCp6ISM2NyQkIjA3ZyJHRC09UyEjNyQiMD11J3BRWy0hKSEjNjckNyQkIjBsJXlGQXlEUyEjNyQiMGx6N29mYCl5ISM2NyQkIjA7MCozOCZcLSUhIzckIjAxbk8kcGEoKnkhIzY3JDckJCIwOzAqMzgmXC0lISM3JCIwMW5PJHBhKCp5ISM2NyQkIjBNJSk0LEFaLSUhIzckIjBYT3ZZWTQheiEjNjckNyQkIjAieUpOKDNULSUhIzckIjBWYlZbKCkqNHohIzY3JCQiME0lKTQsQVotJSEjNyQiMFhPdllZNCF6ISM2NyQ3JCQiMCJ5Sk4oM1QtJSEjNyQiMFZiVlsoKSo0eiEjNjckJCIwJXpONCpcTy0lISM3JCIwKFJAZ1kjbyJ6ISM2NyQ3JCQiMCx6XXVySy0lISM3JCIwelZdLkdDI3ohIzY3JCQiMCV6TjQqXE8tJSEjNyQiMChSQGdZI28ieiEjNjckNyQkIjAsel11ckstJSEjNyQiMHpWXS5HQyN6ISM2NyQkIjBkLkYneWVBUyEjNyQiMEE1QGhxRSR6ISM2NyQ3JCQiMHhtUkZTQy0lISM3JCIwOktkZW9bJHohIzY3JCQiMGQuRid5ZUFTISM3JCIwQTVAaHFFJHohIzY3JDckJCIweG1SRlNDLSUhIzckIjA6S2Rlb1skeiEjNjckJCIwUnN6UC0+LSUhIzckIjBtSXBdbEgleiEjNjckNyQkIjAjcGZ4P21IUyEjNyQiMG9XJSkqPmdIeSEjNjckJCIwYCl6c21ESFMhIzckIjBFRC09V2AkeSEjNjckNyQkIjBhKXpzbURIUyEjNyQiMEVELT1XYCR5ISM2NyQkIjBIJXAmb1IiSFMhIzckIi4lZS8jPnEkeSEiKjckNyQkIjAtd0dkJFFHUyEjNyQiMGk4NHQleVp5ISM2NyQkIjBIJXAmb1IiSFMhIzckIi4lZS8jPnEkeSEiKjckNyQkIjAtd0dkJFFHUyEjNyQiMGk4NHQleVp5ISM2NyQkIjAqUjYlNDwhR1MhIzckIjBsYjNIZkkmeSEjNjckNyQkIjAqXEUoUjt2LSUhIzckIjApPmciR0QtJ3khIzY3JCQiMCpSNiU0PCFHUyEjNyQiMGxiM0hmSSZ5ISM2NyQ3JCQiMCpcRShSO3YtJSEjNyQiMCk+ZyJHRC0neSEjNjckJCIwJD07QWEhcC0lISM3JCIwL29RT2shcHkhIzY3JDckJCIvJT0uM2JtLSUhIzYkIjBNIUhLZW1zeSEjNjckJCIwJD07QWEhcC0lISM3JCIwL29RT2shcHkhIzY3JDckJCIvJT0uM2JtLSUhIzYkIjBNIUhLZW1zeSEjNjckJCIwVVZXXC9lLSUhIzckIjB5OWcpXC4mKXkhIzY3JDckJCIwKjMxZCYqekRTISM3JCIvKHlIUTFeKXkhIzU3JCQiMFVWV1wvZS0lISM3JCIweTlnKVwuJil5ISM2NyQ3JCQiMCozMWQmKnpEUyEjNyQiLyh5SFExXil5ISM1NyQkIjBsJXlGQXlEUyEjNyQiMGx6N29mYCl5ISM2NyQ3JCQiMD00dSM+YUxTISM3JCIwPVJIPSxjeCghIzY3JCQiMCkpKVIqcDpHLiUhIzckIjAjPVp4PmUmeSghIzY3JDckJCIwKSkpUipwOkcuJSEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwdkBDIXlmS1MhIzckIjBiZyZvIzQnKXkoISM2NyQ3JCQiMCJRMydbOz4uJSEjNyQiMD1nIkdELSl6KCEjNjckJCIwdkBDIXlmS1MhIzckIjBiZyZvIzQnKXkoISM2NyQ3JCQiMCJRMydbOz4uJSEjNyQiMD1nIkdELSl6KCEjNjckJCIwLydIQUBWSlMhIzckIjA4b2heKHkveSEjNjckNyQkIjBkN2VcQjUuJSEjNyQiMGFbKXlJWTV5ISM2NyQkIjAvJ0hBQFZKUyEjNyQiMDhvaF4oeS95ISM2NyQ3JCQiMGQ3ZVxCNS4lISM3JCIwYVspeUlZNXkhIzY3JCQiMCk0TU4ieS0uJSEjNyQiMCIpKj1xI0c0I3khIzY3JDckJCIwbHIsbU8sLiUhIzckIi9wYEhPIUgjeSEjNTckJCIwKTRNTiJ5LS4lISM3JCIwIikqPXEjRzQjeSEjNjckNyQkIjBscixtTywuJSEjNyQiL3BgSE8hSCN5ISM1NyQkIjAjcGZ4P21IUyEjNyQiMG9XJSkqPmdIeSEjNjckNyQkIjBYQHN4QHUuJSEjNyQiMCo0cXY5SEJ4ISM2NyQkIjBFRSllXlRQUyEjNyQiMC1JU0F6THMoISM2NyQ3JCQiMEVFKWVeVFBTISM3JCIwLUlTQXpMcyghIzY3JCQiMEB6dzI4dS4lISM3JCIwRiJwPXJTQnghIzY3JDckJCIwSnJHIT5bT1MhIzckIjBRPVp4PmV0KCEjNjckJCIwQHp3Mjh1LiUhIzckIjBGInA9clNCeCEjNjckNyQkIjBKckchPltPUyEjNyQiMFE9Wng+ZXQoISM2NyQkIjBLZGRXKT1PUyEjNyQiMHkhUSNSdShSeCEjNjckNyQkIjBDXmNFYmIuJSEjNyQiMHUxYUtnI1t4ISM2NyQkIjBLZGRXKT1PUyEjNyQiMHkhUSNSdShSeCEjNjckNyQkIjBDXmNFYmIuJSEjNyQiMHUxYUtnI1t4ISM2NyQkIjBfSFhkd1wuJSEjNyQiMDlBJlwyNWN4ISM2NyQ3JCQiMCc0Kkg8TlkuJSEjNyQiL140dzNxZ3ghIzU3JCQiMF9IWGR3XC4lISM3JCIwOUEmXDI1Y3ghIzY3JDckJCIwKDQqSDxOWS4lISM3JCIvXjR3M3FneCEjNTckJCIweCZ5XHN4TFMhIzckIjBccHAob1FzeCEjNjckNyQkIjAnKSkqKls6c0xTISM3JCIwWSR5RTk5dHghIzY3JCQiMHgmeVxzeExTISM3JCIwXHBwKG9Rc3ghIzY3JDckJCIwJykpKipbOnNMUyEjNyQiMFkkeUU5OXR4ISM2NyQkIjA9NHUjPmFMUyEjNyQiMD1SSD0sY3goISM2NyQ3JCQiMHJMcWksOC8lISM3JCIwV3UuNDZFbighIzY3JCQiLykqcGxMQVRTISM2JCIwZXc3LTxPbighIzY3JDckJCIvKSpwbExBVFMhIzYkIjBldzctPE9uKCEjNjckJCIwWCEqKUd4PlRTISM3JCIwa1hjO11SbighIzY3JDckJCIwaCIpSCU0RVNTISM3JCIwJVwnPmRkZ28oISM2NyQkIjBYISopR3g+VFMhIzckIjBrWGM7XVJuKCEjNjckNyQkIjBoIilIJTRFU1MhIzckIjAlXCc+ZGRnbyghIzY3JCQiMFAmNDREIypSUyEjNyQiMHMtcGt6L3AoISM2NyQ3JCQiMGtHaFswJFJTISM3JCIvTGxBIilcKXAoISM1NyQkIjBQJjQ0RCMqUlMhIzckIjBzLXBrei9wKCEjNjckNyQkIjBrR2hbMCRSUyEjNyQiL0xsQSIpXClwKCEjNTckJCIwKnlnNzVtUVMhIzckIjAuUV03bHBxKCEjNjckNyQkIjBtJ283cE5RUyEjNyQiMG1UTG5RNHIoISM2NyQkIjAqeWc3NW1RUyEjNyQiMC5RXTdscHEoISM2NyQ3JCQiMG0nbzdwTlFTISM3JCIwbVRMblE0cighIzY3JCQiMFhAc3hAdS4lISM3JCIwKjRxdjlIQnghIzY3JDckJCIwKWYlb1oiPVhTISM3JCIwOyEzUnNbQnchIzY3JCQiMC5MdCc+OlhTISM3JCIwOUImPVsmUWkoISM2NyQ3JCQiMC5MdCc+OlhTISM3JCIwOUImPVsmUWkoISM2NyQkIjBQSXYpPTlYUyEjNyQiMC9bKGY8KVJpKCEjNjckNyQkIjBgKmZnKWVULyUhIzckIi86QHBgSE93ISM1NyQkIjBQSXYpPTlYUyEjNyQiMC9bKGY8KVJpKCEjNjckNyQkIjBgKmZnKWVULyUhIzckIi86QHBgSE93ISM1NyQkIjBPJj1pQCJRLyUhIzckIjBpOC8sJ29TdyEjNjckNyQkIjBLOj80dEovJSEjNyQiMCcpKiopPmZ0W3chIzY3JCQiME8mPWlAIlEvJSEjNyQiMGk4Lywnb1N3ISM2NyQ3JCQiMEs6PzR0Si8lISM3JCIwJykqKik+ZnRbdyEjNjckJCIwKkcnUUIoXFVTISM3JCIwVVVeIkdNZHchIzY3JDckJCIwak4+ZCU+VVMhIzckIjBBKWVxazxodyEjNjckJCIwKkcnUUIoXFVTISM3JCIwVVVeIkdNZHchIzY3JDckJCIwak4+ZCU+VVMhIzckIjBBKWVxazxodyEjNjckJCIwckxxaSw4LyUhIzckIjBXdS40NkVuKCEjNjckNyQkIjBDZW1LaCFcUyEjNyQiMC5obURqZWQoISM2NyQkIjA7SU01Iz1bUyEjNyQiMDBlaztMbGUoISM2NyQ3JCQiMDtJTTUjPVtTISM3JCIwMGVrO0xsZSghIzY3JCQiLy9QVTUoeS8lISM2JCIwa0thdlwuZighIzY3JDckJCIwTFAuVmtyLyUhIzckIjBUWXJydCopZighIzY3JCQiLy9QVTUoeS8lISM2JCIwa0thdlwuZighIzY3JDckJCIwTFAuVmtyLyUhIzckIjBUWXJydCopZighIzY3JCQiMFhWVFcpXFlTISM3JCIwbT5mWiI+MnchIzY3JDckJCIwJG8hcFJhaC8lISM3JCIweU15RTk5aCghIzY3JCQiMFhWVFcpXFlTISM3JCIwbT5mWiI+MnchIzY3JDckJCIwJG8hcFJhaC8lISM3JCIweU15RTk5aCghIzY3JCQiMClmJW9aIj1YUyEjNyQiMDshM1JzW0J3ISM2NyQ3JCQiMF5xazxUSDAlISM3JCIwVFBAInBuSHYhIzY3JCQiMGFUcWJQQjAlISM3JCIwaC9QJzR4T3YhIzY3JDckJCIwYVRxYlBCMCUhIzckIjBoL1AnNHhPdiEjNjckJCIwW3VxWjlAMCUhIzckIjBRO2B0QCVSdiEjNjckNyQkIjB3ajZHJ0deUyEjNyQiMChIUjk6QFx2ISM2NyQkIjBbdXFaOUAwJSEjNyQiMFE7YHRAJVJ2ISM2NyQ3JCQiMHdqNkcnR15TISM3JCIwKEhSOTpAXHYhIzY3JCQiMDk7Olt6MTAlISM3JCIwSEYpSE5ZY3YhIzY3JDckJCIwQCNwZklDXVMhIzckIjBMIjNsP2xodiEjNjckJCIwOTs6W3oxMCUhIzckIjBIRilITlljdiEjNjckNyQkIjBAI3BmSUNdUyEjNyQiMEwiM2w/bGh2ISM2NyQkIjBAI1FqOUVcUyEjNyQiMEtbcSkzWHR2ISM2NyQ3JCQiMGZXVXoyI1xTISM3JCIwcHBkaCM0dXYhIzY3JCQiMEAjUWo5RVxTISM3JCIwS1txKTNYdHYhIzY3JDckJCIwZldVejIjXFMhIzckIjBwcGRoIzR1diEjNjckJCIwQ2VtS2ghXFMhIzckIjAuaG1EamVkKCEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjAjKikqZndrW1soISM2NyQkIjBVJEh3RGpjUyEjNyQiMDxeNHczcVsoISM2NyQ3JCQiMFUkSHdEamNTISM3JCIwPF40dzNxWyghIzY3JCQiMGl1aHVmbDAlISM3JCIwUnZIYVl5WyghIzY3JDckJCIwYk87KWVhYlMhIzckIjBgUjtKXCUqXCghIzY3JCQiMGl1aHVmbDAlISM3JCIwUnZIYVl5WyghIzY3JDckJCIwYk87KWVhYlMhIzckIjBgUjtKXCUqXCghIzY3JCQiL3dsanEwYlMhIzYkIjA5V0NQMF5dKCEjNjckNyQkIjAmPiRvb25XMCUhIzckIjAqeUtpKSopPV4oISM2NyQkIi93bGpxMGJTISM2JCIwOVdDUDBeXSghIzY3JDckJCIwJj4kb29uVzAlISM3JCIwKnlLaSkqKT1eKCEjNjckJCIwMUguIUdkYFMhIzckIjBFdzs5MEJfKCEjNjckNyQkIi8yXiYpeVJgUyEjNiQiMEQ7SVRJVl8oISM2NyQkIjAxSC4hR2RgUyEjNyQiMEV3OzkwQl8oISM2NyQ3JCQiLzJeJil5UmBTISM2JCIwRDtJVElWXyghIzY3JCQiMF5xazxUSDAlISM3JCIwVFBAInBuSHYhIzY3JDckJCIwLyY0dzNxZ1MhIzckIjBcVz9vIlFUdSEjNjckJCIwQS02JzQmKmZTISM3JCIwNCcpKTNyb1x1ISM2NyQ3JCQiMEEtNic0JipmUyEjNyQiMDQnKSkzcm9cdSEjNjckJCIwQkx5Ml0nZlMhIzckIi92bVVrMGB1ISM1NyQ3JCQiMG14SSllJCllUyEjNyQiMFh1JmZ3N2l1ISM2NyQkIjBCTHkyXSdmUyEjNyQiL3ZtVWswYHUhIzU3JDckJCIwbXhJKWUkKWVTISM3JCIwWHUmZnc3aXUhIzY3JCQiMDk0WCFRNGVTISM3JCIwLG0lM3JbcXUhIzY3JDckJCIwYWkqcCdIeDAlISM3JCIwIkdFNSNvWFooISM2NyQkIjA5NFghUTRlUyEjNyQiMCxtJTNyW3F1ISM2NyQ3JCQiMGFpKnAnSHgwJSEjNyQiMCJHRTUjb1haKCEjNjckJCIweCNHRTUjbzAlISM3JCIwIyopKmZ3a1tbKCEjNjckNyQkIi90IWZzIWVrUyEjNiQiMG0meS5aOypSKCEjNjckJCIwdSwxeDRYMSUhIzckIjBsS2ghXCMqKlIoISM2NyQ3JCQiMHUsMXg0WDElISM3JCIwbEtoIVwjKipSKCEjNjckJCIwaVAoUSp6VzElISM3JCIwVzpgMlstUyghIzY3JDckJCIwT3k5eGJMMSUhIzckIjAsQG9YbEJUKCEjNjckJCIwaVAoUSp6VzElISM3JCIwVzpgMlstUyghIzY3JDckJCIwT3k5eGJMMSUhIzckIjAsQG9YbEJUKCEjNjckJCIveiM+O1hHMSUhIzYkIjAwVShlLyR6VCghIzY3JDckJCIwcyhRUTZAaVMhIzckIjBQNHYrMVtVKCEjNjckJCIveiM+O1hHMSUhIzYkIjAwVShlLyR6VCghIzY3JDckJCIwcyhRUTZAaVMhIzckIjBQNHYrMVtVKCEjNjckJCIwMFc1eko3MSUhIzckIjA8Ll4/V2JWKCEjNjckNyQkIjB5Zjd2djUxJSEjNyQiMHQoPmVsQ1B1ISM2NyQkIjAwVzV6SjcxJSEjNyQiMDwuXj9XYlYoISM2NyQ3JCQiMHlmN3Z2NTElISM3JCIwdCg+ZWxDUHUhIzY3JCQiMC8mNHczcWdTISM3JCIwXFc/byJRVHUhIzY3JDckJCIwZD5kZGclb1MhIzckIjAjKnAuangiZXQhIzY3JCQiMC1VUy1PIW9TISM3JCIwZG5TRC5FTyghIzY3JDckJCIwLVVTLU8hb1MhIzckIjBkblNELkVPKCEjNjckJCIwO01RU115MSUhIzckIjBwJHBTKGZYTyghIzY3JDckJCIweGInSDMmbzElISM3JCIwJGZ2L1EvdnQhIzY3JCQiMDtNUVNdeTElISM3JCIwcCRwUyhmWE8oISM2NyQ3JCQiMHhiJ0gzJm8xJSEjNyQiMCRmdi9RL3Z0ISM2NyQkIjBgdDs+YGgxJSEjNyQiMCU+MD9CVyNRKCEjNjckNyQkIjAnekIxYW5sUyEjNyQiMEhXYU4lWyhRKCEjNjckJCIwYHQ7PmBoMSUhIzckIjAlPjA/QlcjUSghIzY3JDckJCIwJ3pCMWFubFMhIzckIjBIV2FOJVsoUSghIzY3JCQiL3QhZnMhZWtTISM2JCIwbSZ5Llo7KlIoISM2NyQ3JCQiMCQ9YEQvTXNTISM3JCIwVCd5PytPPXQhIzY3JCQiMGVzcSV5bHJTISM3JCIwXC0/ZyJHRHQhIzY3JDckJCIwZXNxJXlsclMhIzckIjBcLT9nIkdEdCEjNjckJCIwcml4RFo4MiUhIzckIjBtKFJZaFlHdCEjNjckNyQkIjA7XSNRLFdxUyEjNyQiMCYzcF9Ac1B0ISM2NyQkIjByaXhEWjgyJSEjNyQiMG0oUlloWUd0ISM2NyQ3JCQiMDtdI1EsV3FTISM3JCIwJjNwX0BzUHQhIzY3JCQiME0jXFFLZXBTISM3JCIwcz8mUkhjWXQhIzY3JDckJCIwJG9wS0VCcFMhIzckIjBAekxxaSxOKCEjNjckJCIwTSNcUUtlcFMhIzckIjBzPyZSSGNZdCEjNjckNyQkIjAkb3BLRUJwUyEjNyQiMEB6THFpLE4oISM2NyQkIjBkPmRkZyVvUyEjNyQiMCMqcC5qeCJldCEjNjckNyQkIi9UTXYtQXdTISM2JCIwOVcwQW8nenMhIzY3JCQiMCQ0TjYmemAyJSEjNyQiL3UkKlwqZnpHKCEjNTckNyQkIjAkNE42JnpgMiUhIzckIi91JCpcKmZ6RyghIzU3JCQiMHY5cS4iKVwyJSEjNyQiMEt4d11MPkgoISM2NyQ3JCQiMCNITzN6N3VTISM3JCIwd0QxXSsvSSghIzY3JCQiMHY5cS4iKVwyJSEjNyQiMEt4d11MPkgoISM2NyQ3JCQiMCNITzN6N3VTISM3JCIwd0QxXSsvSSghIzY3JCQiMFcyIilSWEoyJSEjNyQiMHMrZCUqZi1KKCEjNjckNyQkIjBoIXpkcClHMiUhIzckIjA3OTgwVEdKKCEjNjckJCIwVzIiKVJYSjIlISM3JCIwcytkJSpmLUooISM2NyQ3JCQiMGghemRwKUcyJSEjNyQiMDg5ODBUR0ooISM2NyQkIjAkPWBEL01zUyEjNyQiMFQneT8rTz10ISM2NyQ3JCQiME9jXjcrLDMlISM3JCIwKFFcLiJmP0MoISM2NyQkIjBKNklcMCN6UyEjNyQiMEtzeUhRMUQoISM2NyQ3JCQiMEo2SVwwI3pTISM3JCIwS3N5SFExRCghIzY3JCQiMGZQUFtqKHlTISM3JCIwVTBSPENcRCghIzY3JDckJCIwZHVpYT16MiUhIzckIjBvZyZbKXlJRSghIzY3JCQiMGZQUFtqKHlTISM3JCIwVTBSPENcRCghIzY3JDckJCIwZHVpYT16MiUhIzckIjBvZyZbKXlJRSghIzY3JCQiL2NLPjQmbzIlISM2JCIwUVApcHNcdHMhIzY3JDckJCIwY3IqSEZrd1MhIzckIjAvXCMqUj5iRighIzY3JCQiL2NLPjQmbzIlISM2JCIwUVApcHNcdHMhIzY3JDckJCIwY3IqSEZrd1MhIzckIjAvXCMqUj5iRighIzY3JCQiL1RNdi1Bd1MhIzYkIjA5VzBBbyd6cyEjNjckNyQkIjBqb1woKnpSMyUhIzckIjBMJ0ciRyFcMHMhIzY3JCQiMHBDJSlbU0ozJSEjNyQiMEMyZWs7TEAoISM2NyQ3JCQiMHBDJSlbU0ozJSEjNyQiMEMyZWs7TEAoISM2NyQkIjB0LSVIeHEjMyUhIzckIjAvYSdSZ1I8cyEjNjckNyQkIi9FaXhtIj0zJSEjNiQiL2NcJz5kZEEoISM1NyQkIjB0LSVIeHEjMyUhIzckIjAvYSdSZ1I8cyEjNjckNyQkIi9FaXhtIj0zJSEjNiQiL2NcJz5kZEEoISM1NyQkIjBlJXliQnIhMyUhIzckIjBtKUhmWUJPcyEjNjckNyQkIjA4VGRcLzAzJSEjNyQiMCdSPVp4PlFzISM2NyQkIjBlJXliQnIhMyUhIzckIjBtKUhmWUJPcyEjNjckNyQkIjA4VGRcLzAzJSEjNyQiMCdSPVp4PlFzISM2NyQkIjBPY143KywzJSEjNyQiMChRXC4iZj9DKCEjNjckNyQkIjAqM3lDKWZ5MyUhIzckIjAmUm1QKj4qcHIhIzY3JCQiMHImPjYlKj0oMyUhIzckIjA7VVAqXCpmPCghIzY3JDckJCIwciY+NiUqPSgzJSEjNyQiMDtVUCpcKmY8KCEjNjckJCIwPD0/W0dvMyUhIzckIjA5MlclPkl6ciEjNjckNyQkIjB6Tjs5RmUzJSEjNyQiMF9JV2FOJSk9KCEjNjckJCIwPD0/W0dvMyUhIzckIjA5MlclPkl6ciEjNjckNyQkIjB6Tjs5RmUzJSEjNyQiMF9JV2FOJSk9KCEjNjckJCIwJUgwelB1JTMlISM3JCIwIjNHJSpwVSk+KCEjNjckNyQkIjA5J2VIcVolMyUhIzckIjApKT1eNHczPyghIzY3JCQiMCVIMHpQdSUzJSEjNyQiMCIzRyUqcFUpPighIzY3JDckJCIwOSdlSHFaJTMlISM3JCIwKSk9XjR3Mz8oISM2NyQkIjBqb1woKnpSMyUhIzckIjBMJ0ciRyFcMHMhIzY3JDckJCIwOyRmdSdSPDQlISM3JCIwcyhRU3BJTnIhIzY3JCQiMHVxblJkODQlISM3JCIwM3g7TXQnUXIhIzY3JDckJCIwdXFuUmQ4NCUhIzckIjAzeDtNdCdRciEjNjckJCIwRCpRYkE5IjQlISM3JCIwL1p1JCopZVNyISM2NyQ3JCQiL0NeL10mKiozJSEjNiQiMFdsQipRNl5yISM2NyQkIjBEKlFiQTkiNCUhIzckIjAvWnUkKillU3IhIzY3JDckJCIvQ14vXSYqKjMlISM2JCIwV2xCKlE2XnIhIzY3JCQiMGYuJW80JyopMyUhIzckIjB4MyR6Ty1nciEjNjckNyQkIjB4eXBKbCYpMyUhIzckIi9RMFZXYmpyISM1NyQkIjBmLiVvNCcqKTMlISM3JCIweDMkek8tZ3IhIzY3JDckJCIweHlwSmwmKTMlISM3JCIvUTBWV2JqciEjNTckJCIwKjN5QylmeTMlISM3JCIwJlJtUCo+KnByISM2NyQ3JCQiMFUwV18+YzQlISM3JCIwJmZpcj5oLHIhIzY3JCQiMCZIQmBiPyU0JSEjNyQiME8rLkMjejhyISM2NyQ3JCQiMCZIQmBiPyU0JSEjNyQiME8rLkMjejhyISM2NyQkIjA8S3RvIlEkNCUhIzckIi9MZmN4JzQ3KCEjNTckNyQkIjAlPXN0WHgjNCUhIzckIjBzKSk0ektpNyghIzY3JCQiMDxLdG8iUSQ0JSEjNyQiL0xmY3gnNDcoISM1NyQ3JCQiMCU9c3RYeCM0JSEjNyQiMHMpKTR6S2k3KCEjNjckJCIwOyRmdSdSPDQlISM3JCIwcyhRU3BJTnIhIzY3JDckJCIwcDxVUCpcKjQlISM3JCIwOFhzSjcpb3EhIzY3JCQiMFFcMUolZSk0JSEjNyQiMEdOIyllcWsyKCEjNjckNyQkIjBRXDFKJWUpNCUhIzckIjBHTiMpZXFrMighIzY3JCQiME5xInpmLSk0JSEjNyQiMERoImVcPiIzKCEjNjckNyQkIi8wQlQtNig0JSEjNiQiMGtCKlE2IiopMyghIzY3JCQiME5xInpmLSk0JSEjNyQiMERoImVcPiIzKCEjNjckNyQkIi8wQlQtNig0JSEjNiQiMGtCKlE2IiopMyghIzY3JCQiMC16LEpvYzQlISM3JCIwZCpRZ18+LHIhIzY3JDckJCIvJ0czKClcYzQlISM2JCIuNycqb144NSghIio3JCQiMC16LEpvYzQlISM3JCIwZCpRZ18+LHIhIzY3JDckJCIvJ0czKClcYzQlISM2JCIuNycqb144NSghIio3JCQiMFUwV18+YzQlISM3JCIwJmZpcj5oLHIhIzY3JDckJCIwJypIU0F6TDUlISM3JCIwb3VeIlsmby4oISM2NyQkIjB5KG9KcTQuVCEjNyQiLy08TypbIlJxISM1NyQ3JCQiMHkob0pxNC5UISM3JCIvLTxPKlsiUnEhIzU3JCQiMHN3dl87SDUlISM3JCIwJiplKlxEalNxISM2NyQ3JCQiMCdmRCYqemQsVCEjNyQiMGNlb1sqZV5xISM2NyQkIjBzd3ZfO0g1JSEjNyQiMCYqZSpcRGpTcSEjNjckNyQkIjAnZkQmKnpkLFQhIzckIjBjZW9bKmVecSEjNjckJCIwNEE2c1EvNSUhIzckIjBCXXIxPTUxKCEjNjckNyQkIjAoPTQkR3QrNSUhIzckIjAjcGFQKy5rcSEjNjckJCIwNEE2c1EvNSUhIzckIjBCXXIxPTUxKCEjNjckNyQkIjAoPTQkR3QrNSUhIzckIjAjcGFQKy5rcSEjNjckJCIwcDxVUCpcKjQlISM3JCIwOFhzSjcpb3EhIzY3JDckJCIwQVVRMmZzNSUhIzckIjAkKSpHaXlyMHEhIzY3JCQiMCdRJSlSUD0xVCEjNyQiMFskek15RTlxISM2NyQ3JCQiMCdRJSlSUD0xVCEjNyQiMFskek15RTlxISM2NyQkIi9aX1wsWjBUISM2JCIwdmNTJFIrP3EhIzY3JDckJCIwRSEpb3ZLWTUlISM3JCIwJT1bJlEzbi0oISM2NyQkIi9aX1wsWjBUISM2JCIwdmNTJFIrP3EhIzY3JDckJCIwRSEpb3ZLWTUlISM3JCIwJT1bJlEzbi0oISM2NyQkIjAnKkhTQXpMNSUhIzckIjBvdV4iWyZvLighIzY3JDckJCIwXGFPIypRNjYlISM3JCIwW1tzIzNPdnAhIzY3JCQiMGJsVmhMNDYlISM3JCIwUkdGPVlwKHAhIzY3JDckJCIwYmxWaEw0NiUhIzckIjBSR0Y9WXAocCEjNjckJCIwQy89XSF6NVQhIzckIjAzSzBRaiF5cCEjNjckNyQkIjBAY25NTSQ0VCEjNyQiMHY7TXQnUSopcCEjNjckJCIwQy89XSF6NVQhIzckIjAzSzBRaiF5cCEjNjckNyQkIjBAY25NTSQ0VCEjNyQiMHY7TXQnUSopcCEjNjckJCIwdFtnSCI0M1QhIzckIjB4b1EhKWUiKipwISM2NyQ3JCQiMFomPkYwdjJUISM3JCIwNjBUR0Y9KyghIzY3JCQiMHRbZ0giNDNUISM3JCIweG9RISllIioqcCEjNjckNyQkIjBaJj5GMHYyVCEjNyQiMDYwVEdGPSsoISM2NyQkIjBBVVEyZnM1JSEjNyQiMCQpKkdpeXIwcSEjNjckNyQkIjB2bU14PV02JSEjNyQiMGJJem9qZCVwISM2NyQkIjBYXVRMJT05VCEjNyQiMG5eODNsPyZwISM2NyQ3JCQiMFhdVEwlPTlUISM3JCIwbl44M2w/JnAhIzY3JCQiMCQzSVcrZThUISM3JCIwRjFvSHltJnAhIzY3JDckJCIwKD5hWDNiN1QhIzckIjAuUz9qMFgncCEjNjckJCIwJDNJVytlOFQhIzckIjBGMW9IeW0mcCEjNjckNyQkIjAoPmFYM2I3VCEjNyQiMC5TP2owWCdwISM2NyQkIjBcYU8jKlE2NiUhIzckIjBbW3MjM092cCEjNjckNyQkIjAtektpKSopPVQhIzckIjAoW3BFTylvInAhIzY3JCQiMCQqKSlvIlJdPFQhIzckIjAmXCgqelI9RnAhIzY3JDckJCIwJCopKW8iUl08VCEjNyQiMCZcKCp6Uj1GcCEjNjckJCIwI2YrTlJYO1QhIzckIjBESll2QV0kcCEjNjckNyQkIjBQQkNFTmU2JSEjNyQiMEpqMWBDJ1JwISM2NyQkIjAjZitOUlg7VCEjNyQiMERKWXZBXSRwISM2NyQ3JCQiMFBCQ0VOZTYlISM3JCIwSmoxYEMnUnAhIzY3JCQiMHZtTXg9XTYlISM3JCIwYkl6b2pkJXAhIzY3JDckJCIwRyI0dCV5RjclISM3JCIwZSRISitxKSlvISM2NyQkIjBUJFspUTtFNyUhIzckIjAoKTR6S2kpKilvISM2NyQ3JCQiMFQkWylRO0U3JSEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMHJnWSJ5W0FUISM3JCIwUi4sSiV6ISpvISM2NyQ3JCQiME0rbFclKjM3JSEjNyQiMEIpZnlHSS1wISM2NyQkIjByZ1kieVtBVCEjNyQiMFIuLEoleiEqbyEjNjckNyQkIjBNK2xXJSozNyUhIzckIjBCKWZ5R0ktcCEjNjckJCIwdnA4MD4lPlQhIzckIjBrJnosWjI4cCEjNjckNyQkIjBOPXBtKj0+VCEjNyQiMGYnR0hNdTlwISM2NyQkIjB2cDgwPiU+VCEjNyQiMGsmeixaMjhwISM2NyQ3JCQiME49cG0qPT5UISM3JCIwZidHSE11OXAhIzY3JCQiMC16S2kpKik9VCEjNyQiMChbcEVPKW8icCEjNjckNyQkIjBiLkhLZW03JSEjNyQiMFIsIz0iKj1obyEjNjckJCIwVmZLZjxoNyUhIzckIjA6TGxBIilcJ28hIzY3JDckJCIwVmZLZjxoNyUhIzckIjA6TGxBIilcJ28hIzY3JCQiMGtoXSg0bkRUISM3JCIwSzgnNHI5b28hIzY3JDckJCIwQCYqKkghZVY3JSEjNyQiMF5Ac3hAdShvISM2NyQkIjBraF0oNG5EVCEjNyQiMEs4JzRyOW9vISM2NyQ3JCQiMEAmKipIIWVWNyUhIzckIjBeQHN4QHUobyEjNjckJCIwRyI0dCV5RjclISM3JCIwZSRISitxKSlvISM2NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMG03JDNxSk1vISM2NyQkIjB1NVoqXHBIVCEjNyQiMFZjXjcrLCVvISM2NyQ3JCQiMHU1WipccEhUISM3JCIwVmNeNyssJW8hIzY3JCQiMHlfKmYkcCpHVCEjNyQiMHlxdFdJXiVvISM2NyQ3JCQiMFhoNSJvKnk3JSEjNyQiMHpXZW5TRCZvISM2NyQkIjB5XypmJHAqR1QhIzckIjB5cXRXSV4lbyEjNjckNyQkIjBYaDUibyp5NyUhIzckIjB6V2VuU0QmbyEjNjckJCIwYi5IS2VtNyUhIzckIjBSLCM9Iio9aG8hIzY3JDckJCIwM0dELT1XOCUhIzckIjAsLDpuZiEzbyEjNjckJCIwUXpqd11MOCUhIzckIjByelAtPl8ibyEjNjckNyQkIjBRemp3XUw4JSEjNyQiMHJ6UC0+XyJvISM2NyQkIjBBZVAzJFJLVCEjNyQiME5rPio9ckBvISM2NyQ3JCQiLyVSSiVIXkpUISM2JCIwMm9XZGZ3I28hIzY3JCQiMEFlUDMkUktUISM3JCIwTms+Kj1yQG8hIzY3JDckJCIvJVJKJUheSlQhIzYkIjAyb1dkZncjbyEjNjckJCIwImVycyJRMDglISM3JCIwbTckM3FKTW8hIzY3JDckJCIwTVNCKHlIUVQhIzckIjBoUWtkJFIjeSchIzY3JCQiME0wJCozKDNQVCEjNyQiMCpIU0F6TCF6JyEjNjckNyQkIjBNMCQqMygzUFQhIzckIjAqSFNBekwheichIzY3JCQiMDdxUlNgZjglISM3JCIvLHpZYCZ5eichIzU3JDckJCIwS3RYZzNfOCUhIzckIjBOIjR0JXlGIW8hIzY3JCQiMDdxUlNgZjglISM3JCIvLHpZYCZ5eichIzU3JDckJCIwS3RYZzNfOCUhIzckIjBOIjR0JXlGIW8hIzY3JCQiMDNHRC09VzglISM3JCIwLCw6bmYhM28hIzY3JDckJCIwaF9Ac3hAOSUhIzckIjBqSyFlZEhkbiEjNjckJCIwN1pnOjE0OSUhIzckIjBGRTUjb1hsbiEjNjckNyQkIjA3Wmc6MTQ5JSEjNyQiMEZFNSNvWGxuISM2NyQkIjAqcDJwR21SVCEjNyQiL29zdjBfdG4hIzU3JDckJCIwZHVaKGYpKlFUISM3JCIwajk8UCgqeXgnISM2NyQkIjAqcDJwR21SVCEjNyQiL29zdjBfdG4hIzU3JDckJCIwZHVaKGYpKlFUISM3JCIwajk8UCgqeXgnISM2NyQkIjBNU0IoeUhRVCEjNyQiMGhRa2QkUiN5JyEjNjckNyQkIjAoWyc+ZGRnOSUhIzckIjAnKW9belZGdCchIzY3JCQiMCopKmZiLCJbOSUhIzckIjBiXCc+ZGRTbiEjNjckNyQkIjAqKSpmYiwiWzklISM3JCIwYlwnPmRkU24hIzY3JCQiL2s/KVtOTjklISM2JCIweSU9ZkVtW24hIzY3JDckJCIwLFJpQlpHOSUhIzckIjAiekxxaSxgbiEjNjckJCIvaz8pW05OOSUhIzYkIjB5JT1mRW1bbiEjNjckNyQkIjAsUmlCWkc5JSEjNyQiMCJ6THFpLGBuISM2NyQkIjBoX0BzeEA5JSEjNyQiMGpLIWVkSGRuISM2NyQ3JCQiMDl4PFVQKlxUISM3JCIwdixkIWVyM24hIzY3JCQiL0IkKm83ISlbVCEjNiQiMCRHRj1ZcDpuISM2NyQ3JCQiL0IkKm83ISlbVCEjNiQiMCRHRj1ZcDpuISM2NyQkIjApSCNSJXBlWlQhIzckIjBSejxKSktzJyEjNjckNyQkIjAmcCJwYyV6WVQhIzckIjA+aCpvXjhHbiEjNjckJCIwKUgjUiVwZVpUISM3JCIwUno8SkpLcychIzY3JDckJCIwJnAicGMlellUISM3JCIwPmgqb144R24hIzY3JCQiMChbJz5kZGc5JSEjNyQiMCcpb1t6VkZ0JyEjNjckNyQkIi8lKmVycyJROiUhIzYkIjB3TkVaIT4mbychIzY3JCQiMDB5J2U7KUc6JSEjNyQiL2gqb144M3AnISM1NyQ3JCQiMDB5J2U7KUc6JSEjNyQiL2gqb144M3AnISM1NyQkIjAwJT44WyQ9OiUhIzckIjBUOlE8cXJwJyEjNjckNyQkIjBYP3g3STM6JSEjNyQiMFklZW5TRC5uISM2NyQkIjAwJT44WyQ9OiUhIzckIjBUOlE8cXJwJyEjNjckNyQkIjBYP3g3STM6JSEjNyQiMFklZW5TRC5uISM2NyQkIjA5eDxVUCpcVCEjNyQiMHYsZCFlcjNuISM2NyQ3JCQiMG4sOTcocGRUISM3JCIwejRaLVpAbSchIzY3JCQiMCIpNChmTTBkVCEjNyQiMFE+YlRLZm0nISM2NyQ3JCQiMCIpNChmTTBkVCEjNyQiMFE+YlRLZm0nISM2NyQkIi9ANFspKUhjVCEjNiQiMDdHNyJmVHFtISM2NyQ3JCQiMFs0ZzBjXDolISM3JCIwdTJpJ0hQeW0hIzY3JCQiL0A0WykpSGNUISM2JCIwN0c3ImZUcW0hIzY3JDckJCIwWzRnMGNcOiUhIzckIjB1MmknSFB5bSEjNjckJCIvJSplcnMiUTolISM2JCIwd05FWiE+Jm8nISM2NyQ3JCQiMCRSQHJwZGhUISM3JCIwJGVUXV9jUm0hIzY3JCQiMCplVnQoPTg7JSEjNyQiMG1VVEpeNWsnISM2NyQ3JCQiMCplVnQoPTg7JSEjNyQiMG1VVEpeNWsnISM2NyQkIjAjNG4rOCtoVCEjNyQiL1EpUTwoKkdrJyEjNTckNyQkIjAjUV5mVzxmVCEjNyQiMC1KWyc9XGBtISM2NyQkIjAjNG4rOCtoVCEjNyQiL1EpUTwoKkdrJyEjNTckNyQkIjAjUV5mVzxmVCEjNyQiMC1KWyc9XGBtISM2NyQkIjBuLDk3KHBkVCEjNyQiMHk0Wi1aQG0nISM2NyQ3JCQiL2ktQG9YbFQhIzYkIi94XjM2VjxtISM1NyQkIjA4PThSKFtqVCEjNyQiL1ZYajJoR20hIzU3JDckJCIwOD04UihbalQhIzckIi9WWGoyaEdtISM1NyQkIjAkUkBycGRoVCEjNyQiMCRlVF1fY1JtISM2NyQ3JCQiMFlRM25PJHBUISM3JCIwMjl5WEdkZichIzY3JCQiMCZlN2hvKnk7JSEjNyQiMGV4P21IUGcnISM2NyQ3JCQiMCZlN2hvKnk7JSEjNyQiMGV4P21IUGcnISM2NyQkIjAmem1PJXlmOyUhIzckIjA5XXVuKFw5bSEjNjckNyQkIjBBVkp2emM7JSEjNyQiMCVmdzctPDttISM2NyQkIjAmem1PJXlmOyUhIzckIjA5XXVuKFw5bSEjNjckNyQkIjBBVkp2emM7JSEjNyQiMCVmdzctPDttISM2NyQkIi9pLUBvWGxUISM2JCIveF4zNlY8bSEjNTckNyQkIjB0XTFfO0s8JSEjNyQiMG9jQitLV2QnISM2NyQkIjBuNlUhW1NzVCEjNyQiMCczcWcmWyl5bCEjNjckNyQkIjBuNlUhW1NzVCEjNyQiMCczcWcmWyl5bCEjNjckJCIwPUsiSHdFclQhIzckIjApUTAoZSg0JmUnISM2NyQ3JCQiMHUlb20kUSw8JSEjNyQiMEEqUTYiKkciZichIzY3JCQiMD1LIkh3RXJUISM3JCIwKVEwKGUoNCZlJyEjNjckNyQkIjB1JW9tJFEsPCUhIzckIjBBKlE2IipHImYnISM2NyQkIjBZUTNuTyRwVCEjNyQiMDI5eVhHZGYnISM2NyQ3JCQiMCpIWXFqNHhUISM3JCIwX1lZbUJOYichIzY3JCQiMGZdKnlJLHhUISM3JCIwOUMkZnUnUmInISM2NyQ3JCQiMGZdKnlJLHhUISM3JCIwOUMkZnUnUmInISM2NyQkIjA6Uk5EISpvPCUhIzckIjAubktPR1liJyEjNjckNyQkIjA7dF9MJ3B1VCEjNyQiL0QsNSEza2MnISM1NyQkIjA6Uk5EISpvPCUhIzckIjAubktPR1liJyEjNjckNyQkIjA7dF9MJ3B1VCEjNyQiL0QsNSEza2MnISM1NyQkIjB0XTFfO0s8JSEjNyQiMG9jQitLV2QnISM2NyQ3JCQiMEV2LUF3ND0lISM3JCIwMkZxUi5JYCchIzY3JCQiMCVwQV9hTnpUISM3JCIweU4nM3BfVGwhIzY3JDckJCIwJXBBX2FOelQhIzckIjB5TiczcF9UbCEjNjckJCIwKkhZcWo0eFQhIzckIjBfWVltQk5iJyEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjAqKm9JSFNHXichIzY3JCQiMHAwVlM8VD0lISM3JCIwMWZzIWVrO2whIzY3JDckJCIwcDBWUzxUPSUhIzckIjAxZnMhZWs7bCEjNjckJCIwJT5GXC8kSD0lISM3JCIwLkhzQD9HXychIzY3JDckJCIwQEZOWUI8PSUhIzckIjBVWnpOJzNIbCEjNjckJCIwJT5GXC8kSD0lISM3JCIwLkhzQD9HXychIzY3JDckJCIwQEZOWUI8PSUhIzckIjBVWnpOJzNIbCEjNjckJCIwRXYtQXc0PSUhIzckIjAyRnFSLklgJyEjNjckNyQkIjB6KiopPmZ0KT0lISM3JCIwJDQpKls5LSRcJyEjNjckJCIwInA2JFFQbD0lISM3JCIvMmRjXz8vbCEjNTckNyQkIjAicDYkUVBsPSUhIzckIi8yZGNfPy9sISM1NyQkIjBfKDNxZyZbPSUhIzckIjAqKm9JSFNHXichIzY3JDckJCIwMDcocGRoIz4lISM3JCIwQ1VNcVZOWichIzY3JCQiMCgzJSo0algiPiUhIzckIjApUj5iVEt6ayEjNjckNyQkIjAoMyUqNGpYIj4lISM3JCIwKVI+YlRLemshIzY3JCQiMCN6LSoqM1UqPSUhIzckIjA3X01ObyYqWychIzY3JDckJCIwWnhFciQpKik9JSEjNyQiME0jKWVxazxcJyEjNjckJCIwI3otKiozVSo9JSEjNyQiMDdfTU5vJipbJyEjNjckNyQkIjBaeEVyJCkqKT0lISM3JCIwTSMpZXFrPFwnISM2NyQkIjB6KiopPmZ0KT0lISM3JCIwJDQpKls5LSRcJyEjNjckNyQkIjBLQyY+Y1wnPiUhIzckIjAyMUxZdVZYJyEjNjckJCIwSmNYZSJbJz4lISM3JCIwRTxRMFZXWCchIzY3JDckJCIwSmNYZSJbJz4lISM3JCIwRTxRMFZXWCchIzY3JCQiMHAjM0JiWCc+JSEjNyQiMDw8NmlyWFgnISM2NyQ3JCQiMDZYYFxiUj4lISM3JCIwaTBYZyQpb1knISM2NyQkIjBwIzNCYlgnPiUhIzckIjA8PDZpclhYJyEjNjckNyQkIjA2WGBcYlI+JSEjNyQiMGkwWGckKW9ZJyEjNjckJCIwMDcocGRoIz4lISM3JCIwQ1VNcVZOWichIzY3JDckJCIwZU8kcGFQK1UhIzckIjAnKnomNF9fTmshIzY3JCQiMHBTdzBNISo+JSEjNyQiLypHSl0tP1cnISM1NyQ3JCQiMHBTdzBNISo+JSEjNyQiLypHSl0tP1cnISM1NyQkIjBLQyY+Y1wnPiUhIzckIjAyMUxZdVZYJyEjNjckNyQkIjAmKVsiPmBEL1UhIzckIjA6I3koUWNwVCchIzY3JCQiMDQyWVo/VT8lISM3JCIwPV88U0ByVCchIzY3JDckJCIwNDJZWj9VPyUhIzckIjA9XzxTQHJUJyEjNjckJCIwJ1JhXCVcVD8lISM3JCIwXjx2JzNZPGshIzY3JDckJCIwVC1naTg7PyUhIzckIjBhU0MmPmNIayEjNjckJCIwJ1JhXCVcVD8lISM3JCIwXjx2JzNZPGshIzY3JDckJCIwVC1naTg7PyUhIzckIjBhU0MmPmNIayEjNjckJCIwZU8kcGFQK1UhIzckIjAnKnomNF9fTmshIzY3JDckJCIwNmgqb144M1UhIzckIjBWaW05I28pUichIzY3JCQiMCRwT2NQJm8/JSEjNyQiMCJRMV4zby9rISM2NyQ3JCQiMCRwT2NQJm8/JSEjNyQiMCJRMV4zby9rISM2NyQkIjAmKVsiPmBEL1UhIzckIjA6I3koUWNwVCchIzY3JDckJCIwUXQoPV0sN1UhIzckIjBsInlMZm0hUSchIzY3JCQiME08blM5JjRVISM3JCIwWHYuSVNBUichIzY3JDckJCIwTTxuUzkmNFUhIzckIjBYdi5JU0FSJyEjNjckJCIwNmgqb144M1UhIzckIjBWaW05I28pUichIzY3JDckJCIwayZlb1sqZUAlISM3JCIwOy0sazxITychIzY3JCQiMDJ0Rz88XEAlISM3JCIwdCkqKik+ZnRPJyEjNjckNyQkIjAydEc/PFxAJSEjNyQiMHQpKiopPmZ0TychIzY3JCQiMDopKmU4VEVAJSEjNyQiMFxBYTgjenhqISM2NyQ3JCQiMCU+MWZEPzdVISM3JCIwNChvXCgqenpqISM2NyQkIjA6KSplOFRFQCUhIzckIjBcQWE4I3p4aiEjNjckNyQkIjAlPjFmRD83VSEjNyQiMDQob1woKnp6aiEjNjckJCIwUXQoPV0sN1UhIzckIjBsInlMZm0hUSchIzY3JDckJCIwInpSPVp4PlUhIzckIjBvYEZwNWFNJyEjNjckJCIwMzpsM2Z3QCUhIzckIjBQNSRbJz1cTichIzY3JDckJCIwMzpsM2Z3QCUhIzckIjBQNSRbJz1cTichIzY3JCQiMGsmZW9bKmVAJSEjNyQiMDstLGs8SE8nISM2NyQ3JCQiMDw1I29YbEJVISM3JCIwYmFMUVMiR2ohIzY3JCQiMCplYj1aQUJVISM3JCIwbExwYVArTCchIzY3JDckJCIwKmViPVpBQlUhIzckIjBsTHBhUCtMJyEjNjckJCIwLHFtTj1AQSUhIzckIjBPL1xMalxMJyEjNjckNyQkIjBbMk9YRy9BJSEjNyQiMCxBdzR5Q00nISM2NyQkIjAscW1OPUBBJSEjNyQiME8vXExqXEwnISM2NyQ3JCQiMFsyT1hHL0ElISM3JCIwLEF3NHlDTSchIzY3JCQiMCJ6Uj1aeD5VISM3JCIwb2BGcDVhTSchIzY3JDckJCIwV0EhPVdgRlUhIzckIjB1cl83LDZKJyEjNjckJCIwKUdYJFJaZ0ElISM3JCIwSFhpKnBmPGohIzY3JDckJCIwKkdYJFJaZ0ElISM3JCIwSFhpKnBmPGohIzY3JCQiMDw1I29YbEJVISM3JCIwYmFMUVMiR2ohIzY3JDckJCIvWiR5RTk5QiUhIzYkIjA5NDdEclVIJyEjNjckJCIweWdRSSgqKUdVISM3JCIwJHBiWGs6MGohIzY3JDckJCIweWdRSSgqKUdVISM3JCIwJHBiWGs6MGohIzY3JCQiMFdBIT1XYEZVISM3JCIwdXJfNyw2SichIzY3JDckJCIwKHBrPFRITlUhIzckIjBqPVFsYHdGJyEjNjckJCIwUVh4UnhZQiUhIzckIjBAIT1XYEYhRychIzY3JDckJCIwUVh4UnhZQiUhIzckIjBAIT1XYEYhRychIzY3JCQiMGMlW2p0JUdCJSEjNyQiMGw1SXU/IilHJyEjNjckNyQkIjApWzMiUnU8QiUhIzckIjBkb1sqZXIjSCchIzY3JCQiMGMlW2p0JUdCJSEjNyQiMGw1SXU/IilHJyEjNjckNyQkIjApWzMiUnU8QiUhIzckIjBkb1sqZXIjSCchIzY3JCQiL1okeUU5OUIlISM2JCIwOTQ3RHJVSCchIzY3JDckJCIwQmZ1J1I8UlUhIzckIjBvZkZTTTdFJyEjNjckJCIvbklBbGdQVSEjNiQiMCY9XCR6TXlFJyEjNjckNyQkIi9uSUFsZ1BVISM2JCIwJj1cJHpNeUUnISM2NyQkIjAocGs8VEhOVSEjNyQiMGo9UWxgd0YnISM2NyQ3JCQiLzpGPFEwVlUhIzYkIjAlKVtAZikqXEMnISM2NyQkIjBIPHVBaTBDJSEjNyQiMFwuR0MlUmJpISM2NyQ3JCQiMEg8dUFpMEMlISM3JCIwXC5HQyVSYmkhIzY3JCQiMEJmdSdSPFJVISM3JCIwb2ZGU003RSchIzY3JDckJCIwdyQzbk8kcEMlISM3JCIuWmU3WCpHaSEiKjckJCIwO1NdcV5sQyUhIzckIjB4RTk5ODBCJyEjNjckNyQkIjA7U11xXmxDJSEjNyQiMHhFOTk4MEInISM2NyQkIjAqKSk+M3pCWFUhIzckIjBHUS1eXWZCJyEjNjckNyQkIjBlTGRLV05DJSEjNyQiMDg6QHBgSEMnISM2NyQkIjAqKSk+M3pCWFUhIzckIjBHUS1eXWZCJyEjNjckNyQkIjBlTGRLV05DJSEjNyQiMDg6QHBgSEMnISM2NyQkIi86RjxRMFZVISM2JCIwJSlbQGYpKlxDJyEjNjckNyQkIjAuJypvXjgzRCUhIzckIjAkKikqSGJuSUAnISM2NyQkIjApcEtcUGVcVSEjNyQiMFRRMmZzIT1pISM2NyQ3JCQiMClwS1xQZVxVISM3JCIwVFEyZnMhPWkhIzY3JCQiMHckM25PJHBDJSEjNyQiLlplN1gqR2khIio3JDckJCIwSDNuTyRwYVUhIzckIjAnSCY+YVx0PichIzY3JCQiMHAlKmZCVEVEJSEjNyQiMDBdKy9LYz8nISM2NyQ3JCQiMHAlKmZCVEVEJSEjNyQiMDBdKy9LYz8nISM2NyQkIjAuJypvXjgzRCUhIzckIjAkKikqSGJuSUAnISM2NyQ3JCQiMGM/bEB0JmVVISM3JCIwaDIhNFF5Ij0nISM2NyQkIjBENnMlUXNiVSEjNyQiMHBoJCpbIj4kPichIzY3JDckJCIwRDZzJVFzYlUhIzckIjBwaCQqWyI+JD4nISM2NyQkIjBIM25PJHBhVSEjNyQiMCdIJj5hXHQ+JyEjNjckNyQkIjAjR0xtSVhpVSEjNyQiMCRHI0dhcmo7JyEjNjckJCIwYiJbVTonPkUlISM3JCIwKFwpelE1JG9oISM2NyQ3JCQiMGIiW1U6Jz5FJSEjNyQiMChcKXpRNSRvaCEjNjckJCIwaHAkKT02KmZVISM3JCIwIyp6bXpnazwnISM2NyQ3JCQiL2Q5PzckKWVVISM2JCIwTHQnUTR2IT0nISM2NyQkIjBocCQpPTYqZlUhIzckIjAjKnptemdrPCchIzY3JDckJCIvZDk/NyQpZVUhIzYkIjBMdCdRNHYhPSchIzY3JCQiMGM/bEB0JmVVISM3JCIwaDIhNFF5Ij0nISM2NyQ3JCQiMDRYaCJITG1VISM3JCIwMj8yRSw2OichIzY3JCQiMHAhNG5cNmxVISM3JCIwaCdIUClwZTonISM2NyQ3JCQiMHAhNG5cNmxVISM3JCIwaCdIUClwZTonISM2NyQkIjAjR0xtSVhpVSEjNyQiMCRHI0dhcmo7JyEjNjckNyQkIjBOZGZ3Ny1GJSEjNyQiMCV5JVwjPSdmOCchIzY3JCQiL3ldYjxIb1UhIzYkIjBEM21HSE05JyEjNjckNyQkIi95XWI8SG9VISM2JCIwRDNtR0hNOSchIzY3JCQiMDRYaCJITG1VISM3JCIwMj8yRSw2OichIzY3JDckJCIwaXBkaCM0dVUhIzckIjApKilbIW9ZNDcnISM2NyQkIjBUXVJVIlxyVSEjNyQiMCopPmZ0KSk0OCchIzY3JDckJCIwVF1SVSJcclUhIzckIjAqKT5mdCkpNDgnISM2NyQkIjBOZGZ3Ny1GJSEjNyQiMCV5JVwjPSdmOCchIzY3JDckJCIwKT1lbEMoekYlISM3JCIwYjh4bVxnNSchIzY3JCQiMG9jekNkekYlISM3JCIwO1ZYajJoNSchIzY3JDckJCIwb2N6Q2R6RiUhIzckIjA7VlhqMmg1JyEjNjckJCIwbkViKCl6eUYlISM3JCIwMHYrXy9rNSchIzY3JDckJCIwPSxoWDhaRiUhIzckIjBgSl89WyY9aCEjNjckJCIwbkViKCl6eUYlISM3JCIwMHYrXy9rNSchIzY3JDckJCIwPSxoWDhaRiUhIzckIjBgSl89WyY9aCEjNjckJCIwaXBkaCM0dVUhIzckIjApKilbIW9ZNDcnISM2NyQ3JCQiMDolUjpCJj1HJSEjNyQiMDk8LiRRRiI0JyEjNjckJCIwZHVOND83RyUhIzckIi9bJlEzbk80JyEjNTckNyQkIjBkdU40PzdHJSEjNyQiL1smUTNuTzQnISM1NyQkIjApPWVsQyh6RiUhIzckIjBiOHhtXGc1JyEjNjckNyQkIjBUMV87S2RHJSEjNyQiMDQjPURJZ3dnISM2NyQkIjAvUid6TV0lRyUhIzckIjBXbUpgRTczJyEjNjckNyQkIjAvUid6TV0lRyUhIzckIjBXbUpgRTczJyEjNjckJCIwOiVSOkImPUclISM3JCIwOTwuJFFGIjQnISM2NyQ3JCQiMG89XSw3JypHJSEjNyQiMC15dUtKPzEnISM2NyQkIjBPR2t4MXlHJSEjNyQiMDN5QylmeW9nISM2NyQ3JCQiME9Ha3gxeUclISM3JCIwM3lDKWZ5b2chIzY3JCQiMFQxXztLZEclISM3JCIwNCM9RElnd2chIzY3JDckJCIwJTQkWyc9XCRIJSEjNyQiMG9rMihIYlpnISM2NyQkIjAqZm1DJEg2SCUhIzckIjBzKnlKYU1jZyEjNjckNyQkIjAqZm1DJEg2SCUhIzckIjBzKnlKYU1jZyEjNjckJCIwbz1dLDcnKkclISM3JCIwLXl1S0o/MSchIzY3JDckJCIwQFZZcnJ0SCUhIzckIjBvPHpJaUouJyEjNjckJCIwVl1gV3FXSCUhIzckIjBPLDYpWyFSLychIzY3JDckJCIwVl1gV3FXSCUhIzckIjBPLDYpWyFSLychIzY3JCQiMCU0JFsnPVwkSCUhIzckIjBvazIoSGJaZyEjNjckNyQkIjBaYldjXjdJJSEjNyQiMDQiW0xYJik9ZyEjNjckJCIwcGtTTTA3SSUhIzckIjBrQyh6UC0+ZyEjNjckNyQkIjBwa1NNMDdJJSEjNyQiMGtDKHpQLT5nISM2NyQkIjAtTmJWJyozSSUhIzckIjBUQ01baSwtJyEjNjckNyQkIjBsdHJVSHlIJSEjNyQiLjgvTGs5LichIio3JCQiMC1OYlYnKjNJJSEjNyQiMFRDTVtpLC0nISM2NyQ3JCQiMGx0clVIeUglISM3JCIuOC9MazkuJyEiKjckJCIwQFZZcnJ0SCUhIzckIjBvPHpJaUouJyEjNjckNyQkIjB1blVUSl5JJSEjNyQiMCl5dDwsai9nISM2NyQkIjBUdCZmY2YvViEjNyQiMEdPIUhLZTFnISM2NyQ3JCQiMFR0JmZjZi9WISM3JCIwR08hSEtlMWchIzY3JCQiMFpiV2NeN0klISM3JCIwNCJbTFgmKT1nISM2NyQ3JCQiMCwhM2s3LDRWISM3JCIwV286IXBaISpmISM2NyQkIjBiYSpROiszViEjNyQiMCN6TXlFOSUqZiEjNjckNyQkIjBiYSpROiszViEjNyQiMCN6TXlFOSUqZiEjNjckJCIwdW5VVEpeSSUhIzckIjApeXQ8LGovZyEjNjckNyQkIjBGIypRNiIqR0olISM3JCIwUllReSpRd2YhIzY3JCQiMHd6ISk+QTlKJSEjNyQiMGNmdzctPClmISM2NyQ3JCQiMHd6ISk+QTlKJSEjNyQiMGNmdzctPClmISM2NyQkIi0zazcsNFYhIiokIjBXbzohcFohKmYhIzY3JDckJCIwYS9QJzR4O1YhIzckIjAkNCEzd2pCJ2YhIzY3JCQiMCo0Y1FvJltKJSEjNyQiLzcocGRoI3BmISM1NyQ3JCQiMCo0Y1FvJltKJSEjNyQiLzcocGRoI3BmISM1NyQkIjBGIypRNiIqR0olISM3JCIwUllReSpRd2YhIzY3JDckJCIvb144M2w/ViEjNiQiMCVHK3VSUltmISM2NyQkIjBiUG9rLyQ9ViEjNyQiMCVHR0U1I28mZiEjNjckNyQkIjBiUG9rLyQ9ViEjNyQiMCVHR0U1I28mZiEjNjckJCIwYC9QJzR4O1YhIzckIjAkNCEzd2pCJ2YhIzY3JDckJCIwMkhMbUlYSyUhIzckIjBeWkhrdlckZiEjNjckJCIwRDwqKnprPEslISM3JCIwWyVmdi9RV2YhIzY3JDckJCIwRDwqKnprPEslISM3JCIwWyVmdi9RV2YhIzY3JCQiL29eODNsP1YhIzYkIjAlRyt1UlJbZiEjNjckNyQkIjBMVEpeNSVHViEjNyQiMGF6RzcvMSNmISM2NyQkIjBBLD5ZT19LJSEjNyQiMDcxXCMqUj4kZiEjNjckNyQkIjBBLD5ZT19LJSEjNyQiMDcxXCMqUj4kZiEjNjckJCIwMkhMbUlYSyUhIzckIjBeWkhrdlckZiEjNjckNyQkIjBmYEhPIUhLViEjNyQiMHo8Km9meDFmISM2NyQkIjBYWkBfNUFMJSEjNyQiLyVITiMpZXEhZiEjNTckNyQkIjBYWkBfNUFMJSEjNyQiLyVITiMpZXEhZiEjNTckJCIwIik0c0skXEpWISM3JCIwZnYrWzknNGYhIzY3JDckJCIwM2pDej0oR1YhIzckIjB3PFVQKlw+ZiEjNjckJCIwIik0c0skXEpWISM3JCIwZnYrWzknNGYhIzY3JDckJCIwM2pDej0oR1YhIzckIjB3PFVQKlw+ZiEjNjckJCIwTFRKXjUlR1YhIzckIjBhekc3LzEjZiEjNjckNyQkIjAnZXc3LTxPViEjNyQiMGtBPnMqKUgqZSEjNjckJCIwJVIoZmQ0ZEwlISM3JCIwL1RHRj1ZKmUhIzY3JDckJCIwJVIoZmQ0ZEwlISM3JCIwL1RHRj1ZKmUhIzY3JCQiL08mSE8hSEtWISM2JCIwejwqb2Z4MWYhIzY3JDckJCIwOHlEMV0rTSUhIzckIjBUIj5ZbkJ6ZSEjNjckJCIwOEQlPW5AUlYhIzckIjBvX0BzeEApZSEjNjckNyQkIjA4RCU9bkBSViEjNyQiMG9fQHN4QCllISM2NyQkIjAnZXc3LTxPViEjNyQiMGtBPnMqKUgqZSEjNjckNyQkIjBSIVI3KkhSTSUhIzckIjBHPV15N2InZSEjNjckJCIwJFIhSDRKRk0lISM3JCIwS2s5PFAocGUhIzY3JDckJCIwJFIhSDRKRk0lISM3JCIwS2s5PFAocGUhIzY3JCQiMDh5RDFdK00lISM3JCIwVCI+WW5CemUhIzY3JDckJCIwbS1BdzR5TSUhIzckIjBQal1wOD0mZSEjNjckJCIwTThLJj1EWVYhIzckIjAnZng/bUhkZSEjNjckNyQkIjBNOEsmPURZViEjNyQiMCdmeD9tSGRlISM2NyQkIjBSIVI3KkhSTSUhIzckIjBHPV15N2InZSEjNjckNyQkIjAjXCw3JypvXlYhIzckIjBkRyU+YThRZSEjNjckJCIwVHRhOnkoXFYhIzckIi93M3FnJlslZSEjNTckNyQkIjBUdGE6eShcViEjNyQiL3czcWcmWyVlISM1NyQkIjBtLUF3NHlNJSEjNyQiMFBqXXA4PSZlISM2NyQ3JCQiMD5GPVlwYk4lISM3JCIwVDkjKilSWkNlISM2NyQkIjBzSHk6NExOJSEjNyQiMEMqUj5iVEtlISM2NyQ3JCQiMHNIeTo0TE4lISM3JCIwQypSPmJUS2UhIzY3JCQiMCNcLDcnKm9eViEjNyQiMGRHJT5hOFFlISM2NyQ3JCQiMFhSO0pcJWZWISM3JCIvKEdNXkQzImUhIzU3JCQiLy1ESlMlb04lISM2JCIwKTNyb1woKj5lISM2NyQ3JCQiLy1ESlMlb04lISM2JCIwKTNyb1woKj5lISM2NyQkIjA+Rj1ZcGJOJSEjNyQiMFQ5IyopUlpDZSEjNjckNyQkIjBzXjk7SExPJSEjNyQiMGQoZik+Jz0oeiYhIzY3JCQiMHNTcCY+UWdWISM3JCIwXkEhPVdgMmUhIzY3JDckJCIwc1NwJj5RZ1YhIzckIjBeQSE9V2AyZSEjNjckJCIwWFI7SlwlZlYhIzckIi8oR01eRDMiZSEjNTckNyQkIjApUkU2ITRzTyUhIzckIjBfKUg0QmIkeSYhIzY3JCQiMFtMQzdBUk8lISM3JCIwOk10J1E0JnomISM2NyQ3JCQiMFtMQzdBUk8lISM3JCIwOk10J1E0JnomISM2NyQkIjBzXjk7SExPJSEjNyQiMGQoZik+Jz0oeiYhIzY3JDckJCIwRHc1JykpM3JWISM3JCIwUm8yRkAqcGQhIzY3JCQiMFBrUVswNVAlISM3JCIwVmRmdzcteCYhIzY3JDckJCIwUGtRWzA1UCUhIzckIjBWZGZ3Ny14JiEjNjckJCIwX11hekssUCUhIzckIjAzRFRNeUt4JiEjNjckNyQkIjA+bEF0anVPJSEjNyQiMHpYbUpgRXkmISM2NyQkIjBfXWF6SyxQJSEjNyQiMDNEVE15S3gmISM2NyQ3JCQiMD5sQXRqdU8lISM3JCIwelhtSmBFeSYhIzY3JCQiMClSRTYhNHNPJSEjNyQiMF8pSDRCYiR5JiEjNjckNyQkIjBeKSkzcm9cUCUhIzckIjBGXS5vIkhjZCEjNjckJCIvTF4sYmF1ViEjNiQiMDJwX0BzeHYmISM2NyQ3JCQiL0xeLGJhdVYhIzYkIjAycF9Ac3h2JiEjNjckJCIwRHc1JykpM3JWISM3JCIwUm8yRkAqcGQhIzY3JDckJCIweSsyY1speVYhIzckIjAvdjp3Y0V1JiEjNjckJCIwQjtmaCUzeVYhIzckIjByIWVrO0xYZCEjNjckNyQkIjBCO2ZoJTN5ViEjNyQiMHIhZWs7TFhkISM2NyQkIjBeKSkzcm9cUCUhIzckIjBGXS5vIkhjZCEjNjckNyQkIjAvODBUR0ZRJSEjNyQiMC1XbDQ4IUhkISM2NyQkIjApKilcJTRBO1ElISM3JCIwTiMqUTYiKkd0JiEjNjckNyQkIjApKilcJTRBO1ElISM3JCIwTiMqUTYiKkd0JiEjNjckJCIweSsyY1speVYhIzckIjAvdjp3Y0V1JiEjNjckNyQkIjBKRC5FM21RJSEjNyQiMCh6SVB0TjpkISM2NyQkIjBjNF1BZF5RJSEjNyQiMCpSP2owWD9kISM2NyQ3JCQiMGM0XUFkXlElISM3JCIwKlI/ajBYP2QhIzY3JCQiMC84MFRHRlElISM3JCIwLVdsNDghSGQhIzY3JDckJCIwZFAsNilbIVIlISM3JCIwXj42PidvLGQhIzY3JCQiMCIqeTlKKm8pUSUhIzckIjBqOkQsNSEzZCEjNjckNyQkIjAiKnk5SipvKVElISM3JCIwajpELDUhM2QhIzY3JCQiMEpELkUzbVElISM3JCIwKHpJUHROOmQhIzY3JDckJCIwJSlcKmZ6TyVSJSEjNyQiMFcnKm9YJyp6byYhIzY3JCQiMGQhRyRvPEFSJSEjNyQiMEZGPVlwYnAmISM2NyQ3JCQiMGQhRyRvPEFSJSEjNyQiMEZGPVlwYnAmISM2NyQkIjBkUCw2KVshUiUhIzckIjBePjY+J28sZCEjNjckNyQkIi9AdzR5QylSJSEjNiQiLyo+ZidcR3VjISM1NyQkIjA8MUxwVGRSJSEjNyQiMCIqUTYiKkdKbyYhIzY3JDckJCIwPDFMcFRkUiUhIzckIjAiKlE2IipHSm8mISM2NyQkIjAlKVwqZnpPJVIlISM3JCIwVycqb1gnKnpvJiEjNjckNyQkIjBQdSZmdzctVyEjNyQiMDlxX2pbMG0mISM2NyQkIjBeYTByZyMqUiUhIzckIjBiXS9PKW9xYyEjNjckNyQkIjBeYTByZyMqUiUhIzckIjBiXS9PKW9xYyEjNjckJCIvQHc0eUMpUiUhIzYkIi8qPmYnXEd1YyEjNTckNyQkIjBqJ1E0disxVyEjNyQiMGVMJkdXeVljISM2NyQkIjB6Qz44dUZTJSEjNyQiMD5pKDR5Q2VjISM2NyQ3JCQiMHpDPjh1RlMlISM3JCIwPmkoNHlDZWMhIzY3JCQiMFB1JmZ3Ny1XISM3JCIwOXFfalswbSYhIzY3JDckJCIvKik+ZnQpKTRXISM2JCIwTy1TaiEqSGomISM2NyQkIjBELno7Ink0VyEjNyQiMFomUTNuT0xjISM2NyQ3JCQiMEQuejsieTRXISM3JCIwWiZRM25PTGMhIzY3JCQiL2QhcGEuKTNXISM2JCIwM2grIT4lb2omISM2NyQ3JCQiMGQmeXg4RzFXISM3JCIwJFEyZnMhZWsmISM2NyQkIi9kIXBhLikzVyEjNiQiMDNoKyE+JW9qJiEjNjckNyQkIjBkJnl4OEcxVyEjNyQiMCRRMmZzIWVrJiEjNjckJCIwaidRNHYrMVchIzckIjBlTCZHV3lZYyEjNjckNyQkIjA7NiE0c3c4VyEjNyQiMFU+WVhtIj5jISM2NyQkIi9mIWV3cktUJSEjNiQiMDYocGRoIzRpJiEjNjckNyQkIi9mIWV3cktUJSEjNiQiMDYocGRoIzRpJiEjNjckJCIvKik+ZnQpKTRXISM2JCIwTy1TaiEqSGomISM2NyQ3JCQiMFZCKWVxazxXISM3JCIwaDFwbTBgZyYhIzY3JCQiMDFwN15hblQlISM3JCIwdjNxZyZbM2MhIzY3JDckJCIwMXA3XmFuVCUhIzckIjB2M3FnJlszYyEjNjckJCIwOzYhNHN3OFchIzckIjBVPllYbSI+YyEjNjckNyQkIjBwTiczcF9AVyEjNyQiMFhlU1swOWYmISM2NyQkIjB6UGojKkctVSUhIzckIjBSP2owWGdmJiEjNjckNyQkIjB6UGojKkctVSUhIzckIjBSP2owWGdmJiEjNjckJCIwVkIpZXFrPFchIzckIjBoMXBtMGBnJiEjNjckNyQkIjAneldlblNEVyEjNyQiMCdcNVdKWXhiISM2NyQkIjB0N2VhJXBCVyEjNyQiMC5LY10vT2UmISM2NyQ3JCQiMHQ3ZWElcEJXISM3JCIwLktjXS9PZSYhIzY3JCQiMHBOJzNwX0BXISM3JCIwWGVTWzA5ZiYhIzY3JDckJCIwQWcjM21HSFchIzckIjAjKSkzT2ZaamIhIzY3JCQiMEUpek40OkZXISM3JCIwblZcJlI7cmIhIzY3JDckJCIwRSl6TjQ6RlchIzckIjBuVlwmUjtyYiEjNjckJCIwJ3pXZW5TRFchIzckIjAnXDVXSll4YiEjNjckNyQkIjBccyFlaztMVyEjNyQiMG81JzM3V1xiISM2NyQkIi9ISCNvKGZJVyEjNiQiMEpiVVNCKGViISM2NyQ3JCQiL0hII28oZklXISM2JCIwSmJVU0IoZWIhIzY3JCQiMEFnIzNtR0hXISM3JCIwIykpM09mWmpiISM2NyQ3JCQiMHYlKXlJWXFWJSEjNyQiMCJIOF5qTk5iISM2NyQkIjAmeSdwUk1TViUhIzckIjAmcGNgR0dZYiEjNjckNyQkIjAmeSdwUk1TViUhIzckIjAmcGNgR0dZYiEjNjckJCIwXHMhZWs7TFchIzckIjBvNSczN1dcYiEjNjckNyQkIjAtKHBkaCM0VyUhIzckIjB6NSlwJD43XyYhIzY3JCQiMHczLyVmKDNXJSEjNyQiMEIhPl88U0BiISM2NyQ3JCQiMHczLyVmKDNXJSEjNyQiMEIhPl88U0BiISM2NyQkIjApZkhXbl1TVyEjNyQiMFhtNGVZRl8mISM2NyQ3JCQiMC4vUHJndVYlISM3JCIwZnlHSVVRYCYhIzY3JCQiMClmSFduXVNXISM3JCIwWG00ZVlGXyYhIzY3JDckJCIwLi9Qcmd1ViUhIzckIjBmeUdJVVFgJiEjNjckJCIwdiUpeUlZcVYlISM3JCIwIkg4XmpOTmIhIzY3JDckJCIwRzR2KzFbVyUhIzckIjA8WylwPy4yYiEjNjckJCIwWCNRUHJGV1chIzckIjAnPV0sNycqM2IhIzY3JDckJCIwWCNRUHJGV1chIzckIjAnPV0sNycqM2IhIzY3JCQiMC0ocGRoIzRXJSEjNyQiMHo1KXAkPjdfJiEjNjckNyQkIjBiQHQmZW9bVyEjNyQiMCpwJlE7KHkjXCYhIzY3JCQiMG5XNSFwbVpXISM3JCIvTiIzbD9sXCYhIzU3JDckJCIwblc1IXBtWlchIzckIi9OIjNsP2xcJiEjNTckJCIwRzR2KzFbVyUhIzckIjA8WylwPy4yYiEjNjckNyQkIjAiUTgyZGNfVyEjNyQiMCdvMCg+I1t5YSEjNjckJCIwQDAmW1wvXlchIzckIjA5RCw1ITMlWyYhIzY3JDckJCIwQDAmW1wvXlchIzckIjA5RCw1ITMlWyYhIzY3JCQiMGJAdCZlb1tXISM3JCIwKnAmUTsoeSNcJiEjNjckNyQkIjAzWXBiWGtYJSEjNyQiMFJlK3o5VFkmISM2NyQkIjBjRSZINVRhVyEjNyQiMHlPJVwmUjtaJiEjNjckNyQkIjBjRSZINVRhVyEjNyQiMHlPJVwmUjtaJiEjNjckJCIwIlE4MmRjX1chIzckIjAnbzAoPiNbeWEhIzY3JDckJCIwTWVuU0QuWSUhIzckIjApXGpxRG9cYSEjNjckJCIwWF1yIVx3ZFchIzckIjBVWygpKiopPmZhISM2NyQ3JCQiMFhdciFcd2RXISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwM1lwYlhrWCUhIzckIjBSZSt6OVRZJiEjNjckNyQkIjBocWxEMFVZJSEjNyQiMCZSYlpLPU5hISM2NyQkIjA8L1NPMTZZJSEjNyQiMDFnIVslZW5XJiEjNjckNyQkIjA8L1NPMTZZJSEjNyQiMDFnIVslZW5XJiEjNjckJCIwTWVuU0QuWSUhIzckIjApXGpxRG9cYSEjNjckNyQkIjAoR1ExXjNvVyEjNyQiMG1sT0U9MVUmISM2NyQkIjBGRmYlKlt4WSUhIzckIjBNJG9ZdCg9VSYhIzY3JDckJCIwRkZmJSpbeFklISM3JCIwTSRvWXQoPVUmISM2NyQkIjBgKikzcCF5bFchIzckIjB3ZU1NbSNIYSEjNjckNyQkIjA+IVIzX1ZrVyEjNyQiLzxQKCp5Sk1hISM1NyQkIjBgKikzcCF5bFchIzckIjB3ZU1NbSNIYSEjNjckNyQkIjA+IVIzX1ZrVyEjNyQiLzxQKCp5Sk1hISM1NyQkIjBocWxEMFVZJSEjNyQiMCZSYlpLPU5hISM2NyQ3JCQiMDkmPmNcJz5aJSEjNyQiMGMmbz9WKWZTJiEjNjckJCIwJHpZbiFbNVolISM3JCIwKVwqZnpPJTRhISM2NyQ3JCQiMCR6WW4hWzVaJSEjNyQiMClcKmZ6TyU0YSEjNjckJCIwKEdRMV4zb1chIzckIjBtbE9FPTFVJiEjNjckNyQkIi91KzFbJWVaJSEjNiQiMFgsV2l3N1ImISM2NyQkIjBzUnctTVZaJSEjNyQiMGkxYEMnKnBSJiEjNjckNyQkIjBzUnctTVZaJSEjNyQiMGkxYEMnKnBSJiEjNjckJCIwOSY+Y1wnPlolISM3JCIwYyZvP1YpZlMmISM2NyQ3JCQiMG4+ZWxDKHpXISM3JCIwNCdSLElcd2AhIzY3JCQiMC9dTnExd1olISM3JCIwRT1ZcGJYUSYhIzY3JDckJCIwL11OcTF3WiUhIzckIjBFPVlwYlhRJiEjNjckJCIvdSsxWyVlWiUhIzYkIjBYLFdpdzdSJiEjNjckNyQkIjAkPmowWGckWyUhIzckIjBRJls5OGpoYCEjNjckJCIweC0zKWYnM1slISM3JCIvKkhSOTpAUCYhIzU3JDckJCIweC0zKWYnM1slISM3JCIvKkhSOTpAUCYhIzU3JCQiMG4+ZWxDKHpXISM3JCIwNCdSLElcd2AhIzY3JDckJCIvVVdiVlsoWyUhIzYkIjAwUUsoNHBZYCEjNjckJCIwKipHQS1WdFslISM3JCIwPWBEL01zTSYhIzY3JDckJCIwKipHQS1WdFslISM3JCIwPWBEL01zTSYhIzY3JCQiMDo7JW8kUW1bJSEjNyQiMHhCIWZtJSpcYCEjNjckNyQkIi9rVm48NiVbJSEjNiQiMGFUS2Z1J2ZgISM2NyQkIjA6OyVvJFFtWyUhIzckIjB4QiFmbSUqXGAhIzY3JDckJCIva1ZuPDYlWyUhIzYkIjBhVEtmdSdmYCEjNjckJCIwJD5qMFhnJFslISM3JCIwUSZbOThqaGAhIzY3JDckJCIwWWNfP2s4XCUhIzckIjBeeVExdTtMJiEjNjckJCIwaEByN2QwXCUhIzckIjAjWyc9XCR6TWAhIzY3JDckJCIwaEByN2QwXCUhIzckIjAjWyc9XCR6TWAhIzY3JCQiL1VXYlZbKFslISM2JCIwMFFLKDRwWWAhIzY3JDckJCIwdG9dMFdfXCUhIzckIi9Fc1dIZDtgISM1NyQkIjBDOCopW2RQXCUhIzckIjBZdzYlSE5BYCEjNjckNyQkIjBDOCopW2RQXCUhIzckIjBZdzYlSE5BYCEjNjckJCIwWWNfP2s4XCUhIzckIjBeeVExdTtMJiEjNjckNyQkIjAqNClbIVI3KlwlISM3JCIwQHVJZiZRLGAhIzY3JCQiMEN6eTFXcFwlISM3JCIvIilbIVI3KjRgISM1NyQ3JCQiMEN6eTFXcFwlISM3JCIvIilbIVI3KjRgISM1NyQkIjB0b10wV19cJSEjNyQiL0VzV0hkO2AhIzU3JDckJCIwRSRwYVArLlghIzckIjBGZyRRKzYnRyYhIzY3JCQiMGpaYiRvNitYISM3JCIwdSp6Uj1aKEgmISM2NyQ3JCQiMGpaYiRvNitYISM3JCIwdSp6Uj1aKEgmISM2NyQkIjAqNClbIVI3KlwlISM3JCIwQHVJZiZRLGAhIzY3JDckJCIwXzBYZyQpb10lISM3JCIwbDFdRFwyRiYhIzY3JCQiME0neTR5VDFYISM3JCIwLUIlUTJmc18hIzY3JDckJCIwTSd5NHlUMVghIzckIjAtQiVRMmZzXyEjNjckJCIwXiQ9ZktWL1ghIzckIjAmSDhfd1chRyYhIzY3JDckJCIwbTxIeHZLXSUhIzckIjBRNiIqR0pdRyYhIzY3JCQiMF4kPWZLVi9YISM3JCIwJkg4X3dXIUcmISM2NyQ3JCQiMG08SHh2S10lISM3JCIwUTYiKkdKXUcmISM2NyQkIjBFJHBhUCsuWCEjNyQiMEZnJFErNidHJiEjNjckNyQkIjB6PFZYajJeJSEjNyQiMGBVUVAqSGJfISM2NyQkIjAoPlFyVGE0WCEjNyQiMG1NeD1dLEUmISM2NyQ3JCQiMCg+UXJUYTRYISM3JCIwbU14PV0sRSYhIzY3JCQiMF8wWGckKW9dJSEjNyQiMGwxXURcMkYmISM2NyQ3JCQiMDBJVElWWV4lISM3JCIwJCllXmRiKFJfISM2NyQkIjAicHYib2NFXiUhIzckIi9qL1AnNHhDJiEjNTckNyQkIjAicHYib2NFXiUhIzckIi9qL1AnNHhDJiEjNTckJCIwejxWWGoyXiUhIzckIjBgVVFQKkhiXyEjNjckNyQkIjBLVVI6QiY9WCEjNyQiL2otbWY2Q18hIzU3JCQiMHYieWVgdjpYISM3JCIwJXpOJzNwX0ImISM2NyQ3JCQiMHYieWVgdjpYISM3JCIwJXpOJzNwX0ImISM2NyQkIjAwSVRJVlleJSEjNyQiMCQpZV5kYihSXyEjNjckNyQkIjBmYVArLkNfJSEjNyQiL0A7YlFRM18hIzU3JCQiMF8pZnAiMz5fJSEjNyQiMEAiKVwpelE1XyEjNjckNyQkIjBfKWZwIjM+XyUhIzckIjBAIilcKXpRNV8hIzY3JCQiMG0qZXVzLj9YISM3JCIweHg1ZXR6QCYhIzY3JDckJCIwa2koSC0lKT1YISM3JCIwZXBjYEdHQSYhIzY3JCQiMG0qZXVzLj9YISM3JCIweHg1ZXR6QCYhIzY3JDckJCIwa2koSC0lKT1YISM3JCIwZXBjYEdHQSYhIzY3JCQiMEtVUjpCJj1YISM3JCIvai1tZjZDXyEjNTckNyQkIjAmb2NgR0dFWCEjNyQiL0wkcG1iRD4mISM1NyQkIjA7QiE+LidcXyUhIzckIjAmR0hNdSV6PiYhIzY3JDckJCIwO0IhPi4nXF8lISM3JCIwJkdITXUlej4mISM2NyQkIjBmYVArLkNfJSEjNyQiL0A7YlFRM18hIzU3JDckJCIwN3pMcWksYCUhIzckIjBOJ0dkaWl3XiEjNjckJCIwKFxoJXkpKnpfJSEjNyQiMFwvTylvXSY9JiEjNjckNyQkIjAoXGgleSkqel8lISM3JCIwXC9PKW9dJj0mISM2NyQkIjAmb2NgR0dFWCEjNyQiL0wkcG1iRD4mISM1NyQ3JCQiMFEiPmBEL01YISM3JCIvOm9AUmZnXiEjNTckJCIwO0s/JFsuTVghIzckIjB4RkF5RDE7JiEjNjckNyQkIjA7Sz8kWy5NWCEjNyQiMHhGQXlEMTsmISM2NyQkIjBRbEMtM1NgJSEjNyQiMCUpSExdTzI7JiEjNjckNyQkIjBaVSY9Ty1KWCEjNyQiMDg7SExtSTwmISM2NyQkIjBRbEMtM1NgJSEjNyQiMCUpSExdTzI7JiEjNjckNyQkIjBaVSY9Ty1KWCEjNyQiMDg7SExtSTwmISM2NyQkIjA3ekxxaSxgJSEjNyQiME4nR2RpaXdeISM2NyQ3JCQiMGsuSVNBemAlISM3JCIvYipmImVZV14hIzU3JCQiMGo2XjVGcWAlISM3JCIwVFI6QiY9W14hIzY3JDckJCIwajZeNUZxYCUhIzckIjBUUjpCJj1bXiEjNjckJCIwUSI+YEQvTVghIzckIi86b0BSZmdeISM1NyQ3JCQiMCJmIkdELT1hJSEjNyQiMFdQLkZKI0deISM2NyQkIjBcIyllJmYrU1ghIzckIjAwXjNvV2Q4JiEjNjckNyQkIjBcIyllJmYrU1ghIzckIjAwXjNvV2Q4JiEjNjckJCIwbC5JU0F6YCUhIzckIi9iKmYiZVlXXiEjNTckNyQkIjA9R0U1I29YWCEjNyQiMEc4QWMpKT02JiEjNjckJCIwbyI9YjkoSGElISM3JCIwcGksOC9MNyYhIzY3JDckJCIwbyI9YjkoSGElISM3JCIwcGksOC9MNyYhIzY3JCQiMCJmIkdELT1hJSEjNyQiMFdQLkZKI0deISM2NyQ3JCQiMFdTQyY+Y1xYISM3JCIwKUg5IzNWYTQmISM2NyQkIjBlZkxcZSlbWCEjNyQiMChmeUdJVSk0JiEjNjckNyQkIjBlZkxcZSlbWCEjNyQiMChmeUdJVSk0JiEjNjckJCIvTkQjKkduWVghIzYkIjA6I1tnbW8yXiEjNjckNyQkIjA4eklvQmZhJSEjNyQiMEx1JXpOJzM2JiEjNjckJCIvTkQjKkduWVghIzYkIjA6I1tnbW8yXiEjNjckNyQkIjA4eklvQmZhJSEjNyQiMEx1JXpOJzM2JiEjNjckJCIwPUdFNSNvWFghIzckIjBHOEFjKSk9NiYhIzY3JDckJCIwcl9BIT1XYFghIzckIjAnXE4kZSkpKXldISM2NyQkIjAxJSpSdnk8YiUhIzckIjBoKDR5QylmMyYhIzY3JDckJCIwMSUqUnZ5PGIlISM3JCIwaCg0eUMpZjMmISM2NyQkIjBXU0MmPmNcWCEjNyQiMClIOSMzVmE0JiEjNjckNyQkIjAoXDFfO0tkWCEjNyQiME90biU0QWldISM2NyQkIjA9UFctJ29hWCEjNyQiMEQ0dSM+YXRdISM2NyQ3JCQiMD1QVy0nb2FYISM3JCIwRDR1Iz5hdF0hIzY3JCQiMHJfQSE9V2BYISM3JCIwJ1xOJGUpKSl5XSEjNjckNyQkIjBDeD1dLDdjJSEjNyQiMD1iMyNmV1hdISM2NyQkIjAyOSI9d1hnWCEjNyQiMGBLZyMzbVtdISM2NyQ3JCQiMDI5Ij13WGdYISM3JCIwYEtnIzNtW10hIzY3JCQiMF4mb0I9S2VYISM3JCIwMDpbUCUqeTAmISM2NyQ3JCQiMGIqRyRSIWVkWCEjNyQiMCozc3c4NWhdISM2NyQkIjBeJm9CPUtlWCEjNyQiMDA6W1AlKnkwJiEjNjckNyQkIjBiKkckUiFlZFghIzckIjAqM3N3ODVoXSEjNjckJCIwKFwxXztLZFghIzckIjBPdG4lNEFpXSEjNjckNyQkIi8mKm9eODNsWCEjNiQiMExgRzlkJkddISM2NyQkIjBZSzprP0xjJSEjNyQiMDxXYEY/aS4mISM2NyQ3JCQiMFlLOms/TGMlISM3JCIwPFdgRj9pLiYhIzY3JCQiMEN4PV0sN2MlISM3JCIwPWIzI2ZXWF0hIzY3JDckJCIweCw6P2gqb1ghIzckIjA2I3k7L2I2XSEjNjckJCIwJ28wKDNyaGMlISM3JCIwImVsQyh6UC0mISM2NyQ3JCQiMCdvMCgzcmhjJSEjNyQiMCJlbEMoelAtJiEjNjckJCIvJipvXjgzbFghIzYkIjBMYEc5ZCZHXSEjNjckNyQkIjAuOTgwVEdkJSEjNyQiMExNVjBNVypcISM2NyQkIjA+IWZBKkc9ZCUhIzckIjA0ektpKSopKSpcISM2NyQ3JCQiMD4hZkEqRz1kJSEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMHAnZiozTyJwWCEjNyQiMFJgUFN5MiwmISM2NyQ3JCQiLzM0XSE0IXBYISM2JCIwWG5SPFI4LCYhIzY3JCQiMHAnZiozTyJwWCEjNyQiMFJgUFN5MiwmISM2NyQ3JCQiLzM0XSE0IXBYISM2JCIwWG5SPFI4LCYhIzY3JCQiMHgsOj9oKm9YISM3JCIwNiN5Oy9iNl0hIzY3JDckJCIvajcsNHN3WCEjNiQiME46IjNyPnhcISM2NyQkIjBSQC9IT1lkJSEjNyQiMHQhZnMhZWspXCEjNjckNyQkIjBSQC9IT1lkJSEjNyQiMHQhZnMhZWspXCEjNjckJCIwLjk4MFRHZCUhIzckIjBMTVYwTVcqXCEjNjckNyQkIjBjUTR2KzFlJSEjNyQiMHJnJzQ4JSlmXCEjNjckJCIwQCZmKGY3LWUlISM3JCIwLDk3KHBkaFwhIzY3JDckJCIwQCZmKGY3LWUlISM3JCIwLDk3KHBkaFwhIzY3JCQiMG5QJSl5RyN6WCEjNyQiMCN5ZS1oKGYnXCEjNjckNyQkIjB2InBJOlZ4WCEjNyQiMFAtPl88UyhcISM2NyQkIjBuUCUpeUcjelghIzckIjAjeWUtaChmJ1whIzY3JDckJCIwdiJwSTpWeFghIzckIjBQLT5fPFMoXCEjNjckJCIvajcsNHN3WCEjNiQiME46IjNyPnhcISM2NyQ3JCQiMCQzdisxWyVlJSEjNyQiMGMnKTNMb0IlXCEjNjckJCIwYSo+P3koSGUlISM3JCIwbEQwVU8iXFwhIzY3JDckJCIwYSo+P3koSGUlISM3JCIwbEQwVU8iXFwhIzY3JCQiMGNRNHYrMWUlISM3JCIwcmcnNDglKWZcISM2NyQ3JCQiMDRqMFhnJCllJSEjNyQiMG1EK3ZwWiNcISM2NyQkIjA8PiN6N3QmZSUhIzckIjBIUClwZXBPXCEjNjckNyQkIjA8PiN6N3QmZSUhIzckIjBIUClwZXBPXCEjNjckJCIwJDN2KzFbJWUlISM3JCIwYycpM0xvQiVcISM2NyQ3JCQiME92LklTQWYlISM3JCIwc0EjW1IwMlwhIzY3JCQiMD4hZVt4PiJmJSEjNyQiMGNnJW9aIj0iXCEjNjckNyQkIjA+IWVbeD4iZiUhIzckIjBjZyVvWiI9IlwhIzY3JCQiME1jJ2UiUSgpZSUhIzckIjA4Q2tAV0kjXCEjNjckNyQkIjB4JlJxSVopZSUhIzckIjAkKlsiPmBEQ1whIzY3JCQiME1jJ2UiUSgpZSUhIzckIjA4Q2tAV0kjXCEjNjckNyQkIjB4JlJxSVopZSUhIzckIjAkKlsiPmBEQ1whIzY3JCQiMDRqMFhnJCllJSEjNyQiMG1EK3ZwWiNcISM2NyQ3JCQiMGkoPV0sNydmJSEjNyQiMDZVKm8xQCopWyEjNjckJCIwVTskSC8iUmYlISM3JCIvQXg8VVAqKlshIzU3JDckJCIwVTskSC8iUmYlISM3JCIwQHN4QHUkKipbISM2NyQkIjBPdi5JU0FmJSEjNyQiMHNBI1tSMDJcISM2NyQ3JCQiMCopKioqKioqKioqKmYlISM3JCIvSjpNUkNyWyEjNTckJCIwVkk5TylIKmYlISM3JCIwWyZSO0pcdVshIzY3JDckJCIwVkk5TylIKmYlISM3JCIwWyZSO0pcdVshIzY3JCQiMCJ6LCQ+PHhmJSEjNyQiMHpDbCNHIj0pWyEjNjckNyQkIjBKISpSIj1oJ2YlISM3JCIwJVEzbk8kcClbISM2NyQkIjAieiwkPjx4ZiUhIzckIjB6Q2wjRyI9KVshIzY3JDckJCIwSiEqUiI9aCdmJSEjNyQiMCVRM25PJHApWyEjNjckJCIwaSg9XSw3J2YlISM3JCIwNlUqbzFAKilbISM2LSUmQ09MT1JHNiYlJFJHQkckIihedWknISIoJCIoXnVpJyEiKCQiKF51aSchIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNmFqbzckNyQkIjA8dSQqXCpmek4hIzckIi9vKilRUj9wKCohIzU3JCQiMCUzTWJUXXpOISM3JCIvJzR3M3FneCohIzU3JDckJCIwJTNNYlRdek4hIzckIi8nNHczcWd4KiEjNTckJCIwMDordypcek4hIzckIjBfUXEqKSpRdygqISM2NyQ3JCQiMGFYYyc9THpOISM3JCIwJ3pIUTFeKXkqISM2NyQkIjAwOit3Klx6TiEjNyQiMF9RcSopKlF3KCohIzY3JDckJCIwYVhjJz1Mek4hIzckIjAnekhRMV4peSohIzY3JCQiME54JmYmPiR6TiEjNyQiMCo0cl4jMyUqeSohIzY3JDckJCIwOzRTMWciek4hIzckIjBMJykqKT1eNCEpKiEjNjckJCIwTngmZiY+JHpOISM3JCIwKjRyXiMzJSp5KiEjNjckNyQkIjA7NFMxZyJ6TiEjNyQiMEwnKSopPV40ISkqISM2NyQkIjBaJmY1KlIiek4hIzckIjAybiJRW1UtKSohIzY3JDckJCIuIlxcKCkpKnlOISM1JCIwcHUnUjxSOCkqISM2NyQkIjBaJmY1KlIiek4hIzckIjAybiJRW1UtKSohIzY3JDckJCIuIlxcKCkpKnlOISM1JCIwcHUnUjxSOCkqISM2NyQkIjApUlw2MycqeU4hIzckIjBEZTltUmEiKSohIzY3JDckJCIwbjElPnoiKXlOISM3JCIwMGouSEtlIykqISM2NyQkIjApUlw2MycqeU4hIzckIjBEZTltUmEiKSohIzY3JDckJCIwbjElPnoiKXlOISM3JCIwMGouSEtlIykqISM2NyQkIjBPbiplQXl5TiEjNyQiL089S0ZYRykqISM1NyQ3JCQiMFoienB2a3lOISM3JCIwVF41JUdGUSkqISM2NyQkIjBPbiplQXl5TiEjNyQiL089S0ZYRykqISM1NyQ3JCQiMFoienB2a3lOISM3JCIwVF41JUdGUSkqISM2NyQkIjBzXylbVWd5TiEjNyQiMDkicGpTWVQpKiEjNjckNyQkIjBAOjZxeCV5TiEjNyQiMHhSPFI4MiYpKiEjNjckJCIwc18pW1VneU4hIzckIjA5InBqU1lUKSohIzY3JDckJCIwQDo2cXgleU4hIzckIjB4UjxSODImKSohIzY3JCQiMD4vLnlFJXlOISM3JCIwPiRwZU9aYSkqISM2NyQ3JCQiMCIpejdKMyR5TiEjNyQiMDhHQyVSOmopKiEjNjckJCIwPi8ueUUleU4hIzckIjA+JHBlT1phKSohIzY3JDckJCIwIil6N0ozJHlOISM3JCIwOEdDJVI6aikqISM2NyQkIjBeLEEmKVwjeU4hIzckIjB3Ink/OltuKSohIzY3JDckJCIwbk5qUlIieU4hIzckIjBcO0pcJWZ2KSohIzY3JCQiMF4sQSYpXCN5TiEjNyQiMHcieT86W24pKiEjNjckNyQkIjBuTmpSUiJ5TiEjNyQiMFw7SlwlZnYpKiEjNjckJCIwKmU2Zk0yeU4hIzckIjAsa3RtKFshKSkqISM2NyQ3JCQiMC1QcSY0KHpkJCEjNyQiMCdbIVEvTiEpKSkqISM2NyQkIjAqZTZmTTJ5TiEjNyQiMCxrdG0oWyEpKSohIzY3JDckJCIwLVBxJjQoemQkISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMFlzN2coKnlkJCEjNyQiMDQ9eDQjXCQqKSohIzY3JDckJCIvSm8pKUgheWQkISM2JCIwQSRcJWZ2LyEqKiEjNjckJCIwWXM3ZygqeWQkISM3JCIwND14NCNcJCopKiEjNjckNyQkIi9KbykpSCF5ZCQhIzYkIjBBJFwlZnYvISoqISM2NyQkIjBbLlVGQXhkJCEjNyQiMGBwaCNbXDEqKiEjNjckNyQkIjA2JFIiXE53ZCQhIzckIjBlIj1YaCJIIioqISM2NyQkIjBbLlVGQXhkJCEjNyQiMGBwaCNbXDEqKiEjNjckNyQkIjA2JFIiXE53ZCQhIzckIjBlIj1YaCJIIioqISM2NyQkIi9pI29aWnZkJCEjNiQiMEIhPmNlXD4qKiEjNjckNyQkIjBjJEhqJW91ZCQhIzckIjAlKnBlcGNgIyoqISM2NyQkIi9pI29aWnZkJCEjNiQiMEIhPmNlXD4qKiEjNjckNyQkIjBjJEhqJW91ZCQhIzckIjAlKnBlcGNgIyoqISM2NyQkIi9ibTFLUHhOISM2JCIwWTtkPiZcSyoqISM2NyQ3JCQiMCpSOSs+SXhOISM3JCIvJGVsQyh6UCoqISM1NyQkIi9ibTFLUHhOISM2JCIwWTtkPiZcSyoqISM2NyQ3JCQiMCpSOSs+SXhOISM3JCIvJGVsQyh6UCoqISM1NyQkIjA7LTZZKj54TiEjNyQiMGlZSiZHXFgqKiEjNjckNyQkIjAzY04hZTh4TiEjNyQiMG1Zc3pQLSYqKiEjNjckJCIwOy02WSo+eE4hIzckIjBpWUomR1xYKiohIzY3JDckJCIwM2NOIWU4eE4hIzckIjBtWXN6UC0mKiohIzY3JCQiMGpfI1FpLXhOISM3JCIwQz9YJCkpW2UqKiEjNjckNyQkIjBgMCNwLChwZCQhIzckIjAtTnpNeUUnKiohIzY3JCQiMGpfI1FpLXhOISM3JCIwQz9YJCkpW2UqKiEjNjckNyQkIjBgMCNwLChwZCQhIzckIjAtTnpNeUUnKiohIzY3JCQiMGlhVGBgb2QkISM3JCIwQVVEOiRbcioqISM2NyQ3JCQiMDhdXCpcIW9kJCEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBpYVRgYG9kJCEjNyQiMEFVRDokW3IqKiEjNjckNyQkIjA4XVwqXCFvZCQhIzckIjBRQicpKik9XigqKiEjNjckJCIwKDNzWzhvd04hIzckIjBPI1wyZVolKSoqISM2NyQ3JCQiMCgqWyxHU21kJCEjNyQiMHY2JFwlZnYpKiohIzY3JCQiMCgzc1s4b3dOISM3JCIwTyNcMmVaJSkqKiEjNjckNyQkIjAoKlssR1NtZCQhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjAlW0F4JzRsZCQhIzckIjAvRVgib1koKioqISM2NyQ3JCQiMENfQS13a2QkISM3JCIwLCsrKysrKyIhIzU3JCQiMCVbQXgnNGxkJCEjNyQiMC9FWCJvWSgqKiohIzY3JDckJCIwVic9XCR6TWUkISM3JCIwais/J1EjKSlcKiEjNjckJCIwSCEqSHFFTWUkISM3JCIwbGxDKHpQLSYqISM2NyQ3JCQiMEghKkhxRU1lJCEjNyQiMGxsQyh6UC0mKiEjNjckJCIvOEwxVFUkZSQhIzYkIjBoMmc1YkRdKiEjNjckNyQkIi9AIUciSEMkZSQhIzYkIjAtYUpfPVteKiEjNjckJCIvOEwxVFUkZSQhIzYkIjBoMmc1YkRdKiEjNjckNyQkIi9AIUciSEMkZSQhIzYkIjAtYUpfPVteKiEjNjckJCIweSQqPkdKS2UkISM3JCIwLS8nUVJoOiYqISM2NyQ3JCQiL3N3ZidmSWUkISM2JCIwUVVRMmZzXyohIzY3JCQiMHkkKj5HSktlJCEjNyQiMC0vJ1FSaDomKiEjNjckNyQkIi9zd2YnZkllJCEjNiQiMFFVUTJmc18qISM2NyQkIjBrQyRwIVJJZSQhIzckIjBPOio0M25HJiohIzY3JDckJCIwbSZ6VXAoR2UkISM3JCIwdUlYaSpwUiYqISM2NyQkIjBrQyRwIVJJZSQhIzckIjBPOio0M25HJiohIzY3JDckJCIwbSZ6VXAoR2UkISM3JCIwdUlYaSpwUiYqISM2NyQkIjAkPmJtdSVHZSQhIzckIjBIQmNzRDxhKiEjNjckNyQkIjBtJG9kWnAjZSQhIzckIi8iPl88U0BiKiEjNTckJCIwJD5ibXUlR2UkISM3JCIwSEJjc0Q8YSohIzY3JDckJCIwbSRvZFpwI2UkISM3JCIvIj5fPFNAYiohIzU3JCQiMCYpNChva2wjZSQhIzckIjBYXTtxeVpiKiEjNjckNyQkIjBaR2Q1OERlJCEjNyQiMFkyZnMhZWsmKiEjNjckJCIwJik0KG9rbCNlJCEjNyQiMFhdO3F5WmIqISM2NyQ3JCQiMFpHZDU4RGUkISM3JCIwWTJmcyFlayYqISM2NyQkIjBoTmwybUNlJCEjNyQiMCxMY3RIeWMqISM2NyQ3JCQiMEUwNyk+TCNlJCEjNyQiMCNlZnc3LXgmKiEjNjckJCIwaE5sMm1DZSQhIzckIjAsTGN0SHljKiEjNjckNyQkIjBFMDcpPkwjZSQhIzckIjAjZWZ3Ny14JiohIzY3JCQiME9ZU0d3QWUkISM3JCIwa2FuJSl5M2UqISM2NyQ3JCQiMG4lKj1RXkBlJCEjNyQiMD0lR0Y9WSplKiEjNjckJCIwT1lTR3dBZSQhIzckIjBrYW4lKXkzZSohIzY3JDckJCIwbiUqPVFeQGUkISM3JCIwPSVHRj1ZKmUqISM2NyQkIjBtKip6MygzI2UkISM3JCIwNjdhL0VSZiohIzY3JDckJCIwLyhRMzgoPmUkISM3JCIwYXN6UC0+ZyohIzY3JCQiMG0qKnozKDMjZSQhIzckIjA2N2EvRVJmKiEjNjckNyQkIjAvKFEzOCg+ZSQhIzckIjBhc3pQLT5nKiEjNjckJCIwVysiKlspKj1lJCEjNyQiMDFYJEg4KHBnKiEjNjckNyQkIjAmM0NiPHoiZSQhIzckIjAiNG1HSE05JyohIzY3JCQiMFcrIipbKSo9ZSQhIzckIjAxWCRIOChwZyohIzY3JDckJCIwJjNDYjx6ImUkISM3JCIwIjRtR0hNOScqISM2NyQkIjBRTil6L3IiZSQhIzckIi9Za0FaLD8nKiEjNTckNyQkIjBhIio+czc7ZSQhIzckIjBGXCR6TXlFJyohIzY3JCQiMFFOKXovciJlJCEjNyQiL1lrQVosPycqISM1NyQ3JCQiMGEiKj5zNztlJCEjNyQiMEZcJHpNeUUnKiEjNjckJCIwYidbaElfImUkISM3JCIwJykqPkBpMEwnKiEjNjckNyQkIjBteWo/TTllJCEjNyQiMGpQKy5DI1InKiEjNjckJCIwYidbaElfImUkISM3JCIwJykqPkBpMEwnKiEjNjckNyQkIjBteWo/TTllJCEjNyQiMGpQKy5DI1InKiEjNjckJCIwKW95R2lMImUkISM3JCIwVCoqPSVlNFknKiEjNjckNyQkIjAnNGgwaUQiZSQhIzckIjAqZnMhZWs7bCohIzY3JCQiMClveUdpTCJlJCEjNyQiMFQqKj0lZTRZJyohIzY3JDckJCIwJzRoMGlEImUkISM3JCIwKmZzIWVrO2wqISM2NyQkIjBeIjMhKSpcNmUkISM3JCIwX1wrZkwiZicqISM2NyQ3JCQiMCRSdTwoeTVlJCEjNyQiME45OTgwVG0qISM2NyQkIjBeIjMhKSpcNmUkISM3JCIwX1wrZkwiZicqISM2NyQ3JCQiMCRSdTwoeTVlJCEjNyQiME45OTgwVG0qISM2NyQkIjBUIjQ4Vic0ZSQhIzckIjB1ZEhacEBuKiEjNjckNyQkIi5gNnUsNGUkISM1JCIwci1Ab1hsbiohIzY3JCQiMFQiNDhWJzRlJCEjNyQiMHVkSFpwQG4qISM2NyQ3JCQiLmA2dSw0ZSQhIzUkIjByLUBvWGxuKiEjNjckJCIwNypRQiN6MmUkISM3JCIwYz9bXS5fbyohIzY3JDckJCIwOyVmc19zIWUkISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwNypRQiN6MmUkISM3JCIwYz9bXS5fbyohIzY3JDckJCIwOyVmc19zIWUkISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwT1skNFpmIWUkISM3JCIwXl8zcE4jKXAqISM2NyQ3JCQiMHZ3LkpcMGUkISM3JCIwV3pNeUU5cSohIzY3JCQiME9bJDRaZiFlJCEjNyQiMF5fM3BOIylwKiEjNjckNyQkIjB2dy5KXDBlJCEjNyQiMFd6TXlFOXEqISM2NyQkIjAtY3Z3NS9lJCEjNyQiL3cqPi9tN3IqISM1NyQ3JCQiMEIoNF9RUCFlJCEjNyQiL3k7TXQnUXIqISM1NyQkIjAtY3Z3NS9lJCEjNyQiL3cqPi9tN3IqISM1NyQ3JCQiMEIoNF9RUCFlJCEjNyQiL3k7TXQnUXIqISM1NyQkIjBWL2tSRi1lJCEjNyQiMHY1TWMlSEMoKiEjNjckNyQkIjBDb2YqKSk+IWUkISM3JCIwO2NbKXlJRSgqISM2NyQkIjBWL2tSRi1lJCEjNyQiMHY1TWMlSEMoKiEjNjckNyQkIjBDb2YqKSk+IWUkISM3JCIwO2NbKXlJRSgqISM2NyQkIi4mSCNmVytlJCEjNSQiMGlJbUVAdHQqISM2NyQ3JCQiMCRIJylSVy0hZSQhIzckIjBfV2JWWyhRKCohIzY3JCQiLiZII2ZXK2UkISM1JCIwaUltRUB0dCohIzY3JDckJCIwJEgnKVJXLSFlJCEjNyQiMF9XYlZbKFEoKiEjNjckJCIvRixhQicpek4hIzYkIjA+YGI6WS52KiEjNjckNyQkIjBmOEJbXSl6TiEjNyQiMClHQicpKik9XigqISM2NyQkIi9GLGFCJyl6TiEjNiQiMD5gYjpZLnYqISM2NyQ3JCQiMGY4QltdKXpOISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMEYjUncxb3pOISM3JCIvMXVZI3BMdyohIzU3JDckJCIwKmU9PnFuek4hIzckIjBDQHBgSE93KiEjNjckJCIwRiNSdzFvek4hIzckIi8xdVkjcEx3KiEjNTckNyQkIjAqZT0+cW56TiEjNyQiMENAcGBIT3cqISM2NyQkIjA8dSQqXCpmek4hIzckIjAibyopUVI/cCgqISM2NyQ3JCQiLygpKiopPmZ0ZSQhIzYkIjBsOkIxbVxDKiEjNjckJCIwOzBPeEJzZSQhIzckIjBWKXBlcGNgIyohIzY3JDckJCIwOzBPeEJzZSQhIzckIjBWKXBlcGNgIyohIzY3JCQiMCU0Ml9tQChlJCEjNyQiMCZbX0dTLWEjKiEjNjckNyQkIjAjb09nJUdxZSQhIzckIjB6J1E0dittIyohIzY3JCQiMCU0Ml9tQChlJCEjNyQiMCZbX0dTLWEjKiEjNjckNyQkIjAjb09nJUdxZSQhIzckIjB6J1E0dittIyohIzY3JCQiL2ViOjYsKGUkISM2JCIvUDVBTzduIyohIzU3JDckJCIwYkNgdExvZSQhIzckIjA6disxWyV5IyohIzY3JCQiL2ViOjYsKGUkISM2JCIvUDVBTzduIyohIzU3JDckJCIwYkNgdExvZSQhIzckIjA6disxWyV5IyohIzY3JCQiMHItVkQxb2UkISM3JCIwVyhbXTVBIUcqISM2NyQ3JCQiMEhnKilmUm1lJCEjNyQiMF5qMmgpKTNIKiEjNjckJCIwci1WRDFvZSQhIzckIjBXKFtdNUEhRyohIzY3JDckJCIwSGcqKWZSbWUkISM3JCIwXmoyaCkpM0gqISM2NyQkIjA2MHQxLW1lJCEjNyQiMGYucEo7TEgqISM2NyQ3JCQiL2NZWmdXJ2UkISM2JCIwKD1YaCJITEkqISM2NyQkIjA2MHQxLW1lJCEjNyQiMGYucEo7TEgqISM2NyQ3JCQiL2NZWmdXJ2UkISM2JCIwKD1YaCJITEkqISM2NyQkIjBIJzNeJilSJ2UkISM3JCIwMStEVjRrSSohIzY3JDckJCIwUCozeElEJ2UkISM3JCIwQlNAcnBkSiohIzY3JCQiMEgnM14mKVInZSQhIzckIjAxK0RWNGtJKiEjNjckNyQkIjBQKjN4SUQnZSQhIzckIjBCU0BycGRKKiEjNjckJCIwMncwcSY+J2UkISM3JCIwNE1OVCsmPiQqISM2NyQ3JCQiMCQqR3VvZ2dlJCEjNyQiLydHR0U1I0ckKiEjNTckJCIwMncwcSY+J2UkISM3JCIwNE1OVCsmPiQqISM2NyQ3JCQiMCQqR3VvZ2dlJCEjNyQiLydHR0U1I0ckKiEjNTckJCIwLV5ZXiQqZmUkISM3JCIwJHpnaiMqZUskKiEjNjckNyQkIjBFIj51KW9lZSQhIzckIjAncF44M2xTJCohIzY3JCQiMC1eWV4kKmZlJCEjNyQiMCR6Z2ojKmVLJCohIzY3JDckJCIwRSI+dSlvZWUkISM3JCIwJ3BeODNsUyQqISM2NyQkIjBoNCopKT56JmUkISM3JCIwKVskbypmblgkKiEjNjckNyQkIjBWYWhqeGNlJCEjNyQiMEswVU8iNGAkKiEjNjckJCIwaDQqKSk+eiZlJCEjNyQiMClbJG8qZm5YJCohIzY3JDckJCIwVmFoanhjZSQhIzckIjBLMFVPIjRgJCohIzY3JCQiL1pAPjZmJmUkISM2JCIwWiFbRTF3ZSQqISM2NyQ3JCQiMEolcG9wWyZlJCEjNyQiMG8kKlsiPmBsJCohIzY3JCQiL1pAPjZmJmUkISM2JCIwWiFbRTF3ZSQqISM2NyQ3JCQiMEolcG9wWyZlJCEjNyQiMG8kKlsiPmBsJCohIzY3JCQiLyhRUyE0UiZlJCEjNiQiMCRHV2RKJT1QKiEjNjckNyQkIjBQQzYob0gmZSQhIzckIjAvI2VsQyh6UCohIzY3JCQiLyhRUyE0UiZlJCEjNiQiMCRHV2RKJT1QKiEjNjckNyQkIjBQQzYob0gmZSQhIzckIjAvI2VsQyh6UCohIzY3JCQiMD0+KlE4PiZlJCEjNyQiMGJJU2dCXFEqISM2NyQ3JCQiL2RbU3Q1JmUkISM2JCIvL0Y7SVQhUiohIzU3JCQiMD0+KlE4PiZlJCEjNyQiMGJJU2dCXFEqISM2NyQ3JCQiL2RbU3Q1JmUkISM2JCIvL0Y7SVQhUiohIzU3JCQiMFdhM1UjKlxlJCEjNyQiMFdvZSg+KylSKiEjNjckNyQkIjB4YkhQPVxlJCEjNyQiMHdlcGNgR1MqISM2NyQkIjBXYTNVIypcZSQhIzckIjBXb2UoPispUiohIzY3JDckJCIweGJIUD1cZSQhIzckIjB3ZXBjYEdTKiEjNjckJCIwUl9rOSV6JWUkISM3JCIwMkxRR3k1VCohIzY3JDckJCIwMjF6JypIWmUkISM3JCIwN1p3NiVIOiUqISM2NyQkIjBSX2s5JXolZSQhIzckIjAyTFFHeTVUKiEjNjckNyQkIjAyMXonKkhaZSQhIzckIjA3Wnc2JUg6JSohIzY3JCQiL0ZOOGxmJWUkISM2JCIwbiNcTkQ6QyUqISM2NyQ3JCQiMGxDNzdVWGUkISM3JCIwXE4kb1l0RiUqISM2NyQkIi9GTjhsZiVlJCEjNiQiMG4jXE5EOkMlKiEjNjckNyQkIjBsQzc3VVhlJCEjNyQiMFxOJG9ZdEYlKiEjNjckJCIvMXU7JipSJWUkISM2JCIwbCZHWVpBUCUqISM2NyQ3JCQiMDRJOSRbTiVlJCEjNyQiMCZRLT5fPFMlKiEjNjckJCIvMXU7JipSJWUkISM2JCIwbCZHWVpBUCUqISM2NyQ3JCQiMDRJOSRbTiVlJCEjNyQiMCZRLT5fPFMlKiEjNjckJCIwQlxVOi5VZSQhIzckIjA7LFEjXEhdJSohIzY3JDckJCIvO14lNG9UZSQhIzYkIjBANyhwZGhfJSohIzY3JCQiMEJcVTouVWUkISM3JCIwOyxRI1xIXSUqISM2NyQ3JCQiLzteJTRvVGUkISM2JCIwQDcocGRoXyUqISM2NyQkIjAjR0tDdSslZSQhIzckIjB2RkkyakxZKiEjNjckNyQkIjBzOTMiPilSZSQhIzckIjBkKy9LY11ZKiEjNjckJCIwI0dLQ3UrJWUkISM3JCIwdkZJMmpMWSohIzY3JDckJCIwczkzIj4pUmUkISM3JCIwZCsvS2NdWSohIzY3JCQiMDMzMks3UWUkISM3JCIwSjtTQEhrWiohIzY3JDckJCIwKD5udWl6JGUkISM3JCIwJCopM3JvXHglKiEjNjckJCIwMzMySzdRZSQhIzckIjBKO1NASGtaKiEjNjckNyQkIjAoPm51aXokZSQhIzckIjAkKikzcm9ceCUqISM2NyQkIjAudEkleWgkZSQhIzckIjBDSnlNJFwqWyohIzY3JDckJCIwVSQqZj02T2UkISM3JCIwSHg8VVAqKlsqISM2NyQkIjAudEkleWgkZSQhIzckIjBDSnlNJFwqWyohIzY3JDckJCIwVSQqZj02T2UkISM3JCIwSHg8VVAqKlsqISM2NyQkIjBWJz1cJHpNZSQhIzckIjBqKz8nUSMpKVwqISM2NyQ3JCQiMCc0IilbIVI3ZiQhIzckIjBDd2xfNWkrKiEjNjckJCIwL1omemAwImYkISM3JCIwYz5jXCc+PCEqISM2NyQ3JCQiMC9aJnpgMCJmJCEjNyQiMGM+Y1wnPjwhKiEjNjckJCIvKFs9NFg1ZiQhIzYkIjAwTSM0JT15LCohIzY3JDckJCIwNid5SiFbM2YkISM3JCIwI3pJWXFqSCEqISM2NyQkIi8oWz00WDVmJCEjNiQiMDBNIzQlPXksKiEjNjckNyQkIjA2J3lKIVszZiQhIzckIjAjeklZcWpIISohIzY3JCQiMDI9QD5FM2YkISM3JCIwdjs4JjMnNC4qISM2NyQ3JCQiMHUib0o4ayFmJCEjNyQiMEgnKnBmeD8vKiEjNjckJCIwMj1APkUzZiQhIzckIjB2OzgmMyc0LiohIzY3JDckJCIwdSJvSjhrIWYkISM3JCIwSCcqcGZ4Py8qISM2NyQkIjBaTDYvMzFmJCEjNyQiMGEiZSMqMzVXISohIzY3JDckJCIwWSMzeF9WIWYkISM3JCIwbCVvWiI9WDAqISM2NyQkIjBaTDYvMzFmJCEjNyQiMGEiZSMqMzVXISohIzY3JDckJCIwWSMzeF9WIWYkISM3JCIwbCVvWiI9WDAqISM2NyQkIjBoN2pqIVIhZiQhIzckIjBSMzhhUXMwKiEjNjckNyQkIjBaPU0nKUgtZiQhIzckIjAsdCQpcGVwMSohIzY3JCQiMGg3amohUiFmJCEjNyQiMFIzOGFRczAqISM2NyQ3JCQiMFo9TScpSC1mJCEjNyQiMCx0JClwZXAxKiEjNjckJCIvVSo9KFI8IWYkISM2JCIwaXFmIlFQcSEqISM2NyQ3JCQiMD5KdjNEK2YkISM3JCIwUGghXCMqUnohKiEjNjckJCIvVSo9KFI8IWYkISM2JCIwaXFmIlFQcSEqISM2NyQ3JCQiMD5KdjNEK2YkISM3JCIwUGghXCMqUnohKiEjNjckJCIwNnpKL2UqKmUkISM3JCIweE47dDFOMyohIzY3JDckJCIwOWF5JTQjKSplJCEjNyQiMHRcKCp6Uj00KiEjNjckJCIwNnpKL2UqKmUkISM3JCIweE47dDFOMyohIzY3JDckJCIwOWF5JTQjKSplJCEjNyQiMHRcKCp6Uj00KiEjNjckJCIwbSk+XUd1KmUkISM3JCIwUS4jKUdQbTQqISM2NyQ3JCQiMDN2MFc8JyplJCEjNyQiMDRRL04hRy8iKiEjNjckJCIwbSk+XUd1KmUkISM3JCIwUS4jKUdQbTQqISM2NyQ3JCQiMDN2MFc8JyplJCEjNyQiMDRRL04hRy8iKiEjNjckJCIwRSJRJVFHJiplJCEjNyQiMCV5OjhidzQiKiEjNjckNyQkIjA0KVxpWFQqZSQhIzckIjBYRTYhNHM7IiohIzY3JCQiMEUiUSVRRyYqZSQhIzckIjAleTo4Ync0IiohIzY3JDckJCIwNClcaVhUKmUkISM3JCIwWEU2ITRzOyIqISM2NyQkIjBsIypmazkkKmUkISM3JCIwNFpjUyIqRzcqISM2NyQ3JCQiMG0mZTZCQCplJCEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMGwjKmZrOSQqZSQhIzckIjA0WmNTIipHNyohIzY3JDckJCIwbSZlNkJAKmUkISM3JCIwIlsiPVhoIkgiKiEjNjckJCIwdVQiRzs1KmUkISM3JCIwNG54KVwsTyIqISM2NyQ3JCQiMDwpKUhvNSEqZSQhIzckIjA9LkQrLTs5KiEjNjckJCIwdVQiRzs1KmUkISM3JCIwNG54KVwsTyIqISM2NyQ3JCQiMDwpKUhvNSEqZSQhIzckIjA9LkQrLTs5KiEjNjckJCIwT14oRyQqKSkpZSQhIzckIjA8eWhFTyJcIiohIzY3JDckJCIwOHVobjQpKWUkISM3JCIwYSI+YEQvYSIqISM2NyQkIjBPXihHJCopKSllJCEjNyQiMDx5aEVPIlwiKiEjNjckNyQkIjA4dWhuNCkpZSQhIzckIjBhIj5gRC9hIiohIzY3JCQiMFE/QnV4JyllJCEjNyQiMFI+JmVfRGkiKiEjNjckNyQkIjB3eGNHNCcpZSQhIzckIi8qelE1JFttIiohIzU3JCQiMFE/QnV4JyllJCEjNyQiMFI+JmVfRGkiKiEjNjckNyQkIjB3eGNHNCcpZSQhIzckIi8qelE1JFttIiohIzU3JCQiMEQtcCdvWSllJCEjNyQiMFBLNSg+UHYiKiEjNjckNyQkIjBVQS9eNCUpZSQhIzckIjBFb1hsQip5IiohIzY3JCQiMEQtcCdvWSllJCEjNyQiMFBLNSg+UHYiKiEjNjckNyQkIjBVQS9eNCUpZSQhIzckIjBFb1hsQip5IiohIzY3JCQiMEFLJilwYyMpZSQhIzckIjB5SGtUJ1spPSohIzY3JDckJCIwJjNMWi5AKWUkISM3JCIwaWNfP2s4PiohIzY3JCQiMEFLJilwYyMpZSQhIzckIjB5SGtUJ1spPSohIzY3JDckJCIwJjNMWi5AKWUkISM3JCIwaWNfP2s4PiohIzY3JCQiMHBnS0JaISllJCEjNyQiMChlUDInKWYsIyohIzY3JDckJCIwKXppJHo2ISllJCEjNyQiMClcJWZ2L1E/KiEjNjckJCIwcGdLQlohKWUkISM3JCIwKGVQMicpZiwjKiEjNjckNyQkIjApemkkejYhKWUkISM3JCIwKVwlZnYvUT8qISM2NyQkIi8kb2RZUXllJCEjNiQiMCZwIzRjM1pAKiEjNjckNyQkIjBlVFUlUSJ5ZSQhIzckIjBNTG1JWGlAKiEjNjckJCIvJG9kWVF5ZSQhIzYkIjAmcCM0YzNaQCohIzY3JDckJCIwZVRVJVEieWUkISM3JCIwTUxtSVhpQCohIzY3JCQiMCxQW1JJd2UkISM3JCIwYikpNEc7eUEqISM2NyQ3JCQiMDNIIypcO3dlJCEjNyQiMHJAdCZlb0cjKiEjNjckJCIwLFBbUkl3ZSQhIzckIjBiKSk0Rzt5QSohIzY3JDckJCIwM0gjKlw7d2UkISM3JCIwckB0JmVvRyMqISM2NyQkIjBbJylvLEJ1ZSQhIzckIjAoMy96PCM0QyohIzY3JDckJCIwN1pidj51ZSQhIzckIjAyNSEzazdUIyohIzY3JCQiMFsnKW8sQnVlJCEjNyQiMCgzL3o8IzRDKiEjNjckNyQkIjA3WmJ2PnVlJCEjNyQiMDI1ITNrN1QjKiEjNjckJCIvKCkqKik+ZnRlJCEjNiQiMGw6QjFtXEMqISM2NyQ3JCQiMEJCJykqKT1eZiQhIzckIjBNZEkkKj44eSkhIzY3JCQiMClIKHAxMlxmJCEjNyQiMDFIS2VtS3opISM2NyQ3JCQiMClIKHAxMlxmJCEjNyQiMDFIS2VtS3opISM2NyQkIi8iRztXJSpbZiQhIzYkIi9KcyRIJylSeikhIzU3JDckJCIwKjMnKik9KG8lZiQhIzckIjBVPFI4MmQhKSkhIzY3JCQiLyJHO1clKltmJCEjNiQiL0pzJEgnKVJ6KSEjNTckNyQkIjAqMycqKT0obyVmJCEjNyQiMFU8UjgyZCEpKSEjNjckJCIwUk1UYGhZZiQhIzckIjBPPzVsdHIhKSkhIzY3JDckJCIwUXo5LW9XZiQhIzckIjB5MFlvWiI9KSkhIzY3JCQiMFJNVGBoWWYkISM3JCIwTz81bHRyISkpISM2NyQ3JCQiMFF6OS1vV2YkISM3JCIweTBZb1oiPSkpISM2NyQkIjBrNllYSFdmJCEjNyQiMHVvTU5lLiMpKSEjNjckNyQkIjA7YC1jXFVmJCEjNyQiMDklSE4jKWVJKSkhIzY3JCQiMGs2WVhIV2YkISM3JCIwdW9NTmUuIykpISM2NyQ3JCQiMDtgLWNcVWYkISM3JCIwOSVITiMpZUkpKSEjNjckJCIwJW8hKSk+KT4lZiQhIzckIi9hcTkvYUwpKSEjNTckNyQkIjAmXEktPS4lZiQhIzckIi9EKWZ5R0klKSkhIzU3JCQiMCVvISkpPik+JWYkISM3JCIvYXE5L2FMKSkhIzU3JDckJCIwJlxJLT0uJWYkISM3JCIvRClmeUdJJSkpISM1NyQkIjB5Njx3blJmJCEjNyQiMCkpKXldKT5uJSkpISM2NyQ3JCQiMDZgW3U5UWYkISM3JCIwKDNuTyRwYSYpKSEjNjckJCIweTY8d25SZiQhIzckIjApKSl5XSk+biUpKSEjNjckNyQkIjA2YFt1OVFmJCEjNyQiMCgzbk8kcGEmKSkhIzY3JCQiMCZcVlMiUVBmJCEjNyQiMHAhKjRuJyopZikpISM2NyQ3JCQiMHRZWVEpZiRmJCEjNyQiMEJmdCkpNHonKSkhIzY3JCQiMCZcVlMiUVBmJCEjNyQiMHAhKjRuJyopZikpISM2NyQ3JCQiMHRZWVEpZiRmJCEjNyQiMEJmdCkpNHonKSkhIzY3JCQiMDtILUw0TmYkISM3JCIwWkswKjMydCkpISM2NyQ3JCQiMHN0cXIjUSRmJCEjNyQiMGZaIVEvTiEpKSkhIzY3JCQiMDtILUw0TmYkISM3JCIwWkswKjMydCkpISM2NyQ3JCQiMHN0cXIjUSRmJCEjNyQiMGZaIVEvTiEpKSkhIzY3JCQiMEgoXEM4RyRmJCEjNyQiMGJuMGBVaSkpKSEjNjckNyQkIjB2PHp0bkpmJCEjNyQiMCZmdCkpNHojKikpISM2NyQkIjBIKFxDOEckZiQhIzckIjBibjBgVWkpKSkhIzY3JDckJCIwdjx6dG5KZiQhIzckIjAmZnQpKTR6IyopKSEjNjckJCIwa0cwN2FJZiQhIzckIjBpKHkqZjYlKiopKSEjNjckNyQkIjBYLXJXYEhmJCEjNyQiMEpDJVI6QjAqKSEjNjckJCIwa0cwN2FJZiQhIzckIjBpKHkqZjYlKiopKSEjNjckNyQkIjBYLXJXYEhmJCEjNyQiMEpDJVI6QjAqKSEjNjckJCIwJHBoOHgjR2YkISM3JCIwQSRHOCJ5RCIqKSEjNjckNyQkIjAwJlxQKVJGZiQhIzckIjBuNyw0c3ciKikhIzY3JCQiMCRwaDh4I0dmJCEjNyQiMEEkRzgieUQiKikhIzY3JDckJCIwMCZcUClSRmYkISM3JCIwbjcsNHN3IiopISM2NyQkIjBbVyQpNC1FZiQhIzckIjAjZVUpM1VkIyopISM2NyQ3JCQiMGFoeSFwXyNmJCEjNyQiMC4sM2s3LCQqKSEjNjckJCIwW1ckKTQtRWYkISM3JCIwI2VVKTNVZCMqKSEjNjckNyQkIjBgaHkhcF8jZiQhIzckIjAuLDNrNywkKikhIzY3JCQiLy1ccnNQI2YkISM2JCIvUGFOTiEqUSopISM1NyQ3JCQiMCIpZUxsOUJmJCEjNyQiMFIqWyI+YEQlKikhIzY3JCQiLy1ccnNQI2YkISM2JCIvUGFOTiEqUSopISM1NyQ3JCQiMCIpZUxsOUJmJCEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMHdgJ0dLOiNmJCEjNyQiME1ZKG9DMV8qKSEjNjckNyQkIjBpeEMyLkBmJCEjNyQiMHd4QHUkKlwmKikhIzY3JCQiMHdgJ0dLOiNmJCEjNyQiME1ZKG9DMV8qKSEjNjckNyQkIjBpeEMyLkBmJCEjNyQiMHd4QHUkKlwmKikhIzY3JCQiMGx2WScqSD5mJCEjNyQiMFV4WCEqPV8nKikhIzY3JDckJCIwJVF5Z0AqPWYkISM3JCIwN21HSE11JyopISM2NyQkIjBsdlknKkg+ZiQhIzckIjBVeFghKj1fJyopISM2NyQ3JCQiMCVReWdAKj1mJCEjNyQiMDdtR0hNdScqKSEjNjckJCIwR05vWjI8ZiQhIzckIjBRZzwmR1B5KikhIzY3JDckJCIwQjVlIj5vImYkISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwR05vWjI8ZiQhIzckIjBRZzwmR1B5KikhIzY3JDckJCIwQjVlIj5vImYkISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwZC4oZWRbImYkISM3JCIwdzQ0TEM6KiopISM2NyQ3JCQiME5lRUxzOWYkISM3JCIwJUdDJVI6QioqKSEjNjckJCIwZC4oZWRbImYkISM3JCIwdzQ0TEM6KiopISM2NyQ3JCQiME5lRUxzOWYkISM3JCIwJUdDJVI6QioqKSEjNjckJCIwWiZlMltFImYkISM3JCIwOm4xTnRZKyohIzY3JDckJCIwKT5kNE1FImYkISM3JCIvNyRcJWZ2LyEqISM1NyQkIjBaJmUyW0UiZiQhIzckIjA6bjFOdFkrKiEjNjckNyQkIjApPmQ0TUUiZiQhIzckIi83JFwlZnYvISohIzU3JCQiMCc0IilbIVI3ZiQhIzckIjBDd2xfNWkrKiEjNjckNyQkIjBcTiVbKCkqKilmJCEjNyQiMFFiKHpKP3AmKSEjNjckJCIwRUtSQicqKilmJCEjNyQiMGJRM25PJHAmKSEjNjckNyQkIjBFS1JCJyoqKWYkISM3JCIwYlEzbk8kcCYpISM2NyQkIjApZTp1ZyoqKWYkISM3JCIwcyd5WF9NcCYpISM2NyQ3JCQiMEJmXmNpKClmJCEjNyQiMCNwX0BzeCJlKSEjNjckJCIwKWU6dWcqKilmJCEjNyQiMHMneVhfTXAmKSEjNjckNyQkIjBCZl5jaSgpZiQhIzckIjAjcF9Ac3giZSkhIzY3JCQiMFktSGdaKClmJCEjNyQiMFBFdl0jZSNlKSEjNjckNyQkIjAneScqeSdIJilmJCEjNyQiMEc6QXg8VWYpISM2NyQkIjBZLUhnWigpZiQhIzckIjBQRXZdI2UjZSkhIzY3JDckJCIwJ3knKnknSCYpZiQhIzckIjBHOkF4PFVmKSEjNjckJCIvciVHMCsmKWYkISM2JCIwLSpbOm8iZWYpISM2NyQ3JCQiMFpyR2QoSClmJCEjNyQiMGsuSEtlbWcpISM2NyQkIi9yJUcwKyYpZiQhIzYkIjAtKls6byJlZikhIzY3JDckJCIwWnJHZChIKWYkISM3JCIway5IS2VtZykhIzY3JCQiMHZIMVVgIylmJCEjNyQiLyZbLz1bITQnKSEjNTckNyQkIjBiUklDbSEpZiQhIzckIi4jZnQpKTQ+JykhIio3JCQiMHZIMVVgIylmJCEjNyQiLyZbLz1bITQnKSEjNTckNyQkIjBiUklDbSEpZiQhIzckIi4jZnQpKTQ+JykhIio3JCQiMFZRK3EyISlmJCEjNyQiMEJCQml3QWkpISM2NyQ3JCQiME5CS29OeWYkISM3JCIwTyFHQyVSOmopISM2NyQkIjBWUStxMiEpZiQhIzckIjBCQkJpd0FpKSEjNjckNyQkIjBOQktvTnlmJCEjNyQiME8hR0MlUjpqKSEjNjckJCIvZTAmKUd3KGYkISM2JCIvdlNnQF1OJykhIzU3JDckJCIwS0U7KmVnKGYkISM3JCIwc29cKCp6UmspISM2NyQkIi9lMCYpR3coZiQhIzYkIi92U2dAXU4nKSEjNTckNyQkIjBLRTsqZWcoZiQhIzckIjBzb1woKnpSaykhIzY3JCQiMF4wOCgqPXZmJCEjNyQiMCJSdDNbc1snKSEjNjckNyQkIjBPbkQnb1AoZiQhIzckIjAzZGNfP2tsKSEjNjckJCIwXjA4KCo9dmYkISM3JCIwIlJ0M1tzWycpISM2NyQ3JCQiME9uRCdvUChmJCEjNyQiMDNkY18/a2wpISM2NyQkIjBXOEEmZkYoZiQhIzckIjApPlEpZVc+bSkhIzY3JDckJCIwMG9AZltyZiQhIzckIjBYWGoyaClvJykhIzY3JCQiMFc4QSZmRihmJCEjNyQiMCk+USllVz5tKSEjNjckNyQkIjAwb0BmW3JmJCEjNyQiMFhYajJoKW8nKSEjNjckJCIwSlhFI1EuKGYkISM3JCIwaTllXmhebikhIzY3JDckJCIwLWtsMkBwZiQhIzckIjAiUS5GO0kibykhIzY3JCQiMEpYRSNRLihmJCEjNyQiMGk5ZV5oXm4pISM2NyQ3JCQiMC1rbDJAcGYkISM3JCIvUS5GO0kibykhIzU3JCQiMDEiXHhEeidmJCEjNyQiMCRwVDJjUClvKSEjNjckNyQkIjAjKkdFSiVwJ2YkISM3JCIwPEF4PFVQcCkhIzY3JCQiMDEiXHhEeidmJCEjNyQiMCRwVDJjUClvKSEjNjckNyQkIjAjKkdFSiVwJ2YkISM3JCIwPEF4PFVQcCkhIzY3JCQiMCR6YjhBYidmJCEjNyQiME1FTShvZSwoKSEjNjckNyQkIjA9Y25Ib2tmJCEjNyQiMGA1JUdGPTEoKSEjNjckJCIwJHpiOEFiJ2YkISM3JCIwTUVNKG9lLCgpISM2NyQ3JCQiMD1jbkhva2YkISM3JCIwYDUlR0Y9MSgpISM2NyQkIi8leURzN2pmJCEjNiQiL0JOU2B6OSgpISM1NyQ3JCQiMEUtSC1WaWYkISM3JCIwKikpNHpLaT0oKSEjNjckJCIvJXlEczdqZiQhIzYkIi9CTlNgejkoKSEjNTckNyQkIjBFLUgtVmlmJCEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMDkkZitUMidmJCEjNyQiMD0hKjMtLCFHKCkhIzY3JDckJCIwUEooKVs9Z2YkISM3JCIwRCh5SFExSigpISM2NyQkIjA5JGYrVDInZiQhIzckIjA9ISozLSwhRygpISM2NyQ3JCQiMFBKKClbPWdmJCEjNyQiMEQoeUhRMUooKSEjNjckJCIwYXlXTU9lZiQhIzckIjBuYl0jUj9UKCkhIzY3JDckJCIwWSEqNHAleiZmJCEjNyQiMGh2L1EvTnUpISM2NyQkIjBheVdNT2VmJCEjNyQiMG5iXSNSP1QoKSEjNjckNyQkIjBZISo0cCV6JmYkISM3JCIwaHYvUS9OdSkhIzY3JCQiMD0+clcqZiZmJCEjNyQiMC9rYzIvV3YpISM2NyQ3JCQiMCplTkQ7ZCZmJCEjNyQiMChSO0pcJWZ2KSEjNjckJCIwPT5yVypmJmYkISM3JCIwL2tjMi9XdikhIzY3JDckJCIwKmVORDtkJmYkISM3JCIwKFI7SlwlZnYpISM2NyQkIjBGakJTamBmJCEjNyQiMHRTQ1wsd3cpISM2NyQ3JCQiL14oZkdcYGYkISM2JCIwTV89WyZRbygpISM2NyQkIjBGakJTamBmJCEjNyQiMHRTQ1wsd3cpISM2NyQ3JCQiL14oZkdcYGYkISM2JCIwTV89WyZRbygpISM2NyQkIjAoM00zI0deZiQhIzckIjBiIlEiPSd6IXkpISM2NyQ3JCQiMEdVQm5GXmYkISM3JCIvMmFLZyMzeSkhIzU3JCQiMCgzTTMjR15mJCEjNyQiMGIiUSI9J3oheSkhIzY3JDckJCIwR1VCbkZeZiQhIzckIi8yYUtnIzN5KSEjNTckJCIwQkInKSopPV5mJCEjNyQiME5kSSQqPjh5KSEjNjckNyQkIjB3WiMpZnlHZyQhIzckIjBhOSVIXCopbyQpISM2NyQkIjAiZSJ5JDMmR2ckISM3JCIweEMpZnlHcSQpISM2NyQ3JCQiMCJlInkkMyZHZyQhIzckIjB4QylmeUdxJCkhIzY3JCQiMCJ6KFsnKltHZyQhIzckIjBLInp4R1FxJCkhIzY3JDckJCIwSHh2ay5FZyQhIzckIjA4ODBUR0ZRKSEjNjckJCIwInooWycqW0dnJCEjNyQiMEsienhHUXEkKSEjNjckNyQkIjBHeHZrLkVnJCEjNyQiMDg4MFRHRlEpISM2NyQkIjA8Ql86JmUtTyEjNyQiMGhzOEtwT1EpISM2NyQ3JCQiMCpbKGVKZEJnJCEjNyQiLzo/aCpvXlIpISM1NyQkIjA8Ql86JmUtTyEjNyQiMGhzOEtwT1EpISM2NyQ3JCQiMCpbKGVKZEJnJCEjNyQiLzo/aCpvXlIpISM1NyQkIjA5bF5PQUJnJCEjNyQiMFVtY1xfcFIpISM2NyQ3JCQiLy82UT02LU8hIzYkIjAnKSopPV40d1MpISM2NyQkIjA5bF5PQUJnJCEjNyQiMFVtY1xfcFIpISM2NyQ3JCQiLy82UT02LU8hIzYkIjAnKSopPV40d1MpISM2NyQkIjBEZyopZWc/ZyQhIzckIjA6KjM+Q0I1JSkhIzY3JDckJCIwKCkpPTVzJz1nJCEjNyQiMEF5RDFdK1UpISM2NyQkIjBEZyopZWc/ZyQhIzckIjA6KjM+Q0I1JSkhIzY3JDckJCIwKCkpPTVzJz1nJCEjNyQiMEF5RDFdK1UpISM2NyQkIjAmeiEpPikqeixPISM3JCIvbFc4IjROVSkhIzU3JDckJCIwODliVUI7ZyQhIzckIjBlbUtoIVxLJSkhIzY3JCQiMCZ6ISk+KSp6LE8hIzckIi9sVzgiNE5VKSEjNTckNyQkIjA4OWJVQjtnJCEjNyQiMGVtS2ghXEslKSEjNjckJCIwRC84MFM6ZyQhIzckIjBgcyMqZiN5TyUpISM2NyQ3JCQiMEtoP1shUSxPISM3JCIwJVwmUjtKXFcpISM2NyQkIjBELzgwUzpnJCEjNyQiMGBzIypmI3lPJSkhIzY3JDckJCIwS2g/WyFRLE8hIzckIjAlXCZSO0pcVykhIzY3JCQiMChwcng3RyxPISM3JCIwQFpcKkcwXSUpISM2NyQ3JCQiMDZYSVBRNmckISM3JCIvTGs5PFBkJSkhIzU3JCQiMChwcng3RyxPISM3JCIwQFpcKkcwXSUpISM2NyQ3JCQiMDZYSVBRNmckISM3JCIvTGs5PFBkJSkhIzU3JCQiMHRRO1xCNWckISM3JCIwIj5BQytLaiUpISM2NyQ3JCQiMD13UjQoKjNnJCEjNyQiMG1KYEU3KXAlKSEjNjckJCIwdFE7XEI1ZyQhIzckIjAiPkFDK0tqJSkhIzY3JDckJCIwPXdSNCgqM2ckISM3JCIwbUpgRTcpcCUpISM2NyQkIjAoMzgpb20yZyQhIzckIjBGS0grJWV3JSkhIzY3JDckJCIwVyY9VW1sK08hIzckIjAuP2ciR0QjWykhIzY3JCQiMCgzOClvbTJnJCEjNyQiMEZLSCslZXclKSEjNjckNyQkIjBXJj1VbWwrTyEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwYG1CJzNeK08hIzckIjBLYmwlWyUpKlspISM2NyQ3JCQiMCM+IT4sPC9nJCEjNyQiMFIzbk8kcCVcKSEjNjckJCIwYG1CJzNeK08hIzckIjBLYmwlWyUpKlspISM2NyQ3JCQiMCM+IT4sPC9nJCEjNyQiMFIzbk8kcCVcKSEjNjckJCIvQ2UvZ0QrTyEjNiQiMG4nUidlLUpdKSEjNjckNyQkIi84Jm8+eSxnJCEjNiQiMHYnUjxSODImKSEjNjckJCIvQ2UvZ0QrTyEjNiQiMG4nUidlLUpdKSEjNjckNyQkIi84Jm8+eSxnJCEjNiQiMHYnUjxSODImKSEjNjckJCIwWkw8Ni0rZyQhIzckIjApKj5BQmRqXikhIzY3JDckJCIwczppPlMqKmYkISM3JCIwNiYzb1dkPiYpISM2NyQkIjBaTDw2LStnJCEjNyQiMCkqPkFCZGpeKSEjNjckNyQkIjBzOmk+UyoqZiQhIzckIjA2JjNvV2Q+JikhIzY3JCQiMHQtejxcKCpmJCEjNyQiMCd5KkghKTMnSCYpISM2NyQ3JCQiL0Y5LklxKmYkISM2JCIwWnQoPV0sSyYpISM2NyQkIjB0LXo8XCgqZiQhIzckIjAneSpIISkzJ0gmKSEjNjckNyQkIi9GOS5JcSpmJCEjNiQiMFp0KD1dLEsmKSEjNjckJCIwW1hoPihcKmYkISM3JCIwPSkqNEtkR2EpISM2NyQ3JCQiMDdVVmhtJSpmJCEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwW1hoPihcKmYkISM3JCIwPSkqNEtkR2EpISM2NyQ3JCQiMDdVVmhtJSpmJCEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwI3kmKWZoQypmJCEjNyQiMC0nUjJHNWMmKSEjNjckNyQkIjBsZlAtSiMqZiQhIzckIjA+XSw3JypvYikhIzY3JCQiMCN5JilmaEMqZiQhIzckIjAtJ1IyRzVjJikhIzY3JDckJCIwbGZQLUojKmYkISM3JCIwPl0sNycqb2IpISM2NyQkIjBcTiVbKCkqKilmJCEjNyQiMFFiKHpKP3AmKSEjNjckNyQkIjAtZyFbJWVuZyQhIzckIjAocF12T2B6IikhIzY3JCQiMDtBMzpybWckISM3JCIwTipcKmZ6Tz0pISM2NyQ3JCQiMDtBMzpybWckISM3JCIwTipcKmZ6Tz0pISM2NyQkIjA3SF8hXG0xTyEjNyQiMFBnK2F6Uj0pISM2NyQ3JCQiLlZALzVrZyQhIzUkIjByKD1dLDcnPikhIzY3JCQiMDdIXyFcbTFPISM3JCIwUGcrYXpSPSkhIzY3JDckJCIuVkAvNWtnJCEjNSQiMHIoPV0sNyc+KSEjNjckJCIvXzwnPiZRMU8hIzYkIjAjZUhrcEooPikhIzY3JDckJCIwNixiKClcaGckISM3JCIwM3czcWcmMyMpISM2NyQkIi9fPCc+JlExTyEjNiQiMCNlSGtwSig+KSEjNjckNyQkIjA2LGIoKVxoZyQhIzckIjAzdzNxZyYzIykhIzY3JCQiMFVAZmgxaGckISM3JCIwQykzcDJsNSMpISM2NyQ3JCQiMCdcUlUxKmVnJCEjNyQiMFdrOkQsNUEpISM2NyQkIjBVQGZoMWhnJCEjNyQiMEMpM3AybDUjKSEjNjckNyQkIjAnXFJVMSplZyQhIzckIjBXazpELDVBKSEjNjckJCIwJEdQYSJIZWckISM3JCIwZjFvKTQpUkEpISM2NyQ3JCQiMEVhckxLY2ckISM3JCIvR0QtPVdMIykhIzU3JCQiMCRHUGEiSGVnJCEjNyQiMGYxbyk0KVJBKSEjNjckNyQkIjBFYXJMS2NnJCEjNyQiL0dELT1XTCMpISM1NyQkIjAmW28tR2IwTyEjNyQiMGk1ZWsydEIpISM2NyQ3JCQiMGVvbSZcUDBPISM3JCIwO1RITiMpZUMpISM2NyQkIjAmW28tR2IwTyEjNyQiMGk1ZWsydEIpISM2NyQ3JCQiMGVvbSZcUDBPISM3JCIwO1RITiMpZUMpISM2NyQkIjByKjRldkYwTyEjNyQiMCVIJVx2STFEKSEjNjckNyQkIjAjZXklXD1eZyQhIzckIjBfSE8hSEtlIykhIzY3JCQiMHIqNGV2RjBPISM3JCIwJUglXHZJMUQpISM2NyQ3JCQiMCNleSVcPV5nJCEjNyQiMF9ITyFIS2UjKSEjNjckJCIvSz80TSswTyEjNiQiL0YhM05dUkUpISM1NyQ3JCQiME5bYyVIJ1tnJCEjNyQiMCl5SmFNd3EjKSEjNjckJCIvSz80TSswTyEjNiQiL0YhM05dUkUpISM1NyQ3JCQiME5bYyVIJ1tnJCEjNyQiMCl5SmFNd3EjKSEjNjckJCIvcic+TklaZyQhIzYkIjA6MWpXbXNGKSEjNjckNyQkIjB0OVRJM1lnJCEjNyQiMEMxXSsvS0cpISM2NyQkIi9yJz5OSVpnJCEjNiQiMDoxaldtc0YpISM2NyQ3JCQiMHQ5VEkzWWckISM3JCIwQzFdKy9LRykhIzY3JCQiMFpZZlBlV2ckISM3JCIwYVdcMnowSCkhIzY3JDckJCIvPWFrWE4vTyEjNiQiMGglcGJYayZIKSEjNjckJCIwWllmUGVXZyQhIzckIjBhV1wyejBIKSEjNjckNyQkIi89YWtYTi9PISM2JCIwaCVwYlhrJkgpISM2NyQkIjBHImV3dT0vTyEjNyQiME5SOEQpKVFJKSEjNjckNyQkIjAqUi9CPDUvTyEjNyQiMChIUTFeMzMkKSEjNjckJCIwRyJld3U9L08hIzckIjBOUjhEKSlRSSkhIzY3JDckJCIwKlIvQjw1L08hIzckIjAoSFExXjMzJCkhIzY3JCQiMGR1Zms8UmckISM3JCIwIj0iMyslPjwkKSEjNjckNyQkIjA9JmZzKFxRZyQhIzckIjBMcnFsRDBLKSEjNjckJCIwZHVmazxSZyQhIzckIjAiPSIzKyU+PCQpISM2NyQ3JCQiMD0mZnMoXFFnJCEjNyQiMExycWxEMEspISM2NyQkIjAkUTJ5KVtPZyQhIzckIjAqKm9GTSdcSSQpISM2NyQ3JCQiMC1yNHIpZi5PISM3JCIwcGZ4P21ITCkhIzY3JCQiMCRRMnkpW09nJCEjNyQiMCoqb0ZNJ1xJJCkhIzY3JDckJCIwLXI0cilmLk8hIzckIjBwZng/bUhMKSEjNjckJCIwWDNXOyJRLk8hIzckIjBfclZJJnpWJCkhIzY3JDckJCIwJnAjKUgmW0xnJCEjNyQiMDBbJWVuU1gkKSEjNjckJCIwWDNXOyJRLk8hIzckIjBfclZJJnpWJCkhIzY3JDckJCIwJnAjKUgmW0xnJCEjNyQiMDBbJWVuU1gkKSEjNjckJCIwJ1tBLFg2Lk8hIzckIjAqXGwoKjM0ZCQpISM2NyQ3JCQiME4qKnpBKjQuTyEjNyQiMFRPIjR0JXlOKSEjNjckJCIwJ1tBLFg2Lk8hIzckIjAqXGwoKjM0ZCQpISM2NyQ3JCQiME4qKnpBKjQuTyEjNyQiMFRPIjR0JXlOKSEjNjckJCIwd1ojKWZ5R2ckISM3JCIwYjklSFwqKW8kKSEjNjckNyQkIjBIc3lIUTFoJCEjNyQiME9jJltoTSshKSEjNjckJCIwYHQqKnBNL2gkISM3JCIwSmkpKik9XjQhKSEjNjckNyQkIjBgdCoqcE0vaCQhIzckIjBKaSkqKT1eNCEpISM2NyQkIjBMRWBGPi9oJCEjNyQiMC9lXTw5LSwpISM2NyQ3JCQiLzZdWiRmLGgkISM2JCIwbl0wV18+LSkhIzY3JCQiMExFYEY+L2gkISM3JCIwL2VdPDktLCkhIzY3JDckJCIvNl1aJGYsaCQhIzYkIjBuXTBXXz4tKSEjNjckJCIwbjpMPUIsaCQhIzckIjBjXi84L08tKSEjNjckNyQkIjBOS0stJikpNE8hIzckIjAuUjcqSFJNISkhIzY3JCQiMG46TD1CLGgkISM3JCIwY14vOC9PLSkhIzY3JDckJCIwTktLLSYpKTRPISM3JCIwLlI3KkhSTSEpISM2NyQkIi9GLE4kRyk0TyEjNiQiMGFjejQhKnAuKSEjNjckNyQkIjBjaSM9PGg0TyEjNyQiMFJGPmFMby8pISM2NyQkIi9GLE4kRyk0TyEjNiQiMGFjejQhKnAuKSEjNjckNyQkIjBjaSM9PGg0TyEjNyQiMFJGPmFMby8pISM2NyQkIjBcQik+WmA0TyEjNyQiMCM+YTZAUF0hKSEjNjckNyQkIjAwXiJIJVIkNE8hIzckIjB2OkU0dSNmISkhIzY3JCQiMFxCKT5aYDRPISM3JCIwIz5hNkBQXSEpISM2NyQ3JCQiMDBeIkglUiQ0TyEjNyQiMHY6RTR1I2YhKSEjNjckJCIwJ0duSUJDNE8hIzckIi9SKlE+XVAxKSEjNTckNyQkIjBWYHA5byE0TyEjNyQiMDYvTGs5PDIpISM2NyQkIjAnR25JQkM0TyEjNyQiL1IqUT5dUDEpISM1NyQ3JCQiMFZgcDlvITRPISM3JCIwNi9Mazk8MikhIzY3JCQiLyZwejpeKjNPISM2JCIwZm1kUENyMikhIzY3JDckJCIvakNweXozTyEjNiQiMFojKlI+YlQzKSEjNjckJCIvJnB6Ol4qM08hIzYkIjBmbWRQQ3IyKSEjNjckNyQkIi9qQ3B5ejNPISM2JCIwWiMqUj5iVDMpISM2NyQkIjAwNFs+aCczTyEjNyQiMFspSHpZXCE0KSEjNjckNyQkIjAoeiJmZUcmM08hIzckIjAkM29XZGYnNCkhIzY3JCQiMDA0Wz5oJzNPISM3JCIwWylIellcITQpISM2NyQ3JCQiMCh6ImZlRyYzTyEjNyQiMCQzb1dkZic0KSEjNjckJCIwKil5Q1ZzJDNPISM3JCIwN0VDOGhRNSkhIzY3JDckJCIwJG9ZJkhnIzNPISM3JCIwPnBgSE8hNCIpISM2NyQkIjAqKXlDVnMkM08hIzckIjA3RUM4aFE1KSEjNjckNyQkIjAkb1kmSGcjM08hIzckIjA+cGBITyE0IikhIzY3JCQiMGtIQCdbMzNPISM3JCIwbENOd0JzNikhIzY3JDckJCIwQ0FzKUgqemckISM3JCIwYmRnJW9aQCIpISM2NyQkIjBrSEAnWzMzTyEjNyQiMGxDTndCczYpISM2NyQ3JCQiMENBcylIKnpnJCEjNyQiMGJkZyVvWkAiKSEjNjckJCIwZHJeWil6Mk8hIzckIjBpTyxnI2VJIikhIzY3JDckJCIwRl4kZW1zMk8hIzckIjAiZnUnUjxSOCkhIzY3JCQiMGRyXlopejJPISM3JCIwaU8sZyNlSSIpISM2NyQ3JCQiMEZeJGVtczJPISM3JCIwImZ1J1I8UjgpISM2NyQkIjBBS1RFOHZnJCEjNyQiMDhBaW1QUjkpISM2NyQ3JCQiMDwuN0lodWckISM3JCIwRk11JXpOWSIpISM2NyQkIjBBS1RFOHZnJCEjNyQiMDhBaW1QUjkpISM2NyQ3JCQiMDwuN0lodWckISM3JCIwRk11JXpOWSIpISM2NyQkIjBuX0JBSHNnJCEjNyQiMG1LSikqKUdkIikhIzY3JDckJCIwKmZLN3A+Mk8hIzckIjBqQSIpXCl6ZSIpISM2NyQkIjBuX0JBSHNnJCEjNyQiMG1LSikqKUdkIikhIzY3JDckJCIwKmZLN3A+Mk8hIzckIjBqQSIpXCl6ZSIpISM2NyQkIjAuPCZSaiVwZyQhIzckIjBqWFJlTzE8KSEjNjckNyQkIjBVTk5bTHBnJCEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMC48JlJqJXBnJCEjNyQiMGpYUmVPMTwpISM2NyQ3JCQiMFVOTltMcGckISM3JCIwKjQiKVshUjc8KSEjNjckJCIwLWchWyVlbmckISM3JCIwKHBddk9geiIpISM2NyQ3JCQiMGIlb1oiPVhoJCEjNyQiMFkyLS1WMSR5ISM2NyQkIjBIRkIieVM5TyEjNyQiMEVELT1XYCR5ISM2NyQ3JCQiMEhGQiJ5UzlPISM3JCIwRUQtPVdgJHkhIzY3JCQiMHo4USUqKVI5TyEjNyQiMCUqbztTRWQkeSEjNjckNyQkIjByeipcbzY5TyEjNyQiMGk4NHQleVp5ISM2NyQkIjB6OFElKilSOU8hIzckIjAlKm87U0VkJHkhIzY3JDckJCIwcnoqXG82OU8hIzckIjBpODR0JXlaeSEjNjckJCIwVilRMVozOU8hIzckIjBuYyVSWDxceSEjNjckNyQkIjAxQlUsRlFoJCEjNyQiMCk+ZyJHRC0neSEjNjckJCIwVilRMVozOU8hIzckIjBuYyVSWDxceSEjNjckNyQkIjAxQlUsRlFoJCEjNyQiMCk+ZyJHRC0neSEjNjckJCIwJik0ayU9eDhPISM3JCIwKXpfZyM9RSd5ISM2NyQ3JCQiMGBGdUhRTmgkISM3JCIwTSFIS2Vtc3khIzY3JCQiMCYpNGslPXg4TyEjNyQiMCl6X2cjPUUneSEjNjckNyQkIjBgRnVIUU5oJCEjNyQiME0hSEtlbXN5ISM2NyQkIjBMW0pOZ01oJCEjNyQiMDooRypmZGcoeSEjNjckNyQkIjBzLlhwXUtoJCEjNyQiMHJ5SFExXil5ISM2NyQkIjBMW0pOZ01oJCEjNyQiMDooRypmZGcoeSEjNjckNyQkIjBzLlhwXUtoJCEjNyQiMHJ5SFExXil5ISM2NyQkIjBXXCM+LTo4TyEjNyQiL2VKekRcKil5ISM1NyQ3JCQiMGAueT5rSGgkISM3JCIwMW5PJHBhKCp5ISM2NyQkIjBXXCM+LTo4TyEjNyQiL2VKekRcKil5ISM1NyQ3JCQiMGAueT5rSGgkISM3JCIwMW5PJHBhKCp5ISM2NyQkIi87XE05JUdoJCEjNiQiMCkqKVFMSyNIIXohIzY3JDckJCIwMmwtISl5RWgkISM3JCIwVWJWWygpKjR6ISM2NyQkIi87XE05JUdoJCEjNiQiMCkqKVFMSyNIIXohIzY3JDckJCIwMmwtISl5RWgkISM3JCIwVmJWWygpKjR6ISM2NyQkIjBcSCQpKVJgN08hIzckIjB0PmBmXGoieiEjNjckNyQkIi8kSF9cJVI3TyEjNiQiMHpWXS5HQyN6ISM2NyQkIjBcSCQpKVJgN08hIzckIjB0PmBmXGoieiEjNjckNyQkIi8kSF9cJVI3TyEjNiQiMHpWXS5HQyN6ISM2NyQkIjAkPTVyeUE3TyEjNyQiMFknMydwcihIeiEjNjckNyQkIjBwOVRGNkBoJCEjNyQiMDpLZGVvWyR6ISM2NyQkIjAkPTVyeUE3TyEjNyQiMFknMydwcihIeiEjNjckNyQkIjBwOVRGNkBoJCEjNyQiMDpLZGVvWyR6ISM2NyQkIi8yZnNJIz5oJCEjNiQiMFhfJW8mKj1WeiEjNjckNyQkIjBUNz44SD1oJCEjNyQiMF4/azg0dCV6ISM2NyQkIi8yZnNJIz5oJCEjNiQiMFhfJW8mKj1WeiEjNjckNyQkIjBUNz44SD1oJCEjNyQiMF4/azg0dCV6ISM2NyQkIjBbPVJlPjtoJCEjNyQiMEskKTNDLm0meiEjNjckNyQkIjAlcFBnIVs6aCQhIzckIjAoKTNyb1woZnohIzY3JCQiMFs9UmU+O2gkISM3JCIwSyQpM0MubSZ6ISM2NyQ3JCQiMCVwUGchWzpoJCEjNyQiMCgpM3JvXChmeiEjNjckJCIwVDhjUjw4aCQhIzckIjApKVxQdTcrKHohIzY3JDckJCIwZSpHYSFvN2gkISM3JCIwQih6UC0+c3ohIzY3JCQiMFQ4Y1I8OGgkISM3JCIwKSlcUHU3Kyh6ISM2NyQ3JCQiMGUqR2EhbzdoJCEjNyQiMEIoelAtPnN6ISM2NyQkIjAsJ0cpXDs1aCQhIzckIi5mcjU9TSl6ISIqNyQ3JCQiMGIvZjUqKTRoJCEjNyQiMGYmWyl5SVkpeiEjNjckJCIwLCdHKVw7NWgkISM3JCIuZnI1PU0peiEiKjckNyQkIjBiL2Y1Kik0aCQhIzckIjBmJlspeUlZKXohIzY3JCQiMEZUSylvcjVPISM3JCIwJTMqKmUkPm8qeiEjNjckNyQkIjBNRiQ0N3I1TyEjNyQiMCZSPFI4MigqeiEjNjckJCIwRlRLKW9yNU8hIzckIjAlMyoqZSQ+byp6ISM2NyQ3JCQiME1GJDQ3cjVPISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBIc3lIUTFoJCEjNyQiME9jJltoTSshKSEjNjckNyQkIjAjb1woKnpSPU8hIzckIjBfKVsqcCd6cHchIzY3JCQiMDwpeTlNST1PISM3JCIwZXc3LTxPbighIzY3JDckJCIwPCl5OU1JPU8hIzckIjBldzctPE9uKCEjNjckJCIwW042TyZIPU8hIzckIjAmSCEpPmglUm4oISM2NyQ3JCQiMCoqcGtdJyp6aCQhIzckIjAlXCc+ZGRnbyghIzY3JCQiMFtONk8mSD1PISM3JCIwJkghKT5oJVJuKCEjNjckNyQkIjAqKnBrXScqemgkISM3JCIwJVwnPmRkZ28oISM2NyQkIjAjKkdEV2l6aCQhIzckIjBEJSp5OmF1byghIzY3JDckJCIwTmQ7JDNwPE8hIzckIi9MbEEiKVwpcCghIzU3JCQiMCMqR0RXaXpoJCEjNyQiMEQlKnk6YXVvKCEjNjckNyQkIjBOZDskM3A8TyEjNyQiL0xsQSIpXClwKCEjNTckJCIwV3goWzVqPE8hIzckIjBkNm1JZDRxKCEjNjckNyQkIjA0PGJRJ1E8TyEjNyQiMG1UTG5RNHIoISM2NyQkIjBXeChbNWo8TyEjNyQiMGQ2bUlkNHEoISM2NyQ3JCQiMDQ8YlEnUTxPISM3JCIwbVRMblE0cighIzY3JCQiLyxYcTZJPE8hIzYkIjBwJT4nZmJXcighIzY3JDckJCIwYGtwOiQzPE8hIzckIjAtSVNBekxzKCEjNjckJCIvLFhxNkk8TyEjNiQiMHAlPidmYldyKCEjNjckNyQkIjBga3A6JDM8TyEjNyQiMC1JU0F6THMoISM2NyQkIjBgU1h6c3BoJCEjNyQiMCJ6TW8hXHpzKCEjNjckNyQkIjBpNCdRNnk7TyEjNyQiMFE9Wng+ZXQoISM2NyQkIjBgU1h6c3BoJCEjNyQiMCJ6TW8hXHpzKCEjNjckNyQkIjBpNCdRNnk7TyEjNyQiMFE9Wng+ZXQoISM2NyQkIjAmR2IzZms7TyEjNyQiMHNRSndQOXUoISM2NyQ3JCQiL05WQS5bO08hIzYkIjB1MWFLZyNbeCEjNjckJCIwJkdiM2ZrO08hIzckIjBzUUp3UDl1KCEjNjckNyQkIi9OVkEuWztPISM2JCIwdTFhS2cjW3ghIzY3JCQiMHorT10/amgkISM3JCIwV2chNDwjXHYoISM2NyQ3JCQiMEQzPHEhPTtPISM3JCIvXjR3M3FneCEjNTckJCIweitPXT9qaCQhIzckIjBXZyE0PCNcdighIzY3JDckJCIwRDM8cSE9O08hIzckIi9eNHczcWd4ISM1NyQkIjA6TWRjJypmaCQhIzckIjB5VjMmNFNveCEjNjckNyQkIjAtTGdFIyllaCQhIzckIjBZJHlFOTl0eCEjNjckJCIwOk1kYycqZmgkISM3JCIweVYzJjRTb3ghIzY3JDckJCIwLUxnRSMpZWgkISM3JCIwWSR5RTk5dHghIzY3JCQiMC9SYTN1Y2gkISM3JCIwYSUqKj1iKD15KCEjNjckNyQkIjAvYSk0XWU6TyEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwL1JhM3VjaCQhIzckIjBhJSoqPWIoPXkoISM2NyQ3JCQiMC9hKTRdZTpPISM3JCIwIz1aeD5lJnkoISM2NyQkIjApKm89MGBgaCQhIzckIjBVIkhbYU0meighIzY3JDckJCIwTXhXIyopRzpPISM3JCIwPWciR0QtKXooISM2NyQkIjApKm89MGBgaCQhIzckIjBVIkhbYU0meighIzY3JDckJCIwTXhXIyopRzpPISM3JCIwPWciR0QtKXooISM2NyQkIjBFUklYTF1oJCEjNyQiL0c7eDIiKTN5ISM1NyQ3JCQiMDQzRCslKlxoJCEjNyQiMGFbKXlJWTV5ISM2NyQkIjBFUklYTF1oJCEjNyQiL0c7eDIiKTN5ISM1NyQ3JCQiMDQzRCslKlxoJCEjNyQiMGFbKXlJWTV5ISM2NyQkIjBpOiF5X3I5TyEjNyQiMCIqbzFhckEjeSEjNjckNyQkIjAoej1OLXE5TyEjNyQiL3BgSE8hSCN5ISM1NyQkIjBpOiF5X3I5TyEjNyQiMCIqbzFhckEjeSEjNjckNyQkIjAoej1OLXE5TyEjNyQiL3BgSE8hSCN5ISM1NyQkIjBiJW9aIj1YaCQhIzckIjBZMi0tVjEkeSEjNjckNyQkIjAzNHQleUZBTyEjNyQiMGM4LHNUc14oISM2NyQkIjBaVmgvJDRBTyEjNyQiMEQ7SVRJVl8oISM2NyQ3JCQiMFpWaC8kNEFPISM3JCIwRDtJVElWXyghIzY3JCQiMExfVlN3P2kkISM3JCIwJSk0LEx3XF8oISM2NyQ3JCQiMCk0XngqcDxpJCEjNyQiMGgvUCc0eE92ISM2NyQkIjBMX1ZTdz9pJCEjNyQiMCUpNCxMd1xfKCEjNjckNyQkIjApNF54KnA8aSQhIzckIjBoL1AnNHhPdiEjNjckJCIwNEJOVEM8aSQhIzckIjBOZ0JfWCZRdiEjNjckNyQkIjBCSXBEWzlpJCEjNyQiMChIUjk6QFx2ISM2NyQkIjA0Qk5UQzxpJCEjNyQiME5nQl9YJlF2ISM2NyQ3JCQiMEJJcERbOWkkISM3JCIwKEhSOTpAXHYhIzY3JCQiMHNdYjV1OGkkISM3JCIwdDYnPSQ0QGIoISM2NyQ3JCQiMG8leXZ5N0BPISM3JCIwTCIzbD9saHYhIzY3JCQiMHNdYjV1OGkkISM3JCIwdDYnPSQ0QGIoISM2NyQ3JCQiMG8leXZ5N0BPISM3JCIwTCIzbD9saHYhIzY3JCQiMGYhKSlwYS1ATyEjNyQiMClvcV94bWx2ISM2NyQ3JCQiMF44dCMpMzNpJCEjNyQiMHBwZGgjNHV2ISM2NyQkIjBmISkpcGEtQE8hIzckIjApb3FfeG1sdiEjNjckNyQkIjBeOHQjKTMzaSQhIzckIjBwcGRoIzR1diEjNjckJCIwKGVTI1x5MWkkISM3JCIvKHkpcDNBenYhIzU3JDckJCIwV1ooKTQiXD9PISM3JCIwMGVrO0xsZSghIzY3JCQiMChlUyNceTFpJCEjNyQiLyh5KXAzQXp2ISM1NyQ3JCQiMFdaKCk0Ilw/TyEjNyQiMDBlaztMbGUoISM2NyQkIjAyQS47TC5pJCEjNyQiMDolPTYob0ZmKCEjNjckNyQkIjAwIj0kb3UsaSQhIzckIjBUWXJydCopZighIzY3JCQiMDJBLjtMLmkkISM3JCIwOiU9NihvRmYoISM2NyQ3JCQiMDAiPSRvdSxpJCEjNyQiMFRZcnJ0KilmKCEjNjckJCIwXDgnZSUqKSo+TyEjNyQiME1xWks2amcoISM2NyQ3JCQiL0FwcCZmKT5PISM2JCIweU15RTk5aCghIzY3JCQiMFw4J2UlKikqPk8hIzckIjBNcVpLNmpnKCEjNjckNyQkIi9BcHAmZik+TyEjNiQiMHlNeUU5OWgoISM2NyQkIjA4K15QWic+TyEjNyQiMCg9cFwoWyk+dyEjNjckNyQkIjBuWDJ2WCY+TyEjNyQiMDlCJj1bJlFpKCEjNjckJCIwOCteUFonPk8hIzckIjAoPXBcKFspPnchIzY3JDckJCIwblgydlgmPk8hIzckIjA5QiY9WyZRaSghIzY3JCQiMFpAdCpvST5PISM3JCIweC1mLSJRTHchIzY3JDckJCIwXFtsQEwjPk8hIzckIi86QHBgSE93ISM1NyQkIjBaQHQqb0k+TyEjNyQiMHgtZi0iUUx3ISM2NyQ3JCQiMFxbbEBMIz5PISM3JCIvOkBwYEhPdyEjNTckJCIwPXo6LG8qPU8hIzckIjA0RXQ+M3BrKCEjNjckNyQkIjB2eCVlPiMqPU8hIzckIjAnKSoqKT5mdFt3ISM2NyQkIjA9ejosbyo9TyEjNyQiMDRFdD4zcGsoISM2NyQ3JCQiMHZ4JWU+Iyo9TyEjNyQiMCcpKiopPmZ0W3chIzY3JCQiMC5vcnFJJz1PISM3JCIwaChHKUhJL20oISM2NyQ3JCQiMCRHLnA+aD1PISM3JCIwQSllcWs8aHchIzY3JCQiMC5vcnFJJz1PISM3JCIwaChHKUhJL20oISM2NyQ3JCQiMCRHLnA+aD1PISM3JCIwQSllcWs8aHchIzY3JCQiMCNvXCgqelI9TyEjNyQiMF8pWypwJ3pwdyEjNjckNyQkIjBOQHJwZGhpJCEjNyQiMG1vMz9mQ1AoISM2NyQkIjBDOVBqJzNFTyEjNyQiMCRmdi9RL3Z0ISM2NyQ3JCQiMEM5UGonM0VPISM3JCIwJGZ2L1EvdnQhIzY3JCQiMHAlW18pemdpJCEjNyQiMHA7KTRNSHZ0ISM2NyQ3JCQiMHQyUSZldURPISM3JCIwSFdhTiVbKFEoISM2NyQkIjBwJVtfKXpnaSQhIzckIjBwOyk0TUh2dCEjNjckNyQkIjB0MlEmZXVETyEjNyQiMEhXYU4lWyhRKCEjNjckJCIwJ2ZrMG5xRE8hIzckIjAmenlQLyQqKVEoISM2NyQ3JCQiMCczJGViMWFpJCEjNyQiMGxLaCFcIyoqUighIzY3JCQiMCdmazBucURPISM3JCIwJnp5UC8kKilRKCEjNjckNyQkIjAnMyRlYjFhaSQhIzckIjBsS2ghXCMqKlIoISM2NyQkIjA8dTtWTmBpJCEjNyQiMCk+XWc5Yy11ISM2NyQ3JCQiMF9KIUcob11pJCEjNyQiMCxAb1hsQlQoISM2NyQkIjA8dTtWTmBpJCEjNyQiMCk+XWc5Yy11ISM2NyQ3JCQiMF9KIUcob11pJCEjNyQiMCxAb1hsQlQoISM2NyQkIjBXJ1E3ZydcaSQhIzckIjBNaGlgJz07dSEjNjckNyQkIi86N2ZCdENPISM2JCIwUDR2KzFbVSghIzY3JCQiMFcnUTdnJ1xpJCEjNyQiME1oaWAnPTt1ISM2NyQ3JCQiLzo3ZkJ0Q08hIzYkIjBQNHYrMVtVKCEjNjckJCIwJnpzSyUpZkNPISM3JCIwYVFMcjApSHUhIzY3JDckJCIwejMiUXVSQ08hIzckIjB0KD5lbENQdSEjNjckJCIwJnpzSyUpZkNPISM3JCIwYVFMcjApSHUhIzY3JDckJCIwejMiUXVSQ08hIzckIjB0KD5lbENQdSEjNjckJCIwXGNrbktVaSQhIzckIjBYOFEvPk1XKCEjNjckNyQkIjA0LXEmUjFDTyEjNyQiMDQnKSkzcm9cdSEjNjckJCIwXGNrbktVaSQhIzckIjBYOFEvPk1XKCEjNjckNyQkIjA0LXEmUjFDTyEjNyQiMDQnKSkzcm9cdSEjNjckJCIwSiJlSChvUWkkISM3JCIwdFlEZEVxWCghIzY3JDckJCIwX1s8IT50Qk8hIzckIjBYdSZmdzdpdSEjNjckJCIwSiJlSChvUWkkISM3JCIwdFlEZEVxWCghIzY3JDckJCIwX1s8IT50Qk8hIzckIjBYdSZmdzdpdSEjNjckJCIwPXpSZDFOaSQhIzckIjBsXHdORzFaKCEjNjckNyQkIjBDb1ZFLE1pJCEjNyQiMCJHRTUjb1haKCEjNjckJCIwPXpSZDFOaSQhIzckIjBsXHdORzFaKCEjNjckNyQkIjBDb1ZFLE1pJCEjNyQiMCJHRTUjb1haKCEjNjckJCIwJXpWKT5ZSmkkISM3JCIwW3RdVkNVWyghIzY3JDckJCIwa1pULnNJaSQhIzckIjA8XjR3M3FbKCEjNjckJCIwJXpWKT5ZSmkkISM3JCIwW3RdVkNVWyghIzY3JDckJCIwbFpULnNJaSQhIzckIjA8XjR3M3FbKCEjNjckJCIwRSg9JGUoeUFPISM3JCIvM0BvWyJ5XCghIzU3JDckJCIwdkQiKj5XRmkkISM3JCIwYFI7SlwlKlwoISM2NyQkIjBFKD0kZSh5QU8hIzckIi8zQG9bInlcKCEjNTckNyQkIjB2RCIqPldGaSQhIzckIjBgUjtKXCUqXCghIzY3JCQiMFgweXJJQ2kkISM3JCIwRHkvcCpSNnYhIzY3JDckJCIwJXopPnY8Q2kkISM3JCIwKnlLaSkqKT1eKCEjNjckJCIwWDB5cklDaSQhIzckIjBEeS9wKlI2diEjNjckNyQkIjAleik+djxDaSQhIzckIjAqeUtpKSopPV4oISM2NyQkIjAzNHQleUZBTyEjNyQiMGM4LHNUc14oISM2NyQ3JCQiMGhMcGFQK2okISM3JCIwcihSMzgpXEIoISM2NyQkIjBGYyFmVyUqSE8hIzckIjAnUj1aeD5RcyEjNjckNyQkIjBGYyFmVyUqSE8hIzckIjAnUj1aeD5RcyEjNjckJCIweVdOMU4qSE8hIzckIjBRNl9ORSZRcyEjNjckNyQkIjBNRWgiZWVITyEjNyQiMEtzeUhRMUQoISM2NyQkIjB5V04xTipITyEjNyQiMFE2X05FJlFzISM2NyQ3JCQiME1FaCJlZUhPISM3JCIwS3N5SFExRCghIzY3JCQiMChbXjAvYUhPISM3JCIvanhkQkJfcyEjNTckNyQkIjB1b1J6RyNITyEjNyQiMG9nJlspeUlFKCEjNjckJCIwKFteMC9hSE8hIzckIi9qeGRCQl9zISM1NyQ3JCQiMHVvUnpHI0hPISM3JCIwb2cmWyl5SUUoISM2NyQkIjBCZCo+eTlITyEjNyQiMDlmXXJKZkUoISM2NyQ3JCQiMFAxInlMKClHTyEjNyQiMC9cIypSPmJGKCEjNjckJCIwQmQqPnk5SE8hIzckIjA5Zl1ySmZFKCEjNjckNyQkIjBQMSJ5TCgpR08hIzckIjAvXCMqUj5iRighIzY3JCQiMHUkZiZHZChHTyEjNyQiMEEoRyZcQyd6cyEjNjckNyQkIjBDIlxmJj4mR08hIzckIi91JCpcKmZ6RyghIzU3JCQiMHUkZiZHZChHTyEjNyQiMEEoRyZcQyd6cyEjNjckNyQkIjBDIlxmJj4mR08hIzckIi91JCpcKmZ6RyghIzU3JCQiMD5menlvJEdPISM3JCIwXFVbdTVMSCghIzY3JDckJCIwZkNSS24iR08hIzckIjB3RDFdKy9JKCEjNjckJCIwPmZ6eW8kR08hIzckIjBcVVt1NUxIKCEjNjckNyQkIjBmQ1JLbiJHTyEjNyQiMHdEMV0rL0koISM2NyQkIjBQamVJIyl6aSQhIzckIjBOcTtgISpwSSghIzY3JDckJCIwKGZUZW0ieWkkISM3JCIwODk4MFRHSighIzY3JCQiMFBqZUkjKXppJCEjNyQiME5xO2AhKnBJKCEjNjckNyQkIjAoZlRlbSJ5aSQhIzckIjA3OTgwVEdKKCEjNjckJCIwQ2k3I3lmRk8hIzckIjA6R08iUm0/dCEjNjckNyQkIjAyJ0hgdllGTyEjNyQiMFwtP2ciR0R0ISM2NyQkIjBDaTcjeWZGTyEjNyQiMDpHTyJSbT90ISM2NyQ3JCQiMDInSGB2WUZPISM3JCIwXC0/ZyJHRHQhIzY3JCQiLygqRzxgQEZPISM2JCIwPSd6VzRMTXQhIzY3JDckJCIwTDFQKio+cmkkISM3JCIwJjNwX0BzUHQhIzY3JCQiLygqRzxgQEZPISM2JCIwPSd6VzRMTXQhIzY3JDckJCIwTDFQKio+cmkkISM3JCIwJjNwX0BzUHQhIzY3JCQiMDxranhNb2kkISM3JCIwLFw6byIqek0oISM2NyQ3JCQiMHleNShSeEVPISM3JCIwQHpMcWksTighIzY3JCQiMDxranhNb2kkISM3JCIwLFw6byIqek0oISM2NyQ3JCQiMHleNShSeEVPISM3JCIwQHpMcWksTighIzY3JCQiMDtxNz1ja2kkISM3JCIwPigzemhraHQhIzY3JDckJCIwX2w+WkhraSQhIzckIjBkblNELkVPKCEjNjckJCIwO3E3PWNraSQhIzckIjA+KDN6aGtodCEjNjckNyQkIjBfbD5aSGtpJCEjNyQiMGRuU0QuRU8oISM2NyQkIjBOQHJwZGhpJCEjNyQiMG1vMz9mQ1AoISM2NyQ3JCQiMClldSdSPFJqJCEjNyQiMHIzOCRRUC9yISM2NyQkIi4qKT01Sk9qJCEjNSQiME8rLkMjejhyISM2NyQ3JCQiLiopPTVKT2okISM1JCIwTysuQyN6OHIhIzY3JCQiL0ohR2crT2okISM2JCIwOlxaLTNbNighIzY3JDckJCIwVTRmamFLaiQhIzckIjBzKSk0ektpNyghIzY3JCQiL0ohR2crT2okISM2JCIwOlxaLTNbNighIzY3JDckJCIwVTRmamFLaiQhIzckIjBzKSk0ektpNyghIzY3JCQiMCZlPUZWPUxPISM3JCIwJz0xVkxlR3IhIzY3JDckJCIvPCMpUSp6R2okISM2JCIwM3g7TXQnUXIhIzY3JCQiMCZlPUZWPUxPISM3JCIwJz0xVkxlR3IhIzY3JDckJCIvPCMpUSp6R2okISM2JCIwM3g7TXQnUXIhIzY3JCQiMEpVJ1EueEtPISM3JCIwUSQpekteQjkoISM2NyQ3JCQiMDMiKTMqcF1LTyEjNyQiMFdsQipRNl5yISM2NyQkIjBKVSdRLnhLTyEjNyQiMFEkKXpLXkI5KCEjNjckNyQkIjAzIikzKnBdS08hIzckIjBXbEIqUTZeciEjNjckJCIwYzwuaGVCaiQhIzckIi9GaWw/NmNyISM1NyQ3JCQiMGRYQHlOQGokISM3JCIvUTBWV2JqciEjNTckJCIwYzwuaGVCaiQhIzckIi9GaWw/NmNyISM1NyQ3JCQiMGRYQHlOQGokISM3JCIvUTBWV2JqciEjNTckJCIwKFxuRCJcPmokISM3JCIwdC4hNGMnKXByISM2NyQ3JCQiMCUqPScpSG08aiQhIzckIjA7VVAqXCpmPCghIzY3JCQiMChcbkQiXD5qJCEjNyQiMHQuITRjJylwciEjNjckNyQkIjAlKj0nKUhtPGokISM3JCIwO1VQKlwqZjwoISM2NyQkIjBNJioqZj1hSk8hIzckIjBVKFFQP2gkPSghIzY3JDckJCIwbklFXylSSk8hIzckIjBfSVdhTiUpPSghIzY3JCQiME0mKipmPWFKTyEjNyQiMFUoUVA/aCQ9KCEjNjckNyQkIjBuSUVfKVJKTyEjNyQiMF9JV2FOJSk9KCEjNjckJCIvLzUlek82aiQhIzYkIjAnekU3OU4oPighIzY3JDckJCIwJXBtV0MuSk8hIzckIjApKT1eNHczPyghIzY3JCQiLy81JXpPNmokISM2JCIwJ3pFNzlOKD4oISM2NyQ3JCQiMCVwbVdDLkpPISM3JCIwKSk9XjR3Mz8oISM2NyQkIi9AVjNSdElPISM2JCIwRmRqeiQzNnMhIzY3JDckJCIwM1ssMG8xaiQhIzckIjBDMmVrO0xAKCEjNjckJCIvQFYzUnRJTyEjNiQiMEZkanokMzZzISM2NyQ3JCQiMDNbLDBvMWokISM3JCIwQzJlaztMQCghIzY3JCQiMCVbSnpKTElPISM3JCItZGwjNFtBKCEiKTckNyQkIjBhJypRSzAuaiQhIzckIi9jXCc+ZGRBKCEjNTckJCIwJVtKekpMSU8hIzckIi1kbCM0W0EoISIpNyQ3JCQiMGInKlFLMC5qJCEjNyQiL2NcJz5kZEEoISM1NyQkIjBoTHBhUCtqJCEjNyQiMHIoUjM4KVxCKCEjNjckNyQkIjA5ZWxDKHpQTyEjNyQiMDNJWyozQyEpcCEjNjckJCIwLWBuIVtdUE8hIzckIjB2O010J1EqKXAhIzY3JDckJCIwLWBuIVtdUE8hIzckIjB2O010J1EqKXAhIzY3JCQiMFRfNSc9WlBPISM3JCIwVSdIbStWISpwISM2NyQ3JCQiMCxvSycpM3JqJCEjNyQiMDYwVEdGPSsoISM2NyQkIjBUXzUnPVpQTyEjNyQiMFUnSG0rViEqcCEjNjckNyQkIjAsb0snKTNyaiQhIzckIjA2MFRHRj0rKCEjNjckJCIwOyJvWzsuUE8hIzckIi9FbE9ARy9xISM1NyQ3JCQiMFcqKVwmW3JPTyEjNyQiMFskek15RTlxISM2NyQkIjA7Im9bOy5QTyEjNyQiL0VsT0BHL3EhIzU3JDckJCIwVyopXCZbck9PISM3JCIwWyR6TXlFOXEhIzY3JCQiMEU9OihSZk9PISM3JCIwKmUpejJFIj1xISM2NyQ3JCQiMEsjPWhGS09PISM3JCIwJT1bJlEzbi0oISM2NyQkIjBFPTooUmZPTyEjNyQiMCplKXoyRSI9cSEjNjckNyQkIjBLIz1oRktPTyEjNyQiMCU9WyZRM24tKCEjNjckJCIwYEImKXplaGokISM3JCIwNEQpKik+Jz4uKCEjNjckNyQkIjA+Jykpb0QkZmokISM3JCIvLTxPKlsiUnEhIzU3JCQiMGBCJil6ZWhqJCEjNyQiMDREKSopPic+LighIzY3JDckJCIwPicpKW9EJGZqJCEjNyQiLy08TypbIlJxISM1NyQkIjA+UyU0aHNOTyEjNyQiMGhBciQqKnlYcSEjNjckNyQkIjAkZT1nVWFOTyEjNyQiMGNlb1sqZV5xISM2NyQkIjA+UyU0aHNOTyEjNyQiMGhBciQqKnlYcSEjNjckNyQkIjAkZT1nVWFOTyEjNyQiMGNlb1sqZV5xISM2NyQkIjBHTCR5ZUhOTyEjNyQiMGtQSSs1J2ZxISM2NyQ3JCQiMCJHP0F5Ok5PISM3JCIwI3BhUCsua3EhIzY3JCQiMEdMJHllSE5PISM3JCIwa1BJKzUnZnEhIzY3JDckJCIwIkc/QXk6Tk8hIzckIjAjcGFQKy5rcSEjNjckJCIwKWVmeiFvW2okISM3JCIwYXgncEFVdHEhIzY3JDckJCIwKlsoXEJ0WmokISM3JCIwR04jKWVxazIoISM2NyQkIjApZWZ6IW9baiQhIzckIjBheCdwQVV0cSEjNjckNyQkIjAqWyhcQnRaaiQhIzckIjBHTiMpZXFrMighIzY3JCQiMHIkUiFwVVdqJCEjNyQiLyRmLSJvQSgzKCEjNTckNyQkIjBqVmpbIVJNTyEjNyQiMGtCKlE2IiopMyghIzY3JCQiMHIkUiFwVVdqJCEjNyQiLyRmLSJvQSgzKCEjNTckNyQkIjBqVmpbIVJNTyEjNyQiMGtCKlE2IiopMyghIzY3JCQiMGQ3ZG8+U2okISM3JCIweSopXHFCNTUoISM2NyQ3JCQiMGJAI2YmNFNqJCEjNyQiLjcnKm9eODUoISIqNyQkIjBkN2RvPlNqJCEjNyQiMHkqKVxxQjU1KCEjNjckNyQkIjBiQCNmJjRTaiQhIzckIi43JypvXjg1KCEiKjckJCIwKWV1J1I8UmokISM3JCIwcjM4JFFQL3IhIzY3JDckJCIwVHFqNHg7ayQhIzckIjAoUWt6ZUBpbyEjNjckJCIvUm1JUmVUTyEjNiQiMDpMbEEiKVwnbyEjNjckNyQkIi9SbUlSZVRPISM2JCIwOkxsQSIpXCdvISM2NyQkIjAnKXpyIUdkVE8hIzckIi9reENjSmxvISM1NyQ3JCQiMCo+KXBnbTZrJCEjNyQiMF5Ac3hAdShvISM2NyQkIjAnKXpyIUdkVE8hIzckIi9reENjSmxvISM1NyQ3JCQiMCo+KXBnbTZrJCEjNyQiMF5Ac3hAdShvISM2NyQkIjBsL1AkZjVUTyEjNyQiME5zRT1gI3pvISM2NyQ3JCQiMF5QKTM5dlNPISM3JCIwKCk0ektpKSopbyEjNjckJCIwbC9QJGY1VE8hIzckIjBOc0U9YCN6byEjNjckNyQkIjBeUCkzOXZTTyEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMGxtWSk9a1NPISM3JCIwNFpUbyI9JCpvISM2NyQ3JCQiMFB1ZEpRLmskISM3JCIwQilmeUdJLXAhIzY3JCQiMGxtWSk9a1NPISM3JCIwNFpUbyI9JCpvISM2NyQ3JCQiMFB1ZEpRLmskISM3JCIwQilmeUdJLXAhIzY3JCQiMCRIXUgxPVNPISM3JCIwNyo+Rjc1MnAhIzY3JDckJCIweCsvSkYqUk8hIzckIjBmJ0dITXU5cCEjNjckJCIwJEhdSDE9U08hIzckIjA3Kj5GNzUycCEjNjckNyQkIjB4Ky9KRipSTyEjNyQiMGYnR0hNdTlwISM2NyQkIjBITypRQHNSTyEjNyQiMFIvZCE+LEBwISM2NyQ3JCQiMEhrU1A9JlJPISM3JCIwJlwoKnpSPUZwISM2NyQkIjBITypRQHNSTyEjNyQiMFIvZCE+LEBwISM2NyQ3JCQiMEhrU1A9JlJPISM3JCIwJlwoKnpSPUZwISM2NyQkIjBONVZRbSNSTyEjNyQiMD1bOiJRIlwkcCEjNjckNyQkIjAmXC8pWzYiUk8hIzckIjBKajFgQydScCEjNjckJCIwTjVWUW0jUk8hIzckIjA9WzoiUSJcJHAhIzY3JDckJCIwJlwvKVs2IlJPISM3JCIwSmoxYEMnUnAhIzY3JCQiMDc1XUw4KVFPISM3JCIwKWYqRy8yKVtwISM2NyQ3JCQiMHIoKlJqMShRTyEjNyQiMG5eODNsPyZwISM2NyQkIjA3NV1MOClRTyEjNyQiMClmKkcvMilbcCEjNjckNyQkIjByKCpSajEoUU8hIzckIjBuXjgzbD8mcCEjNjckJCIwYDByJ0hPUU8hIzckIjBVeWtuInBpcCEjNjckNyQkIjB6VW56LiRRTyEjNyQiMC5TP2owWCdwISM2NyQkIjBgMHInSE9RTyEjNyQiMFV5a24icGlwISM2NyQ3JCQiMHpVbnouJFFPISM3JCIwLlM/ajBYJ3AhIzY3JCQiMHJUIlxfInpqJCEjNyQiMCxhSiJ5Y3dwISM2NyQ3JCQiMDRuZiZIIXpqJCEjNyQiMFJHRj1ZcChwISM2NyQkIjByVCJcXyJ6aiQhIzckIjAsYUoieWN3cCEjNjckNyQkIjA0bmYmSCF6aiQhIzckIjBSR0Y9WXAocCEjNjckJCIwOWVsQyh6UE8hIzckIjAzSVsqM0MhKXAhIzY3JDckJCIwbiM9WXBiWE8hIzckIjBkJltdQCcqXG4hIzY3JCQiMFR2ZHpbYWskISM3JCIwInpMcWksYG4hIzY3JDckJCIwVHZkelthayQhIzckIjAiekxxaSxgbiEjNjckJCIvM15WXlZYTyEjNiQiMGU2WiNvU2BuISM2NyQ3JCQiMHA1c0I1XWskISM3JCIwRkU1I29YbG4hIzY3JCQiLzNeVl5WWE8hIzYkIjBlNlojb1NgbiEjNjckNyQkIjBwNXNCNV1rJCEjNyQiMEZFNSNvWGxuISM2NyQkIjBXNStiVFxrJCEjNyQiL2AyZitWbm4hIzU3JDckJCIwdSRvLlNkV08hIzckIjBqOTxQKCp5eCchIzY3JCQiMFc1K2JUXGskISM3JCIvYDJmK1ZubiEjNTckNyQkIjB1JG8uU2RXTyEjNyQiMGo5PFAoKnl4JyEjNjckJCIwTmAtNF5XayQhIzckIjAmR0NYS1cieSchIzY3JDckJCIwLCVbdSs5V08hIzckIjAqSFNBekwheichIzY3JCQiME5gLTReV2skISM3JCIwJkdDWEtXInknISM2NyQ3JCQiMCwlW3UrOVdPISM3JCIwKkhTQXpMIXonISM2NyQkIjB3dClIUCdSayQhIzckIjBUMU1cWWF6JyEjNjckNyQkIjBMJDNGJTNQayQhIzckIjBOIjR0JXlGIW8hIzY3JCQiMHd0KUhQJ1JrJCEjNyQiMFQxTVxZYXonISM2NyQ3JCQiMEwkM0YlM1BrJCEjNyQiME4iNHQleUYhbyEjNjckJCIwWSopUVZ6TWskISM3JCIwd01kIipSJTRvISM2NyQ3JCQiL3paUiF6S2skISM2JCIwcnpQLT5fIm8hIzY3JCQiMFkqKVFWek1rJCEjNyQiMHdNZCIqUiU0byEjNjckNyQkIi96WlIhektrJCEjNiQiMHJ6UC0+XyJvISM2NyQkIjBFVWw7KSpIayQhIzckIjB4JSlvaUJNI28hIzY3JDckJCIwJWZtIyo9JkdrJCEjNyQiMDJvV2RmdyNvISM2NyQkIjBFVWw7KSpIayQhIzckIjB4JSlvaUJNI28hIzY3JDckJCIwJWZtIyo9JkdrJCEjNyQiMDJvV2RmdyNvISM2NyQkIjAjUTcqKik+RGskISM3JCIvJTMqPXhSUG8hIzU3JDckJCIwQ0BvJ3BVVU8hIzckIjBWY143KywlbyEjNjckJCIwI1E3KiopPkRrJCEjNyQiLyUzKj14UlBvISM1NyQ3JCQiMENAbydwVVVPISM3JCIwVmNeNyssJW8hIzY3JCQiMDlrXWZXP2skISM3JCIwX2whNEJPXm8hIzY3JDckJCIwQisoUlUrVU8hIzckIjB6V2VuU0QmbyEjNjckJCIwOWtdZlc/ayQhIzckIjBfbCE0Qk9ebyEjNjckNyQkIjBCKyhSVStVTyEjNyQiMHpXZW5TRCZvISM2NyQkIjBUcWo0eDtrJCEjNyQiMChRa3plQGlvISM2NyQ3JCQiMCVcKmZ6TyVcTyEjNyQiMGQ5QTBsSmsnISM2NyQkIjAwM0BbYCFcTyEjNyQiMC1KWyc9XGBtISM2NyQ3JCQiMDAzQFtgIVxPISM3JCIwLUpbJz1cYG0hIzY3JCQiMC4kM2pDK1xPISM3JCIwJXBIS1gpW2wnISM2NyQ3JCQiMDdERTwlZltPISM3JCIwUT5iVEtmbSchIzY3JCQiMC4kM2pDK1xPISM3JCIwJXBIS1gpW2wnISM2NyQ3JCQiMDdERTwlZltPISM3JCIwUT5iVEtmbSchIzY3JCQiL2B0cURbW08hIzYkIjBAVUU0Iyoqb20hIzY3JDckJCIwcjVSUlAiW08hIzckIjB1MmknSFB5bSEjNjckJCIvYHRxRFtbTyEjNiQiMEBVRTQjKipvbSEjNjckNyQkIjByNVJSUCJbTyEjNyQiMHUyaSdIUHltISM2NyQkIjBrPWc4bXprJCEjNyQiMHlnaWMpMyRvJyEjNjckNyQkIjBlYy83JG9aTyEjNyQiL2gqb144M3AnISM1NyQkIjBrPWc4bXprJCEjNyQiMHlnaWMpMyRvJyEjNjckNyQkIjBlYy83JG9aTyEjNyQiL2gqb144M3AnISM1NyQkIjBzRmk2YHVrJCEjNyQiL18zITR1cnAnISM1NyQ3JCQiMEo/Jkc4QlpPISM3JCIwWSVlblNELm4hIzY3JCQiMHNGaTZgdWskISM3JCIvXzMhNHVycCchIzU3JDckJCIwSj8mRzhCWk8hIzckIjBZJWVuU0QubiEjNjckJCIweihHc00lcGskISM3JCIwdzElKnlbN3InISM2NyQ3JCQiMEAiUiQqPnlZTyEjNyQiMCRHRj1ZcDpuISM2NyQkIjB6KEdzTSVwayQhIzckIjB3MSUqeVs3cichIzY3JDckJCIwQCJSJCo+eVlPISM3JCIwI0dGPVlwOm4hIzY3JCQiMFQ8dTtQa2skISM3JCIwTWpAeTdgcychIzY3JDckJCIwSFlRNE5qayQhIzckIjA+aCpvXjhHbiEjNjckJCIwVDx1O1BrayQhIzckIjBNakB5N2BzJyEjNjckNyQkIjBIWVE0TmprJCEjNyQiMD5oKm9eOEduISM2NyQkIi9UUWhUJGZrJCEjNiQiMF9ldD5tJFJuISM2NyQ3JCQiMG1xX2chKmVrJCEjNyQiMGJcJz5kZFNuISM2NyQkIi9UUWhUJGZrJCEjNiQiMF9ldD5tJFJuISM2NyQ3JCQiMG1xX2chKmVrJCEjNyQiMGJcJz5kZFNuISM2NyQkIjBuIz1ZcGJYTyEjNyQiMGQmW11AJypcbiEjNjckNyQkIi9zIWVrO0xsJCEjNiQiMDYnRzFLYFRsISM2NyQkIjA3Xng5S0dsJCEjNyQiMDlDJGZ1J1JiJyEjNjckNyQkIjA3Xng5S0dsJCEjNyQiMDlDJGZ1J1JiJyEjNjckJCIwMEUmPVN3X08hIzckIjA4aD5WUmRiJyEjNjckNyQkIjAqZmwmPl1CbCQhIzckIi9ELDUhM2tjJyEjNTckJCIwMEUmPVN3X08hIzckIjA4aD5WUmRiJyEjNjckNyQkIjAqZmwmPl1CbCQhIzckIi9ELDUhM2tjJyEjNTckJCIwWV40KlxAX08hIzckIjBlLElUUypwbCEjNjckNyQkIjBkaCI0NSg9bCQhIzckIjAnM3FnJlspeWwhIzY3JCQiMFleNCpcQF9PISM3JCIwZSxJVFMqcGwhIzY3JDckJCIwZGgiNDUoPWwkISM3JCIwJzNxZyZbKXlsISM2NyQkIjBNYXR6cDtsJCEjNyQiMHd5MDVIVGUnISM2NyQ3JCQiMCllQGRYUl5PISM3JCIwQSpRNiIqRyJmJyEjNjckJCIwTWF0enA7bCQhIzckIjB3eTA1SFRlJyEjNjckNyQkIjApZUBkWFJeTyEjNyQiMEEqUTYiKkciZichIzY3JCQiMFdiISpRRzZsJCEjNyQiMFAheV1jSSlmJyEjNjckNyQkIjBRPF0iMyM0bCQhIzckIjBleD9tSFBnJyEjNjckJCIwV2IhKlFHNmwkISM3JCIwUCF5XWNJKWYnISM2NyQ3JCQiMFE8XSIzIzRsJCEjNyQiMGV4P21IUGcnISM2NyQkIjA+ckJzIWZdTyEjNyQiMGx2Tz9xQ2gnISM2NyQ3JCQiMG0oKmV2XC9sJCEjNyQiMCVmdzctPDttISM2NyQkIjA+ckJzIWZdTyEjNyQiMGx2Tz9xQ2gnISM2NyQ3JCQiMG0oKmV2XC9sJCEjNyQiMCVmdzctPDttISM2NyQkIjApXFlbbjBdTyEjNyQiMCJvJmUiSGlFbSEjNjckNyQkIjBNXCNcOCkqXE8hIzckIi9WWGoyaEdtISM1NyQkIjApXFlbbjBdTyEjNyQiMCJvJmUiSGlFbSEjNjckNyQkIjBNXCNcOCkqXE8hIzckIi9WWGoyaEdtISM1NyQkIjAtKEhCa19cTyEjNyQiME9OJkdSd1NtISM2NyQ3JCQiMERYNGQ6JlxPISM3JCIwbVVUSl41aychIzY3JCQiMC0oSEJrX1xPISM3JCIwT04mR1J3U20hIzY3JDckJCIwRFg0ZDomXE8hIzckIjBtVVRKXjVrJyEjNjckJCIwJVwqZnpPJVxPISM3JCIwZDlBMGxKaychIzY3JDckJCIwWj5jXCc+ZE8hIzckIjBYNTJwL1tXJyEjNjckJCIwaHpqaSxvbCQhIzckIjBFPFEwVldYJyEjNjckNyQkIjBoemppLG9sJCEjNyQiMEU8UTBWV1gnISM2NyQkIjBgO2IkR3VjTyEjNyQiMC4nKUhwKCplWCchIzY3JDckJCIwdV94J1tIY08hIzckIjBpMFhnJClvWSchIzY3JCQiMGA7YiRHdWNPISM3JCIwLicpSHAoKmVYJyEjNjckNyQkIjB1X3gnW0hjTyEjNyQiMGkwWGckKW9ZJyEjNjckJCIvLGFXODtjTyEjNiQiMG5ganctLVonISM2NyQ3JCQiMD5zRDkiemJPISM3JCIwKVI+YlRLemshIzY3JCQiLyxhVzg7Y08hIzYkIjBuYGp3LS1aJyEjNjckNyQkIjA+c0Q5InpiTyEjNyQiMClSPmJUS3prISM2NyQkIjAucjM4JWViTyEjNyQiMD5VWjclXCVbJyEjNjckNyQkIi80bDsvSGJPISM2JCIwTSMpZXFrPFwnISM2NyQkIjAucjM4JWViTyEjNyQiMD5VWjclXCVbJyEjNjckNyQkIi80bDsvSGJPISM2JCIwTSMpZXFrPFwnISM2NyQkIjB6JHpNNixiTyEjNyQiMGlFJ2Y+eClcJyEjNjckNyQkIjA2WShmRXphTyEjNyQiLzJkY18/L2whIzU3JCQiMHokek02LGJPISM3JCIwaUUnZj54KVwnISM2NyQ3JCQiMDZZKGZFemFPISM3JCIvMmRjXz8vbCEjNTckJCIwcDNdSVVXbCQhIzckIjAqb1xOay44bCEjNjckNyQkIjBQRDIleUhhTyEjNyQiMDFmcyFlaztsISM2NyQkIjBwM11JVVdsJCEjNyQiMCpvXE5rLjhsISM2NyQ3JCQiMFBEMiV5SGFPISM3JCIwMWZzIWVrO2whIzY3JCQiMDgncCdleFFsJCEjNyQiMFBIIkd4R0ZsISM2NyQ3JCQiMG5veiNmIVFsJCEjNyQiMFVaek4nM0hsISM2NyQkIjA4J3AnZXhRbCQhIzckIjBQSCJHeEdGbCEjNjckNyQkIjBub3ojZiFRbCQhIzckIjBVWnpOJzNIbCEjNjckJCIwelMiR3BKYE8hIzckIjAib00uZ19UbCEjNjckNyQkIjBoUUEqb0pgTyEjNyQiMHlOJzNwX1RsISM2NyQkIjB6UyJHcEpgTyEjNyQiMCJvTS5nX1RsISM2NyQ3JCQiMGhRQSpvSmBPISM3JCIweU4nM3BfVGwhIzY3JCQiL3MhZWs7TGwkISM2JCIwNidHMUtgVGwhIzY3JDckJCIwdEphTXc1bSQhIzckIjAwYlB6O0ZOJyEjNjckJCIwJVxrTjgpNG0kISM3JCIwUDUkWyc9XE4nISM2NyQ3JCQiMCVca044KTRtJCEjNyQiMFA1JFsnPVxOJyEjNjckJCIwTV89S200bSQhIzckIjAqUmZMOUZiaiEjNjckNyQkIjB4P1xGWi9tJCEjNyQiMHQpKiopPmZ0TychIzY3JCQiME1fPUttNG0kISM3JCIwKlJmTDlGYmohIzY3JDckJCIweD9cRlovbSQhIzckIjB0KSoqKT5mdE8nISM2NyQkIjB0OVJVWy5tJCEjNyQiLkBUQyRwcGohIio3JDckJCIwcmBvYjsqZk8hIzckIjA0KG9cKCp6emohIzY3JCQiMHQ5UlVbLm0kISM3JCIuQFRDJHBwaiEiKjckNyQkIjByYG9iOypmTyEjNyQiMDQob1woKnp6aiEjNjckJCIwYGdiS04oZk8hIzckIjAxO11tKjQlUSchIzY3JDckJCIwLjZVOSpRZk8hIzckIjBZdi5JU0FSJyEjNjckJCIwYGdiS04oZk8hIzckIjAxO11tKjQlUSchIzY3JDckJCIwLjZVOSpRZk8hIzckIjBYdi5JU0FSJyEjNjckJCIwJnokNCdwN2ZPISM3JCIwckh1ITRcKVInISM2NyQ3JCQiMG1fIyoqXCcpZU8hIzckIjAiUTFeM28vayEjNjckJCIwJnokNCdwN2ZPISM3JCIwckh1ITRcKVInISM2NyQ3JCQiMG1fIyoqXCcpZU8hIzckIjAiUTFeM28vayEjNjckJCIwW0lFRUImZU8hIzckIjB5SHY9bkdUJyEjNjckNyQkIjA8VVUzVyRlTyEjNyQiMDxfPFNAclQnISM2NyQkIjBbSUVFQiZlTyEjNyQiMHlIdj1uR1QnISM2NyQ3JCQiMDxVVTNXJGVPISM3JCIwPV88U0ByVCchIzY3JCQiMHdiLDxDemwkISM3JCIwKSpcIypwR3NVJyEjNjckNyQkIjAmWz9vaiN5bCQhIzckIjBhU0MmPmNIayEjNjckJCIwd2IsPEN6bCQhIzckIjApKlwjKnBHc1UnISM2NyQ3JCQiMCZbP29qI3lsJCEjNyQiMGFTQyY+Y0hrISM2NyQkIjBgQTppSHRsJCEjNyQiMEppOGt2OlcnISM2NyQ3JCQiMG8vUyI9SmRPISM3JCIvKkdKXS0/VychIzU3JCQiMGBBOmlIdGwkISM3JCIwSmk4a3Y6VychIzY3JDckJCIwby9TIj1KZE8hIzckIi8qR0pdLT9XJyEjNTckJCIwWj5jXCc+ZE8hIzckIjBYNTJwL1tXJyEjNjckNyQkIi5XXz5jXG0kISM1JCIwQ10rV1JdRSchIzY3JCQiLzcmemJIW20kISM2JCIwJj1cJHpNeUUnISM2NyQ3JCQiLzcmemJIW20kISM2JCIwJj1cJHpNeUUnISM2NyQkIjBbNGxRM1ttJCEjNyQiMDBaXXQzJG9pISM2NyQ3JCQiMC16QitwVW0kISM3JCIwQCE9V2BGIUcnISM2NyQkIjBbNGxRM1ttJCEjNyQiMDBaXXQzJG9pISM2NyQ3JCQiMC56QitwVW0kISM3JCIwQCE9V2BGIUcnISM2NyQkIi9Aeil5YVRtJCEjNiQiMF4hPjpdJUdHJyEjNjckNyQkIi8tVy9AcmpPISM2JCIwZG9bKmVyI0gnISM2NyQkIi9Aeil5YVRtJCEjNiQiMF4hPjpdJUdHJyEjNjckNyQkIi8tVy9AcmpPISM2JCIwZG9bKmVyI0gnISM2NyQkIjBHOHBgMU5tJCEjNyQiMEVoVDprdEgnISM2NyQ3JCQiMGQ2RiMpZUptJCEjNyQiMCRwYlhrOjBqISM2NyQkIjBHOHBgMU5tJCEjNyQiMEVoVDprdEgnISM2NyQ3JCQiMGQ2RiMpZUptJCEjNyQiMCRwYlhrOjBqISM2NyQkIjBrc2JiakdtJCEjNyQiMFIxTVJtPUonISM2NyQ3JCQiMHA2YTY0RW0kISM3JCIwSFhpKnBmPGohIzY3JCQiMGtzYmJqR20kISM3JCIwUjFNUm09SichIzY3JDckJCIwcDZhNjRFbSQhIzckIjBIWGkqcGY8aiEjNjckJCIvOEZtZEFpTyEjNiQiMHRHWSk+TkVqISM2NyQ3JCQiLzBpUUgxaU8hIzYkIjBsTHBhUCtMJyEjNjckJCIvOEZtZEFpTyEjNiQiMHRHWSk+TkVqISM2NyQ3JCQiLzBpUUgxaU8hIzYkIjBsTHBhUCtMJyEjNjckJCIwMUVTNCRmaE8hIzckIjBGZSNvNiMzTSchIzY3JDckJCIwREFNRD86bSQhIzckIjAsQXc0eUNNJyEjNjckJCIwMUVTNCRmaE8hIzckIjBGZSNvNiMzTSchIzY3JDckJCIwREFNRD86bSQhIzckIjAsQXc0eUNNJyEjNjckJCIwdUphTXc1bSQhIzckIjAwYlB6O0ZOJyEjNjckNyQkIjBFY10vTylvTyEjNyQiMEBAT2paOj0nISM2NyQkIjAiXDQ/VUdvTyEjNyQiMHBoJCpbIj4kPichIzY3JDckJCIwIlw0P1VHb08hIzckIjBwaCQqWyI+JD4nISM2NyQkIi9bUiYpcD1vTyEjNiQiMDFneG1zXz4nISM2NyQ3JCQiMCZvbSlmKXBuTyEjNyQiMDBdKy9LYz8nISM2NyQkIi9bUiYpcD1vTyEjNiQiMDFneG1zXz4nISM2NyQ3JCQiMCZvbSlmKXBuTyEjNyQiMDBdKy9LYz8nISM2NyQkIjAxa2VSKlxuTyEjNyQiMEgzNSV6Iio0aSEjNjckNyQkIjAnZjNccDZuTyEjNyQiMFRRMmZzIT1pISM2NyQkIjAxa2VSKlxuTyEjNyQiMEgzNSV6Iio0aSEjNjckNyQkIjAnZjNccDZuTyEjNyQiMFRRMmZzIT1pISM2NyQkIjBWMiY0eCJvbSQhIzckIjBOOWdHV1hBJyEjNjckNyQkIjBSUktBUmxtJCEjNyQiMHhFOTk4MEInISM2NyQkIjBWMiY0eCJvbSQhIzckIjBOOWdHV1hBJyEjNjckNyQkIjBSUktBUmxtJCEjNyQiMHhFOTk4MEInISM2NyQkIjBreTckPTltTyEjNyQiMGFSditfIlJpISM2NyQ3JCQiMFlHQlBsZm0kISM3JCIwODpAcGBIQychIzY3JCQiMGt5NyQ9OW1PISM3JCIwYVJ2K18iUmkhIzY3JDckJCIwWUdCUGxmbSQhIzckIjA4OkBwYEhDJyEjNjckJCIwVSMpem5yYW0kISM3JCIwWlhCUFRQRCchIzY3JDckJCIwQWZCTiZSbE8hIzckIjBcLkdDJVJiaSEjNjckJCIwVSMpem5yYW0kISM3JCIwWlhCUFRQRCchIzY3JDckJCIwQWZCTiZSbE8hIzckIjBcLkdDJVJiaSEjNjckJCIuV18+Y1xtJCEjNSQiMENdK1dSXUUnISM2NyQ3JCQiMGBvWyplcnNPISM3JCIwJipvJjRULy1oISM2NyQkIjBHNkwwOERuJCEjNyQiMDtWWGoyaDUnISM2NyQ3JCQiMEc2TDA4RG4kISM3JCIwO1ZYajJoNSchIzY3JCQiMHIwODF2Q24kISM3JCIwNjRkJil6bzUnISM2NyQ3JCQiMCI0QG9kKj1uJCEjNyQiMGBKXz1bJj1oISM2NyQkIjByMDgxdkNuJCEjNyQiMDY0ZCYpem81JyEjNjckNyQkIjAiNEBvZCo9biQhIzckIjBgSl89WyY9aCEjNjckJCIwNjZKOVY8biQhIzckIjAxdG1Fbjs3JyEjNjckNyQkIjBlJj1vR0dyTyEjNyQiMCopPmZ0KSk0OCchIzY3JCQiMDY2SjlWPG4kISM3JCIwMXRtRW47NychIzY3JDckJCIwZSY9b0dHck8hIzckIjAqKT5mdCkpNDgnISM2NyQkIjA8OEApeSxyTyEjNyQiMC5lO0xMazgnISM2NyQ3JCQiMDd1akh1MW4kISM3JCIwRDNtR0hNOSchIzY3JCQiMDw4QCl5LHJPISM3JCIwLmU7TExrOCchIzY3JDckJCIwN3VqSHUxbiQhIzckIjBEM21HSE05JyEjNjckJCIwJD4peTsqSHFPISM3JCIwUF9aU3k2OichIzY3JDckJCIwTkN4KipwK24kISM3JCIwaCdIUClwZTonISM2NyQkIjAkPil5OypIcU8hIzckIjBQX1pTeTY6JyEjNjckNyQkIjBOQ3gqKnArbiQhIzckIjBoJ0hQKXBlOichIzY3JCQiMDJnXCpvZXBPISM3JCIwKCkqNENHIWY7JyEjNjckNyQkIjBsLGUiKnAlcE8hIzckIjAoXCl6UTUkb2ghIzY3JCQiMDJnXCpvZXBPISM3JCIwKCkqNENHIWY7JyEjNjckNyQkIjBsLGUiKnAlcE8hIzckIjAoXCl6UTUkb2ghIzY3JCQiMF9NRyc0KSlvTyEjNyQiMHohKj4icGchPSchIzY3JDckJCIwLVA/K3Upb08hIzckIjBMdCdRNHYhPSchIzY3JCQiMF9NRyc0KSlvTyEjNyQiMHohKj4icGchPSchIzY3JDckJCIwLVA/K3Upb08hIzckIjBMdCdRNHYhPSchIzY3JCQiMEZjXS9PKW9PISM3JCIwQEBPalo6PSchIzY3JDckJCIweiFvV2Rmd08hIzckIjBmLGs+RGotJyEjNjckJCIwXyUpeWFFam4kISM3JCIuOC9MazkuJyEiKjckNyQkIjBfJSl5YUVqbiQhIzckIi44L0xrOS4nISIqNyQkIjA2Zy47dGluJCEjNyQiME9HOW8pXEtnISM2NyQ3JCQiLz1MXiF6Y24kISM2JCIwTyw2KVshUi8nISM2NyQkIjA2Zy47dGluJCEjNyQiME9HOW8pXEtnISM2NyQ3JCQiLz1MXiF6Y24kISM2JCIwTyw2KVshUi8nISM2NyQkIjAzUCxaKVx2TyEjNyQiMCU9JClRS1VaZyEjNjckNyQkIjBeIjNeai52TyEjNyQiMHMqeUphTWNnISM2NyQkIjAzUCxaKVx2TyEjNyQiMCU9JClRS1VaZyEjNjckNyQkIjBeIjNeai52TyEjNyQiMHMqeUphTWNnISM2NyQkIjBMVTlASlpuJCEjNyQiMF8qUm5SS2lnISM2NyQ3JCQiMHkpMydRKVJ1TyEjNyQiMDN5QylmeW9nISM2NyQkIjBMVTlASlpuJCEjNyQiMF8qUm5SS2lnISM2NyQ3JCQiMHkpMydRKVJ1TyEjNyQiMDN5QylmeW9nISM2NyQkIjBeJnpmNyhSbiQhIzckIjBgcmlFLHMyJyEjNjckNyQkIjA7djU0bFBuJCEjNyQiMFdtSmBFNzMnISM2NyQkIjBeJnpmNyhSbiQhIzckIjBgcmlFLHMyJyEjNjckNyQkIjA7djU0bFBuJCEjNyQiMFdtSmBFNzMnISM2NyQkIjBROytcPUtuJCEjNyQiME1Lb2BiPzQnISM2NyQ3JCQiMCg+RTBrOHRPISM3JCIvWyZRM25PNCchIzU3JCQiMFE7K1w9S24kISM3JCIwTUtvYGI/NCchIzY3JDckJCIwKD5FMGs4dE8hIzckIjAiWyZRM25PNCchIzY3JCQiMGBvWyplcnNPISM3JCIwJipvJjRULy1oISM2NyQ3JCQiMDEkXCVmdi9vJCEjNyQiME4xSXYzVSZmISM2NyQkIjAielRvPEwhbyQhIzckIjAlR0dFNSNvJmYhIzY3JDckJCIwInpUbzxMIW8kISM3JCIwJUdHRTUjbyZmISM2NyQkIjBLJiopKlssLm8kISM3JCIwM15VR3p0JmYhIzY3JDckJCIwZUo1Nl4nek8hIzckIi83KHBkaCNwZiEjNTckJCIwSyYqKSpbLC5vJCEjNyQiMDNeVUd6dCZmISM2NyQ3JCQiMGVKNTZeJ3pPISM3JCIvNyhwZGgjcGYhIzU3JCQiMDZ3Ond5JXpPISM3JCIwYiZbdHlYc2YhIzY3JDckJCIwRStsc3YqeU8hIzckIjBjZnc3LTwpZiEjNjckJCIwNnc6d3klek8hIzckIjBiJlt0eVhzZiEjNjckNyQkIjBFK2xzdip5TyEjNyQiMGNmdzctPClmISM2NyQkIjBAMWhRayd5TyEjNyQiMClHcnonNHYpZiEjNjckNyQkIjBrKFFQYkl5TyEjNyQiMCN6TXlFOSUqZiEjNjckJCIwQDFoUWsneU8hIzckIjApR3J6JzR2KWYhIzY3JDckJCIwayhRUGJJeU8hIzckIjAjek15RTklKmYhIzY3JCQiMGk6RkBleW4kISM3JCIweHBqPU5EKychIzY3JDckJCIvelx3L2t4TyEjNiQiMEdPIUhLZTFnISM2NyQkIjBpOkZAZXluJCEjNyQiMHhwaj1ORCsnISM2NyQ3JCQiL3pcdy9reE8hIzYkIjBHTyFIS2UxZyEjNjckJCIwKik9Iio0Z3FuJCEjNyQiMG0ob1xbYDxnISM2NyQ3JCQiLmlDWiEpcG4kISM1JCIwa0MoelAtPmchIzY3JCQiMCopPSIqNGdxbiQhIzckIjBtKG9cW2A8ZyEjNjckNyQkIi5pQ1ohKXBuJCEjNSQiMGtDKHpQLT5nISM2NyQkIjB6IW9XZGZ3TyEjNyQiMGYsaz5Eai0nISM2NyQ3JCQiMEwwVldiVm8kISM3JCIwQD9mXUZiKWUhIzY3JCQiMFh6ZGpKUW8kISM3JCIwL1RHRj1ZKmUhIzY3JDckJCIwWHpkakpRbyQhIzckIjAvVEdGPVkqZSEjNjckJCIwV09ANzpQbyQhIzckIjBDIypbVnJtKmUhIzY3JDckJCIwW1VeQj9KbyQhIzckIi8lSE4jKWVxIWYhIzU3JCQiMFdPQDc6UG8kISM3JCIwQyMqW1ZybSplISM2NyQ3JCQiMFtVXkI/Sm8kISM3JCIvJUhOIyllcSFmISM1NyQkIjAyKm8tdiVHbyQhIzckIjAtZGAnUio9ImYhIzY3JDckJCIwd1l6YzlDbyQhIzckIjB3PFVQKlw+ZiEjNjckJCIwMipvLXYlR28kISM3JCIwLWRgJ1IqPSJmISM2NyQ3JCQiMHdZemM5Q28kISM3JCIwdzxVUCpcPmYhIzY3JCQiMERHczoqKT5vJCEjNyQiMGpLI2ZuM0ZmISM2NyQ3JCQiMFdhRmI5PG8kISM3JCIwNzFcIypSPiRmISM2NyQkIjBER3M6Kik+byQhIzckIjBqSyNmbjNGZiEjNjckNyQkIjBXYUZiOTxvJCEjNyQiMDcxXCMqUj4kZiEjNjckJCIwYHdqIipSNm8kISM3JCIwdD4nZi5EVWYhIzY3JDckJCIweSgpKTMsLSJvJCEjNyQiMFslZnYvUVdmISM2NyQkIjBgd2oiKlI2byQhIzckIjB0PidmLkRVZiEjNjckNyQkIjB5KCkpMywtIm8kISM3JCIwWyVmdi9RV2YhIzY3JCQiMDEkXCVmdi9vJCEjNyQiME4xSXYzVSZmISM2NyQ3JCQiMGY8VEhOIylvJCEjNyQiMCZHbzYxNj9lISM2NyQkIjBvdmpBI1wobyQhIzckIjBDKlI+YlRLZSEjNjckNyQkIjBvdmpBI1wobyQhIzckIjBDKlI+YlRLZSEjNjckJCIwIzMmPj08dG8kISM3JCIwPlA7U2ZgJGUhIzY3JDckJCIwRnhcSVpubyQhIzckIi93M3FnJlslZSEjNTckJCIwIzMmPj08dG8kISM3JCIwPlA7U2ZgJGUhIzY3JDckJCIwRnhcSVpubyQhIzckIi93M3FnJlslZSEjNTckJCIwVnVGWypSJ28kISM3JCIwKClILl5VMiZlISM2NyQ3JCQiLyVcXGszZ28kISM2JCIwJ2Z4P21IZGUhIzY3JCQiMFZ1RlsqUidvJCEjNyQiMCgpSC5eVTImZSEjNjckNyQkIi8lXFxrM2dvJCEjNiQiMCdmeD9tSGRlISM2NyQkIjBwWUc5I1wmbyQhIzckIjApSGYtQzRtZSEjNjckNyQkIjBOOiRcaEYmbyQhIzckIjBLazk8UChwZSEjNjckJCIwcFlHOSNcJm8kISM3JCIwKUhmLUM0bWUhIzY3JDckJCIwTjokXGhGJm8kISM3JCIwS2s5PFAocGUhIzY3JCQiMHY8LSdcZiVvJCEjNyQiMCcqb2ZzNDkpZSEjNjckNyQkIjBHaSdIKFxYbyQhIzckIjBvX0BzeEApZSEjNjckJCIwdjwtJ1xmJW8kISM3JCIwJypvZnM0OSllISM2NyQ3JCQiMEdpJ0goXFhvJCEjNyQiMG9fQHN4QCllISM2NyQkIjBMMFZXYlZvJCEjNyQiMEA/Zl1GYillISM2NyQ3JCQiMCcpSFI5OkBwJCEjNyQiMHl6WlM5eXYmISM2NyQkIjAiR1hXI0g4cCQhIzckIjBWZGZ3Ny14JiEjNjckNyQkIjAiR1hXI0g4cCQhIzckIjBWZGZ3Ny14JiEjNjckJCIvKFtjbks2cCQhIzYkIjA8aUgrakx4JiEjNjckNyQkIjBWMlRqWjBwJCEjNyQiMHpYbUpgRXkmISM2NyQkIi8oW2NuSzZwJCEjNiQiMDxpSCtqTHgmISM2NyQ3JCQiMFYyVGpaMHAkISM3JCIwelhtSmBFeSYhIzY3JCQiME1zb3VlLHAkISM3JCIwTlkiNGsjKil5JiEjNjckNyQkIjBASHIpR3gqbyQhIzckIjA6TXQnUTQmeiYhIzY3JCQiME1zb3VlLHAkISM3JCIwTlkiNGsjKil5JiEjNjckNyQkIjBASHIpR3gqbyQhIzckIjA6TXQnUTQmeiYhIzY3JCQiMCNIdmprPipvJCEjNyQiMDAmNHVDWC9lISM2NyQ3JCQiMDdYNipbKypvJCEjNyQiMF5BIT1XYDJlISM2NyQkIjAjSHZqaz4qbyQhIzckIjAwJjR1Q1gvZSEjNjckNyQkIjA3WDYqWysqbyQhIzckIjBeQSE9V2AyZSEjNjckJCIwUjgpeWJDKW8kISM3JCIwV0o4Kj4lKj5lISM2NyQ3JCQiMD5DQGFWIylvJCEjNyQiMCkzcm9cKCo+ZSEjNjckJCIwUjgpeWJDKW8kISM3JCIwV0o4Kj4lKj5lISM2NyQ3JCQiMD5DQGFWIylvJCEjNyQiMCkzcm9cKCo+ZSEjNjckJCIwZjxUSE4jKW8kISM3JCIwJkdvNjE2P2UhIzY3JDckJCIwN1VQKlwqZnAkISM3JCIwVFRPeSRcKXAmISM2NyQkIi8qZVp3Z2BwJCEjNiQiMGo6RCw1ITNkISM2NyQ3JCQiLyplWndnYHAkISM2JCIwajpELDUhM2QhIzY3JCQiLTJlPT4mcCQhIiokIjAobz1HX2U1ZCEjNjckNyQkIjApXE1LKVFYcCQhIzckIjAqUj9qMFg/ZCEjNjckJCItMmU9PiZwJCEiKiQiMChvPUdfZTVkISM2NyQ3JCQiMClcTUspUVhwJCEjNyQiMCpSP2owWD9kISM2NyQkIjBvJmZSVjolcCQhIzckIjBsZztgX2pzJiEjNjckNyQkIjBYaCNcV3MkcCQhIzckIjBOIypRNiIqR3QmISM2NyQkIjBvJmZSVjolcCQhIzckIjBsZztgX2pzJiEjNjckNyQkIjBYaCNcV3MkcCQhIzckIjBOIypRNiIqR3QmISM2NyQkIjBrOSQqKipISnAkISM3JCIwSyYqKXp2MlVkISM2NyQ3JCQiMCRRZiJcPEhwJCEjNyQiMHIhZWs7TFhkISM2NyQkIjBrOSQqKipISnAkISM3JCIwSyYqKXp2MlVkISM2NyQ3JCQiMCRRZiJcPEhwJCEjNyQiMHIhZWs7TFhkISM2NyQkIjBvWF9hPUBwJCEjNyQiMFo5IjQ4d2RkISM2NyQ3JCQiMFl3eCR5NiNwJCEjNyQiMDJwX0BzeHYmISM2NyQkIjBvWF9hPUBwJCEjNyQiMFo5IjQ4d2RkISM2NyQ3JCQiMFl3eCR5NiNwJCEjNyQiMDJwX0BzeHYmISM2NyQkIjAnKUhSOTpAcCQhIzckIjB5elpTOXl2JiEjNjckNyQkIjBSYU4lWygpKnAkISM3JCIwYlFXOi0/ayYhIzY3JCQiMCZRKTRzMicqcCQhIzckIjAkUTJmcyFlayYhIzY3JDckJCIwJlEpNHMyJypwJCEjNyQiMCRRMmZzIWVrJiEjNjckJCIwWiZSTjxgKnAkISM3JCIwUiR5PXUhcGsmISM2NyQ3JCQiMCo0Wmw3dSlwJCEjNyQiMD5pKDR5Q2VjISM2NyQkIjBaJlJOPGAqcCQhIzckIjBSJHk9dSFwayYhIzY3JDckJCIwKjRabDd1KXAkISM3JCIwPmkoNHlDZWMhIzY3JCQiMC5lYHJAJSlwJCEjNyQiMDs2XT4ySG0mISM2NyQ3JCQiMCdcQ2FKKXlwJCEjNyQiMGJdL08pb3FjISM2NyQkIjAuZWByQCUpcCQhIzckIjA7Nl0+MkhtJiEjNjckNyQkIjAnXENhSil5cCQhIzckIjBiXS9PKW9xYyEjNjckJCIwRDYnSG5LKHAkISM3JCIwUThYd2UpeWMhIzY3JDckJCIwTSgpcENMcXAkISM3JCIwIipRNiIqR0pvJiEjNjckJCIwRDYnSG5LKHAkISM3JCIwUThYd2UpeWMhIzY3JDckJCIwTSgpcENMcXAkISM3JCIwIipRNiIqR0pvJiEjNjckJCIwKUgnPVVZaXAkISM3JCIvT3NwS3clcCYhIzU3JDckJCIwMi0jKVIiPidwJCEjNyQiMEZGPVlwYnAmISM2NyQkIjApSCc9VVlpcCQhIzckIi9Pc3BLdyVwJiEjNTckNyQkIjAyLSMpUiI+J3AkISM3JCIwRkY9WXBicCYhIzY3JCQiMDdVUCpcKmZwJCEjNyQiMFRUT3kkXClwJiEjNjckNyQkIjBsbUxwYVBxJCEjNyQiMFpwMy43IyllJiEjNjckJCIvXERPJ3lKcSQhIzYkIjBSP2owWGdmJiEjNjckNyQkIi9cRE8neUpxJCEjNiQiMFI/ajBYZ2YmISM2NyQkIjB1dkJuL0lxJCEjNyQiMFRPQicqXCUpZiYhIzY3JDckJCIwJW8lPjBzQXEkISM3JCIwdjNxZyZbM2MhIzY3JCQiMHV2Qm4vSXEkISM3JCIwVE9CJypcJSlmJiEjNjckNyQkIjAlbyU+MHNBcSQhIzckIjB2M3FnJlszYyEjNjckJCIwKDQoKVwmRz1xJCEjNyQiMDxGSHBoWWgmISM2NyQ3JCQiMExmKW9YUCxQISM3JCIwNihwZGgjNGkmISM2NyQkIjAoNCgpXCZHPXEkISM3JCIwPEZIcGhZaCYhIzY3JDckJCIwTGYpb1hQLFAhIzckIjA2KHBkaCM0aSYhIzY3JCQiMDZmMEhwMXEkISM3JCIwejBETj4zaiYhIzY3JDckJCIwQT9bLSdbK1AhIzckIjBaJlEzbk9MYyEjNjckJCIwNmYwSHAxcSQhIzckIjB6MEROPjNqJiEjNjckNyQkIjBBP1stJ1srUCEjNyQiMFomUTNuT0xjISM2NyQkIjBSYU4lWygpKnAkISM3JCIwYlFXOi0/ayYhIzY3JDckJCIwIyp5SmFNd3EkISM3JCIwIz44P3YqcGAmISM2NyQkIjBNaDE2PXBxJCEjNyQiMCZwY2BHR1liISM2NyQ3JCQiME1oMTY9cHEkISM3JCIwJnBjYEdHWWIhIzY3JCQiMDo8TXgobzFQISM3JCIwaScqXGk9JFxiISM2NyQ3JCQiMCJmXmR3J2ZxJCEjNyQiMEpiVVNCKGViISM2NyQkIjA6PE14KG8xUCEjNyQiMGknKlxpPSRcYiEjNjckNyQkIjAiZl5kdydmcSQhIzckIjBKYlVTQihlYiEjNjckJCIwPTVPNFBhcSQhIzckIjBGcCo+JXBkYyYhIzY3JDckJCIwKlEieTtGXXEkISM3JCIwblZcJlI7cmIhIzY3JCQiMD01TzRQYXEkISM3JCIwRnAqPiVwZGMmISM2NyQ3JCQiMCpRInk7Rl1xJCEjNyQiMG5WXCZSO3JiISM2NyQkIjBqckBZMFVxJCEjNyQiMERxczhmQGUmISM2NyQ3JCQiMFFVa1gnNC9QISM3JCIwLktjXS9PZSYhIzY3JCQiMGpyQFkwVXEkISM3JCIwRHFzOGZAZSYhIzY3JDckJCIwUVVrWCc0L1AhIzckIjAuS2NdL09lJiEjNjckJCIwbG1McGFQcSQhIzckIjBacDMuNyMpZSYhIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwYW9GXlcjKVsmISM2NyQkIjAzNVROVjNyJCEjNyQiL04iM2w/bFwmISM1NyQ3JCQiMDQ1VE5WM3IkISM3JCIvTiIzbD9sXCYhIzU3JCQiLygzUiZIaDVQISM2JCIwWTg7MjYlKlwmISM2NyQ3JCQiMHhYI2VaJSk0UCEjNyQiMCc9XSw3JyozYiEjNjckJCIvKDNSJkhoNVAhIzYkIjBZODsyNiUqXCYhIzY3JDckJCIweFgjZVolKTRQISM3JCIwJz1dLDcnKjNiISM2NyQkIjAjPmlPdkY0UCEjNyQiMCJcQHROODtiISM2NyQ3JCQiLy00NnImKTNQISM2JCIwQiE+XzxTQGIhIzY3JCQiMCM+aU92RjRQISM3JCIwIlxAdE44O2IhIzY3JDckJCIvLTQ2ciYpM1AhIzYkIjBCIT5fPFNAYiEjNjckJCIuJ1wqeWp6cSQhIzUkIjA3JVwhZid5S2IhIzY3JDckJCIvKlF1PiEpeXEkISM2JCIwZnlHSVVRYCYhIzY3JCQiLidcKnlqenEkISM1JCIwNyVcIWYneUtiISM2NyQ3JCQiLypRdT4hKXlxJCEjNiQiMGZ5R0lVUWAmISM2NyQkIjAjKnlKYU13cSQhIzckIjAjPjg/dipwYCYhIzY3JDckJCIwWC5HQyVSOlAhIzckIjBqTitwUD1XJiEjNjckJCIwRSd5WlUoXHIkISM3JCIwMWchWyVlblcmISM2NyQ3JCQiMEUneVpVKFxyJCEjNyQiMDFnIVslZW5XJiEjNjckJCIwWVUhNCg+W3IkISM3JCIwbGtGbSsnW2EhIzY3JDckJCIwIio+NWZBUnIkISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwWVUhNCg+W3IkISM3JCIwbGtGbSsnW2EhIzY3JDckJCIwIio+NWZBUnIkISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwQmpdOShROFAhIzckIjB5TTBtTWNZJiEjNjckNyQkIjAzL1gsJClHciQhIzckIjB5TyVcJlI7WiYhIzY3JCQiMEJqXTkoUThQISM3JCIweU0wbU1jWSYhIzY3JDckJCIwMy9YLCQpR3IkISM3JCIweU8lXCZSO1omISM2NyQkIjBoZExXej5yJCEjNyQiMGlGJ1EqKWUjWyYhIzY3JDckJCIweiZRdV8mPXIkISM3JCIwOUQsNSEzJVsmISM2NyQkIjBoZExXej5yJCEjNyQiMGlGJ1EqKWUjWyYhIzY3JDckJCIweiZRdV8mPXIkISM3JCIwOUQsNSEzJVsmISM2NyQkIjA9IipIUjk6ciQhIzckIjBhb0ZeVyMpWyYhIzY3JDckJCIwcjpFNHUjPlAhIzckIjAkb2dsUG0oUiYhIzY3JCQiMFkqZW5NQT1QISM3JCIwKVwqZnpPJTRhISM2NyQ3JCQiMFkqZW5NQT1QISM3JCIwKVwqZnpPJTRhISM2NyQkIjA2JjQ4RCJ5ciQhIzckIjA+MStHQlRUJiEjNjckNyQkIjBEdmlYRXJyJCEjNyQiME0kb1l0KD1VJiEjNjckJCIwNiY0OEQieXIkISM3JCIwPjErR0JUVCYhIzY3JDckJCIwRHZpWEVyciQhIzckIjBNJG9ZdCg9VSYhIzY3JCQiMHUhMyVHJ0g7UCEjNyQiMEJqY2FEOVYmISM2NyQ3JCQiMCN5N1pELztQISM3JCIvPFAoKnlKTWEhIzU3JCQiMHUhMyVHJ0g7UCEjNyQiMEJqY2FEOVYmISM2NyQ3JCQiMCN5N1pELztQISM3JCIvPFAoKnlKTWEhIzU3JCQiMFguR0MlUjpQISM3JCIwak4rcFA9VyYhIzY3JDckJCIwKXpVVVI6QlAhIzckIjBlaFg4UWNOJiEjNjckJCIwYSlIS014QVAhIzckIjBhVEtmdSdmYCEjNjckNyQkIjBhKUhLTXhBUCEjNyQiMGFUS2Z1J2ZgISM2NyQkIi9eTEpGaEFQISM2JCIwQEIvJyo0OU8mISM2NyQ3JCQiMGxLd2Q3O3MkISM3JCIvKkhSOTpAUCYhIzU3JCQiL15MSkZoQVAhIzYkIjBAQi8nKjQ5TyYhIzY3JDckJCIwbEt3ZDc7cyQhIzckIi8qSFI5OkBQJiEjNTckJCIwMSp6JXlwNHMkISM3JCIwKT5vUiY9InpgISM2NyQ3JCQiLzYrMGpZP1AhIzYkIjBFPVlwYlhRJiEjNjckJCIwMSp6JXlwNHMkISM3JCIwKT5vUiY9InpgISM2NyQ3JCQiLzYrMGpZP1AhIzYkIjBFPVlwYlhRJiEjNjckJCIwO290UmYkPlAhIzckIjBhWCg+RnMnUiYhIzY3JDckJCIwKGVXIkhNJD5QISM3JCIwaTFgQycqcFImISM2NyQkIjA7b3RSZiQ+UCEjNyQiMGFYKD5GcydSJiEjNjckNyQkIjAoZVciSE0kPlAhIzckIjBpMWBDJypwUiYhIzY3JCQiMHI6RTR1Iz5QISM3JCIwJG9nbFBtKFImISM2NyQ3JCQiMENTQXpMcXMkISM3JCIwJj4uIlxaY0omISM2NyQkIjBPPCl5M1BFUCEjNyQiMFl3NiVITkFgISM2NyQ3JCQiME88KXkzUEVQISM3JCIwWXc2JUhOQWAhIzY3JCQiMEYwJyo+cmdzJCEjNyQiMFYkKXlXUmFLJiEjNjckNyQkIjBCIXkqKlw6RFAhIzckIjAjWyc9XCR6TWAhIzY3JCQiMEYwJyo+cmdzJCEjNyQiMFYkKXlXUmFLJiEjNjckNyQkIjBCIXkqKlw6RFAhIzckIjAjWyc9XCR6TWAhIzY3JCQiMGFwbCZwSkNQISM3JCIwOCQpUipbXVZgISM2NyQ3JCQiMG1hQjBiUnMkISM3JCIwPWBEL01zTSYhIzY3JCQiMGFwbCZwSkNQISM3JCIwOCQpUipbXVZgISM2NyQ3JCQiMG1hQjBiUnMkISM3JCIwPWBEL01zTSYhIzY3JCQiMCl6VVVSOkJQISM3JCIwZWhYOFFjTiYhIzY3JDckJCIwXl8/azg0dCQhIzckIjAiUSUzbSx3RiYhIzY3JCQiMDFHSz1VLHQkISM3JCIwUTYiKkdKXUcmISM2NyQ3JCQiMDFHSz1VLHQkISM3JCIwUTYiKkdKXUcmISM2NyQkIjAydStdbihIUCEjNyQiMHYxekwxKClHJiEjNjckNyQkIjBmQy0zbSlHUCEjNyQiMHUqelI9WihIJiEjNjckJCIwMnUrXW4oSFAhIzckIjB2MXpMMSgpRyYhIzY3JDckJCIwZkMtM20pR1AhIzckIjB1KnpSPVooSCYhIzY3JCQiMHBTbmwmKXlzJCEjNyQiMG4nPUc0PTJgISM2NyQ3JCQiMCo9cVF1Z0ZQISM3JCIvIilbIVI3KjRgISM1NyQkIjBwU25sJil5cyQhIzckIjBuJz1HND0yYCEjNjckNyQkIjAqPXFRdWdGUCEjNyQiLyIpWyFSNyo0YCEjNTckJCIwQ1NBekxxcyQhIzckIjAmPi4iXFpjSiYhIzY3JDckJCIweGs9XCR6TVAhIzckIjBsMV5BODlDJiEjNjckJCIwVy4qNGQ1TVAhIzckIi9qL1AnNHhDJiEjNTckNyQkIjBXLio0ZDVNUCEjNyQiL2ovUCc0eEMmISM1NyQkIi9QPUxgdUxQISM2JCIvKVJyXXE1RCYhIzU3JDckJCIwS28jUk13S1AhIzckIjBtTXg9XSxFJiEjNjckJCIvUD1MYHVMUCEjNiQiLylScl1xNUQmISM1NyQ3JCQiMEtvI1JNd0tQISM3JCIwbU14PV0sRSYhIzY3JCQiMEg/J2ZkckpQISM3JCIwMGFzeT0rRiYhIzY3JDckJCIwJFtGIVFTOXQkISM3JCIwLUIlUTJmc18hIzY3JCQiMEg/J2ZkckpQISM3JCIwMGFzeT0rRiYhIzY3JDckJCIwJFtGIVFTOXQkISM3JCIwLUIlUTJmc18hIzY3JCQiMF5fP2s4NHQkISM3JCIwIlElM20sd0YmISM2NyQ3JCQiMC94O010J1FQISM3JCIwNGtFNCUqcD8mISM2NyQkIjAjNCc9biNHUVAhIzckIjBAIilcKXpRNV8hIzY3JDckJCIwIzQnPW4jR1FQISM3JCIwQCIpXCl6UTVfISM2NyQkIjAqKnBRemchUVAhIzckIjA2JikpKjNfQkAmISM2NyQ3JCQiMCozPDJ1J290JCEjNyQiMGVwY2BHR0EmISM2NyQkIjAqKnBRemchUVAhIzckIjA2JikpKjNfQkAmISM2NyQ3JCQiMCozPDJ1J290JCEjNyQiMGVwY2BHR0EmISM2NyQkIjBbJyo9RWVldCQhIzckIjBRc0YmXCY9QiYhIzY3JDckJCIwdVFPT3RhdCQhIzckIjAlek4nM3BfQiYhIzY3JCQiMFsnKj1FZWV0JCEjNyQiMFFzRiZcJj1CJiEjNjckNyQkIjB1UU9PdGF0JCEjNyQiMCV6TiczcF9CJiEjNjckJCIweGs9XCR6TVAhIzckIjBsMV5BODlDJiEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjA8Ij4zQ0V1XiEjNjckJCIwWk9nYiw3dSQhIzckIjBcL08pb10mPSYhIzY3JDckJCIwWk9nYiw3dSQhIzckIjBcL08pb10mPSYhIzY3JCQiME5daFx6LnUkISM3JCIwLklEdHdDPiYhIzY3JDckJCIvYi9pKkcoUlAhIzYkIjAmR0hNdSV6PiYhIzY3JCQiME5daFx6LnUkISM3JCIwLklEdHdDPiYhIzY3JDckJCIvYi9pKkcoUlAhIzYkIjAmR0hNdSV6PiYhIzY3JCQiMC94O010J1FQISM3JCIwNGtFNCUqcD8mISM2NyQ3JCQiMGQsOC9Ma3UkISM3JCIvZVk7PjpWXiEjNTckJCIwJDNQa0x6WFAhIzckIjBUUjpCJj1bXiEjNjckNyQkIjAkM1BrTHpYUCEjNyQiMFRSOkImPVteISM2NyQkIjAmMyQ+UG5gdSQhIzckIjApPiIpW0FnXl4hIzY3JDckJCIwdz5cV0xVdSQhIzckIjB4RkF5RDE7JiEjNjckJCIwJjMkPlBuYHUkISM3JCIwKT4iKVtBZ15eISM2NyQ3JCQiMHc+XFdMVXUkISM3JCIweEZBeUQxOyYhIzY3JCQiMEJFJjRjelVQISM3JCIwaTU3LipHc14hIzY3JDckJCIwYiMzOyEqcFVQISM3JCIwODtITG1JPCYhIzY3JCQiMEJFJjRjelVQISM3JCIwaTU3LipHc14hIzY3JDckJCIwYiMzOyEqcFVQISM3JCIwODtITG1JPCYhIzY3JCQiLyQqWyI+YER1JCEjNiQiMDwiPjNDRXVeISM2NyQ3JCQiMCRRNiIqR0pdUCEjNyQiMDJ4XWdwTjYmISM2NyQkIjBleCZmdixcUCEjNyQiMHBpLDgvTDcmISM2NyQ3JCQiMGV4JmZ2LFxQISM3JCIwcGksOC9MNyYhIzY3JCQiMHZfVFgmM1tQISM3JCIvIyoqKilIWS84JiEjNTckNyQkIjBfWzNnKVFaUCEjNyQiMDBeM29XZDgmISM2NyQkIjB2X1RYJjNbUCEjNyQiLyMqKiopSFkvOCYhIzU3JDckJCIwX1szZylRWlAhIzckIjAwXjNvV2Q4JiEjNjckJCIwZCw4L0xrdSQhIzckIi9lWTs+OlZeISM1NyQ3JCQiL2gjNHUjPmFQISM2JCIwOzIkeSZcYTMmISM2NyQkIjA3RTFcPFR2JCEjNyQiMGgoNHlDKWYzJiEjNjckNyQkIjA3RTFcPFR2JCEjNyQiMGgoNHlDKWYzJiEjNjckJCIwV18kM3UwYVAhIzckIi9uVzprVCczJiEjNTckNyQkIjBaL1lgI1FfUCEjNyQiMChmeUdJVSk0JiEjNjckJCIwV18kM3UwYVAhIzckIi9uVzprVCczJiEjNTckNyQkIjBaL1lgI1FfUCEjNyQiMChmeUdJVSk0JiEjNjckJCIwZHI0Q280diQhIzckIjAoZic9QmkoM14hIzY3JDckJCIwR2I3ankxdiQhIzckIjBMdSV6TiczNiYhIzY3JCQiMGRyNENvNHYkISM3JCIwKGYnPUJpKDNeISM2NyQ3JCQiMEdiN2p5MXYkISM3JCIwTHUlek4nMzYmISM2NyQkIjAkUTYiKkdKXVAhIzckIjAyeF1ncE42JiEjNjckNyQkIjBPUTJmcyFlUCEjNyQiMDYxJXlYdGVdISM2NyQkIjBvV2xoQHh2JCEjNyQiMCozc3c4NWhdISM2NyQ3JCQiMG9XbGhAeHYkISM3JCIwKjNzdzg1aF0hIzY3JCQiMGtaMjs6dXYkISM3JCIudlRSNEsxJiEiKjckNyQkIjBZYT0/LWZ2JCEjNyQiMEQ0dSM+YXRdISM2NyQkIjBrWjI7OnV2JCEjNyQiLnZUUjRLMSYhIio3JDckJCIwWWE9Py1mdiQhIzckIjBENHUjPmF0XSEjNjckJCIvaCM0dSM+YVAhIzYkIjA7MiR5JlxhMyYhIzY3JDckJCIwal0wV18+dyQhIzckIi8jUV5wWEwuJiEjNTckJCIwQjAqb1RdaFAhIzckIjA8V2BGP2kuJiEjNjckNyQkIjBCMCpvVF1oUCEjNyQiMDxXYEY/aS4mISM2NyQkIjA3MmxHdDV3JCEjNyQiMCdcQ1MjUiFSXSEjNjckNyQkIjBtP05VI2ZmUCEjNyQiMGBLZyMzbVtdISM2NyQkIjA3MmxHdDV3JCEjNyQiMCdcQ1MjUiFSXSEjNjckNyQkIjBtP05VI2ZmUCEjNyQiMGBLZyMzbVtdISM2NyQkIjBPUTJmcyFlUCEjNyQiMDYxJXlYdGVdISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMGQyX10/IzRdISM2NyQkIjBBL0pNJVtsUCEjNyQiMFhuUjxSOCwmISM2NyQ3JCQiMEEvSk0lW2xQISM3JCIwWG5SPFI4LCYhIzY3JCQiMHQjKXBIOF53JCEjNyQiMCQ0WCJmV08sJiEjNjckNyQkIjAxRChIOFpqUCEjNyQiMCJlbEMoelAtJiEjNjckJCIwdCMpcEg4XnckISM3JCIwJDRYImZXTywmISM2NyQ3JCQiMDFEKEg4WmpQISM3JCIwImVsQyh6UC0mISM2NyQkIjBqXTBXXz53JCEjNyQiLyNRXnBYTC4mISM1NyQ3JCQiMDt2LDk3KHBQISM3JCIwIlspKWZtSCcpXCEjNjckJCIwVlcuPSVvcFAhIzckIjB0IWZzIWVrKVwhIzY3JDckJCIwVlcuPSVvcFAhIzckIjB0IWZzIWVrKVwhIzY3JCQiMCV6ciV6XSdwUCEjNyQiMCc0JFF4YW0pXCEjNjckNyQkIjBfRzJzZnZ3JCEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMCV6ciV6XSdwUCEjNyQiMCc0JFF4YW0pXCEjNjckNyQkIjBfRzJzZnZ3JCEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMCpHTyFIS2V3JCEjNyQiMGQyX10/IzRdISM2NyQ3JCQiMFUoKSoqKT5mdFAhIzckIjBNSjUoPmBrXCEjNjckJCIwWDNWYCIpPXgkISM3JCIwUC0+XzxTKFwhIzY3JDckJCIwWDNWYCIpPXgkISM3JCIwUC0+XzxTKFwhIzY3JCQiMDt2LDk3KHBQISM3JCIwIlspKWZtSCcpXCEjNjckNyQkIjBwKnpSPVp4UCEjNyQiMFFCUXlgUSVcISM2NyQkIjA8OFBUa2t4JCEjNyQiMGxEMFVPIlxcISM2NyQ3JCQiMDw4UFRra3gkISM3JCIwbEQwVU8iXFwhIzY3JCQiMFRhQVRmXHgkISM3JCIwXiEpeVIjPmRcISM2NyQ3JCQiME5qcnpOVHgkISM3JCIwLDk3KHBkaFwhIzY3JCQiMFRhQVRmXHgkISM3JCIwXiEpeVIjPmRcISM2NyQ3JCQiME5qcnpOVHgkISM3JCIwLDk3KHBkaFwhIzY3JCQiMFUoKSoqKT5mdFAhIzckIjBNSjUoPmBrXCEjNjckNyQkIjAmPmgqb144eSQhIzckIjAiUVplJCo+Q1whIzY3JCQiMCp5ZiRRUzh5JCEjNyQiMCQqWyI+YERDXCEjNjckNyQkIjAqeWYkUVM4eSQhIzckIjAkKlsiPmBEQ1whIzY3JCQiMHplW3Y/OHkkISM3JCIvIlEqNFhOQ1whIzU3JDckJCIwLURESW0peVAhIzckIjBIUClwZXBPXCEjNjckJCIwemVbdj84eSQhIzckIi8iUSo0WE5DXCEjNTckNyQkIjAtRERJbSl5UCEjNyQiMEhQKXBlcE9cISM2NyQkIjBwKnpSPVp4UCEjNyQiMFFCUXlgUSVcISM2NyQ3JCQiMEFDJVI6QiZ5JCEjNyQiMCVvSlM4YjBcISM2NyQkIjBUayFSLiJSeSQhIzckIjBjZyVvWiI9IlwhIzY3JDckJCIwVGshUi4iUnkkISM3JCIwY2clb1oiPSJcISM2NyQkIjAmPmgqb144eSQhIzckIjAiUVplJCo+Q1whIzY3JDckJCIwW08jKlE2Iip5JCEjNyQiMEIkZiMzP3kpWyEjNjckJCIwVy1pKltjJ3kkISM3JCIvQXg8VVAqKlshIzU3JDckJCIwVy1pKltjJ3kkISM3JCIwQHN4QHUkKipbISM2NyQkIjBBQyVSOkImeSQhIzckIjAlb0pTOGIwXCEjNjckNyQkIjB2WyFSNypIeiQhIzckIjA4TnpJIio0KFshIzY3JCQiMDoib0gsPCN6JCEjNyQiMFsmUjtKXHVbISM2NyQ3JCQiMDoib0gsPCN6JCEjNyQiMFsmUjtKXHVbISM2NyQkIjBvJ3lwdygpKnkkISM3JCIwc3hiaXdXKVshIzY3JDckJCIwalFsVzYkKnkkISM3JCIwJVEzbk8kcClbISM2NyQkIjBvJ3lwdygpKnkkISM3JCIwc3hiaXdXKVshIzY3JDckJCIwalFsVzYkKnkkISM3JCIwJVEzbk8kcClbISM2NyQkIjBbTyMqUTYiKnkkISM3JCIwQiRmIzM/eSlbISM2NyQ3JCQiMCxoKSkzcm96JCEjNyQiMG1YRiM0K2JbISM2NyQkIi8yTlcrOSZ6JCEjNiQiMDcyZGNfPydbISM2NyQ3JCQiLzJOVys5JnokISM2JCIwNzJkY18/J1shIzY3JCQiMHZbIVI3Kkh6JCEjNyQiMDhOekkiKjQoWyEjNjckNyQkIjBHdCdRNHYrUSEjNyQiMCM9KSpwUCEpUlshIzY3JCQiMDpBJVIkRyMpeiQhIzckIjB3PV0sNydcWyEjNjckNyQkIjA6QSVSJEcjKXokISM3JCIwdz1dLDcnXFshIzY3JCQiMCxoKSkzcm96JCEjNyQiMG1YRiM0K2JbISM2NyQ3JCQiMGEmWyl5SVkhUSEjNyQiMHU5PmloYCNbISM2NyQkIi9cXHVnVyxRISM2JCIvL0xrOTxQWyEjNTckNyQkIi9cXHVnVyxRISM2JCIvL0xrOTxQWyEjNTckJCIwR3QnUTR2K1EhIzckIjAjPSkqcFAhKVJbISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIwPCwlND1rNlshIzY3JCQiLyRSKG9NSzNRISM2JCIwb2BITyFIN1shIzY3JDckJCIvJFIob01LM1EhIzYkIjBvYEhPIUg3WyEjNjckJCIwJ1x1S2deMVEhIzckIjByWCJwZm89WyEjNjckNyQkIjBFKy1jMFshUSEjNyQiMC9VTyI0dENbISM2NyQkIjAnXHVLZ14xUSEjNyQiMHJYInBmbz1bISM2NyQ3JCQiMEUrLWMwWyFRISM3JCIwL1VPIjR0Q1shIzY3JCQiMGEmWyl5SVkhUSEjNyQiMHU5PmloYCNbISM2NyQ3JCQiMDI1IilbIVI3USEjNyQiMF4kKjQ/LScpeiUhIzY3JCQiMFIlMyY9Nz8iUSEjNyQiMEtsQSIpXCkqeiUhIzY3JDckJCIwUiUzJj03PyJRISM3JCIwS2xBIilcKSp6JSEjNjckJCIwInlIUTFeM1EhIzckIjA8LCU0PWs2WyEjNjckNyQkIjBNQXpMcWkiUSEjNyQiMGUiNCMzLWl5JSEjNjckJCIwdWNCWCYpZSJRISM3JCIwJ3BkaCM0dXklISM2NyQ3JCQiMHVjQlgmKWUiUSEjNyQiMCdwZGgjNHV5JSEjNjckJCIwMjUiKVshUjdRISM3JCIwXiQqND8tJyl6JSEjNjckNyQkIi9ZdCg9XSwjUSEjNiQiMCJSd3ZpU3VaISM2NyQkIjBaJ1snXGgqPlEhIzckIi8nKSkzcm9ceCUhIzU3JDckJCIwWidbJ1xoKj5RISM3JCIvJykpM3JvXHglISM1NyQkIjBNQXpMcWkiUSEjNyQiMGUiNCMzLWl5JSEjNjckNyQkIi9ZdCg9XSwjUSEjNiQiMCJSd3ZpU3VaISM2NyQkIjBfJm9XbCM+I1EhIzckIjBDeSMzSEZwWiEjNjckNyQkIjAob2FQKy5DUSEjNyQiMCozIWVpJj1qWiEjNjckJCIwXyZvV2wjPiNRISM3JCIwQ3kjM0hGcFohIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIwTj52VTVEdiUhIzY3JCQiME8nb0RXRUNRISM3JCIwQystO0dEdyUhIzY3JDckJCIwTydvRFdFQ1EhIzckIjBDKy07R0R3JSEjNjckJCIwKG9hUCsuQ1EhIzckIjAqMyFlaSY9alohIzY3JDckJCIvOTxQKCp5SlEhIzYkIi9DenhQTVVaISM1NyQkIjBbS3g+PylHUSEjNyQiMCk9XjR3M11aISM2NyQ3JCQiMFtLeD4/KUdRISM3JCIwKT1eNHczXVohIzY3JCQiMDhmdCkpNHojUSEjNyQiME4+dlU1RHYlISM2NyQ3JCQiMG0kKXBlcGMkUSEjNyQiMHRgRkVhRXQlISM2NyQkIjBYbk12XU8kUSEjNyQiMF9CKWVxa1BaISM2NyQ3JCQiMFduTXZdTyRRISM3JCIwX0IpZXFrUFohIzY3JCQiLzk8UCgqeUpRISM2JCIvQ3p4UE1VWiEjNTckNyQkIjAkZnpPJVwmUlEhIzckIjBMRCpwOlRCWiEjNjckJCIwPEd1byR5UVEhIzckIjA7TiIzbD9EWiEjNjckNyQkIjA8R3VvJHlRUSEjNyQiMDtOIjNsP0RaISM2NyQkIjBtJClwZXBjJFEhIzckIjB0YEZFYUV0JSEjNjckNyQkIjAkZnpPJVwmUlEhIzckIjBMRCpwOlRCWiEjNjckJCIuI2YkR2M5JVEhIzUkIjBNXWhIIzQ+WiEjNjckNyQkIjA+M21HSE0lUSEjNyQiMC0vbCkzZzlaISM2NyQkIi4jZiRHYzklUSEjNSQiME1daEgjND5aISM2NyQ3JCQiMFk/azg0dCVRISM3JCIwdEAjcHI+MVohIzY3JCQiMCxneVhqVSVRISM3JCIvb1dkZnc3WiEjNTckNyQkIjAsZ3lYalUlUSEjNyQiL29XZGZ3N1ohIzU3JCQiMD4zbUdITSVRISM3JCIwLS9sKTNnOVohIzY3JDckJCIwc0tpKSopPV5RISM3JCIwJkhBOyRmIilwJSEjNjckJCIweTdgWEcsJlEhIzckIjBXZW5TRC5xJSEjNjckNyQkIjB5N2BYRywmUSEjNyQiMFdlblNELnElISM2NyQkIjBZP2s4NHQlUSEjNyQiMHRAI3ByPjFaISM2NyQ3JCQiMHNLaSkqKT1eUSEjNyQiMCZIQTskZiIpcCUhIzY3JCQiLzp1JVJVSCZRISM2JCIwVDxzPS5acCUhIzY3JDckJCIwKlwvTylvXSZRISM3JCIwanEqUT1bIXAlISM2NyQkIi86dSVSVUgmUSEjNiQiMFQ8cz0uWnAlISM2NyQ3JCQiMERkZW9bKmVRISM3JCIwPix1WVJKbyUhIzY3JCQiMClcUCRHQ2smUSEjNyQiMDNxZyZbKXlvJSEjNjckNyQkIjApXFAkR0NrJlEhIzckIjAzcWcmWyl5byUhIzY3JCQiMCpcL08pb10mUSEjNyQiMGpxKlE9WyFwJSEjNjckNyQkIjBEZGVvWyplUSEjNyQiMD4sdVlSSm8lISM2NyQkIjBRJT1tXE5pUSEjNyQiMDxASXlpcG4lISM2NyQ3JCQiMF9wY2BHRydRISM3JCIwUiQzMm80d1khIzY3JCQiMFElPW1cTmlRISM3JCIwPEBJeWlwbiUhIzY3JDckJCIweSJbJlEzbidRISM3JCIwdW1Ja2wkcFkhIzY3JCQiMCczLCNRKT5qUSEjNyQiMHMiUTBWV3ZZISM2NyQ3JCQiMCczLCNRKT5qUSEjNyQiMHMiUTBWV3ZZISM2NyQkIjBfcGNgR0cnUSEjNyQiMFIkMzJvNHdZISM2NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMC5LJD55KUdtJSEjNjckJCIwQTElUXZecVEhIzckIjBPJHBhUCtqWSEjNjckNyQkIjBBMSVRdl5xUSEjNyQiME8kcGFQK2pZISM2NyQkIjB5IlsmUTNuJ1EhIzckIjB1bUlrbCRwWSEjNjckNyQkIjAwJUhOIyllcVEhIzckIjAuSyQ+eSlHbSUhIzY3JCQiMCQ9eGQmZjEoUSEjNyQiMFg+RTF2Rm0lISM2NyQ3JCQiMEoxXjNvVyhRISM3JCIwJzQyRy1wY1khIzY3JCQiMCQ9eGQmZjEoUSEjNyQiMFg+RTF2Rm0lISM2NyQ3JCQiMEoxXjNvVyhRISM3JCIwJzQyRy1wY1khIzY3JCQiMFIuLFdlI3lRISM3JCIwXyp6aywmM2wlISM2NyQ3JCQiMGU9XCR6TXlRISM3JCIwJDMoeXc1MmwlISM2NyQkIjBSLixXZSN5USEjNyQiMF8qemssJjNsJSEjNjckNyQkIjAlM3QleUZBKVEhIzckIi9yal4jelxrJSEjNTckJCIwejNrOFkleVEhIzckIi4wUz9qMGwlISIqNyQ3JCQiMHozazhZJXlRISM3JCIuMFM/ajBsJSEiKjckJCIwZT1cJHpNeVEhIzckIjAkMyh5dzUybCUhIzY3JDckJCIwJTN0JXlGQSlRISM3JCIvcmpeI3pcayUhIzU3JCQiMCdHMmc0TyYpUSEjNyQiMDR3KUdvXlNZISM2NyQ3JCQiMDZWWGoyaClRISM3JCIwbiMpNF9TJVJZISM2NyQkIjAnRzJnNE8mKVEhIzckIjA0dylHb15TWSEjNjckNyQkIjBQYlZbKCkqKilRISM3JCIwYDd0OTdUaiUhIzY3JCQiMGljby9icSlRISM3JCIwaztMbEEiUVkhIzY3JDckJCIwaWNvL2JxKVEhIzckIjBrO0xsQSJRWSEjNjckJCIwNlZYajJoKVEhIzckIjBuIyk0X1MlUlkhIzY3JDckJCIwUGJWWygpKiopUSEjNyQiMGA3dDk3VGolISM2NyQkIi5gIWVJNiMqUSEjNSQiMGEwVDUyOGolISM2NyQ3JCQiMGtuVExuUSpRISM3JCIwI29nOjonKkdZISM2NyQkIi5gIWVJNiMqUSEjNSQiMGEwVDUyOGolISM2NyQ3JCQiMCIqelI9WngqUSEjNyQiMClvIWZBIilSaSUhIzY3JCQiMEQnSCV5MmsqUSEjNyQiMEdHRTUjb0RZISM2NyQ3JCQiMEQnSCV5MmsqUSEjNyQiMEdHRTUjb0RZISM2NyQkIjBrblRMblEqUSEjNyQiMCNvZzo6JypHWSEjNjckNyQkIjAiKnpSPVp4KlEhIzckIjApbyFmQSIpUmklISM2NyQkIi53dy4xJykqUSEjNSQiLyM0KUgjR0hpJSEjNTckNyQkIjA8I3pMcWksUiEjNyQiMCNHbT08PD5ZISM2NyQkIi53dy4xJykqUSEjNSQiLyM0KUgjR0hpJSEjNTckNyQkIjA8I3pMcWksUiEjNyQiMCNHbT08PD5ZISM2NyQkIi8yKSpbUShbIVIhIzYkIjBASW9Ncl9oJSEjNjckNyQkIjBXL08pb10wUiEjNyQiME55I1wqKlw5WSEjNjckJCIvMikqW1EoWyFSISM2JCIwQElvTXJfaCUhIzY3JDckJCIvblRMblE0UiEjNiQiMEJjdSgzKSo0WSEjNjckJCIwW3VnOXZsIVIhIzckIjAiKlI+YlRLaCUhIzY3JDckJCIwW3VnOXZsIVIhIzckIjAiKlI+YlRLaCUhIzY3JCQiMFcvTylvXTBSISM3JCIwTnkjXCoqXDlZISM2NyQ3JCQiL25UTG5RNFIhIzYkIjBCY3UoMykqNFkhIzY3JCQiMCIpPjpbXTQiUiEjNyQiMF43JHB1QTNZISM2NyQ3JCQiMCgqR0tlbUsiUiEjNyQiMHMrM3ohZjBZISM2NyQkIjAiKT46W100IlIhIzckIjBeNyRwdUEzWSEjNjckNyQkIjAnKkdLZW1LIlIhIzckIjBzKzN6IWYwWSEjNjckJCIwZWg+NyxwIlIhIzckIjBiZSR6dmUsWSEjNjckNyQkIjBCVElWWXIiUiEjNyQiMFQ/J0dLSixZISM2NyQkIjBlaD43LHAiUiEjNyQiMGJlJHp2ZSxZISM2NyQ3JCQiL04mR0dFNSNSISM2JCIwJFFpZ2w7KGYlISM2NyQkIjA8JnomWz53IlIhIzckIjBiXjcrLDNnJSEjNjckNyQkIjA8JnomWz53IlIhIzckIjBiXjcrLDNnJSEjNjckJCIwQlRJVllyIlIhIzckIjBUPydHS0osWSEjNjckNyQkIi9OJkdHRTUjUiEjNiQiMCRRaWdsOyhmJSEjNjckJCIwI1FZLScpcEFSISM3JCIwdFIkKnlRYWYlISM2NyQ3JCQiMHdsRTgxXCNSISM3JCIwMyNlSzc3JGYlISM2NyQkIjAjUVktJylwQVIhIzckIjB0UiQqeVFhZiUhIzY3JDckJCIwd2xFODFcI1IhIzckIjAzI2VLNzckZiUhIzY3JCQiMD5xIipcOSVHUiEjNyQiMHg5UWZeJiplJSEjNjckNyQkIjAueUMpZnlHUiEjNyQiMF4oPi52OyplJSEjNjckJCIwPnEiKlw5JUdSISM3JCIweDlRZl4mKmUlISM2NyQ3JCQiMEghSEtlbUtSISM3JCIwNlsuRz9gZSUhIzY3JCQiMCl6Qyp5IWZIUiEjNyQiMD5qMFhnJCllJSEjNjckNyQkIjApekMqeSFmSFIhIzckIjA+ajBYZyQpZSUhIzY3JCQiMC55QylmeUdSISM3JCIwXig+LnY7KmUlISM2NyQ3JCQiMEghSEtlbUtSISM3JCIwNlsuRz9gZSUhIzY3JCQiMFFoVW09UyRSISM3JCIwXDIubUFTZSUhIzY3JDckJCIwYy1Ab1hsJFIhIzckIjBQdWMmemIiZSUhIzY3JCQiMFFoVW09UyRSISM3JCIwXDIubUFTZSUhIzY3JDckJCIwYy1Ab1hsJFIhIzckIjBQdWMmemIiZSUhIzY3JCQiL1dlVWpiUlIhIzYkIjBHME0icHF5WCEjNjckNyQkIjAjWyI+YEQvJVIhIzckIjAleSM0JipweWQlISM2NyQkIi9XZVVqYlJSISM2JCIwRzBNInBxeVghIzY3JDckJCIwNEY8UTBWJVIhIzckIjAqWyskW2lVZCUhIzY3JCQiMFpDXHU0RCVSISM3JCIwJFsoKSoqKT5mZCUhIzY3JDckJCIwWkNcdTREJVIhIzckIjAkWygpKiopPmZkJSEjNjckJCIwI1siPmBELyVSISM3JCIwJXkjNCYqcHlkJSEjNjckNyQkIjA0RjxRMFYlUiEjNyQiMCpbKyRbaVVkJSEjNjckJCIwdCN5M0otWFIhIzckIjBtKnpVJj1PZCUhIzY3JDckJCIwTlI6QiY9W1IhIzckIjApKTNAP0syZCUhIzY3JCQiMHQjeTNKLVhSISM3JCIwbSp6VSY9T2QlISM2NyQ3JCQiME5SOkImPVtSISM3JCIwKSkzQD9LMmQlISM2NyQkIjBAY2xzQS8mUiEjNyQiMD1wLltYKG9YISM2NyQ3JCQiMGleODNsPyZSISM3JCIwUSEzVj5FblghIzY3JCQiMEBjbHNBLyZSISM3JCIwPXAuW1gob1ghIzY3JDckJCIwaV44M2w/JlIhIzckIjBRITNWPkVuWCEjNjckJCIwbUhVZiZ5YlIhIzckIjBAY2BEISpSYyUhIzY3JDckJCIwKVE7SlwlZiZSISM3JCIwTCxLc1pRYyUhIzY3JCQiMG1IVWYmeWJSISM3JCIwQGNgRCEqUmMlISM2NyQ3JCQiMDp3NHlDKWZSISM3JCIvRksyXF1nWCEjNTckJCIwUGxRaW5qJlIhIzckIjBaJz1cJHpNYyUhIzY3JDckJCIwUGxRaW5qJlIhIzckIjBaJz1cJHpNYyUhIzY3JCQiMClRO0pcJWYmUiEjNyQiMEwsS3NaUWMlISM2NyQ3JCQiMDp3NHlDKWZSISM3JCIvRksyXF1nWCEjNTckJCIwb3ZwJDQzaFIhIzckIjBzYmRhXiVmWCEjNjckNyQkIjBUKXlJWXFqUiEjNyQiMEpGMWI3c2IlISM2NyQkIjBvdnAkNDNoUiEjNyQiMHNiZGFeJWZYISM2NyQ3JCQiMFQpeUlZcWpSISM3JCIwSkYxYjdzYiUhIzY3JCQiMF83N0tXaidSISM3JCIwYG8mNGAsYlghIzY3JDckJCIwbysxWyVlblIhIzckIjAlRzMqKlsnUmIlISM2NyQkIjBfNzdLV2onUiEjNyQiMGBvJjRgLGJYISM2NyQ3JCQiMCVIVElWWXJSISM3JCIwMldPXmcyYiUhIzY3JCQiMEM6SmNCNihSISM3JCIwNilcKXpRNWIlISM2NyQ3JCQiMEM6SmNCNihSISM3JCIwNilcKXpRNWIlISM2NyQkIjBvKzFbJWVuUiEjNyQiMCVHMyoqWydSYiUhIzY3JDckJCIwJUhUSVZZclIhIzckIjAyV09eZzJiJSEjNjckJCIwOlFKJil6OihSISM3JCIwYHAvUW8xYiUhIzY3JDckJCIwQEQtPVdgKFIhIzckIjAiM2o+RGhaWCEjNjckJCIwOlFKJil6OihSISM3JCIwYHAvUW8xYiUhIzY3JDckJCIwQEQtPVdgKFIhIzckIjAiM2o+RGhaWCEjNjckJCIwWSNcJzNrbihSISM3JCIwS2R4JGZbWVghIzY3JDckJCIwWlArLkMjelIhIzckIjBtejlkKlxXWCEjNjckJCIwWSNcJzNrbihSISM3JCIwS2R4JGZbWVghIzY3JDckJCIwWlArLkMjelIhIzckIjBtejlkKlxXWCEjNjckJCIwa3MlcCpIPilSISM3JCIwIz1qTUJPVVghIzY3JDckJCIwdVwpelE1JClSISM3JCIwN2QrJyk9OWElISM2NyQkIjBrcyVwKkg+KVIhIzckIjAjPWpNQk9VWCEjNjckNyQkIi5pJ0hQKXApUiEjNSQiMFYiZig0cCRRWCEjNjckJCIwLWQ/LCpvJylSISM3JCIwdjR5QylmUVghIzY3JDckJCIwLWQ/LCpvJylSISM3JCIwdjR5QylmUVghIzY3JCQiMHVcKXpRNSQpUiEjNyQiMDdkKycpPTlhJSEjNjckNyQkIi5pJ0hQKXApUiEjNSQiMFYiZig0cCRRWCEjNjckJCIwaDVbWHhxKVIhIzckIjAlZWxBeEhRWCEjNjckNyQkIjBGdSV6TiczKlIhIzckIjApbyhIQ2pgYCUhIzY3JCQiMGg1W1h4cSlSISM3JCIwJWVsQXhIUVghIzY3JDckJCIwRnUlek4nMypSISM3JCIwKW8oSENqYGAlISM2NyQkIjA7M2t3Jj0jKlIhIzckIjAtJFE+KGVWYCUhIzY3JDckJCIwYCdHSE11JSpSISM3JCIwbS05VyJRS1ghIzY3JCQiMDsza3cmPSMqUiEjNyQiMC0kUT4oZVZgJSEjNjckNyQkIjBgJ0dITXUlKlIhIzckIjBtLTlXIlFLWCEjNjckJCIwQSJHWUhHKCpSISM3JCIwOVklNGFYSVghIzY3JDckJCIvKSk0ektpKSpSISM2JCIwQWAmXDdVSFghIzY3JCQiMEEiR1lIRygqUiEjNyQiMDlZJTRhWElYISM2NyQ3JCQiLykpNHpLaSkqUiEjNiQiMEFgJlw3VUhYISM2NyQkIjBWIz0vMlAtUyEjNyQiMDYxMUojZUVYISM2NyQ3JCQiMDE2KkdKXS1TISM3JCIwYSQ0dS1bRVghIzY3JCQiMFYjPS8yUC1TISM3JCIwNjExSiNlRVghIzY3JDckJCIwTEIoeUhRMVMhIzckIjBIJEdqO2RCWCEjNjckJCIwbEtoOkhIKyUhIzckIjBSQHJwZGhfJSEjNjckNyQkIjBsS2g6SEgrJSEjNyQiMFJAcnBkaF8lISM2NyQkIjAxNipHSl0tUyEjNyQiMGEkNHUtW0VYISM2NyQ3JCQiMExCKHlIUTFTISM3JCIwSCRHajtkQlghIzY3JCQiMFUyQikpSHUrJSEjNyQiMGlOOSYzIUdfJSEjNjckNyQkIjBmTiZHR0U1UyEjNyQiMEhqM0l6MV8lISM2NyQkIjBVMkIpKUh1KyUhIzckIjBpTjkmMyFHXyUhIzY3JDckJCIwZk4mR0dFNVMhIzckIjBIajNJejFfJSEjNjckJCIwJ3lEWDhbN1MhIzckIjAuKmZJVC8+WCEjNjckNyQkIjAneU15RTk5UyEjNyQiMCkqPU8rKno8WCEjNjckJCIwJ3lEWDhbN1MhIzckIjAuKmZJVC8+WCEjNjckNyQkIjAneU15RTk5UyEjNyQiMCkqPU8rKno8WCEjNjckJCIwNjxuRkh2LCUhIzckIjAwPUx0KUg6WCEjNjckNyQkIjA3ZyJHRC09UyEjNyQiMD05XmFHXF4lISM2NyQkIjA2PG5GSHYsJSEjNyQiMDA9THQpSDpYISM2NyQ3JCQiMFJzelAtPi0lISM3JCIwa3JrT3Y/XiUhIzY3JCQiL0xbXidmJz5TISM2JCIwLkxrOTxQXiUhIzY3JDckJCIvTFteJ2YnPlMhIzYkIjAuTGs5PFBeJSEjNjckJCIwN2ciR0QtPVMhIzckIjA9OV5hR1xeJSEjNjckNyQkIjBSc3pQLT4tJSEjNyQiMGtya092P14lISM2NyQkIjBjXVFIakQtJSEjNyQiMFpcOyZ6ZjZYISM2NyQ3JCQiMGwleUZBeURTISM3JCIvW3ZpWEI0WCEjNTckJCIwY11RSGpELSUhIzckIjBaXDsmemY2WCEjNjckNyQkIjBsJXlGQXlEUyEjNyQiL1t2aVhCNFghIzU3JCQiMCxnTnkpZUZTISM3JCIwTmBGXkN6XSUhIzY3JDckJCIwI3BmeD9tSFMhIzckIjAnb3Reb1IxWCEjNjckJCIwLGdOeSllRlMhIzckIjBOYEZeQ3pdJSEjNjckNyQkIjAjcGZ4P21IUyEjNyQiMCdvdF5vUjFYISM2NyQkIjAuTj46O0UuJSEjNyQiMCVwK11dQy9YISM2NyQ3JCQiMD00dSM+YUxTISM3JCIwVnVoM2dOXSUhIzY3JCQiMC5OPjo7RS4lISM3JCIwJXArXV1DL1ghIzY3JDckJCIwWEBzeEB1LiUhIzckIi9yZSpHRDJdJSEjNTckJCIwJCo9QCU0bU9TISM3JCIwbldkZnc3XSUhIzY3JDckJCIwJCo9QCU0bU9TISM3JCIwbldkZnc3XSUhIzY3JCQiMD00dSM+YUxTISM3JCIwVnVoM2dOXSUhIzY3JDckJCIwWEBzeEB1LiUhIzckIi9yZSpHRDJdJSEjNTckJCIwJnpLKEhWdy4lISM3JCIvPkMtamMrWCEjNTckNyQkIjByTHFpLDgvJSEjNyQiMCpmSWUsIXpcJSEjNjckJCIwJnpLKEhWdy4lISM3JCIvPkMtamMrWCEjNTckNyQkIjByTHFpLDgvJSEjNyQiMCpmSWUsIXpcJSEjNjckJCIwMmRJJjRtVVMhIzckIjBoQ0UpeiJwXCUhIzY3JDckJCIwKWYlb1oiPVhTISM3JCIwTUw4U3BdXCUhIzY3JCQiMDJkSSY0bVVTISM3JCIwaENFKXoicFwlISM2NyQ3JCQiMClmJW9aIj1YUyEjNyQiME1MOFNwXVwlISM2NyQkIjA3KnlwZG9aUyEjNyQiMCd6ZixuQyRcJSEjNjckNyQkIjBDZW1LaCFcUyEjNyQiME4zXSgzQiNcJSEjNjckJCIwNyp5cGRvWlMhIzckIjAnemYsbkMkXCUhIzY3JDckJCIwQ2VtS2ghXFMhIzckIjBOM10oM0IjXCUhIzY3JCQiMGFfKCpHPkYwJSEjNyQiMC0iMzl2YSpbJSEjNjckNyQkIjBecWs8VEgwJSEjNyQiMDtwJUdDUSpbJSEjNjckJCIwYV8oKkc+RjAlISM3JCIwLSIzOXZhKlslISM2NyQ3JCQiMHgjR0U1I28wJSEjNyQiMFdUJioqW2AnWyUhIzY3JCQiMDo7SXh6TzAlISM3JCIwSmNdL08pKVslISM2NyQ3JCQiMDo7SXh6TzAlISM3JCIwSmNdL08pKVslISM2NyQkIjBecWs8VEgwJSEjNyQiMDtwJUdDUSpbJSEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjBXVCYqKltgJ1slISM2NyQkIjBrTHgkKlx4MCUhIzckIjBXT2FgZGVbJSEjNjckNyQkIjAvJjR3M3FnUyEjNyQiMCZmV2BobiRbJSEjNjckJCIwa0x4JCpceDAlISM3JCIwV09hYGRlWyUhIzY3JDckJCIwLyY0dzNxZ1MhIzckIjAmZldgaG4kWyUhIzY3JCQiMDkqcHcqKnlpUyEjNyQiMHhhXVdQQFslISM2NyQ3JCQiL3QhZnMhZWtTISM2JCIwJlEnKVw0ITNbJSEjNjckJCIwOSpwdyoqeWlTISM3JCIweGFdV1BAWyUhIzY3JDckJCIvdCFmcyFla1MhIzYkIjAmUScpXDQhM1slISM2NyQkIjApPTxCVSV5MSUhIzckIi8nKSkqKXpyJHlXISM1NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwMzNpNzJ6WiUhIzY3JCQiMCk9PEJVJXkxJSEjNyQiLycpKSopenIkeVchIzU3JDckJCIwJD1gRC9Nc1MhIzckIjAjeilvQytdWiUhIzY3JCQiMCoqW0w3cC8yJSEjNyQiMCZ6TyVcJlJ3VyEjNjckNyQkIjAqKltMN3AvMiUhIzckIjAmek8lXCZSd1chIzY3JCQiMGQ+ZGRnJW9TISM3JCIwMzNpNzJ6WiUhIzY3JDckJCIwJD1gRC9Nc1MhIzckIjAjeilvQytdWiUhIzY3JCQiMGouXkoySDIlISM3JCIwOCdRIXp4WFolISM2NyQ3JCQiL1RNdi1Bd1MhIzYkIi93Jnp0eT9aJSEjNTckJCIwai5eSjJIMiUhIzckIjA4J1EhenhYWiUhIzY3JDckJCIvVE12LUF3UyEjNiQiL3cmenR5P1olISM1NyQkIjAySUgiNCl6MiUhIzckIjBtU140XTJaJSEjNjckNyQkIjBPY143KywzJSEjNyQiMFtXLjBLInBXISM2NyQkIjAySUgiNCl6MiUhIzckIjBtU140XTJaJSEjNjckNyQkIjBQY143KywzJSEjNyQiMFtXLjBLInBXISM2NyQkIjAncCE+ZnVJMyUhIzckIjAnemw1IWVvWSUhIzY3JDckJCIwam9cKCp6UjMlISM3JCIwPSVmLiFlaFklISM2NyQkIjAncCE+ZnVJMyUhIzckIjAnemw1IWVvWSUhIzY3JDckJCIwKjN5QylmeTMlISM3JCIwbUlKc2VKWSUhIzY3JCQiME9baDVCbzMlISM3JCIwZnpPJVwmUlklISM2NyQ3JCQiME9baDVCbzMlISM3JCIwZnpPJVwmUlklISM2NyQkIjBqb1woKnpSMyUhIzckIjA9JWYuIWVoWSUhIzY3JDckJCIwKjN5QylmeTMlISM3JCIwbUlKc2VKWSUhIzY3JCQiMDc/MnInPSkzJSEjNyQiMF5LKCp6MUhZJSEjNjckNyQkIjA7JGZ1J1I8NCUhIzckIjAsS1BtUixZJSEjNjckJCIwNz8ycic9KTMlISM3JCIwXksoKnoxSFklISM2NyQ3JCQiMDskZnUnUjw0JSEjNyQiMCxLUG1SLFklISM2NyQkIjBvYkVZOEw0JSEjNyQiMDozJW8nMyplVyEjNjckNyQkIjBVMFdfPmM0JSEjNyQiMCRIcGNtM2RXISM2NyQkIjBvYkVZOEw0JSEjNyQiMDozJW8nMyplVyEjNjckNyQkIjBVMFdfPmM0JSEjNyQiMCRIcGNtM2RXISM2NyQkIjBDPlR0bSUpNCUhIzckIjBXK05dRFtYJSEjNjckNyQkIjBwPFVQKlwqNCUhIzckIjAqPloqXCgqUlglISM2NyQkIjBDPlR0bSUpNCUhIzckIjBXK05dRFtYJSEjNjckNyQkIjAnKkhTQXpMNSUhIzckIjBzeVJTdDNYJSEjNjckJCIwZGFMJXlkLVQhIzckIjBCIipIUjk6WCUhIzY3JDckJCIwZGFMJXlkLVQhIzckIjBCIipIUjk6WCUhIzY3JCQiMHA8VVAqXCo0JSEjNyQiMCo+WipcKCpSWCUhIzY3JDckJCIwJypIU0F6TDUlISM3JCIwc3lSU3QzWCUhIzY3JCQiMGJsdD9ZTzUlISM3JCIvVSVRS2UxWCUhIzU3JDckJCIwQVVRMmZzNSUhIzckIjBLJ0d3PnNaVyEjNjckJCIwYmx0P1lPNSUhIzckIi9VJVFLZTFYJSEjNTckNyQkIjBBVVEyZnM1JSEjNyQiMEsnR3c+c1pXISM2NyQkIi9EKCl5dyUpM1QhIzYkIjBpSHlnP2tXJSEjNjckNyQkIjBcYU8jKlE2NiUhIzckIjBWTFYieV9XVyEjNjckJCIvRCgpeXclKTNUISM2JCIwaUh5Zz9rVyUhIzY3JDckJCIwXGFPIypRNjYlISM3JCIwVkxWInlfV1chIzY3JCQiLkJrJ0czOVQhIzUkIjAjRyZIeXU/VyUhIzY3JDckJCIwdm1NeD1dNiUhIzckIjAjR0kvKClHVFchIzY3JCQiLkJrJ0czOVQhIzUkIjAjRyZIeXU/VyUhIzY3JDckJCIwLXpLaSkqKT1UISM3JCIwVkhzKXorUVchIzY3JCQiMChmWyNRSnc2JSEjNyQiMChHSVVRMlJXISM2NyQ3JCQiMChmWyNRSnc2JSEjNyQiMChHSVVRMlJXISM2NyQkIjB2bU14PV02JSEjNyQiMCNHSS8oKUdUVyEjNjckNyQkIjAtektpKSopPVQhIzckIjBWSHMpeitRVyEjNjckJCIwQVB4IjROPlQhIzckIjAmeSsjZUJ3ViUhIzY3JDckJCIwRyI0dCV5RjclISM3JCIwQjhNWSpvTVchIzY3JCQiMEFQeCI0Tj5UISM3JCIwJnkrI2VCd1YlISM2NyQ3JCQiMEciNHQleUY3JSEjNyQiMEI4TVkqb01XISM2NyQkIi9vOz45bENUISM2JCIwOlE4TG9JViUhIzY3JDckJCIwYi5IS2VtNyUhIzckIjBQYDNWPjhWJSEjNjckJCIvbzs+OWxDVCEjNiQiMDpROExvSVYlISM2NyQ3JCQiMGIuSEtlbTclISM3JCIwUGAzVj44ViUhIzY3JCQiMDJbdyRRKipIVCEjNyQiMFVxY255JEdXISM2NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMDJ5IilvJip5VSUhIzY3JCQiMDJbdyRRKipIVCEjNyQiMFVxY255JEdXISM2NyQ3JCQiMDNHRC09VzglISM3JCIwJiopZi9zVUNXISM2NyQkIjAuZXhsVj44JSEjNyQiMF45O0hMbVUlISM2NyQ3JCQiMC5leGxWPjglISM3JCIwXjk7SExtVSUhIzY3JCQiMCJlcnMiUTA4JSEjNyQiMDJ5IilvJip5VSUhIzY3JDckJCIwM0dELT1XOCUhIzckIjAmKilmL3NVQ1chIzY3JCQiMGRuPiRmUE5UISM3JCIwQlo4IT1jQlchIzY3JDckJCIwTVNCKHlIUVQhIzckIjBMJ3AjMzI0VSUhIzY3JCQiMGRuPiRmUE5UISM3JCIwQlo4IT1jQlchIzY3JDckJCIwTVNCKHlIUVQhIzckIjBMJ3AjMzI0VSUhIzY3JCQiMGVhOVkuMzklISM3JCIwKHlOVCMqZj1XISM2NyQ3JCQiMGhfQHN4QDklISM3JCIwQF0jUW5LPFchIzY3JCQiMGVhOVkuMzklISM3JCIwKHlOVCMqZj1XISM2NyQ3JCQiMChbJz5kZGc5JSEjNyQiMCZSQy5sbzhXISM2NyQkIjAlRyVmdjliOSUhIzckIjA6RTR1Iz45VyEjNjckNyQkIjAlRyVmdjliOSUhIzckIjA6RTR1Iz45VyEjNjckJCIwaF9Ac3hAOSUhIzckIjBAXSNRbks8VyEjNjckNyQkIjAoWyc+ZGRnOSUhIzckIjAmUkMubG84VyEjNjckJCIva1YsO0dZVCEjNiQiMCJlRSxXWjhXISM2NyQ3JCQiMDl4PFVQKlxUISM3JCIwJCkzdUooKio0VyEjNjckJCIva1YsO0dZVCEjNiQiMCJlRSxXWjhXISM2NyQ3JCQiMDl4PFVQKlxUISM3JCIwJCkzdUooKio0VyEjNjckJCIwOFhgIyo0PTolISM3JCIvLyUpWycpPTNXISM1NyQ3JCQiLyUqZXJzIlE6JSEjNiQiMFQ1I285QzFXISM2NyQkIjA4WGAjKjQ9OiUhIzckIi8vJSlbJyk9M1chIzU3JDckJCIvJSplcnMiUTolISM2JCIwVDUjbzlDMVchIzY3JCQiMD1Edk4oUmRUISM3JCIwLy4nb0xyLVchIzY3JDckJCIwbiw5NyhwZFQhIzckIjBvYD56O0NTJSEjNjckJCIwPUR2TihSZFQhIzckIjAvLidvTHItVyEjNjckNyQkIjAkUkBycGRoVCEjNyQiMGhTY2dPJilSJSEjNjckJCIvMUo6ImUkZVQhIzYkIjB6UC0+XzxTJSEjNjckNyQkIi8xSjoiZSRlVCEjNiQiMHpQLT5fPFMlISM2NyQkIjBuLDk3KHBkVCEjNyQiMG9gPno7Q1MlISM2NyQ3JCQiMCRSQHJwZGhUISM3JCIwaFNjZ08mKVIlISM2NyQkIjAwUUYnXC9qVCEjNyQiMGJaazlYcVIlISM2NyQ3JCQiL2ktQG9YbFQhIzYkIjAxRHJlJ2UlUiUhIzY3JCQiMDBRRidcL2pUISM3JCIwYlprOVhxUiUhIzY3JDckJCIvaS1Ab1hsVCEjNiQiMDFEcmUnZSVSJSEjNjckJCIwJVFjYyhmKG9UISM3JCIweWJzW2g2UiUhIzY3JDckJCIwWVEzbk8kcFQhIzckIi9fRTc5YyFSJSEjNTckJCIwJVFjYyhmKG9UISM3JCIweWJzW2g2UiUhIzY3JDckJCIwdF0xXztLPCUhIzckIjBDIylcRnNrUSUhIzY3JCQiMFVqUV08MDwlISM3JCIwVlwmUjtKKlElISM2NyQ3JCQiMFVqUV08MDwlISM3JCIwVlwmUjtKKlElISM2NyQkIjBZUTNuTyRwVCEjNyQiL19FNzljIVIlISM1NyQ3JCQiMHRdMV87SzwlISM3JCIwQyMpXEZza1ElISM2NyQkIjBiJFxEaWF1VCEjNyQiMFk2YCtbXVElISM2NyQ3JCQiMCpIWXFqNHhUISM3JCIwQXljcTRCUSUhIzY3JCQiMGIkXERpYXVUISM3JCIwWTZgK1tdUSUhIzY3JDckJCIwKkhZcWo0eFQhIzckIjBBeWNxNEJRJSEjNjckJCIwaTQicCxUIT0lISM3JCIwN01YNSdveVYhIzY3JDckJCIwRXYtQXc0PSUhIzckIjA3Uzx1bCF5ViEjNjckJCIwaTQicCxUIT0lISM3JCIwN01YNSdveVYhIzY3JDckJCIwXygzcWcmWz0lISM3JCIwLUBWYV9QUCUhIzY3JCQiMCkqKXpxay8jPSUhIzckIjAyaCkpM3JvUCUhIzY3JDckJCIwKSopenFrLyM9JSEjNyQiMDJoKSkzcm9QJSEjNjckJCIwRXYtQXc0PSUhIzckIjA3Uzx1bCF5ViEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjAtQFZhX1BQJSEjNjckJCIwOV9Dc2VqPSUhIzckIi9IdzFIMHNWISM1NyQ3JCQiMHoqKik+ZnQpPSUhIzckIjBGdylcJGYkcFYhIzY3JCQiMDlfQ3Nlaj0lISM3JCIvSHcxSDBzViEjNTckNyQkIjB6KiopPmZ0KT0lISM3JCIwRncpXCRmJHBWISM2NyQkIjAncEMjPShSIz4lISM3JCIwcy0kRzk4bFYhIzY3JDckJCIwMDcocGRoIz4lISM3JCIwYytzaHlbTyUhIzY3JCQiMCdwQyM9KFIjPiUhIzckIjBzLSRHOThsViEjNjckNyQkIjBLQyY+Y1wnPiUhIzckIjBwVCpwbEtnViEjNjckJCIvaSJRKWUqSD4lISM2JCIwcnMiUTBWa1YhIzY3JDckJCIvaSJRKWUqSD4lISM2JCIwcnMiUTBWa1YhIzY3JCQiMDA3KHBkaCM+JSEjNyQiMGMrc2h5W08lISM2NyQ3JCQiMEtDJj5jXCc+JSEjNyQiMHBUKnBsS2dWISM2NyQkIjBMYi5pTyYpPiUhIzckIjA7bXg7Jyl5TiUhIzY3JDckJCIwZU8kcGFQK1UhIzckIjBvWGgpXG9iViEjNjckJCIwTGIuaU8mKT4lISM3JCIwO214OycpeU4lISM2NyQ3JCQiMCYpWyI+YEQvVSEjNyQiMD4wTlBhNE4lISM2NyQkIjBgK3BtLU0/JSEjNyQiME4lWygpKiopPk4lISM2NyQ3JCQiMGArcG0tTT8lISM3JCIwTiVbKCkqKik+TiUhIzY3JCQiMGVPJHBhUCtVISM3JCIwb1hoKVxvYlYhIzY3JDckJCIwJilbIj5gRC9VISM3JCIwPjBOUGE0TiUhIzY3JCQiMDRqIm87eS9VISM3JCIwcFFbRi0uTiUhIzY3JDckJCIwNmgqb144M1UhIzckIjAjZVphVzlZViEjNjckJCIwNGoibzt5L1UhIzckIjBwUVtGLS5OJSEjNjckNyQkIjA2aCpvXjgzVSEjNyQiMCNlWmFXOVlWISM2NyQkIjBDNTFjWDZAJSEjNyQiMGFEQkpQQk0lISM2NyQ3JCQiMFF0KD1dLDdVISM3JCIwI3lybXFCVFYhIzY3JCQiMEM1MWNYNkAlISM3JCIwYURCSlBCTSUhIzY3JDckJCIwayZlb1sqZUAlISM3JCIwejoqXFVDT1YhIzY3JCQiMEdWKjRESzhVISM3JCIwKmZ6TyVcJlJWISM2NyQ3JCQiMEdWKjRESzhVISM3JCIwKmZ6TyVcJlJWISM2NyQkIjBRdCg9XSw3VSEjNyQiMCN5cm1xQlRWISM2NyQ3JCQiMGsmZW9bKmVAJSEjNyQiMHo6KlxVQ09WISM2NyQkIjAweVtgUXdAJSEjNyQiME0rX1hlUkwlISM2NyQ3JCQiMCJ6Uj1aeD5VISM3JCIuKipwRmQ2TCUhIio3JCQiMDB5W2BRd0AlISM3JCIwTStfWGVSTCUhIzY3JDckJCIwPDUjb1hsQlUhIzckIjBObCJcPChmSyUhIzY3JCQiMC1udCI0IUdBJSEjNyQiMGoyaCkpM3JLJSEjNjckNyQkIjAtbnQiNCFHQSUhIzckIjBqMmgpKTNySyUhIzY3JCQiMCJ6Uj1aeD5VISM3JCIuKipwRmQ2TCUhIio3JDckJCIwPDUjb1hsQlUhIzckIjBObCJcPChmSyUhIzY3JCQiLylcLTxxVUElISM2JCIwdWF6KVw4RFYhIzY3JDckJCIwV0EhPVdgRlUhIzckIjBAWm8lenA/ViEjNjckJCIvKVwtPHFVQSUhIzYkIjB1YXopXDhEViEjNjckNyQkIjBXQSE9V2BGVSEjNyQiMEBabyV6cD9WISM2NyQkIjA6USlSeDBKVSEjNyQiMCYpKT1EOiJlSiUhIzY3JDckJCIvWiR5RTk5QiUhIzYkIjAvTzg1PGBKJSEjNjckJCIwOlEpUngwSlUhIzckIjAmKSk9RDoiZUolISM2NyQ3JCQiMChwazxUSE5VISM3JCIwXExCcVkpNFYhIzY3JCQiMFE3MSRHKD1CJSEjNyQiMEU+YUxvWUolISM2NyQ3JCQiMFE3MSRHKD1CJSEjNyQiMEU+YUxvWUolISM2NyQkIi9aJHlFOTlCJSEjNiQiMC9PODU8YEolISM2NyQ3JCQiMChwazxUSE5VISM3JCIwXExCcVkpNFYhIzY3JCQiMCJmdjkwLVFVISM3JCIwKj0sdmkjZkklISM2NyQ3JCQiMEJmdSdSPFJVISM3JCIwL0tuOm9VSSUhIzY3JCQiMCJmdjkwLVFVISM3JCIwKj0sdmkjZkklISM2NyQ3JCQiLzpGPFEwVlUhIzYkIjAyXFNIImYpSCUhIzY3JCQiMDs0WkJsMEMlISM3JCIvNHQleUZBSSUhIzU3JDckJCIwOzRaQmwwQyUhIzckIi80dCV5RkFJJSEjNTckJCIwQmZ1J1I8UlUhIzckIjAvS246b1VJJSEjNjckNyQkIi86RjxRMFZVISM2JCIwMlxTSCJmKUglISM2NyQkIjAmPl9YTjxYVSEjNyQiMEtqJ3k0ViZIJSEjNjckNyQkIjB3JDNuTyRwQyUhIzckIjBXIltqITNHSCUhIzY3JCQiMCY+X1hOPFhVISM3JCIwS2oneTRWJkglISM2NyQ3JCQiMC4nKm9eODNEJSEjNyQiMCJlPDUnPnBHJSEjNjckJCIweDYqPjMjKltVISM3JCIwYVVTQih5KkclISM2NyQ3JCQiMHg2Kj4zIypbVSEjNyQiMGFVU0IoeSpHJSEjNjckJCIwdyQzbk8kcEMlISM3JCIwVyJbaiEzR0glISM2NyQ3JCQiMC4nKm9eODNEJSEjNyQiMCJlPDUnPnBHJSEjNjckJCIwbV1rPFNERCUhIzckIjBtR1B5XVVHJSEjNjckNyQkIjBIM25PJHBhVSEjNyQiMCkzInl6QzRHJSEjNjckJCIwbV1rPFNERCUhIzckIjBtR1B5XVVHJSEjNjckNyQkIjBjP2xAdCZlVSEjNyQiMHM/KG8nPltGJSEjNjckJCIwKHpFdFYncEQlISM3JCIwPWFMb1l0RiUhIzY3JDckJCIwKHpFdFYncEQlISM3JCIwPWFMb1l0RiUhIzY3JCQiMEgzbk8kcGFVISM3JCIwKTMieXpDNEclISM2NyQ3JCQiMGM/bEB0JmVVISM3JCIwcz8obyc+W0YlISM2NyQkIjBkanBMWyxFJSEjNyQiMDxwZTgnSHNVISM2NyQ3JCQiMCNHTG1JWGlVISM3JCIwJVspKnlrZ29VISM2NyQkIjBkanBMWyxFJSEjNyQiMDxwZTgnSHNVISM2NyQ3JCQiMDRYaCJITG1VISM3JCIwJUh5Lyd6QUUlISM2NyQkIjB3NydvJj5aRSUhIzckIjAjZW1LaCFcRSUhIzY3JDckJCIwdzcnbyY+WkUlISM3JCIwI2VtS2ghXEUlISM2NyQkIjAjR0xtSVhpVSEjNyQiMCVbKSp5a2dvVSEjNjckNyQkIjA0WGgiSExtVSEjNyQiMCVIeS8nekFFJSEjNjckJCIwb0cjbzoub1UhIzckIjBsX3BbZiVmVSEjNjckNyQkIjBOZGZ3Ny1GJSEjNyQiMFZFJlI4JWVEJSEjNjckJCIwb0cjbzoub1UhIzckIjBsX3BbZiVmVSEjNjckNyQkIjBpcGRoIzR1VSEjNyQiMD5OdHAoR1xVISM2NyQkIjBIIlteKDNBRiUhIzckIjBZeD5lbENEJSEjNjckNyQkIjBIIlteKDNBRiUhIzckIjBZeD5lbENEJSEjNjckJCIwTmRmdzctRiUhIzckIjBWRSZSOCVlRCUhIzY3JDckJCIwaXBkaCM0dVUhIzckIjA+TnRwKEdcVSEjNjckJCIwZm5sR0lpRiUhIzckIjBZKipSQzZjQyUhIzY3JDckJCIwKT1lbEMoekYlISM3JCIwTktUdjxFQyUhIzY3JCQiMGZubEdJaUYlISM3JCIwWSoqUkM2Y0MlISM2NyQ3JCQiMDolUjpCJj1HJSEjNyQiMHJBW0tLZUIlISM2NyQkIjBaISoqM0dYelUhIzckIi8iKkdKXS1TVSEjNTckNyQkIjBaISoqM0dYelUhIzckIi8iKkdKXS1TVSEjNTckJCIwKT1lbEMoekYlISM3JCIwTktUdjxFQyUhIzY3JDckJCIwOiVSOkImPUclISM3JCIwckFbS0tlQiUhIzY3JCQiMCR6JlFcJHolRyUhIzckIjA0Z1tHJWZJVSEjNjckNyQkIjBUMV87S2RHJSEjNyQiMHAsSUBDKkdVISM2NyQkIjAkeiZRXCR6JUclISM3JCIwNGdbRyVmSVUhIzY3JDckJCIwbz1dLDcnKkclISM3JCIwamlFLS0+QSUhIzY3JCQiMFdUZTZya0clISM3JCIwdSsxWyVlRlUhIzY3JDckJCIwV1RlNnJrRyUhIzckIjB1KzFbJWVGVSEjNjckJCIwVDFfO0tkRyUhIzckIjBwLElAQypHVSEjNjckNyQkIjAlNCRbJz1cJEglISM3JCIwOXNvbl1aQCUhIzY3JCQiMCpRPTcieUtIJSEjNyQiMFE3KkhSOTpVISM2NyQ3JCQiMCpRPTcieUtIJSEjNyQiMFE3KkhSOTpVISM2NyQkIjBvPV0sNycqRyUhIzckIjBqaUUtLT5BJSEjNjckNyQkIjAlNCRbJz1cJEglISM3JCIwOXNvbl1aQCUhIzY3JCQiL0drd3F5JEglISM2JCIvQF9adD45VSEjNTckNyQkIjBAVllycnRIJSEjNyQiMEg3O1cmWzJVISM2NyQkIi9Ha3dxeSRIJSEjNiQiL0BfWnQ+OVUhIzU3JDckJCIwWmJXY143SSUhIzckIjBRSW9aITQrVSEjNjckJCIwYXIlPSJ6KSpIJSEjNyQiMC1DI3pMcS1VISM2NyQ3JCQiMGFyJT0ieikqSCUhIzckIjAtQyN6THEtVSEjNjckJCIwQFZZcnJ0SCUhIzckIjBINztXJlsyVSEjNjckNyQkIjBaYldjXjdJJSEjNyQiMFFJb1ohNCtVISM2NyQkIjBIOyUpKkhKLlYhIzckIjBadjRcJDQnPiUhIzY3JDckJCIwdW5VVEpeSSUhIzckIjAmPiV6T3JEPiUhIzY3JCQiMEg7JSkqSEouViEjNyQiMFp2NFwkNCc+JSEjNjckNyQkIi0zazcsNFYhIiokIjA8dy4leSNcPSUhIzY3JCQiMClcYG0+STFWISM3JCIwbU4mR0dFIT4lISM2NyQ3JCQiMClcYG0+STFWISM3JCIwbU4mR0dFIT4lISM2NyQkIjB1blVUSl5JJSEjNyQiMCY+JXpPckQ+JSEjNjckNyQkIjBGIypRNiIqR0olISM3JCIwVkJWJTM6eFQhIzY3JCQiMG8jSDZkYjdWISM3JCIvdCV5RkF5PCUhIzU3JDckJCIwbyNINmRiN1YhIzckIi90JXlGQXk8JSEjNTckJCItM2s3LDRWISIqJCIwPHcuJXkjXD0lISM2NyQ3JCQiMEYjKlE2IipHSiUhIzckIjBWQlYlMzp4VCEjNjckJCIvW0Q2Y1k4ViEjNiQiL0UmKXosKWY8JSEjNTckNyQkIjBgL1AnNHg7ViEjNyQiMFZpVnVeI3BUISM2NyQkIi9bRDZjWThWISM2JCIvRSYpeiwpZjwlISM1NyQ3JCQiL29eODNsP1YhIzYkIjBWNV9MPjc7JSEjNjckJCIwJjQpbzVSJz1WISM3JCIwJSplcnMiUWxUISM2NyQ3JCQiMCY0KW81Uic9ViEjNyQiMCUqZXJzIlFsVCEjNjckJCIwYC9QJzR4O1YhIzckIjBWaVZ1XiNwVCEjNjckNyQkIi9vXjgzbD9WISM2JCIwVjVfTD43OyUhIzY3JCQiMGRuJ2YzVkNWISM3JCIwJz4zIz5oSzolISM2NyQ3JCQiMDJITG1JWEslISM3JCIwQCYqZUdeSTolISM2NyQkIjBkbidmM1ZDViEjNyQiMCc+MyM+aEs6JSEjNjckNyQkIjBMVEpeNSVHViEjNyQiMCp6OiVlZVo5JSEjNjckJCIwIz43R0BlQ1YhIzckIjBlcWs8VEg6JSEjNjckNyQkIjAjPjdHQGVDViEjNyQiMGVxazxUSDolISM2NyQkIjAySExtSVhLJSEjNyQiMEAmKmVHXkk6JSEjNjckNyQkIi9PJkhPIUhLViEjNiQiMG9RayV6S09UISM2NyQkIjBMQWM+cC5MJSEjNyQiMEEjeUQxXVNUISM2NyQ3JCQiMExBYz5wLkwlISM3JCIwQSN5RDFdU1QhIzY3JCQiMExUSl41JUdWISM3JCIwKno6JWVlWjklISM2NyQ3JCQiMCdldzctPE9WISM3JCIwPiZ6bihleDclISM2NyQkIjAqSFYpb0xnTCUhIzckIjAnUTR2KzFHVCEjNjckNyQkIjAqSFYpb0xnTCUhIzckIjAnUTR2KzFHVCEjNjckJCIvTyZITyFIS1YhIzYkIjBuUWslektPVCEjNjckNyQkIjAnZXc3LTxPViEjNyQiMD4mem4oZXg3JSEjNjckJCIwdDgkW0tbT1YhIzckIjBeYzxNY3E3JSEjNjckNyQkIjA4eUQxXStNJSEjNyQiMDIuPDtnIT5UISM2NyQkIjB0OCRbS1tPViEjNyQiMF5jPE1jcTclISM2NyQ3JCQiMFIhUjcqSFJNJSEjNyQiMEZcJikpPUE1VCEjNjckJCIvaTknKilmOk0lISM2JCIvYlNDJj5jNiUhIzU3JDckJCIvaTknKilmOk0lISM2JCIvYlNDJj5jNiUhIzU3JCQiMDh5RDFdK00lISM3JCIwMi48O2chPlQhIzY3JDckJCIwbS1BdzR5TSUhIzckIjAkKio9XENDLFQhIzY3JCQiMHVUKjNGKHBNJSEjNyQiMDk8UCgqeUo1JSEjNjckNyQkIjB1VCozRihwTSUhIzckIjA5PFAoKnlKNSUhIzY3JCQiMFIhUjcqSFJNJSEjNyQiMEZcJikpPUE1VCEjNjckNyQkIjBtLUF3NHlNJSEjNyQiMCQqKj1cQ0MsVCEjNjckJCIwbV0qb0gyXVYhIzckIjBuKnk1QCNmNCUhIzY3JDckJCIwI1wsNycqb15WISM3JCIwcnN3JVw3IzQlISM2NyQkIjBtXSpvSDJdViEjNyQiMG4qeTVAI2Y0JSEjNjckNyQkIjA+Rj1ZcGJOJSEjNyQiMClIKj5ocEczJSEjNjckJCIwOUE2cHFBTiUhIzckIjB5R0lVUTI0JSEjNjckNyQkIjA5QTZwcUFOJSEjNyQiMHlHSVVRMjQlISM2NyQkIjAjXCw3JypvXlYhIzckIi9GblpcNyM0JSEjNTckNyQkIjBYUjtKXCVmViEjNyQiME5vQVZxTTIlISM2NyQkIjApKT0zVGN1TiUhIzckIjBVU0IoeUh5UyEjNjckNyQkIjApKT0zVGN1TiUhIzckIjBVU0IoeUh5UyEjNjckJCIwPkY9WXBiTiUhIzckIjApSCo+aHBHMyUhIzY3JDckJCIwc145O0hMTyUhIzckIjBIXUt0RVIxJSEjNjckJCIwJCp5UENXRE8lISM3JCIwMV87S2RlMSUhIzY3JDckJCIwJCp5UENXRE8lISM3JCIwMV87S2RlMSUhIzY3JCQiMFhSO0pcJWZWISM3JCIwTm9BVnFNMiUhIzY3JDckJCIwc145O0hMTyUhIzckIjBIXUt0RVIxJSEjNjckJCIwNHROTV5nTyUhIzckIjBPKVJ3KEdyMCUhIzY3JDckJCIwKVJFNiE0c08lISM3JCIwYW4nKSkpUlUwJSEjNjckJCIwNHROTV5nTyUhIzckIjBPKVJ3KEdyMCUhIzY3JDckJCIwRHc1JykpM3JWISM3JCIwWj14XTZXLyUhIzY3JCQiMDJULSdSYG5WISM3JCIvUCc0eDtNMCUhIzU3JDckJCIwMlQtJ1JgblYhIzckIi9QJzR4O00wJSEjNTckJCIwKVJFNiE0c08lISM3JCIwYW4nKSkpUlUwJSEjNjckNyQkIjBeKSkzcm9cUCUhIzckIjBZdz4nZVZNUyEjNjckJCIvTjIlM0RDUCUhIzYkIjBNdi1BdzQvJSEjNjckNyQkIi9OMiUzRENQJSEjNiQiMEx2LUF3NC8lISM2NyQkIjBEdzUnKSkzclYhIzckIjBaPXhdNlcvJSEjNjckNyQkIjB5KzJjWyl5ViEjNyQiMExRIT5BSkNTISM2NyQkIjBFeGk7SXNQJSEjNyQiMClwZXBjYEdTISM2NyQ3JCQiMEV4aTtJc1AlISM3JCIwKXBlcGNgR1MhIzY3JCQiMF4pKTNyb1xQJSEjNyQiMFl3PidlVk1TISM2NyQ3JCQiMC84MFRHRlElISM3JCIwImVUUilSUywlISM2NyQkIjA8JzRXQiY+USUhIzckIjBoKSopPV40O1MhIzY3JDckJCIwPCc0V0ImPlElISM3JCIwaCkqKT1eNDtTISM2NyQkIjB5KzJjWyl5ViEjNyQiMExRIT5BSkNTISM2NyQ3JCQiMEpELkUzbVElISM3JCIwMlwhZXpoLlMhIzY3JCQiME9pb2olZidRJSEjNyQiMEQ1I29YbC5TISM2NyQ3JCQiME9pb2olZidRJSEjNyQiMEQ1I29YbC5TISM2NyQkIjAvODBUR0ZRJSEjNyQiMCJlVFIpUlMsJSEjNjckNyQkIjBKRC5FM21RJSEjNyQiMDJcIWV6aC5TISM2NyQkIjBFWDZLJW8nUSUhIzckIjBYckdvNU0rJSEjNjckNyQkIjBkUCw2KVshUiUhIzckIjApKVtUMl1JKlIhIzY3JCQiMEVYNkslbydRJSEjNyQiMFhyR281TSslISM2NyQ3JCQiMCUpXCpmek8lUiUhIzckIjB6W1V1SUIpUiEjNjckJCIwPil6dkg6IlIlISM3JCIwKj1fPFNAIipSISM2NyQ3JCQiMD4penZIOiJSJSEjNyQiMCo9XzxTQCIqUiEjNjckJCIwZFAsNilbIVIlISM3JCIwKSlbVDJdSSpSISM2NyQ3JCQiL0B3NHlDKVIlISM2JCIwZjJTNWY5KFIhIzY3JCQiMFg/Py1RY1IlISM3JCIwYExvWXQoeVIhIzY3JDckJCIwWD8/LVFjUiUhIzckIjBgTG9ZdCh5UiEjNjckJCIwJSlcKmZ6TyVSJSEjNyQiMHpbVXVJQilSISM2NyQ3JCQiMFB1JmZ3Ny1XISM3JCIwOiNRIlFNLydSISM2NyQkIjAoPWZIRDArVyEjNyQiMDxYaCJITG1SISM2NyQ3JCQiMCg9ZkhEMCtXISM3JCIwPFhoIkhMbVIhIzY3JCQiL0B3NHlDKVIlISM2JCIwZjJTNWY5KFIhIzY3JDckJCIwaidRNHYrMVchIzckIjBQIyo+eWIjXFIhIzY3JCQiMCNvWzMhKlIvVyEjNyQiMCJvWGxCKlEmUiEjNjckNyQkIjAjb1szISpSL1chIzckIjAib1hsQipRJlIhIzY3JCQiMFB1JmZ3Ny1XISM3JCIwOiNRIlFNLydSISM2NyQ3JCQiLyopPmZ0KSk0VyEjNiQiMHk/IzNEI3okUiEjNjckJCIwKVJMayl6JzNXISM3JCIwWG9aIj1YVFIhIzY3JDckJCIwKVJMayl6JzNXISM3JCIwWG9aIj1YVFIhIzY3JCQiMGonUTR2KzFXISM3JCIwUCMqPnliI1xSISM2NyQ3JCQiMDs2ITRzdzhXISM3JCIwZFNVdUxrI1IhIzY3JCQiL3ZWMHUqR1QlISM2JCIwNCEzazcsSFIhIzY3JDckJCIvdlYwdSpHVCUhIzYkIjA0ITNrNyxIUiEjNjckJCIvKik+ZnQpKTRXISM2JCIweT8jM0QjeiRSISM2NyQ3JCQiMFZCKWVxazxXISM3JCIwKHBbKm8peTlSISM2NyQkIjAiM09dUTA8VyEjNyQiMHQiUjgyZDtSISM2NyQ3JCQiMCIzT11RMDxXISM3JCIwdCJSODJkO1IhIzY3JCQiMDs2ITRzdzhXISM3JCIwZFNVdUxrI1IhIzY3JDckJCIwcE4nM3BfQFchIzckIjA9JEc3bClIIVIhIzY3JCQiMHpbIz44OkBXISM3JCIwUC5GO0lUIVIhIzY3JDckJCIwelsjPjg6QFchIzckIjBQLkY7SVQhUiEjNjckJCIwVkIpZXFrPFchIzckIjAocFsqbyl5OVIhIzY3JDckJCIwJ3pXZW5TRFchIzckIi8vRSNSRTUqUSEjNTckJCIwWkoiXD0+RFchIzckIjAsOj9oKm8iKlEhIzY3JDckJCIwWkoiXD0+RFchIzckIjAsOj9oKm8iKlEhIzY3JCQiMHBOJzNwX0BXISM3JCIwPSRHN2wpSCFSISM2NyQ3JCQiMEFnIzNtR0hXISM3JCIvIkhZXDIqeVEhIzU3JCQiMEQ8ISlReCJIVyEjNyQiMGxFODFcI3pRISM2NyQ3JCQiMEQ8ISlReCJIVyEjNyQiMGxFODFcI3pRISM2NyQkIjAneldlblNEVyEjNyQiLy9FI1JFNSpRISM1NyQ3JCQiMFxzIWVrO0xXISM3JCIwOU9RKSpHbSdRISM2NyQkIjAnKSoqSCEpNEpWJSEjNyQiMEhRMV4zbydRISM2NyQ3JCQiMCcpKipIISk0SlYlISM3JCIwSFExXjNvJ1EhIzY3JCQiMEFnIzNtR0hXISM3JCIvIkhZXDIqeVEhIzU3JDckJCIwdiUpeUlZcVYlISM3JCIwVVEvLSE+YVEhIzY3JCQiMEQ9OykzKnBWJSEjNyQiMCQqXCpmek9hUSEjNjckNyQkIjBDPTspMypwViUhIzckIjAkKlwqZnpPYVEhIzY3JCQiMFxzIWVrO0xXISM3JCIwOU9RKSpHbSdRISM2NyQ3JCQiMC0ocGRoIzRXJSEjNyQiMFZcNHgqZVRRISM2NyQkIjBgMnlMQTNXJSEjNyQiMGRoIzR1Iz4lUSEjNjckNyQkIjBgMnlMQTNXJSEjNyQiMGRoIzR1Iz4lUSEjNjckJCIwdiUpeUlZcVYlISM3JCIwVVEvLSE+YVEhIzY3JDckJCIwRzR2KzFbVyUhIzckIjB2NCkpUUYpR1EhIzY3JCQiMEgmejNlZ1dXISM3JCIwQHQmZW9bSFEhIzY3JDckJCIwSCZ6M2VnV1chIzckIjBAdCZlb1tIUSEjNjckJCIwLShwZGgjNFclISM3JCIwVlw0eCplVFEhIzY3JDckJCIwYkB0JmVvW1chIzckIjB1WyU9PyFmIlEhIzY3JCQiMEUmM2ZHTVtXISM3JCIwJlspeUlZcSJRISM2NyQ3JCQiMEUmM2ZHTVtXISM3JCIwJlspeUlZcSJRISM2NyQkIjBHNHYrMVtXJSEjNyQiMHY0KSlRRilHUSEjNjckNyQkIjAiUTgyZGNfVyEjNyQiMHAxNSRHIkchUSEjNjckJCIwZCU+JSpcLl9XISM3JCIwXCc+ZGRnL1EhIzY3JDckJCIwZCU+JSpcLl9XISM3JCIwXCc+ZGRnL1EhIzY3JCQiMGJAdCZlb1tXISM3JCIwdVslPT8hZiJRISM2NyQ3JCQiMDNZcGJYa1glISM3JCIvJT5tJyplJip5JCEjNTckJCIwLCgqZWskb2JXISM3JCIwODNsP2xAeiQhIzY3JDckJCIwLCgqZWskb2JXISM3JCIwODNsP2xAeiQhIzY3JCQiMCJRODJkY19XISM3JCIwcDE1JEciRyFRISM2NyQ3JCQiME1lblNELlklISM3JCIwJzNIKmVSaHgkISM2NyQkIi9NcSE+IUhmVyEjNiQiMHg+ZWxDKHpQISM2NyQ3JCQiL01xIT4hSGZXISM2JCIweD5lbEMoelAhIzY3JCQiMDNZcGJYa1glISM3JCIvJT5tJyplJip5JCEjNTckNyQkIjBocWxEMFVZJSEjNyQiL28sXFFiaVAhIzU3JCQiMEdTQiVmJkdZJSEjNyQiMFRKXjUlR25QISM2NyQ3JCQiMEdTQiVmJkdZJSEjNyQiMFRKXjUlR25QISM2NyQkIjBNZW5TRC5ZJSEjNyQiMCczSCplUmh4JCEjNjckNyQkIjAoR1ExXjNvVyEjNyQiMEZsKDM0ISlbUCEjNjckJCIwWikpKWVAUW1XISM3JCIwMFZXYlZbdiQhIzY3JDckJCIwWikpKWVAUW1XISM3JCIwMFZXYlZbdiQhIzY3JCQiMGhxbEQwVVklISM3JCIvbyxcUWJpUCEjNTckNyQkIjA5Jj5jXCc+WiUhIzckIjBVIzRHKnpbdCQhIzY3JCQiMDspM1grKClwVyEjNyQiMHBhUCsuQ3UkISM2NyQ3JCQiMDspM1grKClwVyEjNyQiMHBhUCsuQ3UkISM2NyQkIjAoR1ExXjNvVyEjNyQiMEZsKDM0ISlbUCEjNjckNyQkIi91KzFbJWVaJSEjNiQiMGI5PTEhej9QISM2NyQkIjA8V0d2P0xaJSEjNyQiMEttSVhpKkhQISM2NyQ3JCQiMDxXR3Y/TFolISM3JCIwS21JWGkqSFAhIzY3JCQiMDkmPmNcJz5aJSEjNyQiMFUjNEcqelt0JCEjNjckNyQkIjBuPmVsQyh6VyEjNyQiMDsxSVtJbHEkISM2NyQkIjB5W0hRTm5aJSEjNyQiMCd6UC0+XzxQISM2NyQ3JCQiMHhbSFFOblolISM3JCIwJ3pQLT5fPFAhIzY3JCQiL3UrMVslZVolISM2JCIwYjk9MSF6P1AhIzY3JDckJCIwJD5qMFhnJFslISM3JCIwSjYtPSxAcCQhIzY3JCQiMCN6U3InZk1bJSEjNyQiMEMsNSEzayNwJCEjNjckNyQkIjAjelNyJ2ZNWyUhIzckIjBDLDUhM2sjcCQhIzY3JCQiMCdcXFFAYiNbJSEjNyQiMChcSWxeLCdwJCEjNjckNyQkIjAwJ28kKlw2IVslISM3JCIvJypvXjgzMFAhIzU3JCQiMCdcXFFAYiNbJSEjNyQiMChcSWxeLCdwJCEjNjckNyQkIjAwJ28kKlw2IVslISM3JCIvJypvXjgzMFAhIzU3JCQiMG4+ZWxDKHpXISM3JCIwOzFJW0lscSQhIzY3JDckJCIvVVdiVlsoWyUhIzYkIjA2cyIqKkddeE8hIzY3JCQiMDMydG9vblslISM3JCIwKUdKXS0/IW8kISM2NyQ3JCQiMDMydG9vblslISM3JCIwKUdKXS0/IW8kISM2NyQkIjAkPmowWGckWyUhIzckIjBKNi09LEBwJCEjNjckNyQkIjBZY18/azhcJSEjNyQiMCd5KnBjS0ZtJCEjNjckJCIwKikpZlJiLyFcJSEjNyQiMF9DJypwZnhtJCEjNjckNyQkIjAqKSlmUmIvIVwlISM3JCIwX0MnKnBmeG0kISM2NyQkIi9VV2JWWyhbJSEjNiQiMDZzIioqR114TyEjNjckNyQkIjB0b10wV19cJSEjNyQiMEwjPl8kKnlaTyEjNjckJCIwd2JuNyJIJFwlISM3JCIwO08qWyI+YGwkISM2NyQ3JCQiMHdibjciSCRcJSEjNyQiMDtPKlsiPmBsJCEjNjckJCIwWWNfP2s4XCUhIzckIjAneSpwY0tGbSQhIzY3JDckJCIwKjQpWyFSNypcJSEjNyQiMDkmSEtDbktPISM2NyQkIjBbIXA1al0nXCUhIzckIi95QylmeUdrJCEjNTckNyQkIjBbIXA1al0nXCUhIzckIi95QylmeUdrJCEjNTckJCIwdG9dMFdfXCUhIzckIjBMIz5fJCp5Wk8hIzY3JDckJCIwRSRwYVArLlghIzckIjBiY1IlPVE8TyEjNjckJCIvLU1ZeSVHXSUhIzYkIjAzcm9cKCp6aCQhIzY3JDckJCIvLU1ZeSVHXSUhIzYkIjAzcm9cKCp6aCQhIzY3JCQiMGU3N0BtQF0lISM3JCIwZjomUklvP08hIzY3JDckJCIwS3FxIj5wKlwlISM3JCIwV2Z2L1EvaiQhIzY3JCQiMGU3N0BtQF0lISM3JCIwZjomUklvP08hIzY3JDckJCIwS3FxIj5wKlwlISM3JCIwV2Z2L1EvaiQhIzY3JCQiMCo0KVshUjcqXCUhIzckIjA5JkhLQ25LTyEjNjckNyQkIjBgMFhnJClvXSUhIzckIjAiNFJ6Ij4+ZyQhIzY3JCQiMGppY1ZzZl0lISM3JCIwcyM9WXBiME8hIzY3JDckJCIwamljVnNmXSUhIzckIjBzIz1ZcGIwTyEjNjckJCIwRSRwYVArLlghIzckIjBiY1IlPVE8TyEjNjckNyQkIjB6PFZYajJeJSEjNyQiMFBpPFohRydlJCEjNjckJCIwRUVzdXAhNFghIzckIjBPJVwmUjtKZiQhIzY3JDckJCIwRUVzdXAhNFghIzckIjBPJVwmUjtKZiQhIzY3JCQiMF8wWGckKW9dJSEjNyQiMCI0UnoiPj5nJCEjNjckNyQkIjAwSVRJVlleJSEjNyQiMHVzYiNcWXFOISM2NyQkIjBQVVtbU0BeJSEjNyQiLjFbJWVuIWUkISIqNyQ3JCQiMFBVW1tTQF4lISM3JCIuMVslZW4hZSQhIio3JCQiMHo8VlhqMl4lISM3JCIwUGk8WiFHJ2UkISM2NyQ3JCQiMEtVUjpCJj1YISM3JCIwVm0rVnRXYiQhIzY3JCQiMHp3TUIuIz1YISM3JCIwR0hNdSV6Yk4hIzY3JDckJCIwendNQi4jPVghIzckIjBHSE11JXpiTiEjNjckJCIwVXhOWiEzPFghIzckIjBANyNHMVVnTiEjNjckNyQkIjAoKlE7SyY9OlghIzckIjBrPFRITiNvTiEjNjckJCIwVXhOWiEzPFghIzckIjBANyNHMVVnTiEjNjckNyQkIjAoKlE7SyY9OlghIzckIjBrPFRITiNvTiEjNjckJCIwMElUSVZZXiUhIzckIjB1c2IjXFlxTiEjNjckNyQkIjBmYVArLkNfJSEjNyQiMCZSIXpbMSRRTiEjNjckJCIwdjJLbiQ+QFghIzckIjAjNHUjPmFMYSQhIzY3JDckJCIwdjJLbiQ+QFghIzckIjAjNHUjPmFMYSQhIzY3JCQiMEtVUjpCJj1YISM3JCIwVm0rVnRXYiQhIzY3JDckJCIwJm9jYEdHRVghIzckIjB0NDhSZz5fJCEjNjckJCIwQ20hUiw7Q1ghIzckIjBjXz9rODRgJCEjNjckNyQkIjBDbSFSLDtDWCEjNyQiMGNfP2s4NGAkISM2NyQkIjBmYVArLkNfJSEjNyQiMCZSIXpbMSRRTiEjNjckNyQkIjA3ekxxaSxgJSEjNyQiMClSIjQ0TmFdJCEjNjckJCIwNHIoUkYtSVghIzckIjAlZW5TRC4xTiEjNjckNyQkIjA0cihSRi1JWCEjNyQiMCVlblNELjFOISM2NyQkIjBscyVlZWZIWCEjNyQiMFhTOTVdeV0kISM2NyQ3JCQiME0nei9LNUZYISM3JCIvVU8iNHQlPU4hIzU3JCQiMGxzJWVlZkhYISM3JCIwWFM5NV15XSQhIzY3JDckJCIwTSd6L0s1RlghIzckIi9VTyI0dCU9TiEjNTckJCIwJm9jYEdHRVghIzckIjB0NDhSZz5fJCEjNjckNyQkIjBRIj5gRC9NWCEjNyQiMDZ1alRMKClbJCEjNjckJCIwLmh2JWYiSGAlISM3JCIwWygpKiopPmYkXCQhIzY3JDckJCIwLmh2JWYiSGAlISM3JCIwWygpKiopPmYkXCQhIzY3JCQiMDd6THFpLGAlISM3JCIwKVIiNDROYV0kISM2NyQ3JCQiMGwuSVNBemAlISM3JCIwMkd1Sl09WiQhIzY3JCQiMGZKYVYoeU5YISM3JCIwNypIUjk6IlskISM2NyQ3JCQiMGZKYVYoeU5YISM3JCIwNypIUjk6IlskISM2NyQkIjBRIj5gRC9NWCEjNyQiMDZ1alRMKClbJCEjNjckNyQkIjAiZiJHRC09YSUhIzckIjBlb0BzJ3lhTSEjNjckJCIvRl5iY1lUWCEjNiQiL0MjekxxaVgkISM1NyQ3JCQiL0ZeYmNZVFghIzYkIi9DI3pMcWlYJCEjNTckJCIwS1ZWUmUwYSUhIzckIjAxRyo0KGUtWSQhIzY3JDckJCIwdG85cFAnUVghIzckIjB3NScpKTNyb00hIzY3JCQiMEtWVlJlMGElISM3JCIwMUcqNChlLVkkISM2NyQ3JCQiMHRvOXBQJ1FYISM3JCIwdzUnKSkzcm9NISM2NyQkIjBsLklTQXpgJSEjNyQiMDJHdUpdPVokISM2NyQ3JCQiMD1HRTUjb1hYISM3JCIwUngmXFFhUE0hIzY3JCQiMEtVdDNxVWElISM3JCIwL01zeUhRVyQhIzY3JDckJCIwS1V0M3FVYSUhIzckIjAvTXN5SFFXJCEjNjckJCIwImYiR0QtPWElISM3JCIwZW9Acyd5YU0hIzY3JDckJCIwV1NDJj5jXFghIzckIjB1UCU9dDY/TSEjNjckJCIwUUlOdmFxYSUhIzckIjBuWGxCKlFKTSEjNjckNyQkIjBRSU52YXFhJSEjNyQiMG5YbEIqUUpNISM2NyQkIjA9R0U1I29YWCEjNyQiMFJ4JlxRYVBNISM2NyQ3JCQiMHJfQSE9V2BYISM3JCIwbjBdbzVEUyQhIzY3JCQiLyI9ZnFpRGIlISM2JCIwJipvXjgzbFMkISM2NyQ3JCQiLyI9ZnFpRGIlISM2JCIwJipvXjgzbFMkISM2NyQkIjAxIylbdFMvYiUhIzckIi1bNzQ4O00hIik3JDckJCIwWXBiMT8pXFghIzckIjBKZGVvWyo9TSEjNjckJCIwMSMpW3RTL2IlISM3JCItWzc0ODtNISIpNyQ3JCQiMFlwYjE/KVxYISM3JCIwSmRlb1sqPU0hIzY3JCQiMFdTQyY+Y1xYISM3JCIwdVAlPXQ2P00hIzY3JDckJCIwKFwxXztLZFghIzckIjAqcGQ2LXMlUSQhIzY3JCQiMHkqeiV5JkdiWCEjNyQiMGYhWyVlblNSJCEjNjckNyQkIjB5KnoleSZHYlghIzckIjBmIVslZW5TUiQhIzY3JCQiMHJfQSE9V2BYISM3JCIwbjBdbzVEUyQhIzY3JDckJCIwQ3g9XSw3YyUhIzckIjBqVzVUWW5PJCEjNjckJCIwJEckeSZmbmdYISM3JCIwKFE1JFsnPXBMISM2NyQ3JCQiMCRHJHkmZm5nWCEjNyQiMChRNSRbJz1wTCEjNjckJCIwWjFrQCNcZlghIzckIjBfZVVBbllQJCEjNjckNyQkIjBSTyt6ISp6YiUhIzckIjBCI3pMcWkiUSQhIzY3JCQiMFoxa0AjXGZYISM3JCIwX2VVQW5ZUCQhIzY3JDckJCIwUk8reiEqemIlISM3JCIwQiN6THFpIlEkISM2NyQkIjAoXDFfO0tkWCEjNyQiMCpwZDYtcyVRJCEjNjckNyQkIi8mKm9eODNsWCEjNiQiMCQ9MCdIKmVbTCEjNjckJCIwbWQxN1RMYyUhIzckIjBeOkMkZnVjTCEjNjckNyQkIjBtZDE3VExjJSEjNyQiMF46QyRmdWNMISM2NyQkIjBDeD1dLDdjJSEjNyQiMGpXNVRZbk8kISM2NyQ3JCQiMHgsOj9oKm9YISM3JCIvLW84bENJTCEjNTckJCIwdjhDcT4nb1ghIzckIjB6UTUkWyc9TCQhIzY3JDckJCIwdjhDcT4nb1ghIzckIjB6UTUkWyc9TCQhIzY3JCQiME8pKVEiKSkqeWMlISM3JCIwSzpiS3JfTCQhIzY3JDckJCIwXG5zTyopZmMlISM3JCIwOkY8UTBWTSQhIzY3JCQiME8pKVEiKSkqeWMlISM3JCIwSzpiS3JfTCQhIzY3JDckJCIwXG5zTyopZmMlISM3JCIwOkY8UTBWTSQhIzY3JCQiLyYqb144M2xYISM2JCIwJD0wJ0gqZVtMISM2NyQ3JCQiMC45ODBUR2QlISM3JCIwNiU0bStzNkwhIzY3JCQiMC1HUEpJN2QlISM3JCIwVl0uR0MlPkwhIzY3JDckJCIwLUdQSkk3ZCUhIzckIjBWXS5HQyU+TCEjNjckJCIweCw6P2gqb1ghIzckIi8tbzhsQ0lMISM1NyQ3JCQiL2o3LDRzd1ghIzYkIjA7VTBTMUlIJCEjNjckJCIvb3JfSVN3WCEjNiQiMHJ0KnlKYSVIJCEjNjckNyQkIi9vcl9JU3dYISM2JCIwcnQqeUphJUgkISM2NyQkIjBUN1chPXh2WCEjNyQiMHdpO1QnZShIJCEjNjckNyQkIjAnKnp1MERRZCUhIzckIjAyaSdIUClwSSQhIzY3JCQiMFQ3VyE9eHZYISM3JCIwd2k7VCdlKEgkISM2NyQ3JCQiMCcqenUwRFFkJSEjNyQiMDJpJ0hQKXBJJCEjNjckJCIwLjk4MFRHZCUhIzckIjA2JTRtK3M2TCEjNjckNyQkIjBjUTR2KzFlJSEjNyQiMF8oZlN6NXVLISM2NyQkIjBaR3Y+aSp5WCEjNyQiME4mR0dFNSNHJCEjNjckNyQkIjBaR3Y+aSp5WCEjNyQiME4mR0dFNSNHJCEjNjckJCIvajcsNHN3WCEjNiQiMDtVMFMxSUgkISM2NyQ3JCQiMCQzdisxWyVlJSEjNyQiMDRPSVdAXUQkISM2NyQkIi8lUiNSVy4lZSUhIzYkIjBqM3BfQHNEJCEjNjckNyQkIi8lUiNSVy4lZSUhIzYkIjBqM3BfQHNEJCEjNjckJCIwOUwmUXo+JGUlISM3JCIwTlg3S004RSQhIzY3JDckJCIwW2psVTE6ZSUhIzckIjAqcGZ4P21wSyEjNjckJCIwOUwmUXo+JGUlISM3JCIwTlg3S004RSQhIzY3JDckJCIwW2psVTE6ZSUhIzckIjAqcGZ4P21wSyEjNjckJCIwY1E0disxZSUhIzckIjBfKGZTejV1SyEjNjckNyQkIjA0ajBYZyQpZSUhIzckIjBkQzNLW2RCJCEjNjckJCIwI1E+XFxhJ2UlISM3JCIwRj9pKDR5V0shIzY3JDckJCIwI1E+XFxhJ2UlISM3JCIwRj9pKDR5V0shIzY3JCQiMCQzdisxWyVlJSEjNyQiMDRPSVdAXUQkISM2NyQ3JCQiME92LklTQWYlISM3JCIwIilcPidwRztLISM2NyQkIjAmR15lO18iZiUhIzckIjBiVlsoKSoqKT5LISM2NyQ3JCQiMCZHXmU7XyJmJSEjNyQiMGJWWygpKiopPkshIzY3JCQiMCZmZGFkQyFmJSEjNyQiMDFSJSpHJkhFSyEjNjckNyQkIjA9X3hTVCEqZSUhIzckIjAiPmBEL01LSyEjNjckJCIwJmZkYWRDIWYlISM3JCIwMVIlKkcmSEVLISM2NyQ3JCQiMD1feFNUISplJSEjNyQiMCI+YEQvTUtLISM2NyQkIjA0ajBYZyQpZSUhIzckIjBkQzNLW2RCJCEjNjckNyQkIjBpKD1dLDcnZiUhIzckIjBzJFxibGonPiQhIzY3JCQiMD1KXTgnKVJmJSEjNyQiMD5iVEtmdT8kISM2NyQ3JCQiMD1KXTgnKVJmJSEjNyQiMD5iVEtmdT8kISM2NyQkIjBPdi5JU0FmJSEjNyQiMCIpXD4ncEc7SyEjNjckNyQkIjAqKSoqKioqKioqKipmJSEjNyQiMCUpNFVIKXp3SiEjNjckJCIwWVVMJD4oKSlmJSEjNyQiMFp5RkF5RD0kISM2NyQ3JCQiMFlVTCQ+KCkpZiUhIzckIjBaeUZBeUQ9JCEjNjckJCIwPDglZSsocGYlISM3JCIwPm1RZSRIIz4kISM2NyQ3JCQiMFBgR01Qa2YlISM3JCIwJG9ZdCg9XT4kISM2NyQkIjA8OCVlKyhwZiUhIzckIjA+bVFlJEgjPiQhIzY3JDckJCIwUGBHTVBrZiUhIzckIjAkb1l0KD1dPiQhIzY3JCQiMGkoPV0sNydmJSEjNyQiMHMkXGJsaic+JCEjNi0lJkNPTE9SRzYmJSRSR0JHJCIoXnVpJyEiKCQiKF51aSchIigkIihedWknISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzZlXHI3JDckJCIvUjk6QHBgSyEjNiQiMG9jNVVcWF8qISM2NyQkIjBhJXBHYW5gSyEjNyQiMFFVUTJmc18qISM2NyQ3JCQiMGElcEdhbmBLISM3JCIwUVVRMmZzXyohIzY3JCQiMGJJcDR2T0QkISM3JCIwLj8+azh0XyohIzY3JDckJCIwWiMqcCoqKWZgSyEjNyQiMHVJWGkqcFImKiEjNjckJCIwYklwNHZPRCQhIzckIjAuPz5rOHRfKiEjNjckNyQkIjBaIypwKiopZmBLISM3JCIwdUlYaSpwUiYqISM2NyQkIjAkRygqXHJmYEshIzckIjBvY2Q3LythKiEjNjckNyQkIjBHZilmRl9gSyEjNyQiLyI+XzxTQGIqISM1NyQkIjAkRygqXHJmYEshIzckIjBvY2Q3LythKiEjNjckNyQkIjBHZilmRl9gSyEjNyQiLyI+XzxTQGIqISM1NyQkIjBqcSUzJT5ORCQhIzckIjA8NTMmUnBfJiohIzY3JDckJCIwVF5CcllNRCQhIzckIjBZMmZzIWVrJiohIzY3JCQiMGpxJTMlPk5EJCEjNyQiMDw1MyZScF8mKiEjNjckNyQkIjBUXkJyWU1EJCEjNyQiMFkyZnMhZWsmKiEjNjckJCIwXnF2Jz1XYEshIzckIjB5VUU4JFFsJiohIzY3JDckJCIwN21mJjNQYEshIzckIjAjZWZ3Ny14JiohIzY3JCQiMF5xdic9V2BLISM3JCIweVVFOCRRbCYqISM2NyQ3JCQiMDdtZiYzUGBLISM3JCIwI2VmdzcteCYqISM2NyQkIjA5YCZHWE9gSyEjNyQiMDhbcm1yIXkmKiEjNjckNyQkIjB0UT0+JkhgSyEjNyQiMD0lR0Y9WSplKiEjNjckJCIwOWAmR1hPYEshIzckIjA4W3JtciF5JiohIzY3JDckJCIwdFE9PiZIYEshIzckIjA9JUdGPVkqZSohIzY3JCQiMEo0RVIoR2BLISM3JCIuMzBiZjJmKiEiKjckNyQkIjA0JSpvcj5LRCQhIzckIjBhc3pQLT5nKiEjNjckJCIwSjRFUihHYEshIzckIi4zMGJmMmYqISIqNyQ3JCQiMDQlKm9yPktEJCEjNyQiMGFzelAtPmcqISM2NyQkIjAjZVBjL0BgSyEjNyQiMEwxTnpZTWcqISM2NyQ3JCQiLzx6SVc5YEshIzYkIi80bUdITTknKiEjNTckJCIwI2VQYy9AYEshIzckIjBMMU56WU1nKiEjNjckNyQkIi88eklXOWBLISM2JCIwIjRtR0hNOScqISM2NyQkIjAocCQpPlA4YEshIzckIjBZJD4nUkxoaCohIzY3JDckJCIwNyoqW0xwSUQkISM3JCIwRlwkek15RScqISM2NyQkIjAocCQpPlA4YEshIzckIjBZJD4nUkxoaCohIzY3JDckJCIwNyoqW0xwSUQkISM3JCIwRlwkek15RScqISM2NyQkIjB1QVI9ZElEJCEjNyQiMFgoZWIkPilHJyohIzY3JDckJCIwTUl1VSUqSEQkISM3JCIwalArLkMjUicqISM2NyQkIjB1QVI9ZElEJCEjNyQiMFgoZWIkPilHJyohIzY3JDckJCIwTUl1VSUqSEQkISM3JCIwalArLkMjUicqISM2NyQkIjAjKXlwJTMpSEQkISM3JCIweCMqcG4vOmsqISM2NyQ3JCQiMFZ4IjMoPkhEJCEjNyQiMCpmcyFlaztsKiEjNjckJCIwIyl5cCUzKUhEJCEjNyQiMHgjKnBuLzprKiEjNjckNyQkIjBWeCIzKD5IRCQhIzckIjAqZnMhZWs7bCohIzY3JCQiMEJNJTNaIUhEJCEjNyQiMEBTQU8qPWEnKiEjNjckNyQkIjBFZGA8WEdEJCEjNyQiME45OTgwVG0qISM2NyQkIjBCTSUzWiFIRCQhIzckIjBAU0FPKj1hJyohIzY3JDckJCIwRWRgPFhHRCQhIzckIjBOOTk4MFRtKiEjNjckJCIwS2Zxd0dHRCQhIzckIjBsc19UdG9tKiEjNjckNyQkIjBmUi4kM3hfSyEjNyQiMHItQG9YbG4qISM2NyQkIjBLZnF3R0dEJCEjNyQiMGxzX1R0b20qISM2NyQ3JCQiMGZSLiQzeF9LISM3JCIwci1Ab1hsbiohIzY3JCQiMDxCUi1gRkQkISM3JCIwMmlFJG9ieicqISM2NyQ3JCQiME5aPG4ncF9LISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwPEJSLWBGRCQhIzckIjAyaUUkb2J6JyohIzY3JDckJCIwTlo8bidwX0shIzckIjAyInpLaSkqKW8qISM2NyQkIjBmeHJaeEVEJCEjNyQiMG1NLmlSQXAqISM2NyQ3JCQiMCM9LipwQUVEJCEjNyQiMFd6TXlFOXEqISM2NyQkIjBmeHJaeEVEJCEjNyQiMG1NLmlSQXAqISM2NyQ3JCQiMCM9LipwQUVEJCEjNyQiMFd6TXlFOXEqISM2NyQkIjAqMzhFQGdfSyEjNyQiMEQzMHlAXHEqISM2NyQ3JCQiMCZcXzYqW0REJCEjNyQiL3k7TXQnUXIqISM1NyQkIjAqMzhFQGdfSyEjNyQiMEQzMHlAXHEqISM2NyQ3JCQiMCZcXzYqW0REJCEjNyQiL3k7TXQnUXIqISM1NyQkIjAwSzQocF9fSyEjNyQiMDswRkoud3IqISM2NyQ3JCQiMGxGJTRgWl9LISM3JCIwO2NbKXlJRSgqISM2NyQkIjAwSzQocF9fSyEjNyQiMDswRkoud3IqISM2NyQ3JCQiMGxGJTRgWl9LISM3JCIwO2NbKXlJRSgqISM2NyQkIjAxVTgsX0NEJCEjNyQiMHQicDxVR0koKiEjNjckNyQkIjAib1siKj1TX0shIzckIjBfV2JWWyhRKCohIzY3JCQiMDFVOCxfQ0QkISM3JCIwdCJwPFVHSSgqISM2NyQ3JCQiMCJvWyIqPVNfSyEjNyQiMF9XYlZbKFEoKiEjNjckJCIwR2lnQ3hCRCQhIzckIjAuSycqXGtIdSohIzY3JDckJCIwOyFmZCdHQkQkISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMEdpZ0N4QkQkISM3JCIwLksnKlxrSHUqISM2NyQ3JCQiMDshZmQnR0JEJCEjNyQiMClHQicpKik9XigqISM2NyQkIjApKSp6dEVJX0shIzckIjBXckU7V2N2KiEjNjckNyQkIjBMXnVnYkFEJCEjNyQiMENAcGBIT3cqISM2NyQkIjApKSp6dEVJX0shIzckIjBXckU7V2N2KiEjNjckNyQkIjBMXnVnYkFEJCEjNyQiMENAcGBIT3cqISM2NyQkIjA5TmtIR0FEJCEjNyQiMCQ0eStLS28oKiEjNjckNyQkIjBGJSoqUkY9X0shIzckIi8nNHczcWd4KiEjNTckJCIwOU5rSEdBRCQhIzckIjAkNHkrS0tvKCohIzY3JDckJCIwRiUqKlJGPV9LISM3JCIvJzR3M3FneCohIzU3JCQiMFZFMDZhQEQkISM3JCIwJ2YqXGksNXkqISM2NyQ3JCQiMGhYWzA1QEQkISM3JCIwJ3pIUTFeKXkqISM2NyQkIjBWRTA2YUBEJCEjNyQiMCdmKlxpLDV5KiEjNjckNyQkIjBoWFswNUBEJCEjNyQiMCd6SFExXil5KiEjNjckJCIwLlZ1NiEzX0shIzckIjAiZiM0VnpPeiohIzY3JDckJCIwPShbXnYuX0shIzckIjBMJykqKT1eNCEpKiEjNjckJCIwLlZ1NiEzX0shIzckIjAiZiM0VnpPeiohIzY3JDckJCIwPShbXnYuX0shIzckIjBMJykqKT1eNCEpKiEjNjckJCIwWVxgSjE/RCQhIzckIjBCY1dpY2ohKSohIzY3JDckJCIweSIpKkhfJz5EJCEjNyQiMHB1J1I8UjgpKiEjNjckJCIwWVxgSjE/RCQhIzckIjBCY1dpY2ohKSohIzY3JDckJCIweSIpKkhfJz5EJCEjNyQiMHB1J1I8UjgpKiEjNjckJCIwUCopW3FLPkQkISM3JCIwMkJOP0whPikqISM2NyQ3JCQiME4sIyozJCo9RCQhIzckIjAwai5IS2UjKSohIzY3JCQiMFAqKVtxSz5EJCEjNyQiMDJCTj9MIT4pKiEjNjckNyQkIjBOLCMqMyQqPUQkISM3JCIwMGouSEtlIykqISM2NyQkIjApPWwmR2Y9RCQhIzckIjAjUldwIjQ8JCkqISM2NyQ3JCQiMCNSKilHNiM9RCQhIzckIjBUXjUlR0ZRKSohIzY3JCQiMCk9bCZHZj1EJCEjNyQiMCNSV3AiNDwkKSohIzY3JDckJCIwI1IqKUc2Iz1EJCEjNyQiMFReNSVHRlEpKiEjNjckJCIwKCk0XjAneV5LISM3JCIwJD1LSVhRVykqISM2NyQ3JCQiMHlMIVwkXDxEJCEjNyQiMHhSPFI4MiYpKiEjNjckJCIwKCk0XjAneV5LISM3JCIwJD1LSVhRVykqISM2NyQ3JCQiMHlMIVwkXDxEJCEjNyQiMHhSPFI4MiYpKiEjNjckJCIwVD5hLDg8RCQhIzckIjBaViN6I2ZxJikqISM2NyQ3JCQiMFQseXV4O0QkISM3JCIwOEdDJVI6aikqISM2NyQkIjBUPmEsODxEJCEjNyQiMFpWI3ojZnEmKSohIzY3JDckJCIwVCx5dXg7RCQhIzckIjA4R0MlUjpqKSohIzY3JCQiMEhgSjtTO0QkISM3JCIwLyk+Rk10cCkqISM2NyQ3JCQiL1x5RGpnXkshIzYkIjBcO0pcJWZ2KSohIzY3JCQiMEhgSjtTO0QkISM3JCIwLyk+Rk10cCkqISM2NyQ3JCQiL1x5RGpnXkshIzYkIjBcO0pcJWZ2KSohIzY3JCQiLyYpXCt2Y15LISM2JCIwL3RyJ3BTIykpKiEjNjckNyQkIi9wZCQzTjpEJCEjNiQiMCdbIVEvTiEpKSkqISM2NyQkIi8mKVwrdmNeSyEjNiQiMC90cidwUyMpKSohIzY3JDckJCIvcGQkM046RCQhIzYkIjAnWyFRL04hKSkpKiEjNjckJCIwJD5LRV1cXkshIzckIjB2LEchKnpdKikqISM2NyQ3JCQiMCNmdT1TWV5LISM3JCIwQSRcJWZ2LyEqKiEjNjckJCIwJD5LRV1cXkshIzckIjB2LEchKnpdKikqISM2NyQ3JCQiMCNmdT1TWV5LISM3JCIwQCRcJWZ2LyEqKiEjNjckJCIwYVghUUZVXkshIzckIjBgXUJDX3ghKiohIzY3JDckJCIuJyozOCRSXkshIzUkIjBlIj1YaCJIIioqISM2NyQkIjBhWCFRRlVeSyEjNyQiMGBdQkNfeCEqKiEjNjckNyQkIi4nKjM4JFJeSyEjNSQiMGUiPVhoIkgiKiohIzY3JCQiMEdXcWpdOEQkISM3JCIwbjU5KVJVPyoqISM2NyQ3JCQiMCZ6ND9DS15LISM3JCIwJSpwZXBjYCMqKiEjNjckJCIwR1dxal04RCQhIzckIjBuNTkpUlU/KiohIzY3JDckJCIwJno0P0NLXkshIzckIjAlKnBlcGNgIyoqISM2NyQkIjA2IVxBKHk3RCQhIzckIjBDUEU3JjRMKiohIzY3JDckJCIwNEhvKT1EXkshIzckIi8kZWxDKHpQKiohIzU3JCQiMDYhXEEoeTdEJCEjNyQiMENQRTcmNEwqKiEjNjckNyQkIjA0SG8pPUReSyEjNyQiLyRlbEMoelAqKiEjNTckJCIwdCp6JCpwP15LISM3JCIwZSt6bWxkJSoqISM2NyQ3JCQiMCJweEc6PV5LISM3JCIwbVlzelAtJioqISM2NyQkIjB0KnokKnA/XkshIzckIjBlK3ptbGQlKiohIzY3JDckJCIwInB4Rzo9XkshIzckIjBtWXN6UC0mKiohIzY3JCQiMGtEMVhONkQkISM3JCIvXEo9Y1ZlKiohIzU3JDckJCIwRUp6TTY2RCQhIzckIjAtTnpNeUUnKiohIzY3JCQiMGtEMVhONkQkISM3JCIvXEo9Y1ZlKiohIzU3JDckJCIwRUp6TTY2RCQhIzckIjAtTnpNeUUnKiohIzY3JCQiMCgqKnkiNGs1RCQhIzckIjAocGx4XDVyKiohIzY3JDckJCIwW2o5TVQ1RCQhIzckIjBRQicpKik9XigqKiEjNjckJCIwKCoqeSI0azVEJCEjNyQiMChwbHhcNXIqKiEjNjckNyQkIjBbajlNVDVEJCEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBlQHYiSCo0RCQhIzckIjAtJD5YUHgkKSoqISM2NyQ3JCQiMFVLKDQ6KDREJCEjNyQiMHY2JFwlZnYpKiohIzY3JCQiMGVAdiJIKjREJCEjNyQiMC0kPlhQeCQpKiohIzY3JDckJCIwVUsoNDooNEQkISM3JCIwdjYkXCVmdikqKiEjNjckJCIwdy9nIz4jNEQkISM3JCIwKlx1RT5XJyoqKiEjNjckNyQkIjBjWz4mPSE0RCQhIzckIjAsKysrKysrIiEjNTckJCIwdy9nIz4jNEQkISM3JCIwKlx1RT5XJyoqKiEjNjckNyQkIjA7Y1wnPmRkSyEjNyQiMCJRJlJJLT8kKikhIzY3JCQiMC9gd20pXGRLISM3JCIwUipbIj5gRCUqKSEjNjckNyQkIjAvYHdtKVxkSyEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMERrIj5xXGRLISM3JCIweFc6XSR6VSopISM2NyQ3JCQiMF48P1k3dUQkISM3JCIwd3hAdSQqXCYqKSEjNjckJCIwRGsiPnFcZEshIzckIjB4VzpdJHpVKikhIzY3JDckJCIwXjw/WTd1RCQhIzckIjB3eEB1JCpcJiopISM2NyQkIi9qRSQpKTN1RCQhIzYkIjBGRGRsO2ImKikhIzY3JDckJCIwMihIdmtLZEshIzckIjA3bUdITXUnKikhIzY3JCQiL2pFJCkpM3VEJCEjNiQiMEZEZGw7YiYqKSEjNjckNyQkIjAyKEh2a0tkSyEjNyQiMDdtR0hNdScqKSEjNjckJCIwRDgwKTRLZEshIzckIjAjekxpIVIjbyopISM2NyQ3JCQiME4mUjUyQ2RLISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwRDgwKTRLZEshIzckIjAjekxpIVIjbyopISM2NyQ3JCQiME4mUjUyQ2RLISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwbTVOSkxzRCQhIzckIjA3R0lyZzQpKikhIzY3JDckJCIwdiVHbF46ZEshIzckIjAlR0MlUjpCKiopISM2NyQkIjBtNU5KTHNEJCEjNyQiMDdHSXJnNCkqKSEjNjckNyQkIjB2JUdsXjpkSyEjNyQiMCVHQyVSOkIqKikhIzY3JCQiMHJ0LSllOWRLISM3JCIwOWdUaCJvJCoqKSEjNjckNyQkIjB2NyNRKXBxRCQhIzckIi83JFwlZnYvISohIzU3JCQiMHJ0LSllOWRLISM3JCIwOWdUaCJvJCoqKSEjNjckNyQkIjB2NyNRKXBxRCQhIzckIi83JFwlZnYvISohIzU3JCQiMChSPXonZXFEJCEjNyQiME5CNHgsaysqISM2NyQ3JCQiMG1rIkhaKXBEJCEjNyQiMGM+Y1wnPjwhKiEjNjckJCIwKFI9eidlcUQkISM3JCIwTkI0eCxrKyohIzY3JDckJCIwbWsiSFopcEQkISM3JCIwYz5jXCc+PCEqISM2NyQkIjAkKlImNDwocEQkISM3JCIvcmMmPUAiPiEqISM1NyQ3JCQiMDRQdSQpKipvRCQhIzckIjAjeklZcWpIISohIzY3JCQiMCQqUiY0PChwRCQhIzckIi9yYyY9QCI+ISohIzU3JDckJCIwNFB1JCkqKm9EJCEjNyQiMCN6SVlxakghKiEjNjckJCIwRDo3KFwpb0QkISM3JCIwYCdcZSlSPS4qISM2NyQ3JCQiMCc+KUg7Om9EJCEjNyQiMEgnKnBmeD8vKiEjNjckJCIwRDo3KFwpb0QkISM3JCIwYCdcZSlSPS4qISM2NyQ3JCQiMCc+KUg7Om9EJCEjNyQiMEgnKnBmeD8vKiEjNjckJCIwTTBSWSl6Y0shIzckIjBHKW8hemRYLyohIzY3JDckJCIwLChILzJ0Y0shIzckIjBsJW9aIj1YMCohIzY3JCQiME0wUlkpemNLISM3JCIwRylvIXpkWC8qISM2NyQ3JCQiMCwoSC8ydGNLISM3JCIwbCVvWiI9WDAqISM2NyQkIjBOeGM9N25EJCEjNyQiMCcqUiQpKVxGZCEqISM2NyQ3JCQiMEVuP1lZbUQkISM3JCIwLHQkKXBlcDEqISM2NyQkIjBOeGM9N25EJCEjNyQiMCcqUiQpKVxGZCEqISM2NyQ3JCQiMEVuP1lZbUQkISM3JCIwLHQkKXBlcDEqISM2NyQkIjBfa3E4RW1EJCEjNyQiMHNUKFw5KipwISohIzY3JDckJCIwW1ZWVmlsRCQhIzckIjBQaCFcIypSeiEqISM2NyQkIjBfa3E4RW1EJCEjNyQiMHNUKFw5KipwISohIzY3JDckJCIwW1ZWVmlsRCQhIzckIjBQaCFcIypSeiEqISM2NyQkIjA+P3NKU2xEJCEjNyQiME0zdzwyRjMqISM2NyQ3JCQiMC5FMGl5a0QkISM3JCIwdFwoKnpSPTQqISM2NyQkIjA+P3NKU2xEJCEjNyQiME0zdzwyRjMqISM2NyQ3JCQiMC5FMGl5a0QkISM3JCIwdFwoKnpSPTQqISM2NyQkIi9qJlFzYWtEJCEjNiQiMFF3I3pAVSY0KiEjNjckNyQkIjA+OjItJlJjSyEjNyQiMDRRL04hRy8iKiEjNjckJCIvaiZRc2FrRCQhIzYkIjBRdyN6QFUmNCohIzY3JDckJCIwPjoyLSZSY0shIzckIjA0US9OIUcvIiohIzY3JCQiMCkpKXpkJHBqRCQhIzckIjBEKDRfazgzIiohIzY3JDckJCIwTSVbTDtKY0shIzckIjBYRTYhNHM7IiohIzY3JCQiMCkpKXpkJHBqRCQhIzckIjBEKDRfazgzIiohIzY3JDckJCIwTSVbTDtKY0shIzckIjBYRTYhNHM7IiohIzY3JCQiMCJwYjxVR2NLISM3JCIwIz0mMytdMzcqISM2NyQ3JCQiMDRGJ2YlR2lEJCEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMCJwYjxVR2NLISM3JCIwIz0mMytdMzcqISM2NyQ3JCQiMDRGJ2YlR2lEJCEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMGonKVFJKj5jSyEjNyQiMEA6SiNHY0wiKiEjNjckNyQkIjBZInknXFhoRCQhIzckIjA9LkQrLTs5KiEjNjckJCIwaicpUUkqPmNLISM3JCIwQDpKI0djTCIqISM2NyQ3JCQiMFkieSdcWGhEJCEjNyQiMD0uRCstOzkqISM2NyQkIjBHY1ZoOWhEJCEjNyQiMHYlb0VcRlkiKiEjNjckNyQkIjAjcHhYRjFjSyEjNyQiMGEiPmBEL2EiKiEjNjckJCIwR2NWaDloRCQhIzckIjB2JW9FXEZZIiohIzY3JDckJCIwI3B4WEYxY0shIzckIjBhIj5gRC9hIiohIzY3JCQiL1E2XCwuY0shIzYkIjAzJzM2aikqZSIqISM2NyQ3JCQiMHh4Wj8hKWZEJCEjNyQiLyp6UTUkW20iKiEjNTckJCIvUTZcLC5jSyEjNiQiMDMnMzZqKSplIiohIzY3JDckJCIweHhaPyEpZkQkISM3JCIvKnpRNSRbbSIqISM1NyQkIjBzPG8hZiVmRCQhIzckIjBlPzEpcHByIiohIzY3JDckJCIwJzRhdHkqZUQkISM3JCIwRW9YbEIqeSIqISM2NyQkIjBzPG8hZiVmRCQhIzckIjBlPzEpcHByIiohIzY3JDckJCIwJzRhdHkqZUQkISM3JCIwRW9YbEIqeSIqISM2NyQkIjBbeXIpPSdlRCQhIzckIjByO2kkcFMlPSohIzY3JDckJCIwPkM9djplRCQhIzckIjBpY18/azg+KiEjNjckJCIwW3lyKT0nZUQkISM3JCIwcjtpJHBTJT0qISM2NyQ3JCQiMD5DPXY6ZUQkISM3JCIwaWNfP2s4PiohIzY3JCQiMFRjIiozeWREJCEjNyQiMDMzNz07cj4qISM2NyQ3JCQiMHJLJ1FRdGJLISM3JCIwKVwlZnYvUT8qISM2NyQkIjBUYyIqM3lkRCQhIzckIjAzMzc9O3I+KiEjNjckNyQkIjBySydRUXRiSyEjNyQiMClcJWZ2L1E/KiEjNjckJCIwOlhKXiVwYkshIzckIjBjS1ZyQyk0IyohIzY3JDckJCIwSDRPOF9jRCQhIzckIjBNTG1JWGlAKiEjNjckJCIwOlhKXiVwYkshIzckIjBjS1ZyQyk0IyohIzY3JDckJCIwSDRPOF9jRCQhIzckIjBNTG1JWGlAKiEjNjckJCIwdE1zOjZjRCQhIzckIjBLOTxhS0RBKiEjNjckNyQkIjA2JnpOMWRiSyEjNyQiMHJAdCZlb0cjKiEjNjckJCIwdE1zOjZjRCQhIzckIjBLOTxhS0RBKiEjNjckNyQkIjA2JnpOMWRiSyEjNyQiMHJAdCZlb0cjKiEjNjckJCIwd1M2LUdiRCQhIzckIjBIbFVtUl9CKiEjNjckNyQkIjB4KG9YJCpbYkshIzckIjAyNSEzazdUIyohIzY3JCQiMHdTNi1HYkQkISM3JCIwSGxVbVJfQiohIzY3JDckJCIweChvWCQqW2JLISM3JCIwMjUhM2s3VCMqISM2NyQkIjB1N2A1WGFEJCEjNyQiMDhXMDNZekMqISM2NyQ3JCQiMFZXOkUzYUQkISM3JCIwVilwZXBjYCMqISM2NyQkIjB1N2A1WGFEJCEjNyQiMDhXMDNZekMqISM2NyQ3JCQiMFZXOkUzYUQkISM3JCIwVilwZXBjYCMqISM2NyQkIjBPVnFTaWBEJCEjNyQiMHVKIyp6XjFFKiEjNjckNyQkIjBjNEJRRmBEJCEjNyQiMHonUTR2K20jKiEjNjckJCIwT1ZxU2lgRCQhIzckIjB1SiMqel4xRSohIzY3JDckJCIwYzRCUUZgRCQhIzckIjB6J1E0dittIyohIzY3JCQiMFI1cSMqel9EJCEjNyQiMCdbOj1vTnQjKiEjNjckNyQkIjBzTiQ0bkNiSyEjNyQiMDp2KzFbJXkjKiEjNjckJCIwUjVxIyp6X0QkISM3JCIwJ1s6PW9OdCMqISM2NyQ3JCQiMHNOJDRuQ2JLISM3JCIwOnYrMVsleSMqISM2NyQkIjB2Im9qdz5iSyEjNyQiMCxFQTloZ0cqISM2NyQ3JCQiMCllIilSaTtiSyEjNyQiMF5qMmgpKTNIKiEjNjckJCIwdiJvanc+YkshIzckIjAsRUE5aGdHKiEjNjckNyQkIjApZSIpUmk7YkshIzckIjBeajJoKSkzSCohIzY3JCQiMCMzLj1jNmJLISM3JCIwOEMkb1p3KUgqISM2NyQ3JCQiMD1fYShmM2JLISM3JCIwKD1YaCJITEkqISM2NyQkIjAjMy49YzZiSyEjNyQiMDhDJG9adylIKiEjNjckNyQkIjA9X2EoZjNiSyEjNyQiMCg9WGgiSExJKiEjNjckJCIuaXh5TF1EJCEjNSQiMCQqNFFxbjlKKiEjNjckNyQkIjBbdE0iZitiSyEjNyQiMEJTQHJwZEoqISM2NyQkIi5peHlMXUQkISM1JCIwJCo0UXFuOUoqISM2NyQ3JCQiMFt0TSJmK2JLISM3JCIwQlNAcnBkSiohIzY3JCQiMC9yPjxfXEQkISM3JCIwJ0dlXipwVEsqISM2NyQ3JCQiMC1gVDBFXEQkISM3JCIvJ0dHRTUjRyQqISM1NyQkIjAvcj48X1xEJCEjNyQiMCdHZV4qcFRLKiEjNjckNyQkIjAtYFQwRVxEJCEjNyQiLydHR0U1I0ckKiEjNTckJCIuLj94cVtEJCEjNSQiMC5JdF1yb0wqISM2NyQ3JCQiMHBLdFJZW0QkISM3JCIwJ3BeODNsUyQqISM2NyQkIi4uP3hxW0QkISM1JCIwLkl0XXJvTCohIzY3JDckJCIwcEt0UllbRCQhIzckIjAncF44M2xTJCohIzY3JCQiL15NJWUqeWFLISM2JCIwLDpCUXMmXCQqISM2NyQ3JCQiMDtqOiVwd2FLISM3JCIwSzBVTyI0YCQqISM2NyQkIi9eTSVlKnlhSyEjNiQiMCw6QlFzJlwkKiEjNjckNyQkIjA7ajolcHdhSyEjNyQiMEswVU8iNGAkKiEjNjckJCIwYm8yaDNaRCQhIzckIjBeZTNkc0FPKiEjNjckNyQkIjAlRz4obyhvYUshIzckIjBvJCpbIj5gbCQqISM2NyQkIjBibzJoM1pEJCEjNyQiMF5lM2RzQU8qISM2NyQ3JCQiMCVHPihvKG9hSyEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMCYpNDAmeWlhSyEjNyQiMGwzYTJzXFAqISM2NyQ3JCQiMHhXS2ozWUQkISM3JCIwLyNlbEMoelAqISM2NyQkIjAmKTQwJnlpYUshIzckIjBsM2Eyc1xQKiEjNjckNyQkIjB4V0tqM1lEJCEjNyQiMC8jZWxDKHpQKiEjNjckJCIwKlJLLHRhYUshIzckIjAiUjsuNG4oUSohIzY3JDckJCIwLXAleihIWEQkISM3JCIvL0Y7SVQhUiohIzU3JCQiMCpSSyx0YWFLISM3JCIwIlI7LjRuKFEqISM2NyQ3JCQiMC1wJXooSFhEJCEjNyQiLy9GO0lUIVIqISM1NyQkIjAzN1MncFlhSyEjNyQiMGpiOjBwLlMqISM2NyQ3JCQiMFE7WDdeV0QkISM3JCIwd2VwY2BHUyohIzY3JCQiMDM3UydwWWFLISM3JCIwamI6MHAuUyohIzY3JDckJCIwUTtYN15XRCQhIzckIjB3ZXBjYEdTKiEjNjckJCIwZk9zJG9RYUshIzckIjBcc1tfbUlUKiEjNjckNyQkIjAlZWBvRVBhSyEjNyQiMDdadzYlSDolKiEjNjckJCIwZk9zJG9RYUshIzckIjBcc1tfbUlUKiEjNjckNyQkIjAlZWBvRVBhSyEjNyQiMDdadzYlSDolKiEjNjckJCIvcjNAcElhSyEjNiQiMEdGR0tqZFUqISM2NyQ3JCQiMClvMDZXSGFLISM3JCIwXE4kb1l0RiUqISM2NyQkIi9yM0BwSWFLISM2JCIwR0ZHS2pkVSohIzY3JDckJCIwKW8wNldIYUshIzckIjBcTiRvWXRGJSohIzY3JCQiMFUibzhzQWFLISM3JCIwOmI5WGYlUSUqISM2NyQ3JCQiMCZlel1qQGFLISM3JCIwJlEtPl88UyUqISM2NyQkIjBVIm84c0FhSyEjNyQiMDpiOVhmJVElKiEjNjckNyQkIjAmZXpdakBhSyEjNyQiMCZRLT5fPFMlKiEjNjckJCIwOlhcclpURCQhIzckIjBrJSo0Ilw6XiUqISM2NyQ3JCQiMGhfc1tRVEQkISM3JCIwQDcocGRoXyUqISM2NyQkIjA6WFxyWlREJCEjNyQiMGslKjQiXDpeJSohIzY3JDckJCIwaF9zW1FURCQhIzckIjBANyhwZGhfJSohIzY3JCQiMDtmVlVvU0QkISM3JCIwTzVKcVxRWSohIzY3JDckJCIwXDAtIzMxYUshIzckIjBkKy9LY11ZKiEjNjckJCIwO2ZWVW9TRCQhIzckIjBPNUpxXFFZKiEjNjckNyQkIjBcMC0jMzFhSyEjNyQiMGQrL0tjXVkqISM2NyQkIjBBaDtNKilSRCQhIzckIjAyVidHUWF3JSohIzY3JDckJCIwYEwlXEwpUkQkISM3JCIwJCopM3JvXHglKiEjNjckJCIwQWg7TSopUkQkISM3JCIwMlYnR1FhdyUqISM2NyQ3JCQiMGBMJVxMKVJEJCEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMFptXVk1UkQkISM3JCIwKmVKJEhQIypbKiEjNjckNyQkIjBjTUoyMVJEJCEjNyQiMEh4PFVQKipbKiEjNjckJCIwWm1dWTVSRCQhIzckIjAqZUokSFAjKlsqISM2NyQ3JCQiMGNNSjIxUkQkISM3JCIwSHg8VVAqKlsqISM2NyQkIjAqXHImekpRRCQhIzckIjA+dE00ST5dKiEjNjckNyQkIjBZckUqKkdRRCQhIzckIjBsbEMoelAtJiohIzY3JCQiMCpcciZ6SlFEJCEjNyQiMD50TTRJPl0qISM2NyQ3JCQiMFlyRSoqR1FEJCEjNyQiMGxsQyh6UC0mKiEjNjckJCIwaiMpPUxgUEQkISM3JCIwUlZZQkFZXiohIzY3JDckJCIwM1dpNV9QRCQhIzckIjAtYUpfPVteKiEjNjckJCIwaiMpPUxgUEQkISM3JCIwUlZZQkFZXiohIzY3JDckJCIwM1dpNV9QRCQhIzckIjAtYUpfPVteKiEjNjckJCIvUjk6QHBgSyEjNiQiMG9jNVVcWF8qISM2NyQ3JCQiMFZvWiI9WGhLISM3JCIwLis7RC5ZUykhIzY3JCQiMCVHVFUlRzlFJCEjNyQiMCcpKik9XjR3UykhIzY3JDckJCIwJUdUVSVHOUUkISM3JCIwJykqKT1eNHdTKSEjNjckJCIvJD5EJnlVaEshIzYkIjBBI29Yam8yJSkhIzY3JDckJCIvM3hlPkxoSyEjNiQiMEF5RDFdK1UpISM2NyQkIi8kPkQmeVVoSyEjNiQiMEEjb1hqbzIlKSEjNjckNyQkIi8zeGU+TGhLISM2JCIwQXlEMV0rVSkhIzY3JCQiMFlQNSUqRzhFJCEjNyQiMDNeNzBXL1UpISM2NyQ3JCQiMGxUbnNON0UkISM3JCIwZW1LaCFcSyUpISM2NyQkIjBZUDUlKkc4RSQhIzckIjAzXjcwVy9VKSEjNjckNyQkIjBsVG5zTjdFJCEjNyQiMGVtS2ghXEslKSEjNjckJCIwL1IjKkhJN0UkISM3JCIwNCQ0IyozP0wlKSEjNjckNyQkIjBsJlxaKFI2RSQhIzckIjAlXCZSO0pcVykhIzY3JCQiMC9SIypISTdFJCEjNyQiMDQkNCMqMz9MJSkhIzY3JDckJCIwbCZcWihSNkUkISM3JCIwJVwmUjtKXFcpISM2NyQkIjBjJ1JHPjhoSyEjNyQiMCh6N2tvJmZXKSEjNjckNyQkIjA9bzItVzVFJCEjNyQiL0xrOTxQZCUpISM1NyQkIjBjJ1JHPjhoSyEjNyQiMCh6N2tvJmZXKSEjNjckNyQkIjA9bzItVzVFJCEjNyQiL0xrOTxQZCUpISM1NyQkIi8veEZRLmhLISM2JCIvdHNwPnJlJSkhIzU3JDckJCIwejxJYVs0RSQhIzckIjBtSmBFNylwJSkhIzY3JCQiLy94RlEuaEshIzYkIi90c3A+cmUlKSEjNTckNyQkIjB6PElhWzRFJCEjNyQiMG1KYEU3KXAlKSEjNjckJCIwNyEzJSpmJDRFJCEjNyQiMGw0JT5pWXIlKSEjNjckNyQkIjAmeWE6TCYzRSQhIzckIjAuP2ciR0QjWykhIzY3JCQiMDchMyUqZiQ0RSQhIzckIjBsNCU+aVlyJSkhIzY3JDckJCIwJnlhOkwmM0UkISM3JCIwLj9nIkdEI1spISM2NyQkIjBybCVHJVEzRSQhIzckIi8oPiY0Jz5VWykhIzU3JDckJCIwInovUSRlMkUkISM3JCIwUjNuTyRwJVwpISM2NyQkIjBybCVHJVEzRSQhIzckIi8oPiY0Jz5VWykhIzU3JDckJCIwInovUSRlMkUkISM3JCIwUjNuTyRwJVwpISM2NyQkIjAmUiUqSDZ1Z0shIzckIjA2NUs5c3BcKSEjNjckNyQkIjA+YCY0T21nSyEjNyQiMHYnUjxSODImKSEjNjckJCIwJlIlKkg2dWdLISM3JCIwNjVLOXNwXCkhIzY3JDckJCIwPmAmNE9tZ0shIzckIjB2J1I8UjgyJikhIzY3JCQiMC1OIyk0VzFFJCEjNyQiMDN5OCNRczQmKSEjNjckNyQkIjAqZVJGInAwRSQhIzckIjA2JjNvV2Q+JikhIzY3JCQiMC1OIyk0VzFFJCEjNyQiMDN5OCNRczQmKSEjNjckNyQkIjAqZVJGInAwRSQhIzckIjA2JjNvV2Q+JikhIzY3JCQiMEQyLkxaMEUkISM3JCIwX1dQbHVDXykhIzY3JDckJCIwcylRIipbWmdLISM3JCIwWnQoPV0sSyYpISM2NyQkIjBEMi5MWjBFJCEjNyQiMF9XUGx1Q18pISM2NyQ3JCQiMHMpUSIqW1pnSyEjNyQiMFp0KD1dLEsmKSEjNjckJCIwaChbRDNYZ0shIzckIjBYbkNrQ19gKSEjNjckNyQkIjA5TEshNFFnSyEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwaChbRDNYZ0shIzckIjBYbkNrQ19gKSEjNjckNyQkIjA5TEshNFFnSyEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwVDNgZWEuRSQhIzckIjBsTEV5dHphKSEjNjckNyQkIi9YX2VyR2dLISM2JCIwPl0sNycqb2IpISM2NyQkIjBUM2BlYS5FJCEjNyQiMGxMRXl0emEpISM2NyQ3JCQiL1hfZXJHZ0shIzYkIjA+XSw3JypvYikhIzY3JCQiLyk9bWdlLUUkISM2JCIwN1lWM0EyYykhIzY3JDckJCIwRiY0Zk8+Z0shIzckIjBiUTNuTyRwJikhIzY3JCQiLyk9bWdlLUUkISM2JCIwN1lWM0EyYykhIzY3JDckJCIwRiY0Zk8+Z0shIzckIjBiUTNuTyRwJikhIzY3JCQiMFViKCkpRztnSyEjNyQiMCk9dFwmcE1kKSEjNjckNyQkIjB4eElTKyxFJCEjNyQiMCNwX0BzeCJlKSEjNjckJCIwVWIoKSlHO2dLISM3JCIwKT10XCZwTWQpISM2NyQ3JCQiMHh4SVMrLEUkISM3JCIwI3BfQHN4ImUpISM2NyQkIjBtKEdLdTFnSyEjNyQiMERscDw7aWUpISM2NyQ3JCQiMDtILFIyK0UkISM3JCIwRzpBeDxVZikhIzY3JCQiMG0oR0t1MWdLISM3JCIwRGxwPDtpZSkhIzY3JDckJCIwO0gsUjIrRSQhIzckIjBHOkF4PFVmKSEjNjckJCIwRXVYQnMqZkshIzckIi9gXnU+JyopZikhIzU3JDckJCIvPHo9WSIqZkshIzYkIjBrLkhLZW1nKSEjNjckJCIwRXVYQnMqZkshIzckIi9gXnU+JyopZikhIzU3JDckJCIvPHo9WSIqZkshIzYkIjBrLkhLZW1nKSEjNjckJCIwMC5lSHgpZkshIzckIjB0ejwlcHE2JykhIzY3JDckJCIweUgkKjNBKWZLISM3JCIuI2Z0KSk0PicpISIqNyQkIjAwLmVIeClmSyEjNyQiMHR6PCVwcTYnKSEjNjckNyQkIjB5SCQqM0EpZkshIzckIi4jZnQpKTQ+JykhIio3JCQiMCNbaDpFeWZLISM3JCIwTjUqejVYQycpISM2NyQ3JCQiMDRgMCEpSChmSyEjNyQiME8hR0MlUjpqKSEjNjckJCIwI1toOkV5ZkshIzckIjBONSp6NVhDJykhIzY3JDckJCIwNGAwISlIKGZLISM3JCIwTyFHQyVSOmopISM2NyQkIjAtYjc+KW9mSyEjNyQiLyZSeFIlPlAnKSEjNTckNyQkIjA6eTJ2UCdmSyEjNyQiMHNvXCgqelJrKSEjNjckJCIwLWI3PilvZkshIzckIi8mUnhSJT5QJykhIzU3JDckJCIwOnkydlAnZkshIzckIjBzb1woKnpSaykhIzY3JCQiMGFQSS0lZmZLISM3JCIwcGdVKm8kKlwnKSEjNjckNyQkIjBAKVFTZmFmSyEjNyQiMDNkY18/a2wpISM2NyQkIjBhUEktJWZmSyEjNyQiMHBnVSpvJCpcJykhIzY3JDckJCIwQClRU2ZhZkshIzckIjAzZGNfP2tsKSEjNjckJCIwMyF5NCxdZkshIzckIi9cRXQmeUVtKSEjNTckNyQkIjAmUkVvVlhmSyEjNyQiMFhYajJoKW8nKSEjNjckJCIwMyF5NCxdZkshIzckIi9cRXQmeUVtKSEjNTckNyQkIjAmUkVvVlhmSyEjNyQiMFhYajJoKW8nKSEjNjckJCIwKip5PVgxJWZLISM3JCIwRSJbTCU+YW4pISM2NyQ3JCQiMCVcN01JT2ZLISM3JCIwIlEuRjtJIm8pISM2NyQkIjAqKnk9WDElZkshIzckIjBFIltMJT5hbikhIzY3JDckJCIwJVw3TUlPZkshIzckIjAiUS5GO0kibykhIzY3JCQiMDxJay84JGZLISM3JCIwakBVW2YiKW8pISM2NyQ3JCQiMCgpKilmJD5GZkshIzckIjA8QXg8VVBwKSEjNjckJCIwPElrLzgkZkshIzckIjBqQFVbZiIpbykhIzY3JDckJCIwKCkqKWYkPkZmSyEjNyQiMDxBeDxVUHApISM2NyQkIjBQOFIqKT4jZkshIzckIjB2WlJzKSozcSkhIzY3JDckJCIwcilSdTU9ZkshIzckIjBgNSVHRj0xKCkhIzY3JCQiMFA4UiopPiNmSyEjNyQiMHZaUnMpKjNxKSEjNjckNyQkIjByKVJ1NT1mSyEjNyQiMGA1JUdGPTEoKSEjNjckJCIwcyYqSCpwN2ZLISM3JCIwT0xwOlBPcikhIzY3JDckJCIwUigzWy80ZkshIzckIjAqKSk0ektpPSgpISM2NyQkIjBzJipIKnA3ZkshIzckIjBPTHA6UE9yKSEjNjckNyQkIjBSKDNbLzRmSyEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMEpRVU1NIWZLISM3JCIwTno4eXVqcykhIzY3JDckJCIwQCJcYysrZkshIzckIjBEKHlIUTFKKCkhIzY3JCQiMEpRVU1NIWZLISM3JCIwTno4eXVqcykhIzY3JDckJCIwQCJcYysrZkshIzckIjBEKHlIUTFKKCkhIzY3JCQiLyI0UyU+JSplSyEjNiQiMG9KKjM7NlIoKSEjNjckNyQkIjAsYSYpKik0KmVLISM3JCIwaHYvUS9OdSkhIzY3JCQiLyI0UyU+JSplSyEjNiQiMG9KKjM7NlIoKSEjNjckNyQkIjAsYSYpKik0KmVLISM3JCIwaHYvUS9OdSkhIzY3JCQiME9eVHpcKWVLISM3JCIwLiFvTHclPXYpISM2NyQ3JCQiMCplI1EoKj4pZUshIzckIjAoUjtKXCVmdikhIzY3JCQiME9eVHpcKWVLISM3JCIwLiFvTHclPXYpISM2NyQ3JCQiMCplI1EoKj4pZUshIzckIjAoUjtKXCVmdikhIzY3JCQiMCc9MSMqeXZlSyEjNyQiMFxyUidHZWsoKSEjNjckNyQkIjBOIVwiR0koZUshIzckIjBNXz1bJlFvKCkhIzY3JCQiMCc9MSMqeXZlSyEjNyQiMFxyUidHZWsoKSEjNjckNyQkIjBOIVwiR0koZUshIzckIjBNXz1bJlFvKCkhIzY3JCQiMEVseUJtJ2VLISM3JCIwTzElKkg8dHgpISM2NyQ3JCQiMDs5MiMza2VLISM3JCIvMmFLZyMzeSkhIzU3JCQiMEVseUJtJ2VLISM3JCIwTzElKkg8dHgpISM2NyQ3JCQiMDs5MiMza2VLISM3JCIvMmFLZyMzeSkhIzU3JCQiMFAkb0lbZGVLISM3JCIwYStHJTQwIXopISM2NyQ3JCQiMFU9N2ZeJmVLISM3JCIwMUhLZW1LeikhIzY3JCQiMFAkb0lbZGVLISM3JCIwYStHJTQwIXopISM2NyQ3JCQiMFU9N2ZeJmVLISM3JCIwMUhLZW1LeikhIzY3JCQiMG5DKm9PW2VLISM3JCIwNmQjKnokeS0pKSEjNjckNyQkIjAlKipbImZpJWVLISM3JCIwVTxSODJkISkpISM2NyQkIjBuQypvT1tlSyEjNyQiMDZkIyp6JHktKSkhIzY3JDckJCIwJSoqWyJmaSVlSyEjNyQiMFU8UjgyZCEpKSEjNjckJCIwXExNdiNSZUshIzckIjAiKW9nJ2VeOikpISM2NyQ3JCQiMG4jM0FRUGVLISM3JCIweTBZb1oiPSkpISM2NyQkIjBcTE12I1JlSyEjNyQiMCIpb2cnZV46KSkhIzY3JDckJCIwbiMzQVFQZUshIzckIjB5MFlvWiI9KSkhIzY3JCQiMDNPQTMtJGVLISM3JCIwTmsmXHJDRykpISM2NyQ3JCQiMHZBOkcmR2VLISM3JCIwOSVITiMpZUkpKSEjNjckJCIwM09BMy0kZUshIzckIjBOayZcckNHKSkhIzY3JDckJCIwdkE6RyZHZUshIzckIjA5JUhOIyllSSkpISM2NyQkIjApPmpgO0BlSyEjNyQiMDwnPmJ3KDQlKSkhIzY3JDckJCIwJj0+b3A+ZUshIzckIi9EKWZ5R0klKSkhIzU3JCQiMCk+amA7QGVLISM3JCIwPCc+YncoNCUpKSEjNjckNyQkIjAmPT5vcD5lSyEjNyQiL0QpZnlHSSUpKSEjNTckJCIwKlxlbzk3ZUshIzckIjAjUigpenRxYCkpISM2NyQ3JCQiMEYpMyQpKTMiZUshIzckIjAoM25PJHBhJikpISM2NyQkIjAqXGVvOTdlSyEjNyQiMCNSKCl6dHFgKSkhIzY3JDckJCIwRikzJCkpMyJlSyEjNyQiMCgzbk8kcGEmKSkhIzY3JCQiMHZAYF9KIWVLISM3JCIwdyRHSGpWbSkpISM2NyQ3JCQiMFJRVi1AIWVLISM3JCIwQmZ0KSk0eicpKSEjNjckJCIwdkBgX0ohZUshIzckIjB3JEdIalZtKSkhIzY3JDckJCIwUlFWLUAhZUshIzckIjBCZnQpKTR6JykpISM2NyQkIjAqZkNCPSV6RCQhIzckIjBqUGBdayJ6KSkhIzY3JDckJCIweXI7Ukx6RCQhIzckIjBmWiFRL04hKSkpISM2NyQkIjAqZkNCPSV6RCQhIzckIjBqUGBdayJ6KSkhIzY3JDckJCIweXI7Ukx6RCQhIzckIjBmWiFRL04hKSkpISM2NyQkIjB3Sz9PX3lEJCEjNyQiMFl4ITQ+Kj0qKSkhIzY3JDckJCIwJCk9WylmJXlEJCEjNyQiMCZmdCkpNHojKikpISM2NyQkIjB3Sz9PX3lEJCEjNyQiMFl4ITQ+Kj0qKSkhIzY3JDckJCIwJCk9WylmJXlEJCEjNyQiMCZmdCkpNHojKikpISM2NyQkIjBeLClSSndkSyEjNyQiMDZMbGE9WSEqKSEjNjckNyQkIjBrNT4hKWV4RCQhIzckIjBKQyVSOkIwKikhIzY3JCQiMF4sKVJKd2RLISM3JCIwNkxsYT1ZISopISM2NyQ3JCQiMGs1PiEpZXhEJCEjNyQiMEpDJVI6QjAqKSEjNjckJCIvXDJjVG5kSyEjNiQiMD5OIz5XTTwqKSEjNjckNyQkIjBjQEYlPW5kSyEjNyQiMG43LDRzdyIqKSEjNjckJCIvXDJjVG5kSyEjNiQiMD5OIz5XTTwqKSEjNjckNyQkIjBjQEYlPW5kSyEjNyQiMG43LDRzdyIqKSEjNjckJCIwL3BAVCZlZEshIzckIjBqakhfcCskKikhIzY3JDckJCIwdm0lM15lZEshIzckIjAuLDNrNywkKikhIzY3JCQiMC9wQFQmZWRLISM3JCIwampIX3ArJCopISM2NyQ3JCQiMHZtJTNeZWRLISM3JCIwLiwzazcsJCopISM2NyQkIjA7Y1wnPmRkSyEjNyQiMCJRJlJJLT8kKikhIzY3JDckJCIvMmVrO0xsSyEjNiQiL1clKT5SbUl6ISM1NyQkIjBqdXNXJkhsSyEjNyQiMDpLZGVvWyR6ISM2NyQ3JCQiMGp1c1cmSGxLISM3JCIwOktkZW9bJHohIzY3JCQiLzdzSldIbEshIzYkIjBeJTRyeilcJHohIzY3JDckJCIwKT1LZCYpPWxLISM3JCIwXj9rODR0JXohIzY3JCQiLzdzSldIbEshIzYkIjBeJTRyeilcJHohIzY3JDckJCIwKT1LZCYpPWxLISM3JCIwXj9rODR0JXohIzY3JCQiMDBWWGIlPWxLISM3JCIuUXckM3laeiEiKjckNyQkIjAlUSNvJj4zbEshIzckIjAoKTNyb1woZnohIzY3JCQiMDBWWGIlPWxLISM3JCIuUXckM3laeiEiKjckNyQkIjAlUSNvJj4zbEshIzckIjAoKTNyb1woZnohIzY3JCQiMHVRJyopXDJsSyEjNyQiMFshKkdxczAneiEjNjckNyQkIjA0O09rdlxFJCEjNyQiMEIoelAtPnN6ISM2NyQkIjB1UScqKVwybEshIzckIjBbISpHcXMwJ3ohIzY3JDckJCIwNDtPa3ZcRSQhIzckIjBCKHpQLT5zeiEjNjckJCIwYiEqW3RsXEUkISM3JCIwVFVPZGpMKHohIzY3JDckJCIwYiFRPCdwW0UkISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBiISpbdGxcRSQhIzckIjBUVU9kakwoeiEjNjckNyQkIjBiIVE8J3BbRSQhIzckIjBmJlspeUlZKXohIzY3JCQiMCVcaSp5Y1tFJCEjNyQiMFJgP1hgaCl6ISM2NyQ3JCQiMHgyaChRd2tLISM3JCIwJlI8UjgyKCp6ISM2NyQkIjAlXGkqeWNbRSQhIzckIjBSYD9YYGgpeiEjNjckNyQkIjB4MmgoUXdrSyEjNyQiMCZSPFI4MigqeiEjNjckJCIvcmJeIltaRSQhIzYkIjBpXGFNVSopKnohIzY3JDckJCIwKilSIj4lZVlFJCEjNyQiMEppKSopPV40ISkhIzY3JCQiL3JiXiJbWkUkISM2JCIwaVxhTVUqKSp6ISM2NyQ3JCQiMCopUiI+JWVZRSQhIzckIjBKaSkqKT1eNCEpISM2NyQkIjAmUTM/KVJZRSQhIzckIi9ed2ItdDYhKSEjNTckNyQkIi52c0NgWEUkISM1JCIwbl0wV18+LSkhIzY3JCQiMCZRMz8pUllFJCEjNyQiL153Yi10NiEpISM1NyQ3JCQiLnZzQ2BYRSQhIzUkIjBuXTBXXz4tKSEjNjckJCIweCFHJ3pKWEUkISM3JCIwM14menJeQyEpISM2NyQ3JCQiMEpva05bV0UkISM3JCIwLlI3KkhSTSEpISM2NyQkIjB4IUcnekpYRSQhIzckIjAzXiZ6cl5DISkhIzY3JDckJCIwSm9rTltXRSQhIzckIjAuUjcqSFJNISkhIzY3JCQiMGo3XDJDV0UkISM3JCIwMCVmTEpJUCEpISM2NyQ3JCQiMCVmQFtQTWtLISM3JCIwUkY+YUxvLykhIzY3JCQiMGo3XDJDV0UkISM3JCIwMCVmTEpJUCEpISM2NyQ3JCQiMCVmQFtQTWtLISM3JCIwUkY+YUxvLykhIzY3JCQiMHpQJWVtSmtLISM3JCIwVTYrNikzXSEpISM2NyQ3JCQiMGUtK1VSVUUkISM3JCIwdjpFNHUjZiEpISM2NyQkIjB6UCVlbUprSyEjNyQiMFU2KzYpM10hKSEjNjckNyQkIjBlLStVUlVFJCEjNyQiMHY6RTR1I2YhKSEjNjckJCIwVihSViY0VUUkISM3JCIwcCQqKT5AKEcxKSEjNjckNyQkIjBjPUFQTlRFJCEjNyQiMDYvTGs5PDIpISM2NyQkIjBWKFJWJjRVRSQhIzckIjBwJCopPkAoRzEpISM2NyQ3JCQiMGM9QVBOVEUkISM3JCIwNi9Mazk8MikhIzY3JCQiL1omKkhGNWtLISM2JCIwejxGO2JjMikhIzY3JDckJCIwJSlRRmdKU0UkISM3JCIwWiMqUj5iVDMpISM2NyQkIi9aJipIRjVrSyEjNiQiMHo8RjtiYzIpISM2NyQ3JCQiMCUpUUZnSlNFJCEjNyQiMFojKlI+YlQzKSEjNjckJCIwKkcnb0AnKlJFJCEjNyQiMD0iW1VzVikzKSEjNjckNyQkIjBaPzE2R1JFJCEjNyQiMCQzb1dkZic0KSEjNjckJCIwKkcnb0AnKlJFJCEjNyQiMD0iW1VzVikzKSEjNjckNyQkIjBaPzE2R1JFJCEjNyQiMCQzb1dkZic0KSEjNjckJCIwJTRRLCsqUUUkISM3JCIwJUgoek89NzUpISM2NyQ3JCQiMEFrYCpbI1FFJCEjNyQiMD5wYEhPITQiKSEjNjckJCIwJTRRLCsqUUUkISM3JCIwJUgoek89NzUpISM2NyQ3JCQiMEFrYCpbI1FFJCEjNyQiMD5wYEhPITQiKSEjNjckJCIwS29fMyV5akshIzckIjBZXk5gKSpSNikhIzY3JDckJCIwb1xuJj5zakshIzckIjBiZGclb1pAIikhIzY3JCQiMEtvXzMleWpLISM3JCIwWV5OYCkqUjYpISM2NyQ3JCQiMG9cbiY+c2pLISM3JCIwYmRnJW9aQCIpISM2NyQkIjBoKHBsJXlPRSQhIzckIjBtI0dbeHhFIikhIzY3JDckJCIweDZKSD5PRSQhIzckIjAiZnUnUjxSOCkhIzY3JCQiMGgocGwleU9FJCEjNyQiMG0jR1t4eEUiKSEjNjckNyQkIjB4NkpIPk9FJCEjNyQiMCJmdSdSPFI4KSEjNjckJCIwdE44OXRORSQhIzckIjAvVGssYyZSIikhIzY3JDckJCIwci9LIXBeakshIzckIjBGTXUlek5ZIikhIzY3JCQiMHROODl0TkUkISM3JCIwL1RrLGMmUiIpISM2NyQ3JCQiMHIvSyFwXmpLISM3JCIwRk11JXpOWSIpISM2NyQkIjBBekk2b01FJCEjNyQiLz46TkxMXyIpISM1NyQ3JCQiMDd6ank5TUUkISM3JCIwakEiKVwpemUiKSEjNjckJCIwQXpJNm9NRSQhIzckIi8+Ok5MTF8iKSEjNTckNyQkIjA3emp5OU1FJCEjNyQiMGpBIilcKXplIikhIzY3JCQiMCI+OnhMT2pLISM3JCIwSkJscjReOykhIzY3JDckJCIwPEY7JUhKakshIzckIjAqNCIpWyFSNzwpISM2NyQkIjAiPjp4TE9qSyEjNyQiMEpCbHI0XjspISM2NyQ3JCQiMDxGOyVISmpLISM3JCIwKjQiKVshUjc8KSEjNjckJCIwJyoqKlEkKmVLRSQhIzckIjBPWCVmXil5PCkhIzY3JDckJCIwQXElbzhAakshIzckIjBOKlwqZnpPPSkhIzY3JCQiMCcqKipRJCplS0UkISM3JCIwT1glZl4peTwpISM2NyQ3JCQiMEFxJW84QGpLISM3JCIwTipcKmZ6Tz0pISM2NyQkIjA0ZUZ5YUpFJCEjNyQiMGNJZG1mMT4pISM2NyQ3JCQiMClwdGwrNmpLISM3JCIwcig9XSw3Jz4pISM2NyQkIjA0ZUZ5YUpFJCEjNyQiMGNJZG1mMT4pISM2NyQ3JCQiMClwdGwrNmpLISM3JCIwcig9XSw3Jz4pISM2NyQkIjApXFxANDBqSyEjNyQiMGFMRENMTT8pISM2NyQ3JCQiL3Y1SyE0SUUkISM2JCIwM3czcWcmMyMpISM2NyQkIjApXFxANDBqSyEjNyQiMGFMRENMTT8pISM2NyQ3JCQiL3Y1SyE0SUUkISM2JCIwM3czcWcmMyMpISM2NyQkIjBZdzBOWkhFJCEjNyQiMGtnJCkpZT87IykhIzY3JDckJCIwWjl2RTNIRSQhIzckIjBXazpELDVBKSEjNjckJCIwWXcwTlpIRSQhIzckIjBrZyQpKWU/OyMpISM2NyQ3JCQiMFo5dkUzSEUkISM3JCIwV2s6RCw1QSkhIzY3JCQiMG1UbzFXR0UkISM3JCIwLVpMaHgqRyMpISM2NyQ3JCQiMDtGJ3B4IUdFJCEjNyQiL0dELT1XTCMpISM1NyQkIjBtVG8xV0dFJCEjNyQiMC1aTGh4KkcjKSEjNjckNyQkIjA7RidweCFHRSQhIzckIi9HRC09V0wjKSEjNTckJCIwLl0zMlRGRSQhIzckIjApKSlwOiVbPEMpISM2NyQ3JCQiL2MyUnZxaUshIzYkIjA7VEhOIyllQykhIzY3JCQiMC5dMzJURkUkISM3JCIwKSkpcDolWzxDKSEjNjckNyQkIi9jMlJ2cWlLISM2JCIwO1RITiMpZUMpISM2NyQkIjAsRDVPUUVFJCEjNyQiMEpyL0k9WEQpISM2NyQ3JCQiMCopeVZkMkVFJCEjNyQiMF9ITyFIS2UjKSEjNjckJCIwLEQ1T1FFRSQhIzckIjBKci9JPVhEKSEjNjckNyQkIjAqKXlWZDJFRSQhIzckIjBfSE8hSEtlIykhIzY3JCQiMD48byRmYGlLISM3JCIwL0UlcHNHbiMpISM2NyQ3JCQiMCMzanV5XWlLISM3JCIwKXlKYU13cSMpISM2NyQkIjA+PG8kZmBpSyEjNyQiMC9FJXBzR24jKSEjNjckNyQkIjAjM2p1eV1pSyEjNyQiMCl5SmFNd3EjKSEjNjckJCIwJHpEKHpMQ0UkISM3JCIwJipvY0tiK0cpISM2NyQ3JCQiMG4kXFIlM0NFJCEjNyQiMEMxXSsvS0cpISM2NyQkIjAkekQoekxDRSQhIzckIjAmKm9jS2IrRykhIzY3JDckJCIwbiRcUiUzQ0UkISM3JCIwQzFdKy9LRykhIzY3JCQiMCJva1M+TGlLISM3JCIwTF9ZWkFHSCkhIzY3JDckJCIwZG50RTRCRSQhIzckIjBoJXBiWGsmSCkhIzY3JCQiMCJva1M+TGlLISM3JCIwTF9ZWkFHSCkhIzY3JDckJCIwZG50RTRCRSQhIzckIjBoJXBiWGsmSCkhIzY3JCQiMDtVa09JQUUkISM3JCIwLTgiPSgpZTAkKSEjNjckNyQkIjAkcFpkLkBpSyEjNyQiMChIUTFeMzMkKSEjNjckJCIwO1VrT0lBRSQhIzckIjAtOCI9KCllMCQpISM2NyQ3JCQiMCRwWmQuQGlLISM3JCIwKEhRMV4zMyQpISM2NyQkIjA3VEMySEBFJCEjNyQiMFE5SjFhJD0kKSEjNjckNyQkIjB0ViIzPDZpSyEjNyQiMExycWxEMEspISM2NyQkIjA3VEMySEBFJCEjNyQiMFE5SjFhJD0kKSEjNjckNyQkIjB0ViIzPDZpSyEjNyQiMExycWxEMEspISM2NyQkIjAjUV9mIUc/RSQhIzckIjBMTW9dPTZMKSEjNjckNyQkIjBqKkg/TCxpSyEjNyQiMHBmeD9tSEwpISM2NyQkIjAjUV9mIUc/RSQhIzckIjBMTW9dPTZMKSEjNjckNyQkIjBqKkg/TCxpSyEjNyQiMHBmeD9tSEwpISM2NyQkIjBDRWVLRj5FJCEjNyQiMHlcXzAjKVFNKSEjNjckNyQkIjBAJSo+Pjo+RSQhIzckIjAwWyVlblNYJCkhIzY3JCQiMENFZUtGPkUkISM3JCIweVxfMCMpUU0pISM2NyQ3JCQiMEAlKj4+Oj5FJCEjNyQiMDBbJWVuU1gkKSEjNjckJCIwJWVscW8jPUUkISM3JCIwSCJlNVprYyQpISM2NyQ3JCQiLyMqKkdLPD1FJCEjNiQiMFRPIjR0JXlOKSEjNjckJCIwJWVscW8jPUUkISM3JCIwSCJlNVprYyQpISM2NyQ3JCQiLyMqKkdLPD1FJCEjNiQiMFRPIjR0JXlOKSEjNjckJCIvPGgkcEU8RSQhIzYkIjBUOVRaMSVwJCkhIzY3JDckJCIwTShvNyg+PEUkISM3JCIweEMpZnlHcSQpISM2NyQkIi88aCRwRTxFJCEjNiQiMFQ5VFoxJXAkKSEjNjckNyQkIjBNKG83KD48RSQhIzckIjB4QylmeUdxJCkhIzY3JCQiMGhBNnpFO0UkISM3JCIwMSt0Tm5AUSkhIzY3JDckJCIwTG15TkE7RSQhIzckIjA4ODBUR0ZRKSEjNjckJCIwaEE2ekU7RSQhIzckIjAxK3RObkBRKSEjNjckNyQkIjBMbXlOQTtFJCEjNyQiMDg4MFRHRlEpISM2NyQkIjAvTFQ7RjpFJCEjNyQiMCMpNHJORlxSKSEjNjckNyQkIjAvNSdmX19oSyEjNyQiLzo/aCpvXlIpISM1NyQkIjAvTFQ7RjpFJCEjNyQiMCMpNHJORlxSKSEjNjckNyQkIjAvNSdmX19oSyEjNyQiLzo/aCpvXlIpISM1NyQkIjBWb1oiPVhoSyEjNyQiMC4rO0QuWVMpISM2NyQ3JCQiMCdIUjk6QHBLISM3JCIwVCM9WVViLHYhIzY3JCQiL2soKkhPNnBLISM2JCIwKnlLaSkqKT1eKCEjNjckNyQkIi9rKCpITzZwSyEjNiQiMCp5S2kpKik9XighIzY3JCQiMClvKlFnNSJwSyEjNyQiMHpdcFU4QV4oISM2NyQ3JCQiMGAiSE1oKipvSyEjNyQiMEQ7SVRJVl8oISM2NyQkIjApbypRZzUicEshIzckIjB6XXBVOEFeKCEjNjckNyQkIjBgIkhNaCoqb0shIzckIjBEO0lUSVZfKCEjNjckJCIwckFHXCopKm9LISM3JCIwRVFXSlVdXyghIzY3JDckJCIwVzxqJyp5KW9LISM3JCIwaC9QJzR4T3YhIzY3JCQiMHJBR1wqKSpvSyEjNyQiMEVRV0pVXV8oISM2NyQ3JCQiMFc8aicqeSlvSyEjNyQiMGgvUCc0eE92ISM2NyQkIjBrQiFRKG8pb0shIzckIjApb2FmKyh5YCghIzY3JDckJCIwbigpUjdpKG9LISM3JCIwKEhSOTpAXHYhIzY3JCQiMGtCIVEobylvSyEjNyQiMClvYWYrKHlgKCEjNjckNyQkIjBuKClSN2kob0shIzckIjAoSFI5OkBcdiEjNjckJCIwTWtxTFsob0shIzckIi9hM3FtcF12ISM1NyQ3JCQiMCV5ZzFja29LISM3JCIwTCIzbD9saHYhIzY3JCQiME1rcUxbKG9LISM3JCIvYTNxbXBddiEjNTckNyQkIjAleWcxY2tvSyEjNyQiMEwiM2w/bGh2ISM2NyQkIjAuaCopR0cnb0shIzckIjBDMyNcQF9qdiEjNjckNyQkIjBkKEc4JUgmb0shIzckIjBwcGRoIzR1diEjNjckJCIwLmgqKUdHJ29LISM3JCIwQzMjXEBfanYhIzY3JDckJCIwZChHOCVIJm9LISM3JCIwcHBkaCM0dXYhIzY3JCQiMCd6VyRmMyZvSyEjNyQiMF9ueFxZamQoISM2NyQ3JCQiMG9ROGE4JW9LISM3JCIwMWVrO0xsZSghIzY3JCQiMCd6VyRmMyZvSyEjNyQiMF9ueFxZamQoISM2NyQ3JCQiMG9ROGE4JW9LISM3JCIwMGVrO0xsZSghIzY3JCQiMDIqPlkjKlFvSyEjNyQiMGVNJ0gocCIqZSghIzY3JDckJCIveSc+KnpIb0shIzYkIjBUWXJydCopZighIzY3JCQiMDIqPlkjKlFvSyEjNyQiMGVNJ0gocCIqZSghIzY3JDckJCIveSc+KnpIb0shIzYkIjBUWXJydCopZighIzY3JCQiMFAnW1wtRm9LISM3JCIwSkN2JD0qPmcoISM2NyQ3JCQiMEMsQncjPW9LISM3JCIweU15RTk5aCghIzY3JCQiMFAnW1wtRm9LISM3JCIwSkN2JD0qPmcoISM2NyQ3JCQiMEMsQncjPW9LISM3JCIweU15RTk5aCghIzY3JCQiMFlvKipmXiJvSyEjNyQiMHddQCRHIltoKCEjNjckNyQkIjB3TTImeTFvSyEjNyQiMDlCJj1bJlFpKCEjNjckJCIwWW8qKmZeIm9LISM3JCIwd11AJEciW2goISM2NyQ3JCQiMHdNMiZ5MW9LISM3JCIwOUImPVsmUWkoISM2NyQkIjA+eFtITCFvSyEjNyQiMCUpKlFBRmpGdyEjNjckNyQkIjBjTCJlSyZ6RSQhIzckIi86QHBgSE93ISM1NyQkIjA+eFtITCFvSyEjNyQiMCUpKlFBRmpGdyEjNjckNyQkIjBjTCJlSyZ6RSQhIzckIi86QHBgSE93ISM1NyQkIjBhT2pMOnpFJCEjNyQiLzZWLDpYU3chIzU3JDckJCIwLzU1KSpReUUkISM3JCIwJykqKik+ZnRbdyEjNjckJCIwYU9qTDp6RSQhIzckIi82Viw6WFN3ISM1NyQ3JCQiMC81NSkqUXlFJCEjNyQiMCcpKiopPmZ0W3chIzY3JCQiMHRLJz54em5LISM3JCIvIipRJT1wS2woISM1NyQ3JCQiMFB3Ly1EeEUkISM3JCIwQSllcWs8aHchIzY3JCQiMHRLJz54em5LISM3JCIvIipRJT1wS2woISM1NyQ3JCQiMFB3Ly1EeEUkISM3JCIwQSllcWs8aHchIzY3JCQiMHl3aVchb25LISM3JCIwIik9a3cmM213ISM2NyQ3JCQiMDAxSFA2d0UkISM3JCIwZXc3LTxPbighIzY3JCQiMHl3aVchb25LISM3JCIwIik9a3cmM213ISM2NyQ3JCQiMDAxSFA2d0UkISM3JCIwZXc3LTxPbighIzY3JCQiME1yPF5qdkUkISM3JCIwdlM+RSwqeXchIzY3JDckJCIwPEQiUiEpXG5LISM3JCIwJVwnPmRkZ28oISM2NyQkIjBNcjxeanZFJCEjNyQiMHZTPkUsKnl3ISM2NyQ3JCQiMDxEIlIhKVxuSyEjNyQiMCVcJz5kZGdvKCEjNjckJCIvJCo+PXBXbkshIzYkIjBCd1VtOjxwKCEjNjckNyQkIjBDXHUsJlFuSyEjNyQiL0xsQSIpXClwKCEjNTckJCIvJCo+PXBXbkshIzYkIjBCd1VtOjxwKCEjNjckNyQkIjBDXHUsJlFuSyEjNyQiL0xsQSIpXClwKCEjNTckJCIwQiJbaDFMbkshIzckIjB3MGwpKkdYcSghIzY3JDckJCIwYHRuSXNzRSQhIzckIjBtVExuUTRyKCEjNjckJCIwQiJbaDFMbkshIzckIjB3MGwpKkdYcSghIzY3JDckJCIwYHRuSXNzRSQhIzckIjBtVExuUTRyKCEjNjckJCIwdWI8dTlzRSQhIzckIjAqWz1HN008eCEjNjckNyQkIjBCN2MhKmZyRSQhIzckIjAtSVNBekxzKCEjNjckJCIwdWI8dTlzRSQhIzckIjAqWz1HN008eCEjNjckNyQkIjBCN2MhKmZyRSQhIzckIjAtSVNBekxzKCEjNjckJCIwTz11Oio0bkshIzckIjBDZVdSXyx0KCEjNjckNyQkIjB0dEUieS9uSyEjNyQiMFE9Wng+ZXQoISM2NyQkIjBPPXU6KjRuSyEjNyQiMENlV1JfLHQoISM2NyQ3JCQiMHR0RSJ5L25LISM3JCIwUT1aeD5ldCghIzY3JCQiLzMyMlIpcEUkISM2JCIwVTQpKltpSHUoISM2NyQ3JCQiMGZRdi1PcEUkISM3JCIwdTFhS2cjW3ghIzY3JCQiLzMyMlIpcEUkISM2JCIwVTQpKltpSHUoISM2NyQ3JCQiMGZRdi1PcEUkISM3JCIwdTFhS2cjW3ghIzY3JCQiMCp5OyopKm9vRSQhIzckIjAmSD4+OnhieCEjNjckNyQkIjB4eChbWCNvRSQhIzckIi9eNHczcWd4ISM1NyQkIjAqeTsqKSpvb0UkISM3JCIwJkg+Pjp4YnghIzY3JDckJCIweHgoW1gjb0UkISM3JCIvXjR3M3FneCEjNTckJCIwKipRSVNhbkUkISM3JCIwNmZaW3omb3ghIzY3JDckJCIvIlxfUDhuRSQhIzYkIjBZJHlFOTl0eCEjNjckJCIwKipRSVNhbkUkISM3JCIwNmZaW3omb3ghIzY3JDckJCIvIlxfUDhuRSQhIzYkIjBZJHlFOTl0eCEjNjckJCIwUkRqOVNtRSQhIzckIjA0clNSJ1EieSghIzY3JDckJCIwbE1hXS1tRSQhIzckIjAjPVp4PmUmeSghIzY3JCQiMFJEajlTbUUkISM3JCIwNHJTUidRInkoISM2NyQ3JCQiMGxNYV0tbUUkISM3JCIwIz1aeD5lJnkoISM2NyQkIjB5aiQ9aV9tSyEjNyQiMHNiI1xBPiV6KCEjNjckNyQkIjBtI3lRPlxtSyEjNyQiMD1nIkdELSl6KCEjNjckJCIweWokPWlfbUshIzckIjBzYiNcQT4leighIzY3JDckJCIwbSN5UT5cbUshIzckIjA9ZyJHRC0peighIzY3JCQiMGEkXD1FVG1LISM3JCIwQEpDMCgqcCF5ISM2NyQ3JCQiMFUqSHU7UW1LISM3JCIwYVspeUlZNXkhIzY3JCQiMGEkXD1FVG1LISM3JCIwQEpDMCgqcCF5ISM2NyQ3JCQiMFUqSHU7UW1LISM3JCIwYVspeUlZNXkhIzY3JCQiMF9OY00qSG1LISM3JCIvejAyMyEpPnkhIzU3JDckJCIwV3g6cnJpRSQhIzckIi9wYEhPIUgjeSEjNTckJCIwX05jTSpIbUshIzckIi96MDIzISk+eSEjNTckNyQkIjBXeDpycmlFJCEjNyQiL3BgSE8hSCN5ISM1NyQkIjBfXG1SJz1tSyEjNyQiMGUvS18uRSR5ISM2NyQ3JCQiL0BqWj87bUshIzYkIjBFRC09V2AkeSEjNjckJCIwX1xtUic9bUshIzckIjBlL0tfLkUkeSEjNjckNyQkIi9Aalo/O21LISM2JCIwRUQtPVdgJHkhIzY3JCQiMG8uQHh0Z0UkISM3JCIwaFwhKj4wYSV5ISM2NyQ3JCQiMGw4R29fZ0UkISM3JCIwaTg0dCV5WnkhIzY3JCQiMG8uQHh0Z0UkISM3JCIwaFwhKj4wYSV5ISM2NyQ3JCQiMGw4R29fZ0UkISM3JCIwaTg0dCV5WnkhIzY3JCQiMHVpJ3A5J2ZFJCEjNyQiMCUzM1VlP2V5ISM2NyQ3JCQiMFQiMzpPJWZFJCEjNyQiMCk+ZyJHRC0neSEjNjckJCIwdWkncDknZkUkISM3JCIwJTMzVWU/ZXkhIzY3JDckJCIwVCIzOk8lZkUkISM3JCIwKT5nIkdELSd5ISM2NyQkIjApelgpW1xlRSQhIzckIjAiUTNiYStyeSEjNjckNyQkIjA+XFUlWyRlRSQhIzckIjBNIUhLZW1zeSEjNjckJCIwKXpYKVtcZUUkISM3JCIwIlEzYmErcnkhIzY3JDckJCIwPlxVJVskZUUkISM3JCIwTSFIS2Vtc3khIzY3JCQiMG1xIkd5dGxLISM3JCIwYiEzUlMhUSl5ISM2NyQ3JCQiMEE6J3Bqc2xLISM3JCIvKHlIUTFeKXkhIzU3JCQiMG1xIkd5dGxLISM3JCIwYiEzUlMhUSl5ISM2NyQ3JCQiMEE6J3Bqc2xLISM3JCIvKHlIUTFeKXkhIzU3JCQiMF93a1tFY0UkISM3JCIwb0I6ZyxtKnkhIzY3JDckJCIwc20jKj09Y0UkISM3JCIwMW5PJHBhKCp5ISM2NyQkIjBfd2tbRWNFJCEjNyQiMG9COmcsbSp5ISM2NyQ3JCQiMHNtIyo9PWNFJCEjNyQiMDFuTyRwYSgqeSEjNjckJCIuVEZZOmJFJCEjNSQiMCd5V1ciKVI0eiEjNjckNyQkIjAiUW4tLl5sSyEjNyQiMFZiVlsoKSo0eiEjNjckJCIuVEZZOmJFJCEjNSQiMCd5V1ciKVI0eiEjNjckNyQkIjAiUW4tLl5sSyEjNyQiMFZiVlsoKSo0eiEjNjckJCIwd3pZdi9hRSQhIzckIjB3eF5uJD5BeiEjNjckNyQkIjB3VHdxLWFFJCEjNyQiMHpWXS5HQyN6ISM2NyQkIjB3ell2L2FFJCEjNyQiMHd4Xm4kPkF6ISM2NyQ3JCQiMHdUd3EtYUUkISM3JCIwelZdLkdDI3ohIzY3JCQiLzJlaztMbEshIzYkIi9XJSk+Um1JeiEjNTckNyQkIjBCMFVPIjR0SyEjNyQiMFlvNzImcDVyISM2NyQkIjBoIlstI2ZJRiQhIzckIjBPKy5DI3o4ciEjNjckNyQkIjBoIlstI2ZJRiQhIzckIjBPKy5DI3o4ciEjNjckJCIwOSIzNCJlSUYkISM3JCIwaFk3KCkpKlE2KCEjNjckNyQkIjBLLF5OSUhGJCEjNyQiMHMpKTR6S2k3KCEjNjckJCIwOSIzNCJlSUYkISM3JCIwaFk3KCkpKlE2KCEjNjckNyQkIjBLLF5OSUhGJCEjNyQiMHMpKTR6S2k3KCEjNjckJCIwbnFkKlsjSEYkISM3JCIwPnBSY21uNyghIzY3JDckJCIwUGc/KT0hR0YkISM3JCIwM3g7TXQnUXIhIzY3JCQiMG5xZCpbI0hGJCEjNyQiMD5wUmNtbjcoISM2NyQ3JCQiMFBnPyk9IUdGJCEjNyQiMDN4O010J1FyISM2NyQkIi9bQCM0I3pzSyEjNiQiMFtMRyVIalJyISM2NyQ3JCQiMGpGd3h0RUYkISM3JCIwV2xCKlE2XnIhIzY3JCQiL1tAIzQjenNLISM2JCIwW0xHJUhqUnIhIzY3JDckJCIwakZ3eHRFRiQhIzckIjBXbEIqUTZeciEjNjckJCIvY2UjcGZFRiQhIzYkIjBYRWwtKVxfciEjNjckNyQkIjBBa0YvWURGJCEjNyQiL1EwVldianIhIzU3JCQiL2NlI3BmRUYkISM2JCIwWEVsLSlcX3IhIzY3JDckJCIwQWtGL1lERiQhIzckIi9RMFZXYmpyISM1NyQkIjBSandwRkRGJCEjNyQiMC1ZRCI9T2xyISM2NyQ3JCQiLzhRdic9Q0YkISM2JCIwO1VQKlwqZjwoISM2NyQkIjBSandwRkRGJCEjNyQiMC1ZRCI9T2xyISM2NyQ3JCQiLzhRdic9Q0YkISM2JCIwO1VQKlwqZjwoISM2NyQkIi8+YS9oUnNLISM2JCIuNi1KQyN5ciEiKjckNyQkIjBiXVVuIkhzSyEjNyQiMF9JV2FOJSk9KCEjNjckJCIvPmEvaFJzSyEjNiQiLjYtSkMjeXIhIio3JDckJCIwYl1VbiJIc0shIzckIjBfSVdhTiUpPSghIzY3JCQiMFwiPTdcRXNLISM3JCIuYkdfJjMiPighIio3JDckJCIwJHBCUF07c0shIzckIjApKT1eNHczPyghIzY3JCQiMFwiPTdcRXNLISM3JCIuYkdfJjMiPighIio3JDckJCIwJHBCUF07c0shIzckIjApKT1eNHczPyghIzY3JCQiMCdRbj1UOHNLISM3JCIwKm9mY2ElUj8oISM2NyQ3JCQiMG4nNGsoUT9GJCEjNyQiMEMyZWs7TEAoISM2NyQkIjAnUW49VDhzSyEjNyQiMCpvZmNhJVI/KCEjNjckNyQkIjBuJzRrKFE/RiQhIzckIjBDMmVrO0xAKCEjNjckJCIvIykpPXMuP0YkISM2JCIwJCpvIz1UIW9AKCEjNjckNyQkIjA4PDsmRyI+RiQhIzckIi9jXCc+ZGRBKCEjNTckJCIvIykpPXMuP0YkISM2JCIwJCpvIz1UIW9AKCEjNjckNyQkIjA4PDsmRyI+RiQhIzckIi9jXCc+ZGRBKCEjNTckJCIwOkYwc3Q9RiQhIzckIjA3Sj9eaCdIcyEjNjckNyQkIjAybytJKHlySyEjNyQiMCdSPVp4PlFzISM2NyQkIjA6RjBzdD1GJCEjNyQiMDdKP15oJ0hzISM2NyQ3JCQiMDJvK0koeXJLISM3JCIwJ1I9Wng+UXMhIzY3JCQiMDRBRjZXPEYkISM3JCIwMXZRazxEQyghIzY3JDckJCIwSFZtNWk7RiQhIzckIjBLc3lIUTFEKCEjNjckJCIwNEFGNlc8RiQhIzckIjAxdlFrPERDKCEjNjckNyQkIjBIVm01aTtGJCEjNyQiMEtzeUhRMUQoISM2NyQkIjB1JFInKltockshIzckIjAmeVk/RFBicyEjNjckNyQkIjBQZzFGUDpGJCEjNyQiMG9nJlspeUlFKCEjNjckJCIwdSRSJypbaHJLISM3JCIwJnlZP0RQYnMhIzY3JDckJCIwUGcxRlA6RiQhIzckIjBvZyZbKXlJRSghIzY3JCQiMCdwcXFnW3JLISM3JCIwUihbV2hBb3MhIzY3JDckJCIwaVI5ejc5RiQhIzckIjAvXCMqUj5iRighIzY3JCQiMCdwcXFnW3JLISM3JCIwUihbV2hBb3MhIzY3JDckJCIwaVI5ejc5RiQhIzckIjAvXCMqUj5iRighIzY3JCQiMExoU2pkOEYkISM3JCIwR2w1X3k1RyghIzY3JDckJCIwc1pkbSlHckshIzckIi91JCpcKmZ6RyghIzU3JCQiMExoU2pkOEYkISM3JCIwR2w1X3k1RyghIzY3JDckJCIwc1pkbSlHckshIzckIi91JCpcKmZ6RyghIzU3JCQiMFxxT2VIN0YkISM3JCIwKmU4ZidIUkgoISM2NyQ3JCQiMEdbWipbO3JLISM3JCIwd0QxXSsvSSghIzY3JCQiMFxxT2VIN0YkISM3JCIwKmU4ZidIUkgoISM2NyQ3JCQiMEdbWipbO3JLISM3JCIwd0QxXSsvSSghIzY3JCQiMCZvbj4+NXJLISM3JCIwZFUjZSZ6bkkoISM2NyQ3JCQiMCJ5UHU5L3JLISM3JCIwODk4MFRHSighIzY3JCQiMCZvbj4+NXJLISM3JCIwZFUjZSZ6bkkoISM2NyQ3JCQiMCJ5UHU5L3JLISM3JCIwODk4MFRHSighIzY3JCQiMHAhZVFZKDRGJCEjNyQiMCpwZ0gjRyc+dCEjNjckNyQkIjBsaFtTPTRGJCEjNyQiMFwtP2ciR0R0ISM2NyQkIjBwIWVRWSg0RiQhIzckIjAqcGdII0cnPnQhIzY3JDckJCIwbGhbUz00RiQhIzckIjBcLT9nIkdEdCEjNjckJCIwQXElUnglM0YkISM3JCIweV9obnZDTCghIzY3JDckJCIwaXRRbyZ6cUshIzckIjAmM3BfQHNQdCEjNjckJCIwQXElUnglM0YkISM3JCIweV9obnZDTCghIzY3JDckJCIwaXRRbyZ6cUshIzckIjAmM3BfQHNQdCEjNjckJCIwLSwyQUAyRiQhIzckIi9GOi4+S1h0ISM1NyQ3JCQiMG5hMkp0MUYkISM3JCIwQHpMcWksTighIzY3JCQiMC0sMkFAMkYkISM3JCIvRjouPktYdCEjNTckNyQkIjBuYTJKdDFGJCEjNyQiMEB6THFpLE4oISM2NyQkIjBecDkzJmZxSyEjNyQiL009OHA7ZXQhIzU3JDckJCIwUltbR14wRiQhIzckIjBkblNELkVPKCEjNjckJCIwXnA5MyZmcUshIzckIi9NPThwO2V0ISM1NyQ3JCQiMFJbW0deMEYkISM3JCIwZG5TRC5FTyghIzY3JCQiMD47KT4kcC9GJCEjNyQiL3pfNzIscnQhIzU3JDckJCIwSj1MZ0gvRiQhIzckIjAkZnYvUS92dCEjNjckJCIwPjspPiRwL0YkISM3JCIvel83MixydCEjNTckNyQkIjBKPUxnSC9GJCEjNyQiMCRmdi9RL3Z0ISM2NyQkIjBReVAkUk1xSyEjNyQiMFR6dUlgUVEoISM2NyQ3JCQiMG1TaEUzLkYkISM3JCIwSFdhTiVbKFEoISM2NyQkIjBReVAkUk1xSyEjNyQiMFR6dUlgUVEoISM2NyQ3JCQiMG1TaEUzLkYkISM3JCIwSFdhTiVbKFEoISM2NyQkIjBkMj4jKj0tRiQhIzckIjBkI28tWnAnUighIzY3JDckJCIveitycz1xSyEjNiQiMGxLaCFcIyoqUighIzY3JCQiMGQyPiMqPS1GJCEjNyQiMGQjby1acCdSKCEjNjckNyQkIi96K3JzPXFLISM2JCIwbEtoIVwjKipSKCEjNjckJCIwNGlHRyU0cUshIzckIjBOUkMhXGA0dSEjNjckNyQkIjAvNnBobStGJCEjNyQiMCxAb1hsQlQoISM2NyQkIjA0aUdHJTRxSyEjNyQiME5SQyFcYDR1ISM2NyQ3JCQiMC82cGhtK0YkISM3JCIwLEBvWGxCVCghIzY3JCQiMDFaVCxxKnBLISM3JCIwWVxaIlJQQXUhIzY3JDckJCIwXkxCSVkqcEshIzckIjBQNHYrMVtVKCEjNjckJCIwMVpULHEqcEshIzckIjBZXFoiUlBBdSEjNjckNyQkIjBeTEJJWSpwSyEjNyQiMFA0disxW1UoISM2NyQkIjBZbF82WSlwSyEjNyQiMGMxN3U2X1YoISM2NyQ3JCQiMEtAaUtFKXBLISM3JCIwdCg+ZWxDUHUhIzY3JCQiMFlsXzZZKXBLISM3JCIwYzE3dTZfVighIzY3JDckJCIwS0BpS0UpcEshIzckIjB0KD5lbENQdSEjNjckJCIwSGFdZUEocEshIzckIjB3UmJRWyFbdSEjNjckNyQkIjApKkd4bzEocEshIzckIjA0JykpM3JvXHUhIzY3JCQiMEhhXWVBKHBLISM3JCIwd1JiUVshW3UhIzY3JDckJCIwKSpHeG8xKHBLISM3JCIwNCcpKTNyb1x1ISM2NyQkIjAwTDVVKmZwSyEjNyQiMG4tZCZRKTNZKCEjNjckNyQkIjBNIilbUShlcEshIzckIjBYdSZmdzdpdSEjNjckJCIwMEw1VSpmcEshIzckIjBuLWQmUSkzWSghIzY3JDckJCIwTSIpW1EoZXBLISM3JCIwWHUmZnc3aXUhIzY3JCQiMChwVkFtWnBLISM3JCIvdjlhIj1QWighIzU3JDckJCIwJDQlcFRvJXBLISM3JCIwIkdFNSNvWFooISM2NyQkIjAocFZBbVpwSyEjNyQiL3Y5YSI9UFooISM1NyQ3JCQiMCQ0JXBUbyVwSyEjNyQiMCJHRTUjb1haKCEjNjckJCIwRyZ6Jz1hJHBLISM3JCIwaid6KUdebFsoISM2NyQ3JCQiMEAnKj15XCRwSyEjNyQiMDxeNHczcVsoISM2NyQkIjBHJnonPWEkcEshIzckIjBqJ3opR15sWyghIzY3JDckJCIwQCcqPXlcJHBLISM3JCIwPF40dzNxWyghIzY3JCQiMCxnXTZLI3BLISM3JCIwWChmY0tRKlwoISM2NyQ3JCQiMEYvMVtKI3BLISM3JCIwYFI7SlwlKlwoISM2NyQkIjAsZ102SyNwSyEjNyQiMFgoZmNLUSpcKCEjNjckNyQkIjBGLzFbSiNwSyEjNyQiMGBSO0pcJSpcKCEjNjckJCIwJ0hSOTpAcEshIzckIjBUIz1ZVWIsdiEjNjckNyQkIjBcPFNAcnBGJCEjNyQiLy8obypmI0h2JyEjNTckJCIwUS86PnFwRiQhIzckIjAiekxxaSxgbiEjNjckNyQkIjBRLzo+cXBGJCEjNyQiMCJ6THFpLGBuISM2NyQkIjBIdU06cXBGJCEjNyQiMFA9NG4+SXYnISM2NyQ3JCQiMEBPNmxIb0YkISM3JCIwRkU1I29YbG4hIzY3JCQiMEh1TTpxcEYkISM3JCIwUD00bj5JdichIzY3JDckJCIwQE82bEhvRiQhIzckIjBGRTUjb1hsbiEjNjckJCIwaVAtU0NvRiQhIzckIjBgMkJkRmZ3JyEjNjckNyQkIjAiR2dIJipvd0shIzckIjBqOTxQKCp5eCchIzY3JCQiMGlQLVNDb0YkISM3JCIwYDJCZEZmdychIzY3JDckJCIwIkdnSCYqb3dLISM3JCIwajk8UCgqeXgnISM2NyQkIjBQJnk0InptRiQhIzckIjAmMyEpKilSJCl5biEjNjckNyQkIjBlWSVIKVxsRiQhIzckIjAqSFNBekwheichIzY3JCQiMFAmeTQiem1GJCEjNyQiMCYzISkqKVIkKXluISM2NyQ3JCQiMGVZJUgpXGxGJCEjNyQiMCpIU0F6TCF6JyEjNjckJCIwJCl5UkdNbEYkISM3JCIwPkl1IipRPHonISM2NyQ3JCQiL0U/WTBUd0shIzYkIjBOIjR0JXlGIW8hIzY3JCQiMCQpeVJHTWxGJCEjNyQiMD5JdSIqUTx6JyEjNjckNyQkIi9FP1kwVHdLISM2JCIwTiI0dCV5RiFvISM2NyQkIjApPlk9KipRd0shIzckIjApRztwQmsvbyEjNjckNyQkIjBpd3hucmlGJCEjNyQiMHJ6UC0+XyJvISM2NyQkIjApPlk9KipRd0shIzckIjApRztwQmsvbyEjNjckNyQkIjBpd3hucmlGJCEjNyQiMHJ6UC0+XyJvISM2NyQkIjAjKXAyLFlpRiQhIzckIjApRyFITld2Im8hIzY3JDckJCIwcllbQUxoRiQhIzckIjAyb1dkZncjbyEjNjckJCIwIylwMixZaUYkISM3JCIwKUchSE5XdiJvISM2NyQ3JCQiMHJZW0FMaEYkISM3JCIwMm9XZGZ3I28hIzY3JCQiMDpYLWMtaEYkISM3JCIwVmQyKFtXSW8hIzY3JDckJCIwLFxTPSYqZkYkISM3JCIwVmNeNyssJW8hIzY3JCQiMDpYLWMtaEYkISM3JCIwVmQyKFtXSW8hIzY3JDckJCIwLFxTPSYqZkYkISM3JCIwVmNeNyssJW8hIzY3JCQiME4mKltjZmZGJCEjNyQiL2U2SFJNVm8hIzU3JDckJCIwJm93X3YmZUYkISM3JCIweldlblNEJm8hIzY3JCQiME4mKltjZmZGJCEjNyQiL2U2SFJNVm8hIzU3JDckJCIwJm93X3YmZUYkISM3JCIweldlblNEJm8hIzY3JCQiMFgpPj9xImVGJCEjNyQiMFl4Q2FUaSZvISM2NyQ3JCQiME4rMUw/ZEYkISM3JCIwOkxsQSIpXCdvISM2NyQkIjBYKT4/cSJlRiQhIzckIjBZeENhVGkmbyEjNjckNyQkIjBOKzFMP2RGJCEjNyQiMDpMbEEiKVwnbyEjNjckJCIwYS9qI1xudkshIzckIjA4aC5yUCJwbyEjNjckNyQkIjBwZmxeJGV2SyEjNyQiMF5Ac3hAdShvISM2NyQkIjBhL2ojXG52SyEjNyQiMDhoLnJQInBvISM2NyQ3JCQiMHBmbF4kZXZLISM3JCIwXkBzeEB1KG8hIzY3JCQiMC1qOEdMYkYkISM3JCIwbysoUUMuIylvISM2NyQ3JCQiLSZwNVphRiQhIiokIjAoKTR6S2kpKilvISM2NyQkIjAtajhHTGJGJCEjNyQiMG8rKFFDLiMpbyEjNjckNyQkIi0mcDVaYUYkISIqJCIwKCk0ektpKSopbyEjNjckJCIvYCI+MyNSdkshIzYkIjAjZmVRZCNcKm8hIzY3JDckJCIwJjQoNDU2YEYkISM3JCIwQilmeUdJLXAhIzY3JCQiL2AiPjMjUnZLISM2JCIwI2ZlUWQjXCpvISM2NyQ3JCQiMCY0KDQ1NmBGJCEjNyQiMEIpZnlHSS1wISM2NyQkIjAlWydwS15fRiQhIzckIjBCN0toPHkhcCEjNjckNyQkIjBXP3Bcdl5GJCEjNyQiMGYnR0hNdTlwISM2NyQkIjAlWydwS15fRiQhIzckIjBCN0toPHkhcCEjNjckNyQkIjBXP3Bcdl5GJCEjNyQiMGYnR0hNdTlwISM2NyQkIjAwdVAsNl5GJCEjNyQiMF5kODIzMiNwISM2NyQ3JCQiMGRWTEhTXUYkISM3JCIwJlwoKnpSPUZwISM2NyQkIjAwdVAsNl5GJCEjNyQiMF5kODIzMiNwISM2NyQ3JCQiMGRWTEhTXUYkISM3JCIwJlwoKnpSPUZwISM2NyQkIjBvZSZSNihcRiQhIzckIjBLXD43KGZMcCEjNjckNyQkIjBEZXdbMFxGJCEjNyQiMEpqMWBDJ1JwISM2NyQkIjBvZSZSNihcRiQhIzckIjBLXD43KGZMcCEjNjckNyQkIjBEZXdbMFxGJCEjNyQiMEpqMWBDJ1JwISM2NyQkIjB1JylbcUpbRiQhIzckIjBXbUp3JVtZcCEjNjckNyQkIjBgNSp6NXh1SyEjNyQiMG5eODNsPyZwISM2NyQkIjB1JylbcUpbRiQhIzckIjBXbUp3JVtZcCEjNjckNyQkIjBgNSp6NXh1SyEjNyQiMG5eODNsPyZwISM2NyQkIjAnZiwxRnB1SyEjNyQiLyMzcStyJGZwISM1NyQ3JCQiMFoqem1xanVLISM3JCIwLlM/ajBYJ3AhIzY3JCQiMCdmLDFGcHVLISM3JCIvIzNxK3IkZnAhIzU3JDckJCIwWip6bXFqdUshIzckIjAuUz9qMFgncCEjNjckJCIwJlw4VFRidUshIzckIjB3I0dmZURzcCEjNjckNyQkIjBraCJbTV11SyEjNyQiMFJHRj1ZcChwISM2NyQkIjAmXDhUVGJ1SyEjNyQiMHcjR2ZlRHNwISM2NyQ3JCQiMGtoIltNXXVLISM3JCIwUkdGPVlwKHAhIzY3JCQiMDN3KTRnVHVLISM3JCIwIypvNktSXilwISM2NyQ3JCQiMGMpUUAtUHVLISM3JCIwdjtNdCdRKilwISM2NyQkIjAzdyk0Z1R1SyEjNyQiMCMqbzZLUl4pcCEjNjckNyQkIjBjKVFALVB1SyEjNyQiMHc7TXQnUSopcCEjNjckJCIwbyIzMiR5VUYkISM3JCIwWi8jNDktKSpwISM2NyQ3JCQiMGsjbyVRUFVGJCEjNyQiMDYwVEdGPSsoISM2NyQkIjBvIjMyJHlVRiQhIzckIjBaLyM0OS0pKnAhIzY3JDckJCIwayNvJVFQVUYkISM3JCIwNjBUR0Y9KyghIzY3JCQiMGBXRi5UVEYkISM3JCIvRVRCQCE0LCghIzU3JDckJCIwJ3owT1w1dUshIzckIjBbJHpNeUU5cSEjNjckJCIwYFdGLlRURiQhIzckIi9FVEJAITQsKCEjNTckNyQkIjAnejBPXDV1SyEjNyQiMFskek15RTlxISM2NyQkIjBNaWc9L1NGJCEjNyQiMHlsalkieUJxISM2NyQ3JCQiMGhgZyhHKFJGJCEjNyQiMCU9WyZRM24tKCEjNjckJCIwTWlnPS9TRiQhIzckIjB5bGpZInlCcSEjNjckNyQkIjBoYGcoRyhSRiQhIzckIjAkPVsmUTNuLSghIzY3JCQiMGExQHduUUYkISM3JCIwRm5RWGZtLighIzY3JDckJCIwRCdwKj5UUUYkISM3JCIvLTxPKlsiUnEhIzU3JCQiMGExQHduUUYkISM3JCIwRm5RWGZtLighIzY3JDckJCIwRCdwKj5UUUYkISM3JCIvLTxPKlsiUnEhIzU3JCQiMC8lPmk8dHRLISM3JCIwViVwIjNPJlxxISM2NyQ3JCQiMHknKSkzKjRQRiQhIzckIjBjZW9bKmVecSEjNjckJCIwLyU+aTx0dEshIzckIjBWJXAiM08mXHEhIzY3JDckJCIweScpKTMqNFBGJCEjNyQiMGNlb1sqZV5xISM2NyQkIjBXYkQ9J2Z0SyEjNyQiMGpMPk82QzEoISM2NyQ3JCQiMFk3LCt6TkYkISM3JCIwI3BhUCsua3EhIzY3JCQiMFdiRD0nZnRLISM3JCIwakw+TzZDMSghIzY3JDckJCIwWTcsK3pORiQhIzckIjAjcGFQKy5rcSEjNjckJCIwUCczQTVZdEshIzckIjAwRSIpSCZHdnEhIzY3JDckJCIwal5AWltNRiQhIzckIjBHTiMpZXFrMighIzY3JCQiMFAnM0E1WXRLISM3JCIwMEUiKUgmR3ZxISM2NyQ3JCQiMGpeQFpbTUYkISM3JCIwR04jKWVxazIoISM2NyQkIi93JXlGRUxGJCEjNiQiMDoncCoqeTopMyghIzY3JDckJCIvSiZISz1MRiQhIzYkIjBrQipRNiIqKTMoISM2NyQkIi93JXlGRUxGJCEjNiQiMDoncCoqeTopMyghIzY3JDckJCIvSiZISz1MRiQhIzYkIjBrQipRNiIqKTMoISM2NyQkIjBGaTEmPj50SyEjNyQiMGUvUztINTUoISM2NyQ3JCQiMHMvS2IpPXRLISM3JCIuNycqb144NSghIio3JCQiMEZpMSY+PnRLISM3JCIwZS9TO0g1NSghIzY3JDckJCIwcy9LYik9dEshIzckIi43JypvXjg1KCEiKjckJCIwQjBVTyI0dEshIzckIjBZbzcyJnA1ciEjNjckNyQkIjB3SFExXjNHJCEjNyQiMCkqNDtsSVRVJyEjNjckJCIwd0leSyV5IUckISM3JCIwYVNDJj5jSGshIzY3JDckJCIwd0leSyV5IUckISM3JCIwYVNDJj5jSGshIzY3JCQiMChcPEM7eSFHJCEjNyQiMGlMdGcleUhrISM2NyQ3JCQiLyNmKioqPWohRyQhIzYkIi8qR0pdLT9XJyEjNTckJCIwKFw8Qzt5IUckISM3JCIwaUx0ZyV5SGshIzY3JDckJCIvI2YqKio9aiFHJCEjNiQiLypHSl0tP1cnISM1NyQkIjAvRF8wQjFHJCEjNyQiMEMobyxPdFVrISM2NyQ3JCQiMDctJlwqei9HJCEjNyQiMEU8UTBWV1gnISM2NyQkIjAvRF8wQjFHJCEjNyQiMEMobyxPdFVrISM2NyQ3JCQiMDctJlwqei9HJCEjNyQiMEU8UTBWV1gnISM2NyQkIjBreVgsbC9HJCEjNyQiMDpoPyE0b2JrISM2NyQ3JCQiMFtTRFpHLkckISM3JCIwaTBYZyQpb1knISM2NyQkIjBreVgsbC9HJCEjNyQiMDpoPyE0b2JrISM2NyQ3JCQiMFtTRFpHLkckISM3JCIwaTBYZyQpb1knISM2NyQkIi8kZTJdMi5HJCEjNiQiMHojPjhsaW9rISM2NyQ3JCQiMDx4a1l4LEckISM3JCIwKVI+YlRLemshIzY3JCQiLyRlMl0yLkckISM2JCIweiM+OGxpb2shIzY3JDckJCIwPHhrWXgsRyQhIzckIjApUj5iVEt6ayEjNjckJCIvVT41MDohRyQhIzYkIjBrR2xXcTpbJyEjNjckNyQkIi9ARUdwLSFHJCEjNiQiME0jKWVxazxcJyEjNjckJCIvVT41MDohRyQhIzYkIjBrR2xXcTpbJyEjNjckNyQkIi9ARUdwLSFHJCEjNiQiME0jKWVxazxcJyEjNjckJCIwekUpUlMqKnpLISM3JCIwJSp5PXI3WFwnISM2NyQ3JCQiMFdZYSZvKCl6SyEjNyQiLzJkY18/L2whIzU3JCQiMHpFKVJTKip6SyEjNyQiMCUqeT1yN1hcJyEjNjckNyQkIjBXWWEmbygpekshIzckIi8yZGNfPy9sISM1NyQkIjBGJSpvM1EpekshIzckIjBMKjQ9TFgybCEjNjckNyQkIjA4eiNbc3N6SyEjNyQiMDFmcyFlaztsISM2NyQkIjBGJSpvM1EpekshIzckIjBMKjQ9TFgybCEjNjckNyQkIjA4eiNbc3N6SyEjNyQiMDFmcyFlaztsISM2NyQkIjBvdzNsI296SyEjNyQiMChwJm9FI1I/bCEjNjckNyQkIjAjb3UtInkmekshIzckIjBVWnpOJzNIbCEjNjckJCIwb3czbCNvekshIzckIjAocCZvRSNSP2whIzY3JDckJCIwI291LSJ5JnpLISM3JCIwVVp6TiczSGwhIzY3JCQiL0I9RnhfekshIzYkIjAzdkdkSExgJyEjNjckNyQkIjBpcXNUSCV6SyEjNyQiMHlOJzNwX1RsISM2NyQkIi9CPUZ4X3pLISM2JCIwM3ZHZEhMYCchIzY3JDckJCIwaXFzVEglekshIzckIjB5TiczcF9UbCEjNjckJCIwQypROUxQekshIzckIjB5NzJDbGlhJyEjNjckNyQkIjBaIXAqPSJHekshIzckIjA5QyRmdSdSYichIzY3JCQiMEMqUTlMUHpLISM3JCIweTcyQ2xpYSchIzY3JDckJCIwWiFwKj0iR3pLISM3JCIwOUMkZnUnUmInISM2NyQkIjBlNCQ0JT4jekshIzckIjAxI2YhRyo+ZmwhIzY3JDckJCIwaDMkPU04ekshIzckIi9ELDUhM2tjJyEjNTckJCIwZTQkNCU+I3pLISM3JCIwMSNmIUcqPmZsISM2NyQ3JCQiMGgzJD1NOHpLISM3JCIvRCw1ITNrYychIzU3JCQiLyRRMCxtIXpLISM2JCIwLT1xcEpAZCchIzY3JDckJCIwUEEtNScpKnlLISM3JCIwJzNxZyZbKXlsISM2NyQkIi8kUTAsbSF6SyEjNiQiMC09cXBKQGQnISM2NyQ3JCQiMFBBLTUnKSp5SyEjNyQiMCczcWcmWyl5bCEjNjckJCIvJT5TNjgqeUshIzYkIjApZipIXWldZSchIzY3JDckJCIwVF5hQlIpeUshIzckIjBBKlE2IipHImYnISM2NyQkIi8lPlM2OCp5SyEjNiQiMClmKkhdaV1lJyEjNjckNyQkIjBUXmFCUil5SyEjNyQiMEEqUTYiKkciZichIzY3JCQiMCNRRD4yd3lLISM3JCIwQ0UscSIqemYnISM2NyQ3JCQiMEw1KD1HcHlLISM3JCIwZXg/bUhQZychIzY3JCQiMCNRRD4yd3lLISM3JCIwQ0UscSIqemYnISM2NyQ3JCQiMEw1KD1HcHlLISM3JCIwZXg/bUhQZychIzY3JCQiME9MLyMpMyd5SyEjNyQiMFpLcUk+NGgnISM2NyQ3JCQiL1ZrXG9heUshIzYkIjAlZnc3LTw7bSEjNjckJCIwT0wvIykzJ3lLISM3JCIwWktxST40aCchIzY3JDckJCIvVmtcb2F5SyEjNiQiMCVmdzctPDttISM2NyQkIjAwVyk9dVh5SyEjNyQiMDQiZj5gJVFpJyEjNjckNyQkIjBQLHVLLCV5SyEjNyQiL1ZYajJoR20hIzU3JCQiMDBXKT11WHlLISM3JCIwNCJmPmAlUWknISM2NyQ3JCQiMFAsdUssJXlLISM3JCIvVlhqMmhHbSEjNTckJCIvSE42bEl5SyEjNiQiMCN5JXl1cG5qJyEjNjckNyQkIjBbMClbaUR5SyEjNyQiMG1VVEpeNWsnISM2NyQkIi9ITjZsSXlLISM2JCIwI3kleXVwbmonISM2NyQ3JCQiMFswKVtpRHlLISM3JCIwbVVUSl41aychIzY3JCQiMEdxSTRjInlLISM3JCIwNyJbMkVwXG0hIzY3JDckJCIwSFM3aDYieUshIzckIjAtSlsnPVxgbSEjNjckJCIwR3FJNGMieUshIzckIjA3IlsyRXBcbSEjNjckNyQkIjBIUzdoNiJ5SyEjNyQiMC1KWyc9XGBtISM2NyQkIjBePVc7MSF5SyEjNyQiMHZPcipRaGltISM2NyQ3JCQiMC9hVVRuekYkISM3JCIwUT5iVEtmbSchIzY3JCQiMF49VzsxIXlLISM3JCIwdk9yKlFoaW0hIzY3JDckJCIwL2FVVG56RiQhIzckIjBRPmJUS2ZtJyEjNjckJCIwcCNIQW4meUYkISM3JCIwXnFuaUxibichIzY3JDckJCIwN19fbEJ5RiQhIzckIjB1MmknSFB5bSEjNjckJCIwcCNIQW4meUYkISM3JCIwXnFuaUxibichIzY3JDckJCIwN19fbEJ5RiQhIzckIjB1MmknSFB5bSEjNjckJCIwKHpmanhxeEshIzckIjB5MGohPVgpbychIzY3JDckJCIwc2M+TCFveEshIzckIi9oKm9eODNwJyEjNTckJCIwKHpmanhxeEshIzckIjB5MGohPVgpbychIzY3JDckJCIwc2M+TCFveEshIzckIi9oKm9eODNwJyEjNTckJCIwNDhxR2Z2RiQhIzckIjBAeipSJW84cSchIzY3JDckJCIwNFtJV1B2RiQhIzckIjBZJWVuU0QubiEjNjckJCIwNDhxR2Z2RiQhIzckIjBAeipSJW84cSchIzY3JDckJCIwNFtJV1B2RiQhIzckIjBZJWVuU0QubiEjNjckJCIwbGclKkc2dUYkISM3JCIwSGV3YCRHOW4hIzY3JDckJCIvJFxmKVxSeEshIzYkIjAkR0Y9WXA6biEjNjckJCIwbGclKkc2dUYkISM3JCIwSGV3YCRHOW4hIzY3JDckJCIvJFxmKVxSeEshIzYkIjAkR0Y9WXA6biEjNjckJCIwOC0mcFBFeEshIzckIjBmYlI1KD5GbiEjNjckNyQkIjBOJ3lmSER4SyEjNyQiMD5oKm9eOEduISM2NyQkIjA4LSZwUEV4SyEjNyQiMGZiUjUoPkZuISM2NyQ3JCQiME4neWZIRHhLISM3JCIwPmgqb144R24hIzY3JCQiMCJRTUNuNnhLISM3JCIwLUh5OTQsdSchIzY3JDckJCIwIkcqPk82ckYkISM3JCIwYlwnPmRkU24hIzY3JCQiMCJRTUNuNnhLISM3JCIwLUh5OTQsdSchIzY3JDckJCIwI0cqPk82ckYkISM3JCIwYlwnPmRkU24hIzY3JCQiMFw8U0BycEYkISM3JCIvLyhvKmYjSHYnISM1NyQ3JCQiMC1VTyI0dCVHJCEjNyQiMGMieiF6TzQ3JyEjNjckJCIwJlItPHRmJUckISM3JCIwKik+ZnQpKTQ4JyEjNjckNyQkIjAmUi08dGYlRyQhIzckIjAqKT5mdCkpNDgnISM2NyQkIjBDcTFYImYlRyQhIzckIi8yPjxmVkpoISM1NyQ3JCQiMEg6dlxLV0ckISM3JCIwRDNtR0hNOSchIzY3JCQiMENxMVgiZiVHJCEjNyQiLzI+PGZWSmghIzU3JDckJCIwSDp2XEtXRyQhIzckIjBEM21HSE05JyEjNjckJCIwYDM+Vj5XRyQhIzckIjAqXHJQIUdXOSchIzY3JDckJCIwUG5SQG9VRyQhIzckIjBoJ0hQKXBlOichIzY3JCQiMGAzPlY+V0ckISM3JCIwKlxyUCFHVzknISM2NyQ3JCQiMFBuUkBvVUckISM3JCIwaCdIUClwZTonISM2NyQkIjA+VFosW1VHJCEjNyQiMC9jI0gjPXU6JyEjNjckNyQkIjAjUTppVzUlRyQhIzckIjAoXCl6UTUkb2ghIzY3JCQiMD5UWixbVUckISM3JCIwL2MjSCM9dTonISM2NyQ3JCQiMCNROmlXNSVHJCEjNyQiMChcKXpRNSRvaCEjNjckJCIwJikqXCQ+eFNHJCEjNyQiMEEqKSo0bFNxaCEjNjckNyQkIjAsJDNTNyVSRyQhIzckIjBMdCdRNHYhPSchIzY3JCQiMCYpKlwkPnhTRyQhIzckIjBBKikqNGxTcWghIzY3JDckJCIwLCQzUzclUkckISM3JCIwTHQnUTR2IT0nISM2NyQkIjAxN2kncCFSRyQhIzckIjAzUmkpR1IkPSchIzY3JDckJCIvPDxZJnlQRyQhIzYkIjBwaCQqWyI+JD4nISM2NyQkIjAxN2kncCFSRyQhIzckIjAzUmkpR1IkPSchIzY3JDckJCIvPDxZJnlQRyQhIzYkIjBwaCQqWyI+JD4nISM2NyQkIjBseThMUFBHJCEjNyQiMGo3R094aj4nISM2NyQ3JCQiL1prdmpoJEckISM2JCIwMF0rL0tjPychIzY3JCQiMGx5OExQUEckISM3JCIwajdHT3hqPichIzY3JDckJCIvWmt2amgkRyQhIzYkIjAwXSsvS2M/JyEjNjckJCIwSHQ9R29ORyQhIzckIi8sY2kqZiQ0aSEjNTckNyQkIjA8PSVHWlgkRyQhIzckIjBUUTJmcyE9aSEjNjckJCIwSHQ9R29ORyQhIzckIi8sY2kqZiQ0aSEjNTckNyQkIjA8PSVHWlgkRyQhIzckIjBUUTJmcyE9aSEjNjckJCIwL24kPSkqUiRHJCEjNyQiMHlITG9TQkEnISM2NyQ3JCQiMEJWMGckSCRHJCEjNyQiMHhFOTk4MEInISM2NyQkIjAvbiQ9KSpSJEckISM3JCIweUhMb1NCQSchIzY3JDckJCIwQlYwZyRIJEckISM3JCIweEU5OTgwQichIzY3JCQiME4pW08+QiRHJCEjNyQiMCgpUSJSJj5gQichIzY3JDckJCIwUnMnKilIOCRHJCEjNyQiMDg6QHBgSEMnISM2NyQkIjBOKVtPPkIkRyQhIzckIjAoKVEiUiY+YEInISM2NyQ3JCQiMFJzJyopSDgkRyQhIzckIjA4OkBwYEhDJyEjNjckJCIwcmVGamtJRyQhIzckIjApNDlUbEhbaSEjNjckNyQkIi8jcEgqRyhIRyQhIzYkIjBcLkdDJVJiaSEjNjckJCIwcmVGamtJRyQhIzckIjApNDlUbEhbaSEjNjckNyQkIi8jcEgqRyhIRyQhIzYkIjBcLkdDJVJiaSEjNjckJCIuaUcheipHRyQhIzUkIjBjdkpxcjdFJyEjNjckNyQkIi9baTJMIkdHJCEjNiQiMCY9XCR6TXlFJyEjNjckJCIuaUcheipHRyQhIzUkIjBjdkpxcjdFJyEjNjckNyQkIi9baTJMIkdHJCEjNiQiMCY9XCR6TXlFJyEjNjckJCIvdXdZPHQjRyQhIzYkIjBYVGAtWFVGJyEjNjckNyQkIi9YJ1JCYUVHJCEjNiQiMEAhPVdgRiFHJyEjNjckJCIvdXdZPHQjRyQhIzYkIjBYVGAtWFVGJyEjNjckNyQkIi9YJ1JCYUVHJCEjNiQiMEAhPVdgRiFHJyEjNjckJCIvai9maGMjRyQhIzYkIjA+WF1fO3NHJyEjNjckNyQkIjA8aWFtJlwjRyQhIzckIjBkb1sqZXIjSCchIzY3JCQiL2ovZmhjI0ckISM2JCIwPlhdXztzRychIzY3JDckJCIwPGlhbSZcI0ckISM3JCIwZG9bKmVyI0gnISM2NyQkIjAxeiJSNlMjRyQhIzckIjAvYFI/Jz0raiEjNjckNyQkIi9YIVFnUEJHJCEjNiQiMCRwYlhrOjBqISM2NyQkIjAxeiJSNlMjRyQhIzckIjAvYFI/Jz0raiEjNjckNyQkIi9YIVFnUEJHJCEjNiQiMCRwYlhrOjBqISM2NyQkIjB3IVEib09BRyQhIzckIjAsOTEzYUpKJyEjNjckNyQkIi9PK1YrPSNHJCEjNiQiMEhYaSpwZjxqISM2NyQkIjB3IVEib09BRyQhIzckIjAsOTEzYUpKJyEjNjckNyQkIi9PK1YrPSNHJCEjNiQiMEhYaSpwZjxqISM2NyQkIjBaXVV5cz9HJCEjNyQiMDg/JmYsN0VqISM2NyQ3JCQiMHN1RilILSNHJCEjNyQiMGxMcGFQK0wnISM2NyQkIjBaXVV5cz9HJCEjNyQiMDg/JmYsN0VqISM2NyQ3JCQiMHN1RilILSNHJCEjNyQiMGxMcGFQK0wnISM2NyQkIjBwIylbVzQ+RyQhIzckIjB4KCkqXFczUmohIzY3JDckJCIwLnYnPmsnPUckISM3JCIwLEF3NHlDTSchIzY3JCQiMHAjKVtXND5HJCEjNyQiMHgoKSpcVzNSaiEjNjckNyQkIjAudic+ayc9RyQhIzckIjAsQXc0eUNNJyEjNjckJCIwSEwxbVk8RyQhIzckIjA8JlxncC9faiEjNjckNyQkIjBOSUlONTxHJCEjNyQiMFA1JFsnPVxOJyEjNjckJCIwSEwxbVk8RyQhIzckIjA8JlxncC9faiEjNjckNyQkIjBOSUlONTxHJCEjNyQiMFA1JFsnPVxOJyEjNjckJCIwRXp2VSVlIkckISM3JCIwR0BPcTJdTychIzY3JDckJCIwOEt5eGE6RyQhIzckIjB0KSoqKT5mdE8nISM2NyQkIjBFenZVJWUiRyQhIzckIjBHQE9xMl1PJyEjNjckNyQkIjA4S3l4YTpHJCEjNyQiMHQpKiopPmZ0TychIzY3JCQiMCkqUVd1QTlHJCEjNyQiL2NaJG9telAnISM1NyQ3JCQiMCQ0KyZwKlIiRyQhIzckIjA0KG9cKCp6emohIzY3JCQiMCkqUVd1QTlHJCEjNyQiL2NaJG9telAnISM1NyQ3JCQiMCQ0KyZwKlIiRyQhIzckIjA0KG9cKCp6emohIzY3JCQiMDZ3c2doN0ckISM3JCIwc3pFIlIjNFInISM2NyQ3JCQiMCg+byo0WDdHJCEjNyQiMFh2LklTQVInISM2NyQkIjA2d3NnaDdHJCEjNyQiMHN6RSJSIzRSJyEjNjckNyQkIjAoPm8qNFg3RyQhIzckIjBYdi5JU0FSJyEjNjckJCIwMHg/LCw2RyQhIzckIjA4LlRTelFTJyEjNjckNyQkIjA7VCQqKTQ0IkckISM3JCIwIlExXjNvL2shIzY3JCQiMDB4PywsNkckISM3JCIwOC5UU3pRUychIzY3JDckJCIwO1QkKik0NCJHJCEjNyQiMCJRMV4zby9rISM2NyQkIjAvJDRmNCU0RyQhIzckIjBBU3A6TG9UJyEjNjckNyQkIjBtKD1rdCQ0RyQhIzckIjA9XzxTQHJUJyEjNjckJCIwLyQ0ZjQlNEckISM3JCIwQVNwOkxvVCchIzY3JDckJCIwbSg9a3QkNEckISM3JCIwPV88U0ByVCchIzY3JCQiMHdIUTFeM0ckISM3JCIwKSo0O2xJVFUnISM2NyQ3JCQiMEhhTXc1JylHJCEjNyQiLzEnPV9xMCVlISM1NyQkIjBiXDE8XCYpRyQhIzckIi93M3FnJlslZSEjNTckNyQkIjBiXDE8XCYpRyQhIzckIi93M3FnJlslZSEjNTckJCIwUSQzT2lhKUckISM3JCIwNyEpUihIMVhlISM2NyQ3JCQiMHNEWSM0UClHJCEjNyQiMCdmeD9tSGRlISM2NyQkIjBRJDNPaWEpRyQhIzckIjA3ISlSKEgxWGUhIzY3JDckJCIwc0RZIzRQKUckISM3JCIwJ2Z4P21IZGUhIzY3JCQiMGY7QmBmJClHJCEjNyQiMGppNz0tImVlISM2NyQ3JCQiMFoxQUckPilHJCEjNyQiMEtrOTxQKHBlISM2NyQkIjBmO0JgZiQpRyQhIzckIjBqaTc9LSJlZSEjNjckNyQkIjBaMUFHJD4pRyQhIzckIjBLazk8UChwZSEjNjckJCIvJlI9XnQiKUckISM2JCIvKTR3PlI2KGUhIzU3JDckJCIwKDRbVGksKUckISM3JCIwb19Ac3hAKWUhIzY3JCQiLyZSPV50IilHJCEjNiQiLyk0dz5SNihlISM1NyQ3JCQiMCg0W1RpLClHJCEjNyQiMG9fQHN4QCllISM2NyQkIjBuMEI8KSl6RyQhIzckIjBLWDAudVQpZSEjNjckNyQkIjBAKyMqelJ5RyQhIzckIjAvVEdGPVkqZSEjNjckJCIwbjBCPCkpekckISM3JCIwS1gwLnVUKWUhIzY3JDckJCIwQCsjKnpSeUckISM3JCIwL1RHRj1ZKmUhIzY3JCQiMHdsIjROIXlHJCEjNyQiMF5jWXAxcyplISM2NyQ3JCQiLzJmXlJtKEckISM2JCIvJUhOIyllcSFmISM1NyQkIjB3bCI0TiF5RyQhIzckIjBeY1lwMXMqZSEjNjckNyQkIi8yZl5SbShHJCEjNiQiLyVITiMpZXEhZiEjNTckJCIwMFoqPSY+d0ckISM3JCIwVHk1P1AtImYhIzY3JDckJCIwLlF0cClbKEckISM3JCIwdzxVUCpcPmYhIzY3JCQiMDBaKj0mPndHJCEjNyQiMFR5NT9QLSJmISM2NyQ3JCQiMC5RdHApWyhHJCEjNyQiMHc8VVAqXD5mISM2NyQkIjAkZjAqPk91RyQhIzckIjBLRiJlYkVCZiEjNjckNyQkIi9CJj4uOXRHJCEjNiQiMDcxXCMqUj4kZiEjNjckJCIwJGYwKj5PdUckISM3JCIwS0YiZWJFQmYhIzY3JDckJCIvQiY+Ljl0RyQhIzYkIjA3MVwjKlI+JGYhIzY3JCQiMEYuSGFgc0ckISM3JCIuSnB5IkhPZiEiKjckNyQkIjAkbzZfKlJyRyQhIzckIjBbJWZ2L1FXZiEjNjckJCIwRi5IYWBzRyQhIzckIi5KcHkiSE9mISIqNyQ3JCQiMCRvNl8qUnJHJCEjNyQiMFslZnYvUVdmISM2NyQkIjA+PiVcOjIoRyQhIzckIi8qPjQqZUpcZiEjNTckNyQkIjBfJEdjaydwRyQhIzckIjAlR0dFNSNvJmYhIzY3JCQiMD4+JVw6MihHJCEjNyQiLyo+NCplSlxmISM1NyQ3JCQiMF8kR2NrJ3BHJCEjNyQiMCVHR0U1I28mZiEjNjckJCIwLWNKQCEqb0ckISM3JCIvPWMoKXlMaWYhIzU3JDckJCIvbW9TTnonRyQhIzYkIi83KHBkaCNwZiEjNTckJCIwLWNKQCEqb0ckISM3JCIvPWMoKXlMaWYhIzU3JDckJCIvbW9TTnonRyQhIzYkIi83KHBkaCNwZiEjNTckJCIwTz5EYDRuRyQhIzckIi5wPnlkYChmISIqNyQ3JCQiMFBwOz9AbUckISM3JCIwY2Z3Ny08KWYhIzY3JCQiME8+RGA0bkckISM3JCIucD55ZGAoZiEiKjckNyQkIjBQcDs/QG1HJCEjNyQiMGNmdzctPClmISM2NyQkIjBKJ3krJkhsRyQhIzckIjA7KXAmZnYkKSlmISM2NyQ3JCQiMCo9K1AlXGtHJCEjNyQiMCN6TXlFOSUqZiEjNjckJCIwSid5KyZIbEckISM3JCIwOylwJmZ2JCkpZiEjNjckNyQkIjAqPStQJVxrRyQhIzckIjAjek15RTklKmYhIzY3JCQiMDYyZDZdakckISM3JCIwMmpmTCJSLGchIzY3JDckJCIwaShcVSN5aUckISM3JCIwR08hSEtlMWchIzY3JCQiMDYyZDZdakckISM3JCIwMmpmTCJSLGchIzY3JDckJCIwaShcVSN5aUckISM3JCIwR08hSEtlMWchIzY3JCQiL2BbdDg8J0ckISM2JCIwI28kXCwwVywnISM2NyQ3JCQiMFtzc2gyaEckISM3JCIwa0MoelAtPmchIzY3JCQiL2BbdDg8J0ckISM2JCIwI28kXCwwVywnISM2NyQ3JCQiMFtzc2gyaEckISM3JCIwa0MoelAtPmchIzY3JCQiMDlpOkYkKmZHJCEjNyQiMChSIzNrO3UtJyEjNjckNyQkIjBjdG5iUGZHJCEjNyQiLjgvTGs5LichIio3JCQiMDlpOkYkKmZHJCEjNyQiMChSIzNrO3UtJyEjNjckNyQkIjBjdG5iUGZHJCEjNyQiLjgvTGs5LichIio3JCQiMCl6KmYhZSJlRyQhIzckIjB6Y2lBRS8vJyEjNjckNyQkIjAyNi0xb2RHJCEjNyQiME8sNilbIVIvJyEjNjckJCIwKXoqZiFlImVHJCEjNyQiMHpjaUFFLy8nISM2NyQ3JCQiMDI2LTFvZEckISM3JCIwTyw2KVshUi8nISM2NyQkIjBkKFFyKlFjRyQhIzckIjAqb2MpeUxNMCchIzY3JDckJCIuczc3KmYmRyQhIzUkIjBzKnlKYU1jZyEjNjckJCIwZChRcipRY0ckISM3JCIwKm9jKXlMTTAnISM2NyQ3JCQiLnM3NypmJkckISM1JCIwcyp5SmFNY2chIzY3JCQiMEIoKmV3aWFHJCEjNyQiMChSakwkUmsxJyEjNjckNyQkIjBAI3BSMlYmRyQhIzckIjAzeUMpZnlvZyEjNjckJCIwQigqZXdpYUckISM3JCIwKFJqTCRSazEnISM2NyQ3JCQiMEAjcFIyViZHJCEjNyQiMDN5QylmeW9nISM2NyQkIjBUZnc9KEcmRyQhIzckIjA9WXUnR1d6ZyEjNjckNyQkIjBEdlAiSEUmRyQhIzckIjBXbUpgRTczJyEjNjckJCIwVGZ3PShHJkckISM3JCIwPVl1J0dXemchIzY3JDckJCIwRHZQIkhFJkckISM3JCIwV21KYEU3MychIzY3JCQiMDw+KEhBNiZHJCEjNyQiMEAvQlRXQzQnISM2NyQ3JCQiMCc+Q1BjNCZHJCEjNyQiL1smUTNuTzQnISM1NyQkIjA8PihIQTYmRyQhIzckIjBAL0JUV0M0JyEjNjckNyQkIjAnPkNQYzQmRyQhIzckIi9bJlEzbk80JyEjNTckJCIwIlFGIip5JFxHJCEjNyQiMCk9eXFSVzBoISM2NyQ3JCQiMDAjWzUqR1xHJCEjNyQiMDtWWGoyaDUnISM2NyQkIjAiUUYiKnkkXEckISM3JCIwKT15cVJXMGghIzY3JDckJCIwMCNbNSpHXEckISM3JCIwO1ZYajJoNSchIzY3JCQiMCR5O25UdyVHJCEjNyQiMDA1JWY6Vz1oISM2NyQ3JCQiME9dJEdGdyVHJCEjNyQiMGBKXz1bJj1oISM2NyQkIjAkeTtuVHclRyQhIzckIjAwNSVmOlc9aCEjNjckNyQkIjBPXSRHRnclRyQhIzckIjBgSl89WyY9aCEjNjckJCIwLVVPIjR0JUckISM3JCIwYyJ6IXpPNDcnISM2NyQ3JCQiMGJtS2ghXCNIJCEjNyQiMDo/Jz5xcCFlJiEjNjckJCIwelt1Y1hDSCQhIzckIjAuS2NdL09lJiEjNjckNyQkIjB6W3VjWENIJCEjNyQiMC5LY10vT2UmISM2NyQkIjBgeWRDVkNIJCEjNyQiMFEhPihRY1BlJiEjNjckNyQkIjA6JUhJTUQjSCQhIzckIjBSP2owWGdmJiEjNjckJCIwYHlkQ1ZDSCQhIzckIjBRIT4oUWNQZSYhIzY3JDckJCIwOiVISU1EI0gkISM3JCIwUj9qMFhnZiYhIzY3JCQiMEJ5VkNUQUgkISM3JCIwYSVmWFklb2YmISM2NyQ3JCQiMC1lZSg+MSNIJCEjNyQiMHYzcWcmWzNjISM2NyQkIjBCeVZDVEFIJCEjNyQiMGElZlhZJW9mJiEjNjckNyQkIjAtZWUoPjEjSCQhIzckIjB2M3FnJlszYyEjNjckJCIwb3JKLVM/SCQhIzckIjBAWEJTSSo0YyEjNjckNyQkIjBMOzA/cj1IJCEjNyQiMDYocGRoIzRpJiEjNjckJCIwb3JKLVM/SCQhIzckIjBAWEJTSSo0YyEjNjckNyQkIjBMOzA/cj1IJCEjNyQiMDYocGRoIzRpJiEjNjckJCIwMiYpb2RSPUgkISM3JCIwZF9WbjhJaSYhIzY3JDckJCIwcHcpKjQibyJIJCEjNyQiMFomUTNuT0xjISM2NyQkIjAyJilvZFI9SCQhIzckIjBkX1ZuOElpJiEjNjckNyQkIjBwdykqNCJvIkgkISM3JCIwWiZRM25PTGMhIzY3JCQiMCJmOCwqUjtIJCEjNyQiMCkpb2NaJTRPYyEjNjckNyQkIjBeeSRwO1wiSCQhIzckIjAkUTJmcyFlayYhIzY3JCQiMCJmOCwqUjtIJCEjNyQiMCkpb2NaJTRPYyEjNjckNyQkIjBeeSRwO1wiSCQhIzckIjAkUTJmcyFlayYhIzY3JCQiME1iKikpNFciSCQhIzckIjBZUidHRzxcYyEjNjckNyQkIjBaL2UhSEkiSCQhIzckIjA+aSg0eUNlYyEjNjckJCIwTWIqKSk0VyJIJCEjNyQiMFlSJ0dHPFxjISM2NyQ3JCQiMFovZSFISSJIJCEjNyQiMD5pKDR5Q2VjISM2NyQkIjBUV3okR0MiSCQhIzckIjBVYzR1W0FtJiEjNjckNyQkIjBkJ0cxWzYiSCQhIzckIjBiXS9PKW9xYyEjNjckJCIwVFd6JEdDIkgkISM3JCIwVWM0dVtBbSYhIzY3JDckJCIwZCdHMVs2IkgkISM3JCIwYl0vTylvcWMhIzY3JCQiMCVIJkdXWDVIJCEjNyQiMD1hJUhBS3ZjISM2NyQ3JCQiL2ZebXQjNEgkISM2JCIwIipRNiIqR0pvJiEjNjckJCIwJUgmR1dYNUgkISM3JCIwPWElSEFLdmMhIzY3JDckJCIvZl5tdCM0SCQhIzYkIjAiKlE2IipHSm8mISM2NyQkIi9QJykpelszSCQhIzYkIjAteiY0TFIpbyYhIzY3JDckJCIwZGJFZVMySCQhIzckIjBGRj1ZcGJwJiEjNjckJCIvUCcpKXpbM0gkISM2JCIwLXomNExSKW8mISM2NyQ3JCQiMGRiRWVTMkgkISM3JCIwRkY9WXBicCYhIzY3JCQiMEUkPSxIbCFIJCEjNyQiMHorbio+WSxkISM2NyQ3JCQiMCpRKTNYYTBIJCEjNyQiMGo6RCw1ITNkISM2NyQkIjBFJD0sSGwhSCQhIzckIjB6K24qPlksZCEjNjckNyQkIjAqUSkzWGEwSCQhIzckIjBqOkQsNSEzZCEjNjckJCIwKVwsWXhYIUgkISM3JCIwQyQqSElHWHImISM2NyQ3JCQiMDhoJG8qby5IJCEjNyQiMCpSP2owWD9kISM2NyQkIjApXCxZeFghSCQhIzckIjBDJCpISUdYciYhIzY3JDckJCIwOGgkbypvLkgkISM3JCIwKlI/ajBYP2QhIzY3JCQiMDZDeUtqLUgkISM3JCIwSi5pQyNmRmQhIzY3JDckJCIvKHooSFQ9IUgkISM2JCIwTiMqUTYiKkd0JiEjNjckJCIwNkN5S2otSCQhIzckIjBKLmlDI2ZGZCEjNjckNyQkIi8oeihIVD0hSCQhIzYkIjBOIypRNiIqR3QmISM2NyQkIjAzWUJrcCtIJCEjNyQiMDQwKyVRbFNkISM2NyQ3JCQiMFhYWSQqKioqKkckISM3JCIwciFlaztMWGQhIzY3JCQiMDNZQmtwK0gkISM3JCIwNDArJVFsU2QhIzY3JDckJCIwWFhZJCoqKioqRyQhIzckIjByIWVrO0xYZCEjNjckJCIwL1lzb3cpKkckISM3JCIvXyk9NDhQdiYhIzU3JDckJCIwVCVIeGoiKSpHJCEjNyQiMDJwX0BzeHYmISM2NyQkIjAvWXNvdykqRyQhIzckIi9fKT00OFB2JiEjNTckNyQkIjBUJUh4aiIpKkckISM3JCIwMnBfQHN4diYhIzY3JCQiMGhDZ1glbypHJCEjNyQiMGMkb0EreG1kISM2NyQ3JCQiMGUxYVhMJypHJCEjNyQiMFZkZnc3LXgmISM2NyQkIjBoQ2dYJW8qRyQhIzckIjBjJG9BK3htZCEjNjckNyQkIjBlMWFYTCcqRyQhIzckIjBWZGZ3Ny14JiEjNjckJCIweiMpUiVIXCpHJCEjNyQiMEpudWtDKXpkISM2NyQ3JCQiMCIqek07XiUqRyQhIzckIjB6WG1KYEV5JiEjNjckJCIweiMpUiVIXCpHJCEjNyQiMEpudWtDKXpkISM2NyQ3JCQiMCIqek07XiUqRyQhIzckIjB6WG1KYEV5JiEjNjckJCIwLyt1OS0kKkckISM3JCIwOW0ieXAoR3omISM2NyQ3JCQiMFJjIypccCMqRyQhIzckIjA6TXQnUTQmeiYhIzY3JCQiMC8rdTktJCpHJCEjNyQiMDltInlwKEd6JiEjNjckNyQkIjBSYyMqXHAjKkckISM3JCIwO010J1E0JnomISM2NyQkIjBKVE4xNyIqRyQhIzckIjAiKlxOLUZmIWUhIzY3JDckJCIwOE41WSkzKkckISM3JCIwXkEhPVdgMmUhIzY3JCQiMEpUTjE3IipHJCEjNyQiMCIqXE4tRmYhZSEjNjckNyQkIjA4TjVZKTMqRyQhIzckIjBeQSE9V2AyZSEjNjckJCIwNil6J29BKilHJCEjNyQiMCY+ZyxbKCo9ZSEjNjckNyQkIjA+UFAvMyopRyQhIzckIjApM3JvXCgqPmUhIzY3JCQiMDYpeidvQSopRyQhIzckIjAmPmcsWygqPWUhIzY3JDckJCIwPlBQLzMqKUckISM3JCIwKTNyb1woKj5lISM2NyQkIjBQJGY3U3QpRyQhIzckIjBXKSpwSz8/JGUhIzY3JDckJCIwTHpPQ0coKUckISM3JCIwQypSPmJUS2UhIzY3JCQiMFAkZjdTdClHJCEjNyQiMFcpKnBLPz8kZSEjNjckNyQkIjBMek9DRygpRyQhIzckIjBDKlI+YlRLZSEjNjckJCIwSGFNdzUnKUckISM3JCIvMSc9X3EwJWUhIzU3JDckJCIwIyl5SVlxakgkISM3JCIwRkkkekxNUmAhIzY3JCQiMCkpKltDIlJpSCQhIzckIjA9YEQvTXNNJiEjNjckNyQkIjApKSpbQyJSaUgkISM3JCIwPWBEL01zTSYhIzY3JCQiMDhcZSM9QidIJCEjNyQiMCQ+N3cmeXdNJiEjNjckNyQkIjB1V0F5S2dIJCEjNyQiMGFUS2Z1J2ZgISM2NyQkIjA4XGUjPUInSCQhIzckIjAkPjd3Jnl3TSYhIzY3JDckJCIwdVdBeUtnSCQhIzckIjBhVEtmdSdmYCEjNjckJCIwKnAselMsJ0gkISM3JCIwUSJcQHQiM08mISM2NyQ3JCQiLycpcDBzI2VIJCEjNiQiLypIUjk6QFAmISM1NyQkIjAqcCx6UywnSCQhIzckIjBRIlxAdCIzTyYhIzY3JDckJCIvJylwMHMjZUgkISM2JCIvKkhSOTpAUCYhIzU3JCQiMCl6LDpzeiZIJCEjNyQiMDsqNE9LJlJQJiEjNjckNyQkIi4jKj1SQWNIJCEjNSQiMEU9WXBiWFEmISM2NyQkIjApeiw6c3omSCQhIzckIjA7KjRPSyZSUCYhIzY3JDckJCIuIyo9UkFjSCQhIzUkIjBFPVlwYlhRJiEjNjckJCIvZicpSDdlJkgkISM2JCIwd0VGTCczKFEmISM2NyQ3JCQiMFxvaUw9YUgkISM3JCIwaTFgQycqcFImISM2NyQkIi9mJylIN2UmSCQhIzYkIjB3RUZMJzMoUSYhIzY3JDckJCIwXG9pTD1hSCQhIzckIjBpMWBDJypwUiYhIzY3JCQiMCRcRT1oTyZIJCEjNyQiMC1iJEdtQCthISM2NyQ3JCQiMFhtTi46X0gkISM3JCIwKVwqZnpPJTRhISM2NyQkIjAkXEU9aE8mSCQhIzckIjAtYiRHbUArYSEjNjckNyQkIjBYbU4uOl9IJCEjNyQiMClcKmZ6TyU0YSEjNjckJCIwIyl6Ryg9OiZIJCEjNyQiMC4vbDlXTFQmISM2NyQ3JCQiL05QIVs3XUgkISM2JCIwTSRvWXQoPVUmISM2NyQkIjAjKXpHKD06JkgkISM3JCIwLi9sOVdMVCYhIzY3JDckJCIvTlAhWzddSCQhIzYkIjBNJG9ZdCg9VSYhIzY3JCQiMGImPiFcUVxIJCEjNyQiMF9XJSkqKW9rVSYhIzY3JDckJCIwaTlIbjVbSCQhIzckIi88UCgqeUpNYSEjNTckJCIwYiY+IVxRXEgkISM3JCIwX1clKSopb2tVJiEjNjckNyQkIjBpOUhuNVtIJCEjNyQiLzxQKCp5Sk1hISM1NyQkIjBjREsnZnMlSCQhIzckIjBleWwhNGZSYSEjNjckNyQkIjA4JlEvJzRZSCQhIzckIjAxZyFbJWVuVyYhIzY3JCQiMGNESydmcyVIJCEjNyQiMGV5bCE0ZlJhISM2NyQ3JCQiMDgmUS8nNFlIJCEjNyQiMDFnIVslZW5XJiEjNjckJCIwbEFvRzlYSCQhIzckIjBZNXU9NUZYJiEjNjckNyQkIjBEVkBGNFdIJCEjNyQiMFVbKCkqKik+ZmEhIzY3JCQiMGxBb0c5WEgkISM3JCIwWTV1PTVGWCYhIzY3JDckJCIwRFZARjRXSCQhIzckIjBVWygpKiopPmZhISM2NyQkIjBoaFJYLlZIJCEjNyQiMD1tTXdFZVkmISM2NyQ3JCQiMCY0SnEnNFVIJCEjNyQiMHlPJVwmUjtaJiEjNjckJCIwaGhSWC5WSCQhIzckIjA9bU13RWVZJiEjNjckNyQkIjAmNEpxJzRVSCQhIzckIjB5TyVcJlI7WiYhIzY3JCQiMCUzRWhNNCVIJCEjNyQiMGkpZVgxJSp5YSEjNjckNyQkIjAlKlxtejVTSCQhIzckIjA5RCw1ITMlWyYhIzY3JCQiMCUzRWhNNCVIJCEjNyQiMGkpZVgxJSp5YSEjNjckNyQkIjAlKlxtejVTSCQhIzckIjA5RCw1ITMlWyYhIzY3JCQiL0pNLFYpUUgkISM2JCIwZEt1Jj0wI1wmISM2NyQ3JCQiMHRdXGs3UUgkISM3JCIvTiIzbD9sXCYhIzU3JCQiL0pNLFYpUUgkISM2JCIwZEt1Jj0wI1wmISM2NyQ3JCQiMHRdXGs3UUgkISM3JCIvTiIzbD9sXCYhIzU3JCQiMDN6KnBmbiRIJCEjNyQiMDdmRFRnXl0mISM2NyQ3JCQiMCdbNTdfaCRIJCEjNyQiMCc9XSw3JyozYiEjNjckJCIwM3oqcGZuJEgkISM3JCIwN2ZEVGdeXSYhIzY3JDckJCIwJ1s1N19oJEgkISM3JCIwJz1dLDcnKjNiISM2NyQkIjBrZz5Zb01IJCEjNyQiMCh5bUZqRT1iISM2NyQ3JCQiL1AtJVw9TUgkISM2JCIwQiE+XzxTQGIhIzY3JCQiMGtnPllvTUgkISM3JCIwKHltRmpFPWIhIzY3JDckJCIvUC0lXD1NSCQhIzYkIjBCIT5fPFNAYiEjNjckJCIweTFAeGhLSCQhIzckIjBhciQ+J3A4YCYhIzY3JDckJCIwbU5tW0FLSCQhIzckIjBmeUdJVVFgJiEjNjckJCIweTFAeGhLSCQhIzckIjBhciQ+J3A4YCYhIzY3JDckJCIwbU5tW0FLSCQhIzckIjBmeUdJVVFgJiEjNjckJCIwS2pfKmUwJEgkISM3JCIwbic+Ly5aV2IhIzY3JDckJCIwRlJjPUZJSCQhIzckIjAmcGNgR0dZYiEjNjckJCIwS2pfKmUwJEgkISM3JCIwbic+Ly5aV2IhIzY3JDckJCIwRlJjPUZJSCQhIzckIjAmcGNgR0dZYiEjNjckJCIweEJXIzMmR0gkISM3JCIwRDRZU292YiYhIzY3JDckJCIwNyd6JmVLR0gkISM3JCIwSmJVU0IoZWIhIzY3JCQiMHhCVyMzJkdIJCEjNyQiMEQ0WVNvdmImISM2NyQ3JCQiMDcneiZlS0dIJCEjNyQiMEpiVVNCKGViISM2NyQkIjB3b2piWUVIJCEjNyQiMDNLNCRSbXFiISM2NyQ3JCQiMCxNWG9RRUgkISM3JCIwblZcJlI7cmIhIzY3JCQiMHdvamJZRUgkISM3JCIwM0s0JFJtcWIhIzY3JDckJCIwLE1Yb1FFSCQhIzckIjBuVlwmUjtyYiEjNjckJCIwYm1LaCFcI0gkISM3JCIwOj8nPnFwIWUmISM2NyQ3JCQiMDMiKkdKXS1JJCEjNyQiMDBjLlM6WzYmISM2NyQkIjBPXnBlKTQrTCEjNyQiMHBpLDgvTDcmISM2NyQ3JCQiME9ecGUpNCtMISM3JCIwcGksOC9MNyYhIzY3JCQiMG1JIilcKjMrTCEjNyQiMGg1XHg+UTcmISM2NyQ3JCQiMD0oR15xKCkqSCQhIzckIjAwXjNvV2Q4JiEjNjckJCIwbUkiKVwqMytMISM3JCIwaDVceD5RNyYhIzY3JDckJCIwPShHXnEoKSpIJCEjNyQiMDBeM29XZDgmISM2NyQkIjBcIXlvWiYpKkgkISM3JCIwVS1SKEgsUF4hIzY3JDckJCIwRDMuUWMnKkgkISM3JCIwVFI6QiY9W14hIzY3JCQiMFwheW9aJikqSCQhIzckIjBVLVIoSCxQXiEjNjckNyQkIjBEMy5RYycqSCQhIzckIjBUUjpCJj1bXiEjNjckJCIweScpby9AJypIJCEjNyQiMCZRYFVIP11eISM2NyQ3JCQiMGlLJXBsVipIJCEjNyQiMHhGQXlEMTsmISM2NyQkIjB5JylvL0AnKkgkISM3JCIwJlFgVUg/XV4hIzY3JDckJCIwaUslcGxWKkgkISM3JCIweEZBeUQxOyYhIzY3JCQiMHZwXEspUSpIJCEjNyQiMFcpeS8oKlFqXiEjNjckNyQkIi90OzZ3QCpIJCEjNiQiMDg7SExtSTwmISM2NyQkIjB2cFxLKVEqSCQhIzckIjBXKXkvKCpRal4hIzY3JDckJCIvdDs2d0AqSCQhIzYkIjA4O0hMbUk8JiEjNjckJCIwZFNiZmMiKkgkISM3JCIwdXlZR3RsPCYhIzY3JDckJCIwcmksXSoqKilIJCEjNyQiMFwvTylvXSY9JiEjNjckJCIwZFNiZmMiKkgkISM3JCIwdXlZR3RsPCYhIzY3JDckJCIwcmksXSoqKilIJCEjNyQiMFwvTylvXSY9JiEjNjckJCIvMmNdZSMqKUgkISM2JCIwKip6enFgKCo9JiEjNjckNyQkIjAoZmtMQXkpSCQhIzckIjAmR0hNdSV6PiYhIzY3JCQiLzJjXWUjKilIJCEjNiQiMCoqenpxYCgqPSYhIzY3JDckJCIwKGZrTEF5KUgkISM3JCIwJkdITXUlej4mISM2NyQkIi9ZXCYzJ3ApSCQhIzYkIjA4TiMqKTQkSD8mISM2NyQ3JCQiMFArRCFlYylIJCEjNyQiMEAiKVwpelE1XyEjNjckJCIvWVwmMydwKUgkISM2JCIwOE4jKik0JEg/JiEjNjckNyQkIjBQK0QhZWMpSCQhIzckIjBAIilcKXpRNV8hIzY3JCQiLzY7IUhuJSlIJCEjNiQiMGkqM2heNTtfISM2NyQ3JCQiMGl3Uj9dJClIJCEjNyQiMGRwY2BHR0EmISM2NyQkIi82OyFIbiUpSCQhIzYkIjBpKjNoXjU7XyEjNjckNyQkIjBpd1I/XSQpSCQhIzckIjBlcGNgR0dBJiEjNjckJCIwQDo5WVIjKUgkISM3JCIveGlMaUZIXyEjNTckNyQkIjBEXUlWTiIpSCQhIzckIjAlek4nM3BfQiYhIzY3JCQiMEA6OVlSIylIJCEjNyQiL3hpTGlGSF8hIzU3JDckJCIwRF1JVk4iKUgkISM3JCIwJXpOJzNwX0ImISM2NyQkIjAjZiMqKmU3ISlIJCEjNyQiMCIpb25CV0NDJiEjNjckNyQkIjAwZEFbQHpIJCEjNyQiL2ovUCc0eEMmISM1NyQkIjAjZiMqKmU3ISlIJCEjNyQiMCIpb25CV0NDJiEjNjckNyQkIjAwZEFbQHpIJCEjNyQiL2ovUCc0eEMmISM1NyQkIjAqemhwbXkoSCQhIzckIjAkSCoqKj00Y0QmISM2NyQ3JCQiME9dek0zeEgkISM3JCIwbU14PV0sRSYhIzY3JCQiMCp6aHBteShIJCEjNyQiMCRIKioqPTRjRCYhIzY3JDckJCIwT116TTN4SCQhIzckIjBtTXg9XSxFJiEjNjckJCIwQHdLcGh2SCQhIzckIjBCTms2cihvXyEjNjckNyQkIjBPR1YtJ1woSCQhIzckIjAtQiVRMmZzXyEjNjckJCIwQHdLcGh2SCQhIzckIjBCTms2cihvXyEjNjckNyQkIjBPR1YtJ1woSCQhIzckIjAtQiVRMmZzXyEjNjckJCIwYmNobFB0SCQhIzckIjBHMjguST5HJiEjNjckNyQkIjBKNyUzWEcoSCQhIzckIjBRNiIqR0pdRyYhIzY3JCQiMGJjaGxQdEgkISM3JCIwRzI4Lkk+RyYhIzY3JDckJCIwSjclM1hHKEgkISM3JCIwUTYiKkdKXUcmISM2NyQkIjAmKWY3YjlySCQhIzckIjBgXnEmZjMmSCYhIzY3JDckJCIwN25IenRxSCQhIzckIjB1KnpSPVooSCYhIzY3JCQiMCYpZjdiOXJIJCEjNyQiMGBecSZmMyZIJiEjNjckNyQkIjA3bkh6dHFIJCEjNyQiMHUqelI9WihIJiEjNjckJCIwWDwocEIqb0gkISM3JCIwJ1s1QSpRIzNgISM2NyQ3JCQiMDRcSChRJ29IJCEjNyQiLyIpWyFSNyo0YCEjNTckJCIwWDwocEIqb0gkISM3JCIwJ1s1QSpRIzNgISM2NyQ3JCQiMDRcSChRJ29IJCEjNyQiLyIpWyFSNyo0YCEjNTckJCIwPGUoNDZuJ0gkISM3JCIwX1lAJCopUUBgISM2NyQ3JCQiL1wrWVpsJ0gkISM2JCIwWXc2JUhOQWAhIzY3JCQiMDxlKDQ2bidIJCEjNyQiMF9ZQCQqKVFAYCEjNjckNyQkIi9cK1labCdIJCEjNiQiMFl3NiVITkFgISM2NyQkIjBhMidmMlgnSCQhIzckIi8zJFwtT1hMJiEjNTckNyQkIjBPSElTWWtIJCEjNyQiMCNbJz1cJHpNYCEjNjckJCIwYTInZjJYJ0gkISM3JCIvMyRcLU9YTCYhIzU3JDckJCIwT0hJU1lrSCQhIzckIjAjWyc9XCR6TWAhIzY3JCQiMCMpeUlZcWpIJCEjNyQiMEZJJHpMTVJgISM2NyQ3JCQiME4uRjtJVEkkISM3JCIwVUo/UmBjIVwhIzY3JCQiMEgrJWY+LC9MISM3JCIwY2clb1oiPSJcISM2NyQ3JCQiMEgrJWY+LC9MISM3JCIwY2clb1oiPSJcISM2NyQkIjBwbSNHVisvTCEjNyQiMCZIXF0jPUEiXCEjNjckNyQkIjBhLDU+dVBJJCEjNyQiMCQqWyI+YERDXCEjNjckJCIwcG0jR1YrL0whIzckIjAmSFxdIz1BIlwhIzY3JDckJCIwYSw1PnVQSSQhIzckIjAkKlsiPmBEQ1whIzY3JCQiMDc/R0heUEkkISM3JCIwMSg0WixaRFwhIzY3JDckJCIwd2gpKlJQTkkkISM3JCIwSFApcGVwT1whIzY3JCQiMDc/R0heUEkkISM3JCIwMSg0WixaRFwhIzY3JDckJCIwd2gpKlJQTkkkISM3JCIwSFApcGVwT1whIzY3JCQiMDo8dFMqXC5MISM3JCIwc2lrTj0oUVwhIzY3JDckJCIwaWNuZCxMSSQhIzckIjBsRDBVTyJcXCEjNjckJCIwOjx0UypcLkwhIzckIjBzaWtOPShRXCEjNjckNyQkIjBpY25kLExJJCEjNyQiMGxEMFVPIlxcISM2NyQkIjBpTDBtW0tJJCEjNyQiMGJ6WCJIJz4mXCEjNjckNyQkIjBId3VybUlJJCEjNyQiMCw5NyhwZGhcISM2NyQkIjBpTDBtW0tJJCEjNyQiMGJ6WCJIJz4mXCEjNjckNyQkIjBId3VybUlJJCEjNyQiMCw5NyhwZGhcISM2NyQkIjAmcFxZISoqSEkkISM3JCIwUilmU1E/bFwhIzY3JDckJCIwYjNQIkckR0kkISM3JCIwUC0+XzxTKFwhIzY3JCQiMCZwXFkhKipISSQhIzckIjBSKWZTUT9sXCEjNjckNyQkIjBiM1AiRyRHSSQhIzckIjBQLT5fPFMoXCEjNjckJCIwdihlYDB2LUwhIzckIjBFdzw8VCV5XCEjNjckNyQkIjBSZypmKSpmLUwhIzckIjB0IWZzIWVrKVwhIzY3JCQiMHYoZWAwdi1MISM3JCIwRXc8PFQleVwhIzY3JDckJCIwUmcqZikqZi1MISM3JCIwdCFmcyFlaylcISM2NyQkIjBiNGA8LkRJJCEjNyQiMHZWKkdcbiIqXCEjNjckNyQkIjB4MCJceU8tTCEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMGI0YDwuREkkISM3JCIwdlYqR1xuIipcISM2NyQ3JCQiMHgwIlx5Ty1MISM3JCIwNHpLaSkqKSkqXCEjNjckJCIwKWZqLnBELUwhIzckIjAtUHk4MFwrJiEjNjckNyQkIjA2VGF4T0BJJCEjNyQiMFhuUjxSOCwmISM2NyQkIjApZmoucEQtTCEjNyQiMC1QeTgwXCsmISM2NyQ3JCQiMDZUYXhPQEkkISM3JCIwWG5SPFI4LCYhIzY3JCQiMCY0UUc8LC1MISM3JCIwTTw2JD04PV0hIzY3JDckJCIwLyF6Sm0hPkkkISM3JCIwImVsQyh6UC0mISM2NyQkIjAmNFFHPCwtTCEjNyQiME08NiQ9OD1dISM2NyQ3JCQiMC8hekptIT5JJCEjNyQiMCJlbEMoelAtJiEjNjckJCIvczFVd3csTCEjNiQiLyx3S11OSl0hIzU3JDckJCIwWCZ5NnVuLEwhIzckIjA8V2BGP2kuJiEjNjckJCIvczFVd3csTCEjNiQiLyx3S11OSl0hIzU3JDckJCIwWCZ5NnVuLEwhIzckIjA8V2BGP2kuJiEjNjckJCIwVjlgakM6SSQhIzckIjAiRyVHeHVYLyYhIzY3JDckJCIwdEIpMyJcOUkkISM3JCIwYEtnIzNtW10hIzY3JCQiMFY5YGpDOkkkISM3JCIwIkclR3h1WC8mISM2NyQ3JCQiMHRCKTMiXDlJJCEjNyQiMGBLZyMzbVtdISM2NyQkIjAmR2guRkcsTCEjNyQiMCRmI2UxInpkXSEjNjckNyQkIjAsSStzQDdJJCEjNyQiMCozc3c4NWhdISM2NyQkIjAmR2guRkcsTCEjNyQiMCRmI2UxInpkXSEjNjckNyQkIjAsSStzQDdJJCEjNyQiMCozc3c4NWhdISM2NyQkIjBXLGQkPS8sTCEjNyQiMEo8eSVSK3JdISM2NyQ3JCQiMCZla05fKjRJJCEjNyQiMEQ0dSM+YXRdISM2NyQkIjBXLGQkPS8sTCEjNyQiMEo8eSVSK3JdISM2NyQ3JCQiMCZla05fKjRJJCEjNyQiMEQ0dSM+YXRdISM2NyQkIjAvbE8tLTNJJCEjNyQiMGYnPldNQCUzJiEjNjckNyQkIjBSMCxscDJJJCEjNyQiMGgoNHlDKWYzJiEjNjckJCIwL2xPLS0zSSQhIzckIjBmJz5XTUAlMyYhIzY3JDckJCIwUjAsbHAySSQhIzckIjBoKDR5QylmMyYhIzY3JCQiMEdtP0VqMEkkISM3JCIwVClScyY+dTQmISM2NyQ3JCQiMGVFJWZcYStMISM3JCIwKGZ5R0lVKTQmISM2NyQkIjBHbT9FajBJJCEjNyQiMFQpUnMmPnU0JiEjNjckNyQkIjBlRSVmXGErTCEjNyQiMChmeUdJVSk0JiEjNjckJCIwaU1AYUQuSSQhIzckIjAxWDBPQTE2JiEjNjckNyQkIjBoT3A6QC5JJCEjNyQiMEx1JXpOJzM2JiEjNjckJCIwaU1AYUQuSSQhIzckIjAxWDBPQTE2JiEjNjckNyQkIjBoT3A6QC5JJCEjNyQiMEx1JXpOJzM2JiEjNjckJCIwMyIqR0pdLUkkISM3JCIwMGMuUzpbNiYhIzY3JDckJCIwaDpELDUhM0whIzckIjBbQTEwI2U1WiEjNjckJCIwUUhdMWx6SSQhIzckIi9vV2RmdzdaISM1NyQ3JCQiMFFIXTFsekkkISM3JCIvb1dkZnc3WiEjNTckJCIwTyFSUT4nekkkISM3JCIwRS5bNT9IciUhIzY3JDckJCIwUUdLKCo0eEkkISM3JCIwO04iM2w/RFohIzY3JCQiME8hUlE+J3pJJCEjNyQiMEUuWzU/SHIlISM2NyQ3JCQiMFFHSygqNHhJJCEjNyQiMDtOIjNsP0RaISM2NyQkIjB1LjY9Km8yTCEjNyQiMEFMJlFfQkVaISM2NyQ3JCQiMGY9ZSlmWDJMISM3JCIwX0IpZXFrUFohIzY3JCQiMHUuNj0qbzJMISM3JCIwQUwmUV9CRVohIzY3JDckJCIwZj1lKWZYMkwhIzckIjBfQillcWtQWiEjNjckJCIwRDQiUXhUMkwhIzckIjAxXCFlaGFSWiEjNjckNyQkIjBjWFI0LnNJJCEjNyQiMCk9XjR3M11aISM2NyQkIjBENCJReFQyTCEjNyQiMDFcIWVoYVJaISM2NyQ3JCQiMGNYUjQuc0kkISM3JCIwKT1eNHczXVohIzY3JCQiL0VgKWZackkkISM2JCIvKD0jKSpHJkd2JSEjNTckNyQkIjBrRCkqR15wSSQhIzckIjBDKy07R0R3JSEjNjckJCIvRWApZlpySSQhIzYkIi8oPSMpKkcmR3YlISM1NyQ3JCQiMGtEKSpHXnBJJCEjNyQiMEMrLTtHRHclISM2NyQkIi8oUTR2eW9JJCEjNiQiMDszZFxiaHclISM2NyQ3JCQiMDlMZ2MrbkkkISM3JCIvJykpM3JvXHglISM1NyQkIi8oUTR2eW9JJCEjNiQiMDszZFxiaHclISM2NyQ3JCQiMDlMZ2MrbkkkISM3JCIvJykpM3JvXHglISM1NyQkIi9LVCY9Nm1JJCEjNiQiMEgyQilSWHpaISM2NyQ3JCQiME1MRiI0WDFMISM3JCIwJ3BkaCM0dXklISM2NyQkIi9LVCY9Nm1JJCEjNiQiMEgyQilSWHpaISM2NyQ3JCQiME1MRiI0WDFMISM3JCIwJ3BkaCM0dXklISM2NyQkIjBOKio0KltNMUwhIzckIjBYW0pSW0Z6JSEjNjckNyQkIjBNYWBLLWlJJCEjNyQiMEtsQSIpXCkqeiUhIzY3JCQiME4qKjQqW00xTCEjNyQiMFhbSlJbRnolISM2NyQ3JCQiME1hYEstaUkkISM3JCIwS2xBIilcKSp6JSEjNjckJCIwIj1cZCl6Z0kkISM3JCIwYmE0d1FnIVshIzY3JDckJCIwdm9GemFmSSQhIzckIjBvYEhPIUg3WyEjNjckJCIwIj1cZCl6Z0kkISM3JCIwYmE0d1FnIVshIzY3JDckJCIwdm9GemFmSSQhIzckIjBvYEhPIUg3WyEjNjckJCIvM1x1ZyJlSSQhIzYkIjAkPjI+Xks+WyEjNjckNyQkIjBNcCQ0JDNkSSQhIzckIjAvVU8iNHRDWyEjNjckJCIvM1x1ZyJlSSQhIzYkIjAkPjI+Xks+WyEjNjckNyQkIjBNcCQ0JDNkSSQhIzckIjAvVU8iNHRDWyEjNjckJCIwQyNcTE5iMEwhIzckIjBmb1pcMkUkWyEjNjckNyQkIjBmJT5vR1kwTCEjNyQiLy9Mazk8UFshIzU3JCQiMEMjXExOYjBMISM3JCIwZm9aXDJFJFshIzY3JDckJCIwZiU+b0dZMEwhIzckIi8vTGs5PFBbISM1NyQkIjB4eDdBI0gwTCEjNyQiMGBHLyRmKWUlWyEjNjckNyQkIi83eGUlPV9JJCEjNiQiMHc9XSw3J1xbISM2NyQkIjB4eDdBI0gwTCEjNyQiMGBHLyRmKWUlWyEjNjckNyQkIi83eGUlPV9JJCEjNiQiMHc9XSw3J1xbISM2NyQkIjBGUyhIQC4wTCEjNyQiL28vXy87ZlshIzU3JDckJCIwSmxmMnZcSSQhIzckIjA3MmRjXz8nWyEjNjckJCIwRlMoSEAuMEwhIzckIi9vL18vO2ZbISM1NyQ3JCQiMEpsZjJ2XEkkISM3JCIwNzJkY18/J1shIzY3JCQiMEtxMER0WkkkISM3JCIvc0UnM0pDKFshIzU3JDckJCIwJlFHOEZ0L0whIzckIjBbJlI7Slx1WyEjNjckJCIwS3EwRHRaSSQhIzckIi9zRSczSkMoWyEjNTckNyQkIjAmUUc4RnQvTCEjNyQiMFsmUjtKXHVbISM2NyQkIi5bPGQ6WEkkISM1JCIwKjRqcnlwJilbISM2NyQ3JCQiMENpOE8iXC9MISM3JCIwJVEzbk8kcClbISM2NyQkIi5bPGQ6WEkkISM1JCIwKjRqcnlwJilbISM2NyQ3JCQiMENpOE8iXC9MISM3JCIwJVEzbk8kcClbISM2NyQkIjBQSlkzZlVJJCEjNyQiMDpbZSQzJyopKlshIzY3JDckJCIwQnRTLF5VSSQhIzckIi9BeDxVUCoqWyEjNTckJCIwUEpZM2ZVSSQhIzckIjA6W2UkMycqKSpbISM2NyQ3JCQiMEJ0UyxeVUkkISM3JCIvQXg8VVAqKlshIzU3JCQiME4uRjtJVEkkISM3JCIwVUo/UmBjIVwhIzY3JDckJCIwKXlLaSkqKT1KJCEjNyQiL3lMbC5cR1ghIzU3JCQiLyZmR2tuO0okISM2JCIwdjR5QylmUVghIzY3JDckJCIvJmZHa247SiQhIzYkIjB2NHlDKWZRWCEjNjckJCIwdC13MF47SiQhIzckIjAoZWdqUk9SWCEjNjckNyQkIjBmKW9ZYFI2TCEjNyQiMDYpXCl6UTViJSEjNjckJCIwdC13MF47SiQhIzckIjAoZWdqUk9SWCEjNjckNyQkIjBmKW9ZYFI2TCEjNyQiMDYpXCl6UTViJSEjNjckJCIuWGhlZThKJCEjNSQiLzsoKTRCdV9YISM1NyQ3JCQiMHlGQkhDNkokISM3JCIwWic9XCR6TWMlISM2NyQkIi5YaGVlOEokISM1JCIvOygpNEJ1X1ghIzU3JDckJCIweUZCSEM2SiQhIzckIjBaJz1cJHpNYyUhIzY3JCQiMEV3KDN3MTZMISM3JCIwRjhhJ2U2bVghIzY3JDckJCIwRCI+b1cmM0okISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMEV3KDN3MTZMISM3JCIwRjhhJ2U2bVghIzY3JDckJCIwRCI+b1cmM0okISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMFk4LzZ5MkokISM3JCIwJ1JmeVlbelghIzY3JDckJCIwI1tsa2VlNUwhIzckIjA+ajBYZyQpZSUhIzY3JCQiMFk4LzZ5MkokISM3JCIwJ1JmeVlbelghIzY3JDckJCIwI1tsa2VlNUwhIzckIjA+ajBYZyQpZSUhIzY3JCQiMCdSKnoyIVw1TCEjNyQiMFIpSCJ6W0dmJSEjNjckNyQkIi8mektaPS5KJCEjNiQiMGJeNyssM2clISM2NyQkIjAnUip6MiFcNUwhIzckIjBSKUgieltHZiUhIzY3JDckJCIvJnpLWj0uSiQhIzYkIjBiXjcrLDNnJSEjNjckJCIwNCplK04/NUwhIzckIjAkKW8mUSMzaWclISM2NyQ3JCQiMCIqZV1HXytKJCEjNyQiMCIqUj5iVEtoJSEjNjckJCIwNCplK04/NUwhIzckIjAkKW8mUSMzaWclISM2NyQ3JCQiMCIqZV1HXytKJCEjNyQiMCIqUj5iVEtoJSEjNjckJCIwNyRIayQ9KjRMISM3JCIwRyQqXDFqJj5ZISM2NyQ3JCQiMClceChHKHk0TCEjNyQiMEdHRTUjb0RZISM2NyQkIjA3JEhrJD0qNEwhIzckIjBHJCpcMWomPlkhIzY3JDckJCIwKVx4KEcoeTRMISM3JCIwRkdFNSNvRFkhIzY3JCQiMGJuYGxNJzRMISM3JCIwakJZSjhIaiUhIzY3JDckJCIvY3l2TV80TCEjNiQiMGs7TGxBIlFZISM2NyQkIjBibmBsTSc0TCEjNyQiMGpCWUo4SGolISM2NyQ3JCQiL2N5dk1fNEwhIzYkIjBrO0xsQSJRWSEjNjckJCIvWyFHT18kNEwhIzYkIjA4YkYtZmlrJSEjNjckNyQkIjAyWWkkM0U0TCEjNyQiLjBTP2owbCUhIio3JCQiL1shR09fJDRMISM2JCIwOGJGLWZpayUhIzY3JDckJCIwMllpJDNFNEwhIzckIi4wUz9qMGwlISIqNyQkIjA5WUhaciE0TCEjNyQiMCdRPUwtZ2ZZISM2NyQ3JCQiMGwtSk8qKiozTCEjNyQiME8kcGFQK2pZISM2NyQkIjA5WUhaciE0TCEjNyQiMCdRPUwtZ2ZZISM2NyQ3JCQiMGwtSk8qKiozTCEjNyQiME8kcGFQK2pZISM2NyQkIjA5L2EoPnozTCEjNyQiMGQ7I3pwJEhuJSEjNjckNyQkIjB5QWcvUigzTCEjNyQiMHMiUTBWV3ZZISM2NyQkIjA5L2EoPnozTCEjNyQiMGQ7I3pwJEhuJSEjNjckNyQkIjB5QWcvUigzTCEjNyQiMHMiUTBWV3ZZISM2NyQkIjBvOG8mUV4zTCEjNyQiMCl5cS4kcGlvJSEjNjckNyQkIjBpRWsoKXolM0whIzckIjAzcWcmWyl5byUhIzY3JCQiMG84byZRXjNMISM3JCIwKXlxLiRwaW8lISM2NyQ3JCQiMGlFaygpeiUzTCEjNyQiMDNxZyZbKXlvJSEjNjckJCIwYjthNVAjM0whIzckIjAlKmZWQyhmKnAlISM2NyQ3JCQiMGx1XSU9QTNMISM3JCIwV2VuU0QucSUhIzY3JCQiMGI7YTVQIzNMISM3JCIwJSpmVkMoZipwJSEjNjckNyQkIjBsdV0lPUEzTCEjNyQiMFdlblNELnElISM2NyQkIjBoOkQsNSEzTCEjNyQiMFtBMTAjZTVaISM2NyQ3JCQiMDlTQHJwZEokISM3JCIwXkhsMiVSZVYhIzY3JCQiMHlwS2BGY0okISM3JCIwcnMiUTBWa1YhIzY3JDckJCIweXBLYEZjSiQhIzckIjBycyJRMFZrViEjNjckJCIwbGcmM2hoOkwhIzckIjAkemhnSSNcTyUhIzY3JDckJCIwJm9EKXpOYEokISM3JCIwMmgpKTNyb1AlISM2NyQkIjBsZyYzaGg6TCEjNyQiMCR6aGdJI1xPJSEjNjckNyQkIjAmb0Qpek5gSiQhIzckIjAyaCkpM3JvUCUhIzY3JCQiL3NFeTVJOkwhIzYkIjAkKSlwU1BQeVYhIzY3JDckJCIvTzhwYS86TCEjNiQiMFZcJlI7SipRJSEjNjckJCIvc0V5NUk6TCEjNiQiMCQpKXBTUFB5ViEjNjckNyQkIi9POHBhLzpMISM2JCIwVlwmUjtKKlElISM2NyQkIjAqKXo4dygpXEokISM3JCIwJmUjbyMqPT1SJSEjNjckNyQkIjAubllgY1pKJCEjNyQiMHpQLT5fPFMlISM2NyQkIjAqKXo4dygpXEokISM3JCIwJmUjbyMqPT1SJSEjNjckNyQkIjAubllgY1pKJCEjNyQiMHpQLT5fPFMlISM2NyQkIjA+Vzc5d1lKJCEjNyQiMCU0U3MnZV9TJSEjNjckNyQkIjBEJz4iKSpvV0okISM3JCIwOkU0dSM+OVchIzY3JCQiMD5XNzl3WUokISM3JCIwJTRTcydlX1MlISM2NyQ3JCQiMEQnPiIpKm9XSiQhIzckIjA6RTR1Iz45VyEjNjckJCIwJFFwLGlPOUwhIzckIjBXZyNISXA9VyEjNjckNyQkIjBeaCkpeiM9OUwhIzckIjBeOTtITG1VJSEjNjckJCIwJFFwLGlPOUwhIzckIjBXZyNISXA9VyEjNjckNyQkIjBeaCkpeiM9OUwhIzckIjBeOTtITG1VJSEjNjckJCIvczRGejA5TCEjNiQiMFJFdi9BQFYlISM2NyQ3JCQiMG07cyh6KlFKJCEjNyQiMChHSVVRMlJXISM2NyQkIi9zNEZ6MDlMISM2JCIwUkV2L0FAViUhIzY3JDckJCIwbTtzKHoqUUokISM3JCIwKEdJVVEyUlchIzY3JCQiME0mRy04djhMISM3JCIwSlBleFhiVyUhIzY3JDckJCIwdiY+LVhoOEwhIzckIjBCIipIUjk6WCUhIzY3JCQiME0mRy04djhMISM3JCIwSlBleFhiVyUhIzY3JDckJCIwdiY+LVhoOEwhIzckIjBCIipIUjk6WCUhIzY3JCQiLDRKWU1KJCEiKSQiMDRYbUVrKmVXISM2NyQ3JCQiMHo7VU9LTEokISM3JCIwZnpPJVwmUlklISM2NyQkIiw0SllNSiQhIikkIjA0WG1FayplVyEjNjckNyQkIjB6O1VPS0xKJCEjNyQiMGZ6TyVcJlJZJSEjNjckJCIwayo+UEg5OEwhIzckIi9WVXF2UHNXISM1NyQ3JCQiLzZqXjowOEwhIzYkIjAmek8lXCZSd1chIzY3JCQiMGsqPlBIOThMISM3JCIvVlVxdlBzVyEjNTckNyQkIi82al46MDhMISM2JCIwJnpPJVwmUndXISM2NyQkIjByP1w7VEdKJCEjNyQiMDxCJFJkeSZbJSEjNjckNyQkIjAxVUYwc0ZKJCEjNyQiMEpjXS9PKSlbJSEjNjckJCIwcj9cO1RHSiQhIzckIjA8QiRSZHkmWyUhIzY3JDckJCIwMVVGMHNGSiQhIzckIjBKY10vTykpWyUhIzY3JCQiMC0peSMpNGE3TCEjNyQiMDAmXDQpKT0qXCUhIzY3JDckJCIwXyN5ZVFcN0whIzckIjBuV2RmdzddJSEjNjckJCIwLSl5Iyk0YTdMISM3JCIwMCZcNCkpPSpcJSEjNjckNyQkIjBfI3llUVw3TCEjNyQiMG5XZGZ3N10lISM2NyQkIjBMJTN1QkM3TCEjNyQiMCpIYU1vZTdYISM2NyQ3JCQiMDQxJGVwQDdMISM3JCIwLkxrOTxQXiUhIzY3JCQiMEwlM3VCQzdMISM3JCIwKkhhTW9lN1ghIzY3JDckJCIwNDEkZXBAN0whIzckIjAuTGs5PFBeJSEjNjckJCIvKDRIS1g+SiQhIzYkIjBPXGEnKXpmXyUhIzY3JDckJCIwQzYlUjglPkokISM3JCIwUkBycGRoXyUhIzY3JCQiLyg0SEtYPkokISM2JCIwT1xhJyl6Zl8lISM2NyQ3JCQiMEM2JVI4JT5KJCEjNyQiMFJAcnBkaF8lISM2NyQkIjApeUtpKSopPUokISM3JCIveUxsLlxHWCEjNTckNyQkIjBUXz5jXCc+TCEjNyQiMFg1S1o6JSo+JSEjNjckJCIwLW4pZm1jPkwhIzckIjAtQyN6THEtVSEjNjckNyQkIjAtbilmbWM+TCEjNyQiMC1DI3pMcS1VISM2NyQkIjAqPTIiXGYmPkwhIzckIjA4V3I9IypIPyUhIzY3JDckJCIwI29QY1ZEPkwhIzckIjBRNypIUjk6VSEjNjckJCIwKj0yIlxmJj5MISM3JCIwOFdyPSMqSD8lISM2NyQ3JCQiMCNvUGNWRD5MISM3JCIwUTcqSFI5OlUhIzY3JCQiMCxPTUw/Iz5MISM3JCIwMiJRSS1fO1UhIzY3JDckJCIwVmUiW08lKj1MISM3JCIwdSsxWyVlRlUhIzY3JCQiMCxPTUw/Iz5MISM3JCIwMiJRSS1fO1UhIzY3JDckJCIwVmUiW08lKj1MISM3JCIwdSsxWyVlRlUhIzY3JCQiMGgzZzkkKSk9TCEjNyQiMCkpUmkmPi9JVSEjNjckNyQkIjBvbio9WGo9TCEjNyQiLyIqR0pdLVNVISM1NyQkIjBoM2c5JCkpPUwhIzckIjApKVJpJj4vSVUhIzY3JDckJCIwb24qPVhqPUwhIzckIi8iKkdKXS1TVSEjNTckJCIwSHhpIXphPUwhIzckIjBWMHBWZE5DJSEjNjckNyQkIi9PMmRwSz1MISM2JCIwWXg+ZWxDRCUhIzY3JCQiMEh4aSF6YT1MISM3JCIwVjBwVmROQyUhIzY3JDckJCIvTzJkcEs9TCEjNiQiMFl4PmVsQ0QlISM2NyQkIjAkKXBtZjkjPUwhIzckIjBCQShHbjFkVSEjNjckNyQkIjBtJD5ZNC09TCEjNyQiMCNlbUtoIVxFJSEjNjckJCIwJClwbWY5Iz1MISM3JCIwQkEoR24xZFUhIzY3JDckJCIwbSQ+WTQtPUwhIzckIjAjZW1LaCFcRSUhIzY3JCQiLyVIZT4kKXlKJCEjNiQiMCMqcCwhKnAwRiUhIzY3JDckJCIwdCxQWjt4SiQhIzckIjA9YUxvWXRGJSEjNjckJCIvJUhlPiQpeUokISM2JCIwIypwLCEqcDBGJSEjNjckNyQkIjB0LFBaO3hKJCEjNyQiMD1hTG9ZdEYlISM2NyQkIjBWTltvYHZKJCEjNyQiME87PixuU0clISM2NyQ3JCQiMFpRZl84dUokISM3JCIwYVVTQih5KkclISM2NyQkIjBWTltvYHZKJCEjNyQiME87PixuU0clISM2NyQ3JCQiMFpRZl84dUokISM3JCIwYVVTQih5KkclISM2NyQkIjAoM0FXZ0E8TCEjNyQiMHUiUUUiZXZIJSEjNjckNyQkIjBNNW4zN3JKJCEjNyQiLzR0JXlGQUklISM1NyQkIjAoM0FXZ0E8TCEjNyQiMHUiUUUiZXZIJSEjNjckNyQkIjBNNW4zN3JKJCEjNyQiLzR0JXlGQUklISM1NyQkIjAvTk9EK3BKJCEjNyQiMFw+KTNMLzZWISM2NyQ3JCQiMHN2Xjk3b0okISM3JCIwRT5hTG9ZSiUhIzY3JCQiMC9OT0QrcEokISM3JCIwXD4pM0wvNlYhIzY3JDckJCIwc3ZeOTdvSiQhIzckIjBFPmFMb1lKJSEjNjckJCIwT1liSHdsSiQhIzckIjAjUVc6RV9DViEjNjckNyQkIi8kNGpvOGxKJCEjNiQiMGoyaCkpM3JLJSEjNjckJCIwT1liSHdsSiQhIzckIjAjUVc6RV9DViEjNjckNyQkIi8kNGpvOGxKJCEjNiQiMGoyaCkpM3JLJSEjNjckJCIwbzRKOmFpSiQhIzckIjAmeUUraCp6TCUhIzY3JDckJCIvJ3AnKnA7aUokISM2JCIwKmZ6TyVcJlJWISM2NyQkIjBvNEo6YWlKJCEjNyQiMCZ5RStoKnpMJSEjNjckNyQkIi8ncCcqcDtpSiQhIzYkIjAqZnpPJVwmUlYhIzY3JCQiMGFoZSFRJGZKJCEjNyQiMHIxKkdRWV5WISM2NyQ3JCQiMClIIilwNiNmSiQhIzckIjBOJVsoKSoqKT5OJSEjNjckJCIwYWhlIVEkZkokISM3JCIwcjEqR1FZXlYhIzY3JDckJCIwKUgiKXA2I2ZKJCEjNyQiME0lWygpKiopPk4lISM2NyQkIjA5U0BycGRKJCEjNyQiMF5IbDIlUmVWISM2NyQ3JCQiMG5rPFRITkskISM3JCIwX143KSp5MjAlISM2NyQkIi8oemtGZU1LJCEjNiQiL1AnNHg7TTAlISM1NyQ3JCQiLyh6a0ZlTUskISM2JCIvUCc0eDtNMCUhIzU3JCQiMGIxMm1eTUskISM3JCIwVXBmMm1PMCUhIzY3JDckJCIwSGJvSkNKSyQhIzckIjAxXztLZGUxJSEjNjckJCIwYjEybV5NSyQhIzckIjBVcGYybU8wJSEjNjckNyQkIjBIYm9KQ0pLJCEjNyQiMDFfO0tkZTElISM2NyQkIjB5XyM+bzNCTCEjNyQiMG5ESlp3czElISM2NyQ3JCQiL3kybEB6QUwhIzYkIjBVU0IoeUh5UyEjNjckJCIweV8jPm8zQkwhIzckIjBuREpad3MxJSEjNjckNyQkIi95MmxAekFMISM2JCIwVVNCKHlIeVMhIzY3JCQiMChIJj1DQ0ZLJCEjNyQiMFktMmh6MzMlISM2NyQ3JCQiMEhFcSE9WUFMISM3JCIweUdJVVEyNCUhIzY3JCQiMChIJj1DQ0ZLJCEjNyQiMFktMmh6MzMlISM2NyQ3JCQiMEhFcSE9WUFMISM3JCIweUdJVVEyNCUhIzY3JCQiL0orMlJPQUwhIzYkIjBOXndidlc0JSEjNjckNyQkIjAjKWZBQUxASyQhIzckIjA5PFAoKnlKNSUhIzY3JCQiL0orMlJPQUwhIzYkIjBOXndidlc0JSEjNjckNyQkIjAjKWZBQUxASyQhIzckIjA5PFAoKnlKNSUhIzY3JCQiMEwsZHkwP0skISM3JCIwVGxwU2shM1QhIzY3JDckJCIwOmJKUjE9SyQhIzckIi9iU0MmPmM2JSEjNTckJCIwTCxkeTA/SyQhIzckIjBUbHBTayEzVCEjNjckNyQkIjA6YkpSMT1LJCEjNyQiL2JTQyY+YzYlISM1NyQkIi9aTmEpXDtLJCEjNiQiMEQlSE1pa0BUISM2NyQ3JCQiMDNbT0kiW0BMISM3JCIwJ1E0disxR1QhIzY3JCQiL1pOYSlcO0skISM2JCIwRCVITWlrQFQhIzY3JDckJCIwM1tPSSJbQEwhIzckIjAnUTR2KzFHVCEjNjckJCIwZTR6MydIQEwhIzckIjA7cio+NkFOVCEjNjckNyQkIjBMNW8kejpATCEjNyQiMEEjeUQxXVNUISM2NyQkIjBlNHozJ0hATCEjNyQiMDtyKj42QU5UISM2NyQ3JCQiMEw1byR6OkBMISM3JCIwQSN5RDFdU1QhIzY3JCQiMHMxZVlXNEskISM3JCIwUT0qSCIqeVtUISM2NyQ3JCQiL2xWeGkkM0skISM2JCIwZXFrPFRIOiUhIzY3JCQiMHMxZVlXNEskISM3JCIwUT0qSCIqeVtUISM2NyQ3JCQiL2xWeGkkM0skISM2JCIwZXFrPFRIOiUhIzY3JCQiMClvITQnXGY/TCEjNyQiMF5jNk5dQjslISM2NyQ3JCQiMDovbkk7MEskISM3JCIwJSplcnMiUWxUISM2NyQkIjApbyE0J1xmP0whIzckIjBeYzZOXUI7JSEjNjckNyQkIjA6L25JOzBLJCEjNyQiMCUqZXJzIlFsVCEjNjckJCIwKVFNXnZDP0whIzckIjBfKXpgWyFmPCUhIzY3JDckJCIuMyg0ISk+P0whIzUkIi90JXlGQXk8JSEjNTckJCIwKVFNXnZDP0whIzckIjBfKXpgWyFmPCUhIzY3JDckJCIuMyg0ISk+P0whIzUkIi90JXlGQXk8JSEjNTckJCIwbEdVQC0qPkwhIzckIjAqcEI2RlgqPSUhIzY3JDckJCIwIipcL1AiKSk+TCEjNyQiMG1OJkdHRSE+JSEjNjckJCIwbEdVQC0qPkwhIzckIjAqcEI2RlgqPSUhIzY3JDckJCIwIipcL1AiKSk+TCEjNyQiMG1OJkdHRSE+JSEjNjckJCIwVF8+Y1wnPkwhIzckIjBYNUtaOiUqPiUhIzY3JDckJCIwJXBkaCM0dUskISM3JCIwIkdOaHh5NlIhIzY3JCQiMDgqPWg5RkZMISM3JCIwdCJSODJkO1IhIzY3JDckJCIwOCo9aDlGRkwhIzckIjB0IlI4MmQ7UiEjNjckJCIwVkUpKW9kc0skISM3JCIwMyMzQ24wPFIhIzY3JDckJCIwWV1hJVsicEskISM3JCIwNCEzazcsSFIhIzY3JCQiMFZFKSlvZHNLJCEjNyQiMDMjM0NuMDxSISM2NyQ3JCQiMFldYSVbInBLJCEjNyQiMDQhM2s3LEhSISM2NyQkIjA2KCp6bmxvSyQhIzckIjBQRSZRVXZJUiEjNjckNyQkIi9hQXotY0VMISM2JCIwWG9aIj1YVFIhIzY3JCQiMDYoKnpubG9LJCEjNyQiMFBFJlFVdklSISM2NyQ3JCQiL2FBei1jRUwhIzYkIjBYb1oiPVhUUiEjNjckJCIwTG42RndrSyQhIzckIjA7c0xTVlclUiEjNjckNyQkIjA8blB1MmlLJCEjNyQiMCJvWGxCKlEmUiEjNjckJCIwTG42RndrSyQhIzckIjA7c0xTVlclUiEjNjckNyQkIjA8blB1MmlLJCEjNyQiMCJvWGxCKlEmUiEjNjckJCIwLjkmUiUqM0VMISM3JCIwPFI1SkMiZVIhIzY3JDckJCIwIj5SOnMmZUskISM3JCIwPFhoIkhMbVIhIzY3JCQiMC45JlIlKjNFTCEjNyQiMDxSNUpDImVSISM2NyQ3JCQiMCI+UjpzJmVLJCEjNyQiMDxYaCJITG1SISM2NyQkIjA6WSFcXnFETCEjNyQiMDQ9MDIoenJSISM2NyQ3JCQiMCZIUnQnM2JLJCEjNyQiMGBMb1l0KHlSISM2NyQkIjA6WSFcXnFETCEjNyQiMDQ9MDIoenJSISM2NyQ3JCQiMCZIUnQnM2JLJCEjNyQiMGBMb1l0KHlSISM2NyQkIjAiPldyTEtETCEjNyQiMExARXhoYSlSISM2NyQ3JCQiLzsrKTRpXkskISM2JCIwKj1fPFNAIipSISM2NyQkIjAiPldyTEtETCEjNyQiMExARXhoYSlSISM2NyQ3JCQiLzsrKTRpXkskISM2JCIwKj1fPFNAIipSISM2NyQkIjBQW2YyV1xLJCEjNyQiMHNjZl49IioqUiEjNjckNyQkIjBKSSFwdSJbSyQhIzckIjBENSNvWGwuUyEjNjckJCIwUFtmMldcSyQhIzckIjBzY2ZePSIqKlIhIzY3JDckJCIwSkkhcHUiW0skISM3JCIwRDUjb1hsLlMhIzY3JCQiMDM1NkJuWEskISM3JCIwaSVRLHV3N1MhIzY3JDckJCIwZElQd3VXSyQhIzckIjBoKSopPV40O1MhIzY3JCQiMDM1NkJuWEskISM3JCIwaSVRLHV3N1MhIzY3JDckJCIwZElQd3VXSyQhIzckIjBoKSopPV40O1MhIzY3JCQiMC9GNSJHPkNMISM3JCIwOl8+XjNrLSUhIzY3JDckJCIwI29nbFI4Q0whIzckIjApcGVwY2BHUyEjNjckJCIwL0Y1Ikc+Q0whIzckIjA6Xz5eM2stJSEjNjckNyQkIjAjb2dsUjhDTCEjNyQiMClwZXBjYEdTISM2NyQkIjAzSGx5P1FLJCEjNyQiMC8jPlQ+L1NTISM2NyQ3JCQiMC8oM2JdekJMISM3JCIwTXYtQXc0LyUhIzY3JCQiMDNIbHk/UUskISM3JCIwLyM+VD4vU1MhIzY3JDckJCIwLygzYl16QkwhIzckIjBNdi1BdzQvJSEjNjckJCIwbms8VEhOSyQhIzckIjBfXjcpKnkyMCUhIzY3JDckJCIvIypRNiIqR0pMISM2JCIwKio+dGgyPXkkISM2NyQkIjB2TyZcMig0TCQhIzckIjA4M2w/bEB6JCEjNjckNyQkIjB2TyZcMig0TCQhIzckIjA4M2w/bEB6JCEjNjckJCIwTjNOZk80TCQhIzckIjB2TiFRYkgkeiQhIzY3JDckJCIwaE9waSFmSUwhIzckIjBcJz5kZGcvUSEjNjckJCIwTjNOZk80TCQhIzckIjB2TiFRYkgkeiQhIzY3JDckJCIwaE9waSFmSUwhIzckIjBcJz5kZGcvUSEjNjckJCIwZHlYMzswTCQhIzckIjBFZy1WJTMyUSEjNjckNyQkIjAtaVQjR0BJTCEjNyQiMCZbKXlJWXEiUSEjNjckJCIwZHlYMzswTCQhIzckIjBFZy1WJTMyUSEjNjckNyQkIjAtaVQjR0BJTCEjNyQiMCZbKXlJWXEiUSEjNjckJCIwQDd6Yyk0SUwhIzckIjApbyR6c2ozI1EhIzY3JDckJCIwdTd4SlApSEwhIzckIjBAdCZlb1tIUSEjNjckJCIwQDd6Yyk0SUwhIzckIjApbyR6c2ozI1EhIzY3JDckJCIwdTd4SlApSEwhIzckIjBAdCZlb1tIUSEjNjckJCIwT2tnKyVvSEwhIzckIjAiNDheTmpNUSEjNjckNyQkIjBWUCszayVITCEjNyQiMGRoIzR1Iz4lUSEjNjckJCIwT2tnKyVvSEwhIzckIjAiNDheTmpNUSEjNjckNyQkIjBWUCszayVITCEjNyQiMGRoIzR1Iz4lUSEjNjckJCIwdDUiZkJGSEwhIzckIjBzZHktJVJbUSEjNjckNyQkIjB0eWUzJDRITCEjNyQiMCQqXCpmek9hUSEjNjckJCIwdDUiZkJGSEwhIzckIjBzZHktJVJbUSEjNjckNyQkIjB0eWUzJDRITCEjNyQiMCQqXCpmek9hUSEjNjckJCIwVTUlKmVqKUdMISM3JCIwJTQiKXlfOWlRISM2NyQ3JCQiMDg5JjRWc0dMISM3JCIwSFExXjNvJ1EhIzY3JCQiMFU1JSplailHTCEjNyQiMCU0Iil5XzlpUSEjNjckNyQkIjA4OSY0VnNHTCEjNyQiMEhRMV4zbydRISM2NyQkIjAtZyJmd1hHTCEjNyQiL2E/RHUpZShRISM1NyQ3JCQiMHlCeHNkJEdMISM3JCIwbEU4MVwjelEhIzY3JCQiMC1nImZ3WEdMISM3JCIvYT9EdSllKFEhIzU3JDckJCIweUJ4c2QkR0whIzckIjBsRTgxXCN6USEjNjckJCIwQFpcYGEhR0whIzckIjA3d1RkPycqKVEhIzY3JDckJCIwNmVoSiQqekskISM3JCIwLDo/aCpvIipRISM2NyQkIjBAWlxgYSFHTCEjNyQiMDd3VGQ/JyopUSEjNjckNyQkIjA2ZWhKJCp6SyQhIzckIjAsOj9oKm8iKlEhIzY3JCQiMD0meXZUbEZMISM3JCIwS1hyJltNLlIhIzY3JDckJCIwPXAnWzVqRkwhIzckIjBQLkY7SVQhUiEjNjckJCIwPSZ5dlRsRkwhIzckIjBLWHImW00uUiEjNjckNyQkIjA9cCdbNWpGTCEjNyQiMFAuRjtJVCFSISM2NyQkIjAlcGRoIzR1SyQhIzckIjAiR05oeHk2UiEjNjckNyQkIjBaLDcnKm9eTCQhIzckIjA9bnckekZnTyEjNjckJCIwWSd5d0YjXEwkISM3JCIwX0MnKnBmeG0kISM2NyQ3JCQiMFkneXdGI1xMJCEjNyQiMF9DJypwZnhtJCEjNjckJCIwKCoqWy5WKltMJCEjNyQiMGInR3cua29PISM2NyQ3JCQiL3h3dWVeTUwhIzYkIjApR0pdLT8hbyQhIzY3JCQiMCgqKlsuVipbTCQhIzckIjBiJ0d3LmtvTyEjNjckNyQkIi94d3VlXk1MISM2JCIwKUdKXS0/IW8kISM2NyQkIjAqKjRkd1NXTCQhIzckIjAtQFI8TkRvJCEjNjckNyQkIi80KFFpNlRMJCEjNiQiMEMsNSEzayNwJCEjNjckJCIwKio0ZHdTV0wkISM3JCIwLUBSPE5EbyQhIzY3JDckJCIvNChRaTZUTCQhIzYkIjBDLDUhM2sjcCQhIzY3JCQiLyUpNDEyKlJMJCEjNiQiMCpvKCo9KT1rcCQhIzY3JDckJCIwMkleKio0UEwkISM3JCIvJypvXjgzMFAhIzU3JCQiLyUpNDEyKlJMJCEjNiQiMCpvKCo9KT1rcCQhIzY3JDckJCIwMkleKio0UEwkISM3JCIvJypvXjgzMFAhIzU3JCQiMGV0JXlTYUxMISM3JCIvS2BmOUg1UCEjNTckNyQkIjA9XlomNEpMTCEjNyQiMCd6UC0+XzxQISM2NyQkIjBldCV5U2FMTCEjNyQiL0tgZjlINVAhIzU3JDckJCIwPV5aJjRKTEwhIzckIjAnelAtPl88UCEjNjckJCIwI1w3TDM1TEwhIzckIjBwJSlcRGBUcyQhIzY3JDckJCIwMDpBWjlITCQhIzckIjBLbUlYaSpIUCEjNjckJCIwI1w3TDM1TEwhIzckIjBwJSlcRGBUcyQhIzY3JDckJCIwMDpBWjlITCQhIzckIjBLbUlYaSpIUCEjNjckJCIwLEg0IzRtS0whIzckIjA+VkdPLyFRUCEjNjckNyQkIjAvMmBeP0RMJCEjNyQiMHBhUCsuQ3UkISM2NyQkIjAsSDQjNG1LTCEjNyQiMD5WR08vIVFQISM2NyQ3JCQiMC8yYF4/REwkISM3JCIwcGFQKy5DdSQhIzY3JCQiMFlqZUhDQUwkISM3JCIvc25JXCU9diQhIzU3JDckJCIwWigpXDBIQEwkISM3JCIwMFZXYlZbdiQhIzY3JCQiMFlqZUhDQUwkISM3JCIvc25JXCU9diQhIzU3JDckJCIwWigpXDBIQEwkISM3JCIwMFZXYlZbdiQhIzY3JCQiMDtKPSI0ekpMISM3JCIwJlxIMV5ubFAhIzY3JDckJCIwV0YvMVM8TCQhIzckIjBUSl41JUduUCEjNjckJCIwO0o9IjR6SkwhIzckIjAmXEgxXm5sUCEjNjckNyQkIjBXRi8xUzxMJCEjNyQiMFRKXjUlR25QISM2NyQkIjBZQlhzZzhMJCEjNyQiMCIqcDwuJlx6UCEjNjckNyQkIjB5LEpdYDhMJCEjNyQiMHg+ZWxDKHpQISM2NyQkIjBZQlhzZzhMJCEjNyQiMCIqcDwuJlx6UCEjNjckNyQkIjB5LEpdYDhMJCEjNyQiMHg+ZWxDKHpQISM2NyQkIi8jKlE2IipHSkwhIzYkIjAqKj50aDI9eSQhIzY3JDckJCIwdDg1IilbIVJMISM3JCIwb2xoKVxuWU4hIzY3JCQiMCJwRF0hRyhRTCEjNyQiMEdITXUlemJOISM2NyQ3JCQiMCJwRF0hRyhRTCEjNyQiMEdITXUlemJOISM2NyQkIjAnPmssIilvUUwhIzckIjA+dzBNXnBiJCEjNjckNyQkIjA7JyozUCRIUUwhIzckIjBrPFRITiNvTiEjNjckJCIwJz5rLCIpb1FMISM3JCIwPncwTV5wYiQhIzY3JDckJCIwOycqM1AkSFFMISM3JCIwazxUSE4jb04hIzY3JCQiMDlrQCYpKj5RTCEjNyQiMEAhZlJ1JjRkJCEjNjckNyQkIjBjL2ByaHlMJCEjNyQiLjFbJWVuIWUkISIqNyQkIjA5a0AmKSo+UUwhIzckIjBAIWZSdSY0ZCQhIzY3JDckJCIwYy9gcmh5TCQhIzckIi4xWyVlbiFlJCEiKjckJCIwM2Evazp4TCQhIzckIjBFKHAiZl1cZSQhIzY3JDckJCIwOFRwL0x1TCQhIzckIjBPJVwmUjtKZiQhIzY3JCQiMDNhL2s6eEwkISM3JCIwRShwImZdXGUkISM2NyQ3JCQiMDhUcC9MdUwkISM3JCIwTyVcJlI7SmYkISM2NyQkIjAxXiIzYUJQTCEjNyQiMEJHUyk0JCopZiQhIzY3JDckJCIwKik+bksycUwkISM3JCIwcyM9WXBiME8hIzY3JCQiMDFeIjNhQlBMISM3JCIwQkdTKTQkKilmJCEjNjckNyQkIjAqKT5uSzJxTCQhIzckIjBzIz1ZcGIwTyEjNjckJCIwYC49NGZuTCQhIzckIjBQUCsjKSkqR2gkISM2NyQ3JCQiMDQ0VV4lZU9MISM3JCIwM3JvXCgqemgkISM2NyQkIjBgLj00Zm5MJCEjNyQiMFBQKyMpKSpHaCQhIzY3JDckJCIwNDRVXiVlT0whIzckIjAzcm9cKCp6aCQhIzY3JCQiMCVwNEptR09MISM3JCIwVT9KSGFvaSQhIzY3JDckJCIwOE47ZGtoTCQhIzckIjBXZnYvUS9qJCEjNjckJCIwJXA0Sm1HT0whIzckIjBVP0pIYW9pJCEjNjckNyQkIjA4Tjtka2hMJCEjNyQiMFdmdi9RL2okISM2NyQkIjA4WXgneiJlTCQhIzckIjApZTshZih6U08hIzY3JDckJCIwIj0nR1laZEwkISM3JCIveUMpZnlHayQhIzU3JCQiMDhZeCd6ImVMJCEjNyQiMCllOyFmKHpTTyEjNjckNyQkIjAiPSdHWVpkTCQhIzckIi95QylmeUdrJCEjNTckJCIwOWFiL2BgTCQhIzckIjBqbTgqKUdabCQhIzY3JDckJCIwPF0/OkxgTCQhIzckIjA7TypbIj5gbCQhIzY3JCQiMDlhYi9gYEwkISM3JCIwam04KilHWmwkISM2NyQ3JCQiMDxdPzpMYEwkISM3JCIwO08qWyI+YGwkISM2NyQkIjBaLDcnKm9eTCQhIzckIjA9bnckekZnTyEjNjckNyQkIi5FM21HSE0kISM1JCIwWCQpNCZHYFNNISM2NyQkIjBbOipHVSFHTSQhIzckIjAvTXN5SFFXJCEjNjckNyQkIjBbOipHVSFHTSQhIzckIjAvTXN5SFFXJCEjNjckJCIwOUghZnV5VUwhIzckIjBLalJhI0dXTSEjNjckNyQkIjBhJz5Hd0xVTCEjNyQiL0MjekxxaVgkISM1NyQkIjA5SCFmdXlVTCEjNyQiMEtqUmEjR1dNISM2NyQ3JCQiMGEnPkd3TFVMISM3JCIvQyN6THFpWCQhIzU3JCQiMCdvKiopW2VBTSQhIzckIjAmW1k2Iz4lZU0hIzY3JDckJCIwSiFvPFgoPU0kISM3JCIwdzUnKSkzcm9NISM2NyQkIjAnbyoqKVtlQU0kISM3JCIwJltZNiM+JWVNISM2NyQ3JCQiMEohbzxYKD1NJCEjNyQiMHc1JykpM3JvTSEjNjckJCIwbz5dRk08TSQhIzckIjAlZSEqRzFhc00hIzY3JDckJCIwW1BuJVtUVEwhIzckIjA3KkhSOToiWyQhIzY3JCQiMG8+XUZNPE0kISM3JCIwJWUhKkcxYXNNISM2NyQ3JCQiMFtQbiVbVFRMISM3JCIwNypIUjk6IlskISM2NyQkIjBPVmp0OTdNJCEjNyQiMCgzQWJxaydbJCEjNjckNyQkIjByOnZjZTRNJCEjNyQiMFsoKSoqKT5mJFwkISM2NyQkIjBPVmp0OTdNJCEjNyQiMCgzQWJxaydbJCEjNjckNyQkIjByOnZjZTRNJCEjNyQiMFsoKSoqKT5mJFwkISM2NyQkIjBgISlleipwU0whIzckIjAkb2VQKFEyXSQhIzY3JDckJCIwRSsuajAwTSQhIzckIjAlZW5TRC4xTiEjNjckJCIwYCEpZXoqcFNMISM3JCIwJG9lUChRMl0kISM2NyQ3JCQiMEUrLmowME0kISM3JCIwJWVuU0QuMU4hIzY3JCQiMHBvQFAqPVNMISM3JCIwRjRzJGYiW14kISM2NyQ3JCQiME12JikpZjBTTCEjNyQiL1VPIjR0JT1OISM1NyQkIjBwb0BQKj1TTCEjNyQiMEY0cyRmIlteJCEjNjckNyQkIjBNdiYpKWYwU0whIzckIi9VTyI0dCU9TiEjNTckJCIwX3JrUiRvUkwhIzckIi96W3UpeSlHTiEjNTckNyQkIjAjZV4pZjQnUkwhIzckIjBjXz9rODRgJCEjNjckJCIwX3JrUiRvUkwhIzckIi96W3UpeSlHTiEjNTckNyQkIjAjZV4pZjQnUkwhIzckIjBjXz9rODRgJCEjNjckJCIwZGUhKnkiPVJMISM3JCIwYnVdIXkjSGEkISM2NyQ3JCQiMHcqUTVrO1JMISM3JCIwIzR1Iz5hTGEkISM2NyQkIjBkZSEqeSI9UkwhIzckIjBidV0heSNIYSQhIzY3JDckJCIwdypRNWs7UkwhIzckIjAjNHUjPmFMYSQhIzY3JCQiMHQ4NSIpWyFSTCEjNyQiMG9saClcbllOISM2NyQ3JCQiMEVRMV4zb00kISM3JCIwJ3lRLixVVEwhIzY3JCQiMDA4cCY9cFlMISM3JCIwOkY8UTBWTSQhIzY3JDckJCIwMDhwJj1wWUwhIzckIjA6RjxRMFZNJCEjNjckJCIwZSd6a1tuWUwhIzckIjB3XjEiUnRXTCEjNjckNyQkIi9DKFE+Iz5ZTCEjNiQiMF46QyRmdWNMISM2NyQkIjBlJ3prW25ZTCEjNyQiMHdeMSJSdFdMISM2NyQ3JCQiL0MoUT4jPllMISM2JCIwXjpDJGZ1Y0whIzY3JCQiMEwpR1ZJNVlMISM3JCIwY1AkenorZkwhIzY3JDckJCIwKj43VmxwWEwhIzckIjAoUTUkWyc9cEwhIzY3JCQiMEwpR1ZJNVlMISM3JCIwY1AkenorZkwhIzY3JDckJCIwKj43VmxwWEwhIzckIjAoUTUkWyc9cEwhIzY3JCQiMFsjPTJvYFhMISM3JCIvM3FRVEV0TCEjNTckNyQkIjAkKnpZJVs/WEwhIzckIjBCI3pMcWkiUSQhIzY3JCQiMFsjPTJvYFhMISM3JCIvM3FRVEV0TCEjNTckNyQkIjAkKnpZJVs/WEwhIzckIjBCI3pMcWkiUSQhIzY3JCQiMFUtUzB3XE0kISM3JCIwInlLPEZdKFEkISM2NyQ3JCQiME81Ui48Wk0kISM3JCIwZiFbJWVuU1IkISM2NyQkIjBVLVMwd1xNJCEjNyQiMCJ5SzxGXShRJCEjNjckNyQkIjBPNVIuPFpNJCEjNyQiMGYhWyVlblNSJCEjNjckJCIuJVIhbz9XTSQhIzUkIjBtPW0vQzxTJCEjNjckNyQkIjBDY1owTFVNJCEjNyQiMCYqb144M2xTJCEjNjckJCIuJVIhbz9XTSQhIzUkIjBtPW0vQzxTJCEjNjckNyQkIjBDY1owTFVNJCEjNyQiMCYqb144M2xTJCEjNjckJCIwZS9BZnFRTSQhIzckIjBBcCVHJUdmVCQhIzY3JDckJCIwTG10JUd2VkwhIzckIjBKZGVvWyo9TSEjNjckJCIwZS9BZnFRTSQhIzckIjBBcCVHJUdmVCQhIzY3JDckJCIwTG10JUd2VkwhIzckIjBKZGVvWyo9TSEjNjckJCIwbXEwcERMTSQhIzckIjBhISkpemg2SU0hIzY3JDckJCIwWy1YTndLTSQhIzckIjBuWGxCKlFKTSEjNjckJCIwbXEwcERMTSQhIzckIjBhISkpemg2SU0hIzY3JDckJCIwWy1YTndLTSQhIzckIjBvWGxCKlFKTSEjNjckJCIuRTNtR0hNJCEjNSQiMFgkKTQmR2BTTSEjNjckNyQkIjBgXS9PKW9dTCEjNyQiMEooeU5WJSpbSyEjNjckJCIwODlBbUkuTiQhIzckIjBqM3BfQHNEJCEjNjckNyQkIjA4OUFtSS5OJCEjNyQiMGozcF9Ac0QkISM2NyQkIjBgay1YdS1OJCEjNyQiMDcjKik0KFsmZUshIzY3JDckJCIwT2B5Syh6XEwhIzckIjAqcGZ4P21wSyEjNjckJCIwYGstWHUtTiQhIzckIjA3IyopNChbJmVLISM2NyQ3JCQiME9geUsoelxMISM3JCIwKnBmeD9tcEshIzY3JCQiMG5JKFskZSdcTCEjNyQiMFdQLndrSEYkISM2NyQ3JCQiL29dJWVvI1xMISM2JCIwTiZHR0U1I0ckISM2NyQkIjBuSShbJGUnXEwhIzckIjBXUC53a0hGJCEjNjckNyQkIi9vXSVlbyNcTCEjNiQiME4mR0dFNSNHJCEjNjckJCIwYTtgeFshXEwhIzckIjByI295KWZ0RyQhIzY3JDckJCIvMGZkVnVbTCEjNiQiMHJ0KnlKYSVIJCEjNjckJCIwYTtgeFshXEwhIzckIjByI295KWZ0RyQhIzY3JDckJCIvMGZkVnVbTCEjNiQiMHJ0KnlKYSVIJCEjNjckJCIwQSE0LGNXW0whIzckIjAiPk15V3QsTCEjNjckNyQkIi9Nd3JYQVtMISM2JCIwMmknSFApcEkkISM2NyQkIjBBITQsY1dbTCEjNyQiMCI+TXlXdCxMISM2NyQ3JCQiL013clhBW0whIzYkIjAyaSdIUClwSSQhIzY3JCQiMCVlTyhwW3lNJCEjNyQiMDNTPigqKTM7TCEjNjckNyQkIi46PDo0eE0kISM1JCIwVl0uR0MlPkwhIzY3JCQiMCVlTyhwW3lNJCEjNyQiMDNTPigqKTM7TCEjNjckNyQkIi46PDo0eE0kISM1JCIwVl0uR0MlPkwhIzY3JCQiMHMib1J6RFpMISM3JCIvdmJlUFVJTCEjNTckNyQkIjBmKVxHISk+WkwhIzckIjB6UTUkWyc9TCQhIzY3JCQiMHMib1J6RFpMISM3JCIvdmJlUFVJTCEjNTckNyQkIjBmKVxHISk+WkwhIzckIjB6UTUkWyc9TCQhIzY3JCQiMEVRMV4zb00kISM3JCIwJ3lRLixVVEwhIzY3JDckJCIwemktQG9YTiQhIzckIjA+RyNlLnVpSiEjNjckJCIwOCFbLF5BYUwhIzckIjA2ITRzdzhxSiEjNjckNyQkIjA4IVssXkFhTCEjNyQiMDYhNHN3OHFKISM2NyQkIjBYY3pnbVROJCEjNyQiMC5gL1JEOTwkISM2NyQ3JCQiMFBzXiNIbGBMISM3JCIwWnlGQXlEPSQhIzY3JCQiMFhjemdtVE4kISM3JCIwLmAvUkQ5PCQhIzY3JDckJCIwUHNeI0hsYEwhIzckIjBaeUZBeUQ9JCEjNjckJCIwVCpbWCIpXGBMISM3JCIuKHBMJDRnPSQhIio3JDckJCIuMXIxJzNgTCEjNSQiMCRvWXQoPV0+JCEjNjckJCIwVCpbWCIpXGBMISM3JCIuKHBMJDRnPSQhIio3JDckJCIuMXIxJzNgTCEjNSQiMCRvWXQoPV0+JCEjNjckJCIwKVwvUHUkR04kISM3JCIwbVVTVG8wPyQhIzY3JDckJCIwS3AjSFdfX0whIzckIjA+YlRLZnU/JCEjNjckJCIwKVwvUHUkR04kISM3JCIwbVVTVG8wPyQhIzY3JDckJCIwS3AjSFdfX0whIzckIjA+YlRLZnU/JCEjNjckJCIwX0FhSSU9X0whIzckIjBHdicqPi5eQCQhIzY3JDckJCIwKSpwciJ6Jz5OJCEjNyQiMGJWWygpKiopPkshIzY3JCQiMF9BYUklPV9MISM3JCIwR3YnKj4uXkAkISM2NyQ3JCQiMCkqcHIieic+TiQhIzckIjBiVlsoKSoqKT5LISM2NyQkIjAwUixmUTpOJCEjNyQiMCJlPDBVaEhLISM2NyQ3JCQiMCd5ZFNrVF5MISM3JCIwIj5gRC9NS0shIzY3JCQiMDBSLGZROk4kISM3JCIwImU8MFVoSEshIzY3JDckJCIwJ3lkU2tUXkwhIzckIjAiPmBEL01LSyEjNjckJCIwPlphNys0TiQhIzckIjA6MD8nPjVXSyEjNjckNyQkIjBaTnMhKnAzTiQhIzckIjBGP2koNHlXSyEjNjckJCIwPlphNys0TiQhIzckIjA6MD8nPjVXSyEjNjckNyQkIjBaTnMhKnAzTiQhIzckIjBGP2koNHlXSyEjNjckJCIwYF0vTylvXUwhIzckIjBKKHlOViUqW0shIzY3JDckJCIwMXYrMVslZUwhIzckIjBALDktbkMzJCEjNjckJCIwbXBicT0lZUwhIzckIjBlcnMiUTAkMyQhIzY3JDckJCIwbXBicT0lZUwhIzckIjBlcnMiUTAkMyQhIzY3JCQiMEttMUM4JWVMISM3JCIwKjMta2E7JDMkISM2NyQ3JCQiMD0ocE42IXlOJCEjNyQiMCUqZnpPJVwmNCQhIzY3JCQiMEttMUM4JWVMISM3JCIwKjMta2E7JDMkISM2NyQ3JCQiMD0ocE42IXlOJCEjNyQiMCUqZnpPJVwmNCQhIzY3JCQiMEtgJWY8b2RMISM3JCIwW0NRWl56NCQhIzY3JDckJCIwUCwiMykqPWRMISM3JCIvJFsnPVwkejUkISM1NyQkIjBLYCVmPG9kTCEjNyQiMFtDUVpeejQkISM2NyQ3JCQiMFAsIjMpKj1kTCEjNyQiLyRbJz1cJHo1JCEjNTckJCIwd3UoWydmcE4kISM3JCIwIkdZUHVxN0ohIzY3JDckJCIwLidHJWYlZWNMISM3JCIwbU8kcGFQP0ohIzY3JCQiMHd1KFsnZnBOJCEjNyQiMCJHWVB1cTdKISM2NyQ3JCQiMC4nRyVmJWVjTCEjNyQiMG1PJHBhUD9KISM2NyQkIjBeJXp3bUNjTCEjNyQiMD4yJCk0TXU3JCEjNjckNyQkIjAsc2xQJilmTiQhIzckIjAtRCstO0c4JCEjNjckJCIwXiV6d21DY0whIzckIjA+MiQpNE11NyQhIzY3JDckJCIwLHNsUCYpZk4kISM3JCIwLUQrLTtHOCQhIzY3JCQiMFl6YmlVYk4kISM3JCIwaVxeOktAOSQhIzY3JDckJCIwb0kqUT9SYkwhIzckIjBSODJkY185JCEjNjckJCIwWXpiaVViTiQhIzckIjBpXF46S0A5JCEjNjckNyQkIjBvSSpRP1JiTCEjNyQiMFI4MmRjXzkkISM2NyQkIjBHUXRGWltOJCEjNyQiMFhGakktbzokISM2NyQ3JCQiMEx1Q1kvW04kISM3JCIwdiw5NyhwZEohIzY3JCQiMEdRdEZaW04kISM3JCIwWEZqSS1vOiQhIzY3JDckJCIwTHVDWS9bTiQhIzckIjB2LDk3KHBkSiEjNjckJCIwemktQG9YTiQhIzckIjA+RyNlLnVpSiEjNjckNyQkIjBLKCkpNHpLaUwhIzckIjAycFokKkcwLyQhIzY3JCQiMCZlPSE0RS5PJCEjNyQiL2w/bEB0WEkhIzU3JDckJCIwJmU9ITRFLk8kISM3JCIvbD9sQHRYSSEjNTckJCIvRiEzSkoqZkwhIzYkIjApbz9XblRgSSEjNjckNyQkIjBWJXBVTW9mTCEjNyQiMCdbKmVycyJlSSEjNjckJCIvRiEzSkoqZkwhIzYkIjApbz9XblRgSSEjNjckNyQkIjBWJXBVTW9mTCEjNyQiMCdbKmVycyJlSSEjNjckJCIwNmw5eW0iZkwhIzckIjAmR0FAKDMkb0khIzY3JDckJCIwNikpZmhaIWZMISM3JCIwQSRlbUtocUkhIzY3JCQiMDZsOXltImZMISM3JCIwJkdBQCgzJG9JISM2NyQ3JCQiMDYpKWZoWiFmTCEjNyQiMEEkZW1LaHFJISM2NyQkIjAxdisxWyVlTCEjNyQiMEAsOS1uQzMkISM2NyQ3JCQiMEsoKSk0ektpTCEjNyQiMDJwWiQqRzAvJCEjNjckJCIvLHZaMSZSTyQhIzYkIjAycFokKkcwLyQhIzY3JDckJCIwZipwZng/bUwhIzckIjBcIzRaWlxTSSEjNjckJCIvLHZaMSZSTyQhIzYkIjAycFokKkcwLyQhIzY3JDckJCIwZipwZng/bUwhIzckIjBcIzRaWlxTSSEjNjckJCIwLTooZjYleU8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJj1eNHczcUwhIzckIjBcIzRaWlxTSSEjNjckJCIwLTooZjYleU8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJj1eNHczcUwhIzckIjBcIzRaWlxTSSEjNjckJCIwSEYmNDVzckwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA3QyRmdSdSUCQhIzckIjBcIzRaWlxTSSEjNjckJCIwSEYmNDVzckwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA3QyRmdSdSUCQhIzckIjBcIzRaWlxTSSEjNjckJCIwYlIkZjNndkwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBRTyI0dCV5UCQhIzckIjBcIzRaWlxTSSEjNjckJCIwYlIkZjNndkwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBRTyI0dCV5UCQhIzckIjBcIzRaWlxTSSEjNjckJCIwIz06NDJbekwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBsWyplcnMiUSQhIzckIjBcIzRaWlxTSSEjNjckJCIwIz06NDJbekwhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBsWyplcnMiUSQhIzckIjBcIzRaWlxTSSEjNjckJCIwM2sqZTBPJFEkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwIjR3M3FnJlEkISM3JCIwXCM0WlpcU0khIzY3JCQiMDNrKmUwTyRRJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCI0dzNxZyZRJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBOdygzL0MoUSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA9dCZlb1sqUSQhIzckIjBcIzRaWlxTSSEjNjckJCIwTncoMy9DKFEkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPXQmZW9bKlEkISM3JCIwXCM0WlpcU0khIzY3JCQiMGgpZWUtNyJSJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFcmUTNuTyRSJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBoKWVlLTciUiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBXJlEzbk8kUiQhIzckIjBcIzRaWlxTSSEjNjckJCIwKTNTMywrJlIkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwcig+ZWxDKFIkISM3JCIwXCM0WlpcU0khIzY3JCQiMCkzUzMsKyZSJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHIoPmVsQyhSJCEjNyQiMFwjNFpaXFNJISM2NyQkIjA5OCNlKnopKVIkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKCo0ITNrNyxNISM3JCIwXCM0WlpcU0khIzY3JCQiMDk4I2UqeikpUiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAoKjQhM2s3LE0hIzckIjBcIzRaWlxTSSEjNjckJCIwVEQhMylmRlMkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwQ0F5RDFdUyQhIzckIjBcIzRaWlxTSSEjNjckJCIwVEQhMylmRlMkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwQ0F5RDFdUyQhIzckIjBcIzRaWlxTSSEjNjckJCIwblB5bFJtUyQhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9YajJoKSkzTSEjNiQiMFwjNFpaXFNJISM2NyQkIjBuUHlsUm1TJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL1hqMmgpKTNNISM2JCIwXCM0WlpcU0khIzY3JCQiMCUqXHddPjBUJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHhZdSZmdzdNISM3JCIwXCM0WlpcU0khIzY3JCQiMCUqXHddPjBUJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHhZdSZmdzdNISM3JCIwXCM0WlpcU0khIzY3JCQiL0FZZCQqUjlNISM2JCIwXCM0WlpcU0khIzY3JDckJCIwLmZzIWVrO00hIzckIjBcIzRaWlxTSSEjNjckJCIvQVlkJCpSOU0hIzYkIjBcIzRaWlxTSSEjNjckNyQkIjAuZnMhZWs7TSEjNyQiMFwjNFpaXFNJISM2NyQkIjBadXM/eiM9TSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLzgyZGNfP00hIzYkIjBcIzRaWlxTSSEjNjckJCIwWnVzP3ojPU0hIzckIjBcIzRaWlxTSSEjNjckNyQkIi84MmRjXz9NISM2JCIwXCM0WlpcU0khIzY3JCQiMHQnM2QhZkBVJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGMkKW9dMFdVJCEjNyQiMFwjNFpaXFNJISM2NyQkIjB0JzNkIWZAVSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBjJClvXTBXVSQhIzckIjBcIzRaWlxTSSEjNjckJCIuKipvISpRZ1UkISM1JCIwXCM0WlpcU0khIzY3JDckJCIwJGVwY2BHR00hIzckIjBcIzRaWlxTSSEjNjckJCIuKipvISpRZ1UkISM1JCIwXCM0WlpcU0khIzY3JDckJCIwJGVwY2BHR00hIzckIjBcIzRaWlxTSSEjNjckJCIwRTZudj0qSE0hIzckIjBcIzRaWlxTSSEjNjckNyQkIjA0M2w/bEBWJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBFNm52PSpITSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDQzbD9sQFYkISM3JCIwXCM0WlpcU0khIzY3JCQiMGBCbGcpekxNISM3JCIwXCM0WlpcU0khIzY3JDckJCIwTz9qMFhnViQhIzckIjBcIzRaWlxTSSEjNjckJCIwYEJsZyl6TE0hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBPP2owWGdWJCEjNyQiMFwjNFpaXFNJISM2NyQkIjB6TmpYeXdWJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGlLaCFcIypSTSEjNyQiMFwjNFpaXFNJISM2NyQkIjB6TmpYeXdWJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGlLaCFcIypSTSEjNyQiMFwjNFpaXFNJISM2NyQkIjAxW2hJZTpXJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpbJWZ2L1FXJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAxW2hJZTpXJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpbJWZ2L1FXJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBLZ2Y6UWFXJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDpkZGclb1pNISM3JCIwXCM0WlpcU0khIzY3JCQiMEtnZjpRYVckISM3JCIwXCM0WlpcU0khIzY3JDckJCIwOmRkZyVvWk0hIzckIjBcIzRaWlxTSSEjNjckJCIwZnNkKz0kXE0hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBVcGJYazpYJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBmc2QrPSRcTSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFVwYlhrOlgkISM3JCIwXCM0WlpcU0khIzY3JCQiMCZbZWJ5PmBNISM3JCIwXCM0WlpcU0khIzY3JDckJCIwbyJRMFZXYk0hIzckIjBcIzRaWlxTSSEjNjckJCIwJltlYnk+YE0hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBvIlEwVldiTSEjNyQiMFwjNFpaXFNJISM2NyQkIjA3KFIweDJkTSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCZSPmJUS2ZNISM3JCIwXCM0WlpcU0khIzY3JCQiMDcoUjB4MmRNISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJlI+YlRLZk0hIzckIjBcIzRaWlxTSSEjNjckJCIwUTRfYmQ0WSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBBMV0rL0tZJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBRNF9iZDRZJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEAxXSsvS1kkISM3JCIwXCM0WlpcU0khIzY3JCQiMGxAXVNQW1kkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWz1bJlEzbk0hIzckIjBcIzRaWlxTSSEjNjckJCIwbEBdU1BbWSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBbPVsmUTNuTSEjNyQiMFwjNFpaXFNJISM2NyQkIjAjUiRbRDwob00hIzckIjBcIzRaWlxTSSEjNjckNyQkIjB2SVlxajRaJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAjUiRbRDwob00hIzckIjBcIzRaWlxTSSEjNjckNyQkIjB1SVlxajRaJCEjNyQiMFwjNFpaXFNJISM2NyQkIjA9WVk1KGZzTSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCxWV2JWW1okISM3JCIwXCM0WlpcU0khIzY3JCQiMD1ZWTUoZnNNISM3JCIwXCM0WlpcU0khIzY3JDckJCIwLFZXYlZbWiQhIzckIjBcIzRaWlxTSSEjNjckJCIwWGVXJnBad00hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBHYlVTQih5TSEjNyQiMFwjNFpaXFNJISM2NyQkIjBYZVcmcFp3TSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEdiVVNCKHlNISM3JCIwXCM0WlpcU0khIzY3JCQiMHJxVSFvTiFbJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGFuU0QuRVskISM3JCIwXCM0WlpcU0khIzY3JCQiMHJxVSFvTiFbJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGFuU0QuRVskISM3JCIwXCM0WlpcU0khIzY3JCQiMClIM2FtQiVbJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCIpelE1JFsnWyQhIzckIjBcIzRaWlxTSSEjNjckJCIwKUgzYW1CJVskISM3JCIwXCM0WlpcU0khIzY3JDckJCIwIil6UTUkWydbJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBDJipRXTsiKVskISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMiNwYEhPIVwkISM3JCIwXCM0WlpcU0khIzY3JCQiMEMmKlFdOyIpWyQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAyI3BgSE8hXCQhIzckIjBcIzRaWlxTSSEjNjckJCIwXjJQTicqPlwkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwTS9OIUdDJVwkISM3JCIwXCM0WlpcU0khIzY3JCQiMF4yUE4nKj5cJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME0vTiFHQyVcJCEjNyQiMFwjNFpaXFNJISM2NyQkIjB4Pk4/d2VcJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL21KYEU3KVwkISM2JCIwXCM0WlpcU0khIzY3JCQiMHg+Tj93ZVwkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvbUpgRTcpXCQhIzYkIjBcIzRaWlxTSSEjNjckJCIwL0tMMGMoKlwkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKClHSl0tP10kISM3JCIwXCM0WlpcU0khIzY3JCQiMC9LTDBjKCpcJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCgpR0pdLT9dJCEjNyQiMFwjNFpaXFNJISM2NyQkIi9WOS5mai5OISM2JCIwXCM0WlpcU0khIzY3JDckJCIwOFRITiMpZV0kISM3JCIwXCM0WlpcU0khIzY3JCQiL1Y5LmZqLk4hIzYkIjBcIzRaWlxTSSEjNjckNyQkIjA4VEhOIyllXSQhIzckIjBcIzRaWlxTSSEjNjckJCIwZGNIdjp2XSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9Ndi1BdzROISM2JCIwXCM0WlpcU0khIzY3JCQiMGRjSHY6dl0kISM3JCIwXCM0WlpcU0khIzY3JDckJCIvTXYtQXc0TiEjNiQiMFwjNFpaXFNJISM2NyQkIjAkKW9GZyZSNk4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBtbEQwVU9eJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAkKW9GZyZSNk4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBtbEQwVU9eJCEjNyQiMFwjNFpaXFNJISM2NyQkIi82ZV9hRjpOISM2JCIwXCM0WlpcU0khIzY3JDckJCIwJHpQLT5fPE4hIzckIjBcIzRaWlxTSSEjNjckJCIvNmVfYUY6TiEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMCR6UC0+XzxOISM3JCIwXCM0WlpcU0khIzY3JCQiME8kUi1gOj5OISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPiE+XzxTQE4hIzckIjBcIzRaWlxTSSEjNjckJCIwTyRSLWA6Pk4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjA+IT5fPFNATiEjNyQiMFwjNFpaXFNJISM2NyQkIjBqMEE6TklfJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFktP2ciR0ROISM3JCIwXCM0WlpcU0khIzY3JCQiMGowQTpOSV8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWS0/ZyJHRE4hIzckIjBcIzRaWlxTSSEjNjckJCIwKnksLV0icF8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwczk9WGgiSE4hIzckIjBcIzRaWlxTSSEjNjckJCIwKnksLV0icF8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwczk9WGgiSE4hIzckIjBcIzRaWlxTSSEjNjckJCIwO0k9Jlt6SU4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjAqcGksOC9MTiEjNyQiMFwjNFpaXFNJISM2NyQkIjA7ST0mW3pJTiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpwaSw4L0xOISM3JCIwXCM0WlpcU0khIzY3JCQiMFVVO3F1WWAkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwRFI5OkBwYCQhIzckIjBcIzRaWlxTSSEjNjckJCIwVVU7cXVZYCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBEUjk6QHBgJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBwYTliYSZRTiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMF9eNyssM2EkISM3JCIwXCM0WlpcU0khIzY3JCQiMHBhOWJhJlFOISM3JCIwXCM0WlpcU0khIzY3JDckJCIwX143KywzYSQhIzckIjBcIzRaWlxTSSEjNjckJCIwJnBFLFdWVU4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjB5ajUmM29XTiEjNyQiMFwjNFpaXFNJISM2NyQkIjAmcEUsV1ZVTiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHlqNSYzb1dOISM3JCIwXCM0WlpcU0khIzY3JCQiMEF6NUQ5amEkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMHczcWcmW04hIzckIjBcIzRaWlxTSSEjNjckJCIwQXo1RDlqYSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAwdzNxZyZbTiEjNyQiMFwjNFpaXFNJISM2NyQkIjBbIiozNSU+XU4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBKKW9dMFdfTiEjNyQiMFwjNFpaXFNJISM2NyQkIjBbIiozNSU+XU4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBKKW9dMFdfTiEjNyQiMFwjNFpaXFNJISM2NyQkIjB2LjImUjJhTiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGUrMFM/amIkISM3JCIwXCM0WlpcU0khIzY3JCQiMHYuMiZSMmFOISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZSswUz9qYiQhIzckIjBcIzRaWlxTSSEjNjckJCIwLDswIVEmemIkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJUdKXS0/Z04hIzckIjBcIzRaWlxTSSEjNjckJCIwLDswIVEmemIkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJUdKXS0/Z04hIzckIjBcIzRaWlxTSSEjNjckJCIwR0cubEw9YyQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA2RCw1ITNrTiEjNyQiMFwjNFpaXFNJISM2NyQkIjBHRy5sTD1jJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDZELDUhM2tOISM3JCIwXCM0WlpcU0khIzY3JCQiMGFTLF04ZGMkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwUFAqXCpmemMkISM3JCIwXCM0WlpcU0khIzY3JCQiMGFTLF04ZGMkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwUFAqXCpmemMkISM3JCIwXCM0WlpcU0khIzY3JCQiMCJHJipcTGZwTiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGtcKCp6Uj1kJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAiRyYqXExmcE4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBrXCgqelI9ZCQhIzckIjBcIzRaWlxTSSEjNjckJCIwMmwoKj50TWQkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvPmNcJz5kZCQhIzYkIjBcIzRaWlxTSSEjNjckJCIwMmwoKj50TWQkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvPmNcJz5kZCQhIzYkIjBcIzRaWlxTSSEjNjckJCIwTXgmXElOeE4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjA8dSQqXCpmek4hIzckIjBcIzRaWlxTSSEjNjckJCIwTXgmXElOeE4hIzckIjBcIzRaWlxTSSEjNjckNyQkIjA8dSQqXCpmek4hIzckIjBcIzRaWlxTSSEjNjckJCIvJypRKipHQiJlJCEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMFYnPVwkek1lJCEjNyQiMFwjNFpaXFNJISM2NyQkIi8nKlEqKkdCImUkISM2JCIwXCM0WlpcU0khIzY3JDckJCIwVic9XCR6TWUkISM3JCIwXCM0WlpcU0khIzY3JCQiMCg9P1xGNiZlJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLygpKiopPmZ0ZSQhIzYkIjBcIzRaWlxTSSEjNjckJCIwKD0/XEY2JmUkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvKCkqKik+ZnRlJCEjNiQiMFwjNFpaXFNJISM2NyQkIjA4OSEqZiMqKillJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCc0IilbIVI3ZiQhIzckIjBcIzRaWlxTSSEjNjckJCIwODkhKmYjKiopZSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAnNCIpWyFSN2YkISM3JCIwXCM0WlpcU0khIzY3JCQiL2sjKVtDKEdmJCEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMEJCJykqKT1eZiQhIzckIjBcIzRaWlxTSSEjNjckJCIvayMpW0MoR2YkISM2JCIwXCM0WlpcU0khIzY3JDckJCIwQkInKSopPV5mJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBtUScpSF9uZiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBcTiVbKCkqKilmJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBtUScpSF9uZiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBcTiVbKCkqKilmJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAkNFhbQGorTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHdaIylmeUdnJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAkNFhbQGorTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHdaIylmeUdnJCEjNyQiMFwjNFpaXFNJISM2NyQkIjA+aiMpKj5eL08hIzckIjBcIzRaWlxTSSEjNjckNyQkIjAtZyFbJWVuZyQhIzckIjBcIzRaWlxTSSEjNjckJCIwPmojKSo+Xi9PISM3JCIwXCM0WlpcU0khIzY3JDckJCIwLWchWyVlbmckISM3JCIwXCM0WlpcU0khIzY3JCQiMFl2IVs9UjNPISM3JCIwXCM0WlpcU0khIzY3JDckJCIwSHN5SFExaCQhIzckIjBcIzRaWlxTSSEjNjckJCIwWXYhWz1SM08hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBIc3lIUTFoJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBzKCl5cHJBaCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBiJW9aIj1YaCQhIzckIjBcIzRaWlxTSSEjNjckJCIwcygpeXByQWgkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwYiVvWiI9WGgkISM3JCIwXCM0WlpcU0khIzY3JCQiMCoqKnBaOjo7TyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCNvXCgqelI9TyEjNyQiMFwjNFpaXFNJISM2NyQkIjAqKipwWjo6O08hIzckIjBcIzRaWlxTSSEjNjckNyQkIjAjb1woKnpSPU8hIzckIjBcIzRaWlxTSSEjNjckJCIwRDd2UkoraSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAzNHQleUZBTyEjNyQiMFwjNFpaXFNJISM2NyQkIjBEN3ZSSitpJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDM0dCV5RkFPISM3JCIwXCM0WlpcU0khIzY3JCQiMF9DdEM2UmkkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwTkBycGRoaSQhIzckIjBcIzRaWlxTSSEjNjckJCIwX0N0QzZSaSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBOQHJwZGhpJCEjNyQiMFwjNFpaXFNJISM2NyQkIjB5T3I0InpGTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGhMcGFQK2okISM3JCIwXCM0WlpcU0khIzY3JCQiMHlPcjQiekZPISM3JCIwXCM0WlpcU0khIzY3JDckJCIwaExwYVAraiQhIzckIjBcIzRaWlxTSSEjNjckJCIwMFxwJTRuSk8hIzckIjBcIzRaWlxTSSEjNjckNyQkIjApZXUnUjxSaiQhIzckIjBcIzRaWlxTSSEjNjckJCIwMFxwJTRuSk8hIzckIjBcIzRaWlxTSSEjNjckNyQkIjApZXUnUjxSaiQhIzckIjBcIzRaWlxTSSEjNjckJCIwSmhuel1iaiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA5ZWxDKHpQTyEjNyQiMFwjNFpaXFNJISM2NyQkIjBKaG56XWJqJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDllbEMoelBPISM3JCIwXCM0WlpcU0khIzY3JCQiMGV0bGtJJVJPISM3JCIwXCM0WlpcU0khIzY3JDckJCIwVHFqNHg7ayQhIzckIjBcIzRaWlxTSSEjNjckJCIwZXRsa0klUk8hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBUcWo0eDtrJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAlZVEnXDVMayQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBuIz1ZcGJYTyEjNyQiMFwjNFpaXFNJISM2NyQkIjAlZVEnXDVMayQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBuIz1ZcGJYTyEjNyQiMFwjNFpaXFNJISM2NyQkIjA2KT5ZLj5aTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCVcKmZ6TyVcTyEjNyQiMFwjNFpaXFNJISM2NyQkIjA2KT5ZLj5aTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCVcKmZ6TyVcTyEjNyQiMFwjNFpaXFNJISM2NyQkIjBQNWc+cTVsJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL3MhZWs7TGwkISM2JCIwXCM0WlpcU0khIzY3JCQiMFA1Zz5xNWwkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvcyFlaztMbCQhIzYkIjBcIzRaWlxTSSEjNjckJCIwa0FlL11cbCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBaPmNcJz5kTyEjNyQiMFwjNFpaXFNJISM2NyQkIjBrQWUvXVxsJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFo+Y1wnPmRPISM3JCIwXCM0WlpcU0khIzY3JCQiL1xqJiopSCllTyEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMHVKYU13NW0kISM3JCIwXCM0WlpcU0khIzY3JCQiL1xqJiopSCllTyEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMHRKYU13NW0kISM3JCIwXCM0WlpcU0khIzY3JCQiMDxaYXU0Rm0kISM3JCIwXCM0WlpcU0khIzY3JDckJCIuV18+Y1xtJCEjNSQiMFwjNFpaXFNJISM2NyQkIjA8WmF1NEZtJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLldfPmNcbSQhIzUkIjBcIzRaWlxTSSEjNjckJCIwVmZfZiplbU8hIzckIjBcIzRaWlxTSSEjNjckNyQkIjBFY10vTylvTyEjNyQiMFwjNFpaXFNJISM2NyQkIjBWZl9mKmVtTyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEVjXS9PKW9PISM3JCIwXCM0WlpcU0khIzY3JCQiLzwyWCVwL24kISM2JCIwXCM0WlpcU0khIzY3JDckJCIwYG9bKmVyc08hIzckIjBcIzRaWlxTSSEjNjckJCIvPDJYJXAvbiQhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjBgb1sqZXJzTyEjNyQiMFwjNFpaXFNJISM2NyQkIjAoUilbSFxWbiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIi8zb1dkZndPISM2JCIwXCM0WlpcU0khIzY3JCQiMChSKVtIXFZuJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHohb1dkZndPISM3JCIwXCM0WlpcU0khIzY3JCQiMEIncFciSCN5TyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDEkXCVmdi9vJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBCJ3BXIkgjeU8hIzckIjBcIzRaWlxTSSEjNjckNyQkIjAxJFwlZnYvbyQhIzckIjBcIzRaWlxTSSEjNjckJCIvJjNYKiozQG8kISM2JCIwXCM0WlpcU0khIzY3JDckJCIwTDBWV2JWbyQhIzckIjBcIzRaWlxTSSEjNjckJCIvJjNYKiozQG8kISM2JCIwXCM0WlpcU0khIzY3JDckJCIwTDBWV2JWbyQhIzckIjBcIzRaWlxTSSEjNjckJCIwdz9WJSkpKWZvJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGY8VEhOIylvJCEjNyQiMFwjNFpaXFNJISM2NyQkIjB3P1YlKSkpZm8kISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZjxUSE4jKW8kISM3JCIwXCM0WlpcU0khIzY3JCQiMC5MVHBvKSpvJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCcpSFI5OkBwJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAuTFRwbykqbyQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAnKUhSOTpAcCQhIzckIjBcIzRaWlxTSSEjNjckJCIwSFhSYVtQcCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA3VVAqXCpmcCQhIzckIjBcIzRaWlxTSSEjNjckJCIwSFhSYVtQcCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA3VVAqXCpmcCQhIzckIjBcIzRaWlxTSSEjNjckJCIwY2RQUkd3cCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBSYU4lWygpKnAkISM3JCIwXCM0WlpcU0khIzY3JCQiMGNkUFJHd3AkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwUmFOJVsoKSpwJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAjKXBOQzM6cSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBsbUxwYVBxJCEjNyQiMFwjNFpaXFNJISM2NyQkIjAjKXBOQzM6cSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBsbUxwYVBxJCEjNyQiMFwjNFpaXFNJISM2NyQkIjA0I1EkNClRMFAhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAjKnlKYU13cSQhIzckIjBcIzRaWlxTSSEjNjckJCIwNCNRJDQpUTBQISM3JCIwXCM0WlpcU0khIzY3JDckJCIwIyp5SmFNd3EkISM3JCIwXCM0WlpcU0khIzY3JCQiME4lPlZ6RTRQISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwXCM0WlpcU0khIzY3JCQiME4lPlZ6RTRQISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwXCM0WlpcU0khIzY3JCQiMGkxSXpaSnIkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWC5HQyVSOlAhIzckIjBcIzRaWlxTSSEjNjckJCIwaTFJelpKciQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBYLkdDJVI6UCEjNyQiMFwjNFpaXFNJISM2NyQkIjApKT1Ha0ZxciQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjByOkU0dSM+UCEjNyQiMFwjNFpaXFNJISM2NyQkIjApKT1Ha0ZxciQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjByOkU0dSM+UCEjNyQiMFwjNFpaXFNJISM2NyQkIjA6SkVcMjRzJCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCl6VVVSOkJQISM3JCIwXCM0WlpcU0khIzY3JCQiMDpKRVwyNHMkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKXpVVVI6QlAhIzckIjBcIzRaWlxTSSEjNjckJCIwVFZDTSh5Q1AhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBDU0F6THFzJCEjNyQiMFwjNFpaXFNJISM2NyQkIjBUVkNNKHlDUCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMENTQXpMcXMkISM3JCIwXCM0WlpcU0khIzY3JCQiMG9iQT5uJ0dQISM3JCIwXCM0WlpcU0khIzY3JDckJCIwXl8/azg0dCQhIzckIjBcIzRaWlxTSSEjNjckJCIwb2JBPm4nR1AhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBeXz9rODR0JCEjNyQiMFwjNFpaXFNJISM2NyQkIjAlejFVcWFLUCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHhrPVwkek1QISM3JCIwXCM0WlpcU0khIzY3JCQiMCV6MVVxYUtQISM3JCIwXCM0WlpcU0khIzY3JDckJCIweGs9XCR6TVAhIzckIjBcIzRaWlxTSSEjNjckJCIwQCEpPSpvVU9QISM3JCIwXCM0WlpcU0khIzY3JDckJCIwL3g7TXQnUVAhIzckIjBcIzRaWlxTSSEjNjckJCIwQCEpPSpvVU9QISM3JCIwXCM0WlpcU0khIzY3JDckJCIwL3g7TXQnUVAhIzckIjBcIzRaWlxTSSEjNjckJCIwWiNwVG5JU1AhIzckIjBcIzRaWlxTSSEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjBcIzRaWlxTSSEjNjckJCIwWiNwVG5JU1AhIzckIjBcIzRaWlxTSSEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjBcIzRaWlxTSSEjNjckJCIwdS86Zic9V1AhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBkLDgvTGt1JCEjNyQiMFwjNFpaXFNJISM2NyQkIjB1LzpmJz1XUCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGQsOC9Ma3UkISM3JCIwXCM0WlpcU0khIzY3JCQiLjw4V20hW1AhIzUkIjBcIzRaWlxTSSEjNjckNyQkIjAkUTYiKkdKXVAhIzckIjBcIzRaWlxTSSEjNjckJCIuPDhXbSFbUCEjNSQiMFwjNFpaXFNJISM2NyQ3JCQiMCRRNiIqR0pdUCEjNyQiMFwjNFpaXFNJISM2NyQkIjBGSDZIWT52JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL2gjNHUjPmFQISM2JCIwXCM0WlpcU0khIzY3JCQiMEZINkhZPnYkISM3JCIwXCM0WlpcU0khIzY3JDckJCIvaCM0dSM+YVAhIzYkIjBcIzRaWlxTSSEjNjckJCIwYFQ0OUVldiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBPUTJmcyFlUCEjNyQiMFwjNFpaXFNJISM2NyQkIjBgVDQ5RWV2JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME9RMmZzIWVQISM3JCIwXCM0WlpcU0khIzY3JCQiL1F2ISpmcWZQISM2JCIwXCM0WlpcU0khIzY3JDckJCIwal0wV18+dyQhIzckIjBcIzRaWlxTSSEjNjckJCIvUXYhKmZxZlAhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjBqXTBXXz53JCEjNyQiMFwjNFpaXFNJISM2NyQkIjAxbTAlZWVqUCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMFwjNFpaXFNJISM2NyQkIjAxbTAlZWVqUCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMFwjNFpaXFNJISM2NyQkIjBMeS5wbHV3JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDt2LDk3KHBQISM3JCIwXCM0WlpcU0khIzY3JCQiMEx5LnBsdXckISM3JCIwXCM0WlpcU0khIzY3JDckJCIwO3YsOTcocFAhIzckIjBcIzRaWlxTSSEjNjckJCIwZiE+U2JNclAhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBVKCkqKik+ZnRQISM3JCIwXCM0WlpcU0khIzY3JCQiMGYhPlNiTXJQISM3JCIwXCM0WlpcU0khIzY3JDckJCIwVSgpKiopPmZ0UCEjNyQiMFwjNFpaXFNJISM2NyQkIjAnRyshUkRfeCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBwKnpSPVp4UCEjNyQiMFwjNFpaXFNJISM2NyQkIjAnRyshUkRfeCQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBwKnpSPVp4UCEjNyQiMFwjNFpaXFNJISM2NyQkIjA3OilSXzV6UCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCY+aCpvXjh5JCEjNyQiMFwjNFpaXFNJISM2NyQkIjA3OilSXzV6UCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCY+aCpvXjh5JCEjNyQiMFwjNFpaXFNJISM2NyQkIjBSRicqMyYpSHkkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwQUMlUjpCJnkkISM3JCIwXCM0WlpcU0khIzY3JCQiMFJGJyozJilIeSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBBQyVSOkImeSQhIzckIjBcIzRaWlxTSSEjNjckJCIwbFIlUlwnb3kkISM3JCIwXCM0WlpcU0khIzY3JDckJCIwW08jKlE2Iip5JCEjNyQiMFwjNFpaXFNJISM2NyQkIjBsUiVSXCdveSQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBbTyMqUTYiKnkkISM3JCIwXCM0WlpcU0khIzY3JCQiMCM+RCp5VzJ6JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHZbIVI3Kkh6JCEjNyQiMFwjNFpaXFNJISM2NyQkIjAjPkQqeVcyeiQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB2WyFSNypIeiQhIzckIjBcIzRaWlxTSSEjNjckJCIwPWshUllpJXokISM3JCIwXCM0WlpcU0khIzY3JDckJCIwLGgpKTNyb3okISM3JCIwXCM0WlpcU0khIzY3JCQiMD1rIVJZaSV6JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCxoKSkzcm96JCEjNyQiMFwjNFpaXFNJISM2NyQkIjBYdykpWy8mKXokISM3JCIwXCM0WlpcU0khIzY3JDckJCIwR3QnUTR2K1EhIzckIjBcIzRaWlxTSSEjNjckJCIwWHcpKVsvJil6JCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEd0J1E0ditRISM3JCIwXCM0WlpcU0khIzY3JCQiMHIpb1FWUS1RISM3JCIwXCM0WlpcU0khIzY3JDckJCIwYSZbKXlJWSFRISM3JCIwXCM0WlpcU0khIzY3JCQiMHIpb1FWUS1RISM3JCIwXCM0WlpcU0khIzY3JDckJCIwYSZbKXlJWSFRISM3JCIwXCM0WlpcU0khIzY3JCQiMCk0XSk9a2khUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIwXCM0WlpcU0khIzY3JCQiMCk0XSk9a2khUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIwXCM0WlpcU0khIzY3JCQiMEM4JFFTOTVRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMjUiKVshUjdRISM3JCIwXCM0WlpcU0khIzY3JCQiMEM4JFFTOTVRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMjUiKVshUjdRISM3JCIwXCM0WlpcU0khIzY3JCQiMF5EIikpUS05USEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME1BekxxaSJRISM3JCIwXCM0WlpcU0khIzY3JCQiMF5EIikpUS05USEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME1BekxxaSJRISM3JCIwXCM0WlpcU0khIzY3JCQiMHhQenQueiJRISM3JCIwXCM0WlpcU0khIzY3JDckJCIvWXQoPV0sI1EhIzYkIjBcIzRaWlxTSSEjNjckJCIweFB6dC56IlEhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9ZdCg9XSwjUSEjNiQiMFwjNFpaXFNJISM2NyQkIjAvXXhlJHlAUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMChvYVArLkNRISM3JCIwXCM0WlpcU0khIzY3JCQiMC9deGUkeUBRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKG9hUCsuQ1EhIzckIjBcIzRaWlxTSSEjNjckJCIvQmNQTW1EUSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMDhmdCkpNHojUSEjNyQiMFwjNFpaXFNJISM2NyQkIi9CY1BNbURRISM2JCIwXCM0WlpcU0khIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIwXCM0WlpcU0khIzY3JCQiMGR1dEdWJkhRISM3JCIwXCM0WlpcU0khIzY3JDckJCIvOTxQKCp5SlEhIzYkIjBcIzRaWlxTSSEjNjckJCIwZHV0R1YmSFEhIzckIjBcIzRaWlxTSSEjNjckNyQkIi85PFAoKnlKUSEjNiQiMFwjNFpaXFNJISM2NyQkIjAkbz1QSlVMUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMG0kKXBlcGMkUSEjNyQiMFwjNFpaXFNJISM2NyQkIjAkbz1QSlVMUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMG0kKXBlcGMkUSEjNyQiMFwjNFpaXFNJISM2NyQkIi8iKipwKUhJUFEhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjAkZnpPJVwmUlEhIzckIjBcIzRaWlxTSSEjNjckJCIvIioqcClISVBRISM2JCIwXCM0WlpcU0khIzY3JDckJCIwJGZ6TyVcJlJRISM3JCIwXCM0WlpcU0khIzY3JCQiME82byRHPVRRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPjNtR0hNJVEhIzckIjBcIzRaWlxTSSEjNjckJCIwTzZvJEc9VFEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA+M21HSE0lUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBqQm1vaV0lUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFk/azg0dCVRISM3JCIwXCM0WlpcU0khIzY3JCQiMGpCbW9pXSVRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWT9rODR0JVEhIzckIjBcIzRaWlxTSSEjNjckJCIwKmVWT0QlKltRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwc0tpKSopPV5RISM3JCIwXCM0WlpcU0khIzY3JCQiMCplVk9EJSpbUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHNLaSkqKT1eUSEjNyQiMFwjNFpaXFNJISM2NyQkIjA7W2lRQUcmUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpcL08pb10mUSEjNyQiMFwjNFpaXFNJISM2NyQkIjA7W2lRQUcmUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCpcL08pb10mUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBVZ2dCLW4mUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMERkZW9bKmVRISM3JCIwXCM0WlpcU0khIzY3JCQiMFVnZ0ItbiZRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwRGRlb1sqZVEhIzckIjBcIzRaWlxTSSEjNjckJCIwcHNlMyNlZ1EhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBfcGNgR0cnUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBwc2UzI2VnUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMF9wY2BHRydRISM3JCIwXCM0WlpcU0khIzY3JCQiMCZcb04+WWtRISM3JCIwXCM0WlpcU0khIzY3JDckJCIweSJbJlEzbidRISM3JCIwXCM0WlpcU0khIzY3JCQiMCZcb04+WWtRISM3JCIwXCM0WlpcU0khIzY3JDckJCIweSJbJlEzbidRISM3JCIwXCM0WlpcU0khIzY3JCQiMEEoXCZ5VCRvUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBBKFwmeVQkb1EhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAwJUhOIyllcVEhIzckIjBcIzRaWlxTSSEjNjckJCIwWzRgakBBKFEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBLMV4zb1coUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBbNGBqQEEoUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEoxXjNvVyhRISM3JCIwXCM0WlpcU0khIzY3JCQiMHZAXlssaChRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZT1cJHpNeVEhIzckIjBcIzRaWlxTSSEjNjckJCIwdkBeWyxoKFEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBlPVwkek15USEjNyQiMFwjNFpaXFNJISM2NyQkIjAsTVxMIikqelEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAmM3QleUZBKVEhIzckIjBcIzRaWlxTSSEjNjckJCIwLE1cTCIpKnpRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJTN0JXlGQSlRISM3JCIwXCM0WlpcU0khIzY3JCQiMEdZWj1oUSlRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwNlZYajJoKVEhIzckIjBcIzRaWlxTSSEjNjckJCIwR1laPWhRKVEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA2VlhqMmgpUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBiZVguVHgpUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFFiVlsoKSoqKVEhIzckIjBcIzRaWlxTSSEjNjckJCIwYmVYLlR4KVEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBQYlZbKCkqKilRISM3JCIwXCM0WlpcU0khIzY3JCQiMCIzUCUpM2kiKlEhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBrblRMblEqUSEjNyQiMFwjNFpaXFNJISM2NyQkIjAiM1AlKTNpIipRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwa25UTG5RKlEhIzckIjBcIzRaWlxTSSEjNjckJCIwMyQ9TTJdJipRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwIip6Uj1aeCpRISM3JCIwXCM0WlpcU0khIzY3JCQiMDMkPU0yXSYqUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCIqelI9WngqUSEjNyQiMFwjNFpaXFNJISM2NyQkIjBNJipSZSFRKipRISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPCN6THFpLFIhIzckIjBcIzRaWlxTSSEjNjckJCIwTSYqUmUhUSoqUSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDwjekxxaSxSISM3JCIwXCM0WlpcU0khIzY3JCQiMGgyUVZnSyFSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwVy9PKW9dMFIhIzckIjBcIzRaWlxTSSEjNjckJCIwaDJRVmdLIVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBXL08pb10wUiEjNyQiMFwjNFpaXFNJISM2NyQkIjAoKT5PR1NyIVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9uVExuUTRSISM2JCIwXCM0WlpcU0khIzY3JCQiMCgpPk9HU3IhUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL25UTG5RNFIhIzYkIjBcIzRaWlxTSSEjNjckJCIwOUtNOD81IlIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAoKkdLZW1LIlIhIzckIjBcIzRaWlxTSSEjNjckJCIwOUtNOD81IlIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAoKkdLZW1LIlIhIzckIjBcIzRaWlxTSSEjNjckJCIvV0MkKSoqKlsiUiEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMEJUSVZZciJSISM3JCIwXCM0WlpcU0khIzY3JCQiL1dDJCkqKipbIlIhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjBCVElWWXIiUiEjNyQiMFwjNFpaXFNJISM2NyQkIjBuY0kkKXooPVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9OJkdHRTUjUiEjNiQiMFwjNFpaXFNJISM2NyQkIjBuY0kkKXooPVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9OJkdHRTUjUiEjNiQiMFwjNFpaXFNJISM2NyQkIjAkKm9Hb2ZFI1IhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB3bEU4MVwjUiEjNyQiMFwjNFpaXFNJISM2NyQkIjAkKm9Hb2ZFI1IhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB3bEU4MVwjUiEjNyQiMFwjNFpaXFNJISM2NyQkIi83b0smUmwjUiEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMC55QylmeUdSISM3JCIwXCM0WlpcU0khIzY3JCQiLzdvSyZSbCNSISM2JCIwXCM0WlpcU0khIzY3JDckJCIwLnlDKWZ5R1IhIzckIjBcIzRaWlxTSSEjNjckJCIwWSRcI1E+LyRSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwSCFIS2VtS1IhIzckIjBcIzRaWlxTSSEjNjckJCIwWSRcI1E+LyRSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwSCFIS2VtS1IhIzckIjBcIzRaWlxTSSEjNjckJCIwdDBCQipITVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBjLUBvWGwkUiEjNyQiMFwjNFpaXFNJISM2NyQkIjB0MEJCKkhNUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGMtQG9YbCRSISM3JCIwXCM0WlpcU0khIzY3JCQiMCp6NiMzeiJRUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMFwjNFpaXFNJISM2NyQkIjAqejYjM3oiUVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAjWyI+YEQvJVIhIzckIjBcIzRaWlxTSSEjNjckJCIwRUk+JCplPyVSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwNEY8UTBWJVIhIzckIjBcIzRaWlxTSSEjNjckJCIwRUk+JCplPyVSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwNEY8UTBWJVIhIzckIjBcIzRaWlxTSSEjNjckJCIwX1U8eVFmJVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBOUjpCJj1bUiEjNyQiMFwjNFpaXFNJISM2NyQkIjBfVTx5UWYlUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME5SOkImPVtSISM3JCIwXCM0WlpcU0khIzY3JCQiMHphOmo9KVxSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwaV44M2w/JlIhIzckIjBcIzRaWlxTSSEjNjckJCIwemE6aj0pXFIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBpXjgzbD8mUiEjNyQiMFwjNFpaXFNJISM2NyQkIjAwbjhbKXBgUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMFwjNFpaXFNJISM2NyQkIjAwbjhbKXBgUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMFwjNFpaXFNJISM2NyQkIjBLejZMeXYmUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDp3NHlDKWZSISM3JCIwXCM0WlpcU0khIzY3JCQiMEt6Nkx5diZSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwOnc0eUMpZlIhIzckIjBcIzRaWlxTSSEjNjckJCIwZSIqND1lOSdSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwVCl5SVlxalIhIzckIjBcIzRaWlxTSSEjNjckJCIwZSIqND1lOSdSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwVCl5SVlxalIhIzckIjBcIzRaWlxTSSEjNjckJCIwJlEhMy5RYCdSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwbysxWyVlblIhIzckIjBcIzRaWlxTSSEjNjckJCIwJlEhMy5RYCdSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwbysxWyVlblIhIzckIjBcIzRaWlxTSSEjNjckJCIwNjsxKXlAcFIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAlSFRJVllyUiEjNyQiMFwjNFpaXFNJISM2NyQkIjA2OzEpeUBwUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCVIVElWWXJSISM3JCIwXCM0WlpcU0khIzY3JCQiMFFHL3QoNHRSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwQEQtPVdgKFIhIzckIjBcIzRaWlxTSSEjNjckJCIwUUcvdCg0dFIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBARC09V2AoUiEjNyQiMFwjNFpaXFNJISM2NyQkIjBrUy1leHAoUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFpQKy5DI3pSISM3JCIwXCM0WlpcU0khIzY3JCQiMGtTLWV4cChSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWlArLkMjelIhIzckIjBcIzRaWlxTSSEjNjckJCIwIkgwSXUmMylSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwdVwpelE1JClSISM3JCIwXCM0WlpcU0khIzY3JCQiMCJIMEl1JjMpUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHVcKXpRNSQpUiEjNyQiMFwjNFpaXFNJISM2NyQkIjA8bCl6c3QlKVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIi5pJ0hQKXApUiEjNSQiMFwjNFpaXFNJISM2NyQkIjA8bCl6c3QlKVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIi5pJ0hQKXApUiEjNSQiMFwjNFpaXFNJISM2NyQkIjBXeCdIcmgpKVIhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBGdSV6TiczKlIhIzckIjBcIzRaWlxTSSEjNjckJCIwV3gnSHJoKSlSISM3JCIwXCM0WlpcU0khIzY3JDckJCIwRnUlek4nMypSISM3JCIwXCM0WlpcU0khIzY3JCQiLygqW3pwXCMqUiEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMGAnR0hNdSUqUiEjNyQiMFwjNFpaXFNJISM2NyQkIi8oKlt6cFwjKlIhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjBgJ0dITXUlKlIhIzckIjBcIzRaWlxTSSEjNjckJCIwKD5JSG9QJypSISM3JCIwXCM0WlpcU0khIzY3JDckJCIvKSk0ektpKSpSISM2JCIwXCM0WlpcU0khIzY3JCQiMCg+SUhvUCcqUiEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLykpNHpLaSkqUiEjNiQiMFwjNFpaXFNJISM2NyQkIjBCOSJ6bUQrUyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDE2KkdKXS1TISM3JCIwXCM0WlpcU0khIzY3JCQiMEI5InptRCtTISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMTYqR0pdLVMhIzckIjBcIzRaWlxTSSEjNjckJCIvbCMqR2w4L1MhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjBMQih5SFExUyEjNyQiMFwjNFpaXFNJISM2NyQkIi9sIypHbDgvUyEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMExCKHlIUTFTISM3JCIwXCM0WlpcU0khIzY3JCQiMHdRKHlqLDNTISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZk4mR0dFNVMhIzckIjBcIzRaWlxTSSEjNjckJCIwd1EoeWosM1MhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBmTiZHR0U1UyEjNyQiMFwjNFpaXFNJISM2NyQkIjAuXiZHaSo9LCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAneU15RTk5UyEjNyQiMFwjNFpaXFNJISM2NyQkIjAuXiZHaSo9LCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAneU15RTk5UyEjNyQiMFwjNFpaXFNJISM2NyQkIjBIaiR5Z3g6UyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDdnIkdELT1TISM3JCIwXCM0WlpcU0khIzY3JCQiMEhqJHlneDpTISM3JCIwXCM0WlpcU0khIzY3JDckJCIwN2ciR0QtPVMhIzckIjBcIzRaWlxTSSEjNjckJCIwY3YiR2ZsPlMhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBSc3pQLT4tJSEjNyQiMFwjNFpaXFNJISM2NyQkIjBjdiJHZmw+UyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFJzelAtPi0lISM3JCIwXCM0WlpcU0khIzY3JCQiMCN5KXp4Tk4tJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGwleUZBeURTISM3JCIwXCM0WlpcU0khIzY3JCQiMCN5KXp4Tk4tJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGwleUZBeURTISM3JCIwXCM0WlpcU0khIzY3JCQiMDQreWk6dS0lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwI3BmeD9tSFMhIzckIjBcIzRaWlxTSSEjNjckJCIwNCt5aTp1LSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAjcGZ4P21IUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBON3daJkhKUyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMD00dSM+YUxTISM3JCIwXCM0WlpcU0khIzY3JCQiME43d1omSEpTISM3JCIwXCM0WlpcU0khIzY3JDckJCIwPTR1Iz5hTFMhIzckIjBcIzRaWlxTSSEjNjckJCIwaUN1S3ZeLiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBYQHN4QHUuJSEjNyQiMFwjNFpaXFNJISM2NyQkIjBpQ3VLdl4uJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFhAc3hAdS4lISM3JCIwXCM0WlpcU0khIzY3JCQiMClvQnheMFJTISM3JCIwXCM0WlpcU0khIzY3JDckJCIwckxxaSw4LyUhIzckIjBcIzRaWlxTSSEjNjckJCIwKW9CeF4wUlMhIzckIjBcIzRaWlxTSSEjNjckNyQkIjByTHFpLDgvJSEjNyQiMFwjNFpaXFNJISM2NyQkIjA6XHEtTkgvJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMClmJW9aIj1YUyEjNyQiMFwjNFpaXFNJISM2NyQkIjA6XHEtTkgvJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMClmJW9aIj1YUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBUaG8oWyJvLyUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBDZW1LaCFcUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBUaG8oWyJvLyUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBDZW1LaCFcUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBvdG1zJXBdUyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMF5xazxUSDAlISM3JCIwXCM0WlpcU0khIzY3JCQiMG90bXMlcF1TISM3JCIwXCM0WlpcU0khIzY3JDckJCIwXnFrPFRIMCUhIzckIjBcIzRaWlxTSSEjNjckJCIwJWZbd1hkYVMhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjBcIzRaWlxTSSEjNjckJCIwJWZbd1hkYVMhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjBcIzRaWlxTSSEjNjckJCIwQClIRVdYZVMhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAvJjR3M3FnUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBAKUhFV1hlUyEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMC8mNHczcWdTISM3JCIwXCM0WlpcU0khIzY3JCQiMFo1aEZNQjElISM3JCIwXCM0WlpcU0khIzY3JDckJCIvdCFmcyFla1MhIzYkIjBcIzRaWlxTSSEjNjckJCIwWjVoRk1CMSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIi90IWZzIWVrUyEjNiQiMFwjNFpaXFNJISM2NyQkIjB1QWY3OWkxJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwXCM0WlpcU0khIzY3JCQiMHVBZjc5aTElISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZD5kZGclb1MhIzckIjBcIzRaWlxTSSEjNjckJCIuTmQoUjRxUyEjNSQiMFwjNFpaXFNJISM2NyQ3JCQiMCQ9YEQvTXNTISM3JCIwXCM0WlpcU0khIzY3JCQiLk5kKFI0cVMhIzUkIjBcIzRaWlxTSSEjNjckNyQkIjAkPWBEL01zUyEjNyQiMFwjNFpaXFNJISM2NyQkIjBGWmIjUShSMiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9UTXYtQXdTISM2JCIwXCM0WlpcU0khIzY3JCQiMEZaYiNRKFIyJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL1RNdi1Bd1MhIzYkIjBcIzRaWlxTSSEjNjckJCIwYGZgbmB5MiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBQY143KywzJSEjNyQiMFwjNFpaXFNJISM2NyQkIjBgZmBuYHkyJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME9jXjcrLDMlISM3JCIwXCM0WlpcU0khIzY3JCQiLz08RE50IjMlISM2JCIwXCM0WlpcU0khIzY3JDckJCIwam9cKCp6UjMlISM3JCIwXCM0WlpcU0khIzY3JCQiLz08RE50IjMlISM2JCIwXCM0WlpcU0khIzY3JDckJCIwam9cKCp6UjMlISM3JCIwXCM0WlpcU0khIzY3JCQiMDElKVxQOGMzJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCozeUMpZnkzJSEjNyQiMFwjNFpaXFNJISM2NyQkIjAxJSlcUDhjMyUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAqM3lDKWZ5MyUhIzckIjBcIzRaWlxTSSEjNjckJCIwTCd6Q0tcKjMlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwOyRmdSdSPDQlISM3JCIwXCM0WlpcU0khIzY3JCQiMEwnekNLXCozJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDskZnUnUjw0JSEjNyQiMFwjNFpaXFNJISM2NyQkIi8nM1kydEw0JSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMFYwV18+YzQlISM3JCIwXCM0WlpcU0khIzY3JCQiLyczWTJ0TDQlISM2JCIwXCM0WlpcU0khIzY3JDckJCIwVTBXXz5jNCUhIzckIjBcIzRaWlxTSSEjNjckJCIwJzNVQ0hEKDQlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwcDxVUCpcKjQlISM3JCIwXCM0WlpcU0khIzY3JCQiMCczVUNIRCg0JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHA8VVAqXCo0JSEjNyQiMFwjNFpaXFNJISM2NyQkIjA4TFV4SzY1JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCcqSFNBekw1JSEjNyQiMFwjNFpaXFNJISM2NyQkIjA4TFV4SzY1JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCcqSFNBekw1JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBSWFNpN101JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEFVUTJmczUlISM3JCIwXCM0WlpcU0khIzY3JCQiMFJYU2k3XTUlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwQVVRMmZzNSUhIzckIjBcIzRaWlxTSSEjNjckJCIwbWRRWiMqKTNUISM3JCIwXCM0WlpcU0khIzY3JDckJCIwXGFPIypRNjYlISM3JCIwXCM0WlpcU0khIzY3JCQiMG1kUVojKikzVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFxhTyMqUTY2JSEjNyQiMFwjNFpaXFNJISM2NyQkIjAjKnBPS3NGNiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB2bU14PV02JSEjNyQiMFwjNFpaXFNJISM2NyQkIjAjKnBPS3NGNiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjB2bU14PV02JSEjNyQiMFwjNFpaXFNJISM2NyQkIjA+I1t0QGw7VCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMC16S2kpKik9VCEjNyQiMFwjNFpaXFNJISM2NyQkIjA+I1t0QGw7VCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMC16S2kpKik9VCEjNyQiMFwjNFpaXFNJISM2NyQkIjBYJUhCP2A/VCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEciNHQleUY3JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBYJUhCP2A/VCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEciNHQleUY3JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBzMUooPVRDVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGIuSEtlbTclISM3JCIwXCM0WlpcU0khIzY3JCQiMHMxSig9VENUISM3JCIwXCM0WlpcU0khIzY3JDckJCIwYi5IS2VtNyUhIzckIjBcIzRaWlxTSSEjNjckJCIwKSo9SHMiSEdUISM3JCIwXCM0WlpcU0khIzY3JDckJCIwImVycyJRMDglISM3JCIwXCM0WlpcU0khIzY3JCQiMCkqPUhzIkhHVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBESkZkckA4JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDNHRC09VzglISM3JCIwXCM0WlpcU0khIzY3JCQiMERKRmRyQDglISM3JCIwXCM0WlpcU0khIzY3JDckJCIwM0dELT1XOCUhIzckIjBcIzRaWlxTSSEjNjckJCIwXlZEVV5nOCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBNU0IoeUhRVCEjNyQiMFwjNFpaXFNJISM2NyQkIjBeVkRVXmc4JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME1TQih5SFFUISM3JCIwXCM0WlpcU0khIzY3JCQiMHliQkZKKlJUISM3JCIwXCM0WlpcU0khIzY3JDckJCIwaF9Ac3hAOSUhIzckIjBcIzRaWlxTSSEjNjckJCIweWJCRkoqUlQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBoX0BzeEA5JSEjNyQiMFwjNFpaXFNJISM2NyQkIjAvb0A3NlE5JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMChbJz5kZGc5JSEjNyQiMFwjNFpaXFNJISM2NyQkIjAvb0A3NlE5JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMChbJz5kZGc5JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBKISk+KDRwWlQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA5eDxVUCpcVCEjNyQiMFwjNFpaXFNJISM2NyQkIjBKISk+KDRwWlQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA5eDxVUCpcVCEjNyQiMFwjNFpaXFNJISM2NyQkIjBkI3pAM2ReVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLyUqZXJzIlE6JSEjNiQiMFwjNFpaXFNJISM2NyQkIjBkI3pAM2ReVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiLyUqZXJzIlE6JSEjNiQiMFwjNFpaXFNJISM2NyQkIjAlW2dyMVhiVCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMG4sOTcocGRUISM3JCIwXCM0WlpcU0khIzY3JCQiMCVbZ3IxWGJUISM3JCIwXCM0WlpcU0khIzY3JDckJCIwbiw5NyhwZFQhIzckIjBcIzRaWlxTSSEjNjckJCIvclRAMExmVCEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMCRSQHJwZGhUISM3JCIwXCM0WlpcU0khIzY3JCQiL3JUQDBMZlQhIzYkIjBcIzRaWlxTSSEjNjckNyQkIjAkUkBycGRoVCEjNyQiMFwjNFpaXFNJISM2NyQkIjBQSDdQNUs7JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL2ktQG9YbFQhIzYkIjBcIzRaWlxTSSEjNjckJCIwUEg3UDVLOyUhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9pLUBvWGxUISM2JCIwXCM0WlpcU0khIzY3JCQiMGpUNUEhNG5UISM3JCIwXCM0WlpcU0khIzY3JDckJCIwWVEzbk8kcFQhIzckIjBcIzRaWlxTSSEjNjckJCIwalQ1QSE0blQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBZUTNuTyRwVCEjNyQiMFwjNFpaXFNJISM2NyQkIi9SJjMycTQ8JSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMHRdMV87SzwlISM3JCIwXCM0WlpcU0khIzY3JCQiL1ImMzJxNDwlISM2JCIwXCM0WlpcU0khIzY3JDckJCIwdF0xXztLPCUhIzckIjBcIzRaWlxTSSEjNjckJCIwO20xIypcWzwlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKkhZcWo0eFQhIzckIjBcIzRaWlxTSSEjNjckJCIwO20xIypcWzwlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKkhZcWo0eFQhIzckIjBcIzRaWlxTSSEjNjckJCIwVnkveEgoeVQhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBFdi1BdzQ9JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBWeS94SCh5VCEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEV2LUF3ND0lISM3JCIwXCM0WlpcU0khIzY3JCQiMHAhSD8nNEU9JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMF8oM3FnJls9JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBwIUg/JzRFPSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjBcIzRaWlxTSSEjNjckJCIwJ0g1cSUqWyc9JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHoqKik+ZnQpPSUhIzckIjBcIzRaWlxTSSEjNjckJCIwJ0g1cSUqWyc9JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHoqKik+ZnQpPSUhIzckIjBcIzRaWlxTSSEjNjckJCIwQToqPiRwLj4lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwMDcocGRoIz4lISM3JCIwXCM0WlpcU0khIzY3JCQiMEE6Kj4kcC4+JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDA3KHBkaCM+JSEjNyQiMFwjNFpaXFNJISM2NyQkIjBcRihwIlxVPiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBLQyY+Y1wnPiUhIzckIjBcIzRaWlxTSSEjNjckJCIwXEYocCJcVT4lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwS0MmPmNcJz4lISM3JCIwXCM0WlpcU0khIzY3JCQiMHZSJj4hSCIpPiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBlTyRwYVArVSEjNyQiMFwjNFpaXFNJISM2NyQkIjB2UiY+IUgiKT4lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwZU8kcGFQK1UhIzckIjBcIzRaWlxTSSEjNjckJCIwLV8kcCkzPz8lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwJilbIj5gRC9VISM3JCIwXCM0WlpcU0khIzY3JCQiMC1fJHApMz8/JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMCYpWyI+YEQvVSEjNyQiMFwjNFpaXFNJISM2NyQkIjBHayI+KCkpZT8lISM3JCIwXCM0WlpcU0khIzY3JDckJCIwNmgqb144M1UhIzckIjBcIzRaWlxTSSEjNjckJCIwR2siPigpKWU/JSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDZoKm9eODNVISM3JCIwXCM0WlpcU0khIzY3JCQiMGJ3Km8mbyg0VSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFF0KD1dLDdVISM3JCIwXCM0WlpcU0khIzY3JCQiMGJ3Km8mbyg0VSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFF0KD1dLDdVISM3JCIwXCM0WlpcU0khIzY3JCQiMCIpKXk9JVtPQCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBrJmVvWyplQCUhIzckIjBcIzRaWlxTSSEjNjckJCIwIikpeT0lW09AJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGsmZW9bKmVAJSEjNyQiMFwjNFpaXFNJISM2NyQkIjAzLCdvI0d2QCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAielI9Wng+VSEjNyQiMFwjNFpaXFNJISM2NyQkIjAzLCdvI0d2QCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAielI9Wng+VSEjNyQiMFwjNFpaXFNJISM2NyQkIjBNOCU9IjM5QSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA8NSNvWGxCVSEjNyQiMFwjNFpaXFNJISM2NyQkIjBNOCU9IjM5QSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjA8NSNvWGxCVSEjNyQiMFwjNFpaXFNJISM2NyQkIjBoRCNvekdEVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMFdBIT1XYEZVISM3JCIwXCM0WlpcU0khIzY3JCQiMGhEI296R0RVISM3JCIwXCM0WlpcU0khIzY3JDckJCIwV0EhPVdgRlUhIzckIjBcIzRaWlxTSSEjNjckJCIwKHkuPXk7SFUhIzckIjBcIzRaWlxTSSEjNjckNyQkIi9aJHlFOTlCJSEjNiQiMFwjNFpaXFNJISM2NyQkIjAoeS49eTtIVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiL1okeUU5OUIlISM2JCIwXCM0WlpcU0khIzY3JCQiMDldeW1aSUIlISM3JCIwXCM0WlpcU0khIzY3JDckJCIwKHBrPFRITlUhIzckIjBcIzRaWlxTSSEjNjckJCIwOV15bVpJQiUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAocGs8VEhOVSEjNyQiMFwjNFpaXFNJISM2NyQkIi9DbTx2I3BCJSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMEJmdSdSPFJVISM3JCIwXCM0WlpcU0khIzY3JCQiL0NtPHYjcEIlISM2JCIwXCM0WlpcU0khIzY3JDckJCIwQmZ1J1I8UlUhIzckIjBcIzRaWlxTSSEjNjckJCIwbnV1TzIzQyUhIzckIjBcIzRaWlxTSSEjNjckNyQkIi86RjxRMFZVISM2JCIwXCM0WlpcU0khIzY3JCQiMG51dU8yM0MlISM3JCIwXCM0WlpcU0khIzY3JDckJCIvOkY8UTBWVSEjNiQiMFwjNFpaXFNJISM2NyQkIjAkcEc8c29XVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHckM25PJHBDJSEjNyQiMFwjNFpaXFNJISM2NyQkIjAkcEc8c29XVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMHckM25PJHBDJSEjNyQiMFwjNFpaXFNJISM2NyQkIi8jKjRucWNbVSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMC4nKm9eODNEJSEjNyQiMFwjNFpaXFNJISM2NyQkIi8jKjRucWNbVSEjNiQiMFwjNFpaXFNJISM2NyQ3JCQiMC4nKm9eODNEJSEjNyQiMFwjNFpaXFNJISM2NyQkIjBZNnAicFdfVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMEgzbk8kcGFVISM3JCIwXCM0WlpcU0khIzY3JCQiMFk2cCJwV19VISM3JCIwXCM0WlpcU0khIzY3JDckJCIwSDNuTyRwYVUhIzckIjBcIzRaWlxTSSEjNjckJCIwdEJud0VqRCUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBjP2xAdCZlVSEjNyQiMFwjNFpaXFNJISM2NyQkIjB0Qm53RWpEJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMGM/bEB0JmVVISM3JCIwXCM0WlpcU0khIzY3JCQiMCpmYDttP2dVISM3JCIwXCM0WlpcU0khIzY3JDckJCIwI0dMbUlYaVUhIzckIjBcIzRaWlxTSSEjNjckJCIwKmZgO20/Z1UhIzckIjBcIzRaWlxTSSEjNjckNyQkIjAjR0xtSVhpVSEjNyQiMFwjNFpaXFNJISM2NyQkIjBFW2pZJzNrVSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiMDRYaCJITG1VISM3JCIwXCM0WlpcU0khIzY3JCQiMEVbalknM2tVISM3JCIwXCM0WlpcU0khIzY3JDckJCIwNFhoIkhMbVUhIzckIjBcIzRaWlxTSSEjNjckJCIwX2doSm16RSUhIzckIjBcIzRaWlxTSSEjNjckNyQkIjBOZGZ3Ny1GJSEjNyQiMFwjNFpaXFNJISM2NyQkIjBfZ2hKbXpFJSEjNyQiMFwjNFpaXFNJISM2NyQ3JCQiME5kZnc3LUYlISM3JCIwXCM0WlpcU0khIzY3JCQiMDhtSyk9KFFGJSEjNyQiMCkqNEVRKipSLiQhIzY3JDckJCIwaXBkaCM0dVUhIzckIjB0IlE3WmNMSSEjNjckJCIwOG1LKT0oUUYlISM3JCIwKSo0RVEqKlIuJCEjNjckNyQkIjApPWVsQyh6RiUhIzckIjBRSzFIZ18tJCEjNjckJCIwY247YT9VRiUhIzckIjA5PVhoIkhMSSEjNjckNyQkIjBjbjthP1VGJSEjNyQiMDk9WGgiSExJISM2NyQkIjBpcGRoIzR1VSEjNyQiMHQiUTdaY0xJISM2NyQ3JCQiMDolUjpCJj1HJSEjNyQiMD1HSzt4biwkISM2NyQkIjAvI1xiPCoqelUhIzckIjB5SFExXjMtJCEjNjckNyQkIjAvI1xiPCoqelUhIzckIjB5SFExXjMtJCEjNjckJCIwKT1lbEMoekYlISM3JCIwUUsxSGdfLSQhIzY3JDckJCIwVDFfO0tkRyUhIzckIjBlLj8yOiIzSSEjNjckJCIwRVVkPitjRyUhIzckIjBVVEpeNSUzSSEjNjckNyQkIjBFVWQ+K2NHJSEjNyQiMFVUSl41JTNJISM2NyQkIjA6JVI6QiY9RyUhIzckIjA9R0s7eG4sJCEjNjckNyQkIjBUMV87S2RHJSEjNyQiMGUuPzI6IjNJISM2NyQkIjBeYTpcXmdHJSEjNyQiMGFkJzNtUTJJISM2NyQ3JCQiMG89XSw3JypHJSEjNyQiMFs2I1sneSMqKkghIzY3JCQiMF5hOlxeZ0clISM3JCIwYWQnM21RMkkhIzY3JDckJCIwJTQkWyc9XCRIJSEjNyQiMFknZWNERSEqSCEjNjckJCIwaFN4WFE1SCUhIzckIjAxYEMnKnBmKkghIzY3JDckJCIwaFN4WFE1SCUhIzckIjAxYEMnKnBmKkghIzY3JCQiMG89XSw3JypHJSEjNyQiMFs2I1sneSMqKkghIzY3JDckJCIwQFZZcnJ0SCUhIzckIjAlKVxhLG01KUghIzY3JCQiLy5APVpMJ0glISM2JCIvWnc2JUhOKUghIzU3JDckJCIvLkA9WkwnSCUhIzYkIi9adzYlSE4pSCEjNTckJCIwJTQkWyc9XCRIJSEjNyQiMFknZWNERSEqSCEjNjckNyQkIjBAVllycnRIJSEjNyQiMCUpXGEsbTUpSCEjNjckJCIwJVJZInAkXCtWISM3JCIwVV9UJSo9TihIISM2NyQ3JCQiMFpiV2NeN0klISM3JCIwQVdfXipvckghIzY3JCQiMCVSWSJwJFwrViEjNyQiMFVfVCUqPU4oSCEjNjckNyQkIjB1blVUSl5JJSEjNyQiMGImKlEqWzhpSCEjNjckJCIwLyV5cWhcLFYhIzckIjBNdzUnKSkzckghIzY3JDckJCIwLyV5cWhcLFYhIzckIjBNdzUnKSkzckghIzY3JCQiMFpiV2NeN0klISM3JCIwQVdfXipvckghIzY3JDckJCItM2s3LDRWISIqJCIwVTZARClSX0ghIzY3JCQiMERjV15CbEklISM3JCIwKXpRNSRbJ2VIISM2NyQ3JCQiMERjV15CbEklISM3JCIwKXpRNSRbJ2VIISM2NyQkIjB1blVUSl5JJSEjNyQiMGImKlEqWzhpSCEjNjckNyQkIjBGIypRNiIqR0olISM3JCIwIiopNCQ9ekMlSCEjNjckJCIwWlFuYU45SiUhIzckIjBpKnBmeD9ZSCEjNjckNyQkIjBaUW5hTjlKJSEjNyQiMGkqcGZ4P1lIISM2NyQkIi0zazcsNFYhIiokIjBVNkBEKVJfSCEjNjckNyQkIjBhL1AnNHg7ViEjNyQiMD49bkZ4QiRIISM2NyQkIjB1VD9nUWlKJSEjNyQiMEU2ITRzd0xIISM2NyQ3JCQiMHVUP2dRaUolISM3JCIwRTYhNHN3TEghIzY3JCQiMEYjKlE2IipHSiUhIzckIjAiKik0JD16QyVIISM2NyQ3JCQiMGEvUCc0eDtWISM3JCIwPj1uRnhCJEghIzY3JCQiMFQvZCVlRj5WISM3JCIwaSMzRWF0REghIzY3JDckJCIvb144M2w/ViEjNiQiMG0nUVhJNEFIISM2NyQkIjBUL2QlZUY+ViEjNyQiMGkjM0VhdERIISM2NyQ3JCQiMDJITG1JWEslISM3JCIwOWRaXEU7IkghIzY3JCQiMCd5N2tkJDRLJSEjNyQiL0hLZW1LQEghIzU3JDckJCIwJ3k3a2QkNEslISM3JCIvSEtlbUtASCEjNTckJCIvb144M2w/ViEjNiQiMG0nUVhJNEFIISM2NyQ3JCQiMExUSl41JUdWISM3JCIwLGR4U3Y0IUghIzY3JCQiMEVxWU1KYkslISM3JCIwYU13NScpKTNIISM2NyQ3JCQiMEVxWU1KYkslISM3JCIwYU13NScpKTNIISM2NyQkIjAySExtSVhLJSEjNyQiMDlkWlxFOyJIISM2NyQ3JCQiL08mSE8hSEtWISM2JCIwM0MlPiRSLCpHISM2NyQkIjA7MTZkTitMJSEjNyQiMD1ZcGJYaypHISM2NyQ3JCQiMDsxNmROK0wlISM3JCIwPVlwYlhrKkchIzY3JCQiMExUSl41JUdWISM3JCIwLGR4U3Y0IUghIzY3JDckJCIwJ2V3Ny08T1YhIzckIjBbTUd3PCJ6RyEjNjckJCIwVzJtLGBXTCUhIzckIjAjeUQxXSslKUchIzY3JDckJCIwVzJtLGBXTCUhIzckIjAjeUQxXSslKUchIzY3JCQiL08mSE8hSEtWISM2JCIwM0MlPiRSLCpHISM2NyQ3JCQiMDh5RDFdK00lISM3JCIvQzhZLSJ6J0chIzU3JCQiMGAhR1V6eVFWISM3JCIwWXBiWGs6KEchIzY3JDckJCIwYCFHVXp5UVYhIzckIjBZcGJYazooRyEjNjckJCIwJ2V3Ny08T1YhIzckIjBbTUd3PCJ6RyEjNjckNyQkIjBSIVI3KkhSTSUhIzckIjBPWyMpRztsJkchIzY3JCQiMFYmeUVWL1ZWISM3JCIvNilbIVI3ZkchIzU3JDckJCIwViZ5RVYvVlYhIzckIi82KVshUjdmRyEjNTckJCIwOHlEMV0rTSUhIzckIi9DOFktInonRyEjNTckNyQkIjBtLUF3NHlNJSEjNyQiMD1kZFBOXCVHISM2NyQkIjBUQyF5ZUFaViEjNyQiMHUjPmFMb1lHISM2NyQ3JCQiMFRDIXllQVpWISM3JCIwdSM+YUxvWUchIzY3JCQiMFIhUjcqSFJNJSEjNyQiME9bIylHO2wmRyEjNjckNyQkIjAjXCw3JypvXlYhIzckIjB6YGIsbkokRyEjNjckJCIwUE4pb2dMXlYhIzckIjBQL04hR0NNRyEjNjckNyQkIjBQTilvZ0xeViEjNyQiMFAvTiFHQ01HISM2NyQkIjBtLUF3NHlNJSEjNyQiMD1kZFBOXCVHISM2NyQ3JCQiMD5GPVlwYk4lISM3JCIwKFEpSG81NyNHISM2NyQkIjBSYiw5eWBOJSEjNyQiMCw7R0QtPSNHISM2NyQ3JCQiMFJiLDl5YE4lISM3JCIwLDtHRC09I0chIzY3JCQiMCNcLDcnKm9eViEjNyQiMHpgYixuSiRHISM2NyQ3JCQiMFhSO0pcJWZWISM3JCIuIikpcGUxNEchIio3JCQiMER1NjhiJGZWISM3JCIwbEZAcWgkNEchIzY3JDckJCIwRHU2OGIkZlYhIzckIjBsRkBxaCQ0RyEjNjckJCIwPkY9WXBiTiUhIzckIjAoUSlIbzU3I0chIzY3JDckJCIwc145O0hMTyUhIzckIjBpXEowS256IyEjNjckJCIwMFVrKSlwS08lISM3JCIwSFI5OkBweiMhIzY3JDckJCIwMFVrKSlwS08lISM3JCIwSFI5OkBweiMhIzY3JCQiMFhSO0pcJWZWISM3JCIuIikpcGUxNEchIio3JDckJCIwKVJFNiE0c08lISM3JCIwMmckNCgzVXkjISM2NyQkIjAjZXZ0XTduViEjNyQiMCQ0disxWyV5IyEjNjckNyQkIjAjZXZ0XTduViEjNyQiMCQ0disxWyV5IyEjNjckJCIwc145O0hMTyUhIzckIjBpXEowS256IyEjNjckNyQkIjBEdzUnKSkzclYhIzckIjBORCo9YFxyRiEjNjckJCIwZVEhKT5CNFAlISM3JCIwZGkrMFM/eCMhIzY3JDckJCIwZVEhKT5CNFAlISM3JCIwZGkrMFM/eCMhIzY3JCQiMClSRTYhNHNPJSEjNyQiMDJnJDQoM1V5IyEjNjckNyQkIjBeKSkzcm9cUCUhIzckIjBMInpoOGZlRiEjNjckJCIwUkNDaG1ZUCUhIzckIjBAdSQqXCpmZkYhIzY3JDckJCIwUkNDaG1ZUCUhIzckIjBAdSQqXCpmZkYhIzY3JCQiMER3NScpKTNyViEjNyQiME5EKj1gXHJGISM2NyQ3JCQiMHkrMmNbKXlWISM3JCIwZUtZSidcWEYhIzY3JCQiL3JhRnZOeVYhIzYkIjAmZW9bKmVydSMhIzY3JDckJCIvcmFGdk55ViEjNiQiMCZlb1sqZXJ1IyEjNjckJCIwXikpM3JvXFAlISM3JCIwTCJ6aDhmZUYhIzY3JDckJCIwLzgwVEdGUSUhIzckIjBRViZbJzRBdCMhIzY3JCQiMCU+PEAhKSo+USUhIzckIjBcKCp6Uj1adCMhIzY3JDckJCIwJT48QCEpKj5RJSEjNyQiMFwoKnpSPVp0IyEjNjckJCIweSsyY1speVYhIzckIjBlS1lKJ1xYRiEjNjckNyQkIjBKRC5FM21RJSEjNyQiMCoqKVtXM3Q9RiEjNjckJCIwXCU9XitmJlElISM3JCIwODR0JXlGQUYhIzY3JDckJCIwXCU9XitmJlElISM3JCIwODR0JXlGQUYhIzY3JCQiMC84MFRHRlElISM3JCIwUVYmWyc0QXQjISM2NyQ3JCQiMGRQLDYpWyFSJSEjNyQiMHRPO1JmXXEjISM2NyQkIjBEQ2NZTiIqUSUhIzckIjB4P21IUCk0RiEjNjckNyQkIjBEQ2NZTiIqUSUhIzckIjB4P21IUCk0RiEjNjckJCIwSkQuRTNtUSUhIzckIjAqKilbVzN0PUYhIzY3JDckJCIwJSlcKmZ6TyVSJSEjNyQiMCc0dm5aPiJwIyEjNjckJCIwOzguK09FUiUhIzckIjBUS2Z1J1IocCMhIzY3JDckJCIwOzguK09FUiUhIzckIjBUS2Z1J1IocCMhIzY3JCQiMGRQLDYpWyFSJSEjNyQiMHRPO1JmXXEjISM2NyQ3JCQiL0B3NHlDKVIlISM2JCIwKTM/bWs4eEUhIzY3JCQiMHgxIylIJDQnUiUhIzckIjAwV18+Y1xvIyEjNjckNyQkIjB4MSMpSCQ0J1IlISM3JCIwMFdfPmNcbyMhIzY3JCQiMCUpXCpmek8lUiUhIzckIjAnNHZuWj4icCMhIzY3JDckJCIwUHUmZnc3LVchIzckIjAzJ2ZxUilHbSMhIzY3JCQiLylHLCIqMyYqUiUhIzYkIjBwYlhrOkRuIyEjNjckNyQkIi8pRywiKjMmKlIlISM2JCIwcGJYazpEbiMhIzY3JCQiL0B3NHlDKVIlISM2JCIwKTM/bWs4eEUhIzY3JDckJCIwaidRNHYrMVchIzckIjBuPDF5TyVbRSEjNjckJCIwUVFtSCUpR1MlISM3JCIwTG5RNHYrbSMhIzY3JDckJCIwUVFtSCUpR1MlISM3JCIwTG5RNHYrbSMhIzY3JCQiMFB1JmZ3Ny1XISM3JCIwMydmcVIpR20jISM2NyQ3JCQiLyopPmZ0KSk0VyEjNiQiMDElNDlhekxFISM2NyQkIjB1KUgyIT0mNFchIzckIjBoIVwjKlI+TkUhIzY3JDckJCIwdSlIMiE9JjRXISM3JCIwaCFcIypSPk5FISM2NyQkIjAvYlxhQ3VTJSEjNyQiMDcmPigpMzRWRSEjNjckNyQkIjAmR1JYM0ExVyEjNyQiMCgqeUphTXdrIyEjNjckJCIwL2JcYUN1UyUhIzckIjA3Jj4oKTM0VkUhIzY3JDckJCIwJkdSWDNBMVchIzckIjAoKnlKYU13ayMhIzY3JCQiMGonUTR2KzFXISM3JCIwbjwxeU8lW0UhIzY3JDckJCIwOzYhNHN3OFchIzckIi9oREEhZio9RSEjNTckJCIwbFVUdnhGVCUhIzckIjBELT1XYEZpIyEjNjckNyQkIjBsVVR2eEZUJSEjNyQiMEQtPVdgRmkjISM2NyQkIi8qKT5mdCkpNFchIzYkIjAxJTQ5YXpMRSEjNjckNyQkIjBWQillcWs8VyEjNyQiMGFgJD5sI1JnIyEjNjckJCIwXF9TUS1nVCUhIzckIjAqUTYiKkdKNUUhIzY3JDckJCIwXF9TUS1nVCUhIzckIjAqUTYiKkdKNUUhIzY3JCQiMDs2ITRzdzhXISM3JCIvaERBIWYqPUUhIzU3JDckJCIwcE4nM3BfQFchIzckIjBYZSczdXApZSMhIzY3JCQiLy0oUi0kPj5XISM2JCIwYEQvTXN5ZiMhIzY3JDckJCIvLShSLSQ+PlchIzYkIjBgRC9Nc3lmIyEjNjckJCIwVkIpZXFrPFchIzckIjBhYCQ+bCNSZyMhIzY3JDckJCIwJ3pXZW5TRFchIzckIjBqJT0vN0Z0RCEjNjckJCIwRSVmUjJOQVchIzckIjA8UCgqeUphZSMhIzY3JDckJCIwRCVmUjJOQVchIzckIjA8UCgqeUphZSMhIzY3JCQiMHBOJzNwX0BXISM3JCIwWGUnM3VwKWUjISM2NyQ3JCQiMEFnIzNtR0hXISM3JCIwSzR5SVx3YiMhIzY3JCQiMFsjZiFHbyZHVyEjNyQiMFhnJClvXTBjIyEjNjckNyQkIjBbI2YhR28mR1chIzckIjBYZyQpb10wYyMhIzY3JCQiMG9sUj5cZFUlISM3JCIwcEloQiQqPWQjISM2NyQ3JCQiMDEqKmVhd2FVJSEjNyQiMCIpWyFSNypIZCMhIzY3JCQiMG9sUj5cZFUlISM3JCIwcEloQiQqPWQjISM2NyQ3JCQiMDEqKmVhd2FVJSEjNyQiMCIpWyFSNypIZCMhIzY3JCQiMCd6V2VuU0RXISM3JCIwaiU9LzdGdEQhIzY3JDckJCIwXHMhZWs7TFchIzckIi9pZylmSD1hIyEjNTckJCIwKDMqb3NIO1YlISM3JCIwNHN3ODUiW0QhIzY3JDckJCIwKDMqb3NIO1YlISM3JCIwNHN3ODUiW0QhIzY3JCQiMEFnIzNtR0hXISM3JCIwSzR5SVx3YiMhIzY3JDckJCIwdiUpeUlZcVYlISM3JCIvMWtAOSJlXyMhIzU3JCQiMCJbWHM/bU1XISM3JCIwcyQpcGVwY2AjISM2NyQ3JCQiMCJbWHM/bU1XISM3JCIwcyQpcGVwY2AjISM2NyQkIjBccyFlaztMVyEjNyQiL2lnKWZIPWEjISM1NyQ3JCQiMC0ocGRoIzRXJSEjNyQiL05iQV1mNEQhIzU3JCQiL01FPDtrU1chIzYkIi4yY1speTVEISIqNyQ3JCQiL01FPDtrU1chIzYkIi4yY1speTVEISIqNyQkIjBXKHl1RHFSVyEjNyQiMCU0K1g9cjlEISM2NyQ3JCQiMHVBKVtobVBXISM3JCIwTyZITyFIS18jISM2NyQkIjBXKHl1RHFSVyEjNyQiMCU0K1g9cjlEISM2NyQ3JCQiMHVBKVtobVBXISM3JCIwTyZITyFIS18jISM2NyQkIjB2JSl5SVlxViUhIzckIi8xa0A5ImVfIyEjNTckNyQkIjBHNHYrMVtXJSEjNyQiMEEqXFgzPSRcIyEjNjckJCIwJ1JnOXplVlchIzckIjBrPVwkek0pXCMhIzY3JDckJCIwJ1JnOXplVlchIzckIjBrPVwkek0pXCMhIzY3JCQiMC0ocGRoIzRXJSEjNyQiL05iQV1mNEQhIzU3JDckJCIwYkB0JmVvW1chIzckIjBSJT5db2N3QyEjNjckJCIvJylbKyQzbFclISM2JCIwR0lVUTJmWyMhIzY3JDckJCIvJylbKyQzbFclISM2JCIwR0lVUTJmWyMhIzY3JCQiMEc0disxW1clISM3JCIwQSpcWDM9JFwjISM2NyQ3JCQiMCJRODJkY19XISM3JCIwKls1N0x2ZkMhIzY3JCQiMFo2MSpIRl9XISM3JCIwY2BHR0U1WSMhIzY3JDckJCIwWjYxKkhGX1chIzckIjBjYEdHRTVZIyEjNjckJCIwczNiJypROVglISM3JCIwbWFgN1JZWSMhIzY3JDckJCIwREAxWS4lXFchIzckIjAjPmFMb1l0QyEjNjckJCIwczNiJypROVglISM3JCIwbWFgN1JZWSMhIzY3JDckJCIwREAxWS4lXFchIzckIjAjPmFMb1l0QyEjNjckJCIwYkB0JmVvW1chIzckIjBSJT5db2N3QyEjNjckNyQkIjAzWXBiWGtYJSEjNyQiMFZ1TCYzdVVDISM2NyQkIjAlZUkvZzZiVyEjNyQiL187S2RlW0MhIzU3JDckJCIwJGVJL2c2YlchIzckIi9fO0tkZVtDISM1NyQkIjAiUTgyZGNfVyEjNyQiMCpbNTdMdmZDISM2NyQ3JCQiME1lblNELlklISM3JCIvOVEhR0ZiVSMhIzU3JCQiMGEjZSR5TnpYJSEjNyQiMCVvWiI9WGhWIyEjNjckNyQkIjBhI2UkeU56WCUhIzckIjAlb1oiPVhoViMhIzY3JCQiMDNZcGJYa1glISM3JCIwVnVMJjN1VUMhIzY3JDckJCIwaHFsRDBVWSUhIzckIjA0cF4hUTYzQyEjNjckJCIvI1ssZDBOWSUhIzYkIjA3KywzazdUIyEjNjckNyQkIi8jWyxkME5ZJSEjNiQiMDcrLDNrN1QjISM2NyQkIjBXOTpcXTxZJSEjNyQiMHh0YTtOIj5DISM2NyQ3JCQiMGB0YypHdGdXISM3JCIwWyl5SVlxQkMhIzY3JCQiMFc5OlxdPFklISM3JCIweHRhO04iPkMhIzY3JDckJCIwYHRjKkd0Z1chIzckIjBbKXlJWXFCQyEjNjckJCIwTWVuU0QuWSUhIzckIi85USFHRmJVIyEjNTckNyQkIjAoR1ExXjNvVyEjNyQiMEA/WU0qXCFSIyEjNjckJCIwYVwpemBEbVchIzckIjB3NiVITiMpKVIjISM2NyQ3JCQiMGFcKXpgRG1XISM3JCIwdzYlSE4jKSlSIyEjNjckJCIwaHFsRDBVWSUhIzckIjA0cF4hUTYzQyEjNjckNyQkIjA5Jj5jXCc+WiUhIzckIjAiPTVTSm9zQiEjNjckJCIwKWZKIXAicHJXISM3JCIwL04hR0MlUlAjISM2NyQ3JCQiMClmSiFwInByVyEjNyQiMC9OIUdDJVJQIyEjNjckJCIuOidlJWU1WiUhIzUkIjAoSG1vIVxvUCMhIzY3JDckJCIwJno4NlUpKm9XISM3JCIvTXN5SFEnUSMhIzU3JCQiLjonZSVlNVolISM1JCIwKEhtbyFcb1AjISM2NyQ3JCQiMCZ6ODZVKSpvVyEjNyQiL01zeUhRJ1EjISM1NyQkIjAoR1ExXjNvVyEjNyQiMEA/WU0qXCFSIyEjNjckNyQkIi91KzFbJWVaJSEjNiQiMDE3N0NtWU4jISM2NyQkIjBhJEciUXdWWiUhIzckIjBvWXQoPV1oQiEjNjckNyQkIjBhJEciUXdWWiUhIzckIjBvWXQoPV1oQiEjNjckJCIwOSY+Y1wnPlolISM3JCIwIj01U0pvc0IhIzY3JDckJCIwbj5lbEMoelchIzckIjBjJFFhaVdPQiEjNjckJCIwJG96SndvelchIzckIjAnKnBmeD9tTCMhIzY3JDckJCIwJG96SndvelchIzckIjAnKnBmeD9tTCMhIzY3JCQiMHNAKCkpeWd6VyEjNyQiLyY+Uz0mKnBMIyEjNTckNyQkIjByWkhmVHFaJSEjNyQiMEtlbUtoIVxCISM2NyQkIjBzQCgpKXlnelchIzckIi8mPlM9JipwTCMhIzU3JDckJCIwclpIZlRxWiUhIzckIjBLZW1LaCFcQiEjNjckJCIvdSsxWyVlWiUhIzYkIjAxNzdDbVlOIyEjNjckNyQkIjAkPmowWGckWyUhIzckIjBXKUcmUkQhPUIhIzY3JCQiMCZlSmc6SiNbJSEjNyQiLztHRC09Q0IhIzU3JDckJCIwJmVKZzpKI1slISM3JCIvO0dELT1DQiEjNTckJCIwbj5lbEMoelchIzckIjBjJFFhaVdPQiEjNjckNyQkIi9VV2JWWyhbJSEjNiQiMFhMKXkwUypIIyEjNjckJCIwaytOTTxcWyUhIzckIjBDJGZ1J1I8SiMhIzY3JDckJCIwaytOTTxcWyUhIzckIjBDJGZ1J1I8SiMhIzY3JCQiMCQ+ajBYZyRbJSEjNyQiMFcpRyZSRCE9QiEjNjckNyQkIjBZY18/azhcJSEjNyQiMDJZdkB1MEcjISM2NyQkIjAjPXYmW3MrXCUhIzckIjBfO0tkZW9HIyEjNjckNyQkIjAjPXYmW3MrXCUhIzckIjBfO0tkZW9HIyEjNjckJCIwKUcmKjNpYShbJSEjNyQiMEBBT3orIipIIyEjNjckNyQkIjB3OkdNMHZbJSEjNyQiMClbIVI3KkgqSCMhIzY3JCQiMClHJiozaWEoWyUhIzckIjBAQU96KyIqSCMhIzY3JDckJCIwdzpHTTB2WyUhIzckIjApWyFSNypIKkgjISM2NyQkIi9VV2JWWyhbJSEjNiQiMFhMKXkwUypIIyEjNjckNyQkIjB0b10wV19cJSEjNyQiMGAxWE9WOkUjISM2NyQkIjAxPTcpZTomXCUhIzckIi8pUj1aeD5FIyEjNTckNyQkIjAxPTcpZTomXCUhIzckIi8pUj1aeD5FIyEjNTckJCIvTj9CJCopXFwlISM2JCIwJCpSc0QlemlBISM2NyQ3JCQiMClRaTpFaSNcJSEjNyQiMDtHRC09V0YjISM2NyQkIi9OP0IkKilcXCUhIzYkIjAkKlJzRCV6aUEhIzY3JDckJCIwKVFpOkVpI1wlISM3JCIwO0dELT1XRiMhIzY3JCQiMFljXz9rOFwlISM3JCIwMll2QHUwRyMhIzY3JDckJCIwKjQpWyFSNypcJSEjNyQiMDdLMjg1QkMjISM2NyQkIi90eWYncHdcJSEjNiQiMFdeNiNwYFxBISM2NyQ3JCQiL3R5Zidwd1wlISM2JCIwV142I3BgXEEhIzY3JCQiMHRvXTBXX1wlISM3JCIwYDFYT1Y6RSMhIzY3JDckJCIwRSRwYVArLlghIzckIjBjPS08c0dBIyEjNjckJCIwWGcncCpbRV0lISM3JCIwcnUoPmVsQ0EhIzY3JDckJCIwWGcncCpbRV0lISM3JCIwcnUoPmVsQ0EhIzY3JCQiMFssPlA8P10lISM3JCIwTm8lMyc9eUEjISM2NyQ3JCQiMFAzXWFuLF0lISM3JCIwMmovUCc0UEEhIzY3JCQiMFssPlA8P10lISM3JCIwTm8lMyc9eUEjISM2NyQ3JCQiMFAzXWFuLF0lISM3JCIwMmovUCc0UEEhIzY3JCQiMCo0KVshUjcqXCUhIzckIjA3SzI4NUJDIyEjNjckNyQkIjBfMFhnJClvXSUhIzckIjBQcVFlSUs/IyEjNjckJCIwWSYqW2o3Xl0lISM3JCIwTiczcF9AN0EhIzY3JDckJCIwWSYqW2o3Xl0lISM3JCIwTiczcF9AN0EhIzY3JCQiMEUkcGFQKy5YISM3JCIwYz0tPHNHQSMhIzY3JDckJCIwejxWWGoyXiUhIzckIjA3YzFSJVEkPSMhIzY3JCQiMHB0Pm4kKio0WCEjNyQiMGo0eDtNdD0jISM2NyQ3JCQiMHB0Pm4kKio0WCEjNyQiMGo0eDtNdD0jISM2NyQkIjBgIip5YyhwM1ghIzckIi9LZEskZVI+IyEjNTckNyQkIjBuSiplOGMyWCEjNyQiMCp6Uj1aeCo+IyEjNjckJCIwYCIqeWMocDNYISM3JCIvS2RLJGVSPiMhIzU3JDckJCIwbkoqZThjMlghIzckIjAqelI9WngqPiMhIzY3JCQiMF8wWGckKW9dJSEjNyQiMFBxUWVJSz8jISM2NyQ3JCQiMDBJVElWWV4lISM3JCIwSlUxMUxMOyMhIzY3JCQiMDBEbzY1Q14lISM3JCIwRkBxaCQqWzwjISM2NyQ3JCQiMDFEbzY1Q14lISM3JCIwRkBxaCQqWzwjISM2NyQkIjB6PFZYajJeJSEjNyQiMDdjMVIlUSQ9IyEjNjckNyQkIjBLVVI6QiY9WCEjNyQiMG9RRV54STkjISM2NyQkIjA7NGk/KT48WCEjNyQiMGJXY143KzojISM2NyQ3JCQiMDs0aT8pPjxYISM3JCIwYldjXjcrOiMhIzY3JCQiMHIzcWMiMzpYISM3JCIwdz13elo1OyMhIzY3JDckJCIwJ2Y0d0MiW14lISM3JCIwIkhMbUlYaUAhIzY3JCQiMHIzcWMiMzpYISM3JCIwdz13elo1OyMhIzY3JDckJCIwJ2Y0d0MiW14lISM3JCIwIkhMbUlYaUAhIzY3JCQiMDBJVElWWV4lISM3JCIwSlUxMUxMOyMhIzY3JDckJCIwZmFQKy5DXyUhIzckIjBrO18uO0U3IyEjNjckJCIwQlk/a0Y+XyUhIzckIjAkeUU5OThEQCEjNjckNyQkIjBCWT9rRj5fJSEjNyQiMCR5RTk5OERAISM2NyQkIjAwRnpDKj1AWCEjNyQiMHApZmpLLUhAISM2NyQ3JCQiMHd3IWUrZD5YISM3JCIwPmNcJz5kUEAhIzY3JCQiMDBGekMqPUBYISM3JCIwcClmakstSEAhIzY3JDckJCIwd3chZStkPlghIzckIjA+Y1wnPmRQQCEjNjckJCIwS1VSOkImPVghIzckIjBvUUVeeEk5IyEjNjckNyQkIjAmb2NgR0dFWCEjNyQiMGAiZiczXD41IyEjNjckJCIwTC9sM3FVXyUhIzckIjBaek4nM3A3QCEjNjckNyQkIjBML2wzcVVfJSEjNyQiMFp6TiczcDdAISM2NyQkIjBmYVArLkNfJSEjNyQiMGs7Xy47RTcjISM2NyQ3JCQiMDd6THFpLGAlISM3JCIwJmZqI293NTMjISM2NyQkIjBRQGJVOSpHWCEjNyQiMHYtQXc0eTMjISM2NyQ3JCQiMFFAYlU5KkdYISM3JCIwdi1BdzR5MyMhIzY3JCQiMG0zN3dtcV8lISM3JCIwbW80dk94NCMhIzY3JDckJCIwPktNdCpmRVghIzckIjA2IipHSl0tNSMhIzY3JCQiMG0zN3dtcV8lISM3JCIwbW80dk94NCMhIzY3JDckJCIwPktNdCpmRVghIzckIjA2IipHSl0tNSMhIzY3JCQiMCZvY2BHR0VYISM3JCIwYCJmJzNcPjUjISM2NyQ3JCQiMFEiPmBEL01YISM3JCIwSjooR3gqKmY/ISM2NyQkIjApUlZcW11MWCEjNyQiMC5FM21HSDEjISM2NyQ3JCQiMClSVlxbXUxYISM3JCIwLkUzbUdIMSMhIzY3JCQiMDp5TUVIRmAlISM3JCIwQFgybVJyMSMhIzY3JDckJCIwdEhcPjs3YCUhIzckIjBSOTpAcGAyIyEjNjckJCIwOnlNRUhGYCUhIzckIjBAWDJtUnIxIyEjNjckNyQkIjB0SFw+OzdgJSEjNyQiMFI5OkBwYDIjISM2NyQkIjA3ekxxaSxgJSEjNyQiMCZmaiNvdzUzIyEjNjckNyQkIjBsLklTQXpgJSEjNyQiMDApXCdHNyhRPyEjNjckJCIwNC9LcXpkYCUhIzckIjBuUCw2KVtdPyEjNjckNyQkIjA0L0txemRgJSEjNyQiMG5QLDYpW10/ISM2NyQkIjBRIj5gRC9NWCEjNyQiMEo6KEd4KipmPyEjNjckNyQkIjAiZiJHRC09YSUhIzckIjAkZSZlJjNBPD8hIzY3JCQiMEUjKj4hPkhTWCEjNyQiMCY0dzNxZ0Q/ISM2NyQ3JCQiMEUjKj4hPkhTWCEjNyQiMCY0dzNxZ0Q/ISM2NyQkIjA7J1wpSDMjUVghIzckIi9pUVwzOFA/ISM1NyQ3JCQiMCV6c1lHL1FYISM3JCIwSlwlZnYvUT8hIzY3JCQiMDsnXClIMyNRWCEjNyQiL2lRXDM4UD8hIzU3JDckJCIwJXpzWUcvUVghIzckIjBKXCVmdi9RPyEjNjckJCIwbC5JU0F6YCUhIzckIjAwKVwnRzcoUT8hIzY3JDckJCIwPUdFNSNvWFghIzckIi8kUSdSQV8mKj4hIzU3JCQiMF9gV09hWmElISM3JCIwQiVRMmZzKz8hIzY3JDckJCIwX2BXT2FaYSUhIzckIjBCJVEyZnMrPyEjNjckJCIwPWJZeS9OYSUhIzckIjBjNUBQMngrIyEjNjckNyQkIjAqKSkpelhIRGElISM3JCIwZnMhZWs7OD8hIzY3JCQiMD1iWXkvTmElISM3JCIwYzVAUDJ4KyMhIzY3JDckJCIwKikpKXpYSERhJSEjNyQiMGZzIWVrOzg/ISM2NyQkIjAiZiJHRC09YSUhIzckIjAkZSZlJjNBPD8hIzY3JDckJCIwV1NDJj5jXFghIzckIjBEIipHRjtPKD4hIzY3JCQiMCpHJT1mbyJcWCEjNyQiMF4yZyFbJWUoPiEjNjckNyQkIjAqRyU9Zm8iXFghIzckIjBeMmchWyVlKD4hIzY3JCQiMFVTZik0bFtYISM3JCIvMyx3ZHd5PiEjNTckNyQkIi9sJT48bnBhJSEjNiQiMChlcGNgRykpPiEjNjckJCIwVVNmKTRsW1ghIzckIi8zLHdkd3k+ISM1NyQ3JCQiL2wlPjxucGElISM2JCIwKGVwY2BHKSk+ISM2NyQkIjA9R0U1I29YWCEjNyQiLyRRJ1JBXyYqPiEjNTckNyQkIjByX0EhPVdgWCEjNyQiMCo9JmUkSF1ePiEjNjckJCIwOG0pXHVOXlghIzckIjA6PmBEL00nPiEjNjckNyQkIjA4bSlcdU5eWCEjNyQiMDo+YEQvTSc+ISM2NyQkIjBXU0MmPmNcWCEjNyQiMEQiKkdGO08oPiEjNjckNyQkIjAoXDFfO0tkWCEjNyQiMDBWJDNEPUg+ISM2NyQkIjBZTWdvLGRiJSEjNyQiMFVVUjpCJlE+ISM2NyQ3JCQiMFlNZ28sZGIlISM3JCIwVVVSOkImUT4hIzY3JCQiMDNoKHlVbGBYISM3JCIveSkqM0NHXT4hIzU3JDckJCIwWC4jemVgYFghIzckIjB6SVlxajQmPiEjNjckJCIwM2goeVVsYFghIzckIi95KSozQ0ddPiEjNTckNyQkIjBYLiN6ZWBgWCEjNyQiMHpJWXFqNCY+ISM2NyQkIjByX0EhPVdgWCEjNyQiMCo9JmUkSF1ePiEjNjckNyQkIjBDeD1dLDdjJSEjNyQiMEpVKikzYW0hPiEjNjckJCIwJ3lJOzcrZ1ghIzckIi9kY18/azg+ISM1NyQ3JCQiMCd5STs3K2dYISM3JCIvZGNfP2s4PiEjNTckJCIwdDgmZW9eZVghIzckIi8oMztCXUEjPiEjNTckNyQkIi96ampzJnliJSEjNiQiMDFhS2cjM0U+ISM2NyQkIjB0OCZlb15lWCEjNyQiLygzO0JdQSM+ISM1NyQ3JCQiL3pqanMmeWIlISM2JCIwMWFLZyMzRT4hIzY3JCQiMChcMV87S2RYISM3JCIwMFYkM0Q9SD4hIzY3JDckJCIvJipvXjgzbFghIzYkIjBCUU9dPFIpPSEjNjckJCIwOzchPnREa1ghIzckIjApKik9XjR3KSk9ISM2NyQ3JCQiMDs3IT50RGtYISM3JCIwKSopPV40dykpPSEjNjckJCIwemZ1bWZLYyUhIzckIjBhRE40LVkqPSEjNjckNyQkIjBaI1FYWThpWCEjNyQiME14PV0sNyE+ISM2NyQkIjB6ZnVtZktjJSEjNyQiMGFETjQtWSo9ISM2NyQ3JCQiMFojUVhZOGlYISM3JCIwTXg9XSw3IT4hIzY3JCQiMEN4PV0sN2MlISM3JCIwSlUqKTNhbSE+ISM2NyQ3JCQiMHgsOj9oKm9YISM3JCIwZVRPY3M0Jz0hIzY3JCQiMFRtZUByJW9YISM3JCIwRTcpXCl6USc9ISM2NyQ3JCQiMFRtZUByJW9YISM3JCIwRTcpXCl6USc9ISM2NyQkIjAzeHI7ISp5YyUhIzckIjA4XSZwU0puPSEjNjckNyQkIjA4bClvI3BqYyUhIzckIjBpKzBTP2ooPSEjNjckJCIwM3hyOyEqeWMlISM3JCIwOF0mcFNKbj0hIzY3JDckJCIwOGwpbyNwamMlISM3JCIwaSswUz9qKD0hIzY3JCQiLyYqb144M2xYISM2JCIwQlFPXTxSKT0hIzY3JDckJCIwLjk4MFRHZCUhIzckIjBcbXkzPnkkPSEjNjckJCIweFkheVNrc1ghIzckIjBhTiVbKCkqKlE9ISM2NyQ3JCQiMHhZIXlTa3NYISM3JCIwYU4lWygpKipRPSEjNjckJCIwWFhFPTpDZCUhIzckIjAiW3J2VU9TPSEjNjckNyQkIjBOT1ZLaTBkJSEjNyQiL1I3KkhSOSY9ISM1NyQkIjBYWEU9OkNkJSEjNyQiMCJbcnZVT1M9ISM2NyQ3JCQiME5PVktpMGQlISM3JCIvUjcqSFI5Jj0hIzU3JCQiMHgsOj9oKm9YISM3JCIwZFRPY3M0Jz0hIzY3JDckJCIvajcsNHN3WCEjNiQiMCU9YSQqcFg5PSEjNjckJCIwVzVJJlxydVghIzckIjA9Wng+ZWwjPSEjNjckNyQkIjBXNUkmXHJ1WCEjNyQiMD1aeD5lbCM9ISM2NyQkIjAuOTgwVEdkJSEjNyQiMFxteTM+eSQ9ISM2NyQ3JCQiMGNRNHYrMWUlISM3JCIwYG1fRicpM3oiISM2NyQkIi9rPF0jRyl5WCEjNiQiMFlxajR4OyE9ISM2NyQ3JCQiL2s8XSNHKXlYISM2JCIwWXFqNHg7IT0hIzY3JCQiL01DMCdSb2QlISM2JCIwM14hR3F0OD0hIzY3JDckJCIwKSp6XidweHdYISM3JCIwIyllcWs8VCI9ISM2NyQkIi9NQzAnUm9kJSEjNiQiMDNeIUdxdDg9ISM2NyQ3JCQiMCkqel4ncHh3WCEjNyQiMCMpZXFrPFQiPSEjNjckJCIvajcsNHN3WCEjNiQiMCU9YSQqcFg5PSEjNjckNyQkIjAkM3YrMVslZSUhIzckIjBQMCtUMXJ3IiEjNjckJCIwa3ZXRS5IZSUhIzckIjB1JCpcKmZ6dzwhIzY3JDckJCIwa3ZXRS5IZSUhIzckIjB1JCpcKmZ6dzwhIzY3JCQiMGVGOyZwOyJlJSEjNyQiMGRwMDBAdXkiISM2NyQ3JCQiL2UpUiYzKDNlJSEjNiQiL0BvWGxCKnkiISM1NyQkIjBlRjsmcDsiZSUhIzckIjBkcDAwQHV5IiEjNjckNyQkIjB6JilSJjMoM2UlISM3JCIvQG9YbEIqeSIhIzU3JCQiMGNRNHYrMWUlISM3JCIwYG1fRicpM3oiISM2NyQ3JCQiMDRqMFhnJCllJSEjNyQiMCZHJz5BPEp1IiEjNjckJCIwWUVFK1RwZSUhIzckIjAtPE8qWyI+diIhIzY3JDckJCIwWUVFK1RwZSUhIzckIjAtPE8qWyI+diIhIzY3JCQiMFxfP0wyYWUlISM3JCIwV0dfI1JRaDwhIzY3JDckJCIwO3MlKipwI1xlJSEjNyQiMFEwVldiVnciISM2NyQkIjBcXz9MMmFlJSEjNyQiMFdHXyNSUWg8ISM2NyQ3JCQiMDtzJSoqcCNcZSUhIzckIjBRMFZXYlZ3IiEjNjckJCIwJDN2KzFbJWUlISM3JCIwUDArVDFydyIhIzY3JDckJCIwT3YuSVNBZiUhIzckIjBURSZIJj0qPTwhIzY3JCQiMEAiKSpIQyU0ZiUhIzckIi8uQyN6THFzIiEjNTckNyQkIjBAIikqSEMlNGYlISM3JCIvLkMjekxxcyIhIzU3JCQiMGspR29hYyplJSEjNyQiLioqPV41Y3QiISIqNyQ3JCQiMCRRaSRRWSopZSUhIzckIjBtR0hNdSVSPCEjNjckJCIwaylHb2FjKmUlISM3JCIuKio9XjVjdCIhIio3JDckJCIwJFFpJFFZKillJSEjNyQiMG1HSE11JVI8ISM2NyQkIjA0ajBYZyQpZSUhIzckIjAmRyc+QTxKdSIhIzY3JDckJCIwaSg9XSw3J2YlISM3JCIwOUVvOjVYcCIhIzY3JCQiMHcxT1ozXGYlISM3JCIwZWozcF9AcSIhIzY3JDckJCIwdzFPWjNcZiUhIzckIjBlajNwX0BxIiEjNjckJCIvdzBAZGskZiUhIzYkIjBhUSJHbzM1PCEjNjckNyQkIjBQImZbKkhIZiUhIzckIjAlPmJUS2Y5PCEjNjckJCIvdzBAZGskZiUhIzYkIjBhUSJHbzM1PCEjNjckNyQkIjBQImZbKkhIZiUhIzckIjAlPmJUS2Y5PCEjNjckJCIwT3YuSVNBZiUhIzckIjBURSZIJj0qPTwhIzY3JDckJCIwKikqKioqKioqKioqZiUhIzckIjBKWS8lPiopcDshIzY3JCQiMCVRSEMrJSkpZiUhIzckIjAnb1sqZXJzbiIhIzY3JDckJCIwJVFIQyslKSlmJSEjNyQiMCdvWyplcnNuIiEjNjckJCIwOiI0R0BsKGYlISM3JCIwXmJyIyoqeiVvIiEjNjckNyQkIjB4cSMqZnlvZiUhIzckIjBBdiw5NygqbyIhIzY3JCQiMDoiNEdAbChmJSEjNyQiMF5iciMqKnolbyIhIzY3JDckJCIweHEjKmZ5b2YlISM3JCIwQXYsOTcoKm8iISM2NyQkIjBpKD1dLDcnZiUhIzckIjA5RW86NVhwIiEjNi0lJkNPTE9SRzYmJSRSR0JHJCIoXnVpJyEiKCQiKF51aSchIigkIihedWknISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzZdZ3M3JDckJCIwJ1woKnpSPVpIISM3JCIvamwlNGZ1JSoqISM1NyQkIjBCXFpJenIlSCEjNyQiMG1Zc3pQLSYqKiEjNjckNyQkIjBCXFpJenIlSCEjNyQiMG1Zc3pQLSYqKiEjNjckJCIwVE4rR3pyJUghIzckIjBUdnQnR0RdKiohIzY3JDckJCIwMTInWyVlciVIISM3JCIwLU56TXlFJyoqISM2NyQkIjBUTitHenIlSCEjNyQiMFR2dCdHRF0qKiEjNjckNyQkIjAxMidbJWVyJUghIzckIjAtTnpNeUUnKiohIzY3JCQiMEVLVEplciVIISM3JCIwdjxVa2dGJyoqISM2NyQ3JCQiMDlFI293OFpIISM3JCIwUUInKSopPV4oKiohIzY3JCQiMEVLVEplciVIISM3JCIwdjxVa2dGJyoqISM2NyQ3JCQiMDlFI293OFpIISM3JCIwUUInKSopPV4oKiohIzY3JCQiMFUsX1VQciVIISM3JCIwMl9VPG9fKCoqISM2NyQ3JCQiMDswTydwNlpIISM3JCIwdjYkXCVmdikqKiEjNjckJCIwVSxfVVByJUghIzckIjAyX1U8b18oKiohIzY3JDckJCIwOzBPJ3A2WkghIzckIjB2NiRcJWZ2KSoqISM2NyQkIjBtJD04bTZaSCEjNyQiME5vd1h2eCkqKiEjNjckNyQkIjBUO2hMJzRaSCEjNyQiMCwrKysrKysiISM1NyQkIjBtJD04bTZaSCEjNyQiME5vd1h2eCkqKiEjNjckNyQkIjBBKHlIUTFeSCEjNyQiMCkzInprWSNlIikhIzY3JCQiMDJfaExpNSZIISM3JCIwakEiKVwpemUiKSEjNjckNyQkIjAyX2hMaTUmSCEjNyQiMGpBIilcKXplIikhIzY3JCQiMDBPTEtpNSZIISM3JCIwViZbR0whKWUiKSEjNjckNyQkIjBvRUp3RzUmSCEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMDBPTEtpNSZIISM3JCIwViZbR0whKWUiKSEjNjckNyQkIjBvRUp3RzUmSCEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMCYpR0pZRzUmSCEjNyQiMHkqR11DTnIiKSEjNjckNyQkIjA8Oi5IJio0JkghIzckIjBOKlwqZnpPPSkhIzY3JCQiMCYpR0pZRzUmSCEjNyQiMHkqR11DTnIiKSEjNjckNyQkIjA8Oi5IJio0JkghIzckIjBOKlwqZnpPPSkhIzY3JCQiLmxjcSUqNCZIISM1JCIwYV9FQyxSPSkhIzY3JDckJCIwaC4xIz4nNCZIISM3JCIwcig9XSw3Jz4pISM2NyQkIi5sY3ElKjQmSCEjNSQiMGFfRUMsUj0pISM2NyQ3JCQiMGguMSM+JzQmSCEjNyQiMHIoPV0sNyc+KSEjNjckJCIwbllRMGg0JkghIzckIjAxb2lwXGs+KSEjNjckNyQkIjBGazRsRzQmSCEjNyQiMDN3M3FnJjMjKSEjNjckJCIwbllRMGg0JkghIzckIjAxb2lwXGs+KSEjNjckNyQkIjBGazRsRzQmSCEjNyQiMDN3M3FnJjMjKSEjNjckJCIwNzdZXUY0JkghIzckIjBvYDQjeSoqMyMpISM2NyQ3JCQiMDhgOFsmKjMmSCEjNyQiMFdrOkQsNUEpISM2NyQkIjA3N1ldRjQmSCEjNyQiMG9gNCN5KiozIykhIzY3JDckJCIwOGA4WyYqMyZIISM3JCIwV2s6RCw1QSkhIzY3JCQiMGkzejAlKjMmSCEjNyQiMFV5b2hYOkEpISM2NyQ3JCQiMHR5WFRpMyZIISM3JCIvR0QtPVdMIykhIzU3JCQiMGkzejAlKjMmSCEjNyQiMFV5b2hYOkEpISM2NyQ3JCQiMHR5WFRpMyZIISM3JCIvR0QtPVdMIykhIzU3JCQiMHVlbHJnMyZIISM3JCIwKT0qXDIkNE0jKSEjNjckNyQkIjBRemlXSDMmSCEjNyQiMDtUSE4jKWVDKSEjNjckJCIwdWVscmczJkghIzckIjApPSpcMiQ0TSMpISM2NyQ3JCQiMFF6aVdIMyZIISM3JCIwO1RITiMpZUMpISM2NyQkIjBEZGhaRjMmSCEjNyQiLyM+JTQta1kjKSEjNTckNyQkIjAoM0R6bHpdSCEjNyQiMF9ITyFIS2UjKSEjNjckJCIwRGRoWkYzJkghIzckIi8jPiU0LWtZIykhIzU3JDckJCIwKDNEemx6XUghIzckIjBfSE8hSEtlIykhIzY3JCQiMHk4JlJWel1IISM3JCIwWl42LCg9ZiMpISM2NyQ3JCQiMHU1TSJRd11IISM3JCIwKXlKYU13cSMpISM2NyQkIjB5OCZSVnpdSCEjNyQiMFpeNiwoPWYjKSEjNjckNyQkIjB1NU0iUXddSCEjNyQiMCl5SmFNd3EjKSEjNjckJCIvIz1rSWgyJkghIzYkIjBWaTNbTDxGKSEjNjckNyQkIjBzKXpYNnRdSCEjNyQiMEMxXSsvS0cpISM2NyQkIi8jPWtJaDImSCEjNiQiMFZpM1tMPEYpISM2NyQ3JCQiMHMpelg2dF1IISM3JCIwQzFdKy9LRykhIzY3JCQiMGgsVFBHMiZIISM3JCIwWEl1aXpVRykhIzY3JDckJCIwLFAjeiYpcF1IISM3JCIwaCVwYlhrJkgpISM2NyQkIjBoLFRQRzImSCEjNyQiMFhJdWl6VUcpISM2NyQ3JCQiMCxQI3omKXBdSCEjNyQiMGglcGJYayZIKSEjNjckJCIwMl5eYSZwXUghIzckIjA+Z0RXRG9IKSEjNjckNyQkIjAjPXo1aG1dSCEjNyQiMChIUTFeMzMkKSEjNjckJCIwMl5eYSZwXUghIzckIjA+Z0RXRG9IKSEjNjckNyQkIjAjPXo1aG1dSCEjNyQiMChIUTFeMzMkKSEjNjckJCIwXj5uIkdtXUghIzckIjB1IVFONFA0JCkhIzY3JDckJCIwKUg0VlBqXUghIzckIjBMcnFsRDBLKSEjNjckJCIwXj5uIkdtXUghIzckIjB1IVFONFA0JCkhIzY3JDckJCIwKUg0VlBqXUghIzckIjBMcnFsRDBLKSEjNjckJCIwLjw7PkkxJkghIzckIjBkIilvNDs+SykhIzY3JDckJCIwcmBOWiwxJkghIzckIjBwZng/bUhMKSEjNjckJCIwLjw7PkkxJkghIzckIjBkIilvNDs+SykhIzY3JDckJCIwcmBOWiwxJkghIzckIjBwZng/bUhMKSEjNjckJCIwPjBwbShmXUghIzckIjBtJVtPNFlNJCkhIzY3JDckJCIwTylHLiRwMCZIISM3JCIwMFslZW5TWCQpISM2NyQkIjA+MHBtKGZdSCEjNyQiMG0lW080WU0kKSEjNjckNyQkIjBPKUcuJHAwJkghIzckIjAwWyVlblNYJCkhIzY3JCQiMEZgUUNsMCZIISM3JCIwOT8sWDBxTSkhIzY3JDckJCIwUT00QlAwJkghIzckIjBUTyI0dCV5TikhIzY3JCQiMEZgUUNsMCZIISM3JCIwOT8sWDBxTSkhIzY3JDckJCIwUT00QlAwJkghIzckIjBUTyI0dCV5TikhIzY3JCQiMHdrNSNIYF1IISM3JCIwJmVFVSdcJmYkKSEjNjckNyQkIjA+KG9kX11dSCEjNyQiMHhDKWZ5R3EkKSEjNjckJCIwd2s1I0hgXUghIzckIjAmZUVVJ1wmZiQpISM2NyQ3JCQiMD4ob2RfXV1IISM3JCIweEMpZnlHcSQpISM2NyQkIi9OeSpwKzAmSCEjNiQiMFtMKjNONHMkKSEjNjckNyQkIjAoXF4kUXQvJkghIzckIjA4ODBUR0ZRKSEjNjckJCIvTnkqcCswJkghIzYkIjBbTCozTjRzJCkhIzY3JDckJCIwKFxeJFF0LyZIISM3JCIwODgwVEdGUSkhIzY3JCQiMFQpb3omby8mSCEjNyQiMGRfNjBQWVEpISM2NyQ3JCQiLypmYmdULyZIISM2JCIvOj9oKm9eUikhIzU3JCQiMFQpb3omby8mSCEjNyQiMGRfNjBQWVEpISM2NyQ3JCQiLypmYmdULyZIISM2JCIvOj9oKm9eUikhIzU3JCQiME5nJGVsVl1IISM3JCIwIip6bUYhPShSKSEjNjckNyQkIjBESWwjKjQvJkghIzckIjAnKSopPV40d1MpISM2NyQkIjBOZyRlbFZdSCEjNyQiMCIqem1GIT0oUikhIzY3JDckJCIwRElsIyo0LyZIISM3JCIwJykqKT1eNHdTKSEjNjckJCIwKCkqSFFZU11IISM3JCIveFx4SnM0JSkhIzU3JDckJCIwKjQ2WCR5LiZIISM3JCIwQXlEMV0rVSkhIzY3JCQiMCgpKkhRWVNdSCEjNyQiL3hceEpzNCUpISM1NyQ3JCQiMCo0NlgkeS4mSCEjNyQiMEF5RDFdK1UpISM2NyQkIjBvMHoiR1BdSCEjNyQiMEpTKGVkRUElKSEjNjckNyQkIjApSCk0J29NXUghIzckIjBlbUtoIVxLJSkhIzY3JCQiMG8weiJHUF1IISM3JCIwSlMoZWRFQSUpISM2NyQ3JCQiMClIKTQnb01dSCEjNyQiMGVtS2ghXEslKSEjNjckJCIwaXN0NFQuJkghIzckIjAzJHk+ITNbVikhIzY3JDckJCIwZGRWWjouJkghIzckIjAlXCZSO0pcVykhIzY3JCQiMGlzdDRULiZIISM3JCIwMyR5PiEzW1YpISM2NyQ3JCQiMGRkVlo6LiZIISM3JCIwJVwmUjtKXFcpISM2NyQkIjBwY2paNC4mSCEjNyQiMCgqRzwnKlx0VykhIzY3JDckJCIwcCNwJD0lR11IISM3JCIvTGs5PFBkJSkhIzU3JCQiMHBjalo0LiZIISM3JCIwKCpHPCcqXHRXKSEjNjckNyQkIjBwI3AkPSVHXUghIzckIi9Mazk8UGQlKSEjNTckJCIwQ2xOJnpGXUghIzckIjAkR3MpZSIqKWYlKSEjNjckNyQkIjAiM0siKkhEXUghIzckIjBtSmBFNylwJSkhIzY3JCQiMENsTiZ6Rl1IISM3JCIwJEdzKWUiKilmJSkhIzY3JDckJCIwIjNLIipIRF1IISM3JCIwbUpgRTcpcCUpISM2NyQkIjBqTzhgWS0mSCEjNyQiMHltSypHVnMlKSEjNjckNyQkIjB4eVoqPUFdSCEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwak84YFktJkghIzckIjB5bUsqR1ZzJSkhIzY3JDckJCIweHlaKj1BXUghIzckIjAuP2ciR0QjWykhIzY3JCQiMHg6dj86LSZIISM3JCIwM3JBKVEoXFspISM2NyQ3JCQiME9qViozPl1IISM3JCIwUjNuTyRwJVwpISM2NyQkIjB4OnY/Oi0mSCEjNyQiMDNyQSlRKFxbKSEjNjckNyQkIjBPalYqMz5dSCEjNyQiMFIzbk8kcCVcKSEjNjckJCIwdC85KVI9XUghIzckIjBgdHpiOXZcKSEjNjckNyQkIi83XyEqKmYsJkghIzYkIjB2J1I8UjgyJikhIzY3JCQiMHQvOSlSPV1IISM3JCIwYHR6Yjl2XCkhIzY3JDckJCIvN18hKipmLCZIISM2JCIwdidSPFI4MiYpISM2NyQkIjAzSVcmRzpdSCEjNyQiMCgqKno6XDA1JikhIzY3JDckJCIwdmlCPUgsJkghIzckIjA2JjNvV2Q+JikhIzY3JCQiMDNJVyZHOl1IISM3JCIwKCoqejpcMDUmKSEjNjckNyQkIjB2aUI9SCwmSCEjNyQiMDYmM29XZD4mKSEjNjckJCIwQSYqXCM9N11IISM3JCIweXAzJ1xmQSYpISM2NyQ3JCQiMG8rMVopNF1IISM3JCIwWnQoPV0sSyYpISM2NyQkIjBBJipcIz03XUghIzckIjB5cDMnXGZBJikhIzY3JDckJCIwbysxWik0XUghIzckIjBadCg9XSxLJikhIzY3JCQiMG8wXCozNF1IISM3JCIwbCRSKG9NXmApISM2NyQ3JCQiMFtrTyZ5MV1IISM3JCIwJD1ZcGJYVyYpISM2NyQkIjBvMFwqMzRdSCEjNyQiMGwkUihvTV5gKSEjNjckNyQkIjBba08meTFdSCEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwMSI0aCsxXUghIzckIjBrO181dXdhKSEjNjckNyQkIjBSJypITFArJkghIzckIjA+XSw3JypvYikhIzY3JCQiMDEiNGgrMV1IISM3JCIwaztfNXV3YSkhIzY3JDckJCIwUicqSExQKyZIISM3JCIwPl0sNycqb2IpISM2NyQkIjBNPmRLSCsmSCEjNyQiL3NRMktAZyYpISM1NyQ3JCQiMCdbUjJwK11IISM3JCIwYlEzbk8kcCYpISM2NyQkIjBNPmRLSCsmSCEjNyQiL3NRMktAZyYpISM1NyQ3JCQiMCdbUjJwK11IISM3JCIwYlEzbk8kcCYpISM2NyQkIjBZKil6bykqKlxIISM3JCIwJlJaJyo+dnMmKSEjNjckNyQkIjA+RWhkdypcSCEjNyQiMCNwX0BzeCJlKSEjNjckJCIwWSopem8pKipcSCEjNyQiMCZSWicqPnZzJikhIzY3JDckJCIwPkVoZHcqXEghIzckIjAjcF9Ac3giZSkhIzY3JCQiMGRWajlvKlxIISM3JCIwL3N1WiFIJmUpISM2NyQ3JCQiMGsoKTNNWSpcSCEjNyQiMEc6QXg8VWYpISM2NyQkIjBkVmo5bypcSCEjNyQiMC9zdVohSCZlKSEjNjckNyQkIjBrKCkzTVkqXEghIzckIjBHOkF4PFVmKSEjNjckJCIwaHhHcVAqXEghIzckIjAmNG1WJ0d5ZikhIzY3JDckJCIwR2YlKj47KlxIISM3JCIway5IS2VtZykhIzY3JCQiMGh4R3FQKlxIISM3JCIwJjRtVidHeWYpISM2NyQ3JCQiMEdmJSo+OypcSCEjNyQiMGsuSEtlbWcpISM2NyQkIjBeYGBOMipcSCEjNyQiMClvQC1sTzUnKSEjNjckNyQkIjAjPiE9OicpKVxIISM3JCIuI2Z0KSk0PicpISIqNyQkIjBeYGBOMipcSCEjNyQiMClvQC1sTzUnKSEjNjckNyQkIjAjPiE9OicpKVxIISM3JCIuI2Z0KSk0PicpISIqNyQkIjBcQ1A1eClcSCEjNyQiMCIqKkdgUyFIaSkhIzY3JDckJCIwdTIqKT5jKVxIISM3JCIwTyFHQyVSOmopISM2NyQkIjBcQ1A1eClcSCEjNyQiMCIqKkdgUyFIaSkhIzY3JDckJCIwdTIqKT5jKVxIISM3JCIwTyFHQyVSOmopISM2NyQkIjB3XyVccCUpXEghIzckIjBeIj4jSFRhaikhIzY3JDckJCIwOiE9VGojKVxIISM3JCIwc29cKCp6UmspISM2NyQkIjB3XyVccCUpXEghIzckIjBeIj4jSFRhaikhIzY3JDckJCIwOiE9VGojKVxIISM3JCIwc29cKCp6UmspISM2NyQkIjAxQDoqbyIpXEghIzckIjBZJD1BI3l6aykhIzY3JDckJCIvTWZ3bHpcSCEjNiQiMDNkY18/a2wpISM2NyQkIjAxQDoqbyIpXEghIzckIjBZJD1BI3l6aykhIzY3JDckJCIvTWZ3bHpcSCEjNiQiMDNkY18/a2wpISM2NyQkIjBbKylHcHlcSCEjNyQiMGAmKW8lW15nJykhIzY3JDckJCIwTXVdIXB3XEghIzckIjBYWGoyaClvJykhIzY3JCQiMFsrKUdweVxIISM3JCIwYCYpbyVbXmcnKSEjNjckNyQkIjBNdV0hcHdcSCEjNyQiMFhYajJoKW8nKSEjNjckJCIuRUExZChcSCEjNSQiMCIpKkhqNjB0JykhIzY3JDckJCIwW3R2S1AoXEghIzckIjAiUS5GO0kibykhIzY3JCQiLkVBMWQoXEghIzUkIjAiKSpIajYwdCcpISM2NyQ3JCQiMFt0dktQKFxIISM3JCIwIlEuRjtJIm8pISM2NyQkIjAlb3UhSEYoXEghIzckIjBjJnp1cmUmbykhIzY3JDckJCIwWThTJXlxXEghIzckIjA8QXg8VVBwKSEjNjckJCIwJW91IUhGKFxIISM3JCIwYyZ6dXJlJm8pISM2NyQ3JCQiMFk4UyV5cVxIISM3JCIwPEF4PFVQcCkhIzY3JCQiLyJmX2gocFxIISM2JCIwVipceUc3KXApISM2NyQ3JCQiMEJqQlh5J1xIISM3JCIwYDUlR0Y9MSgpISM2NyQkIi8iZl9oKHBcSCEjNiQiMFYqXHlHNylwKSEjNjckNyQkIjBCakJYeSdcSCEjNyQiMGA1JUdGPTEoKSEjNjckJCIwUGZVLm8nXEghIzckIjAzSyN6I2UxcikhIzY3JDckJCIwIzQzYSJcJ1xIISM3JCIwKikpNHpLaT0oKSEjNjckJCIwUGZVLm8nXEghIzckIjAzSyN6I2UxcikhIzY3JDckJCIwIzQzYSJcJ1xIISM3JCIwKikpNHpLaT0oKSEjNjckJCIvazhbJlEnXEghIzYkIi5aZFAkPkIoKSEiKjckNyQkIjBHciZbKj4nXEghIzckIjBEKHlIUTFKKCkhIzY3JCQiL2s4WyZRJ1xIISM2JCIuWmRQJD5CKCkhIio3JDckJCIwR3ImWyo+J1xIISM3JCIwRCh5SFExSigpISM2NyQkIjA8NW86NCdcSCEjNyQiMHgrJG8iR2R0KSEjNjckNyQkIjBfTVskM2ZcSCEjNyQiMGh2L1EvTnUpISM2NyQkIjA8NW86NCdcSCEjNyQiMHgrJG8iR2R0KSEjNjckNyQkIjBfTVskM2ZcSCEjNyQiMGh2L1EvTnUpISM2NyQkIjB4WSlmKXomXEghIzckIjBvJUdlRUVbKCkhIzY3JDckJCIwJFtDOj1jXEghIzckIjAoUjtKXCVmdikhIzY3JCQiMHhZKWYpeiZcSCEjNyQiMG8lR2VFRVsoKSEjNjckNyQkIjAkW0M6PWNcSCEjNyQiMChSO0pcJWZ2KSEjNjckJCIweCgqeWxdJlxIISM3JCIvJjRPJW96ZygpISM1NyQ3JCQiMEdNZSlHYFxIISM3JCIwTV89WyZRbygpISM2NyQkIjB4KCp5bF0mXEghIzckIi8mNE8lb3pnKCkhIzU3JDckJCIwR01lKUdgXEghIzckIjBNXz1bJlFvKCkhIzY3JCQiMCM+cFs6X1xIISM3JCIwJHpiSjJMdCgpISM2NyQ3JCQiLypbKVxTXVxIISM2JCIvMmFLZyMzeSkhIzU3JCQiMCM+cFs6X1xIISM3JCIwJHpiSjJMdCgpISM2NyQ3JCQiLypbKVxTXVxIISM2JCIvMmFLZyMzeSkhIzU3JCQiMDE8YmAjXFxIISM3JCIwaChlNlYnZXkpISM2NyQ3JCQiMGBaXkl2JVxIISM3JCIwMUhLZW1LeikhIzY3JCQiMDE8YmAjXFxIISM3JCIwaChlNlYnZXkpISM2NyQ3JCQiMGBaXkl2JVxIISM3JCIwMUhLZW1LeikhIzY3JCQiMDcoUjlPWVxIISM3JCIwa1prZihSKXopISM2NyQ3JCQiMFtjQWxZJVxIISM3JCIwVTxSODJkISkpISM2NyQkIjA3KFI5T1lcSCEjNyQiMGtaa2YoUil6KSEjNjckNyQkIjBbY0FsWSVcSCEjNyQiMFU8UjgyZCEpKSEjNjckJCIwME5xeU0lXEghIzckIjBoeDFlSTQiKSkhIzY3JDckJCIwYjYtND0lXEghIzckIjB5MFlvWiI9KSkhIzY3JCQiMDBOcXlNJVxIISM3JCIwaHgxZUk0IikpISM2NyQ3JCQiMGI2LTQ9JVxIISM3JCIweTBZb1oiPSkpISM2NyQkIjBFK0owMSVcSCEjNyQiMF9QYEVqTSMpKSEjNjckNyQkIjBlKGU+JypRXEghIzckIjA5JUhOIyllSSkpISM2NyQkIjBFK0owMSVcSCEjNyQiMF9QYEVqTSMpKSEjNjckNyQkIjBlKGU+JypRXEghIzckIjA5JUhOIyllSSkpISM2NyQkIi8lW0RUeCRcSCEjNiQiLydwMGwmKmYkKSkhIzU3JDckJCIwUlouQ2gkXEghIzckIi9EKWZ5R0klKSkhIzU3JCQiLyVbRFR4JFxIISM2JCIvJ3AwbCYqZiQpKSEjNTckNyQkIjBSWi5DaCRcSCEjNyQiL0QpZnlHSSUpKSEjNTckJCIwJCpwWScpWyRcSCEjNyQiMCMqWydReF9bKSkhIzY3JDckJCItJzQmSExcSCEiKiQiMCgzbk8kcGEmKSkhIzY3JCQiMCQqcFknKVskXEghIzckIjAjKlsnUXhfWykpISM2NyQ3JCQiLSc0JkhMXEghIiokIjAoM25PJHBhJikpISM2NyQkIjBOTiM0L0tcSCEjNyQiMFE2LmBmNScpKSEjNjckNyQkIjAlKilwYFpJXEghIzckIjBCZnQpKTR6JykpISM2NyQkIjBOTiM0L0tcSCEjNyQiMFE2LmBmNScpKSEjNjckNyQkIjAlKilwYFpJXEghIzckIjBCZnQpKTR6JykpISM2NyQkIjBvJVxZP0hcSCEjNyQiMEpiWi0iZnQpKSEjNjckNyQkIjAoSEpZbUZcSCEjNyQiMGZaIVEvTiEpKSkhIzY3JCQiMG8lXFk/SFxIISM3JCIwSmJaLSJmdCkpISM2NyQ3JCQiMChISlltRlxIISM3JCIwZlohUS9OISkpKSEjNjckJCIwcCUqb3hqI1xIISM3JCIwOlswQUFoKSkpISM2NyQ3JCQiMGQuJEgnWyNcSCEjNyQiMCZmdCkpNHojKikpISM2NyQkIjBwJSpveGojXEghIzckIjA6WzBBQWgpKSkhIzY3JDckJCIwZC4kSCdbI1xIISM3JCIwJmZ0KSk0eiMqKSkhIzY3JCQiMGUoKSkpZk4jXEghIzckIjAmR2xBSmwpKikpISM2NyQ3JCQiL3QmPnE/I1xIISM2JCIwSkMlUjpCMCopISM2NyQkIjBlKCkpKWZOI1xIISM3JCIwJkdsQUpsKSopKSEjNjckNyQkIi90Jj5xPyNcSCEjNiQiMEpDJVI6QjAqKSEjNjckJCIwQUlDXjIjXEghIzckIjBzMjd0JD02KikhIzY3JDckJCIwKjMsbEc+XEghIzckIjBuNyw0c3ciKikhIzY3JCQiMEFJQ14yI1xIISM3JCIwczI3dCQ9NiopISM2NyQ3JCQiMCozLGxHPlxIISM3JCIwbjcsNHN3IiopISM2NyQkIjB6XyM9JnoiXEghIzckIjBaclEvOVAjKikhIzY3JDckJCIvZVI9XjtcSCEjNiQiMC4sM2s3LCQqKSEjNjckJCIwel8jPSZ6IlxIISM3JCIwWnJRLzlQIyopISM2NyQ3JCQiL2VSPV47XEghIzYkIjAuLDNrNywkKikhIzY3JCQiMGBRYmheIlxIISM3JCIwJ0hFalNDTyopISM2NyQ3JCQiMCgpKnpmdThcSCEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMGBRYmheIlxIISM3JCIwJ0hFalNDTyopISM2NyQ3JCQiMCgpKnpmdThcSCEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMC0hPS9RN1xIISM3JCIwb0UoKnl0KFsqKSEjNjckNyQkIjBCc0AqKTQiXEghIzckIjB3eEB1JCpcJiopISM2NyQkIjAtIT0vUTdcSCEjNyQiMG9FKCp5dChbKikhIzY3JDckJCIwQnNAKik0IlxIISM3JCIwd3hAdSQqXCYqKSEjNjckJCIvZjolMyc0XEghIzYkIjA0SkxBLjgnKikhIzY3JDckJCIwTkFLVCMzXEghIzckIjA3bUdITXUnKikhIzY3JCQiL2Y6JTMnNFxIISM2JCIwNEpMQS44JyopISM2NyQ3JCQiME5BS1QjM1xIISM3JCIwN21HSE11JyopISM2NyQkIjBKSFlYbyFcSCEjNyQiMGJmbk9LUSgqKSEjNjckNyQkIjAvJClHLWIhXEghIzckIjBbYU4lWygpeiopISM2NyQkIjBKSFlYbyFcSCEjNyQiMGJmbk9LUSgqKSEjNjckNyQkIjAvJClHLWIhXEghIzckIjBbYU4lWygpeiopISM2NyQkIjBHNGoiNC9cSCEjNyQiMGVReEBoaikqKSEjNjckNyQkIjA5cT1zRiFcSCEjNyQiMCVHQyVSOkIqKikhIzY3JCQiMEc0aiI0L1xIISM3JCIwZVF4QGhqKSopISM2NyQ3JCQiMDlxPXNGIVxIISM3JCIwJUdDJVI6QioqKSEjNjckJCIwTWAicE0sXEghIzckIjBRL2t4KikpKSoqKSEjNjckNyQkIjAsWyxeKyFcSCEjNyQiLzckXCVmdi8hKiEjNTckJCIwTWAicE0sXEghIzckIjBRL2t4KikpKSoqKSEjNjckNyQkIjAsWyxeKyFcSCEjNyQiLzckXCVmdi8hKiEjNTckJCIwYDU6NicpKltIISM3JCIwbl0hWyE9OSwqISM2NyQ3JCQiMDR1Z1F0KltIISM3JCIwYz5jXCc+PCEqISM2NyQkIjBgNTo2JykqW0ghIzckIjBuXSFbIT05LCohIzY3JDckJCIwNHVnUXQqW0ghIzckIjBjPmNcJz48ISohIzY3JCQiMEAwXCUpZSpbSCEjNyQiMGsqeUZnJVItKiEjNjckNyQkIjBILDBOWSpbSCEjNyQiMCN6SVlxakghKiEjNjckJCIwQDBcJSllKltIISM3JCIwayp5RmclUi0qISM2NyQ3JCQiMEgsME5ZKltIISM3JCIwI3pJWXFqSCEqISM2NyQkIjAlUXpuOyQqW0ghIzckIjBkcTBzdGsuKiEjNjckNyQkIjBXb0tTPipbSCEjNyQiMEgnKnBmeD8vKiEjNjckJCIwJVF6bjskKltIISM3JCIwZHEwc3RrLiohIzY3JDckJCIwV29LUz4qW0ghIzckIjBIJypwZng/LyohIzY3JCQiMDhPO2UvKltIISM3JCIwLTg8NywhXCEqISM2NyQ3JCQiMEAoW1dEKilbSCEjNyQiMGwlb1oiPVgwKiEjNjckJCIwOE87ZS8qW0ghIzckIjAtODw3LCFcISohIzY3JDckJCIwQChbV0QqKVtIISM3JCIwbCVvWiI9WDAqISM2NyQkIi9MLyVleClbSCEjNiQiMFl3KVEjRzoxKiEjNjckNyQkIi8yNnRkJylbSCEjNiQiMCx0JClwZXAxKiEjNjckJCIvTC8lZXgpW0ghIzYkIjBZdylRI0c6MSohIzY3JDckJCIvMjZ0ZCcpW0ghIzYkIjAsdCQpcGVwMSohIzY3JCQiL1FXdzEmKVtIISM2JCIwayFbbl0wdSEqISM2NyQ3JCQiMFdoIyozUilbSCEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiL1FXdzEmKVtIISM2JCIwayFbbl0wdSEqISM2NyQ3JCQiMFdoIyozUilbSCEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiMHhJImVRIylbSCEjNyQiMDAjejQ7ZSczKiEjNjckNyQkIjBISU5cNylbSCEjNyQiMHRcKCp6Uj00KiEjNjckJCIweEkiZVEjKVtIISM3JCIwMCN6NDtlJzMqISM2NyQ3JCQiMEhJTlw3KVtIISM3JCIwdFwoKnpSPTQqISM2NyQkIi8vIilHcnpbSCEjNiQiMCRHdm15NSo0KiEjNjckNyQkIjAuaVYpZnlbSCEjNyQiMDRRL04hRy8iKiEjNjckJCIvLyIpR3J6W0ghIzYkIjAkR3ZteTUqNCohIzY3JDckJCIwLmlWKWZ5W0ghIzckIjA0US9OIUcvIiohIzY3JCQiMDxgJylbcShbSCEjNyQiMEo7eSRRajYiKiEjNjckNyQkIjAmb2RpJmYoW0ghIzckIjBYRTYhNHM7IiohIzY3JCQiMDxgJylbcShbSCEjNyQiMEo7eSRRajYiKiEjNjckNyQkIjAmb2RpJmYoW0ghIzckIjBYRTYhNHM7IiohIzY3JCQiMEM9dyRSdVtIISM3JCIwVzhKX2ZUNyohIzY3JDckJCIwblh2QUwoW0ghIzckIjAiWyI9WGgiSCIqISM2NyQkIjBDPXckUnVbSCEjNyQiMFc4Sl9mVDcqISM2NyQ3JCQiMG5YdkFMKFtIISM3JCIwIlsiPVhoIkgiKiEjNjckJCIwRmxUWjwoW0ghIzckIjBFJGVGXG9PIiohIzY3JDckJCIwPUgmenBxW0ghIzckIjA9LkQrLTs5KiEjNjckJCIwRmxUWjwoW0ghIzckIjBFJGVGXG9PIiohIzY3JDckJCIwPUgmenBxW0ghIzckIjA9LkQrLTs5KiEjNjckJCIwJmVMKzZwW0ghIzckIjBeelkvNSNcIiohIzY3JDckJCIwKkh4PTNvW0ghIzckIjBhIj5gRC9hIiohIzY3JCQiMCZlTCs2cFtIISM3JCIwXnpZLzUjXCIqISM2NyQ3JCQiMCpIeD0zb1tIISM3JCIwYSI+YEQvYSIqISM2NyQkIi8lZlgiW21bSCEjNiQiMDtRJXpbdGgiKiEjNjckNyQkIjAxYVB1YSdbSCEjNyQiLyp6UTUkW20iKiEjNTckJCIvJWZYIlttW0ghIzYkIjA7USV6W3RoIiohIzY3JDckJCIwMWFQdWEnW0ghIzckIi8qelE1JFttIiohIzU3JCQiMFQuaWhRJ1tIISM3JCIwTSgpUVZmVTwqISM2NyQ3JCQiMD4kKlx2RydbSCEjNyQiMEVvWGxCKnkiKiEjNjckJCIwVC5paFEnW0ghIzckIjBNKClRVmZVPCohIzY3JDckJCIwPiQqXHZHJ1tIISM3JCIwRW9YbEIqeSIqISM2NyQkIjAmKXpkXTcnW0ghIzckIjBYJlExUHknPSohIzY3JDckJCIwI29VX0dnW0ghIzckIjBpY18/azg+KiEjNjckJCIwJil6ZF03J1tIISM3JCIwWCZRMVB5Jz0qISM2NyQ3JCQiMCNvVV9HZ1tIISM3JCIwaWNfP2s4PiohIzY3JCQiMEZ2VFsnZVtIISM3JCIweiozJXAyJCo+KiEjNjckNyQkIjA7NmsueCZbSCEjNyQiMClcJWZ2L1E/KiEjNjckJCIwRnZUWydlW0ghIzckIjB6KjMlcDIkKj4qISM2NyQ3JCQiMDs2ay54JltIISM3JCIwKVwlZnYvUT8qISM2NyQkIjBjJSkpWzBjW0ghIzckIjAqRy4wOSQ9QCohIzY3JDckJCIwQ1JiSV4mW0ghIzckIjBNTG1JWGlAKiEjNjckJCIwYyUpKVswY1tIISM3JCIwKkcuMDkkPUAqISM2NyQ3JCQiMENSYkleJltIISM3JCIwTUxtSVhpQCohIzY3JCQiMChISi1aYFtIISM3JCIwUi06JFtOQyMqISM2NyQ3JCQiMDReNm1EJltIISM3JCIwckB0JmVvRyMqISM2NyQkIjAoSEotWmBbSCEjNyQiMFItOiRbTkMjKiEjNjckNyQkIjA0XjZtRCZbSCEjNyQiMHJAdCZlb0cjKiEjNjckJCIwUk8+JSozJltIISM3JCIvPWYiKXoob0IqISM1NyQ3JCQiMFp3NzUrJltIISM3JCIwMjUhM2s3VCMqISM2NyQkIjBSTz4lKjMmW0ghIzckIi89ZiIpeihvQiohIzU3JDckJCIwWnc3NSsmW0ghIzckIjAyNSEzazdUIyohIzY3JCQiMDEjb29LW1tIISM3JCIwI3pLXzNTXCMqISM2NyQ3JCQiMHVTdGl1JVtIISM3JCIwVilwZXBjYCMqISM2NyQkIjAxI29vS1tbSCEjNyQiMCN6S18zU1wjKiEjNjckNyQkIjB1U3RpdSVbSCEjNyQiMFYpcGVwY2AjKiEjNjckJCIwVycqPm9kJVtIISM3JCIwbCZbWE0jPkUqISM2NyQ3JCQiMC40dEJcJVtIISM3JCIweidRNHYrbSMqISM2NyQkIjBXJyo+b2QlW0ghIzckIjBsJltYTSM+RSohIzY3JDckJCIwLjR0QlwlW0ghIzckIjB6J1E0dittIyohIzY3JCQiMGhMPT1LJVtIISM3JCIwRDc3d1hXRiohIzY3JDckJCIwTTZKJFJVW0ghIzckIjA6disxWyV5IyohIzY3JCQiMGhMPT1LJVtIISM3JCIwRDc3d1hXRiohIzY3JDckJCIwTTZKJFJVW0ghIzckIjA6disxWyV5IyohIzY3JCQiL3c3cG5TW0ghIzYkIjB5N2x6bnBHKiEjNjckNyQkIjAoKj5VcilSW0ghIzckIjBeajJoKSkzSCohIzY3JCQiL3c3cG5TW0ghIzYkIjB5N2x6bnBHKiEjNjckNyQkIjAoKj5VcilSW0ghIzckIjBeajJoKSkzSCohIzY3JCQiMDo4QlciUVtIISM3JCIwPTFrYipbKkgqISM2NyQ3JCQiL2A2ek5QW0ghIzYkIjAoPVhoIkhMSSohIzY3JCQiMDo4QlciUVtIISM3JCIwPTFrYipbKkgqISM2NyQ3JCQiL2A2ek5QW0ghIzYkIjAoPVhoIkhMSSohIzY3JCQiMG45Pj9jJFtIISM3JCIwKDRAUjUsNyQqISM2NyQ3JCQiMCV5cEgmWyRbSCEjNyQiMEJTQHJwZEoqISM2NyQkIjBuOT4/YyRbSCEjNyQiMCg0QFI1LDckKiEjNjckNyQkIjAleXBIJlskW0ghIzckIjBCU0BycGRKKiEjNjckJCIvJypwWTVMW0ghIzYkIjBGeilbQWBDJCohIzY3JDckJCIwOExIY0IkW0ghIzckIi8nR0dFNSNHJCohIzU3JCQiLycqcFk1TFtIISM2JCIwRnopW0FgQyQqISM2NyQ3JCQiMDhMSGNCJFtIISM3JCIvJ0dHRTUjRyQqISM1NyQkIjA7L3koZklbSCEjNyQiMCV5dyI9YHFMKiEjNjckNyQkIjBFMThvKUhbSCEjNyQiMCdwXjgzbFMkKiEjNjckJCIwOy95KGZJW0ghIzckIjAleXciPWBxTCohIzY3JDckJCIwRTE4bylIW0ghIzckIjAncF44M2xTJCohIzY3JCQiMCMqb1gqNEdbSCEjNyQiMDYiKipSUWRcJCohIzY3JDckJCIwbClIJClRRltIISM3JCIwSzBVTyI0YCQqISM2NyQkIjAjKm9YKjRHW0ghIzckIjA2IioqUlFkXCQqISM2NyQ3JCQiMGwpSCQpUUZbSCEjNyQiMEswVU8iNGAkKiEjNjckJCIwJ2VmKDRjI1tIISM3JCIwJCo9O0ElNGkkKiEjNjckNyQkIjA3ay48XCNbSCEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMCdlZig0YyNbSCEjNyQiMCQqPTtBJTRpJCohIzY3JDckJCIwN2suPFwjW0ghIzckIjBvJCpbIj5gbCQqISM2NyQkIjBmJjQmR0ojW0ghIzckIjB5KVFLVmh1JCohIzY3JDckJCIwSygqKVJYQVtIISM3JCIwLyNlbEMoelAqISM2NyQkIjBmJjQmR0ojW0ghIzckIjB5KVFLVmh1JCohIzY3JDckJCIwSygqKVJYQVtIISM3JCIwLyNlbEMoelAqISM2NyQkIjBDIW9kbD9bSCEjNyQiMCl6THFUOChRKiEjNjckNyQkIjAmXCRIKioqPltIISM3JCIvL0Y7SVQhUiohIzU3JCQiMEMhb2RsP1tIISM3JCIwKXpMcVQ4KFEqISM2NyQ3JCQiMCZcJEgqKio+W0ghIzckIi8vRjtJVCFSKiEjNTckJCIvPD85Pj1bSCEjNiQiMCd5OVJQbCpSKiEjNjckNyQkIjAyPihHYjxbSCEjNyQiMHdlcGNgR1MqISM2NyQkIi88Pzk+PVtIISM2JCIwJ3k5UlBsKlIqISM2NyQ3JCQiMDI+KEdiPFtIISM3JCIwd2VwY2BHUyohIzY3JCQiMGQzc05kIltIISM3JCIwWVkxLnRAVCohIzY3JDckJCIvPC1cNjpbSCEjNiQiMDdadzYlSDolKiEjNjckJCIwZDNzTmQiW0ghIzckIjBZWTEudEBUKiEjNjckNyQkIi88LVw2OltIISM2JCIwN1p3NiVIOiUqISM2NyQkIi8kUlMpRzhbSCEjNiQiMCp5T2A/cEMlKiEjNjckNyQkIjBrIWZebzdbSCEjNyQiMFxOJG9ZdEYlKiEjNjckJCIvJFJTKUc4W0ghIzYkIjAqeU9gP3BDJSohIzY3JDckJCIwayFmXm83W0ghIzckIjBcTiRvWXRGJSohIzY3JCQiMHZtZFwzIltIISM3JCIwNnNRITNAUCUqISM2NyQ3JCQiLHZqLSJbSCEiKSQiMCZRLT5fPFMlKiEjNjckJCIwdm1kXDMiW0ghIzckIjA2c1EhM0BQJSohIzY3JDckJCIsdmotIltIISIpJCIwJlEtPl88UyUqISM2NyQkIjA5MTc+JTNbSCEjNyQiMC5lZkdIKFwlKiEjNjckNyQkIjAnZmQwJnkhW0ghIzckIjBANyhwZGhfJSohIzY3JCQiMDkxNz4lM1tIISM3JCIwLmVmR0goXCUqISM2NyQ3JCQiMCdmZDAmeSFbSCEjNyQiMEA3KHBkaF8lKiEjNjckJCIwL1w5KCpmIVtIISM3JCIwaURoXFpBWSohIzY3JDckJCIwMnlsWGEhW0ghIzckIjBkKy9LY11ZKiEjNjckJCIwL1w5KCpmIVtIISM3JCIwaURoXFpBWSohIzY3JDckJCIwMnlsWGEhW0ghIzckIjBkKy9LY11ZKiEjNjckJCIwaWtcJGUuW0ghIzckIjBPJEdSYXd1JSohIzY3JDckJCIwJSkqKSoqW0khW0ghIzckIjAkKikzcm9ceCUqISM2NyQkIjBpa1wkZS5bSCEjNyQiME8kR1Jhd3UlKiEjNjckNyQkIjAlKSopKipbSSFbSCEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMFtgQnk2IVtIISM3JCIwXzBONiRHKFsqISM2NyQ3JCQiMChmNDBtK1tIISM3JCIwSHg8VVAqKlsqISM2NyQkIjBbYEJ5NiFbSCEjNyQiMF8wTjYkRyhbKiEjNjckNyQkIjAoZjQwbStbSCEjNyQiMEh4PFVQKipbKiEjNjckJCIwVikzOXkpeiVIISM3JCIwLXdzXispKlwqISM2NyQ3JCQiMFxcTCFHKXolSCEjNyQiMGxsQyh6UC0mKiEjNjckJCIwVikzOXkpeiVIISM3JCIwLXdzXispKlwqISM2NyQ3JCQiMFxcTCFHKXolSCEjNyQiMGxsQyh6UC0mKiEjNjckJCIwdXUhR1IneiVIISM3JCIwWzZ0bDxCXiohIzY3JDckJCIwdVdCM2Z6JUghIzckIjAtYUpfPVteKiEjNjckJCIwdXUhR1IneiVIISM3JCIwWzZ0bDxCXiohIzY3JDckJCIwdVdCM2Z6JUghIzckIjAtYUpfPVteKiEjNjckJCIwKFtpRSwleiVIISM3JCIwOyg+RVgkW18qISM2NyQ3JCQiMCU+NVdhJHolSCEjNyQiMFFVUTJmc18qISM2NyQkIjAoW2lFLCV6JUghIzckIjA7KD5FWCRbXyohIzY3JDckJCIwJT41V2EkeiVIISM3JCIwUVVRMmZzXyohIzY3JCQiMCUpKSpwUzt6JUghIzckIjBvPUY4XnRgKiEjNjckNyQkIjBMMmkpPSJ6JUghIzckIjB1SVhpKnBSJiohIzY3JCQiMCUpKSpwUzt6JUghIzckIjBvPUY4XnRgKiEjNjckNyQkIjBMMmkpPSJ6JUghIzckIjB1SVhpKnBSJiohIzY3JCQiMChHZHJGKnklSCEjNyQiMHhjI3B1JylcJiohIzY3JDckJCIwTUo1VCkpeSVIISM3JCIvIj5fPFNAYiohIzU3JCQiMChHZHJGKnklSCEjNyQiMHhjI3B1JylcJiohIzY3JDckJCIwTUo1VCkpeSVIISM3JCIvIj5fPFNAYiohIzU3JCQiMGMhKXlAcHklSCEjNyQiMCIpPlBhJFFpJiohIzY3JDckJCIwNCZRO10neSVIISM3JCIwWTJmcyFlayYqISM2NyQkIjBjISl5QHB5JUghIzckIjAiKT5QYSRRaSYqISM2NyQ3JCQiMDQmUTtdJ3klSCEjNyQiMFkyZnMhZWsmKiEjNjckJCIwKTROWmQleSVIISM3JCIwaUQ6TioqW2QqISM2NyQ3JCQiMCpbOy48JXklSCEjNyQiMCNlZnc3LXgmKiEjNjckJCIwKTROWmQleSVIISM3JCIwaUQ6TioqW2QqISM2NyQ3JCQiMCpbOy48JXklSCEjNyQiMCNlZnc3LXgmKiEjNjckJCIwY3YnZkIjeSVIISM3JCIwYGpPKltUKGUqISM2NyQ3JCQiLy9NciU9eSVIISM2JCIwPSVHRj1ZKmUqISM2NyQkIjBjdidmQiN5JUghIzckIjBgak8qW1QoZSohIzY3JDckJCIvL01yJT15JUghIzYkIjA9JUdGPVkqZSohIzY3JCQiMFxqTjAqelpIISM3JCIwYnNVPEkqKmYqISM2NyQ3JCQiMGZLJz5gelpIISM3JCIwYXN6UC0+ZyohIzY3JCQiMFxqTjAqelpIISM3JCIwYnNVPEkqKmYqISM2NyQ3JCQiMGZLJz5gelpIISM3JCIwYnN6UC0+ZyohIzY3JCQiMEY7LSRleFpIISM3JCIwMSsmKj1YQ2gqISM2NyQ3JCQiMGJVI1xBeFpIISM3JCIwIjRtR0hNOScqISM2NyQkIjBGOy0kZXhaSCEjNyQiMDErJio9WENoKiEjNjckNyQkIjBiVSNcQXhaSCEjNyQiMCI0bUdITTknKiEjNjckJCIwd0QkKW9feCVIISM3JCIwY1NOJSpmXGkqISM2NyQ3JCQiMDR1KWUjXHglSCEjNyQiMEZcJHpNeUUnKiEjNjckJCIwd0QkKW9feCVIISM3JCIwY1NOJSpmXGkqISM2NyQ3JCQiMDR1KWUjXHglSCEjNyQiMEZcJHpNeUUnKiEjNjckJCIwQTYiSCdIeCVIISM3JCIwZSVbS1daUCcqISM2NyQ3JCQiMCdldVxqc1pIISM3JCIwalArLkMjUicqISM2NyQkIjBBNiJIJ0h4JUghIzckIjBlJVtLV1pQJyohIzY3JDckJCIwJ2V1XGpzWkghIzckIjBqUCsuQyNSJyohIzY3JCQiMEtaN2wxeCVIISM3JCIvPGVnJykpKlwnKiEjNTckNyQkIjBEWS5fLnglSCEjNyQiMCpmcyFlaztsKiEjNjckJCIwS1o3bDF4JUghIzckIi88ZWcnKSkqXCcqISM1NyQ3JCQiMERZLl8ueCVIISM3JCIwKmZzIWVrO2wqISM2NyQkIjBtIVthUG9aSCEjNyQiMFhXJ0dFXWknKiEjNjckNyQkIjA2RDV4IW9aSCEjNyQiME45OTgwVG0qISM2NyQkIjBtIVthUG9aSCEjNyQiMFhXJ0dFXWknKiEjNjckNyQkIjA2RDV4IW9aSCEjNyQiME45OTgwVG0qISM2NyQkIjB0VSJSNG1aSCEjNyQiMCIqNGNMO11uKiEjNjckNyQkIi96OiwiZXclSCEjNiQiMHItQG9YbG4qISM2NyQkIjB0VSJSNG1aSCEjNyQiMCIqNGNMO11uKiEjNjckNyQkIi96OiwiZXclSCEjNiQiMHItQG9YbG4qISM2NyQkIjBMUWY/UXclSCEjNyQiMD09I3ooSHZvKiEjNjckNyQkIjBqJVI3YmpaSCEjNyQiMDIiektpKSopbyohIzY3JCQiMExRZj9RdyVIISM3JCIwPT0jeihIdm8qISM2NyQ3JCQiMGolUjdialpIISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwNG9EYjp3JUghIzckIjA2VW8nSC8rKCohIzY3JDckJCIwRXI/Kzh3JUghIzckIjBXek15RTlxKiEjNjckJCIwNG9EYjp3JUghIzckIjA2VW8nSC8rKCohIzY3JDckJCIwRXI/Kzh3JUghIzckIjBXek15RTlxKiEjNjckJCIwNnktKUhmWkghIzckIjAyJ1slKmViNygqISM2NyQ3JCQiMGtBNmQhZlpIISM3JCIveTtNdCdRciohIzU3JCQiMDZ5LSlIZlpIISM3JCIwMidbJSplYjcoKiEjNjckNyQkIjBrQTZkIWZaSCEjNyQiL3k7TXQnUXIqISM1NyQkIjA7NigpW3F2JUghIzckIjBjJkhqJm9dcyohIzY3JDckJCIwOSYpKj4jb3YlSCEjNyQiMDtjWyl5SUUoKiEjNjckJCIwOzYoKVtxdiVIISM3JCIwYyZIaiZvXXMqISM2NyQ3JCQiMDkmKSo+I292JUghIzckIjA7Y1speUlFKCohIzY3JCQiMCV5RnkhW3YlSCEjNyQiMClSJj4oNGVQKCohIzY3JDckJCIwOmsiW2ZhWkghIzckIjBfV2JWWyhRKCohIzY3JCQiMCV5RnkhW3YlSCEjNyQiMClSJj4oNGVQKCohIzY3JDckJCIwOmsiW2ZhWkghIzckIjBfV2JWWyhRKCohIzY3JCQiMG4pXFtkX1pIISM3JCIweCkqPjckNF0oKiEjNjckNyQkIjBzJnliUF9aSCEjNyQiMClHQicpKik9XigqISM2NyQkIjBuKVxbZF9aSCEjNyQiMHgpKj43JDRdKCohIzY3JDckJCIwcyZ5YlBfWkghIzckIjApR0InKSopPV4oKiEjNjckJCIwaEAiKVwudiVIISM3JCIwYld1LDBFdyohIzY3JDckJCIvS2VUO11aSCEjNiQiMENAcGBIT3cqISM2NyQkIjBoQCIpXC52JUghIzckIjBiV3UsMEV3KiEjNjckNyQkIi9LZVQ7XVpIISM2JCIwQ0BwYEhPdyohIzY3JCQiMHB2Jkc4W1pIISM3JCIwPjRQbDteeCohIzY3JDckJCIwLD5tZ3p1JUghIzckIi8nNHczcWd4KiEjNTckJCIwcHYmRzhbWkghIzckIjA+NFBsO154KiEjNjckNyQkIjAsPm1nenUlSCEjNyQiLyc0dzNxZ3gqISM1NyQkIjBYMiNRI2Z1JUghIzckIjBWJTRPIUd3eSohIzY3JDckJCIwaD0nXHdYWkghIzckIjAnekhRMV4peSohIzY3JCQiMFgyI1EjZnUlSCEjNyQiMFYlNE8hR3d5KiEjNjckNyQkIjBoPSdcd1haSCEjNyQiMCd6SFExXil5KiEjNjckJCIvOFpHc1ZaSCEjNiQiMHlPKmYiUiwhKSohIzY3JDckJCIwIj4iPnhOdSVIISM3JCIwTCcpKik9XjQhKSohIzY3JCQiLzhaR3NWWkghIzYkIjB5TypmIlIsISkqISM2NyQ3JCQiMCI+Ij54TnUlSCEjNyQiMEwnKSopPV40ISkqISM2NyQkIjAyTXpIOnUlSCEjNyQiMGZKKUgrbDcpKiEjNjckNyQkIjBheT8oUlRaSCEjNyQiMHB1J1I8UjgpKiEjNjckJCIwMk16SDp1JUghIzckIjBmSilIK2w3KSohIzY3JDckJCIwYXk/KFJUWkghIzckIjBwdSdSPFI4KSohIzY3JCQiMDdQbFckUlpIISM3JCIwJnAnZmtnXiMpKiEjNjckNyQkIjBObCtEI1JaSCEjNyQiMDBqLkhLZSMpKiEjNjckJCIwN1BsVyRSWkghIzckIjAmcCdma2deIykqISM2NyQ3JCQiME5sK0QjUlpIISM3JCIwMGouSEtlIykqISM2NyQkIjBPUGNucnQlSCEjNyQiMCY+KlIrcnckKSohIzY3JDckJCIwJmY6MjFQWkghIzckIjBUXjUlR0ZRKSohIzY3JCQiME9QY25ydCVIISM3JCIwJj4qUitydyQpKiEjNjckNyQkIjAmZjoyMVBaSCEjNyQiMFReNSVHRlEpKiEjNjckJCIwTiFIIykqXHQlSCEjNyQiMCZ5TTg2PV0pKiEjNjckNyQkIjAieWRTIVx0JUghIzckIjB4UjxSODImKSohIzY3JCQiME4hSCMpKlx0JUghIzckIjAmeU04Nj1dKSohIzY3JDckJCIwInlkUyFcdCVIISM3JCIweFI8UjgyJikqISM2NyQkIjAuZCRwJEd0JUghIzckIjA0aFsnNHBpKSohIzY3JDckJCIwKHAvYHZLWkghIzckIjA4R0MlUjpqKSohIzY3JCQiMC5kJHAkR3QlSCEjNyQiMDRoWyc0cGkpKiEjNjckNyQkIjAocC9gdktaSCEjNyQiMDhHQyVSOmopKiEjNjckJCIuPGAkb0laSCEjNSQiMCVvU2owP3YpKiEjNjckNyQkIjBvRko5MXQlSCEjNyQiMFw7SlwlZnYpKiEjNjckJCIuPGAkb0laSCEjNSQiMCVvU2owP3YpKiEjNjckNyQkIjBvRko5MXQlSCEjNyQiMFw7SlwlZnYpKiEjNjckJCIwXypveWBHWkghIzckIi5MUCIqNHgpKSohIio3JDckJCIwaCFSNFtHWkghIzckIjAnWyFRL04hKSkpKiEjNjckJCIwXypveWBHWkghIzckIi5MUCIqNHgpKSohIio3JDckJCIwaCFSNFtHWkghIzckIjAnWyFRL04hKSkpKiEjNjckJCIwWGZCK2tzJUghIzckIjBUKmUxIT4tISoqISM2NyQ3JCQiMGtDWWJqcyVIISM3JCIwQSRcJWZ2LyEqKiEjNjckJCIwWGZCK2tzJUghIzckIjBUKmUxIT4tISoqISM2NyQ3JCQiMGtDWWJqcyVIISM3JCIwQSRcJWZ2LyEqKiEjNjckJCIwYlZMcVVzJUghIzckIjBsVDomeXM3KiohIzY3JDckJCIvbyRmUFVzJUghIzYkIjBlIj1YaCJIIioqISM2NyQkIjBiVkxxVXMlSCEjNyQiMGxUOiZ5czcqKiEjNjckNyQkIi9vJGZQVXMlSCEjNiQiMGUiPVhoIkgiKiohIzY3JCQiMCg0MiRbQHMlSCEjNyQiMEIyU1dPXyMqKiEjNjckNyQkIjBbJ291N0FaSCEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMCg0MiRbQHMlSCEjNyQiMEIyU1dPXyMqKiEjNjckNyQkIjBbJ291N0FaSCEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMG8jKipSLj9aSCEjNyQiMDNgKil5V3gkKiohIzY3JDckJCIwKVxTXC0/WkghIzckIi8kZWxDKHpQKiohIzU3JCQiMG8jKipSLj9aSCEjNyQiMDNgKil5V3gkKiohIzY3JDckJCIwKVxTXC0/WkghIzckIi8kZWxDKHpQKiohIzU3JCQiMCdcKCp6Uj1aSCEjNyQiL2psJTRmdSUqKiEjNTckNyQkIjBcKmZ6TyVcJkghIzckIjBjdyEqUW5TI3AhIzY3JCQiMFszQ1NLXCZIISM3JCIwJlwoKnpSPUZwISM2NyQ3JCQiMFszQ1NLXCZIISM3JCIwJlwoKnpSPUZwISM2NyQkIi9ZUnNBJFwmSCEjNiQiMFlEbWI/cyNwISM2NyQ3JCQiME41KDN2KVsmSCEjNyQiMEpqMWBDJ1JwISM2NyQkIi9ZUnNBJFwmSCEjNiQiMFlEbWI/cyNwISM2NyQ3JCQiME41KDN2KVsmSCEjNyQiMEpqMWBDJ1JwISM2NyQkIjAjZSVHJ28pWyZIISM3JCIwdk0zcjEpUnAhIzY3JDckJCIwLmZSdVVbJkghIzckIjBuXjgzbD8mcCEjNjckJCIwI2UlRydvKVsmSCEjNyQiMHZNM3IxKVJwISM2NyQ3JCQiMC5mUnVVWyZIISM3JCIwbl44M2w/JnAhIzY3JCQiMEhmbGVUWyZIISM3JCIwMlh4ViNSX3AhIzY3JDckJCIwInA0MCIpemFIISM3JCIwLlM/ajBYJ3AhIzY3JCQiMEhmbGVUWyZIISM3JCIwMlh4ViNSX3AhIzY3JDckJCIwInA0MCIpemFIISM3JCIwLlM/ajBYJ3AhIzY3JCQiMHctLlcnemFIISM3JCIwXj94dXhcJ3AhIzY3JDckJCIwMHJbZmBaJkghIzckIjBSR0Y9WXAocCEjNjckJCIwdy0uVyd6YUghIzckIjBeP3h1eFwncCEjNjckNyQkIjAwcltmYFomSCEjNyQiMFJHRj1ZcChwISM2NyQkIi9zLkY5dmFIISM2JCIwJG9FSkVjeHAhIzY3JDckJCIvbE81IzRaJkghIzYkIjB2O010J1EqKXAhIzY3JCQiL3MuRjl2YUghIzYkIjAkb0VKRWN4cCEjNjckNyQkIi9sTzUjNFomSCEjNiQiMHY7TXQnUSopcCEjNjckJCIwL0ZPYTFaJkghIzckIjAyUSUpNFosKnAhIzY3JDckJCIwOWc5JlxtYUghIzckIjA2MFRHRj0rKCEjNjckJCIwL0ZPYTFaJkghIzckIjAyUSUpNFosKnAhIzY3JDckJCIwOWc5JlxtYUghIzckIjA2MFRHRj0rKCEjNjckJCIwMiEpKSp5aFkmSCEjNyQiLzEmKVw2dC1xISM1NyQ3JCQiMDdoJD4zaWFIISM3JCIwWyR6TXlFOXEhIzY3JCQiMDIhKSkqeWhZJkghIzckIi8xJilcNnQtcSEjNTckNyQkIjA3aCQ+M2lhSCEjNyQiMFskek15RTlxISM2NyQkIjAkKTRzOzxZJkghIzckIjAlPig0eTlgLCghIzY3JDckJCIwQWZFIm9kYUghIzckIjAlPVsmUTNuLSghIzY3JCQiMCQpNHM7PFkmSCEjNyQiMCU+KDR5OWAsKCEjNjckNyQkIjBBZkUib2RhSCEjNyQiMCU9WyZRM24tKCEjNjckJCIwVU9SbnNYJkghIzckIjBmKT0oKnoqeS0oISM2NyQ3JCQiMEslXEtIYGFIISM3JCIvLTxPKlsiUnEhIzU3JCQiMFVPUm5zWCZIISM3JCIwZik9KCp6KnktKCEjNjckNyQkIjBLJVxLSGBhSCEjNyQiLy08TypbIlJxISM1NyQkIi9PWjYkR1gmSCEjNiQiMFRuUnohW1NxISM2NyQ3JCQiMEt4aDwqW2FIISM3JCIwY2VvWyplXnEhIzY3JCQiL09aNiRHWCZIISM2JCIwVG5SeiFbU3EhIzY3JDckJCIwS3hoPCpbYUghIzckIjBjZW9bKmVecSEjNjckJCIwRihmd1NbYUghIzckIjBLWTs9akkwKCEjNjckNyQkIjBITllhWFcmSCEjNyQiMCNwYVArLmtxISM2NyQkIjBGKGZ3U1thSCEjNyQiMEtZOz1qSTAoISM2NyQ3JCQiMEhOWWFYVyZIISM3JCIwI3BhUCsua3EhIzY3JCQiMChIIzQoKlJXJkghIzckIjA9WF06WGMxKCEjNjckNyQkIjBNRiJRP1NhSCEjNyQiMEdOIyllcWsyKCEjNjckJCIwKEgjNCgqUlcmSCEjNyQiMD1YXTpYYzEoISM2NyQ3JCQiME1GIlE/U2FIISM3JCIwR04jKWVxazIoISM2NyQkIjAtYVQqZlJhSCEjNyQiMEQ6XnJFI3lxISM2NyQ3JCQiMGNlamxlViZIISM3JCIwa0IqUTYiKikzKCEjNjckJCIwLWFUKmZSYUghIzckIjBEOl5yRSN5cSEjNjckNyQkIjBjZWpsZVYmSCEjNyQiMGtCKlE2IiopMyghIzY3JCQiMHBmaDlfViZIISM3JCIwdnZBJ3khMzQoISM2NyQ3JCQiME9MelI6ViZIISM3JCIuNycqb144NSghIio3JCQiMHBmaDlfViZIISM3JCIwdnZBJ3khMzQoISM2NyQ3JCQiME9MelI6ViZIISM3JCIuNycqb144NSghIio3JCQiMEJsX1UzViZIISM3JCIvbio9ZylRLnIhIzU3JDckJCIwKG95akFGYUghIzckIjBPKy5DI3o4ciEjNjckJCIwQmxfVTNWJkghIzckIi9uKj1nKVEuciEjNTckNyQkIjAob3lqQUZhSCEjNyQiME8rLkMjejhyISM2NyQkIjB2JilHJFtFYUghIzckIjBiUyVIKm9mNighIzY3JDckJCIwJSopeV8jSFUmSCEjNyQiMHMpKTR6S2k3KCEjNjckJCIwdiYpRyRbRWFIISM3JCIwYlMlSCpvZjYoISM2NyQ3JCQiMCUqKXlfI0hVJkghIzckIjBzKSk0ektpNyghIzY3JCQiMCV6TW44QWFIISM3JCIvRkZdKVsmR3IhIzU3JDckJCIwW3lYTyc9YUghIzckIjAzeDtNdCdRciEjNjckJCIwJXpNbjhBYUghIzckIi9GRl0pWyZHciEjNTckNyQkIjBbeVhPJz1hSCEjNyQiMDN4O010J1FyISM2NyQkIjBDRylHIXlUJkghIzckIjBaRlFPRzY5KCEjNjckNyQkIjAqb04qZlZUJkghIzckIjBXbEIqUTZeciEjNjckJCIwQ0cpRyF5VCZIISM3JCIwWkZRT0c2OSghIzY3JDckJCIwKm9OKmZWVCZIISM3JCIwV2xCKlE2XnIhIzY3JCQiL29nO1s4YUghIzYkIjAmSFRzdXFgciEjNjckNyQkIjBtLl8mNDVhSCEjNyQiL1EwVldianIhIzU3JCQiL29nO1s4YUghIzYkIjAmSFRzdXFgciEjNjckNyQkIjBtLl8mNDVhSCEjNyQiL1EwVldianIhIzU3JCQiMFJ5Kkg8NGFIISM3JCIwXCFIeWhHbXIhIzY3JDckJCIvJ2VdVmVTJkghIzYkIjA7VVAqXCpmPCghIzY3JCQiMFJ5Kkg8NGFIISM3JCIwXCFIeWhHbXIhIzY3JDckJCIvJ2VdVmVTJkghIzYkIjA7VVAqXCpmPCghIzY3JCQiMHhPNHhbUyZIISM3JCIwOW5dWmspeXIhIzY3JDckJCIwJj43T2csYUghIzckIjBfSVdhTiUpPSghIzY3JCQiMHhPNHhbUyZIISM3JCIwOW5dWmspeXIhIzY3JDckJCIwJj43T2csYUghIzckIjBfSVdhTiUpPSghIzY3JCQiMFsiZk9mK2FIISM3JCIwLjY/UFU5PighIzY3JDckJCIweF16dnRSJkghIzckIjApKT1eNHczPyghIzY3JCQiMFsiZk9mK2FIISM3JCIwLjY/UFU5PighIzY3JDckJCIweF16dnRSJkghIzckIjApKT1eNHczPyghIzY3JCQiMFcnZkZLJ1ImSCEjNyQiMFVEcScpPlM/KCEjNjckNyQkIjAlcE4tOyRSJkghIzckIjBDMmVrO0xAKCEjNjckJCIwVydmRksnUiZIISM3JCIwVURxJyk+Uz8oISM2NyQ3JCQiMCVwTi07JFImSCEjNyQiMEMyZWs7TEAoISM2NyQkIjBOVlFrP1ImSCEjNyQiMGVkLydwZjtzISM2NyQ3JCQiMFZOIW8mKilRJkghIzckIi9jXCc+ZGRBKCEjNTckJCIwTlZRaz9SJkghIzckIjBlZC8ncGY7cyEjNjckNyQkIjBWTiFvJiopUSZIISM3JCIvY1wnPmRkQSghIzU3JCQiMFp2aj15USZIISM3JCIwSGkqW088SHMhIzY3JDckJCIwdyEpUWxaUSZIISM3JCIwJ1I9Wng+UXMhIzY3JCQiMFp2aj15USZIISM3JCIwSGkqW088SHMhIzY3JDckJCIwdyEpUWxaUSZIISM3JCIwJ1I9Wng+UXMhIzY3JCQiMHgmZl5lJFEmSCEjNyQiL0wyVypcPEMoISM1NyQ3JCQiMDtuJ2ZlIVEmSCEjNyQiMEtzeUhRMUQoISM2NyQkIjB4JmZeZSRRJkghIzckIi9MMlcqXDxDKCEjNTckNyQkIjA7bidmZSFRJkghIzckIjBLc3lIUTFEKCEjNjckJCIwaHk4ayR6YEghIzckIjBkIXlSZUthcyEjNjckNyQkIjBZaWg9a1AmSCEjNyQiMG9nJlspeUlFKCEjNjckJCIwaHk4ayR6YEghIzckIjBkIXlSZUthcyEjNjckNyQkIjBZaWg9a1AmSCEjNyQiMG9nJlspeUlFKCEjNjckJCIvT3FhOnZgSCEjNiQiMChlTlI4IXBFKCEjNjckNyQkIjB3WUJqQVAmSCEjNyQiMC9cIypSPmJGKCEjNjckJCIvT3FhOnZgSCEjNiQiMChlTlI4IXBFKCEjNjckNyQkIjB2WUJqQVAmSCEjNyQiMC9cIypSPmJGKCEjNjckJCIwWXhCZjRQJkghIzckIjBkNy1XdyV6cyEjNjckNyQkIjAjZi0pPiJvYEghIzckIi91JCpcKmZ6RyghIzU3JCQiMFl4QmY0UCZIISM3JCIwZDctV3clenMhIzY3JDckJCIwI2YtKT4ib2BIISM3JCIvdSQqXCpmekcoISM1NyQkIjBvIUdfeG1gSCEjNyQiMHdZIlw2MCNIKCEjNjckNyQkIjBWd0opKVJPJkghIzckIjB3RDFdKy9JKCEjNjckJCIwbyFHX3htYEghIzckIjB3WSJcNjAjSCghIzY3JDckJCIwVndKKSlSTyZIISM3JCIwd0QxXSsvSSghIzY3JCQiMCRSTk9naWBIISM3JCIwc04qZmFpL3QhIzY3JDckJCIvdHApbylmYEghIzYkIjA4OTgwVEdKKCEjNjckJCIwJFJOT2dpYEghIzckIjBzTipmYWkvdCEjNjckNyQkIi90cClvKWZgSCEjNiQiMDg5ODBUR0ooISM2NyQkIi9sIUhXJWVgSCEjNiQiMG8rIXkkKj48dCEjNjckNyQkIjByUTRoZE4mSCEjNyQiMFwtP2ciR0R0ISM2NyQkIi9sIUhXJWVgSCEjNiQiMG8rIXkkKj48dCEjNjckNyQkIjByUTRoZE4mSCEjNyQiMFwtP2ciR0R0ISM2NyQkIjAjRyczKEhhYEghIzckIjBRIXoxSHhIdCEjNjckNyQkIjBPUkdsO04mSCEjNyQiMCYzcF9Ac1B0ISM2NyQkIjAjRyczKEhhYEghIzckIjBRIXoxSHhIdCEjNjckNyQkIjBPUkdsO04mSCEjNyQiMCYzcF9Ac1B0ISM2NyQkIjBvTUBpLE4mSCEjNyQiMHd1LC9ZQk0oISM2NyQ3JCQiMCMpKVI3ZVpgSCEjNyQiMEB6THFpLE4oISM2NyQkIjBvTUBpLE4mSCEjNyQiMHd1LC9ZQk0oISM2NyQ3JCQiMCMpKVI3ZVpgSCEjNyQiMEB6THFpLE4oISM2NyQkIjBNN1RSZ00mSCEjNyQiMCk9Xyd5PVxOKCEjNjckNyQkIjBGdjM0Tk0mSCEjNyQiMGRuU0QuRU8oISM2NyQkIjBNN1RSZ00mSCEjNyQiMCk9Xyd5PVxOKCEjNjckNyQkIjBGdjM0Tk0mSCEjNyQiMGRuU0QuRU8oISM2NyQkIjBbKSl6Rz5NJkghIzckIjBRMj85IlxudCEjNjckNyQkIjAlem4mWyVSYEghIzckIjAkZnYvUS92dCEjNjckJCIwWykpekc+TSZIISM3JCIwUTI/OSJcbnQhIzY3JDckJCIwJXpuJlslUmBIISM3JCIwJGZ2L1EvdnQhIzY3JCQiMCc+JkhJeUwmSCEjNyQiMD5LIzRKMSFRKCEjNjckNyQkIjBmWSkpKlJOYEghIzckIjBIV2FOJVsoUSghIzY3JCQiMCc+JkhJeUwmSCEjNyQiMD5LIzRKMSFRKCEjNjckNyQkIjBmWSkpKlJOYEghIzckIjBIV2FOJVsoUSghIzY3JCQiMGRYI1J1TGBIISM3JCIwI3lUKG9NRVIoISM2NyQ3JCQiMFUsKUdPSmBIISM3JCIwbEtoIVwjKipSKCEjNjckJCIwZFgjUnVMYEghIzckIjAjeVQob01FUighIzY3JDckJCIwVSwpR09KYEghIzckIjBsS2ghXCMqKlIoISM2NyQkIjBBOF9wJ0hgSCEjNyQiMFZ1PSllPzB1ISM2NyQ3JCQiMDkncHZMRmBIISM3JCIwLEBvWGxCVCghIzY3JCQiMEE4X3AnSGBIISM3JCIwVnU9KWU/MHUhIzY3JDckJCIwOSdwdkxGYEghIzckIjAsQG9YbEJUKCEjNjckJCIwM3VBMmNLJkghIzckIi86MClvd3hUKCEjNTckNyQkIjBwKT5SS0JgSCEjNyQiMFA0disxW1UoISM2NyQkIjAzdUEyY0smSCEjNyQiLzowKW93eFQoISM1NyQ3JCQiMHApPlJLQmBIISM3JCIwUDR2KzFbVSghIzY3JCQiMFV0KG9iQGBIISM3JCIwKVtENnJNSXUhIzY3JDckJCIwc2wmPUs+YEghIzckIjB0KD5lbENQdSEjNjckJCIwVXQob2JAYEghIzckIjApW0Q2ck1JdSEjNjckNyQkIjBzbCY9Sz5gSCEjNyQiMHQoPmVsQ1B1ISM2NyQkIjBjJUgmPXZKJkghIzckIjA7OSdcciJIVyghIzY3JDckJCIwJ1xSOUw6YEghIzckIjA0JykpM3JvXHUhIzY3JCQiMGMlSCY9dkomSCEjNyQiMDs5J1xyIkhXKCEjNjckNyQkIjAnXFI5TDpgSCEjNyQiMDQnKSkzcm9cdSEjNjckJCIwS181I1w4YEghIzckIi5aYyFvW2J1ISIqNyQ3JCQiMEY3Zl84SiZIISM3JCIwWHUmZnc3aXUhIzY3JCQiMEtfNSNcOGBIISM3JCIuWmMhb1tidSEiKjckNyQkIjBGN2ZfOEomSCEjNyQiMFh1JmZ3N2l1ISM2NyQkIjA8aW14JTRgSCEjNyQiMCMqenQyYyFvdSEjNjckNyQkIjAib3VgUTJgSCEjNyQiMCJHRTUjb1haKCEjNjckJCIwPGlteCU0YEghIzckIjAjKnp0MmMhb3UhIzY3JDckJCIwIm91YFEyYEghIzckIjAiR0U1I29YWighIzY3JCQiMEFnMHZhSSZIISM3JCIwVkYpcFxpIVsoISM2NyQ3JCQiMEh1YkhNSSZIISM3JCIwPF40dzNxWyghIzY3JCQiMEFnMHZhSSZIISM3JCIwVkYpcFxpIVsoISM2NyQ3JCQiMEh1YkhNSSZIISM3JCIwPF40dzNxWyghIzY3JCQiMCx2RCVbLGBIISM3JCIwTFJOWyQ+JFwoISM2NyQ3JCQiMCw3RyZbKkgmSCEjNyQiMGBSO0pcJSpcKCEjNjckJCIwLHZEJVssYEghIzckIjBMUk5bJD4kXCghIzY3JDckJCIwLDdHJlsqSCZIISM3JCIwYFI7SlwlKlwoISM2NyQkIjAtJlJgXShIJkghIzckIjAwM2poaGRdKCEjNjckNyQkIjAlb2hDYiZIJkghIzckIjAqeUtpKSopPV4oISM2NyQkIjAtJlJgXShIJkghIzckIjAwM2poaGRdKCEjNjckNyQkIjAlb2hDYiZIJkghIzckIjAqeUtpKSopPV4oISM2NyQkIjB0cThRTkgmSCEjNyQiMG5BTVBIJD12ISM2NyQ3JCQiMGprM0o7SCZIISM3JCIwRDtJVElWXyghIzY3JCQiMHRxOFFOSCZIISM3JCIwbkFNUEgkPXYhIzY3JDckJCIwamszSjtIJkghIzckIjBEO0lUSVZfKCEjNjckJCIwUEsoR2UqRyZIISM3JCIwN0t4dScqM2AoISM2NyQ3JCQiMCJlSjdzKEcmSCEjNyQiMGgvUCc0eE92ISM2NyQkIjBQSyhHZSpHJkghIzckIjA3S3h1JyozYCghIzY3JDckJCIwImVKN3MoRyZIISM3JCIwaC9QJzR4T3YhIzY3JCQiL3dBI1JjRyZIISM2JCIwemsnXFBZVnYhIzY3JDckJCIwYSlbRSNRRyZIISM3JCIwKEhSOTpAXHYhIzY3JCQiL3dBI1JjRyZIISM2JCIwemsnXFBZVnYhIzY3JDckJCIwYSlbRSNRRyZIISM3JCIwKEhSOTpAXHYhIzY3JCQiMEh5TDI8RyZIISM3JCIwJTRNdS4uY3YhIzY3JDckJCIwKVwiXE4qel9IISM3JCIwTCIzbD9saHYhIzY3JCQiMEh5TDI8RyZIISM3JCIwJTRNdS4uY3YhIzY3JDckJCIwKVwiXE4qel9IISM3JCIwTCIzbD9saHYhIzY3JCQiMCM9RXJ5eF9IISM3JCIvKj1aaSdmb3YhIzU3JDckJCIwJ2ZvJ2ZnRiZIISM3JCIwcHBkaCM0dXYhIzY3JCQiMCM9RXJ5eF9IISM3JCIvKj1aaSdmb3YhIzU3JDckJCIwJ2ZvJ2ZnRiZIISM3JCIwcHBkaCM0dXYhIzY3JCQiMCNwaid5UUYmSCEjNyQiMHlsJClcaTZlKCEjNjckNyQkIjAjPiM+Jj5zX0ghIzckIjAxZWs7TGxlKCEjNjckJCIwI3BqJ3lRRiZIISM3JCIweWwkKVxpNmUoISM2NyQ3JCQiMCM+Iz4mPnNfSCEjNyQiMDFlaztMbGUoISM2NyQkIjAqeiw8KSpwX0ghIzckIjBrXksrR1BmKCEjNjckNyQkIjBPNyxVJG9fSCEjNyQiMFRZcnJ0KilmKCEjNjckJCIwKnosPCkqcF9IISM3JCIwa15LK0dQZighIzY3JDckJCIwTzcsVSRvX0ghIzckIjBUWXJydCopZighIzY3JCQiMEZkVyc0bV9IISM3JCIwKmZ6S0pIMXchIzY3JDckJCIwZjYsK1hFJkghIzckIjB5TXlFOTloKCEjNjckJCIwRmRXJzRtX0ghIzckIjAqZnpLSkgxdyEjNjckNyQkIjBmNiwrWEUmSCEjNyQiMHlNeUU5OWgoISM2NyQkIi8yJnBBQUUmSCEjNiQiMHhDTSp5Jik9dyEjNjckNyQkIjBcPEpwMUUmSCEjNyQiMDlCJj1bJlFpKCEjNjckJCIvMiZwQUFFJkghIzYkIjB4Q00qeSYpPXchIzY3JDckJCIwXDxKcDFFJkghIzckIjA5QiY9WyZRaSghIzY3JCQiMHJaWmckZV9IISM3JCIwPlFWR0E5aighIzY3JDckJCIwUDl2XG9EJkghIzckIi86QHBgSE93ISM1NyQkIjByWlpnJGVfSCEjNyQiMD5RVkdBOWooISM2NyQ3JCQiMFA5dlxvRCZIISM3JCIvOkBwYEhPdyEjNTckJCIwT2EhKTRYRCZIISM3JCIwZHZbSScpUmsoISM2NyQ3JCQiMHQ/WlRJRCZIISM3JCIwJykqKik+ZnRbdyEjNjckJCIwT2EhKTRYRCZIISM3JCIwZHZbSScpUmsoISM2NyQ3JCQiMHQ/WlRJRCZIISM3JCIwJykqKik+ZnRbdyEjNjckJCIwVnZ0cTFEJkghIzckIi8kPU0mKlxsbCghIzU3JDckJCIwbEBOVyNcX0ghIzckIjBBKWVxazxodyEjNjckJCIwVnZ0cTFEJkghIzckIi8kPU0mKlxsbCghIzU3JDckJCIwbEBOVyNcX0ghIzckIjBBKWVxazxodyEjNjckJCIwTDowVm9DJkghIzckIjBYMXFCOCJwdyEjNjckNyQkIjBuQVNlYUMmSCEjNyQiMGV3Ny08T24oISM2NyQkIjBMOjBWb0MmSCEjNyQiMFgxcUI4InB3ISM2NyQ3JCQiMG5BU2VhQyZIISM3JCIwZXc3LTxPbighIzY3JCQiMHIpW28tVl9IISM3JCIwaCdRX2huIm8oISM2NyQ3JCQiMCpbLU5vVF9IISM3JCIwJVwnPmRkZ28oISM2NyQkIjByKVtvLVZfSCEjNyQiMGgnUV9obiJvKCEjNjckNyQkIjAqWy1Ob1RfSCEjNyQiMCVcJz5kZGdvKCEjNjckJCIwUCQ0P0FSX0ghIzckIi9PVC4oUVVwKCEjNTckNyQkIjBrKilwPnpCJkghIzckIi9MbEEiKVwpcCghIzU3JCQiMFAkND9BUl9IISM3JCIvT1QuKFFVcCghIzU3JDckJCIwayopcD56QiZIISM3JCIvTGxBIilcKXAoISM1NyQkIjAwdmRHYUImSCEjNyQiMDdlJykpMyFvcSghIzY3JDckJCIwRkAkcDtNX0ghIzckIjBtVExuUTRyKCEjNjckJCIwMHZkR2FCJkghIzckIjA3ZScpKTMhb3EoISM2NyQ3JCQiMEZAJHA7TV9IISM3JCIwbVRMblE0cighIzY3JCQiMGxKXFk7QiZIISM3JCIwel0rcmkkPnghIzY3JDckJCIwKj1YX1VJX0ghIzckIjAtSVNBekxzKCEjNjckJCIwbEpcWTtCJkghIzckIjB6XStyaSQ+eCEjNjckNyQkIjAqPVhfVUlfSCEjNyQiMC1JU0F6THMoISM2NyQkIjBkR3B2eUEmSCEjNyQiMFdFJ3BUIz50KCEjNjckNyQkIjBOU18lcEVfSCEjNyQiMFE9Wng+ZXQoISM2NyQkIjBkR3B2eUEmSCEjNyQiMFdFJ3BUIz50KCEjNjckNyQkIjBOU18lcEVfSCEjNyQiMFE9Wng+ZXQoISM2NyQkIjAmW3VqNkNfSCEjNyQiMFFSNUUmW1d4ISM2NyQ3JCQiMEpjKFsoSEEmSCEjNyQiMHUxYUtnI1t4ISM2NyQkIjAmW3VqNkNfSCEjNyQiMFFSNUUmW1d4ISM2NyQ3JCQiMEpjKFsoSEEmSCEjNyQiMHUxYUtnI1t4ISM2NyQkIjA3ejZvLkEmSCEjNyQiMDNoeCpmL2R4ISM2NyQ3JCQiMHAlcGdFPl9IISM3JCIvXjR3M3FneCEjNTckJCIwN3o2by5BJkghIzckIjAzaHgqZi9keCEjNjckNyQkIjBwJXBnRT5fSCEjNyQiL140dzNxZ3ghIzU3JCQiMDN5S0ptQCZIISM3JCIwLDtvTzEncHghIzY3JDckJCIwRTdQb2JAJkghIzckIjBZJHlFOTl0eCEjNjckJCIwM3lLSm1AJkghIzckIjAsO29PMSdweCEjNjckNyQkIjBFN1BvYkAmSCEjNyQiMFkkeUU5OXR4ISM2NyQkIjBQS2kwSEAmSCEjNyQiMG49L1FtQHkoISM2NyQ3JCQiMC0jMzkpPUAmSCEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwUEtpMEhAJkghIzckIjBuPS9RbUB5KCEjNjckNyQkIjAtIzM5KT1AJkghIzckIjAjPVp4PmUmeSghIzY3JCQiMHlNPCI+NF9IISM3JCIwRFRKLkVaeighIzY3JDckJCIveHRhPzNfSCEjNiQiMD1nIkdELSl6KCEjNjckJCIweU08Ij40X0ghIzckIjBEVEouRVp6KCEjNjckNyQkIi94dGE/M19IISM2JCIwPWciR0QtKXooISM2NyQkIjBGNSV6WzBfSCEjNyQiMEMnPUVgRzJ5ISM2NyQ3JCQiMGYpby5hL19IISM3JCIwYVspeUlZNXkhIzY3JCQiMEY1JXpbMF9IISM3JCIwQyc9RWBHMnkhIzY3JDckJCIwZilvLmEvX0ghIzckIjBhWyl5SVk1eSEjNjckJCIwbWUkZXosX0ghIzckIjA0U0NFVyk+eSEjNjckNyQkIjBwXzcnKTM/JkghIzckIi9wYEhPIUgjeSEjNTckJCIwbWUkZXosX0ghIzckIjA0U0NFVyk+eSEjNjckNyQkIjBwXzcnKTM/JkghIzckIi9wYEhPIUgjeSEjNTckJCIwJ1JyWjYpPiZIISM3JCIwYXpZJUdTS3khIzY3JDckJCIwJFEjZVVzPiZIISM3JCIwRUQtPVdgJHkhIzY3JCQiMCdSclo2KT4mSCEjNyQiMGF6WSVHU0t5ISM2NyQ3JCQiMCRRI2VVcz4mSCEjNyQiMEVELT1XYCR5ISM2NyQkIi9OTVxXJT4mSCEjNiQiMC48cDFoXCV5ISM2NyQ3JCQiMCJbbCo0Tz4mSCEjNyQiMGk4NHQleVp5ISM2NyQkIi9OTVxXJT4mSCEjNiQiMC48cDFoXCV5ISM2NyQ3JCQiMCJbbCo0Tz4mSCEjNyQiMGk4NHQleVp5ISM2NyQkIjAvUzMneSE+JkghIzckIjBOcm8kKj12JnkhIzY3JDckJCIwPSFwISkpKio9JkghIzckIjApPmciR0QtJ3khIzY3JCQiMC9TMyd5IT4mSCEjNyQiME5ybyQqPXYmeSEjNjckNyQkIjA9IXAhKSkqKj0mSCEjNyQiMCk+ZyJHRC0neSEjNjckJCIwOEZPUXI9JkghIzckIjAneSgqXGsycXkhIzY3JDckJCIwQSVvcFAnPSZIISM3JCIwTSFIS2Vtc3khIzY3JCQiMDhGT1FyPSZIISM3JCIwJ3koKlxrMnF5ISM2NyQ3JCQiMEElb3BQJz0mSCEjNyQiME0hSEtlbXN5ISM2NyQkIjAwdmcsTj0mSCEjNyQiMEVpOWhMRSl5ISM2NyQ3JCQiMHJzYHdGPSZIISM3JCIvKHlIUTFeKXkhIzU3JCQiMDB2ZyxOPSZIISM3JCIwRWk5aExFKXkhIzY3JDckJCIwcnNgd0Y9JkghIzckIi8oeUhRMV4peSEjNTckJCIwWyIzZSgpel5IISM3JCIwZl87VSE+Jip5ISM2NyQ3JCQiMEhrdyc9el5IISM3JCIwMW5PJHBhKCp5ISM2NyQkIjBbIjNlKCl6XkghIzckIjBmXztVIT4mKnkhIzY3JDckJCIwSGt3Jz16XkghIzckIjAxbk8kcGEoKnkhIzY3JCQiMFImejVFd15IISM3JCIwdGtvKG91MnohIzY3JDckJCIwdTR4MmM8JkghIzckIjBWYlZbKCkqNHohIzY3JCQiMFImejVFd15IISM3JCIwdGtvKG91MnohIzY3JDckJCIwdTR4MmM8JkghIzckIjBWYlZbKCkqNHohIzY3JCQiMDQjKkdkRTwmSCEjNyQiMEJZOClIST96ISM2NyQ3JCQiMD5bUlI/PCZIISM3JCIwelZdLkdDI3ohIzY3JCQiMDQjKkdkRTwmSCEjNyQiMEJZOClIST96ISM2NyQ3JCQiMD5bUlI/PCZIISM3JCIwelZdLkdDI3ohIzY3JCQiMHVCU2shcF5IISM3JCIwWzdpdGVHJHohIzY3JDckJCIvRWQ7W29eSCEjNiQiMDpLZGVvWyR6ISM2NyQkIjB1QlNrIXBeSCEjNyQiMFs3aXRlRyR6ISM2NyQ3JCQiL0VkO1tvXkghIzYkIjA6S2Rlb1skeiEjNjckJCIwQXJJI1tsXkghIzckIjAkPTBYVFRYeiEjNjckNyQkIi8pNFVNXDsmSCEjNiQiMF4/azg0dCV6ISM2NyQkIjBBckkjW2xeSCEjNyQiMCQ9MFhUVFh6ISM2NyQ3JCQiLyk0VU1cOyZIISM2JCIwXj9rODR0JXohIzY3JCQiMDAwRDY+OyZIISM3JCIwbVUqKj5weiZ6ISM2NyQ3JCQiMFsyInpSaF5IISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjAwMEQ2PjsmSCEjNyQiMG1VKio+cHomeiEjNjckNyQkIjBbMiJ6UmheSCEjNyQiMCgpM3JvXChmeiEjNjckJCIvOlU0TmVeSCEjNiQiMHImPjVSX3F6ISM2NyQ3JCQiMDNRJz0oeTomSCEjNyQiMEIoelAtPnN6ISM2NyQkIi86VTROZV5IISM2JCIwciY+NVJfcXohIzY3JDckJCIwM1EnPSh5OiZIISM3JCIwQih6UC0+c3ohIzY3JCQiMClcMDohWzomSCEjNyQiMCZHJj1GeUkpeiEjNjckNyQkIjAtT1NjVjomSCEjNyQiMGYmWyl5SVkpeiEjNjckJCIwKVwwOiFbOiZIISM3JCIwJkcmPUZ5SSl6ISM2NyQ3JCQiMC1PU2NWOiZIISM3JCIwZiZbKXlJWSl6ISM2NyQkIjB6Kip6aTc6JkghIzckIjBUQCUqR0tjKnohIzY3JDckJCIwQiozOSYzOiZIISM3JCIwJlI8UjgyKCp6ISM2NyQkIjB6Kip6aTc6JkghIzckIjBUQCUqR0tjKnohIzY3JDckJCIwQiozOSYzOiZIISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBfIW9cdFpeSCEjNyQiMFxMJGVmPTMhKSEjNjckNyQkIi8oKnBwTlpeSCEjNiQiMEppKSopPV40ISkhIzY3JCQiMF8hb1x0Wl5IISM3JCIwXEwkZWY9MyEpISM2NyQ3JCQiLygqcHBOWl5IISM2JCIwSmkpKik9XjQhKSEjNjckJCIvZkt5QFdeSCEjNiQiMGVvVUdSMi0pISM2NyQ3JCQiMEspeUgoUTkmSCEjNyQiMG5dMFdfPi0pISM2NyQkIi9mS3lAV15IISM2JCIwZW9VR1IyLSkhIzY3JDckJCIwSyl5SChROSZIISM3JCIwbl0wV18+LSkhIzY3JCQiMHhPYjYyOSZIISM3JCIvUDRpQUhMISkhIzU3JDckJCIwcFFgKlJTXkghIzckIjAuUjcqSFJNISkhIzY3JCQiMHhPYjYyOSZIISM3JCIvUDRpQUhMISkhIzU3JDckJCIwcFFgKlJTXkghIzckIjAuUjcqSFJNISkhIzY3JCQiLyhvImVAUF5IISM2JCIwRyIqPSFcJWUvKSEjNjckNyQkIjBFak5PcDgmSCEjNyQiMFJGPmFMby8pISM2NyQkIi8obyJlQFBeSCEjNiQiMEciKj0hXCVlLykhIzY3JDckJCIwRWpOT3A4JkghIzckIjBSRj5hTG8vKSEjNjckJCIwJylSdklQOCZIISM3JCIwck0lKj4oUmUhKSEjNjckNyQkIjAmUSllJFtMXkghIzckIjB2OkU0dSNmISkhIzY3JCQiMCcpUnZJUDgmSCEjNyQiMHJNJSo+KFJlISkhIzY3JDckJCIwJlEpZSRbTF5IISM3JCIwdjpFNHUjZiEpISM2NyQkIjBQKG9qREleSCEjNyQiMCNcZ2EiXDQyKSEjNjckNyQkIjBAOEFUKzgmSCEjNyQiMDYvTGs5PDIpISM2NyQkIjBQKG9qREleSCEjNyQiMCNcZ2EiXDQyKSEjNjckNyQkIjBAOEFUKzgmSCEjNyQiMDYvTGs5PDIpISM2NyQkIjAkUl5FekVeSCEjNyQiMCNScm4yXSQzKSEjNjckNyQkIjB1JlEjNG03JkghIzckIjBaIypSPmJUMykhIzY3JCQiMCRSXkV6RV5IISM3JCIwI1JybjJdJDMpISM2NyQ3JCQiMHUmUSM0bTcmSCEjNyQiMFojKlI+YlQzKSEjNjckJCIwMGNlUkw3JkghIzckIjAlZkdSPzAnNCkhIzY3JDckJCIvWk53PUJeSCEjNiQiMCQzb1dkZic0KSEjNjckJCIwMGNlUkw3JkghIzckIjAlZkdSPzAnNCkhIzY3JDckJCIvWk53PUJeSCEjNiQiMCQzb1dkZic0KSEjNjckJCIwPSo9cSopPl5IISM3JCIwTzRVKEhnMyIpISM2NyQ3JCQiMG9wRXcoPl5IISM3JCIwPnBgSE8hNCIpISM2NyQkIjA9Kj1xKik+XkghIzckIjBPNFUoSGczIikhIzY3JDckJCIwb3BFdyg+XkghIzckIjA+cGBITyE0IikhIzY3JCQiMHhRNGxrNiZIISM3JCIwYzh6Y2A2NykhIzY3JDckJCIwVidmX1A7XkghIzckIjBiZGclb1pAIikhIzY3JCQiMHhRNGxrNiZIISM3JCIwYzh6Y2A2NykhIzY3JDckJCIwVidmX1A7XkghIzckIjBiZGclb1pAIikhIzY3JCQiMG1oa1ZJNiZIISM3JCIwQm5jI1FxTCIpISM2NyQ3JCQiMG8ocFcpSDYmSCEjNyQiMCJmdSdSPFI4KSEjNjckJCIwbWhrVkk2JkghIzckIjBCbmMjUXFMIikhIzY3JDckJCIwbyhwVylINiZIISM3JCIwImZ1J1I8UjgpISM2NyQkIjBRR25LJzReSCEjNyQiMClbY1pQRFkiKSEjNjckNyQkIjB4QilRZzReSCEjNyQiMEZNdSV6TlkiKSEjNjckJCIwUUduSyc0XkghIzckIjApW2NaUERZIikhIzY3JDckJCIweEIpUWc0XkghIzckIjBGTXUlek5ZIikhIzY3JCQiMEEoeUhRMV5IISM3JCIwKTMiemtZI2UiKSEjNjckNyQkIjB2NiVITiMpZUghIzckIjBOLkpLdlknZiEjNjckJCIwZkl1KkchKWVIISM3JCIvNyhwZGgjcGYhIzU3JDckJCIwZkl1KkchKWVIISM3JCIvNyhwZGgjcGYhIzU3JCQiMFZQMGctKWVIISM3JCIwLSVSJW9HJHBmISM2NyQ3JCQiMDRxRDNaKGVIISM3JCIwY2Z3Ny08KWYhIzY3JCQiMFZQMGctKWVIISM3JCIwLSVSJW9HJHBmISM2NyQ3JCQiMDRxRDNaKGVIISM3JCIwY2Z3Ny08KWYhIzY3JCQiMHBVYSlmdWVIISM3JCIwQ1cnbzImPilmISM2NyQ3JCQiMDZzRVUicGVIISM3JCIwI3pNeUU5JSpmISM2NyQkIjBwVWEpZnVlSCEjNyQiMENXJ28yJj4pZiEjNjckNyQkIjA2c0VVInBlSCEjNyQiMCN6TXlFOSUqZiEjNjckJCIwMjQ8YCpvZUghIzckIi95XE5CZCUqZiEjNTckNyQkIjBCZXYiZmplSCEjNyQiMEdPIUhLZTFnISM2NyQkIjAyNDxgKm9lSCEjNyQiL3lcTkJkJSpmISM1NyQ3JCQiMEJldiJmamVIISM3JCIwR08hSEtlMWchIzY3JCQiMCU0OlJLamVIISM3JCIwKCpcYlEkPjJnISM2NyQ3JCQiMHlCJm8wZWVIISM3JCIwa0MoelAtPmchIzY3JCQiMCU0OlJLamVIISM3JCIwKCpcYlEkPjJnISM2NyQ3JCQiMHlCJm8wZWVIISM3JCIwa0MoelAtPmchIzY3JCQiMEFmITRyZGVIISM3JCIwW2hZIlIiKT5nISM2NyQ3JCQiMDtzQ1BEJmVIISM3JCIuOC9MazkuJyEiKjckJCIwQWYhNHJkZUghIzckIjBbaFkiUiIpPmchIzY3JDckJCIwO3NDUEQmZUghIzckIi44L0xrOS4nISIqNyQkIi9yUlE2X2VIISM2JCIwbnBEJFJWS2chIzY3JDckJCIvYkZLLlplSCEjNiQiME8sNilbIVIvJyEjNjckJCIvclJRNl9lSCEjNiQiMG5wRCRSVktnISM2NyQ3JCQiL2JGSy5aZUghIzYkIjBPLDYpWyFSLychIzY3JCQiMHUnb0hgWWVIISM3JCIwUig9Sk0wWGchIzY3JDckJCIwaGNnVzolZUghIzckIjBzKnlKYU1jZyEjNjckJCIwdSdvSGBZZUghIzckIjBSKD1KTTBYZyEjNjckNyQkIjBoY2dXOiVlSCEjNyQiMHMqeUphTWNnISM2NyQkIjAzcDhvNCVlSCEjNyQiMGw4YlRzdzAnISM2NyQ3JCQiMEMzQ3JnJGVIISM3JCIwM3lDKWZ5b2chIzY3JCQiMDNwOG80JWVIISM3JCIwbDhiVHN3MCchIzY3JDckJCIwQzNDcmckZUghIzckIjAzeUMpZnlvZyEjNjckJCIwVXg9PmEkZUghIzckIjAvczAqM0hxZyEjNjckNyQkIi8iUTc4MSRlSCEjNiQiMFdtSmBFNzMnISM2NyQkIjBVeD0+YSRlSCEjNyQiMC9zMCozSHFnISM2NyQ3JCQiLyJRNzgxJGVIISM2JCIwV21KYEU3MychIzY3JCQiMEAmKTMnKSlIZUghIzckIjBqNHUmKTNIMychIzY3JDckJCIwYVtOcV4jZUghIzckIi9bJlEzbk80JyEjNTckJCIwQCYpMycpKUhlSCEjNyQiMGo0dSYpM0gzJyEjNjckNyQkIjBhW05xXiNlSCEjNyQiL1smUTNuTzQnISM1NyQkIjBfXSYqb1YjZUghIzckIjAzOEJKRWI0JyEjNjckNyQkIjB2OGxVKD5lSCEjNyQiMDtWWGoyaDUnISM2NyQkIjBfXSYqb1YjZUghIzckIjAzOEJKRWI0JyEjNjckNyQkIjB2OGxVKD5lSCEjNyQiMDtWWGoyaDUnISM2NyQkIjBXJCpcbik9ZUghIzckIjBzO1hFViIzaCEjNjckNyQkIjAlPmctTDllSCEjNyQiMGBKXz1bJj1oISM2NyQkIjBXJCpcbik9ZUghIzckIjBzO1hFViIzaCEjNjckNyQkIjAlPmctTDllSCEjNyQiMGBKXz1bJj1oISM2NyQkIjBNKm8+UThlSCEjNyQiL00zMShmMjcnISM1NyQ3JCQiMD13IUgkKjNlSCEjNyQiMCopPmZ0KSk0OCchIzY3JCQiME0qbz5ROGVIISM3JCIvTTMxKGYyNychIzU3JDckJCIwPXchSCQqM2VIISM3JCIwKik+ZnQpKTQ4JyEjNjckJCIwIipcMzd6IWVIISM3JCIwbWBma3ZMOCchIzY3JDckJCIwPCMzMmIuZUghIzckIjBEM21HSE05JyEjNjckJCIwIipcMzd6IWVIISM3JCIwbWBma3ZMOCchIzY3JDckJCIwPCMzMmIuZUghIzckIjBEM21HSE05JyEjNjckJCIwMSpHelgtZUghIzckIi95XiIzIipmOSchIzU3JDckJCIwTkdoJD0peiZIISM3JCIwaCdIUClwZTonISM2NyQkIjAxKkd6WC1lSCEjNyQiL3leIjMiKmY5JyEjNTckNyQkIjBOR2gkPSl6JkghIzckIjBoJ0hQKXBlOichIzY3JCQiMCYpM14+cXomSCEjNyQiMFxbQywxJ2VoISM2NyQ3JCQiMG1vUkpHeiZIISM3JCIwKFwpelE1JG9oISM2NyQkIjAmKTNePnF6JkghIzckIjBcW0MsMSdlaCEjNjckNyQkIjBtb1JKR3omSCEjNyQiMChcKXpRNSRvaCEjNjckJCIwLSopXCdmInomSCEjNyQiMC8jUlwvQXJoISM2NyQ3JCQiMGBpQCVcKHkmSCEjNyQiMEx0J1E0diE9JyEjNjckJCIwLSopXCdmInomSCEjNyQiMC8jUlwvQXJoISM2NyQ3JCQiMGBpQCVcKHkmSCEjNyQiMEx0J1E0diE9JyEjNjckJCIwJXkqPSo9J3kmSCEjNyQiMCczJEdRTVE9JyEjNjckNyQkIjBveitzQHkmSCEjNyQiMHBoJCpbIj4kPichIzY3JCQiMCV5Kj0qPSd5JkghIzckIjAnMyRHUU1RPSchIzY3JDckJCIwb3orc0B5JkghIzckIjBwaCQqWyI+JD4nISM2NyQkIjBaKTN1eiF5JkghIzckIjAubSQ9eVcnPichIzY3JDckJCIuIzNZJ294JkghIzUkIjAwXSsvS2M/JyEjNjckJCIwWikzdXoheSZIISM3JCIwLm0kPXlXJz4nISM2NyQ3JCQiLiMzWSdveCZIISM1JCIwMF0rL0tjPychIzY3JCQiMCcqWy1AYXgmSCEjNyQiL1Y/ZzIxNGkhIzU3JDckJCIwVSk9QGRyZEghIzckIjBUUTJmcyE9aSEjNjckJCIwJypbLUBheCZIISM3JCIvVj9nMjE0aSEjNTckNyQkIjBVKT1AZHJkSCEjNyQiMFRRMmZzIT1pISM2NyQkIjBzSzRnK3gmSCEjNyQiMDxybD90O0EnISM2NyQ3JCQiMDQleVdIbWRIISM3JCIweEU5OTgwQichIzY3JCQiMHNLNGcreCZIISM3JCIwPHJsP3Q7QSchIzY3JDckJCIwNCV5V0htZEghIzckIjB4RTk5ODBCJyEjNjckJCIwdyxmOVp3JkghIzckIjB3SCNlXkdNaSEjNjckNyQkIi9uXzkuaGRIISM2JCIwODpAcGBIQychIzY3JCQiMHcsZjladyZIISM3JCIwd0gjZV5HTWkhIzY3JDckJCIvbl85LmhkSCEjNiQiMDg6QHBgSEMnISM2NyQkIjBYc0slUWZkSCEjNyQiMCYpPjdpJypvQychIzY3JDckJCIwUUBIJHliZEghIzckIjBcLkdDJVJiaSEjNjckJCIwWHNLJVFmZEghIzckIjAmKT43aScqb0MnISM2NyQ3JCQiMFFASCR5YmRIISM3JCIwXC5HQyVSYmkhIzY3JCQiMDImZSVwU3YmSCEjNyQiMGYtMWYyJmZpISM2NyQ3JCQiMDpxIylcMHYmSCEjNyQiMCY9XCR6TXlFJyEjNjckJCIwMiZlJXBTdiZIISM3JCIwZi0xZjImZmkhIzY3JDckJCIwOnEjKVwwdiZIISM3JCIwJj1cJHpNeUUnISM2NyQkIjBGdiYpcChbZEghIzckIjAxSy8yPUBGJyEjNjckNyQkIjBEQiU0TFhkSCEjNyQiMEAhPVdgRiFHJyEjNjckJCIwRnYmKXAoW2RIISM3JCIwMUsvMj1ARichIzY3JDckJCIwREIlNExYZEghIzckIjBAIT1XYEYhRychIzY3JCQiMHIvTiZbVmRIISM3JCIwOCNHbSFHWkcnISM2NyQ3JCQiMDEzbkUsdSZIISM3JCIwZG9bKmVyI0gnISM2NyQkIjByL04mW1ZkSCEjNyQiMDgjR20hR1pHJyEjNjckNyQkIjAxM25FLHUmSCEjNyQiMGRvWyplciNIJyEjNjckJCIwLHQyOyNRZEghIzckIjAvbE9kUHRIJyEjNjckNyQkIjBiLTBQXHQmSCEjNyQiMCRwYlhrOjBqISM2NyQkIjAsdDI7I1FkSCEjNyQiMC9sT2RQdEgnISM2NyQ3JCQiMGItMFBcdCZIISM3JCIwJHBiWGs6MGohIzY3JCQiMEI2LWlIdCZIISM3JCIwXEFKZlkqNGohIzY3JDckJCIwKjRzPndIZEghIzckIjBIWGkqcGY8aiEjNjckJCIwQjYtaUh0JkghIzckIjBcQUpmWSo0aiEjNjckNyQkIjAqNHM+d0hkSCEjNyQiMEhYaSpwZjxqISM2NyQkIjBuJDNJc0ZkSCEjNyQiMCUpPi04YkRLJyEjNjckNyQkIjAqKlxPLFlzJkghIzckIjBsTHBhUCtMJyEjNjckJCIwbiQzSXNGZEghIzckIjAlKT4tOGJESychIzY3JDckJCIwKipcTyxZcyZIISM3JCIwbExwYVArTCchIzY3JCQiMGBCLSpcQWRIISM3JCIwLCNcJj1qXkwnISM2NyQ3JCQiMHpWQGIlPmRIISM3JCIwLEF3NHlDTSchIzY3JCQiMGBCLSpcQWRIISM3JCIwLCNcJj1qXkwnISM2NyQ3JCQiMHpWQGIlPmRIISM3JCIwLEF3NHlDTSchIzY3JCQiMF5rLyFIPGRIISM3JCIwQHMlZjJ4WmohIzY3JDckJCIwMmRdQlZyJkghIzckIjBQNSRbJz1cTichIzY3JCQiMF5rLyFIPGRIISM3JCIwQHMlZjJ4WmohIzY3JDckJCIwMmRdQlZyJkghIzckIjBQNSRbJz1cTichIzY3JCQiMCIza2c0N2RIISM3JCIwLiNwX3lQZ2ohIzY3JDckJCIwRipRaD80ZEghIzckIjB0KSoqKT5mdE8nISM2NyQkIjAiM2tnNDdkSCEjNyQiMC4jcF95UGdqISM2NyQ3JCQiMEYqUWg/NGRIISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwT0gocCJwcSZIISM3JCIwJj5Wb1cpSFAnISM2NyQ3JCQiMCZ6c0s1L2RIISM3JCIwNChvXCgqenpqISM2NyQkIjBPSChwInBxJkghIzckIjAmPlZvVylIUCchIzY3JDckJCIwJnpzSzUvZEghIzckIjA0KG9cKCp6emohIzY3JCQiME50Jkd2LGRIISM3JCIwSCkpUmchZiZRJyEjNjckNyQkIjBCJHBYLCpwJkghIzckIjBZdi5JU0FSJyEjNjckJCIwTnQmR3YsZEghIzckIjBIKSlSZyFmJlEnISM2NyQ3JCQiMEIkcFgsKnAmSCEjNyQiMFh2LklTQVInISM2NyQkIjBaJj1OZydwJkghIzckIjBHTGRFJz4pUichIzY3JDckJCIwZlVEU1JwJkghIzckIjAiUTFeM28vayEjNjckJCIwWiY9TmcncCZIISM3JCIwR0xkRSc+KVInISM2NyQ3JCQiMGZVRFNScCZIISM3JCIwIlExXjNvL2shIzY3JCQiL3hkKm85cCZIISM2JCIvJkdPWCwzVCchIzU3JDckJCIwTlcrISkpKW8mSCEjNyQiMDxfPFNAclQnISM2NyQkIi94ZCpvOXAmSCEjNiQiLyZHT1gsM1QnISM1NyQ3JCQiME5XKyEpKSlvJkghIzckIjA9XzxTQHJUJyEjNjckJCIwQCdcIlxqbyZIISM3JCIwJHlbb2hTQmshIzY3JDckJCIwUFg2TVFvJkghIzckIjBhU0MmPmNIayEjNjckJCIwQCdcIlxqbyZIISM3JCIwJHlbb2hTQmshIzY3JDckJCIwUFg2TVFvJkghIzckIjBhU0MmPmNIayEjNjckJCIwKSopZlRDIm8mSCEjNyQiLzo/My8sT2shIzU3JDckJCIwKWVVQiEpeWNIISM3JCIvKkdKXS0/VychIzU3JCQiMCkqKWZUQyJvJkghIzckIi86PzMvLE9rISM1NyQ3JCQiMCllVUIhKXljSCEjNyQiLypHSl0tP1cnISM1NyQkIjBFKD5ROndjSCEjNyQiMFQlPXlUaFtrISM2NyQ3JCQiMCopPXYleXRjSCEjNyQiMEU8UTBWV1gnISM2NyQkIjBFKD5ROndjSCEjNyQiMFQlPXlUaFtrISM2NyQ3JCQiMCopPXYleXRjSCEjNyQiMEU8UTBWV1gnISM2NyQkIjAmSDAieTVuJkghIzckIjAqKio+enVAaGshIzY3JDckJCIvMXU2eW9jSCEjNiQiMGkwWGckKW9ZJyEjNjckJCIwJkgwInk1biZIISM3JCIwKioqPnp1QGhrISM2NyQ3JCQiLzF1NnlvY0ghIzYkIjBpMFhnJClvWSchIzY3JCQiMDdELDxnbSZIISM3JCIwX3o4Sj9RWichIzY3JDckJCIwTSVcPHpqY0ghIzckIjApUj5iVEt6ayEjNjckJCIwN0QsPGdtJkghIzckIjBfejhKP1FaJyEjNjckNyQkIjBNJVw8empjSCEjNyQiMClSPmJUS3prISM2NyQkIi9cNDAoNG0mSCEjNiQiMFdYZG5Ba1snISM2NyQ3JCQiMHooNGoiKWVjSCEjNyQiME0jKWVxazxcJyEjNjckJCIvXDQwKDRtJkghIzYkIjBXWGRuQWtbJyEjNjckNyQkIjB6KDRqIillY0ghIzckIjBNIyllcWs8XCchIzY3JCQiMDYjNCZRZmwmSCEjNyQiL3ozdlgtKlwnISM1NyQ3JCQiMFt5eGFRbCZIISM3JCIvMmRjXz8vbCEjNTckJCIwNiM0JlFmbCZIISM3JCIvejN2WC0qXCchIzU3JDckJCIwW3l4YVFsJkghIzckIi8yZGNfPy9sISM1NyQkIjAnKUckNCM0bCZIISM3JCIwR0w+LEU7XichIzY3JDckJCIwJmZvcyEqW2NIISM3JCIwMWZzIWVrO2whIzY3JCQiMCcpRyQ0IzRsJkghIzckIjBHTD4sRTteJyEjNjckNyQkIjAmZm9zISpbY0ghIzckIjAxZnMhZWs7bCEjNjckJCIwekcqeSJmayZIISM3JCIwaXlFKXBBQ2whIzY3JDckJCIwS01rdFJrJkghIzckIjBVWnpOJzNIbCEjNjckJCIwekcqeSJmayZIISM3JCIwaXlFKXBBQ2whIzY3JDckJCIwS01rdFJrJkghIzckIjBVWnpOJzNIbCEjNjckJCIwKVtcI0g0ayZIISM3JCIwWi49XEZvYCchIzY3JDckJCIvLF9SMFJjSCEjNiQiMHlOJzNwX1RsISM2NyQkIjApW1wjSDRrJkghIzckIjBaLj1cRm9gJyEjNjckNyQkIi8sX1IwUmNIISM2JCIweU4nM3BfVGwhIzY3JCQiLyg0JlwmZmomSCEjNiQiL3AnNGFGJVxsISM1NyQ3JCQiMEhsLVtUaiZIISM3JCIwOUMkZnUnUmInISM2NyQkIi8oNCZcJmZqJkghIzYkIi9wJzRhRiVcbCEjNTckNyQkIjBIbC1bVGomSCEjNyQiMDlDJGZ1J1JiJyEjNjckJCIwbD4tJio0aiZIISM3JCIwIyl5JEhyLWlsISM2NyQ3JCQiMEdSJmZESGNIISM3JCIvRCw1ITNrYychIzU3JCQiMGw+LSYqNGomSCEjNyQiMCMpeSRIci1pbCEjNjckNyQkIjBHUiZmREhjSCEjNyQiL0QsNSEza2MnISM1NyQkIjAoKSlcJFxnaSZIISM3JCIvJFwxRUVZZCchIzU3JDckJCIwRmNueFZpJkghIzckIjAnM3FnJlspeWwhIzY3JCQiMCgpKVwkXGdpJkghIzckIi8kXDFFRVlkJyEjNTckNyQkIjBGY254VmkmSCEjNyQiMCczcWcmWyl5bCEjNjckJCIwMS4oejZAY0ghIzckIjB4UE8kXEEoZSchIzY3JDckJCIwW0gyOCY+Y0ghIzckIjBBKlE2IipHImYnISM2NyQkIjAxLih6NkBjSCEjNyQiMHhQTyRcQShlJyEjNjckNyQkIjBbSDI4Jj5jSCEjNyQiMEEqUTYiKkciZichIzY3JCQiMHVSdytpaCZIISM3JCIwKXk7X0ojKSpmJyEjNjckNyQkIjApKmY9aVloJkghIzckIjBleD9tSFBnJyEjNjckJCIwdVJ3K2loJkghIzckIjApeTtfSiMpKmYnISM2NyQ3JCQiMCkqZj1pWWgmSCEjNyQiMGV4P21IUGcnISM2NyQkIjBeJm94SDZjSCEjNyQiMC9LXSI0VTdtISM2NyQ3JCQiMGY4K0QpNGNIISM3JCIwJWZ3Ny08O20hIzY3JCQiMF4mb3hINmNIISM3JCIwL0tdIjRVN20hIzY3JDckJCIwZjgrRCk0Y0ghIzckIjAlZnc3LTw7bSEjNjckJCIwJXpvKjNrZyZIISM3JCIwMz5GQT1daSchIzY3JDckJCIwbTxZLF1nJkghIzckIi9WWGoyaEdtISM1NyQkIjAlem8qM2tnJkghIzckIjAzPkZBPV1pJyEjNjckNyQkIjBtPFksXWcmSCEjNyQiL1ZYajJoR20hIzU3JCQiMGFrSU06ZyZIISM3JCIwbSc0eF1oUG0hIzY3JDckJCIwNztnIj4rY0ghIzckIjBtVVRKXjVrJyEjNjckJCIwYWtJTTpnJkghIzckIjBtJzR4XWhQbSEjNjckNyQkIjA3O2ciPitjSCEjNyQiMG1VVEpeNWsnISM2NyQkIjApKVFldG1mJkghIzckIjA5LVhbNi1sJyEjNjckNyQkIjBYKSo0JlImZiZIISM3JCIwLUpbJz1cYG0hIzY3JCQiMCkpUWV0bWYmSCEjNyQiMDktWFs2LWwnISM2NyQ3JCQiMFgpKjQmUiZmJkghIzckIjAtSlsnPVxgbSEjNjckJCIwKltIcCM9ZiZIISM3JCIwaz0zVzJHbSchIzY3JDckJCIwZTVENzFmJkghIzckIjBRPmJUS2ZtJyEjNjckJCIwKltIcCM9ZiZIISM3JCIwaz0zVzJHbSchIzY3JDckJCIwZTVENzFmJkghIzckIjBRPmJUS2ZtJyEjNjckJCIwNmRIJSpwZSZIISM3JCIwc3F2JUhTdm0hIzY3JDckJCIwOCMpKUclZWUmSCEjNyQiMHUyaSdIUHltISM2NyQkIjA2ZEglKnBlJkghIzckIjBzcXYlSFN2bSEjNjckNyQkIjA4IykpRyVlZSZIISM3JCIwdTJpJ0hQeW0hIzY3JCQiME5xdXZAZSZIISM3JCIwJDNwLSEpKnpvJyEjNjckNyQkIjBiSzMoMyJlJkghIzckIi9oKm9eODNwJyEjNTckJCIwTnF1dkBlJkghIzckIjAkM3AtISkqem8nISM2NyQ3JCQiMGJLMygzImUmSCEjNyQiL2gqb144M3AnISM1NyQkIjBpUSgzUHhiSCEjNyQiMGE3JD5FZituISM2NyQ3JCQiMEdJXVdqZCZIISM3JCIwWSVlblNELm4hIzY3JCQiMGlRKDNQeGJIISM3JCIwYTckPkVmK24hIzY3JDckJCIwR0ldV2pkJkghIzckIjBaJWVuU0QubiEjNjckJCIwdCpmK2VzYkghIzckIjA3SV55Jz04biEjNjckNyQkIjBaRlw6O2QmSCEjNyQiMCRHRj1ZcDpuISM2NyQkIjB0KmYrZXNiSCEjNyQiMDdJXnknPThuISM2NyQ3JCQiMFpGXDo7ZCZIISM3JCIwJEdGPVlwOm4hIzY3JCQiMFFSLy55YyZIISM3JCIwPEUmMzB5RG4hIzY3JDckJCIwL2p3KipvYyZIISM3JCIwPmgqb144R24hIzY3JCQiMFFSLy55YyZIISM3JCIwPEUmMzB5RG4hIzY3JDckJCIwL2p3KipvYyZIISM3JCIwPWgqb144R24hIzY3JCQiMHdlISpSSWMmSCEjNyQiMHZKcHl0JFFuISM2NyQ3JCQiMFV3Vig+aWJIISM3JCIwYlwnPmRkU24hIzY3JCQiMHdlISpSSWMmSCEjNyQiMHZKcHl0JFFuISM2NyQ3JCQiMFV3Vig+aWJIISM3JCIwYlwnPmRkU24hIzY3JCQiMDxwXSFIZWJIISM3JCIwayp6Q20nNHYnISM2NyQ3JCQiMCh6cSQzdmImSCEjNyQiMCJ6THFpLGBuISM2NyQkIjA8cF0hSGViSCEjNyQiMGsqekNtJzR2JyEjNjckNyQkIjAoenEkM3ZiJkghIzckIjAiekxxaSxgbiEjNjckJCIvXktbYmBiSCEjNiQiMFQnZkEhZk53JyEjNjckNyQkIjBvSGJLR2ImSCEjNyQiMEZFNSNvWGxuISM2NyQkIi9eS1tiYGJIISM2JCIwVCdmQSFmTncnISM2NyQ3JCQiMG9IYktHYiZIISM3JCIwRkU1I29YbG4hIzY3JCQiMF4ib0ckKVtiSCEjNyQiMDcoeSEpNDp3biEjNjckNyQkIjAoUnIqcCJbYkghIzckIjBqOTxQKCp5eCchIzY3JCQiMF4ib0ckKVtiSCEjNyQiMDcoeSEpNDp3biEjNjckNyQkIjAoUnIqcCJbYkghIzckIjBqOTxQKCp5eCchIzY3JCQiL1EqZkNUYSZIISM2JCIwVU4pKlxVKCl5JyEjNjckNyQkIjA0UmY/TmEmSCEjNyQiMCpIU0F6TCF6JyEjNjckJCIvUSpmQ1RhJkghIzYkIjBVTikqXFUoKXknISM2NyQ3JCQiMDRSZj9OYSZIISM3JCIwKkhTQXpMIXonISM2NyQkIjBMUCoqSCVSYkghIzckIjBFI3khZUw4IW8hIzY3JDckJCIwZDRWJSkpUWJIISM3JCIwTiI0dCV5RiFvISM2NyQkIjBMUCoqSCVSYkghIzckIjBFI3khZUw4IW8hIzY3JDckJCIwZDRWJSkpUWJIISM3JCIwTiI0dCV5RiFvISM2NyQkIjBPJT4qW1pgJkghIzckIjAkSCZ5QUNSIm8hIzY3JDckJCIwd2pKaFVgJkghIzckIjByelAtPl8ibyEjNjckJCIwTyU+KltaYCZIISM3JCIwJEgmeUFDUiJvISM2NyQ3JCQiMHdqSmhVYCZIISM3JCIwcnpQLT5fIm8hIzY3JCQiMEZCTSIzSWJIISM3JCIweFVAVzlsI28hIzY3JDckJCIwTXdCXidIYkghIzckIjAyb1dkZncjbyEjNjckJCIwRkJNIjNJYkghIzckIjB4VUBXOWwjbyEjNjckNyQkIjBNd0JeJ0hiSCEjNyQiMDJvV2RmdyNvISM2NyQkIjA4NlJGYV8mSCEjNyQiMCJcXz5VNVJvISM2NyQ3JCQiMGNOS2FdXyZIISM3JCIwVmNeNyssJW8hIzY3JCQiMDg2UkZhXyZIISM3JCIwIlxfPlU1Um8hIzY3JDckJCIwY05LYV1fJkghIzckIjBWY143KywlbyEjNjckJCIwREMicHk/YkghIzckIjAsPFxjJHBebyEjNjckNyQkIjBwVVZxL18mSCEjNyQiMHpXZW5TRCZvISM2NyQkIjBEQyJweT9iSCEjNyQiMCw8XGMkcF5vISM2NyQ3JCQiMHBVVnEvXyZIISM3JCIweldlblNEJm8hIzY3JCQiMDJ1L2doXiZIISM3JCIwTyR6dENHa28hIzY3JDckJCIwdyh6JyoqZV4mSCEjNyQiMDpMbEEiKVwnbyEjNjckJCIwMnUvZ2heJkghIzckIjBPJHp0Q0drbyEjNjckNyQkIjB3KHonKiplXiZIISM3JCIwOkxsQSIpXCdvISM2NyQkIjBgOVpZOl4mSCEjNyQiMExpbCY0KG8obyEjNjckNyQkIjA9XndUOF4mSCEjNyQiMF5Ac3hAdShvISM2NyQkIjBgOVpZOl4mSCEjNyQiMExpbCY0KG8obyEjNjckNyQkIjA9XndUOF4mSCEjNyQiMF5Ac3hAdShvISM2NyQkIjBRMTxZcF0mSCEjNyQiMFBxTyxmJSopbyEjNjckNyQkIjBMeW8nejFiSCEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMFExPFlwXSZIISM3JCIwUHFPLGYlKilvISM2NyQ3JCQiMEx5byd6MWJIISM3JCIwKCk0ektpKSopbyEjNjckJCIwJVJUJWZCXSZIISM3JCIwYDdjalk/IXAhIzY3JDckJCIwY2Zya0FdJkghIzckIjBCKWZ5R0ktcCEjNjckJCIwJVJUJWZCXSZIISM3JCIwYDdjalk/IXAhIzY3JDckJCIwY2Zya0FdJkghIzckIjBCKWZ5R0ktcCEjNjckJCIweCFlZnkoXCZIISM3JCIwW0lHJFFqOXAhIzY3JDckJCIwJSk+Ylh4XCZIISM3JCIwZidHSE11OXAhIzY3JCQiMHghZWZ5KFwmSCEjNyQiMFtJRyRRajlwISM2NyQ3JCQiMCUpPmJYeFwmSCEjNyQiMGYnR0hNdTlwISM2NyQkIjBcKmZ6TyVcJkghIzckIjBjdyEqUW5TI3AhIzY3JDckJCIwLUMjekxxaUghIzckIi8xIXorbHE8JiEjNTckJCIwPlYmPSFlRSdIISM3JCIwXC9PKW9dJj0mISM2NyQ3JCQiMD5WJj0hZUUnSCEjNyQiMFwvTylvXSY9JiEjNjckJCIwQVppQmRFJ0ghIzckIjAobyMpUVtsJj0mISM2NyQ3JCQiL0xXYThmaUghIzYkIjAmR0hNdSV6PiYhIzY3JCQiMEFaaUJkRSdIISM3JCIwKG8jKVFbbCY9JiEjNjckNyQkIi9MV2E4ZmlIISM2JCIwJkdITXUlej4mISM2NyQkIjBATHZVKmVpSCEjNyQiMGt2WyJHSik+JiEjNjckNyQkIi9eS3dbX2lIISM2JCIwQSIpXCl6UTVfISM2NyQkIjBATHZVKmVpSCEjNyQiMGt2WyJHSik+JiEjNjckNyQkIi9eS3dbX2lIISM2JCIwQCIpXCl6UTVfISM2NyQkIjB5aFIiPV9pSCEjNyQiMDo0XztxNEAmISM2NyQ3JCQiMChmViZlZUMnSCEjNyQiMGRwY2BHR0EmISM2NyQkIjB5aFIiPV9pSCEjNyQiMDo0XztxNEAmISM2NyQ3JCQiMChmViZlZUMnSCEjNyQiMGVwY2BHR0EmISM2NyQkIjBAISpvUmFDJ0ghIzckIjBUdmEpb2lCXyEjNjckNyQkIjAzNDtbI1JpSCEjNyQiMCV6TiczcF9CJiEjNjckJCIwQCEqb1JhQydIISM3JCIwVHZhKW9pQl8hIzY3JDckJCIwMzQ7WyNSaUghIzckIjAlek4nM3BfQiYhIzY3JCQiMCYpUmY8KFFpSCEjNyQiMFopKW8oSEdPXyEjNjckNyQkIjAmZTBqbEtpSCEjNyQiL2ovUCc0eEMmISM1NyQkIjAmKVJmPChRaUghIzckIjBaKSlvKEhHT18hIzY3JDckJCIwJmUwamxLaUghIzckIi9qL1AnNHhDJiEjNTckJCIwKW88XCxLaUghIzckIjAwXGNXUSpbXyEjNjckNyQkIjAiKSopeiMzRWlIISM3JCIwbU14PV0sRSYhIzY3JCQiMClvPFwsS2lIISM3JCIwMFxjV1EqW18hIzY3JDckJCIwIikqKXojM0VpSCEjNyQiMG1NeD1dLEUmISM2NyQkIjBiVV1KYEEnSCEjNyQiMEJibkgkZmhfISM2NyQ3JCQiMGBbInpfPmlIISM3JCIwLUIlUTJmc18hIzY3JCQiMGJVXUpgQSdIISM3JCIwQmJuSCRmaF8hIzY3JDckJCIwYFsiel8+aUghIzckIjAtQiVRMmZzXyEjNjckJCIvYzp3bT1pSCEjNiQiMDo1PV9aVUYmISM2NyQ3JCQiMC9kTiIqSEAnSCEjNyQiMFE2IipHSl1HJiEjNjckJCIvYzp3bT1pSCEjNiQiMDo1PV9aVUYmISM2NyQ3JCQiMC9kTiIqSEAnSCEjNyQiMFE2IipHSl1HJiEjNjckJCIwVEQjSC03aUghIzckIjApXE9KNiFwRyYhIzY3JDckJCIwY0czdGs/J0ghIzckIjB1KnpSPVooSCYhIzY3JCQiMFREI0gtN2lIISM3JCIwKVxPSjYhcEcmISM2NyQ3JCQiMGNHM3RrPydIISM3JCIwdSp6Uj1aKEgmISM2NyQkIi82LHVSMGlIISM2JCIwOCM+RVRiKkgmISM2NyQ3JCQiMDlZP3QqKj4nSCEjNyQiLyIpWyFSNyo0YCEjNTckJCIvNix1UjBpSCEjNiQiMDgjPkVUYipIJiEjNjckNyQkIjA5WT90Kio+J0ghIzckIi8iKVshUjcqNGAhIzU3JCQiME0kRzZ6KT4nSCEjNyQiMFk/UV0xQUomISM2NyQ3JCQiMChvMzlcJD4nSCEjNyQiMFl3NiVITkFgISM2NyQkIjBNJEc2eik+J0ghIzckIjBZP1FdMUFKJiEjNjckNyQkIjAobzM5XCQ+J0ghIzckIjBZdzYlSE5BYCEjNjckJCIwVEUoUT8jPidIISM3JCIwQnY7RmVbSyYhIzY3JDckJCIwT2YneS0oPSdIISM3JCIwI1snPVwkek1gISM2NyQkIjBURShRPyM+J0ghIzckIjBCdjtGZVtLJiEjNjckNyQkIjBPZid5LSg9J0ghIzckIjAjWyc9XCR6TWAhIzY3JCQiMCd5Im9OYz0nSCEjNyQiMEBEI0clNHZMJiEjNjckNyQkIjBXNFwjZSE9J0ghIzckIjA9YEQvTXNNJiEjNjckJCIwJ3kib05jPSdIISM3JCIwQEQjRyU0dkwmISM2NyQ3JCQiMFc0XCNlIT0nSCEjNyQiMD1gRC9Nc00mISM2NyQkIjBraVsnM3poSCEjNyQiMCwqcHYqZixOJiEjNjckNyQkIjAiPSk0YlQ8J0ghIzckIjBhVEtmdSdmYCEjNjckJCIwa2lbJzN6aEghIzckIjAsKnB2KmYsTiYhIzY3JDckJCIwIj0pNGJUPCdIISM3JCIwYVRLZnUnZmAhIzY3JCQiMG5zP2NEPCdIISM3JCIvT2k7KjRHTyYhIzU3JDckJCIwIipHdVh4OydIISM3JCIvKkhSOTpAUCYhIzU3JCQiMG5zP2NEPCdIISM3JCIvT2k7KjRHTyYhIzU3JDckJCIwIipHdVh4OydIISM3JCIvKkhSOTpAUCYhIzU3JCQiMClRJ3lXZzsnSCEjNyQiMHdyR0RmYVAmISM2NyQ3JCQiL1diVU5oaEghIzYkIjBFPVlwYlhRJiEjNjckJCIwKVEneVdnOydIISM3JCIwd3JHRGZhUCYhIzY3JDckJCIvV2JVTmhoSCEjNiQiMEU9WXBiWFEmISM2NyQkIjAvZzNfJmZoSCEjNyQiMEhjKSkpejUpUSYhIzY3JDckJCIwKGVXMylcOidIISM3JCIwaTFgQycqcFImISM2NyQkIjAvZzNfJmZoSCEjNyQiMEhjKSkpejUpUSYhIzY3JDckJCIwKGVXMylcOidIISM3JCIwaTFgQycqcFImISM2NyQkIjBVdEB5STonSCEjNyQiMHo1NTdjMlMmISM2NyQ3JCQiLzNvXmlbaEghIzYkIjApXCpmek8lNGEhIzY3JCQiMFV0QHlJOidIISM3JCIwejU1N2MyUyYhIzY3JDckJCIvM29eaVtoSCEjNiQiMClcKmZ6TyU0YSEjNjckJCIwL3UsQm05J0ghIzckIjBvaFhsLk1UJiEjNjckNyQkIjB0QEkoR1VoSCEjNyQiME0kb1l0KD1VJiEjNjckJCIwL3UsQm05J0ghIzckIjBvaFhsLk1UJiEjNjckNyQkIjB0QEkoR1VoSCEjNyQiME0kb1l0KD1VJiEjNjckJCIwPHZUJz1TaEghIzckIjAlNHIiZl1nVSYhIzY3JDckJCIwWS49bmY4J0ghIzckIi88UCgqeUpNYSEjNTckJCIwPHZUJz1TaEghIzckIjAlNHIiZl1nVSYhIzY3JDckJCIwWS49bmY4J0ghIzckIi88UCgqeUpNYSEjNTckJCIwS1pSb1A4J0ghIzckIjBSJT5McHBRYSEjNjckNyQkIjAjKkd5aydIaEghIzckIjAxZyFbJWVuVyYhIzY3JCQiMEtaUm9QOCdIISM3JCIwUiU+THBwUWEhIzY3JDckJCIwIypHeWsnSGhIISM3JCIwMWchWyVlblcmISM2NyQkIjBNdCcpb3Q3J0ghIzckIjBBSztvVThYJiEjNjckNyQkIjBzMS4hUUJoSCEjNyQiMFVbKCkqKik+ZmEhIzY3JCQiME10JylvdDcnSCEjNyQiMEFLO29VOFgmISM2NyQ3JCQiMHMxLiFRQmhIISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwTWgneSk0NydIISM3JCIwXE9nJHkpUlkmISM2NyQ3JCQiMEtOJ0c2PGhIISM3JCIweU8lXCZSO1omISM2NyQkIjBNaCd5KTQ3J0ghIzckIjBcT2ckeSlSWSYhIzY3JDckJCIwS04nRzY8aEghIzckIjB5TyVcJlI7WiYhIzY3JCQiME0pM19pOWhIISM3JCIwWl9BU0ttWiYhIzY3JDckJCIwZXZIajM2J0ghIzckIjA5RCw1ITMlWyYhIzY3JCQiME0pM19pOWhIISM3JCIwWl9BU0ttWiYhIzY3JDckJCIwZXZIajM2J0ghIzckIjA5RCw1ITMlWyYhIzY3JCQiMEVlJzRHM2hIISM3JCIwNkIheWpGKlsmISM2NyQ3JCQiMDhmN0pZNSdIISM3JCIvTiIzbD9sXCYhIzU3JCQiMEVlJzRHM2hIISM3JCIwNkIheWpGKlsmISM2NyQ3JCQiMDhmN0pZNSdIISM3JCIvTiIzbD9sXCYhIzU3JCQiMDJxJlsmPjUnSCEjNyQiMHJIQng+Pl0mISM2NyQ3JCQiMHNAVzslKTQnSCEjNyQiMCc9XSw3JyozYiEjNjckJCIwMnEmWyY+NSdIISM3JCIwckhCeD4+XSYhIzY3JDckJCIwc0BXOyUpNCdIISM3JCIwJz1dLDcnKjNiISM2NyQkIjB4IXpyayY0J0ghIzckIi8pZWNkaVheJiEjNTckNyQkIjBzaj0+QTQnSCEjNyQiMEIhPl88U0BiISM2NyQkIjB4IXpyayY0J0ghIzckIi8pZWNkaVheJiEjNTckNyQkIjBzaj0+QTQnSCEjNyQiMEIhPl88U0BiISM2NyQkIi9WO3ZOKjMnSCEjNiQiMGBPOCFbP0ZiISM2NyQ3JCQiMFgzOFJnMydIISM3JCIwZnlHSVVRYCYhIzY3JCQiL1Y7dk4qMydIISM2JCIwYE84IVs/RmIhIzY3JDckJCIwWDM4UmczJ0ghIzckIjBmeUdJVVFgJiEjNjckJCIwXkoqZjMkMydIISM3JCIwQiVRWGslKVJiISM2NyQ3JCQiMEZKU3cpemdIISM3JCIwJnBjYEdHWWIhIzY3JCQiMF5KKmYzJDMnSCEjNyQiMEIlUVhrJSlSYiEjNjckNyQkIjBGSlN3KXpnSCEjNyQiMCZwY2BHR1liISM2NyQkIjBEYV5LbzInSCEjNyQiMCoqNDNeKFtfYiEjNjckNyQkIjByJiopNHR0Z0ghIzckIjBKYlVTQihlYiEjNjckJCIwRGFeS28yJ0ghIzckIjAqKjQzXihbX2IhIzY3JDckJCIwciYqKTR0dGdIISM3JCIwSmJVU0IoZWIhIzY3JCQiMCplUXJmcWdIISM3JCIvJlJlKno3bGIhIzU3JDckJCIwXyopeS13MSdIISM3JCIwblZcJlI7cmIhIzY3JCQiMCplUXJmcWdIISM3JCIvJlJlKno3bGIhIzU3JDckJCIwXyopeS13MSdIISM3JCIwblZcJlI7cmIhIzY3JCQiMCR6dCd6VjEnSCEjNyQiMDRHbCF6d3hiISM2NyQ3JCQiMEtkaSJcaGdIISM3JCIwLktjXS9PZSYhIzY3JCQiMCR6dCd6VjEnSCEjNyQiMDRHbCF6d3hiISM2NyQ3JCQiMEtkaSJcaGdIISM3JCIwLktjXS9PZSYhIzY3JCQiMCNmMSw9ZWdIISM3JCIwKCpRTEMyL2YmISM2NyQ3JCQiMGghb3ZSYmdIISM3JCIwUj9qMFhnZiYhIzY3JCQiMCNmMSw9ZWdIISM3JCIwKCpRTEMyL2YmISM2NyQ3JCQiMGghb3ZSYmdIISM3JCIwUj9qMFhnZiYhIzY3JCQiMCNRTCQpKj4wJ0ghIzckIjA3JWY0Zy8uYyEjNjckNyQkIjBER2U/JFxnSCEjNyQiMHYzcWcmWzNjISM2NyQkIjAjUUwkKSo+MCdIISM3JCIwNyVmNGcvLmMhIzY3JDckJCIwREdlPyRcZ0ghIzckIjB2M3FnJlszYyEjNjckJCIwJG8qUk1lLydIISM3JCIwKlIkUT8lbzpjISM2NyQ3JCQiMEAiejBFVmdIISM3JCIwNihwZGgjNGkmISM2NyQkIjAkbypSTWUvJ0ghIzckIjAqUiRRPyVvOmMhIzY3JDckJCIwQCJ6MEVWZ0ghIzckIjA2KHBkaCM0aSYhIzY3JCQiMDA+QClvUmdIISM3JCIwW2YhSD1LR2MhIzY3JDckJCIwcCVRdkBQZ0ghIzckIjBaJlEzbk9MYyEjNjckJCIwMD5AKW9SZ0ghIzckIjBbZiFIPUtHYyEjNjckNyQkIjBwJVF2QFBnSCEjNyQiMFomUTNuT0xjISM2NyQkIjB4J1soZk4uJ0ghIzckIjAnZSZmKSllNGsmISM2NyQ3JCQiL1IjUSI+SmdIISM2JCIwJFEyZnMhZWsmISM2NyQkIjB4J1soZk4uJ0ghIzckIjAnZSZmKSllNGsmISM2NyQ3JCQiL1IjUSI+SmdIISM2JCIwJFEyZnMhZWsmISM2NyQkIjAqb0gpW3UtJ0ghIzckIjBvLy5RJmZgYyEjNjckNyQkIjBaJmU/PURnSCEjNyQiMD5pKDR5Q2VjISM2NyQkIjAqb0gpW3UtJ0ghIzckIjBvLy5RJmZgYyEjNjckNyQkIjBaJmU/PURnSCEjNyQiMD5pKDR5Q2VjISM2NyQkIjB1MlxiOC0nSCEjNyQiMCdwJjRKSmltJiEjNjckNyQkIjBBOWEqPT5nSCEjNyQiMGJdL08pb3FjISM2NyQkIjB1MlxiOC0nSCEjNyQiMCdwJjRKSmltJiEjNjckNyQkIjBBOWEqPT5nSCEjNyQiMGJdL08pb3FjISM2NyQkIjBVeSEpel8sJ0ghIzckIi8oeWFubSl5YyEjNTckNyQkIjBWUCFRQDhnSCEjNyQiMCIqUTYiKkdKbyYhIzY3JCQiMFV5ISl6XywnSCEjNyQiLyh5YW5tKXljISM1NyQ3JCQiMFZQIVFAOGdIISM3JCIwIipRNiIqR0pvJiEjNjckJCIwWj9XQCM0Z0ghIzckIjB6TVpbLDpwJiEjNjckNyQkIi8wIW9hcysnSCEjNiQiMEZGPVlwYnAmISM2NyQkIjBaP1dAIzRnSCEjNyQiMHpNWlssOnAmISM2NyQ3JCQiLzAhb2FzKydIISM2JCIwRkY9WXBicCYhIzY3JCQiMGA5YCE9LmdIISM3JCIwSylITWQ4L2QhIzY3JDckJCIwKWZgQUosZ0ghIzckIjBqOkQsNSEzZCEjNjckJCIwYDlgIT0uZ0ghIzckIjBLKUhNZDgvZCEjNjckNyQkIjApZmBBSixnSCEjNyQiMGo6RCw1ITNkISM2NyQkIjBFXzBkcipmSCEjNyQiMExQW1VwbnImISM2NyQ3JCQiMC9rXSdRJipmSCEjNyQiMCpSP2owWD9kISM2NyQkIjBFXzBkcipmSCEjNyQiMExQW1VwbnImISM2NyQ3JCQiMC9rXSdRJipmSCEjNyQiMCpSP2owWD9kISM2NyQkIjBjJHkzOiIqZkghIzckIjAkM29nRFNIZCEjNjckNyQkIjBrNUF4JSopZkghIzckIjBOIypRNiIqR3QmISM2NyQkIjBjJHkzOiIqZkghIzckIjAkM29nRFNIZCEjNjckNyQkIjBrNUF4JSopZkghIzckIjBOIypRNiIqR3QmISM2NyQkIjBmKCkpPTsmKWZIISM3JCIvRlVYXi5VZCEjNTckNyQkIi9eb1dlJClmSCEjNiQiMHIhZWs7TFhkISM2NyQkIjBmKCkpPTsmKWZIISM3JCIvRlVYXi5VZCEjNTckNyQkIi9eb1dlJClmSCEjNiQiMHIhZWs7TFhkISM2NyQkIi9lci0+emZIISM2JCIwVUVKPG5ZdiYhIzY3JDckJCIwQkxJM3goZkghIzckIjAycF9Ac3h2JiEjNjckJCIvZXItPnpmSCEjNiQiMFVFSjxuWXYmISM2NyQ3JCQiMEJMSTN4KGZIISM3JCIwMnBfQHN4diYhIzY3JCQiMERoc05LKGZIISM3JCIwY0xNbClIbmQhIzY3JDckJCIweldaWz0oZkghIzckIjBWZGZ3Ny14JiEjNjckJCIwRGhzTksoZkghIzckIjBjTE1sKUhuZCEjNjckNyQkIjB6V1pbPShmSCEjNyQiMFZkZnc3LXgmISM2NyQkIi8iW0EpSG5mSCEjNiQiMGZHc2VIKnpkISM2NyQ3JCQiMClwQlwrbWZIISM3JCIwelhtSmBFeSYhIzY3JCQiLyJbQSlIbmZIISM2JCIwZkdzZUgqemQhIzY3JDckJCIwKXBCXCttZkghIzckIjB6WG1KYEV5JiEjNjckJCIvOE15UGhmSCEjNiQiLyV6QigqZkR6JiEjNTckNyQkIjB1Jyp5eCwnZkghIzckIjA6TXQnUTQmeiYhIzY3JCQiLzhNeVBoZkghIzYkIi8lekIoKmZEeiYhIzU3JDckJCIwdScqeXgsJ2ZIISM3JCIwOk10J1E0JnomISM2NyQkIjAqKjRkdWEmZkghIzckIjBsViQzKSo9MGUhIzY3JDckJCIwTWYtblYmZkghIzckIjBeQSE9V2AyZSEjNjckJCIwKio0ZHVhJmZIISM3JCIwbFYkMykqPTBlISM2NyQ3JCQiME1mLW5WJmZIISM3JCIwXkEhPVdgMmUhIzY3JCQiMFZkNyllXGZIISM3JCIwKTMwMCI+eSJlISM2NyQ3JCQiMGhKT3MmW2ZIISM3JCIwKTNyb1woKj5lISM2NyQkIjBWZDcpZVxmSCEjNyQiMCkzMDAiPnkiZSEjNjckNyQkIjBoSk9zJltmSCEjNyQiMCkzcm9cKCo+ZSEjNjckJCIwQiFRKD1QJWZIISM3JCIwVztbJnlXSWUhIzY3JDckJCIvalNTelVmSCEjNiQiMEMqUj5iVEtlISM2NyQkIjBCIVEoPVAlZkghIzckIjBXO1smeVdJZSEjNjckNyQkIi9qU1N6VWZIISM2JCIwQypSPmJUS2UhIzY3JCQiMERON215JGZIISM3JCIweWNuMXdJJWUhIzY3JDckJCIwOyp6PC5QZkghIzckIi93M3FnJlslZSEjNTckJCIwRE43bXkkZkghIzckIjB5Y24xd0klZSEjNjckNyQkIjA7Kno8LlBmSCEjNyQiL3czcWcmWyVlISM1NyQkIjBEYERJPyRmSCEjNyQiMDlOPHUuZCZlISM2NyQ3JCQiMCZIUGJHSmZIISM3JCIwJ2Z4P21IZGUhIzY3JCQiMERgREk/JGZIISM3JCIwOU48dS5kJmUhIzY3JDckJCIwJkhQYkdKZkghIzckIjAnZng/bUhkZSEjNjckJCIwUCJIN0BFZkghIzckIjBlI293M0xvZSEjNjckNyQkIjBBVlZiYiNmSCEjNyQiMEtrOTxQKHBlISM2NyQkIjBQIkg3QEVmSCEjNyQiMGUjb3czTG9lISM2NyQ3JCQiMEFWVmJiI2ZIISM3JCIwS2s5PFAocGUhIzY3JCQiMGxCLjQvI2ZIISM3JCIwI0grc3UmNCllISM2NyQ3JCQiMCYpZVpUKT5mSCEjNyQiMG9fQHN4QCllISM2NyQkIjBsQi40LyNmSCEjNyQiMCNIK3N1JjQpZSEjNjckNyQkIjAmKWVaVCk+ZkghIzckIjBvX0BzeEApZSEjNjckJCIwTWFQQlkiZkghIzckIjBFIilwYCRlJCplISM2NyQ3JCQiMG5KTFZUImZIISM3JCIwL1RHRj1ZKmUhIzY3JCQiME1hUEJZImZIISM3JCIwRSIpcGAkZSQqZSEjNjckNyQkIjBuSkxWVCJmSCEjNyQiMC9UR0Y9WSplISM2NyQkIjAkZl1WJikzZkghIzckIjBuZidvITRpIWYhIzY3JDckJCIwRV85aCUzZkghIzckIi8lSE4jKWVxIWYhIzU3JCQiMCRmXVYmKTNmSCEjNyQiMG5mJ28hNGkhZiEjNjckNyQkIjBFXzloJTNmSCEjNyQiLyVITiMpZXEhZiEjNTckJCIwTlImPjUuZkghIzckIjBaanIxTSk9ZiEjNjckNyQkIjA+Xypbei1mSCEjNyQiMHc8VVAqXD5mISM2NyQkIjBOUiY+NS5mSCEjNyQiMFpqcjFNKT1mISM2NyQ3JCQiMD5fKlt6LWZIISM3JCIwdzxVUCpcPmYhIzY3JCQiMCIzOWdPKCplSCEjNyQiMHooKXpgZTkkZiEjNjckNyQkIjBuMFRXciplSCEjNyQiMDcxXCMqUj4kZiEjNjckJCIwIjM5Z08oKmVIISM3JCIweigpemBlOSRmISM2NyQ3JCQiMG4wVFdyKmVIISM3JCIwNzFcIypSPiRmISM2NyQkIjBfNV1ZOyplSCEjNyQiL1I0I1sjM1dmISM1NyQ3JCQiMDIkeSc0OiplSCEjNyQiMFslZnYvUVdmISM2NyQkIjBfNV1ZOyplSCEjNyQiL1I0I1sjM1dmISM1NyQ3JCQiMDIkeSc0OiplSCEjNyQiMFslZnYvUVdmISM2NyQkIi95YE4lZillSCEjNiQiMDNGXSplcWNmISM2NyQ3JCQiMFlsIzMqZSllSCEjNyQiMCVHR0U1I28mZiEjNjckJCIveWBOJWYpZUghIzYkIjAzRl0qZXFjZiEjNjckNyQkIjBZbCMzKmUpZUghIzckIjAlR0dFNSNvJmYhIzY3JCQiMHY2JUhOIyllSCEjNyQiME4uSkt2WSdmISM2NyQ3JCQiMEdPIUhLZW1IISM3JCIwIls+PFdvNFghIzY3JCQiL3kieSR6Ym1IISM2JCIwLkxrOTxQXiUhIzY3JDckJCIveSJ5JHpibUghIzYkIjAuTGs5PFBeJSEjNjckJCIwI0c2RnVibUghIzckIjA4XyF6KSp6OFghIzY3JDckJCIwamllNyFbbUghIzckIjBSQHJwZGhfJSEjNjckJCIwI0c2RnVibUghIzckIjA4XyF6KSp6OFghIzY3JDckJCIwamllNyFbbUghIzckIjBSQHJwZGhfJSEjNjckJCIwMSNSXCF5aydIISM3JCIwRGgwJlxcRVghIzY3JDckJCIwWjFtYC1rJ0ghIzckIjB2NHlDKWZRWCEjNjckJCIwMSNSXCF5aydIISM3JCIwRGgwJlxcRVghIzY3JDckJCIwWjFtYC1rJ0ghIzckIjB2NHlDKWZRWCEjNjckJCItNzIqKVJtSCEiKiQiL2I2biMqPVJYISM1NyQ3JCQiMCx5J3BeS21IISM3JCIwNilcKXpRNWIlISM2NyQkIi03MiopUm1IISIqJCIvYjZuIyo9UlghIzU3JDckJCIwLHkncF5LbUghIzckIjA2KVwpelE1YiUhIzY3JCQiMEsiKSoqKio+aidIISM3JCIwKGZzSEcpPWIlISM2NyQ3JCQiMDEzai1baSdIISM3JCIwWic9XCR6TWMlISM2NyQkIjBLIikqKioqPmonSCEjNyQiMChmc0hHKT1iJSEjNjckNyQkIjAxM2otW2knSCEjNyQiMFonPVwkek1jJSEjNjckJCIwYFIiSDhDbUghIzckIjAoPW1NY2RrWCEjNjckNyQkIjBRTz01cmgnSCEjNyQiMCRbKCkqKik+ZmQlISM2NyQkIjBgUiJIOENtSCEjNyQiMCg9bU1jZGtYISM2NyQ3JCQiMFFPPTVyaCdIISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMCNRRiopRzttSCEjNyQiMDolKSopcG5zZCUhIzY3JDckJCIwbnUkKVIlNG1IISM3JCIwPmowWGckKWUlISM2NyQkIjAjUUYqKUc7bUghIzckIjA6JSkqKXBuc2QlISM2NyQ3JCQiMG51JClSJTRtSCEjNyQiMD5qMFhnJCllJSEjNjckJCIwdlFNbyUzbUghIzckIjBfKSpHLGYqKmUlISM2NyQ3JCQiMEVNTCJ6LG1IISM3JCIwYl43KywzZyUhIzY3JCQiMHZRTW8lM21IISM3JCIwXykqRyxmKiplJSEjNjckNyQkIjBFTUwieixtSCEjNyQiMGJeNyssM2clISM2NyQkIi8lM3lxMWcnSCEjNiQiMGZzJyllXEVnJSEjNjckNyQkIjA0eHJrVGYnSCEjNyQiMCIqUj5iVEtoJSEjNjckJCIvJTN5cTFnJ0ghIzYkIjBmcycpZVxFZyUhIzY3JDckJCIwNHhya1RmJ0ghIzckIjAiKlI+YlRLaCUhIzY3JCQiMDR0UScqR2YnSCEjNyQiMHBGOlVSYGglISM2NyQ3JCQiLyRRK2dsZSdIISM2JCIwR0dFNSNvRFkhIzY3JCQiMDR0UScqR2YnSCEjNyQiMHBGOlVSYGglISM2NyQ3JCQiLyRRK2dsZSdIISM2JCIwR0dFNSNvRFkhIzY3JCQiMCJ5K145JmUnSCEjNyQiMCd6WTgmRyFHWSEjNjckNyQkIjBRInlvKCp5bEghIzckIjBrO0xsQSJRWSEjNjckJCIwInkrXjkmZSdIISM3JCIwJ3pZOCZHIUdZISM2NyQ3JCQiMFEieW8oKnlsSCEjNyQiMGs7TGxBIlFZISM2NyQkIjAoKVJiO3VkJ0ghIzckIjBtcGkob3JTWSEjNjckNyQkIjBZKipcOjlkJ0ghIzckIi4wUz9qMGwlISIqNyQkIjAoKVJiO3VkJ0ghIzckIjBtcGkob3JTWSEjNjckNyQkIjBZKipcOjlkJ0ghIzckIi4wUz9qMGwlISIqNyQkIjBNIXA1cnBsSCEjNyQiMGMvJypcL01sJSEjNjckNyQkIi95Km92UWMnSCEjNiQiME8kcGFQK2pZISM2NyQkIjBNIXA1cnBsSCEjNyQiMGMvJypcL01sJSEjNjckNyQkIi95Km92UWMnSCEjNiQiME8kcGFQK2pZISM2NyQkIjA7JVsjRz9jJ0ghIzckIjBiPWlSIjRtWSEjNjckNyQkIjApMzl0TmNsSCEjNyQiMHMiUTBWV3ZZISM2NyQkIjA7JVsjRz9jJ0ghIzckIjBiPWlSIjRtWSEjNjckNyQkIjApMzl0TmNsSCEjNyQiMHMiUTBWV3ZZISM2NyQkIjBhXjRvVmInSCEjNyQiMHM5Z2N4KHlZISM2NyQ3JCQiMFpEUWcpW2xIISM3JCIwM3FnJlspeW8lISM2NyQkIjBhXjRvVmInSCEjNyQiMHM5Z2N4KHlZISM2NyQ3JCQiMFpEUWcpW2xIISM3JCIwM3FnJlspeW8lISM2NyQkIjB5OmBJbmEnSCEjNyQiMGMkWzZJWSJwJSEjNjckNyQkIjBFNSNbUVRsSCEjNyQiMFdlblNELnElISM2NyQkIjB5OmBJbmEnSCEjNyQiMGMkWzZJWSJwJSEjNjckNyQkIjBFNSNbUVRsSCEjNyQiMFdlblNELnElISM2NyQkIjB0dGM6IlJsSCEjNyQiL1hKS3g5L1ohIzU3JDckJCIwcmJrSVJgJ0ghIzckIi9vV2RmdzdaISM1NyQkIjB0dGM6IlJsSCEjNyQiL1hKS3g5L1ohIzU3JDckJCIwcmJrSVJgJ0ghIzckIi9vV2RmdzdaISM1NyQkIjAiZmxJX0psSCEjNyQiLygpKkd0Sm9yJSEjNTckNyQkIi9qO3dcRWxIISM2JCIwO04iM2w/RFohIzY3JCQiMCJmbElfSmxIISM3JCIvKCkqR3RKb3IlISM1NyQ3JCQiL2o7d1xFbEghIzYkIjA7TiIzbD9EWiEjNjckJCIwI3lFSCZSXydIISM3JCIuRGssOiZIWiEiKjckNyQkIi5udiYzPmxIISM1JCIwX0IpZXFrUFohIzY3JCQiMCN5RUgmUl8nSCEjNyQiLkRrLDomSFohIio3JDckJCIubnYmMz5sSCEjNSQiMF9CKWVxa1BaISM2NyQkIjA8Mjcwa14nSCEjNyQiMG9pUWUoPlVaISM2NyQ3JCQiMGItLyZwNmxIISM3JCIwKT1eNHczXVohIzY3JCQiMDwyNzBrXidIISM3JCIwb2lRZSg+VVohIzY3JDckJCIwYi0vJnA2bEghIzckIjApPV40dzNdWiEjNjckJCIvbmEmeikzbEghIzYkIjAlXD1RJXpbdiUhIzY3JDckJCIwYkNHRFZdJ0ghIzckIjBDKy07R0R3JSEjNjckJCIvbmEmeikzbEghIzYkIjAlXD1RJXpbdiUhIzY3JDckJCIwYkNHRFZdJ0ghIzckIjBDKy07R0R3JSEjNjckJCIwKVwjNHc4XSdIISM3JCIwN2RQZWd2dyUhIzY3JDckJCIwYSFlayhwXCdIISM3JCIvJykpM3JvXHglISM1NyQkIjApXCM0dzhdJ0ghIzckIjA3ZFBlZ3Z3JSEjNjckNyQkIjBhIWVrKHBcJ0ghIzckIi8nKSkzcm9ceCUhIzU3JCQiMDdjaiUqUVwnSCEjNyQiMFxTUC1ULXklISM2NyQ3JCQiMHVFY1snKlsnSCEjNyQiMCdwZGgjNHV5JSEjNjckJCIwN2NqJSpRXCdIISM3JCIwXFNQLVQteSUhIzY3JDckJCIwdUVjWycqWydIISM3JCIwJ3BkaCM0dXklISM2NyQkIjAvJHpgVidbJ0ghIzckIjAtdD12P0h6JSEjNjckNyQkIjBNT19UQlsnSCEjNyQiMEtsQSIpXCkqeiUhIzY3JCQiMC8kemBWJ1snSCEjNyQiMC10PXY/SHolISM2NyQ3JCQiME1PX1RCWydIISM3JCIwS2xBIilcKSp6JSEjNjckJCIwc1UqeSoqeWtIISM3JCIwOz8+eSpmMFshIzY3JDckJCIwNkI+Yl1aJ0ghIzckIjBvYEhPIUg3WyEjNjckJCIwc1UqeSoqeWtIISM3JCIwOz8+eSpmMFshIzY3JDckJCIwNkI+Yl1aJ0ghIzckIjBvYEhPIUg3WyEjNjckJCIwPFVJI2Vya0ghIzckIjBYOio0InkjPVshIzY3JDckJCIwY0pfKnlua0ghIzckIjAvVU8iNHRDWyEjNjckJCIwPFVJI2Vya0ghIzckIjBYOio0InkjPVshIzY3JDckJCIwY0pfKnlua0ghIzckIjAvVU8iNHRDWyEjNjckJCIwaiYqWyk9a2tIISM3JCIwMCRwUmQmNCRbISM2NyQ3JCQiMCpbIlxXMFknSCEjNyQiLy9Mazk8UFshIzU3JCQiMGomKlspPWtrSCEjNyQiMDAkcFJkJjQkWyEjNjckNyQkIjAqWyJcVzBZJ0ghIzckIi8vTGs5PFBbISM1NyQkIjBZN1U7b1gnSCEjNyQiMCdbPXNFalZbISM2NyQ3JCQiMG13Kio+TFgnSCEjNyQiMHc9XSw3J1xbISM2NyQkIjBZN1U7b1gnSCEjNyQiMCdbPXNFalZbISM2NyQ3JCQiMG13Kio+TFgnSCEjNyQiMHc9XSw3J1xbISM2NyQkIjAiPjNmWVxrSCEjNyQiMGg8TiIqM2omWyEjNjckNyQkIjAzSzM7aFcnSCEjNyQiMDcyZGNfPydbISM2NyQkIjAiPjNmWVxrSCEjNyQiMGg8TiIqM2omWyEjNjckNyQkIjAzSzM7aFcnSCEjNyQiMDcyZGNfPydbISM2NyQkIjB6WyhwOFVrSCEjNyQiMFIxSFklKSpvWyEjNjckNyQkIi91M0MkKlFrSCEjNiQiMFsmUjtKXHVbISM2NyQkIjB6WyhwOFVrSCEjNyQiMFIxSFklKSpvWyEjNjckNyQkIi91M0MkKlFrSCEjNiQiMFsmUjtKXHVbISM2NyQkIjBRZGFIW1YnSCEjNyQiMEh1RktmOylbISM2NyQ3JCQiMEoibyNwPFYnSCEjNyQiMCVRM25PJHApWyEjNjckJCIwUWRhSFtWJ0ghIzckIjBIdUZLZjspWyEjNjckNyQkIjBKIm8jcDxWJ0ghIzckIjAlUTNuTyRwKVshIzY3JCQiMDQiXE5hRmtIISM3JCIwND5hXExWKlshIzY3JDckJCIwNCM+amlDa0ghIzckIi9BeDxVUCoqWyEjNTckJCIwNCJcTmFGa0ghIzckIjA0PmFcTFYqWyEjNjckNyQkIjA0Iz5qaUNrSCEjNyQiL0F4PFVQKipbISM1NyQkIjAkZTcqeS1VJ0ghIzckIjBbaUopcCsyXCEjNjckNyQkIjBCcHAudlQnSCEjNyQiMGNnJW9aIj0iXCEjNjckJCIwJGU3KnktVSdIISM3JCIwW2lKKXArMlwhIzY3JDckJCIwQnBwLnZUJ0ghIzckIjBjZyVvWiI9IlwhIzY3JCQiLyg9Wk5JVCdIISM2JCIwVnM3enonPlwhIzY3JDckJCIwem82LC9UJ0ghIzckIjAkKlsiPmBEQ1whIzY3JCQiLyg9Wk5JVCdIISM2JCIwVnM3enonPlwhIzY3JDckJCIwem82LC9UJ0ghIzckIjAkKlsiPmBEQ1whIzY3JCQiMGEnSEsiZVMnSCEjNyQiL0dtPj5OS1whIzU3JDckJCIwTjVsPUxTJ0ghIzckIjBIUClwZXBPXCEjNjckJCIwYSdISyJlUydIISM3JCIvR20+Pk5LXCEjNTckNyQkIjBONWw9TFMnSCEjNyQiMEhQKXBlcE9cISM2NyQkIjAqKno6NycpUidIISM3JCIwVUgjcEwtWFwhIzY3JDckJCIweGNGY2lSJ0ghIzckIjBsRDBVTyJcXCEjNjckJCIwKip6OjcnKVInSCEjNyQiMFVII3BMLVhcISM2NyQ3JCQiMHhjRmNpUidIISM3JCIwbEQwVU8iXFwhIzY3JCQiLzBIQVYiUidIISM2JCIwTmwzOSVwZFwhIzY3JDckJCIwcHInUkAqUSdIISM3JCIwLDk3KHBkaFwhIzY3JCQiLzBIQVYiUidIISM2JCIwTmwzOSVwZFwhIzY3JDckJCIwcHInUkAqUSdIISM3JCIwLDk3KHBkaFwhIzY3JCQiL20nPXRVUSdIISM2JCIwKVF5VVVPcVwhIzY3JDckJCIwdy1WIj4jUSdIISM3JCIwUC0+XzxTKFwhIzY3JCQiL20nPXRVUSdIISM2JCIwKVF5VVVPcVwhIzY3JDckJCIwdy1WIj4jUSdIISM3JCIwUC0+XzxTKFwhIzY3JCQiMGEiZV04eGpIISM3JCIwJykzVG5MSSlcISM2NyQ3JCQiMDEqWygpPXZqSCEjNyQiMHQhZnMhZWspXCEjNjckJCIwYSJlXTh4akghIzckIjAnKTNUbkxJKVwhIzY3JDckJCIwMSpbKCk9dmpIISM3JCIwdCFmcyFlaylcISM2NyQkIjBUaCJ5LHFqSCEjNyQiMGE9ZFYtZCpcISM2NyQ3JCQiMCZ5KiplP29qSCEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMFRoInkscWpIISM3JCIwYT1kVi1kKlwhIzY3JDckJCIwJnkqKmU/b2pIISM3JCIwNHpLaSkqKSkqXCEjNjckJCIwO0xWQEhPJ0ghIzckIjBZKVtHMFAzXSEjNjckNyQkIjA0KGZHQ2hqSCEjNyQiMFhuUjxSOCwmISM2NyQkIjA7TFZASE8nSCEjNyQiMFkpW0cwUDNdISM2NyQ3JCQiMDQoZkdDaGpIISM3JCIwWG5SPFI4LCYhIzY3JCQiL29JYyVlTidIISM2JCIwY2s4J3ouQF0hIzY3JDckJCIwTSUpRypIYWpIISM3JCIwImVsQyh6UC0mISM2NyQkIi9vSWMlZU4nSCEjNiQiMGNrOCd6LkBdISM2NyQ3JCQiME0lKUcqSGFqSCEjNyQiMCJlbEMoelAtJiEjNjckJCIwJipmYiF6W2pIISM3JCIwJiozJ0hacUxdISM2NyQ3JCQiMFI7XnZ0TSdIISM3JCIwPFdgRj9pLiYhIzY3JCQiMCYqZmIheltqSCEjNyQiMCYqMydIWnFMXSEjNjckNyQkIjBSO152dE0nSCEjNyQiMDxXYEY/aS4mISM2NyQkIjBcYy1jPE0nSCEjNyQiMDA0IlIzUFldISM2NyQ3JCQiMFtBOnIvTSdIISM3JCIwYEtnIzNtW10hIzY3JCQiMFxjLWM8TSdIISM3JCIwMDQiUjNQWV0hIzY3JDckJCIwW0E6ci9NJ0ghIzckIjBgS2cjM21bXSEjNjckJCIwTzMvVVpMJ0ghIzckIjBjRSkqR08hZl0hIzY3JDckJCIwNi1LJ2VMakghIzckIjAqM3N3ODVoXSEjNjckJCIwTzMvVVpMJ0ghIzckIjBjRSkqR08hZl0hIzY3JDckJCIwNi1LJ2VMakghIzckIjAqM3N3ODVoXSEjNjckJCIwRGlXW3hLJ0ghIzckIjA5VW4zLDwyJiEjNjckNyQkIjAyPiI0c0VqSCEjNyQiMEQ0dSM+YXRdISM2NyQkIjBEaVdbeEsnSCEjNyQiMDlVbjMsPDImISM2NyQ3JCQiMDI+IjRzRWpIISM3JCIwRDR1Iz5hdF0hIzY3JCQiMHRzRHYySydIISM3JCIwNmckSF9PJTMmISM2NyQ3JCQiMEh0I1soKT5qSCEjNyQiMGgoNHlDKWYzJiEjNjckJCIwdHNEdjJLJ0ghIzckIjA2ZyRIX08lMyYhIzY3JDckJCIwSHQjWygpPmpIISM3JCIwaCg0eUMpZjMmISM2NyQkIjBLZ1BBUUonSCEjNyQiLzcjM3NHcTQmISM1NyQ3JCQiMCNHKDNbSUonSCEjNyQiMChmeUdJVSk0JiEjNjckJCIwS2dQQVFKJ0ghIzckIi83IzNzR3E0JiEjNTckNyQkIjAjRygzW0lKJ0ghIzckIjAoZnlHSVUpNCYhIzY3JCQiMHhfIikqKW9JJ0ghIzckIi9kcmc6cDReISM1NyQ3JCQiMFo8alNpSSdIISM3JCIwTHUlek4nMzYmISM2NyQkIjB4XyIpKilvSSdIISM3JCIvZHJnOnA0XiEjNTckNyQkIjBaPGpTaUknSCEjNyQiMEx1JXpOJzM2JiEjNjckJCIwJnltdCgqKkgnSCEjNyQiLy1zYlBOQV4hIzU3JDckJCIwYEFKXyUqSCdIISM3JCIwcGksOC9MNyYhIzY3JCQiMCZ5bXQoKipIJ0ghIzckIi8tc2JQTkFeISM1NyQ3JCQiMGBBSl8lKkgnSCEjNyQiMHBpLDgvTDcmISM2NyQkIi8xOV0zJEgnSCEjNiQiMG9qakk6XTgmISM2NyQ3JCQiMHIjKjMkbyNIJ0ghIzckIjAwXjNvV2Q4JiEjNjckJCIvMTldMyRIJ0ghIzYkIjBvampJOl04JiEjNjckNyQkIjByIyozJG8jSCdIISM3JCIwMF4zb1dkOCYhIzY3JCQiMCozO0ZAJ0cnSCEjNyQiMD5oUkB3dzkmISM2NyQ3JCQiMGoyJUgkZkcnSCEjNyQiMFRSOkImPVteISM2NyQkIjAqMztGQCdHJ0ghIzckIjA+aFJAd3c5JiEjNjckNyQkIjBqMiVIJGZHJ0ghIzckIjBUUjpCJj1bXiEjNjckJCIvN1ovT3ppSCEjNiQiMFVRJHprTGdeISM2NyQ3JCQiMGpaJT0/emlIISM3JCIweEZBeUQxOyYhIzY3JCQiLzdaL096aUghIzYkIjBVUSR6a0xnXiEjNjckNyQkIjBqWiU9P3ppSCEjNyQiMHhGQXlEMTsmISM2NyQkIjBzOS1HREYnSCEjNyQiMD1cJTNoKkg8JiEjNjckNyQkIi86QScqW3NpSCEjNiQiMDg7SExtSTwmISM2NyQkIjBzOS1HREYnSCEjNyQiMD1cJTNoKkg8JiEjNjckNyQkIi86QScqW3NpSCEjNiQiMDg7SExtSTwmISM2NyQkIjAtQyN6THFpSCEjNyQiLzEheitscTwmISM1NyQ3JCQiMGJbKXlJWXFIISM3JCIwbSEqNGdvQiRSISM2NyQkIjBgZipSeVJxSCEjNyQiMFhvWiI9WFRSISM2NyQ3JCQiMGBmKlJ5UnFIISM3JCIwWG9aIj1YVFIhIzY3JCQiMFIzbUsnUnFIISM3JCIwYydmX2VtVFIhIzY3JDckJCIwd3VFdTMuKEghIzckIjAib1hsQipRJlIhIzY3JCQiMFIzbUsnUnFIISM3JCIwYydmX2VtVFIhIzY3JDckJCIwd3VFdTMuKEghIzckIjAib1hsQipRJlIhIzY3JCQiMCY0Q3NeSXFIISM3JCIwVmBgbylSYVIhIzY3JDckJCIwPV4xIio+LShIISM3JCIwPFhoIkhMbVIhIzY3JCQiMCY0Q3NeSXFIISM3JCIwVmBgbylSYVIhIzY3JDckJCIwPV4xIio+LShIISM3JCIwPFhoIkhMbVIhIzY3JCQiL1hNK1ZAcUghIzYkIjBzIVE3MThuUiEjNjckNyQkIjAyPChRODhxSCEjNyQiMGBMb1l0KHlSISM2NyQkIi9YTStWQHFIISM2JCIwcyFRNzE4blIhIzY3JDckJCIwMjwoUTg4cUghIzckIjBgTG9ZdCh5UiEjNjckJCIwPVJkcUIsKEghIzckIjBYKEddOycpelIhIzY3JDckJCIwblsiR0kvcUghIzckIjAqPV88U0AiKlIhIzY3JCQiMD1SZHFCLChIISM3JCIwWChHXTsnKXpSISM2NyQ3JCQiMG5bIkdJL3FIISM3JCIwKj1fPFNAIipSISM2NyQkIi9eVCpRTCsoSCEjNiQiMCMpKSpleiJmIypSISM2NyQ3JCQiMEwmUXlcJipwSCEjNyQiMEQ1I29YbC5TISM2NyQkIi9eVCpRTCsoSCEjNiQiMCMpKSpleiJmIypSISM2NyQ3JCQiMEwmUXlcJipwSCEjNyQiMEQ1I29YbC5TISM2NyQkIjAqcCQzTlYqcEghIzckIjA+SjQwQGArJSEjNjckNyQkIjA0cSopPW4pcEghIzckIjBoKSopPV40O1MhIzY3JCQiMCpwJDNOVipwSCEjNyQiMD5KNDBAYCslISM2NyQ3JCQiMDRxKik9bilwSCEjNyQiMGgpKik9XjQ7UyEjNjckJCIwKTRAKmVgKXBIISM3JCIwMEl6VFwhPVMhIzY3JDckJCIwdClbYyd6KHBIISM3JCIwKXBlcGNgR1MhIzY3JCQiMCk0QCplYClwSCEjNyQiMDBJelRcIT1TISM2NyQ3JCQiMHQpW2MneihwSCEjNyQiMClwZXBjYEdTISM2NyQkIjB4cTY1ayhwSCEjNyQiMEYqbzJweElTISM2NyQ3JCQiMCopKio9USNwcEghIzckIjBNdi1BdzQvJSEjNjckJCIweHE2NWsocEghIzckIjBGKm8ycHhJUyEjNjckNyQkIjAqKSoqPVEjcHBIISM3JCIwTXYtQXc0LyUhIzY3JCQiLzFIKClbbnBIISM2JCIwaG4kPU5dVlMhIzY3JDckJCIwc0pKTzAncEghIzckIi9QJzR4O00wJSEjNTckJCIvMUgoKVtucEghIzYkIjBobiQ9Tl1WUyEjNjckNyQkIjBzSkpPMCdwSCEjNyQiL1AnNHg7TTAlISM1NyQkIjBlQmclZmVwSCEjNyQiMDBEXERIaTAlISM2NyQ3JCQiMDplOGc9JnBIISM3JCIwMV87S2RlMSUhIzY3JCQiMGVCZyVmZXBIISM3JCIwMERcREhpMCUhIzY3JDckJCIwOmU4Zz0mcEghIzckIjAxXztLZGUxJSEjNjckJCIwI1x6eHNccEghIzckIi8jKSpmNmEqb1MhIzU3JDckJCIwOktANEslcEghIzckIjBVU0IoeUh5UyEjNjckJCIwI1x6eHNccEghIzckIi8jKSpmNmEqb1MhIzU3JDckJCIwOktANEslcEghIzckIjBVU0IoeUh5UyEjNjckJCIwLV4keSkzJXBIISM3JCIwMEVfNnk7MyUhIzY3JDckJCIwMSpvUWVNcEghIzckIjB5R0lVUTI0JSEjNjckJCIwLV4keSkzJXBIISM3JCIwMEVfNnk7MyUhIzY3JDckJCIwMSpvUWVNcEghIzckIjB5R0lVUTI0JSEjNjckJCIwYUEvdj8kcEghIzckIjAiRyZRQyxXNCUhIzY3JDckJCIvT2lPKWYjcEghIzYkIjA5PFAoKnlKNSUhIzY3JCQiMGFBL3Y/JHBIISM3JCIwIkcmUUMsVzQlISM2NyQ3JCQiL09pTylmI3BIISM2JCIwOTxQKCp5SjUlISM2NyQkIjBeLC8qR0JwSCEjNyQiMEtaTV5CcjUlISM2NyQ3JCQiMFBDczN1InBIISM3JCIvYlNDJj5jNiUhIzU3JCQiMF4sLypHQnBIISM3JCIwS1pNXkJyNSUhIzY3JDckJCIwUENzM3UicEghIzckIi9iU0MmPmM2JSEjNTckJCIwR3J6SFgicEghIzckIjAnWy1EXCUpPlQhIzY3JDckJCIwbDghKmUpM3BIISM3JCIwJ1E0disxR1QhIzY3JCQiMEdyekhYInBIISM3JCIwJ1stRFwlKT5UISM2NyQ3JCQiMGw4ISplKTNwSCEjNyQiMCdRNHYrMUdUISM2NyQkIjAlPV5zejBwSCEjNyQiMF50MFtsRDglISM2NyQ3JCQiMGhJJVJMK3BIISM3JCIwQSN5RDFdU1QhIzY3JCQiMCU9XnN6MHBIISM3JCIwXnQwW2xEOCUhIzY3JDckJCIwaEklUkwrcEghIzckIjBBI3lEMV1TVCEjNjckJCIwTzE/IjQoKm9IISM3JCIwMmdsPSZHWFQhIzY3JDckJCIwam4oUiQ9Km9IISM3JCIwZXFrPFRIOiUhIzY3JCQiME8xPyI0KCpvSCEjNyQiMDJnbD0mR1hUISM2NyQ3JCQiMGpuKFIkPSpvSCEjNyQiMGVxazxUSDolISM2NyQkIjByI1s7VCkpb0ghIzckIjBCJipHLy8hZVQhIzY3JDckJCIwJyk+ISplTClvSCEjNyQiMCUqZXJzIlFsVCEjNjckJCIwciNbO1QpKW9IISM3JCIwQiYqRy8vIWVUISM2NyQ3JCQiMCcpPiEqZUwpb0ghIzckIjAlKmVycyJRbFQhIzY3JCQiMFVJWmUoem9IISM3JCIwR2dNMEEyPCUhIzY3JDckJCIwKDM5JjNcKG9IISM3JCIvdCV5RkF5PCUhIzU3JCQiMFVJWmUoem9IISM3JCIwR2dNMEEyPCUhIzY3JDckJCIwKDM5JjNcKG9IISM3JCIvdCV5RkF5PCUhIzU3JCQiMCkzKWZKNihvSCEjNyQiMHc+MkFSTT0lISM2NyQ3JCQiMEBgJUdbbW9IISM3JCIwbU4mR0dFIT4lISM2NyQkIjApMylmSjYob0ghIzckIjB3PjJBUk09JSEjNjckNyQkIjBAYCVHW21vSCEjNyQiMG1OJkdHRSE+JSEjNjckJCIwbiRHM2Bpb0ghIzckIjBjRjRiYmg+JSEjNjckNyQkIi9uQjszZW9IISM2JCIwLUMjekxxLVUhIzY3JCQiMG4kRzNgaW9IISM3JCIwY0Y0YmJoPiUhIzY3JDckJCIvbkI7M2VvSCEjNiQiMC1DI3pMcS1VISM2NyQkIi9KLWgmUiZvSCEjNiQiMCl5MFk1KCkzVSEjNjckNyQkIjB6KCkpW3Fcb0ghIzckIjBRNypIUjk6VSEjNjckJCIvSi1oJlImb0ghIzYkIjApeTBZNSgpM1UhIzY3JDckJCIweigpKVtxXG9IISM3JCIwUTcqSFI5OlUhIzY3JCQiMFw9UTJhJW9IISM3JCIwTUp0cSZlQFUhIzY3JDckJCIwcCozRU5Ub0ghIzckIjB1KzFbJWVGVSEjNjckJCIwXD1RMmElb0ghIzckIjBNSnRxJmVAVSEjNjckNyQkIjBwKjNFTlRvSCEjNyQiMHUrMVslZUZVISM2NyQkIjAxNFglKW8kb0ghIzckIi9rblQmKkhNVSEjNTckNyQkIjBuXmRDSSRvSCEjNyQiLyIqR0pdLVNVISM1NyQkIjAxNFglKW8kb0ghIzckIi9rblQmKkhNVSEjNTckNyQkIjBuXmRDSSRvSCEjNyQiLyIqR0pdLVNVISM1NyQkIjBiYVYoUUdvSCEjNyQiMHVgXWE3cUMlISM2NyQ3JCQiMG4nPjRzQ29IISM3JCIwWXg+ZWxDRCUhIzY3JCQiMGJhVihRR29IISM3JCIwdWBdYTdxQyUhIzY3JDckJCIwbic+NHNDb0ghIzckIjBZeD5lbENEJSEjNjckJCIwTWE1Oyo+b0ghIzckIjA8U1tzQyhmVSEjNjckNyQkIjBrJSlHVGsib0ghIzckIjAjZW1LaCFcRSUhIzY3JCQiME1hNTsqPm9IISM3JCIwPFNbc0MoZlUhIzY3JDckJCIwayUpR1RrIm9IISM3JCIwI2VtS2ghXEUlISM2NyQkIjB0PUZxOSJvSCEjNyQiMClcNCgzT0NGJSEjNjckNyQkIjA+SHImPTNvSCEjNyQiMD1hTG9ZdEYlISM2NyQkIjB0PUZxOSJvSCEjNyQiMClcNCgzT0NGJSEjNjckNyQkIjA+SHImPTNvSCEjNyQiMD1hTG9ZdEYlISM2NyQkIi9FZipcSSFvSCEjNiQiMCRILkptOSZHJSEjNjckNyQkIjAwSTRhKip6J0ghIzckIjBhVVNCKHkqRyUhIzY3JCQiL0VmKlxJIW9IISM2JCIwJEguSm05JkclISM2NyQ3JCQiMDBJNGEqKnonSCEjNyQiMGFVU0IoeSpHJSEjNjckJCIwZF8mXGwleidIISM3JCIwY2lNT2N5SCUhIzY3JDckJCIwT0FIWTx6J0ghIzckIi80dCV5RkFJJSEjNTckJCIwZF8mXGwleidIISM3JCIwY2lNT2N5SCUhIzY3JDckJCIwT0FIWTx6J0ghIzckIjAiNHQleUZBSSUhIzY3JCQiMG5ISyZHJ3knSCEjNyQiMFtnQkdsMEolISM2NyQ3JCQiMFg1VmlOeSdIISM3JCIwRT5hTG9ZSiUhIzY3JCQiMG5ISyZHJ3knSCEjNyQiMFtnQkdsMEolISM2NyQ3JCQiMFg1VmlOeSdIISM3JCIwRT5hTG9ZSiUhIzY3JCQiMEdGJzQlengnSCEjNyQiMEpBNFJ0S0slISM2NyQ3JCQiMHcuQC1heCdIISM3JCIwajJoKSkzckslISM2NyQkIjBHRic0JXp4J0ghIzckIjBKQTRSdEtLJSEjNjckNyQkIjB3LkAtYXgnSCEjNyQiMGoyaCkpM3JLJSEjNjckJCIwSyFlOmlwbkghIzckIjB0J0gqcCEpZkwlISM2NyQ3JCQiL3olZWxzdydIISM2JCIwKmZ6TyVcJlJWISM2NyQkIjBLIWU6aXBuSCEjNyQiMHQnSCpwISlmTCUhIzY3JDckJCIveiVlbHN3J0ghIzYkIjAqZnpPJVwmUlYhIzY3JCQiMFA2R0Y4dydIISM3JCIwTmc+PyhvW1YhIzY3JDckJCIwMThlXyJmbkghIzckIjBOJVsoKSoqKT5OJSEjNjckJCIwUDZHRjh3J0ghIzckIjBOZz4/KG9bViEjNjckNyQkIjAxOGVfImZuSCEjNyQiME4lWygpKiopPk4lISM2NyQkIjB3NSN6MGBuSCEjNyQiMHl4YyFIUmhWISM2NyQ3JCQiMFEqM0kxXm5IISM3JCIwcnMiUTBWa1YhIzY3JCQiMHc1I3owYG5IISM3JCIweXhjIUhSaFYhIzY3JDckJCIwUSozSTFebkghIzckIjBycyJRMFZrViEjNjckJCIwSl1SOFt1J0ghIzckIjBbL0oieTR1ViEjNjckNyQkIjBLSShvKkh1J0ghIzckIjAyaCkpM3JvUCUhIzY3JCQiMEpdUjhbdSdIISM3JCIwWy9KInk0dVYhIzY3JDckJCIwS0kobypIdSdIISM3JCIwMmgpKTNyb1AlISM2NyQkIjBiMXEkZk9uSCEjNyQiMHM6ViM+IW9RJSEjNjckNyQkIi80LVQmXHQnSCEjNiQiMFZcJlI7SipRJSEjNjckJCIwYjFxJGZPbkghIzckIjBzOlYjPiFvUSUhIzY3JDckJCIvNC1UJlx0J0ghIzYkIjBWXCZSO0oqUSUhIzY3JCQiMEpLXClSR25IISM3JCIwdGsuRDAmKlIlISM2NyQ3JCQiMC1MUE1wcydIISM3JCIwelAtPl88UyUhIzY3JCQiMEpLXClSR25IISM3JCIwdGsuRDAmKlIlISM2NyQ3JCQiMC1MUE1wcydIISM3JCIwelAtPl88UyUhIzY3JCQiMHZvJ3pBP25IISM3JCIvcy0meTJBVCUhIzU3JDckJCIwJilSJXokKj1uSCEjNyQiMDpFNHUjPjlXISM2NyQkIjB2byd6QT9uSCEjNyQiL3MtJnkyQVQlISM1NyQ3JCQiMCYpUiV6JCo9bkghIzckIjA6RTR1Iz45VyEjNjckJCIwRSN5PjM3bkghIzckIjAqKioqR2A0XFUlISM2NyQ3JCQiME9TaWs0cidIISM3JCIwXjk7SExtVSUhIzY3JCQiMEUjeT4zN25IISM3JCIwKioqKkdgNFxVJSEjNjckNyQkIjBPU2lrNHInSCEjNyQiMF45O0hMbVUlISM2NyQkIi8tPS4nUnEnSCEjNiQiMC4kcCswaFBXISM2NyQ3JCQiME9AQzlJcSdIISM3JCIwKEdJVVEyUlchIzY3JCQiLy09LidScSdIISM2JCIwLiRwKzBoUFchIzY3JDckJCIwT0BDOUlxJ0ghIzckIjAoR0lVUTJSVyEjNjckJCIwYTklSCdlcCdIISM3JCIwKEclKSpvNS5YJSEjNjckNyQkIjBBJmZuMyZwJ0ghIzckIjBCIipIUjk6WCUhIzY3JCQiMGE5JUgnZXAnSCEjNyQiMChHJSkqbzUuWCUhIzY3JDckJCIwQSZmbjMmcCdIISM3JCIwQiIqSFI5OlglISM2NyQkIjA2UiEpKnkobydIISM3JCIwPiF5LCwsalchIzY3JDckJCIwJnA4QD0obydIISM3JCIwZnpPJVwmUlklISM2NyQkIjA2UiEpKnkobydIISM3JCIwPiF5LCwsalchIzY3JDckJCIwJnA4QD0obydIISM3JCIwZnpPJVwmUlklISM2NyQkIi8mem9TKHptSCEjNiQiMDZ4TXUzZFolISM2NyQ3JCQiMGw3Oiskem1IISM3JCIwJnpPJVwmUndXISM2NyQkIi8mem9TKHptSCEjNiQiMDZ4TXUzZFolISM2NyQ3JCQiMGw3Oiskem1IISM3JCIwJnpPJVwmUndXISM2NyQkIjA3I0hkcnJtSCEjNyQiMFElZTVtUylbJSEjNjckNyQkIjBAUig0V3JtSCEjNyQiMEpjXS9PKSlbJSEjNjckJCIwNyNIZHJybUghIzckIjBRJWU1bVMpWyUhIzY3JDckJCIwQFIoNFdybUghIzckIjBKY10vTykpWyUhIzY3JCQiMFAoPlpyam1IISM3JCIwM3EoNFA1LFghIzY3JDckJCIwRkZSL09tJ0ghIzckIjBuV2RmdzddJSEjNjckJCIwUCg+WnJqbUghIzckIjAzcSg0UDUsWCEjNjckNyQkIjBGRlIvT20nSCEjNyQiMG5XZGZ3N10lISM2NyQkIjBHTyFIS2VtSCEjNyQiMCJbPjxXbzRYISM2NyQ3JCQiMCIzbUdITXVIISM3JCIwI1FYTyl5Y1UkISM2NyQkIi9yYFhrSHVIISM2JCIwblhsQipRSk0hIzY3JDckJCIvcmBYa0h1SCEjNiQiMG5YbEIqUUpNISM2NyQkIi9lcD5fSHVIISM2JCIvTi44QWFKTSEjNTckNyQkIjAvIT1xYT51SCEjNyQiMC5Nc3lIUVckISM2NyQkIi9lcD5fSHVIISM2JCIvTi44QWFKTSEjNTckNyQkIjAvIT1xYT51SCEjNyQiMC9Nc3lIUVckISM2NyQkIjAjSFIjZiI+dUghIzckIjBKYSdSXUpXTSEjNjckNyQkIjAseE0hWzR1SCEjNyQiL0MjekxxaVgkISM1NyQkIjAjSFIjZiI+dUghIzckIjBKYSdSXUpXTSEjNjckNyQkIjAseE0hWzR1SCEjNyQiL0MjekxxaVgkISM1NyQkIjBKKFsnSCkzdUghIzckIjAlZW0ubzNkTSEjNjckNyQkIi9ebVdXKlIoSCEjNiQiMHc1JykpM3JvTSEjNjckJCIwSihbJ0gpM3VIISM3JCIwJWVtLm8zZE0hIzY3JDckJCIvXm1XVypSKEghIzYkIjB3NScpKTNyb00hIzY3JCQiMCZvSkpgKVIoSCEjNyQiMDQiPjJ2JilwTSEjNjckNyQkIjAwI3AlUiUqUShIISM3JCIwNypIUjk6IlskISM2NyQkIjAmb0pKYClSKEghIzckIjA0Ij4ydiYpcE0hIzY3JDckJCIwMCNwJVIlKlEoSCEjNyQiMDcqSFI5OiJbJCEjNjckJCIwJz1wKHAjKVEoSCEjNyQiMCM9alpyaSNbJCEjNjckNyQkIjAkKkgrbCV6dEghIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwJz1wKHAjKVEoSCEjNyQiMCM9alpyaSNbJCEjNjckNyQkIjAkKkgrbCV6dEghIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwNGs7UiF5dEghIzckIjAmemtQZFImXCQhIzY3JDckJCIvWScqNF9wdEghIzYkIjAlZW5TRC4xTiEjNjckJCIwNGs7UiF5dEghIzckIjAmemtQZFImXCQhIzY3JDckJCIvWScqNF9wdEghIzYkIjAlZW5TRC4xTiEjNjckJCIwUHNBVHlPKEghIzckIjBOQC5HaiIzTiEjNjckNyQkIjAoZkdzZ2Z0SCEjNyQiL1VPIjR0JT1OISM1NyQkIjBQc0FUeU8oSCEjNyQiME5ALkdqIjNOISM2NyQ3JCQiMChmR3NnZnRIISM3JCIvVU8iNHQlPU4hIzU3JCQiMF8kcGRuZHRIISM3JCIwLylcInlINF8kISM2NyQ3JCQiMC8hM1FzXHRIISM3JCIwY18/azg0YCQhIzY3JCQiMF8kcGRuZHRIISM3JCIwLylcInlINF8kISM2NyQ3JCQiMC8hM1FzXHRIISM3JCIwY18/azg0YCQhIzY3JCQiMDZIJEdhWnRIISM3JCIwTyEqKVJfcExOISM2NyQ3JCQiMFlVXnEpUnRIISM3JCIwIzR1Iz5hTGEkISM2NyQkIjA2SCRHYVp0SCEjNyQiME8hKilSX3BMTiEjNjckNyQkIjBZVV5xKVJ0SCEjNyQiMCM0dSM+YUxhJCEjNjckJCIwI3BwQFdQdEghIzckIjBUZE1tZmthJCEjNjckNyQkIjBRdDdaK0woSCEjNyQiMEdITXUlemJOISM2NyQkIjAjcHBAV1B0SCEjNyQiMFRkTW1ma2EkISM2NyQ3JCQiMFF0N1orTChIISM3JCIwR0hNdSV6Yk4hIzY3JCQiMDsneU5QRnRIISM3JCIwdFknZUlBZk4hIzY3JDckJCIwUiMzUEQ/dEghIzckIjBrPFRITiNvTiEjNjckJCIwOyd5TlBGdEghIzckIjB0WSdlSUFmTiEjNjckNyQkIjBSIzNQRD90SCEjNyQiMGs8VEhOI29OISM2NyQkIjAsQTZQdEooSCEjNyQiL1Z4QmEpPmQkISM1NyQ3JCQiMC9kJyoqWzV0SCEjNyQiLjFbJWVuIWUkISIqNyQkIjAsQTZQdEooSCEjNyQiL1Z4QmEpPmQkISM1NyQ3JCQiMC9kJyoqWzV0SCEjNyQiLjFbJWVuIWUkISIqNyQkIjBLLlRLdEkoSCEjNyQiMDkoUXFudSVlJCEjNjckNyQkIjBLNSFldit0SCEjNyQiME8lXCZSO0pmJCEjNjckJCIwSy5US3RJKEghIzckIjA5KFFxbnUlZSQhIzY3JDckJCIwSzUhZXYrdEghIzckIjBPJVwmUjtKZiQhIzY3JCQiLW8lZnRIKEghIiokIjB1WCcpNDJ2ZiQhIzY3JDckJCIwdTBBXjVIKEghIzckIjBzIz1ZcGIwTyEjNjckJCItbyVmdEgoSCEiKiQiMHVYJyk0MnZmJCEjNjckNyQkIjB1MEFeNUgoSCEjNyQiMHMjPVlwYjBPISM2NyQkIjB1ajU9dUcoSCEjNyQiMEglRzlrRTVPISM2NyQ3JCQiMCRlYGZQIkcoSCEjNyQiMDNyb1woKnpoJCEjNjckJCIwdWo1PXVHKEghIzckIjBIJUc5a0U1TyEjNjckNyQkIjAkZWBmUCJHKEghIzckIjAzcm9cKCp6aCQhIzY3JCQiMEskWyIzdkYoSCEjNyQiMDgjKUhzQ0lpJCEjNjckNyQkIjApcFQrdHJzSCEjNyQiMFdmdi9RL2okISM2NyQkIjBLJFsiM3ZGKEghIzckIjA4IylIc0NJaSQhIzY3JDckJCIwKXBUK3Ryc0ghIzckIjBXZnYvUS9qJCEjNjckJCIwLWtpSHdFKEghIzckIjBDJ3BCP3lOTyEjNjckNyQkIjBeeUs4QEUoSCEjNyQiL3lDKWZ5R2skISM1NyQkIjAta2lId0UoSCEjNyQiMEMncEI/eU5PISM2NyQ3JCQiMF55SzhARShIISM3JCIveUMpZnlHayQhIzU3JCQiMGBpSCN5ZHNIISM3JCIwLGhVS1EmW08hIzY3JDckJCIwb1pmREREKEghIzckIjA7TypbIj5gbCQhIzY3JCQiMGBpSCN5ZHNIISM3JCIwLGhVS1EmW08hIzY3JDckJCIwb1pmREREKEghIzckIjA7TypbIj5gbCQhIzY3JCQiMCVvdmcnekMoSCEjNyQiMDk3dGkkSGhPISM2NyQ3JCQiME10eW1IQyhIISM3JCIwX0MnKnBmeG0kISM2NyQkIjAlb3ZnJ3pDKEghIzckIjA5N3RpJEhoTyEjNjckNyQkIjBNdHltSEMoSCEjNyQiMF9DJypwZnhtJCEjNjckJCIwND5tIT1Rc0ghIzckIjBLZUQlei91TyEjNjckNyQkIjBoYSdvVkxzSCEjNyQiMClHSl0tPyFvJCEjNjckJCIwND5tIT1Rc0ghIzckIjBLZUQlei91TyEjNjckNyQkIjBoYSdvVkxzSCEjNyQiMClHSl0tPyFvJCEjNjckJCIwUilSaVVHc0ghIzckIjBacVNFLG9vJCEjNjckNyQkIjBOamhOUkEoSCEjNyQiMEMsNSEzayNwJCEjNjckJCIwUilSaVVHc0ghIzckIjBacVNFLG9vJCEjNjckNyQkIjBOamhOUkEoSCEjNyQiMEMsNSEzayNwJCEjNjckJCIwTVZLLSg9c0ghIzckIjBQL3VnYCYqcCQhIzY3JDckJCIwWCNvSFk5c0ghIzckIi8nKm9eODMwUCEjNTckJCIwTVZLLSg9c0ghIzckIjBQL3VnYCYqcCQhIzY3JDckJCIwWCNvSFk5c0ghIzckIi8nKm9eODMwUCEjNTckJCIwXyoqPTQhNHNIISM3JCIwWWNQJ1xJN1AhIzY3JDckJCIvJFwhKj1dPyhIISM2JCIwJ3pQLT5fPFAhIzY3JCQiMF8qKj00ITRzSCEjNyQiMFljUCdcSTdQISM2NyQ3JCQiLyRcISo9XT8oSCEjNiQiMCd6UC0+XzxQISM2NyQkIjAtIlFqTSo+KEghIzckIjAjUTZcYDBEUCEjNjckNyQkIjA+azQuYz4oSCEjNyQiMEttSVhpKkhQISM2NyQkIjAtIlFqTSo+KEghIzckIjAjUTZcYDBEUCEjNjckNyQkIjA+azQuYz4oSCEjNyQiMEttSVhpKkhQISM2NyQkIjAxcyFScio9KEghIzckIjAqei5mWiF5dCQhIzY3JDckJCIvJilIY0AnPShIISM2JCIwcGFQKy5DdSQhIzY3JCQiMDFzIVJyKj0oSCEjNyQiMCp6LmZaIXl0JCEjNjckNyQkIi8mKUhjQCc9KEghIzYkIjBwYVArLkN1JCEjNjckJCIwMT1ZNiw9KEghIzckIjB4IlwyS2JdUCEjNjckNyQkIjBVcj9jbzwoSCEjNyQiMDBWV2JWW3YkISM2NyQkIjAxPVk2LD0oSCEjNyQiMHgiXDJLYl1QISM2NyQ3JCQiMFVyP2NvPChIISM3JCIwMFZXYlZbdiQhIzY3JCQiLzlEJFIwPChIISM2JCIwazVUbytMdyQhIzY3JDckJCIwIj5TXV9uckghIzckIjBUSl41JUduUCEjNjckJCIvOUQkUjA8KEghIzYkIjBrNVRvK0x3JCEjNjckNyQkIjAiPlNdX25ySCEjNyQiMFRKXjUlR25QISM2NyQkIjA+eiNwKjQ7KEghIzckIi8nW3I/Wmd4JCEjNTckNyQkIjBDa2pAI2VySCEjNyQiMHg+ZWxDKHpQISM2NyQkIjA+eiNwKjQ7KEghIzckIi8nW3I/Wmd4JCEjNTckNyQkIjBDa2pAI2VySCEjNyQiMHg+ZWxDKHpQISM2NyQkIjBPRGIlW15ySCEjNyQiMCkzYm5Geil5JCEjNjckNyQkIjAuJ1JpJSpbckghIzckIjA4M2w/bEB6JCEjNjckJCIwT0RiJVteckghIzckIjApM2JuRnopeSQhIzY3JDckJCIwLidSaSUqW3JIISM3JCIwODNsP2xAeiQhIzY3JCQiMCNHSzwrVXJIISM3JCIwQCNHIVFQOiFRISM2NyQ3JCQiL3JdJSlwUnJIISM2JCIwXCc+ZGRnL1EhIzY3JCQiMCNHSzwrVXJIISM3JCIwQCNHIVFQOiFRISM2NyQ3JCQiL3JdJSlwUnJIISM2JCIwXCc+ZGRnL1EhIzY3JCQiMGxrX1tEOChIISM3JCIwKDRXVjVHOVEhIzY3JDckJCIwXjNJeS84KEghIzckIjAmWyl5SVlxIlEhIzY3JCQiMGxrX1tEOChIISM3JCIwKDRXVjVHOVEhIzY3JDckJCIwXjNJeS84KEghIzckIjAmWyl5SVlxIlEhIzY3JCQiMCdbVls3QnJIISM3JCIwQGsqZlAtRlEhIzY3JDckJCIwSE95JkdAckghIzckIjBAdCZlb1tIUSEjNjckJCIwJ1tWWzdCckghIzckIjBAaypmUC1GUSEjNjckNyQkIjBIT3kmR0BySCEjNyQiMEB0JmVvW0hRISM2NyQkIjAoPUcwdDhySCEjNyQiMCpwI1tgbChSUSEjNjckNyQkIjB5J2UxNzdySCEjNyQiMGRoIzR1Iz4lUSEjNjckJCIwKD1HMHQ4ckghIzckIjAqcCNbYGwoUlEhIzY3JDckJCIweSdlMTc3ckghIzckIjBkaCM0dSM+JVEhIzY3JCQiMChSPWBPL3JIISM3JCIvZFZ3al1fUSEjNTckNyQkIjBqSHgjKUg1KEghIzckIjAkKlwqZnpPYVEhIzY3JCQiMChSPWBPL3JIISM3JCIvZFZ3al1fUSEjNTckNyQkIjBqSHgjKUg1KEghIzckIjAkKlwqZnpPYVEhIzY3JCQiMF5RS0hdNChIISM3JCIwdnI3R1lfJ1EhIzY3JDckJCIwVSQqPXNRNChIISM3JCIwSFExXjNvJ1EhIzY3JCQiMF5RS0hdNChIISM3JCIwdnI3R1lfJ1EhIzY3JDckJCIwVSQqPXNRNChIISM3JCIwSFExXjNvJ1EhIzY3JCQiMDQsPEFkMyhIISM3JCIwUlQ4RSYpeihRISM2NyQ3JCQiMCd5dyYpeSUzKEghIzckIjBsRTgxXCN6USEjNjckJCIwNCw8QWQzKEghIzckIjBSVDhFJil6KFEhIzY3JDckJCIwJ3l3Jil5JTMoSCEjNyQiMGxFODFcI3pRISM2NyQkIjAlWyc0V2syKEghIzckIjA6ciozTHMhKlEhIzY3JDckJCIwQFk7S2QyKEghIzckIjAsOj9oKm8iKlEhIzY3JCQiMCVbJzRXazIoSCEjNyQiMDpyKjNMcyEqUSEjNjckNyQkIjBAWTtLZDIoSCEjNyQiMCw6P2gqbyIqUSEjNjckJCIwVmBkJT5ucUghIzckIjBMejVXZ00hUiEjNjckNyQkIjAmNGtDcW1xSCEjNyQiMFAuRjtJVCFSISM2NyQkIjBWYGQlPm5xSCEjNyQiMEx6NVdnTSFSISM2NyQ3JCQiMCY0a0NxbXFIISM3JCIwUC5GO0lUIVIhIzY3JCQiMC1DJ1EoejAoSCEjNyQiMF5tJVxtPjtSISM2NyQ3JCQiMFVDdCpwZHFIISM3JCIwdCJSODJkO1IhIzY3JCQiMC1DJ1EoejAoSCEjNyQiMF5tJVxtPjtSISM2NyQ3JCQiMFVDdCpwZHFIISM3JCIwdCJSODJkO1IhIzY3JCQiMDk+ZSJ5W3FIISM3JCIwJTM9WT4kKkdSISM2NyQ3JCQiME8lM09zW3FIISM3JCIwNCEzazcsSFIhIzY3JCQiMDk+ZSJ5W3FIISM3JCIwJTM9WT4kKkdSISM2NyQ3JCQiME8lM09zW3FIISM3JCIwNCEzazcsSFIhIzY3JCQiMGJbKXlJWXFIISM3JCIwbSEqNGdvQiRSISM2NyQ3JCQiMDN0JXlGQXlIISM3JCIwJlEsWWVBd0ghIzY3JCQiMEYwUDNjInlIISM3JCIvWnc2JUhOKUghIzU3JDckJCIwRjBQM2MieUghIzckIi9adzYlSE4pSCEjNTckJCIwKillVzVhInlIISM3JCIwRW87aFxQKUghIzY3JDckJCIwNiJIREcveUghIzckIjAxYEMnKnBmKkghIzY3JCQiMCopZVc1YSJ5SCEjNyQiMEVvO2hcUClIISM2NyQ3JCQiMDYiSERHL3lIISM3JCIwMWBDJypwZipIISM2NyQkIi80Vyt2LnlIISM2JCIwPilcWlNjJypIISM2NyQ3JCQiMDAhM0gqSHooSCEjNyQiMFVUSl41JTNJISM2NyQkIi80Vyt2LnlIISM2JCIwPilcWlNjJypIISM2NyQ3JCQiMDAhM0gqSHooSCEjNyQiMFVUSl41JTNJISM2NyQkIjAvZigpR0B6KEghIzckIjBHQGBBeCQ0SSEjNjckNyQkIjA8ZlZSPHkoSCEjNyQiMHlIUTFeMy0kISM2NyQkIjAvZigpR0B6KEghIzckIjBHQGBBeCQ0SSEjNjckNyQkIjA8ZlZSPHkoSCEjNyQiMHlIUTFeMy0kISM2NyQkIjBSeiJvYSF5KEghIzckIjAwJTRcIio9QUkhIzY3JDckJCIvQigqPl9xeEghIzYkIjA5PVhoIkhMSSEjNjckJCIwUnoib2EheShIISM3JCIwMCU0XCIqPUFJISM2NyQ3JCQiL0IoKj5fcXhIISM2JCIwOT1YaCJITEkhIzY3JCQiMCc9eFArcHhIISM3JCIwIykpekApKipcLiQhIzY3JDckJCIwdCRSLU1meEghIzckIi9sP2xAdFhJISM1NyQkIjAnPXhQK3B4SCEjNyQiMCMpKXpAKSoqXC4kISM2NyQ3JCQiMHQkUi1NZnhIISM3JCIvbD9sQHRYSSEjNTckJCIwVygzJCpcZHhIISM3JCIwMyx4RDR5LyQhIzY3JDckJCIwIipILyU+W3hIISM3JCIwJ1sqZXJzImVJISM2NyQkIjBXKDMkKlxkeEghIzckIjAzLHhENHkvJCEjNjckNyQkIjAiKkgvJT5beEghIzckIjAnWyplcnMiZUkhIzY3JCQiL2xZTC5ZeEghIzYkIjAnZiIqZXVoZ0khIzY3JDckJCIwZTZcJDNQeEghIzckIjBBJGVtS2hxSSEjNjckJCIvbFlMLll4SCEjNiQiMCdmIipldWhnSSEjNjckNyQkIjBlNlwkM1B4SCEjNyQiMEEkZW1LaHFJISM2NyQkIjAoKjQhZmdNeEghIzckIjB3Pl5VQ00yJCEjNjckNyQkIjAiKT4zM2dzKEghIzckIjBlcnMiUTAkMyQhIzY3JCQiMCgqNCFmZ014SCEjNyQiMHc+XlVDTTIkISM2NyQ3JCQiMCIpPjMzZ3MoSCEjNyQiMGVycyJRMCQzJCEjNjckJCIwRVBaO0tzKEghIzckIjBjI0dzLEInMyQhIzY3JDckJCIwI2YtIW9ccihIISM3JCIwJSpmek8lXCY0JCEjNjckJCIwRVBaO0tzKEghIzckIjBjI0dzLEInMyQhIzY3JDckJCIwI2YtIW9ccihIISM3JCIwJSpmek8lXCY0JCEjNjckJCIwSFI+bD1yKEghIzckIjAwbGlwTSEqNCQhIzY3JDckJCIwUXMpRydScShIISM3JCIvJFsnPVwkejUkISM1NyQkIjBIUj5sPXIoSCEjNyQiMDBsaXBNISo0JCEjNjckNyQkIjBRcylHJ1JxKEghIzckIi8kWyc9XCR6NSQhIzU3JCQiMDsjZjtiK3hIISM3JCIwcnAqNCFRPTYkISM2NyQ3JCQiMCUzLEQqSHAoSCEjNyQiMG1PJHBhUD9KISM2NyQkIjA7I2Y7Yit4SCEjNyQiMHJwKjQhUT02JCEjNjckNyQkIjAlMyxEKkhwKEghIzckIjBtTyRwYVA/SiEjNjckJCIwJykpZmNGKm8oSCEjNyQiMFc/LDdTWTckISM2NyQ3JCQiMGFJKW8wI28oSCEjNyQiMC1EKy07RzgkISM2NyQkIjAnKSlmY0YqbyhIISM3JCIwVz8sN1NZNyQhIzY3JDckJCIwYUkpbzAjbyhIISM3JCIwLUQrLTtHOCQhIzY3JCQiMDhCQVAheXdIISM3JCIwaXJlLVR1OCQhIzY3JDckJCIwVCpcZTpyd0ghIzckIjBSODJkY185JCEjNjckJCIwOEJBUCF5d0ghIzckIjBpcmUtVHU4JCEjNjckNyQkIjBUKlxlOnJ3SCEjNyQiMFI4MmRjXzkkISM2NyQkIjBHLixPb20oSCEjNyQiMFAtIVEyQ11KISM2NyQ3JCQiL24mPipHZ3dIISM2JCIwdiw5NyhwZEohIzY3JCQiMEcuLE9vbShIISM3JCIwUC0hUTJDXUohIzY3JDckJCIvbiY+Kkdnd0ghIzYkIjB2LDk3KHBkSiEjNjckJCIweDUxc2NsKEghIzckIjBhQGBEUkk7JCEjNjckNyQkIjB2JSp5YyVcd0ghIzckIjA2ITRzdzhxSiEjNjckJCIweDUxc2NsKEghIzckIjBhQGBEUkk7JCEjNjckNyQkIjB2JSp5YyVcd0ghIzckIjA2ITRzdzhxSiEjNjckJCIwOz0mXGFXd0ghIzckIjBEJVEiZk9lPCQhIzY3JDckJCIwJD5CJmUnUXdIISM3JCIwWnlGQXlEPSQhIzY3JCQiMDs9JlxhV3dIISM3JCIwRCVRImZPZTwkISM2NyQ3JCQiMCQ+QiZlJ1F3SCEjNyQiMFp5RkF5RD0kISM2NyQkIjBgeGdhTWooSCEjNyQiMHMpZVtGaik9JCEjNjckNyQkIjAjcF1UKnlpKEghIzckIjAkb1l0KD1dPiQhIzY3JCQiMGB4Z2FNaihIISM3JCIwcyllW0ZqKT0kISM2NyQ3JCQiMCNwXVQqeWkoSCEjNyQiMCRvWXQoPV0+JCEjNjckJCIwKnpENFNBd0ghIzckIjBPUy10Rjk/JCEjNjckNyQkIjAtM29qcmgoSCEjNyQiMD5iVEtmdT8kISM2NyQkIjAqekQ0U0F3SCEjNyQiME9TLXRGOT8kISM2NyQ3JCQiMC0zb2pyaChIISM3JCIwPmJUS2Z1PyQhIzY3JCQiMDlXdCRRNndIISM3JCIwZlI9YUBVQCQhIzY3JDckJCIwOSQzb1kxd0ghIzckIjBiVlsoKSoqKT5LISM2NyQkIjA5V3QkUTZ3SCEjNyQiMGZSPWFAVUAkISM2NyQ3JCQiMDkkM29ZMXdIISM3JCIwYlZbKCkqKik+SyEjNjckJCIwKnkncC0vZyhIISM3JCIuJz0lPjlxQSQhIio3JDckJCIwWVBfLmVmKEghIzckIjAiPmBEL01LSyEjNjckJCIwKnkncC0vZyhIISM3JCIuJz0lPjlxQSQhIio3JDckJCIwWVBfLmVmKEghIzckIjAiPmBEL01LSyEjNjckJCIvIlsoelgqZShIISM2JCIweSkzI28wKVJLISM2NyQ3JCQiMGlJa3ReZShIISM3JCIwRj9pKDR5V0shIzY3JCQiLyJbKHpYKmUoSCEjNiQiMHkpMyNvMClSSyEjNjckNyQkIjBpSWt0XmUoSCEjNyQiMEY/aSg0eVdLISM2NyQkIjAsVScqWyZ5dkghIzckIjB3QlwtJ2ZfSyEjNjckNyQkIjBiOShvZHV2SCEjNyQiMGozcF9Ac0QkISM2NyQkIjAsVScqWyZ5dkghIzckIjB3QlwtJ2ZfSyEjNjckNyQkIjBiOShvZHV2SCEjNyQiMGozcF9Ac0QkISM2NyQkIi84ZGVubnZIISM2JCIwPUhsQCZRbEshIzY3JDckJCIwMCVSTCxrdkghIzckIjAqcGZ4P21wSyEjNjckJCIvOGRlbm52SCEjNiQiMD1IbEAmUWxLISM2NyQ3JCQiMDAlUkwsa3ZIISM3JCIwKnBmeD9tcEshIzY3JCQiMHhQTVFvYihIISM3JCIwRFJvRXQieUshIzY3JDckJCIwXjpsI1tgdkghIzckIjBOJkdHRTUjRyQhIzY3JCQiMHhQTVFvYihIISM3JCIwRFJvRXQieUshIzY3JDckJCIwXjpsI1tgdkghIzckIjBOJkdHRTUjRyQhIzY3JCQiMCk+VmouWXZIISM3JCIvJVwleSwnNEgkISM1NyQ3JCQiLzc2XClIYShIISM2JCIwcnQqeUphJUgkISM2NyQkIjApPlZqLll2SCEjNyQiLyVcJXksJzRIJCEjNTckNyQkIi83NlwpSGEoSCEjNiQiMHJ0KnlKYSVIJCEjNjckJCIvWCdlcF9gKEghIzYkIjA6JCkqZmZ1LkwhIzY3JDckJCIwKW9sKD5EYChIISM3JCIwMmknSFApcEkkISM2NyQkIi9YJ2VwX2AoSCEjNiQiMDokKSpmZnUuTCEjNjckNyQkIjApb2woPkRgKEghIzckIjAyaSdIUClwSSQhIzY3JCQiMDY8MVFYXyhIISM3JCIwZT49aElsSiQhIzY3JDckJCIwKmVJczNBdkghIzckIjBWXS5HQyU+TCEjNjckJCIwNjwxUVhfKEghIzckIjBlPj1oSWxKJCEjNjckNyQkIjAqZUlzM0F2SCEjNyQiMFZdLkdDJT5MISM2NyQkIjBGVV9UUV4oSCEjNyQiMGoxPTk5JEhMISM2NyQ3JCQiMCdmQ3JvNnZIISM3JCIwelE1JFsnPUwkISM2NyQkIjBGVV9UUV4oSCEjNyQiMGoxPTk5JEhMISM2NyQ3JCQiMCdmQ3JvNnZIISM3JCIwelE1JFsnPUwkISM2NyQkIjAkNGcoekpdKEghIzckIjAuLm9iJzRVTCEjNjckNyQkIjAzIlwjPjhdKEghIzckIjA6RjxRMFZNJCEjNjckJCIwJDRnKHpKXShIISM3JCIwLi5vYic0VUwhIzY3JDckJCIwMyJcIz44XShIISM3JCIwOkY8UTBWTSQhIzY3JCQiMCQpPm9fRFwoSCEjNyQiMCgpMydmeShbTiQhIzY3JDckJCIvZDBOKTRcKEghIzYkIjBeOkMkZnVjTCEjNjckJCIwJCk+b19EXChIISM3JCIwKCkzJ2Z5KFtOJCEjNjckNyQkIi9kME4pNFwoSCEjNiQiMF46QyRmdWNMISM2NyQkIjApMyM9Zz5bKEghIzckIjAnNG9gIWV3TyQhIzY3JDckJCIwLEskKXoxWyhIISM3JCIwKFE1JFsnPXBMISM2NyQkIjApMyM9Zz5bKEghIzckIjAnNG9gIWV3TyQhIzY3JDckJCIwLEskKXoxWyhIISM3JCIwKFE1JFsnPXBMISM2NyQkIjA+Uy4tOVooSCEjNyQiME55aTlQL1EkISM2NyQ3JCQiME9mKzMvWihIISM3JCIwQiN6THFpIlEkISM2NyQkIjA+Uy4tOVooSCEjNyQiME55aTlQL1EkISM2NyQ3JCQiME9mKzMvWihIISM3JCIwQiN6THFpIlEkISM2NyQkIjBpPSl6KDNZKEghIzckIjAlb2dYXkAkUiQhIzY3JDckJCIwRyM0eTtndUghIzckIjBmIVslZW5TUiQhIzY3JCQiMGk9KXooM1koSCEjNyQiMCVvZ1heQCRSJCEjNjckNyQkIjBHIzR5O2d1SCEjNyQiMGYhWyVlblNSJCEjNjckJCIwWmhFKVFddUghIzckIjAlUiZSLyMqZlMkISM2NyQ3JCQiMEQ2W2YqXHVIISM3JCIwJipvXjgzbFMkISM2NyQkIjBaaEUpUV11SCEjNyQiMCVSJlIvIypmUyQhIzY3JDckJCIwRDZbZipcdUghIzckIjAmKm9eODNsUyQhIzY3JCQiLypwOksqUnVIISM2JCIuQloneXc9TSEiKjckNyQkIjBaZUwjeVJ1SCEjNyQiMEpkZW9bKj1NISM2NyQkIi8qcDpLKlJ1SCEjNiQiLkJaJ3l3PU0hIio3JDckJCIwWmVMI3lSdUghIzckIjBKZGVvWyo9TSEjNjckJCIwIjNtR0hNdUghIzckIjAjUVhPKXljVSQhIzY3JDckJCIwTSZHR0U1IylIISM3JCIvN1d5REx1RCEjNTckJCIwazQpeigqKT4pSCEjNyQiMDxQKCp5SmFlIyEjNjckNyQkIjBrNCl6KCopPilIISM3JCIwPFAoKnlKYWUjISM2NyQkIjBOQSRSZyk+KUghIzckIjBoMG1pMGVlIyEjNjckNyQkIjA7TkVyaj0pSCEjNyQiMGBEL01zeWYjISM2NyQkIjBOQSRSZyk+KUghIzckIjBoMG1pMGVlIyEjNjckNyQkIjA7TkVyaj0pSCEjNyQiMGBEL01zeWYjISM2NyQkIjB3MnQiZSY9KUghIzckIjBuIyl5c2onKWYjISM2NyQ3JCQiMCRcc24hUTwpSCEjNyQiMCpRNiIqR0o1RSEjNjckJCIwdzJ0ImUmPSlIISM3JCIwbiMpeXNqJylmIyEjNjckNyQkIjAkXHNuIVE8KUghIzckIjAqUTYiKkdKNUUhIzY3JCQiMCNvX2NncyIpSCEjNyQiMFJPLU4/OmgjISM2NyQ3JCQiMHQ7YiVHaCIpSCEjNyQiMEQtPVdgRmkjISM2NyQkIjAjb19jZ3MiKUghIzckIjBSTy1OPzpoIyEjNjckNyQkIjB0O2IlR2giKUghIzckIjBELT1XYEZpIyEjNjckJCIvMVpkbmYiKUghIzYkIjA0IzQjXHZWaSMhIzY3JDckJCIwLjpBLylbIilIISM3JCIwaCFcIypSPk5FISM2NyQkIi8xWmRuZiIpSCEjNiQiMDQjNCNcdlZpIyEjNjckNyQkIjAuOkEvKVsiKUghIzckIjBoIVwjKlI+TkUhIzY3JCQiMDknMzp6WSIpSCEjNyQiMCQ+bHAiSHNqIyEjNjckNyQkIjB6VWhsajgpSCEjNyQiMCgqeUphTXdrIyEjNjckJCIwOSczOnpZIilIISM3JCIwJD5scCJIc2ojISM2NyQ3JCQiMHpVaGxqOClIISM3JCIwKCp5SmFNd2sjISM2NyQkIjAtKEhHJlI4KUghIzckIjBNbmpRIjNdRSEjNjckNyQkIjBwbV5vUjcpSCEjNyQiMExuUTR2K20jISM2NyQkIjAtKEhHJlI4KUghIzckIjBNbmpRIjNdRSEjNjckNyQkIjBwbV5vUjcpSCEjNyQiMExuUTR2K20jISM2NyQkIjA0NFBmNjcpSCEjNyQiMF5ASjpLSG0jISM2NyQ3JCQiMF5rdjc7NilIISM3JCIwcGJYazpEbiMhIzY3JCQiMDQ0UGY2NylIISM3JCIwXkBKOktIbSMhIzY3JDckJCIwXmt2Nzs2KUghIzckIjBwYlhrOkRuIyEjNjckJCIwZXkuNiUzIilIISM3JCIwZlNIWiJ5dkUhIzY3JDckJCIwJUhrIylIKjQpSCEjNyQiMDBXXz5jXG8jISM2NyQkIjBleS42JTMiKUghIzckIjBmU0haInl2RSEjNjckNyQkIjAlSGsjKUgqNClIISM3JCIwMFdfPmNcbyMhIzY3JCQiMGBrbDJkNClIISM3JCIvcFNeJEgnKW8jISM1NyQ3JCQiMFIlUVgtKDMpSCEjNyQiMFRLZnUnUihwIyEjNjckJCIwYGtsMmQ0KUghIzckIi9wU14kSCcpbyMhIzU3JDckJCIwUiVRWC0oMylIISM3JCIwVEtmdSdSKHAjISM2NyQkIjBkMGlbSTMpSCEjNyQiMCVmJnohZVosRiEjNjckNyQkIjBRSGgienUhKUghIzckIjB4P21IUCk0RiEjNjckJCIwZDBpW0kzKUghIzckIjAlZiZ6IWVaLEYhIzY3JDckJCIwUUhoInp1ISlIISM3JCIweD9tSFApNEYhIzY3JCQiL1ZmVFZxISlIISM2JCIwYk9fJDNLOUYhIzY3JDckJCIwJDR2IypmaSEpSCEjNyQiMDg0dCV5RkFGISM2NyQkIi9WZlRWcSEpSCEjNiQiMGJPXyQzSzlGISM2NyQ3JCQiMCQ0diMqZmkhKUghIzckIjA4NHQleUZBRiEjNjckJCIwRVt0ankwKUghIzckIjBRMjBYa3JzIyEjNjckNyQkIjBBJVtzV10hKUghIzckIjBcKCp6Uj1adCMhIzY3JCQiMEVbdGp5MClIISM3JCIwUTIwWGtycyMhIzY3JDckJCIwQSVbc1ddISlIISM3JCIwXCgqelI9WnQjISM2NyQkIjBuXUdQYC8pSCEjNyQiL2h1Ym0rU0YhIzU3JDckJCIwXiMqUk4kUSEpSCEjNyQiMCZlb1sqZXJ1IyEjNjckJCIwbl1HUGAvKUghIzckIi9odWJtK1NGISM1NyQ3JCQiMF4jKlJOJFEhKUghIzckIjAmZW9bKmVydSMhIzY3JCQiMEBzXmFHLilIISM3JCIwUlguWVpHdiMhIzY3JDckJCIwKUd3TUVFISlIISM3JCIwQHUkKlwqZmZGISM2NyQkIjBAc15hRy4pSCEjNyQiMFJYLllaR3YjISM2NyQ3JCQiMClHd01FRSEpSCEjNyQiMEB1JCpcKmZmRiEjNjckJCIwNiRSXlQ/ISlIISM3JCIwUW5PKG9vbEYhIzY3JDckJCIweWdSSlUsKUghIzckIjBkaSswUz94IyEjNjckJCIwNiRSXlQ/ISlIISM3JCIwUW5PKG9vbEYhIzY3JDckJCIweWdSSlUsKUghIzckIjBkaSswUz94IyEjNjckJCIvQkYhPiEzISlIISM2JCIwXiJwKipbX3lGISM2NyQ3JCQiMCwoKXpRQSspSCEjNyQiMCQ0disxWyV5IyEjNjckJCIvQkYhPiEzISlIISM2JCIwXiJwKipbX3lGISM2NyQ3JCQiMCwoKXpRQSspSCEjNyQiMCQ0disxWyV5IyEjNjckJCIwS0EoZm0mKnpIISM3JCIwMzZeYWg4eiMhIzY3JDckJCIwYW92JkchKnpIISM3JCIwSFI5OkBweiMhIzY3JCQiMEtBKGZtJip6SCEjNyQiMDM2XmFoOHojISM2NyQ3JCQiMGFvdiZHISp6SCEjNyQiMEhSOTpAcHojISM2NyQkIjAkNFllTiQpekghIzckIjBmUFMibz4vRyEjNjckNyQkIjB5Kyg9UHl6SCEjNyQiMGxGQHFoJDRHISM2NyQkIjAkNFllTiQpekghIzckIjBmUFMibz4vRyEjNjckNyQkIjB5Kyg9UHl6SCEjNyQiMGxGQHFoJDRHISM2NyQkIjAkKSo0IykzcnpIISM3JCIwJT1hPzIuPEchIzY3JDckJCIwQjUuKFxtekghIzckIjAsO0dELT0jRyEjNjckJCIwJCkqNCMpM3J6SCEjNyQiMCU9YT8yLjxHISM2NyQ3JCQiMEI1LihcbXpIISM3JCIwLDtHRC09I0chIzY3JCQiMHVfIkgnKWV6SCEjNyQiLycqUXBLJylIRyEjNTckNyQkIjBIUi5oWSZ6SCEjNyQiMFAvTiFHQ01HISM2NyQkIjB1XyJIJyllekghIzckIi8nKlFwSycpSEchIzU3JDckJCIwSFIuaFkmekghIzckIjBQL04hR0NNRyEjNjckJCIwKnBdKnptJXpIISM3JCIwMlU0WSVwVUchIzY3JDckJCIwUjJ5akclekghIzckIjB1Iz5hTG9ZRyEjNjckJCIwKnBdKnptJXpIISM3JCIwMlU0WSVwVUchIzY3JDckJCIwUjJ5akclekghIzckIjB1Iz5hTG9ZRyEjNjckJCIwemcmKVFYJHpIISM3JCIwb2EqNFZfYkchIzY3JDckJCIwb2cnXDVKekghIzckIi82KVshUjdmRyEjNTckJCIwemcmKVFYJHpIISM3JCIwb2EqNFZfYkchIzY3JDckJCIwb2cnXDVKekghIzckIi82KVshUjdmRyEjNTckJCIwWCo+JlJDI3pIISM3JCIwbSwrI0dOb0chIzY3JDckJCIwbnBcJVE+ekghIzckIjBZcGJYazooRyEjNjckJCIwWCo+JlJDI3pIISM3JCIwbSwrI0dOb0chIzY3JDckJCIwbnBcJVE+ekghIzckIjBZcGJYazooRyEjNjckJCIwdXJwIlE1ekghIzckIjB3VSopKip6NilHISM2NyQ3JCQiMCJlN0BxMnpIISM3JCIwI3lEMV0rJSlHISM2NyQkIjB1cnAiUTV6SCEjNyQiMHdVKikqKno2KUchIzY3JDckJCIwImU3QHEyekghIzckIjAjeUQxXSslKUchIzY3JCQiMFh1QWwkKSp5SCEjNyQiMGI9PiZlKyUqRyEjNjckNyQkIjBsNXNkZyp5SCEjNyQiMD1ZcGJYaypHISM2NyQkIjBYdUFsJCkqeUghIzckIjBiPT4mZSslKkchIzY3JDckJCIwbDVzZGcqeUghIzckIjA9WXBiWGsqRyEjNjckJCIvRywrUicpeUghIzYkIjBWUkNRSW8hSCEjNjckNyQkIjBpUz9eVyl5SCEjNyQiMGFNdzUnKSkzSCEjNjckJCIvRywrUicpeUghIzYkIjBWUkNRSW8hSCEjNjckNyQkIjBpUz9eVyl5SCEjNyQiMGFNdzUnKSkzSCEjNjckJCIwamp0YlcoeUghIzckIjByZCYqZmAnPkghIzY3JDckJCIwTXZKIylHKHlIISM3JCIvSEtlbUtASCEjNTckJCIwamp0YlcoeUghIzckIjByZCYqZmAnPkghIzY3JDckJCIwTXZKIylHKHlIISM3JCIvSEtlbUtASCEjNTckJCIvRV5AY2l5SCEjNiQiMFYoSDdiWktIISM2NyQ3JCQiMEohPTNOaHlIISM3JCIwRTYhNHN3TEghIzY3JCQiL0VeQGNpeUghIzYkIjBWKEg3YlpLSCEjNjckNyQkIjBKIT0zTmh5SCEjNyQiMEU2ITRzd0xIISM2NyQkIjBSZjc0MiZ5SCEjNyQiMFIyWDcnSFhIISM2NyQ3JCQiMCVmYW0mKVx5SCEjNyQiMGkqcGZ4P1lIISM2NyQkIjBSZjc0MiZ5SCEjNyQiMFIyWDcnSFhIISM2NyQ3JCQiMCVmYW0mKVx5SCEjNyQiMGkqcGZ4P1lIISM2NyQkIi9hPWsqKVF5SCEjNiQiMG5VUlc6ImVIISM2NyQ3JCQiMCUqNGEqUlF5SCEjNyQiMCl6UTUkWydlSCEjNjckJCIvYT1rKilReUghIzYkIjBuVVJXOiJlSCEjNjckNyQkIjAlKjRhKlJReUghIzckIjApelE1JFsnZUghIzY3JCQiMGpcKVE3RnlIISM3JCIvUUF2TSQ0KEghIzU3JDckJCIwSkxTenAjeUghIzckIjBNdzUnKSkzckghIzY3JCQiMGpcKVE3RnlIISM3JCIvUUF2TSQ0KEghIzU3JDckJCIwSkxTenAjeUghIzckIjBNdzUnKSkzckghIzY3JCQiMDN0JXlGQXlIISM3JCIwJlEsWWVBd0ghIzY3JDckJCIwaCg0eUMpZilIISM3JCIwJEheOyNbRkAjISM2NyQkIi9AVj4kW2UpSCEjNiQiMHJ1KD5lbENBISM2NyQ3JCQiL0BWPiRbZSlIISM2JCIwcnUoPmVsQ0EhIzY3JCQiMGM2YVBWZSlIISM3JCIwdTFlJT01REEhIzY3JDckJCIwUT0rbDNkKUghIzckIjAyai9QJzRQQSEjNjckJCIwYzZhUFZlKUghIzckIjB1MWUlPTVEQSEjNjckNyQkIjBRPStsM2QpSCEjNyQiMDJqL1AnNFBBISM2NyQkIjAlPXYhZilwJilIISM3JCIvM11UbStRQSEjNTckNyQkIjAlcCdlWnBiKUghIzckIjBXXjYjcGBcQSEjNjckJCIwJT12IWYpcCYpSCEjNyQiLzNdVG0rUUEhIzU3JDckJCIwJXAnZVpwYilIISM3JCIwV142I3BgXEEhIzY3JCQiMHUtPk5hYilIISM3JCIvJnpxbzQ0RCMhIzU3JDckJCIvLGIjeklhKUghIzYkIi8pUj1aeD5FIyEjNTckJCIwdS0+TmFiKUghIzckIi8menFvNDREIyEjNTckNyQkIi8sYiN6SWEpSCEjNiQiLylSPVp4PkUjISM1NyQkIjBIclBsNWEpSCEjNyQiMEB0KSkqNCJRRSMhIzY3JDckJCIwRiI0K0VIJilIISM3JCIwO0dELT1XRiMhIzY3JCQiMEhyUGw1YSlIISM3JCIwQHQpKSo0IlFFIyEjNjckNyQkIjBGIjQrRUgmKUghIzckIjA7R0QtPVdGIyEjNjckJCIwciplJlxuXylIISM3JCIwIlFNejByd0EhIzY3JDckJCIwaSNmJCpbOiYpSCEjNyQiMF87S2Rlb0cjISM2NyQkIjByKmUmXG5fKUghIzckIjAiUU16MHJ3QSEjNjckNyQkIjBpI2YkKls6JilIISM3JCIwXztLZGVvRyMhIzY3JCQiMEFEQyhbNyYpSCEjNyQiMCp6SVclMycqRyMhIzY3JDckJCIwdTo7bjxdKUghIzckIjApWyFSNypIKkgjISM2NyQkIjBBREMoWzcmKUghIzckIjAqeklXJTMnKkcjISM2NyQ3JCQiMHU6O248XSlIISM3JCIwKVshUjcqSCpIIyEjNjckJCIwOlFEeSMpXClIISM3JCIwI1JNKmYvREkjISM2NyQ3JCQiMFQoXEo0KVspSCEjNyQiMEMkZnUnUjxKIyEjNjckJCIwOlFEeSMpXClIISM3JCIwI1JNKmYvREkjISM2NyQ3JCQiMFQoXEo0KVspSCEjNyQiMEMkZnUnUjxKIyEjNjckJCIwQjpDQVRbKUghIzckIjB0O2QwKlI6QiEjNjckNyQkIjBSeC1uV1opSCEjNyQiLztHRC09Q0IhIzU3JCQiMEI6Q0FUWylIISM3JCIwdDtkMCpSOkIhIzY3JDckJCIwUngtbldaKUghIzckIi87R0QtPUNCISM1NyQkIjBKZCYpPStaKUghIzckIjBIWVkjPUhHQiEjNjckNyQkIjAkXCsmKSkzWSlIISM3JCIwJypwZng/bUwjISM2NyQkIjBKZCYpPStaKUghIzckIjBIWVkjPUhHQiEjNjckNyQkIjAkXCsmKSkzWSlIISM3JCIwJypwZng/bUwjISM2NyQkIjBHenVuZlgpSCEjNyQiMFgydCJIPVRCISM2NyQ3JCQiMEQqeXROWiUpSCEjNyQiMEtlbUtoIVxCISM2NyQkIjBHenVuZlgpSCEjNyQiMFgydCJIPVRCISM2NyQ3JCQiMEQqeXROWiUpSCEjNyQiMEtlbUtoIVxCISM2NyQkIjBUIVwobz5XKUghIzckIi85N1JCMmFCISM1NyQ3JCQiMHNYVXRRVilIISM3JCIwb1l0KD1daEIhIzY3JCQiMFQhXChvPlcpSCEjNyQiLzk3UkIyYUIhIzU3JDckJCIwc1hVdFFWKUghIzckIjBvWXQoPV1oQiEjNjckJCIwQkleQCFHJSlIISM3JCIwLCU9LCwncE8jISM2NyQ3JCQiMFchUWtWPyUpSCEjNyQiMC9OIUdDJVJQIyEjNjckJCIwQkleQCFHJSlIISM3JCIwLCU9LCwncE8jISM2NyQ3JCQiMFchUWtWPyUpSCEjNyQiMC9OIUdDJVJQIyEjNjckJCIwVkkoZTc5JSlIISM3JCIwbFcpM2klKXpCISM2NyQ3JCQiMGx1NVlxUylIISM3JCIvTXN5SFEnUSMhIzU3JCQiMFZJKGU3OSUpSCEjNyQiMGxXKTNpJSl6QiEjNjckNyQkIjBsdTVZcVMpSCEjNyQiL01zeUhRJ1EjISM1NyQkIi91MjhHKyUpSCEjNiQiMFg/KXkxdCNSIyEjNjckNyQkIjAjZV1AcSRSKUghIzckIjB3NiVITiMpKVIjISM2NyQkIi91MjhHKyUpSCEjNiQiMFg/KXkxdCNSIyEjNjckNyQkIjAjZV1AcSRSKUghIzckIjB3NiVITiMpKVIjISM2NyQkIjAqel93WydRKUghIzckIjA7IVE7TmgwQyEjNjckNyQkIjB3aU4vL1EpSCEjNyQiMDcrLDNrN1QjISM2NyQkIjAqel93WydRKUghIzckIjA7IVE7TmgwQyEjNjckNyQkIjB3aU4vL1EpSCEjNyQiMDcrLDNrN1QjISM2NyQkIi50Y1dGUClIISM1JCIwO2JDdCVcPUMhIzY3JDckJCIwV1xdX3JPKUghIzckIjBbKXlJWXFCQyEjNjckJCIudGNXRlApSCEjNSQiMDtiQ3QlXD1DISM2NyQ3JCQiMFdcXV9yTylIISM3JCIwWyl5SVlxQkMhIzY3JCQiMCk0Kik9MGYkKUghIzckIjBkV0FMdThWIyEjNjckNyQkIjA3YUxZUk4pSCEjNyQiMCVvWiI9WGhWIyEjNjckJCIwKTQqKT0wZiQpSCEjNyQiMGRXQUx1OFYjISM2NyQ3JCQiMDdhTFlSTilIISM3JCIwJW9aIj1YaFYjISM2NyQkIjBreUA0YU0pSCEjNyQiMHYlZUdCRFdDISM2NyQ3JCQiMFlKcCZ5UyQpSCEjNyQiL187S2RlW0MhIzU3JCQiMGt5QDRhTSlIISM3JCIwdiVlR0JEV0MhIzY3JDckJCIwWUpwJnlTJClIISM3JCIvXztLZGVbQyEjNTckJCIwWGhNOz1MKUghIzckIjBoRiJHKEdyWCMhIzY3JDckJCIvQ3UtbkYkKUghIzYkIjBjYEdHRTVZIyEjNjckJCIwWGhNOz1MKUghIzckIjBoRiJHKEdyWCMhIzY3JDckJCIvQ3UtbkYkKUghIzYkIjBjYEdHRTVZIyEjNjckJCIvI1w8dCM9JClIISM2JCIwOFtTYC4rWiMhIzY3JDckJCIwLCspKipmOSQpSCEjNyQiMCM+YUxvWXRDISM2NyQkIi8jXDx0Iz0kKUghIzYkIjA4W1NgLitaIyEjNjckNyQkIjAsKykqKmY5JClIISM3JCIwIz5hTG9ZdEMhIzY3JCQiMHVsMnpaSSlIISM3JCIwYnFrd3dHWyMhIzY3JDckJCIwIm9RVmQsJClIISM3JCIwR0lVUTJmWyMhIzY3JCQiMHVsMnpaSSlIISM3JCIwYnFrd3dHWyMhIzY3JDckJCIwIm9RVmQsJClIISM3JCIwR0lVUTJmWyMhIzY3JCQiMDpZKlFMIkgpSCEjNyQiMHI3L1ZbZFwjISM2NyQ3JCQiMCk+P0tmKUcpSCEjNyQiMGs9XCR6TSlcIyEjNjckJCIwOlkqUUwiSClIISM3JCIwcjcvVltkXCMhIzY3JDckJCIwKT4/S2YpRylIISM3JCIwaz1cJHpNKVwjISM2NyQkIjBOTVpQekYpSCEjNyQiMDBrM2A9JzNEISM2NyQ3JCQiMHlqWWNjRilIISM3JCIuMmNbKXk1RCEiKjckJCIwTk1aUHpGKUghIzckIjAwazNgPSczRCEjNjckNyQkIjB5alljY0YpSCEjNyQiLjJjWyl5NUQhIio3JCQiMGlOaiplayMpSCEjNyQiMEp6TjIoW0BEISM2NyQ3JCQiMC9EJVJ3aSMpSCEjNyQiME8mSE8hSEtfIyEjNjckJCIwaU5qKmVrIylIISM3JCIwSnpOMihbQEQhIzY3JDckJCIwL0QlUndpIylIISM3JCIwTyZITyFIS18jISM2NyQkIjAleVkoKkdeIylIISM3JCIweSwoeVNOTUQhIzY3JDckJCIwJHAlNDoqXCMpSCEjNyQiMHMkKXBlcGNgIyEjNjckJCIwJXlZKCpHXiMpSCEjNyQiMHksKHlTTk1EISM2NyQ3JCQiMCRwJTQ6KlwjKUghIzckIjBzJClwZXBjYCMhIzY3JCQiMC0xKHouUSMpSCEjNyQiMEciPVQmPnNhIyEjNjckNyQkIi9HdCs2UCMpSCEjNiQiMDRzdzg1IltEISM2NyQkIjAtMSh6LlEjKUghIzckIjBHIj1UJj5zYSMhIzY3JDckJCIvR3QrNlAjKUghIzYkIjA0c3c4NSJbRCEjNjckJCIwRSQ9USRbQSlIISM3JCIwREJtWiQzZ0QhIzY3JDckJCIwVSh6JVtWQSlIISM3JCIwWGckKW9dMGMjISM2NyQkIjBFJD1RJFtBKUghIzckIjBEQm1aJDNnRCEjNjckNyQkIjBVKHolW1ZBKUghIzckIjBYZyQpb10wYyMhIzY3JCQiMG5CKXBuNiMpSCEjNyQiMFYhKlsqZSVIZCMhIzY3JDckJCIwM3UsSTtAKUghIzckIjAiKVshUjcqSGQjISM2NyQkIjBuQilwbjYjKUghIzckIjBWISpbKmUlSGQjISM2NyQ3JCQiMDN1LEk7QClIISM3JCIwIilbIVI3KkhkIyEjNjckJCIwTSZHR0U1IylIISM3JCIvN1d5REx1RCEjNTckNyQkIjAoKTR6S2kpKilIISM3JCIwSil6bjRqcz4hIzY3JCQiMD53OWxjKCkpSCEjNyQiMF4yZyFbJWUoPiEjNjckNyQkIjA+dzlsYygpKUghIzckIjBeMmchWyVlKD4hIzY3JCQiMHJhQlg3KCkpSCEjNyQiLk9qIz1gej4hIio3JDckJCIwSElNNTEnKSlIISM3JCIwKGVwY2BHKSk+ISM2NyQkIjByYUJYNygpKUghIzckIi5PaiM9YHo+ISIqNyQ3JCQiMEhJTTUxJykpSCEjNyQiMChlcGNgRykpPiEjNjckJCIwT1AzMGMmKSlIISM3JCIwJD4jNChRWiMqPiEjNjckNyQkIjAwUlE2YyUpKUghIzckIjBCJVEyZnMrPyEjNjckJCIwT1AzMGMmKSlIISM3JCIwJD4jNChRWiMqPiEjNjckNyQkIjAwUlE2YyUpKUghIzckIjBCJVEyZnMrPyEjNjckJCIwdTghcC1TKSlIISM3JCIwIioqW0dSVDA/ISM2NyQ3JCQiMFJedW4xJCkpSCEjNyQiMGZzIWVrOzg/ISM2NyQkIjB1OCFwLVMpKUghIzckIjAiKipbR1JUMD8hIzY3JDckJCIwUl51bjEkKSlIISM3JCIwZnMhZWs7OD8hIzY3JCQiMFk0LzVYIykpSCEjNyQiMHQqej4/Tj0/ISM2NyQ3JCQiMCgzLiJ6ZCIpKUghIzckIjAmNHczcWdEPyEjNjckJCIwWTQvNVgjKSlIISM3JCIwdCp6Pj9OPT8hIzY3JDckJCIwKDMuInpkIikpSCEjNyQiMCY0dzNxZ0Q/ISM2NyQkIjBuRjZhITQpKUghIzckIjBbWXQ6KUdKPyEjNjckNyQkIjBYdkpYNCEpKUghIzckIjBKXCVmdi9RPyEjNjckJCIwbkY2YSE0KSlIISM3JCIwW1l0OilHSj8hIzY3JDckJCIwWHZKWDQhKSlIISM3JCIwSlwlZnYvUT8hIzY3JCQiMEM6IiplT3opSCEjNyQiMFQ4eE1BVS8jISM2NyQ3JCQiMEFEJWY7J3kpSCEjNyQiMG5QLDYpW10/ISM2NyQkIjBDOiIqZU96KUghIzckIjBUOHhNQVUvIyEjNjckNyQkIjBBRCVmOyd5KUghIzckIjBuUCw2KVtdPyEjNjckJCIvXEJSS3koKUghIzYkIjAqR1AyWTpkPyEjNjckNyQkIjBtempTOXgpSCEjNyQiMC5FM21HSDEjISM2NyQkIi9cQlJLeSgpSCEjNiQiMCpHUDJZOmQ/ISM2NyQ3JCQiMG16alM5eClIISM3JCIwLkUzbUdIMSMhIzY3JCQiMDpwJSlbSXcpSCEjNyQiMForZyVcM3E/ISM2NyQ3JCQiMEUkUiNwbnYpSCEjNyQiMFI5OkBwYDIjISM2NyQkIjA6cCUpW0l3KUghIzckIjBaK2clXDNxPyEjNjckNyQkIjBFJFIjcG52KUghIzckIjBSOTpAcGAyIyEjNjckJCIwRydvTCR5dSlIISM3JCIwelBPUDhJMyMhIzY3JDckJCIwJkdXODpVKClIISM3JCIwdi1BdzR5MyMhIzY3JCQiMEcnb0wkeXUpSCEjNyQiMHpQT1A4STMjISM2NyQ3JCQiMCZHVzg6VSgpSCEjNyQiMHYtQXc0eTMjISM2NyQkIjBOXiFwbksoKUghIzckIjBFJSoqMypSZjQjISM2NyQ3JCQiLzR5bGVGKClIISM2JCIwNiIqR0pdLTUjISM2NyQkIjBOXiFwbksoKUghIzckIjBFJSoqMypSZjQjISM2NyQ3JCQiLzR5bGVGKClIISM2JCIwNiIqR0pdLTUjISM2NyQkIjAieU8jenZyKUghIzckIjA0OCJmWCcpM0AhIzY3JDckJCIwM3JsdUlyKUghIzckIjBaek4nM3A3QCEjNjckJCIwInlPI3p2cilIISM3JCIwNDgiZlgnKTNAISM2NyQ3JCQiMDNybHVJcilIISM3JCIwWnpOJzNwN0AhIzY3JCQiMHgiWythLSgpSCEjNyQiMCwyVEwoeUBAISM2NyQ3JCQiMFhkWzonKXApSCEjNyQiMCR5RTk5OERAISM2NyQkIjB4IlsrYS0oKUghIzckIjAsMlRMKHlAQCEjNjckNyQkIjBYZFs6JylwKUghIzckIjAkeUU5OThEQCEjNjckJCIvMEcqZXZvKUghIzYkIjBIanJDM1o4IyEjNjckNyQkIjBFc2IzVW8pSCEjNyQiMD5jXCc+ZFBAISM2NyQkIi8wRypldm8pSCEjNiQiMEhqckMzWjgjISM2NyQ3JCQiMEVzYjNVbylIISM3JCIwPmNcJz5kUEAhIzY3JCQiMGk3ZE5FbilIISM3JCIwNG0hM3RpWkAhIzY3JDckJCIwLVByYClwJylIISM3JCIwYldjXjcrOiMhIzY3JCQiMGk3ZE5FbilIISM3JCIwNG0hM3RpWkAhIzY3JDckJCIwLVByYClwJylIISM3JCIwYldjXjcrOiMhIzY3JCQiL09LJ3B4bClIISM2JCIwOyMqeV9XMDsjISM2NyQ3JCQiMCoqKilmXWJsKUghIzckIjAiSExtSVhpQCEjNjckJCIvT0sncHhsKUghIzYkIjA7Iyp5X1cwOyMhIzY3JDckJCIwKioqKWZdYmwpSCEjNyQiMCJITG1JWGlAISM2NyQkIjBqJClwZ0hrKUghIzckIjBfJCkpPipmTTwjISM2NyQ3JCQiMDpBIyopSFQnKUghIzckIjBGQHFoJCpbPCMhIzY3JCQiMGokKXBnSGspSCEjNyQiMF8kKSk+KmZNPCMhIzY3JDckJCIwOkEjKilIVCcpSCEjNyQiMEZAcWgkKls8IyEjNjckJCIwJ1t6JjMjRycpSCEjNyQiMGFELFx0aj0jISM2NyQ3JCQiMHpjXik0RicpSCEjNyQiMGo0eDtNdD0jISM2NyQkIjAnW3omMyNHJylIISM3JCIwYUQsXHRqPSMhIzY3JDckJCIwemNeKTRGJylIISM3JCIwajR4O010PSMhIzY3JCQiMDtVdDdOaClIISM3JCIwZSIpZkQmRyo+IyEjNjckNyQkIjBvNCIqW0hoKUghIzckIjAqelI9WngqPiMhIzY3JCQiMDtVdDdOaClIISM3JCIwZSIpZkQmRyo+IyEjNjckNyQkIjBvNCIqW0hoKUghIzckIjAqelI9WngqPiMhIzY3JCQiMHZfJkgoKSlmKUghIzckIjAkejRDXz43QSEjNjckNyQkIi8uTypcKSlmKUghIzYkIjBOJzNwX0A3QSEjNjckJCIwdl8mSCgpKWYpSCEjNyQiMCR6NENfPjdBISM2NyQ3JCQiLy5PKlwpKWYpSCEjNiQiME4nM3BfQDdBISM2NyQkIjBoKDR5QylmKUghIzckIjAkSF47I1tGQCMhIzY3JDckJCIwKCk0ektpKSopSCEjNyQiMEopem40anM+ISM2NyQkIjBzdzpqazMqSCEjNyQiMEopem40anM+ISM2NyQ3JCQiMDlBeDxVUCpIISM3JCIwXDhKMlU6KD4hIzY3JCQiMHN3OmprMypIISM3JCIwSil6bjRqcz4hIzY3JDckJCIwOUF4PFVQKkghIzckIjBcOEoyVTooPiEjNjckJCIwIzNKd1MzJipIISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvV2BGP2koKkghIzYkIjBcOEoyVTooPiEjNjckJCIwIzNKd1MzJipIISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvV2BGP2koKkghIzYkIjBcOEoyVTooPiEjNjckJCIwM0JoI1InKikqSCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMG5ZdCg9XSxJISM3JCIwXDhKMlU6KD4hIzY3JCQiMDNCaCNSJyopKkghIzckIjBcOEoyVTooPiEjNjckNyQkIjBuWXQoPV0sSSEjNyQiMFw4SjJVOig+ISM2NyQkIjBOTmZ4VkcrJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCQqZXJzIlEwSSEjNyQiMFw4SjJVOig+ISM2NyQkIjBOTmZ4VkcrJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCQqZXJzIlEwSSEjNyQiMFw4SjJVOig+ISM2NyQkIjBoWmRpQm4rJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLzcocGRoIzRJISM2JCIwXDhKMlU6KD4hIzY3JCQiMGhaZGlCbiskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvNyhwZGgjNEkhIzYkIjBcOEoyVTooPiEjNjckJCIwKSlmYlouMSwkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwWSR5RTk5OEkhIzckIjBcOEoyVTooPiEjNjckJCIwKSlmYlouMSwkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwWSR5RTk5OEkhIzckIjBcOEoyVTooPiEjNjckJCIwOXNgSyRbOUkhIzckIjBcOEoyVTooPiEjNjckNyQkIjB0JmZ3Ny08SSEjNyQiMFw4SjJVOig+ISM2NyQkIjA5c2BLJFs5SSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHQmZnc3LTxJISM3JCIwXDhKMlU6KD4hIzY3JCQiMFQlPXZKTz1JISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKnpTRTYhNC0kISM3JCIwXDhKMlU6KD4hIzY3JCQiMFQlPXZKTz1JISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKnpTRTYhNC0kISM3JCIwXDhKMlU6KD4hIzY3JCQiMG4nKlwtVkEtJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEU/aSg0eUNJISM3JCIwXDhKMlU6KD4hIzY3JCQiMG4nKlwtVkEtJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEU/aSg0eUNJISM3JCIwXDhKMlU6KD4hIzY3JCQiMCUqM1soRzdFSSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMF9LZyMzbUdJISM3JCIwXDhKMlU6KD4hIzY3JCQiMCUqM1soRzdFSSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMF9LZyMzbUdJISM3JCIwXDhKMlU6KD4hIzY3JCQiLzdpQ0YrSUkhIzYkIjBcOEoyVTooPiEjNjckNyQkIjB6V2VuU0QuJCEjNyQiMFw4SjJVOig+ISM2NyQkIi83aUNGK0lJISM2JCIwXDhKMlU6KD4hIzY3JDckJCIweldlblNELiQhIzckIjBcOEoyVTooPiEjNjckJCIwWkxXZCMpUS4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMGRjXz9rLiQhIzckIjBcOEoyVTooPiEjNjckJCIwWkxXZCMpUS4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMGRjXz9rLiQhIzckIjBcOEoyVTooPiEjNjckJCIwdFhVVWl4LiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBLcGFQKy4vJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB0WFVVaXguJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEtwYVArLi8kISM3JCIwXDhKMlU6KD4hIzY3JCQiLmVTRlU7LyQhIzUkIjBcOEoyVTooPiEjNjckNyQkIjBlIkdELT1XSSEjNyQiMFw4SjJVOig+ISM2NyQkIi5lU0ZVOy8kISM1JCIwXDhKMlU6KD4hIzY3JDckJCIwZSJHRC09V0khIzckIjBcOEoyVTooPiEjNjckJCIwRXFRN0FiLyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmUTR2KzFbSSEjNyQiMFw4SjJVOig+ISM2NyQkIjBFcVE3QWIvJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCZRNHYrMVtJISM3JCIwXDhKMlU6KD4hIzY3JCQiMGAjb3Q+U1xJISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwNjFcIypSPjAkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGAjb3Q+U1xJISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwNjFcIypSPjAkISM3JCIwXDhKMlU6KD4hIzY3JCQiMHolXEI9R2BJISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwUT1aeD5lMCQhIzckIjBcOEoyVTooPiEjNjckJCIweiVcQj1HYEkhIzckIjBcOEoyVTooPiEjNjckNyQkIjBRPVp4PmUwJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAxMkxuaHIwJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGxJWGkqcGZJISM3JCIwXDhKMlU6KD4hIzY3JCQiMDEyTG5ocjAkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbElYaSpwZkkhIzckIjBcOEoyVTooPiEjNjckJCIwSz5KX1Q1MSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAiSE11JXpOMSQhIzckIjBcOEoyVTooPiEjNjckJCIwSz5KX1Q1MSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAiSE11JXpOMSQhIzckIjBcOEoyVTooPiEjNjckJCIwZkpIUEBcMSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA9YlRLZnUxJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBmSkhQQFwxJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMD1iVEtmdTEkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCZRdUE3ISlvSSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFduUjxSODIkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCZRdUE3ISlvSSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFduUjxSODIkISM3JCIwXDhKMlU6KD4hIzY3JCQiMDdjRDIib3NJISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwcnpQLT5fMiQhIzckIjBcOEoyVTooPiEjNjckJCIwN2NEMiJvc0khIzckIjBcOEoyVTooPiEjNjckNyQkIjByelAtPl8yJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBRb0IjNGN3SSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiMFw4SjJVOig+ISM2NyQkIjBRb0IjNGN3SSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiMFw4SjJVOig+ISM2NyQkIjBsIT1zMlchMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBDL01zeUgzJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBsIT1zMlchMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBDL01zeUgzJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAiSCo+aT9WMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIi9sQHQmZW8zJCEjNiQiMFw4SjJVOig+ISM2NyQkIjAiSCo+aT9WMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIi9sQHQmZW8zJCEjNiQiMFw4SjJVOig+ISM2NyQkIjA9MD1aKyMpMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjB4R0lVUTI0JCEjNyQiMFw4SjJVOig+ISM2NyQkIjA9MD1aKyMpMyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjB4R0lVUTI0JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBXPDtLITMjNCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAuVEdGPVk0JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBXPDtLITMjNCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAuVEdGPVk0JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBySDk8Z2Y0JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMFw4SjJVOig+ISM2NyQkIjBySDk8Z2Y0JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMFw4SjJVOig+ISM2NyQkIjAoPkNAKyUpKjQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwY2xDKHpQLUohIzckIjBcOEoyVTooPiEjNjckJCIwKD5DQCslKSo0JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGNsQyh6UC1KISM3JCIwXDhKMlU6KD4hIzY3JCQiMENhNSgpPlA1JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCR5RkF5RDFKISM3JCIwXDhKMlU6KD4hIzY3JCQiMENhNSgpPlA1JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCR5RkF5RDFKISM3JCIwXDhKMlU6KD4hIzY3JCQiL2wnM3MqZjJKISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwNCE0c3c4NUohIzckIjBcOEoyVTooPiEjNjckJCIvbCczcypmMkohIzYkIjBcOEoyVTooPiEjNjckNyQkIjA0ITRzdzg1SiEjNyQiMFw4SjJVOig+ISM2NyQkIjB4eTFkejk2JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME8tPl88UzYkISM3JCIwXDhKMlU6KD4hIzY3JCQiMHh5MWR6OTYkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTy0+XzxTNiQhIzckIjBcOEoyVTooPiEjNjckJCIwLiJcPyVmYDYkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwaTk8UCgqeTYkISM3JCIwXDhKMlU6KD4hIzY3JCQiMC4iXD8lZmA2JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGk5PFAoKnk2JCEjNyQiMFw4SjJVOig+ISM2NyQkIi9MSXEjUiM+SiEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCpvX0BzeEBKISM3JCIwXDhKMlU6KD4hIzY3JCQiL0xJcSNSIz5KISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKm9fQHN4QEohIzckIjBcOEoyVTooPiEjNjckJCIwYzosNz5KNyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA6UjgyZGM3JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBjOiw3Pko3JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDpSODJkYzckISM3JCIwXDhKMlU6KD4hIzY3JCQiMCR5IypwKikqcDckISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVV42I3BgSEohIzckIjBcOEoyVTooPiEjNjckJCIwJHkjKnAqKSpwNyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBVXjYjcGBISiEjNyQiMFw4SjJVOig+ISM2NyQkIjA0Uyg+KXkzOCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBvajR4O004JCEjNyQiMFw4SjJVOig+ISM2NyQkIjA0Uyg+KXkzOCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBvajR4O004JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBPXyZwJ2VaOCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmZng/bUhQSiEjNyQiMFw4SjJVOig+ISM2NyQkIjBPXyZwJ2VaOCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmZng/bUhQSiEjNyQiMFw4SjJVOig+ISM2NyQkIjBpayQ+JlEnUUohIzckIjBcOEoyVTooPiEjNjckNyQkIjBAKWVxazxUSiEjNyQiMFw4SjJVOig+ISM2NyQkIjBpayQ+JlEnUUohIzckIjBcOEoyVTooPiEjNjckNyQkIjBAKWVxazxUSiEjNyQiMFw4SjJVOig+ISM2NyQkIjAqbzxwJD1EOSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBbKy9LY105JCEjNyQiMFw4SjJVOig+ISM2NyQkIjAqbzxwJD1EOSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBbKy9LY105JCEjNyQiMFw4SjJVOig+ISM2NyQkIjA6KikqPSMpUllKISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdTctPE8qW0ohIzckIjBcOEoyVTooPiEjNjckJCIwOiopKj0jKVJZSiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHU3LTxPKltKISM3JCIwXDhKMlU6KD4hIzY3JCQiMFUsKW8heS06JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCxEKy07RzokISM3JCIwXDhKMlU6KD4hIzY3JCQiMFUsKW8heS06JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCxEKy07RzokISM3JCIwXDhKMlU6KD4hIzY3JCQiMG84Jz16OmFKISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwRlApcGVwY0ohIzckIjBcOEoyVTooPiEjNjckJCIwbzgnPXo6YUohIzckIjBcOEoyVTooPiEjNjckNyQkIjBGUClwZXBjSiEjNyQiMFw4SjJVOig+ISM2NyQkIjAmZlVveC5lSiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGFcJz5kZGdKISM3JCIwXDhKMlU6KD4hIzY3JCQiMCZmVW94LmVKISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYVwnPmRkZ0ohIzckIjBcOEoyVTooPiEjNjckJCIwQFEjPXciPjskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvPVlwYlhrSiEjNiQiMFw4SjJVOig+ISM2NyQkIjBAUSM9dyI+OyQhIzckIjBcOEoyVTooPiEjNjckNyQkIi89WXBiWGtKISM2JCIwXDhKMlU6KD4hIzY3JCQiMFtdIW91emxKISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMnUjPmFMb0ohIzckIjBcOEoyVTooPiEjNjckJCIwW10hb3V6bEohIzckIjBcOEoyVTooPiEjNjckNyQkIjAydSM+YUxvSiEjNyQiMFw4SjJVOig+ISM2NyQkIjB1aXlKeCdwSiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEwnM3BfQHNKISM3JCIwXDhKMlU6KD4hIzY3JCQiMHVpeUp4J3BKISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTCczcF9Ac0ohIzckIjBcOEoyVTooPiEjNjckJCIwLHZ3O2ROPCQhIzckIjBcOEoyVTooPiEjNjckNyQkIi8nKSopPV40d0ohIzYkIjBcOEoyVTooPiEjNjckJCIwLHZ3O2ROPCQhIzckIjBcOEoyVTooPiEjNjckNyQkIi8nKSopPV40d0ohIzYkIjBcOEoyVTooPiEjNjckJCIwRyhbPHFWeEohIzckIjBcOEoyVTooPiEjNjckNyQkIjAnM3JvXCgqekohIzckIjBcOEoyVTooPiEjNjckJCIwRyhbPHFWeEohIzckIjBcOEoyVTooPiEjNjckNyQkIjAnM3JvXCgqekohIzckIjBcOEoyVTooPiEjNjckJCIwYSpIbm9KIj0kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOEImPVsmUT0kISM3JCIwXDhKMlU6KD4hIzY3JCQiMGEqSG5vSiI9JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDhCJj1bJlE9JCEjNyQiMFw4SjJVOig+ISM2NyQkIi89NjxuPiY9JCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMFJOJG9ZdCg9JCEjNyQiMFw4SjJVOig+ISM2NyQkIi89NjxuPiY9JCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMFJOJG9ZdCg9JCEjNyQiMFw4SjJVOig+ISM2NyQkIjAyQ3BjdyEqPSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBtWiI9WGgiPiQhIzckIjBcOEoyVTooPiEjNjckJCIwMkNwY3chKj0kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbVoiPVhoIj4kISM3JCIwXDhKMlU6KD4hIzY3JCQiMExPblRjSD4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIypmek8lXCY+JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBMT25UY0g+JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCMqZnpPJVwmPiQhIzckIjBcOEoyVTooPiEjNjckJCIvJ1tsRU9vPiQhIzYkIjBcOEoyVTooPiEjNjckNyQkIjA+c3hAdSQqPiQhIzckIjBcOEoyVTooPiEjNjckJCIvJ1tsRU9vPiQhIzYkIjBcOEoyVTooPiEjNjckNyQkIjA+c3hAdSQqPiQhIzckIjBcOEoyVTooPiEjNjckJCIwKDNPO2hyK0shIzckIjBcOEoyVTooPiEjNjckNyQkIjBYJWVuU0QuSyEjNyQiMFw4SjJVOig+ISM2NyQkIjAoM087aHIrSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFglZW5TRC5LISM3JCIwXDhKMlU6KD4hIzY3JCQiMDh0aCdmZi9LISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwcydSPFI4MkshIzckIjBcOEoyVTooPiEjNjckJCIwOHRoJ2ZmL0shIzckIjBcOEoyVTooPiEjNjckNyQkIjBzJ1I8UjgySyEjNyQiMFw4SjJVOig+ISM2NyQkIi9hKWYiZVozSyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMFw4SjJVOig+ISM2NyQkIi9hKWYiZVozSyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBtKHpsY043SyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBtKHpsY043SyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAkKjRjXk5pQCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBeTG9ZdCg9SyEjNyQiMFw4SjJVOig+ISM2NyQkIjAkKjRjXk5pQCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBeTG9ZdCg9SyEjNyQiMFw4SjJVOig+ISM2NyQkIjA+QWFPOixBJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHlYbUpgRUEkISM3JCIwXDhKMlU6KD4hIzY3JCQiMD5BYU86LEEkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIweVhtSmBFQSQhIzckIjBcOEoyVTooPiEjNjckJCIwWU1fQCYqUkEkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwL2VrO0xsQSQhIzckIjBcOEoyVTooPiEjNjckJCIwWU1fQCYqUkEkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwL2VrO0xsQSQhIzckIjBcOEoyVTooPiEjNjckJCIwc1ldMXZ5QSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBKcWksOC9CJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBzWV0xdnlBJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEpxaSw4L0IkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCoqZVsiXHZKSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGQjM21HSE1LISM3JCIwXDhKMlU6KD4hIzY3JCQiMCoqZVsiXHZKSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGQjM21HSE1LISM3JCIwXDhKMlU6KD4hIzY3JCQiMERyWXdNY0IkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJVsqZXJzIlFLISM3JCIwXDhKMlU6KD4hIzY3JCQiMERyWXdNY0IkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJVsqZXJzIlFLISM3JCIwXDhKMlU6KD4hIzY3JCQiMF8kWzlZXlJLISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvcnFsRDBVSyEjNiQiMFw4SjJVOig+ISM2NyQkIjBfJFs5WV5SSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL3JxbEQwVUshIzYkIjBcOEoyVTooPiEjNjckJCIweSZIa1dSVkshIzckIjBcOEoyVTooPiEjNjckNyQkIjBQPmJUS2ZDJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB5JkhrV1JWSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFA+YlRLZkMkISM3JCIwXDhKMlU6KD4hIzY3JCQiMDAzVEp1c0MkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwakpgRTcpXEshIzckIjBcOEoyVTooPiEjNjckJCIwMDNUSnVzQyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBqSmBFNylcSyEjNyQiMFw4SjJVOig+ISM2NyQkIjBKP1I7YTZEJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1I5OkBwYEshIzYkIjBcOEoyVTooPiEjNjckJCIwSj9SO2E2RCQhIzckIjBcOEoyVTooPiEjNjckNyQkIi9SOTpAcGBLISM2JCIwXDhKMlU6KD4hIzY3JCQiMGVLUCxNXUQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwO2NcJz5kZEshIzckIjBcOEoyVTooPiEjNjckJCIwZUtQLE1dRCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA7Y1wnPmRkSyEjNyQiMFw4SjJVOig+ISM2NyQkIjAlW2FqUSIqZUshIzckIjBcOEoyVTooPiEjNjckNyQkIjBWb1oiPVhoSyEjNyQiMFw4SjJVOig+ISM2NyQkIjAlW2FqUSIqZUshIzckIjBcOEoyVTooPiEjNjckNyQkIjBWb1oiPVhoSyEjNyQiMFw4SjJVOig+ISM2NyQkIjA2ZExyJHppSyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHAhZWs7TGxLISM3JCIwXDhKMlU6KD4hIzY3JCQiMDZkTHIkemlLISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvMmVrO0xsSyEjNiQiMFw4SjJVOig+ISM2NyQkIjBQcEpjdG1FJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCdIUjk6QHBLISM3JCIwXDhKMlU6KD4hIzY3JCQiMFBwSmN0bUUkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJ0hSOTpAcEshIzckIjBcOEoyVTooPiEjNjckJCIwayIpSFRgMEYkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQTBVTyI0dEshIzckIjBcOEoyVTooPiEjNjckJCIwayIpSFRgMEYkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQjBVTyI0dEshIzckIjBcOEoyVTooPiEjNjckJCIvUnppS1Z1SyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMFw8U0BycEYkISM3JCIwXDhKMlU6KD4hIzY3JCQiL1J6aUtWdUshIzYkIjBcOEoyVTooPiEjNjckNyQkIjBcPFNAcnBGJCEjNyQiMFw4SjJVOig+ISM2NyQkIjA8MUU2OCR5SyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHdIUTFeM0ckISM3JCIwXDhKMlU6KD4hIzY3JCQiMDwxRTY4JHlLISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwd0hRMV4zRyQhIzckIjBcOEoyVTooPiEjNjckJCIwVj1DJ0g+I0ckISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLVVPIjR0JUckISM3JCIwXDhKMlU6KD4hIzY3JCQiMFY9QydIPiNHJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC1VTyI0dCVHJCEjNyQiMFw4SjJVOig+ISM2NyQkIi8yQjdHMidHJCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMEhhTXc1JylHJCEjNyQiMFw4SjJVOig+ISM2NyQkIi8yQjdHMidHJCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMEhhTXc1JylHJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAnSC9pRSYqKkckISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYm1LaCFcI0gkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCdIL2lFJioqRyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBibUtoIVwjSCQhIzckIjBcOEoyVTooPiEjNjckJCIwQmI9XktRSCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAjKXlJWXFqSCQhIzckIjBcOEoyVTooPiEjNjckJCIwQmI9XktRSCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAjKXlJWXFqSCQhIzckIjBcOEoyVTooPiEjNjckJCIwXG47Tzd4SCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAzIipHSl0tSSQhIzckIjBcOEoyVTooPiEjNjckJCIwXG47Tzd4SCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAzIipHSl0tSSQhIzckIjBcOEoyVTooPiEjNjckJCIwd3o5QCNmLEwhIzckIjBcOEoyVTooPiEjNjckNyQkIjBOLkY7SVRJJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB3ejlAI2YsTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME4uRjtJVEkkISM3JCIwXDhKMlU6KD4hIzY3JCQiMC0jSGg/WjBMISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwaDpELDUhM0whIzckIjBcOEoyVTooPiEjNjckJCIwLSNIaD9aMEwhIzckIjBcOEoyVTooPiEjNjckNyQkIjBoOkQsNSEzTCEjNyQiMFw4SjJVOig+ISM2NyQkIjBILzYiPk40TCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCl5S2kpKik9SiQhIzckIjBcOEoyVTooPiEjNjckJCIwSC82Ij5ONEwhIzckIjBcOEoyVTooPiEjNjckNyQkIjApeUtpKSopPUokISM3JCIwXDhKMlU6KD4hIzY3JCQiMGI7NHdKS0okISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOVNAcnBkSiQhIzckIjBcOEoyVTooPiEjNjckJCIwYjs0d0pLSiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA5U0BycGRKJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAjKUcyaDZySiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBUXz5jXCc+TCEjNyQiMFw4SjJVOig+ISM2NyQkIjAjKUcyaDZySiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBUXz5jXCc+TCEjNyQiMFw4SjJVOig+ISM2NyQkIjAzVDBZIio0SyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBuazxUSE5LJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAzVDBZIio0SyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBuazxUSE5LJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBOYC5KcltLJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCVwZGgjNHVLJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBOYC5KcltLJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCVwZGgjNHVLJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBobCw7XihHTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLyMqUTYiKkdKTCEjNiQiMFw4SjJVOig+ISM2NyQkIjBobCw7XihHTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLyMqUTYiKkdKTCEjNiQiMFw4SjJVOig+ISM2NyQkIjApeSgqNDVqS0whIzckIjBcOEoyVTooPiEjNjckNyQkIjBaLDcnKm9eTCQhIzckIjBcOEoyVTooPiEjNjckJCIwKXkoKjQ1aktMISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwWiw3JypvXkwkISM3JCIwXDhKMlU6KD4hIzY3JCQiMDkhemYzXk9MISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdDg1IilbIVJMISM3JCIwXDhKMlU6KD4hIzY3JCQiMDkhemYzXk9MISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdDg1IilbIVJMISM3JCIwXDhKMlU6KD4hIzY3JCQiMFQtJzQyUlNMISM3JCIwXDhKMlU6KD4hIzY3JDckJCIuRTNtR0hNJCEjNSQiMFw4SjJVOig+ISM2NyQkIjBULSc0MlJTTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLkUzbUdITSQhIzUkIjBcOEoyVTooPiEjNjckJCIwbjklZjBGV0whIzckIjBcOEoyVTooPiEjNjckNyQkIjBFUTFeM29NJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBuOSVmMEZXTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEVRMV4zb00kISM3JCIwXDhKMlU6KD4hIzY3JCQiMCVwQTQvOltMISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYF0vTylvXUwhIzckIjBcOEoyVTooPiEjNjckJCIwJXBBNC86W0whIzckIjBcOEoyVTooPiEjNjckNyQkIjBgXS9PKW9dTCEjNyQiMFw4SjJVOig+ISM2NyQkIi8jUiFmLS5fTCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMHppLUBvWE4kISM3JCIwXDhKMlU6KD4hIzY3JCQiLyNSIWYtLl9MISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwemktQG9YTiQhIzckIjBcOEoyVTooPiEjNjckJCIwWl4pMywiZk4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMXYrMVslZUwhIzckIjBcOEoyVTooPiEjNjckJCIwWl4pMywiZk4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMXYrMVslZUwhIzckIjBcOEoyVTooPiEjNjckJCIwdGonZSoqeWZMISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwSygpKTR6S2lMISM3JCIwXDhKMlU6KD4hIzY3JCQiMHRqJ2UqKnlmTCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEsoKSk0ektpTCEjNyQiMFw4SjJVOig+ISM2NyQkIi53JTMpcE9PJCEjNSQiMFw4SjJVOig+ISM2NyQ3JCQiMGYqcGZ4P21MISM3JCIwXDhKMlU6KD4hIzY3JCQiLnclMylwT08kISM1JCIwXDhKMlU6KD4hIzY3JDckJCIwZipwZng/bUwhIzckIjBcOEoyVTooPiEjNjckJCIwRSlHZSdcdk8kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJj1eNHczcUwhIzckIjBcOEoyVTooPiEjNjckJCIwRSlHZSdcdk8kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJj1eNHczcUwhIzckIjBcOEoyVTooPiEjNjckJCIwYCsiMyZIOVAkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwN0MkZnUnUlAkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGArIjMmSDlQJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDdDJGZ1J1JQJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB6N3pONGBQJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFFPIjR0JXlQJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB6N3pONGBQJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFFPIjR0JXlQJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAxRHg/Kj16TCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGxbKmVycyJRJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAxRHg/Kj16TCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGxbKmVycyJRJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBMUHYwcElRJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCI0dzNxZyZRJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBMUHYwcElRJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCI0dzNxZyZRJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBmXHQhKltwUSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA9dCZlb1sqUSQhIzckIjBcOEoyVTooPiEjNjckJCIwZlx0ISpbcFEkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwPXQmZW9bKlEkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCc9O2QoRzNSJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFcmUTNuTyRSJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAnPTtkKEczUiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBXJlEzbk8kUiQhIzckIjBcOEoyVTooPiEjNjckJCIwN3VwZzNaUiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjByKD5lbEMoUiQhIzckIjBcOEoyVTooPiEjNjckJCIwN3VwZzNaUiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjByKD5lbEMoUiQhIzckIjBcOEoyVTooPiEjNjckJCIwUid5YyUpZSlSJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCgqNCEzazcsTSEjNyQiMFw4SjJVOig+ISM2NyQkIjBSJ3ljJSllKVIkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKCo0ITNrNyxNISM3JCIwXDhKMlU6KD4hIzY3JCQiMGwpZjEkb0NTJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMENBeUQxXVMkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGwpZjEkb0NTJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMENBeUQxXVMkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCM0VGMiW2pTJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1hqMmgpKTNNISM2JCIwXDhKMlU6KD4hIzY3JCQiMCM0VGMiW2pTJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1hqMmgpKTNNISM2JCIwXDhKMlU6KD4hIzY3JCQiMD1CaStHLVQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIweFl1JmZ3N00hIzckIjBcOEoyVTooPiEjNjckJCIwPUJpK0ctVCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjB4WXUmZnc3TSEjNyQiMFw4SjJVOig+ISM2NyQkIjBYTmcmeTU5TSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC5mcyFlaztNISM3JCIwXDhKMlU6KD4hIzY3JCQiMFhOZyZ5NTlNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLmZzIWVrO00hIzckIjBcOEoyVTooPiEjNjckJCIwclplcSgpelQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvODJkY18/TSEjNiQiMFw4SjJVOig+ISM2NyQkIjByWmVxKCl6VCQhIzckIjBcOEoyVTooPiEjNjckNyQkIi84MmRjXz9NISM2JCIwXDhKMlU6KD4hIzY3JCQiMCkqZmNibj1VJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGMkKW9dMFdVJCEjNyQiMFw4SjJVOig+ISM2NyQkIjApKmZjYm49VSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBjJClvXTBXVSQhIzckIjBcOEoyVTooPiEjNjckJCIwQ3NhU1pkVSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAkZXBjYEdHTSEjNyQiMFw4SjJVOig+ISM2NyQkIjBDc2FTWmRVJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCRlcGNgR0dNISM3JCIwXDhKMlU6KD4hIzY3JCQiMF4lR2JzaUhNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwNDNsP2xAViQhIzckIjBcOEoyVTooPiEjNjckJCIwXiVHYnNpSE0hIzckIjBcOEoyVTooPiEjNjckNyQkIjA0M2w/bEBWJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB4JzQwcl1MTSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME8/ajBYZ1YkISM3JCIwXDhKMlU6KD4hIzY3JCQiMHgnNDByXUxNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTz9qMFhnViQhIzckIjBcOEoyVTooPiEjNjckJCIwLzRcJnBRUE0hIzckIjBcOEoyVTooPiEjNjckNyQkIjBpS2ghXCMqUk0hIzckIjBcOEoyVTooPiEjNjckJCIwLzRcJnBRUE0hIzckIjBcOEoyVTooPiEjNjckNyQkIjBpS2ghXCMqUk0hIzckIjBcOEoyVTooPiEjNjckJCIvOHMvb0VUTSEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCpbJWZ2L1FXJCEjNyQiMFw4SjJVOig+ISM2NyQkIi84cy9vRVRNISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKlslZnYvUVckISM3JCIwXDhKMlU6KD4hIzY3JCQiMGRMWGxZXlckISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOmRkZyVvWk0hIzckIjBcOEoyVTooPiEjNjckJCIwZExYbFleVyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA6ZGRnJW9aTSEjNyQiMFw4SjJVOig+ISM2NyQkIjAkZU0vbC1cTSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFVwYlhrOlgkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCRlTS9sLVxNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVXBiWGs6WCQhIzckIjBcOEoyVTooPiEjNjckJCIvImVUTjFIWCQhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBvIlEwVldiTSEjNyQiMFw4SjJVOig+ISM2NyQkIi8iZVROMUhYJCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMG8iUTBWV2JNISM3JCIwXDhKMlU6KD4hIzY3JCQiME9xUj8neWNNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJlI+YlRLZk0hIzckIjBcOEoyVTooPiEjNjckJCIwT3FSPyd5Y00hIzckIjBcOEoyVTooPiEjNjckNyQkIjAmUj5iVEtmTSEjNyQiMFw4SjJVOig+ISM2NyQkIjBqI3lgZ21nTSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEAxXSsvS1kkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGojeWBnbWdNISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQDFdKy9LWSQhIzckIjBcOEoyVTooPiEjNjckJCIwKltmLmZha00hIzckIjBcOEoyVTooPiEjNjckNyQkIjBbPVsmUTNuTSEjNyQiMFw4SjJVOig+ISM2NyQkIjAqW2YuZmFrTSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFs9WyZRM25NISM3JCIwXDhKMlU6KD4hIzY3JCQiMDsyTXZEJW9NISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdUlZcWo0WiQhIzckIjBcOEoyVTooPiEjNjckJCIwOzJNdkQlb00hIzckIjBcOEoyVTooPiEjNjckNyQkIjB1SVlxajRaJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBVPktnMEJaJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCxWV2JWW1okISM3JCIwXDhKMlU6KD4hIzY3JCQiMFU+S2cwQlokISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLFZXYlZbWiQhIzckIjBcOEoyVTooPiEjNjckJCIwcEpJWCY9d00hIzckIjBcOEoyVTooPiEjNjckNyQkIjBGYlVTQih5TSEjNyQiMFw4SjJVOig+ISM2NyQkIjBwSklYJj13TSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEdiVVNCKHlNISM3JCIwXDhKMlU6KD4hIzY3JCQiMCZSJUdJbCtbJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGFuU0QuRVskISM3JCIwXDhKMlU6KD4hIzY3JCQiMCZSJUdJbCtbJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGFuU0QuRVskISM3JCIwXDhKMlU6KD4hIzY3JCQiMEFjRTpYUlskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvKXpRNSRbJ1skISM2JCIwXDhKMlU6KD4hIzY3JCQiMEFjRTpYUlskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIil6UTUkWydbJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBbb0MrRHlbJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDIjcGBITyFcJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBbb0MrRHlbJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDIjcGBITyFcJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB2IUdfW3EiXCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBML04hR0MlXCQhIzckIjBcOEoyVTooPiEjNjckJCIwdiFHX1txIlwkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTS9OIUdDJVwkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCwkNC1aZSZcJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL21KYEU3KVwkISM2JCIwXDhKMlU6KD4hIzY3JCQiMCwkNC1aZSZcJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL21KYEU3KVwkISM2JCIwXDhKMlU6KD4hIzY3JCQiMEcwPmJrJSpcJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCgpR0pdLT9dJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBHMD5iayUqXCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAoKUdKXS0/XSQhIzckIjBcOEoyVTooPiEjNjckJCIwYTw8U1dMXSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA4VEhOIyllXSQhIzckIjBcOEoyVTooPiEjNjckJCIwYTw8U1dMXSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA4VEhOIyllXSQhIzckIjBcOEoyVTooPiEjNjckJCIwIilIOkRDc10kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvTXYtQXc0TiEjNiQiMFw4SjJVOig+ISM2NyQkIjAiKUg6RENzXSQhIzckIjBcOEoyVTooPiEjNjckNyQkIi9Ndi1BdzROISM2JCIwXDhKMlU6KD4hIzY3JCQiMDJVODUvNl4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbWxEMFVPXiQhIzckIjBcOEoyVTooPiEjNjckJCIwMlU4NS82XiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBtbEQwVU9eJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBNYTYmUilcXiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAkelAtPl88TiEjNyQiMFw4SjJVOig+ISM2NyQkIjBNYTYmUilcXiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAkelAtPl88TiEjNyQiMFw4SjJVOig+ISM2NyQkIi9tJzQhUScpPU4hIzYkIjBcOEoyVTooPiEjNjckNyQkIjA+IT5fPFNATiEjNyQiMFw4SjJVOig+ISM2NyQkIi9tJzQhUScpPU4hIzYkIjBcOEoyVTooPiEjNjckNyQkIjA+IT5fPFNATiEjNyQiMFw4SjJVOig+ISM2NyQkIjAoKXkybFZGXyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBZLT9nIkdETiEjNyQiMFw4SjJVOig+ISM2NyQkIjAoKXkybFZGXyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBZLT9nIkdETiEjNyQiMFw4SjJVOig+ISM2NyQkIjA4ImYrTmlFTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHM5PVhoIkhOISM3JCIwXDhKMlU6KD4hIzY3JCQiMDgiZitOaUVOISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwczk9WGgiSE4hIzckIjBcOEoyVTooPiEjNjckJCIvTVNdTF1JTiEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCpwaSw4L0xOISM3JCIwXDhKMlU6KD4hIzY3JCQiL01TXUxdSU4hIzYkIjBcOEoyVTooPiEjNjckNyQkIjAqcGksOC9MTiEjNyQiMFw4SjJVOig+ISM2NyQkIjBtOi0/JFFNTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMERSOTpAcGAkISM3JCIwXDhKMlU6KD4hIzY3JCQiMG06LT8kUU1OISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwRFI5OkBwYCQhIzckIjBcOEoyVTooPiEjNjckJCIwJHotXUlFUU4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBfXjcrLDNhJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAkei1dSUVRTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMF9eNyssM2EkISM3JCIwXDhKMlU6KD4hIzY3JCQiMD5TKSoqRzlVTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHlqNSYzb1dOISM3JCIwXDhKMlU6KD4hIzY3JCQiMD5TKSoqRzlVTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHlqNSYzb1dOISM3JCIwXDhKMlU6KD4hIzY3JCQiMFlfJ1xGLVlOISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMHczcWcmW04hIzckIjBcOEoyVTooPiEjNjckJCIwWV8nXEYtWU4hIzckIjBcOEoyVTooPiEjNjckNyQkIjAwdzNxZyZbTiEjNyQiMFw4SjJVOig+ISM2NyQkIjBzayUqZi0qXE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBKKW9dMFdfTiEjNyQiMFw4SjJVOig+ISM2NyQkIjBzayUqZi0qXE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBKKW9dMFdfTiEjNyQiMFw4SjJVOig+ISM2NyQkIjAqcEZcQ3lgTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGUrMFM/amIkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCpwRlxDeWBOISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwZSswUz9qYiQhIzckIjBcOEoyVTooPiEjNjckJCIwRCozKkhpd2IkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJUdKXS0/Z04hIzckIjBcOEoyVTooPiEjNjckJCIwRCozKkhpd2IkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJUdKXS0/Z04hIzckIjBcOEoyVTooPiEjNjckJCIwXywqW0BhaE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjA2RCw1ITNrTiEjNyQiMFw4SjJVOig+ISM2NyQkIjBfLCpbQGFoTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDZELDUhM2tOISM3JCIwXDhKMlU6KD4hIzY3JCQiMHk4KCkqPlVsTiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFBQKlwqZnpjJCEjNyQiMFw4SjJVOig+ISM2NyQkIjB5OCgpKj5VbE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBQUCpcKmZ6YyQhIzckIjBcOEoyVTooPiEjNjckJCIwMEUmWz1JcE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBrXCgqelI9ZCQhIzckIjBcOEoyVTooPiEjNjckJCIwMEUmWz1JcE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjBrXCgqelI9ZCQhIzckIjBcOEoyVTooPiEjNjckJCIwSlEkKXAiPXROISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvPmNcJz5kZCQhIzYkIjBcOEoyVTooPiEjNjckJCIwSlEkKXAiPXROISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvPmNcJz5kZCQhIzYkIjBcOEoyVTooPiEjNjckJCIwZV0iWzoxeE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjA8dSQqXCpmek4hIzckIjBcOEoyVTooPiEjNjckJCIwZV0iWzoxeE4hIzckIjBcOEoyVTooPiEjNjckNyQkIjA8dSQqXCpmek4hIzckIjBcOEoyVTooPiEjNjckJCIwJUcnelJUNGUkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVic9XCR6TWUkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCVHJ3pSVDRlJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFYnPVwkek1lJCEjNyQiMFw4SjJVOig+ISM2NyQkIjA2dnhDQFtlJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLygpKiopPmZ0ZSQhIzYkIjBcOEoyVTooPiEjNjckJCIwNnZ4Q0BbZSQhIzckIjBcOEoyVTooPiEjNjckNyQkIi8oKSoqKT5mdGUkISM2JCIwXDhKMlU6KD4hIzY3JCQiMFAoZSg0LCgpZSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAnNCIpWyFSN2YkISM3JCIwXDhKMlU6KD4hIzY3JCQiMFAoZSg0LCgpZSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjAnNCIpWyFSN2YkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGsqUlo0ZSNmJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEJCJykqKT1eZiQhIzckIjBcOEoyVTooPiEjNjckJCIwaypSWjRlI2YkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQkInKSopPV5mJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAiPkAoemdrZiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBcTiVbKCkqKilmJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAiPkAoemdrZiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBcTiVbKCkqKilmJCEjNyQiMFw4SjJVOig+ISM2NyQkIjA8Q3FrUy5nJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHdaIylmeUdnJCEjNyQiMFw4SjJVOig+ISM2NyQkIjA8Q3FrUy5nJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHdaIylmeUdnJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBXT29cP1VnJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC1nIVslZW5nJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBXT29cP1VnJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC1nIVslZW5nJCEjNyQiMFw4SjJVOig+ISM2NyQkIi8oW21NKyIzTyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMEhzeUhRMWgkISM3JCIwXDhKMlU6KD4hIzY3JCQiLyhbbU0rIjNPISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwSHN5SFExaCQhIzckIjBcOEoyVTooPiEjNjckJCIwKDRZJz4hKT5oJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGIlb1oiPVhoJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAoNFknPiEpPmgkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYiVvWiI9WGgkISM3JCIwXDhKMlU6KD4hIzY3JCQiMEJ0aS9nZWgkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwI29cKCp6Uj1PISM3JCIwXDhKMlU6KD4hIzY3JCQiMEJ0aS9nZWgkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwI29cKCp6Uj1PISM3JCIwXDhKMlU6KD4hIzY3JCQiL2IzJyopUig+TyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMDM0dCV5RkFPISM3JCIwXDhKMlU6KD4hIzY3JCQiL2IzJyopUig+TyEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMDM0dCV5RkFPISM3JCIwXDhKMlU6KD4hIzY3JCQiMHcoKmV1Pk9pJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME5AcnBkaGkkISM3JCIwXDhKMlU6KD4hIzY3JCQiMHcoKmV1Pk9pJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME5AcnBkaGkkISM3JCIwXDhKMlU6KD4hIzY3JCQiMC41ZGYqXEZPISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwaExwYVAraiQhIzckIjBcOEoyVTooPiEjNjckJCIwLjVkZipcRk8hIzckIjBcOEoyVTooPiEjNjckNyQkIjBoTHBhUCtqJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBIQWJXejhqJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMClldSdSPFJqJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBIQWJXejhqJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMClldSdSPFJqJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBjTWBIZl9qJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDllbEMoelBPISM3JCIwXDhKMlU6KD4hIzY3JCQiMGNNYEhmX2okISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOWVsQyh6UE8hIzckIjBcOEoyVTooPiEjNjckJCIwI285WCJSIlJPISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVHFqNHg7ayQhIzckIjBcOEoyVTooPiEjNjckJCIwI285WCJSIlJPISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVHFqNHg7ayQhIzckIjBcOEoyVTooPiEjNjckJCIwNGZcKio9SWskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbiM9WXBiWE8hIzckIjBcOEoyVTooPiEjNjckJCIwNGZcKio9SWskISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbiM9WXBiWE8hIzckIjBcOEoyVTooPiEjNjckJCIwTnJaJSkpKm9rJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCVcKmZ6TyVcTyEjNyQiMFw4SjJVOig+ISM2NyQkIjBOclolKSkqb2skISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJVwqZnpPJVxPISM3JCIwXDhKMlU6KD4hIzY3JCQiMGkkZSVweTJsJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL3MhZWs7TGwkISM2JCIwXDhKMlU6KD4hIzY3JCQiMGkkZSVweTJsJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL3MhZWs7TGwkISM2JCIwXDhKMlU6KD4hIzY3JCQiMCllUlcmZVlsJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFo+Y1wnPmRPISM3JCIwXDhKMlU6KD4hIzY3JCQiMCllUlcmZVlsJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFo+Y1wnPmRPISM3JCIwXDhKMlU6KD4hIzY3JCQiMDozVVJRJmVPISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdEphTXc1bSQhIzckIjBcOEoyVTooPiEjNjckJCIwOjNVUlEmZU8hIzckIjBcOEoyVTooPiEjNjckNyQkIjB0SmFNdzVtJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBUP1NDPUNtJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLldfPmNcbSQhIzUkIjBcOEoyVTooPiEjNjckJCIwVD9TQz1DbSQhIzckIjBcOEoyVTooPiEjNjckNyQkIi5XXz5jXG0kISM1JCIwXDhKMlU6KD4hIzY3JCQiMG9LUTQpSG1PISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwRWNdL08pb08hIzckIjBcOEoyVTooPiEjNjckJCIwb0tRNClIbU8hIzckIjBcOEoyVTooPiEjNjckNyQkIjBFY10vTylvTyEjNyQiMFw4SjJVOig+ISM2NyQkIjAlXGtWejxxTyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGBvWyplcnNPISM3JCIwXDhKMlU6KD4hIzY3JCQiMCVca1Z6PHFPISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYG9bKmVyc08hIzckIjBcOEoyVTooPiEjNjckJCIwQGRNemRTbiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjB6IW9XZGZ3TyEjNyQiMFw4SjJVOig+ISM2NyQkIjBAZE16ZFNuJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHohb1dkZndPISM3JCIwXDhKMlU6KD4hIzY3JCQiMFpwS2tQem4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMSRcJWZ2L28kISM3JCIwXDhKMlU6KD4hIzY3JCQiMFpwS2tQem4kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMSRcJWZ2L28kISM3JCIwXDhKMlU6KD4hIzY3JCQiMHUiMyRcPD1vJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEswVldiVm8kISM3JCIwXDhKMlU6KD4hIzY3JCQiMHUiMyRcPD1vJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEwwVldiVm8kISM3JCIwXDhKMlU6KD4hIzY3JCQiLiUqR00ocCZvJCEjNSQiMFw4SjJVOig+ISM2NyQ3JCQiMGY8VEhOIylvJCEjNyQiMFw4SjJVOig+ISM2NyQkIi4lKkdNKHAmbyQhIzUkIjBcOEoyVTooPiEjNjckNyQkIjBmPFRITiMpbyQhIzckIjBcOEoyVTooPiEjNjckJCIwRjFGPngmKm8kISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJilIUjk6QHAkISM3JCIwXDhKMlU6KD4hIzY3JCQiMEYxRj54JipvJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCcpSFI5OkBwJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBgPUQvZE1wJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDdVUCpcKmZwJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBgPUQvZE1wJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDdVUCpcKmZwJCEjNyQiMFw4SjJVOig+ISM2NyQkIi8zTCMqb0wocCQhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBRYU4lWygpKnAkISM3JCIwXDhKMlU6KD4hIzY3JCQiLzNMIypvTChwJCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMFJhTiVbKCkqcCQhIzckIjBcOEoyVTooPiEjNjckJCIwMVZAdTs3cSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBsbUxwYVBxJCEjNyQiMFw4SjJVOig+ISM2NyQkIjAxVkB1OzdxJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGxtTHBhUHEkISM3JCIwXDhKMlU6KD4hIzY3JCQiMExiPmYnNDBQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIyp5SmFNd3EkISM3JCIwXDhKMlU6KD4hIzY3JCQiMExiPmYnNDBQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIyp5SmFNd3EkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGZuPFd3KjNQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwXDhKMlU6KD4hIzY3JCQiMGZuPFd3KjNQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCcpejpIY0dyJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFguR0MlUjpQISM3JCIwXDhKMlU6KD4hIzY3JCQiMCcpejpIY0dyJCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFguR0MlUjpQISM3JCIwXDhKMlU6KD4hIzY3JCQiMDcjUlRodDtQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwcjpFNHUjPlAhIzckIjBcOEoyVTooPiEjNjckJCIwNyNSVGh0O1AhIzckIjBcOEoyVTooPiEjNjckNyQkIjByOkU0dSM+UCEjNyQiMFw4SjJVOig+ISM2NyQkIjBSLzcqZmg/UCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCl6VVVSOkJQISM3JCIwXDhKMlU6KD4hIzY3JCQiMFIvNypmaD9QISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKXpVVVI6QlAhIzckIjBcOEoyVTooPiEjNjckJCIwbDs1JWVcQ1AhIzckIjBcOEoyVTooPiEjNjckNyQkIjBDU0F6THFzJCEjNyQiMFw4SjJVOig+ISM2NyQkIjBsOzUlZVxDUCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMENTQXpMcXMkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCMqRzNwdiRHUCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMF5fP2s4NHQkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCMqRzNwdiRHUCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMF5fP2s4NHQkISM3JCIwXDhKMlU6KD4hIzY3JCQiMD1UMWFiQXQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIweGs9XCR6TVAhIzckIjBcOEoyVTooPiEjNjckJCIwPVQxYWJBdCQhIzckIjBcOEoyVTooPiEjNjckNyQkIjB4az1cJHpNUCEjNyQiMFw4SjJVOig+ISM2NyQkIjBYYC9STmh0JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC94O010J1FQISM3JCIwXDhKMlU6KD4hIzY3JCQiMFhgL1JOaHQkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwL3g7TXQnUVAhIzckIjBcOEoyVTooPiEjNjckJCIwcmwtQzordSQhIzckIjBcOEoyVTooPiEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjBcOEoyVTooPiEjNjckJCIwcmwtQzordSQhIzckIjBcOEoyVTooPiEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjBcOEoyVTooPiEjNjckJCIwKXoyITQmKlF1JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGQsOC9Ma3UkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCl6MiE0JipRdSQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBkLDgvTGt1JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBDISopUlx4WlAhIzckIjBcOEoyVTooPiEjNjckNyQkIjAkUTYiKkdKXVAhIzckIjBcOEoyVTooPiEjNjckJCIwQyEqKVJceFpQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJFE2IipHSl1QISM3JCIwXDhKMlU6KD4hIzY3JCQiMF4tKCp5YTt2JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL2gjNHUjPmFQISM2JCIwXDhKMlU6KD4hIzY3JCQiMF4tKCp5YTt2JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL2gjNHUjPmFQISM2JCIwXDhKMlU6KD4hIzY3JCQiMHg5JlJZYGJQISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwT1EyZnMhZVAhIzckIjBcOEoyVTooPiEjNjckJCIweDkmUllgYlAhIzckIjBcOEoyVTooPiEjNjckNyQkIjBPUTJmcyFlUCEjNyQiMFw4SjJVOig+ISM2NyQkIjAvRiQqWzklZlAhIzckIjBcOEoyVTooPiEjNjckNyQkIjBqXTBXXz53JCEjNyQiMFw4SjJVOig+ISM2NyQkIjAvRiQqWzklZlAhIzckIjBcOEoyVTooPiEjNjckNyQkIjBqXTBXXz53JCEjNyQiMFw4SjJVOig+ISM2NyQkIi8kUiJSVkhqUCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMFw4SjJVOig+ISM2NyQkIi8kUiJSVkhqUCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBkXiopPXVydyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA7diw5NyhwUCEjNyQiMFw4SjJVOig+ISM2NyQkIjBkXiopPXVydyQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA7diw5NyhwUCEjNyQiMFw4SjJVOig+ISM2NyQkIjAkUXdRUzByUCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFUoKSoqKT5mdFAhIzckIjBcOEoyVTooPiEjNjckJCIwJFF3UVMwclAhIzckIjBcOEoyVTooPiEjNjckNyQkIjBVKCkqKik+ZnRQISM3JCIwXDhKMlU6KD4hIzY3JCQiL2hkKSlRJFx4JCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMHAqelI9WnhQISM3JCIwXDhKMlU6KD4hIzY3JCQiL2hkKSlRJFx4JCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMHAqelI9WnhQISM3JCIwXDhKMlU6KD4hIzY3JCQiME8pUVFQIil5UCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCY+aCpvXjh5JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBPKVFRUCIpeVAhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmPmgqb144eSQhIzckIjBcOEoyVTooPiEjNjckJCIwaisjKWUkcCN5JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEFDJVI6QiZ5JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBqKyMpZSRwI3kkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQUMlUjpCJnkkISM3JCIwXDhKMlU6KD4hIzY3JCQiMCpHLFFNZCd5JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFtPIypRNiIqeSQhIzckIjBcOEoyVTooPiEjNjckJCIwKkcsUU1kJ3kkISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwW08jKlE2Iip5JCEjNyQiMFw4SjJVOig+ISM2NyQkIjA7RHlHYC96JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHZbIVI3Kkh6JCEjNyQiMFw4SjJVOig+ISM2NyQkIjA7RHlHYC96JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHZbIVI3Kkh6JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBVUHc4TFZ6JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCxoKSkzcm96JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBVUHc4TFZ6JCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCxoKSkzcm96JCEjNyQiMFw4SjJVOig+ISM2NyQkIjBwXHUpSEApeiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBHdCdRNHYrUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBwXHUpSEApeiQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBHdCdRNHYrUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAnPkVQRzQtUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGEmWyl5SVkhUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAnPkVQRzQtUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGEmWyl5SVkhUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBBdXFvc2YhUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIwXDhKMlU6KD4hIzY3JCQiMEF1cW9zZiFRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwInlIUTFeM1EhIzckIjBcOEoyVTooPiEjNjckJCIwXCcpb2BfKTRRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMjUiKVshUjdRISM3JCIwXDhKMlU6KD4hIzY3JCQiMFwnKW9gXyk0USEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDI1IilbIVI3USEjNyQiMFw4SjJVOig+ISM2NyQkIjB2KXAnUUtQIlEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBNQXpMcWkiUSEjNyQiMFw4SjJVOig+ISM2NyQkIjB2KXAnUUtQIlEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBNQXpMcWkiUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAtNmxCN3ciUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1l0KD1dLCNRISM2JCIwXDhKMlU6KD4hIzY3JCQiMC02bEI3dyJRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvWXQoPV0sI1EhIzYkIjBcOEoyVTooPiEjNjckJCIwR0JqMyNcQFEhIzckIjBcOEoyVTooPiEjNjckNyQkIjAob2FQKy5DUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBHQmozI1xAUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMChvYVArLkNRISM3JCIwXDhKMlU6KD4hIzY3JCQiMGJOaCQ+UERRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIwXDhKMlU6KD4hIzY3JCQiMGJOaCQ+UERRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIwXDhKMlU6KD4hIzY3JCQiMCJ5JWZ5XiNIUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLzk8UCgqeUpRISM2JCIwXDhKMlU6KD4hIzY3JCQiMCJ5JWZ5XiNIUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLzk8UCgqeUpRISM2JCIwXDhKMlU6KD4hIzY3JCQiMDNnZGpKSiRRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbSQpcGVwYyRRISM3JCIwXDhKMlU6KD4hIzY3JCQiMDNnZGpKSiRRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbSQpcGVwYyRRISM3JCIwXDhKMlU6KD4hIzY3JCQiME1zYls2cSRRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJGZ6TyVcJlJRISM3JCIwXDhKMlU6KD4hIzY3JCQiME1zYls2cSRRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJGZ6TyVcJlJRISM3JCIwXDhKMlU6KD4hIzY3JCQiMGglUU44KjMlUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMD4zbUdITSVRISM3JCIwXDhKMlU6KD4hIzY3JCQiMGglUU44KjMlUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMD4zbUdITSVRISM3JCIwXDhKMlU6KD4hIzY3JCQiMChvPiY9clolUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFk/azg0dCVRISM3JCIwXDhKMlU6KD4hIzY3JCQiMChvPiY9clolUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFk/azg0dCVRISM3JCIwXDhKMlU6KD4hIzY3JCQiMDk0XS5eJ1tRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwc0tpKSopPV5RISM3JCIwXDhKMlU6KD4hIzY3JCQiMDk0XS5eJ1tRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwc0tpKSopPV5RISM3JCIwXDhKMlU6KD4hIzY3JCQiLzkjWykzYF9RISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKlwvTylvXSZRISM3JCIwXDhKMlU6KD4hIzY3JCQiLzkjWykzYF9RISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKlwvTylvXSZRISM3JCIwXDhKMlU6KD4hIzY3JCQiMG5MWXQ1ayZRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwRGRlb1sqZVEhIzckIjBcOEoyVTooPiEjNjckJCIwbkxZdDVrJlEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBEZGVvWyplUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAkZlclZSFIZ1EhIzckIjBcOEoyVTooPiEjNjckNyQkIjBfcGNgR0cnUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAkZlclZSFIZ1EhIzckIjBcOEoyVTooPiEjNjckNyQkIjBfcGNgR0cnUSEjNyQiMFw4SjJVOig+ISM2NyQkIi8jZVVWcVQnUSEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMHkiWyZRM24nUSEjNyQiMFw4SjJVOig+ISM2NyQkIi8jZVVWcVQnUSEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMHkiWyZRM24nUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBZcVNHXSFvUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBZcVNHXSFvUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMFw4SjJVOig+ISM2NyQkIjB0IylROEk+KFEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBKMV4zb1coUSEjNyQiMFw4SjJVOig+ISM2NyQkIjB0IylROEk+KFEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBKMV4zb1coUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAqXHAkKSo0ZShRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwZT1cJHpNeVEhIzckIjBcOEoyVTooPiEjNjckJCIwKlxwJCkqNGUoUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGU9XCR6TXlRISM3JCIwXDhKMlU6KD4hIzY3JCQiMEUyTiQpKm96USEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCUzdCV5RkEpUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBFMk4kKSpvelEhIzckIjBcOEoyVTooPiEjNjckNyQkIjAlM3QleUZBKVEhIzckIjBcOEoyVTooPiEjNjckJCIwXz5Mb3BOKVEhIzckIjBcOEoyVTooPiEjNjckNyQkIjA2VlhqMmgpUSEjNyQiMFw4SjJVOig+ISM2NyQkIjBfPkxvcE4pUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDZWWGoyaClRISM3JCIwXDhKMlU6KD4hIzY3JCQiMHpKSmBcdSlRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwUGJWWygpKiopUSEjNyQiMFw4SjJVOig+ISM2NyQkIjB6SkpgXHUpUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFBiVlsoKSoqKVEhIzckIjBcOEoyVTooPiEjNjckJCIwMFdIUUg4KlEhIzckIjBcOEoyVTooPiEjNjckNyQkIjBrblRMblEqUSEjNyQiMFw4SjJVOig+ISM2NyQkIjAwV0hRSDgqUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGtuVExuUSpRISM3JCIwXDhKMlU6KD4hIzY3JCQiMEtjRkI0XypRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIip6Uj1aeCpRISM3JCIwXDhKMlU6KD4hIzY3JCQiMEtjRkI0XypRISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwIip6Uj1aeCpRISM3JCIwXDhKMlU6KD4hIzY3JCQiMGVvRDMqMyoqUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDwjekxxaSxSISM3JCIwXDhKMlU6KD4hIzY3JCQiMGVvRDMqMyoqUSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDwjekxxaSxSISM3JCIwXDhKMlU6KD4hIzY3JCQiMCYzUUsqb0ghUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFcvTylvXTBSISM3JCIwXDhKMlU6KD4hIzY3JCQiMCYzUUsqb0ghUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFcvTylvXTBSISM3JCIwXDhKMlU6KD4hIzY3JCQiMDYkPiN5W28hUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL25UTG5RNFIhIzYkIjBcOEoyVTooPiEjNjckJCIwNiQ+I3lbbyFSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvblRMblE0UiEjNiQiMFw4SjJVOig+ISM2NyQkIjBRMD9qRzIiUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCgqR0tlbUsiUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBRMD9qRzIiUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCgqR0tlbUsiUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBrPD1bM1kiUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEJUSVZZciJSISM3JCIwXDhKMlU6KD4hIzY3JCQiMGs8PVszWSJSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQlRJVllyIlIhIzckIjBcOEoyVTooPiEjNjckJCIwIipIO0wpWz1SISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvTiZHR0U1I1IhIzYkIjBcOEoyVTooPiEjNjckJCIwIipIO0wpWz1SISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvTiZHR0U1I1IhIzYkIjBcOEoyVTooPiEjNjckJCIwPFU5PW9CI1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjB3bEU4MVwjUiEjNyQiMFw4SjJVOig+ISM2NyQkIjA8VTk9b0IjUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHdsRTgxXCNSISM3JCIwXDhKMlU6KD4hIzY3JCQiMFdhNy5baSNSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLnlDKWZ5R1IhIzckIjBcOEoyVTooPiEjNjckJCIwV2E3LltpI1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjAueUMpZnlHUiEjNyQiMFw4SjJVOig+ISM2NyQkIi9uMSIpeTdJUiEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMEghSEtlbUtSISM3JCIwXDhKMlU6KD4hIzY3JCQiL24xIil5N0lSISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwSCFIS2VtS1IhIzckIjBcOEoyVTooPiEjNjckJCIwKCp5M3QyUyRSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYy1Ab1hsJFIhIzckIjBcOEoyVTooPiEjNjckJCIwKCp5M3QyUyRSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYy1Ab1hsJFIhIzckIjBcOEoyVTooPiEjNjckJCIwQiJwIWUoKXkkUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBCInAhZSgpeSRSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwI1siPmBELyVSISM3JCIwXDhKMlU6KD4hIzY3JCQiL05dSXV3VFIhIzYkIjBcOEoyVTooPiEjNjckNyQkIjA0RjxRMFYlUiEjNyQiMFw4SjJVOig+ISM2NyQkIi9OXUl1d1RSISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwNEY8UTBWJVIhIzckIjBcOEoyVTooPiEjNjckJCIwdzouR1pjJVIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBOUjpCJj1bUiEjNyQiMFw4SjJVOig+ISM2NyQkIjB3Oi5HWmMlUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME5SOkImPVtSISM3JCIwXDhKMlU6KD4hIzY3JCQiMC5HLDhGJlxSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwaV44M2w/JlIhIzckIjBcOEoyVTooPiEjNjckJCIwLkcsOEYmXFIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBpXjgzbD8mUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBIUyp6cFNgUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBIUyp6cFNgUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBjXyhIb0dkUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDp3NHlDKWZSISM3JCIwXDhKMlU6KD4hIzY3JCQiMGNfKEhvR2RSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOnc0eUMpZlIhIzckIjBcOEoyVTooPiEjNjckJCIwI1tjem07aFIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBUKXlJWXFqUiEjNyQiMFw4SjJVOig+ISM2NyQkIjAjW2N6bTtoUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFQpeUlZcWpSISM3JCIwXDhKMlU6KD4hIzY3JCQiMDR4JEhsL2xSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbysxWyVlblIhIzckIjBcOEoyVTooPiEjNjckJCIwNHgkSGwvbFIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBvKzFbJWVuUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBOKj16aiMqb1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjAlSFRJVllyUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBOKj16aiMqb1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjAlSFRJVllyUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBpLCFIaSFHKFIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBARC09V2AoUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBpLCFIaSFHKFIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBARC09V2AoUiEjNyQiMFw4SjJVOig+ISM2NyQkIjApUSIpeWdvd1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjBaUCsuQyN6UiEjNyQiMFw4SjJVOig+ISM2NyQkIjApUSIpeWdvd1IhIzckIjBcOEoyVTooPiEjNjckNyQkIjBaUCsuQyN6UiEjNyQiMFw4SjJVOig+ISM2NyQkIjA6RSdHZmMhKVIhIzckIjBcOEoyVTooPiEjNjckNyQkIjB1XCl6UTUkKVIhIzckIjBcOEoyVTooPiEjNjckJCIwOkUnR2ZjISlSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdVwpelE1JClSISM3JCIwXDhKMlU6KD4hIzY3JCQiMFRRJXlkVyUpUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLmknSFApcClSISM1JCIwXDhKMlU6KD4hIzY3JCQiMFRRJXlkVyUpUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLmknSFApcClSISM1JCIwXDhKMlU6KD4hIzY3JCQiMG9dI0djSykpUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEZ1JXpOJzMqUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBvXSNHY0spKVIhIzckIjBcOEoyVTooPiEjNjckNyQkIjBGdSV6TiczKlIhIzckIjBcOEoyVTooPiEjNjckJCIwJUgxeWE/IypSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYCdHSE11JSpSISM3JCIwXDhKMlU6KD4hIzY3JCQiMCVIMXlhPyMqUiEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGAnR0hNdSUqUiEjNyQiMFw4SjJVOig+ISM2NyQkIjBAdnlLJjMnKlIhIzckIjBcOEoyVTooPiEjNjckNyQkIi8pKTR6S2kpKlIhIzYkIjBcOEoyVTooPiEjNjckJCIwQHZ5SyYzJypSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvKSk0ektpKSpSISM2JCIwXDhKMlU6KD4hIzY3JCQiMFoob3heJyoqKlIhIzckIjBcOEoyVTooPiEjNjckNyQkIjAxNipHSl0tUyEjNyQiMFw4SjJVOig+ISM2NyQkIjBaKG94XicqKipSISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMTYqR0pdLVMhIzckIjBcOEoyVTooPiEjNjckJCIwdSpcRl0lUSslISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTEIoeUhRMVMhIzckIjBcOEoyVTooPiEjNjckJCIwdSpcRl0lUSslISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTEIoeUhRMVMhIzckIjBcOEoyVTooPiEjNjckJCIuN3QoW3MyUyEjNSQiMFw4SjJVOig+ISM2NyQ3JCQiMGZOJkdHRTVTISM3JCIwXDhKMlU6KD4hIzY3JCQiLjd0KFtzMlMhIzUkIjBcOEoyVTooPiEjNjckNyQkIjBmTiZHR0U1UyEjNyQiMFw4SjJVOig+ISM2NyQkIjBGQ3JzLzssJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCd5TXlFOTlTISM3JCIwXDhKMlU6KD4hIzY3JCQiMEZDcnMvOywlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJ3lNeUU5OVMhIzckIjBcOEoyVTooPiEjNjckJCIwYU9wZCVbOlMhIzckIjBcOEoyVTooPiEjNjckNyQkIjA3ZyJHRC09UyEjNyQiMFw4SjJVOig+ISM2NyQkIjBhT3BkJVs6UyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDdnIkdELT1TISM3JCIwXDhKMlU6KD4hIzY3JCQiLylbblVrJD5TISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwUnN6UC0+LSUhIzckIjBcOEoyVTooPiEjNjckJCIvKVtuVWskPlMhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBSc3pQLT4tJSEjNyQiMFw4SjJVOig+ISM2NyQkIjAyaGxGV0stJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGwleUZBeURTISM3JCIwXDhKMlU6KD4hIzY3JCQiMDJobEZXSy0lISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbCV5RkF5RFMhIzckIjBcOEoyVTooPiEjNjckJCIwTHRqN0NyLSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAjcGZ4P21IUyEjNyQiMFw4SjJVOig+ISM2NyQkIjBMdGo3Q3ItJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCNwZng/bUhTISM3JCIwXDhKMlU6KD4hIzY3JCQiL2M9d1IrSlMhIzYkIjBcOEoyVTooPiEjNjckNyQkIjA9NHUjPmFMUyEjNyQiMFw4SjJVOig+ISM2NyQkIi9jPXdSK0pTISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwPTR1Iz5hTFMhIzckIjBcOEoyVTooPiEjNjckJCIwJ3kqZiNRKVsuJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFhAc3hAdS4lISM3JCIwXDhKMlU6KD4hIzY3JCQiMCd5KmYjUSlbLiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBYQHN4QHUuJSEjNyQiMFw4SjJVOig+ISM2NyQkIjA4NWVuaihRUyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHJMcWksOC8lISM3JCIwXDhKMlU6KD4hIzY3JCQiMDg1ZW5qKFFTISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwckxxaSw4LyUhIzckIjBcOEoyVTooPiEjNjckJCIwUkFjX1ZFLyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjApZiVvWiI9WFMhIzckIjBcOEoyVTooPiEjNjckJCIwUkFjX1ZFLyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjApZiVvWiI9WFMhIzckIjBcOEoyVTooPiEjNjckJCIwbU1hUEJsLyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBDZW1LaCFcUyEjNyQiMFw4SjJVOig+ISM2NyQkIjBtTWFQQmwvJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMENlbUtoIVxTISM3JCIwXDhKMlU6KD4hIzY3JCQiMCNwQ0RLU11TISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwXnFrPFRIMCUhIzckIjBcOEoyVTooPiEjNjckJCIwI3BDREtTXVMhIzckIjBcOEoyVTooPiEjNjckNyQkIjBecWs8VEgwJSEjNyQiMFw4SjJVOig+ISM2NyQkIjA+Zl0yJEdhUyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHgjR0U1I28wJSEjNyQiMFw4SjJVOig+ISM2NyQkIjA+Zl0yJEdhUyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHgjR0U1I28wJSEjNyQiMFw4SjJVOig+ISM2NyQkIjBYclsjSDtlUyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMC8mNHczcWdTISM3JCIwXDhKMlU6KD4hIzY3JCQiMFhyWyNIO2VTISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLyY0dzNxZ1MhIzckIjBcOEoyVTooPiEjNjckJCIwcyRvdUYvaVMhIzckIjBcOEoyVTooPiEjNjckNyQkIi90IWZzIWVrUyEjNiQiMFw4SjJVOig+ISM2NyQkIjBzJG91Ri9pUyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL3QhZnMhZWtTISM2JCIwXDhKMlU6KD4hIzY3JCQiMClmXENFI2YxJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwXDhKMlU6KD4hIzY3JCQiMClmXENFI2YxJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwXDhKMlU6KD4hIzY3JCQiMEQzVlotKXBTISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJD1gRC9Nc1MhIzckIjBcOEoyVTooPiEjNjckJCIwRDNWWi0pcFMhIzckIjBcOEoyVTooPiEjNjckNyQkIjAkPWBEL01zUyEjNyQiMFw4SjJVOig+ISM2NyQkIjBeP1RLI290UyEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1RNdi1Bd1MhIzYkIjBcOEoyVTooPiEjNjckJCIwXj9USyNvdFMhIzckIjBcOEoyVTooPiEjNjckNyQkIi9UTXYtQXdTISM2JCIwXDhKMlU6KD4hIzY3JCQiMHlLUjxpdjIlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwT2NeNyssMyUhIzckIjBcOEoyVTooPiEjNjckJCIweUtSPGl2MiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBPY143KywzJSEjNyQiMFw4SjJVOig+ISM2NyQkIjAvWFAtVTkzJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGpvXCgqelIzJSEjNyQiMFw4SjJVOig+ISM2NyQkIjAvWFAtVTkzJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGpvXCgqelIzJSEjNyQiMFw4SjJVOig+ISM2NyQkIjBKZE4oPUsmMyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAqM3lDKWZ5MyUhIzckIjBcOEoyVTooPiEjNjckJCIwSmROKD1LJjMlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKjN5QylmeTMlISM3JCIwXDhKMlU6KD4hIzY3JCQiMGRwTHMsIyozJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDskZnUnUjw0JSEjNyQiMFw4SjJVOig+ISM2NyQkIjBkcExzLCMqMyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjA7JGZ1J1I8NCUhIzckIjBcOEoyVTooPiEjNjckJCIwJT09dDozJDQlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVTBXXz5jNCUhIzckIjBcOEoyVTooPiEjNjckJCIwJT09dDozJDQlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwVTBXXz5jNCUhIzckIjBcOEoyVTooPiEjNjckJCIvVCpIVWhwNCUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBwPFVQKlwqNCUhIzckIjBcOEoyVTooPiEjNjckJCIvVCpIVWhwNCUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBwPFVQKlwqNCUhIzckIjBcOEoyVTooPiEjNjckJCIwUDFHRlQzNSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmKkhTQXpMNSUhIzckIjBcOEoyVTooPiEjNjckJCIwUDFHRlQzNSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmKkhTQXpMNSUhIzckIjBcOEoyVTooPiEjNjckJCIwaj1FN0BaNSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBBVVEyZnM1JSEjNyQiMFw4SjJVOig+ISM2NyQkIjBqPUU3QFo1JSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEFVUTJmczUlISM3JCIwXDhKMlU6KD4hIzY3JCQiLzRWczRnM1QhIzYkIjBcOEoyVTooPiEjNjckNyQkIjBbYU8jKlE2NiUhIzckIjBcOEoyVTooPiEjNjckJCIvNFZzNGczVCEjNiQiMFw4SjJVOig+ISM2NyQ3JCQiMFthTyMqUTY2JSEjNyQiMFw4SjJVOig+ISM2NyQkIjA7VkEjM1s3VCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMHZtTXg9XTYlISM3JCIwXDhKMlU6KD4hIzY3JCQiMDtWQSMzWzdUISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdm1NeD1dNiUhIzckIjBcOEoyVTooPiEjNjckJCIwVmI/bmdqNiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAsektpKSopPVQhIzckIjBcOEoyVTooPiEjNjckJCIwVmI/bmdqNiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAsektpKSopPVQhIzckIjBcOEoyVTooPiEjNjckJCIwcG49X1MtNyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBHIjR0JXlGNyUhIzckIjBcOEoyVTooPiEjNjckJCIwcG49X1MtNyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBHIjR0JXlGNyUhIzckIjBcOEoyVTooPiEjNjckJCIwJyp6O1A/VDclISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYi5IS2VtNyUhIzckIjBcOEoyVTooPiEjNjckJCIwJyp6O1A/VDclISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYi5IS2VtNyUhIzckIjBcOEoyVTooPiEjNjckJCIwQSNcQC0rR1QhIzckIjBcOEoyVTooPiEjNjckNyQkIjAiZXJzIlEwOCUhIzckIjBcOEoyVTooPiEjNjckJCIwQSNcQC0rR1QhIzckIjBcOEoyVTooPiEjNjckNyQkIjAiZXJzIlEwOCUhIzckIjBcOEoyVTooPiEjNjckJCIwXC84MiEpPTglISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwM0dELT1XOCUhIzckIjBcOEoyVTooPiEjNjckJCIwXC84MiEpPTglISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwM0dELT1XOCUhIzckIjBcOEoyVTooPiEjNjckJCIwdjs2IypmZDglISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTVNCKHlIUVQhIzckIjBcOEoyVTooPiEjNjckJCIwdjs2IypmZDglISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTVNCKHlIUVQhIzckIjBcOEoyVTooPiEjNjckJCIwLUg0eFInUlQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBoX0BzeEA5JSEjNyQiMFw4SjJVOig+ISM2NyQkIjAtSDR4UidSVCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGhfQHN4QDklISM3JCIwXDhKMlU6KD4hIzY3JCQiMEdUMmk+TjklISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKFsnPmRkZzklISM3JCIwXDhKMlU6KD4hIzY3JCQiMEdUMmk+TjklISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwKFsnPmRkZzklISM3JCIwXDhKMlU6KD4hIzY3JCQiMGJgMFoqUlpUISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwOXg8VVAqXFQhIzckIjBcOEoyVTooPiEjNjckJCIwYmAwWipSWlQhIzckIjBcOEoyVTooPiEjNjckNyQkIjA5eDxVUCpcVCEjNyQiMFw4SjJVOig+ISM2NyQkIjAiZU8/JHo3OiUhIzckIjBcOEoyVTooPiEjNjckNyQkIi8lKmVycyJROiUhIzYkIjBcOEoyVTooPiEjNjckJCIwImVPPyR6NzolISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvJSplcnMiUTolISM2JCIwXDhKMlU6KD4hIzY3JCQiMDN5LDxmXjolISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwbiw5NyhwZFQhIzckIjBcOEoyVTooPiEjNjckJCIwM3ksPGZeOiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBuLDk3KHBkVCEjNyQiMFw4SjJVOig+ISM2NyQkIjBNISoqPiFSIWZUISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwJFJAcnBkaFQhIzckIjBcOEoyVTooPiEjNjckJCIwTSEqKj4hUiFmVCEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCRSQHJwZGhUISM3JCIwXDhKMlU6KD4hIzY3JCQiMGgtKXApPUg7JSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL2ktQG9YbFQhIzYkIjBcOEoyVTooPiEjNjckJCIwaC0pcCk9SDslISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvaS1Ab1hsVCEjNiQiMFw4SjJVOig+ISM2NyQkIjAoW2g+KCl6bVQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBZUTNuTyRwVCEjNyQiMFw4SjJVOig+ISM2NyQkIjAoW2g+KCl6bVQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBZUTNuTyRwVCEjNyQiMFw4SjJVOig+ISM2NyQkIjA5RiVwJnkxPCUhIzckIjBcOEoyVTooPiEjNjckNyQkIjB0XTFfO0s8JSEjNyQiMFw4SjJVOig+ISM2NyQkIjA5RiVwJnkxPCUhIzckIjBcOEoyVTooPiEjNjckNyQkIjB0XTFfO0s8JSEjNyQiMFw4SjJVOig+ISM2NyQkIi8lUiM+JWVYPCUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjAqSFlxajR4VCEjNyQiMFw4SjJVOig+ISM2NyQkIi8lUiM+JWVYPCUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjAqSFlxajR4VCEjNyQiMFw4SjJVOig+ISM2NyQkIjBuXiFwI1EleVQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBFdi1BdzQ9JSEjNyQiMFw4SjJVOig+ISM2NyQkIjBuXiFwI1EleVQhIzckIjBcOEoyVTooPiEjNjckNyQkIjBFdi1BdzQ9JSEjNyQiMFw4SjJVOig+ISM2NyQkIjAkUicpPSI9Qj0lISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwXygzcWcmWz0lISM3JCIwXDhKMlU6KD4hIzY3JCQiMCRSJyk9Ij1CPSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjBcOEoyVTooPiEjNjckJCIvaW5vej4nPSUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjB6KiopPmZ0KT0lISM3JCIwXDhKMlU6KD4hIzY3JCQiL2lub3o+Jz0lISM2JCIwXDhKMlU6KD4hIzY3JDckJCIweioqKT5mdCk9JSEjNyQiMFw4SjJVOig+ISM2NyQkIjBZKVs9eTIhPiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAwNyhwZGgjPiUhIzckIjBcOEoyVTooPiEjNjckJCIwWSlbPXkyIT4lISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwMDcocGRoIz4lISM3JCIwXDhKMlU6KD4hIzY3JCQiMHQrJG93JlI+JSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMEtDJj5jXCc+JSEjNyQiMFw4SjJVOig+ISM2NyQkIjB0KyRvdyZSPiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBLQyY+Y1wnPiUhIzckIjBcOEoyVTooPiEjNjckJCIwKkg2PXYkeT4lISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwZU8kcGFQK1UhIzckIjBcOEoyVTooPiEjNjckJCIwKkg2PXYkeT4lISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwZU8kcGFQK1UhIzckIjBcOEoyVTooPiEjNjckJCIwRUR6Tzw8PyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmKVsiPmBEL1UhIzckIjBcOEoyVTooPiEjNjckJCIwRUR6Tzw8PyUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAmKVsiPmBEL1UhIzckIjBcOEoyVTooPiEjNjckJCIwX1B4QChmMFUhIzckIjBcOEoyVTooPiEjNjckNyQkIjA2aCpvXjgzVSEjNyQiMFw4SjJVOig+ISM2NyQkIjBfUHhAKGYwVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMDZoKm9eODNVISM3JCIwXDhKMlU6KD4hIzY3JCQiMHpcdjF4JTRVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwUXQoPV0sN1UhIzckIjBcOEoyVTooPiEjNjckJCIwelx2MXglNFUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBRdCg9XSw3VSEjNyQiMFw4SjJVOig+ISM2NyQkIjAwaXQicE44VSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGsmZW9bKmVAJSEjNyQiMFw4SjJVOig+ISM2NyQkIjAwaXQicE44VSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGsmZW9bKmVAJSEjNyQiMFw4SjJVOig+ISM2NyQkIjBLdXJ3T3NAJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCJ6Uj1aeD5VISM3JCIwXDhKMlU6KD4hIzY3JCQiMEt1cndPc0AlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwInpSPVp4PlUhIzckIjBcOEoyVTooPiEjNjckJCIwZicpcGg7NkElISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwPDUjb1hsQlUhIzckIjBcOEoyVTooPiEjNjckJCIwZicpcGg7NkElISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwPDUjb1hsQlUhIzckIjBcOEoyVTooPiEjNjckJCIwJikpem1rKlxBJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMFdBIT1XYEZVISM3JCIwXDhKMlU6KD4hIzY3JCQiMCYpKXptaypcQSUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBXQSE9V2BGVSEjNyQiMFw4SjJVOig+ISM2NyQkIjA3Nm1KdylHVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiL1okeUU5OUIlISM2JCIwXDhKMlU6KD4hIzY3JCQiMDc2bUp3KUdVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIvWiR5RTk5QiUhIzYkIjBcOEoyVTooPiEjNjckJCIwUUJrO2NGQiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAocGs8VEhOVSEjNyQiMFw4SjJVOig+ISM2NyQkIjBRQms7Y0ZCJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMChwazxUSE5VISM3JCIwXDhKMlU6KD4hIzY3JCQiMGxOaSxPbUIlISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwQmZ1J1I8UlUhIzckIjBcOEoyVTooPiEjNjckJCIwbE5pLE9tQiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBCZnUnUjxSVSEjNyQiMFw4SjJVOig+ISM2NyQkIjAiei9tZV5TVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiLzpGPFEwVlUhIzYkIjBcOEoyVTooPiEjNjckJCIwInovbWVeU1UhIzckIjBcOEoyVTooPiEjNjckNyQkIi86RjxRMFZVISM2JCIwXDhKMlU6KD4hIzY3JCQiMD1nZXImUldVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdyQzbk8kcEMlISM3JCIwXDhKMlU6KD4hIzY3JCQiMD1nZXImUldVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwdyQzbk8kcEMlISM3JCIwXDhKMlU6KD4hIzY3JCQiMFdzY2N2I1tVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLicqb144M0QlISM3JCIwXDhKMlU6KD4hIzY3JCQiMFdzY2N2I1tVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwLicqb144M0QlISM3JCIwXDhKMlU6KD4hIzY3JCQiMHIlWzphOl9VISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwSDNuTyRwYVUhIzckIjBcOEoyVTooPiEjNjckJCIwciVbOmE6X1UhIzckIjBcOEoyVTooPiEjNjckNyQkIjBIM25PJHBhVSEjNyQiMFw4SjJVOig+ISM2NyQkIjAocEhsXy5jVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGM/bEB0JmVVISM3JCIwXDhKMlU6KD4hIzY3JCQiMChwSGxfLmNVISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwYz9sQHQmZVUhIzckIjBcOEoyVTooPiEjNjckJCIwQzReNjoqZlUhIzckIjBcOEoyVTooPiEjNjckNyQkIjAjR0xtSVhpVSEjNyQiMFw4SjJVOig+ISM2NyQkIjBDNF42OipmVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMCNHTG1JWGlVISM3JCIwXDhKMlU6KD4hIzY3JCQiLzojXCdcempVISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwNFhoIkhMbVUhIzckIjBcOEoyVTooPiEjNjckJCIvOiNcJ1x6alUhIzYkIjBcOEoyVTooPiEjNjckNyQkIjA0WGgiSExtVSEjNyQiMFw4SjJVOig+ISM2NyQkIjB4TFoiW25uVSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiME5kZnc3LUYlISM3JCIwXDhKMlU6KD4hIzY3JCQiMHhMWiJbbm5VISM3JCIwXDhKMlU6KD4hIzY3JDckJCIwTmRmdzctRiUhIzckIjBcOEoyVTooPiEjNjckJCIwLllYbWE6RiUhIzckIjBcOEoyVTooPiEjNjckNyQkIjBpcGRoIzR1VSEjNyQiMFw4SjJVOig+ISM2NyQkIjAuWVhtYTpGJSEjNyQiMFw4SjJVOig+ISM2NyQ3JCQiMGlwZGgjNHVVISM3JCIwXDhKMlU6KD4hIzY3JCQiLyRlVl5NYUYlISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKT1lbEMoekYlISM3JCIwXDhKMlU6KD4hIzY3JCQiLyRlVl5NYUYlISM2JCIwXDhKMlU6KD4hIzY3JDckJCIwKT1lbEMoekYlISM3JCIwXDhKMlU6KD4hIzY3JCQiMGAzazkhW3pVISM3JCIwPSpRKzAscj4hIzY3JDckJCIwOiVSOkImPUclISM3JCIwPSpRKzAscj4hIzY3JCQiMGAzazkhW3pVISM3JCIwPSpRKzAscj4hIzY3JDckJCIwVDFfO0tkRyUhIzckIjBtJypmYEshZT4hIzY3JCQiMDQjNHEkUVRHJSEjNyQiMDo+YEQvTSc+ISM2NyQ3JCQiMDQjNHEkUVRHJSEjNyQiMDo+YEQvTSc+ISM2NyQkIjA6JVI6QiY9RyUhIzckIjA9KlErMCxyPiEjNjckNyQkIjBvPV0sNycqRyUhIzckIjB4cVwvJHpXPiEjNjckJCIwJFJoKEgzeUclISM3JCIweklZcWo0Jj4hIzY3JDckJCIwJFJoKEgzeUclISM3JCIweklZcWo0Jj4hIzY3JCQiMFQxXztLZEclISM3JCIwbScqZmBLIWU+ISM2NyQ3JCQiMCU0JFsnPVwkSCUhIzckIi8xVXpOTko+ISM1NyQkIjBpbV5uRTlIJSEjNyQiMFVVUjpCJlE+ISM2NyQ3JCQiMGltXm5FOUglISM3JCIwVVVSOkImUT4hIzY3JCQiMG89XSw3JypHJSEjNyQiMHhxXC8kelc+ISM2NyQ3JCQiMEBWWXJydEglISM3JCIwYipbM1ByPD4hIzY3JCQiMGtnK2QmKlxIJSEjNyQiMDFhS2cjM0U+ISM2NyQ3JCQiMGtnK2QmKlxIJSEjNyQiMDFhS2cjM0U+ISM2NyQkIjAlNCRbJz1cJEglISM3JCIvMVV6Tk5KPiEjNTckNyQkIjBaYldjXjdJJSEjNyQiME8lei5JKFEhPiEjNjckJCIvay1BcF4pSCUhIzYkIi9kY18/azg+ISM1NyQ3JCQiL2stQXBeKUglISM2JCIvZGNfP2s4PiEjNTckJCIwQFZZcnJ0SCUhIzckIjBiKlszUHI8PiEjNjckNyQkIjB1blVUSl5JJSEjNyQiMEpxUTBKKSopPSEjNjckJCIweVpWYiMqPkklISM3JCIwTXg9XSw3IT4hIzY3JDckJCIweVpWYiMqPkklISM3JCIwTXg9XSw3IT4hIzY3JCQiMFpiV2NeN0klISM3JCIwTyV6LkkoUSE+ISM2NyQ3JCQiLTNrNyw0ViEiKiQiMGt4N3EoZXY9ISM2NyQkIjBKTDRkNykzViEjNyQiMGkrMFM/aig9ISM2NyQ3JCQiMEpMNGQ3KTNWISM3JCIwaSswUz9qKD0hIzY3JCQiMGtlYl5RdUklISM3JCIwa0xETWo4KT0hIzY3JDckJCIweU9MPUNhSSUhIzckIjApKik9XjR3KSk9ISM2NyQkIjBrZWJeUXVJJSEjNyQiMGtMRE1qOCk9ISM2NyQ3JCQiMHlPTD1DYUklISM3JCIwKSopPV40dykpPSEjNjckJCIwdW5VVEpeSSUhIzckIjBKcVEwSikqKT0hIzY3JDckJCIwRiMqUTYiKkdKJSEjNyQiMCNvdThGOWg9ISM2NyQkIjAySGR2ZUBKJSEjNyQiMEU3KVwpelEnPSEjNjckNyQkIjAySGR2ZUBKJSEjNyQiMEU3KVwpelEnPSEjNjckJCItM2s3LDRWISIqJCIwa3g3cShldj0hIzY3JDckJCIwYC9QJzR4O1YhIzckIjBieUpKJlxZPSEjNjckJCIwZDA3XGxhSiUhIzckIi9SNypIUjkmPSEjNTckNyQkIjBkMDdcbGFKJSEjNyQiL1I3KkhSOSY9ISM1NyQkIjBGIypRNiIqR0olISM3JCIwI291OEY5aD0hIzY3JDckJCIvb144M2w/ViEjNiQiMFZPeDZYOyQ9ISM2NyQkIi9SO1pUdD1WISM2JCIwYU4lWygpKipRPSEjNjckNyQkIi9SO1pUdD1WISM2JCIwYU4lWygpKipRPSEjNjckJCIwYS9QJzR4O1YhIzckIjBieUpKJlxZPSEjNjckNyQkIjAxSExtSVhLJSEjNyQiLyJIJlE8Zjs9ISM1NyQkIjA5MWMsbT5LJSEjNyQiMD1aeD5lbCM9ISM2NyQ3JCQiMDkxYyxtPkslISM3JCIwPVp4PmVsIz0hIzY3JCQiL29eODNsP1YhIzYkIjBWT3g2WDskPSEjNjckNyQkIjBMVEpeNSVHViEjNyQiMDchXD5cTCw9ISM2NyQkIjBiNEYqUUtHViEjNyQiMFlxajR4OyE9ISM2NyQ3JCQiMGI0RipRS0dWISM3JCIwWXFqNHg7IT0hIzY3JCQiMCNvakg0JXpLJSEjNyQiMCllOiR6Iz0uPSEjNjckNyQkIjBuNWRKaV5LJSEjNyQiMCMpZXFrPFQiPSEjNjckJCIwI29qSDQlekslISM3JCIwKWU6JHojPS49ISM2NyQ3JCQiMG41ZEppXkslISM3JCIwIyllcWs8VCI9ISM2NyQkIjAxSExtSVhLJSEjNyQiLyJIJlE8Zjs9ISM1NyQ3JCQiL08mSE8hSEtWISM2JCIwJVt6PV0oZXkiISM2NyQkIjBSbkYmKVw5TCUhIzckIi9Ab1hsQip5IiEjNTckNyQkIjBSbkYmKVw5TCUhIzckIi9Ab1hsQip5IiEjNTckJCIwTFRKXjUlR1YhIzckIjA3IVw+XEwsPSEjNjckNyQkIjAnZXc3LTxPViEjNyQiMCdHaXozQHE8ISM2NyQkIjAnUlUqZVZYTCUhIzckIjB1JCpcKmZ6dzwhIzY3JDckJCIwJ1JVKmVWWEwlISM3JCIwdSQqXCpmenc8ISM2NyQkIi9PJkhPIUhLViEjNiQiMCVbej1dKGV5IiEjNjckNyQkIjA4eUQxXStNJSEjNyQiMG4meW5ATWE8ISM2NyQkIjAoby8hNDF3TCUhIzckIjBRMFZXYlZ3IiEjNjckNyQkIjAoby8hNDF3TCUhIzckIjBRMFZXYlZ3IiEjNjckJCIwJ2V3Ny08T1YhIzckIjAnR2l6M0BxPCEjNjckNyQkIjBSIVI3KkhSTSUhIzckIjAkNCgqKSkpbyNRPCEjNjckJCIwaScqKnosa1ZWISM3JCIwbUdITXUlUjwhIzY3JDckJCIwaScqKnosa1ZWISM3JCIwbUdITXUlUjwhIzY3JCQiMHlZM0JZRU0lISM3JCIwayVvMC9mVjwhIzY3JDckJCIwcmkxSFExTSUhIzckIjAtPE8qWyI+diIhIzY3JCQiMHlZM0JZRU0lISM3JCIwayVvMC9mVjwhIzY3JDckJCIwcmkxSFExTSUhIzckIjAtPE8qWyI+diIhIzY3JCQiMDh5RDFdK00lISM3JCIwbiZ5bkBNYTwhIzY3JDckJCIwbS1BdzR5TSUhIzckIjA9JSpmNiIqPnMiISM2NyQkIi8qPllxNm1NJSEjNiQiLy5DI3pMcXMiISM1NyQ3JCQiLyo+WXE2bU0lISM2JCIvLkMjekxxcyIhIzU3JCQiMFIhUjcqSFJNJSEjNyQiMCQ0KCopKSlvI1E8ISM2NyQ3JCQiMCNcLDcnKm9eViEjNyQiMCpwVDB5XTA8ISM2NyQkIjBlbCNlYmJcViEjNyQiMCU+YlRLZjk8ISM2NyQ3JCQiMGVsI2ViYlxWISM3JCIwJT5iVEtmOTwhIzY3JCQiMG0tQXc0eU0lISM3JCIwPSUqZjYiKj5zIiEjNjckNyQkIjA+Rj1ZcGJOJSEjNyQiMCUpW3QqKT0pKW8iISM2NyQkIjAoZWktRk9iViEjNyQiMEF2LDk3KCpvIiEjNjckNyQkIjAoZWktRk9iViEjNyQiMEF2LDk3KCpvIiEjNjckJCIwWWEmPmx2YVYhIzckIi9vQispPUJwIiEjNTckNyQkIjBZW2ddc0NOJSEjNyQiMGVqM3BfQHEiISM2NyQkIjBZYSY+bHZhViEjNyQiL29CKyk9QnAiISM1NyQ3JCQiMFlbZ11zQ04lISM3JCIwZWozcF9AcSIhIzY3JCQiMCNcLDcnKm9eViEjNyQiMCpwVDB5XTA8ISM2NyQ3JCQiMFhSO0pcJWZWISM3JCIwKFs3L1sjPm4iISM2NyQkIjA6NktHRCNlViEjNyQiMCdvWyplcnNuIiEjNjckNyQkIjA6NktHRCNlViEjNyQiMCdvWyplcnNuIiEjNjckJCIwPkY9WXBiTiUhIzckIjAlKVt0Kik9KSlvIiEjNjckNyQkIjBzXjk7SExPJSEjNyQiMCU0didIQ1tsIiEjNjckJCIwKVw0XkoxaFYhIzckIi8mKXpRNSRbbSIhIzU3JDckJCIwKVw0XkoxaFYhIzckIi8mKXpRNSRbbSIhIzU3JCQiMFhSO0pcJWZWISM3JCIwKFs3L1sjPm4iISM2NyQ3JCQiMClSRTYhNHNPJSEjNyQiMCRcR0B4XlA7ISM2NyQkIjBUS1cqZW1tViEjNyQiMHhAdSQqXCpSOyEjNjckNyQkIjBUS1cqZW1tViEjNyQiMHhAdSQqXCpSOyEjNjckJCIwJXByY1JGbFYhIzckIjA+Jj4nZmFoayIhIzY3JDckJCIwL2lYJHAoUU8lISM3JCIwODUiKVshUl87ISM2NyQkIjAlcHJjUkZsViEjNyQiMD4mPidmYWhrIiEjNjckNyQkIjAvaVgkcChRTyUhIzckIjA4NSIpWyFSXzshIzY3JCQiMHNeOTtITE8lISM3JCIwJTR2J0hDW2wiISM2NyQ3JCQiMER3NScpKTNyViEjNyQiMCkqejolWys/OyEjNjckJCIwXFM4bkklcFYhIzckIjBUTG5RNHZpIiEjNjckNyQkIjBcUzhuSSVwViEjNyQiMFRMblE0dmkiISM2NyQkIjApUkU2ITRzTyUhIzckIjAkXEdAeF5QOyEjNjckNyQkIjBeKSkzcm9cUCUhIzckIjBhOFMkW0ctOyEjNjckJCIwcmFdJVEqW1AlISM3JCIwcGNgR0dFZyIhIzY3JDckJCIwcmFdJVEqW1AlISM3JCIwcGNgR0dFZyIhIzY3JCQiMC5tZUw8WlAlISM3JCIwKEg/MlZWLjshIzY3JDckJCIwVyhvL0s8c1YhIzckIjAwWGckKW9daCIhIzY3JCQiMC5tZUw8WlAlISM3JCIwKEg/MlZWLjshIzY3JDckJCIwVyhvL0s8c1YhIzckIjAwWGckKW9daCIhIzY3JCQiMER3NScpKTNyViEjNyQiMCkqejolWys/OyEjNjckNyQkIjB5KzJjWyl5ViEjNyQiMClbTkQnZVZlIiEjNjckJCIwazo4JjNmeFYhIzckIjBMb1l0KD0hZiIhIzY3JDckJCIwazo4JjNmeFYhIzckIjBMb1l0KD0hZiIhIzY3JCQiMF4pKTNyb1xQJSEjNyQiMGE4UyRbRy07ISM2NyQ3JCQiMC84MFRHRlElISM3JCIwMngjPlpBbTohIzY3JCQiME1RIVFzRSFRJSEjNyQiMCgqelI9WnhkIiEjNjckNyQkIjBNUSFRc0UhUSUhIzckIjAoKnpSPVp4ZCIhIzY3JCQiMHkrMmNbKXlWISM3JCIwKVtORCdlVmUiISM2NyQ3JCQiMEpELkUzbVElISM3JCIwNmF2MSUpeWEiISM2NyQkIjB5YzQleWImUSUhIzckIjBELkUzbUdiIiEjNjckNyQkIjB5YzQleWImUSUhIzckIjBELkUzbUdiIiEjNjckJCIwJipSak1NTFElISM3JCIwNCNRSFBPajohIzY3JDckJCIwTkklZU0jSFElISM3JCIwaCJITG1JbDohIzY3JCQiMCYqUmpNTUxRJSEjNyQiMDQjUUhQT2o6ISM2NyQ3JCQiME5JJWVNI0hRJSEjNyQiMGgiSExtSWw6ISM2NyQkIjAvODBUR0ZRJSEjNyQiMDJ4Iz5aQW06ISM2NyQ3JCQiMGRQLDYpWyFSJSEjNyQiMFElcCNcTiRIOiEjNjckJCIwdTB0anMiKVElISM3JCIwKlsiPmBEL2EiISM2NyQ3JCQiMHUwdGpzIilRJSEjNyQiMCpbIj5gRC9hIiEjNjckJCIwSkQuRTNtUSUhIzckIjA2YXYxJSl5YSIhIzY3JDckJCIwJSlcKmZ6TyVSJSEjNyQiMG1jQXF6MF4iISM2NyQkIi89TWtWTSRSJSEjNiQiMDxRMFZXYl4iISM2NyQ3JCQiLz1Na1ZNJFIlISM2JCIwPFEwVldiXiIhIzY3JCQiMDNePWo/OFIlISM3JCIwXE4xYTpgXyIhIzY3JDckJCIwdlVJa28yUiUhIzckIjBgRTcpXCl6XyIhIzY3JCQiMDNePWo/OFIlISM3JCIwXE4xYTpgXyIhIzY3JDckJCIwdlVJa28yUiUhIzckIjBgRTcpXCl6XyIhIzY3JCQiMGRQLDYpWyFSJSEjNyQiMFElcCNcTiRIOiEjNjckNyQkIi9AdzR5QylSJSEjNiQiMC0kUWpjaCJcIiEjNjckJCIwLXVOayxmUiUhIzckIjAiKVwpelE1LjohIzY3JDckJCIwLXVOayxmUiUhIzckIjAiKVwpelE1LjohIzY3JCQiMCUpXCpmek8lUiUhIzckIjBtY0FxejBeIiEjNjckNyQkIjBQdSZmdzctVyEjNyQiMDxrWDtXQ1oiISM2NyQkIjBCLiMpKT0nNFMlISM3JCIwNHQleUZBeTkhIzY3JDckJCIwQi4jKSk9JzRTJSEjNyQiMDR0JXlGQXk5ISM2NyQkIjBFdDd5KXopUiUhIzckIjAjM25sbSopKVsiISM2NyQ3JCQiMFYkR2M4VylSJSEjNyQiMFhoIkhMbSFcIiEjNjckJCIwRXQ3eSl6KVIlISM3JCIwIzNubG0qKSlbIiEjNjckNyQkIjBWJEdjOFcpUiUhIzckIjBYaCJITG0hXCIhIzY3JCQiL0B3NHlDKVIlISM2JCIwLSRRamNoIlwiISM2NyQ3JCQiMGonUTR2KzFXISM3JCIwYWheKlIxYDkhIzY3JCQiMHU6MztfZlMlISM3JCIwUCc0eDtNYDkhIzY3JDckJCIwdTozO19mUyUhIzckIjBQJzR4O01gOSEjNjckJCIwR2cnKSpHJmVTJSEjNyQiMEQ0Kkd1JFFYIiEjNjckNyQkIjBlZ2pJbE1TJSEjNyQiMHQleUZBeWw5ISM2NyQkIjBHZycpKkcmZVMlISM3JCIwRDQqR3UkUVgiISM2NyQ3JCQiMGVnaklsTVMlISM3JCIwdCV5RkF5bDkhIzY3JCQiMFB1JmZ3Ny1XISM3JCIwPGtYO1dDWiIhIzY3JDckJCIvKik+ZnQpKTRXISM2JCIuJ1s9aVpMOSEiKjckJCIvSGx4MlUzVyEjNiQiMCwzazcsNFciISM2NyQ3JCQiL0hseDJVM1chIzYkIjAsM2s3LDRXIiEjNjckJCIwaidRNHYrMVchIzckIjBhaF4qUjFgOSEjNjckNyQkIjA7NiE0c3c4VyEjNyQiMEwmUVwnek9UIiEjNjckJCIwM2lWSjVMVCUhIzckIjBISl0tP2dUIiEjNjckNyQkIjAzaVZKNUxUJSEjNyQiMEhKXS0/Z1QiISM2NyQkIjBLUzNST0RUJSEjNyQiMFJTUmVtKj45ISM2NyQ3JCQiMGxMYGl0M1QlISM3JCIwbD5kZGclRzkhIzY3JCQiMEtTM1JPRFQlISM3JCIwUlNSZW0qPjkhIzY3JDckJCIwbExgaXQzVCUhIzckIjBsPmRkZyVHOSEjNjckJCIvKik+ZnQpKTRXISM2JCIuJ1s9aVpMOSEiKjckNyQkIjBWQillcWs8VyEjNyQiMDoqekxabiRSIiEjNjckJCIwdV5UVUlkVCUhIzckIjAkSE11JXpOUyIhIzY3JDckJCIwdV5UVUlkVCUhIzckIjAkSE11JXpOUyIhIzY3JCQiMDs2ITRzdzhXISM3JCIwTCZRXCd6T1QiISM2NyQ3JCQiMHBOJzNwX0BXISM3JCIwUnN6S2hNUCIhIzY3JCQiMC15JHlcXz9XISM3JCIwQG1IUClweTghIzY3JDckJCIwLXkkeVxfP1chIzckIjBAbUhQKXB5OCEjNjckJCIvPTVRayIqPVchIzYkIjAvPy9zb3FRIiEjNjckNyQkIjBaKT5uYzg9VyEjNyQiMGRhTyMqUTZSIiEjNjckJCIvPTVRayIqPVchIzYkIjAvPy9zb3FRIiEjNjckNyQkIjBaKT5uYzg9VyEjNyQiMGRhTyMqUTZSIiEjNjckJCIwVkIpZXFrPFchIzckIjA6KnpMWm4kUiIhIzY3JDckJCIwJ3pXZW5TRFchIzckIjBDJylbKClRSU4iISM2NyQkIjB2XiopXGZfVSUhIzckIjBcKmVycyJRTiIhIzY3JDckJCIwdl4qKVxmX1UlISM3JCIwXCplcnMiUU4iISM2NyQkIi8mR20kKUhdVSUhIzYkIjBXbEomZS1iOCEjNjckNyQkIjBZL3lOKipHVSUhIzckIjAmeUZBeURtOCEjNjckJCIvJkdtJClIXVUlISM2JCIwV2xKJmUtYjghIzY3JDckJCIwWS95TioqR1UlISM3JCIwJnlGQXlEbTghIzY3JCQiMHBOJzNwX0BXISM3JCIwUnN6S2hNUCIhIzY3JDckJCIwQWcjM21HSFchIzckIjA4cXIzM0NMIiEjNjckJCIwdXhAPS93VSUhIzckIjA3LDRzdzhNIiEjNjckNyQkIjB1eEA9L3dVJSEjNyQiMDcsNHN3OE0iISM2NyQkIjAneldlblNEVyEjNyQiMEMnKVsoKVFJTiIhIzY3JDckJCIwXHMhZWs7TFchIzckIjA7Iz4uJG86SiIhIzY3JCQiMCRlUnRAREtXISM3JCIvV18+Y1w7OCEjNTckNyQkIjAkZVJ0QERLVyEjNyQiL1dfPmNcOzghIzU3JCQiMFA/WU0lKjNWJSEjNyQiMG1uOC8ieUI4ISM2NyQ3JCQiMEJyUE1OKkhXISM3JCIwdzctPE8qRzghIzY3JCQiMFA/WU0lKjNWJSEjNyQiMG1uOC8ieUI4ISM2NyQ3JCQiMEJyUE1OKkhXISM3JCIwdzctPE8qRzghIzY3JCQiMEFnIzNtR0hXISM3JCIwOHFyMzNDTCIhIzY3JDckJCIwdiUpeUlZcVYlISM3JCIwZidbRiQ+MEgiISM2NyQkIi9NKUhFWG9WJSEjNiQiMG9aIj1YaCJIIiEjNjckNyQkIi9NKUhFWG9WJSEjNiQiMG9aIj1YaCJIIiEjNjckJCIwW0tWXWFsViUhIzckIi82V2k5PiRIIiEjNTckNyQkIjA8OFVDYlhWJSEjNyQiMC9PKW9dMC84ISM2NyQkIjBbS1ZdYWxWJSEjNyQiLzZXaTk+JEgiISM1NyQ3JCQiMDw4VUNiWFYlISM3JCIwL08pb10wLzghIzY3JCQiMFxzIWVrO0xXISM3JCIwOyM+LiRvOkoiISM2NyQ3JCQiMC0ocGRoIzRXJSEjNyQiMCopeSIpb2gjcDchIzY3JCQiMGkpW143N1JXISM3JCIwS2Z1J1I8ejchIzY3JDckJCIwaSlbXjc3UlchIzckIjBLZnUnUjx6NyEjNjckJCIwdiUpeUlZcVYlISM3JCIwZidbRiQ+MEgiISM2NyQ3JCQiMEc0disxW1clISM3JCIwYTpFLCZ6WjchIzY3JCQiMCNSPFtealZXISM3JCIvRTNtR0hhNyEjNTckNyQkIjAjUjxbXmpWVyEjNyQiL0UzbUdIYTchIzU3JCQiMC04Iik9Oz9XJSEjNyQiMFomKXBHUUtFIiEjNjckNyQkIjByQzUmW1FUVyEjNyQiMCc0eDtNdG03ISM2NyQkIjAtOCIpPTs/VyUhIzckIjBaJilwR1FLRSIhIzY3JDckJCIwckM1JltRVFchIzckIjAnNHg7TXRtNyEjNjckJCIwLShwZGgjNFclISM3JCIwKil5IilvaCNwNyEjNjckNyQkIjBiQHQmZW9bVyEjNyQiMEI5XTE+aEEiISM2NyQkIjBZLiFIJyk0W1chIzckIjApZXFrPFRINyEjNjckNyQkIjBZLiFIJyk0W1chIzckIjApZXFrPFRINyEjNjckJCIwQUxiRTF0VyUhIzckIjBzPyFmYCRRQiIhIzY3JDckJCIwXnN3L3RlVyUhIzckIjBDJVI6QiY9QyIhIzY3JCQiMEFMYkUxdFclISM3JCIwcz8hZmAkUUIiISM2NyQ3JCQiMF5zdy90ZVclISM3JCIwQyVSOkImPUMiISM2NyQkIjBHNHYrMVtXJSEjNyQiMGE6RSwmelo3ISM2NyQ3JCQiMCJRODJkY19XISM3JCIwQjJZJVFCLzchIzY3JCQiMEtrckk4RFglISM3JCIwO0hMbUlYPyIhIzY3JDckJCIwS2tySThEWCUhIzckIjA7SExtSVg/IiEjNjckJCIvY0BpVVdfVyEjNiQiMC4kZXErI1w/IiEjNjckNyQkIi9CXC88Sl1XISM2JCIwXzxTQHJwQCIhIzY3JCQiL2NAaVVXX1chIzYkIjAuJGVxKyNcPyIhIzY3JDckJCIvQlwvPEpdVyEjNiQiMF88U0BycEAiISM2NyQkIjBiQHQmZW9bVyEjNyQiMEI5XTE+aEEiISM2NyQ3JCQiMDNZcGJYa1glISM3JCIwIj5bKCkpUkA9IiEjNjckJCIwTDsrUi1aWCUhIzckIi8zazcsNCM+IiEjNTckNyQkIjBMOytSLVpYJSEjNyQiLzNrNyw0Iz4iISM1NyQkIjAiUTgyZGNfVyEjNyQiMEIyWSVRQi83ISM2NyQ3JCQiME1lblNELlklISM3JCIwaSEzK24kKWY2ISM2NyQkIjAsPyQpZlkhZlchIzckIjAzazcsNHM7IiEjNjckNyQkIjAsPyQpZlkhZlchIzckIjAzazcsNHM7IiEjNjckJCIwI1tUTCNHdVglISM3JCIwRy91bClcdzYhIzY3JDckJCIvSHMxLylvWCUhIzYkIjBXXz5jXCd6NiEjNjckJCIwI1tUTCNHdVglISM3JCIwRy91bClcdzYhIzY3JDckJCIvSHMxLylvWCUhIzYkIjBXXz5jXCd6NiEjNjckJCIwM1lwYlhrWCUhIzckIjAiPlsoKSlSQD0iISM2NyQ3JCQiMGhxbEQwVVklISM3JCIwKSllXkJDdDgiISM2NyQkIjBiJUhgZE1qVyEjNyQiME8oKSk0ektVNiEjNjckNyQkIjBiJUhgZE1qVyEjNyQiME8oKSk0ektVNiEjNjckJCIwQCN6TjxHaVchIzckIjByKj0nZSZcWzYhIzY3JDckJCIwOT5Pdiw3WSUhIzckIjBzdjBZb1o6IiEjNjckJCIwQCN6TjxHaVchIzckIjByKj0nZSZcWzYhIzY3JDckJCIwOT5Pdiw3WSUhIzckIjBzdjBZb1o6IiEjNjckJCIwTWVuU0QuWSUhIzckIjBpITMrbiQpZjYhIzY3JDckJCIwKEdRMV4zb1chIzckIjBpIUhGRGc5NiEjNjckJCIuJ0c7N2duVyEjNSQiMGs1JjNvVzw2ISM2NyQ3JCQiLidHOzdnblchIzUkIjBrNSYzb1c8NiEjNjckJCIwa2YpM1wsblchIzckIjA6JjNYJHkzNyIhIzY3JDckJCIwXiZRdSh5YVklISM3JCIuKj5mdCkpSDYhIio3JCQiMGtmKTNcLG5XISM3JCIwOiYzWCR5MzciISM2NyQ3JCQiMF4mUXUoeWFZJSEjNyQiLio+ZnQpKUg2ISIqNyQkIjBocWxEMFVZJSEjNyQiMCkpZV5CQ3Q4IiEjNjckNyQkIjA5Jj5jXCc+WiUhIzckIjBRJikpKmZyOzQiISM2NyQkIjBDLUJHOT1aJSEjNyQiMCNSODJkYyM0IiEjNjckNyQkIjBDLUJHOT1aJSEjNyQiMCNSODJkYyM0IiEjNjckJCIvLjgpXE47WiUhIzYkIjBIeCUpNEFPNCIhIzY3JDckJCIwTChHIno3KHBXISM3JCIwR0F5RDFdNSIhIzY3JCQiLy44KVxOO1olISM2JCIwSHglKTRBTzQiISM2NyQ3JCQiMEwoRyJ6NyhwVyEjNyQiMEdBeUQxXTUiISM2NyQkIjAoR1ExXjNvVyEjNyQiMGkhSEZEZzk2ISM2NyQ3JCQiL3UrMVslZVolISM2JCIvaSshb0ombzUhIzU3JCQiMHMqZW9dIVJaJSEjNyQiMGNYazpELDMiISM2NyQ3JCQiMHMqZW9dIVJaJSEjNyQiMGNYazpELDMiISM2NyQkIjA5Jj5jXCc+WiUhIzckIjBRJikpKmZyOzQiISM2NyQ3JCQiMG4+ZWxDKHpXISM3JCIwVCZ6eEY9WDUhIzY3JCQiMCd5OjdvMHlXISM3JCIwJSlvXTBXXzAiISM2NyQ3JCQiMCd5OjdvMHlXISM3JCIwJSlvXTBXXzAiISM2NyQkIjAvJ1E3czl3VyEjNyQiMGxPViZccm01ISM2NyQ3JCQiMCJvckVoKWZaJSEjNyQiL3N2MFlvbjUhIzU3JCQiMC8nUTdzOXdXISM3JCIwbE9WJlxybTUhIzY3JDckJCIwIm9yRWgpZlolISM3JCIvc3YwWW9uNSEjNTckJCIvdSsxWyVlWiUhIzYkIi9pKyFvSiZvNSEjNTckNyQkIjAkPmowWGckWyUhIzckIjBva2F2QzstIiEjNjckJCIwQ1BsPHBAWyUhIzckIjA2I3BgSE9JNSEjNjckNyQkIjBDUGw8cEBbJSEjNyQiMDYjcGBIT0k1ISM2NyQkIjA9PUVoZDBbJSEjNyQiMFQ1KG9FOFM1ISM2NyQ3JCQiMExYcid6NiFbJSEjNyQiMFohUS9OIUcvIiEjNjckJCIwPT1FaGQwWyUhIzckIjBUNShvRThTNSEjNjckNyQkIjBMWHInejYhWyUhIzckIjBaIVEvTiFHLyIhIzY3JCQiMG4+ZWxDKHpXISM3JCIwVCZ6eEY9WDUhIzY3JDckJCIvVVdiVlsoWyUhIzYkIjBUOzx0dyZ5KiohIzc3JCQiLGBFVmlbJSEiKSQiMFI6QiY9WzA1ISM2NyQ3JCQiLGBFVmlbJSEiKSQiMFI6QiY9WzA1ISM2NyQkIjBzZ0U5d1tbJSEjNyQiMHgsLydcJVEsIiEjNjckNyQkIjAsM2YrNlVbJSEjNyQiMHYuSVNBeiwiISM2NyQkIjBzZ0U5d1tbJSEjNyQiMHgsLydcJVEsIiEjNjckNyQkIjAsM2YrNlVbJSEjNyQiMHYuSVNBeiwiISM2NyQkIjAkPmowWGckWyUhIzckIjBva2F2QzstIiEjNjckNyQkIjBZY18/azhcJSEjNyQiMDtUUClmIilRKCohIzc3JCQiMFssWjghRyFcJSEjNyQiMHQnUTR2KzEpKiEjNzckNyQkIjBbLFo4IUchXCUhIzckIjBzJ1E0disxKSohIzc3JCQiMEd3ay8zIipbJSEjNyQiMGokKSpbLE55KSohIzc3JDckJCIvPVI+akUpWyUhIzYkIjBMcWksOC8kKiohIzc3JCQiMEd3ay8zIipbJSEjNyQiMGokKSpbLE55KSohIzc3JDckJCIvPVI+akUpWyUhIzYkIjBMcWksOC8kKiohIzc3JCQiL1VXYlZbKFslISM2JCIwVDs8dHcmeSoqISM3NyQ3JCQiMHRvXTBXX1wlISM3JCIwZE9rK21wXCohIzc3JCQiMER5ZnohRyVcJSEjNyQiMF8+Y1wnPmQmKiEjNzckNyQkIjBEeWZ6IUclXCUhIzckIjBfPmNcJz5kJiohIzc3JCQiMG5ZXzllS1wlISM3JCIwcFJKdHQzaSohIzc3JDckJCIwXyd5UFxHI1wlISM3JCIwNy5EKy07byohIzc3JCQiMG5ZXzllS1wlISM3JCIwcFJKdHQzaSohIzc3JDckJCIwXyd5UFxHI1wlISM3JCIwNy5EKy07byohIzc3JCQiMFljXz9rOFwlISM3JCIwO1RQKWYiKVEoKiEjNzckNyQkIjAqNClbIVI3KlwlISM3JCIwdEEjZXYtYCMqISM3NyQkIjAyRnBAWSMpXCUhIzckIjBKXz1bJlEzJCohIzc3JDckJCIwMkZwQFkjKVwlISM3JCIwSl89WyZRMyQqISM3NyQkIjAsNCV6M0woXCUhIzckIjBkPWcoeihlTyohIzc3JDckJCIvXFlaeUUnXCUhIzYkIjAiZnQpKTR6SyUqISM3NyQkIjAsNCV6M0woXCUhIzckIjBkPWcoeihlTyohIzc3JDckJCIvXFlaeUUnXCUhIzYkIjAiZnQpKTR6SyUqISM3NyQkIjB0b10wV19cJSEjNyQiMGRPayttcFwqISM3NyQ3JCQiMEUkcGFQKy5YISM3JCIwJ1wrbjorMiEqISM3NyQkIjB6XXNLeEBdJSEjNyQiL14zb1dkZiEqISM2NyQ3JCQiMHpdc0t4QF0lISM3JCIvXjNvV2RmISohIzY3JCQiMCJ5NV0uTCxYISM3JCIwXjBrUEpLNiohIzc3JDckJCIwKEhHJSpmQCtYISM3JCIvKG9cKCp6Uj0qISM2NyQkIjAieTVdLkwsWCEjNyQiMF4wa1BKSzYqISM3NyQ3JCQiMChIRyUqZkArWCEjNyQiLyhvXCgqelI9KiEjNjckJCIwKjQpWyFSNypcJSEjNyQiMHRBI2V2LWAjKiEjNzckNyQkIjBgMFhnJClvXSUhIzckIjBib20kKSkpKWUoKSEjNzckJCIwL1ZhLHZnXSUhIzckIjAqeUphTXc1KSkhIzc3JDckJCIwL1ZhLHZnXSUhIzckIjAqeUphTXc1KSkhIzc3JCQiMEw+W01nX10lISM3JCIwajIyXDdHJykpISM3NyQ3JCQiMHMoNCZHSVRdJSEjNyQiLzo/aCpvXiQqKSEjNjckJCIwTD5bTWdfXSUhIzckIjBqMjJcN0cnKSkhIzc3JDckJCIwcyg0JkdJVF0lISM3JCIvOj9oKm9eJCopISM2NyQkIjBFJHBhUCsuWCEjNyQiMCdcK246KzIhKiEjNzckNyQkIjB6PFZYajJeJSEjNyQiMCJmLjgvcDMmKSEjNzckJCIwJj0hbzhTKjRYISM3JCIwb10wV18+YykhIzc3JDckJCIwJj0hbzhTKjRYISM3JCIwb10wV18+YykhIzc3JCQiMGZ5PFBDIjRYISM3JCIwZmwhSCkzWGgpISM3NyQ3JCQiMGooPSllNiEzWCEjNyQiMEhNdSV6TidvKSEjNzckJCIwZnk8UEMiNFghIzckIjBmbCFIKTNYaCkhIzc3JDckJCIwaig9KWU2ITNYISM3JCIwSE11JXpOJ28pISM3NyQkIjBfMFhnJClvXSUhIzckIjBib20kKSkpKWUoKSEjNzckNyQkIjAxSVRJVlleJSEjNyQiMEgjPkFzU2MjKSEjNzckJCIwKSo9KTNOeDhYISM3JCIwWiR5RTk5OCQpISM3NyQ3JCQiMCkqPSkzTng4WCEjNyQiMFokeUU5OTgkKSEjNzckJCIwa3cpemMjSF4lISM3JCIvMk88aUBvJCkhIzY3JDckJCIwWjslUTInPV4lISM3JCIwM25PJHBhUCUpISM3NyQkIjBrdyl6YyNIXiUhIzckIi8yTzxpQG8kKSEjNjckNyQkIjBaOyVRMic9XiUhIzckIjAzbk8kcGFQJSkhIzc3JCQiMHo8VlhqMl4lISM3JCIwImYuOC9wMyYpISM3NyQ3JCQiMEtVUjpCJj1YISM3JCIwN3hHU1M/KykhIzc3JCQiMHZ5Ij5mZDxYISM3JCIwRjtJVElWMSkhIzc3JDckJCIwdnkiPmZkPFghIzckIjBGO0lUSVYxKSEjNzckJCIvN0kqR25tXiUhIzYkIjByTVoieSRRNykhIzc3JDckJCIwbCRmTyZ5Y14lISM3JCIwKCkqKik+ZnQpPSkhIzc3JCQiLzdJKkdubV4lISM2JCIwck1aInkkUTcpISM3NyQ3JCQiMGwkZk8meWNeJSEjNyQiMCgpKiopPmZ0KT0pISM3NyQkIjAwSVRJVlleJSEjNyQiMEgjPkFzU2MjKSEjNzckNyQkIjBmYVArLkNfJSEjNyQiMDZkczYiZlh4ISM3NyQkIjBBKDNDIls4XyUhIzckIjAxXCMqUj5iInkhIzc3JDckJCIwQSgzQyJbOF8lISM3JCIwMVwjKlI+YiJ5ISM3NyQkIjBtWyEzP04/WCEjNyQiL0M5JWUkRyIpeSEjNjckNyQkIjBhaT52bCU+WCEjNyQiMG1LaCFcIypSeiEjNzckJCIwbVshMz9OP1ghIzckIi9DOSVlJEciKXkhIzY3JDckJCIwYWk+dmwlPlghIzckIjBtS2ghXCMqUnohIzc3JCQiMEtVUjpCJj1YISM3JCIwN3hHU1M/KykhIzc3JDckJCIwJm9jYEdHRVghIzckIjAiKmUqWy8xKFsoISM3NyQkIjBtZiRbMzREWCEjNyQiMCY9WyZRM25jKCEjNzckNyQkIjBtZiRbMzREWCEjNyQiMCY9WyZRM25jKCEjNzckJCIwNDp6VyMpUl8lISM3JCIvZmd6KHAvayghIzY3JDckJCIwKjRPQ0pBQlghIzckIjBYbEIqUTYicCghIzc3JCQiMDQ6elcjKVJfJSEjNyQiL2ZneihwL2soISM2NyQ3JCQiMCo0T0NKQUJYISM3JCIwWWxCKlE2InAoISM3NyQkIjBmYVArLkNfJSEjNyQiMDZkczYiZlh4ISM3NyQ3JCQiMDd6THFpLGAlISM3JCIwKTMjeXFca0EoISM3NyQkIjBaXjN6LylHWCEjNyQiMGs5PFAoKnlKKCEjNzckNyQkIjBaXjN6LylHWCEjNyQiMGs5PFAoKnlKKCEjNzckJCIwZCdbVzVjRlghIzckIi9wQjAkPThTKCEjNjckNyQkIjAvUElPXnBfJSEjNyQiMEQpZnlHSVV1ISM3NyQkIjBkJ1tXNWNGWCEjNyQiL3BCMCQ9OFMoISM2NyQ3JCQiMC9QSU9ecF8lISM3JCIwRClmeUdJVXUhIzc3JCQiMCZvY2BHR0VYISM3JCIwIiplKlsvMShbKCEjNzckNyQkIjBRIj5gRC9NWCEjNyQiMGFkeTZnUCdwISM3NyQkIjBBJz1CMVxLWCEjNyQiMFZaek4nM3BxISM3NyQ3JCQiMEEnPUIxXEtYISM3JCIwVlp6TiczcHEhIzc3JCQiMDAxTTIhNEpYISM3JCIwJVxrJD5jUDsoISM3NyQ3JCQiMHAzRDpeMWAlISM3JCIwL0pbJz1cJD4oISM3NyQkIjAwMU0yITRKWCEjNyQiMCVcayQ+Y1A7KCEjNzckNyQkIjBwM0Q6XjFgJSEjNyQiMC9KWyc9XCQ+KCEjNzckJCIwN3pMcWksYCUhIzckIjApMyN5cVxrQSghIzc3JDckJCIwbC5JU0F6YCUhIzckIjAwZi4qSCoqKXAnISM3NyQkIjAwNzQqKltoYCUhIzckIjBBIT1XYEY/byEjNzckNyQkIjAwNzQqKltoYCUhIzckIjBBIT1XYEY/byEjNzckJCIwYU54bHJYYCUhIzckIjBzdClwYHJGcCEjNzckNyQkIjBgPCZcSktNWCEjNyQiMCRRMV4zb1dwISM3NyQkIjBhTnhsclhgJSEjNyQiMHN0KXBgckZwISM3NyQ3JCQiMGA8JlxKS01YISM3JCIwJFExXjNvV3AhIzc3JCQiMFEiPmBEL01YISM3JCIwYWR5NmdQJ3AhIzc3JDckJCIwImYiR0QtPWElISM3JCIwJTQ1VU46S2shIzc3JCQiMG06LEsnZVRYISM3JCIwVEhOIyllcVcnISM3NyQ3JCQiMG06LEsnZVRYISM3JCIwVEhOIyllcVcnISM3NyQkIjBwYGBmKFJUWCEjNyQiMGRgI3BSLmdrISM3NyQ3JCQiMFBEX14heVJYISM3JCIwLTgvTGs5ZCchIzc3JCQiMHBgYGYoUlRYISM3JCIwZGAjcFIuZ2shIzc3JDckJCIwUERfXiF5UlghIzckIjAtOC9MazlkJyEjNzckJCIwVVJueTIhUVghIzckIjBqQiJcPzgkcCchIzc3JDckJCIwIypRcSl6J3pgJSEjNyQiMGknSFApcGVwJyEjNzckJCIwVVJueTIhUVghIzckIjBqQiJcPzgkcCchIzc3JDckJCIwIypRcSl6J3pgJSEjNyQiMGknSFApcGVwJyEjNzckJCIwbC5JU0F6YCUhIzckIjAwZi4qSCoqKXAnISM3NyQ3JCQiMD1HRTUjb1hYISM3JCIvMXQ5M0NqaCEjNjckJCIwJnprPyh5XmElISM3JCIvQXc0eUMpPichIzY3JDckJCIwJnprPyh5XmElISM3JCIvQXc0eUMpPichIzY3JCQiMHUnUmRbdVdYISM3JCIwZC1ZNyskR2khIzc3JDckJCIwOE9teiZRVlghIzckIjAiZWs7TGxBaiEjNzckJCIwdSdSZFt1V1ghIzckIjBkLVk3KyRHaSEjNzckNyQkIjA4T216JlFWWCEjNyQiMCJlaztMbEFqISM3NyQkIjAiZiJHRC09YSUhIzckIjAlNDVVTjpLayEjNzckNyQkIjBXU0MmPmNcWCEjNyQiMDM4SVNiQSplISM3NyQkIjA7Kj1aZHVbWCEjNyQiLiYqZnpPJVxmISM1NyQ3JCQiMDsqPVpkdVtYISM3JCIuJipmek8lXGYhIzU3JCQiMClwZkk9MFtYISM3JCIwWixBN2V5KmYhIzc3JDckJCIwQ0w8VGxwYSUhIzckIi8neUdJVVEyJyEjNjckJCIwKXBmST0wW1ghIzckIjBaLEE3ZXkqZiEjNzckNyQkIjBDTDxUbHBhJSEjNyQiLyd5R0lVUTInISM2NyQkIjA9R0U1I29YWCEjNyQiLzF0OTNDamghIzY3JDckJCIwcl9BIT1XYFghIzckIjBwS2B5KT4+YyEjNzckJCIwYiIqZSV6R19YISM3JCIwekZBeUQxcSYhIzc3JDckJCIwYiIqZSV6R19YISM3JCIwekZBeUQxcSYhIzc3JCQiMFVyWjI/OGIlISM3JCIweXNzJXpsb2QhIzc3JDckJCIwVk9gIio+MGIlISM3JCIwUjYiKkdKXSNlISM3NyQkIjBVcloyPzhiJSEjNyQiMHlzcyV6bG9kISM3NyQ3JCQiMFZPYCIqPjBiJSEjNyQiMFI2IipHSl0jZSEjNzckJCIwV1NDJj5jXFghIzckIjAzOElTYkEqZSEjNzckNyQkIjAoXDFfO0tkWCEjNyQiMERpZllzU00mISM3NyQkIi9UNlhlIWViJSEjNiQiMGVnJW9aIj1YJiEjNzckNyQkIi9UNlhlIWViJSEjNiQiMGVnJW9aIj1YJiEjNzckJCIwXFw0MV5YYiUhIzckIjAnKnA+Vl8xYSYhIzc3JDckJCIwPUJaJSlcU2IlISM3JCIwPVdgRj9pZCYhIzc3JCQiMFxcNDFeWGIlISM3JCIwJypwPlZfMWEmISM3NyQ3JCQiMD1CWiUpXFNiJSEjNyQiMD1XYEY/aWQmISM3NyQkIjByX0EhPVdgWCEjNyQiMHBLYHkpPj5jISM3NyQ3JCQiMEN4PV0sN2MlISM3JCIwJXlaPjgpbzEmISM3NyQkIjAjWz8hNFE1YyUhIzckIjB4NHlDKWZ5XSEjNzckNyQkIjAiWz8hNFE1YyUhIzckIjB4NHlDKWZ5XSEjNzckJCIwJylmUCZcITRjJSEjNyQiMFYtKD5wNSkzJiEjNzckNyQkIi5FPyYqKkhmWCEjNSQiMFAkcGFQKy5fISM3NyQkIjAnKWZQJlwhNGMlISM3JCIwVi0oPnA1KTMmISM3NyQ3JCQiLkU/JioqSGZYISM1JCIwUCRwYVArLl8hIzc3JCQiMEYmW3BodWRYISM3JCIwKG8hZkooejhgISM3NyQ3JCQiMDM9a3JidmIlISM3JCIwKHBkaCM0dUsmISM3NyQkIjBGJltwaHVkWCEjNyQiMChvIWZKKHo4YCEjNzckNyQkIjAzPWtyYnZiJSEjNyQiMChwZGgjNHVLJiEjNzckJCIwKFwxXztLZFghIzckIjBEaWZZc1NNJiEjNzckNyQkIi8mKm9eODNsWCEjNiQiMG8kZi8qR3d5JSEjNzckJCIwSykqXFwoXGtYISM3JCIwY1VTQih5SFshIzc3JDckJCIwSykqXFwoXGtYISM3JCIwY1VTQih5SFshIzc3JCQiMFZCNiN5LWtYISM3JCIwdXE9PW9OJ1shIzc3JDckJCIuenl2cUZjJSEjNSQiMDtFNHUjPmFcISM3NyQkIjBWQjYjeS1rWCEjNyQiMHVxPT1vTidbISM3NyQ3JCQiLnp5dnFGYyUhIzUkIjA7RTR1Iz5hXCEjNzckJCIwQ3g9XSw3YyUhIzckIjAleVo+OClvMSYhIzc3JDckJCIweCw6P2gqb1ghIzckIjBrMigpSDdqXSUhIzc3JCQiMDNuIz5WJHpjJSEjNyQiME52LUF3NGUlISM3NyQ3JCQiMDNuIz5WJHpjJSEjNyQiME52LUF3NGUlISM3NyQkIi9XVEcmPXJjJSEjNiQiL2M/VDExU1khIzY3JDckJCIwRjlmdD1pYyUhIzckIjAmKmVycyJRMFohIzc3JCQiL1dURyY9cmMlISM2JCIvYz9UMTFTWSEjNjckNyQkIjBGOWZ0PWljJSEjNyQiMCYqZXJzIlEwWiEjNzckJCIvJipvXjgzbFghIzYkIjBvJGYvKkd3eSUhIzc3JDckJCIwLjk4MFRHZCUhIzckIjAnKkgsLUxIQSUhIzc3JCQiMCIqSD0sXDhkJSEjNyQiMDkzbD9sQEwlISM3NyQ3JCQiMCIqSD0sXDhkJSEjNyQiMDkzbD9sQEwlISM3NyQkIjBXTnc8eSxkJSEjNyQiL1tfaSpbdlQlISM2NyQ3JCQiMCopb0tNVydwWCEjNyQiMHUiUjgyZGNXISM3NyQkIjBXTnc8eSxkJSEjNyQiL1tfaSpbdlQlISM2NyQ3JCQiMCopb0tNVydwWCEjNyQiMHUiUjgyZGNXISM3NyQkIjB4LDo/aCpvWCEjNyQiMGsyKClIN2pdJSEjNzckNyQkIi9qNyw0c3dYISM2JCIwO1InZSIqXFBSISM3NyQkIjBtTiFRLlZ3WCEjNyQiMEtkZW9bKmVSISM3NyQ3JCQiMG1OIVEuVndYISM3JCIwS2Rlb1sqZVIhIzc3JCQiMGhtb24waWQlISM3JCIwQVVDNXBhKFIhIzc3JDckJCIwMTp0K1VaZCUhIzckIjAkNHUjPmFMMyUhIzc3JCQiMGhtb24waWQlISM3JCIwQVVDNXBhKFIhIzc3JDckJCIwMTp0K1VaZCUhIzckIjAkNHUjPmFMMyUhIzc3JCQiMDxCRyJ5P3RYISM3JCIwPCpIcCcqKmY+JSEjNzckNyQkIjBNMEEtW0lkJSEjNyQiMGBDJypwZng/JSEjNzckJCIwPEJHInk/dFghIzckIjA8KkhwJyoqZj4lISM3NyQ3JCQiME0wQS1bSWQlISM3JCIwYEMnKnBmeD8lISM3NyQkIjAuOTgwVEdkJSEjNyQiMCcqSCwtTEhBJSEjNzckNyQkIjBjUTR2KzFlJSEjNyQiMChbc2A3LF1PISM3NyQkIjA7dT5wInp6WCEjNyQiMDYhNHN3ODVQISM3NyQ3JCQiMDt1PnAienpYISM3JCIwNiE0c3c4NVAhIzc3JCQiMD1xNl50InpYISM3JCIwRmpZVSxmdiQhIzc3JDckJCIwbUhgczgieVghIzckIjBzdCp5SmFNUSEjNzckJCIwPXE2XnQielghIzckIjBGallVLGZ2JCEjNzckNyQkIjBtSGBzOCJ5WCEjNyQiMHN0KnlKYU1RISM3NyQkIi9qNyw0c3dYISM2JCIwO1InZSIqXFBSISM3NyQ3JCQiMCQzdisxWyVlJSEjNyQiMFIjKXBfbS9PJCEjNzckJCIwTyNbIVJLSmUlISM3JCIvSEtlbUtoTSEjNjckNyQkIjBPI1shUktKZSUhIzckIi9IS2VtS2hNISM2NyQkIjAwXnVAOUBlJSEjNyQiMDIxUWYuc2AkISM3NyQ3JCQiMHAoUnJYWSJlJSEjNyQiMF4xXztLZGUkISM3NyQkIjAwXnVAOUBlJSEjNyQiMDIxUWYuc2AkISM3NyQ3JCQiMHAoUnJYWSJlJSEjNyQiMF4xXztLZGUkISM3NyQkIjBjUTR2KzFlJSEjNyQiMChbc2A3LF1PISM3NyQ3JCQiMDRqMFhnJCllJSEjNyQiMDNwVWlzKW9JISM3NyQkIjB5eDdOMCIpZSUhIzckIjA0c3c4NSIpMyQhIzc3JDckJCIweXg3TjAiKWUlISM3JCIwNHN3ODUiKTMkISM3NyQkIjB4ZFdROnplJSEjNyQiMGYlKXAnNFEtSiEjNzckNyQkIi9veD5HWCdlJSEjNiQiL2RiV2NeN0shIzY3JCQiMHhkV1E6emUlISM3JCIwZiUpcCc0US1KISM3NyQ3JCQiL294PkdYJ2UlISM2JCIvZGJXY143SyEjNjckJCIwQzw8a0ddZSUhIzckIjBSS0lbWyQ+TCEjNzckNyQkIjAnPkJTXHolZSUhIzckIi8kUjk6QHBMJCEjNjckJCIwQzw8a0ddZSUhIzckIjBSS0lbWyQ+TCEjNzckNyQkIjAnPkJTXHolZSUhIzckIi8kUjk6QHBMJCEjNjckJCIwJDN2KzFbJWUlISM3JCIwUiMpcF9tL08kISM3NyQ3JCQiME92LklTQWYlISM3JCIwNHI/YExfeCMhIzc3JCQiMFUiek1pUiJmJSEjNyQiMClbIVI3KkhSRyEjNzckNyQkIjBVInpNaVIiZiUhIzckIjApWyFSNypIUkchIzc3JCQiMHc+cXN1MmYlISM3JCIwdi5XLSNIJylHISM3NyQ3JCQiMFxUQk5gKCplJSEjNyQiMFwpeUlZcWpIISM3NyQkIjB3PnFzdTJmJSEjNyQiMHYuVy0jSCcpRyEjNzckNyQkIjBcVEJOYCgqZSUhIzckIjBcKXlJWXFqSCEjNzckJCIwNGowWGckKWUlISM3JCIwM3BVaXMpb0khIzc3JDckJCIwaSg9XSw3J2YlISM3JCIweD5RVlYmekMhIzc3JCQiMClvcXp4bSVmJSEjNyQiMG5QLDYpWyFmIyEjNzckNyQkIjApb3F6eG0lZiUhIzckIjBuUCw2KVshZiMhIzc3JCQiLz0pZTw1T2YlISM2JCIwOV08QXA0biMhIzc3JDckJCIwUFMzTk1JZiUhIzckIjBHQHFoJCpbciMhIzc3JCQiLz0pZTw1T2YlISM2JCIwOV08QXA0biMhIzc3JDckJCIwUFMzTk1JZiUhIzckIjBHQHFoJCpbciMhIzc3JCQiME92LklTQWYlISM3JCIwNHI/YExfeCMhIzc3JDckJCIwKikqKioqKioqKioqZiUhIzckIjBOJlFKZiI9PSMhIzc3JCQiMC5YWFVSJipmJSEjNyQiMCdvWyplcnNAIyEjNzckNyQkIjAuWFhVUiYqZiUhIzckIjAnb1sqZXJzQCMhIzc3JCQiMGNrNVszIypmJSEjNyQiMDFiNkVeRUMjISM3NyQ3JCQiL2sySC4jemYlISM2JCIwWXFqNHg7TSMhIzc3JCQiMGNrNVszIypmJSEjNyQiMDFiNkVeRUMjISM3NyQ3JCQiL2sySC4jemYlISM2JCIwWXFqNHg7TSMhIzc3JCQiMGllelRBa2YlISM3JCIwXk5NYCFSY0MhIzc3JDckJCIwSnhfOydIJ2YlISM3JCIwMmFLZyMzbUMhIzc3JCQiMGllelRBa2YlISM3JCIwXk5NYCFSY0MhIzc3JDckJCIwSnhfOydIJ2YlISM3JCIwMmFLZyMzbUMhIzc3JCQiMGkoPV0sNydmJSEjNyQiMHg+UVZWJnpDISM3LSUmQ09MT1JHNiYlJFJHQkckIihedWknISIoJCIoXnVpJyEiKCQiKF51aSchIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNl5hdDckNyQkIjBNblE0dittIyEjNyQiMCZvN1hTKSllWSEjNjckJCIwTlE6NnErbSMhIzckIjBPJHBhUCtqWSEjNjckNyQkIjBOUTo2cSttIyEjNyQiME8kcGFQK2pZISM2NyQkIjBMISlHNHErbSMhIzckIjBCOyx6PkltJSEjNjckNyQkIjAiXHRQXjBnRSEjNyQiMHMiUTBWV3ZZISM2NyQkIjBMISlHNHErbSMhIzckIjBCOyx6PkltJSEjNjckNyQkIjAiXHRQXjBnRSEjNyQiMHMiUTBWV3ZZISM2NyQkIjBQaUwxYittIyEjNyQiMG9FQWAzYm4lISM2NyQ3JCQiMEUpUU4tL2dFISM3JCIwM3FnJlspeW8lISM2NyQkIjBQaUwxYittIyEjNyQiMG9FQWAzYm4lISM2NyQ3JCQiMEUpUU4tL2dFISM3JCIwM3FnJlspeW8lISM2NyQkIjBjPmg1UyttIyEjNyQiMFIhZlVxKnpvJSEjNjckNyQkIjA+IVIyYS1nRSEjNyQiMFdlblNELnElISM2NyQkIjBjPmg1UyttIyEjNyQiMFIhZlVxKnpvJSEjNjckNyQkIjA+IVIyYS1nRSEjNyQiMFdlblNELnElISM2NyQkIjBGNVNBRCttIyEjNyQiMDJVP0omWytaISM2NyQ3JCQiMEJkMmw1K20jISM3JCIvb1dkZnc3WiEjNTckJCIwRjVTQUQrbSMhIzckIjAyVT9KJlsrWiEjNjckNyQkIjBCZDJsNSttIyEjNyQiL29XZGZ3N1ohIzU3JCQiMEUrVFQ1K20jISM3JCIwRyEqKlxMKEhyJSEjNjckNyQkIjAqUSVwJ2YqKmZFISM3JCIwO04iM2w/RFohIzY3JCQiMEUrVFQ1K20jISM3JCIwRyEqKlxMKEhyJSEjNjckNyQkIjAqUSVwJ2YqKmZFISM3JCIwO04iM2w/RFohIzY3JCQiMFQpeXhjKipmRSEjNyQiMGBcPjpoYXMlISM2NyQ3JCQiMGBgV04iKSpmRSEjNyQiMF9CKWVxa1BaISM2NyQkIjBUKXl4YyoqZkUhIzckIjBgXD46aGFzJSEjNjckNyQkIjBgYFdOIikqZkUhIzckIjBfQillcWtQWiEjNjckJCIwWihlODUpKmZFISM3JCIwbSlvQShbenQlISM2NyQ3JCQiMDgnbzlvJypmRSEjNyQiMCk9XjR3M11aISM2NyQkIjBaKGU4NSkqZkUhIzckIjBtKW9BKFt6dCUhIzY3JDckJCIwOCdvOW8nKmZFISM3JCIwKT1eNHczXVohIzY3JCQiMEEpKkdVbSpmRSEjNyQiL2hyZGdWXVohIzU3JDckJCIwX3ZoTV8qZkUhIzckIjBDKy07R0R3JSEjNjckJCIwQSkqR1VtKmZFISM3JCIvaHJkZ1ZdWiEjNTckNyQkIjBfdmhNXypmRSEjNyQiMEMrLTtHRHclISM2NyQkIjA8WFUhPiYqZkUhIzckIjAlSHdoSiNIdyUhIzY3JDckJCIwTiUqKVt6JCpmRSEjNyQiLycpKTNyb1x4JSEjNTckJCIwPFhVIT4mKmZFISM3JCIwJUh3aEojSHclISM2NyQ3JCQiME4lKilbeiQqZkUhIzckIi8nKSkzcm9ceCUhIzU3JCQiMGJXdlhQKmZFISM3JCIwInk0TitUdlohIzY3JDckJCIwYG9UaUIqZkUhIzckIjAncGRoIzR1eSUhIzY3JCQiMGJXdlhQKmZFISM3JCIwInk0TitUdlohIzY3JDckJCIwYG9UaUIqZkUhIzckIjAncGRoIzR1eSUhIzY3JCQiMGRAVTNCKmZFISM3JCIwIjM6dG0qeXklISM2NyQ3JCQiMGwhPnAkNCpmRSEjNyQiMEtsQSIpXCkqeiUhIzY3JCQiMGRAVTNCKmZFISM3JCIwIjM6dG0qeXklISM2NyQ3JCQiMGwhPnAkNCpmRSEjNyQiMEtsQSIpXCkqeiUhIzY3JCQiMF8zOXkzKmZFISM3JCIwOTxeMyRRK1shIzY3JDckJCIwL1xuPSYqKWZFISM3JCIwb2BITyFIN1shIzY3JCQiMF8zOXkzKmZFISM3JCIwOTxeMyRRK1shIzY3JDckJCIwL1xuPSYqKWZFISM3JCIwb2BITyFIN1shIzY3JCQiMDoqKj1iJSopZkUhIzckIjB6UT9FcEciWyEjNjckNyQkIjAxMWEyIikpZkUhIzckIjAvVU8iNHRDWyEjNjckJCIwOioqPWIlKilmRSEjNyQiMHpRP0VwRyJbISM2NyQ3JCQiMDExYTIiKSlmRSEjNyQiMC9VTyI0dENbISM2NyQkIjAxKjQlUiEpKWZFISM3JCIwNEchNF9ORFshIzY3JDckJCIwRnhcLm4pZkUhIzckIi8vTGs5PFBbISM1NyQkIjAxKjQlUiEpKWZFISM3JCIwNEchNF9ORFshIzY3JDckJCIwRnhcLm4pZkUhIzckIi8vTGs5PFBbISM1NyQkIjBuIz0zaicpZkUhIzckIjB5RGIjNCV5JFshIzY3JDckJCIwJEdGa0kmKWZFISM3JCIwdz1dLDcnXFshIzY3JCQiMG4jPTNqJylmRSEjNyQiMHlEYiM0JXkkWyEjNjckNyQkIjAkR0ZrSSYpZkUhIzckIjB3PV0sNydcWyEjNjckJCIwSnlESF8pZkUhIzckIjBLcmxURS4mWyEjNjckNyQkIjBgdWU7UilmRSEjNyQiMDcyZGNfPydbISM2NyQkIjBKeURIXylmRSEjNyQiMEtybFRFLiZbISM2NyQ3JCQiMGB1ZTtSKWZFISM3JCIwNzJkY18/J1shIzY3JCQiMFo+K05RKWZFISM3JCIwKioqUnQ7IkcnWyEjNjckNyQkIjBAenBMRClmRSEjNyQiMFsmUjtKXHVbISM2NyQkIjBaPitOUSlmRSEjNyQiMCoqKlJ0OyJHJ1shIzY3JDckJCIwQHpwTEQpZkUhIzckIjBbJlI7Slx1WyEjNjckJCIwJikqb3hXIylmRSEjNyQiLlVdcSdIdlshIio3JDckJCIvdCMqeToiKWZFISM2JCIwJVEzbk8kcClbISM2NyQkIjAmKSpveFcjKWZFISM3JCIuVV1xJ0h2WyEiKjckNyQkIi90Iyp5OiIpZkUhIzYkIjAlUTNuTyRwKVshIzY3JCQiMEdJcG41KWZFISM3JCIwOik+Mjp5KClbISM2NyQ3JCQiMFl3Oyp5emZFISM3JCIwQHN4QHUkKipbISM2NyQkIjBHSXBuNSlmRSEjNyQiMDopPjI6eSgpWyEjNjckNyQkIjBZdzsqeXpmRSEjNyQiL0F4PFVQKipbISM1NyQkIjB2KnpacHpmRSEjNyQiMEV6J3pnRStcISM2NyQ3JCQiMExRUkYleWZFISM3JCIwY2clb1oiPSJcISM2NyQkIjB2KnpacHpmRSEjNyQiMEV6J3pnRStcISM2NyQ3JCQiMExRUkYleWZFISM3JCIwY2clb1oiPSJcISM2NyQkIjBeJ3opRyR5ZkUhIzckIjBlK3RVXUYiXCEjNjckNyQkIjA3KGVEMnhmRSEjNyQiMCQqWyI+YERDXCEjNjckJCIwXid6KUckeWZFISM3JCIwZSt0VV1GIlwhIzY3JDckJCIwNyhlRDJ4ZkUhIzckIjAkKlsiPmBEQ1whIzY3JCQiMG51KCpwcChmRSEjNyQiMCYqSDBiTV8jXCEjNjckNyQkIjA2QXlDZChmRSEjNyQiMEhQKXBlcE9cISM2NyQkIjBudSgqcHAoZkUhIzckIjAmKkgwYk1fI1whIzY3JDckJCIwNkF5Q2QoZkUhIzckIjBIUClwZXBPXCEjNjckJCIwOiFHIz1jKGZFISM3JCIvL1RXJT14JFwhIzU3JDckJCIwXk8zJVF1ZkUhIzckIjBsRDBVTyJcXCEjNjckJCIwOiFHIz1jKGZFISM3JCIvL1RXJT14JFwhIzU3JDckJCIwXk8zJVF1ZkUhIzckIjBsRDBVTyJcXCEjNjckJCIwVElndFUoZkUhIzckIjAleiUpNEA/XVwhIzY3JDckJCIwSnQ7XUkoZkUhIzckIjAsOTcocGRoXCEjNjckJCIwVElndFUoZkUhIzckIjAleiUpNEA/XVwhIzY3JDckJCIwSnQ7XUkoZkUhIzckIjAsOTcocGRoXCEjNjckJCIvdFRlJEgoZkUhIzYkIjBVMF9iJm9pXCEjNjckNyQkIjAxLUpCPChmRSEjNyQiMFAtPl88UyhcISM2NyQkIi90VGUkSChmRSEjNiQiMFUwX2Imb2lcISM2NyQ3JCQiMDEtSkI8KGZFISM3JCIwUC0+XzxTKFwhIzY3JCQiMFclNF9ncmZFISM3JCIwPnU+eG9eKFwhIzY3JDckJCIwY2NQLi8oZkUhIzckIjB0IWZzIWVrKVwhIzY3JCQiMFclNF9ncmZFISM3JCIwPnU+eG9eKFwhIzY3JDckJCIwY2NQLi8oZkUhIzckIjB0IWZzIWVrKVwhIzY3JCQiMGwobzpHcWZFISM3JCIwWWdYd153KVwhIzY3JDckJCIwJTRoLjRwZkUhIzckIjA0ektpKSopKSpcISM2NyQkIjBsKG86R3FmRSEjNyQiMFlnWHdedylcISM2NyQ3JCQiMCU0aC40cGZFISM3JCIwNHpLaSkqKSkqXCEjNjckJCIwOkAhXCcqb2ZFISM3JCIwJHlfTFg4K10hIzY3JDckJCIwUipbVXluZkUhIzckIjBYblI8UjgsJiEjNjckJCIwOkAhXCcqb2ZFISM3JCIwJHlfTFg4K10hIzY3JDckJCIwUipbVXluZkUhIzckIjBYblI8UjgsJiEjNjckJCIwUF0/YncnZkUhIzckIjBHPiF6cWg3XSEjNjckNyQkIjBVXi4mW21mRSEjNyQiMCJlbEMoelAtJiEjNjckJCIwUF0/YncnZkUhIzckIjBHPiF6cWg3XSEjNjckNyQkIjBVXi4mW21mRSEjNyQiMCJlbEMoelAtJiEjNjckJCIwY1VdX2onZkUhIzckIjAmeTwrJSo0RF0hIzY3JDckJCIwMnd1Iz5sZkUhIzckIjA8V2BGP2kuJiEjNjckJCIwY1VdX2onZkUhIzckIjAmeTwrJSo0RF0hIzY3JDckJCIwMnd1Iz5sZkUhIzckIjA8V2BGP2kuJiEjNjckJCIwayt2Y10nZkUhIzckIjBSKGYpXCJlUF0hIzY3JDckJCIwaWVMMlInZkUhIzckIjBgS2cjM21bXSEjNjckJCIwayt2Y10nZkUhIzckIjBSKGYpXCJlUF0hIzY3JDckJCIwaWVMMlInZkUhIzckIjBgS2cjM21bXSEjNjckJCIwKnBwendqZkUhIzckIjBhL01QaiswJiEjNjckNyQkIjBzKSlwR0UnZkUhIzckIjAqM3N3ODVoXSEjNjckJCIwKnBwendqZkUhIzckIjBhL01QaiswJiEjNjckNyQkIjBzKSlwR0UnZkUhIzckIjAqM3N3ODVoXSEjNjckJCIwc0wsJ1tpZkUhIzckIjBDLSVIXWFpXSEjNjckNyQkIjAzciVwTmhmRSEjNyQiMEQ0dSM+YXRdISM2NyQkIjBzTCwnW2lmRSEjNyQiMEMtJUhdYWldISM2NyQ3JCQiMDNyJXBOaGZFISM3JCIwRDR1Iz5hdF0hIzY3JCQiMC52KzY3J2ZFISM3JCIwJ29gaWstdl0hIzY3JDckJCIwJWV3PzRnZkUhIzckIjBoKDR5QylmMyYhIzY3JCQiMC52KzY3J2ZFISM3JCIwJ29gaWstdl0hIzY3JDckJCIwJWV3PzRnZkUhIzckIjBoKDR5QylmMyYhIzY3JCQiMDx4JUglKmZmRSEjNyQiMG1bSG4ydjMmISM2NyQ3JCQiMEpMM00pZWZFISM3JCIwKGZ5R0lVKTQmISM2NyQkIjA8eCVIJSpmZkUhIzckIjBtW0huMnYzJiEjNjckNyQkIjBKTDNNKWVmRSEjNyQiMChmeUdJVSk0JiEjNjckJCIwSyJbPW9lZkUhIzckIjAsJj1nJykpKio0JiEjNjckNyQkIjBrc3MjZWRmRSEjNyQiMEx1JXpOJzM2JiEjNjckJCIwSyJbPW9lZkUhIzckIjAsJj1nJykpKio0JiEjNjckNyQkIjBrc3MjZWRmRSEjNyQiMEx1JXpOJzM2JiEjNjckJCIwLUJURnUmZkUhIzckIjBIXlBWcEM2JiEjNjckNyQkIjBjNk5RaiZmRSEjNyQiMHBpLDgvTDcmISM2NyQkIjAtQlRGdSZmRSEjNyQiMEheUFZwQzYmISM2NyQ3JCQiMGM2TlFqJmZFISM3JCIwcGksOC9MNyYhIzY3JCQiMFEjZSs9Y2ZFISM3JCIwOlctKSpcXDcmISM2NyQ3JCQiMC8jMzE1YmZFISM3JCIwMF4zb1dkOCYhIzY3JCQiMFEjZSs9Y2ZFISM3JCIwOlctKSpcXDcmISM2NyQ3JCQiMC8jMzE1YmZFISM3JCIwMF4zb1dkOCYhIzY3JCQiMHo3T1JcJmZFISM3JCIwPCFHOC5WUF4hIzY3JDckJCIwKlE1KHBRJmZFISM3JCIwVFI6QiY9W14hIzY3JCQiMHo3T1JcJmZFISM3JCIwPCFHOC5WUF4hIzY3JDckJCIwKlE1KHBRJmZFISM3JCIwVFI6QiY9W14hIzY3JCQiMCZwImYwUCZmRSEjNyQiMEQkPkMvIipcXiEjNjckNyQkIjBWdmFYRSZmRSEjNyQiMHhGQXlEMTsmISM2NyQkIjAmcCJmMFAmZkUhIzckIjBEJD5DLyIqXF4hIzY3JDckJCIwVnZhWEUmZkUhIzckIjB4RkF5RDE7JiEjNjckJCIvSz4neUMmZkUhIzYkIi9yOjwuUmleISM1NyQ3JCQiMCg+PCJHOSZmRSEjNyQiMDg7SExtSTwmISM2NyQkIi9LPid5QyZmRSEjNiQiL3I6PC5SaV4hIzU3JDckJCIwKD48Ikc5JmZFISM3JCIwODtITG1JPCYhIzY3JCQiMGMrVWU3JmZFISM3JCIwWldIKipwWzwmISM2NyQ3JCQiMDMqPnZAXWZFISM3JCIwXC9PKW9dJj0mISM2NyQkIjBjK1VlNyZmRSEjNyQiMFpXSCoqcFs8JiEjNjckNyQkIjAzKj52QF1mRSEjNyQiMFwvTylvXSY9JiEjNjckJCIwUWo4WCsmZkUhIzckIjA8KSlwV1x0PSYhIzY3JDckJCIwM1VfOCFcZkUhIzckIjAmR0hNdSV6PiYhIzY3JCQiMFFqOFgrJmZFISM3JCIwPCkpcFdcdD0mISM2NyQ3JCQiMDNVXzghXGZFISM3JCIwJkdITXUlej4mISM2NyQkIjBGXV5RKVtmRSEjNyQiLjB1b0cpKj4mISIqNyQ3JCQiMCpSd2oieSVmRSEjNyQiMEAiKVwpelE1XyEjNjckJCIwRl1eUSlbZkUhIzckIi4wdW9HKSo+JiEiKjckNyQkIjAqUndqInklZkUhIzckIjBAIilcKXpRNV8hIzY3JCQiMF8reVF3JWZFISM3JCIwJVssMnhJN18hIzY3JDckJCIweUshZWlZZkUhIzckIjBlcGNgR0dBJiEjNjckJCIwXyt5UXclZkUhIzckIjAlWywyeEk3XyEjNjckNyQkIjB5SyFlaVlmRSEjNyQiMGVwY2BHR0EmISM2NyQkIjAlKj1xWGslZkUhIzckIjAueEpeJ3lDXyEjNjckNyQkIjAjZVs+V1hmRSEjNyQiMCR6TiczcF9CJiEjNjckJCIwJSo9cVhrJWZFISM3JCIwLnhKXid5Q18hIzY3JDckJCIwI2VbPldYZkUhIzckIjAlek4nM3BfQiYhIzY3JCQiMHYneSRmXyVmRSEjNyQiMFJYRjVsc0ImISM2NyQ3JCQiMFtneWtVJWZFISM3JCIvai9QJzR4QyYhIzU3JCQiMHYneSRmXyVmRSEjNyQiMFJYRjVsc0ImISM2NyQ3JCQiMFtneWtVJWZFISM3JCIvai9QJzR4QyYhIzU3JCQiMGNpISl6UyVmRSEjNyQiMGhfZVpWKFxfISM2NyQ3JCQiMCUzIT4lNFZmRSEjNyQiMG1NeD1dLEUmISM2NyQkIjBjaSEpelMlZkUhIzckIjBoX2VaVihcXyEjNjckNyQkIjAlMyE+JTRWZkUhIzckIjBtTXg9XSxFJiEjNjckJCIwJlJlbyFIJWZFISM3JCIwYllsakBBRSYhIzY3JDckJCIweDVTST4lZkUhIzckIjAtQiVRMmZzXyEjNjckJCIwJlJlbyFIJWZFISM3JCIwYllsakBBRSYhIzY3JDckJCIweDVTST4lZkUhIzckIjAtQiVRMmZzXyEjNjckJCIwQzAhM3VUZkUhIzckIjBMO2pkKnB1XyEjNjckNyQkIi5zPnQyJWZFISM1JCIwUTYiKkdKXUcmISM2NyQkIjBDMCEzdVRmRSEjNyQiMEw7amQqcHVfISM2NyQ3JCQiLnM+dDIlZkUhIzUkIjBRNiIqR0pdRyYhIzY3JCQiMCwzTyJlU2ZFISM3JCIwUnlRSXhyRyYhIzY3JDckJCIwRj1iQSdSZkUhIzckIjB1KnpSPVooSCYhIzY3JCQiMCwzTyJlU2ZFISM3JCIwUnlRSXhyRyYhIzY3JDckJCIwRj1iQSdSZkUhIzckIjB1KnpSPVooSCYhIzY3JCQiMDFsYEclUmZFISM3JCIwKCo+JD5bbCpIJiEjNjckNyQkIjBKRWV5JVFmRSEjNyQiLyIpWyFSNyo0YCEjNTckJCIwMWxgRyVSZkUhIzckIjAoKj4kPltsKkgmISM2NyQ3JCQiMEpFZXklUWZFISM3JCIvIilbIVI3KjRgISM1NyQkIjBHX1cjR1FmRSEjNyQiLzEoKT1AODdgISM1NyQ3JCQiMDtqO1R0JGZFISM3JCIwWXc2JUhOQWAhIzY3JCQiMEdfVyNHUWZFISM3JCIvMSgpPUA4N2AhIzU3JDckJCIwO2o7VHQkZkUhIzckIjBZdzYlSE5BYCEjNjckJCIwWkknSDlQZkUhIzckIi9QXTEjNFlLJiEjNTckNyQkIjAjbz4vQE9mRSEjNyQiMCNbJz1cJHpNYCEjNjckJCIwWkknSDlQZkUhIzckIi9QXTEjNFlLJiEjNTckNyQkIjAjbz4vQE9mRSEjNyQiMCNbJz1cJHpNYCEjNjckJCIwKHB6LCxPZkUhIzckIjAzVSR6ZzNQYCEjNjckNyQkIjAqMyQ+JzNOZkUhIzckIjA9YEQvTXNNJiEjNjckJCIwKHB6LCxPZkUhIzckIjAzVSR6ZzNQYCEjNjckNyQkIjAqMyQ+JzNOZkUhIzckIjA9YEQvTXNNJiEjNjckJCIwL2QtJSlbJGZFISM3JCIvTGhSRmNcYCEjNTckNyQkIjBsI1Emb1IkZkUhIzckIjBhVEtmdSdmYCEjNjckJCIwL2QtJSlbJGZFISM3JCIvTGhSRmNcYCEjNTckNyQkIjBsI1Emb1IkZkUhIzckIjBhVEtmdSdmYCEjNjckJCIwKipSV2tQJGZFISM3JCIwS1oiKj1SP08mISM2NyQ3JCQiMGF6UmRHJGZFISM3JCIvKkhSOTpAUCYhIzU3JCQiMCoqUldrUCRmRSEjNyQiMEtaIio9Uj9PJiEjNjckNyQkIjBhelJkRyRmRSEjNyQiLypIUjk6QFAmISM1NyQkIi8oKWU5bEtmRSEjNiQiMEZsclU6WFAmISM2NyQ3JCQiMGxxel88JGZFISM3JCIwRT1ZcGJYUSYhIzY3JCQiLygpZTlsS2ZFISM2JCIwRmxyVTpYUCYhIzY3JDckJCIwbHF6XzwkZkUhIzckIjBFPVlwYlhRJiEjNjckJCIwJikqUV1hSmZFISM3JCIwKj1uYTkqcFEmISM2NyQ3JCQiMGM4I1tsSWZFISM3JCIwaTFgQycqcFImISM2NyQkIjAmKSpRXWFKZkUhIzckIjAqPW5hOSpwUSYhIzY3JDckJCIwYzgjW2xJZkUhIzckIjBpMWBDJypwUiYhIzY3JCQiMCN5YmBXSWZFISM3JCIwMXFoRW4lKlImISM2NyQ3JCQiMGo5SGomSGZFISM3JCIwKVwqZnpPJTRhISM2NyQkIjAjeWJgV0lmRSEjNyQiMDFxaEVuJSpSJiEjNjckNyQkIjBqOUhqJkhmRSEjNyQiMClcKmZ6TyU0YSEjNjckJCIwLFgzXyRIZkUhIzckIjAvdD8oRyU+VCYhIzY3JDckJCIwZVhCeSVHZkUhIzckIjBNJG9ZdCg9VSYhIzY3JCQiMCxYM18kSGZFISM3JCIwL3Q/KEclPlQmISM2NyQ3JCQiMGVYQnklR2ZFISM3JCIwTSRvWXQoPVUmISM2NyQkIjBVdVJsI0dmRSEjNyQiMDdjb0U9V1UmISM2NyQ3JCQiMENocSpSRmZFISM3JCIvPFAoKnlKTWEhIzU3JCQiMFV1UmwjR2ZFISM3JCIwN2NvRT1XVSYhIzY3JDckJCIwQ2hxKlJGZkUhIzckIi88UCgqeUpNYSEjNTckJCIvJT5IJj1GZkUhIzYkIjB6LzFYJCpvViYhIzY3JDckJCIwVVFxRmojZkUhIzckIjAxZyFbJWVuVyYhIzY3JCQiLyU+SCY9RmZFISM2JCIwei8xWCQqb1YmISM2NyQ3JCQiMFVRcUZqI2ZFISM3JCIwMWchWyVlblcmISM2NyQkIjB4UnE2aCNmRSEjNyQiMG9yYFVvJFxhISM2NyQ3JCQiMHROO2lfI2ZFISM3JCIwVVsoKSoqKT5mYSEjNjckJCIweFJxNmgjZkUhIzckIjBvcmBVbyRcYSEjNjckNyQkIjB0TjtpXyNmRSEjNyQiMFVbKCkqKik+ZmEhIzY3JCQiMEY8c1ddI2ZFISM3JCIwaEgkKT1WPVkmISM2NyQ3JCQiMGQrMS5VI2ZFISM3JCIweU8lXCZSO1omISM2NyQkIjBGPHNXXSNmRSEjNyQiMGhIJCk9Vj1ZJiEjNjckNyQkIjBkKzEuVSNmRSEjNyQiMHlPJVwmUjtaJiEjNjckJCIwNlk4JSlSI2ZFISM3JCIwbUlpdTxWWiYhIzY3JDckJCIwKlE3LzpCZkUhIzckIjA5RCw1ITMlWyYhIzY3JCQiMDZZOCUpUiNmRSEjNyQiMG1JaXU8VlomISM2NyQ3JCQiMClRNy86QmZFISM3JCIwOUQsNSEzJVsmISM2NyQkIjA8XTNJSCNmRSEjNyQiMEE0WDQjeidbJiEjNjckNyQkIjBGVjgvQCNmRSEjNyQiL04iM2w/bFwmISM1NyQkIjA8XTNJSCNmRSEjNyQiMEE0WDQjeidbJiEjNjckNyQkIjBGVjgvQCNmRSEjNyQiL04iM2w/bFwmISM1NyQkIjAoXChbIyk9I2ZFISM3JCIwOzBmQm0jKlwmISM2NyQ3JCQiMHMkcFYxQGZFISM3JCIwJz1dLDcnKjNiISM2NyQkIjAoXChbIyk9I2ZFISM3JCIwOzBmQm0jKlwmISM2NyQ3JCQiMHMkcFYxQGZFISM3JCIwJz1dLDcnKjNiISM2NyQkIjBSKSlRVDMjZkUhIzckIjBDPSpvLHU2YiEjNjckNyQkIjBSbSQ0Lj9mRSEjNyQiMEIhPl88U0BiISM2NyQkIjBSKSlRVDMjZkUhIzckIjBDPSpvLHU2YiEjNjckNyQkIjBSbSQ0Lj9mRSEjNyQiMEIhPl88U0BiISM2NyQkIjBtcXQxKT5mRSEjNyQiMDA6XypRQENiISM2NyQ3JCQiL3A2Uys+ZkUhIzYkIjBmeUdJVVFgJiEjNjckJCIwbXF0MSk+ZkUhIzckIjAwOl8qUUBDYiEjNjckNyQkIi9wNlMrPmZFISM2JCIwZnlHSVVRYCYhIzY3JCQiL2l3JnkoPWZFISM2JCIwaXFMVChvT2IhIzY3JDckJCIwQ0hUJCl6ImZFISM3JCIwJnBjYEdHWWIhIzY3JCQiL2l3JnkoPWZFISM2JCIwaXFMVChvT2IhIzY3JDckJCIwQ0hUJCl6ImZFISM3JCIwJnBjYEdHWWIhIzY3JCQiMDBUI292PGZFISM3JCIuZmdzZyJcYiEiKjckNyQkIi8oNDxwcCJmRSEjNiQiMEpiVVNCKGViISM2NyQkIjAwVCNvdjxmRSEjNyQiLmZnc2ciXGIhIio3JDckJCIvKDQ8cHAiZkUhIzYkIjBKYlVTQihlYiEjNjckJCIwa3BaVG4iZkUhIzckIjA2aUwkUWpoYiEjNjckNyQkIjAtT0doZiJmRSEjNyQiMG5WXCZSO3JiISM2NyQkIjBrcFpUbiJmRSEjNyQiMDZpTCRRamhiISM2NyQ3JCQiMC1PR2hmImZFISM3JCIwblZcJlI7cmIhIzY3JCQiMFpFYEtkImZFISM3JCIvPU9ObjV1YiEjNTckNyQkIjAoXGYpZlwiZkUhIzckIjAuS2NdL09lJiEjNjckJCIwWkVgS2QiZkUhIzckIi89T05uNXViISM1NyQ3JCQiMChcZilmXCJmRSEjNyQiMC5LY10vT2UmISM2NyQkIjAjcCo0SVoiZkUhIzckIjAkeWRHJXpsZSYhIzY3JDckJCIwUlVua1IiZkUhIzckIjBSP2owWGdmJiEjNjckJCIwI3AqNElaImZFISM3JCIwJHlkRyV6bGUmISM2NyQ3JCQiMFJVbmtSImZFISM3JCIwUj9qMFhnZiYhIzY3JCQiMCRwPFJ0OGZFISM3JCIwKCpmOCM+MCpmJiEjNjckNyQkIi9iNmYoSCJmRSEjNiQiMHYzcWcmWzNjISM2NyQkIjAkcDxSdDhmRSEjNyQiMCgqZjgjPjAqZiYhIzY3JDckJCIvYjZmKEgiZkUhIzYkIjB2M3FnJlszYyEjNjckJCIwJnovVXU3ZkUhIzckIjBeOG4/QzpoJiEjNjckNyQkIjBudU0kKj4iZkUhIzckIjA2KHBkaCM0aSYhIzY3JCQiMCZ6L1V1N2ZFISM3JCIwXjhuP0M6aCYhIzY3JDckJCIwbnVNJCo+ImZFISM3JCIwNihwZGgjNGkmISM2NyQkIjBuQnhnPCJmRSEjNyQiMCRvbyFIJypSaSYhIzY3JDckJCIwJHlNcyw2ZkUhIzckIjBaJlEzbk9MYyEjNjckJCIwbkJ4ZzwiZkUhIzckIjAkb28hSCcqUmkmISM2NyQ3JCQiMCR5TXMsNmZFISM3JCIwWiZRM25PTGMhIzY3JCQiMEUiUVF5NWZFISM3JCIvKilIbSJva2omISM1NyQ3JCQiMHVATlorImZFISM3JCIwJFEyZnMhZWsmISM2NyQkIjBFIlFReTVmRSEjNyQiLyopSG0ib2tqJiEjNTckNyQkIjB1QE5aKyJmRSEjNyQiMCRRMmZzIWVrJiEjNjckJCIwR0w5OCk0ZkUhIzckIjBHWT0lKVIqW2MhIzY3JDckJCIwaS14JDM0ZkUhIzckIjA+aSg0eUNlYyEjNjckJCIwR0w5OCk0ZkUhIzckIjBHWT0lKVIqW2MhIzY3JDckJCIwaS14JDM0ZkUhIzckIjA+aSg0eUNlYyEjNjckJCIwKkglelspM2ZFISM3JCIwaD5SSjY5bSYhIzY3JDckJCIveSZbRSIzZkUhIzYkIjBiXS9PKW9xYyEjNjckJCIwKkglelspM2ZFISM3JCIwaD5SSjY5bSYhIzY3JDckJCIveSZbRSIzZkUhIzYkIjBiXS9PKW9xYyEjNjckJCIwNFwjMyp5IWZFISM3JCIwJUhWImUjKVFuJiEjNjckNyQkIjBEX1V2ciFmRSEjNyQiMCIqUTYiKkdKbyYhIzY3JCQiMDRcIzMqeSFmRSEjNyQiMCVIViJlIylRbiYhIzY3JDckJCIwRF9VdnIhZkUhIzckIjAiKlE2IipHSm8mISM2NyQkIjApKSpbIVJwIWZFISM3JCIwbmIubGBqbyYhIzY3JDckJCIwbCE+MUIxZkUhIzckIjBGRj1ZcGJwJiEjNjckJCIwKSkqWyFScCFmRSEjNyQiMG5iLmxgam8mISM2NyQ3JCQiMGwhPjFCMWZFISM3JCIwRkY9WXBicCYhIzY3JCQiMEFxayQqZiFmRSEjNyQiMGgrXF5DKSlwJiEjNjckNyQkIjBGRC4jSDBmRSEjNyQiMGo6RCw1ITNkISM2NyQkIjBBcWskKmYhZkUhIzckIjBoK1xeQykpcCYhIzY3JDckJCIwRkQuI0gwZkUhIzckIjBqOkQsNSEzZCEjNjckJCIwKHBxVzAwZkUhIzckIi9NIyl6Xkg2ZCEjNTckNyQkIjBMRXRmViFmRSEjNyQiMCpSP2owWD9kISM2NyQkIjAocHFXMDBmRSEjNyQiL00jKXpeSDZkISM1NyQ3JCQiMExFdGZWIWZFISM3JCIwKlI/ajBYP2QhIzY3JCQiMDlYaUBUIWZFISM3JCIwQ3Q8a2xQcyYhIzY3JDckJCIwcmhyTE0hZkUhIzckIjBOIypRNiIqR3QmISM2NyQkIjA5WGlAVCFmRSEjNyQiMEN0PGtsUHMmISM2NyQ3JCQiMHJockxNIWZFISM3JCIwTiMqUTYiKkd0JiEjNjckJCIwWVw1Jj4uZkUhIzckIjBDajMhZkJPZCEjNjckNyQkIjAweXc4RCFmRSEjNyQiMHIhZWs7TFhkISM2NyQkIjBZXDUmPi5mRSEjNyQiMENqMyFmQk9kISM2NyQ3JCQiMDB5dzhEIWZFISM3JCIwciFlaztMWGQhIzY3JCQiMFBncHVBIWZFISM3JCIwInosa2ZxW2QhIzY3JDckJCIwOHo0KzshZkUhIzckIjAycF9Ac3h2JiEjNjckJCIwUGdwdUEhZkUhIzckIjAieixrZnFbZCEjNjckNyQkIjA4ejQrOyFmRSEjNyQiMDJwX0BzeHYmISM2NyQkIjBrIjMxTyxmRSEjNyQiLztcQ2U8aGQhIzU3JDckJCIvJnpmI3ArZkUhIzYkIjBWZGZ3Ny14JiEjNjckJCIwayIzMU8sZkUhIzckIi87XENlPGhkISM1NyQ3JCQiLyZ6ZiNwK2ZFISM2JCIwVmRmdzcteCYhIzY3JCQiMENCdF8vIWZFISM3JCIwW3pkW1hPeCYhIzY3JDckJCIwOzNQInoqKmVFISM3JCIwelhtSmBFeSYhIzY3JCQiMENCdF8vIWZFISM3JCIwW3pkW1hPeCYhIzY3JDckJCIwOzNQInoqKmVFISM3JCIwelhtSmBFeSYhIzY3JCQiMDYyOF4mKiplRSEjNyQiL3QpZSVcNid5JiEjNTckNyQkIjBHTDsnKikpKmVFISM3JCIwOk10J1E0JnomISM2NyQkIjA2MjheJioqZUUhIzckIi90KWUlXDYneSYhIzU3JDckJCIwR0w7JyopKSplRSEjNyQiMDpNdCdRNCZ6JiEjNjckJCIwPixqYicpKmVFISM3JCIwJylvLkAlZSl6JiEjNjckNyQkIjAmNEJzKykqZUUhIzckIjBeQSE9V2AyZSEjNjckJCIwPixqYicpKmVFISM3JCIwJylvLkAlZSl6JiEjNjckNyQkIjAmNEJzKykqZUUhIzckIjBeQSE9V2AyZSEjNjckJCIwMSJRa3coKmVFISM3JCIwJSlvREZgNSJlISM2NyQ3JCQiMC5JV0NyKmVFISM3JCIwKTNyb1woKj5lISM2NyQkIjAxIlFrdygqZUUhIzckIjAlKW9ERmA1ImUhIzY3JDckJCIwLklXQ3IqZUUhIzckIjApM3JvXCgqPmUhIzY3JCQiMCdlME0pbyplRSEjNyQiL3hFUEBfQmUhIzU3JDckJCIwWmNuWmkqZUUhIzckIjBDKlI+YlRLZSEjNjckJCIwJ2UwTSlvKmVFISM3JCIveEVQQF9CZSEjNTckNyQkIjBaY25aaSplRSEjNyQiMEMqUj5iVEtlISM2NyQkIjBoc1kxZyplRSEjNyQiMDdmbCEzKmYkZSEjNjckNyQkIjB1djt4YCplRSEjNyQiL3czcWcmWyVlISM1NyQkIjBoc1kxZyplRSEjNyQiMDdmbCEzKmYkZSEjNjckNyQkIjB1djt4YCplRSEjNyQiL3czcWcmWyVlISM1NyQkIjBga3lOXiplRSEjNyQiMEYxX0ZmJVtlISM2NyQ3JCQiL1duRV4lKmVFISM2JCIwJ2Z4P21IZGUhIzY3JCQiMGBreU5eKmVFISM3JCIwRjFfRmYlW2UhIzY3JDckJCIvV25FXiUqZUUhIzYkIjAnZng/bUhkZSEjNjckJCIwLUU6clUqZUUhIzckIi8yJypcdiM0J2UhIzU3JDckJCIvJWVGYU8qZUUhIzYkIjBLazk8UChwZSEjNjckJCIwLUU6clUqZUUhIzckIi8yJypcdiM0J2UhIzU3JDckJCIvJWVGYU8qZUUhIzYkIjBLazk8UChwZSEjNjckJCIwYzx2N00qZUUhIzckIjAlbyZbaSZSdGUhIzY3JDckJCIwRmMyLUcqZUUhIzckIjBvX0BzeEApZSEjNjckJCIwYzx2N00qZUUhIzckIjAlbyZbaSZSdGUhIzY3JDckJCIwRmMyLUcqZUUhIzckIjBvX0BzeEApZSEjNjckJCIwM0pYZ0QqZUUhIzckIjAmKikzL04nZSllISM2NyQ3JCQiMEVSJGUmPiplRSEjNyQiMC9UR0Y9WSplISM2NyQkIjAzSlhnRCplRSEjNyQiMCYqKTMvTidlKWUhIzY3JDckJCIwRVIkZSY+KmVFISM3JCIwL1RHRj1ZKmUhIzY3JCQiME9QPjk8KmVFISM3JCIvWW4qPUokKSplISM1NyQ3JCQiMCUpSHA6NiplRSEjNyQiLyVITiMpZXEhZiEjNTckJCIwT1A+OTwqZUUhIzckIi9Zbio9SiQpKmUhIzU3JDckJCIwJSlIcDo2KmVFISM3JCIvJUhOIyllcSFmISM1NyQkIjBObzZ1MyplRSEjNyQiL0IteCcpejVmISM1NyQ3JCQiMHRPcCJHISplRSEjNyQiMHc8VVAqXD5mISM2NyQkIjBObzZ1MyplRSEjNyQiL0IteCcpejVmISM1NyQ3JCQiMHRPcCJHISplRSEjNyQiMHc8VVAqXD5mISM2NyQkIjAjKWY8UysqZUUhIzckIjBlP3cnZkVCZiEjNjckNyQkIjBYKClvYCUqKWVFISM3JCIwNzFcIypSPiRmISM2NyQkIjAjKWY8UysqZUUhIzckIjBlP3cnZkVCZiEjNjckNyQkIjBYKClvYCUqKWVFISM3JCIwNzFcIypSPiRmISM2NyQkIjB1bkU3IyopZUUhIzckIi9yIlsxTGQkZiEjNTckNyQkIjBub3hKJykpZUUhIzckIjBbJWZ2L1FXZiEjNjckJCIwdW5FNyMqKWVFISM3JCIvciJbMUxkJGYhIzU3JDckJCIwbm94SicpKWVFISM3JCIwWyVmdi9RV2YhIzY3JCQiMC14WyFSKSllRSEjNyQiMHlgYScqKj5bZiEjNjckNyQkIjAvWiZlInkpZUUhIzckIjAlR0dFNSNvJmYhIzY3JCQiMC14WyFSKSllRSEjNyQiMHlgYScqKj5bZiEjNjckNyQkIjAvWiZlInkpZUUhIzckIjAlR0dFNSNvJmYhIzY3JCQiMENddHV2KWVFISM3JCIwLGRHbm0xJ2YhIzY3JDckJCIwWS0jZisoKWVFISM3JCIvNyhwZGgjcGYhIzU3JCQiMENddHV2KWVFISM3JCIwLGRHbm0xJ2YhIzY3JDckJCIwWS0jZisoKWVFISM3JCIvNyhwZGgjcGYhIzU3JCQiMFhrK2xuKWVFISM3JCIwWityPUxKKGYhIzY3JDckJCIwRjcyLWkpZUUhIzckIjBjZnc3LTwpZiEjNjckJCIwWGsrbG4pZUUhIzckIjBaK3I9TEooZiEjNjckNyQkIjBGNzItaSllRSEjNyQiMGNmdzctPClmISM2NyQkIjA8JipSaGYpZUUhIzckIjA3Y11dKmYmKWYhIzY3JDckJCIwd18/L2EpZUUhIzckIjAjek15RTklKmYhIzY3JCQiMDwmKlJoZillRSEjNyQiMDdjXV0qZiYpZiEjNjckNyQkIjB3Xz8vYSllRSEjNyQiMCN6TXlFOSUqZiEjNjckJCIwSGN3al4pZUUhIzckIjA7KltKYzEpKmYhIzY3JDckJCIwUldGN1kpZUUhIzckIjBHTyFIS2UxZyEjNjckJCIwSGN3al4pZUUhIzckIjA7KltKYzEpKmYhIzY3JDckJCIwUldGN1kpZUUhIzckIjBHTyFIS2UxZyEjNjckJCIwIypRPnNWKWVFISM3JCIwRFVOY0owLCchIzY3JDckJCIwUSRvaiNRKWVFISM3JCIwa0MoelAtPmchIzY3JCQiMCMqUT5zVillRSEjNyQiMERVTmNKMCwnISM2NyQ3JCQiMFEkb2ojUSllRSEjNyQiMGtDKHpQLT5nISM2NyQkIjBYK2YnZSQpZUUhIzckIjAkeUIvdCpILSchIzY3JDckJCIveSNSWUkpZUUhIzYkIi44L0xrOS4nISIqNyQkIjBYK2YnZSQpZUUhIzckIjAkeUIvdCpILSchIzY3JDckJCIveSNSWUkpZUUhIzYkIi44L0xrOS4nISIqNyQkIjBZNCZwIUcpZUUhIzckIjBud08mR1lOZyEjNjckNyQkIjA6XE1zQSllRSEjNyQiME8sNilbIVIvJyEjNjckJCIwWTQmcCFHKWVFISM3JCIwbndPJkdZTmchIzY3JDckJCIwOlxNc0EpZUUhIzckIjBPLDYpWyFSLychIzY3JCQiL1k/TC4jKWVFISM2JCIwQV8vQEd6LychIzY3JDckJCIwMCFwVV0iKWVFISM3JCIwcyp5SmFNY2chIzY3JCQiL1k/TC4jKWVFISM2JCIwQV8vQEd6LychIzY3JDckJCIwMCFwVV0iKWVFISM3JCIwcyp5SmFNY2chIzY3JCQiMD5qcGw3KWVFISM3JCIwQFBZUCRSZ2chIzY3JDckJCIwbkk7VTIpZUUhIzckIjAzeUMpZnlvZyEjNjckJCIwPmpwbDcpZUUhIzckIjBAUFlQJFJnZyEjNjckNyQkIjBuSTtVMillRSEjNyQiMDN5QylmeW9nISM2NyQkIjAuKEdTXSEpZUUhIzckIjA6SHlNZUcyJyEjNjckNyQkIjBudShmKSp6ZUUhIzckIjBXbUpgRTczJyEjNjckJCIwLihHU10hKWVFISM3JCIwOkh5TWVHMichIzY3JDckJCIwbnUoZikqemVFISM3JCIwV21KYEU3MychIzY3JCQiMFhCT1soemVFISM3JCIwaCRmR0pLJjMnISM2NyQ3JCQiMEZ0dk4jemVFISM3JCIvWyZRM25PNCchIzU3JCQiMFhCT1soemVFISM3JCIwaCRmR0pLJjMnISM2NyQ3JCQiMEZ0dk4jemVFISM3JCIvWyZRM25PNCchIzU3JCQiMCQpb2spKip5ZUUhIzckIjBfWCY9eHkoNCchIzY3JDckJCIwQ2ROIlx5ZUUhIzckIjA7VlhqMmg1JyEjNjckJCIwJClvaykqKnllRSEjNyQiMF9YJj14eSg0JyEjNjckNyQkIjBDZE4iXHllRSEjNyQiMDtWWGoyaDUnISM2NyQkIi95SVtEeWVFISM2JCIwSlAkPkBENWghIzY3JDckJCIvbjpIdnhlRSEjNiQiMGBKXz1bJj1oISM2NyQkIi95SVtEeWVFISM2JCIwSlAkPkBENWghIzY3JDckJCIvbjpIdnhlRSEjNiQiMGBKXz1bJj1oISM2NyQkIjAyPiJwXnhlRSEjNyQiMEVQNUw7RjcnISM2NyQ3JCQiMDh4TD9xKGVFISM3JCIwKik+ZnQpKTQ4JyEjNjckJCIwMj4icF54ZUUhIzckIjBFUDVMO0Y3JyEjNjckNyQkIjA4eEw/cShlRSEjNyQiMCopPmZ0KSk0OCchIzY3JCQiMFBVKVx5d2VFISM3JCIvQWpdLj1OaCEjNTckNyQkIjAtL2kkSHdlRSEjNyQiMEQzbUdITTknISM2NyQkIjBQVSlceXdlRSEjNyQiL0FqXS49TmghIzU3JDckJCIwLS9pJEh3ZUUhIzckIjBEM21HSE05JyEjNjckJCIwbS4hKmVnKGVFISM3JCIwZVtHPVd3OSchIzY3JDckJCIwcCozR2R2ZUUhIzckIjBoJ0hQKXBlOichIzY3JCQiMG0uISplZyhlRSEjNyQiMGVbRz1XdzknISM2NyQ3JCQiMHAqM0dkdmVFISM3JCIwaCdIUClwZTonISM2NyQkIjA0UXZRYChlRSEjNyQiL3lvQ3k1Z2ghIzU3JDckJCIwR2AheSZbKGVFISM3JCIwKFwpelE1JG9oISM2NyQkIjA0UXZRYChlRSEjNyQiL3lvQ3k1Z2ghIzU3JDckJCIwR2AheSZbKGVFISM3JCIwKFwpelE1JG9oISM2NyQkIjBGaFdDWShlRSEjNyQiMFExJHo3ZHNoISM2NyQ3JCQiMHJ2Z1tUKGVFISM3JCIwTHQnUTR2IT0nISM2NyQkIjBGaFdDWShlRSEjNyQiMFExJHo3ZHNoISM2NyQ3JCQiMHJ2Z1tUKGVFISM3JCIwTHQnUTR2IT0nISM2NyQkIjAzXi07UihlRSEjNyQiMCQ+PFhYLiY9JyEjNjckNyQkIjBOJ2VgV3RlRSEjNyQiMHBoJCpbIj4kPichIzY3JCQiMDNeLTtSKGVFISM3JCIwJD48WFguJj0nISM2NyQ3JCQiME4nZWBXdGVFISM3JCIwcGgkKlsiPiQ+JyEjNjckJCIwdlBbOEsoZUUhIzckIi8jM0RpKFwoPichIzU3JDckJCIwaWYmenVzZUUhIzckIjAwXSsvS2M/JyEjNjckJCIwdlBbOEsoZUUhIzckIi8jM0RpKFwoPichIzU3JDckJCIwaWYmenVzZUUhIzckIjAwXSsvS2M/JyEjNjckJCIwVylvb15zZUUhIzckIjBBPCk0MCcqNGkhIzY3JDckJCIwTCJlaTBzZUUhIzckIjBUUTJmcyE9aSEjNjckJCIwVylvb15zZUUhIzckIjBBPCk0MCcqNGkhIzY3JDckJCIwTCJlaTBzZUUhIzckIjBUUTJmcyE9aSEjNjckJCIwJ28pKWYjPShlRSEjNyQiMGVWS0BCQ0EnISM2NyQ3JCQiMEw/WHE4KGVFISM3JCIweEU5OTgwQichIzY3JCQiMCdvKSlmIz0oZUUhIzckIjBlVktAQkNBJyEjNjckNyQkIjBMP1hxOChlRSEjNyQiMHhFOTk4MEInISM2NyQkIjAoM3o0OXJlRSEjNyQiMERMJUdkKVtCJyEjNjckNyQkIjAnPiFSIXBxZUUhIzckIjA4OkBwYEhDJyEjNjckJCIwKDN6NDlyZUUhIzckIjBETCVHZClbQichIzY3JDckJCIwJz4hUiFwcWVFISM3JCIwODpAcGBIQychIzY3JCQiMC5dJT1ZcWVFISM3JCIwVEZfMFt0QychIzY3JDckJCIwKWZzaCxxZUUhIzckIjBcLkdDJVJiaSEjNjckJCIwLl0lPVlxZUUhIzckIjBURl8wW3RDJyEjNjckNyQkIjApZnNoLHFlRSEjNyQiMFwuR0MlUmJpISM2NyQkIjB6P1speXBlRSEjNyQiMDZzcD41KWZpISM2NyQ3JCQiLSZwWiRwZUUhIiokIjAmPVwkek15RSchIzY3JCQiMHo/Wyl5cGVFISM3JCIwNnNwPjUpZmkhIzY3JDckJCItJnBaJHBlRSEiKiQiMCY9XCR6TXlFJyEjNjckJCIwWSJSNDdwZUUhIzckIjBpLEA6c0FGJyEjNjckNyQkIjB6bCsmb29lRSEjNyQiMEAhPVdgRiFHJyEjNjckJCIwWSJSNDdwZUUhIzckIjBpLEA6c0FGJyEjNjckNyQkIjB6bCsmb29lRSEjNyQiMEAhPVdgRiFHJyEjNjckJCIwLUA7ZiVvZUUhIzckIjBwXUIjUnQlRychIzY3JDckJCIwSE0wRyFvZUUhIzckIjBkb1sqZXIjSCchIzY3JCQiMC1AO2Ylb2VFISM3JCIwcF1CI1J0JUcnISM2NyQ3JCQiMEhNMEchb2VFISM3JCIwZG9bKmVyI0gnISM2NyQkIjB6LT8ueSdlRSEjNyQiMFtQaF0mPihIJyEjNjckNyQkIjAoeSN6d3QnZUUhIzckIjAkcGJYazowaiEjNjckJCIwei0/LnknZUUhIzckIjBbUGhdJj4oSCchIzY3JDckJCIwKHkjend0J2VFISM3JCIwJHBiWGs6MGohIzY3JCQiMDRtIUg6bmVFISM3JCIwcngiM3BsNGohIzY3JDckJCIvVGI4dG1lRSEjNiQiMEhYaSpwZjxqISM2NyQkIjA0bSFIOm5lRSEjNyQiMHJ4IjNwbDRqISM2NyQ3JCQiL1RiOHRtZUUhIzYkIjBIWGkqcGY8aiEjNjckJCIwc2heM2wnZUUhIzckIjBqTDQ3PUBLJyEjNjckNyQkIjBLb2ciNG1lRSEjNyQiMGxMcGFQK0wnISM2NyQkIjBzaF4zbCdlRSEjNyQiMGpMNDc9QEsnISM2NyQ3JCQiMEtvZyI0bWVFISM3JCIwbExwYVArTCchIzY3JCQiMCg9KnlwZSdlRSEjNyQiMHIkNF8ielhMJyEjNjckNyQkIi9tJWVkYSdlRSEjNiQiMCxBdzR5Q00nISM2NyQkIjAoPSp5cGUnZUUhIzckIjByJDRfInpYTCchIzY3JDckJCIvbSVlZGEnZUUhIzYkIjAsQXc0eUNNJyEjNjckJCIwZSVvb0JsZUUhIzckIi56cSoqUnFNJyEiKjckNyQkIjBKJlIkSFsnZUUhIzckIjBQNSRbJz1cTichIzY3JCQiMGUlb29CbGVFISM3JCIuenEqKlJxTSchIio3JDckJCIwSiZSJEhbJ2VFISM3JCIwUDUkWyc9XE4nISM2NyQkIjBcXms0WSdlRSEjNyQiMER6JGYxXWZqISM2NyQ3JCQiMFc6bjFVJ2VFISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwXF5rNFknZUUhIzckIjBEeiRmMV1maiEjNjckNyQkIjBXOm4xVSdlRSEjNyQiMHQpKiopPmZ0TychIzY3JCQiMHo7OCkpUidlRSEjNyQiMEsnZlE2Jz5QJyEjNjckNyQkIjBpa3gqZWplRSEjNyQiMDQob1woKnp6aiEjNjckJCIwejs4KSlSJ2VFISM3JCIwSydmUTYnPlAnISM2NyQ3JCQiMGlreCplamVFISM3JCIwNChvXCgqenpqISM2NyQkIjB4UU9zTCdlRSEjNyQiMEciZUw5VSVRJyEjNjckNyQkIjByJilmeUgnZUUhIzckIjBYdi5JU0FSJyEjNjckJCIweFFPc0wnZUUhIzckIjBHImVMOVUlUSchIzY3JDckJCIwciYpZnlIJ2VFISM3JCIwWHYuSVNBUichIzY3JCQiMCopSFJpRidlRSEjNyQiMC4icFU6KW9SJyEjNjckNyQkIjBaKik0dEInZUUhIzckIjAiUTFeM28vayEjNjckJCIwKilIUmlGJ2VFISM3JCIwLiJwVTopb1InISM2NyQ3JCQiMFoqKTR0QidlRSEjNyQiMCJRMV4zby9rISM2NyQkIi8oeSxlQCdlRSEjNiQiMDd2QlpUJDRrISM2NyQ3JCQiMFd5O3Q8J2VFISM3JCIwPV88U0ByVCchIzY3JCQiLyh5LGVAJ2VFISM2JCIwN3ZCWlQkNGshIzY3JDckJCIwV3k7dDwnZUUhIzckIjA9XzxTQHJUJyEjNjckJCIwdi1IZjonZUUhIzckIjA2dTRBLD1VJyEjNjckNyQkIjBmdCUqeTYnZUUhIzckIjBhU0MmPmNIayEjNjckJCIwdi1IZjonZUUhIzckIjA2dTRBLD1VJyEjNjckNyQkIjBmdCUqeTYnZUUhIzckIjBhU0MmPmNIayEjNjckJCIwN0hObTQnZUUhIzckIjA2N1J5Z1VWJyEjNjckNyQkIjBPLEohZmdlRSEjNyQiLypHSl0tP1cnISM1NyQkIjA3SE5tNCdlRSEjNyQiMDY3UnlnVVYnISM2NyQ3JCQiME8sSiFmZ2VFISM3JCIvKkdKXS0/VychIzU3JCQiMC9VIip5LidlRSEjNyQiLyVRMDw/blcnISM1NyQ3JCQiMFRYVDIrJ2VFISM3JCIwRTxRMFZXWCchIzY3JCQiMC9VIip5LidlRSEjNyQiLyVRMDw/blcnISM1NyQ3JCQiMFRYVDIrJ2VFISM3JCIwRTxRMFZXWCchIzY3JCQiMERoSCh6ZmVFISM3JCIwLkgwUHoiZmshIzY3JDckJCIwKSpRL0klZmVFISM3JCIwaTBYZyQpb1knISM2NyQkIjBEaEgoemZlRSEjNyQiMC5IMFB6ImZrISM2NyQ3JCQiMCkqUS9JJWZlRSEjNyQiMGkwWGckKW9ZJyEjNjckJCIwJDNGN0FmZUUhIzckIjBbI2YjUlE7WichIzY3JDckJCIwW2BQZSllZUUhIzckIjApUj5iVEt6ayEjNjckJCIwJDNGN0FmZUUhIzckIjBbI2YjUlE7WichIzY3JDckJCIwW2BQZSllZUUhIzckIjApUj5iVEt6ayEjNjckJCIwblMpM2xlZUUhIzckIi9QMEpzNCVbJyEjNTckNyQkIjBIJ0dBSGVlRSEjNyQiME0jKWVxazxcJyEjNjckJCIwblMpM2xlZUUhIzckIi9QMEpzNCVbJyEjNTckNyQkIjBIJ0dBSGVlRSEjNyQiME0jKWVxazxcJyEjNjckJCIwXzIuJzNlZUUhIzckIjBHIVwkKmViJ1wnISM2NyQ3JCQiMEhVc0p4JmVFISM3JCIvMmRjXz8vbCEjNTckJCIwXzIuJzNlZUUhIzckIjBHIVwkKmViJ1wnISM2NyQ3JCQiMEhVc0p4JmVFISM3JCIvMmRjXz8vbCEjNTckJCIwWyYpKm9fZGVFISM3JCIwQCNbc1YsNGwhIzY3JDckJCIwMG0jbzxkZUUhIzckIjAxZnMhZWs7bCEjNjckJCIwWyYpKm9fZGVFISM3JCIwQCNbc1YsNGwhIzY3JDckJCIwMG0jbzxkZUUhIzckIjAxZnMhZWs7bCEjNjckJCIwZmlSdHAmZUUhIzckIjBsYDRuczlfJyEjNjckNyQkIjBFZFdGbSZlRSEjNyQiMFVaek4nM0hsISM2NyQkIjBmaVJ0cCZlRSEjNyQiMGxgNG5zOV8nISM2NyQ3JCQiMEVkV0ZtJmVFISM3JCIwVVp6TiczSGwhIzY3JCQiMFlzUERrJmVFISM3JCIwWzFPeklSYCchIzY3JDckJCIvPitQM2NlRSEjNiQiMHlOJzNwX1RsISM2NyQkIjBZc1BEayZlRSEjNyQiMFsxT3pJUmAnISM2NyQ3JCQiLz4rUDNjZUUhIzYkIjB5TiczcF9UbCEjNjckJCIwS0EyJCllJmVFISM3JCIwdFVJdClRWWwhIzY3JDckJCIwKCl5WVhiJmVFISM3JCIwOUMkZnUnUmInISM2NyQkIjBLQTIkKWUmZUUhIzckIjB0VUl0KVFZbCEjNjckNyQkIjAoKXlZWGImZUUhIzckIjA5QyRmdSdSYichIzY3JCQiMC5oQ1lgJmVFISM3JCIwOSxvXFkpZWwhIzY3JDckJCIvPm1HLGJlRSEjNiQiL0QsNSEza2MnISM1NyQkIjAuaENZYCZlRSEjNyQiMDksb1xZKWVsISM2NyQ3JCQiLz5tRyxiZUUhIzYkIi9ELDUhM2tjJyEjNTckJCIwUCJIXiJbJmVFISM3JCIwMClceFNJcmwhIzY3JDckJCIwS1V4JlthZUUhIzckIjAnM3FnJlspeWwhIzY3JCQiMFAiSF4iWyZlRSEjNyQiMDApXHhTSXJsISM2NyQ3JCQiMEtVeCZbYWVFISM3JCIwJzNxZyZbKXlsISM2NyQkIi9wJ1sqR2FlRSEjNiQiMDZkRVtoUGUnISM2NyQ3JCQiL3VMVCdSJmVFISM2JCIwQSpRNiIqRyJmJyEjNjckJCIvcCdbKkdhZUUhIzYkIjA2ZEVbaFBlJyEjNjckNyQkIi91TFQnUiZlRSEjNiQiMEEqUTYiKkciZichIzY3JCQiMDhvSnBQJmVFISM3JCIvNE03KD1pZichIzU3JDckJCIwVHE2W00mZUUhIzckIjBleD9tSFBnJyEjNjckJCIwOG9KcFAmZUUhIzckIi80TTcoPWlmJyEjNTckNyQkIjBUcTZbTSZlRSEjNyQiMGV4P21IUGcnISM2NyQkIjBEIlxbRGBlRSEjNyQiMHQnPWZkbjNtISM2NyQ3JCQiMHhdZ1BIJmVFISM3JCIwJWZ3Ny08O20hIzY3JCQiMEQiXFtEYGVFISM3JCIwdCc9ZmRuM20hIzY3JDckJCIweF1nUEgmZUUhIzckIjAlZnc3LTw7bSEjNjckJCIwcidcZXVfZUUhIzckIjBIJ3BJRThAbSEjNjckNyQkIjA5IVJEVl9lRSEjNyQiL1ZYajJoR20hIzU3JCQiMHInXGV1X2VFISM3JCIwSCdwSUU4QG0hIzY3JDckJCIwOSFSRFZfZUUhIzckIi9WWGoyaEdtISM1NyQkIjAzbEpVQSZlRSEjNyQiMCc9JHBLKmVMbSEjNjckNyQkIjB3TitMPiZlRSEjNyQiMG1VVEpeNWsnISM2NyQkIjAzbEpVQSZlRSEjNyQiMCc9JHBLKmVMbSEjNjckNyQkIjB3TitMPiZlRSEjNyQiMG1VVEpeNWsnISM2NyQkIi87TVZ1XmVFISM2JCIwRCQ9WGUvWW0hIzY3JDckJCIwVC0iKlE5JmVFISM3JCIwLUpbJz1cYG0hIzY3JCQiLztNVnVeZUUhIzYkIjBEJD1YZS9ZbSEjNjckNyQkIjBULSIqUTkmZUUhIzckIjAtSlsnPVxgbSEjNjckJCIwTVEiPUReZUUhIzckIjBiKEgpPS0mZW0hIzY3JDckJCIwYUxNXTQmZUUhIzckIjBRPmJUS2ZtJyEjNjckJCIwTVEiPUReZUUhIzckIjBiKEgpPS0mZW0hIzY3JDckJCIwYUxNXTQmZUUhIzckIjBRPmJUS2ZtJyEjNjckJCIwdydSW3ddZUUhIzckIjBud05OZTRuJyEjNjckNyQkIjAlejlzWV1lRSEjNyQiMHUyaSdIUHltISM2NyQkIjB3J1Jbd11lRSEjNyQiMG53Tk5lNG4nISM2NyQ3JCQiMCV6OXNZXWVFISM3JCIwdTJpJ0hQeW0hIzY3JCQiMDo9USRHXWVFISM3JCIwUHk+TTlNbychIzY3JDckJCIwJzRuJyopKlxlRSEjNyQiL2gqb144M3AnISM1NyQkIjA6PVEkR11lRSEjNyQiMFB5Pk05TW8nISM2NyQ3JCQiMCc0bicqKSpcZUUhIzckIi9oKm9eODNwJyEjNTckJCIwZXJTMilcZUUhIzckIi9RY2EsKGVwJyEjNTckNyQkIjAnZSZcPCZcZUUhIzckIjBZJWVuU0QubiEjNjckJCIwZXJTMilcZUUhIzckIi9RY2EsKGVwJyEjNTckNyQkIjAnZSZcPCZcZUUhIzckIjBZJWVuU0QubiEjNjckJCIwYmcpb0xcZUUhIzckIjBtJEcjekQkM24hIzY3JDckJCIwanB2XSFcZUUhIzckIjAkR0Y9WXA6biEjNjckJCIwYmcpb0xcZUUhIzckIjBtJEcjekQkM24hIzY3JDckJCIwanB2XSFcZUUhIzckIjAkR0Y9WXA6biEjNjckJCIwKWU7PSgpW2VFISM3JCIwVyo+Yjd5P24hIzY3JDckJCIwVyZcJSplW2VFISM3JCIwPmgqb144R24hIzY3JCQiMCllOz0oKVtlRSEjNyQiMFcqPmI3eT9uISM2NyQ3JCQiMFcmXCUqZVtlRSEjNyQiMD5oKm9eOEduISM2NyQkIjBfdzg3JVtlRSEjNyQiMFpxX2FPS3QnISM2NyQ3JCQiMERDXkwiW2VFISM3JCIwYlwnPmRkU24hIzY3JCQiMF93ODclW2VFISM3JCIwWnFfYU9LdCchIzY3JDckJCIwRENeTCJbZUUhIzckIjBiXCc+ZGRTbiEjNjckJCIwWmIneiZ6JWVFISM3JCIwaW4oZTtwWG4hIzY3JDckJCIwLkExJG9aZUUhIzckIjAiekxxaSxgbiEjNjckJCIwWmIneiZ6JWVFISM3JCIwaW4oZTtwWG4hIzY3JDckJCIwLkExJG9aZUUhIzckIjAiekxxaSxgbiEjNjckJCIwQCl6IjR2JWVFISM3JCIvSmIqZlkiZW4hIzU3JDckJCIwKmZ5ekJaZUUhIzckIjBGRTUjb1hsbiEjNjckJCIwQCl6IjR2JWVFISM3JCIvSmIqZlkiZW4hIzU3JDckJCIwKmZ5ekJaZUUhIzckIjBGRTUjb1hsbiEjNjckJCIwZXgkZTFaZUUhIzckIjBBIXpsOGdxbiEjNjckNyQkIjAjZS4lKXpZZUUhIzckIjBqOTxQKCp5eCchIzY3JCQiMGV4JGUxWmVFISM3JCIwQSF6bDhncW4hIzY3JDckJCIwI2UuJSl6WWVFISM3JCIwajk8UCgqeXgnISM2NyQkIjB1Pyd6aVllRSEjNyQiLzB2Y2YwJHknISM1NyQ3JCQiMDFtNWtqJWVFISM3JCIwKkhTQXpMIXonISM2NyQkIjB1Pyd6aVllRSEjNyQiLzB2Y2YwJHknISM1NyQ3JCQiMDFtNWtqJWVFISM3JCIwKkhTQXpMIXonISM2NyQkIi9KVGE+WWVFISM2JCIwKXkrdy5eJnonISM2NyQ3JCQiLzlJXyRmJWVFISM2JCIwTiI0dCV5RiFvISM2NyQkIi9KVGE+WWVFISM2JCIwKXkrdy5eJnonISM2NyQ3JCQiLzlJXyRmJWVFISM2JCIwTiI0dCV5RiFvISM2NyQkIjBlISlIb2QlZUUhIzckIjAjeiRHaWt6IW8hIzY3JDckJCIwaEJyNmIlZUUhIzckIjByelAtPl8ibyEjNjckJCIwZSEpSG9kJWVFISM3JCIwI3okR2lreiFvISM2NyQ3JCQiMGhCcjZiJWVFISM3JCIwcnpQLT5fIm8hIzY3JCQiMGEtZllgJWVFISM3JCIwKUhRJnA9LyNvISM2NyQ3JCQiMDB4XyQ0WGVFISM3JCIwMm9XZGZ3I28hIzY3JCQiMGEtZllgJWVFISM3JCIwKUhRJnA9LyNvISM2NyQ3JCQiMDB4XyQ0WGVFISM3JCIwMm9XZGZ3I28hIzY3JCQiMCZ6ciwkXCVlRSEjNyQiMHRGJClmc0ckbyEjNjckNyQkIjBOPHkhb1dlRSEjNyQiMFZjXjcrLCVvISM2NyQkIjAmenIsJFwlZUUhIzckIjB0RiQpZnNHJG8hIzY3JDckJCIwTjx5IW9XZUUhIzckIjBWY143KywlbyEjNjckJCIwYCdvIz5YJWVFISM3JCIvbFVDaktYbyEjNTckNyQkIjBqQEd0VSVlRSEjNyQiMHpXZW5TRCZvISM2NyQkIjBgJ28jPlglZUUhIzckIi9sVUNqS1hvISM1NyQ3JCQiMGpAR3RVJWVFISM3JCIweldlblNEJm8hIzY3JCQiMG50YzhUJWVFISM3JCIwSklQKSl6eCZvISM2NyQ3JCQiMHh0QHJRJWVFISM3JCIwOkxsQSIpXCdvISM2NyQkIjBudGM4VCVlRSEjNyQiMEpJUCkpengmbyEjNjckNyQkIjB4dEByUSVlRSEjNyQiMDpMbEEiKVwnbyEjNjckJCIweGtKOFAlZUUhIzckIjB6cCNvS0JxbyEjNjckNyQkIjB5Jj1XWlZlRSEjNyQiMF5Ac3hAdShvISM2NyQkIjB4a0o4UCVlRSEjNyQiMHpwI29LQnFvISM2NyQ3JCQiMHkmPVdaVmVFISM3JCIwXkBzeEB1KG8hIzY3JCQiLyN6Uz1MJWVFISM2JCIwIyo0OlsnbyMpbyEjNjckNyQkIi86R0kzVmVFISM2JCIwKCk0ektpKSopbyEjNjckJCIvI3pTPUwlZUUhIzYkIjAjKjQ6WydvIylvISM2NyQ3JCQiLzpHSTNWZUUhIzYkIjAoKTR6S2kpKilvISM2NyQkIjAsNSEpR0glZUUhIzckIjBqYlpfUl4qbyEjNjckNyQkIjAzJFJvcFVlRSEjNyQiMEIpZnlHSS1wISM2NyQkIjAsNSEpR0glZUUhIzckIjBqYlpfUl4qbyEjNjckNyQkIjAzJFJvcFVlRSEjNyQiMEIpZnlHSS1wISM2NyQkIjBNRmBXRCVlRSEjNyQiMC4/b1IjZjJwISM2NyQ3JCQiMClIYmdKVWVFISM3JCIwZidHSE11OXAhIzY3JCQiME1GYFdEJWVFISM3JCIwLj9vUiNmMnAhIzY3JDckJCIwKUhiZ0pVZUUhIzckIjBmJ0dITXU5cCEjNjckJCIwJSlIaWxAJWVFISM3JCIwPW1xNFgrI3AhIzY3JDckJCIwSjBgUz4lZUUhIzckIjAmXCgqelI9RnAhIzY3JCQiMCUpSGlsQCVlRSEjNyQiMD1tcTRYKyNwISM2NyQ3JCQiMEowYFM+JWVFISM3JCIwJlwoKnpSPUZwISM2NyQkIjAyYSM+elRlRSEjNyQiMGAnPUl3XEtwISM2NyQ3JCQiMFs9P3E6JWVFISM3JCIwSmoxYEMnUnAhIzY3JCQiMDJhIz56VGVFISM3JCIwYCc9SXdcS3AhIzY3JDckJCIwWz0/cTolZUUhIzckIjBKajFgQydScCEjNjckJCIwTzZjQjklZUUhIzckIjAtKEgjKipcXCVwISM2NyQ3JCQiMHRHRjA3JWVFISM3JCIwbl44M2w/JnAhIzY3JCQiME82Y0I5JWVFISM3JCIwLShIIyoqXFwlcCEjNjckNyQkIjB0R0YwNyVlRSEjNyQiMG5eODNsPyZwISM2NyQkIjAmPlwwMVRlRSEjNyQiMGYoeSM9LXUmcCEjNjckNyQkIjBtISlmWDMlZUUhIzckIjAuUz9qMFgncCEjNjckJCIwJj5cMDFUZUUhIzckIjBmKHkjPS11JnAhIzY3JDckJCIwbSEpZlgzJWVFISM3JCIwLlM/ajBYJ3AhIzY3JCQiL0tWRnFTZUUhIzYkIjBCW2o/YSlwcCEjNjckNyQkIjApKlE2IlxTZUUhIzckIjBSR0Y9WXAocCEjNjckJCIvS1ZGcVNlRSEjNiQiMEJbaj9hKXBwISM2NyQ3JCQiMCkqUTYiXFNlRSEjNyQiMFJHRj1ZcChwISM2NyQkIjBAYUVdLiVlRSEjNyQiMCYpcCFmZ0kjKXAhIzY3JDckJCIwUEQlPjlTZUUhIzckIjB3O010J1EqKXAhIzY3JCQiMEBhRV0uJWVFISM3JCIwJilwIWZnSSMpcCEjNjckNyQkIjBQRCU+OVNlRSEjNyQiMHY7TXQnUSopcCEjNjckJCIwSigqKUgrU2VFISM3JCIwPSYpXHVkWipwISM2NyQ3JCQiMHArLyl6UmVFISM3JCIwNjBUR0Y9KyghIzY3JCQiMEooKilIK1NlRSEjNyQiMD0mKVx1ZFoqcCEjNjckNyQkIjBwKy8pelJlRSEjNyQiMDYwVEdGPSsoISM2NyQkIjBpIWU1bVJlRSEjNyQiMDBaJmYjNHMrKCEjNjckNyQkIjBvTElmJVJlRSEjNyQiMFskek15RTlxISM2NyQkIjBpIWU1bVJlRSEjNyQiMDBaJmYjNHMrKCEjNjckNyQkIjBvTElmJVJlRSEjNyQiMFskek15RTlxISM2NyQkIi5eSUMkUmVFISM1JCIwPWMhMzFtPnEhIzY3JDckJCIwakUiZTdSZUUhIzckIjAlPVsmUTNuLSghIzY3JCQiLl5JQyRSZUUhIzUkIjA9YyEzMW0+cSEjNjckNyQkIjBqRSJlN1JlRSEjNyQiMCU9WyZRM24tKCEjNjckJCIwYiRbRioqUWVFISM3JCIwO14qKnk2QC4oISM2NyQ3JCQiMDteZSh6UWVFISM3JCIvLTxPKlsiUnEhIzU3JCQiMGIkW0YqKlFlRSEjNyQiMDteKip5NkAuKCEjNjckNyQkIjA7XmUoelFlRSEjNyQiLy08TypbIlJxISM1NyQkIjA6J0hsbVFlRSEjNyQiMGImbytHY1dxISM2NyQ3JCQiL3g9WFpRZUUhIzYkIjBjZW9bKmVecSEjNjckJCIwOidIbG1RZUUhIzckIjBiJm8rR2NXcSEjNjckNyQkIi94PVhaUWVFISM2JCIwY2VvWyplXnEhIzY3JCQiMHdWW1gkUWVFISM3JCIwPE1iazhxMCghIzY3JDckJCIvWSRwYyJRZUUhIzYkIjAjcGFQKy5rcSEjNjckJCIwd1ZbWCRRZUUhIzckIjA8TWJrOHEwKCEjNjckNyQkIi9ZJHBjIlFlRSEjNiQiMCNwYVArLmtxISM2NyQkIjA6JUgnSCFRZUUhIzckIjAtZlJLayVwcSEjNjckNyQkIjBVWi9XeSRlRSEjNyQiMEdOIyllcWsyKCEjNjckJCIwOiVIJ0ghUWVFISM3JCIwLWZSS2slcHEhIzY3JDckJCIwVVovV3kkZUUhIzckIjBHTiMpZXFrMighIzY3JCQiL2lpKj14JGVFISM2JCIwJnktT1siPjMoISM2NyQ3JCQiMD4yZE92JGVFISM3JCIwa0IqUTYiKikzKCEjNjckJCIvaWkqPXgkZUUhIzYkIjAmeS1PWyI+MyghIzY3JDckJCIwPjJkT3YkZUUhIzckIjBrQipRNiIqKTMoISM2NyQkIjBoXGE4dSRlRSEjNyQiMGsmeXpeTyU0KCEjNjckNyQkIjAmZktWQlBlRSEjNyQiLjcnKm9eODUoISIqNyQkIjBoXGE4dSRlRSEjNyQiMGsmeXpeTyU0KCEjNjckNyQkIjAmZktWQlBlRSEjNyQiLjcnKm9eODUoISIqNyQkIjBsWVA4ciRlRSEjNyQiMEoqR2JgIm81KCEjNjckNyQkIjBvI1tzJHAkZUUhIzckIjBPKy5DI3o4ciEjNjckJCIwbFlQOHIkZUUhIzckIjBKKkdiYCJvNSghIzY3JDckJCIwbyNbcyRwJGVFISM3JCIwTysuQyN6OHIhIzY3JCQiMFpHQz1vJGVFISM3JCIwZk8jcGBFPnIhIzY3JDckJCIvUHFfa09lRSEjNiQiMHMpKTR6S2k3KCEjNjckJCIwWkdDPW8kZUUhIzckIjBmTyNwYEU+ciEjNjckNyQkIi9QcV9rT2VFISM2JCIwcykpNHpLaTcoISM2NyQkIjB3WU5HbCRlRSEjNyQiMCopW11AOjw4KCEjNjckNyQkIjA0S1dlaiRlRSEjNyQiMDN4O010J1FyISM2NyQkIjB3WU5HbCRlRSEjNyQiMCopW11AOjw4KCEjNjckNyQkIjA0S1dlaiRlRSEjNyQiMDN4O010J1FyISM2NyQkIjBpIUdPQ09lRSEjNyQiME9lYCpbO1dyISM2NyQ3JCQiL3hYbzJPZUUhIzYkIjBXbEIqUTZeciEjNjckJCIwaSFHT0NPZUUhIzckIjBPZWAqWztXciEjNjckNyQkIi94WG8yT2VFISM2JCIwV2xCKlE2XnIhIzY3JCQiMFVZLGtmJGVFISM3JCIwdzo8VDltOighIzY3JDckJCIwQiRcLiFlJGVFISM3JCIvUTBWV2JqciEjNTckJCIwVVksa2YkZUUhIzckIjB3OjxUOW06KCEjNjckNyQkIjBCJFwuIWUkZUUhIzckIi9RMFZXYmpyISM1NyQkIjA2JVInKm9OZUUhIzckIjA3OCx3aiFwciEjNjckNyQkIjBGIioqKkdiJGVFISM3JCIwO1VQKlwqZjwoISM2NyQkIjA2JVInKm9OZUUhIzckIjA3OCx3aiFwciEjNjckNyQkIjBGIioqKkdiJGVFISM3JCIwO1VQKlwqZjwoISM2NyQkIjAtSkg/YSRlRSEjNyQiMGRncyVIXiI9KCEjNjckNyQkIjA4a21pXyRlRSEjNyQiMF9JV2FOJSk9KCEjNjckJCIwLUpIP2EkZUUhIzckIjBkZ3MlSF4iPSghIzY3JDckJCIwOGttaV8kZUUhIzckIjBfSVdhTiUpPSghIzY3JCQiMEw5NWNeJGVFISM3JCIwJXA3cD4nUj4oISM2NyQ3JCQiMCkqb2IsXSRlRSEjNyQiMCkpPV40dzM/KCEjNjckJCIwTDk1Y14kZUUhIzckIjAlcDdwPidSPighIzY3JDckJCIwKSpvYixdJGVFISM3JCIwKSk9XjR3Mz8oISM2NyQkIjA0KXlxKlskZUUhIzckIjBVXV8jM1QxcyEjNjckNyQkIjA+YV9YWiRlRSEjNyQiMEMyZWs7TEAoISM2NyQkIjA0KXlxKlskZUUhIzckIjBVXV8jM1QxcyEjNjckNyQkIjA+YV9YWiRlRSEjNyQiMEMyZWs7TEAoISM2NyQkIjBPTjlWWSRlRSEjNyQiMFZdIz0mZik9cyEjNjckNyQkIjBYK2wlXE1lRSEjNyQiL2NcJz5kZEEoISM1NyQkIjBPTjlWWSRlRSEjNyQiMFZdIz0mZik9cyEjNjckNyQkIjBYK2wlXE1lRSEjNyQiL2NcJz5kZEEoISM1NyQkIjApW3RWUk1lRSEjNyQiLWpYITM4QighIik3JDckJCIwWCt4W1UkZUUhIzckIjAnUj1aeD5RcyEjNjckJCIwKVt0VlJNZUUhIzckIi1qWCEzOEIoISIpNyQ3JCQiMFgreFtVJGVFISM3JCIwJ1I9Wng+UXMhIzY3JCQiMEBOYV1UJGVFISM3JCIwRzNZVGNQQyghIzY3JDckJCIwXih5eitNZUUhIzckIjBLc3lIUTFEKCEjNjckJCIwQE5hXVQkZUUhIzckIjBHM1lUY1BDKCEjNjckNyQkIjBeKHl6K01lRSEjNyQiMEtzeUhRMUQoISM2NyQkIjAoSFI+IlIkZUUhIzckIjBoRGdoL2lEKCEjNjckNyQkIjBOTUtzUCRlRSEjNyQiMG9nJlspeUlFKCEjNjckJCIwKEhSPiJSJGVFISM3JCIwaERnaC9pRCghIzY3JDckJCIwTk1Lc1AkZUUhIzckIjBvZyZbKXlJRSghIzY3JCQiMCQzXiR5TyRlRSEjNyQiMDEybWxfJ29zISM2NyQ3JCQiMD1UblROJGVFISM3JCIwL1wjKlI+YkYoISM2NyQkIjAkM14keU8kZUUhIzckIjAxMm1sXydvcyEjNjckNyQkIjA9VG5UTiRlRSEjNyQiMC9cIypSPmJGKCEjNjckJCIwJVFUKVxNJGVFISM3JCIwTFtWYCs2RyghIzY3JDckJCIvXyQ0O0wkZUUhIzYkIi91JCpcKmZ6RyghIzU3JCQiMCVRVClcTSRlRSEjNyQiMExbVmArNkcoISM2NyQ3JCQiL18kNDtMJGVFISM2JCIvdSQqXCpmekcoISM1NyQkIjA7JjNrQUxlRSEjNyQiMFwuJFwjW05IKCEjNjckNyQkIjBhLGUmNExlRSEjNyQiMHdEMV0rL0koISM2NyQkIjA7JjNrQUxlRSEjNyQiMFwuJFwjW05IKCEjNjckNyQkIjBhLGUmNExlRSEjNyQiMHdEMV0rL0koISM2NyQkIjAkel0hM0kkZUUhIzckIjBmRTohZSpmSSghIzY3JDckJCIwXzlAISlHJGVFISM3JCIwODk4MFRHSighIzY3JCQiMCR6XSEzSSRlRSEjNyQiMGZFOiFlKmZJKCEjNjckNyQkIjBfOUAhKUckZUUhIzckIjA4OTgwVEdKKCEjNjckJCIwKHoheSV6S2VFISM3JCIwOjkxPlYlPXQhIzY3JDckJCIwX0x3cEUkZUUhIzckIjBcLT9nIkdEdCEjNjckJCIwKHoheSV6S2VFISM3JCIwOjkxPlYlPXQhIzY3JDckJCIwX0x3cEUkZUUhIzckIjBcLT9nIkdEdCEjNjckJCIwMyhRa2VLZUUhIzckIjAjM3BALyozTCghIzY3JDckJCIwbEpKa0MkZUUhIzckIjAmM3BfQHNQdCEjNjckJCIwMyhRa2VLZUUhIzckIjAjM3BALyozTCghIzY3JDckJCIwbEpKa0MkZUUhIzckIjAmM3BfQHNQdCEjNjckJCIwTTdCJFFLZUUhIzckIjBbRyIpW1BMTSghIzY3JDckJCIwWSwiUkVLZUUhIzckIjBAekxxaSxOKCEjNjckJCIwTTdCJFFLZUUhIzckIjBbRyIpW1BMTSghIzY3JDckJCIwWSwiUkVLZUUhIzckIjBAekxxaSxOKCEjNjckJCIwPiZbXD1LZUUhIzckIjA7Y21SJXlidCEjNjckNyQkIjApcCFlbz8kZUUhIzckIjBkblNELkVPKCEjNjckJCIwPiZbXD1LZUUhIzckIjA7Y21SJXlidCEjNjckNyQkIjApcCFlbz8kZUUhIzckIjBkblNELkVPKCEjNjckJCIwOGh1Iio+JGVFISM3JCIwPSdHVTZCb3QhIzY3JDckJCIwLGY7eT0kZUUhIzckIjAkZnYvUS92dCEjNjckJCIwOGh1Iio+JGVFISM3JCIwPSdHVTZCb3QhIzY3JDckJCIwLGY7eT0kZUUhIzckIjAkZnYvUS92dCEjNjckJCIwJypbWS49JGVFISM3JCIwbj8sdHgxUSghIzY3JDckJCIwZEZ1I3BKZUUhIzckIjBIV2FOJVsoUSghIzY3JCQiMCcqW1kuPSRlRSEjNyQiMG4/LHR4MVEoISM2NyQ3JCQiMGRGdSNwSmVFISM3JCIwSFdhTiVbKFEoISM2NyQkIjBLbkM/OyRlRSEjNyQiMCIzaGJUNyRSKCEjNjckNyQkIjBvWVA3OiRlRSEjNyQiMGxLaCFcIyoqUighIzY3JCQiMEtuQz87JGVFISM3JCIwIjNoYlQ3JFIoISM2NyQ3JCQiMG9ZUDc6JGVFISM3JCIwbEtoIVwjKipSKCEjNjckJCIwZioqM1U5JGVFISM3JCIvKjQpPS9kMHUhIzU3JDckJCIwKik9KXBMSmVFISM3JCIwLEBvWGxCVCghIzY3JCQiMGYqKjNVOSRlRSEjNyQiLyo0KT0vZDB1ISM1NyQ3JCQiMCopPSlwTEplRSEjNyQiMCxAb1hsQlQoISM2NyQkIjAvVnlvNyRlRSEjNyQiMEJna187IT11ISM2NyQ3JCQiMFg1Xm02JGVFISM3JCIwUDR2KzFbVSghIzY3JCQiMC9WeW83JGVFISM3JCIwQmdrXzshPXUhIzY3JDckJCIwWDVebTYkZUUhIzckIjBQNHYrMVtVKCEjNjckJCIwUW1gKzYkZUUhIzckIjBkRz5aaS9WKCEjNjckNyQkIjAneSE0LDUkZUUhIzckIjB0KD5lbENQdSEjNjckJCIwUW1gKzYkZUUhIzckIjBkRz5aaS9WKCEjNjckNyQkIjAneSE0LDUkZUUhIzckIjB0KD5lbENQdSEjNjckJCIwUStHUDQkZUUhIzckIjAlM09kIzNIVyghIzY3JDckJCIwRiMpXFMzJGVFISM3JCIwNCcpKTNyb1x1ISM2NyQkIjBRK0dQNCRlRSEjNyQiMCUzT2QjM0hXKCEjNjckNyQkIjBGIylcUzMkZUUhIzckIjA0JykpM3JvXHUhIzY3JCQiMEpsJil5MiRlRSEjNyQiMEhBeSlRTmJ1ISM2NyQ3JCQiMCU9bVxvSWVFISM3JCIwWHUmZnc3aXUhIzY3JCQiMEpsJil5MiRlRSEjNyQiMEhBeSlRTmJ1ISM2NyQ3JCQiMCU9bVxvSWVFISM3JCIwWHUmZnc3aXUhIzY3JCQiMEtUY0QxJGVFISM3JCIwQ2RQTip6bnUhIzY3JDckJCIwKlFDVmBJZUUhIzckIjAiR0U1I29YWighIzY3JCQiMEtUY0QxJGVFISM3JCIwQ2RQTip6bnUhIzY3JDckJCIwKlFDVmBJZUUhIzckIjAiR0U1I29YWighIzY3JCQiMC5qLngvJGVFISM3JCIwZD1wbVctWyghIzY3JDckJCIweVhuKVFJZUUhIzckIjA8XjR3M3FbKCEjNjckJCIwLmoueC8kZUUhIzckIjBkPXBtVy1bKCEjNjckNyQkIjB5WG4pUUllRSEjNyQiMDxeNHczcVsoISM2NyQkIjAmNE9PTEllRSEjNyQiMEFsYyIpKm8jXCghIzY3JDckJCIwJUg3ekNJZUUhIzckIjBgUjtKXCUqXCghIzY3JCQiMCY0T09MSWVFISM3JCIwQWxjIikqbyNcKCEjNjckNyQkIjAlSDd6Q0llRSEjNyQiMGBSO0pcJSpcKCEjNjckJCIvPCgqXD5JZUUhIzYkIjBqVjwiWzgwdiEjNjckNyQkIjBhNDE3LCRlRSEjNyQiMCp5S2kpKik9XighIzY3JCQiLzwoKlw+SWVFISM2JCIwalY8Ils4MHYhIzY3JDckJCIwYTQxNywkZUUhIzckIjAqeUtpKSopPV4oISM2NyQkIjAiM1I4MUllRSEjNyQiMCRSNlsnenZeKCEjNjckNyQkIjAmcDE2KSpIZUUhIzckIjBEO0lUSVZfKCEjNjckJCIwIjNSODFJZUUhIzckIjAkUjZbJ3p2XighIzY3JDckJCIwJnAxNikqSGVFISM3JCIwRDtJVElWXyghIzY3JCQiMFV6a0sqSGVFISM3JCIwUUBfS0MrYCghIzY3JDckJCIwOFA2YilIZUUhIzckIjBoL1AnNHhPdiEjNjckJCIwVXprSypIZUUhIzckIjBRQF9LQytgKCEjNjckNyQkIjA4UDZiKUhlRSEjNyQiMGgvUCc0eE92ISM2NyQkIjBCNXozKUhlRSEjNyQiMCI+S1opb0NhKCEjNjckNyQkIjBjJVxSdEhlRSEjNyQiMChIUjk6QFx2ISM2NyQkIjBCNXozKUhlRSEjNyQiMCI+S1opb0NhKCEjNjckNyQkIjBjJVxSdEhlRSEjNyQiMChIUjk6QFx2ISM2NyQkIi9ISykqb0hlRSEjNiQiMFxrQkA4XGIoISM2NyQ3JCQiMCIzeXdoSGVFISM3JCIwTCIzbD9saHYhIzY3JCQiL0hLKSpvSGVFISM2JCIwXGtCQDhcYighIzY3JDckJCIwIjN5d2hIZUUhIzckIjBMIjNsP2xodiEjNjckJCIwZFdxdiZIZUUhIzckIjBoMURVZHRjKCEjNjckNyQkIjAmKio0al1IZUUhIzckIjBwcGRoIzR1diEjNjckJCIwZFdxdiZIZUUhIzckIjBoMURVZHRjKCEjNjckNyQkIjAmKio0al1IZUUhIzckIjBwcGRoIzR1diEjNjckJCIwQltobSVIZUUhIzckIjBKLDZaLCl6diEjNjckNyQkIjA2LCMpKlJIZUUhIzckIjAwZWs7TGxlKCEjNjckJCIwQltobSVIZUUhIzckIjBKLDZaLCl6diEjNjckNyQkIjA2LCMpKlJIZUUhIzckIjAwZWs7TGxlKCEjNjckJCIwKUh2QU9IZUUhIzckIjAtJ1FuYEMjZighIzY3JDckJCIwXko6KUhIZUUhIzckIjBUWXJydCopZighIzY3JCQiMClIdkFPSGVFISM3JCIwLSdRbmBDI2YoISM2NyQ3JCQiMF5KOilISGVFISM3JCIwVFlycnQqKWYoISM2NyQkIjBydiNHRUhlRSEjNyQiMGs8bzUqby93ISM2NyQ3JCQiMC8zWCwjSGVFISM3JCIweE15RTk5aCghIzY3JCQiMHJ2I0dFSGVFISM3JCIwazxvNSpvL3chIzY3JDckJCIwLzNYLCNIZUUhIzckIjB4TXlFOTloKCEjNjckJCIwPTtHbyJIZUUhIzckIjBDdyEqb0tyaCghIzY3JDckJCIwaDVcNCJIZUUhIzckIjA5QiY9WyZRaSghIzY3JCQiMD07R28iSGVFISM3JCIwQ3chKm9LcmgoISM2NyQ3JCQiMGg1XDQiSGVFISM3JCIwOUImPVsmUWkoISM2NyQkIjBSb2F5IUhlRSEjNyQiMClvMTxoZEh3ISM2NyQ3JCQiMEZkVEEhSGVFISM3JCIvOkBwYEhPdyEjNTckJCIwUm9heSFIZUUhIzckIjApbzE8aGRIdyEjNjckNyQkIjBGZFRBIUhlRSEjNyQiLzpAcGBIT3chIzU3JCQiMCYzKnAkKipHZUUhIzckIjBUZCQpUT4/ayghIzY3JDckJCIwO01BUypHZUUhIzckIjAnKSoqKT5mdFt3ISM2NyQkIjAmMypwJCoqR2VFISM3JCIwVGQkKVE+P2soISM2NyQ3JCQiMDtNQVMqR2VFISM3JCIwJykqKik+ZnRbdyEjNjckJCIvKjNuOCpHZUUhIzYkIi82NjBEWWF3ISM1NyQ3JCQiMFpvJUcnKUdlRSEjNyQiMEEpZXFrPGh3ISM2NyQkIi8qM244KkdlRSEjNiQiLzY2MERZYXchIzU3JDckJCIwWm8lRycpR2VFISM3JCIwQSllcWs8aHchIzY3JCQiMEQxWVEpR2VFISM3JCIwQSFRbmEhcG0oISM2NyQ3JCQiMChRMi16R2VFISM3JCIwZXc3LTxPbighIzY3JCQiMEQxWVEpR2VFISM3JCIwQSFRbmEhcG0oISM2NyQ3JCQiMChRMi16R2VFISM3JCIwZXc3LTxPbighIzY3JCQiMD5hMG8oR2VFISM3JCIwWXhiRlskenchIzY3JDckJCIwJXpZQ3NHZUUhIzckIjAlXCc+ZGRnbyghIzY3JCQiMD5hMG8oR2VFISM3JCIwWXhiRlskenchIzY3JDckJCIwJXpZQ3NHZUUhIzckIjAlXCc+ZGRnbyghIzY3JCQiMDldWS0oR2VFISM3JCIvL1JINHoicCghIzU3JDckJCIwTnhcZidHZUUhIzckIi9MbEEiKVwpcCghIzU3JCQiMDldWS0oR2VFISM3JCIvL1JINHoicCghIzU3JDckJCIwTnhcZidHZUUhIzckIi9MbEEiKVwpcCghIzU3JCQiMDB5b1QnR2VFISM3JCIwY3EpR01CL3ghIzY3JDckJCIwJXAiRywnR2VFISM3JCIwbVRMblE0cighIzY3JCQiMDB5b1QnR2VFISM3JCIwY3EpR01CL3ghIzY3JDckJCIwJXAiRywnR2VFISM3JCIwbVRMblE0cighIzY3JCQiMCMzNmRlR2VFISM3JCIwWURXeHZtcighIzY3JDckJCIwJFJTemFHZUUhIzckIjAtSVNBekxzKCEjNjckJCIwIzM2ZGVHZUUhIzckIjBZRFd4dm1yKCEjNjckNyQkIjAkUlN6YUdlRSEjNyQiMC1JU0F6THMoISM2NyQkIjBgV2FNJkdlRSEjNyQiMC9aZCd6Nkh4ISM2NyQ3JCQiMEIlSCQqXEdlRSEjNyQiMFE9Wng+ZXQoISM2NyQkIjBgV2FNJkdlRSEjNyQiMC9aZCd6Nkh4ISM2NyQ3JCQiMEIlSCQqXEdlRSEjNyQiMFE9Wng+ZXQoISM2NyQkIjApRzQiKVtHZUUhIzckIjBbY2ArZzp1KCEjNjckNyQkIjB3V19iJUdlRSEjNyQiMHUxYUtnI1t4ISM2NyQkIjApRzQiKVtHZUUhIzckIjBbY2ArZzp1KCEjNjckNyQkIjB3V19iJUdlRSEjNyQiMHUxYUtnI1t4ISM2NyQkIjBBcmFZJUdlRSEjNyQiL2NyKSk9K2F4ISM1NyQ3JCQiMHZKXjslR2VFISM3JCIvXjR3M3FneCEjNTckJCIwQXJhWSVHZUUhIzckIi9jcikpPStheCEjNTckNyQkIjB2Sl47JUdlRSEjNyQiL140dzNxZ3ghIzU3JCQiMG50azQlR2VFISM3JCIwdHdEaVZrdyghIzY3JDckJCIwYCJSQVFHZUUhIzckIjBZJHlFOTl0eCEjNjckJCIwbnRrNCVHZUUhIzckIjB0d0RpVmt3KCEjNjckNyQkIjBgIlJBUUdlRSEjNyQiMFkkeUU5OXR4ISM2NyQkIjBSdmh4JEdlRSEjNyQiMDAnRytfKSl5eCEjNjckNyQkIjAwaHZfJEdlRSEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwUnZoeCRHZUUhIzckIjAwJ0crXykpeXghIzY3JDckJCIwMGh2XyRHZUUhIzckIjAjPVp4PmUmeSghIzY3JCQiMHpxQ10kR2VFISM3JCIwJlxmR21LInooISM2NyQ3JCQiMGwxJHpLR2VFISM3JCIwPWciR0QtKXooISM2NyQkIjB6cUNdJEdlRSEjNyQiMCZcZkdtSyJ6KCEjNjckNyQkIjBsMSR6S0dlRSEjNyQiMD1nIkdELSl6KCEjNjckJCIwXGxtRiRHZUUhIzckIjA0PEwhencueSEjNjckNyQkIjByTip5SUdlRSEjNyQiMGFbKXlJWTV5ISM2NyQkIjBcbG1GJEdlRSEjNyQiMDQ8TCF6dy55ISM2NyQ3JCQiMHJOKnlJR2VFISM3JCIwYVspeUlZNXkhIzY3JCQiMEglMyk0JEdlRSEjNyQiMFQ8bS00aSJ5ISM2NyQ3JCQiMCNSYUVIR2VFISM3JCIvcGBITyFII3khIzU3JCQiMEglMyk0JEdlRSEjNyQiMFQ8bS00aSJ5ISM2NyQ3JCQiMCNSYUVIR2VFISM3JCIvcGBITyFII3khIzU3JCQiMD5AbydIR2VFISM3JCIwZCU+KSoqXCdHeSEjNjckNyQkIjBUKW8/R0dlRSEjNyQiMEVELT1XYCR5ISM2NyQkIjA+QG8nSEdlRSEjNyQiMGQlPikqKlwnR3khIzY3JDckJCIwVClvP0dHZUUhIzckIjBFRC09V2AkeSEjNjckJCIwPl9GKUdHZUUhIzckIjA0WSU9MzRUeSEjNjckNyQkIi9rLGlGR2VFISM2JCIwaTg0dCV5WnkhIzY3JCQiMD5fRilHR2VFISM3JCIwNFklPTM0VHkhIzY3JDckJCIvayxpRkdlRSEjNiQiMGk4NHQleVp5ISM2NyQkIi9EJ2UlR0dlRSEjNiQiMFk+dVtKTiZ5ISM2NyQ3JCQiL1teXUZHZUUhIzYkIjApPmciR0QtJ3khIzY3JCQiL0QnZSVHR2VFISM2JCIwWT51W0pOJnkhIzY3JDckJCIvW15dRkdlRSEjNiQiMCk+ZyJHRC0neSEjNjckJCIwSlBoJkdHZUUhIzckIjA6aV4rc2YneSEjNjckNyQkIjBPUnB5I0dlRSEjNyQiME0hSEtlbXN5ISM2NyQkIjBKUGgmR0dlRSEjNyQiMDppXitzZid5ISM2NyQ3JCQiME9ScHkjR2VFISM3JCIwTSFIS2Vtc3khIzY3JCQiMGxJViJIR2VFISM3JCIwUmMjcEJUeXkhIzY3JDckJCIwSFIocEdHZUUhIzckIi8oeUhRMV4peSEjNTckJCIwbElWIkhHZUUhIzckIjBSYyNwQlR5eSEjNjckNyQkIjBIUihwR0dlRSEjNyQiLyh5SFExXil5ISM1NyQkIjA2SSM9SUdlRSEjNyQiMDkneidlXzMqeSEjNjckNyQkIjBfNSEqKkhHZUUhIzckIjAxbk8kcGEoKnkhIzY3JCQiMDZJIz1JR2VFISM3JCIwOSd6J2VfMyp5ISM2NyQ3JCQiMF81ISoqSEdlRSEjNyQiMDFuTyRwYSgqeSEjNjckJCIwdjQqcEpHZUUhIzckIi82OF5FSC56ISM1NyQ3JCQiLypmZzwkR2VFISM2JCIwVmJWWygpKjR6ISM2NyQkIjB2NCpwSkdlRSEjNyQiLzY4XkVILnohIzU3JDckJCIvKmZnPCRHZUUhIzYkIjBWYlZbKCkqNHohIzY3JCQiMFt2dE8kR2VFISM3JCIwOWInb0R0OnohIzY3JDckJCIwNCYqKSlSJEdlRSEjNyQiMHpWXS5HQyN6ISM2NyQkIjBbdnRPJEdlRSEjNyQiMDliJ29EdDp6ISM2NyQ3JCQiMDQmKikpUiRHZUUhIzckIjB6Vl0uR0MjeiEjNjckJCIwIz5mN09HZUUhIzckIjAkKW9JTHMiR3ohIzY3JDckJCIwVSNbcE9HZUUhIzckIjA6S2Rlb1skeiEjNjckJCIwIz5mN09HZUUhIzckIjAkKW9JTHMiR3ohIzY3JDckJCIwVSNbcE9HZUUhIzckIjA6S2Rlb1skeiEjNjckJCIwKWZjLlJHZUUhIzckIjAmSHddPmhTeiEjNjckNyQkIjBeSWUpUkdlRSEjNyQiMF4/azg0dCV6ISM2NyQkIjApZmMuUkdlRSEjNyQiMCZId10+aFN6ISM2NyQ3JCQiMF5JZSlSR2VFISM3JCIwXj9rODR0JXohIzY3JCQiMFdoQUMlR2VFISM3JCIwdFNhVF5JJnohIzY3JDckJCIwJ1shKlxWR2VFISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjBXaEFDJUdlRSEjNyQiMHRTYVReSSZ6ISM2NyQ3JCQiMCdbISpcVkdlRSEjNyQiMCgpM3JvXChmeiEjNjckJCIwRFh0aSVHZUUhIzckIjBadzh0IVxseiEjNjckNyQkIjA5MCdmWkdlRSEjNyQiMEIoelAtPnN6ISM2NyQkIjBEWHRpJUdlRSEjNyQiMFp3OHQhXGx6ISM2NyQ3JCQiMDkwJ2ZaR2VFISM3JCIwQih6UC0+c3ohIzY3JCQiMFtNIWVdR2VFISM3JCIwbSEzLCpIeih6ISM2NyQ3JCQiMCN6bzpfR2VFISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBbTSFlXUdlRSEjNyQiMG0hMywqSHooeiEjNjckNyQkIjAjem86X0dlRSEjNyQiMGYmWyl5SVkpeiEjNjckJCIwXFVkYCZHZUUhIzckIjBUQCsjKm8uKnohIzY3JDckJCIwVSp6PWRHZUUhIzckIjAmUjxSODIoKnohIzY3JCQiMFxVZGAmR2VFISM3JCIwVEArIypvLip6ISM2NyQ3JCQiMFUqej1kR2VFISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBfJ3pmZ0dlRSEjNyQiMChlTiF6MkcrKSEjNjckNyQkIjBFKlxuaUdlRSEjNyQiMEppKSopPV40ISkhIzY3JCQiMF8nemZnR2VFISM3JCIwKGVOIXoyRyspISM2NyQ3JCQiMEUqXG5pR2VFISM3JCIwSmkpKik9XjQhKSEjNjckJCIwXzglSG1HZUUhIzckIjAqW2Y5bEM6ISkhIzY3JDckJCIwWVdEJ29HZUUhIzckIjBuXTBXXz4tKSEjNjckJCIwXzglSG1HZUUhIzckIjAqW2Y5bEM6ISkhIzY3JDckJCIwWVdEJ29HZUUhIzckIjBuXTBXXz4tKSEjNjckJCIwJylbYEMoR2VFISM3JCIwTzsuNCZvRiEpISM2NyQ3JCQiMFFgSl0oR2VFISM3JCIwLlI3KkhSTSEpISM2NyQkIjAnKVtgQyhHZUUhIzckIjBPOy40Jm9GISkhIzY3JDckJCIwUWBKXShHZUUhIzckIjAuUjcqSFJNISkhIzY3JCQiMGt3dSF6R2VFISM3JCIwMEN6XkIsLykhIzY3JDckJCIwc1MyPilHZUUhIzckIjBSRj5hTG8vKSEjNjckJCIwa3d1IXpHZUUhIzckIjAwQ3peQiwvKSEjNjckNyQkIjBzUzI+KUdlRSEjNyQiMFJGPmFMby8pISM2NyQkIi9aKmVoKUdlRSEjNiQiMD0vcnpoRDApISM2NyQ3JCQiMHBtUSMqKUdlRSEjNyQiMHY6RTR1I2YhKSEjNjckJCIvWiplaClHZUUhIzYkIjA9L3J6aEQwKSEjNjckNyQkIjBwbVEjKilHZUUhIzckIjB2OkU0dSNmISkhIzY3JCQiMD13L1AqR2VFISM3JCIwYGojRyoqKlwxKSEjNjckNyQkIjB1WFJxKkdlRSEjNyQiMDYvTGs5PDIpISM2NyQkIjA9dy9QKkdlRSEjNyQiMGBqI0cqKipcMSkhIzY3JDckJCIwdVhScSpHZUUhIzckIjA2L0xrOTwyKSEjNjckJCIwc2oxPCFIZUUhIzckIjBHKj04elZ4ISkhIzY3JDckJCIvQCkpRzBIZUUhIzYkIjBaIypSPmJUMykhIzY3JCQiMHNqMTwhSGVFISM3JCIwRyo9OHpWeCEpISM2NyQ3JCQiL0ApKUcwSGVFISM2JCIwWiMqUj5iVDMpISM2NyQkIi8wTDs1SGVFISM2JCIwLSlHX2QoKSozKSEjNjckNyQkIjA4IjQrOUhlRSEjNyQiMCQzb1dkZic0KSEjNjckJCIvMEw7NUhlRSEjNiQiMC0pR19kKCkqMykhIzY3JDckJCIwOCI0KzlIZUUhIzckIjAkM29XZGYnNCkhIzY3JCQiMHkpKSkzPkhlRSEjNyQiMFZKNVc4QjUpISM2NyQ3JCQiMHNYdUojSGVFISM3JCIwPnBgSE8hNCIpISM2NyQkIjB5KSkpMz5IZUUhIzckIjBWSjVXOEI1KSEjNjckNyQkIjBzWHVKI0hlRSEjNyQiMD5wYEhPITQiKSEjNjckJCIwM1ZpJUdIZUUhIzckIi8nUWgpNHY5IikhIzU3JDckJCIwQ0EnektIZUUhIzckIjBiZGclb1pAIikhIzY3JCQiMDNWaSVHSGVFISM3JCIvJ1FoKTR2OSIpISM1NyQ3JCQiMENBJ3pLSGVFISM3JCIwYmRnJW9aQCIpISM2NyQkIjAtIXBIUUhlRSEjNyQiMCU+WCRRKT1GIikhIzY3JDckJCIwKik9ekclSGVFISM3JCIwImZ1J1I8UjgpISM2NyQkIjAtIXBIUUhlRSEjNyQiMCU+WCRRKT1GIikhIzY3JDckJCIwKik9ekclSGVFISM3JCIwImZ1J1I8UjgpISM2NyQkIi4xeiZbSGVFISM1JCIwXjpzakQnUiIpISM2NyQ3JCQiMGkmeVRgSGVFISM3JCIwRk11JXpOWSIpISM2NyQkIi4xeiZbSGVFISM1JCIwXjpzakQnUiIpISM2NyQ3JCQiMGkmeVRgSGVFISM3JCIwRk11JXpOWSIpISM2NyQkIi9USUtmSGVFISM2JCIwTikqR3VpPzopISM2NyQ3JCQiMHBALlcnSGVFISM3JCIwakEiKVwpemUiKSEjNjckJCIvVElLZkhlRSEjNiQiME4pKkd1aT86KSEjNjckNyQkIjBwQC5XJ0hlRSEjNyQiMGpBIilcKXplIikhIzY3JCQiMC5GODAoSGVFISM3JCIwI1FcMCgqXGsiKSEjNjckNyQkIjAuZl1lKEhlRSEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMC5GODAoSGVFISM3JCIwI1FcMCgqXGsiKSEjNjckNyQkIjAuZl1lKEhlRSEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMDEwbEApSGVFISM3JCIwQCY0P2wkcDwpISM2NyQ3JCQiMF84X3gpSGVFISM3JCIwTypcKmZ6Tz0pISM2NyQkIjAxMGxAKUhlRSEjNyQiMEAmND9sJHA8KSEjNjckNyQkIjBfOF94KUhlRSEjNyQiME8qXCpmek89KSEjNjckJCIvRDBGJSpIZUUhIzYkIjB4QCMqPXQkKj0pISM2NyQ3JCQiMCNIeDUrSWVFISM3JCIwcig9XSw3Jz4pISM2NyQkIi9EMEYlKkhlRSEjNiQiMHhAIyo9dCQqPSkhIzY3JDckJCIwI0h4NStJZUUhIzckIjByKD1dLDcnPikhIzY3JCQiMCVRSSNvKyRlRSEjNyQiMFoyXXI0PT8pISM2NyQ3JCQiME50NUgsJGVFISM3JCIwM3czcWcmMyMpISM2NyQkIjAlUUkjbyskZUUhIzckIjBaMl1yND0/KSEjNjckNyQkIjBOdDVILCRlRSEjNyQiMDN3M3FnJjMjKSEjNjckJCIwRVxOKT5JZUUhIzckIjBMOkw0WVVAKSEjNjckNyQkIjBNS21oLSRlRSEjNyQiMFdrOkQsNUEpISM2NyQkIjBFXE4pPkllRSEjNyQiMEw6TDRZVUApISM2NyQ3JCQiME1LbWgtJGVFISM3JCIwV2s6RCw1QSkhIzY3JCQiMFFaIUdMSWVFISM3JCIwYU5ITCNvRSMpISM2NyQ3JCQiMEFLcSlSSWVFISM3JCIvR0QtPVdMIykhIzU3JCQiMFFaIUdMSWVFISM3JCIwYU5ITCNvRSMpISM2NyQ3JCQiMEFLcSlSSWVFISM3JCIvR0QtPVdMIykhIzU3JCQiMCNlRz5aSWVFISM3JCIwPCZvQSU9IlIjKSEjNjckNyQkIjBgU01TMCRlRSEjNyQiMDtUSE4jKWVDKSEjNjckJCIwI2VHPlpJZUUhIzckIjA8Jm9BJT0iUiMpISM2NyQ3JCQiMGBTTVMwJGVFISM3JCIwO1RITiMpZUMpISM2NyQkIi9sPGJoSWVFISM2JCIwYWYjcFZiXiMpISM2NyQ3JCQiMC9wUCdvSWVFISM3JCIwX0hPIUhLZSMpISM2NyQkIi9sPGJoSWVFISM2JCIwYWYjcFZiXiMpISM2NyQ3JCQiMC9wUCdvSWVFISM3JCIwX0hPIUhLZSMpISM2NyQkIjAyS1xqMiRlRSEjNyQiMEUkPXYsKlJFKSEjNjckNyQkIjAqPnlvJDMkZUUhIzckIjApeUphTXdxIykhIzY3JCQiMDJLXGoyJGVFISM3JCIwRSQ9diwqUkUpISM2NyQ3JCQiMCo+eW8kMyRlRSEjNyQiMCl5SmFNd3EjKSEjNjckJCIwWWoqZiI0JGVFISM3JCIwRUtmJGVVdyMpISM2NyQ3JCQiMEo8Ij4qNCRlRSEjNyQiMEMxXSsvS0cpISM2NyQkIjBZaipmIjQkZUUhIzckIjBFS2YkZVV3IykhIzY3JDckJCIwSjwiPio0JGVFISM3JCIwQzFdKy9LRykhIzY3JCQiMC1kLXQ1JGVFISM3JCIwS106TmgpKUcpISM2NyQ3JCQiMCNIdzk6SmVFISM3JCIwaCVwYlhrJkgpISM2NyQkIjAtZC10NSRlRSEjNyQiMEtdOk5oKSlHKSEjNjckNyQkIjAjSHc5OkplRSEjNyQiMGglcGJYayZIKSEjNjckJCIwO19eTTckZUUhIzckIjBiYlRzJ0gsJCkhIzY3JDckJCIwKClmXTo4JGVFISM3JCIwKEhRMV4zMyQpISM2NyQkIjA7X15NNyRlRSEjNyQiMGJiVHMnSCwkKSEjNjckNyQkIjAoKWZdOjgkZUUhIzckIjAoSFExXjMzJCkhIzY3JCQiMEVQWSs5JGVFISM3JCIwQSZ5YD50OCQpISM2NyQ3JCQiMCw/I1JbSmVFISM3JCIwTHJxbEQwSykhIzY3JCQiMEVQWSs5JGVFISM3JCIwQSZ5YD50OCQpISM2NyQ3JCQiMCw/I1JbSmVFISM3JCIwTHJxbEQwSykhIzY3JCQiMEtvJjNkSmVFISM3JCIvNiE0L25oSykhIzU3JDckJCIwPnh5YzskZUUhIzckIjBwZng/bUhMKSEjNjckJCIwS28mM2RKZUUhIzckIi82ITQvbmhLKSEjNTckNyQkIjA+eHljOyRlRSEjNyQiMHBmeD9tSEwpISM2NyQkIjBDJkdjdUplRSEjNyQiMHM+dyk+Z1EkKSEjNjckNyQkIjBRSj5NPSRlRSEjNyQiMDBbJWVuU1gkKSEjNjckJCIwQyZHY3VKZUUhIzckIjBzPncpPmdRJCkhIzY3JDckJCIwUUo+TT0kZUUhIzckIjAwWyVlblNYJCkhIzY3JCQiMERMJFwjPiRlRSEjNyQiMFInKSopeU81TikhIzY3JDckJCIweDkpZixLZUUhIzckIjBUTyI0dCV5TikhIzY3JCQiMERMJFwjPiRlRSEjNyQiMFInKSopeU81TikhIzY3JDckJCIweDkpZixLZUUhIzckIjBUTyI0dCV5TikhIzY3JCQiL215JzNAJGVFISM2JCIvJnB6V3JNTykhIzU3JDckJCIwN2ZALUEkZUUhIzckIjB4QylmeUdxJCkhIzY3JCQiL215JzNAJGVFISM2JCIvJnB6V3JNTykhIzU3JDckJCIwN2ZALUEkZUUhIzckIjB4QylmeUdxJCkhIzY3JCQiME0oKXonSEtlRSEjNyQiMHN5bSdmIWZQKSEjNjckNyQkIi8iKjNIUktlRSEjNiQiMDg4MFRHRlEpISM2NyQkIjBNKCl6J0hLZUUhIzckIjBzeW0nZiFmUCkhIzY3JDckJCIvIiozSFJLZUUhIzYkIjA4ODBUR0ZRKSEjNjckJCIvTXEkKltLZUUhIzYkIjByXkVNUyQpUSkhIzY3JDckJCIwSDgpemVLZUUhIzckIi86P2gqb15SKSEjNTckJCIvTXEkKltLZUUhIzYkIjByXkVNUyQpUSkhIzY3JDckJCIwSDgpemVLZUUhIzckIi86P2gqb15SKSEjNTckJCIwJz45am9LZUUhIzckIjBqSSV5WHgrJSkhIzY3JDckJCIwNz9WKHlLZUUhIzckIjAnKSopPV40d1MpISM2NyQkIjAnPjlqb0tlRSEjNyQiMGpJJXlYeCslKSEjNjckNyQkIjA3P1YoeUtlRSEjNyQiMCcpKik9XjR3UykhIzY3JCQiMCkqKkd3KUckZUUhIzckIjBFZFNuM0tUKSEjNjckNyQkIjA2IlE4KkgkZUUhIzckIjBBeUQxXStVKSEjNjckJCIwKSoqR3cpRyRlRSEjNyQiMEVkU24zS1QpISM2NyQ3JCQiMDYiUTgqSCRlRSEjNyQiMEF5RDFdK1UpISM2NyQkIjBYPFIkNExlRSEjNyQiL0YxRkVrRCUpISM1NyQ3JCQiL28pcCo+TGVFISM2JCIwZW1LaCFcSyUpISM2NyQkIjBYPFIkNExlRSEjNyQiL0YxRkVrRCUpISM1NyQ3JCQiL28pcCo+TGVFISM2JCIwZW1LaCFcSyUpISM2NyQkIjBVOGcuTCRlRSEjNyQiMDAjW1BrMlElKSEjNjckNyQkIi8pZU43TSRlRSEjNiQiMCVcJlI7SlxXKSEjNjckJCIwVThnLkwkZUUhIzckIjAwI1tQazJRJSkhIzY3JDckJCIvKWVON00kZUUhIzYkIjAlXCZSO0pcVykhIzY3JCQiLk87PU4kZUUhIzUkIjBVTiQzLF5dJSkhIzY3JDckJCIwbCJIJkhPJGVFISM3JCIvTGs5PFBkJSkhIzU3JCQiLk87PU4kZUUhIzUkIjBVTiQzLF5dJSkhIzY3JDckJCIwbCJIJkhPJGVFISM3JCIvTGs5PFBkJSkhIzU3JCQiMCdSMXJ0TGVFISM3JCIwKipHKFFPJUhZKSEjNjckNyQkIjAiUTY1JlEkZUUhIzckIjBtSmBFNylwJSkhIzY3JCQiMCdSMXJ0TGVFISM3JCIwKipHKFFPJUhZKSEjNjckNyQkIjAiUTY1JlEkZUUhIzckIjBtSmBFNylwJSkhIzY3JCQiLyRSVGdSJGVFISM2JCIwTHAiSHFQdiUpISM2NyQ3JCQiMFRfJ28yTWVFISM3JCIwLj9nIkdEI1spISM2NyQkIi8kUlRnUiRlRSEjNiQiMExwIkhxUHYlKSEjNjckNyQkIjBUXydvMk1lRSEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwNlwzKT1NZUUhIzckIjAkeXB6LSJ5WykhIzY3JDckJCIuJyozMlYkZUUhIzUkIjBSM25PJHAlXCkhIzY3JCQiMDZcMyk9TWVFISM3JCIwJHlwei0ieVspISM2NyQ3JCQiLicqMzJWJGVFISM1JCIwUjNuTyRwJVwpISM2NyQkIi8wPSxVTWVFISM2JCIwJ2VOIVJWLV0pISM2NyQ3JCQiMFVAd1RYJGVFISM3JCIwdidSPFI4MiYpISM2NyQkIi8wPSxVTWVFISM2JCIwJ2VOIVJWLV0pISM2NyQ3JCQiMFVAd1RYJGVFISM3JCIwdidSPFI4MiYpISM2NyQkIjB3M2ZjWSRlRSEjNyQiMFtkJ2VqbjcmKSEjNjckNyQkIjBaVHMheU1lRSEjNyQiMDYmM29XZD4mKSEjNjckJCIwdzNmY1kkZUUhIzckIjBbZCdlam43JikhIzY3JDckJCIwWlRzIXlNZUUhIzckIjA2JjNvV2Q+JikhIzY3JCQiMDI4RygqWyRlRSEjNyQiMGtCPD40Xl8pISM2NyQ3JCQiMCkpKm9TLU5lRSEjNyQiMFp0KD1dLEsmKSEjNjckJCIwMjhHKCpbJGVFISM3JCIwa0I8PjReXykhIzY3JDckJCIwKSkqb1MtTmVFISM3JCIwWnQoPV0sSyYpISM2NyQkIjAuIzRDOU5lRSEjNyQiMGkvRCk9YVAmKSEjNjckNyQkIjBSNXFyXyRlRSEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwLiM0QzlOZUUhIzckIjBpL0QpPWFQJikhIzY3JDckJCIwUjVxcl8kZUUhIzckIjAkPVlwYlhXJikhIzY3JCQiMCxhIj1STmVFISM3JCIwJVI1T1coKlwmKSEjNjckNyQkIjB0ISlwQmIkZUUhIzckIjA+XSw3JypvYikhIzY3JCQiMCxhIj1STmVFISM3JCIwJVI1T1coKlwmKSEjNjckNyQkIjB0ISlwQmIkZUUhIzckIjA+XSw3JypvYikhIzY3JCQiMDx2ZFhjJGVFISM3JCIwJUcuXW9TaSYpISM2NyQ3JCQiMC0jUSx5TmVFISM3JCIwYlEzbk8kcCYpISM2NyQkIjA8dmRYYyRlRSEjNyQiMCVHLl1vU2kmKSEjNjckNyQkIjAtI1EseU5lRSEjNyQiMGJRM25PJHAmKSEjNjckJCIwbDFyLmYkZUUhIzckIjBzMVE3UltkKSEjNjckNyQkIjBbISp6U2ckZUUhIzckIjAjcF9Ac3giZSkhIzY3JCQiMGwxci5mJGVFISM3JCIwczFRN1JbZCkhIzY3JDckJCIwWyEqelNnJGVFISM3JCIwI3BfQHN4ImUpISM2NyQkIjBBIz1oO09lRSEjNyQiMHNCMEVyc2UpISM2NyQ3JCQiMHQ7I2VJT2VFISM3JCIwRzpBeDxVZikhIzY3JCQiMEEjPWg7T2VFISM3JCIwc0IwRXJzZSkhIzY3JDckJCIwdDsjZUlPZUUhIzckIjBHOkF4PFVmKSEjNjckJCIwRmEiR1ZPZUUhIzckIjBEJnBmS3EqZikhIzY3JDckJCIvS1VeZE9lRSEjNiQiMGsuSEtlbWcpISM2NyQkIjBGYSJHVk9lRSEjNyQiMEQmcGZLcSpmKSEjNjckNyQkIi9LVV5kT2VFISM2JCIway5IS2VtZykhIzY3JCQiLyZRJ1FxT2VFISM2JCIwNFokPl44NycpISM2NyQ3JCQiMCMzVihbbyRlRSEjNyQiLiNmdCkpND4nKSEiKjckJCIvJlEnUXFPZUUhIzYkIjA0WiQ+Xjg3JykhIzY3JDckJCIwIzNWKFtvJGVFISM3JCIuI2Z0KSk0PicpISIqNyQkIjAnPj8ienAkZUUhIzckIi9SMldvY0MnKSEjNTckNyQkIjBXKVJtN1BlRSEjNyQiME8hR0MlUjpqKSEjNjckJCIwJz4/InpwJGVFISM3JCIvUjJXb2NDJykhIzU3JDckJCIwVylSbTdQZUUhIzckIjBPIUdDJVI6aikhIzY3JCQiMFlfc2VzJGVFISM3JCIwa2gkSCUpKnBqKSEjNjckNyQkIjAwVCopM3UkZUUhIzckIjBzb1woKnpSaykhIzY3JCQiMFlfc2VzJGVFISM3JCIwa2gkSCUpKnBqKSEjNjckNyQkIjAwVCopM3UkZUUhIzckIjBzb1woKnpSaykhIzY3JCQiMENiaFV2JGVFISM3JCIwZVhzKClIJVwnKSEjNjckNyQkIjBbRFcmcFBlRSEjNyQiMDNkY18/a2wpISM2NyQkIjBDYmhVdiRlRSEjNyQiMGVYcygpSCVcJykhIzY3JDckJCIwW0RXJnBQZUUhIzckIjAzZGNfP2tsKSEjNjckJCIvPl8zJHkkZUUhIzYkIjBza2Q9aD1tKSEjNjckNyQkIjBpa0UnKXokZUUhIzckIjBYWGoyaClvJykhIzY3JCQiLz5fMyR5JGVFISM2JCIwc2tkPWg9bSkhIzY3JDckJCIwaWtFJyl6JGVFISM3JCIwWFhqMmgpbycpISM2NyQkIi8sI0hCIlFlRSEjNiQiMHU2JmZCSHUnKSEjNjckNyQkIi9jI1EiR1FlRSEjNiQiMCJRLkY7SSJvKSEjNjckJCIvLCNIQiJRZUUhIzYkIjB1NiZmQkh1JykhIzY3JDckJCIvYyNRIkdRZUUhIzYkIjAiUS5GO0kibykhIzY3JCQiMF5RLD8lUWVFISM3JCIwJnkmZlJCbm8pISM2NyQ3JCQiMGIpNDJlUWVFISM3JCIwPEF4PFVQcCkhIzY3JCQiMF5RLD8lUWVFISM3JCIwJnkmZlJCbm8pISM2NyQ3JCQiMGIpNDJlUWVFISM3JCIwPEF4PFVQcCkhIzY3JCQiMGQkKSo0c1FlRSEjNyQiMHBCZEhhIipwKSEjNjckNyQkIjA5JCpRJSkpUWVFISM3JCIwYDUlR0Y9MSgpISM2NyQkIjBkJCkqNHNRZUUhIzckIjBwQmRIYSIqcCkhIzY3JDckJCIwOSQqUSUpKVFlRSEjNyQiMGA1JUdGPTEoKSEjNjckJCIwKCk0P0UhUmVFISM3JCIwUlAtMSZlNigpISM2NyQ3JCQiL2UnSCM+UmVFISM2JCIwKikpNHpLaT0oKSEjNjckJCIwKCk0P0UhUmVFISM3JCIwUlAtMSZlNigpISM2NyQ3JCQiL2UnSCM+UmVFISM2JCIwKikpNHpLaT0oKSEjNjckJCIwQFV1TiRSZUUhIzckIjB1cmJvOlNzKSEjNjckNyQkIjAuS1IvJlJlRSEjNyQiMEQoeUhRMUooKSEjNjckJCIwQFV1TiRSZUUhIzckIjB1cmJvOlNzKSEjNjckNyQkIjAuS1IvJlJlRSEjNyQiMEQoeUhRMUooKSEjNjckJCIwKVIvJVwnUmVFISM3JCIwRikqKXloV08oKSEjNjckNyQkIjBVeiYzIylSZUUhIzckIjBodi9RL051KSEjNjckJCIwKVIvJVwnUmVFISM3JCIwRikqKXloV08oKSEjNjckNyQkIjBVeiYzIylSZUUhIzckIjBodi9RL051KSEjNjckJCIwLEpbbipSZUUhIzckIjAlcGFJbCgpWygpISM2NyQ3JCQiMC4lNDo5U2VFISM3JCIwKFI7SlwlZnYpISM2NyQkIjAsSltuKlJlRSEjNyQiMCVwYUlsKClbKCkhIzY3JDckJCIwLiU0OjlTZUUhIzckIjAoUjtKXCVmdikhIzY3JCQiMEtcaCpHU2VFISM3JCIwLE1BdjE4dykhIzY3JDckJCIwY19RbS8lZUUhIzckIjBNXz1bJlFvKCkhIzY3JCQiMEtcaCpHU2VFISM3JCIwLE1BdjE4dykhIzY3JDckJCIwY19RbS8lZUUhIzckIjBNXz1bJlFvKCkhIzY3JCQiMD05LTsxJWVFISM3JCIwTGNvJG90dCgpISM2NyQ3JCQiMHVeWSZ6U2VFISM3JCIvMmFLZyMzeSkhIzU3JCQiMD05LTsxJWVFISM3JCIwTGNvJG90dCgpISM2NyQ3JCQiMHVeWSZ6U2VFISM3JCIvMmFLZyMzeSkhIzU3JCQiMEw7b1k0JWVFISM3JCIvXDMmeW1oeSkhIzU3JDckJCIvMCEqKUc2JWVFISM2JCIwMUhLZW1LeikhIzY3JCQiMEw7b1k0JWVFISM3JCIvXDMmeW1oeSkhIzU3JDckJCIvMCEqKUc2JWVFISM2JCIwMUhLZW1LeikhIzY3JCQiL19gOkdUZUUhIzYkIjBCbyMpZidmKXopISM2NyQ3JCQiMHZbUG05JWVFISM3JCIwVTxSODJkISkpISM2NyQkIi9fYDpHVGVFISM2JCIwQm8jKWYnZil6KSEjNjckNyQkIjB2W1BtOSVlRSEjNyQiMFU8UjgyZCEpKSEjNjckJCIwPWJmPzslZUUhIzckIjApKlF4RkU1IikpISM2NyQ3JCQiMCVcLSMzPSVlRSEjNyQiMHkwWW9aIj0pKSEjNjckJCIwPWJmPzslZUUhIzckIjApKlF4RkU1IikpISM2NyQ3JCQiMCVcLSMzPSVlRSEjNyQiMHkwWW9aIj0pKSEjNjckJCIwcHMlUSc+JWVFISM3JCIwL0VBI2VYQikpISM2NyQ3JCQiMCdRcFQ6VWVFISM3JCIwOSVITiMpZUkpKSEjNjckJCIwcHMlUSc+JWVFISM3JCIwL0VBI2VYQikpISM2NyQ3JCQiMCdRcFQ6VWVFISM3JCIwOSVITiMpZUkpKSEjNjckJCIwdnNHNkIlZUUhIzckIjB1PUNCJillJCkpISM2NyQ3JCQiME9fTC9EJWVFISM3JCIvRClmeUdJJSkpISM1NyQkIjB2c0c2QiVlRSEjNyQiMHU9Q0ImKWUkKSkhIzY3JDckJCIwT19ML0QlZUUhIzckIi9EKWZ5R0klKSkhIzU3JCQiMFBWIkhtVWVFISM3JCIwXGIkM1hKWykpISM2NyQ3JCQiMGsxeWVHJWVFISM3JCIwKDNuTyRwYSYpKSEjNjckJCIwUFYiSG1VZUUhIzckIjBcYiQzWEpbKSkhIzY3JDckJCIwazF5ZUclZUUhIzckIjAoM25PJHBhJikpISM2NyQkIi8jKjMpPUklZUUhIzYkIjBGY3VrVjInKSkhIzY3JDckJCIwaThNPEslZUUhIzckIjBCZnQpKTR6JykpISM2NyQkIi8jKjMpPUklZUUhIzYkIjBGY3VrVjInKSkhIzY3JDckJCIwaThNPEslZUUhIzckIjBCZnQpKTR6JykpISM2NyQkIjBEbSEpeUwlZUUhIzckIi9DKlxsc0ooKSkhIzU3JDckJCIwSHk0IWVWZUUhIzckIjBmWiFRL04hKSkpISM2NyQkIjBEbSEpeUwlZUUhIzckIi9DKlxsc0ooKSkhIzU3JDckJCIwSHk0IWVWZUUhIzckIjBmWiFRL04hKSkpISM2NyQkIi8oeiNIdVZlRSEjNiQiMC0xLmAsYykpKSEjNjckNyQkIjBiNzJaUiVlRSEjNyQiMCZmdCkpNHojKikpISM2NyQkIi8oeiNIdVZlRSEjNiQiMC0xLmAsYykpKSEjNjckNyQkIjBiNzJaUiVlRSEjNyQiMCZmdCkpNHojKikpISM2NyQkIjAtUko2VCVlRSEjNyQiMHR4KW8tLikqKSkhIzY3JDckJCIwdG06PVYlZUUhIzckIjBKQyVSOkIwKikhIzY3JCQiMC1SSjZUJWVFISM3JCIwdHgpby0uKSopKSEjNjckNyQkIjB0bTo9ViVlRSEjNyQiMEpDJVI6QjAqKSEjNjckJCIwI0cqeiRbV2VFISM3JCIvRSt3KWUvIiopISM1NyQ3JCQiMGVcViRwV2VFISM3JCIwbjcsNHN3IiopISM2NyQkIjAjRyp6JFtXZUUhIzckIi9FK3cpZS8iKikhIzU3JDckJCIwZVxWJHBXZUUhIzckIjBuNyw0c3ciKikhIzY3JCQiL1YwLydbJWVFISM2JCIwMSgqNE4oKUcjKikhIzY3JDckJCIwdGMlRzJYZUUhIzckIjAvLDNrNywkKikhIzY3JCQiL1YwLydbJWVFISM2JCIwMSgqNE4oKUcjKikhIzY3JDckJCIwdGMlRzJYZUUhIzckIjAuLDNrNywkKikhIzY3JCQiMFgzPlRfJWVFISM3JCIwTiYpPnA6YCQqKSEjNjckNyQkIjBKdVdjYSVlRSEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMFgzPlRfJWVFISM3JCIwTiYpPnA6YCQqKSEjNjckNyQkIjBKdVdjYSVlRSEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMFRWOkVjJWVFISM3JCIwWzAhKipRdVoqKSEjNjckNyQkIjB6IlJVJWUlZUUhIzckIjB3eEB1JCpcJiopISM2NyQkIjBUVjpFYyVlRSEjNyQiMFswISoqUXVaKikhIzY3JDckJCIweiJSVSVlJWVFISM3JCIwd3hAdSQqXCYqKSEjNjckJCIveE5fLFllRSEjNiQiMDInKVIoPjxnKikhIzY3JDckJCIvMnlnQlllRSEjNiQiMDdtR0hNdScqKSEjNjckJCIveE5fLFllRSEjNiQiMDInKVIoPjxnKikhIzY3JDckJCIvMnlnQlllRSEjNiQiMDdtR0hNdScqKSEjNjckJCIvUTUlM2slZUUhIzYkIjAlM3M8KipmcyopISM2NyQ3JCQiMHRbNUttJWVFISM3JCIwW2FOJVsoKXoqKSEjNjckJCIvUTUlM2slZUUhIzYkIjAlM3M8KipmcyopISM2NyQ3JCQiMHRbNUttJWVFISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwIikzcTBvJWVFISM3JCIwXiJbSHgtJikqKSEjNjckNyQkIjAmKilmQS5aZUUhIzckIjAlR0MlUjpCKiopISM2NyQkIjAiKTNxMG8lZUUhIzckIjBeIltIeC0mKSopISM2NyQ3JCQiMCYqKWZBLlplRSEjNyQiMCVHQyVSOkIqKikhIzY3JCQiMGVdOzJzJWVFISM3JCIwSjp1U2J1KiopISM2NyQ3JCQiMEo1Z091JWVFISM3JCIvNyRcJWZ2LyEqISM1NyQkIjBlXTsycyVlRSEjNyQiMEo6dVNidSoqKSEjNjckNyQkIjBKNWdPdSVlRSEjNyQiLzckXCVmdi8hKiEjNTckJCIwdEx1N3clZUUhIzckIjBDSk0mSCkpNCEqISM2NyQ3JCQiMCdbJilcJXklZUUhIzckIjBjPmNcJz48ISohIzY3JCQiMHRMdTd3JWVFISM3JCIwQ0pNJkgpKTQhKiEjNjckNyQkIjAnWyYpXCV5JWVFISM3JCIwYz5jXCc+PCEqISM2NyQkIjBFPE5BIVtlRSEjNyQiMCdmQXEuSkEhKiEjNjckNyQkIi8iZVxkI1tlRSEjNiQiMCN6SVlxakghKiEjNjckJCIwRTxOQSFbZUUhIzckIjAnZkFxLkpBISohIzY3JDckJCIvImVcZCNbZUUhIzYkIjAjeklZcWpIISohIzY3JCQiL2NJaFZbZUUhIzYkIjBCJ0hgd3RNISohIzY3JDckJCIwV2Q1dSdbZUUhIzckIjBIJypwZng/LyohIzY3JCQiL2NJaFZbZUUhIzYkIjBCJ0hgd3RNISohIzY3JDckJCIwV2Q1dSdbZUUhIzckIjBIJypwZng/LyohIzY3JCQiMFByJFImKVtlRSEjNyQiMCUpPXMhWztaISohIzY3JDckJCIwKHpSWzRcZUUhIzckIjBsJW9aIj1YMCohIzY3JCQiMFByJFImKVtlRSEjNyQiMCUpPXMhWztaISohIzY3JDckJCIwKHpSWzRcZUUhIzckIjBsJW9aIj1YMCohIzY3JCQiMFpUJmVGXGVFISM3JCIwVlUkSD1mZiEqISM2NyQ3JCQiMC51cD4mXGVFISM3JCIwLHQkKXBlcDEqISM2NyQkIjBaVCZlRlxlRSEjNyQiMFZVJEg9ZmYhKiEjNjckNyQkIjAudXA+JlxlRSEjNyQiMCx0JClwZXAxKiEjNjckJCIuNCk9cVxlRSEjNSQiMDcqbz4oPT8yKiEjNjckNyQkIjBmUWZbKlxlRSEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiLjQpPXFcZUUhIzUkIjA3Km8+KD0/MiohIzY3JDckJCIwZlFmWypcZUUhIzckIjBQaCFcIypSeiEqISM2NyQkIjAtKyo+OF1lRSEjNyQiMENQInphVyUzKiEjNjckNyQkIjBVYmUiUV1lRSEjNyQiMHRcKCp6Uj00KiEjNjckJCIwLSsqPjhdZUUhIzckIjBDUCJ6YVclMyohIzY3JDckJCIwVWJlIlFdZUUhIzckIjB0XCgqelI9NCohIzY3JCQiMClmQWhjXWVFISM3JCIwKVJkNEAobzQqISM2NyQ3JCQiMCk+KXA9MyZlRSEjNyQiMDRRL04hRy8iKiEjNjckJCIwKWZBaGNdZUUhIzckIjApUmQ0QChvNCohIzY3JDckJCIwKT4pcD0zJmVFISM3JCIwNFEvTiFHLyIqISM2NyQkIi8pPk8vNSZlRSEjNiQiMGZHJDMnKUg0IiohIzY3JDckJCIwIm9ZKWY3JmVFISM3JCIwWEU2ITRzOyIqISM2NyQkIi8pPk8vNSZlRSEjNiQiMGZHJDMnKUg0IiohIzY3JDckJCIwIm9ZKWY3JmVFISM3JCIwWEU2ITRzOyIqISM2NyQkIjA0SGlZOSZlRSEjNyQiMEVNInlcc0AiKiEjNjckNyQkIi8qKkhdcV5lRSEjNiQiMCJbIj1YaCJIIiohIzY3JCQiMDRIaVk5JmVFISM3JCIwRU0ieVxzQCIqISM2NyQ3JCQiLyoqSF1xXmVFISM2JCIwIlsiPVhoIkgiKiEjNjckJCIwMTUnSCo9JmVFISM3JCIwXzJzQF5UOCohIzY3JDckJCIwZCgpUWFAJmVFISM3JCIwPS5EKy07OSohIzY3JCQiMDE1J0gqPSZlRSEjNyQiMF8yc0BeVDgqISM2NyQ3JCQiMGQoKVFhQCZlRSEjNyQiMD0uRCstOzkqISM2NyQkIjB6ak1WQiZlRSEjNyQiMCJvXUV0ZFkiKiEjNjckNyQkIjAiekJ4Z19lRSEjNyQiMGEiPmBEL2EiKiEjNjckJCIwempNVkImZUUhIzckIjAib11FdGRZIiohIzY3JDckJCIwInpCeGdfZUUhIzckIjBhIj5gRC9hIiohIzY3JCQiMFwtdih6X2VFISM3JCIwJlwmcEkuIWYiKiEjNjckNyQkIjB3NDRsSSZlRSEjNyQiLyp6UTUkW20iKiEjNTckJCIwXC12KHpfZUUhIzckIjAmXCZwSS4hZiIqISM2NyQ3JCQiMHc0NGxJJmVFISM3JCIvKnpRNSRbbSIqISM1NyQkIi46PGNLJmVFISM1JCIwdChlZSJIOTwqISM2NyQ3JCQiMD5aZEVOJmVFISM3JCIwRW9YbEIqeSIqISM2NyQkIi46PGNLJmVFISM1JCIwdChlZSJIOTwqISM2NyQ3JCQiMD5aZEVOJmVFISM3JCIwRW9YbEIqeSIqISM2NyQkIjBNL3Y9UCZlRSEjNyQiL2shcChbJlE9KiEjNTckNyQkIjA4JWY/KlImZUUhIzckIjBpY18/azg+KiEjNjckJCIwTS92PVAmZUUhIzckIi9rIXAoWyZRPSohIzU3JDckJCIwOCVmPypSJmVFISM3JCIwaWNfP2s4PiohIzY3JCQiMCczLl89YWVFISM3JCIwPjs1WiFHJz4qISM2NyQ3JCQiLyJHZ2hXJmVFISM2JCIwKVwlZnYvUT8qISM2NyQkIjAnMy5fPWFlRSEjNyQiMD47NVohRyc+KiEjNjckNyQkIi8iR2doVyZlRSEjNiQiMClcJWZ2L1E/KiEjNjckJCIvWWJkbGFlRSEjNiQiME5xTyRmcTMjKiEjNjckNyQkIi9zdV4kXCZlRSEjNiQiME1MbUlYaUAqISM2NyQkIi9ZYmRsYWVFISM2JCIwTnFPJGZxMyMqISM2NyQ3JCQiL3N1XiRcJmVFISM2JCIwTUxtSVhpQCohIzY3JCQiMCUzQC44YmVFISM3JCIwaFR3RUo2QSohIzY3JDckJCIwYFR4N2EmZUUhIzckIjByQHQmZW9HIyohIzY3JCQiMCUzQC44YmVFISM3JCIwaFR3RUo2QSohIzY3JDckJCIwYFR4N2EmZUUhIzckIjByQHQmZW9HIyohIzY3JCQiMCxOJSkzYyZlRSEjNyQiLy11dWtiTCMqISM1NyQ3JCQiMDpbTSUqZSZlRSEjNyQiMDI1ITNrN1QjKiEjNjckJCIwLE4lKTNjJmVFISM3JCIvLXV1a2JMIyohIzU3JDckJCIwOltNJSplJmVFISM3JCIwMjUhM2s3VCMqISM2NyQkIjB4Q1YiNGNlRSEjNyQiMGVZOWIiKWZDKiEjNjckNyQkIjA8bCoqemomZUUhIzckIjBWKXBlcGNgIyohIzY3JCQiMHhDViI0Y2VFISM3JCIwZVk5YiIpZkMqISM2NyQ3JCQiMDxsKip6aiZlRSEjNyQiMFYpcGVwY2AjKiEjNjckJCIwIlJ3emRjZUUhIzckIjB1UjhdMSVlIyohIzY3JDckJCIvJXlocG8mZUUhIzYkIjB6J1E0dittIyohIzY3JCQiMCJSd3pkY2VFISM3JCIwdVI4XTElZSMqISM2NyQ3JCQiLyV5aHBvJmVFISM2JCIweidRNHYrbSMqISM2NyQkIjApW0gmb3EmZUUhIzckIjBWIW9BOCQzRiohIzY3JDckJCIvNmpLT2RlRSEjNiQiMDp2KzFbJXkjKiEjNjckJCIwKVtIJm9xJmVFISM3JCIwViFvQTgkM0YqISM2NyQ3JCQiLzZqS09kZUUhIzYkIjA6disxWyV5IyohIzY3JCQiMFpnLmp2JmVFISM3JCIwQ2JzLGNLRyohIzY3JDckJCIwc24oMyd5JmVFISM3JCIwXmoyaCkpM0gqISM2NyQkIjBaZy5qdiZlRSEjNyQiMENicyxjS0cqISM2NyQ3JCQiMHNuKDMneSZlRSEjNyQiMF5qMmgpKTNIKiEjNjckJCIwYSpcOjFlZUUhIzckIi9rTCRlIW8mSCohIzU3JDckJCIuZFVpJGVlRSEjNSQiMCg9WGgiSExJKiEjNjckJCIwYSpcOjFlZUUhIzckIi9rTCRlIW8mSCohIzU3JDckJCIuZFVpJGVlRSEjNSQiMCg9WGgiSExJKiEjNjckJCIvMSQpUmNlZUUhIzYkIjBLXVAtMCIzJCohIzY3JDckJCIwRUgzbyllZUUhIzckIjBCU0BycGRKKiEjNjckJCIvMSQpUmNlZUUhIzYkIjBLXVAtMCIzJCohIzY3JDckJCIwRUgzbyllZUUhIzckIjBCU0BycGRKKiEjNjckJCIwKj0zMDJmZUUhIzckIjBfYkhMSDBLKiEjNjckNyQkIjAySm54JGZlRSEjNyQiLydHR0U1I0ckKiEjNTckJCIwKj0zMDJmZUUhIzckIjBfYkhMSDBLKiEjNjckNyQkIjAySm54JGZlRSEjNyQiLydHR0U1I0ckKiEjNTckJCIwMGgqM2VmZUUhIzckIjBKLSQ9TiZITCohIzY3JDckJCIwUiZHNyopZmVFISM3JCIwJ3BeODNsUyQqISM2NyQkIjAwaCozZWZlRSEjNyQiMEotJD1OJkhMKiEjNjckNyQkIjBSJkc3KilmZUUhIzckIjAncF44M2xTJCohIzY3JCQiMEtMQiY0Z2VFISM3JCIwTztxZHhgTSohIzY3JDckJCIwQSlbKDMvJ2VFISM3JCIwSzBVTyI0YCQqISM2NyQkIjBLTEImNGdlRSEjNyQiME87cWR4YE0qISM2NyQ3JCQiMEEpWygzLydlRSEjNyQiMEswVU8iNGAkKiEjNjckJCIwR0dkODEnZUUhIzckIjBoKlIyOiF5TiohIzY3JDckJCIwKioqKT5JNCdlRSEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMEdHZDgxJ2VFISM3JCIwaCpSMjoheU4qISM2NyQ3JCQiMCoqKik+STQnZUUhIzckIjBvJCpbIj5gbCQqISM2NyQkIjBhYiNlOGhlRSEjNyQiMCwyQkpELVAqISM2NyQ3JCQiMEJkbWI5J2VFISM3JCIwLyNlbEMoelAqISM2NyQkIjBhYiNlOGhlRSEjNyQiMCwyQkpELVAqISM2NyQ3JCQiMEJkbWI5J2VFISM3JCIwLyNlbEMoelAqISM2NyQkIjBKPSg+bWhlRSEjNyQiMGVwQioqW0VRKiEjNjckNyQkIjBaPi8mKT4nZUUhIzckIi8vRjtJVCFSKiEjNTckJCIwSj0oPm1oZUUhIzckIjBlcEIqKltFUSohIzY3JDckJCIwWj4vJik+J2VFISM3JCIvL0Y7SVQhUiohIzU3JCQiMDAvPCM+aWVFISM3JCIwQChcVUQyJlIqISM2NyQ3JCQiMC1rWz1EJ2VFISM3JCIwd2VwY2BHUyohIzY3JCQiMDAvPCM+aWVFISM3JCIwQChcVUQyJlIqISM2NyQ3JCQiMC1rWz1EJ2VFISM3JCIwd2VwY2BHUyohIzY3JCQiMEw6RUVGJ2VFISM3JCIwKD4ieSdmXDIlKiEjNjckNyQkIjBvM3ZiSSdlRSEjNyQiMDdadzYlSDolKiEjNjckJCIwTDpFRUYnZUUhIzckIjAoPiJ5J2ZcMiUqISM2NyQ3JCQiMG8zdmJJJ2VFISM3JCIwN1p3NiVIOiUqISM2NyQkIjA2O0VrSydlRSEjNyQiMDopeW4jPio+JSohIzY3JDckJCIwKCkpUnBmamVFISM3JCIwXE4kb1l0RiUqISM2NyQkIjA2O0VrSydlRSEjNyQiMDopeW4jPio+JSohIzY3JDckJCIwKCkpUnBmamVFISM3JCIwXE4kb1l0RiUqISM2NyQkIjAqKSpvaCFRJ2VFISM3JCIwbHlDV1VCViohIzY3JDckJCIwVDU5VVQnZUUhIzckIjAmUS0+XzxTJSohIzY3JCQiMCopKm9oIVEnZUUhIzckIjBseUNXVUJWKiEjNjckNyQkIjBUNTlVVCdlRSEjNyQiMCZRLT5fPFMlKiEjNjckJCIwPHAnPk5rZUUhIzckIjBjP0NcbFpXKiEjNjckNyQkIjAuJFw3cGtlRSEjNyQiMEA3KHBkaF8lKiEjNjckJCIwPHAnPk5rZUUhIzckIjBjP0NcbFpXKiEjNjckNyQkIjAuJFw3cGtlRSEjNyQiMEA3KHBkaF8lKiEjNjckJCIwJUdmPCFcJ2VFISM3JCIwcyNHOSUpPWQlKiEjNjckNyQkIjB3IXpVQ2xlRSEjNyQiMGQrL0tjXVkqISM2NyQkIjAlR2Y8IVwnZUUhIzckIjBzI0c5JSk9ZCUqISM2NyQ3JCQiMHchelVDbGVFISM3JCIwZCsvS2NdWSohIzY3JCQiMCcpUVNiYSdlRSEjNyQiL1tpNzdocCUqISM1NyQ3JCQiMCc+eDYhZSdlRSEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMCcpUVNiYSdlRSEjNyQiL1tpNzdocCUqISM1NyQ3JCQiMCc+eDYhZSdlRSEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMCNvKipHLG1lRSEjNyQiMEEhWygpUS4jWyohIzY3JDckJCIwT0UuaWonZUUhIzckIjBIeDxVUCoqWyohIzY3JCQiMCNvKipHLG1lRSEjNyQiMEEhWygpUS4jWyohIzY3JDckJCIwT0UuaWonZUUhIzckIjBIeDxVUCoqWyohIzY3JCQiMHNhTHVsJ2VFISM3JCIwaSxnVmNXXCohIzY3JDckJCIwaFx2RXAnZUUhIzckIjBsbEMoelAtJiohIzY3JCQiMHNhTHVsJ2VFISM3JCIwaSxnVmNXXCohIzY3JDckJCIwaFx2RXAnZUUhIzckIjBsbEMoelAtJiohIzY3JCQiMG8yaVJyJ2VFISM3JCIwXiE0aCl5b10qISM2NyQ3JCQiMFhOViZcbmVFISM3JCIwLWFKXz1bXiohIzY3JCQiMG8yaVJyJ2VFISM3JCIwXiE0aCl5b10qISM2NyQ3JCQiMFhOViZcbmVFISM3JCIwLWFKXz1bXiohIzY3JCQiMC1jKikzeCdlRSEjNyQiMHdjI2U2ST4mKiEjNjckNyQkIi8leSR6MW9lRSEjNiQiMFFVUTJmc18qISM2NyQkIjAtYyopM3gnZUUhIzckIjB3YyNlNkk+JiohIzY3JDckJCIvJXkkejFvZUUhIzYkIjBRVVEyZnNfKiEjNjckJCIwJHl3PUdvZUUhIzckIi8zZU9Mc0omKiEjNTckNyQkIjBpZk1XJ29lRSEjNyQiMHVJWGkqcFImKiEjNjckJCIwJHl3PUdvZUUhIzckIi8zZU9Mc0omKiEjNTckNyQkIjBpZk1XJ29lRSEjNyQiMHVJWGkqcFImKiEjNjckJCIwMGElKWUpb2VFISM3JCIvJlxxUVhUYSohIzU3JDckJCIwSyplWkFwZUUhIzckIi8iPl88U0BiKiEjNTckJCIwMGElKWUpb2VFISM3JCIvJlxxUVhUYSohIzU3JDckJCIwSyplWkFwZUUhIzckIi8iPl88U0BiKiEjNTckJCIwOitxUiVwZUUhIzckIjAkZSJISm5sYiohIzY3JDckJCIwN0wqKTMpcGVFISM3JCIwWTJmcyFlayYqISM2NyQkIjA6K3FSJXBlRSEjNyQiMCRlIkhKbmxiKiEjNjckNyQkIjA3TCopMylwZUUhIzckIjBZMmZzIWVrJiohIzY3JCQiMClvZVYtcWVFISM3JCIwdjFvNiopKm8mKiEjNjckNyQkIjB4MS4oUnFlRSEjNyQiMCNlZnc3LXgmKiEjNjckJCIwKW9lVi1xZUUhIzckIjB2MW82KikqbyYqISM2NyQ3JCQiMHgxLihScWVFISM3JCIwI2VmdzcteCYqISM2NyQkIjBGQCFIaHFlRSEjNyQiMF5NaHo1OWUqISM2NyQ3JCQiMGwieiopKTQoZUUhIzckIjA9JUdGPVkqZSohIzY3JCQiMEZAIUhocWVFISM3JCIwXk1oejU5ZSohIzY3JDckJCIwbCJ6KikpNChlRSEjNyQiMD0lR0Y9WSplKiEjNjckJCIvbClHMDcoZUUhIzYkIjBtTkFOS1FmKiEjNjckNyQkIjBcaXAlZXJlRSEjNyQiMGFzelAtPmcqISM2NyQkIi9sKUcwNyhlRSEjNiQiMG1OQU5LUWYqISM2NyQ3JCQiMFxpcCVlcmVFISM3JCIwYXN6UC0+ZyohIzY3JCQiMGZiVSw9KGVFISM3JCIwXCMzKXlgaWcqISM2NyQ3JCQiMCRHa1Y9c2VFISM3JCIwIjRtR0hNOScqISM2NyQkIjBmYlUsPShlRSEjNyQiMFwjMyl5YGlnKiEjNjckNyQkIjAkR2tWPXNlRSEjNyQiMCI0bUdITTknKiEjNjckJCIwZlxcLEMoZUUhIzckIjApZSR5NHYnPScqISM2NyQ3JCQiMEEzKnl5c2VFISM3JCIwRlwkek15RScqISM2NyQkIjBmXFwsQyhlRSEjNyQiMCllJHk0dic9JyohIzY3JDckJCIwQTMqeXlzZUUhIzckIjBGXCR6TXlFJyohIzY3JCQiMGtWUzBJKGVFISM3JCIwUmhXRyc0SicqISM2NyQ3JCQiMF9cRiZSdGVFISM3JCIwalArLkMjUicqISM2NyQkIjBrVlMwSShlRSEjNyQiMFJoV0cnNEonKiEjNjckNyQkIjBfXEYmUnRlRSEjNyQiMGpQKy5DI1InKiEjNjckJCIwMVQ1OE8oZUUhIzckIjBlXiZcdF5WJyohIzY3JDckJCIwJz1uayt1ZUUhIzckIjAqZnMhZWs7bCohIzY3JCQiMDFUNThPKGVFISM3JCIwZV4mXHReVicqISM2NyQ3JCQiMCc9bmsrdWVFISM3JCIwKmZzIWVrO2wqISM2NyQkIjBhQWtDVShlRSEjNyQiMDdsOkhRZmwqISM2NyQ3JCQiL2s6Oml1ZUUhIzYkIjBOOTk4MFRtKiEjNjckJCIwYUFrQ1UoZUUhIzckIjA3bDpIUWZsKiEjNjckNyQkIi9rOjppdWVFISM2JCIwTjk5ODBUbSohIzY3JCQiMCp5PCslWyhlRSEjNyQiMHRNMDZmJG8nKiEjNjckNyQkIjAwJT4vQ3ZlRSEjNyQiMHItQG9YbG4qISM2NyQkIjAqeTwrJVsoZUUhIzckIjB0TTA2ZiRvJyohIzY3JDckJCIwMCU+L0N2ZUUhIzckIjByLUBvWGxuKiEjNjckJCIwKm9II2ZhKGVFISM3JCIwNyRcMSl6Mm8qISM2NyQ3JCQiMEZWM2plKGVFISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwKm9II2ZhKGVFISM3JCIwNyRcMSl6Mm8qISM2NyQ3JCQiMEdWM2plKGVFISM3JCIwMiJ6S2kpKilvKiEjNjckJCIvL09AM3dlRSEjNiQiMHYhKlJRK0twKiEjNjckNyQkIjA3IlsnKlt3ZUUhIzckIjBXek15RTlxKiEjNjckJCIvL09AM3dlRSEjNiQiMHYhKlJRK0twKiEjNjckNyQkIjA3IlsnKlt3ZUUhIzckIjBXek15RTlxKiEjNjckJCIvOHEqM24oZUUhIzYkIjBLWmIkM2kwKCohIzY3JDckJCIwZjcoKj5yKGVFISM3JCIveTtNdCdRciohIzU3JCQiLzhxKjNuKGVFISM2JCIwS1piJDNpMCgqISM2NyQ3JCQiMGY3KCo+cihlRSEjNyQiL3k7TXQnUXIqISM1NyQkIjBCclxSdChlRSEjNyQiMHUjcG82Lz0oKiEjNjckNyQkIjA+Kik0YXgoZUUhIzckIjA7Y1speUlFKCohIzY3JCQiMEJyXFJ0KGVFISM3JCIwdSNwbzYvPSgqISM2NyQ3JCQiMD4qKTRheChlRSEjNyQiMDtjWyl5SUUoKiEjNjckJCIucCZRKHooZUUhIzUkIjB6VCp5OFlJKCohIzY3JDckJCIwVHkyI1J5ZUUhIzckIjBfV2JWWyhRKCohIzY3JCQiLnAmUSh6KGVFISM1JCIwelQqeThZSSgqISM2NyQ3JCQiMFR5MiNSeWVFISM3JCIwX1diVlsoUSgqISM2NyQkIjBbJVs/aHllRSEjNyQiLkZqWSIpR3UqISIqNyQ3JCQiMENyIVIuemVFISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMFslWz9oeWVFISM3JCIuRmpZIilHdSohIio3JDckJCIwQ3IhUi56ZUUhIzckIjApR0InKSopPV4oKiEjNjckJCIwJz5DU0R6ZUUhIzckIjBqdEJWLGB2KiEjNjckNyQkIjAqelcleid6ZUUhIzckIjBDQHBgSE93KiEjNjckJCIwJz5DU0R6ZUUhIzckIjBqdEJWLGB2KiEjNjckNyQkIjAqelcleid6ZUUhIzckIjBDQHBgSE93KiEjNjckJCIwVSQqbyoqKXplRSEjNyQiLzo3IUdAeHcqISM1NyQ3JCQiMDlbeUcuKWVFISM3JCIvJzR3M3FneCohIzU3JCQiMFUkKm8qKil6ZUUhIzckIi86NyFHQHh3KiEjNTckNyQkIjA5W3lHLillRSEjNyQiLyc0dzNxZ3gqISM1NyQkIjBCUD1cMCllRSEjNyQiMCJvMzA1OSF5KiEjNjckNyQkIjAmKUgoPik0KWVFISM3JCIwJ3pIUTFeKXkqISM2NyQkIjBCUD1cMCllRSEjNyQiMCJvMzA1OSF5KiEjNjckNyQkIjAmKUgoPik0KWVFISM3JCIwJ3pIUTFeKXkqISM2NyQkIjAlXGdDPyIpZUUhIzckIi87eDMxYyN6KiEjNTckNyQkIjAjUW4pUTspZUUhIzckIjBMJykqKT1eNCEpKiEjNjckJCIwJVxnQz8iKWVFISM3JCIvO3gzMWMjeiohIzU3JDckJCIwI1FuKVE7KWVFISM3JCIwTCcpKik9XjQhKSohIzY3JCQiMHgocCVmPSllRSEjNyQiMEF2RjQhKVwhKSohIzY3JDckJCIwaSIzJypIIyllRSEjNyQiMHB1J1I8UjgpKiEjNjckJCIweChwJWY9KWVFISM3JCIwQXZGNCEpXCEpKiEjNjckNyQkIjBpIjMnKkgjKWVFISM3JCIwcHUnUjxSOCkqISM2NyQkIjBYKmYtXyMpZUUhIzckIjBkWWJYKlI8KSohIzY3JDckJCIwPU0wa0gpZUUhIzckIjAwai5IS2UjKSohIzY3JCQiMFgqZi1fIyllRSEjNyQiMGRZYlgqUjwpKiEjNjckNyQkIjA9TTBrSCllRSEjNyQiMDBqLkhLZSMpKiEjNjckJCIwc110JT0kKWVFISM3JCIwXmgscT0pSCkqISM2NyQ3JCQiMGwjKUhLTyllRSEjNyQiMFReNSVHRlEpKiEjNjckJCIwc110JT0kKWVFISM3JCIwXmgscT0pSCkqISM2NyQ3JCQiMGwjKUhLTyllRSEjNyQiMFReNSVHRlEpKiEjNjckJCIwUVwuYFEpZUUhIzckIjAvUUAjeUJVKSohIzY3JDckJCIwLTZIL1YpZUUhIzckIjB4UjxSODImKSohIzY3JCQiMFFcLmBRKWVFISM3JCIwL1FAI3lCVSkqISM2NyQ3JCQiMC02SC9WKWVFISM3JCIweFI8UjgyJikqISM2NyQkIjAlPnRcXyUpZUUhIzckIjBNXnUjb2xhKSohIzY3JDckJCIwT3guISlcKWVFISM3JCIwOEdDJVI6aikqISM2NyQkIjAlPnRcXyUpZUUhIzckIjBNXnUjb2xhKSohIzY3JDckJCIwT3guISlcKWVFISM3JCIwOEdDJVI6aikqISM2NyQkIjAxWnQrXyllRSEjNyQiMHp0LHJ2cScpKiEjNjckNyQkIi9pSSZmYyllRSEjNiQiMFw7SlwlZnYpKiEjNjckJCIwMVp0K18pZUUhIzckIjB6dCxydnEnKSohIzY3JDckJCIvaUkmZmMpZUUhIzYkIjBcO0pcJWZ2KSohIzY3JCQiMHg9QSEpZSllRSEjNyQiMCNbVnRXXHopKiEjNjckNyQkIjB6XSdHTScpZUUhIzckIjAnWyFRL04hKSkpKiEjNjckJCIweD1BISllKWVFISM3JCIwI1tWdFdceikqISM2NyQ3JCQiMHpdJ0dNJyllRSEjNyQiMCdbIVEvTiEpKSkqISM2NyQkIjA0QFdqbCllRSEjNyQiMC4oKnA2OD4qKSohIzY3JDckJCIvXmIpSHEpZUUhIzYkIjBBJFwlZnYvISoqISM2NyQkIjA0QFdqbCllRSEjNyQiMC4oKnA2OD4qKSohIzY3JDckJCIvXmIpSHEpZUUhIzYkIjBBJFwlZnYvISoqISM2NyQkIjBgZ1FdcyllRSEjNyQiMEJnNmtKViEqKiEjNjckNyQkIjBWKSllP3gpZUUhIzckIjBlIj1YaCJIIioqISM2NyQkIjBgZ1FdcyllRSEjNyQiMEJnNmtKViEqKiEjNjckNyQkIjBWKSllP3gpZUUhIzckIjBlIj1YaCJIIioqISM2NyQkIjAkR2w0JXopZUUhIzckIi8oZihbK3Y7KiohIzU3JDckJCIwMlkyOiUpKWVFISM3JCIwJSpwZXBjYCMqKiEjNjckJCIwJEdsNCV6KWVFISM3JCIvKGYoWyt2OyoqISM1NyQ3JCQiMDJZMjolKSllRSEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMG5MT04nKSllRSEjNyQiMGA0UkxvIkgqKiEjNjckNyQkIjBVOkk4IiopZUUhIzckIi8kZWxDKHpQKiohIzU3JCQiMG5MT04nKSllRSEjNyQiMGA0UkxvIkgqKiEjNjckNyQkIjBVOkk4IiopZUUhIzckIi8kZWxDKHpQKiohIzU3JCQiMD5lUkwkKillRSEjNyQiMDBERF0nZVQqKiEjNjckNyQkIi9hIz06KSopZUUhIzYkIjBtWXN6UC0mKiohIzY3JCQiMD5lUkwkKillRSEjNyQiMDBERF0nZVQqKiEjNjckNyQkIi9hIz06KSopZUUhIzYkIjBtWXN6UC0mKiohIzY3JCQiMER3OU4rKmVFISM3JCIwTCIpPWIvUyYqKiEjNjckNyQkIi9cLTNfISplRSEjNiQiMC1Oek15RScqKiEjNjckJCIwRHc5TisqZUUhIzckIjBMIik9Yi9TJioqISM2NyQ3JCQiL1wtM18hKmVFISM2JCIwLU56TXlFJyoqISM2NyQkIjBKWmRTMiplRSEjNyQiMCkzUiRbQWsnKiohIzY3JDckJCIwJj47LUIiKmVFISM3JCIwUkInKSopPV4oKiohIzY3JCQiMEpaZFMyKmVFISM3JCIwKTNSJFtBaycqKiEjNjckNyQkIjAmPjstQiIqZUUhIzckIjBRQicpKik9XigqKiEjNjckJCIwS1p4XDkqZUUhIzckIjBNQ1JIUyl5KiohIzY3JDckJCIwXFlLVj4qZUUhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjBLWnhcOSplRSEjNyQiME1DUkhTKXkqKiEjNjckNyQkIjBcWUtWPiplRSEjNyQiMHY2JFwlZnYpKiohIzY3JCQiMENvZ2lAKmVFISM3JCIvbSp6KXpEIioqKiEjNTckNyQkIjBWaCkqZkUqZUUhIzckIjAsKysrKysrIiEjNTckJCIwQ29naUAqZUUhIzckIi9tKnopekQiKioqISM1NyQ3JCQiMGh6TyVcJlJtIyEjNyQiMEJILEAleShbIyEjNjckJCIwc1BpPUhSbSMhIzckIjBrPVwkek0pXCMhIzY3JDckJCIwc1BpPUhSbSMhIzckIjBrPVwkek0pXCMhIzY3JCQiL09WKSkqR1JtIyEjNiQiMDFmImY2VilcIyEjNjckNyQkIjBLRSllKikqUW0jISM3JCIuMmNbKXk1RCEiKjckJCIvT1YpKSpHUm0jISM2JCIwMWYiZjZWKVwjISM2NyQ3JCQiMEtFKWUqKSpRbSMhIzckIi4yY1speTVEISIqNyQkIjAlcExJJikqUW0jISM3JCIvMUVzJHA0XiMhIzU3JDckJCIvXylvJClvUW0jISM2JCIwTyZITyFIS18jISM2NyQkIjAlcExJJikqUW0jISM3JCIvMUVzJHA0XiMhIzU3JDckJCIvXylvJClvUW0jISM2JCIwTyZITyFIS18jISM2NyQkIjBNdis9b1FtIyEjNyQiL1VmUnNdQkQhIzU3JDckJCIwJzQnKT0pUVFtIyEjNyQiMHMkKXBlcGNgIyEjNjckJCIwTXYrPW9RbSMhIzckIi9VZlJzXUJEISM1NyQ3JCQiMCc0Jyk9KVFRbSMhIzckIjBzJClwZXBjYCMhIzY3JCQiMFY/aCR6JFFtIyEjNyQiMGNnZ3dXZ2AjISM2NyQ3JCQiMHdndyEqM1FtIyEjNyQiMDRzdzg1IltEISM2NyQkIjBWP2gkeiRRbSMhIzckIjBjZ2d3V2dgIyEjNjckNyQkIjB3Z3chKjNRbSMhIzckIjA0c3c4NSJbRCEjNjckJCIwWWE3IXkhUW0jISM3JCIwX1FGJT5lW0QhIzY3JDckJCIwdXgsNXpQbSMhIzckIjBYZyQpb10wYyMhIzY3JCQiMFlhNyF5IVFtIyEjNyQiMF9RRiU+ZVtEISM2NyQ3JCQiMHV4LDV6UG0jISM3JCIwWGckKW9dMGMjISM2NyQkIjBAdkN4eFBtIyEjNyQiMGFhI3ooPTZjIyEjNjckNyQkIjAiUVMnUlxQbSMhIzckIjAiKVshUjcqSGQjISM2NyQkIjBAdkN4eFBtIyEjNyQiMGFhI3ooPTZjIyEjNjckNyQkIjAiUVMnUlxQbSMhIzckIjAiKVshUjcqSGQjISM2NyQkIjA2PyhceXVqRSEjNyQiMEU0ZUZiT2QjISM2NyQ3JCQiMFAteHo+UG0jISM3JCIwPFAoKnlKYWUjISM2NyQkIjA2PyhceXVqRSEjNyQiMEU0ZUZiT2QjISM2NyQ3JCQiMFAteHo+UG0jISM3JCIwPFAoKnlKYWUjISM2NyQkIjA8YFYuPVBtIyEjNyQiMC9IIUc5PidlIyEjNjckNyQkIjA5JilSSSFwakUhIzckIjBgRC9Nc3lmIyEjNjckJCIwPGBWLj1QbSMhIzckIjAvSCFHOT4nZSMhIzY3JDckJCIwOSYpUkkhcGpFISM3JCIwYEQvTXN5ZiMhIzY3JCQiMHpyaEspb2pFISM3JCIwXGpsQkYoKWYjISM2NyQ3JCQiMFRqQSI0bWpFISM3JCIwKlE2IipHSjVFISM2NyQkIjB6cmhLKW9qRSEjNyQiMFxqbEJGKClmIyEjNjckNyQkIjBUakEiNG1qRSEjNyQiMCpRNiIqR0o1RSEjNjckJCIwKHlCQShlT20jISM3JCIwYEwzcmk3aCMhIzY3JDckJCIwUFtfaUpPbSMhIzckIjBELT1XYEZpIyEjNjckJCIwKHlCQShlT20jISM3JCIwYEwzcmk3aCMhIzY3JDckJCIwUFtfaUpPbSMhIzckIjBELT1XYEZpIyEjNjckJCIwcCpSRCNIT20jISM3JCIwRDE8JXl6QkUhIzY3JDckJCIwUDotVy1PbSMhIzckIjBoIVwjKlI+TkUhIzY3JCQiMHAqUkQjSE9tIyEjNyQiMEQxPCV5ekJFISM2NyQ3JCQiMFA6LVctT20jISM3JCIwaCFcIypSPk5FISM2NyQkIjByaUUkKSpmakUhIzckIjBbJHlRRUxPRSEjNjckNyQkIjBPOihmTGRqRSEjNyQiMCgqeUphTXdrIyEjNjckJCIwcmlFJCkqZmpFISM3JCIwWyR5UUVMT0UhIzY3JDckJCIwTzooZkxkakUhIzckIjAoKnlKYU13ayMhIzY3JCQiMCwsbmFxTm0jISM3JCIwKjRcJDRuKVtFISM2NyQ3JCQiMGBMNFFXTm0jISM3JCIwTG5RNHYrbSMhIzY3JCQiMCwsbmFxTm0jISM3JCIwKjRcJDRuKVtFISM2NyQ3JCQiMGBMNFFXTm0jISM3JCIwTG5RNHYrbSMhIzY3JCQiMDpzWU9UTm0jISM3JCIwJkclXEAsOW0jISM2NyQ3JCQiMCZSOjBiXmpFISM3JCIwcGJYazpEbiMhIzY3JCQiMDpzWU9UTm0jISM3JCIwJkclXEAsOW0jISM2NyQ3JCQiMCZSOjBiXmpFISM3JCIwcGJYazpEbiMhIzY3JCQiLylmeUc3Tm0jISM2JCIwMUIhKipcJFJuIyEjNjckNyQkIjAmNEhLbltqRSEjNyQiMDBXXz5jXG8jISM2NyQkIi8pZnlHN05tIyEjNiQiMDFCISoqXCRSbiMhIzY3JDckJCIwJjRIS25bakUhIzckIjAwV18+Y1xvIyEjNjckJCIweG9oSiRbakUhIzckIjAoby5ZJW9rbyMhIzY3JDckJCIwRVk0MWVNbSMhIzckIjBUS2Z1J1IocCMhIzY3JCQiMHhvaEokW2pFISM3JCIwKG8uWSVva28jISM2NyQ3JCQiMEVZNDFlTW0jISM3JCIwVEtmdSdSKHAjISM2NyQkIjBeKCl6V2FNbSMhIzckIjBkXjZjLCEqcCMhIzY3JDckJCIwJVsnM1xITW0jISM3JCIweD9tSFApNEYhIzY3JCQiMF4oKXpXYU1tIyEjNyQiMGReNmMsISpwIyEjNjckNyQkIjAlWyczXEhNbSMhIzckIjB4P21IUCk0RiEjNjckJCIwQEhNb0RNbSMhIzckIi9WK1dWYDZGISM1NyQ3JCQiMFV4QC0sTW0jISM3JCIwODR0JXlGQUYhIzY3JCQiMEBITW9ETW0jISM3JCIvVitXVmA2RiEjNTckNyQkIjBVeEAtLE1tIyEjNyQiMDg0dCV5RkFGISM2NyQkIjAnZkBBcVJqRSEjNyQiMDYnWyZ6bVNzIyEjNjckNyQkIjBDJyllbHNMbSMhIzckIjBcKCp6Uj1adCMhIzY3JCQiMCdmQEFxUmpFISM3JCIwNidbJnptU3MjISM2NyQ3JCQiMEMnKWVsc0xtIyEjNyQiMFwoKnpSPVp0IyEjNjckJCIwUHFkWW9MbSMhIzckIjBeTjUiKilmT0YhIzY3JDckJCIwJkglM1JXTG0jISM3JCIwJmVvWyplcnUjISM2NyQkIjBQcWRZb0xtIyEjNyQiMF5ONSIqKWZPRiEjNjckNyQkIjAmSCUzUldMbSMhIzckIjAmZW9bKmVydSMhIzY3JCQiMD0kWzcrTWpFISM3JCIwVzdlcEkiXEYhIzY3JDckJCIwVyNcRGlKakUhIzckIjBAdSQqXCpmZkYhIzY3JCQiMD0kWzcrTWpFISM3JCIwVzdlcEkiXEYhIzY3JDckJCIwVyNcRGlKakUhIzckIjBAdSQqXCpmZkYhIzY3JCQiMCl5KjRtNkxtIyEjNyQiMGVtVDppO3cjISM2NyQ3JCQiMER3QTspR2pFISM3JCIwZGkrMFM/eCMhIzY3JCQiMCl5KjRtNkxtIyEjNyQiMGVtVDppO3cjISM2NyQ3JCQiMER3QTspR2pFISM3JCIwZGkrMFM/eCMhIzY3JCQiMFhoUFQkR2pFISM3JCIweF4jeUs+dUYhIzY3JDckJCIwKCozJyk+Z0ttIyEjNyQiMCQ0disxWyV5IyEjNjckJCIwWGhQVCRHakUhIzckIjB4XiN5Sz51RiEjNjckNyQkIjAoKjMnKT5nS20jISM3JCIwJDR2KzFbJXkjISM2NyQkIjAtIyp5RWJLbSMhIzckIjBiM3QyQ255IyEjNjckNyQkIjAsaFRMS0ttIyEjNyQiMEhSOTpAcHojISM2NyQkIjAtIyp5RWJLbSMhIzckIjBiM3QyQ255IyEjNjckNyQkIjAsaFRMS0ttIyEjNyQiMEhSOTpAcHojISM2NyQkIjAicCdRQUZLbSMhIzckIjBYMSlcWEQqeiMhIzY3JDckJCIwJlxrcVg/akUhIzckIjBsRkBxaCQ0RyEjNjckJCIwInAnUUFGS20jISM3JCIwWDEpXFhEKnojISM2NyQ3JCQiMCZca3FYP2pFISM3JCIwbEZAcWgkNEchIzY3JCQiMDshSCNHKj5qRSEjNyQiMGszUXAleTZHISM2NyQ3JCQiL3lTMnA8akUhIzYkIjAsO0dELT0jRyEjNjckJCIwOyFII0cqPmpFISM3JCIwazNRcCV5NkchIzY3JDckJCIveVMycDxqRSEjNiQiMCw7R0QtPSNHISM2NyQkIjB5VkxXckptIyEjNyQiMGBKKDNYSkNHISM2NyQ3JCQiMC9tQU1cSm0jISM3JCIwUC9OIUdDTUchIzY3JCQiMHlWTFdySm0jISM3JCIwYEooM1hKQ0chIzY3JDckJCIwL21BTVxKbSMhIzckIjBQL04hR0NNRyEjNjckJCIwKkdhL1A5akUhIzckIjB3VUQrV28kRyEjNjckNyQkIjBFanYoPTdqRSEjNyQiMHUjPmFMb1lHISM2NyQkIjAqR2EvUDlqRSEjNyQiMHdVRCtXbyRHISM2NyQ3JCQiMEVqdig9N2pFISM3JCIwdSM+YUxvWUchIzY3JCQiMCZ5IXoxO0ptIyEjNyQiMDZrKG9KUFxHISM2NyQ3JCQiMFo6PF4lNGpFISM3JCIvNilbIVI3ZkchIzU3JCQiMCZ5IXoxO0ptIyEjNyQiMDZrKG9KUFxHISM2NyQ3JCQiMFo6PF4lNGpFISM3JCIvNilbIVI3ZkchIzU3JCQiLzY5SyYpM2pFISM2JCIwO2M6LC0+J0chIzY3JDckJCIwQVVZQ25JbSMhIzckIjBZcGJYazooRyEjNjckJCIvNjlLJikzakUhIzYkIjA7YzosLT4nRyEjNjckNyQkIjBBVVlDbkltIyEjNyQiMFlwYlhrOihHISM2NyQkIjBaYHI0aEltIyEjNyQiMCpbP0owVnVHISM2NyQ3JCQiL2I2disvakUhIzYkIjAjeUQxXSslKUchIzY3JCQiMFpgcjRoSW0jISM3JCIwKls/SjBWdUchIzY3JDckJCIvYjZ2Ky9qRSEjNiQiMCN5RDFdKyUpRyEjNjckJCIweS08d0xJbSMhIzckIjA+JHBKKGVwKUchIzY3JDckJCIwYkNVKzhJbSMhIzckIjA9WXBiWGsqRyEjNjckJCIweS08d0xJbSMhIzckIjA+JHBKKGVwKUchIzY3JDckJCIwYkNVKzhJbSMhIzckIjA9WXBiWGsqRyEjNjckJCIwLFhzXzFJbSMhIzckIi9FTjNtWyoqRyEjNTckNyQkIjBja0EuJylIbSMhIzckIjBhTXc1JykpM0ghIzY3JCQiMCxYc18xSW0jISM3JCIvRU4zbVsqKkchIzU3JDckJCIwY2tBLicpSG0jISM3JCIwYU13NScpKTNIISM2NyQkIi5qSFJ6SG0jISM1JCIwRC5ROzk/IkghIzY3JDckJCIwXDslZSJmSG0jISM3JCIvSEtlbUtASCEjNTckJCIuakhSekhtIyEjNSQiMEQuUTs5PyJIISM2NyQ3JCQiMFw7JWUiZkhtIyEjNyQiL0hLZW1LQEghIzU3JCQiMHRGImZCJkhtIyEjNyQiMEt3clJUWCNIISM2NyQ3JCQiMEtnPVFLSG0jISM3JCIwRTYhNHN3TEghIzY3JCQiMHRGImZCJkhtIyEjNyQiMEt3clJUWCNIISM2NyQ3JCQiMEtnPVFLSG0jISM3JCIwRTYhNHN3TEghIzY3JCQiMDxTVFVESG0jISM3JCIwKSopZjgkb3EkSCEjNjckNyQkIjB5VUBxMEhtIyEjNyQiMGkqcGZ4P1lIISM2NyQkIjA8U1RVREhtIyEjNyQiMCkqKWY4JG9xJEghIzY3JDckJCIweVVAcTBIbSMhIzckIjBpKnBmeD9ZSCEjNjckJCIwLkQkKWUpKkdtIyEjNyQiMDRJPyJcZlxIISM2NyQ3JCQiMCI+Zz4iekdtIyEjNyQiMCl6UTUkWydlSCEjNjckJCIwLkQkKWUpKkdtIyEjNyQiMDRJPyJcZlxIISM2NyQ3JCQiMCI+Zz4iekdtIyEjNyQiMCl6UTUkWydlSCEjNjckJCIwJXBpXj0oR20jISM3JCIwPFpFPkBAJ0ghIzY3JDckJCIvWEVORSZHbSMhIzYkIjBNdzUnKSkzckghIzY3JCQiMCVwaV49KEdtIyEjNyQiMDxaRT5AQCdIISM2NyQ3JCQiL1hFTkUmR20jISM2JCIwTXc1JykpM3JIISM2NyQkIjAkcGo5XyVHbSMhIzckIjA3Yk46WlkoSCEjNjckNyQkIjBiKVtZaSNHbSMhIzckIi9adzYlSE4pSCEjNTckJCIwJHBqOV8lR20jISM3JCIwN2JOOlpZKEghIzY3JDckJCIwYilbWWkjR20jISM3JCIvWnc2JUhOKUghIzU3JCQiLzw1dic9R20jISM2JCIwLHo+IUc8KClIISM2NyQ3JCQiME9NYCYqKnppRSEjNyQiMDFgQycqcGYqSCEjNjckJCIvPDV2Jz1HbSMhIzYkIjAsej4hRzwoKUghIzY3JDckJCIwT01gJioqemlFISM3JCIwMWBDJypwZipIISM2NyQkIjBFTWJCI3ppRSEjNyQiMC5oKUgiKXAqKkghIzY3JDckJCIwTmsrd3RGbSMhIzckIjBVVEpeNSUzSSEjNjckJCIwRU1iQiN6aUUhIzckIjAuaClIIilwKipIISM2NyQ3JCQiME5rK3d0Rm0jISM3JCIwVVRKXjUlM0khIzY3JCQiMEZIRypld2lFISM3JCIwSmVyOUJBLCQhIzY3JDckJCIwRGkybVpGbSMhIzckIjB5SFExXjMtJCEjNjckJCIwRkhHKmV3aUUhIzckIjBKZXI5QkEsJCEjNjckNyQkIjBEaTJtWkZtIyEjNyQiMHlIUTFeMy0kISM2NyQkIjBsNiVbJ1JGbSMhIzckIjApPUlceXVDSSEjNjckNyQkIjBMdm5sQEZtIyEjNyQiMDk9WGgiSExJISM2NyQkIjBsNiVbJ1JGbSMhIzckIjApPUlceXVDSSEjNjckNyQkIjBMdm5sQEZtIyEjNyQiMDk9WGgiSExJISM2NyQkIjBBYDtdOEZtIyEjNyQiMChmSVFBRlBJISM2NyQ3JCQiMGNjJlxkcGlFISM3JCIvbD9sQHRYSSEjNTckJCIwQWA7XThGbSMhIzckIjAoZklRQUZQSSEjNjckNyQkIjBjYyZcZHBpRSEjNyQiL2w/bEB0WEkhIzU3JCQiMGRnRFgob2lFISM3JCIwWVxUSid6XEkhIzY3JDckJCIweG0hUSpwRW0jISM3JCIwJ1sqZXJzImVJISM2NyQkIjBkZ0RYKG9pRSEjNyQiMFlcVEonelxJISM2NyQ3JCQiMHhtIVEqcEVtIyEjNyQiMCdbKmVycyJlSSEjNjckJCIwPT41XWhFbSMhIzckIjBmKj54K0tpSSEjNjckNyQkIjAtOy1BV0VtIyEjNyQiMEEkZW1LaHFJISM2NyQkIjA9PjVdaEVtIyEjNyQiMGYqPngrS2lJISM2NyQ3JCQiMC07LUFXRW0jISM3JCIwQSRlbUtocUkhIzY3JCQiMDFdZmtORW0jISM3JCIwLTs0YFZbMiQhIzY3JDckJCIvZCYqKWY9RW0jISM2JCIwZXJzIlEwJDMkISM2NyQkIjAxXWZrTkVtIyEjNyQiMC07NGBWWzIkISM2NyQ3JCQiL2QmKilmPUVtIyEjNiQiMGVycyJRMCQzJCEjNjckJCIwV2l4KSk0RW0jISM3JCIwaicpUm5tdDMkISM2NyQ3JCQiMEIhcHJJZmlFISM3JCIwJSpmek8lXCY0JCEjNjckJCIwV2l4KSk0RW0jISM3JCIwaicpUm5tdDMkISM2NyQ3JCQiMEIhcHJJZmlFISM3JCIwJSpmek8lXCY0JCEjNjckJCIwYC5rQSVlaUUhIzckIjBtIWUxJiopKSo0JCEjNjckNyQkIjB2J1FSd2NpRSEjNyQiLyRbJz1cJHo1JCEjNTckJCIwYC5rQSVlaUUhIzckIjBtIWUxJiopKSo0JCEjNjckNyQkIjB2J1FSd2NpRSEjNyQiLyRbJz1cJHo1JCEjNTckJCIvLyM9bWVEbSMhIzYkIjAieScpRz9UN0ohIzY3JDckJCIwMis/SVVEbSMhIzckIjBtTyRwYVA/SiEjNjckJCIvLyM9bWVEbSMhIzYkIjAieScpRz9UN0ohIzY3JDckJCIwMis/SVVEbSMhIzckIjBtTyRwYVA/SiEjNjckJCIwbmJHPkxEbSMhIzckIjBAZlhDTVw3JCEjNjckNyQkIjBMdiRlcV5pRSEjNyQiMC1EKy07RzgkISM2NyQkIjBuYkc+TERtIyEjNyQiMEBmWENNXDckISM2NyQ3JCQiMEx2JGVxXmlFISM3JCIwLUQrLTtHOCQhIzY3JCQiMCk+Xz95XWlFISM3JCIwKHlTXWhYUEohIzY3JDckJCIwPjEnMz5caUUhIzckIjBSODJkY185JCEjNjckJCIwKT5fP3ldaUUhIzckIjAoeVNdaFhQSiEjNjckNyQkIjA+MSczPlxpRSEjNyQiMFI4MmRjXzkkISM2NyQkIjBgKW9VRFtpRSEjNyQiMDBZS3Z4KlxKISM2NyQ3JCQiMHheQyZvWWlFISM3JCIwdiw5NyhwZEohIzY3JCQiMGApb1VEW2lFISM3JCIwMFlLdngqXEohIzY3JDckJCIweF5DJm9ZaUUhIzckIjB2LDk3KHBkSiEjNjckJCIwQmk4T2RDbSMhIzckIjB3UW0vKlxpSiEjNjckNyQkIjA+aysqPVdpRSEjNyQiMDYhNHN3OHFKISM2NyQkIjBCaThPZENtIyEjNyQiMHdRbS8qXGlKISM2NyQ3JCQiMD5rKyo9V2lFISM3JCIwNiE0c3c4cUohIzY3JCQiMHMkUnVBVmlFISM3JCIwd3h1Lj9dPCQhIzY3JDckJCIwJVw5QHFUaUUhIzckIjBaeUZBeUQ9JCEjNjckJCIwcyRSdUFWaUUhIzckIjB3eHUuP108JCEjNjckNyQkIjAlXDlAcVRpRSEjNyQiMFp5RkF5RD0kISM2NyQkIi8lM0tHMkNtIyEjNiQiMGYjPkAyYSg9JCEjNjckNyQkIjBkLGBDI1JpRSEjNyQiMCRvWXQoPV0+JCEjNjckJCIvJTNLRzJDbSMhIzYkIjBmIz5AMmEoPSQhIzY3JDckJCIwZCxgQyNSaUUhIzckIjAkb1l0KD1dPiQhIzY3JCQiMC8/aVEjUWlFISM3JCIwV3BHNWgrPyQhIzY3JDckJCIwNmlGY25CbSMhIzckIjA+YlRLZnU/JCEjNjckJCIwLz9pUSNRaUUhIzckIjBXcEc1aCs/JCEjNjckNyQkIi9Ad2l2T2lFISM2JCIwPmJUS2Z1PyQhIzY3JCQiMC9hW2VkQm0jISM3JCIwInkkejwiZTdLISM2NyQ3JCQiMHgpSHNITWlFISM3JCIwYlZbKCkqKik+SyEjNjckJCIwL2FbZWRCbSMhIzckIjAieSR6PCJlN0shIzY3JDckJCIweClIc0hNaUUhIzckIjBiVlsoKSoqKT5LISM2NyQkIjBhXG0oR0xpRSEjNyQiME0pR2E0NURLISM2NyQ3JCQiMEUmKlxaPUJtIyEjNyQiMCI+YEQvTUtLISM2NyQkIjBhXG0oR0xpRSEjNyQiME0pR2E0NURLISM2NyQ3JCQiMEUmKlxaPUJtIyEjNyQiMCI+YEQvTUtLISM2NyQkIi9yI1JFM0JtIyEjNiQiMEchW0MvaVBLISM2NyQ3JCQiMEwib3BTSGlFISM3JCIwRj9pKDR5V0shIzY3JCQiL3IjUkUzQm0jISM2JCIwRyFbQy9pUEshIzY3JDckJCIwTCJvcFNIaUUhIzckIjBGP2koNHlXSyEjNjckJCIwPVlVdSRHaUUhIzckIjAxUmpmUixEJCEjNjckNyQkIi8lUWx2cEFtIyEjNiQiMGozcF9Ac0QkISM2NyQkIjA9WVV1JEdpRSEjNyQiMDFSamZSLEQkISM2NyQ3JCQiLyVRbHZwQW0jISM2JCIwajNwX0BzRCQhIzY3JCQiMGwuJT0kZkFtIyEjNyQiMGg0dFllRUUkISM2NyQ3JCQiME4mXE5iQ2lFISM3JCIwKnBmeD9tcEshIzY3JCQiMGwuJT0kZkFtIyEjNyQiMGg0dFllRUUkISM2NyQ3JCQiME4mXE5iQ2lFISM3JCIwKnBmeD9tcEshIzY3JCQiLzRLJylcQmlFISM2JCIwJFJrUHE8dkshIzY3JDckJCIwbGFjU0BBbSMhIzckIjBOJkdHRTUjRyQhIzY3JCQiLzRLJylcQmlFISM2JCIwJFJrUHE8dkshIzY3JDckJCIwbGFjU0BBbSMhIzckIjBOJkdHRTUjRyQhIzY3JCQiMCwjNFoyQGlFISM3JCIwJ29DNWBwKEckISM2NyQ3JCQiMDYiem50PmlFISM3JCIwcnQqeUphJUgkISM2NyQkIjAsIzRaMkBpRSEjNyQiMCdvQzVgcChHJCEjNjckNyQkIjA2InpudD5pRSEjNyQiMHJ0KnlKYSVIJCEjNjckJCIvLyEzZyc9aUUhIzYkIjAiNCZbRzgtSSQhIzY3JDckJCIvJFs2VXRAbSMhIzYkIjAyaSdIUClwSSQhIzY3JCQiLy8hM2cnPWlFISM2JCIwIjQmW0c4LUkkISM2NyQ3JCQiLyRbNlV0QG0jISM2JCIwMmknSFApcEkkISM2NyQkIjBGSChbRDtpRSEjNyQiMF9UdCY0dDdMISM2NyQ3JCQiLy1BbSZcQG0jISM2JCIwVl0uR0MlPkwhIzY3JCQiMEZIKFtEO2lFISM3JCIwX1R0JjR0N0whIzY3JDckJCIvLUFtJlxAbSMhIzYkIjBWXS5HQyU+TCEjNjckJCIwUEEnKWVRQG0jISM3JCIwS2BcTFtfSyQhIzY3JDckJCIwdiRlLGU3aUUhIzckIjB6UTUkWyc9TCQhIzY3JCQiMFBBJyllUUBtIyEjNyQiMEtgXExbX0skISM2NyQ3JCQiMHYkZSxlN2lFISM3JCIwelE1JFsnPUwkISM2NyQkIjB2OjZzOUBtIyEjNyQiMHlZY1RseEwkISM2NyQ3JCQiMCpHKXk3LUBtIyEjNyQiMDpGPFEwVk0kISM2NyQkIjB2OjZzOUBtIyEjNyQiMHlZY1RseEwkISM2NyQ3JCQiMCpHKXk3LUBtIyEjNyQiMDpGPFEwVk0kISM2NyQkIjBuUWElNDRpRSEjNyQiMEUkKj0/I0ddTCEjNjckNyQkIjBlYFZheT9tIyEjNyQiMF46QyRmdWNMISM2NyQkIjBuUWElNDRpRSEjNyQiMEUkKj0/I0ddTCEjNjckNyQkIjBlYFZheT9tIyEjNyQiMF46QyRmdWNMISM2NyQkIjAqXF5oczFpRSEjNyQiMCJwJFJwKXppTCEjNjckNyQkIjA0RjQwYj9tIyEjNyQiMChRNSRbJz1wTCEjNjckJCIwKlxeaHMxaUUhIzckIjAicCRScCl6aUwhIzY3JDckJCIwNEY0MGI/bSMhIzckIjAoUTUkWyc9cEwhIzY3JCQiMGYzK25WP20jISM3JCIuXCcqKVtKdkwhIio3JDckJCIweHUjWzsuaUUhIzckIjBCI3pMcWkiUSQhIzY3JCQiMGYzK25WP20jISM3JCIuXCcqKVtKdkwhIio3JDckJCIweHUjWzsuaUUhIzckIjBCI3pMcWkiUSQhIzY3JCQiMDBBLDw/P20jISM3JCIwWSdlInpJeVEkISM2NyQ3JCQiMEExY0wzP20jISM3JCIwZiFbJWVuU1IkISM2NyQkIjAwQSw8Pz9tIyEjNyQiMFknZSJ6SXlRJCEjNjckNyQkIjBBMWNMMz9tIyEjNyQiMGYhWyVlblNSJCEjNjckJCIwIyp6PHcnKj5tIyEjNyQiMD4iKioqUlkuUyQhIzY3JDckJCIwTWBHNiYpPm0jISM3JCIwJipvXjgzbFMkISM2NyQkIjAjKno8dycqPm0jISM3JCIwPiIqKipSWS5TJCEjNjckNyQkIjBNYEc2Jik+bSMhIzckIjAmKm9eODNsUyQhIzY3JCQiMC0yXFd0Pm0jISM3JCIwSC9ecmhHVCQhIzY3JDckJCIwdUEjej4nPm0jISM3JCIwSmRlb1sqPU0hIzY3JCQiMC0yXFd0Pm0jISM3JCIwSC9ecmhHVCQhIzY3JDckJCIwdUEjej4nPm0jISM3JCIwSmRlb1sqPU0hIzY3JCQiMDsuKD0tJj5tIyEjNyQiMFoiXFJuUERNISM2NyQ3JCQiMHN0WSQqUT5tIyEjNyQiMG5YbEIqUUpNISM2NyQkIjA7Lig9LSY+bSMhIzckIjBaIlxSblBETSEjNjckNyQkIjBzdFkkKlE+bSMhIzckIjBuWGxCKlFKTSEjNjckJCIwdE9CM0Y+bSMhIzckIi8kPmVaIip5ViQhIzU3JDckJCIwWSozemYiPm0jISM3JCIwL01zeUhRVyQhIzY3JCQiMHRPQjNGPm0jISM3JCIvJD5lWiIqeVYkISM1NyQ3JCQiMFkqM3pmIj5tIyEjNyQiMC9Nc3lIUVckISM2NyQkIjAwRiFRUyE+bSMhIzckIjBlcnAiZlNdTSEjNjckNyQkIjBaaFI2JCo9bSMhIzckIi9DI3pMcWlYJCEjNTckJCIwMEYhUVMhPm0jISM3JCIwZXJwImZTXU0hIzY3JDckJCIwWmhSNiQqPW0jISM3JCIvQyN6THFpWCQhIzU3JCQiL0Y3JTMiKT1tIyEjNiQiMGNWI28rI0hZJCEjNjckNyQkIjAjb0VPLig9bSMhIzckIjB3NScpKTNyb00hIzY3JCQiL0Y3JTMiKT1tIyEjNiQiMGNWI28rI0hZJCEjNjckNyQkIjAjb0VPLig9bSMhIzckIjB3NScpKTNyb00hIzY3JCQiMF5iKj4jZT1tIyEjNyQiMHJ4PCRSVnZNISM2NyQ3JCQiMF9QIlt3JT1tIyEjNyQiMDcqSFI5OiJbJCEjNjckJCIwXmIqPiNlPW0jISM3JCIwcng8JFJWdk0hIzY3JDckJCIwX1AiW3clPW0jISM3JCIwNypIUjk6IlskISM2NyQkIjB0WWdXTj1tIyEjNyQiMGUtZl1aelskISM2NyQ3JCQiMDtXdC9EPW0jISM3JCIwWygpKiopPmYkXCQhIzY3JCQiMHRZZ1dOPW0jISM3JCIwZS1mXVp6WyQhIzY3JDckJCIwO1d0L0Q9bSMhIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwMGE0dzc9bSMhIzckIjAnSEMmemcvXSQhIzY3JDckJCIwPXVeYC09bSMhIzckIjAlZW5TRC4xTiEjNjckJCIwMGE0dzc9bSMhIzckIjAnSEMmemcvXSQhIzY3JDckJCIwPXVeYC09bSMhIzckIjAlZW5TRC4xTiEjNjckJCIvR3ptLHpoRSEjNiQiL2gsJHp0SF4kISM1NyQ3JCQiMFZoNTYheWhFISM3JCIvVU8iNHQlPU4hIzU3JCQiL0d6bSx6aEUhIzYkIi9oLCR6dEheJCEjNTckNyQkIjBWaDU2IXloRSEjNyQiL1VPIjR0JT1OISM1NyQkIjBfUDhtbjxtIyEjNyQiMCV5TjFsW0ROISM2NyQ3JCQiMFUlenV4dmhFISM3JCIwY18/azg0YCQhIzY3JCQiMF9QOG1uPG0jISM3JCIwJXlOMWxbRE4hIzY3JDckJCIwVSV6dXh2aEUhIzckIjBjXz9rODRgJCEjNjckJCIwLU1WQ1g8bSMhIzckIjBCJDNPKikqemAkISM2NyQ3JCQiMHhiYV9OPG0jISM3JCIwIzR1Iz5hTGEkISM2NyQkIjAtTVZDWDxtIyEjNyQiMEIkM08qKSp6YCQhIzY3JDckJCIweGJhX048bSMhIzckIjAjNHUjPmFMYSQhIzY3JCQiMFszdSJIc2hFISM3JCIwLHlwMjYwYiQhIzY3JDckJCIwQndZTzg8bSMhIzckIjBHSE11JXpiTiEjNjckJCIwWzN1IkhzaEUhIzckIjAseXAyNjBiJCEjNjckNyQkIjBCd1lPODxtIyEjNyQiMEdITXUlemJOISM2NyQkIjBNVyd6MXFoRSEjNyQiMDEiKT4kSC1qTiEjNjckNyQkIjByMS5IInBoRSEjNyQiMGs8VEhOI29OISM2NyQkIjBNVyd6MXFoRSEjNyQiMDEiKT4kSC1qTiEjNjckNyQkIjByMS5IInBoRSEjNyQiMGs8VEhOI29OISM2NyQkIjBOSyhIJnk7bSMhIzckIjBZIUgwWGB2TiEjNjckNyQkIjA6cFRJcDttIyEjNyQiLjFbJWVuIWUkISIqNyQkIjBOSyhIJnk7bSMhIzckIjBZIUgwWGB2TiEjNjckNyQkIjA6cFRJcDttIyEjNyQiLjFbJWVuIWUkISIqNyQkIjB5J2Zva2xoRSEjNyQiMGJVUnpYISllJCEjNjckNyQkIjBHeU1TWjttIyEjNyQiME8lXCZSO0pmJCEjNjckJCIweSdmb2tsaEUhIzckIjBiVVJ6WCEpZSQhIzY3JDckJCIwR3lNU1o7bSMhIzckIjBPJVwmUjtKZiQhIzY3JCQiMEosaFxNO20jISM3JCIwV3UkKXpjMGckISM2NyQ3JCQiMCdHPCJmRDttIyEjNyQiMHMjPVlwYjBPISM2NyQkIjBKLGhcTTttIyEjNyQiMFd1JCl6YzBnJCEjNjckNyQkIjAnRzwiZkQ7bSMhIzckIjBzIz1ZcGIwTyEjNjckJCIweUUyaDc7bSMhIzckIjBFZE1fbkloJCEjNjckNyQkIjBgQFInUWdoRSEjNyQiMDNyb1woKnpoJCEjNjckJCIweUUyaDc7bSMhIzckIjBFZE1fbkloJCEjNjckNyQkIjBgQFInUWdoRSEjNyQiMDNyb1woKnpoJCEjNjckJCIwKT5mODNmaEUhIzckIjBuLmMnemRETyEjNjckNyQkIjBeY01BI2VoRSEjNyQiMFdmdi9RL2okISM2NyQkIjApPmY4M2ZoRSEjNyQiMG4uYyd6ZERPISM2NyQ3JCQiMF5jTUEjZWhFISM3JCIwV2Z2L1EvaiQhIzY3JCQiMCk+bC8icDptIyEjNyQiMHBkXDcpM1FPISM2NyQ3JCQiMEVSKHAxY2hFISM3JCIveUMpZnlHayQhIzU3JCQiMCk+bC8icDptIyEjNyQiMHBkXDcpM1FPISM2NyQ3JCQiMEVSKHAxY2hFISM3JCIveUMpZnlHayQhIzU3JCQiMGtMSFtaOm0jISM3JCIwc1JZKylmXU8hIzY3JDckJCIwMDA9P1I6bSMhIzckIjA7TypbIj5gbCQhIzY3JCQiMGtMSFtaOm0jISM3JCIwc1JZKylmXU8hIzY3JDckJCIwMDA9P1I6bSMhIzckIjA7TypbIj5gbCQhIzY3JCQiMGtuJFtmX2hFISM3JCIwJT4oW2cySm0kISM2NyQ3JCQiMDdRIT55XmhFISM3JCIwX0MnKnBmeG0kISM2NyQkIjBrbiRbZl9oRSEjNyQiMCU+KFtnMkptJCEjNjckNyQkIjA3USE+eV5oRSEjNyQiMF9DJypwZnhtJCEjNjckJCIuTS5dLzptIyEjNSQiMFBVdyNwaHZPISM2NyQ3JCQiL2MlPl8nXGhFISM2JCIwKUdKXS0/IW8kISM2NyQkIi5NLl0vOm0jISM1JCIwUFV3I3Bodk8hIzY3JDckJCIvYyU+XydcaEUhIzYkIjApR0pdLT8hbyQhIzY3JCQiMF9KJFJKW2hFISM3JCIwZF44KGY3KW8kISM2NyQ3JCQiMD1sL0p2OW0jISM3JCIwQyw1ITNrI3AkISM2NyQkIjBfSiRSSltoRSEjNyQiMGReOChmNylvJCEjNjckNyQkIjA9bC9KdjltIyEjNyQiMEMsNSEzayNwJCEjNjckJCIwYyJIbD1ZaEUhIzckIjBwPml0TTFxJCEjNjckNyQkIjB5TVg9YTltIyEjNyQiLycqb144MzBQISM1NyQkIjBjIkhsPVloRSEjNyQiMHA+aXRNMXEkISM2NyQ3JCQiMHlNWD1hOW0jISM3JCIvJypvXjgzMFAhIzU3JCQiL2Q5eTFXaEUhIzYkIjAybUNBVkpyJCEjNjckNyQkIjAlPjBWSlZoRSEjNyQiMCd6UC0+XzxQISM2NyQkIi9kOXkxV2hFISM2JCIwMm1DQVZKciQhIzY3JDckJCIwJT4wVkpWaEUhIzckIjAnelAtPl88UCEjNjckJCItencmPjltIyEiKiQiMFZJT1ZeY3MkISM2NyQ3JCQiMDNHcT03OW0jISM3JCIwS21JWGkqSFAhIzY3JCQiLXp3Jj45bSMhIiokIjBWSU9WXmNzJCEjNjckNyQkIjAzR3E9NzltIyEjNyQiMEttSVhpKkhQISM2NyQkIjBfUzdjKVJoRSEjNyQiMExoJ3AkZiJRUCEjNjckNyQkIjBwPmFKIlJoRSEjNyQiMHBhUCsuQ3UkISM2NyQkIjBfUzdjKVJoRSEjNyQiMExoJ3AkZiJRUCEjNjckNyQkIjBwPmFKIlJoRSEjNyQiMG9hUCsuQ3UkISM2NyQkIi8iKVJLd1BoRSEjNiQiMEJxdy1uMXYkISM2NyQ3JCQiMFxSIkcwUGhFISM3JCIwMFZXYlZbdiQhIzY3JCQiLyIpUkt3UGhFISM2JCIwQnF3LW4xdiQhIzY3JDckJCIwXFIiRzBQaEUhIzckIjAwVldiVlt2JCEjNjckJCIvJDMjKnljOG0jISM2JCIwOVE1VHVKdyQhIzY3JDckJCIwbF1oIylcOG0jISM3JCIwVEpeNSVHblAhIzY3JCQiLyQzIyp5YzhtIyEjNiQiMDlRNVR1SnckISM2NyQ3JCQiMGxdaCMpXDhtIyEjNyQiMFRKXjUlR25QISM2NyQkIjAiXGhKZ0xoRSEjNyQiL2AlKj46b3ZQISM1NyQ3JCQiMGpFdT9IOG0jISM3JCIweD5lbEMoelAhIzY3JCQiMCJcaEpnTGhFISM3JCIvYCUqPjpvdlAhIzU3JDckJCIwakV1P0g4bSMhIzckIjB4PmVsQyh6UCEjNjckJCIwaXMmZWBKaEUhIzckIjBYVnhOKT0peSQhIzY3JDckJCIwXnZHbjM4bSMhIzckIjA4M2w/bEB6JCEjNjckJCIwaXMmZWBKaEUhIzckIjBYVnhOKT0peSQhIzY3JDckJCIwXnZHbjM4bSMhIzckIjA4M2w/bEB6JCEjNjckJCIvOytzWkhoRSEjNiQiMG52Iz1ccCtRISM2NyQ3JCQiMGswREEpR2hFISM3JCIwXCc+ZGRnL1EhIzY3JCQiLzsrc1pIaEUhIzYkIjBudiM9XHArUSEjNjckNyQkIjBrMERBKUdoRSEjNyQiMFwnPmRkZy9RISM2NyQkIjAlNCkpcFVGaEUhIzckIjApPS0zNz84USEjNjckNyQkIjAsS2QmeUVoRSEjNyQiMCZbKXlJWXEiUSEjNjckJCIwJTQpKXBVRmhFISM3JCIwKT0tMzc/OFEhIzY3JDckJCIwLEtkJnlFaEUhIzckIjAmWyl5SVlxIlEhIzY3JCQiMDRBRSZRRGhFISM3JCIwI0dtRHNxRFEhIzY3JDckJCIwJ1xcc3ZDaEUhIzckIjBAdCZlb1tIUSEjNjckJCIwNEFFJlFEaEUhIzckIjAjR21Ec3FEUSEjNjckNyQkIjAnXFxzdkNoRSEjNyQiMEB0JmVvW0hRISM2NyQkIjBRZixfTDdtIyEjNyQiMC80OShIQFFRISM2NyQ3JCQiMEIlSHN0QWhFISM3JCIwZGgjNHUjPiVRISM2NyQkIjBRZixfTDdtIyEjNyQiMC80OShIQFFRISM2NyQ3JCQiMEIlSHN0QWhFISM3JCIwZGgjNHUjPiVRISM2NyQkIjBRTjRGODdtIyEjNyQiME9hLVg9MiZRISM2NyQ3JCQiMChHL2FzP2hFISM3JCIwJCpcKmZ6T2FRISM2NyQkIjBRTjRGODdtIyEjNyQiME9hLVg9MiZRISM2NyQ3JCQiMChHL2FzP2hFISM3JCIwJCpcKmZ6T2FRISM2NyQkIjBWNHE1JD5oRSEjNyQiMGYmZmJPQWpRISM2NyQ3JCQiMCpbQT9zPWhFISM3JCIwSFExXjNvJ1EhIzY3JCQiMFY0cTUkPmhFISM3JCIwZiZmYk9BalEhIzY3JDckJCIwKltBP3M9aEUhIzckIjBIUTFeM28nUSEjNjckJCIwQTp4LXQ2bSMhIzckIjBDcCYqZUdkKFEhIzY3JDckJCIwJXl0cHM7aEUhIzckIjBsRTgxXCN6USEjNjckJCIwQTp4LXQ2bSMhIzckIjBDcCYqZUdkKFEhIzY3JDckJCIwJXl0cHM7aEUhIzckIjBsRTgxXCN6USEjNjckJCIwKjMiPi5gNm0jISM3JCIwbk9lREwjKSlRISM2NyQ3JCQiMF5IMVNaNm0jISM3JCIwLDo/aCpvIipRISM2NyQkIjAqMyI+LmA2bSMhIzckIjBuT2VETCMpKVEhIzY3JDckJCIwXkgxU1o2bSMhIzckIjAsOj9oKm8iKlEhIzY3JCQiMGEheT5KOGhFISM3JCIwXjJRbFAyIVIhIzY3JDckJCIwYV1aaEY2bSMhIzckIjBQLkY7SVQhUiEjNjckJCIwYSF5Pko4aEUhIzckIjBeMlFsUDIhUiEjNjckNyQkIjBhXVpoRjZtIyEjNyQiMFAuRjtJVCFSISM2NyQkIi8+LCJIODZtIyEjNiQiMC8kWyV5VEsiUiEjNjckNyQkIjBcZjAiejVoRSEjNyQiMHQiUjgyZDtSISM2NyQkIi8+LCJIODZtIyEjNiQiMC8kWyV5VEsiUiEjNjckNyQkIjBcZjAiejVoRSEjNyQiMHQiUjgyZDtSISM2NyQkIjBYRWlhJDRoRSEjNyQiMGJxZWtYZCNSISM2NyQ3JCQiMFclNCpHKTNoRSEjNyQiMDQhM2s3LEhSISM2NyQkIjBYRWlhJDRoRSEjNyQiMGJxZWtYZCNSISM2NyQ3JCQiMFclNCpHKTNoRSEjNyQiMDQhM2s3LEhSISM2NyQkIjBUd1UpUTJoRSEjNyQiMExdO0NcI1FSISM2NyQ3JCQiMFJQKVsobzVtIyEjNyQiMFhvWiI9WFRSISM2NyQkIjBUd1UpUTJoRSEjNyQiMExdO0NcI1FSISM2NyQ3JCQiMFJQKVsobzVtIyEjNyQiMFhvWiI9WFRSISM2NyQkIi9Fcy9WMGhFISM2JCIwaElLZF8yJlIhIzY3JDckJCIwMSlcIUhcNW0jISM3JCIwIm9YbEIqUSZSISM2NyQkIi9Fcy9WMGhFISM2JCIwaElLZF8yJlIhIzY3JDckJCIwMilcIUhcNW0jISM3JCIwIm9YbEIqUSZSISM2NyQkIjA0JFE0Wy5oRSEjNyQiMHkieU1jRGpSISM2NyQ3JCQiMCRcUTkqSDVtIyEjNyQiMDxYaCJITG1SISM2NyQkIjA0JFE0Wy5oRSEjNyQiMHkieU1jRGpSISM2NyQ3JCQiMCRcUTkqSDVtIyEjNyQiMDxYaCJITG1SISM2NyQkIjBFOl9SOjVtIyEjNyQiMCkpZmdWZWQoUiEjNjckNyQkIjAlZUI9MSxoRSEjNyQiMGBMb1l0KHlSISM2NyQkIjBFOl9SOjVtIyEjNyQiMCkpZmdWZWQoUiEjNjckNyQkIjAlZUI9MSxoRSEjNyQiMGBMb1l0KHlSISM2NyQkIjAjKkdXMScqNG0jISM3JCIwR3oqcDRFKSlSISM2NyQ3JCQiMEZlXFMiKjRtIyEjNyQiMCo9XzxTQCIqUiEjNjckJCIwIypHVzEnKjRtIyEjNyQiMEd6KnA0RSkpUiEjNjckNyQkIjBGZVxTIio0bSMhIzckIjAqPV88U0AiKlIhIzY3JCQiMChbYjtvKDRtIyEjNyQiMFZXIVFLdytTISM2NyQ3JCQiMEhHQkZzNG0jISM3JCIwRDUjb1hsLlMhIzY3JCQiMChbYjtvKDRtIyEjNyQiMFZXIVFLdytTISM2NyQ3JCQiMEhHQkZzNG0jISM3JCIwRDUjb1hsLlMhIzY3JCQiMFVVJFx3JjRtIyEjNyQiMDNzdUNsSywlISM2NyQ3JCQiL0w+P0smNG0jISM2JCIwaCkqKT1eNDtTISM2NyQkIjBVVSRcdyY0bSMhIzckIjAzc3VDbEssJSEjNjckNyQkIi9MPj9LJjRtIyEjNiQiMGgpKik9XjQ7UyEjNjckJCIwKTQxbSZRNG0jISM3JCIwKCp5eClwd0RTISM2NyQ3JCQiMEh3KFxVJDRtIyEjNyQiMClwZXBjYEdTISM2NyQkIjApNDFtJlE0bSMhIzckIjAoKnl4KXB3RFMhIzY3JDckJCIwSHcoXFUkNG0jISM3JCIwKXBlcGNgR1MhIzY3JCQiME5aTGM+NG0jISM3JCIwNlwocCVvI1FTISM2NyQ3JCQiL3JTZmAiNG0jISM2JCIwTXYtQXc0LyUhIzY3JCQiME5aTGM+NG0jISM3JCIwNlwocCVvI1FTISM2NyQ3JCQiL3JTZmAiNG0jISM2JCIwTXYtQXc0LyUhIzY3JCQiMCdlelQxITRtIyEjNyQiMHZ3OXBwMjAlISM2NyQ3JCQiMEMmcFtsKjNtIyEjNyQiL1AnNHg7TTAlISM1NyQkIjAnZXpUMSE0bSMhIzckIjB2dzlwcDIwJSEjNjckNyQkIjBDJnBbbCozbSMhIzckIi9QJzR4O00wJSEjNTckJCIwNiQ+LT0pM20jISM3JCIwdVIvbHFLMSUhIzY3JDckJCIwJSpmKD15KDNtIyEjNyQiMDFfO0tkZTElISM2NyQkIjA2JD4tPSkzbSMhIzckIjB1Ui9scUsxJSEjNjckNyQkIjAlKmYoPXkoM20jISM3JCIwMV87S2RlMSUhIzY3JCQiLygqXFdJJzNtIyEjNiQiL1d3WTh4dlMhIzU3JDckJCIwRG4mcCJmM20jISM3JCIwVVNCKHlIeVMhIzY3JCQiLygqXFdJJzNtIyEjNiQiL1d3WTh4dlMhIzU3JDckJCIwRG4mcCJmM20jISM3JCIwVVNCKHlIeVMhIzY3JCQiMHUkW25WJTNtIyEjNyQiLzJTJXlyIykzJSEjNTckNyQkIjA6LicqZlMzbSMhIzckIjB5R0lVUTI0JSEjNjckJCIwdSRbblYlM20jISM3JCIvMlMleXIjKTMlISM1NyQ3JCQiMDouJypmUzNtIyEjNyQiMHlHSVVRMjQlISM2NyQkIjBNKHpxZCMzbSMhIzckIjA8a1cnPngrVCEjNjckNyQkIjBCLyU0QCMzbSMhIzckIjA5PFAoKnlKNSUhIzY3JCQiME0oenFkIzNtIyEjNyQiMDxrVyc+eCtUISM2NyQ3JCQiMEIvJTRAIzNtIyEjNyQiMDk8UCgqeUo1JSEjNjckJCIwX3BoRDIzbSMhIzckIjB5NTkpPUY4VCEjNjckNyQkIjAmNGEqcC4zbSMhIzckIi9iU0MmPmM2JSEjNTckJCIwX3BoRDIzbSMhIzckIjB5NTkpPUY4VCEjNjckNyQkIjAmNGEqcC4zbSMhIzckIi9iU0MmPmM2JSEjNTckJCIwYno8IykpeWdFISM3JCIwZHk1YXJkNyUhIzY3JDckJCIwJEgxcGB5Z0UhIzckIjAnUTR2KzFHVCEjNjckJCIwYno8IykpeWdFISM3JCIwZHk1YXJkNyUhIzY3JDckJCIwJEgxcGB5Z0UhIzckIjAnUTR2KzFHVCEjNjckJCIwWE5tWXEybSMhIzckIjBPW20lNEZRVCEjNjckNyQkIi8xcTtyd2dFISM2JCIwQSN5RDFdU1QhIzY3JCQiMFhObVlxMm0jISM3JCIwT1ttJTRGUVQhIzY3JDckJCIvMXE7cndnRSEjNiQiMEEjeUQxXVNUISM2NyQkIjAuNko+XzJtIyEjNyQiMGQzMDRxMjolISM2NyQ3JCQiMEtuWCUqWzJtIyEjNyQiMGVxazxUSDolISM2NyQkIjAuNko+XzJtIyEjNyQiMGQzMDRxMjolISM2NyQ3JCQiMEtuWCUqWzJtIyEjNyQiMGVxazxUSDolISM2NyQkIjBaIm8qKlJ0Z0UhIzckIjBaW3YoKm9LOyUhIzY3JDckJCIwYUA5JjN0Z0UhIzckIjAlKmVycyJRbFQhIzY3JCQiMFoibyoqUnRnRSEjNyQiMFpbdigqb0s7JSEjNjckNyQkIjBhQDkmM3RnRSEjNyQiMCUqZXJzIlFsVCEjNjckJCIwS29dKWVyZ0UhIzckIi91Jz1obmQ8JSEjNTckNyQkIi95Qk9HcmdFISM2JCIvdCV5RkF5PCUhIzU3JCQiMEtvXSllcmdFISM3JCIvdSc9aG5kPCUhIzU3JDckJCIveUJPR3JnRSEjNiQiL3QleUZBeTwlISM1NyQkIjAoZiU+JnlwZ0UhIzckIjAqKiopWylmRSk9JSEjNjckNyQkIjAyIj4sXHBnRSEjNyQiMG1OJkdHRSE+JSEjNjckJCIwKGYlPiZ5cGdFISM3JCIwKioqKVspZkUpPSUhIzY3JDckJCIwMiI+LFxwZ0UhIzckIjBtTiZHR0UhPiUhIzY3JCQiMHRPdiopejFtIyEjNyQiMCJHXzBUdytVISM2NyQ3JCQiMDQrUy94MW0jISM3JCIwLUMjekxxLVUhIzY3JCQiMHRPdiopejFtIyEjNyQiMCJHXzBUdytVISM2NyQ3JCQiMDQrUy94MW0jISM3JCIwLUMjekxxLVUhIzY3JCQiL3UrQT9tZ0UhIzYkIjAvSksoPkU4VSEjNjckNyQkIjAibzlrI2YxbSMhIzckIjBRNypIUjk6VSEjNjckJCIvdStBP21nRSEjNiQiMC9KSyg+RThVISM2NyQ3JCQiMCJvOWsjZjFtIyEjNyQiMFE3KkhSOTpVISM2NyQkIjA+NmhBVzFtIyEjNyQiMFsqZiZlZmRBJSEjNjckNyQkIi4kSGo6a2dFISM1JCIwdSsxWyVlRlUhIzY3JCQiMD42aEFXMW0jISM3JCIwWypmJmVmZEElISM2NyQ3JCQiLiRIajprZ0UhIzUkIjB1KzFbJWVGVSEjNjckJCIwKEhENWxpZ0UhIzckIjAtSTglcERRVSEjNjckNyQkIjAmeSc0JVJpZ0UhIzckIi8iKkdKXS1TVSEjNTckJCIwKEhENWxpZ0UhIzckIjAtSTglcERRVSEjNjckNyQkIjAmeSc0JVJpZ0UhIzckIi8iKkdKXS1TVSEjNTckJCIwOidvcykzMW0jISM3JCIwJkgtWVN2XVUhIzY3JDckJCIvajMnUjExbSMhIzYkIjBZeD5lbENEJSEjNjckJCIwOidvcykzMW0jISM3JCIwJkgtWVN2XVUhIzY3JDckJCIvajMnUjExbSMhIzYkIjBZeD5lbENEJSEjNjckJCIwUHJOSiJmZ0UhIzckIjBBaiIqKjNEalUhIzY3JDckJCIwWCdmRyopZWdFISM3JCIwI2VtS2ghXEUlISM2NyQkIjBQck5KImZnRSEjNyQiMEFqIioqM0RqVSEjNjckNyQkIjBYJ2ZHKillZ0UhIzckIjAjZW1LaCFcRSUhIzY3JCQiMG1eRyRRZGdFISM3JCIwXEw0XVpkRiUhIzY3JDckJCIwalklUTpkZ0UhIzckIjA9YUxvWXRGJSEjNjckJCIwbV5HJFFkZ0UhIzckIjBcTDRdWmRGJSEjNjckNyQkIjBqWSVROmRnRSEjNyQiMD1hTG9ZdEYlISM2NyQkIjApKXA8VmMwbSMhIzckIi8nW3QlUUMpRyUhIzU3JDckJCIwWShwRVViZ0UhIzckIjBhVVNCKHkqRyUhIzY3JCQiMCkpcDxWYzBtIyEjNyQiLydbdCVRQylHJSEjNTckNyQkIjBZKHBFVWJnRSEjNyQiMGFVU0IoeSpHJSEjNjckJCIvJCpcMiJSMG0jISM2JCIwSnN1JSpSMkklISM2NyQ3JCQiMGo1NCpwYGdFISM3JCIvNHQleUZBSSUhIzU3JCQiLyQqXDIiUjBtIyEjNiQiMEpzdSUqUjJJJSEjNjckNyQkIjBqNTQqcGBnRSEjNyQiLzR0JXlGQUklISM1NyQkIjAiKXpGJz1fZ0UhIzckIjBIPkR6TktKJSEjNjckNyQkIjBGSU8kKT4wbSMhIzckIjBFPmFMb1lKJSEjNjckJCIwIil6Ric9X2dFISM3JCIwSD5Eek5LSiUhIzY3JDckJCIwRklPJCk+MG0jISM3JCIwRT5hTG9ZSiUhIzY3JCQiMF9iaXAvMG0jISM3JCIwOFBvUUpkSyUhIzY3JDckJCIwOVtMdi0wbSMhIzckIjBqMmgpKTNySyUhIzY3JCQiMF9iaXAvMG0jISM3JCIwOFBvUUpkSyUhIzY3JDckJCIwOVtMdi0wbSMhIzckIjBqMmgpKTNySyUhIzY3JCQiMGgoUTF3W2dFISM3JCIwLWdgdEUjUVYhIzY3JDckJCIwLDgoW2RbZ0UhIzckIjAqZnpPJVwmUlYhIzY3JCQiMGgoUTF3W2dFISM3JCIwLWdgdEUjUVYhIzY3JDckJCIwLDgoW2RbZ0UhIzckIjAqZnpPJVwmUlYhIzY3JCQiMEhfV2ZxL20jISM3JCIwI2UqUiQ9c11WISM2NyQ3JCQiMCYzK0Apby9tIyEjNyQiME4lWygpKiopPk4lISM2NyQkIjBIX1dmcS9tIyEjNyQiMCNlKlIkPXNdViEjNjckNyQkIjAmMytAKW8vbSMhIzckIjBOJVsoKSoqKT5OJSEjNjckJCIwUjgvbWAvbSMhIzckIjBgZ0dvO0tPJSEjNjckNyQkIjB1Qi4oPlhnRSEjNyQiMHJzIlEwVmtWISM2NyQkIjBSOC9tYC9tIyEjNyQiMGBnR287S08lISM2NyQ3JCQiMHVCLig+WGdFISM3JCIwcnMiUTBWa1YhIzY3JCQiMC5ISSFvVmdFISM3JCIwPE9mRzZkUCUhIzY3JDckJCIwKCk9XT5OL20jISM3JCIwMmgpKTNyb1AlISM2NyQkIjAuSEkhb1ZnRSEjNyQiMDxPZkc2ZFAlISM2NyQ3JCQiMCgpPV0+Ti9tIyEjNyQiMDJoKSkzcm9QJSEjNjckJCIvPUpCK1VnRSEjNiQiMCplKCpSYz8pUSUhIzY3JDckJCIwYWhtXD0vbSMhIzckIjBWXCZSO0oqUSUhIzY3JCQiLz1KQitVZ0UhIzYkIjAqZSgqUmM/KVElISM2NyQ3JCQiMGFobVw9L20jISM3JCIwVlwmUjtKKlElISM2NyQkIjBtJlxATFNnRSEjNyQiMGNIVXUqcCtXISM2NyQ3JCQiMFR4XSg9U2dFISM3JCIwelAtPl88UyUhIzY3JCQiMG0mXEBMU2dFISM3JCIwY0hVdSpwK1chIzY3JDckJCIwVHhdKD1TZ0UhIzckIjB6UC0+XzxTJSEjNjckJCIwdiJvJXAnUWdFISM3JCIwQCMqemckPjhXISM2NyQ3JCQiMG4udUsmUWdFISM3JCIwOkU0dSM+OVchIzY3JCQiMHYibyVwJ1FnRSEjNyQiMEAjKnpnJD44VyEjNjckNyQkIjBuLnVLJlFnRSEjNyQiMDpFNHUjPjlXISM2NyQkIjAjPlVYLFBnRSEjNyQiMFgiM0Jzb0RXISM2NyQ3JCQiMDBUbCYpby5tIyEjNyQiMF45O0hMbVUlISM2NyQkIjAjPlVYLFBnRSEjNyQiMFgiM0Jzb0RXISM2NyQ3JCQiMDBUbCYpby5tIyEjNyQiMF45O0hMbVUlISM2NyQkIjAzN1JuYC5tIyEjNyQiMDRwKSllIT1RVyEjNjckNyQkIjA4SEFZXy5tIyEjNyQiMChHSVVRMlJXISM2NyQkIjAzN1JuYC5tIyEjNyQiMDRwKSllIT1RVyEjNjckNyQkIjA4SEFZXy5tIyEjNyQiMChHSVVRMlJXISM2NyQkIi9qOHhzTGdFISM2JCIwZkRdcnQxWCUhIzY3JDckJCIwaTA8OU8ubSMhIzckIjBCIipIUjk6WCUhIzY3JCQiL2o4eHNMZ0UhIzYkIjBmRF1ydDFYJSEjNjckNyQkIjBpMDw5Ty5tIyEjNyQiMEIiKkhSOTpYJSEjNjckJCIwKlsieSY0S2dFISM3JCIwVEdHZm1KWSUhIzY3JDckJCIwWnh4Kik+Lm0jISM3JCIwZnpPJVwmUlklISM2NyQkIjAqWyJ5JjRLZ0UhIzckIjBUR0dmbUpZJSEjNjckNyQkIjBaeHgqKT4ubSMhIzckIjBmek8lXCZSWSUhIzY3JCQiMEpMS3IvLm0jISM3JCIwZSIpNEJmY1olISM2NyQ3JCQiMCopUndzLi5tIyEjNyQiMCZ6TyVcJlJ3VyEjNjckJCIwSkxLci8ubSMhIzckIjBlIik0QmZjWiUhIzY3JDckJCIwKilSd3MuLm0jISM3JCIwJnpPJVwmUndXISM2NyQkIjBXPGhhKUdnRSEjNyQiL1p1Pzs6KVslISM1NyQ3JCQiLz0kUmooR2dFISM2JCIwSmNdL08pKVslISM2NyQkIjBXPGhhKUdnRSEjNyQiL1p1Pzs6KVslISM1NyQ3JCQiLz0kUmooR2dFISM2JCIwSmNdL08pKVslISM2NyQkIjBoWk5Ycy1tIyEjNyQiMGJ6OXhWMV0lISM2NyQ3JCQiMCp5IlJoci1tIyEjNyQiMG5XZGZ3N10lISM2NyQkIjBoWk5Ycy1tIyEjNyQiMGJ6OXhWMV0lISM2NyQ3JCQiMCp5IlJoci1tIyEjNyQiMG5XZGZ3N10lISM2NyQkIjBXaCRRa0RnRSEjNyQiMFYoM3VjODhYISM2NyQ3JCQiMEN0LW5iLW0jISM3JCIwLkxrOTxQXiUhIzY3JCQiMFdoJFFrRGdFISM3JCIwVigzdWM4OFghIzY3JDckJCIwQ3QtbmItbSMhIzckIjAuTGs5PFBeJSEjNjckJCIwIj1AJ1xTLW0jISM3JCIwPTJETUZjXyUhIzY3JDckJCIwKFF2KXpSLW0jISM3JCIwUkBycGRoXyUhIzY3JCQiMCI9QCdcUy1tIyEjNyQiMD0yRE1GY18lISM2NyQ3JCQiMChRdil6Ui1tIyEjNyQiMFJAcnBkaF8lISM2NyQkIjBeJkhKWUFnRSEjNyQiMCo+R2ooPSJRWCEjNjckNyQkIjA+V04rQy1tIyEjNyQiMHY0eUMpZlFYISM2NyQkIjBeJkhKWUFnRSEjNyQiMCo+R2ooPSJRWCEjNjckNyQkIjA+V04rQy1tIyEjNyQiMHY0eUMpZlFYISM2NyQkIi8pUjIlKTMtbSMhIzYkIjA+QmMlKjQxYiUhIzY3JDckJCIwYCh5IkczLW0jISM3JCIwNilcKXpRNWIlISM2NyQkIi8pUjIlKTMtbSMhIzYkIjA+QmMlKjQxYiUhIzY3JDckJCIwYCh5IkczLW0jISM3JCIwNilcKXpRNWIlISM2NyQkIjBrRWY3JD5nRSEjNyQiMGMqNCYpMzVqWCEjNjckNyQkIjB6a1tqIz5nRSEjNyQiMFonPVwkek1jJSEjNjckJCIwa0VmNyQ+Z0UhIzckIjBjKjQmKTM1alghIzY3JDckJCIwemtbaiM+Z0UhIzckIjBaJz1cJHpNYyUhIzY3JCQiMEojUSZbeCxtIyEjNyQiMF5Pa2UiZnZYISM2NyQ3JCQiMHI3ODF4LG0jISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMEojUSZbeCxtIyEjNyQiMF5Pa2UiZnZYISM2NyQ3JCQiMHI3ODF4LG0jISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiL2EwPj47Z0UhIzYkIjAqKSl6XD8zKWUlISM2NyQ3JCQiMGUlM2g6O2dFISM3JCIwPmowWGckKWUlISM2NyQkIi9hMD4+O2dFISM2JCIwKikpelw/MyllJSEjNjckNyQkIjBlJTNoOjtnRSEjNyQiMD5qMFhnJCllJSEjNjckJCIwYVgkR2s5Z0UhIzckIjApKSlwcUFkK1khIzY3JDckJCIvPmJOaDlnRSEjNiQiMGJeNyssM2clISM2NyQkIjBhWCRHazlnRSEjNyQiMCkpKXBxQWQrWSEjNjckNyQkIi8+Yk5oOWdFISM2JCIwYl43KywzZyUhIzY3JCQiLzR1NjU4Z0UhIzYkIjAxJSlSRGlJaCUhIzY3JDckJCIwUSVIJHlJLG0jISM3JCIwIipSPmJUS2glISM2NyQkIi80dTY1OGdFISM2JCIwMSUpUkRpSWglISM2NyQ3JCQiMFElSCR5SSxtIyEjNyQiMCIqUj5iVEtoJSEjNjckJCIwLVIjcGM2Z0UhIzckIjBKaScqKj5iRFkhIzY3JDckJCIwTC1VXTosbSMhIzckIjBHR0U1I29EWSEjNjckJCIwLVIjcGM2Z0UhIzckIjBKaScqKj5iRFkhIzY3JDckJCIwTC1VXTosbSMhIzckIjBHR0U1I29EWSEjNjckJCIwd1UyUyssbSMhIzckIjA3WCEzOi9RWSEjNjckNyQkIjAsJEgpSCssbSMhIzckIjBrO0xsQSJRWSEjNjckJCIwd1UyUyssbSMhIzckIjA3WCEzOi9RWSEjNjckNyQkIjAsJEgpSCssbSMhIzckIjBrO0xsQSJRWSEjNjckJCIwPEB4PyYzZ0UhIzckIjAxQVd4STBsJSEjNjckNyQkIjAqRydwOyYzZ0UhIzckIi4wUz9qMGwlISIqNyQkIjA8QHg/JjNnRSEjNyQiMDFBV3hJMGwlISM2NyQ3JCQiMCpHJ3A7JjNnRSEjNyQiLjBTP2owbCUhIio3JCQiME1uUTR2K20jISM3JCIwJm83WFMpKWVZISM2NyQ3JCQiMCg9XCR6TXltIyEjNyQiMF9hS1dHbUAiISM2NyQkIjBiaygpKlttbkUhIzckIjBfPFNAcnBAIiEjNjckNyQkIjBiaygpKlttbkUhIzckIjBfPFNAcnBAIiEjNjckJCIwXyhlVUltbkUhIzckIi89KVwjPl88NyEjNTckNyQkIjAiKVwiKT1Bd20jISM3JCIwKWVxazxUSDchIzY3JCQiMF8oZVVJbW5FISM3JCIvPSlcIz5fPDchIzU3JDckJCIwIilcIik9QXdtIyEjNyQiMCllcWs8VEg3ISM2NyQkIjAqKilScyk+d20jISM3JCIwIjN6KSozNUk3ISM2NyQ3JCQiMCdbNzwnenZtIyEjNyQiMEMlUjpCJj1DIiEjNjckJCIwKiopUnMpPndtIyEjNyQiMCIzeikqMzVJNyEjNjckNyQkIjAnWzc8J3p2bSMhIzckIjBDJVI6QiY9QyIhIzY3JCQiMExbaSVvZG5FISM3JCIwTVwyVHpFQyIhIzY3JDckJCIvQXMjPVB2bSMhIzYkIi9FM21HSGE3ISM1NyQkIjBMW2klb2RuRSEjNyQiME1cMlR6RUMiISM2NyQ3JCQiL0FzIz1Qdm0jISM2JCIvRTNtR0hhNyEjNTckJCIwLWA1J1JgbkUhIzckIjBRVDJaZF9EIiEjNjckNyQkIjBvZ2kpW1xuRSEjNyQiMCc0eDtNdG03ISM2NyQkIjAtYDUnUmBuRSEjNyQiMFFUMlpkX0QiISM2NyQ3JCQiMG9naSlbXG5FISM3JCIwJzR4O010bTchIzY3JCQiMCY0KnpAIlxuRSEjNyQiMDAhKlwyTnlFIiEjNjckNyQkIjBsaWdzX3VtIyEjNyQiMEtmdSdSPHo3ISM2NyQkIjAmNCp6QCJcbkUhIzckIjAwISpcMk55RSIhIzY3JDckJCIwbGlnc191bSMhIzckIjBLZnUnUjx6NyEjNjckJCIwajNjaFt1bSMhIzckIi9mOkdBVCFHIiEjNTckNyQkIjBEZ0BxNXVtIyEjNyQiMG9aIj1YaCJIIiEjNjckJCIwajNjaFt1bSMhIzckIi9mOkdBVCFHIiEjNTckNyQkIjBEZ0BxNXVtIyEjNyQiMG9aIj1YaCJIIiEjNjckJCIwWGZNOjF1bSMhIzckIi5yOyQqKSlISCIhIio3JDckJCIwQl9hIilvdG0jISM3JCIwL08pb10wLzghIzY3JCQiMFhmTToxdW0jISM3JCIucjskKikpSEgiISIqNyQ3JCQiMEJfYSIpb3RtIyEjNyQiMC9PKW9dMC84ISM2NyQkIi9SM0xRT25FISM2JCIvZWYhPWxiSSIhIzU3JDckJCIwWUlNMUZ0bSMhIzckIi9XXz5jXDs4ISM1NyQkIi9SM0xRT25FISM2JCIvZWYhPWxiSSIhIzU3JDckJCIwWUlNMUZ0bSMhIzckIi9XXz5jXDs4ISM1NyQkIjA0PDdsQHRtIyEjNyQiMC4qUiYpNDk9OCEjNjckNyQkIjA7WHBXJkduRSEjNyQiMHc3LTxPKkc4ISM2NyQkIjA0PDdsQHRtIyEjNyQiMC4qUiYpNDk9OCEjNjckNyQkIjA7WHBXJkduRSEjNyQiMHc3LTxPKkc4ISM2NyQkIjApSEU0J3pzbSMhIzckIjAlKnk6TTsyTCIhIzY3JDckJCIvRXVrUkNuRSEjNiQiMDcsNHN3OE0iISM2NyQkIjApSEU0J3pzbSMhIzckIjAlKnk6TTsyTCIhIzY3JDckJCIvRXVrUkNuRSEjNiQiMDcsNHN3OE0iISM2NyQkIjAvOmJxUHNtIyEjNyQiMFwyWUQiSFY4ISM2NyQ3JCQiMG52eGgtc20jISM3JCIwWyplcnMiUU4iISM2NyQkIjAvOmJxUHNtIyEjNyQiMFwyWUQiSFY4ISM2NyQ3JCQiMG52eGgtc20jISM3JCIwWyplcnMiUU4iISM2NyQkIjBcQDYlZj5uRSEjNyQiL0ghM3NsZU4iISM1NyQ3JCQiMHloZVNocm0jISM3JCIwJnlGQXlEbTghIzY3JCQiMFxANiVmPm5FISM3JCIvSCEzc2xlTiIhIzU3JDckJCIweWhlU2hybSMhIzckIjAmeUZBeURtOCEjNjckJCIwQmFoSmFybSMhIzckIjBuTSpSKFIlbzghIzY3JDckJCIwXyRmRS43bkUhIzckIjBAbUhQKXB5OCEjNjckJCIwQmFoSmFybSMhIzckIjBuTSpSKFIlbzghIzY3JDckJCIwXyRmRS43bkUhIzckIjBAbUhQKXB5OCEjNjckJCIwI1xrRkc2bkUhIzckIjBrPzpLODVRIiEjNjckNyQkIjAlZSgzUXpxbSMhIzckIjBkYU8jKlE2UiIhIzY3JCQiMCNca0ZHNm5FISM3JCIwaz86Szg1USIhIzY3JDckJCIwJWUoM1F6cW0jISM3JCIwZGFPIypRNlIiISM2NyQkIjBqUGtacnFtIyEjNyQiMEhhR1knZSRSIiEjNjckNyQkIjAmPUVvJlFxbSMhIzckIjAkSE11JXpOUyIhIzY3JCQiMGpQa1pycW0jISM3JCIwSGFHWSdlJFIiISM2NyQ3JCQiMCY9RW8mUXFtIyEjNyQiMCRITXUlek5TIiEjNjckJCIwI29saS0ubkUhIzckIi9tYGoiZmhTIiEjNTckNyQkIjB6LiopKXkqcG0jISM3JCIwSEpdLT9nVCIhIzY3JCQiMCNvbGktLm5FISM3JCIvbWBqImZoUyIhIzU3JDckJCIwei4qKSl5KnBtIyEjNyQiMEhKXS0/Z1QiISM2NyQkIjAnWzonPSopcG0jISM3JCIwJTQvQzl0PTkhIzY3JDckJCIwUCNbVHQmcG0jISM3JCIwbD5kZGclRzkhIzY3JCQiMCdbOic9KilwbSMhIzckIjAlNC9DOXQ9OSEjNjckNyQkIjBQI1tUdCZwbSMhIzckIjBsPmRkZyVHOSEjNjckJCIwVEtfQ1twbSMhIzckIjA3OylcS0lKOSEjNjckNyQkIjAiSGJEcCJwbSMhIzckIjAsM2s3LDRXIiEjNjckJCIwVEtfQ1twbSMhIzckIjA3OylcS0lKOSEjNjckNyQkIjAiSGJEcCJwbSMhIzckIjAsM2s3LDRXIiEjNjckJCIwejksVzJwbSMhIzckIjBvUixrdVFXIiEjNjckNyQkIjA7QURrd29tIyEjNyQiMFAnNHg7TWA5ISM2NyQkIjB6OSxXMnBtIyEjNyQiMG9SLGt1UVciISM2NyQ3JCQiMDtBRGt3b20jISM3JCIwUCc0eDtNYDkhIzY3JCQiMGUmNHJuJ29tIyEjNyQiMEdxU2ZYa1giISM2NyQ3JCQiLy9MIVxPb20jISM2JCIwdCV5RkF5bDkhIzY3JCQiMGUmNHJuJ29tIyEjNyQiMEdxU2ZYa1giISM2NyQ3JCQiLy9MIVxPb20jISM2JCIwdCV5RkF5bDkhIzY3JCQiMFsoPVBpI29tIyEjNyQiMGx0WjY7IXA5ISM2NyQ3JCQiMCYqKTNva3ptRSEjNyQiMDR0JXlGQXk5ISM2NyQkIjBbKD1QaSNvbSMhIzckIjBsdFo2OyFwOSEjNjckNyQkIjAmKikzb2t6bUUhIzckIjA0dCV5RkF5OSEjNjckJCIwRU12JGV5bUUhIzckIjBEJipcPydlIlsiISM2NyQ3JCQiMDBgc2Rjbm0jISM3JCIwWGgiSExtIVwiISM2NyQkIjBFTXYkZXltRSEjNyQiMEQmKlw/J2UiWyIhIzY3JDckJCIwMGBzZGNubSMhIzckIjBYaCJITG0hXCIhIzY3JCQiMHgpKj1kWG5tIyEjNyQiMFgmXGxlOiVcIiEjNjckNyQkIjAxO2sib3JtRSEjNyQiMCIpXCl6UTUuOiEjNjckJCIweCkqPWRYbm0jISM3JCIwWCZcbGU6JVwiISM2NyQ3JCQiMDE7ayJvcm1FISM3JCIwIilcKXpRNS46ISM2NyQkIjBbJlJUYXFtRSEjNyQiMCQzcSM0RG5dIiEjNjckNyQkIjBIYWM9eG1tIyEjNyQiMDxRMFZXYl4iISM2NyQkIjBbJlJUYXFtRSEjNyQiMCQzcSM0RG5dIiEjNjckNyQkIjBIYWM9eG1tIyEjNyQiMDxRMFZXYl4iISM2NyQkIjBvN1JXbG1tIyEjNyQiL0NRJCpRSD46ISM1NyQ3JCQiMG5cXW9QbW0jISM3JCIwYEU3KVwpel8iISM2NyQkIjBvN1JXbG1tIyEjNyQiL0NRJCpRSD46ISM1NyQ3JCQiMG5cXW9QbW0jISM3JCIwYEU3KVwpel8iISM2NyQkIjBtIyopemJpbUUhIzckIjAzQWhFaT1gIiEjNjckNyQkIjBfXj1KKWZtRSEjNyQiMCpbIj5gRC9hIiEjNjckJCIwbSMqKXpiaW1FISM3JCIwM0FoRWk9YCIhIzY3JDckJCIwX149SilmbUUhIzckIjAqWyI+YEQvYSIhIzY3JCQiMGYmKnolZWVtRSEjNyQiMChlQDotVlc6ISM2NyQ3JCQiME8tIXAhZmxtIyEjNyQiMEQuRTNtR2IiISM2NyQkIjBmJip6JWVlbUUhIzckIjAoZUA6LVZXOiEjNjckNyQkIjBPLSFwIWZsbSMhIzckIjBELkUzbUdiIiEjNjckJCIwKDN0XGlhbUUhIzckIjAtQ2V0KCpwYiIhIzY3JDckJCIwKTMkUSYqPmxtIyEjNyQiMGgiSExtSWw6ISM2NyQkIjAoM3RcaWFtRSEjNyQiMC1DZXQoKnBiIiEjNjckNyQkIjApMyRRJio+bG0jISM3JCIwaCJITG1JbDohIzY3JCQiMDJ1R3kxbG0jISM3JCIuel0kW2NwOiEiKjckNyQkIjAjeURuNFttRSEjNyQiMCgqelI9WnhkIiEjNjckJCIwMnVHeTFsbSMhIzckIi56XSRbY3A6ISIqNyQ3JCQiMCN5RG40W21FISM3JCIwKCp6Uj1aeGQiISM2NyQkIjBfIXpadVltRSEjNyQiMFg0PV5KQGUiISM2NyQ3JCQiMGk0JzNAV21FISM3JCIwTG9ZdCg9IWYiISM2NyQkIjBfIXpadVltRSEjNyQiMFg0PV5KQGUiISM2NyQ3JCQiMGk0JzNAV21FISM3JCIwTG9ZdCg9IWYiISM2NyQkIjBqYltDR2ttIyEjNyQiMGs2W3cocCVmIiEjNjckNyQkIi47dFAua20jISM1JCIwcGNgR0dFZyIhIzY3JCQiMGpiW0NHa20jISM3JCIwazZbdyhwJWYiISM2NyQ3JCQiLjt0UC5rbSMhIzUkIjBwY2BHR0VnIiEjNjckJCIwKFFRcyIqUW1FISM3JCIwNCFcKmZqc2ciISM2NyQ3JCQiMEw/Rnhram0jISM3JCIwMFhnJClvXWgiISM2NyQkIjAoUVFzIipRbUUhIzckIjA0IVwqZmpzZyIhIzY3JDckJCIwTD9GeGtqbSMhIzckIjAwWGckKW9daCIhIzY3JCQiMExRLUJdam0jISM3JCIwI1FHOyFIKT47ISM2NyQ3JCQiMDwsWkhFam0jISM3JCIwVExuUTR2aSIhIzY3JCQiMExRLUJdam0jISM3JCIwI1FHOyFIKT47ISM2NyQ3JCQiMDwsWkhFam0jISM3JCIwVExuUTR2aSIhIzY3JCQiMHIqKSk9OUptRSEjNyQiMGUkbzhTUks7ISM2NyQ3JCQiMFRvWSV6R21FISM3JCIweEB1JCpcKlI7ISM2NyQkIjByKikpPTlKbUUhIzckIjBlJG84U1JLOyEjNjckNyQkIjBUb1klekdtRSEjNyQiMHhAdSQqXCpSOyEjNjckJCIwW0V6dHNpbSMhIzckIjApKTNJZmVcayIhIzY3JDckJCIwOFIlPihcaW0jISM3JCIwOTUiKVshUl87ISM2NyQkIjBbRXp0c2ltIyEjNyQiMCkpM0lmZVxrIiEjNjckNyQkIjA4UiU+KFxpbSMhIzckIjA5NSIpWyFSXzshIzY3JCQiMDhVZj1NaW0jISM3JCIwaXAoZUZfZDshIzY3JDckJCIwQE0mPjtAbUUhIzckIi8mKXpRNSRbbSIhIzU3JCQiMDhVZj1NaW0jISM3JCIwaXAoZUZfZDshIzY3JDckJCIwQE0mPjtAbUUhIzckIi8mKXpRNSRbbSIhIzU3JCQiMEBbR3cmPm1FISM3JCIwWFw3XiczcTshIzY3JDckJCIwOkhta3RobSMhIzckIjAnb1sqZXJzbiIhIzY3JCQiMEBbR3cmPm1FISM3JCIwWFw3XiczcTshIzY3JDckJCIwOkhta3RobSMhIzckIjAnb1sqZXJzbiIhIzY3JCQiMF9VJ3B1Om1FISM3JCIwJipbcyUpXEVvIiEjNjckNyQkIjBcNHR6TmhtIyEjNyQiMEF2LDk3KCpvIiEjNjckJCIwX1UncHU6bUUhIzckIjAmKltzJSlcRW8iISM2NyQ3JCQiMFw0dHpOaG0jISM3JCIwQXYsOTcoKm8iISM2NyQkIjBKOU5JPmhtIyEjNyQiLzJ5dkZAJnAiISM1NyQ3JCQiMCQ9PnQhKTRtRSEjNyQiMGVqM3BfQHEiISM2NyQkIjBKOU5JPmhtIyEjNyQiLzJ5dkZAJnAiISM1NyQ3JCQiMCQ9PnQhKTRtRSEjNyQiMGVqM3BfQHEiISM2NyQkIi92d203M21FISM2JCIvc1gqR3Z4cSIhIzU3JDckJCIvRilSWmdnbSMhIzYkIjAlPmJUS2Y5PCEjNjckJCIvdndtNzNtRSEjNiQiL3NYKkd2eHEiISM1NyQ3JCQiL0YpUlpnZ20jISM2JCIwJT5iVEtmOTwhIzY3JCQiMHZDeE5WZ20jISM3JCIwJm9sJFJQLnMiISM2NyQ3JCQiMGklKikpKkgtbUUhIzckIi8uQyN6THFzIiEjNTckJCIwdkN4TlZnbSMhIzckIjAmb2wkUlAucyIhIzY3JDckJCIwaSUqKSkqSC1tRSEjNyQiLy5DI3pMcXMiISM1NyQkIjAyYWlkMGdtIyEjNyQiMHotKSkzKipHdCIhIzY3JDckJCIwTDVxayYpZm0jISM3JCIwbUdITXUlUjwhIzY3JCQiMDJhaWQwZ20jISM3JCIwei0pKTMqKkd0IiEjNjckNyQkIjBMNXFrJilmbSMhIzckIjBtR0hNdSVSPCEjNjckJCIwciFvP3onZm0jISM3JCIwM2wtUWdhdSIhIzY3JDckJCIwKlszPiVbZm0jISM3JCIwLTxPKlsiPnYiISM2NyQkIjByIW8/eidmbSMhIzckIjAzbC1RZ2F1IiEjNjckNyQkIjAqWzM+JVtmbSMhIzckIjAtPE8qWyI+diIhIzY3JCQiMC0uS1JJZm0jISM3JCIwI1sqNEVAIWU8ISM2NyQ3JCQiMDlnTEo2Zm0jISM3JCIwUTBWV2JWdyIhIzY3JCQiMC0uS1JJZm0jISM3JCIwI1sqNEVAIWU8ISM2NyQ3JCQiMDlnTEo2Zm0jISM3JCIwUTBWV2JWdyIhIzY3JCQiL09MIipIKmVtIyEjNiQiMHNuKlE8ZXE8ISM2NyQ3JCQiMG92P0x1ZW0jISM3JCIwdSQqXCpmenc8ISM2NyQkIi9PTCIqSCplbSMhIzYkIjBzbipRPGVxPCEjNjckNyQkIjBvdj9MdWVtIyEjNyQiMHUkKlwqZnp3PCEjNjckJCIvQV47ZCZlbSMhIzYkIjBGbiY0PTkkeSIhIzY3JDckJCIwO2k/WlBlbSMhIzckIi9Ab1hsQip5IiEjNTckJCIvQV47ZCZlbSMhIzYkIjBGbiY0PTkkeSIhIzY3JDckJCIwO2k/WlBlbSMhIzckIi9Ab1hsQip5IiEjNTckJCIwWClIbSY9ZW0jISM3JCIwVj0xWyxkeiIhIzY3JDckJCIwJz5xTTIhZW0jISM3JCIwWXFqNHg7IT0hIzY3JCQiMFgpSG0mPWVtIyEjNyQiMFY9MVssZHoiISM2NyQ3JCQiMCc+cU0yIWVtIyEjNyQiMFlxajR4OyE9ISM2NyQkIjAkZihHYSJ5bEUhIzckIjBrPl51ZyMzPSEjNjckNyQkIi8jRyM+VHdsRSEjNiQiMCMpZXFrPFQiPSEjNjckJCIwJGYoR2EieWxFISM3JCIwaz5edWcjMz0hIzY3JDckJCIvI0cjPlR3bEUhIzYkIjAjKWVxazxUIj0hIzY3JCQiMExMSWtXZG0jISM3JCIwJHlPOCc+MyM9ISM2NyQ3JCQiMG9fWWlGZG0jISM3JCIwPVp4PmVsIz0hIzY3JCQiMExMSWtXZG0jISM3JCIwJHlPOCc+MyM9ISM2NyQ3JCQiMG9fWWlGZG0jISM3JCIwPVp4PmVsIz0hIzY3JCQiMClbPW95cWxFISM3JCIwSkczM3lMJD0hIzY3JDckJCIwYmk7RCJwbEUhIzckIjBhTiVbKCkqKlE9ISM2NyQkIjApWz1veXFsRSEjNyQiMEpHMzN5TCQ9ISM2NyQ3JCQiMGJpO0QicGxFISM3JCIwYU4lWygpKipRPSEjNjckJCIwVC4jPTdubEUhIzckIjAoKTN6OU9mJT0hIzY3JDckJCIwdFcsK2JjbSMhIzckIi9SNypIUjkmPSEjNTckJCIwVC4jPTdubEUhIzckIjAoKTN6OU9mJT0hIzY3JDckJCIwdFcsK2JjbSMhIzckIi9SNypIUjkmPSEjNTckJCIwOmlIcE1jbSMhIzckIjApZiw6UVxlPSEjNjckNyQkIjBGSyRwKT1jbSMhIzckIjBFNylcKXpRJz0hIzY3JCQiMDppSHBNY20jISM3JCIwKWYsOlFcZT0hIzY3JDckJCIwRkskcCk9Y20jISM3JCIwRTcpXCl6USc9ISM2NyQkIjAnXHohSClmbEUhIzckIjAuI1woM141KD0hIzY3JDckJCIwT3EjZUdlbEUhIzckIjBpKzBTP2ooPSEjNjckJCIwJ1x6IUgpZmxFISM3JCIwLiNcKDNeNSg9ISM2NyQ3JCQiME9xI2VHZWxFISM3JCIwaSswUz9qKD0hIzY3JCQiMCJwZDY/Y2xFISM3JCIwaFBkJ3pnJCk9ISM2NyQ3JCQiMHlabydwYWxFISM3JCIwKSopPV40dykpPSEjNjckJCIwInBkNj9jbEUhIzckIjBoUGQnemckKT0hIzY3JDckJCIweVpvJ3BhbEUhIzckIjApKik9XjR3KSk9ISM2NyQkIjBbJD1iZV9sRSEjNyQiMC1fLFhraCo9ISM2NyQ3JCQiMENsYj42Ym0jISM3JCIwTXg9XSw3IT4hIzY3JCQiMFskPWJlX2xFISM3JCIwLV8sWGtoKj0hIzY3JDckJCIwQ2xiPjZibSMhIzckIjBNeD1dLDchPiEjNjckJCIwSEhJIykqW2xFISM3JCIwRyo+TzBzMz4hIzY3JDckJCIwJD4rV2JabEUhIzckIi9kY18/azg+ISM1NyQkIjBISEkjKSpbbEUhIzckIjBHKj5PMHMzPiEjNjckNyQkIjAkPitXYlpsRSEjNyQiL2RjXz9rOD4hIzU3JCQiMHg3PiJSWGxFISM3JCIwOVhUQnc3Iz4hIzY3JDckJCIwSEwzLFNhbSMhIzckIjAxYUtnIzNFPiEjNjckJCIweDc+IlJYbEUhIzckIjA5WFRCdzcjPiEjNjckNyQkIjBITDMsU2FtIyEjNyQiMDFhS2cjM0U+ISM2NyQkIjBvXEs3PWFtIyEjNyQiMCkqXCVSOiRRJD4hIzY3JDckJCIwTSRIJ2YvYW0jISM3JCIwVVVSOkImUT4hIzY3JCQiMG9cSzc9YW0jISM3JCIwKSpcJVI6JFEkPiEjNjckNyQkIjBNJEgnZi9hbSMhIzckIjBVVVI6QiZRPiEjNjckJCIwTF5qWCNRbEUhIzckIjA2QVZYJ1FZPiEjNjckNyQkIjApKnAzSXBgbSMhIzckIjB6SVlxajQmPiEjNjckJCIwTF5qWCNRbEUhIzckIjA2QVZYJ1FZPiEjNjckNyQkIjApKnAzSXBgbSMhIzckIjB6SVlxajQmPiEjNjckJCIwYC4yInBNbEUhIzckIjA9NS8pNCUqZT4hIzY3JDckJCIvQVpCVExsRSEjNiQiMDo+YEQvTSc+ISM2NyQkIjBgLjIicE1sRSEjNyQiMD01Lyk0JSplPiEjNjckNyQkIi9BWkJUTGxFISM2JCIwOj5gRC9NJz4hIzY3JCQiL0E5KFs2YG0jISM2JCIvUi46XlxyPiEjNTckNyQkIjBkISpRMSpIbEUhIzckIjBeMmchWyVlKD4hIzY3JCQiL0E5KFs2YG0jISM2JCIvUi46XlxyPiEjNTckNyQkIjBkISpRMSpIbEUhIzckIjBeMmchWyVlKD4hIzY3JCQiMDZzQz13X20jISM3JCIwaVElbylbUyk+ISM2NyQ3JCQiMFk0NjdrX20jISM3JCIwKGVwY2BHKSk+ISM2NyQkIjA2c0M9d19tIyEjNyQiMGlRJW8pW1MpPiEjNjckNyQkIjBZNDY3a19tIyEjNyQiMChlcGNgRykpPiEjNjckJCIwdVknKio0Q2xFISM3JCIwOGE2Qi1tKj4hIzY3JDckJCIvVylmSEhfbSMhIzYkIjBCJVEyZnMrPyEjNjckJCIwdVknKio0Q2xFISM3JCIwOGE2Qi1tKj4hIzY3JDckJCIvVylmSEhfbSMhIzYkIjBCJVEyZnMrPyEjNjckJCIweThsJGY/bEUhIzckIjB0IjM1Xzo0PyEjNjckNyQkIjAkcFUpZSU+bEUhIzckIjBmcyFlazs4PyEjNjckJCIweThsJGY/bEUhIzckIjB0IjM1Xzo0PyEjNjckNyQkIjAkcFUpZSU+bEUhIzckIjBmcyFlazs4PyEjNjckJCIwPGVSKjQ8bEUhIzckIjApUVEteXFAPyEjNjckNyQkIjAsV3QqKmZebSMhIzckIjAmNHczcWdEPyEjNjckJCIwPGVSKjQ8bEUhIzckIjApUVEteXFAPyEjNjckNyQkIjAsV3QqKmZebSMhIzckIjAmNHczcWdEPyEjNjckJCIuJSkzPE9ebSMhIzUkIjBldTosZ1UuIyEjNjckNyQkIjBGcUVfRF5tIyEjNyQiMEpcJWZ2L1E/ISM2NyQkIi4lKTM8T15tIyEjNSQiMGV1OixnVS4jISM2NyQ3JCQiMEZxRV9EXm0jISM3JCIwSlwlZnYvUT8hIzY3JCQiMF9LaFksXm0jISM3JCIvJHA4JT0iby8jISM1NyQ3JCQiMDg1UDsiNGxFISM3JCIwblAsNilbXT8hIzY3JCQiMF9LaFksXm0jISM3JCIvJHA4JT0iby8jISM1NyQ3JCQiMDg1UDsiNGxFISM3JCIwblAsNilbXT8hIzY3JCQiLkUrKW8xbEUhIzUkIjBvTTJIaiRmPyEjNjckNyQkIjA3JykpPnAwbEUhIzckIjAuRTNtR0gxIyEjNjckJCIuRSspbzFsRSEjNSQiMG9NMkhqJGY/ISM2NyQ3JCQiMDcnKSk+cDBsRSEjNyQiMC5FM21HSDEjISM2NyQkIjBGKTM4Qy5sRSEjNyQiMDciKnpOOT4yIyEjNjckNyQkIjBgOUV6QV1tIyEjNyQiMFI5OkBwYDIjISM2NyQkIjBGKTM4Qy5sRSEjNyQiMDciKnpOOT4yIyEjNjckNyQkIjBgOUV6QV1tIyEjNyQiMFI5OkBwYDIjISM2NyQkIjA7YmMxKSpcbSMhIzckIjB6aD8vbFczIyEjNjckNyQkIjA6ISk0eSkpXG0jISM3JCIwdi1BdzR5MyMhIzY3JCQiMDtiYzEpKlxtIyEjNyQiMHpoPy9sVzMjISM2NyQ3JCQiMDohKTR5KSlcbSMhIzckIjB2LUF3NHkzIyEjNjckJCIvPGFNUSdcbSMhIzYkIi8iZkpOOnE0IyEjNTckNyQkIjBhJDQkKVsmXG0jISM3JCIwNiIqR0pdLTUjISM2NyQkIi88YU1RJ1xtIyEjNiQiLyJmSk46cTQjISM1NyQ3JCQiMGEkNCQpWyZcbSMhIzckIjA2IipHSl0tNSMhIzY3JCQiMEhtNnNIXG0jISM3JCIwM05uR2wmNEAhIzY3JDckJCIwTmAqKjRAXG0jISM3JCIwWnpOJzNwN0AhIzY3JCQiMEhtNnNIXG0jISM3JCIwM05uR2wmNEAhIzY3JDckJCIwTmAqKjRAXG0jISM3JCIwWnpOJzNwN0AhIzY3JCQiMEM4YXMmKlttIyEjNyQiMGhnSiVbNkFAISM2NyQ3JCQiMFBjOVYoKVttIyEjNyQiMCR5RTk5OERAISM2NyQkIjBDOGFzJipbbSMhIzckIjBoZ0olWzZBQCEjNjckNyQkIjBQYzlWKClbbSMhIzckIjAkeUU5OThEQCEjNjckJCIwR25yJT0nW20jISM3JCIwUTBHLWtZOCMhIzY3JDckJCIwdVpyKFEmW20jISM3JCIwPmNcJz5kUEAhIzY3JCQiMEduciU9J1ttIyEjNyQiMFEwRy1rWTgjISM2NyQ3JCQiMHVacihRJlttIyEjNyQiMD5jXCc+ZFBAISM2NyQkIjAsInklM0dbbSMhIzckIjBtXjQkR0BaQCEjNjckNyQkIjA0QmhWP1ttIyEjNyQiMGJXY143KzojISM2NyQkIjAsInklM0dbbSMhIzckIjBtXjQkR0BaQCEjNjckNyQkIjA0QmhWP1ttIyEjNyQiMGJXY143KzojISM2NyQkIjAsdCdSV3prRSEjNyQiMCUzMGo3d2ZAISM2NyQ3JCQiMCkpMyI0cnlrRSEjNyQiMCJITG1JWGlAISM2NyQkIjAsdCdSV3prRSEjNyQiMCUzMGo3d2ZAISM2NyQ3JCQiMCkpMyI0cnlrRSEjNyQiMCJITG1JWGlAISM2NyQkIjBHKD41NHdrRSEjNyQiMHMhUUMkNEI8IyEjNjckNyQkIjApUl8lKlF2a0UhIzckIjBGQHFoJCpbPCMhIzY3JCQiMEcoPjU0d2tFISM3JCIwcyFRQyQ0QjwjISM2NyQ3JCQiMClSXyUqUXZrRSEjNyQiMEZAcWgkKls8IyEjNjckJCIwaGlyXEZabSMhIzckIi5bQixkWz0jISIqNyQ3JCQiL1g3JXo/Wm0jISM2JCIwajR4O010PSMhIzY3JCQiMGhpclxGWm0jISM3JCIuW0IsZFs9IyEiKjckNyQkIi9YNyV6P1ptIyEjNiQiMGo0eDtNdD0jISM2NyQkIjBUUicpPiVwa0UhIzckIjB4UkpML3U+IyEjNjckNyQkIjAoKWZdIXlva0UhIzckIjAqelI9WngqPiMhIzY3JCQiMFRSJyk+JXBrRSEjNyQiMHhSSkwvdT4jISM2NyQ3JCQiMCgpZl0heW9rRSEjNyQiMCp6Uj1aeCo+IyEjNjckJCIwR2ptLGhZbSMhIzckIjAsSC1HXio0QSEjNjckNyQkIi8neidIXGxrRSEjNiQiME4nM3BfQDdBISM2NyQkIjBHam0saFltIyEjNyQiMCxILUdeKjRBISM2NyQ3JCQiLyd6J0hcbGtFISM2JCIwTiczcF9AN0EhIzY3JCQiMHVJJ1t6aWtFISM3JCIwbGo+J3lcQUEhIzY3JDckJCIwJXk5bEBpa0UhIzckIjBydSg+ZWxDQSEjNjckJCIwdUknW3ppa0UhIzckIjBsaj4neVxBQSEjNjckNyQkIjAleTlsQGlrRSEjNyQiMHJ1KD5lbENBISM2NyQkIjBWPGEqXGZrRSEjNyQiMCpmYHZTL05BISM2NyQ3JCQiMCNbajcmKmVrRSEjNyQiMDJqL1AnNFBBISM2NyQkIjBWPGEqXGZrRSEjNyQiMCpmYHZTL05BISM2NyQ3JCQiMCNbajcmKmVrRSEjNyQiMDJqL1AnNFBBISM2NyQkIjBPXnA6aVhtIyEjNyQiMCZvPEAqKmVaQSEjNjckNyQkIjAkXEpzcGJrRSEjNyQiMFdeNiNwYFxBISM2NyQkIjBPXnA6aVhtIyEjNyQiMCZvPEAqKmVaQSEjNjckNyQkIjAkXEpzcGJrRSEjNyQiMFdeNiNwYFxBISM2NyQkIjAqUjNLJUhYbSMhIzckIjAoKm9EU04sRSMhIzY3JDckJCIwPCZ6VVhfa0UhIzckIi8pUj1aeD5FIyEjNTckJCIwKlIzSyVIWG0jISM3JCIwKCpvRFNOLEUjISM2NyQ3JCQiMDwmelVYX2tFISM3JCIvKVI9Wng+RSMhIzU3JCQiLm4xI29ca0UhIzUkIjAkej0/MG9zQSEjNjckNyQkIjBvPk5BI1xrRSEjNyQiMDtHRC09V0YjISM2NyQkIi5uMSNvXGtFISM1JCIwJHo9PzBvc0EhIzY3JDckJCIwbz5OQSNca0UhIzckIjA7R0QtPVdGIyEjNjckJCIwXHpNS2tXbSMhIzckIi9jYHJfQSZHIyEjNTckNyQkIjAqWyVmLGdXbSMhIzckIjBfO0tkZW9HIyEjNjckJCIwXHpNS2tXbSMhIzckIi9jYHJfQSZHIyEjNTckNyQkIjAqWyVmLGdXbSMhIzckIjBfO0tkZW9HIyEjNjckJCIwJmZMUj5Wa0UhIzckIjBFOC9tcHhIIyEjNjckNyQkIjBEayk9elVrRSEjNyQiMClbIVI3KkgqSCMhIzY3JCQiMCZmTFI+VmtFISM3JCIwRTgvbXB4SCMhIzY3JDckJCIwRGspPXpVa0UhIzckIjApWyFSNypIKkgjISM2NyQkIjApKVxwbSpSa0UhIzckIjAoZiU0cDguSiMhIzY3JDckJCIvYVhJZlJrRSEjNiQiMEMkZnUnUjxKIyEjNjckJCIwKSlccG0qUmtFISM3JCIwKGYlNHA4LkojISM2NyQ3JCQiL2FYSWZSa0UhIzYkIjBDJGZ1J1I8SiMhIzY3JCQiMCRSYTN2T2tFISM3JCIwJnArY3QmR0sjISM2NyQ3JCQiMFVMTDBrVm0jISM3JCIvO0dELT1DQiEjNTckJCIwJFJhM3ZPa0UhIzckIjAmcCtjdCZHSyMhIzY3JDckJCIwVUxMMGtWbSMhIzckIi87R0QtPUNCISM1NyQkIjBvMkZZTlZtIyEjNyQiMGs9LG0rYUwjISM2NyQ3JCQiMGFiaUdLVm0jISM3JCIwJypwZng/bUwjISM2NyQkIjBvMkZZTlZtIyEjNyQiMGs9LG0rYUwjISM2NyQ3JCQiMGFiaUdLVm0jISM3JCIwJypwZng/bUwjISM2NyQkIjBiPSJHTklrRSEjNyQiMCQ9XzJPJXpNIyEjNjckNyQkIjAjZXVGMUlrRSEjNyQiMEtlbUtoIVxCISM2NyQkIjBiPSJHTklrRSEjNyQiMCQ9XzJPJXpNIyEjNjckNyQkIjAjZXVGMUlrRSEjNyQiMEtlbUtoIVxCISM2NyQkIjBiS1lxclVtIyEjNyQiLyN5Jyk+J1tnQiEjNTckNyQkIjBiXHYycFVtIyEjNyQiMG9ZdCg9XWhCISM2NyQkIjBiS1lxclVtIyEjNyQiLyN5Jyk+J1tnQiEjNTckNyQkIjBiXHYycFVtIyEjNyQiMG9ZdCg9XWhCISM2NyQkIjB3M00qKlJVbSMhIzckIjBEcilIJUdJUCMhIzY3JDckJCIwKmUocGpQVW0jISM3JCIwL04hR0MlUlAjISM2NyQkIjB3M00qKlJVbSMhIzckIjBEcilIJUdJUCMhIzY3JDckJCIwKmUocGpQVW0jISM3JCIwL04hR0MlUlAjISM2NyQkIjBFeVZSM1VtIyEjNyQiLz5LLC5kJlEjISM1NyQ3JCQiMFdtZkkxVW0jISM3JCIvTXN5SFEnUSMhIzU3JCQiMEV5VlIzVW0jISM3JCIvPkssLmQmUSMhIzU3JDckJCIwV21mSTFVbSMhIzckIi9Nc3lIUSdRIyEjNTckJCIvWWYvcDxrRSEjNiQiMCh5WkE9NilSIyEjNjckNyQkIjBlQDozdlRtIyEjNyQiMHc2JUhOIykpUiMhIzY3JCQiL1lmL3A8a0UhIzYkIjAoeVpBPTYpUiMhIzY3JDckJCIwZUA6M3ZUbSMhIzckIjB3NiVITiMpKVIjISM2NyQkIjBpI0hEYjlrRSEjNyQiMHB6JCopSGw1QyEjNjckNyQkIjBATl4nUjlrRSEjNyQiMDcrLDNrN1QjISM2NyQkIjBpI0hEYjlrRSEjNyQiMHB6JCopSGw1QyEjNjckNyQkIjBATl4nUjlrRSEjNyQiMDcrLDNrN1QjISM2NyQkIjAmSCp6RDlUbSMhIzckIjBeXnJ6JD5CQyEjNjckNyQkIjBiMCFlSDZrRSEjNyQiMFspeUlZcUJDISM2NyQkIjAmSCp6RDlUbSMhIzckIjBeXnJ6JD5CQyEjNjckNyQkIjBiMCFlSDZrRSEjNyQiMFspeUlZcUJDISM2NyQkIjAvUyYqNCQza0UhIzckIjBXNmZETWRWIyEjNjckNyQkIi9UQmQ/M2tFISM2JCIwJW9aIj1YaFYjISM2NyQkIjAvUyYqNCQza0UhIzckIjBXNmZETWRWIyEjNjckNyQkIi9UQmQ/M2tFISM2JCIwJW9aIj1YaFYjISM2NyQkIjAkZU5ePzBrRSEjNyQiMDsrNk91I1tDISM2NyQ3JCQiMFluVEVeU20jISM3JCIvXztLZGVbQyEjNTckJCIwJGVOXj8wa0UhIzckIjA7KzZPdSNbQyEjNjckNyQkIjBZblRFXlNtIyEjNyQiL187S2RlW0MhIzU3JCQiMHZPTDZAU20jISM3JCIwb1xJNjkzWSMhIzY3JDckJCIwemgneTAta0UhIzckIjBjYEdHRTVZIyEjNjckJCIwdk9MNkBTbSMhIzckIjBvXEk2OTNZIyEjNjckNyQkIjB6aCd5MC1rRSEjNyQiMGNgR0dFNVkjISM2NyQkIjBaVFFHISpSbSMhIzckIjAjSC08Tk50QyEjNjckNyQkIjBCRCMqKioqKVJtIyEjNyQiMCM+YUxvWXRDISM2NyQkIjBaVFFHISpSbSMhIzckIjAjSC08Tk50QyEjNjckNyQkIjBCRCMqKioqKVJtIyEjNyQiMCM+YUxvWXRDISM2NyQkIjAoeSFHY2ZSbSMhIzckIjAtPktkIyplWyMhIzY3JDckJCIwJSlHZF9mUm0jISM3JCIwR0lVUTJmWyMhIzY3JCQiMCh5IUdjZlJtIyEjNyQiMC0+S2QjKmVbIyEjNjckNyQkIjAlKUdkX2ZSbSMhIzckIjBHSVVRMmZbIyEjNjckJCIwaHpPJVwmUm0jISM3JCIwQkgsQCV5KFsjISM2NyQ3JCQiMCg9XCR6TXltIyEjNyQiMF9hS1dHbUAiISM2NyQkIjBWSVFwVHptIyEjNyQiMF9hS1dHbUAiISM2NyQ3JCQiMDkvTGs5PG4jISM3JCIwNjYxQj9tQCIhIzY3JCQiMFZJUXBUem0jISM3JCIwX2FLV0dtQCIhIzY3JDckJCIwOS9Mazk8biMhIzckIjA2NjFCP21AIiEjNjckJCIwKSlIXDVDPW4jISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvazYkXCVmdkUhIzYkIjA2NjFCP21AIiEjNjckJCIwKSlIXDVDPW4jISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvazYkXCVmdkUhIzYkIjA2NjFCP21AIiEjNjckJCIwOVVaJlJxdkUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBuR0hNdSV6RSEjNyQiMDY2MUI/bUAiISM2NyQkIjA5VVomUnF2RSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG5HSE11JXpFISM3JCIwNjYxQj9tQCIhIzY3JCQiMFRhWCFRZXpFISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJDR1Iz5hTG8jISM3JCIwNjYxQj9tQCIhIzY3JCQiMFRhWCFRZXpFISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJDR1Iz5hTG8jISM3JCIwNjYxQj9tQCIhIzY3JCQiMG5tVmxqTW8jISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvS2JVU0IobyMhIzYkIjA2NjFCP21AIiEjNjckJCIwbm1WbGpNbyMhIzckIjA2NjFCP21AIiEjNjckNyQkIi9LYlVTQihvIyEjNiQiMDY2MUI/bUAiISM2NyQkIjAlKnlUXVZ0byMhIzckIjA2NjFCP21AIiEjNjckNyQkIjBZbEIqUTYicCMhIzckIjA2NjFCP21AIiEjNjckJCIwJSp5VF1WdG8jISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWWxCKlE2InAjISM3JCIwNjYxQj9tQCIhIzY3JCQiLzcqUk5CN3AjISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwdHhAdSQqXHAjISM3JCIwNjYxQj9tQCIhIzY3JCQiLzcqUk5CN3AjISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwdHhAdSQqXHAjISM3JCIwNjYxQj9tQCIhIzY3JCQiMFouUT8uXnAjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKioqKT5mdCkpcCMhIzckIjA2NjFCP21AIiEjNjckJCIwWi5RPy5ecCMhIzckIjA2NjFCP21AIiEjNjckNyQkIjAqKiopPmZ0KSlwIyEjNyQiMDY2MUI/bUAiISM2NyQkIjB0Ok8wJCkqKXAjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRS09V2BGcSMhIzckIjA2NjFCP21AIiEjNjckJCIwdDpPMCQpKilwIyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEUtPVdgRnEjISM3JCIwNjYxQj9tQCIhIzY3JCQiLkdNIUgnR3EjISM1JCIwNjYxQj9tQCIhIzY3JDckJCIwXzk7SExtcSMhIzckIjA2NjFCP21AIiEjNjckJCIuR00hSCdHcSMhIzUkIjA2NjFCP21AIiEjNjckNyQkIjBfOTtITG1xIyEjNyQiMDY2MUI/bUAiISM2NyQkIjBFU0t2VW5xIyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHpFOTk4MHIjISM3JCIwNjYxQj9tQCIhIzY3JCQiMEVTS3ZVbnEjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwekU5OTgwciMhIzckIjA2NjFCP21AIiEjNjckJCIwYF9JZ0ExciMhIzckIjA2NjFCP21AIiEjNjckNyQkIjAwUjcqSFI5RiEjNyQiMDY2MUI/bUAiISM2NyQkIjBgX0lnQTFyIyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDBSNypIUjlGISM3JCIwNjYxQj9tQCIhIzY3JCQiMHprR1gtWHIjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwS141JUdGPUYhIzckIjA2NjFCP21AIiEjNjckJCIwemtHWC1YciMhIzckIjA2NjFCP21AIiEjNjckNyQkIjBLXjUlR0Y9RiEjNyQiMDY2MUI/bUAiISM2NyQkIjAxeEVJI1E9RiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGVqM3BfQHMjISM3JCIwNjYxQj9tQCIhIzY3JCQiMDF4RUkjUT1GISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZWozcF9AcyMhIzckIjA2NjFCP21AIiEjNjckJCIwSypbX0BFQUYhIzckIjA2NjFCP21AIiEjNjckNyQkIjAmZW5TRC5FRiEjNyQiMDY2MUI/bUAiISM2NyQkIjBLKltfQEVBRiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCZlblNELkVGISM3JCIwNjYxQj9tQCIhIzY3JCQiMGYsQitVaHMjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNilbIVI3KkhGISM3JCIwNjYxQj9tQCIhIzY3JCQiMGYsQitVaHMjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNilbIVI3KkhGISM3JCIwNjYxQj9tQCIhIzY3JCQiMCdRNl89LUlGISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUSsuQyN6TEYhIzckIjA2NjFCP21AIiEjNjckJCIwJ1E2Xz0tSUYhIzckIjA2NjFCP21AIiEjNjckNyQkIjBRKy5DI3pMRiEjNyQiMDY2MUI/bUAiISM2NyQkIjA3RT5xLFJ0IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGs3LDRzd3QjISM3JCIwNjYxQj9tQCIhIzY3JCQiMDdFPnEsUnQjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwazcsNHN3dCMhIzckIjA2NjFCP21AIiEjNjckJCIwUlE8YiJ5UEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiXCMqUj5iVEYhIzckIjA2NjFCP21AIiEjNjckJCIwUlE8YiJ5UEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiXCMqUj5iVEYhIzckIjA2NjFCP21AIiEjNjckJCIwbF06U2g7dSMhIzckIjA2NjFCP21AIiEjNjckNyQkIjA8UCgqeUphdSMhIzckIjA2NjFCP21AIiEjNjckJCIwbF06U2g7dSMhIzckIjA2NjFCP21AIiEjNjckNyQkIjA8UCgqeUphdSMhIzckIjA2NjFCP21AIiEjNjckJCIwI0hPXjdhWEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjBXXCZSO0pcRiEjNyQiMDY2MUI/bUAiISM2NyQkIjAjSE9eN2FYRiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFdcJlI7SlxGISM3JCIwNjYxQj9tQCIhIzY3JCQiMD12NjVAJVxGISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvPE8qWyI+YEYhIzYkIjA2NjFCP21AIiEjNjckJCIwPXY2NUAlXEYhIzckIjA2NjFCP21AIiEjNjckNyQkIi88TypbIj5gRiEjNiQiMDY2MUI/bUAiISM2NyQkIjBYKCk0JjRJYEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjAoUjxSODJkRiEjNyQiMDY2MUI/bUAiISM2NyQkIjBYKCk0JjRJYEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjAoUjxSODJkRiEjNyQiMDY2MUI/bUAiISM2NyQkIjByKnorMz1kRiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEInKSopPV40dyMhIzckIjA2NjFCP21AIiEjNjckJCIwcip6KzM9ZEYhIzckIjA2NjFCP21AIiEjNjckNyQkIjBCJykqKT1eNHcjISM3JCIwNjYxQj9tQCIhIzY3JCQiMCk+aF0xMWhGISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvJil6UTUkW3cjISM2JCIwNjYxQj9tQCIhIzY3JCQiMCk+aF0xMWhGISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvJil6UTUkW3cjISM2JCIwNjYxQj9tQCIhIzY3JCQiMENDL11TXHcjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdzUnKSkzcm9GISM3JCIwNjYxQj9tQCIhIzY3JCQiMENDL11TXHcjISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdzUnKSkzcm9GISM3JCIwNjYxQj9tQCIhIzY3JCQiMF5PLU4/KW9GISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwLkIlUTJmc0YhIzckIjA2NjFCP21AIiEjNjckJCIwXk8tTj8pb0YhIzckIjA2NjFCP21AIiEjNjckNyQkIjAuQiVRMmZzRiEjNyQiMDY2MUI/bUAiISM2NyQkIjB4Wys/K0Z4IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEhOIyllcWt4IyEjNyQiMDY2MUI/bUAiISM2NyQkIjB4Wys/K0Z4IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEhOIyllcWt4IyEjNyQiMDY2MUI/bUAiISM2NyQkIjAvaClcK2V3RiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGNaIVEvTiF5IyEjNyQiMDY2MUI/bUAiISM2NyQkIjAvaClcK2V3RiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGNaIVEvTiF5IyEjNyQiMDY2MUI/bUAiISM2NyQkIi9MbioqKWYveSMhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAjKWZ5R0lVeSMhIzckIjA2NjFCP21AIiEjNjckJCIvTG4qKilmL3kjISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwIylmeUdJVXkjISM3JCIwNjYxQj9tQCIhIzY3JCQiMGQmW1woUlZ5IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDRzdzg1Iil5IyEjNyQiMDY2MUI/bUAiISM2NyQkIjBkJltcKFJWeSMhIzckIjA2NjFCP21AIiEjNjckNyQkIjA0c3c4NSIpeSMhIzckIjA2NjFCP21AIiEjNjckJCIwJHlIKmY+Iyl5IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiME4lWygpKiopPnojISM3JCIwNjYxQj9tQCIhIzY3JCQiMCR5SCpmPiMpeSMhIzckIjA2NjFCP21AIiEjNjckNyQkIjBOJVsoKSoqKT56IyEjNyQiMDY2MUI/bUAiISM2NyQkIi8sNlwlKjQjeiMhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBpJ0hQKXBleiMhIzckIjA2NjFCP21AIiEjNjckJCIvLDZcJSo0I3ojISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwaSdIUClwZXojISM3JCIwNjYxQj9tQCIhIzY3JCQiME9BKilIemZ6IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCkpM3JvXCgqeiMhIzckIjA2NjFCP21AIiEjNjckJCIwT0EqKUh6ZnojISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKSkzcm9cKCp6IyEjNyQiMDY2MUI/bUAiISM2NyQkIjBqTShbImYpKnojISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOkBwYEhPIUchIzckIjA2NjFCP21AIiEjNjckJCIwak0oWyJmKSp6IyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDpAcGBITyFHISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpvYSkqKlFQIUchIzckIjA2NjFCP21AIiEjNjckNyQkIjBUTG5RNHYhRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAqb2EpKipRUCFHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVExuUTR2IUchIzckIjA2NjFCP21AIiEjNjckJCIwO2YkWyk9dyFHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwb1hsQipRNkchIzckIjA2NjFCP21AIiEjNjckJCIwO2YkWyk9dyFHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwb1hsQipRNkchIzckIjA2NjFCP21AIiEjNjckJCIwVXIiKXApXDZHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJXpOJzNwXyJHISM3JCIwNjYxQj9tQCIhIzY3JCQiMFVyIilwKVw2RyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCV6TiczcF8iRyEjNyQiMDY2MUI/bUAiISM2NyQkIjBwJCl6YXlgIkchIzckIjA2NjFCP21AIiEjNjckNyQkIjBAcWgkKlsiPkchIzckIjA2NjFCP21AIiEjNjckJCIwcCQpemF5YCJHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQHFoJCpbIj5HISM3JCIwNjYxQj9tQCIhIzY3JCQiMCZmeihSZSM+RyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFojKWZ5R0kjRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAmZnooUmUjPkchIzckIjA2NjFCP21AIiEjNjckNyQkIjBaIylmeUdJI0chIzckIjA2NjFCP21AIiEjNjckJCIwQTN3Q1FKI0chIzckIjA2NjFCP21AIiEjNjckNyQkIjB1JXpOJzNwI0chIzckIjA2NjFCP21AIiEjNjckJCIwQTN3Q1FKI0chIzckIjA2NjFCP21AIiEjNjckNyQkIjB1JXpOJzNwI0chIzckIjA2NjFCP21AIiEjNjckJCIwWz91ND1xI0chIzckIjA2NjFCP21AIiEjNjckNyQkIi4yY1speUlHISM1JCIwNjYxQj9tQCIhIzY3JCQiMFs/dTQ9cSNHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIuMmNbKXlJRyEjNSQiMDY2MUI/bUAiISM2NyQkIjB2S3MleiozJEchIzckIjA2NjFCP21AIiEjNjckNyQkIjBGPmFMb1kkRyEjNyQiMDY2MUI/bUAiISM2NyQkIjB2S3MleiozJEchIzckIjA2NjFCP21AIiEjNjckNyQkIjBGPmFMb1kkRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAsWHF6eFokRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGBKXz1bJlFHISM3JCIwNjYxQj9tQCIhIzY3JCQiMCxYcXp4WiRHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYEpfPVsmUUchIzckIjA2NjFCP21AIiEjNjckJCIwR2Rva2QnUUchIzckIjA2NjFCP21AIiEjNjckNyQkIi9RL04hR0MlRyEjNiQiMDY2MUI/bUAiISM2NyQkIjBHZG9rZCdRRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL1EvTiFHQyVHISM2JCIwNjYxQj9tQCIhIzY3JCQiMGFwbVxQRCVHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMmNbKXlJWUchIzckIjA2NjFCP21AIiEjNjckJCIwYXBtXFBEJUchIzckIjA2NjFCP21AIiEjNjckNyQkIjAyY1speUlZRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAiPVtZdFRZRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMExvWXQoPV1HISM3JCIwNjYxQj9tQCIhIzY3JCQiMCI9W1l0VFlHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTG9ZdCg9XUchIzckIjA2NjFCP21AIiEjNjckJCIwMiVIJz4oSF1HISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvMVslZW5TJkchIzYkIjA2NjFCP21AIiEjNjckJCIwMiVIJz4oSF1HISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvMVslZW5TJkchIzYkIjA2NjFCP21AIiEjNjckJCIwTTFoL3hUJkchIzckIjA2NjFCP21AIiEjNjckNyQkIjAnR0hNdSV6JkchIzckIjA2NjFCP21AIiEjNjckJCIwTTFoL3hUJkchIzckIjA2NjFCP21AIiEjNjckNyQkIjAnR0hNdSV6JkchIzckIjA2NjFCP21AIiEjNjckJCIvJz1mKm8wZUchIzYkIjA2NjFCP21AIiEjNjckNyQkIjA4MFRHRj0nRyEjNyQiMDY2MUI/bUAiISM2NyQkIi8nPWYqbzBlRyEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMDgwVEdGPSdHISM3JCIwNjYxQj9tQCIhIzY3JCQiMCgzdFhuJD4nRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFI8UjgyZCdHISM3JCIwNjYxQj9tQCIhIzY3JCQiMCgzdFhuJD4nRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFI8UjgyZCdHISM3JCIwNjYxQj9tQCIhIzY3JCQiMDhWYmY7ZSdHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbUhQKXBlcEchIzckIjA2NjFCP21AIiEjNjckJCIwOFZiZjtlJ0chIzckIjA2NjFCP21AIiEjNjckNyQkIjBtSFApcGVwRyEjNyQiMDY2MUI/bUAiISM2NyQkIi9hTlhrcHBHISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwIz5hTG9ZdEchIzckIjA2NjFCP21AIiEjNjckJCIvYU5Ya3BwRyEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCM+YUxvWXRHISM3JCIwNjYxQj9tQCIhIzY3JCQiMG1uXkh3TihHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPmFMb1l0KEchIzckIjA2NjFCP21AIiEjNjckJCIwbW5eSHdOKEchIzckIjA2NjFCP21AIiEjNjckNyQkIjA+YUxvWXQoRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAkKnpcOWN1KEchIzckIjA2NjFCP21AIiEjNjckNyQkIjBYbUpgRTcpRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAkKnpcOWN1KEchIzckIjA2NjFCP21AIiEjNjckNyQkIjBYbUpgRTcpRyEjNyQiMDY2MUI/bUAiISM2NyQkIjA+I3olKmZMIilHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwc3lIUTFeKUchIzckIjA2NjFCP21AIiEjNjckJCIwPiN6JSpmTCIpRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHN5SFExXilHISM3JCIwNjYxQj9tQCIhIzY3JCQiMFkvWSVlQCYpRyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCk0ektpKSopKUchIzckIjA2NjFCP21AIiEjNjckJCIwWS9ZJWVAJilHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKTR6S2kpKikpRyEjNyQiMDY2MUI/bUAiISM2NyQkIjBzO1dwJjQqKUchIzckIjA2NjFCP21AIiEjNjckNyQkIjBELkUzbUcqRyEjNyQiMDY2MUI/bUAiISM2NyQkIjBzO1dwJjQqKUchIzckIjA2NjFCP21AIiEjNjckNyQkIjBELkUzbUcqRyEjNyQiMDY2MUI/bUAiISM2NyQkIjAqKkdVYXZIKkchIzckIjA2NjFCP21AIiEjNjckNyQkIjBeOkMkZnUnKkchIzckIjA2NjFCP21AIiEjNjckJCIwKipHVWF2SCpHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXjpDJGZ1JypHISM3JCIwNjYxQj9tQCIhIzY3JCQiMERUU1JibypHISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweUZBeUQxIUghIzckIjA2NjFCP21AIiEjNjckJCIwRFRTUmJvKkchIzckIjA2NjFCP21AIiEjNjckNyQkIjB5RkF5RDEhSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBfYFFDTjIhSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC9TP2owWCFIISM3JCIwNjYxQj9tQCIhIzY3JCQiMF9gUUNOMiFIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwL1M/ajBYIUghIzckIjA2NjFCP21AIiEjNjckJCIweWxPNDpZIUghIzckIjA2NjFCP21AIiEjNjckNyQkIjBKXz1bJlEzSCEjNyQiMDY2MUI/bUAiISM2NyQkIjB5bE80OlkhSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEpfPVsmUTNIISM3JCIwNjYxQj9tQCIhIzY3JCQiMDB5TSVcXDNIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZGs7TGxBIkghIzckIjA2NjFCP21AIiEjNjckJCIwMHlNJVxcM0ghIzckIjA2NjFCP21AIiEjNjckNyQkIjBkaztMbEEiSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBKIUgkenVCIkghIzckIjA2NjFCP21AIiEjNjckNyQkIjAlb1oiPVhoIkghIzckIjA2NjFCP21AIiEjNjckJCIwSiFIJHp1QiJIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJW9aIj1YaCJIISM3JCIwNjYxQj9tQCIhIzY3JCQiMGUtSmthaSJIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvIipHSl0tP0ghIzYkIjA2NjFCP21AIiEjNjckJCIwZS1Ka2FpIkghIzckIjA2NjFCP21AIiEjNjckNyQkIi8iKkdKXS0/SCEjNiQiMDY2MUI/bUAiISM2NyQkIjAlWyJIXE0sI0ghIzckIjA2NjFCP21AIiEjNjckNyQkIjBQLDYpWyFSI0ghIzckIjA2NjFCP21AIiEjNjckJCIwJVsiSFxNLCNIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUCw2KVshUiNIISM3JCIwNjYxQj9tQCIhIzY3JCQiMDZGRk05UyNIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwajg0dCV5RkghIzckIjA2NjFCP21AIiEjNjckJCIwNkZGTTlTI0ghIzckIjA2NjFCP21AIiEjNjckNyQkIjBqODR0JXlGSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBQUkQ+JSp5I0ghIzckIjA2NjFCP21AIiEjNjckNyQkIi9mcyFlazskSCEjNiQiMDY2MUI/bUAiISM2NyQkIjBQUkQ+JSp5I0ghIzckIjA2NjFCP21AIiEjNjckNyQkIi9mcyFlazskSCEjNiQiMDY2MUI/bUAiISM2NyQkIjBrXkIvdTwkSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDtRMFZXYiRIISM3JCIwNjYxQj9tQCIhIzY3JCQiMGteQi91PCRIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwO1EwVldiJEghIzckIjA2NjFCP21AIiEjNjckJCIwIlI7IypRbE5IISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVl0uR0MlUkghIzckIjA2NjFCP21AIiEjNjckJCIwIlI7IypRbE5IISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVl0uR0MlUkghIzckIjA2NjFCP21AIiEjNjckJCIwPHc+dUwmUkghIzckIjA2NjFCP21AIiEjNjckNyQkIjBwaSw4L0wlSCEjNyQiMDY2MUI/bUAiISM2NyQkIjA8dz51TCZSSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHBpLDgvTCVIISM3JCIwNjYxQj9tQCIhIzY3JCQiMFcpeSJmOE0lSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCdcKCp6Uj1aSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBXKXkiZjhNJUghIzckIjA2NjFCP21AIiEjNjckNyQkIjAnXCgqelI9WkghIzckIjA2NjFCP21AIiEjNjckJCIvMmdUTUhaSCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMEEoeUhRMV5IISM3JCIwNjYxQj9tQCIhIzY3JCQiLzJnVE1IWkghIzYkIjA2NjFCP21AIiEjNjckNyQkIjBBKHlIUTFeSCEjNyQiMDY2MUI/bUAiISM2NyQkIjAoSFQiSHQ2JkghIzckIjA2NjFCP21AIiEjNjckNyQkIjBcKmZ6TyVcJkghIzckIjA2NjFCP21AIiEjNjckJCIwKEhUIkh0NiZIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXCpmek8lXCZIISM3JCIwNjYxQj9tQCIhIzY3JCQiMEJENzlgXSZIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdjYlSE4jKWVIISM3JCIwNjYxQj9tQCIhIzY3JCQiMEJENzlgXSZIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdjYlSE4jKWVIISM3JCIwNjYxQj9tQCIhIzY3JCQiL3YuIipIJCplSCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMC1DI3pMcWlIISM3JCIwNjYxQj9tQCIhIzY3JCQiL3YuIipIJCplSCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMC1DI3pMcWlIISM3JCIwNjYxQj9tQCIhIzY3JCQiMHdcMyVHIkcnSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEdPIUhLZW1IISM3JCIwNjYxQj9tQCIhIzY3JCQiMHdcMyVHIkcnSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEdPIUhLZW1IISM3JCIwNjYxQj9tQCIhIzY3JCQiMC5pMXAjcG1IISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYlspeUlZcUghIzckIjA2NjFCP21AIiEjNjckJCIwLmkxcCNwbUghIzckIjA2NjFCP21AIiEjNjckNyQkIjBiWyl5SVlxSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBIdS9hczAoSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCIzbUdITXVIISM3JCIwNjYxQj9tQCIhIzY3JCQiMEh1L2FzMChIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIjNtR0hNdUghIzckIjA2NjFCP21AIiEjNjckJCIwYydHIVJfVyhIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwM3QleUZBeUghIzckIjA2NjFCP21AIiEjNjckJCIwYydHIVJfVyhIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwM3QleUZBeUghIzckIjA2NjFCP21AIiEjNjckJCIwIykpNFNBTHlIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTSZHR0U1IylIISM3JCIwNjYxQj9tQCIhIzY3JCQiMCMpKTRTQUx5SCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiME0mR0dFNSMpSCEjNyQiMDY2MUI/bUAiISM2NyQkIjA0NioqMzdBKUghIzckIjA2NjFCP21AIiEjNjckNyQkIjBoKDR5QylmKUghIzckIjA2NjFCP21AIiEjNjckJCIwNDYqKjM3QSlIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwaCg0eUMpZilIISM3JCIwNjYxQj9tQCIhIzY3JCQiME5CKFI+NCcpSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCgpNHpLaSkqKUghIzckIjA2NjFCP21AIiEjNjckJCIwTkIoUj40JylIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKCk0ektpKSopSCEjNyQiMDY2MUI/bUAiISM2NyQkIjBpTiYqeXIqKilIISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOUF4PFVQKkghIzckIjA2NjFCP21AIiEjNjckJCIwaU4mKnlyKiopSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDlBeDxVUCpIISM3JCIwNjYxQj9tQCIhIzY3JCQiMCl5TVI7JlEqSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL1dgRj9pKCpIISM2JCIwNjYxQj9tQCIhIzY3JCQiMCl5TVI7JlEqSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL1dgRj9pKCpIISM2JCIwNjYxQj9tQCIhIzY3JCQiMDpnIipbSngqSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG5ZdCg9XSxJISM3JCIwNjYxQj9tQCIhIzY3JCQiMDpnIipbSngqSCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG5ZdCg9XSxJISM3JCIwNjYxQj9tQCIhIzY3JCQiMFRzKlE4aCxJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJCplcnMiUTBJISM3JCIwNjYxQj9tQCIhIzY3JCQiMFRzKlE4aCxJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJCplcnMiUTBJISM3JCIwNjYxQj9tQCIhIzY3JCQiMG8leSk9IlwwSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLzcocGRoIzRJISM2JCIwNjYxQj9tQCIhIzY3JCQiMG8leSk9IlwwSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLzcocGRoIzRJISM2JCIwNjYxQj9tQCIhIzY3JCQiMCVwZlE1UDRJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWSR5RTk5OEkhIzckIjA2NjFCP21AIiEjNjckJCIwJXBmUTVQNEkhIzckIjA2NjFCP21AIiEjNjckNyQkIjBZJHlFOTk4SSEjNyQiMDY2MUI/bUAiISM2NyQkIjBANCUpKTNEOEkhIzckIjA2NjFCP21AIiEjNjckNyQkIjB0JmZ3Ny08SSEjNyQiMDY2MUI/bUAiISM2NyQkIjBANCUpKTNEOEkhIzckIjA2NjFCP21AIiEjNjckNyQkIjB0JmZ3Ny08SSEjNyQiMDY2MUI/bUAiISM2NyQkIjBaQCNRMjg8SSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCp6U0U2ITQtJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBaQCNRMjg8SSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCp6U0U2ITQtJCEjNyQiMDY2MUI/bUAiISM2NyQkIjB1TCEpZTU1LSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBFP2koNHlDSSEjNyQiMDY2MUI/bUAiISM2NyQkIjB1TCEpZTU1LSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBFP2koNHlDSSEjNyQiMDY2MUI/bUAiISM2NyQkIi5ZeVYhKlstJCEjNSQiMDY2MUI/bUAiISM2NyQ3JCQiMF9LZyMzbUdJISM3JCIwNjYxQj9tQCIhIzY3JCQiLll5ViEqWy0kISM1JCIwNjYxQj9tQCIhIzY3JDckJCIwX0tnIzNtR0khIzckIjA2NjFCP21AIiEjNjckJCIwRmV3R3EoR0khIzckIjA2NjFCP21AIiEjNjckNyQkIjB6V2VuU0QuJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBGZXdHcShHSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHpXZW5TRC4kISM3JCIwNjYxQj9tQCIhIzY3JCQiMGBxdThdRS4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMGRjXz9rLiQhIzckIjA2NjFCP21AIiEjNjckJCIwYHF1OF1FLiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAwZGNfP2suJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9HRygpKkhsLiQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBLcGFQKy4vJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9HRygpKkhsLiQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBLcGFQKy4vJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAxJjRQKTQvLyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBlIkdELT1XSSEjNyQiMDY2MUI/bUAiISM2NyQkIjAxJjRQKTQvLyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBlIkdELT1XSSEjNyQiMDY2MUI/bUAiISM2NyQkIjBMMnBvKkdXSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCZRNHYrMVtJISM3JCIwNjYxQj9tQCIhIzY3JCQiMEwycG8qR1dJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJlE0disxW0khIzckIjA2NjFCP21AIiEjNjckJCIwZj5uYHAiW0khIzckIjA2NjFCP21AIiEjNjckNyQkIjA2MVwjKlI+MCQhIzckIjA2NjFCP21AIiEjNjckJCIwZj5uYHAiW0khIzckIjA2NjFCP21AIiEjNjckNyQkIjA2MVwjKlI+MCQhIzckIjA2NjFCP21AIiEjNjckJCIwJz1gJ1FcPzAkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUT1aeD5lMCQhIzckIjA2NjFCP21AIiEjNjckJCIwJz1gJ1FcPzAkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUT1aeD5lMCQhIzckIjA2NjFCP21AIiEjNjckJCIwN1dqQkhmMCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBsSVhpKnBmSSEjNyQiMDY2MUI/bUAiISM2NyQkIjA3V2pCSGYwJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGxJWGkqcGZJISM3JCIwNjYxQj9tQCIhIzY3JCQiMFJjaDM0KWZJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIkhNdSV6TjEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMFJjaDM0KWZJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIkhNdSV6TjEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMGxvZiQqKW9qSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMD1iVEtmdTEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMGxvZiQqKW9qSSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMD1iVEtmdTEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCM0eSZ5b3YxJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFduUjxSODIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCM0eSZ5b3YxJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFduUjxSODIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMD0kZk4nWzkyJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHJ6UC0+XzIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMD0kZk4nWzkyJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHJ6UC0+XzIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMFgwYVtHYDIkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKD5mdCkpNHpJISM3JCIwNjYxQj9tQCIhIzY3JCQiMFgwYVtHYDIkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKD5mdCkpNHpJISM3JCIwNjYxQj9tQCIhIzY3JCQiMHI8X0wzI3pJISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQy9Nc3lIMyQhIzckIjA2NjFCP21AIiEjNjckJCIwcjxfTDMjekkhIzckIjA2NjFCP21AIiEjNjckNyQkIjBDL01zeUgzJCEjNyQiMDY2MUI/bUAiISM2NyQkIjApKkhdPSkzJDMkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvbEB0JmVvMyQhIzYkIjA2NjFCP21AIiEjNjckJCIwKSpIXT0pMyQzJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL2xAdCZlbzMkISM2JCIwNjYxQj9tQCIhIzY3JCQiMENVWy5vcDMkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweEdJVVEyNCQhIzckIjA2NjFCP21AIiEjNjckJCIwQ1VbLm9wMyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjB4R0lVUTI0JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBeYVkpeSUzNCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAuVEdGPVk0JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBeYVkpeSUzNCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAuVEdGPVk0JCEjNyQiMDY2MUI/bUAiISM2NyQkIjB4bVd0Rlo0JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMDY2MUI/bUAiISM2NyQkIjB4bVd0Rlo0JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMDY2MUI/bUAiISM2NyQkIjAvelVlMicpNCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBjbEMoelAtSiEjNyQiMDY2MUI/bUAiISM2NyQkIjAvelVlMicpNCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBjbEMoelAtSiEjNyQiMDY2MUI/bUAiISM2NyQkIi84NE11Wy1KISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwJHlGQXlEMUohIzckIjA2NjFCP21AIiEjNjckJCIvODRNdVstSiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCR5RkF5RDFKISM3JCIwNjYxQj9tQCIhIzY3JCQiMGQuUkduajUkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNCE0c3c4NUohIzckIjA2NjFCP21AIiEjNjckJCIwZC5SR25qNSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjA0ITRzdzg1SiEjNyQiMDY2MUI/bUAiISM2NyQkIjAkZXJMckM1SiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiME8tPl88UzYkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCRlckxyQzVKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTy0+XzxTNiQhIzckIjA2NjFCP21AIiEjNjckJCIvIkdOKXA3OUohIzYkIjA2NjFCP21AIiEjNjckNyQkIjBpOTxQKCp5NiQhIzckIjA2NjFCP21AIiEjNjckJCIvIkdOKXA3OUohIzYkIjA2NjFCP21AIiEjNjckNyQkIjBpOTxQKCp5NiQhIzckIjA2NjFCP21AIiEjNjckJCIwT1NMJG8rPUohIzckIjA2NjFCP21AIiEjNjckNyQkIjAqb19Ac3hASiEjNyQiMDY2MUI/bUAiISM2NyQkIjBPU0wkbys9SiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCpvX0BzeEBKISM3JCIwNjYxQj9tQCIhIzY3JCQiMGpfSm8nKT03JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDpSODJkYzckISM3JCIwNjYxQj9tQCIhIzY3JCQiMGpfSm8nKT03JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDpSODJkYzckISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpbJ0hgbWQ3JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFVeNiNwYEhKISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpbJ0hgbWQ3JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFVeNiNwYEhKISM3JCIwNjYxQj9tQCIhIzY3JCQiMDt4RlFZJ0hKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwb2o0eDtNOCQhIzckIjA2NjFCP21AIiEjNjckJCIwO3hGUVknSEohIzckIjA2NjFCP21AIiEjNjckNyQkIjBvajR4O004JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBVKmVLaV9MSiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCZmeD9tSFBKISM3JCIwNjYxQj9tQCIhIzY3JCQiMFUqZUtpX0xKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJmZ4P21IUEohIzckIjA2NjFCP21AIiEjNjckJCIwcCxDMzF1OCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBAKWVxazxUSiEjNyQiMDY2MUI/bUAiISM2NyQkIjBwLEMzMXU4JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEApZXFrPFRKISM3JCIwNjYxQj9tQCIhIzY3JCQiMCdSQEtmR1RKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWysvS2NdOSQhIzckIjA2NjFCP21AIiEjNjckJCIwJ1JAS2ZHVEohIzckIjA2NjFCP21AIiEjNjckNyQkIjBbKy9LY105JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBBRT95bF45JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHU3LTxPKltKISM3JCIwNjYxQj9tQCIhIzY3JCQiMEFFP3lsXjkkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdTctPE8qW0ohIzckIjA2NjFCP21AIiEjNjckJCIwXFE9alghXEohIzckIjA2NjFCP21AIiEjNjckNyQkIjAsRCstO0c6JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBcUT1qWCFcSiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCxEKy07RzokISM3JCIwNjYxQj9tQCIhIzY3JCQiMHZdO1tESDokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRlApcGVwY0ohIzckIjA2NjFCP21AIiEjNjckJCIwdl07W0RIOiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBGUClwZXBjSiEjNyQiMDY2MUI/bUAiISM2NyQkIjAtajlMMG86JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGFcJz5kZGdKISM3JCIwNjYxQj9tQCIhIzY3JCQiMC1qOUwwbzokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYVwnPmRkZ0ohIzckIjA2NjFCP21AIiEjNjckJCIwR3Y3PSZvZ0ohIzckIjA2NjFCP21AIiEjNjckNyQkIi89WXBiWGtKISM2JCIwNjYxQj9tQCIhIzY3JCQiMEd2Nz0mb2dKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvPVlwYlhrSiEjNiQiMDY2MUI/bUAiISM2NyQkIjBiKDNKXWNrSiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDJ1Iz5hTG9KISM3JCIwNjYxQj9tQCIhIzY3JCQiMGIoM0pdY2tKISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMnUjPmFMb0ohIzckIjA2NjFCP21AIiEjNjckJCIwIikqKjMpW1dvSiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEwnM3BfQHNKISM3JCIwNjYxQj9tQCIhIzY3JCQiMCIpKiozKVtXb0ohIzckIjA2NjFCP21AIiEjNjckNyQkIjBMJzNwX0BzSiEjNyQiMDY2MUI/bUAiISM2NyQkIjAzNzJ0Q0I8JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLycpKik9XjR3SiEjNiQiMDY2MUI/bUAiISM2NyQkIjAzNzJ0Q0I8JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLycpKik9XjR3SiEjNiQiMDY2MUI/bUAiISM2NyQkIjBNQzBlL2k8JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCczcm9cKCp6SiEjNyQiMDY2MUI/bUAiISM2NyQkIjBNQzBlL2k8JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCczcm9cKCp6SiEjNyQiMDY2MUI/bUAiISM2NyQkIjBoTy5WJTMhPSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjA4QiY9WyZRPSQhIzckIjA2NjFCP21AIiEjNjckJCIwaE8uViUzIT0kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOEImPVsmUT0kISM3JCIwNjYxQj9tQCIhIzY3JCQiMCgpWyxHa1I9JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFJOJG9ZdCg9JCEjNyQiMDY2MUI/bUAiISM2NyQkIjAoKVssR2tSPSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBSTiRvWXQoPSQhIzckIjA2NjFCP21AIiEjNjckJCIwOWgqSFQleT0kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbVoiPVhoIj4kISM3JCIwNjYxQj9tQCIhIzY3JCQiMDloKkhUJXk9JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG1aIj1YaCI+JCEjNyQiMDY2MUI/bUAiISM2NyQkIi9NeHpScyI+JCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCMqZnpPJVwmPiQhIzckIjA2NjFCP21AIiEjNjckJCIvTXh6UnMiPiQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAjKmZ6TyVcJj4kISM3JCIwNjYxQj9tQCIhIzY3JCQiMG4mZUhRZyY+JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMD5zeEB1JCo+JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBuJmVIUWcmPiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjA+c3hAdSQqPiQhIzckIjA2NjFCP21AIiEjNjckJCIwJHpSek9bKj4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWCVlblNELkshIzckIjA2NjFCP21AIiEjNjckJCIwJHpSek9bKj4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWCVlblNELkshIzckIjA2NjFCP21AIiEjNjckJCIvLUBITk8uSyEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMHMnUjxSODJLISM3JCIwNjYxQj9tQCIhIzY3JCQiLy1ASE5PLkshIzYkIjA2NjFCP21AIiEjNjckNyQkIjBzJ1I8UjgySyEjNyQiMDY2MUI/bUAiISM2NyQkIjBZQSF6TEMySyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBZQSF6TEMySyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMDY2MUI/bUAiISM2NyQkIjB0TSlHSzc2SyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiMDY2MUI/bUAiISM2NyQkIjB0TSlHSzc2SyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAqcGt5SSs6SyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMF5Mb1l0KD1LISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpwa3lJKzpLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXkxvWXQoPUshIzckIjA2NjFCP21AIiEjNjckJCIwRWYlR0gpKT1LISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweVhtSmBFQSQhIzckIjA2NjFCP21AIiEjNjckJCIwRWYlR0gpKT1LISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweVhtSmBFQSQhIzckIjA2NjFCP21AIiEjNjckJCIwX3IjeUZ3QUshIzckIjA2NjFCP21AIiEjNjckNyQkIjAvZWs7TGxBJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBfciN5RndBSyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC9laztMbEEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMHokM0dFa0VLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwSnFpLDgvQiQhIzckIjA2NjFCP21AIiEjNjckJCIweiQzR0VrRUshIzckIjA2NjFCP21AIiEjNjckNyQkIjBKcWksOC9CJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAwJyp5WkEwQiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBkIzNtR0hNSyEjNyQiMDY2MUI/bUAiISM2NyQkIjAwJyp5WkEwQiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBkIzNtR0hNSyEjNyQiMDY2MUI/bUAiISM2NyQkIjBLM3hLLVdCJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCVbKmVycyJRSyEjNyQiMDY2MUI/bUAiISM2NyQkIjBLM3hLLVdCJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCVbKmVycyJRSyEjNyQiMDY2MUI/bUAiISM2NyQkIjBlP3Y8I0dRSyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL3JxbEQwVUshIzYkIjA2NjFCP21AIiEjNjckJCIwZT92PCNHUUshIzckIjA2NjFCP21AIiEjNjckNyQkIi9ycWxEMFVLISM2JCIwNjYxQj9tQCIhIzY3JCQiMCZHTEY/O1VLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUD5iVEtmQyQhIzckIjA2NjFCP21AIiEjNjckJCIwJkdMRj87VUshIzckIjA2NjFCP21AIiEjNjckNyQkIjBQPmJUS2ZDJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA2WHIoPS9ZSyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGpKYEU3KVxLISM3JCIwNjYxQj9tQCIhIzY3JCQiMDZYcig9L1lLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwakpgRTcpXEshIzckIjA2NjFCP21AIiEjNjckJCIwUWRwc0AqXEshIzckIjA2NjFCP21AIiEjNjckNyQkIi9SOTpAcGBLISM2JCIwNjYxQj9tQCIhIzY3JCQiMFFkcHNAKlxLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvUjk6QHBgSyEjNiQiMDY2MUI/bUAiISM2NyQkIjBrcG5kLFFEJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDtjXCc+ZGRLISM3JCIwNjYxQj9tQCIhIzY3JCQiMGtwbmQsUUQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwO2NcJz5kZEshIzckIjA2NjFCP21AIiEjNjckJCIwIj5lRTlvZEshIzckIjA2NjFCP21AIiEjNjckNyQkIjBWb1oiPVhoSyEjNyQiMDY2MUI/bUAiISM2NyQkIjAiPmVFOW9kSyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFZvWiI9WGhLISM3JCIwNjYxQj9tQCIhIzY3JCQiMDwlUnc3Y2hLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvMmVrO0xsSyEjNiQiMDY2MUI/bUAiISM2NyQkIjA8JVJ3N2NoSyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLzJlaztMbEshIzYkIjA2NjFCP21AIiEjNjckJCIwVzFpN1RhRSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAnSFI5OkBwSyEjNyQiMDY2MUI/bUAiISM2NyQkIjBXMWk3VGFFJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCdIUjk6QHBLISM3JCIwNjYxQj9tQCIhIzY3JCQiLyg9Zyg0S3BLISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwQjBVTyI0dEshIzckIjA2NjFCP21AIiEjNjckJCIvKD1nKDRLcEshIzYkIjA2NjFCP21AIiEjNjckNyQkIjBCMFVPIjR0SyEjNyQiMDY2MUI/bUAiISM2NyQkIjAoNCRlIzM/dEshIzckIjA2NjFCP21AIiEjNjckNyQkIjBcPFNAcnBGJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAoNCRlIzM/dEshIzckIjA2NjFCP21AIiEjNjckNyQkIjBcPFNAcnBGJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBCVmNuITN4SyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHdIUTFeM0ckISM3JCIwNjYxQj9tQCIhIzY3JCQiMEJWY24hM3hLISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwd0hRMV4zRyQhIzckIjA2NjFCP21AIiEjNjckJCIvYlhEMCc0RyQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAtVU8iNHQlRyQhIzckIjA2NjFCP21AIiEjNjckJCIvYlhEMCc0RyQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAtVU8iNHQlRyQhIzckIjA2NjFCP21AIiEjNjckJCIwd25fUFNbRyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBIYU13NScpRyQhIzckIjA2NjFCP21AIiEjNjckJCIwd25fUFNbRyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBIYU13NScpRyQhIzckIjA2NjFCP21AIiEjNjckJCIwLiEzRC1zKUckISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYm1LaCFcI0gkISM3JCIwNjYxQj9tQCIhIzY3JCQiMC4hM0QtcylHJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGJtS2ghXCNIJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBIIypbMitFSCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAjKXlJWXFqSCQhIzckIjA2NjFCP21AIiEjNjckJCIwSCMqWzIrRUgkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIyl5SVlxakgkISM3JCIwNjYxQj9tQCIhIzY3JCQiMGMvWiMqemtIJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDMiKkdKXS1JJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBjL1ojKnprSCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAzIipHSl0tSSQhIzckIjA2NjFCP21AIiEjNjckJCIwI29edShmLkkkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTi5GO0lUSSQhIzckIjA2NjFCP21AIiEjNjckJCIwI29edShmLkkkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTi5GO0lUSSQhIzckIjA2NjFCP21AIiEjNjckJCIwNEhWaVJVSSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBoOkQsNSEzTCEjNyQiMDY2MUI/bUAiISM2NyQkIjA0SFZpUlVJJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGg6RCw1ITNMISM3JCIwNjYxQj9tQCIhIzY3JCQiME5UVFo+IjNMISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKXlLaSkqKT1KJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBOVFRaPiIzTCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCl5S2kpKik9SiQhIzckIjA2NjFCP21AIiEjNjckJCIwaWBSSyoqPkokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOVNAcnBkSiQhIzckIjA2NjFCP21AIiEjNjckJCIwaWBSSyoqPkokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOVNAcnBkSiQhIzckIjA2NjFCP21AIiEjNjckJCIwKWV3dCJ6ZUokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVF8+Y1wnPkwhIzckIjA2NjFCP21AIiEjNjckJCIwKWV3dCJ6ZUokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVF8+Y1wnPkwhIzckIjA2NjFCP21AIiEjNjckJCIwOnlOLWYoPkwhIzckIjA2NjFCP21AIiEjNjckNyQkIjBuazxUSE5LJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA6eU4tZig+TCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG5rPFRITkskISM3JCIwNjYxQj9tQCIhIzY3JCQiMFQhUnQpUU9LJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCVwZGgjNHVLJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBUIVJ0KVFPSyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAlcGRoIzR1SyQhIzckIjA2NjFCP21AIiEjNjckJCIwby1Lcz12SyQhIzckIjA2NjFCP21AIiEjNjckNyQkIi8jKlE2IipHSkwhIzYkIjA2NjFCP21AIiEjNjckJCIwby1Lcz12SyQhIzckIjA2NjFCP21AIiEjNjckNyQkIi8jKlE2IipHSkwhIzYkIjA2NjFCP21AIiEjNjckJCIwJVwsdCYpUkpMISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWiw3JypvXkwkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCVcLHQmKVJKTCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFosNycqb15MJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBARkdVeV9MJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHQ4NSIpWyFSTCEjNyQiMDY2MUI/bUAiISM2NyQkIjBARkdVeV9MJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHQ4NSIpWyFSTCEjNyQiMDY2MUI/bUAiISM2NyQkIjBaUkVGZSJSTCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLkUzbUdITSQhIzUkIjA2NjFCP21AIiEjNjckJCIwWlJFRmUiUkwhIzckIjA2NjFCP21AIiEjNjckNyQkIi5FM21HSE0kISM1JCIwNjYxQj9tQCIhIzY3JCQiMHVeQzdRSU0kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRVExXjNvTSQhIzckIjA2NjFCP21AIiEjNjckJCIwdV5DN1FJTSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBFUTFeM29NJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAsa0EoeiJwTSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBgXS9PKW9dTCEjNyQiMDY2MUI/bUAiISM2NyQkIjAsa0EoeiJwTSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBgXS9PKW9dTCEjNyQiMDY2MUI/bUAiISM2NyQkIjBGdz8jeXpdTCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHppLUBvWE4kISM3JCIwNjYxQj9tQCIhIzY3JCQiMEZ3PyN5el1MISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwemktQG9YTiQhIzckIjA2NjFCP21AIiEjNjckJCIwYSkpPW54WU4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMXYrMVslZUwhIzckIjA2NjFCP21AIiEjNjckJCIwYSkpPW54WU4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMXYrMVslZUwhIzckIjA2NjFCP21AIiEjNjckJCIvM3FAdmJlTCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMEsoKSk0ektpTCEjNyQiMDY2MUI/bUAiISM2NyQkIi8zcUB2YmVMISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwSygpKTR6S2lMISM3JCIwNjYxQj9tQCIhIzY3JCQiMDI4OlBQQ08kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZipwZng/bUwhIzckIjA2NjFCP21AIiEjNjckJCIwMjg6UFBDTyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBmKnBmeD9tTCEjNyQiMDY2MUI/bUAiISM2NyQkIjBMRDhBPGpPJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCY9XjR3M3FMISM3JCIwNjYxQj9tQCIhIzY3JCQiMExEOEE8ak8kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJj1eNHczcUwhIzckIjA2NjFCP21AIiEjNjckJCIvdzhycT5xTCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMDdDJGZ1J1JQJCEjNyQiMDY2MUI/bUAiISM2NyQkIi93OHJxPnFMISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwN0MkZnUnUlAkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCcpXDQjcDJ1TCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFFPIjR0JXlQJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAnKVw0I3AydUwhIzckIjA2NjFCP21AIiEjNjckNyQkIjBRTyI0dCV5UCQhIzckIjA2NjFCP21AIiEjNjckJCIwOGkyeGN6UCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBsWyplcnMiUSQhIzckIjA2NjFCP21AIiEjNjckJCIwOGkyeGN6UCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBsWyplcnMiUSQhIzckIjA2NjFCP21AIiEjNjckJCIwUnUwaU89USQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiNHczcWcmUSQhIzckIjA2NjFCP21AIiEjNjckJCIwUnUwaU89USQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiNHczcWcmUSQhIzckIjA2NjFCP21AIiEjNjckJCIwbSdRcWtyJlEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPXQmZW9bKlEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMG0nUXFrciZRJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMD10JmVvWypRJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAjKik+P2pmKlEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwVyZRM25PJFIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCMqKT4/amYqUSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBXJlEzbk8kUiQhIzckIjA2NjFCP21AIiEjNjckJCIwPjYrPHdNUiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjByKD5lbEMoUiQhIzckIjA2NjFCP21AIiEjNjckJCIwPjYrPHdNUiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjByKD5lbEMoUiQhIzckIjA2NjFCP21AIiEjNjckJCIwWEIpPmdOKFIkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKCo0ITNrNyxNISM3JCIwNjYxQj9tQCIhIzY3JCQiMFhCKT5nTihSJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCgqNCEzazcsTSEjNyQiMDY2MUI/bUAiISM2NyQkIjBzTidwZUIsTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMENBeUQxXVMkISM3JCIwNjYxQj9tQCIhIzY3JCQiMHNOJ3BlQixNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQ0F5RDFdUyQhIzckIjA2NjFCP21AIiEjNjckJCIwKXpXPmQ2ME0hIzckIjA2NjFCP21AIiEjNjckNyQkIi9YajJoKSkzTSEjNiQiMDY2MUI/bUAiISM2NyQkIjApelc+ZDYwTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL1hqMmgpKTNNISM2JCIwNjYxQj9tQCIhIzY3JCQiMERnI3BiKiozTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHhZdSZmdzdNISM3JCIwNjYxQj9tQCIhIzY3JCQiMERnI3BiKiozTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHhZdSZmdzdNISM3JCIwNjYxQj9tQCIhIzY3JCQiMF5zIT5hKEdUJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC5mcyFlaztNISM3JCIwNjYxQj9tQCIhIzY3JCQiMF5zIT5hKEdUJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC5mcyFlaztNISM3JCIwNjYxQj9tQCIhIzY3JCQiMHklKSlvX3Y7TSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLzgyZGNfP00hIzYkIjA2NjFCP21AIiEjNjckJCIweSUpKW9fdjtNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvODJkY18/TSEjNiQiMDY2MUI/bUAiISM2NyQkIjAvKHA9Xmo/TSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGMkKW9dMFdVJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAvKHA9Xmo/TSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGMkKW9dMFdVJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBKNCZvXF5DTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCRlcGNgR0dNISM3JCIwNjYxQj9tQCIhIzY3JCQiMEo0Jm9cXkNNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJGVwY2BHR00hIzckIjA2NjFCP21AIiEjNjckJCIwZEAkPVtSR00hIzckIjA2NjFCP21AIiEjNjckNyQkIjA0M2w/bEBWJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBkQCQ9W1JHTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDQzbD9sQFYkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCVROG9ZRktNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTz9qMFhnViQhIzckIjA2NjFCP21AIiEjNjckJCIwJVE4b1lGS00hIzckIjA2NjFCP21AIiEjNjckNyQkIjBPP2owWGdWJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9oJXpeYWhWJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMGlLaCFcIypSTSEjNyQiMDY2MUI/bUAiISM2NyQkIi9oJXpeYWhWJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMGlLaCFcIypSTSEjNyQiMDY2MUI/bUAiISM2NyQkIjBQZXhPTStXJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCpbJWZ2L1FXJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBQZXhPTStXJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCpbJWZ2L1FXJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBqcXZAOVJXJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDpkZGclb1pNISM3JCIwNjYxQj9tQCIhIzY3JCQiMGpxdkA5UlckISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOmRkZyVvWk0hIzckIjA2NjFCP21AIiEjNjckJCIvSFFuU3paTSEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMFVwYlhrOlgkISM3JCIwNjYxQj9tQCIhIzY3JCQiL0hRblN6Wk0hIzYkIjA2NjFCP21AIiEjNjckNyQkIjBVcGJYazpYJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA7Jj48Um5eTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG8iUTBWV2JNISM3JCIwNjYxQj9tQCIhIzY3JCQiMDsmPjxSbl5NISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbyJRMFZXYk0hIzckIjA2NjFCP21AIiEjNjckJCIwVjJxd2BiWCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAmUj5iVEtmTSEjNyQiMDY2MUI/bUAiISM2NyQkIjBWMnF3YGJYJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCZSPmJUS2ZNISM3JCIwNjYxQj9tQCIhIzY3JCQiMHA+b2hMJWZNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQDFdKy9LWSQhIzckIjA2NjFCP21AIiEjNjckJCIwcD5vaEwlZk0hIzckIjA2NjFCP21AIiEjNjckNyQkIjBAMV0rL0tZJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAnPmptTUpqTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFs9WyZRM25NISM3JCIwNjYxQj9tQCIhIzY3JCQiMCc+am1NSmpNISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWz1bJlEzbk0hIzckIjA2NjFCP21AIiEjNjckJCIwQVdrSiQ+bk0hIzckIjA2NjFCP21AIiEjNjckNyQkIjB1SVlxajRaJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBBV2tKJD5uTSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHVJWXFqNFokISM3JCIwNjYxQj9tQCIhIzY3JCQiMFxjaTt0NVokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwLFZXYlZbWiQhIzckIjA2NjFCP21AIiEjNjckJCIwXGNpO3Q1WiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAsVldiVltaJCEjNyQiMDY2MUI/bUAiISM2NyQkIjB2b2csYFxaJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEdiVVNCKHlNISM3JCIwNjYxQj9tQCIhIzY3JCQiMHZvZyxgXFokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwR2JVU0IoeU0hIzckIjA2NjFCP21AIiEjNjckJCIwLSIpZSdHJCl5TSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGFuU0QuRVskISM3JCIwNjYxQj9tQCIhIzY3JCQiMC0iKWUnRyQpeU0hIzckIjA2NjFCP21AIiEjNjckNyQkIjBhblNELkVbJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBHJHA6RnIjWyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiKXpRNSRbJ1skISM3JCIwNjYxQj9tQCIhIzY3JCQiMEckcDpGciNbJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCIpelE1JFsnWyQhIzckIjA2NjFCP21AIiEjNjckJCIwYjBiYyNmJ1skISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMiNwYEhPIVwkISM3JCIwNjYxQj9tQCIhIzY3JCQiMGIwYmMjZidbJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDIjcGBITyFcJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAieUo6Q1ohXCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBNL04hR0MlXCQhIzckIjA2NjFCP21AIiEjNjckJCIwInlKOkNaIVwkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTS9OIUdDJVwkISM3JCIwNjYxQj9tQCIhIzY3JCQiMDNJXkVfVlwkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvbUpgRTcpXCQhIzYkIjA2NjFCP21AIiEjNjckJCIwM0leRV9WXCQhIzckIjA2NjFCP21AIiEjNjckNyQkIi9tSmBFNylcJCEjNiQiMDY2MUI/bUAiISM2NyQkIjBNVVw2SyMpXCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAoKUdKXS0/XSQhIzckIjA2NjFCP21AIiEjNjckJCIwTVVcNksjKVwkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKClHSl0tP10kISM3JCIwNjYxQj9tQCIhIzY3JCQiMGhhWic+Ni1OISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOFRITiMpZV0kISM3JCIwNjYxQj9tQCIhIzY3JCQiMGhhWic+Ni1OISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOFRITiMpZV0kISM3JCIwNjYxQj9tQCIhIzY3JCQiMChvYzk9KmZdJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL012LUF3NE4hIzYkIjA2NjFCP21AIiEjNjckJCIwKG9jOT0qZl0kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvTXYtQXc0TiEjNiQiMDY2MUI/bUAiISM2NyQkIjA5elZtcik0TiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG1sRDBVT14kISM3JCIwNjYxQj9tQCIhIzY3JCQiMDl6Vm1yKTROISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbWxEMFVPXiQhIzckIjA2NjFCP21AIiEjNjckJCIvOT45OnY4TiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCR6UC0+XzxOISM3JCIwNjYxQj9tQCIhIzY3JCQiLzk+OTp2OE4hIzYkIjA2NjFCP21AIiEjNjckNyQkIjAkelAtPl88TiEjNyQiMDY2MUI/bUAiISM2NyQkIjBuLlNPSndeJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMD4hPl88U0BOISM3JCIwNjYxQj9tQCIhIzY3JCQiMG4uU09Kd14kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPiE+XzxTQE4hIzckIjA2NjFCP21AIiEjNjckJCIwJGYiUUA2Ol8kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWS0/ZyJHRE4hIzckIjA2NjFCP21AIiEjNjckJCIwJGYiUUA2Ol8kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWS0/ZyJHRE4hIzckIjA2NjFCP21AIiEjNjckJCIvI0dPMSJSRE4hIzYkIjA2NjFCP21AIiEjNjckNyQkIjBzOT1YaCJITiEjNyQiMDY2MUI/bUAiISM2NyQkIi8jR08xIlJETiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMHM5PVhoIkhOISM3JCIwNjYxQj9tQCIhIzY3JCQiMFlTTSI0RkhOISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKnBpLDgvTE4hIzckIjA2NjFCP21AIiEjNjckJCIwWVNNIjRGSE4hIzckIjA2NjFCP21AIiEjNjckNyQkIjAqcGksOC9MTiEjNyQiMDY2MUI/bUAiISM2NyQkIjB0X0t3XUpgJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMERSOTpAcGAkISM3JCIwNjYxQj9tQCIhIzY3JCQiMHRfS3ddSmAkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRFI5OkBwYCQhIzckIjA2NjFCP21AIiEjNjckJCIwKlwxODEuUE4hIzckIjA2NjFCP21AIiEjNjckNyQkIjBfXjcrLDNhJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAqXDE4MS5QTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMF9eNyssM2EkISM3JCIwNjYxQj9tQCIhIzY3JCQiMEV4R1k1NGEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweWo1JjNvV04hIzckIjA2NjFCP21AIiEjNjckJCIwRXhHWTU0YSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjB5ajUmM29XTiEjNyQiMDY2MUI/bUAiISM2NyQkIjBfKm83LnpXTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDB3M3FnJltOISM3JCIwNjYxQj9tQCIhIzY3JCQiMF8qbzcueldOISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMHczcWcmW04hIzckIjA2NjFCP21AIiEjNjckJCIweixEO3EnW04hIzckIjA2NjFCP21AIiEjNjckNyQkIjBKKW9dMFdfTiEjNyQiMDY2MUI/bUAiISM2NyQkIjB6LEQ7cSdbTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEopb10wV19OISM3JCIwNjYxQj9tQCIhIzY3JCQiMDE5QixdRGIkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZSswUz9qYiQhIzckIjA2NjFCP21AIiEjNjckJCIwMTlCLF1EYiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBlKzBTP2piJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBLRUAnKUhrYiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAlR0pdLT9nTiEjNyQiMDY2MUI/bUAiISM2NyQkIjBLRUAnKUhrYiQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAlR0pdLT9nTiEjNyQiMDY2MUI/bUAiISM2NyQkIjBmUT5yNC5jJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDZELDUhM2tOISM3JCIwNjYxQj9tQCIhIzY3JCQiMGZRPnI0LmMkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNkQsNSEza04hIzckIjA2NjFCP21AIiEjNjckJCIwJjN2aCYqPWtOISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUFAqXCpmemMkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCYzdmgmKj1rTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFBQKlwqZnpjJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA2ajpUcCFvTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGtcKCp6Uj1kJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA2ajpUcCFvTiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGtcKCp6Uj1kJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBRdjhFXD5kJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLz5jXCc+ZGQkISM2JCIwNjYxQj9tQCIhIzY3JCQiMFF2OEVcPmQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvPmNcJz5kZCQhIzYkIjA2NjFCP21AIiEjNjckJCIwbCg9NiJIZWQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPHUkKlwqZnpOISM3JCIwNjYxQj9tQCIhIzY3JCQiMGwoPTYiSGVkJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDx1JCpcKmZ6TiEjNyQiMDY2MUI/bUAiISM2NyQkIjAiKioqNCcqMyh6TiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFYnPVwkek1lJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAiKioqNCcqMyh6TiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFYnPVwkek1lJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA9NzMiKSllJGUkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvKCkqKik+ZnRlJCEjNiQiMDY2MUI/bUAiISM2NyQkIjA9NzMiKSllJGUkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvKCkqKik+ZnRlJCEjNiQiMDY2MUI/bUAiISM2NyQkIjBXQzFtb3VlJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCc0IilbIVI3ZiQhIzckIjA2NjFCP21AIiEjNjckJCIwV0MxbW91ZSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAnNCIpWyFSN2YkISM3JCIwNjYxQj9tQCIhIzY3JCQiMHJPL15bOGYkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQkInKSopPV5mJCEjNyQiMDY2MUI/bUAiISM2NyQkIjByTy9eWzhmJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEJCJykqKT1eZiQhIzckIjA2NjFCP21AIiEjNjckJCIwKCpbLU9HX2YkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXE4lWygpKiopZiQhIzckIjA2NjFCP21AIiEjNjckJCIwKCpbLU9HX2YkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXE4lWygpKiopZiQhIzckIjA2NjFCP21AIiEjNjckJCIwQ2grQDMiKmYkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwd1ojKWZ5R2ckISM3JCIwNjYxQj9tQCIhIzY3JCQiMENoK0AzIipmJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHdaIylmeUdnJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9OKClmISkpSGckISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwLWchWyVlbmckISM3JCIwNjYxQj9tQCIhIzY3JCQiL04oKWYhKSlIZyQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAtZyFbJWVuZyQhIzckIjA2NjFCP21AIiEjNjckJCIweCZvNHonb2ckISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwSHN5SFExaCQhIzckIjA2NjFCP21AIiEjNjckJCIweCZvNHonb2ckISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwSHN5SFExaCQhIzckIjA2NjFCP21AIiEjNjckJCIwLilcZnh1NU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjBiJW9aIj1YaCQhIzckIjA2NjFCP21AIiEjNjckJCIwLilcZnh1NU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjBiJW9aIj1YaCQhIzckIjA2NjFCP21AIiEjNjckJCIvLko0d2k5TyEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCNvXCgqelI9TyEjNyQiMDY2MUI/bUAiISM2NyQkIi8uSjR3aTlPISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwI29cKCp6Uj1PISM3JCIwNjYxQj9tQCIhIzY3JCQiMGNBImZ1XT1PISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMzR0JXlGQU8hIzckIjA2NjFCP21AIiEjNjckJCIwY0EiZnVdPU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjAzNHQleUZBTyEjNyQiMDY2MUI/bUAiISM2NyQkIjAkWyQqM3RRQU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjBOQHJwZGhpJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAkWyQqM3RRQU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjBOQHJwZGhpJCEjNyQiMDY2MUI/bUAiISM2NyQkIjA0WihlckVFTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGhMcGFQK2okISM3JCIwNjYxQj9tQCIhIzY3JCQiMDRaKGVyRUVPISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwaExwYVAraiQhIzckIjA2NjFCP21AIiEjNjckJCIwT2YmM3E5SU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjApZXUnUjxSaiQhIzckIjA2NjFCP21AIiEjNjckJCIwT2YmM3E5SU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjApZXUnUjxSaiQhIzckIjA2NjFCP21AIiEjNjckJCIwaXIkZW8tTU8hIzckIjA2NjFCP21AIiEjNjckNyQkIjA5ZWxDKHpQTyEjNyQiMDY2MUI/bUAiISM2NyQkIjBpciRlby1NTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDllbEMoelBPISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpRPTNuIXpqJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFRxajR4O2skISM3JCIwNjYxQj9tQCIhIzY3JCQiMCpRPTNuIXpqJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFRxajR4O2skISM3JCIwNjYxQj9tQCIhIzY3JCQiMDonKnpiJ3lUTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG4jPVlwYlhPISM3JCIwNjYxQj9tQCIhIzY3JCQiMDonKnpiJ3lUTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG4jPVlwYlhPISM3JCIwNjYxQj9tQCIhIzY3JCQiMFUzeVNtY2skISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJVwqZnpPJVxPISM3JCIwNjYxQj9tQCIhIzY3JCQiMFUzeVNtY2skISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJVwqZnpPJVxPISM3JCIwNjYxQj9tQCIhIzY3JCQiMG8/d0RZJlxPISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvcyFlaztMbCQhIzYkIjA2NjFCP21AIiEjNjckJCIwbz93RFkmXE8hIzckIjA2NjFCP21AIiEjNjckNyQkIi9zIWVrO0xsJCEjNiQiMDY2MUI/bUAiISM2NyQkIjAmSFYyaFVgTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFo+Y1wnPmRPISM3JCIwNjYxQj9tQCIhIzY3JCQiMCZIVjJoVWBPISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWj5jXCc+ZE8hIzckIjA2NjFCP21AIiEjNjckJCIwQFhzJmZJZE8hIzckIjA2NjFCP21AIiEjNjckNyQkIjB0SmFNdzVtJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBAWHMmZklkTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHRKYU13NW0kISM3JCIwNjYxQj9tQCIhIzY3JCQiMFtkcSFlPWhPISM3JCIwNjYxQj9tQCIhIzY3JDckJCIuV18+Y1xtJCEjNSQiMDY2MUI/bUAiISM2NyQkIjBbZHEhZT1oTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLldfPmNcbSQhIzUkIjA2NjFCP21AIiEjNjckJCIwdXBvbGxdbSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBFY10vTylvTyEjNyQiMDY2MUI/bUAiISM2NyQkIjB1cG9sbF1tJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEVjXS9PKW9PISM3JCIwNjYxQj9tQCIhIzY3JCQiMCwjbzFiJSpvTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGBvWyplcnNPISM3JCIwNjYxQj9tQCIhIzY3JCQiMCwjbzFiJSpvTyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGBvWyplcnNPISM3JCIwNjYxQj9tQCIhIzY3JCQiMEYlXGNgI0duJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHohb1dkZndPISM3JCIwNjYxQj9tQCIhIzY3JCQiMEYlXGNgI0duJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHohb1dkZndPISM3JCIwNjYxQj9tQCIhIzY3JCQiMGExaj8wbm4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMSRcJWZ2L28kISM3JCIwNjYxQj9tQCIhIzY3JCQiMGExaj8wbm4kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMSRcJWZ2L28kISM3JCIwNjYxQj9tQCIhIzY3JCQiLyk9aDAmZSFvJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMEwwVldiVm8kISM3JCIwNjYxQj9tQCIhIzY3JCQiLyk9aDAmZSFvJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMEwwVldiVm8kISM3JCIwNjYxQj9tQCIhIzY3JCQiMDJKZiFcWSVvJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGY8VEhOIylvJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAySmYhXFklbyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBmPFRITiMpbyQhIzckIjA2NjFCP21AIiEjNjckJCIwTFZkdlckKW8kISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJylIUjk6QHAkISM3JCIwNjYxQj9tQCIhIzY3JCQiMExWZHZXJClvJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCcpSFI5OkBwJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9jYjBZQSNwJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMDdVUCpcKmZwJCEjNyQiMDY2MUI/bUAiISM2NyQkIi9jYjBZQSNwJCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMDdVUCpcKmZwJCEjNyQiMDY2MUI/bUAiISM2NyQkIjAneU9iVzUncCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBSYU4lWygpKnAkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCd5T2JXNSdwJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFJhTiVbKCkqcCQhIzckIjA2NjFCP21AIiEjNjckJCIwOCE9MFYpKipwJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGxtTHBhUHEkISM3JCIwNjYxQj9tQCIhIzY3JCQiMDghPTBWKSoqcCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBsbUxwYVBxJCEjNyQiMDY2MUI/bUAiISM2NyQkIjBSIypcOmtRcSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAjKnlKYU13cSQhIzckIjA2NjFCP21AIiEjNjckJCIwUiMqXDprUXEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIyp5SmFNd3EkISM3JCIwNjYxQj9tQCIhIzY3JCQiMG0vWytXeHEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMG0vWytXeHEkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPSIqSFI5OnIkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCNwaGFRaTZQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWC5HQyVSOlAhIzckIjA2NjFCP21AIiEjNjckJCIwI3BoYVFpNlAhIzckIjA2NjFCP21AIiEjNjckNyQkIjBYLkdDJVI6UCEjNyQiMDY2MUI/bUAiISM2NyQkIjA+SFdxLmJyJCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHI6RTR1Iz5QISM3JCIwNjYxQj9tQCIhIzY3JCQiMD5IV3EuYnIkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwcjpFNHUjPlAhIzckIjA2NjFCP21AIiEjNjckJCIwWFRVYiRRPlAhIzckIjA2NjFCP21AIiEjNjckNyQkIjApelVVUjpCUCEjNyQiMDY2MUI/bUAiISM2NyQkIjBYVFViJFE+UCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCl6VVVSOkJQISM3JCIwNjYxQj9tQCIhIzY3JCQiMHNgU1NqS3MkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQ1NBekxxcyQhIzckIjA2NjFCP21AIiEjNjckJCIwc2BTU2pLcyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBDU0F6THFzJCEjNyQiMDY2MUI/bUAiISM2NyQkIjApZidRRFZycyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBeXz9rODR0JCEjNyQiMDY2MUI/bUAiISM2NyQkIjApZidRRFZycyQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBeXz9rODR0JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBEeU81QjV0JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHhrPVwkek1QISM3JCIwNjYxQj9tQCIhIzY3JCQiMER5TzVCNXQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweGs9XCR6TVAhIzckIjA2NjFCP21AIiEjNjckJCIwXiFcYEghXHQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwL3g7TXQnUVAhIzckIjA2NjFCP21AIiEjNjckJCIwXiFcYEghXHQkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwL3g7TXQnUVAhIzckIjA2NjFCP21AIiEjNjckJCIweS1MIUd5UVAhIzckIjA2NjFCP21AIiEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjA2NjFCP21AIiEjNjckJCIweS1MIUd5UVAhIzckIjA2NjFCP21AIiEjNjckNyQkIi8kKlsiPmBEdSQhIzYkIjA2NjFCP21AIiEjNjckJCIwLzpKbGlFdSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBkLDgvTGt1JCEjNyQiMDY2MUI/bUAiISM2NyQkIjAvOkpsaUV1JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGQsOC9Ma3UkISM3JCIwNjYxQj9tQCIhIzY3JCQiMEpGSF1VbHUkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJFE2IipHSl1QISM3JCIwNjYxQj9tQCIhIzY3JCQiMEpGSF1VbHUkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJFE2IipHSl1QISM3JCIwNjYxQj9tQCIhIzY3JCQiMGRSRk5BL3YkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvaCM0dSM+YVAhIzYkIjA2NjFCP21AIiEjNjckJCIwZFJGTkEvdiQhIzckIjA2NjFCP21AIiEjNjckNyQkIi9oIzR1Iz5hUCEjNiQiMDY2MUI/bUAiISM2NyQkIjAlPWItQUlhUCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiME9RMmZzIWVQISM3JCIwNjYxQj9tQCIhIzY3JCQiMCU9Yi1BSWFQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwT1EyZnMhZVAhIzckIjA2NjFCP21AIiEjNjckJCIwNmtCMCM9ZVAhIzckIjA2NjFCP21AIiEjNjckNyQkIjBqXTBXXz53JCEjNyQiMDY2MUI/bUAiISM2NyQkIjA2a0IwIz1lUCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGpdMFdfPnckISM3JCIwNjYxQj9tQCIhIzY3JCQiMFB3QCE+MWlQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKkdPIUhLZXckISM3JCIwNjYxQj9tQCIhIzY3JCQiMFB3QCE+MWlQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKkdPIUhLZXckISM3JCIwNjYxQj9tQCIhIzY3JCQiMGspKT52VGZ3JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDt2LDk3KHBQISM3JCIwNjYxQj9tQCIhIzY3JCQiMGspKT52VGZ3JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDt2LDk3KHBQISM3JCIwNjYxQj9tQCIhIzY3JCQiLzQhPWdAKXBQISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwVSgpKiopPmZ0UCEjNyQiMDY2MUI/bUAiISM2NyQkIi80IT1nQClwUCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMFUoKSoqKT5mdFAhIzckIjA2NjFCP21AIiEjNjckJCIwOzg7WCxQeCQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBwKnpSPVp4UCEjNyQiMDY2MUI/bUAiISM2NyQkIjA7ODtYLFB4JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHAqelI9WnhQISM3JCIwNjYxQj9tQCIhIzY3JCQiMFZEOUkiZXhQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJj5oKm9eOHkkISM3JCIwNjYxQj9tQCIhIzY3JCQiMFZEOUkiZXhQISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJj5oKm9eOHkkISM3JCIwNjYxQj9tQCIhIzY3JCQiL3hCXjZZInkkISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwQUMlUjpCJnkkISM3JCIwNjYxQj9tQCIhIzY3JCQiL3hCXjZZInkkISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwQUMlUjpCJnkkISM3JCIwNjYxQj9tQCIhIzY3JCQiMCcqXDUrVGB5JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFtPIypRNiIqeSQhIzckIjA2NjFCP21AIiEjNjckJCIwJypcNStUYHkkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwW08jKlE2Iip5JCEjNyQiMDY2MUI/bUAiISM2NyQkIjBCaTMmM0EqeSQhIzckIjA2NjFCP21AIiEjNjckNyQkIjB2WyFSNypIeiQhIzckIjA2NjFCP21AIiEjNjckJCIwQmkzJjNBKnkkISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdlshUjcqSHokISM3JCIwNjYxQj9tQCIhIzY3JCQiMFx1MXErSnokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwLGgpKTNyb3okISM3JCIwNjYxQj9tQCIhIzY3JCQiMFx1MXErSnokISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwLGgpKTNyb3okISM3JCIwNjYxQj9tQCIhIzY3JCQiMHcnW10wKXB6JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEd0J1E0ditRISM3JCIwNjYxQj9tQCIhIzY3JCQiMHcnW10wKXB6JCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEd0J1E0ditRISM3JCIwNjYxQj9tQCIhIzY3JCQiMC0qSCsvJzMhUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGEmWyl5SVkhUSEjNyQiMDY2MUI/bUAiISM2NyQkIjAtKkgrLyczIVEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBhJlspeUlZIVEhIzckIjA2NjFCP21AIiEjNjckJCIwSDYsRFNaIVEhIzckIjA2NjFCP21AIiEjNjckNyQkIjAieUhRMV4zUSEjNyQiMDY2MUI/bUAiISM2NyQkIjBINixEU1ohUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIwNjYxQj9tQCIhIzY3JCQiMGJCKio0PyczUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDI1IilbIVI3USEjNyQiMDY2MUI/bUAiISM2NyQkIjBiQioqND8nM1EhIzckIjA2NjFCP21AIiEjNjckNyQkIjAyNSIpWyFSN1EhIzckIjA2NjFCP21AIiEjNjckJCIwI2V0XCoqXDdRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTUF6THFpIlEhIzckIjA2NjFCP21AIiEjNjckJCIwI2V0XCoqXDdRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTUF6THFpIlEhIzckIjA2NjFCP21AIiEjNjckJCIwM1smKnp6aiJRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvWXQoPV0sI1EhIzYkIjA2NjFCP21AIiEjNjckJCIwM1smKnp6aiJRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvWXQoPV0sI1EhIzYkIjA2NjFCP21AIiEjNjckJCIwTmckXCdmLSNRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKG9hUCsuQ1EhIzckIjA2NjFCP21AIiEjNjckJCIwTmckXCdmLSNRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKG9hUCsuQ1EhIzckIjA2NjFCP21AIiEjNjckJCIwaHMiKlxSVCNRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIwNjYxQj9tQCIhIzY3JCQiMGhzIipcUlQjUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDhmdCkpNHojUSEjNyQiMDY2MUI/bUAiISM2NyQkIjApWykqWyQ+IUdRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvOTxQKCp5SlEhIzYkIjA2NjFCP21AIiEjNjckJCIwKVspKlskPiFHUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLzk8UCgqeUpRISM2JCIwNjYxQj9tQCIhIzY3JCQiMDkoeik+Kio9JFEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBtJClwZXBjJFEhIzckIjA2NjFCP21AIiEjNjckJCIwOSh6KT4qKj0kUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG0kKXBlcGMkUSEjNyQiMDY2MUI/bUAiISM2NyQkIjBUNCdbIXpkJFEhIzckIjA2NjFCP21AIiEjNjckNyQkIjAkZnpPJVwmUlEhIzckIjA2NjFCP21AIiEjNjckJCIwVDQnWyF6ZCRRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJGZ6TyVcJlJRISM3JCIwNjYxQj9tQCIhIzY3JCQiMG5AJSkqKWUnUlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjA+M21HSE0lUSEjNyQiMDY2MUI/bUAiISM2NyQkIjBuQCUpKillJ1JRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPjNtR0hNJVEhIzckIjA2NjFCP21AIiEjNjckJCIwJVJCWyhRTiVRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWT9rODR0JVEhIzckIjA2NjFCP21AIiEjNjckJCIwJVJCWyhRTiVRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwWT9rODR0JVEhIzckIjA2NjFCP21AIiEjNjckJCIvaS8pZj11JVEhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBzS2kpKik9XlEhIzckIjA2NjFCP21AIiEjNjckJCIvaS8pZj11JVEhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBzS2kpKik9XlEhIzckIjA2NjFCP21AIiEjNjckJCIwWmV5VylIXlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjAqXC9PKW9dJlEhIzckIjA2NjFCP21AIiEjNjckJCIwWmV5VylIXlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjAqXC9PKW9dJlEhIzckIjA2NjFCP21AIiEjNjckJCIwdHF3SHleJlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBEZGVvWyplUSEjNyQiMDY2MUI/bUAiISM2NyQkIjB0cXdIeV4mUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMERkZW9bKmVRISM3JCIwNjYxQj9tQCIhIzY3JCQiLiRbWiJlIWZRISM1JCIwNjYxQj9tQCIhIzY3JDckJCIwX3BjYEdHJ1EhIzckIjA2NjFCP21AIiEjNjckJCIuJFtaImUhZlEhIzUkIjA2NjFCP21AIiEjNjckNyQkIjBfcGNgR0cnUSEjNyQiMDY2MUI/bUAiISM2NyQkIjBFJkgoKnokSCdRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweSJbJlEzbidRISM3JCIwNjYxQj9tQCIhIzY3JCQiMEUmSCgqeiRIJ1EhIzckIjA2NjFCP21AIiEjNjckNyQkIjB5IlsmUTNuJ1EhIzckIjA2NjFCP21AIiEjNjckJCIwYDJyJXkibydRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMCVITiMpZXFRISM3JCIwNjYxQj9tQCIhIzY3JCQiMGAyciV5Im8nUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMDY2MUI/bUAiISM2NyQkIjB6PnBwKHBxUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEoxXjNvVyhRISM3JCIwNjYxQj9tQCIhIzY3JCQiMHo+cHAocHFRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwSjFeM29XKFEhIzckIjA2NjFCP21AIiEjNjckJCIwMUtuYXhYKFEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBlPVwkek15USEjNyQiMDY2MUI/bUAiISM2NyQkIjAxS25heFgoUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGU9XCR6TXlRISM3JCIwNjYxQj9tQCIhIzY3JCQiMEtXbFJkJXlRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJTN0JXlGQSlRISM3JCIwNjYxQj9tQCIhIzY3JCQiMEtXbFJkJXlRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJTN0JXlGQSlRISM3JCIwNjYxQj9tQCIhIzY3JCQiMGZjakNQQilRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNlZYajJoKVEhIzckIjA2NjFCP21AIiEjNjckJCIwZmNqQ1BCKVEhIzckIjA2NjFCP21AIiEjNjckNyQkIjA2VlhqMmgpUSEjNyQiMDY2MUI/bUAiISM2NyQkIjAmKW9oNDxpKVEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBQYlZbKCkqKilRISM3JCIwNjYxQj9tQCIhIzY3JCQiMCYpb2g0PGkpUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFBiVlsoKSoqKVEhIzckIjA2NjFCP21AIiEjNjckJCIwNyIpZiVwNCEqUSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGtuVExuUSpRISM3JCIwNjYxQj9tQCIhIzY3JCQiMDciKWYlcDQhKlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjBrblRMblEqUSEjNyQiMDY2MUI/bUAiISM2NyQkIjBRJHomendSKlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjAiKnpSPVp4KlEhIzckIjA2NjFCP21AIiEjNjckJCIwUSR6Jnp3UipRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwIip6Uj1aeCpRISM3JCIwNjYxQj9tQCIhIzY3JCQiMGwwY2tjeSpRISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPCN6THFpLFIhIzckIjA2NjFCP21AIiEjNjckJCIwbDBja2N5KlEhIzckIjA2NjFCP21AIiEjNjckNyQkIjA8I3pMcWksUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAielQmXE88IVIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBXL08pb10wUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAielQmXE88IVIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBXL08pb10wUiEjNyQiMDY2MUI/bUAiISM2NyQkIjA9SV9NO2MhUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL25UTG5RNFIhIzYkIjA2NjFCP21AIiEjNjckJCIwPUlfTTtjIVIhIzckIjA2NjFCP21AIiEjNjckNyQkIi9uVExuUTRSISM2JCIwNjYxQj9tQCIhIzY3JCQiMFdVXT4nXDRSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKCpHS2VtSyJSISM3JCIwNjYxQj9tQCIhIzY3JCQiMFdVXT4nXDRSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKCpHS2VtSyJSISM3JCIwNjYxQj9tQCIhIzY3JCQiMHJhWy93TCJSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQlRJVllyIlIhIzckIjA2NjFCP21AIiEjNjckJCIwcmFbL3dMIlIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBCVElWWXIiUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAocG0lKmVEPFIhIzckIjA2NjFCP21AIiEjNjckNyQkIi9OJkdHRTUjUiEjNiQiMDY2MUI/bUAiISM2NyQkIjAocG0lKmVEPFIhIzckIjA2NjFCP21AIiEjNjckNyQkIi9OJkdHRTUjUiEjNiQiMDY2MUI/bUAiISM2NyQkIjBDeld1TjYjUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHdsRTgxXCNSISM3JCIwNjYxQj9tQCIhIzY3JCQiMEN6V3VONiNSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwd2xFODFcI1IhIzckIjA2NjFCP21AIiEjNjckJCIvOkglZjpdI1IhIzYkIjA2NjFCP21AIiEjNjckNyQkIjAueUMpZnlHUiEjNyQiMDY2MUI/bUAiISM2NyQkIi86SCVmOl0jUiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMC55QylmeUdSISM3JCIwNjYxQj9tQCIhIzY3JCQiMHguVFcmKilHUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEghSEtlbUtSISM3JCIwNjYxQj9tQCIhIzY3JCQiMHguVFcmKilHUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEghSEtlbUtSISM3JCIwNjYxQj9tQCIhIzY3JCQiMC47Ukh2RiRSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYy1Ab1hsJFIhIzckIjA2NjFCP21AIiEjNjckJCIwLjtSSHZGJFIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBjLUBvWGwkUiEjNyQiMDY2MUI/bUAiISM2NyQkIi8kR1A5Ym0kUiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMDY2MUI/bUAiISM2NyQkIi8kR1A5Ym0kUiEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBjU04qXGBTUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDRGPFEwViVSISM3JCIwNjYxQj9tQCIhIzY3JCQiMGNTTipcYFNSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNEY8UTBWJVIhIzckIjA2NjFCP21AIiEjNjckJCIwJEdOVltUV1IhIzckIjA2NjFCP21AIiEjNjckNyQkIjBOUjpCJj1bUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAkR05WW1RXUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiME5SOkImPVtSISM3JCIwNjYxQj9tQCIhIzY3JCQiMDRsSnAlSFtSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwaV44M2w/JlIhIzckIjA2NjFCP21AIiEjNjckJCIwNGxKcCVIW1IhIzckIjA2NjFCP21AIiEjNjckNyQkIjBpXjgzbD8mUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBPeEhhdUAmUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBPeEhhdUAmUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBpKnkjUmFnJlIhIzckIjA2NjFCP21AIiEjNjckNyQkIjA6dzR5QylmUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBpKnkjUmFnJlIhIzckIjA2NjFCP21AIiEjNjckNyQkIjA6dzR5QylmUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAqPWdVVSQqZlIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBUKXlJWXFqUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAqPWdVVSQqZlIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBUKXlJWXFqUiEjNyQiMDY2MUI/bUAiISM2NyQkIjA6OUM0OVEnUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMG8rMVslZW5SISM3JCIwNjYxQj9tQCIhIzY3JCQiMDo5QzQ5USdSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbysxWyVlblIhIzckIjA2NjFCP21AIiEjNjckJCIwVUVBJVJwblIhIzckIjA2NjFCP21AIiEjNjckNyQkIjAlSFRJVllyUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBVRUElUnBuUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCVIVElWWXJSISM3JCIwNjYxQj9tQCIhIzY3JCQiMHBRP3p0OihSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQEQtPVdgKFIhIzckIjA2NjFCP21AIiEjNjckJCIwcFE/enQ6KFIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBARC09V2AoUiEjNyQiMDY2MUI/bUAiISM2NyQkIjAmNCY9a2BhKFIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBaUCsuQyN6UiEjNyQiMDY2MUI/bUAiISM2NyQkIjAmNCY9a2BhKFIhIzckIjA2NjFCP21AIiEjNjckNyQkIjBaUCsuQyN6UiEjNyQiMDY2MUI/bUAiISM2NyQkIjBAajtcTCR6UiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHVcKXpRNSQpUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBAajtcTCR6UiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHVcKXpRNSQpUiEjNyQiMDY2MUI/bUAiISM2NyQkIjBbdjlNOEspUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLmknSFApcClSISM1JCIwNjYxQj9tQCIhIzY3JCQiMFt2OU04SylSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIuaSdIUClwKVIhIzUkIjA2NjFCP21AIiEjNjckJCIwdShHIj4kNCgpUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEZ1JXpOJzMqUiEjNyQiMDY2MUI/bUAiISM2NyQkIjB1KEciPiQ0KClSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRnUlek4nMypSISM3JCIwNjYxQj9tQCIhIzY3JCQiMCwrNi90NCpSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYCdHSE11JSpSISM3JCIwNjYxQj9tQCIhIzY3JCQiMCwrNi90NCpSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwYCdHSE11JSpSISM3JCIwNjYxQj9tQCIhIzY3JCQiMEc3NCpHJlsqUiEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiLykpNHpLaSkqUiEjNiQiMDY2MUI/bUAiISM2NyQkIjBHNzQqRyZbKlIhIzckIjA2NjFCP21AIiEjNjckNyQkIi8pKTR6S2kpKlIhIzYkIjA2NjFCP21AIiEjNjckJCIwYUMydUsoKSpSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMTYqR0pdLVMhIzckIjA2NjFCP21AIiEjNjckJCIwYUMydUsoKSpSISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMTYqR0pdLVMhIzckIjA2NjFCP21AIiEjNjckJCIwIm9gIWY3RSslISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTEIoeUhRMVMhIzckIjA2NjFCP21AIiEjNjckJCIwIm9gIWY3RSslISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTEIoeUhRMVMhIzckIjA2NjFCP21AIiEjNjckJCIwMlwuVyNcMVMhIzckIjA2NjFCP21AIiEjNjckNyQkIjBmTiZHR0U1UyEjNyQiMDY2MUI/bUAiISM2NyQkIjAyXC5XI1wxUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGZOJkdHRTVTISM3JCIwNjYxQj9tQCIhIzY3JCQiME1oLEhzLiwlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJ3lNeUU5OVMhIzckIjA2NjFCP21AIiEjNjckJCIwTWgsSHMuLCUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAneU15RTk5UyEjNyQiMDY2MUI/bUAiISM2NyQkIi9PKCpSQEQ5UyEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMDdnIkdELT1TISM3JCIwNjYxQj9tQCIhIzY3JCQiL08oKlJARDlTISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwN2ciR0QtPVMhIzckIjA2NjFCP21AIiEjNjckJCIwKGV5Kik+OD1TISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUnN6UC0+LSUhIzckIjA2NjFCP21AIiEjNjckJCIwKGV5Kik+OD1TISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwUnN6UC0+LSUhIzckIjA2NjFCP21AIiEjNjckJCIwOClmUj0sQVMhIzckIjA2NjFCP21AIiEjNjckNyQkIjBsJXlGQXlEUyEjNyQiMDY2MUI/bUAiISM2NyQkIjA4KWZSPSxBUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGwleUZBeURTISM3JCIwNjYxQj9tQCIhIzY3JCQiLy9UKm8iKmUtJSEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCNwZng/bUhTISM3JCIwNjYxQj9tQCIhIzY3JCQiLy9UKm8iKmUtJSEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMCNwZng/bUhTISM3JCIwNjYxQj9tQCIhIzY3JCQiMG1BI1I6eEhTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwPTR1Iz5hTFMhIzckIjA2NjFCP21AIiEjNjckJCIwbUEjUjp4SFMhIzckIjA2NjFCP21AIiEjNjckNyQkIjA9NHUjPmFMUyEjNyQiMDY2MUI/bUAiISM2NyQkIjAkXC4qUV5PLiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBYQHN4QHUuJSEjNyQiMDY2MUI/bUAiISM2NyQkIjAkXC4qUV5PLiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBYQHN4QHUuJSEjNyQiMDY2MUI/bUAiISM2NyQkIjA+WilRN2BQUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHJMcWksOC8lISM3JCIwNjYxQj9tQCIhIzY3JCQiMD5aKVE3YFBTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwckxxaSw4LyUhIzckIjA2NjFCP21AIiEjNjckJCIwWWYnKTM2OS8lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKWYlb1oiPVhTISM3JCIwNjYxQj9tQCIhIzY3JCQiMFlmJykzNjkvJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMClmJW9aIj1YUyEjNyQiMDY2MUI/bUAiISM2NyQkIjBzciVRNEhYUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMENlbUtoIVxTISM3JCIwNjYxQj9tQCIhIzY3JCQiMHNyJVE0SFhTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwQ2VtS2ghXFMhIzckIjA2NjFCP21AIiEjNjckJCIwKlJHKXlxIlxTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXnFrPFRIMCUhIzckIjA2NjFCP21AIiEjNjckJCIwKlJHKXlxIlxTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwXnFrPFRIMCUhIzckIjA2NjFCP21AIiEjNjckJCIwRCc0UTEwYFMhIzckIjA2NjFCP21AIiEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjA2NjFCP21AIiEjNjckJCIwRCc0UTEwYFMhIzckIjA2NjFCP21AIiEjNjckNyQkIjB4I0dFNSNvMCUhIzckIjA2NjFCP21AIiEjNjckJCIwXzN6W0lwMCUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAvJjR3M3FnUyEjNyQiMDY2MUI/bUAiISM2NyQkIjBfM3pbSXAwJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC8mNHczcWdTISM3JCIwNjYxQj9tQCIhIzY3JCQiMHk/eEw1MzElISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvdCFmcyFla1MhIzYkIjA2NjFCP21AIiEjNjckJCIweT94TDUzMSUhIzckIjA2NjFCP21AIiEjNjckNyQkIi90IWZzIWVrUyEjNiQiMDY2MUI/bUAiISM2NyQkIjAwTHY9IXBrUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwNjYxQj9tQCIhIzY3JCQiMDBMdj0hcGtTISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZD5kZGclb1MhIzckIjA2NjFCP21AIiEjNjckJCIwSlh0LnEmb1MhIzckIjA2NjFCP21AIiEjNjckNyQkIjAkPWBEL01zUyEjNyQiMDY2MUI/bUAiISM2NyQkIjBKWHQucSZvUyEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCQ9YEQvTXNTISM3JCIwNjYxQj9tQCIhIzY3JCQiMGVkcikpXEMyJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiL1RNdi1Bd1MhIzYkIjA2NjFCP21AIiEjNjckJCIwZWRyKSlcQzIlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvVE12LUF3UyEjNiQiMDY2MUI/bUAiISM2NyQkIjAlKXBwdEhqMiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBPY143KywzJSEjNyQiMDY2MUI/bUAiISM2NyQkIjAlKXBwdEhqMiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBPY143KywzJSEjNyQiMDY2MUI/bUAiISM2NyQkIjA2I3knZTQtMyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBqb1woKnpSMyUhIzckIjA2NjFCP21AIiEjNjckJCIwNiN5J2U0LTMlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwam9cKCp6UjMlISM3JCIwNjYxQj9tQCIhIzY3JCQiMFAlZk8lKjMlMyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAqM3lDKWZ5MyUhIzckIjA2NjFCP21AIiEjNjckJCIwUCVmTyUqMyUzJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCozeUMpZnkzJSEjNyQiMDY2MUI/bUAiISM2NyQkIjBrMWtHcHozJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDskZnUnUjw0JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBrMWtHcHozJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDskZnUnUjw0JSEjNyQiMDY2MUI/bUAiISM2NyQkIi8qPWk4XD00JSEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMFUwV18+YzQlISM3JCIwNjYxQj9tQCIhIzY3JCQiLyo9aThcPTQlISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwVTBXXz5jNCUhIzckIjA2NjFCP21AIiEjNjckJCIwPEpnKSpHZDQlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwcDxVUCpcKjQlISM3JCIwNjYxQj9tQCIhIzY3JCQiMDxKZykqR2Q0JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMHA8VVAqXCo0JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBWVmUkKTMnKjQlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJypIU0F6TDUlISM3JCIwNjYxQj9tQCIhIzY3JCQiMFZWZSQpMycqNCUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAnKkhTQXpMNSUhIzckIjA2NjFCP21AIiEjNjckJCIvZGwmbylbLlQhIzYkIjA2NjFCP21AIiEjNjckNyQkIjBBVVEyZnM1JSEjNyQiMDY2MUI/bUAiISM2NyQkIi9kbCZvKVsuVCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMEFVUTJmczUlISM3JCIwNjYxQj9tQCIhIzY3JCQiMCd6WU4mb3Q1JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFxhTyMqUTY2JSEjNyQiMDY2MUI/bUAiISM2NyQkIjAnellOJm90NSUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBcYU8jKlE2NiUhIzckIjA2NjFCP21AIiEjNjckJCIwQiFHJlFbNzYlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdm1NeD1dNiUhIzckIjA2NjFCP21AIiEjNjckJCIwQiFHJlFbNzYlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwdm1NeD1dNiUhIzckIjA2NjFCP21AIiEjNjckJCIwXCM0TiNHXjYlISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwLXpLaSkqKT1UISM3JCIwNjYxQj9tQCIhIzY3JCQiMFwjNE4jR142JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMC16S2kpKik9VCEjNyQiMDY2MUI/bUAiISM2NyQkIjB3L1wzMyE+VCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEciNHQleUY3JSEjNyQiMDY2MUI/bUAiISM2NyQkIjB3L1wzMyE+VCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEciNHQleUY3JSEjNyQiMDY2MUI/bUAiISM2NyQkIjAtPFokeilHNyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBiLkhLZW03JSEjNyQiMDY2MUI/bUAiISM2NyQkIjAtPFokeilHNyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBiLkhLZW03JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBISFh5bm43JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBISFh5bm43JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBiVFZqWjE4JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDNHRC09VzglISM3JCIwNjYxQj9tQCIhIzY3JCQiMGJUVmpaMTglISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwM0dELT1XOCUhIzckIjA2NjFCP21AIiEjNjckJCIwI1E6JVtGWDglISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTVNCKHlIUVQhIzckIjA2NjFCP21AIiEjNjckJCIwI1E6JVtGWDglISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwTVNCKHlIUVQhIzckIjA2NjFCP21AIiEjNjckJCIwM21STDIlUVQhIzckIjA2NjFCP21AIiEjNjckNyQkIjBoX0BzeEA5JSEjNyQiMDY2MUI/bUAiISM2NyQkIjAzbVJMMiVRVCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGhfQHN4QDklISM3JCIwNjYxQj9tQCIhIzY3JCQiME55UD0oR1VUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKFsnPmRkZzklISM3JCIwNjYxQj9tQCIhIzY3JCQiME55UD0oR1VUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKFsnPmRkZzklISM3JCIwNjYxQj9tQCIhIzY3JCQiMGghZkxxO1lUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwOXg8VVAqXFQhIzckIjA2NjFCP21AIiEjNjckJCIwaCFmTHE7WVQhIzckIjA2NjFCP21AIiEjNjckNyQkIjA5eDxVUCpcVCEjNyQiMDY2MUI/bUAiISM2NyQkIjApR1MkKW8vXVQhIzckIjA2NjFCP21AIiEjNjckNyQkIi8lKmVycyJROiUhIzYkIjA2NjFCP21AIiEjNjckJCIwKUdTJClvL11UISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvJSplcnMiUTolISM2JCIwNjYxQj9tQCIhIzY3JCQiMDk6S3RFUjolISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwbiw5NyhwZFQhIzckIjA2NjFCP21AIiEjNjckJCIwOTpLdEVSOiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBuLDk3KHBkVCEjNyQiMDY2MUI/bUAiISM2NyQkIjBURkllMXk6JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCRSQHJwZGhUISM3JCIwNjYxQj9tQCIhIzY3JCQiMFRGSWUxeTolISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwJFJAcnBkaFQhIzckIjA2NjFCP21AIiEjNjckJCIwblJHVidvaFQhIzckIjA2NjFCP21AIiEjNjckNyQkIi9pLUBvWGxUISM2JCIwNjYxQj9tQCIhIzY3JCQiMG5SR1Ynb2hUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIvaS1Ab1hsVCEjNiQiMDY2MUI/bUAiISM2NyQkIjAlPmwjR21iOyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBZUTNuTyRwVCEjNyQiMDY2MUI/bUAiISM2NyQkIjAlPmwjR21iOyUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBZUTNuTyRwVCEjNyQiMDY2MUI/bUAiISM2NyQkIi9VWUtoV3BUISM2JCIwNjYxQj9tQCIhIzY3JDckJCIwdF0xXztLPCUhIzckIjA2NjFCP21AIiEjNjckJCIvVVlLaFdwVCEjNiQiMDY2MUI/bUAiISM2NyQ3JCQiMHRdMV87SzwlISM3JCIwNjYxQj9tQCIhIzY3JCQiMFp3QSlmS3RUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwKkhZcWo0eFQhIzckIjA2NjFCP21AIiEjNjckJCIwWndBKWZLdFQhIzckIjA2NjFCP21AIiEjNjckNyQkIjAqSFlxajR4VCEjNyQiMDY2MUI/bUAiISM2NyQkIjB1KTNLZT94VCEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMEV2LUF3ND0lISM3JCIwNjYxQj9tQCIhIzY3JCQiMHUpM0tlP3hUISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwRXYtQXc0PSUhIzckIjA2NjFCP21AIiEjNjckJCIuLD5vJjMiPSUhIzUkIjA2NjFCP21AIiEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjA2NjFCP21AIiEjNjckJCIuLD5vJjMiPSUhIzUkIjA2NjFCP21AIiEjNjckNyQkIjBfKDNxZyZbPSUhIzckIjA2NjFCP21AIiEjNjckJCIwRTg8YGxcPSUhIzckIjA2NjFCP21AIiEjNjckNyQkIjB6KiopPmZ0KT0lISM3JCIwNjYxQj9tQCIhIzY3JCQiMEU4PGBsXD0lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIweioqKT5mdCk9JSEjNyQiMDY2MUI/bUAiISM2NyQkIjBgRDpRWCkpPSUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAwNyhwZGgjPiUhIzckIjA2NjFCP21AIiEjNjckJCIwYEQ6UVgpKT0lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwMDcocGRoIz4lISM3JCIwNjYxQj9tQCIhIzY3JCQiMHpQOEJERj4lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwS0MmPmNcJz4lISM3JCIwNjYxQj9tQCIhIzY3JCQiMHpQOEJERj4lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwS0MmPmNcJz4lISM3JCIwNjYxQj9tQCIhIzY3JCQiMDFdNjMwbT4lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwZU8kcGFQK1UhIzckIjA2NjFCP21AIiEjNjckJCIwMV02MzBtPiUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBlTyRwYVArVSEjNyQiMDY2MUI/bUAiISM2NyQkIjBMaTQkXFsrVSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCYpWyI+YEQvVSEjNyQiMDY2MUI/bUAiISM2NyQkIjBMaTQkXFsrVSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCYpWyI+YEQvVSEjNyQiMDY2MUI/bUAiISM2NyQkIjBmdTJ5a1Y/JSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMDZoKm9eODNVISM3JCIwNjYxQj9tQCIhIzY3JCQiMGZ1MnlrVj8lISM3JCIwNjYxQj9tQCIhIzY3JDckJCIwNmgqb144M1UhIzckIjA2NjFCP21AIiEjNjckJCIwJ29lSVlDM1UhIzckIjA2NjFCP21AIiEjNjckNyQkIjBRdCg9XSw3VSEjNyQiMDY2MUI/bUAiISM2NyQkIjAnb2VJWUMzVSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMFF0KD1dLDdVISM3JCIwNjYxQj9tQCIhIzY3JCQiMDcqUiFbQ0BAJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMGsmZW9bKmVAJSEjNyQiMDY2MUI/bUAiISM2NyQkIjA3KlIhW0NAQCUhIzckIjA2NjFCP21AIiEjNjckNyQkIjBrJmVvWyplQCUhIzckIjA2NjFCP21AIiEjNjckJCIwUjYtTC9nQCUhIzckIjA2NjFCP21AIiEjNjckNyQkIjAielI9Wng+VSEjNyQiMDY2MUI/bUAiISM2NyQkIjBSNi1ML2dAJSEjNyQiMDY2MUI/bUAiISM2NyQ3JCQiMCJ6Uj1aeD5VISM3JCIwNjYxQj9tQCIhIzY3JCQiMHAjKiozKD4rQSUhIzckIjB0SE5tJj07NyEjNjckNyQkIjA8NSNvWGxCVSEjNyQiMCg9cV0qUUFAIiEjNjckJCIwcCMqKjMoPitBJSEjNyQiMHRITm0mPTs3ISM2NyQ3JCQiMFdBIT1XYEZVISM3JCIwSDImZl5OKD4iISM2NyQkIjA6JkgzInBjQSUhIzckIjA7SExtSVg/IiEjNjckNyQkIjA6JkgzInBjQSUhIzckIjA7SExtSVg/IiEjNjckJCIwPDUjb1hsQlUhIzckIjAoPXFdKlFBQCIhIzY3JDckJCIvWiR5RTk5QiUhIzYkIjB1JG9JX0UjPSIhIzY3JCQiL3pqU0cqKUdVISM2JCIvM2s3LDQjPiIhIzU3JDckJCIvempTRyopR1UhIzYkIi8zazcsNCM+IiEjNTckJCIwV0EhPVdgRlUhIzckIjBIMiZmXk4oPiIhIzY3JDckJCIwKHBrPFRITlUhIzckIjBPTyRvKW9wOyIhIzY3JCQiL0A1QU5CTlUhIzYkIjAzazcsNHM7IiEjNjckNyQkIi9ANUFOQk5VISM2JCIwM2s3LDRzOyIhIzY3JCQiMCdIJSp6JHBcQiUhIzckIjApKSkqcEVdI282ISM2NyQ3JCQiMFlCXWshM0tVISM3JCIwV18+Y1wnejYhIzY3JCQiMCdIJSp6JHBcQiUhIzckIjApKSkqcEVdI282ISM2NyQ3JCQiMFlCXWshM0tVISM3JCIwV18+Y1wnejYhIzY3JCQiL1okeUU5OUIlISM2JCIwdSRvSV9FIz0iISM2NyQ3JCQiMEJmdSdSPFJVISM3JCIwWUApPWpZXjYhIzY3JCQiMGpnJnk0TlFVISM3JCIwc3YwWW9aOiIhIzY3JDckJCIwamcmeTROUVUhIzckIjBzdjBZb1o6IiEjNjckJCIwKHBrPFRITlUhIzckIjBPTyRvKW9wOyIhIzY3JDckJCIvOkY8UTBWVSEjNiQiMEc4TmxjZDgiISM2NyQkIi8xKSoqKWVWVFUhIzYkIjBPKCkpNHpLVTYhIzY3JDckJCIvMSkqKillVlRVISM2JCIwTygpKTR6S1U2ISM2NyQkIjBCZnUnUjxSVSEjNyQiMFlAKT1qWV42ISM2NyQ3JCQiMHckM25PJHBDJSEjNyQiMCpveCplUik+NiEjNjckJCIwQiEpcEMqW1dVISM3JCIuKj5mdCkpSDYhIio3JDckJCIwQiEpcEMqW1dVISM3JCIuKj5mdCkpSDYhIio3JCQiLzpGPFEwVlUhIzYkIjBHOE5sY2Q4IiEjNjckNyQkIjAuJypvXjgzRCUhIzckIjAmPScpR15yLjYhIzY3JCQiMGVsbkwvMEQlISM3JCIwR0F5RDFdNSIhIzY3JDckJCIwZWxuTC8wRCUhIzckIjBHQXlEMV01IiEjNjckJCIwM1JYO2UlXFUhIzckIjBFdCZIQE40NiEjNjckNyQkIjB6InAoKT5eWlUhIzckIjBrNSYzb1c8NiEjNjckJCIwM1JYO2UlXFUhIzckIjBFdCZIQE40NiEjNjckNyQkIjB6InAoKT5eWlUhIzckIjBrNSYzb1c8NiEjNjckJCIwdyQzbk8kcEMlISM3JCIwKm94KmVSKT42ISM2NyQ3JCQiMEgzbk8kcGFVISM3JCIwKClmMUgkUSgzIiEjNjckJCIwJDNSOm1ZYFUhIzckIjAjUjgyZGMjNCIhIzY3JDckJCIwJDNSOm1ZYFUhIzckIjAjUjgyZGMjNCIhIzY3JCQiMC4nKm9eODNEJSEjNyQiMCY9JylHXnIuNiEjNjckNyQkIjBjP2xAdCZlVSEjNyQiMFclSERMJTMyIiEjNjckJCIwRWhCJDRTY1UhIzckIjBjWGs6RCwzIiEjNjckNyQkIjBFaEIkNFNjVSEjNyQiMGNYazpELDMiISM2NyQkIjBIM25PJHBhVSEjNyQiMCgpZjFIJFEoMyIhIzY3JDckJCIwI0dMbUlYaVUhIzckIjA9IyllRSY0YTUhIzY3JCQiMCNbPzsjKT1pVSEjNyQiMCUpb10wV18wIiEjNjckNyQkIjAjWz87Iyk9aVUhIzckIjAlKW9dMFdfMCIhIzY3JCQiMDs8MjdBOUUlISM3JCIwKjRJSyhcJmU1ISM2NyQ3JCQiMGxgNTAzJGZVISM3JCIvc3YwWW9uNSEjNTckJCIwOzwyN0E5RSUhIzckIjAqNElLKFwmZTUhIzY3JDckJCIwbGA1MDMkZlUhIzckIi9zdjBZb241ISM1NyQkIjBjP2xAdCZlVSEjNyQiMFclSERMJTMyIiEjNjckNyQkIjA0WGgiSExtVSEjNyQiMGBdPFFSci4iISM2NyQkIjA7T3dLVF1FJSEjNyQiMFohUS9OIUcvIiEjNjckNyQkIjA7T3dLVF1FJSEjNyQiMFohUS9OIUcvIiEjNjckJCIwI0dMbUlYaVUhIzckIjA9IyllRSY0YTUhIzY3JDckJCIwTmRmdzctRiUhIzckIjApUkxTWygqPjUhIzY3JCQiMENIJ1slcHlFJSEjNyQiMDYjcGBIT0k1ISM2NyQ3JCQiMENIJ1slcHlFJSEjNyQiMDYjcGBIT0k1ISM2NyQkIjA0WGgiSExtVSEjNyQiMGBdPFFSci4iISM2NyQ3JCQiMGlwZGgjNHVVISM3JCIwPGU9My1FKyIhIzY3JCQiMGR2T0FfTUYlISM3JCIwUjpCJj1bMDUhIzY3JDckJCIwZHZPQV9NRiUhIzckIjBSOkImPVswNSEjNjckJCIwelZjJj4kPUYlISM3JCIvQGlcMHQ3NSEjNTckNyQkIi9rJHk/dDFGJSEjNiQiMHYuSVNBeiwiISM2NyQkIjB6VmMmPiQ9RiUhIzckIi9AaVwwdDc1ISM1NyQ3JCQiL2skeT90MUYlISM2JCIwdi5JU0F6LCIhIzY3JCQiME5kZnc3LUYlISM3JCIwKVJMU1soKj41ISM2NyQ3JCQiMCk9ZWxDKHpGJSEjNyQiMHJTTGEzLSYpKiEjNzckJCIwUCQ0V3U/d1UhIzckIjBMcWksOC8kKiohIzc3JDckJCIwUCQ0V3U/d1UhIzckIjBMcWksOC8kKiohIzc3JCQiMGlwZGgjNHVVISM3JCIwPGU9My1FKyIhIzY3JDckJCIwOiVSOkImPUclISM3JCIwQWwtRTNCbiohIzc3JCQiMG1qdWZdO0clISM3JCIwNy5EKy07byohIzc3JDckJCIwbWp1Zl07RyUhIzckIjA3LkQrLTtvKiEjNzckJCIwcGFbKjQ9IkclISM3JCIwRW8yZEZKcSohIzc3JDckJCIvMyQ9OlMqeVUhIzYkIjBzJ1E0disxKSohIzc3JCQiMHBhWyo0PSJHJSEjNyQiMEVvMmRGSnEqISM3NyQ3JCQiLzMkPTpTKnlVISM2JCIwcydRNHYrMSkqISM3NyQkIjApPWVsQyh6RiUhIzckIjByU0xhMy0mKSohIzc3JDckJCIwVDFfO0tkRyUhIzckIjA0cmpgRUJcKiEjNzckJCIwO21KS1FWRyUhIzckIjBfPmNcJz5kJiohIzc3JDckJCIwO21KS1FWRyUhIzckIjBfPmNcJz5kJiohIzc3JCQiMDolUjpCJj1HJSEjNyQiMEFsLUUzQm4qISM3NyQ3JCQiMG89XSw3JypHJSEjNyQiMCoqKVtaUUQ1JCohIzc3JCQiMGEmSGxeKyhHJSEjNyQiMCJmdCkpNHpLJSohIzc3JDckJCIwYSZIbF4rKEclISM3JCIwImZ0KSk0ekslKiEjNzckJCIwVDFfO0tkRyUhIzckIjA0cmpgRUJcKiEjNzckNyQkIjAlNCRbJz1cJEglISM3JCIwJSopejY5NUUiKiEjNzckJCIwVlkkZW1GI0glISM3JCIvKG9cKCp6Uj0qISM2NyQ3JCQiMFZZJGVtRiNIJSEjNyQiLyhvXCgqelI9KiEjNjckJCIwWyRwOVJ0KkclISM3JCIwa2p4I29aLyQqISM3NyQ3JCQiMCcpPVJkXicqRyUhIzckIjBKXz1bJlEzJCohIzc3JCQiMFskcDlSdCpHJSEjNyQiMGtqeCNvWi8kKiEjNzckNyQkIjAnKT1SZF4nKkclISM3JCIwSl89WyZRMyQqISM3NyQkIjBvPV0sNycqRyUhIzckIjAqKilbWlFENSQqISM3NyQ3JCQiMEBWWXJydEglISM3JCIwa01cPmUpUiopISM3NyQkIjBjVTJEIylbSCUhIzckIi9eM29XZGYhKiEjNjckNyQkIjBjVTJEIylbSCUhIzckIi9eM29XZGYhKiEjNjckJCIwJTQkWyc9XCRIJSEjNyQiMCUqKXo2OTVFIiohIzc3JDckJCIwWmJXY143SSUhIzckIjBQL0slZWBeKCkhIzc3JCQiMHQ+bF9OK0klISM3JCIwKnlKYU13NSkpISM3NyQ3JCQiMHQ+bF9OK0klISM3JCIwKnlKYU13NSkpISM3NyQkIjAjZmxHd2woSCUhIzckIjBLSG5FLGcjKikhIzc3JDckJCIvJTMqKnlvdUglISM2JCIvOj9oKm9eJCopISM2NyQkIjAjZmxHd2woSCUhIzckIjBLSG5FLGcjKikhIzc3JDckJCIvJTMqKnlvdUglISM2JCIvOj9oKm9eJCopISM2NyQkIjBAVllycnRIJSEjNyQiMGtNXD5lKVIqKSEjNzckNyQkIjB1blVUSl5JJSEjNyQiL0BhY1M3aCYpISM2NyQkIjAyUHVoOV5JJSEjNyQiMG9dMFdfPmMpISM3NyQ3JCQiMDJQdWg5XkklISM3JCIwb10wV18+YykhIzc3JCQiMHJQNyZIMzBWISM3JCIwa2VUUTFOYykhIzc3JDckJCIwSndQKlJlLVYhIzckIjBITXUlek4nbykhIzc3JCQiMHJQNyZIMzBWISM3JCIwa2VUUTFOYykhIzc3JDckJCIwSndQKlJlLVYhIzckIjBITXUlek4nbykhIzc3JCQiMFpiV2NeN0klISM3JCIwUC9LJWVgXigpISM3NyQ3JCQiLTNrNyw0ViEiKiQiL1ErKCllam8kKSEjNjckJCIwc1xWcEV3SSUhIzckIjAzbk8kcGFQJSkhIzc3JDckJCIwc1xWcEV3SSUhIzckIjAzbk8kcGFQJSkhIzc3JCQiMHVuVVRKXkklISM3JCIvQGFjUzdoJikhIzY3JDckJCIwRiMqUTYiKkdKJSEjNyQiMGUoZjs8MXUiKSEjNzckJCIwPS9LIykqZjdWISM3JCIwKCkqKik+ZnQpPSkhIzc3JDckJCIwPS9LIykqZjdWISM3JCIwKCkqKik+ZnQpPSkhIzc3JCQiL3YoPXcjMzdWISM2JCIvYDZPYGw5IykhIzY3JDckJCIwOmsjSDw3NVYhIzckIjBaJHlFOTk4JCkhIzc3JCQiL3YoPXcjMzdWISM2JCIvYDZPYGw5IykhIzY3JDckJCIwOmsjSDw3NVYhIzckIjBaJHlFOTk4JCkhIzc3JCQiLTNrNyw0ViEiKiQiL1ErKCllam8kKSEjNjckNyQkIjBhL1AnNHg7ViEjNyQiMGkhPlY3VHh6ISM3NyQkIjBGTSd5MjE6ViEjNyQiMEY7SVRJVjEpISM3NyQ3JCQiMEZNJ3kyMTpWISM3JCIwRjtJVElWMSkhIzc3JCQiMEYjKlE2IipHSiUhIzckIjBlKGY7PDF1IikhIzc3JDckJCIvb144M2w/ViEjNiQiMGFQX2wib3l4ISM3NyQkIjApWy9fVyQqPlYhIzckIjAxXCMqUj5iInkhIzc3JDckJCIwKVsvX1ckKj5WISM3JCIwMVwjKlI+YiJ5ISM3NyQkIjBFZUlOSyg9ViEjNyQiMHBrYiFSLnh5ISM3NyQ3JCQiMF8nUipwMHZKJSEjNyQiMG1LaCFcIypSeiEjNzckJCIwRWVJTksoPVYhIzckIjBwa2IhUi54eSEjNzckNyQkIjBgJ1IqcDB2SiUhIzckIjBtS2ghXCMqUnohIzc3JCQiMGEvUCc0eDtWISM3JCIwaSE+VjdUeHohIzc3JDckJCIwMkhMbUlYSyUhIzckIjBiV2ckWyh5ZCghIzc3JCQiL0JUIlFaQkslISM2JCIwWGxCKlE2InAoISM3NyQ3JCQiL0JUIlFaQkslISM2JCIwWGxCKlE2InAoISM3NyQkIi9vXjgzbD9WISM2JCIwYVBfbCJveXghIzc3JDckJCIwTFRKXjUlR1YhIzckIjBmcHV0KSpcUCghIzc3JCQiMChvLTx2N0ZWISM3JCIwRClmeUdJVXUhIzc3JDckJCIwKG8tPHY3RlYhIzckIjBEKWZ5R0lVdSEjNzckJCIwIlxXaFwzRFYhIzckIjA7MVkzTipbdiEjNzckNyQkIjBaa208WFpLJSEjNyQiMCY9WyZRM25jKCEjNzckJCIwIlxXaFwzRFYhIzckIjA7MVkzTipbdiEjNzckNyQkIjBaa208WFpLJSEjNyQiMCY9WyZRM25jKCEjNzckJCIwMkhMbUlYSyUhIzckIjBiV2ckWyh5ZCghIzc3JDckJCIvTyZITyFIS1YhIzYkIjBXMlBNWys8KCEjNzckJCIwLXk8VVs9TCUhIzckIjAvSlsnPVwkPighIzc3JDckJCIwLXk8VVs9TCUhIzckIjAvSlsnPVwkPighIzc3JCQiMCR5TWRaO0pWISM3JCIwNEtSJ1FlSHMhIzc3JDckJCIwPkZCQCZcSFYhIzckIjBrOTxQKCp5SighIzc3JCQiMCR5TWRaO0pWISM3JCIwNEtSJ1FlSHMhIzc3JDckJCIwPkZCQCZcSFYhIzckIjBrOTxQKCp5SighIzc3JCQiMExUSl41JUdWISM3JCIwZnB1dCkqXFAoISM3NyQ3JCQiMCdldzctPE9WISM3JCIwT19ZJTQuanAhIzc3JCQiMCMqMzk/KD1NViEjNyQiMFZaek4nM3BxISM3NyQ3JCQiMCMqMzk/KD1NViEjNyQiMFZaek4nM3BxISM3NyQkIi9PJkhPIUhLViEjNiQiMFcyUE1bKzwoISM3NyQ3JCQiMDh5RDFdK00lISM3JCIwdzRCKjQmUnYnISM3NyQkIjA2QihwSyMpUVYhIzckIjBBIT1XYEY/byEjNzckNyQkIjA2QihwSyMpUVYhIzckIjBBIT1XYEY/byEjNzckJCIwXm5QLDlxTCUhIzckIjB0Ty15Q3cicCEjNzckNyQkIjBDaSgpPTdsTCUhIzckIjAkUTFeM29XcCEjNzckJCIwXm5QLDlxTCUhIzckIjB0Ty15Q3cicCEjNzckNyQkIjBDaSgpPTdsTCUhIzckIjAkUTFeM29XcCEjNzckJCIwJ2V3Ny08T1YhIzckIjBPX1klNC5qcCEjNzckNyQkIjBSIVI3KkhSTSUhIzckIjA8cnlhMUdhJyEjNzckJCIwJ1w7S2FTVlYhIzckIjAtOC9MazlkJyEjNzckNyQkIjAnXDtLYVNWViEjNyQiMC04L0xrOWQnISM3NyQkIjBKOnIqPWxVViEjNyQiMDY5PUZWQ2gnISM3NyQ3JCQiMC07dyY0N1RWISM3JCIwaSdIUClwZXAnISM3NyQkIjBKOnIqPWxVViEjNyQiMDY5PUZWQ2gnISM3NyQ3JCQiMC07dyY0N1RWISM3JCIwaSdIUClwZXAnISM3NyQkIjA4eUQxXStNJSEjNyQiMHc0Qio0JlJ2JyEjNzckNyQkIjBtLUF3NHlNJSEjNyQiMD5SYzYuJ0hqISM3NyQkIjBYISo0JW9uWFYhIzckIjBUSE4jKWVxVychIzc3JDckJCIwWCEqNCVvblhWISM3JCIwVEhOIyllcVcnISM3NyQkIjBSIVI3KkhSTSUhIzckIjA8cnlhMUdhJyEjNzckNyQkIjAjXCw3JypvXlYhIzckIjBeZWIkKlxWNichIzc3JCQiMGpEUnAiPV1WISM3JCIvQXc0eUMpPichIzY3JDckJCIwakRScCI9XVYhIzckIi9BdzR5Qyk+JyEjNjckJCIwI3l6JXkyIltWISM3JCIvakxtdDQ4aiEjNjckNyQkIjBmYGllTnpNJSEjNyQiMCJlaztMbEFqISM3NyQkIjAjeXoleTIiW1YhIzckIi9qTG10NDhqISM2NyQ3JCQiMGZgaWVOek0lISM3JCIwImVrO0xsQWohIzc3JCQiMG0tQXc0eU0lISM3JCIwPlJjNi4nSGohIzc3JDckJCIwPkY9WXBiTiUhIzckIjAnXGZ0VC8oKmUhIzc3JCQiLzc+IkdQWU4lISM2JCIuJipmek8lXGYhIzU3JDckJCIvNz4iR1BZTiUhIzYkIi4mKmZ6TyVcZiEjNTckJCIwXjonW2JRYFYhIzckIi9eUjtIWT5nISM2NyQ3JCQiMD1MIVtiVF9WISM3JCIvJ3lHSVVRMichIzY3JCQiMF46J1tiUWBWISM3JCIvXlI7SFk+ZyEjNjckNyQkIjA9TCFbYlRfViEjNyQiLyd5R0lVUTInISM2NyQkIjAjXCw3JypvXlYhIzckIjBeZWIkKlxWNichIzc3JDckJCIwWFI7SlwlZlYhIzckIjBMJypRPyFweGMhIzc3JCQiMCoqenNGWCFmViEjNyQiMHpGQXlEMXEmISM3NyQ3JCQiMCoqenNGWCFmViEjNyQiMHpGQXlEMXEmISM3NyQkIjBAOVI+OiZlViEjNyQiMEUmNDp5ZElkISM3NyQ3JCQiL0ovRnIlb04lISM2JCIwUjYiKkdKXSNlISM3NyQkIjBAOVI+OiZlViEjNyQiMEUmNDp5ZElkISM3NyQ3JCQiL0ovRnIlb04lISM2JCIwUjYiKkdKXSNlISM3NyQkIjA+Rj1ZcGJOJSEjNyQiMCdcZnRULygqZSEjNzckNyQkIjBzXjk7SExPJSEjNyQiLzdnQVJIY2EhIzY3JCQiMCZSRF4+QmhWISM3JCIwPVdgRj9pZCYhIzc3JDckJCIwJlJEXj5CaFYhIzckIjA9V2BGP2lkJiEjNzckJCIwWFI7SlwlZlYhIzckIjBMJypRPyFweGMhIzc3JDckJCIwKVJFNiE0c08lISM3JCIvPnQnPmxHQiYhIzY3JCQiLycqeXE6ZGxWISM2JCIwKHBkaCM0dUsmISM3NyQ3JCQiLycqeXE6ZGxWISM2JCIwKHBkaCM0dUsmISM3NyQkIjBQMytRME5PJSEjNyQiMFAzZFNraFcmISM3NyQ3JCQiMF8jUSNHMk1PJSEjNyQiMGVnJW9aIj1YJiEjNzckJCIwUDMrUTBOTyUhIzckIjBQM2RTa2hXJiEjNzckNyQkIjBfI1EjRzJNTyUhIzckIjBlZyVvWiI9WCYhIzc3JCQiMHNeOTtITE8lISM3JCIvN2dBUkhjYSEjNjckNyQkIjBEdzUnKSkzclYhIzckIjBDPyNlRlMyXSEjNzckJCIwKVtcZnUnKXBWISM3JCIweDR5QylmeV0hIzc3JDckJCIwKVtcZnUnKXBWISM3JCIweDR5QylmeV0hIzc3JCQiMENecSEqZSRvViEjNyQiMCpmbi1IOG1eISM3NyQ3JCQiMCc0UWlbc25WISM3JCIwUCRwYVArLl8hIzc3JCQiMENecSEqZSRvViEjNyQiMCpmbi1IOG1eISM3NyQ3JCQiMCc0UWlbc25WISM3JCIwUCRwYVArLl8hIzc3JCQiMClSRTYhNHNPJSEjNyQiLz50Jz5sR0ImISM2NyQ3JCQiMF4pKTNyb1xQJSEjNyQiMExRJmY9Iip6WiEjNzckJCIwOSM9QjU3dVYhIzckIjBjVVNCKHlIWyEjNzckNyQkIjA5Iz1CNTd1ViEjNyQiMGNVU0IoeUhbISM3NyQkIjByJHk7YzR0ViEjNyQiMDh4LDRaKSopWyEjNzckNyQkIjAoeS5VJSoqPlAlISM3JCIwO0U0dSM+YVwhIzc3JCQiMHIkeTtjNHRWISM3JCIwOHgsNFopKilbISM3NyQ3JCQiMCh5LlUlKio+UCUhIzckIjA7RTR1Iz5hXCEjNzckJCIwRHc1JykpM3JWISM3JCIwQz8jZUZTMl0hIzc3JDckJCIweSsyY1speVYhIzckIjBLdCgpKnpSXVghIzc3JCQiLypbNGdMJHlWISM2JCIwTnYtQXc0ZSUhIzc3JDckJCIvKls0Z0wkeVYhIzYkIjBOdi1BdzRlJSEjNzckJCIwMHBSO0J4UCUhIzckIjBESj5faHFoJSEjNzckNyQkIjBLaigpUUtpUCUhIzckIjAmKmVycyJRMFohIzc3JCQiMDBwUjtCeFAlISM3JCIwREo+X2hxaCUhIzc3JDckJCIwS2ooKVFLaVAlISM3JCIwJiplcnMiUTBaISM3NyQkIjBeKSkzcm9cUCUhIzckIjBMUSZmPSIqelohIzc3JDckJCIwLzgwVEdGUSUhIzckIjBMaihvbycpPVYhIzc3JCQiMGNbMFoxRFElISM3JCIwOTNsP2xATCUhIzc3JDckJCIwY1swWjFEUSUhIzckIjA5M2w/bEBMJSEjNzckJCIwJFEmR15bQVElISM3JCIwPFVGKkdiWlYhIzc3JDckJCIwQTJqK0QvUSUhIzckIjB1IlI4MmRjVyEjNzckJCIwJFEmR15bQVElISM3JCIwPFVGKkdiWlYhIzc3JDckJCIwQTJqK0QvUSUhIzckIjB1IlI4MmRjVyEjNzckJCIweSsyY1speVYhIzckIjBLdCgpKnpSXVghIzc3JDckJCIwSkQuRTNtUSUhIzckIjBYa1AyRGAzJSEjNzckJCIwTWcoUiZ5WFElISM3JCIwYEMnKnBmeD8lISM3NyQ3JCQiME1nKFImeVhRJSEjNyQiMGBDJypwZng/JSEjNzckJCIwLzgwVEdGUSUhIzckIjBMaihvbycpPVYhIzc3JDckJCIwZFAsNilbIVIlISM3JCIwQTpvRSN5XFEhIzc3JCQiMCo9KWY8JXApUSUhIzckIjBLZGVvWyplUiEjNzckNyQkIjAqPSlmPCVwKVElISM3JCIwS2Rlb1sqZVIhIzc3JCQiMC4iUVJ0bidRJSEjNyQiMG1XaT9SNjMlISM3NyQ3JCQiMFhpOyczaydRJSEjNyQiMCQ0dSM+YUwzJSEjNzckJCIwLiJRUnRuJ1ElISM3JCIwbVdpP1I2MyUhIzc3JDckJCIwWGk7JzNrJ1ElISM3JCIwJDR1Iz5hTDMlISM3NyQkIjBKRC5FM21RJSEjNyQiMFhrUDJEYDMlISM3NyQ3JCQiMCUpXCpmek8lUiUhIzckIjByOShcLEM3TyEjNzckJCIwTjQuMHRGUiUhIzckIjA2ITRzdzg1UCEjNzckNyQkIjBONC4wdEZSJSEjNyQiMDYhNHN3ODVQISM3NyQkIjAiKnAwYDc1UiUhIzckIjB0aToqeXM8USEjNzckNyQkIjApNCwsIVEyUiUhIzckIjBzdCp5SmFNUSEjNzckJCIwIipwMGA3NVIlISM3JCIwdGk6KnlzPFEhIzc3JDckJCIwKTQsLCFRMlIlISM3JCIwc3QqeUphTVEhIzc3JCQiMGRQLDYpWyFSJSEjNyQiMEE6b0UjeVxRISM3NyQ3JCQiL0B3NHlDKVIlISM2JCIwaylRZ19xc0whIzc3JCQiMDJDd0M7b1IlISM3JCIvSEtlbUtoTSEjNjckNyQkIjAyQ3dDO29SJSEjNyQiL0hLZW1LaE0hIzY3JCQiMEUwRixrX1IlISM3JCIwcHhybStxYiQhIzc3JDckJCIwMjAiRyopeiVSJSEjNyQiMF4xXztLZGUkISM3NyQkIjBFMEYsa19SJSEjNyQiMHB4cm0rcWIkISM3NyQ3JCQiMDIwIkcqKXolUiUhIzckIjBeMV87S2RlJCEjNzckJCIwJSlcKmZ6TyVSJSEjNyQiMHI5KFwsQzdPISM3NyQ3JCQiMFB1JmZ3Ny1XISM3JCIwclt3QSU9SkohIzc3JCQiMHpZWiFbIzNTJSEjNyQiL2RiV2NeN0shIzY3JDckJCIwellaIVsjM1MlISM3JCIvZGJXY143SyEjNjckJCIwQSpmPmxWKlIlISM3JCIwTyVwWGQhKSlIJCEjNzckNyQkIjBCQj5xQykpUiUhIzckIi8kUjk6QHBMJCEjNjckJCIwQSpmPmxWKlIlISM3JCIwTyVwWGQhKSlIJCEjNzckNyQkIjBCQj5xQykpUiUhIzckIi8kUjk6QHBMJCEjNjckJCIvQHc0eUMpUiUhIzYkIjBrKVFnX3FzTCEjNzckNyQkIjBqJ1E0disxVyEjNyQiMCgzMzdRbygpRyEjNzckJCIwZVtMcip6L1chIzckIjBcKXlJWXFqSCEjNzckNyQkIjBlW0xyKnovVyEjNyQiMFwpeUlZcWpIISM3NyQkIjAvYF5TTU5TJSEjNyQiMFF2OF8uSS8kISM3NyQ3JCQiMDl6WEw7R1MlISM3JCIwNHN3ODUiKTMkISM3NyQkIjAvYF5TTU5TJSEjNyQiMFF2OF8uSS8kISM3NyQ3JCQiMDl6WEw7R1MlISM3JCIwNHN3ODUiKTMkISM3NyQkIjBQdSZmdzctVyEjNyQiMHJbd0ElPUpKISM3NyQ3JCQiLyopPmZ0KSk0VyEjNiQiMERkOC82QWsjISM3NyQkIjBOVkwjPnUzVyEjNyQiMEdAcWgkKltyIyEjNzckNyQkIjBOVkwjPnUzVyEjNyQiMEdAcWgkKltyIyEjNzckJCIwc24lejtjMlchIzckIjBec0FUbCUqeSMhIzc3JDckJCIwSypvJHp1blMlISM3JCIwKVshUjcqSFJHISM3NyQkIjBzbiV6O2MyVyEjNyQiMF5zQVRsJSp5IyEjNzckNyQkIjBLKm8kenVuUyUhIzckIjApWyFSNypIUkchIzc3JCQiMGonUTR2KzFXISM3JCIwKDMzN1FvKClHISM3NyQ3JCQiMDs2ITRzdzhXISM3JCIwYjEkekl4JVIjISM3NyQkIjAiMyNcTV9FVCUhIzckIjAyYUtnIzNtQyEjNzckNyQkIjAiMyNcTV9FVCUhIzckIjAyYUtnIzNtQyEjNzckJCIwaEAoXD9fNlchIzckIjA4MSZcRDJRRCEjNzckNyQkIi86JHkrLDJUJSEjNiQiMG5QLDYpWyFmIyEjNzckJCIwaEAoXD9fNlchIzckIjA4MSZcRDJRRCEjNzckNyQkIi86JHkrLDJUJSEjNiQiMG5QLDYpWyFmIyEjNzckJCIvKik+ZnQpKTRXISM2JCIwRGQ4LzZBayMhIzc3JDckJCIwVkIpZXFrPFchIzckIjAlKXooUnNQWEAhIzc3JCQiMDAlPVs9YDtXISM3JCIwJ29bKmVyc0AjISM3NyQ3JCQiMDAlPVs9YDtXISM3JCIwJ29bKmVyc0AjISM3NyQkIjA7XyhSKj1hVCUhIzckIjB5JVFcXnIpRyMhIzc3JDckJCIwQy9fJ2VmOVchIzckIjBZcWo0eDtNIyEjNzckJCIwO18oUio9YVQlISM3JCIweSVRXF5yKUcjISM3NyQ3JCQiMEMvXydlZjlXISM3JCIwWXFqNHg7TSMhIzc3JCQiMDs2ITRzdzhXISM3JCIwYjEkekl4JVIjISM3NyQ3JCQiMHBOJzNwX0BXISM3JCIwTEooPTQuJSo9ISM3NyQkIjBOUC1GIlE/VyEjNyQiMGw+ZGRnJW8+ISM3NyQ3JCQiME5QLUYiUT9XISM3JCIwbD5kZGclbz4hIzc3JCQiMDhUXV9iIz5XISM3JCIwdEE7UiJIVD8hIzc3JDckJCIwblopPS1ZPVchIzckIjBELkUzbUc0IyEjNzckJCIwOFRdX2IjPlchIzckIjB0QTtSIkhUPyEjNzckNyQkIjBuWik9LVk9VyEjNyQiMEQuRTNtRzQjISM3NyQkIjBWQillcWs8VyEjNyQiMCUpeihSc1BYQCEjNzckNyQkIjAneldlblNEVyEjNyQiMHo3S3dUMmsiISM3NyQkIjAkenc2OT9DVyEjNyQiMFdfPmNcJz48ISM3NyQ3JCQiMCR6dzY5P0NXISM3JCIwV18+Y1wnPjwhIzc3JCQiMF89ZXVNSVUlISM3JCIwPm4iKipwcSZ6IiEjNzckNyQkIjA+dFUpW0hBVyEjNyQiMC9PKW9dMFc9ISM3NyQkIjBfPWV1TUlVJSEjNyQiMD5uIioqcHEmeiIhIzc3JDckJCIwPnRVKVtIQVchIzckIjAvTylvXTBXPSEjNzckJCIwcE4nM3BfQFchIzckIjBMSig9NC4lKj0hIzc3JDckJCIwQWcjM21HSFchIzckIjBDOlZRPGJRIiEjNzckJCIvPXBUSSp6VSUhIzYkIjBCJj1bJlEzWiIhIzc3JDckJCIvPXBUSSp6VSUhIzYkIjBCJj1bJlEzWiIhIzc3JCQiMCMpSCVSJGZuVSUhIzckIjAtZy4/dT1iIiEjNzckNyQkIjAtRnBrK2hVJSEjNyQiMCUpb10wV19mIiEjNzckJCIwIylIJVIkZm5VJSEjNyQiMC1nLj91PWIiISM3NyQ3JCQiMC1GcGsraFUlISM3JCIwJSlvXTBXX2YiISM3NyQkIjAneldlblNEVyEjNyQiMHo3S3dUMmsiISM3NyQ3JCQiMFxzIWVrO0xXISM3JCIwYjJCaWwkRzYhIzc3JCQiME9aJSkqb3ZKVyEjNyQiMC09V2BGP0EiISM3NyQ3JCQiME9aJSkqb3ZKVyEjNyQiMC09V2BGP0EiISM3NyQkIjBiJXpZPVZJVyEjNyQiMDFZPV82KDQ4ISM3NyQ3JCQiMGxFekR5KUhXISM3JCIwaiw4L0xrTSIhIzc3JCQiMGIlelk9VklXISM3JCIwMVk9XzYoNDghIzc3JDckJCIwbEV6RHkpSFchIzckIjBqLDgvTGtNIiEjNzckJCIwQWcjM21HSFchIzckIjBDOlZRPGJRIiEjNzckNyQkIjB2JSl5SVlxViUhIzckIjBEcSpcSiVIcCkhIzg3JCQiMCZcPyJwJFxOVyEjNyQiMDgzbD9sQHQqISM4NyQ3JCQiMCZcPyJwJFxOVyEjNyQiMDgzbD9sQHQqISM4NyQkIjAkPWVTWTBNVyEjNyQiLyJRXilHOXA1ISM2NyQ3JCQiMHdTNVdHT1YlISM3JCIwVU12LUF3NCIhIzc3JCQiMCQ9ZVNZME1XISM3JCIvIlFeKUc5cDUhIzY3JDckJCIwd1M1V0dPViUhIzckIjBVTXYtQXc0IiEjNzckJCIwXHMhZWs7TFchIzckIjBiMkJpbCRHNiEjNzckNyQkIjAtKHBkaCM0VyUhIzckIjAlPkRRWjYkMychIzg3JCQiMFEoNCxUP1JXISM3JCIwL08pb10wV3MhIzg3JDckJCIwUSg0LFQ/UlchIzckIjAvTylvXTBXcyEjODckJCIwPHYoSCpId1YlISM3JCIwTilbLVkoNEkpISM4NyQ3JCQiMFJvJCopPU5QVyEjNyQiMDRzdzg1IilbKSEjODckJCIwPHYoSCpId1YlISM3JCIwTilbLVkoNEkpISM4NyQ3JCQiMFJvJCopPU5QVyEjNyQiMDRzdzg1IilbKSEjODckJCIwdiUpeUlZcVYlISM3JCIwRHEqXEolSHApISM4NyQ3JCQiME5FOUZcNVclISM3JCIkKychIiI3JCQiMC0ocGRoIzRXJSEjNyQiMCU+RFFaNiQzJyEjOC0lJkNPTE9SRzYmJSRSR0JHJCIoXnVpJyEiKCQiKF51aSchIigkIihedWknISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzZeaHQ3JDckJCIwcmZ4P21IUCMhIzckIjAzQipHKSpwXHEhIzc3JCQiMF5WV1cjKj1QIyEjNyQiMFZaek4nM3BxISM3NyQ3JCQiMF5WV1cjKj1QIyEjNyQiMFZaek4nM3BxISM3NyQkIjAqPS4sRyo9UCMhIzckIjBaJUdEWV0uciEjNzckNyQkIjBQNGNVJCo9UCMhIzckIjAvSlsnPVwkPighIzc3JCQiMCo9LixHKj1QIyEjNyQiMFolR0RZXS5yISM3NyQ3JCQiMFA0Y1UkKj1QIyEjNyQiMC9KWyc9XCQ+KCEjNzckJCIwQyJvJnokKj1QIyEjNyQiLj0jUiN5eUEoISM1NyQ3JCQiMGlPY1glKj1QIyEjNyQiMGs5PFAoKnlKKCEjNzckJCIwQyJvJnokKj1QIyEjNyQiLj0jUiN5eUEoISM1NyQ3JCQiMGlPY1glKj1QIyEjNyQiMGs5PFAoKnlKKCEjNzckJCIwW10oUVsqPVAjISM3JCIwTCJmKy5EX3QhIzc3JDckJCIwMCc9T2IqPVAjISM3JCIwRClmeUdJVXUhIzc3JCQiMFtdKFFbKj1QIyEjNyQiMEwiZisuRF90ISM3NyQ3JCQiMDAnPU9iKj1QIyEjNyQiMEQpZnlHSVV1ISM3NyQkIjBDKm9LZio9UCMhIzckIjAjeSYzdD9tWighIzc3JDckJCIwQixtbScqPVAjISM3JCIwJj1bJlEzbmMoISM3NyQkIjBDKm9LZio9UCMhIzckIjAjeSYzdD9tWighIzc3JDckJCIwQixtbScqPVAjISM3JCIwJj1bJlEzbmMoISM3NyQkIjBcVmsyKCo9UCMhIzckIjAmWyJRYyopNGcoISM3NyQ3JCQiMGxHZSV5Kj1QIyEjNyQiMFhsQipRNiJwKCEjNzckJCIwXFZrMigqPVAjISM3JCIwJlsiUWMqKTRnKCEjNzckNyQkIjBsR2UleSo9UCMhIzckIjBYbEIqUTYicCghIzc3JCQiMEJrJm8jKSo9UCMhIzckIjAlUSNmJW9ORHghIzc3JDckJCIwUUtiMioqPVAjISM3JCIwMVwjKlI+YiJ5ISM3NyQkIjBCayZvIykqPVAjISM3JCIwJVEjZiVvTkR4ISM3NyQ3JCQiMFFLYjIqKj1QIyEjNyQiMDFcIypSPmIieSEjNzckJCIwZiw6XioqPVAjISM3JCIvQWkpXEEoXHkhIzY3JDckJCIwLDtTTis+UCMhIzckIjBtS2ghXCMqUnohIzc3JCQiMGYsOl4qKj1QIyEjNyQiL0FpKVxBKFx5ISM2NyQ3JCQiMCw7U04rPlAjISM3JCIwbUtoIVwjKlJ6ISM3NyQkIjBScUYhMyE+UCMhIzckIjBtJ2YsbTN1eiEjNzckNyQkIjA0WUhvLD5QIyEjNyQiMEY7SVRJVjEpISM3NyQkIjBScUYhMyE+UCMhIzckIjBtJ2YsbTN1eiEjNzckNyQkIjA0WUhvLD5QIyEjNyQiMEY7SVRJVjEpISM3NyQkIjAmKkdXOS0+UCMhIzckIjBwWikpM1wlKTQpISM3NyQ3JCQiMCM9QmdJIT5QIyEjNyQiMCgpKiopPmZ0KT0pISM3NyQkIjAmKkdXOS0+UCMhIzckIjBwWikpM1wlKTQpISM3NyQ3JCQiMCM9QmdJIT5QIyEjNyQiMCgpKiopPmZ0KT0pISM3NyQkIi9weE1OIT5QIyEjNiQiMCNwKlssNUdBKSEjNzckNyQkIjAuKUcoWy8+UCMhIzckIjBaJHlFOTk4JCkhIzc3JCQiL3B4TU4hPlAjISM2JCIwI3AqWyw1R0EpISM3NyQ3JCQiMC4pRyhbLz5QIyEjNyQiMFokeUU5OTgkKSEjNzckJCIweUxbKFwhPlAjISM3JCIwZWBxTXByTSkhIzc3JDckJCIwLmZJJ2YhPlAjISM3JCIwM25PJHBhUCUpISM3NyQkIjB5TFsoXCE+UCMhIzckIjBlYHFNcHJNKSEjNzckNyQkIjAuZkknZiE+UCMhIzckIjAzbk8kcGFQJSkhIzc3JCQiMEZoRlkxPlAjISM3JCIvQEVXcl9yJSkhIzY3JDckJCIwcCd5KFsyPlAjISM3JCIwb10wV18+YykhIzc3JCQiMEZoRlkxPlAjISM3JCIvQEVXcl9yJSkhIzY3JDckJCIwcCd5KFsyPlAjISM3JCIwb10wV18+YykhIzc3JCQiMDZqLiszPlAjISM3JCIwcCdvW0wpZWYpISM3NyQ3JCQiMCR5QmkhND5QIyEjNyQiMEhNdSV6TidvKSEjNzckJCIwNmouKzM+UCMhIzckIjBwJ29bTCllZikhIzc3JDckJCIwJHlCaSE0PlAjISM3JCIwSE11JXpOJ28pISM3NyQkIjAuS3NlND5QIyEjNyQiMFonUXR6Qj8oKSEjNzckNyQkIjBNMmdvNT5QIyEjNyQiMCp5SmFNdzUpKSEjNzckJCIwLktzZTQ+UCMhIzckIjBaJ1F0ekI/KCkhIzc3JDckJCIwTTJnbzU+UCMhIzckIjAqeUphTXc1KSkhIzc3JCQiMGVTUEE2PlAjISM3JCIvX1QxNWZXKSkhIzY3JDckJCIvbVFkQiI+UCMhIzYkIi86P2gqb14kKikhIzY3JCQiMGVTUEE2PlAjISM3JCIvX1QxNWZXKSkhIzY3JDckJCIvbVFkQiI+UCMhIzYkIi86P2gqb14kKikhIzY3JCQiMHk3cSFIIj5QIyEjNyQiLSoqUkQlKm8qKSEiKjckNyQkIi9wcXlTIj5QIyEjNiQiL14zb1dkZiEqISM2NyQkIjB5N3EhSCI+UCMhIzckIi0qKlJEJSpvKikhIio3JDckJCIvcHF5UyI+UCMhIzYkIi9eM29XZGYhKiEjNjckJCIweVYwazk+UCMhIzckIjA4VD9ZI0gkNCohIzc3JDckJCIwVzxzJWUiPlAjISM3JCIvKG9cKCp6Uj0qISM2NyQkIjB5VjBrOT5QIyEjNyQiMDhUP1kjSCQ0KiEjNzckNyQkIjBXPHMlZSI+UCMhIzckIi8ob1woKnpSPSohIzY3JCQiMGJ6OlU7PlAjISM3JCIwZHUzJzNrPCMqISM3NyQ3JCQiMFF0YG08PlAjISM3JCIwSl89WyZRMyQqISM3NyQkIjBiejpVOz5QIyEjNyQiMGR1MyczazwjKiEjNzckNyQkIjBRdGBtPD5QIyEjNyQiMEpfPVsmUTMkKiEjNzckJCIwbDc5RD0+UCMhIzckIjBGWF1wKCk+TSohIzc3JDckJCIvd1FLJj4+UCMhIzYkIjAiZnQpKTR6SyUqISM3NyQkIjBsNzlEPT5QIyEjNyQiMEZYXXAoKT5NKiEjNzckNyQkIi93UUsmPj5QIyEjNiQiMCJmdCkpNHpLJSohIzc3JCQiMCIpKnpJLCM+UCMhIzckIjB1KUdTSExtJSohIzc3JDckJCIwd0hwV0A+UCMhIzckIjBfPmNcJz5kJiohIzc3JCQiMCIpKnpJLCM+UCMhIzckIjB1KUdTSExtJSohIzc3JDckJCIwd0hwV0A+UCMhIzckIjBfPmNcJz5kJiohIzc3JCQiMCNwJ28wQT5QIyEjNyQiMFRpKClvdzFmKiEjNzckNyQkIjAnPUk1TSM+UCMhIzckIjA3LkQrLTtvKiEjNzckJCIwI3AnbzBBPlAjISM3JCIwVGkoKW93MWYqISM3NyQ3JCQiMCc9STVNIz5QIyEjNyQiMDcuRCstO28qISM3NyQkIjBscD8uQz5QIyEjNyQiMFdFPCcpPV1yKiEjNzckNyQkIjBUST1VRD5QIyEjNyQiMHMnUTR2KzEpKiEjNzckJCIwbHA/LkM+UCMhIzckIjBXRTwnKT1dciohIzc3JDckJCIvLyQ9VUQ+UCMhIzYkIjBzJ1E0disxKSohIzc3JCQiMGJaYDBFPlAjISM3JCIwQSQ9JFxmJFIpKiEjNzckNyQkIjAxWURbRj5QIyEjNyQiMExxaSw4LyQqKiEjNzckJCIwYlpgMEU+UCMhIzckIjBBJD0kXGYkUikqISM3NyQ3JCQiMDFZRFtGPlAjISM3JCIwTHFpLDgvJCoqISM3NyQkIjA3WnQ3Rz5QIyEjNyQiMCNIU2kmKXBqKiohIzc3JDckJCIwQ2cqKmVIPlAjISM3JCIwUjpCJj1bMDUhIzY3JCQiMDdadDdHPlAjISM3JCIwI0hTaSYpcGoqKiEjNzckNyQkIjBDZyoqZUg+UCMhIzckIjBSOkImPVswNSEjNjckJCIwR0RuQ0k+UCMhIzckIjA6WDdoLikzNSEjNjckNyQkIi9yJ2V1Sj5QIyEjNiQiMHYuSVNBeiwiISM2NyQkIjBHRG5DST5QIyEjNyQiMDpYN2guKTM1ISM2NyQ3JCQiL3InZXVKPlAjISM2JCIwdi5JU0F6LCIhIzY3JCQiMHhZUFRLPlAjISM3JCIwJ1JbOHNCQDUhIzY3JDckJCIwJnBgXVIkPlAjISM3JCIwNiNwYEhPSTUhIzY3JCQiMHhZUFRLPlAjISM3JCIwJ1JbOHNCQDUhIzY3JDckJCIwJnBgXVIkPlAjISM3JCIwNiNwYEhPSTUhIzY3JCQiMHJXJUhZJD5QIyEjNyQiMDRXJ2Yxbkw1ISM2NyQ3JCQiMFhoPT9PPlAjISM3JCIwWiFRL04hRy8iISM2NyQkIjByVyVIWSQ+UCMhIzckIjA0VydmMW5MNSEjNjckNyQkIjBYaD0/Tz5QIyEjNyQiMFohUS9OIUcvIiEjNjckJCIwM25DKm8kPlAjISM3JCIwdGdTJlI1WTUhIzY3JDckJCIwdko7XVE+UCMhIzckIjAlKW9dMFdfMCIhIzY3JCQiMDNuQypvJD5QIyEjNyQiMHRnUyZSNVk1ISM2NyQ3JCQiMHZKO11RPlAjISM3JCIwJSlvXTBXXzAiISM2NyQkIjA2M0Y/Uj5QIyEjNyQiMCx0cTRQJmU1ISM2NyQ3JCQiMCl6cFszJT5QIyEjNyQiL3N2MFlvbjUhIzU3JCQiMDYzRj9SPlAjISM3JCIwLHRxNFAmZTUhIzY3JDckJCIwKXpwWzMlPlAjISM3JCIvc3YwWW9uNSEjNTckJCIwXCdHaDolPlAjISM3JCIwI1I0JjNxNDIiISM2NyQ3JCQiMFh6VENWPlAjISM3JCIwY1hrOkQsMyIhIzY3JCQiMFwnR2g6JT5QIyEjNyQiMCNSNCYzcTQyIiEjNjckNyQkIjBYelRDVj5QIyEjNyQiMGNYazpELDMiISM2NyQkIjAjXDBuUiU+UCMhIzckIjA+LT0jSFMkMyIhIzY3JDckJCIwIz0kcG9YPlAjISM3JCIwI1I4MmRjIzQiISM2NyQkIjAjXDBuUiU+UCMhIzckIjA+LT0jSFMkMyIhIzY3JDckJCIwIz0kcG9YPlAjISM3JCIwI1I4MmRjIzQiISM2NyQkIjAnPXY/ayU+UCMhIzckIjAwSVtnTmU0IiEjNjckNyQkIjBhJXB4Ils+UCMhIzckIjBHQXlEMV01IiEjNjckJCIwJz12P2slPlAjISM3JCIwMElbZ05lNCIhIzY3JDckJCIwYSVweCJbPlAjISM3JCIwR0F5RDFdNSIhIzY3JCQiMFJnQiMqWz5QIyEjNyQiMHNKVThvIzM2ISM2NyQ3JCQiMCIqKVI6MiY+UCMhIzckIjBrNSYzb1c8NiEjNjckJCIwUmdCIypbPlAjISM3JCIwc0pVOG8jMzYhIzY3JDckJCIwIiopUjoyJj5QIyEjNyQiMGs1JjNvVzw2ISM2NyQkIjBuaytaXj5QIyEjNyQiMGRIZV4rMjciISM2NyQ3JCQiMEMjRypIYD5QIyEjNyQiLio+ZnQpKUg2ISIqNyQkIjBuaytaXj5QIyEjNyQiMGRIZV4rMjciISM2NyQ3JCQiMEMjRypIYD5QIyEjNyQiLio+ZnQpKUg2ISIqNyQkIjBBJmZrUyY+UCMhIzckIjBGIkdaRjhMNiEjNjckNyQkIjBIJz1LZiY+UCMhIzckIjBPKCkpNHpLVTYhIzY3JCQiMEEmZmtTJj5QIyEjNyQiMEYiR1pGOEw2ISM2NyQ3JCQiMEgnPUtmJj5QIyEjNyQiME8oKSk0ektVNiEjNjckJCIwMFUhM24mPlAjISM3JCIwRiYpPSNbY1g2ISM2NyQ3JCQiMEwnKT5oZT5QIyEjNyQiMHN2MFlvWjoiISM2NyQkIjAwVSEzbiY+UCMhIzckIjBGJik9I1tjWDYhIzY3JDckJCIwTCcpPmhlPlAjISM3JCIwc3YwWW9aOiIhIzY3JCQiMCUqUnZSZj5QIyEjNyQiMHpHKVtuKno6IiEjNjckNyQkIjB2RHpMaD5QIyEjNyQiMDNrNyw0czsiISM2NyQkIjAlKlJ2UmY+UCMhIzckIjB6Rylbbip6OiIhIzY3JDckJCIwdkR6TGg+UCMhIzckIjAzazcsNHM7IiEjNjckJCIwVThROGk+UCMhIzckIjBqKXlEJkcvPCIhIzY3JDckJCIwcih5NlQnPlAjISM3JCIwV18+Y1wnejYhIzY3JCQiMFU4UThpPlAjISM3JCIwail5RCZHLzwiISM2NyQ3JCQiMHIoeTZUJz5QIyEjNyQiMFdfPmNcJ3o2ISM2NyQkIi9bOzxcJz5QIyEjNiQiMFkmel4sJ0c9IiEjNjckNyQkIjBgQUckcCc+UCMhIzckIi8zazcsNCM+IiEjNTckJCIvWzs8XCc+UCMhIzYkIjBZJnpeLCdHPSIhIzY3JDckJCIwYEFHJHAnPlAjISM3JCIvM2s3LDQjPiIhIzU3JCQiL3NKW3gnPlAjISM2JCIwbUlYaSJIJj4iISM2NyQ3JCQiMGlNJyp6cD5QIyEjNyQiMDtITG1JWD8iISM2NyQkIi9zSlt4Jz5QIyEjNiQiMG1JWGkiSCY+IiEjNjckNyQkIjBpTScqenA+UCMhIzckIjA7SExtSVg/IiEjNjckJCIwSC9XaXE+UCMhIzckIjAjXD1gSHMyNyEjNjckNyQkIjBcJWY4Rig+UCMhIzckIjBfPFNAcnBAIiEjNjckJCIwSC9XaXE+UCMhIzckIjAjXD1gSHMyNyEjNjckNyQkIjBcJWY4Rig+UCMhIzckIjBfPFNAcnBAIiEjNjckJCIwb2YjW04oPlAjISM3JCIwWXMnR1Q6PzchIzY3JDckJCIwJj1VdmMoPlAjISM3JCIwKWVxazxUSDchIzY3JCQiMG9mI1tOKD5QIyEjNyQiMFlzJ0dUOj83ISM2NyQ3JCQiMCY9VXZjKD5QIyEjNyQiMCllcWs8VEg3ISM2NyQkIjBLLiY+bCg+UCMhIzckIjAmPUBfXmVLNyEjNjckNyQkIjBcOEVveT5QIyEjNyQiMEMlUjpCJj1DIiEjNjckJCIwSy4mPmwoPlAjISM3JCIwJj1AX15lSzchIzY3JDckJCIwXDhFb3k+UCMhIzckIjBDJVI6QiY9QyIhIzY3JCQiMGVOY2B6PlAjISM3JCIwMT09LjtdQyIhIzY3JDckJCIwbzxwdCIpPlAjISM3JCIvRTNtR0hhNyEjNTckJCIwZU5jYHo+UCMhIzckIjAxPT0uO11DIiEjNjckNyQkIjBvPHB0Iik+UCMhIzckIi9FM21HSGE3ISM1NyQkIjA0RyIqZiMpPlAjISM3JCIwImZjZm5XZDchIzY3JDckJCIwQ0F3JFspPlAjISM3JCIwJzR4O010bTchIzY3JCQiMDRHIipmIyk+UCMhIzckIjAiZmNmbldkNyEjNjckNyQkIjBDQXckWyk+UCMhIzckIjAnNHg7TXRtNyEjNjckJCIwby4qM2QpPlAjISM3JCIwTDQqUXQoKXA3ISM2NyQ3JCQiMHg3Wil6KT5QIyEjNyQiMEtmdSdSPHo3ISM2NyQkIjBvLiozZCk+UCMhIzckIjBMNCpRdCgpcDchIzY3JDckJCIweDdaKXopPlAjISM3JCIwS2Z1J1I8ejchIzY3JCQiMEhZXCcpKSk+UCMhIzckIjB3KiopcHhJI0ciISM2NyQ3JCQiMCVbPHk2Kj5QIyEjNyQiMG9aIj1YaCJIIiEjNjckJCIwSFlcJykpKT5QIyEjNyQiMHcqKilweEkjRyIhIzY3JDckJCIwJVs8eTYqPlAjISM3JCIwb1oiPVhoIkgiISM2NyQkIjAqKVJzMSMqPlAjISM3JCIwbSllXyFRWkgiISM2NyQ3JCQiMCo+MT5XKj5QIyEjNyQiMC9PKW9dMC84ISM2NyQkIjAqKVJzMSMqPlAjISM3JCIwbSllXyFRWkgiISM2NyQ3JCQiMCo+MT5XKj5QIyEjNyQiMC9PKW9dMC84ISM2NyQkIjBcemtKJio+UCMhIzckIjBZWlo9b3JJIiEjNjckNyQkIjBVcFtxKCo+UCMhIzckIi9XXz5jXDs4ISM1NyQkIjBcemtKJio+UCMhIzckIjBZWlo9b3JJIiEjNjckNyQkIjBVcFtxKCo+UCMhIzckIi9XXz5jXDs4ISM1NyQkIjBLdTNoKSo+UCMhIzckIjBAPUA8KWY+OCEjNjckNyQkIjB1MnEuLD9QIyEjNyQiMHc3LTxPKkc4ISM2NyQkIjBLdTNoKSo+UCMhIzckIjBAPUA8KWY+OCEjNjckNyQkIjB1MnEuLD9QIyEjNyQiMHc3LTxPKkc4ISM2NyQkIjAiNDdePitzQiEjNyQiMFxuQyxHP0wiISM2NyQ3JCQiLyY0XlQvP1AjISM2JCIwNyw0c3c4TSIhIzY3JCQiMCI0N14+K3NCISM3JCIwXG5DLEc/TCIhIzY3JDckJCIvJjReVC8/UCMhIzYkIjA3LDRzdzhNIiEjNjckJCIwZGZ2TDA/UCMhIzckIjA6L1pxZFdNIiEjNjckNyQkIjAyOyZSeStzQiEjNyQiMFwqZXJzIlFOIiEjNjckJCIwZGZ2TDA/UCMhIzckIjA6L1pxZFdNIiEjNjckNyQkIjAyOyZSeStzQiEjNyQiMFwqZXJzIlFOIiEjNjckJCIwUnUseDM/UCMhIzckIjA+eilbcylvTiIhIzY3JDckJCIwPDgtSjY/UCMhIzckIjAmeUZBeURtOCEjNjckJCIwUnUseDM/UCMhIzckIjA+eilbcylvTiIhIzY3JDckJCIwPDgtSjY/UCMhIzckIjAmeUZBeURtOCEjNjckJCIwJylcI1tBLHNCISM3JCIwJW9HWm1KcDghIzY3JDckJCIwVjhhI1ssc0IhIzckIjBAbUhQKXB5OCEjNjckJCIwJylcI1tBLHNCISM3JCIwJW9HWm1KcDghIzY3JDckJCIwVjhhI1ssc0IhIzckIjBAbUhQKXB5OCEjNjckJCIwWVw8eDo/UCMhIzckIjBCVyshZnUiUSIhIzY3JDckJCIwWkVzUT0/UCMhIzckIjBkYU8jKlE2UiIhIzY3JCQiMFlcPHg6P1AjISM3JCIwQlcrIWZ1IlEiISM2NyQ3JCQiMFpFc1E9P1AjISM3JCIwZGFPIypRNlIiISM2NyQkIjBtJG9TJD4/UCMhIzckIjB4PHIrdlRSIiEjNjckNyQkIjBqJWYlKj4tc0IhIzckIjAkSE11JXpOUyIhIzY3JCQiMG0kb1MkPj9QIyEjNyQiMHg8cit2VFIiISM2NyQ3JCQiMGolZiUqPi1zQiEjNyQiMCRITXUlek5TIiEjNjckJCIwR09kJkgtc0IhIzckIjAiW0ptUmcxOSEjNjckNyQkIjA0LSNbYy1zQiEjNyQiMEhKXS0/Z1QiISM2NyQkIjBHT2QmSC1zQiEjNyQiMCJbSm1SZzE5ISM2NyQ3JCQiMDQtI1tjLXNCISM3JCIwSEpdLT9nVCIhIzY3JCQiMGMiKm9oRT9QIyEjNyQiMCRmb3hGLj45ISM2NyQ3JCQiMC5icE1IP1AjISM3JCIwbD5kZGclRzkhIzY3JCQiMGMiKm9oRT9QIyEjNyQiMCRmb3hGLj45ISM2NyQ3JCQiMC5icE1IP1AjISM3JCIwbD5kZGclRzkhIzY3JCQiMCopb0JLST9QIyEjNyQiMGBTcFdoOVYiISM2NyQ3JCQiMCo9QiI0TD9QIyEjNyQiMCwzazcsNFciISM2NyQkIjAqKW9CS0k/UCMhIzckIjBgU3BXaDlWIiEjNjckNyQkIjAqPUIiNEw/UCMhIzckIjAsM2s3LDRXIiEjNjckJCIwXj9SMk0/UCMhIzckIjA7ZyVvKiopUVciISM2NyQ3JCQiMGBFMSlvLnNCISM3JCIwUCc0eDtNYDkhIzY3JCQiMF4/UjJNP1AjISM3JCIwO2clbyoqKVFXIiEjNjckNyQkIjBgRTEpby5zQiEjNyQiMFAnNHg7TWA5ISM2NyQkIjA8NCwoeS5zQiEjNyQiMEVgb009algiISM2NyQ3JCQiMDJsZXJTP1AjISM3JCIwdCV5RkF5bDkhIzY3JCQiMDw0LCh5LnNCISM3JCIwRWBvTT1qWCIhIzY3JDckJCIwMmxlclM/UCMhIzckIjB0JXlGQXlsOSEjNjckJCIwTy0/clQ/UCMhIzckIi4ocHlsdW85ISIqNyQ3JCQiMCdIJmVmVz9QIyEjNyQiMDR0JXlGQXk5ISM2NyQkIjBPLT9yVD9QIyEjNyQiLihweWx1bzkhIio3JDckJCIwJ0gmZWZXP1AjISM3JCIwNHQleUZBeTkhIzY3JCQiMHovJilmWD9QIyEjNyQiMFAudm11NlsiISM2NyQ3JCQiMHBpO19bP1AjISM3JCIwWGgiSExtIVwiISM2NyQkIjB6LyYpZlg/UCMhIzckIjBQLnZtdTZbIiEjNjckNyQkIjBwaTtfWz9QIyEjNyQiMFhoIkhMbSFcIiEjNjckJCIwaidvSSZcP1AjISM3JCIwJjQlKTRFZyRcIiEjNjckNyQkIi8oNDZcXz9QIyEjNiQiMCIpXCl6UTUuOiEjNjckJCIwaidvSSZcP1AjISM3JCIwJjQlKTRFZyRcIiEjNjckNyQkIi8oNDZcXz9QIyEjNiQiMCIpXCl6UTUuOiEjNjckJCIwV2pqXWA/UCMhIzckIjApUnI3Ly4xOiEjNjckNyQkIjAoR1cybDBzQiEjNyQiMDxRMFZXYl4iISM2NyQkIjBXampdYD9QIyEjNyQiMClScjcvLjE6ISM2NyQ3JCQiMChHVzJsMHNCISM3JCIwPFEwVldiXiIhIzY3JCQiMDIheUd2MHNCISM3JCIwLz1kMWUlPTohIzY3JDckJCIwPSdRbjAxc0IhIzckIjBgRTcpXCl6XyIhIzY3JCQiMDIheUd2MHNCISM3JCIwLz1kMWUlPTohIzY3JDckJCIwPSdRbjAxc0IhIzckIjBgRTcpXCl6XyIhIzY3JCQiMF9oWWZoP1AjISM3JCIwRWEkemIpM2AiISM2NyQ3JCQiMDswSm5rP1AjISM3JCIwKlsiPmBEL2EiISM2NyQkIjBfaFlmaD9QIyEjNyQiMEVhJHpiKTNgIiEjNjckNyQkIjA7MEpuaz9QIyEjNyQiMCpbIj5gRC9hIiEjNjckJCIwNnFocWw/UCMhIzckIi8kKm9ZSEpWOiEjNTckNyQkIjBZKFxCKW8/UCMhIzckIjBELkUzbUdiIiEjNjckJCIwNnFocWw/UCMhIzckIi8kKm9ZSEpWOiEjNTckNyQkIjBZKFxCKW8/UCMhIzckIjBELkUzbUdiIiEjNjckJCIwIkc/aSlwP1AjISM3JCIwKilmNzxTZGIiISM2NyQ3JCQiMGVcJj1JMnNCISM3JCIwaCJITG1JbDohIzY3JCQiMCJHP2kpcD9QIyEjNyQiMCopZjc8U2RiIiEjNjckNyQkIjBlXCY9STJzQiEjNyQiMGgiSExtSWw6ISM2NyQkIjBpV0YxdT9QIyEjNyQiMD05SkRuIm86ISM2NyQ3JCQiLlsjZXMyc0IhIzUkIjAoKnpSPVp4ZCIhIzY3JCQiMGlXRjF1P1AjISM3JCIwPTlKRG4ibzohIzY3JDckJCIuWyNlczJzQiEjNSQiMCgqelI9WnhkIiEjNjckJCIvY1gyJHk/UCMhIzYkIjA+VUw+JWYhZSIhIzY3JDckJCIwOGJBYSIzc0IhIzckIjBMb1l0KD0hZiIhIzY3JCQiL2NYMiR5P1AjISM2JCIwPlVMPiVmIWUiISM2NyQ3JCQiMDhiQWEiM3NCISM3JCIwTG9ZdCg9IWYiISM2NyQkIi8qW21mIzNzQiEjNiQiMHlSNCo0LSRmIiEjNjckNyQkIjBtJCk+KGUzc0IhIzckIjBwY2BHR0VnIiEjNjckJCIvKlttZiMzc0IhIzYkIjB5UjQqNC0kZiIhIzY3JDckJCIwbSQpPihlM3NCISM3JCIwcGNgR0dFZyIhIzY3JCQiMHcmM0pwM3NCISM3JCIwM21Na1phZyIhIzY3JDckJCIwNi5cQyE0c0IhIzckIjAwWGckKW9daCIhIzY3JCQiMHcmM0pwM3NCISM3JCIwM21Na1phZyIhIzY3JDckJCIwNi5cQyE0c0IhIzckIjAwWGckKW9daCIhIzY3JCQiMCwtIzQ4NHNCISM3JCIwYE9mOnV5aCIhIzY3JDckJCIvM3VpWTRzQiEjNiQiMFRMblE0dmkiISM2NyQkIjAsLSM0ODRzQiEjNyQiMGBPZjp1eWgiISM2NyQ3JCQiLzN1aVk0c0IhIzYkIjBUTG5RNHZpIiEjNjckJCIwUVA5dCY0c0IhIzckIjA6VHBfKy5qIiEjNjckNyQkIjBDVls3KjRzQiEjNyQiMHhAdSQqXCpSOyEjNjckJCIwUVA5dCY0c0IhIzckIjA6VHBfKy5qIiEjNjckNyQkIjBDVls3KjRzQiEjNyQiMHhAdSQqXCpSOyEjNjckJCIwJz55KD4rQFAjISM3JCIwczZsdkVGayIhIzY3JDckJCIwMi03ai5AUCMhIzckIjA4NSIpWyFSXzshIzY3JCQiMCc+eSg+K0BQIyEjNyQiMHM2bHZFRmsiISM2NyQ3JCQiMDItN2ouQFAjISM3JCIwODUiKVshUl87ISM2NyQkIjAtVCYzWjVzQiEjNyQiMFZwTyVHOmI7ISM2NyQ3JCQiMDxCQD0zQFAjISM3JCIvJil6UTUkW20iISM1NyQkIjAtVCYzWjVzQiEjNyQiMFZwTyVHOmI7ISM2NyQ3JCQiMDxCQD0zQFAjISM3JCIvJil6UTUkW20iISM1NyQkIjBPJ1FqIzRAUCMhIzckIi9tWSp5eXZtIiEjNTckNyQkIi8zR3hGNnNCISM2JCIwJ29bKmVyc24iISM2NyQkIjBPJ1FqIzRAUCMhIzckIi9tWSp5eXZtIiEjNTckNyQkIi8zR3hGNnNCISM2JCIwJ29bKmVyc24iISM2NyQkIjAqKj5FJ1E2c0IhIzckIjAoWyRIZi8rbyIhIzY3JDckJCIwI3onZVQ8QFAjISM3JCIwQXYsOTcoKm8iISM2NyQkIjAqKj5FJ1E2c0IhIzckIjAoWyRIZi8rbyIhIzY3JDckJCIwI3onZVQ8QFAjISM3JCIwQXYsOTcoKm8iISM2NyQkIjBkPV5dPUBQIyEjNyQiMDx3d0RJQ3AiISM2NyQ3JCQiMHJ4Kik0QUBQIyEjNyQiMGVqM3BfQHEiISM2NyQkIjBkPV5dPUBQIyEjNyQiMDx3d0RJQ3AiISM2NyQ3JCQiMHJ4Kik0QUBQIyEjNyQiMGVqM3BfQHEiISM2NyQkIjBSYzg+QkBQIyEjNyQiMHBwQHliW3EiISM2NyQ3JCQiMFQjKWYjbzdzQiEjNyQiMCU+YlRLZjk8ISM2NyQkIjBSYzg+QkBQIyEjNyQiMHBwQHliW3EiISM2NyQ3JCQiMFQjKWYjbzdzQiEjNyQiMCU+YlRLZjk8ISM2NyQkIi9AJT4jejdzQiEjNiQiMCpRWWs2Rzw8ISM2NyQ3JCQiMCNlUCdmSkBQIyEjNyQiLy5DI3pMcXMiISM1NyQkIi9AJT4jejdzQiEjNiQiMCpRWWs2Rzw8ISM2NyQ3JCQiMCNlUCdmSkBQIyEjNyQiLy5DI3pMcXMiISM1NyQkIjAmSFcmcEtAUCMhIzckIjB2XyI0a3FIPCEjNjckNyQkIjBEXzRUT0BQIyEjNyQiMG1HSE11JVI8ISM2NyQkIjAmSFcmcEtAUCMhIzckIjB2XyI0a3FIPCEjNjckNyQkIjBEXzRUT0BQIyEjNyQiMG1HSE11JVI8ISM2NyQkIjBpaUteUEBQIyEjNyQiMFdOPF5KQHUiISM2NyQ3JCQiMCd6KSlvNzlzQiEjNyQiMC08TypbIj52IiEjNjckJCIwaWlLXlBAUCMhIzckIjBXTjxeSkB1IiEjNjckNyQkIjAneikpbzc5c0IhIzckIjAtPE8qWyI+diIhIzY3JCQiMHBuT1BVQFAjISM3JCIwOnF4WmNYdiIhIzY3JDckJCIwOSVvcWg5c0IhIzckIjBRMFZXYlZ3IiEjNjckJCIwcG5PUFVAUCMhIzckIjA6cXhaY1h2IiEjNjckNyQkIjA5JW9xaDlzQiEjNyQiMFEwVldiVnciISM2NyQkIi9pT3lzOXNCISM2JCIwMCF5LDgpcHciISM2NyQ3JCQiMCdcJHA2XkBQIyEjNyQiMHUkKlwqZnp3PCEjNjckJCIvaU95czlzQiEjNiQiMDAheSw4KXB3IiEjNjckNyQkIjAnXCRwNl5AUCMhIzckIjB1JCpcKmZ6dzwhIzY3JCQiMD1ZcUFfQFAjISM3JCIvYnclKWZTejwhIzU3JDckJCIwQCYzMGg6c0IhIzckIi9Ab1hsQip5IiEjNTckJCIwPVlxQV9AUCMhIzckIi9idyUpZlN6PCEjNTckNyQkIjBAJjMwaDpzQiEjNyQiL0BvWGxCKnkiISM1NyQkIjA0YnVAZEBQIyEjNyQiMDtcUmBJPXoiISM2NyQ3JCQiMCYzXFE2O3NCISM3JCIwWXFqNHg7IT0hIzY3JCQiMDRidUBkQFAjISM3JCIwO1xSYEk9eiIhIzY3JDckJCIwJjNcUTY7c0IhIzckIjBZcWo0eDshPSEjNjckJCIvVCVIRGlAUCMhIzYkIjBuJmVRXEQvPSEjNjckNyQkIjBecVBAbUBQIyEjNyQiMCMpZXFrPFQiPSEjNjckJCIvVCVIRGlAUCMhIzYkIjBuJmVRXEQvPSEjNjckNyQkIjBecVBAbUBQIyEjNyQiMCMpZXFrPFQiPSEjNjckJCIwKFE4SXQ7c0IhIzckIi8yXjQjem0iPSEjNTckNyQkIjBgaUpMckBQIyEjNyQiMD1aeD5lbCM9ISM2NyQkIjAoUThJdDtzQiEjNyQiLzJeNCN6bSI9ISM1NyQ3JCQiMGBpSkxyQFAjISM3JCIwPVp4PmVsIz0hIzY3JCQiMC5mN1hzQFAjISM3JCIwL2YmUkw1SD0hIzY3JDckJCIwbEhiXHdAUCMhIzckIjBhTiVbKCkqKlE9ISM2NyQkIjAuZjdYc0BQIyEjNyQiMC9mJlJMNUg9ISM2NyQ3JCQiMGxIYlx3QFAjISM3JCIwYU4lWygpKipRPSEjNjckJCIwMyM9Onc8c0IhIzckIi55QkxGOiU9ISIqNyQ3JCQiMEJmM3EiPXNCISM3JCIvUjcqSFI5Jj0hIzU3JCQiMDMjPTp3PHNCISM3JCIueUJMRjolPSEiKjckNyQkIjBCZjNxIj1zQiEjNyQiL1I3KkhSOSY9ISM1NyQkIjAtKik9I0c9c0IhIzckIi9ELCk9XlImPSEjNTckNyQkIjA6cy0mcD1zQiEjNyQiMEU3KVwpelEnPSEjNjckJCIwLSopPSNHPXNCISM3JCIvRCwpPV5SJj0hIzU3JDckJCIwOnMtJnA9c0IhIzckIjBFNylcKXpRJz0hIzY3JCQiMDA5QTIpPXNCISM3JCIwcih5LlxQbT0hIzY3JDckJCIveD9UQT5zQiEjNiQiMGkrMFM/aig9ISM2NyQkIjAwOUEyKT1zQiEjNyQiMHIoeS5cUG09ISM2NyQ3JCQiL3g/VEE+c0IhIzYkIjBpKzBTP2ooPSEjNjckJCIwXF1XTyQ+c0IhIzckIjApZjwmWyl6eT0hIzY3JDckJCIwIioqW3d2PnNCISM3JCIwKSopPV40dykpPSEjNjckJCIwXF1XTyQ+c0IhIzckIjApZjwmWyl6eT0hIzY3JDckJCIwIioqW3d2PnNCISM3JCIwKSopPV40dykpPSEjNjckJCIwayVHKygpPnNCISM3JCIwTXFuIz5BIio9ISM2NyQ3JCQiLyozVyZIP3NCISM2JCIwTXg9XSw3IT4hIzY3JCQiMGslRysoKT5zQiEjNyQiME1xbiM+QSIqPSEjNjckNyQkIi8qM1cmSD9zQiEjNiQiME14PV0sNyE+ISM2NyQkIjBOYSl5Uz9zQiEjNyQiMDtOOEJYTyE+ISM2NyQ3JCQiMDJOX1AzQVAjISM3JCIvZGNfP2s4PiEjNTckJCIwTmEpeVM/c0IhIzckIjA7TjhCWE8hPiEjNjckNyQkIjAyTl9QM0FQIyEjNyQiL2RjXz9rOD4hIzU3JCQiMHZYLF00QVAjISM3JCIwKFwiKilSb2ciPiEjNjckNyQkIjA4OHkkUUBzQiEjNyQiMDFhS2cjM0U+ISM2NyQkIjB2WCxdNEFQIyEjNyQiMChcIiopUm9nIj4hIzY3JDckJCIwOTh5JFFAc0IhIzckIjAxYUtnIzNFPiEjNjckJCIwUEhGJ1xAc0IhIzckIjBHJDRNOVxHPiEjNjckNyQkIjBPVFRNPkFQIyEjNyQiMFVVUjpCJlE+ISM2NyQkIjBQSEYnXEBzQiEjNyQiMEckNE05XEc+ISM2NyQ3JCQiME9UVE0+QVAjISM3JCIwVVVSOkImUT4hIzY3JCQiMGRdInAvQXNCISM3JCIwXjMoR1YiNCU+ISM2NyQ3JCQiMExWTCpbQXNCISM3JCIweklZcWo0Jj4hIzY3JCQiMGRdInAvQXNCISM3JCIwXjMoR1YiNCU+ISM2NyQ3JCQiMExWTCpbQXNCISM3JCIweklZcWo0Jj4hIzY3JCQiMCJmKXosRUFQIyEjNyQiMCZbSygzUEwmPiEjNjckNyQkIjBLKilSW0lBUCMhIzckIjA6PmBEL00nPiEjNjckJCIwImYpeixFQVAjISM3JCIwJltLKDNQTCY+ISM2NyQ3JCQiMEsqKVJbSUFQIyEjNyQiMDo+YEQvTSc+ISM2NyQkIjBfWyQzO0JzQiEjNyQiMCpmeTcoZmQnPiEjNjckNyQkIjAjXGo9aEJzQiEjNyQiMF4yZyFbJWUoPiEjNjckJCIwX1skMztCc0IhIzckIjAqZnk3KGZkJz4hIzY3JDckJCIwI1xqPWhCc0IhIzckIjBeMmchWyVlKD4hIzY3JCQiMDE8RENQQVAjISM3JCIwYiZ5KD4jPXk+ISM2NyQ3JCQiMHBvXHpUQVAjISM3JCIwKGVwY2BHKSk+ISM2NyQkIjAxPERDUEFQIyEjNyQiMGImeSg+Iz15PiEjNjckNyQkIjBwb1x6VEFQIyEjNyQiMChlcGNgRykpPiEjNjckJCIwcDx6IkhDc0IhIzckIi9rZF1YZyEqPiEjNTckNyQkIjBGa1FeWkFQIyEjNyQiMEIlUTJmcys/ISM2NyQkIjBwPHoiSENzQiEjNyQiL2tkXVhnISo+ISM1NyQ3JCQiMEZrUV5aQVAjISM3JCIwQiVRMmZzKz8hIzY3JCQiMDchcE4nW0FQIyEjNyQiMDgvdndFSSsjISM2NyQ3JCQiMEBmVEZgQVAjISM3JCIwZnMhZWs7OD8hIzY3JCQiMDchcE4nW0FQIyEjNyQiMDgvdndFSSsjISM2NyQ3JCQiMEBmVEZgQVAjISM3JCIwZnMhZWs7OD8hIzY3JCQiLzokXFJhQVAjISM2JCIwb2o5JilbYSwjISM2NyQ3JCQiMGI7JXkhZkFQIyEjNyQiMCY0dzNxZ0Q/ISM2NyQkIi86JFxSYUFQIyEjNiQiMG9qOSYpW2EsIyEjNjckNyQkIjBiOyV5IWZBUCMhIzckIjAmNHczcWdEPyEjNjckJCIwdnl3PmdBUCMhIzckIjB2QmZ6cXktIyEjNjckNyQkIjAzYFMjXEVzQiEjNyQiMEpcJWZ2L1E/ISM2NyQkIjB2eXc+Z0FQIyEjNyQiMHZCZnpxeS0jISM2NyQ3JCQiMDNgUyNcRXNCISM3JCIwSlwlZnYvUT8hIzY3JCQiMCZ5Jz0vbUFQIyEjNyQiMGMtdmcjSFM/ISM2NyQ3JCQiMHU1OCIzRnNCISM3JCIwblAsNilbXT8hIzY3JCQiMCZ5Jz0vbUFQIyEjNyQiMGMtdmcjSFM/ISM2NyQ3JCQiMHU1OCIzRnNCISM3JCIwblAsNilbXT8hIzY3JCQiMCx0cCM+RnNCISM3JCIwKmYpeUc5RjAjISM2NyQ3JCQiMERLM3V3QVAjISM3JCIwLkUzbUdIMSMhIzY3JCQiMCx0cCM+RnNCISM3JCIwKmYpeUc5RjAjISM2NyQ3JCQiMERLM3V3QVAjISM3JCIwLkUzbUdIMSMhIzY3JCQiMEpfWSZ5RnNCISM3JCIwXmQ8JGU4bD8hIzY3JDckJCIwUTxKciNHc0IhIzckIjBSOTpAcGAyIyEjNjckJCIwSl9ZJnlGc0IhIzckIjBeZDwkZThsPyEjNjckNyQkIjBRPEpyI0dzQiEjNyQiMFI5OkBwYDIjISM2NyQkIjBZVlkjUUdzQiEjNyQiMDdlKlJzYng/ISM2NyQ3JCQiMCd6dEUoKUdzQiEjNyQiMHYtQXc0eTMjISM2NyQkIjBZVlkjUUdzQiEjNyQiMDdlKlJzYng/ISM2NyQ3JCQiMCd6dEUoKUdzQiEjNyQiMHYtQXc0eTMjISM2NyQkIjB2PWckKSpHc0IhIzckIjBbaWFeeSoqMyMhIzY3JDckJCIwIno0JHklSHNCISM3JCIwNiIqR0pdLTUjISM2NyQkIjB2PWckKSpHc0IhIzckIjBbaWFeeSoqMyMhIzY3JDckJCIwIno0JHklSHNCISM3JCIwNiIqR0pdLTUjISM2NyQkIi8jUiUqKWVIc0IhIzYkIjAxXmhsKlItQCEjNjckNyQkIjBuYCR6M0lzQiEjNyQiMFp6TiczcDdAISM2NyQkIi8jUiUqKWVIc0IhIzYkIjAxXmhsKlItQCEjNjckNyQkIjBuYCR6M0lzQiEjNyQiMFp6TiczcDdAISM2NyQkIi9mLyQpPklzQiEjNiQiL1cpem0/WzYjISM1NyQ3JCQiMCcpKlw+cUlzQiEjNyQiMCR5RTk5OERAISM2NyQkIi9mLyQpPklzQiEjNiQiL1cpem0/WzYjISM1NyQ3JCQiMCcpKlw+cUlzQiEjNyQiMCR5RTk5OERAISM2NyQkIjBqYCk+IjNCUCMhIzckIjBzJkhUOkNGQCEjNjckNyQkIjApKSpwK0tKc0IhIzckIjA+Y1wnPmRQQCEjNjckJCIwamApPiIzQlAjISM3JCIwcyZIVDpDRkAhIzY3JDckJCIwKSkqcCtLSnNCISM3JCIwPmNcJz5kUEAhIzY3JCQiMFwjKnpIOUJQIyEjNyQiMHchMyNHaSdSQCEjNjckNyQkIjBwP01VPkJQIyEjNyQiMGJXY143KzojISM2NyQkIjBcIyp6SDlCUCMhIzckIjB3ITMjR2knUkAhIzY3JDckJCIwcD9NVT5CUCMhIzckIjBiV2NeNys6IyEjNjckJCIwWjJzXj9CUCMhIzckIjBCZDYqRzNfQCEjNjckNyQkIjAqKjR1b0RCUCMhIzckIjAiSExtSVhpQCEjNjckJCIwWjJzXj9CUCMhIzckIjBCZDYqRzNfQCEjNjckNyQkIjAqKjR1b0RCUCMhIzckIjAiSExtSVhpQCEjNjckJCIwb19zeEVCUCMhIzckIjBfOCRwTF1rQCEjNjckNyQkIi9aVSMqPkxzQiEjNiQiMEZAcWgkKls8IyEjNjckJCIwb19zeEVCUCMhIzckIjBfOCRwTF1rQCEjNjckNyQkIi9aVSMqPkxzQiEjNiQiMEZAcWgkKls8IyEjNjckJCIwLyRleUlMc0IhIzckIjAqNDQ6UCNwPCMhIzY3JDckJCIwJlE1UyRRQlAjISM3JCIwajR4O010PSMhIzY3JCQiMC8kZXlJTHNCISM3JCIwKjQ0OlAjcDwjISM2NyQ3JCQiMCZRNVMkUUJQIyEjNyQiMGo0eDtNdD0jISM2NyQkIjBWMT5VUkJQIyEjNyQiMCMpPmkjUk0qPSMhIzY3JDckJCIuJXpHWk1zQiEjNSQiMCp6Uj1aeCo+IyEjNjckJCIwVjE+VVJCUCMhIzckIjAjKT5pI1JNKj0jISM2NyQ3JCQiLiV6R1pNc0IhIzUkIjAqelI9WngqPiMhIzY3JCQiMCZHRTFlTXNCISM3JCIwQ3lkK2s8PyMhIzY3JDckJCIwdzkoZTZOc0IhIzckIjBOJzNwX0A3QSEjNjckJCIwJkdFMWVNc0IhIzckIjBDeWQrazw/IyEjNjckNyQkIjB3OShlNk5zQiEjNyQiME4nM3BfQDdBISM2NyQkIjBOUjtCX0JQIyEjNyQiMHYyUSZSPTlBISM2NyQ3JCQiMFdhKUh3TnNCISM3JCIwcnUoPmVsQ0EhIzY3JCQiME5SO0JfQlAjISM3JCIwdjJRJlI9OUEhIzY3JDckJCIwV2EpSHdOc0IhIzckIjBydSg+ZWxDQSEjNjckJCIwKkgtKXBlQlAjISM3JCIwJylcLngubUEjISM2NyQ3JCQiMFAsQTlrQlAjISM3JCIwMmovUCc0UEEhIzY3JCQiMCpILSlwZUJQIyEjNyQiMCcpXC54Lm1BIyEjNjckNyQkIjBQLEE5a0JQIyEjNyQiMDJqL1AnNFBBISM2NyQkIjA5Iz0wX09zQiEjNyQiMEhaaFhCIVJBISM2NyQ3JCQiMCRvXyZwcUJQIyEjNyQiMFdeNiNwYFxBISM2NyQkIjA5Iz0wX09zQiEjNyQiMEhaaFhCIVJBISM2NyQ3JCQiMCRvXyZwcUJQIyEjNyQiMFdeNiNwYFxBISM2NyQkIjBPRkx2ckJQIyEjNyQiMCRbXzVJV15BISM2NyQ3JCQiMDBUK0h4QlAjISM3JCIvKVI9Wng+RSMhIzU3JCQiME9GTHZyQlAjISM3JCIwJFtfNUlXXkEhIzY3JDckJCIwMFQrSHhCUCMhIzckIi8pUj1aeD5FIyEjNTckJCIweVhDTXlCUCMhIzckIi9RX0xDJ1FFIyEjNTckNyQkIjBVS2QjUlFzQiEjNyQiMDtHRC09V0YjISM2NyQkIjB5WENNeUJQIyEjNyQiL1FfTEMnUUUjISM1NyQ3JCQiMFVLZCNSUXNCISM3JCIwO0dELT1XRiMhIzY3JCQiMDQ4QihcUXNCISM3JCIwWGplcyJHd0EhIzY3JDckJCIwZXpCZyFSc0IhIzckIjBfO0tkZW9HIyEjNjckJCIwNDhCKFxRc0IhIzckIjBYamVzIkd3QSEjNjckNyQkIjBlekJnIVJzQiEjNyQiMF87S2Rlb0cjISM2NyQkIjB1S0prIlJzQiEjNyQiMFIiKm8pM3EpRyMhIzY3JDckJCIwQnoqPXRSc0IhIzckIjApWyFSNypIKkgjISM2NyQkIjB1S0prIlJzQiEjNyQiMFIiKm8pM3EpRyMhIzY3JDckJCIwQnoqPXRSc0IhIzckIjApWyFSNypIKkgjISM2NyQkIjBPKG9gJClSc0IhIzckIjAxNjAjKj42SSMhIzY3JDckJCIwPkl6Mi9DUCMhIzckIjBDJGZ1J1I8SiMhIzY3JCQiME8ob2AkKVJzQiEjNyQiMDE2MCMqPjZJIyEjNjckNyQkIjA+SXoyL0NQIyEjNyQiMEMkZnUnUjxKIyEjNjckJCIwJm87MV5Tc0IhIzckIjBsKyg+KVFOSiMhIzY3JDckJCIvTmd3M1RzQiEjNiQiLztHRC09Q0IhIzU3JCQiMCZvOzFeU3NCISM3JCIwbCsoPilRTkojISM2NyQ3JCQiL05ndzNUc0IhIzYkIi87R0QtPUNCISM1NyQkIjBWYSIpKj1Uc0IhIzckIi8mNEFmZGZLIyEjNTckNyQkIjBZLGlyPENQIyEjNyQiMCcqcGZ4P21MIyEjNjckJCIwVmEiKSo9VHNCISM3JCIvJjRBZmRmSyMhIzU3JDckJCIwWSxpcjxDUCMhIzckIjAnKnBmeD9tTCMhIzY3JCQiMFJbNXQ9Q1AjISM3JCIwLGFOQnckUUIhIzY3JDckJCIwUDxwZkNDUCMhIzckIjBLZW1LaCFcQiEjNjckJCIwUls1dD1DUCMhIzckIjAsYU5CdyRRQiEjNjckNyQkIjBQPHBmQ0NQIyEjNyQiMEtlbUtoIVxCISM2NyQkIjBXUllnRENQIyEjNyQiMEQwV3Ulel1CISM2NyQ3JCQiMHNFdF5KQ1AjISM3JCIwb1l0KD1daEIhIzY3JCQiMFdSWWdEQ1AjISM3JCIwRDBXdSV6XUIhIzY3JDckJCIwc0V0XkpDUCMhIzckIjBvWXQoPV1oQiEjNjckJCIwNCt6XktDUCMhIzckIjAkeTBHSkBqQiEjNjckNyQkIjBISil5JVFDUCMhIzckIjAvTiFHQyVSUCMhIzY3JCQiMDQrel5LQ1AjISM3JCIwJHkwR0pAakIhIzY3JDckJCIwSEopeSVRQ1AjISM3JCIwL04hR0MlUlAjISM2NyQkIjB0UD1aUkNQIyEjNyQiMGwiRyJRSmNQIyEjNjckNyQkIjAnKkg3W1hDUCMhIzckIi9Nc3lIUSdRIyEjNTckJCIwdFA9WlJDUCMhIzckIjBsIkciUUpjUCMhIzY3JDckJCIwJypIN1tYQ1AjISM3JCIvTXN5SFEnUSMhIzU3JCQiMEhaa1lZQ1AjISM3JCIwIkg0LyZcISlRIyEjNjckNyQkIjBXJEhCRFhzQiEjNyQiMHc2JUhOIykpUiMhIzY3JCQiMEhaa1lZQ1AjISM3JCIwIkg0LyZcISlRIyEjNjckNyQkIjBXJEhCRFhzQiEjNyQiMHc2JUhOIykpUiMhIzY3JCQiMGAnbytOWHNCISM3JCIwXkwpKlxuL1MjISM2NyQ3JCQiMDhCa2dmQ1AjISM3JCIwNyssM2s3VCMhIzY3JCQiMGAnbytOWHNCISM3JCIwXkwpKlxuL1MjISM2NyQ3JCQiMDhCa2dmQ1AjISM3JCIwNyssM2s3VCMhIzY3JCQiMDAlUnYwWXNCISM3JCIwXzllTyYpR1QjISM2NyQ3JCQiMFk4IUhuWXNCISM3JCIwWyl5SVlxQkMhIzY3JCQiMDAlUnYwWXNCISM3JCIwXzllTyYpR1QjISM2NyQ3JCQiMFk4IUhuWXNCISM3JCIwWyl5SVlxQkMhIzY3JCQiMGIxKCpvbkNQIyEjNyQiMDQvWzUuYFUjISM2NyQ3JCQiMGtfRSpRWnNCISM3JCIwJW9aIj1YaFYjISM2NyQkIjBiMSgqb25DUCMhIzckIjA0L1s1LmBVIyEjNjckNyQkIjBrX0UqUVpzQiEjNyQiMCVvWiI9WGhWIyEjNjckJCIwWmNZJVtac0IhIzckIjB1Ilw4MnNQQyEjNjckNyQkIjBDPGY0IltzQiEjNyQiL187S2RlW0MhIzU3JCQiMFpjWSVbWnNCISM3JCIwdSJcODJzUEMhIzY3JDckJCIwQzxmNCJbc0IhIzckIi9fO0tkZVtDISM1NyQkIjBqMCFSP1tzQiEjNyQiMGtaZT5RLFgjISM2NyQ3JCQiMEdNK00pW3NCISM3JCIwY2BHR0U1WSMhIzY3JCQiMGowIVI/W3NCISM3JCIwa1plPlEsWCMhIzY3JDckJCIwR00rTSlbc0IhIzckIjBjYEdHRTVZIyEjNjckJCIwMF5URipbc0IhIzckIjBII1JaYmJpQyEjNjckNyQkIi8wcEFjXHNCISM2JCIwIz5hTG9ZdEMhIzY3JCQiMDBeVEYqW3NCISM3JCIwSCNSWmJiaUMhIzY3JDckJCIvMHBBY1xzQiEjNiQiMCM+YUxvWXRDISM2NyQkIi9ARVpsXHNCISM2JCIwLC1zeHNcWiMhIzY3JDckJCIvOkRaSF1zQiEjNiQiMEdJVVEyZlsjISM2NyQkIi9ARVpsXHNCISM2JCIwLC1zeHNcWiMhIzY3JDckJCIvOkRaSF1zQiEjNiQiMEdJVVEyZlsjISM2NyQkIjAlekBpUV1zQiEjNyQiMFVRRygpKlEoWyMhIzY3JDckJCIwZGUsSjVEUCMhIzckIjBrPVwkek0pXCMhIzY3JCQiMCV6QGlRXXNCISM3JCIwVVFHKCkqUShbIyEjNjckNyQkIjBkZSxKNURQIyEjNyQiMGs9XCR6TSlcIyEjNjckJCIwMyJIOjdec0IhIzckIjBhYGklbyEpKlwjISM2NyQ3JCQiMGUqKVFyPERQIyEjNyQiLjJjWyl5NUQhIio3JCQiMDMiSDo3XnNCISM3JCIwYWBpJW8hKSpcIyEjNjckNyQkIjBlKilRcjxEUCMhIzckIi4yY1speTVEISIqNyQkIi9sNjQnPURQIyEjNiQiMFkpKiopb0JBXiMhIzY3JDckJCIwKDROZF5fc0IhIzckIjBPJkhPIUhLXyMhIzY3JCQiL2w2NCc9RFAjISM2JCIwWSkqKilvQkFeIyEjNjckNyQkIjAoNE5kXl9zQiEjNyQiME8mSE8hSEtfIyEjNjckJCIwVzhAL0VEUCMhIzckIjB5VGhTU1lfIyEjNjckNyQkIjBGMy1rS0RQIyEjNyQiMHMkKXBlcGNgIyEjNjckJCIwVzhAL0VEUCMhIzckIjB5VGhTU1lfIyEjNjckNyQkIjBGMy1rS0RQIyEjNyQiMHMkKXBlcGNgIyEjNjckJCIwM05XXkxEUCMhIzckIjBSIz4oKnAwUEQhIzY3JDckJCIwdjhFO1NEUCMhIzckIjA0c3c4NSJbRCEjNjckJCIwM05XXkxEUCMhIzckIjBSIz4oKnAwUEQhIzY3JDckJCIwdjhFO1NEUCMhIzckIjA0c3c4NSJbRCEjNjckJCIwUHBnLVREUCMhIzckIjAnKSk9aU1aXEQhIzY3JDckJCIwYGNYc1pEUCMhIzckIjBYZyQpb10wYyMhIzY3JCQiMFBwZy1URFAjISM3JCIwJykpPWlNWlxEISM2NyQ3JCQiMGBjWHNaRFAjISM3JCIwWGckKW9dMGMjISM2NyQkIjB0X29kW0RQIyEjNyQiMHViOyEpKik9YyMhIzY3JDckJCIwc1ByS2JEUCMhIzckIjAiKVshUjcqSGQjISM2NyQkIjB0X29kW0RQIyEjNyQiMHViOyEpKik9YyMhIzY3JDckJCIwc1ByS2JEUCMhIzckIjAiKVshUjcqSGQjISM2NyQkIjA3USRvaGJzQiEjNyQiMGA4MSwxVmQjISM2NyQ3JCQiMCh6N29IY3NCISM3JCIwPFAoKnlKYWUjISM2NyQkIjA3USRvaGJzQiEjNyQiMGA4MSwxVmQjISM2NyQ3JCQiMCh6N29IY3NCISM3JCIwPFAoKnlKYWUjISM2NyQkIjBsKHAoempEUCMhIzckIi8oSCIpNEFuZSMhIzU3JDckJCIwJ2V1XDFkc0IhIzckIjBgRC9Nc3lmIyEjNjckJCIwbChwKHpqRFAjISM3JCIvKEgiKTRBbmUjISM1NyQ3JCQiMCdldVwxZHNCISM3JCIwYEQvTXN5ZiMhIzY3JCQiMGNbdVlyRFAjISM3JCIwKUc4YyFRIipmIyEjNjckNyQkIjBHZSVwJHlEUCMhIzckIjAqUTYiKkdKNUUhIzY3JCQiMGNbdVlyRFAjISM3JCIwKUc4YyFRIipmIyEjNjckNyQkIjBHZSVwJHlEUCMhIzckIjAqUTYiKkdKNUUhIzY3JCQiMCxVYDx6RFAjISM3JCIwJlEkPSpRYjZFISM2NyQ3JCQiMEMuKUdoZXNCISM3JCIwRC09V2BGaSMhIzY3JCQiMCxVYDx6RFAjISM3JCIwJlEkPSpRYjZFISM2NyQ3JCQiMEMuKUdoZXNCISM3JCIwRC09V2BGaSMhIzY3JCQiMD5XQiNwZXNCISM3JCIwZk1AZ3BSaSMhIzY3JDckJCIwJDNcRlJmc0IhIzckIjBoIVwjKlI+TkUhIzY3JCQiMD5XQiNwZXNCISM3JCIwZk1AZ3BSaSMhIzY3JDckJCIwJDNcRlJmc0IhIzckIjBoIVwjKlI+TkUhIzY3JCQiMFEnZTNaZnNCISM3JCIwNjltPSZRT0UhIzY3JDckJCIwRl5jdyxFUCMhIzckIjAoKnlKYU13ayMhIzY3JCQiMFEnZTNaZnNCISM3JCIwNjltPSZRT0UhIzY3JDckJCIwRl5jdyxFUCMhIzckIjAoKnlKYU13ayMhIzY3JCQiL1sjUmAtRVAjISM2JCIwW0xkayspW0UhIzY3JDckJCIwQldKazRFUCMhIzckIjBMblE0dittIyEjNjckJCIvWyNSYC1FUCMhIzYkIjBbTGRrKylbRSEjNjckNyQkIjBCV0prNEVQIyEjNyQiMExuUTR2K20jISM2NyQkIjA6JlspUjVFUCMhIzckIjBpKjN6ZkBoRSEjNjckNyQkIjBLJTRndmhzQiEjNyQiMHBiWGs6RG4jISM2NyQkIjA6JlspUjVFUCMhIzckIjBpKjN6ZkBoRSEjNjckNyQkIjBLJTRndmhzQiEjNyQiMHBiWGs6RG4jISM2NyQkIjBWSEBJPUVQIyEjNyQiMC5Ecj1KT24jISM2NyQ3JCQiMD4iMzpiaXNCISM3JCIwMFdfPmNcbyMhIzY3JCQiMFZIQEk9RVAjISM3JCIwLkRyPUpPbiMhIzY3JDckJCIwPiIzOmJpc0IhIzckIjAwV18+Y1xvIyEjNjckJCIwUCVwVmlpc0IhIzckIi8ocE5GWWdvIyEjNTckNyQkIjBsI3o1TmpzQiEjNyQiMFRLZnUnUihwIyEjNjckJCIwUCVwVmlpc0IhIzckIi8ocE5GWWdvIyEjNTckNyQkIjBsI3o1TmpzQiEjNyQiMFRLZnUnUihwIyEjNjckJCIwdDZjQU1FUCMhIzckIjBERTFCaCUpcCMhIzY3JDckJCIwPU1LYVRFUCMhIzckIjB4P21IUCk0RiEjNjckJCIwdDZjQU1FUCMhIzckIjBERTFCaCUpcCMhIzY3JDckJCIwPU1LYVRFUCMhIzckIjB4P21IUCk0RiEjNjckJCIvLC1XQWtzQiEjNiQiMDx3MTJ3M3IjISM2NyQ3JCQiMHpwaWhcRVAjISM3JCIwODR0JXlGQUYhIzY3JCQiLywtV0Frc0IhIzYkIjA8dzEydzNyIyEjNjckNyQkIjB6cGloXEVQIyEjNyQiMDg0dCV5RkFGISM2NyQkIi8kKilHSV1FUCMhIzYkIjBRISo0eSFIQkYhIzY3JDckJCIwLkN1c2RFUCMhIzckIjBcKCp6Uj1adCMhIzY3JCQiLyQqKUdJXUVQIyEjNiQiMFEhKjR5IUhCRiEjNjckNyQkIjAuQ3VzZEVQIyEjNyQiMFwoKnpSPVp0IyEjNjckJCIwVjomKlJlRVAjISM3JCIwJClRLVAwZHQjISM2NyQ3JCQiMGpveShlbXNCISM3JCIwJmVvWyplcnUjISM2NyQkIjBWOiYqUmVFUCMhIzckIjAkKVEtUDBkdCMhIzY3JDckJCIwam95KGVtc0IhIzckIjAmZW9bKmVydSMhIzY3JCQiMDAkSE5sbXNCISM3JCIvKlxSJCk+IltGISM1NyQ3JCQiMD4wazF1RVAjISM3JCIwQHUkKlwqZmZGISM2NyQkIjAwJEhObG1zQiEjNyQiLypcUiQpPiJbRiEjNTckNyQkIjA+MGsxdUVQIyEjNyQiMEB1JCpcKmZmRiEjNjckJCIwby8pM1puc0IhIzckIjB1b208TTB3IyEjNjckNyQkIjAxPFVII29zQiEjNyQiMGRpKzBTP3gjISM2NyQkIjBvLykzWm5zQiEjNyQiMHVvbTxNMHcjISM2NyQ3JCQiMDE8VUgjb3NCISM3JCIwZGkrMFM/eCMhIzY3JCQiMCc+TUBIb3NCISM3JCIwcGBVUltIeCMhIzY3JDckJCIwNiUqKmYwcHNCISM3JCIwJDR2KzFbJXkjISM2NyQkIjAnPk1ASG9zQiEjNyQiMHBgVVJbSHgjISM2NyQ3JCQiMDYlKipmMHBzQiEjNyQiMCQ0disxWyV5IyEjNjckJCIwSydmcjZwc0IhIzckIjBsKzRcaWB5IyEjNjckNyQkIjBjUF0nKSlwc0IhIzckIjBIUjk6QHB6IyEjNjckJCIwSydmcjZwc0IhIzckIjBsKzRcaWB5IyEjNjckNyQkIjBjUF0nKSlwc0IhIzckIjBIUjk6QHB6IyEjNjckJCIvXyczWSpwc0IhIzYkIjBWXENZd3h6IyEjNjckNyQkIjBlSiEzc3FzQiEjNyQiMGxGQHFoJDRHISM2NyQkIi9fJzNZKnBzQiEjNiQiMFZcQ1l3eHojISM2NyQ3JCQiMGVKITNzcXNCISM3JCIwbEZAcWgkNEchIzY3JCQiMCp6I3p5MkZQIyEjNyQiMClRIkdKIT41RyEjNjckNyQkIjApcDAqZTpGUCMhIzckIjAsO0dELT0jRyEjNjckJCIwKnojenkyRlAjISM3JCIwKVEiR0ohPjVHISM2NyQ3JCQiMClwMCplOkZQIyEjNyQiMCw7R0QtPSNHISM2NyQkIjBDJGVfaHJzQiEjNyQiMCQqUkUvL0UjRyEjNjckNyQkIjAiKVEjNFNzc0IhIzckIjBQL04hR0NNRyEjNjckJCIwQyRlX2hyc0IhIzckIjAkKlJFLy9FI0chIzY3JDckJCIwIilRIzRTc3NCISM3JCIwUC9OIUdDTUchIzY3JCQiMEVAamJDRlAjISM3JCIwJypbcms8XSRHISM2NyQ3JCQiMFhKdVlLRlAjISM3JCIwdSM+YUxvWUchIzY3JCQiMEVAamJDRlAjISM3JCIwJypbcms8XSRHISM2NyQ3JCQiMFhKdVlLRlAjISM3JCIwdSM+YUxvWUchIzY3JCQiMEBUdypIdHNCISM3JCIwT2A2OEp1JUchIzY3JDckJCIwL19NJzR1c0IhIzckIi82KVshUjdmRyEjNTckJCIwQFR3Kkh0c0IhIzckIjBPYDY4SnUlRyEjNjckNyQkIjAvX00nNHVzQiEjNyQiLzYpWyFSN2ZHISM1NyQkIjAkUXF3OXVzQiEjNyQiL3g4JVxXKWZHISM1NyQ3JCQiMDQneSlcXEZQIyEjNyQiMFlwYlhrOihHISM2NyQkIjAkUXF3OXVzQiEjNyQiL3g4JVxXKWZHISM1NyQ3JCQiMDQneSlcXEZQIyEjNyQiMFlwYlhrOihHISM2NyQkIjBRZVkqKlxGUCMhIzckIjAncFRLeERzRyEjNjckNyQkIjAuUz4yZUZQIyEjNyQiMCN5RDFdKyUpRyEjNjckJCIwUWVZKipcRlAjISM3JCIwJ3BUS3hEc0chIzY3JDckJCIwLlM+MmVGUCMhIzckIjAjeUQxXSslKUchIzY3JCQiMCpITF0mZUZQIyEjNyQiMGxbKFwzbiUpRyEjNjckNyQkIjAqeTAkb21GUCMhIzckIjA9WXBiWGsqRyEjNjckJCIwKkhMXSZlRlAjISM3JCIwbFsoXDNuJSlHISM2NyQ3JCQiMCp5MCRvbUZQIyEjNyQiMD1ZcGJYaypHISM2NyQkIjA2ak45bkZQIyEjNyQiMFZnbSVRMygqRyEjNjckNyQkIjByIik+THZGUCMhIzckIjBhTXc1JykpM0ghIzY3JCQiMDZqTjluRlAjISM3JCIwVmdtJVEzKCpHISM2NyQ3JCQiMHIiKT5MdkZQIyEjNyQiMGFNdzUnKSkzSCEjNjckJCIwKmVUdWR4c0IhIzckIjAocCRIcydcNEghIzY3JDckJCIwJXB4PVN5c0IhIzckIi9IS2VtS0BIISM1NyQkIjAqZVR1ZHhzQiEjNyQiMChwJEhzJ1w0SCEjNjckNyQkIjAlcHg9U3lzQiEjNyQiL0hLZW1LQEghIzU3JCQiMEEhKUdXJXlzQiEjNyQiL1JoeSU0PiNIISM1NyQ3JCQiMHN4WnUjenNCISM3JCIwRTYhNHN3TEghIzY3JCQiMEEhKUdXJXlzQiEjNyQiL1JoeSU0PiNIISM1NyQ3JCQiMHN4WnUjenNCISM3JCIwRTYhNHN3TEghIzY3JCQiMD4nR11KenNCISM3JCIwTUUlNEBLTUghIzY3JDckJCIwbilHMjohR1AjISM3JCIwaSpwZng/WUghIzY3JCQiMD4nR11KenNCISM3JCIwTUUlNEBLTUghIzY3JDckJCIwbilHMjohR1AjISM3JCIwaSpwZng/WUghIzY3JCQiME5WUio9IUdQIyEjNyQiMDcsU2lNbiVIISM2NyQ3JCQiMEEiKiozLiJHUCMhIzckIjApelE1JFsnZUghIzY3JCQiME5WUio9IUdQIyEjNyQiMDcsU2lNbiVIISM2NyQ3JCQiMEEiKiozLiJHUCMhIzckIjApelE1JFsnZUghIzY3JCQiMHhwa241R1AjISM3JCIwWlZSLFoiZkghIzY3JDckJCIwWENyOT5HUCMhIzckIjBNdzUnKSkzckghIzY3JCQiMHhwa241R1AjISM3JCIwWlZSLFoiZkghIzY3JDckJCIwWENyOT5HUCMhIzckIjBNdzUnKSkzckghIzY3JCQiMGFEX1w+R1AjISM3JCIwOz14R2Y6KEghIzY3JDckJCIwTCYzQiFHR1AjISM3JCIvWnc2JUhOKUghIzU3JCQiMGFEX1w+R1AjISM3JCIwOz14R2Y6KEghIzY3JDckJCIwTCYzQiFHR1AjISM3JCIvWnc2JUhOKUghIzU3JCQiMCVRYV4kR0dQIyEjNyQiMFVdNVdyUilIISM2NyQ3JCQiMFtCI1FwJEdQIyEjNyQiMDFgQycqcGYqSCEjNjckJCIwJVFhXiRHR1AjISM3JCIwVV01V3JSKUghIzY3JDckJCIwW0IjUXAkR1AjISM3JCIwMWBDJypwZipIISM2NyQkIjBaQm5DUEdQIyEjNyQiMHN2KHBNUScqSCEjNjckNyQkIjA9cCgqKWUlR1AjISM3JCIwVVRKXjUlM0khIzY3JCQiMFpCbkNQR1AjISM3JCIwc3YocE1RJypIISM2NyQ3JCQiMD1wKCopZSVHUCMhIzckIjBVVEpeNSUzSSEjNjckJCIwaSc0eWglR1AjISM3JCIwQltDUSZ6M0khIzY3JDckJCIvIj4ielsmR1AjISM2JCIweUhRMV4zLSQhIzY3JCQiMGknNHloJUdQIyEjNyQiMEJbQ1EmejNJISM2NyQ3JCQiLyI+InpbJkdQIyEjNiQiMHlIUTFeMy0kISM2NyQkIjBhbHA5YkdQIyEjNyQiME8jKls8MjctJCEjNjckNyQkIi9pQTFSJ0dQIyEjNiQiMDk9WGgiSExJISM2NyQkIjBhbHA5YkdQIyEjNyQiME8jKls8MjctJCEjNjckNyQkIi9pQTFSJ0dQIyEjNiQiMDk9WGgiSExJISM2NyQkIjAjZk9gVCdHUCMhIzckIi9QKnAlKT1PLiQhIzU3JDckJCIwKj52cEgoR1AjISM3JCIvbD9sQHRYSSEjNTckJCIwI2ZPYFQnR1AjISM3JCIvUCpwJSk9Ty4kISM1NyQ3JCQiMCo+dnBIKEdQIyEjNyQiL2w/bEB0WEkhIzU3JCQiMCd5ImY+dEdQIyEjNyQiMCRvPC4vLllJISM2NyQ3JCQiL3lVcz8pR1AjISM2JCIwJ1sqZXJzImVJISM2NyQkIjAneSJmPnRHUCMhIzckIjAkbzwuLy5ZSSEjNjckNyQkIi95VXM/KUdQIyEjNiQiMCdbKmVycyJlSSEjNjckJCIwI1tKeEEpR1AjISM3JCIwRTBbJD1XZUkhIzY3JDckJCIwJipvOUAiKkdQIyEjNyQiMEEkZW1LaHFJISM2NyQkIjAjW0p4QSlHUCMhIzckIjBFMFskPVdlSSEjNjckNyQkIjAmKm85QCIqR1AjISM3JCIwQSRlbUtocUkhIzY3JCQiMG85W1IiKkdQIyEjNyQiMFtyMTpgMzIkISM2NyQ3JCQiMCNmJ29RK0hQIyEjNyQiMGVycyJRMCQzJCEjNjckJCIwbzlbUiIqR1AjISM3JCIwW3IxOmAzMiQhIzY3JDckJCIwI2Ynb1ErSFAjISM3JCIwZXJzIlEwJDMkISM2NyQkIjBvSSVbMCFIUCMhIzckIjAwTDJOa0szJCEjNjckNyQkIjBuKlIsJzRIUCMhIzckIjAlKmZ6TyVcJjQkISM2NyQkIjBvSSVbMCFIUCMhIzckIjAwTDJOa0szJCEjNjckNyQkIjBuKlIsJzRIUCMhIzckIjAlKmZ6TyVcJjQkISM2NyQkIjBBJikzdTRIUCMhIzckIjB1Z2lVdmM0JCEjNjckNyQkIjBUd0EmKT1IUCMhIzckIi8kWyc9XCR6NSQhIzU3JCQiMEEmKTN1NEhQIyEjNyQiMHVnaVV2YzQkISM2NyQ3JCQiMFR3QSYpPUhQIyEjNyQiLyRbJz1cJHo1JCEjNTckJCIwUU0lcCo9SFAjISM3JCIwdl9nUSczM0ohIzY3JDckJCIwWSsmUiJHSFAjISM3JCIwbU8kcGFQP0ohIzY3JCQiMFFNJXAqPUhQIyEjNyQiMHZfZ1EnMzNKISM2NyQ3JCQiMFgrJlIiR0hQIyEjNyQiMG1PJHBhUD9KISM2NyQkIjAoUi9NI0dIUCMhIzckIjB3PS1CKFw/SiEjNjckNyQkIjBBSmVZUEhQIyEjNyQiMC1EKy07RzgkISM2NyQkIjAoUi9NI0dIUCMhIzckIjB3PS1CKFw/SiEjNjckNyQkIjBBSmVZUEhQIyEjNyQiMC1EKy07RzgkISM2NyQkIjAvJ1tQdiRIUCMhIzckIjBIcSlceiFIOCQhIzY3JDckJCIwJlszRm8lSFAjISM3JCIwUjgyZGNfOSQhIzY3JCQiMC8nW1B2JEhQIyEjNyQiMEhxKVx6IUg4JCEjNjckNyQkIjAmWzNGbyVIUCMhIzckIjBSODJkY185JCEjNjckJCIwLidldm8lSFAjISM3JCIwJ0dSZSY9YDkkISM2NyQ3JCQiMCllV0ZpJkhQIyEjNyQiMHYsOTcocGRKISM2NyQkIjAuJ2V2byVIUCMhIzckIjAnR1JlJj1gOSQhIzY3JDckJCIwKWVXRmkmSFAjISM3JCIwdiw5NyhwZEohIzY3JCQiMDQ8RERjSFAjISM3JCIwXjBDL0h4OiQhIzY3JDckJCIwIjRyaWMnSFAjISM3JCIwNiE0c3c4cUohIzY3JCQiMDQ8RERjSFAjISM3JCIwXjBDL0h4OiQhIzY3JDckJCIwIjRyaWMnSFAjISM3JCIwNiE0c3c4cUohIzY3JCQiMFwmM2tjJ0hQIyEjNyQiMD5iYFRSLDwkISM2NyQ3JCQiMHJmeD9tSFAjISM3JCIwcCZlNE0mMzwkISM2NyQkIjBcJjNrYydIUCMhIzckIjA+YmBUUiw8JCEjNjckNyQkIjByZng/bUhQIyEjNyQiMDNCKkcpKnBccSEjNzckJCIwJCk+eSIzZHRCISM3JCIwM0IqRykqcFxxISM3NyQ3JCQiMCk+ZGRnJW9QIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJCk+eSIzZHRCISM3JCIwM0IqRykqcFxxISM3NyQ3JCQiMHJmeD9tSFAjISM3JCIwcCZlNE0mMzwkISM2NyQkIjAlPjBAXihIUCMhIzckIi8jUUZrXEQ9JCEjNTckNyQkIjBsXj85dkhQIyEjNyQiMFp5RkF5RD0kISM2NyQkIjAlPjBAXihIUCMhIzckIi8jUUZrXEQ9JCEjNTckNyQkIjBsXj85dkhQIyEjNyQiMFp5RkF5RD0kISM2NyQkIjA0SGZoJSlIUCMhIzckIjBXaSZbKGZcPiQhIzY3JDckJCIwTClbZlkpSFAjISM3JCIwJG9ZdCg9XT4kISM2NyQkIjA0SGZoJSlIUCMhIzckIjBXaSZbKGZcPiQhIzY3JDckJCIwTClbZlkpSFAjISM3JCIwJG9ZdCg9XT4kISM2NyQkIjBNT285JSpIUCMhIzckIjAneSYpUShwdD8kISM2NyQ3JCQiMDI7S0AlKkhQIyEjNyQiMD5iVEtmdT8kISM2NyQkIjBNT285JSpIUCMhIzckIjAneSYpUShwdD8kISM2NyQ3JCQiMDI7S0AlKkhQIyEjNyQiMD5iVEtmdT8kISM2NyQkIjAlb3Y4UCt0QiEjNyQiMGJ5T2h6KD5LISM2NyQ3JCQiMC5SSyFRK3RCISM3JCIwYlZbKCkqKik+SyEjNjckJCIwJW92OFArdEIhIzckIjBieU9oeig+SyEjNjckNyQkIjAuUkshUSt0QiEjNyQiMGJWWygpKiopPkshIzY3JCQiMD4ocDtMLHRCISM3JCIwTi5JUCo9S0shIzY3JDckJCIvNmFITSx0QiEjNiQiMCI+YEQvTUtLISM2NyQkIjA+KHA7TCx0QiEjNyQiME4uSVAqPUtLISM2NyQ3JCQiLzZhSE0sdEIhIzYkIjAiPmBEL01LSyEjNjckJCIwMT1xJkgtdEIhIzckIjBIcEMsKmZXSyEjNjckNyQkIjAqeV4kNEJJUCMhIzckIjBGP2koNHlXSyEjNjckJCIwMT1xJkgtdEIhIzckIjBIcEMsKmZXSyEjNjckNyQkIjAqeV4kNEJJUCMhIzckIjBGP2koNHlXSyEjNjckJCIwbldMaktJUCMhIzckIjBoJVtPJjNxRCQhIzY3JDckJCIwcmFQektJUCMhIzckIjBqM3BfQHNEJCEjNjckJCIwbldMaktJUCMhIzckIjBoJVtPJjNxRCQhIzY3JDckJCIwcmFQektJUCMhIzckIjBqM3BfQHNEJCEjNjckJCIvJ1xjTVVJUCMhIzYkIjA5UF4lelRwSyEjNjckNyQkIjB5cC1gVUlQIyEjNyQiMCpwZng/bXBLISM2NyQkIi8nXGNNVUlQIyEjNiQiMDlQXiV6VHBLISM2NyQ3JCQiMHlwLWBVSVAjISM3JCIwKnBmeD9tcEshIzY3JCQiMF9gUjRfSVAjISM3JCIwb2ckUXMjPUckISM2NyQ3JCQiMDdMSUlfSVAjISM3JCIwTiZHR0U1I0ckISM2NyQkIjBfYFI0X0lQIyEjNyQiMG9nJFFzIz1HJCEjNjckNyQkIjA3TElJX0lQIyEjNyQiME4mR0dFNSNHJCEjNjckJCIwbyllej0xdEIhIzckIi9NKT1UT1VIJCEjNTckNyQkIjBAME02aUlQIyEjNyQiMHJ0KnlKYSVIJCEjNjckJCIwbyllej0xdEIhIzckIi9NKT1UT1VIJCEjNTckNyQkIjBAME02aUlQIyEjNyQiMHJ0KnlKYSVIJCEjNjckJCIwI3ohKSpwcklQIyEjNyQiMCZSXnVhazFMISM2NyQ3JCQiLztuZT4ydEIhIzYkIjAyaSdIUClwSSQhIzY3JCQiMCN6ISkqcHJJUCMhIzckIjAmUl51YWsxTCEjNjckNyQkIi87bmU+MnRCISM2JCIwMmknSFApcEkkISM2NyQkIjAtc3RiIjN0QiEjNyQiLHVUYSE+TCEiKDckNyQkIjB3RjolPTN0QiEjNyQiMFZdLkdDJT5MISM2NyQkIjAtc3RiIjN0QiEjNyQiLHVUYSE+TCEiKDckNyQkIjB3RjolPTN0QiEjNyQiMFZdLkdDJT5MISM2NyQkIjBhcDNYIjR0QiEjNyQiMEduXUNqOUwkISM2NyQ3JCQiMCUqUjF3IjR0QiEjNyQiMHpRNSRbJz1MJCEjNjckJCIwYXAzWCI0dEIhIzckIjBHbl1DajlMJCEjNjckNyQkIjAlKlIxdyI0dEIhIzckIjB6UTUkWyc9TCQhIzY3JCQiMCcqUS5RLEpQIyEjNyQiL0NSZD4oUU0kISM1NyQ3JCQiMGBnZnIsSlAjISM3JCIwOkY8UTBWTSQhIzY3JCQiMCcqUS5RLEpQIyEjNyQiL0NSZD4oUU0kISM1NyQ3JCQiMGBnZnIsSlAjISM3JCIwOkY8UTBWTSQhIzY3JCQiMEghUVc4NnRCISM3JCIwT2spZTBHY0whIzY3JDckJCIwJCpHaHE2SlAjISM3JCIwXjpDJGZ1Y0whIzY3JCQiMEghUVc4NnRCISM3JCIwT2spZTBHY0whIzY3JDckJCIwJCpHaHE2SlAjISM3JCIwXjpDJGZ1Y0whIzY3JCQiMDkkb1g4N3RCISM3JCIwMGYzLypvb0whIzY3JDckJCIwO1VRdEBKUCMhIzckIjAoUTUkWyc9cEwhIzY3JCQiMDkkb1g4N3RCISM3JCIwMGYzLypvb0whIzY3JDckJCIwO1VRdEBKUCMhIzckIjAoUTUkWyc9cEwhIzY3JCQiMFkmKUdRSkpQIyEjNyQiMCZRdTJ1NCJRJCEjNjckNyQkIjApZXQoekpKUCMhIzckIjBCI3pMcWkiUSQhIzY3JCQiMFkmKUdRSkpQIyEjNyQiMCZRdTJ1NCJRJCEjNjckNyQkIjApZXQoekpKUCMhIzckIjBCI3pMcWkiUSQhIzY3JCQiMDtTWVhUSlAjISM3JCIwNlFRbTBOUiQhIzY3JDckJCIwd2drKj05dEIhIzckIjBmIVslZW5TUiQhIzY3JCQiMDtTWVhUSlAjISM3JCIwNlFRbTBOUiQhIzY3JDckJCIwd2drKj05dEIhIzckIjBmIVslZW5TUiQhIzY3JCQiME8iR2k6OnRCISM3JCIwMWtbIVEiZlMkISM2NyQ3JCQiL0JVSj86dEIhIzYkIjAmKm9eODNsUyQhIzY3JCQiME8iR2k6OnRCISM3JCIwMWtbIVEiZlMkISM2NyQ3JCQiL0JVSj86dEIhIzYkIjAmKm9eODNsUyQhIzY3JCQiMGopPjI8O3RCISM3JCIwM21qIz1LPU0hIzY3JDckJCIwJFEpUT9pSlAjISM3JCIwSmRlb1sqPU0hIzY3JCQiMGopPjI8O3RCISM3JCIwM21qIz1LPU0hIzY3JDckJCIwJFEpUT9pSlAjISM3JCIwSmRlb1sqPU0hIzY3JCQiMENjbSk9PHRCISM3JCIwPDtydEgyViQhIzY3JDckJCIwI0c0NkM8dEIhIzckIjBuWGxCKlFKTSEjNjckJCIwQ2NtKT08dEIhIzckIjA8O3J0SDJWJCEjNjckNyQkIjAjRzQ2Qzx0QiEjNyQiMG5YbEIqUUpNISM2NyQkIjBgeDA1Iz10QiEjNyQiMDZndGBQSlckISM2NyQ3JCQiMCVwPmBFPXRCISM3JCIwL01zeUhRVyQhIzY3JCQiMGB4MDUjPXRCISM3JCIwNmd0YFBKVyQhIzY3JDckJCIwJXA+YEU9dEIhIzckIjAvTXN5SFFXJCEjNjckJCIwYV48TiM+dEIhIzckIjAvYiI9X2FiTSEjNjckNyQkIjBkcEYkSD50QiEjNyQiL0MjekxxaVgkISM1NyQkIjBhXjxOIz50QiEjNyQiMC9iIj1fYWJNISM2NyQ3JCQiMGRwRiRIPnRCISM3JCIvQyN6THFpWCQhIzU3JCQiMFdhdWotS1AjISM3JCIwd00jKXlfelkkISM2NyQ3JCQiMCgqcHFDLktQIyEjNyQiMHc1JykpM3JvTSEjNjckJCIwV2F1ai1LUCMhIzckIjB3TSMpeV96WSQhIzY3JDckJCIwKCpwcUMuS1AjISM3JCIwdzUnKSkzcm9NISM2NyQkIjB4MyplSEB0QiEjNyQiMEF6T0NnLlskISM2NyQ3JCQiLzplKGY4S1AjISM2JCIwNypIUjk6IlskISM2NyQkIjB4MyplSEB0QiEjNyQiMEF6T0NnLlskISM2NyQ3JCQiLzplKGY4S1AjISM2JCIwNypIUjk6IlskISM2NyQkIjBteWlKQktQIyEjNyQiL0EnUmVuRlwkISM1NyQ3JCQiMHo+VClSQXRCISM3JCIwWygpKiopPmYkXCQhIzY3JCQiMG15aUpCS1AjISM3JCIvQSdSZW5GXCQhIzU3JDckJCIwej5UKVJBdEIhIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwJilwITNQQnRCISM3JCIwJFwoUSJbPDBOISM2NyQ3JCQiMCJlWDBXQnRCISM3JCIwJWVuU0QuMU4hIzY3JCQiMCYpcCEzUEJ0QiEjNyQiMCRcKFEiWzwwTiEjNjckNyQkIjAiZVgwV0J0QiEjNyQiMCVlblNELjFOISM2NyQkIjAkR1BNVEN0QiEjNyQiL3Q3TD5lPE4hIzU3JDckJCIuI2ZoW0N0QiEjNSQiL1VPIjR0JT1OISM1NyQkIjAkR1BNVEN0QiEjNyQiL3Q3TD5lPE4hIzU3JDckJCIuI2ZoW0N0QiEjNSQiL1VPIjR0JT1OISM1NyQkIjBYeXhmYUtQIyEjNyQiMCI9VEwqKSkqSE4hIzY3JDckJCIwW0VeTmJLUCMhIzckIjBjXz9rODRgJCEjNjckJCIwWHl4ZmFLUCMhIzckIjAiPVRMKikpKkhOISM2NyQ3JCQiMFtFXk5iS1AjISM3JCIwY18/azg0YCQhIzY3JCQiMFkkbyY0bEtQIyEjNyQiMHN2SSNlUlVOISM2NyQ3JCQiMGxdTSllRXRCISM3JCIwIzR1Iz5hTGEkISM2NyQkIjBZJG8mNGxLUCMhIzckIjBzdkkjZVJVTiEjNjckNyQkIjBsXU0pZUV0QiEjNyQiMCM0dSM+YUxhJCEjNjckJCIwXiozR2NGdEIhIzckIjB0OEBnLVtiJCEjNjckNyQkIjAvYmtXd0tQIyEjNyQiMEdITXUlemJOISM2NyQkIjBeKjNHY0Z0QiEjNyQiMHQ4QGctW2IkISM2NyQ3JCQiMC9ia1d3S1AjISM3JCIwR0hNdSV6Yk4hIzY3JCQiMCplOyc+J0d0QiEjNyQiMF93bkU0c2MkISM2NyQ3JCQiMCJHYFhxR3RCISM3JCIwazxUSE4jb04hIzY3JCQiMCplOyc+J0d0QiEjNyQiMF93bkU0c2MkISM2NyQ3JCQiMCJHYFhxR3RCISM3JCIwazxUSE4jb04hIzY3JCQiME1KKCl6J0h0QiEjNyQiLz0mMyNlaHpOISM1NyQ3JCQiL0dSendIdEIhIzYkIi4xWyVlbiFlJCEiKjckJCIwTUooKXonSHRCISM3JCIvPSYzI2Voek4hIzU3JDckJCIvR1J6d0h0QiEjNiQiLjFbJWVuIWUkISIqNyQkIjBtKHlOdUl0QiEjNyQiMHhMVkVBP2YkISM2NyQ3JCQiMD45ek0zTFAjISM3JCIwTyVcJlI7SmYkISM2NyQkIjBtKHlOdUl0QiEjNyQiMHhMVkVBP2YkISM2NyQ3JCQiMD45ek0zTFAjISM3JCIwTyVcJlI7SmYkISM2NyQkIjApNFszIj1MUCMhIzckIjBVWk5mR1dnJCEjNjckNyQkIjAlKSpbXyE+TFAjISM3JCIwcyM9WXBiME8hIzY3JCQiMCk0WzMiPUxQIyEjNyQiMFVaTmZHV2ckISM2NyQ3JCQiMCUpKltfIT5MUCMhIzckIjBzIz1ZcGIwTyEjNjckJCIwVj9wIilHTFAjISM3JCIwJUc5M1skb2gkISM2NyQ3JCQiMG41SnpITFAjISM3JCIwM3JvXCgqemgkISM2NyQkIjBWP3AiKUdMUCMhIzckIjAlRzkzWyRvaCQhIzY3JDckJCIwbjVKekhMUCMhIzckIjAzcm9cKCp6aCQhIzY3JCQiMCUpcCZlJlJMUCMhIzckIjA3X2kiNENITyEjNjckNyQkIjA9K3JjU0xQIyEjNyQiMFdmdi9RL2okISM2NyQkIjAlKXAmZSZSTFAjISM3JCIwN19pIjRDSE8hIzY3JDckJCIwPStyY1NMUCMhIzckIjBXZnYvUS9qJCEjNjckJCIwLUJlTF1MUCMhIzckIjBsKj41cGtUTyEjNjckNyQkIjAsRHJQXkxQIyEjNyQiL3lDKWZ5R2skISM1NyQkIjAtQmVMXUxQIyEjNyQiMGwqPjVwa1RPISM2NyQ3JCQiMCxEclBeTFAjISM3JCIveUMpZnlHayQhIzU3JCQiMGkrKVs2T3RCISM3JCIwYClmKnlfU2wkISM2NyQ3JCQiMDhMSUFpTFAjISM3JCIwO08qWyI+YGwkISM2NyQkIjBpKylbNk90QiEjNyQiMGApZip5X1NsJCEjNjckNyQkIjA4TElBaUxQIyEjNyQiMDtPKlsiPmBsJCEjNjckJCIwW1dbKj5QdEIhIzckIjAyc0hjZWttJCEjNjckNyQkIjBuJkgtSlB0QiEjNyQiMF9DJypwZnhtJCEjNjckJCIwW1dbKj5QdEIhIzckIjAyc0hjZWttJCEjNjckNyQkIjBuJkgtSlB0QiEjNyQiMF9DJypwZnhtJCEjNjckJCIwOl5rKEdRdEIhIzckIjA7OkJBayl5TyEjNjckNyQkIjAmcGM8U1F0QiEjNyQiMClHSl0tPyFvJCEjNjckJCIwOl5rKEdRdEIhIzckIjA7OkJBayl5TyEjNjckNyQkIjAmcGM8U1F0QiEjNyQiMClHSl0tPyFvJCEjNjckJCIwKnBFInokUnRCISM3JCIwbXVeeHA3cCQhIzY3JDckJCIwL1lqJ1xSdEIhIzckIjBDLDUhM2sjcCQhIzY3JCQiMCpwRSJ6JFJ0QiEjNyQiMG11XnhwN3AkISM2NyQ3JCQiMC9ZaidcUnRCISM3JCIwQyw1ITNrI3AkISM2NyQkIjBBJXlUWlN0QiEjNyQiLyVmTkB2T3EkISM1NyQ3JCQiMFB0NCZmU3RCISM3JCIvJypvXjgzMFAhIzU3JCQiMEEleVRaU3RCISM3JCIvJWZOQHZPcSQhIzU3JDckJCIwUHQ0JmZTdEIhIzckIi8nKm9eODMwUCEjNTckJCIvamZFZFR0QiEjNiQiME56PmEhMztQISM2NyQ3JCQiMEwhPnFwVHRCISM3JCIwJ3pQLT5fPFAhIzY3JCQiL2pmRWRUdEIhIzYkIjBOej5hITM7UCEjNjckNyQkIjBMIT5xcFR0QiEjNyQiMCd6UC0+XzxQISM2NyQkIjB3JHBYblV0QiEjNyQiMCpbWWdkW0dQISM2NyQ3JCQiMEcpKVItR01QIyEjNyQiMEttSVhpKkhQISM2NyQkIjB3JHBYblV0QiEjNyQiMCpbWWdkW0dQISM2NyQ3JCQiMEcpKVItR01QIyEjNyQiMEttSVhpKkhQISM2NyQkIjB6JEgreVZ0QiEjNyQiMDw4XiczKjN1JCEjNjckNyQkIjAjKmVQNlJNUCMhIzckIjBwYVArLkN1JCEjNjckJCIweiRIK3lWdEIhIzckIjA8OF4nMyozdSQhIzY3JDckJCIwIyplUDZSTVAjISM3JCIwcGFQKy5DdSQhIzY3JCQiMDwuIikpKVtNUCMhIzckIjBDeEsnZUhgUCEjNjckNyQkIjBobm9CXU1QIyEjNyQiMDBWV2JWW3YkISM2NyQkIjA8LiIpKSlbTVAjISM3JCIwQ3hLJ2VIYFAhIzY3JDckJCIwaG5vQl1NUCMhIzckIjAwVldiVlt2JCEjNjckJCIwWngsLGdNUCMhIzckIjBfczp2K2R3JCEjNjckNyQkIi8mUlhSaE1QIyEjNiQiMFRKXjUlR25QISM2NyQkIjBaeCwsZ01QIyEjNyQiMF9zOnYrZHckISM2NyQ3JCQiLyZSWFJoTVAjISM2JCIwVEpeNSVHblAhIzY3JCQiMEUybDtyTVAjISM3JCIwQ0grYDAieVAhIzY3JDckJCIwLm1uZXNNUCMhIzckIjB4PmVsQyh6UCEjNjckJCIwRTJsO3JNUCMhIzckIjBDSCtgMCJ5UCEjNjckNyQkIjAubW5lc01QIyEjNyQiMHg+ZWxDKHpQISM2NyQkIi9KM2RCW3RCISM2JCIwangnKT41MHokISM2NyQ3JCQiMFBEUCJRW3RCISM3JCIwODNsP2xAeiQhIzY3JCQiL0ozZEJbdEIhIzYkIjBqeCcpPjUweiQhIzY3JDckJCIwUERQIlFbdEIhIzckIjA4M2w/bEB6JCEjNjckJCIvYDMjZSRcdEIhIzYkIi8nUnB2OUghUSEjNTckNyQkIjBeUl0yJlx0QiEjNyQiMFwnPmRkZy9RISM2NyQkIi9gMyNlJFx0QiEjNiQiLydScHY5SCFRISM1NyQ3JCQiMF5SXTImXHRCISM3JCIwXCc+ZGRnL1EhIzY3JCQiMC1INiVbXXRCISM3JCIwMVxnPz5gIlEhIzY3JDckJCIwWXg1UDFOUCMhIzckIjAmWyl5SVlxIlEhIzY3JCQiMC1INiVbXXRCISM3JCIwMVxnPz5gIlEhIzY3JDckJCIwWXg1UDFOUCMhIzckIjAmWyl5SVlxIlEhIzY3JCQiME0pZU1oXnRCISM3JCIwZDFbYUJ4I1EhIzY3JDckJCIwJ1JrLHhedEIhIzckIjBAdCZlb1tIUSEjNjckJCIwTSllTWhedEIhIzckIjBkMVthQngjUSEjNjckNyQkIjAnUmsseF50QiEjNyQiMEB0JmVvW0hRISM2NyQkIjBrcTVZRk5QIyEjNyQiMFx4d3hGLCVRISM2NyQ3JCQiMDdNYjFITlAjISM3JCIwZGgjNHUjPiVRISM2NyQkIjBrcTVZRk5QIyEjNyQiMFx4d3hGLCVRISM2NyQ3JCQiMDdNYjFITlAjISM3JCIwZGgjNHUjPiVRISM2NyQkIjBYbzwjKVFOUCMhIzckIjAuUTMhPmBfUSEjNjckNyQkIjBBV1JZU05QIyEjNyQiMCQqXCpmek9hUSEjNjckJCIwWG88IylRTlAjISM3JCIwLlEzIT5gX1EhIzY3JDckJCIwQVdSWVNOUCMhIzckIjAkKlwqZnpPYVEhIzY3JCQiMFdzbUBdTlAjISM3JCIwNj1WImYkXCdRISM2NyQ3JCQiMGJhbSo9YnRCISM3JCIwSFExXjNvJ1EhIzY3JCQiMFdzbUBdTlAjISM3JCIwNj1WImYkXCdRISM2NyQ3JCQiMGJhbSo9YnRCISM3JCIwSFExXjNvJ1EhIzY3JCQiMD1mYmtoTlAjISM3JCIwOU0pPSlSdChRISM2NyQ3JCQiMCZcMmtMY3RCISM3JCIwbEU4MVwjelEhIzY3JCQiMD1mYmtoTlAjISM3JCIwOU0pPSlSdChRISM2NyQ3JCQiMCZcMmtMY3RCISM3JCIwbEU4MVwjelEhIzY3JCQiMFVWKTNKZHRCISM3JCIwRWNJaFYoKilRISM2NyQ3JCQiMCUpKilmJ1tkdEIhIzckIjAsOj9oKm8iKlEhIzY3JCQiMFVWKTNKZHRCISM3JCIwRWNJaFYoKilRISM2NyQ3JCQiMCUpKilmJ1tkdEIhIzckIjAsOj9oKm8iKlEhIzY3JCQiL004MFlldEIhIzYkIi9yVyx0OS1SISM1NyQ3JCQiMCc+KjRTJ2V0QiEjNyQiMFAuRjtJVCFSISM2NyQkIi9NODBZZXRCISM2JCIvclcsdDktUiEjNTckNyQkIjAnPio0UydldEIhIzckIjBQLkY7SVQhUiEjNjckJCIwSHVgOCdmdEIhIzckIjAnZig0KTNiOVIhIzY3JDckJCIwaCpwcXpmdEIhIzckIjB0IlI4MmQ7UiEjNjckJCIwSHVgOCdmdEIhIzckIjAnZig0KTNiOVIhIzY3JDckJCIwaCpwcXpmdEIhIzckIjB0IlI4MmQ7UiEjNjckJCIwaFQpKXAyT1AjISM3JCIwKWUnUk5hcCNSISM2NyQ3JCQiME4nW3QmNE9QIyEjNyQiMDQhM2s3LEhSISM2NyQkIjBoVCkpcDJPUCMhIzckIjApZSdSTmFwI1IhIzY3JDckJCIwTidbdCY0T1AjISM3JCIwNCEzazcsSFIhIzY3JCQiMGBUaUg+T1AjISM3JCIwYl8iPXhOUlIhIzY3JDckJCIwYVUyQEBPUCMhIzckIjBYb1oiPVhUUiEjNjckJCIwYFRpSD5PUCMhIzckIjBiXyI9eE5SUiEjNjckNyQkIjBhVTJAQE9QIyEjNyQiMFhvWiI9WFRSISM2NyQkIjAkZWpFNGp0QiEjNyQiME1XbCg0d15SISM2NyQ3JCQiMHAsOClHanRCISM3JCIwIm9YbEIqUSZSISM2NyQkIjAkZWpFNGp0QiEjNyQiME1XbCg0d15SISM2NyQ3JCQiMHAsOClHanRCISM3JCIwIm9YbEIqUSZSISM2NyQkIi8jejZmVU9QIyEjNiQiLylRYTdrVCdSISM1NyQ3JCQiMDRBamVXT1AjISM3JCIwPFhoIkhMbVIhIzY3JCQiLyN6NmZVT1AjISM2JCIvKVFhN2tUJ1IhIzU3JDckJCIwNEFqZVdPUCMhIzckIjA8WGgiSExtUiEjNjckJCIvQycpKkdhT1AjISM2JCIwYmxbO25sKFIhIzY3JDckJCIwbFliS2NPUCMhIzckIjBgTG9ZdCh5UiEjNjckJCIvQycpKkdhT1AjISM2JCIwYmxbO25sKFIhIzY3JDckJCIwbFliS2NPUCMhIzckIjBgTG9ZdCh5UiEjNjckJCIwTCNHQGdtdEIhIzckIjBjQiQqNHEqKSlSISM2NyQ3JCQiMDlpISk0b09QIyEjNyQiMCo9XzxTQCIqUiEjNjckJCIwTCNHQGdtdEIhIzckIjBjQiQqNHEqKSlSISM2NyQ3JCQiMDlpISk0b09QIyEjNyQiMCo9XzxTQCIqUiEjNjckJCIwdiZvJnl4T1AjISM3JCIwaEAhR0hQLFMhIzY3JDckJCIvSyhRISp6T1AjISM2JCIwRDUjb1hsLlMhIzY3JCQiMHYmbyZ5eE9QIyEjNyQiMGhAIUdIUCxTISM2NyQ3JCQiL0soUSEqek9QIyEjNiQiMEQ1I29YbC5TISM2NyQkIjBCNVVlKm90QiEjNyQiMDc3dGt2UCwlISM2NyQ3JCQiMGBmUXUicHRCISM3JCIwaCkqKT1eNDtTISM2NyQkIjBCNVVlKm90QiEjNyQiMDc3dGt2UCwlISM2NyQ3JCQiMGBmUXUicHRCISM3JCIwaCkqKT1eNDtTISM2NyQkIjBfI2U7OXF0QiEjNyQiMENyIWUjeWgtJSEjNjckNyQkIjBubCM9T3F0QiEjNyQiMClwZXBjYEdTISM2NyQkIjBfI2U7OXF0QiEjNyQiMENyIWUjeWgtJSEjNjckNyQkIjBubCM9T3F0QiEjNyQiMClwZXBjYEdTISM2NyQkIi8qKXohRzhQUCMhIzYkIjApUXNtMmVRUyEjNjckNyQkIjAneiNbXzpQUCMhIzckIjBNdi1BdzQvJSEjNjckJCIvKil6IUc4UFAjISM2JCIwKVFzbTJlUVMhIzY3JDckJCIwJ3ojW186UFAjISM3JCIwTXYtQXc0LyUhIzY3JCQiMHc8Inpec3RCISM3JCIwYUdnOyQpNDAlISM2NyQ3JCQiMHJPYllGUFAjISM3JCIvUCc0eDtNMCUhIzU3JCQiMHc8Inpec3RCISM3JCIwYUdnOyQpNDAlISM2NyQ3JCQiMHJPYllGUFAjISM3JCIvUCc0eDtNMCUhIzU3JCQiMCVvODVydHRCISM3JCIwXiJbZ2FRalMhIzY3JDckJCIwUEkmUiVSUFAjISM3JCIwMV87S2RlMSUhIzY3JCQiMCVvODVydHRCISM3JCIwXiJbZ2FRalMhIzY3JDckJCIwUEkmUiVSUFAjISM3JCIwMV87S2RlMSUhIzY3JCQiMFBTXzJcUFAjISM3JCIwUFdjayh5dlMhIzY3JDckJCIwX1h3V15QUCMhIzckIjBVU0IoeUh5UyEjNjckJCIwUFNfMlxQUCMhIzckIjBQV2NrKHl2UyEjNjckNyQkIjBfWHdXXlBQIyEjNyQiMFVTQih5SHlTISM2NyQkIjBNRUkyaFBQIyEjNyQiMGI3Z3MqPSkzJSEjNjckNyQkIjAkNHYpW2pQUCMhIzckIjB5R0lVUTI0JSEjNjckJCIwTUVJMmhQUCMhIzckIjBiN2dzKj0pMyUhIzY3JDckJCIwJDR2KVtqUFAjISM3JCIweUdJVVEyNCUhIzY3JCQiMClmWy5KeHRCISM3JCIwPTk7cSJmK1QhIzY3JDckJCIwLUlKY3ZQUCMhIzckIjA5PFAoKnlKNSUhIzY3JCQiMClmWy5KeHRCISM3JCIwPTk7cSJmK1QhIzY3JDckJCIwLUlKY3ZQUCMhIzckIjA5PFAoKnlKNSUhIzY3JCQiL1ghcDsmeXRCISM2JCIwek06ZCQqSDYlISM2NyQ3JCQiMCR5eXF3eXRCISM3JCIvYlNDJj5jNiUhIzU3JCQiL1ghcDsmeXRCISM2JCIwek06ZCQqSDYlISM2NyQ3JCQiMCR5eXF3eXRCISM3JCIvYlNDJj5jNiUhIzU3JCQiMDInR2pzenRCISM3JCIwJTR3TmBSRFQhIzY3JDckJCIwT0g5IikqenRCISM3JCIwJ1E0disxR1QhIzY3JCQiMDInR2pzenRCISM3JCIwJTR3TmBSRFQhIzY3JDckJCIwT0g5IikqenRCISM3JCIwJ1E0disxR1QhIzY3JCQiMDlBTVI0UVAjISM3JCIwJ1x2IipwelBUISM2NyQ3JCQiMCkpUWgpPiJRUCMhIzckIjBBI3lEMV1TVCEjNjckJCIwOUFNUjRRUCMhIzckIjAnXHYiKnB6UFQhIzY3JDckJCIwKSlRaCk+IlFQIyEjNyQiMEEjeUQxXVNUISM2NyQkIi03YjojUVAjISIqJCIwZVpsYSk+XVQhIzY3JDckJCIwaj5GPkNRUCMhIzckIjBlcWs8VEg6JSEjNjckJCItN2I6I1FQIyEiKiQiMGVabGEpPl1UISM2NyQ3JCQiMGo+Rj5DUVAjISM3JCIwZXFrPFRIOiUhIzY3JCQiMC9ZMHZMUVAjISM3JCIwViM+JCoqKmZpVCEjNjckNyQkIi9vbExrJFFQIyEjNiQiMCUqZXJzIlFsVCEjNjckJCIwL1kwdkxRUCMhIzckIjBWIz4kKioqZmlUISM2NyQ3JCQiL29sTGskUVAjISM2JCIwJSplcnMiUWxUISM2NyQkIjBWPCp5ZiVRUCMhIzckIjBtKj5NOCt2VCEjNjckNyQkIjAkZWEyKFtRUCMhIzckIi90JXlGQXk8JSEjNTckJCIwVjwqeWYlUVAjISM3JCIwbSo+TTgrdlQhIzY3JDckJCIwJGVhMihbUVAjISM3JCIvdCV5RkF5PCUhIzU3JCQiMG5ZKVEjZVFQIyEjNyQiMDc9U2QtdT0lISM2NyQ3JCQiMGovTCxoUVAjISM3JCIwbU4mR0dFIT4lISM2NyQkIjBuWSlRI2VRUCMhIzckIjA3PVNkLXU9JSEjNjckNyQkIjBqL0wsaFFQIyEjNyQiMG1OJkdHRSE+JSEjNjckJCIwTXRDYHFRUCMhIzckIjBVKHkwUCEpKj4lISM2NyQ3JCQiMGsvTU50UVAjISM3JCIwLUMjekxxLVUhIzY3JCQiME10Q2BxUVAjISM3JCIwVSh5MFAhKSo+JSEjNjckNyQkIjBrL01OdFFQIyEjNyQiMC1DI3pMcS1VISM2NyQkIjA9VCFmRylRUCMhIzckIjBWSz50L0FAJSEjNjckNyQkIjAmMzZFZClRUCMhIzckIjBRNypIUjk6VSEjNjckJCIwPVQhZkcpUVAjISM3JCIwVks+dC9BQCUhIzY3JDckJCIwJjM2RWQpUVAjISM3JCIwUTcqSFI5OlUhIzY3JCQiMDFJb0AmKlFQIyEjNyQiMHNvemwwWUElISM2NyQ3JCQiMDI3NTgpKlFQIyEjNyQiMHUrMVslZUZVISM2NyQkIjAxSW9AJipRUCMhIzckIjBzb3psMFlBJSEjNjckNyQkIjAyNzU4KSpRUCMhIzckIjB1KzFbJWVGVSEjNjckJCIwWjknM3chUlAjISM3JCIwKCoqKlxaMXFCJSEjNjckNyQkIjB2KiopcDAiUlAjISM3JCIvIipHSl0tU1UhIzU3JCQiMFo5JzN3IVJQIyEjNyQiMCgqKipcWjFxQiUhIzY3JDckJCIwdioqKXAwIlJQIyEjNyQiLyIqR0pdLVNVISM1NyQkIjAjXCU+Lj9SUCMhIzckIjBQISkzPjIlXFUhIzY3JDckJCIwWVwxL0JSUCMhIzckIjBZeD5lbENEJSEjNjckJCIwI1wlPi4/UlAjISM3JCIwUCEpMz4yJVxVISM2NyQ3JCQiMFlcMS9CUlAjISM3JCIwWXg+ZWxDRCUhIzY3JCQiMCJlIiopW0tSUCMhIzckIjBLJSopKXoyPUUlISM2NyQ3JCQiMCQzT1hiJFJQIyEjNyQiMCNlbUtoIVxFJSEjNjckJCIwImUiKilbS1JQIyEjNyQiMEslKikpejI9RSUhIzY3JDckJCIwJDNPWGIkUlAjISM3JCIwI2VtS2ghXEUlISM2NyQkIjBrQ3UoXCVSUCMhIzckIjBUJHkwJDNVRiUhIzY3JDckJCIwc0Y+M1tSUCMhIzckIjA9YUxvWXRGJSEjNjckJCIwa0N1KFwlUlAjISM3JCIwVCR5MCQzVUYlISM2NyQ3JCQiMHNGPjNbUlAjISM3JCIwPWFMb1l0RiUhIzY3JCQiMDA3JilcZFJQIyEjNyQiMCczQDMoM21HJSEjNjckNyQkIi85dl4xJ1JQIyEjNiQiMGFVU0IoeSpHJSEjNjckJCIwMDcmKVxkUlAjISM3JCIwJzNAMygzbUclISM2NyQ3JCQiLzl2XjEnUlAjISM2JCIwYVVTQih5KkclISM2NyQkIjBPKVxeKyhSUCMhIzckIjAsYyQzITQhKkglISM2NyQ3JCQiMEEhM2BLKFJQIyEjNyQiLzR0JXlGQUklISM1NyQkIjBPKVxeKyhSUCMhIzckIjAsYyQzITQhKkglISM2NyQ3JCQiMEEhM2BLKFJQIyEjNyQiLzR0JXlGQUklISM1NyQkIjBFRXhqIylSUCMhIzckIjBoOD4/NDlKJSEjNjckNyQkIi8uTCkpZSlSUCMhIzYkIjBFPmFMb1lKJSEjNjckJCIwRUV4aiMpUlAjISM3JCIwaDg+PzQ5SiUhIzY3JDckJCIvLkwpKWUpUlAjISM2JCIwRT5hTG9ZSiUhIzY3JCQiMEomW2JfKlJQIyEjNyQiMDdvVkg0UUslISM2NyQ3JCQiME1LYWIpKlJQIyEjNyQiMGoyaCkpM3JLJSEjNjckJCIwSiZbYl8qUlAjISM3JCIwN29WSDRRSyUhIzY3JDckJCIwTUthYikqUlAjISM3JCIwajJoKSkzckslISM2NyQkIjAqeXoweit1QiEjNyQiMEpUQ0c0aUwlISM2NyQ3JCQiMGk2YUQ2U1AjISM3JCIwKmZ6TyVcJlJWISM2NyQkIjAqeXoweit1QiEjNyQiMEpUQ0c0aUwlISM2NyQ3JCQiMGk2YUQ2U1AjISM3JCIwKmZ6TyVcJlJWISM2NyQkIi5Wd2U/U1AjISM1JCIwJ3BTcCI0J1tWISM2NyQ3JCQiL2ZDKClSLXVCISM2JCIwTiVbKCkqKik+TiUhIzY3JCQiLlZ3ZT9TUCMhIzUkIjAncFNwIjQnW1YhIzY3JDckJCIvZkMoKVItdUIhIzYkIjBOJVsoKSoqKT5OJSEjNjckJCIwblRJSUxTUCMhIzckIjB0JXlbKjM1TyUhIzY3JDckJCIwMmhIdk9TUCMhIzckIjBycyJRMFZrViEjNjckJCIwblRJSUxTUCMhIzckIjB0JXlbKjM1TyUhIzY3JDckJCIwMmhIdk9TUCMhIzckIjBycyJRMFZrViEjNjckJCIwJz4nKltnL3VCISM3JCIwVydISSczTVAlISM2NyQ3JCQiMF9JIlwmXFNQIyEjNyQiMDJoKSkzcm9QJSEjNjckJCIwJz4nKltnL3VCISM3JCIwVydISSczTVAlISM2NyQ3JCQiMF9JIlwmXFNQIyEjNyQiMDJoKSkzcm9QJSEjNjckJCIwUkYhRyllU1AjISM3JCIwJSlIYj8zZVElISM2NyQ3JCQiMEVjInpCMXVCISM3JCIwVlwmUjtKKlElISM2NyQkIjBSRiFHKWVTUCMhIzckIjAlKUhiPzNlUSUhIzY3JDckJCIwRWMiekIxdUIhIzckIjBWXCZSO0oqUSUhIzY3JCQiMDk1J1E7MnVCISM3JCIwWy8oenc/KVIlISM2NyQ3JCQiMCNcLVRfMnVCISM3JCIwelAtPl88UyUhIzY3JCQiMDk1J1E7MnVCISM3JCIwWy8oenc/KVIlISM2NyQ3JCQiMCNcLVRfMnVCISM3JCIwelAtPl88UyUhIzY3JCQiMHY6MlslM3VCISM3JCIvRSFHMDIxVCUhIzU3JDckJCIvSHVNIikzdUIhIzYkIjA6RTR1Iz45VyEjNjckJCIwdjoyWyUzdUIhIzckIi9FIUcwMjFUJSEjNTckNyQkIi9IdU0iKTN1QiEjNiQiMDpFNHUjPjlXISM2NyQkIjBETWBOKDR1QiEjNyQiMG9cO0sxSVUlISM2NyQ3JCQiMChISWg1NXVCISM3JCIwXjk7SExtVSUhIzY3JCQiMERNYE4oNHVCISM3JCIwb1w7SzFJVSUhIzY3JDckJCIwKEhJaDU1dUIhIzckIjBeOTtITG1VJSEjNjckJCIwQGRDRTVUUCMhIzckIjAkR0YnWzBhViUhIzY3JDckJCIwMCZHP1M2dUIhIzckIjAoR0lVUTJSVyEjNjckJCIwQGRDRTVUUCMhIzckIjAkR0YnWzBhViUhIzY3JDckJCIwMCZHP1M2dUIhIzckIjAoR0lVUTJSVyEjNjckJCIwJW9vK0s3dUIhIzckIjAjUjpeWCF5VyUhIzY3JDckJCIwdTI2LEZUUCMhIzckIjBCIipIUjk6WCUhIzY3JCQiMCVvbytLN3VCISM3JCIwI1I6XlgheVclISM2NyQ3JCQiMHUyNixGVFAjISM3JCIwQiIqSFI5OlglISM2NyQkIjAoUlZxaDh1QiEjNyQiMG12XF4uLVklISM2NyQ3JCQiMGZ4UC5TVFAjISM3JCIwZnpPJVwmUlklISM2NyQkIjAoUlZxaDh1QiEjNyQiMG12XF4uLVklISM2NyQ3JCQiMGZ4UC5TVFAjISM3JCIwZnpPJVwmUlklISM2NyQkIjAkKnBFPFxUUCMhIzckIjBkQllQLUVaJSEjNjckNyQkIjBBVSkpM2BUUCMhIzckIjAmek8lXCZSd1chIzY3JCQiMCQqcEU8XFRQIyEjNyQiMGRCWVAtRVolISM2NyQ3JCQiMEFVKSkzYFRQIyEjNyQiMCZ6TyVcJlJ3VyEjNjckJCIwTSgqZj9pVFAjISM3JCIwQXlYOCxdWyUhIzY3JDckJCIwVTxgPG1UUCMhIzckIjBKY10vTykpWyUhIzY3JCQiME0oKmY/aVRQIyEjNyQiMEF5WDgsXVslISM2NyQ3JCQiMFU8YDxtVFAjISM3JCIwSmNdL08pKVslISM2NyQkIjA8My9GdlRQIyEjNyQiMFVsW3oqUihcJSEjNjckNyQkIjBBblNIelRQIyEjNyQiMG5XZGZ3N10lISM2NyQkIjA8My9GdlRQIyEjNyQiMFVsW3oqUihcJSEjNjckNyQkIjBBblNIelRQIyEjNyQiMG5XZGZ3N10lISM2NyQkIjBfP3hPKT11QiEjNyQiMFhiJ1wkKXo0WCEjNjckNyQkIjBsJT1YQz51QiEjNyQiMC5Mazk8UF4lISM2NyQkIjBfP3hPKT11QiEjNyQiMFhiJ1wkKXo0WCEjNjckNyQkIjBsJT1YQz51QiEjNyQiMC5Mazk8UF4lISM2NyQkIjBINGhcLFVQIyEjNyQiMFwrWyFvPkFYISM2NyQ3JCQiMCQpKnBGYz91QiEjNyQiMFJAcnBkaF8lISM2NyQkIjBINGhcLFVQIyEjNyQiMFwrWyFvPkFYISM2NyQ3JCQiMCQpKnBGYz91QiEjNyQiMFJAcnBkaF8lISM2NyQkIjBYbWJsOVVQIyEjNyQiMEBFLjsmZk1YISM2NyQ3JCQiMENiPyUpPVVQIyEjNyQiMHY0eUMpZlFYISM2NyQkIjBYbWJsOVVQIyEjNyQiMEBFLjsmZk1YISM2NyQ3JCQiMENiPyUpPVVQIyEjNyQiMHY0eUMpZlFYISM2NyQkIjBQc3UleUF1QiEjNyQiMGIxPVQkKnBhJSEjNjckNyQkIjB4VCgpM0tVUCMhIzckIjA2KVwpelE1YiUhIzY3JCQiMFBzdSV5QXVCISM3JCIwYjE9VCQqcGElISM2NyQ3JCQiMHhUKCkzS1VQIyEjNyQiMDYpXCl6UTViJSEjNjckJCIwV0kvMlRVUCMhIzckIjBuPlBjIlJmWCEjNjckNyQkIjA7anNPWFVQIyEjNyQiMFonPVwkek1jJSEjNjckJCIwV0kvMlRVUCMhIzckIjBuPlBjIlJmWCEjNjckNyQkIjA7anNPWFVQIyEjNyQiMFonPVwkek1jJSEjNjckJCIwYCQqW0thVVAjISM3JCIwXDhZaCp5clghIzY3JDckJCIwUWlybmVVUCMhIzckIjAkWygpKiopPmZkJSEjNjckJCIwYCQqW0thVVAjISM3JCIwXDhZaCp5clghIzY3JDckJCIwUWlybmVVUCMhIzckIjAkWygpKiopPmZkJSEjNjckJCIvQVM1d0V1QiEjNiQiMDloZmMoPSVlJSEjNjckNyQkIjA8SyU9P0Z1QiEjNyQiMD5qMFhnJCllJSEjNjckJCIvQVM1d0V1QiEjNiQiMDloZmMoPSVlJSEjNjckNyQkIjA8SyU9P0Z1QiEjNyQiMD5qMFhnJCllJSEjNjckJCIvJltwIzRHdUIhIzYkIjA6KXk8YWUnZiUhIzY3JDckJCIwdVE6UiZHdUIhIzckIjBiXjcrLDNnJSEjNjckJCIvJltwIzRHdUIhIzYkIjA6KXk8YWUnZiUhIzY3JDckJCIwdVE6UiZHdUIhIzckIjBiXjcrLDNnJSEjNjckJCIwQjdmRiVIdUIhIzckIjBDcWM7JCkqM1khIzY3JDckJCIwN0RweilIdUIhIzckIjAiKlI+YlRLaCUhIzY3JCQiMEI3ZkYlSHVCISM3JCIwQ3FjOyQpKjNZISM2NyQ3JCQiMDdEcHopSHVCISM3JCIwIipSPmJUS2glISM2NyQkIjBiKilcbDJWUCMhIzckIjBhJSpwIjNRQFkhIzY3JDckJCIwdV1GQjdWUCMhIzckIjBHR0U1I29EWSEjNjckJCIwYiopXGwyVlAjISM3JCIwYSUqcCIzUUBZISM2NyQ3JCQiMHVdRkI3VlAjISM3JCIwR0dFNSNvRFkhIzY3JCQiMDgkKmYxQFZQIyEjNyQiMCQpW2ZPeVBqJSEjNjckNyQkIjB4PjhxRFZQIyEjNyQiMGs7TGxBIlFZISM2NyQkIjA4JCpmMUBWUCMhIzckIjAkKVtmT3lQaiUhIzY3JDckJCIweD44cURWUCMhIzckIjBrO0xsQSJRWSEjNjckJCIwWSRmMlhMdUIhIzckIjA3J3o7ZTxZWSEjNjckNyQkIjAoSEwrI1JWUCMhIzckIi4wUz9qMGwlISIqNyQkIjBZJGYyWEx1QiEjNyQiMDcnejtlPFlZISM2NyQ3JCQiMChITCsjUlZQIyEjNyQiLjBTP2owbCUhIio3JCQiMCpSNSIpek11QiEjNyQiMCVcS2xKZGVZISM2NyQ3JCQiMDMoZUpGTnVCISM3JCIwTyRwYVAralkhIzY3JCQiMCpSNSIpek11QiEjNyQiMCVcS2xKZGVZISM2NyQ3JCQiMDMoZUpGTnVCISM3JCIwTyRwYVAralkhIzY3JCQiMHk4Y1toVlAjISM3JCIvaFg5Lyg0biUhIzU3JDckJCIwV3FUSG1WUCMhIzckIjBzIlEwVld2WSEjNjckJCIweThjW2hWUCMhIzckIi9oWDkvKDRuJSEjNTckNyQkIjBXcVRIbVZQIyEjNyQiMHMiUTBWV3ZZISM2NyQkIjBfSi0tdlZQIyEjNyQiMGRacWNuTG8lISM2NyQ3JCQiMEgpcCgpKXpWUCMhIzckIjAzcWcmWyl5byUhIzY3JCQiMF9KLS12VlAjISM3JCIwZFpxY25MbyUhIzY3JDckJCIwSClwKCkpelZQIyEjNyQiMDNxZyZbKXlvJSEjNjckJCIvJkhzZSlRdUIhIzYkIjBPOGVoa2RwJSEjNjckNyQkIjBMR0heJFJ1QiEjNyQiMFdlblNELnElISM2NyQkIi8mSHNlKVF1QiEjNiQiME84ZWhrZHAlISM2NyQ3JCQiMExHSF4kUnVCISM3JCIwV2VuU0QucSUhIzY3JCQiMCVlI1E9LVdQIyEjNyQiMFl0J3A6OzNaISM2NyQ3JCQiMDMzInByU3VCISM3JCIvb1dkZnc3WiEjNTckJCIwJWUjUT0tV1AjISM3JCIwWXQncDo7M1ohIzY3JDckJCIwMzMicHJTdUIhIzckIi9vV2RmdzdaISM1NyQkIjAkeSI+ImVUdUIhIzckIjBGV0RVZTBzJSEjNjckNyQkIjAnemdjM1V1QiEjNyQiMDtOIjNsP0RaISM2NyQkIjAkeSI+ImVUdUIhIzckIjBGV0RVZTBzJSEjNjckNyQkIjAnemdjM1V1QiEjNyQiMDtOIjNsP0RaISM2NyQkIjA9Kik0WkhXUCMhIzckIjBIIjN3XiZIdCUhIzY3JDckJCIwIjNVdlhWdUIhIzckIjBfQillcWtQWiEjNjckJCIwPSopNFpIV1AjISM3JCIwSCIzd14mSHQlISM2NyQ3JCQiMCIzVXZYVnVCISM3JCIwX0IpZXFrUFohIzY3JCQiMC5LNTtWV1AjISM3JCIwbjQuJD1OWFohIzY3JDckJCIvJlJiS1tXUCMhIzYkIjApPV40dzNdWiEjNjckJCIwLks1O1ZXUCMhIzckIjBuNC4kPU5YWiEjNjckNyQkIi8mUmJLW1dQIyEjNiQiMCk9XjR3M11aISM2NyQkIjBjUT8pb1h1QiEjNyQiMF5hX1FbeHYlISM2NyQ3JCQiLzBVMUBZdUIhIzYkIjBDKy07R0R3JSEjNjckJCIwY1E/KW9YdUIhIzckIjBeYV9RW3h2JSEjNjckNyQkIi8wVTFAWXVCISM2JCIwQystO0dEdyUhIzY3JCQiMFRqTWpxV1AjISM3JCIwW2tFJVs5cVohIzY3JDckJCIwYUMiPmZadUIhIzckIi8nKSkzcm9ceCUhIzU3JCQiMFRqTWpxV1AjISM3JCIwW2tFJVs5cVohIzY3JDckJCIwYUMiPmZadUIhIzckIi8nKSkzcm9ceCUhIzU3JCQiMD5EYlQlW3VCISM3JCIwaFE9P1REeSUhIzY3JDckJCIwQW9BdypbdUIhIzckIjAncGRoIzR1eSUhIzY3JCQiMD5EYlQlW3VCISM3JCIwaFE9P1REeSUhIzY3JDckJCIwQW9BdypbdUIhIzckIjAncGRoIzR1eSUhIzY3JCQiMDtQJkcjKVx1QiEjNyQiMFpzPFlQXHolISM2NyQ3JCQiMEUqcE9PXXVCISM3JCIwS2xBIilcKSp6JSEjNjckJCIwO1AmRyMpXHVCISM3JCIwWnM8WVBceiUhIzY3JDckJCIwRSpwT09ddUIhIzckIjBLbEEiKVwpKnolISM2NyQkIjBfIlxzP151QiEjNyQiMDAiXEFPTDJbISM2NyQ3JCQiMFlhPWE8WFAjISM3JCIwb2BITyFIN1shIzY3JCQiMF8iXHM/XnVCISM3JCIwMCJcQU9MMlshIzY3JDckJCIwWWE9YTxYUCMhIzckIjBvYEhPIUg3WyEjNjckJCIvWipmJWZfdUIhIzYkIjB1aSUpb0goPlshIzY3JDckJCIwTC8heTlgdUIhIzckIjAvVU8iNHRDWyEjNjckJCIvWipmJWZfdUIhIzYkIjB1aSUpb0goPlshIzY3JDckJCIwTC8heTlgdUIhIzckIjAvVU8iNHRDWyEjNjckJCIwJnApNCYpUlhQIyEjNyQiMEhtTWxEQCRbISM2NyQ3JCQiMFFrW1dYWFAjISM3JCIvL0xrOTxQWyEjNTckJCIwJnApNCYpUlhQIyEjNyQiMEhtTWxEQCRbISM2NyQ3JCQiMFFrW1dYWFAjISM3JCIvL0xrOTxQWyEjNTckJCIwUFRqeWBYUCMhIzckIi46Nl9AWCVbISIqNyQ3JCQiMGkkKUhXZlhQIyEjNyQiMHc9XSw3J1xbISM2NyQkIjBQVGp5YFhQIyEjNyQiLjo2X0BYJVshIio3JDckJCIwaSQpSFdmWFAjISM3JCIwdz1dLDcnXFshIzY3JCQiMHQkel54Y3VCISM3JCIwN2NBSDxwJlshIzY3JDckJCIwYlM6WnRYUCMhIzckIjA3MmRjXz8nWyEjNjckJCIwdCR6XnhjdUIhIzckIjA3Y0FIPHAmWyEjNjckNyQkIjBiUzpadFhQIyEjNyQiMDcyZGNfPydbISM2NyQkIjAjKmYiWzxldUIhIzckIjBedFUnSEpwWyEjNjckNyQkIjBwXzhgKGV1QiEjNyQiMFsmUjtKXHVbISM2NyQkIjAjKmYiWzxldUIhIzckIjBedFUnSEpwWyEjNjckNyQkIjBwXzhgKGV1QiEjNyQiMFsmUjtKXHVbISM2NyQkIi8pR1l4JmZ1QiEjNiQiMDZvKFImMzwpWyEjNjckNyQkIjB6MztpLFlQIyEjNyQiMCVRM25PJHApWyEjNjckJCIvKUdZeCZmdUIhIzYkIjA2byhSJjM8KVshIzY3JDckJCIwejM7aSxZUCMhIzckIjAlUTNuTyRwKVshIzY3JCQiMD4xPyQpNFlQIyEjNyQiMDFjaCwvVCpbISM2NyQ3JCQiMEJERHU6WVAjISM3JCIvQXg8VVAqKlshIzU3JCQiMD4xPyQpNFlQIyEjNyQiMDFjaCwvVCpbISM2NyQ3JCQiMEJERHU6WVAjISM3JCIvQXg8VVAqKlshIzU3JCQiMGsjcD5SaXVCISM3JCIwW2ZgUipcMVwhIzY3JDckJCIwJWZuJSopSFlQIyEjNyQiMGNnJW9aIj0iXCEjNjckJCIwayNwPlJpdUIhIzckIjBbZmBSKlwxXCEjNjckNyQkIjAlZm4lKilIWVAjISM3JCIwY2clb1oiPSJcISM2NyQkIjAoZm9PIVFZUCMhIzckIjAjPWYhbyUqKT1cISM2NyQ3JCQiMEF2ZTJXWVAjISM3JCIwJCpbIj5gRENcISM2NyQkIjAoZm9PIVFZUCMhIzckIjAjPWYhbyUqKT1cISM2NyQ3JCQiMEF2ZTJXWVAjISM3JCIwJCpbIj5gRENcISM2NyQkIi9rdiU9X1lQIyEjNiQiMCNwPG0pKkdKXCEjNjckNyQkIjAjXHAqR2VZUCMhIzckIjBIUClwZXBPXCEjNjckJCIva3YlPV9ZUCMhIzYkIjAjcDxtKSpHSlwhIzY3JDckJCIwI1xwKkdlWVAjISM3JCIwSFApcGVwT1whIzY3JCQiMGZCTk9tWVAjISM3JCIwUU1MJlxvVlwhIzY3JDckJCIwRlBGYHNZUCMhIzckIjBsRDBVTyJcXCEjNjckJCIwZkJOT21ZUCMhIzckIjBRTUwmXG9WXCEjNjckNyQkIjBGUEZgc1lQIyEjNyQiMGxEMFVPIlxcISM2NyQkIjAoXDxyMG91QiEjNyQiMC53eSUqemcmXCEjNjckNyQkIjAwSG8hb291QiEjNyQiMCw5NyhwZGhcISM2NyQkIjAoXDxyMG91QiEjNyQiMC53eSUqemcmXCEjNjckNyQkIjAwSG8hb291QiEjNyQiMCw5NyhwZGhcISM2NyQkIjBfUSY0W3B1QiEjNyQiMGpTUiVbWm9cISM2NyQ3JCQiMFJeMjYsWlAjISM3JCIwUC0+XzxTKFwhIzY3JCQiMF9RJjRbcHVCISM3JCIwalNSJVtab1whIzY3JDckJCIwUl4yNixaUCMhIzckIjBQLT5fPFMoXCEjNjckJCIvZjp5ITRaUCMhIzYkIjB6KCpIa3AzKVwhIzY3JDckJCIwZGdfVzpaUCMhIzckIjB0IWZzIWVrKVwhIzY3JCQiL2Y6eSE0WlAjISM2JCIweigqSGtwMylcISM2NyQ3JCQiMGRnX1c6WlAjISM3JCIwdCFmcyFlaylcISM2NyQkIjAvWmlQQlpQIyEjNyQiMHZbdk1rSypcISM2NyQ3JCQiMDEzLSIpSFpQIyEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMC9aaVBCWlAjISM3JCIwdlt2TWtLKlwhIzY3JDckJCIwMTMtIilIWlAjISM3JCIwNHpLaSkqKSkqXCEjNjckJCIwbyk9MHh0dUIhIzckIjA0ekomKmVjKyYhIzY3JDckJCIwLmJqP1daUCMhIzckIjBYblI8UjgsJiEjNjckJCIwbyk9MHh0dUIhIzckIjA0ekomKmVjKyYhIzY3JDckJCIwLmJqP1daUCMhIzckIjBYblI8UjgsJiEjNjckJCIwQUVVMV9aUCMhIzckIjBNM0JZYCE9XSEjNjckNyQkIjBbMEJqZVpQIyEjNyQiMCJlbEMoelAtJiEjNjckJCIwQUVVMV9aUCMhIzckIjBNM0JZYCE9XSEjNjckNyQkIjBbMEJqZVpQIyEjNyQiMCJlbEMoelAtJiEjNjckJCIwX0RGWG1aUCMhIzckIjAiKnBwKHlXSV0hIzY3JDckJCIwZipwKTN0WlAjISM3JCIwPFdgRj9pLiYhIzY3JCQiMF9ERlhtWlAjISM3JCIwIipwcCh5V0ldISM2NyQ3JCQiMGYqcCkzdFpQIyEjNyQiMDxXYEY/aS4mISM2NyQkIjBaRTgoM3l1QiEjNyQiMC03Xj5VRy8mISM2NyQ3JCQiMDolKltkKHl1QiEjNyQiMGBLZyMzbVtdISM2NyQkIjBaRTgoM3l1QiEjNyQiMC03Xj5VRy8mISM2NyQ3JCQiMDolKltkKHl1QiEjNyQiMGBLZyMzbVtdISM2NyQkIjA2OyxLJnp1QiEjNyQiMF9ia1RPXzAmISM2NyQ3JCQiMDg5OzQtW1AjISM3JCIwKjNzdzg1aF0hIzY3JCQiMDY7LEsmenVCISM3JCIwX2JrVE9fMCYhIzY3JDckJCIwODk7NC1bUCMhIzckIjAqM3N3ODVoXSEjNjckJCIwTz53ejRbUCMhIzckIjBDSWRhSXcxJiEjNjckNyQkIjBzWSFRbSJbUCMhIzckIjBENHUjPmF0XSEjNjckJCIwTz53ejRbUCMhIzckIjBDSWRhSXcxJiEjNjckNyQkIjBzWSFRbSJbUCMhIzckIjBENHUjPmF0XSEjNjckJCIwJilbZklDW1AjISM3JCIvQDt3WC0hMyYhIzU3JDckJCIwSCIqXEBKW1AjISM3JCIwaCg0eUMpZjMmISM2NyQkIjAmKVtmSUNbUCMhIzckIi9AO3dYLSEzJiEjNTckNyQkIjBIIipcQEpbUCMhIzckIjBoKDR5QylmMyYhIzY3JCQiMHc4UCUpUVtQIyEjNyQiMHM1QV49QzQmISM2NyQ3JCQiMGg0PCNlJVtQIyEjNyQiMChmeUdJVSk0JiEjNjckJCIwdzhQJSlRW1AjISM3JCIwczVBXj1DNCYhIzY3JDckJCIwaDQ8I2UlW1AjISM3JCIwKGZ5R0lVKTQmISM2NyQkIjAlbyE0VGBbUCMhIzckIjBMKipRTjdbNSYhIzY3JDckJCIwKUcoKWUvJ1tQIyEjNyQiMEx1JXpOJzM2JiEjNjckJCIwJW8hNFRgW1AjISM3JCIwTCoqUU43WzUmISM2NyQ3JCQiMClHKCllLydbUCMhIzckIjBMdSV6TiczNiYhIzY3JCQiMHkpPjMhb1tQIyEjNyQiMFR4ISo0MXM2JiEjNjckNyQkIjAyMmU3dltQIyEjNyQiMHBpLDgvTDcmISM2NyQkIjB5KT4zIW9bUCMhIzckIjBUeCEqNDFzNiYhIzY3JDckJCIwMjJlN3ZbUCMhIzckIjBwaSw4L0w3JiEjNjckJCIwZDljaiMpW1AjISM3JCIwJFttWigqZkheISM2NyQ3JCQiMFwwSyMpKilbUCMhIzckIjAwXjNvV2Q4JiEjNjckJCIwZDljaiMpW1AjISM3JCIwJFttWigqZkheISM2NyQ3JCQiMFwwSyMpKilbUCMhIzckIjAwXjNvV2Q4JiEjNjckJCIwMFU8SCgqW1AjISM3JCIwZio9L0wqPjkmISM2NyQ3JCQiMFljJ1xYIVxQIyEjNyQiMFRSOkImPVteISM2NyQkIjAwVTxIKCpbUCMhIzckIjBmKj0vTCo+OSYhIzY3JDckJCIwWWMnXFghXFAjISM3JCIwVFI6QiY9W14hIzY3JCQiMDh6cyg+IlxQIyEjNyQiMCpRVG1uUWFeISM2NyQ3JCQiMEVkbEk+XFAjISM3JCIweEZBeUQxOyYhIzY3JCQiMDh6cyg+IlxQIyEjNyQiMCpRVG1uUWFeISM2NyQ3JCQiMEVkbEk+XFAjISM3JCIweEZBeUQxOyYhIzY3JCQiMEE8SHBFXFAjISM3JCIwdj9AOCF5bV4hIzY3JDckJCIwODhLNE1cUCMhIzckIjA4O0hMbUk8JiEjNjckJCIwQTxIcEVcUCMhIzckIjB2P0A4IXltXiEjNjckNyQkIjA4OEs0TVxQIyEjNyQiMDg7SExtSTwmISM2NyQkIjBjUidROSVcUCMhIzckIjAlUk8sTTx6XiEjNjckNyQkIjAyJ0g1KltcUCMhIzckIjBcL08pb10mPSYhIzY3JCQiMGNSJ1E5JVxQIyEjNyQiMCVSTyxNPHpeISM2NyQ3JCQiMDInSDUqW1xQIyEjNyQiMFwvTylvXSY9JiEjNjckJCIwT3dJQGNcUCMhIzckIi9jYHlsYyI+JiEjNTckNyQkIjAzUGt2alxQIyEjNyQiMCZHSE11JXo+JiEjNjckJCIwT3dJQGNcUCMhIzckIi9jYHlsYyI+JiEjNTckNyQkIjAzUGt2alxQIyEjNyQiMCZHSE11JXo+JiEjNjckJCIwVC9wLHJcUCMhIzckIjBpbDltZlI/JiEjNjckNyQkIjBgOEJqeVxQIyEjNyQiMEAiKVwpelE1XyEjNjckJCIwVC9wLHJcUCMhIzckIjBpbDltZlI/JiEjNjckNyQkIjBgOEJqeVxQIyEjNyQiMEAiKVwpelE1XyEjNjckJCIwYzssJmUpXFAjISM3JCIwJ3A8XUVOO18hIzY3JDckJCIwJyk9emAkKlxQIyEjNyQiMGVwY2BHR0EmISM2NyQkIjBjOywmZSlcUCMhIzckIjAncDxdRU47XyEjNjckNyQkIjAnKT16YCQqXFAjISM3JCIwZXBjYEdHQSYhIzY3JCQiMGswRnIrXVAjISM3JCIwZiNwV2J1R18hIzY3JDckJCIwYllLWjNdUCMhIzckIjAlek4nM3BfQiYhIzY3JCQiMGswRnIrXVAjISM3JCIwZiNwV2J1R18hIzY3JDckJCIwYllLWjNdUCMhIzckIjAlek4nM3BfQiYhIzY3JCQiMGE3U2c6XVAjISM3JCIwI2Y3WiRRNkMmISM2NyQ3JCQiMCVSUFFNLXZCISM3JCIvai9QJzR4QyYhIzU3JCQiMGE3U2c6XVAjISM3JCIwI2Y3WiRRNkMmISM2NyQ3JCQiMCVSUFFNLXZCISM3JCIvai9QJzR4QyYhIzU3JCQiMGZ1Z19JXVAjISM3JCIwT1c0MEpORCYhIzY3JDckJCIwV1BKVlFdUCMhIzckIjBtTXg9XSxFJiEjNjckJCIwZnVnX0ldUCMhIzckIjBPVzQwSk5EJiEjNjckNyQkIjBXUEpWUV1QIyEjNyQiMG1NeD1dLEUmISM2NyQkIjAoNDd3YS92QiEjNyQiMFJLXW1CZkUmISM2NyQ3JCQiMCpHJ3BYYF1QIyEjNyQiMC1CJVEyZnNfISM2NyQkIjAoNDd3YS92QiEjNyQiMFJLXW1CZkUmISM2NyQ3JCQiMCpHJ3BYYF1QIyEjNyQiMC1CJVEyZnNfISM2NyQkIjBZRWJYZ11QIyEjNyQiMCY9KVw9OyR5XyEjNjckNyQkIjAjcEM2Jm9dUCMhIzckIjBRNiIqR0pdRyYhIzY3JCQiMFlFYlhnXVAjISM3JCIwJj0pXD07JHlfISM2NyQ3JCQiMCNwQzYmb11QIyEjNyQiMFE2IipHSl1HJiEjNjckJCIwKFwubGEydkIhIzckIjBZMiUzJzMySCYhIzY3JDckJCIwVCZbJWYkM3ZCISM3JCIwdSp6Uj1aKEgmISM2NyQkIjAoXC5sYTJ2QiEjNyQiMFkyJTMnMzJIJiEjNjckNyQkIjBUJlslZiQzdkIhIzckIjB1KnpSPVooSCYhIzY3JCQiMGY8RF0hNHZCISM3JCIvYThVNDUuYCEjNTckNyQkIi9OejEoKTR2QiEjNiQiLyIpWyFSNyo0YCEjNTckJCIwZjxEXSE0dkIhIzckIi9hOFU0NS5gISM1NyQ3JCQiL056MSgpNHZCISM2JCIvIilbIVI3KjRgISM1NyQkIjAjKVskcGI1dkIhIzckIjBaZTw9JFw6YCEjNjckNyQkIjA3KylbUTZ2QiEjNyQiMFl3NiVITkFgISM2NyQkIjAjKVskcGI1dkIhIzckIjBaZTw9JFw6YCEjNjckNyQkIjA3KylbUTZ2QiEjNyQiMFl3NiVITkFgISM2NyQkIjBkQGJtP15QIyEjNyQiMFEqSEZgKXlLJiEjNjckNyQkIjAiKSlcPyFIXlAjISM3JCIwI1snPVwkek1gISM2NyQkIjBkQGJtP15QIyEjNyQiMFEqSEZgKXlLJiEjNjckNyQkIjAiKSlcPyFIXlAjISM3JCIwI1snPVwkek1gISM2NyQkIjB2RzV6Tl5QIyEjNyQiMCUzeXl0RlNgISM2NyQ3JCQiMDYkKT1BV15QIyEjNyQiMD1gRC9Nc00mISM2NyQkIjB2RzV6Tl5QIyEjNyQiMCUzeXl0RlNgISM2NyQ3JCQiMDYkKT1BV15QIyEjNyQiMD1gRC9Nc00mISM2NyQkIjAoKmZfJTQ6dkIhIzckIjAxZyJRJHBFTiYhIzY3JDckJCIwR2c6WGZeUCMhIzckIjBhVEtmdSdmYCEjNjckJCIwKCpmXyU0OnZCISM3JCIwMWciUSRwRU4mISM2NyQ3JCQiMEdnOlhmXlAjISM3JCIwYVRLZnUnZmAhIzY3JCQiMFlSIUdoO3ZCISM3JCIwbCtnP2hdTyYhIzY3JDckJCIwTTU0cnVeUCMhIzckIi8qSFI5OkBQJiEjNTckJCIwWVIhR2g7dkIhIzckIjBsK2c/aF1PJiEjNjckNyQkIjBNNTRydV5QIyEjNyQiLypIUjk6QFAmISM1NyQkIjApKlImUjg9dkIhIzckIjBqWzwpSFh4YCEjNjckNyQkIjBATiQqKioqPXZCISM3JCIwRT1ZcGJYUSYhIzY3JCQiMCkqUiZSOD12QiEjNyQiMGpbPClIWHhgISM2NyQ3JCQiMEBOJCoqKio9dkIhIzckIjBFPVlwYlhRJiEjNjckJCIwInlOIWUnPnZCISM3JCIwMyNcalklKSpRJiEjNjckNyQkIi82VjxgP3ZCISM2JCIwaTFgQycqcFImISM2NyQkIjAieU4hZSc+dkIhIzckIjAzI1xqWSUpKlEmISM2NyQ3JCQiLzZWPGA/dkIhIzYkIjBpMWBDJypwUiYhIzY3JCQiL2ZbXT1AdkIhIzYkIjBkYDdET0FTJiEjNjckNyQkIjBkIj5sMUF2QiEjNyQiMClcKmZ6TyU0YSEjNjckJCIvZltdPUB2QiEjNiQiMGRgN0RPQVMmISM2NyQ3JCQiMGQiPmwxQXZCISM3JCIwKVwqZnpPJTRhISM2NyQkIjBGVCRcckF2QiEjNyQiMFstcHVGWVQmISM2NyQ3JCQiMFdDNy9PX1AjISM3JCIwTSRvWXQoPVUmISM2NyQkIjBGVCRcckF2QiEjNyQiMFstcHVGWVQmISM2NyQ3JCQiMFdDNy9PX1AjISM3JCIwTSRvWXQoPVUmISM2NyQkIjBlQmhaVV9QIyEjNyQiMCdcK2AiPnFVJiEjNjckNyQkIjB2UmpXXl9QIyEjNyQiLzxQKCp5Sk1hISM1NyQkIjBlQmhaVV9QIyEjNyQiMCdcK2AiPnFVJiEjNjckNyQkIjB2UmpXXl9QIyEjNyQiLzxQKCp5Sk1hISM1NyQkIjBKMUEkeUR2QiEjNyQiMDZkXlk1JVJhISM2NyQ3JCQiLzw2IilvRXZCISM2JCIwMWchWyVlblcmISM2NyQkIjBKMUEkeUR2QiEjNyQiMDZkXlk1JVJhISM2NyQ3JCQiLzw2IilvRXZCISM2JCIwMWchWyVlblcmISM2NyQkIjAqSC08S0Z2QiEjNyQiMEB2Xm8sPVgmISM2NyQ3JCQiMFVbVE0jR3ZCISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwKkgtPEtGdkIhIzckIjBAdl5vLD1YJiEjNjckNyQkIjBVW1RNI0d2QiEjNyQiMFVbKCkqKik+ZmEhIzY3JCQiMDg2LmopR3ZCISM3JCIwJTQhUiJHPmthISM2NyQ3JCQiMEBIbyR5SHZCISM3JCIweU8lXCZSO1omISM2NyQkIjA4Ni5qKUd2QiEjNyQiMCU0IVIiRz5rYSEjNjckNyQkIjBASG8keUh2QiEjNyQiMHlPJVwmUjtaJiEjNjckJCIwX0lCMi9gUCMhIzckIi84XV1RZXdhISM1NyQ3JCQiMFRpeE44YFAjISM3JCIwOUQsNSEzJVsmISM2NyQkIjBfSUIyL2BQIyEjNyQiLzhdXVFld2EhIzU3JDckJCIwVGl4TjhgUCMhIzckIjA5RCw1ITMlWyYhIzY3JCQiMHonelUmPmBQIyEjNyQiMDspKWV6dSopWyYhIzY3JDckJCIwNkYkMypHYFAjISM3JCIvTiIzbD9sXCYhIzU3JCQiMHonelUmPmBQIyEjNyQiMDspKWV6dSopWyYhIzY3JDckJCIwNkYkMypHYFAjISM3JCIvTiIzbD9sXCYhIzU3JCQiMGwiKj4vTmBQIyEjNyQiMD1lIlxjTyxiISM2NyQ3JCQiMCc9OChbV2BQIyEjNyQiMCc9XSw3JyozYiEjNjckJCIwbCIqPi9OYFAjISM3JCIwPWUiXGNPLGIhIzY3JDckJCIwJz04KFtXYFAjISM3JCIwJz1dLDcnKjNiISM2NyQkIjAveCFwME52QiEjNyQiMGEpKkhUY1BeJiEjNjckNyQkIjA3RF00Z2BQIyEjNyQiMEEhPl88U0BiISM2NyQkIjAveCFwME52QiEjNyQiMGEpKkhUY1BeJiEjNjckNyQkIjA3RF00Z2BQIyEjNyQiMEIhPl88U0BiISM2NyQkIjBhKipbN21gUCMhIzckIjB1JXAlM1poXyYhIzY3JDckJCIwUDw/dHZgUCMhIzckIjBmeUdJVVFgJiEjNjckJCIwYSoqWzdtYFAjISM3JCIwdSVwJTNaaF8mISM2NyQ3JCQiMFA8P3R2YFAjISM3JCIwZnlHSVVRYCYhIzY3JCQiMF4qKSo0PFF2QiEjNyQiMEFZRG1QJlFiISM2NyQ3JCQiMHZzeFIiUnZCISM3JCIwJnBjYEdHWWIhIzY3JCQiMF4qKSo0PFF2QiEjNyQiMEFZRG1QJlFiISM2NyQ3JCQiMHZzeFIiUnZCISM3JCIwJnBjYEdHWWIhIzY3JCQiMCkzJ0hLKFJ2QiEjNyQiME8oKjQ6RzRiJiEjNjckNyQkIjB5YTw0MmFQIyEjNyQiMEpiVVNCKGViISM2NyQkIjApMydISyhSdkIhIzckIjBPKCo0Okc0YiYhIzY3JDckJCIweWE8NDJhUCMhIzckIjBKYlVTQihlYiEjNjckJCIwVDtWJ0hUdkIhIzckIjAvTyVbJj1MYyYhIzY3JDckJCIuVWAiR1V2QiEjNSQiMG5WXCZSO3JiISM2NyQkIjBUO1YnSFR2QiEjNyQiMC9PJVsmPUxjJiEjNjckNyQkIi5VYCJHVXZCISM1JCIwblZcJlI7cmIhIzY3JCQiMEwrUmpHYVAjISM3JCIvPU9iKTNkZCYhIzU3JDckJCIwTVRtY1FhUCMhIzckIjAuS2NdL09lJiEjNjckJCIwTCtSakdhUCMhIzckIi89T2IpM2RkJiEjNTckNyQkIjBNVG1jUWFQIyEjNyQiMC5LY10vT2UmISM2NyQkIjAqXCY9TFdhUCMhIzckIi8iPTgyKjQpZSYhIzU3JDckJCIwc1d2TWFhUCMhIzckIjBSP2owWGdmJiEjNjckJCIwKlwmPUxXYVAjISM3JCIvIj04Mio0KWUmISM1NyQ3JCQiMHNXdk1hYVAjISM3JCIwUj9qMFhnZiYhIzY3JCQiMGtdJmUrWXZCISM3JCIwJHk2Jj4qWytjISM2NyQ3JCQiMDxvZDpxYVAjISM3JCIwdjNxZyZbM2MhIzY3JCQiMGtdJmUrWXZCISM3JCIwJHk2Jj4qWytjISM2NyQ3JCQiMDxvZDpxYVAjISM3JCIwdjNxZyZbM2MhIzY3JCQiMCNRQDdlWnZCISM3JCIwW1pDQnpHaCYhIzY3JDckJCIwJGUpUipmW3ZCISM3JCIwNihwZGgjNGkmISM2NyQkIjAjUUA3ZVp2QiEjNyQiMFtaQ0J6R2gmISM2NyQ3JCQiMCRlKVIqZlt2QiEjNyQiMDYocGRoIzRpJiEjNjckJCIwODhiZiJcdkIhIzckIi8udnUicF9pJiEjNTckNyQkIjBhNiZmPV12QiEjNyQiMFomUTNuT0xjISM2NyQkIjA4OGJmIlx2QiEjNyQiLy52dSJwX2kmISM1NyQ3JCQiMGE2JmY9XXZCISM3JCIwWiZRM25PTGMhIzY3JCQiMCZvdzB1XXZCISM3JCIwNkQxLmZ3aiYhIzY3JDckJCIwJUc5YXhedkIhIzckIjAkUTJmcyFlayYhIzY3JCQiMCZvdzB1XXZCISM3JCIwNkQxLmZ3aiYhIzY3JDckJCIwJUc5YXhedkIhIzckIjAkUTJmcyFlayYhIzY3JCQiMF5vWkNCYlAjISM3JCIwMkBWelsrbCYhIzY3JDckJCIvWyhwbkxiUCMhIzYkIjA+aSg0eUNlYyEjNjckJCIwXm9aQ0JiUCMhIzckIjAyQFZ6WytsJiEjNjckNyQkIi9bKHBuTGJQIyEjNiQiMD5pKDR5Q2VjISM2NyQkIjBieT82UmJQIyEjNyQiMGJac1lRQ20mISM2NyQ3JCQiMCRRWUcnXGJQIyEjNyQiMGJdL08pb3FjISM2NyQkIjBieT82UmJQIyEjNyQiMGJac1lRQ20mISM2NyQ3JCQiMCRRWUcnXGJQIyEjNyQiMGJdL08pb3FjISM2NyQkIjBIY24rYmJQIyEjNyQiMCUzVV8hR1tuJiEjNjckNyQkIjBcKyczY2N2QiEjNyQiMCIqUTYiKkdKbyYhIzY3JCQiMEhjbitiYlAjISM3JCIwJTNVXyFHW24mISM2NyQ3JCQiMFwrJzNjY3ZCISM3JCIwIipRNiIqR0pvJiEjNjckJCIwPiE+STRkdkIhIzckIjApKSlRWHZAKG8mISM2NyQ3JCQiMFspKmZoImV2QiEjNyQiMEZGPVlwYnAmISM2NyQkIjA+IT5JNGR2QiEjNyQiMCkpKVFYdkAobyYhIzY3JDckJCIwWykqZmgiZXZCISM3JCIwRkY9WXBicCYhIzY3JCQiME13NClvZXZCISM3JCIwR2AxJnBnKnAmISM2NyQ3JCQiMHRjSGwoZnZCISM3JCIwajpELDUhM2QhIzY3JCQiME13NClvZXZCISM3JCIwR2AxJnBnKnAmISM2NyQ3JCQiMHRjSGwoZnZCISM3JCIwajpELDUhM2QhIzY3JCQiMCRSMWdHZ3ZCISM3JCIwWnFeRScqPnImISM2NyQ3JCQiMD1Zd3I4Y1AjISM3JCIwKlI/ajBYP2QhIzY3JCQiMCRSMWdHZ3ZCISM3JCIwWnFeRScqPnImISM2NyQ3JCQiMD1Zd3I4Y1AjISM3JCIwKlI/ajBYP2QhIzY3JCQiMEV1cCcpPWNQIyEjNyQiMFB2L1wmUUNkISM2NyQ3JCQiMCI9XjUpSGNQIyEjNyQiME4jKlE2IipHdCYhIzY3JCQiMEV1cCcpPWNQIyEjNyQiMFB2L1wmUUNkISM2NyQ3JCQiMCI9XjUpSGNQIyEjNyQiME4jKlE2IipHdCYhIzY3JCQiMCczOC1canZCISM3JCIwKio0X2l1bnQmISM2NyQ3JCQiMGB2PiRma3ZCISM3JCIwciFlaztMWGQhIzY3JCQiMCczOC1canZCISM3JCIwKio0X2l1bnQmISM2NyQ3JCQiMGB2PiRma3ZCISM3JCIwciFlaztMWGQhIzY3JCQiMFpoWSc0bHZCISM3JCIwO3JAbmoiXGQhIzY3JDckJCIwJzQ4IzNpY1AjISM3JCIwMnBfQHN4diYhIzY3JCQiMFpoWSc0bHZCISM3JCIwO3JAbmoiXGQhIzY3JDckJCIwJzQ4IzNpY1AjISM3JCIwMnBfQHN4diYhIzY3JCQiMDhhZjBuY1AjISM3JCIwQjNwaV86dyYhIzY3JDckJCIwUipbZiN5Y1AjISM3JCIwVmRmdzcteCYhIzY3JCQiMDhhZjBuY1AjISM3JCIwQjNwaV86dyYhIzY3JDckJCIwUipbZiN5Y1AjISM3JCIwVmRmdzcteCYhIzY3JCQiMFchNHVKb3ZCISM3JCIwVXNiXFRSeCYhIzY3JDckJCIwRitdWSVwdkIhIzckIjB6WG1KYEV5JiEjNjckJCIwVyE0dUpvdkIhIzckIjBVc2JcVFJ4JiEjNjckNyQkIjBGK11ZJXB2QiEjNyQiMHpYbUpgRXkmISM2NyQkIjAwNSc+JCpwdkIhIzckIjBSTGtGSWp5JiEjNjckNyQkIjA7SiMqcDVkUCMhIzckIjA6TXQnUTQmeiYhIzY3JCQiMDA1Jz4kKnB2QiEjNyQiMFJMa0ZJankmISM2NyQ3JCQiMDtKIypwNWRQIyEjNyQiMDpNdCdRNCZ6JiEjNjckJCIwLS1WXDpkUCMhIzckIi9ZdmoqPSgpeiYhIzU3JDckJCIwb1M1J3BzdkIhIzckIjBeQSE9V2AyZSEjNjckJCIwLS1WXDpkUCMhIzckIi9ZdmoqPSgpeiYhIzU3JDckJCIwb1M1J3BzdkIhIzckIjBeQSE9V2AyZSEjNjckJCIwI2VTJnBKZFAjISM3JCIwYihRbXY1NmUhIzY3JDckJCIwJz1mXUt1dkIhIzckIjAoM3JvXCgqPmUhIzY3JCQiMCNlUyZwSmRQIyEjNyQiMGIoUW12NTZlISM2NyQ3JCQiMCc9Zl1LdXZCISM3JCIwKTNyb1woKj5lISM2NyQkIjA0I0hDenV2QiEjNyQiME1QKnpnXEJlISM2NyQ3JCQiMCYpeSNwJmZkUCMhIzckIjBDKlI+YlRLZSEjNjckJCIwNCNIQ3p1dkIhIzckIjBNUCp6Z1xCZSEjNjckNyQkIjAmKXkjcCZmZFAjISM3JCIwQypSPmJUS2UhIzY3JCQiMD1aPj1rZFAjISM3JCIvOEMsWCllJGUhIzU3JDckJCIwdjVeImZ4dkIhIzckIi93M3FnJlslZSEjNTckJCIwPVo+PWtkUCMhIzckIi84QyxYKWUkZSEjNTckNyQkIjB2NV4iZnh2QiEjNyQiL3czcWcmWyVlISM1NyQkIi9uK20veXZCISM2JCIweCEpeSRHRltlISM2NyQ3JCQiMCdlcClHI3p2QiEjNyQiMCdmeD9tSGRlISM2NyQkIi9uK20veXZCISM2JCIweCEpeSRHRltlISM2NyQ3JCQiMCdlcClHI3p2QiEjNyQiMCdmeD9tSGRlISM2NyQkIi5UeXgnenZCISM1JCIwdGhhM2gxJ2UhIzY3JDckJCIwWTovcDNlUCMhIzckIjBLazk8UChwZSEjNjckJCIuVHl4J3p2QiEjNSQiMHRoYTNoMSdlISM2NyQ3JCQiMFk6L3AzZVAjISM3JCIwS2s5PFAocGUhIzY3JCQiMG1WdTY4ZVAjISM3JCIweS9TQ1xJKGUhIzY3JDckJCIwQlgjPl4jZVAjISM3JCIwb19Ac3hAKWUhIzY3JCQiMG1WdTY4ZVAjISM3JCIweS9TQ1xJKGUhIzY3JDckJCIwQlgjPl4jZVAjISM3JCIwb19Ac3hAKWUhIzY3JCQiMGojeiRbSGVQIyEjNyQiMDQoeTt0ViYpZSEjNjckNyQkIjBXNXNkVGVQIyEjNyQiMC9UR0Y9WSplISM2NyQkIjBqI3okW0hlUCMhIzckIjA0KHk7dFYmKWUhIzY3JDckJCIwVzVzZFRlUCMhIzckIjAvVEdGPVkqZSEjNjckJCIvQmJ5ZSVlUCMhIzYkIjAmPVopSER5KmUhIzY3JDckJCIvMSI+MWVlUCMhIzYkIi8lSE4jKWVxIWYhIzU3JCQiL0JieWUlZVAjISM2JCIwJj1aKUhEeSplISM2NyQ3JCQiLzEiPjFlZVAjISM2JCIvJUhOIyllcSFmISM1NyQkIjBvWCtJaWVQIyEjNyQiL2pWJT44LSJmISM1NyQ3JCQiMCo+c3VYKGVQIyEjNyQiMHc8VVAqXD5mISM2NyQkIjBvWCtJaWVQIyEjNyQiL2pWJT44LSJmISM1NyQ3JCQiMCo+c3VYKGVQIyEjNyQiMHc8VVAqXD5mISM2NyQkIjAmKlEqWyh5ZVAjISM3JCIvVmEtNWdBZiEjNTckNyQkIjBtKUg6NiplUCMhIzckIjA3MVwjKlI+JGYhIzY3JCQiMCYqUSpbKHllUCMhIzckIi9WYS01Z0FmISM1NyQ3JCQiMG0pSDo2KmVQIyEjNyQiMDcxXCMqUj4kZiEjNjckJCIvMGVEXyplUCMhIzYkIi8peTtzKSlcJGYhIzU3JDckJCIwcicpUm8yZlAjISM3JCIwWyVmdi9RV2YhIzY3JCQiLzBlRF8qZVAjISM2JCIvKXk7cykpXCRmISM1NyQ3JCQiMHInKVJvMmZQIyEjNyQiMFslZnYvUVdmISM2NyQkIjBsSydIPCJmUCMhIzckIjBeQUhOd3QlZiEjNjckNyQkIjBzKVJ6VSNmUCMhIzckIjAlR0dFNSNvJmYhIzY3JCQiMGxLJ0g8ImZQIyEjNyQiMF5BSE53dCVmISM2NyQ3JCQiMHMpUnpVI2ZQIyEjNyQiMCVHR0U1I28mZiEjNjckJCIvPlFnI0dmUCMhIzYkIjBIaiYpKlF3ZmYhIzY3JDckJCIwazVIITQlZlAjISM3JCIvNyhwZGgjcGYhIzU3JCQiLz5RZyNHZlAjISM2JCIwSGomKSpRd2ZmISM2NyQ3JCQiMGs1SCE0JWZQIyEjNyQiLzcocGRoI3BmISM1NyQkIjBfZyk9WyVmUCMhIzckIjA7IkhiODpzZiEjNjckNyQkIjBtO1hiZGZQIyEjNyQiMGNmdzctPClmISM2NyQkIjBfZyk9WyVmUCMhIzckIjA7IkhiODpzZiEjNjckNyQkIjBtO1hiZGZQIyEjNyQiMGNmdzctPClmISM2NyQkIjBhW1pTaGZQIyEjNyQiMDlLVHNRWClmISM2NyQ3JCQiMGMrUkJ1ZlAjISM3JCIwI3pNeUU5JSpmISM2NyQkIjBhW1pTaGZQIyEjNyQiMDlLVHNRWClmISM2NyQ3JCQiMGMrUkJ1ZlAjISM3JCIwI3pNeUU5JSpmISM2NyQkIjBLZCE9IXlmUCMhIzckIjB3XF0rRXAqZiEjNjckNyQkIjBrKCoqUjQqZlAjISM3JCIwR08hSEtlMWchIzY3JCQiMEtkIT0heWZQIyEjNyQiMHdcXStFcCpmISM2NyQ3JCQiMGsoKipSNCpmUCMhIzckIjBHTyFIS2UxZyEjNjckJCIwbEUhZVkqZlAjISM3JCIwaSJbK0tKNGchIzY3JDckJCIwJjM1dHcrd0IhIzckIjBrQyh6UC0+ZyEjNjckJCIwbEUhZVkqZlAjISM3JCIwaSJbK0tKNGchIzY3JDckJCIwJjM1dHcrd0IhIzckIjBrQyh6UC0+ZyEjNjckJCIvcExDOCx3QiEjNiQiL0VYNi5xQGchIzU3JDckJCIwUXJdVkNnUCMhIzckIi44L0xrOS4nISIqNyQkIi9wTEM4LHdCISM2JCIvRVg2LnFAZyEjNTckNyQkIjBRcl1WQ2dQIyEjNyQiLjgvTGs5LichIio3JCQiL0BXPiFHZ1AjISM2JCIwJ1I0SXQzTWchIzY3JDckJCIwPlVIQVRnUCMhIzckIjBPLDYpWyFSLychIzY3JCQiL0BXPiFHZ1AjISM2JCIwJ1I0SXQzTWchIzY3JDckJCIwPlVIQVRnUCMhIzckIjBPLDYpWyFSLychIzY3JCQiMHQnelJaL3dCISM3JCIwQnV4RXVrLychIzY3JDckJCIwciNwUiFlZ1AjISM3JCIwcyp5SmFNY2chIzY3JCQiMHQnelJaL3dCISM3JCIwQnV4RXVrLychIzY3JDckJCIwciNwUiFlZ1AjISM3JCIwcyp5SmFNY2chIzY3JCQiMGRuJylbaGdQIyEjNyQiMG89UzZoKWVnISM2NyQ3JCQiMDFNPylbMndCISM3JCIwM3lDKWZ5b2chIzY3JCQiMGRuJylbaGdQIyEjNyQiMG89UzZoKWVnISM2NyQ3JCQiMDFNPylbMndCISM3JCIwM3lDKWZ5b2chIzY3JCQiMCp5L2ojeWdQIyEjNyQiLyNvJXl5Q3JnISM1NyQ3JCQiMDFbTnYiNHdCISM3JCIwV21KYEU3MychIzY3JCQiMCp5L2ojeWdQIyEjNyQiLyNvJXl5Q3JnISM1NyQ3JCQiMDFbTnYiNHdCISM3JCIwV21KYEU3MychIzY3JCQiMG1iZjEmNHdCISM3JCIwKGVXXlhqJDMnISM2NyQ3JCQiMC9bPGwzaFAjISM3JCIvWyZRM25PNCchIzU3JCQiMG1iZjEmNHdCISM3JCIwKGVXXlhqJDMnISM2NyQ3JCQiMC9bPGwzaFAjISM3JCIvWyZRM25PNCchIzU3JCQiME4iPiYqPTZ3QiEjNyQiMEgvKzlAZzQnISM2NyQ3JCQiMGBHbWREaFAjISM3JCIwO1ZYajJoNSchIzY3JCQiME4iPiYqPTZ3QiEjNyQiMEgvKzlAZzQnISM2NyQ3JCQiMGBHbWREaFAjISM3JCIwO1ZYajJoNSchIzY3JCQiMC1cMnZHaFAjISM3JCIwZGlUazIlM2ghIzY3JDckJCIwODkkSEQ5d0IhIzckIjBgSl89WyY9aCEjNjckJCIwLVwydkdoUCMhIzckIjBkaVRrMiUzaCEjNjckNyQkIjA4OSRIRDl3QiEjNyQiMF9KXz1bJj1oISM2NyQkIjAncCpSalhoUCMhIzckIjBMTCZmU3o/aCEjNjckNyQkIjBaRCozJmZoUCMhIzckIjAqKT5mdCkpNDgnISM2NyQkIjAncCpSalhoUCMhIzckIjBMTCZmU3o/aCEjNjckNyQkIjBaRCozJmZoUCMhIzckIjAqKT5mdCkpNDgnISM2NyQkIjB3YU5haWhQIyEjNyQiMCRHYSFSIT1MaCEjNjckNyQkIjB2K19ed2hQIyEjNyQiMEQzbUdITTknISM2NyQkIjB3YU5haWhQIyEjNyQiMCRHYSFSIT1MaCEjNjckNyQkIjB2K19ed2hQIyEjNyQiMEQzbUdITTknISM2NyQkIjBZOyV6JXpoUCMhIzckIjA5NXNqbWI5JyEjNjckNyQkIjBaI0dcTj53QiEjNyQiMGgnSFApcGU6JyEjNjckJCIwWTsleiV6aFAjISM3JCIwOTVzam1iOSchIzY3JDckJCIwWiNHXE4+d0IhIzckIjBoJ0hQKXBlOichIzY3JCQiMC9dSFcnPndCISM3JCIwKClbXnpfejonISM2NyQ3JCQiL19ENTFAd0IhIzYkIjAoXCl6UTUkb2ghIzY3JCQiMC9dSFcnPndCISM3JCIwKClbXnpfejonISM2NyQ3JCQiL19ENTFAd0IhIzYkIjAoXCl6UTUkb2ghIzY3JCQiMFReRFY4aVAjISM3JCIwXy0mcClRLjwnISM2NyQ3JCQiMEw6KSlwRmlQIyEjNyQiMEx0J1E0diE9JyEjNjckJCIwVF5EVjhpUCMhIzckIjBfLSZwKVEuPCchIzY3JDckJCIwTDopKXBGaVAjISM3JCIwTHQnUTR2IT0nISM2NyQkIjBXQylcL0J3QiEjNyQiMExHXiZbcyM9JyEjNjckNyQkIjBVYlUiW0N3QiEjNyQiMHBoJCpbIj4kPichIzY3JCQiMFdDKVwvQndCISM3JCIwTEdeJltzIz0nISM2NyQ3JCQiMFViVSJbQ3dCISM3JCIwcGgkKlsiPiQ+JyEjNjckJCIwRipRJFxaaVAjISM3JCIwd11rdjVePichIzY3JDckJCIwLFdqJj5Fd0IhIzckIjAwXSsvS2M/JyEjNjckJCIwRipRJFxaaVAjISM3JCIwd11rdjVePichIzY3JDckJCIwLFdqJj5Fd0IhIzckIjAwXSsvS2M/JyEjNjckJCIwKCpSS2NraVAjISM3JCIvKSlbdGxcMmkhIzU3JDckJCIwcHZdN3ppUCMhIzckIjBUUTJmcyE9aSEjNjckJCIwKCpSS2NraVAjISM3JCIvKSlbdGxcMmkhIzU3JDckJCIwcHZdN3ppUCMhIzckIjBUUTJmcyE9aSEjNjckJCIwanEkZjtHd0IhIzckIjBVaGlJIykpPmkhIzY3JDckJCIwMEg7SydId0IhIzckIjB4RTk5ODBCJyEjNjckJCIwanEkZjtHd0IhIzckIjBVaGlJIykpPmkhIzY3JDckJCIwMEg7SydId0IhIzckIjB4RTk5ODBCJyEjNjckJCIwJlwmSHkpSHdCISM3JCIwQjA1JnpFS2khIzY3JDckJCIwc0VbYThqUCMhIzckIjA4OkBwYEhDJyEjNjckJCIwJlwmSHkpSHdCISM3JCIwQjA1JnpFS2khIzY3JDckJCIwc0VbYThqUCMhIzckIjA4OkBwYEhDJyEjNjckJCIwTz5HJGZKd0IhIzckIjA+JFs2TmxXaSEjNjckNyQkIjBKall6SWpQIyEjNyQiMFwuR0MlUmJpISM2NyQkIjBPPkckZkp3QiEjNyQiMD4kWzZObFdpISM2NyQ3JCQiMEpqWXpJalAjISM3JCIwXC5HQyVSYmkhIzY3JCQiMCh6JiozSkx3QiEjNyQiL1VyKCkqUXFEJyEjNTckNyQkIi9NOHIhW2pQIyEjNiQiMCY9XCR6TXlFJyEjNjckJCIwKHomKjNKTHdCISM3JCIvVXIoKSpRcUQnISM1NyQ3JCQiL004ciFbalAjISM2JCIwJj1cJHpNeUUnISM2NyQkIi9cTzYuTndCISM2JCIwNjwoelZVcGkhIzY3JDckJCIwaUpVUGxqUCMhIzckIjBAIT1XYEYhRychIzY3JCQiL1xPNi5Od0IhIzYkIjA2PCh6VlVwaSEjNjckNyQkIjBpSlVQbGpQIyEjNyQiMEAhPVdgRiFHJyEjNjckJCIwRk0rYW5qUCMhIzckIjB6NXZvND1HJyEjNjckNyQkIjAqbzswRlF3QiEjNyQiMGRvWyplciNIJyEjNjckJCIwRk0rYW5qUCMhIzckIjB6NXZvND1HJyEjNjckNyQkIjAqbzswRlF3QiEjNyQiMGRvWyplciNIJyEjNjckJCIwenBoeiVRd0IhIzckIjBkTnMhXD4lSCchIzY3JDckJCIwbkpGMStrUCMhIzckIjAkcGJYazowaiEjNjckJCIwenBoeiVRd0IhIzckIjBkTnMhXD4lSCchIzY3JDckJCIwbkpGMStrUCMhIzckIjAkcGJYazowaiEjNjckJCIwL28meT9Td0IhIzckIjBAXUYvIWUxaiEjNjckNyQkIjAxJXBYdVR3QiEjNyQiMEhYaSpwZjxqISM2NyQkIjAvbyZ5P1N3QiEjNyQiMEBdRi8hZTFqISM2NyQ3JCQiMDElcFh1VHdCISM3JCIwSFhpKnBmPGohIzY3JCQiMGFdZVE+a1AjISM3JCIwb3UlKTRsKj1qISM2NyQ3JCQiMF9caiZbVndCISM3JCIwbExwYVArTCchIzY3JCQiMGFdZVE+a1AjISM3JCIwb3UlKTRsKj1qISM2NyQ3JCQiMF9caiZbVndCISM3JCIwbExwYVArTCchIzY3JCQiMHhjMnNPa1AjISM3JCIuRGMxXThMJyEiKjckNyQkIjBycVBIX2tQIyEjNyQiMCxBdzR5Q00nISM2NyQkIjB4YzJzT2tQIyEjNyQiLkRjMV04TCchIio3JDckJCIwcnFQSF9rUCMhIzckIjAsQXc0eUNNJyEjNjckJCIwOzM+M2FrUCMhIzckIjBaQCdbXHRWaiEjNjckNyQkIjAlKip6ZChwa1AjISM3JCIwUDUkWyc9XE4nISM2NyQkIjA7Mz4zYWtQIyEjNyQiMFpAJ1tcdFZqISM2NyQ3JCQiMCUqKnpkKHBrUCMhIzckIjBQNSRbJz1cTichIzY3JCQiMFFtInA5WndCISM3JCIwbjJ6dT5oTichIzY3JDckJCIwUS8kW3Nbd0IhIzckIjB0KSoqKT5mdE8nISM2NyQkIjBRbSJwOVp3QiEjNyQiMG4yenU+aE4nISM2NyQ3JCQiMFEvJFtzW3dCISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwVHFFKSkpW3dCISM3JCIwJnoualddb2ohIzY3JDckJCIwaT1hdy9sUCMhIzckIjA0KG9cKCp6emohIzY3JCQiMFRxRSkpKVt3QiEjNyQiMCZ6LmpXXW9qISM2NyQ3JCQiMGk9YXcvbFAjISM3JCIwNChvXCgqenpqISM2NyQkIjBVOUNLMWxQIyEjNyQiMCk0LiU0KikzUSchIzY3JDckJCIwSlAiNEJfd0IhIzckIjBYdi5JU0FSJyEjNjckJCIwVTlDSzFsUCMhIzckIjApNC4lNCopM1EnISM2NyQ3JCQiMEpQIjRCX3dCISM3JCIwWHYuSVNBUichIzY3JCQiMGgjUil5QmxQIyEjNyQiMFUwNGt0S1InISM2NyQ3JCQiMHAmPXkpUmxQIyEjNyQiMCJRMV4zby9rISM2NyQkIjBoI1IpeUJsUCMhIzckIjBVMDRrdEtSJyEjNjckNyQkIjBwJj15KVJsUCMhIzckIjAiUTFeM28vayEjNjckJCIwLU4kejdhd0IhIzckIjBHTHg1ZWNTJyEjNjckNyQkIjA5IjR2dWJ3QiEjNyQiMD1fPFNAclQnISM2NyQkIjAtTiR6N2F3QiEjNyQiMEdMeDVlY1MnISM2NyQ3JCQiMDkiNHZ1YndCISM3JCIwPV88U0ByVCchIzY3JCQiMFZjd3plbFAjISM3JCIwcHJuW1UhPWshIzY3JDckJCIwJCkpWyk0dmxQIyEjNyQiMGFTQyY+Y0hrISM2NyQkIjBWY3d6ZWxQIyEjNyQiMHBybltVIT1rISM2NyQ3JCQiMCQpKVspNHZsUCMhIzckIjBhU0MmPmNIayEjNjckJCIwKnA/VWpkd0IhIzckIjBqMjx5RS9WJyEjNjckNyQkIjBDJT5aRmZ3QiEjNyQiLypHSl0tP1cnISM1NyQkIjAqcD9VamR3QiEjNyQiMGoyPHlFL1YnISM2NyQ3JCQiMEMlPlpGZndCISM3JCIvKkdKXS0/VychIzU3JCQiMFYpcDZSZndCISM3JCIwIj1uJyo0IkdXJyEjNjckNyQkIjAiPXhCL2h3QiEjNyQiMEU8UTBWV1gnISM2NyQkIjBWKXA2UmZ3QiEjNyQiMCI9bicqNCJHVychIzY3JDckJCIwIj14Qi9od0IhIzckIjBFPFEwVldYJyEjNjckJCIwKDNnMzpod0IhIzckIjAoUnVCXj5iayEjNjckNyQkIjBzY2I3R21QIyEjNyQiMGkwWGckKW9ZJyEjNjckJCIwKDNnMzpod0IhIzckIjAoUnVCXj5iayEjNjckNyQkIjBzY2I3R21QIyEjNyQiMGkwWGckKW9ZJyEjNjckJCIwJEdWSSJIbVAjISM3JCIvMykzPHp2WSchIzU3JDckJCIwaEBSJmVrd0IhIzckIjApUj5iVEt6ayEjNjckJCIwJEdWSSJIbVAjISM3JCIvMykzPHp2WSchIzU3JDckJCIwaEBSJmVrd0IhIzckIjApUj5iVEt6ayEjNjckJCIwLHIleW5rd0IhIzckIi8oKSlSOGoqemshIzU3JDckJCIwPGgpM09td0IhIzckIjBNIyllcWs8XCchIzY3JCQiMCxyJXlua3dCISM3JCIvKCkpUjhqKnprISM1NyQ3JCQiMDxoKTNPbXdCISM3JCIwTSMpZXFrPFwnISM2NyQkIjBWWEVYa21QIyEjNyQiMCo+SDhxTSNcJyEjNjckNyQkIjBsIyoqKVEib3dCISM3JCIvMmRjXz8vbCEjNTckJCIwVlhFWGttUCMhIzckIjAqPkg4cU0jXCchIzY3JDckJCIwbCMqKilRIm93QiEjNyQiLzJkY18/L2whIzU3JCQiMCVRcl5Ab3dCISM3JCIwKFF4NzN0L2whIzY3JDckJCIwazhxPipwd0IhIzckIjAxZnMhZWs7bCEjNjckJCIwJVFyXkBvd0IhIzckIjAoUXg3M3QvbCEjNjckNyQkIjBrOHE+KnB3QiEjNyQiMDFmcyFlaztsISM2NyQkIjBvIUh5KSpwd0IhIzckIjBNXlNfOXJeJyEjNjckNyQkIjBpdS0uPG5QIyEjNyQiMFVaek4nM0hsISM2NyQkIjBvIUh5KSpwd0IhIzckIjBNXlNfOXJeJyEjNjckNyQkIjBpdS0uPG5QIyEjNyQiMFVaek4nM0hsISM2NyQkIjBII3BId3J3QiEjNyQiMFFIZDopXEhsISM2NyQ3JCQiMCYpXCsqW3R3QiEjNyQiMHlOJzNwX1RsISM2NyQkIjBII3BId3J3QiEjNyQiMFFIZDopXEhsISM2NyQ3JCQiMCYpXCsqW3R3QiEjNyQiMHlOJzNwX1RsISM2NyQkIjAjXEMyYXR3QiEjNyQiMFdiTnEiKT1hJyEjNjckNyQkIjAzNF14X25QIyEjNyQiMDlDJGZ1J1JiJyEjNjckJCIwI1xDMmF0d0IhIzckIjBXYk5xIik9YSchIzY3JDckJCIwMzRdeF9uUCMhIzckIjA5QyRmdSdSYichIzY3JCQiMFQqbzRLdndCISM3JCIwJnBjcl5FYWwhIzY3JDckJCIwNl5sb3FuUCMhIzckIi9ELDUhM2tjJyEjNTckJCIwVCpvNEt2d0IhIzckIjAmcGNyXkVhbCEjNjckNyQkIjA2XmxvcW5QIyEjNyQiL0QsNSEza2MnISM1NyQkIjA4WiNRNXh3QiEjNyQiMGtaZWJbbWMnISM2NyQ3JCQiMFYhZkMnKXl3QiEjNyQiMCczcWcmWyl5bCEjNjckJCIwOFojUTV4d0IhIzckIjBrWmViW21jJyEjNjckNyQkIjBWIWZDJyl5d0IhIzckIjAnM3FnJlspeWwhIzY3JCQiMGIhKkgqKSl5d0IhIzckIjA7bGgmPS56bCEjNjckNyQkIjAsKT0qZTFvUCMhIzckIjBBKlE2IipHImYnISM2NyQkIjBiISpIKikpeXdCISM3JCIwO2xoJj0uemwhIzY3JDckJCIwLCk9KmUxb1AjISM3JCIwQSpRNiIqRyJmJyEjNjckJCIwJ1IiUngxb1AjISM3JCIwI3lgc11UImYnISM2NyQ3JCQiMF5wKnlYI29QIyEjNyQiMGV4P21IUGcnISM2NyQkIjAnUiJSeDFvUCMhIzckIjAjeWBzXVQiZichIzY3JDckJCIwXnAqeVgjb1AjISM3JCIwZXg/bUhQZychIzY3JCQiME1UJ3pZI29QIyEjNyQiMHR4JDQjKXoubSEjNjckNyQkIjAqXEcmZlVvUCMhIzckIjAlZnc3LTw7bSEjNjckJCIwTVQnelkjb1AjISM3JCIwdHgkNCMpei5tISM2NyQ3JCQiMCpcRyZmVW9QIyEjNyQiMCVmdzctPDttISM2NyQkIjBGTzpoVW9QIyEjNyQiMHA3QkUiPTttISM2NyQ3JCQiMCk+ZGRnJW9QIyEjNyQiMCpcOTp2Yj1tISM2NyQkIjBGTzpoVW9QIyEjNyQiMHA3QkUiPTttISM2NyQ3JCQiMCk+ZGRnJW9QIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWm5kRToieUIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQyVRMmZzIVEjISM3JCIwLiNINikqUUdxISM3NyQkIjBabmRFOiJ5QiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjApPmRkZyVvUCMhIzckIjAqXDk6dmI9bSEjNjckJCIwImVpeTAnb1AjISM3JCIwI3lSLVVjR20hIzY3JDckJCIwKilHX2tnb1AjISM3JCIvVlhqMmhHbSEjNTckJCIwImVpeTAnb1AjISM3JCIwI3lSLVVjR20hIzY3JDckJCIwKilHX2tnb1AjISM3JCIvVlhqMmhHbSEjNTckJCIwKG9NdSZ5b1AjISM3JCIwT3gxMFo0aychIzY3JDckJCIwb0FQc3lvUCMhIzckIjBtVVRKXjVrJyEjNjckJCIwKG9NdSZ5b1AjISM3JCIwT3gxMFo0aychIzY3JDckJCIwb0FQc3lvUCMhIzckIjBtVVRKXjVrJyEjNjckJCIwKDMoW2YnKm9QIyEjNyQiMFpGJT4pSExsJyEjNjckNyQkIjAoNFJGbypvUCMhIzckIjAtSlsnPVxgbSEjNjckJCIwKDMoW2YnKm9QIyEjNyQiMFpGJT4pSExsJyEjNjckNyQkIjAoNFJGbypvUCMhIzckIjAtSlsnPVxgbSEjNjckJCIwL2U6azlwUCMhIzckIjBsJ0cvRHJsbSEjNjckNyQkIjBEd3YmXCJwUCMhIzckIjBRPmJUS2ZtJyEjNjckJCIwL2U6azlwUCMhIzckIjBsJ0cvRHJsbSEjNjckNyQkIjBEd3YmXCJwUCMhIzckIjBRPmJUS2ZtJyEjNjckJCIwMHNWcktwUCMhIzckIjBQcmA1JjR5bSEjNjckNyQkIjAoW0c5SiRwUCMhIzckIjB1MmknSFB5bSEjNjckJCIwMHNWcktwUCMhIzckIjBQcmA1JjR5bSEjNjckNyQkIjAoW0c5SiRwUCMhIzckIjB1MmknSFB5bSEjNjckJCIwKnlsNTMmcFAjISM3JCIwJFs+SndaIXAnISM2NyQ3JCQiMFhLW0hecFAjISM3JCIvaCpvXjgzcCchIzU3JCQiMCp5bDUzJnBQIyEjNyQiMCRbPkp3WiFwJyEjNjckNyQkIjBYS1tIXnBQIyEjNyQiL2gqb144M3AnISM1NyQkIjAtSVckKm9wUCMhIzckIi9bKSlvKydHcSchIzU3JDckJCIwRjNLXXBwUCMhIzckIjBZJWVuU0QubiEjNjckJCIwLUlXJCpvcFAjISM3JCIvWykpbysnR3EnISM1NyQ3JCQiMEYzS11wcFAjISM3JCIwWSVlblNELm4hIzY3JCQiMEpzSDMoKXBQIyEjNyQiMFpdclVVX3InISM2NyQ3JCQiMFRsbnQoKXBQIyEjNyQiMCRHRj1ZcDpuISM2NyQkIjBKc0gzKClwUCMhIzckIjBaXXJVVV9yJyEjNjckNyQkIjBUbG50KClwUCMhIzckIjAkR0Y9WXA6biEjNjckJCIwZE5qRDBxUCMhIzckIi8qR2VxQ3dzJyEjNTckNyQkIjBmaGEqZit4QiEjNyQiMD5oKm9eOEduISM2NyQkIjBkTmpEMHFQIyEjNyQiLypHZXFDd3MnISM1NyQ3JCQiMGZoYSpmK3hCISM3JCIwPmgqb144R24hIzY3JCQiMCxyV1hCcVAjISM3JCIvbDIwcCtTbiEjNTckNyQkIjAyYiR6VS14QiEjNyQiMGJcJz5kZFNuISM2NyQkIjAscldYQnFQIyEjNyQiL2wyMHArU24hIzU3JDckJCIwMmIkelUteEIhIzckIjBiXCc+ZGRTbiEjNjckJCIwTlYoeTsveEIhIzckIjBXPDAtKlFfbiEjNjckNyQkIi91cCplVXFQIyEjNiQiMCJ6THFpLGBuISM2NyQkIjBOVih5Oy94QiEjNyQiMFc8MC0qUV9uISM2NyQ3JCQiL3VwKmVVcVAjISM2JCIwInpMcWksYG4hIzY3JCQiMFByIUgqZnFQIyEjNyQiMDI3QzByWncnISM2NyQ3JCQiMDZTbCM0MXhCISM3JCIwRkU1I29YbG4hIzY3JCQiMFByIUgqZnFQIyEjNyQiMDI3QzByWncnISM2NyQ3JCQiMDZTbCM0MXhCISM3JCIwRkU1I29YbG4hIzY3JCQiMEBPSD95cVAjISM3JCIwL1ApM0k6eG4hIzY3JDckJCIwKTNIKEd6cVAjISM3JCIwajk8UCgqeXgnISM2NyQkIjBAT0g/eXFQIyEjNyQiMC9QKTNJOnhuISM2NyQ3JCQiMCkzSChHenFQIyEjNyQiMGo5PFAoKnl4JyEjNjckJCIwQE1IXSc0eEIhIzckIi90WSIpW2AqeSchIzU3JDckJCIweW9Xbig0eEIhIzckIjAqSFNBekwheichIzY3JCQiMEBNSF0nNHhCISM3JCIvdFkiKVtgKnknISM1NyQ3JCQiMHlvV24oNHhCISM3JCIwKkhTQXpMIXonISM2NyQkIjAlWycqR1s2eEIhIzckIjA9RDFuOz4hbyEjNjckNyQkIjAxXCEpMztyUCMhIzckIjBOIjR0JXlGIW8hIzY3JCQiMCVbJypHWzZ4QiEjNyQiMD1EMW47PiFvISM2NyQ3JCQiMDFcISkzO3JQIyEjNyQiME4iNHQleUYhbyEjNjckJCIwZm0leUo4eEIhIzckIjAxQ1hRKUg5byEjNjckNyQkIjAmPWNEWDh4QiEjNyQiMHJ6UC0+XyJvISM2NyQkIjBmbSV5Sjh4QiEjNyQiMDFDWFEpSDlvISM2NyQ3JCQiMCY9Y0RYOHhCISM3JCIwcnpQLT5fIm8hIzY3JCQiMCZcM2E6OnhCISM3JCIwSCJvOStvRW8hIzY3JDckJCIubiUqKUg6eEIhIzUkIjAyb1dkZncjbyEjNjckJCIwJlwzYTo6eEIhIzckIjBIIm85K29FbyEjNjckNyQkIi5uJSopSDp4QiEjNSQiMDJvV2RmdyNvISM2NyQkIi9cV2EqcHJQIyEjNiQiMCJlXWw6MVJvISM2NyQ3JCQiMG8lZnk5PHhCISM3JCIwVmNeNyssJW8hIzY3JCQiL1xXYSpwclAjISM2JCIwImVdbDoxUm8hIzY3JDckJCIwbyVmeTk8eEIhIzckIjBWY143KywlbyEjNjckJCIwIj5teiQpPXhCISM3JCIwUkZtLlY5Jm8hIzY3JDckJCIwb1BHKioqPXhCISM3JCIweldlblNEJm8hIzY3JCQiMCI+bXokKT14QiEjNyQiMFJGbS5WOSZvISM2NyQ3JCQiMG9QRyoqKj14QiEjNyQiMHpXZW5TRCZvISM2NyQkIjBwazMkbz94QiEjNyQiMCNvVUNXI1EnbyEjNjckNyQkIjB6bU5gM3NQIyEjNyQiMDpMbEEiKVwnbyEjNjckJCIwcGszJG8/eEIhIzckIjAjb1VDVyNRJ28hIzY3JDckJCIwem1OYDNzUCMhIzckIjA6TGxBIilcJ28hIzY3JCQiMG9FcElEc1AjISM3JCIwVztEdDBpKG8hIzY3JDckJCIwO20jKjRGc1AjISM3JCIwXkBzeEB1KG8hIzY3JCQiMG9FcElEc1AjISM3JCIwVztEdDBpKG8hIzY3JDckJCIwO20jKjRGc1AjISM3JCIwXkBzeEB1KG8hIzY3JCQiMHRfaiFRQ3hCISM3JCIwRyFwbHBlKSlvISM2NyQ3JCQiMHZnKilvWHNQIyEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMHRfaiFRQ3hCISM3JCIwRyFwbHBlKSlvISM2NyQ3JCQiMHZnKilvWHNQIyEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMGp2PUxpc1AjISM3JCIwJ2U9OiJvNCFwISM2NyQ3JCQiMG5SXklrc1AjISM3JCIwQilmeUdJLXAhIzY3JCQiMGp2PUxpc1AjISM3JCIwJ2U9OiJvNCFwISM2NyQ3JCQiMG5SXklrc1AjISM3JCIwQilmeUdJLXAhIzY3JCQiMFF1QSkzR3hCISM3JCIwQz1cPVxMInAhIzY3JDckJCIwa25pJUhHeEIhIzckIjBmJ0dITXU5cCEjNjckJCIwUXVBKTNHeEIhIzckIjBDPVw9XEwicCEjNjckNyQkIjBrbmklSEd4QiEjNyQiMGYnR0hNdTlwISM2NyQkIjA5XyVlJSpIeEIhIzckIjBYIio+PElkI3AhIzY3JDckJCIwbmNRaCx0UCMhIzckIjAmXCgqelI9RnAhIzY3JCQiMDlfJWUlKkh4QiEjNyQiMFgiKj48SWQjcCEjNjckNyQkIjBuY1FoLHRQIyEjNyQiMCZcKCp6Uj1GcCEjNjckJCIwJEdIZSE9dFAjISM3JCIwaiE+JDM2IlFwISM2NyQ3JCQiMFc+YEk/dFAjISM3JCIwSmoxYEMnUnAhIzY3JCQiMCRHSGUhPXRQIyEjNyQiMGohPiQzNiJRcCEjNjckNyQkIjBXPmBJP3RQIyEjNyQiMEpqMWBDJ1JwISM2NyQkIjA6YEdvT3RQIyEjNyQiMGBGXiI+XF1wISM2NyQ3JCQiMEVZPy1SdFAjISM3JCIwbl44M2w/JnAhIzY3JCQiMDpgR29PdFAjISM3JCIwYEZeIj5cXXAhIzY3JDckJCIwRVk/LVJ0UCMhIzckIjBuXjgzbD8mcCEjNjckJCIwQCdcTGBOeEIhIzckIjBPSk1tc0cncCEjNjckNyQkIjAyJClbd2R0UCMhIzckIjAuUz9qMFgncCEjNjckJCIwQCdcTGBOeEIhIzckIjBPSk1tc0cncCEjNjckNyQkIjAyJClbd2R0UCMhIzckIjAuUz9qMFgncCEjNjckJCIwJCl6dSt1dFAjISM3JCIwJFsqb0xgXyhwISM2NyQ3JCQiMDsoeUpsUHhCISM3JCIwUkdGPVlwKHAhIzY3JCQiMCQpenUrdXRQIyEjNyQiMCRbKm9MYF8ocCEjNjckNyQkIjA7KHlKbFB4QiEjNyQiMFJHRj1ZcChwISM2NyQkIi1PMUZSeEIhIiokIi8oRzAkUmooKXAhIzU3JDckJCIwSnpQSyZSeEIhIzckIjB2O010J1EqKXAhIzY3JCQiLU8xRlJ4QiEiKiQiLyhHMCRSaigpcCEjNTckNyQkIjBKelBLJlJ4QiEjNyQiMHY7TXQnUSopcCEjNjckJCIvMTdKOVR4QiEjNiQiMEF5Nlc5KysoISM2NyQ3JCQiMDRHPzk5dVAjISM3JCIwNjBUR0Y9KyghIzY3JCQiLzE3SjlUeEIhIzYkIjBBeTZXOSsrKCEjNjckNyQkIjA0Rz85OXVQIyEjNyQiMDYwVEdGPSsoISM2NyQkIjA+NyV6LFZ4QiEjNyQiL29Qd1tSN3EhIzU3JDckJCIwOXZUKUhWeEIhIzckIjBbJHpNeUU5cSEjNjckJCIwPjcleixWeEIhIzckIi9vUHdbUjdxISM1NyQ3JCQiMDl2VClIVnhCISM3JCIwWyR6TXlFOXEhIzY3JCQiMEhnTiYqW3VQIyEjNyQiMHBuJ0dfeENxISM2NyQ3JCQiMGtiRCY9WHhCISM3JCIwJT1bJlEzbi0oISM2NyQkIjBIZ04mKlt1UCMhIzckIjBwbidHX3hDcSEjNjckNyQkIjBrYkQmPVh4QiEjNyQiMCQ9WyZRM24tKCEjNjckJCIwQ1U3dm51UCMhIzckIjBYKVwwYjpQcSEjNjckNyQkIjBiZl11cXVQIyEjNyQiLy08TypbIlJxISM1NyQkIjBDVTd2bnVQIyEjNyQiMFgpXDBiOlBxISM2NyQ3JCQiMGJmXXVxdVAjISM3JCIvLTxPKlsiUnEhIzU3JCQiMGtTUWQnW3hCISM3JCIwImVWLWRgXHEhIzY3JDckJCIwdzdDbSpbeEIhIzckIjBjZW9bKmVecSEjNjckJCIwa1NRZCdbeEIhIzckIjAiZVYtZGBccSEjNjckNyQkIjB3N0NtKlt4QiEjNyQiMGNlb1sqZV5xISM2NyQkIjBHMDRVMHZQIyEjNyQiME5CNCNlIj4xKCEjNjckNyQkIi9eI1tnM3ZQIyEjNiQiMCNwYVArLmtxISM2NyQkIjBHMDRVMHZQIyEjNyQiME5CNCNlIj4xKCEjNjckNyQkIi9eI1tnM3ZQIyEjNiQiMCNwYVArLmtxISM2NyQkIjA0XUVIQ3ZQIyEjNyQiMDh2LSdlSHVxISM2NyQ3JCQiL0pgc3ZfeEIhIzYkIjBHTiMpZXFrMighIzY3JCQiMDRdRUhDdlAjISM3JCIwOHYtJ2VIdXEhIzY3JDckJCIvSmBzdl94QiEjNiQiMEdOIyllcWsyKCEjNjckJCIwXzokKj1WdlAjISM3JCIwOT8oPmVuJzMoISM2NyQ3JCQiMCJmMGxsYXhCISM3JCIwa0IqUTYiKikzKCEjNjckJCIwXzokKj1WdlAjISM3JCIwOT8oPmVuJzMoISM2NyQ3JCQiMCJmMGxsYXhCISM3JCIwa0IqUTYiKikzKCEjNjckJCIvbUg0QGN4QiEjNiQiMG4vV3FiISo0KCEjNjckNyQkIjAtZjxlbHZQIyEjNyQiLjcnKm9eODUoISIqNyQkIi9tSDRAY3hCISM2JCIwbi9XcWIhKjQoISM2NyQ3JCQiMC1mPGVsdlAjISM3JCIuNycqb144NSghIio3JCQiMChHS2I1ZXhCISM3JCIwX3diXU45NighIzY3JDckJCIwKil6VmklZXhCISM3JCIwTysuQyN6OHIhIzY3JCQiMChHS2I1ZXhCISM3JCIwX3diXU45NighIzY3JDckJCIwKil6VmklZXhCISM3JCIwTysuQyN6OHIhIzY3JCQiMGFhWS0rd1AjISM3JCIwdj8/QjpRNyghIzY3JDckJCIwR0k0cC53UCMhIzckIjBzKSk0ektpNyghIzY3JCQiMGFhWS0rd1AjISM3JCIwdj8/QjpRNyghIzY3JDckJCIwR0k0cC53UCMhIzckIjBzKSk0ektpNyghIzY3JCQiMHRgJz0hPndQIyEjNyQiMHhwJHpbPk9yISM2NyQ3JCQiMGUqeiN5QXdQIyEjNyQiMDN4O010J1FyISM2NyQkIjB0YCc9IT53UCMhIzckIjB4cCR6Wz5PciEjNjckNyQkIjBlKnojeUF3UCMhIzckIjAzeDtNdCdRciEjNjckJCIwTTFsLlF3UCMhIzckIjAnUkJdV2RbciEjNjckNyQkIjAneU0pKj1reEIhIzckIjBXbEIqUTZeciEjNjckJCIwTTFsLlF3UCMhIzckIjAnUkJdV2RbciEjNjckNyQkIjAneU0pKj1reEIhIzckIjBXbEIqUTZeciEjNjckJCIwVFEpenFseEIhIzckIi8mKlJSUiY0OyghIzU3JDckJCIvI0grL2h3UCMhIzYkIi9RMFZXYmpyISM1NyQkIjBUUSl6cWx4QiEjNyQiLyYqUlJSJjQ7KCEjNTckNyQkIi8jSCsvaHdQIyEjNiQiL1EwVldianIhIzU3JCQiMC5bbjl3d1AjISM3JCIwdmtITkxMPCghIzY3JDckJCIwIz5tMC1veEIhIzckIjA7VVAqXCpmPCghIzY3JCQiMC5bbjl3d1AjISM3JCIwdmtITkxMPCghIzY3JDckJCIwIz5tMC1veEIhIzckIjA7VVAqXCpmPCghIzY3JCQiMCV6SlFfcHhCISM3JCIwKXpYKG83ZD0oISM2NyQ3JCQiMDlMalIqcHhCISM3JCIwX0lXYU4lKT0oISM2NyQkIjAlekpRX3B4QiEjNyQiMCl6WChvN2Q9KCEjNjckNyQkIjA4TGpSKnB4QiEjNyQiMF9JV2FOJSk9KCEjNjckJCIwQCNbYFZyeEIhIzckIjAuKEhZPjQpPighIzY3JDckJCIwIlttNSc9eFAjISM3JCIwKSk9XjR3Mz8oISM2NyQkIjBAI1tgVnJ4QiEjNyQiMC4oSFk+NCk+KCEjNjckNyQkIjAiW201Jz14UCMhIzckIjApKT1eNHczPyghIzY3JCQiMFReU1xMeFAjISM3JCIwVXdPN3IvQCghIzY3JDckJCIwJCkpUl55dHhCISM3JCIwQzJlaztMQCghIzY3JCQiMFReU1xMeFAjISM3JCIwVXdPN3IvQCghIzY3JDckJCIwJCkpUl55dHhCISM3JCIwQzJlaztMQCghIzY3JCQiMDJDJmVFdnhCISM3JCIwXDVXQV1HQSghIzY3JDckJCIwKFJ5OnJ2eEIhIzckIi9jXCc+ZGRBKCEjNTckJCIwMkMmZUV2eEIhIzckIjBcNVdBXUdBKCEjNjckNyQkIjAoUnk6cnZ4QiEjNyQiL2NcJz5kZEEoISM1NyQkIjBuJEdZPXh4QiEjNyQiMDl3L0RIX0IoISM2NyQ3JCQiMChcOS9reHhCISM3JCIwJ1I9Wng+UXMhIzY3JCQiMG4kR1k9eHhCISM3JCIwOXcvREhfQighIzY3JDckJCIwKFw5L2t4eEIhIzckIjAnUj1aeD5RcyEjNjckJCIwXyJwZTV6eEIhIzckIjBQM3Y+M3dDKCEjNjckNyQkIjBoKT48ZHp4QiEjNyQiMEtzeUhRMUQoISM2NyQkIjBfInBlNXp4QiEjNyQiMFAzdj4zd0MoISM2NyQ3JCQiMGgpPjxkenhCISM3JCIwS3N5SFExRCghIzY3JCQiMCZIUyZINXlQIyEjNyQiMEs3bTEoKSpmcyEjNjckNyQkIjBWMGMwOnlQIyEjNyQiMG9nJlspeUlFKCEjNjckJCIwJkhTJkg1eVAjISM3JCIwSzdtMSgpKmZzISM2NyQ3JCQiMFYwYzA6eVAjISM3JCIwb2cmWyl5SUUoISM2NyQkIjBObGdiSHlQIyEjNyQiMG89KmVlT3NzISM2NyQ3JCQiMHJld1RNeVAjISM3JCIwL1wjKlI+YkYoISM2NyQkIjBObGdiSHlQIyEjNyQiMG89KmVlT3NzISM2NyQ3JCQiMHJld1RNeVAjISM3JCIwL1wjKlI+YkYoISM2NyQkIjBBQDUlKVt5UCMhIzckIjA+SExkV1pHKCEjNjckNyQkIjBuRVohUSZ5UCMhIzckIi91JCpcKmZ6RyghIzU3JCQiMEFANSUpW3lQIyEjNyQiMD5ITGRXWkcoISM2NyQ3JCQiMG5FWiFRJnlQIyEjNyQiL3UkKlwqZnpHKCEjNTckJCIwIiopZlwib3lQIyEjNyQiMFooKj5AQnJIKCEjNjckNyQkIjBPJno6Syh5UCMhIzckIjB3RDFdKy9JKCEjNjckJCIwIiopZlwib3lQIyEjNyQiMFooKj5AQnJIKCEjNjckNyQkIjBPJno6Syh5UCMhIzckIjB3RDFdKy9JKCEjNjckJCIwLjhHWygpeVAjISM3JCIwQXE7eCwmNHQhIzY3JDckJCIwI0heXkUqeVAjISM3JCIwODk4MFRHSighIzY3JCQiMC44R1soKXlQIyEjNyQiMEFxO3gsJjR0ISM2NyQ3JCQiMCNIXl5FKnlQIyEjNyQiMDg5ODBUR0ooISM2NyQkIjAlR0hSbyF6UCMhIzckIjBvVW5EISk9SyghIzY3JDckJCIwJWVCNkAielAjISM3JCIwXC0/ZyJHRHQhIzY3JCQiMCVHSFJvIXpQIyEjNyQiMG9VbkQhKT1LKCEjNjckNyQkIjAlZUI2QCJ6UCMhIzckIjBbLT9nIkdEdCEjNjckJCIwLSpSP2kjelAjISM3JCIwJz0mR21lVUwoISM2NyQ3JCQiMGwlZSZmSnpQIyEjNyQiMCYzcF9Ac1B0ISM2NyQkIjAtKlI/aSN6UCMhIzckIjAnPSZHbWVVTCghIzY3JDckJCIwbCVlJmZKelAjISM3JCIwJjNwX0BzUHQhIzY3JCQiMC1oWmlYelAjISM3JCIwUiNSJSpwall0ISM2NyQ3JCQiMFtWUjVeelAjISM3JCIwQHpMcWksTighIzY3JCQiMC1oWmlYelAjISM3JCIwUiNSJSpwall0ISM2NyQ3JCQiMFtWUjVeelAjISM3JCIwQHpMcWksTighIzY3JCQiME1SUDBselAjISM3JCIwKT0rWl8sZnQhIzY3JDckJCIwJUhJUDEoelAjISM3JCIwZG5TRC5FTyghIzY3JCQiME1SUDBselAjISM3JCIwKT0rWl8sZnQhIzY3JDckJCIwJUhJUDEoelAjISM3JCIwZG5TRC5FTyghIzY3JCQiMEFral0lKXpQIyEjNyQiMCUpKnlCTVJydCEjNjckNyQkIjBHJ0clPiEqelAjISM3JCIwJGZ2L1EvdnQhIzY3JCQiMEFral0lKXpQIyEjNyQiMCUpKnlCTVJydCEjNjckNyQkIjBHJ0clPiEqelAjISM3JCIwJGZ2L1EvdnQhIzY3JCQiMGYsSylSK3lCISM3JCIwZlRIX3JQUSghIzY3JDckJCIwLWhpeDQheUIhIzckIjBIV2FOJVsoUSghIzY3JCQiMGYsSylSK3lCISM3JCIwZlRIX3JQUSghIzY3JDckJCIwLWhpeDQheUIhIzckIjBIV2FOJVsoUSghIzY3JCQiMEwqbyRbQiF5QiEjNyQiMGVmaWFcaFIoISM2NyQ3JCQiMGhdPVFIIXlCISM3JCIwbEtoIVwjKipSKCEjNjckJCIwTCpvJFtCIXlCISM3JCIwZWZpYVxoUighIzY3JDckJCIwaF09UUgheUIhIzckIjBsS2ghXCMqKlIoISM2NyQkIjAuQXUrViF5QiEjNyQiMHZWXVxGJjN1ISM2NyQ3JCQiMCJmWjYhXCF5QiEjNyQiMCxAb1hsQlQoISM2NyQkIjAuQXUrViF5QiEjNyQiMHZWXVxGJjN1ISM2NyQ3JCQiMCJmWjYhXCF5QiEjNyQiMCxAb1hsQlQoISM2NyQkIjAiRyNbYmkheUIhIzckIjBLUHpPMDRVKCEjNjckNyQkIjAuQFptbyF5QiEjNyQiMFA0disxW1UoISM2NyQkIjAiRyNbYmkheUIhIzckIjBLUHpPMDRVKCEjNjckNyQkIjAuQFptbyF5QiEjNyQiMFA0disxW1UoISM2NyQkIjBqLWs3IzN5QiEjNyQiMC0tTDskR0x1ISM2NyQ3JCQiMD5gSE0pM3lCISM3JCIwdCg+ZWxDUHUhIzY3JCQiMGotazcjM3lCISM3JCIwLS1MOyRHTHUhIzY3JDckJCIwPmBITSkzeUIhIzckIjB0KD5lbENQdSEjNjckJCIwW3hEcywieUIhIzckIjAkUiEpejNtWHUhIzY3JDckJCIwcm5oLzMieUIhIzckIjA0JykpM3JvXHUhIzY3JCQiMFt4RHMsInlCISM3JCIwJFIhKXozbVh1ISM2NyQ3JCQiMHJuaC8zInlCISM3JCIwNCcpKTNyb1x1ISM2NyQkIjA8NTpNQCJ5QiEjNyQiMCNSTEImUSFldSEjNjckNyQkIjAtPDt4RiJ5QiEjNyQiMFh1JmZ3N2l1ISM2NyQkIjA8NTpNQCJ5QiEjNyQiMCNSTEImUSFldSEjNjckNyQkIjAsPDt4RiJ5QiEjNyQiMFh1JmZ3N2l1ISM2NyQkIjB6V1QpNDl5QiEjNyQiMCJbJzM0Oy9aKCEjNjckNyQkIjByUj9fWiJ5QiEjNyQiMCJHRTUjb1haKCEjNjckJCIweldUKTQ5eUIhIzckIjAiWyczNDsvWighIzY3JDckJCIwclI/X1oieUIhIzckIjAiR0U1I29YWighIzY3JCQiMFtkL2xnInlCISM3JCIwOHRDZSR6I1soISM2NyQ3JCQiMCJvXydIbiJ5QiEjNyQiMDxeNHczcVsoISM2NyQkIjBbZC9sZyJ5QiEjNyQiMDh0Q2UkeiNbKCEjNjckNyQkIjAib18nSG4ieUIhIzckIjA8XjR3M3FbKCEjNjckJCIwNmsvTSE9eUIhIzckIjAoejUpKjQ8JlwoISM2NyQ3JCQiMCkzaSU0KD15QiEjNyQiMGBSO0pcJSpcKCEjNjckJCIwNmsvTSE9eUIhIzckIjAoejUpKjQ8JlwoISM2NyQ3JCQiMCkzaSU0KD15QiEjNyQiMGBSO0pcJSpcKCEjNjckJCIwbCNmYSs/eUIhIzckIjA0KFJPJFt2XSghIzY3JDckJCIwdTJzInA/eUIhIzckIjAqeUtpKSopPV4oISM2NyQkIjBsI2ZhKz95QiEjNyQiMDQoUk8kW3ZdKCEjNjckNyQkIjB1MnMicD95QiEjNyQiMCp5S2kpKik9XighIzY3JCQiMDNiNXo+I3lCISM3JCIwa3RJZ0QqPnYhIzY3JDckJCIwWCQpSHdFI3lCISM3JCIwRDtJVElWXyghIzY3JCQiMDNiNXo+I3lCISM3JCIwa3RJZ0QqPnYhIzY3JDckJCIwWCQpSHdFI3lCISM3JCIwRDtJVElWXyghIzY3JCQiMCJlNV8mUiN5QiEjNyQiMC80NHotQmAoISM2NyQ3JCQiMCxWS2pZI3lCISM3JCIwaC9QJzR4T3YhIzY3JCQiMCJlNV8mUiN5QiEjNyQiMC80NHotQmAoISM2NyQ3JCQiMCxWS2pZI3lCISM3JCIwaC9QJzR4T3YhIzY3JCQiMCdlUE8kZiN5QiEjNyQiMHojSC8qellhKCEjNjckNyQkIjAnPTRGbEV5QiEjNyQiMChIUjk6QFx2ISM2NyQkIjAnZVBPJGYjeUIhIzckIjB6I0gvKnpZYSghIzY3JDckJCIwJz00RmxFeUIhIzckIjAoSFI5OkBcdiEjNjckJCIwZD9aOXojeUIhIzckIjBKI1tTcDBkdiEjNjckNyQkIjBeKFFYa0d5QiEjNyQiMEwiM2w/bGh2ISM2NyQkIjBkP1o5eiN5QiEjNyQiMEojW1NwMGR2ISM2NyQ3JCQiL3ZRWGtHeUIhIzYkIjBMIjNsP2xodiEjNjckJCIwKnpTdiopSHlCISM3JCIwKjQuMFJWcHYhIzY3JDckJCIwaDVwUTEkeUIhIzckIjBwcGRoIzR1diEjNjckJCIwKnpTdiopSHlCISM3JCIwKjQuMFJWcHYhIzY3JDckJCIwaDVwUTEkeUIhIzckIjBwcGRoIzR1diEjNjckJCIwNz0pSCk9JHlCISM3JCIwJ1JeJHo1PWUoISM2NyQ3JCQiMCNSLV9qS3lCISM3JCIwMGVrO0xsZSghIzY3JCQiMDc9KUgpPSR5QiEjNyQiMCdSXiR6NT1lKCEjNjckNyQkIjAjUi1fakt5QiEjNyQiMDBlaztMbGUoISM2NyQkIjBZIkczKFEkeUIhIzckIi86KFtnKD0lZighIzU3JDckJCIwamo6TVkkeUIhIzckIjBUWXJydCopZighIzY3JCQiMFkiRzMoUSR5QiEjNyQiLzooW2coPSVmKCEjNTckNyQkIjBqajpNWSR5QiEjNyQiMFRZcnJ0KilmKCEjNjckJCIwPlMqNCdlJHlCISM3JCIwNmE9TWtsZyghIzY3JDckJCIwaDJfTm0keUIhIzckIjB5TXlFOTloKCEjNjckJCIwPlMqNCdlJHlCISM3JCIwNmE9TWtsZyghIzY3JDckJCIwaDJfTm0keUIhIzckIjB5TXlFOTloKCEjNjckJCIwQi5YYHkkeUIhIzckIjA9JlIwNSUqPXchIzY3JDckJCIwQy07UidReUIhIzckIjA5QiY9WyZRaSghIzY3JCQiMEIuWGB5JHlCISM3JCIwPSZSMDUlKj13ISM2NyQ3JCQiMEMtO1InUXlCISM3JCIwOUImPVsmUWkoISM2NyQkIjAxKTQkWylSeUIhIzckIjBaej1mPDhqKCEjNjckNyQkIjAlSFNfa1N5QiEjNyQiLzpAcGBIT3chIzU3JCQiMDEpNCRbKVJ5QiEjNyQiMFp6PWY8OGooISM2NyQ3JCQiMCVIU19rU3lCISM3JCIvOkBwYEhPdyEjNTckJCIwLykpW1g9JXlCISM3JCIwayopUjUlcFZ3ISM2NyQ3JCQiMCU+eE9sVXlCISM3JCIwJykqKik+ZnRbdyEjNjckJCIwLykpW1g9JXlCISM3JCIwayopUjUlcFZ3ISM2NyQ3JCQiMCU+eE9sVXlCISM3JCIwJykqKik+ZnRbdyEjNjckJCIvWzFcJVEleUIhIzYkIjBuPFZhcWdsKCEjNjckNyQkIjAqKioqUWtZJXlCISM3JCIwQSllcWs8aHchIzY3JCQiL1sxXCVRJXlCISM2JCIwbjxWYXFnbCghIzY3JDckJCIwKioqKlFrWSV5QiEjNyQiMEEpZXFrPGh3ISM2NyQkIjAsUXNZZSV5QiEjNyQiMEQteCFwV293ISM2NyQ3JCQiMHAqUnZuWXlCISM3JCIwZXc3LTxPbighIzY3JCQiMCxRc1llJXlCISM3JCIwRC14IXBXb3chIzY3JDckJCIwcCpSdm5ZeUIhIzckIjBldzctPE9uKCEjNjckJCIwQiNmMyZ5JXlCISM3JCIwMWVuPkIzbyghIzY3JDckJCIwLk01JHBbeUIhIzckIjAlXCc+ZGRnbyghIzY3JCQiMEIjZjMmeSV5QiEjNyQiMDFlbj5CM28oISM2NyQ3JCQiMC5NNSRwW3lCISM3JCIwJVwnPmRkZ28oISM2NyQkIjAkMyNIZClceUIhIzckIjBqWkBUKj4kcCghIzY3JDckJCIwaWopM3JdeUIhIzckIi9MbEEiKVwpcCghIzU3JCQiMCQzI0hkKVx5QiEjNyQiMGpaQFQqPiRwKCEjNjckNyQkIjBpaikzcl15QiEjNyQiL0xsQSIpXClwKCEjNTckJCIwLlAxbT0meUIhIzckIjAnZmFfYmQweCEjNjckNyQkIjAkUmk2dF95QiEjNyQiMG1UTG5RNHIoISM2NyQkIjAuUDFtPSZ5QiEjNyQiMCdmYV9iZDB4ISM2NyQ3JCQiMCRSaTZ0X3lCISM3JCIwbVRMblE0cighIzY3JCQiMFpZOHhRJnlCISM3JCIvd0A+OyZ6cighIzU3JDckJCIwLHJsYFomeUIhIzckIjAtSVNBekxzKCEjNjckJCIwWlk4eFEmeUIhIzckIi93QD47JnpyKCEjNTckNyQkIjAscmxgWiZ5QiEjNyQiMC1JU0F6THMoISM2NyQkIjApZVMwKmUmeUIhIzckIjBwPTVoRi50KCEjNjckNyQkIjAuU2t5biZ5QiEjNyQiMFE9Wng+ZXQoISM2NyQkIjApZVMwKmUmeUIhIzckIjBwPTVoRi50KCEjNjckNyQkIjAuU2t5biZ5QiEjNyQiMFE9Wng+ZXQoISM2NyQkIjBXeEMxeiZ5QiEjNyQiMFdLIUhOcVV4ISM2NyQ3JCQiMEQtImYhKWV5QiEjNyQiMHUxYUtnI1t4ISM2NyQkIjBXeEMxeiZ5QiEjNyQiMFdLIUhOcVV4ISM2NyQ3JCQiMEQtImYhKWV5QiEjNyQiMHUxYUtnI1t4ISM2NyQkIjA4SUZDKmZ5QiEjNyQiMC08RlB6XXYoISM2NyQ3JCQiMFIrWk4zJ3lCISM3JCIvXjR3M3FneCEjNTckJCIwOElGQypmeUIhIzckIjAtPEZQel12KCEjNjckNyQkIjBSK1pOMyd5QiEjNyQiL140dzNxZ3ghIzU3JCQiMGlPYlc+J3lCISM3JCIwI1IzV15YbnghIzY3JDckJCIwM25XbkcneUIhIzckIjBZJHlFOTl0eCEjNjckJCIwaU9iVz4neUIhIzckIjAjUjNXXlhueCEjNjckNyQkIjAzblduRyd5QiEjNyQiMFkkeUU5OXR4ISM2NyQkIjBfSUBuUid5QiEjNyQiMGx4IlIzJCl6eCEjNjckNyQkIjA3JHk8IVwneUIhIzckIjAjPVp4PmUmeSghIzY3JCQiMF9JQG5SJ3lCISM3JCIwbHgiUjMkKXp4ISM2NyQ3JCQiMDckeTwhXCd5QiEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwRG02IypmJ3lCISM3JCIwdDdCWTFBeighIzY3JDckJCIwL3ZLUXAneUIhIzckIjA9ZyJHRC0peighIzY3JCQiMERtNiMqZid5QiEjNyQiMHQ3QlkxQXooISM2NyQ3JCQiMC92S1FwJ3lCISM3JCIwPWciR0QtKXooISM2NyQkIjAxYE0+IW95QiEjNyQiME4lKjMsI2UveSEjNjckNyQkIjAseE94Km95QiEjNyQiMGFbKXlJWTV5ISM2NyQkIjAxYE0+IW95QiEjNyQiME4lKjMsI2UveSEjNjckNyQkIjAseE94Km95QiEjNyQiMGFbKXlJWTV5ISM2NyQkIjBeQikpWysoeUIhIzckIjBSZmFbZHAieSEjNjckNyQkIjBYWWk9NSh5QiEjNyQiL3BgSE8hSCN5ISM1NyQkIjBeQikpWysoeUIhIzckIjBSZmFbZHAieSEjNjckNyQkIjBYWWk9NSh5QiEjNyQiL3BgSE8hSCN5ISM1NyQkIjBYLm4hM3N5QiEjNyQiMCYpW3kpR0xIeSEjNjckNyQkIi9LLEIxdHlCISM2JCIwRUQtPVdgJHkhIzY3JCQiMFgubiEzc3lCISM3JCIwJilbeSlHTEh5ISM2NyQ3JCQiL0ssQjF0eUIhIzYkIjBFRC09V2AkeSEjNjckJCIwQChSWzZ1eUIhIzckIjBYISlRQDM8JXkhIzY3JDckJCIwR11FM14oeUIhIzckIjBpODR0JXlaeSEjNjckJCIwQChSWzZ1eUIhIzckIjBYISlRQDM8JXkhIzY3JDckJCIwR11FM14oeUIhIzckIjBpODR0JXlaeSEjNjckJCIwZCgpPV5oKHlCISM3JCIwSEErWiQzYXkhIzY3JDckJCIwckBeY3IoeUIhIzckIjApPmciR0QtJ3khIzY3JCQiMGQoKT1eaCh5QiEjNyQiMEhBK1okM2F5ISM2NyQ3JCQiMHJAXmNyKHlCISM3JCIwKT5nIkdELSd5ISM2NyQkIjB0SiYpKj15eUIhIzckIjBoQT5sZWsneSEjNjckNyQkIjBARjYyI3p5QiEjNyQiME0hSEtlbXN5ISM2NyQkIjB0SiYpKj15eUIhIzckIjBoQT5sZWsneSEjNjckNyQkIjBBRjYyI3p5QiEjNyQiME0hSEtlbXN5ISM2NyQkIjAwRCQzQiEpeUIhIzckIjBGJ2ZmUCQpeXkhIzY3JDckJCIwYmkxZzcpeUIhIzckIi8oeUhRMV4peSEjNTckJCIwMEQkM0IhKXlCISM3JCIwRidmZlAkKXl5ISM2NyQ3JCQiMGJpMWc3KXlCISM3JCIvKHlIUTFeKXkhIzU3JCQiMDYmZlNGIyl5QiEjNyQiMEwqPiZ6MzcqeSEjNjckNyQkIjAjXE5fSiQpeUIhIzckIjAxbk8kcGEoKnkhIzY3JCQiMDYmZlNGIyl5QiEjNyQiMEwqPiZ6MzcqeSEjNjckNyQkIjAjXE5fSiQpeUIhIzckIjAxbk8kcGEoKnkhIzY3JCQiMCIpPWA+Vil5QiEjNyQiL2YhKWVQZS56ISM1NyQ3JCQiMCpvRkdQJil5QiEjNyQiMFZiVlsoKSo0eiEjNjckJCIwIik9YD5WKXlCISM3JCIvZiEpZVBlLnohIzU3JDckJCIwKm9GR1AmKXlCISM3JCIwVmJWWygpKjR6ISM2NyQkIjAjZSlRbmopeUIhIzckIjAvZ2ZrZWYieiEjNjckNyQkIjA9OnFLdSl5QiEjNyQiMHpWXS5HQyN6ISM2NyQkIjAjZSlRbmopeUIhIzckIjAvZ2ZrZWYieiEjNjckNyQkIjA9OnFLdSl5QiEjNyQiMHpWXS5HQyN6ISM2NyQkIjAnb0J1VCkpeUIhIzckIjB0a0tZTCRHeiEjNjckNyQkIjB0PydbXCopeUIhIzckIjA6S2Rlb1skeiEjNjckJCIwJ29CdVQpKXlCISM3JCIwdGtLWUwkR3ohIzY3JDckJCIwdD8nW1wqKXlCISM3JCIwOktkZW9bJHohIzY3JCQiMGhHeHAvKnlCISM3JCIwKClwaj8zMiV6ISM2NyQ3JCQiMCQpPklmOip5QiEjNyQiMF4/azg0dCV6ISM2NyQkIjBoR3hwLyp5QiEjNyQiMCgpcGo/MzIleiEjNjckNyQkIjAkKT5JZjoqeUIhIzckIjBeP2s4NHQleiEjNjckJCIwO0ZPQ0QqeUIhIzckIjBwR3coRzNgeiEjNjckNyQkIjBpZztFTyp5QiEjNyQiMCgpM3JvXChmeiEjNjckJCIwO0ZPQ0QqeUIhIzckIjBwR3coRzNgeiEjNjckNyQkIjBpZztFTyp5QiEjNyQiMCgpM3JvXChmeiEjNjckJCIwKlx2N2UlKnlCISM3JCIwJFJTdXVYbHohIzY3JDckJCIwRltDJnAmKnlCISM3JCIwQih6UC0+c3ohIzY3JCQiMCpcdjdlJSp5QiEjNyQiMCRSU3V1WGx6ISM2NyQ3JCQiMEZbQyZwJip5QiEjNyQiMEIoelAtPnN6ISM2NyQkIjBfak9TbSp5QiEjNyQiMFhTOCtLeSh6ISM2NyQ3JCQiMHp5YG14KnlCISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBfak9TbSp5QiEjNyQiMFhTOCtLeSh6ISM2NyQ3JCQiMHp5YG14KnlCISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBDZXAsKCkqeUIhIzckIjBwJ1xjaz8hKnohIzY3JDckJCIwKltkLSUpKip5QiEjNyQiMCZSPFI4MigqeiEjNjckJCIwQ2VwLCgpKnlCISM3JCIwcCdcY2s/ISp6ISM2NyQ3JCQiMCpbZC0lKSoqeUIhIzckIjAmUjxSODIoKnohIzY3JCQiMDBIVGwyIXpCISM3JCIwViY0TjNlLSEpISM2NyQ3JCQiMCo+X2kiPiF6QiEjNyQiMEppKSopPV40ISkhIzY3JCQiMDBIVGwyIXpCISM3JCIwViY0TjNlLSEpISM2NyQ3JCQiMCo+X2kiPiF6QiEjNyQiMEppKSopPV40ISkhIzY3JCQiMEVuSUpHIXpCISM3JCIwMCkqUTliXCwpISM2NyQ3JCQiMHAqZlcqUiF6QiEjNyQiMG5dMFdfPi0pISM2NyQkIjBFbklKRyF6QiEjNyQiMDApKlE5YlwsKSEjNjckNyQkIjBwKmZXKlIhekIhIzckIjBuXTBXXz4tKSEjNjckJCIwYWNWKipbIXpCISM3JCIwMEw1UUh0LSkhIzY3JDckJCIwS180dmchekIhIzckIjAuUjcqSFJNISkhIzY3JCQiMGFjVioqWyF6QiEjNyQiMDBMNVFIdC0pISM2NyQ3JCQiMEtfNHZnIXpCISM3JCIwLlI3KkhSTSEpISM2NyQkIjBDXCopcHAhekIhIzckIjB2WU1hLihSISkhIzY3JDckJCIwLVUlejozekIhIzckIjBSRj5hTG8vKSEjNjckJCIwQ1wqKXBwIXpCISM3JCIwdllNYS4oUiEpISM2NyQ3JCQiMC1VJXo6M3pCISM3JCIwUkY+YUxvLykhIzY3JCQiMG41YFUhNHpCISM3JCIwMGdnang/MCkhIzY3JDckJCIwJlsxSUM1ekIhIzckIjB2OkU0dSNmISkhIzY3JCQiMG41YFUhNHpCISM3JCIwMGdnang/MCkhIzY3JDckJCIwJlsxSUM1ekIhIzckIjB2OkU0dSNmISkhIzY3JCQiMGktUzw2InpCISM3JCIwbHJxbF5XMSkhIzY3JDckJCIwQiU9L0w3ekIhIzckIjA2L0xrOTwyKSEjNjckJCIwaS1TPDYiekIhIzckIjBscnFsXlcxKSEjNjckNyQkIjBCJT0vTDd6QiEjNyQiMDYvTGs5PDIpISM2NyQkIjA4K2UlPjh6QiEjNyQiL2sqUmdEbzIpISM1NyQ3JCQiMChmeixVOXpCISM3JCIwWiMqUj5iVDMpISM2NyQkIjA4K2UlPjh6QiEjNyQiL2sqUmdEbzIpISM1NyQ3JCQiMChmeixVOXpCISM3JCIwWiMqUj5iVDMpISM2NyQkIi9zOVNGOnpCISM2JCIwLjwneSUqPiozKSEjNjckNyQkIjBrRzo3bCJ6QiEjNyQiMCQzb1dkZic0KSEjNjckJCIvczlTRjp6QiEjNiQiMC48J3klKj4qMykhIzY3JDckJCIwa0c6N2wiekIhIzckIjAkM29XZGYnNCkhIzY3JCQiMGBYaWJ0InpCISM3JCIwTCRcJEd0OjUpISM2NyQ3JCQiMEh5TDEnPXpCISM3JCIwPnBgSE8hNCIpISM2NyQkIjBgWGlidCJ6QiEjNyQiMEwkXCRHdDo1KSEjNjckNyQkIjBIeUwxJz16QiEjNyQiMD5wYEhPITQiKSEjNjckJCIwJTM0JVIlPnpCISM3JCIwLFInPXElUjYpISM2NyQ3JCQiMHYvIUhxP3pCISM3JCIwYmRnJW9aQCIpISM2NyQkIjAlMzQlUiU+ekIhIzckIjAsUic9cSVSNikhIzY3JDckJCIwdi8hSHE/ekIhIzckIjBiZGclb1pAIikhIzY3JCQiMHdvZUQ6I3pCISM3JCIwImYveDFLRSIpISM2NyQ3JCQiMD5layxHI3pCISM3JCIwImZ1J1I8UjgpISM2NyQkIjB3b2VEOiN6QiEjNyQiMCJmL3gxS0UiKSEjNjckNyQkIjA+ZWssRyN6QiEjNyQiMCJmdSdSPFI4KSEjNjckJCIwIz5jUWhCekIhIzckIjA0KlFvVXBRIikhIzY3JDckJCIwPmpvLVwjekIhIzckIjBGTXUlek5ZIikhIzY3JCQiMCM+Y1FoQnpCISM3JCIwNCpRb1VwUSIpISM2NyQ3JCQiMD5qby1cI3pCISM3JCIwRk11JXpOWSIpISM2NyQkIjBhW1YvZCN6QiEjNyQiMEAlbyZ5bjU6KSEjNjckNyQkIjB3XTIxcSN6QiEjNyQiMGpBIilcKXplIikhIzY3JCQiMGFbVi9kI3pCISM3JCIwQCVvJnluNTopISM2NyQ3JCQiMHddMjFxI3pCISM3JCIwakEiKVwpemUiKSEjNjckJCIweDtGKHpGekIhIzckIjBfczBCVE07KSEjNjckNyQkIi12OzZIekIhIiokIjAqNCIpWyFSNzwpISM2NyQkIjB4O0YoekZ6QiEjNyQiMF9zMEJUTTspISM2NyQ3JCQiLXY7Nkh6QiEiKiQiMCo0IilbIVI3PCkhIzY3JCQiMCRbI0cjKilIekIhIzckIjA3YGRnOWU8KSEjNjckNyQkIjApcCZbPjckekIhIzckIjBOKlwqZnpPPSkhIzY3JCQiMCRbI0cjKilIekIhIzckIjA3YGRnOWU8KSEjNjckNyQkIjApcCZbPjckekIhIzckIjBOKlwqZnpPPSkhIzY3JCQiMFlvWSopPiR6QiEjNyQiMGtSNyJ6PSk9KSEjNjckNyQkIjAlUSVmSEwkekIhIzckIjByKD1dLDcnPikhIzY3JCQiMFlvWSopPiR6QiEjNyQiMGtSNyJ6PSk9KSEjNjckNyQkIjAlUSVmSEwkekIhIzckIjByKD1dLDcnPikhIzY3JCQiMGEtJyopM016QiEjNyQiMHYob1U2YysjKSEjNjckNyQkIjBURyc+V056QiEjNyQiMDN3M3FnJjMjKSEjNjckJCIwYS0nKikzTXpCISM3JCIwdihvVTZjKyMpISM2NyQ3JCQiMFRHJz5XTnpCISM3JCIwM3czcWcmMyMpISM2NyQkIjB1JnkwPk96QiEjNyQiMGUsZ0lNSEApISM2NyQ3JCQiMEFMXGN2JHpCISM3JCIwV2s6RCw1QSkhIzY3JCQiMHUmeTA+T3pCISM3JCIwZSxnSU1IQCkhIzY3JDckJCIwQUxcY3YkekIhIzckIjBXazpELDVBKSEjNjckJCIwendUJUhRekIhIzckIjAwMiIpUjJgQSkhIzY3JDckJCIwQjZQdCdSekIhIzckIi9HRC09V0wjKSEjNTckJCIwendUJUhRekIhIzckIjAwMiIpUjJgQSkhIzY3JDckJCIwQjZQdCdSekIhIzckIi9HRC09V0wjKSEjNTckJCIwOCM9MFNTekIhIzckIjAmM3E8L29QIykhIzY3JDckJCIwLiNmQ3pUekIhIzckIjA7VEhOIyllQykhIzY3JCQiMDgjPTBTU3pCISM3JCIwJjNxPC9vUCMpISM2NyQ3JCQiMC4jZkN6VHpCISM3JCIwO1RITiMpZUMpISM2NyQkIjAnPVApM0QlekIhIzckIjBcaGhPYCtEKSEjNjckNyQkIjAieiQqUSJSJXpCISM3JCIwX0hPIUhLZSMpISM2NyQkIjAnPVApM0QlekIhIzckIjBcaGhPYCtEKSEjNjckNyQkIjAieiQqUSJSJXpCISM3JCIwX0hPIUhLZSMpISM2NyQkIjB2TFA+WSV6QiEjNyQiMD1HTkNFQ0UpISM2NyQ3JCQiMC5MXFBnJXpCISM3JCIwKXlKYU13cSMpISM2NyQkIjB2TFA+WSV6QiEjNyQiMD1HTkNFQ0UpISM2NyQ3JCQiMC5MXFBnJXpCISM3JCIwKXlKYU13cSMpISM2NyQkIjBUcjdLbiV6QiEjNyQiME0qeVwhKnp1IykhIzY3JDckJCIwPnNNaiJbekIhIzckIjBDMV0rL0tHKSEjNjckJCIwVHI3S24lekIhIzckIjBNKnlcISp6dSMpISM2NyQ3JCQiMD5zTWoiW3pCISM3JCIwQzFdKy9LRykhIzY3JCQiMDBEMFopW3pCISM3JCIwRT5reXJyRykhIzY3JDckJCIwVCk0OUhdekIhIzckIjBoJXBiWGsmSCkhIzY3JCQiMDBEMFopW3pCISM3JCIwRT5reXJyRykhIzY3JDckJCIwVCk0OUhdekIhIzckIjBoJXBiWGsmSCkhIzY3JCQiMFghXFQnNCZ6QiEjNyQiMFlKTVhXJipIKSEjNjckNyQkIjB5Mm9AQyZ6QiEjNyQiMChIUTFeMzMkKSEjNjckJCIwWCFcVCc0JnpCISM3JCIwWUpNWFcmKkgpISM2NyQ3JCQiMHkyb0BDJnpCISM3JCIwKEhRMV4zMyQpISM2NyQkIi9NO00zYHpCISM2JCIwW1IzMDw+SikhIzY3JDckJCIwb1lEYVgmekIhIzckIjBMcnFsRDBLKSEjNjckJCIvTTtNM2B6QiEjNiQiMFtSMzA8PkopISM2NyQ3JCQiMG9ZRGFYJnpCISM3JCIwTHJxbEQwSykhIzY3JCQiMChwW1w/YnpCISM3JCIwTT5jZCpHQyQpISM2NyQ3JCQiMCdlUCEqb2N6QiEjNyQiMHBmeD9tSEwpISM2NyQkIjAocFtcP2J6QiEjNyQiME0+Y2QqR0MkKSEjNjckNyQkIjAnZVAhKm9jekIhIzckIjBwZng/bUhMKSEjNjckJCIwVENsR3QmekIhIzckIjB5dTIuaW1MKSEjNjckNyQkIjBYIkhnIyllekIhIzckIjAwWyVlblNYJCkhIzY3JCQiMFRDbEd0JnpCISM3JCIweXUyLmltTCkhIzY3JDckJCIwWCJIZyMpZXpCISM3JCIwMFslZW5TWCQpISM2NyQkIi86RlhYZnpCISM2JCIwQz5qVE0hXCQpISM2NyQ3JCQiMERpS2w0J3pCISM3JCIwVE8iNHQleU4pISM2NyQkIi86RlhYZnpCISM2JCIwQz5qVE0hXCQpISM2NyQ3JCQiMERpS2w0J3pCISM3JCIwVE8iNHQleU4pISM2NyQkIi9OcEVlaHpCISM2JCIveDpIblNoJCkhIzU3JDckJCIwYVl0MUonekIhIzckIjB4QylmeUdxJCkhIzY3JCQiL05wRWVoekIhIzYkIi94OkhuU2gkKSEjNTckNyQkIjBhWXQxSid6QiEjNyQiMHhDKWZ5R3EkKSEjNjckJCIweU4jSHJqekIhIzckIjAsdlUoKnlQUCkhIzY3JDckJCIwLHJbXV8nekIhIzckIjA4ODBUR0ZRKSEjNjckJCIweU4jSHJqekIhIzckIjAsdlUoKnlQUCkhIzY3JDckJCIwLHJbXV8nekIhIzckIjA4ODBUR0ZRKSEjNjckJCIwJDMyYSVlJ3pCISM3JCIwaDZ6OV5oUSkhIzY3JDckJCIwJzQ1alJuekIhIzckIi86P2gqb15SKSEjNTckJCIwJDMyYSVlJ3pCISM3JCIwaDZ6OV5oUSkhIzY3JDckJCIwJzQ1alJuekIhIzckIi86P2gqb15SKSEjNTckJCIwJj5pKnp6J3pCISM3JCIwPEJeREImKVIpISM2NyQ3JCQiMGgrV1cmcHpCISM3JCIwJykqKT1eNHdTKSEjNjckJCIwJj5pKnp6J3pCISM3JCIwPEJeREImKVIpISM2NyQ3JCQiMGgrV1cmcHpCISM3JCIwJykqKT1eNHdTKSEjNjckJCIwJDMneTssKHpCISM3JCIwXihlKkcmKjNUKSEjNjckNyQkIjBceXglcHJ6QiEjNyQiMEF5RDFdK1UpISM2NyQkIjAkMyd5OywoekIhIzckIjBeKGUqRyYqM1QpISM2NyQ3JCQiMFx5eCVwcnpCISM3JCIwQXlEMV0rVSkhIzY3JCQiMDEqemREc3pCISM3JCIwI1JaYXNFQiUpISM2NyQ3JCQiMHRJS1pRKHpCISM3JCIwZW1LaCFcSyUpISM2NyQkIjAxKnpkRHN6QiEjNyQiMCNSWmFzRUIlKSEjNjckNyQkIjB0SUtaUSh6QiEjNyQiMGVtS2ghXEslKSEjNjckJCIwW0slcFJ1ekIhIzckIjB3JnpcIlJjVikhIzY3JDckJCIwXmAyLWcoekIhIzckIjAlXCZSO0pcVykhIzY3JCQiMFtLJXBSdXpCISM3JCIwdyZ6XCJSY1YpISM2NyQ3JCQiMF5gMi1nKHpCISM3JCIwJVwmUjtKXFcpISM2NyQkIjAkcHYtYXd6QiEjNyQiMFJtYig0LFslKSEjNjckNyQkIjBvdjhmInl6QiEjNyQiL0xrOTxQZCUpISM1NyQkIjAkcHYtYXd6QiEjNyQiMFJtYig0LFslKSEjNjckNyQkIjBvdjhmInl6QiEjNyQiL0xrOTxQZCUpISM1NyQkIi4oemVveXpCISM1JCIwVysmR0ZRZyUpISM2NyQ3JCQiMGBOST0uKXpCISM3JCIwbUpgRTcpcCUpISM2NyQkIi4oemVveXpCISM1JCIwVysmR0ZRZyUpISM2NyQ3JCQiMGBOST0uKXpCISM3JCIwbUpgRTcpcCUpISM2NyQkIjBXKVxOJDMpekIhIzckIjAmWz06V3ZzJSkhIzY3JDckJCIwUmFuekMpekIhIzckIjAuP2ciR0QjWykhIzY3JCQiMFcpXE4kMyl6QiEjNyQiMCZbPTpXdnMlKSEjNjckNyQkIjBSYW56Qyl6QiEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwKVxjTClIKXpCISM3JCIwNGpMLkVeWykhIzY3JDckJCIwMz5BVlkpekIhIzckIjBSM25PJHAlXCkhIzY3JCQiMClcY0wpSCl6QiEjNyQiMDRqTC5FXlspISM2NyQ3JCQiMDM+QVZZKXpCISM3JCIwUjNuTyRwJVwpISM2NyQkIjAnb2lgOCYpekIhIzckIi9WLCJlKFwoXCkhIzU3JDckJCIwM18rNG8pekIhIzckIjB2J1I8UjgyJikhIzY3JCQiMCdvaWA4Jil6QiEjNyQiL1YsImUoXChcKSEjNTckNyQkIjAzXys0byl6QiEjNyQiMHYnUjxSODImKSEjNjckJCIwamddKkcoKXpCISM3JCIwaFAsMXApNCYpISM2NyQ3JCQiMF9RJ3AoKikpekIhIzckIjA2JjNvV2Q+JikhIzY3JCQiMGpnXSpHKCl6QiEjNyQiMGhQLDFwKTQmKSEjNjckNyQkIjBfUSdwKCopKXpCISM3JCIwNiYzb1dkPiYpISM2NyQkIjBldiJlVyopekIhIzckIjBGVChwL0NBJikhIzY3JDckJCIwIz5PczkiKnpCISM3JCIwWnQoPV0sSyYpISM2NyQkIjBldiJlVyopekIhIzckIjBGVChwL0NBJikhIzY3JDckJCIwIz5PczkiKnpCISM3JCIwWnQoPV0sSyYpISM2NyQkIjA3VFMvOyp6QiEjNyQiMEQnUjE9aE0mKSEjNjckNyQkIjAvcWc+TCp6QiEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwN1RTLzsqekIhIzckIjBEJ1IxPWhNJikhIzY3JDckJCIwL3FnPkwqekIhIzckIjAkPVlwYlhXJikhIzY3JCQiMFs4MGxQKnpCISM3JCIwWHdwMiQpcGEpISM2NyQ3JCQiMEpPMiVcJip6QiEjNyQiMD5dLDcnKm9iKSEjNjckJCIwWzgwbFAqekIhIzckIjBYd3AyJClwYSkhIzY3JDckJCIwSk8yJVwmKnpCISM3JCIwPl0sNycqb2IpISM2NyQkIjAtKUh4I2YqekIhIzckIjBsRUNHYSRmJikhIzY3JDckJCIwRXMjM24oKnpCISM3JCIwYlEzbk8kcCYpISM2NyQkIjAtKUh4I2YqekIhIzckIjBsRUNHYSRmJikhIzY3JDckJCIwRXMjM24oKnpCISM3JCIwYlEzbk8kcCYpISM2NyQkIi9NJW8jNCkqekIhIzYkIjBKJipbVEQ8ZCkhIzY3JDckJCIwRm55XCkqKnpCISM3JCIwI3BfQHN4ImUpISM2NyQkIi9NJW8jNCkqekIhIzYkIjBKJipbVEQ8ZCkhIzY3JDckJCIwRm55XCkqKnpCISM3JCIwI3BfQHN4ImUpISM2NyQkIjBZayEpZi0rUSMhIzckIjAmPid5Wic0JWUpISM2NyQ3JCQiMGA8JjQuLSFRIyEjNyQiMEc6QXg8VWYpISM2NyQkIjBZayEpZi0rUSMhIzckIjAmPid5Wic0JWUpISM2NyQ3JCQiMGA8JjQuLSFRIyEjNyQiMEc6QXg8VWYpISM2NyQkIjAzZDRIQytRIyEjNyQiMHhSOFpua2YpISM2NyQ3JCQiMG8mNFVALyFRIyEjNyQiMGsuSEtlbWcpISM2NyQkIjAzZDRIQytRIyEjNyQiMHhSOFpua2YpISM2NyQ3JCQiMG8mNFVALyFRIyEjNyQiMGsuSEtlbWcpISM2NyQkIjAiNDsvZy8hUSMhIzckIi8ycCpSUSkzJykhIzU3JDckJCIwZnRrKlIxIVEjISM3JCIuI2Z0KSk0PicpISIqNyQkIjAiNDsvZy8hUSMhIzckIi8ycCpSUSkzJykhIzU3JDckJCIwZnRrKlIxIVEjISM3JCIuI2Z0KSk0PicpISIqNyQkIjBERyFSeDEhUSMhIzckIjBqeSZlIzQ3aSkhIzY3JDckJCIwYCYqRyhlMyFRIyEjNyQiME8hR0MlUjpqKSEjNjckJCIwREchUngxIVEjISM3JCIwankmZSM0N2kpISM2NyQ3JCQiMGAmKkcoZTMhUSMhIzckIjBPIUdDJVI6aikhIzY3JCQiMCpcYiZcKjMhUSMhIzckIjB2OyFbK2VMJykhIzY3JDckJCIwc2Q4eDIsUSMhIzckIjBzb1woKnpSaykhIzY3JCQiMCpcYiZcKjMhUSMhIzckIjB2OyFbK2VMJykhIzY3JDckJCIwc2Q4eDIsUSMhIzckIjBzb1woKnpSaykhIzY3JCQiL0FfdDc2IVEjISM2JCIwLDIobzImZmspISM2NyQ3JCQiMCNvayJwSCxRIyEjNyQiMDNkY18/a2wpISM2NyQkIi9BX3Q3NiFRIyEjNiQiMCwyKG8yJmZrKSEjNjckNyQkIjAjb2sicEgsUSMhIzckIjAzZGNfP2tsKSEjNjckJCIwJ2U6dEk4IVEjISM3JCIwKFsjKj45S2UnKSEjNjckNyQkIjBKQUdqXixRIyEjNyQiMFhYajJoKW8nKSEjNjckJCIwJ2U6dEk4IVEjISM3JCIwKFsjKj45S2UnKSEjNjckNyQkIjBKQUdqXixRIyEjNyQiMFhYajJoKW8nKSEjNjckJCIwZiZIJCpbOiFRIyEjNyQiLiJSMD9wcScpISIqNyQ3JCQiMCVvLSdmdCxRIyEjNyQiMCJRLkY7SSJvKSEjNjckJCIwZiZIJCpbOiFRIyEjNyQiLiJSMD9wcScpISIqNyQ3JCQiMCVvLSdmdCxRIyEjNyQiMCJRLkY7SSJvKSEjNjckJCIwZCcpW3R3LFEjISM3JCIwc3U/X2lJbykhIzY3JDckJCIwRnE1ZSY+IVEjISM3JCIwPEF4PFVQcCkhIzY3JCQiMGQnKVt0dyxRIyEjNyQiMHN1P19pSW8pISM2NyQ3JCQiMEZxNWUmPiFRIyEjNyQiMDxBeDxVUHApISM2NyQkIi8+OClmKT4hUSMhIzYkIjAlW0twSFYmcCkhIzY3JDckJCIwb10iKWU8LVEjISM3JCIwYDUlR0Y9MSgpISM2NyQkIi8+OClmKT4hUSMhIzYkIjAlW0twSFYmcCkhIzY3JDckJCIwb10iKWU8LVEjISM3JCIwYDUlR0Y9MSgpISM2NyQkIjBcRklbPy1RIyEjNyQiMFhhck0ueXEpISM2NyQ3JCQiMCo9MjsnUi1RIyEjNyQiMCopKTR6S2k9KCkhIzY3JCQiMFxGSVs/LVEjISM3JCIwWGFyTS55cSkhIzY3JDckJCIwKj0yOydSLVEjISM3JCIwKikpNHpLaT0oKSEjNjckJCIwJVsvKVFVLVEjISM3JCIwZGsvbXQscykhIzY3JDckJCIwKDRvbDtFIVEjISM3JCIwRCh5SFExSigpISM2NyQkIjAlWy8pUVUtUSMhIzckIjBkay9tdCxzKSEjNjckNyQkIjAoNG9sO0UhUSMhIzckIjBEKHlIUTFKKCkhIzY3JCQiMDEiKVtKay1RIyEjNyQiMGY4USFSYUsoKSEjNjckNyQkIjB2J1tQUEchUSMhIzckIjBodi9RL051KSEjNjckJCIwMSIpW0prLVEjISM3JCIwZjhRIVJhSygpISM2NyQ3JCQiMHYnW1BQRyFRIyEjNyQiMGh2L1EvTnUpISM2NyQkIjApPT9qaUchUSMhIzckIjBEdCN5UyJcdSkhIzY3JDckJCIwZl4qSGVJIVEjISM3JCIwKFI7SlwlZnYpISM2NyQkIjApPT9qaUchUSMhIzckIjBEdCN5UyJcdSkhIzY3JDckJCIwZl4qSGVJIVEjISM3JCIwKFI7SlwlZnYpISM2NyQkIjAlRyc+QjMuUSMhIzckIjBmIz4oPSVHZCgpISM2NyQ3JCQiMCpbVld6SyFRIyEjNyQiME1fPVsmUW8oKSEjNjckJCIwJUcnPkIzLlEjISM3JCIwZiM+KD0lR2QoKSEjNjckNyQkIjAqW1ZXekshUSMhIzckIjBNXz1bJlFvKCkhIzY3JCQiL2VAQS1MIVEjISM2JCIwKSkpPkZVbHAoKSEjNjckNyQkIjAqMyEzM10uUSMhIzckIi8yYUtnIzN5KSEjNTckJCIvZUBBLUwhUSMhIzYkIjApKSk+RlVscCgpISM2NyQ3JCQiMCozITMzXS5RIyEjNyQiLzJhS2cjM3kpISM1NyQkIjB4elJCXy5RIyEjNyQiMDxKIyk+Qz95KSEjNjckNyQkIjBqSXlCcy5RIyEjNyQiMDFIS2VtS3opISM2NyQkIjB4elJCXy5RIyEjNyQiMDxKIyk+Qz95KSEjNjckNyQkIjBqSXlCcy5RIyEjNyQiMDFIS2VtS3opISM2NyQkIjBWa2hFdS5RIyEjNyQiMFwmeS5UUiV6KSEjNjckNyQkIjBMJClvVCVSIVEjISM3JCIwVTxSODJkISkpISM2NyQkIjBWa2hFdS5RIyEjNyQiMFwmeS5UUiV6KSEjNjckNyQkIjBMJClvVCVSIVEjISM3JCIwVTxSODJkISkpISM2NyQkIjBtIykqPmpSIVEjISM3JCIvRygqUlJ3MSkpISM1NyQ3JCQiMEIsbmg7L1EjISM3JCIweTBZb1oiPSkpISM2NyQkIjBtIykqPmpSIVEjISM3JCIvRygqUlJ3MSkpISM1NyQ3JCQiMEIsbmg7L1EjISM3JCIweTBZb1oiPSkpISM2NyQkIjBodlNSPS9RIyEjNyQiMEFdNnJMIj4pKSEjNjckNyQkIjBMPSVRKVEvUSMhIzckIjA5JUhOIyllSSkpISM2NyQkIjBodlNSPS9RIyEjNyQiMEFdNnJMIj4pKSEjNjckNyQkIjBMPSVRKVEvUSMhIzckIjA5JUhOIyllSSkpISM2NyQkIjBhJXAqW1MvUSMhIzckIjBsMExULjokKSkhIzY3JDckJCIwS2E/M2gvUSMhIzckIi9EKWZ5R0klKSkhIzU3JCQiMGElcCpbUy9RIyEjNyQiMGwwTFQuOiQpKSEjNjckNyQkIjBLYT8zaC9RIyEjNyQiL0QpZnlHSSUpKSEjNTckJCIwXF1wZ2kvUSMhIzckIjAoSDNZSShRJSkpISM2NyQ3JCQiL3BWWUxbIVEjISM2JCIwKDNuTyRwYSYpKSEjNjckJCIwXF1wZ2kvUSMhIzckIjAoSDNZSShRJSkpISM2NyQ3JCQiL3BWWUxbIVEjISM2JCIwKDNuTyRwYSYpKSEjNjckJCIvXFtXWlshUSMhIzYkIjBWUVFoVWkmKSkhIzY3JDckJCIwdGg5ajAwUSMhIzckIjBCZnQpKTR6JykpISM2NyQkIi9cW1daWyFRIyEjNiQiMFZRUWhVaSYpKSEjNjckNyQkIjB0aDlqMDBRIyEjNyQiMEJmdCkpNHonKSkhIzY3JCQiMChSSC1wXSFRIyEjNyQiMDolZTtAaG8pKSEjNjckNyQkIjAyPSVRel8hUSMhIzckIjBmWiFRL04hKSkpISM2NyQkIjAoUkgtcF0hUSMhIzckIjA6JWU7QGhvKSkhIzY3JDckJCIwMj0lUXpfIVEjISM3JCIwZlohUS9OISkpKSEjNjckJCIwS0c8M0gwUSMhIzckIjBbKikqXDopNCkpKSEjNjckNyQkIjBQKFFuLWIhUSMhIzckIjAmZnQpKTR6IyopKSEjNjckJCIwS0c8M0gwUSMhIzckIjBbKikqXDopNCkpKSEjNjckNyQkIjBQKFFuLWIhUSMhIzckIjAmZnQpKTR6IyopKSEjNjckJCIwJkhzI0deMFEjISM3JCIwemlVIjROJCopKSEjNjckNyQkIjAkUSs8RWQhUSMhIzckIjBKQyVSOkIwKikhIzY3JCQiMCZIcyNHXjBRIyEjNyQiMHppVSI0TiQqKSkhIzY3JDckJCIwJFErPEVkIVEjISM3JCIwSkMlUjpCMCopISM2NyQkIi8kXFNddDBRIyEjNiQiMFhWTEA/ZCEqKSEjNjckNyQkIjAlKjR0KVxmIVEjISM3JCIwbjcsNHN3IiopISM2NyQkIi8kXFNddDBRIyEjNiQiMFhWTEA/ZCEqKSEjNjckNyQkIjAlKjR0KVxmIVEjISM3JCIwbjcsNHN3IiopISM2NyQkIjAoW2pYZGYhUSMhIzckIjApUVlaJSozPSopISM2NyQ3JCQiMFBrJnp0aCFRIyEjNyQiMC4sM2s3LCQqKSEjNjckJCIwKFtqWGRmIVEjISM3JCIwKVFZWiUqMz0qKSEjNjckNyQkIjBQayZ6dGghUSMhIzckIjAuLDNrNywkKikhIzY3JCQiMEcjejMhPTFRIyEjNyQiMEU6Q2hlLyQqKSEjNjckNyQkIjBPYkN6UjFRIyEjNyQiLyUqWyI+YEQlKikhIzU3JCQiMEcjejMhPTFRIyEjNyQiMEU6Q2hlLyQqKSEjNjckNyQkIjBPYkN6UjFRIyEjNyQiMFIqWyI+YEQlKikhIzY3JCQiMHc7QUhTMVEjISM3JCIwRSJRN3gjRyUqKSEjNjckNyQkIjAqKT10QWkxUSMhIzckIjB3eEB1JCpcJiopISM2NyQkIjB3O0FIUzFRIyEjNyQiMEUiUTd4I0clKikhIzY3JDckJCIwKik9dEFpMVEjISM3JCIwd3hAdSQqXCYqKSEjNjckJCIwVmVzZmkxUSMhIzckIjB6S0l1Jz5iKikhIzY3JDckJCIvQCVHbyVvIVEjISM2JCIwN21HSE11JyopISM2NyQkIjBWZXNmaTFRIyEjNyQiMHpLSXUnPmIqKSEjNjckNyQkIi9AJUdvJW8hUSMhIzYkIjA3bUdITXUnKikhIzY3JCQiMFtmRCNcbyFRIyEjNyQiMGRCKDNkY24qKSEjNjckNyQkIjBQWS47MjJRIyEjNyQiMFthTiVbKCl6KikhIzY3JCQiMFtmRCNcbyFRIyEjNyQiMGRCKDNkY24qKSEjNjckNyQkIjBQWS47MjJRIyEjNyQiMFthTiVbKCl6KikhIzY3JCQiMFFqJXBzcSFRIyEjNyQiMCllOTBZJCp6KikhIzY3JDckJCIwQyVRMmZzIVEjISM3JCIwUVEiPTxDISoqKSEjNjckJCIwUWolcHNxIVEjISM3JCIwKWU5MFkkKnoqKSEjNjckNyQkIjBDJVEyZnMhUSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHR6YjYmKj5RIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeJz5kZGclUSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHR6YjYmKj5RIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBDJVEyZnMhUSMhIzckIjBRUSI9PEMhKiopISM2NyQkIjApeWpQJ0gyUSMhIzckIjAvbExWLkIqKikhIzY3JDckJCIwKXkxZidIMlEjISM3JCIwJUdDJVI6QioqKSEjNjckJCIwKXlqUCdIMlEjISM3JCIwL2xMVi5CKiopISM2NyQ3JCQiMCl5MWYnSDJRIyEjNyQiMCVHQyVSOkIqKikhIzY3JCQiL0hiUz92IVEjISM2JCIwVCE+XUBuLyEqISM2NyQ3JCQiMFdVMz5fMlEjISM3JCIvNyRcJWZ2LyEqISM1NyQkIi9IYlM/diFRIyEjNiQiMFQhPl1Abi8hKiEjNjckNyQkIjBXVTM+XzJRIyEjNyQiLzckXCVmdi8hKiEjNTckJCIwSHJCWXUyUSMhIzckIjAsLmshMy88ISohIzY3JDckJCIwKnoqPXV1MlEjISM3JCIwYz5jXCc+PCEqISM2NyQkIjBIckJZdTJRIyEjNyQiMCwuayEzLzwhKiEjNjckNyQkIjAqeio9dXUyUSMhIzckIjBjPmNcJz48ISohIzY3JCQiMFcmejBweiFRIyEjNyQiMCV5TCRSNCVIISohIzY3JDckJCIwbUZcSih6IVEjISM3JCIwI3pJWXFqSCEqISM2NyQkIjBXJnowcHohUSMhIzckIjAleUwkUjQlSCEqISM2NyQ3JCQiMG1GXEooeiFRIyEjNyQiMCR6SVlxakghKiEjNjckJCIwO24lcCQ+M1EjISM3JCIwd1xgInp4VCEqISM2NyQ3JCQiMCwzJzMqPjNRIyEjNyQiMEgnKnBmeD8vKiEjNjckJCIwO24lcCQ+M1EjISM3JCIwd1xgInp4VCEqISM2NyQ3JCQiMCwzJzMqPjNRIyEjNyQiMEgnKnBmeD8vKiEjNjckJCIwPkJNJj0lM1EjISM3JCIwMEBCUFlUMCohIzY3JDckJCIwWD1IX1UzUSMhIzckIjBsJW9aIj1YMCohIzY3JCQiMD5CTSY9JTNRIyEjNyQiMDBAQlBZVDAqISM2NyQ3JCQiMFg9SF9VM1EjISM3JCIwbCVvWiI9WDAqISM2NyQkIjBuUyplViczUSMhIzckIi9tOmdaXm0hKiEjNTckNyQkIjBZbyJmXiczUSMhIzckIjAsdCQpcGVwMSohIzY3JCQiMG5TKmVWJzNRIyEjNyQiL206Z1pebSEqISM1NyQ3JCQiMFlvImZeJzNRIyEjNyQiMCx0JClwZXAxKiEjNjckJCIwSyVwJSlvKTNRIyEjNyQiMCRlNSQzJCkpeSEqISM2NyQ3JCQiMFQjMzt5KTNRIyEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiMEslcCUpbykzUSMhIzckIjAkZTUkMyQpKXkhKiEjNjckNyQkIjBUIzM7eSkzUSMhIzckIjBQaCFcIypSeiEqISM2NyQkIjBWVzJWNDRRIyEjNyQiMFh2NE1eNzQqISM2NyQ3JCQiMCRmaCRcNTRRIyEjNyQiMHRcKCp6Uj00KiEjNjckJCIwVlcyVjQ0USMhIzckIjBYdjRNXjc0KiEjNjckNyQkIjAkZmgkXDU0USMhIzckIjB0XCgqelI9NCohIzY3JCQiMHk/JCkqPiQ0USMhIzckIjBCQSlIJj5PNSohIzY3JDckJCIwVGFJPkw0USMhIzckIjA0US9OIUcvIiohIzY3JCQiMHk/JCkqPiQ0USMhIzckIjBCQSlIJj5PNSohIzY3JDckJCIwVGFJPkw0USMhIzckIjA0US9OIUcvIiohIzY3JCQiMC5bW2VhNFEjISM3JCIwJ1EhemwoKWY2KiEjNjckNyQkIjBRKik9ImYmNFEjISM3JCIwWEU2ITRzOyIqISM2NyQkIjAuW1tlYTRRIyEjNyQiMCdRIXpsKClmNiohIzY3JDckJCIwUSopPSJmJjRRIyEjNyQiMFhFNiE0czsiKiEjNjckJCIwemxIPng0USMhIzckIjBjY25yYiRHIiohIzY3JDckJCIwREFFbHk0USMhIzckIjAiWyI9WGgiSCIqISM2NyQkIjB6bEg+eDRRIyEjNyQiMGNjbnJiJEciKiEjNjckNyQkIjBEQUVseTRRIyEjNyQiMCJbIj1YaCJIIiohIzY3JCQiMGg7OCMpKio0USMhIzckIjAkSHQ1UHNTIiohIzY3JDckJCIwdGdSVCw1USMhIzckIjA9LkQrLTs5KiEjNjckJCIwaDs4IykqKjRRIyEjNyQiMCRIdDVQc1MiKiEjNjckNyQkIjB0Z1JULDVRIyEjNyQiMD0uRCstOzkqISM2NyQkIjB3JyopcEMtIlEjISM3JCIwJVwlKVI7NGAiKiEjNjckNyQkIjAuMWc+QzVRIyEjNyQiMGEiPmBEL2EiKiEjNjckJCIwdycqKXBDLSJRIyEjNyQiMCVcJSlSOzRgIiohIzY3JDckJCIwLjFnPkM1USMhIzckIjBhIj5gRC9hIiohIzY3JCQiMCdRIilRXi8iUSMhIzckIi92dS4mZmE7KiEjNTckNyQkIjAvbScpKnAvIlEjISM3JCIvKnpRNSRbbSIqISM1NyQkIjAnUSIpUV4vIlEjISM3JCIvdnUuJmZhOyohIzU3JDckJCIwL20nKSpwLyJRIyEjNyQiLyp6UTUkW20iKiEjNTckJCIwai0jSHkxIlEjISM3JCIwPS0pKUhGeTwqISM2NyQ3JCQiL3k8QilwNVEjISM2JCIwRW9YbEIqeSIqISM2NyQkIjBqLSNIeTEiUSMhIzckIjA9LSkpSEZ5PCohIzY3JDckJCIveTxCKXA1USMhIzYkIjBFb1hsQip5IiohIzY3JCQiMFUkZVEwNCJRIyEjNyQiMCopZkguJj4hPiohIzY3JDckJCIwJilbcW0jNCJRIyEjNyQiMGljXz9rOD4qISM2NyQkIjBVJGVRMDQiUSMhIzckIjAqKWZILiY+IT4qISM2NyQ3JCQiMCYpW3FtIzQiUSMhIzckIjBpY18/azg+KiEjNjckJCIwWTclcEs2IlEjISM3JCIwIltNKXBpRD8qISM2NyQ3JCQiL2ApR2A6NlEjISM2JCIwKVwlZnYvUT8qISM2NyQkIjBZNyVwSzYiUSMhIzckIjAiW00pcGlEPyohIzY3JDckJCIvYClHYDo2USMhIzYkIjApXCVmdi9RPyohIzY3JCQiL15RPmc4IlEjISM2JCIvbk0tLiRcQCohIzU3JDckJCIwUDEiPSVRNlEjISM3JCIwTUxtSVhpQCohIzY3JCQiL15RPmc4IlEjISM2JCIvbk0tLiRcQCohIzU3JDckJCIwUTEiPSVRNlEjISM3JCIwTkxtSVhpQCohIzY3JCQiMFYpeiF6ZTZRIyEjNyQiMDIrdyR5SEYjKiEjNjckNyQkIjA9XF5LaDZRIyEjNyQiMHJAdCZlb0cjKiEjNjckJCIwVil6IXplNlEjISM3JCIwMit3JHlIRiMqISM2NyQ3JCQiMD1cXktoNlEjISM3JCIwckB0JmVvRyMqISM2NyQkIjB3SUNlIj0iUSMhIzckIjA+QSEzYG1SIyohIzY3JDckJCIwKWZ5X1U9IlEjISM3JCIwMjUhM2s3VCMqISM2NyQkIjB3SUNlIj0iUSMhIzckIjA+QSEzYG1SIyohIzY3JDckJCIwKWZ5X1U9IlEjISM3JCIwMjUhM2s3VCMqISM2NyQkIjBSeVVSLzdRIyEjNyQiMCRcaThGLl8jKiEjNjckNyQkIjBOODU/MjdRIyEjNyQiMFYpcGVwY2AjKiEjNjckJCIwUnlVUi83USMhIzckIjAkXGk4Ri5fIyohIzY3JDckJCIwTjg1PzI3USMhIzckIjBWKXBlcGNgIyohIzY3JCQiMGlQakFGN1EjISM3JCIwOT9XMCtXRSohIzY3JDckJCIwcy8rPEk3USMhIzckIjB6J1E0dittIyohIzY3JCQiMGlQakFGN1EjISM3JCIwOT9XMCtXRSohIzY3JDckJCIwcy8rPEk3USMhIzckIjB6J1E0dittIyohIzY3JCQiMGw8dzJdN1EjISM3JCIwIltlTHR3dyMqISM2NyQ3JCQiMFJOI2VKRCJRIyEjNyQiMDp2KzFbJXkjKiEjNjckJCIwbDx3Ml03USMhIzckIjAiW2VMdHd3IyohIzY3JDckJCIwUk4jZUpEIlEjISM3JCIwOnYrMVsleSMqISM2NyQkIjAqXDVdSEYiUSMhIzckIjBCXFphTSIqRyohIzY3JDckJCIwNEIlb2hGIlEjISM3JCIwXmoyaCkpM0gqISM2NyQkIjAqXDVdSEYiUSMhIzckIjBCXFphTSIqRyohIzY3JDckJCIwNEIlb2hGIlEjISM3JCIwXmoyaCkpM0gqISM2NyQkIjBfIipIJWVIIlEjISM3JCIwbi8wcCw6SSohIzY3JDckJCIwI1E/Kj4qSCJRIyEjNyQiMCg9WGgiSExJKiEjNjckJCIwXyIqSCVlSCJRIyEjNyQiMG4vMHAsOkkqISM2NyQ3JCQiMCNRPyo+KkgiUSMhIzckIjAoPVhoIkhMSSohIzY3JCQiMCMzNGMoPThRIyEjNyQiMCQpWzl4b1FKKiEjNjckNyQkIjA+dTBEQThRIyEjNyQiMEJTQHJwZEoqISM2NyQkIjAjMzRjKD04USMhIzckIjAkKVs5eG9RSiohIzY3JDckJCIwPnUwREE4USMhIzckIjBCU0BycGRKKiEjNjckJCIwQCpSKm9UOFEjISM3JCIwXiRmKHlOaUsqISM2NyQ3JCQiMHlJREtYOFEjISM3JCIvJ0dHRTUjRyQqISM1NyQkIjBAKlIqb1Q4USMhIzckIjBeJGYoeU5pSyohIzY3JDckJCIweUlES1g4USMhIzckIi8nR0dFNSNHJCohIzU3JCQiMFkkeVRZTyJRIyEjNyQiMFBzRHUtJ1EkKiEjNjckNyQkIjBITlJUbzhRIyEjNyQiMCdwXjgzbFMkKiEjNjckJCIwWSR5VFlPIlEjISM3JCIwUHNEdS0nUSQqISM2NyQ3JCQiMEhOUlRvOFEjISM3JCIwJ3BeODNsUyQqISM2NyQkIjAzMmJoKFEiUSMhIzckIjBkRiJIJ3A0TiohIzY3JDckJCIwSmlxXyJSIlEjISM3JCIwSzBVTyI0YCQqISM2NyQkIjAzMmJoKFEiUSMhIzckIjBkRiJIJ3A0TiohIzY3JDckJCIwSmlxXyJSIlEjISM3JCIwSzBVTyI0YCQqISM2NyQkIjB5RyU0MVQiUSMhIzckIjBpPTRYT0xPKiEjNjckNyQkIjBQbDJtOTlRIyEjNyQiMG8kKlsiPmBsJCohIzY3JCQiMHlHJTQxVCJRIyEjNyQiMGk9NFhPTE8qISM2NyQ3JCQiMFBsMm05OVEjISM3JCIwbyQqWyI+YGwkKiEjNjckJCIwYlJDaUw5USMhIzckIjBZLDpALmRQKiEjNjckNyQkIjBuSVIieVYiUSMhIzckIjAvI2VsQyh6UCohIzY3JCQiMGJSQ2lMOVEjISM3JCIwWSw6QC5kUCohIzY3JDckJCIwbklSInlWIlEjISM3JCIwLyNlbEMoelAqISM2NyQkIjBDZGNsYzlRIyEjNyQiMCI9SDIqcCEpUSohIzY3JDckJCIwZiJvKCk0WSJRIyEjNyQiLy9GO0lUIVIqISM1NyQkIjBDZGNsYzlRIyEjNyQiMCI9SDIqcCEpUSohIzY3JDckJCIwZiJvKCk0WSJRIyEjNyQiLy9GO0lUIVIqISM1NyQkIjA+eSE0KHo5USMhIzckIi85SVFsVislKiEjNTckNyQkIjB2OT89JVsiUSMhIzckIjB3ZXBjYEdTKiEjNjckJCIwPnkhNCh6OVEjISM3JCIvOUlRbFYrJSohIzU3JDckJCIwdjk/PSVbIlEjISM3JCIwd2VwY2BHUyohIzY3JCQiMHQpcCN5LTpRIyEjNyQiMCU+YS9KIUdUKiEjNjckNyQkIjB4RXBSMjpRIyEjNyQiMDdadzYlSDolKiEjNjckJCIwdClwI3ktOlEjISM3JCIwJT5hL0ohR1QqISM2NyQ3JCQiMHhFcFIyOlEjISM3JCIwN1p3NiVIOiUqISM2NyQkIjBCOmwoZV8iUSMhIzckIjA5RGdncF5VKiEjNjckNyQkIjBHOUNqSTpRIyEjNyQiMFxOJG9ZdEYlKiEjNjckJCIwQjpsKGVfIlEjISM3JCIwOURnZ3BeVSohIzY3JDckJCIwRzlDakk6USMhIzckIjBcTiRvWXRGJSohIzY3JCQiMC9DMCoqWzpRIyEjNyQiL0Z3VWdgUCUqISM1NyQ3JCQiL1JaKSlRYiJRIyEjNiQiMCZRLT5fPFMlKiEjNjckJCIwL0MwKipbOlEjISM3JCIvRndVZ2BQJSohIzU3JDckJCIwKlFaKSlRYiJRIyEjNyQiMCZRLT5fPFMlKiEjNjckJCIwIlttQkBkIlEjISM3JCIwXmEiPUMhKlwlKiEjNjckNyQkIjAwVFM7eDpRIyEjNyQiMEA3KHBkaF8lKiEjNjckJCIwIlttQkBkIlEjISM3JCIwXmEiPUMhKlwlKiEjNjckNyQkIjAwVFM7eDpRIyEjNyQiMEA3KHBkaF8lKiEjNjckJCIwUmIheV9mIlEjISM3JCIwJik0YXNvQVkqISM2NyQ3JCQiMCpIQ2gvZyJRIyEjNyQiMGQrL0tjXVkqISM2NyQkIjBSYiF5X2YiUSMhIzckIjAmKTRhc29BWSohIzY3JDckJCIwKkhDaC9nIlEjISM3JCIwZCsvS2NdWSohIzY3JCQiMCNwZV4lPTtRIyEjNyQiMG8hSHJcanUlKiEjNjckNyQkIjBoWnd4QjtRIyEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMCNwZV4lPTtRIyEjNyQiMG8hSHJcanUlKiEjNjckNyQkIjBoWnd4QjtRIyEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMENoUmtUO1EjISM3JCIwKEh2YzYrKFsqISM2NyQ3JCQiMEAoKlE2WjtRIyEjNyQiMEh4PFVQKipbKiEjNjckJCIwQ2hSa1Q7USMhIzckIjAoSHZjNisoWyohIzY3JDckJCIwQCgqUTZaO1EjISM3JCIwSHg8VVAqKlsqISM2NyQkIi9zKHkmW20iUSMhIzYkIjAyVkpGbiQqXCohIzY3JDckJCIwVEs5WnE7USMhIzckIjBsbEMoelAtJiohIzY3JCQiL3MoeSZbbSJRIyEjNiQiMDJWSkZuJCpcKiEjNjckNyQkIjBUSzlacTtRIyEjNyQiMGxsQyh6UC0mKiEjNjckJCIwJylHMTQpbyJRIyEjNyQiMFFQIkhMdDYmKiEjNjckNyQkIjBpKlxbUXAiUSMhIzckIjAtYUpfPVteKiEjNjckJCIwJylHMTQpbyJRIyEjNyQiMFFQIkhMdDYmKiEjNjckNyQkIjBpKlxbUXAiUSMhIzckIjAtYUpfPVteKiEjNjckJCIvUWNWOHIiUSMhIzYkIjAsOi9LKjRDJiohIzY3JDckJCIwLEtoQzw8USMhIzckIjBRVVEyZnNfKiEjNjckJCIvUWNWOHIiUSMhIzYkIjAsOi9LKjRDJiohIzY3JDckJCIwLEtoQzw8USMhIzckIjBRVVEyZnNfKiEjNjckJCIwUXltaE08USMhIzckIi93KXBDbGtgKiEjNTckNyQkIjBDRVZtUzxRIyEjNyQiMHVJWGkqcFImKiEjNjckJCIwUXltaE08USMhIzckIi93KXBDbGtgKiEjNTckNyQkIjBDRVZtUzxRIyEjNyQiMHVJWGkqcFImKiEjNjckJCIwXHgqM3p2IlEjISM3JCIwI2YvNzYkKVsmKiEjNjckNyQkIjBwJDMtVHciUSMhIzckIi8iPl88U0BiKiEjNTckJCIwXHgqM3p2IlEjISM3JCIwI2YvNzYkKVsmKiEjNjckNyQkIjBwJDMtVHciUSMhIzckIi8iPl88U0BiKiEjNTckJCIwTWw5QSJ5IlEjISM3JCIwLHFCInA+aCYqISM2NyQ3JCQiMCo0L2d2eSJRIyEjNyQiMFkyZnMhZWsmKiEjNjckJCIwTWw5QSJ5IlEjISM3JCIwLHFCInA+aCYqISM2NyQ3JCQiMCo0L2d2eSJRIyEjNyQiMFkyZnMhZWsmKiEjNjckJCIwJUd3YFghPVEjISM3JCIwVXYiXEVjdCYqISM2NyQ3JCQiMEVJKlE1Ij1RIyEjNyQiMCNlZnc3LXgmKiEjNjckJCIwJUd3YFghPVEjISM3JCIwVXYiXEVjdCYqISM2NyQ3JCQiMEVJKlE1Ij1RIyEjNyQiMCNlZnc3LXgmKiEjNjckJCIwSlVjIXojPVEjISM3JCIwPSM+QiRHZmUqISM2NyQ3JCQiMCllLVBYJD1RIyEjNyQiMD0lR0Y9WSplKiEjNjckJCIwSlVjIXojPVEjISM3JCIwPSM+QiRHZmUqISM2NyQ3JCQiMCllLVBYJD1RIyEjNyQiMD0lR0Y9WSplKiEjNjckJCIwUUN0Rl49USMhIzckIjAoR3JMUkgpZiohIzY3JDckJCIwKW9HYiFlPVEjISM3JCIwYXN6UC0+ZyohIzY3JCQiMFFDdEZePVEjISM3JCIwKEdyTFJIKWYqISM2NyQ3JCQiMClvR2IhZT1RIyEjNyQiMGFzelAtPmcqISM2NyQkIjBjSXltdT1RIyEjNyQiMCdcKFFbZjFoKiEjNjckNyQkIjB2U05mIik9USMhIzckIjAiNG1HSE05JyohIzY3JCQiMGNJeW11PVEjISM3JCIwJ1woUVtmMWgqISM2NyQ3JCQiMHZTTmYiKT1RIyEjNyQiMCI0bUdITTknKiEjNjckJCIwNGUpeiEpKj1RIyEjNyQiLypIXSdcLUInKiEjNTckNyQkIjAzKipHOjA+USMhIzckIjBGXCR6TXlFJyohIzY3JCQiMDRlKXohKSo9USMhIzckIi8qSF0nXC1CJyohIzU3JDckJCIwMyoqRzowPlEjISM3JCIwRlwkek15RScqISM2NyQkIjBhbyg0OiM+USMhIzckIi9UJSkpUSFSTicqISM1NyQ3JCQiMEc9NHRHPlEjISM3JCIwalArLkMjUicqISM2NyQkIjBhbyg0OiM+USMhIzckIi9UJSkpUSFSTicqISM1NyQ3JCQiMEc9NHRHPlEjISM3JCIwalArLkMjUicqISM2NyQkIjA+JnlnXCU+USMhIzckIjBIIylcdWJ4ayohIzY3JDckJCIwTy0rTF8+USMhIzckIjAqZnMhZWs7bCohIzY3JCQiMD4meWdcJT5RIyEjNyQiMEgjKVx1YnhrKiEjNjckNyQkIjBPLStMXz5RIyEjNyQiMCpmcyFlaztsKiEjNjckJCIwTSVwSCVvPlEjISM3JCIwMlxQL0AsbSohIzY3JDckJCIwbjYjW2YoPlEjISM3JCIwTjk5ODBUbSohIzY3JCQiME0lcEglbz5RIyEjNyQiMDJcUC9ALG0qISM2NyQ3JCQiMG42I1tmKD5RIyEjNyQiME45OTgwVG0qISM2NyQkIjB0RSwjPio+USMhIzckIi9FXXRpW3MnKiEjNTckNyQkIjB1aXVlKio+USMhIzckIjByLUBvWGxuKiEjNjckJCIwdEUsIz4qPlEjISM3JCIvRV10aVtzJyohIzU3JDckJCIwdWl1ZSoqPlEjISM3JCIwci1Ab1hsbiohIzY3JCQiMHZ5JEhhLCNRIyEjNyQiMCo9IkhXXltvKiEjNjckNyQkIi9ZKmVDQj9RIyEjNiQiMDIiektpKSopbyohIzY3JCQiMHZ5JEhhLCNRIyEjNyQiMCo9IkhXXltvKiEjNjckNyQkIi9ZKmVDQj9RIyEjNiQiMDIiektpKSopbyohIzY3JCQiMDJadSYqUT9RIyEjNyQiMG4oKT5iO3NwKiEjNjckNyQkIjBebVIjcC8jUSMhIzckIjBXek15RTlxKiEjNjckJCIwMlp1JipRP1EjISM3JCIwbigpPmI7c3AqISM2NyQ3JCQiMF5tUiNwLyNRIyEjNyQiMFZ6TXlFOXEqISM2NyQkIjAyeWNdaT9RIyEjNyQiMHU3a2YiZTQoKiEjNjckNyQkIjBbKGVBMTIjUSMhIzckIi95O010J1FyKiEjNTckJCIwMnljXWk/USMhIzckIjB1N2tmImU0KCohIzY3JDckJCIwWyhlQTEyI1EjISM3JCIveTtNdCdRciohIzU3JCQiMG8iPnRnMyNRIyEjNyQiMDI0IXpsJT5zKiEjNjckNyQkIjBMJ1JTVjQjUSMhIzckIjA7Y1speUlFKCohIzY3JCQiMG8iPnRnMyNRIyEjNyQiMDI0IXpsJT5zKiEjNjckNyQkIjBMJ1JTVjQjUSMhIzckIjA7Y1speUlFKCohIzY3JCQiMC0nUmcnNEBRIyEjNyQiMDBvJSlcNlZ0KiEjNjckNyQkIjB5Wih5IT1AUSMhIzckIjBfV2JWWyhRKCohIzY3JCQiMC0nUmcnNEBRIyEjNyQiMDBvJSlcNlZ0KiEjNjckNyQkIjB5Wih5IT1AUSMhIzckIjBfV2JWWyhRKCohIzY3JCQiMFtfeEVMQFEjISM3JCIwPjVMTndtdSohIzY3JDckJCIwYFF3JD05I1EjISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMFtfeEVMQFEjISM3JCIwPjVMTndtdSohIzY3JDckJCIwYFF3JD05I1EjISM3JCIwKUdCJykqKT1eKCohIzY3JCQiMDFhTipvOiNRIyEjNyQiMCkqMyFcNi9mKCohIzY3JDckJCIweGBbaGxAUSMhIzckIjBDQHBgSE93KiEjNjckJCIwMWFOKm86I1EjISM3JCIwKSozIVw2L2YoKiEjNjckNyQkIjB4YFtobEBRIyEjNyQiMENAcGBIT3cqISM2NyQkIjBGcilSMD0jUSMhIzckIjBSRCp5ZVNyKCohIzY3JDckJCIwNGtNVCo9I1EjISM3JCIvJzR3M3FneCohIzU3JCQiMEZyKVIwPSNRIyEjNyQiMFJEKnllU3IoKiEjNjckNyQkIjA0a01UKj0jUSMhIzckIi8nNHczcWd4KiEjNTckJCIwc2ZZPy9BUSMhIzckIjBtOSdcMHgkeSohIzY3JDckJCIwTzQvQjhBUSMhIzckIjAnekhRMV4peSohIzY3JCQiMHNmWT8vQVEjISM3JCIwbTknXDB4JHkqISM2NyQ3JCQiME80L0I4QVEjISM3JCIwJ3pIUTFeKXkqISM2NyQkIjAtKDQqKXlBI1EjISM3JCIwJTNJZF44J3oqISM2NyQ3JCQiL3kqeTFQQVEjISM2JCIwTCcpKik9XjQhKSohIzY3JCQiMC0oNCopeUEjUSMhIzckIjAlM0lkXjgneiohIzY3JDckJCIveSp5MVBBUSMhIzYkIjBMJykqKT1eNCEpKiEjNjckJCIwXiZvJGZeQVEjISM3JCIvS1ArKCpcMykqISM1NyQ3JCQiMDYqUUQ0RSNRIyEjNyQiMHB1J1I8UjgpKiEjNjckJCIwXiZvJGZeQVEjISM3JCIvS1ArKCpcMykqISM1NyQ3JCQiMDYqUUQ0RSNRIyEjNyQiMHB1J1I8UjgpKiEjNjckJCIwSmlpSnZBUSMhIzckIjAicHcmPWszIykqISM2NyQ3JCQiMDxKNyFbRyNRIyEjNyQiMDBqLkhLZSMpKiEjNjckJCIwSmlpSnZBUSMhIzckIjAicHcmPWszIykqISM2NyQ3JCQiMDxKNyFbRyNRIyEjNyQiMDBqLkhLZSMpKiEjNjckJCIwLGIjZiEqSCNRIyEjNyQiMC8pcDAnR0skKSohIzY3JDckJCIwUjUlKXAzQlEjISM3JCIwVF41JUdGUSkqISM2NyQkIjAsYiNmISpII1EjISM3JCIwLylwMCdHSyQpKiEjNjckNyQkIjBSNSUpcDNCUSMhIzckIjBUXjUlR0ZRKSohIzY3JCQiMGUleT9HSyNRIyEjNyQiMGYiPm1IZlgpKiEjNjckNyQkIjAqR145RUwjUSMhIzckIjB4UjxSODImKSohIzY3JCQiMGUleT9HSyNRIyEjNyQiMGYiPm1IZlgpKiEjNjckNyQkIjAqR145RUwjUSMhIzckIjB4UjxSODImKSohIzY3JCQiMDNvQ2dZQlEjISM3JCIwYGk/RWR6JikqISM2NyQ3JCQiMCQqKWVdbE4jUSMhIzckIjA4R0MlUjpqKSohIzY3JCQiMDNvQ2dZQlEjISM3JCIwYGk/RWR6JikqISM2NyQ3JCQiMCQqKWVdbE4jUSMhIzckIjA4R0MlUjpqKSohIzY3JCQiMEZgSFNxQlEjISM3JCIweFl3XEAuKCkqISM2NyQ3JCQiMGk1a10hUSNRIyEjNyQiMFw7SlwlZnYpKiEjNjckJCIwRmBIU3FCUSMhIzckIjB4WXdcQC4oKSohIzY3JDckJCIwaTVrXSFRI1EjISM3JCIwXDtKXCVmdikqISM2NyQkIjB3O0dBJVIjUSMhIzckIjBVJjRyY28jKSkqISM2NyQ3JCQiMCdlIzNbL0NRIyEjNyQiMCdbIVEvTiEpKSkqISM2NyQkIjB3O0dBJVIjUSMhIzckIjBVJjRyY28jKSkqISM2NyQ3JCQiMCdlIzNbL0NRIyEjNyQiMCdbIVEvTiEpKSkqISM2NyQkIi9UbWghPUNRIyEjNiQiMEh0T3lcXSopKiEjNjckNyQkIjBBYWpaR0NRIyEjNyQiMEEkXCVmdi8hKiohIzY3JCQiL1RtaCE9Q1EjISM2JCIwSHRPeVxdKikqISM2NyQ3JCQiMEFhalpHQ1EjISM3JCIwQSRcJWZ2LyEqKiEjNjckJCIwVHovIz5XI1EjISM3JCIwIltBS1FUMioqISM2NyQ3JCQiMDtgL1xfQ1EjISM3JCIwZSI9WGgiSCIqKiEjNjckJCIwVHovIz5XI1EjISM3JCIwIltBS1FUMioqISM2NyQ3JCQiMDtgL1xfQ1EjISM3JCIwZSI9WGgiSCIqKiEjNjckJCIwJFxcKHpsQ1EjISM3JCIwRD1DI3l4PioqISM2NyQ3JCQiMCYpPVZfd0NRIyEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMCRcXCh6bENRIyEjNyQiMEQ9QyN5eD4qKiEjNjckNyQkIjAmKT1WX3dDUSMhIzckIjAlKnBlcGNgIyoqISM2NyQkIjAlUWslcCpbI1EjISM3JCIwJFwwWzw5SyoqISM2NyQ3JCQiMFs0KHkwXSNRIyEjNyQiLyRlbEMoelAqKiEjNTckJCIwJVFrJXAqWyNRIyEjNyQiMCRcMFs8OUsqKiEjNjckNyQkIjBbNCh5MF0jUSMhIzckIi8kZWxDKHpQKiohIzU3JCQiMGZvL2g4RFEjISM3JCIwWDNRaDBYJSoqISM2NyQ3JCQiMG0zNGxDRFEjISM3JCIwbVlzelAtJioqISM2NyQkIjBmby9oOERRIyEjNyQiMFgzUWgwWCUqKiEjNjckNyQkIjBtMzRsQ0RRIyEjNyQiMG1Zc3pQLSYqKiEjNjckJCIwNiU+WHZgI1EjISM3JCIwY2QqPSVwbyYqKiEjNjckNyQkIjBjRU91W0RRIyEjNyQiMC1Oek15RScqKiEjNjckJCIwNiU+WHZgI1EjISM3JCIwY2QqPSVwbyYqKiEjNjckNyQkIjBjRU91W0RRIyEjNyQiMC1Oek15RScqKiEjNjckJCIwXEskKlxoRFEjISM3JCIvLic9O0wjcCoqISM1NyQ3JCQiMEBcaCZHZCNRIyEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBcSyQqXGhEUSMhIzckIi8uJz07TCNwKiohIzU3JDckJCIwQFxoJkdkI1EjISM3JCIwUUInKSopPV4oKiohIzY3JCQiMEIyT1omZSNRIyEjNyQiMHcnPlNvZiIpKiohIzY3JDckJCIwI3BhKSlwZiNRIyEjNyQiMHY2JFwlZnYpKiohIzY3JCQiMEIyT1omZSNRIyEjNyQiMHcnPlNvZiIpKiohIzY3JDckJCIwI3BhKSlwZiNRIyEjNyQiMHY2JFwlZnYpKiohIzY3JCQiME50Zlk0RVEjISM3JCIwMkMwWWdSKioqISM2NyQ3JCQiMD5UKFE2aSNRIyEjNyQiMCwrKysrKysiISM1NyQkIjBOdGZZNEVRIyEjNyQiMDJDMFlnUioqKiEjNjckNyQkIjBeJz5kZGclUSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiLiNSbFwoZVEjISM1JCIwLiNINikqUUdxISM3NyQ3JCQiMHgzcWcmWylRIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIuI1JsXChlUSMhIzUkIjAuI0g2KSpRR3EhIzc3JDckJCIweDNxZyZbKVEjISM3JCIwLiNINikqUUdxISM3NyQkIjBFL18iW3YqUSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwL0BvWGxCUiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEUvXyJbdipRIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAvQG9YbEJSIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYDtdbU1PUiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvTGoxYEMnUiMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGA7XW1NT1IjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL0xqMWBDJ1IjISM2JCIwLiNINikqUUdxISM3NyQkIjB6R1teOXZSIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBkWGs6RCxTIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwekdbXjl2UiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZFhrOkQsUyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDFUWU8lUixDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCR5RDFdKy9DISM3JCIwLiNINikqUUdxISM3NyQkIjAxVFlPJVIsQyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkeUQxXSsvQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwS2BXQHVfUyMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvLDJjWyl5UyMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMEtgV0B1X1MjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLywyY1speVMjISM2JCIwLiNINikqUUdxISM3NyQkIjBmbFUxYSI0QyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBPIyllcWs8VCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGZsVTFhIjRDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME8jKWVxazxUIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJnkyOVIuOEMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwaiVwYlhrOkMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCZ5MjlSLjhDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGolcGJYazpDISM3JCIwLiNINikqUUdxISM3NyQkIjA3ISpRdzhwVCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKm9dMFdfPkMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDchKlF3OHBUIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqb10wV18+QyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUS1QaCR6P0MhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOz5gRC9NVSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFEtUGgkej9DISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDs+YEQvTVUjISM3JCIwLiNINikqUUdxISM3NyQkIjBsOU5ZdFlVIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBWSl41JUdGQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbDlOWXRZVSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVkpeNSVHRkMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCNwSzhMYkdDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHBWXCZSO0pDISM3JCIwLiNINikqUUdxISM3NyQkIjAjcEs4TGJHQyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBwVlwmUjtKQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPVJKO0xDViMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJ2Z2L1EvTkMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD1SSjtMQ1YjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCdmdi9RL05DISM3JCIwLiNINikqUUdxISM3NyQkIjBYXkgsOGpWIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBBb1hsQipRQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWF5ILDhqViMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQW9YbEIqUUMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHJqRidHPlNDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFwhUS9OIUdXIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwcmpGJ0c+U0MhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwXCFRL04hR1cjISM3JCIwLiNINikqUUdxISM3NyQkIjApZmQ3RjJXQyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB2Iz5hTG9ZQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKWZkN0YyV0MhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdiM+YUxvWUMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEMpUWlEJnpXIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAtMFM/ajBYIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQylRaUQmelcjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC0wUz9qMFgjISM3JCIwLiNINikqUUdxISM3NyQkIjBeK0FUSz1YIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBHPFEwVldYIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXitBVEs9WCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRzxRMFZXWCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHg3P0U3ZFgjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGJITyFIS2VDISM3JCIwLiNINikqUUdxISM3NyQkIjB4Nz9FN2RYIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBiSE8hSEtlQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwL0Q9NiNmZkMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIj1XYEY/aUMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC9EPTYjZmZDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCI9V2BGP2lDISM3JCIwLiNINikqUUdxISM3NyQkIi90amg+WmpDISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDNhS2cjM21DISM3JCIwLiNINikqUUdxISM3NyQkIi90amg+WmpDISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDNhS2cjM21DISM3JCIwLiNINikqUUdxISM3NyQkIjBkXDkiPU5uQyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBNbUlYaSpwQyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZFw5Ij1ObkMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTW1JWGkqcEMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCQ9RWg7QnJDISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGh5R0lVUVojISM3JCIwLiNINikqUUdxISM3NyQkIjAkPUVoO0JyQyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBoeUdJVVFaIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvVDI2OjZ2QyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjAoM3BfQHN4QyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvVDI2OjZ2QyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjAoM3BfQHN4QyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUCcpM08iKip5QyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA5LkQrLTtbIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUCcpM08iKip5QyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA5LkQrLTtbIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwailwNTcoR1sjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFQ6QiY9WyZbIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwailwNTcoR1sjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFQ6QiY9WyZbIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvNF5nNXYnWyMhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwbkZAcWgkKlsjISM3JCIwLiNINikqUUdxISM3NyQkIi80Xmc1didbIyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBuRkBxaCQqWyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDtCLiI0aiFcIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlKlI+YlRLXCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDtCLiI0aiFcIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlKlI+YlRLXCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFZOLHc1WFwjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL0F2LDk3KFwjISM2JCIwLiNINikqUUdxISM3NyQkIjBWTix3NVhcIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9Bdiw5NyhcIyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwcFoqNDFSKVwjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFprOkQsNV0jISM3JCIwLiNINikqUUdxISM3NyQkIjBwWio0MVIpXCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWms6RCw1XSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCcqZihmL0YtRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0dzg1IilbXSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCcqZihmL0YtRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0dzg1IilbXSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEFzJjQuOjFEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLio9XjR3M0QhIzUkIjAuI0g2KSpRR3EhIzc3JCQiMEFzJjQuOjFEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLio9XjR3M0QhIzUkIjAuI0g2KSpRR3EhIzc3JCQiMFwlUWYsLjVEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEUsNSEzazdEISM3JCIwLiNINikqUUdxISM3NyQkIjBcJVFmLC41RCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBFLDUhM2s3RCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdic+NCsiUl4jISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGA4M2w/bF4jISM3JCIwLiNINikqUUdxISM3NyQkIjB2Jz40KyJSXiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYDgzbD9sXiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC00IWYpKnk8RCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB6RDFdKy9fIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLTQhZikqeTxEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHpEMV0rL18jISM3JCIwLiNINikqUUdxISM3NyQkIjBHQCkzKHA7XyMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMVEvTiFHQ0QhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEdAKTMocDtfIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAxUS9OIUdDRCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYkwnZSZcYl8jISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMExdLT9nIkdEISM3JCIwLiNINikqUUdxISM3NyQkIjBiTCdlJlxiXyMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTF0tP2ciR0QhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCNlVzMlSCVIRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBmaSswUz9gIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwI2VXMyVIJUhEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGZpKzBTP2AjISM3JCIwLiNINikqUUdxISM3NyQkIjAzZSNlIzRMYCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJ1soKSoqKT5mYCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDNlI2UjNExgIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAnWygpKiopPmZgIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTnEhMyIqPVBEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDcob1woKnpSRCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTnEhMyIqPVBEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDcob1woKnpSRCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaCMpeSYqbzVhIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBSKlwqZnpPYSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGgjKXkmKm81YSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUipcKmZ6T2EjISM3JCIwLiNINikqUUdxISM3NyQkIjApW3AyKVtcYSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbDYkXCVmdmEjISM3JCIwLiNINikqUUdxISM3NyQkIjApW3AyKVtcYSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbDYkXCVmdmEjISM3JCIwLiNINikqUUdxISM3NyQkIjA5MnZsRylbRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjUjcqSFI5YiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDkydmxHKVtEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCNSNypIUjliIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwVD50XTNGYiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPU8qWyI+YGIjISM3JCIwLiNINikqUUdxISM3NyQkIjBUPnRdM0ZiIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA9TypbIj5gYiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG5Kck4pZWNEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFhbKCkqKik+ZkQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG5Kck4pZWNEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFhbKCkqKik+ZkQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCVSJXA/by9jIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjByZyZbKXlJYyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCVSJXA/by9jIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjByZyZbKXlJYyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiL2l2YyFbVmMjISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMClIUClwZXBjIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvaXZjIVtWYyMhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKUhQKXBlcGMjISM3JCIwLiNINikqUUdxISM3NyQkIjBab2whekFvRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBDJj1bJlEzZCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFpvbCF6QW9EISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEMmPVsmUTNkIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdCFRY3g1c0QhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwXigqelI9WmQjISM3JCIwLiNINikqUUdxISM3NyQkIjB0IVFjeDVzRCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeKCp6Uj1aZCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiLiQ+MXcpZmQjISM1JCIwLiNINikqUUdxISM3NyQ3JCQiMHg0eUMpZnlEISM3JCIwLiNINikqUUdxISM3NyQkIi4kPjF3KWZkIyEjNSQiMC4jSDYpKlFHcSEjNzckNyQkIjB4NHlDKWZ5RCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRTBnWG4pekQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwL0F3NHlDZSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEUwZ1huKXpEISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC9BdzR5Q2UjISM3JCIwLiNINikqUUdxISM3NyQkIjBgPGVJWlBlIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9WVlp6TidlIyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwYDxlSVpQZSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvVlZaek4nZSMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMHpIYzpGd2UjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGRZc3pQLWYjISM3JCIwLiNINikqUUdxISM3NyQkIjB6SGM6RndlIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBkWXN6UC1mIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMVVhKzI6ZiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJCllcWs8VGYjISM3JCIwLiNINikqUUdxISM3NyQkIjAxVWErMjpmIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkKWVxazxUZiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEthXyZvUSZmIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi82KG9cKCp6ZiMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMEthXyZvUSZmIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi82KG9cKCp6ZiMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGZtXXFtIypmIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBPJG9ZdCg9ZyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGZtXXFtIypmIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBPJG9ZdCg9ZyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCYpeVtiWUpnIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBqJlwnPmRkZyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCYpeVtiWUpnIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBqJlwnPmRkZyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDcicC9rLTJFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCp5SVlxajRFISM3JCIwLiNINikqUUdxISM3NyQkIjA3InAvay0yRSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqeUlZcWo0RSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUS5YRDE0aCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOz9oKm9eOEUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFEuWEQxNGgjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDs/aCpvXjhFISM3JCIwLiNINikqUUdxISM3NyQkIjBsOlY1J3k5RSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBVS2Z1J1I8RSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbDpWNSd5OUUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVUtmdSdSPEUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCJ6N2FmbT1FISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHBXZGZ3N2kjISM3JCIwLiNINikqUUdxISM3NyQkIjAiejdhZm09RSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBwV2RmdzdpIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPVNSIWVhQUUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJnBiWGs6REUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD1TUiFlYUFFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCZwYlhrOkRFISM3JCIwLiNINikqUUdxISM3NyQkIjBXX1BsRGtpIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBBcGBITyFIRSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwV19QbERraSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQXBgSE8hSEUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHJrTl0wLmojISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFsiPVhoIkhqIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwcmtOXTAuaiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWyI9WGgiSGojISM3JCIwLiNINikqUUdxISM3NyQkIjApcFBgYD1NRSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB2JCpcKmZ6T0UhIzckIjAuI0g2KSpRR3EhIzc3JCQiMClwUGBgPU1FISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHYkKlwqZnpPRSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQyo9Ll8xUUUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLTFbJWVuU0UhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEMqPS5fMVFFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC0xWyVlblNFISM3JCIwLiNINikqUUdxISM3NyQkIjBeLEkwWD5rIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBHPVlwYlhrIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXixJMFg+ayMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRz1ZcGJYayMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHg4RyFcI2VrIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBiSVdhTiVbRSEjNyQiMC4jSDYpKlFHcSEjNzckJCIweDhHIVwjZWsjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGJJV2FOJVtFISM3JCIwLiNINikqUUdxISM3NyQkIjAvRUV2LyhcRSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAiR0MlUjpCbCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC9FRXYvKFxFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCJHQyVSOkJsIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvJFFDZyVlYEUhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwM2JTQyY+Y0UhIzckIjAuI0g2KSpRR3EhIzc3JCQiLyRRQ2clZWBFISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDNiU0MmPmNFISM3JCIwLiNINikqUUdxISM3NyQkIjBkXUFYa3VsIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBNblE0dittIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZF1BWGt1bCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTW5RNHYrbSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCRHMS1WTWhFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGh6TyVcJlJtIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJEcxLVZNaEUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwaHpPJVwmUm0jISM3JCIwLiNINikqUUdxISM3NyQkIi9eKD06Q19tIyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjAoPVwkek15bSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiL14oPTpDX20jISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMCg9XCR6TXltIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTyhvLFM1cEUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOS9Mazk8biMhIzckIjAuI0g2KSpRR3EhIzc3JCQiME8obyxTNXBFISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDkvTGs5PG4jISM3JCIwLiNINikqUUdxISM3NyQkIjBqKlxeUSlIbiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvazYkXCVmdkUhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGoqXF5RKUhuIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9rNiRcJWZ2RSEjNiQiMC4jSDYpKlFHcSEjNzckJCIwKj1KLFAnb24jISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG5HSE11JXpFISM3JCIwLiNINikqUUdxISM3NyQkIjAqPUosUCdvbiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbkdITXUlekUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDtDNmJWMm8jISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCQ0dSM+YUxvIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwO0M2YlYybyMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJDR1Iz5hTG8jISM3JCIwLiNINikqUUdxISM3NyQkIjBVTzRTQllvIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9LYlVTQihvIyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwVU80U0JZbyMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvS2JVU0IobyMhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMHBbMkQuJilvIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBZbEIqUTYicCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHBbMkQuJilvIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBZbEIqUTYicCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCY0YytKUSNwIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0eEB1JCpccCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCY0YytKUSNwIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0eEB1JCpccCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEF0LiZIRSdwIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqKiopPmZ0KSlwIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQXQuJkhFJ3AjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCoqKik+ZnQpKXAjISM3JCIwLiNINikqUUdxISM3NyQkIjBbJj0rRzkrRiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBFLT1XYEZxIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWyY9K0c5K0YhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRS09V2BGcSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHYoKipcRS0vRiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBfOTtITG1xIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdigqKlxFLS9GISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMF85O0hMbXEjISM3JCIwLiNINikqUUdxISM3NyQkIjAsNSkqXC16cSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwekU5OTgwciMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCw1KSpcLXpxIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB6RTk5ODByIyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwR0EnXEJ5NkYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMFI3KkhSOUYhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEdBJ1xCeTZGISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDBSNypIUjlGISM3JCIwLiNINikqUUdxISM3NyQkIjBhTSUqPmljciMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwS141JUdGPUYhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGFNJSo+aWNyIyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBLXjUlR0Y9RiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwIm9DXD9hPkYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZWozcF9AcyMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCJvQ1w/YT5GISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGVqM3BfQHMjISM3JCIwLiNINikqUUdxISM3NyQkIjAyZiEqKj1VQkYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJmVuU0QuRUYhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDJmISoqPVVCRiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmZW5TRC5FRiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTXIpWzxJRkYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwNilbIVI3KkhGISM3JCIwLiNINikqUUdxISM3NyQkIjBNcilbPElGRiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA2KVshUjcqSEYhIzckIjAuI0g2KSpRR3EhIzc3JCQiL09vKWYiPUpGISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFErLkMjekxGISM3JCIwLiNINikqUUdxISM3NyQkIi9PbylmIj1KRiEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBRKy5DI3pMRiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKGVcWzkxTkYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwazcsNHN3dCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMChlXFs5MU5GISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGs3LDRzd3QjISM3JCIwLiNINikqUUdxISM3NyQkIjA4MyQpSFQqUUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIlwjKlI+YlRGISM3JCIwLiNINikqUUdxISM3NyQkIjA4MyQpSFQqUUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIlwjKlI+YlRGISM3JCIwLiNINikqUUdxISM3NyQkIi8vN1s2I0d1IyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjA8UCgqeUphdSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiLy83WzYjR3UjISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDxQKCp5SmF1IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbUt6KjRxWUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwV1wmUjtKXEYhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG1Leio0cVlGISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFdcJlI7SlxGISM3JCIwLiNINikqUUdxISM3NyQkIjAkXHVaM2VdRiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi88TypbIj5gRiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwJFx1WjNlXUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvPE8qWyI+YEYhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMD5kdnBnV3YjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMChSPFI4MmRGISM3JCIwLiNINikqUUdxISM3NyQkIjA+ZHZwZ1d2IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAoUjxSODJkRiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWXB0YVMkZUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQicpKik9XjR3IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWXB0YVMkZUYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQicpKik9XjR3IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwcyI9KFI/QXcjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLyYpelE1JFt3IyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwcyI9KFI/QXcjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLyYpelE1JFt3IyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwKlIqcEMraHcjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHc1JykpM3JvRiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKlIqcEMraHcjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHc1JykpM3JvRiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRDFvNCEpKnBGISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC5CJVEyZnNGISM3JCIwLiNINikqUUdxISM3NyQkIjBEMW80ISkqcEYhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLkIlUTJmc0YhIzckIjAuI0g2KSpRR3EhIzc3JCQiMF89bSUqZlF4IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBITiMpZXFreCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMF89bSUqZlF4IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBITiMpZXFreCMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHlJa3pSeHgjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGNaIVEvTiF5IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIweUlrelJ4eCMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwY1ohUS9OIXkjISM3JCIwLiNINikqUUdxISM3NyQkIjAwVmlrPjt5IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjKWZ5R0lVeSMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDBWaWs+O3kjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCMpZnlHSVV5IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwSmJnXCpcJnkjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDRzdzg1Iil5IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwSmJnXCpcJnkjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDRzdzg1Iil5IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZW5lTXokKnkjISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME4lWygpKiopPnojISM3JCIwLiNINikqUUdxISM3NyQkIjBlbmVNeiQqeSMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTiVbKCkqKik+eiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCUpemM+Zkt6IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBpJ0hQKXBleiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCUpemM+Zkt6IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBpJ0hQKXBleiMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDYjXFghUnJ6IyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjApKTNyb1woKnojISM3JCIwLiNINikqUUdxISM3NyQkIjA2I1xYIVJyeiMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKSkzcm9cKCp6IyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUC9gKik9NSFHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDpAcGBITyFHISM3JCIwLiNINikqUUdxISM3NyQkIjBQL2AqKT01IUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOkBwYEhPIUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMGs7XnUpKlshRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBUTG5RNHYhRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaztedSkqWyFHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFRMblE0diFHISM3JCIwLiNINikqUUdxISM3NyQkIi8qR1xmeSgzRyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBvWGxCKlE2RyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvKkdcZnkoM0chIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwb1hsQipRNkchIzckIjAuI0g2KSpRR3EhIzc3JCQiMDxUWldlRSJHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCV6TiczcF8iRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPFRaV2VFIkchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJXpOJzNwXyJHISM3JCIwLiNINikqUUdxISM3NyQkIjBWYFhIUWwiRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBAcWgkKlsiPkchIzckIjAuI0g2KSpRR3EhIzc3JCQiMFZgWEhRbCJHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEBxaCQqWyI+RyEjNyQiMC4jSDYpKlFHcSEjNzckJCIvZE9XIj0vI0chIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwWiMpZnlHSSNHISM3JCIwLiNINikqUUdxISM3NyQkIi9kT1ciPS8jRyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBaIylmeUdJI0chIzckIjAuI0g2KSpRR3EhIzc3JCQiMCd6PCUqekhDRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB1JXpOJzNwI0chIzckIjAuI0g2KSpRR3EhIzc3JCQiMCd6PCUqekhDRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB1JXpOJzNwI0chIzckIjAuI0g2KSpRR3EhIzc3JCQiMEIhKlIleTxHRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi4yY1speUlHISM1JCIwLiNINikqUUdxISM3NyQkIjBCISpSJXk8R0chIzckIjAuI0g2KSpRR3EhIzc3JDckJCIuMmNbKXlJRyEjNSQiMC4jSDYpKlFHcSEjNzckJCIvRCFRcGQ/JEchIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwRj5hTG9ZJEchIzckIjAuI0g2KSpRR3EhIzc3JCQiL0QhUXBkPyRHISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMEY+YUxvWSRHISM3JCIwLiNINikqUUdxISM3NyQkIjB3OU9hUGYkRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBgSl89WyZRRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdzlPYVBmJEchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYEpfPVsmUUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMC5GTVI8KVJHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL1EvTiFHQyVHISM2JCIwLiNINikqUUdxISM3NyQkIjAuRk1SPClSRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9RL04hR0MlRyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwSFJLQyhwVkchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMmNbKXlJWUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMEhSS0MocFZHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDJjWyl5SVlHISM3JCIwLiNINikqUUdxISM3NyQkIjBjXkk0eHYlRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBMb1l0KD1dRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwY15JNHh2JUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTG9ZdCg9XUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMCNRJ0clcFheRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8xWyVlblMmRyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwI1EnRyVwWF5HISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLzFbJWVuUyZHISM2JCIwLiNINikqUUdxISM3NyQkIjA0d0V6T2AmRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAnR0hNdSV6JkchIzckIjAuI0g2KSpRR3EhIzc3JCQiMDR3RXpPYCZHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCdHSE11JXomRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTilbVW1AZkchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwODBUR0Y9J0chIzckIjAuI0g2KSpRR3EhIzc3JCQiME4pW1VtQGZHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDgwVEdGPSdHISM3JCIwLiNINikqUUdxISM3NyQkIjBpK0JcJzRqRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBSPFI4MmQnRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaStCXCc0akchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUjxSODJkJ0chIzckIjAuI0g2KSpRR3EhIzc3JCQiMClHNlVqKHAnRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBtSFApcGVwRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKUc2VWoocCdHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG1IUClwZXBHISM3JCIwLiNINikqUUdxISM3NyQkIjA6RD4+YzMoRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjPmFMb1l0RyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwOkQ+PmMzKEchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIz5hTG9ZdEchIzckIjAuI0g2KSpRR3EhIzc3JCQiMFRQPC9PWihHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMD5hTG9ZdChHISM3JCIwLiNINikqUUdxISM3NyQkIjBUUDwvT1ooRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA+YUxvWXQoRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwb1w6KmVoeUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWG1KYEU3KUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMG9cOiplaHlHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFhtSmBFNylHISM3JCIwLiNINikqUUdxISM3NyQkIjAlPk9UZFwjKUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwc3lIUTFeKUchIzckIjAuI0g2KSpRR3EhIzc3JCQiMCU+T1RkXCMpRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBzeUhRMV4pRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQHU2ZnZqKUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKTR6S2kpKikpRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQHU2ZnZqKUchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKTR6S2kpKikpRyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWicpNFdiLSpHISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEQuRTNtRypHISM3JCIwLiNINikqUUdxISM3NyQkIjBaJyk0V2ItKkchIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRC5FM21HKkchIzckIjAuI0g2KSpRR3EhIzc3JCQiMHUpeiFITlQqRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeOkMkZnUnKkchIzckIjAuI0g2KSpRR3EhIzc3JCQiMHUpeiFITlQqRyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeOkMkZnUnKkchIzckIjAuI0g2KSpRR3EhIzc3JCQiLjYxOTohKSpHISM1JCIwLiNINikqUUdxISM3NyQ3JCQiMHlGQXlEMSFIISM3JCIwLiNINikqUUdxISM3NyQkIi42MTk6ISkqRyEjNSQiMC4jSDYpKlFHcSEjNzckNyQkIjB5RkF5RDEhSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRkIvKlwqPSFIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC9TP2owWCFIISM3JCIwLiNINikqUUdxISM3NyQkIjBGQi8qXCo9IUghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwL1M/ajBYIUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMGBOLSVbeDBIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEpfPVsmUTNIISM3JCIwLiNINikqUUdxISM3NyQkIjBgTi0lW3gwSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBKXz1bJlEzSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIveS8hcGEnNEghIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwZGs7TGxBIkghIzckIjAuI0g2KSpRR3EhIzc3JCQiL3kvIXBhJzRIISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMGRrO0xsQSJIISM3JCIwLiNINikqUUdxISM3NyQkIjAxZylSWGA4SCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlb1oiPVhoIkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMDFnKVJYYDhIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCVvWiI9WGgiSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTHMnKlE5dSJIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLyIqR0pdLT9IISM2JCIwLiNINikqUUdxISM3NyQkIjBMcycqUTl1IkghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvIipHSl0tP0ghIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGYlW1JVSEBIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFAsNilbIVIjSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZiVbUlVIQEghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUCw2KVshUiNIISM3JCIwLiNINikqUUdxISM3NyQkIjAnb0gqM3VeI0ghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwajg0dCV5RkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMCdvSCozdV4jSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBqODR0JXlGSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwNzQiUlIwSEghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvZnMhZWs7JEghIzYkIjAuI0g2KSpRR3EhIzc3JCQiMDc0IlJSMEhIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL2ZzIWVrOyRIISM2JCIwLiNINikqUUdxISM3NyQkIjBSQCopeUxIJEghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwO1EwVldiJEghIzckIjAuI0g2KSpRR3EhIzc3JCQiMFJAKil5TEgkSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA7UTBWV2IkSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbEwoUU8ibyRIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFZdLkdDJVJIISM3JCIwLiNINikqUUdxISM3NyQkIjBsTChRTyJvJEghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVl0uR0MlUkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMCNmYSlbJHBTSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBwaSw4L0wlSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwI2ZhKVskcFNIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHBpLDgvTCVIISM3JCIwLiNINikqUUdxISM3NyQkIjA9ZSRRTGRXSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAnXCgqelI9WkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMD1lJFFMZFdIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCdcKCp6Uj1aSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWHEiKT1gJVtIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEEoeUhRMV5IISM3JCIwLiNINikqUUdxISM3NyQkIjBYcSIpPWAlW0ghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQSh5SFExXkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMHIjKXouTEImSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBcKmZ6TyVcJkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMHIjKXouTEImSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBcKmZ6TyVcJkghIzckIjAuI0g2KSpRR3EhIzc3JCQiMClceigpR0BjSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB2NiVITiMpZUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMClceigpR0BjSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB2NiVITiMpZUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMEMyd3QjNGdIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC1DI3pMcWlIISM3JCIwLiNINikqUUdxISM3NyQkIjBDMnd0IzRnSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAtQyN6THFpSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXj51ZXNSJ0ghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwR08hSEtlbUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMF4+dWVzUidIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEdPIUhLZW1IISM3JCIwLiNINikqUUdxISM3NyQkIjB4SnNWX3knSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBiWyl5SVlxSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIweEpzVl95J0ghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYlspeUlZcUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMC9XcUdLPChIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCIzbUdITXVIISM3JCIwLiNINikqUUdxISM3NyQkIjAvV3FHSzwoSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAiM21HSE11SCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvaiZvODdjKEghIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwM3QleUZBeUghIzckIjAuI0g2KSpRR3EhIzc3JCQiL2ombzg3YyhIISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDN0JXlGQXlIISM3JCIwLiNINikqUUdxISM3NyQkIjBkb20pPlx6SCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBNJkdHRTUjKUghIzckIjAuI0g2KSpRR3EhIzc3JCQiMGRvbSk+XHpIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME0mR0dFNSMpSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJDNbTz1QJClIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGgoNHlDKWYpSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJDNbTz1QJClIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGgoNHlDKWYpSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvSkgnb15zKUghIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKCk0ektpKSopSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvSkgnb15zKUghIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKCk0ektpKSopSCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTzBoYEo2KkghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOUF4PFVQKkghIzckIjAuI0g2KSpRR3EhIzc3JCQiME8waGBKNipIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDlBeDxVUCpIISM3JCIwLiNINikqUUdxISM3NyQkIjBqPGZRNl0qSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9XYEY/aSgqSCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwajxmUTZdKkghIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvV2BGP2koKkghIzYkIjAuI0g2KSpRR3EhIzc3JCQiMCopSGRCIiopKSpIISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG5ZdCg9XSxJISM3JCIwLiNINikqUUdxISM3NyQkIjAqKUhkQiIqKSkqSCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBuWXQoPV0sSSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwO1ViM3JGKyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJCplcnMiUTBJISM3JCIwLiNINikqUUdxISM3NyQkIjA7VWIzckYrJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkKmVycyJRMEkhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFVhYCQ0bDFJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLzcocGRoIzRJISM2JCIwLiNINikqUUdxISM3NyQkIjBVYWAkNGwxSSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi83KHBkaCM0SSEjNiQiMC4jSDYpKlFHcSEjNzckJCIwcG1eeUkwLCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWSR5RTk5OEkhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHBtXnlJMCwkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFkkeUU5OThJISM3JCIwLiNINikqUUdxISM3NyQkIjAmKnlcajVXLCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdCZmdzctPEkhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCYqeVxqNVcsJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0JmZ3Ny08SSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQSJ6JVshSD1JISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCp6U0U2ITQtJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQSJ6JVshSD1JISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCp6U0U2ITQtJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWy5ZTHFALSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRT9pKDR5Q0khIzckIjAuI0g2KSpRR3EhIzc3JCQiMFsuWUxxQC0kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEU/aSg0eUNJISM3JCIwLiNINikqUUdxISM3NyQkIjB2Olc9XWctJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBfS2cjM21HSSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdjpXPV1nLSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwX0tnIzNtR0khIzckIjAuI0g2KSpRR3EhIzc3JCQiMC1HVS5JKkhJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHpXZW5TRC4kISM3JCIwLiNINikqUUdxISM3NyQkIjAtR1UuSSpISSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB6V2VuU0QuJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwR1NTKSk0US4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDBkY18/ay4kISM3JCIwLiNINikqUUdxISM3NyQkIjBHU1MpKTRRLiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMGRjXz9rLiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGJfUXQqb1BJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEtwYVArLi8kISM3JCIwLiNINikqUUdxISM3NyQkIjBiX1F0Km9QSSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBLcGFQKy4vJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwIlttJGVwOi8kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGUiR0QtPVdJISM3JCIwLiNINikqUUdxISM3NyQkIjAiW20kZXA6LyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZSJHRC09V0khIzckIjAuI0g2KSpRR3EhIzc3JCQiMDJ4TVZcYS8kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCZRNHYrMVtJISM3JCIwLiNINikqUUdxISM3NyQkIjAyeE1WXGEvJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmUTR2KzFbSSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTSpHJEdIJFxJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDYxXCMqUj4wJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTSpHJEdIJFxJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDYxXCMqUj4wJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaCxKODRLMCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUT1aeD5lMCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGgsSjg0SzAkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFE9Wng+ZTAkISM3JCIwLiNINikqUUdxISM3NyQkIjAoUSJIKSopM2RJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGxJWGkqcGZJISM3JCIwLiNINikqUUdxISM3NyQkIjAoUSJIKSopM2RJISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGxJWGkqcGZJISM3JCIwLiNINikqUUdxISM3NyQkIjA5RUYkKW80MSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIkhNdSV6TjEkISM3JCIwLiNINikqUUdxISM3NyQkIjA5RUYkKW80MSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIkhNdSV6TjEkISM3JCIwLiNINikqUUdxISM3NyQkIi8lUURvW1sxJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjA9YlRLZnUxJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvJVFEb1tbMSQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwPWJUS2Z1MSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG5dQmBHKG9JISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFduUjxSODIkISM3JCIwLiNINikqUUdxISM3NyQkIjBuXUJgRyhvSSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBXblI8UjgyJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJEg7I1EzRTIkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHJ6UC0+XzIkISM3JCIwLiNINikqUUdxISM3NyQkIjAkSDsjUTNFMiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwcnpQLT5fMiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiL18oPkIpW3dJISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvXyg+Qilbd0khIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKD5mdCkpNHpJISM3JCIwLiNINikqUUdxISM3NyQkIjBZKHkiM28uMyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQy9Nc3lIMyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFkoeSIzby4zJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBDL01zeUgzJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdCpmSnpDJTMkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL2xAdCZlbzMkISM2JCIwLiNINikqUUdxISM3NyQkIjB0KmZKekMlMyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvbEB0JmVvMyQhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMCo+VCJ5RiIpMyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIweEdJVVEyNCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCo+VCJ5RiIpMyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIweEdJVVEyNCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEVDN2oyPzQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC5UR0Y9WTQkISM3JCIwLiNINikqUUdxISM3NyQkIjBFQzdqMj80JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAuVEdGPVk0JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwX081WygpZTQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwX081WygpZTQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL0xsQSIpXCk0JCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwelszTG4oKjQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGNsQyh6UC1KISM3JCIwLiNINikqUUdxISM3NyQkIjB6WzNMbigqNCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwY2xDKHpQLUohIzckIjAuI0g2KSpRR3EhIzc3JCQiMDBoMT1aTzUkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCR5RkF5RDFKISM3JCIwLiNINikqUUdxISM3NyQkIjAwaDE9Wk81JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkeUZBeUQxSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwS3QvLkZ2NSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwNCE0c3c4NUohIzckIjAuI0g2KSpRR3EhIzc3JCQiMEt0Ly5GdjUkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDQhNHN3ODVKISM3JCIwLiNINikqUUdxISM3NyQkIjBlJkchKW9TNkohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTy0+XzxTNiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGUmRyEpb1M2SiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBPLT5fPFM2JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJnk0SW5HOkohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwaTk8UCgqeTYkISM3JCIwLiNINikqUUdxISM3NyQkIjAmeTRJbkc6SiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBpOTxQKCp5NiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDY1KnpsOz5KISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCpvX0BzeEBKISM3JCIwLiNINikqUUdxISM3NyQkIjA2NSp6bDs+SiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqb19Ac3hASiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUUEoSGsvQkohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOlI4MmRjNyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFFBKEhrL0JKISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDpSODJkYzckISM3JCIwLiNINikqUUdxISM3NyQkIjBrTSZ6aSNwNyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVV42I3BgSEohIzckIjAuI0g2KSpRR3EhIzc3JCQiMGtNJnppI3A3JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBVXjYjcGBISiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwInBNSGghMzgkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG9qNHg7TTgkISM3JCIwLiNINikqUUdxISM3NyQkIjAicE1IaCEzOCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwb2o0eDtNOCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDxmInpmb01KISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCZmeD9tSFBKISM3JCIwLiNINikqUUdxISM3NyQkIjA8ZiJ6Zm9NSiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmZng/bUhQSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwV3IqR2VjUUohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQCllcWs8VEohIzckIjAuI0g2KSpRR3EhIzc3JCQiMFdyKkdlY1FKISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEApZXFrPFRKISM3JCIwLiNINikqUUdxISM3NyQkIi9QeXljV1VKISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFsrL0tjXTkkISM3JCIwLiNINikqUUdxISM3NyQkIi9QeXljV1VKISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFsrL0tjXTkkISM3JCIwLiNINikqUUdxISM3NyQkIjAoZmZHYktZSiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB1Ny08TypbSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKGZmR2JLWUohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdTctPE8qW0ohIzckIjAuI0g2KSpRR3EhIzc3JCQiMEIzJXlgP11KISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCxEKy07RzokISM3JCIwLiNINikqUUdxISM3NyQkIjBCMyV5YD9dSiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAsRCstO0c6JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvMEFHXzNhSiEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBGUClwZXBjSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIvMEFHXzNhSiEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBGUClwZXBjSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwd0sheV0nejokISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGFcJz5kZGdKISM3JCIwLiNINikqUUdxISM3NyQkIjB3SyF5XSd6OiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYVwnPmRkZ0ohIzckIjAuI0g2KSpRR3EhIzc3JCQiMC5YeSNcJT07JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi89WXBiWGtKISM2JCIwLiNINikqUUdxISM3NyQkIjAuWHkjXCU9OyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvPVlwYlhrSiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwSGR3eENkOyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMnUjPmFMb0ohIzckIjAuI0g2KSpRR3EhIzc3JCQiMEhkd3hDZDskISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDJ1Iz5hTG9KISM3JCIwLiNINikqUUdxISM3NyQkIjBjcHVpLydwSiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBMJzNwX0BzSiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwY3B1aS8ncEohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTCczcF9Ac0ohIzckIjAuI0g2KSpRR3EhIzc3JCQiMCM9R3hXW3RKISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLycpKik9XjR3SiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwIz1HeFdbdEohIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvJykqKT1eNHdKISM2JCIwLiNINikqUUdxISM3NyQkIjA0JTRGVk94SiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAnM3JvXCgqekohIzckIjAuI0g2KSpRR3EhIzc3JCQiMDQlNEZWT3hKISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCczcm9cKCp6SiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTjFwPFc3PSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOEImPVsmUT0kISM3JCIwLiNINikqUUdxISM3NyQkIjBOMXA8Vzc9JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA4QiY9WyZRPSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGk9bi1DXj0kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFJOJG9ZdCg9JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaT1uLUNePSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUk4kb1l0KD0kISM3JCIwLiNINikqUUdxISM3NyQkIjApM2B3USsqPSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbVoiPVhoIj4kISM3JCIwLiNINikqUUdxISM3NyQkIjApM2B3USsqPSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbVoiPVhoIj4kISM3JCIwLiNINikqUUdxISM3NyQkIjA6VmpzJClHPiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIypmek8lXCY+JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwOlZqcyQpRz4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCMqZnpPJVwmPiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFRiaGRqbj4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMD5zeEB1JCo+JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwVGJoZGpuPiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPnN4QHUkKj4kISM3JCIwLiNINikqUUdxISM3NyQkIjBvbmZVVjE/JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBYJWVuU0QuSyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwb25mVVYxPyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWCVlblNELkshIzckIjAuI0g2KSpRR3EhIzc3JCQiMCUqemRGQlg/JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBzJ1I8UjgySyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJSp6ZEZCWD8kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHMnUjxSODJLISM3JCIwLiNINikqUUdxISM3NyQkIjBAI2ZESlMzSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjApKjNzdzg1QCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEAjZkRKUzNLISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWi9hKEhHN0shIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwREBxaCQqW0AkISM3JCIwLiNINikqUUdxISM3NyQkIjBaL2EoSEc3SyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBEQHFoJCpbQCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHU7XyNHOztLISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMF5Mb1l0KD1LISM3JCIwLiNINikqUUdxISM3NyQkIjB1O18jRzs7SyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeTG9ZdCg9SyEjNyQiMC4jSDYpKlFHcSEjNzckJCIuSF1uVStBJCEjNSQiMC4jSDYpKlFHcSEjNzckNyQkIjB5WG1KYEVBJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIuSF1uVStBJCEjNSQiMC4jSDYpKlFHcSEjNzckNyQkIjB5WG1KYEVBJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRlRbX0FSQSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwL2VrO0xsQSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEZUW19BUkEkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC9laztMbEEkISM3JCIwLiNINikqUUdxISM3NyQkIjBgYFlQLXlBJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBKcWksOC9CJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYGBZUC15QSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwSnFpLDgvQiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiL2VZQ0FvSkshIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwZCMzbUdITUshIzckIjAuI0g2KSpRR3EhIzc3JCQiL2VZQ0FvSkshIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwZCMzbUdITUshIzckIjAuI0g2KSpRR3EhIzc3JCQiMDF5VTJpYkIkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCVbKmVycyJRSyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMXlVMmliQiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJVsqZXJzIlFLISM3JCIwLiNINikqUUdxISM3NyQkIjBMITRDPldSSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9ycWxEMFVLISM2JCIwLiNINikqUUdxISM3NyQkIjBMITRDPldSSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9ycWxEMFVLISM2JCIwLiNINikqUUdxISM3NyQkIjBmLVJ4QExDJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBQPmJUS2ZDJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZi1SeEBMQyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwUD5iVEtmQyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCdbckI7P1pLISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGpKYEU3KVxLISM3JCIwLiNINikqUUdxISM3NyQkIjAnW3JCOz9aSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBqSmBFNylcSyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwN0ZOWiIzXkshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvUjk6QHBgSyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwN0ZOWiIzXkshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvUjk6QHBgSyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwUlJMS2hcRCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwO2NcJz5kZEshIzckIjAuI0g2KSpRR3EhIzc3JCQiMFJSTEtoXEQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDtjXCc+ZGRLISM3JCIwLiNINikqUUdxISM3NyQkIjBsXko8VCllSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBWb1oiPVhoSyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbF5KPFQpZUshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVm9aIj1YaEshIzckIjAuI0g2KSpRR3EhIzc3JCQiMCNSJ0gtQEZFJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8yZWs7TGxLISM2JCIwLiNINikqUUdxISM3NyQkIjAjUidILUBGRSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvMmVrO0xsSyEjNiQiMC4jSDYpKlFHcSEjNzckJCIwPndGKDNnbUshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJ0hSOTpAcEshIzckIjAuI0g2KSpRR3EhIzc3JCQiMD53RigzZ21LISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCdIUjk6QHBLISM3JCIwLiNINikqUUdxISM3NyQkIjBYKWVBMltxSyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBCMFVPIjR0SyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWCllQTJbcUshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQjBVTyI0dEshIzckIjAuI0g2KSpRR3EhIzc3JCQiMHMrQ2RnVkYkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFw8U0BycEYkISM3JCIwLiNINikqUUdxISM3NyQkIjBzK0NkZ1ZGJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBcPFNAcnBGJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKUhAQS9DeUshIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwd0hRMV4zRyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMClIQEEvQ3lLISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHdIUTFeM0ckISM3JCIwLiNINikqUUdxISM3NyQkIjBERD9GP0BHJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAtVU8iNHQlRyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEREP0Y/QEckISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC1VTyI0dCVHJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXlA9NytnRyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwSGFNdzUnKUckISM3JCIwLiNINikqUUdxISM3NyQkIjBeUD03K2dHJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBIYU13NScpRyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHlcOygqeikqRyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYm1LaCFcI0gkISM3JCIwLiNINikqUUdxISM3NyQkIjB5XDsoKnopKkckISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGJtS2ghXCNIJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwL2k5IylmUEgkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCMpeUlZcWpIJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwL2k5IylmUEgkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCMpeUlZcWpIJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwSnU3blJ3SCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMyIqR0pdLUkkISM3JCIwLiNINikqUUdxISM3NyQkIjBKdTduUndIJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAzIipHSl0tSSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGQnM0AmPjpJJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBOLkY7SVRJJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZCczQCY+OkkkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME4uRjtJVEkkISM3JCIwLiNINikqUUdxISM3NyQkIjAlKSkqM1AqUjBMISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGg6RCw1ITNMISM3JCIwLiNINikqUUdxISM3NyQkIjAlKSkqM1AqUjBMISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGg6RCw1ITNMISM3JCIwLiNINikqUUdxISM3NyQkIi82cj8jeiM0TCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjApeUtpKSopPUokISM3JCIwLiNINikqUUdxISM3NyQkIi82cj8jeiM0TCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjApeUtpKSopPUokISM3JCIwLiNINikqUUdxISM3NyQkIjBQQjAyZkpKJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA5U0BycGRKJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUEIwMmZKSiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOVNAcnBkSiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGpOLiMqUXFKJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBUXz5jXCc+TCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwak4uIypRcUokISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFRfPmNcJz5MISM3JCIwLiNINikqUUdxISM3NyQkIi96OXEoPTRLJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBuazxUSE5LJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvejlxKD00SyQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwbms8VEhOSyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDtnKj4nKXpDTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlcGRoIzR1SyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDtnKj4nKXpDTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlcGRoIzR1SyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFZzKHAleSdHTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8jKlE2IipHSkwhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMFZzKHAleSdHTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8jKlE2IipHSkwhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMHAlZT4kZURMJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBaLDcnKm9eTCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHAlZT4kZURMJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBaLDcnKm9eTCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCdwUnAiUWtMJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0ODUiKVshUkwhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCdwUnAiUWtMJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0ODUiKVshUkwhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEE0Iz4hPS5NJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi5FM21HSE0kISM1JCIwLiNINikqUUdxISM3NyQkIjBBNCM+IT0uTSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIuRTNtR0hNJCEjNSQiMC4jSDYpKlFHcSEjNzckJCIwXEAhcHk+V0whIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRVExXjNvTSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFxAIXB5PldMISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEVRMV4zb00kISM3JCIwLiNINikqUUdxISM3NyQkIjB2TCk9eDJbTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBgXS9PKW9dTCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdkwpPXgyW0whIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYF0vTylvXUwhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC1ZJ292Jj5OJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB6aS1Ab1hOJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLVknb3YmPk4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHppLUBvWE4kISM3JCIwLiNINikqUUdxISM3NyQkIjBHZSU9dSRlTiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMXYrMVslZUwhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEdlJT11JGVOJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAxdisxWyVlTCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYnEjb3NyZkwhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwSygpKTR6S2lMISM3JCIwLiNINikqUUdxISM3NyQkIjBicSNvc3JmTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBLKCkpNHpLaUwhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCJHMz1yZmpMISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGYqcGZ4P21MISM3JCIwLiNINikqUUdxISM3NyQkIjAiRzM9cmZqTCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBmKnBmeD9tTCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMyYqeSdwWm5MISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCY9XjR3M3FMISM3JCIwLiNINikqUUdxISM3NyQkIjAzJip5J3BabkwhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJj1eNHczcUwhIzckIjAuI0g2KSpRR3EhIzc3JCQiME0yeCJvTnJMISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDdDJGZ1J1JQJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTTJ4Im9OckwhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwN0MkZnUnUlAkISM3JCIwLiNINikqUUdxISM3NyQkIjBoPnZtT19QJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBRTyI0dCV5UCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGg+dm1PX1AkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFFPIjR0JXlQJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKD1MPGw2ekwhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbFsqZXJzIlEkISM3JCIwLiNINikqUUdxISM3NyQkIjAoPUw8bDZ6TCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBsWyplcnMiUSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDlXck8nKkhRJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAiNHczcWcmUSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDlXck8nKkhRJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAiNHczcWcmUSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiL2smcEB3b1EkISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMD10JmVvWypRJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvayZwQHdvUSQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwPXQmZW9bKlEkISM3JCIwLiNINikqUUdxISM3NyQkIjBub24xYzJSJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBXJlEzbk8kUiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG5vbjFjMlIkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFcmUTNuTyRSJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJDRlO2ZqJVIkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHIoPmVsQyhSJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJDRlO2ZqJVIkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHIoPmVsQyhSJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvS1JtZF4pUiQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKCo0ITNrNyxNISM3JCIwLiNINikqUUdxISM3NyQkIi9LUm1kXilSJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjAoKjQhM2s3LE0hIzckIjAuI0g2KSpRR3EhIzc3JCQiMFkwaWgmUi1NISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMENBeUQxXVMkISM3JCIwLiNINikqUUdxISM3NyQkIjBZMGloJlItTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBDQXlEMV1TJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdDxnWXZpUyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvWGoyaCkpM00hIzYkIjAuI0g2KSpRR3EhIzc3JCQiMHQ8Z1l2aVMkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL1hqMmgpKTNNISM2JCIwLiNINikqUUdxISM3NyQkIjAqKkhlSmIsVCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIweFl1JmZ3N00hIzckIjAuI0g2KSpRR3EhIzc3JCQiMCoqSGVKYixUJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB4WXUmZnc3TSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRVVjO05TVCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLmZzIWVrO00hIzckIjAuI0g2KSpRR3EhIzc3JCQiMEVVYztOU1QkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC5mcyFlaztNISM3JCIwLiNINikqUUdxISM3NyQkIjBfYWEsOnpUJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi84MmRjXz9NISM2JCIwLiNINikqUUdxISM3NyQkIjBfYWEsOnpUJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi84MmRjXz9NISM2JCIwLiNINikqUUdxISM3NyQkIjB6bV8nW3pATSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBjJClvXTBXVSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHptXydbekBNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGMkKW9dMFdVJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMHpdcnVjVSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJGVwY2BHR00hIzckIjAuI0g2KSpRR3EhIzc3JCQiMDB6XXJ1Y1UkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCRlcGNgR0dNISM3JCIwLiNINikqUUdxISM3NyQkIjBLIipbY2EmSE0hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwNDNsP2xAViQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEsiKltjYSZITSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA0M2w/bEBWJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZS5aVE1NViQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTz9qMFhnViQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGUuWlRNTVYkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME8/ajBYZ1YkISM3JCIwLiNINikqUUdxISM3NyQkIjAmZV5rVUpQTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBpS2ghXCMqUk0hIzckIjAuI0g2KSpRR3EhIzc3JCQiMCZlXmtVSlBNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGlLaCFcIypSTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwNkdWNiU+VE0hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKlslZnYvUVckISM3JCIwLiNINikqUUdxISM3NyQkIjA2R1Y2JT5UTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqWyVmdi9RVyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFFTVCdSMlhNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDpkZGclb1pNISM3JCIwLiNINikqUUdxISM3NyQkIjBRU1QnUjJYTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA6ZGRnJW9aTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwa19SIlEmKltNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFVwYlhrOlgkISM3JCIwLiNINikqUUdxISM3NyQkIjBrX1IiUSYqW00hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVXBiWGs6WCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCJcd2pPJEdYJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBvIlEwVldiTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwIlx3ak8kR1gkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG8iUTBWV2JNISM3JCIwLiNINikqUUdxISM3NyQkIjA8eE5eOG5YJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmUj5iVEtmTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPHhOXjhuWCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJlI+YlRLZk0hIzckIjAuI0g2KSpRR3EhIzc3JCQiMFcqUWpMZmdNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEAxXSsvS1kkISM3JCIwLiNINikqUUdxISM3NyQkIjBXKlFqTGZnTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBAMV0rL0tZJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvPD84S1prTSEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBbPVsmUTNuTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvPD84S1prTSEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBbPVsmUTNuTSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKFIsaklOb00hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdUlZcWo0WiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMChSLGpJTm9NISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHVJWXFqNFokISM3JCIwLiNINikqUUdxISM3NyQkIjBDRUciSEJzTSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAsVldiVltaJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQ0VHIkhCc00hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLFZXYlZbWiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiLyZRRXc3aFokISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMEdiVVNCKHlNISM3JCIwLiNINikqUUdxISM3NyQkIi8mUUV3N2haJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBHYlVTQih5TSEjNyQiMC4jSDYpKlFHcSEjNzckJCIweF1DaCMqKnpNISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGFuU0QuRVskISM3JCIwLiNINikqUUdxISM3NyQkIjB4XUNoIyoqek0hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYW5TRC5FWyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC5qQVlzUVskISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCIpelE1JFsnWyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC5qQVlzUVskISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCIpelE1JFsnWyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiL2AyN0J2KFskISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDIjcGBITyFcJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvYDI3QnYoWyQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwMiNwYEhPIVwkISM3JCIwLiNINikqUUdxISM3NyQkIjBjKCk9O0s7XCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTS9OIUdDJVwkISM3JCIwLiNINikqUUdxISM3NyQkIjBjKCk9O0s7XCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTS9OIUdDJVwkISM3JCIwLiNINikqUUdxISM3NyQkIjAkKSpwNj9eJlwkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL21KYEU3KVwkISM2JCIwLiNINikqUUdxISM3NyQkIjAkKSpwNj9eJlwkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL21KYEU3KVwkISM2JCIwLiNINikqUUdxISM3NyQkIjA0NzonPVIqXCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKClHSl0tP10kISM3JCIwLiNINikqUUdxISM3NyQkIjA0NzonPVIqXCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKClHSl0tP10kISM3JCIwLiNINikqUUdxISM3NyQkIjBPQzhycktdJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA4VEhOIyllXSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiME9DOHJyS10kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDhUSE4jKWVdJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaU82Y15yXSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvTXYtQXc0TiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwaU82Y15yXSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvTXYtQXc0TiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwKilbNFRKNV4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMG1sRDBVT14kISM3JCIwLiNINikqUUdxISM3NyQkIjAqKVs0VEo1XiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbWxEMFVPXiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDpoMkU2XF4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCR6UC0+XzxOISM3JCIwLiNINikqUUdxISM3NyQkIjA6aDJFNlxeJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkelAtPl88TiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwVXQwNiJ6PU4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPiE+XzxTQE4hIzckIjAuI0g2KSpRR3EhIzc3JCQiMFV0MDYiej1OISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMD4hPl88U0BOISM3JCIwLiNINikqUUdxISM3NyQkIjBvJlFnNG5BTiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBZLT9nIkdETiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbyZRZzRuQU4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWS0/ZyJHRE4hIzckIjAuI0g2KSpRR3EhIzc3JCQiMCZ6PjUzYkVOISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHM5PVhoIkhOISM3JCIwLiNINikqUUdxISM3NyQkIjAmej41M2JFTiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBzOT1YaCJITiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQDUrbUkvYCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKnBpLDgvTE4hIzckIjAuI0g2KSpRR3EhIzc3JCQiMEA1K21JL2AkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCpwaSw4L0xOISM3JCIwLiNINikqUUdxISM3NyQkIjBbQSk0MEpNTiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBEUjk6QHBgJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwW0EpNDBKTU4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRFI5OkBwYCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHVNJ2YuPlFOISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMF9eNyssM2EkISM3JCIwLiNINikqUUdxISM3NyQkIjB1TSdmLj5RTiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBfXjcrLDNhJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLFolNC0yVU4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIweWo1JjNvV04hIzckIjAuI0g2KSpRR3EhIzc3JCQiMCxaJTQtMlVOISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHlqNSYzb1dOISM3JCIwLiNINikqUUdxISM3NyQkIjBGZiNmKyZmYSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMHczcWcmW04hIzckIjAuI0g2KSpRR3EhIzc3JCQiMEZmI2YrJmZhJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAwdzNxZyZbTiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYXIhNCpIKVxOISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEopb10wV19OISM3JCIwLiNINikqUUdxISM3NyQkIjBhciE0KkgpXE4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwSilvXTBXX04hIzckIjAuI0g2KSpRR3EhIzc3JCQiL1EpKWUoNFBiJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBlKzBTP2piJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvUSkpZSg0UGIkISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMGUrMFM/amIkISM3JCIwLiNINikqUUdxISM3NyQkIjAyJ3AzJyplZE4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJUdKXS0/Z04hIzckIjAuI0g2KSpRR3EhIzc3JCQiMDIncDMnKmVkTiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlR0pdLT9nTiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTDMmZSVwOWMkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDZELDUhM2tOISM3JCIwLiNINikqUUdxISM3NyQkIjBMMyZlJXA5YyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwNkQsNSEza04hIzckIjAuI0g2KSpRR3EhIzc3JCQiLzFLMyRcYGMkISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFBQKlwqZnpjJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvMUszJFxgYyQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwUFAqXCpmemMkISM3JCIwLiNINikqUUdxISM3NyQkIjAnRzhlIkgjcE4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwa1woKnpSPWQkISM3JCIwLiNINikqUUdxISM3NyQkIjAnRzhlIkgjcE4hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwa1woKnpSPWQkISM3JCIwLiNINikqUUdxISM3NyQkIjA4WHorNEpkJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8+Y1wnPmRkJCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwOFh6KzRKZCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvPmNcJz5kZCQhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMFJkeCYpKSlwZCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPHUkKlwqZnpOISM3JCIwLiNINikqUUdxISM3NyQkIjBSZHgmKSkpcGQkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDx1JCpcKmZ6TiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbXB2cW8zZSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVic9XCR6TWUkISM3JCIwLiNINikqUUdxISM3NyQkIjBtcHZxbzNlJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBWJz1cJHpNZSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCM+UWQmW1plJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8oKSoqKT5mdGUkISM2JCIwLiNINikqUUdxISM3NyQkIjAjPlFkJltaZSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvKCkqKik+ZnRlJCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwPiU+MiVHJyllJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAnNCIpWyFSN2YkISM3JCIwLiNINikqUUdxISM3NyQkIjA+JT4yJUcnKWUkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCc0IilbIVI3ZiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFgxcUQzRGYkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEJCJykqKT1eZiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFgxcUQzRGYkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEJCJykqKT1eZiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHM9bzUpUSdmJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBcTiVbKCkqKilmJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwcz1vNSlRJ2YkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFxOJVsoKSoqKWYkISM3JCIwLiNINikqUUdxISM3NyQkIjApNGpjekUrTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB3WiMpZnlHZyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCk0amN6RStPISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHdaIylmeUdnJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRFZrIXk5L08hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLWchWyVlbmckISM3JCIwLiNINikqUUdxISM3NyQkIjBEVmsheTkvTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAtZyFbJWVuZyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMF5iaWxGITNPISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEhzeUhRMWgkISM3JCIwLiNINikqUUdxISM3NyQkIjBeYmlsRiEzTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBIc3lIUTFoJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIweW5nXTI+aCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYiVvWiI9WGgkISM3JCIwLiNINikqUUdxISM3NyQkIjB5bmddMj5oJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBiJW9aIj1YaCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC8hKWVOKHk6TyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjb1woKnpSPU8hIzckIjAuI0g2KSpRR3EhIzc3JCQiMC8hKWVOKHk6TyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjb1woKnpSPU8hIzckIjAuI0g2KSpRR3EhIzc3JCQiMEojcDBzbT5PISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDM0dCV5RkFPISM3JCIwLiNINikqUUdxISM3NyQkIjBKI3Awc20+TyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAzNHQleUZBTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwZC9iMFpOaSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTkBycGRoaSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGQvYjBaTmkkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME5AcnBkaGkkISM3JCIwLiNINikqUUdxISM3NyQkIjAlb0owcFVGTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBoTHBhUCtqJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJW9KMHBVRk8hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwaExwYVAraiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiLyJIXnYxOGokISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMClldSdSPFJqJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvIkhedjE4aiQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKWV1J1I8UmokISM3JCIwLiNINikqUUdxISM3NyQkIjBQVFxnJz1OTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA5ZWxDKHpQTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUFRcZyc9Tk8hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOWVsQyh6UE8hIzckIjAuI0g2KSpRR3EhIzc3JCQiMGpgWlhtIVJPISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFRxajR4O2skISM3JCIwLiNINikqUUdxISM3NyQkIjBqYFpYbSFSTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBUcWo0eDtrJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIvZmMvaiVIayQhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwbiM9WXBiWE8hIzckIjAuI0g2KSpRR3EhIzc3JCQiL2ZjL2olSGskISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMG4jPVlwYlhPISM3JCIwLiNINikqUUdxISM3NyQkIjA7eVY6RW9rJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlXCpmek8lXE8hIzckIjAuI0g2KSpRR3EhIzc3JCQiMDt5VjpFb2skISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCVcKmZ6TyVcTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwViE+L2dxXU8hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvcyFlaztMbCQhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMFYhPi9ncV1PISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL3MhZWs7TGwkISM2JCIwLiNINikqUUdxISM3NyQkIjBwLVMmZWVhTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBaPmNcJz5kTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwcC1TJmVlYU8hIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWj5jXCc+ZE8hIzckIjAuI0g2KSpRR3EhIzc3JCQiMCdcIlFxbCVlTyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB0SmFNdzVtJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJ1wiUXFsJWVPISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHRKYU13NW0kISM3JCIwLiNINikqUUdxISM3NyQkIjBCRk9iWEJtJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi5XXz5jXG0kISM1JCIwLiNINikqUUdxISM3NyQkIjBCRk9iWEJtJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi5XXz5jXG0kISM1JCIwLiNINikqUUdxISM3NyQkIjBcUk1TRGltJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBFY10vTylvTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXFJNU0RpbSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRWNdL08pb08hIzckIjAuI0g2KSpRR3EhIzc3JCQiMHdeS0QwLG4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGBvWyplcnNPISM3JCIwLiNINikqUUdxISM3NyQkIjB3XktEMCxuJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBgb1sqZXJzTyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLWtJNSYpUm4kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHohb1dkZndPISM3JCIwLiNINikqUUdxISM3NyQkIjAta0k1JilSbiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIweiFvV2Rmd08hIzckIjAuI0g2KSpRR3EhIzc3JCQiMEh3RyZcJ3luJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAxJFwlZnYvbyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEh3RyZcJ3luJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAxJFwlZnYvbyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGIpby1bdSJvJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBMMFZXYlZvJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYilvLVt1Im8kISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEwwVldiVm8kISM3JCIwLiNINikqUUdxISM3NyQkIjAjM11fWWkmbyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZjxUSE4jKW8kISM3JCIwLiNINikqUUdxISM3NyQkIjAjM11fWWkmbyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZjxUSE4jKW8kISM3JCIwLiNINikqUUdxISM3NyQkIjAzOEJdLyYqbyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJylIUjk6QHAkISM3JCIwLiNINikqUUdxISM3NyQkIjAzOEJdLyYqbyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJylIUjk6QHAkISM3JCIwLiNINikqUUdxISM3NyQkIjBOREBOJVEkcCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwN1VQKlwqZnAkISM3JCIwLiNINikqUUdxISM3NyQkIjBOREBOJVEkcCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwN1VQKlwqZnAkISM3JCIwLiNINikqUUdxISM3NyQkIjBoUD4/a3NwJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBSYU4lWygpKnAkISM3JCIwLiNINikqUUdxISM3NyQkIjBoUD4/a3NwJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBSYU4lWygpKnAkISM3JCIwLiNINikqUUdxISM3NyQkIjApKVw8MFc2cSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbG1McGFQcSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCkpXDwwVzZxJCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBsbUxwYVBxJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwOWk6IVItMFAhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwIyp5SmFNd3EkISM3JCIwLiNINikqUUdxISM3NyQkIjA5aTohUi0wUCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjKnlKYU13cSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFR1OHYuKjNQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMD0iKkhSOTpyJCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwVHU4di4qM1AhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPSIqSFI5OnIkISM3JCIwLiNINikqUUdxISM3NyQkIjBuJz0sT3k3UCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBYLkdDJVI6UCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbic9LE95N1AhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWC5HQyVSOlAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCUqKSo0WGptciQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwcjpFNHUjPlAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCUqKSo0WGptciQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwcjpFNHUjPlAhIzckIjAuI0g2KSpRR3EhIzc3JCQiLzciM0lWMHMkISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMCl6VVVSOkJQISM3JCIwLiNINikqUUdxISM3NyQkIi83IjNJVjBzJCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjApelVVUjpCUCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWkIxOkJXcyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQ1NBekxxcyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFpCMTpCV3MkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMENTQXpMcXMkISM3JCIwLiNINikqUUdxISM3NyQkIjB0Ti8rLiRHUCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBeXz9rODR0JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdE4vKy4kR1AhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwXl8/azg0dCQhIzckIjAuI0g2KSpRR3EhIzc3JCQiLlstJkc9S1AhIzUkIjAuI0g2KSpRR3EhIzc3JDckJCIweGs9XCR6TVAhIzckIjAuI0g2KSpRR3EhIzc3JCQiLlstJkc9S1AhIzUkIjAuI0g2KSpRR3EhIzc3JDckJCIweGs9XCR6TVAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEVnK3FpZ3QkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC94O010J1FQISM3JCIwLiNINikqUUdxISM3NyQkIjBFZytxaWd0JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAveDtNdCdRUCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYHMpXEQlKlJQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLyQqWyI+YER1JCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwYHMpXEQlKlJQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLyQqWyI+YER1JCEjNiQiMC4jSDYpKlFHcSEjNzckJCIweiVvKlJBUXUkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGQsOC9Ma3UkISM3JCIwLiNINikqUUdxISM3NyQkIjB6JW8qUkFRdSQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZCw4L0xrdSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDEoXFxBcVpQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCRRNiIqR0pdUCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMShcXEFxWlAhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJFE2IipHSl1QISM3JCIwLiNINikqUUdxISM3NyQkIjBLNCQqNCNlXlAhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvaCM0dSM+YVAhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMEs0JCo0I2VeUCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9oIzR1Iz5hUCEjNiQiMC4jSDYpKlFHcSEjNzckJCIwZkAiXD5ZYlAhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwT1EyZnMhZVAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGZAIlw+WWJQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME9RMmZzIWVQISM3JCIwLiNINikqUUdxISM3NyQkIjAmUSQqKXpUJGZQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGpdMFdfPnckISM3JCIwLiNINikqUUdxISM3NyQkIjAmUSQqKXpUJGZQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGpdMFdfPnckISM3JCIwLiNINikqUUdxISM3NyQkIjA3WShbO0FqUCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqR08hSEtldyQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDdZKFs7QWpQISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCpHTyFIS2V3JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUWUmKVwscnckISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDt2LDk3KHBQISM3JCIwLiNINikqUUdxISM3NyQkIjBRZSYpXCxydyQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwO3YsOTcocFAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGxxJFs4KTR4JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBVKCkqKik+ZnRQISM3JCIwLiNINikqUUdxISM3NyQkIjBscSRbOCk0eCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVSgpKiopPmZ0UCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwIkg9KT5oW3gkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHAqelI9WnhQISM3JCIwLiNINikqUUdxISM3NyQkIjAiSD0pPmhbeCQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwcCp6Uj1aeFAhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD0mKnovVCh5UCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmPmgqb144eSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD0mKnovVCh5UCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAmPmgqb144eSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFcyeSozaSN5JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBBQyVSOkImeSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFcyeSozaSN5JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBBQyVSOkImeSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHI+d3UrbHkkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFtPIypRNiIqeSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHI+d3UrbHkkISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFtPIypRNiIqeSQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCg+VihmIVEheiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdlshUjcqSHokISM3JCIwLiNINikqUUdxISM3NyQkIjAoPlYoZiFRIXokISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHZbIVI3Kkh6JCEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQ1dzV2dVeiQhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLGgpKTNyb3okISM3JCIwLiNINikqUUdxISM3NyQkIjBDV3NXZ1V6JCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAsaCkpM3JveiQhIzckIjAuI0g2KSpRR3EhIzc3JCQiL2wwKEhTIil6JCEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBHdCdRNHYrUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvbDAoSFMiKXokISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMEd0J1E0ditRISM3JCIwLiNINikqUUdxISM3NyQkIjB4b285Pz8hUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBhJlspeUlZIVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHhvbzk/PyFRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGEmWyl5SVkhUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLiJvJyoqKiplIVEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwInlIUTFeM1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC4ibycqKioqZSFRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCJ5SFExXjNRISM3JCIwLiNINikqUUdxISM3NyQkIi9MXFkpeig0USEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjAyNSIpWyFSN1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiL0xcWSl6KDRRISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDI1IilbIVI3USEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYzBqcGZPIlEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTUF6THFpIlEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGMwanBmTyJRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME1BekxxaSJRISM3JCIwLiNINikqUUdxISM3NyQkIjAkeTZZJlJ2IlEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvWXQoPV0sI1EhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMCR5NlkmUnYiUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9ZdCg9XSwjUSEjNiQiMC4jSDYpKlFHcSEjNzckJCIwNElmUj45I1EhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKG9hUCsuQ1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDRJZlI+OSNRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMChvYVArLkNRISM3JCIwLiNINikqUUdxISM3NyQkIjBPVWRDKkhEUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA4ZnQpKTR6I1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiME9VZEMqSERRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDhmdCkpNHojUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwaWFiNHoiSFEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvOTxQKCp5SlEhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGlhYjR6IkhRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLzk8UCgqeUpRISM2JCIwLiNINikqUUdxISM3NyQkIjAqb09YKmVJJFEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbSQpcGVwYyRRISM3JCIwLiNINikqUUdxISM3NyQkIjAqb09YKmVJJFEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbSQpcGVwYyRRISM3JCIwLiNINikqUUdxISM3NyQkIjA6el56UXAkUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkZnpPJVwmUlEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDp6XnpRcCRRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCRmek8lXCZSUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwVSIqXGs9MyVRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMD4zbUdITSVRISM3JCIwLiNINikqUUdxISM3NyQkIjBVIipcaz0zJVEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPjNtR0hNJVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG8uW1wpcFdRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFk/azg0dCVRISM3JCIwLiNINikqUUdxISM3NyQkIjBvLltcKXBXUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBZP2s4NHQlUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJmZoVyR5JltRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHNLaSkqKT1eUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJmZoVyR5JltRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHNLaSkqKT1eUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQEdXPmVDJlEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKlwvTylvXSZRISM3JCIwLiNINikqUUdxISM3NyQkIjBAR1c+ZUMmUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAqXC9PKW9dJlEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFtTVS9RaiZRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMERkZW9bKmVRISM3JCIwLiNINikqUUdxISM3NyQkIjBbU1UvUWomUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBEZGVvWyplUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdV9TKnlAZ1EhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwX3BjYEdHJ1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHVfUyp5QGdRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMF9wY2BHRydRISM3JCIwLiNINikqUUdxISM3NyQkIjAsbFF1KDRrUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB5IlsmUTNuJ1EhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCxsUXUoNGtRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHkiWyZRM24nUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRnhPZnh6J1EhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwMCVITiMpZXFRISM3JCIwLiNINikqUUdxISM3NyQkIjBGeE9meHonUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAwJUhOIyllcVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGEqW1Z1Jj0oUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBKMV4zb1coUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYSpbVnUmPShRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEoxXjNvVyhRISM3JCIwLiNINikqUUdxISM3NyQkIjAiPUkkSFBkKFEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZT1cJHpNeVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCI9SSRIUGQoUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBlPVwkek15USEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMjlKOTwnelEhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJTN0JXlGQSlRISM3JCIwLiNINikqUUdxISM3NyQkIjAyOUo5PCd6USEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAlM3QleUZBKVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMExFSCpwXCQpUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA2VlhqMmgpUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTEVIKnBcJClRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDZWWGoyaClRISM3JCIwLiNINikqUUdxISM3NyQkIi8nUUYlb1AoKVEhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwUWJWWygpKiopUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvJ1FGJW9QKClRISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFFiVlsoKSoqKVEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCgzYiNwYzcqUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBrblRMblEqUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKDNiI3BjNypRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGtuVExuUSpRISM3JCIwLiNINikqUUdxISM3NyQkIjA4akJhT14qUSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAiKnpSPVp4KlEhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDhqQmFPXipRISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCIqelI9WngqUSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvYTwjUjshKipRISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMDwjekxxaSxSISM3JCIwLiNINikqUUdxISM3NyQkIi9hPCNSOyEqKlEhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwPCN6THFpLFIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG0oKT5DJypHIVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVy9PKW9dMFIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG0oKT5DJypHIVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwVy9PKW9dMFIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCQqKnoiNHduIVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvblRMblE0UiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwJCoqeiI0d24hUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9uVExuUTRSISM2JCIwLiNINikqUUdxISM3NyQkIjA+NzslZmw1UiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAoKkdLZW1LIlIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD43OyVmbDVSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCgqR0tlbUsiUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWUM5ek5YIlIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQlRJVllyIlIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFlDOXpOWCJSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEJUSVZZciJSISM3JCIwLiNINikqUUdxISM3NyQkIjBzTzdrOiU9UiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi9OJkdHRTUjUiEjNiQiMC4jSDYpKlFHcSEjNzckJCIwc083azolPVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvTiZHR0U1I1IhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMCoqWzVcJkhBUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB3bEU4MVwjUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKipbNVwmSEFSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHdsRTgxXCNSISM3JCIwLiNINikqUUdxISM3NyQkIjBEaDNNdmgjUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAueUMpZnlHUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwRGgzTXZoI1IhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLnlDKWZ5R1IhIzckIjAuI0g2KSpRR3EhIzc3JCQiMF90MT5iKyRSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEghSEtlbUtSISM3JCIwLiNINikqUUdxISM3NyQkIjBfdDE+YiskUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBIIUhLZW1LUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIweSZbU10kUiRSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGMtQG9YbCRSISM3JCIwLiNINikqUUdxISM3NyQkIjB5JltTXSRSJFIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYy1Ab1hsJFIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDApSCEqWyJ5JFIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwI1siPmBELyVSISM3JCIwLiNINikqUUdxISM3NyQkIjAwKUghKlsieSRSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCNbIj5gRC8lUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwSjUsdSVwVFIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwNEY8UTBWJVIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEo1LHUlcFRSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDRGPFEwViVSISM3JCIwLiNINikqUUdxISM3NyQkIjBlQSoqZXViJVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTlI6QiY9W1IhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGVBKipldWIlUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBOUjpCJj1bUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJVt0UldYXFIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwaV44M2w/JlIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCVbdFJXWFxSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGleODNsPyZSISM3JCIwLiNINikqUUdxISM3NyQkIjA2WiYqR01MJlIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKVE7SlwlZiZSISM3JCIwLiNINikqUUdxISM3NyQkIjA2WiYqR01MJlIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwKVE7SlwlZiZSISM3JCIwLiNINikqUUdxISM3NyQkIjBQZiRSVEBkUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA6dzR5QylmUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwUGYkUlRAZFIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOnc0eUMpZlIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGtyIiopUjRoUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBUKXlJWXFqUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwa3IiKilSNGhSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFQpeUlZcWpSISM3JCIwLiNINikqUUdxISM3NyQkIi9SKSpRUShcJ1IhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwbysxWyVlblIhIzckIjAuI0g2KSpRR3EhIzc3JCQiL1IpKlFRKFwnUiEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjBvKzFbJWVuUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPCd6KW9gKW9SISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCVIVElWWXJSISM3JCIwLiNINikqUUdxISM3NyQkIjA8J3opb2Apb1IhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJUhUSVZZclIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFYzJ1FOdHNSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEBELT1XYChSISM3JCIwLiNINikqUUdxISM3NyQkIjBWMydRTnRzUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBARC09V2AoUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIvMlUpUThtKFIhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwWlArLkMjelIhIzckIjAuI0g2KSpRR3EhIzc3JCQiLzJVKVE4bShSISM2JCIwLiNINikqUUdxISM3NyQ3JCQiMFpQKy5DI3pSISM3JCIwLiNINikqUUdxISM3NyQkIjAnSEJRS1whKVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdVwpelE1JClSISM3JCIwLiNINikqUUdxISM3NyQkIjAnSEJRS1whKVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdVwpelE1JClSISM3JCIwLiNINikqUUdxISM3NyQkIjBCWCEpM3RWKVIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIuaSdIUClwKVIhIzUkIjAuI0g2KSpRR3EhIzc3JCQiMEJYISkzdFYpUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi5pJ0hQKXApUiEjNSQiMC4jSDYpKlFHcSEjNzckJCIwXGR5JEhEKSlSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEZ1JXpOJzMqUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXGR5JEhEKSlSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEZ1JXpOJzMqUiEjNyQiMC4jSDYpKlFHcSEjNzckJCIwd3B3eUtAKlIhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYCdHSE11JSpSISM3JCIwLiNINikqUUdxISM3NyQkIjB3cHd5S0AqUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBgJ0dITXUlKlIhIzckIjAuI0g2KSpRR3EhIzc3JCQiMC0jW1BFLCcqUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8pKTR6S2kpKlIhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMC0jW1BFLCcqUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIi8pKTR6S2kpKlIhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMEglSChbIyopKipSISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMDE2KkdKXS1TISM3JCIwLiNINikqUUdxISM3NyQkIjBIJUgoWyMqKSoqUiEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAxNipHSl0tUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYjFyTHNQKyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwTEIoeUhRMVMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGIxckxzUCslISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMExCKHlIUTFTISM3JCIwLiNINikqUUdxISM3NyQkIjAjKT1wPV93KyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwZk4mR0dFNVMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCMpPXA9X3crJSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBmTiZHR0U1UyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwM0puLks6LCUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJ3lNeUU5OVMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDNKbi5LOiwlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCd5TXlFOTlTISM3JCIwLiNINikqUUdxISM3NyQkIjBOVmwpPVQ6UyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA3ZyJHRC09UyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwTlZsKT1UOlMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwN2ciR0QtPVMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMGhianQiSD5TISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFJzelAtPi0lISM3JCIwLiNINikqUUdxISM3NyQkIjBoYmp0Ikg+UyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBSc3pQLT4tJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwKXk7J2VySi0lISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGwleUZBeURTISM3JCIwLiNINikqUUdxISM3NyQkIjApeTsnZXJKLSUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwbCV5RkF5RFMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMDkhKWZWXnEtJSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAjcGZ4P21IUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwOSEpZlZecS0lISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCNwZng/bUhTISM3JCIwLiNINikqUUdxISM3NyQkIjBUI3omR0o0LiUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwPTR1Iz5hTFMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFQjeiZHSjQuJSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjA9NHUjPmFMUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwbi9jODZbLiUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwWEBzeEB1LiUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMG4vYzg2Wy4lISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFhAc3hAdS4lISM3JCIwLiNINikqUUdxISM3NyQkIjAlcFQmKTRwUVMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwckxxaSw4LyUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCVwVCYpNHBRUyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjByTHFpLDgvJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIvI0hfJDNkVVMhIzYkIjAuI0g2KSpRR3EhIzc3JDckJCIwKWYlb1oiPVhTISM3JCIwLiNINikqUUdxISM3NyQkIi8jSF8kM2RVUyEjNiQiMC4jSDYpKlFHcSEjNzckNyQkIjApZiVvWiI9WFMhIzckIjAuI0g2KSpRR3EhIzc3JCQiMFpUXW9day8lISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMENlbUtoIVxTISM3JCIwLiNINikqUUdxISM3NyQkIjBaVF1vXWsvJSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBDZW1LaCFcUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwdGBbYEkuMCUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwXnFrPFRIMCUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHRgW2BJLjAlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMF5xazxUSDAlISM3JCIwLiNINikqUUdxISM3NyQkIi5tWVE1VTAlISM1JCIwLiNINikqUUdxISM3NyQ3JCQiMHgjR0U1I28wJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIubVlRNVUwJSEjNSQiMC4jSDYpKlFHcSEjNzckNyQkIjB4I0dFNSNvMCUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEV5V0IhNGVTISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMC8mNHczcWdTISM3JCIwLiNINikqUUdxISM3NyQkIjBFeVdCITRlUyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAvJjR3M3FnUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwYCFIJTNxPjElISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL3QhZnMhZWtTISM2JCIwLiNINikqUUdxISM3NyQkIjBgIUglM3E+MSUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvdCFmcyFla1MhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMHotVCQqXGUxJSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBkPmRkZyVvUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwei1UJCpcZTElISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwLiNINikqUUdxISM3NyQkIjAxOlJ5SChwUyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAkPWBEL01zUyEjNyQiMC4jSDYpKlFHcSEjNzckJCIwMTpSeUgocFMhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJD1gRC9Nc1MhIzckIjAuI0g2KSpRR3EhIzc3JCQiMEtGUGo0TzIlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL1RNdi1Bd1MhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMEtGUGo0TzIlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiL1RNdi1Bd1MhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMGZSTlsqW3hTISM3JCIwLiNINikqUUdxISM3NyQ3JCQiME9jXjcrLDMlISM3JCIwLiNINikqUUdxISM3NyQkIjBmUk5bKlt4UyEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBPY143KywzJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJj1OTCRwODMlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGpvXCgqelIzJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwJj1OTCRwODMlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMGpvXCgqelIzJSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwN2tKPVxfMyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIvNHlDKWZ5MyUhIzYkIjAuI0g2KSpRR3EhIzc3JCQiMDdrSj1cXzMlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiLzR5QylmeTMlISM2JCIwLiNINikqUUdxISM3NyQkIjBSd0guSCIqMyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOyRmdSdSPDQlISM3JCIwLiNINikqUUdxISM3NyQkIjBSd0guSCIqMyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwOyRmdSdSPDQlISM3JCIwLiNINikqUUdxISM3NyQkIjBsKXkjKSkzSTQlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFUwV18+YzQlISM3JCIwLiNINikqUUdxISM3NyQkIjBsKXkjKSkzSTQlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFUwV18+YzQlISM3JCIwLiNINikqUUdxISM3NyQkIjAjNGdLKCkpbzQlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMHA8VVAqXCo0JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwIzRnSygpKW80JSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBwPFVQKlwqNCUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMD04Q2VvMjUlISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCYqSFNBekw1JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwPThDZW8yNSUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwJipIU0F6TDUlISM3JCIwLiNINikqUUdxISM3NyQkIjBYREFWW1k1JSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBBVVEyZnM1JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwWERBVltZNSUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwQVVRMmZzNSUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHJQP0dHJjNUISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMFxhTyMqUTY2JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwclA/R0cmM1QhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwXGFPIypRNjYlISM3JCIwLiNINikqUUdxISM3NyQkIjApKlw9ODNDNiUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwdm1NeD1dNiUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMCkqXD04M0M2JSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjB2bU14PV02JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwQ2k7KXpHO1QhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwLHpLaSkqKT1UISM3JCIwLiNINikqUUdxISM3NyQkIjBDaTspekc7VCEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjAsektpKSopPVQhIzckIjAuI0g2KSpRR3EhIzc3JCQiMF51OSR5Oz9UISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMEciNHQleUY3JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwXnU5JHk7P1QhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwRyI0dCV5RjclISM3JCIwLiNINikqUUdxISM3NyQkIjB4J0cib1pTNyUhIzckIjAuI0g2KSpRR3EhIzc3JDckJCIwYi5IS2VtNyUhIzckIjAuI0g2KSpRR3EhIzc3JCQiMHgnRyJvWlM3JSEjNyQiMC4jSDYpKlFHcSEjNzckNyQkIjBiLkhLZW03JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLyo0SnYjejclISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwLyo0SnYjejclISM3JCIwLiNINikqUUdxISM3NyQ3JCQiMCJlcnMiUTA4JSEjNyQiMC4jSDYpKlFHcSEjNzckJCIwOCJHKFxZUDglISM3JCIwWnZKKUhAbXAhIzc3JDckJCIwM0dELT1XOCUhIzckIjBpJXB2KjM2J3AhIzc3JCQiMDgiRyhcWVA4JSEjNyQiMFp2SilIQG1wISM3NyQ3JCQiME1TQih5SFFUISM3JCIwJSozeicpZjwibyEjNzckJCIvWSZRI3oyUVQhIzYkIjBBIT1XYEY/byEjNzckNyQkIi9ZJlEjejJRVCEjNiQiMEEhPVdgRj9vISM3NyQkIjBtcThdeXA4JSEjNyQiMCN5ImZMIWVpbyEjNzckNyQkIjBIJ29CciVbOCUhIzckIjAkUTFeM29XcCEjNzckJCIwbXE4XXlwOCUhIzckIjAjeSJmTCFlaW8hIzc3JDckJCIwSCdvQnIlWzglISM3JCIwJFExXjNvV3AhIzc3JCQiMDNHRC09VzglISM3JCIwaSVwdiozNidwISM3NyQ3JCQiMGhfQHN4QDklISM3JCIwRzIxXiJIZ20hIzc3JCQiMFg4ZGpxNzklISM3JCIwaSdIUClwZXAnISM3NyQ3JCQiMFg4ZGpxNzklISM3JCIwaSdIUClwZXAnISM3NyQkIjBNU0IoeUhRVCEjNyQiMCUqM3onKWY8Im8hIzc3JDckJCIwKFsnPmRkZzklISM3JCIwdDpESSpwMWwhIzc3JCQiMC1kMUpGVzklISM3JCIwLTgvTGs5ZCchIzc3JDckJCIwLWQxSkZXOSUhIzckIjAtOC9MazlkJyEjNzckJCIwaF9Ac3hAOSUhIzckIjBHMjFeIkhnbSEjNzckNyQkIjA5eDxVUCpcVCEjNyQiMDheR2AjKTROJyEjNzckJCIwKEhLSyJcdjklISM3JCIwVEhOIyllcVcnISM3NyQ3JCQiMChIS0siXHY5JSEjNyQiMFRITiMpZXFXJyEjNzckJCIwKFsnPmRkZzklISM3JCIwdDpESSpwMWwhIzc3JDckJCIvJSplcnMiUTolISM2JCIwKilmayxVSj4nISM3NyQkIjByZU1cI3BgVCEjNyQiL0F3NHlDKT4nISM2NyQ3JCQiMHJlTVwjcGBUISM3JCIvQXc0eUMpPichIzY3JCQiME8iKWZzRks6JSEjNyQiMC4/V0leckAnISM3NyQ3JCQiMHYiXEFzal1UISM3JCIwImVrO0xsQWohIzc3JCQiME8iKWZzRks6JSEjNyQiMC4/V0leckAnISM3NyQ3JCQiMHYiXEFzal1UISM3JCIwImVrO0xsQWohIzc3JCQiMDl4PFVQKlxUISM3JCIwOF5HYCMpNE4nISM3NyQ3JCQiMG4sOTcocGRUISM3JCIvaEopPSM9TGchIzY3JCQiMC4lcDNgcmNUISM3JCIvJ3lHSVVRMichIzY3JDckJCIwLiVwM2ByY1QhIzckIi8neUdJVVEyJyEjNjckJCIvJSplcnMiUTolISM2JCIwKilmayxVSj4nISM3NyQ3JCQiMCRSQHJwZGhUISM3JCIwPipHcCgqNHJlISM3NyQkIjBfPGhiMihmVCEjNyQiLiYqZnpPJVxmISM1NyQ3JCQiMF88aGIyKGZUISM3JCIuJipmek8lXGYhIzU3JCQiMG4sOTcocGRUISM3JCIvaEopPSM9TGchIzY3JDckJCIvaS1Ab1hsVCEjNiQiMGEhW3VtKm9xJiEjNzckJCIwXG1OOXFFOyUhIzckIjBSNiIqR0pdI2UhIzc3JDckJCIwXG1OOXFFOyUhIzckIjBSNiIqR0pdI2UhIzc3JCQiMCRSQHJwZGhUISM3JCIwPipHcCgqNHJlISM3NyQ3JCQiMFlRM25PJHBUISM3JCIwYzMpKiozZVNiISM3NyQkIjBKVWQ1NCZvVCEjNyQiMD1XYEY/aWQmISM3NyQ3JCQiMEpVZDU0Jm9UISM3JCIwPVdgRj9pZCYhIzc3JCQiLyMzKSk9U2c7JSEjNiQiMGlzbFA/Pm8mISM3NyQ3JCQiME9BbyRSZ2xUISM3JCIwekZBeUQxcSYhIzc3JCQiLyMzKSk9U2c7JSEjNiQiMGlzbFA/Pm8mISM3NyQ3JCQiME9BbyRSZ2xUISM3JCIwekZBeUQxcSYhIzc3JCQiL2ktQG9YbFQhIzYkIjBhIVt1bSpvcSYhIzc3JDckJCIwdF0xXztLPCUhIzckIjBHVklhXkBQJiEjNzckJCIwWEs0NShRclQhIzckIjBlZyVvWiI9WCYhIzc3JDckJCIwWEs0NShRclQhIzckIjBlZyVvWiI9WCYhIzc3JCQiMFlRM25PJHBUISM3JCIwYzMpKiozZVNiISM3NyQ3JCQiMCpIWXFqNHhUISM3JCIwPFNFcjY7PyYhIzc3JCQiMCYpKmYiKVsxeFQhIzckIjBQJHBhUCsuXyEjNzckNyQkIjAmKSpmIilbMXhUISM3JCIwUCRwYVArLl8hIzc3JCQiMGgiM1QqenA8JSEjNyQiMFtxaytQbj8mISM3NyQ3JCQiMDk4Z3pRVTwlISM3JCIwKHBkaCM0dUsmISM3NyQkIjBoIjNUKnpwPCUhIzckIjBbcWsrUG4/JiEjNzckNyQkIjA5OGd6UVU8JSEjNyQiMChwZGgjNHVLJiEjNzckJCIwdF0xXztLPCUhIzckIjBHVklhXkBQJiEjNzckNyQkIjBFdi1BdzQ9JSEjNyQiMGFuZlV0KkddISM3NyQkIjBKJ1JPYicpelQhIzckIjB4NHlDKWZ5XSEjNzckNyQkIjBKJ1JPYicpelQhIzckIjB4NHlDKWZ5XSEjNzckJCIwKkhZcWo0eFQhIzckIjA8U0VyNjs/JiEjNzckNyQkIjBfKDNxZyZbPSUhIzckIjBHJG9NWUJhWyEjNzckJCIwYnYicD9rIz0lISM3JCIwO0U0dSM+YVwhIzc3JDckJCIwYnYicD9rIz0lISM3JCIwO0U0dSM+YVwhIzc3JCQiMEV2LUF3ND0lISM3JCIwYW5mVXQqR10hIzc3JDckJCIweioqKT5mdCk9JSEjNyQiMCUqKVslPTF1biUhIzc3JCQiMD1RJjRdNyk9JSEjNyQiMCYqZXJzIlEwWiEjNzckNyQkIjA9USY0XTcpPSUhIzckIjAmKmVycyJRMFohIzc3JCQiL1wwUzJuJz0lISM2JCIwei8nPjJnclohIzc3JDckJCIvVnokNCZSJj0lISM2JCIwY1VTQih5SFshIzc3JCQiL1wwUzJuJz0lISM2JCIwei8nPjJnclohIzc3JDckJCIvVnokNCZSJj0lISM2JCIwY1VTQih5SFshIzc3JCQiMF8oM3FnJls9JSEjNyQiMEckb01ZQmFbISM3NyQ3JCQiMDA3KHBkaCM+JSEjNyQiMCRROmdYXClcJSEjNzckJCIwKmY2NEQkMz4lISM3JCIwTnYtQXc0ZSUhIzc3JDckJCIwKmY2NEQkMz4lISM3JCIwTnYtQXc0ZSUhIzc3JCQiMHoqKik+ZnQpPSUhIzckIjAlKilbJT0xdW4lISM3NyQ3JCQiMEtDJj5jXCc+JSEjNyQiMEsoKkdCMHZKJSEjNzckJCIwYz1eJUg9Jz4lISM3JCIwOTNsP2xATCUhIzc3JDckJCIwYz1eJUg9Jz4lISM3JCIwOTNsP2xATCUhIzc3JCQiMF5hRlMlXCY+JSEjNyQiMEdzeHRvVU8lISM3NyQ3JCQiMGgpNEokPU4+JSEjNyQiMHUiUjgyZGNXISM3NyQkIjBeYUZTJVwmPiUhIzckIjBHc3h0b1VPJSEjNzckNyQkIjBoKTRKJD1OPiUhIzckIjB1IlI4MmRjVyEjNzckJCIwMDcocGRoIz4lISM3JCIwJFE6Z1hcKVwlISM3NyQ3JCQiMGVPJHBhUCtVISM3JCIwTChbXkNYTVQhIzc3JCQiMEglKlwlbyMpKT4lISM3JCIwYEMnKnBmeD8lISM3NyQ3JCQiMEglKlwlbyMpKT4lISM3JCIwYEMnKnBmeD8lISM3NyQkIjBLQyY+Y1wnPiUhIzckIjBLKCpHQjB2SiUhIzc3JDckJCIwJilbIj5gRC9VISM3JCIwKnBgKm9QJFxSISM3NyQkIjBDdHkhXDAvVSEjNyQiMEtkZW9bKmVSISM3NyQ3JCQiMEN0eSFcMC9VISM3JCIwS2Rlb1sqZVIhIzc3JCQiMFIiXCl5Vk8/JSEjNyQiMHYnWz9yYnlSISM3NyQ3JCQiMFgsP29dOT8lISM3JCIwJDR1Iz5hTDMlISM3NyQkIjBSIlwpeVZPPyUhIzckIjB2J1s/cmJ5UiEjNzckNyQkIjBYLD9vXTk/JSEjNyQiMCQ0dSM+YUwzJSEjNzckJCIwZU8kcGFQK1UhIzckIjBMKFteQ1hNVCEjNzckNyQkIjA2aCpvXjgzVSEjNyQiMF4hKT0jND1pUCEjNzckJCIwdyV5UytrMVUhIzckIjBzdCp5SmFNUSEjNzckNyQkIjB3JXlTK2sxVSEjNyQiMHN0KnlKYU1RISM3NyQkIjAmKVsiPmBEL1UhIzckIjAqcGAqb1AkXFIhIzc3JDckJCIwUXQoPV0sN1UhIzckIjBBXS1CIylIZCQhIzc3JCQiMDJwJ1JbdjZVISM3JCIwXjFfO0tkZSQhIzc3JDckJCIwMnAnUlt2NlUhIzckIjBeMV87S2RlJCEjNzckJCIwa2gqW1lENlUhIzckIjAoKSlIYkk2NU8hIzc3JDckJCIwblQnUmw/NFUhIzckIjA2ITRzdzg1UCEjNzckJCIwa2gqW1lENlUhIzckIjAoKSlIYkk2NU8hIzc3JDckJCIwblQnUmw/NFUhIzckIjA2ITRzdzg1UCEjNzckJCIwNmgqb144M1UhIzckIjBeISk9IzQ9aVAhIzc3JDckJCIwayZlb1sqZUAlISM3JCIwJioqKip5UXciUSQhIzc3JCQiMDo4eV4mRzlVISM3JCIvSEtlbUtoTSEjNjckNyQkIjA6OHleJkc5VSEjNyQiL0hLZW1LaE0hIzY3JCQiMFF0KD1dLDdVISM3JCIwQV0tQiMpSGQkISM3NyQ3JCQiMCJ6Uj1aeD5VISM3JCIwelFId0cmKT0kISM3NyQkIi5oW0UmSD5VISM1JCIvZGJXY143SyEjNjckNyQkIi5oW0UmSD5VISM1JCIvZGJXY143SyEjNjckJCIwJWZlPHBVPVUhIzckIjBtSGFBS2REJCEjNzckNyQkIjApKSkqRyQpKXo7VSEjNyQiLyRSOTpAcEwkISM2NyQkIjAlZmU8cFU9VSEjNyQiMG1IYUFLZEQkISM3NyQ3JCQiMCkpKSpHJCkpejtVISM3JCIvJFI5OkBwTCQhIzY3JCQiMGsmZW9bKmVAJSEjNyQiMCYqKioqeVF3IlEkISM3NyQ3JCQiMDw1I29YbEJVISM3JCIwPlgqPmdIJCpIISM3NyQkIjBvOjROdjxBJSEjNyQiMDRzdzg1IikzJCEjNzckNyQkIjBvOjROdjxBJSEjNyQiMDRzdzg1IikzJCEjNzckJCIwInpSPVp4PlUhIzckIjB6UUh3RyYpPSQhIzc3JDckJCIwV0EhPVdgRlUhIzckIjBgIWYiKXoyJ3ojISM3NyQkIjByPC5aKG9FVSEjNyQiMClbIVI3KkhSRyEjNzckNyQkIjByPC5aKG9FVSEjNyQiMClbIVI3KkhSRyEjNzckJCIwKGYjPXlOX0ElISM3JCIwSiw4eS5JIkghIzc3JDckJCIwXD1yP1JVQSUhIzckIjBcKXlJWXFqSCEjNzckJCIwKGYjPXlOX0ElISM3JCIwSiw4eS5JIkghIzc3JDckJCIwXD1yP1JVQSUhIzckIjBcKXlJWXFqSCEjNzckJCIwPDUjb1hsQlUhIzckIjA+WCo+Z0gkKkghIzc3JDckJCIvWiR5RTk5QiUhIzYkIjAzcyhcQClvZiMhIzc3JCQiMHNzSVY/IkhVISM3JCIwR0BxaCQqW3IjISM3NyQ3JCQiMHNzSVY/IkhVISM3JCIwR0BxaCQqW3IjISM3NyQkIjBXQSE9V2BGVSEjNyQiMGAhZiIpejIneiMhIzc3JDckJCIwKHBrPFRITlUhIzckIi8kZio+LXUmUiMhIzY3JCQiMCg9Yl87JVJCJSEjNyQiMDJhS2cjM21DISM3NyQ3JCQiMCg9Yl87JVJCJSEjNyQiMDJhS2cjM21DISM3NyQkIjByIVwtKlE8QiUhIzckIi9VKHAmKXkrZSMhIzY3JDckJCIwQWVDPVE6QiUhIzckIjBuUCw2KVshZiMhIzc3JCQiMHIhXC0qUTxCJSEjNyQiL1UocCYpeStlIyEjNjckNyQkIjBBZUM9UTpCJSEjNyQiMG5QLDYpWyFmIyEjNzckJCIvWiR5RTk5QiUhIzYkIjAzcyhcQClvZiMhIzc3JDckJCIwQmZ1J1I8UlUhIzckIjBCXTgvXEU+IyEjNzckJCIweE9WYTAoUVUhIzckIjAnb1sqZXJzQCMhIzc3JDckJCIweE9WYTAoUVUhIzckIjAnb1sqZXJzQCMhIzc3JCQiL09mY04nekIlISM2JCIvM0BHRzNjQSEjNjckNyQkIjBoIVE/MUxPVSEjNyQiMFlxajR4O00jISM3NyQkIi9PZmNOJ3pCJSEjNiQiLzNAR0czY0EhIzY3JDckJCIwaCFRPzFMT1UhIzckIjBZcWo0eDtNIyEjNzckJCIwKHBrPFRITlUhIzckIi8kZio+LXUmUiMhIzY3JDckJCIvOkY8UTBWVSEjNiQiMEdKI0hZaigpPiEjNzckJCIwJzRHYHExVFUhIzckIjBELkUzbUc0IyEjNzckNyQkIjAnNEdgcTFUVSEjNyQiMEQuRTNtRzQjISM3NyQkIjBCZnUnUjxSVSEjNyQiMEJdOC9cRT4jISM3NyQ3JCQiMHckM25PJHBDJSEjNyQiMDZQdys9MnkiISM3NyQkIjAqPjlJKlxkQyUhIzckIjAvTylvXTBXPSEjNzckNyQkIjApPjlJKlxkQyUhIzckIjAvTylvXTBXPSEjNzckJCIwWillWiRlUkMlISM3JCIwJz15W3NYUj4hIzc3JDckJCIwcnJdJltUVlUhIzckIjBsPmRkZyVvPiEjNzckJCIwWillWiRlUkMlISM3JCIwJz15W3NYUj4hIzc3JDckJCIwcnJdJltUVlUhIzckIjBsPmRkZyVvPiEjNzckJCIvOkY8UTBWVSEjNiQiMEdKI0hZaigpPiEjNzckNyQkIjAuJypvXjgzRCUhIzckIi9vIXAkSCE+ZCIhIzY3JCQiMDtYcWMiUV1VISM3JCIwJSlvXTBXX2YiISM3NyQ3JCQiMDtYcWMiUV1VISM3JCIwJSlvXTBXX2YiISM3NyQkIjBBcXQjUXVcVSEjNyQiMC9BQDhWJkg7ISM3NyQ3JCQiMDc4KXA/MltVISM3JCIwV18+Y1wnPjwhIzc3JCQiMEFxdCNRdVxVISM3JCIwL0FAOFYmSDshIzc3JDckJCIwNzgpcD8yW1UhIzckIjBXXz5jXCc+PCEjNzckJCIwdyQzbk8kcEMlISM3JCIwNlB3Kz0yeSIhIzc3JDckJCIwSDNuTyRwYVUhIzckIi9Qd09yQGg4ISM2NyQkIjAnNDR5InpFRCUhIzckIjBCJj1bJlEzWiIhIzc3JDckJCIwJzQ0eSJ6RUQlISM3JCIwQiY9WyZRM1oiISM3NyQkIjAuJypvXjgzRCUhIzckIi9vIXAkSCE+ZCIhIzY3JDckJCIwYz9sQHQmZVUhIzckIjBBci9OJ29bNiEjNzckJCIwX1FVSVFzRCUhIzckIjAtPVdgRj9BIiEjNzckNyQkIjBfUVVJUXNEJSEjNyQiMC09V2BGP0EiISM3NyQkIjAjWzdwak1iVSEjNyQiMGUleU1bXEQ4ISM3NyQ3JCQiME02S05rXEQlISM3JCIwaiw4L0xrTSIhIzc3JCQiMCNbN3BqTWJVISM3JCIwZSV5TVtcRDghIzc3JDckJCIwTTZLTmtcRCUhIzckIjBqLDgvTGtNIiEjNzckJCIwSDNuTyRwYVUhIzckIi9Qd09yQGg4ISM2NyQ3JCQiMCNHTG1JWGlVISM3JCIwJEhbNSdSSk0qISM4NyQkIjAiKlwpZjl2aFUhIzckIjA4M2w/bEB0KiEjODckNyQkIjAiKlwpZjl2aFUhIzckIjA4M2w/bEB0KiEjODckJCIwbChvYyp5MkUlISM3JCIwRnFqLicqby0iISM3NyQ3JCQiMFRuKSpbKyZmVSEjNyQiMFVNdi1BdzQiISM3NyQkIjBsKG9jKnkyRSUhIzckIjBGcWouJypvLSIhIzc3JDckJCIwVG4pKlsrJmZVISM3JCIwVU12LUF3NCIhIzc3JCQiMGM/bEB0JmVVISM3JCIwQXIvTidvWzYhIzc3JDckJCIwNFhoIkhMbVUhIzckIi9eJzNsIj4iPSghIzc3JCQiL0skNGI/aUUlISM2JCIwL08pb10wV3MhIzg3JDckJCIvSyQ0Yj9pRSUhIzYkIjAvTylvXTBXcyEjODckJCIwXyFlIzRvZ0UlISM3JCIwczVNWXAqR3QhIzg3JDckJCIwVic0TjsqUkUlISM3JCIwNHN3ODUiKVspISM4NyQkIjBfIWUjNG9nRSUhIzckIjBzNU1ZcCpHdCEjODckNyQkIjBWJzROOypSRSUhIzckIjA0c3c4NSIpWykhIzg3JCQiMCNHTG1JWGlVISM3JCIwJEhbNSdSSk0qISM4NyQ3JCQiMCZSZVInUiVvVSEjNyQiJCsnISIiNyQkIjA0WGgiSExtVSEjNyQiL14nM2wiPiI9KCEjNy0lJkNPTE9SRzYmJSRSR0JHJCIoXnVpJyEiKCQiKF51aSchIigkIihedWknISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzZcXnU3JDckJCIvbUZAcWgkNCMhIzYkIjBKXiQqKT0hSHokISM3NyQkIjBwVDckb3EjNCMhIzckIjBzdCp5SmFNUSEjNzckNyQkIjBwVDckb3EjNCMhIzckIjBzdCp5SmFNUSEjNzckJCIwJSlRNUc3RjQjISM3JCIwOD9wQmBOJ1EhIzc3JDckJCIwMyZwMCt0IzQjISM3JCIwS2Rlb1sqZVIhIzc3JCQiMCUpUTVHN0Y0IyEjNyQiMDg/cEJgTidRISM3NyQ3JCQiMDMmcDArdCM0IyEjNyQiMEtkZW9bKmVSISM3NyQkIjB3NjtLTkY0IyEjNyQiMHgiKSplKj5zKVIhIzc3JDckJCIvLEgsS3YjNCMhIzYkIjAkNHUjPmFMMyUhIzc3JCQiMHc2O0tORjQjISM3JCIweCIpKmUqPnMpUiEjNzckNyQkIi8sSCxLdiM0IyEjNiQiMCQ0dSM+YUwzJSEjNzckJCIwPFdOUWVGNCMhIzckIjBOaGgqZikzNiUhIzc3JDckJCIwTk8nPWt4IzQjISM3JCIwYEMnKnBmeD8lISM3NyQkIjA8V05RZUY0IyEjNyQiME5oaCpmKTM2JSEjNzckNyQkIjBOTyc9a3gjNCMhIzckIjBgQycqcGZ4PyUhIzc3JCQiMEY7bFkieSM0IyEjNyQiLjkoZThiTVUhIzU3JDckJCIwaz11bCp6IzQjISM3JCIwOTNsP2xATCUhIzc3JCQiMEY7bFkieSM0IyEjNyQiLjkoZThiTVUhIzU3JDckJCIwaz11bCp6IzQjISM3JCIwOTNsP2xATCUhIzc3JCQiMF9CMGQvRzQjISM3JCIwRiV5WWdAZVYhIzc3JDckJCIwSzkoPUgjRzQjISM3JCIwdSJSODJkY1chIzc3JCQiMF9CMGQvRzQjISM3JCIwRiV5WWdAZVYhIzc3JDckJCIwSzkoPUgjRzQjISM3JCIwdSJSODJkY1chIzc3JCQiMDtRbXBGRzQjISM3JCIvQSpmLSEpPVslISM2NyQ3JCQiMFZWRD9ZRzQjISM3JCIwTnYtQXc0ZSUhIzc3JCQiMDtRbXBGRzQjISM3JCIvQSpmLSEpPVslISM2NyQ3JCQiMFZWRD9ZRzQjISM3JCIwTnYtQXc0ZSUhIzc3JCQiMGBZXiUzJkc0IyEjNyQiMGVickdWYmclISM3NyQ3JCQiMGEjKnBdcEc0IyEjNyQiMCYqZXJzIlEwWiEjNzckJCIwYFleJTMmRzQjISM3JCIwZWJyR1ZiZyUhIzc3JDckJCIwYSMqcF1wRzQjISM3JCIwJiplcnMiUTBaISM3NyQkIjAlM004UyhHNCMhIzckIjBIKjQ8Zj9IWiEjNzckNyQkIjB3N1AkRypHNCMhIzckIjBjVVNCKHlIWyEjNzckJCIwJTNNOFMoRzQjISM3JCIwSCo0PGY/SFohIzc3JDckJCIwdzdQJEcqRzQjISM3JCIwY1VTQih5SFshIzc3JCQiMHM+Uj8oKkc0IyEjNyQiMEIjSEh5J0cmWyEjNzckNyQkIjApZjcjPTtINCMhIzckIjA7RTR1Iz5hXCEjNzckJCIwcz5SPygqRzQjISM3JCIwQiNISHknRyZbISM3NyQ3JCQiMClmNyM9O0g0IyEjNyQiMDtFNHUjPmFcISM3NyQkIjBZJUc6LyNINCMhIzckIjB3JypcMkhsKFwhIzc3JDckJCIwbkc8YlJINCMhIzckIjB4NHlDKWZ5XSEjNzckJCIwWSVHOi8jSDQjISM3JCIwdycqXDJIbChcISM3NyQ3JCQiMG5HPGJSSDQjISM3JCIweDR5QylmeV0hIzc3JCQiMCRSI3prVkg0IyEjNyQiMFFQJlEnKj0rXiEjNzckNyQkIjBoKipIJUgnSDQjISM3JCIwUCRwYVArLl8hIzc3JCQiMCRSI3prVkg0IyEjNyQiMFFQJlEnKj0rXiEjNzckNyQkIjBoKipIJUgnSDQjISM3JCIwUCRwYVArLl8hIzc3JCQiMCNIZSxwJ0g0IyEjNyQiMDwoNEcmXFFBJiEjNzckNyQkIjBORm9OJylINCMhIzckIjAocGRoIzR1SyYhIzc3JCQiMCNIZSxwJ0g0IyEjNyQiMDwoNEcmXFFBJiEjNzckNyQkIjBORm9OJylINCMhIzckIjAocGRoIzR1SyYhIzc3JCQiMFdycjwhKkg0IyEjNyQiMEcoXDkoM3ZNJiEjNzckNyQkIjAkSCg9ejRJNCMhIzckIjBlZyVvWiI9WCYhIzc3JCQiMFdycjwhKkg0IyEjNyQiMEcoXDkoM3ZNJiEjNzckNyQkIjAkSCg9ejRJNCMhIzckIjBlZyVvWiI9WCYhIzc3JCQiLjhTWjhJNCMhIzUkIjA0SCU+cztyYSEjNzckNyQkIjAnZWNbSy4kNCMhIzckIjA9V2BGP2lkJiEjNzckJCIuOFNaOEk0IyEjNSQiMDRIJT5zO3JhISM3NyQ3JCQiMCdlY1tLLiQ0IyEjNyQiMD1XYEY/aWQmISM3NyQkIjB0dz16T0k0IyEjNyQiMC0mSF1dI1tmJiEjNzckNyQkIjAuIm9FbjAkNCMhIzckIjB6RkF5RDFxJiEjNzckJCIwdHc9ek9JNCMhIzckIjAtJkhdXSNbZiYhIzc3JDckJCIwLiJvRW4wJDQjISM3JCIwekZBeUQxcSYhIzc3JCQiL1ZjSSwxJDQjISM2JCIwaWFNQCNbPWQhIzc3JDckJCIwRUVnQSEzJDQjISM3JCIwUjYiKkdKXSNlISM3NyQkIi9WY0ksMSQ0IyEjNiQiMGlhTUAjWz1kISM3NyQ3JCQiMEVFZ0EhMyQ0IyEjNyQiMFI2IipHSl0jZSEjNzckJCIwOm4vXCQzJDQjISM3JCIwR2NqcFFAJWUhIzc3JDckJCIwdGciW1A1JDQjISM3JCIuJipmek8lXGYhIzU3JCQiMDpuL1wkMyQ0IyEjNyQiMEdjanBRQCVlISM3NyQ3JCQiMHRnIltQNSQ0IyEjNyQiLiYqZnpPJVxmISM1NyQkIjAiPWJzbzUkNCMhIzckIjBENCFvV3psZiEjNzckNyQkIjAwTTBIRko0IyEjNyQiLyd5R0lVUTInISM2NyQkIjAiPWJzbzUkNCMhIzckIjBENCFvV3psZiEjNzckNyQkIjAwTTBIRko0IyEjNyQiLyd5R0lVUTInISM2NyQkIjBbMVZGSUo0IyEjNyQiMHVfKjMnXCUqMychIzc3JDckJCIwc1xUJjM6JDQjISM3JCIvQXc0eUMpPichIzY3JCQiMFsxVkZJSjQjISM3JCIwdV8qMydcJSozJyEjNzckNyQkIjBzXFQmMzokNCMhIzckIi9BdzR5Qyk+JyEjNjckJCIvdTIocGBKNCMhIzYkIjBiP2cyL0pAJyEjNzckNyQkIjAocFFTVzwkNCMhIzckIjAiZWs7TGxBaiEjNzckJCIvdTIocGBKNCMhIzYkIjBiP2cyL0pAJyEjNzckNyQkIjAocFFTVzwkNCMhIzckIjAiZWs7TGxBaiEjNzckJCIwVDVBOXhKNCMhIzckIjBrZWcjeXZPaiEjNzckNyQkIjA5LCNbISk+JDQjISM3JCIwVEhOIyllcVcnISM3NyQkIjBUNUE5eEo0IyEjNyQiMGtlZyN5dk9qISM3NyQ3JCQiMDksI1shKT4kNCMhIzckIjBUSE4jKWVxVychIzc3JCQiL2Q/MzE/JDQjISM2JCIwJ3k6MjRUZ2shIzc3JDckJCIwVm1nbkBLNCMhIzckIjAtOC9MazlkJyEjNzckJCIvZD8zMT8kNCMhIzYkIjAneToyNFRnayEjNzckNyQkIjBWbWduQEs0IyEjNyQiMC04L0xrOWQnISM3NyQkIjB1MVM0Q0s0IyEjNyQiMCZcPmBMMSVlJyEjNzckNyQkIjBabGxLWEs0IyEjNyQiMGknSFApcGVwJyEjNzckJCIwdTFTNENLNCMhIzckIjAmXD5gTDElZSchIzc3JDckJCIwWmxsS1hLNCMhIzckIjBpJ0hQKXBlcCchIzc3JCQiMHlGP2daSzQjISM3JCIwIyplbjM6eHEnISM3NyQ3JCQiMChmQygqKm9LNCMhIzckIjBBIT1XYEY/byEjNzckJCIweUY/Z1pLNCMhIzckIjAjKmVuMzp4cSchIzc3JDckJCIwKGZDKCoqb0s0IyEjNyQiMEEhPVdgRj9vISM3NyQkIjBANChINkYkNCMhIzckIjB5QCoqPW04JG8hIzc3JDckJCIwJltYIXAjSCQ0IyEjNyQiMCRRMV4zb1dwISM3NyQkIjBANChINkYkNCMhIzckIjB5QCoqPW04JG8hIzc3JDckJCIwJltYIXAjSCQ0IyEjNyQiMCRRMV4zb1dwISM3NyQkIjBgWSh6WUgkNCMhIzckIjB6YGlkO10mcCEjNzckNyQkIjA8Jj4wa0okNCMhIzckIjBWWnpOJzNwcSEjNzckJCIwYFkoellIJDQjISM3JCIwemBpZDtdJnAhIzc3JDckJCIwPCY+MGtKJDQjISM3JCIwVlp6TiczcHEhIzc3JCQiMFQib10jPUw0IyEjNyQiL2ZeI0htJ3lxISM2NyQ3JCQiMC4kKSpSLE0kNCMhIzckIjAvSlsnPVwkPighIzc3JCQiMFQib10jPUw0IyEjNyQiL2ZeI0htJ3lxISM2NyQ3JCQiMC4kKSpSLE0kNCMhIzckIjAvSlsnPVwkPighIzc3JCQiMCplUFQ9TSQ0IyEjNyQiMHImPnZgSi1zISM3NyQ3JCQiMFlzaCpRTyQ0IyEjNyQiMGs5PFAoKnlKKCEjNzckJCIwKmVQVD1NJDQjISM3JCIwciY+dmBKLXMhIzc3JDckJCIwWXNoKlFPJDQjISM3JCIwazk8UCgqeUooISM3NyQkIjBEaklYbEw0IyEjNyQiMEBcWnlqZksoISM3NyQ3JCQiMCdvLnZ3USQ0IyEjNyQiMEQpZnlHSVV1ISM3NyQkIjBEaklYbEw0IyEjNyQiMEBcWnlqZksoISM3NyQ3JCQiMCdvLnZ3USQ0IyEjNyQiMEQpZnlHSVV1ISM3NyQkIjAnKkhwMypRJDQjISM3JCIvRTgkWzYnXHUhIzY3JDckJCIwUmBSWjZNNCMhIzckIjAmPVsmUTNuYyghIzc3JCQiMCcqSHAzKlEkNCMhIzckIi9FOCRbNidcdSEjNjckNyQkIjBSYFJaNk00IyEjNyQiMCY9WyZRM25jKCEjNzckJCIwPU4wdTdNNCMhIzckIjA2NSdbJmVLZCghIzc3JDckJCIwJWVGJUhOTTQjISM3JCIwWGxCKlE2InAoISM3NyQkIjA9TjB1N000IyEjNyQiMDY1J1smZUtkKCEjNzckNyQkIjAlZUYlSE5NNCMhIzckIjBYbEIqUTYicCghIzc3JCQiMGJPXlRPTTQjISM3JCIwL2MzJVwhcHAoISM3NyQ3JCQiMDYrZzhmTTQjISM3JCIwMVwjKlI+YiJ5ISM3NyQkIjBiT15UT000IyEjNyQiMC9jMyVcIXBwKCEjNzckNyQkIjA2K2c4Zk00IyEjNyQiMDFcIypSPmIieSEjNzckJCIwckgyNmdNNCMhIzckIjAjMyxnMWI/eSEjNzckNyQkIjBkNnkqSFskNCMhIzckIjBtS2ghXCMqUnohIzc3JCQiMHJIMjZnTTQjISM3JCIwIzMsZzFiP3khIzc3JDckJCIwZDZ5KkhbJDQjISM3JCIwbUtoIVwjKlJ6ISM3NyQkIi83J2YjUVskNCMhIzYkIjAlPVpcZD5XeiEjNzckNyQkIjBWIUcjKW9dJDQjISM3JCIwRjtJVElWMSkhIzc3JCQiLzcnZiNRWyQ0IyEjNiQiMCU9WlxkPld6ISM3NyQ3JCQiMFYhRyMpb10kNCMhIzckIjBGO0lUSVYxKSEjNzckJCIvb1tqdl0kNCMhIzYkIjAoRzNDLCV5MSkhIzc3JDckJCIwWkdveUlONCMhIzckIjAoKSoqKT5mdCk9KSEjNzckJCIvb1tqdl0kNCMhIzYkIjAoRzNDLCV5MSkhIzc3JDckJCIwWkdveUlONCMhIzckIjAoKSoqKT5mdCk9KSEjNzckJCIvKGUxS0pONCMhIzYkIjAoXHVvUVsiPikhIzc3JDckJCIwUFNGcmFONCMhIzckIjBaJHlFOTk4JCkhIzc3JCQiLyhlMUtKTjQjISM2JCIwKFx1b1FbIj4pISM3NyQ3JCQiMFBTRnJhTjQjISM3JCIwWiR5RTk5OCQpISM3NyQkIjBmQCkpNGJONCMhIzckIjApNE1TcDc6JCkhIzc3JDckJCIwZl0rbXlONCMhIzckIjAzbk8kcGFQJSkhIzc3JCQiMGZAKSk0Yk40IyEjNyQiMCk0TVNwNzokKSEjNzckNyQkIjBmXStteU40IyEjNyQiMDNuTyRwYVAlKSEjNzckJCIwN3J6Kil5TjQjISM3JCIwYjUhUiRwKFElKSEjNzckNyQkIjAyYihHRWckNCMhIzckIjBvXTBXXz5jKSEjNzckJCIwN3J6Kil5TjQjISM3JCIwYjUhUiRwKFElKSEjNzckNyQkIjAyYihHRWckNCMhIzckIjBvXTBXXz5jKSEjNzckJCIwKHo0PUZnJDQjISM3JCIwdF9dMTZDYykhIzc3JDckJCIvbUZAcWgkNCMhIzYkIjAxTls2IWZPJykhIzc3JCQiMCh6ND1GZyQ0IyEjNyQiMHRfXTE2Q2MpISM3NyQ3JCQiL21GQHFoJDQjISM2JCIwSl4kKik9IUh6JCEjNzckJCIwJ3BHJHA6XDQjISM3JCIwSl4kKik9IUh6JCEjNzckNyQkIjAoKSkzcm9cKDQjISM3JCIwKVIoNHZhVXUkISM3NyQkIjAncEckcDpcNCMhIzckIjBKXiQqKT0hSHokISM3NyQ3JCQiL21GQHFoJDQjISM2JCIwMU5bNiFmTycpISM3NyQkIjBMRF5jRU80IyEjNyQiMHRVJkc+MCdvKSEjNzckNyQkIjBCaE5pRU80IyEjNyQiMEhNdSV6TidvKSEjNzckJCIwTEReY0VPNCMhIzckIjB0VSZHPjAnbykhIzc3JDckJCIwQmhOaUVPNCMhIzckIjBITXUlek4nbykhIzc3JCQiMFw5U1ddTzQjISM3JCIwbipScTxwNCkpISM3NyQ3JCQiL2MmKVsxbCQ0IyEjNiQiMCp5SmFNdzUpKSEjNzckJCIwXDlTV11PNCMhIzckIjBuKlJxPHA0KSkhIzc3JDckJCIvYyYpWzFsJDQjISM2JCIwKnlKYU13NSkpISM3NyQkIi8qcFFNdU80IyEjNiQiMEUlKSpSNExMKikhIzc3JDckJCIwPFpicHVPNCMhIzckIi86P2gqb14kKikhIzY3JCQiLypwUU11TzQjISM2JCIwRSUpKlI0TEwqKSEjNzckNyQkIjA8WmJwdU80IyEjNyQiLzo/aCpvXiQqKSEjNjckJCIwVSVSaiMpcCQ0IyEjNyQiMCV5KSl5JXBwMCohIzc3JDckJCIwUVVBdylwJDQjISM3JCIvXjNvV2RmISohIzY3JCQiMFUlUmojKXAkNCMhIzckIjAleSkpeSVwcDAqISM3NyQ3JCQiMFFVQXcpcCQ0IyEjNyQiL14zb1dkZiEqISM2NyQkIjB4T1E/QVA0IyEjNyQiMGhycU0yMT0qISM3NyQ3JCQiMGtWLiZHcyQ0IyEjNyQiLyhvXCgqelI9KiEjNjckJCIweE9RP0FQNCMhIzckIjBocnFNMjE9KiEjNzckNyQkIjBrVi4mR3MkNCMhIzckIi8ob1woKnpSPSohIzY3JCQiME54XztZUDQjISM3JCIwV2Q+YVdVSSohIzc3JDckJCIwRCJ5ZnB1JDQjISM3JCIwSl89WyZRMyQqISM3NyQkIjBOeF87WVA0IyEjNyQiMFdkPmFXVUkqISM3NyQ3JCQiMEQieWZwdSQ0IyEjNyQiMEpfPVsmUTMkKiEjNzckJCIwZU1qOXFQNCMhIzckIjB5V3k1Iil5VSohIzc3JDckJCIwRUkkKjNyUDQjISM3JCIwImZ0KSk0ekslKiEjNzckJCIwZU1qOXFQNCMhIzckIjB5V3k1Iil5VSohIzc3JDckJCIwRUkkKjNyUDQjISM3JCIwImZ0KSk0ekslKiEjNzckJCIwJVtUW1R6JDQjISM3JCIwb1EnKipwXl4mKiEjNzckNyQkIjBuMi1DJnokNCMhIzckIjBfPmNcJz5kJiohIzc3JCQiMCVbVFtUeiQ0IyEjNyQiMG9RJyoqcF5eJiohIzc3JDckJCIwbjItQyZ6JDQjISM3JCIwXz5jXCc+ZCYqISM3NyQkIjAoKilSciI9UTQjISM3JCIwMmc2QV9ebiohIzc3JDckJCIwNCVRNyU+UTQjISM3JCIwNy5EKy07byohIzc3JCQiMCgqKVJyIj1RNCMhIzckIjAyZzZBX15uKiEjNzckNyQkIjA0JVE3JT5RNCMhIzckIjA3LkQrLTtvKiEjNzckJCIwPSgpUkBVUTQjISM3JCIwRCczOW95KXoqISM3NyQ3JCQiMCMzci9PJVE0IyEjNyQiMHMnUTR2KzEpKiEjNzckJCIwPSgpUkBVUTQjISM3JCIwRCczOW95KXoqISM3NyQ3JCQiMCMzci9PJVE0IyEjNyQiMHMnUTR2KzEpKiEjNzckJCIwajV3Rm1RNCMhIzckIi94X0syVUEqKiEjNjckNyQkIjBoRyQ9eSdRNCMhIzckIjBMcWksOC8kKiohIzc3JCQiMGo1d0ZtUTQjISM3JCIveF9LMlVBKiohIzY3JDckJCIwaEckPXknUTQjISM3JCIwTHFpLDgvJCoqISM3NyQkIjBjWTNPISpRNCMhIzckIjBWNUFTMFkrIiEjNjckNyQkIjBiVj8wIypRNCMhIzckIjBSOkImPVswNSEjNjckJCIwY1kzTyEqUTQjISM3JCIwVjVBUzBZKyIhIzY3JDckJCIwYlY/MCMqUTQjISM3JCIwUjpCJj1bMDUhIzY3JCQiMExSXVk5UjQjISM3JCIuclJtb3AsIiEiKjckNyQkIjBOSHJJO1I0IyEjNyQiMHYuSVNBeiwiISM2NyQkIjBMUl1ZOVI0IyEjNyQiLnJSbW9wLCIhIio3JDckJCIwTkhySTtSNCMhIzckIjB2LklTQXosIiEjNjckJCIwMVsqKWVRUjQjISM3JCIwTDhEJz1MSDUhIzY3JDckJCIwSkRBZVNSNCMhIzckIjA2I3BgSE9JNSEjNjckJCIwMVsqKWVRUjQjISM3JCIwTDhEJz1MSDUhIzY3JDckJCIwSkRBZVNSNCMhIzckIjA2I3BgSE9JNSEjNjckJCIweixQdGlSNCMhIzckIjA5PFUqXHBUNSEjNjckNyQkIjBDJW95WydSNCMhIzckIjBaIVEvTiFHLyIhIzY3JCQiMHosUHRpUjQjISM3JCIwOTxVKlxwVDUhIzY3JDckJCIwQyVveVsnUjQjISM3JCIwWiFRL04hRy8iISM2NyQkIjAoKnoiKSpvKVI0IyEjNyQiMFl2RTFlUzAiISM2NyQ3JCQiMGhYXj4qKVI0IyEjNyQiMCUpb10wV18wIiEjNjckJCIwKCp6IikqbylSNCMhIzckIjBZdkUxZVMwIiEjNjckNyQkIjBoWF4+KilSNCMhIzckIjAlKW9dMFdfMCIhIzY3JCQiMCZ6WiQzNlM0IyEjNyQiMDd3VjFAazEiISM2NyQ3JCQiMDBpSGA4UzQjISM3JCIvc3YwWW9uNSEjNTckJCIwJnpaJDM2UzQjISM3JCIwN3dWMUBrMSIhIzY3JDckJCIwMGlIYDhTNCMhIzckIi9zdjBZb241ISM1NyQkIi8qMyYpR05TNCMhIzYkIjAkUiFHKyV5eTUhIzY3JDckJCIwTD80KnkuJTQjISM3JCIwY1hrOkQsMyIhIzY3JCQiLyozJilHTlM0IyEjNiQiMCRSIUcrJXl5NSEjNjckNyQkIjBMPzQqeS4lNCMhIzckIjBjWGs6RCwzIiEjNjckJCIwOSlbOSZmUzQjISM3JCIwNGlTKG85IjQiISM2NyQ3JCQiMDwoM3FBMSU0IyEjNyQiMCNSODJkYyM0IiEjNjckJCIwOSlbOSZmUzQjISM3JCIwNGlTKG85IjQiISM2NyQ3JCQiMDwoM3FBMSU0IyEjNyQiMCNSODJkYyM0IiEjNjckJCIvTzFnUDMlNCMhIzYkIjAiZlsjbzRONSIhIzY3JDckJCIwPTAlcG0zJTQjISM3JCIwR0F5RDFdNSIhIzY3JCQiL08xZ1AzJTQjISM2JCIwImZbI280TjUiISM2NyQ3JCQiMD0wJXBtMyU0IyEjNyQiMEdBeUQxXTUiISM2NyQkIjAiPVNEITNUNCMhIzckIjBWVHZVc2U2IiEjNjckNyQkIjA6JyopKTM2VDQjISM3JCIwazUmM29XPDYhIzY3JCQiMCI9U0QhM1Q0IyEjNyQiMFZUdlVzZTYiISM2NyQ3JCQiMDonKikpMzZUNCMhIzckIjBrNSYzb1c8NiEjNjckJCIwaSNwNkI4JTQjISM3JCIwVzhhNU4jRzYhIzY3JDckJCIwW3YmSGI4JTQjISM3JCIuKj5mdCkpSDYhIio3JCQiMGkjcDZCOCU0IyEjNyQiMFc4YTVOI0c2ISM2NyQ3JCQiMFt2JkhiOCU0IyEjNyQiLio+ZnQpKUg2ISIqNyQkIjBGJWU8bTolNCMhIzckIjBLTy9zKGZTNiEjNjckNyQkIjBUWi0qKmZUNCMhIzckIjBPKCkpNHpLVTYhIzY3JCQiMEYlZTxtOiU0IyEjNyQiMEtPL3MoZlM2ISM2NyQ3JCQiMFRaLSoqZlQ0IyEjNyQiME8oKSk0ektVNiEjNjckJCIwSkNVJTQ9JTQjISM3JCIwXEkqby0nSDoiISM2NyQ3JCQiMC1rQVolPSU0IyEjNyQiMHN2MFlvWjoiISM2NyQkIjBKQ1UlND0lNCMhIzckIjBcSSpvLSdIOiIhIzY3JDckJCIwLWtBWiU9JTQjISM3JCIwc3YwWW9aOiIhIzY3JCQiL1drIUgwVTQjISM2JCIwKjMrYUZLbDYhIzY3JDckJCIwVXNXKCozVTQjISM3JCIwM2s3LDRzOyIhIzY3JCQiL1drIUgwVTQjISM2JCIwKjMrYUZLbDYhIzY3JDckJCIwVXNXKCozVTQjISM3JCIwM2s3LDRzOyIhIzY3JCQiMCdlJ29sSFU0IyEjNyQiMDp6Yjwmb3g2ISM2NyQ3JCQiL1BZJ1xMVTQjISM2JCIwV18+Y1wnejYhIzY3JCQiMCdlJ29sSFU0IyEjNyQiMDp6Yjwmb3g2ISM2NyQ3JCQiL1BZJ1xMVTQjISM2JCIwV18+Y1wnejYhIzY3JCQiMGokZlZTRCU0IyEjNyQiMCRcU0p2LyE+IiEjNjckNyQkIjAnPixTIWVVNCMhIzckIi8zazcsNCM+IiEjNTckJCIwaiRmVlNEJTQjISM3JCIwJFxTSnYvIT4iISM2NyQ3JCQiMCc+LFMhZVU0IyEjNyQiLzNrNyw0Iz4iISM1NyQkIjAkb0FcJXlVNCMhIzckIjBLNm0jKTRDPyIhIzY3JDckJCIwJHpVLUVHJTQjISM3JCIwO0hMbUlYPyIhIzY3JCQiMCRvQVwleVU0IyEjNyQiMEs2bSMpNEM/IiEjNjckNyQkIjAkelUtRUclNCMhIzckIjA7SExtSVg/IiEjNjckJCIwUXpiKEdJJTQjISM3JCIwOyNRYj94OTchIzY3JDckJCIwVmlmPTJWNCMhIzckIjBfPFNAcnBAIiEjNjckJCIwUXpiKEdJJTQjISM3JCIwOyNRYj94OTchIzY3JDckJCIwVmlmPTJWNCMhIzckIjBfPFNAcnBAIiEjNjckJCIwaUBFS0ZWNCMhIzckIi9EInlATXJBIiEjNTckNyQkIjB5JmUhekpWNCMhIzckIjApZXFrPFRINyEjNjckJCIwaUBFS0ZWNCMhIzckIi9EInlATXJBIiEjNTckNyQkIjB5JmUhekpWNCMhIzckIjApZXFrPFRINyEjNjckJCIwWlMiKXleVjQjISM3JCIwXCkqNEsnXFI3ISM2NyQ3JCQiMGVLVlRjVjQjISM3JCIwQyVSOkImPUMiISM2NyQkIjBaUyIpeV5WNCMhIzckIjBcKSo0SydcUjchIzY3JDckJCIwZUtWVGNWNCMhIzckIjBDJVI6QiY9QyIhIzY3JCQiMFcoZXVpUCU0IyEjNyQiMFp6cU5lPUQiISM2NyQ3JCQiMFhGJWY1USU0IyEjNyQiL0UzbUdIYTchIzU3JCQiMFcoZXVpUCU0IyEjNyQiMFp6cU5lPUQiISM2NyQ3JCQiMFhGJWY1USU0IyEjNyQiL0UzbUdIYTchIzU3JCQiMHQkKTN5K1c0IyEjNyQiMGM5JkguQWs3ISM2NyQ3JCQiMCNmQkNkUyU0IyEjNyQiMCc0eDtNdG03ISM2NyQkIjB0JCkzeStXNCMhIzckIjBjOSZILkFrNyEjNjckNyQkIjAjZkJDZFMlNCMhIzckIjAnNHg7TXRtNyEjNjckJCIwIykqWzFgVSU0IyEjNyQiL1AuU0FldzchIzU3JDckJCIwbSFlNC9WJTQjISM3JCIwS2Z1J1I8ejchIzY3JCQiMCMpKlsxYFUlNCMhIzckIi9QLlNBZXc3ISM1NyQ3JCQiMG0hZTQvViU0IyEjNyQiMEtmdSdSPHo3ISM2NyQkIjBvK0wmKVxXNCMhIzckIi8zYyMzVyopRyIhIzU3JDckJCIvUXA6XlglNCMhIzYkIjBvWiI9WGgiSCIhIzY3JCQiMG8rTCYpXFc0IyEjNyQiLzNjIzNXKilHIiEjNTckNyQkIi9RcDpeWCU0IyEjNiQiMG9aIj1YaCJIIiEjNjckJCIwWFokPVdaJTQjISM3JCIwSjptJ2VJLDghIzY3JDckJCIwRDo1JSl6VzQjISM3JCIwL08pb10wLzghIzY3JCQiMFhaJD1XWiU0IyEjNyQiMEo6bSdlSSw4ISM2NyQ3JCQiMEQ6NSUpelc0IyEjNyQiMC9PKW9dMC84ISM2NyQkIjApKT1WKypcJTQjISM3JCIwJmZkJGVuT0oiISM2NyQ3JCQiMCpIUChlL1g0IyEjNyQiL1dfPmNcOzghIzU3JCQiMCkpPVYrKlwlNCMhIzckIjAmZmQkZW5PSiIhIzY3JDckJCIwKkhQKGUvWDQjISM3JCIvV18+Y1w7OCEjNTckJCIwaGspNE9fJTQjISM3JCIwXnN4QkhnSyIhIzY3JDckJCIwNCxQTkhYNCMhIzckIjB3Ny08TypHOCEjNjckJCIwaGspNE9fJTQjISM3JCIwXnN4QkhnSyIhIzY3JDckJCIwNCxQTkhYNCMhIzckIjB3Ny08TypHOCEjNjckJCIwdWRSQltYNCMhIzckIjB2KFxLM1JROCEjNjckNyQkIjBZbypRVGIlNCMhIzckIjA3LDRzdzhNIiEjNjckJCIwdWRSQltYNCMhIzckIjB2KFxLM1JROCEjNjckNyQkIjBZbypRVGIlNCMhIzckIjA3LDRzdzhNIiEjNjckJCIwJilbJ3lHZCU0IyEjNyQiMGF3Nk9fMk4iISM2NyQ3JCQiMHNxYiUqeVg0IyEjNyQiMFwqZXJzIlFOIiEjNjckJCIwJilbJ3lHZCU0IyEjNyQiMGF3Nk9fMk4iISM2NyQ3JCQiMHNxYiUqeVg0IyEjNyQiMFwqZXJzIlFOIiEjNjckJCIwYlVLYShmJTQjISM3JCIwbVFnI1E2ajghIzY3JDckJCIwYFxAeC5ZNCMhIzckIjAmeUZBeURtOCEjNjckJCIwYlVLYShmJTQjISM3JCIwbVFnI1E2ajghIzY3JDckJCIwYFxAeC5ZNCMhIzckIjAmeUZBeURtOCEjNjckJCIwJCozJUdBaSU0IyEjNyQiMFpOXEF2YVAiISM2NyQ3JCQiMFUtKD4nR1k0IyEjNyQiMEBtSFApcHk4ISM2NyQkIjAkKjMlR0FpJTQjISM3JCIwWk5cQXZhUCIhIzY3JDckJCIwVS0oPidHWTQjISM3JCIwQG1IUClweTghIzY3JCQiMENUQCRwayU0IyEjNyQiMF8sVmNPeVEiISM2NyQ3JCQiMGM5aVtgWTQjISM3JCIwZGFPIypRNlIiISM2NyQkIjBDVEAkcGslNCMhIzckIjBfLFZjT3lRIiEjNjckNyQkIjBjOWlbYFk0IyEjNyQiMGRhTyMqUTZSIiEjNjckJCIwRlRhbHJZNCMhIzckIjBoQzQleT4rOSEjNjckNyQkIjBsaUlQeVk0IyEjNyQiMCRITXUlek5TIiEjNjckJCIwRlRhbHJZNCMhIzckIjBoQzQleT4rOSEjNjckNyQkIjBsaUlQeVk0IyEjNyQiMCRITXUlek5TIiEjNjckJCIwVHonKVIncCU0IyEjNyQiMDc8TzBmRFQiISM2NyQ3JCQiLyoqKSl6S3ElNCMhIzYkIjBISl0tP2dUIiEjNjckJCIwVHonKVIncCU0IyEjNyQiMDc8TzBmRFQiISM2NyQ3JCQiLyoqKSl6S3ElNCMhIzYkIjBISl0tP2dUIiEjNjckJCIwYSVcaDZzJTQjISM3JCIwKHBgLi0jXFUiISM2NyQ3JCQiMClbSTEjR1o0IyEjNyQiMGw+ZGRnJUc5ISM2NyQkIjBhJVxoNnMlNCMhIzckIjAocGAuLSNcVSIhIzY3JDckJCIwKVtJMSNHWjQjISM3JCIwbD5kZGclRzkhIzY3JCQiMDxYVyVmdSU0IyEjNyQiMEskKikpRyJHUDkhIzY3JDckJCIwQ0dTOmBaNCMhIzckIjAsM2s3LDRXIiEjNjckJCIwPFhXJWZ1JTQjISM3JCIwSyQqKSlHIkdQOSEjNjckNyQkIjBDR1M6YFo0IyEjNyQiMCwzazcsNFciISM2NyQkIjBKJlFZMnglNCMhIzckIi8yTzhCa1w5ISM1NyQ3JCQiMGVgMjd5WjQjISM3JCIwUCc0eDtNYDkhIzY3JCQiMEomUVkyeCU0IyEjNyQiLzJPOEJrXDkhIzU3JDckJCIwZWAyN3laNCMhIzckIjBQJzR4O01gOSEjNjckJCIwciEqeWMmeiU0IyEjNyQiMDAkNHZLK2k5ISM2NyQ3JCQiMFdWdTUuWzQjISM3JCIwdCV5RkF5bDkhIzY3JCQiMHIhKnljJnolNCMhIzckIjAwJDR2SytpOSEjNjckNyQkIjBXVnU1Lls0IyEjNyQiMHQleUZBeWw5ISM2NyQkIjBYZCozLyNbNCMhIzckIjAqRzV1VE91OSEjNjckNyQkIi9uXjkiR1s0IyEjNiQiMDR0JXlGQXk5ISM2NyQkIjBYZCozLyNbNCMhIzckIjAqRzV1VE91OSEjNjckNyQkIi9uXjkiR1s0IyEjNiQiMDR0JXlGQXk5ISM2NyQkIi91K3FfJVs0IyEjNiQiMGFQITRdcydbIiEjNjckNyQkIjBNTDY5YFs0IyEjNyQiMFhoIkhMbSFcIiEjNjckJCIvdStxXyVbNCMhIzYkIjBhUCE0XXMnWyIhIzY3JDckJCIwTUw2OWBbNCMhIzckIjBYaCJITG0hXCIhIzY3JCQiMHIkPl0sKFs0IyEjNyQiMFI3RXkmMypcIiEjNjckNyQkIjBgLng9eVs0IyEjNyQiMCIpXCl6UTUuOiEjNjckJCIwciQ+XSwoWzQjISM3JCIwUjdFeSYzKlwiISM2NyQ3JCQiMGAueD15WzQjISM3JCIwIilcKXpRNS46ISM2NyQkIjBsSCpcXSpbNCMhIzckIjBGLU5cWTleIiEjNjckNyQkIi9CbmFLIVw0IyEjNiQiMDxRMFZXYl4iISM2NyQkIjBsSCpcXSpbNCMhIzckIjBGLU5cWTleIiEjNjckNyQkIi9CbmFLIVw0IyEjNiQiMDxRMFZXYl4iISM2NyQkIi8pcChvKj5cNCMhIzYkIjBXTko5MlFfIiEjNjckNyQkIjBYXi1NR1w0IyEjNyQiMGBFNylcKXpfIiEjNjckJCIvKXAobyo+XDQjISM2JCIwV05KOTJRXyIhIzY3JDckJCIwWF4tTUdcNCMhIzckIjBgRTcpXCl6XyIhIzY3JCQiMGk1dyFcJVw0IyEjNyQiMFVQJ0d4O086ISM2NyQ3JCQiMCR6bllNJlw0IyEjNyQiMCpbIj5gRC9hIiEjNjckJCIwaTV3IVwlXDQjISM3JCIwVVAnR3g7TzohIzY3JDckJCIwJHpuWU0mXDQjISM3JCIwKlsiPmBEL2EiISM2NyQkIjBwOF4nKXBcNCMhIzckIjAiKSpIYSNHJls6ISM2NyQ3JCQiMCUqUkVkeVw0IyEjNyQiMEQuRTNtR2IiISM2NyQkIjBwOF4nKXBcNCMhIzckIjAiKSpIYSNHJls6ISM2NyQ3JCQiMCUqUkVkeVw0IyEjNyQiMEQuRTNtR2IiISM2NyQkIjBtWEUlWypcNCMhIzckIi8wdTooKSkzYyIhIzU3JDckJCIweikzPVArJjQjISM3JCIwaCJITG1JbDohIzY3JCQiMG1YRSVbKlw0IyEjNyQiLzB1OigpKTNjIiEjNTckNyQkIjB6KTM9UCsmNCMhIzckIjBoIkhMbUlsOiEjNjckJCIwVWMjUik+XTQjISM3JCIwKmYrOyJcS2QiISM2NyQ3JCQiMCdwWyQpKUddNCMhIzckIjAoKnpSPVp4ZCIhIzY3JCQiMFVjI1IpPl00IyEjNyQiMCpmKzsiXEtkIiEjNjckNyQkIjAncFskKSlHXTQjISM3JCIwKCp6Uj1aeGQiISM2NyQkIjApM1RiWy8mNCMhIzckIjBfME9YNGNlIiEjNjckNyQkIjAjPkxwUzAmNCMhIzckIjBMb1l0KD0hZiIhIzY3JCQiMCkzVGJbLyY0IyEjNyQiMF8wT1g0Y2UiISM2NyQ3JCQiMCM+THBTMCY0IyEjNyQiMExvWXQoPSFmIiEjNjckJCIwXzM7KilwXTQjISM3JCIwZlBwc3B6ZiIhIzY3JDckJCIwaEVZRnpdNCMhIzckIjBwY2BHR0VnIiEjNjckJCIwXzM7KilwXTQjISM3JCIwZlBwc3B6ZiIhIzY3JDckJCIwaEVZRnpdNCMhIzckIjBwY2BHR0VnIiEjNjckJCIwTTpnJVw0JjQjISM3JCIweSMpPSUqSC5oIiEjNjckNyQkIjBpRCEqXC9eNCMhIzckIjAwWGckKW9daCIhIzY3JCQiME06ZyVcNCY0IyEjNyQiMHkjKT0lKkguaCIhIzY3JDckJCIwaUQhKlwvXjQjISM3JCIwMFhnJClvXWgiISM2NyQkIjBzcio+KzcmNCMhIzckIjBEVlQ0IXBBOyEjNjckNyQkIjA6eEx1SF40IyEjNyQiMFRMblE0dmkiISM2NyQkIjBzcio+KzcmNCMhIzckIjBEVlQ0IXBBOyEjNjckNyQkIjA6eEx1SF40IyEjNyQiMFRMblE0dmkiISM2NyQkIjAiUVo4XjkmNCMhIzckIjBQSlA9XV1qIiEjNjckNyQkIjBleHcrYl40IyEjNyQiMHhAdSQqXCpSOyEjNjckJCIwIlFaOF45JjQjISM3JCIwUEpQPV1daiIhIzY3JDckJCIwZXh3K2JeNCMhIzckIjB4QHUkKlwqUjshIzY3JCQiMCI+ckQtPCY0IyEjNyQiMFJWS0A1dWsiISM2NyQ3JCQiMCIzZCFIIT0mNCMhIzckIjA5NSIpWyFSXzshIzY3JCQiMCI+ckQtPCY0IyEjNyQiMFJWS0A1dWsiISM2NyQ3JCQiMCIzZCFIIT0mNCMhIzckIjA5NSIpWyFSXzshIzY3JCQiMCdmdmRgPiY0IyEjNyQiMGRbI3oseGY7ISM2NyQ3JCQiMEtlWmYwXzQjISM3JCIvJil6UTUkW20iISM1NyQkIjAnZnZkYD4mNCMhIzckIjBkWyN6LHhmOyEjNjckNyQkIjBLZVpmMF80IyEjNyQiLyYpelE1JFttIiEjNTckJCIweCQzNDBBJjQjISM3JCIwR0BNM0lAbiIhIzY3JDckJCIwY0p2IjRCJjQjISM3JCIwJ29bKmVyc24iISM2NyQkIjB4JDM0MEEmNCMhIzckIjBHQE0zSUBuIiEjNjckNyQkIjBjSnYiNEImNCMhIzckIjAnb1sqZXJzbiIhIzY3JCQiMChlaHljQyY0IyEjNyQiMCZHQUgqKlslbyIhIzY3JDckJCIwX2UlZmlEJjQjISM3JCIwQXYsOTcoKm8iISM2NyQkIjAoZWh5Y0MmNCMhIzckIjAmR0FIKipbJW8iISM2NyQ3JCQiMF9lJWZpRCY0IyEjNyQiMEF2LDk3KCpvIiEjNjckJCIwNyNwbjNGJjQjISM3JCIwMGRCclxvcCIhIzY3JDckJCIwR004aSJHJjQjISM3JCIwZWozcF9AcSIhIzY3JCQiMDcjcG4zRiY0IyEjNyQiMDBkQnJcb3AiISM2NyQ3JCQiMEdNOGkiRyY0IyEjNyQiMGVqM3BfQHEiISM2NyQkIjBvM2oyJ0gmNCMhIzckIjA9T0dWNCM0PCEjNjckNyQkIjBFYkorMmA0IyEjNyQiMCU+YlRLZjk8ISM2NyQkIjBvM2oyJ0gmNCMhIzckIjA9T0dWNCM0PCEjNjckNyQkIjBFYkorMmA0IyEjNyQiMCU+YlRLZjk8ISM2NyQkIjByaFdJQGA0IyEjNyQiMGNzMTRwOnMiISM2NyQ3JCQiMCh5IlxTS2A0IyEjNyQiLy5DI3pMcXMiISM1NyQkIjByaFdJQGA0IyEjNyQiMGNzMTRwOnMiISM2NyQ3JCQiMCh5IlxTS2A0IyEjNyQiLy5DI3pMcXMiISM1NyQkIjAnSFNebE0mNCMhIzckIjBWbCMpb0dSdCIhIzY3JDckJCIwZm1fI3lOJjQjISM3JCIwbUdITXUlUjwhIzY3JCQiMCdIU15sTSY0IyEjNyQiMFZsIylvR1J0IiEjNjckNyQkIjBmbV8jeU4mNCMhIzckIjBtR0hNdSVSPCEjNjckJCIwOiRHPD1QJjQjISM3JCIwXkpeQSlHWTwhIzY3JDckJCIwJCpcYkUkUSY0IyEjNyQiMC08TypbIj52IiEjNjckJCIwOiRHPD1QJjQjISM3JCIwXkpeQSlHWTwhIzY3JDckJCIwJCpcYkUkUSY0IyEjNyQiMC08TypbIj52IiEjNjckJCIwbWg+NShSJjQjISM3JCIwb0A8cVonZTwhIzY3JDckJCIwek9dczNhNCMhIzckIjBRMFZXYlZ3IiEjNjckJCIwbWg+NShSJjQjISM3JCIwb0A8cVonZTwhIzY3JDckJCIwek9dczNhNCMhIzckIjBRMFZXYlZ3IiEjNjckJCIwNnpoU0FhNCMhIzckIjA+aGM2MjV4IiEjNjckNyQkIjAnZSRRP01hNCMhIzckIjB1JCpcKmZ6dzwhIzY3JCQiMDZ6aFNBYTQjISM3JCIwPmhjNjI1eCIhIzY3JDckJCIwJ2UkUT9NYTQjISM3JCIwdSQqXCpmenc8ISM2NyQkIjAxKUhIeFcmNCMhIzckIjAlUioqb2tPJHkiISM2NyQ3JCQiMCgqZURxZmE0IyEjNyQiL0BvWGxCKnkiISM1NyQkIjAxKUhIeFcmNCMhIzckIjAlUioqb2tPJHkiISM2NyQ3JCQiMCgqZURxZmE0IyEjNyQiL0BvWGxCKnkiISM1NyQkIjBaSTcydGE0IyEjNyQiMEUtP3dEZHoiISM2NyQ3JCQiMHosMEEmWyY0IyEjNyQiMFlxajR4OyE9ISM2NyQkIjBaSTcydGE0IyEjNyQiMEUtP3dEZHoiISM2NyQ3JCQiMHosMEEmWyY0IyEjNyQiMFlxajR4OyE9ISM2NyQkIjAoKikqPlYpXCY0IyEjNyQiMGM4WSpcMzM9ISM2NyQ3JCQiMCN6LWQyXiY0IyEjNyQiMCMpZXFrPFQiPSEjNjckJCIwKCopKj5WKVwmNCMhIzckIjBjOFkqXDMzPSEjNjckNyQkIjAjei1kMl4mNCMhIzckIjAjKWVxazxUIj0hIzY3JCQiMDpcOyJRXyY0IyEjNyQiMGsib21UVz89ISM2NyQ3JCQiL1I6OWpgJjQjISM2JCIwPVp4PmVsIz0hIzY3JCQiMDpcOyJRXyY0IyEjNyQiMGsib21UVz89ISM2NyQ3JCQiL1I6OWpgJjQjISM2JCIwPVp4PmVsIz0hIzY3JCQiMDgpWzYjXGI0IyEjNyQiME46U0YuRyQ9ISM2NyQ3JCQiMG9xKSopPWMmNCMhIzckIjBhTiVbKCkqKlE9ISM2NyQkIjA4KVs2I1xiNCMhIzckIjBOOlNGLkckPSEjNjckNyQkIjBvcSkqKT1jJjQjISM3JCIwYU4lWygpKipRPSEjNjckJCIwS1QpR1lkJjQjISM3JCIwZiE+REI7WD0hIzY3JDckJCIwQTpiWyhlJjQjISM3JCIvUjcqSFI5Jj0hIzU3JCQiMEtUKUdZZCY0IyEjNyQiMGYhPkRCO1g9ISM2NyQ3JCQiMEE6YlsoZSY0IyEjNyQiL1I3KkhSOSY9ISM1NyQkIjA4UGQxK2M0IyEjNyQiME4uUEpAdiY9ISM2NyQ3JCQiMEJaKCo0OGM0IyEjNyQiMEU3KVwpelEnPSEjNjckJCIwOFBkMStjNCMhIzckIjBOLlBKQHYmPSEjNjckNyQkIjBCWigqNDhjNCMhIzckIjBFNylcKXpRJz0hIzY3JCQiMEojW0BiaSY0IyEjNyQiMF93PEMhKSlwPSEjNjckNyQkIjBYNUt0UWM0IyEjNyQiMGkrMFM/aig9ISM2NyQkIjBKI1tAYmkmNCMhIzckIjBfdzxDISkpcD0hIzY3JDckJCIwWDVLdFFjNCMhIzckIjBpKzBTP2ooPSEjNjckJCIwRDNhKjRsJjQjISM3JCIwJlJiNiJSQSk9ISM2NyQ3JCQiMFtcZlFrYzQjISM3JCIwKSopPV40dykpPSEjNjckJCIwRDNhKjRsJjQjISM3JCIwJlJiNiJSQSk9ISM2NyQ3JCQiMFtcZlFrYzQjISM3JCIwKSopPV40dykpPSEjNjckJCIwW2ApKVt3YzQjISM3JCIwdlYoPXpmJSo9ISM2NyQ3JCQiL29oZStwJjQjISM2JCIwTXg9XSw3IT4hIzY3JCQiMFtgKSlbd2M0IyEjNyQiMHZWKD16ZiUqPSEjNjckNyQkIi9vaGUrcCY0IyEjNiQiME14PV0sNyE+ISM2NyQkIjBRJD4sP3EmNCMhIzckIjBuW2BtY3AhPiEjNjckNyQkIjAxZSlcZHImNCMhIzckIi9kY18/azg+ISM1NyQkIjBRJD4sP3EmNCMhIzckIjBuW2BtY3AhPiEjNjckNyQkIjAxZSlcZHImNCMhIzckIi9kY18/azg+ISM1NyQkIi9HTEt2cyY0IyEjNiQiMCdRbl5gSj4+ISM2NyQ3JCQiMHA/NVlUZDQjISM3JCIwMWFLZyMzRT4hIzY3JCQiL0dMS3ZzJjQjISM2JCIwJ1FuXmBKPj4hIzY3JDckJCIwcD81WVRkNCMhIzckIjAxYUtnIzNFPiEjNjckJCIwRXhCM2BkNCMhIzckIjAnNFF4Um5KPiEjNjckNyQkIjBeXTI+bmQ0IyEjNyQiMFVVUjpCJlE+ISM2NyQkIjBFeEIzYGQ0IyEjNyQiMCc0UXhSbko+ISM2NyQ3JCQiMF5dMj5uZDQjISM3JCIwVVVSOkImUT4hIzY3JCQiL0BnXSd5ZDQjISM2JCIwYyR6V0QuVz4hIzY3JDckJCIwbCwpUkh6JjQjISM3JCIweklZcWo0Jj4hIzY3JCQiL0BnXSd5ZDQjISM2JCIwYyR6V0QuVz4hIzY3JDckJCIwbCwpUkh6JjQjISM3JCIweklZcWo0Jj4hIzY3JCQiMFRYJFFVIWU0IyEjNyQiMDRAJ1w1UmM+ISM2NyQ3JCQiMFA6ITMoPWU0IyEjNyQiMDo+YEQvTSc+ISM2NyQkIjBUWCRRVSFlNCMhIzckIjA0QCdcNVJjPiEjNjckNyQkIjBQOiEzKD1lNCMhIzckIjA6PmBEL00nPiEjNjckJCIwIz5FVylIZTQjISM3JCIwO3hoXFwobz4hIzY3JDckJCIwXmhiXFdlNCMhIzckIjBeMmchWyVlKD4hIzY3JCQiMCM+RVcpSGU0IyEjNyQiMDt4aFxcKG8+ISM2NyQ3JCQiMF5oYlxXZTQjISM3JCIwXjJnIVslZSg+ISM2NyQkIjAwQSJwYSZlNCMhIzckIjBXIio+KXk1Iik+ISM2NyQ3JCQiMFJ6O0lxZTQjISM3JCIwKGVwY2BHKSk+ISM2NyQkIjAwQSJwYSZlNCMhIzckIjBXIio+KXk1Iik+ISM2NyQ3JCQiMFJ6O0lxZTQjISM3JCIwKGVwY2BHKSk+ISM2NyQkIjBmQ0Y2IillNCMhIzckIjAyNHg/bU0qPiEjNjckNyQkIjB6QXA3JyplNCMhIzckIjBCJVEyZnMrPyEjNjckJCIwZkNGNiIpZTQjISM3JCIwMjR4P21NKj4hIzY3JDckJCIwekFwNycqZTQjISM3JCIwQiVRMmZzKz8hIzY3JCQiMGsqW3VuIWY0IyEjNyQiLyYqPXZXI2UrIyEjNTckNyQkIjBVOjooPiNmNCMhIzckIjBmcyFlazs4PyEjNjckJCIwaypbdW4hZjQjISM3JCIvJio9dlcjZSsjISM1NyQ3JCQiMFU6Oig+I2Y0IyEjNyQiMGZzIWVrOzg/ISM2NyQkIjA0OV9YS2Y0IyEjNyQiMGB4PW8jPT0/ISM2NyQ3JCQiMCUzW055JWY0IyEjNyQiMCY0dzNxZ0Q/ISM2NyQkIjA0OV9YS2Y0IyEjNyQiMGB4PW8jPT0/ISM2NyQ3JCQiMCUzW055JWY0IyEjNyQiMCY0dzNxZ0Q/ISM2NyQkIjAkNCNcOmVmNCMhIzckIjBWKnBGM2FJPyEjNjckNyQkIjBpLXNydGY0IyEjNyQiMEpcJWZ2L1E/ISM2NyQkIjAkNCNcOmVmNCMhIzckIjBWKnBGM2FJPyEjNjckNyQkIjBpLXNydGY0IyEjNyQiMEpcJWZ2L1E/ISM2NyQkIjAsP0QoUSlmNCMhIzckIjB2XWgiKikqRy8jISM2NyQ3JCQiLyZlJz4nKipmNCMhIzYkIjBuUCw2KVtdPyEjNjckJCIwLD9EKFEpZjQjISM3JCIwdl1oIiopKkcvIyEjNjckNyQkIi8mZSc+JyoqZjQjISM2JCIwblAsNilbXT8hIzY3JCQiMENAKjQnNGc0IyEjNyQiMFQyNiVwRGI/ISM2NyQ3JCQiMDdZKVJiLSc0IyEjNyQiMC5FM21HSDEjISM2NyQkIjBDQCo0JzRnNCMhIzckIjBUMjYlcERiPyEjNjckNyQkIjA3WSlSYi0nNCMhIzckIjAuRTNtR0gxIyEjNjckJCIwJ3Bta2AuJzQjISM3JCIwJSlcLyJcaG4/ISM2NyQ3JCQiMDtIJXo5MCc0IyEjNyQiMFI5OkBwYDIjISM2NyQkIjAncG1rYC4nNCMhIzckIjAlKVwvIlxobj8hIzY3JDckJCIwO0glejkwJzQjISM3JCIwUjk6QHBgMiMhIzY3JCQiME07JVE2MSc0IyEjNyQiMCN6Jik9Rygqej8hIzY3JDckJCIwUXZ2VnhnNCMhIzckIjB2LUF3NHkzIyEjNjckJCIwTTslUTYxJzQjISM3JCIwI3omKT1HKCp6PyEjNjckNyQkIjBRdnZWeGc0IyEjNyQiMHYtQXc0eTMjISM2NyQkIjBARTMkcDMnNCMhIzckIjAvS3VtSUI0IyEjNjckNyQkIjA5SmNULmg0IyEjNyQiMDYiKkdKXS01IyEjNjckJCIwQEUzJHAzJzQjISM3JCIwL0t1bUlCNCMhIzY3JDckJCIwOUpjVC5oNCMhIzckIjA2IipHSl0tNSMhIzY3JCQiL0B4VEY2JzQjISM2JCIwTHJsWClvL0AhIzY3JDckJCIwKFEqM1RIaDQjISM3JCIwWnpOJzNwN0AhIzY3JCQiL0B4VEY2JzQjISM2JCIwTHJsWClvL0AhIzY3JDckJCIwKFEqM1RIaDQjISM3JCIwWnpOJzNwN0AhIzY3JCQiMD0rMGRRaDQjISM3JCIwKkdwKT1ZcTYjISM2NyQ3JCQiMFBVcFViaDQjISM3JCIwJHlFOTk4REAhIzY3JCQiMD0rMGRRaDQjISM3JCIwKkdwKT1ZcTYjISM2NyQ3JCQiMFBVcFViaDQjISM3JCIwJHlFOTk4REAhIzY3JCQiMFFMIj5XOyc0IyEjNyQiMGgqKXAmUVNIQCEjNjckNyQkIjApcG1nOT0nNCMhIzckIjA+Y1wnPmRQQCEjNjckJCIwUUwiPlc7JzQjISM3JCIwaCopcCZRU0hAISM2NyQ3JCQiMClwbWc5PSc0IyEjNyQiMD5jXCc+ZFBAISM2NyQkIjBsYV1HIT4nNCMhIzckIi5gKXA5d1RAISIqNyQ3JCQiMEZSUV4yaTQjISM3JCIwYldjXjcrOiMhIzY3JCQiMGxhXUchPic0IyEjNyQiLmApcDl3VEAhIio3JDckJCIwRlJRXjJpNCMhIzckIjBiV2NeNys6IyEjNjckJCIwZEgrPDtpNCMhIzckIi89aUAhPlQ6IyEjNTckNyQkIjA8alllTGk0IyEjNyQiMCJITG1JWGlAISM2NyQkIjBkSCs8O2k0IyEjNyQiLz1pQCE+VDojISM1NyQ3JCQiMDxqWWVMaTQjISM3JCIwIkhMbUlYaUAhIzY3JCQiMEgsRjJVaTQjISM3JCIwaVltXndrOyMhIzY3JDckJCIwVSZIdydmaTQjISM3JCIwRkBxaCQqWzwjISM2NyQkIjBILEYyVWk0IyEjNyQiMGlZbV53azsjISM2NyQ3JCQiMFUmSHcnZmk0IyEjNyQiMEZAcWgkKls8IyEjNjckJCIwdjVcKnpFJzQjISM3JCIwbUMhXFIkKXlAISM2NyQ3JCQiMF5MXnkmRyc0IyEjNyQiMGo0eDtNdD0jISM2NyQkIjB2NVwqekUnNCMhIzckIjBtQyFcUiQpeUAhIzY3JDckJCIwXkxeeSZHJzQjISM3JCIwajR4O010PSMhIzY3JCQiL25QTVJIJzQjISM2JCIwZXFnSyI+Ij4jISM2NyQ3JCQiMFZCRCI+Sic0IyEjNyQiMCp6Uj1aeCo+IyEjNjckJCIvblBNUkgnNCMhIzYkIjBlcWdLIj4iPiMhIzY3JDckJCIwVkJEIj5KJzQjISM3JCIwKnpSPVp4Kj4jISM2NyQkIi8qM0MqKT5qNCMhIzYkIjBzJWVWJ1tOPyMhIzY3JDckJCIwKDMiKWYhUWo0IyEjNyQiME4nM3BfQDdBISM2NyQkIi8qM0MqKT5qNCMhIzYkIjBzJWVWJ1tOPyMhIzY3JDckJCIwKDMiKWYhUWo0IyEjNyQiME4nM3BfQDdBISM2NyQkIjBLQyJwZU0nNCMhIzckIjAtIz4sZiFmQCMhIzY3JDckJCIwd1xfQWtqNCMhIzckIjBydSg+ZWxDQSEjNjckJCIwS0MicGVNJzQjISM3JCIwLSM+LGYhZkAjISM2NyQ3JCQiMHdcX0FrajQjISM3JCIwcnUoPmVsQ0EhIzY3JCQiMCUqKVJrPVAnNCMhIzckIjA7IUgqNGojR0EhIzY3JDckJCIwX0wnNC9SJzQjISM3JCIwMmovUCc0UEEhIzY3JCQiMCUqKVJrPVAnNCMhIzckIjA7IUgqNGojR0EhIzY3JDckJCIwX0wnNC9SJzQjISM3JCIwMmovUCc0UEEhIzY3JCQiMCVHI3koeVInNCMhIzckIjBbJD5SLWlTQSEjNjckNyQkIjAwY0RoO2s0IyEjNyQiMFdeNiNwYFxBISM2NyQkIjAlRyN5KHlSJzQjISM3JCIwWyQ+Ui1pU0EhIzY3JDckJCIwMGNEaDtrNCMhIzckIjBXXjYjcGBcQSEjNjckJCIwOUEhNFJVJzQjISM3JCIwKTM1QXQoSEQjISM2NyQ3JCQiMHRaTyRHVyc0IyEjNyQiLylSPVp4PkUjISM1NyQkIjA5QSE0UlUnNCMhIzckIjApMzVBdChIRCMhIzY3JDckJCIwdFpPJEdXJzQjISM3JCIvKVI9Wng+RSMhIzU3JCQiMEpWKGUqXGs0IyEjNyQiMHg9Y01NYEUjISM2NyQ3JCQiMGBRWTJwazQjISM3JCIwO0dELT1XRiMhIzY3JCQiMEpWKGUqXGs0IyEjNyQiMHg9Y01NYEUjISM2NyQ3JCQiMGBRWTJwazQjISM3JCIwO0dELT1XRiMhIzY3JCQiMC5Rcy13azQjISM3JCIwQFMqMzhweEEhIzY3JDckJCIvIkdHTCZcJzQjISM2JCIwXztLZGVvRyMhIzY3JCQiMC5Rcy13azQjISM3JCIwQFMqMzhweEEhIzY3JDckJCIvIkdHTCZcJzQjISM2JCIwXztLZGVvRyMhIzY3JCQiMG9eSzYtbDQjISM3JCIwLikzOyNbK0gjISM2NyQ3JCQiMEA1NGhAbDQjISM3JCIwKVshUjcqSCpIIyEjNjckJCIwb15LNi1sNCMhIzckIjAuKTM7I1srSCMhIzY3JDckJCIwQDU0aEBsNCMhIzckIjApWyFSNypIKkgjISM2NyQkIjAmejE9I0dsNCMhIzckIjA4WUgxMENJIyEjNjckNyQkIjBNLnMhemEnNCMhIzckIjBDJGZ1J1I8SiMhIzY3JCQiMCZ6MT0jR2w0IyEjNyQiMDhZSDEwQ0kjISM2NyQ3JCQiME0ucyF6YSc0IyEjNyQiMEMkZnUnUjxKIyEjNjckJCIwKilbNU1hbDQjISM3JCIwOmc6Jj13OUIhIzY3JDckJCIvWy1AVWQnNCMhIzYkIi87R0QtPUNCISM1NyQkIjAqKVs1TWFsNCMhIzckIjA6ZzomPXc5QiEjNjckNyQkIi9bLUBVZCc0IyEjNiQiLztHRC09Q0IhIzU3JCQiMGMlWyJbIWUnNCMhIzckIjBSMVVlPXJLIyEjNjckNyQkIjAlKkdaYittNCMhIzckIjAnKnBmeD9tTCMhIzY3JCQiMGMlWyJbIWUnNCMhIzckIjBSMVVlPXJLIyEjNjckNyQkIjAlKkdaYittNCMhIzckIjAnKnBmeD9tTCMhIzY3JCQiMGRtMmsxbTQjISM3JCIwdEFrRHYlUkIhIzY3JDckJCIwKj5tMXBpJzQjISM3JCIwS2VtS2ghXEIhIzY3JCQiMGRtMmsxbTQjISM3JCIwdEFrRHYlUkIhIzY3JDckJCIwKj5tMXBpJzQjISM3JCIwS2VtS2ghXEIhIzY3JCQiMC4uIz1Haic0IyEjNyQiMHdGLyg9JD1OIyEjNjckNyQkIjBRVHJGYG00IyEjNyQiMG9ZdCg9XWhCISM2NyQkIjAuLiM9R2onNCMhIzckIjB3Ri8oPSQ9TiMhIzY3JDckJCIwUVRyRmBtNCMhIzckIjBvWXQoPV1oQiEjNjckJCIwXiF6OCFmbTQjISM3JCIwUUtpVSk9a0IhIzY3JDckJCIwI1I7bSd6bTQjISM3JCIwL04hR0MlUlAjISM2NyQkIjBeIXo4IWZtNCMhIzckIjBRS2lVKT1rQiEjNjckNyQkIjAjUjttJ3ptNCMhIzckIjAvTiFHQyVSUCMhIzY3JCQiMGlEdkEmbyc0IyEjNyQiL3YlUSNcYXdCISM1NyQ3JCQiL0xsc2dxJzQjISM2JCIvTXN5SFEnUSMhIzU3JCQiMGlEdkEmbyc0IyEjNyQiL3YlUSNcYXdCISM1NyQ3JCQiMEpgRTIxbjQjISM3JCIvTXN5SFEnUSMhIzU3JCQiMExtIWU5cic0IyEjNyQiMEt3dk8sKilRIyEjNjckNyQkIjAkelopXEtuNCMhIzckIjB3NiVITiMpKVIjISM2NyQkIjBMbSFlOXInNCMhIzckIjBLd3ZPLCopUSMhIzY3JDckJCIwJXpaKVxLbjQjISM3JCIwdzYlSE4jKSlSIyEjNjckJCIwZiczM3h0JzQjISM3JCIwKFslKVt4RCxDISM2NyQ3JCQiMCczNlYqZW40IyEjNyQiMDcrLDNrN1QjISM2NyQkIjBmJzMzeHQnNCMhIzckIjAoWyUpW3hELEMhIzY3JDckJCIwJzM2ViplbjQjISM3JCIwNyssM2s3VCMhIzY3JCQiMFgiKmYoUncnNCMhIzckIjBLbkYyOU9UIyEjNjckNyQkIi9tI1xTJnknNCMhIzYkIjBbKXlJWXFCQyEjNjckJCIwWCIqZihSdyc0IyEjNyQiMEtuRjI5T1QjISM2NyQ3JCQiL20jXFMmeSc0IyEjNiQiMFspeUlZcUJDISM2NyQkIjApUSY0RSF6JzQjISM3JCIwXyYqPk1xZlUjISM2NyQ3JCQiMEp6aik9Im80IyEjNyQiMCVvWiI9WGhWIyEjNjckJCIwKVEmNEUheic0IyEjNyQiMF8mKj5NcWZVIyEjNjckNyQkIjBKemopPSJvNCMhIzckIjAlb1oiPVhoViMhIzY3JCQiMHddXmM7bzQjISM3JCIwT1wmXGxLUUMhIzY3JDckJCIwdWJfUVFvNCMhIzckIi9fO0tkZVtDISM1NyQkIjB3XV5jO280IyEjNyQiME9cJlxsS1FDISM2NyQ3JCQiMHViX1FRbzQjISM3JCIvXztLZGVbQyEjNTckJCIwJls6JylHJW80IyEjNyQiMHA2S3Ejb11DISM2NyQ3JCQiLztjLlwnbzQjISM2JCIwY2BHR0U1WSMhIzY3JCQiMCZbOicpRyVvNCMhIzckIjBwNktxI29dQyEjNjckNyQkIi87Yy5cJ280IyEjNiQiMGNgR0dFNVkjISM2NyQkIjBKUm1BcG80IyEjNyQiMDw2V3pRSVkjISM2NyQ3JCQiMEEmXFI5Km80IyEjNyQiMCM+YUxvWXRDISM2NyQkIjBKUm1BcG80IyEjNyQiMDw2V3pRSVkjISM2NyQ3JCQiMEEmXFI5Km80IyEjNyQiMCM+YUxvWXRDISM2NyQkIjBSQ1JlJipvNCMhIzckIjBGUzwkW1J2QyEjNjckNyQkIjBbVVAqeiJwNCMhIzckIjBHSVVRMmZbIyEjNjckJCIwUkNSZSYqbzQjISM3JCIwRlM8JFtSdkMhIzY3JDckJCIwW1VQKnoicDQjISM3JCIwR0lVUTJmWyMhIzY3JCQiMCVcTWY+I3A0IyEjNyQiMCkpPTQiM3YoWyMhIzY3JDckJCIwcD5sY1dwNCMhIzckIjBrPVwkek0pXCMhIzY3JCQiMCVcTWY+I3A0IyEjNyQiMCkpPTQiM3YoWyMhIzY3JDckJCIwcD5sY1dwNCMhIzckIjBrPVwkek0pXCMhIzY3JCQiMFYzRk5bcDQjISM3JCIwSmtEdDEsXSMhIzY3JDckJCIwOVR3OnJwNCMhIzckIi4yY1speTVEISIqNyQkIjBWM0ZOW3A0IyEjNyQiMEprRHQxLF0jISM2NyQ3JCQiMDlUdzpycDQjISM3JCIuMmNbKXk1RCEiKjckJCIwKCk9VXd1cDQjISM3JCIwVUFnZmlDXiMhIzY3JDckJCIwci90dygqcDQjISM3JCIwTyZITyFIS18jISM2NyQkIjAoKT1Vd3VwNCMhIzckIjBVQWdmaUNeIyEjNjckNyQkIjByL3R3KCpwNCMhIzckIjBPJkhPIUhLXyMhIzY3JCQiL0goUT4scTQjISM2JCIwKFJJLCU9W18jISM2NyQ3JCQiME5DVlJDcTQjISM3JCIwcyQpcGVwY2AjISM2NyQkIi9IKFE+LHE0IyEjNiQiMChSSSwlPVtfIyEjNjckNyQkIjBOQ1ZSQ3E0IyEjNyQiMHMkKXBlcGNgIyEjNjckJCIvOFxTdy0oNCMhIzYkIjA4IT5fVDxQRCEjNjckNyQkIjBeYDUvXnE0IyEjNyQiMDRzdzg1IltEISM2NyQkIi84XFN3LSg0IyEjNiQiMDghPl9UPFBEISM2NyQ3JCQiMF5gNS9ecTQjISM3JCIwNHN3ODUiW0QhIzY3JCQiMHVnaTVhcTQjISM3JCIwT3A7JSlIJlxEISM2NyQ3JCQiMGVvXHF4cTQjISM3JCIwWGckKW9dMGMjISM2NyQkIjB1Z2k1YXE0IyEjNyQiME9wOyUpSCZcRCEjNjckNyQkIjBkb1xxeHE0IyEjNyQiMFhnJClvXTBjIyEjNjckJCIuKSkqKWUhMyg0IyEjNSQiMD51blomKT1jIyEjNjckNyQkIjBKOHVRL3I0IyEjNyQiMCIpWyFSNypIZCMhIzY3JCQiLikpKillITMoNCMhIzUkIjA+dW5aJik9YyMhIzY3JDckJCIwSjh1US9yNCMhIzckIjAiKVshUjcqSGQjISM2NyQkIjBlWCkqMzJyNCMhIzckIjAsWFAwVFVkIyEjNjckNyQkIjAkXDsoM0pyNCMhIzckIjA8UCgqeUphZSMhIzY3JCQiMGVYKSozMnI0IyEjNyQiMCxYUDBUVWQjISM2NyQ3JCQiMCRcOygzSnI0IyEjNyQiMDxQKCp5SmFlIyEjNjckJCIwI0dcMk84KDQjISM3JCIwaiEpb2QnZidlIyEjNjckNyQkIjBwS2wheTooNCMhIzckIjBgRC9Nc3lmIyEjNjckJCIwI0dcMk84KDQjISM3JCIwaiEpb2QnZidlIyEjNjckNyQkIjBwS2wheTooNCMhIzckIjBgRC9Nc3lmIyEjNjckJCIwLCZbVyw7KDQjISM3JCIwZCgpei5fKilmIyEjNjckNyQkIi83P1ZYPSg0IyEjNiQiMCpRNiIqR0o1RSEjNjckJCIwLCZbVyw7KDQjISM3JCIwZCgpei5fKilmIyEjNjckNyQkIi83P1ZYPSg0IyEjNiQiMCpRNiIqR0o1RSEjNjckJCIwankjKXAnPSg0IyEjNyQiMGNAX1cyOGgjISM2NyQ3JCQiMGVTcUg2czQjISM3JCIwRC09V2BGaSMhIzY3JCQiMGp5IylwJz0oNCMhIzckIjBjQF9XMjhoIyEjNjckNyQkIjBlU3FINnM0IyEjNyQiMEQtPVdgRmkjISM2NyQkIjBKbypvS0AoNCMhIzckIjA4eiMpemlPaSMhIzY3JDckJCIwcl0xMlFzNCMhIzckIjBoIVwjKlI+TkUhIzY3JCQiMEpvKm9LQCg0IyEjNyQiMDh6Iyl6aU9pIyEjNjckNyQkIjByXTEyUXM0IyEjNyQiMGghXCMqUj5ORSEjNjckJCIwdkoqZSlSczQjISM3JCIwTU8mKjM9Z2ojISM2NyQ3JCQiMD5XOSdbRSg0IyEjNyQiMCgqeUphTXdrIyEjNjckJCIwdkoqZSlSczQjISM3JCIwTU8mKjM9Z2ojISM2NyQ3JCQiMD5XOSdbRSg0IyEjNyQiMCgqeUphTXdrIyEjNjckJCIwOGtlWW1zNCMhIzckIjBXJFFFTFBbRSEjNjckNyQkIjBZTjNuIkgoNCMhIzckIjBMblE0dittIyEjNjckJCIwOGtlWW1zNCMhIzckIjBXJFFFTFBbRSEjNjckNyQkIjBZTjNuIkgoNCMhIzckIjBMblE0dittIyEjNjckJCIvTHchNCRIKDQjISM2JCIwJTRpMCZHMm0jISM2NyQ3JCQiL3lnKVw9dDQjISM2JCIwcGJYazpEbiMhIzY3JCQiL0x3ITQkSCg0IyEjNiQiMCU0aTAmRzJtIyEjNjckNyQkIi95ZylcPXQ0IyEjNiQiMHBiWGs6RG4jISM2NyQkIjAvLlF0PnQ0IyEjNyQiMF8icEVPM3RFISM2NyQ3JCQiMHBET01YdDQjISM3JCIwMFdfPmNcbyMhIzY3JCQiMC8uUXQ+dDQjISM3JCIwXyJwRU8zdEUhIzY3JDckJCIwcERPTVh0NCMhIzckIjAwV18+Y1xvIyEjNjckJCIwQyZwJFJZdDQjISM3JCIwYkRQcFFhbyMhIzY3JDckJCIwJzQ7MkFQKDQjISM3JCIwVEtmdSdSKHAjISM2NyQkIjBDJnAkUll0NCMhIzckIjBiRFBwUWFvIyEjNjckNyQkIjAnNDsyQVAoNCMhIzckIjBUS2Z1J1IocCMhIzY3JCQiMF9nOzJ0dDQjISM3JCIwODRHcSR6KHAjISM2NyQ3JCQiMGtreTMqUig0IyEjNyQiMHg/bUhQKTRGISM2NyQkIjBfZzsydHQ0IyEjNyQiMDg0R3EkeihwIyEjNjckNyQkIjBra3kzKlIoNCMhIzckIjB4P21IUCk0RiEjNjckJCIwYGBrdypSKDQjISM3JCIwT056bFssciMhIzY3JDckJCIwaHpxKWZVKDQjISM3JCIwODR0JXlGQUYhIzY3JCQiMGBga3cqUig0IyEjNyQiME9OemxbLHIjISM2NyQ3JCQiMGh6cSlmVSg0IyEjNyQiMDg0dCV5RkFGISM2NyQkIjBhSiR6a1UoNCMhIzckIjAoSDJiTl1BRiEjNjckNyQkIjBbKHkvSFgoNCMhIzckIjBcKCp6Uj1adCMhIzY3JCQiMGFKJHprVSg0IyEjNyQiMChIMmJOXUFGISM2NyQ3JCQiMFsoeS9IWCg0IyEjNyQiMFwoKnpSPVp0IyEjNjckJCIwIyk9LkBgdTQjISM3JCIwL1dUUmVbdCMhIzY3JDckJCIwWnQnUil6dTQjISM3JCIwJmVvWyplcnUjISM2NyQkIjAjKT0uQGB1NCMhIzckIjAvV1RSZVt0IyEjNjckNyQkIjBadCdSKXp1NCMhIzckIjAmZW9bKmVydSMhIzY3JCQiL142ZSp6dTQjISM2JCIwKHlKekpAWkYhIzY3JDckJCIwKCkpM3JvXCg0IyEjNyQiLzIjcHc+XXYjISM1NyQkIi9eNmUqenU0IyEjNiQiMCh5SnpKQFpGISM2NyQ3JCQiMCgpKTNyb1woNCMhIzckIjApUig0dmFVdSQhIzc3JCQiMGR1dHE3LjUjISM3JCIwKVIoNHZhVXUkISM3NyQ3JCQiMDgsNHN3ODUjISM3JCIwS2BUOUk7dCQhIzc3JCQiMGR1dHE3LjUjISM3JCIwKVIoNHZhVXUkISM3NyQ3JCQiMCgpKTNyb1woNCMhIzckIi8yI3B3Pl12IyEjNTckJCIwUT8zdDF2NCMhIzckIjA+QVkpeWNmRiEjNjckNyQkIjBgJnopejF2NCMhIzckIjBAdSQqXCpmZkYhIzY3JCQiMFE/M3QxdjQjISM3JCIwPkFZKXljZkYhIzY3JDckJCIwYCZ6KXoxdjQjISM3JCIwQHUkKlwqZmZGISM2NyQkIjB5ZT5gTHY0IyEjNyQiL3J2KVxBPngjISM1NyQ3JCQiMCcqM1x5THY0IyEjNyQiMGRpKzBTP3gjISM2NyQkIjB5ZT5gTHY0IyEjNyQiL3J2KVxBPngjISM1NyQ3JCQiMCcqM1x5THY0IyEjNyQiMGRpKzBTP3gjISM2NyQkIi9BQV4uYyg0IyEjNiQiMCx2WjB4VXkjISM2NyQ3JCQiMChRXyp5Z3Y0IyEjNyQiMCQ0disxWyV5IyEjNjckJCIvQUFeLmMoNCMhIzYkIjAsdloweFV5IyEjNjckNyQkIjAoUV8qeWd2NCMhIzckIjAkNHYrMVsleSMhIzY3JCQiMDNucz0oZSg0IyEjNyQiLiUpcGJKbXojISIqNyQ3JCQiMFwlSDZ5ZSg0IyEjNyQiMEhSOTpAcHojISM2NyQkIjAzbnM9KGUoNCMhIzckIi4lKXBiSm16IyEiKjckNyQkIjBcJUg2eWUoNCMhIzckIjBIUjk6QHB6IyEjNjckJCIwdSdRVFNoKDQjISM3JCIwMlA3KycpKjNHISM2NyQ3JCQiMChbZ15baCg0IyEjNyQiMGxGQHFoJDRHISM2NyQkIjB1J1FUU2goNCMhIzckIjAyUDcrJykqM0chIzY3JDckJCIwKFtnXltoKDQjISM3JCIwbEZAcWgkNEchIzY3JCQiME5cTyI0ayg0IyEjNyQiMGs6dFFTOCNHISM2NyQ3JCQiMFR6LiI+ayg0IyEjNyQiMCw7R0QtPSNHISM2NyQkIjBOXE8iNGsoNCMhIzckIjBrOnRRUzgjRyEjNjckNyQkIjBUei4iPmsoNCMhIzckIjAsO0dELT0jRyEjNjckJCIwKFFvLXltKDQjISM3JCIwKGVoPlpwTEchIzY3JDckJCIvMkknKSpvdzQjISM2JCIwUC9OIUdDTUchIzY3JCQiMChRby15bSg0IyEjNyQiMChlaD5acExHISM2NyQ3JCQiLzJJJykqb3c0IyEjNiQiMFAvTiFHQ01HISM2NyQkIjBEKFszWnAoNCMhIzckIi93OSkqKltnJUchIzU3JDckJCIwJFxWemdwKDQjISM3JCIwdSM+YUxvWUchIzY3JCQiMEQoWzNacCg0IyEjNyQiL3c5KSoqW2clRyEjNTckNyQkIjAkXFZ6Z3AoNCMhIzckIjB1Iz5hTG9ZRyEjNjckJCIwJkdSSztzKDQjISM3JCIwVk4nPUtTZUchIzY3JDckJCIwanU1PkJ4NCMhIzckIi82KVshUjdmRyEjNTckJCIwJkdSSztzKDQjISM3JCIwVk4nPUtTZUchIzY3JDckJCIwanU1PkJ4NCMhIzckIi82KVshUjdmRyEjNTckJCIveDl0Jlt4NCMhIzYkIjAmcDQmUWQyKEchIzY3JDckJCIwMHIpPi52KDQjISM3JCIwWXBiWGs6KEchIzY3JCQiL3g5dCZbeDQjISM2JCIwJnA0JlFkMihHISM2NyQ3JCQiMDByKT4udig0IyEjNyQiMFlwYlhrOihHISM2NyQkIjAqMyM+YHZ4NCMhIzckIjBfJHkkXDZKKUchIzY3JDckJCIvcDtudXgoNCMhIzYkIjAjeUQxXSslKUchIzY3JCQiMCozIz5gdng0IyEjNyQiMF8keSRcNkopRyEjNjckNyQkIi9wO251eCg0IyEjNiQiMCN5RDFdKyUpRyEjNjckJCIwaGJ2XS15NCMhIzckIjBWLyVbYlkmKkchIzY3JDckJCIwSj88ai95NCMhIzckIjA9WXBiWGsqRyEjNjckJCIwaGJ2XS15NCMhIzckIjBWLyVbYlkmKkchIzY3JDckJCIwSj88ai95NCMhIzckIjA9WXBiWGsqRyEjNjckJCIwbXcrXUh5NCMhIzckIjA6ISkpWyY+eSFIISM2NyQ3JCQiMF5TTSI9JHk0IyEjNyQiMGFNdzUnKSkzSCEjNjckJCIwbXcrXUh5NCMhIzckIjA6ISkpWyY+eSFIISM2NyQ3JCQiMF5TTSI9JHk0IyEjNyQiMGFNdzUnKSkzSCEjNjckJCIwQChmNWwmeTQjISM3JCIwSlQ7XHQsI0ghIzY3JDckJCIwVldOLGZ5NCMhIzckIi9IS2VtS0BIISM1NyQkIjBAKGY1bCZ5NCMhIzckIjBKVDtcdCwjSCEjNjckNyQkIjBWV04sZnk0IyEjNyQiL0hLZW1LQEghIzU3JCQiL2gzUk4peTQjISM2JCIwKXl5d3RfS0ghIzY3JDckJCIwb05AQicpeTQjISM3JCIwRTYhNHN3TEghIzY3JCQiL2gzUk4peTQjISM2JCIwKXl5d3RfS0ghIzY3JDckJCIwb05AQicpeTQjISM3JCIwRTYhNHN3TEghIzY3JCQiMHJuS2U1ejQjISM3JCIwXDs7QCIpWyVIISM2NyQ3JCQiMENsbVk4ejQjISM3JCIwaSpwZng/WUghIzY3JCQiMHJuS2U1ejQjISM3JCIwXDs7QCIpWyVIISM2NyQ3JCQiMENsbVk4ejQjISM3JCIwaSpwZng/WUghIzY3JCQiLzlUWHckejQjISM2JCIwZF0pKSlcQmRIISM2NyQ3JCQiMDkmcD4yJXo0IyEjNyQiMCl6UTUkWydlSCEjNjckJCIvOVRYdyR6NCMhIzYkIjBkXSkpKVxCZEghIzY3JDckJCIwOSZwPjIlejQjISM3JCIwKXpRNSRbJ2VIISM2NyQkIjAtWmNza3o0IyEjNyQiMHV0ITMoKWVwSCEjNjckNyQkIjBGQTcqeid6NCMhIzckIjBNdzUnKSkzckghIzY3JCQiMC1aY3NrejQjISM3JCIwdXQhMygpZXBIISM2NyQ3JCQiMEdBNyp6J3o0IyEjNyQiME13NScpKTNySCEjNjckJCIwelM7Iz0qejQjISM3JCIwPHBuUFU+KUghIzY3JDckJCIwbWAmeV8qejQjISM3JCIvWnc2JUhOKUghIzU3JCQiMHpTOyM9Kno0IyEjNyQiMDxwblBVPilIISM2NyQ3JCQiMG1gJnlfKno0IyEjNyQiL1p3NiVITilIISM1NyQkIjA3KVJOKj0hKTQjISM3JCIwaTEmKSlmSCUqSCEjNjckNyQkIjBvZVhlQSEpNCMhIzckIjAxYEMnKnBmKkghIzY3JCQiMDcpUk4qPSEpNCMhIzckIjBpMSYpKWZIJSpIISM2NyQ3JCQiMG9lWGVBISk0IyEjNyQiMDFgQycqcGYqSCEjNjckJCIwKW9VbmcvKTQjISM3JCIwZmQ7YVxtKyQhIzY3JDckJCIwYShvMypcISk0IyEjNyQiMFVUSl41JTNJISM2NyQkIjApb1VuZy8pNCMhIzckIjBmZDthXG0rJCEjNjckNyQkIjBhKG8zKlwhKTQjISM3JCIwVVRKXjUlM0khIzY3JCQiMGwjKVtAdCEpNCMhIzckIjBpVWAvLiE+SSEjNjckNyQkIjBjJioqW3MyKTQjISM3JCIweUhRMV4zLSQhIzY3JCQiMGwjKVtAdCEpNCMhIzckIjBpVWAvLiE+SSEjNjckNyQkIjBjJioqW3MyKTQjISM3JCIweUhRMV4zLSQhIzY3JCQiMERML1ErIik0IyEjNyQiMFcyNVxjOC4kISM2NyQ3JCQiMCpcIXlnLyIpNCMhIzckIjA5PVhoIkhMSSEjNjckJCIwREwvUSsiKTQjISM3JCIwVzI1XGM4LiQhIzY3JDckJCIwKlwheWcvIik0IyEjNyQiMDk9WGgiSExJISM2NyQkIjBCZEhjRiIpNCMhIzckIjAkekMjKSk0UC8kISM2NyQ3JCQiMDxvUCk+OCk0IyEjNyQiL2w/bEB0WEkhIzU3JCQiMEJkSGNGIik0IyEjNyQiMCR6QyMpKTRQLyQhIzY3JDckJCIwPG9QKT44KTQjISM3JCIvbD9sQHRYSSEjNTckJCIwQWBBd2EiKTQjISM3JCIwIik0KD5LMWNJISM2NyQ3JCQiMEYjKW9QZiIpNCMhIzckIjAnWyplcnMiZUkhIzY3JCQiMEFgQXdhIik0IyEjNyQiMCIpNCg+SzFjSSEjNjckNyQkIjBGIylvUGYiKTQjISM3JCIwJ1sqZXJzImVJISM2NyQkIjBfPCV6Pj0pNCMhIzckIjAieSgpKlw7JW9JISM2NyQ3JCQiMCQpXCMpeSc9KTQjISM3JCIwQSRlbUtocUkhIzY3JCQiMF88JXo+PSk0IyEjNyQiMCJ5KCkqXDslb0khIzY3JDckJCIwJClcIyl5Jz0pNCMhIzckIjBBJGVtS2hxSSEjNjckJCIwIypHTEA0Iyk0IyEjNyQiMC9aanNwMjMkISM2NyQ3JCQiMDIjKnBAOSMpNCMhIzckIjBlcnMiUTAkMyQhIzY3JCQiMCMqR0xANCMpNCMhIzckIjAvWmpzcDIzJCEjNjckNyQkIjAyIypwQDkjKTQjISM3JCIwZXJzIlEwJDMkISM2NyQkIjAnKVFVWU8jKTQjISM3JCIwRDYkKSpHNyQ0JCEjNjckNyQkIjBld0dtVCMpNCMhIzckIjAlKmZ6TyVcJjQkISM2NyQkIjAnKVFVWU8jKTQjISM3JCIwRDYkKSpHNyQ0JCEjNjckNyQkIjBld0dtVCMpNCMhIzckIjAlKmZ6TyVcJjQkISM2NyQkIjBmMz50aiMpNCMhIzckIjAtT2wsd2E1JCEjNjckNyQkIjAzb2g3cCMpNCMhIzckIi8kWyc9XCR6NSQhIzU3JCQiMGYzPnRqIyk0IyEjNyQiMC1PbCx3YTUkISM2NyQ3JCQiMDNvaDdwIyk0IyEjNyQiLyRbJz1cJHo1JCEjNTckJCIvJDNtLCJIKTQjISM2JCIwKlw6ITNIeTYkISM2NyQ3JCQiMD46bWcnSCk0IyEjNyQiMG1PJHBhUD9KISM2NyQkIi8kM20sIkgpNCMhIzYkIjAqXDohM0h5NiQhIzY3JDckJCIwPjptZydIKTQjISM3JCIwbU8kcGFQP0ohIzY3JCQiMGpLIj4kPSQpNCMhIzckIi8taSczIz1JSiEjNTckNyQkIjBmc181QyQpNCMhIzckIjAtRCstO0c4JCEjNjckJCIwaksiPiQ9JCk0IyEjNyQiLy1pJzMjPUlKISM1NyQ3JCQiMGZzXzVDJCk0IyEjNyQiMC1EKy07RzgkISM2NyQkIjAjXE9QY00pNCMhIzckIjBjPUYvTkQ5JCEjNjckNyQkIjAqRyw/O04pNCMhIzckIjBSODJkY185JCEjNjckJCIwI1xPUGNNKTQjISM3JCIwYz1GL05EOSQhIzY3JDckJCIwKkcsPztOKTQjISM3JCIwUjgyZGNfOSQhIzY3JCQiMCJwUnRIUCk0IyEjNyQiMDJWPCV6KVs6JCEjNjckNyQkIjBFV0s6eiQpNCMhIzckIjB2LDk3KHBkSiEjNjckJCIwInBSdEhQKTQjISM3JCIwMlY8JXopWzokISM2NyQ3JCQiMEVXSzp6JCk0IyEjNyQiMHYsOTcocGRKISM2NyQkIjBBJVtFLlMpNCMhIzckIjBcITMneVNzOyQhIzY3JDckJCIwJCk+T3ExJSk0IyEjNyQiMDYhNHN3OHFKISM2NyQkIjBBJVtFLlMpNCMhIzckIjBcITMneVNzOyQhIzY3JDckJCIwJCk+T3ExJSk0IyEjNyQiMDYhNHN3OHFKISM2NyQkIjAiPkwncEYlKTQjISM3JCIwZXdtZCRmekohIzY3JDckJCIweU82Rk0lKTQjISM3JCIwWnlGQXlEPSQhIzY3JCQiMCI+TCdwRiUpNCMhIzckIjBld21kJGZ6SiEjNjckNyQkIjB5TzZGTSUpNCMhIzckIjBaeUZBeUQ9JCEjNjckJCIwKnAkSDNiJSk0IyEjNyQiMCM0YThqJT4+JCEjNjckNyQkIi9CemI9WSk0IyEjNiQiMCRvWXQoPV0+JCEjNjckJCIwKnAkSDNiJSk0IyEjNyQiMCM0YThqJT4+JCEjNjckNyQkIi9CemI9WSk0IyEjNiQiMCRvWXQoPV0+JCEjNjckJCIwcyJIKFsjWyk0IyEjNyQiMCU9XCQqKilIL0shIzY3JDckJCIvcyMqZSUqWyk0IyEjNiQiMD5iVEtmdT8kISM2NyQkIjBzIkgoWyNbKTQjISM3JCIwJT1cJCoqKUgvSyEjNjckNyQkIi9zIyplJSpbKTQjISM2JCIwPmJUS2Z1PyQhIzY3JCQiMFhUeCEqNCYpNCMhIzckIjAlXCQ9aV5tQCQhIzY3JDckJCIwTV55MjwmKTQjISM3JCIwYlZbKCkqKik+SyEjNjckJCIwWFR4ISo0Jik0IyEjNyQiMCVcJD1pXm1AJCEjNjckNyQkIjBNXnkyPCYpNCMhIzckIjBiVlsoKSoqKT5LISM2NyQkIjBuK1lNUCYpNCMhIzckIjAjPWMoPi8hSEshIzY3JDckJCIwV29VclcmKTQjISM3JCIwIj5gRC9NS0shIzY3JCQiMG4rWU1QJik0IyEjNyQiMCM9Yyg+LyFISyEjNjckNyQkIjBXb1VyVyYpNCMhIzckIjAiPmBEL01LSyEjNjckJCIwRVImKnprJik0IyEjNyQiMC89YHJjOEMkISM2NyQ3JCQiMCpIISlvQmQpNCMhIzckIjBGP2koNHlXSyEjNjckJCIwRVImKnprJik0IyEjNyQiMC89YHJjOEMkISM2NyQ3JCQiMCpIISlvQmQpNCMhIzckIjBGP2koNHlXSyEjNjckJCIwJ0dFcUFmKTQjISM3JCIwVWdDPTRQRCQhIzY3JDckJCIwWyMpKVIrZyk0IyEjNyQiMGozcF9Ac0QkISM2NyQkIjAnR0VxQWYpNCMhIzckIjBVZ0M9NFBEJCEjNjckNyQkIjBbIykpUitnKTQjISM3JCIwajNwX0BzRCQhIzY3JCQiMGN5IWYoPicpNCMhIzckIjBOImYiZmhnRSQhIzY3JDckJCIwOiNvR3hpKTQjISM3JCIwKnBmeD9tcEshIzY3JCQiMGN5IWYoPicpNCMhIzckIjBOImYiZmhnRSQhIzY3JDckJCIwOiNvR3hpKTQjISM3JCIwKnBmeD9tcEshIzY3JCQiMHI6TEVaJyk0IyEjNyQiMDd1NyZSVHlLISM2NyQ3JCQiMFtlT1ZiJyk0IyEjNyQiME4mR0dFNSNHJCEjNjckJCIwcjpMRVonKTQjISM3JCIwN3U3JlJUeUshIzY3JDckJCIwW2VPVmInKTQjISM3JCIwTiZHR0U1I0ckISM2NyQkIjApUkImeXUnKTQjISM3JCIwRWpVRG0ySCQhIzY3JDckJCIwOzhyOiRvKTQjISM3JCIwcnQqeUphJUgkISM2NyQkIjApUkImeXUnKTQjISM3JCIwRWpVRG0ySCQhIzY3JDckJCIwOzhyOiRvKTQjISM3JCIwcnQqeUphJUgkISM2NyQkIi94UEJCcSk0IyEjNiQiMEdFX109SkkkISM2NyQ3JCQiME54biozcik0IyEjNyQiMDJpJ0hQKXBJJCEjNjckJCIveFBCQnEpNCMhIzYkIjBHRV9dPUpJJCEjNjckNyQkIjBOeG4qM3IpNCMhIzckIjAyaSdIUClwSSQhIzY3JCQiMFYnPnopSCgpNCMhIzckIjBBOiYqcHFhSiQhIzY3JDckJCIwXi5YbFEoKTQjISM3JCIwVl0uR0MlPkwhIzY3JCQiMFYnPnopSCgpNCMhIzckIjBBOiYqcHFhSiQhIzY3JDckJCIwXi5YbFEoKTQjISM3JCIwVl0uR0MlPkwhIzY3JCQiMEdlM1hkKCk0IyEjNyQiMChSK1ZHI3lLJCEjNjckNyQkIjBbOCFHa3cpNCMhIzckIjB6UTUkWyc9TCQhIzY3JCQiMEdlM1hkKCk0IyEjNyQiMChSK1ZHI3lLJCEjNjckNyQkIjBbOCFHa3cpNCMhIzckIjB6UTUkWyc9TCQhIzY3JCQiMCVvJClRXXkpNCMhIzckIjAqUjxNXDxTTCEjNjckNyQkIjBiJzQ+VXopNCMhIzckIjA6RjxRMFZNJCEjNjckJCIwJW8kKVFdeSk0IyEjNyQiMCpSPE1cPFNMISM2NyQ3JCQiMGInND5Veik0IyEjNyQiMDpGPFEwVk0kISM2NyQkIjA7JylbazcpKTQjISM3JCIwKDRTbnBfX0whIzY3JDckJCIwQy8jRz8jKSk0IyEjNyQiMF46QyRmdWNMISM2NyQkIjA7JylbazcpKTQjISM3JCIwKDRTbnBfX0whIzY3JDckJCIwQy8jRz8jKSk0IyEjNyQiMF46QyRmdWNMISM2NyQkIjBLKXptLSUpKTQjISM3JCIwYmsoXCp5W08kISM2NyQ3JCQiMCNlYmApXCkpNCMhIzckIjAoUTUkWyc9cEwhIzY3JCQiMEspem0tJSkpNCMhIzckIjBiayhcKnlbTyQhIzY3JDckJCIwI2ViYClcKSk0IyEjNyQiMChRNSRbJz1wTCEjNjckJCIwKjRZMHonKSk0IyEjNyQiMFI9JXkzQnhMISM2NyQ3JCQiMExVZ3B4KSk0IyEjNyQiMEIjekxxaSJRJCEjNjckJCIwKjRZMHonKSk0IyEjNyQiMFI9JXkzQnhMISM2NyQ3JCQiMExVZ3B4KSk0IyEjNyQiMEIjekxxaSJRJCEjNjckJCIwQ3IzYyYqKSk0IyEjNyQiMCY+UGBGZSpRJCEjNjckNyQkIjBXW2hiMCopNCMhIzckIjBmIVslZW5TUiQhIzY3JCQiMENyM2MmKikpNCMhIzckIjAmPlBgRmUqUSQhIzY3JDckJCIwV1toYjAqKTQjISM3JCIwZiFbJWVuU1IkISM2NyQkIjA5O05CQiopNCMhIzckIjBZaklkTT5TJCEjNjckNyQkIjA0MUhWTCopNCMhIzckIjAmKm9eODNsUyQhIzY3JCQiMDk7TkJCKik0IyEjNyQiMFlqSWRNPlMkISM2NyQ3JCQiMDQxSFZMKik0IyEjNyQiMCYqb144M2xTJCEjNjckJCIwOkFDIzQmKik0IyEjNyQiMFo5MU0nRzlNISM2NyQ3JCQiME8hekU4JyopNCMhIzckIjBKZGVvWyo9TSEjNjckJCIwOkFDIzQmKik0IyEjNyQiMFo5MU0nRzlNISM2NyQ3JCQiME8hekU4JyopNCMhIzckIjBKZGVvWyo9TSEjNjckJCIwNlZzaXkqKTQjISM3JCIwKFw4ZCFRbVUkISM2NyQ3JCQiMFlzcEIqKSopNCMhIzckIjBuWGxCKlFKTSEjNjckJCIwNlZzaXkqKTQjISM3JCIwKFw4ZCFRbVUkISM2NyQ3JCQiMFlzcEIqKSopNCMhIzckIjBuWGxCKlFKTSEjNjckJCIwPkwnXGorKjQjISM3JCIwJjRLPCgqKSpRTSEjNjckNyQkIjBMNl47PCEqNCMhIzckIjAvTXN5SFFXJCEjNjckJCIwPkwnXGorKjQjISM3JCIwJjRLPCgqKSpRTSEjNjckNyQkIjBMNl47PCEqNCMhIzckIjAvTXN5SFFXJCEjNjckJCIwWl56M00hKjQjISM3JCIwJVJWRThNXk0hIzY3JDckJCIwIz5jNF4vKjQjISM3JCIvQyN6THFpWCQhIzU3JCQiMFpeejNNISo0IyEjNyQiMCVSVkU4TV5NISM2NyQ3JCQiMCM+YzReLyo0IyEjNyQiL0MjekxxaVgkISM1NyQkIjB5PUklPTEqNCMhIzckIjAlPiU9KUdwak0hIzY3JDckJCIwQS0xMnQhKjQjISM3JCIwdzUnKSkzcm9NISM2NyQkIjB5PUklPTEqNCMhIzckIjAlPiU9KUdwak0hIzY3JDckJCIwQS0xMnQhKjQjISM3JCIwdzUnKSkzcm9NISM2NyQkIi9fRzknKjMqNCMhIzYkIjBIM2BRV2daJCEjNjckNyQkIjBLNSRcNTUqNCMhIzckIjA3KkhSOToiWyQhIzY3JCQiL19HOScqMyo0IyEjNiQiMEgzYFFXZ1okISM2NyQ3JCQiMEs1JFw1NSo0IyEjNyQiMDcqSFI5OiJbJCEjNjckJCIwR0tHUzwiKjQjISM3JCIwL2xMJGVSKVskISM2NyQ3JCQiMCZ5OVghSCIqNCMhIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwR0tHUzwiKjQjISM3JCIwL2xMJGVSKVskISM2NyQ3JCQiMCZ5OVghSCIqNCMhIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwS2B0P1giKjQjISM3JCIwNC0tQloyXSQhIzY3JDckJCIwUFd0MGQiKjQjISM3JCIwJWVuU0QuMU4hIzY3JCQiMEtgdD9YIio0IyEjNyQiMDQtLUJaMl0kISM2NyQ3JCQiMFBXdDBkIio0IyEjNyQiMCVlblNELjFOISM2NyQkIjBhKFFISTwqNCMhIzckIjAnUikzZCk0OE4hIzY3JDckJCIvJWVvMyY9KjQjISM2JCIvVU8iNHQlPU4hIzU3JCQiMGEoUUhJPCo0IyEjNyQiMCdSKTNkKTQ4TiEjNjckNyQkIi8lZW8zJj0qNCMhIzYkIi9VTyI0dCU9TiEjNTckJCIwKVIjbyczPyo0IyEjNyQiME16QCcpXGFfJCEjNjckNyQkIjAxRUY4OCMqNCMhIzckIjBjXz9rODRgJCEjNjckJCIwKVIjbyczPyo0IyEjNyQiME16QCcpXGFfJCEjNjckNyQkIjAxRUY4OCMqNCMhIzckIjBjXz9rODRgJCEjNjckJCIwYmEtc0cjKjQjISM3JCIwTCE+LTYheWAkISM2NyQ3JCQiMCx4Yj5UIyo0IyEjNyQiMCM0dSM+YUxhJCEjNjckJCIwYmEtc0cjKjQjISM3JCIwTCE+LTYheWAkISM2NyQ3JCQiMCx4Yj5UIyo0IyEjNyQiMCM0dSM+YUxhJCEjNjckJCIwLGw8ZmMjKjQjISM3JCIwLEhVR18sYiQhIzY3JDckJCIwWylwdiNwIyo0IyEjNyQiMEdITXUlemJOISM2NyQkIjAsbDxmYyMqNCMhIzckIjAsSFVHXyxiJCEjNjckNyQkIjBbKXB2I3AjKjQjISM3JCIwR0hNdSV6Yk4hIzY3JCQiMFEpb3lXRyo0IyEjNyQiMCdwJW9ULkRjJCEjNjckNyQkIjBcImZydEgqNCMhIzckIjBrPFRITiNvTiEjNjckJCIwUSlveVdHKjQjISM3JCIwJ3Alb1QuRGMkISM2NyQ3JCQiMFwiZnJ0SCo0IyEjNyQiMGs8VEhOI29OISM2NyQkIjBmSTxRNyQqNCMhIzckIjBmIXkoXGFbZCQhIzY3JDckJCIwQEZfW0QkKjQjISM3JCIuMVslZW4hZSQhIio3JCQiMGZJPFE3JCo0IyEjNyQiMGYheShcYVtkJCEjNjckNyQkIjBARl9bRCQqNCMhIzckIi4xWyVlbiFlJCEiKjckJCIwakU5SVMkKjQjISM3JCIwZTlgXzBzZSQhIzY3JDckJCIwZSFIOk9OKjQjISM3JCIwTyVcJlI7SmYkISM2NyQkIjBqRTlJUyQqNCMhIzckIjBlOWBfMHNlJCEjNjckNyQkIjBlIUg6T04qNCMhIzckIjBPJVwmUjtKZiQhIzY3JCQiMGBuJlEjbyQqNCMhIzckIjBWN3BcYyYqZiQhIzY3JDckJCIwImZgaTxRKjQjISM3JCIwcyM9WXBiME8hIzY3JCQiMGBuJlEjbyQqNCMhIzckIjBWN3BcYyYqZiQhIzY3JDckJCIwImZgaTxRKjQjISM3JCIwcyM9WXBiME8hIzY3JCQiMDo1Nj4nUio0IyEjNyQiMFVEIj51IT5oJCEjNjckNyQkIjBiLmkjKjQlKjQjISM3JCIwM3JvXCgqemgkISM2NyQkIjA6NTY+J1IqNCMhIzckIjBVRCI+dSE+aCQhIzY3JDckJCIwYi5pIyo0JSo0IyEjNyQiMDNyb1woKnpoJCEjNjckJCIwQjgoZlRVKjQjISM3JCIwSlQpKkdlVWkkISM2NyQ3JCQiLyxLMSJRJSo0IyEjNiQiMFdmdi9RL2okISM2NyQkIjBCOChmVFUqNCMhIzckIjBKVCkqR2VVaSQhIzY3JDckJCIvLEsxIlElKjQjISM2JCIwV2Z2L1EvaiQhIzY3JCQiMHRCZDlfJSo0IyEjNyQiMD5UWjU0bWokISM2NyQ3JCQiMCdHQi9qWSo0IyEjNyQiL3lDKWZ5R2skISM1NyQkIjB0QmQ5XyUqNCMhIzckIjA+VFo1NG1qJCEjNjckNyQkIjAnR0IvalkqNCMhIzckIi95QylmeUdrJCEjNTckJCIwTWRyOSFbKjQjISM3JCIwZCg9cSlmKltPISM2NyQ3JCQiMGhuc14lXCo0IyEjNyQiMDtPKlsiPmBsJCEjNjckJCIwTWRyOSFbKjQjISM3JCIwZCg9cSlmKltPISM2NyQ3JCQiMGhuc14lXCo0IyEjNyQiMDtPKlsiPmBsJCEjNjckJCIwVi1gOzMmKjQjISM3JCIwVVw/ZTU4bSQhIzY3JDckJCIvUDJbRl8qNCMhIzYkIjBfQycqcGZ4bSQhIzY3JCQiMFYtYDszJio0IyEjNyQiMFVcP2U1OG0kISM2NyQ3JCQiL1AyW0ZfKjQjISM2JCIwX0MnKnBmeG0kISM2NyQkIjA2TiYqPk8mKjQjISM3JCIwPkZCQ2hPbiQhIzY3JDckJCIwMmRgKjRiKjQjISM3JCIwKUdKXS0/IW8kISM2NyQkIjA2TiYqPk8mKjQjISM3JCIwPkZCQ2hPbiQhIzY3JDckJCIwMmRgKjRiKjQjISM3JCIwKUdKXS0/IW8kISM2NyQkIi9MXV1VYyo0IyEjNiQiME1WKls9LCdvJCEjNjckNyQkIjAkZi9mI3omKjQjISM3JCIwQyw1ITNrI3AkISM2NyQkIi9MXV1VYyo0IyEjNiQiME1WKls9LCdvJCEjNjckNyQkIjAkZi9mI3omKjQjISM3JCIwQyw1ITNrI3AkISM2NyQkIjAvdG9KI2YqNCMhIzckIjA+dmhTaSQpcCQhIzY3JDckJCIwdWIqUnZnKjQjISM3JCIvJypvXjgzMFAhIzU3JCQiMC90b0ojZio0IyEjNyQiMD52aFNpJClwJCEjNjckNyQkIjB1YipSdmcqNCMhIzckIi8nKm9eODMwUCEjNTckJCIwOSwyUz8nKjQjISM3JCIwa0Z1IUhyNVAhIzY3JDckJCIwakVsJGVqKjQjISM3JCIwKHpQLT5fPFAhIzY3JCQiMDksMlM/Jyo0IyEjNyQiMGtGdSFIcjVQISM2NyQ3JCQiMGpFbCRlaio0IyEjNyQiMCd6UC0+XzxQISM2NyQkIjBVMSMqXFsnKjQjISM3JCIwVz07T2pJcyQhIzY3JDckJCIwRl8uOmsnKjQjISM3JCIwS21JWGkqSFAhIzY3JCQiMFUxIypcWycqNCMhIzckIjBXPTtPaklzJCEjNjckNyQkIjBGXy46aycqNCMhIzckIjBLbUlYaSpIUCEjNjckJCIwaiQ9Om1uKjQjISM3JCIwSid5ZlBUTlAhIzY3JDckJCIwTmAwWyNwKjQjISM3JCIwcGFQKy5DdSQhIzY3JCQiMGokPTptbio0IyEjNyQiMEoneWZQVE5QISM2NyQ3JCQiME5gMFsjcCo0IyEjNyQiMHBhUCsuQ3UkISM2NyQkIjA4V3J1LygqNCMhIzckIjBkL241a3h1JCEjNjckNyQkIjBGbXkjM3MqNCMhIzckIjAwVldiVlt2JCEjNjckJCIwOFdydS8oKjQjISM3JCIwZC9uNWt4dSQhIzY3JDckJCIwRm15IzNzKjQjISM3JCIwMFZXYlZbdiQhIzY3JCQiMEpmXypHdCo0IyEjNyQiL08jPVM5LHckISM1NyQ3JCQiMC5FPD5cKCo0IyEjNyQiMFRKXjUlR25QISM2NyQkIjBKZl8qR3QqNCMhIzckIi9PIz1TOSx3JCEjNTckNyQkIjAuRTw+XCgqNCMhIzckIjBUSl41JUduUCEjNjckJCIwT2ImZjV3KjQjISM3JCIwWWZda2tDeCQhIzY3JDckJCIwY3I4ZHgoKjQjISM3JCIweD5lbEMoelAhIzY3JCQiME9iJmY1dyo0IyEjNyQiMFlmXWtrQ3gkISM2NyQ3JCQiMGNyOGR4KCo0IyEjNyQiMHg+ZWxDKHpQISM2NyQkIjB3OylSIyp5KjQjISM3JCIwQC5yJFsiW3kkISM2NyQ3JCQiMCZITW5mISkqNCMhIzckIjA4M2w/bEB6JCEjNjckJCIwdzspUiMqeSo0IyEjNyQiMEAuciRbIlt5JCEjNjckNyQkIjAmSE1uZiEpKjQjISM3JCIwODNsP2xAeiQhIzY3JCQiMHk2Z1Y8KSo0IyEjNyQiMGVjIXlcOyh6JCEjNjckNyQkIjAwQjdRTSkqNCMhIzckIjBcJz5kZGcvUSEjNjckJCIweTZnVjwpKjQjISM3JCIwZWMheVw7KHokISM2NyQ3JCQiMDBCN1FNKSo0IyEjNyQiMFwnPmRkZy9RISM2NyQkIjBWJT5cYyUpKjQjISM3JCIwIypSWDE6JjRRISM2NyQ3JCQiMDsiKTMiRycpKjQjISM3JCIwJlspeUlZcSJRISM2NyQkIjBWJT5cYyUpKjQjISM3JCIwIypSWDE6JjRRISM2NyQ3JCQiMDsiKTMiRycpKjQjISM3JCIwJlspeUlZcSJRISM2NyQkIjAiKSp5eFEoKSo0IyEjNyQiMDQuOzVsPSNRISM2NyQ3JCQiMHo5akQiKikqNCMhIzckIjBAdCZlb1tIUSEjNjckJCIwIikqeXhRKCkqNCMhIzckIjA0Ljs1bD0jUSEjNjckNyQkIjB6OWpEIiopKjQjISM3JCIwQHQmZW9bSFEhIzY3JCQiMCgzSUFAISoqNCMhIzckIi9NaigzOlUkUSEjNTckNyQkIjBYaCk9KD4qKjQjISM3JCIwZGgjNHUjPiVRISM2NyQkIjAoM0lBQCEqKjQjISM3JCIvTWooMzpVJFEhIzU3JDckJCIwWGgpPSg+Kio0IyEjNyQiMGRoIzR1Iz4lUSEjNjckJCIwRU1JUUkqKjQjISM3JCIvd2tAXWNZUSEjNTckNyQkIjAzRCEpPlsqKjQjISM3JCIwJCpcKmZ6T2FRISM2NyQkIjBFTUlRSSoqNCMhIzckIi93a0BdY1lRISM1NyQ3JCQiMDNEISk+WyoqNCMhIzckIjAkKlwqZnpPYVEhIzY3JCQiMFYtMG1lKio0IyEjNyQiMGMtPyFcIiplUSEjNjckNyQkIjByZk1wdyoqNCMhIzckIjBIUTFeM28nUSEjNjckJCIwVi0wbWUqKjQjISM3JCIwYy0/IVwiKmVRISM2NyQ3JCQiMHJmTXB3Kio0IyEjNyQiMEhRMV4zbydRISM2NyQkIjBcc0wmcCkqKjQjISM3JCIwM3NIdGs3KFEhIzY3JDckJCIwImVfMF8rK0AhIzckIjBsRTgxXCN6USEjNjckJCIwXHNMJnApKio0IyEjNyQiMDNzSHRrNyhRISM2NyQ3JCQiMCJlXzBfKytAISM3JCIwbEU4MVwjelEhIzY3JCQiMHZySEU6KzUjISM3JCIwQCsuXjlPKVEhIzY3JDckJCIwNFFRdEwrNSMhIzckIjAsOj9oKm8iKlEhIzY3JCQiMHZySEU6KzUjISM3JCIwQCsuXjlPKVEhIzY3JDckJCIwNFFRdEwrNSMhIzckIjAsOj9oKm8iKlEhIzY3JCQiMF5uemVWKzUjISM3JCIwQmcjUVUnZipRISM2NyQ3JCQiMGU1ekZpKzUjISM3JCIwUC5GO0lUIVIhIzY3JCQiMF5uemVWKzUjISM3JCIwQmcjUVUnZipRISM2NyQ3JCQiMGU1ekZpKzUjISM3JCIwUC5GO0lUIVIhIzY3JCQiMDlkJEc+MitAISM3JCIwZGdvIlJKM1IhIzY3JDckJCIwUk8nUTM0K0AhIzckIjB0IlI4MmQ7UiEjNjckJCIwOWQkRz4yK0AhIzckIjBkZ28iUkozUiEjNjckNyQkIjBSTydRMzQrQCEjNyQiMHQiUjgyZDtSISM2NyQkIjBybmFHKyw1IyEjNyQiMCxZPWFqMSNSISM2NyQ3JCQiMGV3a1Q+LDUjISM3JCIwNCEzazcsSFIhIzY3JCQiMHJuYUcrLDUjISM3JCIwLFk9YWoxI1IhIzY3JDckJCIwZXdrVD4sNSMhIzckIjA0ITNrNyxIUiEjNjckJCIwbG8pZSdHLDUjISM3JCIwOihmOUosTFIhIzY3JDckJCIwMCozNSFbLDUjISM3JCIwWG9aIj1YVFIhIzY3JCQiMGxvKWUnRyw1IyEjNyQiMDooZjlKLExSISM2NyQ3JCQiMDAqMzUhWyw1IyEjNyQiMFhvWiI9WFRSISM2NyQkIjB5dXcvZCw1IyEjNyQiMEpfemppYCVSISM2NyQ3JCQiL2tSP208K0AhIzYkIjAib1hsQipRJlIhIzY3JCQiMHl1dy9kLDUjISM3JCIwSl96amlgJVIhIzY3JDckJCIva1I/bTwrQCEjNiQiMCJvWGxCKlEmUiEjNjckJCIwKEhAYGE9K0AhIzckIjAlcGwyQHJkUiEjNjckNyQkIjA5JipvQzAtNSMhIzckIjA8WGgiSExtUiEjNjckJCIwKEhAYGE9K0AhIzckIjAlcGwyQHJkUiEjNjckNyQkIjA5JipvQzAtNSMhIzckIjA8WGgiSExtUiEjNjckJCIwJzQ6dVFAK0AhIzckIjAjRyl6X2grKFIhIzY3JDckJCIwa2UiKilRQitAISM3JCIwYExvWXQoeVIhIzY3JCQiMCc0OnVRQCtAISM3JCIwI0cpel9oKyhSISM2NyQ3JCQiMGtlIiopUUIrQCEjNyQiMGBMb1l0KHlSISM2NyQkIjA7J1s1QkMrQCEjNyQiMExRKikqM1QjKVIhIzY3JDckJCIuUiJbREUrQCEjNSQiMCo9XzxTQCIqUiEjNjckJCIwOydbNUJDK0AhIzckIjBMUSopKjNUIylSISM2NyQ3JCQiLlIiW0RFK0AhIzUkIjAqPV88U0AiKlIhIzY3JCQiMD5YTndxLTUjISM3JCIwbHBpQGdaKlIhIzY3JDckJCIwXnRLQSJIK0AhIzckIjBENSNvWGwuUyEjNjckJCIwPlhOd3EtNSMhIzckIjBscGlAZ1oqUiEjNjckNyQkIjBfdEtBIkgrQCEjNyQiMEQ1I29YbC5TISM2NyQkIjAxJyo+QipIK0AhIzckIjAieUMlWzRyKyUhIzY3JDckJCIwYFJeIio+LjUjISM3JCIwaCkqKT1eNDtTISM2NyQkIjAxJyo+QipIK0AhIzckIjAieUMlWzRyKyUhIzY3JDckJCIwYFJeIio+LjUjISM3JCIwaCkqKT1eNDtTISM2NyQkIjAqZSFvckYuNSMhIzckIjB1cigqcGUlPlMhIzY3JDckJCIwLCF5QSdbLjUjISM3JCIwKXBlcGNgR1MhIzY3JCQiMCplIW9yRi41IyEjNyQiMHVyKCpwZSU+UyEjNjckNyQkIjAsIXlBJ1suNSMhIzckIjApcGVwY2BHUyEjNjckJCIwdkBxQGMuNSMhIzckIjAqcCplJ3khPS4lISM2NyQ3JCQiMF8jPll0UCtAISM3JCIwTXYtQXc0LyUhIzY3JCQiMHZAcUBjLjUjISM3JCIwKnAqZSd5IT0uJSEjNjckNyQkIjBfIz5ZdFArQCEjNyQiME12LUF3NC8lISM2NyQkIjAjMylIdCVRK0AhIzckIi9DYSIpcDpXUyEjNTckNyQkIjBSOG4zMS81IyEjNyQiL1AnNHg7TTAlISM1NyQkIjAjMylIdCVRK0AhIzckIi9DYSIpcDpXUyEjNTckNyQkIjBSOG4zMS81IyEjNyQiL1AnNHg7TTAlISM1NyQkIjAuP2BFOC81IyEjNyQiL2RtV2ddY1MhIzU3JDckJCIwQyxJJVtWK0AhIzckIjAxXztLZGUxJSEjNjckJCIwLj9gRTgvNSMhIzckIi9kbVdnXWNTISM1NyQ3JCQiMEMsSSVbVitAISM3JCIwMV87S2RlMSUhIzY3JCQiMEtkSSI9VytAISM3JCIweTolZV0mKW9TISM2NyQ3JCQiMGtgXWhqLzUjISM3JCIwVVNCKHlIeVMhIzY3JCQiMEtkSSI9VytAISM3JCIweTolZV0mKW9TISM2NyQ3JCQiMGtgXWhqLzUjISM3JCIwVVNCKHlIeVMhIzY3JCQiMDQhPncuWitAISM3JCIwKTQhRy0vNzMlISM2NyQ3JCQiLzshUlMjXCtAISM2JCIweUdJVVEyNCUhIzY3JCQiMDQhPncuWitAISM3JCIwKTQhRy0vNzMlISM2NyQ3JCQiLzshUlMjXCtAISM2JCIweUdJVVEyNCUhIzY3JCQiMFVXZyYqKVwrQCEjNyQiMExwTiRIYiQ0JSEjNjckNyQkIjA3QykzN18rQCEjNyQiMDk8UCgqeUo1JSEjNjckJCIwVVdnJiopXCtAISM3JCIwTHBOJEhiJDQlISM2NyQ3JCQiMDdDKTM3XytAISM3JCIwOTxQKCp5SjUlISM2NyQkIjA3KSo0YkYwNSMhIzckIjBIQWZ6LGY1JSEjNjckNyQkIjBfPSNIK2IrQCEjNyQiL2JTQyY+YzYlISM1NyQkIjA3KSo0YkYwNSMhIzckIjBIQWZ6LGY1JSEjNjckNyQkIjBfPSNIK2IrQCEjNyQiL2JTQyY+YzYlISM1NyQkIjAoKlI7O2MwNSMhIzckIjAlPih6Z10jPVQhIzY3JDckJCIwcGljJyl5MDUjISM3JCIwJ1E0disxR1QhIzY3JCQiMCgqUjs7YzA1IyEjNyQiMCU+KHpnXSM9VCEjNjckNyQkIjBwaWMnKXkwNSMhIzckIjAnUTR2KzFHVCEjNjckJCIwem13eSVlK0AhIzckIjBWIXBxJCpmSVQhIzY3JDckJCIwMksqPXhnK0AhIzckIjBBI3lEMV1TVCEjNjckJCIwem13eSVlK0AhIzckIjBWIXBxJCpmSVQhIzY3JDckJCIwMksqPXhnK0AhIzckIjBBI3lEMV1TVCEjNjckJCIwLVYsVjgxNSMhIzckIjBvazEzW0g5JSEjNjckNyQkIi5yemVPMTUjISM1JCIwZXFrPFRIOiUhIzY3JCQiMC1WLFY4MTUjISM3JCIwb2sxM1tIOSUhIzY3JDckJCIucnplTzE1IyEjNSQiMGVxazxUSDolISM2NyQkIjAwcSMpM1UxNSMhIzckIjBUYi91J0hiVCEjNjckNyQkIjA+OlRabDE1IyEjNyQiMCUqZXJzIlFsVCEjNjckJCIwMHEjKTNVMTUjISM3JCIwVGIvdSdIYlQhIzY3JDckJCIwPjpUWmwxNSMhIzckIjAlKmVycyJRbFQhIzY3JCQiMCoqPUV3cTE1IyEjNyQiME9KI1tga25UISM2NyQ3JCQiMCNlb3VWcCtAISM3JCIvdCV5RkF5PCUhIzU3JCQiMCoqPUV3cTE1IyEjNyQiME9KI1tga25UISM2NyQ3JCQiMCNlb3VWcCtAISM3JCIvdCV5RkF5PCUhIzU3JCQiMDg8OlgqcCtAISM3JCIwLWMkNFIqKnpUISM2NyQ3JCQiMHNjQkhCMjUjISM3JCIwbU4mR0dFIT4lISM2NyQkIjA4PDpYKnArQCEjNyQiMC1jJDRSKip6VCEjNjckNyQkIjBzY0JIQjI1IyEjNyQiMG1OJkdHRSE+JSEjNjckJCIvN25jIkcyNSMhIzYkIjB6YyQ9Q00jPiUhIzY3JDckJCIwJj5kREF2K0AhIzckIjAtQyN6THEtVSEjNjckJCIvN25jIkcyNSMhIzYkIjB6YyQ9Q00jPiUhIzY3JDckJCIwJj5kREF2K0AhIzckIjAtQyN6THEtVSEjNjckJCIwJ2ZXeG92K0AhIzckIjBpcXMoM3AvVSEjNjckNyQkIjB4cFo8InkrQCEjNyQiMFE3KkhSOTpVISM2NyQkIjAnZld4b3YrQCEjNyQiMGlxcygzcC9VISM2NyQ3JCQiMHhwWjwieStAISM3JCIwUTcqSFI5OlUhIzY3JCQiMChwZzhjeStAISM3JCIwOlxvR1JxQCUhIzY3JDckJCIwVEEoUiwiMzUjISM3JCIwdSsxWyVlRlUhIzY3JCQiMChwZzhjeStAISM3JCIwOlxvR1JxQCUhIzY3JDckJCIwVEEoUiwiMzUjISM3JCIwdSsxWyVlRlUhIzY3JCQiMG5eXk85MzUjISM3JCIwbCtyayhRSFUhIzY3JDckJCIwJSl6OjdSMzUjISM3JCIvIipHSl0tU1UhIzU3JCQiMG5eXk85MzUjISM3JCIwbCtyayhRSFUhIzY3JDckJCIwJSl6OjdSMzUjISM3JCIvIipHSl0tU1UhIzU3JCQiMGpBSzhWMzUjISM3JCIwWWhWJmZ0VFUhIzY3JDckJCIwNzIjPiJvMzUjISM3JCIwWXg+ZWxDRCUhIzY3JCQiMGpBSzhWMzUjISM3JCIwWWhWJmZ0VFUhIzY3JDckJCIwNzIjPiJvMzUjISM3JCIwWXg+ZWxDRCUhIzY3JCQiMHIicDs+KDM1IyEjNyQiMCgqW0FAJTNhVSEjNjckNyQkIjAjPWdLciozNSMhIzckIjAjZW1LaCFcRSUhIzY3JCQiMHIicDs+KDM1IyEjNyQiMCgqW0FAJTNhVSEjNjckNyQkIjAjPWdLciozNSMhIzckIjAjZW1LaCFcRSUhIzY3JCQiMExjYnIrNDUjISM3JCIwVXIyVUtrRSUhIzY3JDckJCIwYWg8O0U0NSMhIzckIjA9YUxvWXRGJSEjNjckJCIwTGNicis0NSMhIzckIjBVcjJVS2tFJSEjNjckNyQkIjBhaDw7RTQ1IyEjNyQiMD1hTG9ZdEYlISM2NyQkIjAlUiIpSCZINDUjISM3JCIwKnAkKnoweXlVISM2NyQ3JCQiMChRbzFfJjQ1IyEjNyQiMGFVU0IoeSpHJSEjNjckJCIwJVIiKUgmSDQ1IyEjNyQiMCpwJCp6MHl5VSEjNjckNyQkIjAoUW8xXyY0NSMhIzckIjBhVVNCKHkqRyUhIzY3JCQiMCg+WWYkZTQ1IyEjNyQiMCJSdipvRzZIJSEjNjckNyQkIjBSbXRFJSk0NSMhIzckIi80dCV5RkFJJSEjNTckJCIwKD5ZZiRlNDUjISM3JCIwIlJ2Km9HNkglISM2NyQ3JCQiMFJtdEUlKTQ1IyEjNyQiLzR0JXlGQUklISM1NyQkIjApeVwvcyk0NSMhIzckIjBQSS12d01JJSEjNjckNyQkIjBwMVFNODU1IyEjNyQiMEU+YUxvWUolISM2NyQkIjApeVwvcyk0NSMhIzckIjBQSS12d01JJSEjNjckNyQkIjBwMVFNODU1IyEjNyQiMEU+YUxvWUolISM2NyQkIjA0PlwxOzU1IyEjNyQiMGZ1OHdDZUolISM2NyQ3JCQiMFRDc1ZVNTUjISM3JCIwajJoKSkzckslISM2NyQkIjA0PlwxOzU1IyEjNyQiMGZ1OHdDZUolISM2NyQ3JCQiMFRDc1ZVNTUjISM3JCIwajJoKSkzckslISM2NyQkIjAibyQ+JVwvLEAhIzckIjAiSEk+RjxHViEjNjckNyQkIi4kPVg6MixAISM1JCIwKmZ6TyVcJlJWISM2NyQkIjAibyQ+JVwvLEAhIzckIjAiSEk+RjxHViEjNjckNyQkIi4kPVg6MixAISM1JCIwKmZ6TyVcJlJWISM2NyQkIjB6SUokUTIsQCEjNyQiMHZ2PGo/ME0lISM2NyQ3JCQiMDpNLG4rNjUjISM3JCIwTiVbKCkqKik+TiUhIzY3JCQiMHpJSiRRMixAISM3JCIwdnY8aj8wTSUhIzY3JDckJCIwOk0sbis2NSMhIzckIjBOJVsoKSoqKT5OJSEjNjckJCIwek40dS02NSMhIzckIjA3Jyk0XG9HTiUhIzY3JDckJCIwUmAzIilINjUjISM3JCIwcnMiUTBWa1YhIzY3JCQiMHpONHUtNjUjISM3JCIwNycpNFxvR04lISM2NyQ3JCQiMFJgMyIpSDY1IyEjNyQiMHJzIlEwVmtWISM2NyQkIjBgTlRtSjY1IyEjNyQiMCxNM0k7X08lISM2NyQ3JCQiMFF3ZycqZTY1IyEjNyQiMDJoKSkzcm9QJSEjNjckJCIwYE5UbUo2NSMhIzckIjAsTTNJO19PJSEjNjckNyQkIjBRd2cnKmU2NSMhIzckIjAyaCkpM3JvUCUhIzY3JCQiMF4rOWdnNjUjISM3JCIwViNlbFNjeFYhIzY3JDckJCIwbVwjUSIpPSxAISM3JCIwVlwmUjtKKlElISM2NyQkIjBeKzlnZzY1IyEjNyQiMFYjZWxTY3hWISM2NyQ3JCQiMG1cI1EiKT0sQCEjNyQiMFZcJlI7SipRJSEjNjckJCIwOyNRYiYqPSxAISM3JCIwaUhueDYqKlElISM2NyQ3JCQiLyplaUs8NzUjISM2JCIwelAtPl88UyUhIzY3JCQiMDsjUWImKj0sQCEjNyQiMGlIbng2KipRJSEjNjckNyQkIi8qZWlLPDc1IyEjNiQiMHpQLT5fPFMlISM2NyQkIjAjNHZDJj03NSMhIzckIjB6USZRJWZBUyUhIzY3JDckJCIwbEUrYFk3NSMhIzckIjA6RTR1Iz45VyEjNjckJCIwIzR2QyY9NzUjISM3JCIwelEmUSVmQVMlISM2NyQ3JCQiMGxFK2BZNzUjISM3JCIwOkU0dSM+OVchIzY3JCQiMDFnJTR2QyxAISM3JCIweWY2MDJZVCUhIzY3JDckJCIvUUBbZEYsQCEjNiQiMF45O0hMbVUlISM2NyQkIjAxZyU0dkMsQCEjNyQiMHlmNjAyWVQlISM2NyQ3JCQiL1FAW2RGLEAhIzYkIjBeOTtITG1VJSEjNjckJCIwJEhKM2xGLEAhIzckIjBmSCU9WSZwVSUhIzY3JDckJCIwWiJcJClcSSxAISM3JCIwKEdJVVEyUlchIzY3JCQiMCRISjNsRixAISM3JCIwZkglPVkmcFUlISM2NyQ3JCQiMFoiXCQpXEksQCEjNyQiMChHSVVRMlJXISM2NyQkIjBcLlFfMDg1IyEjNyQiMFdeQjgtJFJXISM2NyQ3JCQiMCVlXU1VTCxAISM3JCIwQiIqSFI5OlglISM2NyQkIjBcLlFfMDg1IyEjNyQiMFdeQjgtJFJXISM2NyQ3JCQiMCVlXU1VTCxAISM3JCIwQiIqSFI5OlglISM2NyQkIjAmM3BhWEwsQCEjNyQiMD4vcGZcO1glISM2NyQ3JCQiME5kKipcajg1IyEjNyQiMGZ6TyVcJlJZJSEjNjckJCIwJjNwYVhMLEAhIzckIjA+L3BmXDtYJSEjNjckNyQkIjBOZCoqXGo4NSMhIzckIjBmek8lXCZSWSUhIzY3JCQiMF9dJypmajg1IyEjNyQiMHlNaiwoKlJZJSEjNjckNyQkIjA4LDRzdzg1IyEjNyQiMF5uXWtyJnBXISM2NyQkIjBfXScqZmo4NSMhIzckIjB5TWosKCpSWSUhIzY3JDckJCIwOCw0c3c4NSMhIzckIjBLYFQ5STt0JCEjNzckJCIwRFxCRydlL0AhIzckIjBLYFQ5STt0JCEjNzckNyQkIi9NcnFsRDBAISM2JCIvRWk1KXBzcyQhIzY3JCQiMERcQkcnZS9AISM3JCIwS2BUOUk7dCQhIzc3JDckJCIwOCw0c3c4NSMhIzckIjBebl1rciZwVyEjNjckJCIwKjRYckVSLEAhIzckIjBqLChcVk13VyEjNjckNyQkIjB2KTMieiNSLEAhIzckIjAmek8lXCZSd1chIzY3JCQiMCo0WHJFUixAISM3JCIwaiwoXFZNd1chIzY3JDckJCIwdikzInojUixAISM3JCIwJnpPJVwmUndXISM2NyQkIjBteHB3QDk1IyEjNyQiMGUiKnBnInApWyUhIzY3JDckJCIwPktdNUE5NSMhIzckIjBKY10vTykpWyUhIzY3JCQiMG14cHdAOTUjISM3JCIwZSIqcGcicClbJSEjNjckNyQkIjA+S101QTk1IyEjNyQiMEpjXS9PKSlbJSEjNjckJCIwel5sKDNYLEAhIzckIjAtUiM+KVE1XSUhIzY3JDckJCIwWz1NVl45NSMhIzckIjBuV2RmdzddJSEjNjckJCIwel5sKDNYLEAhIzckIjAtUiM+KVE1XSUhIzY3JDckJCIwWz1NVl45NSMhIzckIjBuV2RmdzddJSEjNjckJCIwMkRHKyFbLEAhIzckIjBYVHooZlE4WCEjNjckNyQkIjBYcyl5MlssQCEjNyQiMC5Mazk8UF4lISM2NyQkIjAyREcrIVssQCEjNyQiMFhUeihmUThYISM2NyQ3JCQiMFhzKXkyWyxAISM3JCIwLkxrOTxQXiUhIzY3JCQiMDsnPVYiNDo1IyEjNyQiMCk+WiI0TGRfJSEjNjckNyQkIjBNTChRLF4sQCEjNyQiMFJAcnBkaF8lISM2NyQkIjA7Jz1WIjQ6NSMhIzckIjApPloiNExkXyUhIzY3JDckJCIwTUwoUSxeLEAhIzckIjBSQHJwZGhfJSEjNjckJCIueikpSFE6NSMhIzUkIi5VZTohM1FYISIqNyQ3JCQiMCo9UjkmUjo1IyEjNyQiMHY0eUMpZlFYISM2NyQkIi56KSlIUTo1IyEjNSQiLlVlOiEzUVghIio3JDckJCIwKj1SOSZSOjUjISM3JCIwdjR5QylmUVghIzY3JCQiMGgsK1puOjUjISM3JCIwQ1AyPEYvYiUhIzY3JDckJCIwJik0ZSEqbzo1IyEjNyQiMDYpXCl6UTViJSEjNjckJCIwaCwrWm46NSMhIzckIjBDUDI8Ri9iJSEjNjckNyQkIjAmKTRlISpvOjUjISM3JCIwNilcKXpRNWIlISM2NyQkIjA7MWxsJ2YsQCEjNyQiLjZqOHVGYyUhIio3JDckJCIwXzNISilmLEAhIzckIjBaJz1cJHpNYyUhIzY3JCQiMDsxbGwnZixAISM3JCIuNmo4dUZjJSEiKjckNyQkIjBfM0hKKWYsQCEjNyQiMFonPVwkek1jJSEjNjckJCIwJlxJZWVpLEAhIzckIjBhV0cwQF5kJSEjNjckNyQkIjAxR2V0Rjs1IyEjNyQiMCRbKCkqKik+ZmQlISM2NyQkIjAmXEllZWksQCEjNyQiMGFXRzBAXmQlISM2NyQ3JCQiMDFHZXRGOzUjISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMCVlYnZdbCxAISM3JCIwbUopPnpZKGUlISM2NyQ3JCQiMCkpKlx1cmwsQCEjNyQiMD5qMFhnJCllJSEjNjckJCIwJWVidl1sLEAhIzckIjBtSik+elkoZSUhIzY3JDckJCIwKSkqXHVybCxAISM3JCIwPmowWGckKWUlISM2NyQkIi82PTNWbyxAISM2JCIwaEB2dDkpKmYlISM2NyQ3JCQiMCdbIilHbW8sQCEjNyQiMGJeNyssM2clISM2NyQkIi82PTNWbyxAISM2JCIwaEB2dDkpKmYlISM2NyQ3JCQiMCdbIilHbW8sQCEjNyQiMGJeNyssM2clISM2NyQkIjB6XltiODw1IyEjNyQiMGN2LF5oQGglISM2NyQ3JCQiMFdheDQ7PDUjISM3JCIwIipSPmJUS2glISM2NyQkIjB6XltiODw1IyEjNyQiMGN2LF5oQGglISM2NyQ3JCQiMFdheDQ7PDUjISM3JCIwIipSPmJUS2glISM2NyQkIi9yLDxHdSxAISM2JCIwd1lKQjNYaSUhIzY3JDckJCIwY0tCZVg8NSMhIzckIjBHR0U1I29EWSEjNjckJCIvciw8R3UsQCEjNiQiMHdZSkIzWGklISM2NyQ3JCQiMGNLQmVYPDUjISM3JCIwR0dFNSNvRFkhIzY3JCQiMEBNVzRzPDUjISM3JCIvUUAyXCZvaiUhIzU3JDckJCIwZWBFM3Y8NSMhIzckIjBrO0xsQSJRWSEjNjckJCIwQE1XNHM8NSMhIzckIi9RQDJcJm9qJSEjNTckNyQkIjBlYEUzdjw1IyEjNyQiMGs7TGxBIlFZISM2NyQkIjB3OnNRLD01IyEjNyQiMGA6P2AsI1xZISM2NyQ3JCQiMF5pKSlmLz01IyEjNyQiLjBTP2owbCUhIio3JCQiMHc6c1EsPTUjISM3JCIwYDo/YCwjXFkhIzY3JDckJCIwXmkpKWYvPTUjISM3JCIwKlwrL0tjXVkhIzY3JCQiMFE5YnBJPTUjISM3JCIwXGlxNVs6bSUhIzY3JDckJCIwVHMxOE09NSMhIzckIjBPJHBhUCtqWSEjNjckJCIwUTlicEk9NSMhIzckIjBcaXE1WzptJSEjNjckNyQkIjBUczE4TT01IyEjNyQiME8kcGFQK2pZISM2NyQkIjBQbXksZz01IyEjNyQiMC9bcWolKlFuJSEjNjckNyQkIjBwXHFuaj01IyEjNyQiMHMiUTBWV3ZZISM2NyQkIjBQbXksZz01IyEjNyQiMC9bcWolKlFuJSEjNjckNyQkIjBwXHFuaj01IyEjNyQiMHMiUTBWV3ZZISM2NyQkIjBUJmZiJCopPTUjISM3JCIwekZ4NlRpbyUhIzY3JDckJCIwLC4hUksqPTUjISM3JCIwM3FnJlspeW8lISM2NyQkIjBUJmZiJCopPTUjISM3JCIwekZ4NlRpbyUhIzY3JDckJCIwLC4hUksqPTUjISM3JCIwM3FnJlspeW8lISM2NyQkIjB5OCYzKD0+NSMhIzckIjByLihcdmUpcCUhIzY3JDckJCIwY3ZvIkcjPjUjISM3JCIwV2VuU0QucSUhIzY3JCQiMHk4JjMoPT41IyEjNyQiMHIuKFx2ZSlwJSEjNjckNyQkIjBjdm8iRyM+NSMhIzckIjBXZW5TRC5xJSEjNjckJCIwUXpwMls+NSMhIzckIjA6Rz0kUiQ0ciUhIzY3JDckJCIwRyhcNUMmPjUjISM3JCIvb1dkZnc3WiEjNTckJCIwUXpwMls+NSMhIzckIjA6Rz0kUiQ0ciUhIzY3JDckJCIwRyhcNUMmPjUjISM3JCIvb1dkZnc3WiEjNTckJCIwLiVwZnUoPjUjISM3JCIwdWojby1HQlohIzY3JDckJCIwKipIJj0/KT41IyEjNyQiMDtOIjNsP0RaISM2NyQkIjAuJXBmdSg+NSMhIzckIjB1aiNvLUdCWiEjNjckNyQkIjApKkgmPT8pPjUjISM3JCIwO04iM2w/RFohIzY3JCQiMGghZWRvKy1AISM3JCIwRl5nYkVjdCUhIzY3JDckJCIwRzJCazY/NSMhIzckIjBfQillcWtQWiEjNjckJCIwaCFlZG8rLUAhIzckIjBGXmdiRWN0JSEjNjckNyQkIjBHMkJrNj81IyEjNyQiMF9CKWVxa1BaISM2NyQkIjAnPSQzRk8/NSMhIzckIjBzc1h6c3p1JSEjNjckNyQkIjAibyM9R1Q/NSMhIzckIjApPV40dzNdWiEjNjckJCIwJz0kM0ZPPzUjISM3JCIwc3NYenN6dSUhIzY3JDckJCIwIm8jPUdUPzUjISM3JCIwKT1eNHczXVohIzY3JCQiMDZiJClwbD81IyEjNyQiMG9KdCkqPS53JSEjNjckNyQkIjBkKilmJDQyLUAhIzckIjBDKy07R0R3JSEjNjckJCIwNmIkKXBsPzUjISM3JCIwb0p0KSo9LnclISM2NyQ3JCQiMGQqKWYkNDItQCEjNyQiMEMrLTtHRHclISM2NyQkIjBKUUI5JjQtQCEjNyQiMGg3dDdsRXglISM2NyQ3JCQiMHgnKnBnK0A1IyEjNyQiLycpKTNyb1x4JSEjNTckJCIwSlFCOSY0LUAhIzckIjBoN3Q3bEV4JSEjNjckNyQkIjB4JypwZytANSMhIzckIi8nKSkzcm9ceCUhIzU3JCQiMCQpUSYqZkNANSMhIzckIjAnRyJcQTZdeSUhIzY3JDckJCIwX0Y4SElANSMhIzckIjAncGRoIzR1eSUhIzY3JCQiMCQpUSYqZkNANSMhIzckIjAnRyJcQTZdeSUhIzY3JDckJCIwX0Y4SElANSMhIzckIjAncGRoIzR1eSUhIzY3JCQiMHhHSDJhQDUjISM3JCIvRGdxc04oeiUhIzU3JDckJCIwaHhDKipmQDUjISM3JCIwS2xBIilcKSp6JSEjNjckJCIweEdIMmFANSMhIzckIi9EZ3FzTih6JSEjNTckNyQkIjBoeEMqKmZANSMhIzckIjBLbEEiKVwpKnolISM2NyQkIjBPQDFjJD0tQCEjNyQiLzlWcUtxNFshIzU3JDckJCIwdC0kMygqPS1AISM3JCIwb2BITyFIN1shIzY3JCQiME9AMWMkPS1AISM3JCIvOVZxS3E0WyEjNTckNyQkIjB0LSQzKCo9LUAhIzckIjBvYEhPIUg3WyEjNjckJCIwLiVvaklALUAhIzckIjAobyg0QVw/I1shIzY3JDckJCIwaydlUiU+QTUjISM3JCIwL1VPIjR0Q1shIzY3JCQiMC4lb2pJQC1AISM3JCIwKG8oNEFcPyNbISM2NyQ3JCQiMGsnZVIlPkE1IyEjNyQiMC9VTyI0dENbISM2NyQkIjA8KnkhZVVBNSMhIzckIjAnZVxFXlJNWyEjNjckNyQkIjAlPSdlPVxBNSMhIzckIi8vTGs5PFBbISM1NyQkIjA8KnkhZVVBNSMhIzckIjAnZVxFXlJNWyEjNjckNyQkIjAlPSdlPVxBNSMhIzckIi8vTGs5PFBbISM1NyQkIjBObE42c0E1IyEjNyQiL2t3Iik0dVlbISM1NyQ3JCQiMEYiZloqeUE1IyEjNyQiMHc9XSw3J1xbISM2NyQkIjBObE42c0E1IyEjNyQiL2t3Iik0dVlbISM1NyQ3JCQiMEYiZloqeUE1IyEjNyQiMHc9XSw3J1xbISM2NyQkIjBkMzltLEI1IyEjNyQiL19zKXknM2ZbISM1NyQ3JCQiMGhpXXMzQjUjISM3JCIwNzJkY18/J1shIzY3JCQiMGQzOW0sQjUjISM3JCIvX3MpeSczZlshIzU3JDckJCIwaGldczNCNSMhIzckIjA3MmRjXz8nWyEjNjckJCIwNjhPQUpCNSMhIzckIjA6TidcRFZyWyEjNjckNyQkIi8mUXBeUUI1IyEjNiQiMFsmUjtKXHVbISM2NyQkIjA2OE9BSkI1IyEjNyQiMDpOJ1xEVnJbISM2NyQ3JCQiLyZRcF5RQjUjISM2JCIwWyZSO0pcdVshIzY3JCQiMHJmMyEzTy1AISM3JCIwVjhCRXlQKVshIzY3JDckJCIwd15YS29CNSMhIzckIjAlUTNuTyRwKVshIzY3JCQiMHJmMyEzTy1AISM3JCIwVjhCRXlQKVshIzY3JDckJCIwd15YS29CNSMhIzckIjAlUTNuTyRwKVshIzY3JCQiMDckWyNSIVItQCEjNyQiMD4kKilHUjcnKlshIzY3JDckJCIwZjtwOSlSLUAhIzckIi9BeDxVUCoqWyEjNTckJCIwNyRbI1IhUi1AISM3JCIwPiQqKUdSNycqWyEjNjckNyQkIjBmO3A5KVItQCEjNyQiL0F4PFVQKipbISM1NyQkIjAjKXolKioqPkM1IyEjNyQiMEJ6aGFwJTNcISM2NyQ3JCQiMDB0WSl6VS1AISM3JCIwY2clb1oiPSJcISM2NyQkIjAjKXolKioqPkM1IyEjNyQiMEJ6aGFwJTNcISM2NyQ3JCQiMDB0WSl6VS1AISM3JCIwY2clb1oiPSJcISM2NyQkIjAvIltAJ1xDNSMhIzckIjAsYWA2OjMjXCEjNjckNyQkIjAlPmBReVgtQCEjNyQiMCQqWyI+YERDXCEjNjckJCIwLyJbQCdcQzUjISM3JCIwLGFgNjozI1whIzY3JDckJCIwJT5gUXlYLUAhIzckIjAkKlsiPmBEQ1whIzY3JCQiMGxlI2UjekM1IyEjNyQiLlxyamdKJFwhIio3JDckJCIvRVUxeFstQCEjNiQiMEhQKXBlcE9cISM2NyQkIjBsZSNlI3pDNSMhIzckIi5ccmpnSiRcISIqNyQ3JCQiL0VVMXhbLUAhIzYkIjBIUClwZXBPXCEjNjckJCIwXDYoMyozRDUjISM3JCIwLSY0OmhdWFwhIzY3JDckJCIwWipbKmU8RDUjISM3JCIwbEQwVU8iXFwhIzY3JCQiMFw2KDMqM0Q1IyEjNyQiMC0mNDpoXVhcISM2NyQ3JCQiMFoqWyplPEQ1IyEjNyQiMGxEMFVPIlxcISM2NyQkIjBqQ1xkUUQ1IyEjNyQiMFQxRGFeeSZcISM2NyQ3JCQiMFc9eltaRDUjISM3JCIwLDk3KHBkaFwhIzY3JCQiMGpDXGRRRDUjISM3JCIwVDFEYV55JlwhIzY3JDckJCIwVz16W1pENSMhIzckIjAsOTcocGRoXCEjNjckJCIwXDdoRG9ENSMhIzckIjAyLT4jcD5xXCEjNjckNyQkIjBRdztTeEQ1IyEjNyQiMFAtPl88UyhcISM2NyQkIjBcN2hEb0Q1IyEjNyQiMDItPiNwPnFcISM2NyQ3JCQiMFF3O1N4RDUjISM3JCIwUC0+XzxTKFwhIzY3JCQiMCVbTF56Zi1AISM3JCIwJW9IY0FhIylcISM2NyQ3JCQiMFxsMUwyRTUjISM3JCIwdCFmcyFlaylcISM2NyQkIjAlW0xeemYtQCEjNyQiMCVvSGNBYSMpXCEjNjckNyQkIjBcbDFMMkU1IyEjNyQiMHQhZnMhZWspXCEjNjckJCIwY1NCbUZFNSMhIzckIjApSDNTdilbKlwhIzY3JDckJCIwX1hYRlBFNSMhIzckIjA0ektpKSopKSpcISM2NyQkIjBjU0JtRkU1IyEjNyQiMClIM1N2KVsqXCEjNjckNyQkIjBfWFhGUEU1IyEjNyQiMDR6S2kpKikpKlwhIzY3JCQiMEhmcFFkRTUjISM3JCIwcD4teUtzKyYhIzY3JDckJCIwVyRwTHNtLUAhIzckIjBYblI8UjgsJiEjNjckJCIwSGZwUWRFNSMhIzckIjBwPi15S3MrJiEjNjckNyQkIjBXJHBMc20tQCEjNyQiMFhuUjxSOCwmISM2NyQkIjApKipcRXJvLUAhIzckIjAjKTREKHpkPl0hIzY3JDckJCIvMUUyc3AtQCEjNiQiMCJlbEMoelAtJiEjNjckJCIwKSoqXEVyby1AISM3JCIwIyk0RCh6ZD5dISM2NyQ3JCQiLzFFMnNwLUAhIzYkIjAiZWxDKHpQLSYhIzY3JCQiMD10NClvci1AISM3JCIvJz5wNkI+LiYhIzU3JDckJCIvWjYnPkZGNSMhIzYkIjA8V2BGP2kuJiEjNjckJCIwPXQ0KW9yLUAhIzckIi8nPnA2Qj4uJiEjNTckNyQkIi9aNic+RkY1IyEjNiQiMDxXYEY/aS4mISM2NyQkIjAvWS5sWUY1IyEjNyQiME1hTkBvVS8mISM2NyQ3JCQiMEIocCtzdi1AISM3JCIwYEtnIzNtW10hIzY3JCQiMC9ZLmxZRjUjISM3JCIwTWFOQG9VLyYhIzY3JDckJCIwQihwK3N2LUAhIzckIjBgS2cjM21bXSEjNjckJCIwenFMVndGNSMhIzckIjAnXFRtS2hjXSEjNjckNyQkIjB1MiQ+c3ktQCEjNyQiMCozc3c4NWhdISM2NyQkIjB6cUxWd0Y1IyEjNyQiMCdcVG1LaGNdISM2NyQ3JCQiMHUyJD5zeS1AISM3JCIwKjNzdzg1aF0hIzY3JCQiME45RUIxRzUjISM3JCIwdXFzRWUqb10hIzY3JDckJCIwI3AtYXMiRzUjISM3JCIwRDR1Iz5hdF0hIzY3JCQiME45RUIxRzUjISM3JCIwdXFzRWUqb10hIzY3JDckJCIwI3AtYXMiRzUjISM3JCIwRDR1Iz5hdF0hIzY3JCQiMEdvXS9PRzUjISM3JCIvIm9kQS44MyYhIzU3JDckJCIwMTZHSVpHNSMhIzckIjBoKDR5QylmMyYhIzY3JCQiMEdvXS9PRzUjISM3JCIvIm9kQS44MyYhIzU3JDckJCIwMTZHSVpHNSMhIzckIjBoKDR5QylmMyYhIzY3JCQiMEQrSChlJ0c1IyEjNyQiMGNjXDhbTzQmISM2NyQ3JCQiMDNTb094RzUjISM3JCIwKGZ5R0lVKTQmISM2NyQkIjBEK0goZSdHNSMhIzckIjBjY1w4W080JiEjNjckNyQkIjAzU29PeEc1IyEjNyQiMChmeUdJVSk0JiEjNjckJCIwaCplOmQqRzUjISM3JCIwWzBsKkgqZjUmISM2NyQ3JCQiMHchM1l1IUg1IyEjNyQiMEx1JXpOJzM2JiEjNjckJCIwaCplOmQqRzUjISM3JCIwWzBsKkgqZjUmISM2NyQ3JCQiMHchM1l1IUg1IyEjNyQiMEx1JXpOJzM2JiEjNjckJCIwSjNCZERINSMhIzckIi0yOHlMPV4hIik3JDckJCIwPlItYVBINSMhIzckIjBwaSw4L0w3JiEjNjckJCIwSjNCZERINSMhIzckIi0yOHlMPV4hIik3JDckJCIwPlItYVBINSMhIzckIjBwaSw4L0w3JiEjNjckJCIwaSNmVmEmSDUjISM3JCIwaUlIZSNvSV4hIzY3JDckJCIwQFckXHcnSDUjISM3JCIwMF4zb1dkOCYhIzY3JCQiMGkjZlZhJkg1IyEjNyQiMGlJSGUjb0leISM2NyQ3JCQiMEBXJFx3J0g1IyEjNyQiMDBeM29XZDgmISM2NyQkIjB5cSVIYClINSMhIzckIjB0JypmSUZJOSYhIzY3JDckJCIwXm5HeCgqSDUjISM3JCIwVFI6QiY9W14hIzY3JCQiMHlxJUhgKUg1IyEjNyQiMHQnKmZJRkk5JiEjNjckNyQkIjBebkd4KCpINSMhIzckIjBUUjpCJj1bXiEjNjckJCIwcHcsQjpJNSMhIzckIjBSPTopPlBiXiEjNjckNyQkIjAqSGQ2ei0uQCEjNyQiMHhGQXlEMTsmISM2NyQkIjBwdyxCOkk1IyEjNyQiMFI9Oik+UGJeISM2NyQ3JCQiMCpIZDZ6LS5AISM3JCIweEZBeUQxOyYhIzY3JCQiL0sjXDlYSTUjISM2JCIwYz4/aDt4OyYhIzY3JDckJCIwaVxfMWVJNSMhIzckIjA4O0hMbUk8JiEjNjckJCIvSyNcOVhJNSMhIzYkIjBjPj9oO3g7JiEjNjckNyQkIjBpXF8xZUk1IyEjNyQiMDg7SExtSTwmISM2NyQkIjBDSl0ydkk1IyEjNyQiMHVrSz5oKz0mISM2NyQ3JCQiMEokM00jKTMuQCEjNyQiMFwvTylvXSY9JiEjNjckJCIwQ0pdMnZJNSMhIzckIjB1a0s+aCs9JiEjNjckNyQkIjBKJDNNIykzLkAhIzckIjBcL08pb10mPSYhIzY3JCQiMEZ2Ij5dNS5AISM3JCIwPC8mSGRTIz4mISM2NyQ3JCQiMFwvelQ9SjUjISM3JCIwJkdITXUlej4mISM2NyQkIjBGdiI+XTUuQCEjNyQiMDwvJkhkUyM+JiEjNjckNyQkIjBcL3pUPUo1IyEjNyQiMCZHSE11JXo+JiEjNjckJCIwa196KFw4LkAhIzckIi9EIyk9LXYvXyEjNTckNyQkIi9LODsnW0o1IyEjNiQiMEAiKVwpelE1XyEjNjckJCIwa196KFw4LkAhIzckIi9EIyk9LXYvXyEjNTckNyQkIi9LODsnW0o1IyEjNiQiMEAiKVwpelE1XyEjNjckJCIwOSZcXlw7LkAhIzckIjA8KHpnWTQ8XyEjNjckNyQkIjBiKywkKXlKNSMhIzckIjBlcGNgR0dBJiEjNjckJCIwOSZcXlw7LkAhIzckIjA8KHpnWTQ8XyEjNjckNyQkIjBiKywkKXlKNSMhIzckIjBkcGNgR0dBJiEjNjckJCIwJVEpKlFcPi5AISM3JCIwLmEhZSFSJUhfISM2NyQ3JCQiMCl6OGQhNEs1IyEjNyQiMCV6TiczcF9CJiEjNjckJCIwJVEpKlFcPi5AISM3JCIwLmEhZSFSJUhfISM2NyQ3JCQiMCl6OGQhNEs1IyEjNyQiMCV6TiczcF9CJiEjNjckJCIwJ0hnU1xBLkAhIzckIjBQLStUJHlUXyEjNjckNyQkIi8oXDBJUks1IyEjNiQiL2ovUCc0eEMmISM1NyQkIjAnSGdTXEEuQCEjNyQiMFAtK1QkeVRfISM2NyQ3JCQiLyhcMElSSzUjISM2JCIvai9QJzR4QyYhIzU3JCQiLyo0I2VcRC5AISM2JCIwYCdvNXg3YV8hIzY3JDckJCIwYTglZSZwSzUjISM3JCIwbU14PV0sRSYhIzY3JCQiLyo0I2VcRC5AISM2JCIwYCdvNXg3YV8hIzY3JDckJCIwYTglZSZwSzUjISM3JCIwbU14PV0sRSYhIzY3JCQiMClwYCkpXEcuQCEjNyQiL1VlcT5abV8hIzU3JDckJCIvPmtJKSpILkAhIzYkIjAtQiVRMmZzXyEjNjckJCIwKXBgKSlcRy5AISM3JCIvVWVxPlptXyEjNTckNyQkIi8+a0kpKkguQCEjNiQiMC1CJVEyZnNfISM2NyQkIjBRRlUuOkw1IyEjNyQiMDg/Nz07KXlfISM2NyQ3JCQiMHU9Jz0sTC5AISM3JCIwUTYiKkdKXUcmISM2NyQkIjBRRlUuOkw1IyEjNyQiMDg/Nz07KXlfISM2NyQ3JCQiMHU9Jz0sTC5AISM3JCIwUTYiKkdKXUcmISM2NyQkIjA2Rlk0WEw1IyEjNyQiMEcicFcuOyJIJiEjNjckNyQkIjBeRi5VZ0w1IyEjNyQiMHUqelI9WihIJiEjNjckJCIwNkZZNFhMNSMhIzckIjBHInBXLjsiSCYhIzY3JDckJCIwXkYuVWdMNSMhIzckIjB1KnpSPVooSCYhIzY3JCQiMEUtJW9eUC5AISM3JCIvW0ZsV10uYCEjNTckNyQkIjBsPXJ0IVIuQCEjNyQiLyIpWyFSNyo0YCEjNTckJCIwRS0lb15QLkAhIzckIi9bRmxXXS5gISM1NyQ3JCQiMGw9cnQhUi5AISM3JCIvIilbIVI3KjRgISM1NyQkIjB4LXBEME01IyEjNyQiMD5VJ1EmW2VKJiEjNjckNyQkIjAsPiRvNVUuQCEjNyQiMFl3NiVITkFgISM2NyQkIjB4LXBEME01IyEjNyQiMD5VJ1EmW2VKJiEjNjckNyQkIjAsPiRvNVUuQCEjNyQiMFl3NiVITkFgISM2NyQkIjA8dytPTk01IyEjNyQiMGxoXGMjPkdgISM2NyQ3JCQiMDpmX1ReTTUjISM3JCIwI1snPVwkek1gISM2NyQkIjA8dytPTk01IyEjNyQiMGxoXGMjPkdgISM2NyQ3JCQiMDpmX1ReTTUjISM3JCIwI1snPVwkek1gISM2NyQkIjAiMyp6WmxNNSMhIzckIjAsOVNhTzBNJiEjNjckNyQkIjBAL214IlsuQCEjNyQiMD1gRC9Nc00mISM2NyQkIjAiMyp6WmxNNSMhIzckIjAsOVNhTzBNJiEjNjckNyQkIjBAL214IlsuQCEjNyQiMD1gRC9Nc00mISM2NyQkIjA3YCo0Y1wuQCEjNyQiMENCIXkvKUdOJiEjNjckNyQkIjA5X0I6N041IyEjNyQiMGFUS2Z1J2ZgISM2NyQkIjA3YCo0Y1wuQCEjNyQiMENCIXkvKUdOJiEjNjckNyQkIjA5X0I6N041IyEjNyQiMGFUS2Z1J2ZgISM2NyQkIjApMydmdkRONSMhIzckIjBRJypwT0NfTyYhIzY3JDckJCIwJTNdVURhLkAhIzckIi8qSFI5OkBQJiEjNTckJCIwKTMnZnZETjUjISM3JCIwUScqcE9DX08mISM2NyQ3JCQiMCUzXVVEYS5AISM3JCIvKkhSOTpAUCYhIzU3JCQiMCI+LDtmYi5AISM3JCIwWlM0QG92UCYhIzY3JDckJCIwWC15JUhkLkAhIzckIjBFPVlwYlhRJiEjNjckJCIwIj4sO2ZiLkAhIzckIjBaUzRAb3ZQJiEjNjckNyQkIjBYLXklSGQuQCEjNyQiMEU9WXBiWFEmISM2NyQkIjApZlUiNCdlLkAhIzckIjBzQmMrNyoqUSYhIzY3JDckJCIwZkN0Ty5PNSMhIzckIjBpMWBDJypwUiYhIzY3JCQiMClmVSI0J2UuQCEjNyQiMHNCYys3KipRJiEjNjckNyQkIjBmQ3RPLk81IyEjNyQiMGkxYEMnKnBSJiEjNjckJCIwKW9iemloLkAhIzckIjAySiZmZEQtYSEjNjckNyQkIjA6OEEhUWouQCEjNyQiMClcKmZ6TyU0YSEjNjckJCIwKW9iemloLkAhIzckIjAySiZmZEQtYSEjNjckNyQkIjA6OEEhUWouQCEjNyQiMClcKmZ6TyU0YSEjNjckJCIwZT5RW1lPNSMhIzckIjBlNzxZKmY5YSEjNjckNyQkIjA7KEheVW0uQCEjNyQiME0kb1l0KD1VJiEjNjckJCIwZT5RW1lPNSMhIzckIjBlNzxZKmY5YSEjNjckNyQkIjA7KEheVW0uQCEjNyQiME0kb1l0KD1VJiEjNjckJCIwZmA4cXdPNSMhIzckIjBIUzg3VnBVJiEjNjckNyQkIjBYclpyJXAuQCEjNyQiLzxQKCp5Sk1hISM1NyQkIjBmYDhxd081IyEjNyQiMEhTODdWcFUmISM2NyQ3JCQiMFhyWnIlcC5AISM3JCIvPFAoKnlKTWEhIzU3JCQiMHU+SCRwcS5AISM3JCIwZXVmdCdHUmEhIzY3JDckJCIwQlNNPkRQNSMhIzckIjAxZyFbJWVuVyYhIzY3JCQiMHU+SCRwcS5AISM3JCIwZXVmdCdHUmEhIzY3JDckJCIwQlNNPkRQNSMhIzckIjAxZyFbJWVuVyYhIzY3JCQiMCQqPiR6cnQuQCEjNyQiL1YvLi5qXmEhIzU3JDckJCIuO2xvYlA1IyEjNSQiMFVbKCkqKik+ZmEhIzY3JCQiMCQqPiR6cnQuQCEjNyQiL1YvLi5qXmEhIzU3JDckJCIuO2xvYlA1IyEjNSQiMFVbKCkqKik+ZmEhIzY3JCQiLyVvKFJ1dy5AISM2JCIwJClvXSNRKFJZJiEjNjckNyQkIjBwJypSPid5LkAhIzckIjB5TyVcJlI7WiYhIzY3JCQiLyVvKFJ1dy5AISM2JCIwJClvXSNRKFJZJiEjNjckNyQkIjBwJypSPid5LkAhIzckIjB5TyVcJlI7WiYhIzY3JCQiMCpIRTl4ei5AISM3JCIwPWI/STxqWiYhIzY3JDckJCIwRCEpZXI7UTUjISM3JCIwOUQsNSEzJVsmISM2NyQkIjAqSEU5eHouQCEjNyQiMD1iP0k8alomISM2NyQ3JCQiMEQhKWVyO1E1IyEjNyQiMDlELDUhMyVbJiEjNjckJCIwXyxHK0dRNSMhIzckIjBNNVN0ZycpWyYhIzY3JDckJCIwbDdJRFpRNSMhIzckIi9OIjNsP2xcJiEjNTckJCIwXyxHK0dRNSMhIzckIjBNNVN0ZycpWyYhIzY3JDckJCIwbDdJRFpRNSMhIzckIi9OIjNsP2xcJiEjNTckJCIwOi5uSWVRNSMhIzckIjBXL242LzVdJiEjNjckNyQkIjBYelQheShRNSMhIzckIjAnPV0sNycqM2IhIzY3JCQiMDoubkllUTUjISM3JCIwVy9uNi81XSYhIzY3JDckJCIwWHpUIXkoUTUjISM3JCIwJz1dLDcnKjNiISM2NyQkIjAkSEtCJykpUTUjISM3JCIwVD0nZXVNOGIhIzY3JDckJCIvIkcsUDNSNSMhIzYkIjBCIT5fPFNAYiEjNjckJCIwJEhLQicpKVE1IyEjNyQiMFQ9J2V1TThiISM2NyQ3JCQiLyJHLFAzUjUjISM2JCIwQiE+XzxTQGIhIzY3JCQiMCJlJVsmKj1SNSMhIzckIi9qdV8ycERiISM1NyQ3JCQiMCpHaFwqUVI1IyEjNyQiMGZ5R0lVUWAmISM2NyQkIjAiZSVbJio9UjUjISM3JCIvanVfMnBEYiEjNTckNyQkIjAqR2hcKlFSNSMhIzckIjBmeUdJVVFgJiEjNjckJCIwaSQqKipIXFI1IyEjNyQiMF4nPS5TLlFiISM2NyQ3JCQiMHpAW2FwUjUjISM3JCIwJnBjYEdHWWIhIzY3JCQiMGkkKioqSFxSNSMhIzckIjBeJz0uUy5RYiEjNjckNyQkIjB6QFthcFI1IyEjNyQiMCZwY2BHR1liISM2NyQkIjBFMCdmJ3pSNSMhIzckIjA7XHM/eC5iJiEjNjckNyQkIjAqKSopUjorUzUjISM3JCIwSmJVU0IoZWIhIzY3JCQiMEUwJ2YnelI1IyEjNyQiMDtccz94LmImISM2NyQ3JCQiMCopKilSOitTNSMhIzckIjBKYlVTQihlYiEjNjckJCIwTm9LLjVTNSMhIzckIjBgY2lPP0ZjJiEjNjckNyQkIjA5eSV5Mi4vQCEjNyQiMG5WXCZSO3JiISM2NyQkIjBOb0suNVM1IyEjNyQiMGBjaU8/RmMmISM2NyQ3JCQiMDl5JXkyLi9AISM3JCIwblZcJlI7cmIhIzY3JCQiMG0sQlVTUzUjISM3JCIwLiEpZlpqXWQmISM2NyQ3JCQiMGAkKW9UaFM1IyEjNyQiMC5LY10vT2UmISM2NyQkIjBtLEJVU1M1IyEjNyQiMC4hKWZaal1kJiEjNjckNyQkIjBgJClvVGhTNSMhIzckIjAuS2NdL09lJiEjNjckJCIwMWhTIzMyL0AhIzckIjAieipbYTF1ZSYhIzY3JDckJCIwY3QjcD80L0AhIzckIjBSP2owWGdmJiEjNjckJCIwMWhTIzMyL0AhIzckIjAieipbYTF1ZSYhIzY3JDckJCIwY3QjcD80L0AhIzckIjBSP2owWGdmJiEjNjckJCIwVGwpUjc1L0AhIzckIjBPInlvJlwoKmYmISM2NyQ3JCQiMCNvMU9GNy9AISM3JCIwdjNxZyZbM2MhIzY3JCQiMFRsKVI3NS9AISM3JCIwTyJ5byZcKCpmJiEjNjckNyQkIjAjbzFPRjcvQCEjNyQiMHYzcWcmWzNjISM2NyQkIjBaJjRxOzgvQCEjNyQiMFo0a2EjNDdjISM2NyQ3JCQiMFgjZj1NOi9AISM3JCIwNihwZGgjNGkmISM2NyQkIjBaJjRxOzgvQCEjNyQiMFo0a2EjNDdjISM2NyQ3JCQiMFgjZj1NOi9AISM3JCIwNihwZGgjNGkmISM2NyQkIjAnNCNcNmlUNSMhIzckIjAvUXNaTldpJiEjNjckNyQkIjApZj05VD0vQCEjNyQiMFomUTNuT0xjISM2NyQkIjAnNCNcNmlUNSMhIzckIjAvUXNaTldpJiEjNjckNyQkIjApZj05VD0vQCEjNyQiMFomUTNuT0xjISM2NyQkIjAzWkdkIz4vQCEjNyQiMDFnZ095bmomISM2NyQ3JCQiMEZdXiNbQC9AISM3JCIwJFEyZnMhZWsmISM2NyQkIjAzWkdkIz4vQCEjNyQiMDFnZ095bmomISM2NyQ3JCQiMEZdXiNbQC9AISM3JCIwJFEyZnMhZWsmISM2NyQkIjBFeWQvQlU1IyEjNyQiMDRwbj9AIlxjISM2NyQ3JCQiMFlZJlxiQy9AISM3JCIwPmkoNHlDZWMhIzY3JCQiMEV5ZC9CVTUjISM3JCIwNHBuP0AiXGMhIzY3JDckJCIwWVkmXGJDL0AhIzckIjA+aSg0eUNlYyEjNjckJCIwNiZ5Sk5EL0AhIzckIjBoXmIrazltJiEjNjckNyQkIjBKSSQqR3dVNSMhIzckIjBiXS9PKW9xYyEjNjckJCIwNiZ5Sk5EL0AhIzckIjBoXmIrazltJiEjNjckNyQkIjBKSSQqR3dVNSMhIzckIjBiXS9PKW9xYyEjNjckJCIwTjhHLiVHL0AhIzckIjB5b2h2MVFuJiEjNjckNyQkIjApNF9VcUkvQCEjNyQiMCIqUTYiKkdKbyYhIzY3JCQiME44Ry4lRy9AISM3JCIweW9odjFRbiYhIzY3JDckJCIwKTRfVXFJL0AhIzckIjAiKlE2IipHSm8mISM2NyQkIjBIIypvYTlWNSMhIzckIjBcUlxZXGhvJiEjNjckNyQkIjBDOzYieUwvQCEjNyQiMEZGPVlwYnAmISM2NyQkIjBIIypvYTlWNSMhIzckIjBcUlxZXGhvJiEjNjckNyQkIjBDOzYieUwvQCEjNyQiMEZGPVlwYnAmISM2NyQkIjAoKjNnMlhWNSMhIzckIjBWI1xEQFwpcCYhIzY3JDckJCIwRCQ0JGZvVjUjISM3JCIwajpELDUhM2QhIzY3JCQiMCgqM2cyWFY1IyEjNyQiMFYjXERAXClwJiEjNjckNyQkIjBEJDQkZm9WNSMhIzckIjBqOkQsNSEzZCEjNjckJCIwaF55aHZWNSMhIzckIjBAU191TTNyJiEjNjckNyQkIjA2aCIqUSpSL0AhIzckIjAqUj9qMFg/ZCEjNjckJCIwaF55aHZWNSMhIzckIjBAU191TTNyJiEjNjckNyQkIjA2aCIqUSpSL0AhIzckIjAqUj9qMFg/ZCEjNjckJCIwdUZTPDFXNSMhIzckIjBNRyE+dDxCZCEjNjckNyQkIjBiajQ/SVc1IyEjNyQiME4jKlE2IipHdCYhIzY3JCQiMHVGUzwxVzUjISM3JCIwTUchPnQ8QmQhIzY3JDckJCIwYmo0P0lXNSMhIzckIjBOIypRNiIqR3QmISM2NyQkIjBBKClcdU9XNSMhIzckIjBOOWElKT5idCYhIzY3JDckJCIwRVBlLWhXNSMhIzckIjByIWVrO0xYZCEjNjckJCIwQSgpXHVPVzUjISM3JCIwTjlhJSk+YnQmISM2NyQ3JCQiMEVQZS1oVzUjISM3JCIwciFlaztMWGQhIzY3JCQiMHhiKkd0WS9AISM3JCIwWCgzSUIneXUmISM2NyQ3JCQiMCkzNmw9XC9AISM3JCIwMnBfQHN4diYhIzY3JCQiMHhiKkd0WS9AISM3JCIwWCgzSUIneXUmISM2NyQ3JCQiMCkzNmw9XC9AISM3JCIwMnBfQHN4diYhIzY3JCQiLmlwI3pcL0AhIzUkIjBPXChwWj9nZCEjNjckNyQkIjA6aCk+Rl8vQCEjNyQiMFZkZnc3LXgmISM2NyQkIi5pcCN6XC9AISM1JCIwT1wocFo/Z2QhIzY3JDckJCIwOmgpPkZfL0AhIzckIjBWZGZ3Ny14JiEjNjckJCIwKWYyUyZHWDUjISM3JCIwLXA0O1pEeCYhIzY3JDckJCIwLVJ6ZWBYNSMhIzckIjB6WG1KYEV5JiEjNjckJCIwKWYyUyZHWDUjISM3JCIwLXA0O1pEeCYhIzY3JDckJCIwLVJ6ZWBYNSMhIzckIjB6WG1KYEV5JiEjNjckJCIwX2hoO2ZYNSMhIzckIjAsJ2Y1JiopW3kmISM2NyQ3JCQiMHQ1L1olZS9AISM3JCIwOk10J1E0JnomISM2NyQkIjBfaGg7Zlg1IyEjNyQiMCwnZjUmKilbeSYhIzY3JDckJCIwdDUvWiVlL0AhIzckIjA6TXQnUTQmeiYhIzY3JCQiMF5eZyEpKmUvQCEjNyQiMHBmZiI9Qih6JiEjNjckNyQkIjBSYXFPOlk1IyEjNyQiMF5BIT1XYDJlISM2NyQkIjBeXmchKSplL0AhIzckIjBwZmYiPUIoeiYhIzY3JDckJCIwUmFxTzpZNSMhIzckIjBeQSE9V2AyZSEjNjckJCIwWyIqKmYvaS9AISM3JCIwenNpMnUmNGUhIzY3JDckJCIwLjQieWlrL0AhIzckIjAoM3JvXCgqPmUhIzY3JCQiMFsiKipmL2kvQCEjNyQiMHpzaTJ1JjRlISM2NyQ3JCQiMC40Inlpay9AISM3JCIwKDNyb1woKj5lISM2NyQkIjBIeno3Xlk1IyEjNyQiMDtVOkg7PiNlISM2NyQ3JCQiMDtUQz94WTUjISM3JCIwQypSPmJUS2UhIzY3JCQiMEh6ejdeWTUjISM3JCIwO1U6SDs+I2UhIzY3JDckJCIwO1RDP3hZNSMhIzckIjBDKlI+YlRLZSEjNjckJCIwdykpKTM9by9AISM3JCIwKSl5YFllVSRlISM2NyQ3JCQiMDwsQjkzWjUjISM3JCIvdzNxZyZbJWUhIzU3JCQiMHcpKSkzPW8vQCEjNyQiMCkpeWBZZVUkZSEjNjckNyQkIjA8LEI5M1o1IyEjNyQiL3czcWcmWyVlISM1NyQkIjBaYlxdN1o1IyEjNyQiMGo5MWYrbSVlISM2NyQ3JCQiMF84YTRSWjUjISM3JCIwJ2Z4P21IZGUhIzY3JCQiMFpiXF03WjUjISM3JCIwajkxZittJWUhIzY3JDckJCIwXzhhNFJaNSMhIzckIjAnZng/bUhkZSEjNjckJCIwQVdQQFZaNSMhIzckIjB4ZF1uVSplZSEjNjckNyQkIjAxL1IxcVo1IyEjNyQiMEtrOTxQKHBlISM2NyQkIjBBV1BAVlo1IyEjNyQiMHhkXW5VKmVlISM2NyQ3JCQiMDEvUjFxWjUjISM3JCIwS2s5PFAocGUhIzY3JCQiMGhGeCRSeC9AISM3JCIwLiF5NVpHcmUhIzY3JDckJCIwL1ZjLyxbNSMhIzckIjBvX0BzeEApZSEjNjckJCIwaEZ4JFJ4L0AhIzckIjAuIXk1WkdyZSEjNjckNyQkIjAvVmMvLFs1IyEjNyQiMG9fQHN4QCllISM2NyQkIjBcLlluL1s1IyEjNyQiMDxqXnFFTyllISM2NyQ3JCQiMC4ieVQ/JFs1IyEjNyQiMC9UR0Y9WSplISM2NyQkIjBcLlluL1s1IyEjNyQiMDxqXnFFTyllISM2NyQ3JCQiMC4ieVQ/JFs1IyEjNyQiMC9UR0Y9WSplISM2NyQkIjBNcmBVTls1IyEjNyQiME8tXWxvZiplISM2NyQ3JCQiMDsiPV9JJ1s1IyEjNyQiLyVITiMpZXEhZiEjNTckJCIwTXJgVU5bNSMhIzckIjBPLV1sb2YqZSEjNjckNyQkIjA7Ij1fSSdbNSMhIzckIi8lSE4jKWVxIWYhIzU3JCQiMCplSyE+bVs1IyEjNyQiMGZfJGYwSjNmISM2NyQ3JCQiME07ZjIlKls1IyEjNyQiMHc8VVAqXD5mISM2NyQkIjAqZUshPm1bNSMhIzckIjBmXyRmMEozZiEjNjckNyQkIjBNO2YyJSpbNSMhIzckIjB3PFVQKlw+ZiEjNjckJCIwRyMqeidwKls1IyEjNyQiL0glSFVfMSNmISM1NyQ3JCQiMHhEXjZEXDUjISM3JCIwNzFcIypSPiRmISM2NyQkIjBHIyp6J3AqWzUjISM3JCIvSCVIVV8xI2YhIzU3JDckJCIweEReNkRcNSMhIzckIjA3MVwjKlI+JGYhIzY3JCQiMCwkeWd4I1w1IyEjNyQiMHZQIVFVKkgkZiEjNjckNyQkIjAjelRuaCZcNSMhIzckIjBbJWZ2L1FXZiEjNjckJCIwLCR5Z3gjXDUjISM3JCIwdlAhUVUqSCRmISM2NyQ3JCQiMCN6VG5oJlw1IyEjNyQiMFslZnYvUVdmISM2NyQkIjApZl9tJmVcNSMhIzckIjAoPWc2Z0xYZiEjNjckNyQkIjB0N1VCKClcNSMhIzckIjAlR0dFNSNvJmYhIzY3JCQiMClmX20mZVw1IyEjNyQiMCg9ZzZnTFhmISM2NyQ3JCQiMHQ3VUIoKVw1IyEjNyQiMCVHR0U1I28mZiEjNjckJCIweS1pUSopXDUjISM3JCIwJnlbU3huZGYhIzY3JDckJCIwKkhKOiQ9XTUjISM3JCIvNyhwZGgjcGYhIzU3JCQiMHktaVEqKVw1IyEjNyQiMCZ5W1N4bmRmISM2NyQ3JCQiMCpISjokPV01IyEjNyQiLzcocGRoI3BmISM1NyQkIjB1VSk+LS0wQCEjNyQiMGwsWVU+KyhmISM2NyQ3JCQiMEQhXDQlXF01IyEjNyQiMGNmdzctPClmISM2NyQkIjB1VSk+LS0wQCEjNyQiMGwsWVU+KyhmISM2NyQ3JCQiMEQhXDQlXF01IyEjNyQiMGNmdzctPClmISM2NyQkIjAsbWoxXl01IyEjNyQiL2RTbjVPIylmISM1NyQ3JCQiME1LIj0wMzBAISM3JCIwI3pNeUU5JSpmISM2NyQkIjAsbWoxXl01IyEjNyQiL2RTbjVPIylmISM1NyQ3JCQiME1LIj0wMzBAISM3JCIwI3pNeUU5JSpmISM2NyQkIjBMW28jPjMwQCEjNyQiMHVdYW0tWipmISM2NyQ3JCQiMCVmNVQ7NjBAISM3JCIwR08hSEtlMWchIzY3JCQiMExbbyM+MzBAISM3JCIwdV1hbS1aKmYhIzY3JDckJCIwJWY1VDs2MEAhIzckIjBHTyFIS2UxZyEjNjckJCIwMj44IUc2MEAhIzckIjBpVSc9VS8yZyEjNjckNyQkIjAxVCV5RjkwQCEjNyQiMGtDKHpQLT5nISM2NyQkIjAyPjghRzYwQCEjNyQiMGlVJz1VLzJnISM2NyQ3JCQiMDFUJXlGOTBAISM3JCIwa0MoelAtPmchIzY3JCQiMEolKSkqb1ZeNSMhIzckIjA5VG1zJlE+ZyEjNjckNyQkIjBNQy0kUjwwQCEjNyQiLjgvTGs5LichIio3JCQiMEolKSkqb1ZeNSMhIzckIjA5VG1zJlE+ZyEjNjckNyQkIjBNQy0kUjwwQCEjNyQiLjgvTGs5LichIio3JCQiMHRhQ2Z1XjUjISM3JCIwc0soKj1GPC4nISM2NyQ3JCQiMDJ2XTQwXzUjISM3JCIwTyw2KVshUi8nISM2NyQkIjB0YUNmdV41IyEjNyQiMHNLKCo9RjwuJyEjNjckNyQkIjAydl00MF81IyEjNyQiME8sNilbIVIvJyEjNjckJCIwcGV4XTBfNSMhIzckIjAmWyo+aG9TLychIzY3JDckJCIwWCIqSEZPXzUjISM3JCIwcyp5SmFNY2chIzY3JCQiMHBleF0wXzUjISM3JCIwJlsqPmhvUy8nISM2NyQ3JCQiMFgiKkhGT181IyEjNyQiMHMqeUphTWNnISM2NyQkIjA2LGVWT181IyEjNyQiLzxUJCoqNGswJyEjNTckNyQkIi9NcnFsRDBAISM2JCIwIm8rdy5Xa2chIzY3JCQiMDYsZVZPXzUjISM3JCIvPFQkKio0azAnISM1NyQ3JCQiL01ycWxEMEAhIzYkIi9FaTUpcHNzJCEjNjckJCIwXj0lPUBnM0AhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBtRDBVTyI0QCEjNyQiL0VpNSlwc3MkISM2NyQkIjBePSU9QGczQCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL01ycWxEMEAhIzYkIjAibyt3LldrZyEjNjckJCIwbTpjUW5fNSMhIzckIi90LDA4dm9nISM1NyQ3JCQiMF4uQFpuXzUjISM3JCIwM3lDKWZ5b2chIzY3JCQiMG06Y1FuXzUjISM3JCIvdCwwOHZvZyEjNTckNyQkIi9ONXN1RTBAISM2JCIwM3lDKWZ5b2chIzY3JCQiMGM6LE8pSDBAISM3JCIwXHF1YCM0IjMnISM2NyQ3JCQiMEYhWyVwKUgwQCEjNyQiMFdtSmBFNzMnISM2NyQkIjBjOixPKUgwQCEjNyQiMFxxdWAjNCIzJyEjNjckNyQkIjBGIVslcClIMEAhIzckIjBXbUpgRTczJyEjNjckJCIwblcnWyRIYDUjISM3JCIvKFJcc0xNNCchIzU3JDckJCIwZF43JCpIYDUjISM3JCIvWyZRM25PNCchIzU3JCQiMG5XJ1skSGA1IyEjNyQiLyhSXHNMTTQnISM1NyQ3JCQiMGReNyQqSGA1IyEjNyQiL1smUTNuTzQnISM1NyQkIjApMz9eLk8wQCEjNyQiLzxWblt4MGghIzU3JDckJCIwVTpDPWhgNSMhIzckIjA7VlhqMmg1JyEjNjckJCIwKTM/Xi5PMEAhIzckIi88Vm5beDBoISM1NyQ3JCQiMFU6Qz1oYDUjISM3JCIwO1ZYajJoNSchIzY3JCQiLyI0bE8iUjBAISM2JCIwKlwucGY2PWghIzY3JDckJCIwWlNtVyNSMEAhIzckIjBgSl89WyY9aCEjNjckJCIvIjRsTyJSMEAhIzYkIjAqXC5wZjY9aCEjNjckNyQkIjBaU21XI1IwQCEjNyQiMF9KXz1bJj1oISM2NyQkIjAvMGVSQWE1IyEjNyQiME0oeURxWEloISM2NyQ3JCQiL1VERFBVMEAhIzYkIjAqKT5mdCkpNDgnISM2NyQkIjAvMGVSQWE1IyEjNyQiME0oeURxWEloISM2NyQ3JCQiL1VERFBVMEAhIzYkIjAqKT5mdCkpNDgnISM2NyQkIjA3cXlWYGE1IyEjNyQiMDAnZlQhKXpVaCEjNjckNyQkIjBQJCpwLGJhNSMhIzckIjBEM21HSE05JyEjNjckJCIwN3F5VmBhNSMhIzckIjAwJ2ZUISl6VWghIzY3JDckJCIwUCQqcCxiYTUjISM3JCIwRDNtR0hNOSchIzY3JCQiL18oUlwlWzBAISM2JCIwPidRNyFSXjonISM2NyQ3JCQiMDJnSUsnWzBAISM3JCIwaCdIUClwZTonISM2NyQkIi9fKFJcJVswQCEjNiQiMD4nUTchUl46JyEjNjckNyQkIjAyZ0lLJ1swQCEjNyQiMGgnSFApcGU6JyEjNjckJCIwO0lTYzpiNSMhIzckIi9uV1EqenU7JyEjNTckNyQkIjAuKmZWd14wQCEjNyQiMChcKXpRNSRvaCEjNjckJCIwO0lTYzpiNSMhIzckIi9uV1EqenU7JyEjNTckNyQkIjAuKmZWd14wQCEjNyQiMChcKXpRNSRvaCEjNjckJCIwXHlwa1liNSMhIzckIjBEbEojMyMpemghIzY3JDckJCIwQTZzKCpbYjUjISM3JCIwTHQnUTR2IT0nISM2NyQkIjBceXBrWWI1IyEjNyQiMERsSiMzIyl6aCEjNjckNyQkIjBBNnMoKltiNSMhIzckIjBMdCdRNHYhPSchIzY3JCQiMGpzUXV4YjUjISM3JCIwQ25KbWhAPichIzY3JDckJCIwJEg2RC5lMEAhIzckIjBwaCQqWyI+JD4nISM2NyQkIjBqc1F1eGI1IyEjNyQiMENuSm1oQD4nISM2NyQ3JCQiMCRINkQuZTBAISM3JCIwcGgkKlsiPiQ+JyEjNjckJCIwenlZJikzYzUjISM3JCIwLmgmZUNdL2khIzY3JDckJCIvO1IobzZjNSMhIzYkIjAwXSsvS2M/JyEjNjckJCIwenlZJikzYzUjISM3JCIwLmgmZUNdL2khIzY3JDckJCIvO1IobzZjNSMhIzYkIjAwXSsvS2M/JyEjNjckJCIwVjAkeSpSYzUjISM3JCIwYFlHQFZvQCchIzY3JDckJCIwdltHMVZjNSMhIzckIjBUUTJmcyE9aSEjNjckJCIwVjAkeSpSYzUjISM3JCIwYFlHQFZvQCchIzY3JDckJCIwdltHMVZjNSMhIzckIjBUUTJmcyE9aSEjNjckJCIwUCN5OTZuMEAhIzckIjA9R2YjUj1IaSEjNjckNyQkIi9bXl5XbjBAISM2JCIweEU5OTgwQichIzY3JCQiMFAjeTk2bjBAISM3JCIwPUdmI1I9SGkhIzY3JDckJCIvW15eV24wQCEjNiQiMHhFOTk4MEInISM2NyQkIjAmR1ptQXEwQCEjNyQiMFFHLWZDOkMnISM2NyQ3JCQiMDQ7YyZlcTBAISM3JCIwODpAcGBIQychIzY3JCQiMCZHWm1BcTBAISM3JCIwUUctZkM6QychIzY3JDckJCIwNDtjJmVxMEAhIzckIjA4OkBwYEhDJyEjNjckJCIwazcoSE10MEAhIzckIjBEJ1w8XydRRCchIzY3JDckJCIwUGU8RlBkNSMhIzckIjBcLkdDJVJiaSEjNjckJCIwazcoSE10MEAhIzckIjBEJ1w8XydRRCchIzY3JDckJCIwUGU8RlBkNSMhIzckIjBcLkdDJVJiaSEjNjckJCIwaVMiM1l3MEAhIzckIjAkUjEnejBpRSchIzY3JDckJCIwSGtNcW9kNSMhIzckIjAmPVwkek15RSchIzY3JCQiMGlTIjNZdzBAISM3JCIwJFIxJ3owaUUnISM2NyQ3JCQiMEhrTXFvZDUjISM3JCIwJj1cJHpNeUUnISM2NyQkIjBYPSQpeiZ6MEAhIzckIjBHY3BMWSZ5aSEjNjckNyQkIjAsJzNaLCFlNSMhIzckIjBAIT1XYEYhRychIzY3JCQiMFg9JCl6JnowQCEjNyQiMEdjcExZJnlpISM2NyQ3JCQiMCwnM1osIWU1IyEjNyQiMEAhPVdgRiFHJyEjNjckJCIwYCdbLnEjZTUjISM3JCIwNiR5SG8pM0gnISM2NyQ3JCQiMCxcZ2dKZTUjISM3JCIwZG9bKmVyI0gnISM2NyQkIjBgJ1sucSNlNSMhIzckIjA2JHlIbykzSCchIzY3JDckJCIwLFxnZ0plNSMhIzckIjBkb1sqZXIjSCchIzY3JCQiMG9RLUFlZTUjISM3JCIwPm1hR0ZLSSchIzY3JDckJCIwYlJ0MmplNSMhIzckIjAkcGJYazowaiEjNjckJCIwb1EtQWVlNSMhIzckIjA+bWFHRktJJyEjNjckNyQkIjBiUnQyamU1IyEjNyQiMCRwYlhrOjBqISM2NyQkIjBDVkJYKillNSMhIzckIjBeQT5wbmJKJyEjNjckNyQkIjAqZSVSYyUqZTUjISM3JCIwSFhpKnBmPGohIzY3JCQiMENWQlgqKWU1IyEjNyQiMF5BPnBuYkonISM2NyQ3JCQiMCplJVJjJSplNSMhIzckIjBIWGkqcGY8aiEjNjckJCIwWnFncD9mNSMhIzckIjBKNjYxM3pLJyEjNjckNyQkIjAjUl1pZyNmNSMhIzckIjBsTHBhUCtMJyEjNjckJCIwWnFncD9mNSMhIzckIjBKNjYxM3pLJyEjNjckNyQkIjAjUl1pZyNmNSMhIzckIjBsTHBhUCtMJyEjNjckJCIwJFtwYT4mZjUjISM3JCIwPExEUVstTSchIzY3JDckJCIwO1xsZGRmNSMhIzckIjAsQXc0eUNNJyEjNjckJCIwJFtwYT4mZjUjISM3JCIwPExEUVstTSchIzY3JDckJCIwO1xsZGRmNSMhIzckIjAsQXc0eUNNJyEjNjckJCIwJVs9REspZjUjISM3JCIvJTNmbSllX2ohIzU3JDckJCIwJVsiRzUqKWY1IyEjNyQiMFA1JFsnPVxOJyEjNjckJCIwJVs9REspZjUjISM3JCIvJTNmbSllX2ohIzU3JDckJCIwJVsiRzUqKWY1IyEjNyQiMFA1JFsnPVxOJyEjNjckJCIwdyN5NVgsMUAhIzckIjAmMyUzISpHXE8nISM2NyQ3JCQiMEItVms/ZzUjISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwdyN5NVgsMUAhIzckIjAmMyUzISpHXE8nISM2NyQ3JCQiMEItVms/ZzUjISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwQVEhM2UvMUAhIzckIjAmUlIpNHBzUCchIzY3JDckJCIwSHh4Pl9nNSMhIzckIjA0KG9cKCp6emohIzY3JCQiMEFRITNlLzFAISM3JCIwJlJSKTRwc1AnISM2NyQ3JCQiMEh4eD5fZzUjISM3JCIwNChvXCgqenpqISM2NyQkIjAoKWUhPnIyMUAhIzckIjBtND1ENCcqUSchIzY3JDckJCIwekVmdyQzMUAhIzckIjBZdi5JU0FSJyEjNjckJCIwKCllIT5yMjFAISM3JCIwbTQ9RDQnKlEnISM2NyQ3JCQiMHpFZnckMzFAISM3JCIwWXYuSVNBUichIzY3JCQiMEAqUVclM2g1IyEjNyQiMC1VJGYkXD5TJyEjNjckNyQkIjBPKip5TTpoNSMhIzckIjAiUTFeM28vayEjNjckJCIwQCpRVyUzaDUjISM3JCIwLVUkZiRcPlMnISM2NyQ3JCQiME8qKnlNOmg1IyEjNyQiMCJRMV4zby9rISM2NyQkIjA3VUB5Umg1IyEjNyQiMC1VcVUqRzlrISM2NyQ3JCQiMGM5SyVwOTFAISM3JCIwPV88U0ByVCchIzY3JCQiMDdVQHlSaDUjISM3JCIwLVVxVSpHOWshIzY3JDckJCIwYzlLJXA5MUAhIzckIjA9XzxTQHJUJyEjNjckJCIwei9IOHJoNSMhIzckIjAlby1gJUhtVSchIzY3JDckJCIuLj5ieWg1IyEjNSQiMGFTQyY+Y0hrISM2NyQkIjB6L0g4cmg1IyEjNyQiMCVvLWAlSG1VJyEjNjckNyQkIi4uPmJ5aDUjISM1JCIwYVNDJj5jSGshIzY3JCQiMEAueFwtaTUjISM3JCIwczFTVnAqUWshIzY3JDckJCIwVHFZPDVpNSMhIzckIi8qR0pdLT9XJyEjNTckJCIwQC54XC1pNSMhIzckIjBzMVNWcCpRayEjNjckNyQkIjBUcVk8NWk1IyEjNyQiLypHSl0tP1cnISM1NyQkIjBHPV8oUUIxQCEjNyQiMEY2VVA0OFgnISM2NyQ3JCQiMCoqRzMiPUMxQCEjNyQiMEU8UTBWV1gnISM2NyQkIjBHPV8oUUIxQCEjNyQiMEY2VVA0OFgnISM2NyQ3JCQiMCoqRzMiPUMxQCEjNyQiMEU8UTBWV1gnISM2NyQkIjBfIXpsX0UxQCEjNyQiMG5bREZcT1knISM2NyQ3JCQiMFhoK1l0aTUjISM3JCIwaTBYZyQpb1knISM2NyQkIjBfIXpsX0UxQCEjNyQiMG5bREZcT1knISM2NyQ3JCQiMFhoK1l0aTUjISM3JCIwaTBYZyQpb1knISM2NyQkIjB6ZytuJ0gxQCEjNyQiMCZSJ3A3KilmWichIzY3JDckJCIwZiRwQl5JMUAhIzckIjApUj5iVEt6ayEjNjckJCIwemcrbidIMUAhIzckIjAmUidwNyopZlonISM2NyQ3JCQiMGYkcEJeSTFAISM3JCIwKVI+YlRLemshIzY3JCQiMGowdTNHajUjISM3JCIwRWMlUipHJClbJyEjNjckNyQkIjAlZlIrb0wxQCEjNyQiME0jKWVxazxcJyEjNjckJCIwajB1M0dqNSMhIzckIjBFYyVSKkckKVsnISM2NyQ3JCQiMCVmUitvTDFAISM3JCIwTSMpZXFrPFwnISM2NyQkIjBCQiU9JmZqNSMhIzckIjBiMiIzKG8xXSchIzY3JDckJCIweDg2XG9qNSMhIzckIi8yZGNfPy9sISM1NyQkIjBCQiU9JmZqNSMhIzckIjBiMiIzKG8xXSchIzY3JDckJCIweDg2XG9qNSMhIzckIi8yZGNfPy9sISM1NyQkIjAleTlpNFIxQCEjNyQiMFU5Z1YzSV4nISM2NyQ3JCQiMHVuXz4razUjISM3JCIwMWZzIWVrO2whIzY3JCQiMCV5OWk0UjFAISM3JCIwVTlnVjNJXichIzY3JDckJCIwdW5fPitrNSMhIzckIjAxZnMhZWs7bCEjNjckJCIwQnQqPUNVMUAhIzckIjBIOT43W2BfJyEjNjckNyQkIjBmKSlHIj5WMUAhIzckIjBVWnpOJzNIbCEjNjckJCIwQnQqPUNVMUAhIzckIjBIOT43W2BfJyEjNjckNyQkIjBmKSlHIj5WMUAhIzckIjBVWnpOJzNIbCEjNjckJCIwd1IpKilRWDFAISM3JCIwKj16aXhvUGwhIzY3JDckJCIwYCY0V09ZMUAhIzckIjB5TiczcF9UbCEjNjckJCIwd1IpKilRWDFAISM3JCIwKj16aXhvUGwhIzY3JDckJCIwYCY0V09ZMUAhIzckIjB5TiczcF9UbCEjNjckJCIwUTdAUCZbMUAhIzckIjBXJzRudC1dbCEjNjckNyQkIjAsJ0cpUSZcMUAhIzckIjA5QyRmdSdSYichIzY3JCQiMFE3QFAmWzFAISM3JCIwVyc0bnQtXWwhIzY3JDckJCIwLCdHKVEmXDFAISM3JCIwOUMkZnUnUmInISM2NyQkIjB0UShwb14xQCEjNyQiMCoqcEAjcE9pbCEjNjckNyQkIjAiKUhwOUZsNSMhIzckIi9ELDUhM2tjJyEjNTckJCIwdFEocG9eMUAhIzckIjAqKnBAI3BPaWwhIzY3JDckJCIwIilIcDlGbDUjISM3JCIvRCw1ITNrYychIzU3JCQiMFZuKHkkW2w1IyEjNyQiMFcjb1NrcXVsISM2NyQ3JCQiL0s8PSplbDUjISM2JCIwJzNxZyZbKXlsISM2NyQkIjBWbih5JFtsNSMhIzckIjBXI29Ta3F1bCEjNjckNyQkIi9LPD0qZWw1IyEjNiQiMCczcWcmWyl5bCEjNjckJCIwV0g9ISp6bDUjISM3JCIweCg+OWYvKGUnISM2NyQ3JCQiMCRbTy4yZjFAISM3JCIwQSpRNiIqRyJmJyEjNjckJCIwV0g9ISp6bDUjISM3JCIweCg+OWYvKGUnISM2NyQ3JCQiMCRbTy4yZjFAISM3JCIwQSpRNiIqRyJmJyEjNjckJCIwWTF3VjZtNSMhIzckIjAyVnBNJlEqZichIzY3JDckJCIwZHg/XUFtNSMhIzckIjBleD9tSFBnJyEjNjckJCIwWTF3VjZtNSMhIzckIjAyVnBNJlEqZichIzY3JDckJCIwZHg/XUFtNSMhIzckIjBleD9tSFBnJyEjNjckJCIwJHBjJylIazFAISM3JCIwQjt1dEM8aCchIzY3JDckJCIwPWtRSmFtNSMhIzckIjAlZnc3LTw7bSEjNjckJCIwJHBjJylIazFAISM3JCIwQjt1dEM8aCchIzY3JDckJCIwPWtRSmFtNSMhIzckIjAlZnc3LTw7bSEjNjckJCIwOyY0XFhuMUAhIzckIjAwJlElM2tTaSchIzY3JDckJCIwKTNjUmhvMUAhIzckIi9WWGoyaEdtISM1NyQkIjA7JjRcWG4xQCEjNyQiMDAmUSUza1NpJyEjNjckNyQkIjApM2NSaG8xQCEjNyQiL1ZYajJoR20hIzU3JCQiMG9LVjcxbjUjISM3JCIwOS0xUi5raichIzY3JDckJCIwJ2UhKXl6cjFAISM3JCIwbVVUSl41aychIzY3JCQiMG9LVjcxbjUjISM3JCIwOS0xUi5raichIzY3JDckJCIwJ2UhKXl6cjFAISM3JCIwbVVUSl41aychIzY3JCQiLXk3eHQxQCEiKiQiMGppV2xVKFttISM2NyQ3JCQiMEs+NiQpXG41IyEjNyQiMC1KWyc9XGBtISM2NyQkIi15N3h0MUAhIiokIjBqaVdsVShbbSEjNjckNyQkIjBLPjYkKVxuNSMhIzckIjAtSlsnPVxgbSEjNjckJCIwR2FSSnBuNSMhIzckIjB3OXYoPTNobSEjNjckNyQkIi8mKlwncCJ5MUAhIzYkIjBRPmJUS2ZtJyEjNjckJCIwR2FSSnBuNSMhIzckIjB3OXYoPTNobSEjNjckNyQkIi8mKlwncCJ5MUAhIzYkIjBRPmJUS2ZtJyEjNjckJCIwbGB5IzQhbzUjISM3JCIwWmsoZjVVdG0hIzY3JDckJCIwL3hhZDhvNSMhIzckIjB1MmknSFB5bSEjNjckJCIwbGB5IzQhbzUjISM3JCIwWmsoZjVVdG0hIzY3JDckJCIwL3hhZDhvNSMhIzckIjB1MmknSFB5bSEjNjckJCIwMyN6YkQkbzUjISM3JCIwbSkqcD5nZG8nISM2NyQ3JCQiMCdHS29hJW81IyEjNyQiL2gqb144M3AnISM1NyQkIjAzI3piRCRvNSMhIzckIjBtKSpwPmdkbychIzY3JDckJCIwJ0dLb2ElbzUjISM3JCIwNicqb144M3AnISM2NyQkIjB4Xms+a281IyEjNyQiMHNVTUgqNClwJyEjNjckNyQkIjAuSVVQeG81IyEjNyQiMFklZW5TRC5uISM2NyQkIjB4Xms+a281IyEjNyQiMHNVTUgqNClwJyEjNjckNyQkIjAuSVVQeG81IyEjNyQiMFklZW5TRC5uISM2NyQkIjApMyQpXGUqbzUjISM3JCIwZC0iXCRRL3InISM2NyQ3JCQiMCM9dyRINHA1IyEjNyQiMCRHRj1ZcDpuISM2NyQkIjApMyQpXGUqbzUjISM3JCIwZC0iXCRRL3InISM2NyQ3JCQiMCQ9dyRINHA1IyEjNyQiMCRHRj1ZcDpuISM2NyQkIjA7JVw7diNwNSMhIzckIi91O2l0eEFuISM1NyQ3JCQiMEN0akFUcDUjISM3JCIwPmgqb144R24hIzY3JCQiMDslXDt2I3A1IyEjNyQiL3U7aXR4QW4hIzU3JDckJCIwQ3RqQVRwNSMhIzckIjA+aCpvXjhHbiEjNjckJCIwIkdqJz5mcDUjISM3JCIwMUM/TDtedCchIzY3JDckJCIwLi1HPHRwNSMhIzckIjBiXCc+ZGRTbiEjNjckJCIwIkdqJz5mcDUjISM3JCIwMUM/TDtedCchIzY3JDckJCIwLi1HPHRwNSMhIzckIjBiXCc+ZGRTbiEjNjckJCIwQSZbKikzKnA1IyEjNyQiMHM5NkVidXUnISM2NyQ3JCQiMC8mR0teKzJAISM3JCIwInpMcWksYG4hIzY3JCQiMEEmWyopMypwNSMhIzckIjBzOTZFYnV1JyEjNjckNyQkIjAvJkdLXisyQCEjNyQiMCJ6THFpLGBuISM2NyQkIjAmR0wlZkFxNSMhIzckIjBFVjw6JXpmbiEjNjckNyQkIjAjSDUvci4yQCEjNyQiMEZFNSNvWGxuISM2NyQkIjAmR0wlZkFxNSMhIzckIjBFVjw6JXpmbiEjNjckNyQkIjAjSDUvci4yQCEjNyQiMEZFNSNvWGxuISM2NyQkIjApemg3VjAyQCEjNyQiL15HKipIOHNuISM1NyQ3JCQiMGY+LjRwcTUjISM3JCIwajk8UCgqeXgnISM2NyQkIjApemg3VjAyQCEjNyQiL15HKipIOHNuISM1NyQ3JCQiMGY+LjRwcTUjISM3JCIwajk8UCgqeXgnISM2NyQkIjBeSlUvJzMyQCEjNyQiMDEhNC89WiV5JyEjNjckNyQkIjAvMicqMyxyNSMhIzckIjAqSFNBekwheichIzY3JCQiMF5KVS8nMzJAISM3JCIwMSE0Lz1aJXknISM2NyQ3JCQiMC8yJyozLHI1IyEjNyQiMCpIU0F6TCF6JyEjNjckJCIwO2QjKnk8cjUjISM3JCIwdiopZWM1b3onISM2NyQ3JCQiMEFbRTVMcjUjISM3JCIwTiI0dCV5RiFvISM2NyQkIjA7ZCMqeTxyNSMhIzckIjB2KillYzVveichIzY3JDckJCIwQVtFNUxyNSMhIzckIjBOIjR0JXlGIW8hIzY3JCQiMHA4amFccjUjISM3JCIwKEg2KkdcIjRvISM2NyQ3JCQiMEg4KEdeOzJAISM3JCIwcnpQLT5fIm8hIzY3JCQiMHA4amFccjUjISM3JCIwKEg2KkdcIjRvISM2NyQ3JCQiMEg4KEdeOzJAISM3JCIwcnpQLT5fIm8hIzY3JCQiMHdZbkoiPTJAISM3JCIwKFxXcHpbQG8hIzY3JDckJCIwYi1zOyg+MkAhIzckIjAyb1dkZncjbyEjNjckJCIwd1luSiI9MkAhIzckIjAoXFdweltAbyEjNjckNyQkIjBiLXM7KD4yQCEjNyQiMDJvV2RmdyNvISM2NyQkIjBPNyoqNDhzNSMhIzckIjB1XSozbSNRJG8hIzY3JDckJCIvOjM/I0hzNSMhIzYkIjBWY143KywlbyEjNjckJCIwTzcqKjQ4czUjISM3JCIwdV0qM20jUSRvISM2NyQ3JCQiLzozPyNIczUjISM2JCIwVmNeNyssJW8hIzY3JCQiMGg0ZSpbQzJAISM3JCIwMUx3P2xoJW8hIzY3JDckJCIwaSJRJkdoczUjISM3JCIweldlblNEJm8hIzY3JCQiMGg0ZSpbQzJAISM3JCIwMUx3P2xoJW8hIzY3JDckJCIwaSJRJkdoczUjISM3JCIweldlblNEJm8hIzY3JCQiMEV4XXF3czUjISM3JCIwJ1FXalBdZW8hIzY3JDckJCIwciRSa0xIMkAhIzckIjA6TGxBIilcJ28hIzY3JCQiMEV4XXF3czUjISM3JCIwJ1FXalBdZW8hIzY3JDckJCIwciRSa0xIMkAhIzckIjA6TGxBIilcJ28hIzY3JCQiMGVocV8zdDUjISM3JCIwR3oleUElMyhvISM2NyQ3JCQiMD5yclhEdDUjISM3JCIwXkBzeEB1KG8hIzY3JCQiMGVocV8zdDUjISM3JCIwR3oleUElMyhvISM2NyQ3JCQiMD5yclhEdDUjISM3JCIwXkBzeEB1KG8hIzY3JCQiMChvWWkuTTJAISM3JCIuIltdMj0kKW8hIio3JDckJCIwVTRCY2R0NSMhIzckIjAoKTR6S2kpKilvISM2NyQkIjAob1lpLk0yQCEjNyQiLiJbXTI9JClvISIqNyQ3JCQiMFU0QmNkdDUjISM3JCIwKCk0ektpKSopbyEjNjckJCIweCopKTRBUDJAISM3JCIwJSlbUj0+YipvISM2NyQ3JCQiMFdKN28qUTJAISM3JCIwQilmeUdJLXAhIzY3JCQiMHgqKSk0QVAyQCEjNyQiMCUpW1I9PmIqbyEjNjckNyQkIjBXSjdvKlEyQCEjNyQiMEIpZnlHSS1wISM2NyQkIi86dnFTUzJAISM2JCIwc0RWZGR5IXAhIzY3JDckJCIwKCkpWzc9VTJAISM3JCIwZidHSE11OXAhIzY3JCQiLzp2cVNTMkAhIzYkIjBzRFZkZHkhcCEjNjckNyQkIjAoKSlbNz1VMkAhIzckIjBmJ0dITXU5cCEjNjckJCIwbDBPJWZWMkAhIzckIjBaXGkjZj4/cCEjNjckNyQkIi8mW3YmUlgyQCEjNiQiMCZcKCp6Uj1GcCEjNjckJCIwbDBPJWZWMkAhIzckIjBaXGkjZj4/cCEjNjckNyQkIi8mW3YmUlgyQCEjNiQiMCZcKCp6Uj1GcCEjNjckJCIvbCIqSHlZMkAhIzYkIjAoXC1OVWBLcCEjNjckNyQkIjAjKXpjNidbMkAhIzckIjBKajFgQydScCEjNjckJCIvbCIqSHlZMkAhIzYkIjAoXC1OVWBLcCEjNjckNyQkIjAjKXpjNidbMkAhIzckIjBKajFgQydScCEjNjckJCIwY2EqRygqXDJAISM3JCIvOCpIXXNbJXAhIzU3JDckJCIvNilvRz12NSMhIzYkIjBuXjgzbD8mcCEjNjckJCIwY2EqRygqXDJAISM3JCIvOCpIXXNbJXAhIzU3JDckJCIvNilvRz12NSMhIzYkIjBuXjgzbD8mcCEjNjckJCIuPTJrSnY1IyEjNSQiMEphLHQ1cyZwISM2NyQ3JCQiMGhdNlpddjUjISM3JCIwLlM/ajBYJ3AhIzY3JCQiLj0ya0p2NSMhIzUkIjBKYSx0NXMmcCEjNjckNyQkIjBoXTZaXXY1IyEjNyQiMC5TP2owWCdwISM2NyQkIi4wX2NqdjUjISM1JCIwJSk+bCIqWyZwcCEjNjckNyQkIjA5IkdwRWUyQCEjNyQiMFJHRj1ZcChwISM2NyQkIi4wX2NqdjUjISM1JCIwJSk+bCIqWyZwcCEjNjckNyQkIjA5IkdwRWUyQCEjNyQiMFJHRj1ZcChwISM2NyQkIjAuMUtdJmYyQCEjNyQiMEZgJmZxKT0pcCEjNjckNyQkIjAqR3B6W2gyQCEjNyQiMHY7TXQnUSopcCEjNjckJCIwLjFLXSZmMkAhIzckIjBGYCZmcSk9KXAhIzY3JDckJCIwKkdweltoMkAhIzckIjB2O010J1EqKXAhIzY3JCQiMFpYSlhGdzUjISM3JCIwIm9Ja15BJSpwISM2NyQ3JCQiMHBuSjVadzUjISM3JCIwNjBUR0Y9KyghIzY3JCQiMFpYSlhGdzUjISM3JCIwIm9Ja15BJSpwISM2NyQ3JCQiMHBuSjVadzUjISM3JCIwNjBUR0Y9KyghIzY3JCQiMCpIIWVUZnc1IyEjNyQiMFIhR0dLYzFxISM2NyQ3JCQiMERKME16dzUjISM3JCIwWyR6TXlFOXEhIzY3JCQiMCpIIWVUZnc1IyEjNyQiMFIhR0dLYzFxISM2NyQ3JCQiMERKME16dzUjISM3JCIwWyR6TXlFOXEhIzY3JCQiMFgsP1IicDJAISM3JCIwaU4pWzchKj1xISM2NyQ3JCQiMCd6OCFmNng1IyEjNyQiMCU9WyZRM24tKCEjNjckJCIwWCw/UiJwMkAhIzckIjBpTilbNyEqPXEhIzY3JDckJCIwJ3o4IWY2eDUjISM3JCIwJT1bJlEzbi0oISM2NyQkIjAkPml6THMyQCEjNyQiMHRtRkJSNy4oISM2NyQ3JCQiMFF3SiZRdTJAISM3JCIvLTxPKlsiUnEhIzU3JCQiMCQ+aXpMczJAISM3JCIwdG1GQlI3LighIzY3JDckJCIwUXdKJlF1MkAhIzckIi8tPE8qWyJScSEjNTckJCIwcyFIIlFieDUjISM3JCIwZV87PHhOLyghIzY3JDckJCIwOT4qR2h4MkAhIzckIjBjZW9bKmVecSEjNjckJCIwcyFIIlFieDUjISM3JCIwZV87PHhOLyghIzY3JDckJCIwOT4qR2h4MkAhIzckIjBjZW9bKmVecSEjNjckJCIwJ1skW1IoeTJAISM3JCIwbmdDMjpmMCghIzY3JDckJCIwcChlPSUzeTUjISM3JCIwI3BhUCsua3EhIzY3JCQiMCdbJFtSKHkyQCEjNyQiMG5nQzI6ZjAoISM2NyQ3JCQiMHAoZT0lM3k1IyEjNyQiMCNwYVArLmtxISM2NyQkIjAoZSY+VT55NSMhIzckIjBATihISERvcSEjNjckNyQkIjBmWy9zU3k1IyEjNyQiMEdOIyllcWsyKCEjNjckJCIwKGUmPlU+eTUjISM3JCIwQE4oSEhEb3EhIzY3JDckJCIwZlsvc1N5NSMhIzckIjBHTiMpZXFrMighIzY3JCQiMCo9XGc5Jnk1IyEjNyQiMDMzL3YhZiEzKCEjNjckNyQkIjBYQWUudHk1IyEjNyQiMGtCKlE2IiopMyghIzY3JCQiMCo9XGc5Jnk1IyEjNyQiMDMzL3YhZiEzKCEjNjckNyQkIjBYQWUudHk1IyEjNyQiMGtCKlE2IiopMyghIzY3JCQiMHVvSV4kKXk1IyEjNyQiMHNmZ19HSDQoISM2NyQ3JCQiMGwwUU8wejUjISM3JCIuNycqb144NSghIio3JCQiMHVvSV4kKXk1IyEjNyQiMHNmZ19HSDQoISM2NyQ3JCQiMGwwUU8wejUjISM3JCIuNycqb144NSghIio3JCQiL3IweGIiejUjISM2JCIwKjM3bGlFMHIhIzY3JDckJCIvRE0weCR6NSMhIzYkIjBPKy5DI3o4ciEjNjckJCIvcjB4YiJ6NSMhIzYkIjAqMzdsaUUwciEjNjckNyQkIjBcVWBxUHo1IyEjNyQiME8rLkMjejhyISM2NyQkIjBhIzNidyV6NSMhIzckIjAlRzxmUmc8ciEjNjckNyQkIjBbbi4xcXo1IyEjNyQiMHMpKTR6S2k3KCEjNjckJCIwYSMzYnclejUjISM3JCIwJUc8ZlJnPHIhIzY3JDckJCIwW24uMXF6NSMhIzckIjBzKSk0ektpNyghIzY3JCQiMCR6Vlgoeno1IyEjNyQiMFEqbzg7JSpIciEjNjckNyQkIjA2TXJVLSEzQCEjNyQiMDN4O010J1FyISM2NyQkIjAkelZYKHp6NSMhIzckIjBRKm84OyUqSHIhIzY3JDckJCIwNk1yVS0hM0AhIzckIjAzeDtNdCdRciEjNjckJCIwNC13JT0sM0AhIzckIjByVC5CekE5KCEjNjckNyQkIjBGbHAhWy4zQCEjNyQiMFdsQipRNl5yISM2NyQkIjA0LXclPSwzQCEjNyQiMHJULkJ6QTkoISM2NyQ3JCQiMEZscCFbLjNAISM3JCIwV2xCKlE2XnIhIzY3JCQiMEolW2lSLzNAISM3JCIwPTlpIW9oYXIhIzY3JDckJCIwaj0zP24hM0AhIzckIi9RMFZXYmpyISM1NyQkIjBKJVtpUi8zQCEjNyQiMD05aSFvaGFyISM2NyQ3JCQiMGo9Mz9uITNAISM3JCIvUTBWV2JqciEjNTckJCIvcy4iNHchM0AhIzYkIi9CRFFWJnA7KCEjNTckNyQkIjBzJXkxJyo0M0AhIzckIjA7VVAqXCpmPCghIzY3JCQiL3MuIjR3ITNAISM2JCIvQkRRViZwOyghIzU3JDckJCIwcyV5MScqNDNAISM3JCIwO1VQKlwqZjwoISM2NyQkIjAmNE9KIzMiM0AhIzckIjBzWkQkPUh6ciEjNjckNyQkIjBqInpFPzgzQCEjNyQiMF9JV2FOJSk9KCEjNjckJCIwJjRPSiMzIjNAISM3JCIwc1pEJD1IenIhIzY3JDckJCIwaiJ6RT84M0AhIzckIjBfSVdhTiUpPSghIzY3JCQiMEpPXVFTIjNAISM3JCIwKD0uJUdIOz4oISM2NyQ3JCQiL1RiZVc7M0AhIzYkIjApKT1eNHczPyghIzY3JCQiMEpPXVFTIjNAISM3JCIwKD0uJUdIOz4oISM2NyQ3JCQiL1RiZVc7M0AhIzYkIjApKT1eNHczPyghIzY3JCQiMDF6L2JzIjNAISM3JCIwWCV5KHBtUj8oISM2NyQ3JCQiMHIlUi5wPjNAISM3JCIwQzJlaztMQCghIzY3JCQiMDF6L2JzIjNAISM3JCIwWCV5KHBtUj8oISM2NyQ3JCQiMHIlUi5wPjNAISM3JCIwQzJlaztMQCghIzY3JCQiMCl6JypHWj8zQCEjNyQiMDcwKHBTSTtzISM2NyQ3JCQiMEtAO09IIzNAISM3JCIvY1wnPmRkQSghIzU3JCQiMCl6JypHWj8zQCEjNyQiMDcwKHBTSTtzISM2NyQ3JCQiMEtAO09IIzNAISM3JCIvY1wnPmRkQSghIzU3JCQiL2BiPnBCM0AhIzYkIjAkRyRHU1QnR3MhIzY3JDckJCIwZC5CJD1FM0AhIzckIjAnUj1aeD5RcyEjNjckJCIvYGI+cEIzQCEjNiQiMCRHJEdTVCdHcyEjNjckNyQkIjBkLkIkPUUzQCEjNyQiMCdSPVp4PlFzISM2NyQkIi9fPUIicCMzQCEjNiQiMDpTVHB5NEMoISM2NyQ3JCQiMFVvakolSDNAISM3JCIwS3N5SFExRCghIzY3JCQiL189QiJwIzNAISM2JCIwOlNUcHk0QyghIzY3JDckJCIwVW9qSiVIM0AhIzckIjBLc3lIUTFEKCEjNjckJCIwZFMmUjhJM0AhIzckIi9Sa1dmSmBzISM1NyQ3JCQiMCpwWDdvSzNAISM3JCIwb2cmWyl5SUUoISM2NyQkIjBkUyZSOEkzQCEjNyQiL1JrV2ZKYHMhIzU3JDckJCIwKnBYN29LM0AhIzckIjBvZyZbKXlJRSghIzY3JCQiMHUxdGNMJDNAISM3JCIwVmYmZUpsbHMhIzY3JDckJCIwaydRQSRmJDNAISM3JCIwL1wjKlI+YkYoISM2NyQkIjB1MXRjTCQzQCEjNyQiMFZmJmVKbGxzISM2NyQ3JCQiMGsnUUEkZiQzQCEjNyQiMC9cIypSPmJGKCEjNjckJCIwJnAlKTNlTzNAISM3JCIwPjQkRy4qekYoISM2NyQ3JCQiMHJPViU9UjNAISM3JCIvdSQqXCpmekcoISM1NyQkIjAmcCUpM2VPM0AhIzckIjA+NCRHLip6RighIzY3JDckJCIwck9WJT1SM0AhIzckIi91JCpcKmZ6RyghIzU3JCQiMDxtPzEpUjNAISM3JCIwdjUxWUYuSCghIzY3JDckJCIwOmAkelZVM0AhIzckIjB3RDFdKy9JKCEjNjckJCIwPG0/MSlSM0AhIzckIjB2NTFZRi5IKCEjNjckNyQkIjA6YCR6VlUzQCEjNyQiMHdEMV0rL0koISM2NyQkIi9RK0cuVjNAISM2JCIwTkpAYmtFSSghIzY3JDckJCIwRU11I3BYM0AhIzckIjA4OTgwVEdKKCEjNjckJCIvUStHLlYzQCEjNiQiME5KQGJrRUkoISM2NyQ3JCQiMEVNdSNwWDNAISM3JCIwODk4MFRHSighIzY3JCQiMDNJa2dpJTNAISM3JCIwcjJPZyxdSighIzY3JDckJCIwamQkKVsqWzNAISM3JCIwXC0/ZyJHRHQhIzY3JCQiMDNJa2dpJTNAISM3JCIwcjJPZyxdSighIzY3JDckJCIwamQkKVsqWzNAISM3JCIwXC0/ZyJHRHQhIzY3JCQiMDAkZigqW1wzQCEjNyQiL1hDOSdRdEsoISM1NyQ3JCQiMGBrQjFBJjNAISM3JCIwJjNwX0BzUHQhIzY3JCQiMDAkZigqW1wzQCEjNyQiL1hDOSdRdEsoISM1NyQ3JCQiMF9rQjFBJjNAISM3JCIwJjNwX0BzUHQhIzY3JCQiMCI0XCxzXzNAISM3JCIwVlpTZXYnUnQhIzY3JDckJCIwQ2AlXFliM0AhIzckIjBAekxxaSxOKCEjNjckJCIwIjRcLHNfM0AhIzckIjBWWlNldidSdCEjNjckNyQkIjBDYCVcWWIzQCEjNyQiMEB6THFpLE4oISM2NyQkIi8+Nz0mZiYzQCEjNiQiMENBSV43P04oISM2NyQ3JCQiMCpmW1tzZTNAISM3JCIwZG5TRC5FTyghIzY3JCQiLz43PSZmJjNAISM2JCIwQ0FJXjc/TighIzY3JDckJCIwKmZbW3NlM0AhIzckIjBkblNELkVPKCEjNjckJCIwKD08WT1mM0AhIzckIjBsI1EwJVxWTyghIzY3JDckJCIwJSkpUmcpPiczQCEjNyQiMCRmdi9RL3Z0ISM2NyQkIjAoPTxZPWYzQCEjNyQiMGwjUTAlXFZPKCEjNjckNyQkIjAlKSlSZyk+JzNAISM3JCIwJGZ2L1EvdnQhIzY3JCQiMF5ecD1DJzNAISM3JCIwKGYjcEQnb3d0ISM2NyQ3JCQiMGUpUSZbXyczQCEjNyQiMEhXYU4lWyhRKCEjNjckJCIwXl5wPUMnM0AhIzckIjAoZiNwRCdvd3QhIzY3JDckJCIwZSlRJltfJzNAISM3JCIwSFdhTiVbKFEoISM2NyQkIjAvZi9hYyczQCEjNyQiMCN6bG5JLSpRKCEjNjckNyQkIi9OWEJebzNAISM2JCIwbEtoIVwjKipSKCEjNjckJCIwL2YvYWMnM0AhIzckIjAjemxuSS0qUSghIzY3JDckJCIvTlhCXm8zQCEjNiQiMGxLaCFcIyoqUighIzY3JCQiMExUbCEqKW8zQCEjNyQiLyZwIVEpZjhTKCEjNTckNyQkIjBzb0t4PCgzQCEjNyQiMCxAb1hsQlQoISM2NyQkIjBMVGwhKilvM0AhIzckIi8mcCFRKWY4UyghIzU3JDckJCIwc29LeDwoM0AhIzckIjAsQG9YbEJUKCEjNjckJCIwYVFWR0AoM0AhIzckIjB5PDRkJ3A4dSEjNjckNyQkIjAvenVWXSgzQCEjNyQiMFA0disxW1UoISM2NyQkIjBhUVZHQCgzQCEjNyQiMHk8NGQncDh1ISM2NyQ3JCQiMC96dVZdKDNAISM3JCIwUDR2KzFbVSghIzY3JCQiMEVnZG5gKDNAISM3JCIwdHorRUxnVSghIzY3JDckJCIvZko4SnkzQCEjNiQiMHQoPmVsQ1B1ISM2NyQkIjBFZ2RuYCgzQCEjNyQiMHR6K0VMZ1UoISM2NyQ3JCQiL2ZKOEp5M0AhIzYkIjB0KD5lbENQdSEjNjckJCIwYnIpeWd5M0AhIzckIjBsZjwiKnAkUXUhIzY3JDckJCIwKEhOLWUiKTNAISM3JCIwNCcpKTNyb1x1ISM2NyQkIjBicil5Z3kzQCEjNyQiMGxmPCIqcCRRdSEjNjckNyQkIjAoSE4tZSIpM0AhIzckIjA0JykpM3JvXHUhIzY3JCQiMFclZiVcPSkzQCEjNyQiMC8sSV8xMlgoISM2NyQ3JCQiMCVSOC4mWykzQCEjNyQiMFh1JmZ3N2l1ISM2NyQkIjBXJWYlXD0pM0AhIzckIjAvLElfMTJYKCEjNjckNyQkIjAlUjguJlspM0AhIzckIjBYdSZmdzdpdSEjNjckJCIwRlQ9IzQmKTNAISM3JCIwXCJIKDRWSVkoISM2NyQ3JCQiMEEhKXBAIikpM0AhIzckIjAiR0U1I29YWighIzY3JCQiMEZUPSM0JikzQCEjNyQiMFwiSCg0VklZKCEjNjckNyQkIjBBISlwQCIpKTNAISM3JCIwIkdFNSNvWFooISM2NyQkIjBCPTxPJCkpM0AhIzckIjAzJTNKJ3pgWighIzY3JDckJCIwRzlRJVIiKjNAISM3JCIwPF40dzNxWyghIzY3JCQiMEI9PE8kKSkzQCEjNyQiMDMlM0onemBaKCEjNjckNyQkIjBHOVElUiIqM0AhIzckIjA8XjR3M3FbKCEjNjckJCIwLkpWImUiKjNAISM3JCIweFJTNzt4WyghIzY3JDckJCIwaEtQb1kqM0AhIzckIjBgUjtKXCUqXCghIzY3JCQiMC5KViJlIiozQCEjNyQiMHhSUzc7eFsoISM2NyQ3JCQiMGhLUG9ZKjNAISM3JCIwYFI7SlwlKlwoISM2NyQkIjAjem56I1sqM0AhIzckIjBDa2hkXytdKCEjNjckNyQkIjBKa2FWeiozQCEjNyQiMCp5S2kpKik9XighIzY3JCQiMCN6bnojWyozQCEjNyQiMENraGRfK10oISM2NyQ3JCQiMEprYVZ6KjNAISM3JCIwKnlLaSkqKT1eKCEjNjckJCIwXFhrdiEpKjNAISM3JCIwJSlvOyoqKVE3diEjNjckNyQkIjBQNy0/NyE0QCEjNyQiMEQ7SVRJVl8oISM2NyQkIjBcWGt2ISkqM0AhIzckIjAlKW87KiopUTd2ISM2NyQ3JCQiMFA3LT83ITRAISM3JCIwRDtJVElWXyghIzY3JCQiMHRWZkM4ITRAISM3JCIwPGBqT0RaXyghIzY3JDckJCIwelIheVwvNEAhIzckIjBoL1AnNHhPdiEjNjckJCIwdFZmQzghNEAhIzckIjA8YGpPRFpfKCEjNjckNyQkIjB6UiF5XC80QCEjNyQiMGgvUCc0eE92ISM2NyQkIjBAUyJbZC80QCEjNyQiMD5ALnFocWAoISM2NyQ3JCQiMEtBd3d4ITRAISM3JCIwKEhSOTpAXHYhIzY3JCQiMEBTIltkLzRAISM3JCIwPkAucWhxYCghIzY3JDckJCIwS0F3d3ghNEAhIzckIjAoSFI5OkBcdiEjNjckJCIwLSV6aCN5ITRAISM3JCIwJj1iKCp6Ulx2ISM2NyQ3JCQiMHMlZnIwNjRAISM3JCIwTCIzbD9saHYhIzY3JCQiMC0lemgjeSE0QCEjNyQiMCY9YigqelJcdiEjNjckNyQkIjBzJWZyMDY0QCEjNyQiMEwiM2w/bGh2ISM2NyQkIjAvdyUqeTUiNEAhIzckIjB1LClcVXRodiEjNjckNyQkIjBtRDBVTyI0QCEjNyQiMHJ3OXleOWQoISM2NyQkIjAvdyUqeTUiNEAhIzckIjB1LClcVXRodiEjNjckNyQkIjBtRDBVTyI0QCEjNyQiL0VpNSlwc3MkISM2NyQkIjB5SSNvPls3QCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCR6THFpLDhAISM3JCIvRWk1KXBzcyQhIzY3JCQiMHlJI28+WzdAISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbUQwVU8iNEAhIzckIjBydzl5XjlkKCEjNjckJCIwKSlbNkxWIjRAISM3JCIwcyE+ZC8ydXYhIzY3JDckJCIweEYkKlFWIjRAISM3JCIwcHBkaCM0dXYhIzY3JCQiMCkpWzZMViI0QCEjNyQiMHMhPmQvMnV2ISM2NyQ3JCQiMHhGJCpRViI0QCEjNyQiMHBwZGgjNHV2ISM2NyQkIjApNEAsZjw0QCEjNyQiMCQ0YnRsUydlKCEjNjckNyQkIjB1T1BCdyI0QCEjNyQiMDBlaztMbGUoISM2NyQkIjApNEAsZjw0QCEjNyQiMCQ0YnRsUydlKCEjNjckNyQkIjB1T1BCdyI0QCEjNyQiMDBlaztMbGUoISM2NyQkIi8iKm8jWzMjNEAhIzYkIjBCMUxsVSgpZighIzY3JDckJCIvNiEqKjM0IzRAISM2JCIwVFlycnQqKWYoISM2NyQkIi8iKm8jWzMjNEAhIzYkIjBCMUxsVSgpZighIzY3JDckJCIvNiEqKjM0IzRAISM2JCIwVFlycnQqKWYoISM2NyQkIjByOWMyVCM0QCEjNyQiMHNianB5NWgoISM2NyQ3JCQiMChwInkmPkM0QCEjNyQiMHlNeUU5OWgoISM2NyQkIjByOWMyVCM0QCEjNyQiMHNianB5NWgoISM2NyQ3JCQiMChwInkmPkM0QCEjNyQiMHlNeUU5OWgoISM2NyQkIjBvLkRvdCM0QCEjNyQiME1LWXA5TWkoISM2NyQ3JCQiMFUiM1NbRjRAISM3JCIwOUImPVsmUWkoISM2NyQkIjBvLkRvdCM0QCEjNyQiME1LWXA5TWkoISM2NyQ3JCQiMFUiM1NbRjRAISM3JCIwOUImPVsmUWkoISM2NyQkIjBzTzNJMSQ0QCEjNyQiMDY5aWxdZGooISM2NyQ3JCQiMDhJVHQyJDRAISM3JCIvOkBwYEhPdyEjNTckJCIwc08zSTEkNEAhIzckIjA2OWlsXWRqKCEjNjckNyQkIjA4SVR0MiQ0QCEjNyQiLzpAcGBIT3chIzU3JCQiMEtYMSQqUSQ0QCEjNyQiMDArNWUnM1t3ISM2NyQ3JCQiMEQmKipSMU00QCEjNyQiMCcpKiopPmZ0W3chIzY3JCQiMEtYMSQqUSQ0QCEjNyQiMDArNWUnM1t3ISM2NyQ3JCQiMEQmKipSMU00QCEjNyQiMCcpKiopPmZ0W3chIzY3JCQiMDgkPnQ6UDRAISM3JCIwTFFcWUEvbSghIzY3JDckJCIwJSpwKWVOUDRAISM3JCIwQSllcWs8aHchIzY3JCQiMDgkPnQ6UDRAISM3JCIwTFFcWUEvbSghIzY3JDckJCIwJSpwKWVOUDRAISM3JCIwQSllcWs8aHchIzY3JCQiMCh5UUdVUzRAISM3JCIwJ1tLMyRlRm4oISM2NyQ3JCQiMCc0IjNcMSU0QCEjNyQiMGV3Ny08T24oISM2NyQkIjAoeVFHVVM0QCEjNyQiMCdbSzMkZUZuKCEjNjckNyQkIjAnNCIzXDElNEAhIzckIjBldzctPE9uKCEjNjckJCIwRyczJipvVjRAISM3JCIwVURbNiU0Jm8oISM2NyQ3JCQiMC0lXE0lUiU0QCEjNyQiMCVcJz5kZGdvKCEjNjckJCIwRyczJipvVjRAISM3JCIwVURbNiU0Jm8oISM2NyQ3JCQiMC0lXE0lUiU0QCEjNyQiMCVcJz5kZGdvKCEjNjckJCIwODFXZHAlNEAhIzckIjAkZiYzKSlIdXAoISM2NyQ3JCQiL1pOIlJzJTRAISM2JCIvTGxBIilcKXAoISM1NyQkIjA4MVdkcCU0QCEjNyQiMCRmJjMpKUh1cCghIzY3JDckJCIvWk4iUnMlNEAhIzYkIi9MbEEiKVwpcCghIzU3JCQiMDdzYEUtJjRAISM3JCIwb1YmNGN3NHghIzY3JDckJCIwLV4pZmBdNEAhIzckIjBtVExuUTRyKCEjNjckJCIwN3NgRS0mNEAhIzckIjBvViY0Y3c0eCEjNjckNyQkIjAtXilmYF00QCEjNyQiMG1UTG5RNHIoISM2NyQkIjBYQClvXGA0QCEjNyQiMDsvIylILEBzKCEjNjckNyQkIjBAVzpNUSY0QCEjNyQiMC1JU0F6THMoISM2NyQkIjBYQClvXGA0QCEjNyQiMDsvIylILEBzKCEjNjckNyQkIjBAVzpNUSY0QCEjNyQiMC1JU0F6THMoISM2NyQkIjBOQl5vbiY0QCEjNyQiMGBgYyVwVk14ISM2NyQ3JCQiMCUpcGhMciY0QCEjNyQiMFE9Wng+ZXQoISM2NyQkIjBOQl5vbiY0QCEjNyQiMGBgYyVwVk14ISM2NyQ3JCQiMCUpcGhMciY0QCEjNyQiMFE9Wng+ZXQoISM2NyQkIjA+VEdUKyc0QCEjNyQiMEMpXGNEeFl4ISM2NyQ3JCQiMDsqb1VWZzRAISM3JCIwdTFhS2cjW3ghIzY3JCQiMD5UR1QrJzRAISM3JCIwQylcY0R4WXghIzY3JDckJCIwOypvVVZnNEAhIzckIjB1MWFLZyNbeCEjNjckJCIwYiVHYEpqNEAhIzckIjA+Umw3MyJmeCEjNjckNyQkIjBCOkBPUCc0QCEjNyQiL140dzNxZ3ghIzU3JCQiMGIlR2BKajRAISM3JCIwPlJsNzMiZnghIzY3JDckJCIwQjpAT1AnNEAhIzckIi9eNHczcWd4ISM1NyQkIjBlU14hZm00QCEjNyQiMCdmKSpmT1dyeCEjNjckNyQkIjBRYU1ScSc0QCEjNyQiMFkkeUU5OXR4ISM2NyQkIjBlU14hZm00QCEjNyQiMCdmKSpmT1dyeCEjNjckNyQkIjBRYU1ScSc0QCEjNyQiMFkkeUU5OXR4ISM2NyQkIjBwKGZvJylwNEAhIzckIjBVTWk6elB5KCEjNjckNyQkIjAoKVFuVi4oNEAhIzckIjAjPVp4PmUmeSghIzY3JCQiMHAoZm8nKXA0QCEjNyQiMFVNaTp6UHkoISM2NyQ3JCQiMCgpUW5WLig0QCEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwVih6Vzl0NEAhIzckIjBEQztoOWh6KCEjNjckNyQkIjA2OUhcTyg0QCEjNyQiMD1nIkdELSl6KCEjNjckJCIwVih6Vzl0NEAhIzckIjBEQztoOWh6KCEjNjckNyQkIjA2OUhcTyg0QCEjNyQiMD1nIkdELSl6KCEjNjckJCIwJWZfTFV3NEAhIzckIjBAVG8tXSUzeSEjNjckNyQkIjBuVz5jcCg0QCEjNyQiMGFbKXlJWTV5ISM2NyQkIjAlZl9MVXc0QCEjNyQiMEBUby1dJTN5ISM2NyQ3JCQiMG5XPmNwKDRAISM3JCIwYVspeUlZNXkhIzY3JCQiMGZnTy4oejRAISM3JCIwI1xbMGF5P3khIzY3JDckJCIwOGFKay0pNEAhIzckIi9wYEhPIUgjeSEjNTckJCIwZmdPLih6NEAhIzckIjAjXFswYXk/eSEjNjckNyQkIjA4YUprLSk0QCEjNyQiL3BgSE8hSCN5ISM1NyQkIjAoW3VZKUgpNEAhIzckIjBFMUV1P0okeSEjNjckNyQkIjBzOnN0Tik0QCEjNyQiMEVELT1XYCR5ISM2NyQkIjAoW3VZKUgpNEAhIzckIjBFMUV1P0okeSEjNjckNyQkIjBzOnN0Tik0QCEjNyQiMEVELT1XYCR5ISM2NyQkIjA+YTduaSk0QCEjNyQiMHgkNFZnWFh5ISM2NyQ3JCQiMGtASSUpbyk0QCEjNyQiMGk4NHQleVp5ISM2NyQkIjA+YTduaSk0QCEjNyQiMHgkNFZnWFh5ISM2NyQ3JCQiMGtASSUpbyk0QCEjNyQiMGk4NHQleVp5ISM2NyQkIjApcD0yYiopNEAhIzckIjBaX3BJInpkeSEjNjckNyQkIjBBSjMnPiEqNEAhIzckIjApPmciR0QtJ3khIzY3JCQiMClwPTJiKik0QCEjNyQiMFpfcEkiemR5ISM2NyQ3JCQiMEFKMyc+ISo0QCEjNyQiMCk+ZyJHRC0neSEjNjckJCIvQiZlTkcqNEAhIzYkIjAmXCkqSGw3cXkhIzY3JDckJCIwUmE5NE4qNEAhIzckIjBNIUhLZW1zeSEjNjckJCIvQiZlTkcqNEAhIzYkIjAmXCkqSGw3cXkhIzY3JDckJCIwUmE5NE4qNEAhIzckIjBNIUhLZW1zeSEjNjckJCIwenBwQGgqNEAhIzckIjA3ITQ4PFkjKXkhIzY3JDckJCIwLVJeQm8qNEAhIzckIjByeUhRMV4peSEjNjckJCIwenBwQGgqNEAhIzckIjA3ITQ4PFkjKXkhIzY3JDckJCIwLVJeQm8qNEAhIzckIjByeUhRMV4peSEjNjckJCIwTXQoKjMlKio0QCEjNyQiMF5DKGVveiUqeSEjNjckNyQkIjBZYzNSLCs2IyEjNyQiMDFuTyRwYSgqeSEjNjckJCIwTXQoKjMlKio0QCEjNyQiMF5DKGVveiUqeSEjNjckNyQkIjBZYzNSLCs2IyEjNyQiMDFuTyRwYSgqeSEjNjckJCIwbSVIdXAtNUAhIzckIjBXJ3ltPjgyeiEjNjckNyQkIjA5TCRlWC41QCEjNyQiMFZiVlsoKSo0eiEjNjckJCIwbSVIdXAtNUAhIzckIjBXJ3ltPjgyeiEjNjckNyQkIjA5TCRlWC41QCEjNyQiMFZiVlsoKSo0eiEjNjckJCIwNF83KClmKzYjISM3JCIwaHNcLm4lPnohIzY3JDckJCIwIj5kUXgxNUAhIzckIjB6Vl0uR0MjeiEjNjckJCIwNF83KClmKzYjISM3JCIwaHNcLm4lPnohIzY3JDckJCIwIj5kUXgxNUAhIzckIjB6Vl0uR0MjeiEjNjckJCIwREInekY0NUAhIzckIjA7aGwxLT0keiEjNjckNyQkIjB6czMkNDU1QCEjNyQiMDpLZGVvWyR6ISM2NyQkIjBEQid6RjQ1QCEjNyQiMDtobDEtPSR6ISM2NyQ3JCQiMHpzMyQ0NTVAISM3JCIwOktkZW9bJHohIzY3JCQiMHBTKCpwRCw2IyEjNyQiMCllW2dxOFd6ISM2NyQ3JCQiMDxvXzhNLDYjISM3JCIwXj9rODR0JXohIzY3JCQiMHBTKCpwRCw2IyEjNyQiMCllW2dxOFd6ISM2NyQ3JCQiMDxvXzhNLDYjISM3JCIwXj9rODR0JXohIzY3JCQiMDosRWplLDYjISM3JCIvMmI4P1pjeiEjNTckNyQkIjBgZT9Obiw2IyEjNyQiMCgpM3JvXChmeiEjNjckJCIwOixFamUsNiMhIzckIi8yYjg/WmN6ISM1NyQ3JCQiMGBlP05uLDYjISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjBaT2xkIj41QCEjNyQiMF8vNiRwISlveiEjNjckNyQkIjB2LThlKy02IyEjNyQiMEIoelAtPnN6ISM2NyQkIjBaT2xkIj41QCEjNyQiMF8vNiRwISlveiEjNjckNyQkIjB2LThlKy02IyEjNyQiMEIoelAtPnN6ISM2NyQkIjBtY05gQy02IyEjNyQiMEstbiE9OSIpeiEjNjckNyQkIjBHbksjUUI1QCEjNyQiMGYmWyl5SVkpeiEjNjckJCIwbWNOYEMtNiMhIzckIjBLLW4hPTkiKXohIzY3JDckJCIwR25LI1FCNUAhIzckIjBmJlspeUlZKXohIzY3JCQiMHovP11kLTYjISM3JCIuZGNrd00qeiEiKjckNyQkIjBRISlwMm4tNiMhIzckIjAmUjxSODIoKnohIzY3JCQiMHovP11kLTYjISM3JCIuZGNrd00qeiEiKjckNyQkIjBRISlwMm4tNiMhIzckIjAmUjxSODIoKnohIzY3JCQiMEp6PVshSDVAISM3JCIwYHR6VzZlKykhIzY3JDckJCIwInAkR00rLjYjISM3JCIwSmkpKik9XjQhKSEjNjckJCIwSno9WyFINUAhIzckIjBgdHpXNmUrKSEjNjckNyQkIjAicCRHTSsuNiMhIzckIjBKaSkqKT1eNCEpISM2NyQkIjBjKVt1TUs1QCEjNyQiMHZjJTRpOT0hKSEjNjckNyQkIjA5djhpTC42IyEjNyQiMG5dMFdfPi0pISM2NyQkIjBjKVt1TUs1QCEjNyQiMHZjJTRpOT0hKSEjNjckNyQkIjA5djhpTC42IyEjNyQiMG5dMFdfPi0pISM2NyQkIjAoNF95a041QCEjNyQiMDo3ViQ0W0khKSEjNjckNyQkIjBUZDsicE81QCEjNyQiMC5SNypIUk0hKSEjNjckJCIwKDRfeWtONUAhIzckIjA6N1YkNFtJISkhIzY3JDckJCIwVGQ7InBPNUAhIzckIjAuUjcqSFJNISkhIzY3JCQiMHdoW1wqUTVAISM3JCIwTCwoPmMiRy8pISM2NyQ3JCQiMEEuXUArLzYjISM3JCIwUkY+YUxvLykhIzY3JCQiMHdoW1wqUTVAISM3JCIwTCwoPmMiRy8pISM2NyQ3JCQiMEEuXUArLzYjISM3JCIwUkY+YUxvLykhIzY3JCQiMFFNSV9BLzYjISM3JCIwSl9yRV1eMCkhIzY3JDckJCIwaUowYEwvNiMhIzckIjB2OkU0dSNmISkhIzY3JCQiMFFNSV9BLzYjISM3JCIwSl9yRV1eMCkhIzY3JDckJCIwaUowYEwvNiMhIzckIjB2OkU0dSNmISkhIzY3JCQiMG9xSWNiLzYjISM3JCIwKUhjd1tbbiEpISM2NyQ3JCQiMD1BeSZvWTVAISM3JCIwNi9Mazk8MikhIzY3JCQiMG9xSWNiLzYjISM3JCIwKUhjd1tbbiEpISM2NyQ3JCQiMD1BeSZvWTVAISM3JCIwNi9Mazk8MikhIzY3JCQiL2hhOScpWzVAISM2JCIwbyVIXCU+KXohKSEjNjckNyQkIjBWdG8+KzA2IyEjNyQiMFojKlI+YlQzKSEjNjckJCIvaGE5JylbNUAhIzYkIjBvJUhcJT4peiEpISM2NyQ3JCQiMFZ0bz4rMDYjISM3JCIwWiMqUj5iVDMpISM2NyQkIjAzLCR5O181QCEjNyQiMGNfRSlSOiM0KSEjNjckNyQkIjAySCZbTmA1QCEjNyQiMCQzb1dkZic0KSEjNjckJCIwMywkeTtfNUAhIzckIjBjX0UpUjojNCkhIzY3JDckJCIwMkgmW05gNUAhIzckIjAkM29XZGYnNCkhIzY3JCQiLyhwTXZhMDYjISM2JCIwPDgleiUpWy8iKSEjNjckNyQkIjBqMUMicGM1QCEjNyQiMD5wYEhPITQiKSEjNjckJCIvKHBNdmEwNiMhIzYkIjA8OCV6JSlbLyIpISM2NyQ3JCQiMGoxQyJwYzVAISM3JCIwPnBgSE8hNCIpISM2NyQkIjBDUzAleWU1QCEjNyQiMCMzLFFII282KSEjNjckNyQkIjBsUSYpRysxNiMhIzckIjBiZGclb1pAIikhIzY3JCQiMENTMCV5ZTVAISM3JCIwIzMsUUgjbzYpISM2NyQ3JCQiMGxRJilHKzE2IyEjNyQiMGJkZyVvWkAiKSEjNjckJCIwKUhOUzRpNUAhIzckIjBBXmROZCJIIikhIzY3JDckJCIwVVxubkwxNiMhIzckIjAiZnUnUjxSOCkhIzY3JCQiMClITlM0aTVAISM3JCIwQV5kTmQiSCIpISM2NyQ3JCQiMFVcbm5MMTYjISM3JCIwImZ1J1I8UjgpISM2NyQkIi93R11TbDVAISM2JCIwTU81dSJcVCIpISM2NyQ3JCQiMDE3azJuMTYjISM3JCIwRk11JXpOWSIpISM2NyQkIi93R11TbDVAISM2JCIwTU81dSJcVCIpISM2NyQ3JCQiMDE3azJuMTYjISM3JCIwRk11JXpOWSIpISM2NyQkIjA7WlA8KG81QCEjNyQiME5hSDNFUTopISM2NyQ3JCQiMCV5JioqWysyNiMhIzckIjBqQSIpXCl6ZSIpISM2NyQkIjA7WlA8KG81QCEjNyQiME5hSDNFUTopISM2NyQ3JCQiMCV5JioqWysyNiMhIzckIjBqQSIpXCl6ZSIpISM2NyQkIjA3cyQzLnM1QCEjNyQiMDNyISpRZ2g7KSEjNjckNyQkIjBITFIiUnQ1QCEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMDdzJDMuczVAISM3JCIwM3IhKlFnaDspISM2NyQ3JCQiMEhMUiJSdDVAISM3JCIwKjQiKVshUjc8KSEjNjckJCIwJVFtYU12NUAhIzckIjAoKXl4bCVceSIpISM2NyQ3JCQiMCl5KDRObjI2IyEjNyQiME4qXCpmek89KSEjNjckJCIwJVFtYU12NUAhIzckIjAoKXl4bCVceSIpISM2NyQ3JCQiMCl5KDRObjI2IyEjNyQiME4qXCpmek89KSEjNjckJCIwa2lAaCd5NUAhIzckIjB1XjAqKUczPikhIzY3JDckJCIwNyNlKnorMzYjISM3JCIwcig9XSw3Jz4pISM2NyQkIjBraUBoJ3k1QCEjNyQiMHVeMCopRzM+KSEjNjckNyQkIjA3I2UqeiszNiMhIzckIjByKD1dLDcnPikhIzY3JCQiMEU7Q3k+MzYjISM3JCIwKW9VIzNqSj8pISM2NyQ3JCQiMFJVLEVNMzYjISM3JCIwM3czcWcmMyMpISM2NyQkIjBFO0N5PjM2IyEjNyQiMClvVSMzako/KSEjNjckNyQkIjBSVSxFTTM2IyEjNyQiMDN3M3FnJjMjKSEjNjckJCIweGtVJ0gmMzYjISM3JCIwY0JyQihcOiMpISM2NyQ3JCQiMDpuUHRuMzYjISM3JCIwV2s6RCw1QSkhIzY3JCQiMHhrVSdIJjM2IyEjNyQiMGNCckIoXDojKSEjNjckNyQkIjA6blB0bjM2IyEjNyQiMFdrOkQsNUEpISM2NyQkIjB6I1FkaCkzNiMhIzckIjA2Jm9iOCR5QSkhIzY3JDckJCIwJFxUPTchNDYjISM3JCIvR0QtPVdMIykhIzU3JCQiMHojUWRoKTM2IyEjNyQiMDYmb2I4JHlBKSEjNjckNyQkIjAkXFQ9NyE0NiMhIzckIi9HRC09V0wjKSEjNTckJCIwSFxFTz40NiMhIzckIjA5JEhOYTtTIykhIzY3JDckJCIvcDk7WiQ0NiMhIzYkIjA7VEhOIyllQykhIzY3JCQiMEhcRU8+NDYjISM3JCIwOSRITmE7UyMpISM2NyQ3JCQiL3A5O1okNDYjISM2JCIwO1RITiMpZUMpISM2NyQkIjBgWCp6RCY0NiMhIzckIjBSR2paKlxfIykhIzY3JDckJCIvOWtEI280NiMhIzYkIjBfSE8hSEtlIykhIzY3JCQiMGBYKnpEJjQ2IyEjNyQiMFJHaloqXF8jKSEjNjckNyQkIi85a0QjbzQ2IyEjNiQiMF9ITyFIS2UjKSEjNjckJCIvKHonM2UpNDYjISM2JCIwWylvIVtMW0UpISM2NyQ3JCQiMCdwKm91LDU2IyEjNyQiMCl5SmFNd3EjKSEjNjckJCIvKHonM2UpNDYjISM2JCIwWylvIVtMW0UpISM2NyQ3JCQiMCdwKm91LDU2IyEjNyQiMCl5SmFNd3EjKSEjNjckJCIwRl0pWyE+NTYjISM3JCIwSnkkW3U7eCMpISM2NyQ3JCQiMDg3KnpfLjZAISM3JCIwQzFdKy9LRykhIzY3JCQiMEZdKVshPjU2IyEjNyQiMEp5JFt1O3gjKSEjNjckNyQkIjA4Nyp6Xy42QCEjNyQiMEMxXSsvS0cpISM2NyQkIjA4PTZJXzU2IyEjNyQiMHl5c1AsJipHKSEjNjckNyQkIjBQMGcjKW81NiMhIzckIjBoJXBiWGsmSCkhIzY3JCQiMDg9NklfNTYjISM3JCIweXlzUCwmKkcpISM2NyQ3JCQiMFAwZyMpbzU2IyEjNyQiMGglcGJYayZIKSEjNjckJCIwMC5bYyYzNkAhIzckIjAoNGRwXyQ9SSkhIzY3JDckJCIwUE5EUS02NiMhIzckIjAoSFExXjMzJCkhIzY3JCQiMDAuW2MmMzZAISM3JCIwKDRkcF8kPUkpISM2NyQ3JCQiMFBORFEtNjYjISM3JCIwKEhRMV4zMyQpISM2NyQkIi9OIipSKT02NiMhIzYkIjB1Rl83cFRKKSEjNjckNyQkIjBUU0AmZjg2QCEjNyQiMExycWxEMEspISM2NyQkIi9OIipSKT02NiMhIzYkIjB1Rl83cFRKKSEjNjckNyQkIjBUU0AmZjg2QCEjNyQiMExycWxEMEspISM2NyQkIjBfNnI3XzY2IyEjNyQiME1FQCVIXUUkKSEjNjckNyQkIjByIT5NJnA2NiMhIzckIjBwZng/bUhMKSEjNjckJCIwXzZyN182NiMhIzckIjBNRUAlSF1FJCkhIzY3JDckJCIwciE+TSZwNjYjISM3JCIwcGZ4P21ITCkhIzY3JCQiMDpIa1UmPTZAISM3JCIwKVI7P24kKVEkKSEjNjckNyQkIi9KSkZKPzZAISM2JCIwMFslZW5TWCQpISM2NyQkIjA6SGtVJj02QCEjNyQiMClSOz9uJClRJCkhIzY3JDckJCIvSkpGSj82QCEjNiQiMDBbJWVuU1gkKSEjNjckJCIwOCVcTyg9NzYjISM3JCIwd1NQWXE2TikhIzY3JDckJCIwbStIdE83NiMhIzckIjBUTyI0dCV5TikhIzY3JCQiMDglXE8oPTc2IyEjNyQiMHdTUFlxNk4pISM2NyQ3JCQiMG0rSHRPNzYjISM3JCIwVE8iNHQleU4pISM2NyQkIjAnSEhmP0Q2QCEjNyQiMDEoW21UXWokKSEjNjckNyQkIjA8YTNOcTc2IyEjNyQiMHhDKWZ5R3EkKSEjNjckJCIwJ0hIZj9ENkAhIzckIjAxKFttVF1qJCkhIzY3JDckJCIwPGEzTnE3NiMhIzckIjB4QylmeUdxJCkhIzY3JCQiMDhLSFImRzZAISM3JCIwTXVXJHkkZVApISM2NyQ3JCQiMDl0KnpSSTZAISM3JCIwODgwVEdGUSkhIzY3JCQiMDhLSFImRzZAISM3JCIwTXVXJHkkZVApISM2NyQ3JCQiMDl0KnpSSTZAISM3JCIwODgwVEdGUSkhIzY3JCQiMGgpZVEoPTg2IyEjNyQiMG9HUllyIilRKSEjNjckNyQkIjBESzlpUDg2IyEjNyQiLzo/aCpvXlIpISM1NyQkIjBoKWVRKD04NiMhIzckIjBvR1JZciIpUSkhIzY3JDckJCIwREs5aVA4NiMhIzckIi86P2gqb15SKSEjNTckJCIwJFw1JjRfODYjISM3JCIvOmNlXV0rJSkhIzU3JDckJCIwJ28ydTdQNkAhIzckIjAnKSopPV40d1MpISM2NyQkIjAkXDUmNF84NiMhIzckIi86Y2VdXSslKSEjNTckNyQkIjAnbzJ1N1A2QCEjNyQiMCcpKik9XjR3UykhIzY3JCQiMClIaGphUTZAISM3JCIwVFZaaFFHVCkhIzY3JDckJCIvcyEpUlxTNkAhIzYkIjBBeUQxXStVKSEjNjckJCIwKUhoamFRNkAhIzckIjBUVlpoUUdUKSEjNjckNyQkIi9zISlSXFM2QCEjNiQiMEF5RDFdK1UpISM2NyQkIjBMM1YlKT05NiMhIzckIjBLWj04c15VKSEjNjckNyQkIjBSLXRoUTk2IyEjNyQiMGVtS2ghXEslKSEjNjckJCIwTDNWJSk9OTYjISM3JCIwS1o9OHNeVSkhIzY3JDckJCIwUi10aFE5NiMhIzckIjBlbUtoIVxLJSkhIzY3JCQiMFpVa0JfOTYjISM3JCIwTHRBaDB2VikhIzY3JDckJCIwc21kSXM5NiMhIzckIjAlXCZSO0pcVykhIzY3JCQiMFpVa0JfOTYjISM3JCIwTHRBaDB2VikhIzY3JDckJCIwc21kSXM5NiMhIzckIjAlXCZSO0pcVykhIzY3JCQiMCg+QVJjWzZAISM3JCIwWmwmZSFSKVwlKSEjNjckNyQkIjAlZXgxZ102QCEjNyQiL0xrOTxQZCUpISM1NyQkIjAoPkFSY1s2QCEjNyQiMFpsJmUhUilcJSkhIzY3JDckJCIwJWV4MWddNkAhIzckIi9Mazk8UGQlKSEjNTckJCIwKnlAYSE+OjYjISM3JCIwRSdvbEM8aSUpISM2NyQ3JCQiMGZpLnNSOjYjISM3JCIwbUpgRTcpcCUpISM2NyQkIjAqeUBhIT46NiMhIzckIjBFJ29sQzxpJSkhIzY3JDckJCIwZmkuc1I6NiMhIzckIjBtSmBFNylwJSkhIzY3JCQiL0NZIltfOjYjISM2JCIwY0tOJGVddSUpISM2NyQ3JCQiMHUtXFd0OjYjISM3JCIwLj9nIkdEI1spISM2NyQkIi9DWSJbXzo2IyEjNiQiMGNLTiRlXXUlKSEjNjckNyQkIjB1LVxXdDo2IyEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwXk8kPmZlNkAhIzckIjBjJkhuIlJvWykhIzY3JDckJCIwYCs3PTI7NiMhIzckIjBSM25PJHAlXCkhIzY3JCQiMF5PJD5mZTZAISM3JCIwYyZIbiJSb1spISM2NyQ3JCQiMGArNz0yOzYjISM3JCIwUjNuTyRwJVwpISM2NyQkIjAjPWtvJD47NiMhIzckIjAmXFNrQzwqXCkhIzY3JDckJCIwJmY1STRrNkAhIzckIjB2J1I8UjgyJikhIzY3JCQiMCM9a28kPjs2IyEjNyQiMCZcU2tDPCpcKSEjNjckNyQkIjAmZjVJNGs2QCEjNyQiMHYnUjxSODImKSEjNjckJCIwKltBSUdsNkAhIzckIjBKWUBzMDpeKSEjNjckNyQkIjAsKnkhcHU7NiMhIzckIjA2JjNvV2Q+JikhIzY3JCQiMCpbQUlHbDZAISM3JCIwSllAczA6XikhIzY3JDckJCIwLCp5IXB1OzYjISM3JCIwNiYzb1dkPiYpISM2NyQkIjAjb3Euam82QCEjNyQiMGFNPCUqUVFfKSEjNjckNyQkIjBiPUdZMzw2IyEjNyQiMFp0KD1dLEsmKSEjNjckJCIwI29xLmpvNkAhIzckIjBhTTwlKlFRXykhIzY3JDckJCIwYj1HWTM8NiMhIzckIjBadCg9XSxLJikhIzY3JCQiMCd5SSh5Pjw2IyEjNyQiME53KUdAPE8mKSEjNjckNyQkIjBuSHFDVTw2IyEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwJ3lJKHk+PDYjISM3JCIwTncpR0A8TyYpISM2NyQ3JCQiMG5IcUNVPDYjISM3JCIwJD1ZcGJYVyYpISM2NyQkIjAmZUAkR2A8NiMhIzckIjBcY2xGMCZbJikhIzY3JDckJCIwOjlJL3c8NiMhIzckIjA+XSw3JypvYikhIzY3JCQiMCZlQCRHYDw2IyEjNyQiMFxjbEYwJlsmKSEjNjckNyQkIjA6OUkvdzw2IyEjNyQiMD5dLDcnKm9iKSEjNjckJCIwKipwMHoneTZAISM3JCIwOE52UVEzYykhIzY3JDckJCIwY3EyJik0PTYjISM3JCIwYlEzbk8kcCYpISM2NyQkIjAqKnAweid5NkAhIzckIjA4TnZRUTNjKSEjNjckNyQkIjBjcTImKTQ9NiMhIzckIjBiUTNuTyRwJikhIzY3JCQiMHVyKDQuIz02IyEjNyQiMClcX2c5PHQmKSEjNjckNyQkIi4ncHFPJT02IyEjNSQiMCNwX0BzeCJlKSEjNjckJCIwdXIoNC4jPTYjISM3JCIwKVxfZzk8dCYpISM2NyQ3JCQiLidwcU8lPTYjISM1JCIwI3BfQHN4ImUpISM2NyQkIjBNLSslUSY9NiMhIzckIjBOXiIpXC9iZSkhIzY3JDckJCIwWSEpPl14PTYjISM3JCIwRzpBeDxVZikhIzY3JCQiME0tKyVRJj02IyEjNyQiME5eIilcL2JlKSEjNjckNyQkIjBZISk+XXg9NiMhIzckIjBHOkF4PFVmKSEjNjckJCIwZXU7USgpPTYjISM3JCIwbiE0KlxQeWYpISM2NyQ3JCQiMGNLXU02PjYjISM3JCIway5IS2VtZykhIzY3JCQiMGV1O1EoKT02IyEjNyQiMG4hNCpcUHlmKSEjNjckNyQkIjBjS11NNj42IyEjNyQiMGsuSEtlbWcpISM2NyQkIjAlcHlNNCM+NiMhIzckIjB5WkxZcSxoKSEjNjckNyQkIjAoMyYpKj5YPjYjISM3JCIuI2Z0KSk0PicpISIqNyQkIjAlcHlNNCM+NiMhIzckIjB5WkxZcSxoKSEjNjckNyQkIjAoMyYpKj5YPjYjISM3JCIuI2Z0KSk0PicpISIqNyQkIjAjekwqXGE+NiMhIzckIi92IzRSLkRpKSEjNTckNyQkIjAmKipSbiF6PjYjISM3JCIwTyFHQyVSOmopISM2NyQkIjAjekwqXGE+NiMhIzckIi92IzRSLkRpKSEjNTckNyQkIjAmKipSbiF6PjYjISM3JCIwTyFHQyVSOmopISM2NyQkIjBtJ0d3ISkpPjYjISM3JCIwV2EoeWkkW2opISM2NyQ3JCQiMCh5dlhILDdAISM3JCIwc29cKCp6UmspISM2NyQkIjBtJ0d3ISkpPjYjISM3JCIwV2EoeWkkW2opISM2NyQ3JCQiMCh5dlhILDdAISM3JCIwc29cKCp6UmspISM2NyQkIjBtQFBtQD82IyEjNyQiMG9kSDhwcmspISM2NyQ3JCQiMHR4ZSRvLzdAISM3JCIwM2RjXz9rbCkhIzY3JCQiMG1AUG1APzYjISM3JCIwb2RIOHByaykhIzY3JDckJCIwdHhlJG8vN0AhIzckIjAzZGNfP2tsKSEjNjckJCIweSFmaV8wN0AhIzckIjAnelxdPl1mJykhIzY3JDckJCIvImV4dCEzN0AhIzYkIjBYWGoyaClvJykhIzY3JCQiMHkhZmlfMDdAISM3JCIwJ3pcXT5dZicpISM2NyQ3JCQiLyJleHQhMzdAISM2JCIwWFhqMmgpbycpISM2NyQkIjBeIypHKCkpMzdAISM3JCIwNiFRSlokPW4pISM2NyQ3JCQiMFc0Q2w5QDYjISM3JCIwIlEuRjtJIm8pISM2NyQkIjBeIypHKCkpMzdAISM3JCIwNiFRSlokPW4pISM2NyQ3JCQiMFc0Q2w5QDYjISM3JCIwIlEuRjtJIm8pISM2NyQkIi82aiZcQUA2IyEjNiQiL1RRc3U7JW8pISM1NyQ3JCQiMC09eWRbQDYjISM3JCIwPEF4PFVQcCkhIzY3JCQiLzZqJlxBQDYjISM2JCIvVFFzdTslbykhIzU3JDckJCIwLT15ZFtANiMhIzckIjA8QXg8VVBwKSEjNjckJCIwJlshKUdoOjdAISM3JCIwREcqeixdJ3ApISM2NyQ3JCQiMCVHKVxeIz03QCEjNyQiMGA1JUdGPTEoKSEjNjckJCIwJlshKUdoOjdAISM3JCIwREcqeixdJ3ApISM2NyQ3JCQiMCVHKVxeIz03QCEjNyQiMGA1JUdGPTEoKSEjNjckJCIwUEdKeCo9N0AhIzckIjA+QDwmRyQpMygpISM2NyQ3JCQiMHVJT1k7QTYjISM3JCIwKikpNHpLaT0oKSEjNjckJCIwUEdKeCo9N0AhIzckIjA+QDwmRyQpMygpISM2NyQ3JCQiMHVJT1k7QTYjISM3JCIwKikpNHpLaT0oKSEjNjckJCIvI28iSE1BN0AhIzYkIjBPWWZbbDZzKSEjNjckNyQkIjBIOlZVXUE2IyEjNyQiMEQoeUhRMUooKSEjNjckJCIvI28iSE1BN0AhIzYkIjBPWWZbbDZzKSEjNjckNyQkIjBIOlZVXUE2IyEjNyQiMEQoeUhRMUooKSEjNjckJCIwXHhqNGRBNiMhIzckIjA8ZFYzKVxMKCkhIzY3JDckJCIwYHN2UiVHN0AhIzckIjBodi9RL051KSEjNjckJCIwXHhqNGRBNiMhIzckIjA8ZFYzKVxMKCkhIzY3JDckJCIwYHN2UiVHN0AhIzckIjBodi9RL051KSEjNjckJCIwSCY0dzJIN0AhIzckIjA0Z0VrSWV1KSEjNjckNyQkIjBjWDpRPUI2IyEjNyQiMChSO0pcJWZ2KSEjNjckJCIwSCY0dzJIN0AhIzckIjA0Z0VrSWV1KSEjNjckNyQkIjBjWDpRPUI2IyEjNyQiMChSO0pcJWZ2KSEjNjckJCIwKCpSa1lDQjYjISM3JCIwUikpbztqImUoKSEjNjckNyQkIjBLO3ZQX0I2IyEjNyQiME1fPVsmUW8oKSEjNjckJCIwKCpSa1lDQjYjISM3JCIwUikpbztqImUoKSEjNjckNyQkIjBLO3ZQX0I2IyEjNyQiME1fPVsmUW8oKSEjNjckJCIvUCl6O2VCNiMhIzYkIjBeMl9sJlxxKCkhIzY3JDckJCIwJDMtJlEnUTdAISM3JCIvMmFLZyMzeSkhIzU3JCQiL1ApejtlQjYjISM2JCIwXjJfbCZccSgpISM2NyQ3JCQiMCQzLSZRJ1E3QCEjNyQiLzJhS2cjM3kpISM1NyQkIjAwZjIpPVI3QCEjNyQiMClIXjIiR0d5KSEjNjckNyQkIjBPIzQvL1U3QCEjNyQiMDFIS2VtS3opISM2NyQkIjAwZjIpPVI3QCEjNyQiMClIXjIiR0d5KSEjNjckNyQkIjBPIzQvL1U3QCEjNyQiMDFIS2VtS3opISM2NyQkIjBNJz4wY1U3QCEjNyQiMCpcVUEwOyZ6KSEjNjckNyQkIjAjKj1TVmFDNiMhIzckIjBVPFI4MmQhKSkhIzY3JCQiME0nPjBjVTdAISM3JCIwKlxVQTA7JnopISM2NyQ3JCQiMCMqPVNWYUM2IyEjNyQiMFU8UjgyZCEpKSEjNjckJCIwIlEmKlIkZkM2IyEjNyQiMCdlQy9IXDIpKSEjNjckNyQkIjBVRm9aKVs3QCEjNyQiMHkwWW9aIj0pKSEjNjckJCIwIlEmKlIkZkM2IyEjNyQiMCdlQy9IXDIpKSEjNjckNyQkIjBVRm9aKVs3QCEjNyQiMHkwWW9aIj0pKSEjNjckJCIwIip6cTMkXDdAISM3JCIvdFNZXyMpPikpISM1NyQ3JCQiMFJMN2BBRDYjISM3JCIwOSVITiMpZUkpKSEjNjckJCIwIip6cTMkXDdAISM3JCIvdFNZXyMpPikpISM1NyQ3JCQiMFJMN2BBRDYjISM3JCIwOSVITiMpZUkpKSEjNjckJCIwa2tjJW9fN0AhIzckIjBARj1iZEAkKSkhIzY3JDckJCIvW0UnZmNENiMhIzYkIi9EKWZ5R0klKSkhIzU3JCQiMGtrYyVvXzdAISM3JCIwQEY9YmRAJCkpISM2NyQ3JCQiL1tFJ2ZjRDYjISM2JCIvRClmeUdJJSkpISM1NyQkIjAoUWI5MWM3QCEjNyQiMEExVSMpKltXKSkhIzY3JDckJCIwaEpVbiFmN0AhIzckIjAoM25PJHBhJikpISM2NyQkIjAoUWI5MWM3QCEjNyQiMEExVSMpKltXKSkhIzY3JDckJCIwaEpVbiFmN0AhIzckIjAoM25PJHBhJikpISM2NyQkIi8sLydSJWY3QCEjNiQiMGYkPmM/I28mKSkhIzY3JDckJCIuKXppWmk3QCEjNSQiMEJmdCkpNHonKSkhIzY3JCQiLywvJ1IlZjdAISM2JCIwZiQ+Yz8jbyYpKSEjNjckNyQkIi4pemlaaTdAISM1JCIwQmZ0KSk0eicpKSEjNjckJCIwQTB5PUdFNiMhIzckIjA9QV9EYSJwKSkhIzY3JDckJCIwKlI3aillRTYjISM3JCIwZlohUS9OISkpKSEjNjckJCIwQTB5PUdFNiMhIzckIjA9QV9EYSJwKSkhIzY3JDckJCIwKlI3aillRTYjISM3JCIwZlohUS9OISkpKSEjNjckJCIwOiIpMyo+bTdAISM3JCIwQCQpelQnWyIpKSkhIzY3JDckJCIvJSk0dkhwN0AhIzYkIjAmZnQpKTR6IyopKSEjNjckJCIwOiIpMyo+bTdAISM3JCIwQCQpelQnWyIpKSkhIzY3JDckJCIvJSk0dkhwN0AhIzYkIjAmZnQpKTR6IyopKSEjNjckJCIwRTtiIWVwN0AhIzckIjBFIW9WJj1RKikpISM2NyQ3JCQiMCY0JiopNEZGNiMhIzckIjBKQyVSOkIwKikhIzY3JCQiMEU7YiFlcDdAISM3JCIwRSFvViY9USopKSEjNjckNyQkIjAmNCYqKTRGRjYjISM3JCIwSkMlUjpCMCopISM2NyQkIjAqPltKJ0hGNiMhIzckIjBFWUlqXWghKikhIzY3JDckJCIwR3NXQmhGNiMhIzckIjBuNyw0c3ciKikhIzY3JCQiMCo+W0onSEY2IyEjNyQiMEVZSWpdaCEqKSEjNjckNyQkIjBHc1dCaEY2IyEjNyQiMG43LDRzdyIqKSEjNjckJCIwLDYpb013N0AhIzckIjBUd2ZvI1s9KikhIzY3JDckJCIweSZwIlEmejdAISM3JCIwLywzazcsJCopISM2NyQkIjAsNilvTXc3QCEjNyQiMFR3Zm8jWz0qKSEjNjckNyQkIjB5JnAiUSZ6N0AhIzckIjAuLDNrNywkKikhIzY3JCQiMFIkbzx0ejdAISM3JCIwTCQqPXE5MyQqKSEjNjckNyQkIjAoeV9SJkhHNiMhIzckIjBSKlsiPmBEJSopISM2NyQkIjBSJG88dHo3QCEjNyQiMEwkKj1xOTMkKikhIzY3JDckJCIwKHlfUiZIRzYjISM3JCIwUipbIj5gRCUqKSEjNjckJCIwaCZwdzYkRzYjISM3JCIwTShIJm9ZSiUqKSEjNjckNyQkIjBVZiE0UCdHNiMhIzckIjB3eEB1JCpcJiopISM2NyQkIjBoJnB3NiRHNiMhIzckIjBNKEgmb1lKJSopISM2NyQ3JCQiMFVmITRQJ0c2IyEjNyQiMHd4QHUkKlwmKikhIzY3JCQiMCk9OlpdJ0c2IyEjNyQiMGMxP2p5YSYqKSEjNjckNyQkIjAsay4qeSpHNiMhIzckIjA3bUdITXUnKikhIzY3JCQiMCk9OlpdJ0c2IyEjNyQiMGMxP2p5YSYqKSEjNjckNyQkIjAsay4qeSpHNiMhIzckIjA3bUdITXUnKikhIzY3JCQiMHNdIUgqKSpHNiMhIzckIjB0RD9hNXknKikhIzY3JDckJCIwQ1NNM0tINiMhIzckIjBbYU4lWygpeiopISM2NyQkIjBzXSFIKikqRzYjISM3JCIwdEQ/YTV5JyopISM2NyQ3JCQiMENTTTNLSDYjISM3JCIwW2FOJVsoKXoqKSEjNjckJCIwbSFSQUckSDYjISM3JCIwaGZgVFUsKSopISM2NyQ3JCQiMHInRylHbUg2IyEjNyQiMCVHQyVSOkIqKikhIzY3JCQiMG0hUkFHJEg2IyEjNyQiMGhmYFRVLCkqKSEjNjckNyQkIjByJ0cpR21INiMhIzckIjAlR0MlUjpCKiopISM2NyQkIjBgYHJzbUg2IyEjNyQiME9tP0R1QyoqKSEjNjckNyQkIjBtJypbXStJNiMhIzckIi83JFwlZnYvISohIzU3JCQiMGBgcnNtSDYjISM3JCIwT20/RHVDKiopISM2NyQ3JCQiMG0nKltdK0k2IyEjNyQiLzckXCVmdi8hKiEjNTckJCIwUHhMaytJNiMhIzckIjA2Qz8wMVsrKiEjNjckNyQkIjAkekxxaSw4QCEjNyQiMDFtSjUnWzUhKiEjNjckJCIwUHhMaytJNiMhIzckIjA2Qz8wMVsrKiEjNjckNyQkIjAkekxxaSw4QCEjNyQiL0VpNSlwc3MkISM2NyQkIjAvViE9PU87QCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD5dLDcnKm82IyEjNyQiL0VpNSlwc3MkISM2NyQkIjAvViE9PU87QCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCR6THFpLDhAISM3JCIwMW1KNSdbNSEqISM2NyQkIjAydiV6WC44QCEjNyQiMERkIyl5UHIsKiEjNjckNyQkIjBmTy51TUk2IyEjNyQiMGM+Y1wnPjwhKiEjNjckJCIwMnYlelguOEAhIzckIjBEZCMpeVByLCohIzY3JDckJCIwZk8udU1JNiMhIzckIjBjPmNcJz48ISohIzY3JCQiMFA9YGBvSTYjISM3JCIwM3g2WXAlSCEqISM2NyQ3JCQiMDopbyUqKm9JNiMhIzckIjAjeklZcWpIISohIzY3JCQiMFA9YGBvSTYjISM3JCIwM3g2WXAlSCEqISM2NyQ3JCQiMDopbyUqKm9JNiMhIzckIjAjeklZcWpIISohIzY3JCQiMC0rRV0tSjYjISM3JCIwVT91NCw9LyohIzY3JDckJCIwYjMzRS5KNiMhIzckIjBIJypwZng/LyohIzY3JCQiMC0rRV0tSjYjISM3JCIwVT91NCw9LyohIzY3JDckJCIwYjMzRS5KNiMhIzckIjBIJypwZng/LyohIzY3JCQiMEJgK1tPSjYjISM3JCIwOVw1cUtUMCohIzY3JDckJCIvLlVQdjg4QCEjNiQiMGwlb1oiPVgwKiEjNjckJCIwQmArW09KNiMhIzckIjA5XDVxS1QwKiEjNjckNyQkIi8uVVB2ODhAISM2JCIwbCVvWiI9WDAqISM2NyQkIjBpPS1acUo2IyEjNyQiMCdvIlJFa2sxKiEjNjckNyQkIjAvTHEjPTw4QCEjNyQiMCx0JClwZXAxKiEjNjckJCIwaT0tWnFKNiMhIzckIjAnbyJSRWtrMSohIzY3JDckJCIwL0xxIz08OEAhIzckIjAsdCQpcGVwMSohIzY3JCQiMEc3MFovSzYjISM3JCIweTNWeiZ6eSEqISM2NyQ3JCQiMCopKT5GaD84QCEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiMEc3MFovSzYjISM3JCIweTNWeiZ6eSEqISM2NyQ3JCQiMCopKT5GaD84QCEjNyQiMFBoIVwjKlJ6ISohIzY3JCQiMEU4QltRSzYjISM3JCIwLy55R0Y2NCohIzY3JDckJCIwRXYhUi9DOEAhIzckIjB0XCgqelI9NCohIzY3JCQiMEU4QltRSzYjISM3JCIwLy55R0Y2NCohIzY3JDckJCIwRXYhUi9DOEAhIzckIjB0XCgqelI9NCohIzY3JCQiMG1pVV1zSzYjISM3JCIwJ292WyhlTTUqISM2NyQ3JCQiMEYlW2haRjhAISM3JCIwNFEvTiFHLyIqISM2NyQkIjBtaVVdc0s2IyEjNyQiMCdvdlsoZU01KiEjNjckNyQkIjBGJVtoWkY4QCEjNyQiMDRRL04hRy8iKiEjNjckJCIwW3MpUWxJOEAhIzckIjBuOiJwLHo6IiohIzY3JDckJCIwIlsqbzQ0TDYjISM3JCIwWEU2ITRzOyIqISM2NyQkIjBbcylRbEk4QCEjNyQiMG46InAsejoiKiEjNjckNyQkIjAiWypvNDRMNiMhIzckIjBYRTYhNHM7IiohIzY3JCQiMDc5UGVTTDYjISM3JCIwbW1tYkAiRyIqISM2NyQ3JCQiMGJaRldWTDYjISM3JCIwIlsiPVhoIkgiKiEjNjckJCIwNzlQZVNMNiMhIzckIjBtbW1iQCJHIiohIzY3JDckJCIwYlpGV1ZMNiMhIzckIjAiWyI9WGgiSCIqISM2NyQkIjAlWykpUllQOEAhIzckIjBYIip5IUhYUyIqISM2NyQ3JCQiMDdlLiF5UDhAISM3JCIwPS5EKy07OSohIzY3JCQiMCVbKSlSWVA4QCEjNyQiMFgiKnkhSFhTIiohIzY3JDckJCIwN2UuIXlQOEAhIzckIjA9LkQrLTs5KiEjNjckJCIwZDJqcTNNNiMhIzckIjByVmlBJXlfIiohIzY3JDckJCIwLngnb0BUOEAhIzckIjBhIj5gRC9hIiohIzY3JCQiMGQyanEzTTYjISM3JCIwclZpQSV5XyIqISM2NyQ3JCQiMC54J29AVDhAISM3JCIwYSI+YEQvYSIqISM2NyQkIjBqP1Z5VU02IyEjNyQiMDlLdV06XjsqISM2NyQ3JCQiMG8wJltsVzhAISM3JCIvKnpRNSRbbSIqISM1NyQkIjBqP1Z5VU02IyEjNyQiMDlLdV06XjsqISM2NyQ3JCQiMG8wJltsVzhAISM3JCIvKnpRNSRbbSIqISM1NyQkIjAzI1x0b1o4QCEjNyQiMHNUR3ZZdTwqISM2NyQ3JCQiMHdYLSU0WzhAISM3JCIwRW9YbEIqeSIqISM2NyQkIjAzI1x0b1o4QCEjNyQiMHNUR3ZZdTwqISM2NyQ3JCQiMHdYLSU0WzhAISM3JCIwRW9YbEIqeSIqISM2NyQkIjAkNER1NF44QCEjNyQiMClvNGh6eCo9KiEjNjckNyQkIjA7I2ZWYF44QCEjNyQiMGljXz9rOD4qISM2NyQkIjAkNER1NF44QCEjNyQiMClvNGh6eCo9KiEjNjckNyQkIjA7I2ZWYF44QCEjNyQiMGljXz9rOD4qISM2NyQkIjA3Wl4zWE42IyEjNyQiMDhabzg0QD8qISM2NyQ3JCQiMChcdGQoXE42IyEjNyQiMClcJWZ2L1E/KiEjNjckJCIwN1peM1hONiMhIzckIjA4Wm84NEA/KiEjNjckNyQkIjAoXHRkKFxONiMhIzckIjApXCVmdi9RPyohIzY3JCQiMHZ0dz96TjYjISM3JCIwJlxJdi1XOSMqISM2NyQ3JCQiLygpRyQ9JWU4QCEjNiQiME1MbUlYaUAqISM2NyQkIjB2dHc/ek42IyEjNyQiMCZcSXYtVzkjKiEjNjckNyQkIi8oKUckPSVlOEAhIzYkIjBNTG1JWGlAKiEjNjckJCIwSGg3TThPNiMhIzckIjBcJ0h5OHhFIyohIzY3JDckJCIwMyZ6Pyc9TzYjISM3JCIwckB0JmVvRyMqISM2NyQkIjBIaDdNOE82IyEjNyQiMFwnSHk4eEUjKiEjNjckNyQkIjAzJno/Jz1PNiMhIzckIjByQHQmZW9HIyohIzY3JCQiMHIkUSZbWk82IyEjNyQiMFgzdlctIlIjKiEjNjckNyQkIjBBYihvSWw4QCEjNyQiMDI1ITNrN1QjKiEjNjckJCIwciRRJltaTzYjISM3JCIwWDN2Vy0iUiMqISM2NyQ3JCQiMEFiKG9JbDhAISM3JCIwMjUhM2s3VCMqISM2NyQkIi9AdVM7bzhAISM2JCIweiNwIVtMOUQqISM2NyQ3JCQiMDA3KEd2bzhAISM3JCIwVilwZXBjYCMqISM2NyQkIi9AdVM7bzhAISM2JCIweiNwIVtMOUQqISM2NyQ3JCQiMDA3KEd2bzhAISM3JCIwVilwZXBjYCMqISM2NyQkIjBgLG4hZXI4QCEjNyQiMFUmKSl6V3dqIyohIzY3JDckJCIuLyopKj5zOEAhIzUkIjB6J1E0dittIyohIzY3JCQiMGAsbiFlcjhAISM3JCIwVSYpKXpXd2ojKiEjNjckNyQkIi4vKikqPnM4QCEjNSQiMHonUTR2K20jKiEjNjckJCIvdWskKSpcUDYjISM2JCIwZl1RVyY0dyMqISM2NyQ3JCQiME04NltjUDYjISM3JCIwOnYrMVsleSMqISM2NyQkIi91ayQpKlxQNiMhIzYkIjBmXVFXJjR3IyohIzY3JDckJCIwTTg2W2NQNiMhIzckIjA6disxWyV5IyohIzY3JCQiMCwlR3NUeThAISM3JCIwJSpILlBFJSlHKiEjNjckNyQkIjA2W1soNHo4QCEjNyQiMF5qMmgpKTNIKiEjNjckJCIwLCVHc1R5OEAhIzckIjAlKkguUEUlKUcqISM2NyQ3JCQiMDZbWyg0ejhAISM3JCIwXmoyaCkpM0gqISM2NyQkIjAmXDVzJD1RNiMhIzckIjBKWjRFZDJJKiEjNjckNyQkIjBRWS5bRFE2IyEjNyQiMCg9WGgiSExJKiEjNjckJCIwJlw1cyQ9UTYjISM3JCIwSlo0RWQySSohIzY3JDckJCIwUVkuW0RRNiMhIzckIjAoPVhoIkhMSSohIzY3JCQiMDRLQmVfUTYjISM3JCIwbSg+PSIpMzgkKiEjNjckNyQkIjBmIUgnKipmUTYjISM3JCIwQlNAcnBkSiohIzY3JCQiMDRLQmVfUTYjISM3JCIwbSg+PSIpMzgkKiEjNjckNyQkIjBmIUgnKipmUTYjISM3JCIwQlNAcnBkSiohIzY3JCQiMCRmcS1vKVE2IyEjNyQiMDg4SCUqPWFLKiEjNjckNyQkIjBVeEhfJSpRNiMhIzckIi8nR0dFNSNHJCohIzU3JCQiMCRmcS1vKVE2IyEjNyQiMDg4SCUqPWFLKiEjNjckNyQkIjBVeEhfJSpRNiMhIzckIi8nR0dFNSNHJCohIzU3JCQiMG1IWC5AUjYjISM3JCIwMzo0dFx4TCohIzY3JDckJCIvc1doIUhSNiMhIzYkIjAncF44M2xTJCohIzY3JCQiMG1IWC5AUjYjISM3JCIwMzo0dFx4TCohIzY3JDckJCIvc1doIUhSNiMhIzYkIjAncF44M2xTJCohIzY3JCQiMCM9IXlGYlI2IyEjNyQiLyMzQVshM10kKiEjNTckNyQkIjBgKXA2TydSNiMhIzckIjBLMFVPIjRgJCohIzY3JCQiMCM9IXlGYlI2IyEjNyQiLyMzQVshM10kKiEjNTckNyQkIjBgKXA2TydSNiMhIzckIjBLMFVPIjRgJCohIzY3JCQiMHpWOmAqKVI2IyEjNyQiMFFJKio+NkNPKiEjNjckNyQkIi9UVHMiKSpSNiMhIzYkIjBvJCpbIj5gbCQqISM2NyQkIjB6VjpgKilSNiMhIzckIjBRSSoqPjZDTyohIzY3JDckJCIvVFRzIikqUjYjISM2JCIwbyQqWyI+YGwkKiEjNjckJCIwcDprekJTNiMhIzckIjAnXCc+KT11dSQqISM2NyQ3JCQiMGQzXHVLUzYjISM3JCIwLyNlbEMoelAqISM2NyQkIjBwOmt6QlM2IyEjNyQiMCdcJz4pPXV1JCohIzY3JDckJCIwZDNcdUtTNiMhIzckIjAvI2VsQyh6UCohIzY3JCQiMHhKRjJlUzYjISM3JCIwTC90X3NxUSohIzY3JDckJCIvVCMpR3QxOUAhIzYkIi8vRjtJVCFSKiEjNTckJCIweEpGMmVTNiMhIzckIjBML3Rfc3FRKiEjNjckNyQkIi9UIylHdDE5QCEjNiQiLy9GO0lUIVIqISM1NyQkIjBRJz1mQjQ5QCEjNyQiMC1OLDkuJSpSKiEjNjckNyQkIjB0V04jPjU5QCEjNyQiMHdlcGNgR1MqISM2NyQkIjBRJz1mQjQ5QCEjNyQiMC1OLDkuJSpSKiEjNjckNyQkIjB0V04jPjU5QCEjNyQiMHdlcGNgR1MqISM2NyQkIjBQIzNkbTc5QCEjNyQiMFp6aXJMPFQqISM2NyQ3JCQiMEJTK2BPVDYjISM3JCIwN1p3NiVIOiUqISM2NyQkIjBQIzNkbTc5QCEjNyQiMFp6aXJMPFQqISM2NyQ3JCQiMEJTK2BPVDYjISM3JCIwN1p3NiVIOiUqISM2NyQkIjAmKilcbDQ7OUAhIzckIjA6IXBlVTFDJSohIzY3JDckJCIwYCQqcDlyVDYjISM3JCIwXE4kb1l0RiUqISM2NyQkIjAmKilcbDQ7OUAhIzckIjA6IXBlVTFDJSohIzY3JDckJCIwYCQqcDlyVDYjISM3JCIwW04kb1l0RiUqISM2NyQkIjA2dFNHJj45QCEjNyQiMC5KJm9aUk8lKiEjNjckNyQkIjB4MVt4MFU2IyEjNyQiMCZRLT5fPFMlKiEjNjckJCIwNnRTRyY+OUAhIzckIjAuSiZvWlJPJSohIzY3JDckJCIweDFbeDBVNiMhIzckIjAmUS0+XzxTJSohIzY3JCQiMHcuXWhIVTYjISM3JCIwWF4oUV9zWyUqISM2NyQ3JCQiMCJcSjovQzlAISM3JCIwQDcocGRoXyUqISM2NyQkIjB3Ll1oSFU2IyEjNyQiMFheKFFfc1slKiEjNjckNyQkIjAiXEo6L0M5QCEjNyQiMEA3KHBkaF8lKiEjNjckJCIwKDNnYlJFOUAhIzckIjAkbyh6bmI1WSohIzY3JDckJCIwRSlRbF1GOUAhIzckIjBkKy9LY11ZKiEjNjckJCIwKDNnYlJFOUAhIzckIjAkbyh6bmI1WSohIzY3JDckJCIwRSlRbF1GOUAhIzckIjBkKy9LY11ZKiEjNjckJCIwcz8iMyQpSDlAISM3JCIwXHMqeWdRdCUqISM2NyQ3JCQiMHYicEYoNFY2IyEjNyQiMCQqKTNyb1x4JSohIzY3JCQiMHM/IjMkKUg5QCEjNyQiMFxzKnlnUXQlKiEjNjckNyQkIjB2InBGKDRWNiMhIzckIjAkKikzcm9ceCUqISM2NyQkIjBAMypwRUw5QCEjNyQiMCY+RF1rciZbKiEjNjckNyQkIjBmZS9TV1Y2IyEjNyQiMEh4PFVQKipbKiEjNjckJCIwQDMqcEVMOUAhIzckIjAmPkRda3ImWyohIzY3JDckJCIwZmUvU1dWNiMhIzckIjBIeDxVUCoqWyohIzY3JCQiMD5hVy9uVjYjISM3JCIvPmkheVkhKVwqISM1NyQ3JCQiME9IYTN6VjYjISM3JCIwbGxDKHpQLSYqISM2NyQkIjA+YVcvblY2IyEjNyQiLz5pIXlZISlcKiEjNTckNyQkIjBPSGEzelY2IyEjNyQiMGxsQyh6UC0mKiEjNjckJCIwUDYkRzlTOUAhIzckIjAnZjgiM3guXiohIzY3JDckJCIwVDIreThXNiMhIzckIjAtYUpfPVteKiEjNjckJCIwUDYkRzlTOUAhIzckIjAnZjgiM3guXiohIzY3JDckJCIwVDIreThXNiMhIzckIjAtYUpfPVteKiEjNjckJCIwRiQqUiNlVjlAISM3JCIvWXRWdHFBJiohIzU3JDckJCIwcyxzW1tXNiMhIzckIjBRVVEyZnNfKiEjNjckJCIwRiQqUiNlVjlAISM3JCIvWXRWdHFBJiohIzU3JDckJCIwcyxzW1tXNiMhIzckIjBRVVEyZnNfKiEjNjckJCIwTXMlSC1aOUAhIzckIjA4PlxkUF1gKiEjNjckNyQkIjBPQ1M/JFs5QCEjNyQiMHVJWGkqcFImKiEjNjckJCIwTXMlSC1aOUAhIzckIjA4PlxkUF1gKiEjNjckNyQkIjBPQ1M/JFs5QCEjNyQiMHVJWGkqcFImKiEjNjckJCIvTyNmay9YNiMhIzYkIjAkPSM0eG50YSohIzY3JDckJCIwJzNqS3peOUAhIzckIi8iPl88U0BiKiEjNTckJCIvTyNmay9YNiMhIzYkIjAkPSM0eG50YSohIzY3JDckJCIwJzNqS3peOUAhIzckIi8iPl88U0BiKiEjNTckJCIvRSNRMlJYNiMhIzYkIjAiekBJenBmJiohIzY3JDckJCIwJyk+SW5fWDYjISM3JCIwWTJmcyFlayYqISM2NyQkIi9FI1EyUlg2IyEjNiQiMCJ6QEl6cGYmKiEjNjckNyQkIjAnKT5Jbl9YNiMhIzckIjBZMmZzIWVrJiohIzY3JCQiMGgoUTdOZDlAISM3JCIwJVJKYiFHP2QqISM2NyQ3JCQiMCJcKFFVKGU5QCEjNyQiMCNlZnc3LXgmKiEjNjckJCIwaChRN05kOUAhIzckIjAlUkpiIUc/ZCohIzY3JDckJCIwIlwoUVUoZTlAISM3JCIwI2VmdzcteCYqISM2NyQkIjApZik9J3pnOUAhIzckIjBwX2A5ZVZlKiEjNjckNyQkIjBfbGY9QVk2IyEjNyQiMD0lR0Y9WSplKiEjNjckJCIwKWYpPSd6ZzlAISM3JCIwcF9gOWVWZSohIzY3JDckJCIwX2xmPUFZNiMhIzckIjA9JUdGPVkqZSohIzY3JCQiMGJDOlVVWTYjISM3JCIwUnhHPylvJ2YqISM2NyQ3JCQiMEUzJ2ZwbDlAISM3JCIwYXN6UC0+ZyohIzY3JCQiMGJDOlVVWTYjISM3JCIwUnhHPylvJ2YqISM2NyQ3JCQiMEUzJ2ZwbDlAISM3JCIwYXN6UC0+ZyohIzY3JCQiMG08QypvbjlAISM3JCIwI1xKQyM9ITQnKiEjNjckNyQkIi5wSnUicDlAISM1JCIwIjRtR0hNOScqISM2NyQkIjBtPEMqb245QCEjNyQiMCNcSkMjPSE0JyohIzY3JDckJCIucEp1InA5QCEjNSQiMCI0bUdITTknKiEjNjckJCIwN2ZPUDZaNiMhIzckIjAqNGQ3I1s4aSohIzY3JDckJCIwczAmUWxzOUAhIzckIjBGXCR6TXlFJyohIzY3JCQiMDdmT1A2WjYjISM3JCIwKjRkNyNbOGkqISM2NyQ3JCQiMHMwJlFsczlAISM3JCIwRlwkek15RScqISM2NyQkIjB5PGMnZXU5QCEjNyQiMClHWW0ieU9qKiEjNjckNyQkIi9PKltNaFo2IyEjNiQiMGpQKy5DI1InKiEjNjckJCIweTxjJ2V1OUAhIzckIjApR1ltInlPaiohIzY3JDckJCIvTypbTWhaNiMhIzYkIjBqUCsuQyNSJyohIzY3JCQiMG1QIXAueTlAISM3JCIwJFxnJDMzZ2sqISM2NyQ3JCQiMEF2QzsnejlAISM3JCIwKmZzIWVrO2wqISM2NyQkIjBtUCFwLnk5QCEjNyQiMCRcZyQzM2drKiEjNjckNyQkIjBBdkM7J3o5QCEjNyQiMCpmcyFlaztsKiEjNjckJCIwRjlFKVsiWzYjISM3JCIvKnoib3pMZScqISM1NyQ3JCQiL1ReISo0JFs2IyEjNiQiME45OTgwVG0qISM2NyQkIjBGOUUpWyJbNiMhIzckIi8qeiJvekxlJyohIzU3JDckJCIvVF4hKjQkWzYjISM2JCIwTjk5ODBUbSohIzY3JCQiME1ZalNcWzYjISM3JCIwKD0+P3ltcScqISM2NyQ3JCQiMHVOJ0hlJ1s2IyEjNyQiMHItQG9YbG4qISM2NyQkIjBNWWpTXFs2IyEjNyQiMCg9Pj95bXEnKiEjNjckNyQkIjB1TidIZSdbNiMhIzckIjByLUBvWGxuKiEjNjckJCIwY046JVIpWzYjISM3JCIwMm5haigqSG8qISM2NyQ3JCQiMFRdMG8rXDYjISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwY046JVIpWzYjISM3JCIwMm5haigqSG8qISM2NyQ3JCQiMFRdMG8rXDYjISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwUDt2Wz1cNiMhIzckIjBfUmhURmBwKiEjNjckNyQkIjA9VT5hTlw2IyEjNyQiMFd6TXlFOXEqISM2NyQkIjBQO3ZbPVw2IyEjNyQiMF9SaFRGYHAqISM2NyQ3JCQiMD1VPmFOXDYjISM3JCIwV3pNeUU5cSohIzY3JCQiMFFDVi9gXDYjISM3JCIwOCY0aXJsMigqISM2NyQ3JCQiMEhpV1RxXDYjISM3JCIveTtNdCdRciohIzU3JCQiMFFDVi9gXDYjISM3JCIwOCY0aXJsMigqISM2NyQ3JCQiMEhpV1RxXDYjISM3JCIveTtNdCdRciohIzU3JCQiMGIjRzZ3KVw2IyEjNyQiMHAvYihvKSo+KCohIzY3JDckJCIwRzIiKUgwXTYjISM3JCIwO2NbKXlJRSgqISM2NyQkIjBiI0c2dylcNiMhIzckIjBwL2IobykqPigqISM2NyQ3JCQiMEcyIilIMF02IyEjNyQiMDtjWyl5SUUoKiEjNjckJCIwO2ohKj1BXTYjISM3JCIwbDdVYjtCdCohIzY3JDckJCIwbERBPlNdNiMhIzckIjBfV2JWWyhRKCohIzY3JCQiMDtqISo9QV02IyEjNyQiMGw3VWI7QnQqISM2NyQ3JCQiMGxEQT5TXTYjISM3JCIwX1diVlsoUSgqISM2NyQkIjA6S3d4Y102IyEjNyQiLyNHJCk+WVl1KiEjNTckNyQkIjA2THU0dl02IyEjNyQiMClHQicpKik9XigqISM2NyQkIjA6S3d4Y102IyEjNyQiLyNHJCk+WVl1KiEjNTckNyQkIjA2THU0dl02IyEjNyQiMClHQicpKik9XigqISM2NyQkIi91TXc4NDpAISM2JCIwQjUqNGUocHYqISM2NyQ3JCQiMDcoejgrNjpAISM3JCIwQ0BwYEhPdyohIzY3JCQiL3VNdzg0OkAhIzYkIjBCNSo0ZShwdiohIzY3JDckJCIwNyh6OCs2OkAhIzckIjBDQHBgSE93KiEjNjckJCIwJWYiZilmNzpAISM3JCIwcyJwJ1EwJHAoKiEjNjckNyQkIjAoPU5UXDk6QCEjNyQiLyc0dzNxZ3gqISM1NyQkIjAlZiJmKWY3OkAhIzckIjBzInAnUTAkcCgqISM2NyQ3JCQiMCg9TlRcOTpAISM3JCIvJzR3M3FneCohIzU3JCQiMCNSJnBnZ142IyEjNyQiMC4ocEVcaiJ5KiEjNjckNyQkIjAwISkqeil6XjYjISM3JCIwJ3pIUTFeKXkqISM2NyQkIjAjUiZwZ2deNiMhIzckIjAuKHBFXGoieSohIzY3JDckJCIwMCEpKnopel42IyEjNyQiMCd6SFExXil5KiEjNjckJCIwV2QiUV8+OkAhIzckIjAqcDVNVydSeiohIzY3JDckJCIwVHYhSFtAOkAhIzckIjBLJykqKT1eNCEpKiEjNjckJCIwV2QiUV8+OkAhIzckIjAqcDVNVydSeiohIzY3JDckJCIwVHYhSFtAOkAhIzckIjBMJykqKT1eNCEpKiEjNjckJCIwRUQmeilIXzYjISM3JCIwa0QqM1JIMSkqISM2NyQ3JCQiMEMkUip5XF82IyEjNyQiMHB1J1I8UjgpKiEjNjckJCIwRUQmeilIXzYjISM3JCIwa0QqM1JIMSkqISM2NyQ3JCQiMEMkUip5XF82IyEjNyQiMHB1J1I8UjgpKiEjNjckJCIwWmVCYGtfNiMhIzckIjAyIilwTUInPSkqISM2NyQ3JCQiMEFYMnclRzpAISM3JCIwMGouSEtlIykqISM2NyQkIjBaZUJga182IyEjNyQiMDIiKXBNQic9KSohIzY3JDckJCIwQVgydyVHOkAhIzckIjAwai5IS2UjKSohIzY3JCQiME1gYD4qSDpAISM3JCIwaWBDdl80JCkqISM2NyQ3JCQiMG5nRHU+YDYjISM3JCIwVF41JUdGUSkqISM2NyQkIjBNYGA+Kkg6QCEjNyQiMGlgQ3ZfNCQpKiEjNjckNyQkIjBuZ0R1PmA2IyEjNyQiMFReNSVHRlEpKiEjNjckJCIwaTMmb1FMOkAhIzckIjBKWmA3I0dWKSohIzY3JDckJCIwTkljdGFgNiMhIzckIjB4UjxSODImKSohIzY3JCQiMGkzJm9RTDpAISM3JCIwSlpgNyNHVikqISM2NyQ3JCQiME5JY3RhYDYjISM3JCIweFI8UjgyJikqISM2NyQkIjBDREpib2A2IyEjNyQiMHYhXGg5aGIpKiEjNjckNyQkIjApW3BSKCpROkAhIzckIjA4R0MlUjpqKSohIzY3JCQiMENESmJvYDYjISM3JCIwdiFcaDloYikqISM2NyQ3JCQiMClbcFIoKlE6QCEjNyQiMDhHQyVSOmopKiEjNjckJCIwbCoqeUMuYTYjISM3JCIwd2pdd1N6JykqISM2NyQ3JCQiMD0+VXZDYTYjISM3JCIwXDtKXCVmdikqISM2NyQkIjBsKip5Qy5hNiMhIzckIjB3al13U3onKSohIzY3JDckJCIwPT5VdkNhNiMhIzckIjBcO0pcJWZ2KSohIzY3JCQiMGVJRyZ6VjpAISM3JCIwTnFnLnEtKSkqISM2NyQ3JCQiMFtIK3lmYTYjISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMGVJRyZ6VjpAISM3JCIwTnFnLnEtKSkqISM2NyQ3JCQiMFtIK3lmYTYjISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMDdUKG9FWjpAISM3JCIwT3I9RipmIyopKiEjNjckNyQkIjAjM0s7W1w6QCEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMDdUKG9FWjpAISM3JCIwT3I9RipmIyopKiEjNjckNyQkIjAjM0s7W1w6QCEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMCRcSCZSMmI2IyEjNyQiMERYTlpHXCEqKiEjNjckNyQkIjBoYU4nKUhiNiMhIzckIjBlIj1YaCJIIioqISM2NyQkIjAkXEgmUjJiNiMhIzckIjBEWE5aR1whKiohIzY3JDckJCIwaGFOJylIYjYjISM3JCIwZSI9WGgiSCIqKiEjNjckJCIwUiw/OFViNiMhIzckIjA6bEVrZHMiKiohIzY3JDckJCIwQTFAI1xjOkAhIzckIjAlKnBlcGNgIyoqISM2NyQkIjBSLD84VWI2IyEjNyQiMDpsRWtkcyIqKiEjNjckNyQkIjBBMUAjXGM6QCEjNyQiMCUqcGVwY2AjKiohIzY3JCQiMFg9KHpvZDpAISM3JCIwNyFbd25lSCoqISM2NyQ3JCQiMDxONioqKmY6QCEjNyQiLyRlbEMoelAqKiEjNTckJCIwWD0oem9kOkAhIzckIjA3IVt3bmVIKiohIzY3JDckJCIwPE42KioqZjpAISM3JCIvJGVsQyh6UCoqISM1NyQkIjAqKTN3ajZjNiMhIzckIi9ZbnhlIj4lKiohIzU3JDckJCIwSFMxMk5jNiMhIzckIjBtWXN6UC0mKiohIzY3JCQiMCopM3dqNmM2IyEjNyQiL1lueGUiPiUqKiEjNTckNyQkIjBIUzEyTmM2IyEjNyQiMG1Zc3pQLSYqKiEjNjckJCIweSE0MWtrOkAhIzckIjA5M1wlXENhKiohIzY3JDckJCIvUiQ+O3FjNiMhIzYkIjAtTnpNeUUnKiohIzY3JCQiMHkhNDFrazpAISM3JCIwOTNcJVxDYSoqISM2NyQ3JCQiL1IkPjtxYzYjISM2JCIwLU56TXlFJyoqISM2NyQkIjBtMV89Im86QCEjNyQiMEdXIXlSZG0qKiEjNjckNyQkIjAvKUhqX3E6QCEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBtMV89Im86QCEjNyQiMEdXIXlSZG0qKiEjNjckNyQkIjAvKUhqX3E6QCEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBRNlwoZnI6QCEjNyQiMCR5QXhIISp5KiohIzY3JDckJCIwclxiUFNkNiMhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjBRNlwoZnI6QCEjNyQiMCR5QXhIISp5KiohIzY3JDckJCIwclxiUFNkNiMhIzckIjB2NiRcJWZ2KSoqISM2NyQkIjBqb154XWQ2IyEjNyQiMEB2RCU+QiIqKiohIzY3JDckJCIwMCdlKlx2ZDYjISM3JCIwLCsrKysrKyIhIzU3JCQiMGpvXnhdZDYjISM3JCIwQHZEJT5CIioqKiEjNjckNyQkIi8tOj9oKm82IyEjNiQiL0VpNSlwc3MkISM2NyQkIjBKYnltVC03IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFlpKnBmeD9AISM3JCIvRWk1KXBzcyQhIzY3JCQiMEpieW1ULTcjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwWWkqcGZ4P0AhIzckIi9FaTUpcHNzJCEjNjckJCIwZW53XkBUNyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0dSg+ZWxDQCEjNyQiL0VpNSlwc3MkISM2NyQkIjBlbndeQFQ3IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHR1KD5lbENAISM3JCIvRWk1KXBzcyQhIzY3JCQiMCUpenVPLCFHQCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpwZXBjYEdAISM3JCIvRWk1KXBzcyQhIzY3JCQiMCUpenVPLCFHQCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpwZXBjYEdAISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYjSDw3KT04IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUqUj5iVEtAISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYjSDw3KT04IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUqUj5iVEtAISM3JCIvRWk1KXBzcyQhIzY3JCQiMFAvcjFoZDgjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXzYjcGBIT0AhIzckIi9FaTUpcHNzJCEjNjckJCIwUC9yMWhkOCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBfNiNwYEhPQCEjNyQiL0VpNSlwc3MkISM2NyQkIjBrO3AiNGtSQCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHpCIT5fPFNAISM3JCIvRWk1KXBzcyQhIzY3JCQiMGs7cCI0a1JAISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwekIhPl88U0AhIzckIi9FaTUpcHNzJCEjNjckJCIvKkdudz9OOSMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwTylvXTBXQCEjNyQiL0VpNSlwc3MkISM2NyQkIi8qR253P045IyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMDBPKW9dMFdAISM3JCIvRWk1KXBzcyQhIzY3JCQiMDxUbGgrdTkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwS1snPVwkejkjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDxUbGgrdTkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwS1snPVwkejkjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFZgalkhR15AISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZWclb1oiPTojISM3JCIvRWk1KXBzcyQhIzY3JCQiMFZgalkhR15AISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZWclb1oiPTojISM3JCIvRWk1KXBzcyQhIzY3JCQiL2Q7Oy47YkAhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmR0Y9WXBiQCEjNyQiL0VpNSlwc3MkISM2NyQkIi9kOzsuO2JAISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJkdGPVlwYkAhIzckIi9FaTUpcHNzJCEjNjckJCIwJ3ooZjtTIWZAISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNiYzb1dkZkAhIzckIi9FaTUpcHNzJCEjNjckJCIwJ3ooZjtTIWZAISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNiYzb1dkZkAhIzckIi9FaTUpcHNzJCEjNjckJCIwQiF6OisjSDsjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUSgqeUphTTsjISM3JCIvRWk1KXBzcyQhIzY3JCQiMEIhejorI0g7IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFEoKnlKYU07IyEjNyQiL0VpNSlwc3MkISM2NyQkIjBcLWMnKSp6bUAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBrNHg7TXQ7IyEjNyQiL0VpNSlwc3MkISM2NyQkIjBcLWMnKSp6bUAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBrNHg7TXQ7IyEjNyQiL0VpNSlwc3MkISM2NyQkIjB3OWFyejE8IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCI+XzxTQHJAISM3JCIvRWk1KXBzcyQhIzY3JCQiMHc5YXJ6MTwjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIj5fPFNAckAhIzckIi9FaTUpcHNzJCEjNjckJCIwLkZfY2ZYPCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA9TXQnUTR2QCEjNyQiL0VpNSlwc3MkISM2NyQkIjAuRl9jZlg8IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD1NdCdRNHZAISM3JCIvRWk1KXBzcyQhIzY3JCQiMEhSXVRSJXlAISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwV1lycnQqeUAhIzckIi9FaTUpcHNzJCEjNjckJCIwSFJdVFIleUAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBXWXJydCp5QCEjNyQiL0VpNSlwc3MkISM2NyQkIjBjXltFPkI9IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHJlcGNgRz0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMGNeW0U+Qj0jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcmVwY2BHPSMhIzckIi9FaTUpcHNzJCEjNjckJCIwI1FtOSIqPic9IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCg0eDtNdCc9IyEjNyQiL0VpNSlwc3MkISM2NyQkIjAjUW05Iio+Jz0jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKDR4O010Jz0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMDR3VycqeSs+IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEMkZW1LaCE+IyEjNyQiL0VpNSlwc3MkISM2NyQkIjA0d1cnKnkrPiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDJGVtS2ghPiMhIzckIi9FaTUpcHNzJCEjNjckJCIwTilHOSllUj4jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvYlI7SlwlPiMhIzYkIi9FaTUpcHNzJCEjNjckJCIwTilHOSllUj4jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvYlI7SlwlPiMhIzYkIi9FaTUpcHNzJCEjNjckJCIwaStUbVF5PiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB4MmknSFApPiMhIzckIi9FaTUpcHNzJCEjNjckJCIwaStUbVF5PiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB4MmknSFApPiMhIzckIi9FaTUpcHNzJCEjNjckJCIwKUciUl49PD8jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLj9nIkdELUEhIzckIi9FaTUpcHNzJCEjNjckJCIwKUciUl49PD8jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLj9nIkdELUEhIzckIi9FaTUpcHNzJCEjNjckJCIwOkRQTylmMEEhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9CJGVtS2g/IyEjNiQiL0VpNSlwc3MkISM2NyQkIjA6RFBPKWYwQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL0IkZW1LaD8jISM2JCIvRWk1KXBzcyQhIzY3JCQiMFRQTkB5JTRBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwY1djXjcrQCMhIzckIi9FaTUpcHNzJCEjNjckJCIwVFBOQHklNEEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjV2NeNytAIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBvXEwxZUxAIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCRvWGxCKlFAIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBvXEwxZUxAIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCRvWGxCKlFAIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAlPjs4ekI8QSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDRwX0BzeEAjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCU+Ozh6QjxBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNHBfQHN4QCMhIzckIi9FaTUpcHNzJCEjNjckJCIwQHVIdzw2QSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBPIjNsP2xAQSEjNyQiL0VpNSlwc3MkISM2NyQkIjBAdUh3PDZBIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME8iM2w/bEBBISM3JCIvRWk1KXBzcyQhIzY3JCQiMFsneTd3KlxBIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGokKlsiPmBEQSEjNyQiL0VpNSlwc3MkISM2NyQkIjBbJ3k3dypcQSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBqJCpbIj5gREEhIzckIi9FaTUpcHNzJCEjNjckJCIwdSlmaXUoKUdBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKmVxazxUSEEhIzckIi9FaTUpcHNzJCEjNjckJCIwdSlmaXUoKUdBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKmVxazxUSEEhIzckIi9FaTUpcHNzJCEjNjckJCIwLDZDSmRGQiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA7PVhoIkhMQSEjNyQiL0VpNSlwc3MkISM2NyQkIjAsNkNKZEZCIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDs9WGgiSExBISM3JCIvRWk1KXBzcyQhIzY3JCQiMEZCQTtQbUIjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVUlWWXJyQiMhIzckIi9FaTUpcHNzJCEjNjckJCIwRkJBO1BtQiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBVSVZZcnJCIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBhTj8sPDBDIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHBVVEpeNUMjISM3JCIvRWk1KXBzcyQhIzY3JCQiMGFOPyw8MEMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcFVUSl41QyMhIzckIi9FaTUpcHNzJCEjNjckJCIveSU9J29SV0EhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmXCZSO0pcQyMhIzckIi9FaTUpcHNzJCEjNjckJCIveSU9J29SV0EhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmXCZSO0pcQyMhIzckIi9FaTUpcHNzJCEjNjckJCIwMmc7cncjW0EhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBBblAsNilbQSEjNyQiL0VpNSlwc3MkISM2NyQkIjAyZztydyNbQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEFuUCw2KVtBISM3JCIvRWk1KXBzcyQhIzY3JCQiMExzOWNjQEQjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwW3pOJzNwX0EhIzckIi9FaTUpcHNzJCEjNjckJCIwTHM5Y2NARCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBbek4nM3BfQSEjNyQiL0VpNSlwc3MkISM2NyQkIi9ZRzZrLmNBISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwdiJSODJkY0EhIzckIi9FaTUpcHNzJCEjNjckJCIvWUc2ay5jQSEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHYiUjgyZGNBISM3JCIvRWk1KXBzcyQhIzY3JCQiMCdvNGhpIipmQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCwvS2NdL0UjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCdvNGhpIipmQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCwvS2NdL0UjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDg0NDYnempBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRztJVElWRSMhIzckIi9FaTUpcHNzJCEjNjckJCIwODQ0Nid6akEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBHO0lUSVZFIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBSQDInZm5uQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGFHR0U1I29BISM3JCIvRWk1KXBzcyQhIzY3JCQiMFJAMidmbm5BISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYUdHRTUjb0EhIzckIi9FaTUpcHNzJCEjNjckJCIwbUwwImVickEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiM2s3LDRzQSEjNyQiL0VpNSlwc3MkISM2NyQkIjBtTDAiZWJyQSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCIzazcsNHNBISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRmTWdjVnZBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwM2BDJypwZkYjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRmTWdjVnZBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwM2BDJypwZkYjISM3JCIvRWk1KXBzcyQhIzY3JCQiMD5lLF46JHpBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTWxBIilcKXpBISM3JCIvRWk1KXBzcyQhIzY3JCQiMD5lLF46JHpBISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTWxBIilcKXpBISM3JCIvRWk1KXBzcyQhIzY3JCQiMFlxKmZgPiRHIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGh4P21IUEcjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFlxKmZgPiRHIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGh4P21IUEcjISM3JCIvRWk1KXBzcyQhIzY3JCQiMHMjeTRfMihHIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCgpKik9XjR3RyMhIzckIi9FaTUpcHNzJCEjNjckJCIwcyN5NF8yKEcjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKCkqKT1eNHdHIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAqXGZmXSY0SCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA5LTxPKlsiSCMhIzckIi9FaTUpcHNzJCEjNjckJCIwKlxmZl0mNEgjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOS08TypbIkgjISM3JCIvRWk1KXBzcyQhIzY3JCQiMEQyJTRcJFtIIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1deNiNwYEgjISM2JCIvRWk1KXBzcyQhIzY3JCQiMEQyJTRcJFtIIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1deNiNwYEgjISM2JCIvRWk1KXBzcyQhIzY3JCQiMF8+I2ZacilIIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG5FODFcIypIIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBfPiNmWnIpSCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuRTgxXCMqSCMhIzckIi9FaTUpcHNzJCEjNjckJCIweUohNFlmLUIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkKlE2IipHSkkjISM3JCIvRWk1KXBzcyQhIzY3JCQiMHlKITRZZi1CISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJCpRNiIqR0pJIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAwVyllV1oxQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzcmNHczcUkjISM2JCIvRWk1KXBzcyQhIzY3JCQiMDBXKWVXWjFCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvNyY0dzNxSSMhIzYkIi9FaTUpcHNzJCEjNjckJCIwSmMnM1ZONUIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZajJoKSkzSiMhIzckIi9FaTUpcHNzJCEjNjckJCIwSmMnM1ZONUIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZajJoKSkzSiMhIzckIi9FaTUpcHNzJCEjNjckJCIwZW8lZVRCOUIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0djBZb1pKIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBlbyVlVEI5QiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHR2MFlvWkojISM3JCIvRWk1KXBzcyQhIzY3JCQiMCUzRzNTNj1CISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKnpRNSRbJz1CISM3JCIvRWk1KXBzcyQhIzY3JCQiMCUzRzNTNj1CISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKnpRNSRbJz1CISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYkNGVRKj5LIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUrLTtHREsjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYkNGVRKj5LIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUrLTtHREsjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFEwenF0ZUsjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYDcrLDNrSyMhIzckIi9FaTUpcHNzJCEjNjckJCIwUTB6cXRlSyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBgNyssM2tLIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBrPHhiYChIQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHpDKWZ5R0lCISM3JCIvRWk1KXBzcyQhIzY3JCQiMGs8eGJgKEhCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwekMpZnlHSUIhIzckIi9FaTUpcHNzJCEjNjckJCIwIipIdlNMT0wjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMVAnNHg7TUIhIzckIi9FaTUpcHNzJCEjNjckJCIwIipIdlNMT0wjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMVAnNHg7TUIhIzckIi9FaTUpcHNzJCEjNjckJCIwPFV0RDh2TCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBLXCVmdi9RQiEjNyQiL0VpNSlwc3MkISM2NyQkIjA8VXREOHZMIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEtcJWZ2L1FCISM3JCIvRWk1KXBzcyQhIzY3JCQiMFdhcjUkUlRCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZmgjNHUjPk0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMFdhcjUkUlRCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZmgjNHUjPk0jISM3JCIvRWk1KXBzcyQhIzY3JCQiL24ncCZIRlhCISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJlEyZnMhZU0jISM3JCIvRWk1KXBzcyQhIzY3JCQiL24ncCZIRlhCISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJlEyZnMhZU0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMCgqeW4hRzpcQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDcnKSkzcm9cQiEjNyQiL0VpNSlwc3MkISM2NyQkIjAoKnluIUc6XEIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA3JykpM3JvXEIhIzckIi9FaTUpcHNzJCEjNjckJCIwQiJmY0UuYEIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBRKXBlcGNgQiEjNyQiL0VpNSlwc3MkISM2NyQkIjBCImZjRS5gQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFEpcGVwY2BCISM3JCIvRWk1KXBzcyQhIzY3JCQiL05TMUQicE4jISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwbDUmM29XZEIhIzckIi9FaTUpcHNzJCEjNjckJCIvTlMxRCJwTiMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBsNSYzb1dkQiEjNyQiL0VpNSlwc3MkISM2NyQkIjB3OmlOI3pnQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCJIS2VtS2hCISM3JCIvRWk1KXBzcyQhIzY3JCQiMHc6aU4jemdCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIkhLZW1LaEIhIzckIi9FaTUpcHNzJCEjNjckJCIwLkdnP3NZTyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA9TiIzbD9sQiEjNyQiL0VpNSlwc3MkISM2NyQkIjAuR2c/c1lPIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD1OIjNsP2xCISM3JCIvRWk1KXBzcyQhIzY3JCQiMEhTZTBfJm9CISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwV1p6TiczcEIhIzckIi9FaTUpcHNzJCEjNjckJCIwSFNlMF8mb0IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBXWnpOJzNwQiEjNyQiL0VpNSlwc3MkISM2NyQkIjBjX2MhPlZzQiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHJmeD9tSFAjISM3JCIvRWk1KXBzcyQhIzY3JCQiMGNfYyE+VnNCISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcmZ4P21IUCMhIzckIi9FaTUpcHNzJCEjNjckJCIwJFtZYjxKd0IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjApPmRkZyVvUCMhIzckIi9FaTUpcHNzJCEjNjckJCIwJFtZYjxKd0IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjApPmRkZyVvUCMhIzckIi9FaTUpcHNzJCEjNjckJCIwNHhfZyI+IVEjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQyVRMmZzIVEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDR4X2ciPiFRIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEMlUTJmcyFRIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBPKjNiOTIlUSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBeJz5kZGclUSMhIzckIi9FaTUpcHNzJCEjNjckJCIwTyozYjkyJVEjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXic+ZGRnJVEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMGksXEleelEjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweDNxZyZbKVEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMGksXEleelEjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweDNxZyZbKVEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCpRcmE2JD1SIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC9Ab1hsQlIjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCpRcmE2JD1SIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC9Ab1hsQlIjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDpFWCs2ZFIjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvTGoxYEMnUiMhIzYkIi9FaTUpcHNzJCEjNjckJCIwOkVYKzZkUiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9MajFgQydSIyEjNiQiL0VpNSlwc3MkISM2NyQkIjBVUVYmM2YqUiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBkWGs6RCxTIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBVUVYmM2YqUiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBkWGs6RCxTIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBvXVRxcU1TIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCR5RDFdKy9DISM3JCIvRWk1KXBzcyQhIzY3JCQiMG9dVHFxTVMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJHlEMV0rL0MhIzckIi9FaTUpcHNzJCEjNjckJCIwJkgnUmJddFMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvLDJjWyl5UyMhIzYkIi9FaTUpcHNzJCEjNjckJCIwJkgnUmJddFMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvLDJjWyl5UyMhIzYkIi9FaTUpcHNzJCEjNjckJCIwQHZQU0k3VCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBPIyllcWs8VCMhIzckIi9FaTUpcHNzJCEjNjckJCIwQHZQU0k3VCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBPIyllcWs8VCMhIzckIi9FaTUpcHNzJCEjNjckJCIwWyhlYC02OkMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBqJXBiWGs6QyEjNyQiL0VpNSlwc3MkISM2NyQkIjBbKGVgLTY6QyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGolcGJYazpDISM3JCIvRWk1KXBzcyQhIzY3JCQiMHUqUi4sKio9QyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpvXTBXXz5DISM3JCIvRWk1KXBzcyQhIzY3JCQiMHUqUi4sKio9QyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpvXTBXXz5DISM3JCIvRWk1KXBzcyQhIzY3JCQiMCw3SyYqcEdVIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDs+YEQvTVUjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCw3SyYqcEdVIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDs+YEQvTVUjISM3JCIvRWk1KXBzcyQhIzY3JCQiMEdDSSEpXG5VIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFZKXjUlR0ZDISM3JCIvRWk1KXBzcyQhIzY3JCQiMEdDSSEpXG5VIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFZKXjUlR0ZDISM3JCIvRWk1KXBzcyQhIzY3JCQiMGFPR2xIMVYjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcFZcJlI7SkMhIzckIi9FaTUpcHNzJCEjNjckJCIwYU9HbEgxViMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBwVlwmUjtKQyEjNyQiL0VpNSlwc3MkISM2NyQkIjAiKVtFXTRYViMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnZnYvUS9OQyEjNyQiL0VpNSlwc3MkISM2NyQkIjAiKVtFXTRYViMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnZnYvUS9OQyEjNyQiL0VpNSlwc3MkISM2NyQkIjAyaENOKlFRQyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEFvWGxCKlFDISM3JCIvRWk1KXBzcyQhIzY3JCQiMDJoQ04qUVFDISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQW9YbEIqUUMhIzckIi9FaTUpcHNzJCEjNjckJCIwTXRBP3BBVyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBcIVEvTiFHVyMhIzckIi9FaTUpcHNzJCEjNjckJCIwTXRBP3BBVyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBcIVEvTiFHVyMhIzckIi9FaTUpcHNzJCEjNjckJCIvYzNfIVxoVyMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjB2Iz5hTG9ZQyEjNyQiL0VpNSlwc3MkISM2NyQkIi9jM18hXGhXIyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHYjPmFMb1lDISM3JCIvRWk1KXBzcyQhIzY3JCQiMCh5Kj0hKkcrWCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtMFM/ajBYIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAoeSo9ISpHK1gjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLTBTP2owWCMhIzckIi9FaTUpcHNzJCEjNjckJCIwODU8djNSWCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBHPFEwVldYIyEjNyQiL0VpNSlwc3MkISM2NyQkIjA4NTx2M1JYIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEc8UTBWV1gjISM3JCIvRWk1KXBzcyQhIzY3JCQiL0NfLCcpeWRDISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwYkhPIUhLZUMhIzckIi9FaTUpcHNzJCEjNjckJCIvQ18sJyl5ZEMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBiSE8hSEtlQyEjNyQiL0VpNSlwc3MkISM2NyQkIjBtTThYbztZIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCI9V2BGP2lDISM3JCIvRWk1KXBzcyQhIzY3JCQiMG1NOFhvO1kjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIj1XYEY/aUMhIzckIi9FaTUpcHNzJCEjNjckJCIwJHA5LCRbYlkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwM2FLZyMzbUMhIzckIi9FaTUpcHNzJCEjNjckJCIwJHA5LCRbYlkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwM2FLZyMzbUMhIzckIi9FaTUpcHNzJCEjNjckJCIwPmY0OkclcEMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBNbUlYaSpwQyEjNyQiL0VpNSlwc3MkISM2NyQkIjA+ZjQ6RyVwQyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME1tSVhpKnBDISM3JCIvRWk1KXBzcyQhIzY3JCQiMFlyMiszTFojISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwaHlHSVVRWiMhIzckIi9FaTUpcHNzJCEjNjckJCIwWXIyKzNMWiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBoeUdJVVFaIyEjNyQiL0VpNSlwc3MkISM2NyQkIjB0JGVdeT14QyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCgzcF9Ac3hDISM3JCIvRWk1KXBzcyQhIzY3JCQiMHQkZV15PXhDISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKDNwX0BzeEMhIzckIi9FaTUpcHNzJCEjNjckJCIwKmZSK3gxIlsjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOS5EKy07WyMhIzckIi9FaTUpcHNzJCEjNjckJCIwKmZSK3gxIlsjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOS5EKy07WyMhIzckIi9FaTUpcHNzJCEjNjckJCIwRTMtYlpcWyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUOkImPVsmWyMhIzckIi9FaTUpcHNzJCEjNjckJCIwRTMtYlpcWyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUOkImPVsmWyMhIzckIi9FaTUpcHNzJCEjNjckJCIwXz8rU0YpKVsjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbkZAcWgkKlsjISM3JCIvRWk1KXBzcyQhIzY3JCQiMF8/K1NGKSlbIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG5GQHFoJCpbIyEjNyQiL0VpNSlwc3MkISM2NyQkIjB6Sylcc3EjXCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAlKlI+YlRLXCMhIzckIi9FaTUpcHNzJCEjNjckJCIwekspXHNxI1wjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJSpSPmJUS1wjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDBYJyo0KGUnXCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9Bdiw5NyhcIyEjNiQiL0VpNSlwc3MkISM2NyQkIjAwWCcqNChlJ1wjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvQXYsOTcoXCMhIzYkIi9FaTUpcHNzJCEjNjckJCIwS2QlXHBZK0QhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBaazpELDVdIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBLZCVccFkrRCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFprOkQsNV0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMGVwIyp6WVZdIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHR3ODUiKVtdIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBlcCMqellWXSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0dzg1IilbXSMhIzckIi9FaTUpcHNzJCEjNjckJCIwJj0zXG1BM0QhIzckIi9FaTUpcHNzJCEjNjckNyQkIi4qPV40dzNEISM1JCIvRWk1KXBzcyQhIzY3JCQiMCY9M1xtQTNEISM3JCIvRWk1KXBzcyQhIzY3JDckJCIuKj1eNHczRCEjNSQiL0VpNSlwc3MkISM2NyQkIjA2JSopKVwxQF4jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRSw1ITNrN0QhIzckIi9FaTUpcHNzJCEjNjckJCIwNiUqKSlcMUBeIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUsNSEzazdEISM3JCIvRWk1KXBzcyQhIzY3JCQiMFExKFtqKWZeIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGA4M2w/bF4jISM3JCIvRWk1KXBzcyQhIzY3JCQiMFExKFtqKWZeIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGA4M2w/bF4jISM3JCIvRWk1KXBzcyQhIzY3JCQiMGs9Jik+bSk+RCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHpEMV0rL18jISM3JCIvRWk1KXBzcyQhIzY3JCQiMGs9Jik+bSk+RCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHpEMV0rL18jISM3JCIvRWk1KXBzcyQhIzY3JCQiMCI0TFtndUJEISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMVEvTiFHQ0QhIzckIi9FaTUpcHNzJCEjNjckJCIwIjRMW2d1QkQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAxUS9OIUdDRCEjNyQiL0VpNSlwc3MkISM2NyQkIjA8ViIpKmVpRkQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBLXS0/ZyJHRCEjNyQiL0VpNSlwc3MkISM2NyQkIjA8ViIpKmVpRkQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBLXS0/ZyJHRCEjNyQiL0VpNSlwc3MkISM2NyQkIjBXYnp1MDpgIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGZpKzBTP2AjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFdienUwOmAjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZmkrMFM/YCMhIzckIi9FaTUpcHNzJCEjNjckJCIwcm54ZiZRTkQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnWygpKiopPmZgIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBybnhmJlFORCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCdbKCkqKik+ZmAjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCgqenZXbCNSRCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDcob1woKnpSRCEjNyQiL0VpNSlwc3MkISM2NyQkIjAoKnp2V2wjUkQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA3KG9cKCp6UkQhIzckIi9FaTUpcHNzJCEjNjckJCIwQyNSKEhYSmEjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUipcKmZ6T2EjISM3JCIvRWk1KXBzcyQhIzY3JCQiMEMjUihIWEphIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFIqXCpmek9hIyEjNyQiL0VpNSlwc3MkISM2NyQkIi9YP1peLVpEISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwbDYkXCVmdmEjISM3JCIvRWk1KXBzcyQhIzY3JCQiL1g/Wl4tWkQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBsNiRcJWZ2YSMhIzckIi9FaTUpcHNzJCEjNjckJCIweDtxKlwhNGIjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwI1I3KkhSOWIjISM3JCIvRWk1KXBzcyQhIzY3JCQiMHg7cSpcITRiIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCNSNypIUjliIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAuSG8lW3lhRCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD1PKlsiPmBiIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAuSG8lW3lhRCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD1PKlsiPmBiIyEjNyQiL0VpNSlwc3MkISM2NyQkIi84aydwaydlRCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMFhbKCkqKik+ZkQhIzckIi9FaTUpcHNzJCEjNjckJCIvOGsncGsnZUQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBYWygpKiopPmZEISM3JCIvRWk1KXBzcyQhIzY3JCQiMGNga2FXRGMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcmcmWyl5SWMjISM3JCIvRWk1KXBzcyQhIzY3JCQiMGNga2FXRGMjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcmcmWyl5SWMjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRlRSdSQ2tjIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMClIUClwZXBjIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAkZUUnUkNrYyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjApSFApcGVwYyMhIzckIi9FaTUpcHNzJCEjNjckJCIwNHlnQy8uZCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDJj1bJlEzZCMhIzckIi9FaTUpcHNzJCEjNjckJCIwNHlnQy8uZCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDJj1bJlEzZCMhIzckIi9FaTUpcHNzJCEjNjckJCIwTyEqZTQlPXVEISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXigqelI9WmQjISM3JCIvRWk1KXBzcyQhIzY3JCQiME8hKmU0JT11RCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF4oKnpSPVpkIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBpLWQlUjF5RCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHg0eUMpZnlEISM3JCIvRWk1KXBzcyQhIzY3JCQiMGktZCVSMXlEISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweDR5QylmeUQhIzckIi9FaTUpcHNzJCEjNjckJCIwKlteJnpWPmUjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwL0F3NHlDZSMhIzckIi9FaTUpcHNzJCEjNjckJCIwKlteJnpWPmUjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwL0F3NHlDZSMhIzckIi9FaTUpcHNzJCEjNjckJCIwOkZga0JlZSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9WVlp6TidlIyEjNiQiL0VpNSlwc3MkISM2NyQkIjA6RmBrQmVlIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1ZWWnpOJ2UjISM2JCIvRWk1KXBzcyQhIzY3JCQiMFVSXlwuKCplIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGRZc3pQLWYjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFVSXlwuKCplIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGRZc3pQLWYjISM3JCIvRWk1KXBzcyQhIzY3JCQiMG9eXE0kZSRmIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCQpZXFrPFRmIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBvXlxNJGUkZiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkKWVxazxUZiMhIzckIi9FaTUpcHNzJCEjNjckJCIwJlJ3JT5qdWYjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvNihvXCgqemYjISM2JCIvRWk1KXBzcyQhIzY3JCQiMCZSdyU+anVmIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzYob1woKnpmIyEjNiQiL0VpNSlwc3MkISM2NyQkIjBAd1gvVjhnIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME8kb1l0KD1nIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBAd1gvVjhnIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME8kb1l0KD1nIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBbKVElKkdBMEUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBqJlwnPmRkZyMhIzckIi9FaTUpcHNzJCEjNjckJCIwWylRJSpHQTBFISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwaiZcJz5kZGcjISM3JCIvRWk1KXBzcyQhIzY3JCQiMHUrVXUtIjRFISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKnlJWXFqNEUhIzckIi9FaTUpcHNzJCEjNjckJCIwdStVdS0iNEUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqeUlZcWo0RSEjNyQiL0VpNSlwc3MkISM2NyQkIjAsOFNmIylIaCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA7P2gqb144RSEjNyQiL0VpNSlwc3MkISM2NyQkIjAsOFNmIylIaCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA7P2gqb144RSEjNyQiL0VpNSlwc3MkISM2NyQkIjBGRFFXaW9oIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFVLZnUnUjxFISM3JCIvRWk1KXBzcyQhIzY3JCQiMEZEUVdpb2gjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVUtmdSdSPEUhIzckIi9FaTUpcHNzJCEjNjckJCIwYVBPSFUyaSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBwV2RmdzdpIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBhUE9IVTJpIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHBXZGZ3N2kjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCIpXE05QVlpIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCZwYlhrOkRFISM3JCIvRWk1KXBzcyQhIzY3JCQiMCIpXE05QVlpIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCZwYlhrOkRFISM3JCIvRWk1KXBzcyQhIzY3JCQiMDJpSyo+XUdFISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQXBgSE8hSEUhIzckIi9FaTUpcHNzJCEjNjckJCIwMmlLKj5dR0UhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBBcGBITyFIRSEjNyQiL0VpNSlwc3MkISM2NyQkIjBNdUklPVFLRSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFsiPVhoIkhqIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBNdUklPVFLRSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFsiPVhoIkhqIyEjNyQiL0VpNSlwc3MkISM2NyQkIi9tKUdwaGlqIyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHYkKlwqZnpPRSEjNyQiL0VpNSlwc3MkISM2NyQkIi9tKUdwaGlqIyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHYkKlwqZnpPRSEjNyQiL0VpNSlwc3MkISM2NyQkIjAoKSlwVTo5U0UhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtMVslZW5TRSEjNyQiL0VpNSlwc3MkISM2NyQkIjAoKSlwVTo5U0UhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtMVslZW5TRSEjNyQiL0VpNSlwc3MkISM2NyQkIjA4NkRSQFNrIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEc9WXBiWGsjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDg2RFJAU2sjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRz1ZcGJYayMhIzckIi9FaTUpcHNzJCEjNjckJCIvTUtVNyF6ayMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBiSVdhTiVbRSEjNyQiL0VpNSlwc3MkISM2NyQkIi9NS1U3IXprIyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMGJJV2FOJVtFISM3JCIvRWk1KXBzcyQhIzY3JCQiMG1OQDQieV5FISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIkdDJVI6QmwjISM3JCIvRWk1KXBzcyQhIzY3JCQiMG1OQDQieV5FISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIkdDJVI6QmwjISM3JCIvRWk1KXBzcyQhIzY3JCQiMCR6JT4lNG1iRSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDNiU0MmPmNFISM3JCIvRWk1KXBzcyQhIzY3JCQiMCR6JT4lNG1iRSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDNiU0MmPmNFISM3JCIvRWk1KXBzcyQhIzY3JCQiMD5nPHpTJmZFISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTW5RNHYrbSMhIzckIi9FaTUpcHNzJCEjNjckJCIwPmc8elMmZkUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBNblE0dittIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBZczprP01tIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGh6TyVcJlJtIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBZczprP01tIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGh6TyVcJlJtIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBzJVEiXCt0bSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAoPVwkek15bSMhIzckIi9FaTUpcHNzJCEjNjckJCIwcyVRIlwrdG0jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKD1cJHpNeW0jISM3JCIvRWk1KXBzcyQhIzY3JCQiMCpwPlQuPXJFISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOS9Mazk8biMhIzckIi9FaTUpcHNzJCEjNjckJCIwKnA+VC49ckUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA5L0xrOTxuIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBENDU+Z11uIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL2s2JFwlZnZFISM2JCIvRWk1KXBzcyQhIzY3JCQiMEQ0NT5nXW4jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvazYkXCVmdkUhIzYkIi9FaTUpcHNzJCEjNjckJCIwX0AzL1MqeUUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuR0hNdSV6RSEjNyQiL0VpNSlwc3MkISM2NyQkIjBfQDMvUyp5RSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG5HSE11JXpFISM3JCIvRWk1KXBzcyQhIzY3JCQiMHlMMSopPkdvIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCQ0dSM+YUxvIyEjNyQiL0VpNSlwc3MkISM2NyQkIjB5TDEqKT5HbyMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkNHUjPmFMbyMhIzckIi9FaTUpcHNzJCEjNjckJCIwMFkvdSpwJ28jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvS2JVU0IobyMhIzYkIi9FaTUpcHNzJCEjNjckJCIwMFkvdSpwJ28jISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvS2JVU0IobyMhIzYkIi9FaTUpcHNzJCEjNjckJCIwSmUtZnowcCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZbEIqUTYicCMhIzckIi9FaTUpcHNzJCEjNjckJCIwSmUtZnowcCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZbEIqUTYicCMhIzckIi9FaTUpcHNzJCEjNjckJCIwZXErV2ZXcCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0eEB1JCpccCMhIzckIi9FaTUpcHNzJCEjNjckJCIwZXErV2ZXcCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0eEB1JCpccCMhIzckIi9FaTUpcHNzJCEjNjckJCIwJUcpKSpHUiQpcCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqKiopPmZ0KSlwIyEjNyQiL0VpNSlwc3MkISM2NyQkIjAlRykpKkdSJClwIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCoqKik+ZnQpKXAjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYmcFIiPkFxIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUtPVdgRnEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDYmcFIiPkFxIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEUtPVdgRnEjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFAyJiopKik0MUYhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBfOTtITG1xIyEjNyQiL0VpNSlwc3MkISM2NyQkIjBQMiYqKSopNDFGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXzk7SExtcSMhIzckIi9FaTUpcHNzJCEjNjckJCIwaz4kUil5KjRGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwekU5OTgwciMhIzckIi9FaTUpcHNzJCEjNjckJCIwaz4kUil5KjRGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwekU5OTgwciMhIzckIi9FaTUpcHNzJCEjNjckJCIvPjgqb2VRciMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwUjcqSFI5RiEjNyQiL0VpNSlwc3MkISM2NyQkIi8+OCpvZVFyIyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMDBSNypIUjlGISM3JCIvRWk1KXBzcyQhIzY3JCQiMDxXKlEmUXhyIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEteNSVHRj1GISM3JCIvRWk1KXBzcyQhIzY3JCQiMDxXKlEmUXhyIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEteNSVHRj1GISM3JCIvRWk1KXBzcyQhIzY3JCQiMFZjKClRPTtzIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGVqM3BfQHMjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFZjKClRPTtzIyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGVqM3BfQHMjISM3JCIvRWk1KXBzcyQhIzY3JCQiLyhvJlEjKVxERiEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCZlblNELkVGISM3JCIvRWk1KXBzcyQhIzY3JCQiLyhvJlEjKVxERiEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCZlblNELkVGISM3JCIvRWk1KXBzcyQhIzY3JCQiMCc0USkzeSRIRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDYpWyFSNypIRiEjNyQiL0VpNSlwc3MkISM2NyQkIjAnNFEpM3kkSEYhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA2KVshUjcqSEYhIzckIi9FaTUpcHNzJCEjNjckJCIwQiQ+UXpETEYhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBRKy5DI3pMRiEjNyQiL0VpNSlwc3MkISM2NyQkIjBCJD5RekRMRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFErLkMjekxGISM3JCIvRWk1KXBzcyQhIzY3JCQiMFwwISl5UHJ0IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGs3LDRzd3QjISM3JCIvRWk1KXBzcyQhIzY3JCQiMFwwISl5UHJ0IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGs3LDRzd3QjISM3JCIvRWk1KXBzcyQhIzY3JCQiMHc8eWo8NXUjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIlwjKlI+YlRGISM3JCIvRWk1KXBzcyQhIzY3JCQiMHc8eWo8NXUjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIlwjKlI+YlRGISM3JCIvRWk1KXBzcyQhIzY3JCQiMC1Jd1soKlt1IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDxQKCp5SmF1IyEjNyQiL0VpNSlwc3MkISM2NyQkIjAtSXdbKCpbdSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA8UCgqeUphdSMhIzckIi9FaTUpcHNzJCEjNjckJCIwSFV1THgoW0YhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBXXCZSO0pcRiEjNyQiL0VpNSlwc3MkISM2NyQkIjBIVXVMeChbRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFdcJlI7SlxGISM3JCIvRWk1KXBzcyQhIzY3JCQiMGJhcz1kRXYjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvPE8qWyI+YEYhIzYkIi9FaTUpcHNzJCEjNjckJCIwYmFzPWRFdiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIi88TypbIj5gRiEjNiQiL0VpNSlwc3MkISM2NyQkIjAjbzFQcWBjRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMChSPFI4MmRGISM3JCIvRWk1KXBzcyQhIzY3JCQiMCNvMVBxYGNGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKFI8UjgyZEYhIzckIi9FaTUpcHNzJCEjNjckJCIwM3pvKW9UZ0YhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBCJykqKT1eNHcjISM3JCIvRWk1KXBzcyQhIzY3JCQiMDN6bylvVGdGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQicpKik9XjR3IyEjNyQiL0VpNSlwc3MkISM2NyQkIjBOInBPbkhrRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLyYpelE1JFt3IyEjNiQiL0VpNSlwc3MkISM2NyQkIjBOInBPbkhrRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLyYpelE1JFt3IyEjNiQiL0VpNSlwc3MkISM2NyQkIjBoLmxldyJvRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHc1JykpM3JvRiEjNyQiL0VpNSlwc3MkISM2NyQkIjBoLmxldyJvRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHc1JykpM3JvRiEjNyQiL0VpNSlwc3MkISM2NyQkIjApZUpPazBzRiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC5CJVEyZnNGISM3JCIvRWk1KXBzcyQhIzY3JCQiMCllSk9rMHNGISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLkIlUTJmc0YhIzckIi9FaTUpcHNzJCEjNjckJCIwOUdoR09meCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBITiMpZXFreCMhIzckIi9FaTUpcHNzJCEjNjckJCIwOUdoR09meCMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBITiMpZXFreCMhIzckIi9FaTUpcHNzJCEjNjckJCIwVFNmODspekYhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjWiFRL04heSMhIzckIi9FaTUpcHNzJCEjNjckJCIwVFNmODspekYhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjWiFRL04heSMhIzckIi9FaTUpcHNzJCEjNjckJCIwbl9kKWZwJHkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIylmeUdJVXkjISM3JCIvRWk1KXBzcyQhIzY3JCQiMG5fZClmcCR5IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCMpZnlHSVV5IyEjNyQiL0VpNSlwc3MkISM2NyQkIjAlXGNOZWQoeSMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0c3c4NSIpeSMhIzckIi9FaTUpcHNzJCEjNjckJCIwJVxjTmVkKHkjISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNHN3ODUiKXkjISM3JCIvRWk1KXBzcyQhIzY3JCQiL3NQJm9iOXojISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwTiVbKCkqKik+eiMhIzckIi9FaTUpcHNzJCEjNjckJCIvc1Amb2I5eiMhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBOJVsoKSoqKT56IyEjNyQiL0VpNSlwc3MkISM2NyQkIjBaKj1OYkwmeiMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpJ0hQKXBleiMhIzckIi9FaTUpcHNzJCEjNjckJCIwWio9TmJMJnojISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwaSdIUClwZXojISM3JCIvRWk1KXBzcyQhIzY3JCQiMHQsXVE6Iyp6IyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCkpM3JvXCgqeiMhIzckIi9FaTUpcHNzJCEjNjckJCIwdCxdUTojKnojISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKSkzcm9cKCp6IyEjNyQiL0VpNSlwc3MkISM2NyQkIi45W0ImNC5HISM1JCIvRWk1KXBzcyQhIzY3JDckJCIwOkBwYEhPIUchIzckIi9FaTUpcHNzJCEjNjckJCIuOVtCJjQuRyEjNSQiL0VpNSlwc3MkISM2NyQ3JCQiMDpAcGBITyFHISM3JCIvRWk1KXBzcyQhIzY3JCQiMEVFWTN2cCFHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVExuUTR2IUchIzckIi9FaTUpcHNzJCEjNjckJCIwRUVZM3ZwIUchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUTG5RNHYhRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBgUVckXCYzIkchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBvWGxCKlE2RyEjNyQiL0VpNSlwc3MkISM2NyQkIjBgUVckXCYzIkchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBvWGxCKlE2RyEjNyQiL0VpNSlwc3MkISM2NyQkIjB6XVV5TVoiRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCV6TiczcF8iRyEjNyQiL0VpNSlwc3MkISM2NyQkIjB6XVV5TVoiRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCV6TiczcF8iRyEjNyQiL0VpNSlwc3MkISM2NyQkIjAxalNqOSc9RyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEBxaCQqWyI+RyEjNyQiL0VpNSlwc3MkISM2NyQkIjAxalNqOSc9RyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEBxaCQqWyI+RyEjNyQiL0VpNSlwc3MkISM2NyQkIjBLdlFbJVxBRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFojKWZ5R0kjRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBLdlFbJVxBRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFojKWZ5R0kjRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBmKG9MVlBFRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHUlek4nM3AjRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBmKG9MVlBFRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHUlek4nM3AjRyEjNyQiL0VpNSlwc3MkISM2NyQkIjAnKSpcJD1hLSRHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIuMmNbKXlJRyEjNSQiL0VpNSlwc3MkISM2NyQkIjAnKSpcJD1hLSRHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIuMmNbKXlJRyEjNSQiL0VpNSlwc3MkISM2NyQkIjA3N0wuTVQkRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEY+YUxvWSRHISM3JCIvRWk1KXBzcyQhIzY3JCQiMDc3TC5NVCRHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRj5hTG9ZJEchIzckIi9FaTUpcHNzJCEjNjckJCIwUkNKKVEsUUchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBgSl89WyZRRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBSQ0opUSxRRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGFKXz1bJlFHISM3JCIvRWk1KXBzcyQhIzY3JCQiMGxPSHQkKj0lRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1EvTiFHQyVHISM2JCIvRWk1KXBzcyQhIzY3JCQiMGxPSHQkKj0lRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1EvTiFHQyVHISM2JCIvRWk1KXBzcyQhIzY3JCQiMCIqW0ZldGQlRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDJjWyl5SVlHISM3JCIvRWk1KXBzcyQhIzY3JCQiMCIqW0ZldGQlRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDJjWyl5SVlHISM3JCIvRWk1KXBzcyQhIzY3JCQiMD1oRFZgJ1xHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTG9ZdCg9XUchIzckIi9FaTUpcHNzJCEjNjckJCIwPWhEVmAnXEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBMb1l0KD1dRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBYdEJHTE4mRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzFbJWVuUyZHISM2JCIvRWk1KXBzcyQhIzY3JCQiMFh0QkdMTiZHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvMVslZW5TJkchIzYkIi9FaTUpcHNzJCEjNjckJCIwciY9S0pUZEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnR0hNdSV6JkchIzckIi9FaTUpcHNzJCEjNjckJCIwciY9S0pUZEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnR0hNdSV6JkchIzckIi9FaTUpcHNzJCEjNjckJCIwKXoqPilISGhHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwODBUR0Y9J0chIzckIi9FaTUpcHNzJCEjNjckJCIwKXoqPilISGhHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwODBUR0Y9J0chIzckIi9FaTUpcHNzJCEjNjckJCIwQzU9JEc8bEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBSPFI4MmQnRyEjNyQiL0VpNSlwc3MkISM2NyQkIjBDNT0kRzxsRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFI8UjgyZCdHISM3JCIvRWk1KXBzcyQhIzY3JCQiMF5BO29fIXBHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbUhQKXBlcEchIzckIi9FaTUpcHNzJCEjNjckJCIwXkE7b18hcEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBtSFApcGVwRyEjNyQiL0VpNSlwc3MkISM2NyQkIjB4TTlgS0goRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCM+YUxvWXRHISM3JCIvRWk1KXBzcyQhIzY3JCQiMHhNOWBLSChHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIz5hTG9ZdEchIzckIi9FaTUpcHNzJCEjNjckJCIwL1o3UTdvKEchIzckIi9FaTUpcHNzJCEjNjckNyQkIjA+YUxvWXQoRyEjNyQiL0VpNSlwc3MkISM2NyQkIjAvWjdRN28oRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD5hTG9ZdChHISM3JCIvRWk1KXBzcyQhIzY3JCQiLyRmNUIjcCEpRyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMFhtSmBFNylHISM3JCIvRWk1KXBzcyQhIzY3JCQiLyRmNUIjcCEpRyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMFhtSmBFNylHISM3JCIvRWk1KXBzcyQhIzY3JCQiMGRyMzNzWClHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwc3lIUTFeKUchIzckIi9FaTUpcHNzJCEjNjckJCIwZHIzM3NYKUchIzckIi9FaTUpcHNzJCEjNjckNyQkIjBzeUhRMV4pRyEjNyQiL0VpNSlwc3MkISM2NyQkIjAkUW9JPlgpKUchIzckIi9FaTUpcHNzJCEjNjckNyQkIjApNHpLaSkqKSlHISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRRb0k+WCkpRyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCk0ektpKSopKUchIzckIi9FaTUpcHNzJCEjNjckJCIvaFwheUpCKkchIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBELkUzbUcqRyEjNyQiL0VpNSlwc3MkISM2NyQkIi9oXCF5SkIqRyEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMEQuRTNtRypHISM3JCIvRWk1KXBzcyQhIzY3JCQiME8zLmo2aSpHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXjpDJGZ1JypHISM3JCIvRWk1KXBzcyQhIzY3JCQiME8zLmo2aSpHISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXjpDJGZ1JypHISM3JCIvRWk1KXBzcyQhIzY3JCQiMGo/LFsiNCtIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweUZBeUQxIUghIzckIi9FaTUpcHNzJCEjNjckJCIwaj8sWyI0K0ghIzckIi9FaTUpcHNzJCEjNjckNyQkIjB5RkF5RDEhSCEjNyQiL0VpNSlwc3MkISM2NyQkIjAqRyQqSDgoUiFIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwL1M/ajBYIUghIzckIi9FaTUpcHNzJCEjNjckJCIwKkckKkg4KFIhSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC9TP2owWCFIISM3JCIvRWk1KXBzcyQhIzY3JCQiMDtYKHo2JnkhSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEpfPVsmUTNIISM3JCIvRWk1KXBzcyQhIzY3JCQiMDtYKHo2JnkhSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEpfPVsmUTNIISM3JCIvRWk1KXBzcyQhIzY3JCQiMFVkJkg1dDZIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZGs7TGxBIkghIzckIi9FaTUpcHNzJCEjNjckJCIwVWQmSDV0NkghIzckIi9FaTUpcHNzJCEjNjckNyQkIjBkaztMbEEiSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBwcCR6M2g6SCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCVvWiI9WGgiSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBwcCR6M2g6SCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCVvWiI9WGgiSCEjNyQiL0VpNSlwc3MkISM2NyQkIjAmPj1IMlw+SCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLyIqR0pdLT9IISM2JCIvRWk1KXBzcyQhIzY3JCQiMCY+PUgyXD5IISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvIipHSl0tP0ghIzYkIi9FaTUpcHNzJCEjNjckJCIwQSUqKnkwUEJIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUCw2KVshUiNIISM3JCIvRWk1KXBzcyQhIzY3JCQiMEElKip5MFBCSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFAsNilbIVIjSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBbMSlHL0RGSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGo4NHQleUZIISM3JCIvRWk1KXBzcyQhIzY3JCQiMFsxKUcvREZIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwajg0dCV5RkghIzckIi9FaTUpcHNzJCEjNjckJCIwdj0neS04SkghIzckIi9FaTUpcHNzJCEjNjckNyQkIi9mcyFlazskSCEjNiQiL0VpNSlwc3MkISM2NyQkIjB2PSd5LThKSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL2ZzIWVrOyRIISM2JCIvRWk1KXBzcyQhIzY3JCQiMCxKJUcsLE5IISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwO1EwVldiJEghIzckIi9FaTUpcHNzJCEjNjckJCIwLEolRywsTkghIzckIi9FaTUpcHNzJCEjNjckNyQkIjA7UTBWV2IkSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBHViN5KiopKVFIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVl0uR0MlUkghIzckIi9FaTUpcHNzJCEjNjckJCIwR1YjeSoqKSlRSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFZdLkdDJVJIISM3JCIvRWk1KXBzcyQhIzY3JCQiMGFiIUcpcEYlSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHBpLDgvTCVIISM3JCIvRWk1KXBzcyQhIzY3JCQiMGFiIUcpcEYlSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHBpLDgvTCVIISM3JCIvRWk1KXBzcyQhIzY3JCQiMCJ5J3luXG0lSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCdcKCp6Uj1aSCEjNyQiL0VpNSlwc3MkISM2NyQkIjAieSd5blxtJUghIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnXCgqelI9WkghIzckIi9FaTUpcHNzJCEjNjckJCIwMiFvRiZIMCZIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQSh5SFExXkghIzckIi9FaTUpcHNzJCEjNjckJCIwMiFvRiZIMCZIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQSh5SFExXkghIzckIi9FaTUpcHNzJCEjNjckJCIwTSNceCQ0VyZIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXCpmek8lXCZIISM3JCIvRWk1KXBzcyQhIzY3JCQiME0jXHgkNFcmSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFwqZnpPJVwmSCEjNyQiL0VpNSlwc3MkISM2NyQkIi9ZSUYjKkdlSCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHY2JUhOIyllSCEjNyQiL0VpNSlwc3MkISM2NyQkIi9ZSUYjKkdlSCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMHY2JUhOIyllSCEjNyQiL0VpNSlwc3MkISM2NyQkIjAobzZ4IXBAJ0ghIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtQyN6THFpSCEjNyQiL0VpNSlwc3MkISM2NyQkIjAobzZ4IXBAJ0ghIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtQyN6THFpSCEjNyQiL0VpNSlwc3MkISM2NyQkIjA4SHAjKltnJ0ghIzckIi9FaTUpcHNzJCEjNjckNyQkIjBHTyFIS2VtSCEjNyQiL0VpNSlwc3MkISM2NyQkIjA4SHAjKltnJ0ghIzckIi9FaTUpcHNzJCEjNjckNyQkIjBHTyFIS2VtSCEjNyQiL0VpNSlwc3MkISM2NyQkIi85dXcoRypwSCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMGJbKXlJWXFIISM3JCIvRWk1KXBzcyQhIzY3JCQiLzl1dyhHKnBIISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwYlspeUlZcUghIzckIi9FaTUpcHNzJCEjNjckJCIwbWBsaTNRKEghIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiM21HSE11SCEjNyQiL0VpNSlwc3MkISM2NyQkIjBtYGxpM1EoSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCIzbUdITXVIISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRmT3clKW94SCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDN0JXlGQXlIISM3JCIvRWk1KXBzcyQhIzY3JCQiMCRmT3clKW94SCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDN0JXlGQXlIISM3JCIvRWk1KXBzcyQhIzY3JCQiMD55aEtvOilIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTSZHR0U1IylIISM3JCIvRWk1KXBzcyQhIzY3JCQiMD55aEtvOilIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTSZHR0U1IylIISM3JCIvRWk1KXBzcyQhIzY3JCQiMFkhKmY8W2EpSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGgoNHlDKWYpSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBZISpmPFthKUghIzckIi9FaTUpcHNzJCEjNjckNyQkIjBoKDR5QylmKUghIzckIi9FaTUpcHNzJCEjNjckJCIwcy1lLUckKilIISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKCk0ektpKSopSCEjNyQiL0VpNSlwc3MkISM2NyQkIjBzLWUtRyQqKUghIzckIi9FaTUpcHNzJCEjNjckNyQkIjAoKTR6S2kpKilIISM3JCIvRWk1KXBzcyQhIzY3JCQiMCpcaHZ5PyQqSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDlBeDxVUCpIISM3JCIvRWk1KXBzcyQhIzY3JCQiMCpcaHZ5PyQqSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDlBeDxVUCpIISM3JCIvRWk1KXBzcyQhIzY3JCQiMERGYXMoMygqSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1dgRj9pKCpIISM2JCIvRWk1KXBzcyQhIzY3JCQiMERGYXMoMygqSCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1dgRj9pKCpIISM2JCIvRWk1KXBzcyQhIzY3JCQiMF9SX2RuNCskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbll0KD1dLEkhIzckIi9FaTUpcHNzJCEjNjckJCIwX1JfZG40KyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuWXQoPV0sSSEjNyQiL0VpNSlwc3MkISM2NyQkIjB5Xl1VWlsrJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCQqZXJzIlEwSSEjNyQiL0VpNSlwc3MkISM2NyQkIjB5Xl1VWlsrJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCQqZXJzIlEwSSEjNyQiL0VpNSlwc3MkISM2NyQkIjAwa1tGRigzSSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzcocGRoIzRJISM2JCIvRWk1KXBzcyQhIzY3JCQiMDBrW0ZGKDNJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvNyhwZGgjNEkhIzYkIi9FaTUpcHNzJCEjNjckJCIwSndZNzJFLCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZJHlFOTk4SSEjNyQiL0VpNSlwc3MkISM2NyQkIjBKd1k3MkUsJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFkkeUU5OThJISM3JCIvRWk1KXBzcyQhIzY3JCQiMGUpW3VwWztJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdCZmdzctPEkhIzckIi9FaTUpcHNzJCEjNjckJCIwZSlbdXBbO0khIzckIi9FaTUpcHNzJCEjNjckNyQkIjB0JmZ3Ny08SSEjNyQiL0VpNSlwc3MkISM2NyQkIjAlM0lDb08/SSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCp6U0U2ITQtJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAlM0lDb08/SSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCp6U0U2ITQtJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA2OFRuWVUtJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEU/aSg0eUNJISM3JCIvRWk1KXBzcyQhIzY3JCQiMDY4VG5ZVS0kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRT9pKDR5Q0khIzckIi9FaTUpcHNzJCEjNjckJCIwUERSX0UiR0khIzckIi9FaTUpcHNzJCEjNjckNyQkIjBfS2cjM21HSSEjNyQiL0VpNSlwc3MkISM2NyQkIjBQRFJfRSJHSSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF9LZyMzbUdJISM3JCIvRWk1KXBzcyQhIzY3JCQiMGtQUFAxPy4kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweldlblNELiQhIzckIi9FaTUpcHNzJCEjNjckJCIwa1BQUDE/LiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB6V2VuU0QuJCEjNyQiL0VpNSlwc3MkISM2NyQkIi8qXE5BJyllLiQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwZGNfP2suJCEjNyQiL0VpNSlwc3MkISM2NyQkIi8qXE5BJyllLiQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAxZGNfP2suJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA8aUwybShSSSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEtwYVArLi8kISM3JCIvRWk1KXBzcyQhIzY3JCQiMDxpTDJtKFJJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwS3BhUCsuLyQhIzckIi9FaTUpcHNzJCEjNjckJCIwV3VKI2ZrVkkhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBlIkdELT1XSSEjNyQiL0VpNSlwc3MkISM2NyQkIjBXdUojZmtWSSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGYiR0QtPVdJISM3JCIvRWk1KXBzcyQhIzY3JCQiL24pSHhEdi8kISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJlE0disxW0khIzckIi9FaTUpcHNzJCEjNjckJCIvbilIeER2LyQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmUTR2KzFbSSEjNyQiL0VpNSlwc3MkISM2NyQkIjAoKil6QWNTXkkhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA3MVwjKlI+MCQhIzckIi9FaTUpcHNzJCEjNjckJCIwKCopekFjU15JISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNzFcIypSPjAkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEI2RVomR2JJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUT1aeD5lMCQhIzckIi9FaTUpcHNzJCEjNjckJCIwQjZFWiZHYkkhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBRPVp4PmUwJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBcQkNLbCJmSSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGxJWGkqcGZJISM3JCIvRWk1KXBzcyQhIzY3JCQiMFxCQ0tsImZJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbElYaSpwZkkhIzckIi9FaTUpcHNzJCEjNjckJCIwd05BPFhJMSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiSE11JXpOMSQhIzckIi9FaTUpcHNzJCEjNjckJCIwd05BPFhJMSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiSE11JXpOMSQhIzckIi9FaTUpcHNzJCEjNjckJCIwLls/LURwMSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA9YlRLZnUxJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAuWz8tRHAxJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD1iVEtmdTEkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEhnPShbITMyJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFduUjxSODIkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEhnPShbITMyJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFduUjxSODIkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGNzO3Mlb3VJISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcnpQLT5fMiQhIzckIi9FaTUpcHNzJCEjNjckJCIwY3M7cyVvdUkhIzckIi9FaTUpcHNzJCEjNjckNyQkIjByelAtPl8yJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAjW1tyWGN5SSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiL0VpNSlwc3MkISM2NyQkIjAjW1tyWGN5SSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiL0VpNSlwc3MkISM2NyQkIjA0KEhAV1cjMyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDL01zeUgzJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA0KEhAV1cjMyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDL01zeUgzJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBONDZGQ2ozJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL2xAdCZlbzMkISM2JCIvRWk1KXBzcyQhIzY3JCQiME40NkZDajMkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvbEB0JmVvMyQhIzYkIi9FaTUpcHNzJCEjNjckJCIwaUA0Ny8tNCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB4R0lVUTI0JCEjNyQiL0VpNSlwc3MkISM2NyQkIjBpQDQ3Ly00JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHhHSVVRMjQkISM3JCIvRWk1KXBzcyQhIzY3JCQiMClRdHFSMyU0JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC5UR0Y9WTQkISM3JCIvRWk1KXBzcyQhIzY3JCQiMClRdHFSMyU0JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC5UR0Y9WTQkISM3JCIvRWk1KXBzcyQhIzY3JCQiMDpZMCNRJ3o0JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL0xsQSIpXCk0JCEjNiQiL0VpNSlwc3MkISM2NyQkIjA6WTAjUSd6NCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9MbEEiKVwpNCQhIzYkIi9FaTUpcHNzJCEjNjckJCIwVGUublY9NSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjbEMoelAtSiEjNyQiL0VpNSlwc3MkISM2NyQkIjBUZS5uVj01JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGNsQyh6UC1KISM3JCIvRWk1KXBzcyQhIzY3JCQiMG9xLF9CZDUkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJHlGQXlEMUohIzckIi9FaTUpcHNzJCEjNjckJCIwb3EsX0JkNSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkeUZBeUQxSiEjNyQiL0VpNSlwc3MkISM2NyQkIjAlSCkqcExnNEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0ITRzdzg1SiEjNyQiL0VpNSlwc3MkISM2NyQkIjAlSCkqcExnNEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0ITRzdzg1SiEjNyQiL0VpNSlwc3MkISM2NyQkIjBAJno+S1s4SiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME8tPl88UzYkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEAmej5LWzhKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTy0+XzxTNiQhIzckIi9FaTUpcHNzJCEjNjckJCIwWjIncElPPEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpOTxQKCp5NiQhIzckIi9FaTUpcHNzJCEjNjckJCIwWjIncElPPEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpOTxQKCp5NiQhIzckIi9FaTUpcHNzJCEjNjckJCIwdT4lPkhDQEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqb19Ac3hASiEjNyQiL0VpNSlwc3MkISM2NyQkIjB1PiU+SENASiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpvX0BzeEBKISM3JCIvRWk1KXBzcyQhIzY3JCQiLksjcEY3REohIzUkIi9FaTUpcHNzJCEjNjckNyQkIjA6UjgyZGM3JCEjNyQiL0VpNSlwc3MkISM2NyQkIi5LI3BGN0RKISM1JCIvRWk1KXBzcyQhIzY3JDckJCIwOlI4MmRjNyQhIzckIi9FaTUpcHNzJCEjNjckJCIwRlchPkUrSEohIzckIi9FaTUpcHNzJCEjNjckNyQkIjBVXjYjcGBISiEjNyQiL0VpNSlwc3MkISM2NyQkIjBGVyE+RStISiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFVeNiNwYEhKISM3JCIvRWk1KXBzcyQhIzY3JCQiMGBjKW9DKUc4JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG9qNHg7TTgkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGBjKW9DKUc4JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG9qNHg7TTgkISM3JCIvRWk1KXBzcyQhIzY3JCQiLylvJz1Cd09KISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJmZ4P21IUEohIzckIi9FaTUpcHNzJCEjNjckJCIvKW8nPUJ3T0ohIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmZng/bUhQSiEjNyQiL0VpNSlwc3MkISM2NyQkIjAxIltvQGtTSiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEApZXFrPFRKISM3JCIvRWk1KXBzcyQhIzY3JCQiMDEiW29Aa1NKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQCllcWs8VEohIzckIi9FaTUpcHNzJCEjNjckJCIwTCRIPT9fV0ohIzckIi9FaTUpcHNzJCEjNjckNyQkIjBbKy9LY105JCEjNyQiL0VpNSlwc3MkISM2NyQkIjBMJEg9P19XSiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFsrL0tjXTkkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGYwIm89U1tKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdTctPE8qW0ohIzckIi9FaTUpcHNzJCEjNjckJCIwZjAibz1TW0ohIzckIi9FaTUpcHNzJCEjNjckNyQkIjB1Ny08TypbSiEjNyQiL0VpNSlwc3MkISM2NyQkIjAneSJ6ciJHX0ohIzckIi9FaTUpcHNzJCEjNjckNyQkIjAsRCstO0c6JCEjNyQiL0VpNSlwc3MkISM2NyQkIjAneSJ6ciJHX0ohIzckIi9FaTUpcHNzJCEjNjckNyQkIjAsRCstO0c6JCEjNyQiL0VpNSlwc3MkISM2NyQkIjA3SXhjaGg6JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEZQKXBlcGNKISM3JCIvRWk1KXBzcyQhIzY3JCQiMDdJeGNoaDokISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRlApcGVwY0ohIzckIi9FaTUpcHNzJCEjNjckJCIwUlV2VFQrOyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBhXCc+ZGRnSiEjNyQiL0VpNSlwc3MkISM2NyQkIjBSVXZUVCs7JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGFcJz5kZGdKISM3JCIvRWk1KXBzcyQhIzY3JCQiMGxhdEVAUjskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvPVlwYlhrSiEjNiQiL0VpNSlwc3MkISM2NyQkIjBsYXRFQFI7JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLz1ZcGJYa0ohIzYkIi9FaTUpcHNzJCEjNjckJCIwI3A7PDYheTskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMnUjPmFMb0ohIzckIi9FaTUpcHNzJCEjNjckJCIwI3A7PDYheTskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMnUjPmFMb0ohIzckIi9FaTUpcHNzJCEjNjckJCIwPXpwJzRvckohIzckIi9FaTUpcHNzJCEjNjckNyQkIjBMJzNwX0BzSiEjNyQiL0VpNSlwc3MkISM2NyQkIjA9enAnNG9ySiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEwnM3BfQHNKISM3JCIvRWk1KXBzcyQhIzY3JCQiMFgiejszY3ZKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvJykqKT1eNHdKISM2JCIvRWk1KXBzcyQhIzY3JCQiMFgiejszY3ZKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvJykqKT1eNHdKISM2JCIvRWk1KXBzcyQhIzY3JCQiMHIubW1TJXpKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJzNyb1woKnpKISM3JCIvRWk1KXBzcyQhIzY3JCQiMHIubW1TJXpKISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJzNyb1woKnpKISM3JCIvRWk1KXBzcyQhIzY3JCQiMClmVDswSyQ9JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDhCJj1bJlE9JCEjNyQiL0VpNSlwc3MkISM2NyQkIjApZlQ7MEskPSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA4QiY9WyZRPSQhIzckIi9FaTUpcHNzJCEjNjckJCIwQ0dpTytzPSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBSTiRvWXQoPSQhIzckIi9FaTUpcHNzJCEjNjckJCIwQ0dpTytzPSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBSTiRvWXQoPSQhIzckIi9FaTUpcHNzJCEjNjckJCIwXlNnQCEzIj4kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbVoiPVhoIj4kISM3JCIvRWk1KXBzcyQhIzY3JCQiMF5TZ0AhMyI+JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG1aIj1YaCI+JCEjNyQiL0VpNSlwc3MkISM2NyQkIjB4X2UxZ1w+JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCMqZnpPJVwmPiQhIzckIi9FaTUpcHNzJCEjNjckJCIweF9lMWdcPiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAjKmZ6TyVcJj4kISM3JCIvRWk1KXBzcyQhIzY3JCQiMC9sYyIqUikpPiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA+c3hAdSQqPiQhIzckIi9FaTUpcHNzJCEjNjckJCIwL2xjIipSKSk+JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD5zeEB1JCo+JCEjNyQiL0VpNSlwc3MkISM2NyQkIi90WmwoPkY/JCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMFglZW5TRC5LISM3JCIvRWk1KXBzcyQhIzY3JCQiL3RabCg+Rj8kISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwWCVlblNELkshIzckIi9FaTUpcHNzJCEjNjckJCIwZCpHOicqZjFLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcydSPFI4MkshIzckIi9FaTUpcHNzJCEjNjckJCIwZCpHOicqZjFLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcydSPFI4MkshIzckIi9FaTUpcHNzJCEjNjckJCIwJD01bCV6L0AkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKSozc3c4NUAkISM3JCIvRWk1KXBzcyQhIzY3JCQiMCQ9NWwlei9AJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCkqM3N3ODVAJCEjNyQiL0VpNSlwc3MkISM2NyQkIi9UIlxKZlZAJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiL0VpNSlwc3MkISM2NyQkIi9UIlxKZlZAJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMERAcWgkKltAJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBPRVo7UiM9SyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF5Mb1l0KD1LISM3JCIvRWk1KXBzcyQhIzY3JCQiME9FWjtSIz1LISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXkxvWXQoPUshIzckIi9FaTUpcHNzJCEjNjckJCIwalFYLD5AQSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB5WG1KYEVBJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBqUVgsPkBBJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHlYbUpgRUEkISM3JCIvRWk1KXBzcyQhIzY3JCQiMCozTmspKSpmQSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAvZWs7TGxBJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAqM05rKSkqZkEkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwL2VrO0xsQSQhIzckIi9FaTUpcHNzJCEjNjckJCIwO2pUcnkpSEshIzckIi9FaTUpcHNzJCEjNjckNyQkIjBKcWksOC9CJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA7alRyeSlISyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEpxaSw4L0IkISM3JCIvRWk1KXBzcyQhIzY3JCQiMFV2UmNlUEIkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZCMzbUdITUshIzckIi9FaTUpcHNzJCEjNjckJCIwVXZSY2VQQiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBkIzNtR0hNSyEjNyQiL0VpNSlwc3MkISM2NyQkIjBwKHk4JVF3QiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAlWyplcnMiUUshIzckIi9FaTUpcHNzJCEjNjckJCIwcCh5OCVRd0IkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJVsqZXJzIlFLISM3JCIvRWk1KXBzcyQhIzY3JCQiMCYqKmZqIz06QyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9ycWxEMFVLISM2JCIvRWk1KXBzcyQhIzY3JCQiMCYqKmZqIz06QyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9ycWxEMFVLISM2JCIvRWk1KXBzcyQhIzY3JCQiMEE3TTYpUlhLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUD5iVEtmQyQhIzckIi9FaTUpcHNzJCEjNjckJCIwQTdNNilSWEshIzckIi9FaTUpcHNzJCEjNjckNyQkIjBQPmJUS2ZDJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBcQ0snekZcSyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGpKYEU3KVxLISM3JCIvRWk1KXBzcyQhIzY3JCQiMFxDSyd6RlxLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwakpgRTcpXEshIzckIi9FaTUpcHNzJCEjNjckJCIwdk9JInk6YEshIzckIi9FaTUpcHNzJCEjNjckNyQkIi9SOTpAcGBLISM2JCIvRWk1KXBzcyQhIzY3JCQiMHZPSSJ5OmBLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvUjk6QHBgSyEjNiQiL0VpNSlwc3MkISM2NyQkIjAtXEdtUHFEJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDtjXCc+ZGRLISM3JCIvRWk1KXBzcyQhIzY3JCQiMC1cR21QcUQkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPGNcJz5kZEshIzckIi9FaTUpcHNzJCEjNjckJCIwR2hFXjw0RSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBWb1oiPVhoSyEjNyQiL0VpNSlwc3MkISM2NyQkIjBHaEVePDRFJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFZvWiI9WGhLISM3JCIvRWk1KXBzcyQhIzY3JCQiMGJ0Q08oemtLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvMmVrO0xsSyEjNiQiL0VpNSlwc3MkISM2NyQkIjBidENPKHprSyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzJlaztMbEshIzYkIi9FaTUpcHNzJCEjNjckJCIwImVHN3Nub0shIzckIi9FaTUpcHNzJCEjNjckNyQkIjAnSFI5OkBwSyEjNyQiL0VpNSlwc3MkISM2NyQkIjAiZUc3c25vSyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCdIUjk6QHBLISM3JCIvRWk1KXBzcyQhIzY3JCQiMDMpNGlxYnNLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQjBVTyI0dEshIzckIi9FaTUpcHNzJCEjNjckJCIwMyk0aXFic0shIzckIi9FaTUpcHNzJCEjNjckNyQkIjBCMFVPIjR0SyEjNyQiL0VpNSlwc3MkISM2NyQkIjBNNT4icFZ3SyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFw8U0BycEYkISM3JCIvRWk1KXBzcyQhIzY3JCQiME01PiJwVndLISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXDxTQHJwRiQhIzckIi9FaTUpcHNzJCEjNjckJCIwaEE8dzsuRyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB3SFExXjNHJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBoQTx3Oy5HJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHdIUTFeM0ckISM3JCIvRWk1KXBzcyQhIzY3JCQiMChbYDZtPiVHJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC1VTyI0dCVHJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAoW2A2bT4lRyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAtVU8iNHQlRyQhIzckIi9FaTUpcHNzJCEjNjckJCIwOVo4WXchKUckISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwSGFNdzUnKUckISM3JCIvRWk1KXBzcyQhIzY3JCQiMDlaOFl3ISlHJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEhhTXc1JylHJCEjNyQiL0VpNSlwc3MkISM2NyQkIi8lZjZKYz5IJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMGJtS2ghXCNIJCEjNyQiL0VpNSlwc3MkISM2NyQkIi8lZjZKYz5IJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMGJtS2ghXCNIJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBucjQ7T2VIJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCMpeUlZcWpIJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBucjQ7T2VIJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCMpeUlZcWpIJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAkUnk1Z3IqSCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAzIipHSl0tSSQhIzckIi9FaTUpcHNzJCEjNjckJCIwJFJ5NWdyKkgkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMyIqR0pdLUkkISM3JCIvRWk1KXBzcyQhIzY3JCQiL2lmZ2VmLkwhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBOLkY7SVRJJCEjNyQiL0VpNSlwc3MkISM2NyQkIi9pZmdlZi5MISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwTi5GO0lUSSQhIzckIi9FaTUpcHNzJCEjNjckJCIwWTMvcnZ1SSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBoOkQsNSEzTCEjNyQiL0VpNSlwc3MkISM2NyQkIjBZMy9ydnVJJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGg6RCw1ITNMISM3JCIvRWk1KXBzcyQhIzY3JCQiMHQ/LWNiOEokISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKXlLaSkqKT1KJCEjNyQiL0VpNSlwc3MkISM2NyQkIjB0Py1jYjhKJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCl5S2kpKik9SiQhIzckIi9FaTUpcHNzJCEjNjckJCIwKkguNWFCOkwhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA5U0BycGRKJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAqSC41YUI6TCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDlTQHJwZEokISM3JCIvRWk1KXBzcyQhIzY3JCQiMEVYKWZfNj5MISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVF8+Y1wnPkwhIzckIi9FaTUpcHNzJCEjNjckJCIwRVgpZl82PkwhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUXz5jXCc+TCEjNyQiL0VpNSlwc3MkISM2NyQkIjBfZCc0XipISyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuazxUSE5LJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBfZCc0XipISyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuazxUSE5LJCEjNyQiL0VpNSlwc3MkISM2NyQkIjB6cCVmXChvSyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAlcGRoIzR1SyQhIzckIi9FaTUpcHNzJCEjNjckJCIwenAlZlwob0skISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJXBkaCM0dUskISM3JCIvRWk1KXBzcyQhIzY3JCQiMDAjRzRbdklMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvIypRNiIqR0pMISM2JCIvRWk1KXBzcyQhIzY3JCQiMDAjRzRbdklMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvIypRNiIqR0pMISM2JCIvRWk1KXBzcyQhIzY3JCQiMEslNGZZak1MISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwWiw3JypvXkwkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEslNGZZak1MISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwWiw3JypvXkwkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGUxKjNYXlFMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdDg1IilbIVJMISM3JCIvRWk1KXBzcyQhIzY3JCQiMGUxKjNYXlFMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdDg1IilbIVJMISM3JCIvRWk1KXBzcyQhIzY3JCQiMCYpPShlVlJVTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLkUzbUdITSQhIzUkIi9FaTUpcHNzJCEjNjckJCIwJik9KGVWUlVMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIuRTNtR0hNJCEjNSQiL0VpNSlwc3MkISM2NyQkIjA2SiYzVUZZTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEVRMV4zb00kISM3JCIvRWk1KXBzcyQhIzY3JCQiMDZKJjNVRllMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRVExXjNvTSQhIzckIi9FaTUpcHNzJCEjNjckJCIwUVYkZVM6XUwhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBgXS9PKW9dTCEjNyQiL0VpNSlwc3MkISM2NyQkIjBRViRlUzpdTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGBdL08pb11MISM3JCIvRWk1KXBzcyQhIzY3JCQiMGtiIjNSLmFMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwemktQG9YTiQhIzckIi9FaTUpcHNzJCEjNjckJCIwa2IiM1IuYUwhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB6aS1Ab1hOJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAieid6djh6TiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAxdisxWyVlTCEjNyQiL0VpNSlwc3MkISM2NyQkIjAieid6djh6TiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAxdisxWyVlTCEjNyQiL0VpNSlwc3MkISM2NyQkIjA8IXkyT3poTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEsoKSk0ektpTCEjNyQiL0VpNSlwc3MkISM2NyQkIjA8IXkyT3poTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEsoKSk0ektpTCEjNyQiL0VpNSlwc3MkISM2NyQkIjBXI2ZkTW5sTCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGYqcGZ4P21MISM3JCIvRWk1KXBzcyQhIzY3JCQiMFcjZmRNbmxMISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZipwZng/bUwhIzckIi9FaTUpcHNzJCEjNjckJCIvWlMyTGJwTCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCY9XjR3M3FMISM3JCIvRWk1KXBzcyQhIzY3JCQiL1pTMkxicEwhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmPV40dzNxTCEjNyQiL0VpNSlwc3MkISM2NyQkIjAocEBkSlZ0TCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDdDJGZ1J1JQJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAocEBkSlZ0TCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDdDJGZ1J1JQJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBCSHErOHRQJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFFPIjR0JXlQJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBCSHErOHRQJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFFPIjR0JXlQJCEjNyQiL0VpNSlwc3MkISM2NyQkIi86JW8mRz4iUSQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBsWyplcnMiUSQhIzckIi9FaTUpcHNzJCEjNjckJCIvOiVvJkc+IlEkISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwbFsqZXJzIlEkISM3JCIvRWk1KXBzcyQhIzY3JCQiMHdgbXFzXVEkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIjR3M3FnJlEkISM3JCIvRWk1KXBzcyQhIzY3JCQiMHdgbXFzXVEkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIjR3M3FnJlEkISM3JCIvRWk1KXBzcyQhIzY3JCQiMC5ta2JfKilRJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD10JmVvWypRJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAubWtiXyopUSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA9dCZlb1sqUSQhIzckIi9FaTUpcHNzJCEjNjckJCIwSHlpU0tHUiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBXJlEzbk8kUiQhIzckIi9FaTUpcHNzJCEjNjckJCIwSHlpU0tHUiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBXJlEzbk8kUiQhIzckIi9FaTUpcHNzJCEjNjckJCIwYyE0Y0FyJ1IkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcig+ZWxDKFIkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGMhNGNBcidSJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHIoPmVsQyhSJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAjRyFmNSNmK00hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAoKjQhM2s3LE0hIzckIi9FaTUpcHNzJCEjNjckJCIwI0chZjUjZitNISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKCo0ITNrNyxNISM3JCIvRWk1KXBzcyQhIzY3JCQiMDQ6ZCY+Wi9NISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQ0F5RDFdUyQhIzckIi9FaTUpcHNzJCEjNjckJCIwNDpkJj5aL00hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDQXlEMV1TJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBORmIhPU4zTSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL1hqMmgpKTNNISM2JCIvRWk1KXBzcyQhIzY3JCQiME5GYiE9TjNNISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvWGoyaCkpM00hIzYkIi9FaTUpcHNzJCEjNjckJCIwaVJgbEpBVCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB4WXUmZnc3TSEjNyQiL0VpNSlwc3MkISM2NyQkIjBpUmBsSkFUJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHhZdSZmdzdNISM3JCIvRWk1KXBzcyQhIzY3JCQiMCk9OjA6NjtNISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLmZzIWVrO00hIzckIi9FaTUpcHNzJCEjNjckJCIwKT06MDo2O00hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAuZnMhZWs7TSEjNyQiL0VpNSlwc3MkISM2NyQkIjA6a1xOIioqPk0hIzckIi9FaTUpcHNzJCEjNjckNyQkIi84MmRjXz9NISM2JCIvRWk1KXBzcyQhIzY3JCQiMDprXE4iKio+TSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzgyZGNfP00hIzYkIi9FaTUpcHNzJCEjNjckJCIwVHdaP3JRVSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjJClvXTBXVSQhIzckIi9FaTUpcHNzJCEjNjckJCIwVHdaP3JRVSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBjJClvXTBXVSQhIzckIi9FaTUpcHNzJCEjNjckJCIwbyllYTV2Rk0hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkZXBjYEdHTSEjNyQiL0VpNSlwc3MkISM2NyQkIjBvKWVhNXZGTSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCRlcGNgR0dNISM3JCIvRWk1KXBzcyQhIzY3JCQiMCU0Uy80akpNISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNDNsP2xAViQhIzckIi9FaTUpcHNzJCEjNjckJCIwJTRTLzRqSk0hIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0M2w/bEBWJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBAOFV2NWJWJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME8/ajBYZ1YkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEA4VXY1YlYkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTz9qMFhnViQhIzckIi9FaTUpcHNzJCEjNjckJCIwWkRTZyFSUk0hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpS2ghXCMqUk0hIzckIi9FaTUpcHNzJCEjNjckJCIwWkRTZyFSUk0hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpS2ghXCMqUk0hIzckIi9FaTUpcHNzJCEjNjckJCIwdVBRWHFLVyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqWyVmdi9RVyQhIzckIi9FaTUpcHNzJCEjNjckJCIwdVBRWHFLVyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqWyVmdi9RVyQhIzckIi9FaTUpcHNzJCEjNjckJCItbC4uOlpNISIqJCIvRWk1KXBzcyQhIzY3JDckJCIwOmRkZyVvWk0hIzckIi9FaTUpcHNzJCEjNjckJCItbC4uOlpNISIqJCIvRWk1KXBzcyQhIzY3JDckJCIwOmRkZyVvWk0hIzckIi9FaTUpcHNzJCEjNjckJCIwRmlNOkk1WCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBVcGJYazpYJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBGaU06STVYJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFVwYlhrOlgkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGB1Sys1XFgkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbyJRMFZXYk0hIzckIi9FaTUpcHNzJCEjNjckJCIwYHVLKzVcWCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBvIlEwVldiTSEjNyQiL0VpNSlwc3MkISM2NyQkIi9vM2ApKnllTSEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCZSPmJUS2ZNISM3JCIvRWk1KXBzcyQhIzY3JCQiL28zYCkqeWVNISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwJlI+YlRLZk0hIzckIi9FaTUpcHNzJCEjNjckJCIwMioqR3FwRVkkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQDFdKy9LWSQhIzckIi9FaTUpcHNzJCEjNjckJCIwMioqR3FwRVkkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQDFdKy9LWSQhIzckIi9FaTUpcHNzJCEjNjckJCIwTDZGYlxsWSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBbPVsmUTNuTSEjNyQiL0VpNSlwc3MkISM2NyQkIjBMNkZiXGxZJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFs9WyZRM25NISM3JCIvRWk1KXBzcyQhIzY3JCQiL09fLSVIL1okISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwdUlZcWo0WiQhIzckIi9FaTUpcHNzJCEjNjckJCIvT18tJUgvWiQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjB1SVlxajRaJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAnZUxfIzRWWiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAsVldiVltaJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAnZUxfIzRWWiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAsVldiVltaJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA4W0A1Kj15TSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEdiVVNCKHlNISM3JCIvRWk1KXBzcyQhIzY3JCQiMDhbQDUqPXlNISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwR2JVU0IoeU0hIzckIi9FaTUpcHNzJCEjNjckJCIwUmc+JipvP1skISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYW5TRC5FWyQhIzckIi9FaTUpcHNzJCEjNjckJCIwUmc+JipvP1skISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYW5TRC5FWyQhIzckIi9FaTUpcHNzJCEjNjckJCIwbXM8ISlbZlskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwIil6UTUkWydbJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBtczwhKVtmWyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiKXpRNSRbJ1skISM3JCIvRWk1KXBzcyQhIzY3JCQiMCNcZV4nRykqWyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAyI3BgSE8hXCQhIzckIi9FaTUpcHNzJCEjNjckJCIwI1xlXidHKSpbJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDIjcGBITyFcJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA+KFIsJjNQXCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBNL04hR0MlXCQhIzckIi9FaTUpcHNzJCEjNjckJCIwPihSLCYzUFwkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwTS9OIUdDJVwkISM3JCIvRWk1KXBzcyQhIzY3JCQiMFg0N04pZShcJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL21KYEU3KVwkISM2JCIvRWk1KXBzcyQhIzY3JCQiMFg0N04pZShcJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL21KYEU3KVwkISM2JCIvRWk1KXBzcyQhIzY3JCQiMHNANT9vOV0kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKClHSl0tP10kISM3JCIvRWk1KXBzcyQhIzY3JCQiMHNANT9vOV0kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKClHSl0tP10kISM3JCIvRWk1KXBzcyQhIzY3JCQiMClSJDMwW2BdJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDhUSE4jKWVdJCEjNyQiL0VpNSlwc3MkISM2NyQkIjApUiQzMFtgXSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA4VEhOIyllXSQhIzckIi9FaTUpcHNzJCEjNjckJCIwRFkxIXpBNE4hIzckIi9FaTUpcHNzJCEjNjckNyQkIi9Ndi1BdzROISM2JCIvRWk1KXBzcyQhIzY3JCQiMERZMSF6QTROISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvTXYtQXc0TiEjNiQiL0VpNSlwc3MkISM2NyQkIjBeZS92MkpeJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG1sRDBVT14kISM3JCIvRWk1KXBzcyQhIzY3JCQiMF5lL3YySl4kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbWxEMFVPXiQhIzckIi9FaTUpcHNzJCEjNjckJCIweXEtZygpcF4kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJHpQLT5fPE4hIzckIi9FaTUpcHNzJCEjNjckJCIweXEtZygpcF4kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJHpQLT5fPE4hIzckIi9FaTUpcHNzJCEjNjckJCIwLyQzXXUnM18kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPiE+XzxTQE4hIzckIi9FaTUpcHNzJCEjNjckJCIwLyQzXXUnM18kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPiE+XzxTQE4hIzckIi9FaTUpcHNzJCEjNjckJCIwSiYqKSpIWlpfJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFktP2ciR0ROISM3JCIvRWk1KXBzcyQhIzY3JCQiMEomKikqSFpaXyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZLT9nIkdETiEjNyQiL0VpNSlwc3MkISM2NyQkIjBkMihccmlHTiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHM5PVhoIkhOISM3JCIvRWk1KXBzcyQhIzY3JCQiMGQyKFxyaUdOISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwczk9WGgiSE4hIzckIi9FaTUpcHNzJCEjNjckJCIwJSk+JioqcF1LTiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpwaSw4L0xOISM3JCIvRWk1KXBzcyQhIzY3JCQiMCUpPiYqKnBdS04hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqcGksOC9MTiEjNyQiL0VpNSlwc3MkISM2NyQkIi9ATFxvUU9OISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwRFI5OkBwYCQhIzckIi9FaTUpcHNzJCEjNjckJCIvQExcb1FPTiEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMERSOTpAcGAkISM3JCIvRWk1KXBzcyQhIzY3JCQiMFBXIipwbS1hJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF9eNyssM2EkISM3JCIvRWk1KXBzcyQhIzY3JCQiMFBXIipwbS1hJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF9eNyssM2EkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGpjKltsOVdOISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweWo1JjNvV04hIzckIi9FaTUpcHNzJCEjNjckJCIwamMqW2w5V04hIzckIi9FaTUpcHNzJCEjNjckNyQkIjB5ajUmM29XTiEjNyQiL0VpNSlwc3MkISM2NyQkIi8qbygpUkUhW04hIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwdzNxZyZbTiEjNyQiL0VpNSlwc3MkISM2NyQkIi8qbygpUkUhW04hIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwdzNxZyZbTiEjNyQiL0VpNSlwc3MkISM2NyQkIjA7ImVbaSE+YiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBKKW9dMFdfTiEjNyQiL0VpNSlwc3MkISM2NyQkIjA7ImVbaSE+YiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBKKW9dMFdfTiEjNyQiL0VpNSlwc3MkISM2NyQkIjBWJFIpNCd5Yk4hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBlKzBTP2piJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBWJFIpNCd5Yk4hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBlKzBTP2piJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBwMCNbZm1mTiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCVHSl0tP2dOISM3JCIvRWk1KXBzcyQhIzY3JCQiMHAwI1tmbWZOISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJUdKXS0/Z04hIzckIi9FaTUpcHNzJCEjNjckJCIwJ3osKXpYTmMkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNkQsNSEza04hIzckIi9FaTUpcHNzJCEjNjckJCIwJ3osKXpYTmMkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNkQsNSEza04hIzckIi9FaTUpcHNzJCEjNjckJCIwQUl5a0R1YyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBQUCpcKmZ6YyQhIzckIi9FaTUpcHNzJCEjNjckJCIwQUl5a0R1YyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBQUCpcKmZ6YyQhIzckIi9FaTUpcHNzJCEjNjckJCIwXFV3XDA4ZCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBrXCgqelI9ZCQhIzckIi9FaTUpcHNzJCEjNjckJCIwXFV3XDA4ZCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBrXCgqelI9ZCQhIzckIi9FaTUpcHNzJCEjNjckJCIwdmF1TSY9dk4hIzckIi9FaTUpcHNzJCEjNjckNyQkIi8+Y1wnPmRkJCEjNiQiL0VpNSlwc3MkISM2NyQkIjB2YXVNJj12TiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLz5jXCc+ZGQkISM2JCIvRWk1KXBzcyQhIzY3JCQiMC1ucz5sIXpOISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPHUkKlwqZnpOISM3JCIvRWk1KXBzcyQhIzY3JCQiMC1ucz5sIXpOISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPHUkKlwqZnpOISM3JCIvRWk1KXBzcyQhIzY3JCQiMEd6cS9YSGUkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVic9XCR6TWUkISM3JCIvRWk1KXBzcyQhIzY3JCQiMEd6cS9YSGUkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVic9XCR6TWUkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGIiKm8qWyNvZSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIi8oKSoqKT5mdGUkISM2JCIvRWk1KXBzcyQhIzY3JCQiMGIiKm8qWyNvZSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIi8oKSoqKT5mdGUkISM2JCIvRWk1KXBzcyQhIzY3JCQiMCJRcVlacSFmJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCc0IilbIVI3ZiQhIzckIi9FaTUpcHNzJCEjNjckJCIwIlFxWVpxIWYkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJzQiKVshUjdmJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAzO2xmJWUlZiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBCQicpKik9XmYkISM3JCIvRWk1KXBzcyQhIzY3JCQiMDM7bGYlZSVmJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEJCJykqKT1eZiQhIzckIi9FaTUpcHNzJCEjNjckJCIwTUdqV2slKWYkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXE4lWygpKiopZiQhIzckIi9FaTUpcHNzJCEjNjckJCIwTUdqV2slKWYkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwXE4lWygpKiopZiQhIzckIi9FaTUpcHNzJCEjNjckJCIwaFNoSFdCZyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB3WiMpZnlHZyQhIzckIi9FaTUpcHNzJCEjNjckJCIwaFNoSFdCZyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB3WiMpZnlHZyQhIzckIi9FaTUpcHNzJCEjNjckJCIwKEcmZjlDaWckISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwLWchWyVlbmckISM3JCIvRWk1KXBzcyQhIzY3JCQiMChHJmY5Q2lnJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMC1nIVslZW5nJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA5bGQqUjU1TyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEhzeUhRMWgkISM3JCIvRWk1KXBzcyQhIzY3JCQiMDlsZCpSNTVPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwSHN5SFExaCQhIzckIi9FaTUpcHNzJCEjNjckJCIvdWRYUSlSaCQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBiJW9aIj1YaCQhIzckIi9FaTUpcHNzJCEjNjckJCIvdWRYUSlSaCQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBiJW9aIj1YaCQhIzckIi9FaTUpcHNzJCEjNjckJCIwbipRJnBqeWgkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwI29cKCp6Uj1PISM3JCIvRWk1KXBzcyQhIzY3JCQiMG4qUSZwanloJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCNvXCgqelI9TyEjNyQiL0VpNSlwc3MkISM2NyQkIjAkPj9YTnVATyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDM0dCV5RkFPISM3JCIvRWk1KXBzcyQhIzY3JCQiMCQ+P1hOdUBPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMzR0JXlGQU8hIzckIi9FaTUpcHNzJCEjNjckJCIvVSwmUkJjaSQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBOQHJwZGhpJCEjNyQiL0VpNSlwc3MkISM2NyQkIi9VLCZSQmNpJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiME5AcnBkaGkkISM3JCIvRWk1KXBzcyQhIzY3JCQiMFlFW0MuJkhPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwaExwYVAraiQhIzckIi9FaTUpcHNzJCEjNjckJCIwWUVbQy4mSE8hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBoTHBhUCtqJCEjNyQiL0VpNSlwc3MkISM2NyQkIjB0UVk0JFFMTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMClldSdSPFJqJCEjNyQiL0VpNSlwc3MkISM2NyQkIjB0UVk0JFFMTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMClldSdSPFJqJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAqNFhXSEVQTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDllbEMoelBPISM3JCIvRWk1KXBzcyQhIzY3JCQiMCo0WFdIRVBPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOWVsQyh6UE8hIzckIi9FaTUpcHNzJCEjNjckJCIwRWpVelU2ayQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUcWo0eDtrJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBFalV6VTZrJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFRxajR4O2skISM3JCIvRWk1KXBzcyQhIzY3JCQiMF92U2tBXWskISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbiM9WXBiWE8hIzckIi9FaTUpcHNzJCEjNjckJCIwX3ZTa0FdayQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBuIz1ZcGJYTyEjNyQiL0VpNSlwc3MkISM2NyQkIjB6KClRXC0qW08hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAlXCpmek8lXE8hIzckIi9FaTUpcHNzJCEjNjckJCIweigpUVwtKltPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJVwqZnpPJVxPISM3JCIvRWk1KXBzcyQhIzY3JCQiMDArUE0jeV9PISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvcyFlaztMbCQhIzYkIi9FaTUpcHNzJCEjNjckJCIwMCtQTSN5X08hIzckIi9FaTUpcHNzJCEjNjckNyQkIi9zIWVrO0xsJCEjNiQiL0VpNSlwc3MkISM2NyQkIjBLN04+aW1sJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFo+Y1wnPmRPISM3JCIvRWk1KXBzcyQhIzY3JCQiMEs3Tj5pbWwkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwWj5jXCc+ZE8hIzckIi9FaTUpcHNzJCEjNjckJCIwZUNML1UwbSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB1SmFNdzVtJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBlQ0wvVTBtJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHVKYU13NW0kISM3JCIvRWk1KXBzcyQhIzY3JCQiMCZvOCQqPVVrTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLldfPmNcbSQhIzUkIi9FaTUpcHNzJCEjNjckJCIwJm84JCo9VWtPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIuV18+Y1xtJCEjNSQiL0VpNSlwc3MkISM2NyQkIjA2XEh1LCRvTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEVjXS9PKW9PISM3JCIvRWk1KXBzcyQhIzY3JCQiMDZcSHUsJG9PISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRWNdL08pb08hIzckIi9FaTUpcHNzJCEjNjckJCIwUWhGZiI9c08hIzckIi9FaTUpcHNzJCEjNjckNyQkIjBgb1sqZXJzTyEjNyQiL0VpNSlwc3MkISM2NyQkIjBRaEZmIj1zTyEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGBvWyplcnNPISM3JCIvRWk1KXBzcyQhIzY3JCQiMGt0RFdoZ24kISM3JCIvRWk1KXBzcyQhIzY3JDckJCIweiFvV2Rmd08hIzckIi9FaTUpcHNzJCEjNjckJCIwa3REV2hnbiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB6IW9XZGZ3TyEjNyQiL0VpNSlwc3MkISM2NyQkIjAiZlEjSFQqek8hIzckIi9FaTUpcHNzJCEjNjckNyQkIjAxJFwlZnYvbyQhIzckIi9FaTUpcHNzJCEjNjckJCIwImZRI0hUKnpPISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMSRcJWZ2L28kISM3JCIvRWk1KXBzcyQhIzY3JCQiMDwpPlU2I1FvJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEwwVldiVm8kISM3JCIvRWk1KXBzcyQhIzY3JCQiMDwpPlU2I1FvJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEwwVldiVm8kISM3JCIvRWk1KXBzcyQhIzY3JCQiMFc1Pyo0cShvJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGY8VEhOIylvJCEjNyQiL0VpNSlwc3MkISM2NyQkIjBXNT8qNHEobyQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBmPFRITiMpbyQhIzckIi9FaTUpcHNzJCEjNjckJCIwckE9JTNlInAkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJylIUjk6QHAkISM3JCIvRWk1KXBzcyQhIzY3JCQiMHJBPSUzZSJwJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCcpSFI5OkBwJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAoXGoicGdhcCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA3VVAqXCpmcCQhIzckIi9FaTUpcHNzJCEjNjckJCIwKFxqInBnYXAkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwN1VQKlwqZnAkISM3JCIvRWk1KXBzcyQhIzY3JCQiMENaOWFTJCpwJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFJhTiVbKCkqcCQhIzckIi9FaTUpcHNzJCEjNjckJCIwQ1o5YVMkKnAkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUmFOJVsoKSpwJCEjNyQiL0VpNSlwc3MkISM2NyQkIi8mZjdSP0txJCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMGxtTHBhUHEkISM3JCIvRWk1KXBzcyQhIzY3JCQiLyZmN1I/S3EkISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwbG1McGFQcSQhIzckIi9FaTUpcHNzJCEjNjckJCIweHI1QytycSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAjKnlKYU13cSQhIzckIi9FaTUpcHNzJCEjNjckJCIweHI1QytycSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAjKnlKYU13cSQhIzckIi9FaTUpcHNzJCEjNjckJCIwLiUpMzQhKTRyJCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMD0iKkhSOTpyJCEjNyQiL0VpNSlwc3MkISM2NyQkIjAuJSkzNCEpNHIkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPSIqSFI5OnIkISM3JCIvRWk1KXBzcyQhIzY3JCQiL2pwUypmW3IkISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwWC5HQyVSOlAhIzckIi9FaTUpcHNzJCEjNjckJCIvanBTKmZbciQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBYLkdDJVI6UCEjNyQiL0VpNSlwc3MkISM2NyQkIjBjMzB6Uig9UCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHI6RTR1Iz5QISM3JCIvRWk1KXBzcyQhIzY3JCQiMGMzMHpSKD1QISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwcjpFNHUjPlAhIzckIi9FaTUpcHNzJCEjNjckJCIwJDNLUyc+RXMkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKXpVVVI6QlAhIzckIi9FaTUpcHNzJCEjNjckJCIwJDNLUyc+RXMkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKXpVVVI6QlAhIzckIi9FaTUpcHNzJCEjNjckJCIwNEwsXCpcRVAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBDU0F6THFzJCEjNyQiL0VpNSlwc3MkISM2NyQkIjA0TCxcKlxFUCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMENTQXpMcXMkISM3JCIvRWk1KXBzcyQhIzY3JCQiME9YKlIkei50JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF5fP2s4NHQkISM3JCIvRWk1KXBzcyQhIzY3JCQiME9YKlIkei50JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMF5fP2s4NHQkISM3JCIvRWk1KXBzcyQhIzY3JCQiMGlkKCo9ZlV0JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHhrPVwkek1QISM3JCIvRWk1KXBzcyQhIzY3JCQiMGlkKCo9ZlV0JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHhrPVwkek1QISM3JCIvRWk1KXBzcyQhIzY3JCQiMCopcCZSIVIiUVAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAveDtNdCdRUCEjNyQiL0VpNSlwc3MkISM2NyQkIjAqKXAmUiFSIlFQISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwL3g7TXQnUVAhIzckIi9FaTUpcHNzJCEjNjckJCIwOiNRKikpPT91JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLyQqWyI+YER1JCEjNiQiL0VpNSlwc3MkISM2NyQkIjA6I1EqKSk9P3UkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvJCpbIj5gRHUkISM2JCIvRWk1KXBzcyQhIzY3JCQiMFUlPlIoKSpldSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBkLDgvTGt1JCEjNyQiL0VpNSlwc3MkISM2NyQkIjBVJT5SKCkqZXUkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZCw4L0xrdSQhIzckIi9FaTUpcHNzJCEjNjckJCIwbzEhKmV5KFxQISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJFE2IipHSl1QISM3JCIvRWk1KXBzcyQhIzY3JCQiMG8xISpleShcUCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCRRNiIqR0pdUCEjNyQiL0VpNSlwc3MkISM2NyQkIjAmKj0pUSVlT3YkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvaCM0dSM+YVAhIzYkIi9FaTUpcHNzJCEjNjckJCIwJio9KVElZU92JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL2gjNHUjPmFQISM2JCIvRWk1KXBzcyQhIzY3JCQiMEBKJylHUXZ2JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME9RMmZzIWVQISM3JCIvRWk1KXBzcyQhIzY3JCQiMEBKJylHUXZ2JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME9RMmZzIWVQISM3JCIvRWk1KXBzcyQhIzY3JCQiMFtWJVEiPTl3JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGpdMFdfPnckISM3JCIvRWk1KXBzcyQhIzY3JCQiMFtWJVEiPTl3JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGpdMFdfPnckISM3JCIvRWk1KXBzcyQhIzY3JCQiMHViIykpekhsUCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpHTyFIS2V3JCEjNyQiL0VpNSlwc3MkISM2NyQkIjB1YiMpKXpIbFAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqR08hSEtldyQhIzckIi9FaTUpcHNzJCEjNjckJCIwLG8hUXk8cFAhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA7diw5NyhwUCEjNyQiL0VpNSlwc3MkISM2NyQkIjAsbyFReTxwUCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDt2LDk3KHBQISM3JCIvRWk1KXBzcyQhIzY3JCQiMEYhKXlvZEl4JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFUoKSoqKT5mdFAhIzckIi9FaTUpcHNzJCEjNjckJCIwRiEpeW9kSXgkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVSgpKiopPmZ0UCEjNyQiL0VpNSlwc3MkISM2NyQkIjBhI3BQdiRweCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBwKnpSPVp4UCEjNyQiL0VpNSlwc3MkISM2NyQkIjBhI3BQdiRweCQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBwKnpSPVp4UCEjNyQiL0VpNSlwc3MkISM2NyQkIi9bXShRPDN5JCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCY+aCpvXjh5JCEjNyQiL0VpNSlwc3MkISM2NyQkIi9bXShRPDN5JCEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCY+aCpvXjh5JCEjNyQiL0VpNSlwc3MkISM2NyQkIjAyPHRCKHAleSQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBBQyVSOkImeSQhIzckIi9FaTUpcHNzJCEjNjckJCIwMjx0QihwJXkkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQUMlUjpCJnkkISM3JCIvRWk1KXBzcyQhIzY3JCQiMExIcjN4Jil5JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFtPIypRNiIqeSQhIzckIi9FaTUpcHNzJCEjNjckJCIwTEhyM3gmKXkkISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwW08jKlE2Iip5JCEjNyQiL0VpNSlwc3MkISM2NyQkIi87JXAkcFgjeiQhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjB2WyFSNypIeiQhIzckIi9FaTUpcHNzJCEjNjckJCIvOyVwJHBYI3okISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwdlshUjcqSHokISM3JCIvRWk1KXBzcyQhIzY3JCQiMCdRdid5T2p6JCEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCxoKSkzcm96JCEjNyQiL0VpNSlwc3MkISM2NyQkIjAnUXYneU9qeiQhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAsaCkpM3JveiQhIzckIi9FaTUpcHNzJCEjNjckJCIwOG1sajstIVEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBHdCdRNHYrUSEjNyQiL0VpNSlwc3MkISM2NyQkIjA4bWxqOy0hUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEd0J1E0ditRISM3JCIvRWk1KXBzcyQhIzY3JCQiMFJ5alsnNC9RISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYSZbKXlJWSFRISM3JCIvRWk1KXBzcyQhIzY3JCQiMFJ5alsnNC9RISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYSZbKXlJWSFRISM3JCIvRWk1KXBzcyQhIzY3JCQiMG0hPk9qKHohUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIvRWk1KXBzcyQhIzY3JCQiMG0hPk9qKHohUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCJ5SFExXjNRISM3JCIvRWk1KXBzcyQhIzY3JCQiMCNIKyc9Yz0iUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDI1IilbIVI3USEjNyQiL0VpNSlwc3MkISM2NyQkIjAjSCsnPWM9IlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAyNSIpWyFSN1EhIzckIi9FaTUpcHNzJCEjNjckJCIwPjplLk9kIlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBNQXpMcWkiUSEjNyQiL0VpNSlwc3MkISM2NyQkIjA+OmUuT2QiUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiME1BekxxaSJRISM3JCIvRWk1KXBzcyQhIzY3JCQiMFhGYyllaD5RISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvWXQoPV0sI1EhIzYkIi9FaTUpcHNzJCEjNjckJCIwWEZjKWVoPlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9ZdCg9XSwjUSEjNiQiL0VpNSlwc3MkISM2NyQkIjBzUmF0JlxCUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMChvYVArLkNRISM3JCIvRWk1KXBzcyQhIzY3JCQiMHNSYXQmXEJRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKG9hUCsuQ1EhIzckIi9FaTUpcHNzJCEjNjckJCIwKT5EJmV2dCNRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwOGZ0KSk0eiNRISM3JCIvRWk1KXBzcyQhIzY3JCQiMCk+RCZldnQjUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDhmdCkpNHojUSEjNyQiL0VpNSlwc3MkISM2NyQkIjBEa11WYjckUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLzk8UCgqeUpRISM2JCIvRWk1KXBzcyQhIzY3JCQiMERrXVZiNyRRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvOTxQKCp5SlEhIzYkIi9FaTUpcHNzJCEjNjckJCIwXndbR05eJFEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBtJClwZXBjJFEhIzckIi9FaTUpcHNzJCEjNjckJCIwXndbR05eJFEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBtJClwZXBjJFEhIzckIi9FaTUpcHNzJCEjNjckJCIweSlvTV4sUlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkZnpPJVwmUlEhIzckIi9FaTUpcHNzJCEjNjckJCIweSlvTV4sUlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAkZnpPJVwmUlEhIzckIi9FaTUpcHNzJCEjNjckJCIwLyxYKVwqRyVRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPjNtR0hNJVEhIzckIi9FaTUpcHNzJCEjNjckJCIwLyxYKVwqRyVRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwPjNtR0hNJVEhIzckIi9FaTUpcHNzJCEjNjckJCIwSjhWJFt4WVEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBZP2s4NHQlUSEjNyQiL0VpNSlwc3MkISM2NyQkIjBKOFYkW3hZUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFk/azg0dCVRISM3JCIvRWk1KXBzcyQhIzY3JCQiMGREVG9hMSZRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwc0tpKSopPV5RISM3JCIvRWk1KXBzcyQhIzY3JCQiMGREVG9hMSZRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwc0tpKSopPV5RISM3JCIvRWk1KXBzcyQhIzY3JCQiMCV5JFJgTVgmUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCpcL08pb10mUSEjNyQiL0VpNSlwc3MkISM2NyQkIjAleSRSYE1YJlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAqXC9PKW9dJlEhIzckIi9FaTUpcHNzJCEjNjckJCIvLHYkUTklZVEhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjBEZGVvWyplUSEjNyQiL0VpNSlwc3MkISM2NyQkIi8sdiRROSVlUSEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMERkZW9bKmVRISM3JCIvRWk1KXBzcyQhIzY3JCQiMFBpTkIlSGlRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwX3BjYEdHJ1EhIzckIi9FaTUpcHNzJCEjNjckJCIwUGlOQiVIaVEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBfcGNgR0cnUSEjNyQiL0VpNSlwc3MkISM2NyQkIjBqdUwzdWgnUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHkiWyZRM24nUSEjNyQiL0VpNSlwc3MkISM2NyQkIjBqdUwzdWgnUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMHkiWyZRM24nUSEjNyQiL0VpNSlwc3MkISM2NyQkIi9wPUxSMHFRISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwMCVITiMpZXFRISM3JCIvRWk1KXBzcyQhIzY3JCQiL3A9TFIwcVEhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAwJUhOIyllcVEhIzckIi9FaTUpcHNzJCEjNjckJCIwOyoqSHlMUihRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwSjFeM29XKFEhIzckIi9FaTUpcHNzJCEjNjckJCIwOyoqSHlMUihRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwSzFeM29XKFEhIzckIi9FaTUpcHNzJCEjNjckJCIwVjZHajh5KFEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBlPVwkek15USEjNyQiL0VpNSlwc3MkISM2NyQkIjBWNkdqOHkoUSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMGU9XCR6TXlRISM3JCIvRWk1KXBzcyQhIzY3JCQiL1BpI1skcCIpUSEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiMCUzdCV5RkEpUSEjNyQiL0VpNSlwc3MkISM2NyQkIi9QaSNbJHAiKVEhIzYkIi9FaTUpcHNzJCEjNjckNyQkIjAmM3QleUZBKVEhIzckIi9FaTUpcHNzJCEjNjckJCIwJ2ZWS0xkJilRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNlZYajJoKVEhIzckIi9FaTUpcHNzJCEjNjckJCIwJ2ZWS0xkJilRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwNlZYajJoKVEhIzckIi9FaTUpcHNzJCEjNjckJCIwQltBPWAlKilRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwUGJWWygpKiopUSEjNyQiL0VpNSlwc3MkISM2NyQkIjBCW0E9YCUqKVEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBRYlZbKCkqKilRISM3JCIvRWk1KXBzcyQhIzY3JCQiMFxnPy5MTCpRISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwa25UTG5RKlEhIzckIi9FaTUpcHNzJCEjNjckJCIwXGc/LkxMKlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBrblRMblEqUSEjNyQiL0VpNSlwc3MkISM2NyQkIjB2cz0pR0AoKlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIi8qelI9WngqUSEjNiQiL0VpNSlwc3MkISM2NyQkIjB2cz0pR0AoKlEhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAiKnpSPVp4KlEhIzckIi9FaTUpcHNzJCEjNjckJCIwLSZvSkY0LFIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA8I3pMcWksUiEjNyQiL0VpNSlwc3MkISM2NyQkIjAtJm9KRjQsUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMDwjekxxaSxSISM3JCIvRWk1KXBzcyQhIzY3JCQiMEgoXCJlc1whUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFcvTylvXTBSISM3JCIvRWk1KXBzcyQhIzY3JCQiMEgoXCJlc1whUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFcvTylvXTBSISM3JCIvRWk1KXBzcyQhIzY3JCQiMGI0OFZfKTNSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvblRMblE0UiEjNiQiL0VpNSlwc3MkISM2NyQkIjBiNDhWXykzUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL25UTG5RNFIhIzYkIi9FaTUpcHNzJCEjNjckJCIwIz03IkdLRiJSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwKCpHS2VtSyJSISM3JCIvRWk1KXBzcyQhIzY3JCQiMCM9NyJHS0YiUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCgqR0tlbUsiUiEjNyQiL0VpNSlwc3MkISM2NyQkIjAzTTQ4N20iUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEJUSVZZciJSISM3JCIvRWk1KXBzcyQhIzY3JCQiMDNNNDg3bSJSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQlRJVllyIlIhIzckIi9FaTUpcHNzJCEjNjckJCIwTlkyKT5cP1IhIzckIi9FaTUpcHNzJCEjNjckNyQkIi9OJkdHRTUjUiEjNiQiL0VpNSlwc3MkISM2NyQkIjBOWTIpPlw/UiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiL04mR0dFNSNSISM2JCIvRWk1KXBzcyQhIzY3JCQiMGhlMCQ9UENSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwd2xFODFcI1IhIzckIi9FaTUpcHNzJCEjNjckJCIwaGUwJD1QQ1IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjB3bEU4MVwjUiEjNyQiL0VpNSlwc3MkISM2NyQkIjApM1Ahb14jR1IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAueUMpZnlHUiEjNyQiL0VpNSlwc3MkISM2NyQkIjApM1Ahb14jR1IhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAueUMpZnlHUiEjNyQiL0VpNSlwc3MkISM2NyQkIjA5JD1JOjhLUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMEghSEtlbUtSISM3JCIvRWk1KXBzcyQhIzY3JCQiMDkkPUk6OEtSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwSCFIS2VtS1IhIzckIi9FaTUpcHNzJCEjNjckJCIwVCYqKno4LE9SISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYy1Ab1hsJFIhIzckIi9FaTUpcHNzJCEjNjckJCIwVCYqKno4LE9SISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYy1Ab1hsJFIhIzckIi9FaTUpcHNzJCEjNjckJCIwbjIpSDcqKVJSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwI1siPmBELyVSISM3JCIvRWk1KXBzcyQhIzY3JCQiMG4yKUg3KilSUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCNbIj5gRC8lUiEjNyQiL0VpNSlwc3MkISM2NyQkIjAlKj4nejV4VlIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0RjxRMFYlUiEjNyQiL0VpNSlwc3MkISM2NyQkIjAlKj4nejV4VlIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjA0RjxRMFYlUiEjNyQiL0VpNSlwc3MkISM2NyQkIi9BVkg0bFpSISM2JCIvRWk1KXBzcyQhIzY3JDckJCIwTlI6QiY9W1IhIzckIi9FaTUpcHNzJCEjNjckJCIvQVZINGxaUiEjNiQiL0VpNSlwc3MkISM2NyQ3JCQiME5SOkImPVtSISM3JCIvRWk1KXBzcyQhIzY3JCQiMFpXI3oyYF5SISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwaV44M2w/JlIhIzckIi9FaTUpcHNzJCEjNjckJCIwWlcjejJgXlIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBpXjgzbD8mUiEjNyQiL0VpNSlwc3MkISM2NyQkIjB0YyFIMVRiUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiL0VpNSlwc3MkISM2NyQkIjB0YyFIMVRiUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMClRO0pcJWYmUiEjNyQiL0VpNSlwc3MkISM2NyQkIi5wKXkvSGZSISM1JCIvRWk1KXBzcyQhIzY3JDckJCIwOnc0eUMpZlIhIzckIi9FaTUpcHNzJCEjNjckJCIucCl5L0hmUiEjNSQiL0VpNSlwc3MkISM2NyQ3JCQiMDp3NHlDKWZSISM3JCIvRWk1KXBzcyQhIzY3JCQiMEUib0cuPGpSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwVCl5SVlxalIhIzckIi9FaTUpcHNzJCEjNjckJCIwRSJvRy48alIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBUKXlJWXFqUiEjNyQiL0VpNSlwc3MkISM2NyQkIjBgJFx5LDBuUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMG8rMVslZW5SISM3JCIvRWk1KXBzcyQhIzY3JCQiMGAkXHksMG5SISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwbysxWyVlblIhIzckIi9FaTUpcHNzJCEjNjckJCIwejAkRyskNChSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJUhUSVZZclIhIzckIi9FaTUpcHNzJCEjNjckJCIwejAkRyskNChSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJUhUSVZZclIhIzckIi9FaTUpcHNzJCEjNjckJCIwMT0ieSk0WyhSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQEQtPVdgKFIhIzckIi9FaTUpcHNzJCEjNjckJCIwMT0ieSk0WyhSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwQEQtPVdgKFIhIzckIi9FaTUpcHNzJCEjNjckJCIwS0l6cypveVIhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBaUCsuQyN6UiEjNyQiL0VpNSlwc3MkISM2NyQkIjBLSXpzKm95UiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFpQKy5DI3pSISM3JCIvRWk1KXBzcyQhIzY3JCQiMGZVeGRwRClSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdVwpelE1JClSISM3JCIvRWk1KXBzcyQhIzY3JCQiMGZVeGRwRClSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwdVwpelE1JClSISM3JCIvRWk1KXBzcyQhIzY3JCQiMCZbYkYlXGspUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLmknSFApcClSISM1JCIvRWk1KXBzcyQhIzY3JCQiMCZbYkYlXGspUiEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiLmknSFApcClSISM1JCIvRWk1KXBzcyQhIzY3JCQiMDdudEZILipSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRnUlek4nMypSISM3JCIvRWk1KXBzcyQhIzY3JCQiMDdudEZILipSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwRnUlek4nMypSISM3JCIvRWk1KXBzcyQhIzY3JCQiMFF6cjc0VSpSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYCdHSE11JSpSISM3JCIvRWk1KXBzcyQhIzY3JCQiMFF6cjc0VSpSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwYCdHSE11JSpSISM3JCIvRWk1KXBzcyQhIzY3JCQiMGwiKnAoKikzKSpSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvKSk0ektpKSpSISM2JCIvRWk1KXBzcyQhIzY3JCQiMGwiKnAoKikzKSpSISM3JCIvRWk1KXBzcyQhIzY3JDckJCIvKSk0ektpKSpSISM2JCIvRWk1KXBzcyQhIzY3JCQiMCJSIW8jKW8+KyUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjAxNipHSl0tUyEjNyQiL0VpNSlwc3MkISM2NyQkIjAiUiFvIylvPislISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwMTYqR0pdLVMhIzckIi9FaTUpcHNzJCEjNjckJCIwPTttbltlKyUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBMQih5SFExUyEjNyQiL0VpNSlwc3MkISM2NyQkIjA9O21uW2UrJSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMExCKHlIUTFTISM3JCIvRWk1KXBzcyQhIzY3JCQiMFdHa19HKDRTISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwZk4mR0dFNVMhIzckIi9FaTUpcHNzJCEjNjckJCIwV0drX0coNFMhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBmTiZHR0U1UyEjNyQiL0VpNSlwc3MkISM2NyQkIjByU2lQM08sJSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMCd5TXlFOTlTISM3JCIvRWk1KXBzcyQhIzY3JCQiMHJTaVAzTywlISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwJ3lNeUU5OVMhIzckIi9FaTUpcHNzJCEjNjckJCIwKEgwRSMpWzxTISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwN2ciR0QtPVMhIzckIi9FaTUpcHNzJCEjNjckJCIwKEgwRSMpWzxTISM3JCIvRWk1KXBzcyQhIzY3JDckJCIwN2ciR0QtPVMhIzckIi9FaTUpcHNzJCEjNjckJCIwQ2xlMm84LSUhIzckIi9FaTUpcHNzJCEjNjckNyQkIjBSc3pQLT4tJSEjNyQiL0VpNSlwc3MkISM2NyQkIjBDbGUybzgtJSEjNyQiL0VpNSlwc3MkISM2NyQ3JCQiMFJzelAtPi0lISM3JCIvRWk1KXBzcyQhIzY3JCQiMHdMV0AxZC0lISM3JCIwbzBNK3ZEciQhIzc3JDckJCIwbCV5RkF5RFMhIzckIjBvME0rdkRyJCEjNzckJCIwd0xXQDFkLSUhIzckIjBvME0rdkRyJCEjNzckNyQkIjAjcGZ4P21IUyEjNyQiMCpHT0tpcXhOISM3NyQkIjBYNlsoeVZIUyEjNyQiMF4xXztLZGUkISM3NyQ3JCQiMFg2Wyh5VkhTISM3JCIwXjFfO0tkZSQhIzc3JCQiMDN4TVhldC0lISM3JCIwRl96didmZk8hIzc3JDckJCIwL2QhcG0kZi0lISM3JCIwNiE0c3c4NVAhIzc3JCQiMDN4TVhldC0lISM3JCIwRl96didmZk8hIzc3JDckJCIwL2QhcG0kZi0lISM3JCIwNiE0c3c4NVAhIzc3JCQiMGwleUZBeURTISM3JCIwbzBNK3ZEciQhIzc3JDckJCIwPTR1Iz5hTFMhIzckIjB1V2wiZWVQTSEjNzckJCIwVnJSdCkpRy4lISM3JCIvSEtlbUtoTSEjNjckNyQkIjBWclJ0KSlHLiUhIzckIi9IS2VtS2hNISM2NyQkIjAjcGZ4P21IUyEjNyQiMCpHT0tpcXhOISM3NyQ3JCQiMFhAc3hAdS4lISM3JCIwaFkxaUtfSCQhIzc3JCQiMCV6K1Q7SE9TISM3JCIvJFI5OkBwTCQhIzY3JDckJCIwJXorVDtIT1MhIzckIi8kUjk6QHBMJCEjNjckJCIwPTR1Iz5hTFMhIzckIjB1V2wiZWVQTSEjNzckNyQkIjByTHFpLDgvJSEjNyQiMEt1WnliMTokISM3NyQkIjBsK1lvWydSUyEjNyQiL2RiV2NeN0shIzY3JDckJCIwbCtZb1snUlMhIzckIi9kYldjXjdLISM2NyQkIjBYQHN4QHUuJSEjNyQiMGhZMWlLX0gkISM3NyQ3JCQiMClmJW9aIj1YUyEjNyQiMEtwLHJtUSskISM3NyQkIjBAJ1JMPSdILyUhIzckIjA0c3c4NSIpMyQhIzc3JDckJCIwQCdSTD0nSC8lISM3JCIwNHN3ODUiKTMkISM3NyQkIjByTHFpLDgvJSEjNyQiMEt1WnliMTokISM3NyQ3JCQiMENlbUtoIVxTISM3JCIvPWMvIXpbJkchIzY3JCQiMFQneVlIQllTISM3JCIwXCl5SVlxakghIzc3JDckJCIwVCd5WUhCWVMhIzckIjBcKXlJWXFqSCEjNzckJCIwKWYlb1oiPVhTISM3JCIwS3Ascm1RKyQhIzc3JDckJCIwXnFrPFRIMCUhIzckIjBGJWVVaHEuRiEjNzckJCIwc1pkJmZsX1MhIzckIjBHQHFoJCpbciMhIzc3JDckJCIwc1pkJmZsX1MhIzckIjBHQHFoJCpbciMhIzc3JCQiMDJVPGNFODAlISM3JCIwX0JxWGxtdyMhIzc3JDckJCIwUUUueWolXFMhIzckIjApWyFSNypIUkchIzc3JCQiMDJVPGNFODAlISM3JCIwX0JxWGxtdyMhIzc3JDckJCIwUUUueWolXFMhIzckIjApWyFSNypIUkchIzc3JCQiMENlbUtoIVxTISM3JCIvPWMvIXpbJkchIzY3JDckJCIweCNHRTUjbzAlISM3JCIwX0dJW20uYiMhIzc3JCQiMDcpUkY2ImUwJSEjNyQiMG5QLDYpWyFmIyEjNzckNyQkIjA3KVJGNiJlMCUhIzckIjBuUCw2KVshZiMhIzc3JCQiMF5xazxUSDAlISM3JCIwRiVlVWhxLkYhIzc3JDckJCIwLyY0dzNxZ1MhIzckIi9yXHhUKVtSIyEjNjckJCIwYHArKTMkKmVTISM3JCIwMmFLZyMzbUMhIzc3JDckJCIwYHArKTMkKmVTISM3JCIwMmFLZyMzbUMhIzc3JCQiMHgjR0U1I28wJSEjNyQiMF9HSVttLmIjISM3NyQ3JCQiL3QhZnMhZWtTISM2JCIvUXo8PEdQQSEjNjckJCIwM1BpaTs/MSUhIzckIjBZcWo0eDtNIyEjNzckNyQkIjAzUGlpOz8xJSEjNyQiMFlxajR4O00jISM3NyQkIjAvJjR3M3FnUyEjNyQiL3JceFQpW1IjISM2NyQ3JCQiMGQ+ZGRnJW9TISM3JCIwRmtAPyVleD8hIzc3JCQiMGZSMl4iNG9TISM3JCIwRC5FM21HNCMhIzc3JDckJCIwZlIyXiI0b1MhIzckIjBELkUzbUc0IyEjNzckJCIwLypwT295bVMhIzckIi9IVTlQYFlAISM2NyQ3JCQiMFEjKiozKHBdMSUhIzckIjAnb1sqZXJzQCMhIzc3JCQiMC8qcE9veW1TISM3JCIvSFU5UGBZQCEjNjckNyQkIjBRIyoqMyhwXTElISM3JCIwJ29bKmVyc0AjISM3NyQkIi90IWZzIWVrUyEjNiQiL1F6PDxHUEEhIzY3JDckJCIwJD1gRC9Nc1MhIzckIjBcITQwPSNlIj4hIzc3JCQiMEVtPVEkM3JTISM3JCIwbD5kZGclbz4hIzc3JDckJCIwRW09USQzclMhIzckIjBsPmRkZyVvPiEjNzckJCIwZD5kZGclb1MhIzckIjBGa0A/JWV4PyEjNzckNyQkIi9UTXYtQXdTISM2JCIvJEdXJkgtXzwhIzY3JCQiMC1DRlBZUzIlISM3JCIwL08pb10wVz0hIzc3JDckJCIwLUNGUFlTMiUhIzckIjAvTylvXTBXPSEjNzckJCIwJD1gRC9Nc1MhIzckIjBcITQwPSNlIj4hIzc3JDckJCIwT2NeNyssMyUhIzckIjAmeWBJMEEnZSIhIzc3JCQiME5ZKXAsKil6UyEjNyQiMCUpb10wV19mIiEjNzckNyQkIjBOWSlwLCopelMhIzckIjAlKW9dMFdfZiIhIzc3JCQiMF5dQ0NlI3pTISM3JCIwWXBtaFFBaSIhIzc3JDckJCIuOixlIilwMiUhIzUkIjBXXz5jXCc+PCEjNzckJCIwXl1DQ2UjelMhIzckIjBZcG1oUUFpIiEjNzckNyQkIi46LGUiKXAyJSEjNSQiMFdfPmNcJz48ISM3NyQkIi9UTXYtQXdTISM2JCIvJEdXJkgtXzwhIzY3JDckJCIwam9cKCp6UjMlISM3JCIwSjl3YWYlPTkhIzc3JCQiME5TIUhOeCMzJSEjNyQiMEImPVsmUTNaIiEjNzckNyQkIjBOUyFITngjMyUhIzckIjBCJj1bJlEzWiIhIzc3JCQiME9jXjcrLDMlISM3JCIwJnlgSTBBJ2UiISM3NyQ3JCQiMCozeUMpZnkzJSEjNyQiMC0yMWtqKFs3ISM3NyQkIjBaTzBDS2MzJSEjNyQiMGosOC9Ma00iISM3NyQ3JCQiMFpPMENLYzMlISM3JCIwaiw4L0xrTSIhIzc3JCQiMGpvXCgqelIzJSEjNyQiMEo5d2FmJT05ISM3NyQ3JCQiMDskZnUnUjw0JSEjNyQiMDQ5KCp6Ij14NSEjNzckJCIwdnlTbno3NCUhIzckIjBVTXYtQXc0IiEjNzckNyQkIjB2eVNuejc0JSEjNyQiMFVNdi1BdzQiISM3NyQkIjAxNVBHais0JSEjNyQiMClSLyFwdTg6IiEjNzckNyQkIi8tKFxAbiUpMyUhIzYkIjAtPVdgRj9BIiEjNzckJCIwMTVQR2orNCUhIzckIjApUi8hcHU4OiIhIzc3JDckJCIvLShcQG4lKTMlISM2JCIwLT1XYEY/QSIhIzc3JCQiMCozeUMpZnkzJSEjNyQiMC0yMWtqKFs3ISM3NyQ3JCQiMFUwV18+YzQlISM3JCIwKHlPNCo9dy4qISM4NyQkIjBGP0VscVM0JSEjNyQiMDgzbD9sQHQqISM4NyQ3JCQiMEY/RWxxUzQlISM3JCIwODNsP2xAdCohIzg3JCQiMDskZnUnUjw0JSEjNyQiMDQ5KCp6Ij14NSEjNzckNyQkIjBwPFVQKlwqNCUhIzckIjBNIUc3Ij1fRyghIzg3JCQiMEIzJj4wJW80JSEjNyQiMDRzdzg1IilbKSEjODckNyQkIjBCMyY+MCVvNCUhIzckIjA0c3c4NSIpWykhIzg3JCQiMFUwV18+YzQlISM3JCIwKHlPNCo9dy4qISM4NyQ3JCQiMEszbCM0Sy1UISM3JCIkKychIiI3JCQiL1k0N1YhKSo0JSEjNiQiMFk2VEB5aTkoISM4NyQ3JCQiMEJcLS8hZio0JSEjNyQiMC9PKW9dMFdzISM4NyQkIi9ZNDdWISkqNCUhIzYkIjBZNlRAeWk5KCEjODckNyQkIjBCXC0vIWYqNCUhIzckIjAvTylvXTBXcyEjODckJCIwcDxVUCpcKjQlISM3JCIwTSFHNyI9X0coISM4LSUmQ09MT1JHNiYlJFJHQkckIihedWknISIoJCIoXnVpJyEiKCQiKF51aSchIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNlxjdTckNyQkIjBISVVRMmYjPSEjNyQiMEswMVYtKlI9ISM3NyQkIjBVIipbXihmRD0hIzckIjAvTylvXTBXPSEjNzckNyQkIjBVIipbXihmRD0hIzckIjAvTylvXTBXPSEjNzckJCIwbUMsUCtjIz0hIzckIjAiemRGJCoqUSY9ISM3NyQ3JCQiMEFNPldMYyM9ISM3JCIwbD5kZGclbz4hIzc3JCQiMG1DLFArYyM9ISM3JCIwInpkRiQqKlEmPSEjNzckNyQkIjBBTT5XTGMjPSEjNyQiMGw+ZGRnJW8+ISM3NyQkIjBMS28nZmpEPSEjNyQiME5hS1dqcig+ISM3NyQ3JCQiMEJ1KXkkcGMjPSEjNyQiMEQuRTNtRzQjISM3NyQkIjBMS28nZmpEPSEjNyQiME5hS1dqcig+ISM3NyQ3JCQiMEJ1KXkkcGMjPSEjNyQiMEQuRTNtRzQjISM3NyQkIi9zUnQ6bkQ9ISM2JCIwO2tHQ0YvNSMhIzc3JDckJCIwVCE+RmBxRD0hIzckIjAnb1sqZXJzQCMhIzc3JCQiL3NSdDpuRD0hIzYkIjA7a0dDRi81IyEjNzckNyQkIjBUIT5GYHFEPSEjNyQiMCdvWyplcnNAIyEjNzckJCIwbFQzPjJkIz0hIzckIjAiZmkkcCFwQkEhIzc3JDckJCIwTSJbJkdUZCM9ISM3JCIwWXFqNHg7TSMhIzc3JCQiMGxUMz4yZCM9ISM3JCIwImZpJHAhcEJBISM3NyQ3JCQiME0iWyZHVGQjPSEjNyQiMFlxajR4O00jISM3NyQkIjBBZnoiR3VEPSEjNyQiMGhCVSRRJnBNIyEjNzckNyQkIjBXNF1EeGQjPSEjNyQiMDJhS2cjM21DISM3NyQkIjBBZnoiR3VEPSEjNyQiMGhCVSRRJnBNIyEjNzckNyQkIjBXNF1EeGQjPSEjNyQiMDJhS2cjM21DISM3NyQkIjA0V2dYeWQjPSEjNyQiMDxnSmk7LVojISM3NyQ3JCQiME9UZUI4ZSM9ISM3JCIwblAsNilbIWYjISM3NyQkIjA0V2dYeWQjPSEjNyQiMDxnSmk7LVojISM3NyQ3JCQiME9UZUI4ZSM9ISM3JCIwblAsNilbIWYjISM3NyQkIjBmal01OWUjPSEjNyQiMCdHW2ghek1mIyEjNzckNyQkIjA+b21BXGUjPSEjNyQiMEdAcWgkKltyIyEjNzckJCIwZmpdNTllIz0hIzckIjAnR1toIXpNZiMhIzc3JDckJCIwPm9tQVxlIz0hIzckIjBHQHFoJCpbciMhIzc3JCQiMC0memooXGUjPSEjNyQiMEsoUik9VG5yIyEjNzckNyQkIjAwJ3pHXyllIz0hIzckIjApWyFSNypIUkchIzc3JCQiMC0memooXGUjPSEjNyQiMEsoUik9VG5yIyEjNzckNyQkIjAwJ3pHXyllIz0hIzckIjApWyFSNypIUkchIzc3JCQiLiNbTGEpZSM9ISM1JCIwX0ZTJ0grU0chIzc3JDckJCIwSElVUTJmIz0hIzckIjBfUCo9WyRlIkghIzc3JCQiLiNbTGEpZSM9ISM1JCIwX0ZTJ0grU0chIzc3JDckJCIwSElVUTJmIz0hIzckIjBLMDFWLSpSPSEjNzckJCIwWm9JKm8uRT0hIzckIjBLMDFWLSpSPSEjNzckNyQkIjBjVVNCKHlIPSEjNyQiMGUvIylccVchPSEjNzckJCIwWm9JKm8uRT0hIzckIjBLMDFWLSpSPSEjNzckNyQkIjBISVVRMmYjPSEjNyQiMF5QKj1bJGUiSCEjNzckJCIwJlFBQDYjZiM9ISM3JCIwN1AyO2tLJ0ghIzc3JDckJCIwPio+WzcjZiM9ISM3JCIwXCl5SVlxakghIzc3JCQiMCZRQUA2I2YjPSEjNyQiMDdQMjtrSydIISM3NyQ3JCQiMD4qPls3I2YjPSEjNyQiMFwpeUlZcWpIISM3NyQkIjBgJ0hMbyZmIz0hIzckIjBEIUh4WF8nMyQhIzc3JDckJCIwQ10wSGRmIz0hIzckIjA0c3c4NSIpMyQhIzc3JCQiMGAnSExvJmYjPSEjNyQiMEQhSHhYXyczJCEjNzckNyQkIjBDXTBIZGYjPSEjNyQiMDRzdzg1IikzJCEjNzckJCIwI3BMY0QqZiM9ISM3JCIwKipvQGsleTRLISM3NyQ3JCQiMFZ0VE0kKmYjPSEjNyQiL2RiV2NeN0shIzY3JCQiMCNwTGNEKmYjPSEjNyQiMCoqb0BrJXk0SyEjNzckNyQkIjBWdFRNJCpmIz0hIzckIi9kYldjXjdLISM2NyQkIjAuViEqR0dnIz0hIzckIjAwQHJSV0lMJCEjNzckNyQkIjA0a3hTSGcjPSEjNyQiLyRSOTpAcEwkISM2NyQkIjAuViEqR0dnIz0hIzckIjAwQHJSV0lMJCEjNzckNyQkIjA0a3hTSGcjPSEjNyQiLyRSOTpAcEwkISM2NyQkIjBgODkua2cjPSEjNyQiMEUqPVVRSWNNISM3NyQ3JCQiMF5GOVtsZyM9ISM3JCIvSEtlbUtoTSEjNjckJCIwYDg5LmtnIz0hIzckIjBFKj1VUUljTSEjNzckNyQkIjBeRjlbbGcjPSEjNyQiL0hLZW1LaE0hIzY3JCQiMDYyW3kqNEU9ISM3JCIwLzNRJEhjek4hIzc3JDckJCIwSyJHbTo1RT0hIzckIjBeMV87S2RlJCEjNzckJCIwNjJbeSo0RT0hIzckIjAvM1EkSGN6TiEjNzckNyQkIjBLIkdtOjVFPSEjNyQiMF4xXztLZGUkISM3NyQkIjBZSCFcYjhFPSEjNyQiLjIjeTsjR3EkISM1NyQ3JCQiMCZSW2l3OEU9ISM3JCIwNiE0c3c4NVAhIzc3JCQiMFlIIVxiOEU9ISM3JCIuMiN5OyNHcSQhIzU3JDckJCIwJlJbaXc4RT0hIzckIjA2ITRzdzg1UCEjNzckJCIwT2tJS3JoIz0hIzckIjB3cno1ITNFUSEjNzckNyQkIjAqSG5vUDxFPSEjNyQiMHN0KnlKYU1RISM3NyQkIjBPa0lLcmgjPSEjNyQiMHdyejUhM0VRISM3NyQ3JCQiMCpIbm9QPEU9ISM3JCIwc3QqeUphTVEhIzc3JCQiMCU+eTFyP0U9ISM3JCIwbWxzQVEkXFIhIzc3JDckJCIwPVpbKSk0aSM9ISM3JCIwS2Rlb1sqZVIhIzc3JCQiMCU+eTFyP0U9ISM3JCIwbWxzQVEkXFIhIzc3JDckJCIwPVpbKSk0aSM9ISM3JCIwS2Rlb1sqZVIhIzc3JCQiMCl5YS1IQ0U9ISM3JCIwI1xCZ2Zmc1MhIzc3JDckJCIwSj9PLFlpIz0hIzckIjAkNHUjPmFMMyUhIzc3JCQiMCl5YS1IQ0U9ISM3JCIwI1xCZ2Zmc1MhIzc3JDckJCIwSj9PLFlpIz0hIzckIjAkNHUjPmFMMyUhIzc3JCQiL0ItMih5aSM9ISM2JCIwJjQoUlRgZT4lISM3NyQ3JCQiLyRvNTojR0U9ISM2JCIwYEMnKnBmeD8lISM3NyQkIi9CLTIoeWkjPSEjNiQiMCY0KFJUYGU+JSEjNzckNyQkIi8kbzU6I0dFPSEjNiQiMGBDJypwZng/JSEjNzckJCIwdkFBXzlqIz0hIzckIjA3I3lCMDY+ViEjNzckNyQkIjBRVioqSD1qIz0hIzckIjA5M2w/bEBMJSEjNzckJCIwdkFBXzlqIz0hIzckIjA3I3lCMDY+ViEjNzckNyQkIjBRVioqSD1qIz0hIzckIjA5M2w/bEBMJSEjNzckJCIwbj4mWy5ORT0hIzckIjBMIXp4c09VVyEjNzckNyQkIjBuRylmV05FPSEjNyQiMHUiUjgyZGNXISM3NyQkIjBuPiZbLk5FPSEjNyQiMEwhenhzT1VXISM3NyQ3JCQiMG5HKWZXTkU9ISM3JCIwdSJSODJkY1chIzc3JCQiMCpwPiQ9J1FFPSEjNyQiMC4mM2pQaWxYISM3NyQ3JCQiMD1cKUcxUkU9ISM3JCIwTnYtQXc0ZSUhIzc3JCQiMCpwPiQ9J1FFPSEjNyQiMC4mM2pQaWxYISM3NyQ3JCQiMD1cKUcxUkU9ISM3JCIwTnYtQXc0ZSUhIzc3JCQiMEVSLC5BayM9ISM3JCIwPjVeJil6KSlvJSEjNzckNyQkIjA5Zywib1VFPSEjNyQiMCYqZXJzIlEwWiEjNzckJCIwRVIsLkFrIz0hIzckIjA+NV4mKXopKW8lISM3NyQ3JCQiMDlnLCJvVUU9ISM3JCIwJiplcnMiUTBaISM3NyQkIjBXYW4peVhFPSEjNyQiL3oocGpOQCJbISM2NyQ3JCQiMCNvVyxJWUU9ISM3JCIwY1VTQih5SFshIzc3JCQiMFdhbil5WEU9ISM3JCIveihwak5AIlshIzY3JDckJCIwI29XLElZRT0hIzckIjBjVVNCKHlIWyEjNzckJCIwQVRJdiRcRT0hIzckIjBzSSgzNlJOXCEjNzckNyQkIjBNMkg/KlxFPSEjNyQiMDtFNHUjPmFcISM3NyQkIjBBVEl2JFxFPSEjNyQiMHNJKDM2Uk5cISM3NyQ3JCQiME0ySD8qXEU9ISM3JCIwO0U0dSM+YVwhIzc3JCQiMEokSEknSGwjPSEjNyQiMCRmKSlHaWtlXSEjNzckNyQkIjAjNFk6YWBFPSEjNyQiMHg0eUMpZnldISM3NyQkIjBKJEhJJ0hsIz0hIzckIjAkZikpR2lrZV0hIzc3JDckJCIwIzRZOmFgRT0hIzckIjB4NHlDKWZ5XSEjNzckJCIwQTlzXmxsIz0hIzckIjA2OiFSNSE+PSYhIzc3JDckJCIwMDUjUTtkRT0hIzckIjBQJHBhUCsuXyEjNzckJCIwQTlzXmxsIz0hIzckIjA2OiFSNSE+PSYhIzc3JDckJCIwMTUjUTtkRT0hIzckIjBQJHBhUCsuXyEjNzckJCIwRk1TVCxtIz0hIzckIjBVTDxgYl5JJiEjNzckNyQkIjAvIT5yeWdFPSEjNyQiMChwZGgjNHVLJiEjNzckJCIwRk1TVCxtIz0hIzckIjBVTDxgYl5JJiEjNzckNyQkIjAvIT5yeWdFPSEjNyQiMChwZGgjNHVLJiEjNzckJCIvJFI9S1BtIz0hIzYkIjBOQkFuNCVHYSEjNzckNyQkIi9vQzpUa0U9ISM2JCIwZWclb1oiPVgmISM3NyQkIi8kUj1LUG0jPSEjNiQiME5CQW40JUdhISM3NyQ3JCQiMCJvQzpUa0U9ISM3JCIwZWclb1oiPVgmISM3NyQkIjAsTCRSS25FPSEjNyQiMGVdP11qO2ImISM3NyQ3JCQiL2VIcC5vRT0hIzYkIjA9V2BGP2lkJiEjNzckJCIwLEwkUktuRT0hIzckIjBlXT9dajtiJiEjNzckNyQkIi9lSHAub0U9ISM2JCIwPVdgRj9pZCYhIzc3JCQiMEZUdjs0biM9ISM3JCIwJTRLKSlwIlxuJiEjNzckNyQkIjBlVVlqO24jPSEjNyQiMHpGQXlEMXEmISM3NyQkIjBGVHY7NG4jPSEjNyQiMCU0SykpcCJcbiYhIzc3JDckJCIwZVVZajtuIz0hIzckIjB6RkF5RDFxJiEjNzckJCIwLyJwMF51RT0hIzckIjByQGU6cSIpeiYhIzc3JDckJCIwJCp5KjRIdkU9ISM3JCIwUjYiKkdKXSNlISM3NyQkIjAvInAwXnVFPSEjNyQiMHJAZTpxIil6JiEjNzckNyQkIjAkKnkqNEh2RT0hIzckIjBSNiIqR0pdI2UhIzc3JCQiMF5HWDAieUU9ISM3JCIwPUUxKUhVQGYhIzc3JDckJCIvLmgnPip5RT0hIzYkIi4mKmZ6TyVcZiEjNTckJCIwXkdYMCJ5RT0hIzckIjA9RTEpSFVAZiEjNzckNyQkIi8uaCc+KnlFPSEjNiQiLiYqZnpPJVxmISM1NyQkIi8oR0wsPG8jPSEjNiQiMEMiKWZbdlkvJyEjNzckNyQkIjBmR0tcRG8jPSEjNyQiLyd5R0lVUTInISM2NyQkIi8oR0wsPG8jPSEjNiQiMEMiKWZbdlkvJyEjNzckNyQkIjBmR0tcRG8jPSEjNyQiLyd5R0lVUTInISM2NyQkIjB0NT0pSCZvIz0hIzckIjBwIyozb0Z6OychIzc3JDckJCIwJlI6Kz0nbyM9ISM3JCIvQXc0eUMpPichIzY3JCQiMHQ1PSlIJm8jPSEjNyQiMHAjKjNvRno7JyEjNzckNyQkIjAmUjorPSdvIz0hIzckIi9BdzR5Qyk+JyEjNjckJCIweSsuJyopKW8jPSEjNyQiMCM+IVxiejZIJyEjNzckNyQkIjA4KTM8IikqbyM9ISM3JCIwImVrO0xsQWohIzc3JCQiMHkrLicqKSlvIz0hIzckIjAjPiFcYno2SCchIzc3JDckJCIwOCkzPCIpKm8jPSEjNyQiMCJlaztMbEFqISM3NyQkIjAlKlslXFwjcCM9ISM3JCIwJ1E7KDNKV1QnISM3NyQ3JCQiME1PYFdNcCM9ISM3JCIwVEhOIyllcVcnISM3NyQkIjAlKlslXFwjcCM9ISM3JCIwJ1E7KDNKV1QnISM3NyQ3JCQiME1PYFdNcCM9ISM3JCIwVEhOIyllcVcnISM3NyQkIjBORSdbNCdwIz0hIzckIi9GJXlII29QbCEjNjckNyQkIjBuS0t5cXAjPSEjNyQiMC04L0xrOWQnISM3NyQkIjBORSdbNCdwIz0hIzckIi9GJXlII29QbCEjNjckNyQkIjBuS0t5cXAjPSEjNyQiMC04L0xrOWQnISM3NyQkIjBiciFlcCpwIz0hIzckIjB1Kkd6SiQ0bSchIzc3JDckJCIwNyd5S3IrRj0hIzckIjBpJ0hQKXBlcCchIzc3JCQiMGJyIWVwKnAjPSEjNyQiMHUqR3pKJDRtJyEjNzckNyQkIjA3J3lLcitGPSEjNyQiMGknSFApcGVwJyEjNzckJCIwdD16KEguRj0hIzckIjBiLXNzJD0leSchIzc3JDckJCIwN1ZCXFZxIz0hIzckIjBBIT1XYEY/byEjNzckJCIwdD16KEguRj0hIzckIjBiLXNzJD0leSchIzc3JDckJCIwN1ZCXFZxIz0hIzckIjBBIT1XYEY/byEjNzckJCIwaWp1K3BxIz0hIzckIjAqSDtrUlYycCEjNzckNyQkIjBSLT4nKXpxIz0hIzckIjAkUTFeM29XcCEjNzckJCIwaWp1K3BxIz0hIzckIjAqSDtrUlYycCEjNzckNyQkIjBSLT4nKXpxIz0hIzckIjAkUTFeM29XcCEjNzckJCIwYSpmWl01Rj0hIzckIjAvRjonUW9JcSEjNzckNyQkIi8+T1VpNkY9ISM2JCIwVlp6TiczcHEhIzc3JCQiMGEqZlpdNUY9ISM3JCIwL0Y6J1FvSXEhIzc3JDckJCIvPk9VaTZGPSEjNiQiMFZaek4nM3BxISM3NyQkIjAmUV8nNFRyIz0hIzckIjBsJjR4TSRSOighIzc3JDckJCIwJylHQmpfciM9ISM3JCIwL0pbJz1cJD4oISM3NyQkIjAmUV8nNFRyIz0hIzckIjBsJjR4TSRSOighIzc3JDckJCIwJylHQmpfciM9ISM3JCIwL0pbJz1cJD4oISM3NyQkIjBXMXQ6eHIjPSEjNyQiMERNQ3IjPXhzISM3NyQ3JCQiMDNvUy4qPUY9ISM3JCIwazk8UCgqeUooISM3NyQkIjBXMXQ6eHIjPSEjNyQiMERNQ3IjPXhzISM3NyQ3JCQiMDNvUy4qPUY9ISM3JCIwazk8UCgqeUooISM3NyQkIjAiKSkqb0E4cyM9ISM3JCIvO0hsO1YrdSEjNjckNyQkIjA6aGBXRHMjPSEjNyQiMEQpZnlHSVV1ISM3NyQkIjAiKSkqb0E4cyM9ISM3JCIvO0hsO1YrdSEjNjckNyQkIjA6aGBXRHMjPSEjNyQiMEQpZnlHSVV1ISM3NyQkIi9oWjIkXHMjPSEjNiQiMHpBZkUhb0J2ISM3NyQ3JCQiMGpDdic9RUY9ISM3JCIwJj1bJlEzbmMoISM3NyQkIi9oWjIkXHMjPSEjNiQiMHpBZkUhb0J2ISM3NyQ3JCQiMGpDdic9RUY9ISM3JCIwJj1bJlEzbmMoISM3NyQkIi5WeFImR0Y9ISM1JCIwPWhlYkdwayghIzc3JDckJCIwZSNvKkgpSEY9ISM3JCIwWGxCKlE2InAoISM3NyQkIi5WeFImR0Y9ISM1JCIwPWhlYkdwayghIzc3JDckJCIwZSNvKkgpSEY9ISM3JCIwWGxCKlE2InAoISM3NyQkIjBAKXAoXEB0Iz0hIzckIi8oW15gdyx4KCEjNjckNyQkIjA9OUJ1TXQjPSEjNyQiMDFcIypSPmIieSEjNzckJCIwQClwKFxAdCM9ISM3JCIvKFteYHcseCghIzY3JDckJCIwPTlCdU10Iz0hIzckIjAxXCMqUj5iInkhIzc3JCQiMClSI3lnZHQjPSEjNyQiMDBBJCk9Q00qeSEjNzckNyQkIjBCaVw+cnQjPSEjNyQiMG1LaCFcIypSeiEjNzckJCIwKVIjeWdkdCM9ISM3JCIwMEEkKT1DTSp5ISM3NyQ3JCQiMEJpXD5ydCM9ISM3JCIwbUtoIVwjKlJ6ISM3NyQkIjBiZCVHUFJGPSEjNyQiMDFvWF1ybSwpISM3NyQ3JCQiMEVKKmV3U0Y9ISM3JCIwRjtJVElWMSkhIzc3JCQiMGJkJUdQUkY9ISM3JCIwMW9YXXJtLCkhIzc3JDckJCIwRUoqZXdTRj0hIzckIjBGO0lUSVYxKSEjNzckJCIuJEdmKUh1Iz0hIzUkIjBVO1NcPSpSIikhIzc3JDckJCIwJnBSS1RXRj0hIzckIjAoKSoqKT5mdCk9KSEjNzckJCIuJEdmKUh1Iz0hIzUkIjBVO1NcPSpSIikhIzc3JDckJCIwJnBSS1RXRj0hIzckIjAoKSoqKT5mdCk9KSEjNzckJCIwI2VIKipmWUY9ISM3JCIwL3cpKT1sSkUpISM3NyQ3JCQiMDohUTsxW0Y9ISM3JCIwWiR5RTk5OCQpISM3NyQkIjAjZUgqKmZZRj0hIzckIjAvdykpPWxKRSkhIzc3JDckJCIwOiFROzFbRj0hIzckIjBaJHlFOTk4JCkhIzc3JCQiMHckR11AXUY9ISM3JCIvTiM9YDZrUSkhIzY3JDckJCIwRyFvNnJeRj0hIzckIjAzbk8kcGFQJSkhIzc3JCQiMHckR11AXUY9ISM3JCIvTiM9YDZrUSkhIzY3JDckJCIwRyFvNnJeRj0hIzckIjAzbk8kcGFQJSkhIzc3JCQiMCNmdTUkUXYjPSEjNyQiMCZcKTRkZCc0JikhIzc3JDckJCIwJFtvOk9iRj0hIzckIjBvXTBXXz5jKSEjNzckJCIwI2Z1NSRRdiM9ISM3JCIwJlwpNGRkJzQmKSEjNzckNyQkIjAkW286T2JGPSEjNyQiMG9dMFdfPmMpISM3NyQkIjA6PDZbdXYjPSEjNyQiMCRwVCNILkhqKSEjNzckNyQkIi9QK0osZkY9ISM2JCIwSE11JXpOJ28pISM3NyQkIjA6PDZbdXYjPSEjNyQiMCRwVCNILkhqKSEjNzckNyQkIjByLjU4IWZGPSEjNyQiMEhNdSV6TidvKSEjNzckJCIweEw8bTV3Iz0hIzckIjBcTmBvW2h2KSEjNzckNyQkIjAvSWpsRXcjPSEjNyQiMCp5SmFNdzUpKSEjNzckJCIweEw8bTV3Iz0hIzckIjBcTmBvW2h2KSEjNzckNyQkIjAvSWpsRXcjPSEjNyQiMCp5SmFNdzUpKSEjNzckJCIweF0/Jm9rRj0hIzckIjBzOnN3JFJ6KSkhIzc3JDckJCIwTWBBPmp3Iz0hIzckIi86P2gqb14kKikhIzY3JCQiMHhdPyZva0Y9ISM3JCIwczpzdyRSeikpISM3NyQ3JCQiMExgQT5qdyM9ISM3JCIvOj9oKm9eJCopISM2NyQkIjAxZ0wwJG9GPSEjNyQiMCdSaidcUUUrKiEjNzckNyQkIjBWMCRRKCpwRj0hIzckIi9eM29XZGYhKiEjNjckJCIwMWdMMCRvRj0hIzckIjAnUmonXFFFKyohIzc3JDckJCIwVjAkUSgqcEY9ISM3JCIvXjNvV2RmISohIzY3JCQiMCpRMmojPngjPSEjNyQiMFVrbCZIKWU3KiEjNzckNyQkIjAoPUUlSE94Iz0hIzckIi8ob1woKnpSPSohIzY3JCQiMCpRMmojPngjPSEjNyQiMFVrbCZIKWU3KiEjNzckNyQkIjAoPUUlSE94Iz0hIzckIi8ob1woKnpSPSohIzY3JCQiMEd4UFtieCM9ISM3JCIwIyo+VDFGIlwjKiEjNzckNyQkIjApSCM0J0d4Rj0hIzckIjBKXz1bJlEzJCohIzc3JCQiMEd4UFtieCM9ISM3JCIwIyo+VDFGIlwjKiEjNzckNyQkIjApSCM0J0d4Rj0hIzckIjBKXz1bJlEzJCohIzc3JCQiMHZ2VHIiekY9ISM3JCIwWDIzJzNQcyQqISM3NyQ3JCQiMC9EI1ElNHkjPSEjNyQiMCJmdCkpNHpLJSohIzc3JCQiMHZ2VHIiekY9ISM3JCIwWDIzJzNQcyQqISM3NyQ3JCQiMC9EI1ElNHkjPSEjNyQiMCJmdCkpNHpLJSohIzc3JCQiMC0zXCZ6I3kjPSEjNyQiMF5ZaEs5Y1wqISM3NyQ3JCQiLzpiRGcleSM9ISM2JCIwXz5jXCc+ZCYqISM3NyQkIjAtM1wmeiN5Iz0hIzckIjBeWWhLOWNcKiEjNzckNyQkIi86YkRnJXkjPSEjNiQiMF8+Y1wnPmQmKiEjNzckJCIveCpmP2t5Iz0hIzYkIjBhIVFmdSYpPScqISM3NyQ3JCQiMHhUTmkjKXkjPSEjNyQiMDcuRCstO28qISM3NyQkIi94KmY/a3kjPSEjNiQiMGEhUWZ1Jik9JyohIzc3JDckJCIweFROaSMpeSM9ISM3JCIwNy5EKy07byohIzc3JCQiMHRcaFkreiM9ISM3JCIwSk0/SStAdSohIzc3JDckJCIwKDQhNEI+eiM9ISM3JCIwcydRNHYrMSkqISM3NyQkIjB0XGhZK3ojPSEjNyQiMEpNP0krQHUqISM3NyQ3JCQiMCg0ITRCPnojPSEjNyQiMHMnUTR2KzEpKiEjNzckJCIwT0ttdE96Iz0hIzckIjB1VU0iR01sKSohIzc3JDckJCIwIm8qKVtlJnojPSEjNyQiMExxaSw4LyQqKiEjNzckJCIwT0ttdE96Iz0hIzckIjB1VU0iR01sKSohIzc3JDckJCIwIm8qKVtlJnojPSEjNyQiMExxaSw4LyQqKiEjNzckJCIwKSopPjtJKHojPSEjNyQiMD14Ti4mZSkpKiohIzc3JDckJCIwLiYpcFojKnojPSEjNyQiMFI6QiY9WzA1ISM2NyQkIjApKik+O0koeiM9ISM3JCIwPXhOLiZlKSkqKiEjNzckNyQkIjAuJilwWiMqeiM9ISM3JCIwUjpCJj1bMDUhIzY3JCQiMHBwbkk0IUc9ISM3JCIwNygzIXAjPTY1ISM2NyQ3JCQiMHUkKlw2SCFHPSEjNyQiMHYuSVNBeiwiISM2NyQkIjBwcG5JNCFHPSEjNyQiMDcoMyFwIz02NSEjNjckNyQkIjB1JCpcNkghRz0hIzckIjB2LklTQXosIiEjNjckJCIwLlFqZ1ghRz0hIzckIjAtbXolb11CNSEjNjckNyQkIjBiP1B3bCFHPSEjNyQiMDYjcGBIT0k1ISM2NyQkIjAuUWpnWCFHPSEjNyQiMC1teiVvXUI1ISM2NyQ3JCQiMGI/UHdsIUc9ISM3JCIwNiNwYEhPSTUhIzY3JCQiMFI6aiI+M0c9ISM3JCIwIipvQyg0JGUuIiEjNjckNyQkIjA2LEtVLSJHPSEjNyQiMFohUS9OIUcvIiEjNjckJCIwUjpqIj4zRz0hIzckIjAiKm9DKDQkZS4iISM2NyQ3JCQiMDYsS1UtIkc9ISM3JCIwWiFRL04hRy8iISM2NyQkIjBuT25CPSJHPSEjNyQiMCdRW2pdOls1ISM2NyQ3JCQiMDpxPjRSIkc9ISM3JCIwJSlvXTBXXzAiISM2NyQkIjBuT25CPSJHPSEjNyQiMCdRW2pdOls1ISM2NyQ3JCQiMDpxPjRSIkc9ISM3JCIwJSlvXTBXXzAiISM2NyQkIjBfJG9tWDpHPSEjNyQiMGFiUjd6LzEiISM2NyQ3JCQiMDwlSHJkPEc9ISM3JCIvc3YwWW9uNSEjNTckJCIwXyRvbVg6Rz0hIzckIjBhYlI3ei8xIiEjNjckNyQkIjA8JUhyZDxHPSEjNyQiL3N2MFlvbjUhIzU3JCQiMEJ6ZCE0Pkc9ISM3JCIwKT00YkohRzIiISM2NyQ3JCQiMCozJjNZNyNHPSEjNyQiMGNYazpELDMiISM2NyQkIjBCemQhND5HPSEjNyQiMCk9NGJKIUcyIiEjNjckNyQkIjAqMyYzWTcjRz0hIzckIjBjWGs6RCwzIiEjNjckJCIvN05ic0FHPSEjNiQiMGNPRTpGXjMiISM2NyQ3JCQiMCVHV2ciXCNHPSEjNyQiMCNSODJkYyM0IiEjNjckJCIvN05ic0FHPSEjNiQiMGNPRTpGXjMiISM2NyQ3JCQiMCVHV2ciXCNHPSEjNyQiMCNSODJkYyM0IiEjNjckJCIwMWReaGojRz0hIzckIjB5bXQ2XnU0IiEjNjckNyQkIjBkdDAoZUdHPSEjNyQiMEdBeUQxXTUiISM2NyQkIjAxZF5oaiNHPSEjNyQiMHltdDZedTQiISM2NyQ3JCQiMGR0MChlR0c9ISM3JCIwR0F5RDFdNSIhIzY3JCQiMHlqWSkqKkhHPSEjNyQiMGsiKjQwdig0NiEjNjckNyQkIjBNNzJmQSRHPSEjNyQiMGs1JjNvVzw2ISM2NyQkIjB5alkpKipIRz0hIzckIjBrIio0MHYoNDYhIzY3JDckJCIwTTcyZkEkRz0hIzckIjBrNSYzb1c8NiEjNjckJCIwKW9RampMRz0hIzckIjBta10mKik0QTYhIzY3JDckJCIwJXlQPyRmJEc9ISM3JCIuKj5mdCkpSDYhIio3JCQiMClvUWpqTEc9ISM3JCIwbWtdJiopNEE2ISM2NyQ3JCQiMCV5UD8kZiRHPSEjNyQiLio+ZnQpKUg2ISIqNyQkIi9PSV9GUEc9ISM2JCIwSl9rI0dVTTYhIzY3JDckJCIwJnpQaGdSRz0hIzckIjBPKCkpNHpLVTYhIzY3JCQiL09JX0ZQRz0hIzYkIjBKX2sjR1VNNiEjNjckNyQkIjAmelBoZ1JHPSEjNyQiME8oKSk0ektVNiEjNjckJCIwVl08OjQlRz0hIzckIjBsdlNtWW45IiEjNjckNyQkIjAwZToiR1ZHPSEjNyQiMHN2MFlvWjoiISM2NyQkIjBWXTw6NCVHPSEjNyQiMGx2U21ZbjkiISM2NyQ3JCQiMDBlOiJHVkc9ISM3JCIwc3YwWW9aOiIhIzY3JCQiMDxEJ2ZiV0c9ISM3JCIwTHZZWnEhZjYhIzY3JDckJCIwY2ZAZHAlRz0hIzckIjAzazcsNHM7IiEjNjckJCIwPEQnZmJXRz0hIzckIjBMdllacSFmNiEjNjckNyQkIjBjZkBkcCVHPSEjNyQiMDNrNyw0czsiISM2NyQkIjBiNSZ5PltHPSEjNyQiMCQqcCpcVVJyNiEjNjckNyQkIjAoR0NWal1HPSEjNyQiMFdfPmNcJ3o2ISM2NyQkIjBiNSZ5PltHPSEjNyQiMCQqcCpcVVJyNiEjNjckNyQkIjAoR0NWal1HPSEjNyQiMFdfPmNcJ3o2ISM2NyQkIjBEOHJTPSZHPSEjNyQiMFQxVCp6ciQ9IiEjNjckNyQkIjBUXlY3ViZHPSEjNyQiLzNrNyw0Iz4iISM1NyQkIjBEOHJTPSZHPSEjNyQiMFQxVCp6ciQ9IiEjNjckNyQkIjBUXlY3ViZHPSEjNyQiLzNrNyw0Iz4iISM1NyQkIjAqPlZYW2JHPSEjNyQiMCkpKTMyPC8nPiIhIzY3JDckJCIwcyZlOSp6Jkc9ISM3JCIwO0hMbUlYPyIhIzY3JCQiMCo+VlhbYkc9ISM3JCIwKSkpMzI8Lyc+IiEjNjckNyQkIjBzJmU5KnomRz0hIzckIjA7SExtSVg/IiEjNjckJCIwIj5kI0giZkc9ISM3JCIwbSd5IlJsJDM3ISM2NyQ3JCQiMHRHZHI7J0c9ISM3JCIwXzxTQHJwQCIhIzY3JCQiMCI+ZCNIImZHPSEjNyQiMG0neSJSbCQzNyEjNjckNyQkIjB0R2RyOydHPSEjNyQiMF88U0BycEAiISM2NyQkIjB6MS52RidHPSEjNyQiMEE3RC8qbz83ISM2NyQ3JCQiMEA7eV9gJ0c9ISM3JCIwKWVxazxUSDchIzY3JCQiMHoxLnZGJ0c9ISM3JCIwQTdELypvPzchIzY3JDckJCIwQDt5X2AnRz0hIzckIjApZXFrPFRINyEjNjckJCIwanInPVVtRz0hIzckIjBIYCJmRSxMNyEjNjckNyQkIjBVOCFcLnBHPSEjNyQiMEMlUjpCJj1DIiEjNjckJCIwanInPVVtRz0hIzckIjBIYCJmRSxMNyEjNjckNyQkIjBVOCFcLnBHPSEjNyQiMEMlUjpCJj1DIiEjNjckJCIwLSFbJnArKEc9ISM3JCIwZD8oW2lMWDchIzY3JDckJCIwW3QpenJzRz0hIzckIi9FM21HSGE3ISM1NyQkIjAtIVsmcCsoRz0hIzckIjBkPyhbaUxYNyEjNjckNyQkIjBbdCl6cnNHPSEjNyQiL0UzbUdIYTchIzU3JCQiMCI+UCM9UChHPSEjNyQiMGZiZiEpZndEIiEjNjckNyQkIjAsPzYtayhHPSEjNyQiMCc0eDtNdG03ISM2NyQkIjAiPlAjPVAoRz0hIzckIjBmYmYhKWZ3RCIhIzY3JDckJCIwLD82LWsoRz0hIzckIjAnNHg7TXRtNyEjNjckJCIwOnMqeU94Rz0hIzckIjBCaD9MJCkqcDchIzY3JDckJCIwWGJMKDMhKUc9ISM3JCIwS2Z1J1I8ejchIzY3JCQiMDpzKnlPeEc9ISM3JCIwQmg/TCQpKnA3ISM2NyQ3JCQiMFhiTCgzISlHPSEjNyQiMEtmdSdSPHo3ISM2NyQkIjBvWGk9NSlHPSEjNyQiL04lUiNvSSNHIiEjNTckNyQkIjBNWVl0UClHPSEjNyQiMG9aIj1YaCJIIiEjNjckJCIwb1hpPTUpRz0hIzckIi9OJVIjb0kjRyIhIzU3JDckJCIwTVlZdFApRz0hIzckIjBvWiI9WGgiSCIhIzY3JCQiMCM0Ri1uJSlHPSEjNyQiMCZRdyhHSVlIIiEjNjckNyQkIi85JmZndSlHPSEjNiQiMC9PKW9dMC84ISM2NyQkIjAjNEYtbiUpRz0hIzckIjAmUXcoR0lZSCIhIzY3JDckJCIvOSZmZ3UpRz0hIzYkIjAvTylvXTAvOCEjNjckJCIvKSpwRkspKUc9ISM2JCIwJT1WQFAmcEkiISM2NyQ3JCQiMFolKXpbNipHPSEjNyQiL1dfPmNcOzghIzU3JCQiLykqcEZLKSlHPSEjNiQiMCU9VkBQJnBJIiEjNjckNyQkIjBaJSl6WzYqRz0hIzckIi9XXz5jXDs4ISM1NyQkIjBfWlR3PipHPSEjNyQiMFtvKD5yRj44ISM2NyQ3JCQiMCIqUSR6JFsqRz0hIzckIjB3Ny08TypHOCEjNjckJCIwX1pUdz4qRz0hIzckIjBbbyg+ckY+OCEjNjckNyQkIjAiKlEkeiRbKkc9ISM3JCIwdzctPE8qRzghIzY3JCQiMHkxJDRqJipHPSEjNyQiMCo+PCFcKztMIiEjNjckNyQkIjAmeXQiRyYpKkc9ISM3JCIwNyw0c3c4TSIhIzY3JCQiMHkxJDRqJipHPSEjNyQiMCo+PCFcKztMIiEjNjckNyQkIjAmeXQiRyYpKkc9ISM3JCIwNyw0c3c4TSIhIzY3JCQiMDxIXCdHKipHPSEjNyQiMCpmLUZRI1JNIiEjNjckNyQkIjBObkc+QSFIPSEjNyQiMFwqZXJzIlFOIiEjNjckJCIwPEhcJ0cqKkc9ISM3JCIwKmYtRlEjUk0iISM2NyQ3JCQiME5uRz5BIUg9ISM3JCIwXCplcnMiUU4iISM2NyQkIjAkR15IJUghSD0hIzckIjAzWV44WmlOIiEjNjckNyQkIjAvTGA2ZiFIPSEjNyQiMCZ5RkF5RG04ISM2NyQkIjAkR15IJUghSD0hIzckIjAzWV44WmlOIiEjNjckNyQkIjAvTGA2ZiFIPSEjNyQiMCZ5RkF5RG04ISM2NyQkIjBvMFkrbSFIPSEjNyQiLnAmNC9kbzghIio3JDckJCIwJHBfWWc0SD0hIzckIjBAbUhQKXB5OCEjNjckJCIwbzBZK20hSD0hIzckIi5wJjQvZG84ISIqNyQ3JCQiMCRwX1lnNEg9ISM3JCIwQG1IUClweTghIzY3JCQiMCYzUSllLSJIPSEjNyQiMFlfaGwkKjNRIiEjNjckNyQkIjByTSkpKUg4SD0hIzckIjBkYU8jKlE2UiIhIzY3JCQiMCYzUSllLSJIPSEjNyQiMFlfaGwkKjNRIiEjNjckNyQkIjByTSkpKUg4SD0hIzckIjBkYU8jKlE2UiIhIzY3JCQiMEVeSD1SIkg9ISM3JCIwXEAib29AJFIiISM2NyQ3JCQiMGArLCUqcCJIPSEjNyQiMCRITXUlek5TIiEjNjckJCIwRV5IPVIiSD0hIzckIjBcQCJvb0AkUiIhIzY3JDckJCIwYCssJSpwIkg9ISM3JCIwJEhNdSV6TlMiISM2NyQkIjBAeGh5diJIPSEjNyQiMChwTF8rYTA5ISM2NyQ3JCQiMGAtRCFwP0g9ISM3JCIwSEpdLT9nVCIhIzY3JCQiMEB4aHl2Ikg9ISM3JCIwKHBMXythMDkhIzY3JDckJCIwYC1EIXA/SD0hIzckIjBISl0tP2dUIiEjNjckJCIwOD8tUzcjSD0hIzckIjBPbz0/anlUIiEjNjckNyQkIi9hJFEoUUNIPSEjNiQiMGw+ZGRnJUc5ISM2NyQkIjA4Py1TNyNIPSEjNyQiME9vPT9qeVQiISM2NyQ3JCQiL2EkUShRQ0g9ISM2JCIwbD5kZGclRzkhIzY3JCQiMHkiKkctXCNIPSEjNyQiMDlLUEsnPUk5ISM2NyQ3JCQiMHkkPmIzR0g9ISM3JCIwLDNrNyw0VyIhIzY3JCQiMHkiKkctXCNIPSEjNyQiMDlLUEsnPUk5ISM2NyQ3JCQiMHkkPmIzR0g9ISM3JCIwLDNrNyw0VyIhIzY3JCQiMEp5X2wmR0g9ISM3JCIwalhXVDREVyIhIzY3JDckJCIwekB4JXlKSD0hIzckIjBQJzR4O01gOSEjNjckJCIwSnlfbCZHSD0hIzckIjBqWFdUNERXIiEjNjckNyQkIjB6QHgleUpIPSEjNyQiMFAnNHg7TWA5ISM2NyQkIjBVOSYpSEEkSD0hIzckIjBacS5aS1tYIiEjNjckNyQkIjAqKVIiXFtOSD0hIzckIjB0JXlGQXlsOSEjNjckJCIwVTkmKUhBJEg9ISM3JCIwWnEuWktbWCIhIzY3JDckJCIwKilSIlxbTkg9ISM3JCIwdCV5RkF5bDkhIzY3JCQiMGUnPl0qZSRIPSEjNyQiMFg4IypcYnJZIiEjNjckNyQkIjAyWi8nPVJIPSEjNyQiMDR0JXlGQXk5ISM2NyQkIjBlJz5dKmUkSD0hIzckIjBYOCMqXGJyWSIhIzY3JDckJCIwMlovJz1SSD0hIzckIjA0dCV5RkF5OSEjNjckJCIwQDk7aCZSSD0hIzckIjA0U29ceSV6OSEjNjckNyQkIjB2KnoiKSlHJUg9ISM3JCIwWGgiSExtIVwiISM2NyQkIjBAOTtoJlJIPSEjNyQiMDRTb1x5JXo5ISM2NyQ3JCQiMHYqeiIpKUclSD0hIzckIjBYaCJITG0hXCIhIzY3JCQiMDclKUdHSyVIPSEjNyQiMCNmKEdZLD1cIiEjNjckNyQkIjBmL0wiZllIPSEjNyQiMCIpXCl6UTUuOiEjNjckJCIwNyUpR0dLJUg9ISM3JCIwI2YoR1ksPVwiISM2NyQ3JCQiMGYvTCJmWUg9ISM3JCIwIilcKXpRNS46ISM2NyQkIjByY1AnKm8lSD0hIzckIjA+QCIpUkNUXSIhIzY3JDckJCIwPEtaJkhdSD0hIzckIjA8UTBWV2JeIiEjNjckJCIwcmNQJypvJUg9ISM3JCIwPkAiKVJDVF0iISM2NyQ3JCQiMDxLWiZIXUg9ISM3JCIwPFEwVldiXiIhIzY3JCQiMCo0T2FjXUg9ISM3JCIvQjstdFc7OiEjNTckNyQkIjBmLGkrUyZIPSEjNyQiMGBFNylcKXpfIiEjNjckJCIwKjRPYWNdSD0hIzckIi9COy10Vzs6ISM1NyQ3JCQiMGYsaStTJkg9ISM3JCIwYEU3KVwpel8iISM2NyQkIjBEOVlOVSZIPSEjNyQiL1dFdix4RzohIzU3JDckJCIvNmtucWRIPSEjNiQiMCpbIj5gRC9hIiEjNjckJCIwRDlZTlUmSD0hIzckIi9XRXYseEc6ISM1NyQ3JCQiLzZrbnFkSD0hIzYkIjAqWyI+YEQvYSIhIzY3JCQiMEshcGsheiZIPSEjNyQiMDlxbywkNFQ6ISM2NyQ3JCQiMGVlejg5J0g9ISM3JCIwRC5FM21HYiIhIzY3JCQiMEshcGsheiZIPSEjNyQiMDlxbywkNFQ6ISM2NyQ3JCQiMGVlejg5J0g9ISM3JCIwRC5FM21HYiIhIzY3JCQiMDYvS3k6J0g9ISM3JCIwdT85JGVUYDohIzY3JDckJCIwbismPjdsSD0hIzckIjBoIkhMbUlsOiEjNjckJCIwNi9LeTonSD0hIzckIjB1PzkkZVRgOiEjNjckNyQkIjBuKyY+N2xIPSEjNyQiMGgiSExtSWw6ISM2NyQkIjAoKipvN0RsSD0hIzckIi8qKnk1J1FkYyIhIzU3JDckJCIwVE4pNCQpb0g9ISM3JCIwKCp6Uj1aeGQiISM2NyQkIjAoKipvN0RsSD0hIzckIi8qKnk1J1FkYyIhIzU3JDckJCIwVE4pNCQpb0g9ISM3JCIwKCp6Uj1aeGQiISM2NyQkIjA7bzFEKm9IPSEjNyQiMCUpR0hPaCF5OiEjNjckNyQkIjBwKFs2YXNIPSEjNyQiMExvWXQoPSFmIiEjNjckJCIwO28xRCpvSD0hIzckIjAlKUdIT2gheTohIzY3JDckJCIwcChbNmFzSD0hIzckIjBMb1l0KD0hZiIhIzY3JCQiMENTJyoqZnNIPSEjNyQiMFU7KXpTUSFmIiEjNjckNyQkIjBUMD5faShIPSEjNyQiMHBjYEdHRWciISM2NyQkIjBDUycqKmZzSD0hIzckIjBVOyl6U1EhZiIhIzY3JDckJCIwVDA+X2koSD0hIzckIjBwY2BHR0VnIiEjNjckJCIwbHBxdmkoSD0hIzckIjAlZmVwbnEtOyEjNjckNyQkIjBjVVNCKHlIPSEjNyQiMEByNz81NGgiISM2NyQkIjBscHF2aShIPSEjNyQiMCVmZXBucS07ISM2NyQ3JCQiMGNVU0IoeUg9ISM3JCIwZS8jKVxxVyE9ISM3NyQkIjBKMEh3QDUkPSEjNyQiMGUvIylccVchPSEjNzckNyQkIjAjWyZRM25PJD0hIzckIjA4IjMmPnVeeSIhIzc3JCQiMEowSHdANSQ9ISM3JCIwZS8jKVxxVyE9ISM3NyQ3JCQiMGNVU0IoeUg9ISM3JCIwQHI3PzU0aCIhIzY3JCQiMEpyOGAqekg9ISM3JCIwWGJfU0hdaCIhIzY3JDckJCIvamVbJyp6SD0hIzYkIjAwWGckKW9daCIhIzY3JCQiMEpyOGAqekg9ISM3JCIwWGJfU0hdaCIhIzY3JDckJCIvamVbJyp6SD0hIzYkIjAwWGckKW9daCIhIzY3JCQiMDopZkhqJClIPSEjNyQiLUBrPk5GOyEiKTckNyQkIjBZNXh6TylIPSEjNyQiMFRMblE0dmkiISM2NyQkIjA6KWZIaiQpSD0hIzckIi1Aaz5ORjshIik3JDckJCIwWTV4ek8pSD0hIzckIjBUTG5RNHZpIiEjNjckJCIwKHphUEooKUg9ISM3JCIwRykpPlx1J1I7ISM2NyQ3JCQiMD1wbyZSKClIPSEjNyQiMHhAdSQqXCpSOyEjNjckJCIwKHphUEooKUg9ISM3JCIwRykpPlx1J1I7ISM2NyQ3JCQiMD1wbyZSKClIPSEjNyQiMHhAdSQqXCpSOyEjNjckJCIwJylwUiYqNCpIPSEjNyQiMEosRSpwKj5sIiEjNjckNyQkIjAzK1s3NipIPSEjNyQiMDk1IilbIVJfOyEjNjckJCIwJylwUiYqNCpIPSEjNyQiMEosRSpwKj5sIiEjNjckNyQkIjAzK1s3NipIPSEjNyQiMDk1IilbIVJfOyEjNjckJCIwIm84IXlZKkg9ISM3JCIwRG4+WT5WbSIhIzY3JDckJCIwNk1GSVsqSD0hIzckIi8mKXpRNSRbbSIhIzU3JCQiMCJvOCF5WSpIPSEjNyQiMERuPlk+Vm0iISM2NyQ3JCQiMDZNRklbKkg9ISM3JCIvJil6UTUkW20iISM1NyQkIjBLMnNoJCkqSD0hIzckIjBZcmoqPWt3OyEjNjckNyQkIjAqPSsjXCYpKkg9ISM3JCIwJ29bKmVyc24iISM2NyQkIjBLMnNoJCkqSD0hIzckIjBZcmoqPWt3OyEjNjckNyQkIjAqPSsjXCYpKkg9ISM3JCIwJ29bKmVyc24iISM2NyQkIjA0T0dZPyskPSEjNyQiMC5NTElrKilvIiEjNjckNyQkIjB1JyoqKm9BKyQ9ISM3JCIwQXYsOTcoKm8iISM2NyQkIjA0T0dZPyskPSEjNyQiMC5NTElrKilvIiEjNjckNyQkIjB1JyoqKm9BKyQ9ISM3JCIwQXYsOTcoKm8iISM2NyQkIjBNOyI9dDBJPSEjNyQiMGZcJHptRyw8ISM2NyQ3JCQiMEE/ISkqKWYrJD0hIzckIjBlajNwX0BxIiEjNjckJCIwTTsiPXQwST0hIzckIjBmXCR6bUcsPCEjNjckNyQkIjBBPyEpKilmKyQ9ISM3JCIwZWozcF9AcSIhIzY3JCQiMCpSIz49JTRJPSEjNyQiMFhBIUchNE9yIiEjNjckNyQkIjBrd1w2KDRJPSEjNyQiMCU+YlRLZjk8ISM2NyQkIjAqUiM+PSU0ST0hIzckIjBYQSFHITRPciIhIzY3JDckJCIwa3dcNig0ST0hIzckIjAlPmJUS2Y5PCEjNjckJCIwcGduMEosJD0hIzckIjA8SjhNSmZzIiEjNjckNyQkIjB4eUlNTSwkPSEjNyQiLy5DI3pMcXMiISM1NyQkIjBwZ24wSiwkPSEjNyQiMDxKOE1KZnMiISM2NyQ3JCQiMHh5SU1NLCQ9ISM3JCIvLkMjekxxcyIhIzU3JCQiMCVbL1N6O0k9ISM3JCIwZWB2aWAjUTwhIzY3JDckJCIwW0srZXIsJD0hIzckIjBtR0hNdSVSPCEjNjckJCIwJVsvU3o7ST0hIzckIjBlYHZpYCNRPCEjNjckNyQkIjBbSytlciwkPSEjNyQiMG1HSE11JVI8ISM2NyQkIjBSbEkkWz9JPSEjNyQiMHJjRCllZF08ISM2NyQ3JCQiMGEkKm8jKTMtJD0hIzckIjAtPE8qWyI+diIhIzY3JCQiMFJsSSRbP0k9ISM3JCIwcmNEKWVkXTwhIzY3JDckJCIwYSQqbyMpMy0kPSEjNyQiMC08TypbIj52IiEjNjckJCIwJypwY3RULSQ9ISM3JCIwNkhvNSkqR3ciISM2NyQ3JCQiLzgkUjNZLSQ9ISM2JCIwUTBWV2JWdyIhIzY3JCQiMCcqcGN0VC0kPSEjNyQiMDZIbzUpKkd3IiEjNjckNyQkIi84JFIzWS0kPSEjNiQiMFEwVldiVnciISM2NyQkIjB0P3FreS0kPSEjNyQiMEdkSUk/X3giISM2NyQ3JCQiMEU4KFxMR0k9ISM3JCIwdSQqXCpmenc8ISM2NyQkIjB0P3FreS0kPSEjNyQiMEdkSUk/X3giISM2NyQ3JCQiMEU4KFxMR0k9ISM3JCIwdSQqXCpmenc8ISM2NyQkIjBObiFwYkpJPSEjNyQiMHAqKVxZVXZ5IiEjNjckNyQkIi9HJW9pPy4kPSEjNiQiL0BvWGxCKnkiISM1NyQkIjBObiFwYkpJPSEjNyQiMHAqKVxZVXZ5IiEjNjckNyQkIi9HJW9pPy4kPSEjNiQiL0BvWGxCKnkiISM1NyQkIjAlbyEqKlxfLiQ9ISM3JCIvI0coKWZrKSp6IiEjNTckNyQkIjBDOUYiek5JPSEjNyQiMFlxajR4OyE9ISM2NyQkIjAlbyEqKlxfLiQ9ISM3JCIvI0coKWZrKSp6IiEjNTckNyQkIjBDOUYiek5JPSEjNyQiMFlxajR4OyE9ISM2NyQkIjAkNElTJSpRST0hIzckIjBQST1xJz03PSEjNjckNyQkIjBrRyczX1JJPSEjNyQiMCMpZXFrPFQiPSEjNjckJCIwJDRJUyUqUUk9ISM3JCIwUEk9cSc9Nz0hIzY3JDckJCIwa0cnM19SST0hIzckIjAjKWVxazxUIj0hIzY3JCQiMHdZJCpRRS8kPSEjNyQiMDciPngoM1gjPSEjNjckNyQkIjB0I0c4RFZJPSEjNyQiMD1aeD5lbCM9ISM2NyQkIjB3WSQqUUUvJD0hIzckIjA3Ij54KDNYIz0hIzY3JDckJCIwdCNHOERWST0hIzckIjA9Wng+ZWwjPSEjNjckJCIwPCYpKltMWUk9ISM3JCIwRyhlPTMkbyQ9ISM2NyQ3JCQiMFx6I0gpcC8kPSEjNyQiMGFOJVsoKSoqUT0hIzY3JCQiMDwmKSpbTFlJPSEjNyQiMEcoZT0zJG8kPSEjNjckNyQkIjBceiNIKXAvJD0hIzckIjBhTiVbKCkqKlE9ISM2NyQkIjAnKjR2SiswJD0hIzckIjByKltKRzpcPSEjNjckNyQkIjBsOFM6MjAkPSEjNyQiL1I3KkhSOSY9ISM1NyQkIjAnKjR2SiswJD0hIzckIjByKltKRzpcPSEjNjckNyQkIjBsOFM6MjAkPSEjNyQiL1I3KkhSOSY9ISM1NyQkIjA2JlwlSFAwJD0hIzckIjBSa3MiW1poPSEjNjckNyQkIjBEUXhbVzAkPSEjNyQiMEU3KVwpelEnPSEjNjckJCIwNiZcJUhQMCQ9ISM3JCIwUmtzIltaaD0hIzY3JDckJCIwRFF4W1cwJD0hIzckIjBFNylcKXpRJz0hIzY3JCQiMCZwRCNHdTAkPSEjNyQiMDolW29uenQ9ISM2NyQ3JCQiMEdnRCQ9ZUk9ISM3JCIwaSswUz9qKD0hIzY3JCQiMCZwRCNHdTAkPSEjNyQiMDolW29uenQ9ISM2NyQ3JCQiMEdnRCQ9ZUk9ISM3JCIwaSswUz9qKD0hIzY3JCQiMDJFKHk3aEk9ISM3JCIwVSV5InA9aCk9ISM2NyQ3JCQiL2JSJz0+MSQ9ISM2JCIwKSopPV40dykpPSEjNjckJCIwMkUoeTdoST0hIzckIjBVJXkicD1oKT0hIzY3JDckJCIvYlInPT4xJD0hIzYkIjApKik9XjR3KSk9ISM2NyQkIjBbVFxHWzEkPSEjNyQiMHJMUWVTJSkqPSEjNjckNyQkIjAnKSkqKlxsbEk9ISM3JCIwTXg9XSw3IT4hIzY3JCQiMFtUXEdbMSQ9ISM3JCIwckxRZVMlKSo9ISM2NyQ3JCQiMCcpKSoqXGxsST0hIzckIjBNeD1dLDchPiEjNjckJCIwXC4xSSZvST0hIzckIjAiSGZYQ3c1PiEjNjckNyQkIjAoKlJSI1JwST0hIzckIi9kY18/azg+ISM1NyQkIjBcLjFJJm9JPSEjNyQiMCJIZlhDdzU+ISM2NyQ3JCQiMCgqUlIjUnBJPSEjNyQiL2RjXz9rOD4hIzU3JCQiMCJwSkRCc0k9ISM3JCIwQUgkeVUzQj4hIzY3JDckJCIwJW9qMTh0ST0hIzckIjAxYUtnIzNFPiEjNjckJCIwInBKREJzST0hIzckIjBBSCR5VTNCPiEjNjckNyQkIjAlb2oxOHRJPSEjNyQiMDFhS2cjM0U+ISM2NyQkIjBidSVmJGYyJD0hIzckIjAyJHkhMzFhJD4hIzY3JDckJCIwd2chKnBvMiQ9ISM3JCIwVVVSOkImUT4hIzY3JCQiMGJ1JWYkZjIkPSEjNyQiMDIkeSEzMWEkPiEjNjckNyQkIjB3ZyEqcG8yJD0hIzckIjBVVVI6QiZRPiEjNjckJCIvJFFJUyd6ST0hIzYkIjByd0kmeXNaPiEjNjckNyQkIjBiYz01MTMkPSEjNyQiMHpJWXFqNCY+ISM2NyQkIi8kUUlTJ3pJPSEjNiQiMHJ3SSZ5c1o+ISM2NyQ3JCQiMGJjPTUxMyQ9ISM3JCIweklZcWo0Jj4hIzY3JCQiMHZCZFhMMyQ9ISM3JCIwLUFoZlwrJz4hIzY3JDckJCIwdy9NXlYzJD0hIzckIjA6PmBEL00nPiEjNjckJCIwdkJkWEwzJD0hIzckIjAtQWhmXCsnPiEjNjckNyQkIjB3L01eVjMkPSEjNyQiMDo+YEQvTSc+ISM2NyQkIjAlSCJ5XnEzJD0hIzckIjB1OSE0OFBzPiEjNjckNyQkIjAiZStONCkzJD0hIzckIjBeMmchWyVlKD4hIzY3JCQiMCVIInlecTMkPSEjNyQiMHU5ITQ4UHM+ISM2NyQ3JCQiMCJlK040KTMkPSEjNyQiMF4yZyFbJWUoPiEjNjckJCIwJCpSJyplMjQkPSEjNyQiMGwkbyEqSHAlKT4hIzY3JDckJCIwXmVtTz00JD0hIzckIjAoZXBjYEcpKT4hIzY3JCQiMCQqUicqZTI0JD0hIzckIjBsJG8hKkhwJSk+ISM2NyQ3JCQiMF5lbU89NCQ9ISM3JCIwKGVwY2BHKSk+ISM2NyQkIjAwKkhxWSU0JD0hIzckIjB2S1NrOXEqPiEjNjckNyQkIjBKZ3EhZSY0JD0hIzckIjBCJVEyZnMrPyEjNjckJCIwMCpIcVklNCQ9ISM3JCIwdktTazlxKj4hIzY3JDckJCIwSmdxIWUmNCQ9ISM3JCIwQiVRMmZzKz8hIzY3JCQiLzlLZzwpNCQ9ISM2JCIwOmZ0RU8kND8hIzY3JDckJCIwWzZ2RCQqNCQ9ISM3JCIwZnMhZWs7OD8hIzY3JCQiLzlLZzwpNCQ9ISM2JCIwOmZ0RU8kND8hIzY3JDckJCIwWzZ2RCQqNCQ9ISM3JCIwZnMhZWs7OD8hIzY3JCQiMEIpPmYpPTUkPSEjNyQiMDElSGl5bEA/ISM2NyQ3JCQiMGlFcnJJNSQ9ISM3JCIwJjR3M3FnRD8hIzY3JCQiMEIpPmYpPTUkPSEjNyQiMDElSGl5bEA/ISM2NyQ3JCQiMGlFcnJJNSQ9ISM3JCIwJjR3M3FnRD8hIzY3JCQiMDIrKG9mMEo9ISM3JCIwUWdKVXpSLiMhIzY3JDckJCIwYCZvKD1vNSQ9ISM3JCIwSlwlZnYvUT8hIzY3JCQiMDIrKG9mMEo9ISM3JCIwUWdKVXpSLiMhIzY3JDckJCIwYCZvKD1vNSQ9ISM3JCIwSlwlZnYvUT8hIzY3JCQiMG9CaTMkNEo9ISM3JCIvYEllNElZPyEjNTckNyQkIi8sOG1jNUo9ISM2JCIwblAsNilbXT8hIzY3JCQiMG9CaTMkNEo9ISM3JCIvYEllNElZPyEjNTckNyQkIi8sOG1jNUo9ISM2JCIwblAsNilbXT8hIzY3JCQiMHhCUkBJNiQ9ISM3JCIwJCk+M1lBJ2U/ISM2NyQ3JCQiMCg0XGJKOUo9ISM3JCIwLkUzbUdIMSMhIzY3JCQiMHhCUkBJNiQ9ISM3JCIwJCk+M1lBJ2U/ISM2NyQ3JCQiMCg0XGJKOUo9ISM3JCIwLkUzbUdIMSMhIzY3JCQiMCdIX110O0o9ISM3JCIwIikqek1SJTQyIyEjNjckNyQkIjBjaFNsIT1KPSEjNyQiMFI5OkBwYDIjISM2NyQkIjAnSF9ddDtKPSEjNyQiMCIpKnpNUiU0MiMhIzY3JDckJCIwY2hTbCE9Sj0hIzckIjBSOTpAcGAyIyEjNjckJCIudm9cLzckPSEjNSQiMHgydlBsSzMjISM2NyQ3JCQiMCgpPkE7PTckPSEjNyQiMHYtQXc0eTMjISM2NyQkIi52b1wvNyQ9ISM1JCIweDJ2UGxLMyMhIzY3JDckJCIwKCk+QTs9NyQ9ISM3JCIwdi1BdzR5MyMhIzY3JCQiMDkhcF47Q0o9ISM3JCIwPnpJeidlJjQjISM2NyQ3JCQiMCYzaHpjREo9ISM3JCIwNiIqR0pdLTUjISM2NyQkIjA5IXBeO0NKPSEjNyQiMD56SXonZSY0IyEjNjckNyQkIjAmM2h6Y0RKPSEjNyQiMDYiKkdKXS01IyEjNjckJCIwd2JpIil5NyQ9ISM3JCIwOidReCIzejUjISM2NyQ3JCQiMDppbD8kSEo9ISM3JCIwWnpOJzNwN0AhIzY3JCQiMHdiaSIpeTckPSEjNyQiMDonUXgiM3o1IyEjNjckNyQkIjA6aWw/JEhKPSEjNyQiMFp6TiczcDdAISM2NyQkIjBDI0cqKWZKSj0hIzckIi9RY00mSC03IyEjNTckNyQkIjBlJ0dWMkxKPSEjNyQiMCR5RTk5OERAISM2NyQkIjBDI0cqKWZKSj0hIzckIi9RY00mSC03IyEjNTckNyQkIjBlJ0dWMkxKPSEjNyQiMCR5RTk5OERAISM2NyQkIjAlb2RzSk5KPSEjNyQiMEM8KWUzYktAISM2NyQ3JCQiMDNwJipHbzgkPSEjNyQiMD5jXCc+ZFBAISM2NyQkIjAlb2RzSk5KPSEjNyQiMEM8KWUzYktAISM2NyQ3JCQiMDNwJipHbzgkPSEjNyQiMD5jXCc+ZFBAISM2NyQkIjBtNV5PIVJKPSEjNyQiMGBYTTpzWzkjISM2NyQ3JCQiMHVxYCVlU0o9ISM3JCIwYldjXjcrOiMhIzY3JCQiMG01Xk8hUko9ISM3JCIwYFhNOnNbOSMhIzY3JDckJCIwdXFgJWVTSj0hIzckIjBiV2NeNys6IyEjNjckJCIwIz41bXZVSj0hIzckIjBaYjRVJD5kQCEjNjckNyQkIjBVaS9UVjkkPSEjNyQiMCJITG1JWGlAISM2NyQkIjAjPjVtdlVKPSEjNyQiMFpiNFUkPmRAISM2NyQ3JCQiMFVpL1RWOSQ9ISM3JCIwIkhMbUlYaUAhIzY3JCQiMF4xaHhrOSQ9ISM3JCIwaGsmZllecEAhIzY3JDckJCIwIjMpWyk0W0o9ISM3JCIwRkBxaCQqWzwjISM2NyQkIjBeMWh4azkkPSEjNyQiMGhrJmZZXnBAISM2NyQ3JCQiMCIzKVspNFtKPSEjNyQiMEZAcWgkKls8IyEjNjckJCIwKnpmJyo+XUo9ISM3JCIwLFtYJ2UkPT0jISM2NyQ3JCQiMC4uLGQ9OiQ9ISM3JCIwajR4O010PSMhIzY3JCQiMCp6ZicqPl1KPSEjNyQiMCxbWCdlJD09IyEjNjckNyQkIjAuLixkPTokPSEjNyQiMGo0eDtNdD0jISM2NyQkIi8oPWFBUjokPSEjNiQiMDxDRy9kVD4jISM2NyQ3JCQiMEx1TDtjOiQ9ISM3JCIwKnpSPVp4Kj4jISM2NyQkIi8oPWFBUjokPSEjNiQiMDxDRy9kVD4jISM2NyQ3JCQiMEx1TDtjOiQ9ISM3JCIwKnpSPVp4Kj4jISM2NyQkIjAoKUhUWXc6JD0hIzckIjAuKFEqPXlrPyMhIzY3JDckJCIwVDtvdyRmSj0hIzckIjBOJzNwX0A3QSEjNjckJCIwKClIVFl3OiQ9ISM3JCIwLihRKj15az8jISM2NyQ3JCQiMFQ7b3ckZko9ISM3JCIwTiczcF9AN0EhIzY3JCQiL0dINlBoSj0hIzYkIjB1XCkzJCp6PUEhIzY3JDckJCIwJGZnejhqSj0hIzckIjBydSg+ZWxDQSEjNjckJCIvR0g2UGhKPSEjNiQiMHVcKTMkKno9QSEjNjckNyQkIjAkZmd6OGpKPSEjNyQiMHJ1KD5lbENBISM2NyQkIjA0RHYnNGxKPSEjNyQiMCo+QipSPzZCIyEjNjckNyQkIi8nejwrcDskPSEjNiQiMDJqL1AnNFBBISM2NyQkIjA0RHYnNGxKPSEjNyQiMCo+QipSPzZCIyEjNjckNyQkIi8nejwrcDskPSEjNiQiMDJqL1AnNFBBISM2NyQkIjBhPk5CKW9KPSEjNyQiME03JGU5V1ZBISM2NyQ3JCQiMEBKU2oxPCQ9ISM3JCIwV142I3BgXEEhIzY3JCQiMGE+TkIpb0o9ISM3JCIwTTckZTlXVkEhIzY3JDckJCIwQEpTajE8JD0hIzckIjBXXjYjcGBcQSEjNjckJCIwW0knM2JzSj0hIzckIjA0aCIpW2lkRCMhIzY3JDckJCIvJGZdRlc8JD0hIzYkIi8pUj1aeD5FIyEjNTckJCIwW0knM2JzSj0hIzckIjA0aCIpW2lkRCMhIzY3JDckJCIvJGZdRlc8JD0hIzYkIi8pUj1aeD5FIyEjNTckJCIwQ3FHemk8JD0hIzckIjB1USgpWyQzb0EhIzY3JDckJCIvWVxEPnlKPSEjNiQiMDtHRC09V0YjISM2NyQkIjBDcUd6aTwkPSEjNyQiMHVRKClbJDNvQSEjNjckNyQkIi9ZXEQ+eUo9ISM2JCIwO0dELT1XRiMhIzY3JCQiMGIraTMrPSQ9ISM3JCIwKHo7Z1dTIUcjISM2NyQ3JCQiMEJ6ZmU+PSQ9ISM3JCIwXztLZGVvRyMhIzY3JCQiMGIraTMrPSQ9ISM3JCIwKHo7Z1dTIUcjISM2NyQ3JCQiMEJ6ZmU+PSQ9ISM3JCIwXztLZGVvRyMhIzY3JCQiMDFcISlRUD0kPSEjNyQiMCwlRy9hcyNIIyEjNjckNyQkIjAxKkhicyY9JD0hIzckIjApWyFSNypIKkgjISM2NyQkIjAxXCEpUVA9JD0hIzckIjAsJUcvYXMjSCMhIzY3JDckJCIwMSpIYnMmPSQ9ISM3JCIwKVshUjcqSCpIIyEjNjckJCIwW3QtcXU9JD0hIzckIjBCSV5KWV1JIyEjNjckNyQkIi4vWSRcKj0kPSEjNSQiMEMkZnUnUjxKIyEjNjckJCIwW3QtcXU9JD0hIzckIjBCSV5KWV1JIyEjNjckNyQkIi4vWSRcKj0kPSEjNSQiMEMkZnUnUjxKIyEjNjckJCIwUmw0LTc+JD0hIzckIi9lIykpPm50SiMhIzU3JDckJCIwbXRMaUs+JD0hIzckIi87R0QtPUNCISM1NyQkIjBSbDQtNz4kPSEjNyQiL2UjKSk+bnRKIyEjNTckNyQkIjBtdExpSz4kPSEjNyQiLztHRC09Q0IhIzU3JCQiMEFUM05cPiQ9ISM3JCIwZnRJMClvSEIhIzY3JDckJCIwTjg0S3E+JD0hIzckIjAnKnBmeD9tTCMhIzY3JCQiMEFUM05cPiQ9ISM3JCIwZnRJMClvSEIhIzY3JDckJCIwTjg0S3E+JD0hIzckIjAnKnBmeD9tTCMhIzY3JCQiMHVrKCpvJyk+JD0hIzckIi8vSnkpMz9NIyEjNTckNyQkIjApPl9HITM/JD0hIzckIjBLZW1LaCFcQiEjNjckJCIwdWsoKm8nKT4kPSEjNyQiLy9KeSkzP00jISM1NyQ3JCQiMCk+X0chMz8kPSEjNyQiMEtlbUtoIVxCISM2NyQkIjBuJSp5LkM/JD0hIzckIjBKRlNuSFZOIyEjNjckNyQkIjA8YmN1WD8kPSEjNyQiMG9ZdCg9XWhCISM2NyQkIjBuJSp5LkM/JD0hIzckIjBKRlNuSFZOIyEjNjckNyQkIjA8YmN1WD8kPSEjNyQiMG9ZdCg9XWhCISM2NyQkIi8pKnomUmg/JD0hIzYkIjBgKyVRL2xtQiEjNjckNyQkIjApNDZzTTNLPSEjNyQiMC9OIUdDJVJQIyEjNjckJCIvKSp6JlJoPyQ9ISM2JCIwYCslUS9sbUIhIzY3JDckJCIwKTQ2c00zSz0hIzckIjAvTiFHQyVSUCMhIzY3JCQiMGsiPmkoKTRLPSEjNyQiLzpjdjYoKnlCISM1NyQ3JCQiMGFLdD9AQCQ9ISM3JCIvTXN5SFEnUSMhIzU3JCQiMGsiPmkoKTRLPSEjNyQiLzpjdjYoKnlCISM1NyQ3JCQiMGFLdD9AQCQ9ISM3JCIvTXN5SFEnUSMhIzU3JCQiMDlwcThPQCQ9ISM3JCIwaThiKT1IIlIjISM2NyQ3JCQiMEw4QCYqZUAkPSEjNyQiMHc2JUhOIykpUiMhIzY3JCQiMDlwcThPQCQ9ISM3JCIwaThiKT1IIlIjISM2NyQ3JCQiMEw4QCYqZUAkPSEjNyQiMHc2JUhOIykpUiMhIzY3JCQiLyU9PF90QCQ9ISM2JCIwMUxUYzdPUyMhIzY3JDckJCIwaHZocSc+Sz0hIzckIjA3KywzazdUIyEjNjckJCIvJT08X3RAJD0hIzYkIjAxTFRjN09TIyEjNjckNyQkIjBodmhxJz5LPSEjNyQiMDcrLDNrN1QjISM2NyQkIjA9TWAiNEBLPSEjNyQiMCI9KzlLJGZUIyEjNjckNyQkIjAzKy5aTUEkPSEjNyQiMFspeUlZcUJDISM2NyQkIjA9TWAiNEBLPSEjNyQiMCI9KzlLJGZUIyEjNjckNyQkIjAzKy5aTUEkPSEjNyQiMFspeUlZcUJDISM2NyQkIjAqUUE9JFtBJD0hIzckIjA3TVQkUURHQyEjNjckNyQkIjBQPVNDc0EkPSEjNyQiMCVvWiI9WGhWIyEjNjckJCIwKlFBPSRbQSQ9ISM3JCIwN01UJFFER0MhIzY3JDckJCIwUD1TQ3NBJD0hIzckIjAlb1oiPVhoViMhIzY3JCQiMGhCL3QmR0s9ISM3JCIwTTlXVXUwVyMhIzY3JDckJCIwTkFsLTVCJD0hIzckIi9fO0tkZVtDISM1NyQkIjBoQi90JkdLPSEjNyQiME05V1V1MFcjISM2NyQ3JCQiME5BbC01QiQ9ISM3JCIvXztLZGVbQyEjNTckJCIwL3U6OkJCJD0hIzckIjBjJSpmKVwqR1gjISM2NyQ3JCQiMCdHRD15TUs9ISM3JCIwY2BHR0U1WSMhIzY3JCQiMC91OjpCQiQ9ISM3JCIwYyUqZilcKkdYIyEjNjckNyQkIjAnR0Q9eU1LPSEjNyQiMGNgR0dFNVkjISM2NyQkIjBaLjdlZ0IkPSEjNyQiMEQoUT9iQGxDISM2NyQ3JCQiLz5oPmNRSz0hIzYkIjAjPmFMb1l0QyEjNjckJCIwWi43ZWdCJD0hIzckIjBEKFE/YkBsQyEjNjckNyQkIi8+aD5jUUs9ISM2JCIwIz5hTG9ZdEMhIzY3JCQiMHp3LC0pUks9ISM3JCIwQz5bLU92WiMhIzY3JDckJCIwW2AoSE1VSz0hIzckIjBHSVVRMmZbIyEjNjckJCIwencsLSlSSz0hIzckIjBDPlstT3ZaIyEjNjckNyQkIjBbYChITVVLPSEjNyQiMEdJVVEyZlsjISM2NyQkIjBDZyFvYVZLPSEjNyQiMEgibytsJikqWyMhIzY3JDckJCIwKmUoKlw3WUs9ISM3JCIwaz1cJHpNKVwjISM2NyQkIjBDZyFvYVZLPSEjNyQiMEgibytsJikqWyMhIzY3JDckJCIwKmUoKlw3WUs9ISM3JCIwaz1cJHpNKVwjISM2NyQkIjA4NWAjSFpLPSEjNyQiMEw1bCVwPC1EISM2NyQ3JCQiMHN5KnkhKlxLPSEjNyQiLjJjWyl5NUQhIio3JCQiMDg1YCNIWks9ISM3JCIwTDVsJXA8LUQhIzY3JDckJCIwc3kqeSEqXEs9ISM3JCIuMmNbKXk1RCEiKjckJCIwM1Y5UjVEJD0hIzckIjBGY1FPKFw5RCEjNjckNyQkIjA6ZyE9cGBLPSEjNyQiME8mSE8hSEtfIyEjNjckJCIwM1Y5UjVEJD0hIzckIjBGY1FPKFw5RCEjNjckNyQkIjA6ZyE9cGBLPSEjNyQiME8mSE8hSEtfIyEjNjckJCIwLmxwJ3lhSz0hIzckIjAkbzReeCJvXyMhIzY3JDckJCIwKCk+Znd1RCQ9ISM3JCIwcyQpcGVwY2AjISM2NyQkIjAubHAneWFLPSEjNyQiMCRvNF54Im9fIyEjNjckNyQkIjAoKT5md3VEJD0hIzckIjBzJClwZXBjYCMhIzY3JCQiMEIlKTROJmVLPSEjNyQiME4iNDYiUSJSRCEjNjckNyQkIjAmb2JBRWhLPSEjNyQiMDRzdzg1IltEISM2NyQkIjBCJSk0TiZlSz0hIzckIjBOIjQ2IlEiUkQhIzY3JDckJCIwJm9iQUVoSz0hIzckIjA0c3c4NSJbRCEjNjckJCIwImYlUSVHaUs9ISM3JCIwI0h0VSVlOWIjISM2NyQ3JCQiMDpwIypbXUUkPSEjNyQiMFhnJClvXTBjIyEjNjckJCIwImYlUSVHaUs9ISM3JCIwI0h0VSVlOWIjISM2NyQ3JCQiMDpwIypbXUUkPSEjNyQiMFhnJClvXTBjIyEjNjckJCIvMDhZLm1LPSEjNiQiME9nVHV5UGMjISM2NyQ3JCQiMCJ6c2wkKW9LPSEjNyQiMCIpWyFSNypIZCMhIzY3JCQiLzA4WS5tSz0hIzYkIjBPZ1R1eVBjIyEjNjckNyQkIjAienNsJClvSz0hIzckIjAiKVshUjcqSGQjISM2NyQkIjA7dXkmeXBLPSEjNyQiMHlkXywqNHdEISM2NyQ3JCQiMDctK0RFRiQ9ISM3JCIwPFAoKnlKYWUjISM2NyQkIjA7dXkmeXBLPSEjNyQiMHlkXywqNHdEISM2NyQ3JCQiMDctK0RFRiQ9ISM3JCIwPFAoKnlKYWUjISM2NyQkIjAtbnVQTkYkPSEjNyQiMDQoPWgjPiUpZSMhIzY3JDckJCIwKVxNWFR3Sz0hIzckIjBgRC9Nc3lmIyEjNjckJCIwLW51UE5GJD0hIzckIjA0KD1oIz4lKWUjISM2NyQ3JCQiMClcTVhUd0s9ISM3JCIwYEQvTXN5ZiMhIzY3JCQiL21dMkh4Sz0hIzYkIi8mPk9aUjJnIyEjNTckNyQkIjAoZVpbPyFHJD0hIzckIjAqUTYiKkdKNUUhIzY3JCQiL21dMkh4Sz0hIzYkIi8mPk9aUjJnIyEjNTckNyQkIjAoZVpbPyFHJD0hIzckIjAqUTYiKkdKNUUhIzY3JCQiMFtWYFc1RyQ9ISM3JCIwRV01bWZJaCMhIzY3JDckJCIwY3c7JypSRyQ9ISM3JCIwRC09V2BGaSMhIzY3JCQiMFtWYFc1RyQ9ISM3JCIwRV01bWZJaCMhIzY3JDckJCIwY3c7JypSRyQ9ISM3JCIwRC09V2BGaSMhIzY3JCQiMEcpUSMqeiVHJD0hIzckIjBEYyo9KXpgaSMhIzY3JDckJCIwXzxXKXkoRyQ9ISM3JCIwaCFcIypSPk5FISM2NyQkIjBHKVEjKnolRyQ9ISM3JCIwRGMqPSl6YGkjISM2NyQ3JCQiMF88Vyl5KEckPSEjNyQiMGghXCMqUj5ORSEjNjckJCIwc0sjXGIpRyQ9ISM3JCIwPlNhJSoqcFBFISM2NyQ3JCQiMEsjPTplIkgkPSEjNyQiMCgqeUphTXdrIyEjNjckJCIwc0sjXGIpRyQ9ISM3JCIwPlNhJSoqcFBFISM2NyQ3JCQiMEsjPTplIkgkPSEjNyQiMCgqeUphTXdrIyEjNjckJCIwaCd6OEojSCQ9ISM3JCIwMnNyLz8rbCMhIzY3JDckJCIwajhndmBIJD0hIzckIjBMblE0dittIyEjNjckJCIwaCd6OEojSCQ9ISM3JCIwMnNyLz8rbCMhIzY3JDckJCIwajhndmBIJD0hIzckIjBMblE0dittIyEjNjckJCIwelJ3b2dIJD0hIzckIjBPXSI+LE1pRSEjNjckNyQkIjA+ZWtxIipIJD0hIzckIjBwYlhrOkRuIyEjNjckJCIwelJ3b2dIJD0hIzckIjBPXSI+LE1pRSEjNjckNyQkIjA+ZWtxIipIJD0hIzckIjBwYlhrOkRuIyEjNjckJCIwQHo3RikqSCQ9ISM3JCIwWzwoZixtdUUhIzY3JDckJCIwZUtmbUhJJD0hIzckIjAwV18+Y1xvIyEjNjckJCIwQHo3RikqSCQ9ISM3JCIwWzwoZixtdUUhIzY3JDckJCIwZUtmbUhJJD0hIzckIjAwV18+Y1xvIyEjNjckJCIwdUZNJ2UuTD0hIzckIjBlK0k8ISlwbyMhIzY3JDckJCIwLSg+TXcxTD0hIzckIjBUS2Z1J1IocCMhIzY3JCQiMHVGTSdlLkw9ISM3JCIwZStJPCEpcG8jISM2NyQ3JCQiMC0oPk13MUw9ISM3JCIwVEtmdSdSKHAjISM2NyQkIjAxIkdrTTJMPSEjNyQiMDpzJGUsSSpwIyEjNjckNyQkIjBVUTloMEokPSEjNyQiMHg/bUhQKTRGISM2NyQkIjAxIkdrTTJMPSEjNyQiMDpzJGUsSSpwIyEjNjckNyQkIjBVUTloMEokPSEjNyQiMHg/bUhQKTRGISM2NyQkIjBZO08yNkokPSEjNyQiME9ZbDY/O3IjISM2NyQ3JCQiMGxsJilmVkokPSEjNyQiMDg0dCV5RkFGISM2NyQkIjBZO08yNkokPSEjNyQiME9ZbDY/O3IjISM2NyQ3JCQiMGxsJilmVkokPSEjNyQiMDg0dCV5RkFGISM2NyQkIjApb2EjcFtKJD0hIzckIjBoYVIvU1JzIyEjNjckNyQkIjAiKXpXZiI9TD0hIzckIjBcKCp6Uj1adCMhIzY3JCQiMClvYSNwW0okPSEjNyQiMGhhUi9TUnMjISM2NyQ3JCQiMCIpeldmIj1MPSEjNyQiMFwoKnpSPVp0IyEjNjckJCIwNyMpKj5qPUw9ISM3JCIwYCM0VypmaXQjISM2NyQ3JCQiMFtHLmc+SyQ9ISM3JCIwJmVvWyplcnUjISM2NyQkIjA3IykqPmo9TD0hIzckIjBgIzRXKmZpdCMhIzY3JDckJCIwW0cuZz5LJD0hIzckIjAmZW9bKmVydSMhIzY3JCQiLTFkUkFMPSEiKiQiMCQ9SjgpeiZbRiEjNjckNyQkIjBVKClcaGRLJD0hIzckIjBAdSQqXCpmZkYhIzY3JCQiLTFkUkFMPSEiKiQiMCQ9SjgpeiZbRiEjNjckNyQkIjBVKClcaGRLJD0hIzckIjBAdSQqXCpmZkYhIzY3JCQiMCUpKnotO0VMPSEjNyQiMCZwdmEnKiozdyMhIzY3JDckJCIwJCp6JlFjSEw9ISM3JCIwZGkrMFM/eCMhIzY3JCQiMCUpKnotO0VMPSEjNyQiMCZwdmEnKiozdyMhIzY3JDckJCIwJCp6JlFjSEw9ISM3JCIwZGkrMFM/eCMhIzY3JCQiLzgvZCMqSEw9ISM2JCIwMlUqbyU+S3gjISM2NyQ3JCQiMERiNG5MTCQ9ISM3JCIwJDR2KzFbJXkjISM2NyQkIi84L2QjKkhMPSEjNiQiMDJVKm8lPkt4IyEjNjckNyQkIjBEYjRuTEwkPSEjNyQiMCQ0disxWyV5IyEjNjckJCIwSyR5PnBMTD0hIzckIjBgcWVEUmJ5IyEjNjckNyQkIjBwNkxyckwkPSEjNyQiMEhSOTpAcHojISM2NyQkIjBLJHk+cExMPSEjNyQiMGBxZURSYnkjISM2NyQ3JCQiMHA2THJyTCQ9ISM3JCIwSFI5OkBweiMhIzY3JCQiME01QmZ1TCQ9ISM3JCIwKFFVNiFmeXojISM2NyQ3JCQiMFJnWHc0TSQ9ISM3JCIwbEZAcWgkNEchIzY3JCQiME01QmZ1TCQ9ISM3JCIwKFFVNiFmeXojISM2NyQ3JCQiMFJnWHc0TSQ9ISM3JCIwbEZAcWgkNEchIzY3JCQiMHVOTEY3TSQ9ISM3JCIwYUYoUih5LCJHISM2NyQ3JCQiLykpZUN5V0w9ISM2JCIwLDtHRC09I0chIzY3JCQiMHVOTEY3TSQ9ISM3JCIwYUYoUih5LCJHISM2NyQ3JCQiLykpZUN5V0w9ISM2JCIwLDtHRC09I0chIzY3JCQiMGQneWkqXE0kPSEjNyQiMF46NVcpXEFHISM2NyQ3JCQiMGxzWCplW0w9ISM3JCIwUC9OIUdDTUchIzY3JCQiMGQneWkqXE0kPSEjNyQiMF46NVcpXEFHISM2NyQ3JCQiMGxzWCplW0w9ISM3JCIwUC9OIUdDTUchIzY3JCQiMFYuQG0oW0w9ISM3JCIvJm8xNj1bJEchIzU3JDckJCIwIzNbdFJfTD0hIzckIjB1Iz5hTG9ZRyEjNjckJCIwVi5AbShbTD0hIzckIi8mbzE2PVskRyEjNTckNyQkIjAjM1t0Ul9MPSEjNyQiMHUjPmFMb1lHISM2NyQkIjBfbylwYF9MPSEjNyQiMG9LS3ZQciVHISM2NyQ3JCQiMFdJNjFpTiQ9ISM3JCIvNilbIVI3ZkchIzU3JCQiMF9vKXBgX0w9ISM3JCIwb0tLdlByJUchIzY3JDckJCIwV0k2MWlOJD0hIzckIi82KVshUjdmRyEjNTckJCIwdF9oM2pOJD0hIzckIjByIVtvdFhmRyEjNjckNyQkIjA7ImVkLGdMPSEjNyQiMFlwYlhrOihHISM2NyQkIjB0X2gzak4kPSEjNyQiMHIhW290WGZHISM2NyQ3JCQiMDsiZWQsZ0w9ISM3JCIwWXBiWGs6KEchIzY3JCQiMClwKDQiM2dMPSEjNyQiMF5YaiZweHJHISM2NyQ3JCQiMHRIVEVRTyQ9ISM3JCIwI3lEMV0rJSlHISM2NyQkIjApcCg0IjNnTD0hIzckIjBeWGomcHhyRyEjNjckNyQkIjB0SFRFUU8kPSEjNyQiMCN5RDFdKyUpRyEjNjckJCIwJCpvYmFRTyQ9ISM3JCIwayEqR14nNCUpRyEjNjckNyQkIjAjWyZRM25PJD0hIzckIjBDQD5YNk0qRyEjNjckJCIwJCpvYmFRTyQ9ISM3JCIwayEqR14nNCUpRyEjNjckNyQkIjAjWyZRM25PJD0hIzckIjA4IjMmPnVeeSIhIzc3JCQiMFciKikzTV1OPSEjNyQiMDgiMyY+dV55IiEjNzckNyQkIjA0bk8kcGFQPSEjNyQiMFhVJSpmTkl4IiEjNzckJCIwVyIqKTNNXU49ISM3JCIwOCIzJj51XnkiISM3NyQ3JCQiMCNbJlEzbk8kPSEjNyQiMENAPlg2TSpHISM2NyQkIjBHJ3kkSHdPJD0hIzckIjBmWWQtO2sqRyEjNjckNyQkIjBwY1JRd08kPSEjNyQiMD1ZcGJYaypHISM2NyQkIjBHJ3kkSHdPJD0hIzckIjBmWWQtO2sqRyEjNjckNyQkIjBwY1JRd08kPSEjNyQiMD1ZcGJYaypHISM2NyQkIjBWamoxOVAkPSEjNyQiMC4lXGdhdDNIISM2NyQ3JCQiMCRvWEVYckw9ISM3JCIwYU13NScpKTNIISM2NyQkIjBWamoxOVAkPSEjNyQiMC4lXGdhdDNIISM2NyQ3JCQiMCRvWEVYckw9ISM3JCIwYU13NScpKTNIISM2NyQkIjAmcG9bPXZMPSEjNyQiMEEhKlInWzBASCEjNjckNyQkIjBhSCF6RXZMPSEjNyQiL0hLZW1LQEghIzU3JCQiMCZwb1s9dkw9ISM3JCIwQSEqUidbMEBIISM2NyQ3JCQiMGFIIXpFdkw9ISM3JCIvSEtlbUtASCEjNTckJCIwdXIjUScqeUw9ISM3JCIwWy5VQ3VMJEghIzY3JDckJCIwMmciUjN6TD0hIzckIjBFNiE0c3dMSCEjNjckJCIwdXIjUScqeUw9ISM3JCIwWy5VQ3VMJEghIzY3JDckJCIwMmciUjN6TD0hIzckIjBFNiE0c3dMSCEjNjckJCIvcGxQdSNRJD0hIzYkIjBMIypIZiRwWEghIzY3JDckJCIwei4kNCFIUSQ9ISM3JCIwaSpwZng/WUghIzY3JCQiL3BsUHUjUSQ9ISM2JCIwTCMqSGYkcFhIISM2NyQ3JCQiMHouJDQhSFEkPSEjNyQiMGkqcGZ4P1lIISM2NyQkIjAzIVxYXydRJD0hIzckIjAsJHA5SCxlSCEjNjckNyQkIjBtJkcpPW5RJD0hIzckIjApelE1JFsnZUghIzY3JCQiMDMhXFhfJ1EkPSEjNyQiMCwkcDlILGVIISM2NyQ3JCQiMG0mRyk9blEkPSEjNyQiMCl6UTUkWydlSCEjNjckJCIvajRqSSFSJD0hIzYkIjAqbzAwQUxxSCEjNjckNyQkIjBNaHRQMFIkPSEjNyQiME13NScpKTNySCEjNjckJCIvajRqSSFSJD0hIzYkIjAqbzAwQUxxSCEjNjckNyQkIjBNaHRQMFIkPSEjNyQiME13NScpKTNySCEjNjckJCIuJjMpKTMlUiQ9ISM1JCIwQlw8Wl5FKUghIzY3JDckJCIwbUxSZFZSJD0hIzckIi9adzYlSE4pSCEjNTckJCIuJjMpKTMlUiQ9ISM1JCIwQlw8Wl5FKUghIzY3JDckJCIwbUxSZFZSJD0hIzckIi9adzYlSE4pSCEjNTckJCIvIylvQSh5UiQ9ISM2JCIwOTh3cXFcKkghIzY3JDckJCIveGYheSIpUiQ9ISM2JCIwMWBDJypwZipIISM2NyQkIi8jKW9BKHlSJD0hIzYkIjA5OHdxcVwqSCEjNjckNyQkIi94ZiF5IilSJD0hIzYkIjAxYEMnKnBmKkghIzY3JCQiMGIiKmVjO1MkPSEjNyQiMDMsZiIqKkcySSEjNjckNyQkIi9XMCcqKj5TJD0hIzYkIjBVVEpeNSUzSSEjNjckJCIwYiIqZWM7UyQ9ISM3JCIwMyxmIioqRzJJISM2NyQ3JCQiL1cwJyoqPlMkPSEjNiQiMFVUSl41JTNJISM2NyQkIjBKLndUYVMkPSEjNyQiMEAycDQ0Jz5JISM2NyQ3JCQiMHctLkFlUyQ9ISM3JCIweUhRMV4zLSQhIzY3JCQiMEoud1RhUyQ9ISM3JCIwQDJwNDQnPkkhIzY3JDckJCIwdy0uQWVTJD0hIzckIjB5SFExXjMtJCEjNjckJCIwWEF5RiM0TT0hIzckIjAlW2pdI0c+LiQhIzY3JDckJCIwVCZbYGs0TT0hIzckIjA5PVhoIkhMSSEjNjckJCIwWEF5RiM0TT0hIzckIjAlW2pdI0c+LiQhIzY3JDckJCIwVCZbYGs0TT0hIzckIjA5PVhoIkhMSSEjNjckJCIwM0x5OUlUJD0hIzckIjBibUhQWlUvJCEjNjckNyQkIjBEb2twTVQkPSEjNyQiL2w/bEB0WEkhIzU3JCQiMDNMeTlJVCQ9ISM3JCIwYm1IUFpVLyQhIzY3JDckJCIwRG9rcE1UJD0hIzckIi9sP2xAdFhJISM1NyQkIjAkUTFEIW9UJD0hIzckIjBHWkBabWwwJCEjNjckNyQkIjB4YXMlSDxNPSEjNyQiMCdbKmVycyJlSSEjNjckJCIwJFExRCFvVCQ9ISM3JCIwR1pAWm1sMCQhIzY3JDckJCIweGFzJUg8TT0hIzckIjAnWyplcnMiZUkhIzY3JCQiL1IzN2Y/TT0hIzYkIjAtUipSYikpb0khIzY3JDckJCIwQF8iMzdATT0hIzckIjBBJGVtS2hxSSEjNjckJCIvUjM3Zj9NPSEjNiQiMC1SKlJiKSlvSSEjNjckNyQkIjBAXyIzN0BNPSEjNyQiMEEkZW1LaHFJISM2NyQkIjA4KXoyUUNNPSEjNyQiMFBgKXpYPyIzJCEjNjckNyQkIjAvbndaXFUkPSEjNyQiMGVycyJRMCQzJCEjNjckJCIwOCl6MlFDTT0hIzckIjBQYCl6WD8iMyQhIzY3JDckJCIwL253WlxVJD0hIzckIjBlcnMiUTAkMyQhIzY3JCQiMCxPPXIiR009ISM3JCIwS3lJZkJONCQhIzY3JDckJCIwLnZodihHTT0hIzckIjAlKmZ6TyVcJjQkISM2NyQkIjAsTz1yIkdNPSEjNyQiMEt5SWZCTjQkISM2NyQ3JCQiMC52aHYoR009ISM3JCIwJSpmek8lXCY0JCEjNjckJCIwKClmY2k+ViQ9ISM3JCIwLURcZFVlNSQhIzY3JDckJCIwKSpcVi9FViQ9ISM3JCIvJFsnPVwkejUkISM1NyQkIjAoKWZjaT5WJD0hIzckIjAtRFxkVWU1JCEjNjckNyQkIjApKlxWL0VWJD0hIzckIi8kWyc9XCR6NSQhIzU3JCQiMCYpKXBZdk5NPSEjNyQiMHhPT2BoIj1KISM2NyQ3JCQiMCpbb1NWT009ISM3JCIwbU8kcGFQP0ohIzY3JCQiMCYpKXBZdk5NPSEjNyQiMHhPT2BoIj1KISM2NyQ3JCQiMCpbb1NWT009ISM3JCIwbU8kcGFQP0ohIzY3JCQiMEY+blomUk09ISM3JCIwKipcTlkhW0lKISM2NyQ3JCQiMGkyY2stVyQ9ISM3JCIwLUQrLTtHOCQhIzY3JCQiMEY+blomUk09ISM3JCIwKipcTlkhW0lKISM2NyQ3JCQiMGkyY2stVyQ9ISM3JCIwLUQrLTtHOCQhIzY3JCQiMDZsZ1RMVyQ9ISM3JCIwb2hOTyp6VUohIzY3JDckJCIwPHcuJzRXTT0hIzckIjBSODJkY185JCEjNjckJCIwNmxnVExXJD0hIzckIjBvaE5PKnpVSiEjNjckNyQkIjA8dy4nNFdNPSEjNyQiMFI4MmRjXzkkISM2NyQkIjAkeSFST3JXJD0hIzckIjBjR2pCPV46JCEjNjckNyQkIjAibz4lR3pXJD0hIzckIjB2LDk3KHBkSiEjNjckJCIwJHkhUk9yVyQ9ISM3JCIwY0dqQj1eOiQhIzY3JDckJCIwIm8+JUd6VyQ9ISM3JCIwdiw5NyhwZEohIzY3JCQiMEREMEs0WCQ9ISM3JCIweGY0M1B1OyQhIzY3JDckJCIwZkFvaDxYJD0hIzckIjA2ITRzdzhxSiEjNjckJCIwREQwSzRYJD0hIzckIjB4ZjQzUHU7JCEjNjckNyQkIjBmQW9oPFgkPSEjNyQiMDYhNHN3OHFKISM2NyQkIi9FbSZHWlgkPSEjNiQiMENzIykqZXZ6SiEjNjckNyQkIjBfXyNlZmJNPSEjNyQiMFp5RkF5RD0kISM2NyQkIi9FbSZHWlgkPSEjNiQiMENzIykqZXZ6SiEjNjckNyQkIjBfXyNlZmJNPSEjNyQiMFp5RkF5RD0kISM2NyQkIjAmKT0kZl9lTT0hIzckIjBGcCMpb3U/PiQhIzY3JDckJCIwaCZbM1ZmTT0hIzckIjAkb1l0KD1dPiQhIzY3JCQiMCYpPSRmX2VNPSEjNyQiMEZwIylvdT8+JCEjNjckNyQkIjBoJlszVmZNPSEjNyQiMCRvWXQoPV0+JCEjNjckJCIwKUhcVEtpTT0hIzckIjA3YTRYJFIvSyEjNjckNyQkIjAnM19uRWpNPSEjNyQiMD5iVEtmdT8kISM2NyQkIjApSFxUS2lNPSEjNyQiMDdhNFgkUi9LISM2NyQ3JCQiMCczX25Fak09ISM3JCIwPmJUS2Z1PyQhIzY3JCQiMChSPUs3bU09ISM3JCIwM0lqPTduQCQhIzY3JDckJCIwJUhwTjVuTT0hIzckIjBiVlsoKSoqKT5LISM2NyQkIjAoUj1LN21NPSEjNyQiMDNJaj03bkAkISM2NyQ3JCQiMCVIcE41bk09ISM3JCIwYlZbKCkqKik+SyEjNjckJCIwO3ZFQipwTT0hIzckIjA+I0chKjMuSEshIzY3JDckJCIwKDRIOCU0WiQ9ISM3JCIwIj5gRC9NS0shIzY3JCQiMDt2RUIqcE09ISM3JCIwPiNHISozLkhLISM2NyQ3JCQiMCg0SDglNFokPSEjNyQiMCI+YEQvTUtLISM2NyQkIjB1J1JTc3RNPSEjNyQiMFFdNWRcOEMkISM2NyQ3JCQiMC0pMyp6WlokPSEjNyQiMEY/aSg0eVdLISM2NyQkIjB1J1JTc3RNPSEjNyQiMFFdNWRcOEMkISM2NyQ3JCQiMC0pMyp6WlokPSEjNyQiMEY/aSg0eVdLISM2NyQkIjBQO3pEdlokPSEjNyQiMGgsL0FvT0QkISM2NyQ3JCQiMHlKWT4neU09ISM3JCIwajNwX0BzRCQhIzY3JCQiMFA7ekR2WiQ9ISM3JCIwaCwvQW9PRCQhIzY3JDckJCIweUpZPid5TT0hIzckIjBqM3BfQHNEJCEjNjckJCIwJFEvJEc4WyQ9ISM3JCIwb2VgJW8pZkUkISM2NyQ3JCQiL0YxKWZDWyQ9ISM2JCIwKnBmeD9tcEshIzY3JCQiMCRRLyRHOFskPSEjNyQiMG9lYCVvKWZFJCEjNjckNyQkIi9GMSlmQ1skPSEjNiQiMCpwZng/bXBLISM2NyQkIjBRK3dKXlskPSEjNyQiMCU9M1NhSXlLISM2NyQ3JCQiL0VANkknWyQ9ISM2JCIwTiZHR0U1I0ckISM2NyQkIjBRK3dKXlskPSEjNyQiMCU9M1NhSXlLISM2NyQ3JCQiMGg3NyxqWyQ9ISM3JCIwTiZHR0U1I0ckISM2NyQkIjBibjFPKilbJD0hIzckIjA2O3YrQzFIJCEjNjckNyQkIjBDcU5WLFwkPSEjNyQiMHJ0KnlKYSVIJCEjNjckJCIwYm4xTyopWyQ9ISM3JCIwNjt2K0MxSCQhIzY3JDckJCIwQ3FOVixcJD0hIzckIjBydCp5SmElSCQhIzY3JCQiMFZoRVRGXCQ9ISM3JCIwTEZqYVVISSQhIzY3JDckJCIvQktrKVJcJD0hIzYkIjAyaSdIUClwSSQhIzY3JCQiMFZoRVRGXCQ9ISM3JCIwTEZqYVVISSQhIzY3JDckJCIvQktrKVJcJD0hIzYkIjAyaSdIUClwSSQhIzY3JCQiMC4wPlpsXCQ9ISM3JCIwbCMqPTFoX0okISM2NyQ3JCQiMEpaTUl5XCQ9ISM3JCIwVl0uR0MlPkwhIzY3JCQiMC4wPlpsXCQ9ISM3JCIwbCMqPTFoX0okISM2NyQ3JCQiMEpaTUl5XCQ9ISM3JCIwVl0uR0MlPkwhIzY3JCQiMFRsNGEuXSQ9ISM3JCIwKTQpZmF6dkskISM2NyQ3JCQiMFs1PXY7XSQ9ISM3JCIwelE1JFsnPUwkISM2NyQkIjBUbDRhLl0kPSEjNyQiMCk0KWZhenZLJCEjNjckNyQkIjBbNT12O10kPSEjNyQiMHpRNSRbJz1MJCEjNjckJCIwaS0iPTsvTj0hIzckIi84PC8hKSopUkwhIzU3JDckJCIwdkclNF8wTj0hIzckIjA6RjxRMFZNJCEjNjckJCIwaS0iPTsvTj0hIzckIi84PC8hKSopUkwhIzU3JDckJCIwdkclNF8wTj0hIzckIjA6RjxRMFZNJCEjNjckJCIwejdVcXpdJD0hIzckIjBHIWZMa0BfTCEjNjckNyQkIjAkSCdlbiQ0Tj0hIzckIjBeOkMkZnVjTCEjNjckJCIwejdVcXpdJD0hIzckIjBHIWZMa0BfTCEjNjckNyQkIjAkSCdlbiQ0Tj0hIzckIjBeOkMkZnVjTCEjNjckJCIwaV8pKXo8XiQ9ISM3JCIwSmZjJFtga0whIzY3JDckJCIwLTc2OkteJD0hIzckIjAoUTUkWyc9cEwhIzY3JCQiMGlfKSl6PF4kPSEjNyQiMEpmYyRbYGtMISM2NyQ3JCQiMC03NjpLXiQ9ISM3JCIwKFE1JFsnPXBMISM2NyQkIi82LS1mOk49ISM2JCIwbCJRNUsmb1AkISM2NyQ3JCQiMDF2XmpxXiQ9ISM3JCIwQiN6THFpIlEkISM2NyQkIi82LS1mOk49ISM2JCIwbCJRNUsmb1AkISM2NyQ3JCQiMDF2XmpxXiQ9ISM3JCIwQiN6THFpIlEkISM2NyQkIjBAPFAsJT5OPSEjNyQiMGJneGJyIipRJCEjNjckNyQkIjAxXiFHIjRfJD0hIzckIjBmIVslZW5TUiQhIzY3JCQiMEA8UCwlPk49ISM3JCIwYmd4YnIiKlEkISM2NyQ3JCQiMDFeIUciNF8kPSEjNyQiMGYhWyVlblNSJCEjNjckJCIwJSpSUjhLXyQ9ISM3JCIwRSp6eCkqWyxNISM2NyQ3JCQiMC5SKEh3Q049ISM3JCIwJipvXjgzbFMkISM2NyQkIjAlKlJSOEtfJD0hIzckIjBFKnp4KSpbLE0hIzY3JDckJCIwLlIoSHdDTj0hIzckIjAmKm9eODNsUyQhIzY3JCQiMEUpb2ktRk49ISM3JCIwMSwwPDNRVCQhIzY3JDckJCIuUS05J0dOPSEjNSQiMEpkZW9bKj1NISM2NyQkIjBFKW9pLUZOPSEjNyQiMDEsMDwzUVQkISM2NyQ3JCQiLlEtOSdHTj0hIzUkIjBKZGVvWyo9TSEjNjckJCIwPGgqKlIzYCQ9ISM3JCIwPXBlVkVoVSQhIzY3JDckJCIwKnBhZllLTj0hIzckIjBuWGxCKlFKTSEjNjckJCIwPGgqKlIzYCQ9ISM3JCIwPXBlVkVoVSQhIzY3JDckJCIwKnBhZllLTj0hIzckIjBuWGxCKlFKTSEjNjckJCIwdUhdYVlgJD0hIzckIi80Q3dZV1FNISM1NyQ3JCQiMFlOcD1qYCQ9ISM3JCIwL01zeUhRVyQhIzY3JCQiMHVIXWFZYCQ9ISM3JCIvNEN3WVdRTSEjNTckNyQkIjBZTnA9amAkPSEjNyQiMC9Nc3lIUVckISM2NyQkIjBWaCQqcCVRTj0hIzckIjAqMyJwKUd3XU0hIzY3JDckJCIwJVJYQzxTTj0hIzckIi9DI3pMcWlYJCEjNTckJCIwVmgkKnAlUU49ISM3JCIwKjMicClHd11NISM2NyQ3JCQiMCVSWEM8U049ISM3JCIvQyN6THFpWCQhIzU3JCQiMFcmemlHVU49ISM3JCIwciVSbzUzak0hIzY3JDckJCIwKEdAcS1XTj0hIzckIjB3NScpKTNyb00hIzY3JCQiMFcmemlHVU49ISM3JCIwciVSbzUzak0hIzY3JDckJCIwKEdAcS1XTj0hIzckIjB3NScpKTNyb00hIzY3JCQiLz09TTVZTj0hIzYkIjBzelZBKlJ2TSEjNjckNyQkIjAqeXhDKXlhJD0hIzckIjA3KkhSOToiWyQhIzY3JCQiLz09TTVZTj0hIzYkIjBzelZBKlJ2TSEjNjckNyQkIjAqeXhDKXlhJD0hIzckIjA3KkhSOToiWyQhIzY3JCQiMG4oMzkjKlxOPSEjNyQiMEtaSU48eFskISM2NyQ3JCQiMDZtKClRPGIkPSEjNyQiMFsoKSoqKT5mJFwkISM2NyQkIjBuKDM5IypcTj0hIzckIjBLWklOPHhbJCEjNjckNyQkIjA2bSgpUTxiJD0hIzckIjBbKCkqKik+ZiRcJCEjNjckJCIwKmZZLXVgTj0hIzckIi8lW1hYTitdJCEjNTckNyQkIjBCKUdnZmJOPSEjNyQiMCVlblNELjFOISM2NyQkIjAqZlktdWBOPSEjNyQiLyVbWFhOK10kISM1NyQ3JCQiMEIpR2dmYk49ISM3JCIwJWVuU0QuMU4hIzY3JCQiMDdMJSpmdmIkPSEjNyQiMCMqNCZHTk43TiEjNjckNyQkIjBYIkhUWGZOPSEjNyQiL1VPIjR0JT1OISM1NyQkIjA3TCUqZnZiJD0hIzckIjAjKjQmR05ON04hIzY3JDckJCIwWCJIVFhmTj0hIzckIi9VTyI0dCU9TiEjNTckJCIwcztcIVFoTj0hIzckIjB4al5kcllfJCEjNjckNyQkIjBhYDw4TGMkPSEjNyQiMGNfP2s4NGAkISM2NyQkIjBzO1whUWhOPSEjNyQiMHhqXmRyWV8kISM2NyQ3JCQiMGFgPDhMYyQ9ISM3JCIwY18/azg0YCQhIzY3JCQiMGJYKj0/bE49ISM3JCIwdjxXZiopcGAkISM2NyQ3JCQiMHRZKEg8bk49ISM3JCIwIzR1Iz5hTGEkISM2NyQkIjBiWCo9P2xOPSEjNyQiMHY8V2YqKXBgJCEjNjckNyQkIjB0WShIPG5OPSEjNyQiMCM0dSM+YUxhJCEjNjckJCIwTCVbVC1wTj0hIzckIjAoXFEnZTIkXE4hIzY3JDckJCIweWh5TDVkJD0hIzckIjBHSE11JXpiTiEjNjckJCIwTCVbVC1wTj0hIzckIjAoXFEnZTIkXE4hIzY3JDckJCIweWh5TDVkJD0hIzckIjBHSE11JXpiTiEjNjckJCIwKm9ocyVHZCQ9ISM3JCIwcCd6XWJpaE4hIzY3JDckJCIwNDFOJipbZCQ9ISM3JCIwazxUSE4jb04hIzY3JCQiMCpvaHMlR2QkPSEjNyQiMHAnel1iaWhOISM2NyQ3JCQiMDQxTiYqW2QkPSEjNyQiMGs8VEhOI29OISM2NyQkIjA7PTtybWQkPSEjNyQiMHV4KipbVlJkJCEjNjckNyQkIjBfdXpkKHlOPSEjNyQiLjFbJWVuIWUkISIqNyQkIjA7PTtybWQkPSEjNyQiMHV4KipbVlJkJCEjNjckNyQkIjBfdXpkKHlOPSEjNyQiLjFbJWVuIWUkISIqNyQkIjA9SyhmXCFlJD0hIzckIjBBUioqUmhpZSQhIzY3JDckJCIwdWhEQEVlJD0hIzckIjBPJVwmUjtKZiQhIzY3JCQiMD1LKGZcIWUkPSEjNyQiMEFSKipSaGllJCEjNjckNyQkIjB1aERARWUkPSEjNyQiME8lXCZSO0pmJCEjNjckJCIvR147SyVlJD0hIzYkIjBtNkBHeiYpZiQhIzY3JDckJCIwWXZZJlsnZSQ9ISM3JCIwcyM9WXBiME8hIzY3JCQiL0deO0slZSQ9ISM2JCIwbTZAR3omKWYkISM2NyQ3JCQiMFl2WSZbJ2UkPSEjNyQiMHMjPVlwYjBPISM2NyQkIjBFQDZbIillJD0hIzckIi9YPVJyKjNoJCEjNTckNyQkIjBQNWNdLmYkPSEjNyQiMDNyb1woKnpoJCEjNjckJCIwRUA2WyIpZSQ9ISM3JCIvWD1SciozaCQhIzU3JDckJCIwUDVjXS5mJD0hIzckIjAzcm9cKCp6aCQhIzY3JCQiMFlqVXY+ZiQ9ISM3JCIwTSUqKW9cQEJPISM2NyQ3JCQiMF9sYDtVZiQ9ISM3JCIwV2Z2L1EvaiQhIzY3JCQiMFlqVXY+ZiQ9ISM3JCIwTSUqKW9cQEJPISM2NyQ3JCQiMF9sYDtVZiQ9ISM3JCIwV2Z2L1EvaiQhIzY3JCQiMDM4YS5lZiQ9ISM3JCIwdUdIeEtiaiQhIzY3JDckJCIwLTxNJDMpZiQ9ISM3JCIveUMpZnlHayQhIzU3JCQiMDM4YS5lZiQ9ISM3JCIwdUdIeEtiaiQhIzY3JDckJCIwLTxNJDMpZiQ9ISM3JCIveUMpZnlHayQhIzU3JCQiL0NqRGoqZiQ9ISM2JCIwaSIpeWFdeWskISM2NyQ3JCQiMDMzO14+ZyQ9ISM3JCIwO08qWyI+YGwkISM2NyQkIi9DakRqKmYkPSEjNiQiMGkiKXlhXXlrJCEjNjckNyQkIjAzMztePmckPSEjNyQiMDtPKlsiPmBsJCEjNjckJCIwM2xeaU1nJD0hIzckIjBrckhIbyxtJCEjNjckNyQkIjAjUiV5PmVnJD0hIzckIjBfQycqcGZ4bSQhIzY3JCQiMDNsXmlNZyQ9ISM3JCIwa3JISG8sbSQhIzY3JDckJCIwI1IleT5lZyQ9ISM3JCIwX0MnKnBmeG0kISM2NyQkIjA+cT4kSDJPPSEjNyQiMCZIdTlnW3NPISM2NyQ3JCQiMCw3QypvNE89ISM3JCIwKUdKXS0/IW8kISM2NyQkIjA+cT4kSDJPPSEjNyQiMCZIdTlnW3NPISM2NyQ3JCQiMCw3QypvNE89ISM3JCIwKUdKXS0/IW8kISM2NyQkIjBRSHRDNmgkPSEjNyQiMDEnMzRQIVtvJCEjNjckNyQkIjBEKCpcZk5oJD0hIzckIjBDLDUhM2sjcCQhIzY3JCQiMFFIdEM2aCQ9ISM3JCIwMSczNFAhW28kISM2NyQ3JCQiMEQoKlxmTmgkPSEjNyQiMEMsNSEzayNwJCEjNjckJCIwJ0gpM2RcaCQ9ISM3JCIwQmFyUEBycCQhIzY3JDckJCIwQSNwMlY8Tz0hIzckIi8nKm9eODMwUCEjNTckJCIwJ0gpM2RcaCQ9ISM3JCIwQmFyUEBycCQhIzY3JDckJCIwQSNwMlY8Tz0hIzckIi8nKm9eODMwUCEjNTckJCIwJj5LLno9Tz0hIzckIjB2Sm4sUiU0UCEjNjckNyQkIjBNYihHSUBPPSEjNyQiMCd6UC0+XzxQISM2NyQkIjAmPksuej1PPSEjNyQiMHZKbixSJTRQISM2NyQ3JCQiME1iKEdJQE89ISM3JCIwJ3pQLT5fPFAhIzY3JCQiMF52UUNFaSQ9ISM3JCIwSyFISW12QFAhIzY3JDckJCIwW0MjZTxETz0hIzckIjBLbUlYaSpIUCEjNjckJCIwXnZRQ0VpJD0hIzckIjBLIUhJbXZAUCEjNjckNyQkIjBbQyNlPERPPSEjNyQiMEttSVhpKkhQISM2NyQkIjBLR01ma2kkPSEjNyQiL0sqXEB1U3QkISM1NyQ3JCQiMGkraFwhSE89ISM3JCIwcGFQKy5DdSQhIzY3JCQiMEtHTWZraSQ9ISM3JCIvSypcQHVTdCQhIzU3JDckJCIwaStoXCFITz0hIzckIjBwYVArLkN1JCEjNjckJCIwNGYxJkhJTz0hIzckIjA3eF14IlJZUCEjNjckNyQkIjAoZm5WI0hqJD0hIzckIjAwVldiVlt2JCEjNjckJCIwNGYxJkhJTz0hIzckIjA3eF14IlJZUCEjNjckNyQkIjAoZm5WI0hqJD0hIzckIjAwVldiVlt2JCEjNjckJCIwJ3oqb0pUaiQ9ISM3JCIwJ3BGMSQ0KGVQISM2NyQ3JCQiLz16KSp6T089ISM2JCIwVEpeNSVHblAhIzY3JCQiMCd6Km9KVGokPSEjNyQiMCdwRjEkNChlUCEjNjckNyQkIi89eikqek9PPSEjNiQiMFRKXjUlR25QISM2NyQkIjApRyIzcHpqJD0hIzckIjAjUidHIm8tclAhIzY3JDckJCIwQlVGdzFrJD0hIzckIjB4PmVsQyh6UCEjNjckJCIwKUciM3B6aiQ9ISM3JCIwI1InRyJvLXJQISM2NyQ3JCQiMEJVRncxayQ9ISM3JCIweD5lbEMoelAhIzY3JCQiMChSRnQhPWskPSEjNyQiMC1bP0hXTHkkISM2NyQ3JCQiMEdFYmBYayQ9ISM3JCIwODNsP2xAeiQhIzY3JCQiMChSRnQhPWskPSEjNyQiMC1bP0hXTHkkISM2NyQ3JCQiMEdFYmBYayQ9ISM3JCIwODNsP2xAeiQhIzY3JCQiMEEhR2trWE89ISM3JCIwWUtRdWhjeiQhIzY3JDckJCIuVnJKJVtPPSEjNSQiMFwnPmRkZy9RISM2NyQkIjBBIUdra1hPPSEjNyQiMFlLUXVoY3okISM2NyQ3JCQiLlZySiVbTz0hIzUkIjBcJz5kZGcvUSEjNjckJCIwa0lRJ1tcTz0hIzckIjBYPyNvInp6IVEhIzY3JDckJCIwViJmMkpfTz0hIzckIjAmWyl5SVlxIlEhIzY3JCQiMGtJUSdbXE89ISM3JCIwWD8jbyJ6eiFRISM2NyQ3JCQiMFYiZjJKX089ISM3JCIwJlspeUlZcSJRISM2NyQkIi8kKmVyS2BPPSEjNiQiLyIqR21sSD9RISM1NyQ3JCQiMCg9YTE+Y089ISM3JCIwQHQmZW9bSFEhIzY3JCQiLyQqZXJLYE89ISM2JCIvIipHbWxIP1EhIzU3JDckJCIwKD1hMT5jTz0hIzckIjBAdCZlb1tIUSEjNjckJCIwYTp6b3JsJD0hIzckIjBBJylvJFJoS1EhIzY3JDckJCIwMnBMcittJD0hIzckIjBkaCM0dSM+JVEhIzY3JCQiMGE6em9ybCQ9ISM3JCIwQScpbyRSaEtRISM2NyQ3JCQiMDJwTHIrbSQ9ISM3JCIwZGgjNHUjPiVRISM2NyQkIjAvTz02NW0kPSEjNyQiMHRLSkdKXCVRISM2NyQ3JCQiMC88K2BSbSQ9ISM3JCIwJCpcKmZ6T2FRISM2NyQkIjAvTz02NW0kPSEjNyQiMHRLSkdKXCVRISM2NyQ3JCQiMC88K2BSbSQ9ISM3JCIwJCpcKmZ6T2FRISM2NyQkIi89R1gmW20kPSEjNiQiMCZwJCkpZltzJlEhIzY3JDckJCIwLDlYTnltJD0hIzckIjBIUTFeM28nUSEjNjckJCIvPUdYJlttJD0hIzYkIjAmcCQpKWZbcyZRISM2NyQ3JCQiMCw5WE55bSQ9ISM3JCIwSFExXjNvJ1EhIzY3JCQiMF4lSCcpcG9PPSEjNyQiMDd5LSplY3BRISM2NyQ3JCQiMCh6JHk9PG4kPSEjNyQiMGxFODFcI3pRISM2NyQkIjBeJUgnKXBvTz0hIzckIjA3eS0qZWNwUSEjNjckNyQkIjAoeiR5PTxuJD0hIzckIjBsRTgxXCN6USEjNjckJCIwNnViVkRuJD0hIzckIjAoPUBiSik9KVEhIzY3JDckJCIwMEMoSGd2Tz0hIzckIjAsOj9oKm8iKlEhIzY3JCQiMDZ1YlZEbiQ9ISM3JCIwKD1AYkopPSlRISM2NyQ3JCQiMDBDKEhndk89ISM3JCIwLDo/aCpvIipRISM2NyQkIjBWO00qUXdPPSEjNyQiMHIqbyNSK1UqUSEjNjckNyQkIjA5aC8pW3pPPSEjNyQiMFAuRjtJVCFSISM2NyQkIjBWO00qUXdPPSEjNyQiMHIqbyNSK1UqUSEjNjckNyQkIjA5aC8pW3pPPSEjNyQiMFAuRjtJVCFSISM2NyQkIjBYPylmQiFvJD0hIzckIjAlW3Itd14xUiEjNjckNyQkIjB6IioqUVAkbyQ9ISM3JCIwdCJSODJkO1IhIzY3JCQiMFg/KWZCIW8kPSEjNyQiMCVbci13XjFSISM2NyQ3JCQiMHoiKipRUCRvJD0hIzckIjB0IlI4MmQ7UiEjNjckJCIwbS5OJDMlbyQ9ISM3JCIwaCpSKnlNKT1SISM2NyQ3JCQiMDchPjJFKG8kPSEjNyQiMDQhM2s3LEhSISM2NyQkIjBtLk4kMyVvJD0hIzckIjBoKlIqeU0pPVIhIzY3JDckJCIwNyE+MkUobyQ9ISM3JCIwNCEzazcsSFIhIzY3JCQiMD5HcUp6byQ9ISM3JCIwbkdYJT46SlIhIzY3JDckJCIwPCNSJFs2cCQ9ISM3JCIwWG9aIj1YVFIhIzY3JCQiMD5HcUp6byQ9ISM3JCIwbkdYJT46SlIhIzY3JDckJCIwPCNSJFs2cCQ9ISM3JCIwWG9aIj1YVFIhIzY3JCQiMC1JeSF5InAkPSEjNyQiMFZCajJwTSVSISM2NyQ3JCQiMGA7I28uJnAkPSEjNyQiMCJvWGxCKlEmUiEjNjckJCIwLUl5IXkicCQ9ISM3JCIwVkJqMnBNJVIhIzY3JDckJCIwYDsjby4mcCQ9ISM3JCIwIm9YbEIqUSZSISM2NyQkIjBwKj0yaiZwJD0hIzckIjApeW4hPSd5YlIhIzY3JDckJCIuejJFKilwJD0hIzUkIjA8WGgiSExtUiEjNjckJCIwcCo9MmomcCQ9ISM3JCIwKXluIT0neWJSISM2NyQ3JCQiLnoyRSopcCQ9ISM1JCIwPFhoIkhMbVIhIzY3JCQiMClbI1EiWypwJD0hIzckIjB2LjxFLiJvUiEjNjckNyQkIjAuNEo7R3EkPSEjNyQiMGBMb1l0KHlSISM2NyQkIjApWyNRIlsqcCQ9ISM3JCIwdi48RS4ib1IhIzY3JDckJCIwLjRKO0dxJD0hIzckIjBgTG9ZdCh5UiEjNjckJCIwcEYsTExxJD0hIzckIjAiM3Q2LlUhKVIhIzY3JDckJCIwT3ZKMm5xJD0hIzckIjAqPV88U0AiKlIhIzY3JCQiMHBGLExMcSQ9ISM3JCIwIjN0Ni5VISlSISM2NyQ3JCQiME92SjJucSQ9ISM3JCIwKj1fPFNAIipSISM2NyQkIjBbJylRJj0yUD0hIzckIjBuXXlMUEYqUiEjNjckNyQkIjBDS0sqZjVQPSEjNyQiMEQ1I29YbC5TISM2NyQkIjBbJylRJj0yUD0hIzckIjBuXXlMUEYqUiEjNjckNyQkIjBDS0sqZjVQPSEjNyQiMEQ1I29YbC5TISM2NyQkIjBIT3RRNXIkPSEjNyQiMHcnKkdMYV0rJSEjNjckNyQkIjBtUCk+XDlQPSEjNyQiMGgpKik9XjQ7UyEjNjckJCIwSE90UTVyJD0hIzckIjB3JypHTGFdKyUhIzY3JDckJCIwbVApPlw5UD0hIzckIjBoKSopPV40O1MhIzY3JCQiLmxxIypbciQ9ISM1JCIwIyk0eUlydCwlISM2NyQ3JCQiMHNKayZRPVA9ISM3JCIwKXBlcGNgR1MhIzY3JCQiLmxxIypbciQ9ISM1JCIwIyk0eUlydCwlISM2NyQ3JCQiMHNKayZRPVA9ISM3JCIwKXBlcGNgR1MhIzY3JCQiMDFralooPVA9ISM3JCIwL08/RClvSFMhIzY3JDckJCIwTmU8IUdBUD0hIzckIjBNdi1BdzQvJSEjNjckJCIwMWtqWig9UD0hIzckIjAvTz9EKW9IUyEjNjckNyQkIjBOZTwhR0FQPSEjNyQiME12LUF3NC8lISM2NyQkIjBmUlUuRXMkPSEjNyQiL0F3b14rVVMhIzU3JDckJCIwKj12YTxFUD0hIzckIi9QJzR4O00wJSEjNTckJCIwZlJVLkVzJD0hIzckIi9Bd29eK1VTISM1NyQ3JCQiMCo9dmE8RVA9ISM3JCIvUCc0eDtNMCUhIzU3JCQiMGk0JSpma3MkPSEjNyQiMCQqKTRpP0thUyEjNjckNyQkIjA7LWxyK3QkPSEjNyQiMDFfO0tkZTElISM2NyQkIjBpNCUqZmtzJD0hIzckIjAkKik0aT9LYVMhIzY3JDckJCIwOy1scit0JD0hIzckIjAxXztLZGUxJSEjNjckJCIwRGFKPC50JD0hIzckIi87JXojKlFtMSUhIzU3JDckJCIwayIqZW9SdCQ9ISM3JCIwVVNCKHlIeVMhIzY3JCQiMERhSjwudCQ9ISM3JCIvOyV6IypRbTElISM1NyQ3JCQiMGsiKmVvUnQkPSEjNyQiMFVTQih5SHlTISM2NyQkIjBNZlV2VHQkPSEjNyQiMEwkPXFkJip5UyEjNjckNyQkIi9lTmwneXQkPSEjNiQiMHlHSVVRMjQlISM2NyQkIjBNZlV2VHQkPSEjNyQiMEwkPXFkJip5UyEjNjckNyQkIi9lTmwneXQkPSEjNiQiMHlHSVVRMjQlISM2NyQkIjBgUF5NIVFQPSEjNyQiMDMpMyJlczc0JSEjNjckNyQkIjBOSkNsPHUkPSEjNyQiMDk8UCgqeUo1JSEjNjckJCIwYFBeTSFRUD0hIzckIjAzKTMiZXM3NCUhIzY3JDckJCIwTkpDbDx1JD0hIzckIjA5PFAoKnlKNSUhIzY3JCQiMGMxTCUqPXUkPSEjNyQiMDQ6J28kKmUuVCEjNjckNyQkIjAjPkpbbVhQPSEjNyQiL2JTQyY+YzYlISM1NyQkIjBjMUwlKj11JD0hIzckIjA0OidvJCplLlQhIzY3JDckJCIwIz5KW21YUD0hIzckIi9iU0MmPmM2JSEjNTckJCIwTlkrYmR1JD0hIzckIjBRZydHaCFmNiUhIzY3JDckJCIwb19JbCZcUD0hIzckIjAnUTR2KzFHVCEjNjckJCIwTlkrYmR1JD0hIzckIjBRZydHaCFmNiUhIzY3JDckJCIwb19JbCZcUD0hIzckIjAnUTR2KzFHVCEjNjckJCIwO1JgOydcUD0hIzckIjAkM0doR0FHVCEjNjckNyQkIjA2ZmBtTXYkPSEjNyQiMEEjeUQxXVNUISM2NyQkIjA7UmA7J1xQPSEjNyQiMCQzR2hHQUdUISM2NyQ3JCQiMDZmYG1NdiQ9ISM3JCIwQSN5RDFdU1QhIzY3JCQiMGlgenlNdiQ9ISM3JCIwdkMvZFIwOSUhIzY3JDckJCIwNG5PJHBhUD0hIzckIjA9KFJjPVRXVCEjNjckJCIwaWB6eU12JD0hIzckIjB2Qy9kUjA5JSEjNjckNyQkIjA0bk8kcGFQPSEjNyQiMFhVJSpmTkl4IiEjNzckJCIwdXZsIz13Uj0hIzckIjBYVSUqZk5JeCIhIzc3JDckJCIwTnpNeUU5JT0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwdXZsIz13Uj0hIzckIjBYVSUqZk5JeCIhIzc3JDckJCIwNG5PJHBhUD0hIzckIjA9KFJjPVRXVCEjNjckJCIwQk9LVnR2JD0hIzckIjBQJSlvP2NHOiUhIzY3JDckJCIwaT0qKXB0diQ9ISM3JCIwZXFrPFRIOiUhIzY3JCQiMEJPS1Z0diQ9ISM3JCIwUCUpbz9jRzolISM2NyQ3JCQiMGk9KilwdHYkPSEjNyQiMGVxazxUSDolISM2NyQkIjBEVE40N3ckPSEjNyQiMEx2XnpzXjslISM2NyQ3JCQiMGYrcXU3dyQ9ISM3JCIwJSplcnMiUWxUISM2NyQkIjBEVE40N3ckPSEjNyQiMEx2XnpzXjslISM2NyQ3JCQiMGYrcXU3dyQ9ISM3JCIwJSplcnMiUWxUISM2NyQkIjB3VTZ3XXckPSEjNyQiMFlxK08qW3hUISM2NyQ3JCQiMHZjRSE9bFA9ISM3JCIvdCV5RkF5PCUhIzU3JCQiMHdVNndddyQ9ISM3JCIwWXErTypbeFQhIzY3JDckJCIwdmNFIT1sUD0hIzckIi90JXlGQXk8JSEjNTckJCIwSjd0VipvUD0hIzckIjBoI1woKmUhKSo9JSEjNjckNyQkIjBOcnInM3BQPSEjNyQiMG1OJkdHRSE+JSEjNjckJCIwSjd0VipvUD0hIzckIjBoI1woKmUhKSo9JSEjNjckNyQkIjBOcnInM3BQPSEjNyQiMG1OJkdHRSE+JSEjNjckJCIvKls/N0d4JD0hIzYkIjAiXFcyQzctVSEjNjckNyQkIjBVI1tTKkh4JD0hIzckIjAtQyN6THEtVSEjNjckJCIvKls/N0d4JD0hIzYkIjAiXFcyQzctVSEjNjckNyQkIjBVI1tTKkh4JD0hIzckIjAtQyN6THEtVSEjNjckJCIwKCp5XyJvd1A9ISM3JCIwTGosKilRV0AlISM2NyQ3JCQiMC4pcEEhcHgkPSEjNyQiMFE3KkhSOTpVISM2NyQkIjAoKnlfIm93UD0hIzckIjBMaiwqKVFXQCUhIzY3JDckJCIwLilwQSFweCQ9ISM3JCIwUTcqSFI5OlUhIzY3JCQiMEtRZl4weSQ9ISM3JCIwM2chXGB2RVUhIzY3JDckJCIwUXZDNjN5JD0hIzckIjB1KzFbJWVGVSEjNjckJCIwS1FmXjB5JD0hIzckIjAzZyFcYHZFVSEjNjckNyQkIjBRdkM2M3kkPSEjNyQiMHUrMVslZUZVISM2NyQkIjBGKjNEVSV5JD0hIzckIjAlKkcyeXIhUlUhIzY3JDckJCIwTTI1QFp5JD0hIzckIi8iKkdKXS1TVSEjNTckJCIwRiozRFUleSQ9ISM3JCIwJSpHMnlyIVJVISM2NyQ3JCQiME0yNUBaeSQ9ISM3JCIvIipHSl0tU1UhIzU3JCQiMGFBOiVIKXkkPSEjNyQiL3UvKj0pUV5VISM1NyQ3JCQiMGYqSDxqKXkkPSEjNyQiMFl4PmVsQ0QlISM2NyQkIjBhQTolSCl5JD0hIzckIi91Lyo9KVFeVSEjNTckNyQkIjBmKkg8ail5JD0hIzckIjBZeD5lbENEJSEjNjckJCIwJj1rbTsjeiQ9ISM3JCIvWF5wWHFqVSEjNTckNyQkIjBsV0JWRHokPSEjNyQiMCNlbUtoIVxFJSEjNjckJCIwJj1rbTsjeiQ9ISM3JCIvWF5wWHFqVSEjNTckNyQkIjBsV0JWRHokPSEjNyQiMCNlbUtoIVxFJSEjNjckJCIwZDYtU2d6JD0hIzckIjB3JilHIzQtd1UhIzY3JDckJCIwWC1oYmt6JD0hIzckIjA9YUxvWXRGJSEjNjckJCIwZDYtU2d6JD0hIzckIjB3JilHIzQtd1UhIzY3JDckJCIwWC1oYmt6JD0hIzckIjA9YUxvWXRGJSEjNjckJCIwUCM+VSIqKnokPSEjNyQiMEYoR1xzTClHJSEjNjckNyQkIi92JCkpby4hUT0hIzYkIjBhVVNCKHkqRyUhIzY3JCQiMFAjPlUiKip6JD0hIzckIjBGKEdcc0wpRyUhIzY3JDckJCIvdiQpKW8uIVE9ISM2JCIwYVVTQih5KkclISM2NyQkIjBUXTwqeS5RPSEjNyQiMHcjUl5ObCtWISM2NyQ3JCQiMDJIIkhHL1E9ISM3JCIvNHQleUZBSSUhIzU3JCQiMFRdPCp5LlE9ISM3JCIwdyNSXk5sK1YhIzY3JDckJCIwMkgiSEcvUT0hIzckIi80dCV5RkFJJSEjNTckJCIwbjwoXG0yUT0hIzckIjBcTWwjKXBISiUhIzY3JDckJCIwKClwI3k+M1E9ISM3JCIwRT5hTG9ZSiUhIzY3JCQiMG48KFxtMlE9ISM3JCIwXE1sIylwSEolISM2NyQ3JCQiMCgpcCN5PjNRPSEjNyQiMEU+YUxvWUolISM2NyQkIjBaXF5UOiJRPSEjNyQiMF9UeDInR0RWISM2NyQ3JCQiMCJwOk42N1E9ISM3JCIwajJoKSkzckslISM2NyQkIjBaXF5UOiJRPSEjNyQiMF9UeDInR0RWISM2NyQ3JCQiMCJwOk42N1E9ISM3JCIwajJoKSkzckslISM2NyQkIjBbaiIqPWEiUT0hIzckIjA4STlJLXdMJSEjNjckNyQkIi44MklnIlE9ISM1JCIwKmZ6TyVcJlJWISM2NyQkIjBbaiIqPWEiUT0hIzckIjA4STlJLXdMJSEjNjckNyQkIi44MklnIlE9ISM1JCIwKmZ6TyVcJlJWISM2NyQkIi9iYXJIPlE9ISM2JCIwNihHKVw9KlxWISM2NyQ3JCQiMGY6XloqPlE9ISM3JCIwTiVbKCkqKik+TiUhIzY3JCQiL2Jhckg+UT0hIzYkIjA2KEcpXD0qXFYhIzY3JDckJCIwZjpeWio+UT0hIzckIjBOJVsoKSoqKT5OJSEjNjckJCIwdUY5d0ojUT0hIzckIjAqXDRyWUJpViEjNjckNyQkIjAnNElkJ1EjUT0hIzckIjBycyJRMFZrViEjNjckJCIwdUY5d0ojUT0hIzckIjAqXDRyWUJpViEjNjckNyQkIjAnNElkJ1EjUT0hIzckIjBycyJRMFZrViEjNjckJCIwTiopKWYwRlE9ISM3JCIwYSRSOzNidVYhIzY3JDckJCIwXDgiW3lGUT0hIzckIjAyaCkpM3JvUCUhIzY3JCQiME4qKSlmMEZRPSEjNyQiMGEkUjszYnVWISM2NyQ3JCQiMFw4Ilt5RlE9ISM3JCIwMmgpKTNyb1AlISM2NyQkIi5cY080JFE9ISM1JCIwSCJIUXAnb1ElISM2NyQ3JCQiMEBMbi88JFE9ISM3JCIwVlwmUjtKKlElISM2NyQkIi5cY080JFE9ISM1JCIwSCJIUXAnb1ElISM2NyQ3JCQiMEBMbi88JFE9ISM3JCIwVlwmUjtKKlElISM2NyQkIjA7JykqeiJbJFE9ISM3JCIwbSZvS0k9KlIlISM2NyQ3JCQiMCU+QWFpTlE9ISM3JCIwelAtPl88UyUhIzY3JCQiMDsnKSp6IlskUT0hIzckIjBtJm9LST0qUiUhIzY3JDckJCIwJT5BYWlOUT0hIzckIjB6UC0+XzxTJSEjNjckJCIwJykqKkcrKFFRPSEjNyQiMHh6Jio0Klw2VyEjNjckNyQkIjAkZkhxYVJRPSEjNyQiMDpFNHUjPjlXISM2NyQkIjAnKSoqRysoUVE9ISM3JCIweHomKjQqXDZXISM2NyQ3JCQiMCRmSHFhUlE9ISM3JCIwOkU0dSM+OVchIzY3JCQiMCIqM0okZVVRPSEjNyQiLzwzVl4iUVUlISM1NyQ3JCQiMG84VXBNJVE9ISM3JCIwXjk7SExtVSUhIzY3JCQiMCIqM0okZVVRPSEjNyQiLzwzVl4iUVUlISM1NyQ3JCQiMG84VXBNJVE9ISM3JCIwXjk7SExtVSUhIzY3JCQiMGsjKj1uayVRPSEjNyQiMEwqM2Y2OE9XISM2NyQ3JCQiMHIoKnAjUlpRPSEjNyQiMChHSVVRMlJXISM2NyQkIjBrIyo9bmslUT0hIzckIjBMKjNmNjhPVyEjNjckNyQkIjByKCpwI1JaUT0hIzckIjAoR0lVUTJSVyEjNjckJCIwM10jPk5dUT0hIzckIjB5MHc5WiVbVyEjNjckNyQkIjAyRCRvSl5RPSEjNyQiMEIiKkhSOTpYJSEjNjckJCIwM10jPk5dUT0hIzckIjB5MHc5WiVbVyEjNjckNyQkIjAyRCRvSl5RPSEjNyQiMEIiKkhSOTpYJSEjNjckJCIwPStSUFUmUT0hIzckIjBsUUY2ajJZJSEjNjckNyQkIi9HYDxDYlE9ISM2JCIwZnpPJVwmUlklISM2NyQkIjA9K1JQVSZRPSEjNyQiMGxRRjZqMlklISM2NyQ3JCQiL0dgPENiUT0hIzYkIjBmek8lXCZSWSUhIzY3JCQiME0kPU83ZVE9ISM3JCIwWidSYCF6SVolISM2NyQ3JCQiMDk2Vm4iZlE9ISM3JCIwJnpPJVwmUndXISM2NyQkIjBNJD1PN2VRPSEjNyQiMFonUmAheklaJSEjNjckNyQkIjA5NlZuImZRPSEjNyQiMCZ6TyVcJlJ3VyEjNjckJCIwMTRuNT8nUT0hIzckIjAlXGluXFImWyUhIzY3JDckJCIwPl8qUjRqUT0hIzckIjBKY10vTykpWyUhIzY3JCQiMDE0bjU/J1E9ISM3JCIwJVxpblxSJlslISM2NyQ3JCQiMD5fKlI0alE9ISM3JCIwSmNdL08pKVslISM2NyQkIjB5L2UpKmUnUT0hIzckIjA4dVYmM3IoXCUhIzY3JDckJCIuYldAcSdRPSEjNSQiMG5XZGZ3N10lISM2NyQkIjB5L2UpKmUnUT0hIzckIjA4dVYmM3IoXCUhIzY3JDckJCIuYldAcSdRPSEjNSQiMG5XZGZ3N10lISM2NyQkIjBLcEQoeXBRPSEjNyQiMGhMbHJFK14lISM2NyQ3JCQiMCVlXydcNChRPSEjNyQiMC5Mazk8UF4lISM2NyQkIjBLcEQoeXBRPSEjNyQiMGhMbHJFK14lISM2NyQ3JCQiMCVlXydcNChRPSEjNyQiMC5Mazk8UF4lISM2NyQkIjA6TnZ3TyhRPSEjNyQiMDAnUl9ETUFYISM2NyQ3JCQiMGxjdXlbKFE9ISM3JCIwUkBycGRoXyUhIzY3JCQiMDpOdndPKFE9ISM3JCIwMCdSX0RNQVghIzY3JDckJCIwbGN1eVsoUT0hIzckIjBSQHJwZGhfJSEjNjckJCIwbyQ+cWN4UT0hIzckIjBBI2ZqJGVZYCUhIzY3JDckJCIwTW5qMyl5UT0hIzckIjB2NHlDKWZRWCEjNjckJCIwbyQ+cWN4UT0hIzckIjBBI2ZqJGVZYCUhIzY3JDckJCIwTW5qMyl5UT0hIzckIjB2NHlDKWZRWCEjNjckJCIwOlc5ZTkpUT0hIzckIjB3UXM5dXBhJSEjNjckNyQkIjB3TlBSRilRPSEjNyQiMDYpXCl6UTViJSEjNjckJCIwOlc5ZTkpUT0hIzckIjB3UXM5dXBhJSEjNjckNyQkIjB3TlBSRilRPSEjNyQiMDYpXCl6UTViJSEjNjckJCIvZisrTiYpUT0hIzYkIjAuVXUhKipHZlghIzY3JDckJCIwIylvJzNuJylRPSEjNyQiMFonPVwkek1jJSEjNjckJCIvZisrTiYpUT0hIzYkIjAuVXUhKipHZlghIzY3JDckJCIwIylvJzNuJylRPSEjNyQiMFonPVwkek1jJSEjNjckJCIwKFJyRUMqKVE9ISM3JCIvWF9UY2dyWCEjNTckNyQkIjAyNkguMSpRPSEjNyQiMCRbKCkqKik+ZmQlISM2NyQkIjAoUnJFQyopUT0hIzckIi9YX1RjZ3JYISM1NyQ3JCQiMDI2SC4xKlE9ISM3JCIwJFsoKSoqKT5mZCUhIzY3JCQiMDZVQ09KKlE9ISM3JCIwZCVvWTgjUmUlISM2NyQ3JCQiLyJwYk9YKlE9ISM2JCIwPmowWGckKWUlISM2NyQkIjA2VUNPSipRPSEjNyQiMGQlb1k4I1JlJSEjNjckNyQkIi8icGJPWCpRPSEjNiQiMD5qMFhnJCllJSEjNjckJCIwKCl5YUlxKlE9ISM3JCIwIyo0JUdxQidmJSEjNjckNyQkIjA9KnkwWikqUT0hIzckIjBiXjcrLDNnJSEjNjckJCIwKCl5YUlxKlE9ISM3JCIwIyo0JUdxQidmJSEjNjckNyQkIjA9KnkwWikqUT0hIzckIjBiXjcrLDNnJSEjNjckJCIwVUJlRDQhUj0hIzckIjA9Lm5vXyYzWSEjNjckNyQkIjBkaVMwQyFSPSEjNyQiMCIqUj5iVEtoJSEjNjckJCIwVUJlRDQhUj0hIzckIjA9Lm5vXyYzWSEjNjckNyQkIjBkaVMwQyFSPSEjNyQiMCIqUj5iVEtoJSEjNjckJCIwUGFaQFshUj0hIzckIjBha3VKbzNpJSEjNjckNyQkIjAlKTQyVGohUj0hIzckIjBHR0U1I29EWSEjNjckJCIwUGFaQFshUj0hIzckIjBha3VKbzNpJSEjNjckNyQkIjAlKTQyVGohUj0hIzckIjBHR0U1I29EWSEjNjckJCIwUCIqND0oM1I9ISM3JCIwVCp6Q1I9TFkhIzY3JDckJCIwOWBmeC0iUj0hIzckIjBrO0xsQSJRWSEjNjckJCIwUCIqND0oM1I9ISM3JCIwVCp6Q1I9TFkhIzY3JDckJCIwOWBmeC0iUj0hIzckIjBrO0xsQSJRWSEjNjckJCIwb0xqOkUiUj0hIzckIjBlUUhdKlxYWSEjNjckNyQkIjBBUCFcQDlSPSEjNyQiLjBTP2owbCUhIio3JCQiMG9MajpFIlI9ISM3JCIwZVFIXSpcWFkhIzY3JDckJCIwQVAhXEA5Uj0hIzckIi4wUz9qMGwlISIqNyQkIjA2PSNSXjtSPSEjNyQiMEUlKm8wOnlsJSEjNjckNyQkIjBWcjRgIj1SPSEjNyQiME8kcGFQK2pZISM2NyQkIjA2PSNSXjtSPSEjNyQiMEUlKm8wOnlsJSEjNjckNyQkIjBWcjRgIj1SPSEjNyQiME8kcGFQK2pZISM2NyQkIjAjUT5IVD9SPSEjNyQiMDc3IillSSxuJSEjNjckNyQkIjBbJkc/NEFSPSEjNyQiMHMiUTBWV3ZZISM2NyQkIjAjUT5IVD9SPSEjNyQiMDc3IillSSxuJSEjNjckNyQkIjBbJkc/NEFSPSEjNyQiMHMiUTBWV3ZZISM2NyQkIjAtKFxHSkNSPSEjNyQiMCU9VSozWUNvJSEjNjckNyQkIjBFXic9LkVSPSEjNyQiMDNxZyZbKXlvJSEjNjckJCIwLShcR0pDUj0hIzckIjAlPVUqM1lDbyUhIzY3JDckJCIwRV4nPS5FUj0hIzckIjAzcWcmWyl5byUhIzY3JCQiMCc9NU5AR1I9ISM3JCIwPj50Y2hacCUhIzY3JDckJCIwMWNecypIUj0hIzckIjBXZW5TRC5xJSEjNjckJCIwJz01TkBHUj0hIzckIjA+PnRjaFpwJSEjNjckNyQkIjAxY15zKkhSPSEjNyQiMFdlblNELnElISM2NyQkIjBXI2ZcNktSPSEjNyQiLzgkKj5xMjJaISM1NyQ3JCQiMGVUI1IiUiRSPSEjNyQiL29XZGZ3N1ohIzU3JCQiMFcjZlw2S1I9ISM3JCIvOCQqPnEyMlohIzU3JDckJCIwZVQjUiJSJFI9ISM3JCIvb1dkZnc3WiEjNTckJCIwcjM5PGckUj0hIzckIjAnUjBcQ1I+WiEjNjckNyQkIjAmcF5oJnkkUj0hIzckIjA7TiIzbD9EWiEjNjckJCIwcjM5PGckUj0hIzckIjAnUjBcQ1I+WiEjNjckNyQkIjAmcF5oJnkkUj0hIzckIjA7TiIzbD9EWiEjNjckJCIwQyhcLSMqUlI9ISM3JCIwYlglW3lxSlohIzY3JDckJCIwXE5GKnpUUj0hIzckIjBfQillcWtQWiEjNjckJCIwQyhcLSMqUlI9ISM3JCIwYlglW3lxSlohIzY3JDckJCIwXE5GKnpUUj0hIzckIjBfQillcWtQWiEjNjckJCIwVkctQ1ElUj0hIzckIjB5UGxBQlN1JSEjNjckNyQkIjBOJ1tKdVhSPSEjNyQiMCk9XjR3M11aISM2NyQkIjBWRy1DUSVSPSEjNyQiMHlQbEFCU3UlISM2NyQ3JCQiME4nW0p1WFI9ISM3JCIwKT1eNHczXVohIzY3JCQiMG1obEd4JVI9ISM3JCIwKXoveCZRanYlISM2NyQ3JCQiMFwkW3lvXFI9ISM3JCIwQystO0dEdyUhIzY3JCQiMG1obEd4JVI9ISM3JCIwKXoveCZRanYlISM2NyQ3JCQiMFwkW3lvXFI9ISM3JCIwQystO0dEdyUhIzY3JCQiMCJvJTNNOyZSPSEjNyQiMHJnPyFSbG9aISM2NyQ3JCQiMCxcVkxPJlI9ISM3JCIvJykpM3JvXHglISM1NyQkIjAibyUzTTsmUj0hIzckIjByZz8hUmxvWiEjNjckNyQkIjAsXFZMTyZSPSEjNyQiLycpKTNyb1x4JSEjNTckJCIwZCozLmFiUj0hIzckIjB4ZDo/cDR5JSEjNjckNyQkIi8teih6diZSPSEjNiQiMCdwZGgjNHV5JSEjNjckJCIwZCozLmFiUj0hIzckIjB4ZDo/cDR5JSEjNjckNyQkIi8teih6diZSPSEjNiQiMCdwZGgjNHV5JSEjNjckJCIwIkdsc1dmUj0hIzckIjAxI2V4V0ckeiUhIzY3JDckJCIwKltccF9oUj0hIzckIjBLbEEiKVwpKnolISM2NyQkIjAiR2xzV2ZSPSEjNyQiMDEjZXhXRyR6JSEjNjckNyQkIjAqW1xwX2hSPSEjNyQiMEtsQSIpXCkqeiUhIzY3JCQiMFc5M2JMJ1I9ISM3JCIwME9ncypmMFshIzY3JDckJCIwJikqUVxabFI9ISM3JCIwb2BITyFIN1shIzY3JCQiMFc5M2JMJ1I9ISM3JCIwME9ncypmMFshIzY3JDckJCIwJikqUVxabFI9ISM3JCIwb2BITyFIN1shIzY3JCQiMCJbSE9FblI9ISM3JCIwI0ctXlwieiJbISM2NyQ3JCQiMClHZFBVcFI9ISM3JCIwL1VPIjR0Q1shIzY3JCQiMCJbSE9FblI9ISM3JCIwI0ctXlwieiJbISM2NyQ3JCQiMClHZFBVcFI9ISM3JCIwL1VPIjR0Q1shIzY3JCQiMGIxKUg8clI9ISM3JCIwVmQtOkktJFshIzY3JDckJCIwY2FMdEwoUj0hIzckIi8vTGs5PFBbISM1NyQkIjBiMSlIPHJSPSEjNyQiMFZkLTpJLSRbISM2NyQ3JCQiMGNhTHRMKFI9ISM3JCIvL0xrOTxQWyEjNTckJCIwVDg3JDN2Uj0hIzckIjBwd1RLWEQlWyEjNjckNyQkIjBtRCFRS3hSPSEjNyQiMHc9XSw3J1xbISM2NyQkIjBUODckM3ZSPSEjNyQiMHB3VEtYRCVbISM2NyQ3JCQiMG1EIVFLeFI9ISM3JCIwdz1dLDcnXFshIzY3JCQiMCw6NyUqKnlSPSEjNyQiME1QMFpnWyZbISM2NyQ3JCQiMC5KM3Y3KVI9ISM3JCIwNzJkY18/J1shIzY3JCQiMCw6NyUqKnlSPSEjNyQiME1QMFpnWyZbISM2NyQ3JCQiMC5KM3Y3KVI9ISM3JCIwNzJkY18/J1shIzY3JCQiMFUwIWUhSClSPSEjNyQiLTgmZnZyJ1shIik3JDckJCIwOCNvcUEmKVI9ISM3JCIwWyZSO0pcdVshIzY3JCQiMFUwIWUhSClSPSEjNyQiLTgmZnZyJ1shIik3JDckJCIwOCNvcUEmKVI9ISM3JCIwWyZSO0pcdVshIzY3JCQiLyhcRT1vKVI9ISM2JCIwaFJYcCFcelshIzY3JDckJCIwMT8lKnoiKilSPSEjNyQiMCVRM25PJHApWyEjNjckJCIvKFxFPW8pUj0hIzYkIjBoUlhwIVx6WyEjNjckNyQkIjAxPyUqeiIqKVI9ISM3JCIwJVEzbk8kcClbISM2NyQkIjAtJyllSjIqUj0hIzckIjBCKlJtZCE9KlshIzY3JDckJCIwIlIvUDgkKlI9ISM3JCIvQXg8VVAqKlshIzU3JCQiMC0nKWVKMipSPSEjNyQiMEIqUm1kIT0qWyEjNjckNyQkIjAiUi9QOCQqUj0hIzckIi9BeDxVUCoqWyEjNTckJCIvZEFkayUqUj0hIzYkIjAnZUY3MzcvXCEjNjckNyQkIjBUaEEpMygqUj0hIzckIjBjZyVvWiI9IlwhIzY3JCQiL2RBZGslKlI9ISM2JCIwJ2VGNzM3L1whIzY3JDckJCIwVGhBKTMoKlI9ISM3JCIwY2clb1oiPSJcISM2NyQkIjAvLmZnJikqUj0hIzckIjBoQ1kkZVY7XCEjNjckNyQkIjB3cl1WNSslPSEjNyQiMCQqWyI+YERDXCEjNjckJCIwLy5mZyYpKlI9ISM3JCIwaENZJGVWO1whIzY3JDckJCIwd3JdVjUrJT0hIzckIjAkKlsiPmBEQ1whIzY3JCQiMDp6QndDKyU9ISM3JCIwLG4+JDN2R1whIzY3JDckJCIwVmxuKipcKyU9ISM3JCIwSFApcGVwT1whIzY3JCQiMDp6QndDKyU9ISM3JCIwLG4+JDN2R1whIzY3JDckJCIwVmxuKipcKyU9ISM3JCIwSFApcGVwT1whIzY3JCQiMG4lKnAjUjFTPSEjNyQiMHY1SyFlMVRcISM2NyQ3JCQiMEhdZ2MqM1M9ISM3JCIwbEQwVU8iXFwhIzY3JCQiMG4lKnAjUjFTPSEjNyQiMHY1SyFlMVRcISM2NyQ3JCQiMEhdZ2MqM1M9ISM3JCIwbEQwVU8iXFwhIzY3JCQiMExYKik0LiwlPSEjNyQiMHVNNHYhUWBcISM2NyQ3JCQiMGJESDlILCU9ISM3JCIwLDk3KHBkaFwhIzY3JCQiMExYKik0LiwlPSEjNyQiMHVNNHYhUWBcISM2NyQ3JCQiMGJESDlILCU9ISM3JCIwLDk3KHBkaFwhIzY3JCQiMFlgJ3lBOVM9ISM3JCIweSV5dGNwbFwhIzY3JDckJCIwYiJvRyhvLCU9ISM3JCIwUC0+XzxTKFwhIzY3JCQiMFlgJ3lBOVM9ISM3JCIweSV5dGNwbFwhIzY3JDckJCIwYiJvRyhvLCU9ISM3JCIwUC0+XzxTKFwhIzY3JCQiMDRQbFkiPVM9ISM3JCIwWT8vZDUheVwhIzY3JDckJCIwR0U/SzMtJT0hIzckIjB0IWZzIWVrKVwhIzY3JCQiMDRQbFkiPVM9ISM3JCIwWT8vZDUheVwhIzY3JDckJCIwR0U/SzMtJT0hIzckIjB0IWZzIWVrKVwhIzY3JCQiMExgPG0/LSU9ISM3JCIwXldOV0QuKlwhIzY3JDckJCIwc2RRI3pDUz0hIzckIjA0ektpKSopKSpcISM2NyQkIjBMYDxtPy0lPSEjNyQiMF5XTldELipcISM2NyQ3JCQiMHNkUSN6Q1M9ISM3JCIwNHpLaSkqKSkqXCEjNjckJCIwS3piJylmLSU9ISM3JCIweWghKkdTRSsmISM2NyQ3JCQiLzxvTHZHUz0hIzYkIjBYblI8UjgsJiEjNjckJCIwS3piJylmLSU9ISM3JCIweWghKkdTRSsmISM2NyQ3JCQiLzxvTHZHUz0hIzYkIjBYblI8UjgsJiEjNjckJCIvaXR3ISpIUz0hIzYkIjAiSDI2XiZcLCYhIzY3JDckJCIwLjw/OkYuJT0hIzckIjAiZWxDKHpQLSYhIzY3JCQiL2l0dyEqSFM9ISM2JCIwIkgyNl4mXCwmISM2NyQ3JCQiMC48PzpGLiU9ISM3JCIwImVsQyh6UC0mISM2NyQkIjBfVWhIUS4lPSEjNyQiMGhLbSEqcHMtJiEjNjckNyQkIjAkZi14bk9TPSEjNyQiMDxXYEY/aS4mISM2NyQkIjBfVWhIUS4lPSEjNyQiMGhLbSEqcHMtJiEjNjckNyQkIjAkZi14bk9TPSEjNyQiMDxXYEY/aS4mISM2NyQkIi9zSkF2UFM9ISM2JCIvKipbIW8lZVJdISM1NyQ3JCQiMHpoPVQxLyU9ISM3JCIwYEtnIzNtW10hIzY3JCQiL3NKQXZQUz0hIzYkIi8qKlshbyVlUl0hIzU3JDckJCIwemg9VDEvJT0hIzckIjBgS2cjM21bXSEjNjckJCIwdiVvZG5UUz0hIzckIjBzcVtVKio9MCYhIzY3JDckJCIwRFZMMFkvJT0hIzckIjAqM3N3ODVoXSEjNjckJCIwdiVvZG5UUz0hIzckIjBzcVtVKio9MCYhIzY3JDckJCIwRFZMMFkvJT0hIzckIjAqM3N3ODVoXSEjNjckJCIwZlolKipmWFM9ISM3JCIwS1goW1RAa10hIzY3JDckJCIwWCZRLmRbUz0hIzckIjBENHUjPmF0XSEjNjckJCIwZlolKipmWFM9ISM3JCIwS1goW1RAa10hIzY3JDckJCIwWCZRLmRbUz0hIzckIjBENHUjPmF0XSEjNjckJCIwNDMmXF9cUz0hIzckIjApUSxZKUdsMiYhIzY3JDckJCIwQU81T0QwJT0hIzckIjBoKDR5QylmMyYhIzY3JCQiMDQzJlxfXFM9ISM3JCIwKVEsWSlHbDImISM2NyQ3JCQiMEFPNU9EMCU9ISM3JCIwaCg0eUMpZjMmISM2NyQkIjA4OXNdTTAlPSEjNyQiMFJuKD1OJSkpMyYhIzY3JDckJCIwWyZlRl1jUz0hIzckIjAoZnlHSVUpNCYhIzY3JCQiMDg5c11NMCU9ISM3JCIwUm4oPU4lKSkzJiEjNjckNyQkIjBbJmVGXWNTPSEjNyQiMChmeUdJVSk0JiEjNjckJCIvPkN0UGRTPSEjNiQiMHBQWztlNjUmISM2NyQ3JCQiMG1UPHEvMSU9ISM3JCIwTHUlek4nMzYmISM2NyQkIi8+Q3RQZFM9ISM2JCIwcFBbO2U2NSYhIzY3JDckJCIwbVQ8cS8xJT0hIzckIjBMdSV6TiczNiYhIzY3JCQiMGgoKW8vODElPSEjNyQiLzlbJ3lzTTYmISM1NyQ3JCQiMERrUFFXMSU9ISM3JCIwcGksOC9MNyYhIzY3JCQiMGgoKW8vODElPSEjNyQiLzlbJ3lzTTYmISM1NyQ3JCQiMERrUFFXMSU9ISM3JCIwcGksOC9MNyYhIzY3JCQiMGtjeUtfMSU9ISM3JCIwRVZZUSh5RF4hIzY3JDckJCIwRzRXMiVvUz0hIzckIjAwXjNvV2Q4JiEjNjckJCIwa2N5S18xJT0hIzckIjBFVllRKHlEXiEjNjckNyQkIjBHNFcyJW9TPSEjNyQiMDBeM29XZDgmISM2NyQkIjBjJD08O3BTPSEjNyQiMCVmK2M+NVFeISM2NyQ3JCQiMHplRXhCMiU9ISM3JCIwVFI6QiY9W14hIzY3JCQiMGMkPTw7cFM9ISM3JCIwJWYrYz41UV4hIzY3JDckJCIwemVFeEIyJT0hIzckIjBUUjpCJj1bXiEjNjckJCIwKXomUSI0dFM9ISM3JCIwQzRRXTsvOiYhIzY3JDckJCIwLTcmeU13Uz0hIzckIjB4RkF5RDE7JiEjNjckJCIwKXomUSI0dFM9ISM3JCIwQzRRXTsvOiYhIzY3JDckJCIwLTcmeU13Uz0hIzckIjB4RkF5RDE7JiEjNjckJCIwM3p5QHEyJT0hIzckIjB1YiFHNXRpXiEjNjckNyQkIjA+Xkk+LjMlPSEjNyQiMDg7SExtSTwmISM2NyQkIjAzenlAcTIlPSEjNyQiMHViIUc1dGleISM2NyQ3JCQiMD5eST4uMyU9ISM3JCIwODtITG1JPCYhIzY3JCQiMFBCMGA0MyU9ISM3JCIwVV9ZX1hdPCYhIzY3JDckJCIwLzhhIkglMyU9ISM3JCIwXC9PKW9dJj0mISM2NyQkIjBQQjBgNDMlPSEjNyQiMFVfWV9YXTwmISM2NyQ3JCQiMC84YSJIJTMlPSEjNyQiMFwvTylvXSY9JiEjNjckJCIwazcwJilbMyU9ISM3JCIwdyhwKCoqZnQ9JiEjNjckNyQkIjA7d2BrIykzJT0hIzckIjAnR0hNdSV6PiYhIzY3JCQiMGs3MCYpWzMlPSEjNyQiMHcocCgqKmZ0PSYhIzY3JDckJCIwO3dgayMpMyU9ISM3JCIwJkdITXUlej4mISM2NyQkIjA0WXk8KSkzJT0hIzckIjBOJT5aV24qPiYhIzY3JDckJCIwTGlTUUE0JT0hIzckIjBAIilcKXpRNV8hIzY3JCQiMDRZeTwpKTMlPSEjNyQiME4lPlpXbio+JiEjNjckNyQkIjBMaVNRQTQlPSEjNyQiMEAiKVwpelE1XyEjNjckJCIwMytRXkY0JT0hIzckIi8nXCFwKSkpPkAmISM1NyQ3JCQiMDRIMDhpNCU9ISM3JCIwZXBjYEdHQSYhIzY3JCQiMDMrUV5GNCU9ISM3JCIvJ1whcCkpKT5AJiEjNTckNyQkIjA0SDA4aTQlPSEjNyQiMGVwY2BHR0EmISM2NyQkIjBhJzRkbyc0JT0hIzckIjBjaHRFLlZBJiEjNjckNyQkIi9aZiUpPStUPSEjNiQiMCV6TiczcF9CJiEjNjckJCIwYSc0ZG8nNCU9ISM3JCIwY2h0RS5WQSYhIzY3JDckJCIvWmYlKT0rVD0hIzYkIjAlek4nM3BfQiYhIzY3JCQiMG5NeD8xNSU9ISM3JCIwIkc4VXdoT18hIzY3JDckJCIwUGVpa1Q1JT0hIzckIi9qL1AnNHhDJiEjNTckJCIwbk14PzE1JT0hIzckIjAiRzhVd2hPXyEjNjckNyQkIjBQZWlrVDUlPSEjNyQiL2ovUCc0eEMmISM1NyQkIjBuOGRjWDUlPSEjNyQiMCVmTyQqPiQqW18hIzY3JDckJCIvWXA7OTNUPSEjNiQiMG1NeD1dLEUmISM2NyQkIjBuOGRjWDUlPSEjNyQiMCVmTyQqPiQqW18hIzY3JDckJCIvWXA7OTNUPSEjNiQiMG1NeD1dLEUmISM2NyQkIjA+KD5LXDNUPSEjNyQiMHNIdEpZN0UmISM2NyQ3JCQiMHJgWj5ANiU9ISM3JCIwLUIlUTJmc18hIzY3JCQiMD4oPktcM1Q9ISM3JCIwc0h0Slk3RSYhIzY3JDckJCIwcmBaPkA2JT0hIzckIjAtQiVRMmZzXyEjNjckJCIwTlhoSUM2JT0hIzckIjBcZXRoZ05GJiEjNjckNyQkIi9MXyEpNDtUPSEjNiQiMFE2IipHSl1HJiEjNjckJCIwTlhoSUM2JT0hIzckIjBcZXRoZ05GJiEjNjckNyQkIi9MXyEpNDtUPSEjNiQiMFE2IipHSl1HJiEjNjckJCIwKD1WKG9qNiU9ISM3JCIwO2RRKlsoZUcmISM2NyQ3JCQiMGUtXngrNyU9ISM3JCIwdSp6Uj1aKEgmISM2NyQkIjAoPVYob2o2JT0hIzckIjA7ZFEqWyhlRyYhIzY3JDckJCIwZS1eeCs3JT0hIzckIjB1KnpSPVooSCYhIzY3JCQiMDxmczIuNyU9ISM3JCIwRXFIOSo9KUgmISM2NyQ3JCQiMEwtdGRTNyU9ISM3JCIvIilbIVI3KjRgISM1NyQkIjA8ZnMyLjclPSEjNyQiMEVxSDkqPSlIJiEjNjckNyQkIjBMLXRkUzclPSEjNyQiLyIpWyFSNyo0YCEjNTckJCIwMVxXWlU3JT0hIzckIjBjdiVvTF01YCEjNjckNyQkIjB3QHJRIUdUPSEjNyQiMFl3NiVITkFgISM2NyQkIjAxXFdaVTclPSEjNyQiMGN2JW9MXTVgISM2NyQ3JCQiMHdAclEhR1Q9ISM3JCIwWXc2JUhOQWAhIzY3JCQiMHUrIXo9R1Q9ISM3JCIwaXYuZDxHSyYhIzY3JDckJCIwNmdYPz84JT0hIzckIjAjWyc9XCR6TWAhIzY3JCQiMHUrIXo9R1Q9ISM3JCIwaXYuZDxHSyYhIzY3JDckJCIwNmdYPz84JT0hIzckIjAjWyc9XCR6TWAhIzY3JCQiMDhbNEhAOCU9ISM3JCIvPGNbPDhOYCEjNTckNyQkIi9rITQuZzglPSEjNiQiMD1gRC9Nc00mISM2NyQkIjA4WzRIQDglPSEjNyQiLzxjWzw4TmAhIzU3JDckJCIvayE0Lmc4JT0hIzYkIjA9YEQvTXNNJiEjNjckJCIwcCVbNjJPVD0hIzckIjAvMiMqKmVXWmAhIzY3JDckJCIwOiplaikqUlQ9ISM3JCIwYVRLZnUnZmAhIzY3JCQiMHAlWzYyT1Q9ISM3JCIwLzIjKiplV1pgISM2NyQ3JCQiMDoqZWopKlJUPSEjNyQiMGFUS2Z1J2ZgISM2NyQkIjByNyJRLFNUPSEjNyQiLy9LSSt3ZmAhIzU3JDckJCIwTnpNeUU5JT0hIzckIjApWyteLTNvYCEjNjckJCIwcjciUSxTVD0hIzckIi8vS0krd2ZgISM1NyQ3JCQiME56TXlFOSU9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMuI3o9d1Y9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaSJITG1JWD0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwYy4jej13Vj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBOek15RTklPSEjNyQiMClbK14tM29gISM2NyQkIjAvPSp6JlI5JT0hIzckIjBWb0Y2dT9QJiEjNjckNyQkIjBWVzRyUjklPSEjNyQiLypIUjk6QFAmISM1NyQkIjAvPSp6JlI5JT0hIzckIjBWb0Y2dT9QJiEjNjckNyQkIjBWVzRyUjklPSEjNyQiLypIUjk6QFAmISM1NyQkIjBiPVMvejklPSEjNyQiMDJHUDcpUSVRJiEjNjckNyQkIjAmKVwjeiZ6OSU9ISM3JCIwRT1ZcGJYUSYhIzY3JCQiMGI9Uy96OSU9ISM3JCIwMkdQNylRJVEmISM2NyQ3JCQiMCYpXCN6Jno5JT0hIzckIjBFPVlwYlhRJiEjNjckJCIwRTBVXj06JT0hIzckIjBlc142LW5SJiEjNjckNyQkIjBVJylRWD46JT0hIzckIjBpMWBDJypwUiYhIzY3JCQiMEUwVV49OiU9ISM3JCIwZXNeNi1uUiYhIzY3JDckJCIwVScpUVg+OiU9ISM3JCIwaTFgQycqcFImISM2NyQkIjBHJSlIKnpiVD0hIzckIjBIbSF6Zyw0YSEjNjckNyQkIjBXJlFQJGY6JT0hIzckIjApXCpmek8lNGEhIzY3JCQiMEclKUgqemJUPSEjNyQiMEhtIXpnLDRhISM2NyQ3JCQiMFcmUVAkZjolPSEjNyQiMClcKmZ6TyU0YSEjNjckJCIwI1s0enVmVD0hIzckIjAiPVg+K0xAYSEjNjckNyQkIjB6SSZHIypmVD0hIzckIjBNJG9ZdCg9VSYhIzY3JCQiMCNbNHp1ZlQ9ISM3JCIwIj1YPitMQGEhIzY3JDckJCIwekkmRyMqZlQ9ISM3JCIwTSRvWXQoPVUmISM2NyQkIjBHMEUocGpUPSEjNyQiMCgpNGgkUmtMYSEjNjckNyQkIjApM0hGIlI7JT0hIzckIi88UCgqeUpNYSEjNTckJCIwRzBFKHBqVD0hIzckIjAoKTRoJFJrTGEhIzY3JDckJCIwKTNIRiJSOyU9ISM3JCIvPFAoKnlKTWEhIzU3JCQiMGxyTVp3OyU9ISM3JCIwYSI9SHkmZlcmISM2NyQ3JCQiMCNcbUwhejslPSEjNyQiMDFnIVslZW5XJiEjNjckJCIwbHJNWnc7JT0hIzckIjBhIj1IeSZmVyYhIzY3JDckJCIwI1xtTCF6OyU9ISM3JCIwMWchWyVlblcmISM2NyQkIjAnWyhHKWZyVD0hIzckIjBFISlbcHIjZWEhIzY3JDckJCIwOFUqWyo9PCU9ISM3JCIwVVsoKSoqKT5mYSEjNjckJCIwJ1soRylmclQ9ISM3JCIwRSEpW3ByI2VhISM2NyQ3JCQiMDhVKlsqPTwlPSEjNyQiMFVbKCkqKik+ZmEhIzY3JCQiL2VhKVxiPCU9ISM2JCIweSJbU2JlcWEhIzY3JDckJCIwOF8xKCllPCU9ISM3JCIweU8lXCZSO1omISM2NyQkIi9lYSlcYjwlPSEjNiQiMHkiW1NiZXFhISM2NyQ3JCQiMDhfMSgpZTwlPSEjNyQiMHlPJVwmUjtaJiEjNjckJCIvPnZBXXpUPSEjNiQiMHc6KGUkKipHWyYhIzY3JDckJCIwX202ISkpelQ9ISM3JCIwOUQsNSEzJVsmISM2NyQkIi8+dkFdelQ9ISM2JCIwdzooZSQqKkdbJiEjNjckNyQkIjBfbTYhKSl6VD0hIzckIjA5RCw1ITMlWyYhIzY3JCQiMGk1VmJNPSU9ISM3JCIwKlFQYEpAJlwmISM2NyQ3JCQiMHAiSFIoUT0lPSEjNyQiL04iM2w/bFwmISM1NyQkIjBpNVZiTT0lPSEjNyQiMCpRUGBKQCZcJiEjNjckNyQkIjBwIkhSKFE9JT0hIzckIjBeODNsP2xcJiEjNjckJCIwcF1WNHU9JT0hIzckIjApcCQzI3BfMmIhIzY3JDckJCIwWG1ob3k9JT0hIzckIjAnPV0sNycqM2IhIzY3JCQiMHBdVjR1PSU9ISM3JCIwKXAkMyNwXzJiISM2NyQ3JCQiMFhtaG95PSU9ISM3JCIwJz1dLDcnKjNiISM2NyQkIjBDKmZTTyI+JT0hIzckIjAkSFJvMSUpPmIhIzY3JDckJCIwLmgnUic9PiU9ISM3JCIwQiE+XzxTQGIhIzY3JCQiMEMqZlNPIj4lPSEjNyQiMCRIUm8xJSk+YiEjNjckNyQkIjAuaCdSJz0+JT0hIzckIjBCIT5fPFNAYiEjNjckJCIwanVhPmA+JT0hIzckIjBIKEcpUWFAYCYhIzY3JDckJCIwYy4+Z2U+JT0hIzckIjBmeUdJVVFgJiEjNjckJCIwanVhPmA+JT0hIzckIjBIKEcpUWFAYCYhIzY3JDckJCIwYy4+Z2U+JT0hIzckIjBmeUdJVVFgJiEjNjckJCIwLDRtdiMqPiU9ISM3JCIwWzciKTNvV2EmISM2NyQ3JCQiMDJhMWQpKj4lPSEjNyQiMCZwY2BHR1liISM2NyQkIjAsNG12Iyo+JT0hIzckIjBbNyIpM29XYSYhIzY3JDckJCIwMmExZCkqPiU9ISM3JCIwJnBjYEdHWWIhIzY3JCQiME8mPkVCLlU9ISM3JCIvcCQzdyJ5Y2IhIzU3JDckJCIwTEMiWyZRPyU9ISM3JCIwSmJVU0IoZWIhIzY3JCQiME8mPkVCLlU9ISM3JCIvcCQzdyJ5Y2IhIzU3JDckJCIwTEMiWyZRPyU9ISM3JCIwSmJVU0IoZWIhIzY3JCQiMFhISiE+MlU9ISM3JCIvNis1YTRwYiEjNTckNyQkIjBGPE1geT8lPSEjNyQiMG5WXCZSO3JiISM2NyQkIjBYSEohPjJVPSEjNyQiLzYrNWE0cGIhIzU3JDckJCIwRjxNYHk/JT0hIzckIjBuVlwmUjtyYiEjNjckJCIwJHBvKVs2QCU9ISM3JCIwJVteSiE0OWUmISM2NyQ3JCQiMHhycl89QCU9ISM3JCIwLktjXS9PZSYhIzY3JCQiMCRwbylbNkAlPSEjNyQiMCVbXkohNDllJiEjNjckNyQkIjB4cnJfPUAlPSEjNyQiMC5LY10vT2UmISM2NyQkIjAzOS4zXkAlPSEjNyQiMFdtTmpBUGYmISM2NyQ3JCQiMCwseF9lQCU9ISM3JCIwUj9qMFhnZiYhIzY3JCQiMDM5LjNeQCU9ISM3JCIwV21OakFQZiYhIzY3JDckJCIwLCx4X2VAJT0hIzckIjBSP2owWGdmJiEjNjckJCIwKnlgejE+VT0hIzckIjB2ZjdAT2dnJiEjNjckNyQkIjBiZ2VgKT5VPSEjNyQiMHYzcWcmWzNjISM2NyQkIjAqeWB6MT5VPSEjNyQiMHZmN0BPZ2cmISM2NyQ3JCQiMGJnZWApPlU9ISM3JCIwdjNxZyZbM2MhIzY3JCQiMEdXckdJQSU9ISM3JCIwc3U/d1wkPWMhIzY3JDckJCIwL1JIYlFBJT0hIzckIjA2KHBkaCM0aSYhIzY3JCQiMEdXckdJQSU9ISM3JCIwc3U/d1wkPWMhIzY3JDckJCIwL1JIYlFBJT0hIzckIjA2KHBkaCM0aSYhIzY3JCQiMG9yQiEqcEElPSEjNyQiL0xYKUdqMWomISM1NyQ3JCQiMDlqdGR5QSU9ISM3JCIwWiZRM25PTGMhIzY3JCQiMG9yQiEqcEElPSEjNyQiL0xYKUdqMWomISM1NyQ3JCQiMDlqdGR5QSU9ISM3JCIwWiZRM25PTGMhIzY3JCQiMGt4WV80QiU9ISM3JCIwIls4I3p3SGsmISM2NyQ3JCQiMCRcbzQnPUIlPSEjNyQiMCRRMmZzIWVrJiEjNjckJCIwa3hZXzRCJT0hIzckIjAiWzgjendIayYhIzY3JDckJCIwJFxvNCc9QiU9ISM3JCIwJFEyZnMhZWsmISM2NyQkIjAxSFk6XEIlPSEjNyQiMF4sOEYhSGJjISM2NyQ3JCQiMCZRalwnZUIlPSEjNyQiMD5pKDR5Q2VjISM2NyQkIjAxSFk6XEIlPSEjNyQiMF4sOEYhSGJjISM2NyQ3JCQiMCZRalwnZUIlPSEjNyQiMD5pKDR5Q2VjISM2NyQkIjAjeSU+eilRVT0hIzckIjBAWG9zLndtJiEjNjckNyQkIjA6NHNwKVJVPSEjNyQiMGJdL08pb3FjISM2NyQkIjAjeSU+eilRVT0hIzckIjBAWG9zLndtJiEjNjckNyQkIjA6NHNwKVJVPSEjNyQiMGJdL08pb3FjISM2NyQkIjA3TG1WR0MlPSEjNyQiMFdvKGVyIip6YyEjNjckNyQkIjAxNUN2UUMlPSEjNyQiMCIqUTYiKkdKbyYhIzY3JCQiMDdMbVZHQyU9ISM3JCIwV28oZXIiKnpjISM2NyQ3JCQiMDE1Q3ZRQyU9ISM3JCIwIipRNiIqR0pvJiEjNjckJCIwPCVvKTNvQyU9ISM3JCIwdnRxY0lBcCYhIzY3JDckJCIvZUI6KXlDJT0hIzYkIjBGRj1ZcGJwJiEjNjckJCIwPCVvKTNvQyU9ISM3JCIwdnRxY0lBcCYhIzY3JDckJCIvZUI6KXlDJT0hIzYkIjBGRj1ZcGJwJiEjNjckJCIwbT8hXHhdVT0hIzckIjBBNylbUmEvZCEjNjckNyQkIjB0dXApKT1EJT0hIzckIjBqOkQsNSEzZCEjNjckJCIwbT8hXHhdVT0hIzckIjBBNylbUmEvZCEjNjckNyQkIjB0dXApKT1EJT0hIzckIjBqOkQsNSEzZCEjNjckJCIwSGNoVFpEJT0hIzckIjBjXCgzdCZvciYhIzY3JDckJCIveS9sKmVEJT0hIzYkIjAqUj9qMFg/ZCEjNjckJCIwSGNoVFpEJT0hIzckIjBjXCgzdCZvciYhIzY3JDckJCIveS9sKmVEJT0hIzYkIjAqUj9qMFg/ZCEjNjckJCIwNiU+IjQoZVU9ISM3JCIwIipbTGtxIkhkISM2NyQ3JCQiMFZLPzAqZlU9ISM3JCIwTiMqUTYiKkd0JiEjNjckJCIwNiU+IjQoZVU9ISM3JCIwIipbTGtxIkhkISM2NyQ3JCQiMFZLPzAqZlU9ISM3JCIwTiMqUTYiKkd0JiEjNjckJCIwcyIzdG5pVT0hIzckIjB2JSlmJlJbVGQhIzY3JDckJCIwYV9kOVJFJT0hIzckIjByIWVrO0xYZCEjNjckJCIwcyIzdG5pVT0hIzckIjB2JSlmJlJbVGQhIzY3JDckJCIwYV9kOVJFJT0hIzckIjByIWVrO0xYZCEjNjckJCIwTURLWW1FJT0hIzckIjAyW0BDKHpgZCEjNjckNyQkIjA3JCp6Q3pFJT0hIzckIjAycF9Ac3h2JiEjNjckJCIwTURLWW1FJT0hIzckIjAyW0BDKHpgZCEjNjckNyQkIjA3JCp6Q3pFJT0hIzckIjAycF9Ac3h2JiEjNjckJCIwKClIMjsxRiU9ISM3JCIuNFpdNWh3JiEiKjckNyQkIjAmUSZ5Tj5GJT0hIzckIjBWZGZ3Ny14JiEjNjckJCIwKClIMjsxRiU9ISM3JCIuNFpdNWh3JiEiKjckNyQkIjAmUSZ5Tj5GJT0hIzckIjBWZGZ3Ny14JiEjNjckJCIwXyVmbGV1VT0hIzckIjAycU91QiV5ZCEjNjckNyQkIjAnUkx2JWZGJT0hIzckIjB6WG1KYEV5JiEjNjckJCIwXyVmbGV1VT0hIzckIjAycU91QiV5ZCEjNjckNyQkIjAnUkx2JWZGJT0hIzckIjB6WG1KYEV5JiEjNjckJCIwXD15ZCZ5VT0hIzckIjAjUS5mcHQheiYhIzY3JDckJCIwcikpM2cqelU9ISM3JCIwOk10J1E0JnomISM2NyQkIjBcPXlkJnlVPSEjNyQiMCNRLmZwdCF6JiEjNjckNyQkIjByKSkzZyp6VT0hIzckIjA6TXQnUTQmeiYhIzY3JCQiLzMneUhERyU9ISM2JCIwWUckXCwwLmUhIzY3JDckJCIwZj1PdFJHJT0hIzckIjBeQSE9V2AyZSEjNjckJCIvMyd5SERHJT0hIzYkIjBZRyRcLDAuZSEjNjckNyQkIjBmPU90UkclPSEjNyQiMF5BIT1XYDJlISM2NyQkIjA0OVstbEclPSEjNyQiME9qdUpqYCJlISM2NyQ3JCQiMEFbVygpekclPSEjNyQiMCkzcm9cKCo+ZSEjNjckJCIwNDlbLWxHJT0hIzckIjBPanVKamAiZSEjNjckNyQkIjBBW1coKXpHJT0hIzckIjApM3JvXCgqPmUhIzY3JCQiMEI1J2ZaIUglPSEjNyQiMGJdL1l3dyNlISM2NyQ3JCQiMCNbVUErI0glPSEjNyQiMEMqUj5iVEtlISM2NyQkIjBCNSdmWiFIJT0hIzckIjBiXS9Zd3cjZSEjNjckNyQkIjAjW1VBKyNIJT0hIzckIjBDKlI+YlRLZSEjNjckJCIwcCpHLFglSCU9ISM3JCIwcm04ZSopKlJlISM2NyQ3JCQiMEZFJnksJ0glPSEjNyQiL3czcWcmWyVlISM1NyQkIjBwKkcsWCVIJT0hIzckIjBybThlKikqUmUhIzY3JDckJCIwRkUmeSwnSCU9ISM3JCIvdzNxZyZbJWUhIzU3JCQiMF5PM0QlKUglPSEjNyQiMGRjcW4tQiZlISM2NyQ3JCQiMDpwQU0rSSU9ISM3JCIwJ2Z4P21IZGUhIzY3JCQiMF5PM0QlKUglPSEjNyQiMGRjcW4tQiZlISM2NyQ3JCQiMDpwQU0rSSU9ISM3JCIwJ2Z4P21IZGUhIzY3JCQiMCxreCtDSSU9ISM3JCIwaCEzXGRoa2UhIzY3JDckJCIvRmw4MC9WPSEjNiQiMEtrOTxQKHBlISM2NyQkIjAsa3grQ0klPSEjNyQiMGghM1xkaGtlISM2NyQ3JCQiL0ZsODAvVj0hIzYkIjBLazk8UChwZSEjNjckJCIwbDNHeGpJJT0hIzckIjBXeF16R3AoZSEjNjckNyQkIi9hVCRwITNWPSEjNiQiMG9fQHN4QCllISM2NyQkIjBsM0d4akklPSEjNyQiMFd4XXpHcChlISM2NyQ3JCQiL2FUJHAhM1Y9ISM2JCIwb19Ac3hAKWUhIzY3JCQiMDIjW1dONVY9ISM3JCIwVz4pPj1DKillISM2NyQ3JCQiMGlrKykzN1Y9ISM3JCIwL1RHRj1ZKmUhIzY3JCQiMDIjW1dONVY9ISM3JCIwVz4pPj1DKillISM2NyQ3JCQiMGlrKykzN1Y9ISM3JCIwL1RHRj1ZKmUhIzY3JCQiL1FgQkw5Vj0hIzYkIjA+LjQjW2IsZiEjNjckNyQkIjBDX1YyaEolPSEjNyQiLyVITiMpZXEhZiEjNTckJCIvUWBCTDlWPSEjNiQiMD4uNCNbYixmISM2NyQ3JCQiMENfVjJoSiU9ISM3JCIvJUhOIyllcSFmISM1NyQkIjAzaio0Sj1WPSEjNyQiMEJKJCl6blEiZiEjNjckNyQkIjBaeGlGLEslPSEjNyQiMHc8VVAqXD5mISM2NyQkIjAzaio0Sj1WPSEjNyQiMEJKJCl6blEiZiEjNjckNyQkIjBaeGlGLEslPSEjNyQiMHc8VVAqXD5mISM2NyQkIjAmUlgvSEFWPSEjNyQiMDs1KlwyPUVmISM2NyQ3JCQiL3o3KFtUSyU9ISM2JCIwNzFcIypSPiRmISM2NyQkIjAmUlgvSEFWPSEjNyQiMDs1KlwyPUVmISM2NyQ3JCQiL3o3KFtUSyU9ISM2JCIwNzFcIypSPiRmISM2NyQkIjBARWlxaUslPSEjNyQiMGxUInlPXFFmISM2NyQ3JCQiMDBFVnEiR1Y9ISM3JCIwWyVmdi9RV2YhIzY3JCQiMEBFaXFpSyU9ISM3JCIwbFQieU9cUWYhIzY3JDckJCIwMEVWcSJHVj0hIzckIjBbJWZ2L1FXZiEjNjckJCIwTiR5OURJVj0hIzckIjB5PFllMTMmZiEjNjckNyQkIjBhZiJIPktWPSEjNyQiMCVHR0U1I28mZiEjNjckJCIwTiR5OURJVj0hIzckIjB5PFllMTMmZiEjNjckNyQkIjBhZiJIPktWPSEjNyQiMCVHR0U1I28mZiEjNjckJCIwKVtySUJNVj0hIzckIjBFW3VZPkonZiEjNjckNyQkIjBAcUE7aUwlPSEjNyQiLzcocGRoI3BmISM1NyQkIjApW3JJQk1WPSEjNyQiMEVbdVk+SidmISM2NyQ3JCQiMEBxQTtpTCU9ISM3JCIvNyhwZGgjcGYhIzU3JCQiMCpcSGJAUVY9ISM3JCIwW1pES0thKGYhIzY3JDckJCIwbjxJUy1NJT0hIzckIjBjZnc3LTwpZiEjNjckJCIwKlxIYkBRVj0hIzckIjBbWkRLS2EoZiEjNjckNyQkIjBuPElTLU0lPSEjNyQiMGNmdzctPClmISM2NyQkIjAjSChmKT5VVj0hIzckIjBQJTRlXnUoKWYhIzY3JDckJCIwJj1VXkVXVj0hIzckIjAjek15RTklKmYhIzY3JCQiMCNIKGYpPlVWPSEjNyQiMFAlNGVedSgpZiEjNjckNyQkIjAmPVVeRVdWPSEjNyQiMCN6TXlFOSUqZiEjNjckJCIwZSJwQz1ZVj0hIzckIjAtZnknejArZyEjNjckNyQkIjBSLW8hSFtWPSEjNyQiMEdPIUhLZTFnISM2NyQkIjBlInBDPVlWPSEjNyQiMC1meSd6MCtnISM2NyQ3JCQiMFItbyFIW1Y9ISM3JCIwR08hSEtlMWchIzY3JCQiMChlN3E7XVY9ISM3JCIwTCE0YzJQN2chIzY3JDckJCIwVzUwPEJOJT0hIzckIjBrQyh6UC0+ZyEjNjckJCIwKGU3cTtdVj0hIzckIjBMITRjMlA3ZyEjNjckNyQkIjBXNTA8Qk4lPSEjNyQiMGtDKHpQLT5nISM2NyQkIjBaRE9fVE4lPSEjNyQiMGlnJT1Ob0NnISM2NyQ3JCQiMGttNldqTiU9ISM3JCIuOC9MazkuJyEiKjckJCIwWkRPX1ROJT0hIzckIjBpZyU9Tm9DZyEjNjckNyQkIjBrbTZXak4lPSEjNyQiLjgvTGs5LichIio3JCQiLjhRUSJlVj0hIzUkIjBSJ1FmaSpwLichIzY3JDckJCIwYHYscy5PJT0hIzckIjBPLDYpWyFSLychIzY3JCQiLjhRUSJlVj0hIzUkIjBSJ1FmaSpwLichIzY3JDckJCIwYHYscy5PJT0hIzckIjBPLDYpWyFSLychIzY3JCQiMFQhNF83aVY9ISM3JCIwTXNWKCozJFxnISM2NyQ3JCQiMFAvaCtXTyU9ISM3JCIwcyp5SmFNY2chIzY3JCQiMFQhNF83aVY9ISM3JCIwTXNWKCozJFxnISM2NyQ3JCQiMFAvaCtXTyU9ISM3JCIwcyp5SmFNY2chIzY3JCQiMC9HcTdoTyU9ISM3JCIwaS0hbztpaGchIzY3JDckJCIwMTYvSSVvVj0hIzckIjAzeUMpZnlvZyEjNjckJCIwL0dxN2hPJT0hIzckIjBpLSFvO2loZyEjNjckNyQkIjAxNi9JJW9WPSEjNyQiMDN5QylmeW9nISM2NyQkIjA5ITM1NXFWPSEjNyQiMEQ5Y0xNUjInISM2NyQ3JCQiMEBzQmdDUCU9ISM3JCIwV21KYEU3MychIzY3JCQiMDkhMzU1cVY9ISM3JCIwRDljTE1SMichIzY3JDckJCIwQHNCZ0NQJT0hIzckIjBXbUpgRTczJyEjNjckJCIwJlxfKzR1Vj0hIzckIjBeQCZ6cEMnMychIzY3JDckJCIwKTRANlx3Vj0hIzckIi9bJlEzbk80JyEjNTckJCIwJlxfKzR1Vj0hIzckIjBeQCZ6cEMnMychIzY3JDckJCIwKTRANlx3Vj0hIzckIi9bJlEzbk80JyEjNTckJCIvJSllKHoheVY9ISM2JCIwVDFBZ2YmKTQnISM2NyQ3JCQiMFRsJUdfIVElPSEjNyQiMDtWWGoyaDUnISM2NyQkIi8lKWUoeiF5Vj0hIzYkIjBUMUFnZiYpNCchIzY3JDckJCIwVGwlR18hUSU9ISM3JCIwO1ZYajJoNSchIzY3JCQiMEAuR3E/USU9ISM3JCIwUGEoKT5zMzYnISM2NyQ3JCQiMEJwRGJYUSU9ISM3JCIwYEpfPVsmPWghIzY3JCQiMEAuR3E/USU9ISM3JCIwUGEoKT5zMzYnISM2NyQ3JCQiMEJwRGJYUSU9ISM3JCIwYEpfPVsmPWghIzY3JCQiMChSODkxJ1ElPSEjNyQiMCg9cHZaPUJoISM2NyQ3JCQiMFJVWSllKVElPSEjNyQiMCopPmZ0KSk0OCchIzY3JCQiMChSODkxJ1ElPSEjNyQiMCg9cHZaPUJoISM2NyQ3JCQiMFJVWSllKVElPSEjNyQiMCopPmZ0KSk0OCchIzY3JCQiMHlHVGArUiU9ISM3JCIwWVtbSyhcTmghIzY3JDckJCIwa0BTQUVSJT0hIzckIjBEM21HSE05JyEjNjckJCIweUdUYCtSJT0hIzckIjBZW1tLKFxOaCEjNjckNyQkIjBrQFNBRVIlPSEjNyQiMEQzbUdITTknISM2NyQkIjAyUS1ZU1IlPSEjNyQiMEgqUmEpNHk5JyEjNjckNyQkIjBCQTlkbVIlPSEjNyQiMGgnSFApcGU6JyEjNjckJCIwMlEtWVNSJT0hIzckIjBIKlJhKTR5OSchIzY3JDckJCIwQkE5ZG1SJT0hIzckIjBoJ0hQKXBlOichIzY3JCQiMHk0XVIhKVIlPSEjNyQiMFx1aE5BLDsnISM2NyQ3JCQiMCpRMkVwK1c9ISM3JCIwKFwpelE1JG9oISM2NyQkIjB5NF1SISlSJT0hIzckIjBcdWhOQSw7JyEjNjckNyQkIjAqUTJFcCtXPSEjNyQiMChcKXpRNSRvaCEjNjckJCIvWCplTD9TJT0hIzYkIjBrWyRRW1ZzaCEjNjckNyQkIjAjKil6KUdaUyU9ISM3JCIwTHQnUTR2IT0nISM2NyQkIi9YKmVMP1MlPSEjNiQiMGtbJFFbVnNoISM2NyQ3JCQiMCMqKXopR1pTJT0hIzckIjBMdCdRNHYhPSchIzY3JCQiMG1JXUdnUyU9ISM3JCIwIlwxJUhaWj0nISM2NyQ3JCQiMFk6JGV3M1c9ISM3JCIwcGgkKlsiPiQ+JyEjNjckJCIwbUldR2dTJT0hIzckIjAiXDElSFpaPSchIzY3JDckJCIwWTokZXczVz0hIzckIjBwaCQqWyI+JD4nISM2NyQkIi4oNFQtNVc9ISM1JCIwIipmdnNmcT4nISM2NyQ3JCQiMDNxZS5HVCU9ISM3JCIwMF0rL0tjPychIzY3JCQiLig0VC01Vz0hIzUkIjAiKmZ2c2ZxPichIzY3JDckJCIwM3FlLkdUJT0hIzckIjAwXSsvS2M/JyEjNjckJCIwLlJUP1NUJT0hIzckIi94b1FAUDRpISM1NyQ3JCQiMDh3OlVvVCU9ISM3JCIwVFEyZnMhPWkhIzY3JCQiMC5SVD9TVCU9ISM3JCIveG9RQFA0aSEjNTckNyQkIjA4dzpVb1QlPSEjNyQiMFRRMmZzIT1pISM2NyQkIjBhKjR2LD1XPSEjNyQiMEREV18lb0BpISM2NyQ3JCQiMDRuTyIpM1UlPSEjNyQiMHhFOTk4MEInISM2NyQkIjBhKjR2LD1XPSEjNyQiMEREV18lb0BpISM2NyQ3JCQiMDRuTyIpM1UlPSEjNyQiMHhFOTk4MEInISM2NyQkIjBcTkg6P1UlPSEjNyQiMDE8IikpbypSQichIzY3JDckJCIwWCF5OCNcVSU9ISM3JCIwODpAcGBIQychIzY3JCQiMFxOSDo/VSU9ISM3JCIwMTwiKSlvKlJCJyEjNjckNyQkIjBYIXk4I1xVJT0hIzckIjA4OkBwYEhDJyEjNjckJCIwNmEiUSxFVz0hIzckIjBvTyJHIzRqQychIzY3JDckJCIweVA6aSpHVz0hIzckIjBcLkdDJVJiaSEjNjckJCIwNmEiUSxFVz0hIzckIjBvTyJHIzRqQychIzY3JDckJCIweVA6aSpHVz0hIzckIjBcLkdDJVJiaSEjNjckJCIwOkMvOCtWJT0hIzckIjBHWWJhQCdlaSEjNjckNyQkIjBNOW0uSVYlPSEjNyQiMCY9XCR6TXlFJyEjNjckJCIwOkMvOCtWJT0hIzckIjBHWWJhQCdlaSEjNjckNyQkIjBNOW0uSVYlPSEjNyQiMCY9XCR6TXlFJyEjNjckJCIwJCo9LzhTViU9ISM3JCIwJW89UVEkNEYnISM2NyQ3JCQiMHpxJ2YvUFc9ISM3JCIwQCE9V2BGIUcnISM2NyQkIjAkKj0vOFNWJT0hIzckIjAlbz1RUSQ0RichIzY3JDckJCIwenEnZi9QVz0hIzckIjBAIT1XYEYhRychIzY3JCQiMCgpKltQLFFXPSEjNyQiMDJRIjNoQyRHJyEjNjckNyQkIjAiPTIhKjNUVz0hIzckIjBkb1sqZXIjSCchIzY3JCQiMCgpKltQLFFXPSEjNyQiMDJRIjNoQyRHJyEjNjckNyQkIjAiPTIhKjNUVz0hIzckIjBkb1sqZXIjSCchIzY3JCQiMG5tPjo/VyU9ISM3JCIwd1VWTmViSCchIzY3JDckJCIvdDhGOFhXPSEjNiQiMCRwYlhrOjBqISM2NyQkIjBubT46P1clPSEjNyQiMHdVVk5lYkgnISM2NyQ3JCQiL3Q4RjhYVz0hIzYkIjAkcGJYazowaiEjNjckJCIwcF9HPGdXJT0hIzckIjBmJyoqejAoeUknISM2NyQ3JCQiMCMpZkd4IlxXPSEjNyQiMEhYaSpwZjxqISM2NyQkIjBwX0c8Z1clPSEjNyQiMGYnKip6MCh5SSchIzY3JDckJCIwIylmR3giXFc9ISM3JCIwSFhpKnBmPGohIzY3JCQiMHpEQD8rWCU9ISM3JCIwbWQoeUY9P2ohIzY3JDckJCIwYT1fQUtYJT0hIzckIjBsTHBhUCtMJyEjNjckJCIwekRAPytYJT0hIzckIjBtZCh5Rj0/aiEjNjckNyQkIjBhPV9BS1glPSEjNyQiMGxMcGFQK0wnISM2NyQkIjBNIXlQLWFXPSEjNyQiL3AwZFxcS2ohIzU3JDckJCIwY2Zpb3NYJT0hIzckIjAsQXc0eUNNJyEjNjckJCIwTSF5UC1hVz0hIzckIi9wMGRcXEtqISM1NyQ3JCQiMGNmaW9zWCU9ISM3JCIwLEF3NHlDTSchIzY3JCQiLyMzO0chZVc9ISM2JCIwJSlbIjRyIVtNJyEjNjckNyQkIi8meU86OFklPSEjNiQiMFA1JFsnPVxOJyEjNjckJCIvIzM7RyFlVz0hIzYkIjAlKVsiNHIhW00nISM2NyQ3JCQiLyZ5Tzo4WSU9ISM2JCIwUDUkWyc9XE4nISM2NyQkIjAxOz1MP1klPSEjNyQiMGgkeVMjPnJOJyEjNjckNyQkIjBmaChHT2xXPSEjNyQiMHQpKiopPmZ0TychIzY3JCQiMDE7PUw/WSU9ISM3JCIwaCR5UyM+ck4nISM2NyQ3JCQiMGZoKEdPbFc9ISM3JCIwdCkqKik+ZnRPJyEjNjckJCIwT1AnKlFnWSU9ISM3JCIwRDEhWzhWcGohIzY3JDckJCIwRDY8NiVwVz0hIzckIjA0KG9cKCp6emohIzY3JCQiME9QJypRZ1klPSEjNyQiMEQxIVs4VnBqISM2NyQ3JCQiMEQ2PDYlcFc9ISM3JCIwNChvXCgqenpqISM2NyQkIjAjUmphL3FXPSEjNyQiMHpAQVZWPFEnISM2NyQ3JCQiMClwNS1ZdFc9ISM3JCIwWHYuSVNBUichIzY3JCQiMCNSamEvcVc9ISM3JCIwekBBVlY8USchIzY3JDckJCIwKXA1LVl0Vz0hIzckIjBYdi5JU0FSJyEjNjckJCIwVldvX1NaJT0hIzckIjA4MUxcYlNSJyEjNjckNyQkIjBOKSkqKjR2WiU9ISM3JCIwIlExXjNvL2shIzY3JCQiMFZXb19TWiU9ISM3JCIwODFMXGJTUichIzY3JDckJCIwTikpKio0dlolPSEjNyQiMCJRMV4zby9rISM2NyQkIi9IbDExeVc9ISM2JCIwKHotSXZPMWshIzY3JDckJCIvMXMwYyJbJT0hIzYkIjA9XzxTQHJUJyEjNjckJCIvSGwxMXlXPSEjNiQiMCh6LUl2TzFrISM2NyQ3JCQiLzFzMGMiWyU9ISM2JCIwPF88U0ByVCchIzY3JCQiMDYrUHA/WyU9ISM3JCIwOlJOYXonPWshIzY3JDckJCIwakV5NmNbJT0hIzckIjBhU0MmPmNIayEjNjckJCIwNitQcD9bJT0hIzckIjA6Uk5heic9ayEjNjckNyQkIjBqRXk2Y1slPSEjNyQiMGFTQyY+Y0hrISM2NyQkIjBVIT4oeWdbJT0hIzckIjAlM1JPOio0VichIzY3JDckJCIwLXopUW0qWyU9ISM3JCIvKkdKXS0/VychIzU3JCQiMFUhPih5Z1slPSEjNyQiMCUzUk86KjRWJyEjNjckNyQkIjAteilRbSpbJT0hIzckIi8qR0pdLT9XJyEjNTckJCIwOGUhKikzIVwlPSEjNyQiLzNRLU5JVmshIzU3JDckJCIweS5qO1BcJT0hIzckIjBFPFEwVldYJyEjNjckJCIwOGUhKikzIVwlPSEjNyQiLzNRLU5JVmshIzU3JDckJCIweS5qO1BcJT0hIzckIjBFPFEwVldYJyEjNjckJCIwJFs+KCo0JVwlPSEjNyQiMGBwI1thaGJrISM2NyQ3JCQiL29RLHgoXCU9ISM2JCIwaTBYZyQpb1knISM2NyQkIjAkWz4oKjQlXCU9ISM3JCIwYHAjW2FoYmshIzY3JDckJCIvb1EseChcJT0hIzYkIjBpMFhnJClvWSchIzY3JCQiMCYqPkU2IilcJT0hIzckIjBMKXlxdCN6WSchIzY3JDckJCIwckpTQz1dJT0hIzckIjApUj5iVEt6ayEjNjckJCIwJio+RTYiKVwlPSEjNyQiMEwpeXF0I3pZJyEjNjckNyQkIjBySlNDPV0lPSEjNyQiMClSPmJUS3prISM2NyQkIi8mZmJCQF0lPSEjNiQiMFc3I3AjUi1bJyEjNjckNyQkIjBaVVd6ZV0lPSEjNyQiME0jKWVxazxcJyEjNjckJCIvJmZiQkBdJT0hIzYkIjBXNyNwI1ItWychIzY3JDckJCIwWlVXemVdJT0hIzckIjBNIyllcWs8XCchIzY3JCQiMEU3ZU9oXSU9ISM3JCIwNyg9VzZiI1wnISM2NyQ3JCQiMCdHQV4kKjRYPSEjNyQiLzJkY18/L2whIzU3JCQiMEU3ZU9oXSU9ISM3JCIwNyg9VzZiI1wnISM2NyQ3JCQiMCdHQV4kKjRYPSEjNyQiLzJkY18/L2whIzU3JCQiMGB5QV0sXiU9ISM3JCIwW1EjKipIJ1tdJyEjNjckNyQkIjBwKilvIipSXiU9ISM3JCIwMWZzIWVrO2whIzY3JCQiMGB5QV0sXiU9ISM3JCIwW1EjKipIJ1tdJyEjNjckNyQkIjBwKilvIipSXiU9ISM3JCIwMWZzIWVrO2whIzY3JCQiMHgsdGtUXiU9ISM3JCIwS19vI1s8PGwhIzY3JDckJCIwbF4qKVshPVg9ISM3JCIwVVp6TiczSGwhIzY3JCQiMHgsdGtUXiU9ISM3JCIwS19vI1s8PGwhIzY3JDckJCIwbF4qKVshPVg9ISM3JCIwVVp6TiczSGwhIzY3JCQiMC55Jil6Ij1YPSEjNyQiMDo7V2onW0hsISM2NyQ3JCQiMHdBKG81QVg9ISM3JCIweU4nM3BfVGwhIzY3JCQiMC55Jil6Ij1YPSEjNyQiMDo7V2onW0hsISM2NyQ3JCQiMHdBKG81QVg9ISM3JCIweU4nM3BfVGwhIzY3JCQiL3NAZD5BWD0hIzYkIjA8ciQ9JSl6VGwhIzY3JDckJCIwNEtobGhfJT0hIzckIjA5QyRmdSdSYichIzY3JCQiL3NAZD5BWD0hIzYkIjA8ciQ9JSl6VGwhIzY3JDckJCIwNEtobGhfJT0hIzckIjA5QyRmdSdSYichIzY3JCQiMGxzSzdpXyU9ISM3JCIwRVkmeSw2YWwhIzY3JDckJCIwdD83RC1gJT0hIzckIi9ELDUhM2tjJyEjNTckJCIwbHNLN2lfJT0hIzckIjBFWSZ5LDZhbCEjNjckNyQkIjB0PzdELWAlPSEjNyQiL0QsNSEza2MnISM1NyQkIi9PdSdILWAlPSEjNiQiMChRJVwiPlVtbCEjNjckNyQkIjBpIkhMbUlYPSEjNyQiMCRmdWwxdm5sISM2NyQkIi9PdSdILWAlPSEjNiQiMChRJVwiPlVtbCEjNjckNyQkIjBpIkhMbUlYPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAjZSxIPGtaPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMClRNSRbJz1cPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAjZSxIPGtaPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGkiSExtSVg9ISM3JCIwJGZ1bDF2bmwhIzY3JCQiMHAzVFxVYCU9ISM3JCIwN0VaZEwoeWwhIzY3JDckJCIwOypRb0dNWD0hIzckIjAnM3FnJlspeWwhIzY3JCQiMHAzVFxVYCU9ISM3JCIwN0VaZEwoeWwhIzY3JDckJCIwOypRb0dNWD0hIzckIjAnM3FnJlspeWwhIzY3JCQiLlE1cSNRWD0hIzUkIjA7VFE/WDVmJyEjNjckNyQkIjBDNV5cJFFYPSEjNyQiMEEqUTYiKkciZichIzY3JCQiLlE1cSNRWD0hIzUkIjA7VFE/WDVmJyEjNjckNyQkIjBDNV5cJFFYPSEjNyQiMEEqUTYiKkciZichIzY3JCQiMHVXYCJIVVg9ISM3JCIvM0k0b04ubSEjNTckNyQkIjBvQSZIVFVYPSEjNyQiMGV4P21IUGcnISM2NyQkIjB1V2AiSFVYPSEjNyQiLzNJNG9OLm0hIzU3JDckJCIwb0EmSFRVWD0hIzckIjBleD9tSFBnJyEjNjckJCIwRyI0UEpZWD0hIzckIi9eITRSb2NoJyEjNTckNyQkIi84Y3JaWVg9ISM2JCIwJWZ3Ny08O20hIzY3JCQiMEciNFBKWVg9ISM3JCIvXiE0Um9jaCchIzU3JDckJCIvOGNyWllYPSEjNiQiMCVmdzctPDttISM2NyQkIjBLKD1tTF1YPSEjNyQiMGRWKlsqenppJyEjNjckNyQkIjAkM0RAYV1YPSEjNyQiL1ZYajJoR20hIzU3JCQiMEsoPW1MXVg9ISM3JCIwZFYqWyp6emknISM2NyQ3JCQiMCQzREBhXVg9ISM3JCIvVlhqMmhHbSEjNTckJCIwI1taLE9hWD0hIzckIjBXSHJbIkhTbSEjNjckNyQkIjBVJFF4Z2FYPSEjNyQiMG1VVEpeNWsnISM2NyQkIjAjW1osT2FYPSEjNyQiMFdIclsiSFNtISM2NyQ3JCQiMFUkUXhnYVg9ISM3JCIwbVVUSl41aychIzY3JCQiMCRcPFdRZVg9ISM3JCIwNlo6Ky5FbCchIzY3JDckJCIwXCM+VG5lWD0hIzckIjAtSlsnPVxgbSEjNjckJCIwJFw8V1FlWD0hIzckIjA2WjorLkVsJyEjNjckNyQkIjBcIz5UbmVYPSEjNyQiMC1KWyc9XGBtISM2NyQkIi9wRyU0Q2MlPSEjNiQiMC4qPiNcOVxtJyEjNjckNyQkIjBHeEVURmMlPSEjNyQiMFE+YlRLZm0nISM2NyQkIi9wRyU0Q2MlPSEjNiQiMC4qPiNcOVxtJyEjNjckNyQkIjBHeEVURmMlPSEjNyQiMFE+YlRLZm0nISM2NyQkIjAmKjQ9TmtjJT0hIzckIjBuKDNmZkF4bSEjNjckNyQkIjBAPDw0b2MlPSEjNyQiMHUyaSdIUHltISM2NyQkIjAmKjQ9TmtjJT0hIzckIjBuKDNmZkF4bSEjNjckNyQkIjBAPDw0b2MlPSEjNyQiMHUyaSdIUHltISM2NyQkIjB1N21oL2QlPSEjNyQiMD5NRVNQJipvJyEjNjckNyQkIjBWLyV5KDNkJT0hIzckIi9oKm9eODNwJyEjNTckJCIwdTdtaC9kJT0hIzckIjA+TUVTUCYqbychIzY3JDckJCIwVi8leSgzZCU9ISM3JCIvaCpvXjgzcCchIzU3JCQiMFpwdylbdVg9ISM3JCIwdEZoIylbPXEnISM2NyQ3JCQiMHApZnIlXGQlPSEjNyQiMFklZW5TRC5uISM2NyQkIjBacHcpW3VYPSEjNyQiMHRGaCMpWz1xJyEjNjckNyQkIjBwKWZyJVxkJT0hIzckIjBZJWVuU0QubiEjNjckJCIwM05oOyZ5WD0hIzckIjAzbGVBZ1RyJyEjNjckNyQkIi9lWXMselg9ISM2JCIwJEdGPVlwOm4hIzY3JCQiMDNOaDsmeVg9ISM3JCIwM2xlQWdUcichIzY3JDckJCIvZVlzLHpYPSEjNiQiMCRHRj1ZcDpuISM2NyQkIjB6Mz9YRGUlPSEjNyQiMHBbPWdya3MnISM2NyQ3JCQiMCwwNSkzJGUlPSEjNyQiMD5oKm9eOEduISM2NyQkIjB6Mz9YRGUlPSEjNyQiMHBbPWdya3MnISM2NyQ3JCQiMCwwNSkzJGUlPSEjNyQiMD1oKm9eOEduISM2NyQkIjBWK1V1bGUlPSEjNyQiL1VkZEh5UW4hIzU3JDckJCIwVUhmZnJlJT0hIzckIjBiXCc+ZGRTbiEjNjckJCIwVitVdWxlJT0hIzckIi9VZGRIeVFuISM1NyQ3JCQiMFVIZmZyZSU9ISM3JCIwYlwnPmRkU24hIzY3JCQiMF5HTy8xZiU9ISM3JCIwUCc0IUglNF5uISM2NyQ3JCQiMEtEKD1CImYlPSEjNyQiMCJ6THFpLGBuISM2NyQkIjBeR08vMWYlPSEjNyQiMFAnNCFIJTRebiEjNjckNyQkIjBLRCg9QiJmJT0hIzckIjAiekxxaSxgbiEjNjckJCIwT3MxTllmJT0hIzckIjAqKik+KWYwTXcnISM2NyQ3JCQiL1IrXEkmZiU9ISM2JCIwRkU1I29YbG4hIzY3JCQiME9zMU5ZZiU9ISM3JCIwKiopPilmME13JyEjNjckNyQkIi9SK1xJJmYlPSEjNiQiMEZFNSNvWGxuISM2NyQkIi9aI1xtJylmJT0hIzYkIjAiej0kKW9ydm4hIzY3JDckJCIwcl5weSQqZiU9ISM3JCIwajk8UCgqeXgnISM2NyQkIi9aI1xtJylmJT0hIzYkIjAiej0kKW9ydm4hIzY3JDckJCIwcl5weSQqZiU9ISM3JCIwajk8UCgqeXgnISM2NyQkIjAuWGIpcC1ZPSEjNyQiMD5leDlHISl5JyEjNjckNyQkIi4jR0pYLlk9ISM1JCIwKkhTQXpMIXonISM2NyQkIjAuWGIpcC1ZPSEjNyQiMD5leDlHISl5JyEjNjckNyQkIi4jR0pYLlk9ISM1JCIwKkhTQXpMIXonISM2NyQkIjApZk04dDFZPSEjNyQiMDkvJCpRUi4hbyEjNjckNyQkIjA4IUckR3ZnJT0hIzckIjBOIjR0JXlGIW8hIzY3JCQiMClmTTh0MVk9ISM3JCIwOS8kKlFSLiFvISM2NyQ3JCQiMDghRyRHdmclPSEjNyQiME4iNHQleUYhbyEjNjckJCIwJylcJlt3NVk9ISM3JCIwJkg2MjFsN28hIzY3JDckJCIwTlhILztoJT0hIzckIjByelAtPl8ibyEjNjckJCIwJylcJlt3NVk9ISM3JCIwJkg2MjFsN28hIzY3JDckJCIwTlhILztoJT0hIzckIjByelAtPl8ibyEjNjckJCIwImY6Iip6OVk9ISM3JCIwMyg9LD0nXCNvISM2NyQ3JCQiMCRwRjVvOlk9ISM3JCIwMm9XZGZ3I28hIzY3JCQiMCJmOiIqejlZPSEjNyQiMDMoPSw9J1wjbyEjNjckNyQkIjAkcEY1bzpZPSEjNyQiMDJvV2RmdyNvISM2NyQkIjAvIT1TJCk9WT0hIzckIjAlPm91SEZQbyEjNjckNyQkIjBiJEclZSg+WT0hIzckIjBWY143KywlbyEjNjckJCIwLyE9UyQpPVk9ISM3JCIwJT5vdUhGUG8hIzY3JDckJCIwYiRHJWUoPlk9ISM3JCIwVmNeNyssJW8hIzY3JCQiME5KbXBHaSU9ISM3JCIwIz5PQ1RlXG8hIzY3JDckJCIwUHRjT1FpJT0hIzckIjB6V2VuU0QmbyEjNjckJCIwTkptcEdpJT0hIzckIjAjPk9DVGVcbyEjNjckNyQkIjBQdGNPUWklPSEjNyQiMHpXZW5TRCZvISM2NyQkIjBWJD5nIXBpJT0hIzckIjBfVDdEJio9J28hIzY3JDckJCIvdXNhInppJT0hIzYkIjA6TGxBIilcJ28hIzY3JCQiMFYkPmchcGklPSEjNyQiMF9UN0QmKj0nbyEjNjckNyQkIi91c2EiemklPSEjNiQiMDpMbEEiKVwnbyEjNjckJCIwQDYtVjRqJT0hIzckIjBFQHVOMVUobyEjNjckNyQkIi4mXF0qPmolPSEjNSQiMF5Ac3hAdShvISM2NyQkIjBANi1WNGolPSEjNyQiMEVAdU4xVShvISM2NyQ3JCQiLiZcXSo+aiU9ISM1JCIwXkBzeEB1KG8hIzY3JCQiMChSbDIpXGolPSEjNyQiMDskelJ1XicpbyEjNjckNyQkIjBXX1J2Z2olPSEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMChSbDIpXGolPSEjNyQiMDskelJ1XicpbyEjNjckNyQkIjBXX1J2Z2olPSEjNyQiMCgpNHpLaSkqKW8hIzY3JCQiMCY0XyM+IVJZPSEjNyQiMGxmJClcRykpKm8hIzY3JDckJCIwPE9aYyxrJT0hIzckIjBCKWZ5R0ktcCEjNjckJCIwJjRfIz4hUlk9ISM3JCIwbGYkKVxHKSkqbyEjNjckNyQkIjA8T1pjLGslPSEjNyQiMEIpZnlHSS1wISM2NyQkIjA7Uk5lSWslPSEjNyQiMGItc2BSNiJwISM2NyQ3JCQiLnNBUVVrJT0hIzUkIjBmJ0dITXU5cCEjNjckJCIwO1JOZUlrJT0hIzckIjBiLXNgUjYicCEjNjckNyQkIi5zQVFVayU9ISM1JCIwZidHSE11OXAhIzY3JCQiMDohKT4pNFpZPSEjNyQiMGpXQWJdTSNwISM2NyQ3JCQiMGImXDJLW1k9ISM3JCIwJlwoKnpSPUZwISM2NyQkIjA6ISk+KTRaWT0hIzckIjBqV0FiXU0jcCEjNjckNyQkIjBiJlwyS1tZPSEjNyQiMCZcKCp6Uj1GcCEjNjckJCIwPFZ5UTZsJT0hIzckIjBMKVtWOndOcCEjNjckNyQkIjBzLSsvQ2wlPSEjNyQiMEpqMWBDJ1JwISM2NyQkIjA8VnlRNmwlPSEjNyQiMEwpW1Y6d05wISM2NyQ3JCQiMHMtKy9DbCU9ISM3JCIwSmoxYEMnUnAhIzY3JCQiME9iKSp6XmwlPSEjNyQiMC86XV5zIVtwISM2NyQ3JCQiMFU8KHpbY1k9ISM3JCIwbl44M2w/JnAhIzY3JCQiME9iKSp6XmwlPSEjNyQiMC86XV5zIVtwISM2NyQ3JCQiMFU8KHpbY1k9ISM3JCIwbl44M2w/JnAhIzY3JCQiMGs0KD5BZlk9ISM3JCIwWCdSaE1RZ3AhIzY3JDckJCIwJlJHRWRnWT0hIzckIjAuUz9qMFgncCEjNjckJCIwazQoPkFmWT0hIzckIjBYJ1JoTVFncCEjNjckNyQkIjAmUkdFZGdZPSEjNyQiMC5TP2owWCdwISM2NyQkIjB3U2hrS20lPSEjNyQiMGAqbydRJXBzcCEjNjckNyQkIjBCXzRlWW0lPSEjNyQiMFJHRj1ZcChwISM2NyQkIjB3U2hrS20lPSEjNyQiMGAqbydRJXBzcCEjNjckNyQkIjBCXzRlWW0lPSEjNyQiMFJHRj1ZcChwISM2NyQkIjBZKWV6SW5ZPSEjNyQiMEglWypHMF0pcCEjNjckNyQkIjBKPj9XKG9ZPSEjNyQiMHY7TXQnUSopcCEjNjckJCIwWSllekluWT0hIzckIjBIJVsqRzBdKXAhIzY3JDckJCIwSj4/VyhvWT0hIzckIjB2O010J1EqKXAhIzY3JCQiMCUpPitfOG4lPSEjNyQiMEQnKSlwaEooKnAhIzY3JDckJCIwKClwMkpHbiU9ISM3JCIwNjBUR0Y9KyghIzY3JCQiMCUpPitfOG4lPSEjNyQiMEQnKSlwaEooKnAhIzY3JDckJCIwKClwMkpHbiU9ISM3JCIwNjBUR0Y9KyghIzY3JCQiMCcpb3knUnZZPSEjNyQiMChRXUVxaTRxISM2NyQ3JCQiMD0ucz1wbiU9ISM3JCIwWiR6TXlFOXEhIzY3JCQiMCcpb3knUnZZPSEjNyQiMChRXUVxaTRxISM2NyQ3JCQiMD0ucz1wbiU9ISM3JCIwWiR6TXlFOXEhIzY3JCQiMGtdQlUlelk9ISM3JCIwKVEmPSd5JD4tKCEjNjckNyQkIjBITCsyNW8lPSEjNyQiMCU9WyZRM24tKCEjNjckJCIwa11CVSV6WT0hIzckIjApUSY9J3kkPi0oISM2NyQ3JCQiMEhMKzI1byU9ISM3JCIwJT1bJlEzbi0oISM2NyQkIjA8dVApWyRvJT0hIzckIjBcWFxuW1UuKCEjNjckNyQkIjB4VzAnNCZvJT0hIzckIi8tPE8qWyJScSEjNTckJCIwPHVQKVskbyU9ISM3JCIwXFhcbltVLighIzY3JDckJCIweFcwJzQmbyU9ISM3JCIvLTxPKlsiUnEhIzU3JCQiMGhiPU52byU9ISM3JCIwJSkpb20lZmwvKCEjNjckNyQkIjAjbyh6Jj0qbyU9ISM3JCIwY2VvWyplXnEhIzY3JCQiMGhiPU52byU9ISM3JCIwJSkpb20lZmwvKCEjNjckNyQkIjAjbyh6Jj0qbyU9ISM3JCIwY2VvWyplXnEhIzY3JCQiME15dCNlInAlPSEjNyQiMDFzWEJxKWVxISM2NyQ3JCQiMEp4RHdLcCU9ISM3JCIwI3BhUCsua3EhIzY3JCQiME15dCNlInAlPSEjNyQiMDFzWEJxKWVxISM2NyQ3JCQiMEp4RHdLcCU9ISM3JCIwI3BhUCsua3EhIzY3JCQiMCI0ISk0aiZwJT0hIzckIjBKSi4pND1ycSEjNjckNyQkIjAwZFtudHAlPSEjNyQiMEdOIyllcWsyKCEjNjckJCIwIjQhKTRqJnAlPSEjNyQiMEpKLik0PXJxISM2NyQ3JCQiMDBkW250cCU9ISM3JCIwR04jKWVxazIoISM2NyQkIjAyPiopeicqcCU9ISM3JCIwVkBZcSJcJDMoISM2NyQ3JCQiMClmNCVmOXElPSEjNyQiMGtCKlE2IiopMyghIzY3JCQiMDI+Kil6JypwJT0hIzckIjBWQFlxIlwkMyghIzY3JDckJCIwKWY0JWY5cSU9ISM3JCIwa0IqUTYiKikzKCEjNjckJCIwTndhSFBxJT0hIzckIjBRZV1TLWU0KCEjNjckNyQkIjBqZy9fYnElPSEjNyQiLjcnKm9eODUoISIqNyQkIjBOd2FIUHElPSEjNyQiMFFlXVMtZTQoISM2NyQ3JCQiMGpnL19icSU9ISM3JCIuNycqb144NSghIio3JCQiMF8iKikpenhxJT0hIzckIjAlZV0kMzgiM3IhIzY3JDckJCIwVi1YWCc0Wj0hIzckIjBPKy5DI3o4ciEjNjckJCIwXyIqKSl6eHElPSEjNyQiMCVlXSQzOCIzciEjNjckNyQkIjBWLVhYJzRaPSEjNyQiME8rLkMjejhyISM2NyQkIi0vNCQ9ciU9ISIqJCIwRGoudUIvNyghIzY3JDckJCIwLlViUlByJT0hIzckIjBzKSk0ektpNyghIzY3JCQiLS80JD1yJT0hIiokIjBEai51Qi83KCEjNjckNyQkIjAuVWJSUHIlPSEjNyQiMHMpKTR6S2k3KCEjNjckJCIwJjQnZiMpZXIlPSEjNyQiMDYwYlBNRjgoISM2NyQ3JCQiMGgqKkhNeXIlPSEjNyQiMDN4O010J1FyISM2NyQkIjAmNCdmIyllciU9ISM3JCIwNjBiUE1GOCghIzY3JDckJCIwaCoqSE15ciU9ISM3JCIwM3g7TXQnUXIhIzY3JCQiMGl2Lk4qPlo9ISM3JCIwbz1tKVwvWHIhIzY3JDckJCIwIzMiKSlIPnMlPSEjNyQiMFdsQipRNl5yISM2NyQkIjBpdi5OKj5aPSEjNyQiMG89bSlcL1hyISM2NyQ3JCQiMCMzIikpSD5zJT0hIzckIjBXbEIqUTZeciEjNjckJCIwTGg6KSlScyU9ISM3JCIwREBnZGJ0OighIzY3JDckJCIwW2U7RWdzJT0hIzckIi9RMFZXYmpyISM1NyQkIjBMaDopKVJzJT0hIzckIjBEQGdkYnQ6KCEjNjckNyQkIjBbZTtFZ3MlPSEjNyQiL1EwVldianIhIzU3JCQiMEJkJj4vR1o9ISM3JCIwRihlVmhtcHIhIzY3JDckJCIwOUE0Qix0JT0hIzckIjA7VVAqXCpmPCghIzY3JCQiMEJkJj4vR1o9ISM3JCIwRihlVmhtcHIhIzY3JDckJCIwOUE0Qix0JT0hIzckIjA7VVAqXCpmPCghIzY3JCQiMHRgVic0S1o9ISM3JCIwXFokKm93Pj0oISM2NyQ3JCQiMCplKXk/VXQlPSEjNyQiMF9JV2FOJSk9KCEjNjckJCIwdGBWJzRLWj0hIzckIjBcWiQqb3c+PSghIzY3JDckJCIwKmUpeT9VdCU9ISM3JCIwX0lXYU4lKT0oISM2NyQkIjBlJGU7Ok9aPSEjNyQiMC90N0AoRyU+KCEjNjckNyQkIjBXaD0+JFFaPSEjNyQiMCkpPV40dzM/KCEjNjckJCIwZSRlOzpPWj0hIzckIjAvdDdAKEclPighIzY3JDckJCIwV2g9PiRRWj0hIzckIjApKT1eNHczPyghIzY3JCQiMCNbKFwyLXUlPSEjNyQiMFJVTXIoZjFzISM2NyQ3JCQiMC9ESD1DdSU9ISM3JCIwQzJlaztMQCghIzY3JCQiMCNbKFwyLXUlPSEjNyQiMFJVTXIoZjFzISM2NyQ3JCQiMC9ESD1DdSU9ISM3JCIwQzJlaztMQCghIzY3JCQiMCp6elNFV1o9ISM3JCIwaSJ5Ij4zKj1zISM2NyQ3JCQiMGonbyI9bHUlPSEjNyQiL2NcJz5kZEEoISM1NyQkIjAqenpTRVdaPSEjNyQiMGkieSI+Myo9cyEjNjckNyQkIjBqJ28iPWx1JT0hIzckIi9jXCc+ZGRBKCEjNTckJCIwSiVcOEtbWj0hIzckIjBWIzNbJz03QighIzY3JDckJCIwJTQnbz0xdiU9ISM3JCIwJ1I9Wng+UXMhIzY3JCQiMEolXDhLW1o9ISM3JCIwViMzWyc9N0IoISM2NyQ3JCQiMCU0J289MXYlPSEjNyQiMCdSPVp4PlFzISM2NyQkIjBLQEh6QnYlPSEjNyQiMGksRzNITkMoISM2NyQ3JCQiMCk9dCo+WnYlPSEjNyQiMEtzeUhRMUQoISM2NyQkIjBLQEh6QnYlPSEjNyQiMGksRzNITkMoISM2NyQ3JCQiMCk9dCo+WnYlPSEjNyQiMEtzeUhRMUQoISM2NyQkIjBvWSN6VmNaPSEjNyQiMGIsYVxSZUQoISM2NyQ3JCQiMEU5IT4jKWVaPSEjNyQiMG9nJlspeUlFKCEjNjckJCIwb1kjelZjWj0hIzckIjBiLGFcUmVEKCEjNjckNyQkIjBFOSE+IyllWj0hIzckIjBvZyZbKXlJRSghIzY3JCQiMHl1QShcZ1o9ISM3JCIvJjRsKSlcIm9zISM1NyQ3JCQiMCo9KmZDSHclPSEjNyQiMC9cIypSPmJGKCEjNjckJCIweXVBKFxnWj0hIzckIi8mNGwpKVwib3MhIzU3JDckJCIwKj0qZkNIdyU9ISM3JCIwL1wjKlI+YkYoISM2NyQkIjBYRUFkWHclPSEjNyQiME08YURnL0coISM2NyQ3JCQiMDhpLEdxdyU9ISM3JCIvdSQqXCpmekcoISM1NyQkIjBYRUFkWHclPSEjNyQiME08YURnL0coISM2NyQ3JCQiMDhpLEdxdyU9ISM3JCIwVFAqXCpmekcoISM2NyQkIjBOSyd6aG9aPSEjNyQiMGNCL2dxRkgoISM2NyQ3JCQiME1kN0s2eCU9ISM3JCIwd0QxXSsvSSghIzY3JCQiME5LJ3pob1o9ISM3JCIwY0IvZ3FGSCghIzY3JDckJCIwTWQ3SzZ4JT0hIzckIjB3RDFdKy9JKCEjNjckJCIwKiopcCR6RXglPSEjNyQiMFZzUyM0MzB0ISM2NyQ3JCQiMHNYK1BfeCU9ISM3JCIwODk4MFRHSighIzY3JCQiMCoqKXAkekV4JT0hIzckIjBWc1MjNDMwdCEjNjckNyQkIjBzWCtQX3glPSEjNyQiMDg5ODBUR0ooISM2NyQkIi5GWlRueCU9ISM1JCIsYUEiUjx0ISIoNyQ3JCQiMEZVX1Ukelo9ISM3JCIwXC0/ZyJHRHQhIzY3JCQiLkZaVG54JT0hIzUkIixhQSJSPHQhIig3JDckJCIwRlVfVSR6Wj0hIzckIjBcLT9nIkdEdCEjNjckJCIvaiQ+LzN5JT0hIzYkIjBkMnBdLChIdCEjNjckNyQkIjA0JG8oW015JT0hIzckIjAmM3BfQHNQdCEjNjckJCIvaiQ+LzN5JT0hIzYkIjBkMnBdLChIdCEjNjckNyQkIjA0JG8oW015JT0hIzckIjAmM3BfQHNQdCEjNjckJCIwLChmdydbeSU9ISM3JCIwYkFYdzY/TSghIzY3JDckJCIwIz4qcGJ2eSU9ISM3JCIwQHpMcWksTighIzY3JCQiMCwoZncnW3klPSEjNyQiMGJBWHc2P00oISM2NyQ3JCQiMCM+KnBidnklPSEjNyQiMEB6THFpLE4oISM2NyQkIjBgaXlKKil5JT0hIzckIjBiZjQrQVZOKCEjNjckNyQkIjA7IipSajt6JT0hIzckIjBkblNELkVPKCEjNjckJCIwYGl5SiopeSU9ISM3JCIwYmY0K0FWTighIzY3JDckJCIwOyIqUmo7eiU9ISM3JCIwZG5TRC5FTyghIzY3JCQiMCkpUmgnKkh6JT0hIzckIjBXOFxAS21PKCEjNjckNyQkIjBUdCM9eCZ6JT0hIzckIjAkZnYvUS92dCEjNjckJCIwKSlSaCcqSHolPSEjNyQiMFc4XEBLbU8oISM2NyQ3JCQiMFR0Iz14JnolPSEjNyQiMCRmdi9RL3Z0ISM2NyQkIjBbbT1pcXolPSEjNyQiMG4iKVxTVSp5dCEjNjckNyQkIjAoM1E0KSkqeiU9ISM3JCIwSFdhTiVbKFEoISM2NyQkIjBbbT1pcXolPSEjNyQiMG4iKVxTVSp5dCEjNjckNyQkIjAoM1E0KSkqeiU9ISM3JCIwSFdhTiVbKFEoISM2NyQkIjAtclBHNiFbPSEjNyQiMGpTX2RfN1IoISM2NyQ3JCQiMD4oejIqUiFbPSEjNyQiMGxLaCFcIyoqUighIzY3JCQiMC1yUEc2IVs9ISM3JCIwalNfZF83UighIzY3JDckJCIwPih6MipSIVs9ISM3JCIwbEtoIVwjKipSKCEjNjckJCIwKT12Xz4wWz0hIzckIjByNEdzaU5TKCEjNjckNyQkIjBQV0UsIjNbPSEjNyQiMCxAb1hsQlQoISM2NyQkIjApPXZfPjBbPSEjNyQiMHI0R3NpTlMoISM2NyQ3JCQiMFBXRSwiM1s9ISM3JCIwLEBvWGxCVCghIzY3JCQiMEAlSEdFNFs9ISM3JCIwd1IkXEcoZVQoISM2NyQ3JCQiMHUwXzdBIls9ISM3JCIwUDR2KzFbVSghIzY3JCQiMEAlSEdFNFs9ISM3JCIwd1IkXEcoZVQoISM2NyQ3JCQiMHUwXzdBIls9ISM3JCIwUDR2KzFbVSghIzY3JCQiMClIRzZMOFs9ISM3JCIwPCQqPiZIPUd1ISM2NyQ3JCQiMEhOWENqIls9ISM3JCIwdCg+ZWxDUHUhIzY3JCQiMClIRzZMOFs9ISM3JCIwPCQqPiZIPUd1ISM2NyQ3JCQiMEhOWENqIls9ISM3JCIwdCg+ZWxDUHUhIzY3JCQiMC9aLyt1Ils9ISM3JCIwelhbLiRcU3UhIzY3JDckJCIwVkQ3UC8jWz0hIzckIjA0JykpM3JvXHUhIzY3JCQiMC9aLyt1Ils9ISM3JCIwelhbLiRcU3UhIzY3JDckJCIwVkQ3UC8jWz0hIzckIjA0JykpM3JvXHUhIzY3JCQiMCZ6dCdwOSNbPSEjNyQiMGFZWzQuR1goISM2NyQ3JCQiMClRTS9iQ1s9ISM3JCIwWHUmZnc3aXUhIzY3JCQiMCZ6dCdwOSNbPSEjNyQiMGFZWzQuR1goISM2NyQ3JCQiMClRTS9iQ1s9ISM3JCIwWHUmZnc3aXUhIzY3JCQiME5NJipSYiNbPSEjNyQiMHQoKVI4OF5ZKCEjNjckNyQkIjB6dF5rJ0dbPSEjNyQiMCJHRTUjb1haKCEjNjckJCIwTk0mKlJiI1s9ISM3JCIwdCgpUjg4XlkoISM2NyQ3JCQiMHp0XmsnR1s9ISM3JCIwIkdFNSNvWFooISM2NyQkIjBRdSg0aEhbPSEjNyQiLzhFXEpVeHUhIzU3JDckJCIwJFtyI3pGJFs9ISM3JCIwPF40dzNxWyghIzY3JCQiMFF1KDRoSFs9ISM3JCIvOEVcSlV4dSEjNTckNyQkIjAkW3IjekYkWz0hIzckIjA8XjR3M3FbKCEjNjckJCIwMCg9RW9MWz0hIzckIjBjVVo5TCgqWyghIzY3JDckJCIwQm93JSpvJFs9ISM3JCIwYFI7SlwlKlwoISM2NyQkIjAwKD1Fb0xbPSEjNyQiMGNVWjlMKCpbKCEjNjckNyQkIjBCb3clKm8kWz0hIzckIjBgUjtKXCUqXCghIzY3JCQiMDd4KFx2UFs9ISM3JCIwKCk0czZWP10oISM2NyQ3JCQiMFBaITQsVFs9ISM3JCIwKnlLaSkqKT1eKCEjNjckJCIwN3goXHZQWz0hIzckIjAoKTRzNlY/XSghIzY3JDckJCIwUFohNCxUWz0hIzckIjAqeUtpKSopPV4oISM2NyQkIjBwOyl6Iz0lWz0hIzckIjA8KCoqb0lOOXYhIzY3JDckJCIwRU4ieTdYWz0hIzckIjBEO0lUSVZfKCEjNjckJCIwcDspeiM9JVs9ISM3JCIwPCgqKm9JTjl2ISM2NyQ3JCQiMEVOInk3WFs9ISM3JCIwRDtJVElWXyghIzY3JCQiMCMqZXEsZiVbPSEjNyQiMFgqbygqSG1FdiEjNjckNyQkIi93a2BDXFs9ISM2JCIwaC9QJzR4T3YhIzY3JCQiMCMqZXEsZiVbPSEjNyQiMFgqbygqSG1FdiEjNjckNyQkIi93a2BDXFs9ISM2JCIwaC9QJzR4T3YhIzY3JCQiMG1BMncqXFs9ISM3JCIwXiJ6MEgoKlF2ISM2NyQ3JCQiMExub2pMJls9ISM3JCIwKEhSOTpAXHYhIzY3JCQiMG1BMncqXFs9ISM3JCIwXiJ6MEgoKlF2ISM2NyQ3JCQiMExub2pMJls9ISM3JCIwKEhSOTpAXHYhIzY3JCQiME45O15TJls9ISM3JCIwWjwyeiNHXnYhIzY3JDckJCIwUSJmRltkWz0hIzckIjBMIjNsP2xodiEjNjckJCIwTjk7XlMmWz0hIzckIjBaPDJ6I0dediEjNjckNyQkIjBRImZGW2RbPSEjNyQiMEwiM2w/bGh2ISM2NyQkIjBKdChwN2VbPSEjNyQiMEpUQmwjZmp2ISM2NyQ3JCQiMFlxTy07J1s9ISM3JCIwcHBkaCM0dXYhIzY3JCQiMEp0KHA3ZVs9ISM3JCIwSlRCbCNmanYhIzY3JDckJCIwWXFPLTsnWz0hIzckIjBwcGRoIzR1diEjNjckJCIwQWBLLkEnWz0hIzckIjB3LnBcLWZkKCEjNjckNyQkIjBGaiZHc2xbPSEjNyQiMDBlaztMbGUoISM2NyQkIjBBYEsuQSdbPSEjNyQiMHcucFwtZmQoISM2NyQ3JCQiMEZqJkdzbFs9ISM3JCIwMGVrO0xsZSghIzY3JCQiMCgqb18hR21bPSEjNyQiMFknNDlCQCllKCEjNjckNyQkIjAyVypRJSlwWz0hIzckIjBUWXJydCopZighIzY3JCQiMCgqb18hR21bPSEjNyQiMFknNDlCQCllKCEjNjckNyQkIjAyVypRJSlwWz0hIzckIjBUWXJydCopZighIzY3JCQiMEMzQWUuKFs9ISM3JCIwNy1iNkEwZyghIzY3JDckJCIwZVR5bFIoWz0hIzckIjB5TXlFOTloKCEjNjckJCIwQzNBZS4oWz0hIzckIjA3LWI2QTBnKCEjNjckNyQkIjBlVHlsUihbPSEjNyQiMHlNeUU5OWgoISM2NyQkIjApKnp5T1coWz0hIzckIjBjMiopKT0kR2goISM2NyQ3JCQiMHdLQikzeVs9ISM3JCIwOUImPVsmUWkoISM2NyQkIjApKnp5T1coWz0hIzckIjBjMiopKT0kR2goISM2NyQ3JCQiMHdLQikzeVs9ISM3JCIwOUImPVsmUWkoISM2NyQkIjAsdSVlXnlbPSEjNyQiLypIbGtUXmkoISM1NyQ3JCQiMEtlVTZBKVs9ISM3JCIvOkBwYEhPdyEjNTckJCIwLHUlZV55Wz0hIzckIi8qSGxrVF5pKCEjNTckNyQkIjBLZVU2QSlbPSEjNyQiLzpAcGBIT3chIzU3JCQiMEhIbCZmIylbPSEjNyQiMDRHLVFedWooISM2NyQ3JCQiMDc4Uk5qKVs9ISM3JCIwJykqKik+ZnRbdyEjNjckJCIwSEhsJmYjKVs9ISM3JCIwNEctUV51aighIzY3JDckJCIwNzhSTmopWz0hIzckIjAnKSoqKT5mdFt3ISM2NyQkIi9eL2luJylbPSEjNiQiMFwvKzRoKFx3ISM2NyQ3JCQiMF4xLGcvKls9ISM3JCIwQSllcWs8aHchIzY3JCQiL14vaW4nKVs9ISM2JCIwXC8rNGgoXHchIzY3JDckJCIwXjEsZy8qWz0hIzckIjBBKWVxazxodyEjNjckJCIwL15QZDIqWz0hIzckIjBeSyp6MjJpdyEjNjckNyQkIjAjNCNSJmUlKls9ISM3JCIwZXc3LTxPbighIzY3JCQiMC9eUGQyKls9ISM3JCIwXksqejIyaXchIzY3JDckJCIwIzQjUiZlJSpbPSEjNyQiMGV3Ny08T24oISM2NyQkIjA+UUdSWypbPSEjNyQiMC8kPlkvUXV3ISM2NyQ3JCQiMEVpSDYoKSpbPSEjNyQiMCVcJz5kZGdvKCEjNjckJCIwPlFHUlsqWz0hIzckIjAvJD5ZL1F1dyEjNjckNyQkIjBFaUg2KCkqWz0hIzckIjAlXCc+ZGRnbyghIzY3JCQiMCllJHBAKikqWz0hIzckIjBfKFEnNCFwJ28oISM2NyQ3JCQiMFUiKTNRRyFcPSEjNyQiL0xsQSIpXClwKCEjNTckJCIwKWUkcEAqKSpbPSEjNyQiMF8oUSc0IXAnbyghIzY3JDckJCIwVSIpM1FHIVw9ISM3JCIvTGxBIilcKXAoISM1NyQkIjByNChcKy5cPSEjNyQiMFBpKD0oKioqKXAoISM2NyQ3JCQiME00YGxwIVw9ISM3JCIwbVRMblE0cighIzY3JCQiMHI0KFwrLlw9ISM3JCIwUGkoPSgqKiopcCghIzY3JDckJCIwTTRgbHAhXD0hIzckIjBtVExuUTRyKCEjNjckJCIvY3QpKTMyXD0hIzYkIjBHITRAJDQ4cighIzY3JDckJCIwWS9pJDQ2XD0hIzckIjAtSVNBekxzKCEjNjckJCIvY3QpKTMyXD0hIzYkIjBHITRAJDQ4cighIzY3JDckJCIwWS9pJDQ2XD0hIzckIjAtSVNBekxzKCEjNjckJCIvJVtSdDYiXD0hIzYkIjA9IWUuKj1PcyghIzY3JDckJCIwI1JeQkE6XD0hIzckIjBRPVp4PmV0KCEjNjckJCIvJVtSdDYiXD0hIzYkIjA9IWUuKj1PcyghIzY3JDckJCIwI1JeQkE6XD0hIzckIjBRPVp4PmV0KCEjNjckJCIwXFpgZV8iXD0hIzckIjAwTWlZR2Z0KCEjNjckNyQkIjApUTUkWyc9XD0hIzckIjAjUXRkLzlZeCEjNjckJCIwXFpgZV8iXD0hIzckIjAwTWlZR2Z0KCEjNjckNyQkIjApUTUkWyc9XD0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwNEcpeTpfXj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA6O0hMbUkmPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjA0Ryl5Ol9ePSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMClRNSRbJz1cPSEjNyQiMCNRdGQvOVl4ISM2NyQkIjAnPSIpW00+XD0hIzckIjA9LC0qekJbeCEjNjckNyQkIjB1akZfJD5cPSEjNyQiMHUxYUtnI1t4ISM2NyQkIjAnPSIpW00+XD0hIzckIjA9LC0qekJbeCEjNjckNyQkIjB1akZfJD5cPSEjNyQiMHUxYUtnI1t4ISM2NyQkIjBMZk1MTSNcPSEjNyQiMHBYaVdaMHcoISM2NyQ3JCQiMG8jZlRbQlw9ISM3JCIvXjR3M3FneCEjNTckJCIwTGZNTE0jXD0hIzckIjBwWGlXWjB3KCEjNjckNyQkIjBvI2ZUW0JcPSEjNyQiL140dzNxZ3ghIzU3JCQiMHgiZkRfRlw9ISM3JCIwMCFIeW8mR3goISM2NyQ3JCQiL1c2b2hGXD0hIzYkIjBZJHlFOTl0eCEjNjckJCIweCJmRF9GXD0hIzckIjAwIUh5byZHeCghIzY3JDckJCIvVzZvaEZcPSEjNiQiMFkkeUU5OXR4ISM2NyQkIjApUSpRNzskXD0hIzckIjBrXjBIbV55KCEjNjckNyQkIjAmRzQsdkpcPSEjNyQiMCM9Wng+ZSZ5KCEjNjckJCIwKVEqUTc7JFw9ISM3JCIwa14wSG1eeSghIzY3JDckJCIwJkc0LHZKXD0hIzckIjAjPVp4PmUmeSghIzY3JCQiMF5dJ0hxTlw9ISM3JCIwbzUqeWNaKHooISM2NyQ3JCQiMHJQPCUpZSRcPSEjNyQiMD1nIkdELSl6KCEjNjckJCIwXl0nSHFOXD0hIzckIjBvNSp5Y1ooeighIzY3JDckJCIwclA8JSllJFw9ISM3JCIwPWciR0QtKXooISM2NyQkIjA8ImZUelJcPSEjNyQiMCM0V1pdeTR5ISM2NyQ3JCQiMFBsKSk9KyVcPSEjNyQiMGFbKXlJWTV5ISM2NyQkIjA8ImZUelJcPSEjNyQiMCM0V1pdeTR5ISM2NyQ3JCQiMFBsKSk9KyVcPSEjNyQiMGFbKXlJWTV5ISM2NyQkIjAleXpmKVElXD0hIzckIjBeemVSJTRBeSEjNjckNyQkIjBFO0RhVCVcPSEjNyQiL3BgSE8hSCN5ISM1NyQkIjAleXpmKVElXD0hIzckIjBeemVSJTRBeSEjNjckNyQkIjBFO0RhVCVcPSEjNyQiL3BgSE8hSCN5ISM1NyQkIjB2JFsmeXolXD0hIzckIjBFTy5zLlckeSEjNjckNyQkIjApKT5QIUhbXD0hIzckIjBFRC09V2AkeSEjNjckJCIwdiRbJnl6JVw9ISM3JCIwRU8ucy5XJHkhIzY3JDckJCIwKSk+UCFIW1w9ISM3JCIwRUQtPVdgJHkhIzY3JCQiMD5wc3I/Jlw9ISM3JCIvX0JESXJZeSEjNTckNyQkIjA7ZDpGQyZcPSEjNyQiMGk4NHQleVp5ISM2NyQkIjA+cHNyPyZcPSEjNyQiL19CRElyWXkhIzU3JDckJCIwO2Q6RkMmXD0hIzckIjBpODR0JXlaeSEjNjckJCIwWUdtbGgmXD0hIzckIjApKltlSUEhZnkhIzY3JDckJCIwNyIqb2tsJlw9ISM3JCIwKT5nIkdELSd5ISM2NyQkIjBZR21saCZcPSEjNyQiMCkqW2VJQSFmeSEjNjckNyQkIjA3Iipva2wmXD0hIzckIjApPmciR0QtJ3khIzY3JCQiMDxmP2ctJ1w9ISM3JCIwLSYqcGNKOCh5ISM2NyQ3JCQiMDd0KEdxZ1w9ISM3JCIwTSFIS2Vtc3khIzY3JCQiMDxmP2ctJ1w9ISM3JCIwLSYqcGNKOCh5ISM2NyQ3JCQiMDd0KEdxZ1w9ISM3JCIwTSFIS2Vtc3khIzY3JCQiMGg+UWJWJ1w9ISM3JCIwMFh5ITNrJCl5ISM2NyQ3JCQiMGlWc1RbJ1w9ISM3JCIvKHlIUTFeKXkhIzU3JCQiMGg+UWJWJ1w9ISM3JCIwMFh5ITNrJCl5ISM2NyQ3JCQiMGlWc1RbJ1w9ISM3JCIvKHlIUTFeKXkhIzU3JCQiMCllMDhYb1w9ISM3JCIwQENaLV1mKnkhIzY3JDckJCIwdEVKIikqb1w9ISM3JCIwMW5PJHBhKCp5ISM2NyQkIjApZTA4WG9cPSEjNyQiMEBDWi1dZip5ISM2NyQ3JCQiMHRFSiIpKm9cPSEjNyQiMDFuTyRwYSgqeSEjNjckJCIwW0AkeWFzXD0hIzckIjBqcUFBZiMzeiEjNjckNyQkIjA+eGRASihcPSEjNyQiMFZiVlsoKSo0eiEjNjckJCIwW0AkeWFzXD0hIzckIjBqcUFBZiMzeiEjNjckNyQkIjA+eGRASihcPSEjNyQiMFZiVlsoKSo0eiEjNjckJCIwWUM3WG0oXD0hIzckIjA4R2BSbzAjeiEjNjckNyQkIjA8JXlERXhcPSEjNyQiMHpWXS5HQyN6ISM2NyQkIjBZQzdYbShcPSEjNyQiMDhHYFJvMCN6ISM2NyQ3JCQiMDwleURFeFw9ISM3JCIwelZdLkdDI3ohIzY3JCQiMG5HLFYyKVw9ISM3JCIuViJcdihHJHohIio3JDckJCIwXC9DLzkpXD0hIzckIjA6S2Rlb1skeiEjNjckJCIwbkcsVjIpXD0hIzckIi5WIlx2KEckeiEiKjckNyQkIjBcL0MvOSlcPSEjNyQiMDpLZGVvWyR6ISM2NyQkIjBSRWFUWylcPSEjNyQiMFFkQ28nPVh6ISM2NyQ3JCQiMGh5Y1liKVw9ISM3JCIwXj9rODR0JXohIzY3JCQiMFJFYVRbKVw9ISM3JCIwUWRDbyc9WHohIzY3JDckJCIwaHljWWIpXD0hIzckIjBeP2s4NHQleiEjNjckJCIwQGRyUyopKVw9ISM3JCIwS1deeiZcZHohIzY3JDckJCIwODdhKm8qKVw9ISM3JCIwKCkzcm9cKGZ6ISM2NyQkIjBAZHJTKikpXD0hIzckIjBLV156JlxkeiEjNjckNyQkIjA4N2EqbyopXD0hIzckIjAoKTNyb1woZnohIzY3JCQiMENWaFNJKlw9ISM3JCIveWMlKVshKXB6ISM1NyQ3JCQiMGpRRUxRKlw9ISM3JCIwQih6UC0+c3ohIzY3JCQiMENWaFNJKlw9ISM3JCIveWMlKVshKXB6ISM1NyQ3JCQiMGpRRUxRKlw9ISM3JCIwQih6UC0+c3ohIzY3JCQiMDhKOFRyKlw9ISM3JCIwTTBUJlI2Iyl6ISM2NyQ3JCQiMCplSHcoeipcPSEjNyQiMGYmWyl5SVkpeiEjNjckJCIwOEo4VHIqXD0hIzckIjBNMFQmUjYjKXohIzY3JDckJCIwKmVIdyh6Klw9ISM3JCIwZiZbKXlJWSl6ISM2NyQkIjBAPlBVNysmPSEjNyQiMHliMCtCVyp6ISM2NyQ3JCQiMChmbUY3LV09ISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBAPlBVNysmPSEjNyQiMHliMCtCVyp6ISM2NyQ3JCQiMChmbUY3LV09ISM3JCIwJlI8UjgyKCp6ISM2NyQkIjBoa0RXYCsmPSEjNyQiMDssai1LbispISM2NyQ3JCQiMEBiZG9pKyY9ISM3JCIwSmkpKik9XjQhKSEjNjckJCIwaGtEV2ArJj0hIzckIjA7LGotS24rKSEjNjckNyQkIjBAYmRvaSsmPSEjNyQiMEppKSopPV40ISkhIzY3JCQiMCVwIXpZJTRdPSEjNyQiMFY5Ny5UIT4hKSEjNjckNyQkIjBRKCoqXFQ1XT0hIzckIjBuXTBXXz4tKSEjNjckJCIwJXAhelklNF09ISM3JCIwVjk3LlQhPiEpISM2NyQ3JCQiMFEoKipcVDVdPSEjNyQiMG5dMFdfPi0pISM2NyQkIjAubCIqXE4sJj0hIzckIi8iZnIsXTguKSEjNTckNyQkIjApPklAYzldPSEjNyQiMC5SNypIUk0hKSEjNjckJCIwLmwiKlxOLCY9ISM3JCIvImZyLF04LikhIzU3JDckJCIwKT5JQGM5XT0hIzckIjAuUjcqSFJNISkhIzY3JCQiMGk5I1FsPF09ISM3JCIwcz8ieSplTy8pISM2NyQ3JCQiMDM1KCo0KD1dPSEjNyQiMFJGPmFMby8pISM2NyQkIjBpOSNRbDxdPSEjNyQiMHM/InkqZU8vKSEjNjckNyQkIjAzNSgqNCg9XT0hIzckIjBSRj5hTG8vKSEjNjckJCIwJj06JGU8LSY9ISM3JCIvUj8/eidmMCkhIzU3JDckJCIwcCopW2VHLSY9ISM3JCIwdjpFNHUjZiEpISM2NyQkIjAmPTokZTwtJj0hIzckIi9SPz96J2YwKSEjNTckNyQkIjBwKilbZUctJj0hIzckIjB2OkU0dSNmISkhIzY3JCQiMDpQWWplLSY9ISM3JCIwLCJIVG9GbyEpISM2NyQ3JCQiMDtCbDJxLSY9ISM3JCIwNi9Mazk8MikhIzY3JCQiMDpQWWplLSY9ISM3JCIwLCJIVG9GbyEpISM2NyQ3JCQiMDtCbDJxLSY9ISM3JCIwNi9Mazk8MikhIzY3JCQiMCkzRCRwKkhdPSEjNyQiMDlAJlJkZSEzKSEjNjckNyQkIjBVP2JkNi4mPSEjNyQiMFojKlI+YlQzKSEjNjckJCIwKTNEJHAqSF09ISM3JCIwOUAmUmRlITMpISM2NyQ3JCQiMFU/YmQ2LiY9ISM3JCIwWiMqUj5iVDMpISM2NyQkIjB1ZyFlMk1dPSEjNyQiMG4kKXloJSpHNCkhIzY3JDckJCIwV0c4M2AuJj0hIzckIjAkM29XZGYnNCkhIzY3JCQiMHVnIWUyTV09ISM3JCIwbiQpeWglKkc0KSEjNjckNyQkIjBXRzgzYC4mPSEjNyQiMCQzb1dkZic0KSEjNjckJCIwLmQlSD1RXT0hIzckIjA9Rl5aLl81KSEjNjckNyQkIjBcKWUkZiVSXT0hIzckIjA+cGBITyE0IikhIzY3JCQiMC5kJUg9UV09ISM3JCIwPUZeWi5fNSkhIzY3JDckJCIwXCllJGYlUl09ISM3JCIwPnBgSE8hNCIpISM2NyQkIjBaUnohSFVdPSEjNyQiMEZcJzRCXjwiKSEjNjckNyQkIjBBI2U4aFZdPSEjNyQiMGJkZyVvWkAiKSEjNjckJCIwWlJ6IUhVXT0hIzckIjBGXCc0Ql48IikhIzY3JDckJCIwQSNlOGhWXT0hIzckIjBiZGclb1pAIikhIzY3JCQiMChRLiQqUlldPSEjNyQiMFVxSDdAKUgiKSEjNjckNyQkIjBzRStreC8mPSEjNyQiMCJmdSdSPFI4KSEjNjckJCIwKFEuJCpSWV09ISM3JCIwVXFIN0ApSCIpISM2NyQ3JCQiMHNFK2t4LyY9ISM3JCIwImZ1J1I8UjgpISM2NyQkIjB0W1YzMDAmPSEjNyQiMCdmTTsqSEA5KSEjNjckNyQkIjBSQEg8PjAmPSEjNyQiMEZNdSV6TlkiKSEjNjckJCIwdFtWMzAwJj0hIzckIjAnZk07KkhAOSkhIzY3JDckJCIwUkBIPD4wJj0hIzckIjBGTXUlek5ZIikhIzY3JCQiMFkkKT09WTAmPSEjNyQiMCJ5eCpvUVc6KSEjNjckNyQkIjBsbEFyZzAmPSEjNyQiMGpBIilcKXplIikhIzY3JCQiMFkkKT09WTAmPSEjNyQiMCJ5eCpvUVc6KSEjNjckNyQkIjBtbEFyZzAmPSEjNyQiMGpBIilcKXplIikhIzY3JCQiMCl6VydHKGVdPSEjNyQiMCcqbzFXWm47KSEjNjckNyQkIjAtVCRmQWddPSEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMCl6VydHKGVdPSEjNyQiMCcqbzFXWm47KSEjNjckNyQkIjAtVCRmQWddPSEjNyQiMCo0IilbIVI3PCkhIzY3JCQiMGx2d1JHMSY9ISM3JCIwLyY+cWgweiIpISM2NyQ3JCQiMHJrRyJRa109ISM3JCIwTipcKmZ6Tz0pISM2NyQkIjBsdndSRzEmPSEjNyQiMC8mPnFoMHoiKSEjNjckNyQkIjBya0ciUWtdPSEjNyQiME8qXCpmek89KSEjNjckJCIwSEBeXnAxJj0hIzckIjBeJHl6W08iPikhIzY3JDckJCIwV0pMUCZvXT0hIzckIjByKD1dLDcnPikhIzY3JCQiMEhAXl5wMSY9ISM3JCIwXiR5eltPIj4pISM2NyQ3JCQiMFdKTFAmb109ISM3JCIwcig9XSw3Jz4pISM2NyQkIjBzXytrNTImPSEjNyQiMD1wYGN0Tz8pISM2NyQ3JCQiMHVPMCVwc109ISM3JCIwM3czcWcmMyMpISM2NyQkIjBzXytrNTImPSEjNyQiMD1wYGN0Tz8pISM2NyQ3JCQiMHVPMCVwc109ISM3JCIwM3czcWcmMyMpISM2NyQkIjBXSypwPHZdPSEjNyQiMFApM05BKWZAKSEjNjckNyQkIjBmQ1JebzImPSEjNyQiMFdrOkQsNUEpISM2NyQkIjBXSypwPHZdPSEjNyQiMFApM05BKWZAKSEjNjckNyQkIjBmQ1JebzImPSEjNyQiMFdrOkQsNUEpISM2NyQkIjBsJ0gySHpdPSEjNyQiMCopMzMpM0hHIykhIzY3JDckJCIweG5dNDUzJj0hIzckIi9HRC09V0wjKSEjNTckJCIwbCdIMkh6XT0hIzckIjAqKTMzKTNIRyMpISM2NyQ3JCQiMHhuXTQ1MyY9ISM3JCIvR0QtPVdMIykhIzU3JCQiMCJcVF5TJDMmPSEjNyQiMCpHKFtdKmZTIykhIzY3JDckJCIwYkxAb14zJj0hIzckIjA7VEhOIyllQykhIzY3JCQiMCJcVF5TJDMmPSEjNyQiMCpHKFtdKmZTIykhIzY3JDckJCIwYkxAb14zJj0hIzckIjA7VEhOIyllQykhIzY3JCQiMDlSPj92MyY9ISM3JCIwWSdSMyIzSEQpISM2NyQ3JCQiMCplI3BGJCozJj0hIzckIjBfSE8hSEtlIykhIzY3JCQiMDlSPj92MyY9ISM3JCIwWSdSMyIzSEQpISM2NyQ3JCQiMCplI3BGJCozJj0hIzckIjBfSE8hSEtlIykhIzY3JCQiMFA4JmVqIjQmPSEjNyQiMC5ARHA7X0UpISM2NyQ3JCQiMDdldShbJDQmPSEjNyQiMCl5SmFNd3EjKSEjNjckJCIwUDgmZWoiNCY9ISM3JCIwLkBEcDtfRSkhIzY3JDckJCIwN2V1KFskNCY9ISM3JCIwKXlKYU13cSMpISM2NyQkIjBUPD9fZDQmPSEjNyQiMFhEV0REdkYpISM2NyQ3JCQiMDdWZFt3NCY9ISM3JCIwQzFdKy9LRykhIzY3JCQiMFQ8P19kNCY9ISM3JCIwWERXRER2RikhIzY3JDckJCIwN1ZkW3c0Jj0hIzckIjBDMV0rL0tHKSEjNjckJCIwYy1JcCkqNCY9ISM3JCIwMlVCekwpKkcpISM2NyQ3JCQiL148LCI9NSY9ISM2JCIwaCVwYlhrJkgpISM2NyQkIjBjLUlwKSo0Jj0hIzckIjAyVUJ6TCkqRykhIzY3JDckJCIvXjwsIj01Jj0hIzYkIjBoJXBiWGsmSCkhIzY3JCQiMG9QJnApUjUmPSEjNyQiLmpDSlVASSkhIio3JDckJCIwWCdRQShmNSY9ISM3JCIwKEhRMV4zMyQpISM2NyQkIjBvUCZwKVI1Jj0hIzckIi5qQ0pVQEkpISIqNyQ3JCQiMFgnUUEoZjUmPSEjNyQiMChIUTFeMzMkKSEjNjckJCIwVzZCMCIzXj0hIzckIi1lNzNYOSQpISIpNyQ3JCQiMChwMV04NV49ISM3JCIwTHJxbEQwSykhIzY3JCQiMFc2QjAiM149ISM3JCItZTczWDkkKSEiKTckNyQkIjAocDFdODVePSEjNyQiMExycWxEMEspISM2NyQkIjBpZT5DQTYmPSEjNyQiMHNkMUhmbkspISM2NyQ3JCQiMFVeWylIOV49ISM3JCIwcGZ4P21ITCkhIzY3JCQiMGllPkNBNiY9ISM3JCIwc2QxSGZuSykhIzY3JDckJCIwVV5bKUg5Xj0hIzckIjBwZng/bUhMKSEjNjckJCIwSDt5Vmo2Jj0hIzckIjAjPSMpW3gxUiQpISM2NyQ3JCQiME1PbmklPV49ISM3JCIwMFslZW5TWCQpISM2NyQkIjBIO3lWajYmPSEjNyQiMCM9IylbeDFSJCkhIzY3JDckJCIwTU9uaSU9Xj0hIzckIjAwWyVlblNYJCkhIzY3JCQiMFBWMGsvNyY9ISM3JCIwW2ZcPXc4TikhIzY3JDckJCIwaSkzdmlBXj0hIzckIjBUTyI0dCV5TikhIzY3JCQiMFBWMGsvNyY9ISM3JCIwW2ZcPXc4TikhIzY3JDckJCIwaSkzdmlBXj0hIzckIjBUTyI0dCV5TikhIzY3JCQiMGAsLCZlQ149ISM3JCIwaCQ+KmYlb2okKSEjNjckNyQkIjBuLDAkekVePSEjNyQiMHhDKWZ5R3EkKSEjNjckJCIwYCwsJmVDXj0hIzckIjBoJD4qZiVvaiQpISM2NyQ3JCQiMG4sMCR6RV49ISM3JCIweEMpZnlHcSQpISM2NyQkIjAnb0dscUdePSEjNyQiL1hRJipIKmZQKSEjNTckNyQkIjBOdUNmNDgmPSEjNyQiMDg4MFRHRlEpISM2NyQkIjAnb0dscUdePSEjNyQiL1hRJipIKmZQKSEjNTckNyQkIjBOdUNmNDgmPSEjNyQiMDg4MFRHRlEpISM2NyQkIjAoXCh6R0c4Jj0hIzckIjAzPXZPLCQpUSkhIzY3JDckJCIwYzE6RV44Jj0hIzckIi86P2gqb15SKSEjNTckJCIwKFwoekdHOCY9ISM3JCIwMz12TywkKVEpISM2NyQ3JCQiMGMxOkVeOCY9ISM3JCIvOj9oKm9eUikhIzU3JCQiMFAoKm9ecDgmPSEjNyQiMHNoJz4oNDFTKSEjNjckNyQkIjByLnEkSFJePSEjNyQiMCcpKik9XjR3UykhIzY3JCQiMFAoKm9ecDgmPSEjNyQiMHNoJz4oNDFTKSEjNjckNyQkIjByLnEkSFJePSEjNyQiMCcpKik9XjR3UykhIzY3JCQiMFhgP3Y1OSY9ISM3JCIwTTw9MD1IVCkhIzY3JDckJCIwQmwqPVlWXj0hIzckIjBBeUQxXStVKSEjNjckJCIwWGA/djU5Jj0hIzckIjBNPD0wPUhUKSEjNjckNyQkIjBCbCo9WVZePSEjNyQiMEF5RDFdK1UpISM2NyQkIi8sKFIqPlhePSEjNiQiMGMmSGlqQUQlKSEjNjckNyQkIjBoOnpJdzkmPSEjNyQiMGVtS2ghXEslKSEjNjckJCIvLChSKj5YXj0hIzYkIjBjJkhpakFEJSkhIzY3JDckJCIwaDp6SXc5Jj0hIzckIjBlbUtoIVxLJSkhIzY3JCQiMEd5OkMkXF49ISM3JCIwOUNYbE12VikhIzY3JDckJCIwRWdOKz06Jj0hIzckIjAlXCZSO0pcVykhIzY3JCQiMEd5OkMkXF49ISM3JCIwOUNYbE12VikhIzY3JDckJCIwRWdOKz06Jj0hIzckIjAlXCZSO0pcVykhIzY3JCQiMCdmbydcTTomPSEjNyQiMCZmcUFIJSlcJSkhIzY3JDckJCIwYCM+MShmOiY9ISM3JCIvTGs5PFBkJSkhIzU3JCQiMCdmbydcTTomPSEjNyQiMCZmcUFIJSlcJSkhIzY3JDckJCIwYCM+MShmOiY9ISM3JCIvTGs5PFBkJSkhIzU3JCQiMCZbLWVkZF49ISM3JCIwbjI0PF5AWSkhIzY3JDckJCIwdydHOjlnXj0hIzckIjBtSmBFNylwJSkhIzY3JCQiMCZbLWVkZF49ISM3JCIwbjI0PF5AWSkhIzY3JDckJCIwdydHOjlnXj0hIzckIjBtSmBFNylwJSkhIzY3JCQiME8lZkRxaF49ISM3JCIwQUoiKlJmV1opISM2NyQ3JCQiME9VMzhWOyY9ISM3JCIwLj9nIkdEI1spISM2NyQkIjBPJWZEcWhePSEjNyQiMEFKIipSZldaKSEjNjckNyQkIjBPVTM4VjsmPSEjNyQiMC4/ZyJHRCNbKSEjNjckJCIwKVFSKkhlOyY9ISM3JCIwYHl0Z25uWykhIzY3JDckJCIwcCRvYFtvXj0hIzckIjBSM25PJHAlXCkhIzY3JCQiMClRUipIZTsmPSEjNyQiMGB5dGdublspISM2NyQ3JCQiMHAkb2Bbb149ISM3JCIwUjNuTyRwJVwpISM2NyQkIjB5Vi1lKnBePSEjNyQiMDk+SXp2ISpcKSEjNjckNyQkIjAvdUBlRTwmPSEjNyQiMHYnUjxSODImKSEjNjckJCIweVYtZSpwXj0hIzckIjA5Pkl6diEqXCkhIzY3JDckJCIwL3VAZUU8Jj0hIzckIjB2J1I8UjgyJikhIzY3JCQiMCp6JXAnM3VePSEjNyQiMEEpKSlmUlE2JikhIzY3JDckJCIwLzAlPSRvPCY9ISM3JCIwNiYzb1dkPiYpISM2NyQkIjAqeiVwJzN1Xj0hIzckIjBBKSkpZlJRNiYpISM2NyQ3JCQiMC8wJT0kbzwmPSEjNyQiMDYmM29XZD4mKSEjNjckJCIwSCwyOyN5Xj0hIzckIjBwYVQ1I3BCJikhIzY3JDckJCIuJjRoKyI9Jj0hIzUkIjBadCg9XSxLJikhIzY3JCQiMEgsMjsjeV49ISM3JCIwcGFUNSNwQiYpISM2NyQ3JCQiLiY0aCsiPSY9ISM1JCIwWnQoPV0sSyYpISM2NyQkIjA7dy1ZQj0mPSEjNyQiMGVhKEgtK08mKSEjNjckNyQkIjBMQTIiPSY9Jj0hIzckIjAkPVlwYlhXJikhIzY3JCQiMDt3LVlCPSY9ISM3JCIwZWEoSC0rTyYpISM2NyQ3JCQiMExBMiI9Jj0mPSEjNyQiMCQ9WXBiWFcmKSEjNjckJCIwRnN0d2s9Jj0hIzckIjAsUTdMMyRbJikhIzY3JDckJCIwLmNqYyQqPSY9ISM3JCIwPl0sNycqb2IpISM2NyQkIjBGc3R3az0mPSEjNyQiMCxRN0wzJFsmKSEjNjckNyQkIjAuY2pjJCo9Jj0hIzckIjA+XSw3JypvYikhIzY3JCQiMFFMKXpnIT4mPSEjNyQiMCIpPWJUOzFjKSEjNjckNyQkIjBXYSRIYCQ+Jj0hIzckIjBiUTNuTyRwJikhIzY3JCQiMFFMKXpnIT4mPSEjNyQiMCIpPWJUOzFjKSEjNjckNyQkIjBXYSRIYCQ+Jj0hIzckIjBiUTNuTyRwJikhIzY3JCQiMFcoeSpSWj4mPSEjNyQiMCRReHZXI0hkKSEjNjckNyQkIi9tPio0eD4mPSEjNiQiMCJwX0BzeCJlKSEjNjckJCIwVyh5KlJaPiY9ISM3JCIwJFF4dlcjSGQpISM2NyQ3JCQiL20+KjR4PiY9ISM2JCIwI3BfQHN4ImUpISM2NyQkIjBqOWNzKSk+Jj0hIzckIjAmcD48REImZSkhIzY3JDckJCIwJypbXigpPT8mPSEjNyQiMEc6QXg8VWYpISM2NyQkIjBqOWNzKSk+Jj0hIzckIjAmcD48REImZSkhIzY3JDckJCIwJypbXigpPT8mPSEjNyQiMEc6QXg8VWYpISM2NyQkIjBKJHBkKy5fPSEjNyQiMCdcZFEwYShmKSEjNjckNyQkIjBLJWVkMTFfPSEjNyQiMGsuSEtlbWcpISM2NyQkIjBKJHBkKy5fPSEjNyQiMCdcZFEwYShmKSEjNjckNyQkIjBLJWVkMTFfPSEjNyQiMGsuSEtlbWcpISM2NyQkIjAjeU0nUnI/Jj0hIzckIi96JylRJlspNCcpISM1NyQ3JCQiMEg/b1ctQCY9ISM3JCIuI2Z0KSk0PicpISIqNyQkIjAjeU0nUnI/Jj0hIzckIi96JylRJlspNCcpISM1NyQ3JCQiMEg/b1ctQCY9ISM3JCIuI2Z0KSk0PicpISIqNyQkIjBoRDd1N0AmPSEjNyQiMD4xIz5sOkEnKSEjNjckNyQkIi8wXlVVOV89ISM2JCIwTyFHQyVSOmopISM2NyQkIjBoRDd1N0AmPSEjNyQiMD4xIz5sOkEnKSEjNjckNyQkIi8wXlVVOV89ISM2JCIwTyFHQyVSOmopISM2NyQkIjA9Rz80YUAmPSEjNyQiMCVwYSFba1dqKSEjNjckNyQkIjAqUU5YZz1fPSEjNyQiMHNvXCgqelJrKSEjNjckJCIwPUc/NGFAJj0hIzckIjAlcGEhW2tXaikhIzY3JDckJCIwKlFOWGc9Xz0hIzckIjBzb1woKnpSaykhIzY3JCQiMCRvTV1hPl89ISM3JCIweCh5PEN4WScpISM2NyQ3JCQiMEUjKVwmeUFfPSEjNyQiMDNkY18/a2wpISM2NyQkIjAkb01dYT5fPSEjNyQiMHgoeTxDeFknKSEjNjckNyQkIjBFIylcJnlBXz0hIzckIjAzZGNfP2tsKSEjNjckJCIwI1IiXCJvQl89ISM3JCIwRiQqXEwhM2YnKSEjNjckNyQkIjBuITRyJ3BBJj0hIzckIjBYWGoyaClvJykhIzY3JCQiMCNSIlwib0JfPSEjNyQiMEYkKlxMITNmJykhIzY3JDckJCIwbiE0cidwQSY9ISM3JCIwWFhqMmgpbycpISM2NyQkIjAmKUdkPXlBJj0hIzckIjBObEBCKVFyJykhIzY3JDckJCIwYnlPXDZCJj0hIzckIjAiUS5GO0kibykhIzY3JCQiMCYpR2Q9eUEmPSEjNyQiME5sQEIpUXInKSEjNjckNyQkIjBieU9cNkImPSEjNyQiMCJRLkY7SSJvKSEjNjckJCIwMCJ6aSY+QiY9ISM3JCIwImZJNGhwJG8pISM2NyQ3JCQiMEpYRktgQiY9ISM3JCIwPEF4PFVQcCkhIzY3JCQiMDAiemkmPkImPSEjNyQiMCJmSTRocCRvKSEjNjckNyQkIjBKWEZLYEImPSEjNyQiMDxBeDxVUHApISM2NyQkIjBASWolNE9fPSEjNyQiMFB5YydSKydwKSEjNjckNyQkIjAqPV5lXlJfPSEjNyQiMGA1JUdGPTEoKSEjNjckJCIwQElqJTRPXz0hIzckIjBQeWMnUisncCkhIzY3JDckJCIwKj1eZV5SXz0hIzckIjBgNSVHRj0xKCkhIzY3JCQiMGhyZUwtQyY9ISM3JCIwJlwhRyE9SjMoKSEjNjckNyQkIi9PZixxVl89ISM2JCIwKikpNHpLaT0oKSEjNjckJCIwaHJlTC1DJj0hIzckIjAmXCFHIT1KMygpISM2NyQ3JCQiL09mLHFWXz0hIzYkIjAqKSk0ektpPSgpISM2NyQkIjAkPnNLUFdfPSEjNyQiMCVlXDsnPjFzKSEjNjckNyQkIjBfJDRdKXlDJj0hIzckIjBEKHlIUTFKKCkhIzY3JCQiMCQ+c0tQV189ISM3JCIwJWVcOyc+MXMpISM2NyQ3JCQiMF8kNF0peUMmPSEjNyQiMEQoeUhRMUooKSEjNjckJCIwInAmXDgmW189ISM3JCIwMUBIVEZIdCkhIzY3JDckJCIwTl1qcT9EJj0hIzckIjBodi9RL051KSEjNjckJCIwInAmXDgmW189ISM3JCIwMUBIVEZIdCkhIzY3JDckJCIwTl1qcT9EJj0hIzckIjBodi9RL051KSEjNjckJCIwYipcV2xfXz0hIzckIjBsOWY9Tl91KSEjNjckNyQkIjA2JDNwRGNfPSEjNyQiMChSO0pcJWZ2KSEjNjckJCIwYipcV2xfXz0hIzckIjBsOWY9Tl91KSEjNjckNyQkIjA2JDNwRGNfPSEjNyQiMChSO0pcJWZ2KSEjNjckJCIvSjdnemNfPSEjNiQiMDM1JVJIYWQoKSEjNjckNyQkIi8pUSJRV2dfPSEjNiQiME1fPVsmUW8oKSEjNjckJCIvSjdnemNfPSEjNiQiMDM1JVJIYWQoKSEjNjckNyQkIi8pUSJRV2dfPSEjNiQiME1fPVsmUW8oKSEjNjckJCIwKmU7I1E0RSY9ISM3JCIwX0FCbl0pcCgpISM2NyQ3JCQiL2IkUUpZRSY9ISM2JCIvMmFLZyMzeSkhIzU3JCQiMCplOyNRNEUmPSEjNyQiMF9BQm5dKXAoKSEjNjckNyQkIi9iJFFKWUUmPSEjNiQiLzJhS2cjM3kpISM1NyQkIjA2Xi8iM2xfPSEjNyQiMCIqPV9RZUB5KSEjNjckNyQkIjBSMWc+KW9fPSEjNyQiMDFIS2VtS3opISM2NyQkIjA2Xi8iM2xfPSEjNyQiMCIqPV9RZUB5KSEjNjckNyQkIjBSMWc+KW9fPSEjNyQiMDFIS2VtS3opISM2NyQkIjAxY1tDI3BfPSEjNyQiL0ZceWdZJXopISM1NyQ3JCQiMCcqUlgzSUYmPSEjNyQiMFU8UjgyZCEpKSEjNjckJCIwMWNbQyNwXz0hIzckIi9GXHlnWSV6KSEjNTckNyQkIjAnKlJYM0lGJj0hIzckIjBVPFI4MmQhKSkhIzY3JCQiMCp5aiZvTEYmPSEjNyQiMEw+OHZ0biEpKSEjNjckNyQkIjBMYTMpPnhfPSEjNyQiMHkwWW9aIj0pKSEjNjckJCIwKnlqJm9MRiY9ISM3JCIwTD44dnRuISkpISM2NyQ3JCQiMExhMyk+eF89ISM3JCIweTBZb1oiPSkpISM2NyQkIjBzSlE4dkYmPSEjNyQiMHR6LlMiMz4pKSEjNjckNyQkIjAnPlojKVEiRyY9ISM3JCIwOSVITiMpZUkpKSEjNjckJCIwc0pROHZGJj0hIzckIjB0ei5TIjM+KSkhIzY3JDckJCIwJz5aIylRIkcmPSEjNyQiMDklSE4jKWVJKSkhIzY3JCQiMHYycmU7RyY9ISM3JCIwSldKLipRSikpISM2NyQ3JCQiMDFzPHpiRyY9ISM3JCIvRClmeUdJJSkpISM1NyQkIjB2MnJlO0cmPSEjNyQiMEpXSi4qUUopKSEjNjckNyQkIjAxczx6YkcmPSEjNyQiL0QpZnlHSSUpKSEjNTckJCIwZUB5L2VHJj0hIzckIjAkKmY/aydwVikpISM2NyQ3JCQiMHBZanEoKkcmPSEjNyQiMCgzbk8kcGEmKSkhIzY3JCQiMGVAeS9lRyY9ISM3JCIwJCpmP2sncFYpKSEjNjckNyQkIjBwWWpxKCpHJj0hIzckIjAoM25PJHBhJikpISM2NyQkIjBYKmU4JioqRyY9ISM3JCIwLnFaQi9nJikpISM2NyQ3JCQiMEBJJ0cnUkgmPSEjNyQiMEJmdCkpNHonKSkhIzY3JCQiMFgqZTgmKipHJj0hIzckIjAucVpCL2cmKSkhIzY3JDckJCIwQEknRydSSCY9ISM3JCIwQmZ0KSk0eicpKSEjNjckJCIwIzQjbyk0JUgmPSEjNyQiMFZbTiE9Sm8pKSEjNjckNyQkIi86VGQ6KUgmPSEjNiQiMGZaIVEvTiEpKSkhIzY3JCQiMCM0I28pNCVIJj0hIzckIjBWW04hPUpvKSkhIzY3JDckJCIvOlRkOilIJj0hIzYkIjBmWiFRL04hKSkpISM2NyQkIjA0PGpZIylIJj0hIzckIjBVUkFOPjEpKSkhIzY3JDckJCIwJyoqbyNcQkkmPSEjNyQiMCZmdCkpNHojKikpISM2NyQkIjA0PGpZIylIJj0hIzckIjBVUkFOPjEpKSkhIzY3JDckJCIwJyoqbyNcQkkmPSEjNyQiMCZmdCkpNHojKikpISM2NyQkIjA9IjRfUi1gPSEjNyQiMGErMylvI0gqKSkhIzY3JDckJCIweSY9TGExYD0hIzckIjBKQyVSOkIwKikhIzY3JCQiMD0iNF9SLWA9ISM3JCIwYSszKW8jSCopKSEjNjckNyQkIjB5Jj1MYTFgPSEjNyQiMEpDJVI6QjAqKSEjNjckJCIwZU5HV2xJJj0hIzckIjBmQ01STV8hKikhIzY3JDckJCIwOjtITG1JJj0hIzckIi8mUlJPKVwwKikhIzU3JCQiMGVOR1dsSSY9ISM3JCIwZkNNUk1fISopISM2NyQ3JCQiMDo7SExtSSY9ISM3JCIwWUNWTiI9cDwhIzc3JCQiME5TJ0c5U2I9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVEdGPVlwJj0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwTlMnRzlTYj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA6O0hMbUkmPSEjNyQiLyZSUk8pXDAqKSEjNTckJCIwOCgpKmZwNWA9ISM3JCIwUnY4Iz1hPCopISM2NyQ3JCQiMC9FIylSMkomPSEjNyQiMG43LDRzdyIqKSEjNjckJCIwOCgpKmZwNWA9ISM3JCIwUnY4Iz1hPCopISM2NyQ3JCQiMC9FIylSMkomPSEjNyQiMG43LDRzdyIqKSEjNjckJCIwI28iUVtbSiY9ISM3JCIwMzh6QVwpSCopISM2NyQ3JCQiMD0vLFBcSiY9ISM3JCIwLiwzazcsJCopISM2NyQkIjAjbyJRW1tKJj0hIzckIjAzOHpBXClIKikhIzY3JDckJCIwPS8sUFxKJj0hIzckIjAuLDNrNywkKikhIzY3JCQiMGRwUSwhPmA9ISM3JCIvb1w5bTpVKikhIzU3JDckJCIwVCNcWzg+YD0hIzckIjBSKlsiPmBEJSopISM2NyQkIjBkcFEsIT5gPSEjNyQiL29cOW06VSopISM1NyQ3JCQiMFQjXFs4PmA9ISM3JCIwUipbIj5gRCUqKSEjNjckJCIwaEM5YkpLJj0hIzckIjAiWy14UllhKikhIzY3JDckJCIwcyxZTExLJj0hIzckIjB3eEB1JCpcJiopISM2NyQkIjBoQzliSksmPSEjNyQiMCJbLXhSWWEqKSEjNjckNyQkIjBzLFlMTEsmPSEjNyQiMHd4QHUkKlwmKikhIzY3JCQiL2QsJTR0SyY9ISM2JCIwKFxTQjh4bSopISM2NyQ3JCQiMFgpKmVLdksmPSEjNyQiMDdtR0hNdScqKSEjNjckJCIvZCwlNHRLJj0hIzYkIjAoXFNCOHhtKikhIzY3JDckJCIwWCkqZUt2SyY9ISM3JCIwN21HSE11JyopISM2NyQkIjBVKHlVWUpgPSEjNyQiMEVuKlwneSF6KikhIzY3JDckJCIwN1hQSzxMJj0hIzckIjBbYU4lWygpeiopISM2NyQkIjBVKHlVWUpgPSEjNyQiMEVuKlwneSF6KikhIzY3JDckJCIwN1hQSzxMJj0hIzckIjBbYU4lWygpeiopISM2NyQkIjByKCl5PmNMJj0hIzckIjBGUGkmZlEiKiopISM2NyQ3JCQiMC0nM0ckZkwmPSEjNyQiMCVHQyVSOkIqKikhIzY3JCQiMHIoKXk+Y0wmPSEjNyQiMEZQaSZmUSIqKikhIzY3JDckJCIwLSczRyRmTCY9ISM3JCIwJUdDJVI6QioqKSEjNjckJCIvblNneFJgPSEjNiQiMGM+KFFLcC4hKiEjNjckNyQkIjA5ITRTOFNgPSEjNyQiLzckXCVmdi8hKiEjNTckJCIvblNneFJgPSEjNiQiMGM+KFFLcC4hKiEjNjckNyQkIjA5ITRTOFNgPSEjNyQiLzckXCVmdi8hKiEjNTckJCIwejghRyRSTSY9ISM3JCIwNygpW10rZywqISM2NyQ3JCQiMCRSU2RMV2A9ISM3JCIwYz5jXCc+PCEqISM2NyQkIjB6OCFHJFJNJj0hIzckIjA3KClbXStnLCohIzY3JDckJCIwJFJTZExXYD0hIzckIjBjPmNcJz48ISohIzY3JCQiLy0pPSE0W2A9ISM2JCIwWyUpNHYyJEchKiEjNjckNyQkIjBcWzhRJltgPSEjNyQiMCN6SVlxakghKiEjNjckJCIvLSk9ITRbYD0hIzYkIjBbJSk0djIkRyEqISM2NyQ3JCQiMFxbOFEmW2A9ISM3JCIwI3pJWXFqSCEqISM2NyQkIjBocktbQU4mPSEjNyQiL0wmSChcaFMhKiEjNTckNyQkIjBaKXk3dV9gPSEjNyQiMEgnKnBmeD8vKiEjNjckJCIwaHJLW0FOJj0hIzckIi9MJkgoXGhTISohIzU3JDckJCIwWil5N3VfYD0hIzckIjBIJypwZng/LyohIzY3JCQiMCZbbHBTY2A9ISM3JCIwMDsqeUAjSDAqISM2NyQ3JCQiMDR5JlwlcE4mPSEjNyQiMGwlb1oiPVgwKiEjNjckJCIwJltscFNjYD0hIzckIjAwOyp5QCNIMCohIzY3JDckJCIwNHkmXCVwTiY9ISM3JCIwbCVvWiI9WDAqISM2NyQkIjBrJkhpY2dgPSEjNyQiMEU5W09IXzEqISM2NyQ3JCQiME9RSVw2TyY9ISM3JCIwLHQkKXBlcDEqISM2NyQkIjBrJkhpY2dgPSEjNyQiMEU5W09IXzEqISM2NyQ3JCQiME9RSVw2TyY9ISM3JCIwLHQkKXBlcDEqISM2NyQkIjBiZkNFWk8mPSEjNyQiMCcqKmVFbGB4ISohIzY3JDckJCIwLjRSYWBPJj0hIzckIjBQaCFcIypSeiEqISM2NyQkIjBiZkNFWk8mPSEjNyQiMCcqKmVFbGB4ISohIzY3JDckJCIwLjRSYWBPJj0hIzckIjBQaCFcIypSeiEqISM2NyQkIjBrOHcnKSlvYD0hIzckIjAoW09zTyUpKjMqISM2NyQ3JCQiMCJwUCtjcGA9ISM3JCIwdFwoKnpSPTQqISM2NyQkIjBrOHcnKSlvYD0hIzckIjAoW09zTyUpKjMqISM2NyQ3JCQiMCJwUCtjcGA9ISM3JCIwdFwoKnpSPTQqISM2NyQkIjBmKkchW0lQJj0hIzckIi84LSV6XUA1KiEjNTckNyQkIjBeKT5rd3RgPSEjNyQiMDRRL04hRy8iKiEjNjckJCIwZipHIVtJUCY9ISM3JCIvOC0lel1ANSohIzU3JDckJCIwXik+a3d0YD0hIzckIjA0US9OIUcvIiohIzY3JCQiMGthejRzUCY9ISM3JCIwWCFvKip5WDkiKiEjNjckNyQkIjByck90elAmPSEjNyQiMFhFNiE0czsiKiEjNjckJCIwa2F6NHNQJj0hIzckIjBYIW8qKnlYOSIqISM2NyQ3JCQiMHJyT3R6UCY9ISM3JCIwWEU2ITRzOyIqISM2NyQkIjA8PUBzOFEmPSEjNyQiMF8tWClcd0UiKiEjNjckNyQkIjBWNiU0PSNRJj0hIzckIjAiWyI9WGgiSCIqISM2NyQkIjA8PUBzOFEmPSEjNyQiMF8tWClcd0UiKiEjNjckNyQkIjBWNiU0PSNRJj0hIzckIjAiWyI9WGgiSCIqISM2NyQkIjAkUkpgYCZRJj0hIzckIjAzd24vcyFSIiohIzY3JDckJCIwPj1IKlEnUSY9ISM3JCIwPS5EKy07OSohIzY3JCQiMCRSSmBgJlEmPSEjNyQiMDN3bi9zIVIiKiEjNjckNyQkIjA+PUgqUSdRJj0hIzckIjA9LkQrLTs5KiEjNjckJCIwLzcrKnAqUSY9ISM3JCIwazE5NHo4OiohIzY3JDckJCIwKiozPilmIVImPSEjNyQiMGEiPmBEL2EiKiEjNjckJCIwLzcrKnAqUSY9ISM3JCIwazE5NHo4OiohIzY3JDckJCIwKiozPilmIVImPSEjNyQiMGEiPmBEL2EiKiEjNjckJCIwOyEqSGpRUiY9ISM3JCIwbStmNidvaiIqISM2NyQ3JCQiMCpIN3ghW1ImPSEjNyQiLyp6UTUkW20iKiEjNTckJCIwOyEqSGpRUiY9ISM3JCIwbStmNidvaiIqISM2NyQ3JCQiMCpIN3ghW1ImPSEjNyQiLyp6UTUkW20iKiEjNTckJCIwOzxIRyEpUiY9ISM3JCIvTTY9SipmPCohIzU3JDckJCIwQC0sPSEqUiY9ISM3JCIwRW9YbEIqeSIqISM2NyQkIjA7PEhHISlSJj0hIzckIi9NNj1KKmY8KiEjNTckNyQkIjBALSw9ISpSJj0hIzckIjBFb1hsQip5IiohIzY3JCQiME1FJVE+LWE9ISM3JCIwPUZDNSskKT0qISM2NyQ3JCQiL2JnKUdLUyY9ISM2JCIwaWNfP2s4PiohIzY3JCQiME1FJVE+LWE9ISM3JCIwPUZDNSskKT0qISM2NyQ3JCQiL2JnKUdLUyY9ISM2JCIwaWNfP2s4PiohIzY3JCQiMHg4LWdqUyY9ISM3JCIwLzVtMTIxPyohIzY3JDckJCIwbClHLlcyYT0hIzckIjApXCVmdi9RPyohIzY3JCQiMHg4LWdqUyY9ISM3JCIwLzVtMTIxPyohIzY3JDckJCIwbClHLlcyYT0hIzckIjApXCVmdi9RPyohIzY3JCQiMHNtKW9fNWE9ISM3JCIwJCp5KDNTIkhAKiEjNjckNyQkIjA9TmRfO1QmPSEjNyQiME1MbUlYaUAqISM2NyQkIjBzbSlvXzVhPSEjNyQiMCQqeSgzUyJIQCohIzY3JDckJCIwPU5kXztUJj0hIzckIjBNTG1JWGlAKiEjNjckJCIvPD1WcDlhPSEjNiQiMCNHeks0QUQjKiEjNjckNyQkIjAlZXVgJ2VUJj0hIzckIjByQHQmZW9HIyohIzY3JCQiLzw9VnA5YT0hIzYkIjAjR3pLNEFEIyohIzY3JDckJCIwJWV1YCdlVCY9ISM3JCIwckB0JmVvRyMqISM2NyQkIjA8dFBpKT1hPSEjNyQiMFUib095X1AjKiEjNjckNyQkIjAzbiMpeStVJj0hIzckIjAyNSEzazdUIyohIzY3JCQiMDx0UGkpPWE9ISM3JCIwVSJvT3lfUCMqISM2NyQ3JCQiMDNuIyl5K1UmPSEjNyQiMDI1ITNrN1QjKiEjNjckJCIwY1MxSklVJj0hIzckIi9tVz9aJClcIyohIzU3JDckJCIwUTUqR0hDYT0hIzckIjBWKXBlcGNgIyohIzY3JCQiMGNTMUpJVSY9ISM3JCIvbVc/WiQpXCMqISM1NyQ3JCQiMFE1KkdIQ2E9ISM3JCIwVilwZXBjYCMqISM2NyQkIjAsIVIuP0ZhPSEjNyQiMEReYGVUQEUqISM2NyQ3JCQiMEBQazImR2E9ISM3JCIweidRNHYrbSMqISM2NyQkIjAsIVIuP0ZhPSEjNyQiMEReYGVUQEUqISM2NyQ3JCQiMEBQazImR2E9ISM3JCIweidRNHYrbSMqISM2NyQkIjAqUXotUEphPSEjNyQiMHg9KkclW1dGKiEjNjckNyQkIjAjSFpJc0thPSEjNyQiMDp2KzFbJXkjKiEjNjckJCIwKlF6LVBKYT0hIzckIjB4PSpHJVtXRiohIzY3JDckJCIwI0haSXNLYT0hIzckIjA6disxWyV5IyohIzY3JCQiMCU+WjNhTmE9ISM3JCIwW29CRGJuRyohIzY3JDckJCIwJnAsIlJwViY9ISM3JCIwXmoyaCkpM0gqISM2NyQkIjAlPlozYU5hPSEjNyQiMFtvQkRibkcqISM2NyQ3JCQiMCZwLCJScFYmPSEjNyQiMF5qMmgpKTNIKiEjNjckJCIwZEIvNyhSYT0hIzckIjBFLWQwaSEqSCohIzY3JDckJCIwQUR3YjZXJj0hIzckIjAoPVhoIkhMSSohIzY3JCQiMGRCLzcoUmE9ISM3JCIwRS1kMGkhKkgqISM2NyQ3JCQiMEFEd2I2VyY9ISM3JCIwKD1YaCJITEkqISM2NyQkIjBjKyNRKVFXJj0hIzckIjBKZC4lKW84SiohIzY3JDckJCIwSHE2dGBXJj0hIzckIjBCU0BycGRKKiEjNjckJCIwYysjUSlRVyY9ISM3JCIwSmQuJSlvOEoqISM2NyQ3JCQiMEhxNnRgVyY9ISM3JCIwQlNAcnBkSiohIzY3JCQiMCwlb2kwW2E9ISM3JCIwVTNOZ3ZPSyohIzY3JDckJCIwKT5BNmZcYT0hIzckIi8nR0dFNSNHJCohIzU3JCQiMCwlb2kwW2E9ISM3JCIwVTNOZ3ZPSyohIzY3JDckJCIwKT5BNmZcYT0hIzckIi8nR0dFNSNHJCohIzU3JCQiLylbRUhBWCY9ISM2JCIwKlEzXEIpZkwqISM2NyQ3JCQiMG4rbDRRWCY9ISM3JCIwJ3BeODNsUyQqISM2NyQkIi8pW0VIQVgmPSEjNiQiMCpRM1xCKWZMKiEjNjckNyQkIjBuK2w0UVgmPSEjNyQiMCdwXjgzbFMkKiEjNjckJCIwYSsjSFNjYT0hIzckIi8nUU4yKkdbJCohIzU3JDckJCIwJVJjKkchZWE9ISM3JCIwSzBVTyI0YCQqISM2NyQkIjBhKyNIU2NhPSEjNyQiLydRTjIqR1skKiEjNTckNyQkIjAlUmMqRyFlYT0hIzckIjBLMFVPIjRgJCohIzY3JCQiMGJNPHgwWSY9ISM3JCIwWDYpeWRmZyQqISM2NyQ3JCQiMDlgeVtBWSY9ISM3JCIwbyQqWyI+YGwkKiEjNjckJCIwYk08eDBZJj0hIzckIjBYNil5ZGZnJCohIzY3JDckJCIwOWB5W0FZJj0hIzckIjBvJCpbIj5gbCQqISM2NyQkIjApKSp6P3ZrYT0hIzckIjAlPjlqQyFIUCohIzY3JDckJCIwckRScGtZJj0hIzckIjAvI2VsQyh6UCohIzY3JCQiMCkpKno/dmthPSEjNyQiMCU+OWpDIUhQKiEjNjckNyQkIjByRFJwa1kmPSEjNyQiMC8jZWxDKHpQKiEjNjckJCIweitmRipvYT0hIzckIjBrPiJHIjRfUSohIzY3JDckJCIwO0JfIXBxYT0hIzckIi8vRjtJVCFSKiEjNTckJCIweitmRipvYT0hIzckIjBrPiJHIjRfUSohIzY3JDckJCIwO0JfIXBxYT0hIzckIi8vRjtJVCFSKiEjNTckJCIwM2JuLkpaJj0hIzckIjBVXFl4OnZSKiEjNjckNyQkIjBmeU43XFomPSEjNyQiMHdlcGNgR1MqISM2NyQkIjAzYm4uSlomPSEjNyQiMFVcWXg6dlIqISM2NyQ3JCQiMGZ5TjdcWiY9ISM3JCIwd2VwY2BHUyohIzY3JCQiL1VWL0d4YT0hIzYkIjBwJkgqUkEpNCUqISM2NyQ3JCQiMCdmKnlNInphPSEjNyQiMDdadzYlSDolKiEjNjckJCIvVVYvR3hhPSEjNiQiMHAmSCpSQSk0JSohIzY3JDckJCIwJ2YqeU0iemE9ISM3JCIwN1p3NiVIOiUqISM2NyQkIjBNUXlkOVsmPSEjNyQiMClcZTAhSEBVKiEjNjckNyQkIi9icnlOJFsmPSEjNiQiMFxOJG9ZdEYlKiEjNjckJCIwTVF5ZDlbJj0hIzckIjApXGUwIUhAVSohIzY3JDckJCIvYnJ5TiRbJj0hIzYkIjBcTiRvWXRGJSohIzY3JCQiMHQ0dk5jWyY9ISM3JCIwa3k8Zk5XViohIzY3JDckJCIwLkxtImUoWyY9ISM3JCIwJlEtPl88UyUqISM2NyQkIjB0NHZOY1smPSEjNyQiMGt5PGZOV1YqISM2NyQ3JCQiMC5MbSJlKFsmPSEjNyQiMCZRLT5fPFMlKiEjNjckJCIwLVhTOSkqWyY9ISM3JCIwX2pmOlVuVyohIzY3JDckJCIwNnAvMT1cJj0hIzckIjBANyhwZGhfJSohIzY3JCQiMC1YUzkpKlsmPSEjNyQiMF9qZjpVblcqISM2NyQ3JCQiMDZwLzE9XCY9ISM3JCIwQDcocGRoXyUqISM2NyQkIjB3aWkkKlJcJj0hIzckIjApeSM+cVshZiUqISM2NyQ3JCQiMG0wM0pnXCY9ISM3JCIwZCsvS2NdWSohIzY3JCQiMHdpaSQqUlwmPSEjNyQiMCl5Iz5xWyFmJSohIzY3JDckJCIwbTAzSmdcJj0hIzckIjBkKy9LY11ZKiEjNjckJCIwLFladCIpXCY9ISM3JCIvQSF5QWI4WiohIzU3JDckJCIvQGtuRCtiPSEjNiQiMCQqKTNyb1x4JSohIzY3JCQiMCxZWnQiKVwmPSEjNyQiL0EheUFiOFoqISM1NyQ3JCQiL0BrbkQrYj0hIzYkIjAkKikzcm9ceCUqISM2NyQkIi91JylRTi1iPSEjNiQiMDgpZk48bSRbKiEjNjckNyQkIi84TklbL2I9ISM2JCIwSHg8VVAqKlsqISM2NyQkIi91JylRTi1iPSEjNiQiMDgpZk48bSRbKiEjNjckNyQkIi84TklbL2I9ISM2JCIwSHg8VVAqKlsqISM2NyQkIjBVIUdcYDFiPSEjNyQiMEE/S0FvZlwqISM2NyQ3JCQiMDsoZSo0KDNiPSEjNyQiMGxsQyh6UC0mKiEjNjckJCIwVSFHXGAxYj0hIzckIjBBP0tBb2ZcKiEjNjckNyQkIjA7KGUqNCgzYj0hIzckIjBsbEMoelAtJiohIzY3JCQiMCpSZW1yNWI9ISM3JCIwM1soKW91IzMmKiEjNjckNyQkIjApekV2JEheJj0hIzckIjAtYUpfPVteKiEjNjckJCIwKlJlbXI1Yj0hIzckIjAzWygpb3UjMyYqISM2NyQ3JCQiMCl6RXYkSF4mPSEjNyQiMC1hSl89W14qISM2NyQkIjAsJykpKSkqW14mPSEjNyQiMG9bI1E2ZT8mKiEjNjckNyQkIjBqRnZscl4mPSEjNyQiMFFVUTJmc18qISM2NyQkIjAsJykpKSkqW14mPSEjNyQiMG9bI1E2ZT8mKiEjNjckNyQkIjBqRnZscl4mPSEjNyQiMFFVUTJmc18qISM2NyQkIjBBViI9Mz5iPSEjNyQiMCN5V2x2KUdgKiEjNjckNyQkIjBmL2MlUkBiPSEjNyQiMHVJWGkqcFImKiEjNjckJCIwQVYiPTM+Yj0hIzckIjAjeVdsdilHYCohIzY3JDckJCIwZi9jJVJAYj0hIzckIjB1SVhpKnBSJiohIzY3JCQiMDREQ2xLXyY9ISM3JCIvY2B3Uj5YJiohIzU3JDckJCIwKEdNU2lEYj0hIzckIi8iPl88U0BiKiEjNTckJCIwNERDbEtfJj0hIzckIi9jYHdSPlgmKiEjNTckNyQkIjAoR01TaURiPSEjNyQiLyI+XzxTQGIqISM1NyQkIi8vRSVcdV8mPSEjNiQiMGsuTU8rdmIqISM2NyQ3JCQiMEpTOWEpSGI9ISM3JCIwWTJmcyFlayYqISM2NyQkIi8vRSVcdV8mPSEjNiQiMGsuTU8rdmIqISM2NyQ3JCQiMEpTOWEpSGI9ISM3JCIwWTJmcyFlayYqISM2NyQkIi8kPjZNO2AmPSEjNiQiMHpqVHQxKXAmKiEjNjckNyQkIi9QRFwzTWI9ISM2JCIwI2VmdzcteCYqISM2NyQkIi8kPjZNO2AmPSEjNiQiMHpqVHQxKXAmKiEjNjckNyQkIi9QRFwzTWI9ISM2JCIwI2VmdzcteCYqISM2NyQkIjBUSWI+ZWAmPSEjNyQiMDozMjM4QGUqISM2NyQ3JCQiMFBwTDskUWI9ISM3JCIwPSVHRj1ZKmUqISM2NyQkIjBUSWI+ZWAmPSEjNyQiMDozMjM4QGUqISM2NyQ3JCQiMFBwTDskUWI9ISM3JCIwPSVHRj1ZKmUqISM2NyQkIjAta1wwK2EmPSEjNyQiMDJbNlQ+V2YqISM2NyQ3JCQiME95TVtEYSY9ISM3JCIwYXN6UC0+ZyohIzY3JCQiMC1rXDArYSY9ISM3JCIwMls2VD5XZiohIzY3JDckJCIwT3lNW0RhJj0hIzckIjBhc3pQLT5nKiEjNjckJCIwOiVvPz5XYj0hIzckIi8xVkBkczEnKiEjNTckNyQkIjAuNCwieVliPSEjNyQiMCI0bUdITTknKiEjNjckJCIwOiVvPz5XYj0hIzckIi8xVkBkczEnKiEjNTckNyQkIjAuNCwieVliPSEjNyQiMCI0bUdITTknKiEjNjckJCIwQSFwI3okW2I9ISM3JCIwZWQ6LEshPicqISM2NyQ3JCQiMHNiQzk1YiY9ISM3JCIwRlwkek15RScqISM2NyQkIjBBIXAjeiRbYj0hIzckIjBlZDosSyE+JyohIzY3JDckJCIwc2JDOTViJj0hIzckIjBGXCR6TXlFJyohIzY3JCQiMDwhPXFjX2I9ISM3JCIwdCtUR1E4aiohIzY3JDckJCIwOzlAW19iJj0hIzckIjBqUCsuQyNSJyohIzY3JCQiMDwhPXFjX2I9ISM3JCIwdCtUR1E4aiohIzY3JDckJCIwOzlAW19iJj0hIzckIjBqUCsuQyNSJyohIzY3JCQiMFskSGF2Y2I9ISM3JCIva1NOWGtWJyohIzU3JDckJCIwVlp5I1tmYj0hIzckIjAqZnMhZWs7bCohIzY3JCQiMFskSGF2Y2I9ISM3JCIva1NOWGtWJyohIzU3JDckJCIwVlp5I1tmYj0hIzckIjAqZnMhZWs7bCohIzY3JCQiMEw9Wlc0YyY9ISM3JCIwWnVrd11mbCohIzY3JDckJCIwPSJHenJqYj0hIzckIjBOOTk4MFRtKiEjNjckJCIwTD1aVzRjJj0hIzckIjBadWt3XWZsKiEjNjckNyQkIjA9Ikd6cmpiPSEjNyQiME45OTgwVG0qISM2NyQkIjByTDVNXmMmPSEjNyQiMHlhJ3lwRG8nKiEjNjckNyQkIjA4XndgemMmPSEjNyQiMHItQG9YbG4qISM2NyQkIjByTDVNXmMmPSEjNyQiMHlhJ3lwRG8nKiEjNjckNyQkIjA4XndgemMmPSEjNyQiMHItQG9YbG4qISM2NyQkIjBqJz5WS3BiPSEjNyQiMEcmM3NKYyFvKiEjNjckNyQkIjBGM0AhPnNiPSEjNyQiMDIiektpKSopbyohIzY3JCQiMGonPlZLcGI9ISM3JCIwRyYzc0pjIW8qISM2NyQ3JCQiMEYzQCE+c2I9ISM3JCIwMiJ6S2kpKilvKiEjNjckJCIwXFo3Ok5kJj0hIzckIjBPT21NcEdwKiEjNjckNyQkIjAkUnBzVXdiPSEjNyQiMFd6TXlFOXEqISM2NyQkIjBcWjc6TmQmPSEjNyQiME9PbU1wR3AqISM2NyQ3JCQiMCRScHNVd2I9ISM3JCIwV3pNeUU5cSohIzY3JCQiMGYpKWYxeGQmPSEjNyQiMF9OKCpcdl5xKiEjNjckNyQkIjA6Ky1sMWUmPSEjNyQiL3k7TXQnUXIqISM1NyQkIjBmKSlmMXhkJj0hIzckIjBfTigqXHZecSohIzY3JDckJCIwOistbDFlJj0hIzckIi95O010J1FyKiEjNTckJCIwI1FrJykqPWUmPSEjNyQiMEhyUWoiWzwoKiEjNjckNyQkIjByaFEuXGUmPSEjNyQiMDtjWyl5SUUoKiEjNjckJCIwI1FrJykqPWUmPSEjNyQiMEhyUWoiWzwoKiEjNjckNyQkIjByaFEuXGUmPSEjNyQiMDtjWyl5SUUoKiEjNjckJCIvMydSIjQnZSY9ISM2JCIvbGtZeHlIKCohIzU3JDckJCIwSCVbQjkqZSY9ISM3JCIwX1diVlsoUSgqISM2NyQkIi8zJ1IiNCdlJj0hIzYkIi9sa1l4eUgoKiEjNTckNyQkIjBIJVtCOSplJj0hIzckIjBfV2JWWyhRKCohIzY3JCQiMDJhZiVHIWYmPSEjNyQiMFVGVyVRNFUoKiEjNjckNyQkIjB1Rio9USRmJj0hIzckIjApR0InKSopPV4oKiEjNjckJCIwMmFmJUchZiY9ISM3JCIwVUZXJVE0VSgqISM2NyQ3JCQiMHVGKj1RJGYmPSEjNyQiMClHQicpKik9XigqISM2NyQkIjBtIWUleVdmJj0hIzckIjAqKVE0IyoqUmEoKiEjNjckNyQkIjAxIz5BaShmJj0hIzckIjBDQHBgSE93KiEjNjckJCIwbSFlJXlXZiY9ISM3JCIwKilRNCMqKlJhKCohIzY3JDckJCIwMSM+QWkoZiY9ISM3JCIwQ0BwYEhPdyohIzY3JCQiMCN5VkluKWYmPSEjNyQiMCNmRXVmcW0oKiEjNjckNyQkIjBeRTVqPWcmPSEjNyQiLyc0dzNxZ3gqISM1NyQkIjAjeVZJbilmJj0hIzckIjAjZkV1ZnFtKCohIzY3JDckJCIwXkU1aj1nJj0hIzckIi8nNHczcWd4KiEjNTckJCIwInBMIm9HZyY9ISM3JCIwQUU5LDcheigqISM2NyQ3JCQiMEAoNFg1MWM9ISM3JCIwJ3pIUTFeKXkqISM2NyQkIjAicEwib0dnJj0hIzckIjBBRTksNyF6KCohIzY3JDckJCIwQCg0WDUxYz0hIzckIjAnekhRMV4peSohIzY3JCQiL0ZjUDEyYz0hIzYkIjB0MTouPTh6KiEjNjckNyQkIi87b21NNWM9ISM2JCIwTCcpKik9XjQhKSohIzY3JCQiL0ZjUDEyYz0hIzYkIjB0MTouPTh6KiEjNjckNyQkIi87b21NNWM9ISM2JCIwTCcpKik9XjQhKSohIzY3JCQiMEtlNWc3aCY9ISM3JCIvcEZHU2kuKSohIzU3JDckJCIvRnokKmU5Yz0hIzYkIjBwdSdSPFI4KSohIzY3JCQiMEtlNWc3aCY9ISM3JCIvcEZHU2kuKSohIzU3JDckJCIvRnokKmU5Yz0hIzYkIjBwdSdSPFI4KSohIzY3JCQiL0EmKXBYOmM9ISM2JCIwVmUhMyskZiIpKiEjNjckNyQkIjBEVyVHJCk9Yz0hIzckIjAwai5IS2UjKSohIzY3JCQiL0EmKXBYOmM9ISM2JCIwVmUhMyskZiIpKiEjNjckNyQkIjBEVyVHJCk9Yz0hIzckIjAwai5IS2UjKSohIzY3JCQiMCd5cFhsPmM9ISM3JCIweEdfJ2ZCRykqISM2NyQ3JCQiMCN6Tm8yQmM9ISM3JCIwVF41JUdGUSkqISM2NyQkIjAneXBYbD5jPSEjNyQiMHhHXydmQkcpKiEjNjckNyQkIjAjek5vMkJjPSEjNyQiMFReNSVHRlEpKiEjNjckJCIwQHJxX1FpJj0hIzckIjAjW24vPmFTKSohIzY3JDckJCIwVktdQHRpJj0hIzckIjB4UjxSODImKSohIzY3JCQiMEBycV9RaSY9ISM3JCIwI1tuLz5hUykqISM2NyQ3JCQiMFZLXUB0aSY9ISM3JCIweFI8UjgyJikqISM2NyQkIjAoSF05MEdjPSEjNyQiMCNccEN5JUcmKSohIzY3JDckJCIwOVNwbTpqJj0hIzckIjA4R0MlUjpqKSohIzY3JCQiMChIXTkwR2M9ISM3JCIwI1xwQ3klRyYpKiEjNjckNyQkIjA5U3BtOmomPSEjNyQiMDhHQyVSOmopKiEjNjckJCIwMnRwXUFqJj0hIzckIjB6ZiZHUDpsKSohIzY3JDckJCIwSFtpN2VqJj0hIzckIjBcO0pcJWZ2KSohIzY3JCQiMDJ0cF1BaiY9ISM3JCIwemYmR1A6bCkqISM2NyQ3JCQiMEhbaTdlaiY9ISM3JCIwXDtKXCVmdikqISM2NyQkIjBIM3Fda2omPSEjNyQiMFluIjMnZnUoKSohIzY3JDckJCIwI1E/ImYrayY9ISM3JCIwJ1shUS9OISkpKSohIzY3JCQiMEgzcV1raiY9ISM3JCIwWW4iMydmdSgpKiEjNjckNyQkIjAjUT8iZitrJj0hIzckIjAnWyFRL04hKSkpKiEjNjckJCIvMzM3bFNjPSEjNiQiME1CO1psKCopKSohIzY3JDckJCIwIkddaUlXYz0hIzckIjBBJFwlZnYvISoqISM2NyQkIi8zMzdsU2M9ISM2JCIwTUI7WmwoKikpKiEjNjckNyQkIjAiR11pSVdjPSEjNyQiMEEkXCVmdi8hKiohIzY3JCQiMG5gTV9bayY9ISM3JCIwVHhbSnI/ISoqISM2NyQ3JCQiMEtRLmEmW2M9ISM3JCIwZSI9WGgiSCIqKiEjNjckJCIwbmBNX1trJj0hIzckIjBUeFtKcj8hKiohIzY3JDckJCIwS1EuYSZbYz0hIzckIjBlIj1YaCJIIioqISM2NyQkIjBLRTZhIVxjPSEjNyQiMF5Kejh4ViIqKiEjNjckNyQkIjAiKTRaLUdsJj0hIzckIjAlKnBlcGNgIyoqISM2NyQkIjBLRTZhIVxjPSEjNyQiMF5Kejh4ViIqKiEjNjckNyQkIjAiKTRaLUdsJj0hIzckIjAlKnBlcGNgIyoqISM2NyQkIi9OJ1xjS2wmPSEjNiQiME8+NyVIb0UqKiEjNjckNyQkIjBVUlZecWwmPSEjNyQiLyRlbEMoelAqKiEjNTckJCIvTidcY0tsJj0hIzYkIjBPPjclSG9FKiohIzY3JDckJCIwVVJWXnFsJj0hIzckIi8kZWxDKHpQKiohIzU3JCQiMEglKVJmdWwmPSEjNyQiMEMnKXlzKSkqUSoqISM2NyQ3JCQiMCdSXTVJaGM9ISM3JCIwbVlzelAtJioqISM2NyQkIjBIJSlSZnVsJj0hIzckIjBDJyl5cykpKlEqKiEjNjckNyQkIjAnUl01SWhjPSEjNyQiMG1Zc3pQLSYqKiEjNjckJCIwQS4kSG1oYz0hIzckIjBUZVZcJUheKiohIzY3JDckJCIwKUc/OGJsYz0hIzckIjAtTnpNeUUnKiohIzY3JCQiMEEuJEhtaGM9ISM3JCIwVGVWXCVIXioqISM2NyQ3JCQiMClHPzhibGM9ISM3JCIwLU56TXlFJyoqISM2NyQkIjB0PjRuZW0mPSEjNyQiMHBQMUMrTycqKiEjNjckNyQkIjBqTkMtKXBjPSEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjB0PjRuZW0mPSEjNyQiMHBQMUMrTycqKiEjNjckNyQkIjBqTkMtKXBjPSEjNyQiMFFCJykqKT1eKCoqISM2NyQkIjBMYCg9MnFjPSEjNyQiMEAjKXAnZiFmKCoqISM2NyQ3JCQiMFxDcGBTbiY9ISM3JCIwdjYkXCVmdikqKiEjNjckJCIwTGAoPTJxYz0hIzckIjBAIylwJ2YhZigqKiEjNjckNyQkIjBcQ3BgU24mPSEjNyQiMHY2JFwlZnYpKiohIzY3JCQiL1ByckZ1Yz0hIzYkIjAmeilvbjYjKSkqKiEjNjckNyQkIjBjcCJmSXljPSEjNyQiMCwrKysrKysiISM1NyQkIi9QcnJGdWM9ISM2JCIwJnopb242IykpKiohIzY3JDckJCIwVEdGPVlwJj0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwaV8leTdHZj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBvU0QuRTMnPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBpXyV5N0dmPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG9TRC5FMyc9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMClbRUc2O2o9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJkhOIyllcWs9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMClbRUc2O2o9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJkhOIyllcWs9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMDp4IXk0L249ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQGxAdCZlbz0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwOngheTQvbj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBAbEB0JmVvPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVKil5IzMjNCg9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwW3g+ZWxDKD0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwVSopeSMzIzQoPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFt4PmVsQyg9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMG8seG4rWyg9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdSp5SmFNdz0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwbyx4bitbKD0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB1KnlKYU13PSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmUl5GMG95PSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCwtO0dELSk9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZSXkYwb3k9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwLC07R0QtKT0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwQEV0UGdEKT0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBGOTk4MFQpPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBARXRQZ0QpPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEY5OTgwVCk9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMFtRckFTayk9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYUU3KVwpeik9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMFtRckFTayk9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYUU3KVwpeik9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMHVdcDI/Lio9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvKVE1JFsnPSo9ISM2JCIwWUNWTiI9cDwhIzc3JCQiMHVdcDI/Lio9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvKVE1JFsnPSo9ISM2JCIwWUNWTiI9cDwhIzc3JCQiMCxqbiMqKj4lKj0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAyXjNvV2QqPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsam4jKio+JSo9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMl4zb1dkKj0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwRnZseHohKSo9ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTGoxYEMnKio9ISM3JCIwWUNWTiI9cDwhIzc3JCQiMEZ2bHh6ISkqPSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMExqMWBDJyoqPSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBhKFFFJ2Y+IT4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9jWiFRL04hPiEjNiQiMFlDVk4iPXA8ISM3NyQkIjBhKFFFJ2Y+IT4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9jWiFRL04hPiEjNiQiMFlDVk4iPXA8ISM3NyQkIi8pKj53JVJlIT4hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjAneUdJVVEyPiEjNyQiMFlDVk4iPXA8ISM3NyQkIi8pKj53JVJlIT4hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjAneUdJVVEyPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAyN2dLPig0PiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDgrLDNrNyI+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMDI3Z0s+KDQ+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOCssM2s3Ij4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwTENlPCpmOD4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9DIipIUjk6PiEjNiQiMFlDVk4iPXA8ISM3NyQkIjBMQ2U8KmY4PiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL0MiKkhSOTo+ISM2JCIwWUNWTiI9cDwhIzc3JCQiL21qRCF6dSI+ISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwbUMoelAtPj4hIzckIjBZQ1ZOIj1wPCEjNzckJCIvbWpEIXp1Ij4hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBtQyh6UC0+PiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoKVthKCllOCM+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJHBgSE8hSCM+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCgpW2EoKWU4Iz4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkcGBITyFIIz4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwOGhfc1FfIz4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+XCR6TXlFPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA4aF9zUV8jPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD5cJHpNeUU+ISM3JCIwWUNWTiI9cDwhIzc3JCQiL00ydiY9Ikg+ISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwWWgiSExtST4hIzckIjBZQ1ZOIj1wPCEjNzckJCIvTTJ2Jj0iSD4hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZaCJITG1JPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBtJilbVSkqSCQ+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwc3QqeUphTT4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwbSYpW1UpKkgkPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHN0KnlKYU0+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCR6cHUjeW8kPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpmeUdJVVE+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCR6cHUjeW8kPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpmeUdJVVE+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMD41WDdlMiU+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRClmeUdJVT4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwPjVYN2UyJT4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBEKWZ5R0lVPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBZQVYoempXPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF81JUdGPVk+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMFlBVih6alc+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXzUlR0Y9WT4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwc01UI3leWz4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5QSN5RDFdPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBzTVQjeV5bPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHlBI3lEMV0+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCpwJVJuKFJfPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDBOIUdDJVImPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAqcCVSbihSXz4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAwTiFHQyVSJj4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwRGZQX3hpJj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBKWnlGQXkmPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBEZlBfeGkmPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEpaeUZBeSY+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMF9yTlBkLCc+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZWZ3Ny08Jz4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwX3JOUGQsJz4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBlZnc3LTwnPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjB5JFFCcy5rPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCY9Wng+ZWw+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMHkkUUJzLms+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJj1aeD5lbD4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwMCc+dHEieic+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNiVHRj1ZcD4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwMCc+dHEieic+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNiVHRj1ZcD4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwSzNJI3B6cj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBRJzR4O010PiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLM0kjcHpyPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFEnNHg7TXQ+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMGU/R3h3Yyg+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwazNwX0BzKD4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwZT9HeHdjKD4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBrM3BfQHMoPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmR2pBbWJ6PiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCI0c3c4NSIpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmR2pBbWJ6PiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCI0c3c4NSIpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2WENaT00pPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDxMbEEiKVwpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2WENaT00pPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDxMbEEiKVwpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBRZEFLO3QpPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFdYajJoKSkpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBRZEFLO3QpPiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFdYajJoKSkpPiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBrcD88Jz4iKj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi94OkU0dSMqPiEjNiQiMFlDVk4iPXA8ISM3NyQkIjBrcD88Jz4iKj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi94OkU0dSMqPiEjNiQiMFlDVk4iPXA8ISM3NyQkIjAiPik9LXddKj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKnBmeD9tKj4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwIj4pPS13XSo+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKCpwZng/bSo+ISM3JCIwWUNWTiI9cDwhIzc3JCQiMDwlcHJlJiopKj4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBCI3lEMV0rPyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA8JXByZSYqKSo+ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQiN5RDFdKz8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwVzE6c05HKyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9YZnYvUS8/ISM2JCIwWUNWTiI9cDwhIzc3JCQiMFcxOnNORysjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvWGZ2L1EvPyEjNiQiMFlDVk4iPXA8ISM3NyQkIi8oPThkOm4rIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMHcxYUtnIzM/ISM3JCIwWUNWTiI9cDwhIzc3JCQiLyg9OGQ6bisjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwdzFhS2cjMz8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwKDQ4QGFmNT8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAuPl88U0AsIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoNDhAYWY1PyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC4+XzxTQCwjISM3JCIwWUNWTiI9cDwhIzc3JCQiMEJWNEZ2VywjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvOC5EKy07PyEjNiQiMFlDVk4iPXA8ISM3NyQkIjBCVjRGdlcsIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLzguRCstOz8hIzYkIjBZQ1ZOIj1wPCEjNzckJCIvYnY/Xk49PyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMGNWWygpKiopPj8hIzckIjBZQ1ZOIj1wPCEjNzckJCIvYnY/Xk49PyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMGNWWygpKiopPj8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwd24wKFxCQT8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkZWxDKHpQLSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwd24wKFxCQT8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkZWxDKHpQLSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwLiFRP1s2RT8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA0b1dkZnctIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAuIVE/WzZFPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDRvV2Rmdy0jISM3JCIwWUNWTiI9cDwhIzc3JCQiL0I+cVkqKkg/ISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTyFHQyVSOi4jISM3JCIwWUNWTiI9cDwhIzc3JCQiL0I+cVkqKkg/ISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTyFHQyVSOi4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMvK191US4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaSM0dSM+YS4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMvK191US4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaSM0dSM+YS4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMCRvIilwVnZQPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpbIVI3KkhSPyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkbyIpcFZ2UD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqWyFSNypIUj8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwNEgnPlVqVD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA6PFAoKnlKLyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwNEgnPlVqVD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA6PFAoKnlKLyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT1QlcFNeWD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBVSE4jKWVxLyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT1QlcFNeWD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBVSE4jKWVxLyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwaWAjPlJSXD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBvVExuUTQwIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBpYCM+UlJcPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG9UTG5RNDAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCplMXBQRmA/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlI6QiY9WzAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCplMXBQRmA/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlI6QiY9WzAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDp5KT1POmQ/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQG1IUClwZT8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwOnkpPU86ZD8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBAbUhQKXBlPyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVIXBvTS5oPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFt5RkF5RDEjISM3JCIwWUNWTiI9cDwhIzc3JCQiMFUhcG9NLmg/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwW3lGQXlEMSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwby0mPUwiXDEjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdiFmcyFlazEjISM3JCIwWUNWTiI9cDwhIzc3JCQiMG8tJj1MIlwxIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHYhZnMhZWsxIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmXEpvSnpvPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCwuQyN6THE/ISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZcSm9Kem8/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwLC5DI3pMcT8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwQEYiPUlucz8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBHOkF4PFUyIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBARiI9SW5zPyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEc6QXg8VTIjISM3JCIwWUNWTiI9cDwhIzc3JCQiMFtSeidHYnc/ISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYUY/aSg0eT8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwW1J6J0didz8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBhRj9pKDR5PyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2XnhySy8zIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCIpUj1aeD4zIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2XnhySy8zIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCIpUj1aeD4zIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsa3ZjN1YzIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDJfO0tkZTMjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCxrdmM3VjMjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMl87S2RlMyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwR3d0VCM+KTMjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTWs5PFAoKjMjISM3JCIwWUNWTiI9cDwhIzc3JCQiMEd3dFQjPikzIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME1rOTxQKCozIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBhKT1uQTIjNCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9tRkBxaCQ0IyEjNiQiMFlDVk4iPXA8ISM3NyQkIjBhKT1uQTIjNCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9tRkBxaCQ0IyEjNiQiMFlDVk4iPXA8ISM3NyQkIjAiMys8QCZmNCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKSkzcm9cKDQjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCIzKzxAJmY0IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCgpKTNyb1woNCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMjhvJz4kKSo0IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDgsNHN3ODUjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDI4byc+JCkqNCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA4LDRzdzg1IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBNRG0iPXIuQCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL01ycWxEMEAhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwTURtIj1yLkAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9NcnFsRDBAISM2JCIwWUNWTiI9cDwhIzc3JCQiL3dWbTtmMkAhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBtRDBVTyI0QCEjNyQiMFlDVk4iPXA8ISM3NyQkIi93Vm07ZjJAISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwbUQwVU8iNEAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKClcaV5yOTYjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJHpMcWksOEAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKClcaV5yOTYjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJHpMcWksOEAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOGlnT15gNiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+XSw3JypvNiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOGlnT15gNiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+XSw3JypvNiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvVyhlQEojPkAhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZaSpwZng/QCEjNyQiMFlDVk4iPXA8ISM3NyQkIi9XKGVASiM+QCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMFlpKnBmeD9AISM3JCIwWUNWTiI9cDwhIzc3JCQiMG0nb2w1NkJAISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdHUoPmVsQ0AhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbSdvbDU2QkAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB0dSg+ZWxDQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKilcOjQqcDcjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKnBlcGNgR0AhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJCopXDo0KnA3IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpwZXBjYEdAISM3JCIwWUNWTiI9cDwhIzc3JCQiLzdKbDIoMzgjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwRSpSPmJUS0AhIzckIjBZQ1ZOIj1wPCEjNzckJCIvN0psMigzOCMhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBFKlI+YlRLQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBZQl5oXVo4IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF82I3BgSE9AISM3JCIwWUNWTiI9cDwhIzc3JCQiMFlCXmhdWjgjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXzYjcGBIT0AhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdE5cWUknUUAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB6QiE+XzxTQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB0TlxZSSdRQCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHpCIT5fPFNAISM3JCIwWUNWTiI9cDwhIzc3JCQiMCp6dTkuXlVAISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwME8pb10wV0AhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKnp1OS5eVUAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAwTylvXTBXQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFZ1g7IVJZQCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEtbJz1cJHo5IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFZ1g7IVJZQCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEtbJz1cJHo5IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBfc1YscS06IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGVnJW9aIj06IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBfc1YscS06IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGVnJW9aIj06IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6JT1rKVxUOiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAmR0Y9WXBiQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6JT1rKVxUOiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAmR0Y9WXBiQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAwKCpSckghZUAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2JjNvV2RmQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAwKCpSckghZUAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2JjNvV2RmQCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLNFFjND47IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFEoKnlKYU07IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLNFFjND47IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFEoKnlKYU07IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBlQE9UKnlsQCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGs0eDtNdDsjISM3JCIwWUNWTiI9cDwhIzc3JCQiMGVAT1QqeWxAISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwazR4O010OyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJlFWaiNwJ3BAISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIj5fPFNAckAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJlFWaiNwJ3BAISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIj5fPFNAckAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwNllLNlxOPCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA9TXQnUTR2QCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2WUs2XE48IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD1NdCdRNHZAISM3JCIwWUNWTiI9cDwhIzc3JCQiMFFlSScqR3U8IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFdZcnJ0KnlAISM3JCIwWUNWTiI9cDwhIzc3JCQiMFFlSScqR3U8IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFdZcnJ0KnlAISM3JCIwWUNWTiI9cDwhIzc3JCQiMGxxRyIpMzg9IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHJlcGNgRz0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMGxxRyIpMzg9IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHJlcGNgRz0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMCJIb2knKT0mPSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoNHg7TXQnPSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIkhvaScpPSY9IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCg0eDtNdCc9IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA9Jlw3Jm8hKj0jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQyRlbUtoIT4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMD0mXDcmbyEqPSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDJGVtS2ghPiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVzJCT1tIPiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9iUjtKXCU+IyEjNiQiMFlDVk4iPXA8ISM3NyQkIjBXMkJPW0g+IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2JSO0pcJT4jISM2JCIwWUNWTiI9cDwhIzc3JCQiMHI+QEBHbz4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweDJpJ0hQKT4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMHI+QEBHbz4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweDJpJ0hQKT4jISM3JCIwWUNWTiI9cDwhIzc3JCQiMCg+JD4xMzI/IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC4/ZyJHRC1BISM3JCIwWUNWTiI9cDwhIzc3JCQiMCg+JD4xMzI/IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC4/ZyJHRC1BISM3JCIwWUNWTiI9cDwhIzc3JCQiMENXPCJ6ZS9BISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvQiRlbUtoPyMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwQ1c8InplL0EhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9CJGVtS2g/IyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9sYmh4WTNBISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwY1djXjcrQCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvbGJoeFkzQSEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMGNXY143K0AjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHhvOGhaQkAjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJG9YbEIqUUAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHhvOGhaQkAjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJG9YbEIqUUAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMC4iPWh1QTtBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvInBfQHN4QCMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwLiI9aHVBO0EhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8icF9Ac3hAIyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9MKjRKMixBIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiME8iM2w/bEBBISM3JCIwWUNWTiI9cDwhIzc3JCQiL0wqNEoyLEEjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTyIzbD9sQEEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYzAzOygpUkEjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaiQqWyI+YERBISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMwMzsoKVJBIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGokKlsiPmBEQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkeWg1cSd5QSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqZXFrPFRIQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkeWg1cSd5QSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqZXFrPFRIQSEjNyQiMFlDVk4iPXA8ISM3NyQkIi8sVmdvdUpBISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwOz1YaCJITEEhIzckIjBZQ1ZOIj1wPCEjNzckJCIvLFZnb3VKQSEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDs9WGgiSExBISM3JCIwWUNWTiI9cDwhIzc3JCQiME9VLXJFY0IjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVUlWWXJyQiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT1UtckVjQiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBVSVZZcnJCIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBqYStjMSZSQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHBVVEpeNUMjISM3JCIwWUNWTiI9cDwhIzc3JCQiMGphK2MxJlJBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcFVUSl41QyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKm8nKTRrUVZBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlwmUjtKXEMjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCpvJyk0a1FWQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCZcJlI7SlxDIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA7eidmaUVaQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEFuUCw2KVtBISM3JCIwWUNWTiI9cDwhIzc3JCQiMDt6J2ZpRVpBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQW5QLDYpW0EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVSJcNGg5XkEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBbek4nM3BfQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVIlw0aDleQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFt6TiczcF9BISM3JCIwWUNWTiI9cDwhIzc3JCQiMHAuJGZmLWJBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdiJSODJkY0EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcC4kZmYtYkEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB2IlI4MmRjQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmZjY0ZSEqZUEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsL0tjXS9FIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmZjY0ZSEqZUEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsL0tjXS9FIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBBRyplY3lpQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEc7SVRJVkUjISM3JCIwWUNWTiI9cDwhIzc3JCQiMEFHKmVjeWlBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRztJVElWRSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwW1MoM2JtbUEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBhR0dFNSNvQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBbUygzYm1tQSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGFHR0U1I29BISM3JCIwWUNWTiI9cDwhIzc3JCQiMHZfJmVgYXFBISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIjNrNyw0c0EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdl8mZWBhcUEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiM2s3LDRzQSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsbCQzX1V1QSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDNgQycqcGZGIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsbCQzX1V1QSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDNgQycqcGZGIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBHeCJlXUl5QSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME1sQSIpXCl6QSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBHeCJlXUl5QSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME1sQSIpXCl6QSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBiKil6IVw9I0cjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaHg/bUhQRyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYiopeiFcPSNHIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGh4P21IUEcjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCI9IXl2a2dHIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCgpKik9XjR3RyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIj0heXZrZ0cjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKCkqKT1eNHdHIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAzOXdnVyoqRyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA5LTxPKlsiSCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMzl3Z1cqKkcjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOS08TypbIkgjISM3JCIwWUNWTiI9cDwhIzc3JCQiME1FdVhDUUgjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvV142I3BgSCMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwTUV1WENRSCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9XXjYjcGBIIyEjNiQiMFlDVk4iPXA8ISM3NyQkIjBoUXNJL3hIIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG5FODFcIypIIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBoUXNJL3hIIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG5FODFcIypIIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoMzBkVGUsQiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCQqUTYiKkdKSSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKDMwZFRlLEIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkKlE2IipHSkkjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDlqbytrYUkjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvNyY0dzNxSSMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwOWpvK2thSSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi83JjR3M3FJIyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9hbmNRTTRCISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwWWoyaCkpM0ojISM3JCIwWUNWTiI9cDwhIzc3JCQiL2FuY1FNNEIhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZajJoKSkzSiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbihbMVBBOEIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB0djBZb1pKIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBuKFsxUEE4QiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHR2MFlvWkojISM3JCIwWUNWTiI9cDwhIzc3JCQiMCQqKkhjTjU8QiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCp6UTUkWyc9QiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKipIY041PEIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqelE1JFsnPUIhIzckIjBZQ1ZOIj1wPCEjNzckJCIvQTYxTSk0SyMhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBFKy07R0RLIyEjNyQiMFlDVk4iPXA8ISM3NyQkIi9BNjFNKTRLIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMEUrLTtHREsjISM3JCIwWUNWTiI9cDwhIzc3JCQiMFlDZkRqW0sjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYDcrLDNrSyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWUNmRGpbSyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBgNyssM2tLIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB0T2Q1VihHQiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHpDKWZ5R0lCISM3JCIwWUNWTiI9cDwhIzc3JCQiMHRPZDVWKEdCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwekMpZnlHSUIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKipbYiZIaUtCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMVAnNHg7TUIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKipbYiZIaUtCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMVAnNHg7TUIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwRWhgIUddT0IhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBLXCVmdi9RQiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFaGAhR11PQiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEtcJWZ2L1FCISM3JCIwWUNWTiI9cDwhIzc3JCQiMGB0XmwjUVNCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZmgjNHUjPk0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMGB0XmwjUVNCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZmgjNHUjPk0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMHomKVxdaVVNIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCZRMmZzIWVNIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6JilcXWlVTSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAmUTJmcyFlTSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMSl6YUI5W0IhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA3JykpM3JvXEIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMSl6YUI5W0IhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA3JykpM3JvXEIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSzVZP0E/TiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBRKXBlcGNgQiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLNVk/QT9OIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFEpcGVwY2BCISM3JCIwWUNWTiI9cDwhIzc3JCQiMGZBVzAtZk4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbDUmM29XZEIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZkFXMC1mTiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBsNSYzb1dkQiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmW0IvPnlmQiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJIS2VtS2hCISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZbQi8+eWZCISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIkhLZW1LaEIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwN1pTdmhPTyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA9TiIzbD9sQiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA3WlN2aE9PIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD1OIjNsP2xCISM3JCIwWUNWTiI9cDwhIzc3JCQiMFFmUWdUdk8jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwV1p6TiczcEIhIzckIjBZQ1ZOIj1wPCEjNzckJCIwUWZRZ1R2TyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBXWnpOJzNwQiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBsck9YQDlQIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHJmeD9tSFAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMGxyT1hAOVAjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcmZ4P21IUCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIlJbLjhJdkIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApPmRkZyVvUCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIlJbLjhJdkIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApPmRkZyVvUCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwPSdIYDY9ekIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDJVEyZnMhUSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwPSdIYDY9ekIhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDJVEyZnMhUSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVzNKK2hJUSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBeJz5kZGclUSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVzNKK2hJUSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBeJz5kZGclUSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcj9IJjMlcFEjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweDNxZyZbKVEjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHI/SCYzJXBRIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHgzcWcmWylRIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjApSHQtMiMzUiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAvQG9YbEJSIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjApSHQtMiMzUiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAvQG9YbEJSIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBDWERiK1pSIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL0xqMWBDJ1IjISM2JCIwWUNWTiI9cDwhIzc3JCQiMENYRGIrWlIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvTGoxYEMnUiMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwXmRCUyFlKVIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZFhrOkQsUyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwXmRCUyFlKVIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZFhrOkQsUyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIweHBARGdDUyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkeUQxXSsvQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB4cEBEZ0NTIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCR5RDFdKy9DISM3JCIwWUNWTiI9cDwhIzc3JCQiMC8jKT41U2pTIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLywyY1speVMjISM2JCIwWUNWTiI9cDwhIzc3JCQiMC8jKT41U2pTIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLywyY1speVMjISM2JCIwWUNWTiI9cDwhIzc3JCQiL1Z6Xio+LVQjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTyMpZXFrPFQjISM3JCIwWUNWTiI9cDwhIzc3JCQiL1Z6Xio+LVQjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTyMpZXFrPFQjISM3JCIwWUNWTiI9cDwhIzc3JCQiMGQxOyEpKjQ5QyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGolcGJYazpDISM3JCIwWUNWTiI9cDwhIzc3JCQiMGQxOyEpKjQ5QyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGolcGJYazpDISM3JCIwWUNWTiI9cDwhIzc3JCQiMCQpPTlsenpUIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpvXTBXXz5DISM3JCIwWUNWTiI9cDwhIzc3JCQiMCQpPTlsenpUIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpvXTBXXz5DISM3JCIwWUNWTiI9cDwhIzc3JCQiLzZCLCZmPVUjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwOz5gRC9NVSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvNkIsJmY9VSMhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjA7PmBEL01VIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBPVjVOUmRVIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFZKXjUlR0ZDISM3JCIwWUNWTiI9cDwhIzc3JCQiME9WNU5SZFUjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVkpeNSVHRkMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwamIzPz4nSEMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBwVlwmUjtKQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBqYjM/PidIQyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHBWXCZSO0pDISM3JCIwWUNWTiI9cDwhIzc3JCQiMCp5bV0hKlxMQyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdmdi9RL05DISM3JCIwWUNWTiI9cDwhIzc3JCQiMCp5bV0hKlxMQyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdmdi9RL05DISM3JCIwWUNWTiI9cDwhIzc3JCQiMDshWysqeXRWIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEFvWGxCKlFDISM3JCIwWUNWTiI9cDwhIzc3JCQiMDshWysqeXRWIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEFvWGxCKlFDISM3JCIwWUNWTiI9cDwhIzc3JCQiMFYjSF0oZTdXIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFwhUS9OIUdXIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBWI0hdKGU3VyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBcIVEvTiFHVyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcC8sZ1FeVyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB2Iz5hTG9ZQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBwLyxnUV5XIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHYjPmFMb1lDISM3JCIwWUNWTiI9cDwhIzc3JCQiMCdwIipcJT0hXEMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAtMFM/ajBYIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAncCIqXCU9IVxDISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwLTBTP2owWCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQUgoKkgpKkdYIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEc8UTBWV1gjISM3JCIwWUNWTiI9cDwhIzc3JCQiMEFIKCpIKSpHWCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBHPFEwVldYIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBcVCZcInluWCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiSE8hSEtlQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBcVCZcInluWCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiSE8hSEtlQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2YCQqKnpsZ0MhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiPVdgRj9pQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2YCQqKnpsZ0MhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiPVdgRj9pQyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAtbSJceWBrQyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDNhS2cjM21DISM3JCIwWUNWTiI9cDwhIzc3JCQiMC1tIlx5YGtDISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwM2FLZyMzbUMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwR3kqKXA8JW9DISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTW1JWGkqcEMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwR3kqKXA8JW9DISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTW1JWGkqcEMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYiF6W3ZIc0MhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBoeUdJVVFaIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBiIXpbdkhzQyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGh5R0lVUVojISM3JCIwWUNWTiI9cDwhIzc3JCQiMCJHZylSeGhaIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCgzcF9Ac3hDISM3JCIwWUNWTiI9cDwhIzc3JCQiMCJHZylSeGhaIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCgzcF9Ac3hDISM3JCIwWUNWTiI9cDwhIzc3JCQiMDM6JVtzMCFbIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDkuRCstO1sjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDM6JVtzMCFbIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDkuRCstO1sjISM3JCIwWUNWTiI9cDwhIzc3JCQiME1GIyk0UFJbIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFQ6QiY9WyZbIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBNRiMpNFBSWyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBUOkImPVsmWyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwaFIhW3AieVsjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbkZAcWgkKlsjISM3JCIwWUNWTiI9cDwhIzc3JCQiMGhSIVtwInlbIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG5GQHFoJCpbIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjApPSZ5eidwIlwjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJSpSPmJUS1wjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCk9Jnl6J3AiXCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlKlI+YlRLXCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOWt3a3diXCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9Bdiw5NyhcIyEjNiQiMFlDVk4iPXA8ISM3NyQkIjA5a3drd2JcIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL0F2LDk3KFwjISM2JCIwWUNWTiI9cDwhIzc3JCQiMFR3dVxjJSpcIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFprOkQsNV0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMFR3dVxjJSpcIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFprOkQsNV0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMG4pR1pqTC5EISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdHc4NSIpW10jISM3JCIwWUNWTiI9cDwhIzc3JCQiMG4pR1pqTC5EISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdHc4NSIpW10jISM3JCIwWUNWTiI9cDwhIzc3JCQiMCU0NSg+O3NdIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLio9XjR3M0QhIzUkIjBZQ1ZOIj1wPCEjNzckJCIwJTQ1KD47c10jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIuKj1eNHczRCEjNSQiMFlDVk4iPXA8ISM3NyQkIi9LInAvJzQ2RCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMEUsNSEzazdEISM3JCIwWUNWTiI9cDwhIzc3JCQiL0sicC8nNDZEISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwRSw1ITNrN0QhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWkRuKmUoXF4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYDgzbD9sXiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWkRuKmUoXF4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYDgzbD9sXiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdFBsdWIpPUQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB6RDFdKy9fIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB0UGx1Yik9RCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHpEMV0rL18jISM3JCIwWUNWTiI9cDwhIzc3JCQiLU4nZk5GXyMhIiokIjBZQ1ZOIj1wPCEjNzckNyQkIjAxUS9OIUdDRCEjNyQiMFlDVk4iPXA8ISM3NyQkIi1OJ2ZORl8jISIqJCIwWUNWTiI9cDwhIzc3JDckJCIwMVEvTiFHQ0QhIzckIjBZQ1ZOIj1wPCEjNzckJCIwRWloVzptXyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBLXS0/ZyJHRCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFaWhXOm1fIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEtdLT9nIkdEISM3JCIwWUNWTiI9cDwhIzc3JCQiMGB1ZkgmXElEISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZmkrMFM/YCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYHVmSCZcSUQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBmaSswUz9gIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6J3lYXlBNRCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdbKCkqKik+ZmAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHoneVheUE1EISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJ1soKSoqKT5mYCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMSpmJipcRFFEISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNyhvXCgqelJEISM3JCIwWUNWTiI9cDwhIzc3JCQiMDEqZiYqXERRRCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDcob1woKnpSRCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBMNmElWzhVRCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFIqXCpmek9hIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBMNmElWzhVRCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFIqXCpmek9hIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBmQl9wOWdhIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGw2JFwlZnZhIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBmQl9wOWdhIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGw2JFwlZnZhIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnZS5YWCopXEQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjUjcqSFI5YiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJ2UuWFgqKVxEISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwI1I3KkhSOWIjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDdbW1J1UGIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPU8qWyI+YGIjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDdbW1J1UGIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPU8qWyI+YGIjISM3JCIwWUNWTiI9cDwhIzc3JCQiMFJnWUNhd2IjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWFsoKSoqKT5mRCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBSZ1lDYXdiIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFhbKCkqKik+ZkQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbHNXNE06YyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjByZyZbKXlJYyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbHNXNE06YyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjByZyZbKXlJYyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwI1xHV1JUbEQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApSFApcGVwYyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwI1xHV1JUbEQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApSFApcGVwYyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwPSg0JXokSHBEISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQyY9WyZRM2QjISM3JCIwWUNWTiI9cDwhIzc3JCQiMD0oNCV6JEhwRCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEMmPVsmUTNkIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBYNFJrdEpkIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF4oKnpSPVpkIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBYNFJrdEpkIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF4oKnpSPVpkIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjByQFBcYHFkIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHg0eUMpZnlEISM3JCIwWUNWTiI9cDwhIzc3JCQiMHJAUFxgcWQjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweDR5QylmeUQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKVJgVkwkNGUjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwL0F3NHlDZSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKVJgVkwkNGUjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwL0F3NHlDZSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQ1lMPjhbZSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9WVlp6TidlIyEjNiQiMFlDVk4iPXA8ISM3NyQkIjBDWUw+OFtlIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL1ZWWnpOJ2UjISM2JCIwWUNWTiI9cDwhIzc3JCQiMF5lSi8kcCllIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGRZc3pQLWYjISM3JCIwWUNWTiI9cDwhIzc3JCQiMF5lSi8kcCllIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGRZc3pQLWYjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHhxSCpHZCNmIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCQpZXFrPFRmIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB4cUgqR2QjZiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkKWVxazxUZiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwLyR5VUZYJ2YjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvNihvXCgqemYjISM2JCIwWUNWTiI9cDwhIzc3JCQiMC8keVVGWCdmIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLzYob1woKnpmIyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9gZiNmSy5nIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiME8kb1l0KD1nIyEjNyQiMFlDVk4iPXA8ISM3NyQkIi9gZiNmSy5nIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiME8kb1l0KD1nIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBkMkNXN1VnIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGomXCc+ZGRnIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBkMkNXN1VnIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGomXCc+ZGRnIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKT5BSCM0M0UhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqeUlZcWo0RSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKT5BSCM0M0UhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqeUlZcWo0RSEjNyQiMFlDVk4iPXA8ISM3NyQkIi9ALlVAKD5oIyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDs/aCpvXjhFISM3JCIwWUNWTiI9cDwhIzc3JCQiL0AuVUAoPmgjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwOz9oKm9eOEUhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT1c9Kj4mZWgjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVUtmdSdSPEUhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT1c9Kj4mZWgjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVUtmdSdSPEUhIzckIjBZQ1ZOIj1wPCEjNzckJCIwamM7JT10PkUhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBwV2RmdzdpIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBqYzslPXQ+RSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHBXZGZ3N2kjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCopbzlwNk9pIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCZwYlhrOkRFISM3JCIwWUNWTiI9cDwhIzc3JCQiMCopbzlwNk9pIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCZwYlhrOkRFISM3JCIwWUNWTiI9cDwhIzc3JCQiMDsiR1Q6XEZFISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQXBgSE8hSEUhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOyJHVDpcRkUhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBBcGBITyFIRSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVJDQiUnI4aiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBbIj1YaCJIaiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVSQ0IlJyOGojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWyI9WGgiSGojISM3JCIwWUNWTiI9cDwhIzc3JCQiMHAwNENeX2ojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdiQqXCpmek9FISM3JCIwWUNWTiI9cDwhIzc3JCQiMHAwNENeX2ojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdiQqXCpmek9FISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZ6ciE0SiJSRSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC0xWyVlblNFISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZ6ciE0SiJSRSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC0xWyVlblNFISM3JCIwWUNWTiI9cDwhIzc3JCQiMEFJMCU0LFZFISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRz1ZcGJYayMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQUkwJTQsVkUhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBHPVlwYlhrIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBbVS56ISpvayMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiSVdhTiVbRSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBbVS56ISpvayMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiSVdhTiVbRSEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2YSxrcTJsIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJHQyVSOkJsIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB2YSxrcTJsIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJHQyVSOkJsIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsbioqW11ZbCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzYlNDJj5jRSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAsbioqW11ZbCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzYlNDJj5jRSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBHeihSLmBlRSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME1uUTR2K20jISM3JCIwWUNWTiI9cDwhIzc3JCQiMEd6KFIuYGVFISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTW5RNHYrbSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYSJmKj01Q20jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaHpPJVwmUm0jISM3JCIwWUNWTiI9cDwhIzc3JCQiMGEiZio9NUNtIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGh6TyVcJlJtIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiUVNSK0htRSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCg9XCR6TXltIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiUVNSK0htRSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCg9XCR6TXltIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAyOyMqKSlwLG4jISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOS9Mazk8biMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMjsjKikpcCxuIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDkvTGs5PG4jISM3JCIwWUNWTiI9cDwhIzc3JCQiME1HIVIoXFNuIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2s2JFwlZnZFISM2JCIwWUNWTiI9cDwhIzc3JCQiME1HIVIoXFNuIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2s2JFwlZnZFISM2JCIwWUNWTiI9cDwhIzc3JCQiMGhTKSllSHpuIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG5HSE11JXpFISM3JCIwWUNWTiI9cDwhIzc3JCQiMGhTKSllSHpuIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG5HSE11JXpFISM3JCIwWUNWTiI9cDwhIzc3JCQiMChHbFElND1vIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCQ0dSM+YUxvIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoR2xRJTQ9byMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkNHUjPmFMbyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOWwlKUcqbyZvIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL0tiVVNCKG8jISM2JCIwWUNWTiI9cDwhIzc3JCQiMDlsJSlHKm8mbyMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9LYlVTQihvIyEjNiQiMFlDVk4iPXA8ISM3NyQkIi91RlEicCYqbyMhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZbEIqUTYicCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvdUZRInAmKm8jISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwWWxCKlE2InAjISM3JCIwWUNWTiI9cDwhIzc3JCQiMG4qMykpKltNcCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB0eEB1JCpccCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbiozKSkqW01wIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHR4QHUkKlxwIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkPiF6JClHdHAjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKioqKT5mdCkpcCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJD4heiQpR3RwIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCoqKik+ZnQpKXAjISM3JCIwWUNWTiI9cDwhIzc3JCQiL1VyKG8zN3EjISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwRS09V2BGcSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvVXIobzM3cSMhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBFLT1XYEZxIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBZRXZgKTMwRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF85O0hMbXEjISM3JCIwWUNWTiI9cDwhIzc3JCQiMFlFdmApMzBGISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXzk7SExtcSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdFF0UW8qM0YhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB6RTk5ODByIyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB0UXRRbyozRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHpFOTk4MHIjISM3JCIwWUNWTiI9cDwhIzc3JCQiMCo0OlAjW0dyIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDBSNypIUjlGISM3JCIwWUNWTiI9cDwhIzc3JCQiMCo0OlAjW0dyIyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDBSNypIUjlGISM3JCIwWUNWTiI9cDwhIzc3JCQiMEVqcDNHbnIjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwS141JUdGPUYhIzckIjBZQ1ZOIj1wPCEjNzckJCIwRWpwM0duciMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBLXjUlR0Y9RiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBfdm4kemc/RiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGVqM3BfQHMjISM3JCIwWUNWTiI9cDwhIzc3JCQiMF92biR6Zz9GISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZWozcF9AcyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIweihlJ3koW0NGISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJmVuU0QuRUYhIzckIjBZQ1ZOIj1wPCEjNzckJCIweihlJ3koW0NGISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJmVuU0QuRUYhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMCtram4kR0YhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2KVshUjcqSEYhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMCtram4kR0YhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2KVshUjcqSEYhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSzdpW1pBdCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBRKy5DI3pMRiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLN2lbWkF0IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFErLkMjekxGISM3JCIwWUNWTiI9cDwhIzc3JCQiMGVDZ0xGaHQjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwazcsNHN3dCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZUNnTEZodCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBrNyw0c3d0IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmbyRlPTIrdSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiXCMqUj5iVEYhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJm8kZT0yK3UjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIlwjKlI+YlRGISM3JCIwWUNWTiI9cDwhIzc3JCQiMDZcYy4oKVF1IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDxQKCp5SmF1IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2XGMuKClRdSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA8UCgqeUphdSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwUWhhKW93WkYhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBXXCZSO0pcRiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBRaGEpb3daRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFdcJlI7SlxGISM3JCIwWUNWTiI9cDwhIzc3JCQiMGt0X3RZO3YjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvPE8qWyI+YEYhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwa3RfdFk7diMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi88TypbIj5gRiEjNiQiMFlDVk4iPXA8ISM3NyQkIjAiZjMmZUVidiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoUjxSODJkRiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiZjMmZUVidiMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoUjxSODJkRiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA8KSpbVjElZkYhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBCJykqKT1eNHcjISM3JCIwWUNWTiI9cDwhIzc3JCQiMDwpKltWMSVmRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEInKSopPV40dyMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwVzVaRydHakYhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8mKXpRNSRbdyMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwVzVaRydHakYhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8mKXpRNSRbdyMhIzYkIjBZQ1ZOIj1wPCEjNzckJCIvRl9NaDtuRiEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMHc1JykpM3JvRiEjNyQiMFlDVk4iPXA8ISM3NyQkIi9GX01oO25GISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwdzUnKSkzcm9GISM3JCIwWUNWTiI9cDwhIzc3JCQiMChcTCUpZi9yRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC5CJVEyZnNGISM3JCIwWUNWTiI9cDwhIzc3JCQiMChcTCUpZi9yRiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC5CJVEyZnNGISM3JCIwWUNWTiI9cDwhIzc3JCQiMEJaVCRlI1x4IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEhOIyllcWt4IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBCWlQkZSNceCMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBITiMpZXFreCMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvJmZSbzApeUYhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBjWiFRL04heSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIvJmZSbzApeUYhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBjWiFRL04heSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwd3JQYCZvI3kjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIylmeUdJVXkjISM3JCIwWUNWTiI9cDwhIzc3JCQiMHdyUGAmbyN5IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCMpZnlHSVV5IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAuJWUkUWxseSMhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA0c3c4NSIpeSMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwLiVlJFFsbHkjISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNHN3ODUiKXkjISM3JCIwWUNWTiI9cDwhIzc3JCQiMEgnUkxfVyF6IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME4lWygpKiopPnojISM3JCIwWUNWTiI9cDwhIzc3JCQiMEgnUkxfVyF6IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiME4lWygpKiopPnojISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMzSzNEVnojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaSdIUClwZXojISM3JCIwWUNWTiI9cDwhIzc3JCQiMGMzSzNEVnojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaSdIUClwZXojISM3JCIwWUNWTiI9cDwhIzc3JCQiMCMzLUxcPyl6IyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCkpM3JvXCgqeiMhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIzMtTFw/KXojISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKSkzcm9cKCp6IyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA0TEd5JTMtRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDpAcGBITyFHISM3JCIwWUNWTiI9cDwhIzc3JCQiMDRMR3klMy1HISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOkBwYEhPIUchIzckIjBZQ1ZOIj1wPCEjNzckJCIwTlhFamtmIUchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBUTG5RNHYhRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBOWEVqa2YhRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFRMblE0diFHISM3JCIwWUNWTiI9cDwhIzc3JCQiMGlkQ1tXKTRHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwb1hsQipRNkchIzckIjBZQ1ZOIj1wPCEjNzckJCIwaWRDW1cpNEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBvWGxCKlE2RyEjNyQiMFlDVk4iPXA8ISM3NyQkIjApKXBBTENQIkchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlek4nM3BfIkchIzckIjBZQ1ZOIj1wPCEjNzckJCIwKSlwQUxDUCJHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJXpOJzNwXyJHISM3JCIwWUNWTiI9cDwhIzc3JCQiMDojMyM9L3ciRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEBxaCQqWyI+RyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA6IzMjPS93IkchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBAcWgkKlsiPkchIzckIjBZQ1ZOIj1wPCEjNzckJCIwVCUqPS4lW0BHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWiMpZnlHSSNHISM3JCIwWUNWTiI9cDwhIzc3JCQiMFQlKj0uJVtARyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFojKWZ5R0kjRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBvMTwpUU9ERyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHUlek4nM3AjRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBvMTwpUU9ERyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHUlek4nM3AjRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAlKj06dFYjSEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi4yY1speUlHISM1JCIwWUNWTiI9cDwhIzc3JCQiMCUqPTp0ViNIRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLjJjWyl5SUchIzUkIjBZQ1ZOIj1wPCEjNzckJCIwQEo4ZUJKJEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBGPmFMb1kkRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBASjhlQkokRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEY+YUxvWSRHISM3JCIwWUNWTiI9cDwhIzc3JCQiMFpWNlYucSRHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYEpfPVsmUUchIzckIjBZQ1ZOIj1wPCEjNzckJCIwWlY2Vi5xJEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBgSl89WyZRRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB1YjRHJCkzJUchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9RL04hR0MlRyEjNiQiMFlDVk4iPXA8ISM3NyQkIjB1YjRHJCkzJUchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9RL04hR0MlRyEjNiQiMFlDVk4iPXA8ISM3NyQkIi5vMjhqWiVHISM1JCIwWUNWTiI9cDwhIzc3JDckJCIwMmNbKXlJWUchIzckIjBZQ1ZOIj1wPCEjNzckJCIubzI4alolRyEjNSQiMFlDVk4iPXA8ISM3NyQ3JCQiMDJjWyl5SVlHISM3JCIwWUNWTiI9cDwhIzc3JCQiMEYhZSEpSGtbRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMExvWXQoPV1HISM3JCIwWUNWTiI9cDwhIzc3JCQiMEYhZSEpSGtbRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMExvWXQoPV1HISM3JCIwWUNWTiI9cDwhIzc3JCQiMGAjUklHX19HISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvMVslZW5TJkchIzYkIjBZQ1ZOIj1wPCEjNzckJCIwYCNSSUdfX0chIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8xWyVlblMmRyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9bPyFvLWsmRyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdHSE11JXomRyEjNyQiMFlDVk4iPXA8ISM3NyQkIi9bPyFvLWsmRyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdHSE11JXomRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAxPCtgI0dnRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDgwVEdGPSdHISM3JCIwWUNWTiI9cDwhIzc3JCQiMDE8K2AjR2dHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwODBUR0Y9J0chIzckIjBZQ1ZOIj1wPCEjNzckJCIwTEgpekI7a0chIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBSPFI4MmQnRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBMSCl6QjtrRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFI8UjgyZCdHISM3JCIwWUNWTiI9cDwhIzc3JCQiMGZUJ0hBL29HISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbUhQKXBlcEchIzckIjBZQ1ZOIj1wPCEjNzckJCIwZlQnSEEvb0chIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBtSFApcGVwRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnUVh6PyM+KEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjPmFMb1l0RyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnUVh6PyM+KEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjPmFMb1l0RyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA3bSNIPiFlKEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+YUxvWXQoRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjA3bSNIPiFlKEchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+YUxvWXQoRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBSeSF6PG96RyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFhtSmBFNylHISM3JCIwWUNWTiI9cDwhIzc3JCQiMFJ5IXo8b3pHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWG1KYEU3KUchIzckIjBZQ1ZOIj1wPCEjNzckJCIwbSEqKUc7YyQpRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHN5SFExXilHISM3JCIwWUNWTiI9cDwhIzc3JCQiMG0hKilHO2MkKUchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBzeUhRMV4pRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAjSHF5OVcoKUchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApNHpLaSkqKSlHISM3JCIwWUNWTiI9cDwhIzc3JCQiMCNIcXk5VygpRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCk0ektpKSopKUchIzckIjBZQ1ZOIj1wPCEjNzckJCIwPjomRzhLIipHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRC5FM21HKkchIzckIjBZQ1ZOIj1wPCEjNzckJCIwPjomRzhLIipHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRC5FM21HKkchIzckIjBZQ1ZOIj1wPCEjNzckJCIwWEYkeTY/JipHISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXjpDJGZ1JypHISM3JCIwWUNWTiI9cDwhIzc3JCQiMFhGJHk2PyYqRyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF46QyRmdScqRyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBzUiJHNTMqKkchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5RkF5RDEhSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBzUiJHNTMqKkchIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5RkF5RDEhSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjApPiZ6KDMnSCFIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwL1M/ajBYIUghIzckIjBZQ1ZOIj1wPCEjNzckJCIwKT4meigzJ0ghSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC9TP2owWCFIISM3JCIwWUNWTiI9cDwhIzc3JCQiMERreHNTbyFIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwSl89WyZRM0ghIzckIjBZQ1ZOIj1wPCEjNzckJCIwRGt4c1NvIUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBKXz1bJlEzSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBed3ZkPzIiSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGRrO0xsQSJIISM3JCIwWUNWTiI9cDwhIzc3JCQiMF53dmQ/MiJIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZGs7TGxBIkghIzckIjBZQ1ZOIj1wPCEjNzckJCIweSlRRi9nOUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlb1oiPVhoIkghIzckIjBZQ1ZOIj1wPCEjNzckJCIweSlRRi9nOUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlb1oiPVhoIkghIzckIjBZQ1ZOIj1wPCEjNzckJCIwLyxzRiFbPUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8iKkdKXS0/SCEjNiQiMFlDVk4iPXA8ISM3NyQkIjAvLHNGIVs9SCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLyIqR0pdLT9IISM2JCIwWUNWTiI9cDwhIzc3JCQiMEo4cTdnQiNIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUCw2KVshUiNIISM3JCIwWUNWTiI9cDwhIzc3JCQiMEo4cTdnQiNIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUCw2KVshUiNIISM3JCIwWUNWTiI9cDwhIzc3JCQiMGREbygqUmkjSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGo4NHQleUZIISM3JCIwWUNWTiI9cDwhIzc3JCQiMGREbygqUmkjSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGo4NHQleUZIISM3JCIwWUNWTiI9cDwhIzc3JCQiMCV5akUpPiwkSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2ZzIWVrOyRIISM2JCIwWUNWTiI9cDwhIzc3JCQiMCV5akUpPiwkSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2ZzIWVrOyRIISM2JCIwWUNWTiI9cDwhIzc3JCQiLyxYdycqKlIkSCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDtRMFZXYiRIISM3JCIwWUNWTiI9cDwhIzc3JCQiLyxYdycqKlIkSCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDtRMFZXYiRIISM3JCIwWUNWTiI9cDwhIzc3JCQiMFBpaV96eSRIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVl0uR0MlUkghIzckIjBZQ1ZOIj1wPCEjNzckJCIwUGlpX3p5JEghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBWXS5HQyVSSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBqdWdQZjwlSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHBpLDgvTCVIISM3JCIwWUNWTiI9cDwhIzc3JCQiMGp1Z1BmPCVIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcGksOC9MJUghIzckIjBZQ1ZOIj1wPCEjNzckJCIvcCllQVJjJUghIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjAnXCgqelI9WkghIzckIjBZQ1ZOIj1wPCEjNzckJCIvcCllQVJjJUghIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjAnXCgqelI9WkghIzckIjBZQ1ZOIj1wPCEjNzckJCIwOypwdiE+JlxIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQSh5SFExXkghIzckIjBZQ1ZOIj1wPCEjNzckJCIwOypwdiE+JlxIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQSh5SFExXkghIzckIjBZQ1ZOIj1wPCEjNzckJCIwVjZiIyopUmBIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXCpmek8lXCZIISM3JCIwWUNWTiI9cDwhIzc3JCQiMFY2YiMqKVJgSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFwqZnpPJVwmSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBwQmB4eXMmSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHY2JUhOIyllSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBwQmB4eXMmSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHY2JUhOIyllSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnZjhEJ2U2J0ghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAtQyN6THFpSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnZjhEJ2U2J0ghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAtQyN6THFpSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBBW1xaUV0nSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEdPIUhLZW1IISM3JCIwWUNWTiI9cDwhIzc3JCQiMEFbXFpRXSdIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwR08hSEtlbUghIzckIjBZQ1ZOIj1wPCEjNzckJCIwXGdaSz0qb0ghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiWyl5SVlxSCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBcZ1pLPSpvSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGJbKXlJWXFIISM3JCIwWUNWTiI9cDwhIzc3JCQiMHZzWDwpenNIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIjNtR0hNdUghIzckIjBZQ1ZOIj1wPCEjNzckJCIwdnNYPCl6c0ghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiM21HSE11SCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAtJlFDIXltKEghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzdCV5RkF5SCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAtJlFDIXltKEghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzdCV5RkF5SCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBHKD51eWIhKUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBNJkdHRTUjKUghIzckIjBZQ1ZOIj1wPCEjNzckJCIwRyg+dXliISlIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTSZHR0U1IylIISM3JCIwWUNWTiI9cDwhIzc3JCQiMGI0U3NQVylIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaCg0eUMpZilIISM3JCIwWUNWTiI9cDwhIzc3JCQiMGI0U3NQVylIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaCg0eUMpZilIISM3JCIwWUNWTiI9cDwhIzc3JCQiMCI9I1FkPCQpKUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKTR6S2kpKilIISM3JCIwWUNWTiI9cDwhIzc3JCQiMCI9I1FkPCQpKUghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKTR6S2kpKilIISM3JCIwWUNWTiI9cDwhIzc3JCQiMDNNT1UoPiMqSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDlBeDxVUCpIISM3JCIwWUNWTiI9cDwhIzc3JCQiMDNNT1UoPiMqSCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDlBeDxVUCpIISM3JCIwWUNWTiI9cDwhIzc3JCQiME1ZTUZ4ZypIISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvV2BGP2koKkghIzYkIjBZQ1ZOIj1wPCEjNzckJCIwTVlNRnhnKkghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9XYEY/aSgqSCEjNiQiMFlDVk4iPXA8ISM3NyQkIjBoZUs3ZCoqKkghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBuWXQoPV0sSSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBoZUs3ZCoqKkghIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBuWXQoPV0sSSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoMzJ0cCRRKyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkKmVycyJRMEkhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKDMydHAkUSskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJCplcnMiUTBJISM3JCIwWUNWTiI9cDwhIzc3JCQiMDkkKUcjb3IySSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLzcocGRoIzRJISM2JCIwWUNWTiI9cDwhIzc3JCQiMDkkKUcjb3IySSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLzcocGRoIzRJISM2JCIwWUNWTiI9cDwhIzc3JCQiL2Fwc21mNkkhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZJHlFOTk4SSEjNyQiMFlDVk4iPXA8ISM3NyQkIi9hcHNtZjZJISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwWSR5RTk5OEkhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbjJEX3dhLCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB0JmZ3Ny08SSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBuMkRfd2EsJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHQmZnc3LTxJISM3JCIwWUNWTiI9cDwhIzc3JCQiMCQqPkJQYyQ+SSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCp6U0U2ITQtJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKj5CUGMkPkkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqelNFNiE0LSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvQThBaUJCSSEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMEU/aSg0eUNJISM3JCIwWUNWTiI9cDwhIzc3JCQiL0E4QWlCQkkhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBFP2koNHlDSSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBZVz4yO3ItJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF9LZyMzbUdJISM3JCIwWUNWTiI9cDwhIzc3JCQiMFlXPjI7ci0kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwX0tnIzNtR0khIzckIjBZQ1ZOIj1wPCEjNzckJCIwdGM8I2YqNC4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweldlblNELiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdGM8I2YqNC4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweldlblNELiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKipvOnh2Wy4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMGRjXz9rLiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKipvOnh2Wy4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMGRjXz9rLiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwRSJRQGN2UUkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBLcGFQKy4vJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFIlFAY3ZRSSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEtwYVArLi8kISM3JCIwWUNWTiI9cDwhIzc3JCQiMF8kPnJhalVJISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZSJHRC09V0khIzckIjBZQ1ZOIj1wPCEjNzckJCIwXyQ+cmFqVUkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBlIkdELT1XSSEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6MDVLOmwvJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCZRNHYrMVtJISM3JCIwWUNWTiI9cDwhIzc3JCQiMHowNUs6bC8kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlE0disxW0khIzckIjBZQ1ZOIj1wPCEjNzckJCIwMD0zPCZSXUkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2MVwjKlI+MCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMD0zPCZSXUkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA2MVwjKlI+MCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwS0kxLXZVMCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBRPVp4PmUwJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLSTEtdlUwJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFE9Wng+ZTAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMGVVLyhbOmVJISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbElYaSpwZkkhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZVUvKFs6ZUkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBsSVhpKnBmSSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmW0Q/Wi5pSSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJITXUlek4xJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmW0Q/Wi5pSSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJITXUlek4xJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2bitkOWYxJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD1iVEtmdTEkISM3JCIwWUNWTiI9cDwhIzc3JCQiMDZuK2Q5ZjEkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPWJUS2Z1MSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwUXopPld6cEkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBXblI8UjgyJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBReik+V3pwSSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFduUjxSODIkISM3JCIwWUNWTiI9cDwhIzc3JCQiMGsicHBVbnRJISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcnpQLT5fMiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwayJwcFVudEkhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjByelAtPl8yJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiUl0+VGJ4SSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiUl0+VGJ4SSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCg+ZnQpKTR6SSEjNyQiMFlDVk4iPXA8ISM3NyQkIjA8OyRwUlYiMyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDL01zeUgzJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA8OyRwUlYiMyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDL01zeUgzJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBXRyI+UUomMyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9sQHQmZW8zJCEjNiQiMFlDVk4iPXA8ISM3NyQkIjBXRyI+UUomMyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9sQHQmZW8zJCEjNiQiMFlDVk4iPXA8ISM3NyQkIi8yJSpvTz4qMyQhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjB4R0lVUTI0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIi8yJSpvTz4qMyQhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjB4R0lVUTI0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoSHY9TjIkNCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAuVEdGPVk0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoSHY9TjIkNCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAuVEdGPVk0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBDbCZvTCZwNCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9MbEEiKVwpNCQhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwQ2wmb0wmcDQkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvTGxBIilcKTQkISM2JCIwWUNWTiI9cDwhIzc3JCQiL3ZQPUskMzUkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwY2xDKHpQLUohIzckIjBZQ1ZOIj1wPCEjNzckJCIvdlA9SyQzNSQhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBjbEMoelAtSiEjNyQiMFlDVk4iPXA8ISM3NyQkIjB4Kj1vSXIvSiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCR5RkF5RDFKISM3JCIwWUNWTiI9cDwhIzc3JCQiMHgqPW9Jci9KISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJHlGQXlEMUohIzckIjBZQ1ZOIj1wPCEjNzckJCIwLi0hPUhmM0ohIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA0ITRzdzg1SiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAuLSE9SGYzSiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDQhNHN3ODVKISM3JCIwWUNWTiI9cDwhIzc3JCQiL1YieXdzQzYkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwTy0+XzxTNiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvViJ5d3NDNiQhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBPLT5fPFM2JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBjRXdoX2o2JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGk5PFAoKnk2JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBjRXdoX2o2JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGk5PFAoKnk2JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKVF1WUstNyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqb19Ac3hASiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKVF1WUstNyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqb19Ac3hASiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA0XnNKN1Q3JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDpSODJkYzckISM3JCIwWUNWTiI9cDwhIzc3JCQiMDRec0o3VDckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOlI4MmRjNyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwT2pxOyMqejckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVV42I3BgSEohIzckIjBZQ1ZOIj1wPCEjNzckJCIwT2pxOyMqejckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVV42I3BgSEohIzckIjBZQ1ZOIj1wPCEjNzckJCIwaXZvLHM9OCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBvajR4O004JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBpdm8scz04JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMG9qNHg7TTgkISM3JCIwWUNWTiI9cDwhIzc3JCQiMCp5b209dk5KISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJmZ4P21IUEohIzckIjBZQ1ZOIj1wPCEjNzckJCIwKnlvbT12TkohIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAmZng/bUhQSiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA6K2xySidSSiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEApZXFrPFRKISM3JCIwWUNWTiI9cDwhIzc3JCQiMDorbHJKJ1JKISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQCllcWs8VEohIzckIjBZQ1ZOIj1wPCEjNzckJCIwVTdqYzZOOSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBbKy9LY105JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVN2pjNk45JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFsrL0tjXTkkISM3JCIwWUNWTiI9cDwhIzc3JCQiMG9DaFQiUlpKISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdTctPE8qW0ohIzckIjBZQ1ZOIj1wPCEjNzckJCIwb0NoVCJSWkohIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB1Ny08TypbSiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmcCRmRXI3OiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsRCstO0c6JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmcCRmRXI3OiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsRCstO0c6JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBAXGQ2Xl46JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEZQKXBlcGNKISM3JCIwWUNWTiI9cDwhIzc3JCQiMEBcZDZeXjokISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRlApcGVwY0ohIzckIjBZQ1ZOIj1wPCEjNzckJCIwW2hiJzQuZkohIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBhXCc+ZGRnSiEjNyQiMFlDVk4iPXA8ISM3NyQkIjBbaGInNC5mSiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGFcJz5kZGdKISM3JCIwWUNWTiI9cDwhIzc3JCQiMHV0YCIzIkg7JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLz1ZcGJYa0ohIzYkIjBZQ1ZOIj1wPCEjNzckJCIwdXRgIjMiSDskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvPVlwYlhrSiEjNiQiMFlDVk4iPXA8ISM3NyQkIjAsJz1sMXptSiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDJ1Iz5hTG9KISM3JCIwWUNWTiI9cDwhIzc3JCQiMCwnPWwxem1KISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMnUjPmFMb0ohIzckIjBZQ1ZOIj1wPCEjNzckJCIwRikqXF5xMTwkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTCczcF9Ac0ohIzckIjBZQ1ZOIj1wPCEjNzckJCIwRikqXF5xMTwkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTCczcF9Ac0ohIzckIjBZQ1ZOIj1wPCEjNzckJCIwYTVbT11YPCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8nKSopPV40d0ohIzYkIjBZQ1ZOIj1wPCEjNzckJCIwYTVbT11YPCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8nKSopPV40d0ohIzYkIjBZQ1ZOIj1wPCEjNzckJCIvR2k5LVZ5SiEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMCczcm9cKCp6SiEjNyQiMFlDVk4iPXA8ISM3NyQkIi9HaTktVnlKISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwJzNyb1woKnpKISM3JCIwWUNWTiI9cDwhIzc3JCQiMDJOVzE1Qj0kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOEImPVsmUT0kISM3JCIwWUNWTiI9cDwhIzc3JCQiMDJOVzE1Qj0kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOEImPVsmUT0kISM3JCIwWUNWTiI9cDwhIzc3JCQiMExaVSIqKj0nPSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBSTiRvWXQoPSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwTFpVIioqPSc9JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFJOJG9ZdCg9JCEjNyQiMFlDVk4iPXA8ISM3NyQkIi8nZlN3cCs+JCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMG1aIj1YaCI+JCEjNyQiMFlDVk4iPXA8ISM3NyQkIi8nZlN3cCs+JCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMG1aIj1YaCI+JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnPShRaFxSPiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjKmZ6TyVcJj4kISM3JCIwWUNWTiI9cDwhIzc3JCQiMCc9KFFoXFI+JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCMqZnpPJVwmPiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwOCVvaiVIeT4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPnN4QHUkKj4kISM3JCIwWUNWTiI9cDwhIzc3JCQiMDglb2olSHk+JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD5zeEB1JCo+JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBSJ1w4JDQ8PyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBYJWVuU0QuSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBSJ1w4JDQ8PyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBYJWVuU0QuSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBtM0w7KmUwSyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHMnUjxSODJLISM3JCIwWUNWTiI9cDwhIzc3JCQiMG0zTDsqZTBLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcydSPFI4MkshIzckIjBZQ1ZOIj1wPCEjNzckJCIwIzQ3OCFwJTRLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKSozc3c4NUAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMCM0NzghcCU0SyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCkqM3N3ODVAJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA+TEgnKVtMQCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBEQHFoJCpbQCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwPkxIJylbTEAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwREBxaCQqW0AkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFhYRnJHc0AkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXkxvWXQoPUshIzckIjBZQ1ZOIj1wPCEjNzckJCIwWFhGckdzQCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBeTG9ZdCg9SyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBzZERjMzZBJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHlYbUpgRUEkISM3JCIwWUNWTiI9cDwhIzc3JCQiMHNkRGMzNkEkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweVhtSmBFQSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKSpwQlQpKVxBJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC9laztMbEEkISM3JCIwWUNWTiI9cDwhIzc3JCQiMCkqcEJUKSlcQSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAvZWs7TGxBJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBEIz1pI28pR0shIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBKcWksOC9CJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBEIz1pI28pR0shIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBKcWksOC9CJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBeJSo+NltGQiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBkIzNtR0hNSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBeJSo+NltGQiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBkIzNtR0hNSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB5MT0nemlPSyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCVbKmVycyJRSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjB5MT0nemlPSyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCVbKmVycyJRSyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAvPjsieV1TSyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL3JxbEQwVUshIzYkIjBZQ1ZOIj1wPCEjNzckJCIwLz47InldU0shIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9ycWxEMFVLISM2JCIwWUNWTiI9cDwhIzc3JCQiMEpKOW0oUVdLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUD5iVEtmQyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSko5bShRV0shIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBQPmJUS2ZDJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBkVjdebiNbSyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGpKYEU3KVxLISM3JCIwWUNWTiI9cDwhIzc3JCQiMGRWN15uI1tLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwakpgRTcpXEshIzckIjBZQ1ZOIj1wPCEjNzckJCIwJWUwaHQ5X0shIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9SOTpAcGBLISM2JCIwWUNWTiI9cDwhIzc3JCQiMCVlMGh0OV9LISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvUjk6QHBgSyEjNiQiMFlDVk4iPXA8ISM3NyQkIi8ibzNARmdEJCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDtjXCc+ZGRLISM3JCIwWUNWTiI9cDwhIzc3JCQiLyJvM0BGZ0QkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwO2NcJz5kZEshIzckIjBZQ1ZOIj1wPCEjNzckJCIwUCFvZ3EhKmZLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVm9aIj1YaEshIzckIjBZQ1ZOIj1wPCEjNzckJCIwUCFvZ3EhKmZLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVm9aIj1YaEshIzckIjBZQ1ZOIj1wPCEjNzckJCIwaiNcNXB5akshIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8yZWs7TGxLISM2JCIwWUNWTiI9cDwhIzc3JCQiMGojXDVweWpLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvMmVrO0xsSyEjNiQiMFlDVk4iPXA8ISM3NyQkIi9cSWdubW5LISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwJ0hSOTpAcEshIzckIjBZQ1ZOIj1wPCEjNzckJCIvXElnbm1uSyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMCdIUjk6QHBLISM3JCIwWUNWTiI9cDwhIzc3JCQiMDs8LGhZOkYkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQjBVTyI0dEshIzckIjBZQ1ZOIj1wPCEjNzckJCIwOzwsaFk6RiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBCMFVPIjR0SyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBWSCpma1V2SyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFw8U0BycEYkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFZIKmZrVXZLISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwXDxTQHJwRiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcFQoNGpJekshIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB3SFExXjNHJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBwVCg0akl6SyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHdIUTFeM0ckISM3JCIwWUNWTiI9cDwhIzc3JCQiMCdSYmZoPSRHJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC1VTyI0dCVHJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnUmJmaD0kRyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAtVU8iNHQlRyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQW0kNGcxKEckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwSGFNdzUnKUckISM3JCIwWUNWTiI9cDwhIzc3JCQiMEFtJDRnMShHJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEhhTXc1JylHJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBceSJmZSU0SCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBibUtoIVwjSCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwXHkiZmUlNEgkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYm1LaCFcI0gkISM3JCIwWUNWTiI9cDwhIzc3JCQiMHYhKiozZCNbSCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjKXlJWXFqSCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdiEqKjNkI1tIJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCMpeUlZcWpIJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAtLillYnEpSCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzIipHSl0tSSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwLS4pZWJxKUgkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMyIqR0pdLUkkISM3JCIwWUNWTiI9cDwhIzc3JCQiMEg6JzNhZS1MISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTi5GO0lUSSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSDonM2FlLUwhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBOLkY7SVRJJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBiRiVlX1kxTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGg6RCw1ITNMISM3JCIwWUNWTiI9cDwhIzc3JCQiMGJGJWVfWTFMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaDpELDUhM0whIzckIjBZQ1ZOIj1wPCEjNzckJCIwIylSIzNeTTVMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKXlLaSkqKT1KJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAjKVIjM15NNUwhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApeUtpKSopPUokISM3JCIwWUNWTiI9cDwhIzc3JCQiMDNfIWVcQTlMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOVNAcnBkSiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwM18hZVxBOUwhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA5U0BycGRKJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBOa3khWzU9TCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFRfPmNcJz5MISM3JCIwWUNWTiI9cDwhIzc3JCQiME5reSFbNT1MISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVF8+Y1wnPkwhIzckIjBZQ1ZOIj1wPCEjNzckJCIwaHd3bCUpPkskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbms8VEhOSyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwaHd3bCUpPkskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbms8VEhOSyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKSkpWzJYJ2VLJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCVwZGgjNHVLJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjApKSlbMlgnZUskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJXBkaCM0dUskISM3JCIwWUNWTiI9cDwhIzc3JCQiMDksdE5XKEhMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvIypRNiIqR0pMISM2JCIwWUNWTiI9cDwhIzc3JCQiMDksdE5XKEhMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvIypRNiIqR0pMISM2JCIwWUNWTiI9cDwhIzc3JCQiMFQ4cj9DT0wkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWiw3JypvXkwkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFQ4cj9DT0wkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWiw3JypvXkwkISM3JCIwWUNWTiI9cDwhIzc3JCQiMG5EcDAvdkwkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdDg1IilbIVJMISM3JCIwWUNWTiI9cDwhIzc3JCQiMG5EcDAvdkwkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdDg1IilbIVJMISM3JCIwWUNWTiI9cDwhIzc3JCQiMCV6dDFSUVRMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIuRTNtR0hNJCEjNSQiMFlDVk4iPXA8ISM3NyQkIjAlenQxUlFUTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLkUzbUdITSQhIzUkIjBZQ1ZOIj1wPCEjNzckJCIvLWJjUEVYTCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMEVRMV4zb00kISM3JCIwWUNWTiI9cDwhIzc3JCQiLy1iY1BFWEwhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBFUTFeM29NJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBaaWpnViJcTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGBdL08pb11MISM3JCIwWUNWTiI9cDwhIzc3JCQiMFppamdWIlxMISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYF0vTylvXUwhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdHVoWEJJTiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB6aS1Ab1hOJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB0dWhYQklOJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHppLUBvWE4kISM3JCIwWUNWTiI9cDwhIzc3JCQiLigpZkkucE4kISM1JCIwWUNWTiI9cDwhIzc3JDckJCIwMXYrMVslZUwhIzckIjBZQ1ZOIj1wPCEjNzckJCIuKClmSS5wTiQhIzUkIjBZQ1ZOIj1wPCEjNzckNyQkIjAxdisxWyVlTCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFKnpiSnlnTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEsoKSk0ektpTCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBFKnpiSnlnTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEsoKSk0ektpTCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBgNmMrallPJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGYqcGZ4P21MISM3JCIwWUNWTiI9cDwhIzc3JCQiMGA2YytqWU8kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZipwZng/bUwhIzckIjBZQ1ZOIj1wPCEjNzckJCIwekJhJkdhb0whIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAmPV40dzNxTCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6QmEmR2FvTCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCY9XjR3M3FMISM3JCIwWUNWTiI9cDwhIzc3JCQiMDFPX3FBQ1AkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwN0MkZnUnUlAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMDFPX3FBQ1AkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwN0MkZnUnUlAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMEtbXWItalAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUU8iNHQleVAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMEtbXWItalAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUU8iNHQleVAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMGZnW1MjPSFRJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGxbKmVycyJRJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBmZ1tTIz0hUSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBsWyplcnMiUSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJkduYUExJVEkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIjR3M3FnJlEkISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZHbmFBMSVRJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCI0dzNxZyZRJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA3JlsvQCV6USQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA9dCZlb1sqUSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwNyZbL0AlelEkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPXQmZW9bKlEkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFEoSGE+Iz1SJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFcmUTNuTyRSJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBRKEhhPiM9UiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBXJlEzbk8kUiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbDRUIT1xJlIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcig+ZWxDKFIkISM3JCIwWUNWTiI9cDwhIzc3JCQiMGw0VCE9cSZSJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHIoPmVsQyhSJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAiPiNSbCJlKlIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKCo0ITNrNyxNISM3JCIwWUNWTiI9cDwhIzc3JCQiMCI+I1JsImUqUiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKjQhM2s3LE0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwPU1QXWhNUyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDQXlEMV1TJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA9TVBdaE1TJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMENBeUQxXVMkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFdZTk5UdFMkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvWGoyaCkpM00hIzYkIjBZQ1ZOIj1wPCEjNzckJCIwV1lOTlR0UyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9YajJoKSkzTSEjNiQiMFlDVk4iPXA8ISM3NyQkIjByZUw/QDdUJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHhZdSZmdzdNISM3JCIwWUNWTiI9cDwhIzc3JCQiMHJlTD9AN1QkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweFl1JmZ3N00hIzckIjBZQ1ZOIj1wPCEjNzckJCIwKDQ8YDU1Ok0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAuZnMhZWs7TSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoNDxgNTU6TSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC5mcyFlaztNISM3JCIwWUNWTiI9cDwhIzc3JCQiMEMkKUghNCkqPU0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi84MmRjXz9NISM2JCIwWUNWTiI9cDwhIzc3JCQiMEMkKUghNCkqPU0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi84MmRjXz9NISM2JCIwWUNWTiI9cDwhIzc3JCQiL2J6XzInR1UkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwYyQpb10wV1UkISM3JCIwWUNWTiI9cDwhIzc3JCQiL2J6XzInR1UkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwYyQpb10wV1UkISM3JCIwWUNWTiI9cDwhIzc3JCQiMHgyRWdTblUkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJGVwY2BHR00hIzckIjBZQ1ZOIj1wPCEjNzckJCIweDJFZ1NuVSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAkZXBjYEdHTSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAuP0NYPzFWJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDQzbD9sQFYkISM3JCIwWUNWTiI9cDwhIzc3JCQiMC4/Q1g/MVYkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNDNsP2xAViQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvQkItLl1NTSEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiME8/ajBYZ1YkISM3JCIwWUNWTiI9cDwhIzc3JCQiL0JCLS5dTU0hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBPP2owWGdWJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBjVz86IVFRTSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGlLaCFcIypSTSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBjVz86IVFRTSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGlLaCFcIypSTSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkbyY9K2dBVyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqWyVmdi9RVyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJG8mPStnQVckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKlslZnYvUVckISM3JCIwWUNWTiI9cDwhIzc3JCQiMDRwOyYpUmhXJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDpkZGclb1pNISM3JCIwWUNWTiI9cDwhIzc3JCQiMDRwOyYpUmhXJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDpkZGclb1pNISM3JCIwWUNWTiI9cDwhIzc3JCQiME8iWywoPitYJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFVwYlhrOlgkISM3JCIwWUNWTiI9cDwhIzc3JCQiME8iWywoPitYJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFVwYlhrOlgkISM3JCIwWUNWTiI9cDwhIzc3JCQiMGkkSF4mKipRWCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBvIlEwVldiTSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBpJEheJioqUVgkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwbyJRMFZXYk0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwKmU1LCV6eFgkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlI+YlRLZk0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwKmU1LCV6eFgkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJlI+YlRLZk0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwOj00RGY7WSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBAMV0rL0tZJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA6PTREZjtZJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEAxXSsvS1kkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFVJMjVSYlkkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWz1bJlEzbk0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwVUkyNVJiWSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBbPVsmUTNuTSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBvVTAmKj0lcE0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB1SVlxajRaJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBvVTAmKj0lcE0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB1SVlxajRaJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmXE4rKSlIdE0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsVldiVltaJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmXE4rKSlIdE0hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAsVldiVltaJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBAbixseXJaJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEdiVVNCKHlNISM3JCIwWUNWTiI9cDwhIzc3JCQiMEBuLGx5clokISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwR2JVU0IoeU0hIzckIjBZQ1ZOIj1wPCEjNzckJCIwW3oqKlxlNVskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYW5TRC5FWyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwW3oqKlxlNVskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYW5TRC5FWyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdSJ6XCRRXFskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIil6UTUkWydbJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB1InpcJFFcWyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiKXpRNSRbJ1skISM3JCIwWUNWTiI9cDwhIzc3JCQiMCwvJyo+PSkpWyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAyI3BgSE8hXCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwLC8nKj49KSlbJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDIjcGBITyFcJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBGOyVcISlwI1wkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTS9OIUdDJVwkISM3JCIwWUNWTiI9cDwhIzc3JCQiMEY7JVwhKXAjXCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBNL04hR0MlXCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYUcjKip5ZCdcJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL21KYEU3KVwkISM2JCIwWUNWTiI9cDwhIzc3JCQiMGFHIyoqeWQnXCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9tSmBFNylcJCEjNiQiMFlDVk4iPXA8ISM3NyQkIi8zL1x4WCtOISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwKClHSl0tP10kISM3JCIwWUNWTiI9cDwhIzc3JCQiLzMvXHhYK04hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjAoKUdKXS0/XSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMmApKWZQVl0kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwOFRITiMpZV0kISM3JCIwWUNWTiI9cDwhIzc3JCQiMDJgKSlmUFZdJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDhUSE4jKWVdJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBMbCdbdUAzTiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL012LUF3NE4hIzYkIjBZQ1ZOIj1wPCEjNzckJCIwTGwnW3VAM04hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9Ndi1BdzROISM2JCIwWUNWTiI9cDwhIzc3JCQiL3daKUgoNDdOISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwbWxEMFVPXiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvd1opSCg0N04hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBtbEQwVU9eJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAoKSpHW3IoZl4kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJHpQLT5fPE4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwKCkqR1tyKGZeJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCR6UC0+XzxOISM3JCIwWUNWTiI9cDwhIzc3JCQiMDgtIikqcCYpPk4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+IT5fPFNATiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA4LSIpKnAmKT5OISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwPiE+XzxTQE4hIzckIjBZQ1ZOIj1wPCEjNzckJCIvVyJ6JW90Qk4hIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBZLT9nIkdETiEjNyQiMFlDVk4iPXA8ISM3NyQkIi9XInolb3RCTiEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMFktP2ciR0ROISM3JCIwWUNWTiI9cDwhIzc3JCQiMG1FeHA7d18kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwczk9WGgiSE4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwbUV4cDt3XyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBzOT1YaCJITiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKlF2YSdcSk4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqcGksOC9MTiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAkKlF2YSdcSk4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqcGksOC9MTiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA+XnRSd2BgJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMERSOTpAcGAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMD5edFJ3YGAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRFI5OkBwYCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWWpyQ2MjUk4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBfXjcrLDNhJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBZanJDYyNSTiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMF9eNyssM2EkISM3JCIwWUNWTiI9cDwhIzc3JCQiMHN2cDRPSmEkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweWo1JjNvV04hIzckIjBZQ1ZOIj1wPCEjNzckJCIwc3ZwNE9KYSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5ajUmM29XTiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAqenlZZixaTiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDB3M3FnJltOISM3JCIwWUNWTiI9cDwhIzc3JCQiMCp6eVlmLFpOISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMHczcWcmW04hIzckIjBZQ1ZOIj1wPCEjNzckJCIwRCtteiYqM2IkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwSilvXTBXX04hIzckIjBZQ1ZOIj1wPCEjNzckJCIwRCtteiYqM2IkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwSilvXTBXX04hIzckIjBZQ1ZOIj1wPCEjNzckJCIwXzdra3ZaYiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBlKzBTP2piJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBfN2trdlpiJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGUrMFM/amIkISM3JCIwWUNWTiI9cDwhIzc3JCQiMHlDaVxiJ2VOISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJUdKXS0/Z04hIzckIjBZQ1ZOIj1wPCEjNzckJCIweUNpXGInZU4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlR0pdLT9nTiEjNyQiMFlDVk4iPXA8ISM3NyQkIjAwUGdNTkRjJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDZELDUhM2tOISM3JCIwWUNWTiI9cDwhIzc3JCQiMDBQZ01ORGMkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNkQsNSEza04hIzckIjBZQ1ZOIj1wPCEjNzckJCIwSlxlPjprYyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBQUCpcKmZ6YyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSlxlPjprYyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBQUCpcKmZ6YyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZWhjLyZIcU4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBrXCgqelI9ZCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZWhjLyZIcU4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBrXCgqelI9ZCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJVFaJipbPHVOISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvPmNcJz5kZCQhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwJVFaJipbPHVOISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvPmNcJz5kZCQhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwNidHWFoweU4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA8dSQqXCpmek4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwNidHWFoweU4hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA8dSQqXCpmek4hIzckIjBZQ1ZOIj1wPCEjNzckJCIwUCk0JmZNPmUkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVic9XCR6TWUkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFApNCZmTT5lJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFYnPVwkek1lJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBrNVxXOWVlJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLygpKiopPmZ0ZSQhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwazVcVzllZSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi8oKSoqKT5mdGUkISM2JCIwWUNWTiI9cDwhIzc3JCQiL0hzJUglcCplJCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMCc0IilbIVI3ZiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvSHMlSCVwKmUkISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwJzQiKVshUjdmJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA8Tlg5dU5mJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEJCJykqKT1eZiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwPE5YOXVOZiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBCQicpKik9XmYkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFZaVipSWChmJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFxOJVsoKSoqKWYkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFZaVipSWChmJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFxOJVsoKSoqKWYkISM3JCIwWUNWTiI9cDwhIzc3JCQiLyhmVCVRTCxPISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwd1ojKWZ5R2ckISM3JCIwWUNWTiI9cDwhIzc3JCQiLyhmVCVRTCxPISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwd1ojKWZ5R2ckISM3JCIwWUNWTiI9cDwhIzc3JCQiMCc+KFJwOF9nJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC1nIVslZW5nJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAnPihScDhfZyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAtZyFbJWVuZyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQiV5Vk40NE8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBIc3lIUTFoJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBCJXlWTjQ0TyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEhzeUhRMWgkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFwnZiRSdEhoJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGIlb1oiPVhoJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBcJ2YkUnRIaCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBiJW9aIj1YaCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwdzNNQ2BvaCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjb1woKnpSPU8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwdzNNQ2BvaCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjb1woKnpSPU8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwLUBLNEwyaSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAzNHQleUZBTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAtQEs0TDJpJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDM0dCV5RkFPISM3JCIwWUNWTiI9cDwhIzc3JCQiMEhMSSVIaENPISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTkBycGRoaSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSExJJUhoQ08hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBOQHJwZGhpJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBiWEd6I1xHTyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGhMcGFQK2okISM3JCIwWUNWTiI9cDwhIzc3JCQiMGJYR3ojXEdPISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwaExwYVAraiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwI3lsVUVQS08hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApZXUnUjxSaiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwI3lsVUVQS08hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApZXUnUjxSaiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwM3FDXF9paiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA5ZWxDKHpQTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjAzcUNcX2lqJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDllbEMoelBPISM3JCIwWUNWTiI9cDwhIzc3JCQiME4jR1VCOFNPISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVHFqNHg7ayQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwTiNHVUI4U08hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBUcWo0eDtrJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBoJTQjPjdTayQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBuIz1ZcGJYTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBoJTQjPjdTayQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBuIz1ZcGJYTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjApbyE+LyMqeWskISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJVwqZnpPJVxPISM3JCIwWUNWTiI9cDwhIzc3JCQiMClvIT4vIyp5ayQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlXCpmek8lXE8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwOT48Kj14Xk8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi9zIWVrO0xsJCEjNiQiMFlDVk4iPXA8ISM3NyQkIjA5PjwqPXheTyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL3MhZWs7TGwkISM2JCIwWUNWTiI9cDwhIzc3JCQiMFRKOnVeY2wkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWj5jXCc+ZE8hIzckIjBZQ1ZOIj1wPCEjNzckJCIwVEo6dV5jbCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBaPmNcJz5kTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBuVjhmSiZmTyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHRKYU13NW0kISM3JCIwWUNWTiI9cDwhIzc3JCQiMG5WOGZKJmZPISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwdEphTXc1bSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJWY6VDlUak8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIi5XXz5jXG0kISM1JCIwWUNWTiI9cDwhIzc3JCQiMCVmOlQ5VGpPISM3JCIwWUNWTiI9cDwhIzc3JDckJCIuV18+Y1xtJCEjNSQiMFlDVk4iPXA8ISM3NyQkIi8jbzRIIkhuTyEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMEVjXS9PKW9PISM3JCIwWUNWTiI9cDwhIzc3JCQiLyNvNEgiSG5PISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwRWNdL08pb08hIzckIjBZQ1ZOIj1wPCEjNzckJCIwWiF5UzY8ck8hIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBgb1sqZXJzTyEjNyQiMFlDVk4iPXA8ISM3NyQkIjBaIXlTNjxyTyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGBvWyplcnNPISM3JCIwWUNWTiI9cDwhIzc3JCQiMHQjZiEqNDB2TyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHohb1dkZndPISM3JCIwWUNWTiI9cDwhIzc3JCQiMHQjZiEqNDB2TyEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHohb1dkZndPISM3JCIwWUNWTiI9cDwhIzc3JCQiLjAvJTMkKnlPISM1JCIwWUNWTiI9cDwhIzc3JDckJCIwMSRcJWZ2L28kISM3JCIwWUNWTiI9cDwhIzc3JCQiLjAvJTMkKnlPISM1JCIwWUNWTiI9cDwhIzc3JDckJCIwMSRcJWZ2L28kISM3JCIwWUNWTiI9cDwhIzc3JCQiMEU8LXA1R28kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTDBWV2JWbyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwRTwtcDVHbyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBMMFZXYlZvJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBgSCthIXAnbyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBmPFRITiMpbyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwYEgrYSFwJ28kISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwZjxUSE4jKW8kISM3JCIwWUNWTiI9cDwhIzc3JCQiMHpUKSpRcTBwJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCcpSFI5OkBwJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB6VCkqUXEwcCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAnKUhSOTpAcCQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMWEnUi1YJXAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwN1VQKlwqZnAkISM3JCIwWUNWTiI9cDwhIzc3JCQiMDFhJ1ItWCVwJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDdVUCpcKmZwJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLbSUqM0kkKXAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUmFOJVsoKSpwJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBLbSUqM0kkKXAkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUmFOJVsoKSpwJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBmeSNSKjRBcSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBsbUxwYVBxJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBmeSNSKjRBcSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBsbUxwYVBxJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAmMzQqeSozMVAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAjKnlKYU13cSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJjM0KnkqMzFQISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIyp5SmFNd3EkISM3JCIwWUNWTiI9cDwhIzc3JCQiMDcuKlEncCo0UCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMD0iKkhSOTpyJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA3LipRJ3AqNFAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA9IipIUjk6ciQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwUTooKVtcUXIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWC5HQyVSOlAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwUTooKVtcUXIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwWC5HQyVSOlAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbEYmUSRIeHIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcjpFNHUjPlAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbEYmUSRIeHIkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcjpFNHUjPlAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIypSJCk9NDtzJCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCl6VVVSOkJQISM3JCIwWUNWTiI9cDwhIzc3JCQiMCMqUiQpPTQ7cyQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjApelVVUjpCUCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA9XyJRISpbRFAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDU0F6THFzJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA9XyJRISpbRFAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBDU0F6THFzJCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBYa3opKW8kSFAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBeXz9rODR0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBYa3opKW8kSFAhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBeXz9rODR0JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjByd3h0W0t0JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHhrPVwkek1QISM3JCIwWUNWTiI9cDwhIzc3JCQiMHJ3eHRbS3QkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIweGs9XCR6TVAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKSopZShlR3J0JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMC94O010J1FQISM3JCIwWUNWTiI9cDwhIzc3JCQiMCkqKWUoZUdydCQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAveDtNdCdRUCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBDLHVWMzV1JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLyQqWyI+YER1JCEjNiQiMFlDVk4iPXA8ISM3NyQkIjBDLHVWMzV1JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiLyQqWyI+YER1JCEjNiQiMFlDVk4iPXA8ISM3NyQkIjBeOHNHKSlbdSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBkLDgvTGt1JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBeOHNHKSlbdSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBkLDgvTGt1JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB4RHE4byhbUCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCRRNiIqR0pdUCEjNyQiMFlDVk4iPXA8ISM3NyQkIjB4RHE4byhbUCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCRRNiIqR0pdUCEjNyQiMFlDVk4iPXA8ISM3NyQkIjAvUW8pemtfUCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL2gjNHUjPmFQISM2JCIwWUNWTiI9cDwhIzc3JCQiMC9Rbyl6a19QISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvaCM0dSM+YVAhIzYkIjBZQ1ZOIj1wPCEjNzckJCIvLmxPeV9jUCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiME9RMmZzIWVQISM3JCIwWUNWTiI9cDwhIzc3JCQiLy5sT3lfY1AhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBPUTJmcyFlUCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBkaWtvMi93JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGpdMFdfPnckISM3JCIwWUNWTiI9cDwhIzc3JCQiMGRpa28yL3ckISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwal0wV18+dyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJFtGT3ZHa1AhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqR08hSEtldyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJFtGT3ZHa1AhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAqR08hSEtldyQhIzckIjBZQ1ZOIj1wPCEjNzckJCIvcjMnUW4ib1AhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjA7diw5NyhwUCEjNyQiMFlDVk4iPXA8ISM3NyQkIi9yMydRbiJvUCEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMDt2LDk3KHBQISM3JCIwWUNWTiI9cDwhIzc3JCQiME8qKmVCWj94JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFUoKSoqKT5mdFAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwTyoqZUJaP3gkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwVSgpKiopPmZ0UCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBqNmQzRmZ4JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMHAqelI9WnhQISM3JCIwWUNWTiI9cDwhIzc3JCQiMGo2ZDNGZngkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwcCp6Uj1aeFAhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKlFfTnAhKXpQISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJj5oKm9eOHkkISM3JCIwWUNWTiI9cDwhIzc3JCQiMCpRX05wISl6UCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCY+aCpvXjh5JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjA7T2B5J28keSQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBBQyVSOkImeSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwO09geSdvJHkkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwQUMlUjpCJnkkISM3JCIwWUNWTiI9cDwhIzc3JCQiMFVbXmptdnkkISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwW08jKlE2Iip5JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBVW15qbXZ5JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMFtPIypRNiIqeSQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcGdcW1k5eiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB2WyFSNypIeiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcGdcW1k5eiQhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB2WyFSNypIeiQhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJkh4TWpLJnokISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwLGgpKTNyb3okISM3JCIwWUNWTiI9cDwhIzc3JCQiMCZIeE1qSyZ6JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCxoKSkzcm96JCEjNyQiMFlDVk4iPXA8ISM3NyQkIjBBJmUlPTEjKnokISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwR3QnUTR2K1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwQSZlJT0xIyp6JCEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEd0J1E0ditRISM3JCIwWUNWTiI9cDwhIzc3JCQiMFsoUk1nMy5RISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYSZbKXlJWSFRISM3JCIwWUNWTiI9cDwhIzc3JCQiMFsoUk1nMy5RISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwYSZbKXlJWSFRISM3JCIwWUNWTiI9cDwhIzc3JCQiMHY0VSllJ3AhUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJ5SFExXjNRISM3JCIwWUNWTiI9cDwhIzc3JCQiMHY0VSllJ3AhUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCJ5SFExXjNRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCxBU3RYMyJRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMjUiKVshUjdRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCxBU3RYMyJRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMjUiKVshUjdRISM3JCIwWUNWTiI9cDwhIzc3JCQiMEdNUWVEWiJRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwTUF6THFpIlEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwR01RZURaIlEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBNQXpMcWkiUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBhWU9WMCc9USEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiL1l0KD1dLCNRISM2JCIwWUNWTiI9cDwhIzc3JCQiMGFZT1YwJz1RISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvWXQoPV0sI1EhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwIillTUcmW0FRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKG9hUCsuQ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwIillTUcmW0FRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKG9hUCsuQ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMnJLOGxqI1EhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA4ZnQpKTR6I1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMnJLOGxqI1EhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA4ZnQpKTR6I1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwTSQzJClcQ0lRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvOTxQKCp5SlEhIzYkIjBZQ1ZOIj1wPCEjNzckJCIwTSQzJClcQ0lRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIvOTxQKCp5SlEhIzYkIjBZQ1ZOIj1wPCEjNzckJCIvYypHJFs3TVEhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBtJClwZXBjJFEhIzckIjBZQ1ZOIj1wPCEjNzckJCIvYypHJFs3TVEhIzYkIjBZQ1ZOIj1wPCEjNzckNyQkIjBtJClwZXBjJFEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKHlxI28vIVFRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwJGZ6TyVcJlJRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCh5cSNvLyFRUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCRmek8lXCZSUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjA4P0RgJSk9JVEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+M21HSE0lUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjA4P0RgJSk9JVEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA+M21HSE0lUSEjNyQiMFlDVk4iPXA8ISM3NyQkIi9DTCNRa2QlUSEjNiQiMFlDVk4iPXA8ISM3NyQ3JCQiMFk/azg0dCVRISM3JCIwWUNWTiI9cDwhIzc3JCQiL0NMI1FrZCVRISM2JCIwWUNWTiI9cDwhIzc3JDckJCIwWT9rODR0JVEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbVdAQlcnXFEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBzS2kpKik9XlEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwbVdAQlcnXFEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBzS2kpKik9XlEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwJHAmPjNDTiZRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwKlwvTylvXSZRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCRwJj4zQ04mUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCpcL08pb10mUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjA+cDwkUlNkUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMERkZW9bKmVRISM3JCIwWUNWTiI9cDwhIzc3JCQiMD5wPCRSU2RRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwRGRlb1sqZVEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWSJlInkkR2hRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwX3BjYEdHJ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwWSJlInkkR2hRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwX3BjYEdHJ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcyRSSk87bFEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5IlsmUTNuJ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwcyRSSk87bFEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjB5IlsmUTNuJ1EhIzckIjBZQ1ZOIj1wPCEjNzckJCIwKmY/IltWIXBRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwMCVITiMpZXFRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCpmPyJbViFwUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDAlSE4jKWVxUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBEPTVMQkgoUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMEoxXjNvVyhRISM3JCIwWUNWTiI9cDwhIzc3JCQiMEQ9NUxCSChRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwSjFeM29XKFEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwX0kzPS5vKFEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBlPVwkek15USEjNyQiMFlDVk4iPXA8ISM3NyQkIjBfSTM9Lm8oUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMGU9XCR6TXlRISM3JCIwWUNWTiI9cDwhIzc3JCQiMHlVMS4kbyEpUSEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMCUzdCV5RkEpUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjB5VTEuJG8hKVEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAlM3QleUZBKVEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMGIvKUdjJSlRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNlZYajJoKVEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwMGIvKUdjJSlRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwNlZYajJoKVEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwSm4tdFUlKSlRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwUGJWWygpKiopUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjBKbi10VSUpKVEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBQYlZbKCkqKilRISM3JCIwWUNWTiI9cDwhIzc3JCQiMGV6K2VBQipRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwa25UTG5RKlEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwZXorZUFCKlEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjBrblRMblEqUSEjNyQiMFlDVk4iPXA8ISM3NyQkIjAlPSopSEM/JypRISM3JCIwWUNWTiI9cDwhIzc3JDckJCIwIip6Uj1aeCpRISM3JCIwWUNWTiI9cDwhIzc3JCQiMCU9KilIQz8nKlEhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjAiKnpSPVp4KlEhIzckIjBZQ1ZOIj1wPCEjNzckJCIwNi8oekEzK1IhIzckIjBZQ1ZOIj1wPCEjNzckNyQkIjA8I3pMcWksUiEjNyQiMFlDVk4iPXA8ISM3NyQkIjA2Lyh6QTMrUiEjNyQiMFlDVk4iPXA8ISM3NyQ3JCQiMDwjekxxaSxSISM3JCIwWUNWTiI9cDwhIzc3JCQiMHcmKTN4alYhUiEjNyQiL3g6PUhJYzwhIzY3JDckJCIwVy9PKW9dMFIhIzckIi94Oj1ISWM8ISM2NyQkIjB3JikzeGpWIVIhIzckIi94Oj1ISWM8ISM2NyQ3JCQiL25UTG5RNFIhIzYkIjA8bFBiIio+ciIhIzc3JCQiMDlJakNTIjRSISM3JCIwV18+Y1wnPjwhIzc3JDckJCIwOUlqQ1MiNFIhIzckIjBXXz5jXCc+PCEjNzckJCIwVy9PKW9dMFIhIzckIi94Oj1ISWM8ISM2NyQ3JCQiMCgqR0tlbUsiUiEjNyQiMEo5YWdoLWYiISM3NyQkIjBIP0dVNEoiUiEjNyQiMCUpb10wV19mIiEjNzckNyQkIjBIP0dVNEoiUiEjNyQiMCUpb10wV19mIiEjNzckJCIvblRMblE0UiEjNiQiMDxsUGIiKj5yIiEjNzckNyQkIjBCVElWWXIiUiEjNyQiMCYqUU0vQmhZIiEjNzckJCIwWiMzSTArPFIhIzckIjBCJj1bJlEzWiIhIzc3JDckJCIwWiMzSTArPFIhIzckIjBCJj1bJlEzWiIhIzc3JCQiMCgqR0tlbUsiUiEjNyQiMEo5YWdoLWYiISM3NyQ3JCQiL04mR0dFNSNSISM2JCIvcj8lcD4nUjghIzY3JCQiMDsyUEg+MyNSISM3JCIwaiw4L0xrTSIhIzc3JDckJCIwOzJQSD4zI1IhIzckIjBqLDgvTGtNIiEjNzckJCIwQlRJVllyIlIhIzckIjAmKlFNL0JoWSIhIzc3JDckJCIwd2xFODFcI1IhIzckIjBfc0QzMDNAIiEjNzckJCIvYFRlNWRDUiEjNiQiMC09V2BGP0EiISM3NyQ3JCQiL2BUZTVkQ1IhIzYkIjAtPVdgRj9BIiEjNzckJCIvTiZHR0U1I1IhIzYkIi9yPyVwPidSOCEjNjckNyQkIjAueUMpZnlHUiEjNyQiMCdwXjhDdXo1ISM3NyQkIjAtZ1IjM0VHUiEjNyQiMFVNdi1BdzQiISM3NyQ3JCQiMC1nUiMzRUdSISM3JCIwVU12LUF3NCIhIzc3JCQiMHdsRTgxXCNSISM3JCIwX3NEMzAzQCIhIzc3JDckJCIwSCFIS2VtS1IhIzckIjAnW0YjKjQvbCUqISM4NyQkIi9LVHJLKj0kUiEjNiQiMDgzbD9sQHQqISM4NyQ3JCQiL0tUcksqPSRSISM2JCIwODNsP2xAdCohIzg3JCQiMC55QylmeUdSISM3JCIwJ3BeOEN1ejUhIzc3JDckJCIwYy1Ab1hsJFIhIzckIjBcYyNRS3I2IikhIzg3JCQiMEQ7RXpzYSRSISM3JCIwNHN3ODUiKVspISM4NyQ3JCQiMEQ7RXpzYSRSISM3JCIwNHN3ODUiKVspISM4NyQkIjBIIUhLZW1LUiEjNyQiMCdbRiMqNC9sJSohIzg3JDckJCIwI1siPmBELyVSISM3JCIwMSt6MUwkUW4hIzg3JCQiMHkzVl4uIVJSISM3JCIwL08pb10wV3MhIzg3JDckJCIweTNWXi4hUlIhIzckIjAvTylvXTBXcyEjODckJCIwYy1Ab1hsJFIhIzckIjBcYyNRS3I2IikhIzg3JDckJCIwWXUjPiQqW1VSISM3JCIkKychIiI3JCQiMCNbIj5gRC8lUiEjNyQiMDErejFMJFFuISM4LSUmQ09MT1JHNiYlJFJHQkckIihedWknISIoJCIoXnVpJyEiKCQiKF51aSchIigtJSpUSElDS05FU1NHNiMiIiEtJSVURVhURzYlNyQkIisjWyU0UD0hIigkIiYrKyUhIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJjI2MH5LNiIvJSdmYW1pbHlHUSpIZWx2ZXRpY2E2Ii8lJXNpemVHUSMxMDYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ25vcm1hbDYiLSUlRk9OVEc2JSUqSEVMVkVUSUNBRyUoREVGQVVMVEclKERFRkFVTFRHLSUlVEVYVEc2JTckJCIrOEVHK0AhIigkIiYrKyUhIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJjI4MH5LNiIvJSdmYW1pbHlHUSpIZWx2ZXRpY2E2Ii8lJXNpemVHUSMxMDYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ25vcm1hbDYiLSUlRk9OVEc2JSUqSEVMVkVUSUNBRyUoREVGQVVMVEclKERFRkFVTFRHLSUlVEVYVEc2JTckJCIremludEIhIigkIiYrKyUhIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJjMwMH5LNiIvJSdmYW1pbHlHUSpIZWx2ZXRpY2E2Ii8lJXNpemVHUSMxMDYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ25vcm1hbDYiLSUlRk9OVEc2JSUqSEVMVkVUSUNBRyUoREVGQVVMVEclKERFRkFVTFRHLSUlVEVYVEc2JTckJCIrQXcoNG0jISIoJCImKyslISIiLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjUtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUSYzMjB+SzYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK3gwKSpwSCEiKCQiJisrJSEiIi0lKV9UWVBFU0VURzYjLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjY1LUkjbXNHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2I1EmMzQwfks2Ii8lJ2ZhbWlseUdRKkhlbHZldGljYTYiLyUlc2l6ZUdRIzEwNiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJmZhbHNlNiIvJSp1bmRlcmxpbmVHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lLG1hdGh2YXJpYW50R1Enbm9ybWFsNiItJSVGT05URzYlJSpIRUxWRVRJQ0FHJShERUZBVUxURyUoREVGQVVMVEctJSVURVhURzYlNyQkIisnKW8iXEskISIoJCImKyslISIiLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjUtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUSYzNjB+SzYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiKyVwVXpRJSEiKCQiJisrJSEiIi0lKV9UWVBFU0VURzYjLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjY1LUkjbXNHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2I1EmMzgwfks2Ii8lJ2ZhbWlseUdRKkhlbHZldGljYTYiLyUlc2l6ZUdRIzEwNiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJmZhbHNlNiIvJSp1bmRlcmxpbmVHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lLG1hdGh2YXJpYW50R1Enbm9ybWFsNiItJSVGT05URzYlJSpIRUxWRVRJQ0FHJShERUZBVUxURyUoREVGQVVMVEctJSVURVhURzYlNyQkIiswODZoWiEiKCQiJisrJSEiIi0lKV9UWVBFU0VURzYjLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjY1LUkjbXNHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2I1EmNDAwfks2Ii8lJ2ZhbWlseUdRKkhlbHZldGljYTYiLyUlc2l6ZUdRIzEwNiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJmZhbHNlNiIvJSp1bmRlcmxpbmVHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lLG1hdGh2YXJpYW50R1Enbm9ybWFsNiItJSVGT05URzYlJSpIRUxWRVRJQ0FHJShERUZBVUxURyUoREVGQVVMVEctJSVURVhURzYlNyQkIitfKipcW10hIigkIiYrKyUhIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJjQyMH5LNiIvJSdmYW1pbHlHUSpIZWx2ZXRpY2E2Ii8lJXNpemVHUSMxMDYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ25vcm1hbDYiLSUlRk9OVEc2JSUqSEVMVkVUSUNBRyUoREVGQVVMVEclKERFRkFVTFRHLSUlVEVYVEc2JTckJCIrVG8kUUomISIoJCImKyslISIiLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjUtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUSY0NDB+SzYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiKzp1cnFiISIoJCImKyslISIiLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjUtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUSY0NjB+SzYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJ0NVUlZFU0c2JDdbZ3o3JC0lJkZsb2F0RzYjJSlpbmZpbml0eUckIiIhISIiNyQkIislKWVkLE0hIigkIiM1ISIiNyQkIipuc2BXJCEiJyQiIz8hIiI3JCQiKmwmW3RNISInJCIjSSEiIjckJCIrMTpuJVwkISIoJCIjUyEiIjckJCIrZVEnPV4kISIoJCIjXSEiIjckJCIrcClIa18kISIoJCIjZyEiIjckJCIqJVs3Uk4hIickIiNxISIiNyQkIitGR1RdTiEiKCQiIyEpISIiNyQkIitPMWdnTiEiKCQiIyEqISIiNyQkIitFQiEqcE4hIigkIiQrIiEiIjckJCIrVk5aeU4hIigkIiQ1IiEiIjckJCIrQzdWJ2UkISIoJCIkPyIhIiI3JCQiKyJmbFFmJCEiKCQiJEkiISIiNyQkIisxeSUzZyQhIigkIiRTIiEiIjckJCIrWV1WMk8hIigkIiRdIiEiIjckJCIrIipSbjhPISIoJCIkZyIhIiI3JCQiK3RLZz5PISIoJCIkcSIhIiI3JCQiK19fRERPISIoJCIkIT0hIiI3JCQiKzx0bElPISIoJCIkIT4hIiI3JCQiK3VHJGVqJCEiKCQiJCsjISIiNyQkIisoMy0zayQhIigkIiQ1IyEiIjckJCIrakNlWE8hIigkIiQ/IyEiIjckJCIrLSQqPV1PISIoJCIkSSMhIiI3JCQiK2hnamFPISIoJCIkUyMhIiI3JCQiK1JZJCplTyEiKCQiJF0jISIiNyQkIis8YzRqTyEiKCQiJGcjISIiNyQkIitXJUdybSQhIigkIiRxIyEiIjckJCIrKGZUNW4kISIoJCIkIUchIiI3JCQiKzlGJVtuJCEiKCQiJCFIISIiNyQkIisqcFEmeU8hIigkIiQrJCEiIjckJCIrO2U4I28kISIoJCIkNSQhIiI3JCQiK24oUmNvJCEiKCQiJD8kISIiNyQkIitmZDAqbyQhIigkIiRJJCEiIjckJCIraCYpUSNwJCEiKCQiJFMkISIiNyQkIitcRGsmcCQhIigkIiRdJCEiIjckJCIrXzwjKSlwJCEiKCQiJGckISIiNyQkIisqKSlIPnEkISIoJCIkcSQhIiI3JCQiKylScVxxJCEiKCQiJCFRISIiNyQkIitqayV6cSQhIigkIiQhUiEiIjckJCIrVzUnM3IkISIoJCIkKyUhIiI3JCQiKyMqb3I4UCEiKCQiJDUlISIiNyQkIit1bF47UCEiKCQiJD8lISIiNyQkIiskW2kjPlAhIigkIiRJJSEiIjckJCIqJ28mPnMkISInJCIkUyUhIiI3JCQiKy09Z0NQISIoJCIkXSUhIiI3JCQiK3gjKj5GUCEiKCQiJGclISIiNyQkIitNNnZIUCEiKCQiJHElISIiNyQkIis3ImZBdCQhIigkIiQhWyEiIjckJCIrXFtzTVAhIigkIiQhXCEiIjckJCIrKikpXHJ0JCEiKCQiJCsmISIiNyQkIipwTiZSUCEiJyQiJDUmISIiNyQkIitLTyk9dSQhIigkIiQ/JiEiIjckJCIrPl0+V1AhIigkIiRJJiEiIjckJCIrKDNya3UkISIoJCIkUyYhIiI3JCQiKzRJcltQISIoJCIkXSYhIiI3JCQiKycqPSM0diQhIigkIiRnJiEiIjckJCIrMikpNGBQISIoJCIkcSYhIiI3JCQiK1paQ2JQISIoJCIkIWUhIiI3JCQiK3QxT2RQISIoJCIkIWYhIiI3JCQiKyhcWiVmUCEiKCQiJCsnISIiNyQkIispMzE6dyQhIigkIiQ1JyEiIjckJCIrd3NgalAhIigkIiQ/JyEiIjckJCIrYD1hbFAhIigkIiRJJyEiIjckJCIreDBfblAhIigkIiRTJyEiIjckJCIrclRacFAhIigkIiRdJyEiIjckJCIrR0xTclAhIigkIiRnJyEiIjckJCIrOCgzTHgkISIoJCIkcSchIiI3JCQiK2g0PnZQISIoJCIkIW8hIiI3JCQiKyRvXXF4JCEiKCQiJCFwISIiNyQkIitqJSkpKXlQISIoJCIkKyghIiI3JCQiK2tbcSF5JCEiKCQiJDUoISIiNyQkIitEL10jeSQhIigkIiQ/KCEiIjckJCIrbGNGJXkkISIoJCIkSSghIiI3JCQiKyQzSmd5JCEiKCQiJFMoISIiNyQkIio7bnh5JCEiJyQiJF0oISIiNyQkIitlVlsqeSQhIigkIiRnKCEiIjckJCIrQEo9InokISIoJCIkcSghIiI3JCQiKilRJ0d6JCEiJyQiJCF5ISIiNyQkIitbcV8leiQhIigkIiQheiEiIjckJCIrQ0k8J3okISIoJCIkKykhIiI3JCQiKyU+LXl6JCEiKCQiJDUpISIiNyQkIitIXFQqeiQhIigkIiQ/KSEiIjckJCIrKWU2NSFRISIoJCIkSSkhIiI3JCQiKl8jZi1RISInJCIkUykhIiI3JCQiK2YhZVQhUSEiKCQiJF0pISIiNyQkIipgM2QhUSEiJyQiJGcpISIiNyQkIitaVUMyUSEiKCQiJHEpISIiNyQkIis5YnczUSEiKCQiJCEpKSEiIjckJCIrRUVGNVEhIigkIiQhKikhIiI3JCQiK29ldzZRISIoJCIkKyohIiI3JCQiKzpiQzhRISIoJCIkNSohIiI3JCQiK089cjlRISIoJCIkPyohIiI3JCQiKjRsaCJRISInJCIkSSohIiI3JCQiK0hiZzxRISIoJCIkUyohIiI3JCQiKyhSTCE+USEiKCQiJF0qISIiNyQkIitLKlsvI1EhIigkIiRnKiEiIjckJCIra0ImPSNRISIoJCIkcSohIiI3JCQiKztSQ0JRISIoJCIkISkqISIiNyQkIisxUWlDUSEiKCQiJCEqKiEiIjckJCIrWEEqZiNRISIoJCIlKzUhIiI3JCQiK1AlXHQjUSEiKCQiJTU1ISIiNyQkIiskZSZwR1EhIigkIiU/NSEiIjckJCIreDMuSVEhIigkIiVJNSEiIjckJCIrMmJOSlEhIigkIiVTNSEiIjckJCIrZCdwRSRRISIoJCIlXTUhIiI3JCQiKzFOKFIkUSEiKCQiJWc1ISIiNyQkIitHc0VOUSEiKCQiJXE1ISIiNyQkIisjKjRiT1EhIigkIiUhMyIhIiI3JCQiK2xcI3kkUSEiKCQiJSE0IiEiIjckJCIrMSQqM1JRISIoJCIlKzYhIiI3JCQiK3RUTVNRISIoJCIlNTYhIiI3JCQiKz4oKmVUUSEiKCQiJT82ISIiNyQkIisjNEVHJVEhIigkIiVJNiEiIjckJCIrUk0wV1EhIigkIiVTNiEiIjckJCIpPkZYUSEiJiQiJV02ISIiNyQkIis6O1tZUSEiKCQiJWc2ISIiNyQkIis9Rm9aUSEiKCQiJXE2ISIiNyQkIitUYCgpW1EhIigkIiUhPSIhIiI3JCQiKzknZismUSEiKCQiJSE+IiEiIjckJCIraGNCXlEhIigkIiUrNyEiIjckJCIrME9TX1EhIigkIiU1NyEiIjckJCIrbk5jYFEhIigkIiU/NyEiIjckJCIramNyYVEhIigkIiVJNyEiIjckJCIrNCsnZSZRISIoJCIlUzchIiI3JCQiKzpuKnAmUSEiKCQiJV03ISIiNyQkIisjKmU3ZVEhIigkIiVnNyEiIjckJCIrWXdDZlEhIigkIiVxNyEiIjckJCIrJDNpLidRISIoJCIlIUciISIiNyQkIisvJHA5J1EhIigkIiUhSCIhIiI3JCQiKzQlcEQnUSEiKCQiJSs4ISIiNyQkIispXGlPJ1EhIigkIiU1OCEiIjckJCIraydbWidRISIoJCIlPzghIiI3JCQiKy8hR2UnUSEiKCQiJUk4ISIiNyQkIisyMSFwJ1EhIigkIiVTOCEiIjckJCIrbGwneidRISIoJCIlXTghIiI3JCQiK2xmLXBRISIoJCIlZzghIiI3JCQiKyUqKXkrKFEhIigkIiVxOCEiIjckJCIrT2E3clEhIigkIiUhUSIhIiI3JCQiK3ZjO3NRISIoJCIlIVIiISIiNyQkIipwKj50USEiJyQiJSs5ISIiNyQkIitqdkF1USEiKCQiJTU5ISIiNyQkIipQXF8oUSEiJyQiJT85ISIiNyQkIisqPWxpKFEhIigkIiVJOSEiIjckJCIrJTR2cyhRISIoJCIlUzkhIiI3JCQiK2UieiN5USEiKCQiJV05ISIiNyQkIitidUZ6USEiKCQiJWc5ISIiNyQkIitgK0YhKVEhIigkIiVxOSEiIjckJCIrQ3FEIilRISIoJCIlIVsiISIiNyQkIitNJVFBKVEhIigkIiUhXCIhIiI3JCQiK15WQCQpUSEiKCQiJSs6ISIiNyQkIitUWz0lKVEhIigkIiU1OiEiIjckJCIrbSpcXilRISIoJCIlPzohIiI3JCQiKyN6NGgpUSEiKCQiJUk6ISIiNyQkIit5VjEoKVEhIigkIiVTOiEiIjckJCIrKHk4ISkpUSEiKCQiJV06ISIiNyQkIit6IWUqKSlRISIoJCIlZzohIiI3JCQiKzZ0KikqKVEhIigkIiVxOiEiIjckJCIrVDokMypRISIoJCIlIWUiISIiNyQkIitGM3ciKlEhIigkIiUhZiIhIiI3JCQiK0JfbyMqUSEiKCQiJSs7ISIiNyQkIismeS9PKlEhIigkIiU1OyEiIjckJCIrbCY+WCpRISIoJCIlPzshIiI3JCQiKz0nSGEqUSEiKCQiJUk7ISIiNyQkIislKlxMJypRISIoJCIlUzshIiI3JCQiK1dkQigqUSEiKCQiJV07ISIiNyQkIiojPjgpKlEhIickIiVnOyEiIjckJCIrcE4tKipRISIoJCIlcTshIiI3JCQiK1QyIioqKlEhIigkIiUhbyIhIiI3JCQiKyRbJHorUiEiKCQiJSFwIiEiIjckJCIrVT1uLFIhIigkIiUrPCEiIjckJCIra2VhLVIhIigkIiU1PCEiIjckJCIrJWY6TSFSISIoJCIlPzwhIiI3JCQiK3g1Ry9SISIoJCIlSTwhIiI3JCQiK2VCOTBSISIoJCIlUzwhIiI3JCQiK3klKipmIVIhIigkIiVdPCEiIjckJCIqW19vIVIhIickIiVnPCEiIjckJCIrMjlxMlIhIigkIiVxPCEiIjckJCIpamEzUiEiJiQiJSF5IiEiIjckJCIrKT4oUTRSISIoJCIlIXoiISIiNyQkIitVVEE1UiEiKCQiJSs9ISIiNyQkIitycjA2UiEiKCQiJTU9ISIiNyQkIitDaik9IlIhIigkIiU/PSEiIjckJCIrUjtyN1IhIigkIiVJPSEiIjckJCIrX0pgOFIhIigkIiVTPSEiIjckJCIrLTROOVIhIigkIiVdPSEiIjckJCIrRFw7OlIhIigkIiVnPSEiIjckJCIrYl8oZiJSISIoJCIlcT0hIiI3JCQiK0g+eTtSISIoJCIlISk9ISIiNyQkIisiKVxlPFIhIigkIiUhKj0hIiI3JCQiK1lXUT1SISIoJCIlKz4hIiI3JCQiK2QuPT5SISIoJCIlNT4hIiI3JCQiK1pGKCo+UiEiKCQiJT8+ISIiNyQkIitcO3c/UiEiKCQiJUk+ISIiNyQkIismNFo6I1IhIigkIiVTPiEiIjckJCIrPSJIQiNSISIoJCIlXT4hIiI3JCQiK1t4NUJSISIoJCIlZz4hIiI3JCQiKzxJKVEjUiEiKCQiJXE+ISIiNyQkIithXGxDUiEiKCQiJSEpPiEiIjckJCIrImZCYSNSISIoJCIlISo+ISIiNyQkIitiKik9RVIhIigkIiUrPyEiIjckJCIreTUmcCNSISIoJCIlNT8hIiI3JCQiKygpKjR4I1IhIigkIiU/PyEiIjckJCIrNmRZR1IhIigkIiVJPyEiIjckJCIreCM9I0hSISIoJCIlUz8hIiI3JCQiKzl4JypIUiEiKCQiJV0/ISIiNyQkIitcU3JJUiEiKCQiJWc/ISIiNyQkIiszdFhKUiEiKCQiJXE/ISIiNyQkIis+dj5LUiEiKCQiJSEzIyEiIjckJCIrMVokSCRSISIoJCIlITQjISIiNyQkIisoKilvTyRSISIoJCIlK0AhIiI3JCQiKzssU01SISIoJCIlNUAhIiI3JCQiKylRR14kUiEiKCQiJT9AISIiNyQkIitSUCZlJFIhIigkIiVJQCEiIjckJCIrJD53bCRSISIoJCIlU0AhIiI3JCQiK3VkSFBSISIoJCIlXUAhIiI3JCQiKzBELFFSISIoJCIlZ0AhIiI3JCQiKzZrc1FSISIoJCIlcUAhIiI3JCQiKzl2VlJSISIoJCIlIT0jISIiNyQkIitRZTlTUiEiKCQiJSE+IyEiIjckJCIrMDkmMyVSISIoJCIlK0EhIiI3JCQiK1BVYlRSISIoJCIlNUEhIiI3JCQiK2RWRFVSISIoJCIlP0EhIiI3JCQiKyZ5XkglUiEiKCQiJUlBISIiNyQkIitYbGtWUiEiKCQiJVNBISIiNyQkIitjJ1FWJVIhIigkIiVdQSEiIjckJCIrVCJHXSVSISIoJCIlZ0EhIiI3JCQiKz5dclhSISIoJCIlcUEhIiI3JCQiKzYkKlJZUiEiKCQiJSFHIyEiIjckJCIrUTUzWlIhIigkIiUhSCMhIiI3JCQiKz0td1pSISIoJCIlK0IhIiI3JCQiK3RvVltSISIoJCIlNUIhIiI3JCQiK0A1NlxSISIoJCIlP0IhIiI3JCQiKyNvI3lcUiEiKCQiJUlCISIiNyQkIit2PVhdUiEiKCQiJVNCISIiNyQkIis9Jz02JlIhIigkIiVdQiEiIjckJCIqJEh5XlIhIickIiVnQiEiIjckJCIrSFtXX1IhIigkIiVxQiEiIjckJCIrTVY1YFIhIigkIiUhUSMhIiI3JCQiK2o5d2BSISIoJCIlIVIjISIiNyQkIitLaVRhUiEiKCQiJStDISIiNyQkIiptb10mUiEiJyQiJTVDISIiNyQkIitsKD1kJlIhIigkIiU/QyEiIjckJCIraWxPY1IhIigkIiVJQyEiIjckJCIrcD8sZFIhIigkIiVTQyEiIjckJCIrLmBsZFIhIigkIiVdQyEiIjckJCIremlIZVIhIigkIiVnQyEiIjckJCIrO10kKmVSISIoJCIlcUMhIiI3JCQiK0Y6ZGZSISIoJCIlIVsjISIiNyQkIitKZT9nUiEiKCQiJSFcIyEiIjckJCIrVXokMydSISIoJCIlK0QhIiI3JCQiK3Z5WWhSISIoJCIlNUQhIiI3JCQiK1pjNGlSISIoJCIlP0QhIiI3JCQiK3Q3c2lSISIoJCIlSUQhIiI3JCQiK25aTWpSISIoJCIlU0QhIiI3JCQiK1hoJ1InUiEiKCQiJV1EISIiNyQkIitBYWVrUiEiKCQiJWdEISIiNyQkIis2RT9sUiEiKCQiJXFEISIiNyQkIitHeCJlJ1IhIigkIiUhZSMhIiI3JCQiKyd5SWsnUiEiKCQiJSFmIyEiIjckJCIpPS9uUiEiJiQiJStFISIiNyQkIismeV13J1IhIigkIiU1RSEiIjckJCIrX3hEb1IhIigkIiU/RSEiIjckJCIrPEYnKW9SISIoJCIlSUUhIiI3JCQiKyRwbCVwUiEiKCQiJVNFISIiNyQkIiskcG0rKFIhIigkIiVdRSEiIjckJCIrSmRtcVIhIigkIiVnRSEiIjckJCIrPkdFclIhIigkIiVxRSEiIjckJCIrcnomPShSISIoJCIlIW8jISIiNyQkIisqPl5DKFIhIigkIiUhcCMhIiI3JCQiKztEL3RSISIoJCIlK0YhIiI3JCQiK04+anRSISIoJCIlNUYhIiI3JCQiK3AlPlUoUiEiKCQiJT9GISIiNyQkIitHXiFbKFIhIigkIiVJRiEiIjckJCIrRSopUXZSISIoJCIlU0YhIiI3JCQiK3YzKGYoUiEiKCQiJV1GISIiNyQkIisoKTRid1IhIigkIiVnRiEiIjckJCIrcyNIcihSISIoJCIlcUYhIiI3JCQiK1dkcXhSISIoJCIlIXkjISIiNyQkIis5L0d5UiEiKCQiJSF6IyEiIjckJCIrJEhgKXlSISIoJCIlK0chIiI3JCQiKyRSQyV6UiEiKCQiJTVHISIiNyQkIitDUCoqelIhIigkIiU/RyEiIjckJCIrKUhoMClSISIoJCIlSUchIiI3JCQiK0ZyNyIpUiEiKCQiJVNHISIiNyQkIipBInAiKVIhIickIiVdRyEiIjckJCIrKWVgQSlSISIoJCIlZ0chIiI3JCQiK1ZVIkcpUiEiKCQiJXFHISIiNyQkIismPnRMKVIhIigkIiUhKUchIiI3JCQiK2EvJFIpUiEiKCQiJSEqRyEiIjckJCIrS2dbJSlSISIoJCIlK0ghIiI3JCQiK1AqUl0pUiEiKCQiJTVIISIiNyQkIio9I2YmKVIhIickIiU/SCEiIjckJCIrc0Y5JylSISIoJCIlSUghIiI3JCQiK0I8cCcpUiEiKCQiJVNIISIiNyQkIitUIVJzKVIhIigkIiVdSCEiIjckJCIrUVp5KClSISIoJCIlZ0ghIiI3JCQiK0EpRyQpKVIhIigkIiVxSCEiIjckJCIrLzgoKSkpUiEiKCQiJSEpSCEiIjckJCIrJD43JSopUiEiKCQiJSEqSCEiIjckJCIrKVxeKiopUiEiKCQiJStJISIiNyQkIitIIypbISpSISIoJCIlNUkhIiI3JCQiKyZSRDUqUiEiKCQiJT9JISIiNyQkIisxK2MiKlIhIigkIiVJSSEiIjckJCIrcEk0IypSISIoJCIlU0khIiI3JCQiKyZmQ0UqUiEiKCQiJV1JISIiNyQkIisjZmFKKlIhIigkIiVnSSEiIjckJCIrcElvJCpSISIoJCIlcUkhIiI3JCQiK04rQCUqUiEiKCQiJSEzJCEiIjckJCIrKVxOWipSISIoJCIlITQkISIiNyQkIitvJWZfKlIhIigkIiUrSiEiIjckJCIrXz55JipSISIoJCIlNUohIiI3JCQiKidISScqUiEiJyQiJT9KISIiNyQkIisqXEFvKlIhIigkIiVJSiEiIjckJCIreDBNKCpSISIoJCIlU0ohIiI3JCQiKy9zJnkqUiEiKCQiJV1KISIiNyQkIisoUXMkKSpSISIoJCIlZ0ohIiI3JCQiK05oKSkpKlIhIigkIiVxSiEiIjckJCIrYiUpUioqUiEiKCQiJSE9JCEiIjckJCIrYSQ0KioqUiEiKCQiJSE+JCEiIjckJCIrVik9LyslISIoJCIlK0shIiI3JCQiK0ZwIzQrJSEiKCQiJTVLISIiNyQkIis5T1YsUyEiKCQiJT9LISIiNyQkIis4KlE+KyUhIigkIiVJSyEiIjckJCIrSkdXLVMhIigkIiVTSyEiIjckJCIrd2AlSCslISIoJCIlXUshIiI3JCQiK2FsVy5TISIoJCIlZ0shIiI3JCQiK3VqJVIrJSEiKCQiJXFLISIiNyQkIitWW1cvUyEiKCQiJSFHJCEiIjckJCIrbj4lXCslISIoJCIlIUgkISIiNyQkIitieFYwUyEiKCQiJStMISIiNyQkIis4QSRmKyUhIigkIiU1TCEiIjckJCIrXGBVMVMhIigkIiU/TCEiIjckJCIrcHIicCslISIoJCIlSUwhIiI3JCQiKm8ydSslISInJCIlU0whIiI3JCQiKipvKnkrJSEiJyQiJV1MISIiNyQkIisxW1EzUyEiKCQiJWdMISIiNyQkIitMOSgpM1MhIigkIiVxTCEiIjckJCIqeWMkNFMhIickIiUhUSQhIiI3JCQiK14zJSk0UyEiKCQiJSFSJCEiIjckJCIrYk9LNVMhIigkIiUrTSEiIjckJCIrKT4wMywlISIoJCIlNU0hIiI3JCQiKydbJkc2UyEiKCQiJT9NISIiNyQkIitFWHc2UyEiKCQiJUlNISIiNyQkIitDQkM3UyEiKCQiJVNNISIiNyQkIisoKSk9RiwlISIoJCIlXU0hIiI3JCQiKkElPjhTISInJCIlZ00hIiI3JCQiK0okb08sJSEiKCQiJXFNISIiNyQkIitENzk5UyEiKCQiJSFbJCEiIjckJCIrM0hoOVMhIigkIiUhXCQhIiI3JCQiKylRJDM6UyEiKCQiJStOISIiNyQkIitwRWI6UyEiKCQiJTVOISIiNyQkIitkMi07UyEiKCQiJT9OISIiNyQkIiptKFs7UyEiJyQiJUlOISIiNyQkIisjUWBwLCUhIigkIiVTTiEiIjckJCIqJHpUPFMhIickIiVdTiEiIjckJCIrNDgpeSwlISIoJCIlZ04hIiI3JCQiK0ROTT1TISIoJCIlcU4hIiI3JCQiKyVlLyk9UyEiKCQiJSFlJCEiIjckJCIrI1xrIz5TISIoJCIlIWYkISIiNyQkIithS3M+UyEiKCQiJStPISIiNyQkIit3Mz0/UyEiKCQiJTVPISIiNyQkIitqdGo/UyEiKCQiJT9PISIiNyQkIitARjRAUyEiKCQiJUlPISIiNyQkIitjcGFAUyEiKCQiJVNPISIiNyQkIitzKytBUyEiKCQiJV1PISIiNyQkIit3P1hBUyEiKCQiJWdPISIiNyQkIit0SCFILSUhIigkIiVxTyEiIjckJCIrbkZOQlMhIigkIiUhbyQhIiI3JCQiK2w5IVEtJSEiKCQiJSFwJCEiIjckJCIrciFcVS0lISIoJCIlK1AhIiI3JCQiKmYmcENTISInJCIlNVAhIiI3JCQiK0g1OURTISIoJCIlP1AhIiI3JCQiKyJSJmVEUyEiKCQiJUlQISIiNyQkIiskb0dnLSUhIigkIiVTUCEiIjckJCIrMzRaRVMhIigkIiVdUCEiIjckJCIrdD8icC0lISIoJCIlZ1AhIiI3JCQiKyI9X3QtJSEiKCQiJXFQISIiNyQkIitSN3pGUyEiKCQiJSF5JCEiIjckJCIqREgjR1MhIickIiUheiQhIiI3JCQiKkFtJ0dTISInJCIlK1EhIiI3JCQiK2BANUhTISIoJCIlNVEhIiI3JCQiK2JxYEhTISIoJCIlP1EhIiI3JCQiKiQ0KCpIUyEiJyQiJUlRISIiNyQkIisjeS4vLiUhIigkIiVTUSEiIjckJCIrPGMkMy4lISIoJCIlXVEhIiI3JCQiK1JrRUpTISIoJCIlZ1EhIiI3JCQiK2BpcEpTISIoJCIlcVEhIiI3JCQiK2pdN0tTISIoJCIlISlRISIiNyQkIit1R2JLUyEiKCQiJSEqUSEiIjckJCIqcHpILiUhIickIiUrUiEiIjckJCIrO2JTTFMhIigkIiU1UiEiIjckJCIrYy4kUS4lISIoJCIlP1IhIiI3JCQiKzpVRE1TISIoJCIlSVIhIiI3JCQiKyg0eFkuJSEiKCQiJVNSISIiNyQkIisxISo0TlMhIigkIiVdUiEiIjckJCIrWio+Yi4lISIoJCIlZ1IhIiI3JCQiK0MqUmYuJSEiKCQiJXFSISIiNyQkIitVKmVqLiUhIigkIiUhKVIhIiI3JCQiKy9xeE9TISIoJCIlISpSISIiNyQkIis6VD5QUyEiKCQiJStTISIiNyQkIit5LWhQUyEiKCQiJTVTISIiNyQkIisqXEQhUVMhIigkIiU/UyEiIjckJCIrInlSJVFTISIoJCIlSVMhIiI3JCQiK0dKJilRUyEiKCQiJVNTISIiNyQkIitXYkVSUyEiKCQiJV1TISIiNyQkIitNcW5SUyEiKCQiJWdTISIiNyQkIissdzNTUyEiKCQiJXFTISIiNyQkIipEKFxTUyEiJyQiJSEzJSEiIjckJCIrJSlmITQvJSEiKCQiJSE0JSEiIjckJCIrMlFKVFMhIigkIiUrVCEiIjckJCIrQjJzVFMhIigkIiU1VCEiIjckJCIrT243VVMhIigkIiU/VCEiIjckJCIqJj1gVVMhIickIiVJVCEiIjckJCIrb2ckSC8lISIoJCIlU1QhIiI3JCQiKyZSUkwvJSEiKCQiJV1UISIiNyQkIitNPXVWUyEiKCQiJWdUISIiNyQkIisqUVZULyUhIigkIiVxVCEiIjckJCIra1NhV1MhIigkIiUhPSUhIiI3JCQiK2lRJVwvJSEiKCQiJSE+JSEiIjckJCIrKHlVYC8lISIoJCIlK1UhIiI3JCQiK1UzdVhTISIoJCIlNVUhIiI3JCQiK0shUWgvJSEiKCQiJT9VISIiNyQkIipPTWwvJSEiJyQiJUlVISIiNyQkIitIKUhwLyUhIigkIiVTVSEiIjckJCIrVldLWlMhIigkIiVdVSEiIjckJCIrMCM9eC8lISIoJCIlZ1UhIiI3JCQiKjc2IltTISInJCIlcVUhIiI3JCQiKyo9LiZbUyEiKCQiJSFHJSEiIjckJCIrPVcqKVtTISIoJCIlIUglISIiNyQkIis0W0dcUyEiKCQiJStWISIiNyQkIittVm5cUyEiKCQiJTVWISIiNyQkIisjNGorMCUhIigkIiU/ViEiIjckJCIrIio0WF1TISIoJCIlSVYhIiI3JCQiK2whUTMwJSEiKCQiJVNWISIiNyQkIis9VkFeUyEiKCQiJV1WISIiNyQkIithKDQ7MCUhIigkIiVnViEiIjckJCIrd1YqPjAlISIoJCIlcVYhIiI3JCQiKyc9eUIwJSEiKCQiJSFRJSEiIjckJCIrKj1oRjAlISIoJCIlIVIlISIiNyQkIisoUVZKMCUhIigkIiUrVyEiIjckJCIrJXlDTjAlISIoJCIlNVchIiI3JCQiKyRRMFIwJSEiKCQiJT9XISIiNyQkIisnPSZHYVMhIigkIiVJVyEiIjckJCIrKT5rWTAlISIoJCIlU1chIiI3JCQiK0BDL2JTISIoJCIlXVchIiI3JCQiK2UpPmEwJSEiKCQiJWdXISIiNyQkIis4bHpiUyEiKCQiJXFXISIiNyQkIispUXNoMCUhIigkIiUhWyUhIiI3JCQiKydbWmwwJSEiKCQiJSFcJSEiIjckJCIrNj0jcDAlISIoJCIlK1ghIiI3JCQiK21gSGRTISIoJCIlNVghIiI3JCQiK2Aib3cwJSEiKCQiJT9YISIiNyQkIit2LC9lUyEiKCQiJUlYISIiNyQkIitPOVRlUyEiKCQiJVNYISIiNyQkIitRPnllUyEiKCQiJV1YISIiNyQkIislb14iZlMhIigkIiVnWCEiIjckJCIreTFfZlMhIigkIiVxWCEiIjckJCIrQCopKSlmUyEiKCQiJSFlJSEiIjckJCIrPGtEZ1MhIigkIiUhZiUhIiI3JCQiK3BKaWdTISIoJCIlK1khIiI3JCQiK3oiKik0MSUhIigkIiU1WSEiIjckJCIrXldOaFMhIigkIiU/WSEiIjckJCIrKCkqPTwxJSEiKCQiJUlZISIiNyQkIisqeSMzaVMhIigkIiVTWSEiIjckJCIraGVXaVMhIigkIiVdWSEiIjckJCIrMSMzRzElISIoJCIlZ1khIiI3JCQiK0QpcEoxJSEiKCQiJXFZISIiNyQkIitCMmBqUyEiKCQiJSFvJSEiIjckJCIpNCpRMSUhIiYkIiUhcCUhIiI3JCQiK2guRGtTISIoJCIlK1ohIiI3JCQiKzMiNFkxJSEiKCQiJTVaISIiNyQkIitWcidcMSUhIigkIiU/WiEiIjckJCIrcFdLbFMhIigkIiVJWiEiIjckJCIrKjMib2xTISIoJCIlU1ohIiI3JCQiKzBxLm1TISIoJCIlXVohIiI3JCQiKz5BUm1TISIoJCIlZ1ohIiI3JCQiK05udW1TISIoJCIlcVohIiI3JCQiK2IwNW5TISIoJCIlIXklISIiNyQkIisjb2B1MSUhIigkIiUheiUhIiI3JCQiKzxoIXkxJSEiKCQiJStbISIiNyQkIitreTpvUyEiKCQiJTVbISIiNyQkIitEKjMmb1MhIigkIiU/WyEiIjckJCIrLiRmKW9TISIoJCIlSVshIiI3JCQiKyoqKjMjcFMhIigkIiVTWyEiIjckJCIrPCFlJnBTISIoJCIlXVshIiI3JCQiK2VqISpwUyEiKCQiJWdbISIiNyQkIitEU0RxUyEiKCQiJXFbISIiNyQkIitBNWdxUyEiKCQiJSEpWyEiIjckJCIrXHQlNDIlISIoJCIlISpbISIiNyQkIis0SUhyUyEiKCQiJStcISIiNyQkIiswIVE7MiUhIigkIiU1XCEiIjckJCIqTSMpPjIlISInJCIlP1whIiI3JCQiKzlnS3NTISIoJCIlSVwhIiI3JCQiK0shcEUyJSEiKCQiJVNcISIiNyQkIislUjZJMiUhIigkIiVdXCEiIjckJCIrL0pOdFMhIigkIiVnXCEiIjckJCIralRwdFMhIigkIiVxXCEiIjckJCIrdlgudVMhIigkIiUhKVwhIiI3JCQiKk11VjIlISInJCIlISpcISIiNyQkIitpTXJ1UyEiKCQiJStdISIiNyQkIitVPjB2UyEiKCQiJTVdISIiNyQkIiskeSpRdlMhIigkIiU/XSEiIjckJCIrKSlwc3ZTISIoJCIlSV0hIiI3JCQiK2ROMXdTISIoJCIlU10hIiI3JCQiKyVcKlJ3UyEiKCQiJV1dISIiNyQkIissW3R3UyEiKCQiJWddISIiNyQkIit6JXBxMiUhIigkIiVxXSEiIjckJCIrSk5TeFMhIigkIiUhMyYhIiI3JCQiK2ZwdHhTISIoJCIlITQmISIiNyQkIittKHAheVMhIigkIiUrXiEiIjckJCIrXz5TeVMhIigkIiU1XiEiIjckJCIrQE50eVMhIigkIiU/XiEiIjckJCIrdlcxelMhIigkIiVJXiEiIjckJCIrOVtSelMhIigkIiVTXiEiIjckJCIrVlhzelMhIigkIiVdXiEiIjckJCIraU8wITMlISIoJCIlZ14hIiI3JCQiK3VAUSEzJSEiKCQiJXFeISIiNyQkIisiMzUyMyUhIigkIiUhPSYhIiI3JCQiKyVRUDUzJSEiKCQiJSE+JiEiIjckJCIrJzNrODMlISIoJCIlK18hIiI3JCQiKyo9IXAiMyUhIigkIiU1XyEiIjckJCIrJXA6PzMlISIoJCIlP18hIiI3JCQiKzAxTSMzJSEiKCQiJUlfISIiNyQkIitBXG0jMyUhIigkIiVTXyEiIjckJCIrWicpKUgzJSEiKCQiJV1fISIiNyQkIiskeTZMMyUhIigkIiVnXyEiIjckJCIrS1ZqJDMlISIoJCIlcV8hIiI3JCQiKyZIY1IzJSEiKCQiJSFHJiEiIjckJCIrdndGJTMlISIoJCIlIUgmISIiNyQkIit0JSlmJTMlISIoJCIlK2AhIiI3JCQiKnA9XDMlISInJCIlNWAhIiI3JCQiKkxRXzMlISInJCIlP2AhIiI3JCQiKyVSZGIzJSEiKCQiJUlgISIiNyQkIislKWUoZTMlISIoJCIlU2AhIiI3JCQiKyxRPiczJSEiKCQiJV1gISIiNyQkIitbNl4nMyUhIigkIiVnYCEiIjckJCIrRXojbzMlISIoJCIlcWAhIiI3JCQiK1FUOSgzJSEiKCQiJSFRJiEiIjckJCIrJXlmdTMlISIoJCIlIVImISIiNyQkIituW3goMyUhIigkIiUrYSEiIjckJCIrKlEqMykzJSEiKCQiJTVhISIiNyQkIiteTFMpMyUhIigkIiU/YSEiIjckJCIrYm5yKTMlISIoJCIlSWEhIiI3JCQiKy4nSCEqMyUhIigkIiVTYSEiIjckJCIrJyo9TSozJSEiKCQiJV1hISIiNyQkIitRT2wqMyUhIigkIiVnYSEiIjckJCIrR1snKiozJSEiKCQiJXFhISIiNyQkIitwYUYhNCUhIigkIiUhWyYhIiI3JCQiK2piZSE0JSEiKCQiJSFcJiEiIjckJCIrNl4qMzQlISIoJCIlK2IhIiI3JCQiKzpUPyI0JSEiKCQiJTViISIiNyQkIit4RF4iNCUhIigkIiU/YiEiIjckJCIrKlw/PTQlISIoJCIlSWIhIiI3JCQiKyIpeTcjNCUhIigkIiVTYiEiIjckJCIrRVpWIzQlISIoJCIlXWIhIiI3JCQiK081dSM0JSEiKCQiJWdiISIiNyQkIis3by8kNCUhIigkIiVxYiEiIjckJCIrYz9OJDQlISIoJCIlIWUmISIiNyQkIitwbmwkNCUhIigkIiUhZiYhIiI3JCQiK2A0J1I0JSEiKCQiJStjISIiNyQkIipoa1U0JSEiJyQiJTVjISIiNyQkIitUeGMlNCUhIigkIiU/YyEiIjckJCIrWy4oWzQlISIoJCIlSWMhIiI3JCQiK0tDPCY0JSEiKCQiJVNjISIiNyQkIismKlJaJjQlISIoJCIlXWMhIiI3JCQiKi92ZDQlISInJCIlZ2MhIiI3JCQiK21iMic0JSEiKCQiJXFjISIiNyQkIit3YlAnNCUhIigkIiUhbyYhIiI3JCQiK3Ndbic0JSEiKCQiJSFwJiEiIjckJCIrYVMocDQlISIoJCIlK2QhIiI3JCQiK0RERig0JSEiKCQiJTVkISIiNyQkIisnW3F2NCUhIigkIiU/ZCEiIjckJCIrUXoneTQlISIoJCIlSWQhIiI3JCQiKyQpWzspNCUhIigkIiVTZCEiIjckJCIrQjhZKTQlISIoJCIlXWQhIiI3JCQiK2Zzdik0JSEiKCQiJWdkISIiNyQkIiskcF8hKjQlISIoJCIlcWQhIiI3JCQiK0V3TSo0JSEiKCQiJSF5JiEiIjckJCIrZj9rKjQlISIoJCIlIXomISIiNyQkIislKmYkKio0JSEiKCQiJStlISIiNyQkIitMJUgtNSUhIigkIiU1ZSEiIjckJCIrd0JfK1QhIigkIiU/ZSEiIjckJCIrRlsiMzUlISIoJCIlSWUhIiI3JCQiKyV5MTY1JSEiKCQiJVNlISIiNyQkIitfIylSLFQhIigkIiVdZSEiIjckJCIqQipvLFQhIickIiVnZSEiIjckJCIqc3o+NSUhIickIiVxZSEiIjckJCIrQyhwQTUlISIoJCIlISllISIiNyQkIitVI2ZENSUhIigkIiUhKmUhIiI3JCQiK3gjW0c1JSEiKCQiJStmISIiNyQkIiokbzguVCEiJyQiJTVmISIiNyQkIisuXFUuVCEiKCQiJT9mISIiNyQkIismXDdQNSUhIigkIiVJZiEiIjckJCIqaCoqUjUlISInJCIlU2YhIiI3JCQiK1tpRy9UISIoJCIlXWYhIiI3JCQiKzZDZC9UISIoJCIlZ2YhIiI3JCQiKSJlWzUlISImJCIlcWYhIiI3JCQiKztMOTBUISIoJCIlISlmISIiNyQkIitoIUdhNSUhIigkIiUhKmYhIiI3JCQiK1BCcjBUISIoJCIlK2chIiI3JCQiK1doKmY1JSEiKCQiJTVnISIiNyQkIiskW3ppNSUhIigkIiU/ZyEiIjckJCIrZEJjMVQhIigkIiVJZyEiIjckJCIrbVolbzUlISIoJCIlU2chIiI3JCQiKzduNzJUISIoJCIlXWchIiI3JCQiKyc+M3U1JSEiKCQiJWdnISIiNyQkIis+IypvMlQhIigkIiVxZyEiIjckJCIrJHlwejUlISIoJCIlITMnISIiNyQkIisqKSlcIzNUISIoJCIlITQnISIiNyQkIitRJkgmM1QhIigkIiUraCEiIjckJCIrSygzKTNUISIoJCIlNWghIiI3JCQiK3J1MzRUISIoJCIlP2ghIiI3JCQiK2VkTzRUISIoJCIlSWghIiI3JCQiKyRmVic0VCEiKCQiJVNoISIiNyQkIit4NCMqNFQhIigkIiVdaCEiIjckJCIrN3o+NVQhIigkIiVnaCEiIjckJCIrKlJ1LzYlISIoJCIlcWghIiI3JCQiKlddMjYlISInJCIlIT0nISIiNyQkIitOZy02VCEiKCQiJSE+JyEiIjckJCIrJz0sODYlISIoJCIlK2khIiI3JCQiKyQqZWQ2VCEiKCQiJTVpISIiNyQkIitmLCY9NiUhIigkIiU/aSEiIjckJCIrJSlSNzdUISIoJCIlSWkhIiI3JCQiKlAoUjdUISInJCIlU2khIiI3JCQiKz0ubjdUISIoJCIlXWkhIiI3JCQiK0dHJUg2JSEiKCQiJWdpISIiNyQkIisuXEA4VCEiKCQiJXFpISIiNyQkIitWbFs4VCEiKCQiJSFHJyEiIjckJCIqdmRQNiUhIickIiUhSCchIiI3JCQiK0MmR1M2JSEiKCQiJStqISIiNyQkIituKSlIOVQhIigkIiU1aiEiIjckJCIqeW9YNiUhIickIiU/aiEiIjckJCIrayNRWzYlISIoJCIlSWohIiI3JCQiK0B0NTpUISIoJCIlU2ohIiI3JCQiK15mUDpUISIoJCIlXWohIiI3JCQiK2JUazpUISIoJCIlZ2ohIiI3JCQiK08+ImY2JSEiKCQiJXFqISIiNyQkIiskSHpoNiUhIigkIiUhUSchIiI3JCQiK0dpVztUISIoJCIlIVInISIiNyQkIitVRnI7VCEiKCQiJStrISIiNyQkIitQKXlwNiUhIigkIiU1ayEiIjckJCIrOFhDPFQhIigkIiU/ayEiIjckJCIrcig0djYlISIoJCIlSWshIiI3JCQiKzhZeDxUISIoJCIlU2shIiI3JCQiK1IhUiE9VCEiKCQiJV1rISIiNyQkIiteSUk9VCEiKCQiJWdrISIiNyQkIipsbSY9VCEiJyQiJXFrISIiNyQkIitQKUgpPVQhIigkIiUhWychIiI3JCQiKzhFND5UISIoJCIlIVwnISIiNyQkIit6XE4+VCEiKCQiJStsISIiNyQkIitPcGg+VCEiKCQiJTVsISIiNyQkIismW3kpPlQhIigkIiU/bCEiIjckJCIrRydSLDclISIoJCIlSWwhIiI3JCQiK2suUz9UISIoJCIlU2whIiI3JCQiKydwZzE3JSEiKCQiJV1sISIiNyQkIitEMSM0NyUhIigkIiVnbCEiIjckJCIqOiE9QFQhIickIiVxbCEiIjckJCIrdiNSOTclISIoJCIlIWUnISIiNyQkIispKnpwQFQhIigkIiUhZichIiI3JCQiK0JqJj43JSEiKCQiJSttISIiNyQkIitbVUBBVCEiKCQiJTVtISIiNyQkIit4PFpBVCEiKCQiJT9tISIiNyQkIiszKkdGNyUhIigkIiVJbSEiIjckJCIrWGMpSDclISIoJCIlU20hIiI3JCQiKygpPkNCVCEiKCQiJV1tISIiNyQkIitOelxCVCEiKCQiJWdtISIiNyQkIisjXGBQNyUhIigkIiVxbSEiIjckJCIrYyczUzclISIoJCIlIW8nISIiNyQkIitKTUVDVCEiKCQiJSFwJyEiIjckJCIrOnleQ1QhIigkIiUrbiEiIjckJCIrNz14Q1QhIigkIiU1biEiIjckJCIrQGEtRFQhIigkIiU/biEiIjckJCIrVid5XzclISIoJCIlSW4hIiI3JCQiKltKYjclISInJCIlU24hIiI3JCQiK0tSeURUISIoJCIlXW4hIiI3JCQiKE9nNyUhIiUkIiVnbiEiIjckJCIrJ28oR0VUISIoJCIlcW4hIiI3JCQiKioqUWw3JSEiJyQiJSF5JyEiIjckJCIrOCoqeUVUISIoJCIlIXonISIiNyQkIitkLy9GVCEiKCQiJStvISIiNyQkIitAMUhGVCEiKCQiJTVvISIiNyQkIiszL2FGVCEiKCQiJT9vISIiNyQkIis8KSp5RlQhIigkIiVJbyEiIjckJCIqJilRIUdUISInJCIlU28hIiI3JCQiKzR2R0dUISIoJCIlXW8hIiI3JCQiKyR6TiZHVCEiKCQiJWdvISIiNyQkIisuUHlHVCEiKCQiJXFvISIiNyQkIitUNy5IVCEiKCQiJSEpbyEiIjckJCIrMyV5I0hUISIoJCIlISpvISIiNyQkIisvX19IVCEiKCQiJStwISIiNyQkIipqcihIVCEiJyQiJTVwISIiNyQkIispbzwrOCUhIigkIiU/cCEiIjckJCIreExFSVQhIigkIiVJcCEiIjckJCIpKDMwOCUhIiYkIiVTcCEiIjckJCIrY092SVQhIigkIiVdcCEiIjckJCIrWiMpKjQ4JSEiKCQiJWdwISIiNyQkIit1Q0NKVCEiKCQiJXFwISIiNyQkIitQaltKVCEiKCQiJSEpcCEiIjckJCIrUSlIPDglISIoJCIlISpwISIiNyQkIit3SCg+OCUhIigkIiUrcSEiIjckJCIrYWRAS1QhIigkIiU1cSEiIjckJCIrcyJlQzglISIoJCIlP3EhIiI3JCQiK0otcUtUISIoJCIlSXEhIiI3JCQiK0o+JUg4JSEiKCQiJVNxISIiNyQkIit1Sz1MVCEiKCQiJV1xISIiNyQkIipFQ004JSEiJyQiJWdxISIiNyQkIisiKlttTFQhIigkIiVxcSEiIjckJCIrbV4hUjglISIoJCIlITMoISIiNyQkIispM1hUOCUhIigkIiUhNCghIiI3JCQiK2NZUU1UISIoJCIlK3IhIiI3JCQiK3NRaU1UISIoJCIlNXIhIiI3JCQiK09GJ1s4JSEiKCQiJT9yISIiNyQkIitcNzVOVCEiKCQiJUlyISIiNyQkIis4JVJgOCUhIigkIiVTciEiIjckJCIrRnNkTlQhIigkIiVdciEiIjckJCIrJHA5ZTglISIoJCIlZ3IhIiI3JCQiKzc9ME9UISIoJCIlcXIhIiI3JCQiKyRlKUdPVCEiKCQiJSE9KCEiIjckJCIrNF1fT1QhIigkIiUhPighIiI3JCQiKjRobjglISInJCIlK3MhIiI3JCQiK0ZvKnA4JSEiKCQiJTVzISIiNyQkIipBS3M4JSEiJyQiJT9zISIiNyQkIipGbnU4JSEiJyQiJUlzISIiNyQkIit6PnFQVCEiKCQiJVNzISIiNyQkIitZaiR6OCUhIigkIiVdcyEiIjckJCIrdC48UVQhIigkIiVncyEiIjckJCIqMS8lUVQhIickIiVxcyEiIjckJCIrNHVqUVQhIigkIiUhRyghIiI3JCQiKz4vKClRVCEiKCQiJSFIKCEiIjckJCIrJDQuIlJUISIoJCIlK3QhIiI3JCQiKlZOJFJUISInJCIlNXQhIiI3JCQiK0p1Y1JUISIoJCIlP3QhIiI3JCQiKyg0KnpSVCEiKCQiJUl0ISIiNyQkIipWSSs5JSEiJyQiJVN0ISIiNyQkIitHOUVTVCEiKCQiJV10ISIiNyQkIislNCNcU1QhIigkIiVndCEiIjckJCIrSENzU1QhIigkIiVxdCEiIjckJCIrS0MmNDklISIoJCIlIVEoISIiNyQkIisvQD1UVCEiKCQiJSFSKCEiIjckJCIrWjlUVFQhIigkIiUrdSEiIjckJCIraC9rVFQhIigkIiU1dSEiIjckJCIrWiJwPTklISIoJCIlP3UhIiI3JCQiKzB2NFVUISIoJCIlSXUhIiI3JCQiK1BiS1VUISIoJCIlU3UhIiI3JCQiK1VLYlVUISIoJCIlXXUhIiI3JCQiK0IxeVVUISIoJCIlZ3UhIiI3JCQiK3p3K1ZUISIoJCIlcXUhIiI3JCQiKzZXQlZUISIoJCIlIVsoISIiNyQkIis+M1lWVCEiKCQiJSFcKCEiIjckJCIrMXBvVlQhIigkIiUrdiEiIjckJCIrckUiUjklISIoJCIlNXYhIiI3JCQiKzkiUVQ5JSEiKCQiJT92ISIiNyQkIitRS09XVCEiKCQiJUl2ISIiNyQkIitVISllV1QhIigkIiVTdiEiIjckJCIrRkQiWzklISIoJCIlXXYhIiI3JCQiKyVwT105JSEiKCQiJWd2ISIiNyQkIitXMEVYVCEiKCQiJXF2ISIiNyQkIit3U1tYVCEiKCQiJSFlKCEiIjckJCIrJEgyZDklISIoJCIlIWYoISIiNyQkIislPklmOSUhIigkIiUrdyEiIjckJCIrInlfaDklISIoJCIlNXchIiI3JCQiK2BdUFlUISIoJCIlP3chIiI3JCQiKzdxZllUISIoJCIlSXchIiI3JCQiK2YnPW85JSEiKCQiJVN3ISIiNyQkIislKipScTklISIoJCIlXXchIiI3JCQiKzw1RVpUISIoJCIlZ3chIiI3JCQiK0g8W1pUISIoJCIlcXchIiI3JCQiK0tAcVpUISIoJCIlIW8oISIiNyQkIitEQSN6OSUhIigkIiUhcCghIiI3JCQiKixVIltUISInJCIlK3ghIiI3JCQiKyhbaCRbVCEiKCQiJTV4ISIiNyQkIitjMWVbVCEiKCQiJT94ISIiNyQkIis+Jip6W1QhIigkIiVJeCEiIjckJCIrdyE9IVxUISIoJCIlU3ghIiI3JCQiK0ZqQlxUISIoJCIlXXghIiI3JCQiK3VVWFxUISIoJCIlZ3ghIiI3JCQiKzs+blxUISIoJCIlcXghIiI3JCQiK2IjKikpXFQhIigkIiUheSghIiI3JCQiKyNIMSw6JSEiKCQiJSF6KCEiIjckJCIrRUlLXVQhIigkIiUreSEiIjckJCIrZiVSMDolISIoJCIlNXkhIiI3JCQiKyJmYjI6JSEiKCQiJT95ISIiNyQkIitBOSg0OiUhIigkIiVJeSEiIjckJCIrYXA9XlQhIigkIiVTeSEiIjckJCIrKD0tOTolISIoJCIlXXkhIiI3JCQiK0FyaF5UISIoJCIlZ3khIiI3JCQiK2Y8JD06JSEiKCQiJXF5ISIiNyQkIisqNFk/OiUhIigkIiUhKXkhIiI3JCQiK1YsRV9UISIoJCIlISp5ISIiNyQkIioqUVpfVCEiJyQiJSt6ISIiNyQkIitVdG9fVCEiKCQiJTV6ISIiNyQkIikwIUg6JSEiJiQiJT96ISIiNyQkIitrTDZgVCEiKCQiJUl6ISIiNyQkIitNZktgVCEiKCQiJVN6ISIiNyQkIis2I1FOOiUhIigkIiVdeiEiIjckJCIrKD5dUDolISIoJCIlZ3ohIiI3JCQiKio9J1I6JSEiJyQiJXF6ISIiNyQkIiskSHRUOiUhIigkIiUhKXohIiI3JCQiKzBXUWFUISIoJCIlISp6ISIiNyQkIitHX2ZhVCEiKCQiJSshKSEiIjckJCIraGQhWzolISIoJCIlNSEpISIiNyQkIiswZyxiVCEiKCQiJT8hKSEiIjckJCIraWZBYlQhIigkIiVJISkhIiI3JCQiK0pjVmJUISIoJCIlUyEpISIiNyQkIis4XWtiVCEiKCQiJV0hKSEiIjckJCIrNFQmZTolISIoJCIlZyEpISIiNyQkIis+SDFjVCEiKCQiJXEhKSEiIjckJCIrVzlGY1QhIigkIiUhMykhIiI3JCQiKyZvems6JSEiKCQiJSE0KSEiIjckJCIrVHdvY1QhIigkIiUrIikhIiI3JCQiKzpgKm86JSEiKCQiJTUiKSEiIjckJCIrMEY1ZFQhIigkIiU/IikhIiI3JCQiKzgpNHQ6JSEiKCQiJUkiKSEiIjckJCIrUm1eZFQhIigkIiVTIikhIiI3JCQiKyY9Qng6JSEiKCQiJV0iKSEiIjckJCIrXCVIejolISIoJCIlZyIpISIiNyQkIitNYThlVCEiKCQiJXEiKSEiIjckJCIrUjZNZVQhIigkIiUhPSkhIiI3JCQiK21sYWVUISIoJCIlIT4pISIiNyQkIis5PHZlVCEiKCQiJSsjKSEiIjckJCIrJWVjKmVUISIoJCIlNSMpISIiNyQkIit4NjtmVCEiKCQiJT8jKSEiIjckJCIrJFxsJGZUISIoJCIlSSMpISIiNyQkIitMJnAmZlQhIigkIiVTIykhIiI3JCQiKylIdChmVCEiKCQiJV0jKSEiIjckJCIrKHl3KmZUISIoJCIlZyMpISIiNyQkIistKz1nVCEiKCQiJXEjKSEiIjckJCIrV0hRZ1QhIigkIiUhRykhIiI3JCQiKzZjZWdUISIoJCIlIUgpISIiNyQkIisxISl5Z1QhIigkIiUrJCkhIiI3JCQiK0csKjQ7JSEiKCQiJTUkKSEiIjckJCIrej4+aFQhIigkIiU/JCkhIiI3JCQiK2VOUmhUISIoJCIlSSQpISIiNyQkIituW2ZoVCEiKCQiJVMkKSEiIjckJCIrMGZ6aFQhIigkIiVdJCkhIiI3JCQiK3VtKj47JSEiKCQiJWckKSEiIjckJCIrdHI+aVQhIigkIiVxJCkhIiI3JCQiKy91UmlUISIoJCIlIVEpISIiNyQkIittdGZpVCEiKCQiJSFSKSEiIjckJCIraHF6aVQhIigkIiUrJSkhIiI3JCQiKypbJypIOyUhIigkIiU1JSkhIiI3JCQiK15jPmpUISIoJCIlPyUpISIiNyQkIitZWFJqVCEiKCQiJUklKSEiIjckJCIrdkpmalQhIigkIiVTJSkhIiI3JCQiKmEiempUISInJCIlXSUpISIiNyQkIiprKilSOyUhIickIiVnJSkhIiI3JCQiK3d1PWtUISIoJCIlcSUpISIiNyQkIitbXVFrVCEiKCQiJSFbKSEiIjckJCIrZUJla1QhIigkIiUhXCkhIiI3JCQiKy8lelo7JSEiKCQiJSsmKSEiIjckJCIrKj13XDslISIoJCIlNSYpISIiNyQkIis3RjxsVCEiKCQiJT8mKSEiIjckJCIrdipvYDslISIoJCIlSSYpISIiNyQkIit3XGNsVCEiKCQiJVMmKSEiIjckJCIrPTJ3bFQhIigkIiVdJikhIiI3JCQiKWkmZjslISImJCIlZyYpISIiNyQkIitCOTptVCEiKCQiJXEmKSEiIjckJCIrKFFZajslISIoJCIlIWUpISIiNyQkIiskNFRsOyUhIigkIiUhZikhIiI3JCQiK1VidG1UISIoJCIlKycpISIiNyQkIitMKEhwOyUhIigkIiU1JykhIiI3JCQiK29PN25UISIoJCIlPycpISIiNyQkIitadEpuVCEiKCQiJUknKSEiIjckJCIqeDV2OyUhIickIiVTJykhIiI3JCQiK1BScW5UISIoJCIlXScpISIiNyQkIiombyp5OyUhIickIiVnJykhIiI3JCQiKzQmKjNvVCEiKCQiJXEnKSEiIjckJCIrOT5Hb1QhIigkIiUhbykhIiI3JCQiK2xTWm9UISIoJCIlIXApISIiNyQkIitrZm1vVCEiKCQiJSsoKSEiIjckJCIqaGQpb1QhIickIiU1KCkhIiI3JCQiKzAhXCFwVCEiKCQiJT8oKSEiIjckJCIrWixDcFQhIigkIiVJKCkhIiI3JCQiK1I1VnBUISIoJCIlUygpISIiNyQkIisib0AncFQhIigkIiVdKCkhIiI3JCQiK3M/IilwVCEiKCQiJWcoKSEiIjckJCIrOEErcVQhIigkIiVxKCkhIiI3JCQiKzFAPnFUISIoJCIlIXkpISIiNyQkIip2IlFxVCEiJyQiJSF6KSEiIjckJCIrWDZkcVQhIigkIiUrKSkhIiI3JCQiKyRIZzI8JSEiKCQiJTUpKSEiIjckJCIrJD5cNDwlISIoJCIlPykpISIiNyQkIitZeThyVCEiKCQiJUkpKSEiIjckJCIrYGlLclQhIigkIiVTKSkhIiI3JCQiKzlXXnJUISIoJCIlXSkpISIiNyQkIipMLTw8JSEiJyQiJWcpKSEiIjckJCInKj08JSEiJCQiJXEpKSEiIjckJCIrRHUyc1QhIigkIiUhKSkpISIiNyQkIisyWUVzVCEiKCQiJSEqKSkhIiI3JCQiK1c6WHNUISIoJCIlKyopISIiNyQkIitRI1FFPCUhIigkIiU1KikhIiI3JCQiKypvQ0c8JSEiKCQiJT8qKSEiIjckJCIrKSozLHRUISIoJCIlSSopISIiNyQkIitsbz50VCEiKCQiJVMqKSEiIjckJCIqZiNRdFQhIickIiVdKikhIiI3JCQiK3Uhb048JSEiKCQiJWcqKSEiIjckJCIrPEx2dFQhIigkIiVxKikhIiI3JCQiKz4kUVI8JSEiKCQiJSEpKikhIiI3JCQiKyMzQlQ8JSEiKCQiJSEqKikhIiI3JCQiKzB3SXVUISIoJCIlKyEqISIiNyQkIioqPVx1VCEiJyQiJTUhKiEiIjckJCIrTmZudVQhIigkIiU/ISohIiI3JCQiK1YoZls8JSEiKCQiJUkhKiEiIjckJCIrN0wvdlQhIigkIiVTISohIiI3JCQiK1dtQXZUISIoJCIlXSEqISIiNyQkIip1NGE8JSEiJyQiJWchKiEiIjckJCIrKWYjZnZUISIoJCIlcSEqISIiNyQkIitAX3h2VCEiKCQiJSEzKiEiIjckJCIrM3cmZjwlISIoJCIlITQqISIiNyQkIitmKFJoPCUhIigkIiUrIiohIiI3JCQiK3c7S3dUISIoJCIlNSIqISIiNyQkIitlTF13VCEiKCQiJT8iKiEiIjckJCIrMVtvd1QhIigkIiVJIiohIiI3JCQiKi1tbzwlISInJCIlUyIqISIiNyQkIisscS94VCEiKCQiJV0iKiEiIjckJCIqdkZzPCUhIickIiVnIiohIiI3JCQiK2wjM3U8JSEiKCQiJXEiKiEiIjckJCIrXCYpZXhUISIoJCIlIT0qISIiNyQkIissJ294PCUhIigkIiUhPiohIiI3JCQiK0ElW3o8JSEiKCQiJSsjKiEiIjckJCIrNyFHInlUISIoJCIlNSMqISIiNyQkIitydEl5VCEiKCQiJT8jKiEiIjckJCIrLGxbeVQhIigkIiVJIyohIiI3JCQiKWFteVQhIiYkIiVTIyohIiI3JCQiK3JTJSl5VCEiKCQiJV0jKiEiIjckJCIrN0QtelQhIigkIiVnIyohIiI3JCQiK0UyP3pUISIoJCIlcSMqISIiNyQkIipyeSR6VCEiJyQiJSFHKiEiIjckJCIrb2tielQhIigkIiUhSCohIiI3JCQiKykqUnR6VCEiKCQiJSskKiEiIjckJCIrLDgiKnpUISIoJCIlNSQqISIiNyQkIit4JCkzIT0lISIoJCIlPyQqISIiNyQkIitGX0UhPSUhIigkIiVJJCohIiI3JCQiK189VyE9JSEiKCQiJVMkKiEiIjckJCIrXiM9MT0lISIoJCIlXSQqISIiNyQkIitEV3ohPSUhIigkIiVnJCohIiI3JCQiK3UuKDQ9JSEiKCQiJXEkKiEiIjckJCIrKjRZNj0lISIoJCIlIVEqISIiNyQkIik7SyI9JSEiJiQiJSFSKiEiIjckJCIreW9cIj0lISIoJCIlKyUqISIiNyQkIitLPm4iPSUhIigkIiU1JSohIiI3JCQiK2tuJT09JSEiKCQiJT8lKiEiIjckJCIrdDgtIz0lISIoJCIlSSUqISIiNyQkIip3Jj4jPSUhIickIiVTJSohIiI3JCQiK0UqcEI9JSEiKCQiJV0lKiEiIjckJCIqKFFhIz0lISInJCIlZyUqISIiNyQkIiskZjxGPSUhIigkIiVxJSohIiI3JCQiKyc0IipHPSUhIigkIiUhWyohIiI3JCQiK3pWMSQ9JSEiKCQiJSFcKiEiIjckJCIrVXVCJD0lISIoJCIlKyYqISIiNyQkIismRzVNPSUhIigkIiU1JiohIiI3JCQiKzRIZSQ9JSEiKCQiJT8mKiEiIjckJCIrOWB2JD0lISIoJCIlSSYqISIiNyQkIissdiNSPSUhIigkIiVTJiohIiI3JCQiKloqNCU9JSEiJyQiJV0mKiEiIjckJCIrQTdGJT0lISIoJCIlZyYqISIiNyQkIitjRlclPSUhIigkIiVxJiohIiI3JCQiK3RTaCU9JSEiKCQiJSFlKiEiIjckJCIrdF55JT0lISIoJCIlIWYqISIiNyQkIitkZyZcPSUhIigkIiUrJyohIiI3JCQiK0VuNyY9JSEiKCQiJTUnKiEiIjckJCIreXJIJj0lISIoJCIlPycqISIiNyQkIis7dVkmPSUhIigkIiVJJyohIiI3JCQiK1F1aiY9JSEiKCQiJVMnKiEiIjckJCIrWnMhZT0lISIoJCIlXScqISIiNyQkIitUbyhmPSUhIigkIiVnJyohIiI3JCQiK0BpOSc9JSEiKCQiJXEnKiEiIjckJCIrKFE6aj0lISIoJCIlIW8qISIiNyQkIitUVlsnPSUhIigkIiUhcCohIiI3JCQiKyMzYG09JSEiKCQiJSsoKiEiIjckJCIqaEBvPSUhIickIiU1KCohIiI3JCQiK0UqKilwPSUhIigkIiU/KCohIiI3JCQiK0ohZXI9JSEiKCQiJUkoKiEiIjckJCIrQ2ZLKD0lISIoJCIlUygqISIiNyQkIisxT1woPSUhIigkIiVdKCohIiI3JCQiK3g1bSg9JSEiKCQiJWcoKiEiIjckJCIrUSRHeT0lISIoJCIlcSgqISIiNyQkIisqUSYqej0lISIoJCIlIXkqISIiNyQkIipCaSIpPSUhIickIiUheiohIiI3JCQiK2kpRyQpPSUhIigkIiUrKSohIiI3JCQiKyVHJlwpPSUhIigkIiU1KSohIiI3JCQiKylcaCcpPSUhIigkIiU/KSohIiI3JCQiKy52IykpPSUhIigkIiVJKSohIiI3JCQiKyxMKiopPSUhIigkIiVTKSohIiI3JCQiKiopZSIqPSUhIickIiVdKSohIiI3JCQiK3NVSyo9JSEiKCQiJWcpKiEiIjckJCIrWiUqWyo9JSEiKCQiJXEpKiEiIjckJCIrO1dsKj0lISIoJCIlISkpKiEiIjckJCIreCI+KSo9JSEiKCQiJSEqKSohIiI3JCQiK0xQKSoqPSUhIigkIiUrKiohIiI3JCQiKyQzWyw+JSEiKCQiJTUqKiEiIjckJCIrRkFKIT4lISIoJCIlPyoqISIiNyQkIittaFohPiUhIigkIiVJKiohIiI3JCQiKywqUjE+JSEiKCQiJVMqKiEiIjckJCIrSk0hMz4lISIoJCIlXSoqISIiNyQkIitjbic0PiUhIigkIiVnKiohIiI3JCQiK3kpSDY+JSEiKCQiJXEqKiEiIjckJCIrJ3ojSCI+JSEiKCQiJSEpKiohIiI3JCQiKzZiWCI+JSEiKCQiJSEqKiohIiI3JCQiK0IhPTs+JSEiKCQiJisrIiEiIjckJCIrSy55Ij4lISIoJCImNSsiISIiNyQkIitSQyU+PiUhIigkIiY/KyIhIiI3JCQiK1dWNSM+JSEiKCQiJkkrIiEiIjckJCIrWmdFIz4lISIoJCImUysiISIiNyQkIitcdlUjPiUhIigkIiZdKyIhIiI3JCQiK1wpKWUjPiUhIigkIiZnKyIhIiI3JCQiK1wqXEY+JSEiKCQiJnErIiEiIjckJCIrXDMiSD4lISIoJCImITM1ISIiNyQkIitbOjIkPiUhIigkIiYhNDUhIiI3JCQiK1o/QiQ+JSEiKCQiJissIiEiIjckJCIrWkJSJD4lISIoJCImNSwiISIiNyQkIitbQ2IkPiUhIigkIiY/LCIhIiI3JCQiK1xCciQ+JSEiKCQiJkksIiEiIjckJCIrXz8oUT4lISIoJCImUywiISIiNyQkIitkOi4lPiUhIigkIiZdLCIhIiI3JCQiK2szPiU+JSEiKCQiJmcsIiEiIjckJCIrcypcVj4lISIoJCImcSwiISIiNyQkIislKSkzWD4lISIoJCImIT01ISIiNyQkIispZm5ZPiUhIigkIiYhPjUhIiI3JCQiKzpoI1s+JSEiKCQiJistIiEiIjckJCIrT1cpXD4lISIoJCImNS0iISIiNyQkIitoRDkmPiUhIigkIiY/LSIhIiI3JCQiKypbK2A+JSEiKCQiJkktIiEiIjckJCIrQSNlYT4lISIoJCImUy0iISIiNyQkIitmZGgmPiUhIigkIiZdLSIhIiI3JCQiKy1KeCY+JSEiKCQiJmctIiEiIjckJCIrXC0kZj4lISIoJCImcS0iISIiNyQkIistczMnPiUhIigkIiYhRzUhIiI3JCQiK2hSQyc+JSEiKCQiJiFINSEiIjckJCIrRTBTJz4lISIoJCImKy4iISIiNyQkIisoKm9iJz4lISIoJCImNS4iISIiNyQkIit2SXInPiUhIigkIiY/LiIhIiI3JCQiK2YhcG8+JSEiKCQiJkkuIiEiIjckJCIrXlstKD4lISIoJCImUy4iISIiNyQkIipYIT0oPiUhIickIiZdLiIhIiI3JCQiK2VlTCg+JSEiKCQiJmcuIiEiIjckJCIrdDVcKD4lISIoJCImcS4iISIiNyQkIisnNFl3PiUhIigkIiYhUTUhIiI3JCQiK0c0IXk+JSEiKCQiJiFSNSEiIjckJCIrcGImej4lISIoJCImKy8iISIiNyQkIis+KzYpPiUhIigkIiY1LyIhIiI3JCQiK3pVRSk+JSEiKCQiJj8vIiEiIjckJCIrWyQ9JSk+JSEiKCQiJkkvIiEiIjckJCIrR0FkKT4lISIoJCImUy8iISIiNyQkIis8ZnMpPiUhIigkIiZdLyIhIiI3JCQiKzwleikpPiUhIigkIiZnLyIhIiI3JCQiK0dGLio+JSEiKCQiJnEvIiEiIjckJCIqJmU9Kj4lISInJCImIVs1ISIiNyQkIisleVEkKj4lISIoJCImIVw1ISIiNyQkIitIOlwqPiUhIigkIiYrMCIhIiI3JCQiKyczVycqPiUhIigkIiY1MCIhIiI3JCQiK2Jreio+JSEiKCQiJj8wIiEiIjckJCIrUCdbKio+JSEiKCQiJkkwIiEiIjckJCIrSjE1K1UhIigkIiZTMCIhIiI3JCQiK1FDRCtVISIoJCImXTAiISIiNyQkIitmU1MrVSEiKCQiJmcwIiEiIjckJCIrJFxiMD8lISIoJCImcTAiISIiNyQkIitUbnErVSEiKCQiJiFlNSEiIjckJCIrLnkmMz8lISIoJCImIWY1ISIiNyQkIit6JzM1PyUhIigkIiYrMSIhIiI3JCQiKlBmNj8lISInJCImNTEiISIiNyQkIit3KTQ4PyUhIigkIiY/MSIhIiI3JCQiKyg+Zzk/JSEiKCQiJkkxIiEiIjckJCIrTC5oLFUhIigkIiZTMSIhIiI3JCQiKyZHZzw/JSEiKCQiJl0xIiEiIjckJCIrYCsiPj8lISIoJCImZzEiISIiNyQkIitQJ2Y/PyUhIigkIiZxMSIhIiI3JCQiK1AhNEE/JSEiKCQiJiFvNSEiIjckJCIrYSNlQj8lISIoJCImIXA1ISIiNyQkIispRzJEPyUhIigkIiYrMiIhIiI3JCQiK1JobC1VISIoJCImNTIiISIiNyQkIiszWyFHPyUhIigkIiY/MiIhIiI3JCQiKyVIYEg/JSEiKCQiJkkyIiEiIjckJCIrKmYsSj8lISIoJCImUzIiISIiNyQkIitAKFxLPyUhIigkIiZdMiIhIiI3JCQiK2l3Ui5VISIoJCImZzIiISIiNyQkIitBYWEuVSEiKCQiJnEyIiEiIjckJCIoJHAuVSEiJSQiJiF5NSEiIjckJCIrKVJTUT8lISIoJCImIXo1ISIiNyQkIis6dylSPyUhIigkIiYrMyIhIiI3JCQiK19ZOC9VISIoJCImNTMiISIiNyQkIis0OkcvVSEiKCQiJj8zIiEiIjckJCIrKD1HVz8lISIoJCImSTMiISIiNyQkIislb3VYPyUhIigkIiZTMyIhIiI3JCQiKy41cy9VISIoJCImXTMiISIiNyQkIitVcidbPyUhIigkIiZnMyIhIiI3JCQiKy1KLDBVISIoJCImcTMiISIiNyQkIislKSllXj8lISIoJCImISkzIiEiIjckJCIrKVsvYD8lISIoJCImISozIiEiIjckJCIrOSpcYT8lISIoJCImKzQiISIiNyQkIitoXmYwVSEiKCQiJjU0IiEiIjckJCIrSy11MFUhIigkIiY/NCIhIiI3JCQiK0ReKWU/JSEiKCQiJkk0IiEiIjckJCIqJSlIZz8lISInJCImUzQiISIiNyQkIit6VjwxVSEiKCQiJl00IiEiIjckJCIrVSg9aj8lISIoJCImZzQiISIiNyQkIitHSFkxVSEiKCQiJnE0IiEiIjckJCIrUHBnMVUhIigkIiYhKTQiISIiNyQkIityMnYxVSEiKCQiJiEqNCIhIiI3JCQiK0hXKm8/JSEiKCQiJis1IiEiIjckJCIrN3ouMlUhIigkIiY1NSIhIiI3JCQiKkEiPTJVISInJCImPzUiISIiNyQkIitgVksyVSEiKCQiJkk1IiEiIjckJCIrNnRZMlUhIigkIiZTNSIhIiI3JCQiKyU0NXc/JSEiKCQiJl01IiEiIjckJCIrLkZ2MlUhIigkIiZnNSIhIiI3JCQiK1FeKnk/JSEiKCQiJnE1IiEiIjckJCIpdS4zVSEiJiQiJiEzNiEiIjckJCIrKVt6IjNVISIoJCImITQ2ISIiNyQkIistOUszVSEiKCQiJis2IiEiIjckJCIrV0pZM1UhIigkIiY1NiIhIiI3JCQiKzdaZzNVISIoJCImPzYiISIiNyQkIiszaHUzVSEiKCQiJkk2IiEiIjckJCIrS3QpKTNVISIoJCImUzYiISIiNyQkIiskUUchNFUhIigkIiZdNiIhIiI3JCQiK2ojcCI0VSEiKCQiJmc2IiEiIjckJCIqKCo0JDRVISInJCImcTYiISIiNyQkIisyMFg0VSEiKCQiJiE9NiEiIjckJCIrczNmNFUhIigkIiYhPjYhIiI3JCQiK2w1dDRVISIoJCImKzciISIiNyQkIisqM3IpNFUhIigkIiY1NyIhIiI3JCQiK1Q0LDVVISIoJCImPzciISIiNyQkIitCMTo1VSEiKCQiJkk3IiEiIjckJCIrTixINVUhIigkIiZTNyIhIiI3JCQiK3glSC9AJSEiKCQiJl03IiEiIjckJCIrXCdvMEAlISIoJCImZzciISIiNyQkIitfd3E1VSEiKCQiJnE3IiEiIjckJCIrJ1tZM0AlISIoJCImIUc2ISIiNyQkIio6Jik0QCUhIickIiYhSDYhIiI3JCQiK1lPNzZVISIoJCImKzgiISIiNyQkIit0PkU2VSEiKCQiJjU4IiEiIjckJCIrSyxTNlUhIigkIiY/OCIhIiI3JCQiK0EiUTpAJSEiKCQiJkk4IiEiIjckJCIrWGZuNlUhIigkIiZTOCIhIiI3JCQiKU8iPUAlISImJCImXTgiISIiNyQkIisoM14+QCUhIigkIiZnOCIhIiI3JCQiKzIlKTM3VSEiKCQiJnE4IiEiIjckJCIqY0RBQCUhIickIiYhUTYhIiI3JCQiK1lETzdVISIoJCImIVI2ISIiNyQkIitsJCpcN1UhIigkIiYrOSIhIiI3JCQiKz1najdVISIoJCImNTkiISIiNyQkIiswRHg3VSEiKCQiJj85IiEiIjckJCIrRCkzSEAlISIoJCImSTkiISIiNyQkIiopXC84VSEiJyQiJlM5IiEiIjckJCIrcDQ9OFUhIigkIiZdOSIhIiI3JCQiKyR6O0xAJSEiKCQiJmc5IiEiIjckJCIrX0NYOFUhIigkIiZxOSIhIiI3JCQiK1h6ZThVISIoJCImIVs2ISIiNyQkIit1S3M4VSEiKCQiJiFcNiEiIjckJCIrUSVlUUAlISIoJCImKzoiISIiNyQkIitRTSpSQCUhIigkIiY1OiIhIiI3JCQiK3UjR1RAJSEiKCQiJj86IiEiIjckJCIrWUhFOVUhIigkIiZJOiIhIiI3JCQiK2F1UjlVISIoJCImUzoiISIiNyQkIisqekpYQCUhIigkIiZdOiIhIiI3JCQiKilmbTlVISInJCImZzoiISIiNyQkIispKioqejlVISIoJCImcToiISIiNyQkIitgUSRcQCUhIigkIiYhZTYhIiI3JCQiK1l2MTpVISIoJCImIWY2ISIiNyQkIit2NT86VSEiKCQiJis7IiEiIjckJCIrVldMOlUhIigkIiY1OyIhIiI3JCQiK1x3WTpVISIoJCImPzsiISIiNyQkIisjcCtjQCUhIigkIiZJOyIhIiI3JCQiK3VOdDpVISIoJCImUzsiISIiNyQkIismSG1lQCUhIigkIiZdOyIhIiI3JCQiK2EpKSpmQCUhIigkIiZnOyIhIiI3JCQiK183ODtVISIoJCImcTsiISIiNyQkIisqW2ppQCUhIigkIiYhbzYhIiI3JCQiK2xiUjtVISIoJCImIXA2ISIiNyQkIisiW0ZsQCUhIigkIiYrPCIhIiI3JCQiK08jZm1AJSEiKCQiJjU8IiEiIjckJCIrSzN6O1UhIigkIiY/PCIhIiI3JCQiK25BI3BAJSEiKCQiJkk8IiEiIjckJCIrVk4wPFUhIigkIiZTPCIhIiI3JCQiK2ZZPTxVISIoJCImXTwiISIiNyQkIis7Y0o8VSEiKCQiJmc8IiEiIjckJCIrOWtXPFUhIigkIiZxPCIhIiI3JCQiK19xZDxVISIoJCImIXk2ISIiNyQkIitLdnE8VSEiKCQiJiF6NiEiIjckJCIrYXkkeUAlISIoJCImKz0iISIiNyQkIis8IW96QCUhIigkIiY1PSIhIiI3JCQiK0EhKTQ9VSEiKCQiJj89IiEiIjckJCIrb3lBPVUhIigkIiZJPSIhIiI3JCQiK2R2Tj1VISIoJCImUz0iISIiNyQkIisqMyhbPVUhIigkIiZdPSIhIiI3JCQiK2praD1VISIoJCImZz0iISIiNyQkIipvWCg9VSEiJyQiJnE9IiEiIjckJCIrUlooKT1VISIoJCImISk9IiEiIjckJCIrVU8rPlUhIigkIiYhKj0iISIiNyQkIispUUsiPlUhIigkIiYrPiIhIiI3JCQiK3k0RT5VISIoJCImNT4iISIiNyQkIis2JSpRPlUhIigkIiY/PiIhIiI3JCQiKypvPCY+VSEiKCQiJkk+IiEiIjckJCIqImVrPlUhIickIiZTPiIhIiI3JCQiK3dQeD5VISIoJCImXT4iISIiNyQkIisnZSwqPlUhIigkIiZnPiIhIiI3JCQiKkNIK0ElISInJCImcT4iISIiNyQkIip1YyxBJSEiJyQiJiEpPiIhIiI3JCQiKyUzJUc/VSEiKCQiJiEqPiIhIiI3JCQiK3U3VD9VISIoJCImKz8iISIiNyQkIis0JFEwQSUhIigkIiY1PyIhIiI3JCQiKj5sMUElISInJCImPz8iISIiNyQkIis7Pno/VSEiKCQiJkk/IiEiIjckJCIrKVs9NEElISIoJCImUz8iISIiNyQkIisxXC9AVSEiKCQiJl0/IiEiIjckJCIrcjY8QFUhIigkIiZnPyIhIiI3JCQiKyNHKEhAVSEiKCQiJnE/IiEiIjckJCIrUktVQFUhIigkIiYhMzchIiI3JCQiK1chXDpBJSEiKCQiJiE0NyEiIjckJCIrJnB1O0ElISIoJCImK0AiISIiNyQkIislPis9QSUhIigkIiY1QCIhIiI3JCQiKmFEPkElISInJCImP0AiISIiNyQkIitMMjBBVSEiKCQiJklAIiEiIjckJCIrdWQ8QVUhIigkIiZTQCIhIiI3JCQiK2oxSUFVISIoJCImXUAiISIiNyQkIilhVUFVISImJCImZ0AiISIiNyQkIismKSpcREElISIoJCImcUAiISIiNyQkIis+V25BVSEiKCQiJiE9NyEiIjckJCIrLCgpekFVISIoJCImIT43ISIiNyQkIitLRyNIQSUhIigkIiYrQSIhIiI3JCQiKzdvL0JVISIoJCImNUEiISIiNyQkIitUMTxCVSEiKCQiJj9BIiEiIjckJCIrPlZIQlUhIigkIiZJQSIhIiI3JCQiK1l5VEJVISIoJCImU0EiISIiNyQkIitCN2FCVSEiKCQiJl1BIiEiIjckJCIqWGtPQSUhIickIiZnQSIhIiI3JCQiK0Z2eUJVISIoJCImcUEiISIiNyQkIithLyJSQSUhIigkIiYhRzchIiI3JCQiK0tLLkNVISIoJCImIUg3ISIiNyQkIitmZTpDVSEiKCQiJitCIiEiIjckJCIrUSR5VUElISIoJCImNUIiISIiNyQkIituMVNDVSEiKCQiJj9CIiEiIjckJCIrWkdfQ1UhIigkIiZJQiIhIiI3JCQiK3lba0NVISIoJCImU0IiISIiNyQkIitobndDVSEiKCQiJl1CIiEiIjckJCIrJlwpKVtBJSEiKCQiJmdCIiEiIjckJCIrIjM1XUElISIoJCImcUIiISIiNyQkIis9OjhEVSEiKCQiJiFRNyEiIjckJCIrMkdERFUhIigkIiYhUjchIiI3JCQiK1xSUERVISIoJCImK0MiISIiNyQkIitWXFxEVSEiKCQiJjVDIiEiIjckJCIrKnk6Y0ElISIoJCImP0MiISIiNyQkIispW09kQSUhIigkIiZJQyIhIiI3JCQiKi9kZUElISInJCImU0MiISIiNyQkIitXdShmQSUhIigkIiZdQyIhIiI3JCQiKy14NEVVISIoJCImZ0MiISIiNyQkIis4eUBFVSEiKCQiJnFDIiEiIjckJCIreXhMRVUhIigkIiYhWzchIiI3JCQiKydmZGtBJSEiKCQiJiFcNyEiIjckJCIrbnNkRVUhIigkIiYrRCIhIiI3JCQiKyR6J3BFVSEiKCQiJjVEIiEiIjckJCIrdGgib0ElISIoJCImP0QiISIiNyQkIisyYSRwQSUhIigkIiZJRCIhIiI3JCQiKyZcYXFBJSEiKCQiJlNEIiEiIjckJCIrUk08RlUhIigkIiZdRCIhIiI3JCQiK09BSEZVISIoJCImZ0QiISIiNyQkIisqKTNURlUhIigkIiZxRCIhIiI3JCQiKyhSSHZBJSEiKCQiJiFlNyEiIjckJCIrZnhrRlUhIigkIiYhZjchIiI3JCQiK3lmd0ZVISIoJCImK0UiISIiNyQkIiteUyl5QSUhIigkIiY1RSIhIiI3JCQiKyIpPitHVSEiKCQiJj9FIiEiIjckJCIrbSg+IkdVISIoJCImSUUiISIiNyQkIisydUJHVSEiKCQiJlNFIiEiIjckJCIrL1xOR1UhIigkIiZdRSIhIiI3JCQiK2VBWkdVISIoJCImZ0UiISIiNyQkIitvJSplR1UhIigkIiZxRSIhIiI3JCQiK05scUdVISIoJCImIW83ISIiNyQkIitlTSMpR1UhIigkIiYhcDchIiI3JCQiK1EtJSpHVSEiKCQiJitGIiEiIjckJCIrd28wSFUhIigkIiY1RiIhIiI3JCQiKlB0IkhVISInJCImP0YiISIiNyQkIitBKCpHSFUhIigkIiZJRiIhIiI3JCQiK0tmU0hVISIoJCImU0YiISIiNyQkIisqKj5fSFUhIigkIiZdRiIhIiI3JCQiK0N6akhVISIoJCImZ0YiISIiNyQkIisyUHZIVSEiKCQiJnFGIiEiIjckJCIrWyRwKUhVISIoJCImIXk3ISIiNyQkIitaWykqSFUhIigkIiYhejchIiI3JCQiKzAtNUlVISIoJCImK0ciISIiNyQkIitAYUBJVSEiKCQiJjVHIiEiIjckJCIrJ1xJLkIlISIoJCImP0ciISIiNyQkIipWWC9CJSEiJyQiJklHIiEiIjckJCIrQi1jSVUhIigkIiZTRyIhIiI3JCQiK3ZbbklVISIoJCImXUciISIiNyQkIisnUSp5SVUhIigkIiZnRyIhIiI3JCQiK2RQITRCJSEiKCQiJnFHIiEiIjckJCIrKSl6LEpVISIoJCImISlHIiEiIjckJCIreT84SlUhIigkIiYhKkciISIiNyQkIitHZ0NKVSEiKCQiJitIIiEiIjckJCIrUSlmOEIlISIoJCImNUgiISIiNyQkIis0TlpKVSEiKCQiJj9IIiEiIjckJCIrUnFlSlUhIigkIiZJSCIhIiI3JCQiKlYrPEIlISInJCImU0giISIiNyQkIisjbzg9QiUhIigkIiZdSCIhIiI3JCQiKyZ6RT5CJSEiKCQiJmdIIiEiIjckJCIrbyhSP0IlISIoJCImcUgiISIiNyQkIisuRTpLVSEiKCQiJiEpSCIhIiI3JCQiKypIbEFCJSEiKCQiJiEqSCIhIiI3JCQiK2N5UEtVISIoJCImK0kiISIiNyQkIit1LVxLVSEiKCQiJjVJIiEiIjckJCIrYURnS1UhIigkIiY/SSIhIiI3JCQiKydwOUZCJSEiKCQiJklJIiEiIjckJCIpbiNHQiUhIiYkIiZTSSIhIiI3JCQiK20mUUhCJSEiKCQiJl1JIiEiIjckJCIrJUhdSUIlISIoJCImZ0kiISIiNyQkIismKT07TFUhIigkIiZxSSIhIiI3JCQiK1FMRkxVISIoJCImITM4ISIiNyQkIitgWVFMVSEiKCQiJiE0OCEiIjckJCIrS2VcTFUhIigkIiYrSiIhIiI3JCQiK3RvZ0xVISIoJCImNUoiISIiNyQkIit4eHJMVSEiKCQiJj9KIiEiIjckJCIrWCZHUUIlISIoJCImSUoiISIiNyQkIit2IlJSQiUhIigkIiZTSiIhIiI3JCQiKm5cU0IlISInJCImXUoiISIiNyQkIitGKztNVSEiKCQiJmdKIiEiIjckJCIrXC1GTVUhIigkIiZxSiIhIiI3JCQiK00uUU1VISIoJCImIT04ISIiNyQkIislRyFcTVUhIigkIiYhPjghIiI3JCQiKyg0K1lCJSEiKCQiJitLIiEiIjckJCIrdig0WkIlISIoJCImNUsiISIiNyQkIis8JD5bQiUhIigkIiY/SyIhIiI3JCQiK0MoR1xCJSEiKCQiJklLIiEiIjckJCIrJip6Lk5VISIoJCImU0siISIiNyQkIitKcjlOVSEiKCQiJl1LIiEiIjckJCIrS2hETlUhIigkIiZnSyIhIiI3JCQiKykqXE9OVSEiKCQiJnFLIiEiIjckJCIqdHRhQiUhIickIiYhRzghIiI3JCQiK0VCZU5VISIoJCImIUg4ISIiNyQkIisqeSFwTlUhIigkIiYrTCIhIiI3JCQiKzsiKnpOVSEiKCQiJjVMIiEiIjckJCIqSjJmQiUhIickIiY/TCIhIiI3JCQiK3BgLE9VISIoJCImSUwiISIiNyQkIismSEJoQiUhIigkIiZTTCIhIiI3JCQiKyczSmlCJSEiKCQiJl1MIiEiIjckJCIrVyhRakIlISIoJCImZ0wiISIiNyQkIitvaVdPVSEiKCQiJnFMIiEiIjckJCIrZk9iT1UhIigkIiYhUTghIiI3JCQiKzw0bU9VISIoJCImIVI4ISIiNyQkIitUIW9uQiUhIigkIiYrTSIhIiI3JCQiK0tdKG9CJSEiKCQiJjVNIiEiIjckJCIqKj0pcEIlISInJCImP00iISIiNyQkIis6JykzUFUhIigkIiZJTSIhIiI3JCQiKzNfPlBVISIoJCImU00iISIiNyQkIitvO0lQVSEiKCQiJl1NIiEiIjckJCIrJip6U1BVISIoJCImZ00iISIiNyQkIisiPjl2QiUhIigkIiZxTSIhIiI3JCQiK2EtaVBVISIoJCImIVs4ISIiNyQkIismPUV4QiUhIigkIiYhXDghIiI3JCQiKyUpPiR5QiUhIigkIiYrTiIhIiI3JCQiK153JHpCJSEiKCQiJjVOIiEiIjckJCIrKD1WIVFVISIoJCImP04iISIiNyQkIisiZlsiUVUhIigkIiZJTiIhIiI3JCQiK2pRRFFVISIoJCImU04iISIiNyQkIiswIWYkUVUhIigkIiZdTiIhIiI3JCQiKzpTWVFVISIoJCImZ04iISIiNyQkIislKilvJlFVISIoJCImcU4iISIiNyQkIitVT25RVSEiKCQiJiFlOCEiIjckJCIrZiN5KFFVISIoJCImIWY4ISIiNyQkIitZRikpUVUhIigkIiYrTyIhIiI3JCQiKy1yKSpRVSEiKCQiJjVPIiEiIjckJCIrRzg0UlUhIigkIiY/TyIhIiI3JCQiK0JhPlJVISIoJCImSU8iISIiNyQkIispUSpIUlUhIigkIiZTTyIhIiI3JCQiK0JLU1JVISIoJCImXU8iISIiNyQkIitIcF1SVSEiKCQiJmdPIiEiIjckJCIrLzBoUlUhIigkIiZxTyIhIiI3JCQiKiZSclJVISInJCImIW84ISIiNyQkIittcyIpUlUhIigkIiYhcDghIiI3JCQiK18vIypSVSEiKCQiJitQIiEiIjckJCIrNE4tU1UhIigkIiY1UCIhIiI3JCQiK1BrN1NVISIoJCImP1AiISIiNyQkIitPI0gtQyUhIigkIiZJUCIhIiI3JCQiKzE+TFNVISIoJCImU1AiISIiNyQkIitaV1ZTVSEiKCQiJl1QIiEiIjckJCIrZm9gU1UhIigkIiZnUCIhIiI3JCQiK1YiUjFDJSEiKCQiJnFQIiEiIjckJCIrKUhUMkMlISIoJCImIXk4ISIiNyQkIitETCUzQyUhIigkIiYhejghIiI3JCQiK0NfJTRDJSEiKCQiJitRIiEiIjckJCIrJSpwL1RVISIoJCImNVEiISIiNyQkIitPJ1s2QyUhIigkIiY/USIhIiI3JCQiK14sRFRVISIoJCImSVEiISIiNyQkIitQOk5UVSEiKCQiJlNRIiEiIjckJCIrJ3pfOUMlISIoJCImXVEiISIiNyQkIitGUmJUVSEiKCQiJmdRIiEiIjckJCIrSlxsVFUhIigkIiZxUSIhIiI3JCQiKzNldlRVISIoJCImISlRIiEiIjckJCIrZGwmPUMlISIoJCImISpRIiEiIjckJCIrenImPkMlISIoJCImK1IiISIiNyQkIit2dzBVVSEiKCQiJjVSIiEiIjckJCIrViFlQEMlISIoJCImP1IiISIiNyQkIismR2VBQyUhIigkIiZJUiIhIiI3JCQiKSVlQkMlISImJCImU1IiISIiNyQkIispUWVDQyUhIigkIiZdUiIhIiI3JCQiKkRlREMlISInJCImZ1IiISIiNyQkIisnKXpsVVUhIigkIiZxUiIhIiI3JCQiKyZmZEZDJSEiKCQiJiEpUiIhIiI3JCQiK3pxJkdDJSEiKCQiJiEqUiIhIiI3JCQiK09rJkhDJSEiKCQiJitTIiEiIjckJCIrb2MwVlUhIigkIiY1UyIhIiI3JCQiK3VaOlZVISIoJCImP1MiISIiNyQkIithUERWVSEiKCQiJklTIiEiIjckJCIrM0VOVlUhIigkIiZTUyIhIiI3JCQiK1E4WFZVISIoJCImXVMiISIiNyQkIitVKlxOQyUhIigkIiZnUyIhIiI3JCQiKlVbT0MlISInJCImcVMiISIiNyQkIit1bnVWVSEiKCQiJiEzOSEiIjckJCIrLl0lUUMlISIoJCImITQ5ISIiNyQkIisySiVSQyUhIigkIiYrVCIhIiI3JCQiKyczVFNDJSEiKCQiJjVUIiEiIjckJCIqJSpRVEMlISInJCImP1QiISIiNyQkIipuT1VDJSEiJyQiJklUIiEiIjckJCIrd1VMV1UhIigkIiZTVCIhIiI3JCQiK2Q8VldVISIoJCImXVQiISIiNyQkIis5IkhYQyUhIigkIiZnVCIhIiI3JCQiK1pqaVdVISIoJCImcVQiISIiNyQkIitjTXNXVSEiKCQiJiE9OSEiIjckJCIrVC8jW0MlISIoJCImIT45ISIiNyQkIistdCJcQyUhIigkIiYrVSIhIiI3JCQiKi85XUMlISInJCImNVUiISIiNyQkIithMTZYVSEiKCQiJj9VIiEiIjckJCIrWHI/WFUhIigkIiZJVSIhIiI3JCQiKzdOSVhVISIoJCImU1UiISIiNyQkIitjKCpSWFUhIigkIiZdVSIhIiI3JCQiK3hlXFhVISIoJCImZ1UiISIiNyQkIit2PWZYVSEiKCQiJnFVIiEiIjckJCIqdihvWFUhIickIiYhRzkhIiI3JCQiKy1OeVhVISIoJCImIUg5ISIiNyQkIitKInplQyUhIigkIiYrViIhIiI3JCQiK1FZKGZDJSEiKCQiJjVWIiEiIjckJCIrQSsyWVUhIigkIiY/ViIhIiI3JCQiKyVHbGhDJSEiKCQiJklWIiEiIjckJCIrQy9FWVUhIigkIiZTViIhIiI3JCQiK1RhTllVISIoJCImXVYiISIiNyQkIitPLlhZVSEiKCQiJmdWIiEiIjckJCIqNlhsQyUhIickIiZxViIhIiI3JCQiK2goUm1DJSEiKCQiJiFROSEiIjckJCIrIkhNbkMlISIoJCImIVI5ISIiNyQkIisqcEdvQyUhIigkIiYrVyIhIiI3JCQiKyYpSCNwQyUhIigkIiY1VyIhIiI3JCQiKjo8cUMlISInJCImP1ciISIiNyQkIislPjZyQyUhIigkIiZJVyIhIiI3JCQiKzteP1pVISIoJCImU1ciISIiNyQkIis8KilIWlUhIigkIiZdVyIhIiI3JCQiKyhmI1JaVSEiKCQiJmdXIiEiIjckJCIrY2hbWlUhIigkIiZxVyIhIiI3JCQiKyVmenZDJSEiKCQiJiFbOSEiIjckJCIrN0huWlUhIigkIiYhXDkhIiI3JCQiKzRod1pVISIoJCImK1giISIiNyQkIismPWZ5QyUhIigkIiY1WCIhIiI3JCQiKjlfekMlISInJCImP1giISIiNyQkIit3XC9bVSEiKCQiJklYIiEiIjckJCIrInBQIltVISIoJCImU1giISIiNyQkIisnR0kjW1UhIigkIiZdWCIhIiI3JCQiK2hGS1tVISIoJCImZ1giISIiNyQkIis7XlRbVSEiKCQiJnFYIiEiIjckJCIqTjImW1UhIickIiYhZTkhIiI3JCQiK20lKmZbVSEiKCQiJiFmOSEiIjckJCIraDlwW1UhIigkIiYrWSIhIiI3JCQiK1BMeVtVISIoJCImNVkiISIiNyQkIislNHYpW1UhIigkIiY/WSIhIiI3JCQiK0puJypbVSEiKCQiJklZIiEiIjckJCIrWyNlIVxVISIoJCImU1kiISIiNyQkIitaJ1wiXFUhIigkIiZdWSIhIiI3JCQiK0Y0Q1xVISIoJCImZ1kiISIiNyQkIisoM0skXFUhIigkIiZxWSIhIiI3JCQiK0hKVVxVISIoJCImIW85ISIiNyQkIiteU15cVSEiKCQiJiFwOSEiIjckJCIrYltnXFUhIigkIiYrWiIhIiI3JCQiK1RicFxVISIoJCImNVoiISIiNyQkIiszaHlcVSEiKCQiJj9aIiEiIjckJCIrY2woKVxVISIoJCImSVoiISIiNyQkIisnKW8nKlxVISIoJCImU1oiISIiNyQkIispNGQrRCUhIigkIiZdWiIhIiI3JCQiKyM+WixEJSEiKCQiJmdaIiEiIjckJCIrb3JCXVUhIigkIiZxWiIhIiI3JCQiK0RxS11VISIoJCImIXk5ISIiNyQkIitsblRdVSEiKCQiJiF6OSEiIjckJCIrKFExMEQlISIoJCImK1siISIiNyQkIisjKmVmXVUhIigkIiY1WyIhIiI3JCQiK3pfb11VISIoJCImP1siISIiNyQkIitbWHhdVSEiKCQiJklbIiEiIjckJCIpUCczRCUhIiYkIiZTWyIhIiI3JCQiK01GJjREJSEiKCQiJl1bIiEiIjckJCIrXzsvXlUhIigkIiZnWyIhIiI3JCQiK18vOF5VISIoJCImcVsiISIiNyQkIitOIj43RCUhIigkIiYhKVsiISIiNyQkIisseEleVSEiKCQiJiEqWyIhIiI3JCQiK15oUl5VISIoJCImK1wiISIiNyQkIislWyVbXlUhIigkIiY1XCIhIiI3JCQiKUZkXlUhIiYkIiY/XCIhIiI3JCQiKyp6ZztEJSEiKCQiJklcIiEiIjckJCIrI3lbPEQlISIoJCImU1wiISIiNyQkIitbbSQ9RCUhIigkIiZdXCIhIiI3JCQiKypSQz5EJSEiKCQiJmdcIiEiIjckJCIrTD8sX1UhIigkIiZxXCIhIiI3JCQiKmIqNF9VISInJCImISlcIiEiIjckJCIrX3A9X1UhIigkIiYhKlwiISIiNyQkIitRVUZfVSEiKCQiJitdIiEiIjckJCIrMzlPX1UhIigkIiY1XSIhIiI3JCQiK2klW0NEJSEiKCQiJj9dIiEiIjckJCIrLGFgX1UhIigkIiZJXSIhIiI3JCQiK0NBaV9VISIoJCImU10iISIiNyQkIitKKjNGRCUhIigkIiZdXSIhIiI3JCQiK0Jiel9VISIoJCImZ10iISIiNyQkIigjKUdEJSEiJSQiJnFdIiEiIjckJCIraCRvSEQlISIoJCImITM6ISIiNyQkIisyWTBgVSEiKCQiJiE0OiEiIjckJCIrUTI5YFUhIigkIiYrXiIhIiI3JCQiK2FuQWBVISIoJCImNV4iISIiNyQkIitjRUpgVSEiKCQiJj9eIiEiIjckJCIrVSUpUmBVISIoJCImSV4iISIiNyQkIis5VFtgVSEiKCQiJlNeIiEiIjckJCIrcidwTkQlISIoJCImXV4iISIiNyQkIis4XmxgVSEiKCQiJmdeIiEiIjckJCIrVC91YFUhIigkIiZxXiIhIiI3JCQiK2JjI1FEJSEiKCQiJiE9OiEiIjckJCIrYTIiUkQlISIoJCImIT46ISIiNyQkIitSZCpSRCUhIigkIiYrXyIhIiI3JCQiKmghM2FVISInJCImNV8iISIiNyQkIituYDthVSEiKCQiJj9fIiEiIjckJCIqLF1VRCUhIickIiZJXyIhIiI3JCQiK1JYTGFVISIoJCImU18iISIiNyQkIithKj1XRCUhIigkIiZdXyIhIiI3JCQiK2NLXWFVISIoJCImZ18iISIiNyQkIitXdWVhVSEiKCQiJnFfIiEiIjckJCIrPTpuYVUhIigkIiYhRzohIiI3JCQiK3phdmFVISIoJCImIUg6ISIiNyQkIitFJFJbRCUhIigkIiYrYCIhIiI3JCQiK2hJI1xEJSEiKCQiJjVgIiEiIjckJCIrI28xXUQlISIoJCImP2AiISIiNyQkIisqPSE0YlUhIigkIiZJYCIhIiI3JCQiKyVldF5EJSEiKCQiJlNgIiEiIjckJCIrbW9EYlUhIigkIiZdYCIhIiI3JCQiK04rTWJVISIoJCImZ2AiISIiNyQkIisiNEJhRCUhIigkIiZxYCIhIiI3JCQiK05nXWJVISIoJCImIVE6ISIiNyQkIitsKSllYlUhIigkIiYhUjohIiI3JCQiKyVlcmNEJSEiKCQiJithIiEiIjckJCIrKj1hZEQlISIoJCImNWEiISIiNyQkIiskb09lRCUhIigkIiY/YSIhIiI3JCQiK2shPmZEJSEiKCQiJklhIiEiIjckJCIrSzgrY1UhIigkIiZTYSIhIiI3JCQiKypbJDNjVSEiKCQiJl1hIiEiIjckJCIrTGI7Y1UhIigkIiZnYSIhIiI3JCQiK211Q2NVISIoJCImcWEiISIiNyQkIisnR0hqRCUhIigkIiYhWzohIiI3JCQiKyYqNFRjVSEiKCQiJiFcOiEiIjckJCIrI2YjXGNVISIoJCImK2IiISIiNyQkIit4U2RjVSEiKCQiJjViIiEiIjckJCIrXmFsY1UhIigkIiY/YiIhIiI3JCQiKzhudGNVISIoJCImSWIiISIiNyQkIitreSJvRCUhIigkIiZTYiIhIiI3JCQiKy4qKSpvRCUhIigkIiZdYiIhIiI3JCQiK0openBEJSEiKCQiJmdiIiEiIjckJCIrWzExZFUhIigkIiZxYiIhIiI3JCQiK2A4OWRVISIoJCImIWU6ISIiNyQkIitbPkFkVSEiKCQiJiFmOiEiIjckJCIrS0NJZFUhIigkIiYrYyIhIiI3JCQiKy9HUWRVISIoJCImNWMiISIiNyQkIittSVlkVSEiKCQiJj9jIiEiIjckJCIrPEthZFUhIigkIiZJYyIhIiI3JCQiK2VLaWRVISIoJCImU2MiISIiNyQkIisoPS54RCUhIigkIiZdYyIhIiI3JCQiKzJJeWRVISIoJCImZ2MiISIiNyQkIis6Rid5RCUhIigkIiZxYyIhIiI3JCQiKzlCJXpEJSEiKCQiJiFvOiEiIjckJCIrLT0tZVUhIigkIiYhcDohIiI3JCQiKj0sImVVISInJCImK2QiISIiNyQkIitbLz1lVSEiKCQiJjVkIiEiIjckJCIrMCdmI2VVISIoJCImP2QiISIiNyQkIitgJ1EkZVUhIigkIiZJZCIhIiI3JCQiKyJmPCVlVSEiKCQiJlNkIiEiIjckJCIrPmtcZVUhIigkIiZdZCIhIiI3JCQiK1BeZGVVISIoJCImZ2QiISIiNyQkIitYUGxlVSEiKCQiJnFkIiEiIjckJCIrV0F0ZVUhIigkIiYheTohIiI3JCQiK0wxIillVSEiKCQiJiF6OiEiIjckJCIrOCopKSllVSEiKCQiJitlIiEiIjckJCIrJTNuKmVVISIoJCImNWUiISIiNyQkIitYXi9mVSEiKCQiJj9lIiEiIjckJCIrJzRCImZVISIoJCImSWUiISIiNyQkIitSND9mVSEiKCQiJlNlIiEiIjckJCIrcyd5I2ZVISIoJCImXWUiISIiNyQkIisoSGMkZlUhIigkIiZnZSIhIiI3JCQiKzdRVmZVISIoJCImcWUiISIiNyQkIis+N15mVSEiKCQiJiEpZSIhIiI3JCQiKzsmKWVmVSEiKCQiJiEqZSIhIiI3JCQiKzBkbWZVISIoJCImK2YiISIiNyQkIisneVUoZlUhIigkIiY1ZiIhIiI3JCQiK2QoPilmVSEiKCQiJj9mIiEiIjckJCIqaScqKWZVISInJCImSWYiISIiNyQkIit2TCgqZlUhIigkIiZTZiIhIiI3JCQiK0ArMGdVISIoJCImXWYiISIiNyQkIitmbDdnVSEiKCQiJmdmIiEiIjckJCIrKilIP2dVISIoJCImcWYiISIiNyQkIipKei1FJSEiJyQiJiEpZiIhIiI3JCQiK0NiTmdVISIoJCImISpmIiEiIjckJCIrSDtWZ1UhIigkIiYrZyIhIiI3JCQiK0V3XWdVISIoJCImNWciISIiNyQkIis7TmVnVSEiKCQiJj9nIiEiIjckJCIrKEhmMUUlISIoJCImSWciISIiNyQkIityXHRnVSEiKCQiJlNnIiEiIjckJCIrUDAiM0UlISIoJCImXWciISIiNyQkIisnKmYpM0UlISIoJCImZ2ciISIiNyQkIitaOCc0RSUhIigkIiZxZyIhIiI3JCQiKmZPNUUlISInJCImITM7ISIiNyQkIitFPDZoVSEiKCQiJiE0OyEiIjckJCIrYm49aFUhIigkIiYraCIhIiI3JCQiK3c7RWhVISIoJCImNWgiISIiNyQkIipcTzhFJSEiJyQiJj9oIiEiIjckJCIrKD42OUUlISIoJCImSWgiISIiNyQkIisoeiZbaFUhIigkIiZTaCIhIiI3JCQiKkhnOkUlISInJCImXWgiISIiNyQkIit3WWpoVSEiKCQiJmdoIiEiIjckJCIrYiozPEUlISIoJCImcWgiISIiNyQkIitGSnloVSEiKCQiJiE9OyEiIjckJCIrJD5kPUUlISIoJCImIT47ISIiNyQkIitfNiQ+RSUhIigkIiYraSIhIiI3JCQiKy9dK2lVISIoJCImNWkiISIiNyQkIitcKHk/RSUhIigkIiY/aSIhIiI3JCQiKypRX0BFJSEiKCQiJklpIiEiIjckJCIrQGZBaVUhIigkIiZTaSIhIiI3JCQiK1skKkhpVSEiKCQiJl1pIiEiIjckJCIrb0VQaVUhIigkIiZnaSIhIiI3JCQiKyMpZVdpVSEiKCQiJnFpIiEiIjckJCIrKikqPURFJSEiKCQiJiFHOyEiIjckJCIrIio+ZmlVISIoJCImIUg7ISIiNyQkIisoKVttaVUhIigkIiYraiIhIiI3JCQiK3d3dGlVISIoJCImNWoiISIiNyQkIipPNUdFJSEiJyQiJj9qIiEiIjckJCIrUUgpR0UlISIoJCImSWoiISIiNyQkIipUYkhFJSEiJyQiJlNqIiEiIjckJCIreHgtalUhIigkIiZdaiIhIiI3JCQiK1ErNWpVISIoJCImZ2oiISIiNyQkIiskPnNKRSUhIigkIiZxaiIhIiI3JCQiK1ZVQ2pVISIoJCImIVE7ISIiNyQkIisoPTtMRSUhIigkIiYhUjshIiI3JCQiK0UhKVFqVSEiKCQiJitrIiEiIjckJCIqd2ZNRSUhIickIiY1ayIhIiI3JCQiKylRSk5FJSEiKCQiJj9rIiEiIjckJCIrNkhnalUhIigkIiZJayIhIiI3JCQiK0hWbmpVISIoJCImU2siISIiNyQkIitVY3VqVSEiKCQiJl1rIiEiIjckJCIqJm8iUUUlISInJCImZ2siISIiNyQkIitgeilRRSUhIigkIiZxayIhIiI3JCQiK14qZVJFJSEiKCQiJiFbOyEiIjckJCIrWClIU0UlISIoJCImIVw7ISIiNyQkIitMMTVrVSEiKCQiJitsIiEiIjckJCIrPDg8a1UhIigkIiY1bCIhIiI3JCQiKygqPUNrVSEiKCQiJj9sIiEiIjckJCIrckJKa1UhIigkIiZJbCIhIiI3JCQiK1RGUWtVISIoJCImU2wiISIiNyQkIisySVhrVSEiKCQiJl1sIiEiIjckJCIrcEpfa1UhIigkIiZnbCIhIiI3JCQiK0VLZmtVISIoJCImcWwiISIiNyQkIit5Sm1rVSEiKCQiJiFlOyEiIjckJCIrRkl0a1UhIigkIiYhZjshIiI3JCQiK3JGIVtFJSEiKCQiJittIiEiIjckJCIrN0MoW0UlISIoJCImNW0iISIiNyQkIitbPiVcRSUhIigkIiY/bSIhIiI3JCQiKyJRNl1FJSEiKCQiJkltIiEiIjckJCIrNDIzbFUhIigkIiZTbSIhIiI3JCQiK00qXF5FJSEiKCQiJl1tIiEiIjckJCIrYiE+X0UlISIoJCImZ20iISIiNyQkIitzISlHbFUhIigkIiZxbSIhIiI3JCQiKyYpcE5sVSEiKCQiJiFvOyEiIjckJCIrJnpEYUUlISIoJCImIXA7ISIiNyQkIissWFxsVSEiKCQiJituIiEiIjckJCIrL0pjbFUhIigkIiY1biIhIiI3JCQiKy87amxVISIoJCImP24iISIiNyQkIiZkRSUhIiMkIiZJbiIhIiI3JCQiKyNIb2RFJSEiKCQiJlNuIiEiIjckJCIrI1tPZUUlISIoJCImXW4iISIiNyQkIitvWCFmRSUhIigkIiZnbiIhIiI3JCQiK15EKGZFJSEiKCQiJnFuIiEiIjckJCIrSi8vbVUhIigkIiYheTshIiI3JCQiKzMjM2hFJSEiKCQiJiF6OyEiIjckJCIrIyllPG1VISIoJCImK28iISIiNyQkIithTUNtVSEiKCQiJjVvIiEiIjckJCIrQTRKbVUhIigkIiY/byIhIiI3JCQiKyhHeWpFJSEiKCQiJklvIiEiIjckJCIqYlhrRSUhIickIiZTbyIhIiI3JCQiKnI3bEUlISInJCImXW8iISIiNyQkIitvKHpsRSUhIigkIiZnbyIhIiI3JCQiK0Jua21VISIoJCImcW8iISIiNyQkIit2TnJtVSEiKCQiJiEpbyIhIiI3JCQiK0QueW1VISIoJCImISpvIiEiIjckJCIrdHAlb0UlISIoJCImK3AiISIiNyQkIis9TiJwRSUhIigkIiY1cCIhIiI3JCQiK2gqenBFJSEiKCQiJj9wIiEiIjckJCIrLGovblUhIigkIiZJcCIhIiI3JCQiKmE3ckUlISInJCImU3AiISIiNyQkIit3J3lyRSUhIigkIiZdcCIhIiI3JCQiKzZaQ25VISIoJCImZ3AiISIiNyQkIitWMUpuVSEiKCQiJnFwIiEiIjckJCIrdGtQblUhIigkIiYhKXAiISIiNyQkIistQVduVSEiKCQiJiEqcCIhIiI3JCQiK0h5XW5VISIoJCImK3EiISIiNyQkIitgTGRuVSEiKCQiJjVxIiEiIjckJCIreChRd0UlISIoJCImP3EiISIiNyQkIispNC94RSUhIigkIiZJcSIhIiI3JCQiKz0kcHhFJSEiKCQiJlNxIiEiIjckJCIrT1ckeUUlISIoJCImXXEiISIiNyQkIitgJSoqeUUlISIoJCImZ3EiISIiNyQkIitvVid6RSUhIigkIiZxcSIhIiI3JCQiKyM9SCFvVSEiKCQiJiEzPCEiIjckJCIrJSpRNG9VISIoJCImITQ8ISIiNyQkIiswJmUib1UhIigkIiYrciIhIiI3JCQiKzpJQW9VISIoJCImNXIiISIiNyQkIitDdUdvVSEiKCQiJj9yIiEiIjckJCIrSzxOb1UhIigkIiZJciIhIiI3JCQiK1FmVG9VISIoJCImU3IiISIiNyQkIitWK1tvVSEiKCQiJl1yIiEiIjckJCIrW1Nhb1UhIigkIiZnciIhIiI3JCQiK156Z29VISIoJCImcXIiISIiNyQkIithPG5vVSEiKCQiJiE9PCEiIjckJCIrY2F0b1UhIigkIiYhPjwhIiI3JCQiK2QhKnpvVSEiKCQiJitzIiEiIjckJCIrZEQnKW9VISIoJCImNXMiISIiNyQkIitkZiMqb1UhIigkIiY/cyIhIiI3JCQiK2MjKikqb1UhIigkIiZJcyIhIiI3JCQiK2FDMHBVISIoJCImU3MiISIiNyQkIitfYjZwVSEiKCQiJl1zIiEiIjckJCIrXCZ5InBVISIoJCImZ3MiISIiNyQkIitZOUNwVSEiKCQiJnFzIiEiIjckJCIrVlVJcFUhIigkIiYhRzwhIiI3JCQiK1JwT3BVISIoJCImIUg8ISIiNyQkIitOJkglcFUhIigkIiYrdCIhIiI3JCQiK0o/XHBVISIoJCImNXQiISIiNyQkIitFV2JwVSEiKCQiJj90IiEiIjckJCIrQW5ocFUhIigkIiZJdCIhIiI3JCQiKzwqeSdwVSEiKCQiJlN0IiEiIjckJCIrODV1cFUhIigkIiZddCIhIiI3JCQiKzNJISlwVSEiKCQiJmd0IiEiIjckJCIrLlwnKXBVISIoJCImcXQiISIiNyQkIisqcEUqcFUhIigkIiYhUTwhIiI3JCQiKyZSKSkqcFUhIigkIiYhUjwhIiI3JCQiKyIqKlwrRiUhIigkIiYrdSIhIiI3JCQiKyhbNixGJSEiKCQiJjV1IiEiIjckJCIrJSlHPHFVISIoJCImP3UiISIiNyQkIisiPU0tRiUhIigkIiZJdSIhIiI3JCQiK3lgSHFVISIoJCImU3UiISIiNyQkIit3a05xVSEiKCQiJl11IiEiIjckJCIrdnVUcVUhIigkIiZndSIhIiI3JCQiK3QkeS9GJSEiKCQiJnF1IiEiIjckJCIrdCJSMEYlISIoJCImIVs8ISIiNyQkIit0KSpmcVUhIigkIiYhXDwhIiI3JCQiK3UvbXFVISIoJCImK3YiISIiNyQkIit3NHNxVSEiKCQiJjV2IiEiIjckJCIrejh5cVUhIigkIiY/diIhIiI3JCQiKyNvVDNGJSEiKCQiJkl2IiEiIjckJCIrJyk9ITRGJSEiKCQiJlN2IiEiIjckJCIrIio+JzRGJSEiKCQiJl12IiEiIjckJCIrKSo+LXJVISIoJCImZ3YiISIiNyQkIiswPjNyVSEiKCQiJnF2IiEiIjckJCIrODw5clUhIigkIiYhZTwhIiI3JCQiK0I5P3JVISIoJCImIWY8ISIiNyQkIitMNUVyVSEiKCQiJit3IiEiIjckJCIrWDBLclUhIigkIiY1dyIhIiI3JCQiK2UqejhGJSEiKCQiJj93IiEiIjckJCIrdCNSOUYlISIoJCImSXciISIiNyQkIisqWylcclUhIigkIiZTdyIhIiI3JCQiKzF3YnJVISIoJCImXXciISIiNyQkIitEbWhyVSEiKCQiJmd3IiEiIjckJCIrWGJuclUhIigkIiZxdyIhIiI3JCQiK25WdHJVISIoJCImIW88ISIiNyQkIio0JHpyVSEiJyQiJiFwPCEiIjckJCIrOjwmPUYlISIoJCImK3giISIiNyQkIitVLSI+RiUhIigkIiY1eCIhIiI3JCQiKm5vPkYlISInJCImP3giISIiNyQkIihGP0YlISIlJCImSXgiISIiNyQkIitLXzNzVSEiKCQiJlN4IiEiIjckJCIrbUw5c1UhIigkIiZdeCIhIiI3JCQiKy05P3NVISIoJCImZ3giISIiNyQkIipNZkFGJSEiJyQiJnF4IiEiIjckJCIrenJKc1UhIigkIiYheTwhIiI3JCQiK0BcUHNVISIoJCImIXo8ISIiNyQkIitsRFZzVSEiKCQiJit5IiEiIjckJCIrNixcc1UhIigkIiY1eSIhIiI3JCQiK2Z2YXNVISIoJCImP3kiISIiNyQkIioiXGdzVSEiJyQiJkl5IiEiIjckJCIraUBtc1UhIigkIiZTeSIhIiI3JCQiKzwkPkZGJSEiKCQiJl15IiEiIjckJCIrdWp4c1UhIigkIiZneSIhIiI3JCQiK01MJEdGJSEiKCQiJnF5IiEiIjckJCIrJz4hKkdGJSEiKCQiJiEpeSIhIiI3JCQiK2hwJUhGJSEiKCQiJiEqeSIhIiI3JCQiK0dPK3RVISIoJCImK3oiISIiNyQkIispPmdJRiUhIigkIiY1eiIhIiI3JCQiKm47SkYlISInJCImP3oiISIiNyQkIitYSTx0VSEiKCQiJkl6IiEiIjckJCIrQSRIS0YlISIoJCImU3oiISIiNyQkIisuYkd0VSEiKCQiJl16IiEiIjckJCIrJ2VUTEYlISIoJCImZ3oiISIiNyQkIitzdlJ0VSEiKCQiJnF6IiEiIjckJCIraE1YdFUhIigkIiYhKXoiISIiNyQkIitfIzRORiUhIigkIiYhKnoiISIiNyQkIitaXGN0VSEiKCQiJishPSEiIjckJCIrVzBpdFUhIigkIiY1IT0hIiI3JCQiK1hnbnRVISIoJCImPyE9ISIiNyQkIitcOXR0VSEiKCQiJkkhPSEiIjckJCIrYm55dFUhIigkIiZTIT0hIiI3JCQiK2w+JVFGJSEiKCQiJl0hPSEiIjckJCIreXEqUUYlISIoJCImZyE9ISIiNyQkIismNF9SRiUhIigkIiZxIT0hIiI3JCQiKzlxK3VVISIoJCImITM9ISIiNyQkIitQPTF1VSEiKCQiJiE0PSEiIjckJCIra2w2dVUhIigkIiYrIj0hIiI3JCQiKyQ+clRGJSEiKCQiJjUiPSEiIjckJCIrRWRBdVUhIigkIiY/Ij0hIiI3JCQiK2osR3VVISIoJCImSSI9ISIiNyQkIisuWEx1VSEiKCQiJlMiPSEiIjckJCIrWigpUXVVISIoJCImXSI9ISIiNyQkIislKkdXdVUhIigkIiZnIj0hIiI3JCQiK1hwXHVVISIoJCImcSI9ISIiNyQkIisqKjNidVUhIigkIiYhPT0hIiI3JCQiK2RaZ3VVISIoJCImIT49ISIiNyQkIis+JmVZRiUhIigkIiYrIz0hIiI3JCQiKyY9N1pGJSEiKCQiJjUjPSEiIjckJCIrYWR3dVUhIigkIiY/Iz0hIiI3JCQiK0cjPltGJSEiKCQiJkkjPSEiIjckJCIrMEUoW0YlISIoJCImUyM9ISIiNyQkIisnKWUjXEYlISIoJCImXSM9ISIiNyQkIitzIXpcRiUhIigkIiZnIz0hIiI3JCQiK2hALnZVISIoJCImcSM9ISIiNyQkIithXjN2VSEiKCQiJiFHPSEiIjckJCIrXiFRXkYlISIoJCImIUg9ISIiNyQkIitgMz52VSEiKCQiJiskPSEiIjckJCIrZk5DdlUhIigkIiY1JD0hIiI3JCQiK3BoSHZVISIoJCImPyQ9ISIiNyQkIiskb1tgRiUhIigkIiZJJD0hIiI3JCQiKyw2U3ZVISIoJCImUyQ9ISIiNyQkIitDTVh2VSEiKCQiJl0kPSEiIjckJCIrXmNddlUhIigkIiZnJD0hIiI3JCQiKyN5ZGJGJSEiKCQiJnEkPSEiIjckJCIrPSk0Y0YlISIoJCImIVE9ISIiNyQkIitmPG12VSEiKCQiJiFSPSEiIjckJCIrLk9ydlUhIigkIiYrJT0hIiI3JCQiK2Bgd3ZVISIoJCImNSU9ISIiNyQkIisycSJlRiUhIigkIiY/JT0hIiI3JCQiK2wmb2VGJSEiKCQiJkklPSEiIjckJCIrSCsjZkYlISIoJCImUyU9ISIiNyQkIisoUnJmRiUhIigkIiZdJT0hIiI3JCQiK3BFLXdVISIoJCImZyU9ISIiNyQkIitaUTJ3VSEiKCQiJnElPSEiIjckJCIrSFw3d1UhIigkIiYhWz0hIiI3JCQiKztmPHdVISIoJCImIVw9ISIiNyQkIiszb0F3VSEiKCQiJismPSEiIjckJCIrMHdGd1UhIigkIiY1Jj0hIiI3JCQiKzEkR2pGJSEiKCQiJj8mPSEiIjckJCIrOCp5akYlISIoJCImSSY9ISIiNyQkIitEJUhrRiUhIigkIiZTJj0hIiI3JCQiK1UpemtGJSEiKCQiJl0mPSEiIjckJCIraixgd1UhIigkIiZnJj0hIiI3JCQiKlIhZXdVISInJCImcSY9ISIiNyQkIitBMGp3VSEiKCQiJiFlPSEiIjckJCIqYyFvd1UhIickIiYhZj0hIiI3JCQiKy0wdHdVISIoJCImKyc9ISIiNyQkIipOIXl3VSEiJyQiJjUnPSEiIjckJCIrLiwkb0YlISIoJCImPyc9ISIiNyQkIitoKHpvRiUhIigkIiZJJz0hIiI3JCQiK0QkSHBGJSEiKCQiJlMnPSEiIjckJCIrJXp5cEYlISIoJCImXSc9ISIiNyQkIitwIkdxRiUhIigkIiZnJz0hIiI3JCQiK1x1MnhVISIoJCImcSc9ISIiNyQkIitNbTd4VSEiKCQiJiFvPSEiIjckJCIrRGQ8eFUhIigkIiYhcD0hIiI3JCQiK0BaQXhVISIoJCImKyg9ISIiNyQkIitDT0Z4VSEiKCQiJjUoPSEiIjckJCIrSkNLeFUhIigkIiY/KD0hIiI3JCQiK1g2UHhVISIoJCImSSg9ISIiNyQkIitrKD51RiUhIigkIiZTKD0hIiI3JCQiKypHb3VGJSEiKCQiJl0oPSEiIjckJCIrPm5eeFUhIigkIiZnKD0hIiI3JCQiK2JdY3hVISIoJCImcSg9ISIiNyQkIispSDh3RiUhIigkIiYheT0hIiI3JCQiK1k5bXhVISIoJCImIXo9ISIiNyQkIisqXDR4RiUhIigkIiYrKT0hIiI3JCQiK2Z1dnhVISIoJCImNSk9ISIiNyQkIitEYCF5RiUhIigkIiY/KT0hIiI3JCQiKyg0YHlGJSEiKCQiJkkpPSEiIjckJCIrdjIhekYlISIoJCImUyk9ISIiNyQkIitlJFt6RiUhIigkIiZdKT0hIiI3JCQiK1tlKnpGJSEiKCQiJmcpPSEiIjckJCIrV0sveVUhIigkIiZxKT0hIiI3JCQiK1kwNHlVISIoJCImISkpPSEiIjckJCIrYng4eVUhIigkIiYhKik9ISIiNyQkIitwWz15VSEiKCQiJisqPSEiIjckJCIqKj1CeVUhIickIiY1Kj0hIiI3JCQiKzwpeSN5VSEiKCQiJj8qPSEiIjckJCIqbEQkeVUhIickIiZJKj0hIiI3JCQiKlJzJHlVISInJCImUyo9ISIiNyQkIitOIT4leVUhIigkIiZdKj0hIiI3JCQiKyllbCV5VSEiKCQiJmcqPSEiIjckJCIrWj9eeVUhIigkIiZxKj0hIiI3JCQiKzclZSZ5VSEiKCQiJiEpKj0hIiI3JCQiKyRvLyd5VSEiKCQiJiEqKj0hIiI3JCQiK2kzbHlVISIoJCImKyE+ISIiNyQkIitZcHB5VSEiKCQiJjUhPiEiIjckJCIrUUh1eVUhIigkIiY/IT4hIiI3JCQiK04pKXl5VSEiKCQiJkkhPiEiIjckJCIqa00peVUhIickIiZTIT4hIiI3JCQiK14uKSl5VSEiKCQiJl0hPiEiIjckJCIrcGYjKnlVISIoJCImZyE+ISIiNyQkIiskXHIqeVUhIigkIiZxIT4hIiI3JCQiK0RwLHpVISIoJCImITM+ISIiNyQkIitqQTF6VSEiKCQiJiE0PiEiIjckJCIrM3Y1elUhIigkIiYrIj4hIiI3JCQiK2ZFOnpVISIoJCImNSI+ISIiNyQkIis9eD56VSEiKCQiJj8iPiEiIjckJCIrJW9VI3pVISIoJCImSSI+ISIiNyQkIitjdkd6VSEiKCQiJlMiPiEiIjckJCIrTkJMelUhIigkIiZdIj4hIiI3JCQiK0FxUHpVISIoJCImZyI+ISIiNyQkIis6O1V6VSEiKCQiJnEiPiEiIjckJCIrOmhZelUhIigkIiYhPT4hIiI3JCQiK0IwXnpVISIoJCImIT4+ISIiNyQkIitQW2J6VSEiKCQiJisjPiEiIjckJCIrZiEqZnpVISIoJCImNSM+ISIiNyQkIisoPVYnelUhIigkIiY/Iz4hIiI3JCQiK0Jzb3pVISIoJCImSSM+ISIiNyQkIittNnR6VSEiKCQiJlMjPiEiIjckJCIrPF14elUhIigkIiZdIz4hIiI3JCQiK3UoPSl6VSEiKCQiJmcjPiEiIjckJCIrUkMnKXpVISIoJCImcSM+ISIiNyQkIis2ZyEqelUhIigkIiYhRz4hIiI3JCQiKyJcXCp6VSEiKCQiJiFIPiEiIjckJCIreUcqKnpVISIoJCImKyQ+ISIiNyQkIitzaC4hRyUhIigkIiY1JD4hIiI3JCQiK3UkeitHJSEiKCQiJj8kPiEiIjckJCIrJFtBLEclISIoJCImSSQ+ISIiNyQkIiliOyFHJSEiJiQiJlMkPiEiIjckJCIrQyUzLUclISIoJCImXSQ+ISIiNyQkIitiN0QhRyUhIigkIiZnJD4hIiI3JCQiKyUqUkghRyUhIigkIiZxJD4hIiI3JCQiK1RtTCFHJSEiKCQiJiFRPiEiIjckJCIrJz56LkclISIoJCImIVI+ISIiNyQkIitlO1UhRyUhIigkIiYrJT4hIiI3JCQiK0ZTWSFHJSEiKCQiJjUlPiEiIjckJCIrL2pdIUclISIoJCImPyU+ISIiNyQkIisqW1swRyUhIigkIiZJJT4hIiI3JCQiKyNlIWYhRyUhIigkIiZTJT4hIiI3JCQiKyRlSzFHJSEiKCQiJl0lPiEiIjckJCIrIlx1MUclISIoJCImZyU+ISIiNyQkIisyanIhRyUhIigkIiZxJT4hIiI3JCQiK0ohZTJHJSEiKCQiJiFbPiEiIjckJCIraicqeiFHJSEiKCQiJiFcPiEiIjckJCIrLTclM0clISIoJCImKyY+ISIiNyQkIipsIykzRyUhIickIiY1Jj4hIiI3JCQiKzBTIzRHJSEiKCQiJj8mPiEiIjckJCIrcF8nNEclISIoJCImSSY+ISIiNyQkIipXMTVHJSEiJyQiJlMmPiEiIjckJCIqX1o1RyUhIickIiZdJj4hIiI3JCQiKzImKTMiRyUhIigkIiZnJj4hIiI3JCQiKy4lSDZHJSEiKCQiJnEmPiEiIjckJCIrMS08IkclISIoJCImIWU+ISIiNyQkIis9NEAiRyUhIigkIiYhZj4hIiI3JCQiK1E6RCJHJSEiKCQiJisnPiEiIjckJCIrbT9IIkclISIoJCImNSc+ISIiNyQkIistREwiRyUhIigkIiY/Jz4hIiI3JCQiK1lHUCJHJSEiKCQiJkknPiEiIjckJCIrKjQ4OUclISIoJCImUyc+ISIiNyQkIitmS1giRyUhIigkIiZdJz4hIiI3JCQiK0dMXCJHJSEiKCQiJmcnPiEiIjckJCIrMUxgIkclISIoJCImcSc+ISIiNyQkIisiPnQ6RyUhIigkIiYhbz4hIiI3JCQiKyYpSGgiRyUhIigkIiYhcD4hIiI3JCQiKylvXztHJSEiKCQiJisoPiEiIjckJCIrKUgjcCJHJSEiKCQiJjUoPiEiIjckJCIrPD10IkclISIoJCImPyg+ISIiNyQkIitYN3giRyUhIigkIiZJKD4hIiI3JCQiKyJlNT1HJSEiKCQiJlMoPiEiIjckJCIrRClcPUclISIoJCImXSg+ISIiNyQkIit5KikpPUclISIoJCImZyg+ISIiNyQkIiovRz5HJSEiJyQiJnEoPiEiIjckJCIqLG4+RyUhIickIiYheT4hIiI3JCQiKyopZSsjRyUhIigkIiYhej4hIiI3JCQiK3dZLyNHJSEiKCQiJispPiEiIjckJCIrckwzI0clISIoJCImNSk+ISIiNyQkIit3PjcjRyUhIigkIiY/KT4hIiI3JCQiKypbZ0BHJSEiKCQiJkkpPiEiIjckJCIqIiopPiNHJSEiJyQiJlMpPiEiIjckJCIrVHNCI0clISIoJCImXSk+ISIiNyQkIipbdkFHJSEiJyQiJmcpPiEiIjckJCIrR09KI0clISIoJCImcSk+ISIiNyQkIislb15CRyUhIigkIiYhKSk+ISIiNyQkIipsKlEjRyUhIickIiYhKik+ISIiNyQkIitDdlUjRyUhIigkIiYrKj4hIiI3JCQiKzJgWSNHJSEiKCQiJjUqPiEiIjckJCIrKipIXSNHJSEiKCQiJj8qPiEiIjckJCIrKmZTREclISIoJCImSSo+ISIiNyQkIis0InlERyUhIigkIiZTKj4hIiI3JCQiK0ZiaCNHJSEiKCQiJl0qPiEiIjckJCIrYkdsI0clISIoJCImZyo+ISIiNyQkIisiNCFwI0clISIoJCImcSo+ISIiNyQkIitPc3MjRyUhIigkIiYhKSo+ISIiNyQkIipIa0ZHJSEiJyQiJiEqKj4hIiI3JCQiK2E3IUdHJSEiKCQiJisrIyEiIjckJCIrRSJRR0clISIoJCImNSsjISIiNyQkIisyXChHRyUhIigkIiY/KyMhIiI3JCQiKyhmNkhHJSEiKCQiJkkrIyEiIjckJCIrKD5bSEclISIoJCImUysjISIiNyQkIiswWilIRyUhIigkIiZdKyMhIiI3JCQiK0I2LSRHJSEiKCQiJmcrIyEiIjckJCIqWGRJRyUhIickIiZxKyMhIiI3JCQiKydvJDQkRyUhIigkIiYhMz8hIiI3JCQiK0opSEpHJSEiKCQiJiE0PyEiIjckJCIrJillOyRHJSEiKCQiJissIyEiIjckJCIrWz0/JEclISIoJCImNSwjISIiNyQkIitAeEIkRyUhIigkIiY/LCMhIiI3JCQiKy5ORiRHJSEiKCQiJkksIyEiIjckJCIrJT40TEclISIoJCImUywjISIiNyQkIismeldMRyUhIigkIiZdLCMhIiI3JCQiKzAuUSRHJSEiKCQiJmcsIyEiIjckJCIrQ2RUJEclISIoJCImcSwjISIiNyQkIitfNVgkRyUhIigkIiYhPT8hIiI3JCQiKkgnWyRHJSEiJyQiJiE+PyEiIjckJCIrUDlfJEclISIoJCImKy0jISIiNyQkIislXGNORyUhIigkIiY1LSMhIiI3JCQiKlkiZiRHJSEiJyQiJj8tIyEiIjckJCIrTmppJEclISIoJCImSS0jISIiNyQkIio3aE9HJSEiJyQiJlMtIyEiIjckJCIrOmVwJEclISIoJCImXS0jISIiNyQkIis+L3QkRyUhIigkIiZnLSMhIiI3JCQiK0tcdyRHJSEiKCQiJnEtIyEiIjckJCIrYiQqeiRHJSEiKCQiJiFHPyEiIjckJCIrKG9MUUclISIoJCImIUg/ISIiNyQkIitIeidRRyUhIigkIiYrLiMhIiI3JCQiKyIzLVJHJSEiKCQiJjUuIyEiIjckJCIrVWgkUkclISIoJCImPy4jISIiNyQkIis3LChSRyUhIigkIiZJLiMhIiI3JCQiKyQqUislRyUhIigkIiZTLiMhIiI3JCQiKyR5UFNHJSEiKCQiJl0uIyEiIjckJCIrI1tyU0clISIoJCImZy4jISIiNyQkIisiNDBURyUhIigkIiZxLiMhIiI3JCQiKmhRVEclISInJCImIVE/ISIiNyQkIitSPzwlRyUhIigkIiYhUj8hIiI3JCQiK3hgPyVHJSEiKCQiJisvIyEiIjckJCIrRCdRVUclISIoJCImNS8jISIiNyQkIiskeXJVRyUhIigkIiY/LyMhIiI3JCQiK15bSSVHJSEiKCQiJkkvIyEiIjckJCIrR3lMJUclISIoJCImUy8jISIiNyQkIis6MlAlRyUhIigkIiZdLyMhIiI3JCQiKzdOUyVHJSEiKCQiJmcvIyEiIjckJCIrPmlWJUclISIoJCImcS8jISIiNyQkIitPKW9XRyUhIigkIiYhWz8hIiI3JCQiK2k4XSVHJSEiKCQiJiFcPyEiIjckJCIrKnpMWEclISIoJCImKzAjISIiNyQkIitYaGMlRyUhIigkIiY1MCMhIiI3JCQiKywlKWYlRyUhIigkIiY/MCMhIiI3JCQiK24waiVHJSEiKCQiJkkwIyEiIjckJCIrVkVtJUclISIoJCImUzAjISIiNyQkIitIWXAlRyUhIigkIiZdMCMhIiI3JCQiK0RscyVHJSEiKCQiJmcwIyEiIjckJCIrSiRlWkclISIoJCImcTAjISIiNyQkIitaK3olRyUhIigkIiYhZT8hIiI3JCQiK3Q7I1tHJSEiKCQiJiFmPyEiIjckJCIrM0smW0clISIoJCImKzEjISIiNyQkIithWSlbRyUhIigkIiY1MSMhIiI3JCQiKiw7XEclISInJCImPzEjISIiNyQkIit3cyVcRyUhIigkIiZJMSMhIiI3JCQiK18leVxHJSEiKCQiJlMxIyEiIjckJCIrUSY0XUclISIoJCImXTEjISIiNyQkIitOMC8mRyUhIigkIiZnMSMhIiI3JCQiK1Q5MiZHJSEiKCQiJnExIyEiIjckJCIrZUE1JkclISIoJCImIW8/ISIiNyQkIislKUg4JkclISIoJCImIXA/ISIiNyQkIitATzsmRyUhIigkIiYrMiMhIiI3JCQiK29UPiZHJSEiKCQiJjUyIyEiIjckJCIrRFlBJkclISIoJCImPzIjISIiNyQkIisjKlxEJkclISIoJCImSTIjISIiNyQkIipGJkcmRyUhIickIiZTMiMhIiI3JCQiK2VhSiZHJSEiKCQiJl0yIyEiIjckJCIrYmJNJkclISIoJCImZzIjISIiNyQkIitrYlAmRyUhIigkIiZxMiMhIiI3JCQiKyNbMGFHJSEiKCQiJiF5PyEiIjckJCIrNmBWJkclISIoJCImIXo/ISIiNyQkIiowbGFHJSEiJyQiJiszIyEiIjckJCIrKnAlXCZHJSEiKCQiJjUzIyEiIjckJCIrZlVfJkclISIoJCImPzMjISIiNyQkIitIUGImRyUhIigkIiZJMyMhIiI3JCQiKzRKZSZHJSEiKCQiJlMzIyEiIjckJCIrKlI3Y0clISIoJCImXTMjISIiNyQkIik7ayZHJSEiJiQiJmczIyEiIjckJCIrNjJuJkclISIoJCImcTMjISIiNyQkIitMKCpwJkclISIoJCImISkzIyEiIjckJCIrbCdHZEclISIoJCImISozIyEiIjckJCIrMnZ2JkclISIoJCImKzQjISIiNyQkIipFJ3kmRyUhIickIiY1NCMhIiI3JCQiK0NcImVHJSEiKCQiJj80IyEiIjckJCIrKFxWZUclISIoJCImSTQjISIiNyQkIisiKT4oZUclISIoJCImUzQjISIiNyQkIit3LiFmRyUhIigkIiZdNCMhIiI3JCQiKyJvR2ZHJSEiKCQiJmc0IyEiIjckJCIrJypvJmZHJSEiKCQiJnE0IyEiIjckJCIrQV0pZkclISIoJCImISk0IyEiIjckJCIrZkksJ0clISIoJCImISo0IyEiIjckJCIrMTUvJ0clISIoJCImKzUjISIiNyQkIitqKW9nRyUhIigkIiY1NSMhIiI3JCQiK0ptNCdHJSEiKCQiJj81IyEiIjckJCIqSkNoRyUhIickIiZJNSMhIiI3JCQiKyoqPTonRyUhIigkIiZTNSMhIiI3JCQiKylSemhHJSEiKCQiJl01IyEiIjckJCIrM28/J0clISIoJCImZzUjISIiNyQkIitIVEInRyUhIigkIiZxNSMhIiI3JCQiKk9oaUclISInJCImITNAISIiNyQkIistJilHJ0clISIoJCImITRAISIiNyQkIitiYkonRyUhIigkIiYrNiMhIiI3JCQiKz1ETSdHJSEiKCQiJjU2IyEiIjckJCIrI1JwakclISIoJCImPzYjISIiNyQkIit3aFInRyUhIigkIiZJNiMhIiI3JCQiK3JHVSdHJSEiKCQiJlM2IyEiIjckJCIreCVca0clISIoJCImXTYjISIiNyQkIiskKmZaJ0clISIoJCImZzYjISIiNyQkIipVLWxHJSEiJyQiJnE2IyEiIjckJCIrZShHbEclISIoJCImIT1AISIiNyQkIisxXWInRyUhIigkIiYhPkAhIiI3JCQiK2w2ZSdHJSEiKCQiJis3IyEiIjckJCIrTnNnJ0clISIoJCImNTcjISIiNyQkIis6S2onRyUhIigkIiY/NyMhIiI3JCQiKzEiZm1HJSEiKCQiJkk3IyEiIjckJCIrM1xvJ0clISIoJCImUzcjISIiNyQkIitAMXInRyUhIigkIiZdNyMhIiI3JCQiK1dpdCdHJSEiKCQiJmc3IyEiIjckJCIreTx3J0clISIoJCImcTcjISIiNyQkIitCc3knRyUhIigkIiYhR0AhIiI3JCQiK3lEIm9HJSEiKCQiJiFIQCEiIjckJCIrWHkkb0clISIoJCImKzgjISIiNyQkIitBSSdvRyUhIigkIiY1OCMhIiI3JCQiKjYpKW9HJSEiJyQiJj84IyEiIjckJCIrNEoicEclISIoJCImSTgjISIiNyQkIis9IVFwRyUhIigkIiZTOCMhIiI3JCQiK1FHJ3BHJSEiKCQiJl04IyEiIjckJCIrcHYpcEclISIoJCImZzgjISIiNyQkIis2QSwoRyUhIigkIiZxOCMhIiI3JCQiK2tuLihHJSEiKCQiJiFRQCEiIjckJCIrRzcxKEclISIoJCImIVJAISIiNyQkIistYzMoRyUhIigkIiYrOSMhIiI3JCQiKygpKTRyRyUhIigkIiY1OSMhIiI3JCQiKyQzTXJHJSEiKCQiJj85IyEiIjckJCIqPmVyRyUhIickIiZJOSMhIiI3JCQiKzNBPShHJSEiKCQiJlM5IyEiIjckJCIrUGg/KEclISIoJCImXTkjISIiNyQkIit4KkhzRyUhIigkIiZnOSMhIiI3JCQiK0ZQRChHJSEiKCQiJnE5IyEiIjckJCIrKVF4c0clISIoJCImIVtAISIiNyQkIitoNEkoRyUhIigkIiYhXEAhIiI3JCQiK1dXSyhHJSEiKCQiJis6IyEiIjckJCIrUXlNKEclISIoJCImNTojISIiNyQkIitWNlAoRyUhIigkIiY/OiMhIiI3JCQiK2ZWUihHJSEiKCQiJkk6IyEiIjckJCIrJls8dUclISIoJCImUzojISIiNyQkIitCMFcoRyUhIigkIiZdOiMhIiI3JCQiK3NNWShHJSEiKCQiJmc6IyEiIjckJCIrSmpbKEclISIoJCImcTojISIiNyQkIistIjR2RyUhIigkIiYhZUAhIiI3JCQiKyR5SnZHJSEiKCQiJiFmQCEiIjckJCIrd1ZiKEclISIoJCImKzsjISIiNyQkIit6b2QoRyUhIigkIiY1OyMhIiI3JCQiKyRIKmYoRyUhIigkIiY/OyMhIiI3JCQiKz47aShHJSEiKCQiJkk7IyEiIjckJCIrYlFrKEclISIoJCImUzsjISIiNyQkIistZ20oRyUhIigkIiZdOyMhIiI3JCQiK2ghKW8oRyUhIigkIiZnOyMhIiI3JCQiKi41eEclISInJCImcTsjISIiNyQkIioiPnQoRyUhIickIiYhb0AhIiI3JCQiKyxQdihHJSEiKCQiJiFwQCEiIjckJCIrLmF4KEclISIoJCImKzwjISIiNyQkIis7cXooRyUhIigkIiY1PCMhIiI3JCQiK1QmPXlHJSEiKCQiJj88IyEiIjckJCIrdypSeUclISIoJCImSTwjISIiNyQkIitBOCd5RyUhIigkIiZTPCMhIiI3JCQiK3pEKXlHJSEiKCQiJl08IyEiIjckJCIrWlAhekclISIoJCImZzwjISIiNyQkIitGWyN6RyUhIigkIiZxPCMhIiI3JCQiKzxlJXpHJSEiKCQiJiF5QCEiIjckJCIrPW4nekclISIoJCImIXpAISIiNyQkIipgKCl6RyUhIickIiYrPSMhIiI3JCQiK2EjMyEpRyUhIigkIiY1PSMhIiI3JCQiKykpKUchKUclISIoJCImPz0jISIiNyQkIitMJVwhKUclISIoJCImST0jISIiNyQkIioqKXAhKUclISInJCImUz0jISIiNyQkIitkLTQpRyUhIigkIiZdPSMhIiI3JCQiK08wNilHJSEiKCQiJmc9IyEiIjckJCIrRDI4KUclISIoJCImcT0jISIiNyQkIitFMzopRyUhIigkIiYhKT0jISIiNyQkIitRMzwpRyUhIigkIiYhKj0jISIiNyQkIip3IT4pRyUhIickIiYrPiMhIiI3JCQiKyVmNSMpRyUhIigkIiY1PiMhIiI3JCQiK1IuQilHJSEiKCQiJj8+IyEiIjckJCIrJioqXCMpRyUhIigkIiZJPiMhIiI3JCQiK2kmcCMpRyUhIigkIiZTPiMhIiI3JCQiK1IhKkcpRyUhIigkIiZdPiMhIiI3JCQiK0clMyQpRyUhIigkIiZnPiMhIiI3JCQiK0h4SylHJSEiKCQiJnE+IyEiIjckJCIqJXBNKUclISInJCImISk+IyEiIjckJCIraWdPKUclISIoJCImISo+IyEiIjckJCIrJjQmUSlHJSEiKCQiJis/IyEiIjckJCIqLy8lKUclISInJCImNT8jISIiNyQkIismKkdVKUclISIoJCImPz8jISIiNyQkIitoO1cpRyUhIigkIiZJPyMhIiI3JCQiK1IuWSlHJSEiKCQiJlM/IyEiIjckJCIrRip5JSlHJSEiKCQiJl0/IyEiIjckJCIrRnVcKUclISIoJCImZz8jISIiNyQkIitRZV4pRyUhIigkIiZxPyMhIiI3JCQiKjtNJilHJSEiJyQiJiEzQSEiIjckJCIrJFJfJilHJSEiKCQiJiE0QSEiIjckJCIrTzBkKUclISIoJCImK0AjISIiNyQkIisiZillKUclISIoJCImNUAjISIiNyQkIitlbGcpRyUhIigkIiY/QCMhIiI3JCQiK05XaSlHJSEiKCQiJklAIyEiIjckJCIrQkFrKUclISIoJCImU0AjISIiNyQkIitBKmYnKUclISIoJCImXUAjISIiNyQkIitMdm4pRyUhIigkIiZnQCMhIiI3JCQiK2FdcClHJSEiKCQiJnFAIyEiIjckJCIrJ1s3KClHJSEiKCQiJiE9QSEiIjckJCIqJClIKClHJSEiJyQiJiE+QSEiIjckJCIrJjNaKClHJSEiKCQiJitBIyEiIjckJCIqRGsoKUclISInJCImNUEjISIiNyQkIitGOHkpRyUhIigkIiY/QSMhIiI3JCQiKzokKXopRyUhIigkIiZJQSMhIiI3JCQiKzlfIikpRyUhIigkIiZTQSMhIiI3JCQiK0M/JCkpRyUhIigkIiZdQSMhIiI3JCQiK1goWykpRyUhIigkIiZnQSMhIiI3JCQiK3hgJykpRyUhIigkIiZxQSMhIiI3JCQiKiM+KSkpRyUhIickIiYhR0EhIiI3JCQiK3UkKSopKUclISIoJCImIUhBISIiNyQkIitSWiIqKUclISIoJCImK0IjISIiNyQkIis6NSQqKUclISIoJCImNUIjISIiNyQkIisucyUqKUclISIoJCImP0IjISIiNyQkIissTCcqKUclISIoJCImSUIjISIiNyQkIipKeiopRyUhIickIiZTQiMhIiI3JCQiK0pfKiopRyUhIigkIiZdQiMhIiI3JCQiK2k1LCpHJSEiKCQiJmdCIyEiIjckJCIrMG8tKkclISIoJCImcUIjISIiNyQkIitlQy8qRyUhIigkIiYhUUEhIiI3JCQiK0IhZSEqRyUhIigkIiYhUkEhIiI3JCQiKylcdCEqRyUhIigkIiYrQyMhIiI3JCQiKyYpKSkzKkclISIoJCImNUMjISIiNyQkIisjPS8iKkclISIoJCImP0MjISIiNyQkIisiUj4iKkclISIoJCImSUMjISIiNyQkIis2WDgqRyUhIigkIiZTQyMhIiI3JCQiK1QmXCIqRyUhIigkIiZdQyMhIiI3JCQiKyRbayIqRyUhIigkIiZnQyMhIiI3JCQiK08keiIqRyUhIigkIiZxQyMhIiI3JCQiKyo0JT4qRyUhIigkIiYhW0EhIiI3JCQiK3UoMyMqRyUhIigkIiYhXEEhIiI3JCQiKk9CIypHJSEiJyQiJitEIyEiIjckJCIrZHlCKkclISIoJCImNUQjISIiNyQkIitrQUQqRyUhIigkIiY/RCMhIiI3JCQiKyRlbSMqRyUhIigkIiZJRCMhIiI3JCQiKzczRypHJSEiKCQiJlNEIyEiIjckJCIrYFxIKkclISIoJCImXUQjISIiNyQkIiswITQkKkclISIoJCImZ0QjISIiNyQkIituSEsqRyUhIigkIiZxRCMhIiI3JCQiK1RvTCpHJSEiKCQiJiFlQSEiIjckJCIrRDFOKkclISIoJCImIWZBISIiNyQkIitAVk8qRyUhIigkIiYrRSMhIiI3JCQiK0Z6UCpHJSEiKCQiJjVFIyEiIjckJCIrVzlSKkclISIoJCImP0UjISIiNyQkIitzW1MqRyUhIigkIiZJRSMhIiI3JCQiKzcjPSUqRyUhIigkIiZTRSMhIiI3JCQiK2k5VipHJSEiKCQiJl1FIyEiIjckJCIrQllXKkclISIoJCImZ0UjISIiNyQkIismcGQlKkclISIoJCImcUUjISIiNyQkIit5MVoqRyUhIigkIiYhb0EhIiI3JCQiK3JOWypHJSEiKCQiJiFwQSEiIjckJCIrd2pcKkclISIoJCImK0YjISIiNyQkIisjNDQmKkclISIoJCImNUYjISIiNyQkIis9PF8qRyUhIigkIiY/RiMhIiI3JCQiK2JVYCpHJSEiKCQiJklGIyEiIjckJCIrL25hKkclISIoJCImU0YjISIiNyQkIitqIWYmKkclISIoJCImXUYjISIiNyQkIitMOGQqRyUhIigkIiZnRiMhIiI3JCQiKzhOZSpHJSEiKCQiJnFGIyEiIjckJCIrMGNmKkclISIoJCImIXlBISIiNyQkIiszd2cqRyUhIigkIiYhekEhIiI3JCQiK0AmPicqRyUhIigkIiYrRyMhIiI3JCQiK1g4aipHJSEiKCQiJjVHIyEiIjckJCIqM1YnKkclISInJCImP0cjISIiNyQkIitFWmwqRyUhIigkIiZJRyMhIiI3JCQiKyRHbScqRyUhIigkIiZTRyMhIiI3JCQiKnZ4JypHJSEiJyQiJl1HIyEiIjckJCIrSCIqbypHJSEiKCQiJmdHIyEiIjckJCIrPS9xKkclISIoJCImcUcjISIiNyQkIis8O3IqRyUhIigkIiYhKUcjISIiNyQkIitHRnMqRyUhIigkIiYhKkcjISIiNyQkIitcUHQqRyUhIigkIiYrSCMhIiI3JCQiKyNvVygqRyUhIigkIiY1SCMhIiI3JCQiK0RidipHJSEiKCQiJj9IIyEiIjckJCIreWl3KkclISIoJCImSUgjISIiNyQkIitWcHgqRyUhIigkIiZTSCMhIiI3JCQiKz12eSpHJSEiKCQiJl1IIyEiIjckJCIrLyEpeipHJSEiKCQiJmdIIyEiIjckJCIpJTMpKkclISImJCImcUgjISIiNyQkIisyKD0pKkclISIoJCImISlIIyEiIjckJCIrRCpHKSpHJSEiKCQiJiEqSCMhIiI3JCQiK2EhUikqRyUhIigkIiYrSSMhIiI3JCQiKyQ0XCkqRyUhIigkIiY1SSMhIiI3JCQiK1chZikqRyUhIigkIiY/SSMhIiI3JCQiKy8qbykqRyUhIigkIiZJSSMhIiI3JCQiK3cneSkqRyUhIigkIiZTSSMhIiI3JCQiK2UkKSkpKkclISIoJCImXUkjISIiNyQkIiomeiopKkclISInJCImZ0kjISIiNyQkIitgdSEqKkclISIoJCImcUkjISIiNyQkIitubyIqKkclISIoJCImITNCISIiNyQkIisjPkUqKkclISIoJCImITRCISIiNyQkIitGYSQqKkclISIoJCImK0ojISIiNyQkIit0WCUqKkclISIoJCImNUojISIiNyQkIitITyYqKkclISIoJCImP0ojISIiNyQkIisnZmkqKkclISIoJCImSUojISIiNyQkIit0OSgqKkclISIoJCImU0ojISIiNyQkIitoLSkqKkclISIoJCImXUojISIiNyQkIionKikpKipHJSEiJyQiJmdKIyEiIjckJCIrcHYqKipHJSEiKCQiJnFKIyEiIjckJCIrKTMxK0glISIoJCImIT1CISIiNyQkIis9WCwhSCUhIigkIiYhPkIhIiI3JCQiK2ZHLSFIJSEiKCQiJitLIyEiIjckJCIqNkorSCUhIickIiY1SyMhIiI3JCQiK3IjUitIJSEiKCQiJj9LIyEiIjckJCIrVnQvIUglISIoJCImSUsjISIiNyQkIitFYDAhSCUhIigkIiZTSyMhIiI3JCQiKz5LMSFIJSEiKCQiJl1LIyEiIjckJCIrQTUyIUglISIoJCImZ0sjISIiNyQkIitPKHkrSCUhIigkIiZxSyMhIiI3JCQiKk8nMyFIJSEiJyQiJiFHQiEiIjckJCIrJipRNCFIJSEiKCQiJiFIQiEiIjckJCIqTSwsSCUhIickIiYrTCMhIiI3JCQiKyZwMyxIJSEiKCQiJjVMIyEiIjckJCIraGY2IUglISIoJCImP0wjISIiNyQkIitQSjchSCUhIigkIiZJTCMhIiI3JCQiK0ItOCFIJSEiKCQiJlNMIyEiIjckJCIqQVAsSCUhIickIiZdTCMhIiI3JCQiK0ZUOSFIJSEiKCQiJmdMIyEiIjckJCIrWDQ6IUglISIoJCImcUwjISIiNyQkIitzdzohSCUhIigkIiYhUUIhIiI3JCQiKkprLEglISInJCImIVJCISIiNyQkIitmMzwhSCUhIigkIiYrTSMhIiI3JCQiKzx0PCFIJSEiKCQiJjVNIyEiIjckJCIrJ28kPSFIJSEiKCQiJj9NIyEiIjckJCIrbCoqPSFIJSEiKCQiJklNIyEiIjckJCIrYWg+IUglISIoJCImU00jISIiNyQkIithQT8hSCUhIigkIiZdTSMhIiI3JCQiK2ojMy1IJSEiKCQiJmdNIyEiIjckJCIrJD05LUglISIoJCImcU0jISIiNyQkIis4K0EhSCUhIigkIiYhW0IhIiI3JCQiK2BkQSFIJSEiKCQiJiFcQiEiIjckJCIrLzlCIUglISIoJCImK04jISIiNyQkIitrcEIhSCUhIigkIiY1TiMhIiI3JCQiK05DQyFIJSEiKCQiJj9OIyEiIjckJCIrOnlDIUglISIoJCImSU4jISIiNyQkIisxSkQhSCUhIigkIiZTTiMhIiI3JCQiKzIkZS1IJSEiKCQiJl1OIyEiIjckJCIrPU1FIUglISIoJCImZ04jISIiNyQkIitSJW8tSCUhIigkIiZxTiMhIiI3JCQiKlB0LUglISInJCImIWVCISIiNyQkIis2I3ktSCUhIigkIiYhZkIhIiI3JCQiK2lIRyFIJSEiKCQiJitPIyEiIjckJCIrQndHIUglISIoJCImNU8jISIiNyQkIislPiNIIUglISIoJCImP08jISIiNyQkIit1bUghSCUhIigkIiZJTyMhIiI3JCQiK2w1SSFIJSEiKCQiJlNPIyEiIjckJCIrbWBJIUglISIoJCImXU8jISIiNyQkIit4JjQuSCUhIigkIiZnTyMhIiI3JCQiKylwOC5IJSEiKCQiJnFPIyEiIjckJCIrR3hKIUglISIoJCImIW9CISIiNyQkIitvO0shSCUhIigkIiYhcEIhIiI3JCQiKz5iSyFIJSEiKCQiJitQIyEiIjckJCIreiNILkglISIoJCImNVAjISIiNyQkIitcSEwhSCUhIigkIiY/UCMhIiI3JCQiK0dsTCFIJSEiKCQiJklQIyEiIjckJCIrPStNIUglISIoJCImU1AjISIiNyQkIis8TU0hSCUhIigkIiZdUCMhIiI3JCQiK0VuTSFIJSEiKCQiJmdQIyEiIjckJCIrWCpcLkglISIoJCImcVAjISIiNyQkIit1SU4hSCUhIigkIiYheUIhIiI3JCQiKzdoTiFIJSEiKCQiJiF6QiEiIjckJCIqMWYuSCUhIickIiYrUSMhIiI3JCQiKzw+TyFIJSEiKCQiJjVRIyEiIjckJCIrJm9rLkglISIoJCImP1EjISIiNyQkIitpdE8hSCUhIigkIiZJUSMhIiI3JCQiK1sqcC5IJSEiKCQiJlNRIyEiIjckJCIrV0NQIUglISIoJCImXVEjISIiNyQkIiomW1AhSCUhIickIiZnUSMhIiI3JCQiK21yUCFIJSEiKCQiJnFRIyEiIjckJCIqUnouSCUhIickIiYhKVEjISIiNyQkIitEOlEhSCUhIigkIiYhKlEjISIiNyQkIitwTlEhSCUhIigkIiYrUiMhIiI3JCQiK0FiUSFIJSEiKCQiJjVSIyEiIjckJCIrJlEoUSFIJSEiKCQiJj9SIyEiIjckJCIrZSIqUSFIJSEiKCQiJklSIyEiIjckJCIqJTNSIUglISInJCImU1IjISIiNyQkIitKQ1IhSCUhIigkIiZdUiMhIiI3JCQiK0tSUiFIJSEiKCQiJmdSIyEiIjckJCIrVWBSIUglISIoJCImcVIjISIiNyQkIitpbVIhSCUhIigkIiYhKVIjISIiNyQkIisiKnlSIUglISIoJCImISpSIyEiIjckJCIrSCEqUiFIJSEiKCQiJitTIyEiIjckJCIreCtTIUglISIoJCImNVMjISIiNyQkIitNNVMhSCUhIigkIiY/UyMhIiI3JCQiKT5TIUglISImJCImSVMjISIiNyQkIit2RVMhSCUhIigkIiZTUyMhIiI3JCQiKk8uL0glISInJCImXVMjISIiNyQkIithUlMhSCUhIigkIiZnUyMhIiI3JCQiK2RXUyFIJSEiKCQiJnFTIyEiIjckJCIqKFtTIUglISInJCImITNDISIiNyQkIisiPjAvSCUhIigkIiYhNEMhIiI3JCQiK0FhUyFIJSEiKCQiJitUIyEiIjckJCIraWJTIUglISIoJCImNVQjISIiNyQkIis2Y1MhSCUhIigkIiY/VCMhIiI3JCQiK3BiUyFIJSEiKCQiJklUIyEiIjckJCIrT2FTIUglISIoJCImU1QjISIiNyQkIis4X1MhSCUhIigkIiZdVCMhIiI3JCQiKykqW1MhSCUhIigkIiZnVCMhIiI3JCQiKyNcLy9IJSEiKCQiJnFUIyEiIjckJCIrJipSUyFIJSEiKCQiJiE9QyEiIjckJCIrM01TIUglISIoJCImIT5DISIiNyQkIitIRlMhSCUhIigkIiYrVSMhIiI3JCQiK2Y+UyFIJSEiKCQiJjVVIyEiIjckJCIrKTQsL0glISIoJCImP1UjISIiNyQkIitZLFMhSCUhIigkIiZJVSMhIiI3JCQiKy4iKlIhSCUhIigkIiZTVSMhIiI3JCQiK3B6UiFIJSEiKCQiJl1VIyEiIjckJCIrVm5SIUglISIoJCImZ1UjISIiNyQkIitGYVIhSCUhIigkIiZxVSMhIiI3JCQiKz5TUiFIJSEiKCQiJiFHQyEiIjckJCIqXyNSIUglISInJCImIUhDISIiNyQkIiokNFIhSCUhIickIiYrViMhIiI3JCQiK1sjKlEhSCUhIigkIiY1ViMhIiI3JCQiK3Z1USFIJSEiKCQiJj9WIyEiIjckJCIrNmNRIUglISIoJCImSVYjISIiNyQkIitiT1EhSCUhIigkIiZTViMhIiI3JCQiKzM7USFIJSEiKCQiJl1WIyEiIjckJCIqWnouSCUhIickIiZnViMhIiI3JCQiKkN4LkglISInJCImcVYjISIiNyQkIis+XFAhSCUhIigkIiYhUUMhIiI3JCQiKzJEUCFIJSEiKCQiJiFSQyEiIjckJCIrLStQIUglISIoJCImK1cjISIiNyQkIisydU8hSCUhIigkIiY1VyMhIiI3JCQiKnNrLkglISInJCImP1cjISIiNyQkIitUPk8hSCUhIigkIiZJVyMhIiI3JCQiK3IhZi5IJSEiKCQiJlNXIyEiIjckJCIrNGhOIUglISIoJCImXVcjISIiNyQkIitjSU4hSCUhIigkIiZnVyMhIiI3JCQiKzYqXC5IJSEiKCQiJnFXIyEiIjckJCIrdW1NIUglISIoJCImIVtDISIiNyQkIitZTE0hSCUhIigkIiYhXEMhIiI3JCQiK0UqUi5IJSEiKCQiJitYIyEiIjckJCIrOWtMIUglISIoJCImNVgjISIiNyQkIioiR0whSCUhIickIiY/WCMhIiI3JCQiKzoiSC5IJSEiKCQiJklYIyEiIjckJCIrR2BLIUglISIoJCImU1gjISIiNyQkIitcOUshSCUhIigkIiZdWCMhIiI3JCQiK3l1SiFIJSEiKCQiJmdYIyEiIjckJCIrOk1KIUglISIoJCImcVgjISIiNyQkIipFNC5IJSEiJyQiJiFlQyEiIjckJCIrOV1JIUglISIoJCImIWZDISIiNyQkIit2MUkhSCUhIigkIiYrWSMhIiI3JCQiK1hpSCFIJSEiKCQiJjVZIyEiIjckJCIrQTxIIUglISIoJCImP1kjISIiNyQkIiszckchSCUhIigkIiZJWSMhIiI3JCQiKyxDRyFIJSEiKCQiJlNZIyEiIjckJCIrLndGIUglISIoJCImXVkjISIiNyQkIis3RkYhSCUhIigkIiZnWSMhIiI3JCQiK0h4RSFIJSEiKCQiJnFZIyEiIjckJCIrYUVFIUglISIoJCImIW9DISIiNyQkIisoW2QtSCUhIigkIiYhcEMhIiI3JCQiK0ZBRCFIJSEiKCQiJitaIyEiIjckJCIrd29DIUglISIoJCImNVojISIiNyQkIitLOUMhSCUhIigkIiY/WiMhIiI3JCQiKyYqZUIhSCUhIigkIiZJWiMhIiI3JCQiK24tQiFIJSEiKCQiJlNaIyEiIjckJCIrWVhBIUglISIoJCImXVojISIiNyQkIitMKD0tSCUhIigkIiZnWiMhIiI3JCQiK0ZHQCFIJSEiKCQiJnFaIyEiIjckJCIrSG8/IUglISIoJCImIXlDISIiNyQkIitSMj8hSCUhIigkIiYhekMhIiI3JCQiK2NYPiFIJSEiKCQiJitbIyEiIjckJCIqRyk9IUglISInJCImNVsjISIiNyQkIis3Pj0hSCUhIigkIiY/WyMhIiI3JCQiK19hPCFIJSEiKCQiJklbIyEiIjckJCIrKiopbyxIJSEiKCQiJlNbIyEiIjckJCIrYEE7IUglISIoJCImXVsjISIiNyQkIis5YjohSCUhIigkIiZnWyMhIiI3JCQiKyRvWyxIJSEiKCQiJnFbIyEiIjckJCIqd1QsSCUhIickIiYhKVsjISIiNyQkIitWWjghSCUhIigkIiYhKlsjISIiNyQkIitNdzchSCUhIigkIiYrXCMhIiI3JCQiK0svNyFIJSEiKCQiJjVcIyEiIjckJCIrUEo2IUglISIoJCImP1wjISIiNyQkIip2MCxIJSEiJyQiJklcIyEiIjckJCIrcCMpNCFIJSEiKCQiJlNcIyEiIjckJCIrJ3AhNCFIJSEiKCQiJl1cIyEiIjckJCIrSEkzIUglISIoJCImZ1wjISIiNyQkIipGditIJSEiJyQiJnFcIyEiIjckJCIrPXUxIUglISIoJCImISlcIyEiIjckJCIrcyVmK0glISIoJCImISpcIyEiIjckJCIrTTkwIUglISIoJCImK10jISIiNyQkIisuTC8hSCUhIigkIiY1XSMhIiI3JCQiK3ldLiFIJSEiKCQiJj9dIyEiIjckJCIraG4tIUglISIoJCImSV0jISIiNyQkIipOPStIJSEiJyQiJlNdIyEiIjckJCIrWSk0K0glISIoJCImXV0jISIiNyQkIitcNyshSCUhIigkIiZnXSMhIiI3JCQiK2VEKioqRyUhIigkIiZxXSMhIiI3JCQiK3ZQKSoqRyUhIigkIiYhM0QhIiI3JCQiKykqWygqKkclISIoJCImITREISIiNyQkIitGZicqKkclISIoJCImK14jISIiNyQkIitqbyYqKkclISIoJCImNV4jISIiNyQkIisxeCUqKkclISIoJCImP14jISIiNyQkIitjJVEqKkclISIoJCImSV4jISIiNyQkIis3IkgqKkclISIoJCImU14jISIiNyQkIit1Jz4qKkclISIoJCImXV4jISIiNyQkIitWLCIqKkclISIoJCImZ14jISIiNyQkIis9MCEqKkclISIoJCImcV4jISIiNyQkIikzKikqRyUhIiYkIiYhPUQhIiI3JCQiKykpNCkpKkclISIoJCImIT5EISIiNyQkIiskM3IpKkclISIoJCImK18jISIiNyQkIislM2gpKkclISIoJCImNV8jISIiNyQkIisiKjQmKSpHJSEiKCQiJj9fIyEiIjckJCIrLzMlKSpHJSEiKCQiJklfIyEiIjckJCIrQzAkKSpHJSEiKCQiJlNfIyEiIjckJCIrXCwjKSpHJSEiKCQiJl1fIyEiIjckJCIrIm80KSpHJSEiKCQiJmdfIyEiIjckJCIrPiIqeipHJSEiKCQiJnFfIyEiIjckJCIraiUpeSpHJSEiKCQiJiFHRCEiIjckJCIrOXh4KkclISIoJCImIUhEISIiNyQkIioob3cqRyUhIickIiYrYCMhIiI3JCQiK0tmdipHJSEiKCQiJjVgIyEiIjckJCIpXHUqRyUhIiYkIiY/YCMhIiI3JCQiK3VQdCpHJSEiKCQiJklgIyEiIjckJCIrYURzKkclISIoJCImU2AjISIiNyQkIipDNigqRyUhIickIiZdYCMhIiI3JCQiK0opKnAqRyUhIigkIiZnYCMhIiI3JCQiK0gkKW8qRyUhIigkIiZxYCMhIiI3JCQiK0tubipHJSEiKCQiJiFRRCEiIjckJCIrVF1tKkclISIoJCImIVJEISIiNyQkIitiS2wqRyUhIigkIiYrYSMhIiI3JCQiK3Y4aypHJSEiKCQiJjVhIyEiIjckJCIrLCVIJypHJSEiKCQiJj9hIyEiIjckJCIrS3RoKkclISIoJCImSWEjISIiNyQkIitwXmcqRyUhIigkIiZTYSMhIiI3JCQiKzdIZipHJSEiKCQiJl1hIyEiIjckJCIqYyFlKkclISInJCImZ2EjISIiNyQkIis4Im8mKkclISIoJCImcWEjISIiNyQkIitzYmIqRyUhIigkIiYhW0QhIiI3JCQiK09IYSpHJSEiKCQiJiFcRCEiIjckJCIrMC1gKkclISIoJCImK2IjISIiNyQkIipRPCYqRyUhIickIiY1YiMhIiI3JCQiKlkvJipHJSEiJyQiJj9iIyEiIjckJCIrWDlcKkclISIoJCImSWIjISIiNyQkIitOJHklKkclISIoJCImU2IjISIiNyQkIitKXlkqRyUhIigkIiZdYiMhIiI3JCQiK0s9WCpHJSEiKCQiJmdiIyEiIjckJCIrUCVRJSpHJSEiKCQiJnFiIyEiIjckJCIrW1xVKkclISIoJCImIWVEISIiNyQkIitrOFQqRyUhIigkIiYhZkQhIiI3JCQiKyZvKFIqRyUhIigkIiYrYyMhIiI3JCQiKiJSUSpHJSEiJyQiJjVjIyEiIjckJCIrVCtQKkclISIoJCImP2MjISIiNyQkIit3Z04qRyUhIigkIiZJYyMhIiI3JCQiKzw/TSpHJSEiKCQiJlNjIyEiIjckJCIraXlLKkclISIoJCImXWMjISIiNyQkIis2T0oqRyUhIigkIiZnYyMhIiI3JCQiK20jKkgqRyUhIigkIiZxYyMhIiI3JCQiK0RbRypHJSEiKCQiJiFvRCEiIjckJCIrKkdxIypHJSEiKCQiJiFwRCEiIjckJCIrZGNEKkclISIoJCImK2QjISIiNyQkIiokNEMqRyUhIickIiY1ZCMhIiI3JCQiKzNoQSpHJSEiKCQiJj9kIyEiIjckJCIqPjYjKkclISInJCImSWQjISIiNyQkIit3aD4qRyUhIigkIiZTZCMhIiI3JCQiK241PSpHJSEiKCQiJl1kIyEiIjckJCIraWU7KkclISIoJCImZ2QjISIiNyQkIitpMDoqRyUhIigkIiZxZCMhIiI3JCQiK2xeOCpHJSEiKCQiJiF5RCEiIjckJCIrdCc+IipHJSEiKCQiJiF6RCEiIjckJCIrJzMvIipHJSEiKCQiJitlIyEiIjckJCIrLSUpMypHJSEiKCQiJjVlIyEiIjckJCIrQUUyKkclISIoJCImP2UjISIiNyQkIitabjAqRyUhIigkIiZJZSMhIiI3JCQiK3cyLypHJSEiKCQiJlNlIyEiIjckJCIrM1otKkclISIoJCImXWUjISIiNyQkIitYJjMhKkclISIoJCImZ2UjISIiNyQkIismRyMqKilHJSEiKCQiJnFlIyEiIjckJCIqJGYoKilHJSEiJyQiJiEpZSMhIiI3JCQiK3klZiopRyUhIigkIiYhKmUjISIiNyQkIiokSCUqKUclISInJCImK2YjISIiNyQkIisnR0UqKUclISIoJCImNWYjISIiNyQkIitZJjQqKUclISIoJCImP2YjISIiNyQkIis0RiopKUclISIoJCImSWYjISIiNyQkIit3ZCgpKUclISIoJCImU2YjISIiNyQkIitZKGUpKUclISIoJCImXWYjISIiNyQkIippVCkpRyUhIickIiZnZiMhIiI3JCQiKylSQykpRyUhIigkIiZxZiMhIiI3JCQiK3pxISkpRyUhIigkIiYhKWYjISIiNyQkIitqJyp5KUclISIoJCImISpmIyEiIjckJCIrXkB4KUclISIoJCImK2cjISIiNyQkIitVWHYpRyUhIigkIiY1ZyMhIiI3JCQiK1BvdClHJSEiKCQiJj9nIyEiIjckJCIrTSE+KClHJSEiKCQiJklnIyEiIjckJCIrTjZxKUclISIoJCImU2cjISIiNyQkIio5JG8pRyUhIickIiZdZyMhIiI3JCQiK1pdbSlHJSEiKCQiJmdnIyEiIjckJCIrZG9rKUclISIoJCImcWcjISIiNyQkIityJkcnKUclISIoJCImITNFISIiNyQkIisoPTUnKUclISIoJCImITRFISIiNyQkIisxPGYpRyUhIigkIiYraCMhIiI3JCQiK0hKZClHJSEiKCQiJjVoIyEiIjckJCIrYVdiKUclISIoJCImP2gjISIiNyQkIisjb04mKUclISIoJCImSWgjISIiNyQkIis4b14pRyUhIigkIiZTaCMhIiI3JCQiK1l5XClHJSEiKCQiJl1oIyEiIjckJCIrI3l5JSlHJSEiKCQiJmdoIyEiIjckJCIrQCdmJSlHJSEiKCQiJnFoIyEiIjckJCIrai5XKUclISIoJCImIT1FISIiNyQkIisyNVUpRyUhIigkIiYhPkUhIiI3JCQiK2A6UylHJSEiKCQiJitpIyEiIjckJCIrLT9RKUclISIoJCImNWkjISIiNyQkIithQk8pRyUhIigkIiY/aSMhIiI3JCQiKzJFTSlHJSEiKCQiJklpIyEiIjckJCIrakZLKUclISIoJCImU2kjISIiNyQkIitBR0kpRyUhIigkIiZdaSMhIiI3JCQiKyR5I0cpRyUhIigkIiZnaSMhIiI3JCQiK1hFRSlHJSEiKCQiJnFpIyEiIjckJCIrNkNDKUclISIoJCImIUdFISIiNyQkIit5P0EpRyUhIigkIiYhSEUhIiI3JCQiK1o7PylHJSEiKCQiJitqIyEiIjckJCIrPTY9KUclISIoJCImNWojISIiNyQkIisiXGciKUclISIoJCImP2ojISIiNyQkIittKFIiKUclISIoJCImSWojISIiNyQkIitWKj0iKUclISIoJCImU2ojISIiNyQkIitBISk0KUclISIoJCImXWojISIiNyQkIisucTIpRyUhIigkIiZnaiMhIiI3JCQiKyYpZTApRyUhIigkIiZxaiMhIiI3JCQiK3BZLilHJSEiKCQiJiFRRSEiIjckJCIrYUwsKUclISIoJCImIVJFISIiNyQkIitVPip6RyUhIigkIiYrayMhIiI3JCQiKlZxekclISInJCImNWsjISIiNyQkIitAKVt6RyUhIigkIiY/ayMhIiI3JCQiKzdyI3pHJSEiKCQiJklrIyEiIjckJCIrMGAhekclISIoJCImU2sjISIiNyQkIilNKXlHJSEiJiQiJl1rIyEiIjckJCIrJlJoeUclISIoJCImZ2sjISIiNyQkIisjSFJ5RyUhIigkIiZxayMhIiI3JCQiKjQ8eUclISInJCImIVtFISIiNyQkIip6JXooRyUhIickIiYhXEUhIiI3JCQiKlJzeEclISInJCImK2wjISIiNyQkIisjKilceEclISIoJCImNWwjISIiNyQkIislSEZ4RyUhIigkIiY/bCMhIiI3JCQiKyhmL3hHJSEiKCQiJklsIyEiIjckJCIrLT1vKEclISIoJCImU2wjISIiNyQkIisyKmV3RyUhIigkIiZdbCMhIiI3JCQiKzhmaihHJSEiKCQiJmdsIyEiIjckJCIrPkdoKEclISIoJCImcWwjISIiNyQkIitGJyplKEclISIoJCImIWVFISIiNyQkIitOamMoRyUhIigkIiYhZkUhIiI3JCQiK1dIYShHJSEiKCQiJittIyEiIjckJCIrYCU+dkclISIoJCImNW0jISIiNyQkIitpZVwoRyUhIigkIiY/bSMhIiI3JCQiK3NAWihHJSEiKCQiJkltIyEiIjckJCIrJFFbdUclISIoJCImU20jISIiNyQkIislXEN1RyUhIigkIiZdbSMhIiI3JCQiKzAwUyhHJSEiKCQiJmdtIyEiIjckJCIrO2tQKEclISIoJCImcW0jISIiNyQkIitHQU4oRyUhIigkIiYhb0UhIiI3JCQiKiV6SyhHJSEiJyQiJiFwRSEiIjckJCIrXk5JKEclISIoJCImK24jISIiNyQkIitqIXpzRyUhIigkIiY1biMhIiI3JCQiK3ZXRChHJSEiKCQiJj9uIyEiIjckJCIrKHlIc0clISIoJCImSW4jISIiNyQkIispKlw/KEclISIoJCImU24jISIiNyQkIio2IT0oRyUhIickIiZdbiMhIiI3JCQiK0BeOihHJSEiKCQiJmduIyEiIjckJCIrSys4KEclISIoJCImcW4jISIiNyQkIitVWzUoRyUhIigkIiYheUUhIiI3JCQiK18menFHJSEiKCQiJiF6RSEiIjckJCIraVQwKEclISIoJCImK28jISIiNyQkIityJ0dxRyUhIigkIiY1byMhIiI3JCQiKjMucUclISInJCImP28jISIiNyQkIispUXhwRyUhIigkIiZJbyMhIiI3JCQiKyZmXnBHJSEiKCQiJlNvIyEiIjckJCIrLWQjcEclISIoJCImXW8jISIiNyQkIisyKCoqb0clISIoJCImZ28jISIiNyQkIis3TyhvRyUhIigkIiZxbyMhIiI3JCQiKzt1JW9HJSEiKCQiJiEpbyMhIiI3JCQiKjdAb0clISInJCImISpvIyEiIjckJCIrQVp6J0clISIoJCImK3AjISIiNyQkIitCI29uRyUhIigkIiY1cCMhIiI3JCQiK0I7dSdHJSEiKCQiJj9wIyEiIjckJCIrQVxyJ0clISIoJCImSXAjISIiNyQkIis+IilvJ0clISIoJCImU3AjISIiNyQkIis6N20nRyUhIigkIiZdcCMhIiI3JCQiKkBNbUclISInJCImZ3AjISIiNyQkIisvcmcnRyUhIigkIiZxcCMhIiI3JCQiKycqKXpsRyUhIigkIiYhKXAjISIiNyQkIisnZV9sRyUhIigkIiYhKnAjISIiNyQkIit2Xl8nRyUhIigkIiYrcSMhIiI3JCQiK2p3XCdHJSEiKCQiJjVxIyEiIjckJCIrXCtaJ0clISIoJCImP3EjISIiNyQkIitMQlcnRyUhIigkIiZJcSMhIiI3JCQiKzpYVCdHJSEiKCQiJlNxIyEiIjckJCIrJmYnUSdHJSEiKCQiJl1xIyEiIjckJCIrdCZlakclISIoJCImZ3EjISIiNyQkIipYSWpHJSEiJyQiJnFxIyEiIjckJCIrQ0FJJ0clISIoJCImITNGISIiNyQkIisnKlFGJ0clISIoJCImITRGISIiNyQkIituYUMnRyUhIigkIiYrciMhIiI3JCQiK05wQCdHJSEiKCQiJjVyIyEiIjckJCIpJCk9J0clISImJCImP3IjISIiNyQkIitqJmZoRyUhIigkIiZJciMhIiI3JCQiK0MyOCdHJSEiKCQiJlNyIyEiIjckJCIrJHksaEclISIoJCImXXIjISIiNyQkIitSRjInRyUhIigkIiZnciMhIiI3JCQiKyNmVmdHJSEiKCQiJnFyIyEiIjckJCIrVlYsJ0clISIoJCImIT1GISIiNyQkIisiKlwpZkclISIoJCImIT5GISIiNyQkIitQYiZmRyUhIigkIiYrcyMhIiI3JCQiK3pmI2ZHJSEiKCQiJjVzIyEiIjckJCIrPmoqZUclISIoJCImP3MjISIiNyQkIitjbCdlRyUhIigkIiZJcyMhIiI3JCQiKypvT2VHJSEiKCQiJlNzIyEiIjckJCIqczFlRyUhIickIiZdcyMhIiI3JCQiK1tteCZHJSEiKCQiJmdzIyEiIjckJCIrc2t1JkclISIoJCImcXMjISIiNyQkIiskPjtkRyUhIigkIiYhR0YhIiI3JCQiKzZlbyZHJSEiKCQiJiFIRiEiIjckJCIrRGBsJkclISIoJCImK3QjISIiNyQkIitPWmkmRyUhIigkIiY1dCMhIiI3JCQiK1dTZiZHJSEiKCQiJj90IyEiIjckJCIrW0tjJkclISIoJCImSXQjISIiNyQkIitbQmAmRyUhIigkIiZTdCMhIiI3JCQiK1g4XSZHJSEiKCQiJl10IyEiIjckJCIrUS1aJkclISIoJCImZ3QjISIiNyQkIitGIVJhRyUhIigkIiZxdCMhIiI3JCQiKzd4UyZHJSEiKCQiJiFRRiEiIjckJCIrJUh3YEclISIoJCImIVJGISIiNyQkIityWk0mRyUhIigkIiYrdSMhIiI3JCQiK1dKSiZHJSEiKCQiJjV1IyEiIjckJCIrODlHJkclISIoJCImP3UjISIiNyQkIit5JlxfRyUhIigkIiZJdSMhIiI3JCQiK1J3QCZHJSEiKCQiJlN1IyEiIjckJCIrJmYmPSZHJSEiKCQiJl11IyEiIjckJCIrWk06JkclISIoJCImZ3UjISIiNyQkIismPkBeRyUhIigkIiZxdSMhIiI3JCQiK1EpKTMmRyUhIigkIiYhW0YhIiI3JCQiK3dqMCZHJSEiKCQiJiFcRiEiIjckJCIqIlEtJkclISInJCImK3YjISIiNyQkIitSNipcRyUhIigkIiY1diMhIiI3JCQiK2okZVxHJSEiKCQiJj92IyEiIjckJCIrJFtEXEclISIoJCImSXYjISIiNyQkIisoXCMqW0clISIoJCImU3YjISIiNyQkIisxJWZbRyUhIigkIiZddiMhIiI3JCQiKzZpI1tHJSEiKCQiJmd2IyEiIjckJCIqIkh6JUclISInJCImcXYjISIiNyQkIisvJmZaRyUhIigkIiYhZUYhIiI3JCQiKyQqZnMlRyUhIigkIiYhZkYhIiI3JCQiK3hCcCVHJSEiKCQiJit3IyEiIjckJCIrYidlWUclISIoJCImNXcjISIiNyQkIitGW2klRyUhIigkIiY/dyMhIiI3JCQiKyUqM2YlRyUhIigkIiZJdyMhIiI3JCQiK2NvYiVHJSEiKCQiJlN3IyEiIjckJCIrN0ZfJUclISIoJCImXXcjISIiNyQkIitpJSlbJUclISIoJCImZ3cjISIiNyQkIisxVFglRyUhIigkIiZxdyMhIiI3JCQiK1gnPldHJSEiKCQiJiFvRiEiIjckJCIreF1RJUclISIoJCImIXBGISIiNyQkIisuL04lRyUhIigkIiYreCMhIiI3JCQiK0NjSiVHJSEiKCQiJjV4IyEiIjckJCIrUTJHJUclISIoJCImP3gjISIiNyQkIitZZEMlRyUhIigkIiZJeCMhIiI3JCQiK1sxQCVHJSEiKCQiJlN4IyEiIjckJCIrVmE8JUclISIoJCImXXgjISIiNyQkIitLLDklRyUhIigkIiZneCMhIiI3JCQiKzlaNSVHJSEiKCQiJnF4IyEiIjckJCIqPnBTRyUhIickIiYheUYhIiI3JCQiK2ZOLiVHJSEiKCQiJiF6RiEiIjckJCIrQHkqUkclISIoJCImK3kjISIiNyQkIit4PidSRyUhIigkIiY1eSMhIiI3JCQiK0RnI1JHJSEiKCQiJj95IyEiIjckJCIrbioqKVFHJSEiKCQiJkl5IyEiIjckJCIrLVEmUUclISIoJCImU3kjISIiNyQkIipgPFFHJSEiJyQiJl15IyEiIjckJCIqOiJ5JEclISInJCImZ3kjISIiNyQkIitqWXUkRyUhIigkIiZxeSMhIiI3JCQiK3AhM1BHJSEiKCQiJiEpeSMhIiI3JCQiK284biRHJSEiKCQiJiEqeSMhIiI3JCQiK2ZYaiRHJSEiKCQiJit6IyEiIjckJCIrVXdmJEclISIoJCImNXojISIiNyQkIis9MWMkRyUhIigkIiY/eiMhIiI3JCQiKydbQk5HJSEiKCQiJkl6IyEiIjckJCIrWmlbJEclISIoJCImU3ojISIiNyQkIikqW01HJSEiJiQiJl16IyEiIjckJCIrVzlUJEclISIoJCImZ3ojISIiNyQkIisiKVFQJEclISIoJCImcXojISIiNyQkIipAT0xHJSEiJyQiJiEpeiMhIiI3JCQiKlYpSCRHJSEiJyQiJiEqeiMhIiI3JCQiK1YwRSRHJSEiKCQiJishRyEiIjckJCIrWkRBJEclISIoJCImNSFHISIiNyQkIitVVz0kRyUhIigkIiY/IUchIiI3JCQiKkJZSkclISInJCImSSFHISIiNyQkIiszejUkRyUhIigkIiZTIUchIiI3JCQiK3klcElHJSEiKCQiJl0hRyEiIjckJCIqJTQuJEclISInJCImZyFHISIiNyQkIiskSCMqSEclISIoJCImcSFHISIiNyQkIitPTiZIRyUhIigkIiYhM0chIiI3JCQiK3JZIkhHJSEiKCQiJiE0RyEiIjckJCIrKHB2R0clISIoJCImKyJHISIiNyQkIis5bSRHRyUhIigkIiY1IkchIiI3JCQiK0F1eiNHJSEiKCQiJj8iRyEiIjckJCIrQCJlRkclISIoJCImSSJHISIiNyQkIipyPUZHJSEiJyQiJlMiRyEiIjckJCIqPnpFRyUhIickIiZdIkchIiI3JCQiKmNSRUclISInJCImZyJHISIiNyQkIitAKSpmI0clISIoJCImcSJHISIiNyQkIitzKmZERyUhIigkIiYhPUchIiI3JCQiKzkrXyNHJSEiKCQiJiE+RyEiIjckJCIrWSp6Q0clISIoJCImKyNHISIiNyQkIitvKFJDRyUhIigkIiY1I0chIiI3JCQiKlsqUiNHJSEiJyQiJj8jRyEiIjckJCIrIjNmQkclISIoJCImSSNHISIiNyQkIit0Jj1CRyUhIigkIiZTI0chIiI3JCQiK2J6RiNHJSEiKCQiJl0jRyEiIjckJCIrRXNCI0clISIoJCImZyNHISIiNyQkIisoUSc+I0clISIoJCImcSNHISIiNyQkIitRYTojRyUhIigkIiYhR0chIiI3JCQiK3lWNiNHJSEiKCQiJiFIRyEiIjckJCIrM0syI0clISIoJCImKyRHISIiNyQkIitFPi4jRyUhIigkIiY1JEchIiI3JCQiK04wKj5HJSEiKCQiJj8kRyEiIjckJCIrSyFcPkclISIoJCImSSRHISIiNyQkIis9dSE+RyUhIigkIiZTJEchIiI3JCQiKyRwbD1HJSEiKCQiJl0kRyEiIjckJCIrZFEjPUclISIoJCImZyRHISIiNyQkIioiPnkiRyUhIickIiZxJEchIiI3JCQiK18pUjxHJSEiKCQiJiFRRyEiIjckJCIrJG8ocCJHJSEiKCQiJiFSRyEiIjckJCIrLGFsIkclISIoJCImKyVHISIiNyQkIis0SWgiRyUhIigkIiY1JUchIiI3JCQiKzAwZCJHJSEiKCQiJj8lRyEiIjckJCIrKil5XyJHJSEiKCQiJkklRyEiIjckJCIraF5bIkclISIoJCImUyVHISIiNyQkIitBQlciRyUhIigkIiZdJUchIiI3JCQiKlAqUiJHJSEiJyQiJmclRyEiIjckJCIrMmpOIkclISIoJCImcSVHISIiNyQkIitKSkoiRyUhIigkIiYhW0chIiI3JCQiK1YpcDdHJSEiKCQiJiFcRyEiIjckJCIrVmtBIkclISIoJCImKyZHISIiNyQkIiokSD0iRyUhIickIiY1JkchIiI3JCQiKzAkUjZHJSEiKCQiJj8mRyEiIjckJCIrb2I0IkclISIoJCImSSZHISIiNyQkIis9PDAiRyUhIigkIiZTJkchIiI3JCQiK2J4KyJHJSEiKCQiJl0mRyEiIjckJCIrek8nNEclISIoJCImZyZHISIiNyQkIipcPjRHJSEiJyQiJnEmRyEiIjckJCIrKT12M0clISIoJCImIWVHISIiNyQkIit0MiQzRyUhIigkIiYhZkchIiI3JCQiK1hpeSFHJSEiKCQiJisnRyEiIjckJCIrLzt1IUclISIoJCImNSdHISIiNyQkIiomb3AhRyUhIickIiY/J0chIiI3JCQiKyIpPmwhRyUhIigkIiZJJ0chIiI3JCQiKDIxRyUhIiUkIiZTJ0chIiI3JCQiKy8+YyFHJSEiKCQiJl0nRyEiIjckJCIrJnA7MEclISIoJCImZydHISIiNyQkIit0OFohRyUhIigkIiZxJ0chIiI3JCQiK09mVSFHJSEiKCQiJiFvRyEiIjckJCIrJlEhUSFHJSEiKCQiJiFwRyEiIjckJCIqc00uRyUhIickIiYrKEchIiI3JCQiK1QqKUchRyUhIigkIiY1KEchIiI3JCQiK1tJQyFHJSEiKCQiJj8oRyEiIjckJCIqLyg+IUclISInJCImSShHISIiNyQkIis9NDohRyUhIigkIiZTKEchIiI3JCQiKyJvLyxHJSEiKCQiJl0oRyEiIjckJCIrSCRlK0clISIoJCImZyhHISIiNyQkIitqPSwhRyUhIigkIiZxKEchIiI3JCQiKyNHbCp6VSEiKCQiJiF5RyEiIjckJCIrJ2U9KnpVISIoJCImIXpHISIiNyQkIit2PCgpelUhIigkIiYrKUchIiI3JCQiK1xbIyl6VSEiKCQiJjUpRyEiIjckJCIrM3l4elUhIigkIiY/KUchIiI3JCQiK14xdHpVISIoJCImSSlHISIiNyQkIit6TG96VSEiKCQiJlMpRyEiIjckJCIrIipmanpVISIoJCImXSlHISIiNyQkIispWyllelUhIigkIiZnKUchIiI3JCQiK3AzYXpVISIoJCImcSlHISIiNyQkIitNSlx6VSEiKCQiJiEpKUchIiI3JCQiKyVHWCV6VSEiKCQiJiEqKUchIiI3JCQiKzx0UnpVISIoJCImKypHISIiNyQkIitNI1wkelUhIigkIiY1KkchIiI3JCQiK041SXpVISIoJCImPypHISIiNyQkIipzXyN6VSEiJyQiJkkqRyEiIjckJCIrKUcvI3pVISIoJCImUypHISIiNyQkIip1YiJ6VSEiJyQiJl0qRyEiIjckJCIrd3E1elUhIigkIiZnKkchIiI3JCQiKyVIZSF6VSEiKCQiJnEqRyEiIjckJCIrJ1I0IXpVISIoJCImISkqRyEiIjckJCIrIlFnKnlVISIoJCImISoqRyEiIjckJCIrXDciKnlVISIoJCImKyFIISIiNyQkIihpKXlVISIlJCImNSFIISIiNyQkIitMRSIpeVUhIigkIiY/IUghIiI3JCQiK1xKd3lVISIoJCImSSFIISIiNyQkIitbTnJ5VSEiKCQiJlMhSCEiIjckJCIqJFFteVUhIickIiZdIUghIiI3JCQiKyUqUmh5VSEiKCQiJmchSCEiIjckJCIqL2smeVUhIickIiZxIUghIiI3JCQiK29SXnlVISIoJCImITNIISIiNyQkIit6UFl5VSEiKCQiJiE0SCEiIjckJCIrck1UeVUhIigkIiYrIkghIiI3JCQiK1hJT3lVISIoJCImNSJIISIiNyQkIissREp5VSEiKCQiJj8iSCEiIjckJCIrUj1FeVUhIigkIiZJIkghIiI3JCQiK2U1QHlVISIoJCImUyJIISIiNyQkIitmLDt5VSEiKCQiJl0iSCEiIjckJCIrVCI0InlVISIoJCImZyJIISIiNyQkIiswIWUheVUhIigkIiZxIkghIiI3JCQiK1xuK3lVISIoJCImIT1IISIiNyQkIit2YCZ6RiUhIigkIiYhPkghIiI3JCQiKyMpUSF6RiUhIigkIiYrI0ghIiI3JCQiK3BBJnlGJSEiKCQiJjUjSCEiIjckJCIrUDAheUYlISIoJCImPyNIISIiNyQkIisnb1t4RiUhIigkIiZJI0ghIiI3JCQiKzpucHhVISIoJCImUyNIISIiNyQkIitEWWt4VSEiKCQiJl0jSCEiIjckJCIrOkNmeFUhIigkIiZnI0ghIiI3JCQiKyYzU3ZGJSEiKCQiJnEjSCEiIjckJCIrTndbeFUhIigkIiYhR0ghIiI3JCQiK21dVnhVISIoJCImIUhIISIiNyQkIit3QlF4VSEiKCQiJiskSCEiIjckJCIrbSZIdEYlISIoJCImNSRIISIiNyQkIitObUZ4VSEiKCQiJj8kSCEiIjckJCIrJWVCc0YlISIoJCImSSRIISIiNyQkIis4Lzx4VSEiKCQiJlMkSCEiIjckJCIqNzxyRiUhIickIiZdJEghIiI3JCQiKzJQMXhVISIoJCImZyRIISIiNyQkIit1LCx4VSEiKCQiJnEkSCEiIjckJCIrPmwmcEYlISIoJCImIVFIISIiNyQkIitWRiFwRiUhIigkIiYhUkghIiI3JCQiK1gpW29GJSEiKCQiJislSCEiIjckJCIrRlt6d1UhIigkIiY1JUghIiI3JCQiKyhvU25GJSEiKCQiJj8lSCEiIjckJCIrRGtvd1UhIigkIiZJJUghIiI3JCQiK1Q/andVISIoJCImUyVIISIiNyQkIitPdmR3VSEiKCQiJl0lSCEiIjckJCIrNEhfd1UhIigkIiZnJUghIiI3JCQiKjtva0YlISInJCImcSVIISIiNyQkIisqRzhrRiUhIigkIiYhW0ghIiI3JCQiKyZIZWpGJSEiKCQiJiFcSCEiIjckJCIrekpJd1UhIigkIiYrJkghIiI3JCQiK1R6Q3dVISIoJCImNSZIISIiNyQkIiplIz53VSEiJyQiJj8mSCEiIjckJCIrJzRQaEYlISIoJCImSSZIISIiNyQkIipcIjN3VSEiJyQiJlMmSCEiIjckJCIqd0RnRiUhIickIiZdJkghIiI3JCQiKzIqcGZGJSEiKCQiJmcmSCEiIjckJCIrS1IiZkYlISIoJCImcSZIISIiNyQkIitMeSZlRiUhIigkIiYhZUghIiI3JCQiKmgsZUYlISInJCImIWZIISIiNyQkIitrX3V2VSEiKCQiJisnSCEiIjckJCIrJXopb3ZVISIoJCImNSdIISIiNyQkIissQWp2VSEiKCQiJj8nSCEiIjckJCIrJFt2YkYlISIoJCImSSdIISIiNyQkIitVJz1iRiUhIigkIiZTJ0ghIiI3JCQiK3c7WXZVISIoJCImXSdIISIiNyQkIisnZS9hRiUhIigkIiZnJ0ghIiI3JCQiK3N0TXZVISIoJCImcSdIISIiNyQkIitMK0h2VSEiKCQiJiFvSCEiIjckJCIqZEtfRiUhIickIiYhcEghIiI3JCQiKyIpXDx2VSEiKCQiJisoSCEiIjckJCIrb3M2dlUhIigkIiY1KEghIiI3JCQiKlZmXUYlISInJCImPyhIISIiNyQkIituOSt2VSEiKCQiJkkoSCEiIjckJCIrekwlXEYlISIoJCImUyhIISIiNyQkIitsXilbRiUhIigkIiZdKEghIiI3JCQiK0VvI1tGJSEiKCQiJmcoSCEiIjckJCIraCRvWkYlISIoJCImcShIISIiNyQkIip4NFpGJSEiJyQiJiF5SCEiIjckJCIrYTVsdVUhIigkIiYhekghIiI3JCQiKzZBZnVVISIoJCImKylIISIiNyQkIitWS2B1VSEiKCQiJjUpSCEiIjckJCIrW1RadVUhIigkIiY/KUghIiI3JCQiK0ZcVHVVISIoJCImSSlIISIiNyQkIit6Yk51VSEiKCQiJlMpSCEiIjckJCIrMGhIdVUhIigkIiZdKUghIiI3JCQiKy9sQnVVISIoJCImZylIISIiNyQkIit3bjx1VSEiKCQiJnEpSCEiIjckJCIrQHA2dVUhIigkIiYhKSlIISIiNyQkIitScDB1VSEiKCQiJiEqKUghIiI3JCQiKiRvKlJGJSEiJyQiJisqSCEiIjckJCIrJGZPUkYlISIoJCImNSpIISIiNyQkIitIaShRRiUhIigkIiY/KkghIiI3JCQiK1BkIlFGJSEiKCQiJkkqSCEiIjckJCIrPF52dFUhIigkIiZTKkghIiI3JCQiKlAlcHRVISInJCImXSpIISIiNyQkIislXExPRiUhIigkIiZnKkghIiI3JCQiKlxzTkYlISInJCImcSpIISIiNyQkIitlOF50VSEiKCQiJiEpKkghIiI3JCQiKyk0XU1GJSEiKCQiJiEqKkghIiI3JCQiKzQoKVF0VSEiKCQiJisrJCEiIjckJCIrIj5GTEYlISIoJCImNSskISIiNyQkIitXYkV0VSEiKCQiJj8rJCEiIjckJCIrcFA/dFUhIigkIiZJKyQhIiI3JCQiK2s9OXRVISIoJCImUyskISIiNyQkIiokKXpJRiUhIickIiZdKyQhIiI3JCQiK253LHRVISIoJCImZyskISIiNyQkIit1YCZIRiUhIigkIiZxKyQhIiI3JCQiK15IKkdGJSEiKCQiJiEzSSEiIjckJCIrKlJJR0YlISIoJCImITRJISIiNyQkIis8eHdzVSEiKCQiJissJCEiIjckJCIrMFxxc1UhIigkIiY1LCQhIiI3JCQiK2k+a3NVISIoJCImPywkISIiNyQkIisqKSl5REYlISIoJCImSSwkISIiNyQkIisnbzpERiUhIigkIiZTLCQhIiI3JCQiK19CWHNVISIoJCImXSwkISIiNyQkIispKSkpUXNVISIoJCImZywkISIiNyQkIisjSERCRiUhIigkIiZxLCQhIiI3JCQiK206RXNVISIoJCImIT1JISIiNyQkIiszeD5zVSEiKCQiJiE+SSEiIjckJCIrPlA4c1UhIigkIiYrLSQhIiI3JCQiKypmcD9GJSEiKCQiJjUtJCEiIjckJCIrWmArc1UhIigkIiY/LSQhIiI3JCQiK2o0JT5GJSEiKCQiJkktJCEiIjckJCIrW2soPUYlISIoJCImUy0kISIiNyQkIik9Ij1GJSEiJiQiJl0tJCEiIjckJCIrQHF1clUhIigkIiZnLSQhIiI3JCQiKzRAb3JVISIoJCImcS0kISIiNyQkIitrcWhyVSEiKCQiJiFHSSEiIjckJCIrKCk9YnJVISIoJCImIUhJISIiNyQkIit4bFtyVSEiKCQiJisuJCEiIjckJCIrTjZVclUhIigkIiY1LiQhIiI3JCQiK2ZiTnJVISIoJCImPy4kISIiNyQkIiomKSpHclUhIickIiZJLiQhIiI3JCQiKzNTQXJVISIoJCImUy4kISIiNyQkIitLIWU2RiUhIigkIiZdLiQhIiI3JCQiK0I+NHJVISIoJCImZy4kISIiNyQkIipvRDVGJSEiJyQiJnEuJCEiIjckJCIrLiRmNEYlISIoJCImIVFJISIiNyQkIiskeiMqM0YlISIoJCImIVJJISIiNyQkIitaaCMzRiUhIigkIiYrLyQhIiI3JCQiK28kZjJGJSEiKCQiJjUvJCEiIjckJCIrYUNwcVUhIigkIiY/LyQhIiI3JCQiKzBhaXFVISIoJCImSS8kISIiNyQkIitBI2UwRiUhIigkIiZTLyQhIiI3JCQiKy80XHFVISIoJCImXS8kISIiNyQkIipYQi9GJSEiJyQiJmcvJCEiIjckJCIraWVOcVUhIigkIiZxLyQhIiI3JCQiK1EiKUdxVSEiKCQiJiFbSSEiIjckJCIreS1BcVUhIigkIiYhXEkhIiI3JCQiKyRHXyxGJSEiKCQiJiswJCEiIjckJCIrXlQzcVUhIigkIiY1MCQhIiI3JCQiKyUpZSxxVSEiKCQiJj8wJCEiIjckJCIrIltaKnBVISIoJCImSTAkISIiNyQkIitUKnkpcFUhIigkIiZTMCQhIiI3JCQiK2wtIilwVSEiKCQiJl0wJCEiIjckJCIrXzl1cFUhIigkIiZnMCQhIiI3JCQiKy5EbnBVISIoJCImcTAkISIiNyQkIis7TWdwVSEiKCQiJiFlSSEiIjckJCIrIz5NJnBVISIoJCImIWZJISIiNyQkIitKW1lwVSEiKCQiJisxJCEiIjckJCIrTGBScFUhIigkIiY1MSQhIiI3JCQiKyhwRCRwVSEiKCQiJj8xJCEiIjckJCIrQmZEcFUhIigkIiZJMSQhIiI3JCQiKzdnPXBVISIoJCImUzEkISIiNyQkIitpZjZwVSEiKCQiJl0xJCEiIjckJCIrdWQvcFUhIigkIiZnMSQhIiI3JCQiK1thKCpvVSEiKCQiJnExJCEiIjckJCIrJClcISpvVSEiKCQiJiFvSSEiIjckJCIqUU0pb1UhIickIiYhcEkhIiI3JCQiK1FPd29VISIoJCImKzIkISIiNyQkIitjRnBvVSEiKCQiJjUyJCEiIjckJCIrTzxpb1UhIigkIiY/MiQhIiI3JCQiK3cwYm9VISIoJCImSTIkISIiNyQkIit4I3olb1UhIigkIiZTMiQhIiI3JCQiK1B5U29VISIoJCImXTIkISIiNyQkIitlaUxvVSEiKCQiJmcyJCEiIjckJCIqYWsjb1UhIickIiZxMiQhIiI3JCQiKm8jPm9VISInJCImIXlJISIiNyQkIisibz8ib1UhIigkIiYhekkhIiI3JCQiK1QmWyFvVSEiKCQiJiszJCEiIjckJCIqRXd6RSUhIickIiY1MyQhIiI3JCQiK1JRIXpFJSEiKCQiJj8zJCEiIjckJCIrdzckeUUlISIoJCImSTMkISIiNyQkIitzJmV4RSUhIigkIiZTMyQhIiI3JCQiK0Zkb25VISIoJCImXTMkISIiNyQkIitURmhuVSEiKCQiJmczJCEiIjckJCIrNydSdkUlISIoJCImcTMkISIiNyQkIitValluVSEiKCQiJiEpMyQhIiI3JCQiKiRIUm5VISInJCImISozJCEiIjckJCIrdyQ+dEUlISIoJCImKzQkISIiNyQkIit6Y0NuVSEiKCQiJjU0JCEiIjckJCIrUj08blUhIigkIiY/NCQhIiI3JCQiK2R5NG5VISIoJCImSTQkISIiNyQkIitLUC1uVSEiKCQiJlM0JCEiIjckJCIrayVccEUlISIoJCImXTQkISIiNyQkIitgXShvRSUhIigkIiZnNCQhIiI3JCQiKylcK29FJSEiKCQiJnE0JCEiIjckJCIpZXNtVSEiJiQiJiEpNCQhIiI3JCQiK2U0bG1VISIoJCImISo0JCEiIjckJCIrcmZkbVUhIigkIiYrNSQhIiI3JCQiK1QzXW1VISIoJCImNTUkISIiNyQkIituYlVtVSEiKCQiJj81JCEiIjckJCIrWixObVUhIigkIiZJNSQhIiI3JCQiKyVldWlFJSEiKCQiJlM1JCEiIjckJCIrdikpPm1VISIoJCImXTUkISIiNyQkIitASTdtVSEiKCQiJmc1JCEiIjckJCIrQnEvbVUhIigkIiZxNSQhIiI3JCQiK3kzKGZFJSEiKCQiJiEzSiEiIjckJCIrKWUlKmVFJSEiKCQiJiE0SiEiIjckJCIrYCI9ZUUlISIoJCImKzYkISIiNyQkIityOnVsVSEiKCQiJjU2JCEiIjckJCIrVlttbFUhIigkIiY/NiQhIiI3JCQiK3B6ZWxVISIoJCImSTYkISIiNyQkIitcNF5sVSEiKCQiJlM2JCEiIjckJCIrI3lMYUUlISIoJCImXTYkISIiNyQkIitva05sVSEiKCQiJmc2JCEiIjckJCIrMSF6X0UlISIoJCImcTYkISIiNyQkIispUixfRSUhIigkIiYhPUohIiI3JCQiK1VPN2xVISIoJCImIT5KISIiNyQkIitSZC9sVSEiKCQiJis3JCEiIjckJCIrKG9uXEUlISIoJCImNTckISIiNyQkIispWyopW0UlISIoJCImPzckISIiNyQkIitUNiJbRSUhIigkIiZJNyQhIiI3JCQiK1hFdGtVISIoJCImUzckISIiNyQkIihhWUUlISIlJCImXTckISIiNyQkIisyX2RrVSEiKCQiJmc3JCEiIjckJCIrbGlca1UhIigkIiZxNyQhIiI3JCQiK3VyVGtVISIoJCImIUdKISIiNyQkIitMekxrVSEiKCQiJiFISiEiIjckJCIrViZlVUUlISIoJCImKzgkISIiNyQkIisuIXpURSUhIigkIiY1OCQhIiI3JCQiKzgkKjRrVSEiKCQiJj84JCEiIjckJCIrdCU+U0UlISIoJCImSTgkISIiNyQkIisjW1JSRSUhIigkIiZTOCQhIiI3JCQiK1UkZlFFJSEiKCQiJl04JCEiIjckJCIqMHpQRSUhIickIiZnOCQhIiI3JCQiKzMnKXBqVSEiKCQiJnE4JCEiIjckJCIrOSE9T0UlISIoJCImIVFKISIiNyQkIitwc2BqVSEiKCQiJiFSSiEiIjckJCIrdGpYalUhIigkIiYrOSQhIiI3JCQiK0NgUGpVISIoJCImNTkkISIiNyQkIitDVEhqVSEiKCQiJj85JCEiIjckJCIrc0ZAalUhIigkIiZJOSQhIiI3JCQiK283OGpVISIoJCImUzkkISIiNyQkIis2J1xJRSUhIigkIiZdOSQhIiI3JCQiKyx5J0hFJSEiKCQiJmc5JCEiIjckJCIrUWUpR0UlISIoJCImcTkkISIiNyQkIitBUCFHRSUhIigkIiYhW0ohIiI3JCQiK2A5c2lVISIoJCImIVxKISIiNyQkIiouUkVFJSEiJyQiJis6JCEiIjckJCIrYWtiaVUhIigkIiY1OiQhIiI3JCQiK0JQWmlVISIoJCImPzokISIiNyQkIitRM1JpVSEiKCQiJkk6JCEiIjckJCIrKnoyQkUlISIoJCImUzokISIiNyQkIisxWUFpVSEiKCQiJl06JCEiIjckJCIrZDc5aVUhIigkIiZnOiQhIiI3JCQiK2F4MGlVISIoJCImcTokISIiNyQkIismNHU+RSUhIigkIiYhZUohIiI3JCQiKyJHISo9RSUhIigkIiYhZkohIiI3JCQiKzZqIT1FJSEiKCQiJis7JCEiIjckJCIrJj1BPEUlISIoJCImNTskISIiNyQkIisuempoVSEiKCQiJj87JCEiIjckJCIrbE1iaFUhIigkIiZJOyQhIiI3JCQiK3IpbzlFJSEiKCQiJlM7JCEiIjckJCIrPlRRaFUhIigkIiZdOyQhIiI3JCQiKzYjKkhoVSEiKCQiJmc7JCEiIjckJCIrWVRAaFUhIigkIiZxOyQhIiI3JCQiK0IqRzZFJSEiKCQiJiFvSiEiIjckJCIrVU4vaFUhIigkIiYhcEohIiI3JCQiKy8hZTRFJSEiKCQiJis8JCEiIjckJCIrM0IoM0UlISIoJCImNTwkISIiNyQkIitga3lnVSEiKCQiJj88JCEiIjckJCIqVysyRSUhIickIiZJPCQhIiI3JCQiK29VaGdVISIoJCImUzwkISIiNyQkIitQel9nVSEiKCQiJl08JCEiIjckJCIrWjlXZ1UhIigkIiZnPCQhIiI3JCQiKyl6YS5FJSEiKCQiJnE8JCEiIjckJCIrKil6RWdVISIoJCImIXlKISIiNyQkIiotIj1nVSEiJyQiJiF6SiEiIjckJCIrIypRNGdVISIoJCImKz0kISIiNyQkIisubStnVSEiKCQiJjU9JCEiIjckJCIrYCI+KmZVISIoJCImPz0kISIiNyQkIitVOiQpZlUhIigkIiZJPSQhIiI3JCQiK3JQdWZVISIoJCImUz0kISIiNyQkIitSZWxmVSEiKCQiJl09JCEiIjckJCIrV3hjZlUhIigkIiZnPSQhIiI3JCQiKypbeiVmVSEiKCQiJnE9JCEiIjckJCIrcjVSZlUhIigkIiYhKT0kISIiNyQkIisiXC0kZlUhIigkIiYhKj0kISIiNyQkIitcUEBmVSEiKCQiJis+JCEiIjckJCIrV1s3ZlUhIigkIiY1PiQhIiI3JCQiK3hkLmZVISIoJCImPz4kISIiNyQkIitZbCUqZVUhIigkIiZJPiQhIiI3JCQiK19yJillVSEiKCQiJlM+JCEiIjckJCIrJmZuKGVVISIoJCImXT4kISIiNyQkIit0eW5lVSEiKCQiJmc+JCEiIjckJCIrKSl6ZWVVISIoJCImcT4kISIiNyQkIitRelxlVSEiKCQiJiEpPiQhIiI3JCQiK0N4U2VVISIoJCImISo+JCEiIjckJCIrWHRKZVUhIigkIiYrPyQhIiI3JCQiKyxvQWVVISIoJCImNT8kISIiNyQkIisiNE8iZVUhIigkIiY/PyQhIiI3JCQiKzxfL2VVISIoJCImST8kISIiNyQkIit3VCZ6RCUhIigkIiZTPyQhIiI3JCQiKihIJ3lEJSEiJyQiJl0/JCEiIjckJCIrKGZyeEQlISIoJCImZz8kISIiNyQkIitlK29kVSEiKCQiJnE/JCEiIjckJCIrXyQpZWRVISIoJCImITNLISIiNyQkIit6a1xkVSEiKCQiJiE0SyEiIjckJCIrUldTZFUhIigkIiYrQCQhIiI3JCQiK0pBSmRVISIoJCImNUAkISIiNyQkIitjKT5zRCUhIigkIiY/QCQhIiI3JCQiKzd0N2RVISIoJCImSUAkISIiNyQkIissWS5kVSEiKCQiJlNAJCEiIjckJCIqc1RwRCUhIickIiZdQCQhIiI3JCQiK3MnW29EJSEiKCQiJmdAJCEiIjckJCIrYWF2Y1UhIigkIiZxQCQhIiI3JCQiK20/bWNVISIoJCImIT1LISIiNyQkIipeb2xEJSEiJyQiJiE+SyEiIjckJCIrJHl1a0QlISIoJCImK0EkISIiNyQkIisoKTNRY1UhIigkIiY1QSQhIiI3JCQiKiNvR2NVISInJCImP0EkISIiNyQkIiskZSM+Y1UhIigkIiZJQSQhIiI3JCQiK3UiKTRjVSEiKCQiJlNBJCEiIjckJCIrJmYuZ0QlISIoJCImXUEkISIiNyQkIitXKTNmRCUhIigkIiZnQSQhIiI3JCQiK0FSImVEJSEiKCQiJnFBJCEiIjckJCIrRyk9ZEQlISIoJCImIUdLISIiNyQkIitpTmliVSEiKCQiJiFISyEiIjckJCIrQiJHYkQlISIoJCImK0IkISIiNyQkIis3RFZiVSEiKCQiJjVCJCEiIjckJCIrRm5MYlUhIigkIiY/QiQhIiI3JCQiKnhTX0QlISInJCImSUIkISIiNyQkIitSWTliVSEiKCQiJlNCJCEiIjckJCIrTSRbXUQlISIoJCImXUIkISIiNyQkIitiPSZcRCUhIigkIiZnQiQhIiI3JCQiKy1fJltEJSEiKCQiJnFCJCEiIjckJCIrdSRlWkQlISIoJCImIVFLISIiNyQkIityOG1hVSEiKCQiJiFSSyEiIjckJCIrJD5rWEQlISIoJCImK0MkISIiNyQkIiolb1lhVSEiJyQiJjVDJCEiIjckJCIrNiRwVkQlISIoJCImP0MkISIiNyQkIisxO0ZhVSEiKCQiJklDJCEiIjckJCIrRFA8YVUhIigkIiZTQyQhIiI3JCQiK25jMmFVISIoJCImXUMkISIiNyQkIitMdShSRCUhIigkIiZnQyQhIiI3JCQiK0AhelFEJSEiKCQiJnFDJCEiIjckJCIrSy95YFUhIigkIiYhW0shIiI3JCQiK207b2BVISIoJCImIVxLISIiNyQkIitARmVgVSEiKCQiJitEJCEiIjckJCIrKWYkW2BVISIoJCImNUQkISIiNyQkIisnSCVRYFUhIigkIiY/RCQhIiI3JCQiKztbR2BVISIoJCImSUQkISIiNyQkIitkXj1gVSEiKCQiJlNEJCEiIjckJCIrPWAzYFUhIigkIiZdRCQhIiI3JCQiKypIJilIRCUhIigkIiZnRCQhIiI3JCQiKyxeKUdEJSEiKCQiJnFEJCEiIjckJCIrQVp5X1UhIigkIiYhZUshIiI3JCQiK2pUb19VISIoJCImIWZLISIiNyQkIitCTWVfVSEiKCQiJitFJCEiIjckJCIrLERbX1UhIigkIiY1RSQhIiI3JCQiKylSIlFfVSEiKCQiJj9FJCEiIjckJCIrOSxHX1UhIigkIiZJRSQhIiI3JCQiK1oneUBEJSEiKCQiJlNFJCEiIjckJCIrKSpwMl9VISIoJCImXUUkISIiNyQkIittXig+RCUhIigkIiZnRSQhIiI3JCQiK15KKD1EJSEiKCQiJnFFJCEiIjckJCIrYDR4XlUhIigkIiYhb0shIiI3JCQiK3MmbztEJSEiKCQiJiFwSyEiIjckJCIrMWdjXlUhIigkIiYrRiQhIiI3JCQiK2NLWV5VISIoJCImNUYkISIiNyQkIitBLk9eVSEiKCQiJj9GJCEiIjckJCIrLnNEXlUhIigkIiZJRiQhIiI3JCQiKyoqUTpeVSEiKCQiJlNGJCEiIjckJCIrNC8wXlUhIigkIiZdRiQhIiI3JCQiK01uJTREJSEiKCQiJmdGJCEiIjckJCIrc0clM0QlISIoJCImcUYkISIiNyQkIitDKVEyRCUhIigkIiYheUshIiI3JCQiKmZNMUQlISInJCImIXpLISIiNyQkIitvLGBdVSEiKCQiJitHJCEiIjckJCIrZmJVXVUhIigkIiY1RyQhIiI3JCQiK2kyS11VISIoJCImP0ckISIiNyQkIit5ZEBdVSEiKCQiJklHJCEiIjckJCIrMDE2XVUhIigkIiZTRyQhIiI3JCQiK1ZfK11VISIoJCImXUckISIiNyQkIiskcCoqKVxVISIoJCImZ0ckISIiNyQkIitgUnpcVSEiKCQiJnFHJCEiIjckJCIrQiEpb1xVISIoJCImISlHJCEiIjckJCIrLz5lXFUhIigkIiYhKkckISIiNyQkIismZnYlXFUhIigkIiYrSCQhIiI3JCQiKyU0cCRcVSEiKCQiJjVIJCEiIjckJCIrLkNFXFUhIigkIiY/SCQhIiI3JCQiK0BiOlxVISIoJCImSUgkISIiNyQkIitaJVshXFUhIigkIiZTSCQhIiI3JCQiKyI9VCpbVSEiKCQiJl1IJCEiIjckJCIrQlAkKVtVISIoJCImZ0gkISIiNyQkIitzZ3NbVSEiKCQiJnFIJCEiIjckJCIrRyM9J1tVISIoJCImISlIJCEiIjckJCIrIj41JltVISIoJCImISpIJCEiIjckJCIraD5TW1UhIigkIiYrSSQhIiI3JCQiK09OSFtVISIoJCImNUkkISIiNyQkIis8XD1bVSEiKCQiJj9JJCEiIjckJCIrL2gyW1UhIigkIiZJSSQhIiI3JCQiKyY0bnpDJSEiKCQiJlNJJCEiIjckJCIrIyp5JnlDJSEiKCQiJl1JJCEiIjckJCIrI1xbeEMlISIoJCImZ0kkISIiNyQkIisoKilRd0MlISIoJCImcUkkISIiNyQkIiswIkh2QyUhIigkIiYhM0whIiI3JCQiKzsiPnVDJSEiKCQiJiE0TCEiIjckJCIqJCozdEMlISInJCImK0okISIiNyQkIitaJik+WlUhIigkIiY1SiQhIiI3JCQiK216M1pVISIoJCImP0okISIiNyQkIisnPXhwQyUhIigkIiZJSiQhIiI3JCQiKzRpJ29DJSEiKCQiJlNKJCEiIjckJCIrS112WVUhIigkIiZdSiQhIiI3JCQiK2NPa1lVISIoJCImZ0okISIiNyQkIiozS2xDJSEiJyQiJnFKJCEiIjckJCIrMC5VWVUhIigkIiYhPUwhIiI3JCQiK0gkM2pDJSEiKCQiJiE+TCEiIjckJCIrX2g+WVUhIigkIiYrSyQhIiI3JCQiK3ZQM1lVISIoJCImNUskISIiNyQkIisnPnJmQyUhIigkIiY/SyQhIiI3JCQiKzolZWVDJSEiKCQiJklLJCEiIjckJCIrS2F1WFUhIigkIiZTSyQhIiI3JCQiK1lBalhVISIoJCImXUskISIiNyQkIitkKT1iQyUhIigkIiZnSyQhIiI3JCQiK2xfU1hVISIoJCImcUskISIiNyQkIipaIkhYVSEiJyQiJiFHTCEiIjckJCIqWnheQyUhIickIiYhSEwhIiI3JCQiK21LMVhVISIoJCImK0wkISIiNyQkIitkKVtcQyUhIigkIiY1TCQhIiI3JCQiK1ZVJFtDJSEiKCQiJj9MJCEiIjckJCIrQiU+WkMlISIoJCImSUwkISIiNyQkIisoUi9ZQyUhIigkIiZTTCQhIiI3JCQiK2wiKltXVSEiKCQiJl1MJCEiIjckJCIrRVBQV1UhIigkIiZnTCQhIiI3JCQiKjNlVUMlISInJCImcUwkISIiNyQkIitFQTlXVSEiKCQiJiFRTCEiIjckJCIrbGgtV1UhIigkIiYhUkwhIiI3JCQiKyYqKTRSQyUhIigkIiYrTSQhIiI3JCQiKztNelZVISIoJCImNU0kISIiNyQkIitHbm5WVSEiKCQiJj9NJCEiIjckJCIrSilmTkMlISIoJCImSU0kISIiNyQkIitCRldWVSEiKCQiJlNNJCEiIjckJCIrMWFLVlUhIigkIiZdTSQhIiI3JCQiK3h5P1ZVISIoJCImZ00kISIiNyQkIitQLDRWVSEiKCQiJnFNJCEiIjckJCIrJz1zSEMlISIoJCImIVtMISIiNyQkIitCUyZHQyUhIigkIiYhXEwhIiI3JCQiK1tjdFVVISIoJCImK04kISIiNyQkIitmcWhVVSEiKCQiJjVOJCEiIjckJCIrZSMpXFVVISIoJCImP04kISIiNyQkIitWI3pCQyUhIigkIiZJTiQhIiI3JCQiKzgrRVVVISIoJCImU04kISIiNyQkIipkU0BDJSEiJyQiJl1OJCEiIjckJCIrNjQtVVUhIigkIiZnTiQhIiI3JCQiK1A1IT5DJSEiKCQiJnFOJCEiIjckJCIrWzR5VFUhIigkIiYhZUwhIiI3JCQiK1UxbVRVISIoJCImIWZMISIiNyQkIio3UzpDJSEiJyQiJitPJCEiIjckJCIqUT45QyUhIickIiY1TyQhIiI3JCQiK0MlKUhUVSEiKCQiJj9PJCEiIjckJCIrXHM8VFUhIigkIiZJTyQhIiI3JCQiK2NlMFRVISIoJCImU08kISIiNyQkIitXVSQ0QyUhIigkIiZdTyQhIiI3JCQiKzlDIjNDJSEiKCQiJmdPJCEiIjckJCIrai5wU1UhIigkIiZxTyQhIiI3JCQiKyQ0bzBDJSEiKCQiJiFvTCEiIjckJCIrLWNXU1UhIigkIiYhcEwhIiI3JCQiKipHS1NVISInJCImK1AkISIiNyQkIitjKio+U1UhIigkIiY1UCQhIiI3JCQiKyxvMlNVISIoJCImP1AkISIiNyQkIitCTSYqUlUhIigkIiZJUCQhIiI3JCQiK0IpSClSVSEiKCQiJlNQJCEiIjckJCIoMShSVSEiJSQiJl1QJCEiIjckJCIrYD5lUlUhIigkIiZnUCQhIiI3JCQiKyNvZCVSVSEiKCQiJnFQJCEiIjckJCIrJz1MJFJVISIoJCImIXlMISIiNyQkIitsJTMjUlUhIigkIiYhekwhIiI3JCQiKz5OM1JVISIoJCImK1EkISIiNyQkIitaJGUqUVUhIigkIiY1USQhIiI3JCQiK1tIJClRVSEiKCQiJj9RJCEiIjckJCIrQXRxUVUhIigkIiZJUSQhIiI3JCQiKloiZVFVISInJCImU1EkISIiNyQkIisqUWIlUVUhIigkIiZdUSQhIiI3JCQiKjNIJFFVISInJCImZ1EkISIiNyQkIitVRD9RVSEiKCQiJnFRJCEiIjckJCIrdmQyUVUhIigkIiYhKVEkISIiNyQkIit5KFt6QiUhIigkIiYhKlEkISIiNyQkIiteOiN5QiUhIigkIiYrUiQhIiI3JCQiKyU0JXBQVSEiKCQiJjVSJCEiIjckJCIrMGtjUFUhIigkIiY/UiQhIiI3JCQiKyVbUXVCJSEiKCQiJklSJCEiIjckJCIrSy5KUFUhIigkIiZTUiQhIiI3JCQiK1o+PVBVISIoJCImXVIkISIiNyQkIitHTDBQVSEiKCQiJmdSJCEiIjckJCIrd1cjcEIlISIoJCImcVIkISIiNyQkIipSJnpPVSEiJyQiJiEpUiQhIiI3JCQiK3BnbU9VISIoJCImISpSJCEiIjckJCIrOGxgT1UhIigkIiYrUyQhIiI3JCQiK0FuU09VISIoJCImNVMkISIiNyQkIislcHdpQiUhIigkIiY/UyQhIiI3JCQiKlZZaEIlISInJCImSVMkISIiNyQkIitHZixPVSEiKCQiJlNTJCEiIjckJCIrKj0mKWVCJSEiKCQiJl1TJCEiIjckJCIrNlV2TlUhIigkIiZnUyQhIiI3JCQiKyYqSGlOVSEiKCQiJnFTJCEiIjckJCIqYSJcTlUhIickIiYhM00hIiI3JCQiK1gpZmBCJSEiKCQiJiE0TSEiIjckJCIqInpBTlUhIickIiYrVCQhIiI3JCQiK01kNE5VISIoJCImNVQkISIiNyQkIis7TCdcQiUhIigkIiY/VCQhIiI3JCQiK2QxJFtCJSEiKCQiJklUJCEiIjckJCIrY3hwTVUhIigkIiZTVCQhIiI3JCQiKzZZY01VISIoJCImXVQkISIiNyQkIitCN1ZNVSEiKCQiJmdUJCEiIjckJCIrImYoSE1VISIoJCImcVQkISIiNyQkIis6UDtNVSEiKCQiJiE9TSEiIjckJCIrJGZIU0IlISIoJCImIT5NISIiNyQkIitFXypRQiUhIigkIiYrVSQhIiI3JCQiKzgxd0xVISIoJCImNVUkISIiNyQkIitgZGlMVSEiKCQiJj9VJCEiIjckJCIrWTFcTFUhIigkIiZJVSQhIiI3JCQiKyJIYkxCJSEiKCQiJlNVJCEiIjckJCIrKW8+S0IlISIoJCImXVUkISIiNyQkIitPUTNMVSEiKCQiJmdVJCEiIjckJCIrTXglSEIlISIoJCImcVUkISIiNyQkIisjUTZHQiUhIigkIiYhR00hIiI3JCQiKnl1RUIlISInJCImIUhNISIiNyQkIitFemBLVSEiKCQiJitWJCEiIjckJCIrQDNTS1UhIigkIiY1ViQhIiI3JCQiK2pNRUtVISIoJCImP1YkISIiNyQkIitgZTdLVSEiKCQiJklWJCEiIjckJCIrKSl6KT5CJSEiKCQiJlNWJCEiIjckJCIqKClcPUIlISInJCImXVYkISIiNyQkIispXDY8QiUhIigkIiZnViQhIiI3JCQiKihHZEpVISInJCImcVYkISIiNyQkIisnKVJWSlUhIigkIiYhUU0hIiI3JCQiK1lbSEpVISIoJCImIVJNISIiNyQkIitcYTpKVSEiKCQiJitXJCEiIjckJCIrJXo6NUIlISIoJCImNVckISIiNyQkIisiKWUoM0IlISIoJCImP1ckISIiNyQkIis0ZHRJVSEiKCQiJklXJCEiIjckJCIreV9mSVUhIigkIiZTVyQhIiI3JCQiKyhlYS9CJSEiKCQiJl1XJCEiIjckJCIrTk9KSVUhIigkIiZnVyQhIiI3JCQiK0FDPElVISIoJCImcVckISIiNyQkIitaNC5JVSEiKCQiJiFbTSEiIjckJCIrNCMqKSlIVSEiKCQiJiFcTSEiIjckJCIrNHN1SFUhIigkIiYrWCQhIiI3JCQiK1hcZ0hVISIoJCImNVgkISIiNyQkIis7Q1lIVSEiKCQiJj9YJCEiIjckJCIrQic+JEhVISIoJCImSVgkISIiNyQkIitrbDxIVSEiKCQiJlNYJCEiIjckJCIrUksuSFUhIigkIiZdWCQhIiI3JCQiK1onKikpR1UhIigkIiZnWCQhIiI3JCQiKyh5WChHVSEiKCQiJnFYJCEiIjckJCIrZjtnR1UhIigkIiYhZU0hIiI3JCQiK2pzWEdVISIoJCImIWZNISIiNyQkIisoZjckR1UhIigkIiYrWSQhIiI3JCQiKm1uIkdVISInJCImNVkkISIiNyQkIithQy1HVSEiKCQiJj9ZJCEiIjckJCIrdnAoeUElISIoJCImSVkkISIiNyQkIitEN3RGVSEiKCQiJlNZJCEiIjckJCIrLV9lRlUhIigkIiZdWSQhIiI3JCQiKzEqUXVBJSEiKCQiJmdZJCEiIjckJCIrTkJIRlUhIigkIiZxWSQhIiI3JCQiKlxYckElISInJCImIW9NISIiNyQkIitwJCkqcEElISIoJCImIXBNISIiNyQkIitzNCZvQSUhIigkIiYrWiQhIiI3JCQiKypILm5BJSEiKCQiJjVaJCEiIjckJCIrW2BiRVUhIigkIiY/WiQhIiI3JCQiKz5yU0VVISIoJCImSVokISIiNyQkIis2J2VpQSUhIigkIiZTWiQhIiI3JCQiK0IpNGhBJSEiKCQiJl1aJCEiIjckJCIrYzInZkElISIoJCImZ1okISIiNyQkIisyOSJlQSUhIigkIiZxWiQhIiI3JCQiK3g8bURVISIoJCImIXlNISIiNyQkIitrPV5EVSEiKCQiJiF6TSEiIjckJCIrbztPRFUhIigkIiYrWyQhIiI3JCQiKyo9Nl9BJSEiKCQiJjVbJCEiIjckJCIrRC8xRFUhIigkIiY/WyQhIiI3JCQiK3ckNFxBJSEiKCQiJklbJCEiIjckJCIrVCFlWkElISIoJCImU1skISIiNyQkIis+a2dDVSEiKCQiJl1bJCEiIjckJCIqXmFXQSUhIickIiZnWyQhIiI3JCQiKzhCSUNVISIoJCImcVskISIiNyQkIitFKVxUQSUhIigkIiYhKVskISIiNyQkIitecSpSQSUhIigkIiYhKlskISIiNyQkIismKVIlUUElISIoJCImK1wkISIiNyQkIitGMXBCVSEiKCQiJjVcJCEiIjckJCIreXBgQlUhIigkIiY/XCQhIiI3JCQiK1BJUUJVISIoJCImSVwkISIiNyQkIistKUdLQSUhIigkIiZTXCQhIiI3JCQiK3RVMkJVISIoJCImXVwkISIiNyQkIitcJT5IQSUhIigkIiZnXCQhIiI3JCQiK0hWd0FVISIoJCImcVwkISIiNyQkIis4KjNFQSUhIigkIiYhKVwkISIiNyQkIilLWEFVISImJCImISpcJCEiIjckJCIrKj0oSEFVISIoJCImK10kISIiNyQkIit5MzlBVSEiKCQiJjVdJCEiIjckJCIrcFUpPkElISIoJCImP10kISIiNyQkIitmdCM9QSUhIigkIiZJXSQhIiI3JCQiK1ssbkBVISIoJCImU10kISIiNyQkIitORV5AVSEiKCQiJl1dJCEiIjckJCIrPltOQFUhIigkIiZnXSQhIiI3JCQiKypwJz5AVSEiKCQiJnFdJCEiIjckJCIrdiNRNUElISIoJCImITNOISIiNyQkIitZJnozQSUhIigkIiYhNE4hIiI3JCQiKzYwcz9VISIoJCImK14kISIiNyQkIitwNmM/VSEiKCQiJjVeJCEiIjckJCIqXywvQSUhIickIiY/XiQhIiI3JCQiK2k6Qz9VISIoJCImSV4kISIiNyQkIislSCIzP1UhIigkIiZTXiQhIiI3JCQiKzwyIyo+VSEiKCQiJl1eJCEiIjckJCIrRylmKD5VISIoJCImZ14kISIiNyQkIitHJylmPlUhIigkIiZxXiQhIiI3JCQiKzlyVj5VISIoJCImIT1OISIiNyQkIispR3YjPlUhIigkIiYhPk4hIiI3JCQiK1lKNj5VISIoJCImK18kISIiNyQkIipwXSo9VSEiJyQiJjVfJCEiIjckJCIrPHp5PVUhIigkIiY/XyQhIiI3JCQiK0ZbaT1VISIoJCImSV8kISIiNyQkIis+OVk9VSEiKCQiJlNfJCEiIjckJCIrJHAoSD1VISIoJCImXV8kISIiNyQkIitaTzg9VSEiKCQiJmdfJCEiIjckJCIqR3B6QCUhIickIiZxXyQhIiI3JCQiKyJmL3lAJSEiKCQiJiFHTiEiIjckJCIqZVJ3QCUhIickIiYhSE4hIiI3JCQiK1lVWjxVISIoJCImK2AkISIiNyQkIispZTN0QCUhIigkIiY1YCQhIiI3JCQiKzBFOTxVISIoJCImP2AkISIiNyQkIismSHdwQCUhIigkIiZJYCQhIiI3JCQiK2YnNG9AJSEiKCQiJlNgJCEiIjckJCIrJXBVbUAlISIoJCImXWAkISIiNyQkIissYVo7VSEiKCQiJmdgJCEiIjckJCIreXhJO1UhIigkIiZxYCQhIiI3JCQiK0MpUmhAJSEiKCQiJiFRTiEiIjckJCIrUjooZkAlISIoJCImIVJOISIiNyQkIitASCFlQCUhIigkIiYrYSQhIiI3JCQiK3BSajpVISIoJCImNWEkISIiNyQkIiskb2thQCUhIigkIiY/YSQhIiI3JCQiK2hdSDpVISIoJCImSWEkISIiNyQkIisuXjc6VSEiKCQiJlNhJCEiIjckJCIrMlsmXEAlISIoJCImXWEkISIiNyQkIit0VHk5VSEiKCQiJmdhJCEiIjckJCIrKj44WUAlISIoJCImcWEkISIiNyQkIismKT1XOVUhIigkIiYhW04hIiI3JCQiKkJxVUAlISInJCImIVxOISIiNyQkIitLIyk0OVUhIigkIiYrYiQhIiI3JCQiKyIqZSNSQCUhIigkIiY1YiQhIiI3JCQiKzBLdjhVISIoJCImP2IkISIiNyQkIit0LGU4VSEiKCQiJkliJCEiIjckJCIrJ3oxTUAlISIoJCImU2IkISIiNyQkIioyTEtAJSEiJyQiJl1iJCEiIjckJCIrJyoqZUlAJSEiKCQiJmdiJCEiIjckJCIrc1gpR0AlISIoJCImcWIkISIiNyQkIispejRGQCUhIigkIiYhZU4hIiI3JCQiK3NZYDdVISIoJCImIWZOISIiNyQkIiskPmZCQCUhIigkIiYrYyQhIiI3JCQiKk8kPTdVISInJCImNWMkISIiNyQkIit0cis3VSEiKCQiJj9jJCEiIjckJCIrSDEkPUAlISIoJCImSWMkISIiNyQkIitHUGw2VSEiKCQiJlNjJCEiIjckJCIrcGtaNlUhIigkIiZdYyQhIiI3JCQiK14pKUg2VSEiKCQiJmdjJCEiIjckJCIrczM3NlUhIigkIiZxYyQhIiI3JCQiK0tEJTRAJSEiKCQiJiFvTiEiIjckJCIqJFF3NVUhIickIiYhcE4hIiI3JCQiK2paZTVVISIoJCImK2QkISIiNyQkIitLYFM1VSEiKCQiJjVkJCEiIjckJCIrTmJBNVUhIigkIiY/ZCQhIiI3JCQiKlBYK0AlISInJCImSWQkISIiNyQkIitRWycpNFUhIigkIiZTZCQhIiI3JCQiK09SbzRVISIoJCImXWQkISIiNyQkIitqRV00VSEiKCQiJmdkJCEiIjckJCIrPjVLNFUhIigkIiZxZCQhIiI3JCQiKywhUiI0VSEiKCQiJiF5TiEiIjckJCIqaGMqM1UhIickIiYhek4hIiI3JCQiK1ZReDNVISIoJCImK2UkISIiNyQkIikyZjNVISImJCImNWUkISIiNyQkIio9MiUzVSEiJyQiJj9lJCEiIjckJCIqR0IjM1UhIickIiZJZSQhIiI3JCQiKywhUiEzVSEiKCQiJlNlJCEiIjckJCIqTWF5PyUhIickIiZdZSQhIiI3JCQiKydIcHc/JSEiKCQiJmdlJCEiIjckJCIrcFFbMlUhIigkIiZxZSQhIiI3JCQiK2QhKUgyVSEiKCQiJiEpZSQhIiI3JCQiK2Y9NjJVISIoJCImISplJCEiIjckJCIrdF8jcD8lISIoJCImK2YkISIiNyQkIisqSFFuPyUhIigkIiY1ZiQhIiI3JCQiK000YjFVISIoJCImP2YkISIiNyQkIit5Sk8xVSEiKCQiJklmJCEiIjckJCIqLnZoPyUhIickIiZTZiQhIiI3JCQiKylbJylmPyUhIigkIiZdZiQhIiI3JCQiK152ejBVISIoJCImZ2YkISIiNyQkIis8IzNjPyUhIigkIiZxZiQhIiI3JCQiKyZbPWE/JSEiKCQiJiEpZiQhIiI3JCQiK2IkR18/JSEiKCQiJiEqZiQhIiI3JCQiK0N5LjBVISIoJCImK2ckISIiNyQkIisiKm8lWz8lISIoJCImNWckISIiNyQkIitjYmwvVSEiKCQiJj9nJCEiIjckJCIrO1FZL1UhIigkIiZJZyQhIiI3JCQiKm5yVT8lISInJCImU2ckISIiNyQkIis8InpTPyUhIigkIiZdZyQhIiI3JCQiK2JoKVE/JSEiKCQiJmdnJCEiIjckJCIrJXkjcC5VISIoJCImcWckISIiNyQkIissISpcLlUhIigkIiYhM08hIiI3JCQiKzBbSS5VISIoJCImITRPISIiNyQkIisnPjVKPyUhIigkIiYraCQhIiI3JCQiK3JeIkg/JSEiKCQiJjVoJCEiIjckJCIrSCg+Rj8lISIoJCImP2gkISIiNyQkIitvUV8tVSEiKCQiJkloJCEiIjckJCIrKWVGQj8lISIoJCImU2gkISIiNyQkIisoKTM4LVUhIigkIiZdaCQhIiI3JCQiK2pQJD4/JSEiKCQiJmdoJCEiIjckJCIrOWl0LFUhIigkIiZxaCQhIiI3JCQiKkNROj8lISInJCImIT1PISIiNyQkIitSKVI4PyUhIigkIiYhPk8hIiI3JCQiKzQ1OSxVISIoJCImK2kkISIiNyQkIitcPCU0PyUhIigkIiY1aSQhIiI3JCQiK2U/dStVISIoJCImP2kkISIiNyQkIitMPmErVSEiKCQiJklpJCEiIjckJCIrdThNK1UhIigkIiZTaSQhIiI3JCQiK3kuOStVISIoJCImXWkkISIiNyQkIitXKlEqKj4lISIoJCImZ2kkISIiNyQkIitycXQqPiUhIigkIiZxaSQhIiI3JCQiK2RaYCo+JSEiKCQiJiFHTyEiIjckJCIrLD9MKj4lISIoJCImIUhPISIiNyQkIikpRyIqPiUhIiYkIiYraiQhIiI3JCQiK2FeIyopPiUhIigkIiY1aiQhIiI3JCQiK2g1cyk+JSEiKCQiJj9qJCEiIjckJCIrPWxeKT4lISIoJCImSWokISIiNyQkIitEOkopPiUhIigkIiZTaiQhIiI3JCQiKjMxIik+JSEiJyQiJl1qJCEiIjckJCIqPSt6PiUhIickIiZnaiQhIiI3JCQiK0VRcCg+JSEiKCQiJnFqJCEiIjckJCIrOXFbKD4lISIoJCImIVFPISIiNyQkIitWKHpzPiUhIigkIiYhUk8hIiI3JCQiKzc/Mig+JSEiKCQiJitrJCEiIjckJCIrPVEnbz4lISIoJCImNWskISIiNyQkIio7Ym0+JSEiJyQiJj9rJCEiIjckJCIrUGdXJz4lISIoJCImSWskISIiNyQkIitZa0InPiUhIigkIiZTayQhIiI3JCQiKydRRWc+JSEiKCQiJl1rJCEiIjckJCIrYmUiZT4lISIoJCImZ2skISIiNyQkIiteW2cmPiUhIigkIiZxayQhIiI3JCQiK3RMUiY+JSEiKCQiJiFbTyEiIjckJCIrPTk9Jj4lISIoJCImIVxPISIiNyQkIisnKSpvXD4lISIoJCImK2wkISIiNyQkIit0Z3YlPiUhIigkIiY1bCQhIiI3JCQiK3pFYSU+JSEiKCQiJj9sJCEiIjckJCIpKUdWPiUhIiYkIiZJbCQhIiI3JCQiK1BXNiU+JSEiKCQiJlNsJCEiIjckJCIrJ2UqKlE+JSEiKCQiJl1sJCEiIjckJCIrWVVvJD4lISIoJCImZ2wkISIiNyQkIis5JW9NPiUhIigkIiZxbCQhIiI3JCQiKjRfSz4lISInJCImIWVPISIiNyQkIityXy4kPiUhIigkIiYhZk8hIiI3JCQiK2J6Ikc+JSEiKCQiJittJCEiIjckJCIqOStFPiUhIickIiY1bSQhIiI3JCQiK0M9USM+JSEiKCQiJj9tJCEiIjckJCIrMEk7Iz4lISIoJCImSW0kISIiNyQkIisjb1Y+PiUhIigkIiZTbSQhIiI3JCQiK19RcyI+JSEiKCQiJl1tJCEiIjckJCIrOE5dIj4lISIoJCImZ20kISIiNyQkIitrRUciPiUhIigkIiZxbSQhIiI3JCQiKyw4MSI+JSEiKCQiJiFvTyEiIjckJCIrQyVSMz4lISIoJCImIXBPISIiNyQkIiouPDE+JSEiJyQiJituJCEiIjckJCIrPFRSIT4lISIoJCImNW4kISIiNyQkIiskb3EsPiUhIigkIiY/biQhIiI3JCQiK0RuJSoqPSUhIigkIiZJbiQhIiI3JCQiK1VBcyo9JSEiKCQiJlNuJCEiIjckJCIrS3NcKj0lISIoJCImXW4kISIiNyQkIisjcHIjKj0lISIoJCImZ24kISIiNyQkIippWCEqPSUhIickIiZxbiQhIiI3JCQiKzohPikpPSUhIigkIiYheU8hIiI3JCQiK3Q9Zik9JSEiKCQiJiF6TyEiIjckJCIrIz5rJCk9JSEiKCQiJitvJCEiIjckJCIrcmY4KT0lISIoJCImNW8kISIiNyQkIisycyF6PSUhIigkIiY/byQhIiI3JCQiKykqeW4oPSUhIigkIiZJbyQhIiI3JCQiK1UhW3U9JSEiKCQiJlNvJCEiIjckJCIrT3dAKD0lISIoJCImXW8kISIiNyQkIit4bSlwPSUhIigkIiZnbyQhIiI3JCQiK2xedic9JSEiKCQiJnFvJCEiIjckJCIrJjRCbD0lISIoJCImISlvJCEiIjckJCIrbi9IJz0lISIoJCImISpvJCEiIjckJCIreHMwJz0lISIoJCImK3AkISIiNyQkIitCTiNlPSUhIigkIiY1cCQhIiI3JCQiKy4jKmUmPSUhIigkIiY/cCQhIiI3JCQiKzlWTiY9JSEiKCQiJklwJCEiIjckJCIrYSk9Xj0lISIoJCImU3AkISIiNyQkIiojRylbPSUhIickIiZdcCQhIiI3JCQiKkBZWT0lISInJCImZ3AkISIiNyQkIitBITRXPSUhIigkIiZxcCQhIiI3JCQiK183PCU9JSEiKCQiJiEpcCQhIiI3JCQiKyoqRyRSPSUhIigkIiYhKnAkISIiNyQkIitmUnAkPSUhIigkIiYrcSQhIiI3JCQiKlZhTT0lISInJCImNXEkISIiNyQkIis2VkAkPSUhIigkIiY/cSQhIiI3JCQiKydmdEg9JSEiKCQiJklxJCEiIjckJCIrJ0dLRj0lISIoJCImU3EkISIiNyQkIit3LlwjPSUhIigkIiZdcSQhIiI3JCQiK2p5QyM9JSEiKCQiJmdxJCEiIjckJCIrWVorIz0lISIoJCImcXEkISIiNyQkIitBNXciPSUhIigkIiYhM1AhIiI3JCQiKyhvOzo9JSEiKCQiJiE0UCEiIjckJCIrUjxGIj0lISIoJCImK3IkISIiNyQkIit3aC0iPSUhIigkIiY1ciQhIiI3JCQiKyUqKnoyPSUhIigkIiY/ciQhIiI3JCQiKj5MMD0lISInJCImSXIkISIiNyQkIitpZEchPSUhIigkIiZTciQhIiI3JCQiKzJ4LiE9JSEiKCQiJl1yJCEiIjckJCIrQSEqeXpUISIoJCImZ3IkISIiNyQkIisvKFImelQhIigkIiZxciQhIiI3JCQiKnYqR3pUISInJCImIT1QISIiNyQkIitkIlIhelQhIigkIiYhPlAhIiI3JCQiK0J6eXlUISIoJCImK3MkISIiNyQkIitWZ2B5VCEiKCQiJjVzJCEiIjckJCIrOk5HeVQhIigkIiY/cyQhIiI3JCQiK1AuLnlUISIoJCImSXMkISIiNyQkIisvbHh4VCEiKCQiJlNzJCEiIjckJCIrOj9feFQhIigkIiZdcyQhIiI3JCQiK2xvRXhUISIoJCImZ3MkISIiNyQkIiteNSx4VCEiKCQiJnFzJCEiIjckJCIrclh2d1QhIigkIiYhR1AhIiI3JCQiK0B1XHdUISIoJCImIUhQISIiNyQkIispZlJpPCUhIigkIiYrdCQhIiI3JCQiKyk0IilmPCUhIigkIiY1dCQhIiI3JCQiKz4+c3ZUISIoJCImP3QkISIiNyQkIitjP1l2VCEiKCQiJkl0JCEiIjckJCIrMzo/dlQhIigkIiZTdCQhIiI3JCQiKkZTXDwlISInJCImXXQkISIiNyQkIitRJHlZPCUhIigkIiZndCQhIiI3JCQiKnI6VzwlISInJCImcXQkISIiNyQkIisjUV9UPCUhIigkIiYhUVAhIiI3JCQiK14kKSlRPCUhIigkIiYhUlAhIiI3JCQiKzdPaXRUISIoJCImK3UkISIiNyQkIitqImVMPCUhIigkIiY1dSQhIiI3JCQiKCM0dFQhIiUkIiY/dSQhIiI3JCQiKz5eI0c8JSEiKCQiJkl1JCEiIjckJCIrPHZic1QhIigkIiZTdSQhIiI3JCQiKyo9KkdzVCEiKCQiJl11JCEiIjckJCIrTCwtc1QhIigkIiZndSQhIiI3JCQiK1cudnJUISIoJCImcXUkISIiNyQkIis+KXo5PCUhIigkIiYhW1AhIiI3JCQiK2EmMzc8JSEiKCQiJiFcUCEiIjckJCIrWGwkNDwlISIoJCImK3YkISIiNyQkIisqeWoxPCUhIigkIiY1diQhIiI3JCQiKkchUnFUISInJCImP3YkISIiNyQkIis7ZzZxVCEiKCQiJkl2JCEiIjckJCIrJCo0JSlwVCEiKCQiJlN2JCEiIjckJCIrMV9jcFQhIigkIiZddiQhIiI3JCQiK14nKUdwVCEiKCQiJmd2JCEiIjckJCIrRDgscFQhIigkIiZxdiQhIiI3JCQiK0JLdG9UISIoJCImIWVQISIiNyQkIipNYSVvVCEiJyQiJiFmUCEiIjckJCIrdVk8b1QhIigkIiYrdyQhIiI3JCQiKz5VKnk7JSEiKCQiJjV3JCEiIjckJCIrc0hoblQhIigkIiY/dyQhIiI3JCQiK0c0TG5UISIoJCImSXckISIiNyQkIiskM1txOyUhIigkIiZTdyQhIiI3JCQiK0tXd21UISIoJCImXXckISIiNyQkIityKnprOyUhIigkIiZndyQhIiI3JCQiKyZwJT5tVCEiKCQiJnF3JCEiIjckJCIpJzNmOyUhIiYkIiYhb1AhIiI3JCQiKyNvQGM7JSEiKCQiJiFwUCEiIjckJCIrT1JMbFQhIigkIiYreCQhIiI3JCQiK2RgL2xUISIoJCImNXgkISIiNyQkIiolZnZrVCEiJyQiJj94JCEiIjckJCIrIm9sVzslISIoJCImSXgkISIiNyQkIit3WDxrVCEiKCQiJlN4JCEiIjckJCIrPkUpUTslISIoJCImXXgkISIiNyQkIiswKSplalQhIigkIiZneCQhIiI3JCQiK0hoSGpUISIoJCImcXgkISIiNyQkIisoZSxJOyUhIigkIiYheVAhIiI3JCQiK3VocWlUISIoJCImIXpQISIiNyQkIismKSk0QzslISIoJCImK3kkISIiNyQkIis4RjZpVCEiKCQiJjV5JCEiIjckJCIrYlkiPTslISIoJCImP3kkISIiNyQkIisxZF5oVCEiKCQiJkl5JCEiIjckJCIrZmVAaFQhIigkIiZTeSQhIiI3JCQiKjY6NDslISInJCImXXkkISIiNyQkIitgTWhnVCEiKCQiJmd5JCEiIjckJCIrJCkzSmdUISIoJCImcXkkISIiNyQkIislUjIrOyUhIigkIiYhKXkkISIiNyQkIisiKUhxZlQhIigkIiYhKnkkISIiNyQkIitSd1JmVCEiKCQiJit6JCEiIjckJCIraDg0ZlQhIigkIiY1eiQhIiI3JCQiK1ZUeWVUISIoJCImP3okISIiNyQkIit5ZlplVCEiKCQiJkl6JCEiIjckJCIqJ287ZVQhIickIiZTeiQhIiI3JCQiKyV5Y3k6JSEiKCQiJl16JCEiIjckJCIrV2RhZFQhIigkIiZneiQhIiI3JCQiK01QQmRUISIoJCImcXokISIiNyQkIitbMiNwOiUhIigkIiYhKXokISIiNyQkIit6bmdjVCEiKCQiJiEqeiQhIiI3JCQiK0E9SGNUISIoJCImKyFRISIiNyQkIityZShmOiUhIigkIiY1IVEhIiI3JCQiKz0qZWM6JSEiKCQiJj8hUSEiIjckJCIrZTRNYlQhIigkIiZJIVEhIiI3JCQiKyYpPi1iVCEiKCQiJlMhUSEiIjckJCIrIio+cWFUISIoJCImXSFRISIiNyQkIityNFFhVCEiKCQiJmchUSEiIjckJCIrPCplUzolISIoJCImcSFRISIiNyQkIitDZXRgVCEiKCQiJiEzUSEiIjckJCIrJG82TTolISIoJCImITRRISIiNyQkIisqWyczYFQhIigkIiYrIlEhIiI3JCQiK04td19UISIoJCImNSJRISIiNyQkIis4SFZfVCEiKCQiJj8iUSEiIjckJCIrO1g1X1QhIigkIiZJIlEhIiI3JCQiK1FdeF5UISIoJCImUyJRISIiNyQkIipaVzk6JSEiJyQiJl0iUSEiIjckJCIrMkc2XlQhIigkIiZnIlEhIiI3JCQiKi8heV1UISInJCImcSJRISIiNyQkIitpaFddVCEiKCQiJiE9USEiIjckJCIrbDY2XVQhIigkIiYhPlEhIiI3JCQiK1VdeFxUISIoJCImKyNRISIiNyQkIismeVAlXFQhIigkIiY1I1EhIiI3JCQiKydRKjRcVCEiKCQiJj8jUSEiIjckJCIrUClmKFtUISIoJCImSSNRISIiNyQkIitKIj4lW1QhIigkIiZTI1EhIiI3JCQiK2ZzMltUISIoJCImXSNRISIiNyQkIis5VXRaVCEiKCQiJmcjUSEiIjckJCIrJykqKlFaVCEiKCQiJnEjUSEiIjckJCIrblgvWlQhIigkIiYhR1EhIiI3JCQiKiZ6cFlUISInJCImIUhRISIiNyQkIitELE5ZVCEiKCQiJiskUSEiIjckJCIrJTMsZzklISIoJCImNSRRISIiNyQkIis9M2xYVCEiKCQiJj8kUSEiIjckJCIrPSQqSFhUISIoJCImSSRRISIiNyQkIit2bCVcOSUhIigkIiZTJFEhIiI3JCQiKmUjZldUISInJCImXSRRISIiNyQkIitEdEJXVCEiKCQiJmckUSEiIjckJCIrKnohKVE5JSEiKCQiJnEkUSEiIjckJCIrJCpIX1ZUISIoJCImIVFRISIiNyQkIisoKlE7VlQhIigkIiYhUlEhIiI3JCQiKy5OIUc5JSEiKCQiJislUSEiIjckJCIpPVdVVCEiJiQiJjUlUSEiIjckJCIreih5PzklISIoJCImPyVRISIiNyQkIitIV3JUVCEiKCQiJkklUSEiIjckJCIqdVs4OSUhIickIiZTJVEhIiI3JCQiKy08KTQ5JSEiKCQiJl0lUSEiIjckJCIrMExoU1QhIigkIiZnJVEhIiI3JCQiK1BOQ1NUISIoJCImcSVRISIiNyQkIisqUXMpUlQhIigkIiYhW1EhIiI3JCQiKiYpKlxSVCEiJyQiJiFcUSEiIjckJCIrNGY3UlQhIigkIiYrJlEhIiI3JCQiK2EwdlFUISIoJCImNSZRISIiNyQkIit1UFBRVCEiKCQiJj8mUSEiIjckJCIrZWIqejglISIoJCImSSZRISIiNyQkIismKmVoUFQhIigkIiZTJlEhIiI3JCQiK3RaQlBUISIoJCImXSZRISIiNyQkIit6QCZvOCUhIigkIiZnJlEhIiI3JCQiKy4ib2s4JSEiKCQiJnEmUSEiIjckJCIrS0QzT1QhIigkIiYhZVEhIiI3JCQiK2BhcE5UISIoJCImIWZRISIiNyQkIithb0lOVCEiKCQiJisnUSEiIjckJCIrQm4iXDglISIoJCImNSdRISIiNyQkIitZXV9NVCEiKCQiJj8nUSEiIjckJCIrNj04TVQhIigkIiZJJ1EhIiI3JCQiKy9xdExUISIoJCImUydRISIiNyQkIis4MU1MVCEiKCQiJl0nUSEiIjckJCIrQkUlSDglISIoJCImZydRISIiNyQkIitASWFLVCEiKCQiJnEnUSEiIjckJCIrJHpUQDglISIoJCImIW9RISIiNyQkIitEKlE8OCUhIigkIiYhcFEhIiI3JCQiKy1XTEpUISIoJCImKyhRISIiNyQkIipARzQ4JSEiJyQiJjUoUSEiIjckJCIrTi5fSVQhIigkIiY/KFEhIiI3JCQiK2gyNklUISIoJCImSShRISIiNyQkIitzJSpwSFQhIigkIiZTKFEhIiI3JCQiK2JrR0hUISIoJCImXShRISIiNyQkIiskcHIpR1QhIigkIiZnKFEhIiI3JCQiKjxiJUdUISInJCImcShRISIiNyQkIiooby5HVCEiJyQiJiF5USEiIjckJCIreG5oRlQhIigkIiYhelEhIiI3JCQiK3ZbPkZUISIoJCImKylRISIiNyQkIitZNnhFVCEiKCQiJjUpUSEiIjckJCIrdGJNRVQhIigkIiY/KVEhIiI3JCQiKjk9ZjclISInJCImSSlRISIiNyQkIitHKSlbRFQhIigkIiZTKVEhIiI3JCQiKz53MERUISIoJCImXSlRISIiNyQkIisnXENZNyUhIigkIiZnKVEhIiI3JCQiKlcqPUNUISInJCImcSlRISIiNyQkIitMQ3ZCVCEiKCQiJiEpKVEhIiI3JCQiK2FNSkJUISIoJCImISopUSEiIjckJCIrJ1tzRzclISIoJCImKypRISIiNyQkIiszJkhDNyUhIigkIiY1KlEhIiI3JCQiKVgpPjclISImJCImPypRISIiNyQkIitVdWBAVCEiKCQiJkkqUSEiIjckJCIrOSQpM0BUISIoJCImUypRISIiNyQkIismNFAxNyUhIigkIiZdKlEhIiI3JCQiK2lQPT9UISIoJCImZypRISIiNyQkIismSEcoPlQhIigkIiZxKlEhIiI3JCQiK3MxRj5UISIoJCImISkqUSEiIjckJCIqKDMiKT1UISInJCImISoqUSEiIjckJCIrbSlbJD1UISIoJCImKyFSISIiNyQkIitRWSl5NiUhIigkIiY1IVIhIiI3JCQiK2giPXU2JSEiKCQiJj8hUiEiIjckJCIrOCVccDYlISIoJCImSSFSISIiNyQkIituJHlrNiUhIigkIiZTIVIhIiI3JCQiKyxdKztUISIoJCImXSFSISIiNyQkIisoR0hiNiUhIigkIiZnIVIhIiI3JCQiKy03MDpUISIoJCImcSFSISIiNyQkIis9MmQ5VCEiKCQiJiEzUiEiIjckJCIrNHkzOVQhIigkIiYhNFIhIiI3JCQiK1tDZzhUISIoJCImKyJSISIiNyQkIisyWTY4VCEiKCQiJjUiUiEiIjckJCIrZlVpN1QhIigkIiY/IlIhIiI3JCQiK3U4ODdUISIoJCImSSJSISIiNyQkIitDZmo2VCEiKCQiJlMiUiEiIjckJCIrenk4NlQhIigkIiZdIlIhIiI3JCQiKzNzajVUISIoJCImZyJSISIiNyQkIisiKVE4NVQhIigkIiZxIlIhIiI3JCQiK255aTRUISIoJCImIT1SISIiNyQkIitMIj4iNFQhIigkIiYhPlIhIiI3JCQiK1p3ZzNUISIoJCImKyNSISIiNyQkIit2TDQzVCEiKCQiJjUjUiEiIjckJCIrJkd3djUlISIoJCImPyNSISIiNyQkIipNY3E1JSEiJyQiJkkjUiEiIjckJCIrMU5gMVQhIigkIiZTI1IhIiI3JCQiK1l4KzFUISIoJCImXSNSISIiNyQkIitEIXphNSUhIigkIiZnI1IhIiI3JCQiKzB0JVw1JSEiKCQiJnEjUiEiIjckJCIrWkRUL1QhIigkIiYhR1IhIiI3JCQiKzhaKFE1JSEiKCQiJiFIUiEiIjckJCIraVBMLlQhIigkIiYrJFIhIiI3JCQiK2EnKnktVCEiKCQiJjUkUiEiIjckJCIrWkJDLVQhIigkIiY/JFIhIiI3JCQiKyp6InAsVCEiKCQiJkkkUiEiIjckJCIrb3o4LFQhIigkIiZTJFIhIiI3JCQiKzIzZStUISIoJCImXSRSISIiNyQkIit0LS0rVCEiKCQiJmckUiEiIjckJCIrPWpYKjQlISIoJCImcSRSISIiNyQkIisoKikpKSkpNCUhIigkIiYhUVIhIiI3JCQiK2Z6Sik0JSEiKCQiJiFSUiEiIjckJCIrZE11KDQlISIoJCImKyVSISIiNyQkIitSYDsoNCUhIigkIiY1JVIhIiI3JCQiK2BOZSc0JSEiKCQiJj8lUiEiIjckJCIrWyEpKmY0JSEiKCQiJkklUiEiIjckJCIrbygzYTQlISIoJCImUyVSISIiNyQkIitlYyJbNCUhIigkIiZdJVIhIiI3JCQiK2knPVU0JSEiKCQiJmclUiEiIjckJCIrQHhoJDQlISIoJCImcSVSISIiNyQkIit3RiwkNCUhIigkIiYhW1IhIiI3JCQiK21QUyM0JSEiKCQiJiFcUiEiIjckJCIrSDF6IjQlISIoJCImKyZSISIiNyQkIilMPCI0JSEiJiQiJjUmUiEiIjckJCIrOTxiITQlISIoJCImPyZSISIiNyQkIisuZSMqKjMlISIoJCImSSZSISIiNyQkIisqXCZIKjMlISIoJCImUyZSISIiNyQkIitKMm0pMyUhIigkIiZdJlIhIiI3JCQiK0U5LSkzJSEiKCQiJmcmUiEiIjckJCIrNHZQKDMlISIoJCImcSZSISIiNyQkIiswKkduMyUhIigkIiYhZVIhIiI3JCQiK01iMiczJSEiKCQiJiFmUiEiIjckJCIrO3RUJjMlISIoJCImKydSISIiNyQkIituVHYlMyUhIigkIiY1J1IhIiI3JCQiKy5nMyUzJSEiKCQiJj8nUiEiIjckJCIrT0ZUJDMlISIoJCImSSdSISIiNyQkIit3VXQjMyUhIigkIiZTJ1IhIiI3JCQiK0owMCMzJSEiKCQiJl0nUiEiIjckJCIrLzlPIjMlISIoJCImZydSISIiNyQkIispem0xMyUhIigkIiZxJ1IhIiI3JCQiKzZtJyp6UyEiKCQiJiFvUiEiIjckJCIrVDJFelMhIigkIiYhcFIhIiI3JCQiK3ohXCZ5UyEiKCQiJisoUiEiIjckJCIrOzokeTIlISIoJCImNShSISIiNyQkIitPejV4UyEiKCQiJj8oUiEiIjckJCIrQyN5ajIlISIoJCImSShSISIiNyQkIitlQWt2UyEiKCQiJlMoUiEiIjckJCIrOSoqKlsyJSEiKCQiJl0oUiEiIjckJCIraDU6dVMhIigkIiZnKFIhIiI3JCQiK25iUnRTISIoJCImcShSISIiNyQkIismSExFMiUhIigkIiYheVIhIiI3JCQiKy1UJz0yJSEiKCQiJiF6UiEiIjckJCIrVHkzclMhIigkIiYrKVIhIiI3JCQiK2hWSXFTISIoJCImNSlSISIiNyQkIisvTl5wUyEiKCQiJj8pUiEiIjckJCIrMl5yb1MhIigkIiZJKVIhIiI3JCQiKywhNHoxJSEiKCQiJlMpUiEiIjckJCIrOF00blMhIigkIiZdKVIhIiI3JCQiKidIRm1TISInJCImZylSISIiNyQkIitiRVdsUyEiKCQiJnEpUiEiIjckJCIrLlJna1MhIigkIiYhKSlSISIiNyQkIistbHZqUyEiKCQiJiEqKVIhIiI3JCQiK1UtIUgxJSEiKCQiJisqUiEiIjckJCIrL1wuaVMhIigkIiY1KlIhIiI3JCQiK2gtO2hTISIoJCImPypSISIiNyQkIit3Z0ZnUyEiKCQiJkkqUiEiIjckJCIrMEBRZlMhIigkIiZTKlIhIiI3JCQiKyI0eSVlUyEiKCQiJl0qUiEiIjckJCIrblBjZFMhIigkIiZnKlIhIiI3JCQiK2EpUW0wJSEiKCQiJnEqUiEiIjckJCIraUlxYlMhIigkIiYhKSpSISIiNyQkIispM2NaMCUhIigkIiYhKipSISIiNyQkIis6d3pgUyEiKCQiJisrJSEiIjckJCIqSkZHMCUhIickIiY1KyUhIiI3JCQiK0ZbJT0wJSEiKCQiJj8rJSEiIjckJCIrLilcMzAlISIoJCImSSslISIiNyQkIitjPSUpXFMhIigkIiZTKyUhIiI3JCQiKyhlPylbUyEiKCQiJl0rJSEiIjckJCIreGJ5WlMhIigkIiZnKyUhIiI3JCQiKyRRT24vJSEiKCQiJnErJSEiIjckJCIrV0RuWFMhIigkIiYhM1MhIiI3JCQiKmQkZldTISInJCImITRTISIiNyQkIitZKilcVlMhIigkIiYrLCUhIiI3JCQiK0oiKVFVUyEiKCQiJjUsJSEiIjckJCIrXjBFVFMhIigkIiY/LCUhIiI3JCQiKypmOiwvJSEiKCQiJkksJSEiIjckJCIrTkUmKlFTISIoJCImUywlISIiNyQkIit6NHhQUyEiKCQiJl0sJSEiIjckJCIqIipwbC4lISInJCImZywlISIiNyQkIitoJ1tgLiUhIigkIiZxLCUhIiI3JCQiKzxrNU1TISIoJCImIT1TISIiNyQkIis2QiVHLiUhIigkIiYhPlMhIiI3JCQiKzthYkpTISIoJCImKy0lISIiNyQkIitVWkNJUyEiKCQiJjUtJSEiIjckJCIrSCM0KkdTISIoJCImPy0lISIiNyQkIitVeGFGUyEiKCQiJkktJSEiIjckJCIrdWkoNC4lISIoJCImUy0lISIiNyQkIitQbmpIUyEiKCQiJl0tJSEiIjckJCIrLDdGR1MhIigkIiZnLSUhIiI3JCQiKyhReW8tJSEiKCQiJnEtJSEiIjckJCIrOXBYRFMhIigkIiYhR1MhIiI3JCQiK2khW094JCEiKCQiJiFIUyEiIjckJCIrXz1fQVMhIigkIiYrLiUhIiItJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNiQ3ZWd6NyQtJSZGbG9hdEc2IyUpaW5maW5pdHlHJCIiISEiIjckJCIrOGJtLiMpISIpJCIjNSEiIjckJCIrVSd5VzIqISIpJCIjPyEiIjckJCIrV2U9RicqISIpJCIjSSEiIjckJCIrIipRNy81ISIoJCIjUyEiIjckJCIrJyozZ1A1ISIoJCIjXSEiIjckJCIrQVkqZTEiISIoJCIjZyEiIjckJCIrPEZeITQiISIoJCIjcSEiIjckJCIrKD14QjYiISIoJCIjISkhIiI3JCQiK2xfNEs2ISIoJCIjISohIiI3JCQiK04jKjNdNiEiKCQiJCsiISIiNyQkIipHbG07IiEiJyQiJDUiISIiNyQkIitoRzAjPSIhIigkIiQ/IiEiIjckJCIrPidHaz4iISIoJCIkSSIhIiI3JCQiKTskKjQ3ISImJCIkUyIhIiI3JCQiK0JMbkE3ISIoJCIkXSIhIiI3JCQiK3hZdU03ISIoJCIkZyIhIiI3JCQiK3AyQVk3ISIoJCIkcSIhIiI3JCQiKz5XO2Q3ISIoJCIkIT0hIiI3JCQiK0woR3dFIiEiKCQiJCE+ISIiNyQkIitLIWZ3RiIhIigkIiQrIyEiIjckJCIrPlZIKEciISIoJCIkNSMhIiI3JCQiKzwlb2xIIiEiKCQiJD8jISIiNyQkIitmM14wOCEiKCQiJEkjISIiNyQkIiskZlpUSiIhIigkIiRTIyEiIjckJCIrVzpdQTghIigkIiRdIyEiIjckJCIreklmSTghIigkIiRnIyEiIjckJCIrcy5XUTghIigkIiRxIyEiIjckJCIrOihmZ00iISIoJCIkIUchIiI3JCQiK3ZkWWA4ISIoJCIkIUghIiI3JCQiKT1uZzghIiYkIiQrJCEiIjckJCIrMCkqb244ISIoJCIkNSQhIiI3JCQiKz4yYHU4ISIoJCIkPyQhIiI3JCQiKzpYPyJRIiEiKCQiJEkkISIiNyQkIipLP3hRIiEiJyQiJFMkISIiNyQkIis0bDMlUiIhIigkIiRdJCEiIjckJCIrJ3k1LlMiISIoJCIkZyQhIiI3JCQiK2MtUzE5ISIoJCIkcSQhIiI3JCQiKyhbaEJUIiEiKCQiJCFRISIiNyQkIitoMD89OSEiKCQiJCFSISIiNyQkIitDSiNSVSIhIigkIiQrJSEiIjckJCIrRVdgSDkhIigkIiQ1JSEiIjckJCIrZSRSXVYiISIoJCIkPyUhIiI3JCQiKyVbVS9XIiEiKCQiJEklISIiNyQkIitzIVtkVyIhIigkIiRTJSEiIjckJCIrPSwnNFgiISIoJCIkXSUhIiI3JCQiK21CM2M5ISIoJCIkZyUhIiI3JCQiK08kPTZZIiEiKCQiJHElISIiNyQkIitOODJtOSEiKCQiJCFbISIiNyQkIit5VyU0WiIhIigkIiQhXCEiIjckJCIrLTJ1djkhIigkIiQrJiEiIjckJCIreUZZIVsiISIoJCIkNSYhIiI3JCQiK0RMNiZbIiEiKCQiJD8mISIiNyQkIitCW3AqWyIhIigkIiRJJiEiIjckJCIrPSc0VVwiISIoJCIkUyYhIiI3JCQiK04qZicpXCIhIigkIiRdJiEiIjckJCIrJyl5Ly46ISIoJCIkZyYhIiI3JCQiK3hhUDI6ISIoJCIkcSYhIiI3JCQiKzlZazY6ISIoJCIkIWUhIiI3JCQiKzlyJmVeIiEiKCQiJCFmISIiNyQkIisuWiw/OiEiKCQiJCsnISIiNyQkIitLIT5UXyIhIigkIiQ1JyEiIjckJCIrcjs8RzohIigkIiQ/JyEiIjckJCIrQFQ8SzohIigkIiRJJyEiIjckJCIrPXk3TzohIigkIiRTJyEiIjckJCIrSlQuUzohIigkIiRdJyEiIjckJCIrdVYqUWEiISIoJCIkZychIiI3JCQiKy0pNHhhIiEiKCQiJHEnISIiNyQkIippIlteOiEiJyQiJCFvISIiNyQkIisjKTRAYjohIigkIiQhcCEiIjckJCIrJSoqKSopZTohIigkIiQrKCEiIjckJCIqc1lEYyIhIickIiQ1KCEiIjckJCIrIj1iaGMiISIoJCIkPyghIiI3JCQiK2Vgc3A6ISIoJCIkSSghIiI3JCQiKyU+ZUtkIiEiKCQiJFMoISIiNyQkIisoZmFuZCIhIigkIiRdKCEiIjckJCIrVGFAIWUiISIoJCIkZyghIiI3JCQiK246ayRlIiEiKCQiJHEoISIiNyQkIisneUxxZSIhIigkIiQheSEiIjckJCIqKUdSIWYiISInJCIkIXohIiI3JCQiKy4nPlBmIiEiKCQiJCspISIiNyQkIisjbzlxZiIhIigkIiQ1KSEiIjckJCIqIyl5LWciISInJCIkPykhIiI3JCQiKydwN05nIiEiKCQiJEkpISIiNyQkIitqcHIxOyEiKCQiJFMpISIiNyQkIitkQSopNDshIigkIiRdKSEiIjckJCIqPlJJaCIhIickIiRnKSEiIjckJCIrYSRlaGgiISIoJCIkcSkhIiI3JCQiK0MuRD47ISIoJCIkISkpISIiNyQkIitgY0pBOyEiKCQiJCEqKSEiIjckJCIrIilbTkQ7ISIoJCIkKyohIiI3JCQiK0cmbyRHOyEiKCQiJDUqISIiNyQkIilyTko7ISImJCIkPyohIiI3JCQiKyYzQFZqIiEiKCQiJEkqISIiNyQkIitmNEVQOyEiKCQiJFMqISIiNyQkIiskPXgsayIhIigkIiRdKiEiIjckJCIrLy0yVjshIigkIiRnKiEiIjckJCIrYi8lZmsiISIoJCIkcSohIiI3JCQiK2YkKXlbOyEiKCQiJCEpKiEiIjckJCIrQ1ZoXjshIigkIiQhKiohIiI3JCQiKnY9V2wiISInJCIlKzUhIiI3JCQiK0A/P2Q7ISIoJCIlNTUhIiI3JCQiKzpYJypmOyEiKCQiJT81ISIiNyQkIisoZjFGbSIhIigkIiVJNSEiIjckJCIrQidHYW0iISIoJCIlUzUhIiI3JCQiK1I0OG87ISIoJCIlXTUhIiI3JCQiKyMpUSIzbiIhIigkIiVnNSEiIjckJCIqeXhNbiIhIickIiVxNSEiIjckJCIrXkg3dzshIigkIiUhMyIhIiI3JCQiKzQoXCh5OyEiKCQiJSE0IiEiIjckJCIrYiRlOG8iISIoJCIlKzYhIiI3JCQiKyY9XFJvIiEiKCQiJTU2ISIiNyQkIisnW0FsbyIhIigkIiU/NiEiIjckJCIrVCZ5ISpvIiEiKCQiJUk2ISIiNyQkIitBd2gicCIhIigkIiVTNiEiIjckJCIrJyoqUlRwIiEiKCQiJV02ISIiNyQkIitEZmsncCIhIigkIiVnNiEiIjckJCIraWM4KnAiISIoJCIlcTYhIiI3JCQiK2IlNDtxIiEiKCQiJSE9IiEiIjckJCIrWnYxLzwhIigkIiUhPiIhIiI3JCQiK3YsXjE8ISIoJCIlKzchIiI3JCQiK3B2JCozPCEiKCQiJTU3ISIiNyQkIitjKlw4ciIhIigkIiU/NyEiIjckJCIrYnZ1ODwhIigkIiVJNyEiIjckJCIrI2VJaHIiISIoJCIlUzchIiI3JCQiK1sjKlw9PCEiKCQiJV03ISIiNyQkIitmUCYzcyIhIigkIiVnNyEiIjckJCIrO1Y+QjwhIigkIiVxNyEiIjckJCIrPDZfRDwhIigkIiUhRyIhIiI3JCQiK2BWJHlzIiEiKCQiJSFIIiEiIjckJCIrOFU4STwhIigkIiUrOCEiIjckJCIrIykzVUs8ISIoJCIlNTghIiI3JCQiK1JYcE08ISIoJCIlPzghIiI3JCQiK2lgJnB0IiEiKCQiJUk4ISIiNyQkIitDTj9SPCEiKCQiJVM4ISIiNyQkIiskPlI5dSIhIigkIiVdOCEiIjckJCIrT0RtVjwhIigkIiVnOCEiIjckJCIrOVAoZXUiISIoJCIlcTghIiI3JCQiKykpRzJbPCEiKCQiJSFRIiEiIjckJCIrNy1FXTwhIigkIiUhUiIhIiI3JCQiK1JlVl88ISIoJCIlKzkhIiI3JCQiKz4qKmZhPCEiKCQiJTU5ISIiNyQkIisqZl9udiIhIigkIiU/OSEiIjckJCIrQVMqKWU8ISIoJCIlSTkhIiI3JCQiKkxDNXciISInJCIlUzkhIiI3JCQiKm1WSnciISInJCIlXTkhIiI3JCQiK1tARGw8ISIoJCIlZzkhIiI3JCQiK0YqXHR3IiEiKCQiJXE5ISIiNyQkIitGclZwPCEiKCQiJSFbIiEiIjckJCIreFFecjwhIigkIiUhXCIhIiI3JCQiKy0uZXQ8ISIoJCIlKzohIiI3JCQiK0NsanY8ISIoJCIlNTohIiI3JCQiK21Fb3g8ISIoJCIlPzohIiI3JCQiK1gpPSh6PCEiKCQiJUk6ISIiNyQkIit6XnUieSIhIigkIiVTOiEiIjckJCIrInloUHkiISIoJCIlXTohIiI3JCQiK2wob2R5IiEiKCQiJWc6ISIiNyQkIitSaXcoeSIhIigkIiVxOiEiIjckJCIrOFZ2KnkiISIoJCIlIWUiISIiNyQkIiskNEw8eiIhIigkIiUhZiIhIiI3JCQiKyVvLVB6IiEiKCQiJSs7ISIiNyQkIisqPWpjeiIhIigkIiU1OyEiIjckJCIrMlpoKHoiISIoJCIlPzshIiI3JCQiK1J0Yip6IiEiKCQiJUk7ISIiNyQkIiskPSJcLD0hIigkIiVTOyEiIjckJCIrTGpULj0hIigkIiVdOyEiIjckJCIrJSlHTDA9ISIoJCIlZzshIiI3JCQiK0g0QzI9ISIoJCIlcTshIiI3JCQiK2YwOTQ9ISIoJCIlIW8iISIiNyQkIitrPS42PSEiKCQiJSFwIiEiIjckJCIrSlwiSCI9ISIoJCIlKzwhIiI3JCQiK1opKnk5PSEiKCQiJTU8ISIiNyQkIispcGNtIj0hIigkIiU/PCEiIjckJCIrbmJePT0hIigkIiVJPCEiIjckJCIrT2xPPz0hIigkIiVTPCEiIjckJCIrKG80QSM9ISIoJCIlXTwhIiI3JCQiKyxeL0M9ISIoJCIlZzwhIiI3JCQiK2FHKGUjPSEiKCQiJXE8ISIiNyQkIitESXBGPSEiKCQiJSF5IiEiIjckJCIqcDAmSD0hIickIiUheiIhIiI3JCQiK0M0Sko9ISIoJCIlKz0hIiI3JCQiKSkzSiQ9ISImJCIlNT0hIiI3JCQiKyJSKipbJD0hIigkIiU/PSEiIjckJCIrcEZvTz0hIigkIiVJPSEiIjckJCIrLyFmJVE9ISIoJCIlUz0hIiI3JCQiK20iRy0lPSEiKCQiJV09ISIiNyQkIitBLio+JT0hIigkIiVnPSEiIjckJCIrVGJ1Vj0hIigkIiVxPSEiIjckJCIrKSlRXFg9ISIoJCIlISk9ISIiNyQkIitHYUJaPSEiKCQiJSEqPSEiIjckJCIrRi0oKls9ISIoJCIlKz4hIiI3JCQiK1okKXBdPSEiKCQiJTU+ISIiNyQkIiteKT5DJj0hIigkIiU/PiEiIjckJCIpWzhhPSEiJiQiJUk+ISIiNyQkIitjSyVlJj0hIigkIiVTPiEiIjckJCIreF9hZD0hIigkIiVdPiEiIjckJCIrQjRDZj0hIigkIiVnPiEiIjckJCIrXy0kNCc9ISIoJCIlcT4hIiI3JCQiK0BMaGk9ISIoJCIlISk+ISIiNyQkIisoPSFIaz0hIigkIiUhKj4hIiI3JCQiKzA0J2YnPSEiKCQiJSs/ISIiNyQkIipgRHcnPSEiJyQiJTU/ISIiNyQkIis7VEdwPSEiKCQiJT8/ISIiNyQkIis8biQ0KD0hIigkIiVJPyEiIjckJCIrJ1EkZXM9ISIoJCIlUz8hIiI3JCQiK3RUQXU9ISIoJCIlXT8hIiI3JCQiK0oiZmUoPSEiKCQiJWc/ISIiNyQkIipKKVt4PSEiJyQiJXE/ISIiNyQkIip3NiJ6PSEiJyQiJSEzIyEiIjckJCIqYEgyKT0hIickIiUhNCMhIiI3JCQiK287TSMpPSEiKCQiJStAISIiNyQkIitBI1tSKT0hIigkIiU1QCEiIjckJCIqQ1xiKT0hIickIiU/QCEiIjckJCIrcFo5KCk9ISIoJCIlSUAhIiI3JCQiK2BbdCkpPSEiKCQiJVNAISIiNyQkIitSJj4uKj0hIigkIiVdQCEiIjckJCIrcikpKj0qPSEiKCQiJWdAISIiNyQkIislKkdaJCo9ISIoJCIlcUAhIiI3JCQiK147LyYqPSEiKCQiJSE9IyEiIjckJCIrJz0wbSo9ISIoJCIlIT4jISIiNyQkIiphaiIpKj0hIickIiUrQSEiIjckJCIrZG5yKio9ISIoJCIlNUEhIiI3JCQiK3hbRSw+ISIoJCIlP0EhIiI3JCQiK1R6IUchPiEiKCQiJUlBISIiNyQkIioqZk0vPiEiJyQiJVNBISIiNyQkIitqIXplIT4hIigkIiVdQSEiIjckJCIrLHNTMj4hIigkIiVnQSEiIjckJCIrVi8kKjM+ISIoJCIlcUEhIiI3JCQiK0QpWy8iPiEiKCQiJSFHIyEiIjckJCIrKVFpPiI+ISIoJCIlIUgjISIiNyQkIituNlo4PiEiKCQiJStCISIiNyQkIissXyhcIj4hIigkIiU1QiEiIjckJCIrRVhaOz4hIigkIiU/QiEiIjckJCIreSJweiI+ISIoJCIlSUIhIiI3JCQiKyQ+ZiU+PiEiKCQiJVNCISIiNyQkIisxWSU0Iz4hIigkIiVdQiEiIjckJCIrX2FVQT4hIigkIiVnQiEiIjckJCIrbTwhUiM+ISIoJCIlcUIhIiI3JCQiKyNldGAjPiEiKCQiJSFRIyEiIjckJCIrTDQlbyM+ISIoJCIlIVIjISIiNyQkIitgUUlHPiEiKCQiJStDISIiNyQkIit1QndIPiEiKCQiJTVDISIiNyQkIipgOzckPiEiJyQiJT9DISIiNyQkIitfam1LPiEiKCQiJUlDISIiNyQkIit0PTZNPiEiKCQiJVNDISIiNyQkIitCSmJOPiEiKCQiJV1DISIiNyQkIitNLCpwJD4hIigkIiVnQyEiIjckJCIrT0hVUT4hIigkIiVxQyEiIjckJCIqY14pUj4hIickIiUhWyMhIiI3JCQiK09nRlQ+ISIoJCIlIVwjISIiNyQkIiskUidwVT4hIigkIiUrRCEiIjckJCIraEU2Vz4hIigkIiU1RCEiIjckJCIqKFtfWD4hIickIiU/RCEiIjckJCIrWUkkcCU+ISIoJCIlSUQhIiI3JCQiKkFQJFs+ISInJCIlU0QhIiI3JCQiKz51dFw+ISIoJCIlXUQhIiI3JCQiK3JPOF4+ISIoJCIlZ0QhIiI3JCQiKy9nX18+ISIoJCIlcUQhIiI3JCQiK1ZXIlImPiEiKCQiJSFlIyEiIjckJCIrPSEqSGI+ISIoJCIlIWYjISIiNyQkIitgKHptJj4hIigkIiUrRSEiIjckJCIrd20wZT4hIigkIiU1RSEiIjckJCIrNylIJWY+ISIoJCIlP0UhIiI3JCQiKyg9KnpnPiEiKCQiJUlFISIiNyQkIitGWztpPiEiKCQiJVNFISIiNyQkIitkbl9qPiEiKCQiJV1FISIiNyQkIistXSlbJz4hIigkIiVnRSEiIjckJCIrJ2VSaSc+ISIoJCIlcUUhIiI3JCQiK0wwZm4+ISIoJCIlIW8jISIiNyQkIitweSQqbz4hIigkIiUhcCMhIiI3JCQiKzw7R3E+ISIoJCIlK0YhIiI3JCQiKyw9aXI+ISIoJCIlNUYhIiI3JCQiK1clZUgoPiEiKCQiJT9GISIiNyQkIitwOkh1PiEiKCQiJUlGISIiNyQkIisqPkBjKD4hIigkIiVTRiEiIjckJCIrZHQlcCg+ISIoJCIlXUYhIiI3JCQiK20rRnk+ISIoJCIlZ0YhIiI3JCQiK1okKmV6PiEiKCQiJXFGISIiNyQkIitCXyE0KT4hIigkIiUheSMhIiI3JCQiKzt4QCMpPiEiKCQiJSF6IyEiIjckJCIrWm9fJCk+ISIoJCIlK0chIiI3JCQiK1BFJFspPiEiKCQiJTVHISIiNyQkIiszXjgnKT4hIigkIiU/RyEiIjckJCIrIkdNdSk+ISIoJCIlSUchIiI3JCQiK3csdCkpPiEiKCQiJVNHISIiNyQkIis5Ry0hKj4hIigkIiVdRyEiIjckJCIrOkFKIio+ISIoJCIlZ0chIiI3JCQiKSUpZiMqPiEiJiQiJXFHISIiNyQkIisqUSIpUSo+ISIoJCIlISlHISIiNyQkIik3OyYqPiEiJiQiJSEqRyEiIjckJCIrYnlWJyo+ISIoJCIlK0ghIiI3JCQiK3M4cigqPiEiKCQiJTVIISIiNyQkIitwPCkqKSo+ISIoJCIlP0ghIiI3JCQiK28hXC0rIyEiKCQiJUlIISIiNyQkIismRzg6KyMhIigkIiVTSCEiIjckJCIrVFd4LT8hIigkIiVdSCEiIjckJCIrYEQuLz8hIigkIiVnSCEiIjckJCIrUndHMD8hIigkIiVxSCEiIjckJCIrPihSbCsjISIoJCIlISlIISIiNyQkIis0KSl5Mj8hIigkIiUhKkghIiI3JCQiK0ZcLjQ/ISIoJCIlK0khIiI3JCQiKyM0eS0sIyEiKCQiJTVJISIiNyQkIitAJD06LCMhIigkIiU/SSEiIjckJCIqamJGLCMhIickIiVJSSEiIjckJCIrUSsqUiwjISIoJCIlU0khIiI3JCQiK2g6QTo/ISIoJCIlXUkhIiI3JCQiKzstWDs/ISIoJCIlZ0khIiI3JCQiKz5nbjw/ISIoJCIlcUkhIiI3JCQiKygpKikqKT0/ISIoJCIlITMkISIiNyQkIitRIj4sLSMhIigkIiUhNCQhIiI3JCQiKydbTzgtIyEiKCQiJStKISIiNyQkIitaNWJBPyEiKCQiJTVKISIiNyQkIitSR3dCPyEiKCQiJT9KISIiNyQkIit3PShcLSMhIigkIiVJSiEiIjckJCIrdiJ5aC0jISIoJCIlU0ohIiI3JCQiKnYiUUY/ISInJCIlXUohIiI3JCQiKz1FZUc/ISIoJCIlZ0ohIiI3JCQiKyR6IXlIPyEiKCQiJXFKISIiNyQkIipIdzQuIyEiJyQiJSE9JCEiIjckJCIrRCJwQC4jISIoJCIlIT4kISIiNyQkIis4JGZMLiMhIigkIiUrSyEiIjckJCIrb29hTT8hIigkIiU1SyEiIjckJCIrLz10Tj8hIigkIiU/SyEiIjckJCIrUFQicC4jISIoJCIlSUshIiI3JCQiKilRNFE/ISInJCIlU0shIiI3JCQiK1s1RlI/ISIoJCIlXUshIiI3JCQiK2FjV1M/ISIoJCIlZ0shIiI3JCQiKzl4aFQ/ISIoJCIlcUshIiI3JCQiKkMoeVU/ISInJCIlIUckISIiNyQkIitaVSZSLyMhIigkIiUhSCQhIiI3JCQiK1soPV4vIyEiKCQiJStMISIiNyQkIitjMkdZPyEiKCQiJTVMISIiNyQkIismR1N1LyMhIigkIiU/TCEiIjckJCIrXHRmWz8hIigkIiVJTCEiIjckJCIqJz52XD8hIickIiVTTCEiIjckJCIrSlQhNDAjISIoJCIlXUwhIiI3JCQiK3dRMF8/ISIoJCIlZ0whIiI3JCQiKzM3P2A/ISIoJCIlcUwhIiI3JCQiK1FoTWE/ISIoJCIlIVEkISIiNyQkIipvKVtiPyEiJyQiJSFSJCEiIjckJCIrWSlHbTAjISIoJCIlK00hIiI3JCQiK1xtd2Q/ISIoJCIlNU0hIiI3JCQiKyxAISplPyEiKCQiJT9NISIiNyQkIis5Xy5nPyEiKCQiJUlNISIiNyQkIihtNjEjISIlJCIlU00hIiI3JCQiK3NXSGk/ISIoJCIlXU0hIiI3JCQiK1QxVWo/ISIoJCIlZ00hIiI3JCQiKz5YYWs/ISIoJCIlcU0hIiI3JCQiKz5obWw/ISIoJCIlIVskISIiNyQkIipYJnltPyEiJyQiJSFcJCEiIjckJCIrRUQhejEjISIoJCIlK04hIiI3JCQiK2R0LHA/ISIoJCIlNU4hIiI3JCQiK2IqSCwyIyEiKCQiJT9OISIiNyQkIitLLkNyPyEiKCQiJUlOISIiNyQkIispXFtCMiMhIigkIiVTTiEiIjckJCIra1dYdD8hIigkIiVdTiEiIjckJCIrVSNlWDIjISIoJCIlZ04hIiI3JCQiK1UpZmMyIyEiKCQiJXFOISIiNyQkIit3I2ZuMiMhIigkIiUhZSQhIiI3JCQiK2FsJnkyIyEiKCQiJSFmJCEiIjckJCIrJ29eKnk/ISIoJCIlK08hIiI3JCQiKyVvVyszIyEiKCQiJTVPISIiNyQkIitlYjgiMyMhIigkIiU/TyEiIjckJCIrPVZBIzMjISIoJCIlSU8hIiI3JCQiK3Y0SiQzIyEiKCQiJVNPISIiNyQkIitRYlIlMyMhIigkIiVdTyEiIjckJCIrPiF5YTMjISIoJCIlZ08hIiI3JCQiK0YlZWwzIyEiKCQiJXFPISIiNyQkIit0bmooMyMhIigkIiUhbyQhIiI3JCQiK2xJcikzIyEiKCQiJSFwJCEiIjckJCIrOnR5KjMjISIoJCIlK1AhIiI3JCQiK0smZjM0IyEiKCQiJTVQISIiNyQkIitFKEg+NCMhIigkIiU/UCEiIjckJCIrMXoqSDQjISIoJCIlSVAhIiI3JCQiKyMza1M0IyEiKCQiJVNQISIiNyQkIitqI0deNCMhIigkIiVdUCEiIjckJCIqWSE+JzQjISInJCIlZ1AhIiI3JCQiKm9dczQjISInJCIlcVAhIiI3JCQiK04qMyQpNCMhIigkIiUheSQhIiI3JCQiK0xfTyo0IyEiKCQiJSF6JCEiIjckJCIrI2U+LzUjISIoJCIlK1EhIiI3JCQiKyQqPlosQCEiKCQiJTVRISIiNyQkIit1Q18tQCEiKCQiJT9RISIiNyQkIitONWQuQCEiKCQiJUlRISIiNyQkIislbzxZNSMhIigkIiVTUSEiIjckJCIrSENtMEAhIigkIiVdUSEiIjckJCIrIkcwbjUjISIoJCIlZ1EhIiI3JCQiK1ppdTJAISIoJCIlcVEhIiI3JCQiK09geTNAISIoJCIlISlRISIiNyQkIitkRCMpNEAhIigkIiUhKlEhIiI3JCQiKz56JjM2IyEiKCQiJStSISIiNyQkIitIOSo9NiMhIigkIiU1UiEiIjckJCIrKDRCSDYjISIoJCIlP1IhIiI3JCQiKiRIJlI2IyEiJyQiJUlSISIiNyQkIitQNClcNiMhIigkIiVTUiEiIjckJCIrRnIrO0AhIigkIiVdUiEiIjckJCIrMTouPEAhIigkIiVnUiEiIjckJCIrJTNhIT1AISIoJCIlcVIhIiI3JCQiK3BbMj5AISIoJCIlISlSISIiNyQkIitvUTQ/QCEiKCQiJSEqUiEiIjckJCIqNDY2NyMhIickIiUrUyEiIjckJCIrVWw3QUAhIigkIiU1UyEiIjckJCIrSy05QkAhIigkIiU/UyEiIjckJCIrcEA6Q0AhIigkIiVJUyEiIjckJCIrZkI7REAhIigkIiVTUyEiIjckJCIrNjM8RUAhIigkIiVdUyEiIjckJCIrSnY8RkAhIigkIiVnUyEiIjckJCIrSEQ9R0AhIigkIiVxUyEiIjckJCIqImU9SEAhIickIiUhMyUhIiI3JCQiKyVRKD1JQCEiKCQiJSE0JSEiIjckJCIrY3M9SkAhIigkIiUrVCEiIjckJCIrTmE9S0AhIigkIiU1VCEiIjckJCIrRj49TEAhIigkIiU/VCEiIjckJCIrVG48TUAhIigkIiVJVCEiIjckJCIrJCkpcF44IyEiKCQiJVNUISIiNyQkIitoODtPQCEiKCQiJV1UISIiNyQkIisiPV5yOCMhIigkIiVnVCEiIjckJCIrXiRSIlFAISIoJCIlcVQhIiI3JCQiK3hlN1JAISIoJCIlIT0lISIiNyQkIituMjZTQCEiKCQiJSE+JSEiIjckJCIrR1M0VEAhIigkIiUrVSEiIjckJCIrbmMyVUAhIigkIiU1VSEiIjckJCIqcGJJOSMhIickIiU/VSEiIjckJCIrL1QuV0AhIigkIiVJVSEiIjckJCIrOzQsWEAhIigkIiVTVSEiIjckJCIrTGgpZjkjISIoJCIlXVUhIiI3JCQiK2goZnA5IyEiKCQiJWdVISIiNyQkIisyPSR6OSMhIigkIiVxVSEiIjckJCIreUEhKltAISIoJCIlIUclISIiNyQkIio9cilcQCEiJyQiJSFIJSEiIjckJCIqX1EzOiMhIickIiUrViEiIjckJCIrLlYhPTojISIoJCIlNVYhIiI3JCQiK1Amb0Y6IyEiKCQiJT9WISIiNyQkIitHN3RgQCEiKCQiJUlWISIiNyQkIiskUSNwYUAhIigkIiVTViEiIjckJCIrMT9sYkAhIigkIiVdViEiIjckJCIrMSxoY0AhIigkIiVnViEiIjckJCIrKG9tdjojISIoJCIlcVYhIiI3JCQiK2Q8X2VAISIoJCIlIVElISIiNyQkIitAYFpmQCEiKCQiJSFSJSEiIjckJCIrJlFGLzsjISIoJCIlK1chIiI3JCQiK2N6UGhAISIoJCIlNVchIiI3JCQiK1JxS2lAISIoJCIlP1chIiI3JCQiK1RZRmpAISIoJCIlSVchIiI3JCQiK24yQWtAISIoJCIlU1chIiI3JCQiK0NhO2xAISIoJCIlXVchIiI3JCQiKzsnM2g7IyEiKCQiJWdXISIiNyQkIiteLjBuQCEiKCQiJXFXISIiNyQkIitMMSp6OyMhIigkIiUhWyUhIiI3JCQiK3AlSCpvQCEiKCQiJSFcJSEiIjckJCIrbG8nKXBAISIoJCIlK1ghIiI3JCQiK0RHITM8IyEiKCQiJTVYISIiNyQkIitjdHRyQCEiKCQiJT9YISIiNyQkIitqL25zQCEiKCQiJUlYISIiNyQkIitfQGd0QCEiKCQiJVNYISIiNyQkIitIQ2B1QCEiKCQiJV1YISIiNyQkIispSGhhPCMhIigkIiVnWCEiIjckJCIrbSgpUXdAISIoJCIlcVghIiI3JCQiK1FbSnhAISIoJCIlIWUlISIiNyQkIis+JlIjeUAhIigkIiUhZiUhIiI3JCQiKzlHO3pAISIoJCIlK1khIiI3JCQiKnQlMyE9IyEiJyQiJTVZISIiNyQkIityXysiPSMhIigkIiU/WSEiIjckJCIrVlcjPj0jISIoJCIlSVkhIiI3JCQiKkRVRz0jISInJCIlU1khIiI3JCQiKypwZVA9IyEiKCQiJV1ZISIiNyQkIislenRZPSMhIigkIiVnWSEiIjckJCIrVHZlJj0jISIoJCIlcVkhIiI3JCQiK1cqKlwnPSMhIigkIiUhbyUhIiI3JCQiKzQ1VCg9IyEiKCQiJSFwJSEiIjckJCIqdT8kKT0jISInJCIlK1ohIiI3JCQiK1ciSCMqPSMhIigkIiU1WiEiIjckJCIrQ2k4IT4jISIoJCIlP1ohIiI3JCQiKycpPi8iPiMhIigkIiVJWiEiIjckJCIrTmslPj4jISIoJCIlU1ohIiI3JCQiK3cmXEc+IyEiKCQiJV1aISIiNyQkIis4OXYkPiMhIigkIiVnWiEiIjckJCIrXz5sJT4jISIoJCIlcVohIiI3JCQiKyg+XmI+IyEiKCQiJSF5JSEiIjckJCIrYCJcaz4jISIoJCIlIXolISIiNyQkIitEZU0oPiMhIigkIiUrWyEiIjckJCIrPTdDKT4jISIoJCIlNVshIiI3JCQiK09gOCo+IyEiKCQiJT9bISIiNyQkIislPUcrPyMhIigkIiVJWyEiIjckJCIrbig+ND8jISIoJCIlU1shIiI3JCQiKyozNT0/IyEiKCQiJV1bISIiNyQkIitjIipwLUEhIigkIiVnWyEiIjckJCIrcnBlLkEhIigkIiVxWyEiIjckJCIrUk5aL0EhIigkIiUhKVshIiI3JCQiK2wpZWA/IyEiKCQiJSEqWyEiIjckJCIrYUhDMUEhIigkIiUrXCEiIjckJCIrNGU3MkEhIigkIiU1XCEiIjckJCIrTnUrM0EhIigkIiU/XCEiIjckJCIrUHkpKTNBISIoJCIlSVwhIiI3JCQiKz5xdzRBISIoJCIlU1whIiI3JCQiKyYpXGs1QSEiKCQiJV1cISIiNyQkIitUPF82QSEiKCQiJWdcISIiNyQkIisqRyhSN0EhIigkIiVxXCEiIjckJCIrTjtGOEEhIigkIiUhKVwhIiI3JCQiKyR5V1RAIyEiKCQiJSEqXCEiIjckJCIrUG4sOkEhIigkIiUrXSEiIjckJCIrLHYpZUAjISIoJCIlNV0hIiI3JCQiK3pxdjtBISIoJCIlP10hIiI3JCQiK3hhaTxBISIoJCIlSV0hIiI3JCQiKyhwI1w9QSEiKCQiJVNdISIiNyQkIitXKGUkPkEhIigkIiVdXSEiIjckJCIrQk9BP0EhIigkIiVnXSEiIjckJCIrT3QzQEEhIigkIiVxXSEiIjckJCIrKikpXD5BIyEiKCQiJSEzJiEiIjckJCIrJ0c2R0EjISIoJCIlITQmISIiNyQkIipgck9BIyEiJyQiJSteISIiNyQkIitFMWBDQSEiKCQiJTVeISIiNyQkIit4JilRREEhIigkIiU/XiEiIjckJCIrKFFYaUEjISIoJCIlSV4hIiI3JCQiK2g1NUZBISIoJCIlU14hIiI3JCQiKy1jJnpBIyEiKCQiJV1eISIiNyQkIis6ITQpR0EhIigkIiVnXiEiIjckJCIrLThtSEEhIigkIiVxXiEiIjckJCIrcENeSUEhIigkIiUhPSYhIiI3JCQiKz5ET0pBISIoJCIlIT4mISIiNyQkIitiOUBLQSEiKCQiJStfISIiNyQkIisjR2ZJQiMhIigkIiU1XyEiIjckJCIrLmchUkIjISIoJCIlP18hIiI3JCQiK0E7dk1BISIoJCIlSV8hIiI3JCQiK1ZoZk5BISIoJCIlU18hIiI3JCQiK3AmUmtCIyEiKCQiJV1fISIiNyQkIiswPkdQQSEiKCQiJWdfISIiNyQkIithSjdRQSEiKCQiJXFfISIiNyQkIis+TCcqUUEhIigkIiUhRyYhIiI3JCQiKy9DISlSQSEiKCQiJSFIJiEiIjckJCIrOS9rU0EhIigkIiUrYCEiIjckJCIqTng5QyMhIickIiU1YCEiIjckJCIrPUtKVUEhIigkIiU/YCEiIjckJCIrQCFbSkMjISIoJCIlSWAhIiI3JCQiK2k8KVJDIyEiKCQiJVNgISIiNyQkIitXVyJbQyMhIigkIiVdYCEiIjckJCIrc2drWEEhIigkIiVnYCEiIjckJCIrXG1aWUEhIigkIiVxYCEiIjckJCIreGhJWkEhIigkIiUhUSYhIiI3JCQiK2lZOFtBISIoJCIlIVImISIiNyQkIisxQCcqW0EhIigkIiUrYSEiIjckJCIrNyYpeVxBISIoJCIlNWEhIiI3JCQiKyUpUWhdQSEiKCQiJT9hISIiNyQkIitFI1E5RCMhIigkIiVJYSEiIjckJCIqYWhBRCMhIickIiVTYSEiIjckJCIrSlEzYEEhIigkIiVdYSEiIjckJCIrLF4hUkQjISIoJCIlZ2EhIiI3JCQiK2Fgc2FBISIoJCIlcWEhIiI3JCQiKyNmV2JEIyEiKCQiJSFbJiEiIjckJCIrQEdPY0EhIigkIiUhXCYhIiI3JCQiK1UrPWRBISIoJCIlK2IhIiI3JCQiK2ZpKnpEIyEiKCQiJTViISIiNyQkIit2OSIpZUEhIigkIiU/YiEiIjckJCIrJHBEJ2ZBISIoJCIlSWIhIiI3JCQiKzwqUS9FIyEiKCQiJVNiISIiNyQkIio6XjdFIyEiJyQiJV1iISIiNyQkIismUmk/RSMhIigkIiVnYiEiIjckJCIrYkUoR0UjISIoJCIlcWIhIiI3JCQiK0w+b2pBISIoJCIlIWUmISIiNyQkIitMLVxrQSEiKCQiJSFmJiEiIjckJCIrZHZIbEEhIigkIiUrYyEiIjckJCIrNFI1bUEhIigkIiU1YyEiIjckJCIrIkg0cEUjISIoJCIlP2MhIiI3JCQiKzJQcm5BISIoJCIlSWMhIiI3JCQiKjs8Jm9BISInJCIlU2MhIiI3JCQiK2AnPiRwQSEiKCQiJV1jISIiNyQkIisqPUAsRiMhIigkIiVnYyEiIjckJCIrcjwjNEYjISIoJCIlcWMhIiI3JCQiKy05c3JBISIoJCIlIW8mISIiNyQkIislMz9ERiMhIigkIiUhcCYhIiI3JCQiK0F5SnRBISIoJCIlK2QhIiI3JCQiKzxZNnVBISIoJCIlNWQhIiI3JCQiK3QvIlxGIyEiKCQiJT9kISIiNyQkIisjUjBkRiMhIigkIiVJZCEiIjckJCIreSQqXHdBISIoJCIlU2QhIiI3JCQiK01DSHhBISIoJCIlXWQhIiI3JCQiK2lYM3lBISIoJCIlZ2QhIiI3JCQiK2xkKCl5QSEiKCQiJXFkISIiNyQkIitZZ216QSEiKCQiJSF5JiEiIjckJCIrM2FYIUcjISIoJCIlIXomISIiNyQkIithUUMiRyMhIigkIiUrZSEiIjckJCIrJ1FKP0cjISIoJCIlNWUhIiI3JCQiKzMhPUdHIyEiKCQiJT9lISIiNyQkIitBUGckRyMhIigkIiVJZSEiIjckJCIqYClRJUcjISInJCIlU2UhIiI3JCQiK1BDPCZHIyEiKCQiJV1lISIiNyQkIitWYSZmRyMhIigkIiVnZSEiIjckJCIrYHZ0J0cjISIoJCIlcWUhIiI3JCQiK3AoPXZHIyEiKCQiJSEpZSEiIjckJCIrJDQqSClHIyEiKCQiJSEqZSEiIjckJCIrRyZ5ISpHIyEiKCQiJStmISIiNyQkIit5cSYpKkcjISIoJCIlNWYhIiI3JCQiK1ZaaiFIIyEiKCQiJT9mISIiNyQkIitIOlQiSCMhIigkIiVJZiEiIjckJCIrT3U9I0gjISIoJCIlU2YhIiI3JCQiK25DJ0hIIyEiKCQiJV1mISIiNyQkIitFbXQkSCMhIigkIiVnZiEiIjckJCIrOio0WEgjISIoJCIlcWYhIiI3JCQiK05CRyZIIyEiKCQiJSEpZiEiIjckJCIrIipRMCdIIyEiKCQiJSEqZiEiIjckJCIrJWVDb0gjISIoJCIlK2chIiI3JCQiKz1XZihIIyEiKCQiJTVnISIiNyQkIislUmokKUgjISIoJCIlP2chIiI3JCQiKzo6OCpIIyEiKCQiJUlnISIiNyQkIiskeSkqKSpIIyEiKCQiJVNnISIiNyQkIistX20rQiEiKCQiJV1nISIiNyQkIit1MlYsQiEiKCQiJWdnISIiNyQkIissYj4tQiEiKCQiJXFnISIiNyQkIismUWZISSMhIigkIiUhMychIiI3JCQiKlZBUEkjISInJCIlITQnISIiNyQkIitQWVsvQiEiKCQiJStoISIiNyQkIis0Z0MwQiEiKCQiJTVoISIiNyQkIitcbCsxQiEiKCQiJT9oISIiNyQkIitlaXcxQiEiKCQiJUloISIiNyQkIio5RHZJIyEiJyQiJVNoISIiNyQkIisnPiRHM0IhIigkIiVdaCEiIjckJCIqVlMhNEIhIickIiVnaCEiIjckJCIrVm96NEIhIigkIiVxaCEiIjckJCIrUUNiNUIhIigkIiUhPSchIiI3JCQiKzxzSTZCISIoJCIlIT4nISIiNyQkIisjPWg/SiMhIigkIiUraSEiIjckJCIrUFYiR0ojISIoJCIlNWkhIiI3JCQiKyNvbU5KIyEiKCQiJT9pISIiNyQkIitBIz1WSiMhIigkIiVJaSEiIjckJCIrZCpvXUojISIoJCIlU2khIiI3JCQiKiopPWVKIyEiJyQiJV1pISIiNyQkIitCIW9sSiMhIigkIiVnaSEiIjckJCIrZmpKPEIhIigkIiVxaSEiIjckJCIpUjE9QiEiJiQiJSFHJyEiIjckJCIrXDEiKT1CISIoJCIlIUgnISIiNyQkIisxbWI+QiEiKCQiJStqISIiNyQkIit3PEk/QiEiKCQiJTVqISIiNyQkIitmaC9AQiEiKCQiJT9qISIiNyQkIitlKCp5QEIhIigkIiVJaiEiIjckJCIrd0RgQUIhIigkIiVTaiEiIjckJCIrOVlGQkIhIigkIiVdaiEiIjckJCIrdmUsQ0IhIigkIiVnaiEiIjckJCIraGp2Q0IhIigkIiVxaiEiIjckJCIrdWdcREIhIigkIiUhUSchIiI3JCQiKztdQkVCISIoJCIlIVInISIiNyQkIio+dHBLIyEiJyQiJStrISIiNyQkIisoZjV4SyMhIigkIiU1ayEiIjckJCIqQ1olR0IhIickIiU/ayEiIjckJCIqNyQ9SEIhIickIiVJayEiIjckJCIqQz0qSEIhIickIiVTayEiIjckJCIrLkVsSUIhIigkIiVdayEiIjckJCIrNGlRSkIhIigkIiVnayEiIjckJCIraSE+QEwjISIoJCIlcWshIiI3JCQiK2k2JkdMIyEiKCQiJSFbJyEiIjckJCIrOERlTEIhIigkIiUhXCchIiI3JCQiKzxKSk1CISIoJCIlK2whIiI3JCQiK3ZIL05CISIoJCIlNWwhIiI3JCQiKyozc2RMIyEiKCQiJT9sISIiNyQkIitpL11PQiEiKCQiJUlsISIiNyQkIismNEdzTCMhIigkIiVTbCEiIjckJCIrIipcJnpMIyEiKCQiJV1sISIiNyQkIiteNm9RQiEiKCQiJWdsISIiNyQkIit5bFNSQiEiKCQiJXFsISIiNyQkIit0NzhTQiEiKCQiJSFlJyEiIjckJCIrUl8mM00jISIoJCIlIWYnISIiNyQkIit4JXk6TSMhIigkIiUrbSEiIjckJCIqKjRJVUIhIickIiU1bSEiIjckJCIrekYtVkIhIigkIiU/bSEiIjckJCIrWlF1VkIhIigkIiVJbSEiIjckJCIrJj5rV00jISIoJCIlU20hIiI3JCQiK0RRPVhCISIoJCIlXW0hIiI3JCQiK1JGIWZNIyEiKCQiJWdtISIiNyQkIitSNGlZQiEiKCQiJXFtISIiNyQkIitHJVF0TSMhIigkIiUhbychIiI3JCQiKzFfMFtCISIoJCIlIXAnISIiNyQkIit3N3hbQiEiKCQiJStuISIiNyQkIitSbVtcQiEiKCQiJTVuISIiNyQkIispSCwtTiMhIigkIiU/biEiIjckJCIrYl8iNE4jISIoJCIlSW4hIiI3JCQiKl5HO04jISInJCIlU24hIiI3JCQiK241TV9CISIoJCIlXW4hIiI3JCQiK0ZIMGBCISIoJCIlZ24hIiI3JCQiKyM0a1BOIyEiKCQiJXFuISIiNyQkIitqWFphQiEiKCQiJSF5JyEiIjckJCIrVlY9YkIhIigkIiUheichIiI3JCQiK0xNKmVOIyEiKCQiJStvISIiNyQkIitOPWdjQiEiKCQiJTVvISIiNyQkIiteJjR0TiMhIigkIiU/byEiIjckJCIrJGU7IWVCISIoJCIlSW8hIiI3JCQiK0tIc2VCISIoJCIlU28hIiI3JCQiKSdHJWZCISImJCIlXW8hIiI3JCQiKmZMLE8jISInJCIlZ28hIiI3JCQiKy16JDNPIyEiKCQiJXFvISIiNyQkIitSOmFoQiEiKCQiJSEpbyEiIjckJCIrLVhDaUIhIigkIiUhKm8hIiI3JCQiKyR6WUhPIyEiKCQiJStwISIiNyQkIis5JVtPTyMhIigkIiU1cCEiIjckJCIrbSRcVk8jISIoJCIlP3AhIiI3JCQiK18nXF1PIyEiKCQiJUlwISIiNyQkIit0I1xkTyMhIigkIiVTcCEiIjckJCIqQltrTyMhIickIiVdcCEiIjckJCIrRWw5bkIhIigkIiVncCEiIjckJCIraFQleU8jISIoJCIlcXAhIiI3JCQiK1I2YW9CISIoJCIlISlwISIiNyQkIipZUCNwQiEiJyQiJSEqcCEiIjckJCIrRUokKnBCISIoJCIlK3EhIiI3JCQiK1IiRzFQIyEiKCQiJTVxISIiNyQkIilES3JCISImJCIlP3EhIiI3JCQiKzZpLHNCISIoJCIlSXEhIiI3JCQiK3YjNEZQIyEiKCQiJVNxISIiNyQkIisicCxNUCMhIigkIiVdcSEiIjckJCIrak00dUIhIigkIiVncSEiIjckJCIrImYleXVCISIoJCIlcXEhIiI3JCQiK3ldWnZCISIoJCIlITMoISIiNyQkIitDXDt3QiEiKCQiJSE0KCEiIjckJCIrS1Qmb1AjISIoJCIlK3IhIiI3JCQiKy9GYXhCISIoJCIlNXIhIiI3JCQiKmtJI3lCISInJCIlP3IhIiI3JCQiK1V6Iip5QiEiKCQiJUlyISIiNyQkIis3WWd6QiEiKCQiJVNyISIiNyQkIitfMUghUSMhIigkIiVdciEiIjckJCIramcoNFEjISIoJCIlZ3IhIiI3JCQiK1kzbSJRIyEiKCQiJXFyISIiNyQkIisvXU0jUSMhIigkIiUhPSghIiI3JCQiK1AmR0lRIyEiKCQiJSE+KCEiIjckJCIrWzlyJFEjISIoJCIlK3MhIiI3JCQiK1BQUiVRIyEiKCQiJTVzISIiNyQkIisyYTImUSMhIigkIiU/cyEiIjckJCIrZmt2JlEjISIoJCIlSXMhIiI3JCQiKyUqb1YnUSMhIigkIiVTcyEiIjckJCIrOm42KFEjISIoJCIlXXMhIiI3JCQiK0FmeihRIyEiKCQiJWdzISIiNyQkIis7WFopUSMhIigkIiVxcyEiIjckJCIrLEQ6KlEjISIoJCIlIUcoISIiNyQkIit3KUgpKlEjISIoJCIlIUgoISIiNyQkIitXbV0hUiMhIigkIiUrdCEiIjckJCIrMUc9IlIjISIoJCIlNXQhIiI3JCQiK2okZT1SIyEiKCQiJT90ISIiNyQkIis8TGAjUiMhIigkIiVJdCEiIjckJCIqbjJLUiMhIickIiVTdCEiIjckJCIrQTkpUVIjISIoJCIlXXQhIiI3JCQiK3dYYiVSIyEiKCQiJWd0ISIiNyQkIitMckEmUiMhIigkIiVxdCEiIjckJCIrJTQqKmVSIyEiKCQiJSFRKCEiIjckJCIraC9kJ1IjISIoJCIlIVIoISIiNyQkIitNN0MoUiMhIigkIiUrdSEiIjckJCIrPDkielIjISIoJCIlNXUhIiI3JCQiKzQ1ZSlSIyEiKCQiJT91ISIiNyQkIis4K0QqUiMhIigkIiVJdSEiIjckJCIrSCU9KipSIyEiKCQiJVN1ISIiNyQkIipFJ2UrQyEiJyQiJV11ISIiNyQkIisxTkQsQyEiKCQiJWd1ISIiNyQkIio8Pz5TIyEiJyQiJXF1ISIiNyQkIitfaWUtQyEiKCQiJSFbKCEiIjckJCIrYDxELkMhIigkIiUhXCghIiI3JCQiK3dtIlJTIyEiKCQiJSt2ISIiNyQkIitBNWUvQyEiKCQiJTV2ISIiNyQkIisieldfUyMhIigkIiU/diEiIjckJCIrJyl6IWZTIyEiKCQiJUl2ISIiNyQkIisyMWQxQyEiKCQiJVN2ISIiNyQkIitkRUIyQyEiKCQiJV12ISIiNyQkIitPVCp5UyMhIigkIiVndiEiIjckJCIrWV1iM0MhIigkIiVxdiEiIjckJCIrKVE6IzRDISIoJCIlIWUoISIiNyQkIitqXigpNEMhIigkIiUhZighIiI3JCQiK3RWYDVDISIoJCIlK3chIiI3JCQiKz5JPjZDISIoJCIlNXchIiI3JCQiKy42Jj1UIyEiKCQiJT93ISIiNyQkIitEJzNEVCMhIigkIiVJdyEiIjckJCIrKWVsSlQjISIoJCIlU3chIiI3JCQiKyMqPiNRVCMhIigkIiVddyEiIjckJCIrUnlaOUMhIigkIiVndyEiIjckJCIrSEo4OkMhIigkIiVxdyEiIjckJCIrbHl5OkMhIigkIiUhbyghIiI3JCQiK1s/VztDISIoJCIlIXAoISIiNyQkIit5YzQ8QyEiKCQiJSt4ISIiNyQkIitlKFt4VCMhIigkIiU1eCEiIjckJCIrKUcsJT1DISIoJCIlP3ghIiI3JCQiKkZgIT5DISInJCIlSXghIiI3JCQiKy9acT5DISIoJCIlU3ghIiI3JCQiKyRmYi5VIyEiKCQiJV14ISIiNyQkIitRZitAQyEiKCQiJWd4ISIiNyQkIitSZGxAQyEiKCQiJXF4ISIiNyQkIispKlxJQUMhIigkIiUheSghIiI3JCQiKzxQJkhVIyEiKCQiJSF6KCEiIjckJCIrJyo9Z0JDISIoJCIlK3khIiI3JCQiK1AmXFVVIyEiKCQiJTV5ISIiNyQkIitUbSpbVSMhIigkIiU/eSEiIjckJCIrNEthREMhIigkIiVJeSEiIjckJCIrVSMqPUVDISIoJCIlU3khIiI3JCQiK1VaJG9VIyEiKCQiJV15ISIiNyQkIipyenVVIyEiJyQiJWd5ISIiNyQkIitbVDdHQyEiKCQiJXF5ISIiNyQkIitiIW8oR0MhIigkIiUhKXkhIiI3JCQiK005VEhDISIoJCIlISp5ISIiNyQkIisnR2ErViMhIigkIiUreiEiIjckJCIrNm1wSUMhIigkIiU1eiEiIjckJCIrNyVROFYjISIoJCIlP3ohIiI3JCQiKypvej5WIyEiKCQiJUl6ISIiNyQkIitWL2lLQyEiKCQiJVN6ISIiNyQkIit3MUVMQyEiKCQiJV16ISIiNyQkIisqUStSViMhIigkIiVneiEiIjckJCIrJGVSWFYjISIoJCIlcXohIiI3JCQiK2YjeV5WIyEiKCQiJSEpeiEiIjckJCIrPWsiZVYjISIoJCIlISp6ISIiNyQkIitpU1hPQyEiKCQiJSshKSEiIjckJCIrIz4iNFBDISIoJCIlNSEpISIiNyQkIiszeXNQQyEiKCQiJT8hKSEiIjckJCIrN1JPUUMhIigkIiVJISkhIiI3JCQiKzAmKioqUUMhIigkIiVTISkhIiI3JCQiKyplTSdSQyEiKCQiJV0hKSEiIjckJCIraiJwLVcjISIoJCIlZyEpISIiNyQkIitKSyE0VyMhIigkIiVxISkhIiI3JCQiKyN6TzpXIyEiKCQiJSEzKSEiIjckJCIrWilwQFcjISIoJCIlITQpISIiNyQkIisqUi1HVyMhIigkIiUrIikhIiI3JCQiK1pXVlZDISIoJCIlNSIpISIiNyQkIislKmYxV0MhIigkIiU/IikhIiI3JCQiKi8ocFdDISInJCIlSSIpISIiNyQkIisnZUZgVyMhIigkIiVTIikhIiI3JCQiK0x3JmZXIyEiKCQiJV0iKSEiIjckJCIrJD0oZVlDISIoJCIlZyIpISIiNyQkIitQaUBaQyEiKCQiJXEiKSEiIjckJCIrJnpXeVcjISIoJCIlIT0pISIiNyQkIitmR1pbQyEiKCQiJSE+KSEiIjckJCIqVisiXEMhIickIiUrIykhIiI3JCQiKzN2c1xDISIoJCIlNSMpISIiNyQkIisnNGEuWCMhIigkIiU/IykhIiI3JCQiKyU+ISk0WCMhIigkIiVJIykhIiI3JCQiKy5lZ15DISIoJCIlUyMpISIiNyQkIitDNEJfQyEiKCQiJV0jKSEiIjckJCIrZmImR1gjISIoJCIlZyMpISIiNyQkIisyKHpNWCMhIigkIiVxIykhIiI3JCQiK3NMNWFDISIoJCIlIUcpISIiNyQkIitfbHNhQyEiKCQiJSFIKSEiIjckJCIqRFxgWCMhIickIiUrJCkhIiI3JCQiK245KGZYIyEiKCQiJTUkKSEiIjckJCIrLktmY0MhIigkIiU/JCkhIiI3JCQiKlk5c1gjISInJCIlSSQpISIiNyQkIitRXyR5WCMhIigkIiVTJCkhIiI3JCQiK1JiWGVDISIoJCIlXSQpISIiNyQkIitrYDJmQyEiKCQiJWckKSEiIjckJCIrOFpwZkMhIigkIiVxJCkhIiI3JCQiKyplOC5ZIyEiKCQiJSFRKSEiIjckJCIrIio+JDRZIyEiKCQiJSFSKSEiIjckJCIqIypcOlkjISInJCIlKyUpISIiNyQkIit6dDtpQyEiKCQiJTUlKSEiIjckJCIrblZ5aUMhIigkIiU/JSkhIiI3JCQiKycpM1NqQyEiKCQiJUklKSEiIjckJCIrUHAsa0MhIigkIiVTJSkhIiI3JCQiKl9LWVkjISInJCIlXSUpISIiNyQkIitRd0NsQyEiKCQiJWclKSEiIjckJCIqSGllWSMhIickIiVxJSkhIiI3JCQiK3lrWm1DISIoJCIlIVspISIiNyQkIistLTRuQyEiKCQiJSFcKSEiIjckJCIrbE1xbkMhIigkIiUrJikhIiI3JCQiK21pSm9DISIoJCIlNSYpISIiNyQkIisxJ0cqb0MhIigkIiU/JikhIiI3JCQiKylbUyZwQyEiKCQiJUkmKSEiIjckJCIrNj46cUMhIigkIiVTJikhIiI3JCQiK3dHd3FDISIoJCIlXSYpISIiNyQkIismUXQ4WiMhIigkIiVnJikhIiI3JCQiK1JNKT5aIyEiKCQiJXEmKSEiIjckJCIrUUlmc0MhIigkIiUhZSkhIiI3JCQiKyQ9LUtaIyEiKCQiJSFmKSEiIjckJCIrdzMiUVojISIoJCIlKycpISIiNyQkIis8Ij5XWiMhIigkIiU1JykhIiI3JCQiKzJwLXZDISIoJCIlPycpISIiNyQkIitaVWp2QyEiKCQiJUknKSEiIjckJCIrUjZDd0MhIigkIiVTJykhIiI3JCQiKyNlWm9aIyEiKCQiJV0nKSEiIjckJCIrek5YeEMhIigkIiVnJykhIiI3JCQiK0giZiF5QyEiKCQiJXEnKSEiIjckJCIrTlVteUMhIigkIiUhbykhIiI3JCQiKycqKW8jekMhIigkIiUhcCkhIiI3JCQiKzhKKCl6QyEiKCQiJSsoKSEiIjckJCIrKilvWiFbIyEiKCQiJTUoKSEiIjckJCIrQi0zIlsjISIoJCIlPygpISIiNyQkIis7Sm8iWyMhIigkIiVJKCkhIiI3JCQiK3BiRyNbIyEiKCQiJVMoKSEiIjckJCIrJWUoKUdbIyEiKCQiJV0oKSEiIjckJCIraCIqWyRbIyEiKCQiJWcoKSEiIjckJCIrLC40JVsjISIoJCIlcSgpISIiNyQkIiswNXAlWyMhIigkIiUheSkhIiI3JCQiK3U3SCZbIyEiKCQiJSF6KSEiIjckJCIrMzYqZVsjISIoJCIlKykpISIiNyQkIis0MFwnWyMhIigkIiU1KSkhIiI3JCQiK3klKjMoWyMhIigkIiU/KSkhIiI3JCQiKzohKW8oWyMhIigkIiVJKSkhIiI3JCQiK0BoRylbIyEiKCQiJVMpKSEiIjckJCIrKHokKSkpWyMhIigkIiVdKSkhIiI3JCQiK1g1WypbIyEiKCQiJWcpKSEiIjckJCIra3kyIVwjISIoJCIlcSkpISIiNyQkIitjVW4hXCMhIigkIiUhKSkpISIiNyQkIitALUYiXCMhIigkIiUhKikpISIiNyQkIitoZCc9XCMhIigkIiUrKikhIiI3JCQiK3gzWSNcIyEiKCQiJTUqKSEiIjckJCIrb2IwJFwjISIoJCIlPyopISIiNyQkIitQKVxPXCMhIigkIiVJKikhIiI3JCQiKyVvVlVcIyEiKCQiJVMqKSEiIjckJCIrNHIkW1wjISIoJCIlXSopISIiNyQkIis5LFYmXCMhIigkIiVnKikhIiI3JCQiKypwQWdcIyEiKCQiJXEqKSEiIjckJCIrbVtoJ1wjISIoJCIlISkqKSEiIjckJCIrOm0/KFwjISIoJCIlISoqKSEiIjckJCIrWXp6KFwjISIoJCIlKyEqISIiNyQkIitpKSlRKVwjISIoJCIlNSEqISIiNyQkIitpJHoqKVwjISIoJCIlPyEqISIiNyQkIitbJXAmKlwjISIoJCIlSSEqISIiNyQkIio3ZixdIyEiJyQiJVMhKiEiIjckJCIreiRbMl0jISIoJCIlXSEqISIiNyQkIitFc0wsRCEiKCQiJWchKiEiIjckJCIraWMjPl0jISIoJCIlcSEqISIiNyQkIisobzhEXSMhIigkIiUhMyohIiI3JCQiKy44NS5EISIoJCIlITQqISIiNyQkIipeKW8uRCEiJyQiJSsiKiEiIjckJCIrNGBGL0QhIigkIiU1IiohIiI3JCQiKyw8J1tdIyEiKCQiJT8iKiEiIjckJCIrKG9aYV0jISIoJCIlSSIqISIiNyQkIituSy4xRCEiKCQiJVMiKiEiIjckJCIrVSU9bV0jISIoJCIlXSIqISIiNyQkIis4Sz8yRCEiKCQiJWciKiEiIjckJCIrImUoeTJEISIoJCIlcSIqISIiNyQkIitaOlAzRCEiKCQiJSE9KiEiIjckJCIrNl4mKjNEISIoJCIlIT4qISIiNyQkIit1I1EmNEQhIigkIiUrIyohIiI3JCQiK1E1NzVEISIoJCIlNSMqISIiNyQkIistTXE1RCEiKCQiJT8jKiEiIjckJCIrbmBHNkQhIigkIiVJIyohIiI3JCQiK05wJz1eIyEiKCQiJVMjKiEiIjckJCIrMSJbQ14jISIoJCIlXSMqISIiNyQkIisiKSlHSV4jISIoJCIlZyMqISIiNyQkIitoIzRPXiMhIigkIiVxIyohIiI3JCQiK1kjKj05RCEiKCQiJSFHKiEiIjckJCIrUSlvWl4jISIoJCIlIUgqISIiNyQkIitPIVtgXiMhIigkIiUrJCohIiI3JCQiK1VvI2ZeIyEiKCQiJTUkKiEiIjckJCIrY19dO0QhIigkIiU/JCohIiI3JCQiKkckMzxEISInJCIlSSQqISIiNyQkIis5NG08RCEiKCQiJVMkKiEiIjckJCIrZSJRIz1EISIoJCIlXSQqISIiNyQkIis5XSIpPUQhIigkIiVnJCohIiI3JCQiKyRbIlI+RCEiKCQiJXEkKiEiIjckJCIra3YnKj5EISIoJCIlIVEqISIiNyQkIitmS2E/RCEiKCQiJSFSKiEiIjckJCIrbyY9Nl8jISIoJCIlKyUqISIiNyQkIiskXCRwQEQhIigkIiU1JSohIiI3JCQiK00hb0FfIyEiKCQiJT8lKiEiIjckJCIrIz5VR18jISIoJCIlSSUqISIiNyQkIittZlRCRCEiKCQiJVMlKiEiIjckJCIqTyopUl8jISInJCIlXSUqISIiNyQkIitzQmNDRCEiKCQiJWclKiEiIjckJCIrLl04REQhIigkIiVxJSohIiI3JCQiK2JzcUREISIoJCIlIVsqISIiNyQkIitIInppXyMhIigkIiUhXCohIiI3JCQiK0IxJm9fIyEiKCQiJSsmKiEiIjckJCIrVDxVRkQhIigkIiU1JiohIiI3JCQiKyNbIyp6XyMhIigkIiU/JiohIiI3JCQiK1lHY0dEISIoJCIlSSYqISIiNyQkIitPRzhIRCEiKCQiJVMmKiEiIjckJCIrXkNxSEQhIigkIiVdJiohIiI3JCQiKyNwci1gIyEiKCQiJWcmKiEiIjckJCIrZjAlM2AjISIoJCIlcSYqISIiNyQkIitiITQ5YCMhIigkIiUhZSohIiI3JCQiK3lyKD5gIyEiKCQiJSFmKiEiIjckJCIqJFxhS0QhIickIiUrJyohIiI3JCQiKzdCNkxEISIoJCIlNScqISIiNyQkIitEJHpPYCMhIigkIiU/JyohIiI3JCQiK29mQ01EISIoJCIlSScqISIiNyQkIitWQSJbYCMhIigkIiVTJyohIiI3JCQiK14ieWBgIyEiKCQiJV0nKiEiIjckJCIrInBWZmAjISIoJCIlZycqISIiNyQkIittKTNsYCMhIigkIiVxJyohIiI3JCQiK3VPMlBEISIoJCIlIW8qISIiNyQkIis9IlF3YCMhIigkIiUhcCohIiI3JCQiKyk+LSNRRCEiKCQiJSsoKiEiIjckJCIrOmZ3UUQhIigkIiU1KCohIiI3JCQiK28jSCRSRCEiKCQiJT8oKiEiIjckJCIrZkEqKVJEISIoJCIlSSgqISIiNyQkIisqKVtYU0QhIigkIiVTKCohIiI3JCQiK2VyLFREISIoJCIlXSgqISIiNyQkIituIXo6YSMhIigkIiVnKCohIiI3JCQiKzwxOVVEISIoJCIlcSgqISIiNyQkIiszPXFVRCEiKCQiJSF5KiEiIjckJCIqa2lLYSMhIickIiUheiohIiI3JCQiKztKI1FhIyEiKCQiJSspKiEiIjckJCIrTUtRV0QhIigkIiU1KSohIiI3JCQiKycqSCVcYSMhIigkIiU/KSohIiI3JCQiKy5DXVhEISIoJCIlSSkqISIiNyQkIitiOTFZRCEiKCQiJVMpKiEiIjckJCIrYCxpWUQhIigkIiVdKSohIiI3JCQiKylceXJhIyEiKCQiJWcpKiEiIjckJCIrKltPeGEjISIoJCIlcSkqISIiNyQkIitHVEhbRCEiKCQiJSEpKSohIiI3JCQiKzs5JilbRCEiKCQiJSEqKSohIiI3JCQiK2AkMyVcRCEiKCQiJSsqKiEiIjckJCIrUlwnKlxEISIoJCIlNSoqISIiNyQkIit3Nl9dRCEiKCQiJT8qKiEiIjckJCIra3EyXkQhIigkIiVJKiohIiI3JCQiKy9Fal5EISIoJCIlUyoqISIiNyQkIismeig9X0QhIigkIiVdKiohIiI3JCQiKmtVRmIjISInJCIlZyoqISIiNyQkIitRckhgRCEiKCQiJXEqKiEiIjckJCIrIkheUWIjISIoJCIlISkqKiEiIjckJCIrKTQwV2IjISIoJCIlISoqKiEiIjckJCIraCZlXGIjISIoJCImKysiISIiNyQkIit6O15iRCEiKCQiJjUrIiEiIjckJCIrYlcxY0QhIigkIiY/KyIhIiI3JCQiKygpb2hjRCEiKCQiJkkrIiEiIjckJCIreSpvcmIjISIoJCImUysiISIiNyQkIitGMnNkRCEiKCQiJl0rIiEiIjckJCIrT0BGZUQhIigkIiZnKyIhIiI3JCQiKy9LIyllRCEiKCQiJnErIiEiIjckJCIrS1JQZkQhIigkIiYhMzUhIiI3JCQiK0FWIypmRCEiKCQiJiE0NSEiIjckJCIrdFZaZ0QhIigkIiYrLCIhIiI3JCQiKyczQzVjIyEiKCQiJjUsIiEiIjckJCIraU1kaEQhIigkIiY/LCIhIiI3JCQiKy1EN2lEISIoJCImSSwiISIiNyQkIisxN25pRCEiKCQiJlMsIiEiIjckJCIrdSY+S2MjISIoJCImXSwiISIiNyQkIisyd3dqRCEiKCQiJmcsIiEiIjckJCIrMmBKa0QhIigkIiZxLCIhIiI3JCQiK3RFJ1tjIyEiKCQiJiE9NSEiIjckJCIrMCg0YWMjISIoJCImIT41ISIiNyQkIisxayZmYyMhIigkIiYrLSIhIiI3JCQiK3ZGXW1EISIoJCImNS0iISIiNyQkIis3KVtxYyMhIigkIiY/LSIhIiI3JCQiKz5YZm5EISIoJCImSS0iISIiNyQkIisnKilSIm9EISIoJCImUy0iISIiNyQkIitWXG9vRCEiKCQiJl0tIiEiIjckJCIraSdII3BEISIoJCImZy0iISIiNyQkIitgU3hwRCEiKCQiJnEtIiEiIjckJCIrOiI9LmQjISIoJCImIUc1ISIiNyQkIitePSczZCMhIigkIiYhSDUhIiI3JCQiKkUwOWQjISInJCImKy4iISIiNyQkIitWJFs+ZCMhIigkIiY1LiIhIiI3JCQiKyw2XHNEISIoJCImPy4iISIiNyQkIitNTi50RCEiKCQiJkkuIiEiIjckJCIrVmNkdEQhIigkIiZTLiIhIiI3JCQiK0d1NnVEISIoJCImXS4iISIiNyQkIioqKWVZZCMhIickIiZnLiIhIiI3JCQiKi4rX2QjISInJCImcS4iISIiNyQkIitaM3V2RCEiKCQiJiFRNSEiIjckJCIrVzhHd0QhIigkIiYhUjUhIiI3JCQiKz46I29kIyEiKCQiJisvIiEiIjckJCIrdThPeEQhIigkIiY1LyIhIiI3JCQiKiI0IXpkIyEiJyQiJj8vIiEiIjckJCIrRSxXeUQhIigkIiZJLyIhIiI3JCQiK0Mheip5RCEiKCQiJlMvIiEiIjckJCIrL3deekQhIigkIiZdLyIhIiI3JCQiK21lMCFlIyEiKCQiJmcvIiEiIjckJCIrN1FmIWUjISIoJCImcS8iISIiNyQkIitUOTgiZSMhIigkIiYhWzUhIiI3JCQiK2EobztlIyEiKCQiJiFcNSEiIjckJCIrX2Q/I2UjISIoJCImKzAiISIiNyQkIitOQ3UjZSMhIigkIiY1MCIhIiI3JCQiKzApeUtlIyEiKCQiJj8wIiEiIjckJCIqJ1siUWUjISInJCImSTAiISIiNyQkIisuMU4lZSMhIigkIiZTMCIhIiI3JCQiK0xnKVtlIyEiKCQiJl0wIiEiIjckJCIrXjZVJmUjISIoJCImZzAiISIiNyQkIitkZiZmZSMhIigkIiZxMCIhIiI3JCQiK2AvXCdlIyEiKCQiJiFlNSEiIjckJCIrUVktKGUjISIoJCImIWY1ISIiNyQkIis4JmV2ZSMhIigkIiYrMSIhIiI3JCQiK3o/NCllIyEiKCQiJjUxIiEiIjckJCIrUGBpKWUjISIoJCImPzEiISIiNyQkIisnR2UiKmUjISIoJCImSTEiISIiNyQkIitGNHAqZSMhIigkIiZTMSIhIiI3JCQiK2hLQSFmIyEiKCQiJl0xIiEiIjckJCIrKkdiMmYjISIoJCImZzEiISIiNyQkIiosKEciZiMhIickIiZxMSIhIiI3JCQiK0UlPT1mIyEiKCQiJiFvNSEiIjckJCIrUCZcQmYjISIoJCImIXA1ISIiNyQkIitWLilHZiMhIigkIiYrMiIhIiI3JCQiK1gzVCRmIyEiKCQiJjUyIiEiIjckJCIrVjUlUmYjISIoJCImPzIiISIiNyQkIitSNFolZiMhIigkIiZJMiIhIiI3JCQiK0swKyZmIyEiKCQiJlMyIiEiIjckJCIrQilIYmYjISIoJCImXTIiISIiNyQkIis3KWVnZiMhIigkIiZnMiIhIiI3JCQiKyx2ZSdmIyEiKCQiJnEyIiEiIjckJCIrKillNihmIyEiKCQiJiF5NSEiIjckJCIreFJrKGYjISIoJCImIXo1ISIiNyQkIittPDwpZiMhIigkIiYrMyIhIiI3JCQiK2MjKnApZiMhIigkIiY1MyIhIiI3JCQiK1trQSpmIyEiKCQiJj8zIiEiIjckJCIrVEx2KmYjISIoJCImSTMiISIiNyQkIitRKnotZyMhIigkIiZTMyIhIiI3JCQiK1BpITNnIyEiKCQiJl0zIiEiIjckJCIqQ0s4ZyMhIickIiZnMyIhIiI3JCQiK1p6Jj1nIyEiKCQiJnEzIiEiIjckJCIrZUxRLUUhIigkIiYhKTMiISIiNyQkIit2JTNIZyMhIigkIiYhKjMiISIiNyQkIisoSExNZyMhIigkIiYrNCIhIiI3JCQiK0V5JlJnIyEiKCQiJjU0IiEiIjckJCIraD9bL0UhIigkIiY/NCIhIiI3JCQiKy5nKzBFISIoJCImSTQiISIiNyQkIitfJ0hiZyMhIigkIiZTNCIhIiI3JCQiKixgZ2cjISInJCImXTQiISIiNyQkIit3Z2QxRSEiKCQiJmc0IiEiIjckJCIrXykpNDJFISIoJCImcTQiISIiNyQkIitPOGkyRSEiKCQiJiEpNCIhIiI3JCQiK0pOOTNFISIoJCImISo0IiEiIjckJCIrT2FtM0UhIigkIiYrNSIhIiI3JCQiK19xPTRFISIoJCImNTUiISIiNyQkIipRMyg0RSEiJyQiJj81IiEiIjckJCIqVUgtaCMhIickIiZJNSIhIiI3JCQiK3MsdjVFISIoJCImUzUiISIiNyQkIitQMUY2RSEiKCQiJl01IiEiIjckJCIrOjN6NkUhIigkIiZnNSIhIiI3JCQiKzIySjdFISIoJCImcTUiISIiNyQkIis4LiRHaCMhIigkIiYhMzYhIiI3JCQiK00nXExoIyEiKCQiJiE0NiEiIjckJCIrcidvUWgjISIoJCImKzYiISIiNyQkIitCdVE5RSEiKCQiJjU2IiEiIjckJCIrIiplIVxoIyEiKCQiJj82IiEiIjckJCIrd1NVOkUhIigkIiZJNiIhIiI3JCQiK3k+JWZoIyEiKCQiJlM2IiEiIjckJCIrKWZma2gjISIoJCImXTYiISIiNyQkIitPcChwaCMhIigkIiZnNiIhIiI3JCQiKyMqUlw8RSEiKCQiJnE2IiEiIjckJCIrbjIsPUUhIigkIiYhPTYhIiI3JCQiK2lzXz1FISIoJCImIT42ISIiNyQkIit4TS8+RSEiKCQiJis3IiEiIjckJCIrNyVmJj5FISIoJCImNTciISIiNyQkIitvXTI/RSEiKCQiJj83IiEiIjckJCIrWC9mP0UhIigkIiZJNyIhIiI3JCQiK1diNUBFISIoJCImUzciISIiNyQkIitsLmlARSEiKCQiJl03IiEiIjckJCIrNFw4QUUhIigkIiZnNyIhIiI3JCQiK3ciXEVpIyEiKCQiJnE3IiEiIjckJCIrbUo7QkUhIigkIiYhRzYhIiI3JCQiKilvbkJFISInJCImIUg2ISIiNyQkIis+Lj5DRSEiKCQiJis4IiEiIjckJCIrJFsuWmkjISIoJCImNTgiISIiNyQkIitzakBERSEiKCQiJj84IiEiIjckJCIrKCkqR2RpIyEiKCQiJkk4IiEiIjckJCIrRzhDRUUhIigkIiZTOCIhIiI3JCQiKydSYG5pIyEiKCQiJl04IiEiIjckJCIrIj5sc2kjISIoJCImZzgiISIiNyQkIis5bnhGRSEiKCQiJnE4IiEiIjckJCIra3pHR0UhIigkIiYhUTYhIiI3JCQiK1YqKXpHRSEiKCQiJiFSNiEiIjckJCIrXic0JEhFISIoJCImKzkiISIiNyQkIisqMz8pSEUhIigkIiY1OSIhIiI3JCQiK2MtTElFISIoJCImPzkiISIiNyQkIitgLCUzaiMhIigkIiZJOSIhIiI3JCQiKyJ5XDhqIyEiKCQiJlM5IiEiIjckJCIqOWY9aiMhIickIiZdOSIhIiI3JCQiKkJvQmojISInJCImZzkiISIiNyQkIitfcShHaiMhIigkIiZxOSIhIiI3JCQiKzJjUUxFISIoJCImIVs2ISIiNyQkIismKlEqUWojISIoJCImIVw2ISIiNyQkIis7PlNNRSEiKCQiJis6IiEiIjckJCIqbjRcaiMhIickIiY1OiIhIiI3JCQiK2ZyVE5FISIoJCImPzoiISIiNyQkIisjUUNmaiMhIigkIiZJOiIhIiI3JCQiK1I4Vk9FISIoJCImUzoiISIiNyQkIitMIVFwaiMhIigkIiZdOiIhIiI3JCQiK2lXV1BFISIoJCImZzoiISIiNyQkIitGMSZ6aiMhIigkIiZxOiIhIiI3JCQiK0hsWFFFISIoJCImIWU2ISIiNyQkIitvQCcqUUUhIigkIiYhZjYhIiI3JCQiK1d2WVJFISIoJCImKzsiISIiNyQkIitmRSgqUkUhIigkIiY1OyIhIiI3JCQiKzZ2WlNFISIoJCImPzsiISIiNyQkIisuQCk0ayMhIigkIiZJOyIhIiI3JCQiK0xrW1RFISIoJCImUzsiISIiNyQkIisuMCo+ayMhIigkIiZdOyIhIiI3JCQiKzhWXFVFISIoJCImZzsiISIiNyQkIitqeSpIayMhIigkIiZxOyIhIiI3JCQiK2E2XVZFISIoJCImIW82ISIiNyQkIisnPS9TayMhIigkIiYhcDYhIiI3JCQiKidwXVdFISInJCImKzwiISIiNyQkIit3JTRdayMhIigkIiY1PCIhIiI3JCQiK008XlhFISIoJCImPzwiISIiNyQkIitOUCxZRSEiKCQiJkk8IiEiIjckJCIremFeWUUhIigkIiZTPCIhIiI3JCQiK25wLFpFISIoJCImXTwiISIiNyQkIisqPj12ayMhIigkIiZnPCIhIiI3JCQiK3YiPiFbRSEiKCQiJnE8IiEiIjckJCIrKCopPiZbRSEiKCQiJiF5NiEiIjckJCIrai4tXEUhIigkIiYhejYhIiI3JCQiK3YwX1xFISIoJCImKz0iISIiNyQkIitMMC1dRSEiKCQiJjU9IiEiIjckJCIrUC1fXUUhIigkIiY/PSIhIiI3JCQiKypvPjVsIyEiKCQiJkk9IiEiIjckJCIrKCkpPTpsIyEiKCQiJlM9IiEiIjckJCIrTHksX0UhIigkIiZdPSIhIiI3JCQiK0dsXl9FISIoJCImZz0iISIiNyQkIiooXCxgRSEiJyQiJnE9IiEiIjckJCIraEpeYEUhIigkIiYhKT0iISIiNyQkIistNixhRSEiKCQiJiEqPSIhIiI3JCQiKyN6M1hsIyEiKCQiJis+IiEiIjckJCIrS2krYkUhIigkIiY1PiIhIiI3JCQiK0JNXWJFISIoJCImPz4iISIiNyQkIitrLitjRSEiKCQiJkk+IiEiIjckJCIrY3FcY0UhIigkIiZTPiIhIiI3JCQiKU4qcGwjISImJCImXT4iISIiNyQkIisncCpbZEUhIigkIiZnPiIhIiI3JCQiK1djKXpsIyEiKCQiJnE+IiEiIjckJCIrVzhbZUUhIigkIiYhKT4iISIiNyQkIispencqZUUhIigkIiYhKj4iISIiNyQkIiswP1pmRSEiKCQiJis/IiEiIjckJCIrbnAnKmZFISIoJCImNT8iISIiNyQkIisjb2gvbSMhIigkIiY/PyIhIiI3JCQiK19oJjRtIyEiKCQiJkk/IiEiIjckJCIrdy5YaEUhIigkIiZTPyIhIiI3JCQiK2NWJT5tIyEiKCQiJl0/IiEiIjckJCIrIzRRQ20jISIoJCImZz8iISIiNyQkIislZUpIbSMhIigkIiZxPyIhIiI3JCQiK0xbVWpFISIoJCImITM3ISIiNyQkIitReSJSbSMhIigkIiYhNDchIiI3JCQiKTFUa0UhIiYkIiYrQCIhIiI3JCQiKjcuXG0jISInJCImNUAiISIiNyQkIispUiZSbEUhIigkIiY/QCIhIiI3JCQiK011KWVtIyEiKCQiJklAIiEiIjckJCIrSCN6am0jISIoJCImU0AiISIiNyQkIisleXFvbSMhIigkIiZdQCIhIiI3JCQiKyg0aXRtIyEiKCQiJmdAIiEiIjckJCIqPGB5bSMhIickIiZxQCIhIiI3JCQiKy9TTW9FISIoJCImIT03ISIiNyQkIispZk0pb0UhIigkIiYhPjchIiI3JCQiK2BcS3BFISIoJCImK0EiISIiNyQkIitwXSIpcEUhIigkIiY1QSIhIiI3JCQiK1pcSXFFISIoJCImP0EiISIiNyQkIisoZSV6cUUhIigkIiZJQSIhIiI3JCQiKyopUkdyRSEiKCQiJlNBIiEiIjckJCIrYUp4ckUhIigkIiZdQSIhIiI3JCQiKyMzaUFuIyEiKCQiJmdBIiEiIjckJCIrdDJ2c0UhIigkIiZxQSIhIiI3JCQiK0cjUktuIyEiKCQiJiFHNyEiIjckJCIrWnVzdEUhIigkIiYhSDchIiI3JCQiK0phQHVFISIoJCImK0IiISIiNyQkIio9LlpuIyEiJyQiJjVCIiEiIjckJCIrJXAhPnZFISIoJCImP0IiISIiNyQkIit1em52RSEiKCQiJklCIiEiIjckJCIrPl07d0UhIigkIiZTQiIhIiI3JCQiK0o9bHdFISIoJCImXUIiISIiNyQkIis0JVFybiMhIigkIiZnQiIhIiI3JCQiK2JaaXhFISIoJCImcUIiISIiNyQkIituMzZ5RSEiKCQiJiFRNyEiIjckJCIrW25meUUhIigkIiYhUjchIiI3JCQiKydSIzN6RSEiKCQiJitDIiEiIjckJCIrOHljekUhIigkIiY1QyIhIiI3JCQiKyoqSDAhbyMhIigkIiY/QyIhIiI3JCQiK2B6YCFvIyEiKCQiJklDIiEiIjckJCIreUUtIm8jISIoJCImU0MiISIiNyQkIitzcl0ibyMhIigkIiZdQyIhIiI3JCQiK085Kj5vIyEiKCQiJmdDIiEiIjckJCIqWnZDbyMhIickIiZxQyIhIiI3JCQiK3YjZkhvIyEiKCQiJiFbNyEiIjckJCIrX0dXJG8jISIoJCImIVw3ISIiNyQkIilpI1JvIyEiJiQiJitEIiEiIjckJCIqSzRXbyMhIickIiY1RCIhIiI3JCQiKzdBKltvIyEiKCQiJj9EIiEiIjckJCIrd1tQJm8jISIoJCImSUQiISIiNyQkIis5dCZlbyMhIigkIiZTRCIhIiI3JCQiK0MmUmpvIyEiKCQiJl1EIiEiIjckJCIrMzojb28jISIoJCImZ0QiISIiNyQkIituS0kobyMhIigkIiZxRCIhIiI3JCQiKyp6JXkobyMhIigkIiYhZTchIiI3JCQiKzFoRSlvIyEiKCQiJiFmNyEiIjckJCIrKD1aKClvIyEiKCQiJitFIiEiIjckJCIrVyFHIypvIyEiKCQiJjVFIiEiIjckJCIreCczKCpvIyEiKCQiJj9FIiEiIjckJCIrJjMqPSFwIyEiKCQiJklFIiEiIjckJCIrcCNwMXAjISIoJCImU0UiISIiNyQkIipCXDZwIyEiJyQiJl1FIiEiIjckJCIrbypHO3AjISIoJCImZ0UiISIiNyQkIislWzNAcCMhIigkIiZxRSIhIiI3JCQiK3d4ZSNwIyEiKCQiJiFvNyEiIjckJCIrWm8xJHAjISIoJCImIXA3ISIiNyQkIisncFhOcCMhIigkIiYrRiIhIiI3JCQiK0JWLSVwIyEiKCQiJjVGIiEiIjckJCIrSEZdJXAjISIoJCImP0YiISIiNyQkIis5NClccCMhIigkIiZJRiIhIiI3JCQiK3opZWFwIyEiKCQiJlNGIiEiIjckJCIrQ20kZnAjISIoJCImXUYiISIiNyQkIitcVFQncCMhIigkIiZnRiIhIiI3JCQiK2E5Km9wIyEiKCQiJnFGIiEiIjckJCIqYW90cCMhIickIiYheTchIiI3JCQiKzJhJXlwIyEiKCQiJiF6NyEiIjckJCIrYz9LKXAjISIoJCImK0ciISIiNyQkIisnWyl6KXAjISIoJCImNUciISIiNyQkIispcHUjKnAjISIoJCImP0ciISIiNyQkIiskcF0oKnAjISIoJCImSUciISIiNyQkIitya0ErRiEiKCQiJlNHIiEiIjckJCIrSj9xK0YhIigkIiZdRyIhIiI3JCQiK3Z0PCxGISIoJCImZ0ciISIiNyQkIisuRGwsRiEiKCQiJnFHIiEiIjckJCIrOXU3LUYhIigkIiYhKUciISIiNyQkIio2LUVxIyEiJyQiJiEqRyIhIiI3JCQiKyJmd0lxIyEiKCQiJitIIiEiIjckJCIrYzNiLkYhIigkIiY1SCIhIiI3JCQiKzJcLS9GISIoJCImP0giISIiNyQkIitWKClcL0YhIigkIiZJSCIhIiI3JCQiK2xCKFxxIyEiKCQiJlNIIiEiIjckJCIrdGRXMEYhIigkIiZdSCIhIiI3JCQiK28qPWZxIyEiKCQiJmdIIiEiIjckJCIrXD5SMUYhIigkIiZxSCIhIiI3JCQiKz1aJ29xIyEiKCQiJiEpSCIhIiI3JCQiK3VzTDJGISIoJCImISpIIiEiIjckJCIrPSc0eXEjISIoJCImK0kiISIiNyQkIip2IkczRiEiJyQiJjVJIiEiIjckJCIqbmAoM0YhIickIiY/SSIhIiI3JCQiK3lgQTRGISIoJCImSUkiISIiNyQkIit3b3A0RiEiKCQiJlNJIiEiIjckJCIraiJvLHIjISIoJCImXUkiISIiNyQkIipDUjFyIyEiJyQiJmdJIiEiIjckJCIrMSw2NkYhIigkIiZxSSIhIiI3JCQiK2kyZTZGISIoJCImITM4ISIiNyQkIis0NzA3RiEiKCQiJiE0OCEiIjckJCIrWjlfN0YhIigkIiYrSiIhIiI3JCQiK3c5KkhyIyEiKCQiJjVKIiEiIjckJCIrJ0hoTXIjISIoJCImP0oiISIiNyQkIiszNCRSciMhIigkIiZJSiIhIiI3JCQiKzcuUzlGISIoJCImU0oiISIiNyQkIiszJnBbciMhIigkIiZdSiIhIiI3JCQiKyhcUWByIyEiKCQiJmdKIiEiIjckJCIreXMhZXIjISIoJCImcUoiISIiNyQkIitgZUY7RiEiKCQiJiE9OCEiIjckJCIrQFV1O0YhIigkIiYhPjghIiI3JCQiKyRRN3NyIyEiKCQiJitLIiEiIjckJCIrUi5vPEYhIigkIiY1SyIhIiI3JCQiKyozWyI9RiEiKCQiJj9LIiEiIjckJCIrTWNoPUYhIigkIiZJSyIhIiI3JCQiK3VIMz5GISIoJCImU0siISIiNyQkIis0LGI+RiEiKCQiJl1LIiEiIjckJCIqLzwrcyMhIickIiZnSyIhIiI3JCQiK21QWz9GISIoJCImcUsiISIiNyQkIisqR100cyMhIigkIiYhRzghIiI3JCQiKzNtVEBGISIoJCImIUg4ISIiNyQkIitCRik9cyMhIigkIiYrTCIhIiI3JCQiK08nW0JzIyEiKCQiJjVMIiEiIjckJCIrWFYiR3MjISIoJCImP0wiISIiNyQkIitgKXpLcyMhIigkIiZJTCIhIiI3JCQiK2VedUJGISIoJCImU0wiISIiNyQkIitoLUBDRiEiKCQiJl1MIiEiIjckJCIral5uQ0YhIigkIiZnTCIhIiI3JCQiK2opUl5zIyEiKCQiJnFMIiEiIjckJCIralZnREYhIigkIiYhUTghIiI3JCQiK2gnb2dzIyEiKCQiJiFSOCEiIjckJCIqd0tscyMhIickIiYrTSIhIiI3JCQiK2VtKnBzIyEiKCQiJjVNIiEiIjckJCIrYy5ZRkYhIigkIiY/TSIhIiI3JCQiK2FRI3pzIyEiKCQiJklNIiEiIjckJCIrYHJRR0YhIigkIiZTTSIhIiI3JCQiK2EtJilHRiEiKCQiJl1NIiEiIjckJCIrYkpKSEYhIigkIiZnTSIhIiI3JCQiK2VleEhGISIoJCImcU0iISIiNyQkIitqJFEtdCMhIigkIiYhWzghIiI3JCQiK3AxcUlGISIoJCImIVw4ISIiNyQkIit6RjtKRiEiKCQiJitOIiEiIjckJCIqcEM7dCMhIickIiY1TiIhIiI3JCQiKzBrM0tGISIoJCImP04iISIiNyQkIitCemFLRiEiKCQiJklOIiEiIjckJCIrVyM0SXQjISIoJCImU04iISIiNyQkIitwLlpMRiEiKCQiJl1OIiEiIjckJCIrKkhKUnQjISIoJCImZ04iISIiNyQkIitLP1JNRiEiKCQiJnFOIiEiIjckJCIqZF9bdCMhIickIiYhZTghIiI3JCQiKzhISk5GISIoJCImIWY4ISIiNyQkIitoSXhORiEiKCQiJitPIiEiIjckJCIrOUlCT0YhIigkIiY1TyIhIiI3JCQiK3RGcE9GISIoJCImP08iISIiNyQkIitRQjpQRiEiKCQiJklPIiEiIjckJCIrNDxoUEYhIigkIiZTTyIhIiI3JCQiKygpMzJRRiEiKCQiJl1PIiEiIjckJCIrcilIJlFGISIoJCImZ08iISIiNyQkIitpJykpKlFGISIoJCImcU8iISIiNyQkIitoc1dSRiEiKCQiJiFvOCEiIjckJCIrbmMhKlJGISIoJCImIXA4ISIiNyQkIisiKVFPU0YhIigkIiYrUCIhIiI3JCQiKy4+IzN1IyEiKCQiJjVQIiEiIjckJCIrTSh6N3UjISIoJCImP1AiISIiNyQkIit0dHRURiEiKCQiJklQIiEiIjckJCIqI1s+VUYhIickIiZTUCIhIiI3JCQiK3k/bFVGISIoJCImXVAiISIiNyQkIitXIjRKdSMhIigkIiZnUCIhIiI3JCQiKi1tTnUjISInJCImcVAiISIiNyQkIisxRi1XRiEiKCQiJiF5OCEiIjckJCIrLiN6V3UjISIoJCImIXo4ISIiNyQkIis0YiRcdSMhIigkIiYrUSIhIiI3JCQiK0Y7UlhGISIoJCImNVEiISIiNyQkIitidiVldSMhIigkIiY/USIhIiI3JCQiKyZILmp1IyEiKCQiJklRIiEiIjckJCIrWillbnUjISIoJCImU1EiISIiNyQkIipAOXN1IyEiJyQiJl1RIiEiIjckJCIrJlFwd3UjISIoJCImZ1EiISIiNyQkIitzVjdbRiEiKCQiJnFRIiEiIjckJCIrcyJ6JltGISIoJCImISlRIiEiIjckJCIrJnlMIVxGISIoJCImISpRIiEiIjckJCIrNiMpW1xGISIoJCImK1IiISIiNyQkIipYVSpcRiEiJyQiJjVSIiEiIjckJCIrLmxSXUYhIigkIiY/UiIhIiI3JCQiK3AuJjN2IyEiKCQiJklSIiEiIjckJCIqMC84diMhIickIiZTUiIhIiI3JCQiK1h2dl5GISIoJCImXVIiISIiNyQkIitiM0BfRiEiKCQiJmdSIiEiIjckJCIrelJtX0YhIigkIiZxUiIhIiI3JCQiKz5wNmBGISIoJCImISlSIiEiIjckJCIrdSdwTnYjISIoJCImISpSIiEiIjckJCIrV0EtYUYhIigkIiYrUyIhIiI3JCQiK0pZWmFGISIoJCImNVMiISIiNyQkIitMbyNcdiMhIigkIiY/UyIhIiI3JCQiK18peWB2IyEiKCQiJklTIiEiIjckJCIrKW9JZXYjISIoJCImU1MiISIiNyQkIitUQkdjRiEiKCQiJl1TIiEiIjckJCIqIlF0Y0YhIickIiZnUyIhIiI3JCQiKyg0Jj1kRiEiKCQiJnFTIiEiIjckJCIrLWlqZEYhIigkIiYhMzkhIiI3JCQiK0NyM2VGISIoJCImITQ5ISIiNyQkIitseWBlRiEiKCQiJitUIiEiIjckJCIrQyUpKSplRiEiKCQiJjVUIiEiIjckJCIrLSlRJWZGISIoJCImP1QiISIiNyQkIispKiopKSlmRiEiKCQiJklUIiEiIjckJCIrOSFSLncjISIoJCImU1QiISIiNyQkIitcKSl5Z0YhIigkIiZdVCIhIiI3JCQiKy8mUTd3IyEiKCQiJmdUIiEiIjckJCIreXpvaEYhIigkIiZxVCIhIiI3JCQiK3RzOGlGISIoJCImIT05ISIiNyQkIispUSdlaUYhIigkIiYhPjkhIiI3JCQiK0JgLmpGISIoJCImK1UiISIiNyQkIiozJVtqRiEiJyQiJjVVIiEiIjckJCIrZEUkUncjISIoJCImP1UiISIiNyQkIitjNVFrRiEiKCQiJklVIiEiIjckJCIrdyNIW3cjISIoJCImU1UiISIiNyQkIis9dEZsRiEiKCQiJl1VIiEiIjckJCIrIz1EZHcjISIoJCImZ1UiISIiNyQkIitwRzxtRiEiKCQiJnFVIiEiIjckJCIreS5pbUYhIigkIiYhRzkhIiI3JCQiKzR4MW5GISIoJCImIUg5ISIiNyQkIitrW15uRiEiKCQiJitWIiEiIjckJCIrVT0nencjISIoJCImNVYiISIiNyQkIitWJzMlb0YhIigkIiY/ViIhIiI3JCQiK3BfJilvRiEiKCQiJklWIiEiIjckJCIrPTxJcEYhIigkIiZTViIhIiI3JCQiKyIqenVwRiEiKCQiJl1WIiEiIjckJCIrKjMlPnFGISIoJCImZ1YiISIiNyQkIis2K2txRiEiKCQiJnFWIiEiIjckJCIrZWQzckYhIigkIiYhUTkhIiI3JCQiK0o4YHJGISIoJCImIVI5ISIiNyQkIitHbig+eCMhIigkIiYrVyIhIiI3JCQiK18+VXNGISIoJCImNVciISIiNyQkIisscSdHeCMhIigkIiY/VyIhIiI3JCQiK3c9SnRGISIoJCImSVciISIiNyQkIit5bHZ0RiEiKCQiJlNXIiEiIjckJCIrMTY/dUYhIigkIiZdVyIhIiI3JCQiK2hha3VGISIoJCImZ1ciISIiNyQkIitWJyozdkYhIigkIiZxVyIhIiI3JCQiK19PYHZGISIoJCImIVs5ISIiNyQkIisqW3hmeCMhIigkIiYhXDkhIiI3JCQiK2A2VXdGISIoJCImK1giISIiNyQkIitYWSdveCMhIigkIiY1WCIhIiI3JCQiK216SXhGISIoJCImP1giISIiNyQkIis6NnZ4RiEiKCQiJklYIiEiIjckJCIrIzQlPnlGISIoJCImU1giISIiNyQkIispKm9qeUYhIigkIiZdWCIhIiI3JCQiK00meiF6RiEiKCQiJmdYIiEiIjckJCIrKSo+X3pGISIoJCImcVgiISIiNyQkIisjSGsqekYhIigkIiYhZTkhIiI3JCQiKztrUyF5IyEiKCQiJiFmOSEiIjckJCIqUFszeSMhIickIiYrWSIhIiI3JCQiK2EsSCJ5IyEiKCQiJjVZIiEiIjckJCIrcDx0InkjISIoJCImP1kiISIiNyQkIis5SzwjeSMhIigkIiZJWSIhIiI3JCQiKlw5RXkjISInJCImU1kiISIiNyQkIispZmJJeSMhIigkIiZdWSIhIiI3JCQiK09sXCR5IyEiKCQiJmdZIiEiIjckJCIrMXQkUnkjISIoJCImcVkiISIiNyQkIiszelAleSMhIigkIiYhbzkhIiI3JCQiK1UkPVt5IyEiKCQiJiFwOSEiIjckJCIrMydlX3kjISIoJCImK1oiISIiNyQkIisyKClwJnkjISIoJCImNVoiISIiNyQkIitRJ1FoeSMhIigkIiY/WiIhIiI3JCQiKy0leWx5IyEiKCQiJklaIiEiIjckJCIoPXF5IyEiJSQiJlNaIiEiIjckJCIqVmR1eSMhIickIiZdWiIhIiI3JCQiKyVwJyp5eSMhIigkIiZnWiIhIiI3JCQiKyN6TiQpeSMhIigkIiZxWiIhIiI3JCQiK0NaeCl5IyEiKCQiJiF5OSEiIjckJCIqXDgjKnkjISInJCImIXo5ISIiNyQkIisiNF8nKnkjISIoJCImK1siISIiNyQkIitFMDQheiMhIigkIiY1WyIhIiI3JCQiKyd6RzB6IyEiKCQiJj9bIiEiIjckJCIrLXAnNHojISIoJCImSVsiISIiNyQkIitVW1MieiMhIigkIiZTWyIhIiI3JCQiKz1FJT16IyEiKCQiJl1bIiEiIjckJCIqQiFHI3ojISInJCImZ1siISIiNyQkIit5d3IjeiMhIigkIiZxWyIhIiI3JCQiK2lcOiR6IyEiKCQiJiEpWyIhIiI3JCQiKyMzI2YkeiMhIigkIiYhKlsiISIiNyQkIitSIUhTeiMhIigkIiYrXCIhIiI3JCQiK0xlWSV6IyEiKCQiJjVcIiEiIjckJCIrakMhXHojISIoJCImP1wiISIiNyQkIitKKlFgeiMhIigkIiZJXCIhIiI3JCQiK1BfeCZ6IyEiKCQiJlNcIiEiIjckJCIqUTZpeiMhIickIiZdXCIhIiI3JCQiK2h0ayd6IyEiKCQiJmdcIiEiIjckJCIqPSQzKHojISInJCImcVwiISIiNyQkIitQKT12eiMhIigkIiYhKVwiISIiNyQkIitMViZ6eiMhIigkIiYhKlwiISIiNyQkIitvJypRKXojISIoJCImK10iISIiNyQkIitVWyMpKXojISIoJCImNV0iISIiNyQkIitiKWYjKnojISIoJCImP10iISIiNyQkIisyWnAqeiMhIigkIiZJXSIhIiI3JCQiKylSSCwhRyEiKCQiJlNdIiEiIjckJCIqJFJjK0chIickIiZdXSIhIiI3JCQiKywkKSo0IUchIigkIiZnXSIhIiI3JCQiKzhEVixHISIoJCImcV0iISIiNyQkIitsbCc9IUchIigkIiYhMzohIiI3JCQiK2UvSS1HISIoJCImITQ6ISIiNyQkIisjPk1GIUchIigkIiYrXiIhIiI3JCQiK214Oy5HISIoJCImNV4iISIiNyQkIisjPSxPIUchIigkIiY/XiIhIiI3JCQiK1JXLi9HISIoJCImSV4iISIiNyQkIitRdlkvRyEiKCQiJlNeIiEiIjckJCIrei8hXCFHISIoJCImXV4iISIiNyQkIitpS0wwRyEiKCQiJmdeIiEiIjckJCIrKClldzBHISIoJCImcV4iISIiNyQkIitiJCk+MUchIigkIiYhPTohIiI3JCQiK2wxajFHISIoJCImIT46ISIiNyQkIis9RzEyRyEiKCQiJitfIiEiIjckJCIrOltcMkchIigkIiY1XyIhIiI3JCQiK2FtI3ohRyEiKCQiJj9fIiEiIjckJCIrUCRlJDNHISIoJCImSV8iISIiNyQkIitrKSp5M0chIigkIiZTXyIhIiI3JCQiK043QTRHISIoJCImXV8iISIiNyQkIipYXyc0RyEiJyQiJmdfIiEiIjckJCIrNE4zNUchIigkIiZxXyIhIiI3JCQiKzdXXjVHISIoJCImIUc6ISIiNyQkIitoXiU0IkchIigkIiYhSDohIiI3JCQiK2FkUDZHISIoJCImK2AiISIiNyQkIisjPjE9IkchIigkIiY1YCIhIiI3JCQiK3drQjdHISIoJCImP2AiISIiNyQkIiswbW03RyEiKCQiJklgIiEiIjckJCIqZSc0OEchIickIiZTYCIhIiI3JCQiKWtfOEchIiYkIiZdYCIhIiI3JCQiK25nJlIiRyEiKCQiJmdgIiEiIjckJCIrImUmUTlHISIoJCImcWAiISIiNyQkIiolXCJbIkchIickIiYhUTohIiI3JCQiK1pUQzpHISIoJCImIVI6ISIiNyQkIilLbjpHISImJCImK2EiISIiNyQkIilANTtHISImJCImNWEiISIiNyQkIitbM2A7RyEiKCQiJj9hIiEiIjckJCIrViVmcCJHISIoJCImSWEiISIiNyQkIisnKXlRPEchIigkIiZTYSIhIiI3JCQiK3hoInkiRyEiKCQiJl1hIiEiIjckJCIrO1ZDPUchIigkIiZnYSIhIiI3JCQiKy5Cbj1HISIoJCImcWEiISIiNyQkIitRLDU+RyEiKCQiJiFbOiEiIjckJCIrQnlfPkchIigkIiYhXDohIiI3JCQiK2NgJio+RyEiKCQiJitiIiEiIjckJCIrUUZRP0chIigkIiY1YiIhIiI3JCQiK3AqNDMjRyEiKCQiJj9iIiEiIjckJCIqMFA3I0chIickIiZJYiIhIiI3JCQiKyIpUm1ARyEiKCQiJlNiIiEiIjckJCIraDI0QUchIigkIiZdYiIhIiI3JCQiKyJSPEQjRyEiKCQiJmdiIiEiIjckJCIrc1ElSCNHISIoJCImcWIiISIiNyQkIisuLVBCRyEiKCQiJiFlOiEiIjckJCIrJVEnekJHISIoJCImIWY6ISIiNyQkIis7Q0FDRyEiKCQiJitjIiEiIjckJCIpJFtZI0chIiYkIiY1YyIhIiI3JCQiK01TMkRHISIoJCImP2MiISIiNyQkIippKlxERyEiJyQiJkljIiEiIjckJCIrZF0jZiNHISIoJCImU2MiISIiNyQkIitZLk5FRyEiKCQiJl1jIiEiIjckJCIrKFt2biNHISIoJCImZ2MiISIiNyQkIipbK3MjRyEiJyQiJnFjIiEiIjckJCIrRWBpRkchIigkIiYhbzohIiI3JCQiK0MrMEdHISIoJCImIXA6ISIiNyQkIit1WFpHRyEiKCQiJitkIiEiIjckJCIreSopKilHRyEiKCQiJjVkIiEiIjckJCIrTUtLSEchIigkIiY/ZCIhIiI3JCQiK1d0dUhHISIoJCImSWQiISIiNyQkIisyODxJRyEiKCQiJlNkIiEiIjckJCIrQ15mSUchIigkIiZdZCIhIiI3JCQiKyZ6PTUkRyEiKCQiJmdkIiEiIjckJCIrPkJXSkchIigkIiZxZCIhIiI3JCQiKylwbD0kRyEiKCQiJiF5OiEiIjckJCIrSiopR0tHISIoJCImIXo6ISIiNyQkIis+P3JLRyEiKCQiJitlIiEiIjckJCIraFw4TEchIigkIiY1ZSIhIiI3JCQiK2V4YkxHISIoJCImP2UiISIiNyQkIis2LylSJEchIigkIiZJZSIhIiI3JCQiKz1IU01HISIoJCImU2UiISIiNyQkIisjR0RbJEchIigkIiZdZSIhIiI3JCQiKXZDTkchIiYkIiZnZSIhIiI3JCQiK3YmcGMkRyEiKCQiJnFlIiEiIjckJCIrMTo0T0chIigkIiYhKWUiISIiNyQkIisjSDhsJEchIigkIiYhKmUiISIiNyQkIitPXCRwJEchIigkIiYrZiIhIiI3JCQiK05rTlBHISIoJCImNWYiISIiNyQkIisjenh4JEchIigkIiY/ZiIhIiI3JCQiKzAhKj5RRyEiKCQiJklmIiEiIjckJCIrdytpUUchIigkIiZTZiIhIiI3JCQiKy41L1JHISIoJCImXWYiISIiNyQkIisqeWglUkchIigkIiZnZiIhIiI3JCQiK0tDKSlSRyEiKCQiJnFmIiEiIjckJCIrS0hJU0chIigkIiYhKWYiISIiNyQkIisiSEIyJUchIigkIiYhKmYiISIiNyQkIiszTjlURyEiKCQiJitnIiEiIjckJCIrJGVqOiVHISIoJCImNWciISIiNyQkIis8Tik+JUchIigkIiY/ZyIhIiI3JCQiKkouQyVHISInJCImSWciISIiNyQkIitoSCNHJUchIigkIiZTZyIhIiI3JCQiK3NDQ1ZHISIoJCImXWciISIiNyQkIitUPW1WRyEiKCQiJmdnIiEiIjckJCIrcjUzV0chIigkIiZxZyIhIiI3JCQiK2YsXVdHISIoJCImITM7ISIiNyQkIiszIj5cJUchIigkIiYhNDshIiI3JCQiKzt6TFhHISIoJCImK2giISIiNyQkIismZWNkJUchIigkIiY1aCIhIiI3JCQiKzlePFlHISIoJCImP2giISIiNyQkIisvTmZZRyEiKCQiJkloIiEiIjckJCIrYTwsWkchIigkIiZTaCIhIiI3JCQiK2wpSHUlRyEiKCQiJl1oIiEiIjckJCIrUHkleSVHISIoJCImZ2giISIiNyQkIipubCNbRyEiJyQiJnFoIiEiIjckJCIra0xvW0chIigkIiYhPTshIiI3JCQiK0A0NVxHISIoJCImIT47ISIiNyQkIitRJD0mXEchIigkIiYraSIhIiI3JCQiKz1jJCpcRyEiKCQiJjVpIiEiIjckJCIqd18uJkchIickIiY/aSIhIiI3JCQiK2socDImRyEiKCQiJklpIiEiIjckJCIqaic9XkchIickIiZTaSIhIiI3JCQiK2ZMZ15HISIoJCImXWkiISIiNyQkIiteKj4/JkchIigkIiZnaSIhIiI3JCQiKzBrVl9HISIoJCImcWkiISIiNyQkIitCRiZHJkchIigkIiYhRzshIiI3JCQiKy8qb0smRyEiKCQiJiFIOyEiIjckJCIrW1xvYEchIigkIiYraiIhIiI3JCQiK2MzNWFHISIoJCImNWoiISIiNyQkIitHbV5hRyEiKCQiJj9qIiEiIjckJCIra0EkXCZHISIoJCImSWoiISIiNyQkIitreE1iRyEiKCQiJlNqIiEiIjckJCIrR0p3YkchIigkIiZdaiIhIiI3JCQiK2MkeWgmRyEiKCQiJmdqIiEiIjckJCIqWCRmY0chIickIiZxaiIhIiI3JCQiKzMlM3EmRyEiKCQiJiFROyEiIjckJCIrSktVZEchIigkIiYhUjshIiI3JCQiKz56JHkmRyEiKCQiJitrIiEiIjckJCIrc0NEZUchIigkIiY1ayIhIiI3JCQiKyIqb21lRyEiKCQiJj9rIiEiIjckJCIrdjYzZkchIigkIiZJayIhIiI3JCQiK0VgXGZHISIoJCImU2siISIiNyQkIitVJDQqZkchIigkIiZdayIhIiI3JCQiK0NLS2dHISIoJCImZ2siISIiNyQkIit0cHRnRyEiKCQiJnFrIiEiIjckJCIrKWVdNidHISIoJCImIVs7ISIiNyQkIioyazonRyEiJyQiJiFcOyEiIjckJCIrPnUoPidHISIoJCImK2wiISIiNyQkIitNMVJpRyEiKCQiJjVsIiEiIjckJCIrPFAhRydHISIoJCImP2wiISIiNyQkIitubUBqRyEiKCQiJklsIiEiIjckJCIrJVtITydHISIoJCImU2wiISIiNyQkIio8VVMnRyEiJyQiJl1sIiEiIjckJCIrQVpYa0chIigkIiZnbCIhIiI3JCQiK1ZyJ1snRyEiKCQiJnFsIiEiIjckJCIrSyV6XydHISIoJCImIWU7ISIiNyQkIipmInBsRyEiJyQiJiFmOyEiIjckJCIrOk81bUchIigkIiYrbSIhIiI3JCQiKl46bCdHISInJCImNW0iISIiNyQkIit0cyNwJ0chIigkIiY/bSIhIiI3JCQiKzAqUXQnRyEiKCQiJkltIiEiIjckJCIrMS92bkchIigkIiZTbSIhIiI3JCQiK3c8O29HISIoJCImXW0iISIiNyQkIis7SWRvRyEiKCQiJmdtIiEiIjckJCIrRFQpKm9HISIoJCImcW0iISIiNyQkIiswXlJwRyEiKCQiJiFvOyEiIjckJCIrYWYhKXBHISIoJCImIXA7ISIiNyQkIit0bUBxRyEiKCQiJituIiEiIjckJCIraXNpcUchIigkIiY1biIhIiI3JCQiK0F4LnJHISIoJCImP24iISIiNyQkIitfIVs5KEchIigkIiZJbiIhIiI3JCQiK2AjZT0oRyEiKCQiJlNuIiEiIjckJCIrRCRvQShHISIoJCImXW4iISIiNyQkIitvI3lFKEchIigkIiZnbiIhIiI3JCQiKyMzKTN0RyEiKCQiJnFuIiEiIjckJCIrb3hcdEchIigkIiYheTshIiI3JCQiK0R0IVIoRyEiKCQiJiF6OyEiIjckJCIrYW5KdUchIigkIiYrbyIhIiI3JCQiK2Fnc3VHISIoJCImNW8iISIiNyQkIitFXzh2RyEiKCQiJj9vIiEiIjckJCIrclVhdkchIigkIiZJbyIhIiI3JCQiKyk9YGYoRyEiKCQiJlNvIiEiIjckJCIreD5Pd0chIigkIiZdbyIhIiI3JCQiK1IxeHdHISIoJCImZ28iISIiNyQkIit1InpyKEchIigkIiZxbyIhIiI3JCQiKyNlKGV4RyEiKCQiJiEpbyIhIiI3JCQiK2plKnooRyEiKCQiJiEqbyIhIiI3JCQiKzxTU3lHISIoJCImK3AiISIiNyQkIitXPyIpeUchIigkIiY1cCIhIiI3JCQiK1gqPiN6RyEiKCQiJj9wIiEiIjckJCIqc0YnekchIickIiZJcCIhIiI3JCQiK3BgLiEpRyEiKCQiJlNwIiEiIjckJCIrIipHVyEpRyEiKCQiJl1wIiEiIjckJCIrKUddMylHISIoJCImZ3AiISIiNyQkIitmdkQiKUchIigkIiZxcCIhIiI3JCQiKzBabSIpRyEiKCQiJiEpcCIhIiI3JCQiK0Q8MiMpRyEiKCQiJiEqcCIhIiI3JCQiKml5QylHISInJCImK3EiISIiNyQkIipSJilHKUchIickIiY1cSIhIiI3JCQiK04/SCQpRyEiKCQiJj9xIiEiIjckJCIrYyYpcCQpRyEiKCQiJklxIiEiIjckJCIrX1w1JSlHISIoJCImU3EiISIiNyQkIitCN14lKUchIigkIiZdcSIhIiI3JCQiKlA8XClHISInJCImZ3EiISIiNyQkIiskUkJgKUchIigkIiZxcSIhIiI3JCQiKyNISGQpRyEiKCQiJiEzPCEiIjckJCIrbl04JylHISIoJCImITQ8ISIiNyQkIis+MmEnKUchIigkIiYrciIhIiI3JCQiK1ppJXApRyEiKCQiJjVyIiEiIjckJCIrXjtOKClHISIoJCImP3IiISIiNyQkIitMcHYoKUchIigkIiZJciIhIiI3JCQiKyI0aSIpKUchIigkIiZTciIhIiI3JCQiK0ZyYykpRyEiKCQiJl1yIiEiIjckJCIrUj8oKikpRyEiKCQiJmdyIiEiIjckJCIrSG9QKilHISIoJCImcXIiISIiNyQkIisoXCJ5KilHISIoJCImIT08ISIiNyQkIitVZz0hKkchIigkIiYhPjwhIiI3JCQiK2wvZiEqRyEiKCQiJitzIiEiIjckJCIrbVoqNCpHISIoJCImNXMiISIiNyQkIitZKilSIipHISIoJCImP3MiISIiNyQkIisuSSE9KkchIigkIiZJcyIhIiI3JCQiK1JwPyMqRyEiKCQiJlNzIiEiIjckJCIrYTJoIypHISIoJCImXXMiISIiNyQkIitaVywkKkchIigkIiZncyIhIiI3JCQiKz4hPU0qRyEiKCQiJnFzIiEiIjckJCIrcjkjUSpHISIoJCImIUc8ISIiNyQkIissW0ElKkchIigkIiYhSDwhIiI3JCQiKzYhR1kqRyEiKCQiJit0IiEiIjckJCIpNi4mKkchIiYkIiY1dCIhIiI3JCQiK3BTViYqRyEiKCQiJj90IiEiIjckJCIrPHAkZSpHISIoJCImSXQiISIiNyQkIitZJ1JpKkchIigkIiZTdCIhIiI3JCQiK2FBaycqRyEiKCQiJl10IiEiIjckJCIrVlovKCpHISIoJCImZ3QiISIiNyQkIis3clcoKkchIigkIiZxdCIhIiI3JCQiK2kkXHkqRyEiKCQiJiFRPCEiIjckJCIrI1xeIykqRyEiKCQiJiFSPCEiIjckJCIrLk5sKSpHISIoJCImK3UiISIiNyQkIismUmIhKipHISIoJCImNXUiISIiNyQkIitwclgqKkchIigkIiY/dSIhIiI3JCQiK0IpZSkqKkchIigkIiZJdSIhIiI3JCQiK2YuRStIISIoJCImU3UiISIiNyQkIit3PG0rSCEiKCQiJl11IiEiIjckJCIrdkkxLEghIigkIiZndSIhIiI3JCQiK2NVWSxIISIoJCImcXUiISIiNyQkIis9YCc9IUghIigkIiYhWzwhIiI3JCQiK2ppRS1IISIoJCImIVw8ISIiNyQkIio0bkUhSCEiJyQiJit2IiEiIjckJCIpeTEuSCEiJiQiJjV2IiEiIjckJCIrI1JvTSFIISIoJCImP3YiISIiNyQkIittKW9RIUghIigkIiZJdiIhIiI3JCQiK0MjcFUhSCEiKCQiJlN2IiEiIjckJCIrayVwWSFIISIoJCImXXYiISIiNyQkIispZXBdIUghIigkIiZndiIhIiI3JCQiKyZmcGEhSCEiKCQiJnF2IiEiIjckJCIrJltwZSFIISIoJCImIWU8ISIiNyQkIitlI3BpIUghIigkIiYhZjwhIiI3JCQiKzsqb20hSCEiKCQiJit3IiEiIjckJCIrZCVvcSFIISIoJCImNXciISIiNyQkIisjKXlZMkghIigkIiY/dyIhIiI3JCQiKyI+bnkhSCEiKCQiJkl3IiEiIjckJCIrJlFtIzNIISIoJCImU3ciISIiNyQkIitqYW0zSCEiKCQiJl13IiEiIjckJCIrRFcxNEghIigkIiZndyIhIiI3JCQiK3NLWTRIISIoJCImcXciISIiNyQkIisvPycpNEghIigkIiYhbzwhIiI3JCQiK0AxRTVIISIoJCImIXA8ISIiNyQkIitCImYxIkghIigkIiYreCIhIiI3JCQiKl5kNSJIISInJCImNXgiISIiNyQkIisjeWI5IkghIigkIiY/eCIhIiI3JCQiKiVSJj0iSCEiJyQiJkl4IiEiIjckJCIrJSk+RDdIISIoJCImU3giISIiNyQkIis4KlxFIkghIigkIiZdeCIhIiI3JCQiK0h4LzhIISIoJCImZ3giISIiNyQkIipWWE0iSCEiJyQiJnF4IiEiIjckJCIrPEklUSJIISIoJCImIXk8ISIiNyQkIisiXFNVIkghIigkIiYhejwhIiI3JCQiK195ajlIISIoJCImK3kiISIiNyQkIisqNE5dIkghIigkIiY1eSIhIiI3JCQiK0xBVjpIISIoJCImP3kiISIiNyQkIitgI0hlIkghIigkIiZJeSIhIiI3JCQiK2hoQTtIISIoJCImU3kiISIiNyQkIitjSGk7SCEiKCQiJl15IiEiIjckJCIrUSc+cSJIISIoJCImZ3kiISIiNyQkIisyaVQ8SCEiKCQiJnF5IiEiIjckJCIra0UieSJIISIoJCImISl5IiEiIjckJCIrNCE0Iz1IISIoJCImISp5IiEiIjckJCIrVV9nPUghIigkIiYreiIhIiI3JCQiK2o4Kz5IISIoJCImNXoiISIiNyQkIitydFI+SCEiKCQiJj96IiEiIjckJCIrb0t6PkghIigkIiZJeiIhIiI3JCQiK2EhKj0/SCEiKCQiJlN6IiEiIjckJCIrR1plP0ghIigkIiZdeiIhIiI3JCQiKyJIISk0I0ghIigkIiZneiIhIiI3JCQiK1VkUEBIISIoJCImcXoiISIiNyQkIisjM3I8I0ghIigkIiYhKXoiISIiNyQkIis3ajtBSCEiKCQiJiEqeiIhIiI3JCQiKlZoRCNIISInJCImKyE9ISIiNyQkIitRayZII0ghIigkIiY1IT0hIiI3JCQiK084TkJIISIoJCImPyE9ISIiNyQkIitCaHVCSCEiKCQiJkkhPSEiIjckJCIpMzlDSCEiJiQiJlMhPSEiIjckJCIrbWBgQ0ghIigkIiZdIT0hIiI3JCQiK0IpSFwjSCEiKCQiJmchPSEiIjckJCIqPENgI0ghIickIiZxIT0hIiI3JCQiKzIlPWQjSCEiKCQiJiEzPSEiIjckJCIrTUQ2RUghIigkIiYhND0hIiI3JCQiK19sXUVIISIoJCImKyI9ISIiNyQkIitoLyFwI0ghIigkIiY1Ij0hIiI3JCQiK2hVSEZIISIoJCImPyI9ISIiNyQkIiteem9GSCEiKCQiJkkiPSEiIjckJCIrTDozR0ghIigkIiZTIj0hIiI3JCQiKzBdWkdIISIoJCImXSI9ISIiNyQkIitwJG8pR0ghIigkIiZnIj0hIiI3JCQiK0Q7RUhIISIoJCImcSI9ISIiNyQkIitzWmxISCEiKCQiJiE9PSEiIjckJCIrNnkvSUghIigkIiYhPj0hIiI3JCQiK1UyV0lIISIoJCImKyM9ISIiNyQkIitrTiQzJEghIigkIiY1Iz0hIiI3JCQiK3ppQUpIISIoJCImPyM9ISIiNyQkIisnKSk9OyRIISIoJCImSSM9ISIiNyQkIisnUTY/JEghIigkIiZTIz0hIiI3JCQiK3lQU0tIISIoJCImXSM9ISIiNyQkIitpZ3pLSCEiKCQiJmcjPSEiIjckJCIqQyk9TEghIickIiZxIz0hIiI3JCQiKkohZUxIISInJCImIUc9ISIiNyQkIit1QShSJEghIigkIiYhSD0hIiI3JCQiKjhrViRIISInJCImKyQ9ISIiNyQkIiopZXZNSCEiJyQiJjUkPSEiIjckJCIrQnY5TkghIigkIiY/JD0hIiI3JCQiKjFSYiRIISInJCImSSQ9ISIiNyQkIipcSWYkSCEiJyQiJlMkPSEiIjckJCIrOj1LT0ghIigkIiZdJD0hIiI3JCQiK0xJck9IISIoJCImZyQ9ISIiNyQkIitYVDVQSCEiKCQiJnEkPSEiIjckJCIrX15cUEghIigkIiYhUT0hIiI3JCQiK2BnKXkkSCEiKCQiJiFSPSEiIjckJCIrW29GUUghIigkIiYrJT0hIiI3JCQiK1F2bVFIISIoJCImNSU9ISIiNyQkIitBImUhUkghIigkIiY/JT0hIiI3JCQiKy0nWyVSSCEiKCQiJkklPSEiIjckJCIrdypRKVJIISIoJCImUyU9ISIiNyQkIitZI0gtJUghIigkIiZdJT0hIiI3JCQiKlQ+MSVIISInJCImZyU9ISIiNyQkIityJTQ1JUghIigkIiZxJT0hIiI3JCQiK0UlKlJUSCEiKCQiJiFbPSEiIjckJCIreCMqeVRIISIoJCImIVw9ISIiNyQkIitDIXpAJUghIigkIiYrJj0hIiI3JCQiK24nb0QlSCEiKCQiJjUmPSEiIjckJCIrMSNlSCVIISIoJCImPyY9ISIiNyQkIiprWkwlSCEiJyQiJkkmPSEiIjckJCIrcnB0VkghIigkIiZTJj0hIiI3JCQiKyo+RVQlSCEiKCQiJl0mPSEiIjckJCIrQmBeV0ghIigkIiZnJj0hIiI3JCQiK1ZWIVwlSCEiKCQiJnEmPSEiIjckJCIqRSRIWEghIickIiYhZT0hIiI3JCQiK3Y/b1hIISIoJCImIWY9ISIiNyQkIisneXFnJUghIigkIiYrJz0hIiI3JCQiKyVSZmslSCEiKCQiJjUnPSEiIjckJCIrKip5JW8lSCEiKCQiJj8nPSEiIjckJCIrLWpCWkghIigkIiZJJz0hIiI3JCQiKy1ZaVpIISIoJCImUyc9ISIiNyQkIilHLFtIISImJCImXSc9ISIiNyQkIisnKjNTW0ghIigkIiZnJz0hIiI3JCQiKyopKSl5W0ghIigkIiZxJz0hIiI3JCQiKyJ5dyJcSCEiKCQiJiFvPSEiIjckJCIqZGsmXEghIickIiYhcD0hIiI3JCQiK2VBJipcSCEiKCQiJisoPSEiIjckJCIrVylSLiZIISIoJCImNSg9ISIiNyQkIitIdHNdSCEiKCQiJj8oPSEiIjckJCIrN1o2XkghIigkIiZJKD0hIiI3JCQiKyUqPl1eSCEiKCQiJlMoPSEiIjckJCIrdiIqKT0mSCEiKCQiJl0oPSEiIjckJCIrYmlGX0ghIigkIiZnKD0hIiI3JCQiK0xLbV9IISIoJCImcSg9ISIiNyQkIis2LDBgSCEiKCQiJiF5PSEiIjckJCIrKilvVmBIISIoJCImIXo9ISIiNyQkIittTiNRJkghIigkIiYrKT0hIiI3JCQiK1UsQGFIISIoJCImNSk9ISIiNyQkIis9bWZhSCEiKCQiJj8pPSEiIjckJCIrJSpIKVwmSCEiKCQiJkkpPSEiIjckJCIqRnBgJkghIickIiZTKT0hIiI3JCQiK1lhdmJIISIoJCImXSk9ISIiNyQkIitBOjljSCEiKCQiJmcpPSEiIjckJCIrKlxGbCZIISIoJCImcSk9ISIiNyQkIit2TCJwJkghIigkIiYhKSk9ISIiNyQkIitgIipIZEghIigkIiYhKik9ISIiNyQkIitKW29kSCEiKCQiJisqPSEiIjckJCIqVHEhZUghIickIiY1Kj0hIiI3JCQiKiplWGVIISInJCImPyo9ISIiNyQkIityNyUpZUghIigkIiZJKj0hIiI3JCQiK2BsQWZIISIoJCImUyo9ISIiNyQkIitPPGhmSCEiKCQiJl0qPSEiIjckJCIrQG8qKmZIISIoJCImZyo9ISIiNyQkIisyPVFnSCEiKCQiJnEqPSEiIjckJCIrJXBtMidIISIoJCImISkqPSEiIjckJCIrJVteNidIISIoJCImISoqPSEiIjckJCIrdmhgaEghIigkIiYrIT4hIiI3JCQiK3AyIz4nSCEiKCQiJjUhPiEiIjckJCIra19JaUghIigkIiY/IT4hIiI3JCQiK2knKm9pSCEiKCQiJkkhPiEiIjckJCIraVIyakghIigkIiZTIT4hIiI3JCQiK2wiZU0nSCEiKCQiJl0hPiEiIjckJCIqRlVRJ0ghIickIiZnIT4hIiI3JCQiK3lpQWtIISIoJCImcSE+ISIiNyQkIisqPTVZJ0ghIigkIiYhMz4hIiI3JCQiKy1TKlwnSCEiKCQiJiE0PiEiIjckJCIrPnhQbEghIigkIiYrIj4hIiI3JCQiK1I4d2xIISIoJCImNSI+ISIiNyQkIitpWzltSCEiKCQiJj8iPiEiIjckJCIrKUdHbCdIISIoJCImSSI+ISIiNyQkIis9OyJwJ0ghIigkIiZTIj4hIiI3JCQiK19bSG5IISIoJCImXSI+ISIiNyQkIioqem5uSCEiJyQiJmciPiEiIjckJCIrSjUxb0ghIigkIiZxIj4hIiI3JCQiK3dSV29IISIoJCImIT0+ISIiNyQkIitFbyMpb0ghIigkIiYhPj4hIiI3JCQiKmU0I3BIISInJCImKyM+ISIiNyQkIitRQWZwSCEiKCQiJjUjPiEiIjckJCIpWygqcEghIiYkIiY/Iz4hIiI3JCQiK25zTnFIISIoJCImSSM+ISIiNyQkIitSJ1IyKEghIigkIiZTIz4hIiI3JCQiKzs+N3JIISIoJCImXSM+ISIiNyQkIisoNC86KEghIigkIiZnIz4hIiI3JCQiKyU9Jyk9KEghIigkIiZxIz4hIiI3JCQiK3cib0EoSCEiKCQiJiFHPiEiIjckJCIrdCtsc0ghIigkIiYhSD4hIiI3JCQiK3Y9LnRIISIoJCImKyQ+ISIiNyQkIiskZThNKEghIigkIiY1JD4hIiI3JCQiKyg+Jnp0SCEiKCQiJj8kPiEiIjckJCIrO248dUghIigkIiZJJD4hIiI3JCQiK1QiZVgoSCEiKCQiJlMkPiEiIjckJCIrcyVSXChIISIoJCImXSQ+ISIiNyQkIis0Mkt2SCEiKCQiJmckPiEiIjckJCIrYD1xdkghIigkIiZxJD4hIiI3JCQiKy1IM3dIISIoJCImIVE+ISIiNyQkIitmUVl3SCEiKCQiJiFSPiEiIjckJCIrQFolbyhIISIoJCImKyU+ISIiNyQkIisiXERzKEghIigkIiY1JT4hIiI3JCQiK25oZ3hIISIoJCImPyU+ISIiNyQkIip2Jyl6KEghIickIiZJJT4hIiI3JCQiKkNuJHlIISInJCImUyU+ISIiNyQkIitQd3V5SCEiKCQiJl0lPiEiIjckJCIrVHo3ekghIigkIiZnJT4hIiI3JCQiK2AiMyZ6SCEiKCQiJnElPiEiIjckJCIrcyMpKSl6SCEiKCQiJiFbPiEiIjckJCIrKUhvLSlIISIoJCImIVw+ISIiNyQkIitMI1sxKUghIigkIiYrJj4hIiI3JCQiK3YhRzUpSCEiKCQiJjUmPiEiIjckJCIrRHlTIilIISIoJCImPyY+ISIiNyQkIiskWyh5IilIISIoJCImSSY+ISIiNyQkIitccTsjKUghIigkIiZTJj4hIiI3JCQiK0JsYSMpSCEiKCQiJl0mPiEiIjckJCIrMWYjSClIISIoJCImZyY+ISIiNyQkIisoPjBMKUghIigkIiZxJj4hIiI3JCQiKyhSJW8kKUghIigkIiYhZT4hIiI3JCQiKzBOMSUpSCEiKCQiJiFmPiEiIjckJCIrQkRXJSlIISIoJCImKyc+ISIiNyQkIitcOSNbKUghIigkIiY1Jz4hIiI3JCQiKyVHK18pSCEiKCQiJj8nPiEiIjckJCIrRyF6YilIISIoJCImSSc+ISIiNyQkIisjb2RmKUghIigkIiZTJz4hIiI3JCQiK1hpTCcpSCEiKCQiJl0nPiEiIjckJCIrPFpyJylIISIoJCImZyc+ISIiNyQkIisqNCQ0KClIISIoJCImcSc+ISIiNyQkIisiUnJ1KUghIigkIiYhbz4hIiI3JCQiKyNmXHkpSCEiKCQiJiFwPiEiIjckJCIrL3hBKSlIISIoJCImKyg+ISIiNyQkIitEZGcpKUghIigkIiY1KD4hIiI3JCQiK2RPKSopKUghIigkIiY/KD4hIiI3JCQiKypcaCQqKUghIigkIiZJKD4hIiI3JCQiK14jUigqKUghIigkIiZTKD4hIiI3JCQiKzhwNiEqSCEiKCQiJl0oPiEiIjckJCIrJ1slXCEqSCEiKCQiJmcoPiEiIjckJCIqKD4oMypIISInJCImcSg+ISIiNyQkIitsJFw3KkghIigkIiYheT4hIiI3JCQiKm5FOypIISInJCImIXo+ISIiNyQkIisoKVErIypIISIoJCImKyk+ISIiNyQkIis6NVEjKkghIigkIiY1KT4hIiI3JCQiK2EhZUYqSCEiKCQiJj8pPiEiIjckJCIrL104JCpIISIoJCImSSk+ISIiNyQkIittPV4kKkghIigkIiZTKT4hIiI3JCQiK1InKSlRKkghIigkIiZdKT4hIiI3JCQiK0NgRSUqSCEiKCQiJmcpPiEiIjckJCIqIz5rJSpIISInJCImcSk+ISIiNyQkIitIJT1dKkghIigkIiYhKSk+ISIiNyQkIiomW1ImKkghIickIiYhKik+ISIiNyQkIisjPXJkKkghIigkIiYrKj4hIiI3JCQiK0Z1OScqSCEiKCQiJjUqPiEiIjckJCIrJWVCbCpIISIoJCImPyo+ISIiNyQkIithJyoqbypIISIoJCImSSo+ISIiNyQkIitPY0YoKkghIigkIiZTKj4hIiI3JCQiK0o6bCgqSCEiKCQiJl0qPiEiIjckJCIrUXQtKSpIISIoJCImZyo+ISIiNyQkIitmSVMpKkghIigkIiZxKj4hIiI3JCQiKyNweSgpKkghIigkIiYhKSo+ISIiNyQkIitSVToqKkghIigkIiYhKio+ISIiNyQkIispcEgmKipIISIoJCImKysjISIiNyQkIityXSEqKipIISIoJCImNSsjISIiNyQkIitlLkcrSSEiKCQiJj8rIyEiIjckJCIrZGJsK0khIigkIiZJKyMhIiI3JCQiK3IxLixJISIoJCImUysjISIiNyQkIispcDA5KyQhIigkIiZdKyMhIiI3JCQiK1IxeSxJISIoJCImZysjISIiNyQkIislXGJAKyQhIigkIiZxKyMhIiI3JCQiK2otYC1JISIoJCImITM/ISIiNyQkIitZXCFIKyQhIigkIiYhND8hIiI3JCQiK1YmeksrJCEiKCQiJissIyEiIjckJCIrYlNsLkkhIigkIiY1LCMhIiI3JCQiKyJbR1MrJCEiKCQiJj8sIyEiIjckJCIrQUdTL0khIigkIiZJLCMhIiI3JCQiK3hxeC9JISIoJCImUywjISIiNyQkIitaNzowSSEiKCQiJl0sIyEiIjckJCIrS2BfMEkhIigkIiZnLCMhIiI3JCQiK0skKiplKyQhIigkIiZxLCMhIiI3JCQiK1tLRjFJISIoJCImIT0/ISIiNyQkIit5cWsxSSEiKCQiJiE+PyEiIjckJCIrQjMtMkkhIigkIiYrLSMhIiI3JCQiKyZbJVIySSEiKCQiJjUtIyEiIjckJCIraCFveCskISIoJCImPy0jISIiNyQkIitgOjkzSSEiKCQiJkktIyEiIjckJCIraFxeM0khIigkIiZTLSMhIiI3JCQiKyZHKSkpM0khIigkIiZdLSMhIiI3JCQiK0Q6RTRJISIoJCImZy0jISIiNyQkIipvTSc0SSEiJyQiJnEtIyEiIjckJCIrX3grNUkhIigkIiYhRz8hIiI3JCQiKnUhUTVJISInJCImIUg/ISIiNyQkIitYT3Y1SSEiKCQiJisuIyEiIjckJCIrbWs3NkkhIigkIiY1LiMhIiI3JCQiKy4jKlw2SSEiKCQiJj8uIyEiIjckJCIrZT0oPSwkISIoJCImSS4jISIiNyQkIitIV0M3SSEiKCQiJlMuIyEiIjckJCIrO3BoN0khIigkIiZdLiMhIiI3JCQiK0AkKilILCQhIigkIiZnLiMhIiI3JCQiK1Y7TzhJISIoJCImcS4jISIiNyQkIisjKVF0OEkhIigkIiYhUT8hIiI3JCQiK1JnNTlJISIoJCImIVI/ISIiNyQkIis3InlXLCQhIigkIiYrLyMhIiI3JCQiKy8sJlssJCEiKCQiJjUvIyEiIjckJCIrNz9BOkkhIigkIiY/LyMhIiI3JCQiK1JRZjpJISIoJCImSS8jISIiNyQkIiskZWxmLCQhIigkIiZTLyMhIiI3JCQiK1lzTDtJISIoJCImXS8jISIiNyQkIitFKTNuLCQhIigkIiZnLyMhIiI3JCQiK0MuMzxJISIoJCImcS8jISIiNyQkIitUPFg8SSEiKCQiJiFbPyEiIjckJCIrd0kjeSwkISIoJCImIVw/ISIiNyQkIitIVj49SSEiKCQiJiswIyEiIjckJCIrLGJjPUkhIigkIiY1MCMhIiI3JCQiKyNmTyo9SSEiKCQiJj8wIyEiIjckJCIrLHdJPkkhIigkIiZJMCMhIiI3JCQiK0gmeSc+SSEiKCQiJlMwIyEiIjckJCIrdyRcKy0kISIoJCImXTAjISIiNyQkIitVLFU/SSEiKCQiJmcwIyEiIjckJCIrRjN6P0khIigkIiZxMCMhIiI3JCQiK0s5O0BJISIoJCImIWU/ISIiNyQkIitjPmBASSEiKCQiJiFmPyEiIjckJCIrKlItPi0kISIoJCImKzEjISIiNyQkIitpRkZBSSEiKCQiJjUxIyEiIjckJCIrV0lrQUkhIigkIiY/MSMhIiI3JCQiK1lLLEJJISIoJCImSTEjISIiNyQkIitvTFFCSSEiKCQiJlMxIyEiIjckJCIqVGBQLSQhIickIiZdMSMhIiI3JCQiK3NMN0NJISIoJCImZzEjISIiNyQkIithS1xDSSEiKCQiJnExIyEiIjckJCIrZEknWy0kISIoJCImIW8/ISIiNyQkIip5S18tJCEiJyQiJiFwPyEiIjckJCIrQkNnREkhIigkIiYrMiMhIiI3JCQiKygpPihmLSQhIigkIiY1MiMhIiI3JCQiK3I5TUVJISIoJCImPzIjISIiNyQkIit3M3JFSSEiKCQiJkkyIyEiIjckJCIrLS0zRkkhIigkIiZTMiMhIiI3JCQiK1wlXHUtJCEiKCQiJl0yIyEiIjckJCIrPCc9eS0kISIoJCImZzIjISIiNyQkIisyeD1HSSEiKCQiJnEyIyEiIjckJCIrPG5iR0khIigkIiYheT8hIiI3JCQiK1xjIypHSSEiKCQiJiF6PyEiIjckJCIrLVhISEkhIigkIiYrMyMhIiI3JCQiK3hLbUhJISIoJCImNTMjISIiNyQkIit1Pi5JSSEiKCQiJj8zIyEiIjckJCIrI2YrLy4kISIoJCImSTMjISIiNyQkIitLInAyLiQhIigkIiZTMyMhIiI3JCQiKyVmUDYuJCEiKCQiJl0zIyEiIjckJCIreWZdSkkhIigkIiZnMyMhIiI3JCQiKyVHdT0uJCEiKCQiJnEzIyEiIjckJCIrOERDS0khIigkIiYhKTMjISIiNyQkIitrMWhLSSEiKCQiJiEqMyMhIiI3JCQiK1AoeUguJCEiKCQiJis0IyEiIjckJCIrTG5NTEkhIigkIiY1NCMhIiI3JCQiK19ZckxJISIoJCImPzQjISIiNyQkIiskXCMzTUkhIigkIiZJNCMhIiI3JCQiK2QtWE1JISIoJCImUzQjISIiNyQkIitXeiJbLiQhIigkIiZdNCMhIiI3JCQiK2FiPU5JISIoJCImZzQjISIiNyQkIisoM2BiLiQhIigkIiZxNCMhIiI3JCQiK1cwI2YuJCEiKCQiJiEpNCMhIiI3JCQiK0N6R09JISIoJCImISo0IyEiIjckJCIrRl9sT0khIigkIiYrNSMhIiI3JCQiK2FDLVBJISIoJCImNTUjISIiNyQkIisvJypRUEkhIigkIiY/NSMhIiI3JCQiK3ltdlBJISIoJCImSTUjISIiNyQkIit3TzdRSSEiKCQiJlM1IyEiIjckJCIrKWYhXFFJISIoJCImXTUjISIiNyQkIitXdSYpUUkhIigkIiZnNSMhIiI3JCQiKzlVQVJJISIoJCImcTUjISIiNyQkIis0NGZSSSEiKCQiJiEzQCEiIjckJCIrRnYmKlJJISIoJCImITRAISIiNyQkIioyQy4vJCEiJyQiJis2IyEiIjckJCIrUTBwU0khIigkIiY1NiMhIiI3JCQiKiRwMFRJISInJCImPzYjISIiNyQkIitaS1VUSSEiKCQiJkk2IyEiIjckJCIrKVsqeVRJISIoJCImUzYjISIiNyQkIitiYzpVSSEiKCQiJl02IyEiIjckJCIrWTxfVUkhIigkIiZnNiMhIiI3JCQiK2p4KUcvJCEiKCQiJnE2IyEiIjckJCIrMFBEVkkhIigkIiYhPUAhIiI3JCQiK3MmPk8vJCEiKCQiJiE+QCEiIjckJCIrbGApUi8kISIoJCImKzcjISIiNyQkIiskM15WLyQhIigkIiY1NyMhIiI3JCQiK0VucldJISIoJCImPzcjISIiNyQkIismSCMzWEkhIigkIiZJNyMhIiI3JCQiKnpaYS8kISInJCImUzcjISIiNyQkIis2SyJlLyQhIigkIiZdNyMhIiI3JCQiK2UmeWgvJCEiKCQiJmc3IyEiIjckJCIrSlFhWUkhIigkIiZxNyMhIiI3JCQiKi40cC8kISInJCImIUdAISIiNyQkIitiVEZaSSEiKCQiJiFIQCEiIjckJCIrMiNSdy8kISIoJCImKzgjISIiNyQkIismPS8hW0khIigkIiY1OCMhIiI3JCQiKjRwJFtJISInJCImPzgjISIiNyQkIitAUnRbSSEiKCQiJkk4IyEiIjckJCIreicpNFxJISIoJCImUzgjISIiNyQkIitrTFlcSSEiKCQiJl04IyEiIjckJCIrd3ojKVxJISIoJCImZzgjISIiNyQkIis5RD5dSSEiKCQiJnE4IyEiIjckJCIqKXBiXUkhIickIiYhUUAhIiI3JCQiK3Q4IzQwJCEiKCQiJiFSQCEiIjckJCIrJXAmR15JISIoJCImKzkjISIiNyQkIitUKlw7MCQhIigkIiY1OSMhIiI3JCQiKzxULF9JISIoJCImPzkjISIiNyQkIipBeUIwJCEiJyQiJkk5IyEiIjckJCIqRFVGMCQhIickIiZTOSMhIiI3JCQiKzNpNWBJISIoJCImXTkjISIiNyQkIismNHFNMCQhIigkIiZnOSMhIiI3JCQiKzRSJFEwJCEiKCQiJnE5IyEiIjckJCIrXnc+YUkhIigkIiYhW0AhIiI3JCQiK0A4Y2FJISIoJCImIVxAISIiNyQkIiojXCNcMCQhIickIiYrOiMhIiI3JCQiK1olKUdiSSEiKCQiJjU6IyEiIjckJCIrLT5sYkkhIigkIiY/OiMhIiI3JCQiKydHOmcwJCEiKCQiJkk6IyEiIjckJCIrKmZ5ajAkISIoJCImUzojISIiNyQkIiolPXVjSSEiJyQiJl06IyEiIjckJCIqLDByMCQhIickIiZnOiMhIiI3JCQiKzQib3UwJCEiKCQiJnE6IyEiIjckJCIrUDYkeTAkISIoJCImIWVAISIiNyQkIismNCU+ZUkhIigkIiYhZkAhIiI3JCQiKyIpcGJlSSEiKCQiJis7IyEiIjckJCIrJ3o+KmVJISIoJCImNTsjISIiNyQkIitUREdmSSEiKCQiJj87IyEiIjckJCIrO19rZkkhIigkIiZJOyMhIiI3JCQiKiN5K2dJISInJCImUzsjISIiNyQkIithLlBnSSEiKCQiJl07IyEiIjckJCIrPEd0Z0khIigkIiZnOyMhIiI3JCQiKkAmNGhJISInJCImcTsjISIiNyQkIitNdlhoSSEiKCQiJiFvQCEiIjckJCIrKHk+PTEkISIoJCImIXBAISIiNyQkIiooPj1pSSEiJyQiJis8IyEiIjckJCIrJTNXRDEkISIoJCImNTwjISIiNyQkIitHaCFIMSQhIigkIiY/PCMhIiI3JCQiKy0ib0sxJCEiKCQiJkk8IyEiIjckJCIrMitqakkhIigkIiZTPCMhIiI3JCQiK1U9KlIxJCEiKCQiJl08IyEiIjckJCIrNE9Oa0khIigkIiZnPCMhIiI3JCQiKzBgcmtJISIoJCImcTwjISIiNyQkIitMcDJsSSEiKCQiJiF5QCEiIjckJCIrI1xRYTEkISIoJCImIXpAISIiNyQkIisjKSoqemxJISIoJCImKz0jISIiNyQkIisuOTttSSEiKCQiJjU9IyEiIjckJCIrYkZfbUkhIigkIiY/PSMhIiI3JCQiK1FTKW8xJCEiKCQiJkk9IyEiIjckJCIrYF9DbkkhIigkIiZTPSMhIiI3JCQiKWtnbkkhIiYkIiZdPSMhIiI3JCQiK3l1J3oxJCEiKCQiJmc9IyEiIjckJCIrKVtHJG9JISIoJCImcT0jISIiNyQkIitIJSpvb0khIigkIiYhKT0jISIiNyQkIisuLjBwSSEiKCQiJiEqPSMhIiI3JCQiKzM2VHBJISIoJCImKz4jISIiNyQkIitZPXhwSSEiKCQiJjU+IyEiIjckJCIrOkQ4cUkhIigkIiY/PiMhIiI3JCQiKzxKXHFJISIoJCImST4jISIiNyQkIiteTyYzMiQhIigkIiZTPiMhIiI3JCQiKz1UQHJJISIoJCImXT4jISIiNyQkIis8WGRySSEiKCQiJmc+IyEiIjckJCIrXFskPjIkISIoJCImcT4jISIiNyQkIis5XkhzSSEiKCQiJiEpPiMhIiI3JCQiKzZgbHNJISIoJCImISo+IyEiIjckJCIrVGEsdEkhIigkIiYrPyMhIiI3JCQiKzBiUHRJISIoJCImNT8jISIiNyQkIissYnR0SSEiKCQiJj8/IyEiIjckJCIrSmE0dUkhIigkIiZJPyMhIiI3JCQiKyRIYlcyJCEiKCQiJlM/IyEiIjckJCIrKjM6WzIkISIoJCImXT8jISIiNyQkIis+Wzx2SSEiKCQiJmc/IyEiIjckJCIrI1tNYjIkISIoJCImcT8jISIiNyQkIit6UyplMiQhIigkIiYhM0EhIiI3JCQiKzRPRHdJISIoJCImITRBISIiNyQkIit0SWh3SSEiKCQiJitAIyEiIjckJCIrc0MocDIkISIoJCImNUAjISIiNyQkIisvPUx4SSEiKCQiJj9AIyEiIjckJCIqMiJweEkhIickIiZJQCMhIiI3JCQiKkZdIXlJISInJCImU0AjISIiNyQkIiswJTQleUkhIigkIiZdQCMhIiI3JCQiK3Ulbyh5SSEiKCQiJmdAIyEiIjckJCIreHU3ekkhIigkIiZxQCMhIiI3JCQiKzprW3pJISIoJCImIT1BISIiNyQkIispR1gpekkhIigkIiYhPkEhIiI3JCQiKyY0Ly0zJCEiKCQiJitBIyEiIjckJCIrUEdjITMkISIoJCImNUEjISIiNyQkIis5OiM0MyQhIigkIiY/QSMhIiI3JCQiK0UsRyIzJCEiKCQiJklBIyEiIjckJCIrdCdROzMkISIoJCImU0EjISIiNyQkIiticio+MyQhIigkIiZdQSMhIiI3JCQiK3RiTiMzJCEiKCQiJmdBIyEiIjckJCIrRVJyIzMkISIoJCImcUEjISIiNyQkIis5QTIkMyQhIigkIiYhR0EhIiI3JCQiK1EvViQzJCEiKCQiJiFIQSEiIjckJCIrKGYpeSQzJCEiKCQiJitCIyEiIjckJCIrI3BZVDMkISIoJCImNUIjISIiNyQkIitCWl0lMyQhIigkIiY/QiMhIiI3JCQiKypvaVszJCEiKCQiJklCIyEiIjckJCIrI2Y/XzMkISIoJCImU0IjISIiNyQkIitKJXliMyQhIigkIiZdQiMhIiI3JCQiKzFpJGYzJCEiKCQiJmdCIyEiIjckJCIrPFJIJzMkISIoJCImcUIjISIiNyQkIitrOmwnMyQhIigkIiYhUUEhIiI3JCQiK1siNHEzJCEiKCQiJiFSQSEiIjckJCIrcG1PKDMkISIoJCImK0MjISIiNyQkIitFVHMoMyQhIigkIiY1QyMhIiI3JCQiKz46MykzJCEiKCQiJj9DIyEiIjckJCIqJilRJSkzJCEiJyQiJklDIyEiIjckJCIrPGh6KTMkISIoJCImU0MjISIiNyQkIitBTDoqMyQhIigkIiZdQyMhIiI3JCQiK2ovXiozJCEiKCQiJmdDIyEiIjckJCIrVHYnKSozJCEiKCQiJnFDIyEiIjckJCIrZFhBITQkISIoJCImIVtBISIiNyQkIipeImUhNCQhIickIiYhXEEhIiI3JCQiKSVRNDQkISImJCImK0QjISIiNyQkIitHX0giNCQhIigkIiY1RCMhIiI3JCQiKyUqPmwiNCQhIigkIiY/RCMhIiI3JCQiKyhwMz80JCEiKCQiJklEIyEiIjckJCIrUWBPIzQkISIoJCImU0QjISIiNyQkIis7PnMjNCQhIigkIiZdRCMhIiI3JCQiK0wleUk0JCEiKCQiJmdEIyEiIjckJCIrKClbViQ0JCEiKCQiJnFEIyEiIjckJCIqRyJ6JDQkISInJCImIWVBISIiNyQkIis2dzklNCQhIigkIiYhZkEhIiI3JCQiKilRXSU0JCEiJyQiJitFIyEiIjckJCIrKTNnWzQkISIoJCImNUUjISIiNyQkIitNaUAmNCQhIigkIiY/RSMhIiI3JCQiKz5CZCY0JCEiKCQiJklFIyEiIjckJCIrVSRHZjQkISIoJCImU0UjISIiNyQkIisvVkcnNCQhIigkIiZdRSMhIiI3JCQiKzAtayc0JCEiKCQiJmdFIyEiIjckJCIrV2cqcDQkISIoJCImcUUjISIiNyQkIitCPU4oNCQhIigkIiYhb0EhIiI3JCQiK1R2cSg0JCEiKCQiJiFwQSEiIjckJCIrKT5qISk0JCEiKCQiJitGIyEiIjckJCIrJXo9JSk0JCEiKCQiJjVGIyEiIjckJCIrSFZ4KTQkISIoJCImP0YjISIiNyQkIisvKUgiKjQkISIoJCImSUYjISIiNyQkIis9X1sqNCQhIigkIiZTRiMhIiI3JCQiK3QwJSkqNCQhIigkIiZdRiMhIiI3JCQiK21lPitKISIoJCImZ0YjISIiNyQkIik2YitKISImJCImcUYjISIiNyQkIit0aSE0NSQhIigkIiYheUEhIiI3JCQiKydRaDc1JCEiKCQiJiF6QSEiIjckJCIqVzs7NSQhIickIiYrRyMhIiI3JCQiK0w5KD41JCEiKCQiJjVHIyEiIjckJCIrbmpLLUohIigkIiY/RyMhIiI3JCQiK1Q3by1KISIoJCImSUcjISIiNyQkIitiZy4uSiEiKCQiJlNHIyEiIjckJCIqIjNSLkohIickIiZdRyMhIiI3JCQiKzFidS5KISIoJCImZ0cjISIiNyQkIitVLDUvSiEiKCQiJnFHIyEiIjckJCIrPlpYL0ohIigkIiYhKUcjISIiNyQkIitPIzRbNSQhIigkIiYhKkcjISIiNyQkIismcGpeNSQhIigkIiYrSCMhIiI3JCQiKyU0PWI1JCEiKCQiJjVIIyEiIjckJCIrTkMoZTUkISIoJCImP0gjISIiNyQkIis8bkExSiEiKCQiJklIIyEiIjckJCIqJTRlMUohIickIiZTSCMhIiI3JCQiKy9eJHA1JCEiKCQiJl1IIyEiIjckJCIqQCpHMkohIickIiZnSCMhIiI3JCQiK2VLazJKISIoJCImcUgjISIiNyQkIitacyp6NSQhIigkIiYhKUgjISIiNyQkIit4Nk4zSiEiKCQiJiEqSCMhIiI3JCQiKjAwKDNKISInJCImK0kjISIiNyQkIitrKWUhNEohIigkIiY1SSMhIiI3JCQiKmk3JTRKISInJCImP0kjISIiNyQkIis+anc0SiEiKCQiJklJIyEiIjckJCIrZio+LDYkISIoJCImU0kjISIiNyQkIitVTlo1SiEiKCQiJl1JIyEiIjckJCIrbnEjMzYkISIoJCImZ0kjISIiNyQkIitNMD02SiEiKCQiJnFJIyEiIjckJCIrV1JgNkohIigkIiYhM0IhIiI3JCQiKyhIKCk9NiQhIigkIiYhNEIhIiI3JCQiKyNmU0E2JCEiKCQiJitKIyEiIjckJCIrSFFmN0ohIigkIiY1SiMhIiI3JCQiKixaSDYkISInJCImP0ojISIiNyQkIitNLEk4SiEiKCQiJklKIyEiIjckJCIpS2w4SiEiJiQiJlNKIyEiIjckJCIqQDFTNiQhIickIiZdSiMhIiI3JCQiK2kiZlY2JCEiKCQiJmdKIyEiIjckJCIrZT9yOUohIigkIiZxSiMhIiI3JCQiKykqWzE6SiEiKCQiJiE9QiEiIjckJCIrIm88YTYkISIoJCImIT5CISIiNyQkIisyL3g6SiEiKCQiJitLIyEiIjckJCIreEk3O0ohIigkIiY1SyMhIiI3JCQiKnB2azYkISInJCImP0sjISIiNyQkIitbI0dvNiQhIigkIiZJSyMhIiI3JCQiK1wyPTxKISIoJCImU0sjISIiNyQkIislPkx2NiQhIigkIiZdSyMhIiI3JCQiKyRlJil5NiQhIigkIiZnSyMhIiI3JCQiKzt6Qj1KISIoJCImcUsjISIiNyQkIislPiFmPUohIigkIiYhR0IhIiI3JCQiKzpDJSo9SiEiKCQiJiFIQiEiIjckJCIrI2UlSD5KISIoJCImK0wjISIiNyQkIisjcFknPkohIigkIiY1TCMhIiI3JCQiK1ooKSoqPkohIigkIiY/TCMhIiI3JCQiK1oyTj9KISIoJCImSUwjISIiNyQkIisicC0yNyQhIigkIiZTTCMhIiI3JCQiKyJlYTU3JCEiKCQiJl1MIyEiIjckJCIrOmtTQEohIigkIiZnTCMhIiI3JCQiKyU+ZTw3JCEiKCQiJnFMIyEiIjckJCIrPSo0QDckISIoJCImIVFCISIiNyQkIisoZWhDNyQhIigkIiYhUkIhIiI3JCQiKy1LIkc3JCEiKCQiJitNIyEiIjckJCIraFo7QkohIigkIiY1TSMhIiI3JCQiK25pXkJKISIoJCImP00jISIiNyQkIis8eCdRNyQhIigkIiZJTSMhIiI3JCQiKzgiPlU3JCEiKCQiJlNNIyEiIjckJCIrYi9kQ0ohIigkIiZdTSMhIiI3JCQiK1Y8I1w3JCEiKCQiJmdNIyEiIjckJCIrd0hGREohIigkIiZxTSMhIiI3JCQiK2NUaURKISIoJCImIVtCISIiNyQkIisiR3ZmNyQhIigkIiYhXEIhIiI3JCQiK19qS0VKISIoJCImK04jISIiNyQkIipQeG03JCEiJyQiJjVOIyEiIjckJCIrTSRHcTckISIoJCImP04jISIiNyQkIitXI3p0NyQhIigkIiZJTiMhIiI3JCQiKSx0RkohIiYkIiZTTiMhIiI3JCQiKy80M0dKISIoJCImXU4jISIiNyQkIitgO1ZHSiEiKCQiJmdOIyEiIjckJCIrXEJ5R0ohIigkIiZxTiMhIiI3JCQiKyQqSDhISiEiKCQiJiFlQiEiIjckJCIrI2UkW0hKISIoJCImIWZCISIiNyQkIis+VCQpSEohIigkIiYrTyMhIiI3JCQiKy5ZPUlKISIoJCImNU8jISIiNyQkIitNXWBJSiEiKCQiJj9PIyEiIjckJCIrN2EpMzgkISIoJCImSU8jISIiNyQkIitRZEJKSiEiKCQiJlNPIyEiIjckJCIqLCdlSkohIickIiZdTyMhIiI3JCQiKkJPPjgkISInJCImZ08jISIiNyQkIispUidHS0ohIigkIiZxTyMhIiI3JCQiKzhsaktKISIoJCImIW9CISIiNyQkIit3bClIOCQhIigkIiYhcEIhIiI3JCQiKyhlT0w4JCEiKCQiJitQIyEiIjckJCIrWWxvTEohIigkIiY1UCMhIiI3JCQiK19rLk1KISIoJCImP1AjISIiNyQkIisyalFNSiEiKCQiJklQIyEiIjckJCIqNk9aOCQhIickIiZTUCMhIiI3JCQiK2hlM05KISIoJCImXVAjISIiNyQkIipjTmE4JCEiJyQiJmdQIyEiIjckJCIrMl95TkohIigkIiZxUCMhIiI3JCQiKy5bOE9KISIoJCImIXlCISIiNyQkIitbVltPSiEiKCQiJiF6QiEiIjckJCIrVFEkbzgkISIoJCImK1EjISIiNyQkIiskRyQ9UEohIigkIiY1USMhIiI3JCQiK3RFYFBKISIoJCImP1EjISIiNyQkIis4Pyl5OCQhIigkIiZJUSMhIiI3JCQiKyw4QlFKISIoJCImU1EjISIiNyQkIitSMGVRSiEiKCQiJl1RIyEiIjckJCIrRChIKlFKISIoJCImZ1EjISIiNyQkIitoKXkjUkohIigkIiZxUSMhIiI3JCQiK1l6aVJKISIoJCImISlRIyEiIjckJCIrIilwKCpSSiEiKCQiJiEqUSMhIiI3JCQiK2xmS1NKISIoJCImK1IjISIiNyQkIispKltuU0ohIigkIiY1UiMhIiI3JCQiKyN5QjU5JCEiKCQiJj9SIyEiIjckJCIrOUVQVEohIigkIiZJUiMhIiI3JCQiKyhSQDw5JCEiKCQiJlNSIyEiIjckJCIqOHE/OSQhIickIiZdUiMhIiI3JCQiKzcpPUM5JCEiKCQiJmdSIyEiIjckJCIrWHV3VUohIigkIiZxUiMhIiI3JCQiK0ZnNlZKISIoJCImISlSIyEiIjckJCIqY2tNOSQhIickIiYhKlIjISIiNyQkIitWSSJROSQhIigkIiYrUyMhIiI3JCQiK3g5O1dKISIoJCImNVMjISIiNyQkIitoKTRYOSQhIigkIiY/UyMhIiI3JCQiKyc+ZVs5JCEiKCQiJklTIyEiIjckJCIrIlsxXzkkISIoJCImU1MjISIiNyQkIis8WmJYSiEiKCQiJl1TIyEiIjckJCIrL0ghZjkkISIoJCImZ1MjISIiNyQkIitUNURZSiEiKCQiJnFTIyEiIjckJCIqOCpmWUohIickIiYhM0MhIiI3JCQiKjxacDkkISInJCImITRDISIiNyQkIitoXkhaSiEiKCQiJitUIyEiIjckJCIrLkprWkohIigkIiY1VCMhIiI3JCQiKycqNCp6OSQhIigkIiY/VCMhIiI3JCQiK1QpUSRbSiEiKCQiJklUIyEiIjckJCIrUG1vW0ohIigkIiZTVCMhIiI3JCQiKyZRTSFcSiEiKCQiJl1UIyEiIjckJCIrJjMjUVxKISIoJCImZ1QjISIiNyQkIitPKEgoXEohIigkIiZxVCMhIiI3JCQiK1J0Ml1KISIoJCImIT1DISIiNyQkIislKltVXUohIigkIiYhPkMhIiI3JCQiKyxDeF1KISIoJCImK1UjISIiNyQkIionKT42OiQhIickIiY1VSMhIiI3JCQiK3JzWV5KISIoJCImP1UjISIiNyQkIitNWSI9OiQhIigkIiZJVSMhIiI3JCQiKiY+O19KISInJCImU1UjISIiNyQkIis9IzREOiQhIigkIiZdVSMhIiI3JCQiK1FrJkc6JCEiKCQiJmdVIyEiIjckJCIrNk8/YEohIigkIiZxVSMhIiI3JCQiK1AyYmBKISIoJCImIUdDISIiNyQkIis7eSpROiQhIigkIiYhSEMhIiI3JCQiK1pbQ2FKISIoJCImK1YjISIiNyQkIitKPWZhSiEiKCQiJjVWIyEiIjckJCIrbyhRXDokISIoJCImP1YjISIiNyQkIitmY0diSiEiKCQiJklWIyEiIjckJCIrLURqYkohIigkIiZTViMhIiI3JCQiKypIemY6JCEiKCQiJl1WIyEiIjckJCIrXGdLY0ohIigkIiZnViMhIiI3JCQiK19GbmNKISIoJCImcVYjISIiNyQkIis0JT5xOiQhIigkIiYhUUMhIiI3JCQiKi1tdDokISInJCImIVJDISIiNyQkIislZTd4OiQhIigkIiYrVyMhIiI3JCQiKywiZiFlSiEiKCQiJjVXIyEiIjckJCIrdGJTZUohIigkIiY/VyMhIiI3JCQiKyoqPnZlSiEiKCQiJklXIyEiIjckJCIreSQpNGZKISIoJCImU1cjISIiNyQkIis3WldmSiEiKCQiJl1XIyEiIjckJCIoInpmSiEiJSQiJmdXIyEiIjckJCIrVXM4Z0ohIigkIiZxVyMhIiI3JCQiK1FNW2dKISIoJCImIVtDISIiNyQkIisqZUgzOyQhIigkIiYhXEMhIiI3JCQiKyVwdjY7JCEiKCQiJitYIyEiIjckJCIrYTxfaEohIigkIiY1WCMhIiI3JCQiK294Jz07JCEiKCQiJj9YIyEiIjckJCIrUVBAaUohIigkIiZJWCMhIiI3JCQiK2knZkQ7JCEiKCQiJlNYIyEiIjckJCIrVGIhSDskISIoJCImXVgjISIiNyQkIit1OERqSiEiKCQiJmdYIyEiIjckJCIranJmakohIigkIiZxWCMhIiI3JCQiKzNIJVI7JCEiKCQiJiFlQyEiIjckJCIrMicpR2tKISIoJCImIWZDISIiNyQkIitpVWprSiEiKCQiJitZIyEiIjckJCIrcyl6XDskISIoJCImNVkjISIiNyQkIitQYUtsSiEiKCQiJj9ZIyEiIjckJCIrZjRubEohIigkIiZJWSMhIiI3JCQiK09rLG1KISIoJCImU1kjISIiNyQkIitvPU9tSiEiKCQiJl1ZIyEiIjckJCIrZHNxbUohIigkIiZnWSMhIiI3JCQiKyxFMG5KISIoJCImcVkjISIiNyQkIisselJuSiEiKCQiJiFvQyEiIjckJCIrZUp1bkohIigkIiYhcEMhIiI3JCQiKlApM29KISInJCImK1ojISIiNyQkIitSTlZvSiEiKCQiJjVaIyEiIjckJCIrayd5KG9KISIoJCImP1ojISIiNyQkIitZUDdwSiEiKCQiJklaIyEiIjckJCIrJXlvJXBKISIoJCImU1ojISIiNyQkIit5UCIpcEohIigkIiZdWiMhIiI3JCQiKnRlLDwkISInJCImZ1ojISIiNyQkIitRT11xSiEiKCQiJnFaIyEiIjckJCIrLSZbMzwkISIoJCImIXlDISIiNyQkIitDTD5ySiEiKCQiJiF6QyEiIjckJCIrLiJROjwkISIoJCImK1sjISIiNyQkIitSRyk9PCQhIigkIiY1WyMhIiI3JCQiK0t2QXNKISIoJCImP1sjISIiNyQkIisjPXNEPCQhIigkIiZJWyMhIiI3JCQiKyp5O0g8JCEiKCQiJlNbIyEiIjckJCIrYThFdEohIigkIiZdWyMhIiI3JCQiK3hlZ3RKISIoJCImZ1sjISIiNyQkIitkLiZSPCQhIigkIiZxWyMhIiI3JCQiKyV6JUh1SiEiKCQiJiEpWyMhIiI3JCQiKj5SWTwkISInJCImISpbIyEiIjckJCIrVk4pXDwkISIoJCImK1wjISIiNyQkIitheUt2SiEiKCQiJjVcIyEiIjckJCIrQkBudkohIigkIiY/XCMhIiI3JCQiK15qLHdKISIoJCImSVwjISIiNyQkIitPME93SiEiKCQiJlNcIyEiIjckJCIqby9uPCQhIickIiZdXCMhIiI3JCQiKyN5W3E8JCEiKCQiJmdcIyEiIjckJCIrVUdSeEohIigkIiZxXCMhIiI3JCQiK2hvdHhKISIoJCImISlcIyEiIjckJCIrUTMzeUohIigkIiYhKlwjISIiNyQkIit1WlV5SiEiKCQiJitdIyEiIjckJCIrcCdvKHlKISIoJCImNV0jISIiNyQkIitCRDZ6SiEiKCQiJj9dIyEiIjckJCIrTmpYekohIigkIiZJXSMhIiI3JCQiKzIsISl6SiEiKCQiJlNdIyEiIjckJCIrUVE5IT0kISIoJCImXV0jISIiNyQkIitGdlshPSQhIigkIiZnXSMhIiI3JCQiK3c2JDM9JCEiKCQiJnFdIyEiIjckJCIrJnl1Nj0kISIoJCImITNEISIiNyQkIitgJD06PSQhIigkIiYhNEQhIiI3JCQiKik9Jz09JCEiJyQiJiteIyEiIjckJCIrbmA/Iz0kISIoJCImNV4jISIiNyQkIis4KVtEPSQhIigkIiY/XiMhIiI3JCQiKkEjKkc9JCEiJyQiJkleIyEiIjckJCIrJ2VOSz0kISIoJCImU14jISIiNyQkIis3KnlOPSQhIigkIiZdXiMhIiI3JCQiKyk+QVI9JCEiKCQiJmdeIyEiIjckJCIrV2FFJT0kISIoJCImcV4jISIiNyQkIipsM1k9JCEiJyQiJiE9RCEiIjckJCIrPD0mXD0kISIoJCImIT5EISIiNyQkIitWXEgmPSQhIigkIiYrXyMhIiI3JCQiK0ohUWM9JCEiKCQiJjVfIyEiIjckJCIreTUpZj0kISIoJCImP18jISIiNyQkIisoM0NqPSQhIigkIiZJXyMhIiI3JCQiK2NxbSc9JCEiKCQiJlNfIyEiIjckJCIrJykqNHE9JCEiKCQiJl1fIyEiIjckJCIrd0dOKD0kISIoJCImZ18jISIiNyQkIitHZHAoPSQhIigkIiZxXyMhIiI3JCQiKmFRISk9JCEiJyQiJiFHRCEiIjckJCIrOThRKT0kISIoJCImIUhEISIiNyQkIitbU3MpPSQhIigkIiYrYCMhIiI3JCQiK1duMSo9JCEiKCQiJjVgIyEiIjckJCIrLSU0JSo9JCEiKCQiJj9gIyEiIjckJCIrQD92Kj0kISIoJCImSWAjISIiNyQkIissWTQhPiQhIigkIiZTYCMhIiI3JCQiK1ZyViE+JCEiKCQiJl1gIyEiIjckJCIrWSd6Mj4kISIoJCImZ2AjISIiNyQkIis2QDciPiQhIigkIiZxYCMhIiI3JCQiK1JYWSI+JCEiKCQiJiFRRCEiIjckJCIrR3AhPT4kISIoJCImIVJEISIiNyQkIit6I1xAPiQhIigkIiYrYSMhIiI3JCQiKyNmIlwjPiQhIigkIiY1YSMhIiI3JCQiK25RJEc+JCEiKCQiJj9hIyEiIjckJCIrMGg8JD4kISIoJCImSWEjISIiNyQkIisvJD1OPiQhIigkIiZTYSMhIiI3JCQiK24vJ1E+JCEiKCQiJl1hIyEiIjckJCIrI2YtVT4kISIoJCImZ2EjISIiNyQkIit6WWElPiQhIigkIiZxYSMhIiI3JCQiK0huKVs+JCEiKCQiJiFbRCEiIjckJCIrVShHXz4kISIoJCImIVxEISIiNyQkIis9MmQmPiQhIigkIiYrYiMhIiI3JCQiK2NFImY+JCEiKCQiJjViIyEiIjckJCIrZVhEJz4kISIoJCImP2IjISIiNyQkIitCa2YnPiQhIigkIiZJYiMhIiI3JCQiK14jUXA+JCEiKCQiJlNiIyEiIjckJCIrVStHKD4kISIoJCImXWIjISIiNyQkIisnekB3PiQhIigkIiZnYiMhIiI3JCQiKzlOJ3o+JCEiKCQiJnFiIyEiIjckJCIrJz4wJCk+JCEiKCQiJiFlRCEiIjckJCIrVG9rKT4kISIoJCImIWZEISIiNyQkIitcJSkpKik+JCEiKCQiJitjIyEiIjckJCIrQStMKj4kISIoJCImNWMjISIiNyQkIitlOm4qPiQhIigkIiY/YyMhIiI3JCQiK2ZJLCtLISIoJCImSWMjISIiNyQkIitCWE4rSyEiKCQiJlNjIyEiIjckJCIrXmZwK0shIigkIiZdYyMhIiI3JCQiK1d0LixLISIoJCImZ2MjISIiNyQkIissKHk4PyQhIigkIiZxYyMhIiI3JCQiK0ErcyxLISIoJCImIW9EISIiNyQkIiszODEtSyEiKCQiJiFwRCEiIjckJCIrZURTLUshIigkIiYrZCMhIiI3JCQiK3RQdS1LISIoJCImNWQjISIiNyQkIitfXDMuSyEiKCQiJj9kIyEiIjckJCIrKDRFTT8kISIoJCImSWQjISIiNyQkIisxc3cuSyEiKCQiJlNkIyEiIjckJCIqRzNUPyQhIickIiZdZCMhIiI3JCQiKz4kXFc/JCEiKCQiJmdkIyEiIjckJCIrQi56L0shIigkIiZxZCMhIiI3JCQiKyRISl4/JCEiKCQiJiF5RCEiIjckJCIrR0FaMEshIigkIiYhekQhIiI3JCQiK0dKImU/JCEiKCQiJitlIyEiIjckJCIrJCpSOjFLISIoJCImNWUjISIiNyQkIitDW1wxSyEiKCQiJj9lIyEiIjckJCIrQGMkbz8kISIoJCImSWUjISIiNyQkIislUXdyPyQhIigkIiZTZSMhIiI3JCQiKzdyXjJLISIoJCImXWUjISIiNyQkIisxeSZ5PyQhIigkIiZnZSMhIiI3JCQiK20lKT4zSyEiKCQiJnFlIyEiIjckJCIrIzRSJjNLISIoJCImISllIyEiIjckJCIrJm96KTNLISIoJCImISplIyEiIjckJCIrVi1BNEshIigkIiYrZiMhIiI3JCQiK28yYzRLISIoJCImNWYjISIiNyQkIitmNyEqNEshIigkIiY/ZiMhIiI3JCQiKzw8QzVLISIoJCImSWYjISIiNyQkIitUQGU1SyEiKCQiJlNmIyEiIjckJCIrS0QjNEAkISIoJCImXWYjISIiNyQkIisqKUdFNkshIigkIiZnZiMhIiI3JCQiKzlLZzZLISIoJCImcWYjISIiNyQkIiswTiU+QCQhIigkIiYhKWYjISIiNyQkIitqUEc3SyEiKCQiJiEqZiMhIiI3JCQiKyopUmk3SyEiKCQiJitnIyEiIjckJCIrIj1rSEAkISIoJCImNWcjISIiNyQkIitUVkk4SyEiKCQiJj9nIyEiIjckJCIrb1drOEshIigkIiZJZyMhIiI3JCQiK2lYKVJAJCEiKCQiJlNnIyEiIjckJCIrQ1lLOUshIigkIiZdZyMhIiI3JCQiK2FZbTlLISIoJCImZ2cjISIiNyQkIiteWSs6SyEiKCQiJnFnIyEiIjckJCIrO1lNOkshIigkIiYhM0UhIiI3JCQiK1xYbzpLISIoJCImITRFISIiNyQkIitcVy07SyEiKCQiJitoIyEiIjckJCIrPVZPO0shIigkIiY1aCMhIiI3JCQiK2JUcTtLISIoJCImP2gjISIiNyQkIionUi88SyEiJyQiJkloIyEiIjckJCIrTFBRPEshIigkIiZTaCMhIiI3JCQiK3VNczxLISIoJCImXWgjISIiNyQkIislPWohPUshIigkIiZnaCMhIiI3JCQiK2pHUz1LISIoJCImcWgjISIiNyQkIipeVSg9SyEiJyQiJiE9RSEiIjckJCIrRUAzPkshIigkIiYhPkUhIiI3JCQiKnJAJT5LISInJCImK2kjISIiNyQkIitrN3c+SyEiKCQiJjVpIyEiIjckJCIrJ3krLEEkISIoJCImP2kjISIiNyQkIit5LVc/SyEiKCQiJklpIyEiIjckJCIrUSh6MkEkISIoJCImU2kjISIiNyQkIitvIj42QSQhIigkIiZdaSMhIiI3JCQiK24mZTlBJCEiKCQiJmdpIyEiIjckJCIrTnp6QEshIigkIiZxaSMhIiI3JCQiK3RzOEFLISIoJCImIUdFISIiNyQkIipld0NBJCEiJyQiJiFIRSEiIjckJCIrZGUiR0EkISIoJCImK2ojISIiNyQkIisvXjpCSyEiKCQiJjVqIyEiIjckJCIrQFZcQkshIigkIiY/aiMhIiI3JCQiKzJOJFFBJCEiKCQiJklqIyEiIjckJCIra0U8Q0shIigkIiZTaiMhIiI3JCQiKno2WEEkISInJCImXWojISIiNyQkIisoKTMmW0EkISIoJCImZ2ojISIiNyQkIitgKio9REshIigkIiZxaiMhIiI3JCQiKyIqKkdiQSQhIigkIiYhUUUhIiI3JCQiKykqeidlQSQhIigkIiYhUkUhIiI3JCQiK3dwP0VLISIoJCImK2sjISIiNyQkIitEZmFFSyEiKCQiJjVrIyEiIjckJCIrV1spb0EkISIoJCImP2sjISIiNyQkIitNUEFGSyEiKCQiJklrIyEiIjckJCIrJmZpdkEkISIoJCImU2sjISIiNyQkIitGOSF6QSQhIigkIiZdayMhIiI3JCQiKkJTI0dLISInJCImZ2sjISIiNyQkIisvIXomR0shIigkIiZxayMhIiI3JCQiK1x4IipHSyEiKCQiJiFbRSEiIjckJCIrbWtESEshIigkIiYhXEUhIiI3JCQiK2BeZkhLISIoJCImK2wjISIiNyQkIis4USQqSEshIigkIiY1bCMhIiI3JCQiK1ZDRklLISIoJCImP2wjISIiNyQkIitZNWhJSyEiKCQiJklsIyEiIjckJCIqaVw0QiQhIickIiZTbCMhIiI3JCQiK20iKUdKSyEiKCQiJl1sIyEiIjckJCIrJW9FO0IkISIoJCImZ2wjISIiNyQkIit0Xic+QiQhIigkIiZxbCMhIiI3JCQiK05PSUtLISIoJCImIWVFISIiNyQkIitwP2tLSyEiKCQiJiFmRSEiIjckJCIrdi8pSEIkISIoJCImK20jISIiNyQkIithKT1MQiQhIigkIiY1bSMhIiI3JCQiKzBzbExLISIoJCImP20jISIiNyQkIitHYipSQiQhIigkIiZJbSMhIiI3JCQiK0NRTE1LISIoJCImU20jISIiNyQkIiskNHNZQiQhIigkIiZdbSMhIiI3JCQiK00uLE5LISIoJCImZ20jISIiNyQkIitbJltgQiQhIigkIiZxbSMhIiI3JCQiK05ub05LISIoJCImIW9FISIiNyQkIisnKlstT0shIigkIiYhcEUhIiI3JCQiK0hJT09LISIoJCImK24jISIiNyQkIitONnFPSyEiKCQiJjVuIyEiIjckJCIrOiNScUIkISIoJCImP24jISIiNyQkIitvc1BQSyEiKCQiJkluIyEiIjckJCIrJkg6eEIkISIoJCImU24jISIiNyQkIismSGAhUUshIigkIiZdbiMhIiI3JCQiK3A3UlFLISIoJCImZ24jISIiNyQkIis7I0goUUshIigkIiZxbiMhIiI3JCQiK1ByMVJLISIoJCImIXlFISIiNyQkIitMXVNSSyEiKCQiJiF6RSEiIjckJCIrLUh1UkshIigkIiYrbyMhIiI3JCQiK1gyM1NLISIoJCImNW8jISIiNyQkIitpJj0vQyQhIigkIiY/byMhIiI3JCQiK2FqdlNLISIoJCImSW8jISIiNyQkIio3JTRUSyEiJyQiJlNvIyEiIjckJCIqJz1WVEshIickIiZdbyMhIiI3JCQiK3YmcDxDJCEiKCQiJmdvIyEiIjckJCIrbHM1VUshIigkIiZxbyMhIiI3JCQiK0hcV1VLISIoJCImISlvIyEiIjckJCIrb0R5VUshIigkIiYhKm8jISIiNyQkIisjPT9KQyQhIigkIiYrcCMhIiI3JCQiK3J4WFZLISIoJCImNXAjISIiNyQkIitOYHpWSyEiKCQiJj9wIyEiIjckJCIrdUc4V0shIigkIiZJcCMhIiI3JCQiKylRcVdDJCEiKCQiJlNwIyEiIjckJCIreHkhW0MkISIoJCImXXAjISIiNyQkIitVYDlYSyEiKCQiJmdwIyEiIjckJCIrJHkjW1hLISIoJCImcXAjISIiNyQkIisqPj9lQyQhIigkIiYhKXAjISIiNyQkIisiZmRoQyQhIigkIiYhKnAjISIiNyQkIitlXFxZSyEiKCQiJitxIyEiIjckJCIrLEIkb0MkISIoJCImNXEjISIiNyQkIippcHJDJCEiJyQiJj9xIyEiIjckJCIrO3BdWkshIigkIiZJcSMhIiI3JCQiKyg9V3lDJCEiKCQiJlNxIyEiIjckJCIrTjk9W0shIigkIiZdcSMhIiI3JCQiK2YnPSZbSyEiKCQiJmdxIyEiIjckJCIrZmUmKVtLISIoJCImcXEjISIiNyQkIitPST5cSyEiKCQiJiEzRiEiIjckJCIrKj1JJlxLISIoJCImITRGISIiNyQkIis+dCcpXEshIigkIiYrciMhIiI3JCQiK0RXP11LISIoJCImNXIjISIiNyQkIis0OmFdSyEiKCQiJj9yIyEiIjckJCIrcCZ5M0QkISIoJCImSXIjISIiNyQkIisyY0BeSyEiKCQiJlNyIyEiIjckJCIrQEViXkshIigkIiZdciMhIiI3JCQiKzgnKik9RCQhIigkIiZnciMhIiI3JCQiKyNlRUFEJCEiKCQiJnFyIyEiIjckJCIrSE5jX0shIigkIiYhPUYhIiI3JCQiK2AvIUhEJCEiKCQiJiE+RiEiIjckJCIrYXRCYEshIigkIiYrcyMhIiI3JCQiK0xVZGBLISIoJCImNXMjISIiNyQkIio0NlJEJCEiJyQiJj9zIyEiIjckJCIrRHpDYUshIigkIiZJcyMhIiI3JCQiK1BaZWFLISIoJCImU3MjISIiNyQkIitHOiNcRCQhIigkIiZdcyMhIiI3JCQiKydIZV9EJCEiKCQiJmdzIyEiIjckJCIrVl1mYkshIigkIiZxcyMhIiI3JCQiK288JGZEJCEiKCQiJiFHRiEiIjckJCIrcyVvaUQkISIoJCImIUhGISIiNyQkIithXmdjSyEiKCQiJit0IyEiIjckJCIrOT0lcEQkISIoJCImNXQjISIiNyQkIithJXlzRCQhIigkIiY/dCMhIiI3JCQiK3NdaGRLISIoJCImSXQjISIiNyQkIitvOyZ6RCQhIigkIiZTdCMhIiI3JCQiK1cjKUdlSyEiKCQiJl10IyEiIjckJCIrKnpDJ2VLISIoJCImZ3QjISIiNyQkIitLOCcqZUshIigkIiZxdCMhIiI3JCQiK1h5SGZLISIoJCImIVFGISIiNyQkIitRVmpmSyEiKCQiJiFSRiEiIjckJCIrNDMoKmZLISIoJCImK3UjISIiNyQkIipFMi5FJCEiJyQiJjV1IyEiIjckJCIrInBWMUUkISIoJCImP3UjISIiNyQkIissLCk0RSQhIigkIiZJdSMhIiI3JCQiKyJcOzhFJCEiKCQiJlN1IyEiIjckJCIraEdsaEshIigkIiZddSMhIiI3JCQiKzYjKik+RSQhIigkIiZndSMhIiI3JCQiK1RiS2lLISIoJCImcXUjISIiNyQkIitePW1pSyEiKCQiJiFbRiEiIjckJCIrVCIpKkhFJCEiKCQiJiFcRiEiIjckJCIrN1dMakshIigkIiYrdiMhIiI3JCQiK2kxbmpLISIoJCImNXYjISIiNyQkIislKm8ra0shIigkIiY/diMhIiI3JCQiKzFKTWtLISIoJCImSXYjISIiNyQkIispSHpZRSQhIigkIiZTdiMhIiI3JCQiK3NhLGxLISIoJCImXXYjISIiNyQkIitFO05sSyEiKCQiJmd2IyEiIjckJCIraHhvbEshIigkIiZxdiMhIiI3JCQiK3hRLW1LISIoJCImIWVGISIiNyQkIit2KmZqRSQhIigkIiYhZkYhIiI3JCQiK2BncG1LISIoJCImK3cjISIiNyQkIis4QC5uSyEiKCQiJjV3IyEiIjckJCIrYSJvdEUkISIoJCImP3cjISIiNyQkIit4VHFuSyEiKCQiJkl3IyEiIjckJCIrIj1TIW9LISIoJCImU3cjISIiNyQkIitvaFBvSyEiKCQiJl13IyEiIjckJCIrTkByb0shIigkIiZndyMhIiI3JCQiKyYzWyFwSyEiKCQiJnF3IyEiIjckJCIrPFNRcEshIigkIiYhb0YhIiI3JCQiK0oqPihwSyEiKCQiJiFwRiEiIjckJCIrRmUwcUshIigkIiYreCMhIiI3JCQiKzA8UnFLISIoJCImNXgjISIiNyQkIittdnNxSyEiKCQiJj94IyEiIjckJCIrNE0xckshIigkIiZJeCMhIiI3JCQiK00jKlJySyEiKCQiJlN4IyEiIjckJCIrVV10ckshIigkIiZdeCMhIiI3JCQiK0wzMnNLISIoJCImZ3gjISIiNyQkIisybVNzSyEiKCQiJnF4IyEiIjckJCIra0J1c0shIigkIiYheUYhIiI3JCQiKy4ieUlGJCEiKCQiJiF6RiEiIjckJCIrRVFUdEshIigkIiYreSMhIiI3JCQiK0smXFBGJCEiKCQiJjV5IyEiIjckJCIrQV8zdUshIigkIiY/eSMhIiI3JCQiKyUqM1V1SyEiKCQiJkl5IyEiIjckJCIqYmNaRiQhIickIiZTeSMhIiI3JCQiKj4jNHZLISInJCImXXkjISIiNyQkIis5eVV2SyEiKCQiJmd5IyEiIjckJCIrQE13dkshIigkIiZxeSMhIiI3JCQiKzchKjR3SyEiKCQiJiEpeSMhIiI3JCQiKyhlTWtGJCEiKCQiJiEqeSMhIiI3JCQiK1kseHdLISIoJCImK3ojISIiNyQkIisqbzByRiQhIigkIiY1eiMhIiI3JCQiKzw3V3hLISIoJCImP3ojISIiNyQkIitIbnh4SyEiKCQiJkl6IyEiIjckJCIrREE2eUshIigkIiZTeiMhIiI3JCQiKzF4V3lLISIoJCImXXojISIiNyQkIitzSnl5SyEiKCQiJmd6IyEiIjckJCIrQSc9InpLISIoJCImcXojISIiNyQkIitkU1h6SyEiKCQiJiEpeiMhIiI3JCQiK3glKnl6SyEiKCQiJiEqeiMhIiI3JCQiKyMpWzchRyQhIigkIiYrIUchIiI3JCQiK3MtWSFHJCEiKCQiJjUhRyEiIjckJCIrWmN6IUckISIoJCImPyFHISIiNyQkIiszNTgiRyQhIigkIiZJIUchIiI3JCQiK2FqWSJHJCEiKCQiJlMhRyEiIjckJCIrJ28sPUckISIoJCImXSFHISIiNyQkIisucTgjRyQhIigkIiZnIUchIiI3JCQiKzFCWiNHJCEiKCQiJnEhRyEiIjckJCIrJmYyR0ckISIoJCImITNHISIiNyQkIitwRzkkRyQhIigkIiYhNEchIiI3JCQiKjh5TUckISInJCImKyJHISIiNyQkIit4TCJRRyQhIigkIiY1IkchIiI3JCQiKzQnW1RHJCEiKCQiJj8iRyEiIjckJCIrSFFbJUckISIoJCImSSJHISIiNyQkIitNIT5bRyQhIigkIiZTIkchIiI3JCQiK0VVOiZHJCEiKCQiJl0iRyEiIjckJCIrMCUqWyZHJCEiKCQiJmciRyEiIjckJCIqZENlRyQhIickIiZxIkchIiI3JCQiK0EoZmhHJCEiKCQiJiE9RyEiIjckJCIraFtcJ0ckISIoJCImIT5HISIiNyQkIisoKSpIb0ckISIoJCImKyNHISIiNyQkIileOyhHJCEiJiQiJjUjRyEiIjckJCIpLV0oRyQhIiYkIiY/I0chIiI3JCQiKylHTnlHJCEiKCQiJkkjRyEiIjckJCIrai48KUckISIoJCImUyNHISIiNyQkIitEYV0pRyQhIigkIiZdI0chIiI3JCQiK3YvJSkpRyQhIigkIiZnI0chIiI3JCQiKzdiPCpHJCEiKCQiJnEjRyEiIjckJCIrUTBeKkckISIoJCImIUdHISIiNyQkIiteYiUpKkckISIoJCImIUhHISIiNyQkIitfMD0hSCQhIigkIiYrJEchIiI3JCQiK1RiXiFIJCEiKCQiJjUkRyEiIjckJCIrPTAmM0gkISIoJCImPyRHISIiNyQkIislWyY9IkgkISIoJCImSSRHISIiNyQkIitRL18iSCQhIigkIiZTJEchIiI3JCQiKyJRYj1IJCEiKCQiJl0kRyEiIjckJCIrNy4+I0gkISIoJCImZyRHISIiNyQkIitKX18jSCQhIigkIiZxJEchIiI3JCQiKjlnR0gkISInJCImIVFHISIiNyQkIitQXT4kSCQhIigkIiYhUkchIiI3JCQiK0MqSE5IJCEiKCQiJislRyEiIjckJCIrKnprUUgkISIoJCImNSVHISIiNyQkIitrJyo+JUgkISIoJCImPyVHISIiNyQkIis8WGAlSCQhIigkIiZJJUchIiI3JCQiK2gkcFtIJCEiKCQiJlMlRyEiIjckJCIrJD4vX0gkISIoJCImXSVHISIiNyQkIis6IVJiSCQhIigkIiZnJUchIiI3JCQiK0ZRKGVIJCEiKCQiJnElRyEiIjckJCIrSCczaUgkISIoJCImIVtHISIiNyQkIitATWEnSCQhIigkIiYhXEchIiI3JCQiKy0jeW9IJCEiKCQiJismRyEiIjckJCIrdUhAKEgkISIoJCImNSZHISIiNyQkIitPeGEoSCQhIigkIiY/JkchIiI3JCQiKylbIyl5SCQhIigkIiZJJkchIiI3JCQiK0pzQClIJCEiKCQiJlMmRyEiIjckJCIraz5iKUgkISIoJCImXSZHISIiNyQkIisobycpKSlIJCEiKCQiJmcmRyEiIjckJCIrLTlBKkgkISIoJCImcSZHISIiNyQkIisyaGIqSCQhIigkIiYhZUchIiI3JCQiKy4zKikqSCQhIigkIiYhZkchIiI3JCQiKlxELUkkISInJCImKydHISIiNyQkIitvLGMrTCEiKCQiJjUnRyEiIjckJCIrUFsqM0kkISIoJCImPydHISIiNyQkIispXEg3SSQhIigkIiZJJ0chIiI3JCQiKjprOkkkISInJCImUydHISIiNyQkIisleikqPUkkISIoJCImXSdHISIiNyQkIitITUItTCEiKCQiJmcnRyEiIjckJCIrYyFvREkkISIoJCImcSdHISIiNyQkIit2RSFISSQhIigkIiYhb0chIiI3JCQiKyZHUEtJJCEiKCQiJiFwRyEiIjckJCIrKSk9ZC5MISIoJCImKyhHISIiNyQkIiskWzFSSSQhIigkIiY1KEchIiI3JCQiKjJUVUkkISInJCImPyhHISIiNyQkIipsdlhJJCEiJyQiJkkoRyEiIjckJCIrQS0iXEkkISIoJCImUyhHISIiNyQkIisoeVdfSSQhIigkIiZdKEchIiI3JCQiK1ckemJJJCEiKCQiJmcoRyEiIjckJCIrJSpRImZJJCEiKCQiJnEoRyEiIjckJCIrUCVbaUkkISIoJCImIXlHISIiNyQkIit0SGUxTCEiKCQiJiF6RyEiIjckJCIrLXYicEkkISIoJCImKylHISIiNyQkIitDP0QyTCEiKCQiJjUpRyEiIjckJCIrUmxlMkwhIigkIiY/KUchIiI3JCQiK1s1I3pJJCEiKCQiJkkpRyEiIjckJCIrXmJEM0whIigkIiZTKUchIiI3JCQiK1orZjNMISIoJCImXSlHISIiNyQkIitQWCMqM0whIigkIiZnKUchIiI3JCQiKi1mIzRMISInJCImcSlHISIiNyQkIispXCRmNEwhIigkIiYhKSlHISIiNyQkIiooeiMqNEwhIickIiYhKilHISIiNyQkIitOQ0U1TCEiKCQiJisqRyEiIjckJCIrJipvZjVMISIoJCImNSpHISIiNyQkIipOSjRKJCEiJyQiJj8qRyEiIjckJCIrKnpsN0okISIoJCImSSpHISIiNyQkIitVLWc2TCEiKCQiJlMqRyEiIjckJCIqb00+SiQhIickIiZdKkchIiI3JCQiKzgicEFKJCEiKCQiJmcqRyEiIjckJCIrVE5nN0whIigkIiZxKkchIiI3JCQiK2t6JEhKJCEiKCQiJiEpKkchIiI3JCQiKyNRc0tKJCEiKCQiJiEqKkchIiI3JCQiKyZ6MU9KJCEiKCQiJishSCEiIjckJCIrLzclUkokISIoJCImNSFIISIiNyQkIiszY0Y5TCEiKCQiJj8hSCEiIjckJCIrMytoOUwhIigkIiZJIUghIiI3JCQiKy5XJVxKJCEiKCQiJlMhSCEiIjckJCIrJXp5X0okISIoJCImXSFIISIiNyQkIisiPThjSiQhIigkIiZnIUghIiI3JCQiK2t2JWZKJCEiKCQiJnEhSCEiIjckJCIrVj5HO0whIigkIiYhM0ghIiI3JCQiKz1qaDtMISIoJCImITRIISIiNyQkIipwXXBKJCEiJyQiJisiSCEiIjckJCIrZV1HPEwhIigkIiY1IkghIiI3JCQiK0ElPndKJCEiKCQiJj8iSCEiIjckJCIrJXlgekokISIoJCImSSJIISIiNyQkIitVIilHPUwhIigkIiZTIkghIiI3JCQiKydcQSc9TCEiKCQiJl0iSCEiIjckJCIrW28mKj1MISIoJCImZyJIISIiNyQkIisoPiJIPkwhIigkIiZxIkghIiI3JCQiK1ZiaT5MISIoJCImIT1IISIiNyQkIisoKSlmKj5MISIoJCImIT5IISIiNyQkIitHVUg/TCEiKCQiJisjSCEiIjckJCIrbSZHMUskISIoJCImNSNIISIiNyQkIistSCc0SyQhIigkIiY/I0ghIiI3JCQiK09zSEBMISIoJCImSSNIISIiNyQkIitvOmpATCEiKCQiJlMjSCEiIjckJCIrKSplJz5LJCEiKCQiJl0jSCEiIjckJCIrRC1JQUwhIigkIiZnI0ghIiI3JCQiK19YakFMISIoJCImcSNIISIiNyQkIit3KW9ISyQhIigkIiYhR0ghIiI3JCQiKyo+LkxLJCEiKCQiJiFISCEiIjckJCIqX1BPSyQhIickIiYrJEghIiI3JCQiKiU9KFJLJCEiJyQiJjUkSCEiIjckJCIrZmhJQ0whIigkIiY/JEghIiI3JCQiK3gva0NMISIoJCImSSRIISIiNyQkIiskenVcSyQhIigkIiZTJEghIiI3JCQiKzQiNGBLJCEiKCQiJl0kSCEiIjckJCIrQ01rREwhIigkIiZnJEghIiI3JCQiK1F4KGZLJCEiKCQiJnEkSCEiIjckJCIrXz9KRUwhIigkIiYhUUghIiI3JCQiK21qa0VMISIoJCImIVJIISIiNyQkIit6MSlwSyQhIigkIiYrJUghIiI3JCQiKyMqXEpGTCEiKCQiJjUlSCEiIjckJCIrMCRcd0skISIoJCImPyVIISIiNyQkIis8Tyl6SyQhIigkIiZJJUghIiI3JCQiK0p6SkdMISIoJCImUyVIISIiNyQkIitXQWxHTCEiKCQiJl0lSCEiIjckJCIrZGwpKkdMISIoJCImZyVIISIiNyQkIitzM0tITCEiKCQiJnElSCEiIjckJCIrJz1iJ0hMISIoJCImIVtIISIiNyQkIistJiopKkhMISIoJCImIVxIISIiNyQkIis9UUtJTCEiKCQiJismSCEiIjckJCIrTyJlMUwkISIoJCImNSZIISIiNyQkIithQyo0TCQhIigkIiY/JkghIiI3JCQiK3VuS0pMISIoJCImSSZIISIiNyQkIislNGg7TCQhIigkIiZTJkghIiI3JCQiKzxhKj5MJCEiKCQiJl0mSCEiIjckJCIrVChIQkwkISIoJCImZyZIISIiNyQkIittU21LTCEiKCQiJnEmSCEiIjckJCIrJFIpKkhMJCEiKCQiJiFlSCEiIjckJCIrQkZMTEwhIigkIiYhZkghIiI3JCQiK2FxbUxMISIoJCImKydIISIiNyQkIisoUSxTTCQhIigkIiY1J0ghIiI3JCQiK0JkTE1MISIoJCImPydIISIiNyQkIitoK25NTCEiKCQiJkknSCEiIjckJCIrLFcrTkwhIigkIiZTJ0ghIiI3JCQiK1coUWBMJCEiKCQiJl0nSCEiIjckJCIqNHRjTCQhIickIiZnJ0ghIiI3JCQiK1J1K09MISIoJCImcSdIISIiNyQkIip6VGpMJCEiJyQiJiFvSCEiIjckJCIrWGhuT0whIigkIiYhcEghIiI3JCQiKy4wLFBMISIoJCImKyhIISIiNyQkIitrW01QTCEiKCQiJjUoSCEiIjckJCIrSCN6d0wkISIoJCImPyhIISIiNyQkIisoZjghUUwhIigkIiZJKEghIiI3JCQiK3B6TVFMISIoJCImUyhIISIiNyQkIitYQm9RTCEiKCQiJl0oSCEiIjckJCIrQ24sUkwhIigkIiZnKEghIiI3JCQiKzM2TlJMISIoJCImcShIISIiNyQkIisnXCZvUkwhIigkIiYheUghIiI3JCQiKykpKT4rTSQhIigkIiYhekghIiI3JCQiKyZHYS5NJCEiKCQiJispSCEiIjckJCIrJ28pb1NMISIoJCImNSlIISIiNyQkIisjNEI1TSQhIigkIiY/KUghIiI3JCQiKy52TlRMISIoJCImSSlIISIiNyQkIis9PnBUTCEiKCQiJlMpSCEiIjckJCIrUmotVUwhIigkIiZdKUghIiI3JCQiK2syT1VMISIoJCImZylIISIiNyQkIismPiZwVUwhIigkIiZxKUghIiI3JCQiK0snSElNJCEiKCQiJiEpKUghIiI3JCQiK3RTT1ZMISIoJCImISopSCEiIjckJCIrQCYpcFZMISIoJCImKypIISIiNyQkIit1SC5XTCEiKCQiJjUqSCEiIjckJCIrTHVPV0whIigkIiY/KkghIiI3JCQiKyoqPXFXTCEiKCQiJkkqSCEiIjckJCIqUE9dTSQhIickIiZTKkghIiI3JCQiK1szUFhMISIoJCImXSpIISIiNyQkIitLYHFYTCEiKCQiJmcqSCEiIjckJCIrQSlSZ00kISIoJCImcSpIISIiNyQkIis+VlBZTCEiKCQiJiEpKkghIiI3JCQiK0IpM25NJCEiKCQiJiEqKkghIiI3JCQiK01ML1pMISIoJCImKyskISIiNyQkIitfeVBaTCEiKCQiJjUrJCEiIjckJCIreEJyWkwhIigkIiY/KyQhIiI3JCQiKzRwL1tMISIoJCImSSskISIiNyQkIitcOVFbTCEiKCQiJlMrJCEiIjckJCIrJypmcltMISIoJCImXSskISIiNyQkIiteMDBcTCEiKCQiJmcrJCEiIjckJCIrOV5RXEwhIigkIiZxKyQhIiI3JCQiKyVvPihcTCEiKCQiJiEzSSEiIjckJCIralUwXUwhIigkIiYhNEkhIiI3JCQiKiYpKVFdTCEiJyQiJissJCEiIjckJCIrWE1zXUwhIigkIiY1LCQhIiI3JCQiK1shZTVOJCEiKCQiJj8sJCEiIjckJCIraEVSXkwhIigkIiZJLCQhIiI3JCQiKyJHRjxOJCEiKCQiJlMsJCEiIjckJCIrNj4xX0whIigkIiZdLCQhIiI3JCQiK1xsUl9MISIoJCImZywkISIiNyQkIisoPkpGTiQhIigkIiZxLCQhIiI3JCQiK2FlMWBMISIoJCImIT1JISIiNyQkIipfK01OJCEiJyQiJiE+SSEiIjckJCIrJj5OUE4kISIoJCImKy0kISIiNyQkIisiKSlwU04kISIoJCImNS0kISIiNyQkIit2WFNhTCEiKCQiJj8tJCEiIjckJCIqR1JaTiQhIickIiZJLSQhIiI3JCQiKyYqUjJiTCEiKCQiJlMtJCEiIjckJCIqczNhTiQhIickIiZdLSQhIiI3JCQiK2JNdWJMISIoJCImZy0kISIiNyQkIikjeWdOJCEiJiQiJnEtJCEiIjckJCIrY0hUY0whIigkIiYhR0khIiI3JCQiK0J4dWNMISIoJCImIUhJISIiNyQkIissRDNkTCEiKCQiJisuJCEiIjckJCIrKkc8dU4kISIoJCImNS4kISIiNyQkIispM194TiQhIigkIiY/LiQhIiI3JCQiKyoqbzNlTCEiKCQiJkkuJCEiIjckJCIrQDxVZUwhIigkIiZTLiQhIiI3JCQiK2FsdmVMISIoJCImXS4kISIiNyQkIisqUiI0ZkwhIigkIiZnLiQhIiI3JCQiK2NpVWZMISIoJCImcS4kISIiNyQkIitDNndmTCEiKCQiJiFRSSEiIjckJCIrMGc0Z0whIigkIiYhUkkhIiI3JCQiKygqM1ZnTCEiKCQiJisvJCEiIjckJCIrLWV3Z0whIigkIiY1LyQhIiI3JCQiKnMrNk8kISInJCImPy8kISIiNyQkIitcY1ZoTCEiKCQiJkkvJCEiIjckJCIrI2ZxPE8kISIoJCImUy8kISIiNyQkIitaYjVpTCEiKCQiJl0vJCEiIjckJCIrOjBXaUwhIigkIiZnLyQhIiI3JCQiKyhcdkZPJCEiKCQiJnEvJCEiIjckJCIrIlw1Sk8kISIoJCImIVtJISIiNyQkIisqXFhNTyQhIigkIiYhXEkhIiI3JCQiKl8heWpMISInJCImKzAkISIiNyQkIitiYjZrTCEiKCQiJjUwJCEiIjckJCIrLzFYa0whIigkIiY/MCQhIiI3JCQiK25jeWtMISIoJCImSTAkISIiNyQkIitWMjdsTCEiKCQiJlMwJCEiIjckJCIrTWVYbEwhIigkIiZdMCQhIiI3JCQiKiU0emxMISInJCImZzAkISIiNyQkIitmZzdtTCEiKCQiJnEwJCEiIjckJCIrJT5oa08kISIoJCImIWVJISIiNyQkIitWanptTCEiKCQiJiFmSSEiIjckJCIrMTo4bkwhIigkIiYrMSQhIiI3JCQiKyZvbXVPJCEiKCQiJjUxJCEiIjckJCIqKT0heU8kISInJCImPzEkISIiNyQkIisqM1Aib0whIigkIiZJMSQhIiI3JCQiKzlCWm9MISIoJCImUzEkISIiNyQkIithdiEpb0whIigkIiZdMSQhIiI3JCQiKzZHOXBMISIoJCImZzEkISIiNyQkIiskM3klcEwhIigkIiZxMSQhIiI3JCQiK3JMIilwTCEiKCQiJiFvSSEiIjckJCIrdidbLFAkISIoJCImIXBJISIiNyQkIisnKlJbcUwhIigkIiYrMiQhIiI3JCQiK0wkPjNQJCEiKCQiJjUyJCEiIjckJCIrJ29hNlAkISIoJCImPzIkISIiNyQkIitkK1xyTCEiKCQiJkkyJCEiIjckJCIrV2EjPVAkISIoJCImUzIkISIiNyQkIitbMztzTCEiKCQiJl0yJCEiIjckJCIqRidcc0whIickIiZnMiQhIiI3JCQiKzM8JEdQJCEiKCQiJnEyJCEiIjckJCIrbHI7dEwhIigkIiYheUkhIiI3JCQiK1JFXXRMISIoJCImIXpJISIiNyQkIio4UVFQJCEiJyQiJiszJCEiIjckJCIqa3RUUCQhIickIiY1MyQhIiI3JCQiK24iNFhQJCEiKCQiJj8zJCEiIjckJCIrOFolW1AkISIoJCImSTMkISIiNyQkIit4LT12TCEiKCQiJlMzJCEiIjckJCIqJ2VedkwhIickIiZdMyQhIiI3JCQiK2g5JmVQJCEiKCQiJmczJCEiIjckJCIrIjMoPXdMISIoJCImcTMkISIiNyQkIipzQWxQJCEiJyQiJiEpMyQhIiI3JCQiK3kkZW9QJCEiKCQiJiEqMyQhIiI3JCQiK2NTPnhMISIoJCImKzQkISIiNyQkIitfKEh2UCQhIigkIiY1NCQhIiI3JCQiK3BhJ3lQJCEiKCQiJj80JCEiIjckJCIrMDc/eUwhIigkIiZJNCQhIiI3JCQiK2hwYHlMISIoJCImUzQkISIiNyQkIitPRigpeUwhIigkIiZdNCQhIiI3JCQiK0smMyN6TCEiKCQiJmc0JCEiIjckJCIrXFZhekwhIigkIiZxNCQhIiI3JCQiKyY9ISkpekwhIigkIiYhKTQkISIiNyQkIitWZ0AhUSQhIigkIiYhKjQkISIiNyQkIitAPmIhUSQhIigkIiYrNSQhIiI3JCQiKiN5KTNRJCEiJyQiJjU1JCEiIjckJCIqdUI3USQhIickIiY/NSQhIiI3JCQiKyJvZjpRJCEiKCQiJkk1JCEiIjckJCIrVmMqPVEkISIoJCImUzUkISIiNyQkIitGO0IjUSQhIigkIiZdNSQhIiI3JCQiK0x3YyNRJCEiKCQiJmc1JCEiIjckJCIraE8hSFEkISIoJCImcTUkISIiNyQkIis2KFJLUSQhIigkIiYhM0ohIiI3JCQiKyN5dk5RJCEiKCQiJiE0SiEiIjckJCIrdz0iUlEkISIoJCImKzYkISIiNyQkIiskKnpDJVEkISIoJCImNTYkISIiNyQkIitLVGUlUSQhIigkIiY/NiQhIiI3JCQiKyVIP1xRJCEiKCQiJkk2JCEiIjckJCIremtEJlEkISIoJCImUzYkISIiNyQkIisobyNmJlEkISIoJCImXTYkISIiNyQkIis9KkdmUSQhIigkIiZnNiQhIiI3JCQiK3NeRSdRJCEiKCQiJnE2JCEiIjckJCIqWCxtUSQhIickIiYhPUohIiI3JCQiK194JHBRJCEiKCQiJiE+SiEiIjckJCIreVNGKFEkISIoJCImKzckISIiNyQkIitHL2goUSQhIigkIiY1NyQhIiI3JCQiKy1vJXpRJCEiKCQiJj83JCEiIjckJCIpS0cpUSQhIiYkIiZJNyQhIiI3JCQiK0InPicpUSQhIigkIiZTNyQhIiI3JCQiKjJjKilRJCEiJyQiJl03JCEiIjckJCIrVkRIKlEkISIoJCImZzckISIiNyQkIiovSCcqUSQhIickIiZxNyQhIiI3JCQiK2piJyoqUSQhIigkIiYhR0ohIiI3JCQiKjYtLlIkISInJCImIUhKISIiNyQkIislb1ExUiQhIigkIiYrOCQhIiI3JCQiKyRHdjRSJCEiKCQiJjU4JCEiIjckJCIrMz5KIlIkISIoJCImPzgkISIiNyQkIitlJls7UiQhIigkIiZJOCQhIiI3JCQiK05fKT5SJCEiKCQiJlM4JCEiIjckJCIrUj5LI1IkISIoJCImXTgkISIiNyQkIitvJ2VFUiQhIigkIiZnOCQhIiI3JCQiK0RhKkhSJCEiKCQiJnE4JCEiIjckJCIrM0FMJFIkISIoJCImIVFKISIiNyQkIis9IXBPUiQhIigkIiYhUkohIiI3JCQiK2NlKyVSJCEiKCQiJis5JCEiIjckJCIqc1VWUiQhIickIiY1OSQhIiI3JCQiKzcnellSJCEiKCQiJj85JCEiIjckJCIrS2wsJlIkISIoJCImSTkkISIiNyQkIipbYGBSJCEiJyQiJlM5JCEiIjckJCIrYi9wJlIkISIoJCImXTkkISIiNyQkIitmdS0nUiQhIigkIiZnOSQhIiI3JCQiKyJca2pSJCEiKCQiJnE5JCEiIjckJCIrXzpxJ1IkISIoJCImIVtKISIiNyQkIitUJ1FxUiQhIigkIiYhXEohIiI3JCQiK2ZkUChSJCEiKCQiJis6JCEiIjckJCIrMUhyKFIkISIoJCImNTokISIiNyQkIisjM10hKVIkISIoJCImPzokISIiNyQkIispRyhRKVIkISIoJCImSTokISIiNyQkIitCWHMpUiQhIigkIiZTOiQhIiI3JCQiKyl5aCEqUiQhIigkIiZdOiQhIiI3JCQiKyQzKlIqUiQhIigkIiZnOiQhIiI3JCQiKzNrdCpSJCEiKCQiJnE6JCEiIjckJCIralAyK00hIigkIiYhZUohIiI3JCQiK1s2VCtNISIoJCImIWZKISIiNyQkIitrJlsyUyQhIigkIiYrOyQhIiI3JCQiKzZnMyxNISIoJCImNTskISIiNyQkIispW0I5UyQhIigkIiY/OyQhIiI3JCQiKygqNHcsTSEiKCQiJkk7JCEiIjckJCIrUCYpNC1NISIoJCImUzskISIiNyQkIiszaFYtTSEiKCQiJl07JCEiIjckJCIrNlB4LU0hIigkIiZnOyQhIiI3JCQiK1k4Ni5NISIoJCImcTskISIiNyQkIis4IVxNUyQhIigkIiYhb0ohIiI3JCQiKzdueS5NISIoJCImIXBKISIiNyQkIitXVzcvTSEiKCQiJis8JCEiIjckJCIrMkFZL00hIigkIiY1PCQhIiI3JCQiKy8rIVtTJCEiKCQiJj88JCEiIjckJCIrTXk4ME0hIigkIiZJPCQhIiI3JCQiKydwdmFTJCEiKCQiJlM8JCEiIjckJCIrI2Y4ZVMkISIoJCImXTwkISIiNyQkIitAOjoxTSEiKCQiJmc8JCEiIjckJCIrJVsqWzFNISIoJCImcTwkISIiNyQkIisiW0ZvUyQhIigkIiYheUohIiI3JCQiKzZiOzJNISIoJCImIXpKISIiNyQkIit3Tl0yTSEiKCQiJis9JCEiIjckJCIrdjsleVMkISIoJCImNT0kISIiNyQkIis0KXoiM00hIigkIiY/PSQhIiI3JCQiK3h6XjNNISIoJCImST0kISIiNyQkIisiPWMpM00hIigkIiZTPSQhIiI3JCQiKz5XPjRNISIoJCImXT0kISIiNyQkIiskcEsmNE0hIigkIiZnPSQhIiI3JCQiKy01KCk0TSEiKCQiJnE9JCEiIjckJCIrWiQ0LVQkISIoJCImISk9JCEiIjckJCIrRnhhNU0hIigkIiYhKj0kISIiNyQkIitXaCkzVCQhIigkIiYrPiQhIiI3JCQiKyhmQzdUJCEiKCQiJjU+JCEiIjckJCIrJzNqOlQkISIoJCImPz4kISIiNyQkIis3OyE+VCQhIigkIiZJPiQhIiI3JCQiK3YsQzdNISIoJCImUz4kISIiNyQkIit1KHlEVCQhIigkIiZdPiQhIiI3JCQiKzZ1IkhUJCEiKCQiJmc+JCEiIjckJCIrJjNjS1QkISIoJCImcT4kISIiNyQkIisoeiVmOE0hIigkIiYhKT4kISIiNyQkIitZTiRSVCQhIigkIiYhKj4kISIiNyQkIitNQkY5TSEiKCQiJis/JCEiIjckJCIrZjZoOU0hIigkIiY1PyQhIiI3JCQiK0IrJlxUJCEiKCQiJj8/JCEiIjckJCIrRSopRzpNISIoJCImST8kISIiNyQkIitueWk6TSEiKCQiJlM/JCEiIjckJCIrWm8nZlQkISIoJCImXT8kISIiNyQkIittZUk7TSEiKCQiJmc/JCEiIjckJCIrRFxrO00hIigkIiZxPyQhIiI3JCQiK0JTKXBUJCEiKCQiJiEzSyEiIjckJCIqO0J0VCQhIickIiYhNEshIiI3JCQiK1FCbTxNISIoJCImK0AkISIiNyQkIitjOis9TSEiKCQiJjVAJCEiIjckJCIrOTNNPU0hIigkIiY/QCQhIiI3JCQiKzcsbz1NISIoJCImSUAkISIiNyQkIiteJT4hPk0hIigkIiZTQCQhIiI3JCQiK0spZSQ+TSEiKCQiJl1AJCEiIjckJCIrYCMpcD5NISIoJCImZ0AkISIiNyQkIis6eC4/TSEiKCQiJnFAJCEiIjckJCIqQXguVSQhIickIiYhPUshIiI3JCQiK2xucj9NISIoJCImIT5LISIiNyQkIitgajBATSEiKCQiJitBJCEiIjckJCIrJClmUkBNISIoJCImNUEkISIiNyQkIitiY3RATSEiKCQiJj9BJCEiIjckJCIqUHY/VSQhIickIiZJQSQhIiI3JCQiK0deVEFNISIoJCImU0EkISIiNyQkIitHXHZBTSEiKCQiJl1BJCEiIjckJCIrc1o0Qk0hIigkIiZnQSQhIiI3JCQiK2ZZVkJNISIoJCImcUEkISIiNyQkIisqZXVQVSQhIigkIiYhR0shIiI3JCQiK2tYNkNNISIoJCImIUhLISIiNyQkIisjZWFXVSQhIigkIiYrQiQhIiI3JCQiK1hZekNNISIoJCImNUIkISIiNyQkIitfWjhETSEiKCQiJj9CJCEiIjckJCIrLlxaRE0hIigkIiZJQiQhIiI3JCQiKV4iZVUkISImJCImU0IkISIiNyQkIitUYDpFTSEiKCQiJl1CJCEiIjckJCIrR2NcRU0hIigkIiZnQiQhIiI3JCQiKidmJG9VJCEiJyQiJnFCJCEiIjckJCIrUmo8Rk0hIigkIiYhUUshIiI3JCQiK2luXkZNISIoJCImIVJLISIiNyQkIitLcyZ5VSQhIigkIiYrQyQhIiI3JCQiK1x4PkdNISIoJCImNUMkISIiNyQkIis3JFEmR00hIigkIiY/QyQhIiI3JCQiK0EqeSlHTSEiKCQiJklDJCEiIjckJCIreSY+I0hNISIoJCImU0MkISIiNyQkIisjR2cmSE0hIigkIiZdQyQhIiI3JCQiK001ISpITSEiKCQiJmdDJCEiIjckJCIrTD1DSU0hIigkIiZxQyQhIiI3JCQiKm8jZUlNISInJCImIVtLISIiNyQkIit2TiM0ViQhIigkIiYhXEshIiI3JCQiKz1YRUpNISIoJCImK0QkISIiNyQkIipeMDtWJCEiJyQiJjVEJCEiIjckJCIrXmwlPlYkISIoJCImP0QkISIiNyQkIitUd0dLTSEiKCQiJklEJCEiIjckJCIqeUdFViQhIickIiZTRCQhIiI3JCQiK28qcEhWJCEiKCQiJl1EJCEiIjckJCIrMTdKTE0hIigkIiZnRCQhIiI3JCQiKyVcX09WJCEiKCQiJnFEJCEiIjckJCIrS1EqUlYkISIoJCImIWVLISIiNyQkIitAX0xNTSEiKCQiJiFmSyEiIjckJCIqbXdZViQhIickIiYrRSQhIiI3JCQiK1wiPV1WJCEiKCQiJjVFJCEiIjckJCIqcGZgViQhIickIiY/RSQhIiI3JCQiKyNHLGRWJCEiKCQiJklFJCEiIjckJCIrRUgvT00hIigkIiZTRSQhIiI3JCQiK0FZUU9NISIoJCImXUUkISIiNyQkIitwanNPTSEiKCQiJmdFJCEiIjckJCIrbyJvcVYkISIoJCImcUUkISIiNyQkIiotNXVWJCEiJyQiJiFvSyEiIjckJCIrRD52UE0hIigkIiYhcEshIiI3JCQiKyQpUTRRTSEiKCQiJitGJCEiIjckJCIrJCplVlFNISIoJCImNUYkISIiNyQkIitlenhRTSEiKCQiJj9GJCEiIjckJCIrdis3Uk0hIigkIiZJRiQhIiI3JCQiK1pBWVJNISIoJCImU0YkISIiNyQkIit0VyEpUk0hIigkIiZdRiQhIiI3JCQiK2BuOVNNISIoJCImZ0YkISIiNyQkIisoMypbU00hIigkIiZxRiQhIiI3JCQiK3g5JDNXJCEiKCQiJiF5SyEiIjckJCIrQFI8VE0hIigkIiYhekshIiI3JCQiK0BrXlRNISIoJCImK0ckISIiNyQkIit3KmU9VyQhIigkIiY1RyQhIiI3JCQiKyllLEFXJCEiKCQiJj9HJCEiIjckJCIrYlVhVU0hIigkIiZJRyQhIiI3JCQiK3lwKUdXJCEiKCQiJlNHJCEiIjckJCIrZShIS1ckISIoJCImXUckISIiNyQkIismZnNOVyQhIigkIiZnRyQhIiI3JCQiKypbOlJXJCEiKCQiJnFHJCEiIjckJCIqV2VVVyQhIickIiYhKUckISIiNyQkIitbOWdXTSEiKCQiJiEqRyQhIiI3JCQiKzpYJVxXJCEiKCQiJitIJCEiIjckJCIrUndHWE0hIigkIiY1SCQhIiI3JCQiK0EzalhNISIoJCImP0gkISIiNyQkIitqUyhmVyQhIigkIiZJSCQhIiI3JCQiK2p0SllNISIoJCImU0gkISIiNyQkIitBMm1ZTSEiKCQiJl1IJCEiIjckJCIrVFQrWk0hIigkIiZnSCQhIiI3JCQiKz13TVpNISIoJCImcUgkISIiNyQkIitjNnBaTSEiKCQiJiEpSCQhIiI3JCQiK2FaLltNISIoJCImISpIJCEiIjckJCIrNyV5JFtNISIoJCImK0kkISIiNyQkIitKQHNbTSEiKCQiJjVJJCEiIjckJCIqImYxXE0hIickIiY/SSQhIiI3JCQiK14oNCVcTSEiKCQiJklJJCEiIjckJCIrYE92XE0hIigkIiZTSSQhIiI3JCQiKzt3NF1NISIoJCImXUkkISIiNyQkIitVO1ddTSEiKCQiJmdJJCEiIjckJCIqdCZ5XU0hIickIiZxSSQhIiI3JCQiKikpSDZYJCEiJyQiJiEzTCEiIjckJCIrJDR1OVgkISIoJCImITRMISIiNyQkIitvJD09WCQhIigkIiYrSiQhIiI3JCQiKzJGO19NISIoJCImNUokISIiNyQkIio2MkRYJCEiJyQiJj9KJCEiIjckJCIrdzomR1gkISIoJCImSUokISIiNyQkIisxaD5gTSEiKCQiJlNKJCEiIjckJCIrLDJhYE0hIigkIiZdSiQhIiI3JCQiKk8mKVFYJCEiJyQiJmdKJCEiIjckJCIrJTNJVVgkISIoJCImcUokISIiNyQkIit0W2RhTSEiKCQiJiE9TCEiIjckJCIrRig+XFgkISIoJCImIT5MISIiNyQkIitbWUViTSEiKCQiJitLJCEiIjckJCIrTSc0Y1gkISIoJCImNUskISIiNyQkIisnb2FmWCQhIigkIiY/SyQhIiI3JCQiKzApKkhjTSEiKCQiJklLJCEiIjckJCIqKlxrY00hIickIiZTSyQhIiI3JCQiK1YtKnBYJCEiKCQiJl1LJCEiIjckJCIramJMZE0hIigkIiZnSyQhIiI3JCQiK140b2RNISIoJCImcUskISIiNyQkIisxay1lTSEiKCQiJiFHTCEiIjckJCIqJD5QZU0hIickIiYhSEwhIiI3JCQiK0J2cmVNISIoJCImK0wkISIiNyQkIislPWohZk0hIigkIiY1TCQhIiI3JCQiKzkqMyVmTSEiKCQiJj9MJCEiIjckJCIrOFp2Zk0hIigkIiZJTCQhIiI3JCQiKyNlKyxZJCEiKCQiJlNMJCEiIjckJCIrQGxXZ00hIigkIiZdTCQhIiI3JCQiKmAjemdNISInJCImZ0wkISIiNyQkIipoUTZZJCEiJyQiJnFMJCEiIjckJCIqdyVbaE0hIickIiYhUUwhIiI3JCQiKyMpNCQ9WSQhIigkIiYhUkwhIiI3JCQiK3ZzPGlNISIoJCImK00kISIiNyQkIiprQkRZJCEiJyQiJjVNJCEiIjckJCIrdysoR1kkISIoJCImP00kISIiNyQkIismZTtLWSQhIigkIiZJTSQhIiI3JCQiK25KY2pNISIoJCImU00kISIiNyQkIitAKTRSWSQhIigkIiZdTSQhIiI3JCQiK1tsRGtNISIoJCImZ00kISIiNyQkIipOLllZJCEiJyQiJnFNJCEiIjckJCIrQy0mXFkkISIoJCImIVtMISIiNyQkIit0ckhsTSEiKCQiJiFcTCEiIjckJCIrJz5XY1kkISIoJCImK04kISIiNyQkIislSCIqZlkkISIoJCImNU4kISIiNyQkIituJVFqWSQhIigkIiY/TiQhIiI3JCQiKztkb21NISIoJCImSU4kISIiNyQkIiovTHFZJCEiJyQiJlNOJCEiIjckJCIrUi9Rbk0hIigkIiZdTiQhIiI3JCQiKzp6c25NISIoJCImZ04kISIiNyQkIitvYTJvTSEiKCQiJnFOJCEiIjckJCIrKTRCJW9NISIoJCImIWVMISIiNyQkIisvM3hvTSEiKCQiJiFmTCEiIjckJCIrKmU9InBNISIoJCImK08kISIiNyQkIitea1lwTSEiKCQiJjVPJCEiIjckJCIrIlI5KXBNISIoJCImP08kISIiNyQkIis0QztxTSEiKCQiJklPJCEiIjckJCIrMjBecU0hIigkIiZTTyQhIiI3JCQiKyRvZTNaJCEiKCQiJl1PJCEiIjckJCIrUnA/ck0hIigkIiZnTyQhIiI3JCQiK3ZfYnJNISIoJCImcU8kISIiNyQkIisicC4+WiQhIigkIiYhb0whIiI3JCQiKyg9X0FaJCEiKCQiJiFwTCEiIjckJCIrazJnc00hIigkIiYrUCQhIiI3JCQiK0ElXEhaJCEiKCQiJjVQJCEiIjckJCIraCIpSHRNISIoJCImP1AkISIiNyQkIisjKXBrdE0hIigkIiZJUCQhIiI3JCQiKyYpZSpSWiQhIigkIiZTUCQhIiI3JCQiKihbTXVNISInJCImXVAkISIiNyQkIitSUnB1TSEiKCQiJmdQJCEiIjckJCIqNFZdWiQhIickIiZxUCQhIiI3JCQiK0RCUnZNISIoJCImIXlMISIiNyQkIitWO3V2TSEiKCQiJiF6TCEiIjckJCIrWDU0d00hIigkIiYrUSQhIiI3JCQiK0swV3dNISIoJCImNVEkISIiNyQkIisvLHp3TSEiKCQiJj9RJCEiIjckJCIraChSclokISIoJCImSVEkISIiNyQkIisuJipbeE0hIigkIiZTUSQhIiI3JCQiK0okUnlaJCEiKCQiJl1RJCEiIjckJCIrWCMqPXlNISIoJCImZ1EkISIiNyQkIitYI1ImeU0hIigkIiZxUSQhIiI3JCQiK0wkKikpeU0hIigkIiYhKVEkISIiNyQkIiszJlIjek0hIigkIiYhKlEkISIiNyQkIip4KmV6TSEiJyQiJitSJCEiIjckJCIqN1Mqek0hIickIiY1UiQhIiI3JCQiK2UwSCFbJCEiKCQiJj9SJCEiIjckJCIrJjNUMVskISIoJCImSVIkISIiNyQkIissPCo0WyQhIigkIiZTUiQhIiI3JCQiKzFDTSJbJCEiKCQiJl1SJCEiIjckJCIrLEtwIlskISIoJCImZ1IkISIiNyQkIisnM1c/WyQhIigkIiZxUiQhIiI3JCQiK2hdUiNbJCEiKCQiJiEpUiQhIiI3JCQiK0ZodSNbJCEiKCQiJiEqUiQhIiI3JCQiKyZHKDQkWyQhIigkIiYrUyQhIiI3JCQiK00mW01bJCEiKCQiJjVTJCEiIjckJCIrdSkqeiRbJCEiKCQiJj9TJCEiIjckJCIrMjg6JVskISIoJCImSVMkISIiNyQkIitMR10lWyQhIigkIiZTUyQhIiI3JCQiK15XJltbJCEiKCQiJl1TJCEiIjckJCIramg/JlskISIoJCImZ1MkISIiNyQkIitwemImWyQhIigkIiZxUyQhIiI3JCQiK3ApNGZbJCEiKCQiJiEzTSEiIjckJCIraj1FJ1skISIoJCImITRNISIiNyQkIitfUmgnWyQhIigkIiYrVCQhIiI3JCQiK1BoJ3BbJCEiKCQiJjVUJCEiIjckJCIrPCU9dFskISIoJCImP1QkISIiNyQkIiskenF3WyQhIigkIiZJVCQhIiI3JCQiK21LLSlbJCEiKCQiJlNUJCEiIjckJCIrTmVQKVskISIoJCImXVQkISIiNyQkIistJkcoKVskISIoJCImZ1QkISIiNyQkIittNzMqWyQhIigkIiZxVCQhIiI3JCQiK0dUVipbJCEiKCQiJiE9TSEiIjckJCIrKjMoeSpbJCEiKCQiJiE+TSEiIjckJCIrWyw5IVwkISIoJCImK1UkISIiNyQkIisyTFwhXCQhIigkIiY1VSQhIiI3JCQiK2xsJTNcJCEiKCQiJj9VJCEiIjckJCIrQioqPiJcJCEiKCQiJklVJCEiIjckJCIrI1FgOlwkISIoJCImU1UkISIiNyQkIitUcCE+XCQhIigkIiZdVSQhIiI3JCQiKy0xRSNcJCEiKCQiJmdVJCEiIjckJCIra1ZoI1wkISIoJCImcVUkISIiNyQkIitHI29IXCQhIigkIiYhR00hIiI3JCQiKyY+QUxcJCEiKCQiJiFITSEiIjckJCIra2luJFwkISIoJCImK1YkISIiNyQkIitQLy4lXCQhIigkIiY1ViQhIiI3JCQiKzhaUSVcJCEiKCQiJj9WJCEiIjckJCIrJDRSWlwkISIoJCImSVYkISIiNyQkIit5TjQmXCQhIigkIiZTViQhIiI3JCQiK28iW2FcJCEiKCQiJl1WJCEiIjckJCIrakchZVwkISIoJCImZ1YkISIiNyQkIitrdzonXCQhIigkIiZxViQhIiI3JCQiK3JEXidcJCEiKCQiJiFRTSEiIjckJCIrJmVub1wkISIoJCImIVJNISIiNyQkIisxRkEoXCQhIigkIiYrVyQhIiI3JCQiK016ZChcJCEiKCQiJjVXJCEiIjckJCIqRkx6XCQhIickIiY/VyQhIiI3JCQiKzooKUcpXCQhIigkIiZJVyQhIiI3JCQiK29VaylcJCEiKCQiJlNXJCEiIjckJCIrSioqKiopXCQhIigkIiZdVyQhIiI3JCQiKy5kTipcJCEiKCQiJmdXJCEiIjckJCIrJ2U2KCpcJCEiKCQiJnFXJCEiIjckJCIrenYxK04hIigkIiYhW00hIiI3JCQiKyRvQi9dJCEiKCQiJiFcTSEiIjckJCIrKSopejJdJCEiKCQiJitYJCEiIjckJCIrRWk4LE4hIigkIiY1WCQhIiI3JCQiK2xFXCxOISIoJCImP1gkISIiNyQkIis9I1w9XSQhIigkIiZJWCQhIiI3JCQiKyUpZT8tTiEiKCQiJlNYJCEiIjckJCIrakVjLU4hIigkIiZdWCQhIiI3JCQiK2QmPkhdJCEiKCQiJmdYJCEiIjckJCIrbGxGLk4hIigkIiZxWCQhIiI3JCQiKypvTE9dJCEiKCQiJiFlTSEiIjckJCIrRzQqUl0kISIoJCImIWZNISIiNyQkIiskR1tWXSQhIigkIiYrWSQhIiI3JCQiK2FkcS9OISIoJCImNVkkISIiNyQkIitWTDEwTiEiKCQiJj9ZJCEiIjckJCIrXDVVME4hIigkIiZJWSQhIiI3JCQiK3QpeWRdJCEiKCQiJlNZJCEiIjckJCIrOm84MU4hIigkIiZdWSQhIiI3JCQiK3hbXDFOISIoJCImZ1kkISIiNyQkIitkSSZvXSQhIigkIiZxWSQhIiI3JCQiK2U4QDJOISIoJCImIW9NISIiNyQkIit6KHB2XSQhIigkIiYhcE0hIiI3JCQiKktHel0kISInJCImK1okISIiNyQkIislKXBHM04hIigkIiY1WiQhIiI3JCQiK29kazNOISIoJCImP1okISIiNyQkIit3WSs0TiEiKCQiJklaJCEiIjckJCIrMVBPNE4hIigkIiZTWiQhIiI3JCQiK2ZHczROISIoJCImXVokISIiNyQkIitPQDM1TiEiKCQiJmdaJCEiIjckJCIrUTpXNU4hIigkIiZxWiQhIiI3JCQiK2s1ITNeJCEiKCQiJiF5TSEiIjckJCIrOjI7Nk4hIigkIiYhek0hIiI3JCQiKyRcPzpeJCEiKCQiJitbJCEiIjckJCIrKFIhKT1eJCEiKCQiJjVbJCEiIjckJCIrRi9DN04hIigkIiY/WyQhIiI3JCQiKydlK0VeJCEiKCQiJklbJCEiIjckJCIrczMnSF4kISIoJCImU1skISIiNyQkIisnR0BMXiQhIigkIiZdWyQhIiI3JCQiK0g9bzhOISIoJCImZ1skISIiNyQkIistRC85TiEiKCQiJnFbJCEiIjckJCIrMExTOU4hIigkIiYhKVskISIiNyQkIitSVXc5TiEiKCQiJiEqWyQhIiI3JCQiKy5gNzpOISIoJCImK1wkISIiNyQkIilsWzpOISImJCImNVwkISIiNyQkIitHeSVlXiQhIigkIiY/XCQhIiI3JCQiKypHNGleJCEiKCQiJklcJCEiIjckJCIrJCkzZDtOISIoJCImU1wkISIiNyQkIis2RSRwXiQhIigkIiZdXCQhIiI3JCQiK3VXSDxOISIoJCImZ1wkISIiNyQkIitya2w8TiEiKCQiJnFcJCEiIjckJCIrLyc9IT1OISIoJCImISlcJCEiIjckJCIrdDNRPU4hIigkIiYhKlwkISIiNyQkIit5S3U9TiEiKCQiJitdJCEiIjckJCIrQGU1Pk4hIigkIiY1XSQhIiI3JCQiKywmbyU+TiEiKCQiJj9dJCEiIjckJCIrPjgkKT5OISIoJCImSV0kISIiNyQkIit3VT4/TiEiKCQiJlNdJCEiIjckJCIrdHRiP04hIigkIiZdXSQhIiI3JCQiKmg/NF8kISInJCImZ10kISIiNyQkIisoKVJHQE4hIigkIiZxXSQhIiI3JCQiKzF2a0BOISIoJCImITNOISIiNyQkIittNixBTiEiKCQiJiE0TiEiIjckJCIrb1xQQU4hIigkIiYrXiQhIiI3JCQiKzkqUUZfJCEiKCQiJjVeJCEiIjckJCIrLUk1Qk4hIigkIiY/XiQhIiI3JCQiK05zWUJOISIoJCImSV4kISIiNyQkIis4OyRRXyQhIigkIiZTXiQhIiI3JCQiK09oPkNOISIoJCImXV4kISIiNyQkIiswM2NDTiEiKCQiJmdeJCEiIjckJCIqaURcXyQhIickIiZxXiQhIiI3JCQiKyRlIUhETiEiKCQiJiE9TiEiIjckJCIrJHBiY18kISIoJCImIT5OISIiNyQkIitfNC1FTiEiKCQiJitfJCEiIjckJCIrZmpRRU4hIigkIiY1XyQhIiI3JCQiKzs+dkVOISIoJCImP18kISIiNyQkIitCdzZGTiEiKCQiJklfJCEiIjckJCIrI1skW0ZOISIoJCImU18kISIiNyQkIisiXFx5XyQhIigkIiZdXyQhIiI3JCQiK2BjQEdOISIoJCImZ18kISIiNyQkIitvPmVHTiEiKCQiJnFfJCEiIjckJCIrTyVbKkdOISIoJCImIUdOISIiNyQkIitkXUpITiEiKCQiJiFITiEiIjckJCIrTT1vSE4hIigkIiYrYCQhIiI3JCQiK20oWytgJCEiKCQiJjVgJCEiIjckJCIrYWVUSU4hIigkIiY/YCQhIiI3JCQiKyo0JHlJTiEiKCQiJklgJCEiIjckJCIpMDpKTiEiJiQiJlNgJCEiIjckJCIqMT06YCQhIickIiZdYCQhIiI3JCQiK3pkKT1gJCEiKCQiJmdgJCEiIjckJCIrY09ES04hIigkIiZxYCQhIiI3JCQiKyVwQEVgJCEiKCQiJiFRTiEiIjckJCIrJCopKilIYCQhIigkIiYhUk4hIiI3JCQiK18jZUxgJCEiKCQiJithJCEiIjckJCIrdW5zTE4hIigkIiY1YSQhIiI3JCQiK2ZhNE1OISIoJCImP2EkISIiNyQkIisxVllNTiEiKCQiJklhJCEiIjckJCIrPUwkW2AkISIoJCImU2EkISIiNyQkIismXC1fYCQhIigkIiZdYSQhIiI3JCQiK1A9ZE5OISIoJCImZ2EkISIiNyQkIitZOCVmYCQhIigkIiZxYSQhIiI3JCQiK0A1Sk9OISIoJCImIVtOISIiNyQkIitrM29PTiEiKCQiJiFcTiEiIjckJCIrdzMwUE4hIigkIiYrYiQhIiI3JCQiK2M1VVBOISIoJCImNWIkISIiNyQkIisxOXpQTiEiKCQiJj9iJCEiIjckJCIrRj47UU4hIigkIiZJYiQhIiI3JCQiKz5FYFFOISIoJCImU2IkISIiNyQkIiskWy4qUU4hIigkIiZdYiQhIiI3JCQiKz5YRlJOISIoJCImZ2IkISIiNyQkIitIZGtSTiEiKCQiJnFiJCEiIjckJCIrOXIsU04hIigkIiYhZU4hIiI3JCQiK3QnKVFTTiEiKCQiJiFmTiEiIjckJCIrMy93U04hIigkIiYrYyQhIiI3JCQiKz5COFROISIoJCImNWMkISIiNyQkIiszV11UTiEiKCQiJj9jJCEiIjckJCIrdm0oPWEkISIoJCImSWMkISIiNyQkIio3XEFhJCEiJyQiJlNjJCEiIjckJCIrWDxpVU4hIigkIiZdYyQhIiI3JCQiK15YKkhhJCEiKCQiJmdjJCEiIjckJCIrUHZPVk4hIigkIiZxYyQhIiI3JCQiKzEydVZOISIoJCImIW9OISIiNyQkIitkUzZXTiEiKCQiJiFwTiEiIjckJCIrImYoW1dOISIoJCImK2QkISIiNyQkIipKaFthJCEiJyQiJjVkJCEiIjckJCIrOV9CWE4hIigkIiY/ZCQhIiI3JCQiKy8kNGNhJCEiKCQiJklkJCEiIjckJCIrImUkKWZhJCEiKCQiJlNkJCEiIjckJCIrWCFlamEkISIoJCImXWQkISIiNyQkIispcEtuYSQhIigkIiZnZCQhIiI3JCQiKmEycmEkISInJCImcWQkISIiNyQkIitzRFtaTiEiKCQiJiF5TiEiIjckJCIrJXpkeWEkISIoJCImIXpOISIiNyQkIis0S0JbTiEiKCQiJitlJCEiIjckJCIrOykzJ1tOISIoJCImNWUkISIiNyQkIis7WSkqW04hIigkIiY/ZSQhIiI3JCQiKzYxT1xOISIoJCImSWUkISIiNyQkIissb3RcTiEiKCQiJlNlJCEiIjckJCIrKD04LGIkISIoJCImXWUkISIiNyQkIip4KltdTiEiJyQiJmdlJCEiIjckJCIqYm0zYiQhIickIiZxZSQhIiI3JCQiK0hOQ15OISIoJCImISllJCEiIjckJCIrMzJpXk4hIigkIiYhKmUkISIiNyQkIisoMykqPmIkISIoJCImK2YkISIiNyQkIituY1BfTiEiKCQiJjVmJCEiIjckJCIqWGBGYiQhIickIiY/ZiQhIiI3JCQiK085OGBOISIoJCImSWYkISIiNyQkIitEJzROYiQhIigkIiZTZiQhIiI3JCQiKi0pKVFiJCEiJyQiJl1mJCEiIjckJCIrQG1FYU4hIigkIiZnZiQhIiI3JCQiK0dha2FOISIoJCImcWYkISIiNyQkIitWVy1iTiEiKCQiJiEpZiQhIiI3JCQiK25PU2JOISIoJCImISpmJCEiIjckJCIpSnliTiEiJiQiJitnJCEiIjckJCIrV0Y7Y04hIigkIiY1ZyQhIiI3JCQiKUVhY04hIiYkIiY/ZyQhIiI3JCQiK29FI3BiJCEiKCQiJklnJCEiIjckJCIrXEhJZE4hIigkIiZTZyQhIiI3JCQiK1hNb2ROISIoJCImXWckISIiNyQkIitjVDFlTiEiKCQiJmdnJCEiIjckJCIrJDNYJWVOISIoJCImcWckISIiNyQkIitHaSMpZU4hIigkIiYhM08hIiI3JCQiKyNmMiNmTiEiKCQiJiE0TyEiIjckJCIrdSIqZWZOISIoJCImK2gkISIiNyQkIit4NCgqZk4hIigkIiY1aCQhIiI3JCQiKy1JTmdOISIoJCImP2gkISIiNyQkIitcX3RnTiEiKCQiJkloJCEiIjckJCIrPng2aE4hIigkIiZTaCQhIiI3JCQiKzkvXWhOISIoJCImXWgkISIiNyQkIitNTCk9YyQhIigkIiZnaCQhIiI3JCQiKyJbbUFjJCEiKCQiJnFoJCEiIjckJCIrYilcRWMkISIoJCImIT1PISIiNyQkIitlTS5qTiEiKCQiJiE+TyEiIjckJCIrIkg8TWMkISIoJCImK2kkISIiNyQkIithOCFRYyQhIigkIiY1aSQhIiI3JCQiKmwmPWtOISInJCImP2kkISIiNyQkIit5LGRrTiEiKCQiJklpJCEiIjckJCIrVFwmXGMkISIoJCImU2kkISIiNyQkIitRKlJgYyQhIigkIiZdaSQhIiI3JCQiK3Nec2xOISIoJCImZ2kkISIiNyQkIitWMTZtTiEiKCQiJnFpJCEiIjckJCIrYGpcbU4hIigkIiYhR08hIiI3JCQiKy1CKW9jJCEiKCQiJiFITyEiIjckJCIrI1xvc2MkISIoJCImK2okISIiNyQkIitDXGxuTiEiKCQiJjVqJCEiIjckJCIrKmZUIW9OISIoJCImP2okISIiNyQkIis9Jkclb04hIigkIiZJaiQhIiI3JCQiKyNvOilvTiEiKCQiJlNqJCEiIjckJCIrJDQuI3BOISIoJCImXWokISIiNyQkIitfMmZwTiEiKCQiJmdqJCEiIjckJCIrZid5KnBOISIoJCImcWokISIiNyQkIis8b09xTiEiKCQiJiFRTyEiIjckJCIrRV92cU4hIigkIiYhUk8hIiI3JCQiKygpUTlyTiEiKCQiJitrJCEiIjckJCIrLUdgck4hIigkIiY1ayQhIiI3JCQiK3I+Iz5kJCEiKCQiJj9rJCEiIjckJCIrKFI2QmQkISIoJCImSWskISIiNyQkIisiMyxGZCQhIigkIiZTayQhIiI3JCQiK0E1NHROISIoJCImXWskISIiNyQkIitDN1t0TiEiKCQiJmdrJCEiIjckJCIrKG9yUWQkISIoJCImcWskISIiNyQkIis3Q0V1TiEiKCQiJiFbTyEiIjckJCIrLE1sdU4hIigkIiYhXE8hIiI3JCQiK2JZL3ZOISIoJCImK2wkISIiNyQkIit2aFZ2TiEiKCQiJjVsJCEiIjckJCIranojZWQkISIoJCImP2wkISIiNyQkIiotP2lkJCEiJyQiJklsJCEiIjckJCIrWkJod04hIigkIiZTbCQhIiI3JCQiK1hcK3hOISIoJCImXWwkISIiNyQkIis7eVJ4TiEiKCQiJmdsJCEiIjckJCIraTR6eE4hIigkIiZxbCQhIiI3JCQiKyRRJT15TiEiKCQiJiFlTyEiIjckJCIrIjN5JnlOISIoJCImIWZPISIiNyQkIitkPygqeU4hIigkIiYrbSQhIiI3JCQiKzhqT3pOISIoJCImNW0kISIiNyQkIiomM3d6TiEiJyQiJj9tJCEiIjckJCIqbmIsZSQhIickIiZJbSQhIiI3JCQiK3QyYiFlJCEiKCQiJlNtJCEiIjckJCIraWglNGUkISIoJCImXW0kISIiNyQkIitRPU0iZSQhIigkIiZnbSQhIiI3JCQiKy15dCJlJCEiKCQiJnFtJCEiIjckJCIrY1M4I2UkISIoJCImIW9PISIiNyQkIikxYCNlJCEiJiQiJiFwTyEiIjckJCIrUXUjSGUkISIoJCImK24kISIiNyQkIitwWEskZSQhIigkIiY1biQhIiI3JCQiKycqPnMkZSQhIigkIiY/biQhIiI3JCQiK0AoPlRlJCEiKCQiJkluJCEiIjckJCIrVnheJWUkISIoJCImU24kISIiNyQkIittZyJcZSQhIigkIiZdbiQhIiI3JCQiKyJwOWBlJCEiKCQiJmduJCEiIjckJCIrPk9yJmUkISIoJCImcW4kISIiNyQkIitfRzYnZSQhIigkIiYheU8hIiI3JCQiKyJSN2xlJCEiKCQiJiF6TyEiIjckJCIrUUEicGUkISIoJCImK28kISIiNyQkIismUjd0ZSQhIigkIiY1byQhIiI3JCQiK2pHcihlJCEiKCQiJj9vJCEiIjckJCIrVk82KWUkISIoJCImSW8kISIiNyQkIitRWl4pZSQhIigkIiZTbyQhIiI3JCQiK1xoIiopZSQhIigkIiZdbyQhIiI3JCQiK3l5SiplJCEiKCQiJmdvJCEiIjckJCIrRSo+KCplJCEiKCQiJnFvJCEiIjckJCIrJkhBLGYkISIoJCImISlvJCEiIjckJCIrKClcXyFmJCEiKCQiJiEqbyQhIiI3JCQiKy4hRzRmJCEiKCQiJitwJCEiIjckJCIrWThMImYkISIoJCImNXAkISIiNyQkIis7XXQiZiQhIigkIiY/cCQhIiI3JCQiKzshUkBmJCEiKCQiJklwJCEiIjckJCIrWkxhI2YkISIoJCImU3AkISIiNyQkIis2IVtIZiQhIigkIiZdcCQhIiI3JCQiKzZJTiRmJCEiKCQiJmdwJCEiIjckJCIrWiRlUGYkISIoJCImcXAkISIiNyQkIitAUzslZiQhIigkIiYhKXAkISIiNyQkIitPK2QlZiQhIigkIiYhKnAkISIiNyQkIiskUndcZiQhIigkIiYrcSQhIiI3JCQiKyU0JFEmZiQhIigkIiY1cSQhIiI3JCQiK1QseiZmJCEiKCQiJj9xJCEiIjckJCIrTnY+J2YkISIoJCImSXEkISIiNyQkIipHMG1mJCEiJyQiJlNxJCEiIjckJCIrdkwsKGYkISIoJCImXXEkISIiNyQkIitEPVUoZiQhIigkIiZncSQhIiI3JCQiK0gxJHlmJCEiKCQiJnFxJCEiIjckJCIrInpSIylmJCEiKCQiJiEzUCEiIjckJCIrOCRcJylmJCEiKCQiJiE0UCEiIjckJCIrJj5mISpmJCEiKCQiJityJCEiIjckJCIrVCVwJSpmJCEiKCQiJjVyJCEiIjckJCIrXyspKSpmJCEiKCQiJj9yJCEiIjckJCIqLiJIK08hIickIiZJciQhIiI3JCQiK3lCcStPISIoJCImU3IkISIiNyQkIispNDk2ZyQhIigkIiZdciQhIiI3JCQiKj5FOmckISInJCImZ3IkISIiNyQkIitmJ1E+ZyQhIigkIiZxciQhIiI3JCQiKzA6Ti1PISIoJCImIT1QISIiNyQkIitKWnctTyEiKCQiJiE+UCEiIjckJCIrUSR5SmckISIoJCImK3MkISIiNyQkIipMI2YuTyEiJyQiJjVzJCEiIjckJCIrNG4rL08hIigkIiY/cyQhIiI3JCQiK3Y5VS9PISIoJCImSXMkISIiNyQkIitMbSRbZyQhIigkIiZTcyQhIiI3JCQiKyQ9X19nJCEiKCQiJl1zJCEiIjckJCIrSCJvY2ckISIoJCImZ3MkISIiNyQkIitzVzMxTyEiKCQiJnFzJCEiIjckJCIrOjddMU8hIigkIiYhR1AhIiI3JCQiKk89cGckISInJCImIUhQISIiNyQkIis0ZkwyTyEiKCQiJit0JCEiIjckJCIrbFF2Mk8hIigkIiY1dCQhIiI3JCQiKkJzIjNPISInJCImP3QkISIiNyQkIisyNWYzTyEiKCQiJkl0JCEiIjckJCIrKD41ITRPISIoJCImU3QkISIiNyQkIisvKUglNE8hIigkIiZddCQhIiI3JCQiK0gpXCk0TyEiKCQiJmd0JCEiIjckJCIrdy1GNU8hIigkIiZxdCQhIiI3JCQiK1k2cDVPISIoJCImIVFQISIiNyQkIitWQzY2TyEiKCQiJiFSUCEiIjckJCIrb1RgNk8hIigkIiYrdSQhIiI3JCQiK0RqJj5oJCEiKCQiJjV1JCEiIjckJCIrOyp5QmgkISIoJCImP3UkISIiNyQkIitWPiFHaCQhIigkIiZJdSQhIiI3JCQiKzRhQThPISIoJCImU3UkISIiNyQkIis7JFxPaCQhIigkIiZddSQhIiI3JCQiK3BPMjlPISIoJCImZ3UkISIiNyQkIitvJSlcOU8hIigkIiZxdSQhIiI3JCQiKzxQI1xoJCEiKCQiJiFbUCEiIjckJCIrPSVcYGgkISIoJCImIVxQISIiNyQkIit2Yng6TyEiKCQiJit2JCEiIjckJCIqPi1paCQhIickIiY1diQhIiI3JCQiK20jSG1oJCEiKCQiJj92JCEiIjckJCIrMG8wPE8hIigkIiZJdiQhIiI3JCQiKzZbWzxPISIoJCImU3YkISIiNyQkIisnRzh6aCQhIigkIiZddiQhIiI3JCQiK01BTT1PISIoJCImZ3YkISIiNyQkIitkO3g9TyEiKCQiJnF2JCEiIjckJCIrZjo/Pk8hIigkIiYhZVAhIiI3JCQiK1Q+aj5PISIoJCImIWZQISIiNyQkIiszRzE/TyEiKCQiJit3JCEiIjckJCIraVRcP08hIigkIiY1dyQhIiI3JCQiKzJnIzRpJCEiKCQiJj93JCEiIjckJCIrWCRlOGkkISIoJCImSXckISIiNyQkIit6NnpATyEiKCQiJlN3JCEiIjckJCIrOVhBQU8hIigkIiZddyQhIiI3JCQiK14kZUVpJCEiKCQiJmd3JCEiIjckJCIrJXAjNEJPISIoJCImcXckISIiNyQkIitadl9CTyEiKCQiJiFvUCEiIjckJCIrOEgnUmkkISIoJCImIXBQISIiNyQkIismeilSQ08hIigkIiYreCQhIiI3JCQiKyc+TltpJCEiKCQiJjV4JCEiIjckJCIqN3NfaSQhIickIiY/eCQhIiI3JCQiKmQ0ZGkkISInJCImSXgkISIiNyQkIipiWmhpJCEiJyQiJlN4JCEiIjckJCIraWdlRU8hIigkIiZdeCQhIiI3JCQiKzdeLUZPISIoJCImZ3gkISIiNyQkIissWllGTyEiKCQiJnF4JCEiIjckJCIrTVshemkkISIoJCImIXlQISIiNyQkIis6Yk1HTyEiKCQiJiF6UCEiIjckJCIrWW55R08hIigkIiYreSQhIiI3JCQiK0smRyNITyEiKCQiJjV5JCEiIjckJCIreDNuSE8hIigkIiY/eSQhIiI3JCQiKyR5OCxqJCEiKCQiJkl5JCEiIjckJCIrY3NiSU8hIigkIiZTeSQhIiI3JCQiKylILDVqJCEiKCQiJl15JCEiIjckJCIrOWZXSk8hIigkIiZneSQhIiI3JCQiKzM2Kj1qJCEiKCQiJnF5JCEiIjckJCIrJClvTEtPISIoJCImISl5JCEiIjckJCIrVkt5S08hIigkIiYhKnkkISIiNyQkIiskPklLaiQhIigkIiYreiQhIiI3JCQiK094bkxPISIoJCImNXokISIiNyQkIit4ZTdNTyEiKCQiJj96JCEiIjckJCIrQFlkTU8hIigkIiZJeiQhIiI3JCQiKihSLU5PISInJCImU3okISIiNyQkIitIUlpOTyEiKCQiJl16JCEiIjckJCIrLlgjZmokISIoJCImZ3okISIiNyQkIisncHZqaiQhIigkIiZxeiQhIiI3JCQiKzd2I29qJCEiKCQiJiEpeiQhIiI3JCQiK2MqenNqJCEiKCQiJiEqeiQhIiI3JCQiK0tJdFBPISIoJCImKyFRISIiNyQkIitYbj1RTyEiKCQiJjUhUSEiIjckJCIrKjRUJ1FPISIoJCImPyFRISIiNyQkIisqNCc0Uk8hIigkIiZJIVEhIiI3JCQiK1w8YlJPISIoJCImUyFRISIiNyQkIitiITMrayQhIigkIiZdIVEhIiI3JCQiK0BdWVNPISIoJCImZyFRISIiNyQkIiteRSM0ayQhIigkIiZxIVEhIiI3JCQiK180UVRPISIoJCImITNRISIiNyQkIitGKlI9ayQhIigkIiYhNFEhIiI3JCQiKyJlKkhVTyEiKCQiJisiUSEiIjckJCIrQCpmRmskISIoJCImNSJRISIiNyQkIiomNEFWTyEiJyQiJj8iUSEiIjckJCIrdUVvVk8hIigkIiZJIlEhIiI3JCQiKyk0WFRrJCEiKCQiJlMiUSEiIjckJCIrRyMzWWskISIoJCImXSJRISIiNyQkIitvPzJYTyEiKCQiJmciUSEiIjckJCIrQ21gWE8hIigkIiZxIlEhIiI3JCQiKy0+K1lPISIoJCImIT1RISIiNyQkIisyellZTyEiKCQiJiE+USEiIjckJCIrWFkkcGskISIoJCImKyNRISIiNyQkIio3LXVrJCEiJyQiJjUjUSEiIjckJCIqTXF5ayQhIickIiY/I1EhIiI3JCQiKkpSJFtPISInJCImSSNRISIiNyQkIitOITQpW08hIigkIiZTI1EhIiI3JCQiK0AmeiNcTyEiKCQiJl0jUSEiIjckJCIrdjJ2XE8hIigkIiZnI1EhIiI3JCQiKy5HQV1PISIoJCImcSNRISIiNyQkIipoJnBdTyEiJyQiJiFHUSEiIjckJCIrLiNwNmwkISIoJCImIUhRISIiNyQkIispZVY7bCQhIigkIiYrJFEhIiI3JCQiK3IoPUBsJCEiKCQiJjUkUSEiIjckJCIqdyVmX08hIickIiY/JFEhIiI3JCQiK2Y6MmBPISIoJCImSSRRISIiNyQkIit4IlxObCQhIigkIiZTJFEhIiI3JCQiKz53LWFPISIoJCImXSRRISIiNyQkIisjKm9dYU8hIigkIiZnJFEhIiI3JCQiKy9xKVxsJCEiKCQiJnEkUSEiIjckJCIqJ3pZYk8hIickIiYhUVEhIiI3JCQiK3AoXGZsJCEiKCQiJiFSUSEiIjckJCIrT0NWY08hIigkIiYrJVEhIiI3JCQiKihmInBsJCEiJyQiJjUlUSEiIjckJCIreC5TZE8hIigkIiY/JVEhIiI3JCQiK21jKXlsJCEiKCQiJkklUSEiIjckJCIrVT1QZU8hIigkIiZTJVEhIiI3JCQiKzoqZSllTyEiKCQiJl0lUSEiIjckJCIrIipvTWZPISIoJCImZyVRISIiNyQkIit5ZCQpZk8hIigkIiZxJVEhIiI3JCQiKyZlRC5tJCEiKCQiJiFbUSEiIjckJCIrPWoiM20kISIoJCImIVxRISIiNyQkIisoKXpJaE8hIigkIiYrJlEhIiI3JCQiKylmKz1tJCEiKCQiJjUmUSEiIjckJCIraVRIaU8hIigkIiY/JlEhIiI3JCQiKyZvKXlpTyEiKCQiJkkmUSEiIjckJCIreFRHak8hIigkIiZTJlEhIiI3JCQiK1gxeWpPISIoJCImXSZRISIiNyQkIisqNHlVbSQhIigkIiZnJlEhIiI3JCQiK1tseGtPISIoJCImcSZRISIiNyQkIissZ0ZsTyEiKCQiJiFlUSEiIjckJCIrbWt4bE8hIigkIiYhZlEhIiI3JCQiK196Rm1PISIoJCImKydRISIiNyQkIipaIXltTyEiJyQiJjUnUSEiIjckJCIrSFNHbk8hIigkIiY/J1EhIiI3JCQiK1AnKXluTyEiKCQiJkknUSEiIjckJCIrMVZIb08hIigkIiZTJ1EhIiI3JCQiK1c1ISlvTyEiKCQiJl0nUSEiIjckJCIraikzJHBPISIoJCImZydRISIiNyQkIityeCIpcE8hIigkIiZxJ1EhIiI3JCQiK3p4S3FPISIoJCImIW9RISIiNyQkIispKilRM24kISIoJCImIXBRISIiNyQkIitSNk5yTyEiKCQiJisoUSEiIjckJCIrN1gnPW4kISIoJCImNShRISIiNyQkIitGIXpCbiQhIigkIiY/KFEhIiI3JCQiKyhwJSpHbiQhIigkIiZJKFEhIiI3JCQiK0s6VHRPISIoJCImUyhRISIiNyQkIitXJkhSbiQhIigkIiZdKFEhIiI3JCQiK1goW1duJCEiKCQiJmcoUSEiIjckJCIrWCJwXG4kISIoJCImcShRISIiNyQkIitlMlx2TyEiKCQiJiF5USEiIjckJCIrJmY4Z24kISIoJCImIXpRISIiNyQkIitvd2B3TyEiKCQiJispUSEiIjckJCIqKkgxeE8hIickIiY1KVEhIiI3JCQiK3UmKmV4TyEiKCQiJj8pUSEiIjckJCIrTHU2eU8hIigkIiZJKVEhIiI3JCQiK3psa3lPISIoJCImUylRISIiNyQkIitFcTx6TyEiKCQiJl0pUSEiIjckJCIrKXkzKHpPISIoJCImZylRISIiNyQkIit5PUMhbyQhIigkIiZxKVEhIiI3JCQiKkp3Mm8kISInJCImISkpUSEiIjckJCIrKjQ3OG8kISIoJCImISopUSEiIjckJCIrZiNcPW8kISIoJCImKypRISIiNyQkIisveVEjbyQhIigkIiY1KlEhIiI3JCQiK1x4I0hvJCEiKCQiJj8qUSEiIjckJCIqNnBNbyQhIickIiZJKlEhIiI3JCQiKy0+LCVvJCEiKCQiJlMqUSEiIjckJCIqOWNYbyQhIickIiZdKlEhIiI3JCQiK1Q9NSZvJCEiKCQiJmcqUSEiIjckJCIqLVxjbyQhIickIiZxKlEhIiI3JCQiKyVwKD4nbyQhIigkIiYhKSpRISIiNyQkIisiKXl1J28kISIoJCImISoqUSEiIjckJCIrJ2YqSChvJCEiKCQiJishUiEiIjckJCIrZEcmeW8kISIoJCImNSFSISIiNyQkIiskbzIlKW8kISIoJCImPyFSISIiNyQkIio0ayopbyQhIickIiZJIVIhIiI3JCQiKyg0QSYqbyQhIigkIiZTIVIhIiI3JCQiK0I8MyFwJCEiKCQiJl0hUiEiIjckJCIrJylIayFwJCEiKCQiJmchUiEiIjckJCIrMmY/InAkISIoJCImcSFSISIiNyQkIisuMHgicCQhIigkIiYhM1IhIiI3JCQiKyh6T0JwJCEiKCQiJiE0UiEiIjckJCIrMlshSHAkISIoJCImKyJSISIiNyQkIithWFokcCQhIigkIiY1IlIhIiI3JCQiK2hnLyVwJCEiKCQiJj8iUiEiIjckJCIrWiQ+WXAkISIoJCImSSJSISIiNyQkIitPVz4mcCQhIigkIiZTIlIhIiI3JCQiK1w4eCZwJCEiKCQiJl0iUiEiIjckJCIqNl1qcCQhIickIiZnIlIhIiI3JCQiK1QyJHBwJCEiKCQiJnEiUiEiIjckJCIrbUteKHAkISIoJCImIT1SISIiNyQkIis0eDQpcCQhIigkIiYhPlIhIiI3JCQiKyY0JW8pcCQhIigkIiYrI1IhIiI3JCQiKlhzIypwJCEiJyQiJjUjUiEiIjckJCIrKHppKSpwJCEiKCQiJj8jUiEiIjckJCIrbF5YK1AhIigkIiZJI1IhIiI3JCQiK3omXDVxJCEiKCQiJlMjUiEiIjckJCIrbmdrLFAhIigkIiZdI1IhIiI3JCQiK2NZQy1QISIoJCImZyNSISIiNyQkIit2YCVHcSQhIigkIiZxI1IhIiI3JCQiK2AjW01xJCEiKCQiJiFHUiEiIjckJCIrPkwwL1AhIigkIiYhSFIhIiI3JCQiKy4xbS9QISIoJCImKyRSISIiNyQkIitQLEYwUCEiKCQiJjUkUiEiIjckJCIrXz4pZXEkISIoJCImPyRSISIiNyQkIit6Z1wxUCEiKCQiJkkkUiEiIjckJCIrYEQ2MlAhIigkIiZTJFIhIiI3JCQiKzE5dDJQISIoJCImXSRSISIiNyQkIit0RU4zUCEiKCQiJmckUiEiIjckJCIrKlF3KjNQISIoJCImcSRSISIiNyQkIipmLSc0UCEiJyQiJiFRUiEiIjckJCIrOThCNVAhIigkIiYhUlIhIiI3JCQiKydmaTNyJCEiKCQiJislUiEiIjckJCIreGtcNlAhIigkIiY1JVIhIiI3JCQiKyYqSDg3UCEiKCQiJj8lUiEiIjckJCIrIz5zRnIkISIoJCImSSVSISIiNyQkIisyVFQ4UCEiKCQiJlMlUiEiIjckJCIrJHllU3IkISIoJCImXSVSISIiNyQkIitsaXE5UCEiKCQiJmclUiEiIjckJCIrJ2ZjYHIkISIoJCImcSVSISIiNyQkIitAKTRnciQhIigkIiYhW1IhIiI3JCQiKykpZm07UCEiKCQiJiFcUiEiIjckJCIrV15LPFAhIigkIiYrJlIhIiI3JCQiK1F0KXpyJCEiKCQiJjUmUiEiIjckJCIrQEVsPVAhIigkIiY/JlIhIiI3JCQiK1c1Sz5QISIoJCImSSZSISIiNyQkIiptIyoqPlAhIickIiZTJlIhIiI3JCQiK0J2bT9QISIoJCImXSZSISIiNyQkIipwWDhzJCEiJyQiJmcmUiEiIjckJCIrPHMtQVAhIigkIiZxJlIhIiI3JCQiK2pAckFQISIoJCImIWVSISIiNyQkIipmK01zJCEiJyQiJiFmUiEiIjckJCIrZUQ0Q1AhIigkIiYrJ1IhIiI3JCQiK0siKXlDUCEiKCQiJjUnUiEiIjckJCIreXRbRFAhIigkIiY/J1IhIiI3JCQiK2ouPkVQISIoJCImSSdSISIiNyQkIitjcipvcyQhIigkIiZTJ1IhIiI3JCQiKiR5Z0ZQISInJCImXSdSISIiNyQkIitkQ0tHUCEiKCQiJmcnUiEiIjckJCIrOjYvSFAhIigkIiZxJ1IhIiI3JCQiKilRd0hQISInJCImIW9SISIiNyQkIitMM1xJUCEiKCQiJiFwUiEiIjckJCIrZT9BSlAhIigkIiYrKFIhIiI3JCQiK1J3Jj50JCEiKCQiJjUoUiEiIjckJCIrbXdwS1AhIigkIiY/KFIhIiI3JCQiK0hBV0xQISIoJCImSShSISIiNyQkIitBOT5NUCEiKCQiJlMoUiEiIjckJCIrVmAlXHQkISIoJCImXShSISIiNyQkIio0L2R0JCEiJyQiJmcoUiEiIjckJCIrcHhZT1AhIigkIiZxKFIhIiI3JCQiKyhbT3N0JCEiKCQiJiF5UiEiIjckJCIrYC4sUVAhIigkIiYhelIhIiI3JCQiKyRbKnlRUCEiKCQiJispUiEiIjckJCIrJipSZFJQISIoJCImNSlSISIiNyQkIis3U09TUCEiKCQiJj8pUiEiIjckJCIraCdmNnUkISIoJCImSSlSISIiNyQkIit1NSc+dSQhIigkIiZTKVIhIiI3JCQiKylRb0Z1JCEiKCQiJl0pUiEiIjckJCIrVzxlVlAhIigkIiZnKVIhIiI3JCQiKkgsV3UkISInJCImcSlSISIiNyQkIit6ckFYUCEiKCQiJiEpKVIhIiI3JCQiK28mZmd1JCEiKCQiJiEqKVIhIiI3JCQiK0QnKSpvdSQhIigkIiYrKlIhIiI3JCQiKz5YdVpQISIoJCImNSpSISIiNyQkIipWKGZbUCEiJyQiJj8qUiEiIjckJCIrVnZYXFAhIigkIiZJKlIhIiI3JCQiK2BdS11QISIoJCImUypSISIiNyQkIitoLD9eUCEiKCQiJl0qUiEiIjckJCIreUkzX1AhIigkIiZnKlIhIiI3JCQiK0NTKEh2JCEiKCQiJnEqUiEiIjckJCIrR0soUXYkISIoJCImISkqUiEiIjckJCIrSzR5YVAhIigkIiYhKipSISIiNyQkIismUShwYlAhIigkIiYrKyUhIiI3JCQiKiZHaWNQISInJCImNSslISIiNyQkIisud2JkUCEiKCQiJj8rJSEiIjckJCIrTD5dZVAhIigkIiZJKyUhIiI3JCQiK1VoWGZQISIoJCImUyslISIiNyQkIitcMFVnUCEiKCQiJl0rJSEiIjckJCIrKFsmUmhQISIoJCImZyslISIiNyQkIiszOFFpUCEiKCQiJnErJSEiIjckJCIrIlF5THckISIoJCImITNTISIiNyQkIispNChRa1AhIigkIiYhNFMhIiI3JCQiK3B5U2xQISIoJCImKywlISIiNyQkIitHNldtUCEiKCQiJjUsJSEiIjckJCIrT3RbblAhIigkIiY/LCUhIiI3JCQiK3pwYW9QISIoJCImSSwlISIiNyQkIityMGlwUCEiKCQiJlMsJSEiIjckJCIrZiczMngkISIoJCImXSwlISIiNyQkIitCPSI9eCQhIigkIiZnLCUhIiI3JCQiKyJvSUh4JCEiKCQiJnEsJSEiIjckJCIrIyplMXVQISIoJCImIT1TISIiNyQkIitiIj1feCQhIigkIiYhPlMhIiI3JCQiK0AjKVF3UCEiKCQiJistJSEiIjckJCIrJCpvZHhQISIoJCImNS0lISIiNyQkIitIXXl5UCEiKCQiJj8tJSEiIjckJCIrX04sIXkkISIoJCImSS0lISIiNyQkIismKlF5InkkISIoJCImUy0lISIiNyQkIispPWdIeSQhIigkIiZdLSUhIiI3JCQiKyJcY1R5JCEiKCQiJmctJSEiIjckJCIrUVFQJnkkISIoJCImcS0lISIiNyQkIipOOG15JCEiJyQiJiFHUyEiIjckJCIraSFbT3gkISIoJCImIUhTISIiNyQkIiteUTsqeSQhIigkIiYrLiUhIiI3JCQiK0B3WiF6JCEiKCQiJjUuJSEiIjckJCIrWSI+PXokISIoJCImPy4lISIiNyQkIio9IT4keiQhIickIiZJLiUhIiI3JCQiK2JFZiV6JCEiKCQiJlMuJSEiIjckJCIrPChHZ3okISIoJCImXS4lISIiNyQkIip2K3Z6JCEiJyQiJmcuJSEiIjckJCIqVTYhKnokISInJCImcS4lISIiNyQkIitBUGMrUSEiKCQiJiFRUyEiIjckJCIqKFtQJXkkISInJCImIVJTISIiNyQkIip0OWJ5JCEiJyQiJisvJSEiIi0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2JTcnNyQkIitlYGhrUSEiKCQiKyVHcCg9OCEiKDckJCIrVENXPVghIigkIiYrKyIhIiI3JCQiKj4mKlxUIyEiJyQiJisrIiEiIjckJCIqPiYqXFQjISInJCIrJUdwKD04ISIoNyQkIitlYGhrUSEiKCQiKyVHcCg9OCEiKC0lJkNPTE9SRzYmJSRSR0JHJCIpMik0WCYhIikkIiIhISIiJCIiISEiIi0lKlRISUNLTkVTU0c2IyIiIy0lJ0NVUlZFU0c2JTdKNyQkIiskKXomUnUiISIoJCIkKychIiI3JCQiK1E0Zy4/ISIoJCIlKzshIiI3JCQiK2VmcmRAISIoJCIlK0UhIiI3JCQiK1YpR0lGIyEiKCQiJStPISIiNyQkIiomKTN0TyMhIickIiUrWSEiIjckJCIrJypRO1tDISIoJCIlK2MhIiI3JCQiK2lpaD5EISIoJCIlK20hIiI3JCQiK2JSMiVlIyEiKCQiJSt3ISIiNyQkIitVTDVWRSEiKCQiJSsnKSEiIjckJCIrVmd5KHAjISIoJCIlKycqISIiNyQkIipgLipbRiEiJyQiJisxIiEiIjckJCIrKSozLyh6IyEiKCQiJis7IiEiIjckJCIrbSFcRSVHISIoJCImK0UiISIiNyQkIitIUzMnKUchIigkIiYrTyIhIiI3JCQiK3pFakZIISIoJCImK1kiISIiNyQkIis9L2BuSCEiKCQiJitjIiEiIjckJCIrSk4oZiskISIoJCImK20iISIiNyQkIitHIkdKLyQhIigkIiYrdyIhIiI3JCQiK2RuOHpJISIoJCImKyc9ISIiNyQkIitDTTc5SiEiKCQiJisnPiEiIjckJCIqWyg+W0ohIickIiYrMSMhIiI3JCQiKnNjOT0kISInJCImKzsjISIiNyQkIitDKiopUkAkISIoJCImK0UjISIiNyQkIisvIXplQyQhIigkIiYrTyMhIiI3JCQiKy40P3hLISIoJCImK1kjISIiNyQkIit0JEghM0whIigkIiYrYyMhIiI3JCQiK0FuVlFMISIoJCImK20jISIiNyQkIismbyZcb0whIigkIiYrdyMhIiI3JCQiK2w6RylSJCEiKCQiJisnRyEiIjckJCIrdlsoeVUkISIoJCImKydIISIiNyQkIitSW09kTSEiKCQiJisxJCEiIjckJCIrUlYmb1skISIoJCImKzskISIiNyQkIitPdFk7TiEiKCQiJitFJCEiIjckJCIrVTJPWU4hIigkIiYrTyQhIiI3JCQiKzladXdOISIoJCImK1kkISIiNyQkIisnRz96ZyQhIigkIiYrYyQhIiI3JCQiK1ptTlNPISIoJCImK20kISIiNyQkIismKlIoW24kISIoJCImK3ckISIiNyQkIitVMz04UCEiKCQiJisnUSEiIjckJCIrTV1BZ1AhIigkIiYrJ1IhIiItJSZDT0xPUkc2JiUkUkdCRyQiKGZxayYhIigkIilNTEwkKiEiKSQiKGZxayYhIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNiU3SjckJCIraTcheic+ISIoJCIkKychIiI3JCQiKyM+Klw4QSEiKCQiJSs7ISIiNyQkIitqQHZlQiEiKCQiJStFISIiNyQkIigxclkjISIlJCIlK08hIiI3JCQiKyYpW1hiRCEiKCQiJStZISIiNyQkIitPLS5KRSEiKCQiJStjISIiNyQkIitZU2wocCMhIigkIiUrbSEiIjckJCIrUE5oZEYhIigkIiUrdyEiIjckJCIrNGVSN0chIigkIiUrJykhIiI3JCQiK2NyLWpHISIoJCIlKycqISIiNyQkIitaJlstIkghIigkIiYrMSIhIiI3JCQiK15VaGFIISIoJCImKzsiISIiNyQkIitYNGInKkghIigkIiYrRSIhIiI3JCQiKykqXFJPSSEiKCQiJitPIiEiIjckJCIrKilwVHVJISIoJCImK1kiISIiNyQkIis+JVEzNiQhIigkIiYrYyIhIiI3JCQiK1lNJWU5JCEiKCQiJittIiEiIjckJCIrUnRlekohIigkIiYrdyIhIiI3JCQiK0hGPzdLISIoJCImKyc9ISIiNyQkIitFViFRQyQhIigkIiYrJz4hIiI3JCQiK2hEXHVLISIoJCImKzEjISIiNyQkIipZY1ZJJCEiJyQiJis7IyEiIjckJCIrb2ZaTEwhIigkIiYrRSMhIiI3JCQiKykpUSM+TyQhIigkIiYrTyMhIiI3JCQiK1d2dypRJCEiKCQiJitZIyEiIjckJCIrJ0hxcVQkISIoJCImK2MjISIiNyQkIitwSCpRVyQhIigkIiYrbSMhIiI3JCQiKz1gSHFNISIoJCImK3cjISIiNyQkIitUd0wnXCQhIigkIiYrJ0chIiI3JCQiKydwIzNBTiEiKCQiJisnSCEiIjckJCIrciIpZlpOISIoJCImKzEkISIiNyQkIis4LCdIZCQhIigkIiYrOyQhIiI3JCQiKzchZSMpZiQhIigkIiYrRSQhIiI3JCQiKyYqR2dCTyEiKCQiJitPJCEiIjckJCIrWDY5XE8hIigkIiYrWSQhIiI3JCQiK2wsM3ZPISIoJCImK2MkISIiNyQkIitPN3UsUCEiKCQiJittJCEiIjckJCIrIj0mb0hQISIoJCImK3ckISIiNyQkIitMUDNnUCEiKCQiJisnUSEiIjckJCIrNHZOJ3okISIoJCImKydSISIiLSUmQ09MT1JHNiYlJFJHQkckIihmcWsmISIoJCIpTUxMJCohIikkIihmcWsmISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzYlN0o3JCQiK1VYJT0+IyEiKCQiJCsnISIiNyQkIitZdVJCQyEiKCQiJSs7ISIiNyQkIituJCl5ZkQhIigkIiUrRSEiIjckJCIrY0o9aEUhIigkIiUrTyEiIjckJCIrQDRnVkYhIigkIiUrWSEiIjckJCIrd2wqUSJHISIoJCIlK2MhIiI3JCQiK0o9cHZHISIoJCIlK20hIiI3JCQiKz5KOkpIISIoJCIlK3chIiI3JCQiK3YjKW8iKUghIigkIiUrJykhIiI3JCQiK28jbyNHSSEiKCQiJSsnKiEiIjckJCIrak5mckkhIigkIiYrMSIhIiI3JCQiKy93PTdKISIoJCImKzsiISIiNyQkIitDR1hdSiEiKCQiJitFIiEiIjckJCIrbWZxJz0kISIoJCImK08iISIiNyQkIispSCw3QSQhIigkIiYrWSIhIiI3JCQiK0BrOWFLISIoJCImK2MiISIiNyQkIitpTHImRyQhIigkIiYrbSIhIiI3JCQiK15sLztMISIoJCImK3ciISIiNyQkIissKG9fTSQhIigkIiYrJz0hIiI3JCQiK0ZfW3RMISIoJCImKyc+ISIiNyQkIitVd3krTSEiKCQiJisxIyEiIjckJCIrKj5jc1UkISIoJCImKzsjISIiNyQkIis3PydIWCQhIigkIiYrRSMhIiI3JCQiK3Mob3paJCEiKCQiJitPIyEiIjckJCIrJz1NQl0kISIoJCImK1kjISIiNyQkIipBNmhfJCEiJyQiJitjIyEiIjckJCIrOyNcJFxOISIoJCImK20jISIiNyQkIiomXDRzTiEiJyQiJit3IyEiIjckJCIrO1BSJWYkISIoJCImKydHISIiNyQkIis8MEg7TyEiKCQiJisnSCEiIjckJCIrLzokeWokISIoJCImKzEkISIiNyQkIispKWUxZk8hIigkIiYrOyQhIiI3JCQiKylvWytvJCEiKCQiJitFJCEiIjckJCIrW10lM3EkISIoJCImK08kISIiNyQkIit4dmBAUCEiKCQiJitZJCEiIjckJCIrVitDVVAhIigkIiYrYyQhIiI3JCQiK0VlN2pQISIoJCImK20kISIiNyQkIitvalwleSQhIigkIiYrdyQhIiI3JCQiK0JtKXAhUSEiKCQiJisnUSEiIjckJCIrJikqKltLUSEiKCQiJisnUiEiIi0lJkNPTE9SRzYmJSRSR0JHJCIoZnFrJiEiKCQiKU1MTCQqISIpJCIoZnFrJiEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2JTdKNyQkIitAeXk6QyEiKCQiJCsnISIiNyQkIilkSExFISImJCIlKzshIiI3JCQiK3NYIzN3IyEiKCQiJStFISIiNyQkIis4LkViRyEiKCQiJStPISIiNyQkIitjcHVKSCEiKCQiJStZISIiNyQkIis6SHcnKkghIigkIiUrYyEiIjckJCIrOidIUDAkISIoJCIlK20hIiI3JCQiKy1GcC9KISIoJCIlK3chIiI3JCQiK1UyKTQ6JCEiKCQiJSsnKSEiIjckJCIrIlE0Tj4kISIoJCIlKycqISIiNyQkIiplUUhCJCEiJyQiJisxIiEiIjckJCIrZDR3cEshIigkIiYrOyIhIiI3JCQiKy5aTi9MISIoJCImK0UiISIiNyQkIitOcCxQTCEiKCQiJitPIiEiIjckJCIrMmMpek8kISIoJCImK1kiISIiNyQkIitBV1goUiQhIigkIiYrYyIhIiI3JCQiK3lLZURNISIoJCImK20iISIiNyQkIitqZF1fTSEiKCQiJit3IiEiIjckJCIrc1lMeU0hIigkIiYrJz0hIiI3JCQiK0hoOy5OISIoJCImKyc+ISIiNyQkIitCRjNGTiEiKCQiJisxIyEiIjckJCIrUmY6XU4hIigkIiYrOyMhIiI3JCQiK2MhW0NkJCEiKCQiJitFIyEiIjckJCIrY08sJWYkISIoJCImK08jISIiNyQkIitGMyFcaCQhIigkIiYrWSMhIiI3JCQiK1dAOk5PISIoJCImK2MjISIiNyQkIitqYSFbbCQhIigkIiYrbSMhIiI3JCQiKyNlJSpRbiQhIigkIiYrdyMhIiI3JCQiKyN6XENwJCEiKCQiJisnRyEiIjckJCIrUSQpXDVQISIoJCImKydIISIiNyQkIitPWzFHUCEiKCQiJisxJCEiIjckJCIrajs8WFAhIigkIiYrOyQhIiI3JCQiK2wkUj13JCEiKCQiJitFJCEiIjckJCIrLHMzeVAhIigkIiYrTyQhIiI3JCQiKzNTJFJ6JCEiKCQiJitZJCEiIjckJCIrQSoqUjRRISIoJCImK2MkISIiNyQkIis7L15DUSEiKCQiJittJCEiIjckJCIrYXZJUlEhIigkIiYrdyQhIiI3JCQiKzgmKilRJlEhIigkIiYrJ1EhIiI3JCQiK2hDaW9RISIoJCImKydSISIiLSUmQ09MT1JHNiYlJFJHQkckIihmcWsmISIoJCIpTUxMJCohIikkIihmcWsmISIoLSUqVEhJQ0tORVNTRzYjIiIhLSUnQ1VSVkVTRzYlN0o3JCQiKTZ0UkUhIiYkIiQrJyEiIjckJCIrYVI+VkchIigkIiUrOyEiIjckJCIreDInPSdIISIoJCIlK0UhIiI3JCQiKlpQJFxJISInJCIlK08hIiI3JCQiKyMqSCopPkohIigkIiUrWSEiIjckJCIrYiNIJ3pKISIoJCIlK2MhIiI3JCQiKXV3SkshIiYkIiUrbSEiIjckJCIrJUdLI3lLISIoJCIlK3chIiI3JCQiKzRLRj9MISIoJCIlKycpISIiNyQkIislXF0oZUwhIigkIiUrJyohIiI3JCQiKydmJEclUiQhIigkIiYrMSIhIiI3JCQiKkpNdFUkISInJCImKzsiISIiNyQkIisjZWMjZU0hIigkIiYrRSIhIiI3JCQiKy56SyhbJCEiKCQiJitPIiEiIjckJCIrOypwWl4kISIoJCImK1kiISIiNyQkIitDQ3dTTiEiKCQiJitjIiEiIjckJCIrJD5gYWMkISIoJCImK20iISIiNyQkIit2XCcqKWUkISIoJCImK3ciISIiNyQkIitXMVM2TyEiKCQiJisnPSEiIjckJCIqLlpHaiQhIickIiYrJz4hIiI3JCQiKy95UGBPISIoJCImKzEjISIiNyQkIit5YzB0TyEiKCQiJis7IyEiIjckJCIpVCQ+cCQhIiYkIiYrRSMhIiI3JCQiKmFlK3IkISInJCImK08jISIiNyQkIitwdVlGUCEiKCQiJitZIyEiIjckJCIrbkk+V1AhIigkIiYrYyMhIiI3JCQiKzQ8RWdQISIoJCImK20jISIiNyQkIis6VXB2UCEiKCQiJit3IyEiIjckJCIrb2VdIXokISIoJCImKydHISIiNyQkIitmaHEvUSEiKCQiJisnSCEiIjckJCIrcCIpSD1RISIoJCImKzEkISIiNyQkIitQdUZKUSEiKCQiJis7JCEiIjckJCIrVCtqVlEhIigkIiYrRSQhIiI3JCQiK2EkSGAmUSEiKCQiJitPJCEiIjckJCIqV0lqJ1EhIickIiYrWSQhIiI3JCQiKywpZmwoUSEiKCQiJitjJCEiIjckJCIrMV0qZSlRISIoJCImK20kISIiNyQkIitUKD1UKlEhIigkIiYrdyQhIiI3JCQiKy5DeitSISIoJCImKydRISIiNyQkIitQXHYvUiEiKCQiJisnUiEiIi0lJkNPTE9SRzYmJSRSR0JHJCIoZnFrJiEiKCQiKU1MTCQqISIpJCIoZnFrJiEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2JTdKNyQkIipRdU8nRyEiJyQiJCsnISIiNyQkIiszQTRgSSEiKCQiJSs7ISIiNyQkIisjKXAqRzskISIoJCIlK0UhIiI3JCQiK0ZZVFZLISIoJCIlK08hIiI3JCQiK0YhUiEzTCEiKCQiJStZISIiNyQkIislZiZcaUwhIigkIiUrYyEiIjckJCIrJT0wKTRNISIoJCIlK20hIiI3JCQiK209eF5NISIoJCIlK3chIiI3JCQiK3ZjYypbJCEiKCQiJSsnKSEiIjckJCIrMjsqUl8kISIoJCIlKycqISIiNyQkIis4J0djYiQhIigkIiYrMSIhIiI3JCQiK2p3IVxlJCEiKCQiJis7IiEiIjckJCIraCVlQGgkISIoJCImK0UiISIiNyQkIitzKVF3aiQhIigkIiYrTyIhIiI3JCQiK0RVYmhPISIoJCImK1kiISIiNyQkIitELzIlbyQhIigkIiYrYyIhIiI3JCQiKzRKSzBQISIoJCImK20iISIiNyQkIisnPUNhcyQhIigkIiYrdyIhIiI3JCQiKzttWVdQISIoJCImKyc9ISIiNyQkIitLel9pUCEiKCQiJisnPiEiIjckJCIrJilHbnpQISIoJCImKzEjISIiNyQkIis9YSZmeiQhIigkIiYrOyMhIiI3JCQiK1csVTZRISIoJCImK0UjISIiNyQkIitETTVFUSEiKCQiJitPIyEiIjckJCIqNk0rJVEhIickIiYrWSMhIiI3JCQiKyIqUkJgUSEiKCQiJitjIyEiIjckJCIrY3pybFEhIigkIiYrbSMhIiI3JCQiK1pRXHhRISIoJCImK3cjISIiNyQkIitWPmMpKVEhIigkIiYrJ0chIiI3JCQiKilSIiopKlEhIickIiYrJ0ghIiI3JCQiKyw6YDNSISIoJCImKzEkISIiNyQkIis3S1E8UiEiKCQiJis7JCEiIjckJCIrPDJVRFIhIigkIiYrRSQhIiI3JCQiKzI6ZEtSISIoJCImK08kISIiNyQkIityb3NRUiEiKCQiJitZJCEiIjckJCIreic+UCVSISIoJCImK2MkISIiNyQkIismZnpzJVIhIigkIiYrbSQhIiI3JCQiK0cqSCpbUiEiKCQiJit3JCEiIjckJCIrJEgmcFpSISIoJCImKydRISIiNyQkIis4dSkzJVIhIigkIiYrJ1IhIiItJSZDT0xPUkc2JiUkUkdCRyQiKGZxayYhIigkIilNTEwkKiEiKSQiKGZxayYhIigtJSpUSElDS05FU1NHNiMiIiEtJSdDVVJWRVNHNiU3SjckJCIrZndoKDMkISIoJCIkKychIiI3JCQiK2gvKkhFJCEiKCQiJSs7ISIiNyQkIisnPUxSTyQhIigkIiUrRSEiIjckJCIrJHkiXFBNISIoJCIlK08hIiI3JCQiK2pdPSdcJCEiKCQiJStZISIiNyQkIitNPk9YTiEiKCQiJStjISIiNyQkIitwSCV5ZSQhIigkIiUrbSEiIjckJCIrWzlKRE8hIigkIiUrdyEiIjckJCIrVSJlKWVPISIoJCIlKycpISIiNyQkIis+RkIqbyQhIigkIiUrJyohIiI3JCQiKmp0cHIkISInJCImKzEiISIiNyQkIis7NVtVUCEiKCQiJis7IiEiIjckJCIqTWdndyQhIickIiYrRSIhIiI3JCQiKiUpXHp5JCEiJyQiJitPIiEiIjckJCIrTSZRJDNRISIoJCImK1kiISIiNyQkIitGJXl0I1EhIigkIiYrYyIhIiI3JCQiK0RJPlhRISIoJCImK20iISIiNyQkIispUiQpPSdRISIoJCImK3ciISIiNyQkIisoZUt2KFEhIigkIiYrJz0hIiI3JCQiK0wpM0EqUSEiKCQiJisnPiEiIjckJCIrbXonZiFSISIoJCImKzEjISIiNyQkIitkXiYpPVIhIigkIiYrOyMhIiI3JCQiKyk9MTQkUiEiKCQiJitFIyEiIjckJCIrNCRbQCVSISIoJCImK08jISIiNyQkIiteMmdfUiEiKCQiJitZIyEiIjckJCIrOVxGaVIhIigkIiYrYyMhIiI3JCQiKy5VPHJSISIoJCImK20jISIiNyQkIit6TUh6UiEiKCQiJit3IyEiIjckJCIrPiE9bSlSISIoJCImKydHISIiNyQkIissPTckKlIhIigkIiYrJ0ghIiI3JCQiK01bdykqUiEiKCQiJisxJCEiIjckJCIrKCkqKVsuUyEiKCQiJis7JCEiIjckJCIrJVI2cyslISIoJCImK0UkISIiNyQkIiptOCk0UyEiJyQiJitPJCEiIjckJCIrLUw3NlMhIigkIiYrWSQhIiI3JCQiK2UmejMsJSEiKCQiJitjJCEiIjckJCIrJj1rJzNTISIoJCImK20kISIiNyQkIis5NnUuUyEiKCQiJit3JCEiIjckJCIrJD0pZiUqUiEiKCQiJisnUSEiIjckJCIrKSkpPnEoUiEiKCQiJisnUiEiIi0lJkNPTE9SRzYmJSRSR0JHJCIoZnFrJiEiKCQiKU1MTCQqISIpJCIoZnFrJiEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2JTdKNyQkIitRNGM2TCEiKCQiJCsnISIiNyQkIis6KCkpR1okISIoJCIlKzshIiI3JCQiKyJScFxjJCEiKCQiJStFISIiNyQkIiolKm86aiQhIickIiUrTyEiIjckJCIrKTRKVm8kISIoJCIlK1khIiI3JCQiK3UjRyNHUCEiKCQiJStjISIiNyQkIitgMilldyQhIigkIiUrbSEiIjckJCIqLl4pKXokISInJCIlK3chIiI3JCQiKzQxOkdRISIoJCIlKycpISIiNyQkIitLUVphUSEiKCQiJSsnKiEiIjckJCIrWSc9JHlRISIoJCImKzEiISIiNyQkIitwVjArUiEiKCQiJis7IiEiIjckJCIqQWkqPlIhIickIiYrRSIhIiI3JCQiKzQzRVFSISIoJCImK08iISIiNyQkIitWRzdiUiEiKCQiJitZIiEiIjckJCIrSGtvcVIhIigkIiYrYyIhIiI3JCQiKiVIMSYpUiEiJyQiJittIiEiIjckJCIqaFUkKSpSISInJCImK3ciISIiNyQkIitmJilmNVMhIigkIiYrJz0hIiI3JCQiK04oKik9LSUhIigkIiYrJz4hIiI3JCQiK1pJRUtTISIoJCImKzEjISIiNyQkIisoKlt2VFMhIigkIiYrOyMhIiI3JCQiK0xBUl1TISIoJCImK0UjISIiNyQkIiskPiQ+ZVMhIigkIiYrTyMhIiI3JCQiKyRSbl4xJSEiKCQiJitZIyEiIjckJCIrUWVKclMhIigkIiYrYyMhIiI3JCQiKlhJbTIlISInJCImK20jISIiNyQkIis3SjQiMyUhIigkIiYrdyMhIiI3JCQiKyU0dVkzJSEiKCQiJisnRyEiIjckJCIrQSdIdDMlISIoJCImKydIISIiNyQkIittIikqKikzJSEiKCQiJisxJCEiIjckJCIraVpmKjMlISIoJCImKzskISIiNyQkIioyLSEqMyUhIickIiYrRSQhIiI3JCQiKzllMCgzJSEiKCQiJitPJCEiIjckJCIrTSg+TjMlISIoJCImK1kkISIiNyQkIitPJVIheVMhIigkIiYrYyQhIiI3JCQiK3YoWysyJSEiKCQiJittJCEiIjckJCIrLEJiZVMhIigkIiYrdyQhIiI3JCQiK3U1XVRTISIoJCImKydRISIiNyQkIitrQjo4UyEiKCQiJisnUiEiIi0lJkNPTE9SRzYmJSRSR0JHJCIoZnFrJiEiKCQiKU1MTCQqISIpJCIoZnFrJiEiKC0lKlRISUNLTkVTU0c2IyIiIS0lJ0NVUlZFU0c2JTdKNyQkIis9VV1OTiEiKCQiJCsnISIiNyQkIitwcHkjbyQhIigkIiUrOyEiIjckJCIrJ2YwZ3ckISIoJCIlK0UhIiI3JCQiKyg0WWMjUSEiKCQiJStPISIiNyQkIitMclpzUSEiKCQiJStZISIiNyQkIis4WTQ2UiEiKCQiJStjISIiNyQkIitRJj1SJVIhIigkIiUrbSEiIjckJCIrNzFSc1IhIigkIiUrdyEiIjckJCIrdklXKCpSISIoJCIlKycpISIiNyQkIitYXHI+UyEiKCQiJSsnKiEiIjckJCIrak9tUlMhIigkIiYrMSIhIiI3JCQiK0F4aWRTISIoJCImKzsiISIiNyQkIisqNGtRMiUhIigkIiYrRSIhIiI3JCQiK3k8ZCkzJSEiKCQiJitPIiEiIjckJCIrX3IhPjUlISIoJCImK1kiISIiNyQkIipWJSpSNiUhIickIiYrYyIhIiI3JCQiK2NHJFw3JSEiKCQiJittIiEiIjckJCIrQT0hWzglISIoJCImK3ciISIiNyQkIitKWG1WVCEiKCQiJisnPSEiIjckJCIrTzFkXlQhIigkIiYrJz4hIiI3JCQiK0YiZSZlVCEiKCQiJisxIyEiIjckJCIrT1lsa1QhIigkIiYrOyMhIiI3JCQiK3gjeSlwVCEiKCQiJitFIyEiIjckJCIreCFRVTwlISIoJCImK08jISIiNyQkIitNU3R4VCEiKCQiJitZIyEiIjckJCIraG5OIT0lISIoJCImK2MjISIiNyQkIisocCczIz0lISIoJCImK20jISIiNyQkIitXRipHPSUhIigkIiYrdyMhIiI3JCQiKjxJRj0lISInJCImKydHISIiNyQkIitWdWAiPSUhIigkIiYrJ0ghIiI3JCQiKypcSiN6VCEiKCQiJisxJCEiIjckJCIrTzBxdlQhIigkIiYrOyQhIiI3JCQiK1lGenFUISIoJCImK0UkISIiNyQkIituekhrVCEiKCQiJitPJCEiIjckJCIrbGgiZjolISIoJCImK1kkISIiNyQkIis6JCo+WFQhIigkIiYrYyQhIiI3JCQiK2xMVkpUISIoJCImK20kISIiNyQkIisoW2pMNiUhIigkIiYrdyQhIiI3JCQiK2tSUykzJSEiKCQiJisnUSEiIjckJCIqJVtHXFMhIickIiYrJ1IhIiItJSZDT0xPUkc2JiUkUkdCRyQiKGZxayYhIigkIilNTEwkKiEiKSQiKGZxayYhIigtJSpUSElDS05FU1NHNiMiIiEtJSVURVhURzYlNyQkIisyUGElKT4hIigkIiUrOiEiIi0lKV9UWVBFU0VURzYjLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjY1LUkjbXNHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2I1EkMTAlNiIvJSdmYW1pbHlHUSpIZWx2ZXRpY2E2Ii8lJXNpemVHUSMxMDYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ25vcm1hbDYiLSUlRk9OVEc2JSUqSEVMVkVUSUNBRyUoREVGQVVMVEclKERFRkFVTFRHLSUlVEVYVEc2JTckJCIrN3JdJj4jISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDIwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiKzwwWjFDISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDMwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK0FSVjxFISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDQwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK0Z0UkdHISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDUwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK0syT1JJISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDYwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK1BUS11LISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDcwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK1V2R2hNISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDgwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVRFWFRHNiU3JCQiK1o0RHNPISIoJCIlKzohIiItJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NS1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRJDkwJTYiLyUnZmFtaWx5R1EqSGVsdmV0aWNhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EmZmFsc2U2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJUZPTlRHNiUlKkhFTFZFVElDQUclKERFRkFVTFRHJShERUZBVUxURy0lJVZJRVdHNiQ7JCIlKzohIiIkIiUrWSEiIjskIiUrNSEiIiQiJisrJiEiIi0mJSZfQVhJU0c2IyIiIjYnLSUrX0dSSURMSU5FU0c2JCUoREVGQVVMVEctJSZDT0xPUkc2JiUkUkdCRyQiKGg+IXAhIigkIilZRidvKCEiKSQiKUMpZXEpISIpLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiItJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSYlJl9BWElTRzYjIiIjNiktJStfR1JJRExJTkVTRzYlIiIpLSUmQ09MT1JHNiYlJFJHQkckIihoPiFwISIoJCIpWUYnbyghIikkIilDKWVxKSEiKS0lKl9TVUJUSUNLU0c2IyIiJS0lJkNPTE9SRzYmJSRSR0JHJCIiISEiIiQiIiEhIiIkIiIhISIiLSUqTElORVNUWUxFRzYjIiIiLSUqVEhJQ0tORVNTRzYjIiIhLSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIi0lJl9NT0RFRzYjIiIiLSUmX01PREVHNiMiIiItJStBWEVTTEFCRUxTRzYnUTFFbnRoYWxweX4oa0ova2cpNiJRL1ByZXNzdXJlfihrUGEpNiItJSVGT05URzYlJSpIRUxWRVRJQ0FHJShERUZBVUxURyIjNyUrSE9SSVpPTlRBTEclKVZFUlRJQ0FMRy0lJlRJVExFRzYlLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjYtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUTZQLWgtVH5DaGFydH5mb3J+UjEzNGE2Ii8lJ2ZhbWlseUdRKkhlbHZldGljYTYiLyUlc2l6ZUdRIzE0NiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJmZhbHNlNiIvJSp1bmRlcmxpbmVHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lMGZvbnRfc3R5bGVfbmFtZUdRJVRleHQ2Ii8lLG1hdGh2YXJpYW50R1Enbm9ybWFsNiItJSVGT05URzYkJSpIRUxWRVRJQ0FHIiM5LSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIg== + + +
    +
    \ No newline at end of file diff --git a/wrappers/Maple/BuildDLLx64.bat b/wrappers/Maple/BuildDLLx64.bat new file mode 100644 index 00000000..769c18c8 --- /dev/null +++ b/wrappers/Maple/BuildDLLx64.bat @@ -0,0 +1,14 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 + +REM ******* compile all the sources *************** +cl /c /MP3 /I../../CoolProp /EHsc /DCOOLPROP_LIB ../../CoolProp/*.cpp + +link /DLL CoolProp.obj *.obj /OUT:CoolProp_x64.dll +copy CoolProp_x64.dll c:\CoolPropx64.dll + +dumpbin /EXPORTS CoolProp_x64.dll > exports_x64.txt +erase *.obj +erase *.exp +erase *.lib diff --git a/wrappers/Maple/exports_x64.txt b/wrappers/Maple/exports_x64.txt new file mode 100644 index 00000000..4f22fb22 --- /dev/null +++ b/wrappers/Maple/exports_x64.txt @@ -0,0 +1,80 @@ +Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file CoolProp_x64.dll + +File Type: DLL + + Section contains the following exports for CoolProp_x64.dll + + 00000000 characteristics + 52FDF3F0 time date stamp Fri Feb 14 11:46:08 2014 + 0.00 version + 1 ordinal base + 51 number of functions + 51 number of names + + ordinal hint RVA name + + 1 0 000D11C0 DerivTerms + 2 1 000D0C00 F2K + 3 2 00144DD0 HAProps + 4 3 001469D0 HAProps_Aux + 5 4 00004ED0 IProps + 6 5 00001BB0 IsFluidType + 7 6 000D0BD0 K2F + 8 7 000D1EB0 Phase + 9 8 000D1F60 Phase_Tp + 10 9 000D2010 Phase_Trho + 11 A 000D0C30 PrintSaturationTable + 12 B 000D0990 Props + 13 C 000D0B50 Props1 + 14 D 000D0A50 Props1SI + 15 E 000D0930 PropsS + 16 F 000D0AA0 PropsSI + 17 10 000D1AC0 conductivity_background + 18 11 000D1A30 conductivity_critical + 19 12 000D1590 conformal_Trho + 20 13 000D21A0 disable_TTSE_LUT + 21 14 000D2290 disable_TTSE_LUT_writing + 22 15 000D2100 enable_TTSE_LUT + 23 16 000D21F0 enable_TTSE_LUT_writing + 24 17 000D1270 fromSI + 25 18 000D1320 get_Fluid_index + 26 19 000D2410 get_TTSESinglePhase_LUT_range + 27 1A 000D12F0 get_debug_level + 28 1B 000D1DE0 get_fluid_param_string + 29 1C 000D1D50 get_global_param_string + 30 1D 000D1360 get_index_units + 31 1E 000D1550 get_param_index + 32 1F 000D24E0 get_standard_unit_system + 33 20 000D2150 isenabled_TTSE_LUT + 34 21 000D2240 isenabled_TTSE_LUT_writing + 35 22 000D1C50 psatL_anc + 36 23 000D1CD0 psatV_anc + 37 24 000D0800 redirect_stdout + 38 25 000D1B30 rhosatL_anc + 39 26 000D1BC0 rhosatV_anc + 40 27 000D22E0 set_TTSESat_LUT_size + 41 28 000D2390 set_TTSESinglePhase_LUT_range + 42 29 000D2330 set_TTSESinglePhase_LUT_size + 43 2A 000D13D0 set_TTSE_mode + 44 2B 000D1300 set_debug_level + 45 2C 000D20C0 set_phase + 46 2D 000D08C0 set_reference_stateD + 47 2E 000D0840 set_reference_stateS + 48 2F 000D2500 set_standard_unit_system + 49 30 000D12B0 toSI + 50 31 000D1910 viscosity_dilute + 51 32 000D19A0 viscosity_residual + + Summary + + 29000 .data + 2A000 .pdata + D3000 .rdata + 7000 .reloc + 28D000 .text + 7000 data + 2000 text diff --git a/wrappers/Maple/sample_file.mw b/wrappers/Maple/sample_file.mw new file mode 100644 index 00000000..c0c63b76 --- /dev/null +++ b/wrappers/Maple/sample_file.mw @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEmUHJvcHNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSomY29sb25lcTtGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTC1GLDYlUTBkZWZpbmVfZXh0ZXJuYWxGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2Uy1GNjYtUSInRidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjExMTExMTFlbUYnL0ZOUSYwLjBlbUYnRitGVy1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIL0ZLRmduL0ZOUSwwLjMzMzMzMzNlbUYnLUYsNiVRJExJQkYnRi9GMi1GNjYtUSI9RidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1JI21zR0YkNiNRNGM6XFxDb29sUHJvcHg2NC5kbGxGJ0ZobkZXLUYsNiVRJ091dHB1dEYnRi9GMkZXLUY2Ni1RLSZQcm9wb3J0aW9uO0YnRjlGO0Y+RkBGQkZERkZGSEZKRk0tRlM2JC1GIzYlLUYsNiVRJ3N0cmluZ0YnRi9GMi8lK2V4ZWN1dGFibGVHRj1GOUY5RmhuRlctRiw2JVEkSW4xRidGL0YyRldGXHAtRlM2JC1GIzYlLUYsNiVRJWNoYXJGJ0YvRjJGZnBGOUY5RmhuRlctRiw2JVElVmFsMUYnRi9GMkZXRlxwLUZTNiQtRiM2Ji1GLDYlUSZmbG9hdEYnRi9GMi1GUzYmLUYjNiUtSSNtbkdGJDYkUSI4RidGOUZmcEY5RjkvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGZnBGOUY5RmhuRlctRiw2JVEkSW4yRidGL0YyRldGXHBGW3FGaG5GVy1GLDYlUSVWYWwyRidGL0YyRldGXHBGZXFGaG5GVy1GLDYlUSZGbHVpZEYnRi9GMkZXRlxwRl9wRmhuLUYsNiVRJ1JFVFVSTkYnRi9GMkZccEZlcUZmcEY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGZ24vJSZkZXB0aEdGXnQvJSpsaW5lYnJlYWtHUSVhdXRvRidGZnNGZnBGOQ== + + + + +LUkmUHJvcHNHNiI2KFEiVEYkUSJQRiQkIiUrSSEiIlEiUUYkJCIjNUYqUSZSMTM0YUYk + + +JCIzYEIheXRqPyNRRiEjOg== + + + + +PkkkRjJLRzYiLUkwZGVmaW5lX2V4dGVybmFsRyUqcHJvdGVjdGVkRzYmLkYjL0kkTElCR0YkUTRjOlxcQ29vbFByb3B4NjQuZGxsRiQnLkklVmFsMUdGJCZJJmZsb2F0R0YnNiMiIiknSSdSRVRVUk5HRidGMA== + + +JVBOb24tZmF0YWx+ZXJyb3J+d2hpbGV+cmVhZGluZ35kYXRhfmZyb21+a2VybmVsLkc= + + + + +LUkkRjJLRzYiNiMiI0s= + + +JCIzeCoqKioqKioqKipcSkYhIzo= + + + + +PkknUHJvcHMxRzYiLUkwZGVmaW5lX2V4dGVybmFsRyUqcHJvdGVjdGVkRzYnLkYjL0kkTElCR0YkUTRjOlxcQ29vbFByb3B4NjQuZGxsRiQnLkknT3V0cHV0R0YkSSdzdHJpbmdHRicnLkkmRmx1aWRHRiRGMCdJJ1JFVFVSTkdGJyZJJmZsb2F0R0YnNiMiIik= + + + + +LUknUHJvcHMxRzYiNiRRJlIxMzRhRiRRJlRjcml0RiQ= + + +JCIzISkqKioqKioqKioqNFVQISM6 + + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= + + + \ No newline at end of file diff --git a/wrappers/Maple/simple/BuildDLL.bat b/wrappers/Maple/simple/BuildDLL.bat new file mode 100644 index 00000000..e906695e --- /dev/null +++ b/wrappers/Maple/simple/BuildDLL.bat @@ -0,0 +1,11 @@ +REM ******** set the variables ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 + +REM ******* compile all the sources *************** +cl -Gz mult.c -LD -link + +dumpbin /EXPORTS mult.dll > exports.txt +erase *.obj +erase *.exp +erase *.lib \ No newline at end of file diff --git a/wrappers/Maple/simple/mult.c b/wrappers/Maple/simple/mult.c new file mode 100644 index 00000000..6250ff6c --- /dev/null +++ b/wrappers/Maple/simple/mult.c @@ -0,0 +1,4 @@ +int __declspec(dllexport) __stdcall mult( int a, int b ) +{ + return a * b; +} \ No newline at end of file diff --git a/wrappers/Maple/simple/simple.mw b/wrappers/Maple/simple/simple.mw new file mode 100644 index 00000000..e3ab6619 --- /dev/null +++ b/wrappers/Maple/simple/simple.mw @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PkkmbXVsdHRHNiItSTBkZWZpbmVfZXh0ZXJuYWxHJSpwcm90ZWN0ZWRHNicuSSVtdWx0R0YkJy5JImFHRiQmSShpbnRlZ2VyR0YnNiMiIiUnLkkiYkdGJEYuJ0knUkVUVVJOR0YnRi4vSSRMSUJHRiRRLGM6XG11bHQuZGxsRiQ= + + + + +LUkmbXVsdHRHNiI2JCIiJSIiJA== + + +IiM3 + + + + +JSFH + + + + +JSFH + + + \ No newline at end of file diff --git a/wrappers/MathCAD/BuildDLL.bat b/wrappers/MathCAD/BuildDLL.bat new file mode 100644 index 00000000..4dc9ef70 --- /dev/null +++ b/wrappers/MathCAD/BuildDLL.bat @@ -0,0 +1,13 @@ +REM ******** call the Microsoft Visual studio (these are for VS2008) ************ +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" +call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +REM ******* compile all the sources *************** +cl /c /MP3 /I../../CoolProp /EHsc /DEXTERNC ../../CoolProp/*.cpp +cl /c /I../../CoolProp /EHsc /DEXTERNC /DCOOLPROPMATHCADWRAPPER_EXPORTS CoolPropMathcad.cpp + +link /DLL *.obj mcaduser.lib /OUT:CoolPropMathcadWrapper.dll /ENTRY:"DllEntryPoint" +dumpbin /EXPORTS CoolPropMathcadWrapper.dll > exports.txt +erase *.obj +REM ~ erase *.exp +REM ~ erase *.lib \ No newline at end of file diff --git a/wrappers/MathCAD/CoolPropFluidProperties.xmcd b/wrappers/MathCAD/CoolPropFluidProperties.xmcd new file mode 100644 index 00000000..9fbe9b3c --- /dev/null +++ b/wrappers/MathCAD/CoolPropFluidProperties.xmcd @@ -0,0 +1,2283 @@ + + + + + + Mathcad Professional 14.0 + + Fluid Properties + CoolProp Fluid Properties Wrapper - Mathcad User Function + Advanced Energy Industries, Inc. + Parametric Technology Corporation + + Advanced Energy Industries, Inc. + + + 48 + 2C78F03C-F3AB-48D2-A967-CA877F3AC7C3 + 0FB2AF43-DD09-43F5-937C-43684F0EF276 + 00000000-0000-0000-0000-000000000000 + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +