thth 3.18.0__tar.gz → 3.18.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thth-3.18.0 → thth-3.18.2}/PKG-INFO +1 -1
- {thth-3.18.0 → thth-3.18.2}/tests/test_v214_x_adapter.py +27 -0
- thth-3.18.2/thth/VERSION +1 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/x.py +63 -0
- thth-3.18.0/thth/VERSION +0 -1
- {thth-3.18.0 → thth-3.18.2}/.gitignore +0 -0
- {thth-3.18.0 → thth-3.18.2}/LICENSE +0 -0
- {thth-3.18.0 → thth-3.18.2}/README.md +0 -0
- {thth-3.18.0 → thth-3.18.2}/accounts.example/bluesky.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/accounts.example/mastodon.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/accounts.example/threads.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/accounts.example/x.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/bin/thth +0 -0
- {thth-3.18.0 → thth-3.18.2}/bin/thth-remote +0 -0
- {thth-3.18.0 → thth-3.18.2}/bin/thth-run +0 -0
- {thth-3.18.0 → thth-3.18.2}/mcp/server.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/pyproject.toml +0 -0
- {thth-3.18.0 → thth-3.18.2}/skills/thth/SKILL.md +0 -0
- {thth-3.18.0 → thth-3.18.2}/skills/thth-admin/SKILL.md +0 -0
- {thth-3.18.0 → thth-3.18.2}/systemd/thth@.service +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/__init__.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/conftest.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/coordination_snapshot.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/fixtures/GraphemeBreakTest-17.0.0.txt +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/fixtures/build_injection_eval.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/fixtures/callback/worker_responses.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/fixtures/injection_eval.json +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/fixtures/umami-bile.md +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/__init__.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_oauth_server.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_push_adapter.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_redirect_server.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_search_adapter.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_threads_reader.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_threads_status.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_threads_writes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/fake_x.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/hold_lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/hold_repo_lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/helpers/worker_probe.mjs +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_27_acceptance_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_account_name_check.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_account_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_accounts_dir.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_adapter_boundary.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_admin_http_mcp.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_admin_log.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_admin_notifications.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_admin_repairs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_admin_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_after_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_analytics_comparison.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_analytics_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_api_diagnostic.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_api_error_body.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_app_env_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_approval.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_approve_cmd.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_ask.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_atlas_fifth_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_atlas_fourth_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_atlas_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_atlas_second_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_atlas_third_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit1_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit2_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_b_counterexamples.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_b_m1_semantics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_b_n1_depth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_b_r1_closure.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_v201.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_audit_v23_details.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_auth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_auth_identity_required.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_behind_remote.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_bluesky_adapter.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_bluesky_secret_scrub.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_board_needs_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_board_running.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_branch_replies.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_bundle.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_bundle_not_type_mismatch.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_charcount.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_cli_entrypoint.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_cli_help.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_cli_vm_path.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_collect.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_collect_engagements.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_collect_runs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_collect_sent.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_comparability.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_control_chars_refused.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_conversation_paging.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_count_for.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_docs_links.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_doctor.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_doctor_all_permissions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_doctor_next_step.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_duplicate_front_matter_keys.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_editorial_audit.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_editorial_n3_n4.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_engagements.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_external_acceptance.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_fake_api.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_form_spec.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_form_spec_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_forms.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_fresh_install.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_front_matter_injection.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_healthcheck_notifications.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_hypotheses.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_hypothesis_boundaries.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_hypothesis_units.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_impact_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_inbox_granted_scopes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_incident_notifications.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_independent_thread_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_independent_topic_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_independent_topic_review_r2.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_inflight.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_inflight_tag_body_hash.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_jst.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_lint.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_list_projections.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_llm_trial.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_llm_trial_engage.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_m2_independent.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_maintain.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_mastodon_adapter.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_mastodon_visibility.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_max_per_run.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_mcp.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_mcp_robustness.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_measured.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_media_accounts.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_media_next_steps.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_media_roundtrip.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_mismatch_diagnostics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_n5_reply_null_element.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_n6_replies_incomplete_ledger.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_n7_doctor_error_body.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_no_limits.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_observation_provenance.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_operations_handoff.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_packaging.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_preview.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_production_mode.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_pull_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_pulse.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_queue.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_quiet_hours.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_r2_r4_r5.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_read_cli_bare_runtimeerror.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_reason_adoption.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_redact.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_redirect_token_leak.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_refresh.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_refresh_destination.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_rejudge_new.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_rejudge_r2_r3.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_replies.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_replies_refresh.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_repo_lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_repo_sync.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_report_checkout_import.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_report_http.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_report_isolation.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_report_service.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_retract_already_gone.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_reverse_audit.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_case_id_cluster_m2.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_case_id_cluster_r2.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_evidence_account.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_form_spec_and_case_id.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_provenance.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_review_records.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_revoke.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_roundtrip.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_run_missing_env.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_run_record_failclosed.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_runs_collected.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_runs_read_rows.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_schedule_multiple.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_schedule_view.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_scopes_source_requested.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_search_engage_targets.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_search_media_routes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_secret_value_redact.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_secrets_grep.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_security_small_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_select.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_selfupdate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_send.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_send_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_send_control_chars.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_send_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_send_visibility.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_sent_integrity.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_server_json.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_site.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_skill_doc.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_study_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_systemd.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_thread_publish.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_thread_read.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_threadrun.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_threads_read_permissions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_threadshape.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_thth_root.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_token_exists.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_token_scopes_record.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_token_set.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_advice.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_models.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_review_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_shelf_observers.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topic_store.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topics_record_concurrent.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_topics_tool.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_trial_frictions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_admin_transaction.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_approve_account.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_json_contract.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_length.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_lock_wait.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_mastodon_scopes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_mentions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_post_urls.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_repo_paths.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_reposts.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_study_add.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_tool_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_unanswered.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_unanswered_scope.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_where_arguments.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_where_filters.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v210_who_arguments.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_auth_integration.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_authflow.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_bluesky_stdin.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_doctor_binding.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_mastodon_auth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v211_x_auth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_ask_coordination.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_budget.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_budget_auth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_budget_mcp.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_deletion.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_leave.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_leave_gate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_leave_providers.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_leave_token_safety.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_mastodon_guide.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_mcp_compat.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_missing_token.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_read_coordination.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_relay.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_server_writes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_token_parent.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v212_write_storage.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2131_send_dry_run.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2131_threads_publish_wait.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2132_send_inflight_hint.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2132_threads_create_timeout.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2132_threads_create_unknown.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_acceptance_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_adts_asf.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_attachment_kinds.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_external.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_metadata.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_metadata_uri.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_metadata_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_record.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_record_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bluesky_webm_named.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_bmff_typed_metadata.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_budget_lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_capabilities.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_carryover_timeout.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_graphemes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_auth_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_bmff_audio.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_flac.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_gif.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_link.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_mp3.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_ogg_opus.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_ogg_vorbis.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_poll.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_primary_size_boundary.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_quote.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_thumbnail.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_wav.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_webm_audio.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_mastodon_webm_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_cleanup.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_formats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_foundation.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_prepared.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_relay.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_relay_refusals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_media_upload.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_review_followups.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_stage810_audit.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_static_diagnostics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_stop_observation.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_systemd_worker.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_ghost.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_gif.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_link.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_media_spoiler.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_poll.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_quote.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_quote_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_replies.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_text.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_text_spoiler.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_threads_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_transport_review.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_video_typed_metadata.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_vorbis_comment_boundary.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v213_webm_schema_boundary.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2141_draft_lint_reason.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v2141_managed_repo_umask.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v214_release_signing.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v214_x_auth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v214_x_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v214_x_posts_budget.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v21b_approved_writes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v28_tags.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_invite_admin_approval.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_invite_create.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_invite_credential.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_invite_limits.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3100_invite_worker.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v310_morning.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v310_search_timeout.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v310_watch_words.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3111_observe_counts_only.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3111_observe_no_world.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_leave_same_user.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_mastodon_retract.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_morning_overdue.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_morning_own_exclusion.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_morning_unanswered_window.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_notifications_guidance.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v311_replies_owned.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3120_activity.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3120_admin_write_reasons.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3120_guard.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3120_worker_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_leave_shared_token.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_own_handles_stopped.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_report_admin.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_report_channel.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_report_inbox.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v312_report_mcp_user.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3140_api_relay.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3140_invite_key.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3140_remote_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3140_server_reads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3142_browser_login.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3143_activity_push.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3143_cli_umask_leave.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3143_inflight_remote.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3143_managed_repo_recover.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v315_reactions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v317_run_lock_wait.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3180_json_names.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3180_map_timer.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3180_where_filters.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v3180_where_keep.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v31_analysis.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v31_collection.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v320_reply_to_file_display.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v320_reply_to_file_lint.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v320_reply_to_file_resolve.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v320_report_fixes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_fingerprint_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_held.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_held_names.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_last_refusals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_notification_route.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_observe.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_report_friction.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_report_words.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v330_reports_effect.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v331_inflight_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v331_listing_resolve.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v331_outbox_retention.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v331_publish_status.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v331_self_resolve.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_fields.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_mcp.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_morning.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_observe.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_open.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_open_confirm.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_reply.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v340_plaza_store.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_nodes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_observe.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_plaza.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_retention.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_self.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_show.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v350_map_world.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v351_leave_timers.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v351_plaza_open_holes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v351_who_owned.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_analytics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_observe_map.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_plaza.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_record.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_goal_send.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v360_report_timeline.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_account_self_healing.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_approve_pending.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_click_attribution.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_collection_stale_basis.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_follow_comparison.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_local_path.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_weekly_goals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_where_aggregate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_where_also.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v370_where_zero.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_digest.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_from.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_mcp.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_moments.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_owner.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_received.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v380_plaza_triggers.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v381_plaza_visibility_default.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v382_confirm_file.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v382_first_stage_not_refusal.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v382_reader_lock_and_push_pending.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v382_sync_without_fetch_head.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v390_docs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v390_per_post_clicks.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v390_where_rate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v390_where_suggest.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_v391_plaza_text_numbers.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_value_domains_shown.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_where_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_where_threads_tag_author.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_who_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_writeback_rebase.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_writeback_validate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_x_list.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_x_metrics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_x_owned_metrics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_x_search_thread.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/tests/test_x_token_autorefresh.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/__init__.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/__main__.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/_grapheme_data.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/account_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/account_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/account_settings.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/accounts.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/activity.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/__init__.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/auth_mastodon.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/auth_threads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/auth_x.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/base.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/bluesky.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/bluesky_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/bluesky_video.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/mastodon.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/mastodon_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/threads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/threads_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/adapters/x_media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/admin_diagnose.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/admin_log.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/admin_notifications.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/admin_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/after_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_clicks.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_comparison.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_goals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_shapes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_threads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/analytics_weekly.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/api_diagnostic.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/api_requests.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/appconfig.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/appenv.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/approval.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/approve_pending.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/ask.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/ask_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/audioformats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/authclients.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/authflow.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/authpassword.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/bluesky_metadata.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/budget_x.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/budget_x_posts.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/bundle.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/click_attribution.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/collect.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/collection_context.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/collection_status.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/core.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/deletion.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/doctor.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/ebmlaudio.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/ebmlvideo.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/engagements.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/fingerprint_golden.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/flacformats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/forms.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/goals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/graphemes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/guard.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/handoff_cursor.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/healthcheck.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/httpsafe.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/incident.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/inflight.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/inflight_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/inflight_resolve.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/invites.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/jst.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/leave.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/leave_gate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/lint.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/list_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/lock.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/maintain.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/managed_repo.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/map_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/map_store.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/map_view.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/map_world.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/measured.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media_capabilities.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media_cleanup.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media_delivery.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media_relay.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/media_uploads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/mediaformats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/morning.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/mpeg_audio.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/notification_route.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/oauth.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/oggformats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/operations_handoff.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_from.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_moments.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_observe.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_reads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/plaza_redact.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/postid.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/private_store.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/pulse.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/queuefile.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/reaction_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/reactions.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/read_coordination.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/read_window.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/redact.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/refusals.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/relay.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/remote.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/replies.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_details.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_http.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_inbox.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_isolation.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_service.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/report_timeline.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/retract_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/runs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/scopes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/secrets_fs.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/select.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/selfupdate.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/sent.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/server_files.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/server_reads.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/server_writes.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/stop_observation.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/study_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/study_report.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/systemd_gen.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/tags.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/thread_read.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/threadrun.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/threads_read_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/threadshape.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/threadthrow.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/timer_cleanup.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/tool_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/topic_advice.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/topic_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/topic_models.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/topic_store.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/topics.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/unanswered.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/vorbisformats.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/watch_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/where_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/where_keep.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/where_suggest.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/who_cli.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/worker.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/worker_version.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/writeback.py +0 -0
- {thth-3.18.0 → thth-3.18.2}/thth/x_metrics.py +0 -0
|
@@ -218,3 +218,30 @@ def test_after_an_unknown_the_next_send_refuses_without_touching_the_provider(
|
|
|
218
218
|
output = capsys.readouterr()
|
|
219
219
|
assert 'inflight が残っています' in output.out + output.err
|
|
220
220
|
assert wire['calls'] == [] and inflight.read(state) == before
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# ----- 403 の本文から静的な符丁(10/13 関東の返信の 403) --------------------
|
|
224
|
+
|
|
225
|
+
@pytest.mark.parametrize('body,expected', [
|
|
226
|
+
(b'{"detail":"Reply to this conversation is not allowed because you have not been mentioned or otherwise engaged by the author of the post you are replying to.","title":"Forbidden","status":403}',
|
|
227
|
+
'x_publish_http_403: x_reply_not_engaged'),
|
|
228
|
+
(b'{"detail":"You are not permitted to perform this action.","title":"Forbidden","status":403}',
|
|
229
|
+
'x_publish_http_403: x_not_permitted'),
|
|
230
|
+
(b'{"errors":[{"message":"You are not allowed to create a Tweet with duplicate content."}]}',
|
|
231
|
+
'x_publish_http_403: x_duplicate_content'),
|
|
232
|
+
(b'{"detail":"something new","title":"Forbidden","type":"https://api.twitter.com/2/problems/not-authorized-for-resource"}',
|
|
233
|
+
'x_publish_http_403: x_unknown_refusal(type=not-authorized-for-resource / title=Forbidden / detail=something new)'),
|
|
234
|
+
(b'not json', 'x_publish_http_403'),
|
|
235
|
+
(b'{"detail":"' + b'x' * 5000 + b'"}', 'x_publish_http_403'),
|
|
236
|
+
])
|
|
237
|
+
def test_403_body_becomes_a_static_code_without_provider_text(env, wire, monkeypatch, body, expected):
|
|
238
|
+
original = x_adapter.request
|
|
239
|
+
|
|
240
|
+
def request(adapter, method, path, **kwargs):
|
|
241
|
+
if path == '/2/tweets':
|
|
242
|
+
raise urllib.error.HTTPError(adapter.base_url + path, 403, 'Forbidden', {},
|
|
243
|
+
io.BytesIO(body))
|
|
244
|
+
return original(adapter, method, path, **kwargs)
|
|
245
|
+
monkeypatch.setattr(x_adapter, 'request', request)
|
|
246
|
+
result = text_post(env)
|
|
247
|
+
assert result.failure == 'publish_definite' and result.error == expected
|
thth-3.18.2/thth/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.18.2
|
|
@@ -112,6 +112,65 @@ def rate_limit(error):
|
|
|
112
112
|
return out
|
|
113
113
|
|
|
114
114
|
|
|
115
|
+
# 投稿の 4xx の本文から**静的な符丁だけ**を引く(provider の文面は理由に混ぜない・
|
|
116
|
+
# `rate_limit()` と同じ流儀)。10/13 関東の返信が `x_publish_http_403` だけを残し、
|
|
117
|
+
# 「返信先の投稿者から関わりが無い」制限か、アカウントの制限かを見分けられなかった。
|
|
118
|
+
# 文面は X の開発者フォーラムで報告されている形(一次資料には無い・L3)。
|
|
119
|
+
PUBLISH_REFUSALS = (
|
|
120
|
+
('not been mentioned or otherwise engaged', 'x_reply_not_engaged'),
|
|
121
|
+
('reply to this conversation is not allowed', 'x_reply_not_engaged'),
|
|
122
|
+
('duplicate content', 'x_duplicate_content'),
|
|
123
|
+
('not permitted to perform this action', 'x_not_permitted'),
|
|
124
|
+
('not permitted to access this feature', 'x_not_permitted'),
|
|
125
|
+
)
|
|
126
|
+
MAX_ERROR_BYTES = 4096
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def publish_refusal(error) -> str | None:
|
|
130
|
+
"""4xx の本文(`detail`・`title`・`type`・`errors[].message`)を 1 回だけ読む。
|
|
131
|
+
|
|
132
|
+
知っている形なら静的な符丁。知らない形は **X の文面を短く残す**(3.18.2・10/13
|
|
133
|
+
関東の返信の 403 が知らない形で、何が断られたのか読めなかった。SageSpring の依頼)。
|
|
134
|
+
X の problem の文面は自分の要求への断りで、他人の投稿の本文は入らない。それでも
|
|
135
|
+
`redact` を通し、200 字で切る。
|
|
136
|
+
"""
|
|
137
|
+
try:
|
|
138
|
+
raw = error.read(MAX_ERROR_BYTES + 1)
|
|
139
|
+
except (OSError, ValueError, AttributeError):
|
|
140
|
+
return None
|
|
141
|
+
if not raw or len(raw) > MAX_ERROR_BYTES:
|
|
142
|
+
return None
|
|
143
|
+
try:
|
|
144
|
+
body = json.loads(raw)
|
|
145
|
+
except (ValueError, UnicodeError):
|
|
146
|
+
return None
|
|
147
|
+
if not isinstance(body, dict):
|
|
148
|
+
return None
|
|
149
|
+
texts = [body.get('detail'), body.get('title')]
|
|
150
|
+
for item in body.get('errors') or []:
|
|
151
|
+
if isinstance(item, dict):
|
|
152
|
+
texts += [item.get('message'), item.get('detail')]
|
|
153
|
+
blob = ' '.join(t for t in texts if isinstance(t, str)).lower()
|
|
154
|
+
for needle, code in PUBLISH_REFUSALS:
|
|
155
|
+
if needle in blob:
|
|
156
|
+
return code
|
|
157
|
+
parts = []
|
|
158
|
+
kind = body.get('type')
|
|
159
|
+
if isinstance(kind, str) and kind.strip():
|
|
160
|
+
parts.append('type=' + kind.strip().rstrip('/').rsplit('/', 1)[-1][:60])
|
|
161
|
+
for key in ('title', 'detail'):
|
|
162
|
+
if isinstance(body.get(key), str) and body[key].strip():
|
|
163
|
+
parts.append(key + '=' + body[key].strip())
|
|
164
|
+
for item in body.get('errors') or []:
|
|
165
|
+
if isinstance(item, dict) and isinstance(item.get('message'), str):
|
|
166
|
+
parts.append('message=' + item['message'].strip())
|
|
167
|
+
break
|
|
168
|
+
if not parts:
|
|
169
|
+
return None
|
|
170
|
+
text = redact_mod.redact(' / '.join(parts).replace('\n', ' ')) or ''
|
|
171
|
+
return ('x_unknown_refusal(' + text[:200] + ')') if text else None
|
|
172
|
+
|
|
173
|
+
|
|
115
174
|
def request(adapter, method, path, *, json_body=None, data=None, query=None,
|
|
116
175
|
headers=None, timeout=None, socket_timeout=None):
|
|
117
176
|
"""1 回だけ投げて `(status, value)`。**urllib の例外はそのまま上げる**
|
|
@@ -312,6 +371,10 @@ class XAdapter(base.Adapter):
|
|
|
312
371
|
except urllib.error.HTTPError as exc:
|
|
313
372
|
reason = ('provider_rate_limited' if exc.code == 429
|
|
314
373
|
else 'x_publish_http_' + str(exc.code))
|
|
374
|
+
if 400 <= exc.code < 500 and exc.code != 429:
|
|
375
|
+
known = publish_refusal(exc)
|
|
376
|
+
if known:
|
|
377
|
+
reason += ': ' + known
|
|
315
378
|
failure = 'publish_definite' if 400 <= exc.code < 500 else 'publish_ambiguous'
|
|
316
379
|
detail = rate_limit(exc) if exc.code == 429 else {}
|
|
317
380
|
return base.PublishResult(None, None, ts, error=reason, failure=failure,
|
thth-3.18.0/thth/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.18.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|