From 30e32690490bbb8d831e8b328b78a44b642eb8ab Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Thu, 11 Jun 2026 19:28:28 +0200 Subject: [PATCH 1/6] Add test_get_job_results_100_server_test --- tests/test_views.py | 92 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/tests/test_views.py b/tests/test_views.py index ab8a40dd..a895c7d2 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1359,6 +1359,74 @@ def test_collections_queryables(self, api120): class TestBatchJobs: AUTH_HEADER = TEST_USER_AUTH_HEADER + @staticmethod + def load_dummy_batch_job_metadata(job_metadata_path: Path, full=True): + """ + Mocks a lot of metadata with random values + """ + from openeo.util import rfc3339 + result_metadata = json.loads(Path(job_metadata_path).read_text()) + process_graph = result_metadata.get("providers", [])[0]["processing:expression"]["expression"] + job_info: dict = { + "job_id": "load_dummy_batch_job_metadata job_id", + "title": "load_dummy_batch_job_metadata title", + "description": "load_dummy_batch_job_metadata description", + "process": {"process_graph": process_graph}, + "status": "finished", + "progress": 100, + "created": "2020-06-11T11:44:44Z", + "updated": "2020-06-11T11:55:55Z", + "plan": "some_plan", + "costs": 1.666, + "budget": 4.666, + "usage": { + "cpu": {"value": 666, "unit": "cpu-seconds"}, + "duration": {"value": 6, "unit": "seconds"}, + "memory": {"value": 666666, "unit": "mb-seconds"}, + }, + "results_metadata": result_metadata, + "job_options": {}, + } + + def map_safe(prop: str, f): + value = job_info.get(prop) + return f(value) if value else None + + def get_results_metadata(result_metadata_prop: str): + return job_info.get("results_metadata", {}).get(result_metadata_prop) + + def map_results_metadata_safe(result_metadata_prop: str, f): + value = get_results_metadata(result_metadata_prop) + return f(value) if value is not None else None + + return BatchJobMetadata( + id=job_info["job_id"], + status=job_info["status"], + created=map_safe("created", rfc3339.parse_datetime), + process=job_info.get("process") if full else None, + job_options=job_info.get("job_options") if full else None, + title=job_info.get("title"), + description=job_info.get("description"), + updated=map_safe("updated", rfc3339.parse_datetime), + started=map_safe("started", rfc3339.parse_datetime), + finished=map_safe("finished", rfc3339.parse_datetime), + memory_time_megabyte=map_safe( + "memory_time_megabyte_seconds", lambda seconds: timedelta(seconds=seconds) + ), + cpu_time=map_safe("cpu_time_seconds", lambda seconds: timedelta(seconds=seconds)), + geometry=get_results_metadata("geometry"), + bbox=get_results_metadata("bbox"), + start_datetime=map_results_metadata_safe("start_datetime", rfc3339.parse_datetime), + end_datetime=map_results_metadata_safe("end_datetime", rfc3339.parse_datetime), + instruments=get_results_metadata("instruments"), + epsg=get_results_metadata("epsg"), + links=get_results_metadata("links"), + usage=job_info.get("usage"), + costs=job_info.get("costs"), + proj_shape=get_results_metadata("proj:shape"), + proj_bbox=get_results_metadata("proj:bbox"), + ) + @staticmethod @contextmanager def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = None, jobs: Optional[dict] = None): @@ -1375,7 +1443,10 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No mock.patch.object(dummy_backend.DummyBatchJobs, "_output_root", return_value=output_root) ) + _server_test_metadata_path = Path("TODO") + dummy_backend.DummyBatchJobs._job_registry = { + (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata(_server_test_metadata_path), (TEST_USER, "07024ee9-7847-4b8a-b260-6c879a2b3cdc"): BatchJobMetadata( id="07024ee9-7847-4b8a-b260-6c879a2b3cdc", status="running", @@ -1435,7 +1506,19 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No end_datetime=None, ), } - dummy_backend.DummyBatchJobs._job_result_registry = {} + if next_job_id == "j-server_test-job_metadata": + _server_test_raw = json.loads(_server_test_metadata_path.read_text()) + dummy_backend.DummyBatchJobs._job_result_registry = { + # ("j-server_test-job_metadata", TEST_USER): bjmd + ("j-server_test-job_metadata", TEST_USER): BatchJobResultMetadata( + assets={}, + items={item["id"]: item for item in _server_test_raw.get("items", [])}, + links=_server_test_raw.get("links", []), + providers=_server_test_raw.get("providers", []), + ), + } + else: + dummy_backend.DummyBatchJobs._job_result_registry = {} if jobs: for job_id, job_settings in jobs.items(): @@ -2314,6 +2397,13 @@ def test_get_job_results_110(self, api110): } ) + def test_get_job_results_100_server_test(self, api110): + with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): + resp = api110.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) + resp_txt = resp.text + assert "load_dummy_batch_job_metadata job_id" in resp_txt + pystac.Collection.from_dict(json.loads(resp_txt)) + def test_get_job_results_public_href_asset_100(self, api, backend_implementation): import numpy as np From a9063cde21d626f1271522dd3f5e42db8b8ed1a2 Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Thu, 11 Jun 2026 19:48:00 +0200 Subject: [PATCH 2/6] test_get_job_results_100_server_test --- openeo_driver/views.py | 2 +- tests/data/job_metadata_from_cwl.json | 320 ++++++++++++++++++++++++++ tests/test_views.py | 3 +- 3 files changed, 323 insertions(+), 2 deletions(-) create mode 100644 tests/data/job_metadata_from_cwl.json diff --git a/openeo_driver/views.py b/openeo_driver/views.py index a4e21363..b371e9d1 100644 --- a/openeo_driver/views.py +++ b/openeo_driver/views.py @@ -1850,7 +1850,7 @@ def _asset_object( if filename.endswith(".model"): # Machine learning models. return result_dict - bands = asset_metadata.get("bands") + bands = asset_metadata.get("bands") or asset_metadata.get("eo:bands") if bands: # TODO: #298 this is a quick stop-gap solution for lack of clear API diff --git a/tests/data/job_metadata_from_cwl.json b/tests/data/job_metadata_from_cwl.json new file mode 100644 index 00000000..c630e132 --- /dev/null +++ b/tests/data/job_metadata_from_cwl.json @@ -0,0 +1,320 @@ +{ + "geometry": null, + "bbox": null, + "area": null, + "start_datetime": "2023-06-01T00:00:00Z", + "end_datetime": "2023-06-06T00:00:00Z", + "links": [ + { + "href": ".../collection.json", + "rel": "original", + "title": "Link to original STAC catalog.", + "type": "application/json" + }, + { + "href": ".../openEO_2023-06-01Z.tif.json", + "rel": "original", + "title": "Link to original STAC item.", + "type": "application/json" + }, + { + "href": ".../collection.json", + "rel": "original", + "title": "Link to original STAC catalog.", + "type": "application/json" + } + ], + "items": [ + { + "type": "Feature", + "stac_version": "1.0.0", + "id": "openEO_2023-06-01Z.tif", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5.069685009564396, 51.21481793134414], + [5.069685009564396, 51.22021524164682], + [5.080364860947119, 51.22021524164682], + [5.080364860947119, 51.21481793134414], + [5.069685009564396, 51.21481793134414] + ] + ] + }, + "bbox": [ + 5.069685009564396, + 51.21481793134414, + 5.080364860947119, + 51.22021524164682 + ], + "properties": { + "testing_custom_property": "https://github.com/cloudinsar/s1-workflows/issues/70", + "datetime": "2023-06-01T00:00:00Z" + }, + "links": [], + "assets": { + "openEO_2023-06-01Z.tif": { + "href": ".../openEO_2023-06-01Z.tif", + "roles": ["data"], + "type": "image/tiff; application=geotiff", + "eo:bands": [ + { + "name": "B04", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B03", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B02", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + } + ], + "raster:bands": [ + { + "name": "B04", + "statistics": { + "minimum": 180, + "maximum": 1766, + "mean": 401.07085498347, + "stddev": 162.43588375276, + "valid_percent": 100 + } + }, + { + "name": "B03", + "statistics": { + "minimum": 278, + "maximum": 1336, + "mean": 598.11572980633, + "stddev": 133.74416960473, + "valid_percent": 100 + } + }, + { + "name": "B02", + "statistics": { + "minimum": 216, + "maximum": 1072, + "mean": 368.17264997638, + "stddev": 99.2670146459, + "valid_percent": 100 + } + } + ] + } + } + }, + { + "type": "Feature", + "stac_version": "1.0.0", + "id": "openEO_2023-06-04Z.tif", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5.069685009564396, 51.21481793134414], + [5.069685009564396, 51.22021524164682], + [5.080364860947119, 51.22021524164682], + [5.080364860947119, 51.21481793134414], + [5.069685009564396, 51.21481793134414] + ] + ] + }, + "bbox": [ + 5.069685009564396, + 51.21481793134414, + 5.080364860947119, + 51.22021524164682 + ], + "properties": {"datetime": "2023-06-04T00:00:00Z"}, + "links": [], + "assets": { + "openEO_2023-06-04Z.tif": { + "href": ".../openEO_2023-06-04Z.tif", + "roles": ["data"], + "type": "image/tiff; application=geotiff", + "eo:bands": [ + { + "name": "B04", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B03", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B02", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + } + ], + "raster:bands": [ + { + "name": "B04", + "statistics": { + "minimum": 174, + "maximum": 1628, + "mean": 360.10746339159, + "stddev": 160.47737013663, + "valid_percent": 100 + } + }, + { + "name": "B03", + "statistics": { + "minimum": 263, + "maximum": 1358, + "mean": 546.93197921587, + "stddev": 129.15120454283, + "valid_percent": 100 + } + }, + { + "name": "B02", + "statistics": { + "minimum": 200, + "maximum": 1116, + "mean": 344.86820973075, + "stddev": 95.975778884601, + "valid_percent": 100 + } + } + ] + } + } + }, + { + "type": "Feature", + "stac_version": "1.0.0", + "id": "openEO_2023-06-06Z.tif", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5.069685009564396, 51.21481793134414], + [5.069685009564396, 51.22021524164682], + [5.080364860947119, 51.22021524164682], + [5.080364860947119, 51.21481793134414], + [5.069685009564396, 51.21481793134414] + ] + ] + }, + "bbox": [ + 5.069685009564396, + 51.21481793134414, + 5.080364860947119, + 51.22021524164682 + ], + "properties": {"datetime": "2023-06-06T00:00:00Z"}, + "links": [], + "assets": { + "openEO_2023-06-06Z.tif": { + "href": ".../openEO_2023-06-06Z.tif", + "roles": ["data"], + "type": "image/tiff; application=geotiff", + "eo:bands": [ + { + "name": "B04", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B03", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + }, + { + "name": "B02", + "common_name": null, + "wavelength_um": null, + "aliases": null, + "gsd": null + } + ], + "raster:bands": [ + { + "name": "B04", + "statistics": { + "minimum": 171, + "maximum": 1774, + "mean": 380.50094473311, + "stddev": 176.19790726983, + "valid_percent": 100 + } + }, + { + "name": "B03", + "statistics": { + "minimum": 282, + "maximum": 1470, + "mean": 592.27586206896, + "stddev": 138.20284171799, + "valid_percent": 100 + } + }, + { + "name": "B02", + "statistics": { + "minimum": 270, + "maximum": 1190, + "mean": 412.22508266415, + "stddev": 103.22080164099, + "valid_percent": 100 + } + } + ] + } + } + } + ], + "epsg": null, + "instruments": [], + "processing:facility": "VITO - SPARK", + "processing:software": "openeo-geotrellis-0.72.0a12", + "unique_process_ids": ["run_cwl_to_stac"], + "providers": [ + { + "name": "VITO", + "description": "This data was processed on an openEO backend maintained by VITO.", + "roles": ["processor"], + "processing:facility": "openEO Geotrellis backend", + "processing:software": {"Geotrellis backend": "0.72.0a12"}, + "processing:expression": { + "format": "openeo", + "expression": { + "runcwltostac1": { + "process_id": "run_cwl_to_stac", + "arguments": { + "context": {}, + "cwl": "https://raw.githubusercontent.com/Open-EO/openeo-geotrellis-kubernetes/master/openeo-geopyspark-k8s-custom-processes/src/openeo_geopyspark_k8s_custom_processes/cwl/dummy_stac.cwl" + }, + "result": true + } + } + } + } + ] +} \ No newline at end of file diff --git a/tests/test_views.py b/tests/test_views.py index a895c7d2..672f41e1 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1443,7 +1443,7 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No mock.patch.object(dummy_backend.DummyBatchJobs, "_output_root", return_value=output_root) ) - _server_test_metadata_path = Path("TODO") + _server_test_metadata_path = get_path("job_metadata.json") dummy_backend.DummyBatchJobs._job_registry = { (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata(_server_test_metadata_path), @@ -2402,6 +2402,7 @@ def test_get_job_results_100_server_test(self, api110): resp = api110.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) resp_txt = resp.text assert "load_dummy_batch_job_metadata job_id" in resp_txt + assert "bands" in resp_txt pystac.Collection.from_dict(json.loads(resp_txt)) def test_get_job_results_public_href_asset_100(self, api, backend_implementation): From 009d66f1dd3c055ddf229d575deddcd589535ac0 Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Thu, 11 Jun 2026 20:15:00 +0200 Subject: [PATCH 3/6] test_get_job_results_100_from_cwl test_get_job_results_110_from_cwl --- tests/data/job_metadata_from_cwl.json | 12 ------------ tests/test_views.py | 12 ++++++++++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/tests/data/job_metadata_from_cwl.json b/tests/data/job_metadata_from_cwl.json index c630e132..e1c01fc3 100644 --- a/tests/data/job_metadata_from_cwl.json +++ b/tests/data/job_metadata_from_cwl.json @@ -5,18 +5,6 @@ "start_datetime": "2023-06-01T00:00:00Z", "end_datetime": "2023-06-06T00:00:00Z", "links": [ - { - "href": ".../collection.json", - "rel": "original", - "title": "Link to original STAC catalog.", - "type": "application/json" - }, - { - "href": ".../openEO_2023-06-01Z.tif.json", - "rel": "original", - "title": "Link to original STAC item.", - "type": "application/json" - }, { "href": ".../collection.json", "rel": "original", diff --git a/tests/test_views.py b/tests/test_views.py index 672f41e1..792aea7f 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1443,7 +1443,7 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No mock.patch.object(dummy_backend.DummyBatchJobs, "_output_root", return_value=output_root) ) - _server_test_metadata_path = get_path("job_metadata.json") + _server_test_metadata_path = get_path("job_metadata_from_cwl.json") dummy_backend.DummyBatchJobs._job_registry = { (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata(_server_test_metadata_path), @@ -2397,7 +2397,15 @@ def test_get_job_results_110(self, api110): } ) - def test_get_job_results_100_server_test(self, api110): + def test_get_job_results_100_from_cwl(self, api100): + with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): + resp = api100.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) + resp_txt = resp.text + assert "load_dummy_batch_job_metadata job_id" in resp_txt + # assert "bands" in resp_txt # TODO? + pystac.Item.from_dict(json.loads(resp_txt)) + + def test_get_job_results_110_from_cwl(self, api110): with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): resp = api110.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) resp_txt = resp.text From 9bdd0a3ed9a628ea361612bb301ff76b9e2eae7b Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Thu, 11 Jun 2026 20:29:10 +0200 Subject: [PATCH 4/6] Fix for job_id --- tests/test_views.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_views.py b/tests/test_views.py index 792aea7f..b7678921 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1360,7 +1360,7 @@ class TestBatchJobs: AUTH_HEADER = TEST_USER_AUTH_HEADER @staticmethod - def load_dummy_batch_job_metadata(job_metadata_path: Path, full=True): + def load_dummy_batch_job_metadata(job_metadata_path: Path, job_id: str, full=True): """ Mocks a lot of metadata with random values """ @@ -1368,7 +1368,7 @@ def load_dummy_batch_job_metadata(job_metadata_path: Path, full=True): result_metadata = json.loads(Path(job_metadata_path).read_text()) process_graph = result_metadata.get("providers", [])[0]["processing:expression"]["expression"] job_info: dict = { - "job_id": "load_dummy_batch_job_metadata job_id", + "job_id": job_id, "title": "load_dummy_batch_job_metadata title", "description": "load_dummy_batch_job_metadata description", "process": {"process_graph": process_graph}, @@ -1446,7 +1446,9 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No _server_test_metadata_path = get_path("job_metadata_from_cwl.json") dummy_backend.DummyBatchJobs._job_registry = { - (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata(_server_test_metadata_path), + (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata( + _server_test_metadata_path, job_id="j-server_test-job_metadata" + ), (TEST_USER, "07024ee9-7847-4b8a-b260-6c879a2b3cdc"): BatchJobMetadata( id="07024ee9-7847-4b8a-b260-6c879a2b3cdc", status="running", @@ -2401,7 +2403,7 @@ def test_get_job_results_100_from_cwl(self, api100): with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): resp = api100.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) resp_txt = resp.text - assert "load_dummy_batch_job_metadata job_id" in resp_txt + assert "j-server_test-job_metadata" in resp_txt # assert "bands" in resp_txt # TODO? pystac.Item.from_dict(json.loads(resp_txt)) @@ -2409,7 +2411,7 @@ def test_get_job_results_110_from_cwl(self, api110): with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): resp = api110.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) resp_txt = resp.text - assert "load_dummy_batch_job_metadata job_id" in resp_txt + assert "j-server_test-job_metadata" in resp_txt assert "bands" in resp_txt pystac.Collection.from_dict(json.loads(resp_txt)) From fdcd45a0022b56ad100e3fa879bdf3d3a7f2213c Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Thu, 11 Jun 2026 20:36:38 +0200 Subject: [PATCH 5/6] j-job_metadata_from_cwl --- tests/test_views.py | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/tests/test_views.py b/tests/test_views.py index b7678921..54cfcdf3 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1446,8 +1446,8 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No _server_test_metadata_path = get_path("job_metadata_from_cwl.json") dummy_backend.DummyBatchJobs._job_registry = { - (TEST_USER, "j-server_test-job_metadata"): TestBatchJobs.load_dummy_batch_job_metadata( - _server_test_metadata_path, job_id="j-server_test-job_metadata" + (TEST_USER, "j-job_metadata_from_cwl"): TestBatchJobs.load_dummy_batch_job_metadata( + _server_test_metadata_path, job_id="j-job_metadata_from_cwl" ), (TEST_USER, "07024ee9-7847-4b8a-b260-6c879a2b3cdc"): BatchJobMetadata( id="07024ee9-7847-4b8a-b260-6c879a2b3cdc", @@ -1508,11 +1508,11 @@ def _fresh_job_registry(next_job_id="job-1234", output_root: Optional[Path] = No end_datetime=None, ), } - if next_job_id == "j-server_test-job_metadata": + if next_job_id == "j-job_metadata_from_cwl": _server_test_raw = json.loads(_server_test_metadata_path.read_text()) dummy_backend.DummyBatchJobs._job_result_registry = { - # ("j-server_test-job_metadata", TEST_USER): bjmd - ("j-server_test-job_metadata", TEST_USER): BatchJobResultMetadata( + # ("j-job_metadata_from_cwl", TEST_USER): bjmd + ("j-job_metadata_from_cwl", TEST_USER): BatchJobResultMetadata( assets={}, items={item["id"]: item for item in _server_test_raw.get("items", [])}, links=_server_test_raw.get("links", []), @@ -1789,6 +1789,16 @@ def test_list_user_jobs_100(self, api100): resp = api100.get("/jobs", headers=self.AUTH_HEADER) assert resp.assert_status_code(200).json == { "jobs": [ + { + "costs": 1.666, + "created": "2020-06-11T11:44:44Z", + "description": "load_dummy_batch_job_metadata description", + "id": "j-job_metadata_from_cwl", + "progress": 100, + "status": "finished", + "title": "load_dummy_batch_job_metadata title", + "updated": "2020-06-11T11:55:55Z", + }, { "id": "07024ee9-7847-4b8a-b260-6c879a2b3cdc", "status": "running", @@ -2400,18 +2410,18 @@ def test_get_job_results_110(self, api110): ) def test_get_job_results_100_from_cwl(self, api100): - with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): - resp = api100.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) + with self._fresh_job_registry(next_job_id="j-job_metadata_from_cwl"): + resp = api100.get("/jobs/j-job_metadata_from_cwl/results", headers=self.AUTH_HEADER) resp_txt = resp.text - assert "j-server_test-job_metadata" in resp_txt + assert "j-job_metadata_from_cwl" in resp_txt # assert "bands" in resp_txt # TODO? pystac.Item.from_dict(json.loads(resp_txt)) def test_get_job_results_110_from_cwl(self, api110): - with self._fresh_job_registry(next_job_id="j-server_test-job_metadata"): - resp = api110.get("/jobs/j-server_test-job_metadata/results", headers=self.AUTH_HEADER) + with self._fresh_job_registry(next_job_id="j-job_metadata_from_cwl"): + resp = api110.get("/jobs/j-job_metadata_from_cwl/results", headers=self.AUTH_HEADER) resp_txt = resp.text - assert "j-server_test-job_metadata" in resp_txt + assert "j-job_metadata_from_cwl" in resp_txt assert "bands" in resp_txt pystac.Collection.from_dict(json.loads(resp_txt)) From b6da14b90b2f94d8a1ce76022ef7e53310b7a43a Mon Sep 17 00:00:00 2001 From: Emile Sonneveld Date: Fri, 12 Jun 2026 11:45:24 +0200 Subject: [PATCH 6/6] Fix for if collection links are used. Added example_stac_catalog_11 should only be 14-77kb --- openeo_driver/util/stac_utils.py | 6 +- ...9f4-d3550a512cd1_2023-06-06T00:00:00Z.json | 111 ++++++++ ...918-8318369ff7ad_2023-06-01T00:00:00Z.json | 111 ++++++++ .../example_stac_catalog_11/collection.json | 240 ++++++++++++++++++ ...cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json | 111 ++++++++ .../openEO_2023-06-01Z.tif | Bin 0 -> 20867 bytes .../openEO_2023-06-04Z.tif | Bin 0 -> 20772 bytes .../openEO_2023-06-06Z.tif | Bin 0 -> 20903 bytes tests/util/test_stac_utils.py | 32 +++ 9 files changed, 609 insertions(+), 2 deletions(-) create mode 100644 tests/data/example_stac_catalog_11/1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z.json create mode 100644 tests/data/example_stac_catalog_11/75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z.json create mode 100644 tests/data/example_stac_catalog_11/collection.json create mode 100644 tests/data/example_stac_catalog_11/d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json create mode 100644 tests/data/example_stac_catalog_11/openEO_2023-06-01Z.tif create mode 100644 tests/data/example_stac_catalog_11/openEO_2023-06-04Z.tif create mode 100644 tests/data/example_stac_catalog_11/openEO_2023-06-06Z.tif diff --git a/openeo_driver/util/stac_utils.py b/openeo_driver/util/stac_utils.py index 4b078a6a..b17dd282 100644 --- a/openeo_driver/util/stac_utils.py +++ b/openeo_driver/util/stac_utils.py @@ -106,9 +106,11 @@ def recurse(item_path: Union[str, Path]) -> list: href = robust_urljoin(item_path, href) if "rel" in link and (link["rel"] == "child" or link["rel"] == "item"): - all_files.extend(get_files_from_stac_catalog(href, include_metadata)) - else: + all_files.extend(recurse(href)) + elif ("rel" not in link) or (link["rel"] != "collection"): all_files.append(href) + else: + pass return all_files return_files = recurse(catalog_path) diff --git a/tests/data/example_stac_catalog_11/1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z.json b/tests/data/example_stac_catalog_11/1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z.json new file mode 100644 index 00000000..c7df20ed --- /dev/null +++ b/tests/data/example_stac_catalog_11/1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z.json @@ -0,0 +1,111 @@ +{ + "assets": { + "1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1774.0, + "mean": 380.50094473311, + "minimum": 171.0, + "stddev": 176.19790726983, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1470.0, + "mean": 592.27586206896, + "minimum": 282.0, + "stddev": 138.20284171799, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1190.0, + "mean": 412.22508266415, + "minimum": 270.0, + "stddev": 103.22080164099, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-06Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-06Z.tif", + "type": "image/tiff; application=geotiff" + } + }, + "bbox": [ + 5.069386757303357, + 51.214543255519786, + 5.080663210429039, + 51.22048989375812 + ], + "collection": "j-2606111953054049bc2368898439491e", + "epsg": 32631, + "geometry": { + "coordinates": [ + [ + [ + 5.0804038775948115, + 51.214543255519786 + ], + [ + 5.080663210429039, + 51.22029444279013 + ], + [ + 5.069644719194295, + 51.22048989375812 + ], + [ + 5.069386757303357, + 51.21473866656907 + ], + [ + 5.0804038775948115, + 51.214543255519786 + ] + ] + ], + "type": "Polygon" + }, + "id": "1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z", + "links": [ + { + "href": "./collection.json", + "rel": "collection", + "type": "application/json" + } + ], + "properties": { + "datetime": "2023-06-06T00:00:00Z", + "proj:code": "EPSG:32631", + "proj:epsg": 32631 + }, + "stac_extensions": [ + "https://stac-extensions.github.io/eo/v1.1.0/schema.json", + "https://stac-extensions.github.io/file/v2.1.0/schema.json", + "https://stac-extensions.github.io/projection/v1.2.0/schema.json" + ], + "stac_version": "1.1.0", + "type": "Feature" +} \ No newline at end of file diff --git a/tests/data/example_stac_catalog_11/75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z.json b/tests/data/example_stac_catalog_11/75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z.json new file mode 100644 index 00000000..1a42d34d --- /dev/null +++ b/tests/data/example_stac_catalog_11/75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z.json @@ -0,0 +1,111 @@ +{ + "assets": { + "75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1766.0, + "mean": 401.07085498347, + "minimum": 180.0, + "stddev": 162.43588375276, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1336.0, + "mean": 598.11572980633, + "minimum": 278.0, + "stddev": 133.74416960473, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1072.0, + "mean": 368.17264997638, + "minimum": 216.0, + "stddev": 99.2670146459, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-01Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-01Z.tif", + "type": "image/tiff; application=geotiff" + } + }, + "bbox": [ + 5.069386757303357, + 51.214543255519786, + 5.080663210429039, + 51.22048989375812 + ], + "collection": "j-2606111953054049bc2368898439491e", + "epsg": 32631, + "geometry": { + "coordinates": [ + [ + [ + 5.0804038775948115, + 51.214543255519786 + ], + [ + 5.080663210429039, + 51.22029444279013 + ], + [ + 5.069644719194295, + 51.22048989375812 + ], + [ + 5.069386757303357, + 51.21473866656907 + ], + [ + 5.0804038775948115, + 51.214543255519786 + ] + ] + ], + "type": "Polygon" + }, + "id": "75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z", + "links": [ + { + "href": "./collection.json", + "rel": "collection", + "type": "application/json" + } + ], + "properties": { + "datetime": "2023-06-01T00:00:00Z", + "proj:code": "EPSG:32631", + "proj:epsg": 32631 + }, + "stac_extensions": [ + "https://stac-extensions.github.io/eo/v1.1.0/schema.json", + "https://stac-extensions.github.io/file/v2.1.0/schema.json", + "https://stac-extensions.github.io/projection/v1.2.0/schema.json" + ], + "stac_version": "1.1.0", + "type": "Feature" +} \ No newline at end of file diff --git a/tests/data/example_stac_catalog_11/collection.json b/tests/data/example_stac_catalog_11/collection.json new file mode 100644 index 00000000..ad93b465 --- /dev/null +++ b/tests/data/example_stac_catalog_11/collection.json @@ -0,0 +1,240 @@ +{ + "assets": { + "1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1774.0, + "mean": 380.50094473311, + "minimum": 171.0, + "stddev": 176.19790726983, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1470.0, + "mean": 592.27586206896, + "minimum": 282.0, + "stddev": 138.20284171799, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1190.0, + "mean": 412.22508266415, + "minimum": 270.0, + "stddev": 103.22080164099, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-06Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-06Z.tif", + "type": "image/tiff; application=geotiff" + }, + "75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1766.0, + "mean": 401.07085498347, + "minimum": 180.0, + "stddev": 162.43588375276, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1336.0, + "mean": 598.11572980633, + "minimum": 278.0, + "stddev": 133.74416960473, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1072.0, + "mean": 368.17264997638, + "minimum": 216.0, + "stddev": 99.2670146459, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-01Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-01Z.tif", + "type": "image/tiff; application=geotiff" + }, + "d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1628.0, + "mean": 360.10746339159, + "minimum": 174.0, + "stddev": 160.47737013663, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1358.0, + "mean": 546.93197921587, + "minimum": 263.0, + "stddev": 129.15120454283, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1116.0, + "mean": 344.86820973075, + "minimum": 200.0, + "stddev": 95.975778884601, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-04Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-04Z.tif", + "type": "image/tiff; application=geotiff" + } + }, + "description": "test description", + "extent": { + "spatial": { + "bbox": [ + [ + -180, + -90, + 180, + 90 + ] + ] + }, + "temporal": { + "interval": [ + [ + "2023-06-01T00:00:00Z", + "2023-06-06T00:00:00Z" + ] + ] + } + }, + "id": "j-2606111953054049bc2368898439491e", + "license": "proprietary", + "links": [ + { + "href": "./d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json", + "rel": "item", + "type": "application/geo+json" + }, + { + "href": "./1b442790-2231-4dd1-b9f4-d3550a512cd1_2023-06-06T00:00:00Z.json", + "rel": "item", + "type": "application/geo+json" + }, + { + "href": "./75625346-7e28-433f-9918-8318369ff7ad_2023-06-01T00:00:00Z.json", + "rel": "item", + "type": "application/geo+json" + } + ], + "openeo:status": "finished", + "providers": [ + { + "description": "This data was processed on an openEO backend maintained by VITO.", + "name": "VITO", + "processing:expression": { + "expression": { + "loadstac1": { + "arguments": { + "url": "https://raw.githubusercontent.com/Open-EO/openeo-geopyspark-driver/refs/heads/master/docker/local_batch_job/example_stac_catalog/collection.json" + }, + "process_id": "load_stac", + "result": true + } + }, + "format": "openeo" + }, + "processing:facility": "openEO Geotrellis backend", + "processing:software": { + "Geotrellis backend": "0.72.0a13" + }, + "roles": [ + "processor" + ] + } + ], + "stac_extensions": [ + "https://stac-extensions.github.io/eo/v1.1.0/schema.json", + "https://stac-extensions.github.io/file/v2.1.0/schema.json", + "https://stac-extensions.github.io/processing/v1.1.0/schema.json", + "https://stac-extensions.github.io/projection/v1.2.0/schema.json" + ], + "stac_version": "1.1.0", + "summaries": {}, + "title": "server_test.py_stac-version_1.1", + + "properties": { + "datetime": "2023-06-01T00:00:00Z" + }, + "type": "Collection" +} \ No newline at end of file diff --git a/tests/data/example_stac_catalog_11/d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json b/tests/data/example_stac_catalog_11/d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json new file mode 100644 index 00000000..a31b525b --- /dev/null +++ b/tests/data/example_stac_catalog_11/d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z.json @@ -0,0 +1,111 @@ +{ + "assets": { + "d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z_openEO": { + "bands": [ + { + "name": "B04", + "statistics": { + "maximum": 1628.0, + "mean": 360.10746339159, + "minimum": 174.0, + "stddev": 160.47737013663, + "valid_percent": 85.92 + } + }, + { + "name": "B03", + "statistics": { + "maximum": 1358.0, + "mean": 546.93197921587, + "minimum": 263.0, + "stddev": 129.15120454283, + "valid_percent": 85.92 + } + }, + { + "name": "B02", + "statistics": { + "maximum": 1116.0, + "mean": 344.86820973075, + "minimum": 200.0, + "stddev": 95.975778884601, + "valid_percent": 85.92 + } + } + ], + "href": "./openEO_2023-06-04Z.tif", + "proj:bbox": [ + 644530.0, + 5675740.0, + 645300.0, + 5676380.0 + ], + "proj:code": "EPSG:32631", + "proj:epsg": 32631, + "proj:shape": [ + 64, + 77 + ], + "roles": [ + "data" + ], + "title": "s3://openeo-data-dev-waw4-1/batch_jobs/j-2606111953054049bc2368898439491e/openEO_2023-06-04Z.tif", + "type": "image/tiff; application=geotiff" + } + }, + "bbox": [ + 5.069386757303357, + 51.214543255519786, + 5.080663210429039, + 51.22048989375812 + ], + "collection": "j-2606111953054049bc2368898439491e", + "epsg": 32631, + "geometry": { + "coordinates": [ + [ + [ + 5.0804038775948115, + 51.214543255519786 + ], + [ + 5.080663210429039, + 51.22029444279013 + ], + [ + 5.069644719194295, + 51.22048989375812 + ], + [ + 5.069386757303357, + 51.21473866656907 + ], + [ + 5.0804038775948115, + 51.214543255519786 + ] + ] + ], + "type": "Polygon" + }, + "id": "d3e7a187-1199-461a-8cd4-3f2922cd19a2_2023-06-04T00:00:00Z", + "links": [ + { + "href": "./collection.json", + "rel": "collection", + "type": "application/json" + } + ], + "properties": { + "datetime": "2023-06-04T00:00:00Z", + "proj:code": "EPSG:32631", + "proj:epsg": 32631 + }, + "stac_extensions": [ + "https://stac-extensions.github.io/eo/v1.1.0/schema.json", + "https://stac-extensions.github.io/file/v2.1.0/schema.json", + "https://stac-extensions.github.io/projection/v1.2.0/schema.json" + ], + "stac_version": "1.1.0", + "type": "Feature" +} \ No newline at end of file diff --git a/tests/data/example_stac_catalog_11/openEO_2023-06-01Z.tif b/tests/data/example_stac_catalog_11/openEO_2023-06-01Z.tif new file mode 100644 index 0000000000000000000000000000000000000000..bd33c9e07ac3972a167f48ad602ed846bcbcb8da GIT binary patch literal 20867 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 yGy259v^pN{$GChA>-LD{^4Z$M*O2Pc#kpu* literal 0 HcmV?d00001 diff --git a/tests/data/example_stac_catalog_11/openEO_2023-06-04Z.tif b/tests/data/example_stac_catalog_11/openEO_2023-06-04Z.tif new file mode 100644 index 0000000000000000000000000000000000000000..3b09d374b35e63a20d88a63195016809b387a2a3 GIT binary patch literal 20772 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 IYp53g1sxh}`v3p{ literal 0 HcmV?d00001 diff --git a/tests/data/example_stac_catalog_11/openEO_2023-06-06Z.tif b/tests/data/example_stac_catalog_11/openEO_2023-06-06Z.tif new file mode 100644 index 0000000000000000000000000000000000000000..16476766038084cc78f4a94bf798126da1f7bc0d GIT binary patch literal 20903 zcmeFYWmH^2v?Yv$kU)UoP6sDwaCdii3r>K>-Ge*92~HEBacu~m;1Vo21PB(~X{>2_ zLf(5bZ@#s@HEaG4G~9Eg>fBT3)ZV-9U9GB$#EgW5^a2SF842mxU+eD%Nf8z{(B`d#eX|4`k(gSUXi8#t50MkWan*xw%%OC%&p4kRQ2d?X~Y@xOoDNJymV5_JD@_P@6OvG@P~Uy`;e;pwcT zZn=8sf4}T+NPl72aQB+r>dE;RLbandM&pR41sdqg87Y#U{8gTz#G~jw_!1Z4ZL^%Gp zsF2vWx%l}6kbLuw^W%MV=9Z#wPDRs@I3-@RB2hm>!Ik=kL@n{+^}C%i*=G?kaYYhu zX-buF;Y?Z%Y_f6ln9G?)r$&cevqnlay5d!{TFuPqG$0y~iOhB|yuf3*r?_dJ|I~k8 z#dac3uy48N#(zRA7i`SK*3M@{KDR_Owy=JcT04!>RSWYhCvu3Zoqd0sMD!uac^Yn1 zY~!y{)vO4+`chgws8sV23W*W|vE6qBR}JKVjWQy+xp+U#YRHn6m^oAtIn-J5z6j`h zse6ELTp+>b(3@?h+*uYSNuIZNFIBEG7gH^e`*j$C$t%I^Y zNKX8jd!I%nzdJ5-$;gX0hrwgs!^rqBP}}@RZ|G2&M=zfT#r#w{{j`eR$Z>8_g_G|x zXj8t#RjH=eVwMA&u_3HvbW4EVK}Ig7M6qG{tWuAo(dCU44+Cc27>sWN6RLC*V@*U> zx+Zhz(cJ3}tjCg0;{rhySbqb#9w^B|?SdtL^biLu)+{Uv>7?Cu))Xv6=SVj9sP3i_ z2Uk^4IKFxmmjj-|wQt=SgD6kMWjw_tD46Kb35va>dBh2>BW9cgg^zFwqt%C>&ooq2 z@u+D36s7qbdBCHw<@uI5SQhK%i^DX%eQlCsxY*R>$POHWb&RNpo({q*5bMp<0IW%M zEhgWFpz>~LT?5M9uK-2oWMOr!bSx$nR9t`DeQurHdt6o)as^Wzjz93(lf5orW$IDuNJ$2OgVHohJ0XY@zEQJ$qw|B+6~F1 z*82gTH3v&oRHfzLWM~En0)q)c7|)!IwD4bTK|QiHbgj4P zxa6#XiUa}#YTBfMa{a#R&$R?QD;*jK87&;!<>{L0O@Lp@3nOv#N`C9mJh*b*3V%a073ctZ=xZ@*- zo9n#gl@!~a!razIw~g*QumJ9nt?j@BE#wy|%rFlBWiQ_)<34*&L_%4J)VnA%x z;oOR(U2QJXUNlu5R)S#Kly+&R`ur}P{kKTBZeM|P3@oFwl0NgQ9}#efEEMrtxrf$3-mdbaq-Xj{EXmTwOg-+}%Mcun@&Fkw%$4^XX{%YUqsQjL<$q1; z7h91YWR={$7ORkiZipoJ^T`!0OFRUVoT8umaa<>{fr!@=Xyw#5hc(35z76%1LcQBW zEqQftJOtMSc*_C56rU+rAS+jJ?(>0>y`!`G01ZjCfr#p-DQ*Ef4q~Ct8uIti^WiyF zgL?BVwWEstqSfTrYsUaS-$I1@^3%nli7qwig92soSla3MX7LZf)boIC`>lO!@BJ7x zO~oYo^$;Zpppe|Y`Vy!^pm`2`b8z~iV>Ug{l@Aeh=oRoUSK}?Xlu;n7wm8iO@=3P2 zf}R~G^3W6bo$+@V4V7qpyyfHdAKhPb5YSMvcnw3qY|5SdrAU}laB=O7lUTm`LcNS* z1y$lQ;@v2*TZHkEAS`CI#LbuGXolA_P5iwhKNiIATJ6bG5#QK?JM-mt5v9}@Q-+bZ z!FlM<8@yiMdk?b5EiI?WW9k5Nj~4JTnZ7Gkrm{}OQ@!Ww>a}kFxN&=KWsR8G&MdDu zDXX$_Pg+An?mp63{bwOl=hEr^e^_j8&nspSf8kbEH;A)! z$Wx=)kr$&OKd%4LJAY9x!eJb|x@l@)1m)j~Bus?xtis<^7aMC84(LiS&ep0BFMazkS(*LTGIo@;dhtQIzu{8_ub7CpYgMzwair#Dd!Qv}{MhT$SK6K-hj=3|X zKU8WbvSeedUf*ywg7~mQ4_G3o_ffUk>pBV;)O0qk4Na zi{;e7z0Ey=l^%Mk2Nm|gl?+0JY~^AC+5c*XpBakoRcFS?sNS@4Fw4Okj-JHr>!dp}V-;sqH0=Oo zkgSPhIxeH$^7rb4YF)#M+0;FmD=kk|6WEH-=0jkb00DS5+TcYaKJ^ zt^RLfMv+H6?&3}c%=Ea-u-8me7=R1+PVcAWERkjBiGX&|lfC*nh_+dz)_s11v1hDX z=zQ5C=c0)(U|`gw$Sw%|a8IEwK$WIT(L6#Q`tK3CB{BB^ILu%r4~6*;Pn3 zXvX5?_Ql@V(}IV7j>dmbuk5M1m^*hfmvO&ku%~65{O{G_P6#uZX=?c#2ozZcUMKAv&q9;9j)*g51X^>&yWZ zjAp)@R^~tNUa>0HstkOl3F4!WhfexYUD>KuxA8zS3vw*=K< zF~IoAnv&_2FPDe9WYw$p1L4UG%ST|ooPu@^N6%SC-qiwyCrtyMmhY+$6*ALh)ORoc z4b#8)g&a~-#BNZHKkF$@Exh}h`p@tbOk%Nb%YKn)?L}R5Yj0+K8k_JOg=k@`4@7ri zPp%rw*;YiKoVsnK8S;ot*P^qJf<^8BN+a$?lV}cU7g3iLsvo7N-M{$YkGD2xlcl~p zHaVp>_Tryzvi6AQ$4;8Vud@@UpR<-wQ}v`RbFd^`SU3tOOdv>(*BPG&#^`pIFz4Et z)A8<@WPdhMX4OHKuUaT_l^a-`yz3-a#0GCnD>c#QR`V0 z8e#lNvZb2VFq`{twe`e%DB>+btH}j|7Re}gaLmm|{gFI4&OYq2*RAsVwZlhQ3hZ*P z46lZLqcDAbEvoY^8i%;d?If;1c-(e^+uKat%djcEY5S9uYno#Ld)ML^rag`Cg z^?6~QawELxdR!W|7u8cDemxcAw4QXc{>J51AJua!97sC_bOBG>nQnfz9%0ZZ8B%Rq zE98;K|D@H>$olm|MoHjyz^`2nJrFi;_AYbrW?s*A`E+@&f>!)XpOW7z*Y=*dKz&g{ zQ$2w`D#q!yPbJk7$AhXUpXxrff z?Xd|{JP&N0c#r?k=WOKdvNfT%dAg%AFfW+Qd|&-!RDevZGPu*V~$>ex7xbE2n&R@<~TY z)iL$;Eknj1k@ip}RwwyI68*F%$m#u)x}%SqNPfTv#RAYZHL&J=X<8XLgzDTBGVFQ= ze^56T5&oJ{W4neTu0%McJJwEs7T*AU`(FWOUVZ?lwMvp{d1*#G5sWCpLd&T2W3Z}mnX4xK* zcsbrt@k`IBOP+j_dV}>{1yzlpAYWc5EnGp{*0_IK+u{6T3*1f20e|CE*3M7k+vVU( zI5~1u9$5K6bf6?A5OZ+;tKNHLwSDItf>d4f(kn1<*V(Rx?+v1E7E1@ZI*frUZ$B7J zxyV9{So@B<>EA%pwgRTj*bz???zw3cC65=#b>6Og(gNQXL-O)EmhjB5L$JxynnLv* zJN{_I7s_N1Ok(XL)P^QUym|sVVNT7?k(4}dnp#6!>{n&R`(A?jlszw6r%t_kPiec; zCOOL;eMK0vZ!Z`o5w(~If?&$WEZ=E@IgV27AQhYe7PT*bku&~`U8ysiiabrIMne5S z*8Ktxih(|rJ*@gXM&H#wdplxg78a1!@zo>d2=41i*FDrEyJd)=>?8Jl)EfWIbZ%Nq zdw#F&`BLy`>7_7QGUTt$Szsb5zkcPI9Yl15i!&;3S@j&rP^D+KcY_5$;LJ_w2pmSE$j{=DLqLG-Pr zJ$|BAqjv#kS~XDdi#@om#7#8A!f;XEdPG$(n&kVu$i?4=Q^z{^UjG=daBb*zw>TJA zvlDA=E!%1JvpgyDkQ>Z-pks^#qDTZ^z#5=3E#?@7r1PuwC(p ziFojfrt^nCvpD8I#Up%yI8aUVgYK~{Vf5a|ZLx2+53UUp%C*e;hjKyu|5imQ{K|h| zgUhY-sjYG;>?5xxV*Qn>G!6yFCGS`e9vo*h>2;D7LWzv(Kc*n(xaq5lVVKh$NI)H14HZ{+;wBV{4KB2ID7m;>E4zTT4|GhTt^r=j7xW3Kmbv%uf-Ci#^GL*r^S1;-ICFeK@c=r`OMLY$*Fx&mk7A&^d`E@B7%4q;2D^;LykUFySE+ik4GjQK|mKHcWgJ zHDhVQH>2nGas3#LQ%Cykv~5%Z@w>Ni<0OPz10V0@6P2`h$WXR{t^X$-d^Qg=$E3~e?KUxm23(;eC1L_xAp?uxl;o$Z7Jp?z` zcUAvh_Zk_Fl9Sek(A&z8H?1?`OrQnK&I3@eCz|o1P-cP4OQL#}s_K`9Th5{-0Z$WI z)?KxQma_|U`YRe0sd>$0F>1D~2_W`SdrG{!&?63G9}goH*4s|!^XOI1^^op-j@#&m zU%esn5QJjZnYH*R&Gn6gxA34lZi{GIwBUtZeF4#V8;#I6_1;}4z?e&5yb70g@&SNP ztGt4a>K|!uUrId)(dm6s@5+>a_RhbNT!Y>Wwh?A+6RqZecm2E1w1POG$gWfA$D7rv zo8ezKTC_SE(tNbtfIlm=XRwze%y?EB0&Co2#t)~w;>$Cp+ZLv(bE#iFkb5{kt9Sqi zzZrB{gg1otJWXfJt5HmIrW4dn;alSpHD#Uv4fCm?aoQ#v2`H=3SM|LGjQVgXDtZG| z;e%T{uTNmOP)fJ5`&_xKfL!EMCUX%{B6$1#?wJAh?r7+IZXx3E!NX+<{WRNAusNUl(t_>Wv+SKweoTMNY%}~wiRoX zXyaUbibzzg;A@Whrmi?cDjIXl#oS+I#Nhtp3&K%JF7}jhV(V5`Wcf^}a6Mih>%-7x zTVRvKLceJ!-+@t0)9910j|}6QZwvN~odD$;ja)lX-ZORz6`%=7vrIh#9qz;#9Z_$rlskJ>`nGeVI0FVe&^Cq9 z?C|dD8VO>02;2-{GRGs9$?gLDcIzs=rw->zKR1n#j?fMOP`n0XgHhK=)kM zZA#zyuDxd7dC7#K>{6lKoLq-i>2>JIKYz18)AK3+%^RPqg3{{5$I=pm?<_{)(XC3g zh@Z5Z&~uT=YcQoeB9JQWZjjX>a{9{MuBnth*fi-Bk(czF-(Mfr9RK)R4>amX;gPmB zBOPc}IiXqNniuTC=glWS1X^hHwmlu2P^XM3Xv)2Ecv8mSXj#$-0rGo>hd|Ss2CsUD zLl@Pvjd+a?zs3{o2XSwn4KHp_=kN0Bald;2JM~={m=f z&ug>V%N6=i;r2*Ke^kZ6YqiTnr|TZ0$wldkeZw0Y(=-U@p=ae!s@A9{l$6@ltiw^( zJ23&)oIj+^ZV>XRqVw<@zU+)ipsc%FNMM>uQY%JV-o2>hr(AisHLJB2y}<`BF&JJ# z3f2%7B8cXeeIC7LK!C$UhgD`xje)Z9eg8SdPPMDS3}jYpY;?pSgRDR|O}F5H(#BEs zDNKd=+r-l&c8Rf$*fku-j-4eEf?P>ejZ_m{)-N?|e zKX8S=sl|S-(TB(o(5l@sm~pP5uS`EIf;6h#$HYwM#{FhUS|B6etG#X!VUY=m;VUDO zGd<>XES>vD1P0wNRCDRN3;~|`6~9Wxj^&_1yYp9wO6%iR_7Ro! zlMRJHxooy|)y|Nb(LT<#L~6Z+qEyyiEus(6gocYqnA z>PK0J;QPc{81FoHi-7L+U>Fb6mnUxvWK@<$WtRY3zNszS7Bt1;V%9{mL2{kSu$t!P zh40Lz2kG>2nkvXy4Y90II5&j88bUT)+vWS+D2D#u=l?hYcZeSdWQH)t!Kas5i5;q5 zYlxt=b=5(Iyo6U=LtF1XxrC^+S`+AA^^#E2YD;O6-n>nv^J^E)!yXBG(V7(fDIy_( zQ$dQ0Ym-iGn44OiI(FT$M!dJXcKy+$&av>?%<g$V^@*Rvd zJ@;Pf{v(QL4q1e~o7P(jXju|#7BO~+KMn!r!3$Mef-38D+b3I=bu)IV51qnPn{fI3 z45)Yi6d!32z+urX#R;_^GReR({thKZE7&W}jzAHmU}xi_BFZ<faYbs$TiqAN|a=Y`f`9}PrvYg#4(-G~?`T`ch}M;Q=xj+62?9<#v=wQt!F4QTUg zMk^)reS>(^h9hPvv%THZHQUGc8hmukXoHT;?$9=~IImytqlaNNB7A8#;wxy(GNj;| zQKcrpk;4}VMn#F)Ojdg(Gjj!V%Sh&u;0o|Cwiv<}ub&1+1>mXE0>#7;KtMg5#BC<+ z);D)?Z=7~TjGEb&AwX6OlTbRDvPG76mgLxdPV#emn*QpX3PjV5+#$Fxr1bzBYa^z1 z8*W2Gy)M>tY5%~^8(hrHtnPS41Y4;rf%gm7YEJiTEV1XR5;FaU3K~eOFDdeV9)amC z`uPtFkV^+v?<}TyFVF9_Sl1~y6!%oLQfawe_z~Q9N$JVw!^l@_{&-%FUR`umDg*1H zSU$m{;V|9)Ziw!ExWl3$OloIVLA?@v$VZn2PM!2Q@L*7!KBE*2=V`N~Xt9ToS8s}}e8Hc^LBsPVLq!gj5J%!mx6a3KI+f zPZprS!uAZL6DaDnb;8(g`<7ay<+_$C2pv8h5h}7>eI)w8Wg5bYaoyVk)l_8;atx}* zcdC+>TbK?I8ZPK|2wNyjc)Yw5OzjfA6T}(U`+$rHQr_ah2MCbZg$P5e(39SGtl6wn zBppYsE$ov@JH0z`;Rv$8q4S7+FA#Gd3>dOfH0~Y#k%hoGFGbY>^mhN?QHAyH^jVr=&6XnC>CI@`F6Jha$x@q ze}1t0>9nunpv}JXMWnmtHQR7(a!xNNcWmemQ-Dr@rVugK&?kiU9>drb1zCtHnt)RB zSEb{{3Y?`}=YT!-^1Vki<~Sb#Nsg}*1#r&|);k6B83T(?aU%D=P@X*j+JOiU4L6rN7hS!QG*`(4> z8Kx+EmUt+2d?w8NLk^-(TGln@`50K%i|_q9`8;KL>v=)F+AQ3kFS5IS>f)a}U+z~J zx)4mbJm{BGqv%h6p_F&X>Yu{9T?T{S(=@yzv5EHhrO-v@6QSu;C?)f%k37M4(mHAM z&nkEJvqO-}%hf6rq5g6TQ_N$#Eo8iFZVwAgAjT?hzpWwd!Q&R+x528{r+yk{2p49H zKwrTx#Y;R_eNgn5&u zNBKJL3sJE#Q%13LAR9aC*6oO1*|A#uyyzk-V<9;A~iD|dKmAXBoP>v%eT%*wnviq#TYK&P!8Z)%3=y-&1zj^J+p_JEtaL%v2 z86st824fU$1cbRCHnF4dXD2EZ;+XCoVEKtPT;h6s7A3FO z($enZquT7%uBhk{9hGwe@Mj38W&uv@6srzaRo{e$;B0xzF8E8A^`s&B#Jf-*vzZAE z8taJK4SY*R?E&6*v+Dl_(VA%@Jy_;$_Bc`C!p8Sw#HGm@rV%x9*8985SPlZ>?){!HXc7E4(hd|?f z=$Nz_Q{uI3@7WZi3dU|Oxt@+3OK&+y66zQ2UoE*d9{qIX+a&eXb-ALsCtYI3P}o?(z8?Tsnntd zZ{uWT)I|@5_Fd^!7A)I?7S5`s`0`ZJRXvrPu}pcze<=KmlY;P@Cm(^88p0I(_wAcQ zq$hJPA8>&9WZK)|!M)}?WM`lddtzXrh6clEkE$c=gku?Y+YbHV4{YX1FD_J>zW+q( zA2DxXLPM*`ry>ha#*dxiCYbY^a5J&PqwnR~-1hh76Uo^7@#qyhY9Xwt$thC!gv}aO z!d*Vm7kwO4i0-MpydylLpBc)LQbN+A0<{3IRHJvXLT6Oa_YEgarrygKPROf|810iY zyPg*n7M4uC)8!C)f|Ar9-;g_BCo$wO7)302itv2La-JW4$DKaYeO8Qd7KDx;DP@{x zIrENBQ`q_tlTz&|Uh7Mdz$GQ2hu*!*dkx{)VsfTmxF@j$Te{B=bjsxd<8P{piLL=F zwW-W1^ryu)V3Pcp&$jLT37;%jfSooon0ia{-t6hh)uBQb9tISDB2U_jf{Qgl+1Ok- z6yFFlXE)9gxu2A}||2;68)NlZa5SkJKYe;6lTs%wfxL=oq0 z)X7To5B3#FVG0IDAx=gUka{Np13pk!T5^#rhw(4d#`}7kONdYQu5t_^pTwCW$jZK9 z=|trJh&na+7(9U62v@mi)48s?4HeO)9?Dwr{L?1Mm(&@8b!^^%KW3g&h-_dnOtenZPOmt&XH6q8_yw%C~|>-J=cJ8`5(JGAe^%MRrn*+ z>bbhxwp4)&2`H=TWDXm@+{yd*)r|? z%(9V(BYNMg$g3CAx}bq$Ok+#H3bwyw`_Ip~IE!Y?inuFw9l&zRe&zHA$ic_m5CJFE z^dfXoWqCioC6-j9{`CcQiF2RqGY?*_$LjLv_IK;6rMCB4SzdVh;@@kRwaBG205)xW zq&wy^kevTa~qE`hlPvh1Ho z?_Y#F(Vd80+`t#T6?Jvzy6MPlfA1)1>?0Cu?V6=c_YXg$^psDSx0YNz0Aj$S_mRLd zR1;fePlz25_+tN@@!6bacb*C)rp+%?U1jwj4$K;j`_0k=h(F-ZJRWa9=*;HEx0g7j zVwD{9C=80*)zq+<24@&WCY%{6lqYet7RKg2i_4_DF|H6vs%5%2?_1yQLDL6P}fYWQ{*_Q z6(TIt((|zj@bP+S`&i>45I+xYAF#frDaS++SL_#cZ%=hfTCFvEOzQB1)u-TCH73mR ze2$`2kRkEJJZbdj%bPO@JY4X1kg>|cETh!27BEiJMd>H{W7MOUQxc>;Ap1?glGUGe z#HvnnB8BLC?vY#E?ca;OIRFRk3i!C&t@_q+@L&%jv^)eUSufgXRVl;O$8qHRAg7$j zJ5_|w0Y=?^=e0r#pCg8ZBm=h$86Mxg#_y5YYI(@~`z)N!!^{}+_ETGwKW(^tbrj(XB+LMW7LDIb0D?{}=b-vfV z?c68G`fgq~n`mT}RLLLvm9F$r4|R(IReyhth;qP4-m8;o-@v=pB*ohc$Q;=qo7T)D zb49LuH?vlZPr=AlIU_p1fqQcv5MPmT2VLhUw7qS*Ixn2Qeyx<(xb?MlxpKHVvv`+R zNxf(n)j#{y#=D?>?JCPU_X%MTQizIJzPw}7*@n1qD)GRxLgUK`LgV5`wu(Wt)AYB zFtU(2cPx-Cj^tb=(~L5F_emK@_dzi3vU#c?eN&)DR1vVRWfp!8u-jX__jAf zdjZ6059$Xs=ipz2(3O2$+q=D_*VDWFHv2b(UN~YQ0vRFnOWm?{o2%Gh&4-(!yL&CG z3R2aW)W;w3`A~U=!AswPs(UoM?u0s$N}OyWOi<3p3sb+~q}t1j@m7{6*pw2TW=cDF zeC=nBx4ZC(gh`pB8-Tu$CU~N$a|-Id`iQO*@$e8q<@U@jB=c)_F=lbh#NJn9hrONE)W?95!R)h}ep{(RDy%Db*nrc$i>D%Ad-+~DrPXWou4#Hn_D-Vn^$a*4Qq6rB?eUJ#rxMq~UMy{?@muxumEmSv32F{|9qQ2U5B>w&rl{1fQydmnnEvl z`r*$vZqJWNDa5KzLe2A{a&}wPb0Z=+94~t0B+&mR(B{ysQi7iWhMqBqTlks~)ivBI z=Hp&YieIti9>GDh(6ZzspcUuy;pN#yB2UV%Q$_WCB^SS>Y_NKM56NWG_-2)4_ZEN5 zlH0qXhn&$V6X+hGH#%L{|EXX!-li`pT=UXl1lL+eqL)eVVR;6jSR6*3b3CPzSrOo8d?a`NuqTk zrnEq}BaIOM8Z8i87PdzfaryZf8QAp6T@elOz`3rb(C0#R4zYnu94VSF8>=XycX_53 zFw(}RXG_9)ac6Hv`QFH7Mv#Hc6KJ`Qa`(8U=NParDz2uxLJOwSu9E)zz^Kzi=BnVb ziFt!-5iOuk>ghtNo=WK?)a^ovARY%f#`3T~l}eGdVMaMK;(gYUKwGd}PhuSckrouo zFCH7rdxUcCM!xhbt@Bh$jejm*=KCKF13RzOySf*m-MG%|_XLZ3hf7YmMC<5aR0s|J zf`(~g1x1G7AMXyS@)0_QgZg7bNQ2jpj{(Q%pm1tYW;(zqN0rOLdTaR%^|N1?H$J531@mDh~3*X}DRu z5jbTYy(_s@3Rhtm*J4gUtPHrR@7K+yA?J)dh(~+;!1##_KwNN|D5 zbKsftzP06*q6Rm^y=4ElG$zA1wsG*~%j>x>O+8fW+}1=Zrwl{Fm1G`PXi14;ut{Ap zZ1*bfL)}f=da6NL6RA~{KM`KOBkPSdWds8+czm5e@jcG%N9u{A{>l$(Ef|lF6+YPP{ z6j0B`ugzX*_wd*d=oC!Q?_n=9!m( zd$~!|8?9QxN6%=4b~&3wfrX6_R?;9tA3Wsam{^EV1Z*V{Gf!#I9MfmxSrR@fdAc+4 z70F{g0j}$_C`XB}6ek!QjH3~;#Z40jHBZXn5w z5kh-{4$`8H;;L*TD`Gk)azBm%AF?JmcL+66|8y7h%lJ|0o?$vdDFc$Glx?T5uJ_3f z%u6wa&5%R@fbCvxat<-N{N+raagh8B@(2XXDowjc|J+6E42F_+tH=&o?ZH6s`q zQ{do}nx^{2-b?&_Mp*%6Pf-ia&&OqC2{=K0w;Dp%lx_a{bx%uL%!`K1{J7e?7_qK$ z%r7ZW)QT0BGjG+HSTm;em(f$oA=G3-9{u@00*=qnxuwrFBzx*ZQs_trVhWNN$6RT2_@_GLPlB%U%{9{IWRC~D4H2Mv{c)GSHAo?DhDWAC4 zJ717f6izMbiJcs=tOJ)Eec2k3S*$r6bHX{)4}iy8{l#yecWinxh|PWjAE93RS-=Eh z=)k%zW=kOH|9$?CBXEh}M&NXXQSZo&tJcl zlT3IqN*h7<_xDq);tT3+NvW?Acv1>dp`VDUBS`#6B{bG<7rkCTAwP5bx z(xeulLU>gOs!vT@57aR0SHOhWZsYaM&GPP1Qyuxig-P+DyW2(OgVMcCUHXXH-#0C# zdKmQD7j&j4JEum5)Lo5QIexlh?uLvU3h_rN;$wn-O2G{B+qfSx(02?+GWiH2 zN!j2s0^RY*+YX0}2`FY7a+x}3#&YT2Z__4`(CX$1%Udo9XJ+C%)N<8QTy*E|F|^6) zA8wjd=1C27T_il@hme1HPFOw$2WK*>GIbN=+Gj*hRjIZNb1cqBsERN|@9et2suGN+ zPamdJlo>bh>@joR*5=`Rr)Rm%-ewv#g2g4{oT1Y)ktMDaBf6fI;$CASe;Dfozj3`$ zu>Oc*w+$lSZ~R5V-yfvPKBDM16QmvdHiHX?Lp9a+%3Os2+($#CK+6e|ZyBNX!#>8G zW>w?bes=BpJt#J4j)FJ8#%c$fG)|pyBzc?fjwqon80iyHSM;T(-G$*C41WR zqcbZ*B&}87Ds2jyk&5hq>;>I&P1bIyvECRvsYEW@&yS5C`cE9v)#NW1VsC~@wUzF8 zV)av!7i7-dnjgXgX->Cha)&YA+8>pCL**hKC^^6LZ7Cfi_?o3pcJ0=YkmcU(6Z1>P zDVr57Fz0PJJ^e3HJi}o!kU!B~kZ20xi%BN?=cq}d&Ex#W@VvqVW@T$}y=k?)bp^HI zH(YdEtyM9|m?OX9ZAc9_ko2^^S4DLehN%Vuf~o{(NI+e!pLE<6kayK&U?bKM09?w! zPxw(9SSnGhkAS&A7uBx;bd3^i*iJ=h3J)HBSXgmWK#H6b`sY`_(*~I4rM=hXfcj%= zdOo~ID^tYT8^wY_V?vSU!Og{``W71a)UQdXk=BdkSt$0?@e~CU7DDJlL%+R9b zsN`o)f47|mjKq6dPWNllv=pN}@S9xwFbx)&DADi-xfi>nx(`uS*Y)%TM`A|Z^x_gX z_6MOPTnG|{{u`W`6V~-K=9e2MDZ^4`Ul#aFj2VseG$!ll!*8l&outq8c+C2Ctrlf@ z$y(A@4>bdc+2(&ACZA2%Jy5k=H`e4&f2UraD5_kP5A@YFvs5{+cqnKQ^nD1t7&H~4 z>C9sCU~Ch|H}+3!=x0B&VhsR3_{gUC#CE9T!}%@Icy&V9e7z~BJ6~})OF^Dne#2`% zK>~~&HblL~;J2hk)p-FIqOy;GG_Olk1tmNy-#iRBdm!Gn0Sy#t_*T*VKKDtx+0~%* zFTBzH?b+6EV1@4`Bf`g-6yxgnlq1*hvk6Qc=rL0lZhl9_VP=Vq7~fRyyj}~W#DiRK zS~?fIvqugd$l~u)V zqNdVB;fUXj>%@n}v1e^)P?uEdr=bheMBr>oQyxP=0mN}mo2JACX5pKZ;HI3Afba65 z8Mk*_i-X;IM^>mc{0&|4z_Abeb+7JzO+|#PhXX0x&3k(|Kp||<_sGnQ++2A|^dv)v zrqy6A`7lm*T4RqGbj~Lqy{m`LZsv5!u$U8C2|)L+(GF(juUcz&`fNg8;8qvQzwZNl z((wJgjMJQr-_k#pSM&3&4;~1##_@Tt9a$UY#w&2 zT|v!6Ig1pBu;vnQ_(%O~UKCgapq_HuLwQQVkDHl6E##7>0`cI&eP)wb7)Hq$?vzTu z!O(e{O&6@P>HaiM>Jg!kG~CBD6}vWew(XU3*u{G!>kBTHpaB-h+?yEO4NU^290M z^ut%3fV&VP4)GryMl?~A=ZWrv(62&Sth+JngsF+Uryl06{8P*TNbc~9&&~evE`9^1 zi9u``?mk_@Bqvm{tY;H_36J+@yW{@mL*_V6l1rb=h!1+HDjPn^fjr~QP?_dn641_@ z%=%1l4=S55#K&sBwADvIh}@eJYr0;bF~35tG7M!lg=GA7LEJl zmYpOvy6OSBhRim;fv=$XJsswuUb9xRhpYU*1Q(7E!m8g8s4z}MXx#Fdje~=ic{_?v zI-GM>2*19!d^e;!BDwTO?Vq#GGb64Go4fqH3}WB>!NTMbB*QzVkk&)fqGRy7r1cGL z5a2Xm`j zo89PpFmlaL(sNO`n#*iVZsYrecZ`gCCw?D( zZ#9*O*8hw#ylUimq`|V=U6nHSPm_uxZ#VW4QQX;Qt!Vi5Df7QqPW1HgpR%|OxOl#F z3+~(p#SBVUETVTf)}t^YSWZWBj|AU{r|6Gh2UYqLTivNuUVCo(QjhA7(lXtn-5}lT zwOjfSEJzKUch6OS-N=Ndgv8 z;gdgK$$OtTvi;hgD&$2^FvS3Z^>hrdo%(=tV6yd?F};D_A63`*SD~JsViJr{1O`*3 zY=9pIusljnLXBlIS~Y@8N}~LoERli9?NPryXL-N>`n|4kz2N-TZfT#r_)_8X8y5}o zA3is29*tvgeOJdbteftD%yY!ilNk8E*oitR#%k>K;H@aeAm#FX3}DF4$ljr%$HzyXYi zGiAT_3|mZPogpEgo!&&w$N#y@FziPo#d_^F5rhY!t)zm7kUgaoyd40(@cyu~7OvlF zfjQ?S$aHM*O>@u(ZQD;AeS63$D4%ncZBeFhSrtupU8?yNC!ay6{%-L(!NKFH7Cx)B z^&PX-!0Th?5faW>44XxbB!aQP;hntwyz*3sVsR3JPGVkxMZ8x&yZgv|5GxhWJ9aYfJ~F!~|Qcr!dpT-Za*~cycHh-}BmxNV6yV6{iH&o*mx((tGan z3oXU%m``-|^k|rGznfJGh$RCF-J?bJ+JBwDH=JVPNR<`KX#J-wSt{ z!Gf{g%T5a5?27NU$IDz{MO+@E}I4e0JGBvm}lxdNU&L{8u5SI1z9# zB&RzLWJi~0UGU4=`DJ+|F*t-78BVqlosX-Z`QaH)ocTCB)x@`QIPb#_81f1eT)YYE zw`p5-jtGoG@TU&NLq8`utid`>rE-HUp+YS~WBHvI(;@9LTT6wU{#W{Osr89;P?(_3 zi^t$F{gp{(oay$+TlcAfua4G?gz_%}3=-)*>v^{eDKLDJWr&0pX4V&$-iUkgbLDhk zLVMI6ou%FaFp0J8zPW{?u`~cWCAIW>$@=Dhv~%tM zOz>?uiqM0c$*B<9=E%>0+7gM@UC%wnony;H}(9OCvQAvyyX$@&-oU}^`?E!6|yps&m$Yu|3d zqxqjIM{6e}BdAFdj?`_=cd7$CDM`;V|mm__nfzY)ijjkea525ogzqXFqzY|JtU) zCFOpaNfgZY+%u-qKODDFv-EFi+BZ%D_lO6@2QCoLYclF!T_|?!muTD!I&(Ao0~|kB zU?-2a|8+r~STeO>1(BcnHH~HPIg~S-c$+uDUp1O7dgQ%15hz)uyCYy12dZg)M3v6r z_n#BjgE87Nx+!c!NhkeDOuy#daF}1ydRcb11tUyIbBxVt1+~DoOe6blgg089e4X&3 zYyM@T3vNWi?w8m7m9a2fyuB~5@bWfcrTz8E4o>N6a|WA~YxE}7fG``Bf}_9mNjN=` zk#4Nk=c=uDMh4O7hMn8@@VjR+YPbwzd3RmH`qH}8bgg>xBS1mRV=*fw@W)rC*kH|6 zrLRS?pl-#YFjIW#(cVxCEfEastgo5-*o_&SEX7~Q!yS)g@7V7k+M~Q&2cTZyi`hBWgV!E%DyAZZOtFEoe3uFRL}g{2)Mj2L!FMj zYeV<_kNq5!V zkg4+5@v!>gCFVqA_0;Y`R^+kiBLdV%wIDUi@ipy6tdqtNFw|5W*ue^{@a$gr=4QNzEf-1U+-0 z9e!?Iv9Nz)e%DUjVw$sGkBI0;zpG14UnLK7!bWWm36A^(wOPtS*CCVDtECIXHW6=0 zUAHcUSS55`;B_KsVSe%tSdsGCh%IjzZj;&wMF~3H&d&vxmbdHf>YLahgt{lo z9r;z+se29}j?(#k2z-_w;w)uFN=o9N$}54+>RlJ&EIY$eCH-YOEj_L|Eseo3=!W=v zDd9nH`mv>>_XQH5sTg0)_ui=3UfL(*Kve0=rXrOjQ9zWU|I;e{tnWtWlQg7Wm^|p1 z6ZpZ-(EFw)gth9bw-fJ^J?S^IR;_YaD$RKV@TrKCfZ1X?V3R^kM{B-AT>Vu^t+2&y z{!B+64g!bV>U?3GDGSnmvq7T6z&cB@HKztM(Zt-Ksn5@51f93uw9Y|<_y5f=m+`~l z!;ZvDw1?IG4Wq_2xT}?X`Vx=N35X9P_F%{!M>^Rn9)MQUDH3^teAGCw%J0;6sEAr7 z@~F5(11XsPn&0gDH$~K-O>}n$nWeTslLSwbuFTTrNwc-QBxyqaXrfGcaXCNv zxGhovo`6sM8`xh5wdU+jB5wDzYXNQ&VU3rysYMd%z?xk1?Px*>AuMQ=S1v`F1fcdESyRTUy@0FX+O@QQ*hqj;A zeTAr?q1LNxn8S#pEZ+CZu;N`QU!iY(?EFiyES5}Yly91P^Mh4!(4<~4+3nBbU6_SV zYVAboA=xe!*2ZEc{rB-`BV{p?oV%O?!|L`#cJw}>tJ<5d;(H!m`qOY7tk3)wK69|x zhUll#-JfeQ%5Fhaxd1zd*!;W20@EphEH?cicHwRFh3ldahR(Bdl0470Q-Bs+h*NdX zO$$Put*Wv?zzw75h&kt5o`#^8bP6OHcdUIPEXH8p(^7#6)ZCesPYRAYbAj7;$IZMU)s8)VgTVZRrw^546T z!kd-FOML{`+aQQpRa10%LmKI;WeYfv3c;QPLS_)Y;*|pW)k>3aidN_ zEmYd52#J!+x_*$4{p?mn$&U*ECS40Ty=v zye3afSy_QT$tgunZxLFX*i4e<<;WR1-e>vLex25T0Hq1VUiQ=G;y>%gs(*xI{6h}X zF9+#NGWAKeLsWxTkvwev3za?8prGecr|j=woXeg|{3#xlVkA2PvDg2xSa=O1R1Bv* zbsgBkcf*#9EL>mx0eF6~oK`{B8FDa)8I+73xK^*Kqq&%IJiM40@7ax= 3 # STAC 1.1 has an extra item on root level + def test_get_items_from_stac_catalog_recursive(): stac_root = str(repository_root / "tests/data/recursive-stac-example/collection.json") ret = get_items_from_stac_catalog(stac_root, make_hrefs_absolute=True)