diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..49eefce9 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,18 @@ +# This config file is used by coverage.py (and supposedly pytest-cov, although it does not seem to). + +# The protip for generating a coverage report on idb-backend is to +# change into the top level of idb-backend and then run: +# +# $ coverage run -m pytest +# +# which will use this config file to access the sources listed below. +# +# To view the coverage report, run: +# +# $ coverage report + +[run] +source = + ./idb + ./idigbio_ingestion + ./idigbio_workers diff --git a/.gitignore b/.gitignore index 4bae4e21..29f5cb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -86,6 +86,7 @@ venv/ ENV/ .venv/ .virtualenv/ +.venv*/ # Spyder project settings .spyderproject diff --git a/.travis.yml b/.travis.yml index 93c88867..3e5fc60b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,24 @@ sudo: required -dist: xenial +dist: focal language: python -python: 2.7 +python: 3.8.10 services: - docker -- postgresql addons: - postgresql: "9.5" + postgresql: "12" + apt: + packages: + - postgresql-12 + - postgresql-client-12 + git: depth: 1 install: - docker build -t $BUILDING . -- psql -U postgres -c 'create database test_idigbio;' -- psql -U postgres -c "DROP SCHEMA public CASCADE;" test_idigbio +- echo "docker build complete!" +- psql -U travis -c 'create database test_idigbio;' +- psql -U travis -c "DROP SCHEMA public CASCADE;" test_idigbio - docker run -d --net host --name minio-test -e "MINIO_ACCESS_KEY=${ACCESS_KEY}" -e "MINIO_SECRET_KEY=${SECRET_KEY=}" minio/minio:RELEASE.2017-07-24T18-27-35Z server /export script: @@ -22,7 +27,7 @@ script: -e "IDB_STORAGE_SECRET_KEY=${SECRET_KEY}" -e "IDB_STORAGE_HOST=localhost:9000" $BUILDING - pytest -p no:cacheprovider --pguser=postgres --pgpass="" tests/idb + pytest -p no:cacheprovider --pguser=travis --pgpass="" tests/idb after_success: # upload new docker images @@ -42,6 +47,8 @@ env: - BUILDING=$DOCKER_IMAGE:$TRAVIS_COMMIT - ACCESS_KEY="testAccessKey" - SECRET_KEY="testSecretKey" + - PGPORT=5433 + - PGUSER=travis notifications: slack: secure: "GVJcqmhKww+74MaAKiSPIf2oPxEFp0PoYHzdzL0xw5xd62OiJkrcdzOsiZ5DQxLlgU+MgWrxcxJmunMXOUvR7gt1V1WjuvYsmJ6+bC4/AU81Qr0z5BDANZRX7O8yA/WLvPyE5hsJQWAyBL0NFvkKbxzw/qKlaaoh+uUXI2FLA+LMq6kuW1BYyQuFsoX/14842ppRETrxK5uVAft7c+Egh68Tet5xO5lry3bBFZ0F75Jg5nuzgAgq3OcOe8Luo8FuekX75tBjT0hBNSM+Kn9LOPx25O6tRfivCJn1quOPNSNhet8zbeYecnSevW49VLtWi34fLX6rIsPcvGZg1Z5q1MjvxqDtuIEnhLBeR/8+hK+dLu6MP0YGcG4jBELEH13WlkmJJcH1X+DmRLK1tkgwWhJlW1RJ/QHPoqsMKMNFxS4aDenFGiYXSvv7skX8pr+i2QW1j55V6AU55OCvhsrgyHwFXlA+1ItU5geCVvmLscg8RXF7HuTrZrN/UxLjDVPAjY4rHS2ccZx1g3vo+K0OWafKk6yOi9J7rfwT+OGCMGv3Q57i1ShDIHvmfzfJmsjhtRCvKowwUrw2/Udean/ncdcRLvTTv0Xn+ioxnWAyvWo7UMdXj7YeHvp4bT9pY2eSjfHjB6Fe7S3vWC5zzLc0BDYouxkysv+j0EvP1vx84t4=" diff --git a/Dockerfile b/Dockerfile index 959a97b1..938db1b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ -FROM python:2.7 -RUN apt-get update && apt-get install -y --no-install-recommends \ +FROM python:3.8.10 +# python:3.6 and later are based on "Debian GNU/Linux" +RUN apt-get update > /dev/null && apt-get install -y --no-install-recommends \ gfortran \ libatlas-base-dev \ ffmpeg \ @@ -12,9 +13,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # fonts-dejavu-core \ # libxml2 \ # libxslt1-dev \ - && rm -rf /var/lib/apt/lists/* + > /dev/null && rm -rf /var/lib/apt/lists/* COPY . /opt/idb-backend/ WORKDIR /opt/idb-backend/ -RUN pip --no-cache-dir install -e .[test] +# RUN python3 -m virtualenv venv +RUN pip install -q --upgrade pip +RUN pip -q --no-cache-dir install -e .[test] USER www-data diff --git a/README.md b/README.md index eb07855e..761da99a 100644 --- a/README.md +++ b/README.md @@ -8,27 +8,23 @@ iDigBio server and backend code for data ingestion and data API. ### System Dependencies -Currently this project only works in python2.7 and is not compatible with Python 3. - -The following library packages will need to be installed to run the api: - -In Ubuntu 16.04: - - apt-get install python2.7-dev libblas-dev liblapack-dev \ - libatlas-base-dev gfortran libgdal-dev libpq-dev libgeos-c1v5 \ - libsystemd-dev +#### Python 3 instructions: In Ubuntu 18.04: - apt install python-dev libblas-dev liblapack-dev \ + apt install python3-dev python3-all-dev libblas-dev liblapack-dev \ libatlas-base-dev gfortran libgdal-dev libpq-dev libgeos-c1v5 \ libsystemd-dev For Ingestion and Development, the following are also needed: -In Ubuntu 16.04, 18.04: +In 18.04: + + apt install libxml2 libxslt1-dev ffmpeg fonts-dejavu-core libfreetype6-dev python-systemd - apt-get install libxml2 libxslt1-dev ffmpeg fonts-dejavu-core libfreetype6-dev python-systemd +#### Python 2.7 instructions: + +This version of idb-backend will not work under Python 2. ### Package installation @@ -70,6 +66,16 @@ no need to set the `PYTHONPATH`. In any invocation an `idigbio.json` must be present in either `$PWD`, `$HOME`, or `/etc/idigbio`. +For convenience we can create links to the virtual environment entrypoints in `/usr/local/bin/` so we do not need to activate the virtual environment explicitly or use the full path. + +``` +$ sudo ln -s /home/idigbio-ingestion/idb-backend/venv/bin/idb /usr/local/bin/idb +$ ls -la /usr/local/bin/idb +lrwxrwxrwx 1 root root 48 Aug 16 20:23 /usr/local/bin/idb -> /home/idigbio-ingestion/idb-backend/venv/bin/idb +$ sudo ln -s /home/idigbio-ingestion/idb-backend/venv/bin/idigbio-ingestion /usr/local/bin/idigbio-ingestion +$ ls -la /usr/local/bin/idigbio-ingestion +lrwxrwxrwx 1 root root 62 Aug 16 20:24 /usr/local/bin/idigbio-ingestion -> /home/idigbio-ingestion/idb-backend/venv/bin/idigbio-ingestion +``` ### Data API This serves the `api.idigbio.org` interface @@ -82,7 +88,7 @@ This package can also be run as a [celery worker]; this is used by the data api that launches some tasks (most notably download building) via celery to a background worker. - celery worker --app=idigbio_workers -l WARNING + celery worker --app=idigbio_workers -l INFO [celery worker]: http://docs.celeryproject.org/en/latest/userguide/workers.html @@ -91,111 +97,47 @@ celery to a background worker. You probably want to run in a virtual environment. You may wish to disable the pip cache to verify package builds are working properly. + +### Python 3 + ```bash -$ virtualenv -p python2.7 .venv + +$ python --version +Python 2.7.17 + +$ python3 -m virtualenv -p python3 .venv +Already using interpreter /usr/bin/python3 +Using base prefix '/usr' +New python executable in /tmp/venvtest/.venv/bin/python3 +Also creating executable in /tmp/venvtest/.venv/bin/python +Installing setuptools, pkg_resources, pip, wheel...done. $ source .venv/bin/activate $ python --version -Python 2.7.17 +Python 3.6.9 $ pip --no-cache-dir install -e . $ pip --no-cache-dir install -r requirements.txt ``` -It is possible in the future that this project will be runnable using "Open in container" features of Microsoft Visual Studio Code (aka vscode or just `code`). +### Python 2 (obsolete) -### Testing Dependencies +This project is no longer compatible with Python 2. -Some idb-backend tests depend on external resources, such as a database or Elasticsearch. -A local postgresql DB named `test_idigbio` with user/pass `test` / `test` must exist for many of the tests to run. Note: The data in the DB will be destroyed during the testing. +### Develop in Container -Database tests will be SKIPPED if the database is not available. +It is possible in the future that this project will be runnable using "Open in container" features of Microsoft Visual Studio Code (aka vscode or just `code`). -Tests that depend on Elasticsearch will FAIL if the computer running the tests cannot reach the Elasticsearch cluster (fail very slowly in fact), or if there is some other failure. -### Running tests +### Running the Test Suite The test suite can be run by executing `py.test` (or `pytest`). -However due to the dependencies mentioned above, you may wish to run the database in docker each time. The sleep is needed to allow postgres time to start accepting connections. - - docker run --rm --name postgres_test_idigbio --network host \ - -e POSTGRES_PASSWORD=test -e POSTGRES_USER=test -e POSTGRES_DB=test_idigbio \ - -d postgres:9.5 && \ - sleep 5; \ - py.test ; \ - docker stop postgres_test_idigbio - - -To exclude a single set of tests that are failing (or Seg Faulting!), add the `--deselect` option to the pytest command: +See the [README.md in the `tests` subdirectory](tests/README.md) for more information. - py.test --deselect=tests/idigbio_ingestion/mediaing/test_derivatives.py +There are a number of important dependencies noted there. -To find out why tests are being Skipped, add the `-rxs` options. - -A "what the heck is going on with the tests and skip the one that is Seg Faulting" example command: - - docker run --rm --name postgres_test_idigbio --network host \ - -e POSTGRES_PASSWORD=test -e POSTGRES_USER=test -e POSTGRES_DB=test_idigbio \ - -d postgres:9.5 && \ - sleep 5; \ - py.test -rxs --deselect=tests/idigbio_ingestion/mediaing/test_derivatives.py ; \ - docker stop postgres_test_idigbio - -### Create a local postgres DB - -The recommended approach is to run postgres via docker (see above). - -If you have a full installation of postgres running locally, the db can be manually created with: - - createuser -l -e test -P - createdb -l 'en_US.UTF-8' -E UTF8 -O test -e test_idigbio; - - # The schema obj is still owned by the user of the above - # statement, not the owner 'test'. Drop it so it will be recreated - # by the script appropriately - psql -c "DROP SCHEMA public CASCADE;" test_idigbio - - -### Schema - -The live production db schema is copied into `tests/data/schema.sql` by periodically running this command: - - pg_dump --host c18node8.acis.ufl.edu --username idigbio \ - --format plain --schema-only --schema=public \ - --clean --if-exists \ - --no-owner --no-privileges --no-tablespaces --no-unlogged-table-data \ - --file tests/data/schema.sql \ - idb_api_prod - -Except not yet because there are lots of differences between the existing file and one created by running that command (due to fixes for https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path). - - -### Data - -A trimmed down set of data has been manually curated to support the test suite. It is provided in `tests/data/testdata.sql` - -The full dump / original was created with something like: - - pg_dump --port 5432 --host c18node8.acis.ufl.edu --username idigbio \ - --format plain --data-only --encoding UTF8 \ - --inserts --column-inserts --no-privileges --no-tablespaces \ - --verbose --no-unlogged-table-data \ - --exclude-table-data=ceph_server_files \ - --file tests/data/testdata.sql idb_api_prod - -Such a dump is huge and un-usable and un-editable by normal means. It is not clear how the dump was transformed / curated into its current state. - -If running the dump again, consider adding multiple `--exclude-table-data=TABLE` for some of the bigger tables that are not materially relevant to test suite such as: - -```plaintext -annotations -data -corrections -ceph_server_files -``` -We likely need to find a new way to refresh the test dataset. diff --git a/etc/systemd/system/idb-api-stats.service b/etc/systemd/system/idb-api-stats.service-deprecated similarity index 63% rename from etc/systemd/system/idb-api-stats.service rename to etc/systemd/system/idb-api-stats.service-deprecated index 04d96859..754f5143 100644 --- a/etc/systemd/system/idb-api-stats.service +++ b/etc/systemd/system/idb-api-stats.service-deprecated @@ -1,3 +1,5 @@ +# deprecated for both naming and the call. see: idb-recordset-stats--aggregator.* + [Unit] Description="Runs `idb api-stats`" diff --git a/etc/systemd/system/idb-api-stats.timer b/etc/systemd/system/idb-api-stats.timer-deprecated similarity index 59% rename from etc/systemd/system/idb-api-stats.timer rename to etc/systemd/system/idb-api-stats.timer-deprecated index 2d3fc81d..256189b3 100644 --- a/etc/systemd/system/idb-api-stats.timer +++ b/etc/systemd/system/idb-api-stats.timer-deprecated @@ -1,3 +1,5 @@ +# deprecated for both naming and the call. see: idb-recordset-stats--aggregator.* + [Unit] Description="Daily timer for idb api-stats" diff --git a/etc/systemd/system/idb-collect-stats.service b/etc/systemd/system/idb-collect-stats.service-deprecated similarity index 63% rename from etc/systemd/system/idb-collect-stats.service rename to etc/systemd/system/idb-collect-stats.service-deprecated index 88cc1e73..ded4bcec 100644 --- a/etc/systemd/system/idb-collect-stats.service +++ b/etc/systemd/system/idb-collect-stats.service-deprecated @@ -1,3 +1,5 @@ +# deprecated for both naming and the call. see: idb-interaction-telemetry-aggregator.* + [Unit] Description="Runs `idb collect-stats`" diff --git a/etc/systemd/system/idb-collect-stats.timer b/etc/systemd/system/idb-collect-stats.timer-deprecated similarity index 63% rename from etc/systemd/system/idb-collect-stats.timer rename to etc/systemd/system/idb-collect-stats.timer-deprecated index 74eceb39..19cd83de 100644 --- a/etc/systemd/system/idb-collect-stats.timer +++ b/etc/systemd/system/idb-collect-stats.timer-deprecated @@ -1,3 +1,5 @@ +# deprecated for both naming and the call. see: idb-interaction-telemetry-aggregator.* + [Unit] Description="daily timer for idb collect-stats" diff --git a/etc/systemd/system/idb-recordset-stats-aggregator.service b/etc/systemd/system/idb-recordset-stats-aggregator.service new file mode 100644 index 00000000..d0206bb1 --- /dev/null +++ b/etc/systemd/system/idb-recordset-stats-aggregator.service @@ -0,0 +1,12 @@ +# https://redmine.idigbio.org/projects/infrastructure/wiki/Portal_and_api_stats_overview + +[Unit] +Description="Runs `idb api-stats` (recordset stats aggregator) via non-root user and virtualenv" + +[Service] +Type=oneshot +User=stats +Environment=LANG=en_US.UTF-8 + +# the virtualenv is "baked in" and does not need to be activated first +ExecStart=/home/stats/.virtualenvs/idb-backend/bin/python /home/stats/.virtualenvs/idb-backend/bin/idb --journal -vv --config /etc/idigbio/idigbio-recordset-stats-aggregator-overrides.json api-stats diff --git a/etc/systemd/system/idigbio-ingestion-derivatives.timer b/etc/systemd/system/idigbio-ingestion-derivatives.timer index 54655232..5467e271 100644 --- a/etc/systemd/system/idigbio-ingestion-derivatives.timer +++ b/etc/systemd/system/idigbio-ingestion-derivatives.timer @@ -3,8 +3,8 @@ Description="Timer for idigbio-ingestion derivatives" [Timer] OnBootSec=13min -OnUnitInactiveSec=10min -RandomizedDelaySec=4m +OnUnitInactiveSec=1min +RandomizedDelaySec=15 [Install] WantedBy=timers.target diff --git a/idb/__init__.py b/idb/__init__.py index c11769ec..4349a30d 100644 --- a/idb/__init__.py +++ b/idb/__init__.py @@ -1 +1,2 @@ -__version__ = "3.0.7" +# This sets the version for the generated idb-backend PyPi package also. +__version__ = "4.0.0" diff --git a/idb/blacklists/derivatives.py b/idb/blacklists/derivatives.py index 4aca9e42..98d2b653 100644 --- a/idb/blacklists/derivatives.py +++ b/idb/blacklists/derivatives.py @@ -9,958 +9,1187 @@ # Note that this is a Tuple so it can be used in pyscopg2 as an input to "NOT IN" DERIVATIVES_BLACKLIST = ( -'000281ba1d5f8d068e3dee96296ff102', -'0029b39c964e3c10ec92690f1835de8d', -'005481bf6fba9b3f6e43cd4dfb0fef5e', -'0092c69f4fb681c7a0859d4bebf9f212', -'00bdc846484def25260094da28c919b7', -'0135a964f0fc8ac95fdd51af2ee3d675', -'01885aec48c675b8c1cc5403538105e0', -'020cf7ee044d55a5a8b10b8f91caf389', -'0281374a2388ef6df6b45075ae6097e2', -'0377bc3723eabb98c2327f9646739a8c', -'039370bf32703882369bdc7e48f14a0f', -'03fe8c7fd5e80dbdb5fdacb28407f1a6', -'045687ebc08dc22d14b4464fbe935ed1', -'0516066e208b084ea10db953152a9b20', -'05239ad7cc38f0e8d3f05babf698b8bf', -'052bbad7b380d8683d85455db7221f81', -'05bc648bec7f4d0f90493cdecef2aa33', -'05e3041c0ee55331c355117c995000e4', -'060712adcfa6f7b040f701ca03a266a0', -'0628326e3e4e0fdd7699dd48831d4d05', -'069752bd3600e47e1f52ae8b3198d728', -'069cad0d46b60c05331f15dfd6e45b1f', -'070f9e2c5fc8a717cce67ee4c80472d2', -'073e4b8d5014976a94a7c86218e9413b', -'07627c8f8459308006b41d71090690eb', -'07c53ad26c54acdab5b6c98cf8e97122', -'07e4d25502eaf99ea34b0752cae1b225', -'08dc3a21e397c01fa375b93b2a87beae', -'092a6dd4f2986baeac98bd1849da4fc1', -'09369384ca82de49218cf5e67a14de6d', -'097f64d87922de3bf8f48b054ba844b9', -'09d1607af4f2693512d1bf4622a02fa0', -'0a16b7def7b7e0a5999236916fbfb7a3', -'0a2487d9639a1c56a9bec165e84f738c', -'0a4c0075b5d84c524054731716b54bcb', -'0a676e79756552293f8049fca16e8c7e', -'0a795cbbd79c99c3d1da81858fe91c6c', -'0a984427cb3fc0dcefae2bc181479dae', -'0aa080e93f6fbf0a7ac7a5b66515ae66', -'0aa6251fe58c0257846f9bc639243ac0', -'0adec962e4e2d84c8d09fa28cc6f608e', -'0aed12f5285e4b1621cff35e2e16f741', -'0b1d930aaa3ee98294757bcee48073b4', -'0b4bfb566529b7769fc41c6abbd6fa26', -'0b7a86a5e9d1d8da65fa98ac6040034d', -'0b8198767521bc2f452ef317e80545a5', -'0b9527cd7f1bb46a1d50595c4a92e8f1', -'0bdab840876ff65808e60cefb200420a', -'0c6cf45b5b98b535b7232ecb0043774c', -'0c8daa545af86a8d3694c51b45989981', -'0cbea54533054458364b597c3b888f47', -'0d26639585f7217e330c6355c95e58bb', -'0d52d047264a77bea36711c8bb65d20e', -'0de5c224f5790391238a995b92583784', -'0e2c99a8b88abcc2ef3d9f67d4f037cd', -'0e85728ab43a4e98eb038818d345b638', -'0e893b31a6866bd570b45efccc0a88a7', -'0ed8d05a51532399760374d7a926a683', -'0f5f3f1f6da28983f8888b7834861970', -'0f98ca8c7d66e01e1498fc62766c4906', -'0fecab2869153e06731c08ad93e7ca59', -'109a52779f4bb1ee917a9a4e73d93b5d', -'10a2cf81bab5ffc3b6fc79fc46b953b4', -'10b57bdafa2e54c48e5b52b8dff39b40', -'10ce085f9edbadbac9a5f316f8773a4b', -'114ab357e3f25d7607b8ffb29af26996', -'114f4ac6c63eacbe1ba2f9da392a5710', -'115926e5ecb579e8855980df1d57f17a', -'116e555755894ff0332128e74ebce784', -'117d58eabdc4f5eee8cb7a70a0004962', -'118f1f337541d5b1995d1534656b08a3', -'11ac4bbe9fce147954177b20f2edccbb', -'11ba53d81683d6cf9f44d245538ba488', -'11d49a25f1600139188bc0d19defa2b6', -'11f059f1872aae766a71995194e6b5af', -'12523482232547122f2f4a56953b3893', -'12b665c75d3e04cfd4c9fa548e02cf49', -'13891a137a4dfab120a35dd33159b7f0', -'13f781d434ffb6505324cace5cdca05b', -'14914453b3ce945683148bb603040bf1', -'1528b11b690e20bf60daf3dcce67e6fd', -'159924469bef2a400cdb8cbaa78df820', -'15bcd197946693d9893f1c5fa593c3f6', -'15e7ff8de63317c54471fa510c5ad56b', -'15f521580593d1a0c80332b563fe7478', -'160ffe5d0ebe9d7549c2293ac0c1d613', -'161993c546c061697950c2f562664319', -'1671e4d7647fe63663497f4492a95a4a', -'167b11e11daaa25e4009500b04a838fc', -'16c94bfa77976e244a02d291129ae3c5', -'17378c4626daaa51717369704ab36a38', -'179c38d57eb85b106dd95eba45b555fc', -'179da2793bfd142f33952884d20d21d2', -'17c73e7814a5f2d26fae015990d90159', -'17d4f2ff4a93e4644f0b9e9287f63fa7', -'18061935e6ab21f528d9dbbb36310a5f', -'180a7cf96aa37f56998a485cf22dc18e', -'1848993ceba448b05a1ff8e3a1ab427f', -'1856c914b879406212e82616cdaf8afa', -'18837494e4e25257e9d077d6374e336b', -'189a8950a57553c9d3bc75a4d8975eee', -'18e54707cb6f870fca10162d819386e6', -'196119691791be16ae0dc8cda65a2e23', -'19a1e7d12c3b6b5ad7de061d4d3050b8', -'1a37b248c0a76d5b9301b125f9294baf', -'1a678fa606dd463c7dba13cc7bf3decf', -'1a6d8da22a8baf42b7b1190b43fc16b6', -'1a85bc6c5f8780a344dc2a47df01118e', -'1ac67ebed39abe083407e98aa1c0eba1', -'1b82dc0bc393b5f8f5e4dd1ed050a194', -'1b8c2f498d2aaaf3136983ded141b5d6', -'1bb5175e4054393058019717217cf797', -'1bb909859399dcd2edf2c9ba49ba0975', -'1bca76eb57556639c84a6ff18f57d653', -'1ca233fd4979364b8488ff70abaccccb', -'1cb787a79926cce3b7cf9c4f66b34c04', -'1cd6bce4c44aef512873b29c629d1be4', -'1ce44bcdd93262a15336ad62d26c9b2f', -'1cff0213011d8f31d18859559e2b9491', -'1d165247b84f46e6772d1f659eb5a5dc', -'1d9f6266df45dfa7c38f27a1def193f0', -'1e725890a0bf079fb0624080eac60066', -'201a5adf58d04945b22229c716ec49cf', -'202d8ab0948b29b35fdac71b34ce47ab', -'202faffcdefdf3f55cc5f91d1604ade4', -'203feb124dd7abe0ff5115ba0fcd7522', -'209e5d06f999bac29ef6674531061ef8', -'21037e5f5ee9bb71d6445488a7322656', -'21124d7350412c4295a1a29ec5d85d2b', -'21788fae95ad3476eb4bdf4283d00ee7', -'21ccddaf6aaa908649541a933b71adf9', -'21e67b4405b8a0a9d487587a8e6392ae', -'22236ab4c15350f2efb39074e1b49dea', -'22c30e00ecaa6e99b925bacd41208a86', -'2346b30adc6129a2f8ceeedf47812228', -'23f3f8d03700d08eb60cd78c2a32760c', -'2433ec87a51596eb09e3e20d281817f5', -'245e25886fb6015c058f02c1dc0fcc6b', -'247e276ca082c52389c581d7ef3577d2', -'24af4c6467f9f1a2ae7a1599568838c9', -'24daa96e03038c673328310e4cb5d2ee', -'24e30c967af0e7f31175d45d52be2c71', -'250f4d3b1a2d0b8fe229d4ba1c74e99e', -'2524573dfc1342a7bfdc5e357924e673', -'254d91ecbc37546d38a28076aa20714b', -'255538ca6f6595ad001c04a717c4e546', -'256d9fd5f3e62d974ed31599f9ab0a7c', -'25adfa8c4f8f99b605d1fc77826ff4e9', -'25ff0de8b0465b991a4ca36accadd697', -'2669332932d27650b00c8a582c181650', -'26af6e3202e3b53d9c3c54927837146f', -'26b9d67b06ddc7a5e01603e68ba6b226', -'27a794fcd9ac4b04397597be791b144c', -'280a4af795570a047c785ef092df04bc', -'281d20d97facbfb9e049e9cae5221441', -'2864ea89bc97d03886948cd0c1017ce2', -'28b1de8ad599137214c2b06144f7074f', -'28bc6cccd51775ebbd86134547986834', -'28caa99622bbe4b37ed2950893636c01', -'28e55710154d7a253742e5b3b8050c27', -'28efed2d1f55020051fd19f6c0b4e378', -'28f735bcf1af085c4173c72b38196658', -'29aa9f4a9658875d0e2ffefd433e6224', -'29f96d669e31f3a31ba22c6ab3db18d5', -'2a252f1d230e71a99480bc8ccfffe1b3', -'2a270f3c2588e19c8c499e1ba403a213', -'2a289a4024f786d7c21bea36324edd59', -'2a51212944401e86c82e153f18de4563', -'2a575c5cb30e7999f7437b00402e4914', -'2a59bb4ad213b2bb421d1b9017beaab8', -'2adc6b2cf08b799d23673e6664932307', -'2af65154930f1e05e31f1e2af4a9c2fa', -'2b2249cf15c25abe780a55f9c6b18fd0', -'2b3ba80aa86e1066a408cdf63278eb44', -'2bb9d4e5247b0a6a2e51f0d4e9d59306', -'2c626e08adc15d0903f7ef7d0d425580', -'2c73f77f24194f7a08c458ff95da9f89', -'2c7ef33da8500df06ad85fba7a6c52ff', -'2cddeccf128d4268f01f244ebdcb2af6', -'2cdf46f102415b53307680bd8ab3c2e8', -'2d47023b43c8e2c5ef904581aa717231', -'2d65c10c6b1a40605dfb6654bee01151', -'2d85373c539558d7e279c40b00333b71', -'2db48c4b2a0291467b30d95f46a9f2e2', -'2ea0bbea18ebf4cee93ee8a8a8d23fe2', -'2f15aabe7689076793bbfeb80d79245a', -'2f30c1b9a7be022d22ce54d301065f4f', -'2fa0ab4a0f301da9807fa288b9b8b1b7', -'2fff098dc6663c0ddbdf921bbfdef6a9', -'30039517eaf9140564b07551395d4d13', -'303fefaa15e06dcabc8adb78d6c04dd7', -'30d3cdc9facf0c6548379caf5e61bb9f', -'30fe2bdb2780818e2a539f058cb6d0b5', -'313bf32bcffb5da88d86d0ed816901e3', -'3172cad333d9e85e7e972e08f1dd3a4e', -'31c142d791ead477361dab4678386dc4', -'31ff3a4ad528e7da897d5e4d61e4f5a6', -'323c8c13bacc55a9ffa52ae0754f4544', -'3261ed91de1201840519b4c8ba6e541c', -'32fc6fd1d664f514199b392e98f0637e', -'3342a225d55d3bfd1460d7d7b6235bf0', -'334d6cd24dc91fdf3c0e2dae814859da', -'3369461c36bbfc479582170fc1aba248', -'337987e09416de39c7fb1d1df21ecbed', -'33c7009b84786fa8dca3943ebe69f58f', -'3514c473a63d7c489f8c1406ebc5db49', -'35a793e9c9ac56d8c74352180d79812a', -'36140643574894602ba02382fe5b7217', -'36daab3778b884a95ef3c4ddd4fb7b7c', -'376f987ce35063dc19e641fe846d6bbb', -'37826389b91da6bc757f531b826d5b7d', -'37913e8e492234fb6b3727a66d77533a', -'37e1350b0bad6f9c00c5d2b897c64b02', -'384049db8d6fa59a9e1844c118a36063', -'3881f1922b2f6b0d351013213148caab', -'391a599b837ee4d3e32cda5ae8a01129', -'39287b10c6bfc48fe00be990f75e15c0', -'3981fe9769b1b77f871336221d1fbbb4', -'398e0fdf911ab0d48ec4fdf657be6a20', -'3a5ea124bed49fc56a0be60585380284', -'3a6ce9f7cd7b10addd593e5b44fcfd2d', -'3aa590b6cda38578111c926fce94ec96', -'3ab4b34d1a3c4b0a600fdd618efde908', -'3b251b703a9801ce242e87b0871bfbe5', -'3b3ae6b903843a01b027eacfc222bb02', -'3b3c1e5fd01561cf82ca898ab09918e5', -'3b7566ea6df8c193dd385f10496128ee', -'3b78089b7307818b2e8c2bf9e4a96803', -'3be309dc82576272d828183255819642', -'3c5a5946d3b86a85b64a46425a55714e', -'3c8669c0263e1542c24ad6604bd57786', -'3c9e1b23a00183a9b45fd8440b37aa4d', -'3d1bdad7dc8ad8ab4fa08defb46e62ea', -'3d1e9b80bafefd9ddd46260070a2cf6c', -'3d219f091f7b6a1ab87124adae2f7e94', -'3d877de80bb2dde6b140d9d82695e1e7', -'3e531f3bbf8bc42a18a19ea8937d33b6', -'3ebaff73c670b796d24c152d000d3ff4', -'3ecc7e5036a2933f3958298a9c632912', -'40e89f6f8e739454fffaad4148c96f6f', -'4109d6e3d10bd4e1b6fd44d9d3da6565', -'41362119e969765a9a0d4b1ffc1c9c9a', -'4157abf1fd5ff6f7cc55fcf03a289f21', -'4166ec33bb88dc0f023a654305b5cd55', -'41cb36d706901224acd7aeafe805b39b', -'426b213411b191ec7ea99a4f9a0a64bd', -'429c00232869ce5d2c0b5c53b3929ceb', -'42d12fc8429ed9b609ceaf22d7ac4a47', -'42fb1b4b447a64e9d1dd43168c7e1a29', -'434c79a75d496a440115bd55e4eaa2a9', -'4357de8bee11495b084b2bf16777e2dd', -'436648b6d4da9bffd87d31172ae58c9b', -'43ec92c8a31ff71cee5266cc06891d9c', -'440f084304e4bcfde47dc4e87bf84d2e', -'44318769765abfcd37e0d0c2aa5cd7e5', -'4464b81fc15b58dc0eda6031cbac520d', -'44b32061c4d34802d75b0fd8268192fb', -'45324979ffbf37e84ba58fd32b103d5e', -'45389cb5fdeb019f15f5ff6e4ce83856', -'455721a761d698b3bf6a6f65ddc5afdc', -'457741cead43310e419be4c798f028ab', -'457a39e18300a9416d48f93bcba36749', -'45c727cf7a54beca386c8efb6a849f6a', -'467e2453cca71a992d0698cb2b593e0e', -'4699e376449bcda91ee0aa62df5ee61f', -'46af92472808634424ae29d8038f261f', -'46be67f57b2a7c20e239cd65901066bd', -'46dbd6995d81facadf24fa7673bfdc5f', -'46ecc8679281cbbc2af4521dbefa3657', -'472736b6d1e2b0c2335583e3bf734eea', -'47377f181b8608343384a13bfb5f9789', -'4740e51bd8b298859d54455f215f8adf', -'47bc84399c3575e0270dbe8fa0236bf8', -'480bae5ffccbae4124285bf6276e0cf5', -'489866e361c55a874d0183470c0d72dd', -'48cfe5c81bce5ad75e2562c3e9b0c82e', -'4915b7a10e36ab791f2af54888b690d7', -'49500752f1de9219d6cd37a4fd189fc6', -'499fd9de88d0db2869593707cba0c9bf', -'49c39f4114a2ee21eda54a74a562bd40', -'49ce0c2a9cf277e01a2bcb36d129740e', -'49fb93a4190d73166a1287fb73db9718', -'4a27920d5831178486e182d4eca24355', -'4a29f53f1b11515179d5eeae4e975c27', -'4a2d95401099aa5c5ff4caa526da9e17', -'4a61fa295a22de8560757eeccea704b9', -'4b217a4d59cc41b06b33b25a9198a96c', -'4b7f671a97d283029ef0b60b340db4d7', -'4bbe3ca34195dbbdfe0dcdb2798bb0fe', -'4bcefd38b7e89f181e0ed93d2f88145c', -'4c8424ef265d3ac57053f79a179452ed', -'4cb6d0b4636b96453ac7243f43082593', -'4d33f14cbf2c48c8457e5b187e70549c', -'4d575bf111e79045b4b5e60a2ab73f25', -'4d917f40dc95c5162c4479349ba35fdf', -'4dbb515302b2edcbf29b150c00aa3e82', -'4dfc00bc70c68cce265eaf340c32acc5', -'4e8b0a809caadf218591824df58e5d16', -'4e8b4f143cd24dcbdb2f34d3f8cfb759', -'4ec07cbb6bd17196442e3c80ed769619', -'4f5a39d9cc9cce96cc89b21af5cf275a', -'50a0f4baae5ed69e7893b58f0fb93d0a', -'50afa16b0bdd5903e84499011755b5ee', -'50d0eda39a11627a7566fd931b1d7da2', -'50e2148bb145a6a22d7add40577fc655', -'50f53d47e80d9ee084dbec179bbff42d', -'51ed5dd964abdb8667a3f4a2164e58e4', -'5205026f9155d0375f0fae4b64aa5c96', -'523b1a3d1f42a90fada3df3c44e91d2c', -'5248afcb1be3eb36261f3d2bd1cccb0d', -'526d38a1768970d243c7892ff3ccb6e0', -'52b22af81f73000abf1812921faccfa4', -'52ef659713b9351c5f00b4260ffdee72', -'52f007b687a54d9317e97b55c69e05e3', -'530c067d4e8d06cf4c6abb9d54284ce2', -'5340931fa00694272ea1ed65a0b0142f', -'5357294e9f1e8137c7cbcbe93487e4c1', -'5383a0cc4f04cac5eae39bc97974fd5a', -'5399da7661e88940639467979ae1ca84', -'54113debe6196b329b52dd414c32ba8d', -'5485d6ce064e6f3ff9b77654faf3c471', -'54b166ba042e89c7484f675a370ab367', -'54b88637e43cabd1618a60fc15938ea0', -'54c8047a679d43200ef4ef39a99b0d03', -'55ad8d0bf7e02284acc6b928a918e225', -'55bcfd0805ea911d5b73a5f7e1b04640', -'55e1266f85b6139c1a3b63878a6352f9', -'562345a37c75abbfdb970fd78c700078', -'563b6b092c37a119a5a434afff399cf1', -'565de2adf4e331dea123cbbacc680d39', -'567155590c1768d6057f985ace6eab1c', -'56e5f7f5206eeadafbe9ff8a9e960416', -'56f3af901191f6edaf9de972f82ae99b', -'56f6bd72ea4de9214ac652bc434cbe6a', -'579641706b1d3df4fee1293648bd63d9', -'57b29beba489ef4debdf9dafd5c0bdc7', -'57d66d5ccc423f826fe628a57ce96397', -'580054aa2370647cfe9826ccadc4b96c', -'582c2ee88cd211bc9477a5523b27ac1b', -'58b217dc2545dccfe31b75f1b59e6e4b', -'58f4391217544ee4b92a186a07a41795', -'5911f7eae4da6bd53a082f9ddb30d131', -'591c101d6833c440210609b18095eb2b', -'5938266faebd33436de01ff1a3ec7436', -'59472321d270a4550c9ed4bece9ffd89', -'5961c455706158ac40a34e63974c90b8', -'59bf6438bcdab6867535e31803655a17', -'5b68f1fab59ce019284060e2ee9af815', -'5bbe967a0f721d6daa709316829ec97e', -'5be951da1e739ea740e53712d562d272', -'5bebad15261f25307a93dab063589a9e', -'5c123d7c181c4e3af1add44096af70e6', -'5ca3444c645de8ef87c4cd65d5148633', -'5ce9c8a3d34288e30d5124ce99a08eac', -'5d0f14c76eb1b2bcdbc1245e77c0b5a9', -'5d3d2c58ce79cc181e8dd46b39ad6992', -'5db4fb6d26d4277470ddb73dfc57ccea', -'5de1d6a94d55add2a177b345deac8df0', -'5e0a310921e2ce4065447a36dd581b91', -'5ea382d38405c2f28c85be72b9e4cfb3', -'5f198e1ef7dcc9a3eaaba6b2ba2af37e', -'5f1ca699f84fe2ff99c81fbd3f52ce1d', -'5f919c5345bfee0b3c759d7626ff9371', -'5ff6690c66a27f0b3fd2d4f85fd4fbd9', -'60253b7dcaac00bde953c510c0902691', -'602cb41449b1f7dad75677f83eb1078b', -'6062d276f90d81b84883bf42193c09b6', -'60a379d8fe9b2daf9b76d73edfcc54e9', -'613270e0f1f630b0034939bfa1058000', -'6178dd680e125f4e7b25eb12dde72f4b', -'61804ccb95db616851ce33a026b8a2cb', -'61c63de6086b72c2b13ed955220ae62c', -'61c722a79c087593321e43d08401da4f', -'61cd317e99c05839abc3b53a06295e10', -'61fd4070d92b8d311dd8771732df776b', -'624df4ede61e915aa3eea6d68aa0dfb9', -'6297f545b24306330c7c0db882de6578', -'62b132077d93e516948dadd6df437960', -'62b575dfeb7c9499b93e746fa5ef6d46', -'63cad32b83072d6fd80a176c04aa28fc', -'63d6ab6cd019cdfb2f895368662a906e', -'63e62d70beec7cee6d6591d72d7405fc', -'642159ac6f0e25bc36b445d1daf7cad9', -'646f822bb5d1b11fe82af1060cda3718', -'6477363ede1c6c7bbe8ff2728fbabdb6', -'64b4667258e9eeece9c12965e0509905', -'64bf323c9f81116146d7552422f35527', -'64f5c6f882e74c27712976ef9bb592c1', -'64f6bc5e6cec9bf8c4fb694c3edba5a6', -'6501f42529aa8db0473b7b0866df53b2', -'6649382d7c2d5d1b834868c5b159de25', -'66897ec932ec14c43b7156b453d9aad4', -'66adc632cd068063ff250b210c529f57', -'66d650bb662475c6b5cf052a3826ee9e', -'66e1ac5e2e8cf3cf445eb5da5f631ad8', -'670649bd1ed52cacf4bcca8c5a90fc0a', -'673d86d168833c4d1440c9248b877b83', -'6790ab2d34cfc19461a6bf255f925597', -'679647e69a20bb6482abd1e5f2b7d931', -'67cdacac202a2d3b16c1b22733996de2', -'69143bfe7dcb9c15fca1160c3730bd52', -'6929a033e96fde056b29ef49423f9f57', -'694bee21f880e1af4bc78315cf7c84ee', -'69602a09232ca64ebc83156a4ab70b5a', -'69c0fd411df6a5340681e4157f89864d', -'6a1d9cc5886030d429ec810f31fcf65d', -'6a545e8466d45e68fc83abcee91cf843', -'6a6ff872d323e4a864cd4db863883e74', -'6a7ec4e6c8321662dba76276973827ef', -'6bc73fa1caae19ba8bf89cd5d2aa0caf', -'6bd91c969b4cbf750d6465852617b33f', -'6c1124e6418cfcc8ec970f7d38cfb280', -'6c524f8f4db28ee0c0f8d46e94f17243', -'6c8825d743b0cfd9de0c0e03d594f667', -'6cd0a5be761684710a177d11293df197', -'6d788689f2916b02dac731ca91138634', -'6dcd61aac825cf079eb911b5645c8b4b', -'6e5688e04caace69083656ff88c5df98', -'6ed89547742e0267bf49d6f94c6c1c3f', -'6ef8f1dc83ebb978e32cabb51ec66dd5', -'6f01bd45ef491ec5492dfb0e476bdd82', -'6f2d0214628cc60a977b21a2621caad9', -'6f3bfa56066daa8a6c7d9d252f8022f9', -'7005a18a68c3c4e2ef558e0e25abc47b', -'706b4c2c7609f707a135a31503c40636', -'7088da1b6be876dc5ae19afe1d37833c', -'71c6b51b202994bc21f2ff1fa543bda8', -'727e7769ca161adda9fe76fcb4539696', -'737e7418319e6a03ec7af0e6ef567024', -'738d64465529ce383debf38d7f9d63ce', -'73b7f4b873e41a7d7f1aca5101e9ef3d', -'73dcc00247460cc29323bb0403fd2193', -'744a49bbc35874854c38f44874e25ab6', -'74e92c0b5874a32d5346c9fcee48d54c', -'756113b64beaca5a229f63351275d7da', -'757c44ab06beaafea129220bc923805c', -'758d6cc8e426eb18d8359259a745c443', -'75928e20bc8a672b078e9ed15cbdb012', -'75c6da2c629e93a98bf1c421320ac78e', -'75f352bb8d09891980b48eaa9c555df6', -'7643a460da7a5cc72dff8683f9261fe5', -'76c9538fb44b182305cfe06bce246aec', -'76fec598f95104a6b56dba11ef99caf6', -'770776a4692cf4ac97f54bb87db53eea', -'77715ac7a4c5c96c655489de48341b67', -'7785aaca0d2e9b297eb71bde93cac0c7', -'783a892e7a29f9aa23100338ef646b56', -'78bcbe0556dfcc0cd7089c18d4289387', -'78c924a5e451c517f3b2d4f1de1ca114', -'78e67353cd5fa9252b5984c7fae1632e', -'793aea3587ad8d9117d5ad3d047eea58', -'795f10876dd8e00f7625c2c2dbdcd98d', -'797cfe19dda9b2be011f7d8520dfcac7', -'79886d8ba404d4db4afbb4bba89e59ba', -'7997118bfc8baf77d9e145b331ef1296', -'7a7ceaf45da6ec49d0a3da6d1c2a8bd6', -'7a995acf71149384c6e0e7b94efcc8ea', -'7aa009a271f3f8f12b85424edb75194d', -'7b4fb468d023a008e297734c80e26845', -'7bb690b68c87d2663e4eb4fef1956b5e', -'7c6a85e8a7d400a31cf4610e624f0042', -'7cf0e55aa3f54e3185ccfe5553cce885', -'7cf7bf9a344208ddead805bca022455e', -'7d38cd67ee31bba902ed0b6a48cb871c', -'7d998d6ac8b78e36c9307dba631c0960', -'7db2c942f5416731432ab46c502fbacf', -'7df77a8d46e5a1de2c28440561f26b0b', -'7e1ca1be21917fba17cf0afa8286ad57', -'7e7ee6ff06a20f3c2486be9d2908eea3', -'7e83af8f970d32511937ff32196bf4a2', -'7ee8d4be62fed20982ce793a4a064d43', -'7f0a6dcfee36dcab6dca4c30b20adeba', -'7f3aacc835e7377eb31d8a719646a62e', -'7f6d0395a0616650e782b01404f814f5', -'802dd07b381ced45ea3ea7fff94c6520', -'809012d6e0e43d75de23d4dd518818cd', -'80bb14dde7d082b3d3fb9478a4d0a1d1', -'815688a1e21e9ee9ad70eb5f3ae5a9d5', -'81d1cce893f8c09876df98a7e6c073fa', -'820f2227d09fef6916f91af9612eaedb', -'823cb21fb8fda2a217311572446a8159', -'8242ed59320fd52d2bebc8c284defac8', -'82490711b8f979a9baa35569abe31a88', -'826a669dd3e643deffd12cdc07b6e5b6', -'827409e108a5998219799f6d75ae3ef5', -'82e27ca093879d9c52178eca9873ed30', -'82e4842c014e236e790e2d4d98e178db', -'82f2fe481b281646944503a46775e3e6', -'83c7aaf82084d700a68da0d94f8ae1e2', -'840faf7fd3be8156c8ee4afacb9c43f8', -'8418744e36de859dfeab8baac8497170', -'84205ef9e245ea6d115ff15a50706a8d', -'844c7b90e45d94b1233901776792e1df', -'84591f5c57c3bdcf86e6deb00957d906', -'8489ead9e6e14764a936d97e97d8679c', -'8514386f4a79eec3307c3c0dbd943572', -'856fb427e0cfb74e69ce81a51f2c27bb', -'85a4bf0026a29e265cf6a8c93c904dde', -'85bd68465045078e8c8998f7b3e05d4d', -'85f86fb05282cfb13c779639eee79041', -'861687d0cb74dc7fc6bec0758253e172', -'86393e2fc8cca145ec225c1bd4784e2b', -'867d0bf6027f23a1a7b6ee7f22cb0334', -'86ab964396ab1b1369474f820e439aaa', -'86f2b6fa9fa6e5ce9daa568984f3bd39', -'8708eab5ef80b6aba0701784825fdd32', -'8715421a9f02732abc62a296442b0030', -'872795e5abf5b3adc08c33d4bd2450d7', -'87e1b58ae4a4959848283a0247866407', -'888139cef0fb89bf3f49258e5ef68f4c', -'88c7f35d0e01ec843a5fe6d82568408d', -'88f3b2721bff952eb16f0ebdab8aff34', -'89041e1d6532461ea5290ecf7e63c9e9', -'89488afcd36ac32c229dad04fbfc60f9', -'89e6ab19dfbf51aef39a36878256d937', -'8a1d2c6f04d33de4de0ff0808ef93287', -'8a4128e6e64f12ec6ef2a3e0497d6113', -'8a4a460f6d2a013dce404a896f822ef9', -'8ac77de7006b2d18146ab498477fe631', -'8ade6b421f39a52258845487cbd02485', -'8af1bdd3d07f165b0a71ce5b33a89cca', -'8b265646a5b1cb8a7313d7cbbcba3cc6', -'8b489d03c50178fe9fdf3b70a8c28761', -'8c20be197ec6551516e8c886b0cad945', -'8c8bf61bcb408e7ab96b5deaacf4ff97', -'8cad6ddc155bf1f52a75e6b441de0874', -'8cb7507ac9249ac82ee703346fac7de2', -'8ce6bd7e475f0272889e25e8660ebb66', -'8d119f3c73318c23fb9a13c74f9278a3', -'8d26165011a96624847534d6ff1e5d35', -'8d4d0ca7699a9f02311aefc59abf8560', -'8d650252168d646e8950d9f94d25c144', -'8db9640ab917733da91c1c2b7f023ad1', -'8e0d470aff1dd8ddf1d52f168ab7bae9', -'8e1304d107dc9ee1177470b1212b312e', -'8e1b12aaf505104d6174732d8bfa5fef', -'8e5cfc9a8dbe1aa81d74f6876e2bfb49', -'8fb7358018491128d5ab06a33456a337', -'90d45b6d3c7ff6ae9c0b6fc9148873e8', -'910441aef51561bd628cac1bda9c5121', -'9136b1a098edc349a159487b6034d3dd', -'91def347ab1bcf83762acde09864d44b', -'923583c00c9d0bee9c9b110784d4810a', -'925a9449dc67d6e0e8f5b3595f72d1de', -'92a65c0e0fd9a425a68b9e8a20fcc182', -'92d9d67ebb769dcece2a8f31339b4e72', -'930944ba677b49e6f4e2bb7774744703', -'930f6fc2222a17b6611a2b2be2a83353', -'93141fcd73b55e0774ef4265200227fa', -'93195cc5c1306454f94f7e506a302826', -'93602daa68e8715c30400b6db88116c9', -'9391e2d9febbf06d0fac4df187373971', -'9395b7f1bd3c7b642ddea6abd8b62f82', -'93a91754c07693d02c6eb9879e529137', -'93f02123e34d4bc0af11365b621dfa8a', -'941d10057afc815b397ff0669a399891', -'94ab856bfde35cc05e1b9761274ca6b2', -'955445b85f03068151dfd835d6674408', -'9580fadc098f33fd73769a81c30dd6bc', -'960052f338d05917d374fdf010da27a7', -'965f0f52e11622d497f25deb3d2c9ceb', -'969310ebb630b2bd582e66a40778f31e', -'96a79c335d0141fba7f36f2c4d40452e', -'972a908e51bc810920b6e0f0faa03f39', -'97419977b29bcf7072fee7023a940834', -'98541f1ab176eff543c32aee7e3521d7', -'98a5765ef891428900492b189458f55a', -'98b3f2bbc5bec9590b126b61a657585a', -'99025f3b4978e2d75c6fba6f0bd295b2', -'990b13c991d336897b0a35ba96c11fdf', -'99674e03dd1b404963437cc4db8200cd', -'999538fbee76a7397a4dee789d5217c0', -'99c5b2749fa7290632dd67b751a43474', -'9a791f306d3c493fa28b360d036a6965', -'9adc0a0e90fc7428bd7d78a081543d90', -'9b0153790035845f127637309a72fdfc', -'9b0f1f8d0c17aee0b49df0382958e471', -'9b2abb24e4910f3413f7fa1a098f06c6', -'9ba5ab5bf0ddbc6db4aaeeb0a9a132a9', -'9bd0c13645c8b12fa8823b42877d001b', -'9c02a9e7854d7e8076dd2fa7af65e9a0', -'9c0de3d7bd3b230a2f2d749aa8fe7632', -'9c613c75a7d9e3b369c3a8a90e6fbbee', -'9c7ca3b5efe8cb272e695cb4ba4e5df9', -'9d36b192f819354ccaac8156e2aad709', -'9d8bd93d97213864176583353b5acaf1', -'9d9c0b6a43bd5e2e847465a7e369c2ae', -'9dcd0cc82e776eb35be598efdcdfdc9f', -'9dd550e9af88a5e7592caff6474a565e', -'9e02e924712fbcc9ab8b5fbad609478e', -'9e085ff38b712db252458208881a1729', -'9e5f54988d48f5adeb352cf4944d4e61', -'9ead6071933e9bd5390902c1a9ace0e5', -'9ed796b348127ffb1718f9d8a8de314c', -'9ef248745ac080ea599efe1a2fb46b4c', -'9f00306c6f7766ba105e8d220964017f', -'9f3fb30f861efc69a5960e65c7e1ea64', -'9f7e41c4665e1264e52c6edfdf396d8b', -'9fa88094b923244404b1506ad408b095', -'9fc7b291a1f6e0df908682f459651683', -'9fe2c8a78837817f221c44605f3a67be', -'9fff53b2cf73c6e958ac10207ace1473', -'9fff5845bb6f25a59dbaf6eb46ffe216', -'a0058191941088414300116894889919', -'a03ad1aada4ddd805c115b4cdd4d05b3', -'a0a85041965bf816e67114ab38d29a6e', -'a0abed53ec7a3fedb163438e8be1c8e8', -'a0ec5c139564054719269fb275c7b2a4', -'a14dc50a9445da5bcd76ec37180d3c2a', -'a176053c9f21ca729de393429ed835dd', -'a19c57a191b182e614a1ab3002d46a00', -'a1aec2fd6ccb57ff4d264838bf2702e6', -'a214aa6ee2e6c3ca82516f4115811a5e', -'a2bcb8b69acb92a3fdb7074c4db149ba', -'a2bf9a0777517984dd0ad65cdfe5d4e6', -'a2bfadadda18c52392b77fef8ae5824b', -'a305fccfe55b81dfa19774a704fefe98', -'a3a33f3ab2183f9b1ba1dc30ae2af2be', -'a424d9f189c3e47fb7a1b179057888c2', -'a435ed22caed17ed51c36f7e0e7a9610', -'a44f8dfa78f7151c61157ee41010b096', -'a4572544706239f74b177280ee98b0e8', -'a4f218de8717713d2c8c7af1f1d43325', -'a54bd6dc1f576c4b281e94a9538312a8', -'a54dc2359a93e830e6d0613f15741b33', -'a563ab6f6293403dd5e2f9dca8e7fca3', -'a59a6e2b09ef72445deec90902ebac84', -'a6d406552b5e29b93518170516595255', -'a73ade7e0c839bf62cf01a9ac07071a3', -'a74e8925ae11ec4dc13796d995e3c761', -'a761ea482c39c292ef0cf0f78f411882', -'a7c6e8594c4052b2364f646a13f16239', -'a8d6dfc9d28961ea1bb0ac5d4269f89f', -'a925a5bfecda69217ba9e8b87c22cbc5', -'a977b3ff47770e00ad509564e6d2af31', -'a9b5f0fa1f8218bd9a75ae2d0c316a8c', -'aa4d266bc1d34b8a266a23b38326802f', -'aa5057ebbe002f6f4b1c6df187d40903', -'aa6691f2eab7d28f000ef94cf83175c8', -'aa6e372b4ab9bc8d8308d753267a0664', -'aa950028a9ba45a06b024dc6adf40d3b', -'aadff1032abd52b873442ddec72ffb9b', -'ab637d25fe43d54e4167cb48e7b7dbe0', -'ab98554ae0f660d968427bb08e634c14', -'ab98c85d25084701a8b0ebcacbefdde9', -'abc0cbf11335d8679cb31b0edeaad57e', -'abd2013f87814e3d939b7f4f6a959750', -'abe3be940fb2e6d1150bdc8027184b79', -'ac12ef0c9039ba99201430c56fca5760', -'ac2a8597bf26093cdff8a95d38ec1657', -'aca1a6e5ee4f52d7651d664b88dab486', -'ad368531805ff9dcb8afa357a52506f5', -'adfbbe138ebfdfcd11627dd715c6457c', -'ae0da1761638805a9d3b2c4efa21c411', -'ae1218d977ad1e8f865aaa4bd0588836', -'ae3516de7256743ad9271659b00b52c2', -'ae93620e68fcbb9e746c6d782a58f320', -'af97ad66d2b2b12563839014e201f5d6', -'afad69f8da5d9e40225536d15bc54799', -'b0784a720da6178453b0e09c1d7cad08', -'b0afc9e3b56ba7625c74517a9ef119db', -'b0f69fd6a03c5ed7f2ba3aecfdbfd36d', -'b14f07fa654ecf4445bb47e76280cf5c', -'b19e199b63ec110471db997701f5f69f', -'b1ae7dd1af59b1a5a35ac610cfe38975', -'b22bc3afac5b3e42ada8c2a107c3a7b3', -'b28f9d7236b2b86cb185e78cb11d75d5', -'b3317fff300745ebe79cce6ad4f9ffdd', -'b33a769072368af1e5517a396cdb6f72', -'b389513ef9b573f4fb66621d88be03f3', -'b38cc02786e5ad09c0376d27a92bf696', -'b3a5a3dfd425ab4ab2de05e606741ee4', -'b3b4b56cb536a7e30002efd478ab3470', -'b3bab6eea5975f779bf77c39e594e8f8', -'b4363f44a7566e28b6ef90a436b82ce9', -'b4af2297a8c78cf7e4be76b4332a7465', -'b4c5a1d67861bee42c906c23b8b4acfd', -'b5d201196a047162e0794600f7e44e72', -'b5e9797476bf0a8a88799bec048ab6f6', -'b5f64a432406a049c70c9c351a584672', -'b6f30b812fb156fbbe6e3e38fe9f8d3a', -'b70397bed451741a08d16453ff9e4eab', -'b704af0cac0d3493a953e4663c92bcc4', -'b74d6c88441275281fe24b11e5c6fc2c', -'b7d9ac45b117cdb3764c1a469cef560f', -'b7f9a6bc8c7c97b0f371c757b806d60e', -'b85ebb10b0f74d4c9714cab8ca9c3fbd', -'b873f4c82759e30af8caddec96fec759', -'b88ebff952bc505b1aebbe11035a509c', -'b8c7e6fd8c05ff2a59e60d335e4c48b5', -'b8ea27d8822ceb979ebad1bdb6f75fdc', -'b940b555fb25743fbd9c2da67002f347', -'b9e3f973b4d308e8678eb0424154ad22', -'ba59351efe64eb952c5504eff3627367', -'ba5bc49592c5bcde492cee85a2bd2ff4', -'bab707b152fbf16922d8a97626a788c9', -'bb2d9b8d7080ce4a03a91434d123dda9', -'bb4a52d05801d7bf5892432f20488c3f', -'bb72ee39c524fee8453c89f326319dc5', -'bc35b3b8bbe0860e626314849a13939f', -'bd02018461e4650522af963585610890', -'bd1de32462eb83067201e92f07c355f7', -'bd436cf8841b821baaa0bd3368154c27', -'bd4a764d6deddbb1f63946cd78b8b629', -'bd57025f1b5e4f67c547944ee28f283e', -'bd6edf62fb0ece06740d68da4bdd847f', -'bd8163865f0e2624385bcea221117654', -'bdd4053d9f756a88f793e5970ae1c4c9', -'be2e73cb632f5abc02747ecf37b664ca', -'be33c1ba3055c5f8cdbe7d2f1794aaeb', -'be56d693d135895f90e8d591f907238e', -'beb3449e2b27df9eda77bf72f658fe6d', -'becdb68b1fbd7ef0435c2cbdcd916a3d', -'bee71f4ce1a551fadbc14b2839f3add0', -'bf462d40ba86abf0b878fc2ee4e9572e', -'bf68d41b1e246b244d42d8e66a1afdae', -'bf873fa981d4c5205bdbf1381a601f65', -'bf8bb7ee945c95eb699d1e8ebd84913d', -'bf8c113c1d4ffe3e494b54b527d8cee4', -'bfc027914b444b0e2064b97ab90e0790', -'bfcbbad7a1aad3479b9c703f7e047d37', -'bff9378e4847a6b18473f158c5517278', -'c0307c0f56136e43e3c46ca94802ea3b', -'c0477075243562f57002d116366620e2', -'c04a24e5d11b2d9739608c36aa6abd6c', -'c05360d50fd2160cb50fc30af4071d6d', -'c0935c7edb865554aacfe7caf65439ab', -'c0e34351819368943bbb1806e3e8b05b', -'c29e8e5b1abfd35ad853d658a051f526', -'c2b98ce479e0067f6b195324065e3153', -'c2ba678a8326253e76c93bbc10134e32', -'c3820aed58d03d9b6cba57271022c3b7', -'c384d18a53d18e1a15c6a56187bf99af', -'c396853fc72d158d8676e6ab02ce89f3', -'c3c91eab72d942641f8850db5b9599df', -'c47873b0d4c8c052c4f370e4d38cc3d4', -'c4a454dc73ddbacfa3204813f9d7dad3', -'c4c95187f4a10e9b6051dff9df6b42b8', -'c4dc5fd4bba266fae6d4f75d2654d112', -'c4ea1cb327db64ecc7635ee472f2cf68', -'c5fed80fcd653b373153fb5dc0ac48b8', -'c65c4daec0dd7ac4a71df26648ba1671', -'c68cfb94ba8b8d21be981ce34fd11dc6', -'c80707a675dcfe089bdbf5de048e2f1b', -'c80d70c0335e77ae67689831169bfe27', -'c8b9e9141ef06b1929c752caf5caae50', -'c8ba4601368e3336e7bdb86439f2eda8', -'c8e44d119508941687b6645736793123', -'c8fbadba56b8674ef1dcd7628ee4aa0e', -'c923f1176aedaba9accb908e479e7423', -'ca070d23796d6ca6423164c8897f0ec1', -'ca0a1499e54d430ac19620ff4a1f9ba8', -'ca34118127cbd75716923afda0222efa', -'ca7ce47815d2f3f1599fda16bcf5043b', -'ca88872a712dc75393b70555f014f70c', -'ca9f16470374ac7da820a6fe1069239a', -'cba0fafd976a15454819e12933ecf936', -'cbdcff00c61583142b8c201b44d48273', -'cc5246a073f0a08d56155f053910f12c', -'cca7cbf3311543395d1b96780ea0e982', -'ccc4aded16cf1e5fc3c57863ce6a70dd', -'cd002cc133019c939468d7f524573f43', -'cd142f615ca8c4bea7373e7de06168d5', -'cd6fb6b993c252e2e63ef2cd501072de', -'cd9bfc6b7fe5606f4176e921f4770224', -'cdc29ef82126350af5d336e83bdd48df', -'ce4ea3fcebd1f30367445122d3bd31b6', -'ce95ecbbc8b78cbef52ab86ca4888244', -'cef2fd47dde23bfa38477243250f1c5c', -'cf7a0f2620142e307e032e3daab72ff7', -'d06423a5a0e7c00a97f71c5645836ba6', -'d0bd37efeb735c0ca77ceb645235beb4', -'d0e7e1314baeda954070777cf20cc724', -'d11a8c564fdd0c65ad98f9aedbc51661', -'d12db17728205d9ba6d9c87bbebe58d3', -'d1666b0d963c473ee075c73598be7053', -'d1a7df95806255ee47d9ad96aa0e861b', -'d1b31eb2c1a3c7c5750ac5915f1d9718', -'d1bfeb98ffc67d02311455c5a3cb49b0', -'d2189246794299fc353137bac7a59f2c', -'d23a9506c8af058d97e344bbedb341be', -'d24198307be9be78e5de33d8793d41bc', -'d3caeee2db9be23950fa51844e75c7ca', -'d40b265e06549e76a8f637422cf0835c', -'d45268719a8aa88ae9f28fc27f07c54d', -'d49e5340d7501f22a6fe46bed009b7be', -'d5334a6b570226cd184f5bea1a985d80', -'d53538982298230b04403a695dcb2231', -'d583478857fc9e12b3d538ca3b65d5d5', -'d61233796167efb681401cdd908f0f70', -'d627b5f50bdc0fa915d39cc32e7b760d', -'d628ffd8aee1d8dadaf1864d295f3445', -'d68eab15bce2dc4af3a92fa815f59336', -'d6ada30b4cb916b077d618a73a93cf04', -'d6cc7d0e0120a6a267adac3a05f6f287', -'d6d08f04d065382933283a788f52f080', -'d70da1d4fd5fe85e82e660c183da108e', -'d7c4dc223f2a4b9817b7d30940bec64c', -'d7de5eb5311c6220975dedf108e46a39', -'d85b9548571a9d0edc73590660c0c18c', -'d8af9ab641b190aeec73d211dfcbf4db', -'d8b1e3c8d7a051c927c90ae2692b3768', -'d8d8bfc0724c93fe35791942f69dc64e', -'d90bdd41130bfd946f0309360a7ea05d', -'d9109defa43b38c20ad21da38cf2c6c9', -'d9199654e9bc0c84ccc64c81e0d3c393', -'d960f8a4fb9d37d457e5a4b46faf98d6', -'d9b35f8ac019ae98454b6e98c279ab13', -'da108765256f11e4edd9314e1e494fcd', -'da3719df7e7e02d3b78dfd10531261d4', -'dac7a910ae791d1298a7941662ef0eeb', -'db28722a0d1a5b0c5b1e321dfd127195', -'dc256ab79aab41f9a65bb72b9a53a154', -'dc3b8b030492260496a8e05b7637fd4b', -'dc90b8aba25f31d80df5c3cea85685d6', -'dcc15b327be19bc5b50e434690d35350', -'dd92bdae4ed7cb64e16f782d4d7b7767', -'ddf1d2901866aad80dfb033e6c60e601', -'de1dafe1fb480a101d7da69608e77074', -'de6c1c7dc6cba47e1dd3b0ad207b074b', -'dec43b4d74667467c771fe7322dba942', -'dec8b28eb5eec90f9505e0ed7064d294', -'def4ce670fa5b300eb7b677a5f193f28', -'df10c3db0b4a41946fe5729dee65393d', -'df3fb9fec424fb443568c2ccdc0a7a11', -'df659e4fce1b8f5dfba57d775013bc52', -'df8468e5ceefe03d74e3c4fc52a93a8b', -'dfa35a09f7e1f58e5b766576ba3cba6c', -'dfade29220faca203263212735beb7ce', -'dff26f8c18ef6963960f929c7426e469', -'e022129a9694b8e72c8870552b7fb277', -'e06500ea7c2b0a626dededdf40ffd65c', -'e0852d277488e972e8785a65f2d13fec', -'e10ebeb92e7a3b51f97ae1cee8315622', -'e11428b8590c781a531a3845c81c92b7', -'e13c3af20606152ffb2cde63161debff', -'e17a3a67838ce6bcb3d932ee6ac70965', -'e25bbb37db9243c70cbc562e357bd2c4', -'e288e6095032e0639f9ed72aa0570a4b', -'e38772a1730f752efeaf38cddfac1c4f', -'e39630c2c50040e463466d81e8a3d368', -'e3b485a297cf900b06de172e547a2963', -'e62d826463fa1c40cd22cbb6f64447d5', -'e63629bd5e5e84b2d8512a52fc2df31c', -'e67e35df969cc080975a0de540f77473', -'e687d2e57ef89208ad82b89b76c85ee8', -'e6f50d14a429b1de2c3dbb3276ed4b12', -'e74914315becf19950732ddb7af4b4b8', -'e777d35edb3fed07666b865f73ddd263', -'e794a44fb73b60a9a9be1faadecaff80', -'e80cde424610752721ae51b421fd84e3', -'e8146ec5487c89f71c65d610e4907edd', -'e84b60c31ac8b8b6d7b645714628448d', -'e88e2925289ee0ff74e70ac17486eecb', -'e8d35f97433156519ecfab0f1843b335', -'e8f8adeaa0c6687eb5edd1c075ae71f6', -'e93a11d1058d6a5cd683ea948bb1cc25', -'e957800efa291188263053adfee79daf', -'e9cfcd957116e2dac2c16159afb96f1b', -'ea1488f19b1cb5bb28e0f2ffd114225d', -'ea2c54df3c2bdd4396557fd31f6fee39', -'ea2ce262b4febcd5fa9060d58ae56482', -'ea70196d110d0fac0b43be584c88bdcf', -'eacd265eb9515a3c8701efb0e1e242ba', -'ead7e35a3a75f24bf619b7da0b46d872', -'eaef0f262df250febbce64c13194845c', -'eb280e53dae708501e64fbd6f13b93cd', -'eb64880ea975c14404fbb754da65eed0', -'eb68b96094324aad7f16c9b616f40b9b', -'ebc99ff869ce90e5786554dcc3c18768', -'ebea5bba51a01b80a98a0ec0e92ac4d2', -'ebf4d67bf0dd83026536f12c5fb3cb87', -'ec6419bcfac331cfe7a35e999f8a97ee', -'ec7073e291786c0c970c94a38d381b3c', -'eca247110ac1572a20d6b01072306e15', -'eccad4116321872f231ecbae1ff85b40', -'ece5f77f0fb2b2e6585ccd3ad2c6f2da', -'ed784dae74d102ff2b1c42519900cacb', -'ed7d8bca93037a310353bb18e7ff718b', -'ed953a77008266d48ca9999b35baea49', -'edac13405b9f3d29c18a5e08e797334f', -'edca87cb43d4297ac20c9a4148d8b586', -'ee0ed67d58184c8e6ca426cb6120dd9d', -'ee2c21b5ebe2249c764fb5e84fdb6a7d', -'ee8ff31530da583fc82356968242e05b', -'ee9d94a042be888ac2db90c19b562c65', -'eead54a9af3e7193e0f1d497e0b35a13', -'eeea9372a541fc8154ec6bab5e1a6fa2', -'ef1d89304232b8c14962bdd88959a781', -'ef38e6bc2183dd84ccc975172f65323d', -'ef50c396a25b46c31c48a9de38c75abd', -'ef58e4519fc67e9ebb483f6f6154a774', -'ef6ce8491618d18f2bedb7062782a30c', -'f0214c697c21336a6b69e9050f2fe4b7', -'f03b47a6d7b2217c476230f9296589e8', -'f05e129d83717aee2550880aae0bbb38', -'f07ae4d596a8e0bf41ff68482333a369', -'f09d96e8c5af5d1d840b91761f6f5cb0', -'f0e8c337ffa8f649cf2171cf1e144a27', -'f12c401eb7db03ff3a9cde5dd3d2557f', -'f18512f0ffdb4604fae2a19595e683a3', -'f19b00060a0275e2cfe8b594ddfbbbb9', -'f1c603cb7c632d7e5ae887f8730472f0', -'f1df49bf684b5792ba058ed13f8b2927', -'f234e695aa0678eaf4511f37f8411dca', -'f2d148da2c49fbee048610b9868440af', -'f30db65e8774bbfac82b75fe39055eec', -'f44dc93f68013d766ebe23419d16c54d', -'f484880135519f8870ef42acb7dfbbf3', -'f51dec0686c54df7378b948217f563cd', -'f549db117aec874e257ece05e64a2cf7', -'f5eaaf90fc11d227d3ced764889cc15a', -'f5faf947039914a0ab0c439a5aac2cfa', -'f60fa919969139e22aa551e65e85491f', -'f647ad62837f7674eef14841f250ef9f', -'f6754fe51efc5bea20a2b3745feb1494', -'f69f82c1e1ba17efa24fdb35c82f8c0c', -'f6b7c006bf639219932de105fba5cea1', -'f6b7d742b7ef73cceb75a18970353b00', -'f6fc1ff372e99f26b962ecc9c6936717', -'f787b54cf8a39b582427a95b91d4b4c9', -'f79e01143694a57c063e059df3538314', -'f7b874ecbf0a0bcd64f83fe5c667c527', -'f7c3f2a0dad1110aaeadeb3b6c330408', -'f7dcdcb11b1a1ce0eaabb1b4fa2c7393', -'f8a28e766d4fb71f2fa9afe4c582ee7b', -'f8e6364ae6c653759edac206422588e0', -'f961771c93c459c794b8f17b834bbc25', -'f98402172e16053ead75c0fd8b2b5bb5', -'f9cd1dbd92a94654ac0b0ecee907a1f2', -'fa9d0f257e55821cbeaa183a63656459', -'fb39d842736777541afde0ececd96052', -'fbf7abed7cd18ea3d56b1ee3197f19f5', -'fbfc15c6914c0e247fef67bf486e1cbd', -'fc3d99a02d8709f12d26a6625fb8be6c', -'fc869fed4c42ea44e877ad1074d42db0', -'fcb276ee2cd6115b690f9f1bfb515703', -'fcbbdece059ecac3037a2ad244695500', -'fd151026d9fc548f88a50563c2f38626', -'fd16c1c8e32e429df5f36797db2e6f89', -'fd177049f8ef56b2c08b1cf1bd52aee0', -'fd80d6ac67a16152fa44261c5a5a7a72', -'fd971db40cfd5fa2e4c940f00169c580', -'fdc97a18473abb6e1528b423fb351475', -'fdf6aa371cff16cf9c52e537dfc31400', -'fe2c001eaabb6b0f5641a1f347308e9f', -'fe6ae90c158f4801364e12e5a0cdafb0', -'fe801024805e2c672bb7d0568b43fcfb', -'fe819c5dea7fa32437f5b19c4b0b1d44', -'ff04f0641b4696aa5ae43088530219b1', -'ff136d01870d1818761c72759155b0a6', -'ff71416839616f7f0fe52612502cccc7', -'ff7617302c6625609ec0cb443b0fe647', -'ffcd87951df2bfd8bc83dc5addf723e0' + '000281ba1d5f8d068e3dee96296ff102', + '0029b39c964e3c10ec92690f1835de8d', + '003527bf683ae943e07a824786de399a', + '005481bf6fba9b3f6e43cd4dfb0fef5e', + '007128bdccbe20f77acdce11366234ee', + '0092c69f4fb681c7a0859d4bebf9f212', + '00bdc846484def25260094da28c919b7', + '0135a964f0fc8ac95fdd51af2ee3d675', + '014ab82dcf7b705e3092c60cdfe3a867', + '01885aec48c675b8c1cc5403538105e0', + '020cf7ee044d55a5a8b10b8f91caf389', + '0268f57aa44e76104dbeffb0505846d1', + '0281374a2388ef6df6b45075ae6097e2', + '02a89d48f63143fd8f0edb70a7f3915f', + '0377bc3723eabb98c2327f9646739a8c', + '039370bf32703882369bdc7e48f14a0f', + '03fe8c7fd5e80dbdb5fdacb28407f1a6', + '045687ebc08dc22d14b4464fbe935ed1', + '0516066e208b084ea10db953152a9b20', + '05239ad7cc38f0e8d3f05babf698b8bf', + '052bbad7b380d8683d85455db7221f81', + '052f17fd6a1d758cb7a058aa3a629545', + '05bc648bec7f4d0f90493cdecef2aa33', + '05e3041c0ee55331c355117c995000e4', + '05ee826c5a834a9352f06c259dfed9c2', + '060712adcfa6f7b040f701ca03a266a0', + '0628326e3e4e0fdd7699dd48831d4d05', + '069752bd3600e47e1f52ae8b3198d728', + '069cad0d46b60c05331f15dfd6e45b1f', + '070f9e2c5fc8a717cce67ee4c80472d2', + '0715b1819d8aa518a89bddb271d1db0a', + '073e4b8d5014976a94a7c86218e9413b', + '07627c8f8459308006b41d71090690eb', + '078091b23e2030e00f7f9689f4e69411', + '07c53ad26c54acdab5b6c98cf8e97122', + '07e4d25502eaf99ea34b0752cae1b225', + '08dc3a21e397c01fa375b93b2a87beae', + '092a6dd4f2986baeac98bd1849da4fc1', + '09369384ca82de49218cf5e67a14de6d', + '097f64d87922de3bf8f48b054ba844b9', + '09d1607af4f2693512d1bf4622a02fa0', + '0a16b7def7b7e0a5999236916fbfb7a3', + '0a2487d9639a1c56a9bec165e84f738c', + '0a4c0075b5d84c524054731716b54bcb', + '0a676e79756552293f8049fca16e8c7e', + '0a71230513fd2e2b7f9c048beb5ffdac', + '0a795cbbd79c99c3d1da81858fe91c6c', + '0a984427cb3fc0dcefae2bc181479dae', + '0aa080e93f6fbf0a7ac7a5b66515ae66', + '0aa6251fe58c0257846f9bc639243ac0', + '0adec962e4e2d84c8d09fa28cc6f608e', + '0aed12f5285e4b1621cff35e2e16f741', + '0b1d930aaa3ee98294757bcee48073b4', + '0b4bfb566529b7769fc41c6abbd6fa26', + '0b7a86a5e9d1d8da65fa98ac6040034d', + '0b8198767521bc2f452ef317e80545a5', + '0b9527cd7f1bb46a1d50595c4a92e8f1', + '0b99235773ee8a05f423c12d5f4e9c3d', + '0bdab840876ff65808e60cefb200420a', + '0c234361660b8ecfcca6a8bd45d3c445', + '0c2cb9e37ea01d0a2a62b213c4eb5899', + '0c5d6417183ce9f809bc4999dd039c3f', + '0c6cf45b5b98b535b7232ecb0043774c', + '0c8daa545af86a8d3694c51b45989981', + '0cbea54533054458364b597c3b888f47', + '0cd387f2f672ad53e18348d095c3eda6', + '0d26639585f7217e330c6355c95e58bb', + '0d52d047264a77bea36711c8bb65d20e', + '0de5c224f5790391238a995b92583784', + '0e2c99a8b88abcc2ef3d9f67d4f037cd', + '0e85728ab43a4e98eb038818d345b638', + '0e893b31a6866bd570b45efccc0a88a7', + '0ed8d05a51532399760374d7a926a683', + '0f5f3f1f6da28983f8888b7834861970', + '0f98ca8c7d66e01e1498fc62766c4906', + '0fecab2869153e06731c08ad93e7ca59', + '109a52779f4bb1ee917a9a4e73d93b5d', + '10a2cf81bab5ffc3b6fc79fc46b953b4', + '10b57bdafa2e54c48e5b52b8dff39b40', + '10ce085f9edbadbac9a5f316f8773a4b', + '114ab357e3f25d7607b8ffb29af26996', + '114f4ac6c63eacbe1ba2f9da392a5710', + '115926e5ecb579e8855980df1d57f17a', + '116e555755894ff0332128e74ebce784', + '117d58eabdc4f5eee8cb7a70a0004962', + '118f1f337541d5b1995d1534656b08a3', + '11ac4bbe9fce147954177b20f2edccbb', + '11ba53d81683d6cf9f44d245538ba488', + '11bbeb0afbbbafea91412dbe830056d3', + '11d49a25f1600139188bc0d19defa2b6', + '11f059f1872aae766a71995194e6b5af', + '12523482232547122f2f4a56953b3893', + '127ebdcaedfa2fb31b39fcf6eddeeab0', + '12b665c75d3e04cfd4c9fa548e02cf49', + '1328643a680a06d2047fb24fe07af6a7', + '13549b1d02a8f714ca1ada2cca96b18a', + '13891a137a4dfab120a35dd33159b7f0', + '13f781d434ffb6505324cace5cdca05b', + '14914453b3ce945683148bb603040bf1', + '14ca18249f85224633dcf1b6bea3d80c', + '14eccf7e319835eb36f942fc900a6d71', + '1528b11b690e20bf60daf3dcce67e6fd', + '159924469bef2a400cdb8cbaa78df820', + '15bcd197946693d9893f1c5fa593c3f6', + '15d87d5daf7f57b2cc9dd6c51c3da985', + '15e7ff8de63317c54471fa510c5ad56b', + '15f521580593d1a0c80332b563fe7478', + '160ffe5d0ebe9d7549c2293ac0c1d613', + '161993c546c061697950c2f562664319', + '1671e4d7647fe63663497f4492a95a4a', + '167b11e11daaa25e4009500b04a838fc', + '16c94bfa77976e244a02d291129ae3c5', + '16e0f3eb679eff7cf17f709e3267cc2d', + '171b728d1133d725aa74955b0beea4d4', + '17378c4626daaa51717369704ab36a38', + '177024634db51c72ff0c83199e46edd7', + '179c38d57eb85b106dd95eba45b555fc', + '179da2793bfd142f33952884d20d21d2', + '17c73e7814a5f2d26fae015990d90159', + '17d4f2ff4a93e4644f0b9e9287f63fa7', + '18061935e6ab21f528d9dbbb36310a5f', + '180a7cf96aa37f56998a485cf22dc18e', + '1848993ceba448b05a1ff8e3a1ab427f', + '1856c914b879406212e82616cdaf8afa', + '18837494e4e25257e9d077d6374e336b', + '189a8950a57553c9d3bc75a4d8975eee', + '18e54707cb6f870fca10162d819386e6', + '196119691791be16ae0dc8cda65a2e23', + '19a1e7d12c3b6b5ad7de061d4d3050b8', + '1a37b248c0a76d5b9301b125f9294baf', + '1a678fa606dd463c7dba13cc7bf3decf', + '1a6d8da22a8baf42b7b1190b43fc16b6', + '1a85bc6c5f8780a344dc2a47df01118e', + '1ac67ebed39abe083407e98aa1c0eba1', + '1b82dc0bc393b5f8f5e4dd1ed050a194', + '1b8c2f498d2aaaf3136983ded141b5d6', + '1bb5175e4054393058019717217cf797', + '1bb909859399dcd2edf2c9ba49ba0975', + '1bca76eb57556639c84a6ff18f57d653', + '1c71b772b1b24513dbc6027589a9ab28', + '1c82862cc176f3e54ee78dc8ca857549', + '1ca233fd4979364b8488ff70abaccccb', + '1cb787a79926cce3b7cf9c4f66b34c04', + '1cd6bce4c44aef512873b29c629d1be4', + '1ce44bcdd93262a15336ad62d26c9b2f', + '1cff0213011d8f31d18859559e2b9491', + '1d165247b84f46e6772d1f659eb5a5dc', + '1d9f6266df45dfa7c38f27a1def193f0', + '1db3554a011cf458e276ef57e38795fc', + '1e725890a0bf079fb0624080eac60066', + '1fe2d0680d78f8b066d15548be3c00ea', + '201a5adf58d04945b22229c716ec49cf', + '202d8ab0948b29b35fdac71b34ce47ab', + '202faffcdefdf3f55cc5f91d1604ade4', + '203feb124dd7abe0ff5115ba0fcd7522', + '209e5d06f999bac29ef6674531061ef8', + '21037e5f5ee9bb71d6445488a7322656', + '21124d7350412c4295a1a29ec5d85d2b', + '21788fae95ad3476eb4bdf4283d00ee7', + '21ccddaf6aaa908649541a933b71adf9', + '21e67b4405b8a0a9d487587a8e6392ae', + '22236ab4c15350f2efb39074e1b49dea', + '224762278a3d732fec0679d63485cbfc', + '2252a9b2116bbe248c437daa590f8a70', + '22c2dd54f7df66c54322f1c15bb5e74b', + '22c30e00ecaa6e99b925bacd41208a86', + '2346b30adc6129a2f8ceeedf47812228', + '23ad84c84e19ec68acd0af7f26d09ebd', + '23ec40063693f430644d87808e9a6f8c', + '23f3f8d03700d08eb60cd78c2a32760c', + '2433ec87a51596eb09e3e20d281817f5', + '2446fcd4a6c5dfd13e142d5a2b257263', + '245e25886fb6015c058f02c1dc0fcc6b', + '247e276ca082c52389c581d7ef3577d2', + '24af4c6467f9f1a2ae7a1599568838c9', + '24daa96e03038c673328310e4cb5d2ee', + '24e30c967af0e7f31175d45d52be2c71', + '250f4d3b1a2d0b8fe229d4ba1c74e99e', + '2524573dfc1342a7bfdc5e357924e673', + '254915b037553c1c09f310aa29fa209f', + '254d91ecbc37546d38a28076aa20714b', + '255538ca6f6595ad001c04a717c4e546', + '256d9fd5f3e62d974ed31599f9ab0a7c', + '25adfa8c4f8f99b605d1fc77826ff4e9', + '25ba0927213be082ba9e839627156daa', + '25ff0de8b0465b991a4ca36accadd697', + '2669332932d27650b00c8a582c181650', + '267e741d756587c7a57a1fbc94b88f49', + '267eac48ce51ad1af34d0f0f236c039d', + '26af6e3202e3b53d9c3c54927837146f', + '26b9d67b06ddc7a5e01603e68ba6b226', + '27a794fcd9ac4b04397597be791b144c', + '280a4af795570a047c785ef092df04bc', + '281d20d97facbfb9e049e9cae5221441', + '2864ea89bc97d03886948cd0c1017ce2', + '28b1de8ad599137214c2b06144f7074f', + '28bc6cccd51775ebbd86134547986834', + '28caa99622bbe4b37ed2950893636c01', + '28e55710154d7a253742e5b3b8050c27', + '28efed2d1f55020051fd19f6c0b4e378', + '28f735bcf1af085c4173c72b38196658', + '29aa9f4a9658875d0e2ffefd433e6224', + '29f96d669e31f3a31ba22c6ab3db18d5', + '2a252f1d230e71a99480bc8ccfffe1b3', + '2a270f3c2588e19c8c499e1ba403a213', + '2a289a4024f786d7c21bea36324edd59', + '2a51212944401e86c82e153f18de4563', + '2a575c5cb30e7999f7437b00402e4914', + '2a59bb4ad213b2bb421d1b9017beaab8', + '2a5f39b6fbbcdd5355b7eaa18c4f75bd', + '2adc6b2cf08b799d23673e6664932307', + '2af65154930f1e05e31f1e2af4a9c2fa', + '2b2249cf15c25abe780a55f9c6b18fd0', + '2b3ba80aa86e1066a408cdf63278eb44', + '2b817101673c7a41b55ccd70682e364b', + '2bb9d4e5247b0a6a2e51f0d4e9d59306', + '2c626e08adc15d0903f7ef7d0d425580', + '2c73f77f24194f7a08c458ff95da9f89', + '2c7ef33da8500df06ad85fba7a6c52ff', + '2cddeccf128d4268f01f244ebdcb2af6', + '2cdf46f102415b53307680bd8ab3c2e8', + '2d47023b43c8e2c5ef904581aa717231', + '2d65c10c6b1a40605dfb6654bee01151', + '2d85373c539558d7e279c40b00333b71', + '2db48c4b2a0291467b30d95f46a9f2e2', + '2ea0bbea18ebf4cee93ee8a8a8d23fe2', + '2ef274269a000eb1f00881bbe6490f35', + '2f15aabe7689076793bbfeb80d79245a', + '2f30c1b9a7be022d22ce54d301065f4f', + '2f4d244dc91419d6e081ba18754e8064', + '2fa0ab4a0f301da9807fa288b9b8b1b7', + '2ff4e9c5adf1e52a26e1e6218f482340', + '2fff098dc6663c0ddbdf921bbfdef6a9', + '30039517eaf9140564b07551395d4d13', + '303fefaa15e06dcabc8adb78d6c04dd7', + '30d3cdc9facf0c6548379caf5e61bb9f', + '30fe2bdb2780818e2a539f058cb6d0b5', + '313bf32bcffb5da88d86d0ed816901e3', + '3172cad333d9e85e7e972e08f1dd3a4e', + '31c142d791ead477361dab4678386dc4', + '31ff3a4ad528e7da897d5e4d61e4f5a6', + '3223030b0ff693b90c2ca644c99deb40', + '323c8c13bacc55a9ffa52ae0754f4544', + '3261ed91de1201840519b4c8ba6e541c', + '32fc6fd1d664f514199b392e98f0637e', + '3342a225d55d3bfd1460d7d7b6235bf0', + '334d6cd24dc91fdf3c0e2dae814859da', + '3369461c36bbfc479582170fc1aba248', + '337987e09416de39c7fb1d1df21ecbed', + '33c7009b84786fa8dca3943ebe69f58f', + '33de62b9b4f5f02acf8588d0f5a358ea', + '34cc1e47f5ebf6e8ad60c859aa633428', + '3514c473a63d7c489f8c1406ebc5db49', + '35182453d758d7a1fd47b259df3200d5', + '35a793e9c9ac56d8c74352180d79812a', + '36140643574894602ba02382fe5b7217', + '36daab3778b884a95ef3c4ddd4fb7b7c', + '376f987ce35063dc19e641fe846d6bbb', + '37826389b91da6bc757f531b826d5b7d', + '37913e8e492234fb6b3727a66d77533a', + '37e1350b0bad6f9c00c5d2b897c64b02', + '384049db8d6fa59a9e1844c118a36063', + '3881f1922b2f6b0d351013213148caab', + '391a599b837ee4d3e32cda5ae8a01129', + '39287b10c6bfc48fe00be990f75e15c0', + '3976ea1c6a5b688097be9ef374f0b4a4', + '3981fe9769b1b77f871336221d1fbbb4', + '398283b1f75fb525be9c46ed82fa0581', + '398e0fdf911ab0d48ec4fdf657be6a20', + '39f127b922e43efc671ec97d9f478bf5', + '3a04c7ceea3f50c8f7fadc27eaadd772', + '3a5ea124bed49fc56a0be60585380284', + '3a6ce9f7cd7b10addd593e5b44fcfd2d', + '3aa590b6cda38578111c926fce94ec96', + '3ab4b34d1a3c4b0a600fdd618efde908', + '3b251b703a9801ce242e87b0871bfbe5', + '3b3ae6b903843a01b027eacfc222bb02', + '3b3c1e5fd01561cf82ca898ab09918e5', + '3b7566ea6df8c193dd385f10496128ee', + '3b78089b7307818b2e8c2bf9e4a96803', + '3be309dc82576272d828183255819642', + '3c5a5946d3b86a85b64a46425a55714e', + '3c8669c0263e1542c24ad6604bd57786', + '3c995482e488198b7e24d9bf0f84fcfd', + '3c9e1b23a00183a9b45fd8440b37aa4d', + '3d1bdad7dc8ad8ab4fa08defb46e62ea', + '3d1e9b80bafefd9ddd46260070a2cf6c', + '3d219f091f7b6a1ab87124adae2f7e94', + '3d877de80bb2dde6b140d9d82695e1e7', + '3e531f3bbf8bc42a18a19ea8937d33b6', + '3ebaff73c670b796d24c152d000d3ff4', + '3ecc7e5036a2933f3958298a9c632912', + '3fa33a77f79a38f09fdb340b347c6b9e', + '40179ce077d28e4b8ec6e12e2a458ade', + '406d019ab76fd33dcd94f1f4ade49309', + '40e89f6f8e739454fffaad4148c96f6f', + '40ec15cb3542296803ea4ad14ead4fee', + '4109d6e3d10bd4e1b6fd44d9d3da6565', + '41362119e969765a9a0d4b1ffc1c9c9a', + '4149d733719f3a4ac2a7d5c222ef918e', + '4157abf1fd5ff6f7cc55fcf03a289f21', + '415e7cfd3261ef8295dc72030e37272c', + '4166ec33bb88dc0f023a654305b5cd55', + '41cb36d706901224acd7aeafe805b39b', + '426b213411b191ec7ea99a4f9a0a64bd', + '429c00232869ce5d2c0b5c53b3929ceb', + '42d12fc8429ed9b609ceaf22d7ac4a47', + '42fb1b4b447a64e9d1dd43168c7e1a29', + '434c79a75d496a440115bd55e4eaa2a9', + '4357de8bee11495b084b2bf16777e2dd', + '436648b6d4da9bffd87d31172ae58c9b', + '43ec92c8a31ff71cee5266cc06891d9c', + '440f084304e4bcfde47dc4e87bf84d2e', + '44318769765abfcd37e0d0c2aa5cd7e5', + '4464b81fc15b58dc0eda6031cbac520d', + '44b32061c4d34802d75b0fd8268192fb', + '44dff0e4c5c70a0fd366c389f4746b5d', + '45324979ffbf37e84ba58fd32b103d5e', + '45389cb5fdeb019f15f5ff6e4ce83856', + '455721a761d698b3bf6a6f65ddc5afdc', + '457741cead43310e419be4c798f028ab', + '457a39e18300a9416d48f93bcba36749', + '45c727cf7a54beca386c8efb6a849f6a', + '467e2453cca71a992d0698cb2b593e0e', + '4699e376449bcda91ee0aa62df5ee61f', + '46af92472808634424ae29d8038f261f', + '46be67f57b2a7c20e239cd65901066bd', + '46dbd6995d81facadf24fa7673bfdc5f', + '46ecc8679281cbbc2af4521dbefa3657', + '472736b6d1e2b0c2335583e3bf734eea', + '47377f181b8608343384a13bfb5f9789', + '4740e51bd8b298859d54455f215f8adf', + '47bc84399c3575e0270dbe8fa0236bf8', + '47e2d15c146cc6aebadbfe6fb3f1a9a5', + '480bae5ffccbae4124285bf6276e0cf5', + '489866e361c55a874d0183470c0d72dd', + '48b8342d8f47aba1a66f52e18146f877', + '48cfe5c81bce5ad75e2562c3e9b0c82e', + '4915b7a10e36ab791f2af54888b690d7', + '4918e75b3b26ffd6111f89cce5f048d8', + '49500752f1de9219d6cd37a4fd189fc6', + '49625e618989b2160e1a71174fc5f539', + '499fd9de88d0db2869593707cba0c9bf', + '49af38131791d2dee28391da6534e5b1', + '49c39f4114a2ee21eda54a74a562bd40', + '49ce0c2a9cf277e01a2bcb36d129740e', + '49fb93a4190d73166a1287fb73db9718', + '4a27920d5831178486e182d4eca24355', + '4a29f53f1b11515179d5eeae4e975c27', + '4a2d95401099aa5c5ff4caa526da9e17', + '4a61fa295a22de8560757eeccea704b9', + '4b217a4d59cc41b06b33b25a9198a96c', + '4b7f671a97d283029ef0b60b340db4d7', + '4bbe3ca34195dbbdfe0dcdb2798bb0fe', + '4bcefd38b7e89f181e0ed93d2f88145c', + '4c8424ef265d3ac57053f79a179452ed', + '4c9897ec24670ec36e9239d4d9f8292c', + '4cb6d0b4636b96453ac7243f43082593', + '4d33f14cbf2c48c8457e5b187e70549c', + '4d575bf111e79045b4b5e60a2ab73f25', + '4d917f40dc95c5162c4479349ba35fdf', + '4dbb515302b2edcbf29b150c00aa3e82', + '4dfc00bc70c68cce265eaf340c32acc5', + '4e8b0a809caadf218591824df58e5d16', + '4e8b4f143cd24dcbdb2f34d3f8cfb759', + '4ec07cbb6bd17196442e3c80ed769619', + '4ece95f5b8e4ed9e3ee5af9151757173', + '4f4b60fb078515761dd5ae96b7981883', + '4f5a39d9cc9cce96cc89b21af5cf275a', + '50a0f4baae5ed69e7893b58f0fb93d0a', + '50afa16b0bdd5903e84499011755b5ee', + '50d0eda39a11627a7566fd931b1d7da2', + '50e2148bb145a6a22d7add40577fc655', + '50f53d47e80d9ee084dbec179bbff42d', + '51846bb8e5dbfd305866f202c6a274c7', + '51c66db758a62296a1be1527ab0be4cc', + '51ed5dd964abdb8667a3f4a2164e58e4', + '5205026f9155d0375f0fae4b64aa5c96', + '523b1a3d1f42a90fada3df3c44e91d2c', + '5248afcb1be3eb36261f3d2bd1cccb0d', + '526d38a1768970d243c7892ff3ccb6e0', + '52b22af81f73000abf1812921faccfa4', + '52ef659713b9351c5f00b4260ffdee72', + '52f007b687a54d9317e97b55c69e05e3', + '530c067d4e8d06cf4c6abb9d54284ce2', + '53301c821974eb9c8676a9a95287822d', + '5340931fa00694272ea1ed65a0b0142f', + '5357294e9f1e8137c7cbcbe93487e4c1', + '5383a0cc4f04cac5eae39bc97974fd5a', + '5399da7661e88940639467979ae1ca84', + '53f1a30bad19dbcf8c840a05077faca5', + '54113debe6196b329b52dd414c32ba8d', + '5485d6ce064e6f3ff9b77654faf3c471', + '54b166ba042e89c7484f675a370ab367', + '54b88637e43cabd1618a60fc15938ea0', + '54c8047a679d43200ef4ef39a99b0d03', + '55ad8d0bf7e02284acc6b928a918e225', + '55bcfd0805ea911d5b73a5f7e1b04640', + '55e1266f85b6139c1a3b63878a6352f9', + '562345a37c75abbfdb970fd78c700078', + '563b6b092c37a119a5a434afff399cf1', + '565de2adf4e331dea123cbbacc680d39', + '567155590c1768d6057f985ace6eab1c', + '56e5f7f5206eeadafbe9ff8a9e960416', + '56f3af901191f6edaf9de972f82ae99b', + '56f6bd72ea4de9214ac652bc434cbe6a', + '575c0cd7d6d310d287d459ceb13095dd', + '579641706b1d3df4fee1293648bd63d9', + '57b29beba489ef4debdf9dafd5c0bdc7', + '57d66d5ccc423f826fe628a57ce96397', + '580054aa2370647cfe9826ccadc4b96c', + '582c2ee88cd211bc9477a5523b27ac1b', + '5849bb14f107d51839064f81660e91c8', + '58b217dc2545dccfe31b75f1b59e6e4b', + '58f4391217544ee4b92a186a07a41795', + '5911f7eae4da6bd53a082f9ddb30d131', + '591c101d6833c440210609b18095eb2b', + '5938266faebd33436de01ff1a3ec7436', + '59472321d270a4550c9ed4bece9ffd89', + '5961c455706158ac40a34e63974c90b8', + '59bf6438bcdab6867535e31803655a17', + '5a10d97db1ad8e85c6d8f471e809492f', + '5a1db956d84af84e0c104724053d3234', + '5a925d98be7719994367cc8458c71044', + '5b68f1fab59ce019284060e2ee9af815', + '5b6b731501ad653215fb7f42bbac3890', + '5bbe967a0f721d6daa709316829ec97e', + '5be951da1e739ea740e53712d562d272', + '5bebad15261f25307a93dab063589a9e', + '5c123d7c181c4e3af1add44096af70e6', + '5ca3444c645de8ef87c4cd65d5148633', + '5ce9c8a3d34288e30d5124ce99a08eac', + '5d058a9002f585b6985edec8adb075e4', + '5d0f14c76eb1b2bcdbc1245e77c0b5a9', + '5d3d2c58ce79cc181e8dd46b39ad6992', + '5db4fb6d26d4277470ddb73dfc57ccea', + '5de1d6a94d55add2a177b345deac8df0', + '5e0a310921e2ce4065447a36dd581b91', + '5ea382d38405c2f28c85be72b9e4cfb3', + '5f198e1ef7dcc9a3eaaba6b2ba2af37e', + '5f1ca699f84fe2ff99c81fbd3f52ce1d', + '5f919c5345bfee0b3c759d7626ff9371', + '5ff6690c66a27f0b3fd2d4f85fd4fbd9', + '60253b7dcaac00bde953c510c0902691', + '602cb41449b1f7dad75677f83eb1078b', + '6062d276f90d81b84883bf42193c09b6', + '60a379d8fe9b2daf9b76d73edfcc54e9', + '613270e0f1f630b0034939bfa1058000', + '6155cfe3e56f5c5cbe39eefb2f6f4c4d', + '61642488d9934c7e1c1b7a632ca57b8b', + '616d783adbcc28efd193d216ae266ead', + '6178dd680e125f4e7b25eb12dde72f4b', + '61804ccb95db616851ce33a026b8a2cb', + '61c63de6086b72c2b13ed955220ae62c', + '61c722a79c087593321e43d08401da4f', + '61cd317e99c05839abc3b53a06295e10', + '61d0e32ebedf6c0ba9536d2273a6e10c', + '61fd4070d92b8d311dd8771732df776b', + '6203813ab447f00a8f9dcfee8d55b74f', + '624df4ede61e915aa3eea6d68aa0dfb9', + '6297f545b24306330c7c0db882de6578', + '62b132077d93e516948dadd6df437960', + '62b575dfeb7c9499b93e746fa5ef6d46', + '62d065fa135b0335b9ee092fceb09d1b', + '63cad32b83072d6fd80a176c04aa28fc', + '63d6ab6cd019cdfb2f895368662a906e', + '63e62d70beec7cee6d6591d72d7405fc', + '642159ac6f0e25bc36b445d1daf7cad9', + '646f822bb5d1b11fe82af1060cda3718', + '6477363ede1c6c7bbe8ff2728fbabdb6', + '64b4667258e9eeece9c12965e0509905', + '64b53b8dd5ad4a7d6cd9c2bda0948186', + '64bf323c9f81116146d7552422f35527', + '64f5c6f882e74c27712976ef9bb592c1', + '64f6bc5e6cec9bf8c4fb694c3edba5a6', + '6501f42529aa8db0473b7b0866df53b2', + '650c267c84a05ac8f7b7167a754220ec', + '6548ddb3e3078209c18f376780c252cb', + '65ab9f08ef7103b6cfea32aa748d96ff', + '6649382d7c2d5d1b834868c5b159de25', + '66897ec932ec14c43b7156b453d9aad4', + '66978745acfa563424e1b971cb9d58c1', + '66adc632cd068063ff250b210c529f57', + '66d650bb662475c6b5cf052a3826ee9e', + '66e1ac5e2e8cf3cf445eb5da5f631ad8', + '670649bd1ed52cacf4bcca8c5a90fc0a', + '673c975a8a6250fe93f092f7383eeac1', + '673d86d168833c4d1440c9248b877b83', + '6790ab2d34cfc19461a6bf255f925597', + '679647e69a20bb6482abd1e5f2b7d931', + '67cdacac202a2d3b16c1b22733996de2', + '687fa77a15b8865371d6415d7a809889', + '687fe52b65b96cb111315a77fadbe01a', + '69143bfe7dcb9c15fca1160c3730bd52', + '6929a033e96fde056b29ef49423f9f57', + '694bee21f880e1af4bc78315cf7c84ee', + '69602a09232ca64ebc83156a4ab70b5a', + '69c0fd411df6a5340681e4157f89864d', + '6a1d9cc5886030d429ec810f31fcf65d', + '6a545e8466d45e68fc83abcee91cf843', + '6a6ff872d323e4a864cd4db863883e74', + '6a7ec4e6c8321662dba76276973827ef', + '6a879aa9fde9a859ce591d49e9b7bd02', + '6b11ccc0fc5447e69e627d01cb14dbc4', + '6bc73fa1caae19ba8bf89cd5d2aa0caf', + '6bd91c969b4cbf750d6465852617b33f', + '6c1124e6418cfcc8ec970f7d38cfb280', + '6c524f8f4db28ee0c0f8d46e94f17243', + '6c8825d743b0cfd9de0c0e03d594f667', + '6cd0a5be761684710a177d11293df197', + '6d788689f2916b02dac731ca91138634', + '6dcd61aac825cf079eb911b5645c8b4b', + '6e5688e04caace69083656ff88c5df98', + '6ed89547742e0267bf49d6f94c6c1c3f', + '6ef8f1dc83ebb978e32cabb51ec66dd5', + '6f01bd45ef491ec5492dfb0e476bdd82', + '6f2d0214628cc60a977b21a2621caad9', + '6f3bfa56066daa8a6c7d9d252f8022f9', + '7005a18a68c3c4e2ef558e0e25abc47b', + '706b4c2c7609f707a135a31503c40636', + '7088da1b6be876dc5ae19afe1d37833c', + '71c6b51b202994bc21f2ff1fa543bda8', + '71e34a571b6cda8a66a3f959d275901d', + '727e7769ca161adda9fe76fcb4539696', + '737e7418319e6a03ec7af0e6ef567024', + '738d64465529ce383debf38d7f9d63ce', + '739961a39f59d8b3895635c3ec9c3c7a', + '73b7f4b873e41a7d7f1aca5101e9ef3d', + '73dcc00247460cc29323bb0403fd2193', + '744a49bbc35874854c38f44874e25ab6', + '745fbd159940239c782f59b4bdb212b6', + '74a80bc1a5533b55acd3f004365c0dbb', + '74e92c0b5874a32d5346c9fcee48d54c', + '756113b64beaca5a229f63351275d7da', + '757c44ab06beaafea129220bc923805c', + '758d6cc8e426eb18d8359259a745c443', + '75928e20bc8a672b078e9ed15cbdb012', + '75c6da2c629e93a98bf1c421320ac78e', + '75c71fae3e36d5b1764f8f31982be985', + '75f352bb8d09891980b48eaa9c555df6', + '7643a460da7a5cc72dff8683f9261fe5', + '766c42d388e59948d6e71dc6d52a6d38', + '76c9538fb44b182305cfe06bce246aec', + '76fec598f95104a6b56dba11ef99caf6', + '770776a4692cf4ac97f54bb87db53eea', + '7744fccea1e9cea8576f0e65a3943126', + '77715ac7a4c5c96c655489de48341b67', + '777c3166cac17e462490361cdb52b981', + '7785aaca0d2e9b297eb71bde93cac0c7', + '779b465ae710c5583d4a5a89e841dc13', + '783a892e7a29f9aa23100338ef646b56', + '78bcbe0556dfcc0cd7089c18d4289387', + '78c924a5e451c517f3b2d4f1de1ca114', + '78e67353cd5fa9252b5984c7fae1632e', + '792620b6c2fdb036f14a00f506ace2f1', + '793aea3587ad8d9117d5ad3d047eea58', + '795f10876dd8e00f7625c2c2dbdcd98d', + '797cfe19dda9b2be011f7d8520dfcac7', + '79886d8ba404d4db4afbb4bba89e59ba', + '79894e986cd52dff338558f3301eced0', + '7997118bfc8baf77d9e145b331ef1296', + '7a15d318053d498451a0bca306f3e118', + '7a7ceaf45da6ec49d0a3da6d1c2a8bd6', + '7a97f486c692a3534a39ac716f4c866e', + '7a995acf71149384c6e0e7b94efcc8ea', + '7a9d262dffbd40ec0e3563cf1ecbdaea', + '7aa009a271f3f8f12b85424edb75194d', + '7aa6cfca7192cec6090649dca8ac0a0b', + '7abaa930ccab5c391b98c3da296650ad', + '7b4fb468d023a008e297734c80e26845', + '7b91f86312f3657a3d5c2031b8d2ce05', + '7bb690b68c87d2663e4eb4fef1956b5e', + '7c58a0ef5d224e9eeb9c19605713b975', + '7c6a85e8a7d400a31cf4610e624f0042', + '7c98961612490f9a2f7b429bd78554a8', + '7cf0e55aa3f54e3185ccfe5553cce885', + '7cf7bf9a344208ddead805bca022455e', + '7d38cd67ee31bba902ed0b6a48cb871c', + '7d998d6ac8b78e36c9307dba631c0960', + '7db2c942f5416731432ab46c502fbacf', + '7db95c7d7cb96f4b4b15df7c0881c324', + '7df77a8d46e5a1de2c28440561f26b0b', + '7e1ca1be21917fba17cf0afa8286ad57', + '7e7ee6ff06a20f3c2486be9d2908eea3', + '7e83af8f970d32511937ff32196bf4a2', + '7eb8b134a49511085b7ffe38305b9fa7', + '7ed9624da51bf297e5ea42467c28be2c', + '7ee8d4be62fed20982ce793a4a064d43', + '7f0a6dcfee36dcab6dca4c30b20adeba', + '7f3aacc835e7377eb31d8a719646a62e', + '7f6d0395a0616650e782b01404f814f5', + '8006b219ec4b609a222663e05d7a17fc', + '802dd07b381ced45ea3ea7fff94c6520', + '80889327f17b337f338181db03838999', + '809012d6e0e43d75de23d4dd518818cd', + '80bb14dde7d082b3d3fb9478a4d0a1d1', + '815688a1e21e9ee9ad70eb5f3ae5a9d5', + '81d1cce893f8c09876df98a7e6c073fa', + '820f2227d09fef6916f91af9612eaedb', + '823cb21fb8fda2a217311572446a8159', + '8242ed59320fd52d2bebc8c284defac8', + '82490711b8f979a9baa35569abe31a88', + '825bae2ae84c1a11a03a3b2202f3ff21', + '826a669dd3e643deffd12cdc07b6e5b6', + '827409e108a5998219799f6d75ae3ef5', + '82b8680aea6beb9721cdc8bacab5f517', + '82e27ca093879d9c52178eca9873ed30', + '82e4842c014e236e790e2d4d98e178db', + '82ec0c79731e530f99b6fdf499b55f49', + '82f2fe481b281646944503a46775e3e6', + '83c7aaf82084d700a68da0d94f8ae1e2', + '840faf7fd3be8156c8ee4afacb9c43f8', + '8418744e36de859dfeab8baac8497170', + '84205ef9e245ea6d115ff15a50706a8d', + '844c7b90e45d94b1233901776792e1df', + '84591f5c57c3bdcf86e6deb00957d906', + '8489ead9e6e14764a936d97e97d8679c', + '8514386f4a79eec3307c3c0dbd943572', + '8544899213ffc39d7757ebdea1b3c5ff', + '8554268c701c981a2d07e39ceba09b61', + '855a1cb248b5c93e0fd56e157a27d49c', + '856fb427e0cfb74e69ce81a51f2c27bb', + '85a4bf0026a29e265cf6a8c93c904dde', + '85bd68465045078e8c8998f7b3e05d4d', + '85f86fb05282cfb13c779639eee79041', + '861687d0cb74dc7fc6bec0758253e172', + '86393e2fc8cca145ec225c1bd4784e2b', + '867d0bf6027f23a1a7b6ee7f22cb0334', + '86a1516699ad13bfa3c3630a39635724', + '86ab964396ab1b1369474f820e439aaa', + '86f2b6fa9fa6e5ce9daa568984f3bd39', + '8708eab5ef80b6aba0701784825fdd32', + '8715421a9f02732abc62a296442b0030', + '872795e5abf5b3adc08c33d4bd2450d7', + '877f285468ce60b1b4f9aa3bac7c5f17', + '87e1b58ae4a4959848283a0247866407', + '8818e0b4ba8cc7508f63ea675eef971f', + '8845c2783972614f263fda4050938857', + '888139cef0fb89bf3f49258e5ef68f4c', + '88c7f35d0e01ec843a5fe6d82568408d', + '88c889b7c284807cad16b01bc70a3407', + '88f3b2721bff952eb16f0ebdab8aff34', + '89041e1d6532461ea5290ecf7e63c9e9', + '893bdc41e61daa299223786f5328ea74', + '89488afcd36ac32c229dad04fbfc60f9', + '89e6ab19dfbf51aef39a36878256d937', + '8a1d2c6f04d33de4de0ff0808ef93287', + '8a4128e6e64f12ec6ef2a3e0497d6113', + '8a4a460f6d2a013dce404a896f822ef9', + '8a97a559242599bdfaa27a0a0d78450b', + '8ac77de7006b2d18146ab498477fe631', + '8ade6b421f39a52258845487cbd02485', + '8af1bdd3d07f165b0a71ce5b33a89cca', + '8b265646a5b1cb8a7313d7cbbcba3cc6', + '8b489d03c50178fe9fdf3b70a8c28761', + '8bc200b7092fa17dc68fcf92fd7ff881', + '8c0e2d497795f1b13ccc64e2d4855dbb', + '8c20be197ec6551516e8c886b0cad945', + '8c62ab14403e453316e30bc384becc55', + '8c8bf61bcb408e7ab96b5deaacf4ff97', + '8cad6ddc155bf1f52a75e6b441de0874', + '8cb7507ac9249ac82ee703346fac7de2', + '8ce6bd7e475f0272889e25e8660ebb66', + '8cf0e04fee96a4b641c0bbecae3036f7', + '8d119f3c73318c23fb9a13c74f9278a3', + '8d170c55d606809d2f56da323271a47e', + '8d26165011a96624847534d6ff1e5d35', + '8d4d0ca7699a9f02311aefc59abf8560', + '8d650252168d646e8950d9f94d25c144', + '8db9640ab917733da91c1c2b7f023ad1', + '8dee5236d3ca726700ab796ffeadfc52', + '8e0d470aff1dd8ddf1d52f168ab7bae9', + '8e1304d107dc9ee1177470b1212b312e', + '8e1b12aaf505104d6174732d8bfa5fef', + '8e5cfc9a8dbe1aa81d74f6876e2bfb49', + '8fb7358018491128d5ab06a33456a337', + '902a949978baa627c8e89a69b039e16c', + '90d45b6d3c7ff6ae9c0b6fc9148873e8', + '90f402eb0a3b16d814959c614fc7c544', + '910441aef51561bd628cac1bda9c5121', + '911864b1f242417fb576abd07564ba0b', + '9136b1a098edc349a159487b6034d3dd', + '91def347ab1bcf83762acde09864d44b', + '923583c00c9d0bee9c9b110784d4810a', + '924e593b13e824c5e8b0395e7c48d3d2', + '925a9449dc67d6e0e8f5b3595f72d1de', + '92a65c0e0fd9a425a68b9e8a20fcc182', + '92d9d67ebb769dcece2a8f31339b4e72', + '930944ba677b49e6f4e2bb7774744703', + '930f6fc2222a17b6611a2b2be2a83353', + '93141fcd73b55e0774ef4265200227fa', + '93195cc5c1306454f94f7e506a302826', + '93602daa68e8715c30400b6db88116c9', + '9391e2d9febbf06d0fac4df187373971', + '9395b7f1bd3c7b642ddea6abd8b62f82', + '93a91754c07693d02c6eb9879e529137', + '93f02123e34d4bc0af11365b621dfa8a', + '941d10057afc815b397ff0669a399891', + '94ab856bfde35cc05e1b9761274ca6b2', + '955445b85f03068151dfd835d6674408', + '9580fadc098f33fd73769a81c30dd6bc', + '95b322a8fbc442a8c66ffa68973d4d57', + '960052f338d05917d374fdf010da27a7', + '965f0f52e11622d497f25deb3d2c9ceb', + '969310ebb630b2bd582e66a40778f31e', + '96a79c335d0141fba7f36f2c4d40452e', + '96e58bad25add2281a3bd879d182d734', + '972a908e51bc810920b6e0f0faa03f39', + '97419977b29bcf7072fee7023a940834', + '97e4dd20338e334e174052a5290953f5', + '9839a3af3470619844045a846c6f17b0', + '98541f1ab176eff543c32aee7e3521d7', + '98a5765ef891428900492b189458f55a', + '98b3f2bbc5bec9590b126b61a657585a', + '98d084e4f69d54f56ba5c394c8fe2867', + '99025f3b4978e2d75c6fba6f0bd295b2', + '990b13c991d336897b0a35ba96c11fdf', + '99674e03dd1b404963437cc4db8200cd', + '999538fbee76a7397a4dee789d5217c0', + '99c5b2749fa7290632dd67b751a43474', + '9a50f8706406632573eb5ec519371c47', + '9a5b78f794d75355d59ee7719127ddf3', + '9a791f306d3c493fa28b360d036a6965', + '9ab4bb59a0f29df356fc2329177ce3a2', + '9adc0a0e90fc7428bd7d78a081543d90', + '9b0153790035845f127637309a72fdfc', + '9b0f1f8d0c17aee0b49df0382958e471', + '9b2abb24e4910f3413f7fa1a098f06c6', + '9b552f036651c6a36938fb4c914bd45f', + '9ba5ab5bf0ddbc6db4aaeeb0a9a132a9', + '9bd0c13645c8b12fa8823b42877d001b', + '9c02a9e7854d7e8076dd2fa7af65e9a0', + '9c0de3d7bd3b230a2f2d749aa8fe7632', + '9c613c75a7d9e3b369c3a8a90e6fbbee', + '9c7ca3b5efe8cb272e695cb4ba4e5df9', + '9c86aa0b87c08216d5be27c09ae912ef', + '9d36b192f819354ccaac8156e2aad709', + '9d3c45f891c43f317aa049c96b3e3442', + '9d8bd93d97213864176583353b5acaf1', + '9d9c0b6a43bd5e2e847465a7e369c2ae', + '9dcd0cc82e776eb35be598efdcdfdc9f', + '9dd550e9af88a5e7592caff6474a565e', + '9e02e924712fbcc9ab8b5fbad609478e', + '9e085ff38b712db252458208881a1729', + '9e5f54988d48f5adeb352cf4944d4e61', + '9ead6071933e9bd5390902c1a9ace0e5', + '9ecfc60b471f43a90479ec74e9ee2d8a', + '9ed796b348127ffb1718f9d8a8de314c', + '9ef248745ac080ea599efe1a2fb46b4c', + '9f00306c6f7766ba105e8d220964017f', + '9f3fb30f861efc69a5960e65c7e1ea64', + '9f7e41c4665e1264e52c6edfdf396d8b', + '9fa88094b923244404b1506ad408b095', + '9fc7b291a1f6e0df908682f459651683', + '9fe2c8a78837817f221c44605f3a67be', + '9fff53b2cf73c6e958ac10207ace1473', + '9fff5845bb6f25a59dbaf6eb46ffe216', + 'a0058191941088414300116894889919', + 'a00f67500785931b01d460a76ed66978', + 'a03ad1aada4ddd805c115b4cdd4d05b3', + 'a0a85041965bf816e67114ab38d29a6e', + 'a0abed53ec7a3fedb163438e8be1c8e8', + 'a0e5b678f845bf77dfc14b554848bac1', + 'a0ec5c139564054719269fb275c7b2a4', + 'a14dc50a9445da5bcd76ec37180d3c2a', + 'a176053c9f21ca729de393429ed835dd', + 'a19c57a191b182e614a1ab3002d46a00', + 'a1aec2fd6ccb57ff4d264838bf2702e6', + 'a1eef457813cba1225c2d616ae3ca13c', + 'a214aa6ee2e6c3ca82516f4115811a5e', + 'a2bae7aa69b283340714a70ca5191249', + 'a2bcb8b69acb92a3fdb7074c4db149ba', + 'a2bf9a0777517984dd0ad65cdfe5d4e6', + 'a2bfadadda18c52392b77fef8ae5824b', + 'a305fccfe55b81dfa19774a704fefe98', + 'a38a8fe6ba8cdd44241e612a4e339bf4', + 'a3a33f3ab2183f9b1ba1dc30ae2af2be', + 'a424d9f189c3e47fb7a1b179057888c2', + 'a435ed22caed17ed51c36f7e0e7a9610', + 'a44f8dfa78f7151c61157ee41010b096', + 'a4572544706239f74b177280ee98b0e8', + 'a4f218de8717713d2c8c7af1f1d43325', + 'a54bd6dc1f576c4b281e94a9538312a8', + 'a54dc2359a93e830e6d0613f15741b33', + 'a563ab6f6293403dd5e2f9dca8e7fca3', + 'a59a6e2b09ef72445deec90902ebac84', + 'a5b1f8c04ebddf13d0120b606b36e468', + 'a6d406552b5e29b93518170516595255', + 'a73408903981c30d726acf07a6712ffd', + 'a73ade7e0c839bf62cf01a9ac07071a3', + 'a74e8925ae11ec4dc13796d995e3c761', + 'a761ea482c39c292ef0cf0f78f411882', + 'a7c6e8594c4052b2364f646a13f16239', + 'a8d6dfc9d28961ea1bb0ac5d4269f89f', + 'a8fb85dc54ee1e4248c7b94f991c0ef1', + 'a925a5bfecda69217ba9e8b87c22cbc5', + 'a977b3ff47770e00ad509564e6d2af31', + 'a9b5f0fa1f8218bd9a75ae2d0c316a8c', + 'a9fbe2f744fdf0fbdd5a283b5fafb3ee', + 'aa112bd9f614a83bffe9a723f4fee949', + 'aa4d266bc1d34b8a266a23b38326802f', + 'aa4dec2e019ef612407bb3c805ea1157', + 'aa5057ebbe002f6f4b1c6df187d40903', + 'aa6691f2eab7d28f000ef94cf83175c8', + 'aa6e372b4ab9bc8d8308d753267a0664', + 'aa950028a9ba45a06b024dc6adf40d3b', + 'aadff1032abd52b873442ddec72ffb9b', + 'ab637d25fe43d54e4167cb48e7b7dbe0', + 'ab98554ae0f660d968427bb08e634c14', + 'ab98c85d25084701a8b0ebcacbefdde9', + 'abc0cbf11335d8679cb31b0edeaad57e', + 'abd2013f87814e3d939b7f4f6a959750', + 'abe3be940fb2e6d1150bdc8027184b79', + 'ac12ef0c9039ba99201430c56fca5760', + 'ac2a8597bf26093cdff8a95d38ec1657', + 'aca1a6e5ee4f52d7651d664b88dab486', + 'acc6ff0c6ab19388cb8110c052a80085', + 'aced115f2620426cb05eeefd56fa48c4', + 'ad368531805ff9dcb8afa357a52506f5', + 'ada26aab0b55bc5325c398c3eb7c3658', + 'adce5f9e9686041d816d726957090690', + 'adfbbe138ebfdfcd11627dd715c6457c', + 'ae0da1761638805a9d3b2c4efa21c411', + 'ae1218d977ad1e8f865aaa4bd0588836', + 'ae3516de7256743ad9271659b00b52c2', + 'ae93620e68fcbb9e746c6d782a58f320', + 'af97ad66d2b2b12563839014e201f5d6', + 'afad69f8da5d9e40225536d15bc54799', + 'b04966d2702976041ff70af6187d05a2', + 'b0784a720da6178453b0e09c1d7cad08', + 'b08327408523735aec831c263b610e95', + 'b0afc9e3b56ba7625c74517a9ef119db', + 'b0f69fd6a03c5ed7f2ba3aecfdbfd36d', + 'b14f07fa654ecf4445bb47e76280cf5c', + 'b19e199b63ec110471db997701f5f69f', + 'b1ae7dd1af59b1a5a35ac610cfe38975', + 'b217d792a18a2cd1cf4b6f60b4fe8d67', + 'b22bc3afac5b3e42ada8c2a107c3a7b3', + 'b28f9d7236b2b86cb185e78cb11d75d5', + 'b3317fff300745ebe79cce6ad4f9ffdd', + 'b33a769072368af1e5517a396cdb6f72', + 'b389513ef9b573f4fb66621d88be03f3', + 'b38b2353c63a46924d449e79d1daaec6', + 'b38cc02786e5ad09c0376d27a92bf696', + 'b3a5a3dfd425ab4ab2de05e606741ee4', + 'b3b4b56cb536a7e30002efd478ab3470', + 'b3bab6eea5975f779bf77c39e594e8f8', + 'b4363f44a7566e28b6ef90a436b82ce9', + 'b48fc8fe386636daec178d2d1e094020', + 'b4a5175ecb27089b9f6c9735bf0e4bd6', + 'b4af2297a8c78cf7e4be76b4332a7465', + 'b4c5a1d67861bee42c906c23b8b4acfd', + 'b5d201196a047162e0794600f7e44e72', + 'b5e9797476bf0a8a88799bec048ab6f6', + 'b5f64a432406a049c70c9c351a584672', + 'b6ebc5decdd4c7fd9a9b7ed8b9014f91', + 'b6f30b812fb156fbbe6e3e38fe9f8d3a', + 'b70397bed451741a08d16453ff9e4eab', + 'b704af0cac0d3493a953e4663c92bcc4', + 'b724dde01d6c35869ccf68d5aacac9c9', + 'b74d6c88441275281fe24b11e5c6fc2c', + 'b7d9ac45b117cdb3764c1a469cef560f', + 'b7f9a6bc8c7c97b0f371c757b806d60e', + 'b85ebb10b0f74d4c9714cab8ca9c3fbd', + 'b873f4c82759e30af8caddec96fec759', + 'b88ebff952bc505b1aebbe11035a509c', + 'b8c7e6fd8c05ff2a59e60d335e4c48b5', + 'b8ea27d8822ceb979ebad1bdb6f75fdc', + 'b8ee38cd503dae9d79ac6d9aed3299f0', + 'b93dbcf59d2e0f0d7d752b9e7285f484', + 'b940b555fb25743fbd9c2da67002f347', + 'b9669038c85b5e0e0cfffd26318c98c5', + 'b9e3f973b4d308e8678eb0424154ad22', + 'ba59351efe64eb952c5504eff3627367', + 'ba5bc49592c5bcde492cee85a2bd2ff4', + 'bab707b152fbf16922d8a97626a788c9', + 'bb2d9b8d7080ce4a03a91434d123dda9', + 'bb4a52d05801d7bf5892432f20488c3f', + 'bb72ee39c524fee8453c89f326319dc5', + 'bbd081417fe3cd3d08feb05c9b78943d', + 'bc35b3b8bbe0860e626314849a13939f', + 'bcbd8a9f16e3afdc602209aaa31db087', + 'bd02018461e4650522af963585610890', + 'bd1de32462eb83067201e92f07c355f7', + 'bd436cf8841b821baaa0bd3368154c27', + 'bd4a764d6deddbb1f63946cd78b8b629', + 'bd57025f1b5e4f67c547944ee28f283e', + 'bd6edf62fb0ece06740d68da4bdd847f', + 'bd8163865f0e2624385bcea221117654', + 'bdb49d6f41bc50747974bfb39a907147', + 'bdd4053d9f756a88f793e5970ae1c4c9', + 'be2e73cb632f5abc02747ecf37b664ca', + 'be33c1ba3055c5f8cdbe7d2f1794aaeb', + 'be56d693d135895f90e8d591f907238e', + 'beb3449e2b27df9eda77bf72f658fe6d', + 'bebd577054ca65b6659d830a17b4b4f7', + 'becdb68b1fbd7ef0435c2cbdcd916a3d', + 'bee71f4ce1a551fadbc14b2839f3add0', + 'bf462d40ba86abf0b878fc2ee4e9572e', + 'bf68d41b1e246b244d42d8e66a1afdae', + 'bf873fa981d4c5205bdbf1381a601f65', + 'bf8bb7ee945c95eb699d1e8ebd84913d', + 'bf8c113c1d4ffe3e494b54b527d8cee4', + 'bfc027914b444b0e2064b97ab90e0790', + 'bfcbbad7a1aad3479b9c703f7e047d37', + 'bff9378e4847a6b18473f158c5517278', + 'c0307c0f56136e43e3c46ca94802ea3b', + 'c0477075243562f57002d116366620e2', + 'c04a24e5d11b2d9739608c36aa6abd6c', + 'c05360d50fd2160cb50fc30af4071d6d', + 'c0935c7edb865554aacfe7caf65439ab', + 'c0e34351819368943bbb1806e3e8b05b', + 'c101e961a58e029596273b5e06aa385e', + 'c266fe49aea96f4f370416295eb66075', + 'c2683dd4f5705cf8b2e048d08928c76f', + 'c29e8e5b1abfd35ad853d658a051f526', + 'c2b98ce479e0067f6b195324065e3153', + 'c2ba678a8326253e76c93bbc10134e32', + 'c3820aed58d03d9b6cba57271022c3b7', + 'c384d18a53d18e1a15c6a56187bf99af', + 'c396853fc72d158d8676e6ab02ce89f3', + 'c3c91eab72d942641f8850db5b9599df', + 'c47873b0d4c8c052c4f370e4d38cc3d4', + 'c4a454dc73ddbacfa3204813f9d7dad3', + 'c4af61e47ccfcc96bc0f9ebe1f53f4b0', + 'c4c95187f4a10e9b6051dff9df6b42b8', + 'c4dc5fd4bba266fae6d4f75d2654d112', + 'c4ea1cb327db64ecc7635ee472f2cf68', + 'c5af2b94afee68d56c3e008596603c4c', + 'c5fed80fcd653b373153fb5dc0ac48b8', + 'c65c4daec0dd7ac4a71df26648ba1671', + 'c68cfb94ba8b8d21be981ce34fd11dc6', + 'c80707a675dcfe089bdbf5de048e2f1b', + 'c80d70c0335e77ae67689831169bfe27', + 'c8b9e9141ef06b1929c752caf5caae50', + 'c8ba4601368e3336e7bdb86439f2eda8', + 'c8e44d119508941687b6645736793123', + 'c8fbadba56b8674ef1dcd7628ee4aa0e', + 'c923f1176aedaba9accb908e479e7423', + 'c9bcc7c177c7c5b162ba48ffc2bf5ea4', + 'ca070d23796d6ca6423164c8897f0ec1', + 'ca0a1499e54d430ac19620ff4a1f9ba8', + 'ca34118127cbd75716923afda0222efa', + 'ca7ce47815d2f3f1599fda16bcf5043b', + 'ca88872a712dc75393b70555f014f70c', + 'ca9f16470374ac7da820a6fe1069239a', + 'caa69cdcf46194d5c52552ad5156554b', + 'cba0fafd976a15454819e12933ecf936', + 'cbdcff00c61583142b8c201b44d48273', + 'cc5246a073f0a08d56155f053910f12c', + 'cc9eeecc946e9b325c97f22f6e83930b', + 'cca7cbf3311543395d1b96780ea0e982', + 'ccc4aded16cf1e5fc3c57863ce6a70dd', + 'cd002cc133019c939468d7f524573f43', + 'cd142f615ca8c4bea7373e7de06168d5', + 'cd6c463eb77006ea4bcac4ab03a8996a', + 'cd6fb6b993c252e2e63ef2cd501072de', + 'cd9bfc6b7fe5606f4176e921f4770224', + 'cdc29ef82126350af5d336e83bdd48df', + 'ce4ea3fcebd1f30367445122d3bd31b6', + 'ce95ecbbc8b78cbef52ab86ca4888244', + 'cef2fd47dde23bfa38477243250f1c5c', + 'cf369361edab448ce4570cf9d8a1cdd3', + 'cf7a0f2620142e307e032e3daab72ff7', + 'd06423a5a0e7c00a97f71c5645836ba6', + 'd0bd37efeb735c0ca77ceb645235beb4', + 'd0e7e1314baeda954070777cf20cc724', + 'd0f8aa8553fd7fe6dee82dd6d670ff98', + 'd11a8c564fdd0c65ad98f9aedbc51661', + 'd12db17728205d9ba6d9c87bbebe58d3', + 'd1666b0d963c473ee075c73598be7053', + 'd1a7df95806255ee47d9ad96aa0e861b', + 'd1b31eb2c1a3c7c5750ac5915f1d9718', + 'd1bfeb98ffc67d02311455c5a3cb49b0', + 'd2189246794299fc353137bac7a59f2c', + 'd23a9506c8af058d97e344bbedb341be', + 'd24198307be9be78e5de33d8793d41bc', + 'd30282d5c07663c2a6b281317e10f7f1', + 'd33db63b8b80b51f06b12713d5f44e0f', + 'd3caeee2db9be23950fa51844e75c7ca', + 'd3ea7b0d96d5a278a93b2ddf1488ef31', + 'd40b265e06549e76a8f637422cf0835c', + 'd45268719a8aa88ae9f28fc27f07c54d', + 'd49e5340d7501f22a6fe46bed009b7be', + 'd527ebcc80cbefba3aeddb91719f3040', + 'd52e9636e57a6c4f654d076a1d4ff468', + 'd5334a6b570226cd184f5bea1a985d80', + 'd53538982298230b04403a695dcb2231', + 'd583478857fc9e12b3d538ca3b65d5d5', + 'd61233796167efb681401cdd908f0f70', + 'd627b5f50bdc0fa915d39cc32e7b760d', + 'd628ffd8aee1d8dadaf1864d295f3445', + 'd68eab15bce2dc4af3a92fa815f59336', + 'd6ada30b4cb916b077d618a73a93cf04', + 'd6bc3794fdb66d072a0e6e4b2f18fbaf', + 'd6cc7d0e0120a6a267adac3a05f6f287', + 'd6d08f04d065382933283a788f52f080', + 'd70da1d4fd5fe85e82e660c183da108e', + 'd7c4dc223f2a4b9817b7d30940bec64c', + 'd7de5eb5311c6220975dedf108e46a39', + 'd85b9548571a9d0edc73590660c0c18c', + 'd8af9ab641b190aeec73d211dfcbf4db', + 'd8b1e3c8d7a051c927c90ae2692b3768', + 'd8d8bfc0724c93fe35791942f69dc64e', + 'd8e20ddae73f03f16348e71884c3891d', + 'd90bdd41130bfd946f0309360a7ea05d', + 'd9109defa43b38c20ad21da38cf2c6c9', + 'd9199654e9bc0c84ccc64c81e0d3c393', + 'd960f8a4fb9d37d457e5a4b46faf98d6', + 'd9b35f8ac019ae98454b6e98c279ab13', + 'da108765256f11e4edd9314e1e494fcd', + 'da3719df7e7e02d3b78dfd10531261d4', + 'dac7a910ae791d1298a7941662ef0eeb', + 'db28722a0d1a5b0c5b1e321dfd127195', + 'db86716fff3d741d014c3b46eccb414a', + 'dc256ab79aab41f9a65bb72b9a53a154', + 'dc3b8b030492260496a8e05b7637fd4b', + 'dc90b8aba25f31d80df5c3cea85685d6', + 'dcc15b327be19bc5b50e434690d35350', + 'dd35069fb1b0b9e3e6a3195b99145330', + 'dd92bdae4ed7cb64e16f782d4d7b7767', + 'ddf1d2901866aad80dfb033e6c60e601', + 'ddf25365d3b19b83f4856fe1c8ea581c', + 'de1dafe1fb480a101d7da69608e77074', + 'de6c1c7dc6cba47e1dd3b0ad207b074b', + 'de9cd88671d4347836548fa6daecf905', + 'dec43b4d74667467c771fe7322dba942', + 'dec8b28eb5eec90f9505e0ed7064d294', + 'def4ce670fa5b300eb7b677a5f193f28', + 'df00bd33406a04fdc919a6992a0911c9', + 'df10c3db0b4a41946fe5729dee65393d', + 'df3fb9fec424fb443568c2ccdc0a7a11', + 'df659e4fce1b8f5dfba57d775013bc52', + 'df8468e5ceefe03d74e3c4fc52a93a8b', + 'dfa35a09f7e1f58e5b766576ba3cba6c', + 'dfade29220faca203263212735beb7ce', + 'dff26f8c18ef6963960f929c7426e469', + 'e022129a9694b8e72c8870552b7fb277', + 'e06500ea7c2b0a626dededdf40ffd65c', + 'e0852d277488e972e8785a65f2d13fec', + 'e10ebeb92e7a3b51f97ae1cee8315622', + 'e11428b8590c781a531a3845c81c92b7', + 'e13c3af20606152ffb2cde63161debff', + 'e16861e6f1f61807f27fbb842eaede21', + 'e17a3a67838ce6bcb3d932ee6ac70965', + 'e25bbb37db9243c70cbc562e357bd2c4', + 'e25c6e73bceb590053769855b4d7aeea', + 'e26436a21b18fd1c2f7b5106db6d36fe', + 'e288e6095032e0639f9ed72aa0570a4b', + 'e2d3c5e187ec8008ff43ccab61bc2567', + 'e38772a1730f752efeaf38cddfac1c4f', + 'e39630c2c50040e463466d81e8a3d368', + 'e3b485a297cf900b06de172e547a2963', + 'e49c3becf49f27e8e03884b4e3e0c49a', + 'e4dcd21df088a081b4350ee8287faff1', + 'e56728ffacffa0f3ce10cd80ebb80f09', + 'e62d826463fa1c40cd22cbb6f64447d5', + 'e63629bd5e5e84b2d8512a52fc2df31c', + 'e67e35df969cc080975a0de540f77473', + 'e687d2e57ef89208ad82b89b76c85ee8', + 'e6f50d14a429b1de2c3dbb3276ed4b12', + 'e74914315becf19950732ddb7af4b4b8', + 'e777d35edb3fed07666b865f73ddd263', + 'e794a44fb73b60a9a9be1faadecaff80', + 'e80cde424610752721ae51b421fd84e3', + 'e8146ec5487c89f71c65d610e4907edd', + 'e82ee6dca40947ee60e05ea600a1392f', + 'e84b60c31ac8b8b6d7b645714628448d', + 'e88e2925289ee0ff74e70ac17486eecb', + 'e8d35f97433156519ecfab0f1843b335', + 'e8e6a817aa26915c5534bd56191af63d', + 'e8f8adeaa0c6687eb5edd1c075ae71f6', + 'e90346599499fd027888748e592178c9', + 'e93380c7ef8dd1571638a3fe0b7f256e', + 'e93a11d1058d6a5cd683ea948bb1cc25', + 'e957800efa291188263053adfee79daf', + 'e9cfcd957116e2dac2c16159afb96f1b', + 'ea1488f19b1cb5bb28e0f2ffd114225d', + 'ea2c54df3c2bdd4396557fd31f6fee39', + 'ea2ce262b4febcd5fa9060d58ae56482', + 'ea70196d110d0fac0b43be584c88bdcf', + 'eac641028e227ce70195e32b7c3913a6', + 'eacd265eb9515a3c8701efb0e1e242ba', + 'ead7e35a3a75f24bf619b7da0b46d872', + 'eaef0f262df250febbce64c13194845c', + 'eb280e53dae708501e64fbd6f13b93cd', + 'eb64880ea975c14404fbb754da65eed0', + 'eb68b96094324aad7f16c9b616f40b9b', + 'ebc99ff869ce90e5786554dcc3c18768', + 'ebea5bba51a01b80a98a0ec0e92ac4d2', + 'ebf4d67bf0dd83026536f12c5fb3cb87', + 'ec3061064808a4737ee5d81ca26cbc02', + 'ec6419bcfac331cfe7a35e999f8a97ee', + 'ec7073e291786c0c970c94a38d381b3c', + 'eca247110ac1572a20d6b01072306e15', + 'eccad4116321872f231ecbae1ff85b40', + 'ece5f77f0fb2b2e6585ccd3ad2c6f2da', + 'ecf82164a76b5042456062babe6f90a8', + 'ed21e146c2ac0fa03f361fc6e5968241', + 'ed784dae74d102ff2b1c42519900cacb', + 'ed7d8bca93037a310353bb18e7ff718b', + 'ed953a77008266d48ca9999b35baea49', + 'edac13405b9f3d29c18a5e08e797334f', + 'edca87cb43d4297ac20c9a4148d8b586', + 'ee0ed67d58184c8e6ca426cb6120dd9d', + 'ee2c21b5ebe2249c764fb5e84fdb6a7d', + 'ee8ff31530da583fc82356968242e05b', + 'ee9d94a042be888ac2db90c19b562c65', + 'eead54a9af3e7193e0f1d497e0b35a13', + 'eeea9372a541fc8154ec6bab5e1a6fa2', + 'ef1d89304232b8c14962bdd88959a781', + 'ef38e6bc2183dd84ccc975172f65323d', + 'ef50c396a25b46c31c48a9de38c75abd', + 'ef58e4519fc67e9ebb483f6f6154a774', + 'ef6ce8491618d18f2bedb7062782a30c', + 'efc4ef410aaf13e107388e569f2deeaf', + 'f0214c697c21336a6b69e9050f2fe4b7', + 'f03b47a6d7b2217c476230f9296589e8', + 'f05e129d83717aee2550880aae0bbb38', + 'f07ae4d596a8e0bf41ff68482333a369', + 'f09d96e8c5af5d1d840b91761f6f5cb0', + 'f0e8c337ffa8f649cf2171cf1e144a27', + 'f12c401eb7db03ff3a9cde5dd3d2557f', + 'f13392e394f090f65e5316e24ad37468', + 'f152da260d4a6f913317335c2ab4291d', + 'f18512f0ffdb4604fae2a19595e683a3', + 'f19b00060a0275e2cfe8b594ddfbbbb9', + 'f1c603cb7c632d7e5ae887f8730472f0', + 'f1df49bf684b5792ba058ed13f8b2927', + 'f234e695aa0678eaf4511f37f8411dca', + 'f2d148da2c49fbee048610b9868440af', + 'f30db65e8774bbfac82b75fe39055eec', + 'f44dc93f68013d766ebe23419d16c54d', + 'f484880135519f8870ef42acb7dfbbf3', + 'f50a51a3cad0f70b53c7ba6ce677d586', + 'f51dec0686c54df7378b948217f563cd', + 'f549db117aec874e257ece05e64a2cf7', + 'f5eaaf90fc11d227d3ced764889cc15a', + 'f5faf947039914a0ab0c439a5aac2cfa', + 'f60fa919969139e22aa551e65e85491f', + 'f647ad62837f7674eef14841f250ef9f', + 'f6754fe51efc5bea20a2b3745feb1494', + 'f69f82c1e1ba17efa24fdb35c82f8c0c', + 'f6b7c006bf639219932de105fba5cea1', + 'f6b7d742b7ef73cceb75a18970353b00', + 'f6fc1ff372e99f26b962ecc9c6936717', + 'f787b54cf8a39b582427a95b91d4b4c9', + 'f79e01143694a57c063e059df3538314', + 'f7b874ecbf0a0bcd64f83fe5c667c527', + 'f7c3f2a0dad1110aaeadeb3b6c330408', + 'f7dcdcb11b1a1ce0eaabb1b4fa2c7393', + 'f8a28e766d4fb71f2fa9afe4c582ee7b', + 'f8e6364ae6c653759edac206422588e0', + 'f90ce9f3aacdab47305c331bca1b7288', + 'f961771c93c459c794b8f17b834bbc25', + 'f98402172e16053ead75c0fd8b2b5bb5', + 'f9cd1dbd92a94654ac0b0ecee907a1f2', + 'fa9d0f257e55821cbeaa183a63656459', + 'fb39d842736777541afde0ececd96052', + 'fbf7abed7cd18ea3d56b1ee3197f19f5', + 'fbfc15c6914c0e247fef67bf486e1cbd', + 'fc3d99a02d8709f12d26a6625fb8be6c', + 'fc56a834efc66c6c109b489eab7cb94f', + 'fc869fed4c42ea44e877ad1074d42db0', + 'fcb276ee2cd6115b690f9f1bfb515703', + 'fcbbdece059ecac3037a2ad244695500', + 'fd151026d9fc548f88a50563c2f38626', + 'fd16c1c8e32e429df5f36797db2e6f89', + 'fd177049f8ef56b2c08b1cf1bd52aee0', + 'fd80d6ac67a16152fa44261c5a5a7a72', + 'fd971db40cfd5fa2e4c940f00169c580', + 'fdc97a18473abb6e1528b423fb351475', + 'fdf6aa371cff16cf9c52e537dfc31400', + 'fe2c001eaabb6b0f5641a1f347308e9f', + 'fe61dfbffd85d9ec313049a94906d62b', + 'fe6ae90c158f4801364e12e5a0cdafb0', + 'fe801024805e2c672bb7d0568b43fcfb', + 'fe819c5dea7fa32437f5b19c4b0b1d44', + 'ff04f0641b4696aa5ae43088530219b1', + 'ff136d01870d1818761c72759155b0a6', + 'ff71416839616f7f0fe52612502cccc7', + 'ff7617302c6625609ec0cb443b0fe647', + 'ffcd87951df2bfd8bc83dc5addf723e0' ) diff --git a/idb/cli.py b/idb/cli.py index 811af46a..daabdc0a 100644 --- a/idb/cli.py +++ b/idb/cli.py @@ -15,7 +15,7 @@ from idb import (data_api, indexing, stats) # noqa -@cli.group() +@cli.group(help="Output data tables used interally by idb-backend.") def datatables(): pass @@ -32,8 +32,9 @@ def locality_data(): from idb.data_tables.locality_data import main main() -@datatables.command(name="taxon") -@fnlogged -def taxon(): - from idb.data_tables.taxon import main - main() +### "taxon" has no useful output at the moment. +# @datatables.command(name="taxon") +# @fnlogged +# def taxon(): +# from idb.data_tables.taxon import main +# main() diff --git a/idb/clibase.py b/idb/clibase.py index 14897137..bc219c97 100644 --- a/idb/clibase.py +++ b/idb/clibase.py @@ -104,7 +104,7 @@ def wrapper(*args, **kwargs): else: fnname = getattr(fn, 'func_name', fn) argsreprs = itertools.chain( - itertools.imap(repr, args), + map(repr, args), itertools.starmap(u'{0!s}={1!r}'.format, kwargs.items())) logfn('DRY_RUN: {0}({1})', fnname, u', '.join(argsreprs)) return retval diff --git a/idb/config.py b/idb/config.py index 35feabe7..1193d646 100644 --- a/idb/config.py +++ b/idb/config.py @@ -33,7 +33,7 @@ def update_environment(env): globals()[k] = v def load_config_file(p): - with open(p, "rb") as conf: + with open(p, "r") as conf: logger.debug("Reading config from %r", p) json_config = json.load(conf) config.update(json_config) @@ -58,8 +58,9 @@ def load_config_file(p): IDB_CRYPT_KEY = os.environ.get('IDB_CRYPT_KEY') ES_ALLOW_INDEX_CREATION = os.environ.get('ES_ALLOW_INDEX_CREATION', 'no') -ES_INDEX_CHUNK_SIZE = os.environ.get('ES_INDEX_CHUNK_SIZE', '1000') +ES_INDEX_CHUNK_SIZE = os.environ.get('ES_INDEX_CHUNK_SIZE', '500') ES_INDEX_NUMBER_OF_SHARDS = os.environ.get('ES_INDEX_NUMBER_OF_SHARDS', '48') ES_INDEX_NUMBER_OF_REPLICAS = os.environ.get('ES_INDEX_NUMBER_OF_REPLICAS', '2') +ES_INDEX_REFRESH_INTERVAL = os.environ.get('ES_INDEX_REFRESH_INTERVAL', '1s') IDB_EXTRA_SERIOUS_DEBUG = os.environ.get('IDB_EXTRA_SERIOUS_DEBUG', 'no') diff --git a/idb/corrections/record_corrector.py b/idb/corrections/record_corrector.py index c8887f48..3a570bf8 100644 --- a/idb/corrections/record_corrector.py +++ b/idb/corrections/record_corrector.py @@ -95,15 +95,15 @@ def get_etag(t): # apply a flag instead. # print(t, self.corrections[etag]) # consider adding logging / debug lines instead - + if ( "dwc:kingdom" in self.corrections[etag] and "dwc:kingdom" in corrected_dict and corrected_dict["dwc:kingdom"].lower() != self.corrections[etag]["dwc:kingdom"] and corrected_dict["dwc:kingdom"].lower() in protected_kingdoms ): - corrected_dict["flag_dwc_kingdom_suspect"] = True - continue + corrected_dict["flag_dwc_kingdom_suspect"] = True + continue for k in self.corrections[etag].keys(): if k == "dwc:scientificname": diff --git a/idb/data_api/__init__.py b/idb/data_api/__init__.py index 4355fbf2..1848303f 100644 --- a/idb/data_api/__init__.py +++ b/idb/data_api/__init__.py @@ -74,8 +74,9 @@ def run_server(info, host, port, reload, debugger, eager_loading, debug, wsgi): # import path because the app was loaded through a callback then # we won't print anything. if info.app_import_path is not None: - print("Werkzeug server @ http://{0}:{1}/ ENV={2}".format(host, port, config.ENV), - file=sys.stderr) + # logger is not started yet. + startup_msg = "Werkzeug server @ http://{0}:{1}/ ENV={2}".format(host, port, config.ENV) + print(startup_msg, file=sys.stderr) if info.debug is not None: print(' * Forcing debug %s' % (info.debug and 'on' or 'off')) @@ -85,13 +86,17 @@ def run_server(info, host, port, reload, debugger, eager_loading, debug, wsgi): elif wsgi == 'gevent': from gevent.pool import Pool - from gevent.wsgi import WSGIServer + from gevent.pywsgi import WSGIServer from idb.helpers.logging import idblogger from requestlogger import WSGILogger, ApacheFormatter logger = idblogger.getChild('api') - from werkzeug.contrib.fixers import ProxyFix - logger.info("gevent server @ http://%s:%s/ ENV=%s", host, port, config.ENV) + from werkzeug.middleware.proxy_fix import ProxyFix + startup_msg = "gevent server @ http://{0}:{1}/ ENV={2}".format(host, port, config.ENV) + if logger.level < 1: # more severe than logging.INFO, so we need to print it + print(startup_msg, file=sys.stderr) + else: + logger.info(startup_msg) app = info.load_app() app = WSGILogger(app, [], ApacheFormatter()) app.logger = logger.getChild('r') diff --git a/idb/data_api/v2_download.py b/idb/data_api/v2_download.py index f5f59c52..73816d9c 100644 --- a/idb/data_api/v2_download.py +++ b/idb/data_api/v2_download.py @@ -55,7 +55,7 @@ def download(): if isinstance(o[k], list): o[k] = o[k][0] - if isinstance(o[k], basestring): + if isinstance(o[k], str): try: params[k] = json.loads(o[k]) except ValueError: @@ -107,6 +107,8 @@ def get_task_status(tid): rconn = get_redis_conn() rtkey = DOWNLOADER_TASK_PREFIX + tid try: + # In python3, redis returns bytes by default for both keynames and data. + # See important change in get_redis_conn(). tdata = rconn.hgetall(rtkey) if len(tdata) == 0: return None diff --git a/idb/data_api/v2_media.py b/idb/data_api/v2_media.py index b2fec488..3e4cdbc3 100644 --- a/idb/data_api/v2_media.py +++ b/idb/data_api/v2_media.py @@ -193,7 +193,7 @@ def upload(): j = request.get_json() if j is not None: vals.update(j) - for k, v in request.values.iteritems(): + for k, v in request.values.items(): vals[k] = v filereference = vals.get("filereference") diff --git a/idb/data_tables/build_taxon_index.py b/idb/data_tables/build_taxon_index.py index c6199db1..bb6a0ac7 100644 --- a/idb/data_tables/build_taxon_index.py +++ b/idb/data_tables/build_taxon_index.py @@ -1,3 +1,4 @@ +from __future__ import print_function import os from collections import Counter @@ -65,7 +66,6 @@ def get_data(path_to_checklist): for er in e: cid = er.get("coreid") - #print e.rowtype, cid, rid if cid is not None: cid = int(cid) if cid > rid: @@ -85,14 +85,14 @@ def get_data(path_to_checklist): del r["id"] yield ("taxonnames",r) if rts["rows"] % 10000 == 0: - print rts.most_common() + print (rts.most_common()) - print rts.most_common() + print (rts.most_common()) def main(): # for r in get_data(os.path.expanduser("~/Downloads/backbone-current-sorted.zip")): # pass - for r in bulk_index(get_data(os.path.expanduser("~/Downloads/backbone-current-sorted.zip"))): + for _ in bulk_index(get_data(os.path.expanduser("~/Downloads/backbone-current-sorted.zip"))): pass diff --git a/idb/data_tables/build_taxon_kv.py b/idb/data_tables/build_taxon_kv.py index 1b455248..5a6fbf1b 100644 --- a/idb/data_tables/build_taxon_kv.py +++ b/idb/data_tables/build_taxon_kv.py @@ -213,7 +213,7 @@ def work(t): elif cand_rank in taxon_rank.mapping: rank = taxon_rank.mapping[cand_rank] else: - print "unkown rank:", cand_rank + print ("unknown rank:", cand_rank) if rank is None: if r["dwc:scientificName"].endswith(" sp.") or r["dwc:scientificName"].endswith(" sp"): @@ -245,7 +245,7 @@ def work(t): } match, score = fuzzy_wuzzy_string_new(r["dwc:genus"], rank="genus", should=should) else: - print r + print (r) return (etag, "failout", (None, None), -1, etags[etag]) if match is not None: @@ -292,7 +292,7 @@ def get_taxon_from_index(): etag = objectHasher("sha256", r["_source"]["data"], sort_arrays=True) stats["count"] += 1 if etag not in etags: - stats["precount"] += 1 + stats["precount"] += 1 try: yield (etag,r["_source"]["data"]) except KeyError as e: diff --git a/idb/data_tables/locality.py b/idb/data_tables/locality.py index 667e49eb..619f594e 100644 --- a/idb/data_tables/locality.py +++ b/idb/data_tables/locality.py @@ -24,7 +24,7 @@ def get_data(): to_insert = [] for k in vds: - for v, o in vds[k].iteritems(): + for v, o in iter(vds[k].items()): if "dwc:country" in o and o["dwc:country"] in vds["dwc:country"]: o.update(vds["dwc:country"][o["dwc:country"]]) to_insert.append((dict([[k, v]]), o, "data_dictionaries_1", True)) diff --git a/idb/data_tables/locality_data.py b/idb/data_tables/locality_data.py index ba1ea307..fc6acbfd 100755 --- a/idb/data_tables/locality_data.py +++ b/idb/data_tables/locality_data.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 +from __future__ import print_function +import pprint iso_two_to_three = { "AF": "AFG", @@ -2488,10 +2490,21 @@ } def main(): - for k,v in kl["continent"].iteritems(): - if v not in real_continents and v != "None": - print k,v - for k,v in kl["country"].iteritems(): - if v not in iso_countries and v != "None": - print k,v + # TODO: Consider making this into a test. + # for k,v in kl["continent"].iteritems(): + # if v not in real_continents and v != "None": + # print k,v + + # for k,v in kl["country"].iteritems(): + # if v not in iso_countries and v != "None": + # print k,v + + pp = pprint.PrettyPrinter() + + for each in globals(): + if not each.startswith("_"): + if isinstance(globals()[each], set) or isinstance(globals()[each], dict): + print(each.join("**")) + pp.pprint(globals()[each]) + print() diff --git a/idb/data_tables/rights_strings.py b/idb/data_tables/rights_strings.py index 1c58d440..3dfbd57e 100644 --- a/idb/data_tables/rights_strings.py +++ b/idb/data_tables/rights_strings.py @@ -1,3 +1,6 @@ +from __future__ import print_function +import pprint + import re import traceback @@ -69,8 +72,8 @@ "CC BY-NC (Attribution-NonCommercial)": "CC4 BY-NC", "CC BY-NC (Attribution-Non-Commercial)": "CC4 BY-NC", "CC BY (Attribution)": "CC4 BY", - "Creative Commons Attribution Non Commercial (CC-BY-NC) 4.0 License" : "CC4 BY-NC", - "Public Domain (CC0 1.0)" : "CC0", + "Creative Commons Attribution Non Commercial (CC-BY-NC) 4.0 License": "CC4 BY-NC", + "Public Domain (CC0 1.0)": "CC0", "CC0 1.0 (Public-domain)": "CC0", "Public Domain": "Public Domain", "License for specimen data: Public Domain (https://creativecommons.org/publicdomain/zero/1.0/). License for media, including photographs and images of specimens: CC BY-NC-SA 3.0 License (http://creativecommons.org/licenses/by-nc-sa/3.0/us/). Users of the data are encouraged to acknowledge the source of the data if any of these records or media are used for publications, analyses, reports, or on web sites. The provider of the data, and its staff, are not responsible for damages, injury or loss due to the use of these data. Fitness of use must be determined by the user of the data.": "CC0", @@ -221,7 +224,7 @@ def pick_license(s, debug=False): return manual_assignment[s] rights_regex = re.compile( - "((?:by(?:.?nc)?(?:.?sa)?(?:.?nd)?)|cc0|zero|(?:public.?domain)).?(\d\.\d)?", re.I) + r"((?:by(?:.?nc)?(?:.?sa)?(?:.?nd)?)|cc0|zero|(?:public.?domain)).?(\d\.\d)?", re.I) strip_special = re.compile('[^0-9a-zA-Z]+') picked = None order = -1 @@ -230,7 +233,7 @@ def pick_license(s, debug=False): r = strip_special.sub("", m[0]).upper() v = m[-1] if debug: - print r, v, rights_order.index(r), order, picked + print (r, v, rights_order.index(r), order, picked) if rights_order.index(r) > order: if r in ["CC0", "ZERO", "PUBLICDOMAIN"]: picked = rights_strings[r] @@ -241,7 +244,7 @@ def pick_license(s, debug=False): else: pass if debug: - print r, v, rights_order.index(r), order, picked + print (r, v, rights_order.index(r), order, picked) except: traceback.print_exc() return picked @@ -252,10 +255,21 @@ def get_rights_attributes(s): def main(): - for s in acceptable_licenses_trans: - picked = pick_license(s) - if acceptable_licenses_trans[s] != picked: - # print s, acceptable_licenses_trans[s], picked - print - print s, acceptable_licenses_trans[s] - pick_license(s, debug=True) + # TODO: Consider making this into a test. + # for s in acceptable_licenses_trans: + # picked = pick_license(s) + # if acceptable_licenses_trans[s] != picked: + # # print s, acceptable_licenses_trans[s], picked + # print + # print s, acceptable_licenses_trans[s] + # pick_license(s, debug=True) + + pp = pprint.PrettyPrinter() + + pp.pprint("*licenses*") + pp.pprint(licenses) + + print() + pp.pprint("*acceptable_licenses_trans*") + pp.pprint(acceptable_licenses_trans) + diff --git a/idb/data_tables/taxon.py b/idb/data_tables/taxon.py index d338c9be..f46ce259 100644 --- a/idb/data_tables/taxon.py +++ b/idb/data_tables/taxon.py @@ -65,7 +65,7 @@ def get_data(path_to_checklist): # fail += 1 except: traceback.print_exc() - print r + print (r) # print len(names), len(needs_name) # total_miss = 0 @@ -122,7 +122,6 @@ def get_sources(): def main(): count = 0 - for dr in get_data(os.path.expanduser("~/Downloads/backbone-current-sorted.zip")): + for _ in get_data(os.path.expanduser("~/Downloads/backbone-current-sorted.zip")): count += 1 - # print dr - print count + print (count) diff --git a/idb/data_tables/taxon_rank.py b/idb/data_tables/taxon_rank.py index bc483bb9..2d5a725f 100644 --- a/idb/data_tables/taxon_rank.py +++ b/idb/data_tables/taxon_rank.py @@ -1,4 +1,5 @@ # -*- coding: UTF-8 -*- +from __future__ import print_function # http://rs.gbif.org/vocabulary/gbif/rank.xml acceptable = { @@ -377,17 +378,17 @@ def main(): o = r.json() for k in o["taxonrank"]: if k not in mapping: - print k, o["taxonrank"][k] + print (k, o["taxonrank"][k]) elif mapping[k] is None: pass elif mapping[k] not in acceptable: - print k, mapping[k] + print (k, mapping[k]) new_accept_set.add(mapping[k]) if len(new_accept_set) > 0: - print json.dumps(list(new_accept_set), indent=4) + print (json.dumps(list(new_accept_set), indent=4)) + - if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/idb/helpers/__init__.py b/idb/helpers/__init__.py index 9c57e996..4183d6b7 100644 --- a/idb/helpers/__init__.py +++ b/idb/helpers/__init__.py @@ -16,7 +16,7 @@ def first(iterable, key=None, default=None): def ilen(iterable): "Traverse (possibly consuming) an iterable to count its length" count = 0 - for e in iterable: + for _ in iterable: count += 1 return count @@ -28,4 +28,4 @@ def grouper(iterable, n, fillvalue=None): """ # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx args = [iter(iterable)] * n - return itertools.izip_longest(fillvalue=fillvalue, *args) + return itertools.zip_longest(fillvalue=fillvalue, *args) diff --git a/idb/helpers/biodiversity_socket_connector.py b/idb/helpers/biodiversity_socket_connector.py index 2c6a4482..6f6b01ee 100644 --- a/idb/helpers/biodiversity_socket_connector.py +++ b/idb/helpers/biodiversity_socket_connector.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import +from __future__ import absolute_import, print_function import socket import json @@ -101,13 +101,13 @@ def get_genus_species_list(self, namestr_list): def main(): b = Biodiversity() - print b.get_genus_species("Puma concolor") + print (b.get_genus_species("Puma concolor")) - print b.get_genus_species_list([ + print (b.get_genus_species_list([ "Puma concolor", "Quercus alba", "Acer floridanum" - ]) + ])) if __name__ == '__main__': main() diff --git a/idb/helpers/conversions.py b/idb/helpers/conversions.py index 626f8b65..843d8acb 100644 --- a/idb/helpers/conversions.py +++ b/idb/helpers/conversions.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import +from __future__ import absolute_import, print_function import dateutil.parser import re import traceback @@ -223,6 +223,15 @@ def checkBounds(x): + """ + Checks whether a supplied date is within the agreed timeframe. + iDigBio only accepts data from 1700-01-02 UTC to now (when ingestion runs.) + x: datetime.datetime + Returns + ------- + bool + Indicates whether the date is allowed. + """ lowerBound = datetime.datetime(1700, 1, 2, tzinfo=pytz.utc) upperBound = datetime.datetime.now(pytz.utc) if isinstance(x, datetime.datetime): @@ -277,7 +286,7 @@ def getfield(f, d, t="text"): if t == "list": return [x.lower().strip() for x in d[f]] else: - if isinstance(d[f], str) or isinstance(d[f], unicode): + if isinstance(d[f], str) or isinstance(d[f], str): return d[f].lower().strip() else: return d[f] @@ -291,7 +300,7 @@ def verbatimGrabber(t, d): r[f[0]] = getfield(f[1], d, t=f[2]) return r -gfn = re.compile("([+-]?[0-9]+(?:[,][0-9]{3})*(?:[\.][0-9]*)?)") +gfn = re.compile(r"([+-]?[0-9]+(?:[,][0-9]{3})*(?:[\.][0-9]*)?)") def grabFirstNumber(f): @@ -307,7 +316,7 @@ def grabFirstNumber(f): pass return n -mangler = re.compile("[\W]+") +mangler = re.compile(r"[\W]+") def mangleString(s): @@ -315,7 +324,7 @@ def mangleString(s): uuid_re = re.compile( - "([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})") + r"([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})") def grabFirstUUID(f): @@ -375,7 +384,7 @@ def intGrabber(t, d): for f in ef[t]: fv = getfield(f[1], d) if fv is not None: - if isinstance(fv, (str, unicode)): + if isinstance(fv, str): try: n = grabFirstNumber(fv) if n is not None: @@ -432,19 +441,23 @@ def geoGrabber(t, d): latexp = getExponent(lat_val) lonexp = getExponent(lon_val) - + # geopoint_pre_flip flag set here + # if latitude and longitude fall in ranges below, swap them if ( (-180 <= lat < -90 or 90 < lat <= 180) and (-90 <= lon <= 90) ): lat, lon = lon, lat r["flag_geopoint_pre_flip"] = True - + # geopoint_bounds flag set here + # latitude must be in the range -90 to 90 + # -90 corresponds to South Pole, 90 North Pole if not (-90 <= lat <= 90): r["geopoint"] = None r["flag_geopoint_bounds"] = True return r - + # geopoint_bounds flag set here also + # longitude must in the range -180 to 180 if not (-180 <= lon <= 180): r["geopoint"] = None r["flag_geopoint_bounds"] = True @@ -801,7 +814,7 @@ def collect_common_names(t, d): if dcn is not None: cns.append(dcn) - for vn in vns: + for _ in vns: if d.get("dwc:vernacularname") is not None: cns.append(d.get("dwc:vernacularname")) @@ -812,7 +825,7 @@ def collect_common_names(t, d): return {} -genbank_ids = re.compile("[a-zA-Z]{1,2}\-?_?\d{5,6}") +genbank_ids = re.compile(r"[a-zA-Z]{1,2}\-?_?\d{5,6}") def collect_genbank_sequences(t, d): if t == "records": @@ -831,70 +844,63 @@ def collect_genbank_sequences(t, d): def fixBOR(t, r): - if filled("basisofrecord", r): - if "preserved" in r["basisofrecord"]: - r["basisofrecord"] = "preservedspecimen" - elif "fossil" in r["basisofrecord"]: - r["basisofrecord"] = "fossilspecimen" - elif "living" in r["basisofrecord"]: - r["basisofrecord"] = "livingspecimen" - elif "specimen" in r["basisofrecord"]: - r["basisofrecord"] = "preservedspecimen" - elif "machine" in r["basisofrecord"] and "observation" in r["basisofrecord"]: - r["basisofrecord"] = "machineobservation" - elif "observation" in r["basisofrecord"]: - r["basisofrecord"] = "humanobservation" + """ + basisOfRecord - https://dwc.tdwg.org/list/#dwc_basisOfRecord + Recommended best practice is to use the standard label of one of the Darwin Core classes. + Examples: PreservedSpecimen, FossilSpecimen, LivingSpecimen, MaterialSample, Event, HumanObservation, + MachineObservation, Taxon, Occurrence, MaterialCitation + + This function just performs basic check to see if values supplied are likely in the controlled + vocabulary. For example, we would not allow 'Exsiccati' or 'FieldBook' 'Plants of Colorado' just to + name a few. + + These comparisons using lowercased version seem to work, even though supplied values generally + match the class name in the standard. e.g. To find PreservedSpecimen we look for "preserved". + """ + if t == "records": + if filled("basisofrecord", r): + if "preserved" in r["basisofrecord"]: + r["basisofrecord"] = "preservedspecimen" + elif "fossil" in r["basisofrecord"]: + r["basisofrecord"] = "fossilspecimen" + elif "living" in r["basisofrecord"]: + r["basisofrecord"] = "livingspecimen" + elif "material" in r["basisofrecord"]: + r["basisofrecord"] = "materialsample" + elif "specimen" in r["basisofrecord"]: + r["basisofrecord"] = "preservedspecimen" + elif "machine" in r["basisofrecord"] and "observation" in r["basisofrecord"]: + r["basisofrecord"] = "machineobservation" + elif "observation" in r["basisofrecord"]: + r["basisofrecord"] = "humanobservation" + elif "occurrence" in r["basisofrecord"]: + r["basisofrecord"] = "occurrence" + else: + r["basisofrecord"] = None + r["flag_dwc_basisofrecord_removed"] = True + r["flag_dwc_basisofrecord_invalid"] = True else: - r["basisofrecord"] = None - r["flag_dwc_basisofrecord_removed"] = True r["flag_dwc_basisofrecord_invalid"] = True - # Disable based on feedback from John W. and Joanna - # if r["basisofrecord"] == "preservedspecimen": - # paleo_terms = [ - # "bed", - # "group", - # "member", - # "formation", - # "lowestbiostratigraphiczone", - # "lithostratigraphicterms", - # "earliestperiodorlowestsystem", - # "earliesteraorlowesterathem", - # "earliestepochorlowestseries", - # "earliestageorloweststage", - # "latesteraorhighesterathem", - # "latestepochorhighestseries", - # "latestageorhigheststage", - # "latestperiodorhighestsystem", - # ] - - # for f in paleo_terms: - # if filled(f,r): - # r["flag_dwc_basisofrecord_paleo_conflict"] = True - # r["flag_dwc_basisofrecord_replaced"] = True - # r["basisofrecord"] = "fossilspecimen" - # break - else: - r["flag_dwc_basisofrecord_invalid"] = True - def fix_taxon_rank(t, r): - if filled("taxonrank", r): - if r["taxonrank"] in taxon_rank.mapping: - if taxon_rank.mapping[r["taxonrank"]] is None: + if t == "records": + if filled("taxonrank", r): + if r["taxonrank"] in taxon_rank.mapping: + if taxon_rank.mapping[r["taxonrank"]] is None: + r["taxonrank"] = None + r["flag_dwc_taxonrank_removed"] = True + r["flag_dwc_taxonrank_invalid"] = True + elif r["taxonrank"] != taxon_rank.mapping[r["taxonrank"]]: + r["taxonrank"] = taxon_rank.mapping[r["taxonrank"]] + r["flag_dwc_taxonrank_replaced"] = True + else: + pass # Taxon Rank is in the mapping as an identity. + elif r["taxonrank"] not in taxon_rank.acceptable: r["taxonrank"] = None r["flag_dwc_taxonrank_removed"] = True r["flag_dwc_taxonrank_invalid"] = True - elif r["taxonrank"] != taxon_rank.mapping[r["taxonrank"]]: - r["taxonrank"] = taxon_rank.mapping[r["taxonrank"]] - r["flag_dwc_taxonrank_replaced"] = True else: - pass # Taxon Rank is in the mapping as an identity. - elif r["taxonrank"] not in taxon_rank.acceptable: - r["taxonrank"] = None - r["flag_dwc_taxonrank_removed"] = True - r["flag_dwc_taxonrank_invalid"] = True - else: - pass # Taxon Rank is Acceptable, but not mapped + pass # Taxon Rank is Acceptable, but not mapped # Step, count, ms, ms/count action # rc 1000 354.179 0.354179 record corrector @@ -928,6 +934,7 @@ def grabAll(t, d): r.update(collect_genbank_sequences(t,d)) # Done with non-dependant fields. + gs_sn_crossfill(t, r) fixBOR(t, r) fix_taxon_rank(t, r) @@ -936,15 +943,14 @@ def grabAll(t, d): # r.update(geoshape_fill(t, d, r)) r["flags"] = setFlags(r) - for k in r.keys(): + for k in list(r): if k.startswith("flag_"): r["flags"].append("_".join(k.split("_")[1:])) del r[k] - for k in d.keys(): + for k in list(d): if k.startswith("flag_"): r["flags"].append("_".join(k.split("_")[1:])) r["dqs"] = score(t, r) - return r @@ -991,7 +997,7 @@ def dt_serial(obj): continue break - print "records ready" + print ("records ready") interations = 1 @@ -1009,7 +1015,7 @@ def dt_serial(obj): total_time += (t2 - t1).total_seconds() count += 1 - print count, total_time, total_time / count + print (count, total_time, total_time / count) # t = sys.argv[1] # u = sys.argv[2] diff --git a/idb/helpers/cors.py b/idb/helpers/cors.py index 3d79fb45..5b6db26e 100644 --- a/idb/helpers/cors.py +++ b/idb/helpers/cors.py @@ -9,9 +9,9 @@ def crossdomain(origin=None, methods=None, headers=None, automatic_options=True): if methods is not None: methods = ', '.join(sorted(x.upper() for x in methods)) - if headers is not None and not isinstance(headers, basestring): + if headers is not None and not isinstance(headers, str): headers = ', '.join(x.upper() for x in headers) - if not isinstance(origin, basestring): + if not isinstance(origin, str): origin = ', '.join(origin) if isinstance(max_age, timedelta): max_age = max_age.total_seconds() diff --git a/idb/helpers/etags.py b/idb/helpers/etags.py index 4ab7228b..2a0c9a93 100644 --- a/idb/helpers/etags.py +++ b/idb/helpers/etags.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import +from __future__ import absolute_import, print_function import hashlib import json @@ -52,12 +52,12 @@ def objectHasher(hash_type, data, sort_arrays=False, sort_keys=True): sa.sort() s = "".join(sa) - elif isinstance(data, str) or isinstance(data, unicode): + elif isinstance(data, str) or isinstance(data, str): s = data elif isinstance(data, int) or isinstance(data, float): s = str(data) elif isinstance(data, dict): - ks = data.keys() + ks = list(data.keys()) if sort_keys: ks.sort() @@ -69,8 +69,7 @@ def objectHasher(hash_type, data, sort_arrays=False, sort_keys=True): elif data is None: pass else: - print type(data) + print(type(data)) - # print s h.update(s.encode("utf8")) return h.hexdigest() diff --git a/idb/helpers/fieldnames.py b/idb/helpers/fieldnames.py index c40ca749..31e57662 100644 --- a/idb/helpers/fieldnames.py +++ b/idb/helpers/fieldnames.py @@ -4,7 +4,9 @@ from collections import defaultdict ''' -The namespaces are ... +Namespaces differentiate the sources of terms / definitions. +When we encounter a new term from a new namespace, the namespace should be +added here. ''' namespaces = { @@ -18,6 +20,7 @@ "http://iptc.org/std/Iptc4xmpExt/2008-02-29/": "Iptc4xmpExt", "http://portal.idigbio.org/terms/": "idigbio", "http://symbiota.org/terms/": "symbiota", + "https://symbiota.org/terms/": "symbiota", "http://portal.idigbio.org/terms/inhs/": "inhs", "http://www.w3.org/2003/01/geo/wgs84_pos#": "wgs84_pos", "http://rs.gbif.org/terms/1.0/": "gbif", @@ -27,7 +30,13 @@ "http://ns.adobe.com/exif/1.0/": "exif", "http://purl.org/NET/aec/NET/aec/": "aec", "http://purl.org/NET/aec/": "aec", - "http://zooarchnet.org/dwc/terms/": "zan" + "http://zooarchnet.org/dwc/terms/": "zan", + "http://rs.ala.org.au/terms/1.0/": "ala", + "http://rs.tdwg.org/abcd/terms/": "abcd", + "http://hiscom.chah.org.au/hispid/terms/": "hispid", + "http://data.ggbn.org/schemas/ggbn/terms/": "ggbn", + "http://rs.iobis.org/obis/terms/": "obis", + "http://rs.tdwg.org/chrono/terms/": "chrono" } namespaces_rev = {v:k for k, v in namespaces.items()} @@ -39,10 +48,13 @@ namespaces_rev["Iptc4xmpExt"] = "http://iptc.org/std/Iptc4xmpExt/2008-02-29/" ''' -types map the namespace URI to a Compact URI / CURIE +This "types" data structure holds all of the known Extensions. +The namespace URI is mapped to a Compact URI / CURIE. +All extensions used in any darwin core archive that we process must exist here. ''' types = { "http://purl.org/NET/aec/associatedTaxa": {"shortname": "aec:associatedTaxa"}, + "http://rs.iobis.org/obis/terms/ExtendedMeasurementOrFact": {"shortname": "obis:ExtendedMeasurementOrFact"}, "http://rs.gbif.org/terms/1.0/Identifier": {"shortname": "gbif:Identifier"}, "http://rs.gbif.org/terms/1.0/Image": { "shortname": "dwc:Multimedia"}, "http://rs.gbif.org/terms/1.0/Multimedia": { "shortname": "dwc:Multimedia"}, @@ -63,7 +75,8 @@ } ''' -The translate_dict is used to... +The translate_dict is used by get_canonical_name() to map "similar" field names to the canonical +name for the field. ''' translate_dict = { "ac:accessURI": ["ac:accessURI", "dwc:Multimedia"], diff --git a/idb/helpers/logging.py b/idb/helpers/logging.py index 02ad19dd..55fdd538 100644 --- a/idb/helpers/logging.py +++ b/idb/helpers/logging.py @@ -27,7 +27,7 @@ LOGBOOK_FORMAT_STRING = u'{record.time:%Y-%m-%d %H:%M:%S.%f} {record.level_name:<5.5} ' \ u'{record.channel}\u10fb {record.message}' -#: Libaries used whos logs should be at a higher level. +#: Libaries used whose logs should be at a higher level. LIBRARY_LOGGERS = ('boto', 'requests', 'urllib3', 'elasticsearch', 'shapely', 'gipc') diff --git a/idb/helpers/memoize.py b/idb/helpers/memoize.py index 8787f95c..2f110c48 100644 --- a/idb/helpers/memoize.py +++ b/idb/helpers/memoize.py @@ -2,7 +2,7 @@ from __future__ import print_function from functools import wraps -import cPickle +import pickle from idb.helpers.logging import getLogger from atomicfile import AtomicFile @@ -54,15 +54,15 @@ def memo(*args, **kwargs): return memo -def _memoize_nargs_cPickle(fn): +def _memoize_nargs_pickle(fn): "A memoizer for function w/ arbitrary length arguments." memory = {} - import cPickle + import pickle @wraps(fn) def memo(*args, **kwargs): - key = (cPickle.dumps(args, cPickle.HIGHEST_PROTOCOL), - cPickle.dumps(kwargs, cPickle.HIGHEST_PROTOCOL)) + key = (pickle.dumps(args, pickle.HIGHEST_PROTOCOL), + pickle.dumps(kwargs, pickle.HIGHEST_PROTOCOL)) try: v = memory[key] except KeyError: @@ -72,20 +72,20 @@ def memo(*args, **kwargs): return memo -def memoized(unhashable="cPickle"): +def memoized(unhashable="pickle"): "Decorator to memoize a function." def getfn(fn): - if fn.func_code.co_argcount == 0: + if fn.__code__.co_argcount == 0: memo = _memoize_0args(fn) elif unhashable == "call": memo = _memoize_nargs_callthru(fn) - elif unhashable == "cPickle": - memo = _memoize_nargs_cPickle(fn) + elif unhashable == "pickle": + memo = _memoize_nargs_pickle(fn) elif unhashable == "error": memo = _memoize_nargs_error(fn) else: raise ValueError( - "Uknown unhashable memoization strategy, expected {call, cPickle, error}") + "Uknown unhashable memoization strategy, expected {call, pickle, error}") if memo.__doc__: memo.__doc__ = memo.__doc__ + "\n\nThis function is memoized." else: @@ -101,7 +101,7 @@ def filecached(filename, writeback=True): def writecache(value): logger.debug("Writing cache to %r", filename) with AtomicFile(filename, 'wb') as f: - cPickle.dump(value, f) + pickle.dump(value, f) def getfn(fn): @wraps(fn) @@ -109,7 +109,7 @@ def thunk(*args, **kwargs): val = None try: with open(filename, 'rb') as f: - val = cPickle.load(f) + val = pickle.load(f) logger.debug("read cache from %r", filename) except (IOError, EOFError): val = fn(*args, **kwargs) diff --git a/idb/helpers/rg.py b/idb/helpers/rg.py index 0f6a72e4..f736e5f8 100644 --- a/idb/helpers/rg.py +++ b/idb/helpers/rg.py @@ -9,7 +9,7 @@ from .memoize import memoized -pattern = re.compile('[\W_]+') +pattern = re.compile(r'[\W_]+') class ReverseGeocoder(object): diff --git a/idb/helpers/storage.py b/idb/helpers/storage.py index ea1f25e7..32b4a351 100644 --- a/idb/helpers/storage.py +++ b/idb/helpers/storage.py @@ -3,7 +3,7 @@ """ from __future__ import division, absolute_import, print_function -import cStringIO +from io import BytesIO import math import os import time @@ -102,7 +102,7 @@ def upload(self, key, fobj, content_type=None, public=None, md5=None, multipart= pass elif hasattr(fobj, 'open'): fobj = fobj.open('rb') - elif isinstance(fobj, basestring): + elif isinstance(fobj, str): fobj = open(fobj, 'rb') elif not all(hasattr(fobj, a) for a in ('seek', 'tell', 'read')): raise ValueError("Unknown fobj type:", fobj) @@ -194,8 +194,8 @@ def get_contents_to_filename(key, filename, md5=None): @staticmethod def get_contents_to_mem(key, md5=None): - "Wraps ``key.get_contents_to_file fetching into a StringIO buffer``" - buff = cStringIO.StringIO() + "Wraps ``key.get_contents_to_file fetching into a BytesIO buffer``" + buff = BytesIO() IDigBioStorage.get_contents_to_file(key, buff, md5=md5) buff.seek(0) return buff @@ -203,7 +203,7 @@ def get_contents_to_mem(key, md5=None): @staticmethod def get_contents_to_file(key, fp, md5=None): key.get_contents_to_file(fp) - if md5 and key.md5 != md5: + if md5 is not None and key.md5.decode('utf-8') != md5: raise S3DataError( 'MD5 of downloaded did not match given MD5: ' '%s vs. %s' % (key.md5, md5)) diff --git a/idb/indexing/__init__.py b/idb/indexing/__init__.py index 0eb059f8..b128fea9 100644 --- a/idb/indexing/__init__.py +++ b/idb/indexing/__init__.py @@ -75,6 +75,9 @@ def cli(ctx, index, corrections, types, indexname): @click.pass_obj @fnlogged def continuous(params): + """ + Do not use, probably does not work. + """ from .index_from_postgres import continuous_incremental for k in params: params[k] = params[k]() @@ -85,13 +88,16 @@ def continuous(params): @click.pass_obj @fnlogged def incremental(params): + """ + Do not use, probably does not work. + """ from .index_from_postgres import incremental for k in params: params[k] = params[k]() incremental(**params) -@cli.command(help="Index data matching ES query") +@cli.command(help="Index data matching an ES query") @click.argument('query') @click.pass_obj @fnlogged @@ -134,6 +140,9 @@ def uuids(params, children, uuid): @click.pass_obj @fnlogged def resume(params): + """ + Does this work? Might be nice if it does. + """ from .index_from_postgres import resume for k in params: params[k] = params[k]() @@ -144,6 +153,9 @@ def resume(params): @click.pass_obj @fnlogged def full(params): + """ + This builds a new full index. + """ from .index_from_postgres import full for k in params: params[k] = params[k]() @@ -154,6 +166,9 @@ def full(params): @click.pass_obj @fnlogged def delete(params): + """ + This might not work. + """ from .index_from_postgres import delete for k in params: params[k] = params[k]() @@ -164,7 +179,24 @@ def delete(params): @click.pass_obj @fnlogged def check(params): + """ + This is the standard index run for the ingestion process on an existing index. + """ from .index_from_postgres import resume for k in params: params[k] = params[k]() resume(also_delete=True, **params) + + +@cli.command(help="PUT mappings only and then exit") +@click.pass_obj +@fnlogged +def mappings(params): + """ + We currently put the ES mappings whenever we initialize the connection to Elasticsearch. + This option will not attempt any actual indexing but will put the mappings into the index. + """ + for k in params: + params[k] = params[k]() + from .index_from_postgres import mappings_only + mappings_only(**params) diff --git a/idb/indexing/index_from_postgres.py b/idb/indexing/index_from_postgres.py index eb75b6fb..59012e7f 100644 --- a/idb/indexing/index_from_postgres.py +++ b/idb/indexing/index_from_postgres.py @@ -265,35 +265,29 @@ def resume(ei, rc, also_delete=False, no_index=False): # Create a partial application to add in the keyword argument f = functools.partial(type_yield_resume, also_delete=also_delete) consume(ei, rc, f, no_index=no_index) - + ei.optimize() def full(ei, rc, no_index=False): logger.info("Begin 'full' indexing...") consume(ei, rc, type_yield, no_index=no_index) - + ei.optimize() def incremental(ei, rc, no_index=False): consume(ei, rc, type_yield_modified, no_index=no_index) - try: - ei.optimize() - except: - pass + ei.optimize() def query(ei, rc, query, no_index=False): f = functools.partial(queryIter, query) consume(ei, rc, f, no_index=no_index) - try: - ei.optimize() - except: - pass + ei.optimize() def uuids(ei, rc, uuid_l, no_index=False, children=False): f = functools.partial(uuidsIter, uuid_l, children=children) consume(ei, rc, f, no_index=no_index) - try: - ei.optimize() - except: - pass + ei.optimize() + +def mappings_only(ei): + ei.optimze() def consume(ei, rc, iter_func, no_index=False): for typ in ei.types: @@ -309,9 +303,11 @@ def consume(ei, rc, iter_func, no_index=False): pass else: for ok, item in ei.bulk_index(index_record_tuples): - pass - gc.collect() - + if not ok: + logger.warning('Failed during bulk index index: {0} '.format(item)) + # We should never need to call gc manually. Can we drop this? Especially + # since we no longer ever use continuous mode. + gc.collect() def continuous_incremental(ei, rc, no_index=False): while True: diff --git a/idb/indexing/index_helper.py b/idb/indexing/index_helper.py index f8cf1eaa..2f1760ca 100644 --- a/idb/indexing/index_helper.py +++ b/idb/indexing/index_helper.py @@ -12,6 +12,11 @@ # PYTHON3_WARNING from urlparse import urlparse + +# A problematic field name is "http://rs.iobis.org/obis/terms/measurementTypeID" inside +# the "obis:ExtendedMeasurementOrFact". +UNINDEXABLE_OBJECTS = ["obis:ExtendedMeasurementOrFact", "chrono:ChronometricAge"] + def index_record(ei, rc, typ, r, do_index=True): """ Index a single database record. @@ -37,7 +42,7 @@ def index_record(ei, rc, typ, r, do_index=True): i["records"] = sibs.get('record', []) return (typ, i) else: - d, ck = rc.correct_record(r["data"]) + d, _ = rc.correct_record(r["data"]) d.update({ "idigbio:uuid": r["uuid"], @@ -51,8 +56,8 @@ def index_record(ei, rc, typ, r, do_index=True): g = grabAll(typ, d) i = prepForEs(typ, g) - # Remove fieldnames with dots in them - # to fix an issue converting to ES 2.3+ + # Fixup problematic field names due to limitations of Elasticsearch. + # For example, dots in fieldnames. for k in r["data"]: if "." in k: if k in types: @@ -67,11 +72,18 @@ def index_record(ei, rc, typ, r, do_index=True): suffix = urldata.path.split("/")[-1] r["data"][prefix + ":" + suffix] = r["data"][k] d["flag_data_" + prefix + "_" + suffix + "_munge"] = True + if k in UNINDEXABLE_OBJECTS: + # inventing a new flag for each field we are truncating + new_flag = "_".join(["flag", "idigbio", k.replace(":","_").lower(), "truncated"]) + d[new_flag] = True + # truncate the troublesome object to prevent Elasticsearch mapper_parsing_exception + d[k] = {} + r["data"][k] = {} i["data"] = r["data"] i["indexData"] = d - if config.IDB_EXTRA_SERIOUS_DEBUG == 'yes': # dummy comment because github + if config.IDB_EXTRA_SERIOUS_DEBUG == 'yes': logger.debug("Index record: %s with approx. %s bytes of data.", i["uuid"], len(repr(i))) logger.debug("Data: %s", repr(i)) diff --git a/idb/indexing/indexer.py b/idb/indexing/indexer.py index 4f786f92..f26cc579 100644 --- a/idb/indexing/indexer.py +++ b/idb/indexing/indexer.py @@ -110,25 +110,31 @@ def __init__(self, indexName, types, # on a local machine. Use single node es config. if config.ENV == 'dev': self.INDEX_CREATE_SETTINGS = { - "settings" : { - "index" : { - "number_of_shards" : 1, - "number_of_replicas" : 0 + "settings": { + "index": { + "number_of_shards": 1, + "number_of_replicas": 0 } } } else: + # Number of index shards is set to the real config value here, but for + # performance reasons immediately after creating a new empty index + # (where presumably the next step is to do bulk index operations), + # set a few additional index settings suitable for bulk indexing. + # We later set these to the appropriate config values after indexing completion. self.INDEX_CREATE_SETTINGS = { - "settings" : { - "index" : { - "number_of_shards" : config.ES_INDEX_NUMBER_OF_SHARDS, - "number_of_replicas" : config.ES_INDEX_NUMBER_OF_REPLICAS + "settings": { + "index": { + "number_of_shards": config.ES_INDEX_NUMBER_OF_SHARDS, + "number_of_replicas": 0, + "refresh_interval": "-1" } } } - # Create index only if: - # 1. it does not exist, and + # Create index only when: + # 1. it does not already exist, and: # 2. we have the environment variable set to permit index creation. self.ALLOW_INDEX_CREATION = True if config.ES_ALLOW_INDEX_CREATION == "yes" else False if not self.ALLOW_INDEX_CREATION and not self.es.indices.exists(index=self.indexName): @@ -137,6 +143,7 @@ def __init__(self, indexName, types, if self.ALLOW_INDEX_CREATION and not self.es.indices.exists(index=self.indexName): logger.info("Creating index: '%s'", self.indexName) self.__create_index() + logger.info("Index prepared for bulk operations.") if self.es.indices.exists(index=self.indexName): logger.info("Found index '%s'", self.indexName) @@ -161,7 +168,7 @@ def __init__(self, indexName, types, def __create_index(self): """ - Create an index with appropriate shard count and replicas for the cluster. + Create an index with appropriate shard count for the cluster. """ # create(index, body=None, params=None, headers=None) res = self.es.indices.create(index=self.indexName, body=self.INDEX_CREATE_SETTINGS) @@ -238,21 +245,26 @@ def index(self, t, i): def optimize(self): """ - Do Nothing. - - Previously ran the es optimize command with the proper number of segments. - - What the heck are the proper number of segments? + Previously ran the es optimize command with some number of segments. This never returned properly. In later version of Elasticsearch, optimize has been replaced with the "merge" API. We can bring this back if it serves a useful purpose. - TODO: max_num_segments probably needs to be more configurable + We co-opt this function to reset indexing settings to appropriate + service values (as opposed to bulk indexing values). """ - logger.info("Running index optimization on %r", self.indexName) - logger.info("Skipping index optimization / index merge.") + logger.info("Skipping forced index optimization / index merge.") + + logger.info("Putting index settings...") + self.es.indices.put_settings(index=self.indexName, body={ + "index": { + "refresh_interval": config.ES_INDEX_REFRESH_INTERVAL, + "number_of_replicas": config.ES_INDEX_NUMBER_OF_REPLICAS + } + }) + # TODO: max_num_segments needs to be in config if we resurrect this. # self.es.indices.optimize(index=self.indexName, max_num_segments=5) def bulk_formater(self, tups): @@ -293,20 +305,20 @@ def bulk_index(self, tups): Needs more info here. """ return elasticsearch.helpers.streaming_bulk( - self.es, self.bulk_formater(tups), chunk_size=config.ES_INDEX_CHUNK_SIZE, max_chunk_bytes=1048576) + self.es, + self.bulk_formater(tups), + chunk_size=config.ES_INDEX_CHUNK_SIZE, + max_chunk_bytes=1048576, + raise_on_error=False, + raise_on_exception=False) def close(self): """ Finishes index processing. """ - # This will allow newly-indexed documents to appear. - if self.disableRefresh: - self.es.indices.put_settings(index=self.indexName, body={ - "index": { - "refresh_interval": "1s" - } - }) self.optimize() + logger.info("Finished index operations on %r", self.indexName) + def query_for_one(self, uuid, doc_type, source=False): """ diff --git a/idb/postgres_backend/db.py b/idb/postgres_backend/db.py index 72e2959c..4753f41c 100644 --- a/idb/postgres_backend/db.py +++ b/idb/postgres_backend/db.py @@ -7,7 +7,7 @@ import itertools from datetime import datetime -from cStringIO import StringIO +from io import StringIO from psycopg2.extras import DictCursor, NamedTupleCursor from psycopg2.extensions import cursor @@ -77,7 +77,7 @@ class PostgresDB(object): """ + \ __join_uuids_etags_latest_version + \ __join_uuids_identifiers + \ - __join_uuids_siblings + __join_uuids_siblings __columns_master_query = """ SELECT uuids.id as uuid, @@ -588,7 +588,7 @@ class MediaObject(object): ) def __init__(self, *args, **kwargs): - for s, a in itertools.izip_longest(self.__slots__, args): + for s, a in itertools.zip_longest(self.__slots__, args): setattr(self, s, a) for kw in kwargs.items(): setattr(self, *kw) diff --git a/idb/stats/collect.py b/idb/stats/collect.py index e167e159..eb2ac1ee 100644 --- a/idb/stats/collect.py +++ b/idb/stats/collect.py @@ -113,11 +113,23 @@ def collect_stats(collect_datetime, es=None): recordset_stats = defaultdict(new_stats_dict) - # print date_min, date_max + sql = """SELECT * FROM stats LEFT JOIN queries on stats.query_id=queries.id WHERE date > %s AND date < %s """ + logger.debug("min is %s, max is %s, query is: %s" % (date_min, date_max, sql)) + + filename = "telem-output-structures-%s.log" % (datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) + tracefilename = "trace-log-%s.log" % (datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) + + # collects the raw objects we're sending to ES + output_fh = open(filename, 'w') + + trace_fh = open(tracefilename, 'w') + + trace_fh.write("doingquery and looping through results...") + for r in statsdbpool.fetchiter(sql, (date_min, date_max), cursor_factory=DictCursor): record_type = r["record_type"] stats_type = r["type"] @@ -177,8 +189,18 @@ def collect_stats(collect_datetime, es=None): "geo": json.loads(k), "count": recordset_stats[recordset_key][record_type][stat_type]["geocodes"][k] }) +<<<<<<< HEAD es.index(index=indexName, doc_type=typeName, body=recordset_data) +======= + trace_fh.write("writing recordset_data to ES: \n") + output_fh.write(json.dumps(recordset_data)) + trace_fh.write(json.dumps(recordset_data)) + + es.index(index=indexName, doc_type=typeName, body=recordset_data) + + logger.info("end of script") +>>>>>>> d5e4775 ([skip travis-ci] re-enable the push of stats into elastic by default) def api_stats(es=None): diff --git a/idb/stats/stats-backup.py b/idb/stats/stats-backup.py index 2a5c46e6..ab8d5b6b 100644 --- a/idb/stats/stats-backup.py +++ b/idb/stats/stats-backup.py @@ -72,7 +72,7 @@ "scroll": "5m", "query": q_body } - print t + print (t) count = 0 skip = 0 for r in elasticsearch.helpers.scan(es,**q): @@ -97,5 +97,5 @@ z.writestr(fn,json.dumps(r["_source"])) if count % 10000 == 0: - print count,skip - print count,skip \ No newline at end of file + print (count,skip) + print (count,skip) \ No newline at end of file diff --git a/idb/stats/stats_rewriter.py b/idb/stats/stats_rewriter.py index e7ff36f2..5a4e502b 100644 --- a/idb/stats/stats_rewriter.py +++ b/idb/stats/stats_rewriter.py @@ -57,7 +57,7 @@ def resume_reindex(client, source_index, target_index, query=None, target_client size=5000 ): target_docs.add(h['_id']) - logger.info("Skip list build: {} docs".format(len(target_docs))) + logger.info("Skip list build: {} docs".format(len(target_docs))) base_num = 0 end_num = 48 @@ -121,13 +121,13 @@ def resume_reindex(client, source_index, target_index, query=None, target_client if h["_id"] in target_docs: stats["skip"] += 1 else: - print h - target_client.index(index=target_index,doc_type=h["_type"],body=h["_source"]) + print (h) + target_client.index(index=target_index,doc_type=h["_type"],body=h["_source"]) stats["done"] += 1 target_docs.add(h["_id"]) if stats["docs"] % 10000 == 0: - print stats.most_common() + print (stats.most_common()) logger.info(stats.most_common()) @@ -330,12 +330,12 @@ def resume_reindex(client, source_index, target_index, query=None, target_client # m = es.indices.get_mapping(index=source_index,doc_type="api,digest,fields,search") # m[source_index]["mappings"]["api"]["properties"]["recordset_id"] ={ -# "type": "string", +# "type": "string", # "analyzer": "keyword" # } # m[source_index]["mappings"]["digest"]["properties"]["recordset_id"] ={ -# "type": "string", +# "type": "string", # "analyzer": "keyword" # } @@ -374,12 +374,12 @@ def resume_reindex(client, source_index, target_index, query=None, target_client # del dk[t]["properties"][k] # m[source_index]["mappings"]["api"]["properties"]["recordset_id"] ={ -# "type": "string", +# "type": "string", # "analyzer": "keyword" # } # m[source_index]["mappings"]["digest"]["properties"]["recordset_id"] ={ -# "type": "string", +# "type": "string", # "analyzer": "keyword" # } @@ -398,7 +398,7 @@ def resume_reindex(client, source_index, target_index, query=None, target_client # data["keys"][t][re_map[k]] = data["keys"][t][k] # else: # data["keys"][t][re_map[k]] += data["keys"][t][k] -# del data["keys"][t][k] +# del data["keys"][t][k] # return (action, data) recordsets = [ diff --git a/idigbio_ingestion/cli.py b/idigbio_ingestion/cli.py index 48002d12..c5d056a0 100644 --- a/idigbio_ingestion/cli.py +++ b/idigbio_ingestion/cli.py @@ -1,5 +1,5 @@ -from __future__ import division, absolute_import -from __future__ import print_function + + import click import json @@ -10,7 +10,7 @@ from .mediaing import cli as mcli # noqa ignore=F401 @cli.command(name="update-publisher-recordset", - help="") + help="Scan publishers RSS feeds, download new artifacts, and update database") @fnlogged def update_publisher_recordset(): from idigbio_ingestion.update_publisher_recordset import main @@ -33,7 +33,7 @@ def manual_update_recordset_from_file(rsid, file): @click.argument("rsid", type=click.UUID) @fnlogged def db_check(rsid): - rsid = u'{0}'.format(rsid) + rsid = '{0}'.format(rsid) from idigbio_ingestion.db_check import main main(rsid, ) @@ -75,7 +75,7 @@ def db_check_all(since): @click.argument("rsid", type=click.UUID) @fnlogged def ingest(rsid): - rsid = u'{0}'.format(rsid) + rsid = '{0}'.format(rsid) from idigbio_ingestion.db_check import main main(rsid, ingest=True) diff --git a/idigbio_ingestion/db_check.py b/idigbio_ingestion/db_check.py index ed7f93d8..d83fd6f6 100644 --- a/idigbio_ingestion/db_check.py +++ b/idigbio_ingestion/db_check.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import, print_function + import datetime import functools import json @@ -30,7 +30,7 @@ from idigbio_ingestion.lib.delimited import DelimitedFile -bad_chars = u"\ufeff" +bad_chars = "\ufeff" bad_char_re = re.compile("[%s]" % re.escape(bad_chars)) logger = idblogger.getChild("db-check") @@ -276,7 +276,7 @@ def process_subfile(rf, rsid, rs_uuid_etag, rs_id_uuid, ingest=False, db=None): u, parent, deleted = db.get_uuid([i for _,_,i in idents]) if parent is not None: if parent != rsid: - if config.IDB_EXTRA_SERIOUS_DEBUG == 'yes': + if config.IDB_EXTRA_SERIOUS_DEBUG == 'yes': rlogger.debug("******") rlogger.debug("u: {0}".format(u)) rlogger.debug("parent: {0}".format(parent)) @@ -301,11 +301,11 @@ def process_subfile(rf, rsid, rs_uuid_etag, rs_id_uuid, ingest=False, db=None): else: if config.IDB_EXTRA_SERIOUS_DEBUG == 'yes': rlogger.debug("Setting sibling for '{0}'".format(u)) - db.set_record(u, typ[:-1], rsid, r, ids_to_add.keys(), siblings) + db.set_record(u, typ[:-1], rsid, r, [*list(ids_to_add.keys())], siblings) ingestions += 1 elif ingest and deleted: db.undelete_item(u) - db.set_record(u, typ[:-1], rsid, r, ids_to_add.keys(), siblings) + db.set_record(u, typ[:-1], rsid, r, list(ids_to_add.keys()), siblings) resurrections += 1 @@ -359,7 +359,7 @@ def process_subfile(rf, rsid, rs_uuid_etag, rs_id_uuid, ingest=False, db=None): db_uuid = db_r["uuid"] if db_uuid is None: - # We probably need to do something other than raise this RecordException for this since + # We probably need to do something other than raise this RecordException for this since # ac:associatedSpecimenReference is not required to be in *this* file / system. # Can we find a different identifier? raise RecordException("Record (idents: [{0}]) contains ac:associatedSpecimenReference '{1}' that does not relate to an existing identifier.".format(ref_uuid, idents)) @@ -392,8 +392,8 @@ def process_subfile(rf, rsid, rs_uuid_etag, rs_id_uuid, ingest=False, db=None): seen_ids.update(ids_to_add) seen_uuids.update(uuids_to_add) - eu_set = existing_etags.viewkeys() - nu_set = seen_uuids.viewkeys() + eu_set = set(existing_etags.keys()) + nu_set = set(seen_uuids.keys()) deletes = len(eu_set - nu_set) @@ -515,7 +515,7 @@ def process_file(fname, mime, rsid, existing_etags, existing_ids, ingest=False, def save_summary_json(rsid, counts): - with AtomicFile(rsid + ".summary.json", "wb") as sumf: + with AtomicFile(rsid + ".summary.json", "w") as sumf: json.dump(counts, sumf, indent=2) @@ -542,16 +542,16 @@ def metadataToSummaryJSON(rsid, metadata, writeFile=True, doStats=True): if metadata["filemd5"] is None: summary["datafile_ok"] = False if writeFile: - with AtomicFile(rsid + ".summary.json", "wb") as jf: + with AtomicFile(rsid + ".summary.json", "w") as jf: json.dump(summary, jf, indent=2) return summary - + csv_line_count = 0 no_recordid_count = 0 duplicate_record_count = 0 duplicate_id_count = 0 - for t in metadata["counts"].values(): + for t in list(metadata["counts"].values()): csv_line_count += t["total_line_count"] no_recordid_count += t["no_recordid_count"] duplicate_record_count += t["duplicate_record_count"] @@ -569,16 +569,17 @@ def metadataToSummaryJSON(rsid, metadata, writeFile=True, doStats=True): summary["duplicate_occurence_count"] = duplicate_record_count summary["dublicate_occurence_ids"] = duplicate_id_count - if doStats: - stats.index(doc_type='digest', body=summary) - if writeFile: - with AtomicFile(rsid + ".summary.json", "wb") as jf: + with AtomicFile(rsid + ".summary.json", "w") as jf: json.dump(summary, jf, indent=2) - with AtomicFile(rsid + ".metadata.json", "wb") as jf: + with AtomicFile(rsid + ".metadata.json", "w") as jf: json.dump(metadata, jf, indent=2) - else: - return summary + jf.write(os.linesep) + + if doStats: + stats.index(doc_type='digest', body=summary) + + return summary def main(rsid, ingest=False): @@ -595,7 +596,7 @@ def main(rsid, ingest=False): try: name, mime = get_file(rsid) except: - rlogger.debug("Exception in get_file") + rlogger.error("Exception in get_file, most likely caused by a storage or database connection issue") # construct a dummy metadata record with no filemd5 so we can later write a summary file. metadata = { "name": rsid, @@ -638,9 +639,9 @@ def main(rsid, ingest=False): else: rlogger.info("Building ids/uuids json") db_u_d, db_i_d = get_db_dicts(rsid) - with AtomicFile(rsid + "_uuids.json", "wb") as uuidf: + with AtomicFile(rsid + "_uuids.json", "w") as uuidf: json.dump(db_u_d, uuidf) - with AtomicFile(rsid + "_ids.json", "wb") as idf: + with AtomicFile(rsid + "_ids.json", "w") as idf: json.dump(db_i_d, idf) commit_force = False @@ -667,7 +668,7 @@ def launch_child(rsid, ingest): # Close any logging filehandlers on root, leave alone any # other stream handlers (e.g. stderr) this way main can set up # its own filehandler to `$RSID.db_check.log` - for fh in filter(lambda h: isinstance(h, logging.FileHandler), logging.root.handlers): + for fh in [h for h in logging.root.handlers if isinstance(h, logging.FileHandler)]: logging.root.removeHandler(fh) fh.close() diff --git a/idigbio_ingestion/db_rsids.py b/idigbio_ingestion/db_rsids.py index ac62beb6..b70639c5 100644 --- a/idigbio_ingestion/db_rsids.py +++ b/idigbio_ingestion/db_rsids.py @@ -38,7 +38,7 @@ def main3(): def main2(): for r in PostgresDB().get_type_list("recordset", limit=None): try: - print r["uuid"] + print((r["uuid"])) except: traceback.print_exc() @@ -48,7 +48,7 @@ def main1(): o = r.json() for rs in o["items"]: - print rs["uuid"] + print((rs["uuid"])) if __name__ == '__main__': main3() diff --git a/idigbio_ingestion/ds_sum_counts.py b/idigbio_ingestion/ds_sum_counts.py index 7c75f1ab..8e563de7 100644 --- a/idigbio_ingestion/ds_sum_counts.py +++ b/idigbio_ingestion/ds_sum_counts.py @@ -1,8 +1,8 @@ """New version of ds_sum_counts that generates both summary and suspects """ -from __future__ import division, absolute_import -from __future__ import print_function + + import json import os @@ -38,16 +38,16 @@ def read_all_files(base): def write_header(fp): - fp.write(u",".join(header)) - fp.write(u"\n") + fp.write(",".join(header)) + fp.write("\n") def write_row(fp, row, k=None): if k is None: k = row['filename'] values = [str(row.get(fld, 0)) for fld in fields] - fp.write(k + u"," + u",".join(values)) - fp.write(u"\n") + fp.write(k + "," + ",".join(values)) + fp.write("\n") def is_row_suspect(row): diff --git a/idigbio_ingestion/lib/delimited.py b/idigbio_ingestion/lib/delimited.py index 981b0611..baca7efa 100644 --- a/idigbio_ingestion/lib/delimited.py +++ b/idigbio_ingestion/lib/delimited.py @@ -32,7 +32,7 @@ def __init__(self, name, lineNumber, lineLength, lineArr): def flag_unicode_error(e): bad_chars = "".join([hex(ord(c)) for c in e.object[e.start:e.end]]) - return (u"DECODEERROR:" + bad_chars, e.end) + return ("DECODEERROR:" + bad_chars, e.end) codecs.register_error("flag_error", flag_unicode_error) @@ -57,7 +57,7 @@ def __init__(self, fh, encoding="utf8", delimiter=",", fieldenc="\"", header=Non self.lineCount = 0 self.lineLength = None - if isinstance(fh, str) or isinstance(fh, unicode): + if isinstance(fh, str): self.name = fh else: self.name = fh.name @@ -80,11 +80,11 @@ def __init__(self, fh, encoding="utf8", delimiter=",", fieldenc="\"", header=Non t = defaultdict(int) if header is not None: self.fields = header - for k, v in header.items(): + for k, v in list(header.items()): cn = get_canonical_name(v) t[cn[1]] += 1 else: - headerline = self._reader.next() + headerline = next(self._reader) self.lineLength = len(headerline) self.fields = {} for k, v in enumerate(headerline): @@ -94,7 +94,7 @@ def __init__(self, fh, encoding="utf8", delimiter=",", fieldenc="\"", header=Non self.fields[k] = cn[0] if self.rowtype is None: - items = t.items() + items = list(t.items()) items.sort(key=lambda item: (item[1], item[0]), reverse=True) self.rowtype = items[0][0] self.logger.info("Setting row type to %s", self.rowtype) @@ -110,13 +110,16 @@ def __iter__(self): """ return self + def __next__(self): + return self.readline() + def close(self): """ Closes the internally maintained filehandle """ self.filehandle.close() - def next(self): + def __next__(self): """ Returns the next line in the record file, used for iteration """ @@ -131,7 +134,7 @@ def readline(self, size=None): try: lineDict = {} # self.filehandle.snap() - lineArr = self._reader.next() + lineArr = next(self._reader) self.lineCount += 1 if self.lineLength is None: @@ -193,6 +196,6 @@ def readlines(self, sizehint=None): Returns all lines in the file. Cheats off readline. """ lines = [] - for line in self: + for _ in self: lines.append(self.readline()) return lines diff --git a/idigbio_ingestion/lib/dwca.py b/idigbio_ingestion/lib/dwca.py index a4926da5..4291e75f 100644 --- a/idigbio_ingestion/lib/dwca.py +++ b/idigbio_ingestion/lib/dwca.py @@ -3,6 +3,8 @@ from collections import deque import traceback import shutil +import requests +from io import BytesIO from idb.helpers.logging import idblogger, getLogger from .delimited import DelimitedFile @@ -10,7 +12,8 @@ from .xmlDictTools import xml2d FNF_ERROR = "File {0} not present in archive." -DWC_SCHEMA_URL = "http://rs.tdwg.org/dwc/text/tdwg_dwc_text.xsd" +DWC_SCHEMA_URL = "https://dwc.tdwg.org/text/tdwg_dwc_text.xsd" + def archiveFile(archive,name): metaname = name @@ -52,10 +55,12 @@ def __init__(self,name="dwca.zip",skipeml=False,logname=None): meta_filename = self.path + "/" + archiveFile(self.archive,"meta.xml") try: schema_parser = etree.XMLParser(no_network=False) - # wut is going on. see https://redmine.idigbio.org/issues/3042 - schema = etree.XMLSchema(etree.parse(DWC_SCHEMA_URL, parser=schema_parser)) - parser = etree.XMLParser(schema=schema, no_network=False) + r = requests.get(DWC_SCHEMA_URL) + r_file_like_object = BytesIO(r.content) + parsed = etree.parse(r_file_like_object, schema_parser) + schema = etree.XMLSchema(parsed) + parser = etree.XMLParser(schema=schema, no_network=False) with open(meta_filename,'r') as meta: try: root = etree.parse(meta, parser=parser).getroot() @@ -63,8 +68,6 @@ def __init__(self,name="dwca.zip",skipeml=False,logname=None): self.logger.info("Schema validation failed against '%s', continuing unvalidated.", DWC_SCHEMA_URL) self.logger.debug(traceback.format_exc()) meta.seek(0) - # print meta.read() - # meta.seek(0) root = etree.parse(meta).getroot() except: self.logger.info("Failed to fetch schema '%s', continuing unvalidated.", DWC_SCHEMA_URL) @@ -170,9 +173,9 @@ def __init__(self,filedict,fh,logname=None): rowtype = filedict["#rowType"] encoding = filedict.get("#encoding", "UTF-8") - linesplit = filedict["#linesTerminatedBy"].decode('string_escape') - fieldsplit = filedict["#fieldsTerminatedBy"].decode('string_escape') - fieldenc = filedict["#fieldsEnclosedBy"].decode('string_escape') + linesplit = get_unescaped_linesTerminatedBy(filedict) + fieldsplit = get_unescaped_fieldsTerminatedBy(filedict) + fieldenc = get_unescaped_fieldsEnclosedBy(filedict) ignoreheader = int(filedict.get("#ignoreHeaderLines","0")) self.defaults = {} @@ -184,11 +187,27 @@ def __init__(self,filedict,fh,logname=None): # drop any extra quote characters term = fld['#term'].replace("\"","") - # map xmp namespaces into short code form (xxx:fieldName), longest namespaces first - for ns in sorted(namespaces.keys(),key=lambda x: len(x), reverse=True): + # Map fieldnames that contain a namespace to a CURIE form that includes the + # shortened namespace alias and the term name (namespace:term). + # e.g. dwc:basisOfRecord + # Sort by longest namespaces first + ns_found = False + for ns in sorted(list(namespaces.keys()),key=lambda x: len(x), reverse=True): if term.startswith(ns): + ns_found = True term = term.replace(ns,namespaces[ns]+":") break + + if not ns_found: + self.logger.warning("Term '{0}' does not belong to a known namespace.".format(term)) + if "." in term: + # Due to downstream limitations of Elasticsearch, do not allow fieldnames containing dots. + # If we encounter a new field containing dots it usually means the namespace + # needs to be added to fieldnames.py. + self.logger.fatal("Term '{0}' contains a dot '.' which is not allowed in field names.".format(term)) + raise Exception("Term '{0}' contains a dot '.' which is not allowed in field names.".format(term)) + + self.logger.debug("Using term = '{0}'".format(term)) if '#index' in fld: if int(fld['#index']) not in fields: fields[int(fld['#index'])] = term @@ -196,18 +215,28 @@ def __init__(self,filedict,fh,logname=None): self.logger.error("Duplicate field index ignored {0}".format(str(fld))) if '#default' in fld: self.defaults[term] = fld['#default'] - # print self.defaults super(DwcaRecordFile,self).__init__( fh,encoding=encoding,delimiter=fieldsplit,fieldenc=fieldenc,header=fields,rowtype=rowtype, logname=self.logger.name) + # the purpose of this is to skip any header rows while ignoreheader > 0: - self._reader.next() + _ = self.readline() ignoreheader -= 1 - def readline(self,size=None): - lineDict = {} - lineDict.update(self.defaults) - lineDict.update(super(DwcaRecordFile,self).readline(size)) - return lineDict + def __iter__(self): + return self + + def __next__(self): + return self.readline() + + +def get_unescaped_linesTerminatedBy(filedict): + return filedict["#linesTerminatedBy"].encode().decode('unicode_escape') + +def get_unescaped_fieldsTerminatedBy(filedict): + return filedict["#fieldsTerminatedBy"].encode().decode('unicode_escape') + +def get_unescaped_fieldsEnclosedBy(filedict): + return filedict["#fieldsEnclosedBy"].encode().decode('unicode_escape') diff --git a/idigbio_ingestion/lib/eml.py b/idigbio_ingestion/lib/eml.py index 59cc2b00..5a80356a 100644 --- a/idigbio_ingestion/lib/eml.py +++ b/idigbio_ingestion/lib/eml.py @@ -1,3 +1,4 @@ + from pyquery import PyQuery as pq from idb.data_tables.rights_strings import acceptable_licenses_trans @@ -8,12 +9,8 @@ def getElement(root,name): return root.find(name) -def parseEml(id, emlText): - "Returns a dictionary of the supplied emlText" - - # dump the full eml/xml for debugging - #logger.debug(emlText) - +def parseEml(id, emlFilename): + "Returns a dictionary of fields from the eml file" # If the target eml document is not XML, the eml object will not be created due to XMLSyntaxError or other # pyquery exception. This is known to occur when a link to eml results in a 404 error page containing HTML. @@ -21,10 +18,10 @@ def parseEml(id, emlText): # It is possible we could trap this ahead of time by checking the raw emlText for key xml features # or HTML document features. - eml = pq(emlText, parser='xml') + eml = pq(filename=emlFilename, parser='xml') - ### The eml().txt() function returns an empty string instead of None if the location does not exist in the eml - ### (if there is "no text node" according to release notes https://pypi.python.org/pypi/pyquery) + # The eml().txt() function returns an empty string instead of None if the location does not exist in the eml + # (if there is "no text node" according to release notes https://pypi.python.org/pypi/pyquery) collection = {} collection["id"] = id @@ -34,23 +31,23 @@ def parseEml(id, emlText): rlu = getElement(eml.root.getroot(),".//resourceLogoUrl") if rlu is not None: collection["logo_url"] = rlu.text - + collection["collection_name"] = eml("dataset > title").text() # Go until we find the first non-zero-length string (should be a collection description), collection_description_blob = "" for possible_collection_description in [ - 'dataset > abstract > para', - 'symbiota > collection > abstract > para', - 'additionalMetadata > metadata > abstract > para', - # Catch all... might literally catch any other desc text anywhere in the document. - 'abstract > para' - ]: + 'dataset > abstract > para', + 'symbiota > collection > abstract > para', + 'additionalMetadata > metadata > abstract > para', + # Catch all... might literally catch any other desc text anywhere in the document. + 'abstract > para' + ]: collection_description_blob += eml.find(possible_collection_description).text() if len(collection_description_blob) > 0: break collection["collection_description"] = collection_description_blob - + iwa = getElement(eml.root.getroot(),"additionalMetadata/metadata/symbiota/collection/onlineUrl") if iwa is not None: collection["institution_web_address"] = iwa.text @@ -124,7 +121,7 @@ def parseEml(id, emlText): else: seen_emails.append(contact["email"]) elif ccc.tag == "positionName": - contact["role"] = ccc.text + contact["role"] = ccc.text else: if cc.text != "": if cc.tag == "individualName": @@ -141,10 +138,9 @@ def parseEml(id, emlText): seen_emails.append(contact["email"]) elif cc.tag == "positionName": contact["role"] = cc.text - if len(contact.keys()) > 0: + if len(list(contact.keys())) > 0: collection["contacts"].append(contact) - # collection["contacts"] = [{ "name": clm.groups()[0], "email": clm.groups()[1] + "@" + clm.groups()[2]}] collection["other_guids"] = [] for g in eml("alternateidentifier"): collection["other_guids"].append(g.text) @@ -154,8 +150,7 @@ def parseEml(id, emlText): def main(): import sys import json - with open(sys.argv[1],"rb") as inf: - print json.dumps(parseEml("testid",inf.read())) + print(json.dumps(parseEml("testid",sys.argv[1]))) if __name__ == '__main__': diff --git a/idigbio_ingestion/lib/fileproxy.py b/idigbio_ingestion/lib/fileproxy.py index 5f118395..c5457ae3 100644 --- a/idigbio_ingestion/lib/fileproxy.py +++ b/idigbio_ingestion/lib/fileproxy.py @@ -21,7 +21,7 @@ class FileProxy(object): """ - The main FileProxy class, behaves just like a file object, with three additions: + The main FileProxy class, behaves just like a file object, with three additions: * dump() is added to return a string context of all bytes read since the last snapshot. * snap() is added to take a snapshot of the number of bytes read so far. * next() and read() are modified to capture the number of bytes read from the file. @@ -42,12 +42,12 @@ def dump(self): save = self.__file.tell() self.__file.seek(max(self.__snapshot - self.__add, 0)) s = self.__file.read(self.__read_chars - self.__snapshot + (self.__add * 2)) - self.__file.seek(save) + self.__file.seek(save) return s def close(self): return self.__file.close() - + def flush(self): return self.__file.flush() @@ -57,8 +57,8 @@ def fileno(self): def isatty(self): return self.__file.isatty() - def next(self): - x = self.__file.next() + def __next__(self): + x = next(self.__file) self.__read_chars += len(x) return x @@ -69,7 +69,7 @@ def read(self,size=None): def readline(self,size=None): return self.__file.readline(size) - + def readlines(self,sizehint=None): return self.__file.readlines(sizehint) @@ -111,13 +111,13 @@ def main(): with FileProxy(open("test.csv", "rb")) as inf: try: cr = csv.reader(inf) - for l in cr: + for _ in cr: pass inf.snap() except: traceback.print_exc() x = inf.dump() - print len(x), x + print((len(x), x)) if __name__ == "__main__": main() diff --git a/idigbio_ingestion/lib/waveform.py b/idigbio_ingestion/lib/waveform.py index dfadc3d8..89e35d91 100644 --- a/idigbio_ingestion/lib/waveform.py +++ b/idigbio_ingestion/lib/waveform.py @@ -1,6 +1,6 @@ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import division + + + import datetime import os.path diff --git a/idigbio_ingestion/lib/xmlDictTools.py b/idigbio_ingestion/lib/xmlDictTools.py index 0a7be1bc..eddf6a01 100755 --- a/idigbio_ingestion/lib/xmlDictTools.py +++ b/idigbio_ingestion/lib/xmlDictTools.py @@ -90,9 +90,9 @@ def d2xml(d): @return: A etree Root element """ def _d2xml(d, p): - for k,v in d.items(): + for k,v in list(d.items()): if k.startswith("#"): - p.set(k[1:],v) + p.set(k[1:],v) elif isinstance(v,dict): node = etree.SubElement(p, k) _d2xml(v, node) @@ -109,7 +109,7 @@ def _d2xml(d, p): if '!namespaces' in d: nsmap = d['!namespaces'] del d['!namespaces'] - k,v = d.items()[0] + k,v = list(d.items())[0] if nsmap: d['!namespaces'] = nsmap node = etree.Element(k, nsmap=nsmap) @@ -129,7 +129,7 @@ def _d2xml(d, p): # print Z # assert X == Z - from StringIO import StringIO + from io import StringIO x = etree.parse(StringIO(""" A @@ -144,7 +144,7 @@ def _d2xml(d, p): C """)) - print(xml2d(x.getroot())) + print((xml2d(x.getroot()))) test2 = """ @@ -267,4 +267,4 @@ def _d2xml(d, p): """ x = etree.parse(StringIO(test2)) - print(xml2d(x.getroot())) + print((xml2d(x.getroot()))) diff --git a/idigbio_ingestion/mediaing/__init__.py b/idigbio_ingestion/mediaing/__init__.py index 26163f37..8fe24eea 100644 --- a/idigbio_ingestion/mediaing/__init__.py +++ b/idigbio_ingestion/mediaing/__init__.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + from enum import Enum @@ -29,6 +29,7 @@ class Status(Enum): NOT_ACCEPTABLE = 406 REQUEST_TIMEOUT = 408 GONE = 410 + UNSUPPORTED_MEDIA_TYPE = 415 LEGAL_REASONS = 451 SERVER_ERROR = 500 @@ -38,6 +39,7 @@ class Status(Enum): GATEWAY_TIMEOUT = 504 HTTP_VERSION_NOT_SUPPORTED = 505 INSUFFICIENT_STORAGE = 507 + LOOP_DETECTED = 508 BANDWIDTH_LIMIT_EXCEEDED = 509 UNHANDLED_FAILURE = 1000 diff --git a/idigbio_ingestion/mediaing/cli.py b/idigbio_ingestion/mediaing/cli.py index e520708d..6fd4ee0c 100644 --- a/idigbio_ingestion/mediaing/cli.py +++ b/idigbio_ingestion/mediaing/cli.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + import click from gevent import monkey diff --git a/idigbio_ingestion/mediaing/derivatives.py b/idigbio_ingestion/mediaing/derivatives.py index ebef3b55..725e642f 100644 --- a/idigbio_ingestion/mediaing/derivatives.py +++ b/idigbio_ingestion/mediaing/derivatives.py @@ -1,12 +1,10 @@ -from __future__ import division, absolute_import -from __future__ import print_function -from future_builtins import map, filter -import cStringIO + + +from io import BytesIO from datetime import datetime from collections import Counter, namedtuple -import itertools from gevent.pool import Pool from PIL import Image @@ -28,7 +26,7 @@ # Some really large images starting to come from some data providers. Reduce # the pool size to keep from running the workflow machine out of memory. -POOLSIZE = 25 +POOLSIZE = 10 DTYPES = ('thumbnail', 'fullsize', 'webview') logger = idblogger.getChild('deriv') @@ -55,13 +53,12 @@ def main(buckets, procs=2): buckets = ('images', 'sounds') objects = objects_for_buckets(buckets) - t1 = datetime.now() logger.info("Checking derivatives for %d objects", len(objects)) if procs > 1: apidbpool.closeall() - pool = gipcpool.Pool(procs) + pool = gipcpool.Pool(size=procs) c = ilen(pool.imap_unordered(process_objects, grouper(objects, 1000))) logger.debug("Finished %d subprocesses", c) else: @@ -87,7 +84,7 @@ def one(o): ci = get_keys(o) gr = generate_all(ci) return upload_all(gr) - results = pool.imap_unordered(one, itertools.ifilter(None, objects)) + results = pool.imap_unordered(one, [_f for _f in objects if _f]) results = count_results(results, update_freq=100) etags = ((gr.etag,) for gr in results if gr) count = apidbpool.executemany( @@ -151,9 +148,9 @@ def output(): def get_keys(obj): etag, bucket = obj.etag, obj.bucket - etag = unicode(etag) + etag = str(etag) s = get_store() - bucketbase = u"idigbio-{0}-{1}".format(bucket, config.ENV) + bucketbase = "idigbio-{0}-{1}".format(bucket, config.ENV) mediakey = s.get_key(etag, bucketbase) keys = [s.get_key(etag + ".jpg", bucketbase + '-' + dtype) for dtype in DTYPES] return CheckItem(etag, bucket, mediakey, keys) @@ -174,13 +171,13 @@ def generate_all(item): return None # catch PIL.Image.DecompressionBombError and other exceptions here except Exception as e: - logger.error("%s caused Exception: %s", item.etag, e.message) + logger.error("{0} caused Exception: {1}".format(item.etag, e)) return None try: - items = map(lambda k: build_deriv(item, img, k), item.keys) + items = [build_deriv(item, img, k) for k in item.keys] return GenerateResult(item.etag, list(items)) except BadImageError as bie: logger.error("%s: %s", item.etag, bie.message) @@ -235,7 +232,7 @@ def upload_item(item): def img_to_buffer(img, **kwargs): kwargs.setdefault('format', 'JPEG') kwargs.setdefault('quality', 95) - dervbuff = cStringIO.StringIO() + dervbuff = BytesIO() img.save(dervbuff, **kwargs) dervbuff.seek(0) return dervbuff diff --git a/idigbio_ingestion/mediaing/fetcher.py b/idigbio_ingestion/mediaing/fetcher.py index 697037e4..75d6f1c9 100644 --- a/idigbio_ingestion/mediaing/fetcher.py +++ b/idigbio_ingestion/mediaing/fetcher.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + import logging import itertools @@ -6,7 +6,7 @@ import signal from collections import Counter from datetime import datetime -from cStringIO import StringIO +from io import StringIO import requests import gevent.pool @@ -34,11 +34,10 @@ LAST_CHECK_INTERVAL = '1 month' -# TODO: Add idb __version__ to this string? USER_AGENT = 'iDigBio Media Ingestor (idigbio@acis.ufl.edu https://www.idigbio.org/wiki/index.php/Media_Ingestor)' logger.info("Started fetcher with User Agent string: '{0}'".format(USER_AGENT)) -PREFIX_RE = re.compile('^https?://[^/]*[/?]') +PREFIX_RE = re.compile(r'^https?://[^/]*[/?]') def once(prefix=None, ignores=IGNORE_PREFIXES): @@ -46,7 +45,8 @@ def once(prefix=None, ignores=IGNORE_PREFIXES): logger.info("mediaing - run once mode") fetchitems = get_items(prefix=prefix) groups = group_by_prefix(fetchitems) - procs = start_all_procs(groups).values() + # pylint: dict.values referenced when not iterating (dict-values-not-iterating) + procs = list(start_all_procs(groups).values()) fetchitems = None groups = None logger.debug("%d procs started, waiting...", len(procs)) @@ -82,7 +82,7 @@ def continuous(prefix=None, looptime=3600): logger.debug("Loop top") t1 = datetime.now() ignores = set(IGNORE_PREFIXES) - for pf, proc in running.items(): + for pf, proc in list(running.items()): if proc.exitcode is not None: del running[pf] lvl = logging.CRITICAL if proc.exitcode != 0 else logging.DEBUG @@ -112,12 +112,14 @@ def process_list(fetchitems, forprefix=''): fetchrpool = gevent.pool.Pool(get_fetcher_count(forprefix)) uploadpool = gevent.pool.Pool(8) items = fetchrpool.imap_unordered(lambda fi: fi.get_media(), fetchitems, maxsize=10) + # pylint: map built-in referenced when not iterating (map-builtin-not-iterating) items = uploadpool.imap_unordered(lambda fi: fi.upload_to_storage(store), items, maxsize=10) - items = itertools.imap(FetchItem.cleanup, items) + items = list(map(FetchItem.cleanup, items)) items = update_db_status(items) items = count_result_types(items, forprefix=forprefix) return ilen(items) # consume the generator - except StandardError: + + except: logger.exception("Unhandled error forprefix:%s", forprefix) raise @@ -226,7 +228,7 @@ class FetchItem(object): #: Number of concurrent connections allowed FETCHER_COUNT = 2 - #: Can http connections be reuesed? + #: Allow or disallow http connections be re-used REUSE_CONN = True #: class (static) variable for the session to use @@ -273,7 +275,7 @@ def get_media(self): if self.ok: logger.info("Success! %s", self.url) return self - except StandardError: + except: self.status_code = Status.UNHANDLED_FAILURE logger.exception("Unhandled error processing: %s", self.url) return self @@ -286,8 +288,8 @@ def fetch(self): except (MissingSchema, InvalidSchema, InvalidURL) as mii: self.reason = str(mii) self.status_code = Status.UNREQUESTABLE - except ConnectionError as connectione: - self.reason = "{0} {1}".format(connectione.errno, connectione.message) + except ConnectionError as connection_error: + self.reason = str(connection_error.errno) + "{0}".format(connection_error) self.status_code = Status.CONNECTION_ERROR else: try: @@ -449,7 +451,7 @@ def get_media(self): self.url, self.sleep_retry, self.retries) sleep(self.sleep_retry) self.sleep_retry *= 1.5 - except StandardError: + except: self.status_code = Status.UNHANDLED_FAILURE logger.exception("Unhandled %s", self.url) return self diff --git a/idigbio_ingestion/mediaing/migrate.py b/idigbio_ingestion/mediaing/migrate.py index 990274fc..b55530a0 100644 --- a/idigbio_ingestion/mediaing/migrate.py +++ b/idigbio_ingestion/mediaing/migrate.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + from datetime import datetime diff --git a/idigbio_ingestion/mediaing/updatedb.py b/idigbio_ingestion/mediaing/updatedb.py index 201f491d..3f317de9 100644 --- a/idigbio_ingestion/mediaing/updatedb.py +++ b/idigbio_ingestion/mediaing/updatedb.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + from psycopg2.extensions import cursor @@ -108,7 +108,7 @@ def write_urls_to_db(to_insert, to_update): with apidbpool.cursor(autocommit=True) as cur: cur.executemany( "INSERT INTO media (url,type,mime) VALUES (%s,%s,%s)", - ((k, v[0], v[1]) for k,v in to_insert.items())) + ((k, v[0], v[1]) for k,v in list(to_insert.items()))) inserted = cur.rowcount cur.executemany( "UPDATE media SET type=%s, mime=%s, last_status=NULL, last_check=NULL WHERE url=%s", diff --git a/idigbio_ingestion/recordset_cleanup.py b/idigbio_ingestion/recordset_cleanup.py index 1264262a..d6eace8e 100644 --- a/idigbio_ingestion/recordset_cleanup.py +++ b/idigbio_ingestion/recordset_cleanup.py @@ -1,4 +1,4 @@ -from __future__ import division, absolute_import, print_function + import sys from idb.postgres_backend import apidbpool diff --git a/idigbio_ingestion/update_publisher_recordset.py b/idigbio_ingestion/update_publisher_recordset.py index dbdf7513..39d41927 100644 --- a/idigbio_ingestion/update_publisher_recordset.py +++ b/idigbio_ingestion/update_publisher_recordset.py @@ -80,7 +80,17 @@ def id_func(portal_url, e): portal_url, e["collid"]) if id is not None: - # Strip trailing version info from ipt ids + # Strip trailing version info from IPT ids. For example, if the RSS feed + # contains: + # 88d5d94e-f762-11e1-a439-00145eb45e9a/v2.68 + # we want to keep only the guid portion which stays the same for this entry + # over time. + # + # TODO: + # The python invalid escape sequence warning triggered by the following regex + # due to the backslash _should_ be fixable by using a raw string instead. + # r'^(.*)...' + # Not changing yet because we have zero code coverage here. m = re.search('^(.*)/v[0-9]*(\.)?[0-9]*$', id) if m is not None: id = m.group(1) @@ -436,8 +446,7 @@ def harvest_eml(r, db): u, _, _ = db.get_uuid(r["recordids"]) logger.debug("Using recordset UUID: {0}".format(u)) desc = {} - with open(fname,"rb") as inf: - desc = parseEml(r["recordids"][0], inf.read()) + desc = parseEml(r["recordids"][0], fname) desc["ingest"] = r["ingest"] desc["link"] = r["file_link"] desc["eml_link"] = r["eml_link"] diff --git a/idigbio_ingestion/verify_ceph_objects.py b/idigbio_ingestion/verify_ceph_objects.py index bf5d532c..45ed121e 100644 --- a/idigbio_ingestion/verify_ceph_objects.py +++ b/idigbio_ingestion/verify_ceph_objects.py @@ -3,8 +3,8 @@ https://www.idigbio.org/redmine/issues/1863 """ -from __future__ import division, absolute_import -from __future__ import print_function + + import io import logging @@ -46,6 +46,7 @@ def check_object(mo, store=STORE): k = store.get_key(mo.keyname, mo.bucketname) return CheckResult(mo, k.exists()) except S3ResponseError as e: + # WARNING: Exception.message removed in Python 3 (exception-message-attribute) return CheckResult(mo, e.message) except: logger.exception("Failed on %s", mo.etag) @@ -99,7 +100,7 @@ def main(poolsize=50, limit=5000): objects = get_all_objects(limit) check_results = p.imap_unordered(check_object, objects) check_results = log_counts(check_results) - for cr in check_results: + for _ in check_results: pass except KeyboardInterrupt: p.kill() diff --git a/idigbio_workers/__init__.py b/idigbio_workers/__init__.py index 16b5d3d2..d27ae6c0 100644 --- a/idigbio_workers/__init__.py +++ b/idigbio_workers/__init__.py @@ -26,7 +26,13 @@ def get_redis_connection_params(): def get_redis_conn(): import redis - return redis.StrictRedis(**get_redis_connection_params()) + # In python3, redis returns bytes for "everything" by default (both keynames and data). + # Adding decode_responses=True should force each field name and contents to be a + # string (instead of bytes) so our string-based comparisons continue to work. + # e.g. redis_response["status_url"] vs redis_response[b"status_url"] + # Setting decode_responses fixed the test suite but leaving this comment here + # as a marker in case production behavior differs. + return redis.StrictRedis(**get_redis_connection_params(), decode_responses=True) @app.task() diff --git a/idigbio_workers/generate_static_datasets_index.py b/idigbio_workers/generate_static_datasets_index.py index 6e2ac9f2..31163956 100644 --- a/idigbio_workers/generate_static_datasets_index.py +++ b/idigbio_workers/generate_static_datasets_index.py @@ -8,7 +8,7 @@ import requests import json import re -from cStringIO import StringIO +from io import StringIO from idb.helpers.storage import IDigBioStorage diff --git a/idigbio_workers/lib/download.py b/idigbio_workers/lib/download.py index ccee91e6..36554587 100644 --- a/idigbio_workers/lib/download.py +++ b/idigbio_workers/lib/download.py @@ -5,7 +5,6 @@ import zipfile import os import datetime -import itertools from collections import Counter, namedtuple @@ -57,7 +56,7 @@ def write_citation_file(dl_id, t, query, recordsets): now = datetime.datetime.now() rs_string = "\n".join(rs_strings) + "\n" - with AtomicFile(filename, "wb") as citefile: + with AtomicFile(filename, "w") as citefile: # 0: Current Year # 1: Query Text # 2: Total Number of Records @@ -210,7 +209,7 @@ def query_to_csv(outf, t, body, header_fields, fields, id_field, raw, tabs, id_f for k in fields: v = get_source_value(r["_source"],k) if v is not None: - if isinstance(v, str) or isinstance(v, unicode): + if isinstance(v, str): r_fields.append(v) else: r_fields.append(json.dumps(v)) @@ -276,7 +275,8 @@ def make_file(t, query, raw=False, tabs=False, fields=None, es = get_connection() mapping = es.indices.get_mapping(index=indexName, doc_type=t) - mapping_root = mapping.values()[0]["mappings"][t]["properties"] + + mapping_root = next(iter(mapping.values()))["mappings"][t]["properties"] if raw: mapping_root = mapping_root["data"]["properties"] @@ -459,7 +459,7 @@ def generate_files(core_type="records", core_source="indexterms", record_query=N zipfilename = filename + ".zip" with zipfile.ZipFile(zipfilename, 'w', zipfile.ZIP_DEFLATED, True) as expzip: meta_files = [] - for fa in itertools.ifilter(None, files): + for fa in filter(None, files): expzip.write(fa.filename, fa.archivename) os.unlink(fa.filename) if fa.meta_block is not None: diff --git a/idigbio_workers/lib/mailer.py b/idigbio_workers/lib/mailer.py index 2c8b215d..8380d5ad 100644 --- a/idigbio_workers/lib/mailer.py +++ b/idigbio_workers/lib/mailer.py @@ -1,11 +1,11 @@ from __future__ import division, absolute_import, print_function import os.path import smtplib -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders +from email.mime.multipart import MIMEMultipart +from email.mime.base import MIMEBase +from email.mime.text import MIMEText +from email.utils import COMMASPACE, formatdate +from email import encoders from idb.helpers.logging import idblogger diff --git a/idigbio_workers/lib/query_shim.py b/idigbio_workers/lib/query_shim.py index e77e224a..3bfc6a3d 100644 --- a/idigbio_workers/lib/query_shim.py +++ b/idigbio_workers/lib/query_shim.py @@ -17,7 +17,7 @@ class TermNotFoundExcpetion(Exception): def isString(v): - return isinstance(v, str) or isinstance(v, unicode) + return isinstance(v, str) def existsFilter(k): diff --git a/notebooks/flag_dwc_basisofrecord_invalid.ipynb b/notebooks/flag_dwc_basisofrecord_invalid.ipynb new file mode 100644 index 00000000..1fa2556a --- /dev/null +++ b/notebooks/flag_dwc_basisofrecord_invalid.ipynb @@ -0,0 +1,1621 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import idigbio\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "api = idigbio.json()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# https://search.idigbio.org/v2/search/records?rq={%22flags%22:%22dwc_basisofrecord_invalid%22}\n", + "record_list = api.search_records(rq={\"flags\": \"dwc_basisofrecord_invalid\"},fields=\"data.dwc:basisOfRecord\",limit=600000)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(record_list[\"items\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# known bad values in basisOfRecord (we are looking for new good values)\n", + "dont_count_list=['Occurrence']\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will find mostly 'MaterialSample'." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'uuid': '99f1de48-d0f7-4afb-b7b9-76a23ae6b323', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c47016fe-d46e-41e3-8c21-59f4f70fee1f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a01fe901-c4db-499d-8a67-a2bcd02c7ec1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '711add73-32b2-46e8-8ebc-635265f905fa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ddf31d8b-01c6-47a1-b476-a3a28c7b0114', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '88805377-d569-44ae-9b0f-64020d6a196a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8e1a3d6c-95ec-4bff-950a-c9f4c5666fb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd15a5615-da19-4338-8ce0-7292488a5e6b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd9df17e5-3c9d-47bc-8ec6-83783712d774', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9076bfd6-eccb-4a9c-87a7-8f81d68a4df9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ba46e319-fa05-4744-9942-86198f487888', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4f20ea39-c9a5-4233-9e42-52f1263dd93d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '61b4ea58-97fa-4250-a41f-877f96ae6314', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e13e8257-5771-4788-9b78-c69b135aad41', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4162a3f7-18b3-4f59-a8ce-2b34d80e30b0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eb631149-6cdb-4ba7-9354-8497b3d0e6fa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '53c5ee3f-07b0-450a-80d3-ceb8583ba239', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e0c50a71-975b-4c6e-8618-4d454eeb7402', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a804d835-be36-4c96-8947-6d0690242ed7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41a1a1bf-9ca0-4962-ac7a-5979fe41aca4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9768863a-f762-4c66-b294-d288cb3805f4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0f9879bc-47cd-4433-afc2-660b846f961f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0fe835cb-7f48-4aac-84de-39d6cb11a080', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '79193d88-1a60-4249-8a1a-3ca1c66996eb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b8940202-7532-45fa-a5e1-74b88ce735be', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a6efbd07-e3f6-4e40-8ce1-b5e5b40f3758', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ada51951-a5b5-4e74-9c6a-d9d2a977dc41', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '22e6a449-5ee6-4c3e-bea7-f078cc8089f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a26c1ab9-af74-491f-b5c4-0db185a96e84', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5cde254-655c-446e-adef-32a7497f4199', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ab3b848-5057-4b79-a016-ecfd01d7d712', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '338ab9ab-98db-4c44-8f84-25868867aa4c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f863ddb5-30f7-47bd-9ebf-19c9edc4ae1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dfd0e908-d2f9-4d0d-8cb5-f09cac475617', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '21a01e7b-6cc0-476c-8b40-aaae44c1ba3a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e120e855-3b42-4b3a-afed-abae2bc23c6c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '03da6498-a78e-4669-9915-937c526d6e00', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36581c27-0337-4f6a-81a0-00a873122745', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26a66257-9d7d-4e5b-bac2-dd8b3cef243e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '080c1d32-ce45-4a14-b396-f0df8bf8e717', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cfdc6e57-ecee-44d4-849b-8af4a038e60d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '88dd6d9a-7284-49b3-bc4e-171418be9a88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '536e3fb9-3a0e-410c-af45-ef8f96d5ebea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f57d2d9-1463-43fa-94cd-5c1c5567631c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d9cb617-5f15-4bd8-a5b3-627d2e84ff1a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5b76b40-805b-455f-97fa-b4626df5897c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'be402c62-7c27-4f74-8f28-3507c03f0311', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '568ddd07-e9d7-4f40-afa5-c038369b70f8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '98fb3b91-b8fc-4f80-9ba7-d6389f9d4cdb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e920f2c-598b-4f14-b4da-4826c9ec61f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cfcd88e4-0e5c-4339-bbac-3e424795c21e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1afaf14d-c483-4cee-b47b-75fb567250f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7abef849-30bf-47c0-88db-d7badaffce5c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5445aec2-4bd6-44f9-86f9-c2e2cd02fbb8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '62bf1ca8-708b-4a3d-a8cd-7e404ac9cbf9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4a3ab048-45a7-42f2-977b-36c614dfba66', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ef2a450-175c-40ae-9528-a1c3535465ce', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a1f6a9a8-4620-4cd8-99af-22ed81877d14', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '24960d97-12f6-452c-bf01-390b8ea68615', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd56adcd5-eded-4b67-829e-eaaa8333cf2b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26a6c287-60ce-4d48-b51e-58b4a3a76039', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ca9667d6-0c1b-40c7-872e-494f9231dd47', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3b742fa1-2785-48db-9b58-6ec1a8d7b028', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd46f90d0-91c0-48a5-9556-1e2f09378280', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27405e45-439d-479c-99d1-ecc3aa69cf31', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '18f4b259-2a93-4c27-90e9-af26c269d7d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '40fc94a5-6b22-423e-a83a-d252f75d92c8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '42a4a463-e37a-4dc1-bed3-f4ea9da0f2b8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '65369b8d-25ed-457f-a540-8eeb9263c237', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1858b682-b420-4345-9761-b9b5ba68d73b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '689c8c67-a76b-40fa-8dff-fa4830add336', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bbc97e38-4e25-4a79-b8f9-b171ebe0cad9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6a779282-3121-4567-9077-f7563645d2ec', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2b2a1620-661b-4e84-9b2c-e55e1890122f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa36ea52-d8ff-4166-b5c3-64d710e32504', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac22c4f3-e378-4bde-8bd5-8819b28fad1c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0acbb4d1-0d80-46d7-b5af-fd1d482ef32d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c108c3b4-c072-44f9-b22d-5a05bfde03a8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '746d726a-da73-40b8-90d3-c4f35b155e20', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b0755619-cd5c-4661-8ae5-10583aaec0d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dd71946b-bd8e-437d-b91d-752a91e4b67a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e2fbd44-2997-42dd-ba2c-4440dba8ac0e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5c3162c6-f7ea-4d9d-82b5-9d22e0c51d90', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd757993-7c69-4fc0-b456-fe5b9f977fe0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fe24bc22-d279-4243-b80c-d3cb763c66fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '004d6e81-8320-4f3f-a63d-743bbd8a074e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a49cade9-5941-4d96-8d7f-1b93d6e0c9f4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ad7aa26-0f28-4c1e-b927-876a68df0ab4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2bb200cc-4aee-4536-8723-199f01a1c3fb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bb6155c8-6bde-4783-b21e-654214975ca7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '71ad089e-8acd-4ce9-95a3-951dd3b8bbe8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '77eb383f-fb82-4901-854b-ef0650b12d51', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd5f89cdd-c63a-4ca3-b633-e333a3cb25e0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1ccc187d-ed37-4fa3-95bc-41a4c1fa895f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2fa2ef13-c9f4-45c6-aecb-b91c30c7e3b4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b909ae22-bcf5-4b6d-87c6-b000859765cc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ab15c459-8c3b-4a5f-8533-9b963d010079', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4241aa3e-0ec3-4b55-b9a0-5d00f5b4ab53', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '25c2eabc-9edd-4e15-b85a-22910c866177', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '969e0729-f747-4118-b79c-7a10f8fdc3e2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5edc4d29-e8a8-4b16-b54d-3d45e2bcd1d8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fbe87750-d2ef-4dac-9e22-e1b76f86c971', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1a119ab9-b28e-4fa3-a675-ee583c9c2e8d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b8287927-e8cc-45ed-a621-d36cb5b4186e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f7edebda-b7e5-4f74-9025-c487a9fe2c72', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d8cd4cc-3b32-4197-90e9-29a94d87bfe8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02021691-2063-489b-b48f-5d9e20554d9e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4059f23a-5837-40e0-b414-491a9c92cee2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a41f24af-6b77-4462-9f46-d8dc2a081049', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ebd003db-df5e-4c41-ac34-7918b9779d15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f4ee792-0023-49e2-b82b-2603c7f2344a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'de603546-c648-43bb-ba58-f8a94cf71500', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4664d311-4629-47dd-ad36-b0c801fc3fd9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'edbc449a-783a-46b0-ab27-e853a0a08c2b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ab42201a-3319-4fd7-89b3-704fe2cdb552', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f03a88df-0a45-44d1-a75b-e4b8200a2f59', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36fc3e5d-ecb7-49a7-8145-7749bb0531ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '93df51e6-3f9c-41a7-9aa0-1b8e917ff000', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8e0c2b97-d725-4513-847d-303bc68615e6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bac09599-1b50-46ba-8c78-4674159b7186', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd5d901d2-e89c-4d12-b7ca-5f80e9159481', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9b849f00-c5fc-470b-84d6-3cd7af22f649', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bab5b08d-7321-44ba-ba98-3749d3202307', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bf813651-c243-4e2d-8c80-8c5121860b71', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '305cf80f-b42f-4af7-b2ac-9cb993a6e712', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99e8b18b-65db-424b-8967-3f43919876f5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c038a4b6-815e-45e0-a823-eb34ba18d237', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6267c56e-1da0-4805-9f21-7d63b3ed1b45', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5f73ede-034c-4974-b6c0-dcde1cf7970b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'beeb1b18-298e-4cde-b876-9b3cd0f1f12d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '75d7f00b-c3d2-4c18-9d92-4ef1f8638e5e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '741f2fac-e413-4f50-8245-f3086b112435', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2ef99c48-3a51-4cc0-93c8-2f8de28c95cc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': '22afbdc5-7f1d-4c01-8997-70827ae86197', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a4e34706-fa9a-4907-8250-68b18d8825d4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8b9c3891-44f7-443a-a0c1-54c6d613341e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6f7c4bad-6167-403e-b247-5cb08beb4359', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cc0c9d37-b53a-4225-8740-dc4fb19cd8d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '90215558-9300-456c-bcca-a8e2d4cd755d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ada88cd0-5505-48de-a889-daf36238f29e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '61573df1-2240-4848-a41b-d4b49a62cc68', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '65fffc10-769f-43c1-93e0-8286d3476625', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd214d0d7-e02d-4afa-a4e3-580666ad77e1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac294322-3f3c-44b9-ae9c-895255d69959', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5ce08e13-d0ca-4dbb-ad05-603857153ca8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5cd86e6a-f412-4b17-b08c-17c59bdbe2ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f502b1c-181a-457b-87c2-869e850af2b4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6f86d67e-64fe-4d53-8929-4d41950e69eb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e0c57c8-35d5-40c3-a287-12084549b8a2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5d9d14cc-19e1-4ed7-830e-c6f9492bd9ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5d2619b5-d681-475b-ba7c-6514dd6728f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '96e3b07f-afa8-435c-b37f-1c1b22e0e9f3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '243c2ebc-2042-4741-81f9-0af9da7b9f44', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b08c8068-484c-42c3-9b44-9d463df005b9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b416f2d1-a115-4b18-bf9b-7b41fa257399', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5b9417ff-8071-479b-adbf-4ac829d90785', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7141939a-c459-4df6-b64e-a2e93714a2d6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd8ad915-a8d7-43e5-b4de-6d770aa3a652', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '25a242e6-a0ae-4bc7-8425-a6dd221f0cb5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '199943ca-9b67-417d-beb1-0f4efb01195a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '63028785-a8e9-4d2b-990a-c77eff0883b6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cf03a8e1-34ed-4103-9f13-4c751a1b2055', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '64528229-40c8-4365-94d7-deeb6ada62a5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1f90075e-e1a6-4ad3-9630-84b5fdde5fac', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '448f7060-987c-46c7-9e1d-7fa7493d8a46', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43189160-a965-41fe-a798-11b6e5900b3f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0cfc3069-c1a0-414f-98e9-4950b80b0781', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd30466a3-5cdf-4c9e-a845-f2f9b4a72510', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3b11bbb2-38f5-4155-93e4-1d8dbb6c26b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c48ddd7c-94bd-4c87-bfcc-3c12d4ac18de', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '75f55575-dbb7-42cd-9e1d-c1ae58cd7958', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a38e8101-d841-4ca3-b623-3dfceb50c66a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a74b1b99-b164-43a7-ac46-581b1af54df4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '56187c6e-3e26-4723-8cc2-15ff620e9052', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c5094f08-a7f2-4149-93f6-c547523238d5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2519e1b7-e13b-4a1c-bdd5-8dd28d133a67', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '845d3ed5-e36f-4087-80a4-e6e95c33f027', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '750fa850-7d67-4a1a-9c11-376862081158', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6fdbc4cd-c25c-4690-8fd5-b66c53aa673e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '79137250-43a8-469e-a725-2b7bec6671fa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '131f76cb-0fa9-481d-9a90-34b4bf0889ea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9dabc0d0-7f96-454c-ab69-efa9df12beff', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3ab93e4a-1119-4dbe-b8aa-c7b1d39b7ee6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f5fa2134-09ba-443c-b591-c7461885ba8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '904bb02b-e8c8-4c80-9a95-e1a127daab69', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1df9dd50-84d5-43f2-b903-b4ab4a7c4863', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a2375cc-a71f-4c36-852c-1cc0dc8b0411', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c9c9fd21-7a8a-4055-ba6f-43ebbf0b09ff', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad27ce34-7372-41aa-a606-b630dfdf5e8d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd7f75d97-6794-46a2-9f6f-7245dceae522', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b7b86c1c-4328-4bd2-932f-a55506fb7775', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41b03e3b-2210-4189-b709-9510e897b2d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1ab818da-c0c2-4cbc-9255-652b3688c22d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '423ccc8c-8975-4980-87fd-36cde7f13f3d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '67844dda-5ec0-487e-b880-85e3fe62c1ef', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5363beb3-7e10-4e37-98d3-8d1d942a5e1f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '011cda5d-183d-48f1-9d50-70d30647be2d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4800fafb-dca9-456a-9d59-4543ac13a74e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3efa2349-6311-407f-80a3-b32189842fda', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d3a44bc-3a87-4552-853b-906537da3ef1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7aeccc5e-426a-4610-a570-fea4f2d6f635', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9e7f8d74-f3c7-47e7-b0c3-fde451796558', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b9a8880-a5f7-403b-a52c-a712e75a3b24', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '473f64cb-0bb5-4baf-bbd2-baea7c79826d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '803638f3-b6d1-4657-9be8-7cc3ad0279ad', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ffd09a6b-a5e9-479a-86b0-4a9509844e06', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'de8c4f9d-f4ca-44ad-96bc-f2ea039a1fbd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd1588556-0162-46dd-bfde-fa5e6b6cb7d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c930c984-a035-4e02-9d7f-f706be263525', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '88e874ad-b609-4893-aea1-2ce0e28e33e4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd9ff1a32-2c9f-458f-b74a-8a0ca3fbd44d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '58e03ff9-36bc-465b-bb44-6af5f1cd45cf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '59e6bf3a-9938-48e5-b058-20cac0f0ae4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8322704b-836b-425b-b74e-59549484a2a8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': '6ba6c143-ba93-4c8d-a1ad-c918c629a32f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '75b006d0-eaea-4a1d-bdd7-2692391184d5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '813b7e1a-81a6-41c3-aaac-27c002a39196', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f31a1b80-48f5-4522-8ad1-60ebf9a47dbc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b3909e09-023f-4e3f-9517-a25f91e5f0ae', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7709b0a5-86da-462e-81e9-cd44b96b817e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '620085ca-654d-422a-9252-dba6d5634db2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6cf4f798-9d74-46aa-8d9a-ed3bd9656cfd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4a339c41-e9a6-47c5-b855-9c7233adf9a1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '474ba38a-e999-4676-ae78-8732bf4170c0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd95232ef-83ab-4863-bc43-8fe7885fb72e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b70b4770-7104-43de-9193-6fe74ba6168b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5608277-2b91-4e30-beba-a9519659337f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c4342e25-41cd-4939-9f4f-2a8d155615c5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a19a842f-fd9b-4c06-bd14-652408cf5d4a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Native and Naturalized Flora of'}, 'indexTerms': {}}\n", + "{'uuid': '03f7094d-5778-440e-b5a9-32ac3b63d158', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '92ada32e-6912-49cb-a6d2-453d24fbb316', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '953f4b05-b805-4965-a624-37c196ae4fb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c38c135e-897b-417b-871b-b315c0df0ed5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f1e69410-8db6-4df1-868e-7e7e01402290', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1d1c82a3-d604-40c2-ac61-34a931c89cb0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'de2156a5-444f-44a5-b6bc-adcf5381f743', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fe3ee00f-56b8-4486-8810-74268ef34310', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c5095841-537c-4c30-abf5-62c40c6afb61', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e7cf068f-997a-48a5-b31d-06d03eca9618', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dddf7a87-d8ae-4a7b-8ead-07996f9d454e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5cea2bef-3ebc-4544-9b88-6cf31d8836d4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f7e9fa92-14d8-4566-9f63-21077eda85e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7006dfe8-8125-46b8-b80a-779ed76b7a9a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cfb75f04-2a68-44fb-9672-0f033678cd99', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '900e3330-9df5-4ae0-b23c-16b38f8f1971', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '081d93af-b42b-4beb-85ac-0b6ecb99ff40', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f1cfcede-9be2-47fd-ae4e-12f0c0788ae2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'f226e6e7-fe8c-4b07-bd36-2e46f03b7930', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of the Mono Lake Basin'}, 'indexTerms': {}}\n", + "{'uuid': '6e111ea1-2abc-4c7d-a811-6e11ae38838f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e107a3f-fc82-4553-8160-a795f6a20d29', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a694218-832b-4217-b58e-93d0154f6d66', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43aacfb0-d27f-4427-8fca-e364c7984b69', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '024e912a-5681-4c6a-974e-eebb44be486f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e3461dd2-d04a-4933-bd67-f3ffeeb85de1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e9f15a27-1c12-407f-a4f7-9565c90d557b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '07e333e5-5ebe-4672-8c5d-b6e51bef7a1f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '873ce776-c67d-4a83-99f6-699ecc7866f1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '975f169a-add1-41b5-a7ba-385e0b6574df', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '160c7012-7985-431d-aad1-c92d0791250a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c63d638e-4c85-400e-adc4-369b37f29e70', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9a27763b-c3bf-478a-866f-c61167a10737', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5e1e855b-12f3-4b86-8633-fa4e57430784', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '38968dd4-446a-4241-b0bb-1e82497ee956', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '19c45537-f441-41f8-9c4f-c03b3b14b7a1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5c8b3387-532a-4659-9950-87d7fe395754', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd5f31146-d9f3-4409-a50c-96c3ca306b27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '59cde993-f70e-403c-b16e-8810e7a6dab4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'deb95de8-432d-4f91-8ca5-a94fcec2bac0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e0fae64-4dfc-4941-a282-dbb782645063', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4d568f73-8d05-422f-80dd-a61154380dcd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d497fa4-9762-4480-a053-ad1d28ac84a2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26ca6dae-cabe-4f61-93c0-1bee0279d64f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7957abf8-aeaf-4f77-839a-0b39a523aad3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ff010503-63c7-4dc3-bec3-a8c85b4a579e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f8f08b5e-e004-4707-a84a-50fab4210d30', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '56348e6c-f0e6-4dfe-9976-bab0c4e0e2d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a36e22f2-5dc0-4445-a9b4-6e9a0da43b7e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e0fbc486-363a-4cce-840c-2964d5dce618', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '93b15410-084d-4722-a2d1-b91236350e7a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2e6b3c86-1c29-49b9-abe1-574bba4ebf19', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '40650091-1866-4d8f-ae9a-c34e0c2f3ad8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0d1371cc-5065-4c47-ad80-18ed95285723', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '79e3dbe4-7f38-4e12-95f5-5907f0c6ee2a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bae1fb20-ebe4-4ef6-ac5c-fe8d441aa24f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cd46b7b0-988d-43c9-b0c9-720cc6f5ae37', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '30921047-6bf7-4772-9873-0ba9ff112a11', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '39fd35f9-35c2-499c-8561-3c461be1f023', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '482e65a5-f6f1-457d-b00b-5e394da6bf88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '750ab66f-ab2a-4856-8b5b-46bcca4c71f8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '906ef690-e2f0-480e-962a-ff5d5c00eb95', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bfca6a29-2527-47de-ac75-7cbbd13853e5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e28dfb40-eae2-46af-a695-82358134beaa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '35c15dcf-9b2e-41e5-8e9b-684048baa060', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '78374397-8a3b-4846-bf5f-233772b0a6a1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e334c28-69f3-4e5a-8894-30c80720aee2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '365dc398-e807-4a9c-b708-62cbbb7ecc4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fae0ef5a-5dc7-43dd-9d3f-c7233c3fd3cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e392089-f72c-4948-96ac-c502bbf791c8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0cebd33f-3a26-4e69-8223-507d98f9be05', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7483a96f-ed68-4fd0-887f-ea07e442ee73', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '53c65c2a-ef2b-4567-8b46-1267b48c4023', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d6b3a65-cddc-4dc6-b29f-7b8807c94203', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c9a88d8d-71ae-4a01-ba8a-310f559ebea1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd6d33006-b910-4ed0-a410-e192ddd45743', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '05bef81f-ece6-4067-bdb1-c4428704dd4d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d78712b-4d21-4820-9792-1fa6943d8431', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eace66d4-fbcf-4220-ac27-0b0ff03eb985', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5398b83e-2ba7-4169-b12a-f755791b759d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '69bf09ca-8c55-48c3-931a-d33426aa167a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd572bb82-3d70-49e6-9be0-571eef12b4c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8015a262-7566-4726-ab59-73b31584f21e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e6b253ca-c998-476c-9f0c-132201a5f1a4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9a8e7567-9115-4581-8ce4-def54942aa4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '57327677-210e-4c6d-afa0-e8c574244ebb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0ab0032c-efcb-424a-83fe-66b85641815b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a9ddc7ec-a138-4d7a-8af4-d8dcaa88edf5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '20af0301-af44-4d9e-af60-2c4b0cfb92f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0237a2e2-2756-457a-8300-e5fabc4ff94c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b817525f-72fd-44cf-b029-e68fbc7c4268', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ce9ef0b9-56ef-4c78-b11c-048c31102b7e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '59b5f77f-91cd-48f7-9c0a-027d9958de28', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ca15c135-988a-4129-86d1-6b7c1887a825', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '80caa0ec-6a1f-419e-8846-e710d3fa9ba1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1dd4fd06-9ccd-4a1a-a0db-c05095d60461', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9207c3de-07cf-4382-a1c5-ce9314dcd9e4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '81838331-5d6b-49f7-8866-a99ea0a409f5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ca07b702-79f8-413d-b78d-b5d5884a9134', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5fa79023-5497-4736-b981-0c2afe450bb6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d915591-9f6a-4449-ba32-75f28f9a0e72', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d7bc6ee-b2a5-4f7a-9881-74278b10e8b7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '868bd2c2-5f04-448d-91e8-99e2d3edb61c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4e57304-9e94-4fc3-94a2-bba5730d205c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '66736c64-dc06-41f4-b31e-acefc76376c4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '87f4b8ed-24bc-48c6-9f8a-d261d8a6fbf1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '62c86e32-8eff-4616-b166-bc76ee30fd0d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '74d37fc5-aad8-431b-8f00-b337f585a4cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '40a62597-c058-4756-a26e-8379a74e4e41', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dd0b5520-9628-4e42-9a89-29c5c50914c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '23bf1911-b3d3-4824-a7fc-da719eeb24db', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad7e8ade-998e-40e0-8a1f-e936d3f1dd61', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '228301db-6d1d-49f7-95f3-374a655a4182', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '30894424-112b-4621-98a4-21897d2458d0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e2115127-53e8-4dbf-9e61-ad06ab967b8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bb4a9669-d303-4b82-a7f4-d6d374ce7cfc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4acf503f-3cb3-4878-9c62-757289dfd4d7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7f951477-a5c1-4c89-aaf7-c18683c62db8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a304c19a-2b80-4593-8352-ba1c04f8485d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7cafd772-17ad-46f5-a24e-7b62678d3eda', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd8e2d45c-9f3f-4c4d-8cc7-7bde1d2ac7b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6327dc00-81b6-4d1d-bc9a-444ae2d402dd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cb5c12ae-77e4-42e8-bf5a-6a10e1322d66', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ccad0a31-dcf1-44e7-8536-c6fcec379ea7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3fc0166c-f05e-4bb7-a633-13036cad2b70', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a946dc38-bb51-4552-9df0-e8684fe0c95d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8464b68b-128f-44c5-bccd-12b103aa71bc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '55ba20c9-a847-4ec8-8ee2-e0675d7a6e58', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of the Mono Lake Basin'}, 'indexTerms': {}}\n", + "{'uuid': '2f8c7ed2-2db4-4c24-8369-6de760f31f7c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Colorado'}, 'indexTerms': {}}\n", + "{'uuid': 'b5b9dc3b-fc9d-463b-a60e-6f599934c585', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'd511400d-1a08-453f-aef1-98c641c7e380', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a1d4c96b-4b7c-4157-8df6-60a2e468905c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '107286d5-dab0-4733-8315-e648c06c4680', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e6b69584-4fa4-4026-8125-7e298e29baf1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4a2c6003-3d9f-4d77-bc70-a8d3f42549c4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7e71dbb3-1c91-4920-9461-a54cfc02debc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '06654f3a-e1a9-49f7-bf05-2687115144d5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '057e5e86-f8ef-44ab-a7d0-65097ad58188', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '215f4947-08f2-44e3-ae88-e2b7f065f53f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '88f767eb-beb5-4a5d-92ea-4eaadabe5242', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0facfe08-6f49-4d93-aa92-bf7f370833f6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '87bbe1e2-8c79-4ed1-8221-9d1921679db9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a2197fd1-52df-4cc3-9c6e-226bb051b2d7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '063f728e-1f95-46c9-83d0-24f3ce3bfdd9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6395ce09-0929-42e4-9b4f-a63ff8233dbb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a157eb9a-3189-42da-851a-428f378a08e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1d1f5059-7f57-471d-a4d7-02fcb8ada85c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '87ca51b9-499b-4c39-aefd-5b199294e61e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'abd70157-d2a7-4604-b183-4c833d90bf1e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9f7beb00-75ae-4437-b6c8-78c3390ebfc9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9340d665-a403-483a-b6d8-54485480c3d9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '75acdb23-4893-4805-b663-5d5f957565e2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '04350fec-57f4-40dc-8db3-5d3c7096c478', 'type': 'records', 'data': {'dwc:basisOfRecord': 'FieldBook'}, 'indexTerms': {}}\n", + "{'uuid': '6a8e05c8-429e-4c40-a3dc-83b1b73e3ace', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ab3a23be-ad37-42c4-b1d7-b263fa64ee3f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'daed60a1-8fad-449b-ad4e-5fd8d7a5e18c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e3f41f9f-dbc3-4909-b6bd-8e1a05d4332e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '03d04d3c-6df8-492b-8ffa-53aa8bb68579', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '245df028-1004-4f6f-a77f-b5a9fe5b584c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '98da1d25-0ded-4dac-94b9-9caa3f7c7dd5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e9b69aa1-df2f-40e9-a883-e4317e1b16d9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13ea8cb2-9532-4579-9c4a-23e239628f1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '667f9fd4-b712-47f9-b053-94471e5acd9e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '83a26e6e-aab4-4e74-bc80-4b2e7b113acc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9b8432b3-21a3-4607-912a-3ce8ea9a57d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b2c6ff9-fab9-49ad-91b8-1f0fd2359608', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2be85215-9043-4209-8282-43e548dc5248', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c34d138e-1992-4ca4-9f1a-df43ec8bf837', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '23decd0f-aa41-4c49-aa4f-ece460a4f44a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b9745c5e-c9db-4376-a9e9-e3019951ebeb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '66bdcc9b-0315-4646-b2a6-59641c0fcdf7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3fde7275-4bf1-4856-8cb3-c2a5c195956d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3a619673-9d72-46ea-a254-e2dd8ed39ae1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '25d3caa6-0a17-4def-91ee-acb937c6f41e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b157e7c-19d7-4d0e-b4e9-6c66bd193a4d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '00f6fd7b-b847-4c92-bc57-d46ac358c30b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0af48edd-95cd-4377-b2f0-d7740a8c6f81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f66392e7-9b0c-48ee-960b-74f77b2fa06e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eefd4afb-83cf-4127-81fd-bd6bff05b20c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6ad948ec-bf56-40ed-b403-409c693e3532', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ca73353f-5e2f-4660-b54d-7ee0236b3904', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5991a81a-d3b2-4954-b846-1288ddd2a630', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '499aa799-103f-4b24-85de-13e6110fbeba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'db82c907-1f53-4cd7-adce-1ea6b481ff5d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6fecdda6-aed1-4611-a5ef-f18e53429bdd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd10e0c76-2651-4e22-b07a-1af473d542f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3373b084-5e04-4a08-8f8c-2a449f3d8841', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '646bc6e4-db1b-439b-942d-cec8341a3747', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '93771540-83ec-4e4b-a5a2-54422c02f348', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fb0b07d5-11dc-4db0-910a-c80aef958b26', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fc1652cd-4937-4dd5-ba42-03b78f0a67c8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa7948ed-5f14-4cd1-8ac3-4b77e69ea394', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5ca1e429-5be2-4c95-aaa7-e71cfccf89aa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a0176adf-8c55-4f0d-aacb-2db34ec4c84c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13ddf5c3-30a1-4f85-9b60-cb117b11e8ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8f34628e-f92b-409e-91b9-80a95e4d9c27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a6d337b0-9f15-4b88-a85e-46b869fb2247', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ce7ecc97-7adc-4573-8084-53dea5f33386', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5fc0304f-8872-4884-99d3-6f2611316bb9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c2812156-99a8-42c6-8f88-0a1234024ee6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1eb11a2d-2381-420f-96ca-cd9f97f6f69e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '35043a56-73e5-4d9c-b5b9-3bc986a6019c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b6715c68-5552-4acc-aa8f-51a64ab60af9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'd4e51055-d8bb-4f9d-87cc-0b86b9e03049', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b6dde35c-7725-4592-b988-280f21be01db', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '073914ff-df37-40e1-86d9-f00d9a53d5c9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4ecb90f2-6bd8-423a-973c-66830c88473f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'df2f5d45-536e-4eca-a322-6308bca9ac21', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'daaf56e6-3a69-4100-bd05-47e6c3c2ec6a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f17cc107-4c8f-44b8-a2af-69181b07361a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b6d6e35b-9a92-4ba9-8545-648e64764052', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e38d0c4e-1a72-4f5c-856e-2c5bad8461d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '770e8c96-1f1a-4555-bac9-af5b87a6194f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '58c5d7d7-2299-4505-a42c-508ca18f4739', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c293f62e-4ad7-4dcb-a67d-7fedcd0ea1bd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02c81000-14fd-45e1-b640-3a491b283437', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd0d71ae5-b383-406b-be37-126180dc927c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0efd9ce2-3027-4e1b-9860-7e81d0427157', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'daa500e6-af73-457b-acbd-257ee78d1adf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa30ab6f-e9e8-461e-b454-62fcaedf47b4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7bb24864-b4fd-4ecf-a52b-4c324298d0cc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c9130ca4-6512-4be6-ab8f-d2524d4d8b7e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a65d71a-3f5e-429a-aeb8-29f842083ac7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e374b04b-a7d3-42d9-9e81-6160dfde678d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c59736e0-6454-41b9-9102-b40e4905903e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9a3cdb6b-7004-4e7e-ba62-2b86778bd70c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7fd5d418-5525-4db5-bb1f-d040db016823', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '76e1d566-6153-47ea-9d4d-deff2985c05f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aad9345d-6abe-488a-85bb-f3b3d8cd8256', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e9ba3de7-913b-4496-b6b2-b8a9acebd4b0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd7273908-436f-4ea0-989f-8e9434e3936d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e95139dc-eeb3-48dd-8595-a3f104baa167', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '92ef58fd-9f6c-4339-b662-ff960d5affa0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6c09e4db-5b08-463e-ab65-d582413b5d6f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '96945915-a9be-43b8-b930-eb06c8a25054', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36bf597a-ac32-4dc2-abac-0f7a9aa17627', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0a596936-5ddb-4f9d-ac53-5e9aecdeabb5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '19a576fc-3406-41ed-87b8-08c618fdcd95', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '527b5c50-4407-4758-89ff-87e310938e08', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5cab1e5a-ea2c-4823-883a-1e527a8ba077', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b3b04318-e6de-4f4f-9391-ff5457796ee5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'deb24539-a4bf-413b-9058-79f3f86bc311', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1835569d-cc3a-4c07-beb9-79a6b99a693e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26eb5943-954e-4581-9d94-43e382b3ac5d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f822517-d5fa-4ec4-9555-ce7a03e3d51a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f460caa-eb21-4836-b428-c3b3d6666891', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2189e3e8-a941-432b-81fd-e4a2f57b1833', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '671ffcae-be95-4ec5-a585-39f9f1a78aab', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'be04b1fb-8c07-4d5f-baf8-30be52587449', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f6797d6d-030a-47cb-9184-a8686bf5da20', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f080500e-d0b1-4a2e-936a-a74d4870cb1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '546121d3-04c2-40a4-9cee-161aa289d087', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d8f5328-9f17-4412-84da-03d4978c4531', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2f414650-3c7d-4b09-8fd3-5bbc895b8357', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '372b2b0e-518d-4564-8bf2-2efff898d36e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '863d2712-f1a2-45f2-bf71-7a743a19fe02', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c84c5d63-cada-4b98-8c53-5fcb18a9d03b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '14ee96de-51a8-4e30-bcf7-67549d4276cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e4c5cc61-657d-4ca8-81ef-b10ceb78995d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fc1b56ae-ae96-44e7-9b91-869ff2b9d3fa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4eedda93-3001-40ee-a77f-e35fb7e785c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fedbab8f-761d-484b-8386-d3a1ad5cfaf8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '50da81b8-db81-4c4b-a4f9-aaa61f512dc6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ecc92afe-95f3-45c1-b38e-91de2104a313', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b1b73a9-e9e6-43b2-b75e-1921f834553f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '69d377c0-d7b4-4d43-9608-e7bc26048c9f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '165a8ea1-35c5-4709-938f-0ef404816cb9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1c2aeb15-11e1-4908-b7db-cb4092d0a2ce', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6ab664ee-a243-4ce8-a2a0-cffeb39d9d92', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ec3fc69-c0bf-4d75-9916-251ba14d3040', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ae1cb2f2-3d4f-4227-9115-11eb51d26eaa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ef4968b-fc4a-4204-b493-885b82e83944', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bb7146ea-3855-485c-83cf-b79258094879', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5cc3ba0-a9ba-41d8-acc0-b38c715912ec', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27b3bfe6-05be-41eb-b2ad-0128e6960c7a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '32d75e77-ef67-441f-aae4-c0979c8a8f5f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f82db9f4-af8e-4838-8120-24a457679a68', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '325dbbfc-7c65-4060-b606-4c014aa4b6df', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '192f07a3-be72-4e58-a1c8-c7fd0ee344d9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd03b1164-e3f4-4422-9590-cb8cf2206072', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bfe5dd92-b79f-4cea-89de-246b5cd79f28', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '073d012b-5b08-49c0-9f43-cc93ccabe35a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd52887ba-0b71-4299-95f5-745400891148', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9c7051ca-3312-4cf2-9db7-be232173cc88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dcc54f75-77b0-4243-8b02-ed0c59d33c1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '96b66946-342c-483c-a2aa-064b00a8102a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8bde5cee-0a0b-453c-909d-0b9d40097fcd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c527323b-34de-4054-afaf-fc9166c2a418', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c4500686-01a6-43c6-9d95-5ee1ba3d2309', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e3d16ee2-c7b5-4fac-921f-0255a4f8fc56', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2f09cfd5-cc6c-4913-93e9-3fea3eecaa01', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d71b6f3-d9d9-4848-b4c3-7ca616d9e0b9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ecc7856-c682-47d8-a523-3382dae750bd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5100f41a-4c12-4ff2-aba3-d3a0c76266dc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b2532df8-a6c5-4957-b75c-e07a33cd88e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bda2384b-5d92-4586-9f1e-cd0051acb078', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '87ddf22c-d198-4fb9-a7d9-35aaec70d919', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0517619d-351a-432e-a192-ea32884c5794', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'de520b5d-b217-4118-9c07-f51be5fa58e2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44864fe9-1ab1-484f-8038-6aa3c4300bd0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e6a3495b-d22e-4cdf-b96b-fb4fe4a613bb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c4140bd9-c624-48d5-8f09-10e2b6e2a95c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f6404939-7d2b-4019-a146-0b2eca6fd623', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4ddb30ad-a878-4ace-8d3e-14274668261a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c32ecaa8-37cc-40ea-b47a-0424ed95adac', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4f3c8840-1bb8-44f7-a5c7-d13e862a001c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '279dfcb7-f5f8-4450-95e4-e079e51daf8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5f0a9aa6-e7ba-4474-a443-19371985f53b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27d37b98-4869-4462-901e-49742f30afa4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fa3c4fdb-7249-45a2-82b3-fde8140f0060', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '14ba7713-aaf4-4530-ad46-bf610f00f3b7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5869c150-4b66-412b-bc5b-c2cceaf4765d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f24e2dba-4142-402d-999c-7ddfb64d5523', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f523293d-a367-4bd0-aaa5-32d76043fc1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '949d8cb2-b9ef-41e2-9a3d-034b531e0476', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ed5f372-7d7a-4f4d-bda3-c560a52c19f4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '12915b6e-8590-44b8-9711-7822cfb3df10', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d14626c-60f1-4433-b3c1-b83ab35b1983', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '67d8d8d3-bccb-41c5-a2c8-b64fe321fd0b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '82f17c79-1967-4dc8-b5d9-9fe2627f3f5a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '849d758c-4878-42f0-a0dd-6fb03fae48d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '14fd1917-a2ba-4136-8f77-e463ec653c7d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fa4472c3-1608-46b9-affe-c948434080aa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cfe34650-83d5-4c0d-9999-d28fbdff35ae', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6bf113c3-e9cb-4d99-aaf3-271b10ab16fb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7eed4fe3-ff88-4229-8b28-c5bd7698fd62', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e4b58e7b-100d-4831-b902-5c7a477954b9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '56f46253-d0d3-4ae9-9082-5473c09bbc94', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9597daeb-4122-4472-82ff-869f04e21932', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '28a6c3c4-7bb3-4585-81dc-2b382cc9b567', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e57f4386-5b54-4ca7-b6b5-4040fd0ed342', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e7d79cbd-7282-4e7f-8d23-30952f088d60', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f28d69c2-a167-42e9-a1bd-7a670fff1282', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '48189456-4b93-42b7-a6e9-3ae450f9c700', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1c1d7c93-4a33-4efd-a313-e976f3f9c57a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '01f51bbc-00f7-42e1-8c49-fa4d742b280e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '61bfed79-ead4-45be-8e61-428526bdbde0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd8bf0131-3a06-4a03-84ba-0d0982ebfb14', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '559e6d5e-db30-4669-a9e8-2c83053000df', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2ec86656-e301-42dc-aef1-5a57d9048f40', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5eb544e-0ba0-45bd-88e7-03c35b0bb250', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5116d7fd-c7a8-496f-ba2b-05ffea38c1e0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd5b60b91-f10f-4645-ac34-f2307702b792', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4490118f-9e94-4e49-9b38-8df4b5e68dba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of the Mono Lake Basin'}, 'indexTerms': {}}\n", + "{'uuid': '102b8231-f302-4189-9112-b12fe7c48099', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3ce45848-c4a3-435b-94b6-150a5eca0607', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '766b8ab6-896d-4483-94f4-8ec750806359', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4df9f8f-ceea-43af-864b-136776f9858f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5d19798b-0e53-4d08-b90c-e9d884919b7d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '97393d38-e8d3-4c47-8dfd-868237e236d0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '424e08de-c8db-43fb-ab58-18d3cee12a02', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c048caab-eb9c-4cfc-89e4-8da147c1dc5e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ea52241e-776e-447f-b3e2-9ddde18d72b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4c9d14b4-a545-4215-93c4-36ce6621adab', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '532ec028-bfb0-4368-b168-6777a249a294', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c6c783e7-6fbb-4320-9401-488f35ad24da', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ffacc994-422a-4d6f-8127-22969245614a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '600d41b5-d50c-40fb-b0b1-f403de78f7e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a0b45405-ada7-48f1-918c-9e845d8194c7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9ea23cd7-413d-40f6-aa73-aebd75c1224e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fd285607-1992-4331-8e45-30342c92dbf0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dd1a5512-cb15-49c6-b64c-ba75f2f0f50d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5d3a118-032e-4d63-98a7-638977051297', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7d1b41e2-36ed-4df6-b1e6-a9fa5a4c195f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5dc444e0-4ac7-4867-9d3a-4ad80f2456ac', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '893a1a8c-64bc-43e1-a2ed-8c4264ec41cc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a5b7a18e-fe3f-452a-ac0e-6633ffde082b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02488156-1912-4ce9-b002-cb0693bcd3f3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0f69f6ea-4ef3-42e0-8e2a-b30455a7f5a8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c7b1c5d6-5361-4858-81cc-d9c3d4ef91ce', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c66ee17b-703e-45a1-87ed-58046e2bb226', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ae2a2389-0648-4cd6-a27e-f077c131c353', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '887daf1a-288e-4f5e-bc8c-f0a6a2483852', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8e275982-0c3b-46ed-908a-5f2483eca14b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c503c316-d9ae-4232-8d8d-b1cb0966b01f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '862f17f6-eddd-426c-9424-c4122810ae8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '32ad1008-3bfc-43f2-8f87-fff48fa5a855', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bcd15d2e-5d6b-4a61-ba92-1a0707ed8fa5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd48da5fe-52c9-41bf-a420-2cdc5dc29f7f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ee95a355-8f60-48da-9035-760e0efe7790', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '40456a20-0f7c-4ec8-86e9-333b118e7e88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eaf27b6a-a750-41e4-a61f-58b05e873852', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a0523c6a-3831-4a97-907f-17103b54f30a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b11f4137-5079-455a-af32-7c498b933107', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '92393dd5-3171-46e1-8bbb-7f735312ea1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '78615dd2-2796-4397-bcc0-bedab130c356', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e45b5087-2584-4217-ba88-971980277650', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '755cd0d4-7acb-4f32-8073-1a64e94753d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f12b1dc0-f42b-4a71-a87b-b3056ce74b76', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Photograph'}, 'indexTerms': {}}\n", + "{'uuid': 'ab1bd07b-2f72-4e31-b426-1d8ce42727f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '32ececfe-ae40-49cd-a5cc-3b50e99b0763', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f21fbcc9-af3b-4f79-8dca-d1aeee6f302f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b66afad7-0c6e-465e-b8d2-8a81b80f3ded', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd59859c7-48b6-410d-b8a4-c13f7b6405ee', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7686251e-4777-4367-9f28-2f5f7631be35', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6cdbbdf0-0c57-4c6a-98ec-626dba53e968', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac6f9b04-41bc-4305-9a76-0e0466f58650', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fa8b461e-fe40-45ec-b71b-4343f5722bc1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '58b619e0-e1bd-422c-b1b9-565fccc4c19e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b9ce2b34-5d52-4ddd-9097-873b467f360c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d1d31d3-b4ab-41ef-9d29-060537cb1cac', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'df7b3720-5762-4c73-8e9b-d5a68f16f63e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d7dde84-c1ac-4335-92a4-4565e89ae2b3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0e5aab48-9fbf-4db3-a757-8368df761f5b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '062c8f76-e463-4925-9be4-83bf4493d859', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c336124e-279f-4cc5-aed5-7af3aaec0433', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd2d09c80-40db-4434-b477-8fab63159a16', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41cc8ab8-3729-43fb-9d5a-8a181b2f303c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b7bf925-762b-4f75-9217-90d5d61903e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d05671f-b292-4aca-91e4-2a7001b357a1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0219fa4b-be24-4085-bad3-f8b5622c5b1a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd228e895-b72a-4735-9142-5d2d1a3be02e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ed71e82a-255c-4b32-9e17-f145525422bf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dd0790a9-5245-42b7-9b46-afa3e8229cad', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3368d1d5-2112-482e-a030-bacd6e58c7d8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'e64f755e-b1cd-4da1-8c6d-08f701bc8eca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cfb68912-93f8-42e8-ba71-24d118d6661a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ff3e8ee8-4e63-45ed-a55c-b0bd963a772e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1aebc559-c7d0-4c8e-a4e3-c4ef80cefbd9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '67777ad5-89e2-459d-bc0b-d27e148d2380', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '489c2d75-a42a-4819-b47c-1fd3c222cfe0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e85a0a67-8c50-4dfb-9156-6a8dc2497014', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '50a3b3b5-59c9-4d79-b695-fcb19ab52717', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ff0ecd5a-1507-456b-8250-670bc1228b8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '12a9c207-f0ac-4da6-bb4c-6224a19003cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4cfc65a3-a170-413b-973f-2ded87fe9d71', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4197c733-1be5-413b-866e-a4494d992ca1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8eb1a716-1f35-4b0b-b1da-8e4d617ecac2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '305d9fce-26e9-4992-92ca-5441b65d1a52', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a9f9bfcf-0009-4df3-baf3-5671c166bfd0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0802ac5d-5fcc-4d7f-bf89-c7fd809a79b0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0950ed11-c3ae-484d-b392-017eec08d0b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8971e778-72d2-491a-8ab0-2093e6fb0f16', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13a7075e-ff20-4a9e-831e-7bc95f35fe12', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7600d806-09e3-4c8a-862d-ef8cb8646a35', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4f2b291e-4201-4991-b11e-1b9f9ed39d8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2ffcaed1-0785-4364-a257-85ed03e38cb4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '74854b33-d99a-4cd2-9f66-558d9b97135e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dba1c40d-fa58-44a9-b461-9937a92fe3c6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9a7aa647-79cf-44e8-b446-ce480198611d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9c3b2cb1-c11e-4b45-80bd-25168b02c2dd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f28da9f8-9e85-4a31-b6dd-8ccd92a66505', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4b142e0d-2772-4f8a-b844-a8ebfd8cbb42', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b430b5fc-8cbb-46b8-a4f0-7a93b62f292e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f007403d-eea8-45b9-96e0-778c4a8eac39', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad17f63e-4895-4003-8cd1-6f4c18093df0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '219897a0-2c6f-4a51-89da-834e34a41f31', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '91c0810c-f33a-4daf-ae02-233f893b2373', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6f3a4927-5cc4-4b1f-9226-f67affb4ff8b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e764f633-f4a1-4059-a0a6-3007157decb9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b4515d59-491f-4a0f-9200-792a539b612f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '026eacba-4478-4b7c-9027-ef7b3dacdac3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '09c1856f-bcf7-43d3-bb05-439a98a61f27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fe0f3c70-422b-40ee-a549-1ae5ecc932b7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cce95483-e220-401a-a4b4-c70f8154d1e8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eadc50db-340a-4d89-99b8-dd3ff559b0d5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2aca9be3-276d-4c4a-b628-edf5c6b0bfcb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e43b99f5-ab2a-4854-ac32-01d7d9960514', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3b9554d8-ae0f-4535-9729-0c5e967f25ae', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '548ee675-935c-4dfb-ba2f-174c3bca5ea5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad2cf002-2a52-4fe4-af4a-20a6089f2065', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4ec6eb7-fd7b-4347-b758-2f044fc56b9b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '04dff58b-7f89-4909-aae3-b6985d1b93fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6db90806-4c99-4627-8ee6-44a0ba26039d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '23d03bc6-ee10-4b8a-9620-7284726fefc7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f778cbdd-4d13-4618-a687-3ae0c7764df6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b7fc0b52-0ea2-4e58-bbd7-f3adac4fcddf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '35407bc5-94d8-4951-9d7d-4975754d4212', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '34a52e5d-ef3e-487c-b68f-81ca7856f63b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1a2e3354-711b-45d2-887e-3abf8daacfef', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '90f3c7dc-1981-4c27-8362-7d12d7aeed30', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9c441a82-3a33-40eb-b4ba-362ef47438e9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c61e2405-fe78-4212-981c-e55c4b92de68', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3ff8688f-3d2d-432d-9bb2-37adf97be5eb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '122cb9b9-8077-4beb-89e2-8bc8cd44db4d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a762539b-bda9-484c-820c-1464bc99ba34', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b2e2a375-9fe2-468f-a393-63408c8bce09', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9864280d-bacd-4feb-8e03-bee3b71ceabf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd635310a-06fc-413b-8910-94a78cdd8f65', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3e4686ab-ca67-4289-b091-eb05cea66e19', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1261f9ee-7179-4f2a-97ff-ce402ad15589', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d06403e-4be3-44d1-bb76-5e81498b14b6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '46fdf591-6cc4-4190-9adc-1873d5d55f56', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '04ad33a2-281a-45f6-b07c-2514f8ea20e4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd3928f80-bd15-4bee-8492-54143bfb368a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '378f30cd-93bf-4ce0-abb7-00d774e7f2f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9c285f97-6238-48d4-9c34-27477120900a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ae530ab-efac-4b69-91cd-1a0eeb1b740a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec0bfffb-a588-4288-b15a-e0ccc32bc89c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a6267462-bf41-4696-bc63-c1abb8756213', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '63f73e00-c997-4726-8231-d9b3aee14dce', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eb51564b-1cf6-48af-9617-32ba83d8aa08', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '761de4ac-70a2-4f1b-93b4-e60705299f8c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5721ba4e-d6ae-42b6-9cfd-0ddfc24d150b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd7749815-2d9b-45bc-8f37-4a45e9953d0d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9352b551-57c2-4da3-8e94-2cc8db53380c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd02a1023-1f00-412a-bc13-8749e8783b93', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fea237c9-6f21-4ad7-a26f-6f728c584a1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '49c2a039-04f5-457c-a479-d88ab6552848', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '05bf00ed-9ad5-46e6-87d3-649900c15557', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '838e8778-e83e-4267-9e08-8e91720f3ba7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a76e6057-7b1e-4023-9bb0-7c2c336594c4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '762b71e3-90ed-41e1-8bfe-b2b498f00979', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b1a1635b-7ab1-4859-9f3b-8e36f6bc7edc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '003f2d27-ee5b-407a-b24d-9fc2a69dfa66', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8dbc7f1b-3d0e-4aea-9314-f3d8697e2df4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fbc7a40f-dc1e-4658-8f79-06d74646f869', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7fe3aa78-f898-4286-bef3-82f77859b77b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9e8805c7-3b4f-4e08-b79d-9416eae61b31', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9f7bb958-6b9c-4b53-8ef1-0ae77f165a0e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5ead85b9-e165-459d-9abc-b2b15495f5ed', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7b22e21e-edf3-4462-ae34-977e629cc13e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3f31b9c8-adb0-4f57-ad00-6c1168d624b8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b0f4152e-46c6-4fcc-bc5a-7b3cfc403dc9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13b959f0-9d01-40f7-b16a-a1309af07681', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5b1a86df-cea6-4ff3-a517-9cb03a6e0488', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7c4d4afc-baa9-43cd-9799-4fb4b3247181', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'db6a2cef-7f60-4c07-9860-90e7bd81ad32', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '81c78ae6-7657-4145-b219-60af1c07c952', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4299cbe0-1bcb-44c9-a73d-7c7ce4d8d2aa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'aa84b0e7-2b24-4083-8319-1d77acced0b9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43f74571-6033-4585-bd3c-1035d7986693', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8952582c-f051-4e42-9e1d-c0fd75538f49', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8374e19e-882d-440a-80a5-37b0b35c85d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cbc866c5-57a3-4dc7-be74-e4777be496fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1adcfb60-81bc-4197-a2cc-9c80962d103a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5579669b-b785-4ac3-8a01-2c2896f17eaf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eb96f5cd-b91c-4ce0-beb5-bdc2d4babd79', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '407a1e35-9d1b-44a2-a258-f83e21e46bcf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b5d325d-0a36-4d09-b84a-bf0df6212d7d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '163156e2-2baf-4641-a6fb-23fe90e37388', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f1ac3f92-a7cf-401a-9a49-fd62c996e14d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26285cd0-b33a-4443-84db-9eff1345201a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5d429e2f-44c7-4c93-9a5c-4a1d2d7d99ab', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ddfe3f14-ab00-4677-b492-762db9cb6a5f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5074e4e0-e2e4-4dfa-a096-ac00bd388384', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c921a5f5-1e33-41e1-aa5b-2fff810b2736', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2fd2049c-9d0d-4d0f-9b67-fb4b0684327b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '81071a0a-2670-4483-bf02-cf578a2f5693', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b0cc768e-204c-41b6-afe0-f54d95fd32e7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd8ce1976-2195-4d98-a713-0f31a1d42302', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b7db9124-371b-455a-a96c-68391d41369a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8984e7fe-2c76-4c11-8001-dacb3311763e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6935d682-79db-43a4-b6c5-15149521aa69', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'da4fe2bb-ba6e-4130-ac46-a998b9858925', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ee0bad7-5a1d-4c9a-90e7-76f4ce294e9e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a26f284c-9cfb-4ef6-887e-c8510c366ea0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fce9e085-804e-459b-a66b-bb76838253f1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '468e88b1-447e-412e-b606-3a6f235a4bd9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0570e18d-0fb4-41cc-a267-27d36943c4f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6b53dfa9-7112-45c8-83bf-408b194c0d92', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8f907f31-227c-49b5-81f6-7b81a9c78f34', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4aa63531-aba9-48e8-b7ce-ae89787af3a8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '678fa9ba-5d49-4824-9cfc-bfb42af090f6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '62b3b650-d037-4342-bb48-04a46dbd2aa4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '55f01c43-9899-48fe-a360-8d504cf36fb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5b0254c8-97b2-48bf-9ff3-d4c17241cc30', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b152590d-3edc-44cc-9fa5-3ebd66177d04', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '78859fa7-4cc1-4fd1-812a-65515c917ac6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd0ae6348-b5ef-472f-8ef1-5085a2428c2a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e7c7fa08-a4de-4e2a-85de-5ba18eda4b84', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e8948644-4290-41a5-a817-04d5149a7b5b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a8e725f-0045-4765-9ca6-b1f25e0216aa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec738414-8252-46dd-930d-b49668905b18', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3ddab179-0003-408f-9c9e-41923781332b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'efce9755-503a-43dd-9771-199af8541034', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '92e58295-0430-4a9d-8aaa-378d824c9f13', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e6d2d5a-548f-4490-9a74-bc6e35c6a1be', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '47e287af-fdb7-4294-9e96-a6fa788b66fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b1f0d279-cca8-451e-96ad-ac034e07876b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '259a347a-2ae1-4c09-b69f-9cf098debdd0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c43374b8-66db-469b-8652-48bf5ccb158c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4324e305-8df7-411b-a8db-024b390c11ec', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6b0b00cd-4c79-49a2-86ae-ecb4fe1b1831', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e03f440-bba8-4d5b-9bb6-3aa64460a03d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd5256dfe-bfc2-42b2-a2ef-3a1604751a09', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd1fb985a-d576-415d-a900-1e28531ac8ea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8b9496a0-4a9a-4dc5-b6c9-bf7c00549c06', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '06008588-8744-4839-89bc-49467d25cad4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4b280107-0693-493e-bcbc-4604be444b57', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '419d3979-2da4-4c3d-9fc8-0955cd73e2bf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41541114-cc09-4e1f-aba9-c22e9e53b6c3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '04ee40d3-dd80-4411-a759-0fd7bbf7a869', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e87e0bb5-3b52-4ba1-84cf-24ea753f4509', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6ad21cc9-5d7c-43b8-9cbf-1daf20159071', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6d7a93b8-30d5-4aaf-b8b5-c7f025bede09', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'af65d072-1065-4287-af19-67b3517c918d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3e41b5f0-bc56-49e8-9ae6-383f41897882', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4d135f8-2a44-47a9-9e02-ee5d11f2991a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5b905643-cde3-4e70-883d-fd3e1ce418d4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '288dfba9-bee1-41f5-8bc1-08b84cc00380', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f72a8e66-debb-4aaa-a015-e87a8e6bb21a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e303b8a6-c07e-4fb9-8326-8b7da279c3a6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3fe4f4c9-8bee-4233-87d1-2cf28a2b0881', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac7e25bb-ef84-479c-b651-207595ecfb0b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '604bf1f5-b81f-42d5-8206-ecd26e3757b6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '214d1e5b-e5b5-4d6e-aca7-1e24d00d7700', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '87061618-8a7d-42e2-bf1d-15b7cc2d1b27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2e78bfd5-bf80-4905-ba44-60bec2c4e89a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2ec03486-ad6d-49d8-a556-54bec4c5643c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '89c5e433-9596-4bb1-a4c4-ea991e43c194', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e260fc15-44a3-4f52-8de5-4ff2584d3cfd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bf440eba-af19-46ef-ab16-19e6efd4dc90', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Native and Naturalized Flora of'}, 'indexTerms': {}}\n", + "{'uuid': '752c08dc-52f1-4bb7-8a25-05662a059d76', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd2e35fb4-2da6-4887-af81-a51a043e29eb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '38e5cdf2-9254-424e-9fa7-2763cc7e1d5c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c777b7e5-0f7a-44f8-9137-7223c1c5988d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4384844d-4cf1-4904-956d-d7c2d5fa1ac8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f6a11cbc-2750-4dd5-950a-75ec95df0d36', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5184216b-f349-4ef4-8b2a-13f9ba716a67', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f6b09993-673f-4e75-b24a-dcc75f9a20c4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d352b6c-ba9f-42ff-8d6d-66ebc777ede4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4025affe-e345-450e-bba8-6781025679b0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'db75d4fd-6ae9-46e8-8d63-ce3f9e209e1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99e7498b-95bd-4f5e-a6c9-0316f459aa81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ae14dfe1-3050-463b-8931-a07c0e21fe9b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2eb6be08-e524-4e2d-95dc-cadf90418a20', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4bceb979-d38b-45f3-9af9-58f5e3916f7d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7de19eca-01c9-4dee-8250-6c0fb08f0a92', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b3f8dca2-aae7-4a2a-bc02-5734a217d78e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e1df03ed-3c5f-4fc2-9b7e-951fa3aae860', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '97132996-3529-4f4a-896d-4ab8ae33ab27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5cf31400-d7e6-4991-9fbe-0b888347ba8d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '00b50008-460d-4533-adb0-2a403be9f5c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '576a7136-cf14-4efc-8e17-af2e93b4daa6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6dc9d72d-63d5-4335-a272-94f3511f3a91', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '09882b9d-1dd0-4d2f-8d86-160c6184af3d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5048c6ee-d804-4067-a8fd-137a7170ae35', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '28961370-c23b-4c0e-882a-88ce3919de21', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '35a26377-3318-4962-a57e-5208400d8167', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '03fa3536-99eb-4a9d-882d-de81a46ee14e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4477be4e-caa8-4536-bf2f-fb0de359da11', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e635b2a8-075c-48bf-86ce-018f40e515e8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '320aca8a-c912-40a7-8666-d4658248aab6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ca9a1e4f-e5ba-4e8c-9caf-5cb4875a981e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '96f0d258-9a62-49ac-8dda-d03b912a6312', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b70a09a6-92ff-48fa-9b90-5ce58d41f2f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3e0fed54-f915-4aaf-bd92-cdf49552ddda', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bb2f83ac-c5d1-4940-bc44-632ecf7b9c69', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '90a5db32-2e52-456e-bf79-0969c01af2ba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '19143c5a-c6f9-423e-b75f-3ee01647271d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9085d26f-2c32-402a-b131-5ac7509d909b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '33f92699-a93d-490c-b9a5-453fbfc849c5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '716de181-5bf7-4a14-b681-ed02cfc66fb6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cc4e4462-6c92-4159-9a92-a04efab2225e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6797c140-4da8-4a7b-9117-2698bf01fc88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5dbd0a1-bfd8-4b3e-92f8-30043a86e4af', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1cff9e12-8302-4ad1-9d31-37c4b63a98aa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e38165c2-c7a4-43c8-8824-57d27a788805', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '66511930-5dd0-40c1-bdb7-6bc3c8101fb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e3e685bd-97a8-4ec8-9611-ef7b3733080f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41d77f91-9b6f-433a-ae44-736d7438bdd2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8cee653b-ac2f-4952-b626-827b74b0758f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8b729483-9ced-45ab-971e-254fcf5b854f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8e73cc4f-1926-4d47-a82b-2124925b63d6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2ec31827-4280-443c-b5e9-7f38e44a6393', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4a5cbba-272a-40d4-88db-39c30555d0a7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3f2d4ccd-77f4-4a6a-a3e7-da3f823eee15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ccfbcf41-ef84-44f2-818f-cb3369bfc9bb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd1bbaebc-d092-49e5-9da5-2c8ef756aa53', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a0adc87e-c1ab-4bf4-bef7-09c3938f7cf8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '50fd4114-38ec-4506-a650-87382748660e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a5f89988-e519-45fb-a3f5-fb8c5adcf9f3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9419b5d0-9341-44c4-b517-60d05937487c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '762dd059-e818-4c18-9652-596819ef18f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '63499961-3572-4dbb-92f7-fd6222ff0de9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '52b3513d-4560-4289-aa30-535395eb5e15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '751f598e-4f72-4d21-a5d2-6e06e5b54a5a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c7b1001d-3de5-4b65-b8f0-9e4d833972a6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0da9989d-4828-4176-b100-78601553098a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f872fa6a-8e56-48d3-9e71-d9c2cdb3f8b8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a6128f9d-9390-4b60-95c7-b8a2acd5a45a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0a5161b8-3800-4432-9f21-8f825c6f3b3a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02002d85-c145-4691-a487-8f547fa944c8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4606120c-efb6-4d5f-a8f6-d1a1cc5d5807', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '52b28896-7204-46ff-99c6-63549941f3e7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd9063bdc-4bc2-495a-bd8c-c1344910f1a5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e04c5b69-6933-40f1-84bc-39f834773960', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec6129a1-6e59-415f-9849-f96a763adba4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '06d39005-1967-4db0-b128-6efb018db131', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'af3b38dc-37ce-4dce-beb3-d07af18e7db1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '992438ac-5b65-4c4c-ad73-d621131b5f45', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ff44c271-e399-4f40-a0b9-0871e41f0543', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd70bcddc-d903-434b-b827-05b02054d1c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '848d9805-b98b-4ec9-aacf-0b70dcac9eb5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '275e1f93-01cd-4765-8921-37a3d575ea8d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ee40c6f5-dc21-4f19-a817-c5a78f40d6ea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4c9c357f-c688-4d3c-a1ac-192da6e92e44', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36d51d0b-c8c4-4683-9436-c4ee45512796', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c94ba176-a4d2-457f-a715-b5426b3fda24', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '259c7afb-9582-48bf-bf0b-b5fd18f5a3e5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9a127284-d6b8-4c7c-bef7-541079d39491', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '96b23f78-08de-44cd-a4dc-feb6521a9268', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e4d73d20-14b3-4b15-8bb1-74f9d83e3b58', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '803f3be7-ae92-4f25-a06d-c473c017911f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '18a4a160-7dbb-4cd0-9acd-f8b1cfe956e1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f337584f-3346-4cdc-9d2a-0aed7c338092', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '084741de-be5f-4e53-a50a-7d07e620d8d7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '009bd53c-af74-4e11-8b4d-19d1b93666b3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27c681bf-090e-454f-b70b-daa3321b0bd4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa5b8998-cf89-4cc1-b87e-2e1f3f173c74', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '047db3ac-998b-4d80-917e-53496a1840c4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0be2d437-8d34-4478-8bd3-75adfaa779ee', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d78aa5b-dfaf-4de6-a9f5-4c05a37c65df', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b696b0d-2557-453a-b929-57c68dc81a7f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec64fbd6-3ab6-4605-97b4-469cb643d9ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Native and Naturalized Flora of'}, 'indexTerms': {}}\n", + "{'uuid': '27eb8888-0d51-46df-9569-1ab0d15ae0c7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b88a16fe-6122-4908-a207-802cf3003262', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a09a581f-04d3-4da7-9116-e1c738756e80', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '898ec1b5-dffc-4b85-94d4-95538e6ac3d0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b3b7303-03ae-4b62-b5bb-566cae2de383', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '86bc3f9b-9f15-4914-b191-b5fc5dfaeef8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8c0df66b-177f-4c9e-bd47-5564462ffa73', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '700bc496-e707-484f-9187-6e55c341df07', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7aed2f4a-760a-49a3-86b6-ab791c913c82', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2137d07d-d63e-4c1f-afd6-807189ce658c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6799d0d3-7870-496d-a0d6-0a25bba20119', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '155ae98b-c647-47c7-8e35-bdc648a9192c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '710612b7-7073-4368-99cd-7d302f79b79e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f48ed898-cecd-42a3-b5de-99cf3e9cbb0f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '12933598-068c-45c1-a003-baf8466660f1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4a22b608-94cf-4c87-b089-b47a5bbfe358', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '287af94d-2668-4534-919e-49bce1d2d07b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6158c857-b21c-4bad-8ad8-2d9fffac0f55', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '97874647-6e2c-4259-b2e3-67b5f4f08b9d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b2e1208-ee19-48fd-ad99-563036984abd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '76c4de11-697d-4909-b8dc-a479b0740656', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b4e26984-6df9-4e08-a364-efa3dd09d647', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '561a6021-acad-4a23-b196-c740dcdac43d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '28400ade-8e03-4dbf-844e-8d5fea068474', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '81dba8a9-356e-4651-b5c2-622236c6a9fb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '63136ad5-6f58-4e45-8c4f-2d5bd1b83ce5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6220d90a-2fcd-421c-ae5c-4a0b2dc6c94c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9f91156b-167b-4932-8dd2-b7f2a4d90ad3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e2d39e31-e65e-49a0-bd67-fee3c1a21bec', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd613baa-6d60-4bfe-b9b7-f708f2fdb369', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4091ff0f-3440-4887-9eb4-de61d3f05bde', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '980ff461-566e-4406-b88a-ca34d8e89690', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '5140c272-732b-467e-89b3-015a9e0700fb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b7eb8595-90e1-4a8a-baca-183e7acdfc53', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'ff2ecff1-bd68-476d-9ea5-671852b22c83', 'type': 'records', 'data': {'dwc:basisOfRecord': 'FieldBook'}, 'indexTerms': {}}\n", + "{'uuid': '15bda212-a4a1-4312-85ad-4f91ed6e1bdf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Photograph'}, 'indexTerms': {}}\n", + "{'uuid': '7c577caa-86c0-413e-bfc6-1bc0fc17d6b5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad0a3266-98f0-4e6b-9f3c-4b62a99eaf87', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '05c7001a-8822-4b1f-ac4a-3b33d1eebe40', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '11077bbc-b4af-47c1-826a-c132a10f17eb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '65dc3e7a-4ce1-4c18-875f-f3a024b7b879', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '45df3ebb-6974-4486-983e-6bb7c2ca4333', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d6c0c94-4886-434b-8a2a-8d5f4645757c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd736505e-91f5-42d5-8bb0-8eb38ba93eb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41494c93-3517-43b9-b230-8a19981c16f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3a4c9c5f-2a16-4a82-a713-ac42bb708abb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a6ed17c7-058e-471a-89b1-8e80298e11b8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13cc03d2-3e70-44ac-92f4-b11870d80195', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7541934b-235b-4de2-9a09-1420b3a02a84', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3eeb3fdd-f308-4397-ab12-7cabe273098f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dec71d82-ee03-4222-ab8b-1cb7fd98cc54', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99d48f96-db10-406b-b61d-4e1c387ccd1f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b982352a-7a7b-445d-b43c-a847b191e748', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5fa899e-ded6-49df-bd45-cecbb5119577', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6c2db89a-299d-4a24-a067-36fe7e9653fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '68e3efe7-d6ed-43e3-b5a6-1f357b92f7f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '04fef646-0e82-4d7c-b21a-fc9d86bf93f1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fb264303-516f-4be3-89d0-fe4fef250ef8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '646dbbf9-deef-42b6-a76f-9937dff28e26', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e2ffab88-345c-4786-a726-8dc21c3d0098', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '23060aae-697b-46cf-a504-428b1d4e3160', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '454b95ef-6f38-41e0-84a5-c2cbd2908a1e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2e045af2-2e53-41ff-93de-4d76a2b1caba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5dc3c760-6f11-46f1-ad6b-b1913c7ee5de', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '038ab183-903b-4185-a1dc-842c1ebdc265', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '232f5969-3f94-4d32-a946-d0bb37e1520a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '55c70fdf-0e3a-4bbc-a16c-fcbcbf9f74f2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '21a296cf-198d-41ab-8f4e-238fc3cf05b9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cc9c84b5-b391-43cc-9b6b-cabe6ca8a690', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ddc29eb0-956c-460f-8217-709570bd3612', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6821f643-7718-4c83-9afc-b5855d8d760f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e0daabfb-f69e-4944-b4b6-b2fd3d6c1b20', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d4d3995-7fb2-4fa3-8616-66c3a5c558ad', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e55ae1dd-026c-4514-bba8-08ad1d00357a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3af4103e-53f1-4306-8fd2-a764c1d21439', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd425d7cf-31fb-45bf-8bc3-c007c2b3d53a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '79e8e84a-3cd2-4b0b-a2cb-8dad25927864', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa3f7394-0e52-4e52-bb56-6b61ee72fe45', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '08b4d2b6-259f-42a4-b0f8-071553b2b746', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43615248-b6d4-428b-b0fa-00fb9a652ed6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9e37d976-8fe6-4230-aaf8-1fd959531741', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6016bc64-8e56-465f-be70-204c42ee36ba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac73d39a-b2e5-4e0e-92d9-46160d36896d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fef09769-ea9e-4c0d-a31f-60555b225f0c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e358d24b-be8f-4803-9e3a-ddec55ae8875', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '07370102-aa58-4542-beda-8bc245ffdf27', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e11381b-c421-46e2-8ab6-b2f204586c15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '427a528c-7270-449b-b845-4ff072c6f86d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7f94641f-d172-45f9-a794-620e6466e85b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '699c4c91-d70d-4161-9d8c-00c833ace714', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '76c6ea4c-ca68-46da-a364-f1841c595232', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '124ddceb-c6ca-49d7-8038-30cdcdc7ed6d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '15b3dd9c-8520-4b63-a373-dd37ba16b951', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '945ea845-341b-4467-bc17-bb8aee4022e7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b2ce6fef-a46e-43c2-9ab7-9ac6946acdfa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99a8ff53-db7f-4eda-ab0a-19688d64cad9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fe3c814c-0b20-4075-b202-0ace767e383a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0d4edb55-6814-49cb-8218-460b88ec2854', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '291661ac-081a-44da-abeb-56bf0907cf9c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5622e883-e475-45fe-832a-1cd1a96ff62f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8fb632ba-5524-42a6-9165-1c44bcec5752', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '88ba4f3f-004a-40bc-9af8-b5399ef7eeaf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6401188a-fed5-4bd5-a97f-afe1af35fb9e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6beca7f6-932a-4632-a5d6-3b2300f487d1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1efeab1a-1b5e-4dfa-b31a-dd08e4b79760', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c48cf610-fad0-4d51-b178-50b39430e1c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'beea8ef7-a8f0-4569-93be-15dc6c2982cb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c25acc1a-a56b-4827-a544-d48594caee81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b634570a-41d1-4d4a-a6b4-8973e5619759', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '13fa83a8-9bb7-4f74-b611-e03a7aa20cb1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c5376cfe-0c5c-421e-a9a3-711ed24fa384', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f87bf3ea-e956-4410-bb27-ce8146df6107', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2a9eb27b-7d48-4301-863f-7e739cc839ba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '267a0ed0-af1c-4cd4-8bfd-9dcfa5116a0f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3bb260d5-ebe6-41ce-94e3-68fb4edb3f59', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dba9b3e5-2923-4834-a303-58c6d3766a95', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5a01aa2e-4a45-412e-add3-0aad2a6644fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '470d4085-2647-4ada-b1ee-e8f8b4fb2d12', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e263288-c808-4163-932f-2bf7c8218f2d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e294a9c-84c3-4a6a-882c-ba1b1cff72bc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b426ffc4-c627-4469-ab5b-a162033d0300', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7df22471-caba-41d6-914b-3db1452f09a4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99145d95-c87a-45af-b246-be74b70d641c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8ee849d3-ab94-446f-9d54-591f50963f83', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e2b411bb-4bd2-4240-bb05-87bedd7da887', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2081e7c5-64b3-41b6-ada1-ff3dc8bd3e09', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0f368ab6-031c-4b9a-bb5e-9620aad871da', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f7cc624a-311a-42b4-98f7-cdca5b977802', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e52360b0-653e-46d8-a814-f280ed394aea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9363502e-849e-480c-a173-f4b5107b75c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f0dbb6ba-d865-4c49-a51c-01414aca26a6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '125b4df4-7643-4e78-95a9-7ad2a15376c0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '26483ad7-f18b-492b-a3bf-a3547e688c7f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ce3fcefb-25b3-47ea-8ff9-a7e04867ad2c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0ec68aa2-44db-40c6-97e1-b019de01d2b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '97aed904-3454-43c5-80ff-75abf3bc5c54', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1dc4a172-931f-4489-a095-5f28198b2dcb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3680f96c-cc92-450a-84ae-0d50a4e0d387', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d879ebb-1958-445d-91c5-54ed624857dc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02ce3d90-16df-47d4-8c67-c604aeba5154', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3f27c567-b62a-4154-8d37-0ce27e1a624d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c0b3a6dc-7d1e-4b65-847a-787adb69b555', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '71357189-682c-4362-827b-9478cf520d1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5da7766b-a80d-480e-b7db-b8c2080c4cc9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'df371fac-df1e-4aac-b668-8c91df3198e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ae0e667-8aca-4a0a-b1ea-0544c97b1ad7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f73619ee-2281-4d28-b40d-4763afcdcf4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a30b0878-3737-408f-9057-7b23ca07fcb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ee25c0f7-c1d7-4291-a988-02a56a645de3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e7e6f71-d693-4396-b22f-218ff34eee22', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c3454c1c-abba-45ec-b7f5-9c965bc0b8d0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f6873391-c2aa-4ea2-a460-5e16c88b0332', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '07f19cc6-1a08-44a3-887f-d0ac492d0d12', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd04827ee-f1b8-4579-afad-c8103eb2b8be', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'eade69e7-2b95-4281-9514-41b18b7d9fe2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1a395053-f6f2-46f5-943b-a62c34b5d625', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '473a97d5-985c-4354-8fe2-92127d5fc5f6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f059bc23-ef71-4a8e-a38f-bb5240159547', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '14191a71-fdcb-4e23-a03e-975bdc4676e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '20efcd47-7b34-48f1-b853-a42f5c14e781', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd793b356-ff1d-4fda-a58d-60f4f026f9f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '689f395e-a532-426d-9201-9fb4a8aa68a3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dee7f1f8-76fd-4752-99e3-0781df096f4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d1979d2-14c8-48fe-86bc-9fb37b2f8b16', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd093c46c-78bd-451d-8028-f91d84a7eefe', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0e3addda-309b-441b-bfbd-a3e4d3501044', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c92424de-c80c-4543-8ef4-1234b8d59293', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2efbcb3a-5044-4469-b010-a8cb7881d986', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1deee18a-f016-467b-b864-51aeac60e9ce', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '462dc86f-32ac-499b-8e92-a0b32386aa14', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa30a766-9a17-4426-a943-9cee92a418d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3d6642d5-8e78-4405-aefb-96a6a3757332', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44cd7a76-b10a-43c1-8948-552531f04df2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5e4b5fc6-47bf-43aa-be43-54e263380e46', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '657ae314-17ef-49b3-ab3c-8cc2f3424a54', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36e52362-4e3b-4b92-8821-c82b93d5183c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a417de4a-2628-484d-9466-3270c222285c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c56030f6-c92e-4446-837a-8daae25eaa1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9fb9c0ff-1ce2-4acc-a152-74443d7d290a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '42ababbc-72cc-4f5e-88d5-a95dd1c66c1d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '91c36222-95f3-4802-8bc9-0d54db3e5367', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44940242-fea9-4d84-9224-1239719b3e36', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '171ce055-5908-4fb4-804f-5a57abd82a52', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6790d266-cb91-490f-887b-cf41bc49c453', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '50570a90-cec6-43e3-9932-e1e22c5a4fd3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8229c0e7-f602-4570-a70a-859986886410', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9cbfc643-5d80-4757-9ab7-9e6dd71f48b5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fd6115d6-d838-4b83-84cd-2055d0e606cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aaaee5cc-8ed0-4482-a1b8-b65c817ae69e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f24ee446-f2fd-4cd0-8dd6-999d9eb1e736', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3af363a3-8cf7-44cb-884c-24c7057a9bb4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd55cfcad-bc50-4f73-a2e1-c8c01f635670', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3d7e4837-3fbd-495f-86c9-816eb5506735', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '050a56c9-9129-407e-b3a4-b256beedb90b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '056d6209-2eac-4aba-af0b-fcb6c90cc2e5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e1f806c-d720-4962-99ce-9dc0d27d9514', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9f3352bc-ebe1-4c1f-9c7b-f06f3a95b797', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '48c08f1c-ee6c-4cc2-9a9a-33b6cae67399', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6bb9bd31-ad11-43b3-931e-a885440ed764', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b597bb29-2b12-4f5b-a223-7f0a7bba08cc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Plants of Jefferson County Open'}, 'indexTerms': {}}\n", + "{'uuid': 'a7646d5d-6c2b-4852-ad47-be972c2cd1f8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e9c9811a-3f37-4c51-b575-2a897fb91c4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44e3b2b6-c347-4874-ace6-f3311c36bcde', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '403df249-74af-461e-abf1-0ec43c2dcb49', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa3821a3-ae02-4a55-8151-66084cfd6791', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e64c0028-4024-4588-a94b-148480a37160', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cc8b79ea-122b-4558-a366-ff69b5c7d7c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4b4d73dd-9118-4d89-ac77-70ecb1192618', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa990eeb-68bb-4679-b235-7f33caeccda6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '37bbba70-bb9e-41a3-958a-cfcc940ed50c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '69337f4d-a345-45b4-9f4a-8243346dd416', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '30e7d708-ce2c-4445-892d-8bbdc0d97899', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd0e1466a-7678-4947-9c5e-4b2e721ea54d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ad178b8b-9bfe-455f-b797-2b19177a9623', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3ff8330c-b0ea-4544-b709-c36d67e3d195', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dbe41156-1a2c-4894-94ce-704146a94cf8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '432621ad-962b-48d1-a5ba-4067575fd525', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aefaed2f-c22e-48b1-be53-576f1c6bb806', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0f6e7cf6-30e6-4057-b8a4-777d2d748b30', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '781da2ca-528a-49fb-825d-72b0f73e1dd3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd4b2b321-968d-4582-9ada-3aa4efd5aa17', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '12586018-d468-4085-89f7-275d0295cc26', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44665fc9-90d9-4727-aaeb-6ae20c2cabda', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c18ff875-d01d-4469-886a-b8ff3b976ef1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ef951a70-68b6-4fbc-9391-0f3b532a55f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fa02b909-385d-40c3-961b-ef8368cde5c0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec234d25-aa69-4aaf-bad8-59c7cd535034', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '163e678a-a402-4e01-8516-82e17f7ffb0a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1d32ac0e-2e9c-47a6-b3be-2155f737f0b5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2142c219-77e5-4a20-8347-2d50258ac5fb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '08ab96e5-27e2-478b-b230-5298a4393232', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cf89814e-71e2-4bfb-b1bf-5a6a545f064a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1ab97f26-4bb3-447e-9eb4-5af7218a95c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2b8d45c6-d3df-452f-9498-4d7fd715cc4e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6be9a3ef-c085-451a-8a0b-b48d17b81153', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bc413e27-e960-4a3a-b1f7-a4f26a7aea11', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'efba12dd-7d45-4be6-b033-bfd41a1a29cd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dfa56564-f881-440c-8e87-1ea0d301f178', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f4e0dbfe-1c91-431b-bac9-e70d72b7c573', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ffe34cfc-8ee2-49a7-acf7-7fc23a7e8209', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b9ad29f9-7b3e-4cc6-9e83-be6f7e1f7ac3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '043ed3d7-10b6-4bd8-a133-63cfac64682a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '15c4edc3-544b-45df-af3f-2b01ca6cb72e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a1f891c3-c5ea-42dc-b3d0-765c21dfe808', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b6bf59a-a54f-44e6-b176-9f7cdd841781', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6865a3ec-5c08-497d-b9bb-b918ef0948ab', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4b8ff76f-7fab-4528-8785-1a9ded6e4ed2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '652e23bb-0e8c-4eec-baea-20fe107c8be4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c7c6352d-2841-489d-91c7-c980fd9ac98a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fef6b587-9b73-4be5-bb72-9beae2d8dc6f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ab28cc6e-2ca4-4946-9340-c1291faa7c69', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1d4081a8-5bd1-43ad-bff5-31524dda32ba', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5e5281df-1101-4750-b618-0aa81f868be7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '21e6cfe0-cb5d-4a1c-9d0e-7a5b22da3030', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3e621045-579a-43f9-81a8-3da1b8dd889d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'afbb0137-565a-4b56-8302-d99e8b9929d2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '001a996d-09ce-4be3-9a8f-d8747ea8a215', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5eb4df5-6863-419a-b7ad-c590a1935c1e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0e2079f1-b955-4300-97ae-e1cf8a7d0b42', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '911f1d31-2ac8-4eff-a7d2-430701431e8e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3fcba71e-8a0e-47bd-8e18-c79a0977558b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e443b865-2686-466c-9627-6cab7d0fd3fc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '90b89e02-432b-469c-92b2-8bdb357e066d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6fc4b14d-ed8b-4e64-85f0-fa48d6bd0c07', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bdce40b7-2794-4f54-b668-2c22659acf15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c3fb4097-e276-43f3-b38c-46701ff487dc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5e2f6fe3-ed15-426b-9842-80cc7cd1386a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fee3fcfb-ab02-4596-a547-4f03de9ba7f8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1167b966-8153-4e6d-897d-91557bd7f118', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '53ce3f56-4d73-4ed1-a675-bacb4a065c4c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ce92a02b-6b3b-4da4-99c0-f409cd30653f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '41f4eb6c-bf7e-4d33-90fd-c10091b62325', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e87ce094-e502-4e9e-862a-f0a77dfd4ea7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec2760f4-34ae-4b14-9394-bddac2ed67e2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d33aef3-ff71-448b-88f7-a8e08210329d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43538a45-3a0a-4f0f-9fcd-bf8cbcc6bd7d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8124ed6b-3d70-4422-b9c4-e2f13e052b7f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '95f432af-e2ff-4baa-b165-837be07b001e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7707f4c7-9e7d-4601-9999-5170d88357f8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7821b39a-be26-445b-b828-b3795f17bbcc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '58f1a817-4bb5-4801-874e-e614051581ea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0d5a6aca-a216-461d-a2de-7411e360919f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c23603bc-06b9-4907-91f6-6f61c2f0a12b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7d0a9fe3-55a3-462b-b6ae-f66999ca5a54', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd177fea-4d20-4136-ba0a-7e158984f249', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '82e82e02-f8d9-4862-b45a-40ef37c3f774', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b8167fdb-8561-4b68-b715-d0be8b774775', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a0ad6d6-4baa-4c2a-a610-0b69749fbb08', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6addbe04-3b33-4f77-bca9-696565ac2858', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9c750b00-c75a-4319-8cd0-950b2a871387', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a9c9cd02-f9c0-4130-8773-c06831258710', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cec5d33f-590c-4ae4-9c63-1bb7aef6c1f9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '053c613c-868e-4261-a0eb-55ce31b3786c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'fe625fb1-01c9-432c-b2f2-407fb1a83fa5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a5ccbd62-7084-4de8-aa8f-79e9ef9c47ff', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Photograph'}, 'indexTerms': {}}\n", + "{'uuid': 'e2213271-c6be-495c-9fd9-d6748a2205a5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa79d0ed-e245-4d75-8f21-41b42bd9f0b8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c8b94372-9909-4954-afdb-4394e5654954', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4c71e7de-6edb-4f53-8487-42364d1ad859', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3e3c5bc1-323e-4216-b824-74a6bcf46585', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '948aa838-7053-4694-9adb-4b59417b9ada', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8e9aa722-be2d-42a9-9a71-84fbb6f5b7f0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0fe593c7-e0b8-450c-800a-34ae17a3ff22', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '145676d4-af23-4a63-9655-a064464b65db', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '66445d4f-1bc6-4157-b479-5fbb57b99f48', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd6383606-c972-48cb-9000-002fec88c488', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9bae8dc2-cd83-4961-860f-75fc2d4ec0b6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '15915b92-2ebf-485e-a4c3-b1b559d0c325', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '692ee61d-9160-4455-891a-c7cadbf7d430', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b78125f0-a773-4dc0-a521-e0132ccdade2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c47707df-61d2-4c34-9095-df536c41c4d9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '23b35ffa-0fea-46e9-aaf5-9577c5e97e05', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ada77c97-38d4-4b8f-a06a-2a8ae90137a7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b2418936-e967-4a20-8c9b-e1593093924d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a5732b39-8287-4ab7-a5d7-87f37af1d610', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bdb5e6f9-8c0b-4570-bc85-50f73c244628', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a0c13b54-c2d6-41ce-9bfb-e942750f8c10', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '677fd313-556b-43e4-8bbc-7b06882571d1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7fac35f5-7d26-4c46-8aa9-24e388ea327e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7ddf9355-666b-4505-a8a9-bae002c91633', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '06bcbd95-f7e1-417e-9f6f-d3a611cf4bea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c1ee45dc-0dbf-46a3-a4d5-2add0a8430bd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2964608f-775a-4640-8a43-5a4a9e0a7286', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '31c92b2a-ece8-4f6b-b37b-ccd3fdbd7600', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9beefa6d-9d03-487d-9b1e-4927d4847ce9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '563d937d-bf58-4060-8475-a19ccfd04cd9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7a2278a4-fbac-42e4-916a-4070a0986bd3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '070869ec-1ca2-48ac-9e59-8b18b295cc18', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4ab8dea1-fb62-4a54-bba0-2276d48c3b03', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ae292afc-ff55-400b-819d-7bf7615c1312', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c7b1ed5d-79f1-4f3c-a04b-4705bd23fd30', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0b802ca4-78e2-4507-ac10-f123d2376169', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6f403b66-0ae0-40ba-878e-80be07fcfa76', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27b7153e-86d1-4b13-bbb4-40a5d62565fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bf25f7d8-63c2-4665-834d-0e0d4c557a41', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0442068e-d03b-4b66-addd-a19b8d7be3a4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e96c64f1-9ccd-4510-857d-6d61312080b5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4ecfe9d9-5d49-47b0-9b56-fd56ec524034', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '940ed82a-1190-47d4-9f87-b9a1d54b687f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8fd86735-232b-4ef5-bb5e-a27f663c1044', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3b19ff36-3520-47ec-b6b5-7f8bab5bf65c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '5bbaeee6-2143-4bce-ac0d-53f884183cdb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0259f110-ce33-40e7-aa6c-f4aea552aa5f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '51eb7002-43a5-4c38-8292-1af93f924b73', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b052e07f-4f63-4bab-b3fe-077ac7523903', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '46da55b9-b701-4833-98fc-ea3b6b9c490e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '42069a6a-bcd4-4db4-b819-14c8fbc869d3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'dd6c3d28-1bee-4c7a-8e6e-0bf128999019', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '99df2199-e9be-4f0b-813f-6a1d21fc0396', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '32024e0b-dc82-46e5-a5a5-3b34d3e594dd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '629c2cc1-ecb3-4ce8-a3b1-86ef201bc9a4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '329a2842-61d1-4eae-b958-2139e781d581', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a026fb2d-8169-49ce-b3be-14bc07eb2b09', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3767fbc3-4c77-4e3a-b3c5-e0cc2b58806e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e039e019-67b4-4e48-b460-69530678b55c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '56477c59-1e1d-45ea-8fee-d20a542ea58e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd9a71f3d-bd7c-47b1-a74e-ee1239b2f5ea', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3115c8c5-8e68-4e2f-9fd1-5fd023864662', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '203b8ef2-1ac9-4c1a-bcdb-320a86bfae0f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4595db70-f9fa-4d27-b553-9197d194cb79', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '734f0b3a-3640-445f-94a1-0f5ceecf54d9', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1c99be33-8f8a-4fcf-af2a-578677260d7c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd7796f6a-7be5-468b-b039-6d558ee62243', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '44a4cee6-2118-4da8-a34a-e580dd7afbc2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd06b2217-0292-49f9-8e59-2db5c3e0a999', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a1930702-0b57-4ea1-8402-e92ef5d8bf4b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e95bf27a-0ede-4732-902c-4a2c319721ca', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0483cc11-dff6-49da-a30d-ac3919315ff7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '40fac5e5-fcf6-44d5-8890-dc10fd4360e1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e96713bd-0434-446b-b20e-046475e0d6fe', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'adb5994d-5a36-4ac2-ae0b-fa7a0245dfbc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '83d28915-0de6-40c1-ac42-1e0a8f344fe5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'caa0e5d1-dec0-424a-81d1-a54771931ff6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8917b98e-3433-457a-8f17-73649c68b112', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e4a10f69-9acb-400f-91cb-fe0ed8098046', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a30d7838-4626-4be3-ba90-e6cf9f6797e3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7e7356a2-1970-404a-a6e9-c56af2264bc3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'fdbfeefd-5b6f-4d42-a953-a8ccd814ddb3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8d3b3921-5494-4edc-8eab-9b7865b62f77', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0c42609a-73a4-4870-832a-27c3c22fef7c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8511710b-a59d-45d0-abba-f48f923a5138', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b56cbae8-8304-4cda-a0e5-a9120fdf3810', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd0c9cb4-7370-46de-82d8-f10cf31c6a0e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '02ef0058-a9c3-4b6d-a5c9-326f72a5206a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6547927c-5c76-4cc8-a588-9a606b0b30ec', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'db58f770-2be3-4dc4-9d8d-9cecc8ce4329', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c49305fb-3ca7-4597-99a2-4517f33530d0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'e5fe8257-6ed3-4bf4-94a3-d5e0419046b6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '8ef30681-eada-4216-b6e0-b5057d311868', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c2485312-4a27-42bd-9d25-d4b99be49949', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b746cf8-37f8-4596-b9cc-993f813cf8a3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'af343385-dfb6-441c-97b1-73ce4b534977', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '798855cf-05ef-45d0-9f80-ac3cc6d08e3f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8a4392cb-2a88-4083-9117-8953f2d0615d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f60d3680-a27d-4052-bb72-ab66110491c6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '95ded52d-394b-467f-a6b3-0b0ad8e53048', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8386c9b8-a7ff-444a-8e6a-27dc9da263a1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ac78511d-ba92-42b6-b81e-144d5c55bb15', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '248fe70b-8e1c-4e6f-9fa5-73bc1c25508a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '138ae61c-7b60-49f4-a072-38548239752d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4d0d730f-6041-47bc-b58f-30e3b7f75146', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2dcea38b-5fb4-4f59-84b5-01050ba8c02d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b134c8ec-40f3-4cdb-8d17-a94e86074635', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3d8ba431-e4ef-49bd-9277-02be96c45607', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd61db9a3-042a-4d6a-8bc2-3417455d1aa3', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'cbbe3dca-3a9e-42e0-9906-5e444ac565c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '6a7b5cd7-1a01-40f6-b454-8baddc3b5430', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '0fd189e2-db7b-47df-b414-5dd719a9ec0e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '371d6ae2-065f-4156-8240-b5f7d51ee15d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '310a3d4c-15b8-43ea-bed6-1e0449c778e0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e8e91ad0-0c3d-4292-8dd5-34365324da71', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '06cd7078-3b10-4f28-bfb8-b5a72a5c30f5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '54db79dc-6b2e-49d4-8e05-9d3cacc6e496', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '655df0f9-1cc4-46a2-82b1-d9133e4df86b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '03d9f15e-ca14-4d18-b7d6-19592c3928b4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '0301f119-2218-44c2-8893-9c0c63dcea9c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd78225f1-1b9b-4101-b2ae-b34dfb948832', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e8797d7d-5403-45a8-b747-619ab964568b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3a679384-c581-4c13-a264-71701b6b2bfe', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4a2dae76-dcb7-4964-b9ec-81b5ac56dd67', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e494699e-c947-462b-8563-b747333c057b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bd28188f-68f4-4a62-a634-ab8c33c5368d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '98178e76-5fdc-4023-8b45-75ab5fed0894', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'b5578714-6db1-45e0-8307-9d3c78e1a1a7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9063c3c5-976e-4709-9ed8-a56e5ef6794e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '36509c5b-5d5e-4ec7-b2eb-b550465145c2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '837a550c-d002-4094-b2aa-7e3fda56494d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6e52d11e-1556-475d-adbb-a58616ec512b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bec98eeb-bcf6-41ee-b29a-652977f58bb7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'b70c4091-2b49-44ca-8625-77355efa3acd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd735e090-9e80-439c-b1db-97450edb0474', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '926988c5-9ef3-4510-aad2-a8feec644e96', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '128e870c-1644-40c4-985e-8b76cf8c3156', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '2d06bdcb-ce81-4dc7-ac30-3ccae43c0e06', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '74d078bf-2da2-4dd8-8eb5-ff9a763a3b88', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c5ee8b88-e4b1-4b0f-9d75-ca5243d3dd2f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9d80efa9-9e06-4cbc-98c1-6a8243250a6e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2900acea-86b6-472c-b969-f99bbcc9cfe4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '45583073-5c04-4992-96cc-cccbc39e5cf5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'ec5e4bdb-4aca-4230-92c9-5d0b2ab0dce5', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '27e07b25-4436-485f-b1cd-808105b6f90f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'f66f4527-db16-49e7-b751-af1ac65df6dd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '73a45c13-9b4a-4216-ad29-159b77d75bac', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6f0a394f-be6e-4d58-a423-7641197d4b45', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4f01a56b-55f5-4b87-a168-076bfb73408c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '47006b6c-45d2-4ab9-a580-bffd07fece81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6c1bef42-5307-4733-a8a2-f3e3cf31190f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '46962b98-6b44-4544-8d57-722e7d9307b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6b986684-7997-4091-9f86-82375bc8ce8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '380e2b18-8c3f-40b2-8ef9-08067ed84a8f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'aa3e2bb1-d6aa-4c99-bcc8-671191799f91', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '693bb5f2-e63e-4cec-9cd5-4e28413ca6de', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '449aaa32-3f45-4a9c-8098-79e1edebe950', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '256f54c7-c589-4450-8dae-f20873de1c33', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '44a9ab96-78df-478c-8b7f-f9ff07d84ac6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '703f1887-ed82-4b4d-bc4b-8d21cfb2ca9e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'cf228396-cde5-412e-a858-8367d89cb9fd', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2986b956-1dfc-4153-a41f-afd3b7489c57', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'c1a537cc-0b8d-4b63-9c6e-0f5c743ef448', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '2af0aebb-f6f0-40e5-9871-701924f16deb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsicatti'}, 'indexTerms': {}}\n", + "{'uuid': '393bd1bb-7165-451d-8437-258497a86ba6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e1ea9c5-a47e-4e95-828b-cf04579d624c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c9508dc1-3e40-4999-a9fd-d25e8229bf8e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9e40260b-d0d5-46c2-8d3e-cec74713b16d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '457a29d9-9dc8-4f43-ae7c-86e2dd8a2aeb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '116aff45-b173-433b-a796-1ef6ba421904', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a7d424d5-8b3c-4c1b-8f31-23998346409e', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd4a9d78c-9355-473b-959f-2ed78550c483', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4ccc142e-d901-40ce-8c9d-4e206cf88e2b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'c66ae2ef-8557-4327-95f3-dc6e13c37822', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '490a9ef7-10da-4ae7-bfd2-79c868ae8a9d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd07a0095-42db-4127-9bda-7b28d881e344', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '330c93ad-0c82-4818-83ec-6945bf6c2808', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '18e8059f-5708-42e2-a973-0acace7a1faa', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '0b304d47-598b-48b8-8f00-73237902be9d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '0ce9c6fd-515a-489a-8add-4670d83c6077', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '940e7a47-c9aa-44fb-82d1-68773c57ddc8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a76e81a7-f3da-4857-961d-19833fd6b48c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1b18692f-00eb-47b3-82bc-0c19e590bf25', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e5c8a60f-25a3-455a-af06-87ed4d5ed8e0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e74bfde6-dc5c-469f-bfe3-cd9e12fff0da', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '280bb1a6-b4e0-4fdd-9b2f-9aaae566668d', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '891ba660-dbb5-49ae-ae89-1581a6509ccc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '1f4f98e1-09e0-4a83-b2df-49408e9fadb2', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'edf82fd3-9329-4512-b2e5-3703c5b43bb1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c99a4170-7d65-4ff4-8f61-6d3adfb58d81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '67533590-cc52-4cb8-ae53-37075d38e6b1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '604dcc9b-e059-44f0-a442-ef4337912fe4', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '9025700c-123f-4c4f-a5d2-44605aeaefa7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '43591725-d66b-43e7-af31-1950a4f26aee', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bb0095fa-ecd7-45de-8ada-46801d72b3fe', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'c77726a1-07ed-4db1-8853-9dcec992bbf7', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '8b440b1b-f6f9-4e00-8723-e33e50513d73', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': '56a54ee4-fed6-4b8a-9684-8fd0fa8cafa8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '3a789441-d3fe-4e70-ba78-df78d6776b7f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'b5ba7412-86d7-4e1d-a310-7d9be5271062', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '68e5265e-e703-42e8-9af5-729134dda9c0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3804bd07-1367-468c-aa2c-2d1510437170', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1ba1daa9-a532-48a9-9694-1cab2f226f6f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7eae3d76-0680-45b9-8e84-05524568832a', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '53c54fcf-213d-432c-a9f7-dd00334d4851', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '3c1516ec-3f2b-42f6-852c-ed8b1667bd1b', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '409615ad-25a4-4b39-8d15-5fb01febdffe', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2d23dc05-d184-4765-838e-3bed14b0d097', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'e3a87800-49bc-4c45-b1d2-eb84ada73acb', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'a551f092-755b-4a83-acc4-fd41195956b0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'materialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'd567ca4f-9aaa-4fa4-a0fc-c368903f1838', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsicatti'}, 'indexTerms': {}}\n", + "{'uuid': '6af1f12a-504a-4c3f-9ab1-5cc1ba715eb6', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6b614526-0369-43a8-8aa1-c9e334d59c17', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'bf0daf10-9083-463f-82e3-5e1e954f8b66', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '7e67d56b-013c-4692-955c-698ea7a80227', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '46f6b6f4-a64a-4773-b590-bff388845aaf', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '1decaa59-9997-4d7b-93c4-064863c38449', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'd01d23e9-bc8a-4387-91f4-972a5d486f57', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '89a5c759-c4c5-437d-b777-12d119c3d99c', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '2729d053-85a3-4f44-b534-cd63283dfad0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'a76ff801-acbd-4f40-8c27-a3ab42725f45', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'ebaa6460-03a1-4b36-b616-2c83bd4ec44f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '814caa3f-737e-4223-aa87-f48fea3d45af', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '6b8f976e-8d9a-4047-91db-490a5f64f99f', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'adbb97fd-115d-46ca-bc8c-4f18cb919d81', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': 'a03919c9-8555-4aa1-aaa9-fb76f3177206', 'type': 'records', 'data': {'dwc:basisOfRecord': 'Exsiccati'}, 'indexTerms': {}}\n", + "{'uuid': '4ae1359e-98e7-48fe-96ac-cec126fc7bcc', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4263dc64-97a9-40b9-8db3-9bd2126141e0', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '4e61fa09-a515-4d82-b6dc-db51ba0d0d31', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': '1e934c7b-bfc0-41ee-9964-6e1490715df8', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n", + "{'uuid': 'aa6bf1b6-774d-4146-8ce4-65a23b71b4c1', 'type': 'records', 'data': {'dwc:basisOfRecord': 'MaterialSample'}, 'indexTerms': {}}\n" + ] + } + ], + "source": [ + "for each in record_list[\"items\"]:\n", + " if \"dwc:basisOfRecord\" in each[\"data\"]:\n", + " if each[\"data\"][\"dwc:basisOfRecord\"] not in dont_count_list:\n", + " print (each)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# known bad values in basisOfRecord (we are looking for new good values)\n", + "dont_count_list=['Occurrence','MaterialSample']\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are some of the other values providers have used." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Plants of the Mono Lake Basin', 'Exsiccati', 'Plants of Colorado', 'Exsicatti', 'Native and Naturalized Flora of', 'FieldBook', 'Plants of Jefferson County Open', 'Photograph', 'materialSample'}\n" + ] + } + ], + "source": [ + "found_basisOfRecord_values = set()\n", + "for each in record_list[\"items\"]:\n", + " if \"dwc:basisOfRecord\" in each[\"data\"]:\n", + " if each[\"data\"][\"dwc:basisOfRecord\"] not in dont_count_list:\n", + " found_basisOfRecord_values.add(each[\"data\"][\"dwc:basisOfRecord\"])\n", + "\n", + "print(found_basisOfRecord_values)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/scripts/data-ingestion-status-report.py b/scripts/data-ingestion-status-report.py index 3c858628..99209a45 100644 --- a/scripts/data-ingestion-status-report.py +++ b/scripts/data-ingestion-status-report.py @@ -105,8 +105,7 @@ https://www.idigbio.org/wiki/index.php/Data_Ingestion_Report (login required) -https://www.idigbio.org/redmine/projects/data-mobilization/issues -https://github.com/vertnet/tasks +https://redmine.idigbio.org/projects/data-mobilization-and-ingestion-including-via-symbiota-support-hub ''' diff --git a/setup.py b/setup.py index 0651377d..dd59a783 100644 --- a/setup.py +++ b/setup.py @@ -1,24 +1,23 @@ -import os +from os import path import re import sys from setuptools import setup, find_packages -from codecs import open - def read(*paths): """Build a file path from *paths* and return the contents.""" - with open(os.path.join(*paths), 'r', 'utf-8') as f: + with open(path.join(*paths), 'r', encoding='utf-8') as f: return f.read() readme = read('README.md') version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', - read(os.path.join(os.path.dirname(__file__), 'idb/__init__.py')), re.MULTILINE).group(1) + read(path.join(path.dirname(__file__), 'idb/__init__.py')), re.MULTILINE).group(1) -# Abort if on Python 3 since we know the codebase does not support it. -if sys.version_info >= (3,0): - sys.exit("idb-backend: Python 3 is not supported. Consider passing '-p python2.7' when creating the venv.") +# Abort if not on Python 3 since we know the codebase does not support it. +if sys.version_info < (3,0): + sys.exit("idb-backend: Python 2 is not supported in this branch.") +# TODO: revisit this after migrate to Python 3 # Pillow-SIMD causes segfault on newer Python 2. # We do not yet support Python 3. # Only install Pillow-SIMD where it is known to work, otherwise @@ -29,6 +28,10 @@ def read(*paths): else: pillow_package = "pillow-simd>=3.4,<=5.1.1" + # setup_requires=["cffi>=1.0.0"], + # cffi_modules=["package/foo_build.py:ffibuilder"], + # install_requires=["cffi>=1.0.0"], + setup( name='idb-backend', version=version, @@ -40,6 +43,7 @@ def read(*paths): author_email='idigbio@acis.ufl.edu', packages=find_packages(exclude=['tests*']), setup_requires=['pytest-runner'], + # setup_requires=["pytest-runner","cffi>=1.0.0"], install_requires=[ 'idigbio>=0.8.2', 'psycopg2-binary>=2.8.3', @@ -51,20 +55,21 @@ def read(*paths): 'pytz>=2016.10', 'requests==2.20.0', 'urllib3<1.25,>=1.21.1', - 'pycrypto', - 'flask>=0.11.0, <1.0.0', + 'pycrypto', + 'flask==1.1.2', 'Flask-UUID', 'Flask-CORS', 'coverage', 'numpy', 'scipy', - 'gevent>=1.1.0, <1.2.0', + 'gevent>=1.3.6', + 'greenlet>=0.4.14', 'gipc>=0.6.0, <0.7.0', 'unicodecsv>=0.14.1, < 0.15.0', 'shapely', 'celery[redis]>=4.0, <4.3', 'boto>=2.39.0, <3.0.0', - 'fiona', + 'fiona==1.8.20', 'python-magic>=0.4.11, <=0.5.0', 'feedparser>=5.2.0', 'click>=6.3, <7.0', @@ -73,19 +78,23 @@ def read(*paths): 'path.py>=10.0.0, <11', 'wsgi-request-logger>=0.4.6', 'jsonlines>=1.1.3', + 'wheel', + 'itsdangerous==2.0.1', + 'jinja2<3.1.0', + 'werkzeug==2.0.3' ], extras_require={ 'ingestion': [ 'pydub==0.16.5', - pillow_package, + 'Pillow==6.1.0', 'lxml', - 'chardet', + 'chardet~=3.0', 'pyquery>=1.2', ], 'test': [ - 'pytest>=3.0', + 'pytest~=4.0', 'pytest-cov', - 'pytest-flask', + 'pytest-flask~=0.15', 'pytest-mock==1.13.0', 'fakeredis', ] @@ -101,7 +110,7 @@ def read(*paths): 'License :: OSI Approved :: MIT License', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.6', ], entry_points=''' [console_scripts] diff --git a/tests/README.md b/tests/README.md index 3058d1bc..bdf30e9b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,4 +1,6 @@ -## tests +# Tests + +## Layout The current convention for idb-backend is that tests will live in a separate directory tree but will mimic the codebase structure. @@ -88,4 +90,165 @@ test_data_exists.py::test_pngpath_is_usable PASSED ``` -More on pytest at https://docs.pytest.org/en/latest/usage.html \ No newline at end of file +To exclude a single set of tests that are failing (or Seg Faulting!), add the `--deselect` option to the pytest command: + + py.test --deselect=tests/idigbio_ingestion/mediaing/test_derivatives.py + +To find out why tests are being Skipped, add the `-rxs` options. + + +More on pytest at https://docs.pytest.org/en/latest/usage.html + + +## Dependencies + +Some idb-backend tests depend on external resources, such as a local test postgres database or the production Elasticsearch cluster. + +* Database tests will be SKIPPED if the local postgres test database is not available. + +* Tests that depend on Elasticsearch will FAIL if the Elasticsearch cluster cannot be reached (fail very slowly in fact), or if there is some other failure. + +Due to network access control it might be necessary to use ssh port forwarding. + +``` +# replace ELASTICSEARCH_CLUSTER_NODE_IP, USER, SSH_HOST with real values. +$ ssh -nNT -L 9200:ELASTICSEARCH_CLUSTER_NODE_IP:9200 USER@SSH_HOST +``` + + +The local postgresql DB is named `test_idigbio` with user/pass `test` / `test`. + +Note: The data in the db with that name will be destroyed during testing. + +A temporary instance of postgres running in docker will suffice: + +``` +$ docker run --rm --name postgres_test_idigbio --network host -e POSTGRES_PASSWORD=test -e POSTGRES_USER=test -e POSTGRES_DB=test_idigbio -d postgres:14 +``` + +### WIP: run Elasticsearch in local docker the same way we run postgres + +Depending on a live cluster for running tests is problematic for a number of reasons, including inconsistent behavior of test runs (see github issue https://github.com/iDigBio/idb-backend/issues/129). + +Consider running elasticsearch the same way we run postrgres... + +``` +$ docker pull docker.elastic.co/elasticsearch/elasticsearch:5.5.3 +$ docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:5.5.3 +``` + +One challenge is the test suite expects mappings, etc. to be present. + +The ES 5.x image requires HTTP basic auth credentials. For example, to use curl with basic auth supply them via `-u` with the default username and password: + +``` +$ curl -u elastic:changeme http://localhost:9200/_cat/indices +``` + +TODO: + +1. Change default password when running container +2. Have tests connect to localhost instead of the ES cluster that exists in CONFIG. +3. possibly pre-load a bunch of data / index. +4. possibly have that pre-loaded docker image available in docker-library + +## Running All Tests + +Due to the dependencies mentioned above, you may wish to run the database in docker each time. The sleep is needed to allow postgres time to start accepting connections. + + docker run --rm --name postgres_test_idigbio --network host \ + -e POSTGRES_PASSWORD=test -e POSTGRES_USER=test -e POSTGRES_DB=test_idigbio \ + -d postgres:14 && \ + sleep 5; \ + py.test ; \ + docker stop postgres_test_idigbio + + + +## Local database + +The recommended approach is to run postgres via docker (see above). + +### Create a local postgres DB + +However, if you have a full installation of postgres running locally that you wish to use, the db can be manually created with: + + createuser -l -e test -P + createdb -l 'en_US.UTF-8' -E UTF8 -O test -e test_idigbio; + + # The schema obj is still owned by the user of the above + # statement, not the owner 'test'. Drop it so it will be recreated + # by the script appropriately + psql -c "DROP SCHEMA public CASCADE;" test_idigbio + + +### Schema + +The live production db schema is copied into `tests/data/schema.sql` by periodically running this command: + + pg_dump --host c18node8.acis.ufl.edu --username idigbio \ + --format plain --schema-only --schema=public \ + --clean --if-exists \ + --no-owner --no-privileges --no-tablespaces --no-unlogged-table-data \ + --file tests/data/schema.sql \ + idb_api_prod + +Except not yet because there are lots of differences between the existing file and one created by running that command (due to fixes for https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path). + + +### Data + +A trimmed down set of data has been manually curated to support the test suite. It is provided in `tests/data/testdata.sql` + +The full dump / original was created with something like: + + pg_dump --port 5432 --host c18node8.acis.ufl.edu --username idigbio \ + --format plain --data-only --encoding UTF8 \ + --inserts --column-inserts --no-privileges --no-tablespaces \ + --verbose --no-unlogged-table-data \ + --exclude-table-data=ceph_server_files \ + --file tests/data/testdata.sql idb_api_prod + +Such a dump is huge and un-usable and un-editable by normal means. It is not clear how the dump was transformed / curated into its current state. + +If running the dump again, consider adding multiple `--exclude-table-data=TABLE` for some of the bigger tables that are not materially relevant to test suite such as: + +```plaintext +annotations +data +corrections +ceph_server_files +``` + +We likely need to find a new way to refresh the test dataset. + + +## Code Coverage + +To track code coverage while running test suite: + +``` +$ coverage run -m pytest +``` + +To view the coverage report: + +``` +$ coverage report +Name Stmts Miss Cover +----------------------------------------------------------------------- +idb/__init__.py 1 0 100% +idb/annotations/__init__.py 0 0 100% +idb/annotations/apply.py 21 21 0% +idb/annotations/epandda_fetcher.py 29 29 0% +idb/annotations/loader.py 30 30 0% +idb/blacklists/__init__.py 0 0 100% +idb/blacklists/derivatives.py 1 0 100% +idb/cli.py 19 7 63% +idb/clibase.py 60 28 53% +idb/config.py 37 1 97% +idb/corrections/__init__.py 0 0 100% +idb/corrections/loader.py 30 30 0% +idb/corrections/record_corrector.py 79 79 0% +... +``` diff --git a/tests/idb/conftest.py b/tests/idb/conftest.py index f4f7f0d0..07ca2b7e 100644 --- a/tests/idb/conftest.py +++ b/tests/idb/conftest.py @@ -2,6 +2,7 @@ import gevent import os import sys +from importlib import reload @pytest.fixture def app(testdbpool, testdata, logger): diff --git a/tests/idb/test_data_api_basic.py b/tests/idb/test_data_api_basic.py index fc3ff087..414c150d 100644 --- a/tests/idb/test_data_api_basic.py +++ b/tests/idb/test_data_api_basic.py @@ -17,7 +17,7 @@ def test_app_db(client): def test_version(client): r = client.get(url_for('version')) assert r.status_code == 200 - assert r.data == idb.__version__ + assert str(r.data, "utf-8") == idb.__version__ @pytest.mark.readonly diff --git a/tests/idb/test_data_api_downloads.py b/tests/idb/test_data_api_downloads.py index 42910235..a05824a9 100644 --- a/tests/idb/test_data_api_downloads.py +++ b/tests/idb/test_data_api_downloads.py @@ -6,7 +6,8 @@ import gevent import udatetime -from udatetime.rfc3339 import from_rfc3339_string +from udatetime import from_string + import pytest from flask import url_for @@ -21,7 +22,7 @@ @pytest.fixture() def fakeredcli(request): import fakeredis - fsr = fakeredis.FakeStrictRedis() + fsr = fakeredis.FakeStrictRedis(decode_responses=True) v2_download.get_redis_conn = lambda: fsr request.addfinalizer(fsr.flushall) return fsr @@ -75,7 +76,11 @@ def setupredis(client, tid=None, task_status=None, download_url=None, error=None redisdata['download_url'] = download_url if error: redisdata['error'] = error - client.hmset(rtkey, redisdata) + # hmset creates redis a hash key b'downloader:ab219ed4-78fc-4433-8ea1-c350fb47b645' + # that contains all of the key value pairs from redisdata as bytes such as: + # b'created':b'2021-01-19T14:14:46.528067+00:00', + # b'task_status':b'SUCCESS' + client.hmset(rtkey, redisdata) client.expire(rtkey, timedelta(hours=1)) if link: rqhk = DOWNLOADER_TASK_PREFIX + redisdata['hash'] @@ -86,13 +91,14 @@ def setupredis(client, tid=None, task_status=None, download_url=None, error=None def test_status_complete_task(client, fakeredcli): tid = setupredis(fakeredcli, task_status="SUCCESS", download_url="http://example.com") + # client is Flask client! resp = client.get(url_for('idb.data_api.v2_download.status', tid=tid)) assert resp.status_code == 200 assert resp.json['download_url'] == "http://example.com" assert resp.json['complete'] is True assert resp.json['task_status'] == 'SUCCESS' - assert from_rfc3339_string(resp.json['created']) - assert from_rfc3339_string(resp.json['expires']) + assert from_string(resp.json['created']) + assert from_string(resp.json['expires']) assert 'error' not in resp.json @@ -103,8 +109,8 @@ def test_status_pending_task(client, fakeredcli, fakeresult): assert resp.status_code == 200 assert resp.json['task_status'] == "PENDING" assert resp.json['complete'] is False - assert from_rfc3339_string(resp.json['created']) - assert from_rfc3339_string(resp.json['expires']) + assert from_string(resp.json['created']) + assert from_string(resp.json['expires']) assert 'download_url' not in resp.json assert 'error' not in resp.json @@ -118,8 +124,8 @@ def test_status_pending_now_success(client, fakeredcli, fakeresult): assert resp.json['download_url'] == "http://foo/bar" assert resp.json['complete'] is True assert resp.json['task_status'] == 'SUCCESS' - assert from_rfc3339_string(resp.json['created']) - assert from_rfc3339_string(resp.json['expires']) + assert from_string(resp.json['created']) + assert from_string(resp.json['expires']) assert 'error' not in resp.json @@ -132,8 +138,8 @@ def test_status_pending_now_failure(client, fakeredcli, fakeresult): assert resp.json['error'] == "woot" assert resp.json['complete'] is True assert resp.json['task_status'] == 'FAILURE' - assert from_rfc3339_string(resp.json['created']) - assert from_rfc3339_string(resp.json['expires']) + assert from_string(resp.json['created']) + assert from_string(resp.json['expires']) assert 'download_url' not in resp.json gevent.wait() assert tid != fakeredcli.get(DOWNLOADER_TASK_PREFIX + resp.json['hash']), \ @@ -150,8 +156,8 @@ def test_status_pending_now_failure_already_unlinked(client, fakeredcli, fakeres assert resp.json['error'] == "woot" assert resp.json['complete'] is True assert resp.json['task_status'] == 'FAILURE' - assert from_rfc3339_string(resp.json['created']) - assert from_rfc3339_string(resp.json['expires']) + assert from_string(resp.json['created']) + assert from_string(resp.json['expires']) assert 'download_url' not in resp.json assert "woot" == fakeredcli.get(DOWNLOADER_TASK_PREFIX + "foobar") @@ -167,6 +173,7 @@ def test_initialization(client, fakeredcli, fakeresult): assert 'status_url' in resp.json tid = resp.json['status_url'].split('/')[-1] data = fakeredcli.hgetall(DOWNLOADER_TASK_PREFIX + tid) + # At this point, data contains keys that are bytes aka data[b'query'] assert data assert len(data) != 0 assert data['query'] diff --git a/tests/idb/test_data_api_media.py b/tests/idb/test_data_api_media.py index 129e0d8d..0d4f593a 100644 --- a/tests/idb/test_data_api_media.py +++ b/tests/idb/test_data_api_media.py @@ -18,7 +18,8 @@ def valid_auth_header(mocker): mocker.patch.object(idb_flask_authn, 'check_auth', return_value=True) uuid = "872733a2-67a3-4c54-aa76-862735a5f334" key = "3846c98586668822ba6d5cb69caeb4c6" - return ('Authorization', 'Basic ' + base64.b64encode("{}:{}".format(uuid, key))) + authstring = base64.b64encode(bytes(f"{uuid}:{key}", 'utf-8')).decode('utf-8') + return ('Authorization', 'Basic ' + authstring) @pytest.fixture() diff --git a/tests/idb/test_helpers_conversions.py b/tests/idb/test_helpers_conversions.py index 3098b598..6fa6b198 100644 --- a/tests/idb/test_helpers_conversions.py +++ b/tests/idb/test_helpers_conversions.py @@ -13,6 +13,15 @@ def test_get_exponent(self): for i,exp in enumerate(exponents): self.assertEqual(i, conversions.getExponent(exp)) +class TestCheckBounds(unittest.TestCase): + def test_check_bounds(self): + bad_past_date = datetime.datetime(1500, 1, 1, tzinfo=pytz.utc) + bad_future_date = datetime.datetime.now(pytz.utc) + datetime.timedelta(100) + good_past_date = datetime.datetime(1700, 12, 12, tzinfo=pytz.utc) + self.assertEqual(True, conversions.checkBounds(bad_past_date)) + self.assertEqual(True, conversions.checkBounds(bad_future_date)) + self.assertEqual(False, conversions.checkBounds(good_past_date)) + class TestSetFlags(unittest.TestCase): def test_set_flags(self): @@ -22,7 +31,7 @@ def test_set_flags_returns_list_for_dict(self): self.assertEqual(['geopoint_similar_coord'], conversions.setFlags({'geopoint': [-38, 38]})) def test_set_flags_returns_list_for_dict_case_2(self): - self.assertEqual(['geopoint_similar_coord', 'geopoint_0_coord'], conversions.setFlags({'geopoint': [0, 0]})) + self.assertEqual(sorted(['geopoint_similar_coord', 'geopoint_0_coord']), sorted(conversions.setFlags({'geopoint': [0, 0]}))) def test_set_flags_returns_list_for_dict_case_3(self): self.assertEqual(['datecollected_bounds'], conversions.setFlags({'datecollected': datetime.date(1000,1,2)})) @@ -208,7 +217,7 @@ def test_date_grabber_year_month_day_fallback(self): } self.assertEqual({ "datemodified": datetime.datetime(2014, 1, 10, tzinfo=pytz.utc), - "datecollected": datetime.date(2014,01,10), + "datecollected": datetime.date(2014, 1, 10), "startdayofyear": 10, }, conversions.dateGrabber("records", r)) @@ -264,7 +273,7 @@ def test_scientific_name_filler(self): class TestGrabAll(unittest.TestCase): - def test_grab_all(self): + def test_grab_all_on_record(self): r = { "idigbio:uuid": "0000012b-9bb8-42f4-ad3b-c958cb22ae45", "idigbio:etag": "cb7d64ec3aef36fa4dec6a028b818e331a67aacc", @@ -387,6 +396,49 @@ def test_grab_all(self): self.assertEqual(output['hasImage'], True) self.assertEqual(output['hasMedia'], True) + def test_grab_all_on_mediarecord(self): + r = { + "uuid": "256098cf-723d-4633-a827-7fbf60a103ec", + "type": "mediarecords", + "etag": "5da26d3ee501516557689e55e1b1dd6c195414a2", + "data": { + "dcterms:type": "StillImage", + "ac:providerManagedID": "urn:uuid:21943c26-e2d2-49d8-8626-18f1d5eeb56d", + "ac:subtype": "Photograph", + "ac:metadataLanguage": "en", + "xmpRights:UsageTerms": "CC BY-NC-SA (Attribution-NonCommercial-ShareAlike)", + "ac:thumbnailAccessURI": "https://bryophyteportal.org/imglib/storage/srp/bryophytes/SRP-B-0000/SRP-B-0000026_tn.jpg", + "dcterms:format": "image/jpeg", + "ac:goodQualityAccessURI": "https://bryophyteportal.org/imglib/storage/srp/bryophytes/SRP-B-0000/SRP-B-0000026.JPG", + "coreid": "2212837", + "dcterms:identifier": "https://bryophyteportal.org/imglib/storage/srp/bryophytes/SRP-B-0000/SRP-B-0000026_lg.jpg", + "xmpRights:Owner": "Boise State University Lichen Herbarium (SRP)", + "dcterms:rights": "http://creativecommons.org/licenses/by-nc/3.0/", + "ac:accessURI": "https://bryophyteportal.org/imglib/storage/srp/bryophytes/SRP-B-0000/SRP-B-0000026_lg.jpg", + "xmp:MetadataDate": "2013-06-05 23:10:50", + "ac:associatedSpecimenReference": "https://bryophyteportal.org/portal/collections/individual/index.php?occid=2212837" + } + } + d = copy.deepcopy(r["data"]) + output = conversions.grabAll("mediarecords", d) + self.assertListEqual([],output['flags']) + self.assertGreaterEqual(output['dqs'], 0.0) + self.assertLessEqual(output['dqs'], 1.0) + + def test_grab_all_on_publisher(self): + r = { + "auto_publish": "false", + "base_url": "null", + "name": "FCC Tardigrades Darwin Core Archive rss feed", + "publisher_type": "rss", + "recordsets": {}, + "rss_url": "https://mywaterbears.org/portal/content/dwca/rss.xml" + } + + output = conversions.grabAll("publishers", r) + self.assertListEqual([],output['flags']) + self.assertGreaterEqual(output['dqs'], 0.0) + self.assertLessEqual(output['dqs'], 1.0) class TestGetfield(unittest.TestCase): def test_getfield(self): diff --git a/tests/idb/test_helpers_memoize.py b/tests/idb/test_helpers_memoize.py index 2bf98995..a3c25bbe 100644 --- a/tests/idb/test_helpers_memoize.py +++ b/tests/idb/test_helpers_memoize.py @@ -16,7 +16,7 @@ def foo(): assert foo() == 1 -@pytest.mark.parametrize('strat', ['error', 'cPickle', 'call']) +@pytest.mark.parametrize('strat', ['error', 'pickle', 'call']) def test_hashable_arg(strat): callcount = [0] @@ -73,10 +73,10 @@ def foo(d): assert foo([0]) == 0 -def test_unhashable_arg_cPickle(): +def test_unhashable_arg_pickle(): callcount = [0] - @memoized('cPickle') + @memoized('pickle') def foo(d): callcount[0] += 1 return d[0] diff --git a/tests/idb/test_helpers_storage.py b/tests/idb/test_helpers_storage.py index 89351f47..cd203573 100644 --- a/tests/idb/test_helpers_storage.py +++ b/tests/idb/test_helpers_storage.py @@ -48,7 +48,7 @@ def test_download_md5_validation(store, existingkey, tmpdir): def test_file_upload_download(store, bucketname, tmpdir): k = store.upload(store.get_key('foobar', bucketname), __file__, content_type="x-foo/bar", public=False) localmd5 = calcFileHash(__file__) - assert k.md5 == localmd5 + assert k.md5.decode('utf-8') == localmd5 k2 = store.get_key('foobar', bucketname) assert k2.exists() diff --git a/tests/idigbio_ingestion/lib/test_dwca.py b/tests/idigbio_ingestion/lib/test_dwca.py new file mode 100644 index 00000000..7a13eab6 --- /dev/null +++ b/tests/idigbio_ingestion/lib/test_dwca.py @@ -0,0 +1,70 @@ +import pytest +from copy import deepcopy +from idigbio_ingestion.lib.dwca import get_unescaped_fieldsEnclosedBy +from idigbio_ingestion.lib.dwca import get_unescaped_fieldsTerminatedBy +from idigbio_ingestion.lib.dwca import get_unescaped_linesTerminatedBy + + +# sample extracted during processing of recordset c38b867b-05f3-4733-802e-d8d2d3324f84 +FILEDICT_BASE = { + 'files': {'location': 'occurrence.txt'}, + '#linesTerminatedBy': '\\n', + '#ignoreHeaderLines': '1', + '#fieldsEnclosedBy': '', + 'id': {'#index': '0'}, + 'field': [ + {'#index': '1', '#term': 'http://purl.org/dc/terms/modified'}, + {'#index': '2', '#term': 'http://rs.tdwg.org/dwc/terms/institutionCode'}, + {'#index': '3', '#term': 'http://rs.tdwg.org/dwc/terms/collectionCode'}, + {'#index': '4', '#term': 'http://rs.tdwg.org/dwc/terms/basisOfRecord'}, + {'#index': '5', '#term': 'http://rs.tdwg.org/dwc/terms/occurrenceID'}, + {'#index': '6', '#term': 'http://rs.tdwg.org/dwc/terms/catalogNumber'}, + {'#index': '7', '#term': 'http://rs.tdwg.org/dwc/terms/recordedBy'}, + {'#index': '8', '#term': 'http://rs.tdwg.org/dwc/terms/preparations'}, + {'#index': '9', '#term': 'http://rs.tdwg.org/dwc/terms/otherCatalogNumbers'}, {'#index': '10', '#term': 'http://rs.tdwg.org/dwc/terms/eventDate'}, {'#index': '11', '#term': 'http://rs.tdwg.org/dwc/terms/year'}, {'#index': '12', '#term': 'http://rs.tdwg.org/dwc/terms/month'}, {'#index': '13', '#term': 'http://rs.tdwg.org/dwc/terms/day'}, {'#index': '14', '#term': 'http://rs.tdwg.org/dwc/terms/fieldNumber'}, {'#index': '15', '#term': 'http://rs.tdwg.org/dwc/terms/eventRemarks'}, {'#index': '16', '#term': 'http://rs.tdwg.org/dwc/terms/higherGeography'}, {'#index': '17', '#term': 'http://rs.tdwg.org/dwc/terms/continent'}, {'#index': '18', '#term': 'http://rs.tdwg.org/dwc/terms/country'}, {'#index': '19', '#term': 'http://rs.tdwg.org/dwc/terms/stateProvince'}, {'#index': '20', '#term': 'http://rs.tdwg.org/dwc/terms/county'}, {'#index': '21', '#term': 'http://rs.tdwg.org/dwc/terms/locality'}, {'#index': '22', '#term': 'http://rs.tdwg.org/dwc/terms/minimumDepthInMeters'}, {'#index': '23', '#term': 'http://rs.tdwg.org/dwc/terms/maximumDepthInMeters'}, {'#index': '24', '#term': 'http://rs.tdwg.org/dwc/terms/decimalLatitude'}, {'#index': '25', '#term': 'http://rs.tdwg.org/dwc/terms/decimalLongitude'}, {'#index': '26', '#term': 'http://rs.tdwg.org/dwc/terms/geodeticDatum'}, {'#index': '27', '#term': 'http://rs.tdwg.org/dwc/terms/georeferencedDate'}, {'#index': '28', '#term': 'http://rs.tdwg.org/dwc/terms/georeferenceProtocol'}, {'#index': '29', '#term': 'http://rs.tdwg.org/dwc/terms/identificationQualifier'}, {'#index': '30', '#term': 'http://rs.tdwg.org/dwc/terms/typeStatus'}, {'#index': '31', '#term': 'http://rs.tdwg.org/dwc/terms/scientificName'}, {'#index': '32', '#term': 'http://rs.tdwg.org/dwc/terms/kingdom'}, {'#index': '33', '#term': 'http://rs.tdwg.org/dwc/terms/phylum'}, {'#index': '34', '#term': 'http://rs.tdwg.org/dwc/terms/class'}, {'#index': '35', '#term': 'http://rs.tdwg.org/dwc/terms/order'}, {'#index': '36', '#term': 'http://rs.tdwg.org/dwc/terms/family'}, {'#index': '37', '#term': 'http://rs.tdwg.org/dwc/terms/genus'}, {'#index': '38', '#term': 'http://rs.tdwg.org/dwc/terms/specificEpithet'}, {'#index': '39', '#term': 'http://rs.tdwg.org/dwc/terms/infraspecificEpithet'} + ], + '#fieldsTerminatedBy': '\\t', + '#encoding': 'UTF-8', + '#rowType': 'http://rs.tdwg.org/dwc/terms/Occurrence'} + +@pytest.fixture +def filedict_fieldsEnclosedBy_nothing(): + filedict = deepcopy(FILEDICT_BASE) + return filedict + +@pytest.fixture +def filedict_fieldsEnclosedBy_escapeddoublequotes(): + filedict = deepcopy(FILEDICT_BASE) + filedict['#fieldsEnclosedBy'] = '\"' + return filedict + +@pytest.fixture +def filedict_fieldsTerminatedBy_tab(): + filedict = deepcopy(FILEDICT_BASE) + filedict['#fieldsTerminatedBy'] = '\\t' + return filedict + +def test_get_unescaped_linesTerminatedBy_from_filedict(): + assert(get_unescaped_linesTerminatedBy(FILEDICT_BASE) == '\n') + +def test_get_unescaped_fieldsTerminatedBy_from_filedict(filedict_fieldsTerminatedBy_tab): + assert(get_unescaped_fieldsTerminatedBy(filedict_fieldsTerminatedBy_tab) == '\t') + +def test_get_unescaped_fieldsEnclosedBy_from_filedict(filedict_fieldsEnclosedBy_escapeddoublequotes): + assert(get_unescaped_fieldsEnclosedBy(filedict_fieldsEnclosedBy_escapeddoublequotes) == '"') + + +@pytest.fixture +def dwca_schema(): + # sample xml schema document goes here! + # or read from the data dir. + return "xmldoc something something" + +@pytest.mark.skip(reason="dwca.py needs refactoring") +def test_dwca_schema_parse(): + assert(False) + + +@pytest.mark.skip(reason="dwca.py needs refactoring") +def test_something_about_finding_extensions(): + assert(False) diff --git a/tests/idigbio_ingestion/lib/test_eml.py b/tests/idigbio_ingestion/lib/test_eml.py index 21d5ac46..cf961bca 100644 --- a/tests/idigbio_ingestion/lib/test_eml.py +++ b/tests/idigbio_ingestion/lib/test_eml.py @@ -26,9 +26,7 @@ ("vertnet_sui_verts.xml", "CC0"), # cc zero and vertnet norms #("usgs_pwrc_northamerican_bees", "No license, assume Public Domain"), # this is an html file that should not parse, currently raising an untrapped Exception ]) - - def test_intellectual_rights(eml_filename, expected_license, emlpathdir): - emlfile = emlpathdir.join(eml_filename).open() - parsed_eml = parseEml('id_placeholder_test_suite', emlfile.read()) + emlfilename = emlpathdir.join(eml_filename) + parsed_eml = parseEml('id_placeholder_test_suite', emlfilename) assert parsed_eml['data_rights'] == expected_license diff --git a/tests/idigbio_ingestion/mediaing/test_derivatives.py b/tests/idigbio_ingestion/mediaing/test_derivatives.py index d20145d3..d0ced69f 100644 --- a/tests/idigbio_ingestion/mediaing/test_derivatives.py +++ b/tests/idigbio_ingestion/mediaing/test_derivatives.py @@ -4,7 +4,7 @@ import pytest import uuid from collections import namedtuple -from cStringIO import StringIO +from io import BytesIO from idigbio_ingestion.mediaing import derivatives @@ -39,7 +39,7 @@ def get_contents_to_file(self, buff): @pytest.fixture() def rand_etag(): - return unicode(uuid.uuid4()) + return str(uuid.uuid4()) @pytest.fixture() @@ -57,6 +57,7 @@ def existing_CheckItem(rand_etag): @pytest.fixture() def nonexisting_CheckItem(rand_etag): + # this "etag" is in the form of a uuid etag = rand_etag bucket = 'images' bucketbase = "idigbio-{0}-{1}".format(bucket, 'test') @@ -165,7 +166,7 @@ def test_generate_all_nonempty(nonexisting_CheckItem, monkeypatch, img): def test_zero_waveform(): - buff = StringIO(b'\xff\xfbT\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x00\x02\x00\x00\x02@\x00\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x009LAME3.98r\x01\xa5\x00\x00\x00\x00-\xfe\x00\x00\x14@$\x06\xb8\xc2\x00\x00@\x00\x00\x02@\xfa%]^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfbT\xc4\x00\x03\xc0\x00\x01\xa4\x00\x00\x00 \x00\x004\x80\x00\x00\x04LAME3.98.4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\xff\xfbT\xc4U\x83\xc0\x00\x01\xa4\x00\x00\x00 \x00\x004\x80\x00\x00\x04UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU') + buff = BytesIO(b'\xff\xfbT\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x00\x02\x00\x00\x02@\x00\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x009LAME3.98r\x01\xa5\x00\x00\x00\x00-\xfe\x00\x00\x14@$\x06\xb8\xc2\x00\x00@\x00\x00\x02@\xfa%]^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfbT\xc4\x00\x03\xc0\x00\x01\xa4\x00\x00\x00 \x00\x004\x80\x00\x00\x04LAME3.98.4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\xff\xfbT\xc4U\x83\xc0\x00\x01\xa4\x00\x00\x00 \x00\x004\x80\x00\x00\x04UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU') img = derivatives.wave_to_img(buff) assert img assert len(derivatives.img_to_buffer(img).getvalue()) diff --git a/tests/idigbio_ingestion/mediaing/test_fetcher.py b/tests/idigbio_ingestion/mediaing/test_fetcher.py index f3525fd3..d2333be3 100644 --- a/tests/idigbio_ingestion/mediaing/test_fetcher.py +++ b/tests/idigbio_ingestion/mediaing/test_fetcher.py @@ -11,10 +11,10 @@ def test_continuous(mocker, caplog): def get_items(ignores=[], prefix=None): items = [ - fetcher.FetchItem('http://prefix.1/1', 'images', 'image/jpg'), - fetcher.FetchItem('http://prefix.2/2', 'images', 'image/jpg'), - fetcher.FetchItem('http://prefix.2/2', 'images', 'image/jpg'), - fetcher.FetchItem('http://prefix.2/2', 'images', 'image/jpg'), + fetcher.FetchItem('http://prefix.a/0', 'images', 'image/jpg'), + fetcher.FetchItem('http://prefix.b/0', 'images', 'image/jpg'), + fetcher.FetchItem('http://prefix.c/0', 'images', 'image/jpg'), + fetcher.FetchItem('http://prefix.c/1', 'images', 'image/jpg'), ] return [i for i in items if i.prefix not in ignores] mocker.patch.object(fetcher, 'get_items', side_effect=get_items) @@ -24,6 +24,7 @@ def get_items(ignores=[], prefix=None): assert fetcher.get_items.call_count == 2 msg = "Starting subprocess for" + # Should get one subprocess for each url prefix (aka "protocol://domain name/") above assert len([r for r in caplog.records if r.msg.startswith(msg)]) == 3 diff --git a/tests/rg_benckmark.py b/tests/rg_benchmark.py similarity index 85% rename from tests/rg_benckmark.py rename to tests/rg_benchmark.py index b7a60fed..6ba3aa88 100644 --- a/tests/rg_benckmark.py +++ b/tests/rg_benchmark.py @@ -5,7 +5,7 @@ t = datetime.datetime.now() rg = ReverseGeocoder() -print "INIT Time", (datetime.datetime.now() - t).total_seconds()*1000 +print("INIT Time", (datetime.datetime.now() - t).total_seconds()*1000) x = [] @@ -38,5 +38,5 @@ sm = sum(times) av = sm/len(times) -print mn, q1, q2, q3, mx -print sm, av, iqr, p95, p99 +print(mn, q1, q2, q3, mx) +print(sm, av, iqr, p95, p99) diff --git a/tests/sample_coverage_report.txt b/tests/sample_coverage_report.txt new file mode 100644 index 00000000..9ff25c3a --- /dev/null +++ b/tests/sample_coverage_report.txt @@ -0,0 +1,101 @@ +$ coverage report +Name Stmts Miss Cover +----------------------------------------------------------------------- +idb/__init__.py 1 0 100% +idb/annotations/__init__.py 0 0 100% +idb/annotations/apply.py 21 21 0% +idb/annotations/epandda_fetcher.py 29 29 0% +idb/annotations/loader.py 30 30 0% +idb/blacklists/__init__.py 0 0 100% +idb/blacklists/derivatives.py 1 0 100% +idb/cli.py 19 7 63% +idb/clibase.py 60 28 53% +idb/config.py 37 1 97% +idb/corrections/__init__.py 0 0 100% +idb/corrections/loader.py 30 30 0% +idb/corrections/record_corrector.py 79 79 0% +idb/data_api/__init__.py 53 38 28% +idb/data_api/api.py 43 6 86% +idb/data_api/common.py 48 6 88% +idb/data_api/config.py 3 0 100% +idb/data_api/v1.py 80 65 19% +idb/data_api/v2.py 91 19 79% +idb/data_api/v2_download.py 111 14 87% +idb/data_api/v2_media.py 173 24 86% +idb/data_tables/__init__.py 0 0 100% +idb/data_tables/build_taxon_index.py 63 63 0% +idb/data_tables/build_taxon_kv.py 234 234 0% +idb/data_tables/locality.py 34 34 0% +idb/data_tables/locality_data.py 21 21 0% +idb/data_tables/rights_strings.py 42 30 29% +idb/data_tables/taxon.py 35 35 0% +idb/data_tables/taxon_extended.py 45 45 0% +idb/data_tables/taxon_rank.py 24 16 33% +idb/helpers/__init__.py 18 8 56% +idb/helpers/biodiversity_socket_connector.py 82 60 27% +idb/helpers/conversions.py 502 186 63% +idb/helpers/cors.py 35 8 77% +idb/helpers/encryption.py 32 21 34% +idb/helpers/etags.py 56 11 80% +idb/helpers/fieldnames.py 45 28 38% +idb/helpers/gipcpool.py 39 26 33% +idb/helpers/idb_flask_authn.py 40 7 82% +idb/helpers/logging.py 127 46 64% +idb/helpers/media_validation.py 55 3 95% +idb/helpers/memoize.py 90 23 74% +idb/helpers/rg.py 50 1 98% +idb/helpers/signals.py 40 21 48% +idb/helpers/storage.py 132 35 73% +idb/indexing/__init__.py 101 59 42% +idb/indexing/index_from_postgres.py 166 166 0% +idb/indexing/index_helper.py 39 39 0% +idb/indexing/indexer.py 137 105 23% +idb/load_annotations.py 15 15 0% +idb/load_corrections.py 11 11 0% +idb/postgres_backend/__init__.py 22 0 100% +idb/postgres_backend/db.py 351 122 65% +idb/postgres_backend/gevent_helpers.py 145 21 86% +idb/postgres_backend/stats_db.py 16 16 0% +idb/stats/__init__.py 37 21 43% +idb/stats/collect.py 100 100 0% +idb/stats/stats-backup.py 32 32 0% +idb/stats/stats_rewriter.py 64 64 0% +idigbio_ingestion/__init__.py 0 0 100% +idigbio_ingestion/cli.py 60 60 0% +idigbio_ingestion/db_check.py 411 363 12% +idigbio_ingestion/db_rsids.py 33 33 0% +idigbio_ingestion/ds_sum_counts.py 101 101 0% +idigbio_ingestion/lib/__init__.py 0 0 100% +idigbio_ingestion/lib/delimited.py 116 96 17% +idigbio_ingestion/lib/dwca.py 151 137 9% +idigbio_ingestion/lib/eml.py 100 17 83% +idigbio_ingestion/lib/fileproxy.py 72 72 0% +idigbio_ingestion/lib/util.py 15 15 0% +idigbio_ingestion/lib/waveform.py 46 11 76% +idigbio_ingestion/lib/xmlDictTools.py 67 62 7% +idigbio_ingestion/mediaing/__init__.py 32 0 100% +idigbio_ingestion/mediaing/cli.py 51 51 0% +idigbio_ingestion/mediaing/derivatives.py 204 106 48% +idigbio_ingestion/mediaing/fetcher.py 328 150 54% +idigbio_ingestion/mediaing/migrate.py 21 21 0% +idigbio_ingestion/mediaing/updatedb.py 119 99 17% +idigbio_ingestion/recordset_cleanup.py 30 30 0% +idigbio_ingestion/update_publisher_recordset.py 308 308 0% +idigbio_ingestion/verify_ceph_objects.py 76 76 0% +idigbio_workers/__init__.py 23 8 65% +idigbio_workers/config/__init__.py 0 0 100% +idigbio_workers/config/beta.py 7 7 0% +idigbio_workers/config/prod.py 7 0 100% +idigbio_workers/config/test.py 9 9 0% +idigbio_workers/generate_static_datasets.py 34 34 0% +idigbio_workers/generate_static_datasets_index.py 92 92 0% +idigbio_workers/lib/__init__.py 0 0 100% +idigbio_workers/lib/download.py 298 95 68% +idigbio_workers/lib/identification.py 15 6 60% +idigbio_workers/lib/mailer.py 31 20 35% +idigbio_workers/lib/meta_xml.py 38 4 89% +idigbio_workers/lib/query_shim.py 93 13 86% +idigbio_workers/tasks/__init__.py 0 0 100% +idigbio_workers/tasks/download.py 68 42 38% +----------------------------------------------------------------------- +TOTAL 7042 4268 39%