sentry-sdk 2.35.1__tar.gz → 2.36.0__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.
Potentially problematic release.
This version of sentry-sdk might be problematic. Click here for more details.
- {sentry_sdk-2.35.1/sentry_sdk.egg-info → sentry_sdk-2.36.0}/PKG-INFO +1 -1
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/ai/monitoring.py +7 -5
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/consts.py +1 -1
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/__init__.py +1 -1
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/logging.py +13 -2
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai.py +5 -5
- sentry_sdk-2.36.0/sentry_sdk/integrations/unraisablehook.py +53 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/logger.py +4 -3
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/profiler/transaction_profiler.py +6 -4
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/tracing.py +6 -4
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0/sentry_sdk.egg-info}/PKG-INFO +1 -1
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/SOURCES.txt +1 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/setup.py +1 -1
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_basics.py +1 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_logs.py +24 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/LICENSE +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/MANIFEST.in +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/README.md +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/pyproject.toml +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_compat.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_init_implementation.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_log_batcher.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_lru_cache.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_queue.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_types.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/_werkzeug.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/ai/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/ai/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/api.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/attachments.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/client.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/crons/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/crons/api.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/crons/consts.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/crons/decorator.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/debug.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/envelope.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/feature_flags.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/hub.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/_asgi_common.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/_wsgi_common.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/aiohttp.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/anthropic.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/argv.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/ariadne.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/arq.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/asgi.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/asyncio.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/asyncpg.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/atexit.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/aws_lambda.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/beam.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/boto3.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/bottle.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/celery/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/celery/beat.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/celery/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/chalice.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/clickhouse_driver.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/cloud_resource_context.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/cohere.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/dedupe.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/asgi.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/caching.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/middleware.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/signals_handlers.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/templates.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/transactions.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/django/views.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/dramatiq.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/excepthook.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/executing.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/falcon.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/fastapi.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/flask.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/gcp.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/gnu_backtrace.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/gql.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/graphene.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/aio/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/aio/client.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/aio/server.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/client.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/consts.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/grpc/server.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/httpx.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/huey.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/huggingface_hub.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/langchain.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/launchdarkly.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/litestar.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/loguru.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/modules.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/consts.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/agent_run.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/models.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/runner.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/tools.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/agent_workflow.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/ai_client.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/execute_tool.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/handoff.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/invoke_agent.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openfeature.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/consts.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/integration.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/propagator.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/span_processor.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/pure_eval.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/pymongo.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/pyramid.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/quart.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/ray.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/_async_common.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/_sync_common.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/consts.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/modules/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/modules/caches.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/modules/queries.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/rb.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/redis.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/redis_cluster.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/redis_py_cluster_legacy.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/rq.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/rust_tracing.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/sanic.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/serverless.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/socket.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/spark/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/spark/spark_driver.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/spark/spark_worker.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/sqlalchemy.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/starlette.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/starlite.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/statsig.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/stdlib.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/strawberry.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/sys_exit.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/threading.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/tornado.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/trytond.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/typer.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/unleash.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/wsgi.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/metrics.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/monitor.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/profiler/__init__.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/profiler/continuous_profiler.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/profiler/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/py.typed +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/scope.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/scrubber.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/serializer.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/session.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/sessions.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/spotlight.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/tracing_utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/transport.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/types.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/worker.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/dependency_links.txt +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/entry_points.txt +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/not-zip-safe +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/requires.txt +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk.egg-info/top_level.txt +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/setup.cfg +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_ai_monitoring.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_api.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_client.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_conftest.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_crons.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_dsc.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_envelope.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_exceptiongroup.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_feature_flags.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_full_stack_frames.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_gevent.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_import.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_lru_cache.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_metrics.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_monitor.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_propagationcontext.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_scope.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_scrubber.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_serializer.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_sessions.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_spotlight.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_tracing_utils.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_transport.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_types.py +0 -0
- {sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/tests/test_utils.py +0 -0
|
@@ -10,7 +10,9 @@ from sentry_sdk.utils import ContextVar
|
|
|
10
10
|
from typing import TYPE_CHECKING
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
|
-
from typing import Optional, Callable, Any
|
|
13
|
+
from typing import Optional, Callable, Awaitable, Any, Union, TypeVar
|
|
14
|
+
|
|
15
|
+
F = TypeVar("F", bound=Union[Callable[..., Any], Callable[..., Awaitable[Any]]])
|
|
14
16
|
|
|
15
17
|
_ai_pipeline_name = ContextVar("ai_pipeline_name", default=None)
|
|
16
18
|
|
|
@@ -26,9 +28,9 @@ def get_ai_pipeline_name():
|
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
def ai_track(description, **span_kwargs):
|
|
29
|
-
# type: (str, Any) -> Callable[
|
|
31
|
+
# type: (str, Any) -> Callable[[F], F]
|
|
30
32
|
def decorator(f):
|
|
31
|
-
# type: (
|
|
33
|
+
# type: (F) -> F
|
|
32
34
|
def sync_wrapped(*args, **kwargs):
|
|
33
35
|
# type: (Any, Any) -> Any
|
|
34
36
|
curr_pipeline = _ai_pipeline_name.get()
|
|
@@ -88,9 +90,9 @@ def ai_track(description, **span_kwargs):
|
|
|
88
90
|
return res
|
|
89
91
|
|
|
90
92
|
if inspect.iscoroutinefunction(f):
|
|
91
|
-
return wraps(f)(async_wrapped)
|
|
93
|
+
return wraps(f)(async_wrapped) # type: ignore
|
|
92
94
|
else:
|
|
93
|
-
return wraps(f)(sync_wrapped)
|
|
95
|
+
return wraps(f)(sync_wrapped) # type: ignore
|
|
94
96
|
|
|
95
97
|
return decorator
|
|
96
98
|
|
|
@@ -356,12 +356,14 @@ class SentryLogsHandler(_BaseHandler):
|
|
|
356
356
|
record.levelno, SEVERITY_TO_OTEL_SEVERITY
|
|
357
357
|
)
|
|
358
358
|
project_root = client.options["project_root"]
|
|
359
|
+
|
|
359
360
|
attrs = self._extra_from_record(record) # type: Any
|
|
360
361
|
attrs["sentry.origin"] = "auto.logger.log"
|
|
361
|
-
|
|
362
|
-
|
|
362
|
+
|
|
363
|
+
parameters_set = False
|
|
363
364
|
if record.args is not None:
|
|
364
365
|
if isinstance(record.args, tuple):
|
|
366
|
+
parameters_set = bool(record.args)
|
|
365
367
|
for i, arg in enumerate(record.args):
|
|
366
368
|
attrs[f"sentry.message.parameter.{i}"] = (
|
|
367
369
|
arg
|
|
@@ -369,19 +371,28 @@ class SentryLogsHandler(_BaseHandler):
|
|
|
369
371
|
else safe_repr(arg)
|
|
370
372
|
)
|
|
371
373
|
elif isinstance(record.args, dict):
|
|
374
|
+
parameters_set = bool(record.args)
|
|
372
375
|
for key, value in record.args.items():
|
|
373
376
|
attrs[f"sentry.message.parameter.{key}"] = (
|
|
374
377
|
value
|
|
375
378
|
if isinstance(value, (str, float, int, bool))
|
|
376
379
|
else safe_repr(value)
|
|
377
380
|
)
|
|
381
|
+
|
|
382
|
+
if parameters_set and isinstance(record.msg, str):
|
|
383
|
+
# only include template if there is at least one
|
|
384
|
+
# sentry.message.parameter.X set
|
|
385
|
+
attrs["sentry.message.template"] = record.msg
|
|
386
|
+
|
|
378
387
|
if record.lineno:
|
|
379
388
|
attrs["code.line.number"] = record.lineno
|
|
389
|
+
|
|
380
390
|
if record.pathname:
|
|
381
391
|
if project_root is not None and record.pathname.startswith(project_root):
|
|
382
392
|
attrs["code.file.path"] = record.pathname[len(project_root) + 1 :]
|
|
383
393
|
else:
|
|
384
394
|
attrs["code.file.path"] = record.pathname
|
|
395
|
+
|
|
385
396
|
if record.funcName:
|
|
386
397
|
attrs["code.function.name"] = record.funcName
|
|
387
398
|
|
|
@@ -78,12 +78,12 @@ class OpenAIIntegration(Integration):
|
|
|
78
78
|
return 0
|
|
79
79
|
|
|
80
80
|
|
|
81
|
-
def _capture_exception(exc):
|
|
82
|
-
# type: (Any) -> None
|
|
81
|
+
def _capture_exception(exc, manual_span_cleanup=True):
|
|
82
|
+
# type: (Any, bool) -> None
|
|
83
83
|
# Close an eventually open span
|
|
84
84
|
# We need to do this by hand because we are not using the start_span context manager
|
|
85
85
|
current_span = sentry_sdk.get_current_span()
|
|
86
|
-
if current_span is not None:
|
|
86
|
+
if manual_span_cleanup and current_span is not None:
|
|
87
87
|
current_span.__exit__(None, None, None)
|
|
88
88
|
|
|
89
89
|
event, hint = event_from_exception(
|
|
@@ -516,7 +516,7 @@ def _wrap_embeddings_create(f):
|
|
|
516
516
|
try:
|
|
517
517
|
result = f(*args, **kwargs)
|
|
518
518
|
except Exception as e:
|
|
519
|
-
_capture_exception(e)
|
|
519
|
+
_capture_exception(e, manual_span_cleanup=False)
|
|
520
520
|
raise e from None
|
|
521
521
|
|
|
522
522
|
return gen.send(result)
|
|
@@ -550,7 +550,7 @@ def _wrap_async_embeddings_create(f):
|
|
|
550
550
|
try:
|
|
551
551
|
result = await f(*args, **kwargs)
|
|
552
552
|
except Exception as e:
|
|
553
|
-
_capture_exception(e)
|
|
553
|
+
_capture_exception(e, manual_span_cleanup=False)
|
|
554
554
|
raise e from None
|
|
555
555
|
|
|
556
556
|
return gen.send(result)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
import sentry_sdk
|
|
4
|
+
from sentry_sdk.utils import (
|
|
5
|
+
capture_internal_exceptions,
|
|
6
|
+
event_from_exception,
|
|
7
|
+
)
|
|
8
|
+
from sentry_sdk.integrations import Integration
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from typing import Callable
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UnraisablehookIntegration(Integration):
|
|
18
|
+
identifier = "unraisablehook"
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def setup_once():
|
|
22
|
+
# type: () -> None
|
|
23
|
+
sys.unraisablehook = _make_unraisable(sys.unraisablehook)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _make_unraisable(old_unraisablehook):
|
|
27
|
+
# type: (Callable[[sys.UnraisableHookArgs], Any]) -> Callable[[sys.UnraisableHookArgs], Any]
|
|
28
|
+
def sentry_sdk_unraisablehook(unraisable):
|
|
29
|
+
# type: (sys.UnraisableHookArgs) -> None
|
|
30
|
+
integration = sentry_sdk.get_client().get_integration(UnraisablehookIntegration)
|
|
31
|
+
|
|
32
|
+
# Note: If we replace this with ensure_integration_enabled then
|
|
33
|
+
# we break the exceptiongroup backport;
|
|
34
|
+
# See: https://github.com/getsentry/sentry-python/issues/3097
|
|
35
|
+
if integration is None:
|
|
36
|
+
return old_unraisablehook(unraisable)
|
|
37
|
+
|
|
38
|
+
if unraisable.exc_value and unraisable.exc_traceback:
|
|
39
|
+
with capture_internal_exceptions():
|
|
40
|
+
event, hint = event_from_exception(
|
|
41
|
+
(
|
|
42
|
+
unraisable.exc_type,
|
|
43
|
+
unraisable.exc_value,
|
|
44
|
+
unraisable.exc_traceback,
|
|
45
|
+
),
|
|
46
|
+
client_options=sentry_sdk.get_client().options,
|
|
47
|
+
mechanism={"type": "unraisablehook", "handled": False},
|
|
48
|
+
)
|
|
49
|
+
sentry_sdk.capture_event(event, hint=hint)
|
|
50
|
+
|
|
51
|
+
return old_unraisablehook(unraisable)
|
|
52
|
+
|
|
53
|
+
return sentry_sdk_unraisablehook
|
|
@@ -22,13 +22,14 @@ def _capture_log(severity_text, severity_number, template, **kwargs):
|
|
|
22
22
|
# type: (str, int, str, **Any) -> None
|
|
23
23
|
client = get_client()
|
|
24
24
|
|
|
25
|
-
attrs = {
|
|
26
|
-
"sentry.message.template": template,
|
|
27
|
-
} # type: dict[str, str | bool | float | int]
|
|
25
|
+
attrs = {} # type: dict[str, str | bool | float | int]
|
|
28
26
|
if "attributes" in kwargs:
|
|
29
27
|
attrs.update(kwargs.pop("attributes"))
|
|
30
28
|
for k, v in kwargs.items():
|
|
31
29
|
attrs[f"sentry.message.parameter.{k}"] = v
|
|
30
|
+
if kwargs:
|
|
31
|
+
# only attach template if there are parameters
|
|
32
|
+
attrs["sentry.message.template"] = template
|
|
32
33
|
|
|
33
34
|
attrs = {
|
|
34
35
|
k: (
|
|
@@ -45,6 +45,7 @@ from sentry_sdk.profiler.utils import (
|
|
|
45
45
|
)
|
|
46
46
|
from sentry_sdk.utils import (
|
|
47
47
|
capture_internal_exception,
|
|
48
|
+
capture_internal_exceptions,
|
|
48
49
|
get_current_thread_meta,
|
|
49
50
|
is_gevent,
|
|
50
51
|
is_valid_sample_rate,
|
|
@@ -369,12 +370,13 @@ class Profile:
|
|
|
369
370
|
|
|
370
371
|
def __exit__(self, ty, value, tb):
|
|
371
372
|
# type: (Optional[Any], Optional[Any], Optional[Any]) -> None
|
|
372
|
-
|
|
373
|
+
with capture_internal_exceptions():
|
|
374
|
+
self.stop()
|
|
373
375
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
+
scope, old_profile = self._context_manager_state
|
|
377
|
+
del self._context_manager_state
|
|
376
378
|
|
|
377
|
-
|
|
379
|
+
scope.profile = old_profile
|
|
378
380
|
|
|
379
381
|
def write(self, ts, sample):
|
|
380
382
|
# type: (int, ExtractedSample) -> None
|
|
@@ -8,6 +8,7 @@ import sentry_sdk
|
|
|
8
8
|
from sentry_sdk.consts import INSTRUMENTER, SPANSTATUS, SPANDATA, SPANTEMPLATE
|
|
9
9
|
from sentry_sdk.profiler.continuous_profiler import get_profiler_id
|
|
10
10
|
from sentry_sdk.utils import (
|
|
11
|
+
capture_internal_exceptions,
|
|
11
12
|
get_current_thread_meta,
|
|
12
13
|
is_valid_sample_rate,
|
|
13
14
|
logger,
|
|
@@ -418,10 +419,11 @@ class Span:
|
|
|
418
419
|
if value is not None and should_be_treated_as_error(ty, value):
|
|
419
420
|
self.set_status(SPANSTATUS.INTERNAL_ERROR)
|
|
420
421
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
422
|
+
with capture_internal_exceptions():
|
|
423
|
+
scope, old_span = self._context_manager_state
|
|
424
|
+
del self._context_manager_state
|
|
425
|
+
self.finish(scope)
|
|
426
|
+
scope.span = old_span
|
|
425
427
|
|
|
426
428
|
@property
|
|
427
429
|
def containing_transaction(self):
|
|
@@ -113,6 +113,7 @@ sentry_sdk/integrations/tornado.py
|
|
|
113
113
|
sentry_sdk/integrations/trytond.py
|
|
114
114
|
sentry_sdk/integrations/typer.py
|
|
115
115
|
sentry_sdk/integrations/unleash.py
|
|
116
|
+
sentry_sdk/integrations/unraisablehook.py
|
|
116
117
|
sentry_sdk/integrations/wsgi.py
|
|
117
118
|
sentry_sdk/integrations/celery/__init__.py
|
|
118
119
|
sentry_sdk/integrations/celery/beat.py
|
|
@@ -870,6 +870,7 @@ def test_event_processor_drop_records_client_report(
|
|
|
870
870
|
(["celery"], "sentry.python"),
|
|
871
871
|
(["dedupe"], "sentry.python"),
|
|
872
872
|
(["excepthook"], "sentry.python"),
|
|
873
|
+
(["unraisablehook"], "sentry.python"),
|
|
873
874
|
(["executing"], "sentry.python"),
|
|
874
875
|
(["modules"], "sentry.python"),
|
|
875
876
|
(["pure_eval"], "sentry.python"),
|
|
@@ -254,30 +254,54 @@ def test_logs_message_params(sentry_init, capture_envelopes):
|
|
|
254
254
|
sentry_sdk.logger.error(
|
|
255
255
|
"The recorded error was '{error}'", error=Exception("some error")
|
|
256
256
|
)
|
|
257
|
+
sentry_sdk.logger.warning("The recorded value was hardcoded.")
|
|
257
258
|
|
|
258
259
|
get_client().flush()
|
|
259
260
|
logs = envelopes_to_logs(envelopes)
|
|
260
261
|
|
|
261
262
|
assert logs[0]["body"] == "The recorded value was '1'"
|
|
262
263
|
assert logs[0]["attributes"]["sentry.message.parameter.int_var"] == 1
|
|
264
|
+
assert (
|
|
265
|
+
logs[0]["attributes"]["sentry.message.template"]
|
|
266
|
+
== "The recorded value was '{int_var}'"
|
|
267
|
+
)
|
|
263
268
|
|
|
264
269
|
assert logs[1]["body"] == "The recorded value was '2.0'"
|
|
265
270
|
assert logs[1]["attributes"]["sentry.message.parameter.float_var"] == 2.0
|
|
271
|
+
assert (
|
|
272
|
+
logs[1]["attributes"]["sentry.message.template"]
|
|
273
|
+
== "The recorded value was '{float_var}'"
|
|
274
|
+
)
|
|
266
275
|
|
|
267
276
|
assert logs[2]["body"] == "The recorded value was 'False'"
|
|
268
277
|
assert logs[2]["attributes"]["sentry.message.parameter.bool_var"] is False
|
|
278
|
+
assert (
|
|
279
|
+
logs[2]["attributes"]["sentry.message.template"]
|
|
280
|
+
== "The recorded value was '{bool_var}'"
|
|
281
|
+
)
|
|
269
282
|
|
|
270
283
|
assert logs[3]["body"] == "The recorded value was 'some string value'"
|
|
271
284
|
assert (
|
|
272
285
|
logs[3]["attributes"]["sentry.message.parameter.string_var"]
|
|
273
286
|
== "some string value"
|
|
274
287
|
)
|
|
288
|
+
assert (
|
|
289
|
+
logs[3]["attributes"]["sentry.message.template"]
|
|
290
|
+
== "The recorded value was '{string_var}'"
|
|
291
|
+
)
|
|
275
292
|
|
|
276
293
|
assert logs[4]["body"] == "The recorded error was 'some error'"
|
|
277
294
|
assert (
|
|
278
295
|
logs[4]["attributes"]["sentry.message.parameter.error"]
|
|
279
296
|
== "Exception('some error')"
|
|
280
297
|
)
|
|
298
|
+
assert (
|
|
299
|
+
logs[4]["attributes"]["sentry.message.template"]
|
|
300
|
+
== "The recorded error was '{error}'"
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
assert logs[5]["body"] == "The recorded value was hardcoded."
|
|
304
|
+
assert "sentry.message.template" not in logs[5]["attributes"]
|
|
281
305
|
|
|
282
306
|
|
|
283
307
|
@minimum_python_37
|
|
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
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/__init__.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/agent_run.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/models.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/runner.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/patches/tools.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/ai_client.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/execute_tool.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/handoff.py
RENAMED
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/openai_agents/spans/invoke_agent.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/opentelemetry/span_processor.py
RENAMED
|
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
|
{sentry_sdk-2.35.1 → sentry_sdk-2.36.0}/sentry_sdk/integrations/redis/redis_py_cluster_legacy.py
RENAMED
|
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
|