From eb575a8d85e2007ea4821670901d9f987a77bcda Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:00:57 +0900 Subject: [PATCH 01/10] chore: remove Codacy workflow after removing repo from Codacy The repository is no longer registered with Codacy, so CODACY_PROJECT_TOKEN is invalid and this workflow would fail on every run. CodeQL continues to upload SARIF to GitHub code scanning, so security results are not lost. Co-Authored-By: Claude Opus 5 --- .github/workflows/codacy.yml | 61 ------------------------------------ 1 file changed, 61 deletions(-) delete mode 100644 .github/workflows/codacy.yml diff --git a/.github/workflows/codacy.yml b/.github/workflows/codacy.yml deleted file mode 100644 index 789b3ac..0000000 --- a/.github/workflows/codacy.yml +++ /dev/null @@ -1,61 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# This workflow checks out code, performs a Codacy security scan -# and integrates the results with the -# GitHub Advanced Security code scanning feature. For more information on -# the Codacy security scan action usage and parameters, see -# https://github.com/codacy/codacy-analysis-cli-action. -# For more information on Codacy Analysis CLI in general, see -# https://github.com/codacy/codacy-analysis-cli. - -name: Codacy Security Scan - -on: - push: - branches: [ "main" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "main" ] - schedule: - - cron: '38 20 * * 2' - -permissions: - contents: read - -jobs: - codacy-security-scan: - permissions: - contents: read # for actions/checkout to fetch code - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status - name: Codacy Security Scan - runs-on: ubuntu-latest - steps: - # Checkout the repository to the GitHub Actions runner - - name: Checkout code - uses: actions/checkout@v6 - - # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis - - name: Run Codacy Analysis CLI - uses: codacy/codacy-analysis-cli-action@562ee3e92b8e92df8b67e0a5ff8aa8e261919c08 # v4.4.7 - with: - # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository - # You can also omit the token and run the tools that support default configurations - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - verbose: true - output: results.sarif - format: sarif - # Adjust severity of non-security issues - gh-code-scanning-compat: true - # Force 0 exit code to allow SARIF file generation - # This will handover control about PR rejection to the GitHub side - max-allowed-issues: 2147483647 - - # Upload the SARIF file generated in the previous step - - name: Upload SARIF results file - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: results.sarif From 361c05d7e4741aa3b943c03d9697ee4e2cad86fc Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:03:59 +0900 Subject: [PATCH 02/10] style: apply black to unformatted files The tree had drifted out of black compliance. Isolated in its own commit so the mechanical diff does not obscure the substantive changes that follow. Co-Authored-By: Claude Opus 5 --- src/targetdb/utils.py | 20 +++++++++++++++----- tests/integration/test_catalog_active.py | 6 +++--- tests/integration/test_master_tables.py | 4 +++- tests/integration/test_pointings.py | 4 +++- tests/integration/test_setup.py | 4 +++- tests/test_clustering.py | 4 +++- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/targetdb/utils.py b/src/targetdb/utils.py index 9b75dce..eb4f2b5 100644 --- a/src/targetdb/utils.py +++ b/src/targetdb/utils.py @@ -1540,7 +1540,9 @@ def _check_existing_directory(local_dir, upload_id, force): def _download_zip_from_api(url, headers, verify_ssl, local_dir): """Download ZIP file from Web API.""" - response = requests.get(url, headers=headers, stream=True, timeout=300, verify=verify_ssl) + response = requests.get( + url, headers=headers, stream=True, timeout=300, verify=verify_ssl + ) response.raise_for_status() with tempfile.NamedTemporaryFile( @@ -1567,7 +1569,9 @@ def _extract_and_validate_zip(zip_path, upload_id, local_dir, force): # Validate directory structure pattern = re.compile(r"^pfs_target-\d{8}-\d{6}-" + re.escape(upload_id) + r"$") extracted_dirs = [ - d for d in tmp_extract_path.iterdir() if d.is_dir() and pattern.match(d.name) + d + for d in tmp_extract_path.iterdir() + if d.is_dir() and pattern.match(d.name) ] if len(extracted_dirs) == 0: @@ -1597,7 +1601,9 @@ def _extract_and_validate_zip(zip_path, upload_id, local_dir, force): return 1, "success" -def _process_single_upload(upload_id, webapi_url, headers, verify_ssl, local_dir, force): +def _process_single_upload( + upload_id, webapi_url, headers, verify_ssl, local_dir, force +): """Process a single upload_id download.""" # Skip empty or invalid upload_id if pd.isna(upload_id) or str(upload_id).strip() == "": @@ -1621,7 +1627,9 @@ def _process_single_upload(upload_id, webapi_url, headers, verify_ssl, local_dir try: zip_path = _download_zip_from_api(full_url, headers, verify_ssl, local_dir) try: - n_transfer, status = _extract_and_validate_zip(zip_path, upload_id, local_dir, force) + n_transfer, status = _extract_and_validate_zip( + zip_path, upload_id, local_dir, force + ) return status, n_transfer finally: zip_path.unlink() @@ -1640,7 +1648,9 @@ def _process_single_upload(upload_id, webapi_url, headers, verify_ssl, local_dir logger.error(str(e)) return "FAILED", 0 except Exception as e: - logger.error(f"Unexpected error while transferring data for upload_id: {upload_id}") + logger.error( + f"Unexpected error while transferring data for upload_id: {upload_id}" + ) logger.error(str(e)) return "FAILED", 0 diff --git a/tests/integration/test_catalog_active.py b/tests/integration/test_catalog_active.py index c669f42..2166bb9 100644 --- a/tests/integration/test_catalog_active.py +++ b/tests/integration/test_catalog_active.py @@ -16,9 +16,9 @@ def _read_active_flags(engine): def test_update_catalog_active_only_affects_target_row(engine, master_data, db_config): before = _read_active_flags(engine) - assert TARGET_CATALOG_ID in before, ( - f"expected input_catalog_id={TARGET_CATALOG_ID} from examples/data/input_catalogs.csv" - ) + assert ( + TARGET_CATALOG_ID in before + ), f"expected input_catalog_id={TARGET_CATALOG_ID} from examples/data/input_catalogs.csv" run_cli( "update-catalog-active", diff --git a/tests/integration/test_master_tables.py b/tests/integration/test_master_tables.py index 130d22e..3f142a7 100644 --- a/tests/integration/test_master_tables.py +++ b/tests/integration/test_master_tables.py @@ -10,7 +10,9 @@ # input_catalogs.csv, so it is checked separately below rather than via the # generic 1:1 CSV-to-table comparison. SIMPLE_MASTER_TABLES = [ - (table, filename) for table, filename in MASTER_TABLE_FILES if table != "input_catalog" + (table, filename) + for table, filename in MASTER_TABLE_FILES + if table != "input_catalog" ] diff --git a/tests/integration/test_pointings.py b/tests/integration/test_pointings.py index 84b4e1d..508905d 100644 --- a/tests/integration/test_pointings.py +++ b/tests/integration/test_pointings.py @@ -46,7 +46,9 @@ def test_user_pointing_only_for_flagged_catalogs(engine, pointing_data, target_d assert actual == 0 -def test_user_pointing_total_matches_flagged_catalogs(engine, pointing_data, target_data): +def test_user_pointing_total_matches_flagged_catalogs( + engine, pointing_data, target_data +): catalogs_df = pd.read_csv(INPUT_CATALOGS_CSV) flagged = catalogs_df[catalogs_df["is_user_pointing"]] diff --git a/tests/integration/test_setup.py b/tests/integration/test_setup.py index a38041c..d5b8c33 100644 --- a/tests/integration/test_setup.py +++ b/tests/integration/test_setup.py @@ -8,7 +8,9 @@ def test_q3c_extension_installed(engine, q3c_installed): with engine.connect() as conn: - extnames = {row[0] for row in conn.execute(text("SELECT extname FROM pg_extension"))} + extnames = { + row[0] for row in conn.execute(text("SELECT extname FROM pg_extension")) + } assert "q3c" in extnames diff --git a/tests/test_clustering.py b/tests/test_clustering.py index f7dd077..1c43d9a 100644 --- a/tests/test_clustering.py +++ b/tests/test_clustering.py @@ -24,7 +24,9 @@ def test_run_clustering(): # returned_n_noises = [] for th in threshs: - labels = clustering_targets.run_clustering(ra, dec, distance_threshold=th) # noqa: F821 + labels = clustering_targets.run_clustering( # noqa: F821 + ra, dec, distance_threshold=th + ) print(f"{labels=}") n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) # n_noise_ = list(labels).count(-1) From 86a72da53c920f4c0873005eb7e6ad60ea637c34 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:12:27 +0900 Subject: [PATCH 03/10] chore: expand ruff rule selection select was commented out, leaving ruff's defaults with F401, F841, E501, B008 and C901 further suppressed, so ruff reported no findings at all. Also fixes two defects: target-version said py312 while requires-python allows 3.11, which would let UP rules emit 3.12-only syntax; and the setuptools-scm-generated _version.py was being linted despite being gitignored and absent from a fresh checkout. Findings are resolved in the following commit. Co-Authored-By: Claude Opus 5 --- pyproject.toml | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e436c65..c157cd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,27 +78,22 @@ gen-requirements = { cmd = [ ], help = "Generate requirements.txt" } [tool.ruff] -target-version = "py312" +# Matches requires-python (">=3.11"). Do not raise this without raising +# requires-python: with UP rules enabled, ruff rewrites code to the target +# version's syntax. +target-version = "py311" line-length = 88 -# line-length = 128 +# Generated by setuptools-scm and gitignored. It exists locally but not in a +# fresh CI checkout, so linting it makes the checked file set environment- +# dependent. +extend-exclude = ["src/targetdb/_version.py"] [tool.ruff.lint] +# C4 is flake8-comprehensions, unrelated to C901 (mccabe), which stays off. +select = ["E", "W", "F", "I", "B", "C4", "UP"] ignore = [ - "F401", # module imported but unused - "F841", # local variable is assigned to but never used - "E501", # line too long, handled by black - "B008", # do not perform function calls in argument defaults - "C901", # too complex + "E501", # line too long -- black owns line length ] -# select = [ -# "E", # pycodestyle errors -# "W", # pycodestyle warnings -# "F", # pyflakes -# "I", # isort -# "B", # flake8-bugbear -# "C4", # flake8-comprehensions -# "UP", # pyupgrade -# ] [tool.setuptools] package-dir = { "" = "src" } From 268ff349da752c0c848924ad57666655dc5e48a2 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:18:48 +0900 Subject: [PATCH 04/10] fix: resolve ruff findings Nine findings auto-fixed by `ruff check --fix` (import sorting, PEP 585/604 annotations, useless object inheritance, f-string conversion, and the typing import cleanup, which ruff performed itself as a cascading fix once List/Optional became unused). C416 fixed by hand (ruff's unsafe-fix category). Two findings are suppressed rather than fixed: - F401 on models/proposal.py: `partner` is imported defensively. models/__init__.py already imports partner six lines before proposal is imported, so proposal.py's own import is not what registers the model today; configure_mappers() succeeds without it, and the test suite currently passes identically with or without this line, so it does not discriminate between the two states. The import is kept so that the string-based ForeignKey("partner.partner_id") keeps resolving even if __init__.py's import order is ever changed. - B006 on cli/cli_main.py: the mutable default is the standard Typer Annotated idiom and Typer does not mutate it. Co-Authored-By: Claude Opus 5 --- src/targetdb/cli/cli_main.py | 14 +++++++++----- src/targetdb/models/proposal.py | 2 +- src/targetdb/targetdb.py | 5 ++--- src/targetdb/utils.py | 2 +- tests/integration/test_targets.py | 2 +- tests/test_models.py | 1 + 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/targetdb/cli/cli_main.py b/src/targetdb/cli/cli_main.py index 3231aa1..f8182bb 100644 --- a/src/targetdb/cli/cli_main.py +++ b/src/targetdb/cli/cli_main.py @@ -3,7 +3,7 @@ import time from enum import Enum from pathlib import Path -from typing import Annotated, List, Optional +from typing import Annotated import rich import typer @@ -197,7 +197,7 @@ def checkdups( typer.Option("--skip-save-merged", help="Do not save the merged DataFrame."), ] = False, additional_columns: Annotated[ - List[str] | None, + list[str] | None, typer.Option( "--additional-columns", help="Additional columns to output for the merged file. (e.g., 'psf_mag_g' 'psf_mag_r'). " @@ -206,12 +206,16 @@ def checkdups( ), ] = None, check_columns: Annotated[ - List[str], + list[str], typer.Option( "--check-columns", help="Columns used to check for duplicates.", ), - ] = ["obj_id", "input_catalog_id", "version"], + ] = [ # noqa: B006 -- Typer option default; Typer does not mutate it + "obj_id", + "input_catalog_id", + "version", + ], file_format: Annotated[ PyArrowFileFormat, typer.Option( @@ -369,7 +373,7 @@ def diagram( ) def mdtable( output_file: Annotated[ - Optional[str], typer.Option("--output-file", "-o", help="Output file.") + str | None, typer.Option("--output-file", "-o", help="Output file.") ] = None, ): generate_schema_markdown(output_file=output_file) diff --git a/src/targetdb/models/proposal.py b/src/targetdb/models/proposal.py index 6fb75e2..1e48e6b 100644 --- a/src/targetdb/models/proposal.py +++ b/src/targetdb/models/proposal.py @@ -16,7 +16,7 @@ Base, comment_created_at, comment_updated_at, - partner, + partner, # noqa: F401 -- defensive: __init__ imports partner first; FK order-safe proposal_category, # proposal_grade, utcnow, diff --git a/src/targetdb/targetdb.py b/src/targetdb/targetdb.py index 154d888..7661431 100644 --- a/src/targetdb/targetdb.py +++ b/src/targetdb/targetdb.py @@ -3,16 +3,15 @@ import io import pandas as pd +from loguru import logger from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker from sqlalchemy.sql import text -from loguru import logger - from . import models -class TargetDB(object): +class TargetDB: # url = "postgresql://pfs@db-ics:5432/opdb" def __init__( diff --git a/src/targetdb/utils.py b/src/targetdb/utils.py index eb4f2b5..e361dd6 100644 --- a/src/targetdb/utils.py +++ b/src/targetdb/utils.py @@ -239,7 +239,7 @@ def generate_schema_markdown(output_file=None): for t in Base.metadata.sorted_tables: - out_md += "\n## {:s}\n\n".format(t.name) + out_md += f"\n## {t.name:s}\n\n" df = pd.DataFrame( [], columns=["name", "type", "primary_key", "autoincrement", "comment"] diff --git a/tests/integration/test_targets.py b/tests/integration/test_targets.py index bdbbddd..9e3ec89 100644 --- a/tests/integration/test_targets.py +++ b/tests/integration/test_targets.py @@ -37,7 +37,7 @@ def test_input_catalogs_registered_with_upload_id(engine, target_data, catalogs_ "WHERE upload_id IS NOT NULL" ) ).fetchall() - registered = {name: upload_id for name, upload_id in rows} + registered = dict(rows) for _, row in catalogs_df.iterrows(): assert registered.get(row["input_catalog_name"]) == row["upload_id"] diff --git a/tests/test_models.py b/tests/test_models.py index 77d8b59..fd254b7 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -3,6 +3,7 @@ # ref: https://github.com/Subaru-PFS/spt_operational_database/blob/master/tests/test_models.py from sqlalchemy.orm import aliased + from targetdb import models From 6fdfeb80dadcb28863b7951f12b7efac63f5434f Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:40:30 +0900 Subject: [PATCH 05/10] ci: add lint workflow and pre-commit config Replaces the repository-external Codacy checks with equivalents whose configuration lives in the repository. ruff findings surface as inline PR annotations via --output-format=github. Kept separate from test_database.yml so lint results do not wait on Postgres startup and ER diagram generation. Co-Authored-By: Claude Opus 5 --- .github/workflows/lint.yml | 37 ++++++++++++++++ .pre-commit-config.yaml | 30 +++++++++++++ README.md | 11 +++++ pyproject.toml | 10 ++++- uv.lock | 90 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..58efb6c --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,37 @@ +name: Lint + +on: + pull_request: + branches: [main] + push: + branches: [main] + +jobs: + lint: + name: ruff + black + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Install uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + with: + enable-cache: true + + - name: Set up Python + run: uv python install 3.12 + + - name: Install dependencies + run: uv sync --extra dev + + # --output-format=github renders findings as inline PR annotations, + # which is the part of the Codacy integration worth keeping. + - name: Run ruff + run: uv run ruff check --output-format=github src tests + + - name: Run black + run: uv run black --check --diff src tests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b6a5a24 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,30 @@ +# Keep ruff and black revs in step with the versions in the dev extra of +# pyproject.toml. Drift between them produces the "passes locally, fails in +# CI" failure mode. +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.14.11 + hooks: + - id: ruff + args: [--fix] + # Match the Lint workflow, which checks src and tests only. + # alembic/ migrations are historical and deliberately unlinted. + files: ^(src|tests)/ + + - repo: https://github.com/psf/black + rev: 25.12.0 + hooks: + - id: black + files: ^(src|tests)/ + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + # mkdocs-material's config uses !!python/name: tags, which + # yaml.safe_load cannot construct. + exclude: ^mkdocs\.yml$ + - id: check-toml + - id: check-added-large-files diff --git a/README.md b/README.md index 6a2abf4..0111b63 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,17 @@ If you want to install the package under the Python library directory, you can e The installation process will install some command-line tools under the directory where your Python executable is located. +### Development setup + +If you are going to contribute, install the development dependencies and enable the pre-commit hooks: + +```console +python3 -m pip install -e ".[dev]" +pre-commit install +``` + +The hooks run `ruff` and `black` when you commit. CI enforces the same two checks, so passing the hooks locally means the `Lint` workflow will pass. + ## Usage Examples diff --git a/pyproject.toml b/pyproject.toml index c157cd0..d9edf95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,15 @@ source = "https://github.com/Subaru-PFS/ets_target_database" pfs-targetdb-cli = "targetdb.cli.cli_main:app" [project.optional-dependencies] -dev = ["ipython", "pytest", "pytest-cov", "black", "ruff", "setuptools-scm>=8.0"] +dev = [ + "ipython", + "pytest", + "pytest-cov", + "black", + "ruff", + "pre-commit", + "setuptools-scm>=8.0", +] doc = ["mkdocs<2", "mkdocs-material[imaging]"] [build-system] diff --git a/uv.lock b/uv.lock index b09118d..34401b5 100644 --- a/uv.lock +++ b/uv.lock @@ -182,6 +182,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, ] +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.4" @@ -319,6 +328,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] +[[package]] +name = "distlib" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, +] + [[package]] name = "et-xmlfile" version = "2.0.0" @@ -351,6 +369,7 @@ dependencies = [ dev = [ { name = "black" }, { name = "ipython" }, + { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "ruff" }, @@ -373,6 +392,7 @@ requires-dist = [ { name = "numpy", specifier = ">=2.0" }, { name = "openpyxl" }, { name = "pandas" }, + { name = "pre-commit", marker = "extra == 'dev'" }, { name = "psycopg2-binary" }, { name = "pyarrow" }, { name = "pytest", marker = "extra == 'dev'" }, @@ -397,6 +417,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] +[[package]] +name = "filelock" +version = "3.32.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/57/3ba6e6cb097f85b855b00163d169f35365f44277df044dcf96d55b8f62a3/filelock-3.32.2.tar.gz", hash = "sha256:c33351e1f49cae33414acbc6d56784e6ecee82514ec90795da1161fc4836b5b8", size = 217172, upload-time = "2026-07-29T22:46:04.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/e8/72f8cef9fdfeffe06213fe8508039396ee48daa0e3259457ed766173bfd6/filelock-3.32.2-py3-none-any.whl", hash = "sha256:87dd94cf281e586d135fa51132b8e3d9a598b316e90377a288663c9321036c82", size = 98830, upload-time = "2026-07-29T22:46:03.52Z" }, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -431,6 +460,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/79/3912a94cf27ec503e51ba493692d6db1e3cd8ac7ac52b0b47c8e33d7f4f9/greenlet-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7a34b13d43a6b78abf828a6d0e87d3385680eaf830cd60d20d52f249faabf39", size = 301964, upload-time = "2025-12-04T14:36:58.316Z" }, ] +[[package]] +name = "identify" +version = "2.6.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, +] + [[package]] name = "idna" version = "3.11" @@ -697,6 +735,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + [[package]] name = "numpy" version = "2.4.0" @@ -877,6 +924,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "pre-commit" +version = "4.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/3a/ddb78f32a0814e66b18a099377a106a2dcdce92d86a034d69d65df9b256e/pre_commit-4.6.1.tar.gz", hash = "sha256:03e809865c7d178b9979d06c761fcbfe6808fdaded8581a745bb110e52050421", size = 198646, upload-time = "2026-07-21T20:56:58.225Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/49/bc925106abcdac498074f2cbe6137e94e09f418dd2b7775df5b577dc0313/pre_commit-4.6.1-py2.py3-none-any.whl", hash = "sha256:0e3b2942510d1fb34eec167a3ec57331bf8442122f1153a9fb8b58f5c49b2717", size = 226186, upload-time = "2026-07-21T20:56:57.064Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.52" @@ -1050,6 +1113,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-discovery" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/b7/1581a8103855c43567776aa34135e5ec3c597346c23bfd10c7eb5e0b10a4/python_discovery-1.5.1.tar.gz", hash = "sha256:e2ea8b884cd1701f386eda8cf327b87743f1dc21b7f784470799537d95635384", size = 77200, upload-time = "2026-07-31T22:06:02.48Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/07/a89b539750a159d5101c4eb9fc84e2961f65cefbd5e0b7440b284471c0b0/python_discovery-1.5.1-py3-none-any.whl", hash = "sha256:ac07f44cade589d954e9d6a1e1468539fdddd2cf676beb51da73e0f156b7c932", size = 35752, upload-time = "2026-07-31T22:06:01.116Z" }, +] + [[package]] name = "pytokens" version = "0.3.0" @@ -1352,6 +1427,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] +[[package]] +name = "virtualenv" +version = "21.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/fa/18004e5cb15541ad2a68ff219c755233b012b12d4ec8663d06a258082bec/virtualenv-21.7.1.tar.gz", hash = "sha256:d0dbfaa5483487baea28d7210ef8d24c9d1bd0f10f449eeb215568825a9b334e", size = 5525237, upload-time = "2026-07-30T15:40:36.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/a7/ded126c19495158a05c7202b3389139839d4cf78d622d453867778e0f7a8/virtualenv-21.7.1-py3-none-any.whl", hash = "sha256:6394973f990536e34c05157179146c020284c42fe01da1dfeb0ba16c345280d9", size = 5504576, upload-time = "2026-07-30T15:40:34.512Z" }, +] + [[package]] name = "watchdog" version = "6.0.0" From 1bdd471c652004a6573774ed84896c1787b48023 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 16:51:06 +0900 Subject: [PATCH 06/10] style: normalize trailing whitespace and end-of-file newlines Mechanical sweep by the pre-commit hooks added in the preceding commit. Whitespace and final-newline changes only; no file's content is otherwise altered. Co-Authored-By: Claude Opus 5 --- alembic/local_test/alembic/README | 2 +- .../alembic/versions/6407841f5938_baseline.py | 2 +- ...12-103708_33e97fab1034_initial_revision.py | 2 +- ..._add_unique_constraint_on_the_sky_table.py | 2 +- ...1_add_index_in_obj_id_input_catalog_id_.py | 2 +- docs/examples/index.md | 2 +- docs/reference/api.md | 2 +- examples/data/filter_names.csv | 2 +- examples/data/input_catalogs.csv | 2 +- examples/data/proposals.csv | 2 +- .../example_input_catalogs_current.csv | 1 - .../ppp_figure_c9d7ad93118243b5.html | 80 +++++++++---------- .../ppp_figure_62efdd6a9000639d.html | 80 +++++++++---------- mkdocs.yml | 2 +- 14 files changed, 91 insertions(+), 92 deletions(-) diff --git a/alembic/local_test/alembic/README b/alembic/local_test/alembic/README index 98e4f9c..2500aa1 100644 --- a/alembic/local_test/alembic/README +++ b/alembic/local_test/alembic/README @@ -1 +1 @@ -Generic single-database configuration. \ No newline at end of file +Generic single-database configuration. diff --git a/alembic/local_test/alembic/versions/6407841f5938_baseline.py b/alembic/local_test/alembic/versions/6407841f5938_baseline.py index 96e8a4e..002befe 100644 --- a/alembic/local_test/alembic/versions/6407841f5938_baseline.py +++ b/alembic/local_test/alembic/versions/6407841f5938_baseline.py @@ -1,7 +1,7 @@ """baseline Revision ID: 6407841f5938 -Revises: +Revises: Create Date: 2022-05-11 16:21:57.324356 """ diff --git a/alembic/pfsa-db01-gb/alembic/versions/20220512-103708_33e97fab1034_initial_revision.py b/alembic/pfsa-db01-gb/alembic/versions/20220512-103708_33e97fab1034_initial_revision.py index 128d2ed..69b8fd3 100644 --- a/alembic/pfsa-db01-gb/alembic/versions/20220512-103708_33e97fab1034_initial_revision.py +++ b/alembic/pfsa-db01-gb/alembic/versions/20220512-103708_33e97fab1034_initial_revision.py @@ -1,7 +1,7 @@ """initial revision Revision ID: 33e97fab1034 -Revises: +Revises: Create Date: 2022-05-12 10:37:08.039899 """ diff --git a/alembic/pfsa-db01-gb/alembic/versions/20240417-100959_c636e8e2ecc0_add_unique_constraint_on_the_sky_table.py b/alembic/pfsa-db01-gb/alembic/versions/20240417-100959_c636e8e2ecc0_add_unique_constraint_on_the_sky_table.py index 479972d..7cfe4bf 100644 --- a/alembic/pfsa-db01-gb/alembic/versions/20240417-100959_c636e8e2ecc0_add_unique_constraint_on_the_sky_table.py +++ b/alembic/pfsa-db01-gb/alembic/versions/20240417-100959_c636e8e2ecc0_add_unique_constraint_on_the_sky_table.py @@ -4,7 +4,7 @@ Revises: 065b74905fb6 Create Date: 2024-04-17 10:09:59.291914 -Note: +Note: Before upgrading the database, I run the following query to avoid the violation of the unique constaint: ``` UPDATE sky SET obj_id = sky_id WHERE version = '20220915'; diff --git a/alembic/pfsa-db01-gb/alembic/versions/20250801-202638_89865530fdf1_add_index_in_obj_id_input_catalog_id_.py b/alembic/pfsa-db01-gb/alembic/versions/20250801-202638_89865530fdf1_add_index_in_obj_id_input_catalog_id_.py index ea372c2..271a2d4 100644 --- a/alembic/pfsa-db01-gb/alembic/versions/20250801-202638_89865530fdf1_add_index_in_obj_id_input_catalog_id_.py +++ b/alembic/pfsa-db01-gb/alembic/versions/20250801-202638_89865530fdf1_add_index_in_obj_id_input_catalog_id_.py @@ -1,4 +1,4 @@ -"""add index in obj_id, input_catalog_id, and proposal_id for target table +"""add index in obj_id, input_catalog_id, and proposal_id for target table Revision ID: 89865530fdf1 Revises: 3923581e4392 diff --git a/docs/examples/index.md b/docs/examples/index.md index 7adaeb5..e66ac16 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -6,4 +6,4 @@ Some simple examples to work with `targetdb` are provided as follows. - [Preparation of input data](preparation.md): how to prepare input data for `targetdb`. - [Useful queries](queries.md): useful queries to work with `targetdb`. - [Run `targetdb` in a Docker container](docker.md): how to run `targetdb` in a Docker container. -- [Tutorial on preparing PFS openuse](obsproc.md): Workflow to prepare the database content for PFS openuse observations. \ No newline at end of file +- [Tutorial on preparing PFS openuse](obsproc.md): Workflow to prepare the database content for PFS openuse observations. diff --git a/docs/reference/api.md b/docs/reference/api.md index f54e4d4..31ecea5 100644 --- a/docs/reference/api.md +++ b/docs/reference/api.md @@ -1,3 +1,3 @@ # API Reference -TBD \ No newline at end of file +TBD diff --git a/examples/data/filter_names.csv b/examples/data/filter_names.csv index d59330b..e515df6 100644 --- a/examples/data/filter_names.csv +++ b/examples/data/filter_names.csv @@ -18,4 +18,4 @@ u_sdss,SDSS u filter g_sdss,SDSS g filter r_sdss,SDSS r filter i_sdss,SDSS i filter -z_sdss,SDSS z filter \ No newline at end of file +z_sdss,SDSS z filter diff --git a/examples/data/input_catalogs.csv b/examples/data/input_catalogs.csv index deaee9f..c410065 100644 --- a/examples/data/input_catalogs.csv +++ b/examples/data/input_catalogs.csv @@ -15,4 +15,4 @@ input_catalog_id,input_catalog_name,input_catalog_description,upload_id 1001,sky_hscssp_s21a_wide,Sky positions from S21A HSC-SSP (Wide), 1002,sky_s1,Sky positions from PS1, 1003,sky_gaia,Sky positions from Gaia, -1004,sky_nops1,Sky postionns for regions without PS1 data, \ No newline at end of file +1004,sky_nops1,Sky postionns for regions without PS1 data, diff --git a/examples/data/proposals.csv b/examples/data/proposals.csv index 50a03ef..3ecdab6 100644 --- a/examples/data/proposals.csv +++ b/examples/data/proposals.csv @@ -35,4 +35,4 @@ S24B-QT910,o00010,Wanqiu,He,NaN,7.5,B,5307.25,5307.25,0.0,1,subaru,False S24B-QT911,o00011,Mao,Zhiying,NaN,10.0,A,5348.05,5348.05,0.0,1,subaru,False S24B-QT912,o00012,Yuki,Moritani,NaN,9.5,A,350.25,350.25,0.0,1,subaru,False S24B-QT913,o00013,Vera,Passegger,Maria,7.0,B,263.0,263.0,0.0,1,subaru,False -S24B-QT914,o00014,Miho,Ishigaki,NaN,0.0,F,0.0,0.0,0.0,1,subaru,False \ No newline at end of file +S24B-QT914,o00014,Miho,Ishigaki,NaN,0.0,F,0.0,0.0,0.0,1,subaru,False diff --git a/examples/data/targets/example_input_catalogs_current.csv b/examples/data/targets/example_input_catalogs_current.csv index 14a37ca..f833f06 100644 --- a/examples/data/targets/example_input_catalogs_current.csv +++ b/examples/data/targets/example_input_catalogs_current.csv @@ -1,2 +1 @@ input_catalog_name,input_catalog_description,upload_id,proposal_id,is_classical,is_user_pointing - diff --git a/examples/data/uploader/2024/09/20240921-041833-c9d7ad93118243b5/ppp_figure_c9d7ad93118243b5.html b/examples/data/uploader/2024/09/20240921-041833-c9d7ad93118243b5/ppp_figure_c9d7ad93118243b5.html index 9602f02..14966fd 100644 --- a/examples/data/uploader/2024/09/20240921-041833-c9d7ad93118243b5/ppp_figure_c9d7ad93118243b5.html +++ b/examples/data/uploader/2024/09/20240921-041833-c9d7ad93118243b5/ppp_figure_c9d7ad93118243b5.html @@ -699,21 +699,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1417,21 +1417,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1500,21 +1500,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1645,21 +1645,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1768,21 +1768,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -9024,21 +9024,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -9099,19 +9099,19 @@ /* This file was adapted from https://github.com/uber/deck.gl/ the LICENSE below is preserved to comply with the original license. - + Copyright (c) 2015 - 2017 Uber Technologies, Inc. - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -9126,19 +9126,19 @@ "2cc1a33000": function _(e,t,a,r,n){function i(e){let t=null;return e&&(t=function(e){try{return{boundingClientRect:{...e.getBoundingClientRect()}}}catch{return{}}}(e),e.tagName in l&&l[e.tagName].forEach((a=>Object.assign(t,a(e))))),t}r(),a.serializeEvent= /* The MIT License (MIT) - + Copyright (c) 2019 Ryan S. Morshead - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -9213,7 +9213,7 @@
- + @@ -9252,4 +9252,4 @@ })(); - \ No newline at end of file + diff --git a/examples/data/uploader/2025/01/20250128-043634-62efdd6a9000639d/ppp_figure_62efdd6a9000639d.html b/examples/data/uploader/2025/01/20250128-043634-62efdd6a9000639d/ppp_figure_62efdd6a9000639d.html index 4f13016..9e01b04 100644 --- a/examples/data/uploader/2025/01/20250128-043634-62efdd6a9000639d/ppp_figure_62efdd6a9000639d.html +++ b/examples/data/uploader/2025/01/20250128-043634-62efdd6a9000639d/ppp_figure_62efdd6a9000639d.html @@ -694,21 +694,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1426,21 +1426,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1511,21 +1511,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1656,21 +1656,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -1779,21 +1779,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -9044,21 +9044,21 @@ /*! * Copyright (c) Anaconda, Inc., and Bokeh Contributors * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * Neither the name of Anaconda nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -9160,19 +9160,19 @@ "2cc1a33000": function _(e,t,a,r,n){function i(e){let t=null;return e&&(t=function(e){try{return{boundingClientRect:{...e.getBoundingClientRect()}}}catch{return{}}}(e),e.tagName in l&&l[e.tagName].forEach((a=>Object.assign(t,a(e))))),t}r(),a.serializeEvent= /* The MIT License (MIT) - + Copyright (c) 2019 Ryan S. Morshead - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -9222,19 +9222,19 @@ /* This file was adapted from https://github.com/uber/deck.gl/ the LICENSE below is preserved to comply with the original license. - + Copyright (c) 2015 - 2017 Uber Technologies, Inc. - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -9316,7 +9316,7 @@
- + @@ -9355,4 +9355,4 @@ })(); - \ No newline at end of file + diff --git a/mkdocs.yml b/mkdocs.yml index eea69e1..a1eabfc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,4 +115,4 @@ extra: social: - icon: fontawesome/brands/github link: https://github.com/Subaru-PFS/ets_target_database/ - name: Subaru-PFS/ets_target_database on GitHub \ No newline at end of file + name: Subaru-PFS/ets_target_database on GitHub From 2eb907275dc2569678ac32912124d977b55f1811 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 17:12:37 +0900 Subject: [PATCH 07/10] chore: address final review findings on the lint tooling - Exclude alembic in the ruff config itself, not just in the runners' arguments, so editors and a bare `ruff check .` agree with CI. The migrations are historical records and are deliberately unlinted. - Drop `--fix` from the pre-commit ruff hook. F401 is auto-fixable, and this package uses deliberate registration-only imports; a hook that rewrites them can silently delete one and surface it later as a mapper-configuration failure. The hook now matches CI's check-only behaviour. - Rename the hook to its current id, `ruff-check`; `ruff` is a legacy alias that a future rev bump may drop. - Scope the whitespace hooks and the large-file check away from examples/data/uploader/, which holds multi-megabyte vendored fixtures. - Correct the README's claim that passing the hooks implies CI will pass. - Make black's exclusion of the generated _version.py explicit. Co-Authored-By: Claude Opus 5 --- .pre-commit-config.yaml | 15 +++++++++++++-- README.md | 2 +- pyproject.toml | 8 +++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b6a5a24..d81b501 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,8 +5,11 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.11 hooks: - - id: ruff - args: [--fix] + - id: ruff-check + # No --fix: this package uses deliberate registration-only imports + # (e.g. models/proposal.py's `partner # noqa: F401`) that F401's + # autofix would silently delete. Report-only also matches the + # check-only Lint workflow. # Match the Lint workflow, which checks src and tests only. # alembic/ migrations are historical and deliberately unlinted. files: ^(src|tests)/ @@ -21,10 +24,18 @@ repos: rev: v5.0.0 hooks: - id: trailing-whitespace + # Vendored Bokeh-generated HTML fixtures; rewriting them on every + # regeneration produces a phantom whitespace-only diff. + exclude: ^examples/data/uploader/ - id: end-of-file-fixer + # Same vendored fixtures as trailing-whitespace above. + exclude: ^examples/data/uploader/ - id: check-yaml # mkdocs-material's config uses !!python/name: tags, which # yaml.safe_load cannot construct. exclude: ^mkdocs\.yml$ - id: check-toml - id: check-added-large-files + # Uploader example fixtures (e.g. ppp_figure_*.html) legitimately + # exceed the default 500kb limit and are committed on purpose. + exclude: ^examples/data/uploader/ diff --git a/README.md b/README.md index 0111b63..9ac634e 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ python3 -m pip install -e ".[dev]" pre-commit install ``` -The hooks run `ruff` and `black` when you commit. CI enforces the same two checks, so passing the hooks locally means the `Lint` workflow will pass. +The hooks run `ruff` and `black` on the files you stage, plus whitespace and syntax checks. CI runs `ruff` and `black` over all of `src` and `tests`; run `pre-commit run --all-files` to check the whole tree the way CI does. ## Usage Examples diff --git a/pyproject.toml b/pyproject.toml index d9edf95..498db99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,6 +68,9 @@ markers = [ [tool.black] line-length = 88 +# Generated by setuptools-scm and gitignored; see the matching ruff +# extend-exclude below for why it's kept out of linting/formatting. +extend-exclude = "src/targetdb/_version\\.py" [tool.pdm.scripts] serve-doc = { shell = "mkdocs serve", help = "Start the dev server for doc preview" } @@ -94,7 +97,10 @@ line-length = 88 # Generated by setuptools-scm and gitignored. It exists locally but not in a # fresh CI checkout, so linting it makes the checked file set environment- # dependent. -extend-exclude = ["src/targetdb/_version.py"] +# alembic/ migrations are historical records and are deliberately not +# linted -- excluding it here (not just in the runners' arguments) keeps +# editors and a bare `ruff check .` in agreement with CI. +extend-exclude = ["src/targetdb/_version.py", "alembic"] [tool.ruff.lint] # C4 is flake8-comprehensions, unrelated to C901 (mccabe), which stays off. From a5d860c90ab83162a1a47e4c5dafc8c5a7b6b084 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Tue, 4 Aug 2026 17:32:24 +0900 Subject: [PATCH 08/10] chore: exclude alembic from black as well as ruff The preceding commit moved the alembic exclusion into the ruff config so editors and a bare `ruff check .` agree with CI. black had the same gap: its config excluded only the generated _version.py, so an editor's black extension with format-on-save would reformat historical migrations that CI never inspects. Co-Authored-By: Claude Opus 5 --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 498db99..96d24ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,7 +70,10 @@ markers = [ line-length = 88 # Generated by setuptools-scm and gitignored; see the matching ruff # extend-exclude below for why it's kept out of linting/formatting. -extend-exclude = "src/targetdb/_version\\.py" +# alembic/ migrations are historical records and are deliberately left +# unformatted -- excluded here too so an editor's black extension with +# format-on-save doesn't rewrite them. +extend-exclude = "(src/targetdb/_version\\.py|alembic/)" [tool.pdm.scripts] serve-doc = { shell = "mkdocs serve", help = "Start the dev server for doc preview" } From 8e3d1b50d40136fe0e4af484fcf42dcd3f4e2f8b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 4 Aug 2026 08:35:34 +0000 Subject: [PATCH 09/10] chore: update ER diagrams [skip ci] --- diagrams/erdiagram_targetdb_latest.pdf | Bin 47900 -> 47898 bytes docs/tbls/public.fluxstd.md | 4 ++-- docs/tbls/public.sky.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/diagrams/erdiagram_targetdb_latest.pdf b/diagrams/erdiagram_targetdb_latest.pdf index 1a76a9e18532419c073d1ee84208b748cec3e6d3..22d7ac2ebb471262a70e2fba7a9dfb20e22180a2 100644 GIT binary patch delta 31286 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 Date: Wed, 5 Aug 2026 02:41:57 +0000 Subject: [PATCH 10/10] chore: update ER diagrams [skip ci] --- diagrams/erdiagram_targetdb_latest.pdf | Bin 47901 -> 47903 bytes docs/tbls/public.fluxstd.md | 4 ++-- docs/tbls/public.target.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/diagrams/erdiagram_targetdb_latest.pdf b/diagrams/erdiagram_targetdb_latest.pdf index d3c01c335ec7223486317c9317369dbd1005dd0f..271f109ac93be7bd7800dd51b2646fde7cd417ce 100644 GIT binary patch delta 29557 zcmZ6xQ+S|F7i}Bcwr$(CZFg+zjcuo6+jht5xMSPun7zM$@8{f{`?^@qyr?zDsLFc= zD|iM=QUM4%l28A=VlWf1?gydE_t&FR^ zS#A@icK`NSb0=3%&|yo@=+vtx*k@ww-($ly69Y8l2Tp%`KCeDSY_{wU4*b2E)SGBo z)>~_-uw$Ofuj3ZW?K5@@^z6r)S?9h>;{Ryeq4A%{{emhejnuJ5WEL3zF`Ot|i`e`0 zQUMGl{(V#>*w@mp$9sLEjNA9`bGajMfAj3S->-OiZ2DnWROp05%Go~xt^Hbc`nrVa zKLXIUj^X6A_kp+Oku(;Em@*6pq`@|}~o7D=wU%O#Tya4)Z z3CzG!0}ni2*WVrewwH>rTY)vqn@v`?W`KX-%eYzTi9$ zFm!V(zoSMX9NqOeLmdCytf*bLjsBBuwE=o|J--iM5?U*u4FZ4xl#_ zX7NvV%_{ng4VqeLP~zo!e40U8p=_z%~&n zGx;YzQk=Ik4M{E5{FfkOlt4wiMikvS;l4aio&B%X-v*|ZfqfALMs<+TQ6AVoH_7Nb z4IF~18h66di#9Qt2#^{EvtT+obj0wBVmDwaA0ro^QU4WH_3E|^Vg?)HyF44Sh!O7; zHGG2G+_5$!W7gBY4^R6-4&D+E0sfT_%=rdFem(EU%-Y7E@1v24b2|cGCk4b>1E0@1 zP6G~j=6k@mc8&3u?b8`|;&7{v#V=-HG{+dM0SMgMM~3aOty{F-AXG2|4W%+(2|$H;yqs1@l0Tz82&EANh?$ht@evdF z7|iLL69T`8q=s}ymmY*>;Yc=EYD!;%I#+Qm4m?Fxh`b=Vd~=~PwQ|B>Wnx`<7bET< z3{u8^?vt`6<-evkC5~kFe?~z>1dK*PZf}cNQ{f6%>-}RP8?LSk`A!KYuh~z-9aY+(q`2JAfmy3cj__gg)@(7kuD;x7G>#0LR^D+4UPZHE$S>`TtB!S z5Wy>T*f7iC{U~@stN-$;8_qq051%luYvcLgL=aJMO_Y2loE79!yrl>q`u#6T?D6Ve zyLA1NjK<(@oQ6J|1#}O>;{x=1A)2g&hNd{=;G{CxN zi-N-RwJQ=uDg+H;QGTFMcYcnTH=*a4Xbo-TfWt$MXDAwE5C=CUp{>Oq#{Wjq$;0;2 zQ+CkZvLtr@iN$`tQAa!B2j}`r5_NGrXq3yc?f!LQ{(-uS1F5NLQb0sJpBi z;NY1)vjqt&o#P`3>?6{d+L{nv=IM@2#cT#!D%ox3>7s&W>W-HvV+DUO*a=FkaqEuq zD{oop@?&kpSE}hc;NnU8Q%)olEzG+|YoM2y=5#WL2S$xO`k^F9;P|HfzGh91eE;m{ zNH(pRHf*t1f3r|mtS7$cVR4>ds9+tLbE0r!>udR*8Tvc}(&5Da;L?R<$`^hcQ&<($ z*9rLv2%aQnt8ny-Wq)V6ur*5dSdFs|8$aVe*7AdPvzric6WQA_F3Z6-{rd5%E``2q z|KG!Qt&2Bm|6zygh(3$W2E#q3^BiWvZ>~UTfXc|_;qp`;YY|)g{M20U*Qy8FkiV^ZW*x3#eLQCO>Sj zI|nH7tBhFHci~WwcOnV>F@+f0a=bJxltU}iN6B_${78OM*lT=|@@kkCDi%%mexP!n zYrkJ1PnO}W6QN>RLoCIUY2*gz$!pQhw(ibPm~E1n183%QEe^^{MeP$o@ylfJHm_nI z;B)~bI8NENu<2yCfGbW~$&vMS)v!sB5|~$awf{X*ldsC$3L~JtE`Qi8ucPc2WcL=T zW9G8y&$wNEH(Pm};$fc=eM9C(KTjHMH=yQfV|XO^ZmG2pD7y1-aDU-FSh)(+f9SmH z;J1nb_&+dJrw@qOTHrACqcCLy%-6p}zwCdQ7~j2gLp%P^+_953&Z7)=H%OyN~fBRx#4mBhfe z2O_cJqNFBIf;-Ck3l73%u@@GNpi^QcnmcwWpn-{C#a43<`{WROc3>4n$6o_bD>k5% zM}mzRp4Hf^PKw|{YX609M_t<^Hr-M--ZgzFP!Mka6Clubt8EmLaOp6=zSsn_UMR~W zcVCd~xpMzYwB&)KsOQiXxB1Yk;w@L_l7IUT+3Jr{VSM&U=>d7=bV2HK(peeJDmwBQ z0OA}~zWhla4z*QC9fNhY#@hP%6rLxg;a=pPx}KDpFXM-DUIot5cF}IuKll7V z1J9@Ln;pO8jw-DzwG~?%X~h}_sg&YfV0pGu&k6RDU4k#f^jW;=i?3-uQ&*LVt%yeE z9&yFDY|i!S6W(6pi2}h58l+XAMQNfW$YhqCz8*j|gooktGl}-=xXP_&)`GOdV(nQx z<(tm2th<9xYtSZTx6WAl9{8M^eKSkLP5uMKGCd)c%Xncr!k8dhZ}mrtLy7#ihpF)bw?Sf{5iP7xfRp%8ZXB zB%H1Niz~q$&4KB?a}prP7oBmFPuwgFmJVI<8U2ME{B>u9`i0^jGKj;jk6SY3r(8kp>ljHmql=wAmCS zl9olAm_=O7-~Ed=nRIz0ZAqYC0yo`)#ICVW{cVw^g@@*W-L)UYtCPMo^XC+fs*&)r zJaqNkwps?rRLD?p5f-V^HZ@l>9E*4L2Y2WP^RLjs!^-#vqYt%jZ7ekOhsh_q3nd{i z0qa`sfg^+4k_hc;$na3W+n&NL57eA2)=m^?;5AOEE@N6aIFG>Okp2kir>=g0Fxrn( z=hwh%e}(?D!}+mZX_h+%t(lYR7V~Pc`?|?|JuZR>dwLB@)l_@oK3EfKj zFFMzAvg!7e``AVI%xgW(NdxPBP;s3hJ)Awc422zLXI99{-}5i7Y2v|=zJ&@yhJN*i zM&j8~i8I>UA3%EuM-!)`Vkh3(s|0K~Ga+HBQdtCXGO>AZi?8IQ*CdT>-b#%!c739K zY1iXK!(gTPEpZSibJJ7e&a89GGtfJr?(Ud|wWtr~cJgfKEsy(2nUKa+;%+C~q^jr` zqbiR7$HVyoQ)Nizo`mC)vOZ!vQ$r5KxVwBqL71#2a7b{9kn;X@MYnANkN6l9e?cDG zQ3JC^XZM>2s-~VOiI4S1!;Z1X!4r5&fILGtWV6#x_4jr_!kFWz6gG0ET0G5oNfi&L zOyjR<>0l&BDTnS7KkEi-Ws5Er1ns6`iW2N1sPvLjLT--9C$&Xyk3MP-zM22{Z*_Y; z+G~~oHEK)ppRwnt=j*lz(T?^%cn7T8m{T4)8aJ9ovU!zY^S*GM zs%N?|3w9NOx{c)f+tvPdhiA*rpq@hNlOLau9gTZ~GU+SK3C3IJy>WzZ`3@U%u73Yu zABvZ^Qy#fTUhBgJM&48pr->(CCu_6+8)*5oX4NpD-FN$PPWyMq%*(Oawim z!xGH6H;jO^_LEC7LPtH)4Yr}6^Nua=ApOyNrC2Z!TH_alhH#Dd#1a>=E#3n?tII_3 z3`boB$H9;{IRJgeLyhY?oj*)oWImAeS2p5z3B=*L(w6h}j$I7K751FaWU@_|3BmTI zem$HA1#h!4!54+}iE0R`|K`?~BRjb?lGtQE>8E~>ES6(4M?y2{<^BiPMhq@$l9L2c7#;Rr|M z+`P9h^Jfsdfo%^K4sQ|saP;=;!>7gjI5`1w3GkswZ!R9%h@NHO_;it>gRh@Xdn#_S z#SHY1%W4K?Mo%Jt_RF}%~_Dx9_h{3y^(Wj7XSj&~ubhd5?P~A}3Ga8wD8_ z^4p-QOWOrE*d~jtqtPR@v&3VTn5)S=oWTRBYkYWctf?_T{v=~dwgx)hyR4`%-21F7 z)Xtz<*s5`qrK;`n_4F_3K1lPFbRdm8rN{poo6A@_Wmy))h#RblEV&uE#Qn&_!eF}} z8frCI;Yzv}>KezIo17p??Ri2N;C9)pd%J1EpP&7QZuT znbpIgv zb|(5xW=hE+b;IsmF&gN>4Xgu7Lt?~=I=`uSx4Ro@GWP?tJEcM@eRcB{R7_xb1864rp&?%vXi+JHNg9{H97{;~>@tc>xdP6)AjIGimp`HRlC)es zY7Tgasv}Q2iatp2jRs%aP^CBVtk6>(4Y_*Z+C`BO(si_##WTYPf!=FT#yR&w7Ha&P z%8WboIOD%>4ra6%ClB$C2=H$xil-4XEF-*=DuSF;xEO*Qu+UnxxG$zPoqWxUJlT@& zmvV=gwDGtQ)sSG11^$TY4pgte@(MoxmUf*(FesL=#lw*jT$#Yt_C8!$`{zxf25q2FG8A*U(kI#bwphCa zw5^b-oDjcxymQ*KOa8)?2yC%OBp93MWOc{YMJW0;0T;sIE=F?`RX*f8bM{P$vOlAn zj88;AeI(!qxKs}NxYO1{_CT8UZoUP`-AK4m7Rg(=SAEStNxS~Z4B&M}`^MaVN#xDu z_B}~ui|v2d(<4vn;I*%jCzQgerGrZ48Y$;h5DaTb6YSah)_h(wJaP~eV`Rca1h-^a zJlLcs_sjgFzCbY~U|dnvN1x)B@KZV1Q8o*xeF?G#Oim1yk*?4ieH4{r-p`fk!UryR zn|#&wM`L^0y>9+g)8zD<#Qri(MWcRDaJ#n1r298f4MY+<{Uu}w{SYZa>>nCZ5IXTt z1iF5oeS%0}O7k|kk+*R}(JrSxMT<3;&+B=vYEq%a$04Fj{xEn%Gm(14lmL-Ofr(;# zIhuJ;M_ zx2O0WPEf!VU85~*5cSU+v!(z`?lMuSkMeC3Oc_+Jgo?2~r z$OCiJdW}M96cM=Z^2EaC3Rj9PKS_MAT|7-KpRxu`?UMc_349x0&Vbb%z|fQa z7u((pe5+|VG2*Drk&hnNbgsQ03Cpw6p=q=VVKg4e3U;LBziQl16Z@Hh28Se#SMg-{ zSACF$xz*Yo@Oxy5gIE7$g|9>87M#lsPL2h~@4-m>0W-oll~GPz+Wad#A4MxU7l~ux z7BdEkuz6*3@Y^2aSnwpxa#?BU5@chbedZN*jzqqGki@W^U87M0nUJ=}FD>$WVT{cE}Scei}2y+zlgW_z5gBWw41@x@(3U8}pFx{i?w z#1i|miV^R($7|DPWrD5jIR`B+K47Yh^U9)Q+!5Aji$If_!K=)7r)!!H#aV4#!=2La zd4c~aPY52!Z3uErm=F>m*{iYR=s(6I-dWN|!g03E=|>U-vkBh9%b;tQ>B5|CsNHnE z__^=hEx6#VXWj|3t1d>8AVEG{*`6;C&~p^7{T$x24 zwf7WFfXV(u6!?NN_QB>j>?NQcL#|Xl?3hV7JcZI?QxIvRR;h9T^gF_?9-g^?@0UV0 zEp@1_KF%2al-?m5%T!l)6jJYrC(ELO%<~qXLIN!gy^_GTU`^XDG!lE?Nkyj?W6dJI zje8Y^*WJmI?YJwdQR~F17pd~C?7z#iC%T^T9qs|H+E9rB^jFk_LPfK7#8P(1boJqE zm)h{=j?j@B^zw|>g@=&{wztf{S2`tPYb6Y&t>~9TEbAG5_&xZ>>pXUhqtI7yP)CO@ zqzBs<`Vq`$0mkI6J5kvd9i@`Lo~?iUtFf31ljGx;fh)sHDcS*FvMg5S}#dL zniI08fP6ty(l@vs%RzKWpjaTwjQfjdKrXLuibxD^#EC`yls>qCN%7kya#EY+JyQVE@E4PimHCL9I6@fh0ac@wL?P)Ul2azC09na#P7nBtvwo6sAsB zy7rSE?JjYhla4}0JcWS5A(GOQY3DQ1%;k{*4y%*I-@s@IgLouElq*p^m<|5EKd{)*cI-QP@F z(l;#}*Ib*+c9X68w7*udvu?q&dZ*h{oI_6O8fOOR^yB!Tf&)R^2)kTUY}U;o1`S(- z^oY)>daV$mR%LVz&Y`pX-t(MO_Fdxx_&wpNBe>elefU5HEVen50*S%ycs2nm}GZ^(%4{;Zs}nIdZF@>5f+(a zA+&#Wz^?GskPWW=Bbl-?ZcW7+PMu6a=DR;k&wc~LfM;&jk*Hig6%GG|Qa?Z1iSsly1ZTMu}=l8rABtvG?> z)T%#Zf=-@g0j%*+Xqs2Ii5kl-^Tw9PeZ|5xTp^N=6_IlD6nXnBZ#XW(hbAPN=2mK^ z3+??WkZ#&!2-!O{lwzvt!D&uO(2Ac`LfBese*!n4+HKBggz7gfoAkuQ7}3!((>dne z;F1>>a^IV6d7l#W!@;?6KHS)Io<;MNH(--}R?W%q zpHUmIZ+c*^TwLQrbn|+K*IZ_@(cCQ;O6Qx^EL$~t-CNPN&#VS-)}pL%jJ5NGu3!GS zHfHTI4e#}6JKodi%&%uRxk9fR;b~m!n#iPASl2p)Ripcy8xVYOeeu=J#MX*m@OB1= zm{WcHQZlx=ty4reHQVTj4XpokvpYl}GvLxXP3!q~NgS2(7pBWV4P?(Ypd9zM7O!a+ zeg8sMUZM3e$`>r6Q=;`T3U9gpm+?R%KW2RV6qx_^r`=qaFd8nhHTHqbxtAf)T?L@S zOjg;xkLwtbcy?meNEALQRd^+0nDwVS9QpM7?eE=y@ILKz1|0?1z*ocpt2+iU`Wb6T6AwD>b_@tCvwr+MCtf+aa&xyqY%@OJ)Y0sZK~rb*9? zyI8GvGFae&o)CDxprQY2CvW9%CbU!1Soz&=Pwb5J2=N)`wReKek5g9c!kwAx?{(zY zZYn(PKzJ?Yl}rC}gS**-b&s+uJ;Ml)Z1U@W0P!tf7cI*t^+MVXH%~w4_cl-7T|t2g ztanp|L&rCt76L(!8!iD`X>G8V*!-Qlw|*8wJWU>3SC1FgkRp9%qOhVyzq99GwA10O zNEK9YEMj=G+v8GIMBd|#O&^Xe#uKj;!d9$c{Ou?4eXwy+W#46jIXLm5b$}8>)w|D?DsdOpi1&UG|Sz3KtPLhP%yPLd_EvKa6QNjG)#u1Tq>M)-&{p#*f*b>g+u#d#aOJ0I{KeK;ibq`@3nJtM zBI1-QnoskV`z%iUtJCa+48Nlzda9^C!&VD9x8-4w28aBIX5)haQhWwp(&-n;b1h1`gu3uJRk68_X$Kwt1lK%7 z#Y&v7&EJQZPC##!T-T{u^<$OFh+yWImL}o;fi@i`d#py0u{hBim3oFp%&=Nwz!0&> zU9=?)RfZ{VHI9@zQ$m?;d3PiJ%(P&cM6}K|&TYC*;HGNLoJJ6bMQ#5CHaM!o#0jPE z82y+|MlSJ&cAchukLR2-uZvFD?Gh)pQ2p5ormt$I9iW-;gZ9PgfG?xrp-<(Dp2OtC z9aiLyvhnp_C9LVvHQfE znwEJr`-Rd>U=V)GSV2xbG2TAfR^$$U8RoS@w%-IDDlH;na<>#190p%GzkqK8^O%Q( zfaA_zGR-G4#U9nJ*&Lc7Fb@qCg@f=Yo7FQTIFD_R4+gHqW~aO#mp?Opx3aAW#L?-d zdHiLK9X%@X$++ca&J|*QENnyIF=<0L4{xY0`+fB{Wroe|Y!=1$u(y+_A$*k(5xNgq zxcE0~hl||Z8D_b#GA4B+XG|&RRtxE#G(gP+_lwYZt~^*c!EcdUVNkG#aZma!kPn>L7DUGIOoZwL&6VoPyu&RC@~MB;dRClIQa!f%**vCko~iOFlxF6yPqo6! z7Jch9+PDtmSa-eF!1(nIZ2z*+CR2k0s)eoIX0Mr)!N#%JNzbK(UVpo=l_Bl4j^5_b zw!zn4D);%3qOVMkH|B0BCsss(8-S%J`jU1;Wd7bDb`(I)SU(JIw!VM1kfRlSDAxpN zONrF&-;0!G-D)?}SI;LcN z8pd=Q@O3E#*F4OZ@k1j;CS`rE1OBgBlMXKl89Qo4|s6OVJ#4%92_~ z);4CT!?M*J!<*jk+cu|TAQ1s!c2%h#`JMtsnY*N;`Rv`-Q4V+i>G)XC1^W=yFiyLZ zZqx0@bd5r&D%3oE9YUtBn}7C~mn!lGP0d4c#U~|JDP!NFVo>bIC7AD$=Ed%^jR+fo z=Q%=5)ataWWsdKKr9d8HjuBG#s(SDI*ZqYwM$>T%4cg+Y=vSK*P&$-M6v9CHB#BCD zm-jvHp2>gNl}AM*I9XndF!0+ZpWI$;go;)og@T&vdZ@g)M1w+a)VxksQ$gX(?f)++ zY}?eP-s+5aueDMhte(DemeE&g?*<;DY}>~!(-&qP@84oExwRbfROn0g5?6u`OnF-Y znWn|92}bOBvtIr4F`Kh@$j|bx_WPK+G^gKKI&cjzP0OBT_T(K#qM=%zmjtaiPJ5|D zJM!Q@K!3HgMSB7~PO|pq*kTmJBg6pzYrApZ;I3)Dm|4#D5Vd$tSl6(E!f;2t$>AL5 zId5BfzWAn>{aH<-Sq+B_VNmq~N5&R#@}$KjLwGKwKjeoHt-)Dc2a2`4{h~hvEge-_ z2F(UfK^2L6(8=M6YycXgzJyQVqt0nVyy5*+PRcj<`9UZ&B!#^uiM}c)b;7y!ao3qf zw~YfL=iLwowrP#gZOdLXsnLL!4z+TNDy@}xOcpflhrR*g${_^Sae$=bz#9Z4K|6zg z2nOlHC-Gw0%s#Dv$$)HSyyJs(uuz5IKmLVq?4a(BFChi}xz8)sQM7=22w^funMNn> zz~X+$J`_I6g$UDO|0$YP!oGIWF82m@KU+aQf*3%cCCClC-!vJjg9X}M!uYBOOwXZZcSN@yQ%5VEHn` z-^|k#LYrRJzcb#4Qu_nMVNSnTs&azFQ#sIyH%e`+OQ3?tWduPChG(mxCAd+!sQ8*&;5|S9ifUYE*DexYWnGM13Tz zh*0SNaXfEA#I7_wL>9wmv?aIxk7z7EmJ-oUlKC>eeVgbM?*tdtNHQYv59CX;j<`fi zYX2|LD>Vus{73VYIF8?2OANod*X15Ff92@gsf3=)BTA>DrC|x#tI?6BSdpQ(iyGWi zWLsk_VwqA)swtwR&s)J9q2@34tWo)}(l$*VvaG$jHJXUNuwYR^JkZSF`16YC%aSE; z%8{eDi{~USFo4>}w}rhl+oIu9B9`Cu@1hBLi@gTJ@M9C{A`bD|W?1*rmxNl_r6Ita zjujm}Q=CGhFlnkOhI9v_47p&LfN`9~Oipog(yFPZc#>9CndAg^q&_mr0A3(RD|E?$ z#G~aSs4HI=f5;RbwMz%2G~{S6uwMD?gi-kaz$WG?3&24^)E8Z}lu4$x5S25G>s!m! zI->p5a$i;*u#7>Az~BuA0}+x;hQg`5SLBpI;5@2Icr=6Zvr%lb(d!E$Ny5Syf%4q_ zpXvu`~Wm zvAHJ=%j3eh-Ph4bhEodLz{|lY{f7bvZz>c2{ga#<-TcIQV!m+yqX+S4&0U6LV)qns z5kfv%yk9;#5lt&bv+sqEqsk!0N-$isD&M|IK$%7Vf1k6WX`5UL0YW6xdq1BrlX2d2 zd=(?Enf72w+S)7ZN_tF88gzRfj{N>r1*@rWF}lZWpjQ1|n%aF$);h{%%#vDJdg;`g zJx6F&@%PL*R$a`D$3{wAHrj4jvvjSd)WHRsI$)NSF*Jnv2Cc>&`Jq5-u>UA=-hA{X zAU{rhhq5T;&8kxd%(lBSTB$Lv>C}&&A&{jG_(zx?YYBKWI9QTwP3x`O1&F1wxJX7h z6xA)<0prCEqNcyKW0U_W#`vnkbY+$|p>}60y32A7N%C{3z*YeI5-F;rHgG+PX`qMi$MH4BY5 z*hY6W4O)q>iKt$D1dff*&reM}jBK1`cUn-1HG;}Q@7V5Z#WmPzZID?2z#Vy?UK;bn~Drk%VJrvE?$#xp(Pe1N0 zDsYZOFhlnR5Jm@^)^cC%oGGwt_iToF4xINW`a8H4>Oy6?P+FazV4SQoZ~?SxN&m99 zA~Mu?(l`>x$Ut}Hw3INVnOq)+P1a!eK;6{r4A2xOevA2+Fo*v(HkIB-%!AWO{V(qr zC2xnc3Z}>pf=2Nh&R#wr!_hp4 zW&JQ^HywAgk7)eAhdVHM^1X~QVgxP&i9~rkARIx7)wS%Xee6e~d|=1qbp5X7wb9_9 z`!@Yq#uUhSDZ*r51pzG>&jd~(;}wXl9c>V34U{3B9GHDL;ZVmh?(Pw{v_C!eef)hN z;axmM5GZU+8FkPSoqOe6wrMh?B6YN`@aWIIm-P-&=F|;kUxkMV7NQ6 zfO+a;2QVJ4=&VMuUxfBD%*g{(9WJhuT7oZl2l~|3#83|F_K+ZmS@o0QQS%XB#&k)< za^M|42$qZ3h0G|6zA&5fP9t277oeMq6!z13jq!`dV1Hve-AS}TH=74#qr!BVA%rSq zT;$fC*GA-#_V?UaSi==b>$uE&9!!VY0n$Gp!4wV_9JyOid^zI6oz91hk49-bRj6UT z=pM>_5wBh7zmPMxai%j2^ox}cmP_EM!jbtYX{k$XWTwSqUV`pCb-iP2bE5>qy~N4E z^48ZFdS&aukXfbqU@fQYrQ>;R8A|gDlg909^aRfZVHR@^rCG!WW90lhg!3>kfW-F@ ztu%&Q3=CU##PGt96V^qv9eOx8&XB&4b7W2JuZ-70^a*5WUOdC*d279j~n4MjaDQjEAq@f_D1^20r7QeEu0xcT_s zc8wxNa%pw6Kv%bvO>nzVhFjYRFE14fk_~m;3VQ$%N2%Dt2%Jt`?-4T?X#MS^&7iK(O4%_$~*7TDyFiN*|XqQUMoxSG7tzv zU(_AS0!ZrUMD0}8!9j$MQOuCa#`eSU%5T*N9ax7F@dKtehx_;`3!*^3-;B z1VRZm3P~aBr9N| zhX0&-M(ypLQQ-%WJtEYC8&gC?Io`;HF#eYFSrU*>HlAQm0-wI|s}6xr6qXT{NL}Xp zCS?A!IEwDk96zG}5&^5roUDf!{lAZk`-K{bNW5AK5xi>`0avILDApe;oMx|d@+(Hm zybcZ#lI~@su0y$B{tj-@J>Zwbv&Lo{IZmRwwF!rA&l_k^Ws9v{D#npIT?FePv5`@QUd#nE(Iq}&LVDfY2qi*bt2t|zueMRr9RRsx~p5S$nO;#}gu zui#H6OOO?>hLf1$AI5>f>TnbNJv*akY^a4v+Zn)iEQGZov9izv3!+8PEs@+gAjnhU+v}Ez~-%prvU3!+2E=YO( z@~M`~fFZ%x5|j%xVRw9$+qDxxG6Q;eY?_c^rfJXY)r1kDvwvnv`=&JiZEA6?s9qJRiRw~~3+Fvjj z^HjWDeomQw0tJ-6L-ARt>68-8=_$)yj$JdmixHQzsFEvh8wR4M#ZSGV%lj5L4QWyJ zaK_AQXk+!g<@5^GzP}{Jta4X6!WEmVPf=}m?dx=EeU+F$Eu~;?e3|6!Y^vRK(MNw6 z0{?pF7`~LCTcm7SF9#WB@U>ZOE5O|gxC`ogZIPmyF_y@$SlvsdE;GReV@sI z{ZDv9_XI&!qRoC4)LJhHEWcE1Za6k80XOFSdxn4!RdlEU83HT6V&jh1m9=THbDf@W{FMgKp!P!$+pl@!28?A0#>jxRX{UJv*6&Y?rWL!ep#(N zYU4%LTVajY)usB8Axm@NWXrcDocZqN8;IZKr|-_SP91gp)d0JC;NIpf8K+I0M31fP z+oNw81!?9HHz2zjjFrq$^tvjiTCKNtTl*#AZTQe$pC+tIE5H214SwaYzOAGvgN1U% z_P_zsrqMD4ZEEvQN&ZlEMSz+dd;Kk^lK9vN_jLW}BK%&v<6$Rs+ zTznEs9OWu2r>veGOL&V%A5PNBPXcT)R9AbLH4_bX0Nvgywe{kTR-&V`ZW1P7lc}hu-&vd+@@4;Jd7v@lv!~%p+R#uM{@p;QSz+4l zS9^(4sYKZuL@VS3?~HsF_6<=MbgjdJXcQs2*SK>XB^u=U>xBkbZos1b2R7|Dwh+|b zw`mVIVgb^klm44618RFyp?;@Q;%@&=G<7lk| z*jNP~Gsu*YLzF@%QWtgUjunXaoOE`!w&ox!}6_GZ9<*2R^r zN4DUhFoy4Q9Lgd<3eT|-M!vE*6WP$hE%1?R>f-J{8?C{VF`BxtrkCQ&!WH%!J~00X zTin3@F)ir~-sRwcDO8h8*v6a$MMEW@R)n5R!*t?R`jL05+*0YPZ5rxMTyn>?Yms3; zSk+n}c~pJX>xyX3+BwaqWIj7$DPMUR>HlK5(QFvSFTDw*IW&XTt?s)D|qe$h=*HJ;pSE1P}S)W+2k)PWr|QHY)w9R0!hIGUR<*5V_b{X#e- z+Ssn@4Hx@J=|Hg=80O4oPh&2Fibh(OEHigCEb71TH4>|ByfTihR7Os>UX8`!Tzbo& z58g8CtH}ah8OtO(`qiFOlRqyuz#}2P(G`smwqE3AhZJ*UuPe+08_P9JeGNL?ROQMf z@$drt5?mj>(=)M-*QET?8*~WcCT3A;5^PooE9@7Zmw&VI@BdjR2EmKS6Wmdu!{0xG z4g6?WLhq{m;$mW#rY{iW{P=y?U}p~9{S<2zoN5B_&zSAL7u(Doi9rj`8$B#n!~L2? zD8#r!Fqc8yJ^;lV2=KH1cR7AkKl4qQRkfFiOki@BuB9#DqS_Q$G z(uJp`^V012f3B0;k0dJ1*nEbV*8R#_CT`%ZWUj( z47YFkOxCs&W5NDe-Ig9vH{FTH?8=o{1<^P~x));EWbRb+tC1^l2}jGu3~d^hRB@iT z%@`-YD=qYrkQ0~TN86D%YKJ=-;hA1ddU7$oiW?GhjsdNyMs2vMVP}{kY>n8lzFi6M z!vK$1&O?{su(&q*oG*TuzNQfiN(!0fte9}esRsY@Y{P(0eJ70lIHNugH=3R&5%OR@ z(UBtjn#mdMXFZ|@m{WL(Np6L2C!K(mxCtona1ue=xsH*^l_*^;$geUxlF2#YyJP7! zx^p&zV&pMNCM}N~WNc*KigEojLAr226|W5*8#(>|!bC|rlz$~od^l)h7Ies=`EJfd}`9pYm*K_zElB^QRkq1k$CvL1MmedpNHHB}nV zuywvW7lzoc5U!?`p!p^gu#BOEQB*TRxTYr`_b(zF_q=<9k#|VCEjWobCV-|pO5~*( zj#`(pvfR>s@Y1<`pX}!yf4IBCcK}?Yl;#&%uNZs>YRGv5V_F7Qzu7gkS!B7G)mL=b zG}~I()V!HkR@NTZ%8>b9C&#GWSarfXqk0+)8~Aiohgd&(+sHV$w{0ahrG8(h7IUg8 z7j+YJ?2{x5uJiajR`1Q32N0*15Vj#yJU`y4(U}yfc4Hk{>gT;P3W8v7;iQWEje>FV zc=^`6C6H)|zQoWdu$%zOM?J*wdN1aVBMKRP3R0HUHR-lB1vNsqZodDL+9bv< zBFvF>KvX?<>yYO8Hk4U}v5`BUz25&y^1SxT7La;&TMh1eXoo*o0blooe&`+{HBxo8 z7CgH7wCKZ&p$`sZOr;RN;U}KTq-#GU{_eFZ_t3CDEi<-p-TrLEN!*aJNi2rnYWkf+ z8B(NnL+@ZmqPH3esvj1bJp*QgD(?8`*PHkB-X9SpO`hbtEZW@vq#Tqqd`>C;g~&H7^TKJLa~JDqP9& z9h4uw7fc^uiq5bmDZ@gAs@$jal|ED1uir(ED`yXZ2a~hi4-~zJ-m3xwmxO7`k!xU0 zR{@AT>r}gsP9Yrz@fW*jGC?4Rc;isi_l+e{omaeTzg3_ygJqztX%6L0; zTO$acft8lEW;2Nna=v%A3gdEq;BeNdbr#1MmsgM0rVn##=)4J3tc{FR>e#m39iPBa zW{N?iXLHmcpI*v5^Qv<2O?u|qn3nDD7y!DGJHGXnB5kr+8j(f(={iE@gx6UrGyBbm z)43L&b=6Ex2Us00lGp%=-gp)OCl>@Nh}vNHZO_A+aK%)*+?=rWW_x216N2 zP~Az4;((&OQp%B?X7Lyio?cU9hu+Yl!&}z1e|B4?G#QW>0iiQ{G3G_Kp|JE!YC!`M zzN`IKVFf!j@(@-*)Oe;%@oYf0KZgdSB1;vg6>2Z$7I>56w453KJ-+cGwJ>N3;l$Eu z_xJS55H+mC6Jaa5Xj_w!E*-|KV5q@RUSTOkwBr@&`kGoeh4=6!qrIuKm&IcZvU9$4P*?RcC3!!c;lP8TYwts~`f#Wr> zug7HA;n<|Y@t$A9@6^c;KR)XbJ>zqPdfB1Bz7I{EI3B5gAB0doG;BURe%3TruRMxS z?HBwC437=f2*Qc)6T9U(Wwc)9dv**PF5NX)#E%4^+I~r2ZN1mWIYFjX62pV33QA7q2uly2a_s9&dhr_P(M{ zfAcz3ccOS4?w*#?LGk+{b8~t`xk++|wDi0L3_otdPMp$#c--FHoXDuWT)KH{<=U-V z*H&(=6{30kt~>77c;_GX=I?p(k1Z{Kd~#2IExGA~bLT!deD2)0;tTOje8TIUJH7e# zJrgJ3-k4&Bdrz3S1Ic-`USMS~4t|I|2r+@mmCf3h{Xo_?5I67slFZVpnr!bBC7m9^}#pLk=+f8hxe zKl-h>A`at>mM^ecOSUdqU*{zEjeYBI_wKtpb;iB0fg|v(;?st8dv|XH6F~bBV#P40 z2-L%jp*o^Ytdu)Fwf1@g6AcY_=$dVS52lfG1r|H2uUrd{H!44SZ;}5)KLNQsDW32` zz?WSA%^+hWE3SR=$;w@Ibp@}_e|YB**%G>!Y}~Z*tu3K)R=SZ$yDXd)=7|%dKRBxuoB-)~MCwe(bsdIXge-DB2?=?U$Z zwqMkKK~X|cVo_32^0b6$e~HtQrX|lyn3p&&Xf2M=uYi_So+C<+5 z_{*_W(|DyXEElLLd(W$WEUhBhpX~8P_Q8HB9|)T3!838GSTuC{n{S@pTwcyMigznQ z)k}x3-}EO^RDo|ssNKiLDn8^!0XceX9di2WxVGF`i`UU87@G|Acy0aTEyuC|A`A}= zmjM|P<|R}oNM!Kjf3~THSbh?TEscdWL^s#g_I~ZjW38z5*psh?4!^W|_4e(nSHDE} zk^BDDxV?Bhz71>ezHPklAG>tv7&MS;KghKO1wPIXy1qa(L_xBsWfn zVKeL=o6RV2*mO6t@pAg6(^l_xI_!q7P^7t-%jR~U8d_tF7+Rx^xMy@7%+~BRW@wFX zg#6xmu-BM|e+EyKg=H|uHXj&z*J#zvzf;{>TWkByzl+Kl(*c`J3gVigQ%9r`<#0Pv z9C?nx#_h&%$5?%=F~ul%%yX=9cnt(X*tp&1w7H_NpSYQuM;Shw&mQZHb)}OmvbmTFITbaHlbC3$+HJe)_eSvK!w^sx1?fA@0aJM&%Ho?DQKO=41$ncP%N z)zk{~{>DJZVCP_$=^26Uz;}?5w2&3@QOZblly{OI?CY=-r;Q{eCVW(L~DbqJj**K7`DVX z6?KSuNv&owl*G+vbPGCv%7E;hO^fB$&deF#=BykO4n;A`7vOou(L3~<_g zi5XcLw`Wj@HDQSLMJD0|?Dw(ju@!tM3jjE;d#c3wLDP@lzxDN*+va@nXYr}HH0Aqw zrHzlhQeVEl^oyf7>Yoq(m2Y{!XODSLOq`S$lX+&}na{GbKI%VU$?qO{GBLW#!JUUL zf2PTKgU{1TfXy+epBaZ1<0Z_w*s;W@^RT)o0OeTK>p+8i{bSuN7jqiJfz&OoTz3ES za<*x6#ku3=#jT91j^p?S!P_Hc2N@}ob0X=b;m;Soe(2Eah0hQF&DL=t@d@sNm64lS z-mc8d3nxxo$jsc4nhH+o#9rJx1zn4cf8b>isQWKtWHb~LQ#?8;Y{h}4zADHlD*p{caUf}6q z%Q28w#5!JZ?lvkt_yx3^RYt9nOB&-q**7WL+bUoEbwx!tfX%E&zf6KRLI|q22zf7wEJvYq^8Aur<7coSDJbnQub zr?yt{{i{*h7t~s8e=I)@d8TRl3urYX)qK8+s&y?<2~d=XZPHd;GN58<7mW?!jsZfT zi~YjYpuK}0h)IYD(B#Cpe;`Z+ob6&bF0_P8l5j=h zJBE(o6XXOv!H)4`in=9XPXf6y=LGZ*LoA_I`r`MYYi>!lEZMYa2{fz^dv4eVCtZE^ z{PuIqMbj4|BrfAZ95?Ja+Gqdf7Y-bFVe@`6yEZjV{2;!+dz|?G+pomm@d`W}PrzFf z!uW9(K6WDke{0}*11%&t21Q?6gPytml(Q#K3IXR;fxd^p`~zqsWc9IeG&W&T73V>S#wT}{u=xG-xDLQ z?AWnmCSKM1;dO&&Ru$ZOyj#xK@7}w0TDs=nLdtG-> zufKn^f0Ze>MNJ5pDg9zfQK?d|UdcTj-lL!Ifvy(}4J zUQ=P&XcS5T8LPdh+P+H47;q)ffIse6GUB${f87h&@h=8nw&D5b;qUq9uVP*NboHwE z3G2L2oDj#ModEaF#ocjkwU{mzi*hmDGO0Oug|w$)d>&wNp|q!cXaivwG55LS7JZQ& z0ZUU%;zD1Ng_hl%GZd7NmJ$sT%Z)I009a5o!i@2diAo&XZ|B9T`KwTFLiUF76(S2qLi&Z^~-SM&2s;}C;)IqAz ze8+O|_NV|hXaE^*CBfZ-rGvElhgolJ_~{*DwaX)39ffTA(G(|t~cZYx;BbnSBLr^4l}4+4jnqh-iPCT;?SY5m+wHeIM&S}X1J9w0umiwA z$H_ETN(sqUavoI#!6HwbK7Ax~9}l)%peI^#w~K0A^q#eLHR1;{8sd?P`j{^Eva*M~ zj9$|~=v$!_KPMB5_AEmtA6D+so?o;a2fbL{B^O32CboJ;j({pD^m#5Bv`sev?nb@j?(vBV|%Ai=jX{zyDtG{rtBIg;l_5 z*JG%PGGV>mVy~fkSTBvC0oT^+VhaRRn_D;aLcK_zrt@$(m5PCoT3gGCu2w6)Z{+&z z2Kyat@l-z0Lg0EfzTCj|f4*8f#HI);f2Vm(3W%N%L-!op z{ocE~kBRf*EAgc`&ri3^026Ma%UbRg=b&2Ygj3NkxYPi;*^F!FA!=RA!mf+o=cf;f3bgQw5&aYwbyIwJL5E` zs`)zf?5$*Jj!jm5Ub_Qejb)GQ&2q1dRMI;fMnsGG*n zSQ)N7SOLdY?tl4U9EFDev{V6d%U)Re-?Xp14GtsmkqzN%iy&Nw2dD7 z1#LFHuI@TJMtZe#X4^x%6=TN@{22bWoxHnN%WnX?G*G>np?SE%Rga=@3RNB>R<@`? zaYyUXI$hzIDVogsZBo`#4W4j~cCmeZSzBo)8-to`kJ~Pn_Pj zZ919Be;1IY{P)@#QpMM4FA}fLb%ofdp?0L{tRv4*+dm z2Yrd}Q{PuVQGcRM^e5KDV#hry3mK0jlv1!KWq%zBejD0Ne%ll}T&MV29>fMUF}WtcMyv%m9V7G=|x5fbjeq6k;hN(Iyp<-GlT}2a$p5gQP^A zM^pvtiXX=+1MpzwZai9-P~grH41KJJ|wisjRAAv~Z!~Z4`aae7N`r1l_Zj38;!tmGzE92=~_pZMHriub`FqIqI|Y4%rw$j^$KGa2Grmm*Fn&i?U;)3@orkqdzxi^28Rz zQ1j;&)=7VXY!zZ$0KI1B>6%In#X}k89>!>a!jPXbf2HoLbj-Igu27GTe*%$CZp6ee zPd}d#urmt~==`~-QDKE`IMv$S%&gv_%)L!PBoEGnF!OSXt6(-cxKE|Z`r z{gUMWX-Vk*C8xPF6hn76XW}w3zugz`8kjppUEe^j5=aCYyPgPIERV%oVAGM^Mjlo0 zOc=rvAuc9H4v6D(PpJ5Z~L6d9lQx{tVc3g`3dRrvMgv$*j3Q{EL zsuVyFdK<#EL=T44Fw=Uy-tmo)T+X$6Cu}qjnf^1FVDtBb$P`ja%E)3ekE|kFh$aWp z!8oKp#nM=oe+G412F+keS{};7y=iZjtqnjByXasxfDckkP4b*$=onV0m7o&*AbpTM zz$Yt3+6?qKE~Ta5adVVKXc1mYmqJ8etW=>YypF7=&#-6sI%PY5NvY8eYUj09?PiOc z)TOE26uvDa?rmm8EhFfztJRim^#L8t1|8Y(t>yqOf5S2Zq*3JtJd0rJAq3kzaHiqW z4JgxQTT$MzXur(ME~!1fIj5P#-r|um#4mY!h3jt~OR0+wjZmRkl@q(Wo{8 z24$SAbHYd3dM@WZ}E;ZV!zmb z2EQ&IJA*TD1}h4k550qH#UL_-M2bf-WJsj-f2r=uv2=l_l?u&mI(Cxut zR>iyglY<+^KdW^7#)>uaKFXOJxU)(xstj{yF|J%1<9A0}f%FFMtnJYd_)HH&g7rz$ zf6s{!rsvLKELzXu-guT+A`Xf7MLC|$hlyIKIlmIMco2@oad^-cagW$2Hi>)i7Cb?+ zvh8t?t+4PZ0`)ed0h=U5dEJIam_(?49tly_4YBsnZn4^?&E-$@_w(QHf7Q<|tO^I4 zV6x;tnT$htjaadM{R+_we{fYwcvT$be_5dqSC=ndz3sx;PrnFlhw;9Y-_^0k5sXO@T&}ot> zTRWz+WiXaaBC%4*BpPa!>=lD!T?I^J_Hb>`AmPTkca^;-(E&(o@n3E22(1alf0DzY zeDZV4&63_4up@L~hlRCOqQr_BHke6-jUcs>*P!`!t||FA-1{%$$Hj21Y31Hl9C4VA zLPwFK!m-I=#SwSAJsmlE;=*tGEq(-o${O**l^s>#d=0f0kUf^}x|lu`D|7r&3M_-6fL3@f9k;8d#bRLk z$^t%nPobq5$nPcTB9(sRDEZsbqoEEE`$8K?adW2BlC-fk2+w~P7)m#1P6>rfm*m9{v|gr6C)RPV%3TLxcu0$_uuX{c5Hs`!iR2u zef)jzJWzXn(Ad#g>6)Slfmf}cv|!Yjy!*P1d1Sz?_4&Qt-85|Js8LyYG5)^YE#I;7 zcZ@^Oo=voiXVGN)%LB6OxbuLobi zQ?2#vX&U$`SVZXr>_0d`V|Z1;Xxi^vt>o2^eBiL@hwa{y@eD5FXX)lPj@5xS5M=`c z@fb>xlwCv4wWs~Sw&nW_C(S}Ox_Nt(v} z5)qTgkuwmJev~K-7uUW3ZrnhgC*w8vwilm& z{zXxbGuN(KwN}^&yVN}I$;z#w>1ya}awPO=`LgAUNQt<4>SK>i+jj7^rJH?8$DaA% zub{`#AoN*?uR40(e~i__H6Db|0_|l~PhaL5g*+B3Mmr^J4@b&yjcL`JR@7|BX{!Mn z|IL5Q0(rkSjSM7%Rc_NB*RSt(W>pJ962FpIqc z3upnB5eBTVkP@z3wj1Fp

=cnnnskHAf{<4cZav*?u2i-V2FG`DPO0ak!GkRchWB zJiGms&Q;p-1cCyd?kqPt#^z3tq3B{u!?pYQ;*@m2?4Tz(FWIB8_FIK4>c)Hf>^-rM zcxQ;Os>Nn8e*-VW_pQe2)M+it#AWdvj=uMJxwCzZr@$I>KoNU5MGw&4h)EtmRv8x|-0InC zp*oMwe`72Rx)6wtl0UcH4v(GC>oAq?HQ}~T{}S)t`j5j0M7HUgRMsj48AXiRcrJ`&4fc_*km(nto&;6Wux>xFW0F6qnq@}9~d)F1aJ zgV|s{P=TCRDIpKC2l*WI1eCC|*=#;TnWsI2)+rf)6v@^TXP68L9Xg56;J^MUbeNyM z8pXbWB9qJe#cD=-K8ey%E?R2#NOc9%e}ZYQ^wjhMwA!Aqy6cMQ)v3yA`-(L0@{Xyi zx~C_{1$FB1J9URE*^%jtbGW+Mx=X*&M_5m}Siop`kRiq{=f7Xqf zIN|QQCl=Fg)h%PI6F1f$*tDr`KUuZ*sRfml3l>(EojY*g?AZhLXUX`=1y8MA`_%lZ zvVZ-L;y8QY&A*1VnEnm(#1Ldl`e*$0@kqFM=&G0 z7D+ntj#^LBgLl^kk^vA0Mv@1}e-mUTUnrk|(bkgZv`fUVP{|y}(HNB*)KH_TS3 zJy;LkL&;OK?YBS_=^uV3$36k#$7KG1I+IVcFQd!&@0AL*!oHq9uRO2rqkmA}r|+wO zrk|)^({I?<{O`(7^k@DrrL$z1AC(ldq{Oh5rESD46h~vlkD*+dt1Trne?x;>E|3pH z-NL;8e8Amuu%~G2`I8hiF$OP2G1bOaR*jZMCRV#wMJ^Ajfk1LZ0_xBq;IJM)f#}d) zv3w=(orIr0iEM~@H}+uM!N9@zcM}>C)g9h??>AmL4v*_;0joE{dY&(@J8I)PI;7!t zkOlkreAtGeADndc-t*9Bf8r{3e}O6Xh}XoI!#3cX+n!8GtW8bB4(uIuFLr(V6^^tX z6o4uxfvjtPE=A_%Er79?tQ=;o+40xBgoZT9OK6gpcvT@PMD74GRo!Apy#G54AVV&E zUru}^k7Scna-lqj7^5T zc}y+;hU|@}If<8v8Kg_N7m0WX*%2edVVeNxNRbnjp;mks9*<|?-{IBd z5IL8WmXw{;J84&Pe}~pq`F|v+8sCYF;P~9O;}LK?|Jw2Y{=zWEIlLZkfQfCy)ot%X z@csaQ0LL|Gy{t2bK4 zEOZN0@!e29x)t4q`l4*q8x2JRP#4G?ddMf=QCGmm9F&X(f5Z2I=r`~gZ_Rx;pe29; zWLI{`j|reBmaIC;LurufIzcm$D2O^B2A-gR4st;x-f({V1{%t!HU(DLc~#0&VIh-&e9G#%}y z-_TrI&u(K*be^7|JJ6Rfiu`}8W2gdcL8Tyz4^Ks9q?FtVdk*sxXg$2A!toPer6)nU z{dgfdjh>;53_=_6X_(hB^dnkGN02h8FLFr<$bT66e>wrzuSe6NRy&OiB%tovBBh71 zCRm^Gv+xO3?_kMX6PMY6^@ZHMR}EhZ~hOs2ZK5_tHn{S-gm)uS>HMpoNp3Z%1{Kyg zW+&CQwib?NaePb-57f}0R>OiRpZ~XmpLgjzf3$FPQcbA;ZEd~wFS-r(-8CA%%3rV> z_V>TdIwl9L;X(KtTvU@ZadOhr?x$0FKkc5>yNku0AaY-A!Kj~x-0$l9Pn4)xHhl8k z%$D};PoK05bB@tv>L3r|u#tnl9u|NdPVv(x&38D*wC%tCx*aUEg!|B=tPwrRylEo6~lHJw2k0bO|UJdiKqtJVe2|C+Re|RJ=Rzsqb!z*rds1|hK5=jc?&us z&xh-_L*EIZU%|>o=FFK-Rf1o4mLTj^>5n3OT-+ERV1~z^YuHB8^=T3Bl z+}m0O<3q*_=k`Nu;QL0Bi{4lEf)CGyeYt2fTMvEZqUkW!1~vowFGV+5$6*|GJe+U^6 zMU0Oiw86QKY-n(fa~3q%x}dqCUpMsShT|UCdY3?hZNyX1E`lAy^*-3=hq3)D5sHL9 zBH?&+M`*B(sf7mT#V&^iW5&U`aR(6!M1xC#6C}WSiK);)uEa(NnfD@;JP)B1z?~G> zrb54|aBb?(2nAtYLFh9Lu1kY?f29wC_6#(*t|N@w5$2w;3qiPpwjF{Y$dh>rq0TU$ z&P@n)fq8a?ezKFG!F;;a%Ksg;tnqd_0%GT6h-mT--m}trnV&?$merDZX6sc!n|<_O zLHctJ{i%xn=%oJ?^opSW6Qn;l=|8GyQ;>fD^ey~*K`&R)@2Y5HGyS%ifBs$2Z+g?O z3+N?5zsjLsUc8HcSw%0xi5Ksp7rw~i7ntep*G(33}E`|2mhR zIY9p+=qGUcCv)lPQv>KwQn5Y zwSvB}ZybN)0DWT~+xLec-#5-|rTa|whalZ6=<8KZMx*eQ~psznDWeJLwC>f3zA-sji}%1l{<& zoo^KMc{|rlD@^wLAYCEo@?~B5azU4MrBA~&pT31IU1H-) zeRPS9mcx$nV!9YKf3-MB7kTJYf-YR(;R^*_;Gy#cohN9Spl0ju=Fa866Ljue`eZRJ z9pUGtK{`j!*@Dh;(wTPpgh6Kr`gk*)-b^2BrjIt$X@X7_^btWHN~XURbc&~dPq~Xe zDCp$5^a1!$BIqPRiv^u1=mbH>_ohY7^gcTsC+Izbjumvwe`te`X{MtMdUs?DzdMJH z5_BYtJhFg}@YB1no8J{p@AT0-hD7i?1TD1D+XWr|8#f;==x^L~n4m-9$WTFt40iJ& z5p;08gAaDoK@K`l&;eDne-*t=&|66terq!=I6!Y1N=-rg33~HQUVgKW-qhE{Z}QT< zeH^^6+3KQwe;l;8p!tIK>gnUXnrY7-Zr;;Jd*s=84>!%T(e4Q}*Fkf-*?5ki-E1^F z%f_=EG|NW2cF}oPH|?U+&N(!*Q;=sC(@q&)-YG~kytHF_kaxU=rUz+S(8kkTG-#u# zf~E-C!9|l{p2=RC1c2R46JQDn#WdbQ1E9fxpmEJKlOm%OUit;~2^t}&7f$dB>Vdg> z3aEQ7brn;mpbmQ^cL-{Sv+a@8CaB@2x}X}IrU|P0s8S3igPSw306&GjR6w+LbJB%k zH${TtT3ozn1gZrd;rgztI^9@9f0 zo4X_(z%Wpx7a#hAx_tmyq8tIWB*^l?Z(q(%kODo}98tUEHzSGl>+#ER99CEVSf=)r zSJw|?x8&P&U)t=>`7(^v*1K+K*Y_*?Z?DZ<)us9LxUKnm9Q&!-?_K?~+`O&J!##cO zrgQ#OIp^x{OMjP_VZ6Af->)Z5o$mAeCtvfpx=nRBxGwi)xv$Oqt+{4bTl4d=EBA-> z@m$*eRs4F)*?GI(5~-cKe4Cp#FU@$#)qb-%xP9Lrsyuf8-Ag;Rocs2zS*m?ZrF63? zL(zdcKxgV)bn>RlQ0BLs-(p@lub8Kf(0*gO3}v3Z5r4huh4n8*2QgiSQbQe0@2Gds z9d%cjbP5={>@G;yMZI1nK~t$e+L;$sfU==slTtawf}`dqvxeUIM%* z{VM!=@_&2dXKsSrJahBN&6CZ8P06fa4$LYbDeDBzvaJ zEh0B1vw}I$SFrrKueW`fk0KvsucFtp*PCCiujY~SV$YQM2=ejt?%`eNQS80qUTW_r z*H6Yqeg(g>SFM-NLhvk<87eXiWC+H<`~~?3t~wL!J){?JUdX0k6Xq%QT~G(pT&E29 zkl(*pe9}03KF*5vzAWXKumj4@2b>JUm_N?2d79B>zrTuolQpJW22@%@P)A0ymZlW} z22@%@P)A0iv8NG#WliFrl|}Zj3QH-4#qFu3hY*7+6eCG2-EZGSS4+uhe$1QqW83bqHH|1sU-)`)ndyqI zj%q%b(YuNJil1TiB-g5PUA6q~g>23z4_#`{8)?*}g)~Su&#My(yM#CH3;r!wam&9{ z_t?*!|FND2Yx)Ie32v2>wz*CLG?RX~8IvBmMt>#Fp$fuq6vg5DpHaka@iEr5P4ESb zGI2%Fxo)u;%>x-|Sd*z+vaBrl5Q2|jpTC3U<8U}!u9>y1XFW6Fxga)k)`wuGu1i`x z;gY~3gY6e41Cc^GRw`iLh&O}>p>Z^V^-}C$a~0afA4pD+<)Vi3RD_V1Pz;3+x0Tq# h{SWy6)QOI(UUU_wej8gRb(8hFAP6`LB_%~qMhefmr>+11 delta 29586 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