From 247725c608c83cef656ae06993ef3c9e1263e9fd Mon Sep 17 00:00:00 2001 From: Jessica Date: Thu, 30 Sep 2021 11:24:54 -0400 Subject: [PATCH] minor maintenance release v0.4.1 (#227) * Add research notice to readme (#206) * Update query docstring (#212) * action to automatically update uml diagrams (#208) * switch to svg * update docs with new uml diagrams. Add visualization class to components list * update action trigger to after approved pull request reviews * update variable names for clarity and in line with common usage (#211) * change 'dataset' to 'product' in core and test code * update 'source' input parameter to 'path' in variables module (part of a not-yet-implemented feature). * tests that require an active NSIDC Earthdata session (#209) * NOTE: using the fixture to successfully start a session can be considered the test * check errors raised by empty query object from bounding box split in openaltimetry visualization (#220) * updated product_summary_info function to latest fields returned by CMR (product_id --> title) (#218) * traffic/downloads statistics updates and limit traffic action to parent repo (#221) * GitHub traffic auto-update to not run traffic action on forks. * remove extra code block from example notebook (#225) * populate v0.4.1 changelog and add to index (#226) Co-authored-by: Yo Yehudi Co-authored-by: Whyjay Zheng Co-authored-by: Romina Piunno Co-authored-by: Tian Li <45267156+icetianli@users.noreply.github.com> Co-authored-by: JP Swinski --- .github/workflows/traffic_action.yml | 1 + .github/workflows/uml_action.yml | 32 + .travis.yml | 10 +- README.rst | 17 + doc/source/tracking/pypistats/downloads.svg | 2022 ++++++++------- .../tracking/pypistats/downloads_data.csv | 348 ++- .../tracking/pypistats/get_pypi_stats.ipynb | 37 +- .../tracking/pypistats/sys_downloads_data.csv | 532 +++- doc/source/tracking/traffic/clones.csv | 160 +- doc/source/tracking/traffic/plots.svg | 2199 +++++++++++------ doc/source/tracking/traffic/views.csv | 172 +- doc/source/user_guide/changelog/index.rst | 9 +- doc/source/user_guide/changelog/v0.4.1.rst | 51 + .../documentation/classes_dev_uml.svg | 263 ++ .../documentation/classes_user_uml.svg | 221 ++ .../user_guide/documentation/components.rst | 8 + .../user_guide/documentation/icepyx.rst | 14 +- .../documentation/icepyx_architecture.wsd | 187 -- .../icepyx_architecture_user.wsd | 187 -- .../documentation/icepyx_class_diagram.png | Bin 92204 -> 0 bytes .../icepyx_class_diagram_full.png | Bin 124664 -> 0 bytes .../documentation/packages_user_uml.svg | 109 + ...ICESat-2_DAAC_DataAccess2_Subsetting.ipynb | 38 +- .../ICESat-2_DAAC_DataAccess_Example.ipynb | 270 +- .../ICESat-2_Data_Visualization_Example.ipynb | 8 +- icepyx/core/APIformatting.py | 6 +- icepyx/core/granules.py | 6 +- icepyx/core/is2ref.py | 48 +- icepyx/core/query.py | 121 +- icepyx/core/validate_inputs.py | 8 +- icepyx/core/variables.py | 46 +- icepyx/core/visualization.py | 33 +- icepyx/tests/ATL06v04_options.json | 1 + icepyx/tests/behind_NSIDC_API_login.py | 659 ----- icepyx/tests/is2class_query.py | 4 +- icepyx/tests/test_APIformatting.py | 2 +- icepyx/tests/test_behind_NSIDC_API_login.py | 49 + icepyx/tests/test_granules.py | 7 +- icepyx/tests/test_is2ref.py | 25 +- icepyx/tests/test_validate_inputs.py | 14 +- 40 files changed, 4701 insertions(+), 3223 deletions(-) create mode 100644 .github/workflows/uml_action.yml create mode 100644 doc/source/user_guide/changelog/v0.4.1.rst create mode 100644 doc/source/user_guide/documentation/classes_dev_uml.svg create mode 100644 doc/source/user_guide/documentation/classes_user_uml.svg delete mode 100644 doc/source/user_guide/documentation/icepyx_architecture.wsd delete mode 100644 doc/source/user_guide/documentation/icepyx_architecture_user.wsd delete mode 100644 doc/source/user_guide/documentation/icepyx_class_diagram.png delete mode 100644 doc/source/user_guide/documentation/icepyx_class_diagram_full.png create mode 100644 doc/source/user_guide/documentation/packages_user_uml.svg create mode 100644 icepyx/tests/ATL06v04_options.json delete mode 100644 icepyx/tests/behind_NSIDC_API_login.py create mode 100644 icepyx/tests/test_behind_NSIDC_API_login.py diff --git a/.github/workflows/traffic_action.yml b/.github/workflows/traffic_action.yml index 42bc19b16..a7ce42739 100644 --- a/.github/workflows/traffic_action.yml +++ b/.github/workflows/traffic_action.yml @@ -12,6 +12,7 @@ jobs: traffic: # The type of runner that the job will run on runs-on: ubuntu-latest + if: github.repository_owner == 'icesat2py' # Steps represent a sequence of tasks that will be executed as part of the job steps: diff --git a/.github/workflows/uml_action.yml b/.github/workflows/uml_action.yml new file mode 100644 index 000000000..cb54ae581 --- /dev/null +++ b/.github/workflows/uml_action.yml @@ -0,0 +1,32 @@ +name: Update UML diagrams +on: + workflow_dispatch: + pull_request_review: + types: [submitted] + +jobs: + diagrams: + if: github.event.review.state == 'approved' + name: Update UML diagrams + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v2 + - name: set up environment + run: | + pip install -r requirements.txt + pip install icepyx pylint + sudo apt-get install graphviz + - name: run pyreverse + run: | + pyreverse ./icepyx/core -p user_uml -o svg + pyreverse ./icepyx/core -f ALL -p dev_uml -o svg + rm ./packages_dev_uml.svg + mv ./*.svg ./doc/source/user_guide/documentation/ + - name: Commit changes + uses: EndBug/add-and-commit@v4 + with: + author_name: GitHub Action + message: "GitHub action UML generation auto-update" + add: "./doc/source/user_guide/documentation/*" + ref: git branch --show-current diff --git a/.travis.yml b/.travis.yml index 12a96a444..5e82f41a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,10 +28,10 @@ stages: jobs: include: - stage: basic tests - script: pytest icepyx/ --ignore icepyx/tests/behind_NSIDC_API_login.py + script: pytest icepyx/ --ignore icepyx/tests/test_behind_NSIDC_API_login.py after_success: codecov - # - stage: behind Earthdata - # script: - # - export NSIDC_LOGIN=$NSIDC_LOGIN - # - pytest icepyx/tests/behind_NSIDC_API_login.py + - stage: behind Earthdata + script: + - export NSIDC_LOGIN=$NSIDC_LOGIN + - pytest icepyx/tests/test_behind_NSIDC_API_login.py diff --git a/README.rst b/README.rst index bba4e7e2a..ea845a2c7 100644 --- a/README.rst +++ b/README.rst @@ -93,3 +93,20 @@ Please note that this project is released with a Contributor Code of Conduct. By .. |Contributor Covenant| image:: https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg :target: code_of_conduct.md + +Research notice +~~~~~~~~~~~~~~~ + +Please note that this repository is participating in a study into +sustainability of open source projects. Data will be gathered about this +repository for approximately the next 12 months, starting from June +2021. + +Data collected will include number of contributors, number of PRs, time +taken to close/merge these PRs, and issues closed. + +For more information, please visit `the informational +page `__ or +download the `participant information +sheet `__. + diff --git a/doc/source/tracking/pypistats/downloads.svg b/doc/source/tracking/pypistats/downloads.svg index c7cd86be3..a2d400123 100644 --- a/doc/source/tracking/pypistats/downloads.svg +++ b/doc/source/tracking/pypistats/downloads.svg @@ -1,17 +1,16 @@ - - 2021-03-16T13:05:06.396594 + 2021-09-09T14:06:20.061393 image/svg+xml - Matplotlib v3.3.4, https://matplotlib.org/ + Matplotlib v3.4.2, https://matplotlib.org/ @@ -44,424 +43,421 @@ z +" id="mcbcae4a09f" style="stroke:#000000;stroke-width:0.8;"/> - + - - + - + - + - + - + +" id="DejaVuSans-38" transform="scale(0.015625)"/> - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - + + - +" id="DejaVuSans-35" transform="scale(0.015625)"/> - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - + + - +" id="DejaVuSans-37" transform="scale(0.015625)"/> - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -469,367 +465,530 @@ z - - + - + - + +" id="DejaVuSans-65" transform="scale(0.015625)"/> - - - - + + + + - + +" id="m8fd469e176" style="stroke:#000000;stroke-width:0.8;"/> - + - + - + - + - - + + - + - + - +" id="DejaVuSans-34" transform="scale(0.015625)"/> - - + + - - + @@ -868,323 +1027,336 @@ Q 471.809375 39.958125 473.809375 39.958125 z " style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/> - + - + - - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + +" id="DejaVuSans-73" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/doc/source/tracking/pypistats/downloads_data.csv b/doc/source/tracking/pypistats/downloads_data.csv index bb089fbe2..4b60516d5 100644 --- a/doc/source/tracking/pypistats/downloads_data.csv +++ b/doc/source/tracking/pypistats/downloads_data.csv @@ -1,4 +1,351 @@ category,date,downloads +with_mirrors,2021-05-14,130 +with_mirrors,2021-03-30,119 +with_mirrors,2021-05-13,111 +with_mirrors,2021-03-12,100 +with_mirrors,2021-03-29,100 +with_mirrors,2021-05-15,79 +with_mirrors,2021-07-06,63 +with_mirrors,2021-08-16,62 +with_mirrors,2021-07-20,57 +with_mirrors,2021-05-16,56 +with_mirrors,2021-03-26,55 +with_mirrors,2021-05-28,55 +with_mirrors,2021-07-05,51 +with_mirrors,2021-07-08,51 +with_mirrors,2021-07-28,51 +with_mirrors,2021-03-27,50 +with_mirrors,2021-06-16,50 +with_mirrors,2021-08-20,50 +with_mirrors,2021-08-03,49 +with_mirrors,2021-09-02,49 +with_mirrors,2021-06-11,48 +with_mirrors,2021-03-16,46 +with_mirrors,2021-06-15,46 +with_mirrors,2021-06-25,46 +with_mirrors,2021-08-31,46 +with_mirrors,2021-06-06,45 +with_mirrors,2021-06-04,44 +with_mirrors,2021-08-07,44 +with_mirrors,2021-08-12,44 +with_mirrors,2021-04-01,43 +with_mirrors,2021-04-11,43 +with_mirrors,2021-07-23,43 +with_mirrors,2021-07-26,43 +with_mirrors,2021-03-19,42 +with_mirrors,2021-05-25,42 +with_mirrors,2021-03-31,41 +with_mirrors,2021-04-07,41 +with_mirrors,2021-05-19,41 +with_mirrors,2021-07-29,41 +with_mirrors,2021-08-01,40 +with_mirrors,2021-08-11,40 +with_mirrors,2021-06-22,38 +with_mirrors,2021-07-17,37 +with_mirrors,2021-07-30,37 +with_mirrors,2021-08-23,37 +with_mirrors,2021-03-13,36 +with_mirrors,2021-03-17,36 +with_mirrors,2021-05-24,36 +with_mirrors,2021-07-01,35 +with_mirrors,2021-08-24,35 +with_mirrors,2021-03-24,34 +with_mirrors,2021-05-11,34 +with_mirrors,2021-07-18,34 +with_mirrors,2021-08-06,34 +without_mirrors,2021-03-29,34 +with_mirrors,2021-04-21,33 +with_mirrors,2021-04-23,33 +with_mirrors,2021-05-03,33 +with_mirrors,2021-05-07,33 +with_mirrors,2021-06-13,33 +with_mirrors,2021-07-21,33 +with_mirrors,2021-07-22,33 +with_mirrors,2021-07-25,33 +with_mirrors,2021-05-06,32 +with_mirrors,2021-04-03,31 +with_mirrors,2021-04-06,31 +with_mirrors,2021-06-07,31 +with_mirrors,2021-06-19,31 +without_mirrors,2021-03-12,30 +with_mirrors,2021-03-21,29 +with_mirrors,2021-04-02,28 +with_mirrors,2021-06-30,28 +without_mirrors,2021-06-30,28 +with_mirrors,2021-03-20,27 +with_mirrors,2021-04-22,27 +with_mirrors,2021-05-27,26 +with_mirrors,2021-06-20,26 +with_mirrors,2021-04-27,25 +with_mirrors,2021-03-14,24 +with_mirrors,2021-04-24,24 +with_mirrors,2021-06-10,24 +with_mirrors,2021-06-18,24 +with_mirrors,2021-08-04,24 +with_mirrors,2021-08-10,24 +with_mirrors,2021-04-04,23 +with_mirrors,2021-04-16,23 +with_mirrors,2021-06-27,23 +with_mirrors,2021-07-14,23 +without_mirrors,2021-03-26,23 +without_mirrors,2021-04-06,23 +with_mirrors,2021-04-09,22 +with_mirrors,2021-04-14,22 +with_mirrors,2021-05-12,22 +with_mirrors,2021-05-22,22 +with_mirrors,2021-06-02,22 +with_mirrors,2021-07-10,22 +with_mirrors,2021-07-11,22 +without_mirrors,2021-05-13,22 +without_mirrors,2021-08-06,22 +with_mirrors,2021-04-20,21 +with_mirrors,2021-05-01,21 +with_mirrors,2021-05-09,21 +with_mirrors,2021-07-02,21 +with_mirrors,2021-08-02,21 +with_mirrors,2021-04-17,20 +with_mirrors,2021-05-04,20 +with_mirrors,2021-07-19,20 +with_mirrors,2021-08-21,20 +with_mirrors,2021-09-05,20 +without_mirrors,2021-05-14,20 +without_mirrors,2021-07-26,20 +without_mirrors,2021-08-12,20 +with_mirrors,2021-03-23,19 +with_mirrors,2021-05-02,19 +with_mirrors,2021-05-20,19 +with_mirrors,2021-06-05,19 +with_mirrors,2021-06-23,19 +with_mirrors,2021-03-15,18 +with_mirrors,2021-04-12,18 +with_mirrors,2021-05-23,18 +with_mirrors,2021-05-31,18 +with_mirrors,2021-07-31,18 +without_mirrors,2021-07-25,18 +with_mirrors,2021-03-25,17 +with_mirrors,2021-08-05,17 +with_mirrors,2021-08-26,17 +with_mirrors,2021-04-05,16 +with_mirrors,2021-05-18,16 +with_mirrors,2021-06-24,16 +with_mirrors,2021-06-29,16 +with_mirrors,2021-07-07,16 +with_mirrors,2021-08-28,16 +without_mirrors,2021-03-30,16 +without_mirrors,2021-06-11,16 +without_mirrors,2021-07-17,16 +without_mirrors,2021-08-16,16 +with_mirrors,2021-03-28,15 +with_mirrors,2021-04-08,15 +with_mirrors,2021-04-15,15 +with_mirrors,2021-05-17,15 +with_mirrors,2021-09-03,15 +without_mirrors,2021-03-27,15 +without_mirrors,2021-04-05,15 +without_mirrors,2021-06-16,15 +with_mirrors,2021-04-29,14 +with_mirrors,2021-04-30,14 +with_mirrors,2021-05-10,14 +with_mirrors,2021-05-26,14 +with_mirrors,2021-07-09,14 +with_mirrors,2021-08-13,14 +without_mirrors,2021-03-19,14 +without_mirrors,2021-04-01,14 +without_mirrors,2021-04-03,14 +without_mirrors,2021-04-17,14 +without_mirrors,2021-07-01,14 +without_mirrors,2021-07-29,14 +without_mirrors,2021-04-04,13 +with_mirrors,2021-04-26,12 +with_mirrors,2021-06-08,12 +with_mirrors,2021-06-26,12 +with_mirrors,2021-07-15,12 +with_mirrors,2021-09-04,12 +without_mirrors,2021-06-26,12 +with_mirrors,2021-07-16,11 +without_mirrors,2021-03-25,11 +with_mirrors,2021-04-19,10 +with_mirrors,2021-06-09,10 +without_mirrors,2021-05-25,10 +without_mirrors,2021-06-25,10 +without_mirrors,2021-06-29,10 +with_mirrors,2021-04-18,9 +with_mirrors,2021-04-25,9 +without_mirrors,2021-06-07,9 +without_mirrors,2021-06-20,9 +without_mirrors,2021-07-16,9 +without_mirrors,2021-07-30,9 +without_mirrors,2021-08-04,9 +with_mirrors,2021-03-18,8 +with_mirrors,2021-03-22,8 +with_mirrors,2021-04-28,8 +with_mirrors,2021-05-05,8 +with_mirrors,2021-06-12,8 +with_mirrors,2021-07-12,8 +with_mirrors,2021-07-13,8 +with_mirrors,2021-07-27,8 +with_mirrors,2021-08-27,8 +without_mirrors,2021-03-31,8 +without_mirrors,2021-06-10,8 +without_mirrors,2021-06-15,8 +without_mirrors,2021-06-23,8 +without_mirrors,2021-07-13,8 +without_mirrors,2021-07-14,8 +without_mirrors,2021-07-19,8 +without_mirrors,2021-07-20,8 +without_mirrors,2021-08-13,8 +with_mirrors,2021-06-03,7 +with_mirrors,2021-06-14,7 +with_mirrors,2021-07-04,7 +with_mirrors,2021-08-30,7 +with_mirrors,2021-09-06,7 +without_mirrors,2021-03-16,7 +without_mirrors,2021-03-24,7 +without_mirrors,2021-04-08,7 +without_mirrors,2021-04-24,7 +without_mirrors,2021-05-20,7 +without_mirrors,2021-05-24,7 +without_mirrors,2021-06-06,7 +without_mirrors,2021-06-08,7 +without_mirrors,2021-07-23,7 +without_mirrors,2021-09-06,7 +with_mirrors,2021-04-10,6 +with_mirrors,2021-05-21,6 +with_mirrors,2021-06-28,6 +with_mirrors,2021-09-01,6 +without_mirrors,2021-03-18,6 +without_mirrors,2021-04-19,6 +without_mirrors,2021-04-28,6 +without_mirrors,2021-05-18,6 +without_mirrors,2021-05-23,6 +without_mirrors,2021-06-09,6 +without_mirrors,2021-06-12,6 +without_mirrors,2021-07-02,6 +without_mirrors,2021-07-07,6 +without_mirrors,2021-07-08,6 +without_mirrors,2021-07-15,6 +without_mirrors,2021-07-27,6 +without_mirrors,2021-09-01,6 +with_mirrors,2021-05-30,5 +with_mirrors,2021-06-01,5 +with_mirrors,2021-07-03,5 +with_mirrors,2021-08-19,5 +with_mirrors,2021-08-25,5 +with_mirrors,2021-09-07,5 +without_mirrors,2021-03-17,5 +without_mirrors,2021-04-02,5 +without_mirrors,2021-04-12,5 +without_mirrors,2021-04-21,5 +without_mirrors,2021-04-25,5 +without_mirrors,2021-05-06,5 +without_mirrors,2021-05-12,5 +without_mirrors,2021-05-19,5 +without_mirrors,2021-05-27,5 +without_mirrors,2021-06-01,5 +without_mirrors,2021-06-14,5 +without_mirrors,2021-07-03,5 +without_mirrors,2021-07-04,5 +without_mirrors,2021-07-28,5 +without_mirrors,2021-08-01,5 +without_mirrors,2021-08-24,5 +without_mirrors,2021-09-04,5 +without_mirrors,2021-09-05,5 +without_mirrors,2021-09-07,5 +with_mirrors,2021-05-08,4 +with_mirrors,2021-05-29,4 +with_mirrors,2021-06-17,4 +without_mirrors,2021-03-22,4 +without_mirrors,2021-04-20,4 +without_mirrors,2021-05-02,4 +without_mirrors,2021-05-05,4 +without_mirrors,2021-05-11,4 +without_mirrors,2021-06-13,4 +without_mirrors,2021-06-24,4 +without_mirrors,2021-07-05,4 +without_mirrors,2021-08-11,4 +with_mirrors,2021-04-13,3 +with_mirrors,2021-07-24,3 +with_mirrors,2021-08-08,3 +with_mirrors,2021-08-17,3 +with_mirrors,2021-08-22,3 +with_mirrors,2021-08-29,3 +without_mirrors,2021-04-07,3 +without_mirrors,2021-04-09,3 +without_mirrors,2021-04-14,3 +without_mirrors,2021-04-18,3 +without_mirrors,2021-04-30,3 +without_mirrors,2021-05-15,3 +without_mirrors,2021-05-31,3 +without_mirrors,2021-06-02,3 +without_mirrors,2021-06-04,3 +without_mirrors,2021-06-18,3 +without_mirrors,2021-07-06,3 +without_mirrors,2021-07-11,3 +without_mirrors,2021-07-21,3 +without_mirrors,2021-07-22,3 +without_mirrors,2021-07-31,3 +without_mirrors,2021-08-08,3 +without_mirrors,2021-08-17,3 +without_mirrors,2021-08-19,3 +without_mirrors,2021-08-20,3 +without_mirrors,2021-08-21,3 +without_mirrors,2021-08-22,3 +without_mirrors,2021-08-23,3 +with_mirrors,2021-08-09,2 +with_mirrors,2021-08-14,2 +with_mirrors,2021-08-15,2 +with_mirrors,2021-08-18,2 +without_mirrors,2021-03-15,2 +without_mirrors,2021-03-21,2 +without_mirrors,2021-03-28,2 +without_mirrors,2021-04-16,2 +without_mirrors,2021-04-26,2 +without_mirrors,2021-05-03,2 +without_mirrors,2021-05-07,2 +without_mirrors,2021-05-09,2 +without_mirrors,2021-05-10,2 +without_mirrors,2021-05-17,2 +without_mirrors,2021-05-21,2 +without_mirrors,2021-05-26,2 +without_mirrors,2021-05-28,2 +without_mirrors,2021-05-29,2 +without_mirrors,2021-06-05,2 +without_mirrors,2021-06-17,2 +without_mirrors,2021-06-27,2 +without_mirrors,2021-06-28,2 +without_mirrors,2021-07-09,2 +without_mirrors,2021-07-10,2 +without_mirrors,2021-07-12,2 +without_mirrors,2021-08-07,2 +without_mirrors,2021-08-09,2 +without_mirrors,2021-08-14,2 +without_mirrors,2021-08-15,2 +without_mirrors,2021-08-18,2 +without_mirrors,2021-08-26,2 +without_mirrors,2021-08-27,2 +without_mirrors,2021-08-30,2 +without_mirrors,2021-09-03,2 +with_mirrors,2021-09-08,1 +without_mirrors,2021-03-13,1 +without_mirrors,2021-03-20,1 +without_mirrors,2021-04-11,1 +without_mirrors,2021-04-13,1 +without_mirrors,2021-04-15,1 +without_mirrors,2021-04-23,1 +without_mirrors,2021-04-29,1 +without_mirrors,2021-05-01,1 +without_mirrors,2021-05-22,1 +without_mirrors,2021-05-30,1 +without_mirrors,2021-06-03,1 +without_mirrors,2021-06-19,1 +without_mirrors,2021-07-24,1 +without_mirrors,2021-08-02,1 +without_mirrors,2021-08-10,1 +without_mirrors,2021-08-25,1 +without_mirrors,2021-08-28,1 +without_mirrors,2021-08-29,1 +without_mirrors,2021-08-31,1 +without_mirrors,2021-09-08,1 with_mirrors,2020-12-05,79 with_mirrors,2020-12-04,68 with_mirrors,2020-10-17,50 @@ -295,7 +642,6 @@ without_mirrors,2021-02-28,1 without_mirrors,2021-03-04,1 without_mirrors,2021-03-06,1 without_mirrors,2021-03-08,1 -without_mirrors,2021-03-13,1 with_mirrors,2020-09-12,33 with_mirrors,2020-09-14,18 with_mirrors,2020-09-13,17 diff --git a/doc/source/tracking/pypistats/get_pypi_stats.ipynb b/doc/source/tracking/pypistats/get_pypi_stats.ipynb index 496017562..3a719e27c 100644 --- a/doc/source/tracking/pypistats/get_pypi_stats.ipynb +++ b/doc/source/tracking/pypistats/get_pypi_stats.ipynb @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +69,7 @@ "# try:\n", "exist_sysdownloads = pd.read_csv(trackpath+sysdownloadfn)#.drop(columns=['percent'])\n", "# exist_sysdownloads = exist_sysdownloads[exist_sysdownloads.category != \"Total\"]\n", - "# exist_sysdownloads['category'] = exist_sysdownloads['category'].fillna(\"null\")\n", + "exist_sysdownloads['category'] = exist_sysdownloads['category'].fillna(\"null\")\n", "sysdl_data = sysdownloads.merge(exist_sysdownloads, how='outer', \n", " on=['category','date','downloads']).reindex()\n", "# except:\n", @@ -80,30 +80,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":5: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", - " chart.figure.show()\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "dl_data = dl_data.groupby(\"category\").get_group(\"without_mirrors\").sort_values(\"date\")\n", "\n", @@ -137,7 +116,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.4" } }, "nbformat": 4, diff --git a/doc/source/tracking/pypistats/sys_downloads_data.csv b/doc/source/tracking/pypistats/sys_downloads_data.csv index b26986e5b..74ad8ab92 100644 --- a/doc/source/tracking/pypistats/sys_downloads_data.csv +++ b/doc/source/tracking/pypistats/sys_downloads_data.csv @@ -1,4 +1,346 @@ category,date,downloads +null,2021-03-12,28 +null,2021-03-29,25 +null,2021-03-26,22 +null,2021-06-30,21 +null,2021-07-26,20 +null,2021-05-13,19 +null,2021-04-06,18 +null,2021-05-14,17 +null,2021-07-25,17 +null,2021-08-06,16 +null,2021-07-17,15 +null,2021-08-12,15 +Linux,2021-08-16,14 +null,2021-04-17,14 +null,2021-04-01,13 +null,2021-04-03,13 +null,2021-04-04,13 +null,2021-04-05,13 +Linux,2021-07-29,12 +null,2021-03-27,12 +null,2021-03-30,12 +null,2021-06-11,12 +null,2021-03-25,11 +null,2021-06-29,10 +Linux,2021-06-25,9 +Linux,2021-06-26,9 +null,2021-07-01,9 +Linux,2021-06-10,8 +Linux,2021-07-30,8 +null,2021-03-19,8 +null,2021-05-25,8 +null,2021-06-16,8 +null,2021-06-20,8 +Linux,2021-06-23,7 +Linux,2021-06-30,7 +null,2021-07-19,7 +null,2021-08-04,7 +Linux,2021-08-13,6 +null,2021-04-24,6 +null,2021-06-15,6 +null,2021-07-13,6 +Windows,2021-03-29,6 +Linux,2021-06-16,5 +Linux,2021-07-07,5 +Linux,2021-07-16,5 +Linux,2021-07-28,5 +null,2021-07-04,5 +null,2021-07-23,5 +Windows,2021-04-06,5 +Windows,2021-04-12,5 +Linux,2021-03-16,4 +Linux,2021-03-19,4 +Linux,2021-06-12,4 +Linux,2021-06-13,4 +Linux,2021-06-24,4 +Linux,2021-07-14,4 +Linux,2021-09-05,4 +Linux,2021-09-06,4 +Linux,2021-09-07,4 +null,2021-03-17,4 +null,2021-04-02,4 +null,2021-04-21,4 +null,2021-05-20,4 +null,2021-05-23,4 +null,2021-06-07,4 +null,2021-06-08,4 +null,2021-07-02,4 +null,2021-07-05,4 +null,2021-07-20,4 +null,2021-07-27,4 +null,2021-08-01,4 +Windows,2021-03-31,4 +Windows,2021-04-28,4 +Windows,2021-08-06,4 +Darwin,2021-05-14,3 +Darwin,2021-07-01,3 +Linux,2021-03-24,3 +Linux,2021-03-29,3 +Linux,2021-04-25,3 +Linux,2021-05-18,3 +Linux,2021-06-07,3 +Linux,2021-06-09,3 +Linux,2021-06-14,3 +Linux,2021-07-11,3 +Linux,2021-07-15,3 +Linux,2021-08-12,3 +Linux,2021-08-22,3 +Linux,2021-08-24,3 +null,2021-03-31,3 +null,2021-04-08,3 +null,2021-05-05,3 +null,2021-05-06,3 +null,2021-05-18,3 +null,2021-05-24,3 +null,2021-06-04,3 +null,2021-06-06,3 +null,2021-07-08,3 +null,2021-07-14,3 +null,2021-07-15,3 +null,2021-07-16,3 +null,2021-07-22,3 +null,2021-09-01,3 +Windows,2021-03-16,3 +Windows,2021-03-24,3 +Windows,2021-03-27,3 +Windows,2021-04-19,3 +Windows,2021-05-24,3 +Windows,2021-06-01,3 +Darwin,2021-03-22,2 +Darwin,2021-05-12,2 +Darwin,2021-05-27,2 +Darwin,2021-06-01,2 +Darwin,2021-08-19,2 +Linux,2021-03-15,2 +Linux,2021-03-18,2 +Linux,2021-03-28,2 +Linux,2021-03-30,2 +Linux,2021-04-05,2 +Linux,2021-04-08,2 +Linux,2021-04-20,2 +Linux,2021-05-11,2 +Linux,2021-05-12,2 +Linux,2021-05-13,2 +Linux,2021-05-19,2 +Linux,2021-05-23,2 +Linux,2021-05-25,2 +Linux,2021-06-06,2 +Linux,2021-06-08,2 +Linux,2021-06-11,2 +Linux,2021-06-15,2 +Linux,2021-07-01,2 +Linux,2021-07-02,2 +Linux,2021-07-06,2 +Linux,2021-07-08,2 +Linux,2021-07-09,2 +Linux,2021-07-20,2 +Linux,2021-07-27,2 +Linux,2021-08-06,2 +Linux,2021-09-01,2 +Linux,2021-09-04,2 +null,2021-03-18,2 +null,2021-04-09,2 +null,2021-04-14,2 +null,2021-04-18,2 +null,2021-04-19,2 +null,2021-04-20,2 +null,2021-05-02,2 +null,2021-05-15,2 +null,2021-05-27,2 +null,2021-06-05,2 +null,2021-06-12,2 +null,2021-06-18,2 +null,2021-06-26,2 +null,2021-06-27,2 +null,2021-07-03,2 +null,2021-07-21,2 +null,2021-07-29,2 +null,2021-07-31,2 +null,2021-08-08,2 +null,2021-08-20,2 +null,2021-08-30,2 +null,2021-09-04,2 +Windows,2021-03-12,2 +Windows,2021-03-18,2 +Windows,2021-04-25,2 +Windows,2021-05-02,2 +Windows,2021-05-19,2 +Windows,2021-05-20,2 +Windows,2021-06-07,2 +Windows,2021-06-11,2 +Windows,2021-06-14,2 +Windows,2021-06-16,2 +Windows,2021-06-17,2 +Windows,2021-07-03,2 +Windows,2021-07-20,2 +Windows,2021-08-07,2 +Windows,2021-08-11,2 +Windows,2021-08-12,2 +Windows,2021-08-13,2 +Windows,2021-08-16,2 +Windows,2021-08-21,2 +Windows,2021-09-06,2 +Darwin,2021-03-19,1 +Darwin,2021-03-21,1 +Darwin,2021-03-30,1 +Darwin,2021-04-07,1 +Darwin,2021-04-08,1 +Darwin,2021-04-28,1 +Darwin,2021-05-19,1 +Darwin,2021-06-02,1 +Darwin,2021-06-06,1 +Darwin,2021-06-08,1 +Darwin,2021-06-09,1 +Darwin,2021-07-14,1 +Darwin,2021-08-10,1 +Darwin,2021-08-11,1 +Darwin,2021-08-15,1 +Darwin,2021-08-18,1 +Darwin,2021-09-01,1 +Linux,2021-03-22,1 +Linux,2021-03-31,1 +Linux,2021-04-01,1 +Linux,2021-04-02,1 +Linux,2021-04-07,1 +Linux,2021-04-09,1 +Linux,2021-04-15,1 +Linux,2021-04-19,1 +Linux,2021-04-23,1 +Linux,2021-04-26,1 +Linux,2021-04-28,1 +Linux,2021-04-29,1 +Linux,2021-04-30,1 +Linux,2021-05-01,1 +Linux,2021-05-05,1 +Linux,2021-05-06,1 +Linux,2021-05-07,1 +Linux,2021-05-09,1 +Linux,2021-05-17,1 +Linux,2021-05-20,1 +Linux,2021-05-21,1 +Linux,2021-05-22,1 +Linux,2021-05-24,1 +Linux,2021-05-26,1 +Linux,2021-05-27,1 +Linux,2021-05-28,1 +Linux,2021-05-31,1 +Linux,2021-06-02,1 +Linux,2021-06-18,1 +Linux,2021-06-19,1 +Linux,2021-06-28,1 +Linux,2021-07-03,1 +Linux,2021-07-10,1 +Linux,2021-07-12,1 +Linux,2021-07-13,1 +Linux,2021-07-17,1 +Linux,2021-07-19,1 +Linux,2021-07-21,1 +Linux,2021-07-23,1 +Linux,2021-07-25,1 +Linux,2021-08-01,1 +Linux,2021-08-04,1 +Linux,2021-08-08,1 +Linux,2021-08-09,1 +Linux,2021-08-11,1 +Linux,2021-08-14,1 +Linux,2021-08-17,1 +Linux,2021-08-19,1 +Linux,2021-08-20,1 +Linux,2021-08-23,1 +Linux,2021-08-26,1 +Linux,2021-08-29,1 +Linux,2021-09-08,1 +null,2021-03-20,1 +null,2021-03-21,1 +null,2021-03-24,1 +null,2021-04-07,1 +null,2021-04-11,1 +null,2021-04-16,1 +null,2021-04-30,1 +null,2021-05-03,1 +null,2021-05-07,1 +null,2021-05-09,1 +null,2021-05-10,1 +null,2021-05-11,1 +null,2021-05-17,1 +null,2021-05-21,1 +null,2021-05-29,1 +null,2021-05-30,1 +null,2021-05-31,1 +null,2021-06-02,1 +null,2021-06-09,1 +null,2021-06-23,1 +null,2021-07-06,1 +null,2021-07-10,1 +null,2021-07-12,1 +null,2021-07-30,1 +null,2021-08-02,1 +null,2021-08-09,1 +null,2021-08-14,1 +null,2021-08-17,1 +null,2021-08-21,1 +null,2021-08-23,1 +null,2021-08-24,1 +null,2021-08-25,1 +null,2021-08-27,1 +null,2021-08-28,1 +null,2021-08-31,1 +null,2021-09-03,1 +null,2021-09-06,1 +Windows,2021-03-13,1 +Windows,2021-03-17,1 +Windows,2021-03-19,1 +Windows,2021-03-22,1 +Windows,2021-03-26,1 +Windows,2021-03-30,1 +Windows,2021-04-03,1 +Windows,2021-04-08,1 +Windows,2021-04-13,1 +Windows,2021-04-14,1 +Windows,2021-04-16,1 +Windows,2021-04-18,1 +Windows,2021-04-21,1 +Windows,2021-04-24,1 +Windows,2021-04-26,1 +Windows,2021-04-30,1 +Windows,2021-05-03,1 +Windows,2021-05-06,1 +Windows,2021-05-10,1 +Windows,2021-05-11,1 +Windows,2021-05-12,1 +Windows,2021-05-13,1 +Windows,2021-05-15,1 +Windows,2021-05-26,1 +Windows,2021-05-28,1 +Windows,2021-05-29,1 +Windows,2021-05-31,1 +Windows,2021-06-03,1 +Windows,2021-06-06,1 +Windows,2021-06-09,1 +Windows,2021-06-20,1 +Windows,2021-06-25,1 +Windows,2021-06-26,1 +Windows,2021-06-28,1 +Windows,2021-07-07,1 +Windows,2021-07-08,1 +Windows,2021-07-13,1 +Windows,2021-07-16,1 +Windows,2021-07-23,1 +Windows,2021-07-24,1 +Windows,2021-07-31,1 +Windows,2021-08-04,1 +Windows,2021-08-15,1 +Windows,2021-08-17,1 +Windows,2021-08-18,1 +Windows,2021-08-23,1 +Windows,2021-08-24,1 +Windows,2021-08-26,1 +Windows,2021-08-27,1 +Windows,2021-09-03,1 +Windows,2021-09-04,1 +Windows,2021-09-05,1 +Windows,2021-09-07,1 null,2020-12-04,15 null,2020-10-17,9 null,2020-12-16,8 @@ -84,7 +426,6 @@ Windows,2020-09-29,2 Windows,2020-10-27,2 Windows,2020-12-04,2 Windows,2021-02-24,2 -Windows,2021-03-12,2 Darwin,2020-10-02,1 Darwin,2020-10-06,1 Darwin,2020-10-11,1 @@ -196,130 +537,63 @@ Windows,2021-03-02,1 Windows,2021-03-09,1 Windows,2021-03-10,1 Windows,2021-03-11,1 -Windows,2021-03-13,1 -,2020-12-04,15 -,2020-10-17,9 -,2020-12-16,8 -,2021-03-11,8 -,2020-11-28,7 -,2020-12-11,7 -,2020-12-26,7 -,2020-12-01,6 -,2020-09-12,5 -,2020-10-02,5 -,2020-11-24,5 -,2020-12-05,5 -,2020-12-07,5 -,2020-12-09,5 -,2021-02-09,5 -,2020-12-12,4 -,2021-01-12,4 -,2020-09-22,3 -,2020-09-29,3 -,2020-10-01,3 -,2020-10-15,3 -,2020-10-20,3 -,2020-10-24,3 -,2020-12-17,3 -,2021-01-21,3 -,2020-09-15,2 -,2020-09-17,2 -,2020-09-21,2 -,2020-09-28,2 -,2020-10-07,2 -,2020-11-20,2 -,2020-11-26,2 -,2020-11-29,2 -,2020-12-06,2 -,2020-12-21,2 -,2020-12-30,2 -,2021-01-22,2 -,2021-01-27,2 -,2021-01-28,2 -,2021-02-22,2 +null,2020-09-12,5 +null,2020-09-15,2 Darwin,2020-09-13,1 Darwin,2020-09-14,1 Linux,2020-09-14,1 -,2020-10-03,1 -,2020-10-06,1 -,2020-10-14,1 -,2020-10-16,1 -,2020-10-27,1 -,2020-10-31,1 -,2020-11-03,1 -,2020-11-14,1 -,2020-11-18,1 -,2020-11-23,1 -,2020-12-03,1 -,2020-12-08,1 -,2020-12-13,1 -,2020-12-23,1 -,2020-12-25,1 -,2021-01-02,1 -,2021-01-05,1 -,2021-01-08,1 -,2021-01-10,1 -,2021-01-15,1 -,2021-01-19,1 -,2021-02-10,1 -,2021-02-11,1 -,2021-02-17,1 -,2021-02-28,1 -,2021-03-01,1 -,2021-03-02,1 -,2021-03-03,1 -,2020-07-22,49 -,2020-07-02,18 -,2020-06-18,12 -,2020-06-19,12 -,2020-08-19,12 +null,2020-07-22,49 +null,2020-07-02,18 +null,2020-06-18,12 +null,2020-06-19,12 +null,2020-08-19,12 Linux,2020-06-18,9 -,2020-07-13,9 -,2020-07-21,9 -,2020-07-14,8 -,2020-06-26,7 -,2020-07-03,7 -,2020-07-06,6 -,2020-07-23,6 -,2020-08-24,6 -,2020-07-10,5 -,2020-08-23,5 +null,2020-07-13,9 +null,2020-07-21,9 +null,2020-07-14,8 +null,2020-06-26,7 +null,2020-07-03,7 +null,2020-07-06,6 +null,2020-07-23,6 +null,2020-08-24,6 +null,2020-07-10,5 +null,2020-08-23,5 Linux,2020-07-02,4 Linux,2020-08-19,4 -,2020-07-09,4 -,2020-07-15,4 -,2020-07-26,4 -,2020-08-06,4 -,2020-08-07,4 -,2020-08-20,4 -,2020-08-21,4 -,2020-08-25,4 -,2020-09-03,4 -,2020-09-04,4 -,2020-09-06,4 -,2020-09-07,4 -,2020-09-09,4 +null,2020-07-09,4 +null,2020-07-15,4 +null,2020-07-26,4 +null,2020-08-06,4 +null,2020-08-07,4 +null,2020-08-20,4 +null,2020-08-21,4 +null,2020-08-25,4 +null,2020-09-03,4 +null,2020-09-04,4 +null,2020-09-06,4 +null,2020-09-07,4 +null,2020-09-09,4 Linux,2020-08-28,3 -,2020-06-29,3 -,2020-07-05,3 -,2020-07-12,3 -,2020-07-16,3 -,2020-07-24,3 -,2020-07-29,3 -,2020-07-31,3 +null,2020-06-29,3 +null,2020-07-05,3 +null,2020-07-12,3 +null,2020-07-16,3 +null,2020-07-24,3 +null,2020-07-29,3 +null,2020-07-31,3 Windows,2020-09-03,3 Darwin,2020-06-28,2 Linux,2020-06-19,2 Linux,2020-06-22,2 Linux,2020-07-06,2 -,2020-06-21,2 -,2020-06-23,2 -,2020-07-25,2 -,2020-07-28,2 -,2020-08-01,2 -,2020-08-03,2 -,2020-08-05,2 -,2020-09-01,2 +null,2020-06-21,2 +null,2020-06-23,2 +null,2020-07-25,2 +null,2020-07-28,2 +null,2020-08-01,2 +null,2020-08-03,2 +null,2020-08-05,2 +null,2020-09-01,2 Windows,2020-08-27,2 Windows,2020-08-28,2 Darwin,2020-06-18,1 @@ -355,22 +629,22 @@ Linux,2020-08-21,1 Linux,2020-08-26,1 Linux,2020-08-31,1 Linux,2020-09-08,1 -,2020-06-22,1 -,2020-06-25,1 -,2020-06-30,1 -,2020-07-08,1 -,2020-07-11,1 -,2020-07-30,1 -,2020-08-02,1 -,2020-08-08,1 -,2020-08-10,1 -,2020-08-12,1 -,2020-08-13,1 -,2020-08-22,1 -,2020-09-02,1 -,2020-09-05,1 -,2020-09-10,1 -,2020-09-11,1 +null,2020-06-22,1 +null,2020-06-25,1 +null,2020-06-30,1 +null,2020-07-08,1 +null,2020-07-11,1 +null,2020-07-30,1 +null,2020-08-02,1 +null,2020-08-08,1 +null,2020-08-10,1 +null,2020-08-12,1 +null,2020-08-13,1 +null,2020-08-22,1 +null,2020-09-02,1 +null,2020-09-05,1 +null,2020-09-10,1 +null,2020-09-11,1 Windows,2020-06-21,1 Windows,2020-06-25,1 Windows,2020-06-30,1 diff --git a/doc/source/tracking/traffic/clones.csv b/doc/source/tracking/traffic/clones.csv index 5cf0c961f..2ee43b653 100644 --- a/doc/source/tracking/traffic/clones.csv +++ b/doc/source/tracking/traffic/clones.csv @@ -110,4 +110,162 @@ _date,total_clones,unique_clones 2021-03-26,3,3 2021-03-27,1,1 2021-03-28,5,4 -2021-03-29,18,16 +2021-03-29,50,24 +2021-03-30,21,14 +2021-03-31,16,11 +2021-04-01,6,5 +2021-04-02,1,1 +2021-04-03,8,6 +2021-04-04,4,2 +2021-04-05,15,12 +2021-04-05,14,12 +2021-04-06,4,3 +2021-04-07,13,12 +2021-04-08,25,18 +2021-04-09,14,13 +2021-04-10,6,5 +2021-04-12,25,17 +2021-04-12,26,17 +2021-04-13,26,10 +2021-04-14,24,2 +2021-04-15,63,16 +2021-04-18,35,3 +2021-04-18,39,4 +2021-04-19,38,9 +2021-04-19,39,9 +2021-04-20,19,16 +2021-04-21,34,10 +2021-04-22,20,1 +2021-04-23,3,2 +2021-04-24,2,2 +2021-04-25,24,1 +2021-04-26,26,3 +2021-04-26,27,4 +2021-04-27,25,3 +2021-04-28,32,10 +2021-04-29,41,17 +2021-04-30,5,5 +2021-05-01,2,2 +2021-05-02,24,1 +2021-05-03,19,1 +2021-05-03,22,4 +2021-05-04,50,22 +2021-05-05,25,1 +2021-05-06,24,3 +2021-05-07,2,2 +2021-05-08,4,2 +2021-05-09,27,2 +2021-05-10,47,20 +2021-05-10,46,20 +2021-05-11,23,4 +2021-05-12,29,7 +2021-05-13,58,25 +2021-05-14,23,18 +2021-05-15,2,2 +2021-05-16,27,1 +2021-05-17,41,9 +2021-05-17,38,6 +2021-05-18,46,3 +2021-05-19,36,4 +2021-05-20,32,2 +2021-05-22,3,2 +2021-05-23,26,1 +2021-05-24,34,10 +2021-05-24,37,12 +2021-05-25,25,1 +2021-05-26,26,2 +2021-05-27,28,4 +2021-05-28,9,7 +2021-05-30,25,1 +2021-05-31,27,2 +2021-05-31,29,4 +2021-06-01,25,1 +2021-06-02,24,3 +2021-06-03,24,3 +2021-06-04,1,1 +2021-06-05,1,1 +2021-06-06,26,1 +2021-06-07,31,6 +2021-06-08,26,1 +2021-06-09,46,4 +2021-06-10,41,9 +2021-06-11,1,1 +2021-06-13,25,1 +2021-06-14,28,2 +2021-06-15,29,4 +2021-06-16,31,3 +2021-06-17,23,2 +2021-06-18,2,1 +2021-06-20,27,2 +2021-06-20,26,1 +2021-06-21,33,8 +2021-06-22,42,8 +2021-06-23,43,6 +2021-06-24,148,1 +2021-06-25,72,16 +2021-06-26,1,1 +2021-06-27,18,1 +2021-06-27,21,2 +2021-06-28,23,8 +2021-06-28,22,7 +2021-07-01,11,9 +2021-07-04,1,1 +2021-07-05,1,1 +2021-07-05,2,2 +2021-07-06,13,13 +2021-07-07,10,8 +2021-07-08,2,2 +2021-07-09,4,4 +2021-07-10,2,1 +2021-07-11,1,1 +2021-07-12,1,1 +2021-07-12,2,2 +2021-07-14,1,1 +2021-07-16,4,4 +2021-07-19,3,3 +2021-07-19,2,2 +2021-07-20,1,1 +2021-07-22,1,1 +2021-07-24,1,1 +2021-07-25,1,1 +2021-07-26,5,5 +2021-07-26,4,4 +2021-07-28,2,2 +2021-07-29,1,1 +2021-08-02,2,2 +2021-08-02,1,1 +2021-08-03,7,6 +2021-08-04,1,1 +2021-08-07,23,1 +2021-08-09,3,3 +2021-08-09,2,2 +2021-08-10,1,1 +2021-08-11,2,2 +2021-08-12,3,3 +2021-08-13,1,1 +2021-08-14,2,2 +2021-08-15,1,1 +2021-08-16,4,4 +2021-08-16,2,2 +2021-08-17,2,2 +2021-08-18,3,3 +2021-08-19,1,1 +2021-08-21,1,1 +2021-08-22,1,1 +2021-08-23,2,2 +2021-08-24,3,3 +2021-08-25,7,7 +2021-08-27,2,2 +2021-08-29,2,1 +2021-08-30,9,9 +2021-08-30,11,11 +2021-09-01,15,12 +2021-09-02,1,1 +2021-09-03,1,1 +2021-09-04,1,1 +2021-09-06,2,2 +2021-09-07,3,3 +2021-09-08,2,1 +2021-09-09,10,9 +2021-09-10,29,15 +2021-09-12,6,2 diff --git a/doc/source/tracking/traffic/plots.svg b/doc/source/tracking/traffic/plots.svg index e47dc0c97..339e8d61d 100644 --- a/doc/source/tracking/traffic/plots.svg +++ b/doc/source/tracking/traffic/plots.svg @@ -6,11 +6,11 @@ - 2021-03-29T16:34:08.892176 + 2021-09-13T00:27:49.554718 image/svg+xml - Matplotlib v3.4.0, https://matplotlib.org/ + Matplotlib v3.4.3, https://matplotlib.org/ @@ -43,10 +43,10 @@ z +" id="mcdd6a67486" style="stroke:#000000;stroke-width:0.8;"/> - +
@@ -136,66 +136,12 @@ z - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - @@ -253,20 +177,20 @@ z - - + + - - + + - + - - - + + + + @@ -307,33 +241,189 @@ z - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - +M 1403 2484 +Q 997 2584 770 2862 +Q 544 3141 544 3541 +Q 544 4100 942 4425 +Q 1341 4750 2034 4750 +Q 2731 4750 3128 4425 +Q 3525 4100 3525 3541 +Q 3525 3141 3298 2862 +Q 3072 2584 2669 2484 +Q 3125 2378 3379 2068 +Q 3634 1759 3634 1313 +Q 3634 634 3220 271 +Q 2806 -91 2034 -91 +Q 1263 -91 848 271 +Q 434 634 434 1313 +Q 434 1759 690 2068 +Q 947 2378 1403 2484 +z +M 1172 3481 +Q 1172 3119 1398 2916 +Q 1625 2713 2034 2713 +Q 2441 2713 2670 2916 +Q 2900 3119 2900 3481 +Q 2900 3844 2670 4047 +Q 2441 4250 2034 4250 +Q 1625 4250 1398 4047 +Q 1172 3844 1172 3481 +z +" id="DejaVuSans-38" transform="scale(0.015625)"/> + @@ -341,10 +431,10 @@ z - + - + @@ -479,15 +569,15 @@ z +" id="mf2a37071e3" style="stroke:#000000;stroke-width:0.8;"/> - + - + @@ -495,13 +585,13 @@ L -3.5 0 - + - - - + + + @@ -509,313 +599,517 @@ L -3.5 0 - + - - - - - - + + + + - + - - - - - - - + + + + + - - @@ -1187,7 +1481,7 @@ z - + @@ -1209,165 +1503,136 @@ z - + - - + + - + - + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - - + + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - + - + @@ -1380,27 +1645,27 @@ z - + - + - + - + - + - + - + - + @@ -1408,335 +1673,679 @@ z - + - + - + - + + + + + + + + + + + + + + + + - - + - - + @@ -1773,12 +2382,12 @@ Q 95 192.87625 97 192.87625 z " style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/> - + - + @@ -1830,12 +2439,12 @@ z - + - + @@ -1864,10 +2473,10 @@ L 119 183.296562 - + - + diff --git a/doc/source/tracking/traffic/views.csv b/doc/source/tracking/traffic/views.csv index 1f7bf4d0b..ef6cc4e36 100644 --- a/doc/source/tracking/traffic/views.csv +++ b/doc/source/tracking/traffic/views.csv @@ -156,4 +156,174 @@ _date,total_views,unique_views 2021-03-26,12,4 2021-03-27,14,3 2021-03-28,67,7 -2021-03-29,106,9 +2021-03-29,239,20 +2021-03-30,78,17 +2021-03-31,62,12 +2021-04-01,133,18 +2021-04-02,27,8 +2021-04-03,13,3 +2021-04-04,25,6 +2021-04-05,106,9 +2021-04-06,47,13 +2021-04-07,101,12 +2021-04-08,182,16 +2021-04-09,64,10 +2021-04-10,38,9 +2021-04-11,21,4 +2021-04-12,264,22 +2021-04-12,267,23 +2021-04-13,86,14 +2021-04-14,30,11 +2021-04-15,59,10 +2021-04-16,54,10 +2021-04-17,11,4 +2021-04-18,18,6 +2021-04-19,227,22 +2021-04-20,251,27 +2021-04-21,189,18 +2021-04-22,32,11 +2021-04-23,10,6 +2021-04-24,54,10 +2021-04-25,16,6 +2021-04-26,55,20 +2021-04-27,97,19 +2021-04-28,316,81 +2021-04-29,105,14 +2021-04-30,108,19 +2021-05-01,91,5 +2021-05-02,23,1 +2021-05-03,20,8 +2021-05-04,112,13 +2021-05-05,56,13 +2021-05-06,57,12 +2021-05-07,90,15 +2021-05-08,31,9 +2021-05-09,10,3 +2021-05-10,190,10 +2021-05-11,52,13 +2021-05-12,138,18 +2021-05-13,160,17 +2021-05-14,136,22 +2021-05-15,8,5 +2021-05-16,8,1 +2021-05-17,104,22 +2021-05-18,67,17 +2021-05-19,69,9 +2021-05-20,46,16 +2021-05-21,33,13 +2021-05-22,13,2 +2021-05-23,21,6 +2021-05-24,92,13 +2021-05-25,28,9 +2021-05-26,41,14 +2021-05-27,70,20 +2021-05-28,47,12 +2021-05-29,8,4 +2021-05-30,8,3 +2021-05-31,32,10 +2021-06-01,42,15 +2021-06-02,20,7 +2021-06-03,38,9 +2021-06-04,30,9 +2021-06-05,10,8 +2021-06-06,16,7 +2021-06-07,74,18 +2021-06-08,55,11 +2021-06-09,296,11 +2021-06-10,135,7 +2021-06-11,28,10 +2021-06-12,35,3 +2021-06-13,7,6 +2021-06-14,70,13 +2021-06-15,63,10 +2021-06-16,36,11 +2021-06-17,39,13 +2021-06-18,58,10 +2021-06-19,8,3 +2021-06-20,6,4 +2021-06-21,208,16 +2021-06-22,45,5 +2021-06-23,25,8 +2021-06-24,17,10 +2021-06-25,178,22 +2021-06-26,17,3 +2021-06-27,14,5 +2021-06-28,25,8 +2021-06-29,36,6 +2021-06-30,35,11 +2021-07-01,99,14 +2021-07-02,27,10 +2021-07-03,8,4 +2021-07-04,30,4 +2021-07-05,24,9 +2021-07-06,254,17 +2021-07-07,193,17 +2021-07-08,41,6 +2021-07-09,34,12 +2021-07-10,26,5 +2021-07-11,28,9 +2021-07-12,72,15 +2021-07-13,35,12 +2021-07-14,31,12 +2021-07-15,105,15 +2021-07-16,45,14 +2021-07-17,6,3 +2021-07-18,1,1 +2021-07-19,26,7 +2021-07-20,24,7 +2021-07-21,19,6 +2021-07-22,30,6 +2021-07-23,21,5 +2021-07-24,9,3 +2021-07-25,3,1 +2021-07-26,30,6 +2021-07-27,31,9 +2021-07-28,75,8 +2021-07-29,81,12 +2021-07-30,5,3 +2021-07-31,21,6 +2021-08-01,1,1 +2021-08-02,46,6 +2021-08-03,42,6 +2021-08-04,33,13 +2021-08-05,43,15 +2021-08-06,13,9 +2021-08-07,23,5 +2021-08-08,7,5 +2021-08-08,6,4 +2021-08-09,54,12 +2021-08-10,47,9 +2021-08-11,29,8 +2021-08-12,40,8 +2021-08-13,73,11 +2021-08-14,36,10 +2021-08-15,13,5 +2021-08-16,69,13 +2021-08-17,6,2 +2021-08-18,22,8 +2021-08-19,28,8 +2021-08-20,3,3 +2021-08-21,4,4 +2021-08-22,26,7 +2021-08-23,24,7 +2021-08-24,70,10 +2021-08-25,76,9 +2021-08-26,11,3 +2021-08-27,8,4 +2021-08-28,6,2 +2021-08-29,34,5 +2021-08-29,35,6 +2021-08-30,89,7 +2021-08-31,58,12 +2021-09-01,59,10 +2021-09-02,25,6 +2021-09-03,8,4 +2021-09-04,23,6 +2021-09-05,20,2 +2021-09-06,8,4 +2021-09-07,55,10 +2021-09-08,16,7 +2021-09-09,35,3 +2021-09-10,97,13 +2021-09-11,4,2 +2021-09-12,14,3 diff --git a/doc/source/user_guide/changelog/index.rst b/doc/source/user_guide/changelog/index.rst index 9b80b6fad..c0de3a75d 100644 --- a/doc/source/user_guide/changelog/index.rst +++ b/doc/source/user_guide/changelog/index.rst @@ -6,9 +6,16 @@ icepyx ChangeLog This is the list of changes made to icepyx in between each release. Full details can be found in the `commit logs `_. -Latest Release (Version 0.4.0) +Latest Release (Version 0.4.1) ------------------------------ +.. toctree:: + :maxdepth: 2 + + v0.4.1 + +Version 0.4.0 +------------- .. toctree:: :maxdepth: 2 diff --git a/doc/source/user_guide/changelog/v0.4.1.rst b/doc/source/user_guide/changelog/v0.4.1.rst new file mode 100644 index 000000000..d0b4390ae --- /dev/null +++ b/doc/source/user_guide/changelog/v0.4.1.rst @@ -0,0 +1,51 @@ +.. _whatsnew_0x0: + +What's new in 0.4.1 (01 October 2021) +----------------------------------- + +These are the changes in icepyx 0.4.1 See :ref:`release` for a full changelog +including other versions of icepyx. + + +New Features +~~~~~~~~~~~~ + +- GitHub action to automatically update uml diagrams (#208) + +Bug fixes +~~~~~~~~~ + +- check errors raised by empty query object from bounding box split in openaltimetry visualization (#220) +- updated product_summary_info function to latest fields returned by CMR (product_id --> title) + +Deprecations +~~~~~~~~~~~~ + +- `query.dataset` is now deprecated in favor of `query.product`. + + +Maintenance +^^^^^^^^^^^ + +- improved variable naming for clarity and in line with common usage (#211) +- add tests that require an active NSIDC Earthdata session (#209) +- update tracking metrics and limit traffic action to parent repo (#221) +- remove extra code block frome xample notebook (#225) + + +Documentation +^^^^^^^^^^^^^ + +- improve query docstrings (#212) + + +Other +^^^^^ + +- add research notice to readme (#206) + + +Contributors +~~~~~~~~~~~~ + +.. contributors:: v0.4.0..v0.4.1|HEAD diff --git a/doc/source/user_guide/documentation/classes_dev_uml.svg b/doc/source/user_guide/documentation/classes_dev_uml.svg new file mode 100644 index 000000000..94bd6cb56 --- /dev/null +++ b/doc/source/user_guide/documentation/classes_dev_uml.svg @@ -0,0 +1,263 @@ + + + + + + +classes_dev_uml + + + +0 + +Earthdata + +capability_url +email +netrc : NoneType +pswd : str, NoneType +session : Session +uid + +__init__(uid, email, capability_url, pswd) +_start_session() +login() + + + +1 + +Granules + +avail : list +orderIDs : list + +__init__() +download(verbose, path, session, restart) +get_avail(CMRparams, reqparams) +place_order(CMRparams, reqparams, subsetparams, verbose, subset, session, geom_filepath) + + + +5 + +Query + +CMRparams +_CMRparams +_about_dataset +_cust_options : dict +_cycles : list +_dset : NoneType, str +_email +_end : datetime +_file_vars +_geom_filepath : NoneType +_granules +_order_vars +_readable_granule_name : list +_reqparams +_session : Session +_source : str +_spat_extent +_start : datetime +_subsetparams : NoneType +_tracks : list +_version +cycles +dataset +dataset_version +dates +end_time +extent_type : str +file_vars +granules +order_vars +reqparams +spatial_extent +start_time +tracks + +__init__(dataset, spatial_extent, date_range, start_time, end_time, version, cycles, tracks, files) +avail_granules(ids, cycles, tracks) +dataset_all_info() +dataset_summary_info() +download_granules(path, verbose, subset, restart) +earthdata_login(uid, email) +latest_version() +order_granules(verbose, subset, email) +show_custom_options(dictview) +subsetparams() +visualize_elevation() +visualize_spatial_extent() + + + +1->5 + + +_granules + + + +1->5 + + +_granules + + + +2 + +Icesat2Data + + +__init__() + + + +3 + +NsidcQueryError + +errmsg +msgtxt : str + +__init__(errmsg, msgtxt) +__str__() + + + +6 + +QueryError + + + + + + +3->6 + + + + + +4 + +Parameters + +_fmted_keys : NoneType, dict +_poss_keys : dict +_reqtype : str, NoneType +fmted_keys +partype +poss_keys + +__init__(partype, values, reqtype) +_check_valid_keys() +_get_possible_keys() +build_params() +check_req_values() +check_values() + + + +4->5 + + +_CMRparams + + + +4->5 + + +_reqparams + + + +4->5 + + +_subsetparams + + + +4->5 + + +_subsetparams + + + +7 + +Variables + +_avail : NoneType +_session : NoneType +_vartype +_version : NoneType +dataset : NoneType +source : NoneType +wanted : NoneType, dict + +__init__(vartype, avail, wanted, session, dataset, version, source) +_check_valid_lists(vgrp, allpaths, var_list, beam_list, keyword_list) +_get_combined_list(beam_list, keyword_list) +_get_sum_varlist(var_list, all_vars, defaults) +_iter_paths(sum_varlist, req_vars, vgrp, beam_list, keyword_list) +_iter_vars(sum_varlist, req_vars, vgrp) +append(defaults, var_list, beam_list, keyword_list) +avail(options, internal) +parse_var_list(varlist) +remove(all, var_list, beam_list, keyword_list) + + + +7->5 + + +_order_vars + + + +7->5 + + +_order_vars + + + +7->5 + + +_file_vars + + + +8 + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : NoneType, str +tracks : NoneType + +__init__(query_obj, product, spatial_extent, date_range, cycles, tracks) +generate_OA_parameters() +grid_bbox(binsize) +make_request(base_url, payload) +parallel_request_OA() +query_icesat2_filelist() +request_OA_data(paras) +viz_elevation() + + + diff --git a/doc/source/user_guide/documentation/classes_user_uml.svg b/doc/source/user_guide/documentation/classes_user_uml.svg new file mode 100644 index 000000000..8e51decce --- /dev/null +++ b/doc/source/user_guide/documentation/classes_user_uml.svg @@ -0,0 +1,221 @@ + + + + + + +classes_user_uml + + + +0 + +Earthdata + +capability_url +email +netrc : NoneType +pswd : NoneType, str +session : Session +uid + +login() + + + +1 + +Granules + +avail : list +orderIDs : list + +download(verbose, path, session, restart) +get_avail(CMRparams, reqparams) +place_order(CMRparams, reqparams, subsetparams, verbose, subset, session, geom_filepath) + + + +5 + +Query + +CMRparams +cycles +dataset +dataset_version +dates +end_time +extent_type : str +file_vars +granules +order_vars +reqparams +spatial_extent +start_time +tracks + +avail_granules(ids, cycles, tracks) +dataset_all_info() +dataset_summary_info() +download_granules(path, verbose, subset, restart) +earthdata_login(uid, email) +latest_version() +order_granules(verbose, subset, email) +show_custom_options(dictview) +subsetparams() +visualize_elevation() +visualize_spatial_extent() + + + +1->5 + + +_granules + + + +1->5 + + +_granules + + + +2 + +Icesat2Data + + + + + + +3 + +NsidcQueryError + +errmsg +msgtxt : str + + + + + +6 + +QueryError + + + + + + +3->6 + + + + + +4 + +Parameters + +fmted_keys +partype +poss_keys + +build_params() +check_req_values() +check_values() + + + +4->5 + + +_CMRparams + + + +4->5 + + +_reqparams + + + +4->5 + + +_subsetparams + + + +4->5 + + +_subsetparams + + + +7 + +Variables + +dataset : NoneType +source : NoneType +wanted : NoneType, dict + +append(defaults, var_list, beam_list, keyword_list) +avail(options, internal) +parse_var_list(varlist) +remove(all, var_list, beam_list, keyword_list) + + + +7->5 + + +_order_vars + + + +7->5 + + +_order_vars + + + +7->5 + + +_file_vars + + + +8 + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : NoneType, str +tracks : NoneType + +generate_OA_parameters() +grid_bbox(binsize) +make_request(base_url, payload) +parallel_request_OA() +query_icesat2_filelist() +request_OA_data(paras) +viz_elevation() + + + diff --git a/doc/source/user_guide/documentation/components.rst b/doc/source/user_guide/documentation/components.rst index 3ab00051c..52982ebde 100644 --- a/doc/source/user_guide/documentation/components.rst +++ b/doc/source/user_guide/documentation/components.rst @@ -55,6 +55,14 @@ variables --------- .. automodule:: icepyx.core.variables + :members: + :undoc-members: + :show-inheritance: + +visualize +--------- + +.. automodule:: icepyx.core.visualization :members: :undoc-members: :show-inheritance: \ No newline at end of file diff --git a/doc/source/user_guide/documentation/icepyx.rst b/doc/source/user_guide/documentation/icepyx.rst index 0cb146aa0..59d7d9ff8 100644 --- a/doc/source/user_guide/documentation/icepyx.rst +++ b/doc/source/user_guide/documentation/icepyx.rst @@ -1,12 +1,20 @@ icepyx Documentation (API Reference) ==================================== -.. image:: icepyx_class_diagram.png +.. image:: packages_user_uml.svg :width: 600 - :alt: PlantUML Class Diagram illustrating the public-facing classes within icepyx, their attributes and methods, their relationships (e.g. component classes). + :alt: UML package Diagram illustrating the public-facing, high-level packages within icepyx and their relationships. + +icepyx package diagram illustrating the library's public-facing, high-level package structure and their relationships. -icepyx class diagram illustrating the library's public-facing classes, their attributes and methods, and their relationships. +.. image:: classes_user_uml.svg + :width: 600 + :alt: UML Class Diagram illustrating the public-facing classes within icepyx, their attributes and methods, their relationships (e.g. component classes). + +icepyx class diagram illustrating the library's public-facing classes, their attributes and methods, and their relationships. +A more detailed, developer UML class diagram showing hidden parameters is available on GitHub in the ``icepyx/doc/source/user_guide/documentation/`` directory. +Diagrams are updated automatically after a pull request (PR) is approved and before it is merged to the development branch. .. toctree:: diff --git a/doc/source/user_guide/documentation/icepyx_architecture.wsd b/doc/source/user_guide/documentation/icepyx_architecture.wsd deleted file mode 100644 index 8b2667bac..000000000 --- a/doc/source/user_guide/documentation/icepyx_architecture.wsd +++ /dev/null @@ -1,187 +0,0 @@ -@startuml -title **icepyx Class Diagram** - -class Query { - reqparams - extent_type - subsetparams - _subsetparams - _version - file_vars - _cust_options - start_time - dates - dataset_version - granules - _granules - spatial_extent - _session - _about_dataset - _dset - _file_vars - CMRparams - _CMRparams - dataset - order_vars - _start - _order_vars - end_time - _source - subsetparams() - avail_granules() - order_granules() - download_granules() - visualize_spatial_extent() - dataset_all_info() - dataset_summary_info() - show_custom_options() - latest_version() - earthdata_login() -} -class Earthdata { - uid: string - email: string - session - pswd - capability_url - login() - _start_session() -} - -class Granules { - orderIDS - _session - files - avail - get_avail() - place_order() - download() -} - -class Variables { - _vartype - _session - dataset - wanted - _version - source - _avail - append() - avail() - remove() - _check_valid_lists() - _iter_paths() - _get_sum_varlist() -} - - -package "ICESat-2 Reference (is2ref)" { - class about_dataset{ - - } - hide about_dataset circle - - class _validate_dataset { - - } - hide _validate_dataset circle - - class _get_custom_options { - - } - hide _get_custom_options circle -} - -package "Validation (val)" { - class dset_version { - - } - hide dset_version circle - - class temporal { - - } - hide temporal circle - - class spatial { - - } - hide spatial circle -} - -'Try not using a package to help with layout (didn't change anything) -' class APIformatting.build_reqconfig_params { - -' } -' hide APIformatting.build_reqconfig_params circle - -' class APIformatting.build_CMR_params { - -' } -' hide APIformatting.build_CMR_params circle - -package "Format for API (apifmt)" { - class _fmt_temporal { - - } - hide _fmt_temporal circle - - class _fmt_spatial { - - } - hide _fmt_spatial circle - - class _fmt_var_subset_list { - - } - hide _fmt_var_subset_list circle - - class combine_params { - - } - hide combine_params circle - - class Parameters { - partype - _reqtype - _fmted_keys - poss_keys - _fmted_keys - _poss_keys - _get_possible_keys() - _check_valid_keys() - check_req_values() - check_values() - build_params() - } -} - - -Query *-left- Granules -Query *-right- Variables - -'Query -right-> about_dataset : is2ref.about_dataset -'Query -right-> _get_custom_options : is2ref._get_custom_options -'Query -right-> _validate_dataset : is2ref._validate_dataset -Query -right-> "ICESat-2 Reference (is2ref)" - -Query -right-> "Validation (val)" -'Query --> dset_version : val.dset_version -'Query --> spatial : val.spatial -'Query --> temporal: val.temporal - -Query -left-> "Format for API (apifmt)" -'Query --> build_CMR_params: apifmt.build_CMR_params -'Query --> build_reqconfig_params : apifmt.build_reqconfig_params -' Query -left-> APIformatting - -Query .down. Earthdata - -Variables -down-> _get_custom_options - -' Granules -[hidden]- APIformatting -' Earthdata -[hidden]- APIformatting -Granules -[hidden]- "Format for API (apifmt)" -Earthdata -[hidden]- "Format for API (apifmt)" -"ICESat-2 Reference (is2ref)" -[hidden]- "Validation (val)" -@enduml \ No newline at end of file diff --git a/doc/source/user_guide/documentation/icepyx_architecture_user.wsd b/doc/source/user_guide/documentation/icepyx_architecture_user.wsd deleted file mode 100644 index 80e57bcf8..000000000 --- a/doc/source/user_guide/documentation/icepyx_architecture_user.wsd +++ /dev/null @@ -1,187 +0,0 @@ -@startuml -title **icepyx Class Diagram** - -class Query { - reqparams - extent_type - subsetparams - ' _subsetparams - ' _version - file_vars - ' _cust_options - start_time - dates - dataset_version - granules - ' _granules - spatial_extent - ' _session - ' _about_dataset - ' _dset - ' _file_vars - CMRparams - ' _CMRparams - dataset - order_vars - ' _start - ' _order_vars - end_time - ' _source - subsetparams() - avail_granules() - order_granules() - download_granules() - visualize_spatial_extent() - dataset_all_info() - dataset_summary_info() - show_custom_options() - latest_version() - earthdata_login() -} -class Earthdata { - uid: string - email: string - session - pswd - capability_url - login() -' _start_session() -} - -class Granules { - orderIDS - ' _session - ' files - avail - get_avail() - place_order() - download() -} - -class Variables { -' _vartype -' _session - dataset - wanted -' _version - source -' _avail - append() - avail() - remove() -' _check_valid_lists() -' _iter_paths() -' _get_sum_varlist() -} - - -package "ICESat-2 Reference (is2ref)" { - class about_dataset{ - - } - hide about_dataset circle - - ' class _validate_dataset { - - ' } - ' hide _validate_dataset circle - - ' class _get_custom_options { - - ' } - ' hide _get_custom_options circle -} - -package "Validation (val)" { - class dset_version { - - } - hide dset_version circle - - class temporal { - - } - hide temporal circle - - class spatial { - - } - hide spatial circle -} - -'Try not using a package to help with layout (didn't change anything) -' class APIformatting.build_reqconfig_params { - -' } -' hide APIformatting.build_reqconfig_params circle - -' class APIformatting.build_CMR_params { - -' } -' hide APIformatting.build_CMR_params circle - -package "Format for API (apifmt)" { - ' class _fmt_temporal { - - ' } - ' hide _fmt_temporal circle - - ' class _fmt_spatial { - - ' } - ' hide _fmt_spatial circle - - ' class _fmt_var_subset_list { - - ' } - ' hide _fmt_var_subset_list circle - - class combine_params { - - } - hide combine_params circle - - class Parameters { - partype - ' _reqtype - ' _fmted_keys - poss_keys - ' _fmted_keys - ' _poss_keys - ' _get_possible_keys() - ' _check_valid_keys() - check_req_values() - check_values() - build_params() - } -} - - -Query *-left- Granules -Query *-right- Variables - -''Query -right-> about_dataset : is2ref.about_dataset -''Query -right-> _get_custom_options : is2ref._get_custom_options -''Query -right-> _validate_dataset : is2ref._validate_dataset -Query -right-> "ICESat-2 Reference (is2ref)" - -Query -right-> "Validation (val)" -''Query --> dset_version : val.dset_version -''Query --> spatial : val.spatial -''Query --> temporal: val.temporal - -Query -left-> "Format for API (apifmt)" -''Query --> build_CMR_params: apifmt.build_CMR_params -''Query --> build_reqconfig_params : apifmt.build_reqconfig_params -'' Query -left-> APIformatting - -Query .down. Earthdata - -' Variables -down-> _get_custom_options - -'' Granules -[hidden]- APIformatting -'' Earthdata -[hidden]- APIformatting -Granules -[hidden]- "Format for API (apifmt)" -Earthdata -[hidden]- "Format for API (apifmt)" -"ICESat-2 Reference (is2ref)" -[hidden]- "Validation (val)" -@enduml \ No newline at end of file diff --git a/doc/source/user_guide/documentation/icepyx_class_diagram.png b/doc/source/user_guide/documentation/icepyx_class_diagram.png deleted file mode 100644 index a98b53605d7d61ba6c650fee6867432d5b320f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92204 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 z 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
2rVH#KZ&~7ChxasofnL8&f@P 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
  • ~^pOO3$XPEZf3xQmDX5lee zUgSE}7vUu^5WwuIoRhV}-)%osxz_;vI9L!!wzCIe@e?^zMvat*Ytpy3oo*Onkd

    q=PSR@*?x)H1AF29iqUR}gL6+Tse&N)r7yr#!Yy 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
    xxKOTQ7%e1QuoX51OgMHH%e2xywczAcR_|H zcPwCBf3eHGygaHh1x6fR$y|i7iSJ`MtdDjt|-QC z25_0&Cn4Fi5k;^6y|Xx~#1qxvGLw-0Wg{Vv#-W}NzWO?QzGCVfB3((0#qx{hwLP`P zbkS$B=BUW1V@{s_Sna>PfwZ1Rf`47x&S)v8F;qfLOVbQ4^=fz}sP;dfQTUX1vh>+D z%kQ#)-C!YYLu8jx6BS}pjzff?6`#Cwr-g+>zR+fUis#FIuh($t%AjK|Z^?h3WsA>c z^($skQdNcGo7B1aSlFh)Tcv_F!oDpu^9>8-)%R4e#Sr#`$3n&LHQcH(II?=6YoPBb z2NEc*JIkb(Zp_43TQ#GKIw83Ho)0+$h~|OvjWtLm3l%TyMArz1yLFdsIuLp7_au8A zE%a@^z+=4ymwkT&JU6dllXmuoe|Vs6zrzp2qCY=p9l1(9nrm-mZeQhK*T41qb&I2@-BHhcFd+pq1*lC?wj6r-zo+Pu z+?9W>gH4Noy}_R#VBGGU_9tKwVgf1_#E?G$>F-Z!QFOe;@9)mmbIk~2a#?I~#t?y- z7))5j5_CZA#R>e0T>%2)F@HjkBqr#d`hC0Ku@IUMKOJ|GZVm+-e;aj(gj_zUW+o*iWoIwuZWD*nbX{LrBgF)L|!Os2BUWjJRyN;H}A9SzA|k{f$iGHqKd@nZ{>ym6Z$9MCvCS zlbaC!7LPPEW`eK$9_h|l@O6_Ooj+@;J^otR+Uy$DM9l5mxBrPM)ZVk{Ks~tdDK<7X zdPqXpPS{o0&xIj4IC$(a<}J;(#Gx?DXJ=Ub4rb6{72igGFd>3>=6#frm#5@)h1=`+ zPym5Oy~HyaEHqQ(qKDY>XO%kl64Zxs~GJkf~%_16&TvAmIIu*6ZP hu&$x8u)eQ)T_hE@zWib)4GaEzAf+god(ZIY{{ewm*dqV{ diff --git a/doc/source/user_guide/documentation/icepyx_class_diagram_full.png b/doc/source/user_guide/documentation/icepyx_class_diagram_full.png deleted file mode 100644 index 84efb7c7aeb0be11eb908b9fa8cc9df9f4b9b6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124664 zcmY(p1yEdFvo#zbK!Q8L2?Td{cXxMpcZc9E0|a+>A6$dO5Zv9}E!aQLz4v>c_ph3% zId!ULpS@4_>R!FNBNgQ(5aDp)K7IOxC?zSX{OQx@f4&)CAi;O8O*TWoKUA(_nyw}e zj$XEA=B}S4%E@fS2*iI@eHA*kecWkN+J|cVUKIGzmdh97`<rTclFlh{q@AC5( z{~vG3=!Uct3I6J=Dw=9sY(ERKFjeorFOh01X)z|IPiHwrX^3i@>0-e}>q6wA&I|qY zv0{-D#-LMtkqg`?4oPcF0)Dd{M$|)^7U>-FIwhmy_K`I&P;K3|H~s3X-5)e%0eqDA z4R#us{RW?|xQyJ2G{ubE%qruZxGS8@{7`l8xi~Ts#ketKQyk_>Dfe4t2wG|ZgGN0$ zq_Kz6{Z|E>?LwAgoEAH_h?i0cRbomZP3lg$e6^&Vb9L0IYYR@3GF)`STufRtbmbsJ z%MXSsP^#Hz(w8yO2HR=P(mJG?kx@r|Ua|uka;|hHkZP#RC|>+ojGn)35UanY0=-=^ z-=q596WZ1ob-GAKgF|l62Pi#Z-0{X zf=CCE2b+nf`PQsM#aQ{`<)ET+&1v_+9kN(~pA=bSX^q0oLF?wExv@N$Z)Srb3L8(j(=G_0hTV42 zo@T{Pa_sS{yiaG>8*s2nk=HGRffx=my^glzds zs<#w#U_zC$Ox@3R95$p^R}VI9W-_?ACNWML90kTK-TILO+aS4N){WRE2h!bTfrgWv zbyghwPX?@V$eVJ1$Y1mjB@ByWr_=Uqb1IBLOe0qZRc$B^<<`H4Ub(&yg$niB+snVV zLp`;rvkq}hPhBXY=HM0)0AkuYVR0EJ_ zIW_)r??!fZVWmAgzbtC=re>UBrc(tFFtngxeQ{yVvYPAo+#Pp=YNx5eun+Tk5G|EE zpki3+m|kIE-*^0g3G^GZGjLkfSo@z#zrkA0mkz&H*P_+%@sB&lXXKnu29Bg38uZ-; z!*=&^1L?Qh4=~H!E+~W-L>J+(FS}Oh`8vw^!6r=s7=A7o1O$cAx3ER`9eqzX7bRS& ziv4%_{51FY9er&0B1hd5cbHVdm)n8u{2zmGf5cjhl})ME^nRWWuOeNo0|B||!Yb5# zn0KBwo`kVFs84SA7rR7A6gN*p% z=jqAu%-{NbxgdletM8tU6MZYTN{|Eb9cFT@C&e}^Tp@|=BG^~{y)h5|gfW!W0@yj;X(-}=0}96Gn%XARtD<;u53Yzh*ieEAId zT)VZ{^L`)jid6TWd;YLp`+jag
    27yYJN#;CpoamdR0*#pklK739~&N05URK3}0; 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

    TOy!6zKRWD zvORHv9bv)+5#AOb0{I3P*-8Ot3x;^8k3HIBXIYfgQ+N6LhtSdoSv{|1z@x@xPsKulHN5=4|v`hJN$QO(eon zO-Z9gk5_Y!qyLEkpZJB?>B;$7A9ND<%H9T1v(h4~9r7$RGTf z=jYZoPiem~6D8m;UaojhwUKTnFM6$LAl5MzsvC2+XtcA68R}BB)MuTuPqg5PKxkg! zXM(R?5u(~)quW3X<)B*QV_IV?TNWx>r%|;9TQtkwW?&D+FkF9(`5bIs>1)+^{3T8L z+u$J0g7@5fDd-x0R{?XjanjAE{&7U{HM$+j*|Klcl=_O>SG(jaoq;RgF~`APoG3go z#-{`GX8k{Hi~2LNh=C56i`wQ(nr0e7O?qy6ux{#Nn$ z4s3Qkl+{kxk$%fj%me9yIrva{xd3*ap4^n%d-v{;&0{noKvQ4#RKL_RF8Bz>3HS7S zoW(}yf*obLo_LvF&{)=ov5g?Bd-B^&LrAvhLY2NUF<;4Kmv3KS$H&CKl&d1~Led4u zSf?+;E<%(if<8|7zJ*(<+#(hCxTl7_UTWuT1(yWs9&wiUpXp$zhsavFG%aZ}rFJiY zN}lCsUFkC4`+su9Vvd_DR%g1kLQ=B0gV!|8du`PT%@=v$3o3!Bi*mPw!?Xy^_#g~B z4yG+3rl95bY!q8;V&M=sF&j>uLd=Z)P=(-S%_XJfrIX^NRFvu_A}!M_Jxk%PK0Z$f zpZ=sJaB^3_=-hjp5uk^}>FN~Y6B|C-3Nmm7*)~nuu@P@t2{f#Dx;$!drA(35OQn-! zZtkrY@{}{8E$EBzb z9%UBA5ck)_Ww-m3lF@HkBwfe_&1~@(o?-}JO%IgMU4FQYDRCTEHhEdmK$%Kq4XKV{ zmY%IZ!|In#Gb5+Uu{M3Xbu!9zGmaKWs?}+U(ONi>(O2}y^ZbJ462w~koMnnRd(~9# zGA0AJRXlU`3{jidss_>z*6BRBN9EZRstjF1ucP?1UATv>4rJ?*)u_p9-vpZ$*xMoA zCPDj0NQXo};XII~x5*_NiM^6$Swo~&m`a{{Rz`O{$DpO1f7Hkq12$gXqvL^>g)QA` z%T2#GpZuBS^>ygxL8#C>KQr@l>D0huAG=Nkq^T+GIJ>d&YQWdo{j$$mRLvnMsDSeO z(Gc1Ij;SHslLn^cz`&%7kLU)aHj@Z9-%Y3OL%pgv0{?NkOy63#YsD$iT{LFBLoaWO zjl0%Zt=-zisCl3z>E%$t)`a9fp!{BF>CtX9nMYlVzOwLsw9{%j#p zP;abzo}PK0)?x#3(MjAjFGqg$_U;CSA;dZL_DlR*ir;(t@z#du9p`_(?sLD981?5M z!(RV0?kRu3qwe<&*ZYm{26lEA!=!#MLEbD|$YfPjceRjjm&gdYCRhSO+hlv@2NOt# z?Ft(5K70jMh0X_4+Sl=)F=Lr!Pn#TfQR00MQ|*S22HenovJpR^4s1H+hs`%A87(u; z2Ed$S;tNoHyl2}Gik~F3k+Ql1>%8ol`L$9@o1!l8_B8;ZsEQUtsV0bsUQqKiIuT&C zBgp5g9mdKVH(N)XDEU%Nk^ylNv*9kQBy4cYn;Q~wTb-z)_-c#O7E?ZV0Mnet?{PaE zi9F?&ec96=DD@F_(rmgt82;;j$`E_P03Dq*Sz3aagY>Q+Jv|~R(gM$C^(rbVGBPq= zcW15FlV7XF&L3~9{ayz!m3j`n-?Td1|7`ueYbITGe)M%rn|i!HOfs5Lv?oQ1xs@t@ z@lHFj)z4TAJ4^LfEjDBGg?g9dc0ZQifaJCKk<_EI!%_FqU>%5pYKn|>#x-J!9jkq>pB;}Cx9O^aGN zsBFSaLkthL0luGnZ!_ue@D+^n(8rJzgK%4r<2I&qx_mOB`pRs#%lr62Bde5kPPHGh z<-W%x5E}-xf{sm`%+d7wO$lU8y6kDGRjJ3C+3D<;YomS1Ll-;_~Q^gSspwrkx_ z*0Jxr9i`2g7#VS>6#RaXnUk|c87BY}`vkz>e+wNxvX<*%F9n%53_?ppz93V+Jx{veN1%s^75Mly*y6&(KM2i zlW#j!^cM=^L_s$&n)Zi&hDOJd0?)=x`_^l$WInUBJ6XK+VwD~;w(k`zz(x7;M!l*RS)3KfAa-EGf=qVJO6_4VH7n-`5?X5%&D>5DuVlqJ4dR#T6pP ziGsU7?}aDr$joZz4i@hTRf2YOO!?l`pRYB8apf*f?$+#4k&!bpGM=Z#<2-dSh)5J8 zrgEd{mcG(Lsz2U8cpgr{z&){3uI#PzkDt-JPPkPXL+N0S=d3u_acSMN1yPrFSWZ3d z@YLg&$_{Y%9qyGXx+?7Wo_1VB>1~toxOD$xoAs-G$Q<`}Q$HjOdXsA)Mh-p}4ocj| zkpFbG{C(E7fGJkW`MXf<%jI`~=-qYMhg=oP)nGRY;#qh2(E5(~4Eg)RP82IkYOh#2 zYR(j`9CV4Ht`2l5me{B`s^HCWagG?DRxbqdSzWZBAR4ACa&RX~zYiKvqewjlZ%<3V zU24C5zr-eZLKS|wjPt$8N8XTONqKu17Iuq~r%aKOl43PK-?yGR%<=0o8BKURbb~9l zYShMM)&?X8RVSdv7Ubm_^&<9spvJxEyx$yOX|?WmJza$ORrtN^k{TNs9i+U_eyuoA zdU$`I&6!a*H%BLmo;Y-2URe*#v(_B;_N!h0>T*)9q~Iq<>=~ESMs!S^o)7b^#@aWL ztQn zABqnoi(+$IjWQM%bgiR3Jw3RSY?hdqm@KVrH>=}IB=0V;Tg!5De~l@+-kvP%(a_V= zPY(q1|KpxKmZ+B#98=TBE+}End|z|Ae>OLNH#Ob2ZQeLwKtx47{NsKpV)$6qe({9* zrsCK2@{To2U`7-4m}gHGGW1ky(wD~exZWmi&T=k{e8tY1!+-2~IKlqllKcaBhxpYg zQ}Zid^P;b}D8}KN=vn}w-1=re>nni$J^&Z{4>r=vbJ^=t{l0-m~{QE-xsnUy&ty2ri7lED)bsG;>*7{A5Y?GXWeb|f zxVdp_!SDnyc|g~P{ACn2%L{p3xN5iWu1t~v0#)gH;pwmyq8h=3aTxUqi~8AbKWb0P z9~PSzU#eFowfo${)6^V{>60K1U?4DIJGA@yPUo5w{x2!hzxj}E;p*<#=gWUKXZMX^ zL<}r6{cXiu;%$C;d66p#v7XQD-+t(OR3%taW_)Nf9mmm}oS4Y;V^UI5TB==LTVr)Z zq*cnMD&KIKQ%L#Seid?f2gM`@-b~tT_nk!@dskvRU*|U{pqbEq9Gz1VR&YDho&4uB zutbpo*}a#5aK{vK$xK>1tB2GL<^c*mr#=q0B};y3KFeH9=kujNlZddeVLuHoX&jfo z(2Ks?sul3?Jp3_|q)SiTUHWQ!kA+WByBkjGUJv~QyV_LtI_O&heQ2o}5bc=O zH|vX){1k+0z5atpRZi#l`1p=7{%tjN(o_^nf6vT?*B)F)d^7B=G`IZTUQNjP4BlQI zuc5e|VqLTDx}*pHbOQ}Fh_Je@Zf5!G#>$FEgq*)w@_5&o+w;D`S#gdplDT5?KfLIh z!JZbx{^A1=2&}Tgl^ur`yo>I7K6_mD!jFQWA)?_>#*kzsDz)x?URqJnF)-Jf`Rwr7 za!O+VFz0Y8hu5>9vvyOMJ@PW=B-wzT**fz#c*W)BjNouhQ6+$-jNife7fx?X;2IoH zjOqqb(=M(@ZskuByJO+QTl~Ds|3Cy+zF<{0rgFT7zK5ykeu}uo zT>ks|{PS3zJ9pGWXu9QbF6ZxF`tExn@hU;@hs&Frn?T~H=Vx%e)RD_mh~ka|?*Xj` z^yj5oFSP&edY%?Xjc3_Qhugcj@Qo<<$8_j?G8<23z7Da4hMu6{YlAb|WMGslgp2~1 z41qv4zHj*y@cp=WZ^22RL2?c~c76zqK~H!|rPeoh@#kJHVnonF%gfe1Eh2bKW!Rk9R{~QG5Q)KKR?oW*uD%WA) z2J(9|KY#v|*li^7b-wRBfSb&Qg5r!K#LpumQ}U@sWuGv?o^vd?K7wN__T+GmeeJu& z@p$nyJoNZUVF3i-jLU01A5IBazsXW6#%zCRa{0r6rZ41mwpCJa`RQVzm;SCNP@wK- zhJ?1T%En2Qyo=3vn-#&OHXm6yXKsCbr87pPaDeN>T16>|hkzYaPiCN= zy&)+F13VaH)@RGQ#@P0x!iLsi2Vh5}US4|L%&Kk+fha@EdP`MkqoQ(qoRxst#4;;7 zI@*1F}-5FXZ+X*F`Z^2wnOz1adNC?5L3Im>HSKe5U zwHdXYyE{Pt@@0Yjo_T0N>Bht5!Mv&AQVYC_!P(i_y03VFtR(=;HPqLC<5ciyB@6|} z>Be2L%1r7on1^rU;A~IG<*0o}u97ic@tETQI_>w{L`0S2G_jzLsIlBzg6vHPN?;yj zrlooM`l`KPU5xiVFt=WXcWx_dXlmkV9a>bFH3j>xQF=T)DSGGJ4+XmeZn*w?;_>sq z1w2A%%dxyLQ}mPDQm=!27gGRL4xe5|htnS{)|1fYM6y=wXXw9Bvxqy1$8@l|oH*fk zB$FZ3#JWKr#nk1`cz~vSLy%CL|5ciPg4RouQQ{>6!WMPQ10;Oc5Tu)sf5!NT$-Zf+$k=F^`uTqmb|xjtnaAB>%FR#giSJ6O(lJ}!|T7*1?a zJ2*1;l!mNnIcm#ATwNb@vY6vCYScM$r#TSkJl=)Lsab`IUWq1ra~<+%c6{=PE@;{a ztvsL`E`CR!$4%8NO5SODc~&#W1H`#;q?mIMZ|2>g#E|KgZQRl{WuEK8!DHL8~oMB&hD# z`eHNF!DOa297CYP{}KthKqEp;T#^Wf2)Alr&-1A=dsgZsIDrtGTcU@q1x24LXVr z{@Sax^)qubu>OIxry3(>4FcxHKNGY9lGFfyNRGU z@8#Xa9P;g;qNU)BIpbI9n*E}lgqNt8*vV_2RG2IZO~ob6lF$Msb;vg-3~wC=O&v#O*VSaP z82^B9{AIvR4U55>%jwD9gT{|T1AwX9Zl3$$Lu}0Gh~R4}U0uE8#02j5TzjBPZOn6X zs(c-P=;Y}!@Jtl?D8HQfQu3ECUuqG;6uoVh4?ez0Bf~}u3<%(WKmr2;l@t|mZ$bGg zY0=9HDM5pqvKez++OCR%F4TIG_z1PQy`{j#*s*l|(kuJcOo1Al^o@!kdVsf9%w;aX z-Dw~m+hARKVlXgTZe4bwF{gS%-Z@9&Mn=&As-1_sKy4jaitdk34{-~M;=fm<-Lbw= z&M2;j$xf=qMu+O*>dJOt#(82RM)a2e2mk*6{hy~t5Rh;Gdl~^gcc`>hnVqkxobdj5 zWoMn)>(9o1v`6o>Tur2|D|tO-YQTQ{>CRubQA>A>rZQqFUChgn+~@t^shj%DQf<>o zr1u(R_0xJr>>LVqN#u$5Q-{*+-WcLagdhv-x+{2CO>0|QG`r0znA?BGGW@Sz&3gd)4~0nns+)2!L{zZVEy%*?_K*72_1aNNleKqz zIVG^-oa~gSo)v--tBx`k9L^NWig}LbEBZoIMg|6#Hy;oYG2OqV+a7h{$C?Klbm-0* z*SqTTk6~8in%eD7(y6pVBWI)A+u&(K-%Hi8c zFQlp?WwV_zC*t5g@5@kxay(fODM88WkanWdFFhDt=h`shGW#Gip1+gWHX+2V~ z+E$Yg%2`{!w#dsj;<(=vJ8Uxs0nETrkN8Pdc(}>GYrYDb2uKm_w5n_$C(e1BzTxQFIDAZ2tE?omQEwqlmH<`y|;*jS~ z&)le~kQ2}Q4weF@Y9p7!6$%Uq(;!hX-6FbHOB8cnS%~u5V_lsxb*_<-H*!rwrs9Af zjUOI9$_4G8&%D%`+G#PZ;nSxNx#MP*oSUs{rj>j3-UP8HLt{bH@VS@+5|6;G$*3}Uq0C{2OH=+L{AX;8(`DtEvZd^$n1{O|TKx`I zN4~2iwZ}t44{|fAj%Asu%zovQA(j=;(UIW#I%=ub1eln+;fg5e;+&;gC&!T2nk`el zv^sf{O)xOG9Edw^OjTFwWx!|{8P_WhR`<4~34-vj`FR|cPi@twFA~s7y75lD=2q7# z=ndtW6xK$t5#bro1N=X^zo$?Twx zmMXrQ>q>>Xx$5Ko#-W2JKTuGu8R@HI)poafPH0K%H{;~8E{~9f1!o!r0-=`wFol70=ztwS=R;3 zG)={$WqMIcyzdpUQYIp(je?thLzp>0?N=+_ANcg#B}UM zNQ)aAD{O{;TX-iEg`Dim{rZ9<&bc>z*L-lu)CoG~a^)a7xlHxLgt!??XUxuM&lq%V zM5*{W*L#g!S1hmRC!kj4RAr;sd=%BnH~3HVOT8~jQT^U+8Y4>u`Ucuk-2bM^L4 z)FMY!$&X0fk?-pjke-?fEEBsP`t>YYO7G8Rs3N7?{jYLs05sQ45%c!TXm0K{0l^w+ zQsyG&Te?!DA>Vy1C4^14r`$Ty_i3?pzE$3xzlvUy0p1 zWd?m7*L0X*WA8xY51%)s>Q3)Of5@<#M%fP>~iL@Omch}PJGd^{#}JR zh9Oq?(29|GMHjQqmVXw=CX~7UgMyj(XYAB*H=XXF=LMqv`#GhvFx3D2x}V$^m-kQ8 zMV>d*azQ+t%a42D{T`!^4wK;DN9vibH{&L!kgz6VI9;}w9 zBqZDrhQsG~#+*7P>#%NIRnQ`g%e~!y4A?a9ubV)!2rVg!@6jCJ#B%!JHhf!SXO$6) zb2kGJnXI9amR-?mg_k`7uX>d4jFt-si16`^m{eGG^=Gwo#1`|qdwKbx679|aSiTN%^Tq+`i>LLkFhFa)cwCAeHEI>Jkg_NRe>?g@+9UPknrKNFx zekxr1UB36d276Kj@My|}p5uY|zGX=0)4nst{QU@V)!<@e%)m7ZV1a6=*I7Wrba*$8 zc_TMEhA2cv(Q3%Jn43|aDp0m#ASNyCx%~0;J#@W}c|8j1s=Z_bqfF}O?F9XfyK(wI z+pE&5r?pTsCpV>$MM(=bcC`Aly)5A6G&7Z)>MeKo;< zFyR`-{e3GSHJS7PbeYEksxnY+F>a`3+3Vf?g4mHa39p!#x@VQV4d+6$QQ!qezwT|q zP;rlcV~MJcx+s~d1Vs~my12&nSa6HO-Ep8X1;XJE$+?_H_eY_2FNjl7s;^w1oGr4e zM3|KdNu;EByz-IP%$p3Qw!I-75wY=ZCDJq&xqEKW&u>c~T+& zVy-b*uVc%yI3p1T8!s9%0Vj*52|5V22HE{>#}7*KVR)|7sfW zE?=k$r8=-V(5|ONM5=N`v)_6AXOT|g5CHBxsi<6l4o{<5f4;as%ASZqSQk(NW9q&V z-@cJQp7C1x1YC5W0=&MyIfMoZX7e_6^>PaAW?H8`blMzIJd=%Ix`?sE+0p#`!Um!P zjG&$EBPT@rRq8KPD?4A7MVZ^;ow={vxgGjhNb9Zy7g;TT?@iD7u&yw{>kn$f$bG~f zUb%Z)f}e+O>Lcm5#!6HC_m^H>y7aioK703OI03`!w>-CNp=(PJ3qwkkw)l@|hfW=~ z_UYo$Y%12`)2mHsjaN~%F681l`HJ%!o{_2l_K2Q4O_Cc}* zy7L8lm9h{Od=c`68w(y7f}5V4ytugd<`p&WvuExS+5!R#y=j4rjD2$1ht7s+adGvl zLibFnsgqLYZ)df&4(l6n2%Fqs4dpe)3mAhj2X+i&P2 zqO_P3+gT4=8-G`>*}%rS5*Ph=g%!#qHIdB=1s}+beA)U2k;_RA995`02BJjzlFAzPf;Q4u!G#R6J-vq4h5EFx`89X;`eJLkJPu6Tb zT{6Ma(7;@u^@UlIJoUzU811l|LNgZE)9!R|47mes=oUxj>eR@KMqxn&;N-k!fIy`G%>F(jm#Y%nqVd92#%2vxvR zZeAYulRJ58sJ~6k%b`0)N=m=)EuZe*X{daIbY%Mt$tyJNK6^ASUCK06l$8gA&6Z=> z3_Oe(x`JH%({I63f!ay04mV|FwM`Ak$Pw$C(z+l{R}y{&1?8Qe9u^uh7*0PkrV5d% zRJ=9YHnn~m`R3CQVfA_r400$;d3Q z>6Vq{)0;PaW88W=&FY8k8K7^)6&2?*6%bK~-F-WG`TOEgdJpi5UriLrXlQ(VBZ`rk zsda#`?GdrD!Gm{pN|<&%AzO4~!b01BlYI{lPvGTC5*3w|++5glMXF0|Y>KDnCBuYV z9=&-*J3P%PaF}hPC8Uj{G=km6PCy{7y5b}92O_WOM`vG5bMu?-fG=Nm!Q$4}UrtZU zXi15Pb!2NM!V-3@*7pqztVt3{d;C~+aWQ>o73XHLu_2YtfOWQ7M?6z6xBh(No0uXu4ugq^)b{w4H42#+?|vgb#;Nj1#yfr-f)6$ORy=;59> z!LKL&^`7?*+@ROacj9ptM2n=qUne9aIWI3#L6jL@V`8pJ8W>IZe3*%bMn+T=JeoWF zi#)ZkFj|~21_q;bU}UwJUTF~%Et&4XV&7MNV?#qa!?$m7TUHXQug}c9FEp5IuVQ5x z%-1P=`TO_JiK&o3Kz23WS&9<=-_@UJ%BS>49aC6UEnI{(&MpI{wyjfgf$Efn^mF>x~cW;a$6LV~W zFbT;~SlG90Ht?8-{5-l8d?{*0C8bER6vznkZ3ADkoYP1|F4~Jkp!@I$2=Llz>g(Gr z51PDPnAwg?PyZ4ZH~Iw!eGgt>xlpd7^V+~5{mvau6=MQI!bibhFm7!%8VtfhfBXp6 z$ZM?8>%iKDKPRFY$inT|+fY?z`i_m(^xlnh1OKumQaPiA6 zVIILl#p2CL~kiY8Z!lQ2LL03lEkahkWhtCZf#WHM?>kqyro zBt_hNbZy4IF`tlJTryjx8GWK-*SQP12NJYgGpnNFD*eB7<;j4M|I0E#c!9}CcOc6|Id)J&p|l3$b94F{8b9FVMz`_HLPqNbKgd{HgS%X93TDr?M~`+% zrvG9j}GQ=ta+8RwU+h34g1~zgGL`RP-J)06%Wn>3YnPN( zFO$yho;!bMGl;XSKC7{eszTYbXxE6QaPE3GHZ-V+LF3~O-Qj$yJoV-XqeQcz z3TVZvC*GNv(OMKTAXF`rAj)K0QX(Qf9UU*}yM0X=hu1!rnR3Hl8pE|J5jS?w&Ucwl z5sHuBE+aeBdHKQRawA?<9^Qb+^10?FJU;yu6n@+WHj;g4fq$Fs- zB(M~qD9)vx^~ux>F<##9Mn>5K1RxczV1Kep}c^7k8+SBxNHFN&14 zvvo*KPuI{(E!L>xtwd0(>}Q9E`$t3=@Vkl24ZRjX6-?5&as`r)Z@u#DZ@=tdQ^WE&c(GOb9J6vNDdUUaoLC?q#Me= zlyen@rUr#Jz>08dl+H7Dy;{GcH9Uvx>D7W641(dqLk|7Nq@<0#y+4|Ti%esg%fmF) z)!$^id2?%WvM4u%K0MCH$IZ9}U%4_$xTUFSC^M^#fw7P9q0z5x;v(yT?Cq&~1&Lw` zilI2>^Naal4WC+CnwZxUKnHzHC}|QMPh$xF<=Ne?QVYp}99@u7`Qe!!7z8?|Tnm$R z*amME!i8w5C?}N^(Fh38cclwQs+?k!$)8lGR32|_%%JOZ#589SviE;4WY9U<7f*ik z0PDgk6!gRpFy{++NyIyWdcM3&Dj}+Ln0o{{kqCr>^o2)p`wQYLkXF|UcHv9XT6 zK0ZOYf{D&zYisnh*s>>NOG?4EHk#em$XK%LaeCtQ`uc=#|G5~xx~{JFfq|M)M=5?c ztcv0C0i~zijm_}zz=E&BR@-+bHmw(z#19T~`~>+qIalphJbkf<7==S&rIr-3LPBZD zq@h);R_H7LHm;yQ#ub%W-_X#%h5_`UP=F#cQpwiNjNC={wDFikCjjSvtjo&5< z%isnqB`L`-h=SQhTvs=|cqjkCOVvQAFhwEidFFNSKpSPjqY_i*h)W~>g2t2_T5n&h zkjU7GtFHwFo&-KnJk1s*lgmr%>$JUnvQ}0w0bioUUx@is+}}}h;3*<4Gpf# zz1i>PJHzvDB~kigm`6X@f{Esrxvi}-03{a|#Z>^>pQ#WZAD@|$as-Tkek%a+sZ~Zb z55!#TE@+z@;V;$11#jrI5HOYO?b&vJ{Q5Nkl#lFeYxzM%rai{(|ILUY+<(_}6b}LY zps1)HJZn_X@Sx)rk%zH3;FJJXhvlB7WN_2U5I$j)w;snr0tEB|b^`QJ=1 z>v=joy{rhvw(Xh`Mmd1i`a!)Ng~MCByBV0QU)KKH?G9-u;v9z6AYoYi3q~8u!p-gN z+~Qd5I}?1g`h2I5O#JTSO2oPowTzk*e9Xz6|H;Ph_Z~y%Fn+vLzoRc>0Zdc}JEn;d zAW~*$EzqPl{|0>SbpUahm}Yx9DVt;WK?DT$0A~B8tSoCGcl*@%JM`l7-Q}(_>;R7z ztJB9~c3}i3)GaNYWhj|mboLB{);CbaIDSh?lAy-5wLA6)_cG(uFyT~GQR(|-TOUS8 zYBBp}%BJx->cYGrK!TumX*K|-!+BJ8R>6BTAM1ml218fE3>a=5OKoyeGeivxH}&FR zu#z;P--*|XO=I2q{#}@RCsDTFkH2G1*v)@Y>Wlbx{%0s~*K;HUP}RSg^4_h3>Ha4N^HJ={fFVZMZC*}@KPa6ZQ9}%$#0KxL*_8Jd7 zYHF_wbN`b8EJL$Ba|7ncH8{+1m<3&0+BGO>1{j~kjeQAO**Y-B)_rk* z0~KV_qfzinN?OR%EdTY%#f3_r3d?s7tsDdEKh9Vsw2uB&#OX2V;Rm3vk4Z~5E}(%P1Hh?~h6}xVWiKM4uBmycudp~YH6sI1NXT*DF5EvaAua6@-TREn%0d7t zM>5WUQxHg-Y5W$PV?~o}gQ9o3%s^?q#az4-92CT4dVE;#ZR9UFRqN>hR(|<%*Y=V^ zp|Oez=Y_%}o&dqhvs_QZiLnwFAQqk^fLOf27kRO1`A(vBdss@*)0G3-s%D4Hgj*RlJz53y z4HY(%D@i966uG~<{o@`AbU9&t@%9!K5lMKIo|>APmiDt46WOWXrE1AMrFqKqlw+D^ zbGD+XknCw~OMU(KgaihFwUD#4WD-cdH*ap!C|5*e$H#wnI;jV>QX�$e(tE!|Dr? zTN%LHm{3F~-t7DuE@>p|Giavh=)I7rW8;mk`RSl5LTVnQPFo83T|;DJ@3Uw-?nk`0 z)N^=LcPCt2M@L6pU0qfdr_u_U6DWM-2~Xtw1^EF3*0$o144LKy!**YvZ1nlGoqp?< zvXC(dryleFAUsrXEb*g{4?pS4!a@d!wGs2_uc|hR?^u?z9IP;hBcKA%|- zB48r*wqKGGd@*_B{ngWLn5It$mj&QQC{!4$ys-zaINZCnrhujw2Zkv_3F*M0Ukdfc z<_8ENd9-fEb>%{jD6+K??X(`elqk{VZrfugp>{~r#>V$es{Y45f1-!`wfjd)j9X!k zXcY3E&+LduHTSp&Sd_frWUw7zCc`>Tt|WJFovUItef{tfvf!X-$&d>U{6M+U9b142 z77{`qK8Ds2k+t;t0l_U|PW!==8cQ$gA{KwAHZuKbCBA7J&d;Y@-QPE2c6$(ND@=`v z?6b+V+lFNBe+YAS)z#QF4q!6k*z;K`IC*=pTN2AfJaS-Hd*_r8pKtL>&!_Jh7`T#r zY30%tL8u84B#Qpmt9Dz=Xz!le`Y-z4@4ss=TUk;W#!XF4Z`2nTwzUIWiKYv)HaGvU zGjcLHVE@~FiG6Kw$2{k?cQ=@wa>^9h%@cj9VJdwjK4+4RnvTq2LonrT!bT1Ha$2&u za!jQM(Lu`7HNc(3LEg>liFd_T1RT$TIVCnzsXj`#pIFx-IIgMuZnM-(3iIxK!O18# z`7#q58#frhX{(~fKeqJtjz^l>Ej@kq%%ePf3bcUJZlbEZ0s?6HebU)?hyZ>IT0&Wf zdh5x^?$D@!F;puV`C)Q6pdvS$v2b|7J@O#q=#ry&X0dBg@N96-gYuNMep z%T_4R>V8VaCP%HxQJ%FjHi4)opp~9VlP2qk(C$zrB{N-0r(0-C7LBdkOD3$STmB^t z9(WfNg^-b{9r`8O*(;MWS_0G303)9azyzOJE}sUvZ?q&K=R-XWjTh?G_W`hqLP%(+ z>*yeBBhd`dQ=bR%o+0w5$|Bk|*O|jxB?JTl{MOgzTxx5thDYFo$pW#miHmq7r_*j9 zJ>*xmvAKzjSYMyGhK{bO_zFq@go@qd%%3wYX@zenLSe86+JZ<#zmKIS;Aeij+9cAdsk+V85dWi-I5MigG4Dh3co1C z_x*H?XrC`%F#YM>fu4s!5m;Gi+2CUZn2cD?BaF!#r=W^M^|cj1FnRKp>*L9QFxZ57 z+zkRWb!}}{kb$Lj2<$J;`AM`!Qd|TGS@X=(0fHB?^R8KP5Ei{OP@q=>T4pKH^p~6* zkAwt5n&EOee*I2&^t@`KL5R`cnYo%-8>8}s(`EGI|ARP+>drsYB{@LQTwaM2b)(nR zF%}!M#_-oMjhP5!+c$QH%+0LmUV8O2H7hGPVn4D9TViJSH*H>(#0$;64Uyt(6S;d# zv&R~fi;Elplpkgxx#9{_J3IOJzaJ}t>ThYC9RE$VWZjre`tezY{Ls{uDJ_Kxz8n-c z*<~*6>z|!D8^&jdmy76-U<;SA6c*(Fm-;Oh5t!idrMX1*1Uml_j=-&EuuoQqan~+%J=i4z#s`GI*BcRb2F#h!7{6Dps_S~ z7u@z_*d?vmdAO?W>&tPDU-PD&uk%J<-4uV9cV1uz8#_B5A}klE3S(a$8O0_*yR z2eSNbzMh^g!=_L{9P;9C58Y>o&4HF-e1UI{R+UoaRlrQ5&=NRhmvbO84+&T79Uy=- z?|M$L>{5Vla<7zm2EVoe)fYdh1+H8cl%AL7FFhsaQ+zwS)gruY~>#q&O8SF zdQ?Ql;b4OWFCe4dY4a^xw4bW4x_^KEXaWn|W>$q|=RT)BOL^OJpPX^oK+GruFoDe3 zZjMe55VLMDo?tyZGzUToIH`7TdvCL&;kEz@vXPF{(NlKcY&Ps~n8 z`xNDlqYd}2bgY&yY|QD`%(OmG6LK9lHV_5)-FF!oWz)sQMw3%gDh&E2O$t*Y>%rkT zDB8rv1`C+rN6MMki{sy=tVaPgQd@hr0{W`eX>oBQ?Ou0`bjp+0UJ@EkLOf?}%DJI2 zRggfC2{4F}LkDl5iLqkSZMBy%D|f3SF#hDO zvlrU61^oN>dEoDh=Tk?j1!kpVMyCqwh#;d|J0csSDu~>KTko%)wqrlZZBd0&s8BoW?`V90rI?xxe+X5`qWJz<2=tW3VfNauT^+B-=828BM|k+#}n<=Z2bD@S;V z%ui1I!7{y<584VoNtoNqB@4$*dYbZ3a6eMKSt~U2_u5gE)$R9gET{T8_v>pbJZ0Cf zoB46-(d@}}Ghh2Emt4g_CfVk){{~yMCD*QazC)GSmxxFT&-S*!X)|t2J(k8KM0>%= zn43qZ1~d3gl{5H4?&8SK%lQ1c50Grj%HTkkD!pEAokh&t{;^0@=vO;w5+gIQigchz z3#i8hI=@=<#Q|t$EXog98JcSwwfon-Z{MonDf{%O4r~2S>G-BbpAMpjhNkWFjaW5D z);#;Y%ZL)GS<16UrH<9t)HvAHE8`bdBCDnb2M`qBi_lP25x>Ckh)g=!OV?L2r5Wi8 zh+$xRAOB1Z3jeQiA~gkU1d6hfcgDJ<1_$MxTW>Akf5e8n{@M1U0Li3e6S6+_jw=vH zds;Op=oP@|1hZvjEq|M%`es{8IFkpYgJN)aX%A3Heg7}t&G1EnxSKxF5D=PwKRj5n zuFe=qLd^g=6*Th$9!wfNef|ACTaZz|VIGW)%~IbWl9I>f@B*8hV!=cnZ=u*!;Pi-t zT^w|@bOZ-(Ct7Cad@@dO_31925uRr{i<2LI{m4llBqxxA)6#|-d>DyYr36wTXPhzM zn4Z2wYTGFiP(cqMU|3k}D3=D120my$C7rikBROaM#dKiAsjve23GDIQd$U~k32rFz z`@l&22n?Jc96x0vBv{{Ti~(pD9raMq5!gPWG7i`Io)}7~IMf282!(gSrWc*&o7vXz zdQ-n>LKC1YEB=qjm>Y6|1HdOHe)Bvrf#fky{@Ji{3l+E~9V}tG0ypX?gvUZM)E}QA zd*`@ph*9@tN_p0D&U!s*h3U^8nY z@b2*kS1IaLm@T~j{G9y{{8e|0jBm6@H^&5_0+s+Icn6i>nf&pYmEl9| ztp`W!AluN*+$TKGR>v8!#WCrKS5}pqn;Rehu^tW>gyiI8yv2RfCbD-PyKAFPhn(4?Y#L&rAA0f9v~w@mBD+(iBi7-<~_Xx& zsTyN&v`D$2HRiLm&PNjU|{arjeZIU5M654%^mNmLqFCVuZQQWQ0waJlarFV%#^^b zXQZV!H4Ma+hjASoD3mw>MW6;PA)f9$qg=?IsU9+X{eRRX3Y7#vFuL{k55yvN)E@hP zwznUi;1C=z3y_gN$D+U@w{_pw9L}e`I=nzcv0n{p2uQu-guiSa{tI$O5$BJR`?eYTf50IX3}}~ zkn2}9YFF00zBB`48Ib1}r>D6$Gy#i$Hvt%#4tK0d&pZ|S|2!3ruE3QDNU{FzmL)zw z5ApF;;85WLAqD2;gXt$+cm29ukbYeQs&q*5g(~{zB1A+);(*6->rm5l(mxomwS}G@ z4fcwp-f@1GR#vm(*(L9Oz5(Vu0Ew-y3Ehu5Lp9E1#9d9c=24tNQDx*aMjD~*n9XR&$LTC!^HodKowrzCcx`HY??+v>u$ zWl<9kpL=16j&8R#xo&Jo2L-T99Oa8%y8r%QdNYNg@sDyYb=2t328adC`Y<5;hXg(R z1VvWVXM*KlI#Z~Du`&*YSjxAX_aP53hm70$%*!rF-pp6fqPNdeD6kqK*K`HbKGuO# zn2&!QE?Kk6rqII$d7H;qNLG6c#pRN+vUVGY@BNawO1`_{jQ2t?HhH)-u;DqzkuF>K zsl@VU;VOx{h^>Q?ysgCc*@AKyMBX}Zy!r9-C7tU6!GA2Y|ts+LhMm~z^O?`e(D&vFzTvqWax5*-be2%(G` zee}MmnfS6ovrmAKagPj< zcRiw?x){iZUm`d9`uig&Rg@p1Rv>_na`n<@;JVDpsyj-A z95OFfi2}6$I0-W1MpKB2z(k<4ic`dMbuXe$zJitUM>*ef#QFc=)Y>dXTM%u+8t^k7QUi+@$R6?i&JU zqmceCd~-2_3DiZPsrvH+4k#}iWotW$-8!?}j`0ZeqU&D}MuX!3ngy&qdwTVyB*5O7 zX!~Br(JWo`&rQ$`Uq8_W7Rw+PND0!Is4g}gVdIoAG0y;^_=(`DwD@^W?c? zAsb`Ba=+xXEN@{BKR4V1-mkGx;C?}M$?c*A%5Dm#U!GL|wNM3rr9J}$KQw*kJq<7^ zo>lF2{f8NffdOWSdda5rG0ih=c4O!Y+(`#^Jnm`}_T`3?cY)Q?qJ9r4z+{i_>aW8* z3^%()>LCVL<>a-HH=2vRO_>UB`^5}^Ed!V-cAPtjnm+))SR;dmCNsLJh~_cC(PAxU zvxuOG9!)vjsn{Y|KgOS}!2D+r5$+Z|^Z)0T?#|cr_R7pr2c5jG7L`9){`oaLoE@n5 zO~ybIbA1DKqoeXdSC2G#5`EdD-E_HK)h;cQW3oN^d-fCbKNa``iQT@4g`mnV>Ei-H*Ly$evb2ydWOoWvdMmVrnzvgB5AXvxnhh^0#HPmI7^OO$8DAd z#10I=%y85h=L|Gwro2ermAGr*5QX6YeL!IG!h$}4-X#Pp4_?-T8#1{wth2KWcKiH> zrGSxX=F%3fmNM|{(VZa8=_W!@vFI<4v^AO<(6j&86$Upy&sQ});{zk}Lg3RS&7E|R z`o9Llq(x_nZX4nAUtOs%s`nb0K0X9m26D9j zuyN-|O=wK(jZ!Ofcxn%w0sf-V+bej**9dm@oeJTye2Hn}r4TNyWQEpj8lk}Q`pJbo z0qvPPK+^@LWbFAKalCxlgx3q^!k{R;Gc*)kqc@3i2dvkyvC$z@B4lDht+N^wl{8`u z4A{4C9f0tTr0_9Rkg)_k`ZY8IxJ*sCJRu8F`Nqv$mX=S4)#TO8R^kdjA>N(}RoYca z>I>~3uf1$*^=gDXd1624)CLAhha#XTH(sA>4SyXBtQWwf0RW5%sWPZ^WKGWk6S4Y# zaQjYEa&m_GxC0+vBrYw>2ONi9qX;zQDy<)Mv}2~UDRdkn>-^6|5HL9P?zy6J{_Pqb z?H{m<0E>|z;M>~4^{6<6Sm93>Zy@L*E)3BMV@-N^h^nT8o1;ws##sWIUu4qcFm=UU zQwa)fs{2X-OvyGUt+*!5F2LPwGZw&*c5qWQjf(!cV;eAX=rdpMw}9%!x=V}ooP6aH zx!PCom1E1Lv!U976KJmHFW;g^=832uRwoO+TWK;LTth44x;;z)`HAeFD19;6mpzCJ zRO;Mwy>mZNfdSs!BJbU0LnLABT=}5Ol>eBdrvF*eA@jZa_C)hZ2{|>a9eOXP!s7WI zU3)D&7wF0GYhFwu8i)f97KPY(uS_I6y+fWd;b0|Nz@O(7yu)&Kv9|)av|^NUIp)M; z(bm)tm}u=F5sHf;jxLNsD~tAqm|cTP3{@kR2Sp7N9kIiu))I6vrWvL{m6wAFTOpQspN z5npvt3D=xemftJBG{*r?-eE}NZL9^`oL*8*xrwJD4^0!Vm?|~aKvOr&fM=^k@FeY;t_u3oqL5_q&l(r zsArX&yMtukwLie=nS*rUbb(Pzsn8;3FN=cV{vCq30Bu8{{Bhi--557O8q0Pz$KwE) zbU?cE=P8K04z?hFrua`=qHnK={l}r7NqWH+Y$InpZ9v5N{hhixxQh=ZctrMpn(83@ z&!i4XNi_19IGtP7{fPc6hLx1CfTKrUE#UAB($23vn5%v^jNcqUkfzSqai1~K+|cW# z2${D!QV8ik9M|srPj;k*rQ^q$cNl4>9J*mx;+eZP#wFhL7C5{ejuvKG@LFRa!Abyt z*y`)I?r+Dw38yFe20e*w>SE44yrXLlv|7RNx<+Z^0! zd}WEWcz?g=_?YVHU4LI+_J0m!Ay4dJV2!F~s>T=lYf>|Qt|BZeC6%7mG{c1*Z1)Mt z$e_70JgIJ|t>s=VhG4UtdvJJHBuk2zc`(ij>wLi-2l7yt_;X`gHwh}Ll48mEshMd? zkiNjE?`G`A7&TZ}h%NOoII=vYprCaK`pfG<&hG(UD5y>*AA{W7p18YteAgcR&K!<# zJ8KXxUccJwfdi9H`dN#RLVk7I+ND38x{zeQkMJ>|qhRKY)LJO|SZUy{qyMD;jPoIJ zf4_To_nkU{I)>9<8#9F_0mM$r@%U0H44l9k9xIRpcN>RJS6-Q>yz41Qjayn;(NXB3 z+z85WUC=qNcUp(jyg?bBfRA2ftopn71%l;tlbkIbRp-_=-~+|x>`4GV?j!z`45sRc z6OPcLgsuLpsm}W#J#UHyfK{2+!TjoZ$DDWzLPD{qHBlg*fINu?Jy8^GlBf&eTqSTMi$686J6(s?yp&A@K zcq==TtE<5cEu&cKr>U?l7;_5mnQOp1CH(f!Xz=?VNZ3yF9Y#XIkuzWjjpibDSW~@2 zLr&!jRIw5u-YJ*GAXple5}YHDoeiI_Vw5A=Mit7DD!o6xp935u7GcMx%&vi=Z?-JYo&Fw2URtPInjkw!oouaG$G+vVFlfZ~Oq? z09@J6uAUr?HFd@~_7QpV_eM56vUakE{%Y!3yWY+CBCIe)JRa+8##%2Vu`}ObGBkWC zbq9nW0vk^_pN87&=#WG7^h|<8+eD2^A;+1-KK$d&sD^<7I5;s>+@VwwECDUq1E*jF zz{$a&(a_PL3=hQm*HbU|9fw{3Sy)$oZ*PAS|1ilfVl9D9R1TL- z2_AKr5LzM7|BfBS>YRIGyu1j3@66LvX?r^2S#2?)(1zI)6sJ3=qrYJCD8Pu$b&Y9E*o*#AMt+57n_TjexLIS}L>3%la z1INqbF^z%d2PyQR3X%j`dc4+GPBv@eM>c^3E%Cr?i9^H=&N010I)R6bu!+! z8AKDXfDaC~WxA{rbRU_3l1Mu%6i^9H2?ECAxd7JElOF z1pN3)1plkOo!8LQpT5oxit`2gWcE4%7<;b#ekw%wDusIAgjR7nDC+wPY@i<8{x%X| z>}5`|g-F_7B6SIJFHWRK4IG*s^PLA6jp5eZ?CL*5aW!#g&)^$ceZl1K)}TWF`eDCq zz*dUpee{1Ad&__-x2|g#MMXhHMM?xjN*a-nmXHo5r9tVE?ovcR1f)f}Bn71#l~B4x zHl=h+xoLRkW`oCb-_P@W-=Fh?so8BImZ}tte#S6KA}n%Ur0LDgP(RD5=wJZ z`iU#ClM zLib?GxxRe421>xo)p4K47zVLCXg?SItu%Z0`LV=$#S^=8m9J?f>AT;`swgW%`^?*4 z-0sWF=d%yF@ zf0ppO;U)$9oPY7>h-eTPNRuAnxOFQz_$HLn*^k8Q0S?(JgaDzE^8kcXz=`v?0SJO$ zowBrnz5Zmx--;>Cg@@-7Pc^9iVm~#xi?|Fz*!)q?C)u?gIhvc9={1zH4ZSFKcz+mLD=$dRd~ zmm}wO$h^X+ut!g$UIS5Q5XchQzMspv1t5ln#u@vZ^B}%5;`YSrW?)_U$wU`yC*@|v>0Bv^K#J^f0@?y*v4&kGC zh|wah8xs%$@bJ9P;59fowM-SJe;FHHTx2u<&I)Mt-GJCc2B5nIPtHI;(rUXa2$?_Y z>ZjjUzx(7WVadcvK@s#>&U#sV4IWx5?x>}WoZmkg)jldx>cKCqrB#&6tn*#$K`sCL zoxR;v_AYVJjh?;)?P|AAKu4Ap{j2{WiC;5GUWSo?l&^FK@{L&J+GHuH!#h4hXNC73 z@inNiY|kp7dyA0cH#3#oehTNX67|!y4SRG!ZPzpZ_pt1)c)xqs%E%=9=n+@Jo5I3- zfS0SP8qtRb(Ng=IMkUok{I_gr4NlGXyZujXar~N%P?IMRZTp{h4AXcVgrjU~obi)} z3(6fG@3n@&`HPg{(<9Kb4SlcJ-XU?Lz&>Nu5nn=ASxL8(6*Kb$7k_{rV*LfKULtD>n{0Ijbs_43uMp3CsXOsW84_KOb6rqU9CY!$ zFU32R0;;$lM@#qlsGl6>yZ_G&*5w*;$(}bf9u|w$sL~;!XH0}(S+h4_dfO9J=_q-60Mn79lRB6eleo1<_%fXtg=fiJNp|`TP zn`rvZ_ruKfVV!#9riNnp0=C%1s3P~uL1w3IJ|KXTXVPs<`B$ooH%u9#G_A!Cv zzHgH!vGTSy#sp*eNg9=N(MAtM)(NU&9GA~ySM#AX2cOZR=5|X_9UxDkLoYZOmzg0z z&lc-U!tEy)*R9L)`8kKIko!^szx9cG@7=zEx!xSM>#W=K)iDd#)3*Rr<{)E+GsElH zt>l{JhGti!TVrH%^BAP)N&NC6(!H&}XgptMa7GN@R37;7qpE2A7dxLNY6wktc2=$; z_UxawR*KHVD1~K=TA4Q3I9MI~^Ob}yqB;eJ{x4qS$HzlBuMzSu^6^;)Y39yZ-oGkm zt^xhO#3C;*ss=F(JPPYc?{>AOzPq!n6j!pRx{^6;q$F>3Z@dZOimkYBP*g$!Efcz4 z2FAeG=bb^=fWV&o%mU6G z!&R;#8UvoWv{pDubRm9iaRKE=fvW~InkvdlbtQ$DIXMY*>n48aj9-jYviO3h81-Ah zm25rnwCmFE-&S^oDL&Aif+npCWB;w?e`#-g*!jzOCwTtW_DWszWSzg!4ZhOS`CFy( zp`SZSJ@@(O?)|H>=O6Zcvy19Ao9^<*V=7Azvbiso^e#KQ%CPm)3(-rdAj2Ad1}dxr z^5gN|tIZ|`POS4AHk9mwweal!>Y+ETEGgzJC}a-|9O7GI>)T_LOeP-Ul2CHj7Zpqw zM;iK)&n2Gbs`tG~ z;<58|>$WpOt~;Kc=)YVRmdeV0*o^i-0b3G{4A`geYleecKw<-xwB}UR8Kc8A4f-5G zMtMC%4B&IAs7#b##*p3cPe(D4HMeQNUbG%ap6*)P#M0Zh6u%kSPB_Q6D0Gnkno1%3 zgZ=>e>lnGaySmm^SE=B7b=>_g!kEin1u9sAgC13G)LbSTJYldsf0J1@D%&cQIEPlU ztiuo8sQj+{Por`kO1%TUImwKG|4X(FRT!1UyArn@rty2dD83ma!s{r)8I1;@8~*P- zy0Qlm_U7oyjJX-h@9(i0oC{op&OL9b&00(I7nWFPrM5*~pJCnA!^Oh2?E3aCSu~L2 zG}?9p8UE_NAkYFfXZleSy4bur@$GfLr+@crf_;qwS*5rw`Gl(dZ6Vq=R`1_bbY}yh zMb0K-aF8GBo8jSR!xpDNdJT;L=qbotIj|bImjnh)_|j>k0PTD1?``UM^52bFV~YiI zBUIkvp283JJm7N)+uBkWjLd*JK*wzh-9&V^^xI_(u=(&VN4Lq{9L4^rgOrTmA#oQ`!@D!5eo>j$_y_Qb zOi^XBvVX3vNi^>2?IlA8{Qoo(sl7{FaUnG=P4a`JyLLrnXS3CFY$Z_0I}>&jr1rj zjRpIAZ#es)cw8flIL;%mgITbOXuqEY&V(PUuo1W4m3YuzG6Cff14D2}Z?C1LfFnQ| z?!{wYYU(&DtSBN)t9QBr-(9&W41IK);9QrH@sT_|B=-rJ4xJh_Ii%!YP6talJI8(& z*M>7}uzmlNH=BlrSywz%xtz;(fFNb*TZ+6|cpsUq!Zc|H7Z!Cwdr@AEfHe?$6ts|R z0TF_^ScujLebgoC1U?pUemnajR0CA=K^ytTdI2Sv53PcDzc@*6;PdAVAT*8JyFK^B zgZI1zYAMC5BeRVxQS_;{HhEVw5*Z4N&kS`sKXg50?uE(6f+Vff`_iE($pF+XK3}3Z zQs5G@BX^T;O;U#DeDu7$ZvFYrm;8-Ep#qz6UV|cxcy?N%^w${xReB1IZp0o=Cy_a& zi&#StT6qru8t9JEDPyFAblO9QOrhL!T;?LK@q4T3;Sx|j7Zp87f*v`dE3^Dg_afuT zINi4xa0shgP1+-wvcKi-zJ5jpX`&;}Il7KNmPPZ&1h9kSs&-QY2o=jsbpO|GM3~UR z;)CY)S6cDH<)@w}BG3AC(;TK57NU7arY0#Q88!qOxWq2kB0;49o7aas~+xca+~{>a>l}QbD}OusqyR27a+rbF(X(KC&m+{(0dmg8C2ZND~wGJ1T8Y0m0OFjautNe(16^ z2(eFNqs!7neuzp_Q#xAisbH9NhM&p021~q>uN=IvtV5wTWS6*P;r$5p zFeE!C!Fzw})m7Yk)V3r~&3%hBi%f6oxV9w(=jODy?f&+MO@2-b{1^WDst(f5<$-uY z9iY;7vAA18D0P~9Z!~e&2c;w6tWYrpFJ zBdx799ti$RW^D*XGq@P!1b#mCA8pdKA%19^CaH6OS+{+H5(5S^QNJ^QheEWVT{NC> zZk4tl%-NuMTP1@(l^kd!c)+xDU)h8`Z18Tg&_v+6(7ZbIGu3JIQ0-8L2$+6Sp5`Or1-U!MW7uD5xd`fuMR5LT)| z9Sk}blTT=~j{o}M-{%sDKkxbkMwQn+0|Y z=|!mI57F(8nS^9V*XvQ^e1ksMppg7C)u+b&2mDH zsyNaN_CmX^y0nzZk%7pm{!Z{@E5-aYT)urOmA~+j+d>j%dJ1LI?qMS;YSTKuQBaGX znVb7mH6JX9iEjDwx>!{q+_(-lNAA2Ax*jk);`V}C2&FM*f~^Nq=k?xIBW-<@T0rM} z>hYWoU$EVn^~N%gr;J?t1Z5Y>WlRV3?cz9VKf^@n2H$U=`ix5Tb|S9aagDFODp;+m zsv1+VG(hfoO89^<)%6RS{!dl)1L|`hluQmtkrfUjS18r5(JNBaTj_LpGO;uiCKvrKh~32${&2iPVA!E zb%Dol^jmX{Dk>$(E>%-+*57u_= z`gVtcw~*WHi!&T2o}1|!o5%~gpMAD{&{9abOj=d+yF4UBPxP6mz5N!VsJVZ@LSw)l zIn=hhO$Q=UdwVrT+y`P}qOPvh;~HWk&R)z9dbrqCAI7cLXfV(x1(SV=7J zQ^uK+{B&q2PJB|t(j7k{f^gaq%l?zqxwT1}h@G!u@2^Le8|0rLr}*#?DoMFGQ}J!Q zOAZAOY2}|kP>Yt2;cRT4V?sKX?hBmy?2hV<@e0`piho@iGpr^lyph00L+t}Mn>af$ zzJ1kfu)M5SXxl>Meh#^rG?9HWUV_`UlkDeALN*a1@glV+b7k`xt4|8K zULb<*oia&k!TgIke$-`(I~Ol8a60E(=;;;a{laQ%V|gzcuolJ1wo>pVn8g;+?MaUL zQ{W)@OSp*#2M!569yj0aO7osyKra1!$JYNkJltKM?lL?hyIJtn$bye383oe8rTOW-*?x-(m1J9zspsCDMV6 zJ3nyvIWI5V$(YyKb_TDdr!^Blo$qa2NJs)P2?^b0HWe)qb$!c}>} zDH9JzE|Jgu3f6aVj}HQ_@cAyeWGjQ3HN!*6#mk=0>R80Kqme+yXsAWw?44d4`EsW; z7)73YJo*E88Y3R=F+Zm-;^x;xvWo4Ps(Vh2*Z1(ymv84%+r!L~i_>ei6n5RBkJk1~9rH$d{oEB-7!v1vivNMi z@r9spXb;)ess!&0GB2-PyL^oUDW3SxvbdPVui2oF8(dE%xbyf_R#w;dLUQH>qJBU9 z&juC>WM+!b)!`-#kBz14+(a?Q_%0QS^Tnv~1*pH0k+%vrXi>~$l##itdA@4#?U;ye z>2tx*(HNz_etXojDeO&o!glDF5zjzjim+w_$bf&sEOh@f3q?lo254!;U3eYs?H|r* znfiIimhR*^ewkgv!d0-brS$FR%`Kl};r{c(g*lAT4GPrM*6e(y<}EX7JOZ#AHz?_x z!>|SNLo_c+53#9*l2b^E*{*VYs_K{jvj9)Ki>EtIKd$E9T__>EX+!$z&$lWITZM~B z2L*8=k>76K98h~gmU{R=h*XVm&5PLyk&Uy#!B4En51QwHO%s)!|M)v9wv{pZYH%1q zW6JN}{X#->_}Ii6gDDj=8?Z@^E$mB3<@)&;uO5IybvH z`Ixx1_58gavc~?F(8lFbeV5UcbLUj)>Dvm3kLTvf@k@O1{b+Sg*P3bYfNCdF`!&70 z28ymE?xg5zJUrNwt+sS5^1oMCmAKxLkJFv2D~P5J8?$a)s}rAzGI*GLFOzY8;T?+> z&v$P-x6@~VBQU|;S4=hX5c5WdEer%D>G1F`^Wk|RlE6T22ZuweD(wZ%tXREiapofLAyAmY#xG@zwDakX@GhMy}wmC%y znRW7bOAF<%YTl9W-@i6BRhIK;#okb3Ym4olm^OZ7Z2V((wl1_JUlHq6Zi>TqXX@44 zI9CXJlF2ivxCTdx7eqJ<4E%BjykP>);x6dT1!8~W?4A7QH`DmnA}e*D%q*L${SiDTJDG#J7I68*<@{9<^qV+qrJuhi%x`XOyQ^;Rd^IFjGrY zyV9QFi5z|O7q!9C#BZ%J%Tj5vy!Vxq-d9urV)x|dmFe0TrKOqn!LmH7>_=cN{(|Wp z<&9c_M4*X7wr#T}jM&k;8Ds0dYbh411e1c|`l=)LCF-z~fn@wIG;V8ZCF=`O(f*?3 z)(cj@U(h2g+ghW-!$SX}^VPwR5;(W5%^(N;+1Rdc5S&;L(k(sZ;t30R_sr>~H@A#v zG*o@}ehijgq-3rwAuUe&>j$-55d*7|uDRO$4GWiPrQ{^O%aW~(1*?`3P~lPITxYhN z+E{+nkA&%gJ2RD)O`Z~qhC0XA2jZCG6MlK~W{(f&1`kh9t3|`oxA?`kWw3uwxuCYt zF03e04k_QgG{Kj*jO4-?DZi0138s8HI7l!$f)NEq?Qh%KK5uNWewqp&6>YSz=$m=B z)h*u_O1Zlva;mCAnnsF1R9c$3Us@eOVG1>0Z-G$_qg?DY^gI)A7@M2dxo?X;pPZWF zt}IH|*d#-pD%!)Tq0RcO(YJ10``BDRQSW!!vytuLLg&gq?>vLQIjX(rLv&(Z-k0Ie zWmiQ*O~NIgOrO(cj*5PLV{wR=Hu{FzRp6Z8Iv7_9SdW(GK)*~=%NX~$8Rb-P>Ug>!6H}Q@nfXxpNEQR7gl_AinT5cgi3TS))n68= zVrvdet_0vvJww&u0OKaQ)kFg+rj9Ds#L=Q$f|CA@{j~;A11LH-*lt^cgiInt{973h&ZHf)VGyS1+KhS&Pw-FoLptIxf?XKFdl_9gP4 zK8$gQU(@cdujgL#XLil=_ZLpf ze_v8kZ8vl6xfv0NtKyB;8m9!%WASoa`;^Q7U*WA*!F7wSHLg6|h5z-7-Q9JapNghu z`Aw#R5g)8!zV;ZU%Fu{$7qy>1V~m5-CN_F{cEKh~`G!8+8DnZ> zlr%0b7|LMmAG46%?*8Wp>xvGcR;2$@XHHvUVq7YmJo@v)_xASH@y1u1t6Hyrj!(qt z;?HO${P}5bKBFx=*W7Gk;)`xLPm$MHH8H_Fd4oYMQ-j59vc+V5F;1h%)ITVw4Y}aS z$RZ!n*pQm;NwL`(>~xaJy1;#-40rLskKqTY7SFAGeJKMM5^y7>yz8Z~ELoRBJ zb04eSJtr@b@$euz$nP`;d(<5~YwdqMtKuvB>6w`>5@(TGe669*M-9`qIA&ShWQ}j@ zB*UmHgp^+f1{&k?@|uLg9Rz;8WaX*z1MdY`UP7GUQ*dHPh$e5PX;Ef$ut zher?m77{}SdO#os7xt00&KdX@i4UbqJjE}pYeoM2XFc1=Mu!whX66|9#e~YdVO(qo zqjg?fY{MnjK6`rUVYi#OAJV)(Un(u1_2&Ke&h2L37*nhxe0*kLg6o`@PAKM{^tlL; zcGwKplbi9}oIwcqrOZmZE!oTo`FFl`wM!A zGauw2&S+G7KbM8&AcJ%AuP+ytpU>K*ebgR%GiHTIX9SYy9wwXE$5Ka`XN`S-Ui zT)ich;A$!R3QL}KLj4{QoVP^fo>bf8w&dto@R65CEZ2K&3l43plkZe-=nqPf#y0w` z{x~y9cE=SK;0C2XI*)M@_eGv{0MGSOh5Od=Y0f`Ff6BeqB_JiGkH(VE;n&oI6cNLd z%K9LG)1|6T896s{_pu-))3h=!#RA2Xn>X)gC=o#R7sX6E-ZkAg!N!tT0#jC}m|OOl z$Xu`VRD3XUW216^x^rSm?f$kyQ&TAB@ye|tOjKDn!--zmXCocgLaur%x*C^$45pP| z`M!tBo$lpl(xs5JT1&IJl?YpZ+9 zl(#o1U!Ovej4p$6*4E}`bH5j1|J-GYI=+hZFj_UlMHrj6d?+Y@L!#Cl8JdfGYv zFLAv7g%DmY@HB&!3)D4TlLKVA$&>cAC&V+abF{hhR#^=AYF;N8Ja9@Nasr9PG!rcy zo&VKqHdI1+QQ90;4&}$eE2D$#L?M>lIt^IpCqCJuO~^4fZOY7&nww|TUt#^b6utMM zxOi?}I&^zo@$A{P+1dOaWk%*8xMY_DyV1w%`0+~UqHl~`zE3~FWm%V@Q5oQ>637Wz z)r5^2WCX$FI^Psrzdwf&)`>qJewnVlOsHk==-6;Lf5)r(FJHdgQ6XnzvoaHMqDtGP zcMUOv-P6+p`D!Ph4lzulyK7je%}X-=tZD&`Yq-wNw8p&L&IxG~P6!Dp?7qIf)ujhA zLZ>c~lfTU!o$qG}qqAP!I&oh+p2sx&{I2W#gC8x?-Rz9R^(9fLdX~~$I0$L$`kKY$ z0hf$hI65Fx^*e z6lzQ!VKh|pGzpu_U$R4Q=_@GgrSbdXK8ASR5j;+ds>FMg0drMtZ3!=VOq<0!1|S8j zbxloe=q>Mqw^<@Y{Vu1aBBsl$>cqLZ=l;P22MOh%6FNR0zCXqeznZsipFiKj$H!m) zYbe9R=NE*)=g;wR7rY&*v>nJCi%X{VmqecHHtNc`N=diR&ISqC=#!9w2d=qg_1mQ6 zs6GuaiAxm=HG27Sr{(*1KN;^Uod+Y4?L4(>eN9>o-swV-_-eV{Xo{BB-5#z*2FB2v z&=!Xt3S(>2pv?SA#Ssfmx%!MA*~=_y^$s5*ZP6O*wh zYdSFkQw$+1RjsG5eNeNY)Ng2#r(Mx9k^+Iy)LQJa_HJjB|V5+DCKUy!s%erqf& zf!qhZ$uTIijDj;@<(cSSy!cZ`C!xw=VZ{f>$T|g&FpBW;kQ6G-w5iT_!Y)cwd2A?c z8|XL1F5>!;wOX?GT~2SmnuKElXJ%SaTzHo za0>>_gKziH-^3X}VJfKcCi{B)^4W!Bl(RH<50gxcD$@H!h2x=BscEFMv-AjXe1Z)T zplTZxo5vV0{4Nk_44;dLid}yB6J;H7n8$c624+B)IqD`Fwp)h@fAkkk;>N=_S{2RI ziY?J*(qMHCfJ%9E2sf~h`qpdExuB_eHQ=xgKD*(If7d8+J2Wl| z7y9lCVOSK1WWSuvL%e6!7(W4+x2uMm^J^E~^n9^x*T592<(`cM+ zi>m|UtB_|89=y(d@F5W^+wjBjqr!Ts=`=yxXo8PP`{I!28=l^vwuo2nV>IjnYQhQd zQ)UNM^9PFEZ~y2QN5=!8zJ0uqUKDTn=NY1cf{tTiR=s@bheYm><-DoKW_<9&W!vH5 zgYRNl^)JpGe6MmeUw`p?Rz%-ArqL8(Mx_(oyBMyq2q|vIWLWi%jz)(CzpkGNZlDbW z&}&qXPCV%)Ly*By&hPQfTe)Ckfwe?Zc8Ep$c7P{=3N_2G6B<97yKE}Q71YPMyVD13 zX|EfMYFs#acJ@MFjSTUa{`NQBr4(?ayC?JWKi~+^@#+B|5fUQS5PeaceH`54b1li}v(M&z0* zTWLkG&lrlJ)RqcB+~nlEPWX`ax<7c?)uBsUj8jgc)ZBPmACKvL%9#kG6@gb22at%KSX-s_^;g-+el1oe`y&0IpbtnMQx)p{mnhj_PFU zhnaZrWTJTr@m;2)uP?xFDM}MHAs#Vyl-=Yf?4?bdU8*IEYY8TkHF%*KT}N9a5`DcG zQ6Am#RIPboVUvB)|K-m7@>uf~z}>c^pNpD5`rq^HMGPgZT8_a~M4m%$Pq>I_Ck&vJ zckK&#UYA9N^H0V-wL&#`ZpQ;S?;$|Xx*NAK*AGmPK1%eF+22Y!SrFOXb)GK5hSNlR zRm5`C1jF2$>09;Vk%az7td{{Cv$p1~C-s^Ipf9HIv1&!Ax%l>7CzlPKlEb=G;%IgJ zfJiK3ytupzB|P$ubTAn3NFZuuEe#QrN5gEVopzX;zVY#J>YwlXNx?_tT#cPXc_p1@ z=L({j-DSOzenx_3-^i@75_yPnfBq9I-1(BbSn=M(6t#4*129{rSqvfe9D*`_x8?Dx z!l_7bBiWckCEjR(~6g-*0LB z)*ib%ICdVDU3w$!=87M#E}ybJT}_}8njY5mE+v50h`(o6>67_k44BsH}WNdg-=jHBQNksONV}PTYh% zD~IEofJV7de?B)SCmxu(3>O&T_0f>xi=^ejMN}A)qC!gf`D_5mecCVfeYZxv7^5r1 zYWku%3YBi{?U@~p2(&!l6qXH^aR0$#i1IFPsltHj0>dMy!z9AP>mW>nPyTx&6_fUo z5pDhMg}3r0Q`Il-mrO^N_IqLEaoZZ^+q;HK!4*$83*8q7hu^-9?M@fux~1q~kN<)5 z5O%9^yHG;0NU~pqVmz2u(`m{pc#kF&Wr|Fs!e#Ps)KY-S13b@7oyRZKXsl9oMO)3xcjC=P89HNS7O8$btBi@Yu@Zlmc&YZ}D?+tW{=9$u|3Oz~|7L&J%#0R8SJhaU@)O za`N(hpFi8}Zk22zQuI2RtP2aryCnPGZ8L3u$X_|Wn{+Knz0wJpDyb4cP~iCQZm(jgX;R{nrZ>)@}FQI?&8Dqipc?0 zG^<0-GCJ9(5SpE5yewb&{5urP?1QPH*^jKv^nuT!+3bA3hp!zT*4-|gOH#hUdQ3*Ikshci#) zkMM>><&)%}lGJ)hP_$}Ya?Lzgz~n_Py_QD#XQ(4K5)NI%p@8`41viTb*G#9TQe8aVQHm68m82TenEFOM@m9Hq>4%bln5j`i-@s7OG#6&NTzQ)GJ^iTU2 zxD00K5<0Xwg^xbQ!NKv*$FQDce%Fa4Kj4F zz_ZhEEjCw6Q&4;T`i5K_LQ)W7<%goU2g(s*1Co+ISEnkh5O^1U+-+lZFL#Hi-B^AZ zfCwlL&!5j?ss1h{2sX+u>D3RiXRj+svyeMqV9z)2ze*Bw=FyiczxoUO;{vcxoXRc8 zXEQRO!g=QVIJw|~dXT*AP>suPh0yFi9nYeIf_sAu^z!yK`+E!y7KVge>>P$mf=>7HI9fhdRBW5+PKb%7t0;f*;3m5C>$s=;e`I~VXwu5H zaV;5&I}j3|)v}4)P`WB#Z;!s<4q=Mh@0XGiSXE^&)8b$`Tf?)Uhg)_t43(ni#)Mza z&C8qm`Qf!Nb5#8o-_Ew1kJkD{EJFi39N=8pT*cxvcM1+FF4i`xfAQjBshkvnZsQr` z!gfJ+HXegmoPWRo-6H-v{exHDaHhh7d6lv4_Jhpn?y|3R> zbleuWJ@_PY_{Z_}8CCPh@cQ`OoU&y&X{Zgz)v)gxOq{ew)N%+5ULhtvbt;$Ff$Be`x^`wOB;Gp3WoN^48s1y|+E&di0_q9=m`t|JHc+Qgen{S4+yS=239Tc>Ms5==L z@bRZiyw5&yw>Y@#?dTMJn#b>oG>60EWiaj|+!+74$jJEKUQ+k*ublMq)JMesgBA8h zvCp45<)R--yGneRHny;Md&iZX@B-wNs&)jA9#Ps*sJuMe)ZUJVdSsf%1|PjsrVclg zmkL5;MfYLywJJb4QQ5>mnf2JOwKY2?Mwz}m&zL-Zzyxb7%xR|Q=D^A=I~!DTIZ92f zt+I`#-yK;fD28pyT0p+>?d!^f?Pj2oiuU`WIEmyUr{#G#W}yA|Q9azH-JK(ZniXyL z-_+Ge31kycTlu62W0OXEt9uhu;s6E_b?uCqbH>|Z!uGSjuYX4%+?p;A1PglnN{f1Hg`X+Qz_9xL zJL#;t05o9FD)DB;K&4I{Qt+=x27c&}9b)r>_Jh%)$2OwrbDiiXZ5;f!idHj2#TMJI z-sz)asl;k`cP>?d^HGT8({OEz8yM&bx7}KsGT-eu%(+wB0ZnTNB(f%!<7PLOH=DDE zywvaX{_N~pky%ujy;bh$=*s9jjWa#f<&m`V#n8Tv{Js0JfAb_Kt*?W}_QKs_<_n&5 z6g>8zTk;WhSU@bJk<$z-h;yWX`DC5-_#tsQD6fvMrWdHvc6jA`FyBO1|%gZ8ul+s*#uR>oa(H8D2#>K0QxO z`>UYv>b}f^Q6FF=|3<&aID}-u z+@vw0*6x>7E~~e&zshFX?ghs?ttNU%PoU2=W(8;B=(svfPP_ zkIw}LY3ui6@YRiY`2t&oeqwU+t)XF4X=&WJFbxg%C91=UfPjyGM1O{Oy7#`(%4!NK zI^&w!R5#dKqR)abB&(;c&Prji_G8ng`%z5lw$Z>1d%U+hIj@6#ph4m{i}u8(&!I@L zhe9_-s_tp?K*Lj>u>(&1t_>^mPZHFl3g!2b9PNa)-E#h&Yg$JX2m*W!{KLY=px^-c z%*m6qSlSd>-Q;`{jje%K>D%B0za#yE>)9AL7dn2_AX1nSh+NOrR+GpV7?86j?q@V^ zZha0fIgC|_{LrTd*c?WCpnf*j6)7oe(u3##djCXzV8f0b)Am-mLZS&XZ-ao6J$vzS0~HDqta0(#p1rG z4|K7IhrdOz)Y>2HBrmuHcaQ1600h*unn<|9emn55E)-XH{gY8n|B zkdah)BV+l9g$JO4ePzWZpgVqg`ktAYEfyAjGZs@Wbr66LnN8tz#pIql!_q9WAvs0p zM9D6a-<8w)FNV?f+8-voF}fW9&xenzp|z$ zjbRoze~9ze#-un#aZM#9R?lOKU1ZiHz}wB-J51Qd1XZ!hoo{JphTHxV$xMzS8ER%h zOxQV{@NPx&GpoxQILyjS;@-V`Ge-t=E%ddK*b`(n;I?x_<0xDvC#T7v4yvmgQi_TT zFca6zF6La_*~BE_tQ6mF41e&XvJx++Bra!OT$myzyC=p4H&YX z78$r?T~Sl|>dcG|qvmb1Psde5$+55^HZ)To6c^)V3I-6i$Fnz@c3$W5cmk@5!F9R+ zKs{=uu(!mR^&#IA%17sWW}gm{u}P1f=$)M#FsfQF7NeXxTg!t)tb@$|gT0Z_&#^D< z4<-uAHq}85eA~zl74LE>waf@`Z{0621B6<-8ALe(c^>hxsP z(XHDvCWOo<4`Ue7;2XZGU?Z9W4}qcSUzU#lT~02&S}Z=*UWQ^hF;I88xp!FnPbr-D zv#u&@I2=%QI9#`73&HQ9fq{Spf(rQj+atGa4WpnIN=kYHt4ZU`)PHDuLe*TI80BOJ zWhwWdZ7W@_2pl@)CB8E)VOc9)ZjNmI@FDt6`apqE*mFxixWG=Ar}>}IsW+8;9*WA8 z*$*Fh>jDdoKPCIGy7hE9DJiLx59w7UP0KkZ4V6qK0vehZis=sdpY5=j>5#=1X8d7vHukRdU#>5+bgd4vEN-NMp$j6_J798=(6xJR-qte-B!#6@s6_dOG7oV+8 z;l2{Te>0T0(bA9drZpGo!*|v&d{m|S@M#0JYlfO@Xz1tPzkg2~D7*@W`ZnY>I_7rU z|M*wP#gv;FF0G6>cC^6bM}fIuV6gp^`UbL`u`j^}ypKoZdOABnW|oU@C_F<@_FrD$Vq=5L!@zjy+ATcP;5Z$yBnc0|WeCS-xJO}dU;E<6zIdO2i|dwD zqRr3Z)3_&RQ%+ZGe^t(5kB?x z=$n26;nP3)YPC>3B<|D|6z3g=p`L(4ER1#_h{WhR&@W@5{8XsyG$m-LDkfDy?Q~&! z;TmI{pCl;h0kBoXzOiPPE@Im=;B#ZQQ@s$*2+@exzdx+X+ z?#?1$**sG8e_-W2@Zg@&AqjuJf!YmKM>`qknV{?F!{BzxApQ=g8G7&1M`kpWfuRfSxu&Ls0a$n;7lqq=DkwSxC? zvz%OO3Y-hDEZ8|GzxS&}hS$N=Oxps~LvzD3aBA>i2x7U&mbmRE$UFOykcA${>})dUjOH8Inw!(W%_fyb?KGcC_;WJhKvW7j z836{^AsJUvt z8_rjh=-S`!SyWPD=mV6~k4esyD*gn|>(=-Vv*;5fW%taPihB2yHY>>wB^KKqBcA7A z^7k+fkFuA>3r9llr(&7mBc&H>8}C4|ZSfDyrgo#y*WiA@3v5GaH-%W-7-}1XkLH7m)@kkq^h?dA8)SlfM{WE`$@qn z&Qp4>#|_;aQ(yzpgA$%%-toNC7FPA+5jycg!T$fQ^aJ-vPX{(b(Qcebj#m&DnEf)y)bWj4gxxN0*Uq||b>+22$hkZ>c zW}y+ZCn2v9*SskAcp=Z!Uj^!OwF1Kq=_RCxFGFLTgr-kX0>B4BGzahjOUCD#=a-=!dk>JgS8iQ09mhPpsqUuoqu@-(I|{DsYl?2#jfuA9g4AKeLGLHVRQ^=h7K- z6&9(Dc=2Mj&^Nrcx7VLj0{<&}SJ!!T5N2ICbC5k-7#UIcUr+{7-eoh~{$?DOoxBJJ zLTg$kCVuHXD-^ORV&9*6l423V%nEQUC29eIm;Bi@ix?5HAd{dL8{0}uN*Gm?cK8+S zsfoe@UcNl-?p_4}^?~G~=qUYcp>MWuTsnh1q3;4MHMj>ngISdaaM58>^YK69{v&0_ zzVx8mX{b(A$mP-F$E|Pk@0ky7@bdF(;ox-to*OYlD5^Ps`sQ$bren0efL1nNz3^+G z*^`0WZcYpq9Tz--PS>XU@&}TVN9pE{7ag@4kY66BoPBuSBXN_fSB;m(Z zbpz76QUT-X^l?Jjr;Bm?6L~o)ewKW(svl?b)T6APySeWxg6DZIY&uEF#p#Bb&WhOjtM)4UXDf) zRn?1Tk>rf3PZBW)*J%&?0w&LQoGN?9xvS)8>aos#VqbLVo$wTzU<9Q_l)e}*L{N8$ z;U)|~7eRZ8fw4gR{@OV!v~V-UL)|3ZD1EUeBUjFI=^8Z`m%`Q!2olv}j z@PkvXu;xG#Pc)mCOriiH&ct8SrgOI+v2Qmzj*KZBq6`;cT|H-VX26tMZ}^G+=u1tw zLPh%g>7^@tlpf>>>*W09EhE#GJ>Lu$2RE00!DXwx*jr}CcWRUAk)sP4sS zqjK)PV+WgN+_Zh7*%z)o`u57>&a1}6iq3ZgJ@1_9nNyhYNqnI5&vvT%5@E?Iz>kf` z|Hd}*Q@cFLYY#zU}_ix)xvs`H# zUD$1#Y$Yq~{Qmlpk&&9hC2%{`{jT_)=fqLyyuHBf%vRUbdILMO1g(!XGwAD$_@RgY{@nrsunlc%-DJ78Z*?5+6E8pJehA>3ADCf_#+? zmri`;JOn-D-T+`5KA+yWf#b8#+slJ;h)eve+;gy|Kg2Ra?c3JP20L@d$q`TP5y{9R{|m-}De+!~}b zeVRgr|3`D7_9Qjc3dHRI*IiCkhSt%i1XSI)O9S&ykkBxY7}wai&B*kn;5bVa`^0o7 zMsb)njmF*ZreILOzNHC63syN4*ien67(@+&OXn-_ceoCNNJuh2j9o=#@@W}A)hRJC zxCwqPh!p3tS@8H@Ff6UZLB1>_)g-`1`~t*0Z-5pu#4YrVND6yVM0-fFxBa2mq3V>C z^^9-6OiDUC$qCm`f0Rh1nKC=vh^$WweV;vh_5@`LjLM#o&wMOm+3JfS#{)Q+M;(RW z(#o(tDr>6~C%KZVq!gPjGR_CsV&VNi5Ql_BhCZ|!df<#+DCsXjba#bHUx|!#fQ!(@9Puw~vM-gb?W*bd!B$ z;wAdjy|EkNQk6;PyO4UW3)5b_EZlfU4Am?8@`?w}pB|`~r}lU2i^}oi;(UV1_XqOR zd;BUYR>9#Aq{9yyP;?CCGeEUiWSmL#ZB_rneCKB# zGT*EBtxME4LD00e^5~IcOZ2U=V5NvaD zaO|}{_P8q;&s~7(ChO?<2q}xZkZ95Lyyn|q|4`_Jiq_@$qx=Q_r3SpE3S2|Yp?R-w{)H5{O}tG9EW>j zU;djFJ96DzPA(9Lg(VaGHVmx?J>37yl&VZ$&S#Z~<+opC$v=PEG96g`BB{SZbA5{t zfZzP}?bBG>2G167$NOJ=*c*nB8UE{VIUAk+4awZ1{Wq*nnfDd^Sz2;5 z!c#WD6Q689((yc11$kUc6k=nqR}A(-+co<2dNK!+LcU(*&Zj6Yo{|0Vb9l$V?$W3- z;Cg7$BXLAZ-L4k_SLuZB^-)ZL$dgjw%Y8R#`3=aVqiULp=^vTT0e}v8q_K zM=%rA#2yq71faPr&`$Gfc`@SjC@sy%!9kn?jQ{U?NpXR+yNvR-4QA>CpxIzz;V(l`H;~3j*{{H00A@acDaycF-h=Wq)B#-g4eO)LdH!+yBB_no+IE$83l}>Fy|qxh z%ifwTp87v&0H}Ub3Gnj5_T+J%X5be93-affBzb#hwr!(jz{%I~C3$X~t=Huhz_4xl$( zq$nzSiLcet=K1X=5|;4h!F9$DJ#L_Ta!L%%kCv-iS6oWYSUGg@IP||E4D5`>+(Lsh@It{72PGU$8J!bpZ7GO zt<>)ug5e%J_QyDZGG#DFTloGZ4DXUeRj1T6`WGI#uaa7sci22?ew9s8U3ZboK4rIb z{f4&wKTP5bXruw@^4gPyT~GqTpSp6s+BVRP zL>X()w^33mKX?=!Ek5b)RP+6NNJNB-gM%wT6E(*Iz-YO7NDpWT(()C(>11E|bQzRr zkA}6zmf3>Rxq@~A%rpGntVO$k<0d_umh!NEUg3!B;C-|BT|%scL*dG5kuu)Lp`qaF zfN@}Daxe+~{|wJMhW7RRf&OEZ0%GgecqVlgI7oBhU-%6qFO zfA;`;!oiW|*Zf*gup5jply6!b*Z}5gwn+BR#8Fn@hK(4SKJ@}dfF$DWUZmm8zafO6 z1P^q=#__N}7c3opSqEqeM^8I8>+>lZMeGrpuIj22*hEwePW0M76iuN-$bfhfnjnctu7sx~hk%y3gCjvxvtM*H*2C=zFhKBo0f=N^%5@5U zTokZYm)S;AwEV^D{=&OKs6&}_K8blJXIdG{BJdiAA@)st1(yPvx%%q7+GWfd*124vI+Ts!TG@f zxWYK({=J+9oUn@^AmIWZcO81ICn{;;RFZ+?&0kk1{0k|IfMzgAwhr6ok9wH>4?P*% zMuw4DE5^UZP<7&&NZz`CGn9XKyx7QJ44~S8Ehap|2C9q=DN2G#+UQaN!MvKMWxC zfZ%(@0=fT8OLGGT6HoO;f%cQX7ik(=9bo^VS%a>qMLGt`GELS07emC$XnP|1(*+L` zyaNQ{{T^Nw3u-C*5{F$SSR`|-zCMQ@FeG5Hy+Oz+anVauJBcDCMHEb(Us9@rr7Q_<;c_P$2lr*WCiZiNx5y`ATb`3hz#)HReg{4LyFt$`V_kLyV2Azx=KsZIOQ0=nG&Mh7n<&Bus5XGhk@fl? z`4$%WiHViG2K|OJkPr#W(@s%ovl{omTh_`ucgcEFk#W2At<3(GZSwy#Px*NNdt|t$ z3rTIW*Ww0uD+2*8kZ3|I0DaNxDh)tGor-Tgux)BfOmN)O`7f$lu^&`|>&+(tm@&A< zSW8#88+7pB1KcMFhh__iPG3#Dmo!BXio3Y1WGeFRZhqH)i_}*!4|7P*WbjqJoA_?k z0`x*diEKFl>pAceG9l|kX6;#CU}SjlVtQ_Zl4%Y}e1jytMK;y0Ix5$3MnSYMT-kkR z6zP_ZPyn$EFlcF*@0$IG9n$jgg3{LYkJ1J+m+?j@fcoyg1Xs9z;eEc5F@3A?*E*@7 z$0H`Yzl;;&THYt^#Tn&KhXw||m_7c>frBJrukn&vHKEG-!fa?KZ zxd34vFxUjfc=!fpcq8(uZ3vOc`>)=;!^!9fk64c7;XlHAPWb) z%*n|kAX=9D#KXlVIH#xAVb!BO(WJpjIXF?n?Uu(|B)DP)(9wjaHd<;!igmq!ECQ==Tr_`Lj zrJ|blo#@G~i65%mN`rM(TH?_k=| zmCxiS>!=sz4W$BPZvgh}Cw)a*4+y+nQp)9Itzgp{A9dkV-`X337E1@W1O{kFzI+)C z+J-NR-ViPOUFO7JK3pj%WQHI!@An`<%lvaGhA>+!-t(xIY)i2dZU;uS#KlQOMX#%? z({HrLAvtCtEOptG-`71WF3#b0AOl5Hz9xU;G&&c}Z^sfeqrdBrMxC47@(* zfUS$JUx3NBVD#YEPoaDyqa)$}^b$L`FL@s`K*#|M3qOp$7)|KDE&JbKvr0UoeW9?W zrJG!^rel~~xah>OQT&N9PQ?F}*D}we0#ilsm)h}ie4~;T4?|C@uApeSODGyLaEkiZ zeVum6%U80<>286jm7uDg0R@8|R}H}yRY3nWHu}#rg34R_cRZqsidgDqpe+dU;r~%p z0K5|3I=b~g6t;Mr?N;L3nIL_}Q#_XW{JZ&Lu-$-;ZX+G;Qop%H-4NyqX7A9_hcozf%mC+S5I4ra+ymCevqxPd>Ny$jGPLbS9E}b%-Zhc;Jf+KKP@g$@N{&9n=hqFqdzDS z@973Tb}-g(*5Cnf5#;f8xMy{9b5y_Sk~qth;I{AH%}xYFX#OLP5FmU>tOIRbU>ki1 zkT<8^0s#K&%jsum*Z_ttJzTP08HfqkFPn7;HFj=~h45#~!2on7ISAT_4i5Mh6F*!L zYf;O_plooZ0%X>JfJ#6NC*$s#kA{m50_l&;uw3_07BEf-EJ}#1#D)7m80#+KaO5$< z_Fcq*Oxab*RLqa zDMmxY|A&4Dcl{5{y@Tx9-B&?k+*crUO@_0mbB(yd<`|I%yuZl!au5)xDbHHFUH~&B zsZfXafS-)C6Ufmgkk}b96O;~f3cxAlSE+RC&lL1%l0Y^Ws7s{NU|A|wl0=>?TRpSpg-8Cx?qKciYj`^ef56nAFt z6t4RlW9kmE{5k2Shi%(gr{@?)J+<6Ygz}l*M9%Ajl`KKjeb`iBJU~AHCx+$t_7yO* z8(DjNrViLAXJ&$cxx>T5Lr1rGP-|y9xso|`wsmlmZfI>dr1G|Xj#NkZ1Nt-46Sp7Y zwd_Z~dh_$Yenlz6fLw0}^8p@-E?3}slHb6*8xomGG_X<@my~P;B@npM_*uhm339fu zGp7Mv$7g}B&RkGS-6!)N_S&gGKTVYFPO)NR+ht18B|SaL&d#>ZfIKb$p-QuE<<8YY zC;TL!&y%W#=Nnak8vulbuVE*Jg@wu6#rX$vd~x9AMeN>O9B5~fJM?kPZ_8%RAaI8I z)%3D{^f280n4+sID~oMO06~k4{2(s*X2-)7{{Av<_gHMJp@Bx(>SmFOs%mdf1(p5vnh!uy|}w5}W|OWDj3HrdYy4(#2=% zna^#=;QU4%UioVrWOYdyIR+DXjozI~&LKjj-uOZ;O79sT)*_l$o5+&D#wF|iPUnO- z{nw6kl?B4KhPLr7jApM}q^+f0>{#u-b>k2PLnXTMd%koum%n~a+0FO3uTjTCC)Ccv z*X*q>DFTzG!KNCk_vb51NG7`zPC~HW8tkGZf8dlbQpd3{&x@1dt{e8yYW~sQS9jV5 z%U{S(K3Wst=FbHDYzX9!prttvwN>|y%H(|OV}l}GJNN!%U2RX(6(yX|!pC1oAlWkT z;)rtd+ZUf+I(8|HFKg7~Ya6?d#y|CC_oZ2Z_rdkh<@w2hw3W7p7k_}ogLCr=Jt)qR}`3a4i1lCuY2x`Dha#z1Fh~kfeUVQCZ{~6^qg;3m*XUL z;wG)^eXcTUZk);h@2|qg(!QvMBq+BbNt~&&nyovZg-MYvHt7SuMB4}USn39vZ3|zw zwikR#no8s*uUQ-3MQQP~T|EC=-8l2%58w_a2;^R@=GaN*b=gI41qOn*WWMbM_jqv7 z?5+z%=Iz=)W={R{`9y69o>@M=Azf|tnd>+yeo z%t@52pry19sB=aw1(fTqE+k2$ke*1+0f7d0OJpjmV4E4w$7kpQo?@`-^)u1rR(snh zi>K)Znnt5;7+?_$o_=foO?UB8jSsK8o=3|b4(`#T65r3;ro+kqa;FuaJ8?Dkc5A`( z144Nh@)8_K588N;j4W~W9UCNq?N!*TaQun4vX|htp-B|JS*P-Pq{7Z8C<9j3M|1tc ziAlWB^(xeBH-vtXyuUdYaK9UXyby>KDy+otDEA4l`+JrPq7Karv!-R&_EGSR6WaCEE*7pKYY1Kz97Hda&pMPc;9&}} z)zWYA=VxOKlF^J6vg3GQLlo!=37p4AY;Rn?tB6R#PR^?QJimd!hZ^Q${QJh5C{!^i zhOja7E+y9SejG^B8|q2;-OEqUDrzbvn6Ji}mOaCm6cr~s%0(p~$-wmoPDB=S^T20r zLm2Y2eFUw2X6%WgO%`u0A#6?|5A>jv_({)NTu<=qzq`CAPO_akk9)|t$(I1Uc8p(Y|w{wZ49b;#qd%%tD|+_{+VXi3>=yq%EM z*szIQdiexSDVHWyCEe&Kq}PEo;d4`rUlOb;=3G=|$9qPj)Ynvou+1~w39|Wox$urP z*axd-jWN+jBQO3U@WVL&-@mX+NbSY6i*#k&;)+bujy$CH&AvOLSKiSs7Bey&8BXI1 zfxIh5-@hC|=;}`gPw;HH?0cI3;{=AHAE|I=#(-`i@Oqvn4vDe2Q_n8EBr1*j5OK8l zh7x6$+)EEZcKk|B;#uD=54XKQ^Y&29MHh5xUx=6B*^h4KHuGDv$iMMIEWv%ROQsNJ z*Oy!9q0QOsM1+IYj7rxEwHO5+AGk+K@GN5B?Z8Ujy;zrGdT>I(La7L&A)N(!cO!XJ zs0_VRg4HMRGpu@#xgn6|Jy}0%Z#JZpf`|Eya#PE$sm|;5FR4Cp&Q)_|$scjiZ@)Vl zna7laboP+I>=Tj8rSWo1shPzn5p^Cy^`9T&s$JxNKOT4YE;xSTRV6f+jz{R&+QXM= zgBLP8eb~fl6#fw$xceR0ke@d0{Z#zhfV&0WYk8nalaFgaK$O8tLQ0wC0XVKzPl@*O zEIe+~K)e(qbb;qm#Bb_CA_-okik(d9i{gtj0dF4)`H9n@(!qv05LA%OQ9uogQ`!V!DA&6*YGdHF7x)BugEd%nFfEWzPpK zn;pr-l61+B1M2*YvK6T}mdCM%(IrRoj_~$^a>6&i0KW!#5KZWLSVg7c)UlII9On); z8$_E|_Aq2{DkfNi+JLweTYPVC@j4%tcqrYe$71L<8JCk=ee9vyo{yegdmqc(4X_Xc z5vo2!pPDZnr!hWz{J7yk8MHq^ldm)){RVY_bXip?V-5l&7~FOY{?aT7&Z74qLSDc& zuG|W<{Buj4)PQQNePXut1qC?1K~KJR%U!@&gLr@$fL%D6G!i2|HHM_l5}hszy* zFBw~^RC-=63QHYMaL&KJyu1ul^UJKJSROvi&dpVMN0SkwPHHjJBeM`l!b`G53Gqt& zQFx30;KB?Ee6?3X)>%xAgLdI~ReCTLm4W5{jH1HA7Pq#xw(#lc#l?d!*2D7ghsg&vYE=YFok)`()(f^JhuI$zp~=+t5%G$ z8bPXAJvucdNKO5&gPxnaEHhJrCooZAf(@C`DT{!x3;g-C%nisN(Jt>Y3DEw9B>gh( zN=u+K>7F>4o3U~uH5OnzXg~Ma7`sdC!oa!l!g!=E7^+hj$RZ4-e>TcH*^QU$S2G10ogr>SLDnI z*6`w|ln0*?RhhM4jyA2lU27={M`_lE8G0G%*`4=(P|n%BjO7B`cO!2~3~o2y5;8qK z-Jc;pRpYM7b2}O23A|V_$|yYDApFODfN3V9zH{!OFy_6S~Re# zKAadcsuz(9Wz>Cy?XlTk5GSG6x+RUXdu!sfeVOL`OX6Lz#juhsm~jva+4D}ft=q6C zROfL~-6YnoC=d{cd{zRJAEG2*WF*A{k>QvfS^0qQEjx3_oC)2RJ3xz;rw+S&Ct*SG z+nOG{NWVFd?Ch(&r`~-UG78R`OMqIN^>k^sIQ(MGS z&xGm0)!8QZNh#by$MyP-4t-p9Al*yLxNKw`6#mCe9~`FGml9Pa`p+%NW9b6EHsCKk zf_RlvM8~k#p_dCnkSOW=VqT@q|#(;gL`I<1;AB%lqj@nwqk-P*P1)l92Nj3yb&;>#PD9 zA#fF`k`iuW?|@vuAE>zsO2kg{RCnx*4=Us_v1#I#E;br6H#Ck*>Y^zmuw1l%VENlz z&e=B7RdwfsrW&lPOB;84UE|vN;p+vIH;=;3x)WlT@qh6BeqAoq^-4UdT}1xi_lhYD zmY^dx*3uW~kPrehX4at9H_1EbsCcImLG=UMhdsPn44 zO(}>1?4-k2Sv}`l3B1Z_mXr|~RaR8=64}AFOT%YoaS-7QJzl2XSm$AzZs;lSMq%f$ zgx^Sq>QGhE2CWbjHZ$4OYw4|zR%`ZfN3uEr&C_dQV%kd`-}CcMr}h%>(wr?Ul)N5b zSd|PDW6|N)l+7#p{=LrY+Ty|jV=8p4l-bF;;0fn|lWh#V$2w$tX%VevZ|Dvb8o%7% z938zkUo2j3{kHGf*$*ib922|n(eQK@)kw$a+f`;HIE6vxT0X}iS@$wI@M`NuZ$YM$ zVyHlkc(t=}#0VGbs9ubQ#X_f__`VMki%*_r?)V?mceQDy-&n^OB4XzM@^(xgF^`(eN}}tFD*Se zIm_s1^Uh9+>mK`Ax2HgR2fvzbVrPv;=~{n-A9r6{YAR{ciB%QbNLSb5>~qi12iVvS zaxfoELI&CS{G4#aoni;}N6*`2F%y16D^BW5%t&s7$V26RYmJlIN*vOq27!o+t``A! zS2z)XjjW?o=TDk*&ejZLWNZVojK?77)te!$FM%)a7Wh&HUai3y>mP9 z&*UbiS$C2!0UlkIC?joS*m({dj+tL`)YkM_7ZAPQbh>Sfd7R2Pt!w;pUzpv-h^2cw zTCp>RjuYC_SZ;IM$I2FuA+DA)gh)jehBSlK5Rjl@^m=f=n4r@;AhZ!RdX6YgX~3N$ zfuwk%iJ;xYNti$XpR ziJvT5TOW&`16lKJX(@V;MrPfD+?ih3@dX9iRmfJV+xg7HV~w_|)r58O!uifju#MB^4OxyY)i=pOsi2x1&`kb>(IL~a_(&ks@Hin&prezcL2!ad&) z9GGn+WMv8HP}YPc7w;DPh-7DX3A%=b&Twm>2y5*rzo)zeW+bC9jNx?u zkG$ege}nA}an=`W-#dCng8716_n$x$?w*`;#9;tC9vdS$e{yYWYs=Ks6sWyD_4Gp7(loYhCt!F9 zV~9_jA>})sqDE(a8g6U;ajMka=G-mKL~g$Id!n|^cQKPVar|Px+un<{GQlf@dSqBV z^(e)|LZqM&n#&`*>&G=nuJsW069yjL3k?nG+d>g0DzKGA1KPlY`GE|U`e8R8<%9PH zlXn!w$sWj5V&*x^4(4xZ^3FK6NLd^z5@G_BI-KGFL1N@0GiRG<2^)Y zltqZNO^ILaQLGgF&Pk@Qvc1wD1qH!@e)0l`v=1MCFzquN{uU7tF=G#|$+GD_e5N_l zJmwL(R`CQeAL73zIA!2U%|Xoq=XROf|8CX&iR7sF^f!$Z9sk3x&}aUOzkT6GJ>*qO<%OUla!ozq9LXoq&My!!P4KRrFY_zVt*ySTV?vKE2ycMDrdNsM#1 zvoCRcPJy*=^mOs>-IHM8qNJP#SB6JeM1X_2G(T^Dc5+BC1@3{v@i;%-XVs~?^To=- zVj^Ex(9_d1The6JnO{d+o2-igvVJ!@Vc6i5U|ZUEj+-qqOqA2YxK3fhNgrLlQ=_2j zX_x#V%XVfs0@P9}7wN$>E+WwA!NI|qDm26#Y`xdPVbrCfqT+8J$f{e@L6AK8=k0ZL zE(^H*$-!2nMT!|vhv49FcXKPXoQR2yWul@#U+Lu)bUP@hhHt37H>*R9nOj6xIAU;d zc225RvqVCk^NUos*OQ=taQNe=0u{J~Pd=``dWJoNwhjq{Av^P=MdV6|al$sNrtB;jh;HfWyYw#GoD=RC_a~j(+dN-y2Zwd8FKOE(ICE=a*Qc^Qweslb=%;zOFQD4m z+Vb+W`Di(3`oUd!8 z0s|KV3=9q)?{A*(E-R0!EpJRzs)Rs2PRhY+lPbYruo%0w5wUG_*BOs&KvY zvr}1Z(Yx;PeM;HW#$*iFBRZyn3%)35i}f4u$-pvo%v4|kr@P8Wh{gasT&_q>DDpJT zF=$;!!itQ30KIc6c; z0WQR0bx4szoXlIm{RmtqEP3#}mHDZsT?cWGRn4Iz}8JHEOSmTCCiW&hU98B zR|%MPVl1giH#&uz&`uU2?unTia7`nE_YVk@T_aD6{IWH;{JJ#Ty0iDrPLEfYm)TM% zGj+Qn(^$^@@6rH4#WC(lXYWP6r%!uivhTU>tvshNSzJo=WO2)y2mh277pG#`*DIr` zVLvg!elNN;7bMtM2DCj@toj)7|t zt_T2AFy~u<01J@Nqybl;Y4)YX)Wk;KudqWpily@uGyB6!!30z177!sOotd4_?B6vnhO4hY~~1Zg6vdz1(Kb`1V3HyWuTa1x2K*9sRor{XpyN zbv@}OxI6q!PMs|-&<{LIl?=A*t4JS%}aqv)mdMMxMBMkJ^)M z%yt=kfW@$8DJ|B*yHx9d8(Q07M}$1Q+e)|q{H6ra+3BWdQ4lb5Jv40MXGF%>MMXuU zg<5!B7IFX|7*!|XwhT8908prK+-aF_ERCi9ODZrNG2lF2=@djT!@`X*P=um6kqV5Q zF{iu%+(mAr^TR&ijmOq6!g9;oDr&IcRLQnHDCjt~*xOpkVT6`|TeUr24_lOvQ9N@+ z6$cZABPT#r5f2ZKE9|Iw{MW7JvHl$O{Df0_6m|YgR2zHy)HGjg61t62mQvRN$yet# zDHxWG?*|4{Vniowh8({{NB4@yFphtaY+>xN=8oyFum1|7^27}Ze%D?9)%$;@Na&JD zTbav+?8fsnxgFC2Uq2uv4Y?NX@zH0@6+~J9U6F%e%e|gl%W)34krkdNrz(l1rH)`c z(mj=&3zpC~HI=A251b9kd*ERTZpA;TRl#`~G9E;_Kt*&rp|b+MF&eZS6yDaaq|;U;^0%WPFYVx*@qxA|j&QLGZN|JhNPC zN$l}Je$YLYSlM+wgl>RZv~6X<{TP9f%a0F~Z{Dvi3K^ErcaIfuKDZ;P)iyShwF_6i zXScByzL1vzy>{(dt}=@y7H6c(Q0~j-GipxG-Sd1+#k)^>%x$h;zrHfdodqQm^r&j7 z!!2hyE;MX6UW~P>VbpWuDs?>t(P6ThPgVg4=$F9uEr*N)Pca=`K0Gl%$@}6Hhl1^t z!UL}QCX8WWWYp8#1^%h@=C8Ns#8E!Bv}MyMo!>ux#5|_@03mvG?y2$%RpE#kHw$W< zA3@%i0O096evUolZ$0=Oc3)1ko#lYyh65WLJ4O_HlH#i`x1OB@Re4Q$MFr1sTWf2; z>PO|hfg&UMBZ)!ISk@v0rvo$vvcT)! zug}3r{<|v3dIDtfcl;2;2?qzxXRxNi!om@8ghW~gya@cdqaC5_(!xToJ#eirN?XI| z`39Nkx#;SbL zRuA!D!jB)k%*@PfMV1pkfQH*iFxhwE?}v%Rp}9~_r1EMEm=ZL!A_X`5yp}EalcRyE z!G^(u8Y9SPw{3p>>az-wSQm!n?ef>S(j)sM zJ!f#yrP`8`C$OKEt3!FY>2&h1qSOqA5()|)J8nKwZFWD})msv*WbW+m4@-ybt&{-e zv=A#sg3Nm{KYULP4i0+CfbE}fjJ_J8@Hj~BfQuGn@Q=o0fN+ctsQM?!5W-uOGihF4 zK`=l*6FgaA=LaREwOwef5ep;@SY3p`y;Ec0JKHYTE%aASa8?frkH2S$SGs{~li56X zd&O1uktws*qF#fq`xf^=I;nu$mmdQlqU_bUACr=jzVJH+F{aZ*o<~B1*Kw^Sfrj{u zdu`}?E8On<%pH+>2E1Kc$7iUP)H<<4Gq?H3V}}(L4Z9gN84wOJr!&MZos5p>-7@5&TvYAQMPBCuj&Kvv^O;@Sn&R0 zspx8xj}OJ)#;N4U#c&3w_Qdl!(J?Wwuq^8Ocs3ew(X+5@1l3vvuaA|n9)EafdGvc` zrtWOm(8@~QQ0Xm*ZzbQq&rDW{Is87}tnJPY>gebYE6K<*Yrz@h8&J79aF>mZEtfQ# zcXYO%dqC-HL@t!QxH{Ho-sHg#2b~AaA>`2!&d7aXB zME0GjDR6n$(Qi-x&2sL5e&%Z1Lk$I(Pwc1M+(#?zg)z|%JyR}A@&5idSvUj-+!O?3 z+htTa2UpgJ_JQe<;!p_OtC@oJBneY<6b;Vhz5;ggNKo@IG!)nLS$UZwVq+q9NXvkU zjwQpofmv4019=V!2psu{cv69bDxOBE6=@RrZn)pq&l1b;!ft5EiL^uO@E)C%=KtJOmvy(^!0-8hlx;NGpZ-Z_g zXwaGouiq61a^_(4)aSd{VRGbbS3Do> zxk*7n5*r))aqRtDQ&aipzg}W~oP7QqgOlv;%oCG72}j{{UBUiX?gkThcXvZa?vh#l zo^J7PeK}ZDp!@NB>%_@|+x~=`ogJR2=xI_?-mc9|{j%rhh$#z%IiDIFfRc(l*RE-n z*N--COnejd-Cga^FnTfKs5a1>68n2@x{g3PvcqNWb6rou(De3)__ESNVVKv6XeTF0 zKF)ec{Z?^7@ng=4WQ3=@5db8_?#sI!RwX}v^dPgJ53qG^f@@leQNiwm&BUXZYh14v z`c<+t(;(>QU+u&im>xtn#%Z7Vz=;CB&@SxY5bf&9D<0^k3-GplXomc`mR4NL`3TNJ zcPDl(7?L@8`gxHb7MYfn6%tpKDD^7sGwC6y8ua87-&nsd3J~^wR9F;L`NMIUU;D+pEI3Ir5zb6{1+R)kNaz>IxD}a2w53g`JU*kdTN7Ntd zuM9aB!T@2F4!E(y9vzh+BzeHe;NiZd0|YD0CBsdgpLkvW%Os5kbg6uB;Gtf7nhp( zn|z(7<{&G}Y=nX$sB~6`S#RM?2^a@I-{0^>+8yXj0o)t3+%;Z!A&5EmV&n^kDpe{A z@4+`4%Ae?5Jd^bj8$>8sFX9E*5&)FEeEHJQ(2%2<6_-17tk5vg)HpNti~aG@YV-+E zar;6S);m1h+ut88=t-Oby^i(;9sRr|LTKf+ai;u`fywC7KvuPRx}P5=bBS?pGYXBG z9mU~NbK}}93)6!Kr{-3IZCzcy^L`#T;r$Q0rNhIyjdouY7eKtymF~xof;&axNI6q@ z^nd5b@gd1!nZby)(IU`GjruX6V!~y2LXC0#1&|~co9Af#8es z%V;(2_(_#5=Oa#U*{3|R4-VfVigAmhLCZ==b6ZnE$$v3%5pPsqN!5c2zNI#taP)zG z06}Aub!MY#w&{Q$z(XD24ksQ=^YcS@s07X7%qH{2gXglYR`Pu58xz=hxoC(@t2g@k z5fKaM>n0BX_afWn*R5=5CRXnos_9$Af0)eN-VIv38x$vKPG>qjv+&@X)LPfW7Q~J6 z5bR$eBvPea^ruCbm>CDf#%ex$c4P1h=wWxdK`Xu*%Ui6!XHtJR%7E#tZL%8j*xVAZ zTu=weReX($?pWW@I@`C}8QY5NMfTYh$MR>FBZo^%`EeqiUVP)K36M(7sjc+{a2jv~ zLCwmj>n2mFyl^|mw(YN9>~7`#=OM=`OLOWko{b&u?VD&eF}B99GW&%lbR;7$8_GO* zXz4v?w9r;@lF#-Y(ZT^}Jp5Dl-w*wJk_6I+# zdwP1Rxe{%nIz;{q_gF=^1gLp;f+Udi@z0Z`#EFq#k)T^tU8UATs@zY`##Tx2=)nJ; z;r6@}5G`PA*j=7GLaZAa3^+6g;%l9OIB-~Ev^G*EpD^Be&NSuDJvBbw*rOoGV9eyM zRc_5|$i=qI1uG?E(wl3_@91zvyJ0@V8cgT7=}5+&N|C4c|MdLiqYPNG0)h?raPK2* z3j&nD0jXm`IE~Zsa%K*C$;N*zoj)Al`ERuyfYyeFva)yePd|_S^)lT`_v6Ns!+u_e zm0i%CJwKkh585QDsfi{bpsmNm)c?-glaq_f*too9^mZ*GPT-W|TvPx|^Y5x!TD}4k z@^j55oJ*rckB%zl=TAYDFs}=t0dORAZMh%oEebkzVM~|5#>&yJ0=@jccTb)W+B=l& zZ|WXT3x^i%U~OP$_mC3>`T>qqGBk6l2N=0TUa=>>C@ga#jcYGVp3c>|oMCF?Wu>Fu zo5k;?<`WT57X1yFekqgRit?+m8Z(xE=A#Z8KXP))jDWD=_ZB3q5u|BcmEf&T$((MAEhi1)DQv9PJc6{U=A?wkO z;8+9xm;Vz1BpoEmjCt95(cv^4ms~IWVe-}|4Ux>!UslSLOxL%^PAQ|_aF>{N26@qx zY@VrNttac~CkjB_-6uQ`4ZXM56Tkt-A%jy|EhW1(Rf*%!5HLL}WDe?3W7gUhP!(R^ z+Op~I?fnoqDM=@ql|&gir6U0o3o2b4CXdO_$*H!PQwP^+hU>r>pswL78)qdoHMjR{ z0SZ-?)PiDy9sR%YA|x8%_kb#>ss*DR#>%fAI`^X>DAP$BhA%KZW35s(^8kj0U~^lyvDtU5))q3LmmxSkbrfI2D)-@jEkejJ02DTDR1?_ zP?MltMUkJHj0M{Y=4SRgDk88<)uExGf#G2ya0;6~{{ap4600d<*s&sr?p<9R8{+}w zPuk!kBd;3JjM}Q4x6GfEbnS+)EAOx>g#Rq7sCa8tdrFKiVA9tz@z3{+9kvaC0>^fJx>U{Whu9xIbqh>FTa3$eNL zbR~6^X25E3gVT96kBVN-xyTt5b+zxE!v4(GXDFqJqm~twyFXOO6~f3)fj+ut@3Xr$ z`k5=S(bx0DxG%wJ%H3NRcI(z_=0~pJ;sBX=-gHmTA{>GH%#XdEXa?8cCq1Fr$4h1L z^*vf#q*Kw2=Pilq-2G#n>|T8tEk8bbO!p=#`lWp2+uP*4B5P~r5+1+(lA!E(7BdPF zx|wcp8gT!I7Kg%~NCYlfv#qHukOeUt&mM_GuWpcrGox+uilz*se38#4{>^ASn7(axe(W64@*tcH#D%T_Y| z8QO28Gc}3jmI>v!h)vzq=~vS0QDOZmj&>z~*pf!z4Ri6NP5*n?mL}z13!%nNYn6I`|XIF z>ZKVH4SV`l0Lp~hCL|77Fp#I(UmyE;yBv(_bNUf{`gj~*m_8vHAF#GIw`();gEh-f z*d>$G@ubzrs2WvYE+jc6dV6W%d3yR;y+xrl*7GLuBx@G6hxc2pYUA5Khb%0XPFL?w zhTlOyOOcC#_Ep$rw6u_!#~^O1QsdrsnECZy{z2c5Hp$U{9_ejBqHeFkkci;SI-1QVGJZ#p z>iyw|uZ|8==GnY!>*rEJ>R9I)TD!w~B7<+_V>z9;Wtgd(^Eb=LKC7K&lUmyh^EL%h zBt$HfIc+*=|1d7_;w({3lNuQxH<ixOQ&>A*-_aEwD&`rz3Qjt5i@?9?uQHZ8$PKoio|WRgb+BiD_XWeCx}%e zscZP^_x9JTVK&7#$?g!ckfx=(f^eAjD3QHD@%2j*d3Gthtt~-C-`!oB@pHk&j_*d% z!@1F{ZbCp|hKYpR<3V@Xn-Y}{le?kY(Hv8(jFR)4+qaq(wA>Cb3Cj<@DTQ=&VyBu9 z=ldyAL}gz;qkr!+N9i^oIY|R19i6!`SXnkyLfz)TG0q@q~&PNqW7~U_d+FwspVP6<;-+$HBm#H|U6xltslb#X= zZLjn^*J%5x?GO(g3!Ly|?U6m-YEI+yYzg+@<<#Q=hK?bZLMXJt&4$Pz2WeTR#i%C5 z;E1j(Zh2v5(1_P8;XK0h$I5#+CX9;uJ+wsJR(Z@=T}^BF`Fxwi2JVj2L!U~QzVJU6 zOcm-fiG||kF<9D-b-k&kri~ejWYuzRy3Yu=tzQGk;$t#am?(2*>Dvq#NOgYOQLO*l z+-P`u(#@_Q)M4mBV_aVt{Zh^08v+Z^%*kj(zV-p85oWeIEw{xHcRXm=2rLwJ(@EPs zldKibw8g^MN)0G1ya(o=^wwt_foq+W1E-KW7g}%jOBbaWT{I;79YSl&diq0bkdmpq zatDU+b!hvN*^)d$>g9siuD8=)NwAKNK4_eNMOA~~5QQsPNNEc|@hbR({_ zY!KZ?+KpKRS(>sD09jZ=~AaI;|2Dso65lXPs<$nwD6Z{83RwUvR(GGyc z!x|^>y4^KZ9VQ2go9A0M`meJCK=(`&YYVi8{Gkhv`-`Uv) z-KUy(gP&;ADxFgJPEdh>b?;Mu8R~tB^RqX)p3t4`1xgYUriY3BA8kr^dU1m>s^p825bu*2HUmZ!Y0ym&^b$c%txvKSuTvu^_@K@u~NWS?vQDd7Sr@<=*Wlvj}nLFxGc zI%S4#aUrq90v1u9)!B*3_%CsmpmE2cSUfx48_Oyx>gp*pUtm!Gmir$*;&{%O%c^jM zK2jV93H{#euLmZ93?Y*9T1CRTs4noA9V03MvW$A_z(< zDKQ|Tgi?|cfw zQO5W~hsGs9Han;V2L}gRC%DhjiGQe159N?YGNN=T6;Q!?K=--oR^RccC`WTB?~Z;0 zcSax+3h$@0nr8mBB4J_Nsmhl@%rt0eu$;EW?qWPDHx)$1sxMr;k>duO!xIJeG!~{8 z>hIz#_2pX&*oTdFPj= z3+u~@9UTU@?nWYirhd8V-?3FYx5ZI&B`Gr+Q5V4Cetwt<^|-@ZKhWo5jpVbrnd6<4 z&GdsYl4{CMPI=Y6%*F8LDJj_VIvg7Na-`jZ0;$e@R*XehHhqFbVg`EIKU5puC^bf*0<;-OGRb})yqSwW;*A{@H4lBCPq_U- zjWqyodn#vB7`ETPFgNqYx#5WQ#R(xW9%O=Bwdg*Z6gk%_R9T75HZyVh$55I_O3D%u=p}l*4rSeZDT48t1=H=tCG8 zm(CI)O-*ZK5LbA#P14rYCFIh#+!$pnFaOSiqUoRUZ=1HZsbn z8|yn%O2=1yUS$1C+7xxUd&yzEKb7&Llbfc#qN*a++6<{agmVMRc9a=<6i3K<3eCDw zzkG>_chrc`IjFuCY=SS1nJ2sdj@ABT;gBS=e^A^ERsbUz!UH3)np^uun~u6drv12Vp`kVFY`=ditLwpjgB66q@~KPt50VYzG!_tF;JvQ zP)Z_~G?M-X&PhkSe!=uWW`Cpyao!^7 zn(1-R6FTUH*?>p->fgUhARp5YiQZs-Vs{N0e+vKtKnlNSXm9|41x<0k2h*6MQ8Low z4RhmBV_(%vS6Zs7liBS`9zs(e#|<04e=(Rt7`KIEIBV`^gw#m}Ck0NPIU#AT8mS^%CrSSVY!EG;PTjE!|x zYF1yn>bTMj7zN*x*?~2HqbDbMOfWSjrZ--N#>9ApX*K~ty$n*MX8N1VV6tpwO2>cC zNfi=F(?t(lBVU>GgC&R_uN!!rIT+;fqE2E;%G{!f6i5a%Ky3O82}cPD!wF;)XT#rL z9;92FT%3pjBn6NUFE1*{F@4Uimc}y!P4EMBV6|n%zQMS?0>>f!b*_*8QU>9^lFh$A zLRGp2jk%pEQmgK#X=g~1SRq?V+ zRFs4>r+?mI{8A(T1lo4Sbnm~su8Ws2c=PX%h+^F$_@^z>zUpm^@$ z3XPcDBNM~GS`xOOzF}k7ly`)@m(Zy#nJ7;SgrPz}?Zd;CeqEi{Z6U{(1F{YRl#IYPW`=3=v*5n#h zdLIHt!er~sN84Mue8eC|Qql=PZSYk|3U~t{gs9F%NrTZC-!*R9d1db!}p|z$>u!mgCzVtTv7k>KB)jn+77s9y*=NxWO9-6_M%;i{* z_6!Z(K$luXfJot+R|1+~n1_g1-;3cAL;&09T9sN^Ou-N3;x5+#a;)#CKF9VBH+7Ah zZG&;2oaj?;)e{$O>LhIVLVU5AnKoO+ z+&M|T(9@P)-Jo*rx5bURY}bYoM#jckX>Q!O(X2&(=YjFUrGHKwK1`%drbT}G_D}cs zQzsgw*o&Pv&u^KVqlpM>CgHQt5o(1bkaOq-%cT{Z#yhQdetrmN4w`nbu|8k~g;ui% zEk(%}T@#tk7qiII)C4PfHP^OrUq|YTcC&l|s<*Pze~)fMeDr23IQFjPmS5Pxw97fG zCk`AwcrYI5lxj_qqdr7PKlL$Y0hXvk9RNhZ!6y1AKq{SY;m0AXH6j{=L|(EvBq9<) zEBGCO2sJS^6?F<{G!Sq_VpmvyCS6jrp5H1gl$#H6*{lnIn6>0uLPFx!c@Aa@hUnOX zGreAM6OXC{{579s@LP{eLFzlVeKsdaR$sVa!ST@v)!#mRwWn-80TKUjabZLsW-dwX zG{*7pzSl4JDQjw?Q^#YicXzF;ct+bhDpMOj@33vx&(8-1vf6Xs6ZTNQHn7Dv#s(mE zd_4=$vm-*(sqF%Rwp(F4-E)a|;q+>KT4w2aWf^AUCMc7Asre*SI6T?CXU_u-*&7n7 z8q4Rp-d5E4Xv-9Q zOQzd?O8r$q!J(X_gO_H#>Y&S`-K`Ca6*&m)rKghv;2euRFN%#RimX4TrF}|DdSsmJ zvQF@P`SLClhnY{SB>7DA_v73sqb4+-BUlI!6Bf9(~5(3Mni6 zwA4QuT9hSb*bO;grF4sB}2{id#xL_4l*ADWp}>oc6r#X>Kx z05N7w_0`(m*2q;j{F_NIJPyq@MVlFpt9$cQ017bBqI~t%p@v*zeKC^y* zD6zq?IU0IGI-Sq>@R?xqM%C5#3sKWt{u(K6fmxhU-?TlsQwD>UV*~9|ZX^4k`;=UV zSa`dJgl2_qPK%~!gWOcBAcz{xr125pLEoIq^#_#;{kzBh$K_f`Ro0aBUu)CNS;+b&p?@Z2LOt)~14YA&Ibq0oEM=s#QE}82M zQAC5NBG3o=6hzx29;==(>a0HreV$ML`Y=Is*c3z=e&3>*-q^QQxq;m$@9|d$_~wp0 zf&yN%z}oW3lZSP+<**k6;%j3KZ31tK2S%Xw`#ATZ{`}tDwaFrl5M!tqlOhpt)G8|UHCahC(>sjqaw-P@xYYp?OMFZDn}*^iOvNfm z3PAP%f`<1y^6q+-B*NQvdOJ6rr;FP}KHmq>fYn)r$~ip(Lj#Wmjr}9gcKUeomvscG zBO$@FeVRi_N#N(xd1|A5*|1)F(E?Z`&{DTFMg7{tih-~CBhtPc`dv@WVAPf&SyJBu zR>&t^1O?o2x1ICJ?;ENhyZ4a%&r}0NCMzqB#rmSMvl&;RViM_ce9Pd`Lp$gs)c2~7 z7{8V$Nfoc0BV#yr1;B~fbC=kmUGVpWqjRLsb#xhp25k&?Bmk4+^C8xx6lU?(_xm{? znu*}@`-iH7oVU>AGx$3vh|NZVPX!cUE$y_$2AKIip6u&wt~I?6I1^-Hnwrk7wdHQ{ zfI_vk`CbfJNd7{A)>-NB?%{t&I5`sJ9Cg1~Us&lYx%!&ww6QN)bKakSP1aI=g7@T! zfW=aY{}1+xH{&8<)Vnt4CO-$X7> zptI9Gsie1-%dVtpG>L$p&yju)q7yf-j6Wv)njY0V$i*ew#+YS`clA6;yK#=Z){lzO zK((|;9^ z$^2CEHREV+0hRm_KqIBD`p%vu#D#K`wq*Jp!S|ODz%-4<&kzW4U#$Kv`PTnhp!`C1 z=7FE^myLb*fE)<4L;m>V(HQ+tU;Uh!V8GzA&G02mOY7d3_0Iq5wOS<*W7c2c(p{tu zD`@!+Q5)=-kFCRRK|c~J^A8o`!zds>ezXgy_j78ITT4#tEJ){g?G!<*;VP5-Uf7+l zet7r4{DANVQ3Vhk8N&VRAqoge&lfLt^lq9#dN3_;xlvz+6OuIu87F54-)&$d7ZO_N z2fsTx_B?%>^D)jo;MN@o;7=Cp+h_BIft;)d6X$Wf&SqHZ8T8w{eM`Bb;d#pt6BtO< z49D17^7}CKi$2fc&yij^N0e0fMd)h&)DL7i`K(V3DPf}1k@626gZ#p;} zmTzy@`4D!#*V7=R^f6mDgzSiqOk6PATsuCAS>X8s{ihe7@Sppgy|l}mj|-Zf1-pmt zU}o{Fdtn{#DF1v!FtY-OXdy{HVyjnqro*J;yMY1)J#%jfZB(@L4Reyg4*CXQJ-_e1vvFJ3R4jlbN92oNd)dLxXl-3=vXL({ z*BwVy9b|^Z)yEYLq^#$D?V_%^q_W}hwV3jScc6|`b?Bd88@>!a#YJanJ?u6|1(NQc zzR#Q8lMT}M5XoM?%_DiZ`zxp+6Wo2dD$0#a1KHkV0 zntPUNGk~Zs1%?mT?^pV6rf6x&b@KG_;}VEDb*{iwP%Ap1flM93x`J;d=2R z&k2UNlohEclyZVki44^`CcrwD!0rwf zChY3h9Bq{NH3<*RDE3gwnCC0XDOyAjnj6Bshs-p?KVbyH&sB`s&$%?aqCcaL6@#w-`4NO$+_PSPT?L|T zwF^i88bZ*>`3cd_G1#(+!2!(XMb6!t(w`$y=N6w1GA@5TD@ZnciOoL#=NBP{g>>T2 zk9Z*<))TY3_UD7`HiiCq6(LDPt%9 z`qt1VI#49~Yea!7kZ>vVua9=gb$>qk?MCHH0PX(#s4kbBbVq3GkB8djx&Ad3AS_{& z#PR1k$O%f+xkZ#_gD?KO4tDdHzor6IgMi-i=ZJ1NT_D+giVvgE-K-pLeJBO5 zvN_Cl))`EE1;h`Nf4?#(#ZnnjHpp~+5gg>z4Oly~R95(v%j+b&Q`fA8u`#R4YYn;< zpC=0fK@w26-1ASM`P9a_OGkDe&zKV*Te?CN1F{IDXC}SAd&R^^BTdbZP1#X;&Bhij+&aDamO+HRU;!4bb(;~YiTvpkG4bu*cSKkW3opS_{u083dM8w z9n96xZdI9L_qom`VN`(KdgZ?w*}sB_Bn7~K@3phUFu}I!*J84cMJ&hpzFN#>`hU{Y z$zW!OqgaVjwC8+wA%xwP@WQS$ntF*k&i(2u+#Ka&`l<^t_Q!^*(Zd@KFEui~@@!wh zlY+IpVcMxwdG8K)PB!60)#~fAxvUopXA#sN65=XUtEK}f)Gh6!#9Z79-3wn3UX9)$ zS&E$f`8@q`7La0d%*Pv}*lYTA{r`F`e=%No?c^lt?jtt~!*=!jwu=Wcl*1WIo8RK!*fKg*P0aB%Gfrxk|wv4{4P;4!D19d{FdA z1n6cOkX%n-h5;+e);e6+VZO*b1#(E)K;!E=BwI0w0q{0PjgDnd84@JQ0UBSLFWwKz zfxkQsJ{|EbT;PG`OGVs<*~*lQE`Fl@3bP>UINnqA!~>z5@dQT#TAznp`KaZXuQ(SS z0`q*AHMDWd=4Ug>r3FzJXMc4Zbe-^RVy&LYApv8Rp@PUbo6j^T7wQUi=VpO_Dq?c< zQ-QB9Xk5Z!%w9?Z)S-i4=zq_h=d`#G?g!)EurpJaqY>C_c55ppOtzJD@uzqr#MC?jban3RdSC(SLj9Vv50;Jj0MbcG6}B?PJOaQN#E7EB8U_{(>)+=aHiWk~KfXg8Z0D6( zvdxPoMCctFo=%?lv9lTQ#neU=gZ%97u1<6t{nwp6>4qwG0^kfrGHbqJ7#g=_-vREmk-^mW6jac45C9GP38fNkN1czMCVtXN=jRX<^dF*yIgj@NaCJZf^gt1s#+ z@H^fyxCE$ipZn(^ix-Pu%FPf3Sz$Kcu(9o|_GpfzFd1G{dV9+i@~#uSCz{8ee5*aE zsdMKmxjb`_{Od@TD!QDeLyXMKyqDI$#}HQbP4IzWyj*> z=s=s-0A}h_&OfiS*~j`P9WIZSDoSULI)2sx(ZW^!0W$ZsQhrSwY? zOSOIS5UCUV5MS@rXvX*rmc7^+mT+~#Wj};Ig_1`GUA-KQsOQe7)$}M*eG0Agp_wMI zU*V~}d#dS)S5?#J+#OxLiN$XR?p!x1hHQMr73}oH-TjP$2ge2C;Js=Xb4sga+Z_j= zY>(JMQj`a7ueayShO$ZH$(@Hy9>xh#opMB6a*uuB&KvuU_&V<&8xItro)|*PgLV^c zq%Xym+r#}(r1H{}W-&T%W%Y@F*-yL|+U*p(nRRv8=hMAcZlaCua>9_mz%e3W;76}6 zq1^)+wtWevYMK=j2@!w(@yz--w_2fxW!=sITthBdxu#{()$4Qa{e9yx{7BWd&3e@o zhI1j-btbhgzj5>Q6yK|1&HeCLEJ28}t>@QCzPrP(y(m%(a$?D7du+QWKfq-KH$h0H ziP`w>A?rMo<-F$wPJ*hIUPPp!C2r~vE%B+RCDs_mD{>qNIKBLkacYbFZN)PSZH@Y9 zosCB|QtC%x5|h_)fXxGK@9E*gYuC2$=r&&AHC}$__KV^azCLuqITYkkiBaZT8=e^% zjXVvn4#kZKeygaMTk7&yTV2x3ouuLqg+qhg%d!llq)4Di9qCYzsYxXRqa$IaZkK!C z>-CJ`k^UU<`ggWxmBW$zof8gd9hrk!*2L#6(f8eu^EkSMur-x_JbS{-tPY#sroWMK z@4I$*9-(L(JKSM5R7!5q}(E*ks>t z5mLuyNJ*()J^J!xd~Z?Ndr^nVx7WmgkJEQ36Na|P~dUe=bp%7)FMkT$<+WEN> zBSi-Xcjj7urm2zCck)H63#=L1f_j3;cKr^NwEJNBI_Uv#!qU>ABN3M7VQCtqrhFE| z!=bn3Yy2XLc1%!x`g>?myAf7({CAz=Ij=sum2Vkk zP`|cxWTf-uOXf}7M0d+29v+!{KJUo0K3@(!21;Y-Zl0z{^rg1+dm_@7!E^bRbQg#Z zA565>q7pr{IU(KrqTSUER`vt13frv+#q+iI!5Y-nLk0)44fHLiqv6PT5KuXL<>9ri zj0`x)Oi|u$e&iJ1+v}7(D!1dn0q>ByfGb>FK3iK%avUn|Z{EBn5b_!ueJHPAxpJGh zvcGmXnPBmo`jY-zNe=1c;ES=abuIt&L(-3txHF3{IvWCO(B8I!>%r{f@tb zxXAMAs_f*aSYaI&v|D8ZvEjZiB*kW(faetyq#z?3(Z~vqv17@mB>v2%A;o@h%AaG+ zE`xRrVR4b@JAS#a=u>8^^P{NeAU9GsGBSe0;UXg=p*dUq2=SZQHPOI#W!#@abd{F} zs~B8@Iz%8efKJIvF=gAEGpnns>8FS;$}kXNXGeoSBzLAd`cxp44@*JH24qU76c(CX zwp64H4GhA*WE#adsmHb4xOp=r4UX5DTV57_zL@M<)-ct@zYTS++@j~gEFlgtALHV- z=R?bS%DoGl)K~no5VXRgB+N(b!}bU>gWNY$8Y}ES%izb zKqcAc>7o%23lC3qLj$_5&Z!~%8h-;wdW>|^BMKFwMe{T=L3H8!t2^^WgF{0rYg3Y& z8*AxWOP=A%A-v!+v<#J+N$0JaqN7c-NJ8ZZA5sjOs{NTpO=HBIo+hmluvP{m#SV!I zIrBfL6s!5HrAaa;12A_yt`=F3zV$q)uBJ8$I#ef4oG$VzL|KpC(!{+ycx3v4Zm-7) z1_tg>V#~Z~TYWS_yAlq|1z8eYf7$ko%eF`iNUOukyu$g%SofDIZp@Yw!0pu5wsv5z zjyF|lYipl6MbE|E^f|Y~ynA+{BaL+5J}LX3&AMZ$;C{5h{e)^?u%&nDQIV=GR!|_+ z)aa!c9HpB?PPY3D3|!(#_;w)>Vf+%E4RU%N%;FofZgw>2;Lt0Oh^09ZpsP-TFyrOr zH6w&{KT5~e1|hN$<_gS76Uba}aBvjb;h%$%t=H2-Tk_=sn&Zb~Mc$5K;OghuU?&8yUl`ZK9HS+LbcY^$W|JQFRJP4P7e&s*7G(c zr+J;?q!E4gSq_w;;@K1jlo$5av5NKmf=43~wTIv4gfkw3t(&CE>Kr zK){9Dd^GRm7Mdj~YOLF_OdTN(@cw6b4Mo>}##vzV@O>rg#SRM~4ES`$2~@{Gbtxk| z8x$cn-&xdb&w7Ygmp}v5Z7$LS2dZ^q9Opd=ohd3wVoU8RC=%1vbbvxeO+gtawbv^@ z-yTG&1T1^L0QG8QL|=@kV~lLRijG5|e@=F|(#T_1Rz{2LT^J?7bIs18VJDkZcSAFk z&kkxWiy8t*4*+M#@nA-h;vUOKR$^jN0fzoqJgi zUl(@N)lH#|VuCMDcBF-RyG$g6l961?O>=g3wuZBYlzAkDZwMmExGwYXpdj_IR+HMA zP;^nYs!-J)^WrYOsFC2Ki^TJ@v$HSxyqzw&ZJ>GgZn9%4Aq!zKoN~rxYt^U#EI_Nk z+{#K%U7bb4s;?NGaZlt@GDh5taZ0{2Qq)0t*(Xsh?4h9{p@Ld(cGnVE{1I>{Vb15v z5R&_NXQqqVfqK;hRoJzcn)k)4p$b zczAS@LVV*x1fufP%J(DOs_T9c(>%m^ITa8Pa9(40Xy~bUL{cKIr(nTXeCr}ras z$sQl6;lx}ye*6d?ZxIzmcR}Of!;tFt&?()GHZiy0AFe7(Z-~C>#ZvSB#fuheO`gh% zik5ztSJOOt4hEk+q@~%}>tOyXL*P9R8T$V0D=G2@(4p(XNe)g<4|3YXl8K%I8&F9Z z{OY>Dq_|k0#>{MrCYzOqN0}=kEG#%AWJ|APhHzT@!vyY56{B%i#ytar1hx(E5_B zOxMay#W)od7Ot(V{F+Pm>gey^%L~i#Sd&Vvi`?8OW~q*VXYp6(3=dl$E_@ zVv?$JkxRj!>(*`TT|8ZUgrG0bRU&kGAZC1zprkb&--2HZJ<`f)TFm@v?M?WB7tkop znJw+~Opfv)!hHIjCBC-hZ)8yZ?P z{rU0Wx_z#;9w#!Vyfs0^$+7sI(_^0n!YsBMhayT`DO*K@G?fV-%@WtUe-0lG@GmVb zwO)lo8m-Z_wW*ajA(yS25DaqB$$m(draKyuEKgQHkeb0u;@iMm0_LGv5rW^;R5x?v7 zc&#^G>j#iNoSfYc%N|w;26rXv>%hSMf*x2r26Z7R4_odfo~R2{6uYERQc@Dip*jCE z&bM|H`h?O1T};CeLm+V$5|L+tO{C+s8I$ARoN-<*Dst*%n~io}GjS95IZ7wIh{uLD z!8sPy^n6RW2j`GliUe~^jx4@^rng8#1U3un?#~Y_FgaIvc|o=Xm6@3-*9?6>1vOPw z(p+_7CE+Mc2k0K6(de4fK>k$fz1<}agx(Twrh)mnL0wSkUfojQ^Yf- zx^fwibu~3Dx&oh4QzwTiye50!W4JFvY=1w)xEF-zzP~<#;U)CALFA>m-;0{Nw8`j` znEm+7jFtHzIE^~w5K%zom%IN5y)aj0MNYpVCs!Xp#rn}y6c-_EHBsVpFuB47?}0P9 zfNq;l*D0``AE{X`@Z&e@gf3MzI?cupdd{mAm6c=5W!p}`1T{A|H#JSYL06VQd?E56 zM3dP1N~&5+yJ3D`qe2|w<|PR8{1BX;!b-MI+=FFXQ)T8B7G+y&W_Vw>%w=NG$9IDu z7q#a8`gK9vqjhKkQxA{79jd^{*j8NJBVzmfBIAP!td(z2`x&uf7lYBPLsU{VGj3j9 z!&8|Q!DpD5+lGzxwjwf40qpu_+ zq*PQ~f?Ph@5Y8;9Z*8@PmE~AMO7!Ux+0yR1C56ztsng5iUso5pUD4GgEkA(AAE#Qt zA~|;RuZl|dyPBG7>%M*xrbbhp13!MKK|V1VAB)|q(T@db;LC@R941Qm|e>#&t`o_Q2k~aS27=zbB@hvFef0{XBqxv>b<~f;&DS$jok# zHmlB2k`XZ?Mx?Oa)3@Ga0Z0DZz3Y`V9dMnW;sV%tG7tDJ)>QkunQmD6s=kYe$gWQ) zySQ}9&pW6#Afcw?<3}qSYrDFGCiHlu5@dtSNJ>gd{qWD9KbIRHgFy+-) zXjEXL@@CjZP2l{Cl2e7n4C{|+T1!X-Y<-M((a|}(xhb7oz#Mq?EUu^bo+zRhdZr=2 zI-2c4P8U9JWd$e2>+0%)g9HIy>5~1hoN^m>Ha534yM}w@km7@7VBBl!ZU?<+>3cra z*)l)xjr>w%>cs{d+e_Hkl0_PprurZ6F$3FGD=Tr?oYDjJ#nEN;A&T&wMC%pdMd6v5NEZf+_x?7r?8!JW_|G=48&=!((bMaTHVJ=6QQI(ZI zU>nent*@6`?HEnA-_zWTjw2+UnRZxNo%NKei8kaL8D~9tg4zH7_+?jDS7;fSPm73( ziV6*_V&LDycbyP<^d4JLJDELy z8lnprE4^pxgKmQvK#{`RgcKmN=7w*gv~~LXmH9&u^Sr_5g#JZ?ZchY4Og`}rVm3ib z=Cbu^_HuUwt4g#8HLHrDQB_b#;wkE+(`O%XAW^7~(mrRICDl6SP^hQ77+4c{tRi*} zQI3>_mEmZftRBb>Vj?%xEFk=Qfis!LCXBsDkY^XLAoqOeFld71$-{Gg<(R6Ik?-0u zt(!L!pUPbS4uVCaL|3C4YaLinpy})!kmHx1?~#*uWhjHYOu1t z1B?ZQT3lvebOR>|ernep`7=D-g^f~116Ef*PUts5j{bCZfF|!YCpYq`o*T_(Qy6aV zi;zeJh1k#8rLKj=D)B`nQnz7r$(I%lBs&PfSh%_GaP@!j zFTVc`37`P_q*DH*@0It6a*t(uYgFjXn)e-P`}xE3=H}|`XSS}p_w*omlv)1y=QMt5 zit3a=NyzQ7aj(Qc1mgMAd&Mi|EGx9ntRilqss_xC?N|?!zM|n+;#5}|BXW}M4~%Ij zK6UaL#GXO24~N(a&YoT&yx6N)7j*Mx|JVpleS7ng)5FIAyb@$Oz7z=E9*Gpn2DMQ~ zJVwYmuxA1y*beP$JSYoo_LL|suCN&Ha9cPk`PueTCPUY<)j){_8!bDM#xTl{XrAD! zHa2IlBoxk-;D?G@BqSgknWUp^O!cfmdw5gAZ4D4QeH1if$45QE<|RyCf3|`P)us74aDRM8{JIktyNF1lVhlYV zqggh4T@TN(=2l$Oxb6oA1``-h$?J(V<$(s_?<*JEJm1{C zm^n57RqEZmnKF8zmfZ~@Dy*fcSzD_*Y|wC5Tf3IZab=K{f?-S92_vtLf*pF}0O-t^ zJoe7Q2{~AMZ5UU2pBcjA?p$eb>UOYmzDt@Xo`Z0S5+ zMe)t|=7^CdbVr9~1Y*r)Y)w0!Lfo;pr$^3tyQH{hl=~wl^PRcq_PC2-YMoKjbU+!6 zEVWxit||7yW>Kdl+dB)_rTmz8!HAAd&#ZB?=d@<#X_mN&t}kk=NQm68ewaUb>`ryR!N^6m1!n-aa%jVSF_58a6r~tGnHc1vdLR zIO@ILma0+ZSePxLjTmYU%nP%ss3R{09GSl*WKhe{`6*&Mvno$rN^D6rA7U936WURJ zj;qh!dTv+pewh`r>GQv5;gCFk*$#iWO@YHc$G9c_QPp{Qxkp12$um=R?|F^vSXf;; z+Qmlf7RHX_*-L1cZ)WIzat^<R5r*ik%U3(?Hu`3~x4i27}-gH0;J@r@p!%DdU z&S!-_L)t-M#f8P>Aq>xZiM^;(;f!Nr#b{)V+ z+d+TIpebJVQM-&ojZWzXcPJM=7;QgICa>6kF`JB`um1+%DPL$tf>Fq2X^8leqgDbH zD>bxVZt<~1`v{9-(lW&|v6S+YMTljgprH6?4h2(3k5HHD)j5Q6MNJM5H!!j{>!8Ll zxo#Aqvo8pB(-?|^iS002?0MUXR$03S@-2+MQB^eu5nqN8#HNngQ;aCu}XXaQZYp;t*)jL z+UnhLULE}+_ZhiNZ4KyWNnz##Oz2s3+GA@}R}(${fUjt)tZrV1i?-={fTJDk1O%im(9fso$lPQ)YdK;#ZmECRr zgJTU$AjcnGztyI=9w9^cNuhl1f2T*2+s5Qa+mgy0Mr-#TRq`I!j$Y zAZ7OVirYNWW=2eOf7rbTWFgD@K66{#(35ve=xCz`X1H0&$_>Tvjl(^c2^KAtcMau zuJM&Q8ba&s{ji*a(=06;*)!X{Hjz#PG3 z=Bv?i>AczYb-9zYpC|8FFFxQKr+4^=O3uerHS~Dl|2>~1gd`Q^(vZ-zVIVJKKG`nV zzTGDzA|f{XbwAHoIfb4EHvwaFE4k}(m=xFc%CJ~LWE5STuC+Va1U4foxBlmNm$Z|K zn!QwSwsLh{-r9>BP<`O$whyalZT)D~&nl&Y$s0p04xVlmx0fq2hvdh}tf<#BO@vXf+7H|&e_XESoC-uLaBvJ|Jif_&QL zIWcZFbV1T3O*aA-C#U%C;@q4lF8%>AR4-jmj58)vB(YLLH;0Ygx3?hBnSykw@cGi$ zh6riX4ZnzQug%J+9Kiq|%^0>D(rijh-(L3OlfR5)RxxO*Y026IG>N?_Z8wqC-;PsB z@_@2g@g_k=HVSH2bxj6fN0aw&!TMJ<^oE3{Gx$&48@PtUemB zcK4%8!RxJhLAX+5USe$#!o#}Pn%R|bbw3qFDcrDX)Rz$4XpH z?OS>wYdk10x&xeL`Z+m5C`i6hSVkM&tb0A1sV$An zgdVI?rnc=);BDxKz@6$>+|6&3<4S4jqkl(?2Kkc2fDwv)_wGfRt@cL41d9lvV}x_d z2R`b@%N;v*S*!3iayE@tFo2rlSrgzQn>72;ZV*p@T3ya__@qqy33^o0lA&Ui4;(2Z zVLezM7Io^>m|0h&zb4WC3T;)bZ;k~I_=}wpvQ~Q6kM~b~Vq+6hut=TIw=ck7S#xqh zd^e~JInpYMS^m(ixNiq|0aV5VSKx(PolJAUun?oD+UTuKq*@&j_eEn&xLo?amQL}Zdf6s^-Ay!9k%5FoM4R8e|8(9{itK9`f zMKEU2I}#AX4bKl%*FAhngvdkp*fJ0AW_6e^=-pVOKcgTmHl8^lhffWA8DfsYr1J%~ zQ_0h@fu=6@9jDZEBF`TT4#~^HNThWuUf*w|Xx81#-))!T@Tt|khnRmg$7g#CMtfA& z(qB3S4yE_O;P>UJ%)Qg&(;>UN_I7w&OST7IIm#;NE+_0weAz?_1IKQDd5GNdC4;ru zOG#&EWeEvNw3}2@bSG3FKjW1bv=Yb*cCs2-BZ_{!$(4RQfQQw)^oA8n;wA^|2OB-m zg51e9f4wRrF$RRRbBx}78kEdeU&4QgWC)l@JFgmg=ThQ5wjy^nloRk5bDmhLswhlE85TP^Z z{yeT+1a0uR7>!vs?l+?-_Fl&JBuiU1Am?s07g?DAnYqX zeTk}0ez%m@VOWD>jopj#SRk~oN_j2-*te&-9_0~>j>=D}q=;2h)xYJz%$)wlOWV@Q zDouf&O)xAXVsxBU_J{)#xx3`l7a$qS+t|Aw^c9PWgztgaz?U3o6rwOK zaI!*i@r?q zOofWhn;{IoJ{7aA6F3HZ#TX)f&;&LoI+LQ(pkQ-?~(V7Ag!G@y* z*w2R04&L$^d50T$x}X3~L*t>fZ`ehb<`xcuUz;75BkZ}>RvX>M2$OyxGT(z}`dX{* z8Lmy(HXZd#wG|8OggVqs+w@XS`ig1T=8kQ<6wQoQk{uYR`9`+127pO`6T$JY&wDOt znxH224~~tDwCfQr=cK~7=nNI7dYU_y?NY+vTiQFms25k$*cf8*#N0f+n9cm!r<%!t zV3srm_4|PMZ5k+=U9A#LvXyo+Qe;Or^MAEV5z1(F*ZK8L|4)w%4HM0MAjQr5(5Y`* zb1P7dmHo1~c-a=pV}>x>OOG1g%1#P4|4DPdsQs*liDbqp@I&F2gptwF8uzOrA|m|! zOSJ9b>0G-H8xj;moRM&ALQVkrz5V8);lqHKbzCP7X#>3jd394$D771qF0zyPHSeKX z^*d?~b8vIBg2D5RLS^7LF6g(j@)9Eu#weoevkgXEYumsdBtqwmXkMqa2#t)h$qm&- zTHi~^0SmXWSq1<+5Ptd^G5T-|3ELrSxs%Ay6;Q8Mh`{DlI18MXC96*Yt&1N`g|a4M zKb{8?W+}kz^^rncJUnlR7P;eObH3uTb{tdbgT4`nGD>Y&OJsKvL&N&n&?A7L11Y1n z(TC`jU%;g$ua>C{?gNSNQeH877qPx8TDTH(K`oD@0 z?yuz9V(OYQo1iw5JTVSwDMo6W5ulQ-wI!=|eVegjUL=9I;`V}9fpWYk3d;XaX(Q|) zs>r-2vNBziS>0IT&B1Pr3uCqH;hX?6g@$BH}j-M61nHW^> zcj*GHehnllbpamaNQFdEdoG2<`bM8iobsGp3RkX5VcAHi(@NB~C1{ZMH8oq9q>l!~ zLfv#rXUD&%MCS$uI$6(atWiv?&*WpUSW{}+<5`afzV;ERfIEQG2M7HoAG$hb+j!EE zdDs1EYJ?xZ>ki*K)w6BQK6{&EJ8Qc=dY<;X-f;zurt@5u1@SMnP(AvVmLV}Q%$y^5 z{NTjIsgt>P8`8uRwE!$gw~PNqYBK9eetP!lOkeMXFfy^+-(?EF_Y-}a$K5DoEho`! zDn)l|#Cs2)|2@I-!pM(t;x^VOjZlD%Qcy-qlh@uQS~zaZ15?e9QP5rypDi6Ou?7bg z+XAnO{&})n_&|FK9n=Jgpn4sQ7WduRXb6ASg|bW^ks12hWnuhD7~p{f9G|&3_{^X7 zM(~H7J9j@PGgI+y_ft2DOYH2JmaG!HEC|{**ATMA-H(_`P=rfETb+~Hg9l>vmS16% z=$&#F+$e;rs{xs*tN+=%aYK618 z`oI5ji;I+`6akp&?d*cO-*~R# z%{F&gX)@xc)4Viv&)^1IT54-~L>=>J$^hmA(&14$43VYdLE(}jh93i1aC&-ZVj|CF z`xZPH-Pg4S!R_1jSr~0{F_}kI-$N{c#j?BO1Z?TFitp0g+I7|_WZj<(>jq%_j|AAD zLI6xA`jB%(7cHSu|Eus(=(VOnf}ROoX|Zr8ZY`r{`2n)2Rw&!Lo@15TQ|u5Ae8y$^ zgo{LQD^Cf}*dpiMQhMgX_9S=bfE(Wm&NT8iT_C1WArM4FenEE*j++$`f7z$gD*GKw8=Kxk77#{A;O-qA$HXLJVvm!sEBSRNWKORl`s3}8$Sf4i_ zZ@-GpH6!KLd7~)bd;jUa|JLpo$Q~}T-`>Xd=jjyYEIX$%f$816X~<;Qv`GdeIjH$A zm!19Z`WwK(%^>;j|K=#@ydc(ooBen@ouPT8q9KY_sh{GSlgdT7le#(|Y=K~7L_ceS zwrSF9Pf4>{Q5AWSD{LHL*Bq^qyG8#(SY*7=eqsZRgHb?Mxog+Ul zkAp+h+`KY9{U=a;YCa&pGvF`VTfTVZAx!R5QiAuSx?}ACV3uZe2xknWa&5qP73bL#u;Ll^RQcYE(A5#>zK z$En7`Cip%q*WabKeSg3A_5EC*>wSIi&!@{=wnZ?PWKhxYWS=PcGN0K$U${2DYFKxr=HZ00 zI!a=4JEar>_)t*!1RPj$5*a+F3uIxaTETMH4!|)iRHHfl5p+~n?-%|iFktA_-VQ&O zWgaVfnHTC}v^uZEARj#wKH3}`vy<|9ai;Rm5YEYWGrAiS5XLo626$wz!76V+dHmOw z!d*N++qK1`(1&E2-xVZ_J-498&|rRvgMa~;+kEDM(dmWxs&q$2tALfwc;an-v5d#+ z@-{^R6k`3UjgLnHHx-Gg$Os|@Vpyp3s?E*+m~%F2btxBV5j!NlD<|iElUR36goLh& z$C&Eo_vENuvf2v~I#D_Yh#>%GT~;IH zU|3dz4k48dnkJWs7Y`ePTcNAVd3`O$aiq*mF1zkfV;bCjZH<2-*(O8gh!K9};F;p? zb^V~jZe8vBP$ej~wMoAlV{vnWKXf2@?V`B|_*n=jeAxkD=0kFAWqr4&G|1q?9N0fU zDgjSMbx9P!J8Wg6)?D|Q=`Y{XEB0<z9AWjVt>tHKF1WHS8`^uPM1x<+Ju_Xb?YS&P)ev94_9NWA8@b-`id|hQY^Z>m9MF3PhJ5_|;{Sq@QE8B?ifS6Zp3aqkq(eOr<>i46p=e7G9;h zX&6>EPrJ@txX(^xe&S<*0{{`|erd~Iq(q6x8*lcpr;^z>mhgC6SWGg=Bq+C?($&5D z?_;*33g#SPM|+pv7dD1z_~&}hOe@0kSt^o~$3Az=GZ9@C6&nkSIiMr(?U;DuQt$K2 zRKJfwd!OkGO~^f~Qm+HacA+lwUw;Wh+0&V<4il7hacSNpv#ap=bBvp)p6pETPDviS zrr0*P`$q>$Nn+3d3D&rI<{9XN==y+C1C1%!#L$>)6#TKFfLe3Df@-sP?;mtyylvQ% z!18iZs35WDjaG6cO4h|E(}*Ygur55n3m}O`5z8VFkA?h5)~rW-<)dSpfMC1ktFI*` z3nDwii6d{fvRMc=rQF-Ky}7x!v3BZh%S=~hkbvds@Diw?L`j9kRF-*24P2#u9xB}t z$E-j*k7otN!2hp-l#>*J6Ee26S9VF z(#bB{#xV$JU=~lYt?fy)+S<1*TBlg&rxwIF)^a;1@2 zTR*|^2jvK(=DYP(eMWMAe*KFV(_|7hhYzwK(ZdqrdF?d|yuTNoR%;-UI*7!hl6Jwt z{ONr3YVAJC1$jdE%g{p>IVUcj;zRqdG)Wd^f)AJxull97$9y6kx+7w%_&1s(7HTpK zmTsk|-v-EwFjJkg+JCmRGFCHEN)$Un*O|&KNc8(8(KrAPY_`X1A?YkVryPsJC?dkz zcV5$(n;lS-EJEH-T__;b-wGLAAI|K(=sKWw7MJp9HQb64mv(##R8VB(j#aj_8b$na zL1}}t*{%L}uvW{R8$^R5px$uZxbv25jr}-zg_*&xhxZR^|GN9MN0}Gp!)=Z)+1Y~A zwz!RjBCvRTEeHq)$X`_AwDp;CvoYnZ>c$~UCSd5rteb@QO||3vQ#MC7CCehvYl2X6 zMGf5w8BQAg5EBcN?%r*NU4w8{59B?@%79Tun!zA%WP!OG8bI>qQ0M>oV6Wnedo0_Qpo~lAwf~{>DG>uEwAb{?6&&ty2yCh4 zGkm+IUN~6h4PC+=vW^we?-IW2+nVGJ_8Za@wuP20k-GF~8t&H%P;t`JGZmKy(>r_e z+FVC#!~K)6o4gf5jIf!*4aBe_Aq@d9vfi$lQD3N#s_WopM6B_;%@K=(R5a=V&UUT3D7%^P8}7lMR13I_=21 z{(dsprjDr!`uctQ<34?i^`4vy_bq-6Rv19joX?&m%~Y?xb-ynZO5!aA zm%Ilmmf(Ryr^Psajr5vXyZCjaQ1M$bdLpA(dp#mL&i>kW8}zN${e&}ILEN{eEPf-^ z-4{c8vS@VyPun&i44#O(460xJCs+B)m-R#pz2j*#XD%2zx(OjIs*s@qNC>#gZs{!= zwMXGv%u&8+U0b|de$X2aZPNJ%%Kp9>+yXRh1GT?&Qre(SVWES)Q?A>Ur)Yv#T+aO{sppM`?CjFk*yPgG zJyET0US3z-i^75}FJ3&AeP6-m4qRcKy3cW%0OB+&x_u1D%{A3dMr+9Upf0|;QGmss zyIz<&z4d|OC{JuGALOSq)eAXP52qgC;GZMaStdm37HW<|eJDX!NbcBlYf}?OOe_$Y zyo?c=w+rKpiD@VR$}{nV{`jcGq;T%vb0Kgad$QS_Ta0*}qgeq4)f4fP0s9n>g@$Pn z`c;%0{TSIOjMXKc#Z#LmoNsaFQC9Zd-wPdrN=FKWs;=xis_c2fMw!;mN>BfWNp+eV zVFl8Q?{Sco_+3b0DJ@fN?$g%&Amj|?)j=DMk4=MNhIHU|5d)h( z-z$JZj+WHbIb+g9)-|w}z&>h~aQt|}g>~k*?5-W+l)=^4BSf1~3yS^t{k>tGt(UI+ zmZDseyMO_E{Fu)Pt&MS42Gg*>>KL8}eV?{+fF4hI`v7Cg z-6^hpKd-AL1vW3--NfkrQTBh{@B!Os4jB(S5vxMgv+lm z%PQSLB=PV)LhGyHpu$Uvp=_!eiJ`eVV9;Zsf5Ip?PyHFlyJgjQr8}>Hi_7WCv>6z{ zhS(Z|(kd5uAyy5*h)5U7j3OI&EA#5qTg!SK3t~RFCOt(Bb3ZRb_aZ$@JJ^yo_)8?g zVQBD_aAJbNuXMe#>5MEAF!1d8bD+5M^JGA=<$f{CSb5Re`4T#Es~2!REy9#7d82`j zoM?0?5Qu+;+P}xX?)KwcGH$aZq<9_97l+Ntj)xO$* z^a_XmvbZN+BgY}W#KjR#o%;EQ$=_oersk5kLYN(k04?Aswfx6Wp8}>I2ovBpyk!T5 zsT3tjrBcuI@p>3d;%&5dC(t*X)W`|;IW~%0U$@A@(JSX?Kt!}A3qG|o6oKLfGw{UN z84GdqN^MAz?3YjP(BDQf5m$I|7-Q3)OqMhnEjdyNR zi&IXGimG!J`R*zY+S=PU>Dxi2gnZ9cb2VyS#>omc16-=AQup6VWF)!sMmQN13N>nu zl9hGgm`u&Hx9lrwwQU(6ADK=tm83Fy|JFMPBm3kNkf_pM-r(Yz$AWXQY-~6hwLl~`$*R#=+ip8M`agF zf-)m6X251@4(nZ4;St?{Jn!AA=}`==mfJH;M3HEt>C`5SO`6}Pc~3o*mp+Cm0iW{Z zSk8_(L^CAXilDvUmUdC&G%b1%7#~ud;<&-*BOt-}3YPYRUa~~Go&(88H{<`8H?U06 z^f9ttG2hTC4fHe^N)G?S8`=`X{5R&C|MUOdXy--? z+nLmZ_grwsY8^Z7y!mLgf(HfwDGGR|VmbvC*1uF{$gf;q{8_`2J{FpOwrvyb>F=U0 z3OK0>6-6V~1agU>kz9wcGMj1{s%(wkfi%$|9X2dy{i$RQ%fy6)gyiHy=r=IKB_t$P z9@01iu+AM!NX52;MSy9LOj?_pqy0u#R<8TE)6@dOuxF8jAMnE*-3i-OetQGGPVfOg z{x{&|utRy=*Wi2i^xCg;XM{`aO9+w63ITF zA8|u#cH8@W@XsGsBMd$5MBrD@MY1+^PQxM&g*uF_UE_jqK-*Mc%Z-c}4D=^TV0%l8 z;fa67p*}z;|10l-!ll!DVYLNPd39xWpRzxs1u55F=AHc3ng zpaEjw+rnQ4x=X!4T_fJ4%$3F|3);R!5&Vp-~t`sC10n;=vI< z++>4(w}8^4K2!O>L(R_AQ+#_C&r8hwABP9XuoXgqph|tl#(#!mK!HAYwmL}i0MjGh zG7&JP9AliX!+DdA=TP;d1B<{9$$;sMAkY&+LVfU%`ZGJ_;e1xX6$1q1-JQ_F1Bi8v zL=H_ceArbZxI{oFadUftlxnByLRWZ+ll|)7TY11Ridc(?VDNpr8GN6<7^R>8;3pd< zpT`cp5g~@z1dF}QORGsry94|@NS!>dKjg*A7}e1{w6zVI&VpnMGey0~;>;0=6(1LKb3rIAf?NIJSL+#TIe; zO#vUsI69C)vNWiHg+`b+NR+EQZQHEtt?UK*o=e zIJ{yPiO~LV@XU|^#8Djm{%4sF$7G&he#66)2nfVD#*+8sY?+$*+2QSu?{^h>HC5UE zj=H7dU!^1Z(heg`o z5fL#0TZBrbs zl_!B#-)A}dt=0C-nKQiY(Ty|W^nrn<2o}TbjQ2MmKNh8||0Q>}WWT)pKQ<4EXUg3r z*hJZousUh_N!VTBgXRcrl2<$RpD^0G=g&RJnPho~5*i(DY>j{oX121-7r5~p;kqK? ujtn8ZkU@eMd<4AU_wa(t1TQ6@bsn)b*YFno1IT_%EV?I+v + + + + + +packages_user_uml + + + +0 + +icepyx.core + + + +1 + +icepyx.core.APIformatting + + + +2 + +icepyx.core.Earthdata + + + +3 + +icepyx.core.exceptions + + + +4 + +icepyx.core.geospatial + + + +5 + +icepyx.core.granules + + + +6 + +icepyx.core.icesat2data + + + +7 + +icepyx.core.is2ref + + + +8 + +icepyx.core.query + + + +8->2 + + + + + +8->5 + + + + + +10 + +icepyx.core.variables + + + +8->10 + + + + + +11 + +icepyx.core.visualization + + + +8->11 + + + + + +9 + +icepyx.core.validate_inputs + + + diff --git a/examples/ICESat-2_DAAC_DataAccess2_Subsetting.ipynb b/examples/ICESat-2_DAAC_DataAccess2_Subsetting.ipynb index 1ffcec167..9cd290201 100644 --- a/examples/ICESat-2_DAAC_DataAccess2_Subsetting.ipynb +++ b/examples/ICESat-2_DAAC_DataAccess2_Subsetting.ipynb @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -58,12 +58,12 @@ "source": [ "### Create a query object and log in to Earthdata\n", "\n", - "For this example, we'll be working with a sea ice dataset (ATL09) for an area along West Greenland (Disko Bay)." + "For this example, we'll be working with a sea ice product (ATL09) for an area along West Greenland (Disko Bay)." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -86,12 +86,12 @@ "source": [ "### Discover Subsetting Options\n", "\n", - "You can see what subsetting options are available for a given dataset by calling `show_custom_options()`. The options are presented as a series of headings followed by available values in square brackets. Headings are:\n", - "* **Subsetting Options**: whether or not temporal and spatial subsetting are available for the dataset\n", + "You can see what subsetting options are available for a given product by calling `show_custom_options()`. The options are presented as a series of headings followed by available values in square brackets. Headings are:\n", + "* **Subsetting Options**: whether or not temporal and spatial subsetting are available for the data product\n", "* **Data File Formats (Reformatting Options)**: return the data in a format other than the native hdf5 (submitted as a key=value kwarg to `order_granules(format='NetCDF4-CF')`)\n", - "* **Data File (Reformatting) Options Supporting Reprojection**: return the data in a reprojected reference frame. These will be available for gridded ICESat-2 L3B datasets.\n", + "* **Data File (Reformatting) Options Supporting Reprojection**: return the data in a reprojected reference frame. These will be available for gridded ICESat-2 L3B data products.\n", "* **Data File (Reformatting) Options NOT Supporting Reprojection**: data file formats that cannot be delivered with reprojection\n", - "* **Data Variables (also Subsettable)**: a dictionary of variable name keys and the paths to those variables available in the dataset" + "* **Data Variables (also Subsettable)**: a dictionary of variable name keys and the paths to those variables available in the product" ] }, { @@ -131,7 +131,7 @@ "source": [ "## About Data Variables in a query object\n", "There are two possible variable parameters associated with each ```query``` object.\n", - "1. `order_vars`, which is for interacting with variables during data querying, ordering, and downloading activities. `order_vars.wanted` holds the user's list to be submitted to the NSIDC subsetter and download a smaller, reproducible dataset.\n", + "1. `order_vars`, which is for interacting with variables during data querying, ordering, and downloading activities. `order_vars.wanted` holds the user's list to be submitted to the NSIDC subsetter and download a smaller, reproducible subset of the data product.\n", "2. `file_vars`, which is for interacting with variables associated with local files [not yet implemented].\n", "\n", "Each variables parameter (which is actually an associated Variables class object) has methods to:\n", @@ -139,7 +139,7 @@ "* append new variables to the wanted list (`append()` method).\n", "* remove variables from the wanted list (`remove()` method).\n", "\n", - "Each variables instance also has a set of attributes, including `avail` and `wanted` to indicate the list of variables that is available (unmutable, or unchangeable, as it is based on the input dataset specifications or files) and the list of variables that the user would like extracted (updateable with the `append` and `remove` methods), respectively. We'll showcase the use of all of these methods and attributes below." + "Each variables instance also has a set of attributes, including `avail` and `wanted` to indicate the list of variables that is available (unmutable, or unchangeable, as it is based on the input product specifications or files) and the list of variables that the user would like extracted (updateable with the `append` and `remove` methods), respectively. We'll showcase the use of all of these methods and attributes below." ] }, { @@ -147,7 +147,7 @@ "metadata": {}, "source": [ "### ICESat-2 data variables\n", - "ICESat-2 data is natively stored in a nested file format called hdf5. Much like a directory-file system on a computer, each variable (file) has a unique path through the heirarchy (directories) within the file. Thus, some variables (e.g. `'latitude'`, `'longitude'`) have multiple paths (one for each of the six beams in most datasets). \n", + "ICESat-2 data is natively stored in a nested file format called hdf5. Much like a directory-file system on a computer, each variable (file) has a unique path through the heirarchy (directories) within the file. Thus, some variables (e.g. `'latitude'`, `'longitude'`) have multiple paths (one for each of the six beams in most products). \n", "\n", "To increase readability, some display options (2 and 3, below) show the 200+ variable + path combinations as a dictionary where the keys are variable names and the values are the paths to that variable.\n", "\n", @@ -172,7 +172,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "By passing the boolean `options=True` to the `avail` method, you can obtain lists of unique possible variable inputs (var_list inputs) and path subdirectory inputs (keyword_list and beam_list inputs) for your dataset. These can be helpful for building your wanted variable list." + "By passing the boolean `options=True` to the `avail` method, you can obtain lists of unique possible variable inputs (var_list inputs) and path subdirectory inputs (keyword_list and beam_list inputs) for your data product. These can be helpful for building your wanted variable list." ] }, { @@ -199,14 +199,14 @@ "source": [ "### Building your wanted variable list\n", "\n", - "Now that you know which variables and path components are available for your dataset, you need to build a list of the ones you'd like included in your dataset. There are several options for generating your initial list as well as modifying it, giving the user complete control over the list submitted.\n", + "Now that you know which variables and path components are available for your product, you need to build a list of the ones you'd like included. There are several options for generating your initial list as well as modifying it, giving the user complete control over the list submitted.\n", "\n", "The options for building your initial list are:\n", - "1. Use a default list for the dataset (not yet fully implemented across all datasets. Have a default variable list for your field/dataset? Submit a pull request or post it as an issue on GitHub!)\n", + "1. Use a default list for the product (not yet fully implemented across all products. Have a default variable list for your field/product? Submit a pull request or post it as an issue on GitHub!)\n", "2. Provide a list of variable names\n", - "3. Provide a list of profiles/beams or other path keywords, where \"keywords\" are simply the unique subdirectory names contained in the full variable paths of the dataset. A full list of available keywords for the dataset is displayed in the error message upon entering `keyword_list=['']` into the `append` function (see below for an example) or by running `region_a.order_vars.avail(options=True)`, as above\n", + "3. Provide a list of profiles/beams or other path keywords, where \"keywords\" are simply the unique subdirectory names contained in the full variable paths of the product. A full list of available keywords for the product is displayed in the error message upon entering `keyword_list=['']` into the `append` function (see below for an example) or by running `region_a.order_vars.avail(options=True)`, as above\n", "\n", - "Note: all datasets have a short list of \"mandatory\" variables/paths (containing spacecraft orientation and time information needed to convert the data's `delta_time` to a readable datetime) that are automatically added to any built list. If you have any recommendations for other variables that should always be included (e.g. uncertainty information), please let us know!\n", + "Note: all products have a short list of \"mandatory\" variables/paths (containing spacecraft orientation and time information needed to convert the data's `delta_time` to a readable datetime) that are automatically added to any built list. If you have any recommendations for other variables that should always be included (e.g. uncertainty information), please let us know!\n", "\n", "Examples of using each method to build and modify your wanted variable list are below." ] @@ -234,7 +234,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The keywords available for this dataset are shown in the error message upon entering a blank keyword_list, as seen in the next cell." + "The keywords available for this product are shown in the error message upon entering a blank keyword_list, as seen in the next cell." ] }, { @@ -253,7 +253,7 @@ "### Modifying your wanted variable list\n", "\n", "Generating and modifying your variable request list, which is stored in `region_a.order_vars.wanted`, is controlled by the `append` and `remove` functions that operate on `region_a.order_vars.wanted`. The input options to `append` are as follows (the full documentation for this function can be found by executing `help(region_a.order_vars.append)`).\n", - "* `defaults` (default False) - include the default variable list for your dataset (not yet fully implemented for all datasets; please submit your default variable list for inclusion!)\n", + "* `defaults` (default False) - include the default variable list for your product (not yet fully implemented for all products; please submit your default variable list for inclusion!)\n", "* `var_list` (default None) - list of variables (entered as strings)\n", "* `beam_list` (default None) - list of beams/profiles (entered as strings)\n", "* `keyword_list` (default None) - list of keywords (entered as strings); use `keyword_list=['']` to obtain a list of available keywords\n", @@ -539,7 +539,7 @@ "source": [ "## Check the variable list in your downloaded file\n", "\n", - "Compare the available variables associated with the full dataset relative to those in your downloaded data file." + "Compare the available variables associated with the full product relative to those in your downloaded data file." ] }, { @@ -557,7 +557,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Check the downloaded dataset\n", + "#### Check the downloaded data\n", "Get all `latitude` variables in your downloaded file:" ] }, diff --git a/examples/ICESat-2_DAAC_DataAccess_Example.ipynb b/examples/ICESat-2_DAAC_DataAccess_Example.ipynb index abebc494d..bab5b9a95 100644 --- a/examples/ICESat-2_DAAC_DataAccess_Example.ipynb +++ b/examples/ICESat-2_DAAC_DataAccess_Example.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, "source": [ "## Accessing ICESat-2 Data\n", "### Data Query and Basic Download Example Notebook\n", @@ -13,30 +12,30 @@ "* original notebook by: Jessica Scheick\n", "* notebook contributors: Tyler Sutterley\n", "* source material: [NSIDC Data Access Notebook](https://github.com/ICESAT-2HackWeek/ICESat2_hackweek_tutorials/tree/master/03_NSIDCDataAccess_Steiker) by Amy Steiker and Bruce Wallin\n" - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Import packages, including icepyx" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "import icepyx as ipx\n", "import os\n", "import shutil\n", "%matplotlib inline" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Quick-Start\n", "\n", @@ -51,59 +50,60 @@ "where the function inputs are described in more detail below.\n", "\n", "**The rest of this notebook explains the required inputs used above, optional inputs not available in the minimal example, and the other data search and visualization tools built in to icepyx that make it easier for the user to find, explore, and download ICESat-2 data programmatically from NSIDC.** The detailed steps outlined and the methods showcased below are meant to give the user more control over the data they find and download (including options to order/download only the relevant portions of a data granule), some of which are called using default values behind the scenes if the user simply skips to the `download_granules` step." - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Create an ICESat-2 data object with the desired search parameters\n", "\n", "There are three required inputs, depending on how you want to search for data. Two are required in all cases:\n", - "- `short_name` = the dataset of interest, known as its \"short name\".\n", - "See https://nsidc.org/data/icesat-2/data-sets for a list of the available datasets.\n", + "- `short_name` = the data product of interest, known as its \"short name\".\n", + "See https://nsidc.org/data/icesat-2/data-sets for a list of the available data products.\n", "- `spatial extent` = a region of interest to search within. This can be entered as a bounding box, polygon vertex coordinate pairs, or a polygon geospatial file (currently shp, kml, and gpkg are supported).\n", " - bounding box: Given in decimal degrees for the lower left longitude, lower left latitude, upper right longitude, and upper right latitude\n", " - polygon vertices: Given as longitude, latitude coordinate pairs of decimal degrees with the last entry a repeat of the first.\n", " - polygon file: A string containing the full file path and name.\n", + " \n", + "*NOTE* The input keyword for `short_name` was updated from `dataset` to `product` to match common usage. This should not affect users providing positional inputs as demonstrated in this tutorial.\n", "\n", "Then, you must include AT LEAST one of the following inputs (temporal or orbital constraints):\n", "- `date_range` = the date range for which you would like to search for results. Must be formatted as a set of 'YYYY-MM-DD' strings.\n", - "- `cycles` = Which orbital cycle of the dataset to use, input as a numerical string or a list of strings. If no input is given, this value defaults to all available cycles within the search parameters. An orbital cycle refers to the 91-day repeat period of the ICESat-2 orbit.\n", - "- `tracks` = Which [Reference Ground Track (RGT)](https://icesat-2.gsfc.nasa.gov/science/specs) of the dataset to use, input as a numerical string or a list of strings. If no input is given, this value defaults to all available RGTs within the spatial and temporal search parameters.\n", + "- `cycles` = Which orbital cycle to use, input as a numerical string or a list of strings. If no input is given, this value defaults to all available cycles within the search parameters. An orbital cycle refers to the 91-day repeat period of the ICESat-2 orbit.\n", + "- `tracks` = Which [Reference Ground Track (RGT)](https://icesat-2.gsfc.nasa.gov/science/specs) to use, input as a numerical string or a list of strings. If no input is given, this value defaults to all available RGTs within the spatial and temporal search parameters.\n", "\n", "Below are examples of each type of spatial extent input using a date range and an example using orbital parameters. Please choose and run only one of the next three cells to set your spatial parameters." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# bounding box\n", "short_name = 'ATL06'\n", "spatial_extent = [-55, 68, -48, 71]\n", "date_range = ['2019-02-20','2019-02-28']" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# polygon vertices (here equivalent to the bounding box, above)\n", "short_name = 'ATL06'\n", "spatial_extent = [(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)]\n", "date_range = ['2019-02-20','2019-02-28']" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# polygon geospatial file (metadata match but no subset match)\n", "# short_name = 'ATL06'\n", @@ -114,242 +114,243 @@ "short_name = 'ATL06'\n", "spatial_extent = './supporting_files/data-access_PineIsland/glims_polygons.shp'\n", "date_range = ['2019-10-01','2019-10-05']" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Create the data object using our inputs" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "region_a = ipx.Query(short_name, spatial_extent, date_range)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ - "# using orbital parameters with one of the above datasets + spatial parameters\n", + "# using orbital parameters with one of the above data products + spatial parameters\n", "region_a = ipx.Query(short_name, spatial_extent,\n", " cycles=['03','04','05','06','07'], tracks=['0849','0902'])\n", "\n", - "print(region_a.dataset)\n", - "print(region_a.dataset_version)\n", + "print(region_a.product)\n", + "print(region_a.product_version)\n", "print(region_a.cycles)\n", "print(region_a.tracks)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "These properties include visualization of the spatial extent on a map. The style of map you will see depends on whether or not you have a certain library, `geoviews`, installed. Under the hood, this is because the `proj` library must be installed with conda (it is not available from PyPI) to support some `geoviews` dependencies. With `geoviews`, this plotting function returns an interactive map. Otherwise, your spatial extent will plot on a static map using `matplotlib`." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# print(region_a.spatial_extent)\n", "region_a.visualize_spatial_extent()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Formatted parameters and function calls allow us to see the the properties of the data object we have created." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ - "print(region_a.dataset)\n", + "print(region_a.product)\n", "print(region_a.dates)\n", "print(region_a.start_time)\n", "print(region_a.end_time)\n", "print(region_a.cycles)\n", "print(region_a.tracks)\n", - "print(region_a.dataset_version)\n", + "print(region_a.product_version)\n", "# print(region_a.spatial_extent)\n", "region_a.visualize_spatial_extent()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "There are also several optional inputs to allow the user finer control over their search. Start and end time are only valid inputs on a temporally limited search.\n", "- `start_time` = start time to search for data on the start date. If no input is given, this defaults to 00:00:00.\n", "- `end_time` = end time for the end date of the temporal search parameter. If no input is given, this defaults to 23:59:59. Times must be input as 'HH:mm:ss' strings.\n", - "- `version` = What version of the dataset to use, input as a numerical string. If no input is given, this value defaults to the most recent version of the dataset specified in `short_name`.\n", + "- `version` = What version of the data product to use, input as a numerical string. If no input is given, this value defaults to the most recent version of the product specified in `short_name`.\n", "\n", - "*NOTE* Version 002 is used as an example in the below cell. However, using it will cause 'no results' errors in granule ordering for some search parameters. These issues have been resolved in later versions of the datasets, so it is best to use the most recent version where possible. Thus, you will need to change the version associated with `region_a` and rerun the next cell for the rest of this notebook to run." - ] + "*NOTE* Version 002 is used as an example in the below cell. However, using it will cause 'no results' errors in granule ordering for some search parameters. These issues have been resolved in later versions of the data products, so it is best to use the most recent version where possible. Thus, you will need to change the version associated with `region_a` and rerun the next cell for the rest of this notebook to run." + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "region_a = ipx.Query(short_name, spatial_extent, date_range, \\\n", " start_time='03:30:00', end_time='21:30:00', version='002')\n", "\n", - "print(region_a.dataset)\n", + "print(region_a.product)\n", "print(region_a.dates)\n", "print(region_a.start_time)\n", "print(region_a.end_time)\n", - "print(region_a.dataset_version)\n", + "print(region_a.product_version)\n", "# print(region_a.spatial_extent)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Alternatively, you can also just create the data object without creating named variables first:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# region_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-01','2019-02-28'], \n", "# start_time='00:00:00', end_time='23:59:59', version='002')" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ - "### Built in methods allow us to get more information about our dataset\n", - "In addition to viewing the stored object information shown above (e.g. dataset, start and end date and time, version, etc.), we can also request summary information about the dataset itself or confirm that we have manually specified the latest version." - ] + "### Built in methods allow us to get more information about our data product\n", + "In addition to viewing the stored object information shown above (e.g. product short name, start and end date and time, version, etc.), we can also request summary information about the data product itself or confirm that we have manually specified the latest version." + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ - "region_a.dataset_summary_info()\n", + "region_a.product_summary_info()\n", "print(region_a.latest_version())" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ - "If the summary does not provide all of the information you are looking for, or you would like to see information for previous versions of the dataset, all available metadata for the collection dataset is available in a readable format." - ] + "If the summary does not provide all of the information you are looking for, or you would like to see information for previous versions of the data product, all available metadata for the collection product is available in a readable format." + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, + "source": [ + "region_a.product_all_info()" + ], + "outputs": [], "metadata": { "scrolled": true - }, - "outputs": [], - "source": [ - "region_a.dataset_all_info()" - ] + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ - "### Querying a dataset\n", - "In order to search the dataset collection for available data granules, we need to build our search parameters. This is done automatically behind the scenes when you run `region_a.avail_granules()`, but you can also build and view them by calling `region_a.CMRparams`. These are formatted as a dictionary of key:value pairs according to the CMR documentation." - ] + "### Querying a data product\n", + "In order to search the product collection for available data granules, we need to build our search parameters. This is done automatically behind the scenes when you run `region_a.avail_granules()`, but you can also build and view them by calling `region_a.CMRparams`. These are formatted as a dictionary of key:value pairs according to the CMR documentation." + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "#build and view the parameters that will be submitted in our query\n", "region_a.CMRparams" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Now that our parameter dictionary is constructed, we can search the CMR database for the available granules. Granules returned by the CMR metadata search are automatically stored within the data object. The search completed at this level relies completely on the granules' metadata. As a result, some (and in rare cases all) of the granules returned may not actually contain data in your specified region, particularly if the region is small or located near the boundaries of a given granule. If this is the case, the subsetter will not return any data when you actually place the order." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "#search for available granules and provide basic summary info about them\n", "region_a.avail_granules()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "#get a list of granule IDs for the available granules\n", "region_a.avail_granules(ids=True)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], "source": [ "#print detailed information about the returned search results\n", "region_a.granules.avail" - ] + ], + "outputs": [], + "metadata": { + "scrolled": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Downloading the found granules\n", "In order to download any data from NSIDC, we must first authenticate ourselves using a valid Earthdata login. This will create a valid token to interface with the DAAC as well as start an active logged-in session to enable data download. Once you have successfully logged in for a given query instance, the token and session will be passed behind the scenes as needed for you to order and download data. Passwords are entered but not shown or stored in plain text by the system." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "earthdata_uid = 'icepyx_devteam'\n", "email = 'icepyx.dev@gmail.com'\n", "region_a.earthdata_login(earthdata_uid, email)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Once we have generated our session, we must build the required configuration parameters needed to actually download data. These will tell the system how we want to download the data. As with the CMR search parameters, these will be built automatically when you run `region_a.order_granules()`, but you can also create and view them with `region_a.reqparams`. The default parameters, given below, should work for most users.\n", "- `page_size` = 10. This is the number of granules we will request per order.\n", @@ -364,106 +365,107 @@ "**Use the streaming `request_mode` with caution: While it can be beneficial to stream outputs directly to your local directory, note that timeout errors can result depending on the size of the request, and your request will not be queued in the system if NSIDC is experiencing high request volume. For best performance, NSIDC recommends setting `page_size=1` to download individual outputs, which will eliminate extra time needed to zip outputs and will ensure faster processing times per request.**\n", "\n", "Recall that we queried the total number and volume of granules prior to applying customization services. `page_size` and `page_num` can be used to adjust the number of granules per request up to a limit of 2000 granules for asynchronous, and 100 granules for synchronous (streaming). For now, let's select 9 granules to be processed in each zipped request. For ATL06, the granule size can exceed 100 MB so we want to choose a granule count that provides us with a reasonable zipped download size. " - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "print(region_a.reqparams)\n", "# region_a.reqparams['page_size'] = 9\n", "# print(region_a.reqparams)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### Additional Parameters: Subsetting\n", "\n", - "In addition to the required parameters (CMRparams and reqparams) that are submitted with our order, for ICESat-2 datasets we can also submit subsetting parameters to NSIDC. This utilizes the NSIDC's built in subsetter to extract only the data you are interested (spatially, temporally, variables of interest, etc.). The advantages of using the NSIDC's subsetter include:\n", + "In addition to the required parameters (CMRparams and reqparams) that are submitted with our order, for ICESat-2 data products we can also submit subsetting parameters to NSIDC. This utilizes the NSIDC's built in subsetter to extract only the data you are interested (spatially, temporally, variables of interest, etc.). The advantages of using the NSIDC's subsetter include:\n", "* easily reproducible downloads, particularly when coupled with and icepyx data object\n", "* smaller file size, meaning faster downloads, less storage required, and no need to subset the data on your own\n", "* still easy to go back and order more data/variables with the same or similar search parameters\n", "* no extraneous data means you can move directly to analysis and easily navigate your dataset\n", "\n", - "Certain subset parameters are specified by default unless `subset=False` is included as an input to `order_granules()`. A separate, companion notebook tutorial covers subsetting in more detail, including how to get a list of subsetting options, how to build your list of subsetting parameters, and how to generate a list of desired variables (most datasets have more than 200 variable fields!), including using pre-built default lists (these lists are still in progress and we welcome contributions!).\n", + "Certain subset parameters are specified by default unless `subset=False` is included as an input to `order_granules()`. A separate, companion notebook tutorial covers subsetting in more detail, including how to get a list of subsetting options, how to build your list of subsetting parameters, and how to generate a list of desired variables (most products have more than 200 variable fields!), including using pre-built default lists (these lists are still in progress and we welcome contributions!).\n", "\n", "As for the CMR and required parameters, default subset parameters can be built and viewed using `subsetparams`. Where an input spatial file is used, rather than a bounding box or manually entered polygon, the spatial file will be used for subsetting (unless subset is set to False) but not show up in the `subsetparams` dictionary." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "region_a.subsetparams()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "region_a._geom_filepath" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### Place the order\n", "Then, we can send the order to NSIDC using the order_granules function. Information about the granules ordered and their status will be printed automatically as well as emailed to the address provided. Additional information on the order, including request URLs, can be viewed by setting the optional keyword input 'verbose' to True." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "region_a.order_granules()\n", "#region_a.order_granules(verbose=True,subset=False)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "#view a short list of order IDs\n", "region_a.granules.orderIDs" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### Download the order\n", "Finally, we can download our order to a specified directory (which needs to have a full path but doesn't have to point to an existing directory) and the download status will be printed as the program runs. Additional information is again available by using the optional boolean keyword `verbose`." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "path = './download'\n", "region_a.download_granules(path)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "source": [], "outputs": [], - "source": [] + "metadata": {} } ], "metadata": { @@ -482,9 +484,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/ICESat-2_Data_Visualization_Example.ipynb b/examples/ICESat-2_Data_Visualization_Example.ipynb index e103fd7c7..9c47a7923 100644 --- a/examples/ICESat-2_Data_Visualization_Example.ipynb +++ b/examples/ICESat-2_Data_Visualization_Example.ipynb @@ -112,11 +112,11 @@ "metadata": {}, "outputs": [], "source": [ - "print(region.dataset)\n", + "print(region.product)\n", "print(region.dates)\n", "print(region.start_time)\n", "print(region.end_time)\n", - "print(region.dataset_version)\n", + "print(region.product_version)\n", "print(list(set(region.avail_granules(cycles=True)[0]))) #region.cycles\n", "print(list(set(region.avail_granules(tracks=True)[0]))) #region.tracks" ] @@ -194,7 +194,7 @@ "id": "b7082edd", "metadata": {}, "source": [ - "### Move on to data downloading from NSIDC if these are the datasets of interest\n", + "### Move on to data downloading from NSIDC if these are the products of interest\n", "\n", "For more details on the data ordering and downloading process, see [ICESat-2_DAAC_DataAccess_Example](https://github.com/icesat2py/icepyx/blob/main/examples/ICESat-2_DAAC_DataAccess_Example.ipynb)" ] @@ -257,7 +257,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/icepyx/core/APIformatting.py b/icepyx/core/APIformatting.py index 8be01c3ec..7c5c9b8a7 100644 --- a/icepyx/core/APIformatting.py +++ b/icepyx/core/APIformatting.py @@ -424,7 +424,7 @@ def build_params(self, **kwargs): May include optional keyword arguments to be passed to the subsetter. Valid keywords are time, bbox OR Boundingshape, format, projection, projection_parameters, and Coverage. - Keyword argument inputs for 'CMR' may include: dataset, version, start, end, extent_type, spatial_extent + Keyword argument inputs for 'CMR' may include: dataset (data product), version, start, end, extent_type, spatial_extent Keyword argument inputs for 'required' may include: page_size, page_num, request_mode, include_meta, client_string Keyword argument inputs for 'subset' may include: geom_filepath, start, end, extent_type, spatial_extent @@ -477,13 +477,13 @@ def build_params(self, **kwargs): assert self._fmted_keys[key] else: if key == "short_name": - self._fmted_keys.update({key: kwargs["dataset"]}) + self._fmted_keys.update({key: kwargs["product"]}) elif key == "version": self._fmted_keys.update({key: kwargs["version"]}) for key in opt_keys: if key == "Coverage" and key in kwargs.keys(): - # DevGoal: make there be an option along the lines of Coverage=default, which will get the default variables for that dataset without the user having to input is2obj.build_wanted_wanted_var_list as their input value for using the Coverage kwarg + # DevGoal: make there be an option along the lines of Coverage=default, which will get the default variables for that product without the user having to input is2obj.build_wanted_wanted_var_list as their input value for using the Coverage kwarg self._fmted_keys.update( {key: _fmt_var_subset_list(kwargs[key])} ) diff --git a/icepyx/core/granules.py b/icepyx/core/granules.py index def5cf626..9c5efab6e 100644 --- a/icepyx/core/granules.py +++ b/icepyx/core/granules.py @@ -186,7 +186,9 @@ def get_avail(self, CMRparams, reqparams): CMRparams, {k: reqparams[k] for k in ("page_size", "page_num")} ) response = requests.get( - granule_search_url, headers=headers, params=apifmt.to_string(params), + granule_search_url, + headers=headers, + params=apifmt.to_string(params), ) try: @@ -525,7 +527,7 @@ def download(self, verbose, path, session=None, restart=False): "Unable to download ", order, ". Check granule order for messages." ) # DevGoal: move this option back out to the is2class level and implement it in an alternate way? - # #Note: extract the dataset to save it locally + # #Note: extract the data to save it locally else: with zipfile.ZipFile(io.BytesIO(zip_response.content)) as z: for zfile in z.filelist: diff --git a/icepyx/core/is2ref.py b/icepyx/core/is2ref.py index ea6a43891..30c17bc00 100644 --- a/icepyx/core/is2ref.py +++ b/icepyx/core/is2ref.py @@ -8,13 +8,13 @@ # options to get customization options for ICESat-2 data (though could be used generally) -def _validate_dataset(dataset): +def _validate_product(product): """ - Confirm a valid ICESat-2 dataset was specified + Confirm a valid ICESat-2 product was specified """ - if isinstance(dataset, str): - dataset = str.upper(dataset) - assert dataset in [ + if isinstance(product, str): + product = str.upper(product) + assert product in [ "ATL01", "ATL02", "ATL03", @@ -27,10 +27,10 @@ def _validate_dataset(dataset): "ATL11", "ATL12", "ATL13", - ], "Please enter a valid dataset" + ], "Please enter a valid product" else: - raise TypeError("Please enter a dataset string") - return dataset + raise TypeError("Please enter a product string") + return product # DevGoal: See if there's a way to dynamically get this list so it's automatically updated @@ -56,25 +56,25 @@ def _validate_OA_product(product): # DevNote: test for this function is commented out; dates in some of the values were causing the test to fail... -def about_dataset(dset): +def about_product(prod): """ - Ping Earthdata to get metadata about the dataset of interest (the collection). + Ping Earthdata to get metadata about the product of interest (the collection). See Also -------- - query.Query.dataset_all_info + query.Query.product_all_info """ cmr_collections_url = "https://cmr.earthdata.nasa.gov/search/collections.json" - response = requests.get(cmr_collections_url, params={"short_name": dset}) + response = requests.get(cmr_collections_url, params={"short_name": prod}) results = json.loads(response.content) return results # DevGoal: use a mock of this output to test later functions, such as displaying options and widgets, etc. -def _get_custom_options(session, dataset, version): +def _get_custom_options(session, product, version): """ - Get lists of what customization options are available for the dataset from NSIDC. + Get lists of what customization options are available for the product from NSIDC. """ cust_options = {} @@ -84,7 +84,7 @@ def _get_custom_options(session, dataset, version): ) capability_url = ( - f"https://n5eil02u.ecs.nsidc.org/egi/capabilities/{dataset}.{version}.xml" + f"https://n5eil02u.ecs.nsidc.org/egi/capabilities/{product}.{version}.xml" ) response = session.get(capability_url) root = ET.fromstring(response.content) @@ -148,15 +148,15 @@ def get_varlist(elem): return cust_options -# DevGoal: populate this with default variable lists for all of the datasets! -# DevGoal: add a test for this function (to make sure it returns the right list, but also to deal with dataset not being in the list, though it should since it was checked as valid earlier...) -def _default_varlists(dataset): +# DevGoal: populate this with default variable lists for all of the products! +# DevGoal: add a test for this function (to make sure it returns the right list, but also to deal with product not being in the list, though it should since it was checked as valid earlier...) +def _default_varlists(product): """ Return a list of default variables to select and send to the NSIDC subsetter. """ common_list = ["delta_time", "latitude", "longitude"] - if dataset == "ATL06": + if product == "ATL06": return common_list + [ "h_li", "h_li_sigma", @@ -186,7 +186,7 @@ def _default_varlists(dataset): "tide_ocean", ] - elif dataset == "ATL07": + elif product == "ATL07": return common_list + [ "seg_dist_x", "height_segment_height", @@ -197,7 +197,7 @@ def _default_varlists(dataset): "height_segment_confidence", ] - elif dataset == "ATL09": + elif product == "ATL09": return common_list + [ "bsnow_h", "bsnow_dens", @@ -221,7 +221,7 @@ def _default_varlists(dataset): "apparent_surf_reflec", ] - elif dataset == "ATL10": + elif product == "ATL10": return common_list + [ "seg_dist_x", "lead_height", @@ -237,7 +237,7 @@ def _default_varlists(dataset): "height_segment_confidence", ] - elif dataset == "ATL11": + elif product == "ATL11": return common_list + [ "h_corr", "h_corr_sigma", @@ -247,6 +247,6 @@ def _default_varlists(dataset): else: print( - "THE REQUESTED DATASET DOES NOT YET HAVE A DEFAULT LIST SET UP. ONLY DELTA_TIME, LATITUTDE, AND LONGITUDE WILL BE RETURNED" + "THE REQUESTED PRODUCT DOES NOT YET HAVE A DEFAULT LIST SET UP. ONLY DELTA_TIME, LATITUTDE, AND LONGITUDE WILL BE RETURNED" ) return common_list diff --git a/icepyx/core/query.py b/icepyx/core/query.py index 7957b9090..6f2eebc70 100644 --- a/icepyx/core/query.py +++ b/icepyx/core/query.py @@ -27,15 +27,15 @@ class Query: """ ICESat-2 Data object to query, obtain, and perform basic operations on - available ICESat-2 datasets using temporal and spatial input parameters. + available ICESat-2 data products using temporal and spatial input parameters. Allows the easy input and formatting of search parameters to match the NASA NSIDC DAAC and (development goal-not yet implemented) conversion to multiple data types. Parameters ---------- - dataset : string - ICESat-2 dataset ID, also known as "short name" (e.g. ATL03). - Available datasets can be found at: https://nsidc.org/data/icesat-2/data-sets + product : string + ICESat-2 data product ID, also known as "short name" (e.g. ATL03). + Available data products can be found at: https://nsidc.org/data/icesat-2/data-sets spatial_extent : list or string Spatial extent of interest, provided as a bounding box, list of polygon coordinates, or geospatial polygon file. @@ -64,14 +64,16 @@ class Query: End time in UTC/Zulu (24 hour clock). If None, use default. DevGoal: check for time in date-range date-time object, if that's used for input. version : string, default most recent version - Dataset version, given as a 3 digit string. If no version is given, the current - version is used. - cycle : string, default all available orbital cycles - Dataset cycle, given as a 2 digit string. If no cycle is given, all available - cycles are used. - track : string, default all available reference ground tracks (RGTs) - Dataset track, given as a 4 digit string. If no track is given, all available - reference ground tracks are used. + Product version, given as a 3 digit string. If no version is given, the current + version is used. Example: "004" + cycles : string or a list of strings, default all available orbital cycles + Product cycle, given as a 2 digit string. If no cycle is given, all available + cycles are used. Example: "04" + tracks : string or a list of strings, default all available reference ground tracks (RGTs) + Product track, given as a 4 digit string. If no track is given, all available + reference ground tracks are used. Example: "0594" + files : string, default None + A placeholder for future development. Not used for any purposes yet. Returns ------- @@ -109,7 +111,7 @@ class Query: def __init__( self, - dataset=None, + product=None, spatial_extent=None, date_range=None, start_time=None, @@ -117,14 +119,14 @@ def __init__( version=None, cycles=None, tracks=None, - files=None, + files=None, # NOTE: if you end up implemeting this feature here, use a better variable name than "files" ): # warnings.filterwarnings("always") # warnings.warn("Please note: as of 2020-05-05, a major reorganization of the core icepyx.query code may result in errors produced by now depricated functions. Please see our documentation pages or example notebooks for updates.") if ( - (dataset is None or spatial_extent is None) + (product is None or spatial_extent is None) and (date_range is None or cycles is None or tracks is None) and files is None ): @@ -140,7 +142,7 @@ def __init__( # self.order_vars = Variables(self._source) # self.variables = Variables(self._source) - self._dset = is2ref._validate_dataset(dataset) + self._prod = is2ref._validate_product(product) self.extent_type, self._spat_extent, self._geom_filepath = val.spatial( spatial_extent @@ -149,7 +151,7 @@ def __init__( if date_range: self._start, self._end = val.temporal(date_range, start_time, end_time) - self._version = val.dset_version(self.latest_version(), version) + self._version = val.prod_version(self.latest_version(), version) # build list of available CMR parameters if reducing by cycle or RGT # or a list of explicitly named files (full or partial names) @@ -160,7 +162,7 @@ def __init__( self._tracks = val.tracks(tracks) # create list of CMR parameters for granule name self._readable_granule_name = apifmt._fmt_readable_granules( - self._dset, cycles=self.cycles, tracks=self.tracks + self._prod, cycles=self.cycles, tracks=self.tracks ) # ---------------------------------------------------------------------- @@ -169,29 +171,44 @@ def __init__( @property def dataset(self): """ - Return the short name dataset ID string associated with the query object. + Legacy property included to provide depracation warning. + + See Also + -------- + product + """ + warnings.filterwarnings("always") + warnings.warn( + "In line with most common usage, 'dataset' has been replaced by 'product'.", + DeprecationWarning, + ) + + @property + def product(self): + """ + Return the short name product ID string associated with the query object. Examples -------- >>> reg_a = icepyx.query.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) - >>> reg_a.dataset + >>> reg_a.product 'ATL06' """ - return self._dset + return self._prod @property - def dataset_version(self): + def product_version(self): """ - Return the dataset version of the data object. + Return the product version of the data object. Examples -------- >>> reg_a = icepyx.query.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) - >>> reg_a.dataset_version + >>> reg_a.product_version '003' >>> reg_a = icepyx.query.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28'], version='1') - >>> reg_a.dataset_version + >>> reg_a.product_version '001' """ return self._version @@ -352,7 +369,7 @@ def CMRparams(self): if self._CMRparams.fmted_keys == {}: self._CMRparams.build_params( - dataset=self.dataset, + product=self.product, version=self._version, extent_type=self.extent_type, spatial_extent=self._spat_extent, @@ -468,14 +485,14 @@ def order_vars(self): self._order_vars = Variables( self._source, session=self._session, - dataset=self.dataset, + product=self.product, avail=self._cust_options["variables"], ) else: self._order_vars = Variables( self._source, session=self._session, - dataset=self.dataset, + product=self.product, version=self._version, ) @@ -508,7 +525,7 @@ def file_vars(self): if not hasattr(self, "_file_vars"): if self._source == "file": - self._file_vars = Variables(self._source, dataset=self.dataset) + self._file_vars = Variables(self._source, product=self.product) return self._file_vars @@ -516,7 +533,7 @@ def file_vars(self): def granules(self): """ Return the granules object, which provides the underlying funtionality for searching, ordering, - and downloading granules for the specified dataset. Users are encouraged to use the built in wrappers + and downloading granules for the specified product. Users are encouraged to use the built in wrappers rather than trying to access the granules object themselves. See Also @@ -541,18 +558,18 @@ def granules(self): return self._granules # ---------------------------------------------------------------------- - # Methods - Get and display neatly information at the dataset level + # Methods - Get and display neatly information at the product level - def dataset_summary_info(self): + def product_summary_info(self): """ - Display a summary of selected metadata for the specified version of the dataset + Display a summary of selected metadata for the specified version of the product of interest (the collection). Examples -------- >>> reg_a = icepyx.query.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) - >>> reg_a.dataset_summary_info() - dataset_id : ATLAS/ICESat-2 L3A Land Ice Height V002 + >>> reg_a.product_summary_info() + title : ATLAS/ICESat-2 L3A Land Ice Height V002 short_name : ATL06 version_id : 002 time_start : 2018-10-14T00:00:00.000Z @@ -560,10 +577,10 @@ def dataset_summary_info(self): summary : This data set (ATL06) provides geolocated, land-ice surface heights (above the WGS 84 ellipsoid, ITRF2014 reference frame), plus ancillary parameters that can be used to interpret and assess the quality of the height estimates. The data were acquired by the Advanced Topographic Laser Altimeter System (ATLAS) instrument on board the Ice, Cloud and land Elevation Satellite-2 (ICESat-2) observatory. orbit_parameters : {'swath_width': '36.0', 'period': '94.29', 'inclination_angle': '92.0', 'number_of_orbits': '0.071428571', 'start_circular_latitude': '0.0'} """ - if not hasattr(self, "_about_dataset"): - self._about_dataset = is2ref.about_dataset(self._dset) + if not hasattr(self, "_about_product"): + self._about_product = is2ref.about_product(self._prod) summ_keys = [ - "dataset_id", + "title", "short_name", "version_id", "time_start", @@ -572,26 +589,26 @@ def dataset_summary_info(self): "orbit_parameters", ] for key in summ_keys: - print(key, ": ", self._about_dataset["feed"]["entry"][-1][key]) + print(key, ": ", self._about_product["feed"]["entry"][-1][key]) - def dataset_all_info(self): + def product_all_info(self): """ - Display all metadata about the dataset of interest (the collection). + Display all metadata about the product of interest (the collection). Examples -------- >>> reg_a = icepyx.query.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) - >>> reg_a.dataset_all_info() + >>> reg_a.product_all_info() {very long prettily-formatted dictionary output} """ - if not hasattr(self, "_about_dataset"): - self._about_dataset = is2ref.about_dataset(self._dset) - pprint.pprint(self._about_dataset) + if not hasattr(self, "_about_product"): + self._about_product = is2ref.about_product(self._prod) + pprint.pprint(self._about_product) def latest_version(self): """ - Determine the most recent version available for the given dataset. + Determine the most recent version available for the given product. Examples -------- @@ -599,15 +616,15 @@ def latest_version(self): >>> reg_a.latest_version() '003' """ - if not hasattr(self, "_about_dataset"): - self._about_dataset = is2ref.about_dataset(self._dset) + if not hasattr(self, "_about_product"): + self._about_product = is2ref.about_product(self._prod) return max( - [entry["version_id"] for entry in self._about_dataset["feed"]["entry"]] + [entry["version_id"] for entry in self._about_product["feed"]["entry"]] ) def show_custom_options(self, dictview=False): """ - Display customization/subsetting options available for this dataset. + Display customization/subsetting options available for this product. Parameters ---------- @@ -668,7 +685,7 @@ def show_custom_options(self, dictview=False): all(key in self._cust_options.keys() for key in keys) except AttributeError or KeyError: self._cust_options = is2ref._get_custom_options( - self._session, self.dataset, self._version + self._session, self.product, self._version ) for h, k in zip(headers, keys): @@ -705,7 +722,7 @@ def earthdata_login(self, uid, email): Earthdata Login password: ········ """ - capability_url = f"https://n5eil02u.ecs.nsidc.org/egi/capabilities/{self.dataset}.{self._version}.xml" + capability_url = f"https://n5eil02u.ecs.nsidc.org/egi/capabilities/{self.product}.{self._version}.xml" self._session = Earthdata(uid, email, capability_url).login() self._email = email diff --git a/icepyx/core/validate_inputs.py b/icepyx/core/validate_inputs.py index d5278bb59..3e5aad827 100644 --- a/icepyx/core/validate_inputs.py +++ b/icepyx/core/validate_inputs.py @@ -8,9 +8,9 @@ import icepyx.core.geospatial as geospatial -def dset_version(latest_vers, version): +def prod_version(latest_vers, version): """ - Check if the submitted dataset version is valid, and warn the user if a newer version is available. + Check if the submitted product version is valid, and warn the user if a newer version is available. """ if version is None: vers = latest_vers @@ -24,7 +24,7 @@ def dset_version(latest_vers, version): if int(vers) < int(latest_vers): warnings.filterwarnings("always") - warnings.warn("You are using an old version of this dataset") + warnings.warn("You are using an old version of this product") return vers @@ -114,7 +114,7 @@ def spatial(spatial_extent): Validate the input spatial extent and return the needed parameters to the query object. """ - scalar_types = (np.int, np.float, np.int64) + scalar_types = (int, float, np.int64) if isinstance(spatial_extent, (list, np.ndarray)): diff --git a/icepyx/core/variables.py b/icepyx/core/variables.py index 945680a24..db65426ad 100644 --- a/icepyx/core/variables.py +++ b/icepyx/core/variables.py @@ -11,7 +11,7 @@ class Variables: """ Get, create, interact, and manipulate lists of variables and variable paths - contained in ICESat-2 datasets. + contained in ICESat-2 products. Parameters ---------- @@ -27,12 +27,12 @@ class Variables: A session object authenticating the user to download data using their Earthdata login information. The session object will automatically be passed from the query object if you have successfully logged in there. - dataset : string, default None - Properly formatted string specifying a valid ICESat-2 dataset + product : string, default None + Properly formatted string specifying a valid ICESat-2 product version : string, default None - Properly formatted string specifying a valid version of the ICESat-2 dataset - source : string, default None - For vartype file, a path to a directory or single input source files (not yet implemented) + Properly formatted string specifying a valid version of the ICESat-2 product + path : string, default None + For vartype file, a path to a directory of or single input data file (not yet implemented) """ def __init__( @@ -41,15 +41,15 @@ def __init__( avail=None, wanted=None, session=None, - dataset=None, + product=None, version=None, - source=None, + path=None, ): assert vartype in ["order", "file"], "Please submit a valid variables type flag" self._vartype = vartype - self.dataset = dataset + self.product = product self._avail = avail self.wanted = wanted self._session = session @@ -61,7 +61,7 @@ def __init__( self._version = version elif self._vartype == "file": # DevGoal: check that the list or string are valid dir/files - self.source = source + self.path = path # @property # def wanted(self): @@ -69,7 +69,7 @@ def __init__( def avail(self, options=False, internal=False): """ - Get the list of available variables and variable paths from the input dataset + Get the list of available variables and variable paths from the input data product Examples -------- @@ -92,7 +92,7 @@ def avail(self, options=False, internal=False): if not hasattr(self, "_avail") or self._avail == None: if self._vartype == "order": self._avail = is2ref._get_custom_options( - self._session, self.dataset, self._version + self._session, self.product, self._version )["variables"] elif self._vartype == "file": @@ -205,14 +205,14 @@ def _check_valid_lists( self, vgrp, allpaths, var_list=None, beam_list=None, keyword_list=None ): """ - Check that the user is requesting valid paths and/or variables for their dataset. + Check that the user is requesting valid paths and/or variables for their product. See self.append() for further details on the list of input parameters. Parameters: ----------- vgrp : dict - Dictionary containing dataset variables as keys + Dictionary containing product variables as keys allpaths : list List of all potential path keywords @@ -227,7 +227,7 @@ def _check_valid_lists( List of user requested variable path keywords """ - # check if the list of variables, if specified, are available in the dataset + # check if the list of variables, if specified, are available in the product if var_list is not None: for var_id in var_list: if var_id not in vgrp.keys(): @@ -237,8 +237,8 @@ def _check_valid_lists( raise ValueError(err_msg_varid) # DevGoal: is there a way to not have this hard-coded in? - # check if the list of beams, if specified, are available in the dataset - if self.dataset == "ATL09": + # check if the list of beams, if specified, are available in the product + if self.product == "ATL09": beam_avail = ["profile_" + str(i + 1) for i in range(3)] else: beam_avail = ["gt" + str(i + 1) + "l" for i in range(3)] @@ -251,7 +251,7 @@ def _check_valid_lists( err_msg_beam = err_msg_beam + ", ".join(beam_avail) raise ValueError(err_msg_beam) - # check if keywords, if specified, are available for the dataset + # check if keywords, if specified, are available for the product if keyword_list is not None: for kw in keyword_list: # assert kw in allpaths, "Invalid keyword. Please select from: " + ', '.join(allpaths) @@ -269,7 +269,7 @@ def _get_sum_varlist(self, var_list, all_vars, defaults): """ sum_varlist = [] if defaults == True: - sum_varlist = sum_varlist + is2ref._default_varlists(self.dataset) + sum_varlist = sum_varlist + is2ref._default_varlists(self.product) if var_list is not None: for vn in var_list: if vn not in sum_varlist: @@ -354,11 +354,11 @@ def append(self, defaults=False, var_list=None, beam_list=None, keyword_list=Non beam_list : list of strings, default None A list of beam strings, if only selected beams are wanted (the default value of None will automatically include all beams). For ATL09, acceptable values are ['profile_1', 'profile_2', 'profile_3']. - For all other datasets, acceptable values are ['gt1l', 'gt1r', 'gt2l', 'gt2r', 'gt3l', 'gt3r']. + For all other products, acceptable values are ['gt1l', 'gt1r', 'gt2l', 'gt2r', 'gt3l', 'gt3r']. keyword_list : list of strings, default None A list of subdirectory names (keywords), from any heirarchy level within the data structure, to select variables within - the dataset that include that keyword in their path. A list of availble keywords can be obtained by + the product that include that keyword in their path. A list of availble keywords can be obtained by entering `keyword_list=['']` into the function. Notes @@ -468,11 +468,11 @@ def remove(self, all=False, var_list=None, beam_list=None, keyword_list=None): beam_list : list of strings, default None A list of beam strings, if only selected beams are wanted (the default value of None will automatically include all beams). For ATL09, acceptable values are ['profile_1', 'profile_2', 'profile_3']. - For all other datasets, acceptable values are ['gt1l', 'gt1r', 'gt2l', 'gt2r', 'gt3l', 'gt3r']. + For all other products, acceptable values are ['gt1l', 'gt1r', 'gt2l', 'gt2r', 'gt3l', 'gt3r']. keyword_list : list of strings, default None A list of subdirectory names (keywords), from any heirarchy level within the data structure, to select variables within - the dataset that include that keyword in their path. + the product that include that keyword in their path. Notes ----- diff --git a/icepyx/core/visualization.py b/icepyx/core/visualization.py index 05920285e..c16e5f7ca 100644 --- a/icepyx/core/visualization.py +++ b/icepyx/core/visualization.py @@ -117,7 +117,7 @@ class Visualize: query_obj : ipx.Query object, default None icepy Query class object. product : string - ICESat-2 product ID; equivalent to the Query object dataset + ICESat-2 product ID spatial_extent: list or string, default None as in the ipx.Query object date_range : list of 'YYYY-MM-DD' strings, default None @@ -146,14 +146,14 @@ def __init__( pass else: query_obj = ipx.Query( - dataset=product, + product=product, spatial_extent=spatial_extent, date_range=date_range, cycles=cycles, tracks=tracks, ) - self.product = is2ref._validate_OA_product(query_obj.dataset) + self.product = is2ref._validate_OA_product(query_obj.product) if query_obj.extent_type == "bounding_box": self.bbox = query_obj._spat_extent @@ -238,14 +238,17 @@ def query_icesat2_filelist(self) -> tuple: for bbox_i in bbox_list: - region = ipx.Query( - self.product, - bbox_i, - self.date_range, - cycles=self.cycles, - tracks=self.tracks, - ) - icesat2_files = region.avail_granules(ids=True)[0] + try: + region = ipx.Query( + self.product, + bbox_i, + self.date_range, + cycles=self.cycles, + tracks=self.tracks, + ) + icesat2_files = region.avail_granules(ids=True)[0] + except (AttributeError, AssertionError): + continue if not icesat2_files: continue @@ -408,6 +411,8 @@ def parallel_request_OA(self) -> da.array: # generate parameter lists for OA requesting OA_para_list = self.generate_OA_parameters() + assert OA_para_list, "Your search returned no results; try different search parameters" + url_number = len(OA_para_list) if url_number > 200: @@ -489,7 +494,11 @@ def viz_elevation(self) -> (hv.DynamicMap, hv.Layout): dset = hv.Dataset(ddf_new) raster_cycle = dset.to( - hv.Points, ["x", "y"], ["elevation"], groupby=["cycle"], dynamic=True, + hv.Points, + ["x", "y"], + ["elevation"], + groupby=["cycle"], + dynamic=True, ) raster_rgt = dset.to( hv.Points, ["x", "y"], ["elevation"], groupby=["rgt"], dynamic=True diff --git a/icepyx/tests/ATL06v04_options.json b/icepyx/tests/ATL06v04_options.json new file mode 100644 index 000000000..0fc236fe8 --- /dev/null +++ b/icepyx/tests/ATL06v04_options.json @@ -0,0 +1 @@ +{"options": [{"id": "ICESAT2", "spatialSubsetting": "true", "spatialSubsettingShapefile": "true", "temporalSubsetting": "true", "type": "both", "maxGransSyncRequest": "100", "maxGransAsyncRequest": "2000"}], "fileformats": ["TABULAR_ASCII", "NetCDF4-CF", "Shapefile", "NetCDF-3"], "reprojectionONLY": [], "noproj": [], "formatreproj": ["TABULAR_ASCII", "NetCDF4-CF", "Shapefile", "NetCDF-3"], "variables": ["ancillary_data/atlas_sdp_gps_epoch", "ancillary_data/control", "ancillary_data/data_end_utc", "ancillary_data/data_start_utc", "ancillary_data/end_cycle", "ancillary_data/end_delta_time", "ancillary_data/end_geoseg", "ancillary_data/end_gpssow", "ancillary_data/end_gpsweek", "ancillary_data/end_orbit", "ancillary_data/end_region", "ancillary_data/end_rgt", "ancillary_data/granule_end_utc", "ancillary_data/granule_start_utc", "ancillary_data/qa_at_interval", "ancillary_data/release", "ancillary_data/start_cycle", "ancillary_data/start_delta_time", "ancillary_data/start_geoseg", "ancillary_data/start_gpssow", "ancillary_data/start_gpsweek", "ancillary_data/start_orbit", "ancillary_data/start_region", "ancillary_data/start_rgt", "ancillary_data/version", "ancillary_data/land_ice/dt_hist", "ancillary_data/land_ice/fit_maxiter", "ancillary_data/land_ice/fpb_maxiter", "ancillary_data/land_ice/max_res_ids", "ancillary_data/land_ice/min_dist", "ancillary_data/land_ice/min_gain_th", "ancillary_data/land_ice/min_n_pe", "ancillary_data/land_ice/min_n_sel", "ancillary_data/land_ice/min_signal_conf", "ancillary_data/land_ice/n_hist", "ancillary_data/land_ice/nhist_bins", "ancillary_data/land_ice/n_sigmas", "ancillary_data/land_ice/proc_interval", "ancillary_data/land_ice/qs_lim_bsc", "ancillary_data/land_ice/qs_lim_hrs", "ancillary_data/land_ice/qs_lim_hsigma", "ancillary_data/land_ice/qs_lim_msw", "ancillary_data/land_ice/qs_lim_snr", "ancillary_data/land_ice/qs_lim_sss", "ancillary_data/land_ice/rbin_width", "ancillary_data/land_ice/sigma_beam", "ancillary_data/land_ice/sigma_tx", "ancillary_data/land_ice/t_dead", "ancillary_data/land_ice/txp_maxiter", "gt1l/land_ice_segments/atl06_quality_summary", "gt1l/land_ice_segments/delta_time", "gt1l/land_ice_segments/h_li", "gt1l/land_ice_segments/h_li_sigma", "gt1l/land_ice_segments/latitude", "gt1l/land_ice_segments/longitude", "gt1l/land_ice_segments/segment_id", "gt1l/land_ice_segments/sigma_geo_h", "gt1l/land_ice_segments/bias_correction/fpb_mean_corr", "gt1l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt1l/land_ice_segments/bias_correction/fpb_med_corr", "gt1l/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt1l/land_ice_segments/bias_correction/fpb_n_corr", "gt1l/land_ice_segments/bias_correction/med_r_fit", "gt1l/land_ice_segments/bias_correction/tx_mean_corr", "gt1l/land_ice_segments/bias_correction/tx_med_corr", "gt1l/land_ice_segments/dem/dem_flag", "gt1l/land_ice_segments/dem/dem_h", "gt1l/land_ice_segments/dem/geoid_free2mean", "gt1l/land_ice_segments/dem/geoid_h", "gt1l/land_ice_segments/fit_statistics/dh_fit_dx", "gt1l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt1l/land_ice_segments/fit_statistics/dh_fit_dy", "gt1l/land_ice_segments/fit_statistics/h_expected_rms", "gt1l/land_ice_segments/fit_statistics/h_mean", "gt1l/land_ice_segments/fit_statistics/h_rms_misfit", "gt1l/land_ice_segments/fit_statistics/h_robust_sprd", "gt1l/land_ice_segments/fit_statistics/n_fit_photons", "gt1l/land_ice_segments/fit_statistics/n_seg_pulses", "gt1l/land_ice_segments/fit_statistics/sigma_h_mean", "gt1l/land_ice_segments/fit_statistics/signal_selection_source", "gt1l/land_ice_segments/fit_statistics/signal_selection_source_status", "gt1l/land_ice_segments/fit_statistics/snr", "gt1l/land_ice_segments/fit_statistics/snr_significance", "gt1l/land_ice_segments/fit_statistics/w_surface_window_final", "gt1l/land_ice_segments/geophysical/bckgrd", "gt1l/land_ice_segments/geophysical/bsnow_conf", "gt1l/land_ice_segments/geophysical/bsnow_h", "gt1l/land_ice_segments/geophysical/bsnow_od", "gt1l/land_ice_segments/geophysical/cloud_flg_asr", "gt1l/land_ice_segments/geophysical/cloud_flg_atm", "gt1l/land_ice_segments/geophysical/dac", "gt1l/land_ice_segments/geophysical/e_bckgrd", "gt1l/land_ice_segments/geophysical/layer_flag", "gt1l/land_ice_segments/geophysical/msw_flag", "gt1l/land_ice_segments/geophysical/neutat_delay_total", "gt1l/land_ice_segments/geophysical/r_eff", "gt1l/land_ice_segments/geophysical/solar_azimuth", "gt1l/land_ice_segments/geophysical/solar_elevation", "gt1l/land_ice_segments/geophysical/tide_earth", "gt1l/land_ice_segments/geophysical/tide_earth_free2mean", "gt1l/land_ice_segments/geophysical/tide_equilibrium", "gt1l/land_ice_segments/geophysical/tide_load", "gt1l/land_ice_segments/geophysical/tide_ocean", "gt1l/land_ice_segments/geophysical/tide_pole", "gt1l/land_ice_segments/ground_track/ref_azimuth", "gt1l/land_ice_segments/ground_track/ref_coelv", "gt1l/land_ice_segments/ground_track/seg_azimuth", "gt1l/land_ice_segments/ground_track/sigma_geo_at", "gt1l/land_ice_segments/ground_track/sigma_geo_r", "gt1l/land_ice_segments/ground_track/sigma_geo_xt", "gt1l/land_ice_segments/ground_track/x_atc", "gt1l/land_ice_segments/ground_track/y_atc", "gt1l/residual_histogram/bckgrd_per_m", "gt1l/residual_histogram/bin_top_h", "gt1l/residual_histogram/count", "gt1l/residual_histogram/delta_time", "gt1l/residual_histogram/ds_segment_id", "gt1l/residual_histogram/lat_mean", "gt1l/residual_histogram/lon_mean", "gt1l/residual_histogram/pulse_count", "gt1l/residual_histogram/segment_id_list", "gt1l/residual_histogram/x_atc_mean", "gt1l/segment_quality/delta_time", "gt1l/segment_quality/record_number", "gt1l/segment_quality/reference_pt_lat", "gt1l/segment_quality/reference_pt_lon", "gt1l/segment_quality/segment_id", "gt1l/segment_quality/signal_selection_source", "gt1l/segment_quality/signal_selection_status/signal_selection_status_all", "gt1l/segment_quality/signal_selection_status/signal_selection_status_backup", "gt1l/segment_quality/signal_selection_status/signal_selection_status_confident", "gt1r/land_ice_segments/atl06_quality_summary", "gt1r/land_ice_segments/delta_time", "gt1r/land_ice_segments/h_li", "gt1r/land_ice_segments/h_li_sigma", "gt1r/land_ice_segments/latitude", "gt1r/land_ice_segments/longitude", "gt1r/land_ice_segments/segment_id", "gt1r/land_ice_segments/sigma_geo_h", "gt1r/land_ice_segments/bias_correction/fpb_mean_corr", "gt1r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt1r/land_ice_segments/bias_correction/fpb_med_corr", "gt1r/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt1r/land_ice_segments/bias_correction/fpb_n_corr", "gt1r/land_ice_segments/bias_correction/med_r_fit", "gt1r/land_ice_segments/bias_correction/tx_mean_corr", "gt1r/land_ice_segments/bias_correction/tx_med_corr", "gt1r/land_ice_segments/dem/dem_flag", "gt1r/land_ice_segments/dem/dem_h", "gt1r/land_ice_segments/dem/geoid_free2mean", "gt1r/land_ice_segments/dem/geoid_h", "gt1r/land_ice_segments/fit_statistics/dh_fit_dx", "gt1r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt1r/land_ice_segments/fit_statistics/dh_fit_dy", "gt1r/land_ice_segments/fit_statistics/h_expected_rms", "gt1r/land_ice_segments/fit_statistics/h_mean", "gt1r/land_ice_segments/fit_statistics/h_rms_misfit", "gt1r/land_ice_segments/fit_statistics/h_robust_sprd", "gt1r/land_ice_segments/fit_statistics/n_fit_photons", "gt1r/land_ice_segments/fit_statistics/n_seg_pulses", "gt1r/land_ice_segments/fit_statistics/sigma_h_mean", "gt1r/land_ice_segments/fit_statistics/signal_selection_source", "gt1r/land_ice_segments/fit_statistics/signal_selection_source_status", "gt1r/land_ice_segments/fit_statistics/snr", "gt1r/land_ice_segments/fit_statistics/snr_significance", "gt1r/land_ice_segments/fit_statistics/w_surface_window_final", "gt1r/land_ice_segments/geophysical/bckgrd", "gt1r/land_ice_segments/geophysical/bsnow_conf", "gt1r/land_ice_segments/geophysical/bsnow_h", "gt1r/land_ice_segments/geophysical/bsnow_od", "gt1r/land_ice_segments/geophysical/cloud_flg_asr", "gt1r/land_ice_segments/geophysical/cloud_flg_atm", "gt1r/land_ice_segments/geophysical/dac", "gt1r/land_ice_segments/geophysical/e_bckgrd", "gt1r/land_ice_segments/geophysical/layer_flag", "gt1r/land_ice_segments/geophysical/msw_flag", "gt1r/land_ice_segments/geophysical/neutat_delay_total", "gt1r/land_ice_segments/geophysical/r_eff", "gt1r/land_ice_segments/geophysical/solar_azimuth", "gt1r/land_ice_segments/geophysical/solar_elevation", "gt1r/land_ice_segments/geophysical/tide_earth", "gt1r/land_ice_segments/geophysical/tide_earth_free2mean", "gt1r/land_ice_segments/geophysical/tide_equilibrium", "gt1r/land_ice_segments/geophysical/tide_load", "gt1r/land_ice_segments/geophysical/tide_ocean", "gt1r/land_ice_segments/geophysical/tide_pole", "gt1r/land_ice_segments/ground_track/ref_azimuth", "gt1r/land_ice_segments/ground_track/ref_coelv", "gt1r/land_ice_segments/ground_track/seg_azimuth", "gt1r/land_ice_segments/ground_track/sigma_geo_at", "gt1r/land_ice_segments/ground_track/sigma_geo_r", "gt1r/land_ice_segments/ground_track/sigma_geo_xt", "gt1r/land_ice_segments/ground_track/x_atc", "gt1r/land_ice_segments/ground_track/y_atc", "gt1r/residual_histogram/bckgrd_per_m", "gt1r/residual_histogram/bin_top_h", "gt1r/residual_histogram/count", "gt1r/residual_histogram/delta_time", "gt1r/residual_histogram/ds_segment_id", "gt1r/residual_histogram/lat_mean", "gt1r/residual_histogram/lon_mean", "gt1r/residual_histogram/pulse_count", "gt1r/residual_histogram/segment_id_list", "gt1r/residual_histogram/x_atc_mean", "gt1r/segment_quality/delta_time", "gt1r/segment_quality/record_number", "gt1r/segment_quality/reference_pt_lat", "gt1r/segment_quality/reference_pt_lon", "gt1r/segment_quality/segment_id", "gt1r/segment_quality/signal_selection_source", "gt1r/segment_quality/signal_selection_status/signal_selection_status_all", "gt1r/segment_quality/signal_selection_status/signal_selection_status_backup", "gt1r/segment_quality/signal_selection_status/signal_selection_status_confident", "gt2l/land_ice_segments/atl06_quality_summary", "gt2l/land_ice_segments/delta_time", "gt2l/land_ice_segments/h_li", "gt2l/land_ice_segments/h_li_sigma", "gt2l/land_ice_segments/latitude", "gt2l/land_ice_segments/longitude", "gt2l/land_ice_segments/segment_id", "gt2l/land_ice_segments/sigma_geo_h", "gt2l/land_ice_segments/bias_correction/fpb_mean_corr", "gt2l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt2l/land_ice_segments/bias_correction/fpb_med_corr", "gt2l/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt2l/land_ice_segments/bias_correction/fpb_n_corr", "gt2l/land_ice_segments/bias_correction/med_r_fit", "gt2l/land_ice_segments/bias_correction/tx_mean_corr", "gt2l/land_ice_segments/bias_correction/tx_med_corr", "gt2l/land_ice_segments/dem/dem_flag", "gt2l/land_ice_segments/dem/dem_h", "gt2l/land_ice_segments/dem/geoid_free2mean", "gt2l/land_ice_segments/dem/geoid_h", "gt2l/land_ice_segments/fit_statistics/dh_fit_dx", "gt2l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt2l/land_ice_segments/fit_statistics/dh_fit_dy", "gt2l/land_ice_segments/fit_statistics/h_expected_rms", "gt2l/land_ice_segments/fit_statistics/h_mean", "gt2l/land_ice_segments/fit_statistics/h_rms_misfit", "gt2l/land_ice_segments/fit_statistics/h_robust_sprd", "gt2l/land_ice_segments/fit_statistics/n_fit_photons", "gt2l/land_ice_segments/fit_statistics/n_seg_pulses", "gt2l/land_ice_segments/fit_statistics/sigma_h_mean", "gt2l/land_ice_segments/fit_statistics/signal_selection_source", "gt2l/land_ice_segments/fit_statistics/signal_selection_source_status", "gt2l/land_ice_segments/fit_statistics/snr", "gt2l/land_ice_segments/fit_statistics/snr_significance", "gt2l/land_ice_segments/fit_statistics/w_surface_window_final", "gt2l/land_ice_segments/geophysical/bckgrd", "gt2l/land_ice_segments/geophysical/bsnow_conf", "gt2l/land_ice_segments/geophysical/bsnow_h", "gt2l/land_ice_segments/geophysical/bsnow_od", "gt2l/land_ice_segments/geophysical/cloud_flg_asr", "gt2l/land_ice_segments/geophysical/cloud_flg_atm", "gt2l/land_ice_segments/geophysical/dac", "gt2l/land_ice_segments/geophysical/e_bckgrd", "gt2l/land_ice_segments/geophysical/layer_flag", "gt2l/land_ice_segments/geophysical/msw_flag", "gt2l/land_ice_segments/geophysical/neutat_delay_total", "gt2l/land_ice_segments/geophysical/r_eff", "gt2l/land_ice_segments/geophysical/solar_azimuth", "gt2l/land_ice_segments/geophysical/solar_elevation", "gt2l/land_ice_segments/geophysical/tide_earth", "gt2l/land_ice_segments/geophysical/tide_earth_free2mean", "gt2l/land_ice_segments/geophysical/tide_equilibrium", "gt2l/land_ice_segments/geophysical/tide_load", "gt2l/land_ice_segments/geophysical/tide_ocean", "gt2l/land_ice_segments/geophysical/tide_pole", "gt2l/land_ice_segments/ground_track/ref_azimuth", "gt2l/land_ice_segments/ground_track/ref_coelv", "gt2l/land_ice_segments/ground_track/seg_azimuth", "gt2l/land_ice_segments/ground_track/sigma_geo_at", "gt2l/land_ice_segments/ground_track/sigma_geo_r", "gt2l/land_ice_segments/ground_track/sigma_geo_xt", "gt2l/land_ice_segments/ground_track/x_atc", "gt2l/land_ice_segments/ground_track/y_atc", "gt2l/residual_histogram/bckgrd_per_m", "gt2l/residual_histogram/bin_top_h", "gt2l/residual_histogram/count", "gt2l/residual_histogram/delta_time", "gt2l/residual_histogram/ds_segment_id", "gt2l/residual_histogram/lat_mean", "gt2l/residual_histogram/lon_mean", "gt2l/residual_histogram/pulse_count", "gt2l/residual_histogram/segment_id_list", "gt2l/residual_histogram/x_atc_mean", "gt2l/segment_quality/delta_time", "gt2l/segment_quality/record_number", "gt2l/segment_quality/reference_pt_lat", "gt2l/segment_quality/reference_pt_lon", "gt2l/segment_quality/segment_id", "gt2l/segment_quality/signal_selection_source", "gt2l/segment_quality/signal_selection_status/signal_selection_status_all", "gt2l/segment_quality/signal_selection_status/signal_selection_status_backup", "gt2l/segment_quality/signal_selection_status/signal_selection_status_confident", "gt2r/land_ice_segments/atl06_quality_summary", "gt2r/land_ice_segments/delta_time", "gt2r/land_ice_segments/h_li", "gt2r/land_ice_segments/h_li_sigma", "gt2r/land_ice_segments/latitude", "gt2r/land_ice_segments/longitude", "gt2r/land_ice_segments/segment_id", "gt2r/land_ice_segments/sigma_geo_h", "gt2r/land_ice_segments/bias_correction/fpb_mean_corr", "gt2r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt2r/land_ice_segments/bias_correction/fpb_med_corr", "gt2r/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt2r/land_ice_segments/bias_correction/fpb_n_corr", "gt2r/land_ice_segments/bias_correction/med_r_fit", "gt2r/land_ice_segments/bias_correction/tx_mean_corr", "gt2r/land_ice_segments/bias_correction/tx_med_corr", "gt2r/land_ice_segments/dem/dem_flag", "gt2r/land_ice_segments/dem/dem_h", "gt2r/land_ice_segments/dem/geoid_free2mean", "gt2r/land_ice_segments/dem/geoid_h", "gt2r/land_ice_segments/fit_statistics/dh_fit_dx", "gt2r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt2r/land_ice_segments/fit_statistics/dh_fit_dy", "gt2r/land_ice_segments/fit_statistics/h_expected_rms", "gt2r/land_ice_segments/fit_statistics/h_mean", "gt2r/land_ice_segments/fit_statistics/h_rms_misfit", "gt2r/land_ice_segments/fit_statistics/h_robust_sprd", "gt2r/land_ice_segments/fit_statistics/n_fit_photons", "gt2r/land_ice_segments/fit_statistics/n_seg_pulses", "gt2r/land_ice_segments/fit_statistics/sigma_h_mean", "gt2r/land_ice_segments/fit_statistics/signal_selection_source", "gt2r/land_ice_segments/fit_statistics/signal_selection_source_status", "gt2r/land_ice_segments/fit_statistics/snr", "gt2r/land_ice_segments/fit_statistics/snr_significance", "gt2r/land_ice_segments/fit_statistics/w_surface_window_final", "gt2r/land_ice_segments/geophysical/bckgrd", "gt2r/land_ice_segments/geophysical/bsnow_conf", "gt2r/land_ice_segments/geophysical/bsnow_h", "gt2r/land_ice_segments/geophysical/bsnow_od", "gt2r/land_ice_segments/geophysical/cloud_flg_asr", "gt2r/land_ice_segments/geophysical/cloud_flg_atm", "gt2r/land_ice_segments/geophysical/dac", "gt2r/land_ice_segments/geophysical/e_bckgrd", "gt2r/land_ice_segments/geophysical/layer_flag", "gt2r/land_ice_segments/geophysical/msw_flag", "gt2r/land_ice_segments/geophysical/neutat_delay_total", "gt2r/land_ice_segments/geophysical/r_eff", "gt2r/land_ice_segments/geophysical/solar_azimuth", "gt2r/land_ice_segments/geophysical/solar_elevation", "gt2r/land_ice_segments/geophysical/tide_earth", "gt2r/land_ice_segments/geophysical/tide_earth_free2mean", "gt2r/land_ice_segments/geophysical/tide_equilibrium", "gt2r/land_ice_segments/geophysical/tide_load", "gt2r/land_ice_segments/geophysical/tide_ocean", "gt2r/land_ice_segments/geophysical/tide_pole", "gt2r/land_ice_segments/ground_track/ref_azimuth", "gt2r/land_ice_segments/ground_track/ref_coelv", "gt2r/land_ice_segments/ground_track/seg_azimuth", "gt2r/land_ice_segments/ground_track/sigma_geo_at", "gt2r/land_ice_segments/ground_track/sigma_geo_r", "gt2r/land_ice_segments/ground_track/sigma_geo_xt", "gt2r/land_ice_segments/ground_track/x_atc", "gt2r/land_ice_segments/ground_track/y_atc", "gt2r/residual_histogram/bckgrd_per_m", "gt2r/residual_histogram/bin_top_h", "gt2r/residual_histogram/count", "gt2r/residual_histogram/delta_time", "gt2r/residual_histogram/ds_segment_id", "gt2r/residual_histogram/lat_mean", "gt2r/residual_histogram/lon_mean", "gt2r/residual_histogram/pulse_count", "gt2r/residual_histogram/segment_id_list", "gt2r/residual_histogram/x_atc_mean", "gt2r/segment_quality/delta_time", "gt2r/segment_quality/record_number", "gt2r/segment_quality/reference_pt_lat", "gt2r/segment_quality/reference_pt_lon", "gt2r/segment_quality/segment_id", "gt2r/segment_quality/signal_selection_source", "gt2r/segment_quality/signal_selection_status/signal_selection_status_all", "gt2r/segment_quality/signal_selection_status/signal_selection_status_backup", "gt2r/segment_quality/signal_selection_status/signal_selection_status_confident", "gt3l/land_ice_segments/atl06_quality_summary", "gt3l/land_ice_segments/delta_time", "gt3l/land_ice_segments/h_li", "gt3l/land_ice_segments/h_li_sigma", "gt3l/land_ice_segments/latitude", "gt3l/land_ice_segments/longitude", "gt3l/land_ice_segments/segment_id", "gt3l/land_ice_segments/sigma_geo_h", "gt3l/land_ice_segments/bias_correction/fpb_mean_corr", "gt3l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt3l/land_ice_segments/bias_correction/fpb_med_corr", "gt3l/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt3l/land_ice_segments/bias_correction/fpb_n_corr", "gt3l/land_ice_segments/bias_correction/med_r_fit", "gt3l/land_ice_segments/bias_correction/tx_mean_corr", "gt3l/land_ice_segments/bias_correction/tx_med_corr", "gt3l/land_ice_segments/dem/dem_flag", "gt3l/land_ice_segments/dem/dem_h", "gt3l/land_ice_segments/dem/geoid_free2mean", "gt3l/land_ice_segments/dem/geoid_h", "gt3l/land_ice_segments/fit_statistics/dh_fit_dx", "gt3l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt3l/land_ice_segments/fit_statistics/dh_fit_dy", "gt3l/land_ice_segments/fit_statistics/h_expected_rms", "gt3l/land_ice_segments/fit_statistics/h_mean", "gt3l/land_ice_segments/fit_statistics/h_rms_misfit", "gt3l/land_ice_segments/fit_statistics/h_robust_sprd", "gt3l/land_ice_segments/fit_statistics/n_fit_photons", "gt3l/land_ice_segments/fit_statistics/n_seg_pulses", "gt3l/land_ice_segments/fit_statistics/sigma_h_mean", "gt3l/land_ice_segments/fit_statistics/signal_selection_source", "gt3l/land_ice_segments/fit_statistics/signal_selection_source_status", "gt3l/land_ice_segments/fit_statistics/snr", "gt3l/land_ice_segments/fit_statistics/snr_significance", "gt3l/land_ice_segments/fit_statistics/w_surface_window_final", "gt3l/land_ice_segments/geophysical/bckgrd", "gt3l/land_ice_segments/geophysical/bsnow_conf", "gt3l/land_ice_segments/geophysical/bsnow_h", "gt3l/land_ice_segments/geophysical/bsnow_od", "gt3l/land_ice_segments/geophysical/cloud_flg_asr", "gt3l/land_ice_segments/geophysical/cloud_flg_atm", "gt3l/land_ice_segments/geophysical/dac", "gt3l/land_ice_segments/geophysical/e_bckgrd", "gt3l/land_ice_segments/geophysical/layer_flag", "gt3l/land_ice_segments/geophysical/msw_flag", "gt3l/land_ice_segments/geophysical/neutat_delay_total", "gt3l/land_ice_segments/geophysical/r_eff", "gt3l/land_ice_segments/geophysical/solar_azimuth", "gt3l/land_ice_segments/geophysical/solar_elevation", "gt3l/land_ice_segments/geophysical/tide_earth", "gt3l/land_ice_segments/geophysical/tide_earth_free2mean", "gt3l/land_ice_segments/geophysical/tide_equilibrium", "gt3l/land_ice_segments/geophysical/tide_load", "gt3l/land_ice_segments/geophysical/tide_ocean", "gt3l/land_ice_segments/geophysical/tide_pole", "gt3l/land_ice_segments/ground_track/ref_azimuth", "gt3l/land_ice_segments/ground_track/ref_coelv", "gt3l/land_ice_segments/ground_track/seg_azimuth", "gt3l/land_ice_segments/ground_track/sigma_geo_at", "gt3l/land_ice_segments/ground_track/sigma_geo_r", "gt3l/land_ice_segments/ground_track/sigma_geo_xt", "gt3l/land_ice_segments/ground_track/x_atc", "gt3l/land_ice_segments/ground_track/y_atc", "gt3l/residual_histogram/bckgrd_per_m", "gt3l/residual_histogram/bin_top_h", "gt3l/residual_histogram/count", "gt3l/residual_histogram/delta_time", "gt3l/residual_histogram/ds_segment_id", "gt3l/residual_histogram/lat_mean", "gt3l/residual_histogram/lon_mean", "gt3l/residual_histogram/pulse_count", "gt3l/residual_histogram/segment_id_list", "gt3l/residual_histogram/x_atc_mean", "gt3l/segment_quality/delta_time", "gt3l/segment_quality/record_number", "gt3l/segment_quality/reference_pt_lat", "gt3l/segment_quality/reference_pt_lon", "gt3l/segment_quality/segment_id", "gt3l/segment_quality/signal_selection_source", "gt3l/segment_quality/signal_selection_status/signal_selection_status_all", "gt3l/segment_quality/signal_selection_status/signal_selection_status_backup", "gt3l/segment_quality/signal_selection_status/signal_selection_status_confident", "gt3r/land_ice_segments/atl06_quality_summary", "gt3r/land_ice_segments/delta_time", "gt3r/land_ice_segments/h_li", "gt3r/land_ice_segments/h_li_sigma", "gt3r/land_ice_segments/latitude", "gt3r/land_ice_segments/longitude", "gt3r/land_ice_segments/segment_id", "gt3r/land_ice_segments/sigma_geo_h", "gt3r/land_ice_segments/bias_correction/fpb_mean_corr", "gt3r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", "gt3r/land_ice_segments/bias_correction/fpb_med_corr", "gt3r/land_ice_segments/bias_correction/fpb_med_corr_sigma", "gt3r/land_ice_segments/bias_correction/fpb_n_corr", "gt3r/land_ice_segments/bias_correction/med_r_fit", "gt3r/land_ice_segments/bias_correction/tx_mean_corr", "gt3r/land_ice_segments/bias_correction/tx_med_corr", "gt3r/land_ice_segments/dem/dem_flag", "gt3r/land_ice_segments/dem/dem_h", "gt3r/land_ice_segments/dem/geoid_free2mean", "gt3r/land_ice_segments/dem/geoid_h", "gt3r/land_ice_segments/fit_statistics/dh_fit_dx", "gt3r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", "gt3r/land_ice_segments/fit_statistics/dh_fit_dy", "gt3r/land_ice_segments/fit_statistics/h_expected_rms", "gt3r/land_ice_segments/fit_statistics/h_mean", "gt3r/land_ice_segments/fit_statistics/h_rms_misfit", "gt3r/land_ice_segments/fit_statistics/h_robust_sprd", "gt3r/land_ice_segments/fit_statistics/n_fit_photons", "gt3r/land_ice_segments/fit_statistics/n_seg_pulses", "gt3r/land_ice_segments/fit_statistics/sigma_h_mean", "gt3r/land_ice_segments/fit_statistics/signal_selection_source", "gt3r/land_ice_segments/fit_statistics/signal_selection_source_status", "gt3r/land_ice_segments/fit_statistics/snr", "gt3r/land_ice_segments/fit_statistics/snr_significance", "gt3r/land_ice_segments/fit_statistics/w_surface_window_final", "gt3r/land_ice_segments/geophysical/bckgrd", "gt3r/land_ice_segments/geophysical/bsnow_conf", "gt3r/land_ice_segments/geophysical/bsnow_h", "gt3r/land_ice_segments/geophysical/bsnow_od", "gt3r/land_ice_segments/geophysical/cloud_flg_asr", "gt3r/land_ice_segments/geophysical/cloud_flg_atm", "gt3r/land_ice_segments/geophysical/dac", "gt3r/land_ice_segments/geophysical/e_bckgrd", "gt3r/land_ice_segments/geophysical/layer_flag", "gt3r/land_ice_segments/geophysical/msw_flag", "gt3r/land_ice_segments/geophysical/neutat_delay_total", "gt3r/land_ice_segments/geophysical/r_eff", "gt3r/land_ice_segments/geophysical/solar_azimuth", "gt3r/land_ice_segments/geophysical/solar_elevation", "gt3r/land_ice_segments/geophysical/tide_earth", "gt3r/land_ice_segments/geophysical/tide_earth_free2mean", "gt3r/land_ice_segments/geophysical/tide_equilibrium", "gt3r/land_ice_segments/geophysical/tide_load", "gt3r/land_ice_segments/geophysical/tide_ocean", "gt3r/land_ice_segments/geophysical/tide_pole", "gt3r/land_ice_segments/ground_track/ref_azimuth", "gt3r/land_ice_segments/ground_track/ref_coelv", "gt3r/land_ice_segments/ground_track/seg_azimuth", "gt3r/land_ice_segments/ground_track/sigma_geo_at", "gt3r/land_ice_segments/ground_track/sigma_geo_r", "gt3r/land_ice_segments/ground_track/sigma_geo_xt", "gt3r/land_ice_segments/ground_track/x_atc", "gt3r/land_ice_segments/ground_track/y_atc", "gt3r/residual_histogram/bckgrd_per_m", "gt3r/residual_histogram/bin_top_h", "gt3r/residual_histogram/count", "gt3r/residual_histogram/delta_time", "gt3r/residual_histogram/ds_segment_id", "gt3r/residual_histogram/lat_mean", "gt3r/residual_histogram/lon_mean", "gt3r/residual_histogram/pulse_count", "gt3r/residual_histogram/segment_id_list", "gt3r/residual_histogram/x_atc_mean", "gt3r/segment_quality/delta_time", "gt3r/segment_quality/record_number", "gt3r/segment_quality/reference_pt_lat", "gt3r/segment_quality/reference_pt_lon", "gt3r/segment_quality/segment_id", "gt3r/segment_quality/signal_selection_source", "gt3r/segment_quality/signal_selection_status/signal_selection_status_all", "gt3r/segment_quality/signal_selection_status/signal_selection_status_backup", "gt3r/segment_quality/signal_selection_status/signal_selection_status_confident", "orbit_info/crossing_time", "orbit_info/cycle_number", "orbit_info/lan", "orbit_info/orbit_number", "orbit_info/rgt", "orbit_info/sc_orient", "orbit_info/sc_orient_time", "quality_assessment/qa_granule_fail_reason", "quality_assessment/qa_granule_pass_fail", "quality_assessment/gt1l/delta_time", "quality_assessment/gt1l/lat_mean", "quality_assessment/gt1l/lon_mean", "quality_assessment/gt1l/signal_selection_source_fraction_0", "quality_assessment/gt1l/signal_selection_source_fraction_1", "quality_assessment/gt1l/signal_selection_source_fraction_2", "quality_assessment/gt1l/signal_selection_source_fraction_3", "quality_assessment/gt1r/delta_time", "quality_assessment/gt1r/lat_mean", "quality_assessment/gt1r/lon_mean", "quality_assessment/gt1r/signal_selection_source_fraction_0", "quality_assessment/gt1r/signal_selection_source_fraction_1", "quality_assessment/gt1r/signal_selection_source_fraction_2", "quality_assessment/gt1r/signal_selection_source_fraction_3", "quality_assessment/gt2l/delta_time", "quality_assessment/gt2l/lat_mean", "quality_assessment/gt2l/lon_mean", "quality_assessment/gt2l/signal_selection_source_fraction_0", "quality_assessment/gt2l/signal_selection_source_fraction_1", "quality_assessment/gt2l/signal_selection_source_fraction_2", "quality_assessment/gt2l/signal_selection_source_fraction_3", "quality_assessment/gt2r/delta_time", "quality_assessment/gt2r/lat_mean", "quality_assessment/gt2r/lon_mean", "quality_assessment/gt2r/signal_selection_source_fraction_0", "quality_assessment/gt2r/signal_selection_source_fraction_1", "quality_assessment/gt2r/signal_selection_source_fraction_2", "quality_assessment/gt2r/signal_selection_source_fraction_3", "quality_assessment/gt3l/delta_time", "quality_assessment/gt3l/lat_mean", "quality_assessment/gt3l/lon_mean", "quality_assessment/gt3l/signal_selection_source_fraction_0", "quality_assessment/gt3l/signal_selection_source_fraction_1", "quality_assessment/gt3l/signal_selection_source_fraction_2", "quality_assessment/gt3l/signal_selection_source_fraction_3", "quality_assessment/gt3r/delta_time", "quality_assessment/gt3r/lat_mean", "quality_assessment/gt3r/lon_mean", "quality_assessment/gt3r/signal_selection_source_fraction_0", "quality_assessment/gt3r/signal_selection_source_fraction_1", "quality_assessment/gt3r/signal_selection_source_fraction_2", "quality_assessment/gt3r/signal_selection_source_fraction_3"]} \ No newline at end of file diff --git a/icepyx/tests/behind_NSIDC_API_login.py b/icepyx/tests/behind_NSIDC_API_login.py deleted file mode 100644 index 9d4bb96df..000000000 --- a/icepyx/tests/behind_NSIDC_API_login.py +++ /dev/null @@ -1,659 +0,0 @@ -import icepyx as ipx -import pytest -import warnings - -# from unittest.mock import patch -# import mock -# import builtins -# import getpass -import os - -# test avail data and subsetting success for each input type (kml, shp, list of coords, bbox) -# check that agent key is added in event of no subsetting -# check that downloaded data is subset - - -@pytest.fixture -def reg_a(scope="module"): - return ipx.Query("ATL06", [-55, 68, -48, 71], ["2019-02-22", "2019-02-28"]) - - -# @patch('my_module.__get_input', return_value='y') - - -@pytest.fixture -def session(reg_a, scope="module"): - return reg_a._start_earthdata_session( - "icepyx_devteam", "icepyx.dev@gmail.com", os.getenv("NSIDC_LOGIN") - ) - - -# QUESTION: should we be testing to make sure the session starts? If so, how? The below doesn't work because the 'requests.sessions.Session' isn't recognized... is this a case where I'd need to have a mock session to compare it to? -# def test_earthdata_session_started(session): -# assert isinstance(session, 'requests.sessions.Session') - - -import icepyx.core.is2ref as is2ref - -########## _get_custom_options ########## -# TestQuestion: should this use a mock rather than an actual call to NSIDC? -# TestQuestion: is there a better way to deal with this than having the super long dictionary copied here? -def test_get_custom_options_output(session): - obs = is2ref._get_custom_options(session, "ATL06", "002") - exp = { - "options": [ - { - "id": "ICESAT2", - "maxGransAsyncRequest": "2000", - "maxGransSyncRequest": "100", - "spatialSubsetting": "true", - "spatialSubsettingShapefile": "true", - "temporalSubsetting": "true", - "type": "both", - } - ], - "fileformats": ["TABULAR_ASCII", "NetCDF4-CF", "Shapefile", "NetCDF-3"], - "formatreproj": [], - "reprojectionONLY": [ - "TABULAR_ASCII", - "NetCDF4-CF", - "Shapefile", - "NetCDF-3", - "No reformatting", - ], - "noproj": [], - "variables": [ - "ancillary_data/atlas_sdp_gps_epoch", - "ancillary_data/control", - "ancillary_data/data_end_utc", - "ancillary_data/data_start_utc", - "ancillary_data/end_cycle", - "ancillary_data/end_delta_time", - "ancillary_data/end_geoseg", - "ancillary_data/end_gpssow", - "ancillary_data/end_gpsweek", - "ancillary_data/end_orbit", - "ancillary_data/end_region", - "ancillary_data/end_rgt", - "ancillary_data/granule_end_utc", - "ancillary_data/granule_start_utc", - "ancillary_data/qa_at_interval", - "ancillary_data/release", - "ancillary_data/start_cycle", - "ancillary_data/start_delta_time", - "ancillary_data/start_geoseg", - "ancillary_data/start_gpssow", - "ancillary_data/start_gpsweek", - "ancillary_data/start_orbit", - "ancillary_data/start_region", - "ancillary_data/start_rgt", - "ancillary_data/version", - "ancillary_data/land_ice/dt_hist", - "ancillary_data/land_ice/fit_maxiter", - "ancillary_data/land_ice/fpb_maxiter", - "ancillary_data/land_ice/maxiter", - "ancillary_data/land_ice/max_res_ids", - "ancillary_data/land_ice/min_dist", - "ancillary_data/land_ice/min_gain_th", - "ancillary_data/land_ice/min_n_pe", - "ancillary_data/land_ice/min_n_sel", - "ancillary_data/land_ice/min_signal_conf", - "ancillary_data/land_ice/n_hist", - "ancillary_data/land_ice/nhist_bins", - "ancillary_data/land_ice/n_sigmas", - "ancillary_data/land_ice/proc_interval", - "ancillary_data/land_ice/rbin_width", - "ancillary_data/land_ice/sigma_beam", - "ancillary_data/land_ice/sigma_tx", - "ancillary_data/land_ice/t_dead", - "ancillary_data/land_ice/win_nsig", - "gt1l/land_ice_segments/atl06_quality_summary", - "gt1l/land_ice_segments/delta_time", - "gt1l/land_ice_segments/h_li", - "gt1l/land_ice_segments/h_li_sigma", - "gt1l/land_ice_segments/latitude", - "gt1l/land_ice_segments/longitude", - "gt1l/land_ice_segments/segment_id", - "gt1l/land_ice_segments/sigma_geo_h", - "gt1l/land_ice_segments/bias_correction/fpb_mean_corr", - "gt1l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt1l/land_ice_segments/bias_correction/fpb_med_corr", - "gt1l/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt1l/land_ice_segments/bias_correction/fpb_n_corr", - "gt1l/land_ice_segments/bias_correction/med_r_fit", - "gt1l/land_ice_segments/bias_correction/tx_mean_corr", - "gt1l/land_ice_segments/bias_correction/tx_med_corr", - "gt1l/land_ice_segments/dem/dem_flag", - "gt1l/land_ice_segments/dem/dem_h", - "gt1l/land_ice_segments/dem/geoid_h", - "gt1l/land_ice_segments/fit_statistics/dh_fit_dx", - "gt1l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt1l/land_ice_segments/fit_statistics/dh_fit_dy", - "gt1l/land_ice_segments/fit_statistics/h_expected_rms", - "gt1l/land_ice_segments/fit_statistics/h_mean", - "gt1l/land_ice_segments/fit_statistics/h_rms_misfit", - "gt1l/land_ice_segments/fit_statistics/h_robust_sprd", - "gt1l/land_ice_segments/fit_statistics/n_fit_photons", - "gt1l/land_ice_segments/fit_statistics/n_seg_pulses", - "gt1l/land_ice_segments/fit_statistics/sigma_h_mean", - "gt1l/land_ice_segments/fit_statistics/signal_selection_source", - "gt1l/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt1l/land_ice_segments/fit_statistics/snr", - "gt1l/land_ice_segments/fit_statistics/snr_significance", - "gt1l/land_ice_segments/fit_statistics/w_surface_window_final", - "gt1l/land_ice_segments/geophysical/bckgrd", - "gt1l/land_ice_segments/geophysical/bsnow_conf", - "gt1l/land_ice_segments/geophysical/bsnow_h", - "gt1l/land_ice_segments/geophysical/bsnow_od", - "gt1l/land_ice_segments/geophysical/cloud_flg_asr", - "gt1l/land_ice_segments/geophysical/cloud_flg_atm", - "gt1l/land_ice_segments/geophysical/dac", - "gt1l/land_ice_segments/geophysical/e_bckgrd", - "gt1l/land_ice_segments/geophysical/msw_flag", - "gt1l/land_ice_segments/geophysical/neutat_delay_total", - "gt1l/land_ice_segments/geophysical/r_eff", - "gt1l/land_ice_segments/geophysical/solar_azimuth", - "gt1l/land_ice_segments/geophysical/solar_elevation", - "gt1l/land_ice_segments/geophysical/tide_earth", - "gt1l/land_ice_segments/geophysical/tide_equilibrium", - "gt1l/land_ice_segments/geophysical/tide_load", - "gt1l/land_ice_segments/geophysical/tide_ocean", - "gt1l/land_ice_segments/geophysical/tide_pole", - "gt1l/land_ice_segments/ground_track/ref_azimuth", - "gt1l/land_ice_segments/ground_track/ref_coelv", - "gt1l/land_ice_segments/ground_track/seg_azimuth", - "gt1l/land_ice_segments/ground_track/sigma_geo_at", - "gt1l/land_ice_segments/ground_track/sigma_geo_xt", - "gt1l/land_ice_segments/ground_track/x_atc", - "gt1l/land_ice_segments/ground_track/y_atc", - "gt1l/residual_histogram/bckgrd_per_bin", - "gt1l/residual_histogram/count", - "gt1l/residual_histogram/delta_time", - "gt1l/residual_histogram/dh", - "gt1l/residual_histogram/ds_segment_id", - "gt1l/residual_histogram/lat_mean", - "gt1l/residual_histogram/lon_mean", - "gt1l/residual_histogram/pulse_count", - "gt1l/residual_histogram/segment_id_list", - "gt1l/residual_histogram/x_atc_mean", - "gt1l/segment_quality/delta_time", - "gt1l/segment_quality/record_number", - "gt1l/segment_quality/reference_pt_lat", - "gt1l/segment_quality/reference_pt_lon", - "gt1l/segment_quality/segment_id", - "gt1l/segment_quality/signal_selection_source", - "gt1l/segment_quality/signal_selection_status/signal_selection_status_all", - "gt1l/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt1l/segment_quality/signal_selection_status/signal_selection_status_confident", - "gt1r/land_ice_segments/atl06_quality_summary", - "gt1r/land_ice_segments/delta_time", - "gt1r/land_ice_segments/h_li", - "gt1r/land_ice_segments/h_li_sigma", - "gt1r/land_ice_segments/latitude", - "gt1r/land_ice_segments/longitude", - "gt1r/land_ice_segments/segment_id", - "gt1r/land_ice_segments/sigma_geo_h", - "gt1r/land_ice_segments/bias_correction/fpb_mean_corr", - "gt1r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt1r/land_ice_segments/bias_correction/fpb_med_corr", - "gt1r/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt1r/land_ice_segments/bias_correction/fpb_n_corr", - "gt1r/land_ice_segments/bias_correction/med_r_fit", - "gt1r/land_ice_segments/bias_correction/tx_mean_corr", - "gt1r/land_ice_segments/bias_correction/tx_med_corr", - "gt1r/land_ice_segments/dem/dem_flag", - "gt1r/land_ice_segments/dem/dem_h", - "gt1r/land_ice_segments/dem/geoid_h", - "gt1r/land_ice_segments/fit_statistics/dh_fit_dx", - "gt1r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt1r/land_ice_segments/fit_statistics/dh_fit_dy", - "gt1r/land_ice_segments/fit_statistics/h_expected_rms", - "gt1r/land_ice_segments/fit_statistics/h_mean", - "gt1r/land_ice_segments/fit_statistics/h_rms_misfit", - "gt1r/land_ice_segments/fit_statistics/h_robust_sprd", - "gt1r/land_ice_segments/fit_statistics/n_fit_photons", - "gt1r/land_ice_segments/fit_statistics/n_seg_pulses", - "gt1r/land_ice_segments/fit_statistics/sigma_h_mean", - "gt1r/land_ice_segments/fit_statistics/signal_selection_source", - "gt1r/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt1r/land_ice_segments/fit_statistics/snr", - "gt1r/land_ice_segments/fit_statistics/snr_significance", - "gt1r/land_ice_segments/fit_statistics/w_surface_window_final", - "gt1r/land_ice_segments/geophysical/bckgrd", - "gt1r/land_ice_segments/geophysical/bsnow_conf", - "gt1r/land_ice_segments/geophysical/bsnow_h", - "gt1r/land_ice_segments/geophysical/bsnow_od", - "gt1r/land_ice_segments/geophysical/cloud_flg_asr", - "gt1r/land_ice_segments/geophysical/cloud_flg_atm", - "gt1r/land_ice_segments/geophysical/dac", - "gt1r/land_ice_segments/geophysical/e_bckgrd", - "gt1r/land_ice_segments/geophysical/msw_flag", - "gt1r/land_ice_segments/geophysical/neutat_delay_total", - "gt1r/land_ice_segments/geophysical/r_eff", - "gt1r/land_ice_segments/geophysical/solar_azimuth", - "gt1r/land_ice_segments/geophysical/solar_elevation", - "gt1r/land_ice_segments/geophysical/tide_earth", - "gt1r/land_ice_segments/geophysical/tide_equilibrium", - "gt1r/land_ice_segments/geophysical/tide_load", - "gt1r/land_ice_segments/geophysical/tide_ocean", - "gt1r/land_ice_segments/geophysical/tide_pole", - "gt1r/land_ice_segments/ground_track/ref_azimuth", - "gt1r/land_ice_segments/ground_track/ref_coelv", - "gt1r/land_ice_segments/ground_track/seg_azimuth", - "gt1r/land_ice_segments/ground_track/sigma_geo_at", - "gt1r/land_ice_segments/ground_track/sigma_geo_xt", - "gt1r/land_ice_segments/ground_track/x_atc", - "gt1r/land_ice_segments/ground_track/y_atc", - "gt1r/residual_histogram/bckgrd_per_bin", - "gt1r/residual_histogram/count", - "gt1r/residual_histogram/delta_time", - "gt1r/residual_histogram/dh", - "gt1r/residual_histogram/ds_segment_id", - "gt1r/residual_histogram/lat_mean", - "gt1r/residual_histogram/lon_mean", - "gt1r/residual_histogram/pulse_count", - "gt1r/residual_histogram/segment_id_list", - "gt1r/residual_histogram/x_atc_mean", - "gt1r/segment_quality/delta_time", - "gt1r/segment_quality/record_number", - "gt1r/segment_quality/reference_pt_lat", - "gt1r/segment_quality/reference_pt_lon", - "gt1r/segment_quality/segment_id", - "gt1r/segment_quality/signal_selection_source", - "gt1r/segment_quality/signal_selection_status/signal_selection_status_all", - "gt1r/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt1r/segment_quality/signal_selection_status/signal_selection_status_confident", - "gt2l/land_ice_segments/atl06_quality_summary", - "gt2l/land_ice_segments/delta_time", - "gt2l/land_ice_segments/h_li", - "gt2l/land_ice_segments/h_li_sigma", - "gt2l/land_ice_segments/latitude", - "gt2l/land_ice_segments/longitude", - "gt2l/land_ice_segments/segment_id", - "gt2l/land_ice_segments/sigma_geo_h", - "gt2l/land_ice_segments/bias_correction/fpb_mean_corr", - "gt2l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt2l/land_ice_segments/bias_correction/fpb_med_corr", - "gt2l/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt2l/land_ice_segments/bias_correction/fpb_n_corr", - "gt2l/land_ice_segments/bias_correction/med_r_fit", - "gt2l/land_ice_segments/bias_correction/tx_mean_corr", - "gt2l/land_ice_segments/bias_correction/tx_med_corr", - "gt2l/land_ice_segments/dem/dem_flag", - "gt2l/land_ice_segments/dem/dem_h", - "gt2l/land_ice_segments/dem/geoid_h", - "gt2l/land_ice_segments/fit_statistics/dh_fit_dx", - "gt2l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt2l/land_ice_segments/fit_statistics/dh_fit_dy", - "gt2l/land_ice_segments/fit_statistics/h_expected_rms", - "gt2l/land_ice_segments/fit_statistics/h_mean", - "gt2l/land_ice_segments/fit_statistics/h_rms_misfit", - "gt2l/land_ice_segments/fit_statistics/h_robust_sprd", - "gt2l/land_ice_segments/fit_statistics/n_fit_photons", - "gt2l/land_ice_segments/fit_statistics/n_seg_pulses", - "gt2l/land_ice_segments/fit_statistics/sigma_h_mean", - "gt2l/land_ice_segments/fit_statistics/signal_selection_source", - "gt2l/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt2l/land_ice_segments/fit_statistics/snr", - "gt2l/land_ice_segments/fit_statistics/snr_significance", - "gt2l/land_ice_segments/fit_statistics/w_surface_window_final", - "gt2l/land_ice_segments/geophysical/bckgrd", - "gt2l/land_ice_segments/geophysical/bsnow_conf", - "gt2l/land_ice_segments/geophysical/bsnow_h", - "gt2l/land_ice_segments/geophysical/bsnow_od", - "gt2l/land_ice_segments/geophysical/cloud_flg_asr", - "gt2l/land_ice_segments/geophysical/cloud_flg_atm", - "gt2l/land_ice_segments/geophysical/dac", - "gt2l/land_ice_segments/geophysical/e_bckgrd", - "gt2l/land_ice_segments/geophysical/msw_flag", - "gt2l/land_ice_segments/geophysical/neutat_delay_total", - "gt2l/land_ice_segments/geophysical/r_eff", - "gt2l/land_ice_segments/geophysical/solar_azimuth", - "gt2l/land_ice_segments/geophysical/solar_elevation", - "gt2l/land_ice_segments/geophysical/tide_earth", - "gt2l/land_ice_segments/geophysical/tide_equilibrium", - "gt2l/land_ice_segments/geophysical/tide_load", - "gt2l/land_ice_segments/geophysical/tide_ocean", - "gt2l/land_ice_segments/geophysical/tide_pole", - "gt2l/land_ice_segments/ground_track/ref_azimuth", - "gt2l/land_ice_segments/ground_track/ref_coelv", - "gt2l/land_ice_segments/ground_track/seg_azimuth", - "gt2l/land_ice_segments/ground_track/sigma_geo_at", - "gt2l/land_ice_segments/ground_track/sigma_geo_xt", - "gt2l/land_ice_segments/ground_track/x_atc", - "gt2l/land_ice_segments/ground_track/y_atc", - "gt2l/residual_histogram/bckgrd_per_bin", - "gt2l/residual_histogram/count", - "gt2l/residual_histogram/delta_time", - "gt2l/residual_histogram/dh", - "gt2l/residual_histogram/ds_segment_id", - "gt2l/residual_histogram/lat_mean", - "gt2l/residual_histogram/lon_mean", - "gt2l/residual_histogram/pulse_count", - "gt2l/residual_histogram/segment_id_list", - "gt2l/residual_histogram/x_atc_mean", - "gt2l/segment_quality/delta_time", - "gt2l/segment_quality/record_number", - "gt2l/segment_quality/reference_pt_lat", - "gt2l/segment_quality/reference_pt_lon", - "gt2l/segment_quality/segment_id", - "gt2l/segment_quality/signal_selection_source", - "gt2l/segment_quality/signal_selection_status/signal_selection_status_all", - "gt2l/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt2l/segment_quality/signal_selection_status/signal_selection_status_confident", - "gt2r/land_ice_segments/atl06_quality_summary", - "gt2r/land_ice_segments/delta_time", - "gt2r/land_ice_segments/h_li", - "gt2r/land_ice_segments/h_li_sigma", - "gt2r/land_ice_segments/latitude", - "gt2r/land_ice_segments/longitude", - "gt2r/land_ice_segments/segment_id", - "gt2r/land_ice_segments/sigma_geo_h", - "gt2r/land_ice_segments/bias_correction/fpb_mean_corr", - "gt2r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt2r/land_ice_segments/bias_correction/fpb_med_corr", - "gt2r/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt2r/land_ice_segments/bias_correction/fpb_n_corr", - "gt2r/land_ice_segments/bias_correction/med_r_fit", - "gt2r/land_ice_segments/bias_correction/tx_mean_corr", - "gt2r/land_ice_segments/bias_correction/tx_med_corr", - "gt2r/land_ice_segments/dem/dem_flag", - "gt2r/land_ice_segments/dem/dem_h", - "gt2r/land_ice_segments/dem/geoid_h", - "gt2r/land_ice_segments/fit_statistics/dh_fit_dx", - "gt2r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt2r/land_ice_segments/fit_statistics/dh_fit_dy", - "gt2r/land_ice_segments/fit_statistics/h_expected_rms", - "gt2r/land_ice_segments/fit_statistics/h_mean", - "gt2r/land_ice_segments/fit_statistics/h_rms_misfit", - "gt2r/land_ice_segments/fit_statistics/h_robust_sprd", - "gt2r/land_ice_segments/fit_statistics/n_fit_photons", - "gt2r/land_ice_segments/fit_statistics/n_seg_pulses", - "gt2r/land_ice_segments/fit_statistics/sigma_h_mean", - "gt2r/land_ice_segments/fit_statistics/signal_selection_source", - "gt2r/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt2r/land_ice_segments/fit_statistics/snr", - "gt2r/land_ice_segments/fit_statistics/snr_significance", - "gt2r/land_ice_segments/fit_statistics/w_surface_window_final", - "gt2r/land_ice_segments/geophysical/bckgrd", - "gt2r/land_ice_segments/geophysical/bsnow_conf", - "gt2r/land_ice_segments/geophysical/bsnow_h", - "gt2r/land_ice_segments/geophysical/bsnow_od", - "gt2r/land_ice_segments/geophysical/cloud_flg_asr", - "gt2r/land_ice_segments/geophysical/cloud_flg_atm", - "gt2r/land_ice_segments/geophysical/dac", - "gt2r/land_ice_segments/geophysical/e_bckgrd", - "gt2r/land_ice_segments/geophysical/msw_flag", - "gt2r/land_ice_segments/geophysical/neutat_delay_total", - "gt2r/land_ice_segments/geophysical/r_eff", - "gt2r/land_ice_segments/geophysical/solar_azimuth", - "gt2r/land_ice_segments/geophysical/solar_elevation", - "gt2r/land_ice_segments/geophysical/tide_earth", - "gt2r/land_ice_segments/geophysical/tide_equilibrium", - "gt2r/land_ice_segments/geophysical/tide_load", - "gt2r/land_ice_segments/geophysical/tide_ocean", - "gt2r/land_ice_segments/geophysical/tide_pole", - "gt2r/land_ice_segments/ground_track/ref_azimuth", - "gt2r/land_ice_segments/ground_track/ref_coelv", - "gt2r/land_ice_segments/ground_track/seg_azimuth", - "gt2r/land_ice_segments/ground_track/sigma_geo_at", - "gt2r/land_ice_segments/ground_track/sigma_geo_xt", - "gt2r/land_ice_segments/ground_track/x_atc", - "gt2r/land_ice_segments/ground_track/y_atc", - "gt2r/residual_histogram/bckgrd_per_bin", - "gt2r/residual_histogram/count", - "gt2r/residual_histogram/delta_time", - "gt2r/residual_histogram/dh", - "gt2r/residual_histogram/ds_segment_id", - "gt2r/residual_histogram/lat_mean", - "gt2r/residual_histogram/lon_mean", - "gt2r/residual_histogram/pulse_count", - "gt2r/residual_histogram/segment_id_list", - "gt2r/residual_histogram/x_atc_mean", - "gt2r/segment_quality/delta_time", - "gt2r/segment_quality/record_number", - "gt2r/segment_quality/reference_pt_lat", - "gt2r/segment_quality/reference_pt_lon", - "gt2r/segment_quality/segment_id", - "gt2r/segment_quality/signal_selection_source", - "gt2r/segment_quality/signal_selection_status/signal_selection_status_all", - "gt2r/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt2r/segment_quality/signal_selection_status/signal_selection_status_confident", - "gt3l/land_ice_segments/atl06_quality_summary", - "gt3l/land_ice_segments/delta_time", - "gt3l/land_ice_segments/h_li", - "gt3l/land_ice_segments/h_li_sigma", - "gt3l/land_ice_segments/latitude", - "gt3l/land_ice_segments/longitude", - "gt3l/land_ice_segments/segment_id", - "gt3l/land_ice_segments/sigma_geo_h", - "gt3l/land_ice_segments/bias_correction/fpb_mean_corr", - "gt3l/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt3l/land_ice_segments/bias_correction/fpb_med_corr", - "gt3l/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt3l/land_ice_segments/bias_correction/fpb_n_corr", - "gt3l/land_ice_segments/bias_correction/med_r_fit", - "gt3l/land_ice_segments/bias_correction/tx_mean_corr", - "gt3l/land_ice_segments/bias_correction/tx_med_corr", - "gt3l/land_ice_segments/dem/dem_flag", - "gt3l/land_ice_segments/dem/dem_h", - "gt3l/land_ice_segments/dem/geoid_h", - "gt3l/land_ice_segments/fit_statistics/dh_fit_dx", - "gt3l/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt3l/land_ice_segments/fit_statistics/dh_fit_dy", - "gt3l/land_ice_segments/fit_statistics/h_expected_rms", - "gt3l/land_ice_segments/fit_statistics/h_mean", - "gt3l/land_ice_segments/fit_statistics/h_rms_misfit", - "gt3l/land_ice_segments/fit_statistics/h_robust_sprd", - "gt3l/land_ice_segments/fit_statistics/n_fit_photons", - "gt3l/land_ice_segments/fit_statistics/n_seg_pulses", - "gt3l/land_ice_segments/fit_statistics/sigma_h_mean", - "gt3l/land_ice_segments/fit_statistics/signal_selection_source", - "gt3l/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt3l/land_ice_segments/fit_statistics/snr", - "gt3l/land_ice_segments/fit_statistics/snr_significance", - "gt3l/land_ice_segments/fit_statistics/w_surface_window_final", - "gt3l/land_ice_segments/geophysical/bckgrd", - "gt3l/land_ice_segments/geophysical/bsnow_conf", - "gt3l/land_ice_segments/geophysical/bsnow_h", - "gt3l/land_ice_segments/geophysical/bsnow_od", - "gt3l/land_ice_segments/geophysical/cloud_flg_asr", - "gt3l/land_ice_segments/geophysical/cloud_flg_atm", - "gt3l/land_ice_segments/geophysical/dac", - "gt3l/land_ice_segments/geophysical/e_bckgrd", - "gt3l/land_ice_segments/geophysical/msw_flag", - "gt3l/land_ice_segments/geophysical/neutat_delay_total", - "gt3l/land_ice_segments/geophysical/r_eff", - "gt3l/land_ice_segments/geophysical/solar_azimuth", - "gt3l/land_ice_segments/geophysical/solar_elevation", - "gt3l/land_ice_segments/geophysical/tide_earth", - "gt3l/land_ice_segments/geophysical/tide_equilibrium", - "gt3l/land_ice_segments/geophysical/tide_load", - "gt3l/land_ice_segments/geophysical/tide_ocean", - "gt3l/land_ice_segments/geophysical/tide_pole", - "gt3l/land_ice_segments/ground_track/ref_azimuth", - "gt3l/land_ice_segments/ground_track/ref_coelv", - "gt3l/land_ice_segments/ground_track/seg_azimuth", - "gt3l/land_ice_segments/ground_track/sigma_geo_at", - "gt3l/land_ice_segments/ground_track/sigma_geo_xt", - "gt3l/land_ice_segments/ground_track/x_atc", - "gt3l/land_ice_segments/ground_track/y_atc", - "gt3l/residual_histogram/bckgrd_per_bin", - "gt3l/residual_histogram/count", - "gt3l/residual_histogram/delta_time", - "gt3l/residual_histogram/dh", - "gt3l/residual_histogram/ds_segment_id", - "gt3l/residual_histogram/lat_mean", - "gt3l/residual_histogram/lon_mean", - "gt3l/residual_histogram/pulse_count", - "gt3l/residual_histogram/segment_id_list", - "gt3l/residual_histogram/x_atc_mean", - "gt3l/segment_quality/delta_time", - "gt3l/segment_quality/record_number", - "gt3l/segment_quality/reference_pt_lat", - "gt3l/segment_quality/reference_pt_lon", - "gt3l/segment_quality/segment_id", - "gt3l/segment_quality/signal_selection_source", - "gt3l/segment_quality/signal_selection_status/signal_selection_status_all", - "gt3l/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt3l/segment_quality/signal_selection_status/signal_selection_status_confident", - "gt3r/land_ice_segments/atl06_quality_summary", - "gt3r/land_ice_segments/delta_time", - "gt3r/land_ice_segments/h_li", - "gt3r/land_ice_segments/h_li_sigma", - "gt3r/land_ice_segments/latitude", - "gt3r/land_ice_segments/longitude", - "gt3r/land_ice_segments/segment_id", - "gt3r/land_ice_segments/sigma_geo_h", - "gt3r/land_ice_segments/bias_correction/fpb_mean_corr", - "gt3r/land_ice_segments/bias_correction/fpb_mean_corr_sigma", - "gt3r/land_ice_segments/bias_correction/fpb_med_corr", - "gt3r/land_ice_segments/bias_correction/fpb_med_corr_sigma", - "gt3r/land_ice_segments/bias_correction/fpb_n_corr", - "gt3r/land_ice_segments/bias_correction/med_r_fit", - "gt3r/land_ice_segments/bias_correction/tx_mean_corr", - "gt3r/land_ice_segments/bias_correction/tx_med_corr", - "gt3r/land_ice_segments/dem/dem_flag", - "gt3r/land_ice_segments/dem/dem_h", - "gt3r/land_ice_segments/dem/geoid_h", - "gt3r/land_ice_segments/fit_statistics/dh_fit_dx", - "gt3r/land_ice_segments/fit_statistics/dh_fit_dx_sigma", - "gt3r/land_ice_segments/fit_statistics/dh_fit_dy", - "gt3r/land_ice_segments/fit_statistics/h_expected_rms", - "gt3r/land_ice_segments/fit_statistics/h_mean", - "gt3r/land_ice_segments/fit_statistics/h_rms_misfit", - "gt3r/land_ice_segments/fit_statistics/h_robust_sprd", - "gt3r/land_ice_segments/fit_statistics/n_fit_photons", - "gt3r/land_ice_segments/fit_statistics/n_seg_pulses", - "gt3r/land_ice_segments/fit_statistics/sigma_h_mean", - "gt3r/land_ice_segments/fit_statistics/signal_selection_source", - "gt3r/land_ice_segments/fit_statistics/signal_selection_source_status", - "gt3r/land_ice_segments/fit_statistics/snr", - "gt3r/land_ice_segments/fit_statistics/snr_significance", - "gt3r/land_ice_segments/fit_statistics/w_surface_window_final", - "gt3r/land_ice_segments/geophysical/bckgrd", - "gt3r/land_ice_segments/geophysical/bsnow_conf", - "gt3r/land_ice_segments/geophysical/bsnow_h", - "gt3r/land_ice_segments/geophysical/bsnow_od", - "gt3r/land_ice_segments/geophysical/cloud_flg_asr", - "gt3r/land_ice_segments/geophysical/cloud_flg_atm", - "gt3r/land_ice_segments/geophysical/dac", - "gt3r/land_ice_segments/geophysical/e_bckgrd", - "gt3r/land_ice_segments/geophysical/msw_flag", - "gt3r/land_ice_segments/geophysical/neutat_delay_total", - "gt3r/land_ice_segments/geophysical/r_eff", - "gt3r/land_ice_segments/geophysical/solar_azimuth", - "gt3r/land_ice_segments/geophysical/solar_elevation", - "gt3r/land_ice_segments/geophysical/tide_earth", - "gt3r/land_ice_segments/geophysical/tide_equilibrium", - "gt3r/land_ice_segments/geophysical/tide_load", - "gt3r/land_ice_segments/geophysical/tide_ocean", - "gt3r/land_ice_segments/geophysical/tide_pole", - "gt3r/land_ice_segments/ground_track/ref_azimuth", - "gt3r/land_ice_segments/ground_track/ref_coelv", - "gt3r/land_ice_segments/ground_track/seg_azimuth", - "gt3r/land_ice_segments/ground_track/sigma_geo_at", - "gt3r/land_ice_segments/ground_track/sigma_geo_xt", - "gt3r/land_ice_segments/ground_track/x_atc", - "gt3r/land_ice_segments/ground_track/y_atc", - "gt3r/residual_histogram/bckgrd_per_bin", - "gt3r/residual_histogram/count", - "gt3r/residual_histogram/delta_time", - "gt3r/residual_histogram/dh", - "gt3r/residual_histogram/ds_segment_id", - "gt3r/residual_histogram/lat_mean", - "gt3r/residual_histogram/lon_mean", - "gt3r/residual_histogram/pulse_count", - "gt3r/residual_histogram/segment_id_list", - "gt3r/residual_histogram/x_atc_mean", - "gt3r/segment_quality/delta_time", - "gt3r/segment_quality/record_number", - "gt3r/segment_quality/reference_pt_lat", - "gt3r/segment_quality/reference_pt_lon", - "gt3r/segment_quality/segment_id", - "gt3r/segment_quality/signal_selection_source", - "gt3r/segment_quality/signal_selection_status/signal_selection_status_all", - "gt3r/segment_quality/signal_selection_status/signal_selection_status_backup", - "gt3r/segment_quality/signal_selection_status/signal_selection_status_confident", - "orbit_info/crossing_time", - "orbit_info/cycle_number", - "orbit_info/lan", - "orbit_info/orbit_number", - "orbit_info/rgt", - "orbit_info/sc_orient", - "orbit_info/sc_orient_time", - "quality_assessment/qa_granule_fail_reason", - "quality_assessment/qa_granule_pass_fail", - "quality_assessment/gt1l/delta_time", - "quality_assessment/gt1l/lat_mean", - "quality_assessment/gt1l/lon_mean", - "quality_assessment/gt1l/signal_selection_source_fraction_0", - "quality_assessment/gt1l/signal_selection_source_fraction_1", - "quality_assessment/gt1l/signal_selection_source_fraction_2", - "quality_assessment/gt1l/signal_selection_source_fraction_3", - "quality_assessment/gt1r/delta_time", - "quality_assessment/gt1r/lat_mean", - "quality_assessment/gt1r/lon_mean", - "quality_assessment/gt1r/signal_selection_source_fraction_0", - "quality_assessment/gt1r/signal_selection_source_fraction_1", - "quality_assessment/gt1r/signal_selection_source_fraction_2", - "quality_assessment/gt1r/signal_selection_source_fraction_3", - "quality_assessment/gt2l/delta_time", - "quality_assessment/gt2l/lat_mean", - "quality_assessment/gt2l/lon_mean", - "quality_assessment/gt2l/signal_selection_source_fraction_0", - "quality_assessment/gt2l/signal_selection_source_fraction_1", - "quality_assessment/gt2l/signal_selection_source_fraction_2", - "quality_assessment/gt2l/signal_selection_source_fraction_3", - "quality_assessment/gt2r/delta_time", - "quality_assessment/gt2r/lat_mean", - "quality_assessment/gt2r/lon_mean", - "quality_assessment/gt2r/signal_selection_source_fraction_0", - "quality_assessment/gt2r/signal_selection_source_fraction_1", - "quality_assessment/gt2r/signal_selection_source_fraction_2", - "quality_assessment/gt2r/signal_selection_source_fraction_3", - "quality_assessment/gt3l/delta_time", - "quality_assessment/gt3l/lat_mean", - "quality_assessment/gt3l/lon_mean", - "quality_assessment/gt3l/signal_selection_source_fraction_0", - "quality_assessment/gt3l/signal_selection_source_fraction_1", - "quality_assessment/gt3l/signal_selection_source_fraction_2", - "quality_assessment/gt3l/signal_selection_source_fraction_3", - "quality_assessment/gt3r/delta_time", - "quality_assessment/gt3r/lat_mean", - "quality_assessment/gt3r/lon_mean", - "quality_assessment/gt3r/signal_selection_source_fraction_0", - "quality_assessment/gt3r/signal_selection_source_fraction_1", - "quality_assessment/gt3r/signal_selection_source_fraction_2", - "quality_assessment/gt3r/signal_selection_source_fraction_3", - ], - } - assert all(keys in obs.keys() for keys in exp.keys()) - - -# the next line was causing black to fail. Since it's not being run as a test suite yet anyway, I'm taking the lazy way out -# assert obs[key] == exp[key] for key in exp.keys() - - -# NOTE: best this test can do at the moment is a successful download with no errors... need to have more code to check the files themselves -def test_download_granules_with_subsetting(reg_a, session): - path = "./downloads_subset" - reg_a.order_granules(session) - reg_a.download_granules(session, path) - - # get filename here... not best way to test for successful download though, because also need to unzip and take files out of zipped dirs - - -# with h5py.File(filename) as h5f: -# #now actually check that the max extent of the downloaded granules is subsetted and that the files were downloaded - -# # exp = ??? -# # assert: -# # obs == exp - - -# def test_download_granules_without_subsetting(reg_a, session): -# path = './downloads' -# reg_a.order_granules(session, subset=False) -# reg_a.download_granules(session, path) -# #check that the max extent of the downloaded granules isn't subsetted diff --git a/icepyx/tests/is2class_query.py b/icepyx/tests/is2class_query.py index 5d48382be..f5390f604 100644 --- a/icepyx/tests/is2class_query.py +++ b/icepyx/tests/is2class_query.py @@ -49,11 +49,11 @@ def test_properties(): version="2", ) obs_list = [ - reg_a.dataset, + reg_a.product, reg_a.dates, reg_a.start_time, reg_a.end_time, - reg_a.dataset_version, + reg_a.product_version, reg_a.spatial_extent, ] exp_list = [ diff --git a/icepyx/tests/test_APIformatting.py b/icepyx/tests/test_APIformatting.py index 73db6585f..c4daf559f 100644 --- a/icepyx/tests/test_APIformatting.py +++ b/icepyx/tests/test_APIformatting.py @@ -1093,7 +1093,7 @@ def test_CMRparams_no_other_inputs(): assert CMRparams.check_values() == False CMRparams.build_params( - dataset="ATL06", + product="ATL06", version="003", start=dt.datetime(2019, 2, 20, 0, 0), end=dt.datetime(2019, 2, 24, 23, 59, 59), diff --git a/icepyx/tests/test_behind_NSIDC_API_login.py b/icepyx/tests/test_behind_NSIDC_API_login.py new file mode 100644 index 000000000..14083223c --- /dev/null +++ b/icepyx/tests/test_behind_NSIDC_API_login.py @@ -0,0 +1,49 @@ +import icepyx as ipx +from icepyx.core.Earthdata import Earthdata as Earthdata +import os +import pytest +import warnings + + +# Misc notes and needed tests +# test avail data and subsetting success for each input type (kml, shp, list of coords, bbox) +# check that downloaded data is subset? or is this an NSIDC level test so long as we verify the right info is submitted? + + +@pytest.fixture +def reg(scope="module"): + return ipx.Query("ATL06", [-55, 68, -48, 71], ["2019-02-22", "2019-02-28"]) + + +@pytest.fixture +def session(reg, scope="module"): + return Earthdata._start_session( + "icepyx_devteam", "icepyx.dev@gmail.com", os.getenv("NSIDC_LOGIN") + ) + + +########## is2ref module ########## +import icepyx.core.is2ref as is2ref +import json + + +def test_get_custom_options_output(session): + obs = is2ref._get_custom_options(session, "ATL06", "004") + with open("./ATL06v04_options.json", "r") as exp: + assert all(keys in obs.keys() for keys in exp.keys()) + assert all(obs[key] == exp[key] for key in exp.keys()) + + +########## query module ########## +# NOTE: best this test can do at the moment is a successful download with no errors... +def test_download_granules_with_subsetting(reg, session): + path = "./downloads_subset" + reg.order_granules(session) + reg.download_granules(session, path) + + +# def test_download_granules_without_subsetting(reg_a, session): +# path = './downloads' +# reg_a.order_granules(session, subset=False) +# reg_a.download_granules(session, path) +# #check that the max extent of the downloaded granules isn't subsetted diff --git a/icepyx/tests/test_granules.py b/icepyx/tests/test_granules.py index a1ca29d91..902c21ae5 100644 --- a/icepyx/tests/test_granules.py +++ b/icepyx/tests/test_granules.py @@ -19,6 +19,8 @@ # def session(reg_a): # return reg_a._start_earthdata_session('icepyx_devteam', 'icepyx.dev@gmail.com', os.getenv('NSIDC_LOGIN')) +# check that agent key is added in event of no subsetting + # DevNote: clearly there's a better way that doesn't make the function so long... what is it? def test_granules_info(): @@ -595,7 +597,10 @@ def test_no_granules_in_search_results(): def test_correct_granule_list_returned(): reg_a = ipx.Query( - "ATL06", [-55, 68, -48, 71], ["2019-02-20", "2019-02-28"], version="3", + "ATL06", + [-55, 68, -48, 71], + ["2019-02-20", "2019-02-28"], + version="3", ) (obs_grans,) = reg_a.avail_granules(ids=True) diff --git a/icepyx/tests/test_is2ref.py b/icepyx/tests/test_is2ref.py index c2f5f91f7..3b1e3df31 100644 --- a/icepyx/tests/test_is2ref.py +++ b/icepyx/tests/test_is2ref.py @@ -3,32 +3,33 @@ import icepyx.core.is2ref as is2ref -########## _validate_dataset ########## -def test_lowercase_dataset(): +########## _validate_product ########## +def test_lowercase_product(): lcds = "atl03" - obs = is2ref._validate_dataset(lcds) + obs = is2ref._validate_product(lcds) expected = "ATL03" assert obs == expected -def test_num_dataset(): +def test_num_product(): dsnum = 6 - ermsg = "Please enter a dataset string" + ermsg = "Please enter a product string" with pytest.raises(TypeError, match=ermsg): - is2ref._validate_dataset(dsnum) + is2ref._validate_product(dsnum) -def test_bad_dataset(): +def test_bad_product(): wrngds = "atl-6" - ermsg = "Please enter a valid dataset" + ermsg = "Please enter a valid product" with pytest.raises(AssertionError, match=ermsg): - is2ref._validate_dataset(wrngds) + is2ref._validate_product(wrngds) -########## about_dataset ########## +########## about_product ########## # Note: requires internet connection -# def test_dataset_info(): -# obs = is2ref.about_dataset('ATL06') +# could the github flat data option be used here? https://octo.github.com/projects/flat-data +# def test_product_info(): +# obs = is2ref.about_product('ATL06') # print(obs) # #TestQuestion: what is a better way to do this? I think maybe use a mock, which would also deal with the dicts not matching because of the 'updated' key value # #That or check for the same keys and the same values where applicable diff --git a/icepyx/tests/test_validate_inputs.py b/icepyx/tests/test_validate_inputs.py index 0f2ae2289..2790dd69c 100644 --- a/icepyx/tests/test_validate_inputs.py +++ b/icepyx/tests/test_validate_inputs.py @@ -6,9 +6,9 @@ import icepyx.core.validate_inputs as val -########## dset_version ########## +########## prod_version ########## def test_version_setting_to_latest(): - obs = val.dset_version("010", None) + obs = val.prod_version("010", None) expected = "010" assert obs == expected @@ -16,11 +16,11 @@ def test_version_setting_to_latest(): def test_neg_version_str_given(): ermesg = "Version number must be positive" with pytest.raises(AssertionError, match=ermesg): - val.dset_version("010", "-12") + val.prod_version("010", "-12") def test_short_version_str_given(): - obs = val.dset_version("001", "2") + obs = val.prod_version("001", "2") expected = "002" assert obs == expected @@ -28,13 +28,13 @@ def test_short_version_str_given(): def test_int_version(): ermesg = "Please enter the version number as a string" with pytest.raises(TypeError, match=ermesg): - val.dset_version("010", 12) + val.prod_version("010", 12) def test_old_version(): - wrng = "You are using an old version of this dataset" + wrng = "You are using an old version of this product" with pytest.warns(UserWarning, match=wrng): - val.dset_version("003", "001") + val.prod_version("003", "001") ########## spatial ##########