From 02ffe13d122b9d10e72aeb5a5358b013a1c941c4 Mon Sep 17 00:00:00 2001 From: <> Date: Sat, 28 Sep 2024 23:43:50 +0000 Subject: [PATCH] Deployed 6a21a7d with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 643 ++ api/index.html | 4751 ++++++++++++ assets/_mkdocstrings.css | 119 + assets/eo-tides-logo-128.png | Bin 0 -> 12783 bytes assets/eo-tides-logo-256.png | Bin 0 -> 30434 bytes assets/eo-tides-logo.png | Bin 0 -> 60833 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.56dfad97.min.js | 16 + assets/javascripts/bundle.56dfad97.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.07f07601.min.js | 42 + .../workers/search.07f07601.min.js.map | 7 + assets/stylesheets/main.35f28582.min.css | 1 + assets/stylesheets/main.35f28582.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + changelog/index.html | 715 ++ credits/index.html | 799 ++ index.html | 813 ++ install/index.html | 729 ++ notebooks/Model_tides/index.html | 2006 +++++ objects.inv | 7 + search/search_index.json | 1 + setup/index.html | 862 +++ sitemap.xml | 31 + sitemap.xml.gz | Bin 0 -> 256 bytes stylesheets/extra.css | 25 + 61 files changed, 18778 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 api/index.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/eo-tides-logo-128.png create mode 100644 assets/eo-tides-logo-256.png create mode 100644 assets/eo-tides-logo.png create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.56dfad97.min.js create mode 100644 assets/javascripts/bundle.56dfad97.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.07f07601.min.js create mode 100644 assets/javascripts/workers/search.07f07601.min.js.map create mode 100644 assets/stylesheets/main.35f28582.min.css create mode 100644 assets/stylesheets/main.35f28582.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 changelog/index.html create mode 100644 credits/index.html create mode 100644 index.html create mode 100644 install/index.html create mode 100644 notebooks/Model_tides/index.html create mode 100644 objects.inv create mode 100644 search/search_index.json create mode 100644 setup/index.html create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 stylesheets/extra.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..0cdbe7e --- /dev/null +++ b/404.html @@ -0,0 +1,643 @@ + + + +
+ + + + + + + + + + + + + + + + + + +
eo_tides.model
+
+
+¶
model_tides
+
+
+¶model_tides(
+ x,
+ y,
+ time,
+ model="FES2014",
+ directory=None,
+ crs="EPSG:4326",
+ crop=True,
+ method="spline",
+ extrapolate=True,
+ cutoff=None,
+ mode="one-to-many",
+ parallel=True,
+ parallel_splits=5,
+ output_units="m",
+ output_format="long",
+ ensemble_models=None,
+ **ensemble_kwargs
+)
+
Compute tides at multiple points and times using tidal harmonics.
+This function supports all tidal models supported by pyTMD
,
+including FES Finite Element Solution models, TPXO TOPEX/POSEIDON
+models, EOT Empirical Ocean Tide models, GOT Global Ocean Tide
+models, and HAMTIDE Hamburg direct data Assimilation Methods for
+Tides models.
This function requires access to tide model data files.
+These should be placed in a folder with subfolders matching
+the formats specified by pyTMD
:
+https://pytmd.readthedocs.io/en/latest/getting_started/Getting-Started.html#directories
For FES2014 (https://www.aviso.altimetry.fr/es/data/products/auxiliary-products/global-tide-fes/description-fes2014.html):
+{directory}/fes2014/ocean_tide/
For FES2022 (https://www.aviso.altimetry.fr/en/data/products/auxiliary-products/global-tide-fes.html):
+{directory}/fes2022b/ocean_tide/
For TPXO8-atlas (https://www.tpxo.net/tpxo-products-and-registration):
+{directory}/tpxo8_atlas/
For TPXO9-atlas-v5 (https://www.tpxo.net/tpxo-products-and-registration):
+{directory}/TPXO9_atlas_v5/
For EOT20 (https://www.seanoe.org/data/00683/79489/):
+{directory}/EOT20/ocean_tides/
For GOT4.10c (https://earth.gsfc.nasa.gov/geo/data/ocean-tide-models):
+{directory}/GOT4.10c/grids_oceantide_netcdf/
For HAMTIDE (https://www.cen.uni-hamburg.de/en/icdc/data/ocean/hamtide.html):
+{directory}/hamtide/
This function is a modification of the pyTMD
package's
+compute_tide_corrections
function. For more info:
+https://pytmd.readthedocs.io/en/stable/user_guide/compute_tide_corrections.html
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
x |
+
+ float or list of floats
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tides. By default these +coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
y |
+
+ float or list of floats
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tides. By default these +coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
time |
+
+ A datetime array or pandas.DatetimeIndex
+ |
+
+
+
+ An array containing |
+ + required + | +
model |
+
+ string
+ |
+
+
+
+ The tide model used to model tides. Options include: +
|
+
+ 'FES2014'
+ |
+
directory |
+
+ string
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ For example: +
|
+
+ None
+ |
+
crs |
+
+ str
+ |
+
+
+
+ Input coordinate reference system for x and y coordinates. +Defaults to "EPSG:4326" (WGS84; degrees latitude, longitude). + |
+
+ 'EPSG:4326'
+ |
+
crop |
+
+ bool optional
+ |
+
+
+
+ Whether to crop tide model constituent files on-the-fly to +improve performance. Cropping will be performed based on a +1 degree buffer around all input points. Defaults to True. + |
+
+ True
+ |
+
method |
+
+ string
+ |
+
+
+
+ Method used to interpolate tidal constituents +from model files. Options include: +
|
+
+ 'spline'
+ |
+
extrapolate |
+
+ bool
+ |
+
+
+
+ Whether to extrapolate tides for x and y coordinates outside of +the valid tide modelling domain using nearest-neighbor. + |
+
+ True
+ |
+
cutoff |
+
+ int or float
+ |
+
+
+
+ Extrapolation cutoff in kilometers. The default is None, which +will extrapolate for all points regardless of distance from the +valid tide modelling domain. + |
+
+ None
+ |
+
mode |
+
+ string
+ |
+
+
+
+ The analysis mode to use for tide modelling. Supports two options: +
|
+
+ 'one-to-many'
+ |
+
parallel |
+
+ boolean
+ |
+
+
+
+ Whether to parallelise tide modelling using |
+
+ True
+ |
+
parallel_splits |
+
+ int
+ |
+
+
+
+ Whether to split the input x and y coordinates into smaller, +evenly-sized chunks that are processed in parallel. This can +provide a large performance boost when processing large numbers +of coordinates. The default is 5 chunks, which will split +coordinates into 5 parallelised chunks. + |
+
+ 5
+ |
+
output_units |
+
+ str
+ |
+
+
+
+ Whether to return modelled tides in floating point metre units, +or integer centimetre units (i.e. scaled by 100) or integer +millimetre units (i.e. scaled by 1000. Returning outputs in +integer units can be useful for reducing memory usage. +Defaults to "m" for metres; set to "cm" for centimetres or "mm" +for millimetres. + |
+
+ 'm'
+ |
+
output_format |
+
+ str
+ |
+
+
+
+ Whether to return the output dataframe in long format (with +results stacked vertically along "tide_model" and "tide_m" +columns), or wide format (with a column for each tide model). +Defaults to "long". + |
+
+ 'long'
+ |
+
ensemble_models |
+
+ list
+ |
+
+
+
+ An optional list of models used to generate the ensemble tide +model if "ensemble" tide modelling is requested. Defaults to +["FES2014", "TPXO9-atlas-v5", "EOT20", "HAMTIDE11", "GOT4.10", +"FES2012", "TPXO8-atlas-v1"]. + |
+
+ None
+ |
+
**ensemble_kwargs |
+ + | +
+
+
+ Keyword arguments used to customise the generation of optional
+ensemble tide models if "ensemble" modelling are requested.
+These are passed to the underlying |
+
+ {}
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ A dataframe containing modelled tide heights. + |
+
eo_tides/model.py
389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 |
|
pixel_tides
+
+
+¶pixel_tides(
+ ds,
+ times=None,
+ resample=True,
+ calculate_quantiles=None,
+ resolution=None,
+ buffer=None,
+ resample_method="bilinear",
+ model="FES2014",
+ dask_chunks="auto",
+ dask_compute=True,
+ **model_tides_kwargs
+)
+
Obtain tide heights for each pixel in a dataset by modelling +tides into a low-resolution grid surrounding the dataset, +then (optionally) spatially resample this low-res data back +into the original higher resolution dataset extent and resolution.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
ds |
+
+ Dataset
+ |
+
+
+
+ A dataset whose geobox ( |
+ + required + | +
times |
+
+ pandas.DatetimeIndex or list of pandas.Timestamps
+ |
+
+
+
+ By default, the function will model tides using the times
+contained in the |
+
+ None
+ |
+
resample |
+
+ bool
+ |
+
+
+
+ Whether to resample low resolution tides back into |
+
+ True
+ |
+
calculate_quantiles |
+
+ list or array
+ |
+
+
+
+ Rather than returning all individual tides, low-resolution tides
+can be first aggregated using a quantile calculation by passing in
+a list or array of quantiles to compute. For example, this could
+be used to calculate the min/max tide across all times:
+ |
+
+ None
+ |
+
resolution |
+
+ int
+ |
+
+
+
+ The desired resolution of the low-resolution grid used for tide
+modelling. The default None will create a 5000 m resolution grid
+if |
+
+ None
+ |
+
buffer |
+
+ int
+ |
+
+
+
+ The amount by which to buffer the higher resolution grid extent
+when creating the new low resolution grid. This buffering is
+important as it ensures that ensure pixel-based tides are seamless
+across dataset boundaries. This buffer will eventually be clipped
+away when the low-resolution data is re-projected back to the
+resolution and extent of the higher resolution dataset. To
+ensure that at least two pixels occur outside of the dataset
+bounds, the default None applies a 12000 m buffer if |
+
+ None
+ |
+
resample_method |
+
+ string
+ |
+
+
+
+ If resampling is requested (see |
+
+ 'bilinear'
+ |
+
model |
+
+ string or list of strings
+ |
+
+
+
+ The tide model or a list of models used to model tides, as
+supported by the |
+
+ 'FES2014'
+ |
+
dask_chunks |
+
+ str or tuple
+ |
+
+
+
+ Can be used to configure custom Dask chunking for the final
+resampling step. The default of "auto" will automatically set
+x/y chunks to match those in |
+
+ 'auto'
+ |
+
dask_compute |
+
+ bool
+ |
+
+
+
+ Whether to compute results of the resampling step using Dask.
+If False, this will return |
+
+ True
+ |
+
**model_tides_kwargs |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Type | +Description | +
---|---|
+ If `resample` is False:
+ |
+
+
+
+ tides_lowres : xr.DataArray
+ A low resolution data array giving either tide heights every
+ timestep in |
+
+ If `resample` is True:
+ |
+
+
+
+ tides_highres, tides_lowres : tuple of xr.DataArrays
+ In addition to |
+
eo_tides/model.py
824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 |
|
eo_tides.stats
+
+
+¶
tide_stats
+
+
+¶Test function.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
a |
+
+ int
+ |
+
+
+
+ Test + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ Test
+ |
+
+
+
+
+ |
+
eo_tides.validation
+
+
+¶
eval_metrics
+
+
+¶Calculate a set of common statistical metrics +based on two input actual and predicted vectors.
+These include:
+Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
x |
+
+ array
+ |
+
+
+
+ An array providing "actual" variable values. + |
+ + required + | +
y |
+
+ array
+ |
+
+
+
+ An array providing "predicted" variable values. + |
+ + required + | +
round |
+
+ int
+ |
+
+
+
+ Number of decimal places to round each metric +to. Defaults to 3. + |
+
+ 3
+ |
+
all_regress |
+
+ bool
+ |
+
+
+
+ Whether to return linear regression p-value, +intercept and standard error (in addition to +only regression slope). Defaults to False. + |
+
+ False
+ |
+
Returns:
+Type | +Description | +
---|---|
+ Series
+ |
+
+
+
+ A |
+
eo_tides/validation.py
load_gauge_gesla
+
+
+¶load_gauge_gesla(
+ x=None,
+ y=None,
+ site_code=None,
+ time=("2018", "2020"),
+ max_distance=None,
+ correct_mean=False,
+ filter_use_flag=True,
+ site_metadata=True,
+ data_path="/gdata1/data/sea_level/gesla/",
+ metadata_path="/gdata1/data/sea_level/GESLA3_ALL 2.csv",
+)
+
Load and process all available Global Extreme Sea Level Analysis
+(GESLA) tide gauge data with an x, y, time
spatiotemporal query,
+or from a list of specific tide gauges.
Can optionally filter by gauge quality and append detailed gauge metadata.
+Modified from original code in https://github.com/philiprt/GeslaDataset.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
x |
+
+ numeric or list / tuple
+ |
+
+
+
+ Coordinates (in degrees longitude, latitude) used to load GESLA
+tide gauge observations. If provided as singular values
+(e.g. |
+
+ None
+ |
+
y |
+
+ numeric or list / tuple
+ |
+
+
+
+ Coordinates (in degrees longitude, latitude) used to load GESLA
+tide gauge observations. If provided as singular values
+(e.g. |
+
+ None
+ |
+
site_code |
+
+ str or list of str
+ |
+
+
+
+ GESLA site code(s) for which to load data (e.g. |
+
+ None
+ |
+
time |
+
+ tuple or list of str
+ |
+
+
+
+ Time range to consider, given as a tuple of start and end dates,
+e.g. |
+
+ ('2018', '2020')
+ |
+
max_distance |
+
+ numeric
+ |
+
+
+
+ Optional max distance within which to return the nearest tide gauge
+when |
+
+ None
+ |
+
correct_mean |
+
+ bool
+ |
+
+
+
+ Whether to correct sea level measurements to a standardised mean +sea level by subtracting the mean of all observed sea level +observations. This can be useful when GESLA tide heights come +from different or unknown tide datums. Note: the observed mean +sea level calculated here may differ from true long-term/ +astronomical Mean Sea Level (MSL) datum. + |
+
+ False
+ |
+
filter_use_flag |
+
+ bool
+ |
+
+
+
+ Whether to filter out low quality observations with a "use_flag" +value of 0 (do not use). Defaults to True. + |
+
+ True
+ |
+
site_metadata |
+
+ bool
+ |
+
+
+
+ Whether to add tide gauge station metadata as additional columns +in the output DataFrame. Defaults to True. + |
+
+ True
+ |
+
data_path |
+
+ str
+ |
+
+
+
+ Path to the raw GESLA data files. Default is
+ |
+
+ '/gdata1/data/sea_level/gesla/'
+ |
+
metadata_path |
+
+ str
+ |
+
+
+
+ Path to the GESLA station metadata file.
+Default is |
+
+ '/gdata1/data/sea_level/GESLA3_ALL 2.csv'
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ Processed GESLA data as a DataFrame with columns including: +
...and additional columns from station metadata. + |
+
eo_tides/validation.py
181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 |
|
round_date_strings
+
+
+¶Round a date string up or down to the start or end of a given time +period.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
date |
+
+ str
+ |
+
+
+
+ Date string of variable precision (e.g. "2020", "2020-01", +"2020-01-01"). + |
+ + required + | +
round_type |
+
+ str
+ |
+
+
+
+ Type of rounding to perform. Valid options are "start" or "end". +If "start", date is rounded down to the start of the time period. +If "end", date is rounded up to the end of the time period. +Default is "end". + |
+
+ 'end'
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
date_rounded |
+ str
+ |
+
+
+
+ The rounded date string. + |
+
Examples:
+ + + + +eo_tides/validation.py
eo_tides.utils
+
+
+¶
idw
+
+
+¶idw(
+ input_z,
+ input_x,
+ input_y,
+ output_x,
+ output_y,
+ p=1,
+ k=10,
+ max_dist=None,
+ k_min=1,
+ epsilon=1e-12,
+)
+
Perform Inverse Distance Weighting (IDW) interpolation.
+This function performs fast IDW interpolation by creating a KDTree
+from the input coordinates then uses it to find the k
nearest
+neighbors for each output point. Weights are calculated based on the
+inverse distance to each neighbor, with weights descreasing with
+increasing distance.
Code inspired by: https://github.com/DahnJ/REM-xarray
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
input_z |
+
+ array - like
+ |
+
+
+
+ Array of values at the input points. This can be either a +1-dimensional array, or a 2-dimensional array where each column +(axis=1) represents a different set of values to be interpolated. + |
+ + required + | +
input_x |
+
+ array - like
+ |
+
+
+
+ Array of x-coordinates of the input points. + |
+ + required + | +
input_y |
+
+ array - like
+ |
+
+
+
+ Array of y-coordinates of the input points. + |
+ + required + | +
output_x |
+
+ array - like
+ |
+
+
+
+ Array of x-coordinates where the interpolation is to be computed. + |
+ + required + | +
output_y |
+
+ array - like
+ |
+
+
+
+ Array of y-coordinates where the interpolation is to be computed. + |
+ + required + | +
p |
+
+ int or float
+ |
+
+
+
+ Power function parameter defining how rapidly weightings should
+decrease as distance increases. Higher values of |
+
+ 1
+ |
+
k |
+
+ int
+ |
+
+
+
+ Number of nearest neighbors to use for interpolation. |
+
+ 10
+ |
+
max_dist |
+
+ int or float
+ |
+
+
+
+ Restrict neighbouring points to less than this distance. +By default, no distance limit is applied. + |
+
+ None
+ |
+
k_min |
+
+ int
+ |
+
+
+
+ If |
+
+ 1
+ |
+
epsilon |
+
+ float
+ |
+
+
+
+ Small value added to distances to prevent division by zero +errors in the case that output coordinates are identical to +input coordinates. Defaults to 1e-12. + |
+
+ 1e-12
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
interp_values |
+ ndarray
+ |
+
+
+
+ Interpolated values at the output coordinates. If |
+
Examples:
+>>> input_z = [1, 2, 3, 4, 5]
+>>> input_x = [0, 1, 2, 3, 4]
+>>> input_y = [0, 1, 2, 3, 4]
+>>> output_x = [0.5, 1.5, 2.5]
+>>> output_y = [0.5, 1.5, 2.5]
+>>> idw(input_z, input_x, input_y, output_x, output_y, k=2)
+array([1.5, 2.5, 3.5])
+
eo_tides/utils.py
5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 |
|
5^-93J;?`ZcL*?#y$XknE)ih z_mqV6s$&SlL7P?99{{u(7F87m_{F8OvF?$dVc|8CVde(7+2`_y z^8e|8fBh5dAxIP~0rnl~jL|4PeI9Ju*OnOkZ4J2bsf}O({PG{0@lD hBFC~3B{5V*`}Dyi2o^8CyB$FlJ^m~v zJ+7WN6Kfy35|>WM$1i4-;&=ab4s=>>NZ dZrGvatPFAG}>XIAw~Q)KNo(vu0Ld&a_JCwVEM=f5WUY z{O*_ML8m;+=MUiXt-DcCRw!2+TMW43jA~St
Ie8m(EK07=xrQj6sM9JST>?IO$@k)WCz5Zh!h(@fBe}_ zJil4KaCz~%2CP`UB|;N?zT;q0@c;buM|gFw8z2NW9fvm--i(sM+?eg>*?TXcB@01EpNoPA`cI{%c>ifZ=q=$t%Sx_g{=jHDf~GX>9I9 zS#cf+0m_Q9vEuiaA=_>m6#SR&y#Upf14k%6*-{_Trzq~~k6K6?ji$+9&rep1J{V@r ztL{7rAq@a3f{|!v;-C;2)T$zcq1K$jn4?OfKeP4nYquT2l9x8B4)o}CT0C&uRq%WI z;O{tuU~e;awY#xw =3SAMOaL{(@X< zO5lI^`Cj~K_24~y aRD)C_i0I+@4LJFWU#fOE&UQ~IM zA(59M3qI$NwgEyAV*@;~{$NTZs2Nv*J1;u}8cUuWZjQ6sva~FU^9N4iE`9a02=HJ0 z&H0!#t|S8dpDp?r5~cX J9o15pyP$+EKYan5$hIMVK|xZd+LT-B)@itdu`l2r(yEWA9lt)*36EEO z3gh4B%>qn0U^MZ!#lE0~uD*eB{`{hoF*)A|i-t`Ie!oF^{me4VJZW^y);0giSr}{6 z#eh!%y!+{H-1^)WBs)(c`rR=(01eBw*$PLurAYukOWBCp_y|`as1a!Xm{|cRr$)kK zA4rmBBn(S=Pp{~5^iGS8VROdxjt#Jc;O2Q#pi|ntzqNi3MrRrD*gY4*ZdG52o@F&* z`_~82 Ko~gJB5FMm^?EEyuj+<(OC%2L884aqVIme9`B`^|MNF|9_ni zy-uEMuRjQuVM1|&xl_t;@vO=S@Yk&0h1*})1~rF?cxPKo4j`wXWK(w8_(Lj}PkR(@ z4F@(n=kBQ6j2I070EgBrgRWQT0?-{9R8W^=&MB`w#4@BaG9KWI>&L1!0>drj%0eq1 zyXQh=g;KF1-ru+<>2|;{1eeSnygqQrhC^8P+UKEX73SJ7VeCKz@2hW*;M&C>Ly#z_ z$m9CyIk !Yu6hf44h%$txudg6AK(-&Rs z)k~<@vFELYNT>k-VDG2PP(AN92SAF$z%Nik0*&4zxY`aI{eh?sp;S~|Cm5{(=3g`! zT8;$)FmvLluvDywM_*Wvzr3>t#O=cLiRGbWP2ANa2w1s!@P)Ivz7?#i1Jh3$3nr{T z&(7WTxaN _cnyEctLSP zcAV4z01vxKL_t(xE+*y>2;M&YVtNsN_sf490N?G!?;d_BWbozaILw$hD%=~!Yai^u z?_S%fdLkv>7teO0g_RRGrr5?-`D1#}>Sp44cyYspyWd}q3EJPgX{BEexdxy>EfI7k zd%)3DZwvB5d885ureq7upEDXu7n}#1#SrtuP3?WK8MU~4W<}^zoF}_r{rUQ6@%nlE z 8rM^K_{}X41rc}Md=)ethr;|E+ R`?}``trNv_=eMA^8l~5=Jh>L+# zfA3;4sG*Qh-ny$+WF+iHisi<(;&I(pi)CxfzUJsqRWEqaDPt0XpRTlZ_C*+9k`O?k z``Dmv>Y~+OVe!+iN1RHI2Y#MWi`V{k^8ok~#XsNPf x>D#yOs2y~|llu1(OM;-N1L$O^>=;fMmX_Ac{@k `mR~adpPHeFPB8YG=Gl7&evFF9KvgC{3D5 zO-cYAkr1H7A>V3ERbT6F&M)uIFD~EOa{S0S5hL?DAnMEsuTuqp*Ecj^-Wiji4@>R3 zy#Xv*`4#r0(2eWh@gCfJ A7|2+6Cemnn)Fz_Wj z`|4UewDwrs8^MyPe!&}?kIT+0`pRBhl}cj+2_Q!RI9N9MWur+~^xpTEqI%x#HaWXQ z+)Bbo6$y;?e6OSRPzf&x_UHr$Yp^CP1#fl*(B0I5@?twE1sYp=@VDnT;PXaDN|X9c zlLL;nF1)#MKaM*BVIk_il vevVal)OIF2_Mw)h{mae+kVDFy zz)8QW(VHEkCd~Zez|KwiqC^ehdtI=%8M>TNKmx1w)vsId>es8)Tb~K!#jl!TU)o?t zFpzq^!s2(fgHjqgn% I+gkW!TJljYrubsX@YqYAp zwNg-4em_~flqNs&q0Xlu5rv~(fE-Y17 h3?7)MMzl4siUPzLJUWW^hKl5e?{C- q(Qks%rdx2f~UB4c7vy{tI*+a)JE@nyt4xu zYXL@DG`0c+I*%fSX6PY#`lH==Z0# ^JR6*yCn3dU5o$v%b)4wJ}*N!PA>sr;rQ@ z!|9UtFkrMsXtPS7wHL)SYcwzfovv8$S%Ve&yvl@`#}N3guDEv+b1dr_JN>M6tX3}o zNkQzCx8#_zaDL)g>dP1b-ds=%06htU4Xp|h5^Xph0Fus<9jKi8laD!;jj3W4+}+6= zMGS**mfX0VH)J4f(B+hY)m!9$&n;Jx&!Es)^OIIX^RCXAHt_PQCH$Bvr>#}0ef&sV z^C!r2PMQ;_u-?`#b-5SSaYYiJ0R7?w$bQ7HE2N;ZDzg-nJ4R2K{!#Qn5?K@UfOoW| zbhLb^LI@Lg`(X_>XzhiO76@UWwHHHU$xDAqDFyFnlikqR`IXA6r>wV^RJAFZGf}4x z2SDmEcqfqFXMbLrSpsOOu5S=V_OtS+vLErWgI4_7iizzN $JI6x>KV0j$X<+mG<{P?k7u2&}v2F|OCATU6wQZeNeIyHoL zIlJ2{Xp|vJMINHx1x9O1sGc)U0-X^Wb2d0r4p@UFsqevXT5x&`2+M-e8bcq>oD*X! z^oN~;-Ho8}&q_$8V`?{*)Xv^Fz#ifZv*;;+ZUuNXmVGZL>RR`G_;_XsfW5%@3vUmQ z!Mlow*#>Ya{pvMJ5J>{*Cl7%sr`Vz8(BbTEFOO+6M 3>giF4Pm;O#}Qw;70|)d(Pts+zQ+xOP@ugzBKALpHMERJ3YO3hv6`w-=049pp&q zgrd(t-Qnt7h4^LWk^@R=GD3CbjhWgsX7VZTYB<&rcfWMDBhYg^rZD3BAXMZL=s6DF z(H_^XVHhS*IceqxMKv?`M`|46l?`rkKryaUIbs#ir=b4RinCnyt<$^P#n{BFg_I zUP8%N6iC-EKK#kTs~X)+>Jw2Z&t|D7zgvZWnuu>Lpg0Cfjw#!N1OTSoQdiBKOWw`S z&fOhX)lmxG)dhd&VcCcpK~F(F@Dzf#5B|=>a$F<97%f)&(b}I}{6-k~5 wDKIU~f#v|TER29=5Lf}KmqdZ-IIyFl>EOPfh?0~rn?hI( zI8(NKtJZg{5h#@)`kZpV!$A^Egb=>CV%*l^+S$7qmZJayimT^BC}R^7&P_!QuD+wD zDdkv5S}z^QazfYJ1|XelVtOE#o$Hhrcgjtth=yS_mcr^;0ZU$4N8`6&oZ@sks^XE9 ziadB{J9t+oID-wW(UvswmT8fAKSZAcqSpbMB(-cbnp!GOI(4HZe^fgtaVbq5f^l5s zbiwyX8q%DWPEL0ME?>HjlO!?&$@>b#`&BzAtr#rqAc?%C gA`#k zU=3EVIujU;0m$@C-;~P5ngI_)ze|;2%Cd~7sC@iqMdN2|XE?13i4!|i3GSqGrk(=$ z`ki}bI4Pg{A)K`9u6$mvR9JhO2PqVcMtTP@4MHA~Fs#p G(Rrus#gh!JBje=uH!f#!lANetgYRjHm_xfNP#Tih$QQ3bD71su4Xv$EzKK zudmJ2vVZ&R-mdmjMM|^NdfEP)HyBQCzT8g;N@X=J380b~w gw&9C`dFP!&5&J-+yLEpT(BFH@9TW z&g`=4qYS4_=NPm@3Gt>XK?3@9{Rc~Yb?-lg@0 zoISaIugezndo6+>7$pjhQp&~IIw&DTAOr%(vOcZe=+YZ4PJ=b8+i1;cH`?+JYmC;; z ;ZX-bT2lN@ zA49SC+fSD82Ujo6*g%G5&%9)59f(BD0I7!hTgh0(9?0}9%qHb(wN&g30hIJ9D>T#H zr`<{!ms(9i0UReFM^@cYo$(m>uo_KQFFC*jA(Vk)l**Wc0ia`t5}z3K*@W6LXctZ5 zQ~K_DkWRIzs{NZZKz)mT4+!c_MvL?18%u`;qhYt2uUggso)>i>sDK )S6*CB>cEmqOtW6pj8yb&QBKo zlzJQYj2IpxPJnQ^`03qXc@0Y`> $bnTQNr z#wjkJ^=J{EzOL*$pYs!n0C9s$Pc=XgMJs@b!{8!jYI|YANI(JNCWP*yAOR{ecxS=5 z6Lx-2cme>x%=u5Fc;ZiV6sQGYJHdzBK|t$QCF#uZBLULcBA%=xB2WQf)Co9t5x~JY zhpStEz4-ext=}sG0Ki#K?S@6vSOJWOx~ow}LV5{k1LO4h-g@BV@6~*M?+6g`AeQYX zj6h2uYXt5)8ipUh;ebRs)-I_2Ue4q9mH+_o( s@)v1W+;fgPE@%909`R(k1)BNRmz>#6|!!9jHXs zDcc1TX2FY)6E%JictGJMggUf>#IL+-;tzI?{vWY8Lq+EKzdHZ`002ovPDHLkV1oFf BK)?V1 literal 0 HcmV?d00001 diff --git a/assets/eo-tides-logo-256.png b/assets/eo-tides-logo-256.png new file mode 100644 index 0000000000000000000000000000000000000000..ac367d571fd55b6c6ccc28a4fc8c74448ae53fa4 GIT binary patch literal 30434 zcmV)^K!CrAP) EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn#5WT;LSM2k8~6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;vxAeOi `@MK^{3L@_NfQ%|H9GVmN<_we!cF2b|C&;2=imAuISpGZ8*bi*QEC!X50 zbk6(4Ay$$U;&b9LgDyz?$aUG}H_k 9%C|}6B ztZ?4qtd^^+c~AbrU|w5JbDice;#foiNr;e9#Rkf-5TR8g#YBqsV;=rN$DbsZOs)+u za?GOw6_Voz|AXJ%nuW;;Hz^ncI$v!2V+0870*#t&e;?a+;{@ zj20<-&Ewr&?Y;ebrrF;Q`EhdH?@m5-00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=m{GDHYVrVl_&rJ02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{03ZNKL_t(|+U#9tcpTN$e$Snm?Yojz)kVd&Tyde8X2A3k zLg*i%_ue4{2&6YcNeIP&Ng)s*p#=yv5D3k57jW-Yy>2fvbI xpcn%&2BIvDSknhZvBIO8phAJ*I9|ARdUoN5xlncqhOeA<&nl2hK!ItC zO3nw!1BMHL1%TG!`EnZehyg$cAxxm4l(ISQsrBWAM={AL{(0?Q*$0vZfUIOvZu(sS z%RKAhG_6)9 -Filp%JR3~-D<4T43DlzNyX;nmybK 62!4d&xKY&_drH+Vn#}}LM%rnPiA8Zx?veKQ*IQeFbnR5~H za_mY}H%geflmXi?zb#3i1}0;RT~|VEHSpZkGqMjm3jkT^D5pKV92!~F7@K1y^H?N; zcs!E!8ZjCPyd@6Jr qyl1^DuOJ34j2>0)`!6JJ8mVX#1Mb0KXwd zOzRlXJFJfcAp%JuA`USjL?!|tGMX#_>5aMZ>J3w}n>q^sJ ij-o7i5DKr<{9kP0C3!$FTpWpI#iA$#+pi! zoh-NjOkM!a)Ygy7km$-Ym=7%uP>6vbfN&Bd%t26iC1Kgw4UijPSCYQ(DlrLSJ%hu2 zxeo$-3^b}HniXM<=!i2^6)#_1nFWB|LC(4A8w96VAtbC)<6AkMHq}K38P*kH7>{;@tu!HJ^++mf)j50AyiZ5v!F4_Mw-e1HZ>7= zJOl3G^OPwDMhHMF0e u0%YH!iff+ z6d55~zyxR=5~n5UR207=#CnSmz6JB|#Fiz`X8~X+$=Q!?K$r}bbvYK`Qlz`&mU#>a zg~N1t1OO)p9smx2xr==e2gnabF!AqUy*G4XTFZoZ2K1##F|poIIV80(UcX{?765jo z9RJ`#*mWBWn^FwPmB>sAZc&m=3_oiR G7v`(Z;4I18b3)<56bf zYM62ZDHijMA07fDQkMmQK~?;p{u{QUi7=Qw1gb>;Bl^8bZt}QqIEf=+?b$WJy%7hK zABmF$a~N*#Ab|DAR6vsuC&s#v)arAaqj=#L)3X3D7;@r+E1?hz5KWMb(HXoCC%~1% zWSuBM^Ep2QEQkRLg3*$64~EkgZvn75!(Y;%>T)$KZsVnE%ZAnJ47=7;XFRwXCb5S> zGZ`qzEPdw6VX#I7AP0nE5a%K@(R>161tEustVkpo>BEH$5rmm^XEJ6eq(UVOGhA@e zd6D`BAHaw U3elALpO)22mo#nyZ|e`-VUKX_LuxGgQ?x` zr^KOG+iTGqbB+Sk1jcYUJzx;6PX;(MEt?h9wn;Zb{Ms-`A{rI|@V$qZK~o%xX+-w` z$U6v&GM2#wL-?WPGLQ>m6#$3`AYy6g!ia`cBNkRnJu1w2Ot2Xj@o2M@&X=$bT5 zO-iYPC75OM`4f{+KtiyhC@~U>)U5W9YPCgG&1MKylZwS56^qqWtqxPM*i10Czdx3k z4m>EzH4rgCv>Kdo=0X4(O^Fo<)|s#0c~}+z1|p|CvJTRSJ3urOgEJ>DFL~ZS^qv)w zi=|N@jkv{(M?^gAvqS?e&WNwk6%G1w4L$BOP3h20(`}m4$;=kXY#HDNF-eHHA}FLP zN=Q*eSW~rt)#>p&atr-7cV5Wi%8jTNM_8zq1`=v`=TpX^vVs%_V=V?H%aJ2Q>bC$# zUb%L176AGqr#`q0ER+Jtm^w(lxE0{Z7&2LL1h7Ob(BzFre8o|JV{Wjep*Rxs7sli9 zTvJN7DcQ;cRPq6c6oR6Pps=P|e0G<+$?5TKbmkVW*POWldv0+QBrvo9f$9L%4APhB z1bq8S(bNFGp9O%F<%lEhLEecc!c@4JfhmJ@os MfD%~c!5GGVX^v>Bi=fGpZo_Z;=r+X8hP+`js)rQu*; za@>#=67VvoEtPp!2@@ft39-%LaIDKMDP7?y9^dNlj*jrI0|J8}Rx#KZG^WH@;c{w? zf4`(M3jp28!3X~wrI%cVP@t)thz7I#$_4O*!CVh!iI~5^7Hr(=YN=W`AruTv(j`~Q zk>5#JY62VW4*Tl-u@hH%iYppyo}$<;U|T*gHV!HhGJo4(2{(UsxK<&Dm<}E8n2mJnhVy2wP3@3KO<}3unRfVctF8AW1ifPN- zqbB+k%_;}+3bq1h8cgsb&=OOa{@1SABMSf><-~a_LChs!8syH6TnZrLgE}M4)plRa zI&V|e`dKkuPSz!tAuAojAAYMUR^^wJFUc>Ty3w9DCYt$RJ( Vo+KGL zS(V>OtcK(<0e|aWP21K@3)inREjEW=bL8km8QT&9iOj~ d&S@zN*!p#x2Vy1pNMe;wB~m!# ny07GC_nx(T0>GJ%Y(`X%X)MgyNVMA? zJmL?Gp+qb1^f`E@Ap$jP-Sz7hO$daeb99r(BinjC9U2;P*{z?9o;>@DoY9k7Nhs+C z0t29x803maCa#J4wyl2W&SQ2@0Qkk-j782>v%rJiR@=%6>rd(WM1S=vPyPBO v&X}pb^u`FN5x~|#es08sHHw0&m#><-djY^P_b!3M zW|_dC(p~WN697(2Q_o0it*vh5g7VhZ);TeQXJ*xOP+WtSoSdBhj-7t+5_{gLa2h{) z^)6_QCRJ7zlC*?gys={U0Du!7UIK-!c>rb(_B9ZY$7#s**CPR~aotx1ja8fGL<~8b zc~I&UveH3RflWoD%l=a`<-m2C-EE{{a|FSZxdtLV!~@R!WXi&`o}-Zu0LMMB23|!~ zLLA)}putv}0SEqAn&jKI(p$TB@ytLZK36j5W>s;Q3fncYaO{-X@8y+EuOlINfcmg0 z*+gV;6_K&obn?d6E}1sCAUfDL+Nw3fYUWJd1 x#y@nggP7 zy*%sZ4+)`&E@y98{`Hjn`Yj7aPd#w4)l<+6X1#w~1Y-dBkZ5``czcsjCW4|7Kw!iI zzzOqLLD8ibz^=%-R|#C)$M;wOxR_0szj{q!-MVik`huZZQgW8=ryH6Fh^3~KuKK## zV}rgoCykjj>#Mx7J*r74f#g7xSfBO@Q2{g84>}tcJORv0Ks1P7I%wad;GL-k=3TvN zKk(pp+96;Jr*`b80OSU-2VhN)1S}0}zA9*_*|uLau8++sYnq>ns=?wZfgWsvjHf4_ zCj>={O2&LPdip_YG@Hu+po7VuoQjmnQJ+bm j^DB|30Ra&aAqod-n-gy`>NqJ3s^( z3&RLC!;Gef1v~AwHRUr7{K7qIf DUEt=$tt7sD{@TgL zhyj4Sycsy;7cW|f aXy# ;jQq+zCLYeGz+={L{9ZLeO z ekM?f| zFl!BUwFgH(eIu`8ueo13yraXNZ3Ju}X#=PLKr0wNBw_`H0O~O4Ls3XTQ7WQEa$Tms zDdWXAM_joC8bl>_%{Xn1fJzVwKwN}GyRR-yk8j&*PxXo~r#1V0b0o7htJ*0nZcZ^Y zR{=5|wI)S{>d1xAtdQ{t!2OHO#dW>NSF@?aX0z4Uatfl|Fk*YcEhG&flfV+7fl-kD zQF8|wT)X=1M=}aN8E<}>XV`7r_v5#8ET9eG*&r?l*wfv;GD~XSuq3Z)^};<{1Ht{6 zhu^T2U1RwRpgIP%gaeAr4O{U9sE*uz>tjqeMy>z$vlANDeqGYu7QKt@L+k;`QYK6X zco&p!lS-;G>eBl+4c{2R8S|DRF4YPKDhAKxXD5JSfbx^d-|an0X;9 Jn0SVz%O`ay#dYaq6RF$(QNLi0h~t%;I)Ow_IXw79-{>jBZY zK02$`sd}dZ*23{1F$CHhFhdVE!U#3@tJ5$M8O0@|J}TYwh}EL!R%8-P$^L=l2e<~H z@Sv Cfy@R730hN`TD$rAhlW=Sz?GO!n@QzT0Un)5@ZlYu!ft(jBN|d`mVPk0 zwtDN_xNa0>Rk{z>!tQ~v4!wLRq1j+98V|+hLSGB{n4vV(*Us6z@ST}PEYyQR _jSK01yobJ0nxQ?>IkM)mPMom8WEK&rV{-qe|_Hk4tK6 zs}I!;Ge4`+ef9l^?#U>TfF*AXG*91c4l|U7hK2(-ef{p9W;`l-V47VmKq0_Wz?oyZ zOenhGiH*Yt0M5I6Ed-hAj{Gw~P7qH@QvU9oPzS&}A+o7QmD&}bl+@SO9%2~gh%Mo* z4a89^RMZCIX%FylKhNO@5eA?-^I**{OC%fhQ5Tw;n)chg@ZA~RgFv^X-wKFF13Vdw zzSEH20jk8;B!&+Ftj}!)18K{mBZ2~;0+17vg+x6pFzqy0Lz+6(uUJr2UtM*uZkXPY zsQ3)vjDx12=G9*!^2)DJ_43bg&LQay92pTG%vf;9uZ6HUU@fSCQ2Si@EgBl?=WJQ> z{xoUCMHl#D?}hH$L0k!79MU_{$p%{_BLid79|XJ=*vE0BhbcX+z7nIbc>+?J*+(j< z^LQ_58dSgH)1tcStp|-%pFd(UZaMWp{QSnVk>hqiRTa2h4jevbPlTEp@b$VHq^q^I z8TLWO!(dYfqzNJnjT3<`TmsdR1F1(7*V>1-hC{)zW~e!sQ&Q2ib6PVIfN-x0OYnlp z03kgs#t6o=6RvAn^~S?P8vsr{Yc-f?EC%ZTGgJ`D0WL|MsZbuMLw-Lqn$|D!)^1sU zz(_6SHJNeKN&DfJ%TI$vODLk05<~<=2+ZAY27Gn3ShTS|JuU$e*fb#H5tz{cjIa-8 zxCP866pLe*<_2_it*YGvHg&Mkr|DxN6bzIqM!3;kSmx_=PXslY8Q2@m7a-(-;QO zm4_)BLdBtS&C=KB4Q&^|(4)i{P@60U!wcf6eayfj5W715qGijn+`7$cW<_H0@{y?g zahb6Ew_W*vZOXs3rV%&&`Y&i|O_bCsionlqIv1B7H4~W`#>rr5!U#4)4>k?KRU%k& zM?-b>E#}M2TGghthc|9mvLkC$0oeQS^`2zFx&Yk&*Z>1Ae_W*fv?1*bVEXrdph?Ke z0RU2Y@(jPP;N$?c15coCqqAns;%R|UWY$Pk{)FW}9h#bWj8%0_xbXHz@xh91c=_Eg zamwL)!RfF=Q3MV>U}k!mKzFpwF*M_=iq#1s^r`6xGc1AT`q3_zYm3$GjqSh!0)5=q z9uPT@=ta;UARr+qXvx_pRKM)ip~(O)cw!?A*7MN63_}ONlL78uf;qKM)s6ZZtaWR? z9_J5)_8zIU|F+ZS;I=FOuU+|Tn{d(Xk79XEYa2lLgYE9;b|!Gy(X)`bvD`zuZG!45 zfaWgf8>2PNyiMPJdT7+w(6KYb3TsZ!q1BR{(5D7;i5+#*=-C>0Q zPeQ+^1Cam{^xud_l!nz`mbCbS`|%(YI}NskO~wr;?T?!-J*7?g>l#~d>79>ZX?3ER z?f85bUj4&0sI2Im;cU@V{OqQ4aLLg#kqHb?>_dODd4E7464y&NE&gC%BNkD*GB|w{ z3&52Ciu-|>d0JlH&; ;0h`5}PEVZglt5<@ D7 z(*goQvq5!wVaXc<)iFF~o~o__sLsBf2K)T}8C6R^n#9}FjT7;v0Z<+u1z>z1bx@d1 z&5j`p0P%3xn(&WOS^#U34h?+QP=ZpmY+jn%RJ(0v+%QI5mS516J6Zm4B! U}ba1ADuCzM||Og!+{S8>M^@8ZO3??-KY0wgq5#gDH)3+K!o*f=W9Qw(cC z1vF0)6q_5vsdJj }ibEpJHQU)`I-1;A7(5AJZ)#T!7hBQ?v}rp9sQmtQKq5Ck zw-**$1aMi}z=z;A<55rTiciKgwY1J*9$90!1E$1nryYo!FFm#0@<-#)R0TwYS<@z< z!fVG(=N*g6^3m;<|A~L&xBvVInjqBb5>MQCGEO=6pw7stDww<9bTn2~W9g>GJ{fSK zS)n?Hdr~Dqu_Y=AS*BLhXG-aew$>tV^!RF_YAQgjX}OR#CQLo1S_*=6<~!<^zWB$X z#Q=PhEJ)@-_oV)%NN;aIX33tW4U2P|o16C@i32-+a@w3u%D=U`0cYOud#v8Dt?f0Z ze|K)1@|#lP!6#nD-Oqmliy}Y-yl~5@_`mNS()Ri_8>>*;(41ru7X0>y7vQXeC-q~` zjsPJ6i?_5-*^EAaV9(lBUzCAaNfV3RE+t9hNZoIE*n{=Kv@L$x0Kl`xNc2 BJ)H+!3^HclOB9ejhP#LcH3h?_6#to#@L=uv#NsS#(~`e-K**lzj%_?K7k z+vh%pLO^X?;(_Z=#_7i&(v}Lmesc{jy7O_IdGkZ4OM-yKqT#xWPC{SGhZ1GMJTfpq zQDO0p?F*<;?beM41?o1rx5uB-C|&^LdeBW9o5s)s0L5VH1`P$k6On--nno<_X d2WzM?2qSfIR&SG z=is)#uiIRW|GQ-#HZ%pXy55hge)YGuzvbn6FflK+0JCEEB$|PaAQ74kmfX}!i49Zc zY+dpB-bOT-f#@fD0G^mEg4^j*6;(^y30K ?Nr$u*_H5o(hYRm`4C|T_f#LFeH=e!k+BVD2%=p_2@8X8X-@>>Y2mX2Y z6_{FC*6B0XZmPxwcg#m!AkoZY@3MS6dG|Fa$V()$#o{{ddgOV`e`iVZ#K6Rp*M1M@ zo_qvE(v{eE&ncMs@@J@O3S)9b5eUH3Hy@3CfA==VDI<&u5W$i+2C>FXDZN}b%>3$= zpU;`#EqPH O3{f>ROL;*a3t zFPH5Umiuz?Dtw(}5BpRU;Hi7AZL|EbxPjk2`XU~Eb0IWA&>8sKH7DS_Q`(h3p%a9Q zPo0D7&N{fw*`2*d8NU9}aj>c*j|m9P2F;UtL#x(6aCY;?Z!*_enqUQC0+Pq}3|LG` z57wk54`AH!mw^)vK;6ka=ZtlZ)FXbadf7))0#W@ajIg1df(Ye#HXN{bBBnW|vJA6I z-1utc7QFO_>o9t|@&kC{g?I3S$KQrs5r~+KyDvTpm!5eX#18fNGp39~WsU{awN3c@ z-Pd$bejUG^_dMpk@ii1dXfh-oz2*d*d&&_zea3dNSvnKO(S Rcqy@gYovKu1QuzTw)B1%4 z!Ki*9Mqr^20Q~g%Px0YrOWOYb#AD{* P5C7={`SH AunL0Tkoe8{N8r*k zkAor-OR{cL6;`a>(iRvz`{X0=(gQblQvSOheF2ZYxe%%#giOYtuKq60Ir;EzmA^aL zds->JxcxY&BQPeQ<)qF6qPm<_vtmJIh8v m%o`4Z5P6Cen$y0dmlSOU6b35BToxi>C4sQL^+sIJ` zbY}eFlB03uxyQFD|C)_eIQzE8aLO%@;G2~j+TQ1J+1mnsznS+u9!XmMpvidT+7ocz zsYmv^ZP-40l;PPQ9F0bUN7S R)HZLQ1nTuC<*DrU^C1Ch4t0pPTI z7r`|2u^5E;e=VDr=7nPBK^Wmus1T0&+0*#o( sOLOq=&sO5zi;u$PXMd-Y z<^TSzkD}U_IOpGEj2BP*_DZ;%o#UkAN=q;)*Mir-T!Y81JrU=ga>RfdhQ9OJYMge@ z>)5bq6J#uyD6XLq1O!A7niXcmm(r_a;Xqz)LGibm-J@slsu%)>WErS9=7#Y4w;vjO z061a(DyT7wiwQH4$XF`LWKgbd`3IwX{@}5a)1G=cbgd5okNo!=96G5O<4P0h4wEO8 z;;@+&`0kPWw<-VHP1QK>NApqTOSHQ>u(G(*QC}n)$NJ6HDDdWhh%j^NcpS0kI2SinX!r9q^Ukt-uDwcgSx)tQY^QzHR+ zRzmZX L&>F&te}3cvXvF!FvEuz?9JlP^7ii?r(0GU`XEW=J=IZ1kU=!Go4}r z`_7u&$?~86gL&A}l1L1jG1iMe{rbu_<&WzIe)Z5laLUc|I>iL`ojGa1%AYilxcsbR zF}>K+)-ibGNuqQ(RfTS8ZazGc`B(q}5GL{TD6`VvY`Fd@?!2||g=15|$+LdqjB-AI z)oOP*ZtjQOR0xcte*Aa5-vI;wz!wPNv>!f(`d}i-=YR>tc=o>QkiXsX$Kv?e{m Pc$Wpu^UT?Rp7i|Kii23 6SG8OIxPf0j_zyhs-nUQ$!RBz|qu*W(k25p5Qw`02fO*8x|4uGh>IG1uv3Bc$ z@lflaECv(hht!s_C*S`~W&z;B)0ZJ6!cLQU;tmWcBj-Ovgw`!fy-}T~V}zdj_eCTp zn81HOUfA}#V-B5-SATmEp1S*L xf-{QdFoZHWbxOOm5t;q?AZxL^pUxszo#b7U4ebuODX)0DK3U#AHs{ z`F)g;o7AHr)nB`@Aa3$xWTlM>ocrr%JGldMW>4>w GeMPv1*gY;-%usT!`OLdApS|Bn40N=l_ z8d9^41;{;Eiydy-<_JY%voOL^e$x^CIr1le$GabW-RbwSxQ?IQ{|x@}?l&L;Y7NFe zesX5Ulz+wA&G`OpkHLs1PP`PScjT|VP*QGx9*rB51NEB+vvHz}CCbkD%oZhxeBSKsX;n@$DLX8Fh5Y}$0!Vm9x z25&6d03w1xgtvZu0S?(OGX;|?*KWb#H$H+$G;uUm?9IdZN6p6EsU^_EF;oTOBPt!B zlhstMFhb3#Y n*7r|gso+sX zoAUc5@V{SQm_g;=j6-jn*VbR)@TsFQ|Cd*^DL(+%tr~7VcP_3!YBEgb5xMTE4i+&a z%3HRs9Ft}`#J%X7hpbxh*$-_USPZ~oDMqm+Bp_&F?-riYmH{I5m DgPFnb^GH`la~L8X=Cu%udhO`Cs6 L)XCH#=j+z8x1fqcANG-k>iAE ~qIk{R4pVgU*B+&@Id; zP3@XEO$>k#Y}o9In_QVy>AtU>l7YH>2C!)98c@>mA3dWSkNomVhZU(~Aq?% &`&Q$j=SCR|7`xd_}7wZ2udVx&AW0gCYBa-*c^oY_9z9yA$+>7F)cL+ zLnQ#iW*lt9dN-&4GXgYKpghNh@%b(kI5ZFl&2bX~ohxr`g7Dgc6__)v z6s4mI2mIat`}|vkLJ<@dB;vm_rjEyV58E3~hqZ&{e;Y4 zgHhNlDuf^$Fryq43FGq(O(Q6=gHmcEE+yM?y@d-c&YU!q2~#UlYzt0+g9(jm-kjIv z_jY*<`0#@H`0pZ7ioT3WVZ=G{dLGDPhMTJ$aYI&QRUZ(VhWjr&26OhEfdX$19JWMb zie_I3fj|HYm#)RLZ+?L{mTyC@rX&G_amt;4#q+;7A9Dwg1MuF0#W?*JPh*tBg6HqK z64NJ@LlFXsC1JtBFg9>|MO_Z7mc^gruLk?r_ZQp!~0Yv>bQ6un^Dx_(Y5;&IJ+S z`ZEs(7`XqPRZvGjA3??H07&1Z6T81sb;&I19_S4DiI92o&o>_B|1!^tivTS@rgL zlX_ A(a+BZCQ$02{GX+yIcN`|``CY@mU;Km?!;ori_=_6C 8}QU^|Az 659nuD9qJ9MYbaNL|Jc=-JN;g`T)uI)_w zU;Ah|E_wVD*aRUa8CM-%*%mWMnlM~{=E1n}=*c7Cbbz7Sb5bI{p@6T_j7J6@1Yqv7 zu1QstdS~p}3j+`;W`E}jih-u}GXR&50aWdU8@9Nc>$c9-4YP1}2Y|TAc;@}Z*k@c3 zCY1Ny?m-BF$rDO(_K|zx_`~;w-Dc^#@_)4!r$6*R*oj~;;qt>L;fLoR3QLlGv;-ok zZt%nFNhtHw@g+EYzY6R*xjpFk#>Xpg;hz@3r4Zth@q=R~ G1@niDaE&qqhan+v} zz@rchX599jskr{EL)uz~w*(@%@%OKzs;;%237mBZ=2YYj?*~N$VRfXUAg*9jRmniI z0x6+m{h>{&VMGdL+~2(mQ2xj#0K@=h?NPM jq;QG zpT$d`uK@`S7eDwOzF4-oBPGRaAFaTZkA2wI()-#YCU&Cz&Hf0k`@@^~a9x7pvLZ0= zx}(}oB(}?h(gM76>47jA_|frGas62bcToNaF2DPAd|j33tScoWuD2(SYMP4SUNVph z0|0 7kbVSX|G~ zs%-ZXiN^8a=ilPE!)B-ao-5Bh8V|g;6lGQ?;- !3k2ZQqh_JFz>WQ9 zRJ3Izw)n%i>fYC}u*wGlFv?}YleZp^3CTnuQ!-xuaQGhy3eA?%abR3GisE5kk><#0 z=?|6X0RTYa?NoB=!z(xa>)NTE8NfDC17Ki%_lP;#kDFou1@U0BC9WIZteW?{RNuMj zulVmLi&K8bl*%$ZarFrhwuEQpRtSGtunD(6w+R3Krn;?)&|}wd TX5SHG_tCVbu_?rqqaQ9PzqXXMPC|X_X+t~&1nr=Hljsbpne*nM^Vy6)c zDY{|gWtF_E7yxzRfM@;kX}q^!Ny?vb(s2jDZS6U&;+RSKa61#HuQA=k^?!T|pKopf z0m!wfc;$}cF>QRi^8e?vRXAzhhiHu&IP31Wu&Jh{Gh2!2xcr{i@J&si&GNtc)9<0O zw6G2JpL=I9F8TYHBL mYVuR{LNl~^U>Gh0D=i{Y@l0eQgM#6699~z{XG!i#lRbH zGJ(Q lZI#TAP!CHof%wt87g6@=VAZia9gE|X;9xV}9GaPXz~AgcHA zV!HDJfFO|a^d1X{9c-8s_P1uOe~L19%4p2{`DL(ZsV7Swd(ae|_xG m|$$0! 6qk)N5c+2*Tvjo@1;AGtPeCJ$$ri zL+3}zz?+|}#5s?A2o;Hmz?U7GQ2vhR{8!)mI=-#; GT< HL1n3JW!{|IUV}LG;pLDDyhvYDPZL1z zsgBg%W6+3&RVmq?Rrj6!f3ribyr!urPL}3|qjB7R??3R|*V`a04xE11OL%ud&+VW~ zNA*tf6lPrf(EIp!@rI838VUgxBACp$^pNqm^@77YoEU_0{%>Awi}n{<736swos@t6 zOP}H1w^qO^Ms|nyR7QzQW~&j8Y&W vf4G2&g>i9cx08p6G zqe80yd$#W`J>pkQDYF33ktRyUmB;Oci%vfhqKhs+E7sTG@B?Py@B?PG{Vo(X(AXM6 zL2lP%%4$h1W+0hy-h=Ps$!i&h?lU17Lzs#u6@f37SK-zR4sEmi&Hga1y61H)uS>Ag zT$_q#?l=Jx#ujw4{CB@O@|7PzN-h8c6!kYdLDU3hfRGDDZ%qY4X}wN{TQdkMoC**$ z9qIgV1_#k0(%6*`(!sIec-U_>rR;wNV5-SS1PqrMBd70QiJ#waHdM9ipxx{}$}xM7 z^1gwJk-7m9%((dB|KYFKq74L&I$$!6I-tE#bF(jui|_h3zO79(ry1?C;K|#*+ot@6 zDKYQ41-S3+mAi%VCjdZ8X&Xj^t+@o+%wPi83L+=C2PG#8rZZiV3HCq;q>@j!KoMyj zVo0E14-E?hh}|9er4fs0{Ye2P5>Q=U2#W&{DIl*AgYK^z@*}Jn!1up%K)1@@U)j3D zS$*%g$~gC-_wl!@O&qyj=VlVkzA!Go`!#%1n>gopTU9)D`*$(E&GJk9@tKeD;Cri~ ziQQ+gQ>vrUVv&%iv(4l@fI>Z3>` j C#D$J=juOZa}OMV&p(_m4kR;Z3#7~$58 zZ31C&z>+sQ0ZuHT`|JDkeS!!de6bAs?LDp26R&A##rc0)09RMzn0e=angAZYcn(fF zbPs&`?MD1>a|=BENW4)1T=4M!@TbcS95W};s&USq S;|heWV?OCbg@hhAvbi~)dRb;9Z$+fD_Epje%d@d(&V zy&vQ&%eG>YM@3;l9^!_?#;rBD@!l8E8rRwow$l&o{G$-?#^No=5fZ<8{%i06y6*@8 z&wRNVGYf5)Sf0T3(otTVdDxV;sX&pKf#3b@1N`-q4I^?SSZWI;U sNN04Y qX-)MKEIFf6 zp2*S@O;hY1m| t-GLHS;HF34g8Q%U!evoVABuxC8?5;i zeYz%<2)}xHNm{sLjzYNd&!1wRWSns5bO4Do Tn3su{4NTxo{{S$SOpVhs{fws9Mm8MT^tRvG=!8grT$f_)0^^W=H4S9 z>1{l;-SVRww}gZOi? Fyy22*nN51!G`lNIeQ^MEmia(|Df*ob%^T@#23LA(HG= zRNd&uosawn&wQ~tJI5VJ$(NPP8cTDh&BBQQdB^In0Ma~ox7`IGn+jyK0jD3^kNk*T z=%Uz&nF-9jhE9cMh2~CQt3XmTsE#}s;g$h^maukX`FFYp8#GTbbYE@1owiuxCRlPu zL9x2AtLAU#D}*2ZV 8R;uNY7g=SCthF4wQ0e_}qb;6oAwpZnE`%XtLRObLf zF3gCxR3X~1J~5+y7q!wM06tw}Q)>iKle3E7i2 aloB zQ%)M`Nzxt2%t{)3fK>JbGqIFC?0e1u(30V6RRkg9);A1dOOFf2y#oMei0YD}^^1~g zo}&IKf18m|66|5X*q5c>L(c`Efj>DS4UA}puT*5d9Sgw%?%@oR1cOr8#Vj*M6jWzk zpJD+dL?Zoop#00?fF-vitHdLX1F%eWA9erWnM_JoiGELekkeOU*xjAv0p#z=5)#Nv z4FEC~3$XSn7LZ8yOb-|-_8e&LqQvJhxBp~ixZ3}eo*xkzJp~I19N>f-kV%nhGGi}e zYXK%N64ikwx;Sy5R2e` ITNTuAI$RMF~rF$m8;dZ;nxf#4vQw(s@NN-Egu{&@a zUCcETswRaZdhK=I*OJ {UfjtV;l35k#lB z9A#`nG7uBU8~|8=9h!VFd|d&6B1EiL8Zs!sF^1+Df|JQf!0H_f)s^3gp^#A0njW2% z^!WcQdv^hZ5HV6!xwFmW9m`bh=rF=B%@#VQVgLg@Q=tDlYHR>N0XhT&g<_G4qQp~C zPL@XB8i4dm*AlS+Bh)g~Pym{{5Sl9=(ugPH7Ft@8iL#Pz>)*SfQiO;K#lkym@eqI= zD*spk$c03IjkJm+!~_vyNWXW@gl>EnrcNwCXch($i&W~J2f+;h5> Dft$3MtbvZfHkpp)$~2ri{Pi%@7eQs>L8d z@!r>VaC-TXqCxW%XE$?J`fmAB+@q>y4UwXDP-@aU1pjsv4`sk22}VSaDq;ZAs#)Cg zXfVA~p8y6lhbyj#6as;!K4=e8b>zZYP|; YjN>=$v%oBQfWV_7f(PVVW?jOOHc zWM-CRapuK^5YgVefWZWSgnMFxtzaDVU=xgFQjV}Xp$?P48?%JoS_3m0=l}+OSo6zM zb|30Z#>>|nihZY-fhF+n=c{q^(_g}phOR$*j`rZ9BPKy66=6+PD;|1(csCMd+4~-4 z0Cu<6&%C`C7nw^MF-q`@U7Kq1H%bWWGKp040!a)jX6;H4Lb^w5Cbr_21eX8(a z13=P8f#xoN=FSI8nG8av(+V I@AZIWVLPJX}E}m6_e=hR1H3MZM1~y`# z6lxh5z&+pF14nn51#reOdt&MOIz02mmH}VmgweV9-cbQ#Hk`?Owf+B>%eUg*|E`5= z7z2Pbdf%ghpj#ZCSld2gYE9vYE4>VW5Y=-nQnly~#I;BOU~jq%Cy+v?VMgor*?_9e zWe6d99VaIBC{h}~ni(WWTFo>LXOJf1E!!aDkz`axfhE5z>0 WGvpbV6FUb_F zKN7~01kzNyLqI?i3>BX(1`eCr49OK~+1-i$=Ba2(7>OfDt7doUnj(7be8NUN0hA+T z=Se-91hsZRh&678HNP~aA(LHE{z$M9SAPG}4vt=Dw~7=MBE{q(LBP5#jhz?(04!Ns z3nC!ivaOrSH%bIjT?HwP${IQP&yafWr|PN@VT&VYd(hjTVmiJ?AWNDCgp!cl;&9p_ zUU=bT9P!yCAJW%$*ol $|&W z1e-ef`&}xv#er0Nzz~36zP=o9ezF3FDWMxCo_%W(=6|v&0bub6WGvjp`yK6&001BW zNkl hR>ZQbUu` F&3T Z-RRH+cwG(mD!z)|C0|Nj` z)b%?1=t;ByC{b-rQ&W_dxMB1dVwdp<;7HFjb5#l(;da%!{!FE>t&%uy$JumR0)^ zGGt1T1_t2N1ZIxTL3v3IDvDg#))dCpdOwzKZ9!AiL~k)I5-P0TGQ@o~FeB~mVBA*& z)r=?GmUaCh`Bnv9TLLrL;)NOCnE^~GcVkSB9RNe|dI1t30Na9bgm-A@nQKu{Xx|xw z_vpY1*8AfynW1@#5O1mKbyvh=VdRFYQCVJw$rC4l1R<`Qa69@I>yXLon>{WcrA2P! zyRFz #JH(9o7-=W3y8; zo*HYjyYrfm0DwNFo3fzoL!k!b0~1lp>(?aaI&^%}%>c#?@WZX>Yl|^P5JYj+<}x)+ zZS5TZ!UI eqN~QB}9?$r-@xF&^A_`o5Ss zWh~rwOSb^=#4DfUH?J=38$hMzwy`6}+l)kNZ{PB7m^DCX01qT@hl$$ -DmKnLM?3l0uV-n)t&FQSk#741QUDqvrMoN?{^iP&cH+G?}yWln$_)VMisbm z!Abk0vaAs2Klpx^y$Hs7ta##w$74ci_f18;9y^YnGZk-Dj>ctozmC;Sy(e9&PA^EY zAl_P)^d|{sEC|`S36{JuJGnom?0-;Lb}=eUnlgob*da2NQw(WD+ufJ#*Tsyhzq2=P zz3L1&Yy+!U^x8H2^Ntfx+09xD0;W_H<9FA87i0hVG46YN6_hS^;fXU!aMv}*!C}*S z4SsqYeY<8h;$X9PHm|8li_KFQ?5p)}$5gff2o7L5W3Q~464(g MYH&lOi%QL7Sf3Re|ujZ9_Lxz`#aw<`y!2YS(0U2mhCvU6USM|Mu3K} z1OiC|1$rr^BwWbW0#8HX(p%uRT(*V;C?u3ZZ=pbTCuAWcKvqa>$BFkPwk%tlwajQ{ zG|RWW=l=1HEseF!jAllXJ?DA!*pf!y^1ko+o&6lh1pt6x;7jj4JB#^EOJL`L9t@0( zVQFJE&gy77`MXQbU5>9@AHhHTa$8n%O2lG3{&!bR$^4@U4OQN3)wZQRh&yinGi?0Q zW;80Z )rX~C{t6Ir|>h{}%PJHN{8^;etO2e(+ zejI;zWB8=hy5aH__~PHZ?W7uW&0E&tJHOtAk)(c7`hDm6bFg|@!vrbJc AymUJ~@gRrzQID$ 48^7L#e|~ga_3cZU=)e1;Xbkyg*g6%C zPz$sXJ2_}Tv+$W4uFYcpfuRU)`|5w-_xpMwfnb60mshOE9bfp^jO%dY (4n@X|*PMq(zxE{D6V!lzc*}BB`P~zM)4 =7iX|B;(I$Iscs-#&cHBWapL z*&zXi>v}BGE`QC4BFnShf3{H9boAGMwmQr4^uTX-;F*I% sMU^4m}2PdkrfeePYCtU@dg$CBL< zsLk$FGy#)^mPC4}3uYn=nHWxqvc4v(6g25G&MBDxg!-FxEh)FL4JX=|0l+u^;u5qq zkGpbGX&oQ^{J-J3{e6(hE^AS8kg(l`z=z(xeq47oEPUaIzdOnN03d_$v449Ou?dX4 zaZM|ta<;#uwkq4QO=$+UM^aP1KZL-MNPabPR(f`!Oa$SrZrH~>mr+V{8Rf_E&56dW z7dyq>`*{d@Z$B{=(v6fDnA4m=r@yY(sVYNh-DsWJ4`4!=T3#7*BZk2F>$0tzzkg&G z2Gf&~c>j?>TyXZ%am}Hn2EZEtfVVHNLfr&sRy?WUu7_Vkm6C0>G%AFjKk+&)nsCqB zkRK}pP8?5UOPx0@t-_ktnfehf2lO#)*|86=bPb&VOj{dB#q1DU5!#f`l~jKnv~&WS z&gsnh`3tY?#ExTO5as8 2kaGM-!=yvqEV)4#}500K^2) zIU%i;nX&KN*H8T%YPOT8#y_rgEngCXJkcL8I)(!=4W20u&&%DT7>%b+s-8ig8_TP+ z0e}Hqcljz@`?mG7zQd0nd;zcAvpK6px-invMvg*qxS<9bAgjK41p#MGE0(o3W&Ld1 z?!%Cs9w^=r*i6GrL~?4Iby-JEmd)PUScUN2e>vr6J??DHxV `@}oh-q0fw&*oeF(`SA`0lK7 zLz=L$M1<;KZp))`BFj*L4aoD{$nvXUZvI0AX7A z`cMCWFWvAq1SVWpB0_Do4_BPO5?7qR5}zNA 31pt>! zP!u`qoyJb>_{a>&>4EH;+0sGNtxp|FZ>sg<6W6^7 z58r+j!a11g!qg^#@ib&qHMSot#u_u_?Q0_ybX1lnpS?+H{xd)N0N(Lm2Q)|28X!hv z9`|q*qid%-)Rb_@+?_IT;jD|FhZ%4*VPq8&4vr?#`q^KiUY q0#5IiMxy6LPoeEA)#ap!OM&vFKH16+qphrKl|#Xx7y@LC?yp9T#>PCfjY z)w2Tt06h6WI`N+G?>$D0hMZ3ob5Z(JJKO=oTV2-|A2=Qrj2T6QnT+Oa2K2|$NNEPV zne4CnDi6+bDOu7z7aAHl#hDcHqsgOUG(GviUDQzv|Ad5+SUibcBa=PPebF@fqIsHz z%#c(kB-IJUR|B?8+ZHubQ!9;SqJ$}+Y1trI6Pg^=)dk~<4J|WXYdDg~D*kM#55R4j zbCxrzL sMSsaCbu0hk#8CZ=xBsQw45b~?OO#&{Eu zxj=w$ iv{v$GA4^o}5*m!`4liOEJOfAb`< zx3a!`jzI;C!@b!_Zf{!O25rJRGXtM}`zpNW^0hNw>(PC~NTkLAx_wCv-nXu?uyZvX z7!YAFY2b^$+J^0WvX5MSwP!{-EA&)WIrj|8TRPOT>R?fr-@c#&xmMhQ!cjRL|KaU* z`2oPgH+4d>q{GO$6s>r@%e^(N3712eJ!6IlW@02KCB-Qde)aUOte;)^rq#IX!<$g& zR*(`5T`*FDkq`{8L&nA?AFf*41apF}x??DTJ#S=3a&El#BHaG&wW#-~a49lYRJriP z&2Pr~&TMA<;iIo*C8v~v9LyMrkAtEtN%+ AF#@deTFjXX;Mm(NC z|Hv2u9tS)w6)v|64Iv-)9vQ^OFFc5*35WdrmH>YGrR(5!X5TY1mWHMo2>RTUe)q%+ zd+;}RzW`T>0e~6!<>#)%g{R~^92*E@D4c+*NC^5|sIKzk>pyx5|Gm9`0`me-{>$|U zOem6JFlqvxtkCC3ER|J9&^tJaYrppRN!9$g#W?t{A4GFqwgopFO@auh35*|;v~I%X zu-EF9-N$hC*B*y&0x)&fdU4-ZuA5Xj*gqUYES^L(p`j+=hN{T$`@N|4yYRyY{)lfp znho|}z5ZN$ ElJwQpz|E!;$U z@NiC3t3#ohhgV+m{%4E0%^E;^a*%ujo6qaqhl}MIG`1P&H}74Kt3LOuE&()P)~2Cc z)YdP)#ua1Ep@Cf~LtH$IJp?Ni%gT?R)(tBde{<(=aqk!3gSN);C}XwXg=)VGZOt`P zII4KkDsSnD;k& pTB^AzUdusPFSDX z2@J-}`1upB;^Os7vAkt^KhA;S1it$3&)~~9UJ3Vv5NcCx08O=lX+dy0@;Fs^nnGx8 zntm+=Gye0}Tk-hb!D%xVtyDZG<|iOk*S6~QqFY+ClYnj>4u0f9%oL=Y(FLCD-U-EW z7z`ZB0d0ypr6SPO5py|}gOo$bq&b#*kA%UvhHL)!!+7YK*D;owxkOht1&;KO!aGG` z$eq7Ch|hlKG3 jKYaf;=o^~ZK{aL8Z~-7C z5y4D^vw8#EyS*1*x#zbS8l7As8;&M$=Z_!4E#G?(G=YhvX%cYm-PVgw{L905>GiHz zpCy{m&_6Qyp3$T}Yt#X-YYqPK2T$Qk_ivvuT{+h?=TfCzf##LbB5yI#%rokVh`OAL zOOJMKoeiL7r|Z7CTe4iz#_9Y069Hl!a_u#hBMl$;Q*HOb-5)gt&zh9v2sUQA=j2Wi zi}9fi&A4hqGaN2k#WXY>uXjhVrE3IFcSlew&78Nc3r0(o2cLNJax{j#kYyQTi8LPG zdJIqOADomTTuzEwjCZZB$Ggs1f?y^a(a?14=#Jq2?Y$U@rzf@d4h7sfIhf5v7<$|` zYc0z{G@b;Q;jCSnm6kjv7`MH71 Q!md!8VvNXaU!)s>2m)8qgH- zKy}*Dw6S;+JC2Rw>D>e9jwENz1hmpI=#iW ~>L z`IfV0l{z^Azz6Qw3De>5TSA;StsxF^cCi6Ki;p-D{prz5<7xBiS*4I_SI-q13qK(p z=F*XxGwSC;>}p+%_Zw&a2#nbAY4*VlXYJA{*TzalVMHfuOfyYCp81{ZoY+F6oF^hT z`IY`MwBhcYy#I=X{ m}? z;sAG-^Uyl|HJZPw=AcBFRfQ5p8bT|4%Gt@nw>f!d7bf!;{(cOhCt)R{Fq4stn%@H> zHZa3Jq^2y5C0j3@T8oPI7c~A|qPY#sl8ExI`?s`YPRtJg{y^{*r@vM!>pp{eq#T() zX8-_z2R^+DCL7(hdQq4rQ3zGFt&O-8>GfRL&u*nvX;xnpjltBA9_oTNa?~Cx7CmlP zAEw7 Skf1QNoXaySG~s*;3wroiQB`p^b=zh>G0|zZ&s!$U_|O8?iefoU z{Q&^C%kf&Ud1Xm$8qU_jqki3cWXlbg7vM7}fHr@09m90)M#c-tR9e`URhL!WcGiGX zp&a@&6O7pLf}BccEc2ThwBaL}X+-nuLopMP1!oG_15S?TEd85Toc%jlb(dI`If WorHJQZR;X_ulLnlv;Z)}j1N~hJBQ zaXYtFFI_iWQg#3s1OdC!Z} SHn z-0FA;NH=$Ecvh0tlA{+f2?8C0kRtf&_Z57dIVJA=`je|+TGjwD9|fr7I(MMCGv@bu zw-6zx8ek*RS87~Zy!L*iC$ALhc`*eF7?4_QL2Hcm=lp4}+x5q))-~lpF5;et>z?R& z=(f%|U1rXidry4!LIjm?7a&TmbCV= b58n^B#O4Kz3^E{R?8uAVwZ(m4@e*Tr#W9}&H%tx5>W~PB<%%I@>AunUltG5 zH@_-NQclAGjIrSbW#7^Xo}FzHga};(6IJ=FJqy_ue(N^)Ch*JIWD$N)lt=3&Eoh z>FE3e0078_6U3AzJ3k;@>J_NzIIlP8_iWE?CwW2Ix$|N3&$mP^*c2#xRDknxL^@P; zu(|VsS4-Y{jiCW_n2Ay>7pLr|C|Bt^x)01kXTSpJ4djruHy3gR>r+)t%l0`PYHlT2 zMjFNfws*@xmNu4i7Tdx!1 y@@n%Y N&>>7+sZ=a!Mm5XM?FofyUMI?J#IiXyl=G&Zmg>K8VtW>$@?z>R z%2X>Lj1-JKLdbzYaBp45rXzD4**!b++oP!r0FVe;i_^Do0000il_yq-=l~roB?w50 zBT=(#eSg5~-I3d05cEhdSeR!f0xWV1$V`Mwp4??eM|yKNePt=$a@GY~WyKLKA-Wm> z4gz#SeIphkwdL+_EGz) 66M)|C7*l|MV3a})?NIP;`CSmrAnY$C2XF-RPk#~ zE@Gx((EuQ}!ULvhncMVm;g(7%N!H-7*N0X^KaXfor9f|#-j)fZZ{&o4PVMac mRDrK?Q$M% zTYuTBl9G|YjAD5u8K6FZdS?G1$2Bq+9smG K zQj<~nb7?lnibZ43e)D4s696203=kt%?^-g`+Bi{!vvJb&@Yc5_8`{_GaXTGHDj+bu zA?pY>&iyj73dL6gM^zIX!6wM=KuOFC+3kn3ZaEy)Eg(rQ3iFFRoQXs*T07SMF3_-S z0>hJmIp?`h5} BLF1|zGpd(uh}17x zx=mH&NM80}_}IejNml|@T6Xyh*CISsaMmq@>aT ;iy^yS6w?KwRqu1#T$a7 zY6+wwgfN+f&HP4Q j`(w;%G1J0VIwl*+#j)m+A7RP`PCiIb``7%F3q0si0b(ifWlCqgy6m0)nu$|#O zc>@U1@U73BwQvCd0Ax}%Og%ebHj07sQio1CE1YGINvcCMoqc& Ndk|&bu%q&0FW$;2`DVfhF}8p27wA_ zZ|M5wrfIjYwg$)5*PE549zx6fnPQJ5OEk)wIp`~cu`I(nC%_tqCwx6hos z5;U5(mdhB(U**rDq{O1=2eRlplTMDpBA!#}76XGs(!M-32{Bc+q0?WZHLtz+jjDie zOFp2&mT7m&UEsqiiXdX4RyF3p%rymN63Q+goVD#BSuOjkS$Y!sNO#^1VVtURykp}P zPrHNl>8Vxtykh?;F!qCJU~YacL`@;_f(L*nK7SF;R@MvyJSUerGi#X?;+|ZkH!-F} zW>2U&)w1?YdxCz?w!Ab8X6PeFGudaS@5nJpb;D8BG`-~a)yzqqC&dA0ZF~L$K xg Tps_ZHhP>i!)VBdqlGpG7A9n;7a%%K zLBIvs?FWPf2n$4#4Gh61D0z-upPH8?DDEJ@R_=ZFR2LL)b$)A}>2_R5TX sh8wnF_-s!=NH`BgEtKFO zKuZ9g2?%^3o>r$F8|?NR+xg--u|(>eeBWPkxZ$X3kq1IZ000!0Nkl ktj5fi9 zEhChogxJy&u#%%Q^kyJPiW7=2l-F9@<=(voHGWYQd1S?gi=PZG>72nqC#AtWQ?{OA zN3;+r?v`*LE7pNW{^z>I0RRAS&G&XlVD ziazuNVB6+f)|8|cx@7KInOtJ7j*n@Ug8}q`X#X@w%V3&uv3&JQ6RqnmeZ4B+eFb?$ z2W%;0K?@(XM@3bJkS+jX7_q^;^ZHMaQ&k35oO|h$w%R|_ev*mFA!-6J3ef(7;`+Ir z_c7f;CF_JDm+HcfUJcdfU6cgSS^`ajY&(pinUJIF6#sw*Le)(7RXqXI8>|T%u|X}Z z>5ciWg)q{v(s4*m4@gofd^jIc-_W2(dJ66o g{rMuDt>Gzox? z05k+UfvqIkG_yD+rA73>Q~$QO0O0uXZCLZR+XPE+gHXaEbTR=7+aW+Y;Q(ZS6cAi9 z+I?=n=?gW6#n@mpl} 1PT2DMyn8#&zw!^B zP*W T5 z8UU^WaZcKYksecy?|xy)@qvNMOv@@L_mmU|9KlArT(v@_llpoJMr g zK+^z(0g4i#8o;a^DJu@)YgihWjpSfD5v#H+k$?CyqYbd7LvncLHT&(fl=;Gh5j{Sq z(eFfLG`6%o*S_(}9kMgW@!d>m5N)w-d`gvz`2jGqwQuCUdyS(<|4>qfDJ?w nDOB`&vNj%U0uu0z5F>}ZR^;qH)R?FAp$_pwEgPGJfwlL5MA|8 zm;OF-IbLR??<$D4x+D`fm3uMCZrV@_JKUE9C f&K-KLx{dFy2(qltfDjBqd zD9nk;451}prK2E8&eX|Q9EG#-pp}Y2kM!DYz~|7Pfe2=8eZ!XJo34DxUDc4D{)mua z+xavIJI J~={%B$-3)8zP?SrkDHoyfhdNM>Z82CCC5@ zjOYN&_#k9=6% o48v2{k3BkoKD0%#-2( z8vsuu1StZ$*JN2$HfHoPNo8SvU>@|*_kDLyGlM$If7rMcKur!GbN~nd?3-vJ2ve8B zU9VRk?>@L8kxF$k7sq^(93Cj%5M-z4%+U&1z|vE&5+ks*;+0#giX3TLy7I+_&hw8+ zs$+ufKvt%2WGqLCE&$qt(oFoBiPEkf^W}TLbw0C|F3Szep2B9N;{A#{(1hYt3g&@y z(g2ePfoBCh9d=pBHd#YH|zaZqjN1tb23WiJlwd-+&+WO$=)m~(b&3Oxy3Pk>|< zveO6I9XM@s351@6m5#$o$BWu=i3ny@RrQXRvoC(lQ{9-Fz{F!2#?N gdtkRmZ#btcfQQ zX9>ZsqCTf2+l@9|evsmrb0^&S6Z96?)M063nd-lycU@+e)6uu2
z`oy!fbG04?yK@5lu9lZdP~w=Gqly2Az4JfB$>Nqpkaw0KBryx0V53Qv}V&0V0o) ziUz}7J6nf)yUrd Xor~DGwOvBQX5a}@pBb~A9i+{`% zSsHC zWhvgD zSs>PXAUM>uqcawZU1SI>o0oN-AQ(xKL9$|N2}B@Bc5sv^Bh3W>wuhoH+iJUIW!voY zROu*zqh6nH`;yLcpA9s3j+U^-B4U^KmUFK-ni?8-?WwQ4b>3{cc~48b`p%t@CAl7; zv&wwyHh@buC6k3kiIE=f;K8l!v1s%{%@k`;rp(LJfn 0)fDbO`V&z`|8@_(IA9t^RAo98s%zR>zhc8KPfbgzJbn%8g&q1U7YRv-*VbQkR_x2G z=a&T+ghXn8p&xCnmqdihPEeWh0|-oZQb=i;k(pGt-wZUah}5*M+UId9yIG6(Tc+t2 zi~!0U3SEH25+UYwyZ+SDvG)F@=Unl8&C;`aRCl0U(s(SFvE0QK3baqiM);n0HqQIv zFR03t8}5qGaT+*_fVy(x55QIBU2=iM@G(!c|8Qft|HxX+Fgr|9M(t+-kVJ?&Wa&^< zL(8t(wl(`bq2{FBTCJ?+u(132l`r3)KnEqF-Un}9wIKFk!Ih@n_=_GI8ji0MK&VVB zAcOg=`O=1%1to@$dZRu2Ye$EVuTSg78jDfOB{ogwfrLazI8^0Ou)218P1{*rzWSwO zCARHnqrOZ9V7biBBTFw{edMl93y19%+#%D_2D@0=m4vkhM0I7@6pKK|7~DQD2uu?D z>e|Qr^~>XpTJl&rHuQ8N+}{`Q4i!ap-v)&ZKzZi>%iC`)c^}F4keZl&cH-e4J zdYt|mO?7%rW--67L>L2?kNIVw`@x+ g9p+-Dj-=H^G z+wH4v-0!Y#9CmmD#sWKHRz~&L%XGgke|2s5&;GJ*!SULH6)aa?c_(V#^)5;&)-r&X zmcclb0A2;axxkh}hD6m6R+XuzWFr+<(y &Lm=JHp^o!;t{>~IZ9k{V?e3o&Pz2-L;EXc_Ls1Uk^; zi1nwRe;&Jj_Sp&m ^H2PLJvE1Pw`baOQ7Crh9G}3%bDpjlk~nS9&djupbfz zH-CD~!d;EUU`t-{!>y>&eLg0v1K3&O6{!Pr%K|>c4iIVp_D(0?002Tj2#dgiSO_o+ zV#_3E0Tvdq5Ol&0CrM@^Vj{`@zbrG6%p^%5k{FW2Co2*s#pQ`%Ph}oOZc}sT)y0%i z{Y9zoLrgmaapI9%)-31+Sv0<->+U)Nl6BP-)>&*v2)Klc(#~ZK4HiT$5JCXYSMvZX zGlFd~Fn-4Fmkt12;*cMW%0k}tpm&FfPh7X)7iDodmw);Yu1%~bOX$r2I!gHbQl? 2XnMRY$`-Zn`Tj1*Ode)w z4S+x?v;hJ+7`zH#d68_S%7kiw{V2sOMurBW7#LA3t|o?*8SB+o!t CB5MirnvVr>lWksEN=SqAM6LE$*IfMGEmWT2AF_)1}|BhXCJ-{5V-ST z00LkF6bGMdqPbYlNeZAhO5md)0-|6XBI0N?ei*;|!qtm%fliMp6`jCK2Y|1AcV9pv z?toonQ%wE0nSuJnx;*xXG_C@{i|IqDY`4s&QGgRz{JqL`fDWMe%{>he9dc;l0bTZD z^WSb*)Qfaljj6f%?tO3$Sum=lYO;%KiWn{6rNE*u X7Q+4$Z_d&8aNEX^b2x9I@L d&yfU(4uO#<5`XB#+~<%)w OX_g1)^9H_#z2# zk7Ds42*v}qtvxMy ;Z;{gbK*t8{C2EAI)^p0Kp2IE9>`{R^EbW&9R2ZW%@=3fsM=5d zcMk>zQy@iG8B`6H8Zx~Bb6yK#$RJ+H3olV9Vb8on95%xnbKGMGKt7NN62s36x_c2F zL16_xM9iZE3; OFiFjoN-oN(AD zEFMV=UY5zeE9C*#GV1&ZhEHcyd@+xEC}lv>1HhYcj=IYHJPgKR5XEQx98sJY5hfl1 zq=dy}IhfG<{9}0ezP~+V&wT{|W}vI@-U`)pz!EBuAc+F(A&cG2k{iS>01hxYK->Xv z{rGramS I&IpHiDAZTEu0i*~RV~OG|H?11$`~E@r-75ay$Cp(Ob_D G z>qylPwF;u;m31x1%$ezD6W24YO6o4s9D4P>5!`dnxs}zc0Koi{Z}~+S`|?L{P4vnd zFt0_W-+w7^V$dSq>$Fn*z-^l<%TWP CuqZfRBI;V-boA)1 z-Ud8y>xRmTQ~+S%QV76B_w17$I fu72a*!qeA8-saA}2#Min)+1QZ5P zr#db1%Klx%<)1fyx(FvCjDWD!DeKXPKh;rT{)z^$_~=7_y#t9&s+R<<$>a-Ez+iT= z2y{f2a4df8bv*TdKUi6j3IHr#y7t@0;PMz!!q8hlysWbBGaX186`=hwIi32$rz^I8 z1prPXdjDO!00|z8rPX9-7gn@^2~uBz)b-FUD|_DZmT%(szrVe*A{78Q{m8%kLcH~J zKOxDI8U%O+=1`t|8lA%9%yif($=bj#e}U(p|HsNfsQ|#~O*j9`2>M(DvZYGx0G8m) zbI1~aQHklW1uGgI8N{<+eoN(GQ~==2q3iB^4a9CRk;{@qJA)g}h&>^sz 5HWNO5 YDeeR-#ogfxz2E2mj~vOB zT*=PP?##}dBZ*R!mq7Z6{}BKHAW2DzDgywJ(eF<<81S7oSMOK=03y^%L_|?aM1;iA z*}>e()(ilkN%BkLlk68H957HRp~ZsbiR3mdmB$v1;g-gVF)V1n(spBRy%w>YO)PHV z`dIY=Rsg#knQ^j>yX9l>7HnjFNJ?Q$>V0?dG}&Otj( )wDHfjnf)Yj4A>eiOtg(47XJ{ zZh$J%%PYJTUi%F7b>v;X?=yomMIogk6O{&FMr%+D)W`=!qi;=!UxkM9C^BTLkeHpv ziy*O*cVOQ_HrKPlM&LO=<3e#8*gly+!yQA$W!VLMT6N!nJ{N$}&>k}=gJR1oUewmU zhx@Y%!&s%0)d8z}3V>2*GnI_r{rMU5W6u+wp9=Dy?hoGT>l;~5Tz&x7x%pWnM@P6= z?9V c}UG&QYNwG%wkvOW&pR(rfYw Yd~&H1DP8Zh}nnxvhXpB5N5 z+ICzGla7`YC_W*6p-SCC7#}zgv3q}5nlyr340u%+!Ia<0kM>*)kI!h |jM;qcb5$uS{ExQZ(0J^*fSu151%GB)<8b(4OVx!37)D*# zFfrCz(7H?e!6%>C3UM(dOe`@mC2w`)1lzBC*pCw|xcKBo3#GQm!V6@nUOQC#YWP@U zN=mAjVta~8R^SWx17@0tSPA&@Z{)WKVu8$<-qix WaEW=v1+}|rU ztUZ*4;I`e|*!h35SWC^s+twINkb~}9g(* o_(0KfVAmddjp& z4mvdM$~?t1qL_lmVI=ATV;#g6|^;?fD{htvvkniqGLM4}}}7zj#&q}> WRCH8nTeF!U(?Ebnnr1LgnYPfqlXl=da~)Zl%e#gsVU*CR@=E1Cbk zz6(+n(`?7{&qYcr^oT!c_N*n1AAG+{_BOm;{C~T$5Cz_K1KY2yY=|eR;v#s^vC|J> zVIJ~U?(bu<#I&HY#8hFhCm8=*aC5jhT3TuT@_(dDpx9$dMUnsaC0&u0DCJ+v{~Or~ z0Untu^S_T?84=xHuF*s*Wo~F#dwQ|kY-gFPPlF~2N%NNf^jS0>)*{!#8AAu9CaptU zM5!u*bWfM+VYIoMc^xdy_x% ^jr5b|$El5gi>gJp&;Mj%M&f0
z zcuQnv{>jsC1bilwl6GJ#3RvR83o8T=KQm2E5zRoZ|M&Gkk-`+!$N7CBNLKKK%Ys@B zv#zmxkK-9A>R jTpU>|xrZ8l@1miOHvBJjg;)q@+foXl-oXA~rTvCt5{P$4p4 z07Rg+-VY`n9X 3GgbSGBYem?&pV4`9OXX@Z!5K`^|q!~;@2Xi_J8J;xk= 9*=sc`O-j$SO#f8La->Gdc}O6*Kz*Oe$jV1!(C19P`k+Y4aTOGq>PfH zFiB|*W2d&CB2aKxjU1C{Hb->tXM9jGEC-MPk;n;yp%my3cX7(v`F{$cW7uE-C^La* zLf(o3Rj69jK-=NcilHeJNjy?sf}hsIs&ZXKscIxx;M0UhLhR?wp+rxHrpzFLY>dd+ zZ}hE3mWbhd(o!+%83Yiqr*exnlYL9E2MOCMoO224$2CW|(1LVUj})o1D8>3zX75d+ z7}Zz0bZpMu54gln%1utc3NvXobk?*M$hQ6|6c-y?9}`k{5<*$JiSQsZwS6j92PJ)- zF|!;QR6w0pBt86m1`0BB&M$K^pA-4X&-%%|#UChzlIQZ*Xk@wSjp{ttLnsz2@6|#y zm$jQ8kI&?AZa)5#t{DGA+_I6m07l;!ODi5}_DbYpt*8ieE8oZD7H(Zi%}q##aFw)a zhaSgLr)5cqTB*Qfz|S6zuft=51eaS-In>h+_8m=T+OClLuCW?(pnv?@lAs8 D0H%dl4j*;$(fE#ur|2LqMKl3^;`9}Zo# zeD7i)r$QSnxoALS*lu}6?_SSlt2guD`*Zs0B_{O4v}6|nkwT=UFwp*Yxf2~5+ZWum z8dE0t;z}FEsv+iKoKdu3M6Hw=%H25Me3qDW+bPU_s%`J#SL2Sbf%Z`kEVqPzM9a_L z_2aX~VDR*Q`#O^rNeZ;=Uo|a-3-O7*g%9#+AvO2|ls5hO%!1*F7J $vndk!`hnmAoo-@XX(8>O-e7Sib0=i8H_ABV5)-CH9ZlTOg^Ss}XYUQjMWw z$Y?=0lbGJ1rjCLb5-1A;8TLE5_Vb=VuU?(b;DM|)&P(`gCZfC$wf&us{A%bv8iabR zd%3xDQ7X`gQH@{MElTTJl4ghf9k>5EWDP~|!FbGix1!;LRMg&j$ZF_MHpbLKQJS=R z)rYv+P>ZHt8@|f0v*U^_sbN2TXqrXLoJ`%HGI;k$i;xfCNoNJ#-Qfty7K@E#g@b(? zZIquUxl0zwXL!XGAjZ5C%wFhm&FL3at>d^m`%06E4@~-eS8F&ZR%Q@jmvAWe@3dHX zt_s(ttkakjCF5R1ZPYkG{?a5jgHq9+g3r@5MkNlH)F*+DYZ^74+884-i#T4L@_pFy z>MVSpAH( _{0f1w+C5u^sh=L)JgvSZX` z(m?SB0_ji*nFOpoeLC?!z8nMrB4A{oq{@-=4pO2USydn+Fglgb6e*RoQrN>6P=8OC z=x>PNe= )}f