From fbe9e80608649bf47e73514407fad2f97a69173f Mon Sep 17 00:00:00 2001 From: Luke Oliff Date: Fri, 14 Nov 2025 14:14:00 +0000 Subject: [PATCH 1/2] chore: disable fern-ignore file --- .fernignore | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/.fernignore b/.fernignore index dfd18a20..e69de29b 100644 --- a/.fernignore +++ b/.fernignore @@ -1,33 +0,0 @@ -# Development, Configuration Files & Documentation -README.md -CONTRIBUTING.md -.vscode/ -.gitignore -mypy.ini -websockets-reference.md -.github/ -scripts/run_examples.sh -docs/ -pyproject.toml -CHANGELOG.md - -# Examples -examples/ - -# Test Files -tests/unit/ -tests/integrations/ - -# Custom Extensions & Clients -src/deepgram/client.py -src/deepgram/extensions/ - -# Socket Client Implementations -src/deepgram/agent/v1/socket_client.py -src/deepgram/listen/v1/socket_client.py -src/deepgram/listen/v2/socket_client.py -src/deepgram/speak/v1/socket_client.py - -# Bug Fixes -src/deepgram/listen/client.py -src/deepgram/core/client_wrapper.py \ No newline at end of file From 606a23d61b3de5496da8668d616ff2608a8ef703 Mon Sep 17 00:00:00 2001 From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:17:25 +0000 Subject: [PATCH 2/2] SDK regeneration --- .fern/metadata.json | 15 + .github/.commitlintrc.json | 52 - .github/.release-please-manifest.json | 3 - .github/CODEOWNERS | 6 - .github/ISSUE_TEMPLATE/bug_report.yml | 219 --- .github/ISSUE_TEMPLATE/docs_improvement.yml | 71 - .github/ISSUE_TEMPLATE/feature_request.yml | 100 -- .github/release-please-config.json | 27 - .github/workflows/changelog-log.yml | 38 - .github/workflows/ci.yml | 46 +- .github/workflows/pr-title-check.yml | 32 - .github/workflows/release-please.yml | 89 -- .github/workflows/tests-daily.yml | 48 - .gitignore | 14 - CHANGELOG.md | 47 - CONTRIBUTING.md | 65 - README.md | 388 +++--- docs/Migrating-v2-to-v3.md | 529 ------- docs/Migrating-v3-to-v5.md | 929 ------------- examples/agent/v1/connect/async.py | 83 -- examples/agent/v1/connect/main.py | 82 -- examples/agent/v1/connect/with_auth_token.py | 88 -- .../agent/v1/connect/with_raw_response.py | 86 -- examples/fixtures/audio.mp3 | Bin 43467 -> 0 bytes examples/fixtures/audio.wav | Bin 2287520 -> 0 bytes examples/listen/v1/connect/async.py | 34 - examples/listen/v1/connect/main.py | 31 - examples/listen/v1/connect/with_auth_token.py | 38 - .../listen/v1/connect/with_raw_response.py | 31 - .../listen/v1/media/transcribe_file/async.py | 30 - .../listen/v1/media/transcribe_file/main.py | 26 - .../media/transcribe_file/with_auth_token.py | 33 - .../transcribe_file/with_raw_response.py | 26 - .../listen/v1/media/transcribe_url/async.py | 22 - .../listen/v1/media/transcribe_url/main.py | 17 - .../media/transcribe_url/with_auth_token.py | 24 - .../media/transcribe_url/with_raw_response.py | 17 - examples/listen/v2/connect/async.py | 36 - examples/listen/v2/connect/main.py | 33 - examples/listen/v2/connect/with_auth_token.py | 40 - .../listen/v2/connect/with_raw_response.py | 33 - examples/read/v1/text/analyze/async.py | 26 - examples/read/v1/text/analyze/main.py | 21 - .../read/v1/text/analyze/with_auth_token.py | 28 - .../read/v1/text/analyze/with_raw_response.py | 21 - examples/requirements.txt | 2 - examples/speak/v1/audio/generate/async.py | 22 - examples/speak/v1/audio/generate/main.py | 18 - .../v1/audio/generate/with_auth_token.py | 25 - .../v1/audio/generate/with_raw_response.py | 18 - examples/speak/v1/connect/async.py | 45 - examples/speak/v1/connect/main.py | 43 - examples/speak/v1/connect/with_auth_token.py | 50 - .../speak/v1/connect/with_raw_response.py | 43 - mypy.ini | 3 - poetry.lock | 6 +- pyproject.toml | 37 +- reference.md | 158 ++- scripts/run_examples.sh | 103 -- src/deepgram/agent/__init__.py | 661 ++++++++- src/deepgram/agent/v1/__init__.py | 663 ++++++++- src/deepgram/agent/v1/requests/__init__.py | 351 +++++ .../v1/requests/agent_v1agent_audio_done.py | 12 + .../agent_v1agent_started_speaking.py | 27 + .../v1/requests/agent_v1agent_thinking.py | 17 + .../v1/requests/agent_v1conversation_text.py | 23 + .../agent/v1/requests/agent_v1error.py | 22 + .../requests/agent_v1function_call_request.py | 18 + ..._v1function_call_request_functions_item.py | 25 + .../requests/agent_v1inject_agent_message.py | 17 + .../requests/agent_v1inject_user_message.py | 17 + .../v1/requests/agent_v1injection_refused.py | 17 + .../agent/v1/requests/agent_v1keep_alive.py | 16 + .../v1/requests/agent_v1prompt_updated.py | 12 + .../agent_v1receive_function_call_response.py | 44 + .../agent_v1send_function_call_response.py | 44 + .../agent/v1/requests/agent_v1settings.py | 30 + .../v1/requests/agent_v1settings_agent.py | 27 + .../agent_v1settings_agent_context.py | 17 + ..._v1settings_agent_context_messages_item.py | 12 + ...ngs_agent_context_messages_item_content.py | 29 + ...nt_context_messages_item_function_calls.py | 20 + ...item_function_calls_function_calls_item.py | 30 + .../requests/agent_v1settings_agent_listen.py | 8 + .../agent_v1settings_agent_listen_provider.py | 27 + .../requests/agent_v1settings_agent_speak.py | 10 + .../agent_v1settings_agent_speak_endpoint.py | 14 + ...1settings_agent_speak_endpoint_endpoint.py | 20 + ...1settings_agent_speak_endpoint_provider.py | 75 + ...agent_speak_endpoint_provider_aws_polly.py | 27 + ...endpoint_provider_aws_polly_credentials.py | 17 + ..._agent_speak_endpoint_provider_cartesia.py | 22 + ..._speak_endpoint_provider_cartesia_voice.py | 15 + ..._agent_speak_endpoint_provider_deepgram.py | 13 + ...ent_speak_endpoint_provider_eleven_labs.py | 18 + ...s_agent_speak_endpoint_provider_open_ai.py | 21 + .../agent_v1settings_agent_speak_item.py | 14 + ...nt_v1settings_agent_speak_item_endpoint.py | 20 + ...nt_v1settings_agent_speak_item_provider.py | 75 + ...ngs_agent_speak_item_provider_aws_polly.py | 27 + ...eak_item_provider_aws_polly_credentials.py | 17 + ...ings_agent_speak_item_provider_cartesia.py | 22 + ...gent_speak_item_provider_cartesia_voice.py | 15 + ...ings_agent_speak_item_provider_deepgram.py | 13 + ...s_agent_speak_item_provider_eleven_labs.py | 18 + ...tings_agent_speak_item_provider_open_ai.py | 21 + .../requests/agent_v1settings_agent_think.py | 24 + ...t_v1settings_agent_think_context_length.py | 5 + .../agent_v1settings_agent_think_endpoint.py | 21 + ...t_v1settings_agent_think_functions_item.py | 28 + ...ngs_agent_think_functions_item_endpoint.py | 23 + .../agent_v1settings_agent_think_provider.py | 17 + ...ttings_agent_think_provider_credentials.py | 29 + ..._think_provider_credentials_credentials.py | 37 + ...t_v1settings_agent_think_provider_model.py | 18 + ...t_v1settings_agent_think_provider_three.py | 19 + ...ent_v1settings_agent_think_provider_two.py | 19 + ...nt_v1settings_agent_think_provider_zero.py | 19 + .../v1/requests/agent_v1settings_applied.py | 12 + .../v1/requests/agent_v1settings_audio.py | 17 + .../requests/agent_v1settings_audio_input.py | 20 + .../requests/agent_v1settings_audio_output.py | 30 + .../v1/requests/agent_v1settings_flags.py | 10 + .../v1/requests/agent_v1speak_updated.py | 12 + .../v1/requests/agent_v1update_prompt.py | 17 + .../agent/v1/requests/agent_v1update_speak.py | 18 + .../v1/requests/agent_v1update_speak_speak.py | 18 + .../agent_v1update_speak_speak_endpoint.py | 20 + .../agent_v1update_speak_speak_provider.py | 61 + ...v1update_speak_speak_provider_aws_polly.py | 23 + ...ak_speak_provider_aws_polly_credentials.py | 17 + ..._v1update_speak_speak_provider_cartesia.py | 18 + ...ate_speak_speak_provider_cartesia_voice.py | 15 + ..._v1update_speak_speak_provider_deepgram.py | 11 + ...update_speak_speak_provider_eleven_labs.py | 18 + ...t_v1update_speak_speak_provider_open_ai.py | 17 + .../requests/agent_v1user_started_speaking.py | 12 + .../agent/v1/requests/agent_v1warning.py | 26 + .../agent/v1/requests/agent_v1welcome.py | 17 + src/deepgram/agent/v1/socket_client.py | 342 +++-- src/deepgram/agent/v1/types/__init__.py | 482 +++++++ .../v1/types/agent_v1agent_audio_done.py} | 14 +- .../types/agent_v1agent_started_speaking.py | 37 + .../agent/v1/types/agent_v1agent_thinking.py | 27 + .../v1/types/agent_v1conversation_text.py | 33 + .../types/agent_v1conversation_text_role.py | 5 + .../v1/types/agent_v1error.py} | 27 +- .../v1/types/agent_v1function_call_request.py | 28 + ..._v1function_call_request_functions_item.py | 37 + .../v1/types/agent_v1inject_agent_message.py} | 22 +- .../v1/types/agent_v1inject_user_message.py | 27 + .../v1/types/agent_v1injection_refused.py | 27 + .../v1/types/agent_v1keep_alive.py} | 15 +- .../v1/types/agent_v1prompt_updated.py} | 11 +- .../agent_v1receive_function_call_response.py | 54 + .../agent_v1send_function_call_response.py | 54 + .../agent/v1/types/agent_v1settings.py | 40 + .../agent/v1/types/agent_v1settings_agent.py | 39 + .../types/agent_v1settings_agent_context.py | 27 + ..._v1settings_agent_context_messages_item.py | 12 + ...ngs_agent_context_messages_item_content.py | 39 + ...gent_context_messages_item_content_role.py | 5 + ...nt_context_messages_item_function_calls.py | 32 + ...item_function_calls_function_calls_item.py | 42 + .../v1/types/agent_v1settings_agent_listen.py | 20 + .../agent_v1settings_agent_listen_provider.py | 37 + .../v1/types/agent_v1settings_agent_speak.py | 8 + .../agent_v1settings_agent_speak_endpoint.py | 26 + ...1settings_agent_speak_endpoint_endpoint.py | 30 + ...1settings_agent_speak_endpoint_provider.py | 121 ++ ...agent_speak_endpoint_provider_aws_polly.py | 39 + ...endpoint_provider_aws_polly_credentials.py | 29 + ...int_provider_aws_polly_credentials_type.py | 7 + ...peak_endpoint_provider_aws_polly_engine.py | 7 + ...speak_endpoint_provider_aws_polly_voice.py | 7 + ..._agent_speak_endpoint_provider_cartesia.py | 34 + ...eak_endpoint_provider_cartesia_model_id.py | 7 + ...speak_endpoint_provider_cartesia_voice.py} | 16 +- ..._agent_speak_endpoint_provider_deepgram.py | 25 + ..._speak_endpoint_provider_deepgram_model.py | 72 + ...ent_speak_endpoint_provider_eleven_labs.py | 30 + ..._endpoint_provider_eleven_labs_model_id.py | 7 + ...s_agent_speak_endpoint_provider_open_ai.py | 33 + ...t_speak_endpoint_provider_open_ai_model.py | 5 + ...t_speak_endpoint_provider_open_ai_voice.py | 7 + .../agent_v1settings_agent_speak_item.py | 26 + ...nt_v1settings_agent_speak_item_endpoint.py | 30 + ...nt_v1settings_agent_speak_item_provider.py | 117 ++ ...ngs_agent_speak_item_provider_aws_polly.py | 39 + ...eak_item_provider_aws_polly_credentials.py | 29 + ...tem_provider_aws_polly_credentials_type.py | 5 + ...nt_speak_item_provider_aws_polly_engine.py | 7 + ...ent_speak_item_provider_aws_polly_voice.py | 7 + ...ings_agent_speak_item_provider_cartesia.py | 34 + ...t_speak_item_provider_cartesia_model_id.py | 7 + ...ent_speak_item_provider_cartesia_voice.py} | 19 +- ...ings_agent_speak_item_provider_deepgram.py | 25 + ...gent_speak_item_provider_deepgram_model.py | 72 + ...s_agent_speak_item_provider_eleven_labs.py | 30 + ...peak_item_provider_eleven_labs_model_id.py | 7 + ...tings_agent_speak_item_provider_open_ai.py | 29 + ...agent_speak_item_provider_open_ai_model.py | 5 + ...agent_speak_item_provider_open_ai_voice.py | 7 + .../v1/types/agent_v1settings_agent_think.py | 34 + ...t_v1settings_agent_think_context_length.py | 5 + .../agent_v1settings_agent_think_endpoint.py | 31 + ...t_v1settings_agent_think_functions_item.py | 38 + ...ngs_agent_think_functions_item_endpoint.py | 33 + .../agent_v1settings_agent_think_provider.py | 17 + ...ttings_agent_think_provider_credentials.py | 37 + ..._think_provider_credentials_credentials.py | 49 + ...k_provider_credentials_credentials_type.py | 5 + ..._agent_think_provider_credentials_model.py | 7 + ...t_v1settings_agent_think_provider_model.py | 28 + ...t_v1settings_agent_think_provider_three.py | 29 + ...ttings_agent_think_provider_three_model.py | 7 + ...ent_v1settings_agent_think_provider_two.py | 29 + ...settings_agent_think_provider_two_model.py | 7 + ...nt_v1settings_agent_think_provider_zero.py | 29 + ...ettings_agent_think_provider_zero_model.py | 10 + .../v1/types/agent_v1settings_applied.py | 22 + .../agent/v1/types/agent_v1settings_audio.py | 29 + .../v1/types/agent_v1settings_audio_input.py | 32 + .../agent_v1settings_audio_input_encoding.py | 10 + .../v1/types/agent_v1settings_audio_output.py | 42 + .../agent_v1settings_audio_output_encoding.py | 5 + .../agent/v1/types/agent_v1settings_flags.py | 22 + .../agent/v1/types/agent_v1speak_updated.py | 22 + .../agent/v1/types/agent_v1update_prompt.py | 27 + .../agent/v1/types/agent_v1update_speak.py | 28 + .../v1/types/agent_v1update_speak_speak.py | 30 + .../agent_v1update_speak_speak_endpoint.py | 30 + .../agent_v1update_speak_speak_provider.py | 105 ++ ...v1update_speak_speak_provider_aws_polly.py | 35 + ...ak_speak_provider_aws_polly_credentials.py | 29 + ...eak_provider_aws_polly_credentials_type.py | 5 + ...e_speak_speak_provider_aws_polly_engine.py | 7 + ...te_speak_speak_provider_aws_polly_voice.py | 7 + ..._v1update_speak_speak_provider_cartesia.py | 30 + ..._speak_speak_provider_cartesia_model_id.py | 7 + ...ate_speak_speak_provider_cartesia_voice.py | 27 + ...v1update_speak_speak_provider_deepgram.py} | 18 +- ...ate_speak_speak_provider_deepgram_model.py | 72 + ...update_speak_speak_provider_eleven_labs.py | 28 + ...eak_speak_provider_eleven_labs_model_id.py | 7 + ...t_v1update_speak_speak_provider_open_ai.py | 29 + ...date_speak_speak_provider_open_ai_model.py | 5 + ...date_speak_speak_provider_open_ai_voice.py | 7 + .../v1/types/agent_v1user_started_speaking.py | 22 + .../agent/v1/types/agent_v1warning.py | 36 + .../agent/v1/types/agent_v1welcome.py | 27 + src/deepgram/client.py | 258 ---- src/deepgram/core/client_wrapper.py | 7 +- src/deepgram/core/http_sse/__init__.py | 42 + src/deepgram/core/http_sse/_api.py | 112 ++ src/deepgram/core/http_sse/_decoders.py | 61 + src/deepgram/core/http_sse/_exceptions.py | 7 + src/deepgram/core/http_sse/_models.py | 17 + src/deepgram/core/pydantic_utilities.py | 4 +- src/deepgram/extensions/__init__.py | 0 src/deepgram/extensions/core/__init__.py | 0 .../extensions/core/instrumented_http.py | 395 ------ .../extensions/core/instrumented_socket.py | 407 ------ .../extensions/core/telemetry_events.py | 306 ---- src/deepgram/extensions/telemetry/__init__.py | 13 - .../extensions/telemetry/batching_handler.py | 658 --------- src/deepgram/extensions/telemetry/handler.py | 88 -- src/deepgram/extensions/telemetry/models.py | 180 --- .../extensions/telemetry/proto_encoder.py | 379 ----- src/deepgram/extensions/types/__init__.py | 0 .../extensions/types/sockets/__init__.py | 217 --- .../agent_v1_agent_audio_done_event.py | 23 - .../agent_v1_agent_started_speaking_event.py | 33 - .../sockets/agent_v1_agent_thinking_event.py | 26 - .../sockets/agent_v1_audio_chunk_event.py | 9 - .../agent_v1_conversation_text_event.py | 29 - .../agent_v1_function_call_request_event.py | 50 - ...agent_v1_function_call_response_message.py | 32 - .../agent_v1_inject_agent_message_message.py | 26 - .../agent_v1_inject_user_message_message.py | 26 - .../agent_v1_injection_refused_event.py | 26 - .../types/sockets/agent_v1_media_message.py | 9 - .../sockets/agent_v1_prompt_updated_event.py | 23 - .../agent_v1_settings_applied_event.py | 23 - .../sockets/agent_v1_settings_message.py | 685 --------- .../sockets/agent_v1_speak_updated_event.py | 23 - .../sockets/agent_v1_update_prompt_message.py | 26 - .../sockets/agent_v1_update_speak_message.py | 31 - .../agent_v1_user_started_speaking_event.py | 23 - .../types/sockets/agent_v1_warning_event.py | 29 - .../types/sockets/listen_v1_media_message.py | 9 - .../types/sockets/listen_v1_metadata_event.py | 41 - .../types/sockets/listen_v1_results_event.py | 156 --- .../sockets/listen_v2_connected_event.py | 23 - .../sockets/listen_v2_control_message.py | 23 - .../sockets/listen_v2_fatal_error_event.py | 24 - .../types/sockets/listen_v2_media_message.py | 19 - .../sockets/listen_v2_turn_info_event.py | 47 - .../types/sockets/socket_client_responses.py | 121 -- .../sockets/speak_v1_audio_chunk_event.py | 9 - .../types/sockets/speak_v1_metadata_event.py | 35 - .../types/sockets/speak_v1_warning_event.py | 29 - src/deepgram/listen/__init__.py | 131 +- src/deepgram/listen/client.py | 22 +- src/deepgram/listen/v1/__init__.py | 85 ++ src/deepgram/listen/v1/media/client.py | 70 + src/deepgram/listen/v1/requests/__init__.py | 73 + .../v1/requests/listen_v1close_stream.py | 11 + .../listen/v1/requests/listen_v1finalize.py | 11 + .../listen/v1/requests/listen_v1keep_alive.py | 11 + .../listen/v1/requests/listen_v1metadata.py | 42 + .../listen/v1/requests/listen_v1results.py | 46 + .../v1/requests/listen_v1results_channel.py | 10 + ...ten_v1results_channel_alternatives_item.py | 21 + ...ts_channel_alternatives_item_words_item.py | 40 + .../v1/requests/listen_v1results_metadata.py | 17 + .../listen_v1results_metadata_model_info.py | 20 + .../v1/requests/listen_v1speech_started.py | 22 + .../v1/requests/listen_v1utterance_end.py | 22 + src/deepgram/listen/v1/socket_client.py | 200 ++- src/deepgram/listen/v1/types/__init__.py | 80 ++ .../listen/v1/types/listen_v1close_stream.py | 23 + .../v1/types/listen_v1close_stream_type.py | 5 + .../listen/v1/types/listen_v1finalize.py | 23 + .../listen/v1/types/listen_v1finalize_type.py | 5 + .../listen/v1/types/listen_v1keep_alive.py | 23 + .../v1/types/listen_v1keep_alive_type.py | 5 + .../listen/v1/types/listen_v1metadata.py | 52 + .../listen/v1/types/listen_v1results.py | 56 + .../v1/types/listen_v1results_channel.py | 20 + ...ten_v1results_channel_alternatives_item.py | 31 + ...ts_channel_alternatives_item_words_item.py | 52 + .../v1/types/listen_v1results_metadata.py | 29 + .../listen_v1results_metadata_model_info.py | 32 + .../v1/types/listen_v1speech_started.py | 32 + .../listen/v1/types/listen_v1utterance_end.py | 32 + src/deepgram/listen/v2/__init__.py | 71 + src/deepgram/listen/v2/requests/__init__.py | 50 + .../v2/requests/listen_v2close_stream.py | 11 + .../listen/v2/requests/listen_v2connected.py | 24 + .../v2/requests/listen_v2fatal_error.py | 29 + .../listen/v2/requests/listen_v2turn_info.py | 65 + .../requests/listen_v2turn_info_words_item.py | 15 + src/deepgram/listen/v2/socket_client.py | 167 +-- src/deepgram/listen/v2/types/__init__.py | 56 + .../listen/v2/types/listen_v2close_stream.py | 23 + .../v2/types/listen_v2close_stream_type.py | 5 + .../listen/v2/types/listen_v2connected.py | 34 + .../listen/v2/types/listen_v2fatal_error.py | 39 + .../listen/v2/types/listen_v2turn_info.py | 75 + .../v2/types/listen_v2turn_info_event.py | 7 + .../v2/types/listen_v2turn_info_words_item.py | 27 + src/deepgram/manage/v1/models/client.py | 8 +- .../v1/projects/billing/breakdown/client.py | 6 + .../v1/projects/billing/fields/client.py | 4 + .../v1/projects/billing/purchases/client.py | 2 + src/deepgram/manage/v1/projects/client.py | 4 + .../manage/v1/projects/keys/client.py | 2 + .../manage/v1/projects/models/client.py | 2 + .../manage/v1/projects/requests/client.py | 27 + .../v1/projects/usage/breakdown/client.py | 82 ++ .../manage/v1/projects/usage/client.py | 80 ++ .../manage/v1/projects/usage/fields/client.py | 4 + src/deepgram/read/v1/text/client.py | 24 + src/deepgram/speak/__init__.py | 73 +- src/deepgram/speak/v1/__init__.py | 67 + src/deepgram/speak/v1/requests/__init__.py | 59 + .../speak/v1/requests/speak_v1clear.py | 11 + .../speak/v1/requests/speak_v1cleared.py | 16 + .../speak/v1/requests/speak_v1close.py | 11 + .../speak/v1/requests/speak_v1flush.py | 11 + .../speak/v1/requests/speak_v1flushed.py | 16 + .../speak/v1/requests/speak_v1metadata.py | 32 + .../speak/v1/requests/speak_v1text.py | 17 + .../speak/v1/requests/speak_v1warning.py | 22 + src/deepgram/speak/v1/socket_client.py | 208 ++- src/deepgram/speak/v1/types/__init__.py | 74 + src/deepgram/speak/v1/types/speak_v1clear.py | 23 + .../speak/v1/types/speak_v1clear_type.py | 5 + .../v1/types/speak_v1cleared.py} | 20 +- .../speak/v1/types/speak_v1cleared_type.py | 5 + src/deepgram/speak/v1/types/speak_v1close.py | 23 + .../speak/v1/types/speak_v1close_type.py | 5 + src/deepgram/speak/v1/types/speak_v1flush.py | 23 + .../speak/v1/types/speak_v1flush_type.py | 5 + .../speak/v1/types/speak_v1flushed.py | 28 + .../speak/v1/types/speak_v1flushed_type.py | 5 + .../speak/v1/types/speak_v1metadata.py | 42 + src/deepgram/speak/v1/types/speak_v1text.py | 27 + .../speak/v1/types/speak_v1warning.py | 32 + tests/integrations/__init__.py | 1 - tests/integrations/conftest.py | 73 - tests/integrations/test_advanced_features.py | 601 -------- tests/integrations/test_agent_client.py | 636 --------- tests/integrations/test_auth_client.py | 597 -------- tests/integrations/test_base_client.py | 217 --- tests/integrations/test_client.py | 450 ------ .../test_integration_scenarios.py | 286 ---- tests/integrations/test_listen_client.py | 1226 ----------------- tests/integrations/test_manage_client.py | 823 ----------- tests/integrations/test_read_client.py | 772 ----------- tests/integrations/test_self_hosted_client.py | 736 ---------- tests/integrations/test_speak_client.py | 763 ---------- tests/unit/__init__.py | 1 - tests/unit/conftest.py | 166 --- tests/unit/test_agent_v1_models.py | 661 --------- tests/unit/test_api_response_models.py | 626 --------- tests/unit/test_core_file.py | 279 ---- tests/unit/test_core_jsonable_encoder.py | 372 ----- tests/unit/test_core_models.py | 430 ------ tests/unit/test_core_query_encoder.py | 347 ----- tests/unit/test_core_serialization.py | 409 ------ tests/unit/test_core_utils.py | 280 ---- tests/unit/test_http_internals.py | 820 ----------- tests/unit/test_listen_v1_models.py | 378 ----- tests/unit/test_listen_v2_models.py | 418 ------ tests/unit/test_manage_billing_fields.py | 498 ------- tests/unit/test_speak_v1_models.py | 462 ------- tests/unit/test_telemetry_batching_handler.py | 833 ----------- tests/unit/test_telemetry_handler.py | 511 ------- tests/unit/test_telemetry_models.py | 719 ---------- tests/unit/test_type_definitions.py | 431 ------ websockets-reference.md | 1199 ---------------- 423 files changed, 10242 insertions(+), 26057 deletions(-) create mode 100644 .fern/metadata.json delete mode 100644 .github/.commitlintrc.json delete mode 100644 .github/.release-please-manifest.json delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/docs_improvement.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 .github/release-please-config.json delete mode 100644 .github/workflows/changelog-log.yml delete mode 100644 .github/workflows/pr-title-check.yml delete mode 100644 .github/workflows/release-please.yml delete mode 100644 .github/workflows/tests-daily.yml delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 docs/Migrating-v2-to-v3.md delete mode 100644 docs/Migrating-v3-to-v5.md delete mode 100644 examples/agent/v1/connect/async.py delete mode 100644 examples/agent/v1/connect/main.py delete mode 100644 examples/agent/v1/connect/with_auth_token.py delete mode 100644 examples/agent/v1/connect/with_raw_response.py delete mode 100644 examples/fixtures/audio.mp3 delete mode 100644 examples/fixtures/audio.wav delete mode 100644 examples/listen/v1/connect/async.py delete mode 100644 examples/listen/v1/connect/main.py delete mode 100644 examples/listen/v1/connect/with_auth_token.py delete mode 100644 examples/listen/v1/connect/with_raw_response.py delete mode 100644 examples/listen/v1/media/transcribe_file/async.py delete mode 100644 examples/listen/v1/media/transcribe_file/main.py delete mode 100644 examples/listen/v1/media/transcribe_file/with_auth_token.py delete mode 100644 examples/listen/v1/media/transcribe_file/with_raw_response.py delete mode 100644 examples/listen/v1/media/transcribe_url/async.py delete mode 100644 examples/listen/v1/media/transcribe_url/main.py delete mode 100644 examples/listen/v1/media/transcribe_url/with_auth_token.py delete mode 100644 examples/listen/v1/media/transcribe_url/with_raw_response.py delete mode 100644 examples/listen/v2/connect/async.py delete mode 100644 examples/listen/v2/connect/main.py delete mode 100644 examples/listen/v2/connect/with_auth_token.py delete mode 100644 examples/listen/v2/connect/with_raw_response.py delete mode 100644 examples/read/v1/text/analyze/async.py delete mode 100644 examples/read/v1/text/analyze/main.py delete mode 100644 examples/read/v1/text/analyze/with_auth_token.py delete mode 100644 examples/read/v1/text/analyze/with_raw_response.py delete mode 100644 examples/requirements.txt delete mode 100644 examples/speak/v1/audio/generate/async.py delete mode 100644 examples/speak/v1/audio/generate/main.py delete mode 100644 examples/speak/v1/audio/generate/with_auth_token.py delete mode 100644 examples/speak/v1/audio/generate/with_raw_response.py delete mode 100644 examples/speak/v1/connect/async.py delete mode 100644 examples/speak/v1/connect/main.py delete mode 100644 examples/speak/v1/connect/with_auth_token.py delete mode 100644 examples/speak/v1/connect/with_raw_response.py delete mode 100644 mypy.ini delete mode 100755 scripts/run_examples.sh create mode 100644 src/deepgram/agent/v1/requests/__init__.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1agent_audio_done.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1agent_started_speaking.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1agent_thinking.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1conversation_text.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1error.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1function_call_request.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1function_call_request_functions_item.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1inject_agent_message.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1inject_user_message.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1injection_refused.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1keep_alive.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1prompt_updated.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1receive_function_call_response.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1send_function_call_response.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_context.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_content.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_listen.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_listen_provider.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_deepgram.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia_voice.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_deepgram.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_context_length.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials_credentials.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_model.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_three.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_two.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_zero.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_applied.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_audio.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_audio_input.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_audio_output.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1settings_flags.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1speak_updated.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_prompt.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_endpoint.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia_voice.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_deepgram.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1user_started_speaking.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1warning.py create mode 100644 src/deepgram/agent/v1/requests/agent_v1welcome.py create mode 100644 src/deepgram/agent/v1/types/__init__.py rename src/deepgram/{extensions/types/sockets/speak_v1_text_message.py => agent/v1/types/agent_v1agent_audio_done.py} (59%) create mode 100644 src/deepgram/agent/v1/types/agent_v1agent_started_speaking.py create mode 100644 src/deepgram/agent/v1/types/agent_v1agent_thinking.py create mode 100644 src/deepgram/agent/v1/types/agent_v1conversation_text.py create mode 100644 src/deepgram/agent/v1/types/agent_v1conversation_text_role.py rename src/deepgram/{extensions/types/sockets/agent_v1_error_event.py => agent/v1/types/agent_v1error.py} (50%) create mode 100644 src/deepgram/agent/v1/types/agent_v1function_call_request.py create mode 100644 src/deepgram/agent/v1/types/agent_v1function_call_request_functions_item.py rename src/deepgram/{extensions/types/sockets/listen_v1_speech_started_event.py => agent/v1/types/agent_v1inject_agent_message.py} (53%) create mode 100644 src/deepgram/agent/v1/types/agent_v1inject_user_message.py create mode 100644 src/deepgram/agent/v1/types/agent_v1injection_refused.py rename src/deepgram/{extensions/types/sockets/agent_v1_control_message.py => agent/v1/types/agent_v1keep_alive.py} (60%) rename src/deepgram/{extensions/types/sockets/speak_v1_control_message.py => agent/v1/types/agent_v1prompt_updated.py} (60%) create mode 100644 src/deepgram/agent/v1/types/agent_v1receive_function_call_response.py create mode 100644 src/deepgram/agent/v1/types/agent_v1send_function_call_response.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content_role.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_listen.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id.py rename src/deepgram/{extensions/types/sockets/listen_v1_control_message.py => agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py} (59%) create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_engine.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_model_id.py rename src/deepgram/{extensions/types/sockets/speak_v1_control_event.py => agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_voice.py} (57%) create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs_model_id.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_context_length.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials_type.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_applied.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_audio.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_audio_input.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_audio_input_encoding.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_audio_output.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_audio_output_encoding.py create mode 100644 src/deepgram/agent/v1/types/agent_v1settings_flags.py create mode 100644 src/deepgram/agent/v1/types/agent_v1speak_updated.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_prompt.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_endpoint.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials_type.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_engine.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_model_id.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_voice.py rename src/deepgram/{extensions/types/sockets/listen_v1_utterance_end_event.py => agent/v1/types/agent_v1update_speak_speak_provider_deepgram.py} (55%) create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs_model_id.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_model.py create mode 100644 src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_voice.py create mode 100644 src/deepgram/agent/v1/types/agent_v1user_started_speaking.py create mode 100644 src/deepgram/agent/v1/types/agent_v1warning.py create mode 100644 src/deepgram/agent/v1/types/agent_v1welcome.py delete mode 100644 src/deepgram/client.py create mode 100644 src/deepgram/core/http_sse/__init__.py create mode 100644 src/deepgram/core/http_sse/_api.py create mode 100644 src/deepgram/core/http_sse/_decoders.py create mode 100644 src/deepgram/core/http_sse/_exceptions.py create mode 100644 src/deepgram/core/http_sse/_models.py delete mode 100644 src/deepgram/extensions/__init__.py delete mode 100644 src/deepgram/extensions/core/__init__.py delete mode 100644 src/deepgram/extensions/core/instrumented_http.py delete mode 100644 src/deepgram/extensions/core/instrumented_socket.py delete mode 100644 src/deepgram/extensions/core/telemetry_events.py delete mode 100644 src/deepgram/extensions/telemetry/__init__.py delete mode 100644 src/deepgram/extensions/telemetry/batching_handler.py delete mode 100644 src/deepgram/extensions/telemetry/handler.py delete mode 100644 src/deepgram/extensions/telemetry/models.py delete mode 100644 src/deepgram/extensions/telemetry/proto_encoder.py delete mode 100644 src/deepgram/extensions/types/__init__.py delete mode 100644 src/deepgram/extensions/types/sockets/__init__.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_agent_audio_done_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_agent_started_speaking_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_agent_thinking_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_audio_chunk_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_conversation_text_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_function_call_request_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_function_call_response_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_inject_agent_message_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_inject_user_message_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_injection_refused_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_media_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_prompt_updated_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_settings_applied_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_settings_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_speak_updated_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_update_prompt_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_update_speak_message.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_user_started_speaking_event.py delete mode 100644 src/deepgram/extensions/types/sockets/agent_v1_warning_event.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v1_media_message.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v1_metadata_event.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v1_results_event.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v2_connected_event.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v2_control_message.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v2_fatal_error_event.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v2_media_message.py delete mode 100644 src/deepgram/extensions/types/sockets/listen_v2_turn_info_event.py delete mode 100644 src/deepgram/extensions/types/sockets/socket_client_responses.py delete mode 100644 src/deepgram/extensions/types/sockets/speak_v1_audio_chunk_event.py delete mode 100644 src/deepgram/extensions/types/sockets/speak_v1_metadata_event.py delete mode 100644 src/deepgram/extensions/types/sockets/speak_v1_warning_event.py create mode 100644 src/deepgram/listen/v1/requests/__init__.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1close_stream.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1finalize.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1keep_alive.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1metadata.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results_channel.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item_words_item.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results_metadata.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1results_metadata_model_info.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1speech_started.py create mode 100644 src/deepgram/listen/v1/requests/listen_v1utterance_end.py create mode 100644 src/deepgram/listen/v1/types/__init__.py create mode 100644 src/deepgram/listen/v1/types/listen_v1close_stream.py create mode 100644 src/deepgram/listen/v1/types/listen_v1close_stream_type.py create mode 100644 src/deepgram/listen/v1/types/listen_v1finalize.py create mode 100644 src/deepgram/listen/v1/types/listen_v1finalize_type.py create mode 100644 src/deepgram/listen/v1/types/listen_v1keep_alive.py create mode 100644 src/deepgram/listen/v1/types/listen_v1keep_alive_type.py create mode 100644 src/deepgram/listen/v1/types/listen_v1metadata.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results_channel.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item_words_item.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results_metadata.py create mode 100644 src/deepgram/listen/v1/types/listen_v1results_metadata_model_info.py create mode 100644 src/deepgram/listen/v1/types/listen_v1speech_started.py create mode 100644 src/deepgram/listen/v1/types/listen_v1utterance_end.py create mode 100644 src/deepgram/listen/v2/requests/__init__.py create mode 100644 src/deepgram/listen/v2/requests/listen_v2close_stream.py create mode 100644 src/deepgram/listen/v2/requests/listen_v2connected.py create mode 100644 src/deepgram/listen/v2/requests/listen_v2fatal_error.py create mode 100644 src/deepgram/listen/v2/requests/listen_v2turn_info.py create mode 100644 src/deepgram/listen/v2/requests/listen_v2turn_info_words_item.py create mode 100644 src/deepgram/listen/v2/types/__init__.py create mode 100644 src/deepgram/listen/v2/types/listen_v2close_stream.py create mode 100644 src/deepgram/listen/v2/types/listen_v2close_stream_type.py create mode 100644 src/deepgram/listen/v2/types/listen_v2connected.py create mode 100644 src/deepgram/listen/v2/types/listen_v2fatal_error.py create mode 100644 src/deepgram/listen/v2/types/listen_v2turn_info.py create mode 100644 src/deepgram/listen/v2/types/listen_v2turn_info_event.py create mode 100644 src/deepgram/listen/v2/types/listen_v2turn_info_words_item.py create mode 100644 src/deepgram/speak/v1/requests/__init__.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1clear.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1cleared.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1close.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1flush.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1flushed.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1metadata.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1text.py create mode 100644 src/deepgram/speak/v1/requests/speak_v1warning.py create mode 100644 src/deepgram/speak/v1/types/__init__.py create mode 100644 src/deepgram/speak/v1/types/speak_v1clear.py create mode 100644 src/deepgram/speak/v1/types/speak_v1clear_type.py rename src/deepgram/{extensions/types/sockets/agent_v1_welcome_message.py => speak/v1/types/speak_v1cleared.py} (55%) create mode 100644 src/deepgram/speak/v1/types/speak_v1cleared_type.py create mode 100644 src/deepgram/speak/v1/types/speak_v1close.py create mode 100644 src/deepgram/speak/v1/types/speak_v1close_type.py create mode 100644 src/deepgram/speak/v1/types/speak_v1flush.py create mode 100644 src/deepgram/speak/v1/types/speak_v1flush_type.py create mode 100644 src/deepgram/speak/v1/types/speak_v1flushed.py create mode 100644 src/deepgram/speak/v1/types/speak_v1flushed_type.py create mode 100644 src/deepgram/speak/v1/types/speak_v1metadata.py create mode 100644 src/deepgram/speak/v1/types/speak_v1text.py create mode 100644 src/deepgram/speak/v1/types/speak_v1warning.py delete mode 100644 tests/integrations/__init__.py delete mode 100644 tests/integrations/conftest.py delete mode 100644 tests/integrations/test_advanced_features.py delete mode 100644 tests/integrations/test_agent_client.py delete mode 100644 tests/integrations/test_auth_client.py delete mode 100644 tests/integrations/test_base_client.py delete mode 100644 tests/integrations/test_client.py delete mode 100644 tests/integrations/test_integration_scenarios.py delete mode 100644 tests/integrations/test_listen_client.py delete mode 100644 tests/integrations/test_manage_client.py delete mode 100644 tests/integrations/test_read_client.py delete mode 100644 tests/integrations/test_self_hosted_client.py delete mode 100644 tests/integrations/test_speak_client.py delete mode 100644 tests/unit/__init__.py delete mode 100644 tests/unit/conftest.py delete mode 100644 tests/unit/test_agent_v1_models.py delete mode 100644 tests/unit/test_api_response_models.py delete mode 100644 tests/unit/test_core_file.py delete mode 100644 tests/unit/test_core_jsonable_encoder.py delete mode 100644 tests/unit/test_core_models.py delete mode 100644 tests/unit/test_core_query_encoder.py delete mode 100644 tests/unit/test_core_serialization.py delete mode 100644 tests/unit/test_core_utils.py delete mode 100644 tests/unit/test_http_internals.py delete mode 100644 tests/unit/test_listen_v1_models.py delete mode 100644 tests/unit/test_listen_v2_models.py delete mode 100644 tests/unit/test_manage_billing_fields.py delete mode 100644 tests/unit/test_speak_v1_models.py delete mode 100644 tests/unit/test_telemetry_batching_handler.py delete mode 100644 tests/unit/test_telemetry_handler.py delete mode 100644 tests/unit/test_telemetry_models.py delete mode 100644 tests/unit/test_type_definitions.py delete mode 100644 websockets-reference.md diff --git a/.fern/metadata.json b/.fern/metadata.json new file mode 100644 index 00000000..eeb0a271 --- /dev/null +++ b/.fern/metadata.json @@ -0,0 +1,15 @@ +{ + "cliVersion": "0.112.1", + "generatorName": "fernapi/fern-python-sdk", + "generatorVersion": "4.34.1", + "generatorConfig": { + "client": { + "class_name": "BaseClient", + "filename": "base_client.py", + "exported_class_name": "DeepgramClient", + "exported_filename": "client.py" + }, + "use_typeddict_requests": true, + "should_generate_websocket_clients": true + } +} \ No newline at end of file diff --git a/.github/.commitlintrc.json b/.github/.commitlintrc.json deleted file mode 100644 index 65411760..00000000 --- a/.github/.commitlintrc.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "extends": [ - "@commitlint/config-conventional" - ], - "rules": { - "type-enum": [ - 2, - "always", - [ - "feat", - "fix", - "docs", - "style", - "refactor", - "perf", - "test", - "build", - "ci", - "chore", - "revert" - ] - ], - "type-case": [ - 2, - "always", - "lower-case" - ], - "type-empty": [ - 2, - "never" - ], - "scope-case": [ - 2, - "always", - "lower-case" - ], - "subject-empty": [ - 2, - "never" - ], - "subject-full-stop": [ - 2, - "never", - "." - ], - "header-max-length": [ - 2, - "always", - 100 - ] - } -} \ No newline at end of file diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json deleted file mode 100644 index 41010749..00000000 --- a/.github/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "5.3.0" -} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 67b5e5f4..00000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,6 +0,0 @@ -# Global code owners - these users will be requested for review on all API SPEC PRs -# DX TEAM Members -* @lukeocodes - -# Future Reference: you can also specify owners for specific paths if needed: -# /src/ @username1 @username2 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index b9c29ebe..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,219 +0,0 @@ -name: "πŸ› Bug report" -description: Report something that is broken or crashes -title: "[Bug]: " -labels: ["bug", "needs-triage"] -assignees: [] -body: - - type: markdown - attributes: - value: | - Thanks for filing a bug. Please give a **minimal** repro when you can. - - type: input - id: summary - attributes: - label: Summary - description: Short one-liner of the problem - placeholder: "Crash when calling client.listen.v2 from a thread" - validations: - required: true - - - type: textarea - id: what_happened - attributes: - label: What happened? - description: Tell us what you saw and what you expected instead - placeholder: | - Actual: - - … - - Expected: - - … - validations: - required: true - - - type: textarea - id: repro_steps - attributes: - label: Steps to reproduce - description: Numbered steps; include inputs that matter (model, options, etc.) - placeholder: | - 1. Install deepgram-sdk==5.0.0 - 2. Run the code below - 3. Observe error XYZ - validations: - required: true - - - type: textarea - id: code - attributes: - label: Minimal code sample - description: Small, runnable example (trim secrets). Attach a gist/repo if easier. - render: python - placeholder: | - from deepgram import Deepgram - # minimal snippet here - validations: - required: true - - - type: textarea - id: logs - attributes: - label: Logs / traceback - description: Full stack trace or error message (best with DEBUG logs) - render: text - placeholder: | - Traceback (most recent call last): - ... - validations: - required: false - - - type: dropdown - id: transport - attributes: - label: Transport - options: - - HTTP - - WebSocket - - Both / Not sure - validations: - required: true - - - type: input - id: endpoint - attributes: - label: API endpoint / path - placeholder: "/v1/listen/… or /v1/speak/…" - validations: - required: true - - - type: input - id: model - attributes: - label: Model(s) used - placeholder: "nova-2, aura-asteria-en, etc." - validations: - required: false - - - type: dropdown - id: repro_rate - attributes: - label: How often? - options: - - Always - - Often - - Sometimes - - Rarely - - Only once - validations: - required: true - - - type: checkboxes - id: regression - attributes: - label: Is this a regression? - options: - - label: "Yes, it worked in an earlier version" - required: false - - - type: input - id: worked_version - attributes: - label: Last working SDK version (if known) - placeholder: "4.8.1" - validations: - required: false - - - type: input - id: sdk_version - attributes: - label: SDK version - placeholder: "5.0.0" - validations: - required: true - - - type: input - id: python_version - attributes: - label: Python version - placeholder: "3.10.14" - validations: - required: true - - - type: dropdown - id: install_method - attributes: - label: Install method - options: - - pip - - pipx - - Poetry - - uv - - Conda - - From source - validations: - required: false - - - type: dropdown - id: os - attributes: - label: OS - multiple: true - options: - - macOS (Intel) - - macOS (Apple Silicon) - - Linux (x86_64) - - Linux (arm64) - - Windows - - Other - validations: - required: true - - - type: textarea - id: extra_env - attributes: - label: Environment details - description: Anything else? Docker, Fly.io, proxies, corporate network, etc. - render: text - validations: - required: false - - - type: input - id: repro_repo - attributes: - label: Link to minimal repro (optional) - placeholder: "https://github.com/yourname/repro" - validations: - required: false - - - type: input - id: session_id - attributes: - label: Session ID (optional) - placeholder: "123e4567-e89b-12d3-a456-426614174000" - validations: - required: false - - - type: input - id: project_id - attributes: - label: Project ID (optional) - placeholder: "proj_abc123" - validations: - required: false - - - type: input - id: request_id - attributes: - label: Request ID (optional) - description: From API error messages or response headers (`x-dg-request-id`) - placeholder: "req_def456" - validations: - required: false - - - type: checkboxes - id: conduct - attributes: - label: Code of Conduct - options: - - label: I agree to follow this project’s Code of Conduct - required: true diff --git a/.github/ISSUE_TEMPLATE/docs_improvement.yml b/.github/ISSUE_TEMPLATE/docs_improvement.yml deleted file mode 100644 index 9a9125b3..00000000 --- a/.github/ISSUE_TEMPLATE/docs_improvement.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: "πŸ“š Docs improvement" -description: Fix or improve documentation, examples, or comments -title: "[Docs]: " -labels: ["documentation", "needs-triage"] -body: - - type: input - id: page - attributes: - label: Affected page or section - placeholder: "https://docs.example.com/python/…" - validations: - required: true - - - type: textarea - id: issue - attributes: - label: What is unclear or wrong? - placeholder: "Option X is outdated; code sample fails with 5.0.0" - validations: - required: true - - - type: textarea - id: suggestion - attributes: - label: Suggested change - render: markdown - placeholder: "Replace snippet with… Add note about Python 3.12…" - validations: - required: false - - - type: textarea - id: example - attributes: - label: Example code (if any) - render: python - placeholder: "# short snippet" - validations: - required: false - - - type: checkboxes - id: parity - attributes: - label: SDK parity (if relevant) - options: - - label: This change may need updates in other SDKs - required: false - - - type: input - id: session_id - attributes: - label: Session ID (optional) - placeholder: "123e4567-e89b-12d3-a456-426614174000" - validations: - required: false - - - type: input - id: project_id - attributes: - label: Project ID (optional) - placeholder: "proj_abc123" - validations: - required: false - - - type: input - id: request_id - attributes: - label: Request ID (optional) - description: From API error messages or response headers (`dg-request-id`) - placeholder: "req_def456" - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index cc3dd43b..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: "✨ Feature request" -description: Suggest a new capability or API -title: "[Feature]: " -labels: ["enhancement", "needs-triage"] -body: - - type: input - id: summary - attributes: - label: Summary - placeholder: "Add async streaming helper for /v1/listen" - validations: - required: true - - - type: textarea - id: problem - attributes: - label: Problem to solve - description: What user problem does this address? - placeholder: "Today I need to write a lot of boilerplate to stream audio…" - validations: - required: true - - - type: textarea - id: proposal - attributes: - label: Proposed solution - description: API shape, flags, defaults. Keep it simple. - render: python - placeholder: | - # Example - async with client.listen.stream(model="nova-2") as s: - await s.send_file("file.wav") - async for msg in s: - ... - validations: - required: true - - - type: textarea - id: alternatives - attributes: - label: Alternatives considered - placeholder: "Manual websockets; third-party lib; do nothing" - validations: - required: false - - - type: dropdown - id: scope - attributes: - label: Scope - options: - - Python only - - All SDKs (parity) - - Docs/sample only - validations: - required: true - - - type: dropdown - id: priority - attributes: - label: Priority - options: - - Nice to have - - Important - - High impact - - Blocker - validations: - required: false - - - type: textarea - id: context - attributes: - label: Extra context / links - placeholder: "Related issues, forum threads, benchmarks, etc." - validations: - required: false - - - type: input - id: session_id - attributes: - label: Session ID (optional) - placeholder: "123e4567-e89b-12d3-a456-426614174000" - validations: - required: false - - - type: input - id: project_id - attributes: - label: Project ID (optional) - placeholder: "proj_abc123" - validations: - required: false - - - type: input - id: request_id - attributes: - label: Request ID (optional) - description: From API error messages or response headers (`dg-request-id`) - placeholder: "req_def456" - validations: - required: false diff --git a/.github/release-please-config.json b/.github/release-please-config.json deleted file mode 100644 index 72e5b2ed..00000000 --- a/.github/release-please-config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "packages": { - ".": { - "release-type": "python", - "package-name": "deepgram-sdk", - "tag-separator": "", - "include-component-in-tag": false, - "include-v-in-tag": true, - "changelog-path": "CHANGELOG.md", - "bump-minor-pre-major": false, - "bump-patch-for-minor-pre-major": false, - "draft": false, - "extra-files": [ - { - "type": "toml", - "path": "pyproject.toml", - "jsonpath": "$.tool.poetry.version" - }, - { - "type": "generic", - "path": "src/deepgram/core/client_wrapper.py" - } - ] - } - }, - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" -} \ No newline at end of file diff --git a/.github/workflows/changelog-log.yml b/.github/workflows/changelog-log.yml deleted file mode 100644 index 61267df1..00000000 --- a/.github/workflows/changelog-log.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Changelog Log - -on: - push: - branches: [main] - paths: - - "**/CHANGELOG*.md" - - "**/changelog*.md" - -jobs: - notify: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Send changelog to webhook - uses: lukeocodes/changelog-log@changelog-log-v0.1.7 - with: - webhook_url: ${{ secrets.CHANGELOG_WEBHOOK_URL }} - webhook_headers_json: '{"Content-Type":"application/json","X-DX-Logs-Key":"${{ secrets.CHANGELOG_SECRET }}"}' - extra_body_json: '{"route":"changelog-python"}' - # Project context is automatically inferred from GitHub context - # You can override with: - # project_name: "my-custom-project-name" - # project_owner: "my-org" - # repository_url: "https://github.com/owner/repo" - # include_github_context: "true" # includes ref, workflow, actor info - # - # Other optional overrides: - # file_globs: "CHANGELOG.md,**/CHANGELOG*.md" - # entry_separator_regex: "^##\\s+.*$" - # http_method: "POST" - # include_body_raw: "false" - # log_level: "warn" # trace, debug, info, warn, error, fatal - # extra_body_json: '{"custom":"field"}' # merge custom fields into payload diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d160cad7..04557083 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,40 +1,28 @@ -name: CI - +name: ci on: [push] - jobs: - compile: runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout repo uses: actions/checkout@v4 - name: Set up python - uses: actions/setup-python@v6 + uses: actions/setup-python@v4 with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry run: | curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - name: Install dependencies run: poetry install - name: Compile - run: poetry run mypy src/ + run: poetry run mypy . test: runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - needs: compile steps: - name: Checkout repo uses: actions/checkout@v4 - name: Set up python - uses: actions/setup-python@v6 + uses: actions/setup-python@v4 with: - python-version: ${{ matrix.python-version }} + python-version: 3.8 - name: Bootstrap poetry run: | curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 @@ -43,3 +31,27 @@ jobs: - name: Test run: poetry run pytest -rP . + + publish: + needs: [compile, test] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Set up python + uses: actions/setup-python@v4 + with: + python-version: 3.8 + - name: Bootstrap poetry + run: | + curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 + - name: Install dependencies + run: poetry install + - name: Publish to pypi + run: | + poetry config repositories.remote https://upload.pypi.org/legacy/ + poetry --no-interaction -v publish --build --repository remote --username "$PYPI_USERNAME" --password "$PYPI_PASSWORD" + env: + PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} + PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/pr-title-check.yml b/.github/workflows/pr-title-check.yml deleted file mode 100644 index 65163b77..00000000 --- a/.github/workflows/pr-title-check.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Title Check - -on: - pull_request: - types: - - opened - - edited - - synchronize - - reopened - -jobs: - title-check: - name: Title Check - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "20" - - - name: Install commitlint - run: | - npm install --save-dev @commitlint/config-conventional @commitlint/cli - - - name: Validate PR title - env: - PR_TITLE: ${{ github.event.pull_request.title }} - run: | - echo "$PR_TITLE" | npx commitlint -g .github/.commitlintrc.json diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index 45521a8b..00000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: Release Please - -on: - push: - branches: - - main # stable releases - -permissions: - contents: write - issues: write - pull-requests: write - -jobs: - compile: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - name: Compile - run: poetry run mypy src/ - test: - runs-on: ubuntu-latest - needs: compile - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - name: Test - run: poetry run pytest -rP . - release-please: - runs-on: ubuntu-latest - needs: test - outputs: - release_created: ${{ steps.release.outputs.release_created }} - steps: - - uses: googleapis/release-please-action@v4 - id: release - with: - config-file: .github/release-please-config.json - manifest-file: .github/.release-please-manifest.json - target-branch: ${{ github.ref_name }} - publish: - runs-on: ubuntu-latest - needs: release-please - if: ${{ needs.release-please.outputs.release_created }} - strategy: - matrix: - python-version: ["3.8"] - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - name: Build package - run: poetry build - - name: Publish to PyPI - env: - POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} - run: poetry publish diff --git a/.github/workflows/tests-daily.yml b/.github/workflows/tests-daily.yml deleted file mode 100644 index a6acee9b..00000000 --- a/.github/workflows/tests-daily.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Daily Tests - -on: - workflow_dispatch: - schedule: - - cron: "0 9 * * *" - -jobs: - compile: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - name: Compile - run: poetry run mypy src/ - test: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - needs: compile - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - - name: Test - run: poetry run pytest -rP . diff --git a/.gitignore b/.gitignore index 96eb8bdb..d2e4ca80 100644 --- a/.gitignore +++ b/.gitignore @@ -3,17 +3,3 @@ __pycache__/ dist/ poetry.toml -.env -.pytest_cache/ - -# ignore example output files -examples/**/output.* - -# ignore venv -venv/ -.DS_Store - -# ignore build artifacts and dependencies -Pipfile -Pipfile.lock -deepgram_sdk.egg-info/ diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 9c135f4b..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,47 +0,0 @@ -# Changelog - -## [5.3.0](https://github.com/deepgram/deepgram-python-sdk/compare/v5.2.0...v5.3.0) (2025-10-30) - - -### Features - -* add projects billing fields list methods ([#621](https://github.com/deepgram/deepgram-python-sdk/issues/621)) ([10d67cd](https://github.com/deepgram/deepgram-python-sdk/commit/10d67cd91aef1436a9e85e3b607dc7b81eebba43)) - -## [5.2.0](https://github.com/deepgram/deepgram-python-sdk/compare/v5.1.0...v5.2.0) (2025-10-21) - - -### Features - -* SDK regeneration (21 Oct 2025) ([#609](https://github.com/deepgram/deepgram-python-sdk/issues/609)) ([5b21460](https://github.com/deepgram/deepgram-python-sdk/commit/5b2146058842fe4dc6d6ef4bd9c0777b08f48fab)) - -## [5.1.0](https://github.com/deepgram/deepgram-python-sdk/compare/v5.0.0...v5.1.0) (2025-10-16) - - -### Features - -* mention keep alive in migration guide ([#594](https://github.com/deepgram/deepgram-python-sdk/issues/594)) ([5a8c79e](https://github.com/deepgram/deepgram-python-sdk/commit/5a8c79e814e3efeb81a8c51a0a05d93bc17e6bb5)) -* update the SDK with upstream spec changes ([d77ad96](https://github.com/deepgram/deepgram-python-sdk/commit/d77ad966db62e068fb6e346d247299bc9efd1bd5)) - - -### Bug Fixes - -* **ci:** reference the correct secret ([#585](https://github.com/deepgram/deepgram-python-sdk/issues/585)) ([09550c7](https://github.com/deepgram/deepgram-python-sdk/commit/09550c7c43b6778d52030bd70a48905c425d1365)) -* corrects order to the release workflow ([#583](https://github.com/deepgram/deepgram-python-sdk/issues/583)) ([3abbac3](https://github.com/deepgram/deepgram-python-sdk/commit/3abbac3271e77e718dde19580a16cdf915c263df)) -* remove testpypi we don't need it in the workflow ([#582](https://github.com/deepgram/deepgram-python-sdk/issues/582)) ([b2e2538](https://github.com/deepgram/deepgram-python-sdk/commit/b2e2538cb9528f48e9a20a839763ff82fe40ab8b)) -* support multiple keyterms for v2 listen client ([#595](https://github.com/deepgram/deepgram-python-sdk/issues/595)) ([7a9d41d](https://github.com/deepgram/deepgram-python-sdk/commit/7a9d41d2b5a48dd094ca20e7f5a227afbdd46dc0)) - -## [5.0.0](https://github.com/deepgram/deepgram-python-sdk/compare/v4.8.1...v5.0.0) (2025-10-02) - - -### ⚠ BREAKING CHANGES - -* This is a significant breaking change, and should be carried out in conjunction with our migration guide. - -### Features - -* implements new generated SDK architecture, all call signatures ([#572](https://github.com/deepgram/deepgram-python-sdk/issues/572)) ([768d514](https://github.com/deepgram/deepgram-python-sdk/commit/768d51492bf7414067266cdc2cf7b98f1f3981dc)) - - -### Bug Fixes - -* release-please config fixes ([#579](https://github.com/deepgram/deepgram-python-sdk/issues/579)) ([a603806](https://github.com/deepgram/deepgram-python-sdk/commit/a6038067596f1643cd5c7255f0e5a7ede1ff43fb)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a16a1b18..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,65 +0,0 @@ -# Contributing - -Contributions are welcome. This is a generated library, and changes to core files should be promoted to our generator code. - -Requires Python 3.8+ - -## Fork Repository - -Fork this repo on GitHub. - -## Clone Repository - -```bash -git clone https://github.com/YOUR_USERNAME/deepgram-python-sdk.git -cd deepgram-python-sdk -``` - -## Install Poetry - -```bash -curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 -``` - -Ensure Poetry is in your `$PATH`. - -## Install Dependencies - -```bash -poetry install -``` - -## Run Tests - -```bash -poetry run pytest -rP . -``` - -## Install Example Dependencies - -```bash -poetry run pip install -r examples/requirements.txt -``` - -## Run Example - -```bash -poetry run python -u examples/listen/media/transcribe_url/main.py -``` - -## Commit Changes - -```bash -git add . -git commit -m "feat: your change description" -``` - -## Push to Fork - -```bash -git push origin main -``` - -## Create Pull Request - -Open a pull request from your fork to the main repository. diff --git a/README.md b/README.md index 35196939..570243d0 100644 --- a/README.md +++ b/README.md @@ -1,179 +1,59 @@ -# Deepgram Python SDK - -![Built with Fern](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen) -[![PyPI version](https://img.shields.io/pypi/v/deepgram-sdk)](https://pypi.python.org/pypi/deepgram-sdk) -[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/) -[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE) - -The official Python SDK for Deepgram's automated speech recognition, text-to-speech, and language understanding APIs. Power your applications with world-class speech and Language AI models. +# Deepgram API Python Library + +![](https://developers.deepgram.com) + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=https%3A%2F%2Fgithub.com%2Fdeepgram%2Fdeepgram-python-sdk) +[![pypi](https://img.shields.io/pypi/v/deepgram-sdk)](https://pypi.python.org/pypi/deepgram-sdk) + +Power your apps with world-class speech and Language AI models + +## Table of Contents + +- [Documentation](#documentation) +- [Installation](#installation) +- [Reference](#reference) +- [Usage](#usage) +- [Authentication](#authentication) +- [Async Client](#async-client) +- [Exception Handling](#exception-handling) +- [Advanced Features](#advanced-features) +- [Websockets](#websockets) +- [Advanced](#advanced) + - [Access Raw Response Data](#access-raw-response-data) + - [Retries](#retries) + - [Timeouts](#timeouts) + - [Custom Client](#custom-client) +- [Contributing](#contributing) +- [Community Code of Conduct](#community-code-of-conduct) +- [License](#license) ## Documentation -Comprehensive API documentation and guides are available at [developers.deepgram.com](https://developers.deepgram.com). - -### Migrating From Earlier Versions - -- [v2 to v3+](./docs/Migrating-v2-to-v3.md) -- [v3+ to v5](./docs/Migrating-v3-to-v5.md) (current) +API reference documentation is available [here](https://developers.deepgram.com/reference/deepgram-api-overview). ## Installation -Install the Deepgram Python SDK using pip: - -```bash +```sh pip install deepgram-sdk ``` ## Reference -- **[API Reference](./reference.md)** - Complete reference for all SDK methods and parameters -- **[WebSocket Reference](./websockets-reference.md)** - Detailed documentation for real-time WebSocket connections +A full reference for this library is available [here](https://github.com/deepgram/deepgram-python-sdk/blob/HEAD/./reference.md). ## Usage -### Quick Start - -The Deepgram SDK provides both synchronous and asynchronous clients for all major use cases: - -#### Real-time Speech Recognition (Listen v2) - -Our newest and most advanced speech recognition model with contextual turn detection ([WebSocket Reference](./websockets-reference.md#listen-v2-connect)): - -```python -from deepgram import DeepgramClient -from deepgram.core.events import EventType - -client = DeepgramClient() - -with client.listen.v2.connect( - model="flux-general-en", - encoding="linear16", - sample_rate="16000" -) as connection: - def on_message(message): - print(f"Received {message.type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Error: {error}")) - - # Start listening and send audio data - connection.start_listening() -``` - -#### File Transcription - -Transcribe pre-recorded audio files ([API Reference](./reference.md#listen-v1-media-transcribe-file)): - -```python -from deepgram import DeepgramClient - -client = DeepgramClient() - -with open("audio.wav", "rb") as audio_file: - response = client.listen.v1.media.transcribe_file( - request=audio_file.read(), - model="nova-3" - ) - print(response.results.channels[0].alternatives[0].transcript) -``` - -#### Text-to-Speech - -Generate natural-sounding speech from text ([API Reference](./reference.md#speak-v1-audio-generate)): - -```python -from deepgram import DeepgramClient - -client = DeepgramClient() - -response = client.speak.v1.audio.generate( - text="Hello, this is a sample text to speech conversion." -) - -# Save the audio file -with open("output.mp3", "wb") as audio_file: - audio_file.write(response.stream.getvalue()) -``` - -#### Text Analysis - -Analyze text for sentiment, topics, and intents ([API Reference](./reference.md#read-v1-text-analyze)): +Instantiate and use the client with the following: ```python from deepgram import DeepgramClient -client = DeepgramClient() - -response = client.read.v1.text.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True -) -``` - -#### Voice Agent (Conversational AI) - -Build interactive voice agents ([WebSocket Reference](./websockets-reference.md#agent-v1-connect)): - -```python -from deepgram import DeepgramClient -from deepgram.extensions.types.sockets import ( - AgentV1SettingsMessage, AgentV1Agent, AgentV1AudioConfig, - AgentV1AudioInput, AgentV1Listen, AgentV1ListenProvider, - AgentV1Think, AgentV1OpenAiThinkProvider, AgentV1SpeakProviderConfig, - AgentV1DeepgramSpeakProvider +client = DeepgramClient( + api_key="YOUR_API_KEY", ) - -client = DeepgramClient() - -with client.agent.v1.connect() as agent: - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput(encoding="linear16", sample_rate=44100) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider(type="deepgram", model="nova-3") - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", model="gpt-4o-mini" - ) - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", model="aura-2-asteria-en" - ) - ) - ) - ) - - agent.send_settings(settings) - agent.start_listening() +client.listen.v1.media.transcribe_file() ``` -### Complete SDK Reference - -For comprehensive documentation of all available methods, parameters, and options: - -- **[API Reference](./reference.md)** - Complete reference for REST API methods including: - - - Listen (Speech-to-Text): File transcription, URL transcription, and media processing - - Speak (Text-to-Speech): Audio generation and voice synthesis - - Read (Text Intelligence): Text analysis, sentiment, summarization, and topic detection - - Manage: Project management, API keys, and usage analytics - - Auth: Token generation and authentication management - -- **[WebSocket Reference](./websockets-reference.md)** - Detailed documentation for real-time connections: - - Listen v1/v2: Real-time speech recognition with different model capabilities - - Speak v1: Real-time text-to-speech streaming - - Agent v1: Conversational voice agents with integrated STT, LLM, and TTS - ## Authentication The Deepgram SDK supports two authentication methods: @@ -222,58 +102,38 @@ The SDK automatically discovers credentials from these environment variables: ## Async Client -The SDK provides full async/await support for non-blocking operations: +The SDK also exports an `async` client so that you can make non-blocking calls to our API. Note that if you are constructing an Async httpx client class to pass into this client, use `httpx.AsyncClient()` instead of `httpx.Client()` (e.g. for the `httpx_client` parameter of this client). ```python import asyncio + from deepgram import AsyncDeepgramClient -async def main(): - client = AsyncDeepgramClient() +client = AsyncDeepgramClient( + api_key="YOUR_API_KEY", +) - # Async file transcription - with open("audio.wav", "rb") as audio_file: - response = await client.listen.v1.media.transcribe_file( - request=audio_file.read(), - model="nova-3" - ) - # Async WebSocket connection - async with client.listen.v2.connect( - model="flux-general-en", - encoding="linear16", - sample_rate="16000" - ) as connection: - async def on_message(message): - print(f"Received {message.type} event") +async def main() -> None: + await client.listen.v1.media.transcribe_file() - connection.on(EventType.MESSAGE, on_message) - await connection.start_listening() asyncio.run(main()) ``` ## Exception Handling -The SDK provides detailed error information for debugging and error handling: +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. ```python -from deepgram import DeepgramClient from deepgram.core.api_error import ApiError -client = DeepgramClient() - try: - response = client.listen.v1.media.transcribe_file( - request=audio_data, - model="nova-3" - ) + client.listen.v1.media.transcribe_file(...) except ApiError as e: - print(f"Status Code: {e.status_code}") - print(f"Error Details: {e.body}") - print(f"Request ID: {e.headers.get('x-dg-request-id', 'N/A')}") -except Exception as e: - print(f"Unexpected error: {e}") + print(e.status_code) + print(e.body) ``` ## Advanced Features @@ -346,50 +206,147 @@ response = client.listen.v1.media.transcribe_file( ) ``` -## Contributing +## Websockets + +The SDK supports both sync and async websocket connections for real-time, low-latency communication. Sockets can be created using the `connect` method, which returns a context manager. +You can either iterate through the returned `SocketClient` to process messages as they arrive, or attach handlers to respond to specific events. + +```python + +# Connect to the websocket (Sync) +import threading + +from deepgram import DeepgramClient + +client = DeepgramClient(...) + +with client.v1.connect() as socket: + # Iterate over the messages as they arrive + for message in socket + print(message) + + # Or, attach handlers to specific events + socket.on(EventType.OPEN, lambda _: print("open")) + socket.on(EventType.MESSAGE, lambda message: print("received message", message)) + socket.on(EventType.CLOSE, lambda _: print("close")) + socket.on(EventType.ERROR, lambda error: print("error", error)) + -We welcome contributions to improve this SDK! However, please note that this library is primarily generated from our API specifications. + # Start the listening loop in a background thread + listener_thread = threading.Thread(target=socket.start_listening, daemon=True) + listener_thread.start() +``` -### Development Setup +```python -1. **Install Poetry** (if not already installed): +# Connect to the websocket (Async) +import asyncio - ```bash - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - ``` +from deepgram import AsyncDeepgramClient -2. **Install dependencies**: +client = AsyncDeepgramClient(...) - ```bash - poetry install - ``` +async with client.v1.connect() as socket: + # Iterate over the messages as they arrive + async for message in socket + print(message) -3. **Install example dependencies**: + # Or, attach handlers to specific events + socket.on(EventType.OPEN, lambda _: print("open")) + socket.on(EventType.MESSAGE, lambda message: print("received message", message)) + socket.on(EventType.CLOSE, lambda _: print("close")) + socket.on(EventType.ERROR, lambda error: print("error", error)) - ```bash - poetry run pip install -r examples/requirements.txt - ``` -4. **Run tests**: + # Start listening for events in an asyncio task + listen_task = asyncio.create_task(socket.start_listening()) +``` - ```bash - poetry run pytest -rP . - ``` +## Advanced -5. **Run examples**: - ```bash - python -u examples/listen/v2/connect/main.py - ``` +### Access Raw Response Data -### Contribution Guidelines +The SDK provides access to raw response data, including headers, through the `.with_raw_response` property. +The `.with_raw_response` property returns a "raw" client that can be used to access the `.headers` and `.data` attributes. -See our [CONTRIBUTING](./CONTRIBUTING.md) guide. +```python +from deepgram import DeepgramClient -### Requirements +client = DeepgramClient( + ..., +) +response = client.listen.v1.media.with_raw_response.transcribe_file(...) +print(response.headers) # access the response headers +print(response.data) # access the underlying object +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). -- Python 3.8+ -- See `pyproject.toml` for full dependency list +A request is deemed retryable when any of the following HTTP status codes is returned: +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `max_retries` request option to configure this behavior. + +```python +client.listen.v1.media.transcribe_file(..., request_options={ + "max_retries": 1 +}) +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level. + +```python + +from deepgram import DeepgramClient + +client = DeepgramClient( + ..., + timeout=20.0, +) + + +# Override timeout for a specific method +client.listen.v1.media.transcribe_file(..., request_options={ + "timeout_in_seconds": 1 +}) +``` + +### Custom Client + +You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies +and transports. + +```python +import httpx +from deepgram import DeepgramClient + +client = DeepgramClient( + ..., + httpx_client=httpx.Client( + proxy="http://my.test.proxy.example.com", + transport=httpx.HTTPTransport(local_address="0.0.0.0"), + ), +) +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! ## Community Code of Conduct Please see our community [code of conduct](https://developers.deepgram.com/code-of-conduct) before contributing to this project. @@ -397,3 +354,4 @@ Please see our community [code of conduct](https://developers.deepgram.com/code- ## License This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details. + diff --git a/docs/Migrating-v2-to-v3.md b/docs/Migrating-v2-to-v3.md deleted file mode 100644 index 1ed9e4d7..00000000 --- a/docs/Migrating-v2-to-v3.md +++ /dev/null @@ -1,529 +0,0 @@ -# v2 to v3+ Migration Guide - -This guide helps you migrate from Deepgram Python SDK v2 to v3+ (versions 3.0.0 and above). The v3+ release introduces significant improvements including better structure, sync/async support, improved error handling, and support for future products. - -## Table of Contents - -- [Installation](#installation) -- [Configuration Changes](#configuration-changes) -- [API Method Changes](#api-method-changes) - - [Listen V1](#listen-v1) - - [Manage V1](#manage-v1) -- [Breaking Changes Summary](#breaking-changes-summary) - -## Installation - -The package name remains the same: - -```bash -pip install deepgram-sdk -``` - -To upgrade from v2 to v3+: - -```bash -pip install --upgrade deepgram-sdk -``` - -## Configuration Changes - -### v2 Client Initialization - -```python -from deepgram import Deepgram - -# Your Deepgram API Key -DEEPGRAM_API_KEY = 'YOUR_DEEPGRAM_API_KEY' - -# Initialize the Deepgram SDK -deepgram = Deepgram(DEEPGRAM_API_KEY) -``` - -### v3+ Client Initialization - -```python -from deepgram import DeepgramClient - -# Create a Deepgram client using the DEEPGRAM_API_KEY from environment variables -deepgram = DeepgramClient() - -# Or with explicit API key -deepgram = DeepgramClient(api_key="YOUR_API_KEY") -``` - -## API Method Changes - -### Listen V1 - -#### Transcribe File - -**v2** - -```python -FILE = 'interview_speech-analytics.wav' - -# Open the audio file -audio = open(FILE, 'rb') - -# Set the source -source = { - 'buffer': audio, -} - -# Send the audio to Deepgram and get the response -response = await asyncio.create_task( - deepgram.transcription.prerecorded( - source, - { - 'smart_format': "true", - 'summarize': "v2", - } - ) -) - -# Write the response to the console -print(json.dumps(response, indent=4)) -``` - -**v3+** - -```python -from deepgram import PrerecordedOptions, FileSource - -AUDIO_FILE = "preamble.wav" - -# Call the transcribe_file method on the prerecorded class -with open(AUDIO_FILE, "rb") as file: - buffer_data = file.read() - -payload: FileSource = { - "buffer": buffer_data, -} - -options = PrerecordedOptions( - smart_format=True, - summarize="v2", -) -file_response = deepgram.listen.rest.v("1").transcribe_file(payload, options) - -json = file_response.to_json() -print(f"{json}") -``` - -#### Transcribe URL - -**v2** - -```python -URL = 'https://static.deepgram.com/examples/interview_speech-analytics.wav' - -# Set the source -source = { - 'url': URL, -} - -# Send the audio to Deepgram and get the response -response = await asyncio.create_task( - deepgram.transcription.prerecorded( - source, - { - 'smart_format': "true", - 'summarize': "v2", - } - ) -) - -# Write the response to the console -print(json.dumps(response, indent=4)) -``` - -**v3+** - -```python -from deepgram import PrerecordedOptions, UrlSource - -AUDIO_URL = { - "url": "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav" -} - -options = PrerecordedOptions( - smart_format=True, - summarize="v2", -) -url_response = deepgram.listen.rest.v("1").transcribe_url(AUDIO_URL, options) - -json = url_response.to_json() -print(f"{json}") -``` - -#### WebSocket Streaming (Listen V1) - -**v2** - -```python -try: - deepgramLive = await deepgram.transcription.live({ - 'smart_format': True, - 'interim_results': False, - 'language': 'en-US', - 'model': 'nova-3', - }) -except Exception as e: - print(f'Could not open socket: {e}') - return - -# Listen for the connection to close -deepgramLive.registerHandler(deepgramLive.event.CLOSE, lambda c: print( - f'Connection closed with code {c}.')) - -# Listen for any transcripts received from Deepgram and write them to the console -deepgramLive.registerHandler(deepgramLive.event.TRANSCRIPT_RECEIVED, print) - -# Listen for the connection to open and send streaming audio from the URL to Deepgram -async with aiohttp.ClientSession() as session: - async with session.get(URL) as audio: - while True: - data = await audio.content.readany() - deepgramLive.send(data) - - # If no data is being sent from the live stream, then break out of the loop. - if not data: - break - -# Indicate that we've finished sending data -await deepgramLive.finish() -``` - -**v3+** - -```python -import threading -import httpx -from deepgram import DeepgramClient, LiveOptions, LiveTranscriptionEvents - -try: - deepgram: DeepgramClient = DeepgramClient() - - dg_connection = deepgram.listen.websocket.v("1") - - # define callbacks for transcription messages - def on_message(self, result, **kwargs): - sentence = result.channel.alternatives[0].transcript - if len(sentence) == 0: - return - print(f"speaker: {sentence}") - - dg_connection.on(LiveTranscriptionEvents.Transcript, on_message) - - # connect to websocket - options = LiveOptions(model="nova-3", interim_results=False, language="en-US") - dg_connection.start(options) - - lock_exit = threading.Lock() - exit = False - - # define a worker thread - def myThread(): - with httpx.stream("GET", URL) as r: - for data in r.iter_bytes(): - lock_exit.acquire() - if exit: - break - lock_exit.release() - - dg_connection.send(data) - - # start the worker thread - myHttp = threading.Thread(target=myThread) - myHttp.start() - - # signal finished - input("Press Enter to stop recording...\n\n") - lock_exit.acquire() - exit = True - lock_exit.release() - - # Wait for the HTTP thread to close and join - myHttp.join() - - # Indicate that we've finished - dg_connection.finish() - -except Exception as e: - print(f"Could not open socket: {e}") - return -``` - -### Manage V1 - -#### Projects - -**v2** - -```python -# Get projects -result = await deepgram.projects.list() - -# Get project -result = await deepgram.projects.get("550e8400-e29b-41d4-a716-446655440000") - -# Update project -result = await deepgram.projects.update(object) - -# Delete project -result = await deepgram.projects.delete("550e8400-e29b-41d4-a716-446655440000") -``` - -**v3+** - -```python -# Get projects -result = deepgram.manage.v("1").get_projects() - -# Get project -result = deepgram.manage.v("1").get_project("550e8400-e29b-41d4-a716-446655440000") - -# Update project -result = deepgram.manage.v("1").update_project("550e8400-e29b-41d4-a716-446655440000", name="My TEST RENAME Example") - -# Delete project -result = deepgram.manage.v("1").delete_project("550e8400-e29b-41d4-a716-446655440000") -``` - -#### Keys - -**v2** - -```python -# List keys -result = await deepgram.keys.list("550e8400-e29b-41d4-a716-446655440000") - -# Get key -result = await deepgram.keys.get("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") - -# Create key -result = await deepgram.keys.create("550e8400-e29b-41d4-a716-446655440000", "MyTestKey", ["member"]) - -# Delete key -result = await deepgram.keys.delete("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") -``` - -**v3+** - -```python -from deepgram import KeyOptions - -# List keys -result = deepgram.manage.v("1").get_keys("550e8400-e29b-41d4-a716-446655440000") - -# Get key -result = deepgram.manage.v("1").get_key("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") - -# Create key -options = KeyOptions( - comment="MyTestKey", - scopes=["member"], -) -result = deepgram.manage.v("1").create_key("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete key -result = deepgram.manage.v("1").delete_key("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") -``` - -#### Members - -**v2** - -```python -# Get members -result = await deepgram.members.list_members("550e8400-e29b-41d4-a716-446655440000") - -# Remove member -result = await deepgram.members.remove_member("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") -``` - -**v3+** - -```python -# Get members -result = deepgram.manage.v("1").get_members("550e8400-e29b-41d4-a716-446655440000") - -# Remove member -result = deepgram.manage.v("1").remove_member("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") -``` - -#### Scopes - -**v2** - -```python -# Get member scopes -result = await deepgram.scopes.get_scope("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") - -# Update scope -result = await deepgram.scopes.update_scope("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8", 'member') -``` - -**v3+** - -```python -from deepgram import ScopeOptions - -# Get member scopes -result = deepgram.manage.v("1").get_member_scopes("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") - -# Update scope -options = ScopeOptions( - scope="admin" -) -result = deepgram.manage.v("1").update_member_scope("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8", options) -``` - -#### Invitations - -**v2** - -```python -# List invites -result = await deepgram.invitations.list_invitations("550e8400-e29b-41d4-a716-446655440000") - -# Send invite -result = await deepgram.invitations.send_invitation("550e8400-e29b-41d4-a716-446655440000", { - 'email': 'hello@deepgram.com', - 'scope': 'member', -}) - -# Delete invite -result = await deepgram.invitations.remove_invitation("550e8400-e29b-41d4-a716-446655440000", 'hello@deepgram.com') - -# Leave project -result = await deepgram.invitation.leave_project("550e8400-e29b-41d4-a716-446655440000") -``` - -**v3+** - -```python -from deepgram import InviteOptions - -# List invites -result = deepgram.manage.v("1").get_invites("550e8400-e29b-41d4-a716-446655440000") - -# Send invite -options = InviteOptions( - email="hello@deepgram.com", - scope="member" -) -result = deepgram.manage.v("1").send_invite_options("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete invite -result = deepgram.manage.v("1").delete_invite("550e8400-e29b-41d4-a716-446655440000", "hello@deepgram.com") - -# Leave project -result = deepgram.manage.v("1").leave_project("550e8400-e29b-41d4-a716-446655440000") -``` - -#### Usage - -**v2** - -```python -# Get all requests -result = await deepgram.usage.list_requests("550e8400-e29b-41d4-a716-446655440000", { - 'limit': 10, - # other options are available -}) - -# Get request -result = await deepgram.usage.get_request("550e8400-e29b-41d4-a716-446655440000", "6ba7b812-9dad-11d1-80b4-00c04fd430c8") - -# Get usage summary -result = await deepgram.usage.get_usage("550e8400-e29b-41d4-a716-446655440000", { - 'start': '2020-01-01T00:00:00+00:00', - # other options are available -}) - -# Get usage fields -result = await deepgram.usage.get_fields("550e8400-e29b-41d4-a716-446655440000", { - 'start': '2020-01-01T00:00:00+00:00', - # other options are available -}) -``` - -**v3+** - -```python -# Get all requests -result = deepgram.manage.v("1").get_usage_requests("550e8400-e29b-41d4-a716-446655440000", options) - -# Get request -result = deepgram.manage.v("1").get_usage_request("550e8400-e29b-41d4-a716-446655440000", "6ba7b812-9dad-11d1-80b4-00c04fd430c8") - -# Get usage summary -result = deepgram.manage.v("1").get_usage_summary("550e8400-e29b-41d4-a716-446655440000", options) - -# Get usage fields -result = deepgram.manage.v("1").get_usage_fields("550e8400-e29b-41d4-a716-446655440000", options) -``` - -#### Billing - -**v2** - -```python -# Get all balances -result = await deepgram.billing.list_balance("550e8400-e29b-41d4-a716-446655440000") - -# Get balance -result = await deepgram.billing.get_balance("550e8400-e29b-41d4-a716-446655440000", "6ba7b813-9dad-11d1-80b4-00c04fd430c8") -``` - -**v3+** - -```python -# Get all balances -result = deepgram.manage.v("1").get_balances("550e8400-e29b-41d4-a716-446655440000") - -# Get balance -result = deepgram.manage.v("1").get_balance("550e8400-e29b-41d4-a716-446655440000", "6ba7b813-9dad-11d1-80b4-00c04fd430c8") -``` - -## Breaking Changes Summary - -### Major Changes - -1. **SDK Structure**: Complete restructure with improved organization -2. **Client Initialization**: New `DeepgramClient` class with environment variable support -3. **API Structure**: New versioned API structure with `v("1")` pattern -4. **Sync/Async Support**: Both synchronous and asynchronous classes and methods -5. **Options Objects**: New typed options objects for better parameter management -6. **WebSocket Implementation**: Improved live client with better abstractions -7. **Error Handling**: Enhanced error handling and logging capabilities - -### Removed Features - -- Old `Deepgram` client class (replaced with `DeepgramClient`) -- Direct async/await methods on main client (moved to versioned structure) -- Old event handling system (replaced with new event system) - -### New Features in v3+ - -- **Improved Live Client**: Better WebSocket abstractions -- **Verbosity Logging**: Enhanced logging levels for troubleshooting -- **Custom Headers/Query Parameters**: Support for custom API parameters -- **Future Product Support**: Architecture ready for new APIs -- **Better Type Safety**: Typed options objects and responses - -### Migration Checklist - -- [ ] Upgrade to latest version: `pip install --upgrade deepgram-sdk` -- [ ] Replace `Deepgram` with `DeepgramClient` -- [ ] Update API method calls to new versioned structure -- [ ] Replace direct parameters with options objects -- [ ] Update WebSocket event handling to new system -- [ ] Update error handling for new exception types -- [ ] Test all functionality with new API structure - -### Notes - -- WebVTT and SRT captions are now available as a standalone package: [deepgram-python-captions](https://github.com/deepgram/deepgram-python-captions) -- Self-hosted API functionality remains unchanged but may have breaking changes in v4 diff --git a/docs/Migrating-v3-to-v5.md b/docs/Migrating-v3-to-v5.md deleted file mode 100644 index bcaaab2d..00000000 --- a/docs/Migrating-v3-to-v5.md +++ /dev/null @@ -1,929 +0,0 @@ -# v3+ to v5 Migration Guide - -This guide helps you migrate from Deepgram Python SDK v3+ (versions 3.0.0 to 4.8.1) to v5.0.0. The v5 release introduces significant improvements including better type safety, cleaner API design, and enhanced WebSocket functionality. - -## Table of Contents - -- [Installation Changes](#installation-changes) -- [Configuration Changes](#configuration-changes) -- [Authentication Changes](#authentication-changes) -- [API Method Changes](#api-method-changes) - - [Auth V1](#auth-v1) - - [Listen V1](#listen-v1) - - [Speak V1](#speak-v1) - - [Agent V1](#agent-v1) - - [Read V1](#read-v1) - - [Models V1](#models-v1) - - [Manage V1](#manage-v1) - - [Self-Hosted V1](#self-hosted-v1) -- [Keep Alive Functionality](#websocket-keep-alive-functionality) -- [Breaking Changes Summary](#breaking-changes-summary) - -## Installation - -To upgrade from v3+ to v5.0.0: - -```bash -pip install --upgrade deepgram-sdk -``` - -## Configuration Changes - -### v3+ Client Initialization - -```python -from deepgram import DeepgramClient - -# Basic initialization -deepgram = DeepgramClient("YOUR_API_KEY") - -# With configuration -from deepgram import DeepgramClientOptions -config = DeepgramClientOptions(api_key="your-api-key") -client = DeepgramClient(config=config) -``` - -### v5.0.0 Client Initialization - -```python -from deepgram import DeepgramClient - -# API key authentication (server-side) -client = DeepgramClient(api_key="YOUR_API_KEY") - -# Access token authentication (recommended for client-side) -client = DeepgramClient(access_token="YOUR_ACCESS_TOKEN") - -# Environment variable authentication -# Set DEEPGRAM_API_KEY or DEEPGRAM_TOKEN -client = DeepgramClient() - -# With custom HTTP client -import httpx -client = DeepgramClient( - httpx_client=httpx.Client( - proxies="http://proxy.example.com", - timeout=httpx.Timeout(30.0) - ) -) -``` - -## Authentication Changes - -### Environment Variables - -- **v3+**: `DEEPGRAM_API_KEY` -- **v5.0.0**: `DEEPGRAM_TOKEN` (takes precedence) or `DEEPGRAM_API_KEY` - -### Authentication Priority (v5.0.0) - -1. Explicit `access_token` parameter (highest priority) -2. Explicit `api_key` parameter -3. `DEEPGRAM_TOKEN` environment variable -4. `DEEPGRAM_API_KEY` environment variable (lowest priority) - -## API Method Changes - -### Auth V1 - -#### Grant Token - -**v3+ (3.0.0 - 4.8.1)** - -```python -response = deepgram.auth.v("1").grant_token() -``` - -**v5.0.0** - -```python -response = client.auth.v1.tokens.grant() - -# With custom TTL -response = client.auth.v1.tokens.grant(ttl_seconds=60) -``` - -### Listen V1 - -#### Response Types - -In v5.0.0, there are two types of responses for transcription requests: - -1. **Synchronous Response**: When no callback is provided, returns the full transcription result immediately -2. **Asynchronous Response**: When a callback URL is provided, returns a "listen accepted" response and sends the actual transcription to the callback URL - -#### Transcribe URL - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import PrerecordedOptions, UrlSource - -payload: UrlSource = { - "url": "https://dpgr.am/spacewalk.wav" -} - -options = PrerecordedOptions(model="nova-3") - -response = deepgram.listen.rest.v("1").transcribe_url( - payload, - options -) -``` - -**v5.0.0** - -```python -# Returns the full transcription result immediately (synchronous) -response = client.listen.v1.media.transcribe_url( - url="https://dpgr.am/spacewalk.wav", - model="nova-3" -) -``` - -#### Transcribe File - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import PrerecordedOptions, FileSource - -with open("path/to/your/audio.wav", "rb") as file: - buffer_data = file.read() - -payload: FileSource = { - "buffer": buffer_data, -} - -options = PrerecordedOptions(model="nova-3") - -response = deepgram.listen.rest.v("1").transcribe_file( - payload, - options -) -``` - -**v5.0.0** - -```python -# Returns the full transcription result immediately (synchronous) -with open("audio.wav", "rb") as audio_file: - response = client.listen.v1.media.transcribe_file( - request=audio_file.read(), - model="nova-3" - ) -``` - -#### Transcribe URL with Callback (Asynchronous) - -**v3+ (3.0.0 - 4.8.1)** - -```python -response = deepgram.listen.rest.v("1").transcribe_url_callback( - payload, - "https://your-callback-url.com/webhook", - options=options -) -``` - -**v5.0.0** - -```python -# Returns a listen accepted response (not the full transcription) -response = client.listen.v1.media.transcribe_url( - url="https://dpgr.am/spacewalk.wav", - callback="https://your-callback-url.com/webhook", - model="nova-3" -) -# The actual transcription will be sent to the callback URL -``` - -#### Transcribe File with Callback (Asynchronous) - -**v3+ (3.0.0 - 4.8.1)** - -```python -response = deepgram.listen.rest.v("1").transcribe_file_callback( - payload, - "https://your-callback-url.com/webhook", - options=options -) -``` - -**v5.0.0** - -```python -# Returns a listen accepted response (not the full transcription) -with open("audio.wav", "rb") as audio_file: - response = client.listen.v1.media.transcribe_file( - request=audio_file.read(), - callback="https://your-callback-url.com/webhook", - model="nova-3" - ) -# The actual transcription will be sent to the callback URL -``` - -#### WebSocket Streaming (Listen V1) - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import LiveOptions, LiveTranscriptionEvents - -connection = deepgram.listen.websocket.v("1") - -@connection.on(LiveTranscriptionEvents.Transcript) -def handle_transcript(result): - print(result.channel.alternatives[0].transcript) - -connection.start(LiveOptions(model="nova-3", language="en-US")) -connection.send(open("path/to/your/audio.wav", "rb").read()) -connection.finish() -``` - -**v5.0.0** - -```python -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Error: {error}")) - - connection.start_listening() - - # Read and send audio data - with open("path/to/your/audio.wav", "rb") as audio_file: - audio_bytes = audio_file.read() - from deepgram.extensions.types.sockets import ListenV1MediaMessage - connection.send_media(ListenV1MediaMessage(audio_bytes)) - -``` - -#### WebSocket Streaming (Listen V2 - New in v5.0.0) - -**v5.0.0** - -```python -with client.listen.v2.connect( - model="flux-general-en", - encoding="linear16", - sample_rate="16000" -) as connection: - def on_message(message): - print(f"Received {message.type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Error: {error}")) - - connection.start_listening() -``` - -### Speak V1 - -#### Generate Audio (REST) - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import SpeakOptions - -options = SpeakOptions(model="aura-2-thalia-en") - -response = deepgram.speak.rest.v("1").save( - "output.mp3", - {"text": "Hello world!"}, - options -) -``` - -**v5.0.0** - -```python -response = client.speak.v1.audio.generate( - text="Hello, this is a sample text to speech conversion.", - model="aura-2-asteria-en" -) - -# Save the audio file -with open("output.mp3", "wb") as audio_file: - audio_file.write(response.stream.getvalue()) -``` - -#### WebSocket Streaming (Speak V1) - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import ( - SpeakWSOptions, - SpeakWebSocketEvents -) - -connection = deepgram.speak.websocket.v("1") - -@connection.on(SpeakWebSocketEvents.AudioData) -def handle_audio_data(data): - # Handle audio data - pass - -options = SpeakWSOptions( - model="aura-2-thalia-en", - encoding="linear16", - sample_rate=16000 -) - -connection.start(options) -connection.send_text("Hello, this is a text to speech example.") -connection.flush() -connection.wait_for_complete() -connection.finish() -``` - -**v5.0.0** - -```python -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -with client.speak.v1.connect( - model="aura-2-asteria-en", - encoding="linear16", - sample_rate=24000 -) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Error: {error}")) - - connection.start_listening() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1TextMessage - connection.send_text(SpeakV1TextMessage(text="Hello, world!")) - - # Send control messages - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - connection.send_control(SpeakV1ControlMessage(type="Flush")) - connection.send_control(SpeakV1ControlMessage(type="Close")) -``` - -### Agent V1 - -#### Voice Agent Configuration - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import ( - SettingsOptions, - Speak -) - -connection = deepgram.agent.websocket.v("1") - -options = SettingsOptions() -options.language = "en" -options.agent.think.provider.type = "open_ai" -options.agent.think.provider.model = "gpt-4o-mini" -options.agent.think.prompt = "You are a helpful AI assistant." -options.agent.listen.provider.type = "deepgram" -options.agent.listen.provider.model = "nova-3" - -primary = Speak() -primary.provider.type = "deepgram" -primary.provider.model = "aura-2-zeus-en" - -options.agent.speak = [primary] -options.greeting = "Hello, I'm your AI assistant." - -connection.start(options) -``` - -**v5.0.0** - -```python -from deepgram.extensions.types.sockets import ( - AgentV1SettingsMessage, AgentV1Agent, AgentV1AudioConfig, - AgentV1AudioInput, AgentV1Listen, AgentV1ListenProvider, - AgentV1Think, AgentV1OpenAiThinkProvider, AgentV1SpeakProviderConfig, - AgentV1DeepgramSpeakProvider -) - -with client.agent.v1.connect() as agent: - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput(encoding="linear16", sample_rate=44100) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider(type="deepgram", model="nova-3") - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", model="gpt-4o-mini" - ) - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", model="aura-2-asteria-en" - ) - ) - ) - ) - - agent.send_settings(settings) - agent.start_listening() -``` - -### Read V1 - -#### Text Analysis - -**v3+ (3.0.0 - 4.8.1)** - -```python -from deepgram import AnalyzeOptions, TextSource - -options = AnalyzeOptions( - sentiment=True, - intents=True, - topics=True, - summarize=True -) - -payload: TextSource = { - "buffer": "The quick brown fox jumps over the lazy dog." -} - -response = deepgram.read.analyze.v("1").analyze_text( - payload, - options -) -``` - -**v5.0.0** - -```python -response = client.read.v1.text.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True -) -``` - -### Models V1 - -#### List Models - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Not available in v3+ -``` - -**v5.0.0** - -```python -response = client.manage.v1.models.list() - -# Include outdated models -response = client.manage.v1.models.list(include_outdated=True) -``` - -#### Get Model - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Not available in v3+ -``` - -**v5.0.0** - -```python -response = client.manage.v1.models.get( - model_id="6ba7b814-9dad-11d1-80b4-00c04fd430c8" -) -``` - -### Manage V1 - -#### Projects - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get projects -response = deepgram.manage.v("1").get_projects() - -# Get project -response = deepgram.manage.v("1").get_project("550e8400-e29b-41d4-a716-446655440000") - -# Update project -response = deepgram.manage.v("1").update_project("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete project -response = deepgram.manage.v("1").delete_project("550e8400-e29b-41d4-a716-446655440000") -``` - -**v5.0.0** - -```python -# Get projects -response = client.manage.v1.projects.list() - -# Get project -response = client.manage.v1.projects.get(project_id="550e8400-e29b-41d4-a716-446655440000") - -# Update project -response = client.manage.projects.update( - project_id="550e8400-e29b-41d4-a716-446655440000", - name="New Project Name" -) - -# Delete project -response = client.manage.projects.delete(project_id="550e8400-e29b-41d4-a716-446655440000") -``` - -#### Keys - -**v3+ (3.0.0 - 4.8.1)** - -```python -# List keys -response = deepgram.manage.v("1").get_keys("550e8400-e29b-41d4-a716-446655440000") - -# Get key -response = deepgram.manage.v("1").get_key("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") - -# Create key -response = deepgram.manage.v("1").create_key("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete key -response = deepgram.manage.v("1").delete_key("550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8") -``` - -**v5.0.0** - -```python -# List keys -response = client.manage.v1.projects.keys.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get key -response = client.manage.v1.projects.keys.get( - project_id="550e8400-e29b-41d4-a716-446655440000", - key_id="6ba7b810-9dad-11d1-80b4-00c04fd430c8" -) - -# Create key -response = client.manage.projects.keys.create( - project_id="550e8400-e29b-41d4-a716-446655440000", - request={"key": "value"} -) - -# Delete key -response = client.manage.projects.keys.delete( - project_id="550e8400-e29b-41d4-a716-446655440000", - key_id="6ba7b810-9dad-11d1-80b4-00c04fd430c8" -) -``` - -#### Members - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get members -response = deepgram.manage.v("1").get_members("550e8400-e29b-41d4-a716-446655440000") - -# Remove member -response = deepgram.manage.v("1").remove_member("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") -``` - -**v5.0.0** - -```python -# Get members -response = client.manage.v1.projects.members.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Remove member -response = client.manage.v1.projects.members.delete( - project_id="550e8400-e29b-41d4-a716-446655440000", - member_id="6ba7b811-9dad-11d1-80b4-00c04fd430c8" -) -``` - -#### Scopes - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get member scopes -response = deepgram.manage.v("1").get_member_scopes("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8") - -# Update scope -response = deepgram.manage.v("1").update_member_scope("550e8400-e29b-41d4-a716-446655440000", "6ba7b811-9dad-11d1-80b4-00c04fd430c8", options) -``` - -**v5.0.0** - -```python -# Get member scopes -response = client.manage.v1.projects.members.scopes.list( - project_id="550e8400-e29b-41d4-a716-446655440000", - member_id="6ba7b811-9dad-11d1-80b4-00c04fd430c8" -) - -# Update scope -response = client.manage.projects.members.scopes.update( - project_id="550e8400-e29b-41d4-a716-446655440000", - member_id="6ba7b811-9dad-11d1-80b4-00c04fd430c8", - scope="admin" -) -``` - -#### Invitations - -**v3+ (3.0.0 - 4.8.1)** - -```python -# List invites -response = deepgram.manage.v("1").get_invites("550e8400-e29b-41d4-a716-446655440000") - -# Send invite -response = deepgram.manage.v("1").send_invite("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete invite -response = deepgram.manage.v("1").delete_invite("550e8400-e29b-41d4-a716-446655440000", "hello@deepgram.com") - -# Leave project -response = deepgram.manage.v("1").leave_project("550e8400-e29b-41d4-a716-446655440000") -``` - -**v5.0.0** - -```python -# List invites -response = client.manage.v1.projects.members.invites.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Send invite -response = client.manage.v1.projects.members.invites.create( - project_id="550e8400-e29b-41d4-a716-446655440000", - email="hello@deepgram.com", - scope="member" -) - -# Delete invite -response = client.manage.v1.projects.members.invites.delete( - project_id="550e8400-e29b-41d4-a716-446655440000", - email="hello@deepgram.com" -) - -# Leave project -response = client.manage.v1.projects.leave( - project_id="550e8400-e29b-41d4-a716-446655440000" -) -``` - -#### Usage - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get all requests -response = deepgram.manage.v("1").get_usage_requests("550e8400-e29b-41d4-a716-446655440000") - -# Get request -response = deepgram.manage.v("1").get_usage_request("550e8400-e29b-41d4-a716-446655440000", "6ba7b812-9dad-11d1-80b4-00c04fd430c8") - -# Get fields -response = deepgram.manage.v("1").get_usage_fields("550e8400-e29b-41d4-a716-446655440000") - -# Summarize usage -response = deepgram.manage.v("1").get_usage_summary("550e8400-e29b-41d4-a716-446655440000") -``` - -**v5.0.0** - -```python -# Get all requests -response = client.manage.v1.projects.requests.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get request -response = client.manage.v1.projects.requests.get( - project_id="550e8400-e29b-41d4-a716-446655440000", - request_id="6ba7b812-9dad-11d1-80b4-00c04fd430c8" -) - -# Get fields -response = client.manage.v1.projects.usage.fields.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get usage summary -response = client.manage.v1.projects.usage.get( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get usage breakdown (new in v5) -response = client.manage.v1.projects.usage.breakdown.get( - project_id="550e8400-e29b-41d4-a716-446655440000" -) -``` - -#### Billing - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get all balances -response = deepgram.manage.v("1").get_balances("550e8400-e29b-41d4-a716-446655440000") - -# Get balance -response = deepgram.manage.v("1").get_balance("550e8400-e29b-41d4-a716-446655440000", "6ba7b813-9dad-11d1-80b4-00c04fd430c8") -``` - -**v5.0.0** - -```python -# Get all balances -response = client.manage.v1.projects.balances.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get balance -response = client.manage.v1.projects.balances.get( - project_id="550e8400-e29b-41d4-a716-446655440000", - balance_id="6ba7b813-9dad-11d1-80b4-00c04fd430c8" -) -``` - -#### Models (Project-specific) - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Get all project models -response = deepgram.manage.v("1").get_project_models("550e8400-e29b-41d4-a716-446655440000") - -# Get model -response = deepgram.manage.v("1").get_project_model("550e8400-e29b-41d4-a716-446655440000", "6ba7b814-9dad-11d1-80b4-00c04fd430c8") -``` - -**v5.0.0** - -```python -# Get all project models -response = client.manage.v1.projects.models.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get model -response = client.manage.v1.projects.models.get( - project_id="550e8400-e29b-41d4-a716-446655440000", - model_id="6ba7b814-9dad-11d1-80b4-00c04fd430c8" -) -``` - -### Self-Hosted V1 - -#### Distribution Credentials - -**v3+ (3.0.0 - 4.8.1)** - -```python -# List credentials -response = deepgram.selfhosted.v("1").list_selfhosted_credentials("550e8400-e29b-41d4-a716-446655440000") - -# Get credentials -response = deepgram.selfhosted.v("1").get_selfhosted_credentials("550e8400-e29b-41d4-a716-446655440000", "6ba7b815-9dad-11d1-80b4-00c04fd430c8") - -# Create credentials -response = deepgram.selfhosted.v("1").create_selfhosted_credentials("550e8400-e29b-41d4-a716-446655440000", options) - -# Delete credentials -response = deepgram.selfhosted.v("1").delete_selfhosted_credentials("550e8400-e29b-41d4-a716-446655440000", "6ba7b815-9dad-11d1-80b4-00c04fd430c8") -``` - -**v5.0.0** - -```python -# List credentials -response = client.self_hosted.v1.distribution_credentials.list( - project_id="550e8400-e29b-41d4-a716-446655440000" -) - -# Get credentials -response = client.self_hosted.v1.distribution_credentials.get( - project_id="550e8400-e29b-41d4-a716-446655440000", - distribution_credentials_id="6ba7b815-9dad-11d1-80b4-00c04fd430c8" -) - -# Create credentials -response = client.self_hosted.v1.distribution_credentials.create( - project_id="550e8400-e29b-41d4-a716-446655440000", - scopes=["read", "write"], - provider="quay", - comment="Development credentials" -) - -# Delete credentials -response = client.self_hosted.v1.distribution_credentials.delete( - project_id="550e8400-e29b-41d4-a716-446655440000", - distribution_credentials_id="6ba7b815-9dad-11d1-80b4-00c04fd430c8" -) -``` - -## WebSocket Keep Alive Functionality - -**v3+ (3.0.0 - 4.8.1)** - -```python -# Keep alive was passed as a config option -config = DeepgramClientOptions( - options={"keepalive": "true"} -) -deepgram = DeepgramClient(API_KEY, config) -``` - -**v5.0.0** - -```python -# Keep alive is now manually managed via control messages. -from deepgram.extensions.types.sockets import ListenV1ControlMessage, AgentV1ControlMessage - -# For Listen V1 connections -with client.listen.v1.connect(model="nova-3") as connection: - # Send keep alive message - connection.send_control(ListenV1ControlMessage(type="KeepAlive")) - -# For Agent V1 connections -with client.agent.v1.connect() as agent: - # Send keep alive message - agent.send_control(AgentV1ControlMessage(type="KeepAlive")) -``` - -## Breaking Changes Summary - -### Major Changes - -1. **Authentication**: New access token support with environment variable `DEEPGRAM_TOKEN` -2. **API structure**: Flattened method names and cleaner parameter passing -3. **WebSocket API**: Complete redesign with context managers and typed message objects -4. **WebSocket Keep Alive**: Managed via control messages, no longer an automatic thing via config -5. **Type safety**: Enhanced type annotations and response objects -6. **Error handling**: Improved error types and handling - -### Removed Features - -- Custom configuration objects (replaced with direct parameters) -- String-based versioning (`v("1")` β†’ `v1`) -- Separate callback methods (integrated into main methods) -- Legacy WebSocket event system - -### New Features in v5.0.0 - -- **Listen V2**: Advanced conversational speech recognition with contextual turn detection -- **Enhanced Agent V1**: More flexible voice agent configuration -- **Raw response access**: Access to HTTP headers and raw response data -- **Custom HTTP client**: Support for custom httpx clients -- **Usage breakdown**: Detailed usage analytics -- **Better async support**: Full async/await support throughout - -### Migration Checklist - -- [ ] Upgrade to latest version: `pip install --upgrade deepgram-sdk` -- [ ] Update import statements if needed -- [ ] Replace API key configuration with new authentication methods -- [ ] Update all API method calls to new structure -- [ ] Migrate WebSocket connections to new context manager pattern -- [ ] Update WebSocket keep alive implementation -- [ ] Update error handling for new exception types -- [ ] Test all functionality with new API structure diff --git a/examples/agent/v1/connect/async.py b/examples/agent/v1/connect/async.py deleted file mode 100644 index 92574f85..00000000 --- a/examples/agent/v1/connect/async.py +++ /dev/null @@ -1,83 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SocketClientResponse, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - async with client.agent.v1.connect() as agent: - # Send minimal settings to configure the agent per the latest spec - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=16000, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ) - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - print("Send SettingsConfiguration message") - await agent.send_settings(settings) - def on_message(message: AgentV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - agent.on(EventType.OPEN, lambda _: print("Connection opened")) - agent.on(EventType.MESSAGE, on_message) - agent.on(EventType.CLOSE, lambda _: print("Connection closed")) - agent.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening task and cancel after brief demo - # In production, you would typically await agent.start_listening() directly - # which runs until the connection closes or is interrupted - listen_task = asyncio.create_task(agent.start_listening()) - await asyncio.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting - listen_task.cancel() - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/agent/v1/connect/main.py b/examples/agent/v1/connect/main.py deleted file mode 100644 index 9cdd2270..00000000 --- a/examples/agent/v1/connect/main.py +++ /dev/null @@ -1,82 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SocketClientResponse, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -client = DeepgramClient() - -try: - with client.agent.v1.connect() as agent: - # Send minimal settings to configure the agent per the latest spec - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=44100, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ), - prompt='Reply only and explicitly with "OK".', - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - print("Send SettingsConfiguration message") - agent.send_settings(settings) - - def on_message(message: AgentV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - agent.on(EventType.OPEN, lambda _: print("Connection opened")) - agent.on(EventType.MESSAGE, on_message) - agent.on(EventType.CLOSE, lambda _: print("Connection closed")) - agent.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call agent.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=agent.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/agent/v1/connect/with_auth_token.py b/examples/agent/v1/connect/with_auth_token.py deleted file mode 100644 index 5f593712..00000000 --- a/examples/agent/v1/connect/with_auth_token.py +++ /dev/null @@ -1,88 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SocketClientResponse, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - with client.agent.v1.connect() as agent: - # Send minimal settings to configure the agent per the latest spec - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=44100, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ), - prompt='Reply only and explicitly with "OK".', - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - print("Send SettingsConfiguration message") - agent.send_settings(settings) - def on_message(message: AgentV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - agent.on(EventType.OPEN, lambda _: print("Connection opened")) - agent.on(EventType.MESSAGE, on_message) - agent.on(EventType.CLOSE, lambda _: print("Connection closed")) - agent.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call agent.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=agent.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/agent/v1/connect/with_raw_response.py b/examples/agent/v1/connect/with_raw_response.py deleted file mode 100644 index 6295eb3d..00000000 --- a/examples/agent/v1/connect/with_raw_response.py +++ /dev/null @@ -1,86 +0,0 @@ -import json # noqa: F401 -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -client = DeepgramClient() - -try: - with client.agent.v1.with_raw_response.connect() as agent: - # Send minimal settings to configure the agent per the latest spec - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=44100, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ), - prompt='Reply only and explicitly with "OK".', - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - # Send settings using raw method - print("Send SettingsConfiguration message") - agent._send_model(settings) - - # EXAMPLE ONLY: Manually read messages for demo purposes - # In production, you would use the standard event handlers and start_listening() - print("Connection opened") - try: - start = time.time() - while time.time() - start < 3: - raw = agent._websocket.recv() # type: ignore[attr-defined] - if isinstance(raw, (bytes, bytearray)): - print("Received audio event") - continue - try: - data = json.loads(raw) - msg_type = data.get("type", "Unknown") - print(f"Received {msg_type} event") - if msg_type == "AgentAudioDone": - break - except Exception: - print("Received message event") - except Exception as e: - print(f"Caught: {e}") - finally: - print("Connection closed") -except Exception as e: - print(f"Caught: {e}") \ No newline at end of file diff --git a/examples/fixtures/audio.mp3 b/examples/fixtures/audio.mp3 deleted file mode 100644 index ca632f7109f84855733ac22a02222e9478be4397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43467 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

>Rou*~Qvo{0V+)WoTEv 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�EMJ0mn}NKRc>6K`p4 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

JAW;D(JDI=uy-lXctq- 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�jD{f8bTjt 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

uoI(|z%Vlv&x*!7W)%MX;9j+Ks|%4~UxnAV!E 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%0DycGR}oMid*FF>M(l@oQg%9l1I=adQFdPA)T&Y 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%0DJaG~*Mj=b<_$8TE#hP8 zraXlx^a<)Mo8`gM7vVeGAoH}|Me7q(gO!73u)2QJm=MatwHHa>6Dv2DlgS<5kdeJ& zr#8W-yuypAEdBz;^#MYS^eN+TEQba{o?Ec14BS$cs%=x3XXvc_}tkyArKn@%;l8EbvLIG!<{ zX;wFe;%RkX7tJlG^thx-cnZytH%bM>p0>rN6Hn!#+AQitS9X$y9tn^;^-qxX7@dd@L?PbPy)*$q3UAL>`V>7V4m3u}zI z8GV>VUR6gxhQQPrFXxEh`lBEa+nbwPE5Cs`uXeNG&~KS;*6P* z&dM=O=A5|%vb?@fKp0FVWtWjzze<*QC(tuETgyfLd?_9fU-7ePPFB`}JfNKLj#`sp zt3zes6xye|>A7im9~Gs_@;5BC6m+sqfL+-IdZh~(>78W2bBS0Ai^;+z#(O3aX={4Y z1{!UR(8=qFn$tG(H}q~CsP&ZRRPF{w=Ah7BxQfec8Yg}@=Y*!E;8?x63S2w8Bg`2HdPNhC-F+5ml!FHL?zMcS9TMhqtIr>*001*lBnp)4)qN#&Ciwd z@+36WbD~yg>DgR_>69N9d`{E?=EF^Si#Oac^tdDOnjZ_FvkU4jTNw3apndk~U8wUl z0bdl*S5qmeM<$R#xFA#!+mhF2eAr7ewok#E_dxxq1TJW=&AzBqeou^= z6YkVg+fBL>RiqI_geO>mF}AB<`5WN^{1YeUIPU5gI^OqS?=6F8@ZRWvPSptf2NXCS z0Z>XW(X;mmMNp2dif3pcG+ZYdZd8e?Q61V0JLfIDnUzKc+*EJq*^F(tiAk`DY&_?z zcwx=v6L{&nedS)-p>lA9+;1iIrxLIl3ZaZs5FUmH<=Ei!Yz`hf=-U`5p+|=j zgu3!E{L?=veh@I#MM)@x@@}Tk67w^C!;2`Ab`I?E@Ai)hC|Yr2aVSPuEKLWYa#3n6 z{%OmKg5(f1D+`;td6_y(PTSbf0JAiXFQc@ zuF6J^JvuapF2)D#zhK?q(%@|^)%e?XN}8{pc6ed3RCfMmAFMQx#^axKjx(hjndvH! zIh&~~H>L}!<0hI94CqOe#(Uvry^qRJPx6HI#7I-kn#{0o#zrG6XWLor2Q-Uk;TRS) z&WEN5@#5do2`Pxfd;;v1{Ki_4rWcH?q1m<_LJeH>S_&C#2hHD%Gt>Wy2Er@UI!VJ8&Pm_J`7vqHexLMUQcN0&~10}aWaN=>>UcM&v6Ia+an{Ime z4m3D(m>WXhh(#I+iYK}9t zcL;YwE12i=&1Io@I9fh2gESJf-5a#@on)xRQIcOPRz+#dq1=?#2~SLw$fvjeNB=K@ zaasm*qirXZ?NnktG6LHhl=M@K@#d7!AK=@9Jd13o+nuHhn519U-S{PqF^f{g+{gaW zk$q$dkyl$`o%mGRC*PE_$`iyYw$(;9L{8ZTBrHF0>Tg7GqV$KT)g%{v@d`47Q*#&0~sC#Xn21;sl}`k9(l6QbnK-~wBU zMTHZ1jT~k4Y7r^))h`-da7ZbM)8J6FeJ9h=x+1j(l^3p_r-s!Y{L3*hArxhd4DRvA zqkdN*cvpwXC^l0r;v-X9?JpM)uZHfRLLWu9YXHjafzT^kbs?FRd(Z4|WYnG7Ae^~| z1iu6)X!*%f>JiPXriZ?n?s#FT6gqfUarK!e4z__W(xwLT!h~}AYoQOF!7zzzC((tE zV~3vyBc`qR3mxZhyfzxzx2h4!2Jvv{Pdyqn`c=Mc{!M}R+Bh@T_Kz3?O?sp>6!t{} z_PZV6Gyb&wL~XhkmA)FGCB`>x4LOR06ZH&zqB+x6hg=~$d&d#{#@2|v!5S9gsqT>r zDq%`T*(3cZ^dN(1pfAxj)2-`mtfwo`A2+;FuvMppn!v{IWjim7kiG+j-_c&lUR~`g z=MWEp@Xezy)RMIFI8x*x-J{)2>**XJgE;&hk`b9OR7vPJJqfR>z zl;3!~YOa$tJL!Vf#$hx`TdCoiq<1w=nT6?qyeAgQCfo_tHcz1nYrs}}PA)JUG~`s2 z`v%!o;czhx-pfK5FE@-FIGa5dF3~#>q*|y&t|!O5s2|hZ+OuF5?LX~byu8MSKG~|G zDlCEp@yI=;{$c|V^xfG3v(VQ%YKs$+;k!JS`m!s>*rG$@d6H+eH0_f<)U0ER6sOTG z9YG~`ruYC)h1JFyy(+cs6(|Cqvh@^CNlU9bZCq0=p+Xz)lIGl*Vu8 zmTO2iSnB~JT3;Ak8fX+a7x)xhqi-}%vqMw_3%yHOz#dW)SMNme20g1|RPqmiuKG&t z=$L|Is?aEOSAPf-uu&i^xKm3r=GaWplxwM5)MBau2H+1N8FtDcRFG5kSp7T>iXQU) ztHJ8Qlt5%~C#t&HjMHX&+btrfHBt<{mIqYPw@^ndWM(v~=|{AQpygb2h5Ca<*o*?; z3$og*@KtN0b3C6ub9)>LP7|GHV()J+Hm3&pfv30-4+Nijr8HjJ_DB zX&+m-a93C_<|N9$h{I|Z+gY=a@kT4DW!3)DPU>#60nzC)P{->z9lDTtzR_N5BTy_K zW_E%(pNBP62&D6IoC*#algzy+lMX?*Hbi~D59rcK!b;fTr{Fx-hDVW?8c{VIkS(Rk z_92m&V38&GdFC)qG~$(=*{uQqAg-n0N3$n@2?Y zH-1mK%v5-+oAjf`@1cuAKsu)ERd>K<`3554ZUz;t(Q%ZlwcG#g2_D#|v zm`A<+^T?CO`Q8U2i~+V^q|-_U`y3F-vbqqQY;)l`I--y0nh4}=U-bl{-l6(^IwA#v zy#jdxQv&CM@AaFZiqc;7sPnb^rDwJ$%{9c)LHR+P92#!aqux|Sx8aAAYF?*%R+d%M zjCzGbQb1QFk|Ei_RP>`~@(n!TT~%}zbX{>SvhR|9HRJpbQmQ0A`=%r=PI>E3GPlT& z9CutzTodgDqegwHxbIJgS}eH5-;5sVnSW$X|*xGGNVN0 z5BnzP9@kt~HD^H0C>!7+Pr}Bo8i)uC3FJqB;|(X!7V652n8nA0BjNz*C~?#&@prJ! zZ^0h!H;S6=LRkb^`bU1I1nAtp6GNe0`out@cR|{ev`^kiftUJ3+n-dfb#*SDeiwzN z=B?ltUk2}_wD#UM{wmrCbGncu^-^{ykL8?F9DY|j^dVXy?UvTkXcd|Z=Q$3)kVZ;l z`J{N;mTI;%iV}5<)*fn0_35Bmu7PJBg@*D%CA)pHV}$d*vzs%w!>RU^ezl!6W@-6? z7XuxF2eqL_?oc1wTUPLlkZ6v^jYFd2IMnzUIwQ7H%GuxAe?W14gqSa+>e~Vn{abJ( z9IBTMoe@^k&kWGj9b(ICmeSLLXM=OKJVu^SF0#gvV11Y4-VsY3l};b~<3$^+4r-_l zIg*aa1frx8)C4bSkM&vRP+L*(Y;n?7@I3KC3HGx+LStz&>&xMGgxwFT6ehSQ*>$mu zxdmawttr=%d#2=1+v)2a^y!+}ifpqGCr3D}_P5lggH({8EBV#y$|Jd#w1-}6FMQ5s z>6P^odM&*n%I}(XKwGXI1ryqYidQpE&sV5-Ul(Vhb-u>rL;@!Ked;%{}j08{MKTzSH-hnI;c6n@YBhr^|u z6e@(CfYR7w)}yX9U8*8W@+;Wn4MWF_|ET)>%^au%@7E*OmZwM$gaaXRPSp0J(QQuF z77)c`M{%^etxM=T(~l3pJZ(OwV0XNzb`n9n4fYQ_^sVwbyuG|veR+e?Mmt-3_N(vg ztL-6F-yedC?ul#GzhJuaqqAb^H7*I=rTZ2K6X}IkT#rEK|7RlTJn-xeq8A^p7Et4G zDIFjTCem6025*4Bxo^97viGI;hOc%YQY&Y)2=x-8q|S0~s+hTOd*3Rp6BiR%cE?E| z!eHJ8`vtn;i!{Uc)%V&zIQWy^+RRT?tCE-lWW-={p4i|{e}eaZ+QhV5X}h`eIR8KB zQs>6aH^E=se~aHc=5G+3tp5=DUd*HHwy$)aaVhR8uA0u#_6|xGDVFR+HWp|daL|zg z&-`J5)qyF&Gg@sp){kw+U=-z4$J*yQz!EthIyX2oI14yls-=|j(iiG{HT3Vuhi>}* z1D{kUxInKGlEqE(HMOIox^twngma=}FFmSAbvPc-Kg++fN3~&JDN1)FmsXgXYcW*j zFX#u&8CpG-Nx(KaMot_LK6+mPgHfvv?LK z!FAx!i-11cMK`)CJN_B^upS%>8_~t_aT3p`Y9&&6+#yz!eg#!8(ifeNJ5)(}qtB>& z?#4mp3bm>TaSvzmH?*R!kfruV2V<%p2Cs9UIT_5@R@+N3Mh8%}RX`Zl4t*estA}^M zF(Rf0xX|Un<*5(_^8Y^qcV{VX3!?%8{MiRdNFcDgZ|}a za^$wQZ?<-L9@HnVZDK@{Xu&cc3!3n7n=vwW<^poDbn|SD7l)G_Lo6Pw^w1flk6?DnKKs zoW$zWIPo`dhL6MNvlCu5*UcCdWY&ONuZK(7C*skeU>R=U%UMvT0tD~Zr`6C`>S_9q zxHfGx){tk_!@n?2zeP3LrD4A)4860d3-Cd~Id?Qf(D+TDdHQ;SBLRE)fst{+JXXiTwE)2;kkYWg!>LU@psJx+H$)2+}vO` zr!KdOXZ4*?31rAe_K!kz96RI6q*A;3hM!Jz^o@3*``t6tAN1l{u#Bg`eM~`zTm(6= z4L_M%R8rQ3iW6)8L}l0xYq~f%mPgbXN3eF93;l4Fy31WR1|hhZuixm~4#LG}GzgdH zWWmco!gK_W87JG72t`%CP>0wn|4yf&F?uGSq@6IHA5mq!$JO4UI^8l|FR?Mb;pHfo z|A%MX74CBm%CIG<+1;VbGM&C@>5yTbr)FA)d|--^*SLWDX%_vuww4ZbFReR#{xw9O z5*>u4D6~}JDJJ6ny_=C~!iqgl_HQRXE{XP26Ev28C62y9^}7^L=6Ae@o>H+_n2%9n zW*C(Pcm^HlLj6nJ*9^|gVZ3Jlq~2dhI!@2&Jih85smgao(J2$7d6z0kzfeAUXCqKv z`48WjIL4VCYLc+3t0rSl&ct`a!(PKL+3otSGU^Kvy9pG7FhuT57tx&?|Ph1zTm zK4~i|ue<4ILVs1W?m%;a4q z(adTEqGuTYK8pOTQ@S!r1?m)4L7BFM=R6Rd>>=zs?b0=vbD@}EDM(uSVY%tJHRe6X z(g#@0jNZwPvmcH5W8A|N5Y%qaE8o#M_zuRj0Dfr)?@}53>Laof%L}Um_{^esyM1NF zZKD#}1`Lx6pV7y7lE)aYja0I@%4TPpG-3+mE-*UZcDTqXR>OhfYK=g zis~f$U3XT+&t@0ib)|X4{1+_2E!6l=v5)NK`yA`WWX3mP%-5g`7X#NPK3&Po(wi;7 zxHZKu`cwI0F$HfG?t>vXU(of9qAEfHk2J10< zI?%yrfwqrLIzr~3#O{!dzW4yH8%>8HJDrb~JdNdaQLclJPPC=jpqScpyc6QsU(Zop zv$U6&^PE@my@+SpiHIfvm9&0T>C+hLzsZb`voGE?UsB0`$|u|nny?q#&|+q0>ZaCL zR=m*if^5oZW&q>t#G5%kyJ25;j7OkTJEFXHgXkj%Sg-0J!K%?iDN47@(xJ1oK9zL6 zNlP2gQlPXn-JYQYd6~Y*1;*~eia;AO+$lHMT58}oa)Q3v#)z?V#SDFevL z3Mk{&EyV?TYzvp9w((`MHAJaYoNB8^NGwLnCK z(cdXb_pcj{bqiPxEBIc>f32c__K*(R&qRW+S^uqVguzUuIh;_BJPasFw1u9g0G7l~Z| zH9uqd8N8*+noQ>~iT}FC$+DW0yJM&xnCL1z!`_@+`?())`u&um&T1(`XJm9Gu!m;) znzNL(C3t@d-d_1|rSD9JF}-<+-AY6302l zX9QihBJ7TDQ6xOXDY+5lT+0t&FMqFKzi7|NoPkV$v9mPeh3y`8&Xlo|kdy$~r#4+`t8r zdAyB^-+R!d4$d+MJ3~BA@;IYCi`TmHu8mo#O_-$}IHRny3f>lH*)TrER93H z7|{QJu)&?r=4f!}T zt-bL?`g(V9LNq5b|C8sJ4TQ{OI?%TS%g6OQu{F4vHR4GkwG`2X8c`ILtyJ+bZgqd) zS>BEKrZ6mmWSH?+VY3{mB{+IQI5-%@40g1XajaxA}o8fVW1WMzHzvie;*wIhSW1NHod z_ek2P)NUywlP@JTO)?W7CZ0*$nYc8uPh!2qY>BSK9Esf$-zM%&I+C24(k<PR*$RKK)uJp=e?wEf`6Y`Jq^R& zD=(6B!DlFdirN=2!4u(qP{}hd7@Z9dj>(VpxB7cM5m&;;`U!mrh~Jh}W!maf^uIx~ zw1T(th3q3}jjbaporywBH=@-Z%;@vP2fuUfZ9(nm5ZM#}yxf4D^fq-4 zY7Afww$ZovK)zMXc*s+jsm}pzc~1{F>QcQPWAwrUI9C5v&xQxvXxQal;Wr1g2_P6Q z8KcY+)GL33TOpD${V8pdmnsX?A@)j+M~=qMd1%Bfca8@oTh5sa&dF=XZw}oq*%vA^ zr4MK~d>8EC9hv;sw_0BseSH5e`t6f9>YLTEKgX7cHC{h@eem^;*SB9cimm!)Q{1L^ zSw4n;Y5nb9QqQ#4)S>ExT;gbXgF4U=bpGJ3?TH9m8|Duy8eS^AP}y!F@FC$phl}A0!<4Ww zp7-t!?i;QOuBFZxN0R-$dQKSzXMO|NqT^-@*!8D_D+3Gt`+W)Ce%=UgVw&o0a)Qc^f$iTb zD1v1>N{{5K`35x{g-pkkKFH^l)oM@sca9Xt8RsNdaraGkea~jkInN$X8_#98hJiz@ zW4pZvJ^y>sMyhQ?=}gZ5e>9y1d=yvL#&>3CHEtwCaJS+VZIM!-NO7wGMT-_GUMLhT z6iQ2>NGa}43luL}+?^yy0wD>}^_ki4e>dMtei4%0nLAg`J@=gFd5(SG_0oQIA`LQRePc7tpc9`-0SdBp~=?oFVe~71AIk~MP zg7Gc7S4%nH7l04gC@q6=F+~|S#E+c`N`7J zk`2#nm1!Lqm3DHlbkl!WKT9R$c`$^F!HcM%wgBxs7T)M`bu-N4N7RQcPu<*^+95dg zO~}^SIKfn>D%dm-WUGjR*Cr#@9WL!eFpwr?1SkTH98ajSRPJW@K%3?Hz;PnCV^*Cv z`(M3#uBF^a?wb5b^3Tb>`lDiVPS+%NJx?)jg0Hmtq1J|sU1!6G@LSU5b;dSmYz{KrF*Pv% zVBT#$Oirc-eBKkvF5^@X4)@7`&Cs@~cJ(yuyVt(v>LD1Ce`(dR8-9H#QJJ=&w+2Z% z827fuR5*Ya&_HNvYHw;{iZ$I%G41z5~9O@L0C1^|dr@1^ByH{?9oj+$4IkikOo^d}$)*zxw#Q%{ecQAg-~1 zGvR!^sRf({PQcpyfOAuhp`EmnsBnl}hhFJHcCH_4N8RLx#Gqbqiu;J%<7j-)pELjgs0(PtuyVz~% z9UsTp2~*kcR)R$BhL+P5;z@P1kBA)YgH75Myk8J)J&PaQmowczL?UhwW!%cX_Zd3T zA^0B`8Ru!lexiv7&&AKk1wlO(d|*3b3!{l`JSCDhmi%Y}PkM*SdrR<$8j%B}emNNV z98RU@LCg({KB$LXTyrD4YJpS-FJeD@sJG||93uimK8M=r-$||U!r_Pz zG5C`c##DNB7LkPW#16{hM|P81u@67vG~G(zM3vU6RHN64{1y1V2XS=+ zRM$9aD^3S<>!LF1Q{P1Pjw>LD%HkD%LL4rRGw2jhjMMPUTXI76Q4#bKUdwh)i1YDK z+TyFcWsFu6Wq|um4TuqpQxgeXG8Uo^RR(pui*KY@u%aV4$6Uq7tPciq13PB|IK6*R zU|NKInL?DXsg|QoRd4w6ylI}@?*1;5^HAaBg8uoF^G@d0&wY@yI%itWH#y(tEXg^O z6P~*~_oKWI@+TKaj`jK_ETQDsDaPFmde`XDMTl!6GdWTnz7sXy2d;aSAv=ysvn#;`8F>#WpVXcl52u-Qm?jCj@B@3$b6$16 z=Q`{9%>BmQ6QhV)6XXQF@o8&NL#9| z_nq-N$p~L?4|msgS8{*i{>>fj+2i@f+r*cMZsu8V;8j5q_vTE#2>qleupbU37X`6j zEy31?Fvn+G_K^phuCy~Yl|PYIa{{}`IcX7RuhyI-*AwgAK_vU4I*Z)K0(^%r;d8B7M$#x8pyZ9?owbapJ8qnH|+H{!|r~MZLF%-J%*(ctu$$gMt*72ds>u%}| z!d_nSMW{car7@7cZ6#fnlavZPMK-gcs_7eLJ6zi4@@XQUX6Yz#g>HfP!Y#1Jf5HP< zZE9}0YPHx?&|wV^nu~(KHGJ4+mNVwj=33?_D1fz4F3DG5Ib8Eq^_*~?DC|}+KYwuk z#r$Ojs|pW09ynjR-ncV77V6$!0P)&YYHqA+@|u@gucL%EH0USm zXRC^`|59bNT+d+Fqt$`lcu!UL8doP*ZC5o{RaZGzF;_V10bO0^Tr=E1coc*L zbMYMel2NjOxN1$5dMRhlDeM$?@k5RgBbh?|y>6UX+Y@bUOI$F~@S1o|7vg_wIO9kl z9*)4p&mjK)D{-3N@iH%i%E^J3{RA&_ym15hg=5A)!IOT-n*4>h=@RlHB@7?H+iRq~ zr&dPU^9PUOIq$ydPV{W{bOfE3;@hQ;g9lL>tJY7tB9BmF&08#wtfR<~KDG=uWk}Pt zaqbEQ#&@4(EK1w|A~{t}xt5Zcx-qrp^Yzbt&%3-xe(~t#lr-)2(9Ekjg@ylmpBOBb z?BM>9HDX&Q{9K|!X;+zw<#w0bRL)rLd6_z;<4dkcyo5I6im1=SD~7zYoiZ;n_A(@C zPd$5_YYHCZj(N8>Yg}ef=Ge^DS>L>Sn!Bc8g>#XoznZ64Mn`k8a?y0fya`KN+;+y+ z(SF4q7gQI;$enhRJ<^tKS!u3d+68Lz0UV=kx=UN7{R!{(Jb32!Kc+hqfU|lPbnF=PxzdzcFoX@%o!DzWW}a-mWx9Y${5I*X->45k&;1i` zE?AVK-rc@iSkqcmq?hpkTx1=)pa-y2z7C^%8Hnqn$^esW{sY`@A2e?(@kEzQ+m+tN zr_vW7{kCiC$TZIIeMXjQm+uW{p(K3DL%uHXIA(f3^0xLa@s{z)uxC2yEB!YN1yZWK zn)CHn%5-I<(p1r@2++f*lArz*uj3zL9W6j&q!3{lPrT|L5v2_33p|D!-~oHE2K2#Q z_SEihRyH$d=b*$@9~@#|vQR(h-(x)srT4%(NT#XS`lY6hAZHHYSCv-|!Uek|75dv~ z$)3FqDK9pw{cG=wZ&Na#&U{kg$;l_t&(cUS)P6ZM?cnQ}w->VRl*XNe<9wl6)SjHRrvOxH3IrCXG|mzY)j$6~3G_OK6wR#`q(K9ip4yVa}S zD9;$zLr06k3;9#?X6FXyR>}3`j?SM`Xmj2599D<>)1@qMHGi9bu*lXn)6UOIMmL5e-=RpCjxIM%zU%?Q|hEtJ`9`(PbPb~YWM)C+dGAF2I z&>H(*blN^fpK}MJoFqR%8LGMdL>=gR=IP^p4r*vn;jDt3{D1P3^9L1tR5-?w z=xw2v*K<*kh%|l*kIaT1>NBdLCs`7)=SHF(|CqlvJ7J_xP)1OZTZb+A3)s(>>|2Ae z8<8NDzQ*r-;h#YUX(2ibpOGyp0d^pj`T;YQJ%Yk>`YGw6~Y<3-x<#pPmk;vK@TLMar+Hh31|XBd6o7)}?4G{b2ds z{I#jL@~2!%`puuHA5y>Y)$~Sts=0@t{5a9s#W~7(!r8@Ta=TzfmjFThitdnn~^y;s=z8v-P<5&CBK7SpNvE!{Vt6_H6cMEe2c`x%na@2LN z@qOj*XB=(m7nBe-EpmE{J+5s0p@h?kRg$EnI*HfgpU3@L%oEik;;+z7!Da0YtTW9| zl{&`$QeS_xw#{47eFdfJO8M{Qy~%Bx_i_H=g2|5Ft`9tR-$Au5y7R9M72#?vQFfTt zn!mObS~^%qP-EgFYa%?l$Cgv5_I^n%g5KsCrtiTvcY&eyFV=j8AqJenG0wuDDJe>@ zDIa|#8@1M-%U_clP5~{lhTK(I)Ll#AS^tSw;Q)Uzf~qv}-dU7v{~1r{J$DcHKkgBp z?%uJ!9cqeZ@%#N(3C9|sLt6+BSX*` z#6S*v#WBt#Ti9oQAq&)>yv$qt@JjxZ#OG|FU|*3_{aLR}oOv&L)G`?MS)6bEWY+GG z3ENKuwIW%HzSIrNf+y336J|r0o<})1HzHFM=dVp3aXZnLI_zSz$u&*q9(6fWoginD zNZpdoda^d2NXluLQj_t*_JbWS$JzKRt(#UFC4t#$V>MhYK@8Ocllq!YwP7g%5}Otl{J1hbu+2-XIW(raf(&)UHB^@{;O)Tr-d^ye{FU`#`9O* zpYKVo^6dQ6sn0AawV(g_GCsZkn+b0_XH|VyCHJ@dpB;@o3$&i{Fw2DCsu7)H_QW+x z$WDBd)VxIb66=y~CT>V59bY@{UQBG18g?vrw5^AExv{x4!mn!2h&H`K^L>`Pr0ZYD zvcjtc3k%eOP{$=_s=JBr2W^$VB~?9|5bwFn*kl_^p+j;~2}Lbvf@zqk2GNTVoITH= zwzLSpc!_ZW`}Grfko<=D@{9ml`VnZyrWVOI#XdRcLD1}=d3K|%vZc1EvvD6D=p>L{ z?e$AU0*0yse6_u=-8)>XocA4L9a9{sj&;tZu6^zY9vgLcx@#l#6>xHrr5riicm$^H zF0e5NOw&-3FC?OJlzK49C>dochn0`fWjHP$k@g!76aSrouev}tF`~mcQJ(_e-J3ll z4z5BcA`-J0S;>$A7N-yvR0HxV%g8#vC7u*TCgnb;h;SJ6Im8Fji80I|=3pkb(FPTw zZA5<;a{k{5zNM>Fk(pVAeBob=^i=s@7`^-D7I-Zi3=909>M`1L-v#eYj}07S3Af@d z3)9|;<@(V(%=ZC|+np%3?ILoq1m7jaa0g3W8{L#Y%=0Y8tWAmNHL)~;fAWxg`B7p4 zpBOHK0!Y_~!~dB@Br}YN@f46f{fJidrHaC7--n(IM@+seTY5Vy{r=0+FMfQU{=Ce~ z$FE+cr@lG>Z?b(4YHj!QhIbZqFp8B=h}!^K#V69-8+PvGr`yK&?VhUM+umP^ag5N$>63|0wIfRL1>BWsawCvC1Bh;HVr7r#oc{{c(Nb_z zMvyK>c$GVdVRRw4*Hc=|d%lrP#=XYAimLnw%d#bYQD<|kd9x|OG=O<_9{fVA)F)73 zY${o>rCJ5;Fejl~RJzIZF7|fxHuU!4WZ%vgg<4Gsy`jICp+8ll5{+k!&DrCgQC&we zWie|9v)hd~ro({#lX%f!l-c^CPCiLj&VI8foYf@vy@H(ce9#>uBmP}j=_7ianzyAy@;J$(QUk4OsE-Jf~?l6hW zupq0!I&Vc3;xZ9Y4ULX8*pi=-A+L;0h@@U-77@O+L?MHvN}T1|f;VX=HG^RyupVi| zk9$*NwU7Ux?tt<0x%vkj`U&0yuiq01NB@HN6HZs-h!9LCRyz~?oWpPC%%B^ufOQ>e zduG2GR4X_&$c5_ieT&unHJO_7@JsE|NW%aaP7l3i*ZcV!vi783O#Svri3cU`uDSik zZS~Hi`{y1lezyMkg)}vz!Mk7c6I>5{mkd`-7wxmc?nnI|dpy2IlD%Z#QZ-6%%c&(Tt;psu4mYMQgy_e7GS>Z}`?s1-TzI8gCPnb_1I1wjz^g%aZgge~( z)|aN8^UsE-6ojw9ULj|LCk8FERkzGgPD}Cr z^Xf%!3r~W(7tgcFxrQey?%LrR;~wYP&S6lH7CJ7Ot4%wH#aXf?LuvMr@RS;(_Q{kph68=akU(1{}7K#md=Vg?~}q)g%-zO zj`Pmy?o`hi9~xNxl~M=eS;c3{G;gq!w$3Iim}7O5YdeB6{YuMnb5GMtV{iEdd4o+@ z!V|Ey=fU=FqWsMMb`!DceD(+#Vn7~?bLi1~Y~$zCjIPtc*D4){R7+qPNLsBhH3(w!)nZmDCf z0EYW-b1Tze6o4(xtr(rk07Io(brOHwloaI)kI<|qSx06?&BQJe`oRMW+^6^j+Nw8!)U)wykH!Rnsa7C~abn}G_3?T9AV-71ac1}zNb`;RO|LAEZR3Jw z2OC3jg1-*_Ip{b0cH47mJ4n`hmethuSxvT5QbJ)bS4Js2-2KcET=-9ZTHczxJ9+c+ z4-|apsOS3Dlk1zK$4JwS%S^2-ldLsu-`Pe{HT1FdC+ZeevMScImQI%M%^#cA7=M!L z`_HPMdF!~pc9wB;FH9(GQteTJJkRYg{p3Fkhoi zKygb4%WUF}gV3I;W-e~JXB>k@oHB9?qwvygR*hr`!}Q(h7=om!}AEJq(?h<~U4 z3I@Pe>N#I?Upj1)ji`KF@n)fpmf$Oel44iiCKOr1wRZTOSEMv!g1H&Fp?`uN2G0oD z7BV2@Sn#Ew)%I4l3-HLlQC7%n4U6>AY9I7HmpHY;a|Ji^o8}kf>3MDPpXVPccv9HV z`Nnn8^U#;4DKOhs7&Dc0(_(WPK0v6&V0mpm4I-tH`Cn5hQ#WOzahZIPz4TucQx|Y5 zT?9@p-mu4Cf%DB~a7zF9-x}J;bBtA$`^H51zMkhfT<}v?skGqa=!fg>l)Uxx&4;&^ z-|g~n>C^1g#56f$e^!UwVucOe_tZRTu*DQIGxFD1TjJj(mzG&s?s@sC6~&c~<5bPu0y->VSu^8V_Y>{wfPyl{i#nX?M{Y=MGE@aB0gdtQ4!0|_x$y{@&! zcAS!al8t!V(NruL2^;ovX$yKKkM$eG@>Smgyq{0i^V&oI9C^HHhP6%5x{z*RpM)L;dSR0&n9)LzlFR)nPJYi_^o?wCG5TIBkVox@%Bx&LaWbm(cH~+(O61e zXb3~gXQjFUyBqBt<9X&D;V$l$+%??0-QRgOc`fR%s487CG>1*SQ0ZWLVybFxV}76W z!7`H_#rWk^wRDj?Jp)Q^FetjGh6d#3^3bHJNX4Q5q*>&*OEX>_z-j3c8j$jBknNMn zi&U4I8yce57eeGT%-4+luQL0z=NnvMs{k<*FRFDjweqO0%uzSMD_N)SGfXt@H&?Mw59t>^JMwsx6x}1r6A>Ps8*(}5 zqRnWXVlHP&HU0^MH5Dbe=jtS1WpA9Pk$W9^jaPVltDP&Imz9G%H&Fe;*mS)F1RtpVzxHtK9Dr@cZc zf^6?-&WYp6XaB&u_z7+Fw%P!+K9=A`HO31@`5kY3Hz?fKAPxTI!-Hb3$MCoGi#!xn z-85w^byjPU?fC_?+K=W=R7k96>Q0nSm3A72`#YjMcUJAJzDKpjX5>*OfKK`y1)#@j zS@cV5aFW}LvR@_m=`oyDYonL64a9gVakz@`3YKv8j|N2nGajV=Tm3_Dq)ot!4uh}J z9h}Z?c@xpH#^h}Nf@{+OZ2fC2Xa&PGbbjV*E#ctJ^fYwWaE*4Ba@GSgwbk{^-32|x zxmtDqEyK5Rl(N^<%yPh5V9T^m3i>&ybWj6(fpvn#NA!L-yzkrWlr!PubTAyHHq`OL zMelaL-jpgm{_Jl3o2l29T&s3t_U#WIWIZkWa&pF=oOuq9*X{pFxo+JX+$wx@RNZ0| z;_Af@NQg{ql4wZmozOeJFs@>3a&%ne<c?+%bA#Lj9zhv@O*3nNCIGW^SuH(fzGE((}Nxo0-rC|70;enWa0> zdT(L;-PFU{GN>~3VlPLAMh}a=9raaYz3^W`cG!=jb~zh0kb`)_Ox=^?vFp zSIAr z=i*gOkV_eNpbOST`CO@`oFl{hsr(hZ!{545-!|YP8z@hrrI3)e_YZ)C_le ze(~ga&U;j5*BmA+`FFEdQ9RnunO?f&18oJ@b)i+klFH z59&DHP&L$je z9Yt(@64??9>ofv3$YlSAU_xG!ZyJO`J6v)Yl<~wW<|t{PO_F3uy6m3^|F6#zL@@*^d~k`NRX`b+qi zk*%WIMh%a=8on_!EV!F(p81xsne-YpOp9;1=XYvoyInoVURLmS@y$}_XdTeiQc&ZP z{3fE)E2*Yg68u?&@qw|kLiEX4+Q>REr0DHYTiE8kO{?@Pe$Xi z56b=W@#_+x@Q~e zg72zH+;ao@xGAvXZh|DrN5!=vahelEA9{m>zYB)8q3+gFw0CI2okeGNgkdDL#y&FU z8o$EVA4XlBQ78&rBuf9l|A=_2tTj_Nq8yayYvnuS8;)M$7pOB2#xiclWB;4@+&Ner zbLg+#Fhv%F5>Ep~R>5B!cIQa$_viC}#Rj1Jfo5UV}WQK+x=QFqbP z#eFrwKWM%`P^2q?rsGA_vL~R%tjQaVrP1P^V9jRxg6S|0%apgHV=rmzsk5&_N78^cCP z1S#K~_~v(LkN-$5*%U6!7+C*?o_rvtALT z%NO9%SD8ndY8qer_xa8`r{=ZD`u6qAm+Mo*Q?4gJO>sZhU#)ucbJp(Me+t*So2Wnd zC!)Jk$&zfXYcEUH-V(%ez7GB&cy;ih;3L7yg3AW?2#T=xv3_7qH_nrK_}6JO(QrDh zCh5fttL2U+qji#fRPf!9si7l7*N0RLE^l9Jd7wOyUg@#wI?p;+6=yd`jAO8)jI)tz ztoyXb=?zw8*oQmyAHj?NE7dpNQ#P1Ka#C6yv^TgzNY9Yl!H0rM+2gHuO@oYH!!iA$ z+LT@C7)mV@y^DQrb*A%CUxK0tX-l>*? z{~zXCP1r%3$p?)l6iAOzzvLiQ(XJA8UMb!2SJmMl_|P-r zgl9x8;Zt-uQngL`0BSSdGyFo$kZ>|-qZALZ>jmJm+EeMOowAUMk*CN%ZUuWiMVqYt z=6g*9vnLVw@}S+`M>E4_mBzV_*hxqzYmFcejzG1DT$_>eOS1|9RhR|j6r{;yGDO3o1gvzqre?IWu z5>)nD?fu6a>|5%qPbKbaw0trciFDNAZ;)Y#Aj9x4YISkaA^2yfVDatHqxFH>aa79( z`5vQz^*Qlh1+|TL>Idi-fH8ox*o2!HA-eBoxxnX`~+NhX~(b6Tol{(jR+Nl)I z&g+u1A$vmBi_GlI=~*kXBXeHodh+W#es&qWW7Rj*6`qIv>15e$-D<09Z(vWcRkl^K z+AOE>AUc6Esluser2jM=s#FjWPHnc{9d#zRwB7inDax|i`qcKHy<^ajpyEM8?EP)w z;EnDnHe(a%TYoajVLg05dCL(i?Bh-MZuHGXU3~~zNOcSrlt|CW>(L==ZE_Qz`qz9B zWSZAh*VIrcY0Tra{JVcX{Pcgo60bwa^e6BhXVsfpjDM`*5i$4j%6+AQsfy__nxx~5 zi^z){0NG(C^R$he*Pm)@aL6Uu$@Zz$;XrhwV#pU@*P`J0{6-|VJIt54D6?j9|4b#y zQ^=tnV4lC1c2;{SAt4JhpBsoTu+m3aA5nzAtfdMf!)6d=+$= z9&qJLsNo3?m0&I{0y$h49=}I-vTIksGHfI&-iEAnHW`+IoG|B+Z*D^@@C+QvXhwP{ zJj91!VJGQ*z(BPF1wER);|U~KQZg-a3K4U1zATmm22cK1=sHzJg;OjMf)TXF3+R?#Z zZT!fXi9)d%t(r1m=0@ z5)f(Opmx`Tr5r|XZIpi|KmW@q&Tc3N=WrZZkYr*`-J~B;yyQ_)c-V=uHmmmy!kk_pT`>qg=X%QL^c32AY1AOsVJ%YLVfj*Mi z^IR{*-m?nsr<-$ZS-7`WYU!=V!$PAPW@H%Hy8UGS_JZuTvqx?NUpEW}Ty65&>G)}* zI7?oFZ}}GNKT#mi=Q+%s2*VQ2lS(m=N9zq>$sROxfqPaS)wSN}BUA>5 zagR1kCHr0s_17iz-BV8JrKnH80e|gJGMVMjU^U}C#-c7-Ro=&ZT5ilY)==6iEm7P% z0{(Unc60=~;vbPEoetZfjK2hPqB*R}wM5;k@LsY0PcxSm!_5i>_ga;TpLu8*kB~#< zop1myFkV;S;of6x;&|!@-wsj1iE zt`itt2a$+hm`mlb0n6Y`JTnx)mJdSZM`g6mq8ZT*4(M?ZN>%;&@M3q9A3h3W(gxOL z0x^t7%>L5M;|_2~KIdMa5*w+Cy~!rGx{O(s7?{CxU{(%5pLrs!fMDx!{s`efM3B=Mv$Xb3l?8o1CB z@Z)uGZkIrL%x7iyqJ3TcgW$bvCPL%&SLD@0xb_n6wiBG{N!SjT`86MG?Z-+bPiLW{33&L`o>UZy1l-0wZ^HUc)vR(j_;{?;A1??;)J z-(#Vg(Ha|j;ai?H89wn7X3u>z2QIQ3?W3pH(DL80MLXaMU*HLz1nR@wMMvQ*f8WYH zol7j>8^&iGb8jyH-;S^Ui2GVu8}Bibx}qyIjd{G4nS6mf%~ihc<(bFRs@jZ;8(;kf zHv1Snnf(FQ`96L+Piq|LPSqldJ)9n2MnC<|2+d^#hB2So!fUR}JSorVB8oMvpj~8V zE+%nLp{EvGu)J4UKuNg`D_#+PDPv&s65pY+C#W>-01;BAGtVWll?s zLkugZ95cNV_Phc+MIyfmrk7P-k%m3GKzlb}nHF&pUIYhg56|!pW=A9D$TZf@8fN8k zR>LG((1RKBKGza0wQvP7p05J^oyt8^m|5s1&6EPxf7~KR~md-pq z&ivX2o_s$&`xM&}!e6S;_qCWKmFWL6j6xNz)P(kQ;5xne?8Z+`8Ew%+VYJCa@7n0Y zSYBO`cQ#}%`4l8zfB0D=VQEbaV1p(E?*9c>=tQgP@l0{N%fT$X&n!GnA0A=-+@U9e zx&O!5wUMZ7Ok}+e=8mlxmGW>WqM0K>*fdXIKBQn#9tFm-fVPKm#mWICnpOeZ(2gE# z%jZY*rmzqtxS!67OJT>qO27R_kKJNFf5H{g8J`?hvgkcCcPYbj2t|t?aOnCn@4N9t zpYWT;{Jsi(BA&DiBUK`xRT0W{3z-4eS%ZIL0gf;t7rFK$ewWVJzX`N4g*(6F9#;CQ zG}mcByISzsi03Uu@0pkh`LrUP7KxR9DKNTMY3E%mfY8c7znQs|!Hg1fDxZ7$$Q27K z8^slcCnZLz0ew)L{;J9U-^bE?#B+2GJV_6}eu~9x$&=LQ@0I9Lv4#z3mb4A?IwB}x*A8+$jJf)L8DUKeg!Cf2CiVwNRM~vgg zj73v^SBcqTH~49HD*bYY_ovbuZr&BjvzH9qu`+8viD$9WpDvy;gZsS*^xX^W?<*`o zD&Jpnw>Rt}ulO!BL9zoj*~q&RX?0V^yfd?0j944)TZKKv#5{8aR+o(#8^{4Z(vLikE1%78| zp0+N}7{}ejp5WmsZpO#Oj1r0^nOyN1?|r~^AMxxdJV^#0LieSRHu#zKk@QeWW>g&G zX{HC8{XC&yFDfmrK$%X!ghC?z+5G#28A?*2iutZ}xXJy0pJPG4d zR3@zkOLHs!mj~>WL%J&cCUul7cx($(M$8HzYP@#Q|`G~J8X z%xY$z&tH>OKO1F^ee7SG*%L;w9?Q_DDa_FSSif)aPCv3g3q_J>{MFjrb1pXMIr=)~xKcyxLph#Rqwn7Esrh5+ z-Ot$l(dy(>c9PiCJUsoX%-lOzjx}6O=x{8dFMh+L{|OsC0WFs9=vH*%`&gdqZ{|@5 z>!J@n%6w4Rf3Q<*;OlRAAV08QjKR(b>(q_0?9Pbx;C|iNMcc80>ae=PXpOKPcLFQ( z94Cvvc)Atb_dC3f>Fj7i1LOqbn@f9x*|kFGS6jephce%a2i8+5=1nN8Etl5ZXNFy; zk8TF$#ZBhLUHT|Fu)4*%4x$Hyf=z5-cKTQ?>AXhFpvTOm3}%jo9!xZAt`g5x9g9+p zuQdWIzXm@EWg=1GtvFW_N;+9wJDt@dPF@aXJyU{l_cAJ3^zw7=oyylNW~+%-M+Ig^ z9M_KwtQKJhtbB-Pl9-*sQf2aL;Srg6MI~%wTXz4R^k7F;eO=aKD1Da6RiDt}WL9!E z&mh)?if1QrJ!Gq}K4SGnFrRAkuD*Co-v|7TWroG%{%7#NZ`lWg;?h{McH>zGAmO-2 zYwl2m6(7%C#A*(u$3^@6cxPhGIr-`ie1Atvg@)2=zNYb{FZmSqK9lcaM4!^5H~6^9 z3V1+k(|INrePHCt!&#F_0oy7pVr70R%N-*bTLT`Hljm{pRl;t>Gh=IFRU7hAo4zm2 zI*#VKq8agceomr4g(ob0Mqz0+)BKw7|Uz86&aY^8({i^u%I* ziC!oSj44n=eo`4>;d2O!DLgmP!y$}-n913UsMt5&@l#G&0vkUxgl77QK+nlRn|6Oy28b1jQ;Ay$LOw z??oTtWFVeF;X_!AqQ8nZiM1vCZt*)k&<2_Ji8(38L|6qg&msP1U~Y(&B6jJbHi%Y= z_lxtT%$*E@Clt>uUZ>LgI^V_BMVkzK3QHqeA^b)QZ8GpxoT8sIYT`Wln6;J7lNy*& zc4m{9S>g(Q?kr9vUhJF1Z$;0W`MppSE4sFrw_0E|3BO6^-C~@I?p$QyL=TGWYk>V|&Ab(Rp4fqfC#D6~j2I{J z9#_D=dikAbr|4}daJ}IFZ*9>tiSZ~JZzM*zws?B+M0RFrab|02?k0AoNPc6cW#S&f zibnJMG6CyZ3fpVKf(ZS)*Q_34M?_miKZz@eXA-kOjEbJCZsbBc(YpZC1uL!9XBysu1PPZfHM zMGC4idw4#pKhhnRrf6MZS{x0nk>BPIGxSO6}~J%sfX{)-qXu@=QnR@4GvXNx|HMq11* z(YwOph!GHTM(mct;{VTLiJeI7#$x9F@AM<0@WLtxyDqLQ-Yxn~v`NfwF+Yob>*HNw zhZZ}Pk@YY9F|l)d_=@ZZf0Y8OPgu^Pu@`+I=DYYT+K)6^&?z@#9zgGT|8gWdE3o>)Ic8yyH)h8;t7OB6ZS>)y!b5ozwkFi8^ovhy&4!#VYS7x ziqR9jT(pxEc?P2Ygv}E+y#(u5tmAOTN%WS8rU{EA#!{>TVM~j=3DGA-y(uhU(RvZ{ zMyw@qbuk{|6<%6eWV^&n7B)_-kfMlJk-aRkq+*tceO`>8xLVPg5HnY-8L=0LHWd8} zT$+&-Z4#{!mR;jH#e0iZOOcflzZb6&t4BPm7-iAxCNAJ({k{u$j6yy2E$dmdT#SR5 zrJ~o~;cE(CRp_R^z+$|^Q*&T3Tv#U26Ji#K7JINb+1P}l)1NpUDk_O&XV~yQpw9R;@{rM`YA8Qo$T*p zeHoq;=PtRe{FTb>s+Fz&ZMF7QZdC{?Q!TN6OrMa;%6Z?8{M3xQ&kavb-y3_o)vZr% zPq_Ev;|9+YGj`>D?~OES_J+OqWQHv_W{=U#AB@trb6n+xsHVf7mhD6cZI)H}X)}k>I|zy{1FbAnl_2 zX~EfdCo(K)G0$5hTc2%sHZZkDnlH0&VTzV(c@~kB5LC8(<$2YAdvDr%U8=XMe5mZ> z#L_XT!DE#g>NkboWdHp7&5M&M<&rBU-%9blSn|4g_LG7o)JwZR$#0h3EMt7SCC&Njqx9=<24~&Nz2s1Q)eJ$Vel{iKLD-du zl*rJi@saijS7_VdDBA+l0qLO@>Rs;qrJ!Ek#+v{Htj?nzA76M)pisk{lMYH@0`_8I`xa zx3W%By?%A4)w*BpM1@Ty(_&M?QY@7XUiaes`0TrHylLxSd0+X`7rdRCGu+|x?UK#5 zC833puVdQ9CdH19nG!iG^nz`((%oO%JJeA>?@V^}%pWtHZ$8g>@U~9&^xW}2o> zlv6C7f}_J9M}8N5EgDW{MCZ`P_U$HzVTjtwy{+&-UZ$v@U~E@*Sa?qWa22PGwxxR}%+aYylf#r8yA3eB;%u@vI2&C9C7 zV9&Rn5>x;W)tXUpYmg$rX6PKWE;v5qKya_1IGfqrQ?8}I@ciL8nAh>$w#--D>-~&Y zZ>wjWfA=J>rQ@8tjN01&S_+4wJ;J=n+|E4QR8pBDZ#1l>1B-T8-OwBxK} zzq7KtoOhYp+22b3*i^-O$8HTd9eOFOO!(ojMWF|So7q3N)K)wO)QNnWdn6c{#VCr6 za+mhjQwQj)4BO?2N`c92*=NbMTttKIYjX$qFN5SG29$lYfxcs&CT_RW;vDX1;24Q6 zso(jr`@Cl`&$dnvHq?e+uneu?`KZ=ZmWoj+c>yR_n=jPc#RGKOJ=9YhuJ{JEgucmN z9-j7DFxx9lWnmHQK+kKi*$*G=gyN#2T5EZnbOal@o=kUr{|BI19{T&CA-!Gdh5p_XSkFr6;TE7?>;bKDQ9p<3UK{l}b(YTgLe%MM1RV0=a6vEf&L^NlzCp!*I#|q7 z(i7t1^{INjgt&SEdir0ZkLU!4xm8=MZ3H70369Bx?fi@i2xqC3c?DEnyz!mo(7F*-qdts25xph4ZuH2guOnk4#)o|oa^L=+rKj?{;k;VS z6YM-zFfzYw{-*`g9kbmZs6_IWWXl_SrI2xA&8 zJKvLcFRyierGoK=lJl}_uVP|WNQwyW2j=0NBM84eZBSF z>zvCS9Uc1}H?SH1c|X^x7_#KKrn8p$wqy2QL0<;Fv^#AlQR6vH75U%g7+9ArbydCU zyW-V6b3FY#2T-Y<>nl{Z=_3r)3g`hcw&6ttLa)9e>0R^&Y^+PlWGJy8XZ^gICT`cWca>Ad~e~^UH8_6?R{BI z0f*PdFos%QpMb;at}FzZKb-k=+c=8auFKIY-4CwiGW(;4Z0r=qdptRlm+YIrQ1_-G zNTXj-h51>U0N1>jbdR`rBXHg0z$yKzR{*;;1J=RE+Lx&EK12s>Ih^@^WFh0p8vRWU zs5YFmZ{ckYfy0wWzN0#G<1-ZSuEIH82WsxF9u8_^7yEio@++BCJ|7^h2HE6AudykL zrtM($DDpvc93Ioc=Ty2b1^(rwE`t(U4f1LhO8NcZs=kwof&WaBgXCw@erml}pytAC ze1{A&Ck#B2cN> zsfY0l*YS}Wu0GB~_AD0@z?RCpFP^BwH)%Lk^2`opHGzU+19QI}kSXxnEv%S^~<*&tH#s`95 zTjH+L4f+YABeWm#sr~dDJ?lW3 zSVAfCGDynN%w`kSHP?VL_<)!}Ch?g4AZOO$bMB?jZm@ntl*7x3<{ookFXG@Txz?Kdz3a9?qG$968b9XyzU!cX}HPPiOQJe zna$HVImCi)cxh-WZGbS^|--}rlO?{vp zjA8=XHRH$yUk1t6lX@)eP+MO`Mz}oI;|MdpD(iVHtMe!JpSkqX=R92^XtYCtRpo~9 zwhj#122iq9@ztx5RqYSzbO4;UvocIU`4TETgHRxNtG58d--3!mS*n@uTeVVHjgRsE z$1yVfV36G4V>3uyleC#0&Bpg%MmF>ir;QrqRripO&c%+UFz=4Acil&Q_cL&zc6O~X z@({U{yiIa&N~_~+LUd6>RB3ihr9`|bjemH(o_yAtauQ%|Gx7yVv7 zaifKnj(3*L%(w|hPlHGGF^Fe_d`%u{Of`lnVah$@EMpvujNbTIZ&~4&Kr^3UcUz40 zlB8u=y>-l~d#t2o)Jid9_lh&ed!pA>l{!WB|QFzjZ;tgVtiA*s^_fd98Alzs7oGEA8C*EgX|--vDB<| z?AJT^Tu=47L;yNaeX9xUriQeG-TgT`Z92MpcYIH%t(gRp_dEXugD$<5ml{u@PUe&& zkf-$~?3v z_TWn&GhRnMe!QW&KS#^t3R~bSJoL>`$Dqw~#DCeaANK7&s%>vTYpwvlr#YAvCwl0i z;N3+vo;Z-?=fS!z;`0V;{s6DnXEUgaUxt6t2C5)A7faP zE_&^??uBO%!H1}Y^Aw$@Bj9*%;D0m&@tW?h#}04?0r3D>Z0 zO2IIVgg-TzDj~J;QEXV*^H_rFupBDkdtano9q}|oM5h>Wm|2GZ;BPblA6{L`1#MD> zYL87>vD@I;?SP-qglmL@a5zPEE(<=xb#Sib4aYzgAEm;=L0FzC)DQduEO>clfkf@j zy}m&{#kay+#(T;$5npzuC)qRI+t$}gZBDg;2t0x$vI{M+_OJMP8GGV&e94{c`q$w6 z>_Jz(P`-l}Y(4oN=<&Mj`VpY>r%9=B)Bcvt#t+f2i7@^t7lKc>8FFBGSH`F)&jY3s(Gz~M2-x&V`i{3@rg?A=U8w1#t=Yf;o4SQXe58#t_l<@A*y|GXO zeT{a5)pt;@fv0dEKVTbJr}g?fY8ozMF5aO!K%%-=9j^7%yZgJbGBjxxl|WME)ACHY zs(c^(dM6kW(ab6pmcv$Zg-_7ZKS0&9xmp~Y{DV|Pd8bySqUAc)`56@HCZf^qQ*WwA zsQM~v{k7X#Z!GB-M8B$oZ#hDZqIhsw^RXHg@x$`vFO2^gYbguh_t{OAOo^rp_$ z{-@ErT?9)06qHH}KtgV8QJ zOm&Ov*y{~2_MiDoY7MHN??UbVgtkoI>CZ59V%_B{Ii_`}mhLwvm@At+#!YfN3EYr> z2=y1jz`EOrI;w{9axdd>rHd)URKsjBe{Wi@^fwkt-x?JES?wBXY=zXg{|>d!7clDj z6OWvNQh!b6=R@fuS~<5c@~Hurq*P_==+ z!+*-q6%VhXw2(SlSyVRs6JM|=TE#K=D!n+H{fyT%C~&6}>=5(upgzDtRYR3v7S)vA zmv_K#9%)=lv;yrjPvHo<1`YM5+BCHuN(x?8(mVJM8T3n>ak_^;5C>|y!=eaZJt|0oGcFXKw=P6PJw zf#40A5#e45OQeL_y$t z5%`zAy`kJnYR3LN9<|d++AwWB_0Nv#pOdrb2^Os~egqXQv{Gt;*Y2I>8R$9XS?FEk zOINF~-_^wPcm$`ZjA1-X7D=DTPF;g_Rtr>S@BicJETE&vx~^T?635-$3GVLh4ucII z++}cgcL?t8?(XiEAOQmLw3Pi%=l#~ddXdRM(p^>e-Xr_$vyX5>EH3X+0&TVIg&g6I zJ&xRt9QMuXRe8HO)*5IW(!#tK(Yh<)4b_&QRJ7K5hn7q}I)QtM?FEOm$7qWl-Y)j$ z6F%<*S3i`QH80V}%0j1aDXhUoX|c2b{3|_cUPd{KqCk1oAFbJw@*ZiFSY5EAGnLm^ zh|;0R^yqSEg?!UnF=e+7eJ9n(NVAg@9L3wbCh}heb1x8$&xvG6MR~O%vloRa%;dh0 z21se9_%>6v;=NBPBb5+kqWl?4IEOf^H;Bb9B9Jyj6m`k(+K_1uXI8~hn320#n=`z8 z-0m$@Df*L#hT!*hpw`fY>5-Y49+aK#n-=uKtmc{?;+bQJEi*CCuQwUVTh?_bPdH9U z&pyu!w>65~b1G|HkX_-2k8H*?4G+42zr{h)2RuSAbi)cV!##vG?LimnF4Vq9qLY%2 zb(uh4QUhjvRlU(k)_cqd)yT-P%p`7DV4a^!`Q~GVv+wk#Pr; zcw5QCgNX0y(vMaG%w{k+!V)mbieeKoa2K5&dCApkU^~u&R@^rOiFdvdU0%btv?W^} ziLWh8{Be>#iB{ZY8ZyrqDo~H9gY70pn1H5BZ`NoePu|!08AiU=g?O|ZnsynPHd>0v zZxMyeKH?473-{^2n8L~%)-ZCrzTgrXJz76GzxBm8AR;PwMi=J6ykipAPlKkwfLZgJx_`Z$VVkN(<#BMVY3qv{khCvzI{I`lfnGIf_@AFD_(le$gFv2vyy? z`e?ne-U!ugL%(QTHf`h_zob^mA~lSOBrj}L@O+!(d*UUgyWi4sdtbO^_fc1rYn}V5 zr#!vh576it#jN+XY9l;lM!Va#!WKct_fL7h)KQGLrkmM}8`@IuYEOiFrh9?=7wU3* zy^&f~V=JH4QCuaRln*O&z^@nDcA|&#il|_NoI@Ha+~>|zbo|dS_oSqjthw||W+ha= z>fr@Xq9ET@?k-o7KYM?mfpu7hGA9}=7^`I9jMCpR`M$U$t$pL?a=7#Yo0-Oz7Q%XJweiA(ZU!@hwfuC z$ISSQ6(Bzyv2N|itSWQBs^f%yZN0^ipMMQTUOt3CfmI{DorNZyrCTcH66rCOfxOvLdsW--R z{UhD_BfUku*}Of`R{K}85j9odvjV_s7IDr6(5Q{r*uLZ%1v%}Tc)Dxx>Q2xD8!CO@ zn37i+jAK2PC$CUd>_G(7O-WL6qtP5jCE~91iMYKZ7*I3p!$30<)$CJxd7|`pT4`N0 zikfGvz9^BLR}`lE)nI4uW50b?9$_D^ir-<`pMu}thVy>Qsztm!2ZZG!>Xi+N{xxFw zO42v-+`aS;&8LYx$H~a*txyzKUk;W`Nj%-xmu8tW_bW74n^W^u+M|FYiExqYI zY{%4R;M-5o+wvE?^8Ci&RSYtw>r9w@3PN21U-Qt)56&1Wl(5s-0 zjj`2P!R!|E>Hz}rif+qI*tH^flRD%|CU&)zP}bUS96>3qk*iYDvV?x|@o|~s6XKgE z1|%D5pN_znWo zu%)5$bEUYggFUBXEYoC0*_pbcOpus&Vx}?-t)JFIdy4AfLF20V8ZGVK#O^lcm?x8A z?II!zBNFn>Af87T_FeEE20KWR#BJrsu_d9Mb=Is0z8cDGPE8H z8%mPwFK3r(i_`Hh|A9`#k)wu#=uQK#yTMK!3%1#Z*t04)#5rtq1pOTf9p&AmT};f% zNtbs4X0(M#Pe7D<3a72Y)T^e`cRHBZe+!Y+Yo32D`s`1Tv9IRRdN8SK1RArwh2d6D zvz}2;pQ_olC~q!pwN{@rf(IOXqC|@Tz~vv-X0rZ)5ko1Z7!A#{3Q>xmHR?>N0+IC%D>MuB01#A{YJU zU(iVDL0sf}4Mcw|K)S;FXdt=I$^W~X2bo{Fn~9L;(M>DDwG9{6h!Z3`Don?vx8inG zA@3R!^x0aB_c@ABH?)2F4kO&0W!2_+H)U;;#p>i}kEjb)m)poq!SC+jqaK1vtOw^= z!mQ|5tko!H`gCQc=mapR8%%X6%bMMyA~S%BfB`yI1Ee5{oi7VbsNvi;vNQ3hE_&4S z$*leuA5D0EXeAGqK2ZzQq*K&j9;1x@n=ISc5wU})Gc9w)+LMW9r*71NIrhy^M3}=& z&0Zi;FU?|n-XUVI-JGD@pq86KEw_V~4FWCOD^%t_Ua}(Nu)8f#yE6ILx@Jv!>fPo_ zs~%Ullc%_V)3JmK&`EYi1G47>L{o!|tcH_Jd6Q9|KJCjy{;iqUHh`bJ#NO*nd@vac zHiIh5Su9H%ym?#Ft;Q_gi6eu3V6ErghF#T(Y z)=V3q?Icg_$t<$`)Guyw-orq7Mp=cB2agdWq?__o6i+g!kMUMP@=>vvu)@q?d;(Ef zi$+Nf?T_YX)HauqD@BQqr75x-ztap&^<;YI6}dZm{3cP02NkYn#x6ZKina%tGby9@ zl^s2%*XAqhIa$_DsXcmA!HR>7y0*N9szs-S?ySdQ|=>-;*cEUQqZ2C_MbeFAgxTp#yUdU)@>n%GW1)73#QsKzlBN+`5Dz zVDKg$KY^*aZJ6HD8GVMXmVgq;L1OD9P^Pu;kSc>JZe-@e9d=MG=uJ&()Tfvl?U0<{ zn>#^&pAvDNp~A5Sj4PbD`3>095Onnp>p8jB^`L=6usc7AuST;gqfw{23R-iMI@?@M zq8)#BTL=JWE=3mjlq|V6r^2W0_k`CAUeCbIeO+Tuh&^Rc|K`+wdQi`dA!~4BWnLLw z(K(cuDYF&LgiK&XQ9R8#=vd5=&+}v^f+%g^RF5J1=*4d>#6HG@=8Pw&$YSb76cK|$ zygUoVx?Z4EeZXkSf+8%Xra1$vTmf5fmdq|S{;vho2v!hvm%`IdB0r{@LcAQt1fG7< z9_e<h)OzpGQPY(iZKVj~%jtFPO z3n)BwXNp252+rYXrKFOBB!gTjh${3hqoNU~e?$#AGnVu{tbugkQ0tg$nN~U^WyYp7 zl0|vG6h%zot0sBTDY%WsTO_*mEt!duPj9Mk0|SmlqcI9xB|y@pOLBE|%DONUH%vZ? zH?xZsu;usBbb5vcMGvDLdC)Et$2;ReE0B$e)V-#GU7aKPcuT}%!yZ+}!qnrxpQ&nj z$p#`&Rmn~?mImdF3+PYWriOi0$b!|G2xnjh*;0RMBTd9wWM^5?1olk~noJ!v9(!Kg zI*qqD!;XDH6>O}&Sr@3^P6J_IE9@0FfpA5FD%h2Ma#pzudz@L)?75ZX2|rNVcu!5| zAM>7B5et@&J@kbSGpVADp(8L88W1(D{X`TUjSI|~b%4tD;q&5*K}qO)PXh^6GTNozKC;tMmM8!!h|o4Z0H*p>t&46|DfYYGf*3 zb+G=ksfLH)J#U%~&5K4&BSOE(-fIQxB#3%cXZ&|l`K_Eok(BkYTe3-IvGrk89b$=< zu96|V(-tscw+%|RN!o6GnX%veVdY0TzaO|*gwj~;#{`p%>N%wbsD55~8nyo-RB&!n zXZsJ9%WRO()Z`kWRI^_j9n7!TIf?!Cj{L4L8U06mU~aCuGZrouWw2~l)4rI(5Y8_>{^j-+HPNSVPSUc)1=Z$Adq3)@P znss*Vj5e0JbD=N|(?jR|D6T`7`V_cyMhK@nsWyd4OF>k(;o0t>f;5S0MoyI7pP<^) z276fod;CY-i#>h}zA}~x6Wf$!c!J+@Yk8J5muM-2b=epM&eYJm1x?#v*DF_mU%%1}9BVYLI-x zmEhT@AG8igjnq(kR>yZfE4LCSG&UA{GAEZx$Q1W5rccbNm{qY6aXp#(xhuJ`+v7Q| zEi-0XJH$t_KPNSwB*V0CGto{L|{v)@?qdvpRl>&J?N!@dp@sU}&pS7V{E-ljg!28x4gi^o3q^7OL z5%ZgsSL`j#K?l462=X`Te`(a5iiLVj7a^?`kF}_#pP{BwU#qM2(N<~Cn36LCi?zTg zMcv+~AlpRDAl;H$$w%ae@@dxpiu4=wA2zZ1iRndy^gx}c0nhw^>c~%HB2@qXz(spe z+p9?(StGZq!E~p~)b%C^dzk(xqdj>MKVFOsye@drN4<&h))-B86J_m1e>M|%ZaTRR zNS`9_1#{lZ|G08d6oQA<{2n6*8xC7GqJW9Bd>}Ybyy}QXea7$A*u`KVC%(GLFnYhHPd&817YS zNatYST)_jS!ZJUnrXZngHWj3%JSTgglil@LUli}d(B!j&|?(>V>XBBEo6F_60qFL8TGf{o3%G~SUpvw!aM4^h* z7PN4Ka$VVsZW~n^6pTlr)LEDrIc13V7cpJAC@bTn&Qr$hPsW@E{5zKVdjyElQ}Wvd zpm%Sn_3f7aA%dAe{4xxF&lZrr$}l2IQu%6uCQwg$zKEiWX*~5}lKi@kHzcry&pX-Y*l4y#)bK$zz6D z6NO#q-kl~pxWc@z`ATl(3@C2{c>oAfN9LgpS1+oE)cWdTWsck%-03^Y%&k#%&Fa-$ zW0MxfkBDgzJ?UqiA3wkC{kHP^j;M{ltH+c|$mY7}{buwR21yaJLycE2+s51TgU}le z%dsD=f5HAxoupKdGfPFuWkNtN?!m@L54Y@z(2`vKlr&1tN`3Ai`kgmqB6czm(fn68 zQG+Y(dFTG<>3UDUY7)A-IC0(Ez+*6%tn861QxWQadGM-rTmRIomFfn01fTzY$I z(W|r#TCBE;J-^UAXMGYpVieh23sx(O+DaX#PN(kEgeiCb5DP5>J;Ivs29oUVwp}F z&QC3XBQuk{ZVu?e7O5y2(N3kZQh{0ZL*--AZO+O*YbO&jBlX(s-rd?Z?G}~NA$kP$ zUENqkwDsPa3ght>5zQ;98rj8K@~#TtWsC0BFBnzg^boCv>0PpiI&

ZZfcBmZP4*b2T^4?C8X$=xTp%8uyg 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 u^~(-xqw_$0&yV-1{amjwOGHQWW|=@ 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

~F;>sN(yBg|qlWlFj~4XjHG^uR1U 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%0AOy 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�wq9pTZF5+=tG& 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
&fa zU3qo)*vrx1YGyQby%ZYx6_l7?X+n)z5wUgZ)>f-}mN$g%@Vdk!ZJid9a_L~>5s@RTVs{@AnHSi9%Ox6!#8>!>m zb?w&tYq^iD!MX8y?F-&HXlb2Rh1;T^Z9eUp?_JZkt8cVV53iw?1jBT`fQpt2owkB4 zd9IxH*~_z@Wm&VctZVX57kaqnNw?Lbv?rGc=EDuTMLL_{1j}Cw_CDPnyZ;>dfWC4S zFgkk!skcSzL3d;a@MCq|QD)KBT-y?FIbvyOnQHEZLdz-ow?Z*~D0>d`I|L+aGkG+; z+*NqJ5&KDHRD8W-VQ#Vj|3tA0~+)T1|Q8_QkV2v&93UVEDok7g-qkIZ@ik^&x z+s>$ z<$G2AP;)`;!L^20yIbLY@l;_SCocVaKkJ|)jP>y95^5_SRsB)K zoXD+_W9uxc*|th}`FSP&3H0$^XJDAU;=zLPIsc^pOfK{He}8+WWT&6Xp$kU4Ix79? zR-6~Oz~2geh10yiPv#2QXm%>&L$g{_`KL>7uarM8XJh8}^vtvs=}R*Y<=n_0;TS7T zrke4m42vz7y=wTT`Q7)w?f=m4w-4_%z%1w+vE9^7?ijnApOAam8kGAi?{dK=XDQiC z=kg1UQ#_V<@AO^l*T>J(_nX%XOF3h(@P$66oN)U%_=5d;Iaa+jF=w{*Y3{ZBiiJjJ zaj}~+l8R#Y@B?)-^iP4bsHZ7#K# z-p#yZf5EGc2LG^LF!5{Iv-BoyrZQj3c0Y90c9nH)bxlR)rBM0@(VbR6Eu}I>PRBpv z>lfjaz4*I8*aT8W)lVKQmUEAFb$2~>-EjLz$K^32U}b}VY05R{=WX1K3YFe zmj|vlU&g6xi$EgGJ z*ZisVKH=f2tDnxUIq5oSIbZGi*vH2{oc}xC1_l&!L_o{p-OJ9bm=InV9$ZN+yR&#; zzz@>_s++xJR;9la6EFO%k#sG6UBPi`tA{!CM1@r~JnNQ-Diydwt$%d75!iP z?Dl+QTBEDT{!ssl6P&jSlfaN$-PXHcw7r4rtTa`NWn1b#8M7=gUKXFfK0kdN-Vt62 zmJP;y!J93q4U;UczV?9y?QHJ+>9*Acf%b2Xv##M{j?_@;qP7GI!9jhY4>KdcCl$cG z22Ob|{ai~>mPtF@9++Ejpt1D%$v;5@!Dk$GFLXe zH#jlJ`fNN^U#%kF5Z!KCybkQ%8D*vx0Waw(JDq!p*M8)&IPNAph-KLcVD>slb=N*B zEs_0Q;XdUW=-Tg^;JzXDkV~jPv}yEX<{I0V+lzM%GOO<;b}HY!c~px#p+%5G_> zR6(jOZA5IDR;)_4ny1+)jW&P*t_*Jyo(R=+#ewsf$p2(>XmpkV5?vI#iH*S7+7~GJ z?#eLrpcX^}>CLy($C;jZ4Dr5%)!Xb*Nq<(|X-i0M_G#18vbQQGtUSN-LgTA9@0nhI z|Nc9};b_AQH#PI|F4jJ{edy${_hJ3Qu7?~BeBv8s$>1JHM{Gwk<>Y;TB9c=xIu*>( zYFNGp8!N1=F|+QjsM3*_YxStYl)Dzzu-G5(yOucP2VGg7X1c3pakIU5zAYy;Ygbm; zoC$dz_F>{5?GYERFJ-D={$*NhT&OQCJY*NqQ?xnCOztSL=6%m8mu1PwPh-+Y zWcX!gUhIlUbtl>GsW2U90`J=I%p@uFIdVHF;L4M@!>6~KkSV$pT z_r$&l{_GzqP1&G5r`Dr3K@Y_9ANnsDnfAbi#zj?T6CNd9sx_^ZI+&$(g^-HawJd!fR1EK|4q#MdjO`)rE zHH0U+MEz*PXynaG;BNN>cRLdsPe)O&)k)afFsYlEft>d=ag20V?x<#I;~{zLQDb1{ z?y(iwiOfE*AaYcFZK%3fSuD?&CW%YjuUx}iQ(XBjtGg+z-v+fA^_2EUl|>e}gtzh$ z;9Bn~l!6tIIf46wvoQegZ>4Sn(``C93v=b#U`yMgqJEfpz!~(LO^F^&ym_CwUUkhj zu2B4B-JUe}L*i5WovYUmTswU;`oYnc3qQyG`JBDMK3ZN#*XGOV3ygY?1>SZ17X>~F zE*}yc)Z4F=#fKXtHqNh^SwFQ&YP-xZ+cEi${*~YI5|1mSR=HR0eAR*B_sS)d6hdnR zcJQz3yU_cDXO!iaVF5pw`X+9$`{h&CJ=tY)hU9t{9CPlHhtjM0oBBj!qUn#x$F$9G zN;j1M%T%NKDwD;<&f|rY?O^VWoW9w6vNmPa$d1cdkQ-pDZa?c-^U>Egowr1K z9`O`C%3A(0CJBX%OYMvtfv4j;kQ&HdIV-p~N;-82wTv0f`3hTfjA4ZFp~+|o@_6Ur z@|faL+9H^0>yx-n^jqb!*xHrgFgZFo8aS`JhKfG&TxFfw0u@5v zbY@+wFrN42MlegLJ?am6y0i`F{*ss=)lhVZ-?*6TTvZ`T_gUwu|En9XyD5C*e{xUR z)67bG0yO~gu|RnwSC?N)+ofI7JE^gp2u*fGy$WP&B7KkP$*uz%a6GdP7>?6wlp@HH zQnF~4)=T}tAo@q?2rkdAYM5$Ab;nipt2P}sn!$XauDO1nzMTGx-~`eu9#Vc#F`-1S zxAIl#4*tC)a6iUt@l;zxuR?U|47E-DOnnURxJ%0D!Ydi~5-)yu|FYo8;m5C@x?Yv} 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∈^`!GI=O`{$X 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�H$}{~1^96rYxG8MqXR&XM z!P-LQu{>Pqpw%#UaTTQ!j*_lqR~OeG4%Q|J5qZ%6nFicop@}rrcFh)N z>nYynZkY!)MGl3uARmee-;^`eu)fBePe>R~&Edvw?X@yco*b?l-Vk0PUr>VTW37_@ zL1PIWyo&rEnL9bb=b_W`VlCZV#k*}8j%3%qi1razofGX_#GBlg%n!yU{ZIWTBh%c- z)+7w@bm6?9@n^VRY&28Ld~4LFn&STKX)cxDBpehZ;RyGVd1&0xs;kA6XL1*1iP}LQ zXKrTC@YBRQ(sJ8l+ZJ1_t&P+}93!mYv$!#Y{paG`TomEwy(LU@8%d$H<};(Ik*MF$ z9fU-lpDOsW$@9?6EN*Pjo+}0A{h?dIeZd}~YvFT>q&F}Nu){f>%OniGzU~?lPJC)_x$y7hMgzEmX&3jBVw}g)pzm#0I7+Yg$v(S~>Y<|$@E6>7}!%M=f(pbwd zR1zGbqF(|SGMv3NH2AeBJYA=gsjI2thwgS=_{tLaZl3v#K1cgk%SZJ4i0#Jn!U=v1H;E}n+~Ysxw34UJHZ(RKOaFw>*;R>1iwN&-K7H<~i zs*69_ezCu@Ef(LfbM)%+-+{xvb-n?Cf5YwdSgyU)-tmL;fuoacGM{3MQT7GD@~`x* z^^2j|NS`;nK(0XCjr#LZx5FsH~4 z8A|71Av2Jz%H8B*c$Qzmy<}CgbZVOOjVR-heo{ZB@1b5$HT9EPA?-WWr)*XZD&^FC z+DP4P-erE_B%!dlTihnv#1H%cZas6)$fxgDH!3lTkMKPUs1>Pq{Xv6r?V00jDeBc; zn!8FJzD|)ncbRHp%b96Z5nPS5-^UOYS1SSlB7( z{5h^L+s!<$|D-)r�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 @;>_c^Nz9U$ z{`?utq1FeX86AiFW2^G3-|&+9%hjaELZG$5NYy5|Dxv4q)E1yRM_uRi{MJ4)jzt_B zm?bkFp2k$i31yo!6`OEc@2y3+intn*7ZjQKT#r@umwzdJ9AR!Z-IlsthWYSP&JFWH z$6KulLghtv=8X|bbyX|uPEoQBBJ(&l(|w^EJiYZ+Wiv|u+zTJiwVdwM|O;l>RAgQg1moX%~%D ztALbUIir4b%ygTB_Ij`OQ^2u=tkyB2*HQXDa;7Wck4A{!rLy#@eV~?dlyUr22QjgH zyWEq^`7Ao5$FLix$%b8Xt<#?BVdgJukhp~Ei~VwpT$$O$Z>WSF!W6gC@DzW;ojlM**LB=ApD(t9-a#OVqE9X>CE2&bv@Q%p}*NLycyPCj*`2s)Q*WiqOiB82%z#6mo~U+*^h|mw?PcN> z%woFSOa^U?poXnE-2NI&hPy;3y<5^nszClp4e^j$Dle6iY8@t^WLKVodbG7dnLpu0 z*TJaN8{~bzxmJ+RtR>tPzcFupK3(QLq?1Aw>pVTghY%0!O?!8v?qt9p*y-jOT+c}Qf=NFA3wKlK*95(?8@sJQrzVWs^uDTXwzawoIqB!opX^vM zYB++aIBS6(`a{fh*SZSp^td>kJnAnpxmT$M^1)P2U7~_vAN^7aP%q~W zs_IaNsQn$Wj^2)@>K1vwc!m6IHRkn28$Zp}!Vu8a^6FW2F%=3C%qf~ARJ0m0kLD8G zge_(xx>t;Y&#qwIE^vn4!4)`e`qL+>r%~S+0<&S1+0d#%9aR?Qzn5bUO?DVI_h7*% z!Mv_$F2?`;Nez`R(~_e}j4@T;!)&qj%q+WVgi&p@MS3o8q__HF zB;l2Gjb5|QEkClSweY#N5;eZZx+O64b)Ytty!KKs;2vOa?_t0e5RTFrN;b2>az9UW zc1>$eoRPrPxVd!e3CAP5kX8{|fE_&!BA*?!`4F|aqxe0A+^5~8=b1T^{C`cVVAe9v zB|n_ojIuz7yWC_prtsw3!Rwq-9Z=S$%!wLd#u3|nhRN53*&@5CYl>SsP+uE!xQRXd}9GrC&8gfY@n`KuD6{#Nf2I|VDMJXnlI$3BL~aWnO2 z%E6Q@seaD=u1)$$csYHfwfJc1nHNx1dL|6C@|#7BX|QoR5J~2utMGl!(koVQC=;vd zGbcHLm}a!qllA}3oR&cPUuG7w2#MwgaFu~n0)~UNemDM@>5wZ$dWHQhrCe58F)gJD zoXr?V2gh#sVa8Vi4@OgRMu`VzHwz1bNrPI@TaQ>m{~g|B$@*NFS>X%2Gy*NuE|((kbfo#}p@R~{;@BG>1{ zqpt-^I}%;jjLP7XR9vrwLDC$4$YB0nRE!b*s7N>i4}F)^3vXersEFgab4U7W)}ZI~ zXy#%>z<=Ecel(mJvrZUtTDjydt)tJ&f9UZJrVohfef+*1#9XDQ(yNCS6~r=h z#Pvi{i{VuS2{K*C9#Ky_m&`yoeJ?suY5oXgIRQ)5hZypwRSvCSGa0XlzEq7Bl`hl6 z?mHexN6_zqT1lez2;IX>uu{a=awvJ*C`Va1Z#(37q99Z?kLZ(#|LefS83}JX4rbv9 zY79<^J>>+&-;qFP+(WQhGb@FqtU@j-MRI5j;Oqps1X#~LMtv&yM#Dt&W2#(cPKG}o zL{n-u&f;O`f#s8#YTPGO?o|X=+QL)6qzWP*)!P>QwQb^RVvjuV!u_z=a8U%&8pxE$ zR$4l(Cm7`n!vh|vE*1n6@1aak8gfQ!$+OV$4>?i)K-g;0V&3Vh*zpS%ABG0==k3{D|Xt z0|TgBo5f7*1LQ2;Q)}CUdW2Wh24+NJyAbiuwyM*ysUbbmdUK+eV1b6h!o6sohg(~g z{vuDP1IWV6_e(rk0Da~%u~LJG*F5RU5k~Kba{RwD)b2);5pIKbcOKS934DqBc3w~3 zC4EGjlof_quX&$3W>rq<0`zwcIvV_iGe4S&;YqCbPolsiv}JZPk-kNP==J%D88Yjs z99lxPg$IoK%0hN4gBfVt$8)V~_+kOVgz4fKYCjvvIheDF1j3q|gElJ18vNEPf`a5m zKNm%(2s~#L{)GY-QCqA=U!zZ)vqI?UepuUfbaDwn58Bf*BIIlG3fU#uosdVP+cv>6 z-DLDN$1vIBrFac4N{IX)^G)lM*&Auaf@l{p^TP?M41!b$DHiFEPy;W`0b?v3T6Q`2 zsSeL7gl;?MvFRK!z~esA*WGOTU|H}H{79D*W9#G+DzTsq|B0eNX^ySj_HnK zj^gSGSx3_jGn4gaT5c`Yb;;#PF1U`KmnyUYc<3#pt8!k|*RjGe#IZn4r~D&7+T3WV z#W|Zf7dm5H!DPZm2=%2kM9+PdUvg%A*uUTnVXXKAbXJnd^gs6FF;(INhy{KUzkeof z`NpZQL$3ZCGmhf*#l}qY7?X4UipQDiT3Y^2ouvYz*?}&UmBp%JAv#5kqfdV^YXb9> zwsJ-#v}XhQTy&y)O&>UkE2*cDh|kV|^IWFF;4*dmxs(BElLnLEs)gxaz+NutaYj?V zVfVg%iQEQqj}P#0Z_{_7HyunG)4wR*T#6NWhy|X-yb3q6P|Qn&1DTiJCB@0d)uC60 zNKJSrkkU}O3z_$q=-b;&54sL>{fMiUHc&5Y<`!}?fgy`}T)o5`}4}&d8@JeGfKG+8%klflNShcyt*J5unsI#T?lAoAL1w|*L1vT5Fw5Qr} zT{p&9KZFvnNc++I`3)LoxcCIWats}13Sf0&#r<@0qMuN$^$P!bpzel#Zm!MrpdLJrz$% zqv1;_R18&-$4iIlvNoPxMA_(iS`%NX6jQwWbK*-Bp;&u6sRlg~;rh`+3SocerJg`S2B*1#>?@m0A;C1a9tN2}uM=IrY9 zr{b}-QH~r>X(?XvXa8DD8`C<)&7n`vYr%``?P0X-7h>HudIK!|S=VUhG#oMM2PVx| zj;gsF_u;g6lh=uFL27avo%B3F>d^?weV#AseN2%&Q1hJn+vYaKguC8Dpz9%C*8-gDmPZ z=Xq)fx*CtoM)Z}wARUnVQpaQ?8-7%*RaeHyqsZ&(Nb3;h9$cU|#vN^*PPb*)K_Svn z`Gyh!|6z|>O&tc(8cgOjmiY^13{O3s*4Fjc>2&sn&1Gk4%g`_32q@2ctWlsll4%Cg!P4 z%$I@ba#i(Dx&W#YC-kL`@UGHdouw94hoYT3OU%99Ny*#|clUjZ{ zVhl5j2>-+tRDO3Nwr&LjG7mV`bz>JN*H2%n2f#8JLvCR^XR{#Iu{}OxkF;vV!En$D zxIKjB_gUU0wy|m$(b^#@{=T}dYR~mI#vbaNYJzNjr0(Jk*m7nfOMl*VKOHxEvXhnY z=O>s`z~)NeW%*IXRFye$2gw}PQ?D{*;X15}Frgjwl`d>}ILwNEWPGE@ZhE32UYmW; zaEs|5H3Tlo3V0M>sE@#l!RuOJWMG{a>Kj<;4n#i3K^|J6^`bCrG zW2R%cuaqM7s{E*BQ$qpbM#QBC^M+@{SK4X zqSIOkR<=2HLEnt##tUM&|M1-Wz;CaE-+mH&*r)6Gj5&m7_@=9{fTM|$GJ-GlH1pwY zv@lV5a7KsA-U@;+uBl{30hyYk&RlG@_VMiJ`* z7H)zxLDI1dqlpjB;bZNDSvXYkg@ax~4x^^}h81S!H5%w|i7rM{HJzJ$_(7{CezhfZ zBf@DRy$9QfV~%4SnWC1G6K+x=(-U@qpFT#fLtcI*(+m!Roc5Odc&}sBpS{P&jifH4 zx-pdr!28S*^x071AO03o#C`a6y}&z@(YJHpu0&bmh0b7H6|nv;(9M$Oef>36M@{v6 zhPx0gRZ`o#ZF5g>_jPaOcqV&`lg*xbMr|4Fij&~MZl;qi9w+GyIE@%*Cu~QPca9}% z+Z2Q>Lj1|I&e7Xz&s}-6Li!ma+L}uDfeb`I*_68YG#T*Oc3~|&h_P3S9f)Ey;%ftM z__K9|E>51tQuyst@Mas)t#gstk<5vQ7%!fc!sU2k)*rA?!ldlt7C4os^mWWyzeCPF zFTCK~a7va*9!g>Lr20Y)RmUpD3OQg}SnIu2g4tS9xueZW?DTSkO$_o})hJ zM9)Cy{1vV;vGKd>kh2yH(WT47+? zyare65OdvTsiUZ#o#R-l=1}TO!NN>aHgs(;Y>j33ehcxSRuI2$BHvRP3}C3Vg!;N< zoKQ5}tP`ew3&^S~=>F+`i4nFWy8f-kdujp}HajOJ!GNkFjUeZA1V5-N2*z<^ov{Z0?=ej09_Af7 zPNi6zh|r!eV_=9h9Ix(iS~X@tfq4u_`%UJIJSRG=ihr^TgvlL`r5W`>E9izOh;=~g zx5A~Lh$j&S8+#@*f$!_X^=Z^<)u)HWY~*8)vYDC28`V8ZNqLaC(0Xl*(IY_3OjmpG z#T)uTV+Ut(8mp5Y&dWEn$vQe%NFrU!%)@a0Hqb*Sl-l80RxDK!>m^gt`JM^mdOGOH zDEj3Wr!!@DPSOc7D+P$IFHu<@Nq3C|`p(v*;-w)O9xA!C_I$o+|LARz0ZbuTdO=O9 zL?wG?=A-1K6T^Hws}5A+1%N6~qz`m=yxJAwNUmW|0O$s{(*z~^hbI|8Pl`>%%FpP+ zcZ9x{Rp{_C3JY&{Ig2(bkg;2fb$Wm$tw-hI2cf%k2R_mQQ2t-aX8EJ|(s~NVBmsML z)Ad{%NI#_dq6;Sc7pfyiDpTa<__YVD$>ua__dV#;P+coXSFt-xYLw00)-16HjMW^D ziH^*U`^pC?LU1?lYGqu#oQq-EOwiAoeqvQBg;%TV$u6&z(@Wt(CJTR(T@N$qpbG|6 zRyrxgNgMHTyu=USiA|X_)q#3OPv#%q*V~(U!AGXZyOqY&6hxDm$V>%h6|$|n$y+2D z%jwYfkxr1kkp%^f9|QBYFkPQ!iY4)zW>VMk1D2oDSfDS~DlyOEnBLXwBs2iwzrake zBFZ`D)%|5ASvqp=SE%XwVe|k|n?hH><}?kt%dIkcvcUoHSpY$UWcCpX(2~$F|skUT~40(39*pv)vmR*@zK} zkS&=YEEC&cSto8FaA_?5K!8{XX3$+a#o6`r znb7D7rp3g}XzFtE@fLfTEBKr!n3#$P`5JRRx{;^7hi?`F7pN@}^;$WKJ7<*k3#DMC zuhWyYFIs^JC#5l&hl$ocqZ<7PZWBMx)n@3sj8`VTaXF6{iM%dbx!|f41cMra7R}3? zv7z*$$j#JVA39t#A!B{enn#YHBb}{Y8mp-juYv4()ARB)-D9YMwC*uEWTSZw{PYVu zvL0M16F$8+OqMVh=I6y!>8Cu7TA+v2qU08tD*^9p0UX-h^vn1Rclei3Q>uj4z9kQq zk4Wd}j|2`48ze8<@fv;SrWvKdWiMFM>E68)PcJ7K|KCh9nMVJq{M0i1M6a9zy=qU- z(=#A*MZw>mfu_7ewlk9zD+khHcL8oqC7%l0w-a*kSPG#or#7`oJvh-d;YC!Y*NsL# zz709;t!AW9PufUL%V}k}a+3_(d+|5O;0msFjae1%h&-l(G&IplQ%$)H1fv{&+DfH? zBbW->)sA1v8c7re8iCq5XL@H@XI2;_b-`WF3I(P5vNwDycOtSN>UJ-JNIaK<#Ibbm zh}PU)ZqD7Qd7ZUg$y&1ECOi}i$#3|ylIu!|pf>HP7Jp9m^tB!gCv-FUG=VO=xzXQo zSg>GNk_{wp=_aUVZZav8L0{aMd^6F?jIRAjb>4Zn@BN8FHxVB;B|BM2&IIqRoiZP* zeMP7WGvS9Gfi^A*W|?H(BFAuz{Ma4*rX#Qu>QM#Ojg0vx;@0!xEGlj18cp@7WP}p6 zLR4z)6UItk<@?l*oTl#U0)Ao`bH(oAA?Jb%H5;80uHR;|^=oqFL$%4e%eZE36~pAy z$|CgwozBLSPc!JG`VedXj?*n5TOo8LE>6e!t@s6l@kR_#4S$}-gE<+GK?6o3n`g-n zp8^^4GR_*C%w6Dv+wq7!sJfm^m#So`tF#PO&pk3h17N-8 z?&m<7Jmjv(QxOn%nP{jNTeUarcS}nvWWNWscu84F5O91Weri-ay*X^s(vza z0{_aYGENSWt}}OU4m-P=*X~3OvNE1v)x;jj>@6|Mx5eJH?cj$%JZm@Jw)a@8`E0*i#q;HE2}%6OGQ}w8(}e& zp&#=U>M&`oVsnq&~E?}SZX6Bf!ZtmtsG zSvT=DJz=wep3S4e+XOS4i$}ZyCczluoj*u)C2}wQIo)&6L>;hR*I~k|c;uDUXFInJ9jQe^H(Oyb{^1Wc;b(+mSft9Gfqw1sN|2#D5xI-Z|J61{hnE(STK$ZFqqT zT!Q7eniaf^uXKqTmv!Jl&+w$Hz*p`H4ibU4-P=r|3eX2n{5|VgfIP={x+9M#gHez= z`69eoB%M@pP`lAfY$N)E{nw&T=Qp^ao2V?-Kskm}BU^|*XPcaNPidz#vH}6`9>8J7vS^da#pYKKl{F<5I zWy8th#7af5QXh!yKN35A1$8S6&Q*{K#BoYa#YbKvCZk6>P+M03E!mA86v5QT{NQx= zlxIp)sFpj0t+9JmzeoNfk=%`(%y-}kU5(0gP(4TA$bU@5Z7465I^wqvhu<=T9;>hQ zhejcKncNf4(N(g7d|LX(+I-?l_3>tQ87Gmc;he*Pbha*otPH2##e=>+nJw5-=1Jo) z*{O+iPOXTQ^nm}Q;peRZPYe>Hh@a+w8a3wRZ>CD!1y?ME`2p{+9@XhZ!R#tAR60dR z#kt&*2?o?C_n@Bqv9?Kjp!KHLNNsAF+91h)#8J|5>58%N{lX68IQ(ITDMkytYFPuR;f#0X31fm)n? zrIpCXCNNXs75}Y>4m{(f_{_D*>Q2WSm;v*=fzg?cZ*9aUk{g`V6lzfp$>CCZaf8*x zY{p9d(bj2U)Sd*v5sTNh(F>@mr3ufa4T_iJJKZ0`9I3F*wh3L$F2od-T{T_F%o~P5 z03Re982f1|;^u%h+TFbmQETl3zxxI!Vi^pZoYoSe=s+}r8+o>}L^U6%ufIrl%B-Lo z-Kb^rLC-d%ulYW*W|@)QASzpHGUw(P$oC8CKC@znRkJTysi#cW9h_Fn{U3@UgWB>X_-ys-?c-~{^^S77)x)Z2q?jWd>*zu{GUmx?GB%n&a+e)!5e zML%H&{Qh3>k{2;muQFXfoJK(~!einODHHM5D0K}rzA?%&_^c=4P+p*`!8+=Rzqu-a zuU^qVf=7i46UA1@(nqA}J~iq`@Q`o7Tq$SFG|Cg(yOI4HM(x&R^mjkjbpTn7?(}Ln z1PA{cIb)L^06olEy5%ZFb;c!Eaqu5cvJG`W7aU3-?2`&B>=qg!gIOCaGY_%kV)9Wg ztj}*F27RRvm2L)ujG|li5$UWn02HB|xR6~qOKx->y8IkyQWXB61BUs0=HoqqwUQMN z=R8?V4NF**e0wWtFL?7fq%{WF^@i6lk$81GJli<^B9TZ-JY1q+!6kN;hf+0IoqDVb za-cLz*k_vh7VU;>GW}53Xt(uBJdKOK$*-l>RN)MV33~z^GZ>8W4B6d_FfV`62hfKp z(y!?MmkSRkJH53}$m{5}nG06GhvF@NqE57>mBke3jCKqjSiH6#KVF23`%27&_GwFH z|7v-@R6#ss)iP5+5T|KF=)1du4E`T{y;;O99jK!|3O?Oe3M4BrhVGSF^?q6v`j3s& zZyH0XO-YePDbZv*LmjV)TqeoS=v~pmyhLBHovvoC0WL+$r1vvYVd52%Cd*TmoN7(J zS5nC%KcR1NMJtC{!`KJ^b|F0}r@)~5ZAR0D@H{M=?&1XU+H{nlb7lmd^mBMxwq`hr zOb>!zH-y=P58-A+gGro9W2*S!&$g5@ll>_nu4lT#NW8!WWD8Q6!?T=vg7!qHHbQlU zj?9M8L)uSW%{JAg9#&t{IqRT!!a8WgYkge<>8$cOwFABUT4{Uq0P~L(EAEyTsomYc z8$Gvq4)^Tj(akMJsVznu?yiJ?+x|{Snw#|YZ_Si}D9R<`8Kt<}X7`L9Bi%)}1Z6IK zjqAp9try+HvQydp*7=m1-D>= z3rvFuql+;ee{&v8s7UU9fU1d1)>ZtqJ7#lOLIKpY41qloq$J8&>Fn2b7xAdhu zuQvlX{y{a33=`-pwW40sY=q-Y?5`S+8U+&} zk`;V`{_@qYQdhPf9D6_OQN{WyESHKZ{nV0lJjmmq|9}z;BjA-a%N&JnO4KH4wUO{H zph3gw0zTA?p}I0v{3MN$56g?;EzSgyu7mHj57wg~wxmbWT6EHJ_z2U@()3fbIK}f^ zWvRvbY8*skI^=TX)98q-6jhqaJ;)oq#*54YKlw9R)M)sJs9Oj8PsQ-adB2)JNcd?1#^y<9)s&dy<=2__uJE==?tK(t^I4`K9@29S4)U zcS<>_vM2;kZ37)eCTj8Y;%cdNB)4C1d`uwj5QWhC3*kebQ^qOTBQ zZr3~0D|w77(e+L%U`(P~H$4 zciB&xBJ4C@>V33faIs=sXS6^nv5pD8l1pk#gx5rBAqK-{^0YL3xy)pr@4-TTgcsOI zng9o3AbRowHJJ5{N#N+KV9Uh8yu5>#Tn2BYDjupQ8f_Dkl;S{DADPv`4Qo>E9m^Q3rd-Fn6^JfJ7$xb&;17zsk&crdRAd~G^Uw?Z02uEJy442i<>)R| z-H<`RCUD+6lGXT+-kcXf6BF_D*T}u-g)l_C1}YG!f1=l*m+P6Ur#{wvBIK8IspB2F z+;m5F`rkYU>GiNi!Y~}J<`qwT5}TGb1B~92ztp6=B&2Fzq+U$cjdu9obH-W{mcf~ z4%ftZrqkb+XVX11NrUk;wqSC^Wmh0F>|Df9!Y$#6Q5_X@x^Qgjy@3_ zI}qmD5vi!OUd%&mJB8S)Hr1iu$jz3ZQ(kSf^aJE_yjhVhCw@f1yJ5b*f%P&$>`8P| z#_R>t?E_5on{ZMG!YqC*gfM~jj`&MV2fwi+b%7(926+>#MgWzcUk5wA8vuPj8{?W4nX z7di#hwHgp5dgp)W9yaesVWQP{a=@`KIsUT#g!*)HqlK?DpRoK2?K@zgSTQkj~aKXm0 zg9FGerDs;+JEEH&NZML*%h~b2OTdBZCzq37fvbE5%YbKEuz)Z z_LC)zFpiqZuycIia95(9vL@)=Y^uCxg7ge!RqC@BdCgt0pgWRTDMy$1lH6l1TCNx! zttu-U<$W-%hYNklGGs6xkS)xMO?^c*Msu?Dwb5)D=%iW=E@eFN>}ilYPo|AUkb$KC z3_1MtTzxX%wyfVmoOl@R8cj7rcliU|7$$*t%gp9@ZjNFuy3_asnjtbHc%kVs=YX4^ zXUCs`()5zLFkNUHES@gHcGhDy-1&lVp_VcMW;{qyJ9gwTc1EDqup*u9&#*?Lq&=`l zyTiea7V29U;kEvD{c%orE&~bf1_NU%%%2ExvD6I4#YO%MkPFC{$;JPHDS84VCdrgQ zDWmju;6Hwx%nsIeSX3vZ(nK=*q*wF}KSp$^69+~af5An9v2iwy0awl`aL*EYtbj|`DQ&(tK3Lh z59+>l(_#NHT^pZ^bzqpE0&iFdB6tK0tqWP!WV1J!@HIvUFcnXD;7&aUY?7zE(`5Xn z&s10!SH3HiR7DL^ipYEMIz!EG`Xh8{Mr{x^&0UQXra#`tTgeI6se#%{&99DACdw6w zXNy>yjD~uBVx46!m+OV*2BYRV=xqQVR6n_|?1SEYB<3U1k+9&S$ts6}s7xS|i6*AJ z52jKP*4$lCgbpBN5&2NyIh^SsRNF)e^mBTmPDd(ZHhQTT5n(>~DIbZP*W$mdr8+sQ zxXLO^gfM{_64!O&c$iv;=~%UZs=iN1<9beSA_!AgCKGl9bNN6Yp^n0NJn5MrjD=Z=$}eJe6-Fm|6aWEa`J}fQ_r} zM9V*;79=!J#gGwqF?Mtitj zHeD4uE_69Sn!+W$KCLRhC zbuxeYfx6TpLt7N9(wlkb89<4D!h6^ZT6tI8f_*;^W;_*Z6$;n;0-Y$XvrAog&pO~c z0o3IAlOeoJeECH@A&v&OAA>fl1phS~T{-L? z?#xF;SwsFloVi`i$tBzagAD?M55#(3!=A1abfE&VXBMK(vUuMD43~oBP2E8lcMvx$ zA-7bKUSM^>7VY0{1iDxVe`zCGg@st-iOh@oE&k-)h9DD1;fq(~F4>TsYCKI&oNAr?nArT}$)YaVQX6y)|azQ8&mk>4*$9K4@3e@eYoN$~Mv{QDg! zragOTHj*=sINyo4-wZ4|0}LI!WV&5v5WTq15`HoUq_rd6cRs;u3ji6(P6qWJyYZ9# z9t(^43z*Xx(0zY=p0}{0hQLsr&pvk`A6}bG#uQ}FlQo%v?>ZBH&_8k-rG(e?n%V;Q zIT75rKXWzblex*lB$DDVce=q-t_x?`1pBK3dLBSk??impTg)fvhc)?xj!$wY~t3v`=IVZUJU11fta|#$!V=CnCW4jNLiFj#xk_8{g zPi%>=$<%Hy9Qp0Y1D|_CrFDq$*3i-0mtA)R?y*HEHJB_q{M^;9X zU&&@3!ymbCw8ZMaw$2FQaGJW|DF@+~PK9qdkt-YpBP)|;ceHXrDUEdJ1AlD8m1D8w*EtulWZ5*V-$bg=0*LhMvsx?QJapzc zqR>p4UG5Y>=S24)Kb_79#J_38wp)fF(qjR`67REJvGH@pcS*_8!#j`5UJb&n>Y&cFo*cG9yRu#$-r&J z=kn0~(YQ6}rw{-}F$p9umpnYNULFlmO_`{{i+s$NOJ;=PhhkN0RUfzoa9t85?1ByG0+(=JisubQMnE8-f;r!>O zKi3^j#yissd$fhB{Q~e0>&pf;1vP`ec^kQbA zj|z=S`NMTtwR(7b{5K1^Iz zkZxg{I1hnH*e0Twx#YN~kPDnm4R1c-8=jvZbH--#rzknz5Mtn7%o*NHUL1c5tu=sH zuK+lIMYPlxa|ZrINjOY#(n9$&oTN1%X&I$-Vxpx};TS_!vlnrQ2Yra0W_RM;WIUUm zpb4+Re42A^f?>%-l4bozB|=Gh@)W>+PSz`sv#D$a3I&Osi&CAKTY5&usUG;954x){ z-eX(%v!^(tqsR~Bg-bt*4C{Z!Wccv1a2S@-26$43(GX?Cmmn8i@N+8Sv4IVY!bUK0?HqFSyJ&Ow-qDLpS-VMuPrSPoVC7I&8L4#QlrO*ew*2!8pc>OQ=>EMdWWF3!U+H-(cM? zlACt2&$W1>DtKUrh}>QATekXvG!I@Rxvu+ zbu**TSedC{4dXqciCvxWj>hu#Z_rBdctmSJZiWl)3hx)>GOdtp8 z&SVXDYa^0Vg$||TVR+TUqpAS{B#Onv(&)2g{B}ocJ0AHu@?!(A^3}{_^CGj{I*EV9 zFwn`hXrpq{TTX@w_syLOMJE={Fg6f#v^6FhZ>cB9iRV8J0Qw{cKUu|-XT*Q2&$)3YA{&5CI+zwSS0*>R1W%$g*zh8}y#egu8-5ao2Q-LG zVmg>SAMq8sf=uT_E*iqwYJ|R?KsLl-{-F=5WfZ_-?IO!M7u~xtO?wrVrW1R=kzSCC zUxFTUNV}*GJH%awgZCGPXWoPusy4bHJ^o<>e9gMTRPNuGj_hw(@nOX9<3McU@j}93 zl;1?-KSEa=1nt~_mlK1vU4pLYPDM^Ja`y$%kV9GBSJSQQwB z+o@Jfg-suY6}~NcONH?y4luvwG4CsZ8inHn`qO{Xz?zFz4*qL4m{1eq)XG$T{-p}n z8_#2;n27gs7)d!rWIqTU_6!E#R&+pH_IxQeqa9ZL4bMH-no6v?1!?>ULT*obcV|~z z{5>mg*c^qFPP#w5#;zTw^7tA1JdWR;C*%Xy zNza^^-u%gc9&Q2qB@#QD4Hm{b{Dh#~{W?23;r zV5#Q1H-?HxC!Vu2&^w~G@GHlTWR z7yQcvaR97?vt%5~qCHa4M-fz-c181jGfbm8=RP|tQw*l3m)H@nWiC%v6-;X?44lNiW1YuU+LX2Nbxzsz3@QE_< zy-S?lUhIh-eNlx-1w;<^XbwOB3g^Nd4gCsla6aBx4-kaKXprngeW&r>3X7%CASqyU z;X*zTueChe7p0mN!us-F!OsZq=m!b17aaCKdQq71iN-?Tn!SYhQ+zfru5fA1$ zHSR0OQ*eejVU6%4zr$Pz#M_o&Kb-;(cPB1-#Ch(9hiVc5JV1i4^0~$5DLJhqx&Ra> zTI|Rdgroi?)y8&ul8e_Hq9G=&$ma=zTU-DleF; zy9)O1fAB3b^FHH{)^^D29QNe|CuK8HPB3Rlr2f#vI~+t!Ku&bhVK9MT_**AAfwf^c z-{$)((awvJ$MyKD`#7^qQNS;&z_-uBg>FE+xGD`do{B8_h)>f_coL{}2y1v8U$G_r zdRuB+-hgJDgy9y!)nhrQ9k7~{(O&293>Oe3xD&~Kg|T*utY|eV*g|1fwSYNOK$OWG zZetg6Gn0M-u}u>B?+0ke%3#j%Xp5<6ii1QceOR^I=&}lE2;jQO0QEnuUIIioK@^%KFbL&er$Nc-^yF2j@YqNi;f@kmpoBN3ZC37d5S9#}N@ z=!Q1(!Kb`KTsR6z^I>J4qkogx(Fj(iJ7=IK9ffwH1H(Dzr_jB(u;U4EM7!f*lm?Tf z8zxV`91h}JGd-xnda$`3==+8+dh)@y+YgKNth5~e-ry?r#U!j*FQRaX6L)~Sv_aea zV>d1mJKaRrcoOvmp{Z?)T#<+}5!~PnT+~8n`g5?^2D4M&>3rZT<^5mDuPMF?My zi=FW+D--b~Ac>RNg&*W$nsQR^vqpA*fzs@|lW7kZ(4(2fUr2IM@+EIz*{oph>0h$V zEscl91R@KII-3f_&^yV<^g!>O!G2dmiv7^Tz0pwn*~u-O+H&M77NTpsU>*Lz4weEf zT}viN1M{jvwVgfpzCXV^h)+NKw?<%BPPEPf-nuBbxzo&uKhTT#@-vY{ORn98XgJy0 zMof?uYZ1o^g>ZJg>CSSB`27v?)1MXJ%Y90q&jZ=V58yy+_&?Mu5%FK)&8za}$Ivdr z(KuZ}{e#g~HDIDtz(eht))l4%@!>miJROnQ5OO1rI9J)}2|to67UsI;kjcKByC|My zH`?nUe8QWsy(}W;@?5_>dM*wr8bB3Lde{JYVKB$Awr%JU^@*5I<793`+KO}XG@iaO zKGz4K2h*8~)-C$e=grnT3@FpT^*X9l%$s z2uA-9S^bQ6y%=w39rkk_c|b2Xuset^m+(w=VI~BaDQS6&+Hm&0sQvy6qO}!EX{7az zOF(-Z#Iq0OEEve$3eIW;e6p|j;x?b&miVsh;yWtjhGMT=_-0-3$%gUtzC;#%@M;#b zLT@>Xi_w7BI5~Z|jt`b`9#=kyY;5D%Y%g~fpP68Ct&yErbpJo_hmz(Oy2{?5vq?kZ z?0i^;pLDG1fxhpL9xKO+{X&9HqKBi9lNs#rT>f^5)z66x9RwwX0^66Hb9^48wH`a&2Y;_B zmeGYL`k8oD0`+W<{l3ns=LXj;4(IVXtC3fTAqt%jqQ2G$A*OFd)u?GqW1rUIvkoP~ zxrU87gzqsCnIBB9VHKy%j)yYg6Xe9h6FIr>h|$mS^HoTDJ5KR0)@LNxDm^XHWZ&_w zbAiQmCl@t~^En5PCLBxIjgvNj)!c#yc-lh86%kcu1ltZi9C zl{5GSY``R6R-NA;huzwTw;cxxT>|`R1iQSNHJZ;JHw6cf@UU&`^9o(;z?&@1X)cRL z>V@C&i+%oy70Zkc2;_G=V@I2@8(yHShk2?_>|06j&w6NJ7(A?fFRpx-NJGQAykcb{ zkdNYc1p-f~^9CaM&Yx(L13YbaELwiJn|ay8E}Wwq#7OoG-MjcwIk6z#c&j#M)`O?| ziuV-3U8?aL7BxmUk;7TJf>Zdx4jGShJ^=-bXV>Q;Yd5&UXQqIZqpQ4#+=mls1aZBx*!{iO*=SJ3 z3ar=_?y?DN(}hpB19=MuQQQjqeIeQ+AG&EK>-dS44?)j<1m}yv>a9lt|A+RqMi+*n zx2RJ^i;M@|7=yk~PmR4Fn!XhXa$zY1E^j(%CsMc(+p(E5;)ca_fjo7@KYEC^$;BIF zpxR*GC|Gx6^l)_Nu~wizq+7QLSz zFQWtNG92sB6B|{N-OdCqmqNVp8yQH%|BQqGbd5W$0CVk&RCOUHnaUMzv!^9k>8Z%$ zX3peP?&8l~j{ZM~pdfyq-2rYWdLf2gKhFQzj_t7JdvsbPxEVe4oH}a>-I)&0Q%Cp3 zbH6XhiGZFcj%RB7xm`G|A)H&g--JmQqEGzRSKc%y);R(MRAHZoi;IW?H;c=_KU%Qg zpXdQN9L=vIt>dUR`hymjLsi*8P}_Y(k~PrD5Amd{A_>je*IexEL+sFAp7JJdpNngc z;#}`1?m5OjFXC!#`F0_6yp3Dh&-x3kdzIgq%}K4#S)d0G_2=HmX&E$GLw30}mL?S0 z9mA?`!OM8TZ^0fSe~^!JR+SYW!L{Gu6@>Eqhr#n>#XY=3HzJNtAkxjSu1B#YHDCm~ zcxsh3ZOtAY2V;@(EQ)arTR+xjAA`^>1JTOEu;WeAJo%4k<{PXrSu(7hCzTmK^eOqp z&TV2ZLwUjmoZl{-o7Kq1Cp^z0T&XL%mP$ml#4J{KD9@N5*2Owbyb4OO0Ez7f?zbNX zd0nFUC+L=9*ntwfRRaHYDb4ccAU4^9EvkvHGg=&oB)WmYgrm>h@y36#e)JrP z#?M=XCsC0o;54fgf~Vnyx8;sCsDj@y6-|2;{bCYT`Vpg7&h6by|6}oWMsr1d7hYlZ?c2yf0EYGJFGTt5AF@&GC!EduOg%>z63$V3o=?C-y z9bB0=8$#ZuAKxv?NqNqF?el0yX>IYC>f=cSu%Dr<*KVXTBP-M!`!E}eGk|p|#c4|6 z%zR_*W$sWMiLcF_>+!uHo^2$yZ!fm>DLCmJddbb@i7FvO4z#5s?Vmr{S30T_@$5rm z1@Y;N?fpt5vYhMs@Pt*7M>l+$Yv`6eJl|>J*0)&KPxwPu@euaoo$Y5o?z85;Jkxk2 z{}#BEM83@jZ%{*HpFrkASrb`!$rYlohZFD=BG7BQhzDP>qE2j*hHiSt?i~aZTb-th zUx9=NAYU8OvLO%A2|HQofp~J2d5f$(*I(B09N(QnRNER&*^-r;23qlmtN9{LO|UiL z;01f&EIP?k+H;%(U|~FEEsEo@jAn-wE1sCg9gW)#`@J%aGqs&3SkD@4X2Xk7Ul{ zN~~=FvZ>>rKLtgxE8?$%YF#37JwY^emtD+)u9|^fuzRQ80VxjxKb}QQIfPtUR&3e| zBr`X1d6s7$hs|k&CF+U%t>*6Ekny^_?QFcrt@vmg()xN$0T~|3vk%}&y5Mb;=j?pP z|5}GGWX==*y7Mv1NIF zV*B%BcxoT2)}3ZLe8@07zN4Um!Z@5#x?h@Nr7 z8%<#EKXQM2FEgQyYNL%i;h(i*SE{i$*?E5rTbF|T%KWB%u2R^y_neYTcxgLXna!+% zeR3|a6VI`O34GtcUPxTu#BwBY{crp{jx+TJU3;4|aTXak4`TL+)pLPM7eHF85r06`I}XW<2`=ybB(u>@eT>W_`mjdY(y$IYn1`d{43h~I(oy-N1sSrlNVg=C%q1QyESLWhM-Y~v1=h%mQq|L8+TQ()O3tv?f#^#+bUdv zg^jI*}JhXlex+~G~gZHBQF}eGv{g~=c_k=3uJHeunV>fDy(BBRxm%$Rf6kR zWn~(%SIv;x0RFoO-?SyqgBlz6!+50eDw5#CPB+Ig z_C!N=M}|VM7!A=xfobnhn3c4%%62aPKh`*&D;vmRX5JttpL9Iach>SU`f)4QUx}_< zkM%vx8-Hd+L{>me^QJzd-)|!^*U*Sx(tMGYXpgyAgeY{mefk<8%?{#^he+sYwE0EW z>;-rHgB00beMat@kxzR5o(s9Cj9w4odAqYxeL0IE?07Ct-CN}9SeiXL$iHu+7ZQ19 zTUIolKA!h@&$GP1J9x>z|4Wls`(*z@Vl6C9HZ*Ht&U7U-QXSU9{@5OgEp?fBLWPeP zI?CRI#(bJ{A`9`3kJ!TqBD-KtT08KLg`D-L_^}!IJsXEDz|MJd1$Xw|op;E(8Q4c$r42K0S1PLA!1g{ArKfxMd=IiQnxEn_)ly*U|^k%Vo$ z!zI?`Dc1Qb(%{bbY9ZB=hz0lJc^}6Yv7_eB$Z|$@{v1BRSiHi7eQ^xjSU zhev+|Mp$q5z8p_e68lq^6$xTxYI46+|=L+vo~IEqcjWQ{r~pOj?QE> zhYLx0&k4N9@9*KwH*luc@hk_@_A#DQlpl@L4-aH3Xw7wc%*3(_Yj}emtVT8Nke?Os z#)rv?ym_NJtTg$2hYZ|7vQM#_C%Aenvi+KSrJze}k2@DTloRRA$lJSf64J3>w(U*F z$+tMQpZWcpXyLP5A(p>AWhcL~n#pLGbezQ^>_PxKs|laFJVyznB@>o4mA(7Ux%vVA zp31W*T-QE-Hlp{BpV=DiD}NIB`~R+FM^WjxXDYIvoc23e&<4$sl~u^=1>Slq^4k$v z)OiP6&)68uCswx{`x?$}%q0#OfOM5&FMpwDPVkK=e5u8(=2qVSF86aG2RV>sZ{9Ky z3v&dCu|2OY?A8R<{3_q^;UovLW47+ei5-2#9&BSb7Ga6kfykXhlm6hoMcK;%#B*Em zug~+0JJ6^7(OCs}*WYR0gst6djK%zNiRf^8J29q(n&$8E@e z)#kqS+0&M3I<_UU9mv_WdyM8~ZFBHMxwwOUCVg0GPgXhs8}op@iRBINqjlf&4nJ8% zopl$vb1J$hj<D{14zWjQ2gr3W=Qk z0G_ZLtK5{e_2OH1({PJvRCmovn_Y2{C-}{KrsEo!xw1R90*VS+Fp19>p64yQ{h24V z^DyqnTmdAd4E8uD5|PL*zGlC^@Lg~8e`l=HS~S#AK3mW*Ls*G2eDi;PhlB*lNQ#}$ zaq^Zgc&D>yz$5JU72fazvYno1u8Li2i@pj;^KAWjZWYP1SIhQ~JXyJHT*2O{H~ijy z-rGKP`?%75ev*LYa_}Adp0=MT^2bIe?7X_cx~jZkCZ5TD6Th@r$cs}P&w5=)f7_?* z74n~e=CGyx4}Y^|{ZE=-RS(@g8ELiq^iDyOH|6boxs%NKbMTz`ko$^Ab?G#J#hd%s z*7tw@a5C5V$Z9>~J%4hwlK9o*(WG05aBQAkd7kqEa@w0LPJK}SKFIfRc0U8YO9SMq z88)RN8p2($QH))@^#VRC(2+;dWYQq&$jf&Nvx50~DqF@funrDZ!Q{;~o-iZtY-31u zIPo>p?41NA@QgRVfR> zXR~^m@Qk*-_eF~2v~_pm{<*kHasK3C4U+L4j`Du}uu@fsb!wq!r?6-L$fPd-ck~9I z3x@Sr363MPeUP61tab~epd+$AjJ2Bhe=MB?m|SPu$9Lvvw2sr*HXAjz(WG%2Hf9^! zw%ypa?KElFm}?Er9L#*b&HG(@rEl9e-Rzw6JU9QK>-dwnnf~valCd*_#<|G!;(wd4 ze?URpVdEv!MfIYRNcUyA#ofBb|6b(1-sARoct%CIrwxB(G3@MElAW1Uw@qSom6^jd9PcEYNv^T?>GtRw;=e}&ysH9y zZy)F8JQcYNa z^L-of`-YMU2lE;05(8bl`}8{W!jG?8y#2?-x%3+ECAZ-Pf94zh>o}g8htHbc3znzq z9Z6I_!Tb6Oit|0$b20BHJNfqlHSAuVHQIgryO;1B8#2Rd%|_2hMCi(yI7Hu_2}O%d zuv1#0zgmf3ZTS10%>0WGwN7&O()-QynyEWKZ3WJaOe9Jrn;Ar?pNKH&Q@wWliETLn z_4#?yd;eTK<&1n9lSp-syt{!@ww$=|g4~bC53`Hm%n)y~58g``Uk!B5MNl~Dlcz28 z#c#j{d}5&$3&n z%yjo8&&geYpu6)A4-uWhP^CTiOuA zw(;NOrHdDt6gHzjx=$sXu1?>PIF*iZd_{e-jBac)v3~3f)}Zs*DLqsQw* z$F!L5ca8It#O)Ti5l(JH5uVB)-0FQ)1jm?+bmR6Mq+0vP=Hgd0d3vyqbMjy2V8UDs zM9V$P2g_>|s7JxA|Br~*plI#AuOCB`4)S-oYS(1M@490;fh+>H>XinE9duc;57@Jwg& zM6-iTKgHH{0vxuvOirJHS?fzAEYHq0k}d5y_Q5J|ej|J4^W?}4%)Zxy%1vh^IpHP^ zU`G@O_PaB+&SoaoM~U<4bJTsziw=>)?r=RLU0=-Tz z{<@RMTao+p0`yr2oT270-Rof~%X>S-nJ-7Q`o#T7kN&Adfy#Wp73}7}@pi+R%m(?c z$2o;nIr&HEQ|fc?BKgWrW@|$yHJ9pj6E|coccC}8GF?SsD$(&j=Fqh{uk*?KOZo5n z{OE`B6903PU0aah_HpZU_S|-M!{3Py+c}+$`PoCL-O}@P`t*J)w|5=ieKvQw4_UMt z`5+T`0|$tZpNXRfsghdqJQKJ_&Di!ew&Vp#dWZ;t`wc_W?!5wZ$URgoie1sc3nh5MbtMufLe0KE5 z+#s162OlGTigF+ed~l&kF_nA-YhxbWRuoUTB;WC0{;2}^?P=5jiJX+(V0ixF_W#Z~ zt-xni;r%rrb0qSlGNSXF2VC7GaMz>xeMx~jJlBhyS&t;&tAqyY}rJXJaqbax=9!@B?+re#| z%C;I`Ke#&vTh*fQ`EH?O^BfnViu@Fp0wR6l6h8UC+-8mY>E+#?=JV7ed+g&`Mg$&# z(c6qVt7f)jzFdRup)haY81ZHUPcxQI^8-pbLG<9Zn+M_A-+RgbphMHk>3 zxph0Jh-|!rOFWxA)NwAjn43AJj^KGP>&@{1jN&U3T!EhadH*r_ZbX$ahl=_X8Pq|x zJpq>HBw86)ti^>+I3$z=-QUc5p18b&=#avlJH}1iPR#Ak9N7&YXBsSx&fL|N)MOT7 zUp=b5k|23r!0}qo+x{nzk3S)dw;RoN@*&7s4Yc@VW{InK=94&&1G(=z&5`gDhMMbn zI`vQ_t4pTp2zH_AXO^ZRFJ@%z}4vesq`yi^#BTIcFK+7_WqB3`-g&cR8ycF5MkV znxzRi@s+|Tv9*)~XR|~U9tz0?rL#f_>(r2t;3?G0Mj5NnY>~;uS-|~I1V=ZUSd;D> z=s?wd5ECkYU=z5upZHU%pp85p{Wm*WhZEq5^aMlvh?6n`HKxZX1#E}^7iqo0nQTj) z(1KH%uCrC%+5^P;EV!4Atx@3NW>7`gs0$x5>G}jxqr?x?@J`DWRQj%wA;*!$f?OkNyjKt7n{jnL}2 zZfrn*cr}_T7Vg9gH0mro!5ZYG68!A_sbsED2eTaxY(#ytGLhQc*!i^jzMDrBF9RNvp=x4&mc)|$P`STGbor&KY56*QFZ$^Zn z+MjcA3r_-z;1tr}XpTp9W)sMm>FfnM!V|24`&j=UehcH#*LoEA5X_H@!ZZB3K1f~V z&hk4+gUM6Zii>H5AO*z7E#lFCkIk6{Loi>y43dUyu8 z?j_L;H#oFy>fu|c>TQiEYLcSh|7)VeUIpy`Qp+*k+wbtp^BJA=2ihj>96pt|(7{?} zZV4RaMxC{+wAM!B$}f0v@h%}uvR<)h^fKqDODeJrT|gZ-4V=yzhA@q-eNaoy1mixB zWd@Vl(x^H|5a)XG8EfPJcm#gb66&W*C~TF3?S9X?8MmyAD07=q7CA+lj5bCRUNNy2 zmCU`8C|r?Pw1fBCojukq(7?mVe?39meKw;|-XE)<&}>>C|0i{}+D`4Go>IH|>uZ0a zHQOR^8)xv2s0zOjvXD*p3fYC>Xpeb_UPp*<$?Q(=gZKT7Zel&$zsC43JQV7pr&~=t zOtv^^`5lKyznKf({XF9vPh(zS0S;f?x!1+4;nu&Yb{f-X1W`|&#EJSAXh*f0n|h@o zIeH@~f;HqPC$;6az>wewlqO$Vy~0DWtu$K7FAWz53q`Gu(a_8p@WSfvqlf74wFI1d zXXrYrNLP8wRbdg;N0-QDCgON?oBQ=qFvfAb(B-(zREnMm-0YP#OZXd(Ahc&OxY8% zK@MWgcyWdF8$OPm<#AF`ag236iXt|1l|DpU?YH=sslTXR-%;NfUsK=Dz7D=EzP#!a z^>6pSHOQ?IIb{2BE{Mnqr=TAwE@t*mp& z?j}|44$wBO;7ImCqyHOvRR>|PA4Uy22Pn@R)bdN@-rc?n zYPdE^KV@7u`@?h|5_pLN%s={8viltMwQrJdhA-Z?2ghk$>uV&KLs1ndkJ3na@x9ng zS|;t04od5!zoZ6|McR(O##TWVezl&1#gRnsS)O>k3MGx9Vrd*A)^I~hir=iiT5bfJ zq372T4roDRKW?wx10B$_42JxTW8OwseM5zpLQN{zduV2^LbIbkT7g^8h%U_JB7`39 ztfdbATQ=pBZK`9hv$iXbtF7~{{kT$E8fe`g%xwnH(VM0=S1+sA{6*2cA09{whQkAo zg9CE`HJ4n0WjF-w@J~>;`+o8zc{B1U%c+@ga&3%u#eFjp)sXJgxvI4zr#^!)*!q{H zRY)LknEO8%H|e%oCsd+p=~g^(51GF+wfc$f^b)$F%g819P#~01{MoKu(z5F7_4;T% ze=~0d_6H||>Hmgq>m6$lm5vv%kDS&qpb!h88k>{($M--jrV=18E!BiU;w*fpH^@Wf z`_c)qrEtwsHRMa+4IWZKBf}50?Ph$7Z{fYNOsnA!S4;Zdc=Pz8)kXec`gn6-FpPM5 z1)qrKX!P7;VwbLJ)PvYF46oCGm=Sf+amr!koHA2ssHEXc)?LmdKbD5!k3L2GEc}et z+-K%?&*?hr@?U3Rf*Hn4Glu!;3i{^C?D_XSy#zCdt7=52Mfx>29qobax`L!N+g_J8wBT6JxX_Eqbwf7B=Aft_le4=fILA?}~G zltHy>l(h!>=nYtsg^% zqiQ$62-P)zZNFbF;=k&@s@aTjW+2cfWV>Z4QKt=+!JpQ-miB0b9YZ;3EsmZES_3`W zXlPyx^u%Ljf^bk=E-5HOzL1(r^TlIuc{LE`li6lBheurnCFZOshGjI)>a%bze5&^} zD#Fd{gM-3W%OG^O{zZYRq2(2su%)p|%i}Mg9`(iej;mR;54z9H7gEETSKKe%kh>^D zIpd1FRWz+REx!b(n^ENG#rU8%LeKk)xir|$l4$KBj+83OyX0%~9=U;hSqh37(cV35 zX&Lf9Fx_l}zFbg~a8m7WY%z^M2lP@p(;qxQ1z?S34wYoaz!xJ{FREWn*MZd?sE!GE zCS(>$OOeWQ+jRRY`yhKi+hzH(IN91Hq)uRmF%f0MZ)hepFh-fT10_R-SY{GiuM2Nc z_DHd+;6hskui~6=S{sOm^d?^|GUN;2L$#3hSU+tZ32wLa5^ji>q{6aG?klwub?a!0 z7;+kqhpM9 z2w0`JFn%}p1X6<0@bM~IUDhG=O*w<-&AvtxeX5pG3)Ozp-fOG%hK9!&gMwHrvygSL zv)`d7Q=ZN^6B&mHg5I>i`^{2Z6ei@Dlh>cr0~Rs@s0G?Nyq}6UF}4kvLw?!WBElm}_nfxI)%i z3J3$mF8EgLmO`WlLL=++keh*uW(0L#2b3Tm85slP@cw&hpi7 zbH^Aj=;4pkPt7*w;!_ZYzC$~B9I2f5EU>e)T2_;9V&E)W&0o;59gGs&Y*cFV8Gjjj z;Fv$;bMC@pa0A|x(XdRjgZynpwVIAlImx7|5n8HEjRE>KZMt??>xPGbXsI-N4=`^FQET#nD^z2dQ`?q%nM&Yv`ITWagJl-_?|DoX!Nk9J>xJ zWS%8IIj9>N0Ud~GoFEZ52=N`c?hBoE3JlyPAnXee|5xKwvd!97$RNHHXGqaWk0GClg+$5y8=W@m%b4Vs@B?M&h=nD%D86q!LOn@e1~bMwiH7H`x5TW*GvJH zo|kDzZYmIyw^R%U%SqUS9J+O|B^1hDnBd(7803q;|6AwVVmo#U*Vz&W@-3?fpIcC;g+eF8VlQmARjvwk5rE z0#mM`ptFkvdj+;r!%Rfov#8O>cxS9PX9v=q)l*Tc3<~GP>e5Ku$sBk(9!J?a1(aIJi87F7f^!u2%}!K_~}(^1pXxwmZDY<3u$LLW0k}_Qk>LMu8psz zTYMr+vBJzlFXS;3oD3*bY(l#sHn5eN_b}VjL}tM)VaAuHx3%L@P|37Yr-<~ZvzQsr z$4yzqC1f_w{RM7(Bk;+KW?FEYdz~w!3!KPFaAmFs+Hx*k=w_r@&kFU$x#C1I2W~#g z$iPEFx(5f6OUvLg6om@N2bA}tz|^E8vcI#H(m|~6F*BM+xiK4wuD$UQ7{n=y=Ti^h zlVvp9p_^KQUOFfJWIHBQodbiYAabBS{G2E=oi27f)Bjq*<2;F29DLU^zr2dhLu01& zk?cF-;S?WZV^YiVI~szW*iFA;YW)So_f`~Vx|nbHle^*F_mJFE8ZJ+1x|a%8k?0rC zeB>;eFx#z(Otz+h^q9-tZ^;zHtY-{!6;PW=3ZgqnusDwX|w>H?4th-tO!mGS!&rumArwe z!c{3rdO%hDf%)i6wB<%vOA(=ZS)ZaiolU$Y{>Ja{NS~yY_}}&Ayqf5@`R(ZfS&s;Yh7V9Pv~E?Kl)h?FfW|Rb1lk^ z9m5_X8Jt6IZi0^uemeH+Bi#LT-V?=^4hiHnck9`;E$VN+f!?p4e?67GAwHMd z+&>?m`y2w^*Zlco za4f&Yss0W#G%`?wde_ib>I3kwU#!2>s~LYY3GGOJT1Vb#&+O?M4vsCD`t~sP8Ab3$ zSQ;3BuURFuM4wp4<89MO?8l#12sfvC!fsT8+E|XWVSh|SUeEqDJ5$I&$nQ*|?}BG& zX4!*Y*L!l|Tf?i@(2tYNs%a%~izuo^Yq$NK{MS{7+RV4q8{*yMnddq0Y3L2}MW}`S z)o{o4p=7!UO~q5_6rc7_R-5`tcw2i;y63r1xSM;*(0d(KbJ1NbFnVz69Dx^jqbwty zKGq_&G5#|C3jQU0pOSRBlg-0{e}n&!`RiDZ)5X`~TpkcSLR;|)UUQG6w(@7%aeK@dMM@ zip)i0P$fOcw4f}zcU%D2fE7i%G)HhHx%vsYeJ{F=KQnP2gc4jRJ^xMIAZy^eQc!9k zHI*Xhrpt*tg(zVWYHcss3f(~Wuo+XX!ssLlVrM1}=gFxz#G~Re9Do|)*P;qfxUG9o zSKY-4`%kcmmBjAMY}SYyn1VGFlZ83VJ<>IW2Qv2<23BP=9r7D$*$DhpYMGym#YS7B zkP$}x6K&)-su~S>;%$t^MlB}v1&y5is*J13Y_y7hqO%Q}E7)zi*t~wRe7624oE8U2 z?3mbNNbp6WqYcDHu1V})G4*4P#2k(-93P+XPtx9$7HR9Zs!w@3`eCNrNzbJd;czG*caHXZJ;#>6UtAzN;nr{q;F_f-$o7PLKgVRO^&8j8)-=paU z*1v|Yz5Xlyul`J0Lv5b+P|L4R*3rvy3Lyt3zN#WmkLTzNzUNU4bI};)B2VKjbMlRzHeQaH{T|Y1x zI-niYF4Fx)l z32e^nusxMz7V$ATBnp?_Vocr!kS8h512lIzHRL|(|=Utw5Be_swT3oHz znlazLH;t(sdp>S-LX)Ima_`jcY5%6(Oly=jICW^spyaJd#gob=9Z$NMTtBsdyPCJN zIznrTt3VmH@}7`o)aBc$o(v}MH>7j&DP@_ht^KXNx?_N2B)>X2esc_V9C1WB*Yp0r zx>kke4qF^{G3-p(@Gy61!_e`r9nSlX2uFW=qHU$EJEy0tEvL;?uHi?QEO%h;@)a%D z-e_FgtOL+os!9!<$bP!LIRbytwc0syP+wK`-S%Dc#revr^VP3v4gW|^!E*m7e@(wv zJ*_C=i#ZPOu z_F}$Rm3ujq9d7})ptafN%>98kPDc%|0jE)inb~{rT~pAP%ge_36dLkB;}vxnZ`BG! zh&0?H!if-bQ0Q(2*5DUVG6kujp0KScP7Wvr=I0X#m+4^W(%BLd!OYYKwXlz=%K~8z zt~d4Nr*bhRzjB|+N=eCy1LI8kjPAj0=+1t^L25TDu`&)EIrU}!O};^%%xRC4Zzh&V zh=^YocQme7{D_2GiA9qKrVLEAr&UjLrp-xxm69`MW^%FQlF2KQ2c)b_4R@dL^!H`) zZ_^YM{2Jh8Z=r8kZRvw^Tp95vDIndHM=3$2t8IhrqV1mTx$V2nZm-WX&E#0`sOfy- z{KNIuRW0=Q(0-vmhkkMOb3JobbgprTjyd++_J3{LY}2@f{cN3WRc&Fmi)4uhaxu9- z`S={p^Db*+I&+aaCqL7+Wne6_1a7kLi#O8ie2ZR3o8^C@)=?k&#`%8rweXE(zaXkZ z)qm9%{xkm4_$ox=_r<=8%EX8Wt46k}K?PhbUG&VOCXnk-P@!%zL1vjEFz5|7`WTpv+&>v35`Ff>km_4a| zLg{PTf(5p*p(`6WNauPGZ=?uZEV3Bw=vV8o-53GhbtMR;@!%ZOIn%pQTdioF%305X zCiqHD`5Qd5U$b%Ch&Oya`a+3H)FBi{xqPayL)bv~|H}FeB*cM0KjV!5f%j6{{p9Gx z*Kx&TYsENX7Q`HjZ53ZLv3hcr)ZJ;P+>JeTJ-6I%($1ugNokYZH|b5{)x;u6LUPNL zFR6Fj=e_sT3)*`2g>QpZEq^k9nkcrBBIV<9Wo5haNeQz>+ahd1o@k;Xa{mw78gn-6 z&S+Qh(DGr$!sEk7MI4UU98o`FTln3uo1q6>E1WAFhwLHt3AReMthPe7=C-Ls>4&zP zw#~K%)C_i|pqy1Q=&EN}YKKGy6U`XIX0*_+Yu%_eotms=*78sl6<~t(+P@kX>!)fL z^_%ZcUoIx+7y0_?t?1k3Yp5FPbN>bHgnohz-^sv1^fg;qJeEn;Z+MAxV>j`qFbpNY z=^%@)X*J2YNU=vmoRL4|KL08VfCOYLm*l1+{4UzyKJp;Y-JUZjzRF3z- zJa%9*^oXjVDRskVy2_(ML2)Zyn14zaqp6x#EPL!_PZd1algw0)9&qP@2L zm93Y}$ByEfQh@3(+1|i;#nm|MQ257)Ly?)IoKf>5Pe*JB?-G_H^rQ2OBib>`Ud}Gs z(`=uJIjd}qY>$-s$|l(_wPib7O}xe)_al1u=h;@HF%{Uw21?N%`!B1hzTUntoSg8N_s>@E`!e{(dLz9to@noMZ#`dib%1}brs?I))=c`t!0%)y z>+ZMwNA=zYg(N?CphrS&-gZHDVL-9mlaW7}``FZQmEs}8F(x6|T0>!|2h zV!v#AuV`{MxdT(RGU6*-ul5TUg{Q(dzV6f0)WC6C{WFdnzgWgM`Mt?`& zTb}(xE%5{$UdieX52|MFj#cqz-9#cJbP+V&K;lysqpHh6O z+tQAvwWQXlo8n74khmiuE&f8hlyEyiOPrcqIW^4v*fZT{^>@=2(u3YGKLs+OZFka| zT^u8wm2W8;vtM?JoO&wyV7FI(Co!yCb`6aOnN8j1iS0ol(o9PDM?PN{GxB zDMY*p`#W@oYl3sHLw0PmcedBF*R?mWH?vo?+w3Q8)olBeBssTSL#it_Ws2Oy(ln$~ zuy)*$M469-_M`8fe#V~G7EeJen6Dp%Q1=% z;&ifOi?e{Mm8-5R**U~{(~;HD+y2>=?UAZ!eUkYLnc@* z!xgx~4eyJRPhVKJ%|W1EL7V%CshC}G$oobAM$LIuGqrX&A5}8e7;g>3aDz7*Ngg?Y zcWP56WP3n-eK&5K#{;|Y(k=o5;SCe7Q()c$a3az*veI?l-!W6@3W_wqlzFb@40$FR z735X8D2*2~iN~18Crdr3;y212nSVt}W$<+#jWQBq*Y3*I%OHzAi-}HHA1-vk}Tbqb4r5egWZkyof=9oY{j&kg`x3PyI z7+cnU+&-N!(I}XKJ*jdV%!>KuLI;J~*cD%9w zWp~&Y+cMeKDg~6|@~^Tc9h16BnejPpFMh&d?KoI~DwYxGl8Vd)6T!XI1!Wv6MHSrS802s{VSF4&$b&%1!bKaPmCNUZWeB% zXsm-#%@oWZs6g(St-sS+YKi_MoRO9O&HfAid;XXHTmJR_<{+eEq%WJf%IS z-NW78+|%6&?iHSC-W@(&9iV;JJDCRqFWI#8V^a7LyvlYqChbr-TLeb#sCAXFmCfKc zIiP5^m-cCnQ0D;W9_LeMiqr2DU2f+W=Nac{XS8z;{Y{j;l&!wfL7prf62ov|E{n?b z2j&T9=xiH-188O00wc!FEWHW7Ee`6AK6)#?F@GJYFVL6azd4h0F-jlD-(S;ZX1V8? zWBkRo;w$bUAHm?v0Cg3`4SA0XS`o66+x#mK4dSx`+0zNayD!n9g{2_)(xX%;9XR_9 zh%rmRre#N^_zAP`z1Ey~;01;5M3`@)Ao;}m#Lj}^0W`)Rg5@rQOT$CZa+SdUoI*ML zvaw66rLOiQrgo#}?H^w&?rLm&?Dn{S;~OPDOsbyJAvI%K^R%pKf2A&?x0#i+E3r^w zNMfTzGf__Nnes7pmOF>{h_8TuvUXk9jZ%R>=)s-VzU*6Fay6x@&9u$2->|>5pRiA% zv&m`C%6Zvu@93!PY~=bQbZyw-@SPC@BNHPlMU{w3i5waEEFwcho$x_n^Fj~1o+PKVEe9ASN1Vecq+}8dNQ4=ER|$`bC)U9O^}T$v&uQ(alab}^d;JM|97>&noE_` zXtky~Og*SRX9DY2Kd6Vm4j8@#zKp*8-Ui;F=dS0R=RRbu*52#hjy{>+ciewMJF7o8 z(#$OAfK;{=w7RY9g*V)46ZPvpPRUW&>+x(n3i8Iw5PK9$0w~fQuqoESSW!cM<<#_G(=`XD*1_T~ z@es9lesKdXdhOZi7qpy)>s@eJ0*KsQTI{zHFsb4p0r1)Pg9)CNeU;|Og@%8C1rK$$Fw${``%yGr~cOZ zZKGP?G)RtsPyRMO|B54_y0PZC!VrRh+vVRUL{Wvty#8ytA~cTj=hv z#PF<%n0MKRp>YU~C`Z7Kv(9VnrQhoBpuY2M=45Q}J@yG|4Yi*-O`X7Bi_rNj@Ky4C z@UHas_SW+@_4f1b@>+ePeHL|{+LZeDsy0P$%uf8RxswXLSx8>|I}R~Hvx^(S{q>W! zORuR~%F09Jb8>!VztYgA*^b$JIt1qo=No63E6nxYxxkspIm7YUUfw>{c3;V;^u}w? zDz(J}Ig>C4uG1>!x9>o{w`7+21g2F}c4@oe41FYa1er=l8{6^PdZVq=`fI;xziW%N zf3#vu)P0~D&x5^diq`xl^PKsP-E3vBYsXQduFnSWIvBnzyxm%`nbI{bMxng(jLLQ- zJx?i6+mD$}7vRfEx7dU2=Wy6QQ`v_k!%%YLVK9gDGs5zf9pPr{bIy>?ZF!9b>k?47 z0qWzk@YQMrh8xwj<36uDM{2jEkMS>JyTq*hKJ9z{m|tVfxR``DNheaOq_uT_a(mr# z-8a&%r5;H+oct}Re^R5QrAd{NE2fM{{gyV`lf`#U9ish&Kj`#eO^YO46vxUL=_GGD zE<1mBopBv?4RysjTRRUriZ~wIuiEX7ZH~3h8?JI;o5RDXUFt+9Mi|M z9<&d0{Nz01%;)Ou`qS0kNeV&Yg_F=VK?E>Q~?{Y6RWP+=^%?eKBq= z#Y`+6e?I2+x5-~qzU267`8Mo(li1$zlM+WI|CHJ`ExWsqyMg;jTG6zAsmD@sr`$+B zo9s!RPc=L>?U}oaS5j~Ix9T&^$w7RIg^^NwrLg^qqnN8vXy&l#VVlCbggpz*6k65Q z#kr12#3TDR?qzvr2iJkn0^#c-;v?dLlAkQ~(f7{h@fG9$i&IDVbKtdk6i?Ch=Jvov zc1MYpG;0z$cB&LbhjT%GCx7L%T$A_8+xc}%*5&%jX2oTjXiKy8wcoQBaP)C3ax7)r zP@daSg(!JMxyyO~hdw$14~gDjemXJ(zs2TkE{w_n?0ajVM))3vQ~khub2K&YL|mdK zGL>Ja)zDIy5N`Bu@L%)?m>R#~)Z_#sJ{j%!Yk_7k40X^o={lex_+;#W8QK|UV;iQu zCtx=$Ai~_hbH1qXFX+ugoXV%s|4)}%F(Y0j=E3hTGdm~IIt~uZRCf2*h*Z7l*2cq# z^uZli4q`A8H-P$Z59Go&KKQ-f2H4=T4{?`}mviRr>Pg^XxDB zSM7VRxbF$SCI6LL*j=04f7{c^v(bGuEitu0>erOFDP>dNr9McLJT1Ied`0{lG&@*v zUto4fMQcz0JR5y zEv{x$bE>u3I47zD{eJ%0 zRW6C+B|&aV4_%rqb06um*hzdUbiwa!Hja(g$oAhs+$O_0PoD}82g8B$DlFRa^p3fS zVZ$EL<88(i{h4~t|6a>w%ruBdEL=Oe9=f$+y+YeGl3W;mZXCOJm43+&*`;WAvGLQjPa3-^XM zkLVxKBEl81G&~SiIjnPN2UjJh-@evXP}weJ5jR>(T9W9gmB0wIpqUwO&*f$a+M0J@ z61({K0|VE2E1$t5>?UWe^y*b?Yi!OJ)an~qp9>B}7E*PyLmIKzWLLTzf&x(WTav`QniP|+qT!08VDhcZZ zpU_fV!8SV;DKWSBuee;SBHp6!UJDnfs%0s=hh88e=Lebu^5B@8H&7ea-amorM5Hn> z>P1U=@DjW6E$qxrz^WDWg}Lu0Z%;T8`^)zpUn_pO_c`~M%wIQun-sGy?qtH*q$w#O zX~o>3oMX^xW3vC8!+ z>~%!kul;ee?sB?p}qU#Y8K0S0y*pska;Wfis zgqI4}!j^_fVKqV|wU<@?7zf)nHz24SZ&^z7yo|e(>Ila8BG02c#$J#Wg@N zlm^i{MxUgm68Sfbb?tG!=i06x^3iVAn-+SLWwXeSfv%Cd3 zT8}YKGf&k)_2;Fl-C%~Z&6^M$2_ATd^$wfyZ_*ukhLYR1!1m7Ou;=3|D|5yawqU1h z3vJ!lAjMEG_fm=||A96h0GlJ5oDBPBmo!!?E4>i=g4-(!7jp@ikN;4&Z4)?UmNWmw zwfXlSn30BHn_3xN`KPh`yWPeOBY}#h9N4l}AZCi07TgRcgDkKaiFypDy&Ic^fo6fg zyTB26Aq7Ef)u58SYP}2^@ONtlaIp<6-^etrnbl+^w^awhkdD^sY&pTKZX_t{io$Xs z1q{Vx`lw^#YWAJqg=XZkLze4sRt;Rh4ufi`ip$V;;@ti~3vfpL!PjKwjHP#GXW^?F zC;&*X<}QGSc&#thGW*;6`gz)?RY@t8^lQS?xKpv&V=b`*V_V0qh%cDa6s@uHUK%V4!d6QkJjus^h8xI^t|r*(Gq4&*;%i`m@t*~} z(lYjUW2r&ic$)sKb?}b^ul>xMjd@?Jd$hZ_TXMU|aR=N@Jdwx=S=Ai=@>)y12^mZ? zH^EE#li6wvdaGsWOV_}Lti#i-YN9ifrTP;otCxdP0tdBN6vV%(BC%gq!a|2#yA8>?Ta@r1KC1}C3 z>=nv_(9&>Q(C8B-rZ+khsT(*T{RSrDCXSnhh4xg;f8*``9r7(L(eK`gubEt@bNCz9v#zrIo#e^RcT&SnKeD5$huEN1Tl49T6MeJbXh~LTH81 z)h?TBjkAt3lHEhlyU2?`czS;k=txHy zB~Z&p@z%%!4n7DMtus$BGjsWXk;>D(27bJUk=Zz{H=%~8sr~IY)E4BlByV%?Y0od7 zZ|=j?)wkV0f!xaPedJy2>#mmaJGGbEPM8Qe%=_dnH|Vh!xR%aA88;7l-|5`xKdkTJ z61;>5>K3O-x#Yw0uS%S<$yOG8PH)FoM-#g9P0m@)l600T`K>Bvy%QY0(_)mk6h7*A z=C6zCa+>~dvYN;AVUdRSE5c$ z=D|L=)|1+1)P+bFewMI z#hfK?Q7+nE*uOa5J1@DWgytegeF{^;2b{yeKDgLl zUU%%GlNrgKuHuMvJhd;fmtZ$o!L~t(0e93!8o^|CE8N2SWNjE~fjMw48pH1%py$_B z7(So1c#QzbUvGiPEU#T;|FB85sy%&oymh^IJ;OaEJfR-RQ_$0oebujC!FP|oeZT*( zc1wR@d^2MM4}<$ddNH40YL$c@;N3n6pg zPJ(;BjJD4jkorTZe+Qr;wFO>PA##m7H~{~ju4qbBBHO*izqtk2=~ZC2Z-M#wD#Qsf z!ZR3{bA`r25JiZ#Y(-A;b2ef&n47O^uyiL=P2FLy8&AD;ni;hLu6$x}Kp?xhp7Rr} z=J8f>|CYKrIcL)IgfH>+;@xp-T+R3^@uL!&B$iGpm0UQbcxvIaeC~`MtM@AR-9DM#{jset^YGu5 zN3h!FNKZtUSWD;+N8%x>ID^4;4+ZCwXg(nmxq1KP;W@XWUd;mTbv$gR-NrA*3$_r& z^cd}sHec(Z)rSKoX&>0C9D|Q=*RT1TQGeD3kGmYKL;#d>19W4m5H)Y$bfMvQ@tJ(H znp&j{T$yKV#m^H}Gqb(YL4-HAM$p$U2LXIdDhZqU54o}&EA?j5kW=g@q2Ch;X+=Fu9uX=|} z3GSkb&TJ0isdv!@{XE^u48G=ruR5yT(VlX;A82Qpy|vXG+9`i$rqO%V-fAf|qnbgj z#Qf)#+S%{+Z-@U@!boHOxjHZcKVhB_Gn5>lV}212i&31KnM_gkgS*};t&&zq8>HjX z3&|<}B2Sc$$=_wWQdB7h$|frapilB$`EPkT7`;4j3MWf0X%@)5%EAQeWptD}huq?w zJZ2t|8=Zr{>Ak9(q2@DV8@*s1BP+X!2l@ehIa{oLY`5y@rPz38)g#&IO1c$BuLJ%= zMg4a;5b-ef4zQz`VfrFEd}i=rCgMLFh^r8P6eL~9g0$PBRg?t==Q z$)0K=Y9^PNCzlfXFkie5Dl3jSdyi;4f!${=e&UO&YY5Lf%@eLLT`4!{r5FZ`RnSJNi=9B)gV| z77SY%mJpULJXg37ekQDA*xS%{p*LN%T{oP4*o}WCV;y$vaBOg_a!hgj;i%@29H;Fa zz;yPu{ijq_mdpQ11*9J0HsLiBi*}ZkaFD}celOyg7la2E3kTr4e~Lf9{~0NtzY zR2@-ktAvVLG}X%!n14M$h8-5Jp*`_j_=m5n;Imecy=t(RJqd!z#KpEOlg-J*8tWKK)K>b3s?~g1yjG9HT{&%W zYPQrzDMwSTqtv{IiH-}?i zH*m#l4!@_n5fAPymwrj#g+)5xtx|Myq_^BFwJAOatcix zFSoBUS$8&wiV*!C`DiE6@(G znckoT=AwdW!xM29yoVRK?jEwXLS5!ADi{%g>P7+Woo}QkI_+HYro@Z!KgVT=Z69NP z4~gj*lM-_)_GVmse3`^KNk;PI)C}%Zo?m^MIz>y=i=tNL4*Z1{+9lK_+b|b6&KVy@ zXY3BlgtgbnGTC}x$V+wnMX3rR;fV98>t*Nz_E=pa(jxjto``%Nc{y@IWH6#_#I*3G zVXH%z(}$mM#Mv9t-;T7^2lbiDmJMV}D5$_EOyIgG;mS!)OahaW1m>e#=nxFy!n!1mxEG?wBl8>|iCrA;L_EtfLF7jm!-k5`)8w%ESe zGTBSo%Ydi&#y@r9=ez>Hr5>BlZ}Mq*k=#ml$_J%iINR05gXD$uZNL&sesrNmvwi%J z4Mi2|oC$c%?=-8JPr+stGTt-2nnu=X%T%zQUQ@3I5~moM=_kIj6J5%atA^6M|3k0U z2xX{8%(;4i{PThwUxc??0r;mU*;`a%TAc3TauGM`+w9Kof-QQ>o--%PtaI`9c2NOO zjm_s^CX49`ct_Ag90@zL849C$sbC(l>G%bQt(k1#E-_Eb!M^q~ap3?P zwR7Z^8z|ZB#&Nd~d;d%@abv+GCL30Ct_q<0Zj($oWHoTAF|JSrUurz^#@SVE8GV_I@ zocqIcyHR3O=AF;Q+|qAwG_Ff-DLXf}4^`($`L!ISlu+6#y@@q#l!8jUyq5p(i8KiI z_eXqo$FrqaA@(YD(OjryExB72_DF@;&g?H-p`p&3tf(G0^D84178JEf;>` z_c<^7P^TG5J_#~qu7;vVRd!wJUJf-;cS`rRXari_WWUe@ZNt5wP|F0O`EyF5^*Nl* z>o>drdztf$4!Ttvpg!~#@~lq-%bAitd16vVYTFNqmZZ8#tCQ@>3zJKvB&6I+eUzrT zYl8>Qgx*h*Uc>Ab=mrD+EOW!IXtAv#Bi^$Fh;PT4Kt86cC;~#|FFCXFw^9bgcp3Xa zdo@sR{hg9)r>jQj#n3`w{lgZ9O{P+@5Iv$o=ebnpNN2KR43)_$W*ir6Eo{$u`>#+t zdB;vXLOKtBtFD-pXL*gc-yF=%Y}j^vsM3Xyn#^lp|H9SUtw-n!HP;Vh-#geQ)#T34m1N?7@8b`DYASrk2@7ew|H)a}l*#3-%QQHGW>Q1Oc)o(AXiO|+12GLvyW@$XuR ziLihKVVX7Cx}AR2g97Pz82&j?D!YU_OBX5ufho;V?*CtC-FD%t4f>AtVY%kTzb}@3 z!*O#b+2k;2U=R9)19xty4?(#8GhbUV+Kk&F>ip3ZpLHHJ%;dP)_Ju zezsPqO@1X_9A^7*kSWj&^P%~Y{_ZLa;$<-TdofRL&Rn^-Ii2~@12fIc3UO~lR6tQY5@3*Y2Y$Pkn@^@b1XvrEc1-sgBv;kw|y{*EZKi3 zF^{Kak4J&FFzn|@v$wHPzoEVGe^KLorZk_@il6$)P4h<+`sYpD>T zggU|iu$sr=Lb`=;u@rNm0pbjCow!Hb&(}s~M1$c%{zS*M7cGYZRQ*$}xnZO=vb;uh zHx;ejaC8i7kS*q+7h*LZ8+)m6rofDw2-|5pN^D*uKWy;TRL42c6Wj{}y)?}Jt@PqL zU357jQo6fRF{0;Jltuc%ra3{>Q8_=qgKf`i=7vetlNt4Avv^=MlOY@1{vF^tI)GLd z@Ga}fxs*Y^u4a;-2{h?*e=fB*{dc>x45{HMb&_`_)l0G@r6vXvDgU(&AFw-K99i-Q6uv zEVzZ>5+sly@nl_Q_Wt0>!}qn9CfS{xIsbFs^NPW|5KUY(%BPx^Vivpk5_7p?nopf- zXIyExt54F&T8p-zrjdFynzGz@GgcN8sfz1C!sqiTPv^7g1-B^(KK54B9>M-csL87H zEUgAry}{<^s<#}T7Dmqux8hpms^juHe`!G9!{sT9o8Nht);+?V;Qqst;#usi3Fr5U zyb$M-AUvywhz{IRo=ZjPAy?o(a-aFsi`uY0O!aLr)&1%+uoQ>WZ!KdQ--)Bl9Zfp# zv6Qwx-A!9dT(HV&bS9|QC6 zp3lIO{_Ar$Q={tfRf%&&tt8{0dXZ|d7u0+c?{0=Xggd7s{s;~>aLGOwJGd6|Jo%+u zni=P-QlCjE6E)nwc*B;0Yra=}1{+7uj!Oqu`z@;c^`PUe>9`b}@%M5aYjX}iWNsgd zW{|A?V|~4twX3rA&5b8cAb+A!{+2=6SKrs1DWs;aEb5Ic?;Y= z!(dqt!x?2gzN<;N#dQalaDgw!%5|u8^curEF=q3*l;?TdroMo(`3?%} z3+mH6iO2bKg?~>{%j&$if^^XIr@tA?SvLqIr6Tj~7j-Pp>>?Z)2lJVZL&dyBeTeV5 z1j4(Ed$|*SYaiGg_x|nww+2N^l=M|R&UxHS%m+{IBfcaL=pB>Dh%bfCY#y8EYvMgP zQ`?zF>W~!wA3jwL@f=7dH{l#73M>lPH;b52yWo#y@_!;-Zz1??eWfT!OcZ~LlPOz? zPre-IQ!YG4vry$dmG7c{d?Tk*^_$_)5KAg|2UJZT@ht4mhAfUJx;(#s77VL%^a;24 zI)pp!Upy^pF!D|8(TeaImVv~@@VlT;&KDshj9e+tIQ9a!(wC z)5a(qt*_#ztcI~w1sBQf-nyPouB|Y!JK5V(DF)`u%wC=KUuI@TyNp-qyVB332W6bk z*p_)U%aSwGYPKJA^g`W~=-n?*^cNLzN>=yKv_scCfO@|L<@;C=hi35hy7jtE zx)o?%>+2-l3++){*sf^(+P=DPx*7VSV51|99+)>zOnJ=B*egvj&o+-?jxGlFI~|r> zN8^0M3b6L(T8rkMY86V^0m2mCYcaZ((aaB}sEFlx)&|lCo`EB2!BJ}fm0}g#r=@Jc zo6)_+^HjA$4SI(f+>qVnDJG3*?<>#0p8t6odTM~ckH@(*6t`E8cOf(A1-X}EgkL!o z4sn*a70l%^ZX^5Esp@b|Nlh{CuQcw&>1fPIf1G@pWZk( zK1Xg)vUg$?R7Okay1H|p{U`Rvfo3zE$FJ$4DhUzuxg%~-(~a_VJer2W+Ze|Dew>YV z2=8n$PlrZn34h_8Qizk{B>p=QbgrH8G@rn4*i2{i6gOcbTIdM4!$0w%SiXu zlW-us&_rgsY3wV5*($A&&NKUDNHX}`cV?iq?3(n_QF{DDvKa(nCGP6G=s~W_-O)?L zz$qBbjJAk9Pzqd*k#sUiAk(#!-uO0d=BfRv=y1>J$25HYcUDkATt}MHfBed;2!k1N zjH?mK8P-Ly;_lOmF61lo+dX`#?7m_!8u!zkwZRKK7>-yn9Ne?;o%^B6d4YeV8;6k? zn5$|qhG#rgg>mu-@!9BLZZT1Pa^!JLv1{!IZPVc^Pqb~beSw*G*4_$tk2lWSuz22k ztX>uF*a|+-|KhSvk^v5+VX6@*MWZ>{V%YZ-f{#!|6RydiLiB}&c^-_i6@HSvaocdI z#;7$Q`i->-+P`!!btTbpPX=52pS~`0?@QeVT_+ggd-1?|L=}3%>3AE}=}Y|P@=71Y zZS-lCIT@}~gUjG+F%L&tJ16#5D#IK&V_RVn#8HPODsUAl@UJxV#%ziN|2S(DDCDBea2cUF5UukJnHNs9G=P z^rv*HgJ1;wIspo?g{T8psXx=yIQrL#bYHXi`->ydR5N-e^}p8WG!;%B_~CQHZI zT#BkF*dE1U)e`U8H+Vx`h~MmOX4#|H5Igo+qzc>oPfuItIbVtZKVr{hw89y_qvBr&Uf#kiK#`gL1Be@%gP^ zY?=1F&JnIScN18 z%3THn>xue(w&p18-e_$X{7_bE_fx$-up4ZN8*HMki2iT=CjD{!R_+TK4EC-zNLvSw zoDJYoA<|%&vn{}byKt5cSG-&)jl2lH_fc?;aGV}~ustpfc6S#S*hQT5HRVY>UGX@a z`M|);oDxwyhqc(}c4ZFj%(bYFLv|#LF%x}nIj+_^Q2BzK+m}hQ9w^*oFFuDoUJIUZ zlWH(}=LFmfOzI%D7A@`v7zsPU%{suFNJr^7QL040a23b(elVacVhUdU>)GOzB}L~Z zJoUd(-ZulQsfiDC8C2*&bPj1CMEAf&Pmlt#nLBs_cWE`n@_X7kh2Pi?Ca#N|Y8lkw za=h-b{8x{a0Q{#HWovvGv%o? zE?o@b4=J^bUlNZEH*8tt&5gdma@zi*Q9=!5m=!deT4pfWRC`T>$Wn|!=vVciK!I^X+ zHNPSp>1=ki`>15qMF&spGV-4La`#UHPdPzH`iPpng%dwgxWk#yoUD`L{NJhU)$-G4 zJi;Nn5w21rs3%>;x^yTWD*CUSxrI!6ovHD~&{eD0=OG(o5)k;eqSXJtxQ>#NanqXZ;BwMjWoqmvi-pSPSE4eO}R}+XYP9-+#qi`~Mg`&GN zllL0BvG(}<&IMOm$#k2pJVNRF7~~<9vnUR2#XNrBD7sglvK*(nv(%zuVl2rG>y!_^ zJDx4Bp^o9UQ#qZpo3o8HXP(daE2C&eQu?{{eQ0y*W&~$;%Tnb;*v2|^?o-|_%4eaz z>Q7BuU537$afGRb*=wF^`C=&-Fg##;z<&YH0-gq(3>Xz)x3seKH#aef#-sXPy8K#$ zrlfiry}@I!wDWAco`d2kQZ%UfLcF5dsXwYm;k2@oJ@Ihe5-LZ2-3sk>keYR>W|A8x zkp8IWs{8&z+26@yK;?2B7nqao%kCTQukJupBF{aey(Lh$Cd!v_jjGPGAI7~^8E5g! zoc$td&6fTg>Tx?otDMI@J)D{8Z@TnXI5thB=B&U^yBCv%Th`&LKSz8fMd5WkSldyT zTYo?wX6R#Bij&1gYGZZ76MYld#ap%WnbwkV-_!`(l^(phR^ER-dGHyCV^>=qHip|X z9v0_#rtC>VWZQP zs$s-0Rs^r;!-d!Fjg{=F(sC zU8a^(-rC;Bo^j~oU!YrT@6PQ`bX|6B2LaoGPkfRqpZhNqjRsFQw(veY0MB^~f;ZZ6 z61&D!Kb8vVQ!2xI-^_EBiwv1qp&}i8QFa)`RJ-w+oTW}?|8f+si1Fy=8-ev{^0>aEHQY2JC;nPNSQk{i*4pxuvd$>snpab7`DZQu;t&@fWZC7jynsn$Zlpz)@6* z)u_dOVXJM?Mm`WFrqZs`2s)8*Qa@6hB2bpxBcov!jK`XEidoDSo2fz-$!WODGq=RQ zfEs&*(_afWau`4DAWzOwddG##813l}Lcp~y(W4dd-ypy04z=^HZ#X;7Fkflr+fTl+ z@Wtb~7aNh7G!NH>VbW!KjtE#*wdp~csG6x-(^s|OeUzaKIE&`;9n?ebpqM7sw#=h<&tOXNJrI+S@i!dey*0#{_FEbR z?g=^_JSpU3h$G}?NXw9I!FPfl1>OkQWtn7dV3LgY^y_qU(dE1Vk2b3fI4kVMZ|$z; ze>lO9);+}uqrSd1U0@*o3zKws-)hy`zPKelQ+-AO`v_M3EK(%u`x<-4cwV`Ox*NEg zk|YxEuIV}Fso*`y2JD)zr>w@oYdw6`ZenSY9v0xnQeEAWx#A~YTV~Zv=_fUN7d=@c z5Ge-K{EDA;6*YAX&GUC^#IM`O7S?dWEe zK{bZEra4^yJi@%+{IDw^W_Lj*3i#aKL>$!v$aq)|+R%oRuo-77J4kJ*xQEwqJaJp;zmubiM%9AZn8#JQfQzZ|=l zA7WEx`fGRzAL2xO%g-8#SIjk>5$npwKnrr{f{yUiZujos$vx+N={0atKjIn*oXJCQ zpx6tyq!+HK6FJGEcy5<6f8!a+DcO!B4ISO;cW{j~_HY9K7RnTp4V?U@Z_4<19jltou%@mf!xHQVx2_hS18zJEZ1Twy=fonb9H*CD7c~K-+fdBK6aJp zA?Bg0ufz5KOAKTuSC75!G?kONsgjT^hkBnmTiH%#6-od0Q}g{`(yK4a6YqW=`FZ;1 zxX+UkJAPU4)t8j;tyd-f1iJx9?3+_xt=TDel(C%p6IPPp*z zk^*r9Y^NO@@5U$9$gEKWg59^_v_Ce{Nm zl%crpw*#MEz^0-s=yV(Iyqm&$xTeG|;Bp=c!? zvI`yQcJAgxPJ$-PIG@mrTwt2G#vGW&soH}ytw^4*D9)t9U|`8&BzZ|?VNPU$ifzJk zwGp0hpWsse!5n*x`z{d9C0uH{(8J1Ul6DUBll!3oNnyU+gr?y?i zpet2SvOJ|Ty~i_Mo&O~b#mp)y#An#*3Ebbe=*E+%BmKbR0@2m(qoTcrhr14LfdK~A z95w+Z;Y1kGze&^++zr{A9%Y-{7d*s+bM_o&d^L`?2ieN(P_DozZ%nq4-QST};1)mI z36hfsjBy0dshf?vR#Y1%qzax;8$TOV&W2mtud5WL2AzH|E)CtF% zGSoh=lAv4yDVRD!yOWb zU->EA<2q|}noa677z1Zqp7!K$vYLnDQ(d}*)_X_*`hm_UwY~P>W{y4~9MbDSZRnfJ{)ricE!rr>R z&Uh)+#1pL_v)*1hwrY3?Os6s?bH5$n?mP^dc9d+wQA$T>+-_TfB1@vYGG2Iou8Y)3a%PWr)Y@Qt}~5y?Kal}l8iYV5jNu~R+|54HlG;dUHj zqPZjA`Ma>Eoy)Vo83eN=8@Mm1ciwYyPC{#1+kcn2atO%ezaZVYIMX)s9UAxwU716c zlRbS755M=ERXXt6x^x4>cr6{_3!NbEaV($TdoZrQ=`xSghs1bg+ySFxQ_d;S87V~Vtu$sH}NQF2dYwztJ;%SHILrA6Al0;c$)9QE%-@2 z=?y!xB^W{sv-2->_)qXn2VN#QXsQR`oU-%x8DEedWD{rk|L`TUidrd+>)eyA!&$oV z=~TERwCBgsKlA`WSx6dB8B~^w*jp!}ukFt1n?P6Am+mBoyXU%c7Y?3BiD1@lN2Tiu zw$X$?eQ=q50K;lLeS?PYEz1u1Ez^8M_!WEDI2S>8evut?T~L+7;I!r81ggMPYH@EJ zX4hYUS$-lI=4IyY+}wTtP+7i#2|Qp2qW6yjH7tvdN-=a$_wfD9i^?XRWQ)nLcFyx> z1(Q}AxHEn6(bjR#H>B^_!Ibn5*I|JeE%rwd{1;9vm3$4n(|KC2z;5=tM|kvXjwbMP za^z!5Pn-Z_&@)ycY33Vw18+6&w4Zd>NuiKng@+k88gAKsQU60^ahu_0XM-(W=;#(`{$_ADq#Wl@eFo&tGELz$ZbKj@}YrRN#*N>-+vGI zmm@TzwL^4u^iKV7!x=Fu57?0yoz2khV;VzY=E9C9k>!laEmShXKji~hoi?=l7+g0MCR2T zQ9D&?RjPPSSn8k42Ba$0EQKjx1N`K^9-niQtx;CK)VayGKmG6By_emdwSW30&i{1n z^Y*VZ-bW?Q{FaoOKRd$l&NIaSS=Cj4-`qO*N-iNPJ#UMG-wJOkTD{oyqUDNgF4!<% z{U~+#vEc0%*`R1osv}fIr86jcuY=v$U{Q?|KY$fi_cvF1%9C-gc#kTknR_(+v&oL( z_D;4xtmAXyvL|Mb%}&TZk&|uRVL#!F^xXFC_wSK*XqM@lnJ!vB2mTwJ5%MOqTiEol z=3%j+VyHX#YEYZNLzZ~cYr}cnTun<=v>4#8Ag^XORlz+2SB4jGr5w&`xO+T>A^t!2 zUXTYbI+behA;);uvFq1)`@{c@0^v)c+Fs-yosXaL6tu$e!bx$5v|n{feO9wg+Yc^V zT^O<@^>HA%2l2WsqG_ofuUbt8#dWghez2FVD33wQ`Ui~YPiP{w-sVgv27a>DH<(>) zWib2)pzy(*wHBVUU+4K;_N6^RBIdID(^0El(@CEc4D92lfU+*;x(xuo>qU5}(UrCiSn(^Ao5vo#8NzWU}7^qIQzm{vglwVRo!J{syEGX2X0~ z#P_XZ8gR35cfjE^!gbrOYy)jiqHC-|H_-{~wkMO#M(SuIl6k6dgbuEzauvPyKcrxO_h+-aN@Q#CmDix6PDQgJ z(lBk^2TlBk&GRVg&ad>)y0Cllfq~Xy$MK%?(kZNlpSFxX>ngmp0BJJaPXi&A*Hwe_ zvl^4Yv}<%a!@!dRKn@o(ZJlFNGLIxC7bihum_(PEefE=< zrl)HD%RTZ5-SG}8a5fCHI^f+u@RbbWpQiI)C6bR=0&HXiUDqpcmJV=$RAOLO=m#X)815PLcv5 zP#||>H@^(TUk~3SnEHA^$;(gGfYaOo{p`pbeF5dOgB0y_kms48K-c+BJw6RFyw{Ih z)50L8f^d+}ZYRFnYpAic!A|`0MP-eDxKN(&%E$a!0T=Im)It$lbSG%^Vy4HXoGmlp zPj-QQl9yMWz?8d;Q=}}_Fq7U-;L48RiiPptoZw2?I7Of1y*!>1Bbts|=C_A|MAra$ zZp3wp0KdP+tMAD7$-k%avgkiQ(LuZiH~+PZtWE!Jk}fg#rt!PWo*p zcXSe9~#$11A4zI;eVV z1S-LzS`Q}Nm>FD00_P^K`(-}gKVgyGXGX8VIhDgJ(=(~Jh4rwM8Q>UdnfLT6Z9vy` zFhbvm6+p7)N>iBJ)l`RO^px}XwByJ&4JNIi9v$Trc4K+aCXZutvj~2M>_05jt|$(E z{wIk3pKJ=c@Xvku{3gL_`f}ns4Cm(mD+IFA6S z=-eKog6IIc*%Q|2NO(J0Y_(Rv5^OKcz%BW-{|!5!0p!K?!Gk`LEUoXbAO7&2fR{TE zhK&lZ$R$j6!BmTQrs_wW=Z}8x<`<&4tc1V7R54t90|IjiJg6SiP9<>?hZiFc$+ zs$J@Zn&#S%+VW_4UZdN|t+}mgD?Jhh_^T^_kdF2Wl=_A|Tj@@hep1l$TnCGX$#~nirG{QH$$_%lN?zcASSmCnCcZIyL z(av-BDmJaPV@}bWF*&8J1#QLcVUCNWBk0h)jd2urlyt0iOmk+r-gt`2yZoi4mFgSX z6?z?-s>i0X=GNvS=4YnPrgKK4v6JDr-lSiti-3{dQhQ$$si~s2s7`Wn?IjPwAXmK7sn&vt6hIy_g`X!ZiMdwqiEQv!ZbA zQq+HtH&PlOrK5b!(?)6+YGQD@c}bW5kyEOWe-Q7kh8zb=qB86vJ-t;gc)y`kil1@= zWewR{3P@cic2q}U)p^(={c;oE&OL5tL2pl*W~Hi z!8uZZll}KJhJSv~bFqhdv5PbO54Mb-l)mWTCxO>h;ryrvmVX2+?kh-Md$?G| zKrLH?#tq^<6aXpswL4x#9oN!vy2VM7pNVP-IZ|e(kKx?O6{N>> zy5ohzs1qhIzeVGGaY8A<85=+i7)_n*NR_TeHCWFRIQBO-I~WzQfh>X#@QEhlzdRf7 zmlCjSs!Hg+VJehPCMOZ{oWu|DJuGaZlHz5;PD_v4=Ur?{mQ4 z{e}I+GiiwEAIq^DSO})kiW)V83G@NUl{?w2Edv4C4VpQF+_2l+X|Z(A)u?cbK(D)S z9^HY7(~Yj6Kis@nX0|-wmiaj`e{x?Yuq&-eC5#oU;GLg2AF9$*^aiC&Qr@${DFDLT z6<$UW?we;!Qf4sU>Vg@c>~m6W^hx~f~NXOVn>C}gqg{CqI ztzx^>pHJs9`LT7#)VjiS)tNNh;_zciX-;Yaw1c%vP!%lG_N0=9;-eO)EIzMtv zzW0Tu7MoSlQ~FNX_vOU$k>!HRB$qf?WL5shktaeYTKedAiGTX8JD*#3WYx&nnf56) zJ@sN*xs2efhB>2bBOL};S*8cU^Vz-L-IeXkc(>Di8;$s9pM=gagc=-1cYanqOglw? z&sf`XE>I4(hEB*eEc|8ofp9t3v#>^?U4lacmzi%GZfWu5 zxm$$&VLxG~n9N?buBNJ1gZoYtER!kvKS_}|_}fccr@4!R%2%PE|C_wj*PFzl^K6-- z-DTX<+-dH`=m*oidwgBtluxCPtwr~>o}TV5z9k`?&})S+@Y`m=X?)IR;w<~wX6Q#V zK=Jc{?_`Usq{_Hiv{tWz`8M)*2HF(r!*pR97|%4)ajv07 zJo`KYy_I}X;6^qj1Mk@v;w2IrnyQ~M!*3r|SzOar(@bL`2d571skv1n**1oX{lMr_l?KWdIa)pkBGCsO+A_ExdFb8V zgX&ynQu)u{5KOZozj*05lh8Z_H~LCUfCiL5UC2QjN#Eth6(NX8CLG>O z2lx^fL8nYGG;)LgK4+%rz=^dDMD{8;%6)kLCY%`*Uni!xTgnapZQ+`@m>uaKs4@h! z4(XgYadi99ILZ8)l0H!_zA`iA&=)kJC;K5Z1;5bHPi=zBrDiMB1swlxa!A!YyBEc4 z;0=eBIMUVZxaABX1+6uwM`5Ll9PAtCx#eo@?Bl56P#mXRWxPd{HeyxvPHj_s#_Jj$ z>Gk@0y7k&>+CXinRTiBX7w7GQWaYT^Ws2r0HGoiI+0*Iyeo;8)%8 zLRpNQGucmH%fblF^8-0AMCo@-vGuM4WG|B0WZ=IY^^dN}PJ z)3(sAVn@1yP3u2Ai&dEXx6pfcU{iIHvu~ulgS*_y7UKh6d0FJv*7w%uo%hH4N5#2u zfb+8%yuSASmtgF*VEDG=PEJvJ(_J{Ty8lZ36x%U8F|hAHr77w*72hN{}9xL%*YE zBXCS<$!8cPwvy(nZmZKYAG90r>o)6elOEGqTUV2+`ddm6%KK-_@4T%&X|8+D9L}9S zj&=BG`kZ0z#-7byn{S}<+}~DwB6U>1*0j;>*55X4GzOVexTy{|eAd0z%vb5fHA;8i z5>E^F8P|Q+H1}~&QQvvFh`$$H&Ln&oRAfU&XwGP7=<^$Mo30yI=yOzOeaSf)-?qNh zKI(Su{n?erS{-hAWWmY)mo&HgJnQ;7JAH=dAB_@V%AK7zUy%1P?$Y|b z8VA(QM;Ayp7xF)>+Y<;%$gawGycg~km=2Om6P8d z=1rZ8{kqWgJB<(D}pNzVs4nu zSyz_L+c2KyVc-M9#lLxir~l?emKKx1mpX9DKxpNi^k6%m#e`8^j1Zr(hyTX(XY@a3 z>T%LFKJvFiw^op!GMjfh4YtH+YQPromUQ;NMtF!Z{4e2b@TXC88}er;JA-3PlV_+A z|D#IyIB{O1FtJb%JMmSWD!v&MC>B;-6PQ1%L4tOZ9iIk9eGxoq9ra~9o6VkF!Tzv! z+_-cYsh;&=c~T1JgmZm(&nPW^S%kYY#JqvaffF=_!<9o z#HT9>&)*+Ti2mgIlJ)&W`V(uW`=UQVUD)uq`BH#BXl_uIp#FiTfI;So##VY!`;V%S zcuU#uOUB7D*j>)8^Q`tBmzxOTssQaz{Z^CJk`XvEcvMJANPI~7kj$VGfp5&gMvr#C zs5t(_gU*93&p|Uy&bqZSF2E zH#*~B`)Hfhy4Kp_N8t)|ojqbAEXzY_h(v4Rs83?eUb8-}%=` zl{NqBRvQYU-`HZ_YHnyghL>S?{CEf9?3AOwr5}V(hC!F2S*cd5hKR5HgOw_B0}_b~ zf)$+gtoKYMAE1yY1^=2A^sS5GIfi-GcAp882CWo1)xU^4b$gJ8`eh5D@)JGPJ=YQ^<&f#_?XJ%IYj3H^wQa`42 zNu8h8BjZF?YilmYSJw&eP^F;wP&H9&G%Pe-w;T?Pz|*{UNV$+1!Q+Dp2A;GOHm@Q1 zud1%ArkP43ZdOYAn75pM`zPB3Ue$WL*YVW#&XeIwS564!rM66gOHmh&Q!DuV50%D> z%Y{earqzFOf!Po~kXn;K7o^kc52L<+N9s>q+!asi{zYxGPB#^m_blxgjZWQE>M0CT zw))C@YkEGq^LcEZ4nDnN5%Nh@)VatU3dFHuj`1J7Zx$Hl>nrMFaIsw`DQsP&R|8$%6UGWJmZRn~mpj)GPu1XWV{y?RM zZ=uKFe(6kgOvRD(ljDiAnEQk0zVDWDL})LqRsDr->nu6S_nCS&O2wt;RHK3L2Ue1{ z@CL=wK3|Ntf;S3>wZ*{m(H{3TJ7HAeJd9e z*!rr6YkR^J?rEM8a46_p$oR0mxdOuH=E?}|5FBqgZYZWXAx!rD#8s<>t-H0MHI?W2 zqGPJ7pC_O1kzACzs-`|q6pM+Z3H|nwaL#96hY6o=>-Vj_Q*ch}p;1nFE?fMzo)@qHk$6rWZ=K105Zg=LS zX0@QVIGg@1eJL3cGqTrMQ|uF5xxKM+AK{f$NK-(Ups#LhVzQh1ndhL$Ds8@MDrp*S zoM{-S&#ODFsh~b1H4t@zqBO+kasp|+k@7PQa$0)J(Q3ON3;+d_JiblaJ8{edY-~5IW&D;bW%0EiMy!z@0t}2ca8# z`r_~wx`Xr-;~eYFj%NU@i(mYOU7Xl+*&SSEe;y^xXCE~9w?^_3o2Yl}sh+TfDC*w` z>Nk$``Mc;HpOchbhTV4_`8L|qT{tDJ=lt33sfw@DK>4)t&Hq&xC2oX+v|0Gi9|wPF zF0Ww@r`rxVRG*n&YQZ6E=bxtR;OCX{#p0Ed!zQ~Vli+>W5oJO3)A;ODIE$O38Nszn z=>{iD4-R)#naJ+uZ*h{;Q{}hanKIxR}{SH_N}Kk=4(XRzr1r}-f+ zl1IA^=PXTY@U6z@Gw({gdi+d&`uORfXNO)ccz5Bm`@51k$dx5DHk1w?9+8l*Ymr+e z)MdiUeJD4e-0m_bOYSSWyFg;p!m#g_V!DmO0MA|9m(1kUk3T+sb0+8c*8cmbpMR$n z$m(hP?ph;9OTDx~#{8CHfnV{G9vu8nP^rK+mV%~u{YY)J+9?Kb@>Z2Q`@X@NXiPe4 zL9lAGcv>2u_G%{SV)ZW!JB%esD`{qWkAtFMSb=+Mrs|V;+kaX92@9aId#bAtdgx8A z>hSV+dFqn8>Y^i-asJwfS5QrSRSJ3wdyC-)pX6DD)GaHRBL-U_hn73xVhGA#NPtGLJLG7{2JN8Y?`67yg^_Vebz2Ip^tEQ&T#oK;#d}>@D3()i(4N%~H(oYvGe=qKSX7qfWMO6-o%krm=vH!e zbys&)b(bcw!+FHkwUII(bibHyCB9^*Jri-c8%rv#+w&(*zZ2Ok>|+yn7pMBOY{>e; z-~UeU{0}Ud9Xub!)IRkUQkai2-M81S(M(jERey{7{V!#suZ`!btE;oJqc3i?-)wzI zj=AC7;J)nDD1C)Z(rNX2Z6|%EVTvio+%%wB;Nif$f#ocl4Z-T|zOh!_Pt(WY&z<-8 z-weKb=E}cUSI34uochA?G5+TWTMuQJ?w`Qa@NIeT7am)3YPrLe4pl8!{bsd+Rb1sS zm9!Qt8TmPIi}scL!>-Bf`14WHh{Woj@_wxJapot(mygLWQ=VmwcMepFYg(Fy1XT)~ z9o{DQ`EX}gmyjZXyG@b$t?I$zDCN2LU-v`jJW?wzpl=-OEaz_JJtq<{HF<`4>&s*Oxg>|$ zugfs5w(JQsa^7?g?ih4BV2ioE@sn<*rnKt2a7^jtbGpYm6K$P=4D=a$(lS%kX`j<3 zWbDeSU=uCB@x$&(j#pdnOp=Dj z;pkOc`5#kVidb6JLfsPO%~5TbuA^>{uDh(|w_K_-v z_(s_lrY0wjdh<9g>0Xsvd2c?t>AF4O;h1Mz-}U<1AkAwVDKFHtw|okViuM<3SaM&v z2bH>3%~dU~%GQc&$^;f0ny+B^3QG}9KKY_OZ|47g?n_c7uKzgy!}kyIpXz)y|8S4txt!Pwzhm1F?8i2Xczu}3WH}R%6L=#?3ceilI&fe>NAm;2P3<&Qmj5r` z57%+~qnsgG|73JZznT`8wlw{HMod<)^{)N8>yy{7n56{uAl(W>d(%GiYD=zwh5-=) zCoGCNzu9QIZy2usqV1+Rttuex5Sse)Db?kFxu2@zEs}tDNVM`$8OzqF8ylXnY>TeJ zQJF#yn_HgGX7D45BMDD~c)UXG@;Y|#J5kg8(m%B!lV_MzT4hxwz(1O;EsQRHGy3?O z+8>(BAQ?L8u+ZL*vQv%($G^!$6y&j!8#0<*_&x6#Uo0o;S6mFqS&`n6WV)Ty%yOi& zPiAvz;8gun$}jGq7yp;snM?DzXO;upR<`1NR7Kl@?%h-QwZU9PaaCyG2T zox75?no#RSt*$jES6x?LDA6r{WO$tUvudX|zimzWi|?Ud>wj91V0mwSH#%YJr|=~C zXKGe&*B8H4Th&rG#FMK@M6F06@>K54xgLki418@$(xt1M{y%($-TNFrZBe$uHoI-O zqlIgfXSeT-5+Zg~#cGD}nhyu$3K^EGTg1|+Q+bx>35u$oyM5^TfMtf2YKzd=H_+YR zS<$h|-qBvgp2z;pcEI+Rt+8zwlizK-?3nI~^z8A9sNB}lMa_jB&>i%^>z#yeUKCzq zXS}_AHBh|F^uH0BN&l&elJ~w+H&!2N7|x{A*^q`3YmsibwudHL)m$1Rv{iEZ9=O*# z7uz3MC+BR-ZkIhPyKc^4t7!k>h@z%u$diO0QUg4;BMjq=y-g2I4@^T%F~&55&QMps zOs7UG-UBE6hvcBWP!~`)R}E%wb_~8zKa?cfKun5&6&->BmYY2IUmhFF;h&!MJ@X~u zyy1iZQV1pXH+c`7;MYQFX)-hMT#dv}yo3L2d38Zm1b0F^^n*tKd^p6z=~nalX5hki z6~$mpubQ283uV6lD155QVCU1}a5=>tFmR$o53Htr^mYko^2RDVVQ>xM&Y$h83`hQ^ zf1p@M^+??Yw0Nby1)Rr^Xr_A`j_MEVx@s?| zdX?9EM1ClgQt#0HYusKz3alMbp}?x*-O5d=a;)Z=x?v3#H@IH!K&@s~(o6db8gm~q4H53!tE7GV z8v5bRYr~88@r~oFJ-hwl{hJ{lnW}G}P4%EEK*q&!GGh3*Id_qrjWIp;1e7 z%?N63DytnK)|YR&D?4Y{ui0MNPTNa6qugD*cjWehN4lvwrB5)G3)~%|3y+N4l&5Ik zMR_MgyCOB=)}R2>9rbp_<|=I)pOuh4B<)42Htkf}iS&ewyjfGSGjnF!YCD2mIqnzU zrE)L~z!ESvvQRu60I{2m&Ty;}DKGYBxyQJgpdqSi8HyPb0H=YgLyQgWva$*7n;$ad4& z%KJ_kA~`if3>VA~180Q9gmn#Xl>5)zkHbggniA>`Dj87FWY!02YD>rb!{vou#r>Jg znTO5?&JwQcu9fb|p26NWzF@ZQRbWlMhi%=R1n*1`h)q;54}8J%B#mA3=l3s0Q+i*% zjvv7ZCYOc63UNBhvlH+)w&UB>LFyuQ5Ni7yD|kDAs2uY4_10s;Z-#&9aZbp-zBrWb zhtONkhGp228mSVx!MRCge^-Gd1yQ_-4`wto&>_AO(M4nnC&XD&T^wZFzz>0QHxi74f>Z-SE_MqJyqKn2;zJlf)r+OiwwX)q;pLzYMJK6mY zsZUMi{Qi7m9+jd#pbaChr;IVhxWW_#R%W#HvMjZXr{fu79$@krdg|wBH>l4`Il@SP z38jKO6F;4&aL{ACad`1Y;Lx@Tm1P5YFT2&|AgvAXHHntPeJ^l83UPgKe7ASEH?|+Q zuXFr#u5pj|j+dwTXNZGUjWrtG8S)~om;{R$a5Nwz;8K9k^1vKr3N~EP)==*d_5L}& zXwNrilD(MiLe9Z#b9QQ0pX?r_{iWKwxYXV!@@k=|YJ#SR?ydf-VYcxFKOls#&9HN&52^Req_uASi3S zCEV$bVEa95QEM|g(=GPx&K&n-A3G3ns;Z0Ty*7}vy%kiNr>Kxmku*?PJ48K9>L3(U zG(OQ&#kJkh$3DuIZT)GTU|VT#=$zoTfQjxAOQ@S_AM0M~`x=fLtcJl%OL@&TRj57!(}YrC`32 zM=QituUGHy#_`SKn};+T(J*(di51!uZ57$k;uYha!I{s#`x1wK@V(vfy4$NZueQ9N z`0mTccS%8M6>W!o+3E@A8zHlD&xv}RXL_DHk?G+TL*E5N8Y^g83j4itonf{O*_E@b znP0PR=1j5gaA|y<{jdx**}A`tcJuzg2_YkM)r&Y6H6Yp-T{-$&Wd87=;3(52^$6vX z%VV9J)g@yh&OEy^@@KuuUSZ8|pYAy5JmlK#-sIWkz2QrigYciR2@BvEuENns63!_N zH^{=In>k1aWJP@=AUU5QeuBJ__6%QnV*YD0KAYDYfX0)@>G>;2ySV)CQf(9(95*a z+|_c(veA;q($(C`6k>d=pQ>x1&9BJ|FMcgsh;=9;zQ8~z3`a@ruc5S;8~G}GOR_Or zO%_(Dt0kFg8iC@z1&(Eh)%#FhH&%P`{Q47T(q}l4=%vx(S$5Ai!HjlN zt8DaKO>y%+>?wvKbv$UsH+h#b*k6UzGOPGTI->ehP5OwY4ov3 z4obV2bSlCBV(60{_dDLbcenP#LGg)ieP68^e)o9wCyOoD@#w0B&KFx)DyHnz3d<_R zS5B-vty2H;gG)Uqd^ykkkZFc-LOoZl>?^6~zZXk>_;t+JS6{y*P5O55$D-6?nH#J( zTvL>(>bAzMfk~ks!<$D0Msy2r5!xc~pz)2SteENR>;A{F!8X-e(z@Mx*4E20#`WAY zOg0Ng*bnT`r5ehb`vt5Gx)yRjY-4z8?o|;jBa*{=gl!8-HBHyv5F)&S<7)QKjMHhZ z)Ea3u)Awi8&5F$qvlbyO?Wz5k?^mJ?cWaDbAay&uE&+g zYF?t?X)ngBHffsZ?(54N|1`}u_qT)v%m`Q-P$i(3#b_>X{HiOZDJ{8_OWq}}#rF7| z8Ce@M8m5m+Ym;^@?M?d1%qQ8)ZF`-9caoAOHq`Xg7d0)kEDF>H2ZgLB5!n>t2^tYN z-jd(6R-d8iuJQ;eN^?03PZ|j}OkG^lHMk|+g^Sn`7m^#Y3!T7U_@u0Xkz5kL+fca^ zxxzBJu-!cq@NZt^?eF^^48oq^e;KIeL-0*6Lt?`=+#y zt%KGEmNTE$l=1m8bzi1EzjC{LOs>-vj@yoxI@|ca>i2VAHA-$|Z6f$gL&ERnA5vmf zg>E(0)&J4-R;$HrcelOX>S~jW+IK7DD{?h_o*_!MXZQZm;`5=mU0zgq+T`(>hX)_d ze>^aL^y~Sbn*JuT<8PW4`(u^K)FEO7Bt1{2HoK4YgMF$iuQx^>Bm}AAG;8%8P3e|4L3Kk; zh0YE;9#%fAbm-pTXMqna2TY3$BXzwsy;R-B|M^GDtGv(LO z_xJvy?0t`k`=y0c#wKc;srJp3Q)^>4m&r znT5kf16;~V;=_0a9!Yayu>W6FvV-JY@(w|cB*lJ;+1OMNz*uMviZ zhHHAWK3W%~{ege}459QAv4xK(kkY#)6{sUg19ckU1co}R@3NmEAd+I zvr%us{^7Xr0mQx{n%jTSKn9V3@IWd{GJG+3c6mt1PSZ5Nr~e2(Q>Vz0%?tbaIw_?K zxfiean<{qSEu8BLdXC`W-O^ppUEZC?ZO6aRNcN(7u6*rbGIBnxd*p!VsmJuM~+R4;|aEu)Sp~V%IpvID5L|y|Wp^o~6BB3I?g3c7BZp`9aEl25opoE7aqtSLFZY zQgx{>QWvCKGxgS9j_dBnzW@1KkwH=rm$>4%DZiq}s84>uXmy0rQ2`tA9;z3x+47QXrOKvZ_&)E`Pt%Fo zl4_ec)_;W*!;#J+_8wMsPPgo0*>ke%Iv%n>YXZ_$54e;6R*H6kx`{g#=XRXn&$#jF5nh59*@`_vXZ!@c|1q>N{m?x{ z2nUrH-eJz(*%?3ACkDQ)6rb?m)t$q)SKJ-@=+*PE5AD7m&z|nBsXl5-435ryAx}tw zL2Q3?Wv^9OR{2Sl>Q&}cyjG@qvElht;p;8;HJ_D2?%}r8Ssl`QrtJD2l!d} z|{&F=I-s%B?IW;2nflug{@5aT zbC}04dQmvh!<#T z>OShr8XZQBsiX0u{+)K3I#l{eZ(d%0?JEqP8RBolhO;{?r!H{)r;y4%5jXLDsuIo zqv1lG1zG(p_9J)3Oh;^{D{3K~#&@A3$|Z|`6MUs8{I_f1rTrSD;Sn6+XE12@z#R;S ziBLzXM|Q-YpkSM%Ex2>mldi%_E+|C%3&Pgi9Gvs#V2bZ)m%b-clT*c3 z!V%%pc`EyMDMQ2&>Mgpn#(ylSfxCjYhs1@n4JjYIHSi`lUkp2(7aFgstn`;~K=Jze zf_j~BopjpCO|40~dPPSM(kk|o8dk))#2M_mN(#$#&mOGpj>57Nxw&T1xi+qDpx-gvzC+QSYw0mi9XyVoTRF&W^d6glu*Zb7--Q60W z2e>wDugbc|x?|m?NG=}gZHceYQsuEfgxs{Mpzn z*m3sLeNkde#}#D=`43UBU)$obcZNQp5T2X=s@ki)>b3YoHzmn9M7vGnz?-3mY7I)5 z%Hn?1aA)xWTCXI?fpP`T+9RHd9-lkHGtX1S8|e!}TONX|##s^pzlnpSFH(Pe1l!n0ouT;0jvBM`+YIrHmuN26=FU6C?mSL$$8D3CcL)6eqW^2r)vU*Rb1igizt z{h0ERqArVW$^z|0U9!HKal9$Ue8*?6Zvnr?uymb$yZeNjKN;s3n(A}wvTFl1dBtqP zPn0%7logW0HHrF|5PM%+iuI=T7L$Afm|-`}w%zvEHo%^bDK8UU*`=rQ9#3cbND6Cm zqGMhHYCl`@7Jj1g60O%!aF9LSp(yHi zWad)@-0d)Q$bG2TyrteN-qObF*BOVJUKykG_XU@`N~V8ekNCjXbz;xoDRuMHjq|r_ zKD_e0{fBbjw`yBWCUH!Mp+aDhW#lKG&ojB#+_>55NBD{jx9$^o2 z__?aelhiYHcg->WFM~GbOwM&6SKge9g9ZeI`uUp28pdI%3u(5Yz8EYffw!aKjZ>++ zi>7vR4tnBS=n{z*wN$O^@MD$HyjqDy;{(kNjX|?s=%G3;Z+9KD>#ds1yXhU%*Qa;R zh|H{s+HhHG4(ol(Fw1|I>y~fU>-Ju*S@K_1Gfi{-Sz{k_8=vjePx<-mHup8RF;6rf zGT$?AG&^`(g$)|r7BRQ_g0e?Scb#&+Mk^-HKGz;%-(?H5EueZa&SJAfSu5Mx+4qyf zn&OU?zRORP+4Qe%qp$X&I*M$fNBp9>q@Ay;pua$GP(4Efg9!}^5Bl_F*eS1sZR#Pa zL7vr$R=FgfA<_#)onR%(C`0HBU%;u7bw zpR9DjXjML*dde!fDC&KQRB!a9v#&0?ceUtQuR!;?AGLlL)QM^%nrPq9SFfv%rE?^f zTB&$6hsvOMa1Jh|Gg=oqIg`80q+4e&6##t|H5E&Z@#wYCklIcM;b1!Ie^9^FmHH$L zIwbq)hi*vs!Xvsenkjy0yPTk>qzkNh0t&Fr=(xJ)J_&cEm8NFZVZByPF#X6wclu;1 z3i6@Z5`{A4ZK|KAQ4KJbuRhcS$mV7)%V?2tD&t;eFKbu(Qs*`IdpX9_OZ`B|2?}4L`=qaF zJYn+lY319{@1vh4+etsS?jNBO0u-X-QP8jYRz;<6Q*rC zT{)d}C0PpsJ)rHMdRCP}l8DIN4?kZ~TwjKgrvD!QU>q5i!T4F3|Y zJ`yx{k-V~9l$maMM_kAR_18jgA)f4DEYoqWpziPj71uo2g_ZPQ>E#Qcqaf)Ty8dOU z)KODY)YW~_U5Jcj9+~}xrvDsz9z{C3&QXDP5{}^|I$|$j4f>(IG6@BiMq((POJC4O z-6jkd^3qLNj(P20=`SCl+(l>lDeB_`(C(c=)%;x;2oEuJAoYf!RO0n!%5E^dLUpKD zU!p3Af=fF7I6|n0@9xPo)Sp6Uc;8Xf19hcBaGQ2A^VYtTi|C=L&y=AER2EGrH+3}-hA!) zr$uUK>v&g;GC=sK?QG2N+aO?naFINH!omt>D`G6B3(pqbx>#zFLWNxgR^_{rcWLfx z!Gi+k`83fx)pqHKW3Y8%W_-r%%$(Lj_Ug{ZuFdXl?y|0?jv$-HvKjqqPlkrNwHNN2 zp21>AT~mX<@rhxtUeOlQtU*aDw|4@K;HUYfy{aE#yk^?KY@mPUwahBaXKG{|V>m^g zd7RG99LXBmOjw0ZnpEES399KA(yu;RKE_p67@#;?W*hPvlSh`l4ewzNM?j?ycK!=0S5~{-lh$wU<0;mLP zNPqqn)S5!*y7s4Id>+}$Q`j#LJ;RStN2)+Ism;@e%Ff@gyl?0ltB3N}OggT zK-Ky@^U-pm{@22N%w3QvGa+cQKcM#1pU&z0*wDuGZX8w;xRbGHD@&egD8_D~3;8#_ ziaD5hl#AZ6H16yI*WAq8-bb$Y3i=3FQJz?YT66)bG*8gu-k+!HLSOn~)aJgRYgviR z?NEAa#-JL}hX2Y%#Ggq;nHF8%9`vdFQI(^k7^R3l7`f13p^R&I`2Kj~V z|4f)o9Uf{B`1m4qHr|OLYOrY^>4H=aP4U7g8n{tK+Dv6`Zd5EzQinC32rd#O(RB25 zYr?|R;qM5#Ajc7n3YuP7=(#La!HwxA(P$qsv9O({m`0`f!>sLFOcYxq4i{_CvvidB zFP)06!s=_>uc$if8Ix7@6^h11BsTvTidNZKt4@1hu54h69& za!wVKx5|!wTZW3{2tJ6yBcMU^6Z5;Y8J1ePyK;D9SvSd3zPPouGht= zoBckk3E}bvj77_&=nV|q!7$XxtEqrGLJy!=+0<6$SXHVOVjK2Q{CB6J5B^3QW?_0s| z?u2*0rX(%iuY>*6j| zo~O}O$cBE>DYYI&#1SeBz(XCmVNt`tFK)QX?pBcG6t zx^KHQu64`=TI0-cj(53S!^yMVVZLc^YPqkv=DAi;Gu51$?0fLfqm?jrxDI8KW^lGu z_^L#wXB1V_yEzj#U`?VqDO)%xM^G_wsH&hTy%9yWv((Z|0>S9%%sNP=^m6dcIqv%x zn#e!VaM_MtV@0%b;!wspg~IE3_Q-owk@TFGNY46sW{lM&?%W3=ItmIYtUgQpc$DXO z0&*L{v&^Ae`UDnjHPzupI-xt@4K0$HeyYpV=~$FaRGROiKP)#Ik|uPS9`Tu%xC2F1 zk)E=>%m9stF}XwS^#FG7U-WPm(gD_*J>4DkpBPkQd-F4OvZiEoM-O8oGwCDYI5!KG znHaH!-h?h_UwY?{EkciEAfJ(pt*VBNT8DO1ZIqj8(?1(Ur|B>%Cu?)Y)7j-GsS@8v zebZqg(fi6<)@81zN>kwref`Ds#r5xXeRa90Az!H*qMvKH!_Y#-e9=en{p{1qr>WUu zY-H%FtD^}J{(9VUFR7V3-c<@6N2^>ywN1#-Sn$m63`-5u^gp#`O$#bFTBFG_TH}hF^PZIE83hJjJ)CTEz zf=rOpZfYV|GF1|d&U`?j}>rp$g z8x6i$bci&97Yst{=Qcf#tx@n$!y3Oq<>LqJ=ze!yM;l9tv_>h}6WzZW|H}Tmb>h_& zciK8@c9%xUudYEHIhE)rQ1laus28BTG8g49hgys3Of79GvSuMn1TLw2sYw%-suJXa z?!%6owv*P2)=##A&U(@h&rZ>zn{O1%P0gcB(bR&K)}Y@-yQkzlSEI|YgFeeJJWvjFx6V>~8bBOzhmMdK-f05$h3!%L7$mveZg(f? zyR=Czff8giah92?uXSYP%Q0v0AX%kSbRYDPOjIpZ;U^UGMw2=7Z>aeSr_ZH3%BAgz zEsD_Vl?{~9ki8y5*L+cIXf1U??ALxgUMQWfNg${qyuD@Yom=di)pYZOfl6*-1I}Vi zpVPB*2_3DX=q*-*8=Fp!bD{hb)qm?t5>5yNDa|<#{EGORVBNq7xJNyE>$QKp1`5@}gWY}J# z3)T=24pHV)u%<;yv z`fgf3v6%W6`qesAL)NRFtFwuPG;wH+=(V#nThQR_p{}QD$8N5sAczXp4Vs^1X8tg);)kY_MLll}WD4uF~#U_d=<=TwBQpNBmT^g!wRg1S>IbHDb-2V9w7d zM&A=2(1rerzmKA@9xmL&tA5A-2U1@-AJwP�J$_-2vp=o_Pv_`K+ow*tXK>J1xP! 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 z�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

?d{yCkjnqcRu$A zOq_H#mz&oqV-L3g4Vl7M2lZR(UiNN-L8Mak{K`6<&b(ua7rJ5h9PfFJ4O)qei}{Z)#JV;LUzmAxtM7545crlb4es0r}IMp6+z#nqz> zUFHm)hv8NtVd5#PcQ##N9$ZxxvA>gX^=|>|>b8_iZZD69`Iifa>tEpPhTP!}zSGut z7&JSrADpa0d3mvRB``mFd~E%=cd-p)_60loPRdP$q0Thxcc#PL&`z%qR!AS@3QAkK zhFH>_U@i=ssTqeNEFNjw z$**^*kD@NziR)nPwnvKH9y+>rRGTFZYh*e3c_^qA;k zQH=u?e67*SSB9gXMQNj6*9!WzK*gf!++iD%R>$+Kmr{WNK zoRX|;Q*OxPq$F6NncXTV^lQUwC`U)XLL3H)^IDoNUBkn@GLwexthlTEmoG>UpCd)2 zg7j7&lhZA#$)=>C*5H18C^nS-mCDJp#tvtutsmGQSzuA{X*Xs^b33D0%uq?+A7Bk)h)ynhdFX$yq0j${or zRAYxx)@q7cp|7}A3RB0O6;?9M6U`?2_{ho#PCRCQ=ZF`}C$>?U1DgB{bYI?W!+qd26(38Dln&~B6mZX!nerJi*{kVB zll{IHzmXL8pzwo~UCF>na8?;APZU4%uG=SJh7Z@L=rxT^W<%R{+A-(v%K35HZRDJU z$FSB|YE(B*SbsW&gh|p|c)L5b@3mDZ2--_?g;;c6tGQ{HyL-G8L51}jz$@Ru*B-^a zTf!NMCZZAZi_VTlH+PD)*4n-6)WSh}hy4H-w7PCulyf9YnhXQu6NUkJ(=vXwc-wMaX{PL&DG37huS6P-U@2Z2}F!=fhBheCZ z#gO5`mey+dTKVQ^o}x?t2v^;2ok?gsMI7*lcqfE^@Zs%6of9KMX!lyWS?GX1BSrOy zsLJuI^|8tkPN;uiAU1V$s|499ldT`@RQ8H0R$!+WkFPUsSec*1IFB$~QR%00OiD9$bLv7VqJW60x; z^WM@4&xY;$5;bK}=P|6~r*>KAkkiY}&%HJD|2Y!(xHaF<)BHlp@IIz%zdP}C_4uTc zI+%d7^f=akcDD<-?|6GA{;U`9*DOgc%^B%Wc_3WNpOs?DEcq(;_ImgOt>^|HQB^Lb zn)!`R|1Nd$Fc7+SsGnP~ccuufaXt8ev(Z$PpUb7g;%aPZ9S4obY*Umd6xRA(z!2AZ!?(#};bUo9l-Wu_F&38AT?D)!lWZkjyptowrO+1A&qJ*2% z>22jUdWGku{h2%{>5q5+y$!yT-d{?JOZh(Sa%de|_yl7HZW2R7-P3xe9R090saDde zq>UfGOv##-JtW|%q;ofoN5dfD&G~~J3-jTFTNagaY58~Mb8RHLolSuS!5&eiqTT4L zG23G&#C;wAGQNAl{Desf84|k34~T0JnY(Y!iZ5DwzB((zlpRVIb-y}So8#N&|2uFsxGAb!^w8*z(P>dFqoxEm@yZR@tUqf4 z6V)ALb9hvSxy6RULazXRRxU`+TKcc1bjfvu|LA(hp?klDE7nF_N9tHD;c2Ge17_Kq zovv;fI;!_@Fj~{eCQFZ`#oYPlaF=OHQc6=$&5gn!?;9uH+!<<>-0V$}=K~)8ap%Cz z9XFoe{PJ$iN8kUK`(3-#9+BgNp$eH0qhP@d#C2q*{Co|1( z)~ngtWbc&yLbjP%7iEr0)Do`8Yz$uaErS=gMt0!CywQ^Vq2P+>jWMrcYQ+2-wLTE< ztD*b~t9z=`6`hoB4YLb?)Ay!-Sxg<;9KLW-ym0R64f5w)IOmhOu0?! zXTHJyjsYuBAy_MzJLm-71QLS%f^ktdqfSKs64NmDSnT=ONwH^R&POkdsu^_sH+{Eo zULT;o;*(C5JINbaX>ZXvBrs81j(+E{{kQ!W`i|$Y>yFu@?A-QtDz6h}d+==22;!Z# z#Ei0*ykVBl+JjLw;okg ztP-b%eLn`)1mmM_2Gav`$c<6dma>Gy^-aDMJ9I+NZ*+^CNPC$y z=5@8_j~}JqzjSZ&{r->cK3ntp^W@x-$4)`z=Rk(o*$Ih>moh!g{C$?|Ss=4!`7g`X zEX}i=&73cD%S`hVUu66)B51;RuM|V{i=H7eGdFvnLf&ili7X&8w zKl71$-Ekf5*j*hf1}XZ;wo->JmA!y_wNE@FH36G^TG}Cc30>teIDTz2|1j1!+|_k0 z(HEUAoL(>}e{o(`?xoy}+<)^n<>wZRD#|LZu8Rccyior|cdMj*@%6$c1@8Id@?!G* z^5+$-E%Mb_4R&+3ZJ#_#xFtEO-m7Y>tE=s*Bg9QVm8+^Q=-WDKyZWc*yB0B0$1hIL zo%gs5b(OizaJ%Am&aJ20PS;s3CMSPKyXLxTy3}2mEZ2j@YtH#zj=oP4S@Sp?!M)MW z+|SH!m^spd>*q+Wzi$XV@qZ8z;<%^CGk)hguJLI3e$k?6(=k=@&BWS=;j(6#r}d)1EDk(k^r<Z?a+206q!&2?3JM0l74V42lQcjaGcP%*6|e z8WuJ#xSW3?ziL5O%G5C3K0__@3#%4XyMwTdEU9NuX9s8jG%nIRq(YJr6v3!5g1C-g$O zUsX*#MqOLI9u+a0SVQ;|tZ60dF!N{QWkVkI#W{Vb;VTTccVOURE$dM58bn_voXW_B zv+k(b!MxN|#}sO6XS!(W3zoA1?B8Sdd|6$^7^d;lq=w2nN>Qa&#VUI%FG^WtTh)be zLPuUs)K)Oj+WdS(DZ+aX9bNg8iwz1x{O!pA`GKm9ZS`E zhwfr6`kZ^{WS=9uX+~ub1NXe1eWy)sn`3pQBane+PZ-=lcez$5FS+6@@l!2VPm?_4 zaVB|DNyg;wmEt{Le|y^D(dma(o~(P>_`}L?!_sv5?TmNq-_hBZq(ch9{@!#;*QzKr z|8`z-UUWfBQElBA<8^qrt%SMCD;f`{1FoYzd;4?_a0wX{o*OZx{PXg+%MC00IHXp9 ztjrp>&W>kQqPUJe#TMC5d9awOOwt^6G&wJIt>u>Cde!B;liDFowODkKAG0np?bVkr zDO0qdU~GPTUR++6{6Pgj3O^Kk>6aPp<{miPB*6DeqyCf2o$=>TnI`I8OKKG<3lA2! z7j`VFRI*ebY`SWRwpW*bRHO?l#LMC)u_1h(o^*~%wN%^`8BAgK$d@p|-68)jAE59i z_P3@=2~}@GgE`CLU&p78(;bgH4A!1kKTsYO_bD#nR^vg_RPzwaaO+SMoNLMCOyPpThMXo> zyiZ?k7Skph9N<-`^A016drB60mn_s@d@U}NTw%L>V&%wGuTi74OC!K3z7&!a&*gWR zo$j|ipv!d$mQ)63(Qw-g`)*WCj>1E`E<6_I3kJoXim~$5s7`p=m$O>GGZT%46I7r6 zbpSJyMx0bF=^Pe3EoT%!r-i>edH7QFz&Qh=BP4>SjtrD)jJ@)+d zqwNn`KYaM)eC(8u?Ggv2<>z(LJ6bbjKf&?0hA-d3R>soUq%e*!EHTu>gTu$7wpFJy z^QRQ5?&6T-eAWHCcLo3H!3)Bj%fG9zHrlabNc5{npNQrmtNr?W20GVQ`w9wsIm=eq zgBs8t_iW|lbA>%pJJl4mqei2dsqUwGEL}n&Xtr&pxs}1ML|NEAPmwb)YgXo%%!XOt zvYY1BFFa7v*!UW(paa7qs)d&oFEs$CY%~JI{ zRf#eS&#rxZe-HFvrZbJ5X6tX;VGCrkcUyKIcIh<1g*s(|SVP<;#4-JNLnUzsCEm*D z)s(VF$D+hr15MR!wkdFx`^a0-5&8-y_7-vI5}dyTp*HV+n#x>(^UoxDsuP&0Keyh4 zCp1X$Q~XDz)0}ar;ppt}Lp4*8Wm;D7>DQ$%`ES-g>37$9Y}vLB+%>&8u0e=2UJL9at_gIMrvX+f?l*!OJ$vm{zj8XmnvUbYHWIR+miIZ#RB7 zSBDL8361!07|czElhbA~6pP6om8UCwqPuO{1*n~zF~Kp^@rgEGJxlopGt1hxZRQrn7`+2spJq5)RM7_-SD8oHCd;>qYgP5M zqZ}pY0_SQj51j8f)p6{st)NblcGCk`WREA0xQwsRKop&lEY)ov?0e-4gicbrvc5V* zvsyDl^ICmY<)U;IpP=;j#WL44)UZ!Ch~CojVhm3}w$(A#GIz3~0tnJy0}gh+bXz)t zzHBL*XC}y}6uG;+k8D3^fRpGa%%___z+P9@4JM|$xJJrVR#3ZZ4r%UbMrwAc2dG|4 z7QsQ`$rWv|REIM(&sYJ4&S{)bH%$B3YgepaY<7D&lxQjoW?`+EDi)w1Q(s&o+@e}m z%3HF6hM*Wej=o1va0egZKJ1{M(vqh(MtKaD^Z?~IsgAUatY#aC{x8B<(NkJNRoh#X zD?Dur4ZRAA(_bZRkMn$0@HpjOn>&N=xZYPixf(m~UiUX{7otfqVVZN={j*5^6rcE}l+Q#JQ|-rItK#a;CiOlPd$WGUbP)f%&Q zC=N&eI&~qh=-_Zfb49g6Y9CI^*Cc7< z!39rs^m1(Apw&*s1MC3aTI*#0+5D`Z&3UGYrta_#E1K0{iW{OUaYhy|f2G(d1i&z< zE#4O-!76`%vXr~+1zE=}le_66Y=#HMDyBE4{pKT<2UZW%Uz6qCg}X3z>ZwB1&(vkm zaC)ZxQ#}l<^8l%}SVw5WsdJf`)jK9a2beWFGObI*HzE-&o5zYUp+9|#q2!%M={mW} zb@cY8GedAShnbe33OCI769`Zkpu~4i_(%;jNtL2*sBMpLUOk7Ynn-21e4?pVVSM`cMB|6g zFCrf^^7o^TRE(%pw_z18)$wwmN28)mMppIQ`|-#jNH(=S6zznL~LJuhQK_O`q}MZNSb&0lQK+A;!+AYIcOdJHVs_x9A|N2U~WAva`BaQ^g^` zagF0vB2gcQ^4gOw~$+d6};YIE@UVd8r6 zI81{Caz{^v0uK5QTLIc-E6^e_n_VrV(erqN{&Imm8g9a6RM6zGEpDm0tFNoG)XD0@ z>dNXxsw2vs(j>7q?C*OpL#~3Rn}yFvq_vfGy|svZ<_CDSOhKvghQhO45uj_BCRFcD>6|&#OMM{>KADgZc$d^MB-X*lV2oN|!25 z7aUw2#yM4enSH~1TGGA4O9e-@Ehmj@4d$Z9~9@#4sFyP(qXyE z*2FYh_p)$K-ihq}nG-UaW=NT5vdZL|@}rCU==+%LmPkDM(si19AvJEU zS8wlb-g55=UgzkNh#vm#Zf@^f8ag+2JgM2BOjbOy{cRF;i3Lq^du9#K=$}3;y+KBN zWhs%09~*p5`nuqImDGyqJF?FfjM2js6*oF`bsz6@AaG-7rLqGeT1NzzEgSY< zuzTPdzvez8ycy+q^z|rlzv({Ty{`LXw~B5(U5B`IbgoNA*vH|Vw!XGVb6>MiXHkdlYD#Sw7)!vZOF1e{AleoE|w(a!%!b$kP_oDXdo%UR+olTk>8PWO#;tWm(%P zSu^31^jWn`vsWALpmrFg9jwu+*C0M6yuqU?nOW0uyThonsu^NoQHeRNfeZ}q2}3v{oMncNQCS=nz_~NDWI<| zf+`zCC;N-+l6-@r1v!!@or|~3xQ~+&y27u$>w`ThWgR)Gd&@ zuVA2sSXWyrTih*W(N6gfABh1>fzI&SXq}E1byw<<3#c93q#~;df^G%Kh{kjVs)KaB zfUjCx5EDb>$K(Rol~{$3P@k8x@JcaV5dkCa9M%6pSd})kflsqWuA#o@FC|J-m2Z`M zl-H#nf>D-Xd9Hs{5S2AF_06}8c*Xm^ubpB&UN(6-B(~h^K5rks?-A$y+4t*~q$?@A z(}(2d6^C2S2@M^_xqtR)7}O`MYQ(8>9_5#m>mG3-JTufMq+ih8fIs~o`?m49oh~R8#vC-Q2k&G0Hg92G*ed_Bu7^=!d1RX{&k&5#I@KX{Bh7eCXN_LH zNG+(B<5+Q2Sws1sMU*jfswdo6;89AxI)L@p z6khrv@Y^TwUuXoPvOY+^Qccq#V3bZsUzO>&l0H%gsaGpM2%;>^Jh;RyZ+?1Ma=ov$ z;;X!G`)0wbGqIOq`@EX=y5!B{cf!Zp@#VhsO`4uME3;n#F<5p{-Osg4nIVB~!ipn? zM4qZpQekR^!I3}8{SnbGd~WEr;G=;@{a5<7D)ZH|i~9kWV#k)+*Q$-uZJ{r24$kBg z^XMWyP;^4IdzIiT)KJ)Ei|vJUhcisah#7JEs`_0zm9AIG+Tue+rwShx*z^C*pPOHp zpMjU>z>?GY`lbZSEPI+fOw=fMslKQmX+~(DpgoTkahd|H zM*D1QKAwh$(YVT@+gfbYpdIv*eg@o7xr<;xWuhl5WdQr9p=zt@ohn6j4Hx@^%A3*_ zG&ORW*Q3>G(^#v+=!rDzOey$})kM*$1oi(C%TlJ@r)(|2E&l^X<*R%Nd-5Eexq;$X zu_KyCV|Y4pMN8hr3Tmo_JrXQi3u@8bpmpu`ddx=8QeX4{SyT%hr%2&n+)2u#qR>Jt zCno<^HSe$3PVMx9lZ7du<%v0mNzN7HC}UgW-^L@xFw=3A1iD|xM{)g#VJd;jIF;X7Y*b-qkTH0tqp;cKC&E>Vs7_&iago8o$mUlr%FhH8G ze8f!DL9 zABpRm;GPthx;`tssE&ELaL}Q?hu!ybaKo}&%0H_hj~*ReDSC0#q6%FibIJ{mI39jF zbWHHmfX}|myv^>7T;@6aQsH|fUuL&iBdmp%mgL^A&^f8bo@7z`oEG=!$vR!hsqKeo?>ZI(X zYO1cRv1ra~%hUO4EdMIbens=uh@DkTUA6Or6mQ4vnpau^6D)<3OlP)JyS z6O0DMsxIc+=AP8XdTW}k#IBRsQL{ZSG-qNPE8b^{q7o-FJ8nqdsw&K=ao~HtFgr{}ZO0E18+Ada!z$x&=N# z17G<4@~T3TAhnwy(aP(UgR zqq2LksmQr_N^!N4Ae<0-8I~I_no`Z-^r2tdn}IA^EY?>hsU~V-wTTWp9n&12Io5Wp z-9eZtSAunUWKFa9So*{9OGlyakfEL-kg2}H=!^Qu66-Ge2YJ4bB+XQv zP|wzU)?`uDccO3B66SW0YN7HzxTOSPD{6;(K^6^!6~EfJ+z_u{#mvSHH?1eeY?B{c z%CT^K2FRk((V5DOcBSAbE&x5(7#{j!_Or9}4_UB}&`z-c40a<_OAdgXJp&S@EV$>J zbo$$)OZ)*QeW})M5eT^$lyErRTI@$=+W$Dt=u9)x5sg3iwH+ukp^Ec z5G~CKw#VQrgHbH|Y<+H1!Zdn{+xkG!Urbf(l6A6r8mktk=B~_`nwp%X{+j>ka9r_+ zg!iiVi{AykD|+kt?!>$7_a1SLKCk>%klZ?BT)t>{Xz!_-?wskl)~{!9)9^9n(jz}b z^{F_z(jS$VR-RQkz0w27LaQTZM%)eE8mRRh>Uqm$pu;GYU8n_{e;n?5v&|pS=s9XM z8yXvy>a%srbW`ytn53UzIA+Y@ZkKAK96&8~wq>NbvZ;`#Vb_hxX{_xXQYa=zQRRuVG3TTjg#^I

Mcf_ZpTOexhLIYkp!mZ#yenuV^72kj^RxsGg{DRd!X8Do>TBN>+VV zomLH1#VIw)Z2FnGsM+;EcQez3_lV)Wex3ff-k0Ze5U;J3=2@1m%*;Ncd(aupgM9g0 z#RXvrTKV_jxcMkQfrdLHrU;HgBmCu6@)IDXr-D>EC3{Ew@dl$?350MJc`eYLGvwEB z-|GSQGnrMV#|xnu=)z0*G_9wjHWJOU>!u25Ypfyr8jq6wa^oKSlCq37&;qJYm&VcB z0=BDMK0)zL2$AZc*PE^yslKLutA3zfr>>)prNezdnMv(cU2G;aR&++s@jkqrI-rRa ze4hJYuxc_b-KPkVpSJZfH`H$_yqNPMy>)7n@5Zmg6PA6d8{Z@D(#P5#Uw&BqVd01T z53;y|_{4-9!h|C8a{g<*&1RBjIQDg)Q6|ZML-3`rz7faEAFD7V`d!7Zl_pglU-@RG z4i#OZLdwqy9~7MK*TMUN+hnIj8fT>+N?Chs`K*-+rcA>b{UY7?l9k0d=qe-?EiPVH zlA)Vnuo*|0ms;xM$~AI zwym*@ew46IYOQ*v7PMcrZE+4S*0$Dmqq_1^8R*bu3P$i#k#f`~>FAew*^XAL8g|bxp;%;n}W<8$$FoHPjkC38RGSf*+XMU}|G8W|4aoweaF8i@LqP>;d@9f52xJ+1t`bE5wB@nz`@=Q09k; zT!U>-i5O|1_9nuOsR_$D$9xaR(V^xJ=HBKlps`L{mRVQZj-Z;EBu`fS_q!w0S2`&r zOQFh+%2mpn$~2`_nXkM-{(cePKm&*+7ey!e3wm~6Wq%XDg2|SKq3AJAI4w8Z#+&{1 z-3vSC3{HQa@-k`8*PovY;h_lKPKm)_ra-}b}Qj|<`#B&@P)>ioWLoi-qB=!?6$KWzFGY~ zYa+ELwC}aYv<R=gZ8B z_CV7!-L!}u{>8Y>IKtT8IMBG&7>x5yoY`XOjN+vM-S+_IBpuP5T!o8ZMKaa>!XP1< z$?ZeMVsQT-<)hK%`5O&^E$~FT!5DaN?rI3WdUG>Y+*0 zc)OI*s=cZlm6h3CjOq~>w_4;cg7`*A5!z9A^@5*2iz&1gE^sAlpmAmKqddo~bH5Uj zPbdBHt@W4G&yPO6jn9Zv#nt_I?!(Ft0Uzhb6@Qxf)#b;(ziwuCEmE5Pm0eMGckJo* z)a!(ARA9T1Kf_ZZ21G84>QHfgrHYk3D@RtE8f}aG711tiSWr*Dp59B`bkCTHMJxb-L}fnW2q(=>9)3Fs$WYyNHwxbvPiw@_wAw{w@Tg7OW4Z%>IprWh44)r z;axQ#bJ+<+ErlO53>Ka*DC`ZeXB#Tw6xW2;sIj5_s{WyV zN;Z!#n1FY%xu6cTN{YX!|`!zG6%jehelUNK z_kDMH?Q=_UnyDS8IwsQ9v7fc>H}5q*(7WnR6dx@LDheq&TXeIyrtX*il5vpvBOZcV zY~SIu{$mTZ-DINOh$qmVbuk4k2v_S$%YE}3Q>^j1p;-TyK1AP6pQQh2@Hg!+|6z@_ zwMQxE5pI=#ql7w#e#kK8cjod}RXUZEI#D%5wHbYmXz?7m=u`U|+je{dwxYy-%%Vs2 z_qH_zPI4j2oFbTuOJGwxaqD}eRH|LcYFlXgXq~iEaCZF%7C~KNj*ZEi0p^$)^mQzV zuNkJl@LyZP$#hxwN>^W>uTL}RjiIRRwXxQ;iEw)Rfj`@e(|`wE^t0kf$w3J=hi=<= zrI{}8KJgoIXBH?T9AMCvSPN$`NR|YadJxaG0Oj+$s52zm9PIVcoIQsYfe16y3x-dr zqvv$+i=KSdM<&dV=;(ciJE`Vx0#MlW=XXE2Q|;i&y{DspjH%5!xt=P#57}~ec&zwO zqHi%#s3(?}+?9`%!MFnGB@|`l`)!$~uev*h7jxxVm(r3`=O@qlel^ki+rM8N5>9@a z7k?#gPMk7+@~4jpRTE>9JEWbs-3Dssxc~ma=l8*lQ_TM zpsR5Mt-Bb-5**F?qeYiyxnVwv&vdZywqb+eB+-TN`P)w2rg99{r5%%=z<$y+S``0S{qb+F)1|!iT;O%j6~<-bi}Nk*M6Q z0k?04-R5hzqEEL8R&*#6K0WiCdT^xUZMEQ>rNYtui|O4q_>KGdeK~WZp)lyHp?jcb zJ>7-DycDcuXI52vI(`rBtzdlSfKaP04x&FTQ$?z7g9DEf2Fpj-)aEJr_@Z9*s%KP0g_!cu5lh1M1uqTg?Cb6Q#(kqpU&jcILYb<_ zv6lgb*3i&hmsy-wG_PoOQEJhi;(tr_>u%|v8eS1CmYQ22HuBhtTOi!S^`P+TknzXi zLo$L~t&6oT-H)-R7tG14@@hv`|J3Md8fdy;a%K`HTFzRgTgRbpvLD^)Ohtk4TpWwC zph8&;x?_Z7M}xY7XcHdN*;_0O2B)aQ1EI0v9o$P-_@*D>295+He3GeqB{5DMAw8EQ zddGG;2s@;qQmB+oCt|p$5jT+q*HW~XH$wM3(|X5pjG0cRu_Jn1Ck?v{`>A&d4b|w- zJSWmzF!eIKfNuL~)uWggLT^zeJQaqbzZNF7Ck_q=b<#&_3PMLCy%X1n(c%^14`H)H z1WAwv&oz*#K`F0&8+pnic*HGWzbDhrn+I>YGwWtD{on+6Nd0g=z7Ho|5AOkkCYc=E zHRU0^ZX*mtjm(4jLsh1~ZP8n3%5Lx>_7u_Is{|L*9le!Z;F@aTWS$DX`mr!TF$=Z% z;pXXv`6cTLALT{loX`9_z2UE@)GEo%zyF)4{g(Bm(U)3Zo_{I(EiCEH59QAj=?AhO z(spWX{MY(eE>o7*c5?3P-qBm@H$QM$h)1|8qJKHJ^5NxAmOCHOwd~=rTOr4SrUZEV z?I~mOjB>B(;_eu)-YyMNjIi&sv@`WKWa_ffxvE*xxnysNMzq>DA~-g`@Gj#&*q`2cPb^IoceL`|D`xiTb80Xofd44KeL9Wt&Fe zo_!rm-+Xjy#{X86`oz5Rvrv&Naie$zk#GQv zp%?T8{r>JIUsJX*!I+Hd?`V4J8_c~d(N-<``Iqs54B!l_hxSf&oWLuAHwcqf(*X-t z)@8m_B5k1dnIp#WX_hE*;jX3Ak5i*VA7#G=%lVeI9j8%HAuu`q?hFiDmFWr z9c-{Ei8K^YT2%t#cAJv#-|khX#PDv(JS%(x4^_Q zNe{ovQy%@yO7DZl+u@=ZeUw>mi&dOc?m}^HoO>Pb|9lGrP6VfhE(%{(wy^BGvUSSV z4$lbf8nQZQW59SnKc6jLaqhV;?;Q7Q1}bX`(X#PYnOSBWt8b}WQxaa{Qc}KTV#({0 zrn;xPzw}~^IcK$aK}^V5nY4p#NFXwZldWZRVDflvB>eVtzv!w z`>KY?(d1@o%o-_=55s=T3^Z4(q3CcC?rtI&;s=Tl*hk-lYT|M_q8c!DE!nk^;E11s zgB=Kl$X9d{U0D?k!T8M=H^Y;0UFfhrf zFMbgRO7B=3J@Hv@%4u~#`a?PkqR~CH zJbK_DSC$NTpS=cp|M!W313+85qQof)59FTUzG7jSy6a<$4;7xtf0OH#(>LpQMnPKR zUq@4GrFbNF`{DIt^p8Qw=_%5$f6^ypEzf;Y;8Zf$aK@~#4_3U9dT72oPIb-mXi}!7 z-_HOscvr}VP;FRN=;+XeA-#i(0*3{h@O$BN$9uk~i~HX$TOE&S&MP0G!@C3&(7&cI zqn}|2inCXAhjb@&k99@5+WH;(Aj2EO3F8IR2eZ~%*VfP8g?xK69n5#~ZD?#B_vfXs4_QioV0?ql8-L@d#cT0Qk0a&B(QW{eiY^k4ot1H z;ls{E*CESRg&w`$vJ$Td$&zKx!y3AxWf(l6TuVFjc!OQFXn&Xh&CUb3i+^c{K}1mE1CTSZ3Ob z6*HBd+7nLo+;)1tE_2u~ATT6&cgWt*@UYrp*`b|6$A)wa&JP?A@Q>ddpNii5JwCf; zIDOH^s$xaEd?Y-C2B_grG5n*C)Ai8VN*0mI;tl%l<$w7Rv_L!TPi%jp)dH(=s zFBH7&3iCzt4-k;m;lQ3_>c7(JLw&M~Q*s<0w)F)8RBB`CEERAS`dR&P)EunrrfjVY zp{h7Xt@B;%ES`cvSy|Cfz8RecKk(Iw)OWuuODxfrMDsrLWHi3p(mPu~=PnXW?Mf(E z4MZzyHq+pKqe3$i#i4mauDNb*}0RdanvF2rbBTcacqMrDx(avX*P$GH$UWcYs8h#dLQy)nqaZg$Zb% zc-g*j_D{4{XO?-vGTYJ}527mcK${U27l03nvpC>rGl95JjGFx!*6&ud%C?i4Y?nJK zrqGv&A|Ad64>=KMXakCy-N7Rdk{W?1*u`XcyI=#KcNe9igPf<=>9Fb1Vrh+{$ze22 z0;u7?Qq?J$LaxTcs4e(KB~fG*3RrK5G)3gB?&upKIu?m=C?cF zY9_Wz()?(ZqWV=PV`z4KUeBTw9QFKd@8u_?O`5e%%iV^0x%$QgbPPTpx+eTZ*?%JL zN9>94jp$o;V0g8#_aW7Tdk0qZKjZV$>#h3+mnx1Q)mx7c_)gPr*ZnH# zSn|DiZSjQSmGB^Dmb8JDwb+20yt%HWF4f!?P(wjvY7rngEg&G?qnWV^RhMt*=AGc2 zjWSQ713R5+VvzB&@lRI8Av3w0^)yttB{P|>M52;8J(9{v^ z+fdLsOef$pO!_?YH9GLym`!{&hk~ko2rF+24C5#|OgXl8aBLKudYfgB>DfBV15sP? zqOX%oUv49ag=VNOd7>m&s`z#W4W7a1ef>b!?K-@$^(ZR!vSs3)dfDiJZ}O#L=c3UC z&+@`^Cucv;49nP^*63Hcp9526sqU#eQg{E9rM*mllNpk;KCePya`9>XZqsh-W0_p+ zr8=T5baHc3dY6i=9F!R(4}KNYK4?SWihvgW4}7gkmr>%9MJdBSJF4q&(#;=tlY&I#l$$@{2xjY-t-eKpk(HP zCw~TlqnMg58P57}x+Y`Mt_-t|vwSmmH5*Mgeq#<&P*G`XoTLPlv2(>r9IgAH$k>)1Jf6q?0Ke z&!$A)~@^~b)5FUXgI*TIce7bB+?8nfZ+JRd@3g_l(%Y4f$%PPw@@DNETCbhF} zu%3EWXa>_tU>cHO;&{FdOqrE4~a-qm`Xdsem_etvx{!58%l)kVB7vwoMN{4 zK{1?6eU8k@KFGR~6XvPDsH9=>y29f8et9=@e6mMpK1r{f_Wb98)cBM|DSK0zr*{9D z@atlFTxR8*6M3x*O~tYL^QPO@@3KH~oa&NR=cIN^_L%H_$Y-Wsn!h37OrUpAl^~~} zy@93x=YS-?F}|nET=JUf5#YAN+28SirkyHOiWbJmf1)cnlqr1aT+_p}nR&jm(G&N- z8^)d{M^FT%?iGQYBoSmKr?`r@M4X4HCvKr*5M}>p>qb>5!^gOfd8O$M-~AcqzSD+p zhC1xyN~ZIsXqfXd-1q*o_=A8JQBSPJDZE)$4+XUmc$hT6)A7DwM1iM)I9OZ^3;UUv zB3eXe$x8~Bd~ibWmBOfrS`h(e(EZv-jk<)MNe#RzE`uJ46jSNC3`U9Qn_>+L1piTY zu0u;J+#X}whhqAlmP6(M_CqHez8*8vnQ9!)Yk~3nZ;VT}X)WtT&7A&-ZK}OC)8Nzc ze)Lfe3r)m#Vh?&eHCVf6m5-IDl?(98`wFJWCN2`S;zqCsd!bfuM}v0(adu74n>o%H{B8&cl0om#0h9mwMW+u z=X!lZk@y0P1a?sMrS+$Y}TEY0P{Md(y&_RUvjOeYhebw>-3yn z*)KBtWw@vNr_K1)QQo2UkAqRMf+jJ3F)T#y2DQA z7H)?;ZhOrtQ{v<4r}RJI?;p@Epi_W4V5$Epzoot^pT^$RJuPl~U0OLAw69>jE2W8O zqTJ-9TZn)4PRna^u=y}N`;MkLAozyztj}9|fT|h@67?s2M+-__sbIkG+xAg8bhK&U zYKK}Eq1qITpYsc2Gh>2bGjpzahJA*3gCE$g2gU&A$7wj$#er5cTaKX7?*ZdwuFRja zHdHYWu4TT$OZXE6@n+!-dBS8e-5_d?b<9r>Nt@`8#_$?Xy_yV*_b|#aF=REjRF_q& zK({%nUJ^4#D!b70C`XjKBlV;^tAlkRL(x0V{@zwZ?r;#7mk0O-=*gd~%=$kWdKeP* z+w@EHXY}rdV}{Yhr>c03WmwKJcgeGjK?QU!RoW5qhhK`dRB7wUw1cU`s_WaBi8FSLxrXNmUobfWV zTedytLSEN`yuw+<{<=8*bEDNf(^g(?7G5crXe7rdXPwIsw`uNuJ=C6;JiBvW$VazTcg(EMc*+QZ0b0&n?Qi^!c;M zkhe2Uv|4(TA0?TinUbEziD#d^KhIzp+Q(Oz_OCN18T%MidbO^8$+qIcqVOW$!mIhN zc{OvoXYI*onLa+PPTJel8W9YB{XIg~mta ztE9hywq3BofR58cvi+GTW$i?_u-NvNsdxi;-T%>RsW1P;l|^w*dQvA%psrX<*KxD` zJe|_ImK4)T<3U4~ev-b8zO{a^ejb_8D1CK(q3)V)x9+AcLjPHxXmF;Nd(o0)jkQgu zW-w4QWD?_jcsCsm+Wm3--UoKpUsQ;9K_8Y8elR;OQM4DH3;o1AafoyaJ%DuSwRA~3 ziY85l)KYn0*+mtvYN?*Bo~e#h?@=WyMSO32qiGNzoFUthDYoG3+F!Q7K9PE`yv4^H zWtw5M86KiZ_TFGJR5o@nj>8Lg85qB}#&8olUS+}$7_ zjJthP`T$=*hN<$H)q)rf1)(T>}NPU1BbNageKzi?dPFhn~`b6ee5{YkY%6`{IF z_hCFppD#i=ywNJ7GEfQpMu}pIkRvn|XOO-2rP6(g&S6!ie~%S=6{8g)iVIA1n#x+) z|A77JW~pXgU{c|pxrK?*NMmDT9x7`({c!yc-Ev)wZl%toJEWgu=x?k?AAW}UB^pAa zMQw>hJtNby+q%-W9Ixbc@{wfC6NTf#Evl-I@LD^Hcg6Nniu5=6vImnjN7YyOAH$Sw zK?W^TzQC7rmg=nPxN1CTnC8kU(jkzLjfH3E60|{0*Nl32SJ;0dCu;}p@>@$coFH<| zx%f@^Tf#Y;K7rtFYBqyvd1BI;n&LUv&hpbThS_N)B6JKIkUjY|o~N$2^`UE0nauS+ z6in}OTEx(~6=VfyyLzCnw?y`c_2fnlR7lRd66N9AM4|5Vgo|W@Z0N#%H3MUOz_=;tf_rBeS^!?VeP5Xw5T@h<|GOM58?%nB-?V< zy43a;5w;l$){D_*^0Lk|e>e6wxa-|??MluR2NaJ2S2C0VNGi0N4h_m8E2U5*&fN}2%*Y@>W|uejy9(p=fy7ZF3zqET<5vI zajoID*6qDpqT4Pv(aqWQrE_Pedk*!qztnG4&Z_Oo;mSVBA zJ>q?c6f4bDdaI_X)~o(j>FAmtK(VMHj%iJVU+6jp;FA3ubn^q-8Y?pyke2;nYfUmV zF;p{zum|$>xAlwl&GoK&gU&`j`Cq*gQ@^UlJH|Tb7bTgTsD1jF7vksaMJGjp9;`DA z@?={D_TfA-@*Ai|S3w!rgDRsp=*27W_P?@{4%3ybrCh0u2kUV~RTKR#AI%8Odd(Va-s*t%`18UzFW9(igf!C;Jpi@LPyZ8_^}bLssjD zg7{+e&VRC!YLg33rM^DSDvFc+LR~9|snH|W(O5Da8(Ge7`$BLJov6zy)8TMKc|42R z^&@^_DF#B#IW&VTDBJGOY2SgaaAT&D&deneIMHs>LqE=$G=|Bz5f9O^w(3m4bFDe( z*fys}@*Ffqn7tgRnz+*X#P-Fy9F&QRH3MIg3*bSTPzjHuvsT@-0dzkZbz}SFRC|H znGBYfSA;iQ7G_K`NZb+3tiGdzKHL5m9lbvGvDDQE(6qk63OPd5E$mZOI~n0FoXd#>a|mm`NP z$qu)I)FA*d`o+QpXrC(0rBvJ8RZXFR61%=kEqcW!+Gq+s~45;Ce~CM8Fvsl zcm$nTM|z+jfB2hn%)o~;>s-V1do~=ZAh?oSS+^e4$|pEe8=wikkNV;P{m{GSR_0XG zUV0gGOdC-H@TA^2V192lQ&-di4R?x+c$2jjJA8+|IrU#NRMNN0H-b_A3;m%6+{YM{ zzK_aJp({8ae*_~La|~+aLG(3CmBejuYxc+!UTVa46w6fvo+EbsnDFW#||bkda5h4m^ZE zN<~;6yKOJ%<_D5RlxlQ(z-~N-nzbJ@*gi*=PIjmE~~FAt7jxGD7RQuetep?oKwwZmC*GUWW{7%7BtH% z^6A=>t2gBORA{u`WfyGV8n^OO@56%mh63_)KGzmL`Dk7ZSUQFPWdjpcNob3lS~ycnb4vH5f>?*P?K||+72ur}=#IYT&r7H&+Hg|;LG*6{9%?+f zz)qeZtWY?3g{ZsN22C)ZDd-tG?6<(!9|DCqk8^4QRq!%a>2Xeni>&2!{9PM-MMU(* zb6CL|&WQ%{4rDZK==i(AY=6xAZUU>chInxpZS_0&8QcUFy#cObZ+iMsAX^-nS{1Ty zUvTgDfNz>j7kDgdWG?se2v7bcck&DW{)M%hz^_Ccd`j1ij4D&hTt&_ANKUe9GB^Vg z`IvOmUrtsj&G(<0LA(8uw&1UoEe67yJ#2Glmu44KiBQivDI*;OBY$GmT;mW_WimDUkU&*SX5-KVF zR$K>X5CK}MAsKdgK@0Zjqv8?{1s!n4dC19Dg9`VR>>AJbKmPj#6u?i`_%)vXF#7OO zWTLHjze_0FN5LH*E+54ziIkhjA-2*v9>Sg&{QK37&*_67!9Du0b65u>cvg$}T&KZ5 z-R9RB_UBsuWhQ^WkXhDVuH`KId@s*wI$1}1uDmu+x+7104m+>($zEh<9OP@45*L=U zJJ0d%Njw`9S81h}p2x~5eHHwkI0@`!iLChxKW!VC$`I~jJ0j6Q-hVwS@+SNIKA+_x z?|hIypX6^o@V%~FWdrh=c3?jnGP4Q=ZRNs~4`MI&BDQa*nz~PB{)BjYlxIJhudKqg zs=#PvvGTrfcBQdi9C6aF&Ccw{{TRymS(h^*i}iefPrj8X`vdL#0iX=tuvaCyoeb-mF8z1{m)N}?+@Bs~5&b!bA~=yB^KAOEYDN4@zOsfB zZRvChl&t$OURB6j>f^`M@Av(`$$fIdxM4X-|W^AM1_yX6NU%bBa-@BYr zD{(?-MgHO@w{Vx%GAI4Mx^OsE zKR8*AaB56~VbG3Ks6M$){ogBe6qUeH)?x~0PH997#3{hW>Hmno-O6rU#Qpl06Xyc! zEuLqW%IT8K>GFYd{x*NRmvd=8y7T>bDh=!n$(UQRPRDYhUEo~=K2fQ6NgtkRAMSKr z@*Ov#S0N|mFMeh^uY6`n2E5Y+R;mwur)Xl@pTveX#I?V;6XSnh%?dE4%ektF{9Oyy zwM6#!`1k5R#D09jX@SZz(XrIaW(vD`1oxpf*_Mgb_K2_8$*!Bli8G3WYo?1N19NG|7@nq3h_ zg;|+h7Xg-9A`^(Gqj8RVy_a9d*}eCO1Mi6jpMU>KV!dlv*8|x*Utpf~m9JqAc8}LZ zV%iKmP3pr7@?)mt$s~~h9(lR1+?&X0{=eVe1$rVgxwh);>|!F#E1ttsenJxWQO@Uc zXFWLbNsR2mH12TeK1}0Yr~Uu;Z0@$iQ?ARMn#IX@g0u2JPK5*X^``xPMt^Wc0rXGR zM6^uy@O5_XKSacdM41_!UR$}F*ZGO@tc72{ql*P>UJ#$CBfED7QDp%uZz#{N6s;vA zmq;al$>gLH`OLxGt(r`_n(`Ezan9CZg?Q7K{z<&L%llsaeaF82j#-Z6j8=Za6Yk_< zo?0hXY-?iPI9Assu1iHO)S01W>J)Hwwjrx7dWI(?YGcn+;uZ?i#azac|%pnj6bitcdFI`Ev+ z`R-fX`O=*WUiZcV^b9YllWJ~QlH@&#b} zqU3U_|NE?^U7TNw$g764LR&F$sKAbPWmT&A<;1(V^GoylnSSO8o#uL0va%MEAFU&cfo3Tzp*m0j&adSCg>QhVBrmCCHzW)v%rw-4c8!IUYSC~tjLT$+* zJm4&p-j(6pqtl!aA9%*E$R`f*Q^xWhow##Dxo10AXhKx4?o!T~G2Dx_WEo$$XQdIrm%ACqlbOzWU736DMl6p& z1Gh6zatiTlIk9^U-?5(8Ml$ww?D#djHj*o!5;fSVK|GmKH>lS9x%4FH%PG{3 z)!O3s(;CSApUYRT;yjwmPUuNAi)Q7!@UvZc?@+!wnw{az(@9|6F5o^!a0d&>Sn_RF z`~sSC!mVdDz2;Mva3+adzXSWmnfGwwcL%DC(m#3dNut?hO?cI1W!d?TwcI0({Sj!u zVZ^aEOor#;BUZ}jn#pcZ^Eu~nHTOBs;&@82fkY32X(}8uRyHcO$)|gXIBTpnB z>CayLNESSS{IfOtYY6-B2x}>yOf#H&Q5vV~^ZXifGMD5EF-5o1AlQkHEP?ax`}7EJ-PK5y88@AetZKLQkH6&HbQHm z0TtFE_>1?Mfi(}Sur-uYmZ#?OX(z)jG;~x5r)cMSDiS>&{`-JDe*@<_p`7|iy>n1^ zDdHcK=mtEFe1}novj(XVh8};6boj(hD!~Q&@Jqk){Hxq_L$v2UXuJSOAXU$f7qb+v zJObJn3=OnI>pw->lx3>aEjn6VMGoYG8;(Fx#gJOv;n-^2&L=GMX~>&~SVbN1q4r|| zSfQ>azH_RL9t=S{ru%rZ7^gScv8#ip^9v?R^z~T8xye z>h&X&eAbv%!vwr3V45}&iHSnGnc?V0L@9RgZa+SGG}7IO(Zyl&>u88@sHGMsIs(6Z z9vY{wPzB9$1NqN{aZcz2(sDWS-QdjiNVq*b@j9R7=4R?}+lxWup5u0}K!L}39p&t! z_;d|Sc@Wm}OCkboq3Od=U0x>Myr!n_KkCxbbU*l|GT!eHc3@bh*P!hC=+R5Q*E3{r zUOb6y^dhrkLuE$(?0`34U_n^OOD?2RWhOD^2k=@RBwI7&NDVYcR-%70cnSkUJ`Y`x zo!h=?vO?h0tJA@szoZRE@jthggsLdB>w?}Ri?(j(y22qbSOY|CTt(+Voh zPZP&Jqy45s%SErlqzl``opjv!PEL4){*-7=1#dyRG)y+{v9z}2kyURM&w{kq@pXS( zjJ8D&|Nbm)R_apaqWnD|XQn&h_alaf_s=vZc(4Cr+ak+nb4g2SYU`72aa6(1vdosJ zh*#)eT?QZ658fI{BxeR%C5x#c6IX^K32bQpK%~}fdi1Z>BGofY%xMkcW))pB&uFcw zx~fSG=Nz+aXY0MR1!_?`8YigH)XD}kC$%5B<>oB^g*JU#C6MV$!%rbmt8pUi*iGI7A`Q#|< zn8DogP-F<1PUaVmN8tZB+7PjB}!R|VG~P~)XNQ~ID0`YyXdv}{g)0uO%7zO6)1PFox;(K8|mFivaQRWbn3m{V$FHWWU z=nNU7=jKx6xq46&bj4iByq>;cZR!43Mm&J`GJ~FjX7WPAv>R#@km>c++v;BWoMbc2 z7e0zv=+L#7nDT9NWAjM44OpSYrX1c=+BEt~T=TT`6!BE?OeWS{2@EFKPxW7Bz4X)W zVG$cuzBalUKEzw|QaRF@*8#1w-hmvcTj(S$p|^T&GH)#`Y4of;Np(~Xsfjp(ZVczV zzo@*~P7Ol?Fu$esAP~O!gdp)QJ$@R}Y3nLgF%tc>Q<*09fSRl{siQntE-3%a%%C{} z(IN7r+rdwVYo&>aUWe}Hk)LXV94?HHpqW|{i<$(L-ABuhVIEg$>RTR@)t;qC!rg_D z&ecp8$uv0WARwwO=*N={)Y}MV&(EY&cM0^sQ6x#QX#v@%SwvVV6(%!Yhj~*Yz;{(< zmiAo`V{4eD6wcJ%Zu~_ub<3IPJd#t~OJv{|eF9Ht|EiCa64W}M_k7{>jw)5udmybo zYlF$HZ>GC*QKs|xgV%j3PcmPlF7Z$EF6Izy1EF>ro9hK0Sxqd1KA^t4i|fUW&|f7{ z7owRhS5{mrM$p?lRSKt9;4OOkJ)kGw5AYNx>FO0OwxzRYAJ%e>o;oQ=c$aAoUDY;7 zALRf`lBKP+n6;NBmwAG8P6(hY#8>X%HnZR>!q<1`-%|@5{wSVbAKs4F8(=%1HZ2tz z&`JL%-BntH2QDF8KniXmzSo>N#6NlF6yX`xRZUPEOR&hFdUJsLHA7kB$+t#J7V(m| zhgL_q2tp##ok5kjpe@o5G5<8PsULS)LMx#jR!%70)hSFn>R?(0GIgRDAQl%)rib`p zPIWa%&JSvBxa~GI!!5LnpuJ8itH^0?pszqaFKAA>4*ezG6snp6^?}MN*GI=HM&DlVwO|nk6ZL|O5H_HEp{{sJ`el6{Dt;@{YC56m* zHZ*-t=FSF!5Qt+=OFr{#Dt-dV{l!^kTWcemr`s>kT$_RqV>V^x+#q*NZ`(dE}z|(3^O^E1X_G zzde3b3zR1E`^7r}3!x@FumOzC0-{!_$k7YPS_>!LPko`RP)gP)^Z|gm3lEv)I z8k#|E;cBXXPQj&X=eXI|mqHH654x*?T>Z0}rha0Q*2OYUyFHRhw7+(B!BEt^yMNhCXS`%lT zO8#jqIKG8iL%QcTg15ZdVm$}?I~%c#qiBb3*pY%z5YK2Vk(vWUZKe^CyN2a^7H{(_ zbqNPRErt^bd+sd?{qDf~zGr%bbr6evP#mo@PMAeTqXW^Mt5_$3=>+z{aD19WSO_(- z%5USHo5+yFW0#+Rx@X~y55|wKj}4c|yZTe*@(u*CkqsBInq$0!@zjSgO+rC$eP&hl zgcxkYI#7WH`?ClZN>6Nr*8J-omPH=s0#7D0Ta%2<8n~njmPjq^-VAcC%~@YPR+fkj zF#;Rn2cFYF>^}|tc%Gf@Bcl3%{AVyx{r0Td@VREg zu-`^seD)88NRdoVP?os}h!dHmtHsV6EEVErej@`N4~Yk&E@Qk82Zih(v4u z!1le5)pHeJ@EB9)XJV6Az_v*y!}%Tiv^W;iA^fA#cv;i&;ud26jKE56g4@Nw`20Qf- zg<6BxTF!?^@Su5$VA;)Oj|tv_*p%ZrBO?oT6>IJoeu|NeFUwuVVBsIYo?gVc&%vf% z!oRn1D%X*YUMRX9^s~q3)kP7bSwqyc5T5@D-a8b}WB`81MxwRR#8wL6MRkUzSMrqa zrcnIzj$}f*a}G9o1&w4c_lQNb!MiEODqG@T8~MUOsA?+y*;i<}0Jm2JtC~)~P^aMw zZHFGF@K^tGCMtQ;;yfjYuAe9QX_ipJrF)vhkw2w|9m-I-i;H^?TacJu{?ji8w`IYo2nC)I!5K> z59ZRpLK7{4({d9NImn)Bz-_O2%5-SADpZ|~_(4wW{Bo?IJ$ba5zSH@HpIrdo#h{(M z+|)%ZZYIRy<)x6H%FXJBaZ_`6e?{iNY}VT_W!j}_S~gHCo53vSz}u}&e8S@W2(slU zxiUBM?Tj}cv49sQnJA(cq{BfpdpGvg8t-8Q{=-OaxBzFh1==o5^ePLnq;c?&2kq1n zo@qqnSwW^8z*?Ti?JwjtgHxXpCKOLodf)H73T_6v_PzTlSQ%o4~(# zq%zX`85EY6vpT{At1Lo3qRUn!%{Qb|X1wDYbfY*TWm@fEDfg9-e3^#t4MO{O)%TIME4Ga>SsznCp$VoNcuN?KVy$Nre$rIc+@QD9+zc|0K{w3&g=m|Iy@Z5hl{m81@PSAZ$ zu>bJu9%v5f5Eh@QM&^QJmq{9(bU*oXYDq_bXC^97W_p^^ z!}XV|s_TXGs?+W44sP?IYq)ES^Sk45+NhM^Bq?Fr@BF_n{2rJPmOLe`g|oPFM&BwN zmhQ=dd7?a0Dj|B1PFsjm6vg5+ixRz?rh)tk073qjIkP3Nb&GAa-?M-`!SzEwhTYC| zGt<4W$T~$a8cYTHI`>kb#+wwg#RN5b?C@Glt`cK-HDC* zLG7wca(8i-a+FKkoU%E&aq`jRGby#1gAkvw+vRY-@sw7wDC;~i?g;m2SAz4R^S(1P z9ZGW27qpCLhexD8(--A$@PeE42-5@Mfb_Syp7osVuDzSzSij7EotW6w*jn8(fDQ*s zr2a6YH-S#|BwY~l@M&2ujkNGln`a3 zXO`!>rwN$Ft!hE$jn2ikKdq*-u5zB9?n`tr6hX`B&VsJCV5|3Y)`_k{)H}wyr-F>F zq&C-jGlzAcDKB3BMFtQNjiG5A*zf|$4CmCu0B-9-J^3(F(RP0KmU zG0P#opFrQ`+jMJ~!YMwZ%D*FVg4Ouww~0O-6KavW4w8yV3dqLm!d+(Rb<@MOG^%3D zKnGpvPut18%KgY4;pynv00upX+Nq7~#;Dtkpf>UXc6%y#%d`Bul9opItFw4fZn|FH z2BRLQFT{i0MZLpFkW=62cO53?0>N9K`sM{p7mpT$rHWE}FglZ^`P6rxr25WGC%D=2 zEoyxI%o;wxQ2D1+m1#hS;N6lS)ALbRa)=n+ULssK^+#m-FHn*3H=cV3qKY*^#1&#@ zYcw8LCr#3};+w0=OXUtXot^#?&(&H~^Q&5A{FP}$mgeBc%x6OTIXxO5s5Nrz9J*6N z%U3`?jR%*JV5&t{AxxYsexcXIV7!ZY{I?W1$mL>PF`azF25x0J7UdnJjx2^Tk5j|) z-v_3t0J>-g-gXe-YDBc-8>DB;92{Yj41=h3gGj!!a_&Kd~L&u&Yf(y9R+h z><{i}DSJCf6zl|1N~3#L52Sln?8wd7KiQDBr&((wqL9aseczExN%$V0u?iny;~7YU zcvAo}wK@Ih|6*$EVkBd4G^>?~Ov{n>1<0s=CTe%76DF!cN+s7?iyzZALNixXc+C$Chpk%Ne6pXTpx^X|Pw)n;RX8MuVAX!bxd3N495 zH^b5r>43Z&+MR?3J5BVdE$eoHqNqtOD~0%GRlKXEM2Xt5vmIDj<*}ar#U{Rlv>#6# zJ13u@qgzW6$()JaJxiQ!AKBMVSduO@$vLtDr+v8^D>hqAV(3lLnfcMOulUVUB47Q; zv~=OsnVYCV|0sp7V&}nzT+n0n0<8JBw-eS%Bv$80tdAz-J3pairlFs@V#|#~=P$!b zAC4{#r?&10pE()LyB+JvjEy*qNc~2voGC<7i(w0V#eTSfmG}rfX<&3-W99E4hTaH0 zZ$zKZqmM6xuykSnx5G|3;L8g=!Ft-m>G#DJsgIp97CSGA%J?bRIS;T@FLN3rvFeK9 zS>(r-?8d5gVV9jlhb}{RH^=HLijC3`?`8=$$W<)IOPtm`VoS|Ak6Qeu1F_g)*f4Fm z6_e=+S*MYlNKI^^I{e?j0L>%*w~^IuV=enw!C}^J*qN8Psq|G5_Hj+ zJ@tZq2BF!EOiecYrpLrkr(<{4@E7Tm=`top0Ie8G3TgjcNVGN*rr zQ@_u5iSSMcE6GmI%uJ;I2ekEyFT+;N%$l3=tWo3+#&Vh+IrC!Nff)`-F+QJ>p!4@Bn{kjhN z`iwtT3a_LcE33@j3~b{XILwGa&qi`Qgr@RAy}j7oI4Hdr^js0T3M8)Y=1es9X2C|c zA}1W!m7iJ3TW&4`Z@C=a#ZWk9mM`~Z(0y*!W`~N5d|GRGdMtcC8V}fzRAJb*Uyyv~ zSou15VG>?vALK@Fd=^7`ZNmFF#p*627nv79rv0-IN#F&O5zNgPmDRb~e>Fb2Kb*S= znplA!I0i{rgWnjQn1Qr4kP$}iEsQlQ+~Y^~_<+xh;$J`USwz+t0R5@H9LXCf;w9_) zPL|Tm?{vOg{M+D+BrJ24JdT0*liB?*q|H-4=LP?gxve@rDQtLq+4!3`P}c>d(>J)O z8nR#xajUt=xN;z1E+F@ZA=Afl_BZ+TBAiHnPP-qpR2~1#53e{KPE^@}ff|+hJ^|W$ z!pd**^^)(bNT8-r(L}tn$^2y#PT2)g>K{0DGM{Z^l&Kj(eq87MA33{ta@xkHdf8KE z)?1Ok>4e;!$ZH07Gm1~?0rzx-mwKa9$HHS%@w<9)dzrwO?nP!b!l%m(9o8T>F%J%U z$XP|hKX>uQS3#!}c+YZQjy@AKKLC$sHh0qt>d#Ir=L_fcgs*R`Uqj0TKpQsB-^kRJZ4CU&9i-($WdD1;98?I+G==iC-UQtkFE@a+ZQCs34Xo+uWdCRaXcvh zQOLBHM4#TGY5K9tMrQ3BT=b0RPVmQ?;Q$<$H40w;o@_AULI~|Ccj?^ z7d1gPe1SI(^0{w_ptOMgFO$jrf|Os&9STe=9fq#S=0mYnhqqSq86P!X)%sFYdPj_Ch!-DadbH z@v|XtUoT`!Ik+teNp=$1wUO6;&fy_XPvJ()oTr<0yoLu)@|*3v$3SsKbGrGV{)T++ zAHEpSe^?X-4s8u`>?tcO1b_AA=|j=|)wxYK>w3cL1*;QTd1?Oc57wWV`!ew6hGhE6 z9@E*a#GY05`JN}8<GXl`ExBWs4sj2AGmGwd{?_fOM!u=KJ=SFwRg8YSp z&$+?PY~|ioBR}@>^ha=P3abi+BJ;4TobaoeY^Q;mzRG!C5ok|w|xefWzAwDuErbsoxo0%Zz3sSI+p z8l0a89pr)EKJgo>I+26d_`1b+FInAho^Ehwe)Ow>*UJi0!oZ)UkP%MdcV6hu-^a5C z{v`(zCO_*c$-c|8;z;De3)Zv%+(LV7!e&^8)1Z-OoLmW3I06Ydhp&-DZrWfa*JM3q zINt)SFAMAPLY>J_m+>^2Q!;=;CZ~W@c-0=`>5~Iq%fkdl}-0ukI z)MG7yL@PgX&v&7+htS+xDDN{Xc*)rs2(^#wA~)}yhh3M5{ah66Rj?3^oaoA}-Nl}1 zMc*^?|#)&dr==eV@^3_0jT|kz~OjQZ0C4TRA6o!(VFKK<79O1&G^(~#1D7y)I)rJ6f1W_l|k4UZdQ2?yQVME zx|~FRMRN4{(LvK#ncG_h&2kKhCz5H*#g~ay9ORaa*zI@D?Ez=_3v0nZ3id}b4Tm=> zp>uvgH%ED%fz7_dd(wT9U0^i^O5zhIZPc}T&>ay_Qc<`f4>V)vbQJD61OEKU8lOUY zM%9R6V;QKid;Cn{X_1^`W}gN(sz8jIpd_APNL@qnsr);|r%S@&#}?SDGqKfYLH|vm zCl9B66C3#sCoFR#UC_&`kmrl}{h!cOPB>TdNp6D=qBxsfSZ(8xE<>@IwjwWddJ}br zM%LjKZ^Hwns}^#mB^F<4_7R9YNPw>lG^FCqf)wq_^H<{+{*A6K&3T`Pc8s|3Xei|w zGOZ7>ZZj^51<43F_X zly@9{Scrt4z@ApZHBVWsAKELFzk1I5M?r0WKz&`2g#Qtz@5!lN1wnNiN}JD}l!Gpu z+;S4@2tua(!9E+|ja21K48+@4=wcsxoyBV=nrt^uegRFm*sH)@x}YZ&ZYsiO%|Ubg zq#`q?5J4XFBxmpDFN;!#vqbMkmF-}VD+zi7sMeqJI6>q)3!Td=E}I9^lX@m0{>Ij|P@!MbmS z<0?b*ci@moSoM984YSc^Mg^TlM7j#}J(N>i$vd}$wOff@F&Jr7n&llIEuVD$(^0xZntw%^L@N99{M$2BU$kRetsBP_aA#R?kEY` ze+!pfW7pg*=zpz&lkrH9tZ)bRFFFU-0 z^xFfSR>2lM1f5g`ooJ#~&_rcdVPs%WXnz+n$ji*;iJWAjDI3|Z>fq~a!Yiz}9_-N% z-C$IGn2<__hhoNRdc=yCa7TmC>=Uql{z1+d2yYi>Mgwaf%_~qqR^(c3Y^^>%t7{mN zq%~BR319FOcU%Qz`zhjXy`h?UL|_`AO~w-M-z?a~T13@Cz?0+`=JEWo*z*pMtU1sh ztC1s;yj&d?m)Tng&#Oed!*lyg?J)}fqvd2e> zqJAL@aT#n_6=br3Ofrz%SGhS8CpdsRUjl8E1z*^Ye99C(ocZIY>HQhQyuT4d?_AVc z)`3Qi3f_DmzDh%J%eci-Nc@z-8I?gD zcz!`Bgh4xGZ$jarrrgp=Zod}me+<^FEN532>JXUounx{Bf&_Yq>{!hEMk0@AB7q)Z z<8(kW1PB9ty~I-KCU%ajbY|fMl;Gvo=0i0GR=x_nniJbUjXtWcczxoAvw|j@1?4-5 z`VD|~UvpaR!EwJ6ve8#!nz#;Z$5gSQs1k22Ec}C|c$igxq|U1gUA0P4=hc+?lar_; zpGm)l=JX8zOt+$TOojZaK45;-OQtYXp+YcK>kmGs3#Zu_9w|Z|=&Mjv>_{#D04n+= z=AtwgeiKJ)hJBJBikgqVQ=jupqhn8LdMmsjpBE+^Kzf-$IX;AUjcTy|c=!9Ut2Yv- ztb#;3gsoPQc#fUw;2RBY;9iPHRfbbeM6wk^wyWMHSWENB558q?WDVh8bZ`sM z3_Y1T+lBmgZhW^uxN#n|)d239#Z6vdm)&^H01s*O(K&?OKAi|!JFtL$VsmjA6=@Ab zhp>|9<$7%5e~Hg{K_{#ue%yt=2<^ZtT+s7#AA^X!Cet@25>!-eax4|ZZbDzv1bSMS z=`y!Qy9R=27YN;h$d(qYqCTAU53=Mo=v}XNlPRA!wLtI*e%M`;=|SV9w{2N^rkUhA z@<@51yh5HO|H)jm71B5Ib{4@!?eIHISBEiGvk?D%1FGwmX4iw68Pd_$L$9q8MTdZW zbO<=7tXAh~WAqy6$I8gs_EJM)tsB$Yl zZUUB}8xo-$lIJ>jjFrNBK@fkEMJX>FA4f>QUYEuQD1dWuz-;kN z=zr4na|NAU)>4hykSs-aMAddsK`vo0oho0_mt%z7jh?pErD~#|@X))Li4fJavSckb z>R-J*n9-0=4x}&OIP-5=qa)Zqpu_IMJGIeO8Qy6o4Vr8Lnr|rIaCXlHx-XQKPhFnsNzI!6#Nl@K@H|p2-Z!TFOgTA?`F4kXBR#csisnA= z`s$qOT;g;&&oE!?qUWm;s@2gac>gs$6Vk*u>5^Q>JegigPnjGTC!P|fn!0$$=+8jw zY}2er+OytQrXaBn6VsZS6V0`KvrE6zJASel!JLlcNT@MdKjz4`(sSYuIZUsF&0;+= z(S@0wzC@l!@1(5qzf!m~R6Hs836szTDd@SL;D;9pRmDUy(EfB@Sj}q`{cpE1bYvSW>>u>)9I6da>nVji8q?U;WfXJ_O6#2RA+daX|6gxo zuf;5kZX4Y-Wr&_wrO* ztbc4!-_Vwswr1{@Wl5F>S(ay>pQ%dN?T`||8v`Bw!~A~Prdjh?p3+}+tT<9wZ2FJ9 zUJ4!Su9I!6geu>Sb-OM}jXBu8UIh?5ppQQsxkx*&BScJKJW??iK zol(gD57d0V0nOVA*<~RDWmsF8z#=^7-7$tn)82Z*Dlwm} zrY)cChV>8YAj?>DD>+=cCCp?tR7t&-wt;@tIn>tbV|Aw1UN4KUx*W?q1#Q^SbOz0Q z8;r>0SsE?Y5el1nQU~@~&x^NE28-h}9!EhS${%;?_n8Dac}(h?^!(0B?l6V!-dYT@_AxeC zMQ?w-qgF)KJ()d=n6K5wb5n`cHk%GhF&52!EZ|8{nUKpNb3zsd%RylQF8dp6oVkH4 z(l727$d*uMH4T%R%azTMOj?=8ET1aen?GH(0<3MA#kh$6^b5oV!XnV>Z}sZ>TkR59 z!AW{6;;>7YV){-xE7vm*VlKui(24uOrz}9%d#RLYi$&B0``{vWRW-b-_wSC~{#p&=p zUVp&Ev1nl&dtN5iq|e-3aBl6fzI1whR|i`@Kz<y3)93Z(nMw- z6%_B8N_qEaBh~%NXz=1`^hG(L^zkG)yQSYu+8o#K`|U3SKi+;{?ZcB#9im(O%9kuS zn`<4!E9NfNs@6m1TvBdR5$%d6w|lWmadq^JQYG(m;h@~XdePe@`SUPSU z659zyOjW!`@pbmnBVi^{ppHam4&ZfO$7}B+M2LCOVRy~>t<7!O?A`4-?G0?2rN8-% zR8n*i*Z2b&@JOgCJ&+q)MqBgPO4(LfyIZ!(i^Mu6kM>^ifWN8f9F+0NvCXl@af9yh zt1^l@-#fR`89b-w5wnk9DJ4K>Z1#1fm9+fyRvAc_)g4%e4y`%89oBf)nf?~Fowe9ax!D9c83VR;KPugs>hbkaKx-lQ!N*BW^2Pl#1SlgGG+Cw!0Z9uTP+Oa!Zw zceQ>N8#Hx9mGD z%_TCD>UvKOYCc4FD^FwfuwF!%EsZgMvz)OCwg+g}wM;ZEZ$2P5m2L7H`o@i*d&WI_ zOci3bPd=vEwU+wG*UdGo*KOf`A^wZ}`}r^T%VL+TYvi9o7jLlEN~z07&3I8wyce|`>JiU;FjoCtU75C5-u=?e>=3$+-Ny#+iuWvC_C($Bn~UcgP6)A?9Tk^LJ2(Z74%$n;vElR>Q_y@ zu-1|p8?Tj#>S3+Fw}VhqI>8L~k8&9IzEAl(BXdg3@A*IG$5f8K9-Tcl;a5~*;q-p) z3~hq2L+Zz@$sS@w(_?Lsa>c!Y4rJ?Hd)zscIQ5~v-_%cZNWGb(8*j~SZ{*j>zkPry zaByIYz&lLkE$P?HR?SjWt}mWunvaGjUjWJ;My%j0ae|g&H@b$^LBEU?&x&QF{Zf8T z?k_qrAEmeDXQD3Y#A zduLhq56>laksgkXc9Qy}FQDp6>dVzI<-NOrJK5EY?x`J=n`%W6a@(1oa~U6U5s}gz z_+|HrhAtx}Y$6x&6#Vcert4%As}Kbl%q?uEgQG(%Ep?L?P)oK-8Y<<-3a1x0ahCbS z?Di40Y5;C%5Yfe--nz&Og}R@E_~s4i3VDgnG|}QcbZK4ch&mDf8iZG2WE6@J)G|qOwo8pf5X0N1GS(Urkd0^ z<(+a9nYvHer0i#s#v8gQSHRxdPgll*+Az?9xrjpLU~j`rxtVD_LX1O0c9iNdSLFzm zIzNRqc(q|v!tO!VMdR6C(F^ORv`N&rWT7&^$vonh)bVT;3Yku89X!o55>t*R*y0BL z2#swN`}0S1+`YsaX&0Sel=|Ldpdx!QkNpt3ZIMn7Jf)}->xpD_ht!|i0B?ZsTs$Z* zv-Gy*^E>RX2P6hg4O$qKBdAc|HUD_~6YBzVWht{z)_Weiv98*bId)66Rd{sNBMTn! zJ=8vmDz58H*j!+pX)R&xXQ^yHEX4|8rk=W0tE9^60(Fnp!dqA9CiO7qv(B}RwWr(d zevj-;?OW);n94lptmZ;;1F4^Q3}o>?#5ijDvV)=Iht`5**r8{opKvkG_zaqH8S| zJ$9x;VqtpfIp~Oe3(Vg?R4g2UIv+4)DN3vcF7l3)B#CksJj43(L?%0BrK@CuxvgcL z<*MZbeTKbEuinW_E?H_wmsmlVLk{8yk;a$wTzp4AiErv`wJM%TF3x*2(^sA`N9PTl zh5M<2>Lq0wGl!?rt+A&1pSqfP8)hV48TJ~>#JCzza!)L6V?~oq7fOby4VTT;L{sa)aDiPn0CUek)D>$ zVd`r1F(ZGLaH8sF1dM%f=)U~Eti`c$c^H>E7b3>#{!Wv}6ICM)LX29$d%gPtc#jJg7 z)$RA}@9gXCZdo#B)h; ztGS75?IHKDpQvnmeT24DeXk7XypJe7nK3(B-|D?!+9R|FiGLB#*MXlk)Y{ zOO!W@_lTa4-lE@-5s&!Xx=LkbuyT+&Q!CV5$gSMO8?59p9#gm7lW6)nG7b&t0N#n1 z-zUvOAKRwN22Y^pqCnO4n688DpNdH+?|Q( z9CZ)GYM!rNrY_J-)zC@m5YLIBAd|02Mda;re)B$aL3(RmWDe_ei^bC2yj(uU?5wPG zZmkX8_HTTar{W&zZ@HHFC0)XcTH=|rctuW=DoC?M3-P8s^lPzFEqRwJxUSL!Y=p*0 z>5Ih4ixOXb&*a^&=#(&K=M<#6;y>)3G(7K<*ga!(1loi{BrlhhseNVf;WKN? z)Cl#QG7m3mIo;6f(A|3~Jw8pug=d)xk!>gkt~^Ri6GNn|%qY#zs}K_vBB|i`jzut; z2>yGjgi8qT$rkq@$7A%mFmk(bWM002B8VarbRPY5oE)CfX(g7NMk(%X1-;l@pzxbf zWjuzQ#xVH4IVV|!Y^Wd@eG0GOVH;IZmC0&a!T1>2_0RCY6(YrBk;YzPw13f0Hb8&Q z>2%Yw!HwOen^Ia~$>gh8|}0wR2hQS4g@JbQ$2um)YPI(d$@|OUa3oDpMM}7jb2~hiCa1FEj;v4 zDMyUv9Fsa{VvDrLhD??+%O&L;a)A6nI?L3f&UC`dL=5^X^Fhv1BR+)=oRQ*dI=D2T zXVFpev5kn$S0nrOk`<0bkGM2?Gq@% z>S&d-^xPdxyt4^y|7vp#$u|{XAaqv-FqI(jtr1NBT zw$VxKKAuZuWZ8e@nMaZt&oGrm){PV<&>OA;T;d{=Je}Q(ASc#=4XO!7Ihsjrll6*J zvVPJYFdgw5mf29Et8K{twIYU?6&r#>JnH<*cm zc{MBDQ&rUuiBO!(M_sKtx}*%1>jkKEt;KtGF@2-1z7y{5jvO!{HUCCS%VagT;z@U< z!(upb|1HuDri`dEns*DVVnLz zZmB%kL8H^&aqy6Ccp@kD9{I2ya`;|(u|kT0elYM4;mF2kP!DxHrf1}?b8{M<^i-^= zs`QUNt**lISw@%KuWBCpn4YF~uNpSdVtpfLy^ni3P6p{4o_#}NdH0E08kLgM=o`8P z8E_Gq;6O5UBUkzs+qjz8S?q)tlnZNmkI;jse}v!W`7-b|p!0BWLSKjl>_fIp;Z8>) zomPOodW{6G$h($LZA-l+GTJZzQ=})MW z?+t%V(#}EoEs^%u^eF7Af4K3=aD%~@`-zu%wQl^hJ92R@QQJA>;KPZVgo&@{HCGai zJ&ETBfw9RBmSP@jFbkE55cZ+pYHP3w#yJ)xd)I`W4q#uEK$NWIy|d}kQBhxsCY^=t z_*J=1cluN+r&cg=Wtu*!R;=9 zUORBM!#LM;Q&;%43iW|sMG;%%t++<4i1*$}NJJVo1cURF9Q+;Zoa>y%ZQtu58sjye zX`ogUKt&kX{V2}sFus`4`*uEGOE|%uXttYVpwmHd8C4@&slN=t^O-|#;j18$Kd2&h z5&Mdx#ZmO?Z%4lhFLg!}z(l+NZPLhxqcFPCor5xufT%c*&bkGL!tKpLG;Sg&pi4wU zuYo?81dZCDIiuEKFgIpYzw`lXU?5P88l6>O+pe;YXiy}Eu3C&eZo;DJ$DFa>OaL-) z54S)*Ncdsxh$tU}4s*lLd(dsAIjtjDW0~nF(FTn(0PDLK=hK#*wBv>*2;(_HkE`V zErA!)m&qXKsq`)k{%aj){+qmeFt=cIuQ8C$KakZSM8)QT94JS=_oq;eCv7F(yn{(Q zf6}u)j(WEROjZ1YYK^yK>f55F*JF48M-^Bjy?|bn*zH8>udGnZeD3Tjx_2+qu?unj zAR^8`>4Fu9M)U{uQ5IR)9BS&sYI@>v_vds+^WIJT)h}-WT z$7q*2aNm6__gTDq0Dm_KnjFtfEQAO5laYS`3Mc@sYXqWTG7@JUw6Pg0(5N{wFm^`g zrEk#M9q#)z^ph0?NI!0T9yi?uyuvqbv?iMABw2uw_Q-6#K`53x6yRaxSbh^~A zpMhjAWGvciptO2od7mZza1CtC2JU4ry;M4Ik3+~7tj7MmAl#)^_P%hH->=55XiL`s zk=^XTg33>JZ3c0tGxVSTL=9jr?G18lC({u>sX4Ir?rMcN(~CSiE2xi#XrfM>*I@QM z2Mg~XDA?#Bl?j~Zc;t=+4R;udsSDk2r@PB(CXB5n9@q>G>BZ(ei=-F?z9v+N<=u<% zm@9#%Gll+YYzQpJ!erQ_6Zmf(ruR6A z8C@dUeH@GJ1F@gNNX#+t!(L>|32t*fmTPe#m1_PT$dS8HdL5|y1E0JU9%~5STl61z zL{W5i{Ha;6ySw8(p9H1z3+_vV|6ijMpO67`>bcMh(^+>cRY!F=p%v`=y-C1wXod|i z2mar}YYkbR*>t5C3q|#Uda9uxJ!q}HoNPaQ^bY7&qn>IvYd(N~Hw4X^&Zo}clq%pM zmSKfmL0lO9g%9vDFp(pmqgwRtH%=)4l#Pv-oqvUb04z!-`cK}mma~43w#-5ty*SbI zNaE;8=)T9`-X3wsZn&or7{5(eKA*5{t%5%|U89;j0*xIC$Euv}dscdq8=VD58mM&( zsCc7q`8GIq6|etS4;X#76Os3?p}uYC)efvYE0Q#h9&C@%hS#Zszl9e63@2oR4@MF7 zk3wQaUqk?lNH<}X!$8N0W zY;@({gZyX@Efod9WkXKIf~R^&ZR}Md)A#ikRJOWx5n9TG-m}uX<`;MPk#(hm+bPXC z&g85=;O7)W?;4#Pjhi@%U2&ak-%b3Q%bd?CzP~_@?Jap?3+Gb|Z@vO_lnq(>6B<8+ z&umniH3dgo3M(fIXD#`-#PEZ@!jF%Uj7G=h<#^7s_*#WdI)x;QLTBD0Q@ns2V;N-Y zFa159cs#N5@<_*};4z~(*Kge0f4uu5e{-5MzK^H)6aJIny(~l-ii5gp2L&#HuJ4eO zPDFnvQ;qk4l`V#%jBe6KWq}AD)(I{*4Z1M;iD$sa21?h9eJPM1av?WfK{s1L#dYUQ z3vy~fNX%Stq#-km=_JRoo(zqd00kNSK?2Fq~a_^&7pMHD8@X zd1!kumfudS^2hk$3HTd0Ps9P7RD6FR)_IJxn?{_XA$OGpWMVqh@R=Kng6popF&FsU zCs-y%C15RXwkI;T4X2llDzPWX)s@`gXe`4)tg|<#(;7;w3{{rHKB|Y`*pGW&gcZAw z`#ld1{R3PSi8eH9==O3(7m*lSxv4%-PZ^%^e{I+vj+_AUdLlM%2dJtr_KSqomCDY3 z^ZL#njjr9s|BYVTHl#)b^bkU|LlXAvP2|E>D18BRW>EZADCs)8N@O3okTW%TT0OKy z5qQw+i{Tg*utEH!75?lTWYTId3r64He%K0K(0BvT=wpc^4&l3oKAB+DjvD=4j859+ z`O3|+zj9v8{N{eBw0O>^VKQR}73GzWo#$eg2KKob zeuVKd`o(8wUv742)Os16L5<$`Ch{AP_^gfG|0?MEF1yMD2adp&TMSi>=PX-b-BsZ{ ztMXr?BemhZ8Fgj1p%kM^>;@~#!0Ii;%FFtGD}WI-WbGqv)u=rB<>Rpw&gLgF!swx& z2xSXM!T?@oA0MXi84l_sLdZ6khdP?U`>n8K>Tab&4DE(+4#qjX=BEdc-G&x6x|E*c zvyI;Gd3k0Dq@NK@R5=G7$&&}k+Ll$0p2W`M1$OYc+hf6#h0a()aj{ zQ7`9)SK@s3)K;YBAY@Q85OiIUp=;r~&#W&yXIvdltH~Lc$Brt>4hlh``Ox%{zB|)c zrH6e4@pGe=uOI9Di*-(e%lhzrZFXebS~*@uw_u}QzYOQ^hfiVH0Z)*`A2>gwgKcqs zUkyGi$S411mHW}ch7Z@r=Si<)dlZaxY)?Pijuj_l%)w`I7r5 ztoWT8cl7tOggPl#9J=S2X_6&(K%daE;iIw@%he`tO#ZJ0ix%EdxJu!x1#9O&nY(EA zFIm!qFW9?F`L(RhNh$f`>-{+QZR4k;cW+*ged&Ha>v^3Qg{1A z`faDl(_g8|ytXPtaG6&jjFW?GB?C5u2w4hcy`E!t?t^*nh_L-LTIkc zYr@+_4$OK#>(;E_BdWVBs1$tNKhma2+q@o6r;Mv9GZHrc`ZIQ4^y#k?za)JQ z|MKQbg>SZ)&avvxwBM0Q15>X%^1DZ>^r;Y!n+MsF{0aqz1#bzt6go2OpRmzk_d+j( zbPV1Vc*TE*eYmx-`HT3kX{EkXO<*2qLsw_#{)}Q7ZyiS*Cmf#~O)``WomrScid`$_ z?IQG%{xI*eoUnGb?Y5n^ZMV&_^|!UK6}COImbQjl2FN+YV%{r?!)Z>hn0zSy@UJF6 zwtqhsGd3nBCiVOJANPMPj{lH!JT21oOD!mFu;vL|6Lu+LOpc{_((=zQRIf z^!OiJewR-+Ig;IP^vzOEThjnrNQX>0!uv39x<>XV+23Ywo4sDPQ<1yEb7w9S`X;cv zUv*2Q7^Tf{H+9rX*_hBZ?)ZrsDHdDhXH?vO3B^)Qq_=aWDO0^MVjfEgyFK7QP*7;mOg}O= z4KEt8Jfd^N#_+0Hx@S^C>I7Bxmu$D>xxz?&hVsJIKcjAX-_$3`3zC*4#wKh{IF(R2 zu~gFH6a*A2D?_YCS7nBZT?uZS(h zd`uz-;BBIfRL+9pKASPb(ICBT+P>7bsohgwrk+asp58Gd!8zL=71A zt;_|i$+ks)*ZlhhbPL$*|A$`_TcqW=^hn5S(&?L2hiKAEy%h1QURc-Xn9BB$spR8{ z6^4@Ase*1R?DM7@BL$5r`F?48rNzs2{m*Yd+Q*YCFf`GB^8djpRKP7SmM_6nHhKiDs){h&3>(o5bZzB5I7hiH$K z7M@twzs?mI2OVnqy7aN>htrEXEE(CHqg)B@sY-V3s9wQzNH8s~^J@qbkJ4cT=zNgYISZ zq`#<{a4@MnP<{gDXFs2N+O)wtijJ_u)tz)<+v6GOY3J#~H0?W{0#rV<1j&*^ujw5E zs^N+FO^T9dn}aM}EptKOb+Ck5PSNH16uHcvbRGT#K7111XMd_E_t0ZZ){lYz{jN@; ze&DTgTlqxJ?WEcT)W!?_Z*1|uruaZ{1}>tms*_*NVZDrPL*sISQLnX)~R9A+$a zLTydkh}8_zKT!GfjLEj&l!f3?n<*neCe#D>GL~G*U@}rsM2(`TTnNDODN8i3w|G*r zn#)^qT6cki9c;Zycems6QfZNRm@3<)SSW66x-R7D8tBWkJF1^LSP_+%9uwGvLaIO2 z19_;_7l@@+7gy4|_ztJIOPoZE)lSyGhOmtuT@Us3T0`}lXMww=tC@3SM)iyq87DGk zI#;>k+!K}jpaLJ7j)?Q*R+a>7Tl;Xo-2MaoEBkNs+h}iMdtqr{j-pbamC%W9a%p4| zzEXvEQ!S}(QL-ziJpDZlJk>mHJY$#_`H-AUotvu z?0`pKfK6LTer+__gcsB`wiGU5;SBS>BllW?+;0Wug%9I7b?Ih3RZCDOk`ql-EOZXm z)H~WieFL(kuTY94&I{>`e8_yzvfsMcR>8i`zQSJ6-qKdw`qVsF&LqWBqu+v#v=hO3 zp9C*70JOos^r`WUysMp5F5V2h56XmTa9HL8Qw78F6!K2M1 zEiBntWjbgo)GIau+nYl?LbNvyj7w&1 zwDQQ^j9Qtj8EYLA9S9qd~Il7LlOJ1h>gknKG!ebS&g}?fI$xwWN_n^TY!VGY!f0C_#CaIuJ zTFX=AZSp~I_MND|Ys?Jl!@_qg)Rn|QenGvLv8a}UiT4M2-G_PinYHqCLQK=9LDLKI zc&cN;9t2%6S|}nG0B8Ql+|YW`7HxmvSINJD|6M=D9%UPAb(zP>l5|j@cAl(b5;t8L zWKUU;6#r-f-A1qJVZ<=*fJ&P|{O=DUrT=m-Lxf-0xRKtUM&*bS?D2P3cO7%~b2fAK za4vN|b>?tQbbWMnb|<(ud3q?-K?1wAYx*R-{e`9&Qv)KeZaD5WHG3DO0J)a@2eo7i zrFb%QExxi}?|#c%s^siKs=?a5yg<^y5S-DJE%E_0rx-rf$MS z(3KtJbh(MSm$|t4K6R1@q-=C=uMOtL$$ZmNAeeSTOGZz|ywoGE#?3Ad)%bhwXcN?m zN_I~j_c_-*x^h-@3siJj)ohxLc?9&qOc%5RN?Ym+{&ZPf9b8S^hdqH>bFBJi#3-7RK}ZJIa~|$K@5%3Rx@&ooJvQnkKj=fizy(U_(m%4r zTotr@BXdXd7$(Uln#)>x(*M2yQ>9eTq1_xPgE@@IfFDhg?}gJ9YT&U zFWvi$jtB~JpaDGR$2*&O2*ehdhIR@q5fQ%qysJyeXa*Hk$f) z3+j*6N$7T)yQJ%c^PID$tF8NyXQ#SGpJl2e9+Pg$PtBW<`KOWjb)~jq10fT3 z|55D#J;7Tk;YwbnRqsX8Coy5X9a<{RUDQ3!WrC9SIFC6WP|5Jbx!XD1S=L#|*~R(O z`Po&_vrqX$+p6F6jv!Vz3omRKIL84XAexhriy@0yn^^Zwx-EG}v-6Py-?tNf`9wYn8)?Nl9E9oy5Fr90D)IWA^= zbQW><_Z(3Y)k^vzZ@Ouy=#f@YuW`y&&~J|ag@7l4CxeCtzh^S|yWqCLO@n>}g!#K{ zJ1y1Z4+3*Nw9;yv$L((9enA(~?yfejNv;R3uI>_^>dHJdRU7X8XetC!Hvn9)mwKf> z=7r|7U^@#k$9*94whLGufgY2nhS*4LM7rF={Lq}kQpuv5hnbhr6SlEfLg;FGiNikuzD9by|m8>^y zk$z45^95WEND6oq&?I1he+|DVTQ%zzvsaoc77~~iscTxKR$J}C`5kg6xEi@0Qp4HV z+0Hq_`8T(8+4&3$tu>WSPu*FS*XnP*mGDU#ZTW7??XLw)3tAD}C}eNQwUC`5-9plW zrv!fqsv0yVa8tl~|G)fd*k4=!w49Osq|Q{ame3!mpkqBZ-I4CKt`e>veD)J(7S~1B z8Fx6v-D)o!2d=kV_wxHafVaIcU}AUuX}su96#ywM~ol zVp^b@OKIm>>3-)b?b?YI8Ohg4=UCTh_h!!%C6GDFjX>yEMuKHx4n&H4$2^$6w)dG9 zu+cnK&LL5cVERVgWIDBg8usB%Wf9iX60jfP>Q!~0_D%0@vWoYmspf3fNw$ObZGHp% zLjpDjWDlGacqZ_8V8_4}0d4#@*e6(ZxvO~GTR?m2dFb+Uu5z?YFOpU;wLnVq<$D( zq#FjN=gaw@{XabG?z1Y6Gxxjqz3+R@?}!ihd#-p#Ir|msc1vpM?$X<(wJcUkk(IJX zJNh{1xOTZO@y~>xV!q^(3GCg)syDIspEYB`Rcz`SSDuyX!o`Z6u>`xN%I($Qmi&Zb532Kd&mr+LnsZ2iHoYN$08q- zs^L8x=kD%0j4E`dGuye_HNdUskMNApUDzc25k`yAQV02vQeAbQsE0i8zDz1po~^=$ zp^}ead$K#(KP<)B*v;%SW)Hsi1l-v2a>7 z<%`|LT}yP9K-&Pvb60&KPU`D%61(a8+*J*!mkozZkG#fuZ}RTqeb(!>>6&rAAw+*z zTdX#6rSvJXy6UFfU98HFcLh2-I7;kJdmD5)qMSSM+H1L1xJq0b;d@&o+!cN05y}eB zaCp@sFBNjAcsc^FlC0&cl^m?hQ3 zRLh9@_%d`^UF7z0-MRbh zHKrjwiJYREr`(sui5rC4LJMIdPX2~sAF+b?RH!Fh#Ay=259Cw$o5F4JJ*vI7~x*OdE?yq+gGO~U9PiYBvBk>`MDKNI`p zSSZ-ritDkj$GV@n5}l#WQ;y}1JC1hFNLNGmQvQt)0h;#>B^~aLO7J$-q02H^%sw`R zi{V~znH;J1;Ga_N2kuTC;2#WQ;o_s~P`)IOxo|j?%MRrAjFB748l1taq#)^#$cS@= zOnx3;l@H+C@aOn$LIkwkHRKjhP6ncD*$V20hr~B%H+kGK=99@}Z|W1(7}SB&^bRsHijQn?Q5r&{aN2WQ^_OswKd8~5 zcg&_EkfO65dfqsyEuBp-z-jYE3CQ=UKz>4Mf(%AS3n~Nes}7Et6oODWWkOmZ9Ot)yukGh7TZqyd^oN0T$6Yfxn+x#TB;0UDbBCS>xctUate-X*wa=z9y{7QLtRzfOZXgNG&-bhJbP5{h(GA3eLy8Voh`@RFiO|nOCT7mcY%NGiQ5UU z;%R3CXNa?sbFs6)xzwd|A4LY$X5P#XgClzk`~X?f4>?(ZmIP1ARS*ltD z9zjdwOwB{@wkEu7Im|#d0aTOo+(+&p=n55C3%!r(Mpgl%BN7u#g0K)Yx^&OzN{l~h zqd!y@Tt_OR3-U>J;%xmd)g%FFX_e(9v7s={y~=sW{?=N>@~Y&HnJ_;=weZmFUFxt* zvUhWB65R4M;vxN(o29+4-(!sMn&Exe=brCZzrX&;0ha=!gPI0C54;k<`(5$LGTqY; z(8Mzn$Y2jAwd7wp&)UdGEJ-i%vs|+tvww94^JBz+v0rM5j%0JH2$j@lItsfc3kP3i z?giIEeOUceeNNp&eVZ%6-A<-?xD&$3VZ=vF2>)XlhGGUA1-Hpm&kQ9C?&~kE)|k*d zF07J!HY4Wm&)=B|7vo$1T=!%0kE9<*f4+;ammnoZBtK6nOgo=Nbb&qTveY)zL8mnr3s$H*6T zkttP`llr>8T5p&e7S7MxkTW$qBzsQwz?_S@9rGg#ql*WYT(nfPe{-JXS4nd{{mDS) z0%z8g>W&%&qmNgj*C=%4_jnd=G zE+2OoIxIKb{XuqFC>BYl&?jk4dZ?3(A2&ojUo%zPO=r?S(f2aM8q9_a!$yNyPwBI@ zJ2aKm7ulMat282?sM>g*%I&02!aTmadkiX}^Ue%B!xP+l_&lMfbXBIo^&3izB>Pa+ zLDjg)3_<^=1GfgNe=FCQW4Z0DAG?V819HtI^x+>P6T}MbWG%3I?jg_evA7WKzZmh6 zSXX)}twNF`6jV?q+KK1n3?y_crT^kd84Lc>G3FF*0lk=F(5#M9*U4kVL{*gMmwW(K zVP9c9f5NT94R1WUBC}l2u$#Sc|I3d}l?b`md(3 z?vB2uF~&3=cW|32%1G(9urF1=`EYAN{?+s^N%y~B{aEy7Y21VttDoO^e(%McxY*Z= z-d+7T=IimF|0b1BU7dZdXro;tYuKKqOF=2+PgHqQr?|1w@?kr&)BVnWIxp^YzWwRe z2b=wDaJW`@mCF$w%Z3Gpdw17uW!`$6yv`nEuA8?zV?;_;V(0ky?>oPp`zC!~5pPHu zlhQw9Pp+!Cr**cguC!mZgf8O#X!{w4n>=1^eOmfjeV6!s@KgMpelPsm`pxt0;B(9C zu5pt7ho&~Sm2ONnR=tPL{UR!@3(6VKW8CC-k$&K=X|Y#-fg+bu1$de%GvtTxQcn}# z2|>aH{v@U>A+Ax*`;KysEA~P5YWAA;vG$KRjruz0x!$<@3Y7F+KId6QbfT>EQZ}B` z!D*VV-KbORN9#B0*XjG~OLc>Fd$mV3>(m`Np4m$`pnicA)74W0r`=HLnpj;-7aj|7 zf*U*O4Y9IxQi_mwLU%t5lsG*U4zJ)tyoio!96qZ8Of&wVt{#fq$#yh_T{Mtd22WiR zR5^jFi_msAM6KBe)AWx}I(306AqEq(##mj4p|LijXSWjcqNQ-Pq@f440BRKqN`%qS zX#GcBT#H}594fqHxC!atORU^NlLiO|9msm{e{< z-~_LE8Z-GyGP&+qVvFd!Lz#!Ja8( ztLCr+bZbmbpL71V0;>d92)Q3(4=D~g6%riMJ-BAj+W^wP*k^^;d&4j7V{Q{YiI|{V z5eM*dTv3>}c0~MPLDmzzTGwmbx(WyOox{%gkLO{Q?gayM6eEZZJo)m#<`HPRvH!5mwXL?5*lyYHI7*xy-1qoMaUc4M zt(6i15W2&#xOpYb zFa55V4@yOSsiV|S>LU%r4!jfl=@}12>Mq>1qre_~06oq`uoc44 zd%g@eOtw50-uxc8ldcp;h_k^J83NA(3H|kR&lvb`UP5`h4|hsN9xYzvEv})?0{dOt zBWsCesO5L*s?wUJN=a5paY>8PC#AP67VByIRi_^xC!SPJ6KCn;+){0M!*0`M@5R1} zexLli1#}Nc@HhLN@TGjJc-1sk)K}8hR1aY{(edb&4D@W4Z;FY$%H7QwXJ2nSVGXlt ztplwjB0p+74mpF|xA|V8D4oPT#Y*g<{FwFZb1q(eQqx$wU3*P?SUX{smR0;Qn>$=1X&kbHLum60!ZLtX~YUL?Gh6_Go-0=HCzoPqE# zOnxsh5-XPSkKH?5Gn_GwyY_bWDEkz9CG@+TE=HIuRq=R}G*iSK)A|{zn)0!Gw)Yi% zXZl^k&Uw~vpx*~yi_c^4@?L?)qq-OBy-ZE=rqWJyBIkI5bwKG0^ZnwM#Z8K@7B4h! zE=ex!X#Hdx=b&Bp+$)4}(k$haN=+?ig49Q~CPQPB!F!TVTi?yToqd=3bn(7v$~BmE zW{sKS*y{8`@+(f#mzZ@X3R8F;R0>NS!|bzcx2zqkf!1EuZ`Kz!-oDk@$K6%vD-Bb+ zs|@5mq{aSa&al&&+L_J!?cw|&?uyP2WU*g9d=##WqPZff9M zuhSZeIwLJ`?k_DY*q^;WE$~ltqWkCh??be2v0 z!#2|XGL(8P@!joTEpTj5jo=f(w}NK`e+o(o+z~+dhx&5fH;nD{Pc_ZBukItSCkLAsD!7Yx23n zNMLJ8H%Glbiop5cSq!>i9Z4%%dD-2={m1na-K1xm@2|+DIZrpfJVlWCFF4s1SZoPF$;ZxUTYU7j`@f6<-TyE)nC=Q z>Z@vnbD<}mf;bL8RbyqPq!xeiF3=NvL3;^s_jDh0yWE5Lr||9HLdu&%1cwQeuMpKb zf}r-$VeApkruNb1YA5S9=z8hyXg{IH*_%tl98OEU0n>AnXOD6Ro+%Gzfe*>U!kZYuju2RMOO}6zPiQ7d9&#RG3hBs_1QT^^)|`k5;>VfGdqZA+7YRB6l)p z)TeaIjN#tXd?)&61_*)cg3bhW3EB`iH9+?3=R4hds;Q&F8~49;Y;&3?o_Y>~7j%x# zbNEV^#N4pX2h`D3Hv~(;jLhl>o+08ax|$P*y%b#&rv501jX_=P%9^ zZ2UI98z0Vl^9KCblAp~#;iHjZJyq<7^y<~hBd}@Ok#nejF@@~HO6+Q`2>0`G>UruR z>QJyV{kWd&aHbDklhUH6nSj02iAmo-pc#NhA$-H6F9%cIJ5T~_M%EZN*`utB31)(5j}0MoItdRnm$eUcPxWgI z7Y%v(k6M53Br!_3Z26kIB&F{U_I;-p%O9Cyt@lD>%RjpQtjX)iA2YwtOA1TN$|22r z9UtY#YdwX2!lh7}y|37^Td*1J&YiDYvuiLJ&I_!$ya_tut zGA2td=IzLso>C@hS^UE9IbZ&K>hy8ShkhSAf1LI?<=eGiumA9wWYJQ)QSQLJ*LU+h z7Ido2gfJm|fBApPUkcw8R??n3K0&F882G_T#*CGTkLY$y5= zvD|Y&)=Q~E9$$_h=H3RS<3-1D`*~Z5b&K_hbtPs=5w1esM_#WY>497??Fap7W3p+S zS6|#bPZ`@7&VWBuO+ADCf?4zrV!kTElOV5`YGdbF?r!P|a5h3kwa^}GU+TE!?CowT z43jo1Csk|60J;OC2WMwKCa>?9Ht2S?r&GXDn1_|!5n8o8%nx+rG_b34QNt|7I(dvQ z3fYP6;B^TG?IWGs4oX>Fq@doV^i);SpD09Ua=APS6ZE^t{{D*o_jx{!w_@cFMZf>j z|EU$##06ruxLj%n@=Z5zps#^moCY@T5ato{i+RXQLZ@IBT?mTff6v!3^CI`c(0s8aO!kdC09$s?3wn#E`+kJpy0({q??L9Hg^zm+6hfbtPQN z<|+3iXP850uVGtY&9uz4RIm^hqh+i`vXojI*%L7#%HyM?Y06Gj3>k#!Q#HKWJQe~w zR$(h~OToIks-B^#txeO8(_Poa>GtZHVcJzzyG)a;Zmzz9p4~b&ovFeMp{Ia~R*xw4 z9Kf{Zoj6KR@poNYox2^s?L+O2?Bnfu_UDej&era4{2H;RT+U-tf!0Mwvk$n&nmyXL zx^MbJhFZpX_^M!BYdD~vsuMNC)Z5q#^iA@n>LHX6ywHX}?`rC_*fVV&>lmwO$+8%& zTdjj_v+O?{^Id)T!Qv|Uj;ECHqr+L5JEI|Vq52H{K*Ku2C@2gk>o4l=X=63p)KgKJ zXVd$swq&X5fTyKmmrjb~gzCJ(ZE#h0Zh$&Lu~$PcbFK53D+kQVH)2D1EA$XKs$wFa zOr>7ayO{{KJ6K5T=<2BN)WQJ!hvI~sZ>e394*sb3rRzuWed7-)ANPN$^P_9RqvSzp zLD`0aUL`umXmKz}YpeO(3273stg4~z`Nq~3587n6>(jnMyPmB>o1bb}t+ust;|lFV zdi$Kz4x-LWyPP#FlZvY6&CBvh_x(FDIWlQV!th@;e{l&+QjI?=(!ON>DV%K8@@qY_ znCn{36ywABe+h5|?hmrUQsxM{8q_)HaNxOsKK_S%W4viodwp-sAa)#eS=CHwAe|MC z;z_TJRN1qFMVv4Dc#f+`B%9u&azUra#{6QjN>Vn;6(vCs`3C%6x1W0>`a<2En;qBf z3ARw%e(PN8YwKZ~!9lqe@ExRnp2_4QriuEx_OiZ)v6|_s>7i+Y>4`DP@I=2(S5q6O zZp&R`6skGdUo}w~B~21y+>f2j97cN^Tc*`zonsqlU*`~@4mE8Em)I1U~&eV6nc1Cg?3VS`Ucki_udC~J(0 zuCcVfqiNmNQSEnioYv`h$NKFXwT^GvsQ%UJODjrcrukLUccBS+q_a!ur-CQhUg@!a zo+Z|bZ}eUMa_jT9&zHZH{hk*8>-X!ldAXa+&m6C$epGwSbmM2AJ^>YiYlYq@bEa&~ za$U-q%FQYpQ>H@bnBb;?SNxuO#~68SKkgJ2rb>~#g?LwI=K{wVhszP@I_B;tFksbP zS7x9yvIfeU7Rm(quw)gNflO5fYFM}M1pJ?E{0{dBmzVRM{kF|)J!j3ezPEL9jBw@i zDH5aVL@i|JXd?AvjrF}&c=z_X>T|@Wsn165GhVw){frL%DBVfTF>VBtO2T0(w-?5` zZrVp-g5Iv=i1~qeYRSve{nj7$zAlBog4G;PRHU1-I`tmSFYPzoDt(dO-{8<6*7Lfu zuvT4Am*qw=Yp87m{G+l(94(aRYoTlS4|=Ae>!y1ze;5tD7pPZBqP}X7XCj`pi;`O$FZzhQ5G>9UdGWZ^2b0cQn1!a{Zl0nV z45s2lQYJT3MtU(F3#G*Ys3CVl4Vextgs-YMDA;q5PqG`_ghiOFZ@}-NK;IY(&EH*Q zBb=6=ijiWnU>7E#V-|_oX&=n-dk|Gn9Y4fV)}N^Y)xlWY21)K46GvsL!sS@^d)rC# zg8Xe+Wzt&w2}wHlOZ=()c=e;%&t>r&6BhmM`d6EIIuEUN=N#FWIj^_-ehwkauZXHt zRj5%?o2=KY{`UIn`lsp+sNJeYuPV1I&JMp7vfr<@F_~LM3=tPQ=u%bT?wl7H7gM{Y zyhvt~qm#@0Nl59HHX_rKlU`sb8E(7eDi9e}F?F2N>1rEQ-t&E9{QUzf1>FvM8q^}F zU0}L@pr4P=N7GD$pk1#HV?R=-p_Ry!mq-JVqg_ex5n2fsgj(oy3<5*DE+|nOLFt_) zx0iL8m#>!^N-3BDbI?SU7vAs-`2PF=ejQ(kC%3cMUYaJqRXVE7#6{?GT5vA)BJF!! zoPLVomf?t@sbQ1;ly0lGyN2hMumyB&3f*gvi>rtP@5Cf-g3ZSoZaG@It<+ii&cfM_ z+y8Z5a~s7qa)9a>8Nw{&j%zmRsu|`ON0>6ep}lR=nN-G8dPY}6(~zsdl&7i?9Xz{a zQo1NC=hwNPx+=NuI2SpGIcKAHPNC|n=+1IK;V%f+#fMV7oU0(037YuMpbTY_spNU+ zqkq8B{R6s5Z@9K!!oyYot?3F?fodsqN`EntT|&2lCT<2B3#HP2On}cZB-0O*I0MqF zGr(M14o&(RrM;XjF2F42HU9kHj&2UZp}~)4$46(d`zaqUwpS=3p4!5GRu9pBM+$in zHhBX(kT5>_Sk|}C6V?b_a-@)P?+bMDu(7>1wJkO zYX;s7`Vl-WWOqoVkf`9pflJYgluhya)0&O!J*pYe%5zV?33lT4mw*Sp!c^m*HYK=x%72ub&JZ{)uwUOa^2zA zNgF(O$PC7)@zoa?mwG?)J>X9T+5(3L)ef2y7!lCQFU#9tD$p%Z+v!0>o_tU^;kIi`%=@5i4Q?yCrl-r)C zs!d>;S3};(6ZrmL!jbn3erg|27E~Q?z+`v>_3VB0!4F}+ei>etCg_2$Q%yq`bQg7j z-jB2S3)H$_p^tsUSV2_l4G)4I$peisqnQaMtlHz0kAovSfqc0 zw)6HX=&uQUm^2*sfppTB2?wG1n6^~+LSN4CTVJBJ&dR*Z+2g{T{eHruaT`y z-<BlwB4C=a?ci)Dg9x8#XFULbdqM0DbFuDgbC{w@hfV5<+fFI z)sm`ys*(>ERhNj@VL73n1DE**n09G(>{`N4e&@bzcbD!fjw_gx_a*0h_P^QYY$fMx z-q(WZ#RE$h+wMBee1NP`y(Swnqqv%yTR6er=tmji40(o3!zDvs!xw!OXglXX^`H3apbBfp~;Qkac*(8EGP?9 zDrmg(>9!z$Zcs_*aUPZh)D47C*iKIhT^_$bCT9+Kfb=?fCadxjwqCq9jNher5qu8T+cvlp8;=D*HLPRmV6 zNZ$Y3nsg`WZc<88^zU=OS0|VLDWBRYV?&O)aEVpo`;p~zW&P611Xdhd?cX|W8*XUQ zvDuMk*PA|SEH=1U*HbgFno{XTL{L~r$PT}y#xLA;ReL_ca<8C4)``CjfBPhKi+}TT zYP>dKOj6H3dsEA2Cgxl!IAgwJH9K31mp#GsLiIKMPA`8yBCu0%e8`T_HKEr+Y6b@d zp7hK1u4tO67c}pDMWU?aR=lLzI7OJ_ej%=I1bzkY^l9T2-<|y+Vb8tyO=`c&N^^HBl*^W;aA1hCY zB05;zTG!HO_3G{$;lC)LUf|F`SAZ_yp&#oT=$&mmp|7RA%hhD|kXqFo*&`fr&vCA{ z=UPu$;!69Lb}qeCI?b})>b9M5tat6^uZ!t2QqD;WbrEj3aq8ik0PSXNoc5`9nO3ds zt(mJH#+74V(S4|FVwI}7CtB$!pOjj{Z(x$DftGs~j)OoD_6Fg6UW{JQSxv|nK1D)f7HDk_tkR_EAFdq+c%rpHr8IpG1V!% zO8E-X8pVRTaya9|bx^0M6V>7H3YE}EYw`rjK?1Zc_TiTE=1N7+^S9=1&VHTQKcj2< ztF-L2OX*!Q_h&!LTT}F>^o-+}00%#PS2NIf)#pM$w~+N^Cx`#4kQCW3s!gTcl^Rs4 z5j8Q=Sw6K~-B2cQh0j&PYxQ5MtmlGo#Hq3QmR>6^D11@iS71T1$IXJ(h5L#!i|3TI zwG6dAcZ_kj7Mm+AiK=um+fY+WcUgbW(A&7&IM!%041;3$m~Ojvu*RT10At$x4~peH?{U^?v-q+ zWU6JP4cBzdw71kj+zjL|6chfc8cIv4w=ld z@l5%uX9-b*`azFoKXL(@>RO%dqK?-Ix|2FZ%Roavj{D9ur%#a4NTWKYoR)vVv2|LE z1~s>rkk4=6Tk$^VeRkyUV1D0R>@1CtS14;dvp`=y19qhXZrwGIrToAJTLZ^-Re10j z@Dt2%>c7F%@hDvW=fNh9n47DiyA;Rw6{)lENoGZhORU^n!u!&O_5 z*wa#31zm+54vb&uG`)ovp+I~lZ3nA&rV^#Jl98psUvh4=H7G48O31IAYtQPESt(<2 zdiC^*={?f-rF+u1Wem++n-!fiA#Y$IS2EeQz^%yfRGenBN%qSMu2Jqr`F|siM1@6r zRo+?odgaBH-O;|$zoLRGrd7~}A1kvj$ji^ql&V=pck}cSemD{=8_dat-}8s$4a$9* zGd*Wi&W0RE>CPyvhX?i?*0!EN|??+=0?lPa|poCZ%O`XZ80DLyd=wSB)!-J&nBK zq@j}Gi2jextxeJFQCH&5LgRXs97?oO4TcJ|w^APGKpW8LK7f%v9ozr~xh-SSd*6!b zcnkDRM+X! zQ)PpyD@o9&!McB;uCHCIyP>~om}zty8=C5wvW)$ViwqO>!Md{=y?Pvboz_q@2&-p@ z(i>-KMKMC?z)y5va*?jJ&Zf?K&V^2ctJoEcBn3j+Ek}6{tBQy~C_=tN%bUlvV>ht( zp?-YEZf9FUZ5@W>q3P5Fax5`WH30sygK`Npyb^fg|53$Hh@YTX?*JNb4z!i0Wj|1Y zec`-s0hie#BtdQ<)5u^dl2SlJZAZQabM`#cTDMV6nZPT%0M6tvrKwU@QR6F283>nI zIB16TL5^$<&Y2kwqH@Ud%fq^y4^Hn_IDmhF#xqAbD#wA^-(0*R3>KQh75WG(D^Z*y zvGQE7DzoHNXfy^xD?3q&7n_Ougi>_-*Sp`i6wI%BIVRaR+OAl$Eln-YOV{E)B9vaW ze6iNI+ZeiGSUIssSJTBmJxUd3-i` z=b4N~lRjH>l^e`>QLj|{ly%ZUA)LQ8K1muxkj#S^L~#4ExBy>%62tQnM3;&=BQ#}aFwlDtm(e)EmufIsrE~a_$cQ{o3pgg+_qR< zRI~79L2Q9v;g3RV(L{5@()QNSeU+L&kNa@-`9TF<7As*b?k7fQWo|;)Bx>_+sLu&Tv4?_s@Pn{!VXZc)ojuZ z(Al7CKB0dFuiX{>3Vo>loX)0=(1vOR?jk#ou~PfUPJ{`0G;TQzy8HKd_9S@hZwt?b zLZObh9ux5~(jTceXp)`qzW0NxdkvCj;)nsDS~o<#*E(u0*xqKm*OkaOP_0*o4W>65%9Cx`ckoOvKEl zKlZM-TsD`4y=*Pl2=4j@>`HXS}}?A3ahhdm1aQGRZP(-rzx*iwE#_|5s{slKVEGbS8|R3-8R(VI6r zjgDEiD%M))!3`^2S!yeNV0mU0ZKEBD&Qb1coJ+r?y2^UbbCsQ7;St_49YWJk>pr7&5z61u`Y_`V5KK|A&RmRgr0oWBjnM}rfSn4>88v) zW;s-*;mmiW(0C!kr#BQ0tFaTzCw}1x>FSvP?(;)Q6#I$aknGS16Uv6z_hW_f$hC|B zL8qgfB#*(9HyECqAh_30LD8kb8tZ_S)gCp08LX=Ms;8g>9#RNpq3lF*VHc?a$PP`V z$!7VeG7Q>RmM9<+$d}Yr`T#SV?SvH4b6{lb*2HUaG#@kzk&)R>J%t;~wuLta zymn$XQW7U9tL1l6Ff#Bo;vp~(%=|5W2mC6R_#(b9{Cexfu2Ok;>vELWp7U^8w<3$l z9h48fh<=E@_AC5Dedv5p@KbRzy+>V~29;zTu$f{(>l+U~WHm4iL%=HN2sPwqXxOf) z8Y0_zG-)9xAdAI=@1%f>K8NCvZ5IFsQUq}c`s_>C1!pQxu|M>d&ZCF@T-XK|-BrOX zw16)sQ;d}6Nw1|=;JUw1{&*rm@JOa)`V#X4PCplA2GgaQ^upcVk!rbajxX$)ADmk? zdwk}%^ge0o)WVd;DV9G2QfB`hl~yV9T8^dQddXLNh|u3NgRZMNW4Pem+ka2c&d^5X z&W1mzuszaU(H8YjrKXjpMHNQIRZxXLDiau7$G^FE7sEP@letD-_gJL4LTz_BctLJj zr&^Yl@+CzjeM{?FW?MD(c*i5xS$>{aUfzXQnhlr2I3R)KQ%C1i=R4<2S4VeWevR-! zjF#6Z*`5Y)F5jZ!=_FKYD>#4kLiH8(A$4!{YmVa7ID^ko!$<@19mMS$aw@cp&&5ed zjcWu))e^8pDj>n2B6tkT&?Pj1Ykd>^fF|%YtfsZhH0D0@2WRF>W(`OJv2+vUdsIU9 zaU^*SPB2u^U}Bwt7WXmE_Fw24MaWhpeqxFu1t2?Y57c@Ulu<|l_zK_De>~{@nBLjo z1gwZP;svV2MUc%j=nqUls)2%<*eYwFc0U09&_YltH)9unN{k={@-P(UFOY+K8w8b} z*w-erP1#&b>F*=sizkag+P;sptSNF^bWUYH)twA|Q+sE&BORKZ4z5e?)xv)16KdvT zt$yjYE?o#_03$5gA2>!Q87HKpVRs9Ur1JLdXi=Vs)jHAwaPdmx4QJ0SIZ`roX~ zybZ;Ntyb3n`2zWkyQLrEeZl{3@T9Vz!aqg~iW(FBwer3y$Eu`P9vxjas%FHwu-MSK zfg!%Pjcc^)*(`F4XM^;e@8i-r99D13+>&T>_hPZAb#XQG&62m44tCa+z;8j1m?8F& zfNC8F>YbYeQA`%#Bs&`VR0iIPH0RV5+q@)2}Ai}`%_TX!I|L63w~F;bqaob4e2nu2Ld9^Vx{ zoeu6S*Gbnl*KJhFAKh`hB#f6V@@kJ4R>EECA-xuw*%-LD6WC<-1ABrU!j>|Fnceh3 ztonLHI_`13+>3UTu85grz6nw6|TgUm6 zVDr~PMdL)BvkS~MH#mcS&?VXAe)4_z#g2$g#0=qqa0;5aBqVbEgPgiX(lekinrzp$Vb?gf0td6ucwwqW@~&M&3V-6ZM4l5;u$KPfaH-L2aKcWr`8v zRbiH}2!C@w@gyj3X6XpJw;tspI@%BMOick{eJ^x&Rd7}|Q=LY=+EY1)#Pmt1t*3~- zVv6upunO(K3D_b13ms#sCju+s29-^lk*jzCI=64?>YCA-8Aus(VYhk7nb~5bO+7-T zww9QuTI)Fi$BM5!240mGI5n4p#M4t)h^*80;9DG!Mq!fajVkR0^6>^DiRlKk{+H<@ zI*jpU%=A$@8Y#df$U&F}w#Ga3Xlg1`q4#YCdcgstN$(K9z$bYHdVoB6htdf zxG`-6d#69O7ug$UkqnXP1kn^GA?vJ#p*_fkl5D%kIvIcYP3F3aSj3i2}m5-iHNKgJmyFk=h z&3(2tBothxz@4RzS)*$eQIrH+hE`3?9cC$qEwG5 zU#?WsQ2*3$)>veGZtQ40i&=bI{bt=$?HkPowUc$zmr0{)q!?a@@sPuB76e~eO;drtG zk}t}VHc*d7z(4&DNFm)ZE!hN)%3@5?>Oq;h3cVf=ag`iEW#fjL4zA7>#tAM-6waVA z%u>1&b(a7O8#7lo-`4%tnd;~XCrw|+JI4}dCs$=R!>9Atg?X4x7Qm<48D#ynxJfPn zgEA00wJ9LbT!h+IP4*^lz>j zpvoZc;=5c$4w4=VQJ@HHb=4hBOIS5VF zXzCb!m01m*%0R9am%~1I=k6s->5pEqTzt?ulFdCD4}hvG}$ zSJ9gal>=~xAEi1-yhTm?ik{AVVt(VKETo;(XL2r~M`~bSxrWpRr*{oOjfAa9LIPe# zxMY<+%kPyho&pttyPz-j(-<%_uAs{?ogN5>#Z%0tI%0~m6*HVzD6nUWqs4Aw8+0Fg zfoxKM-c?=n5uPH&H4)U?Na(puxVPNE9{r0%E-boahoM(52 zuaMp$AA&~)2L&ev{Tq}T_%^`H|A9}E>4?6&rY?JyN+KvC3<{hl)GOvQcSMs3zR&{Q zEA4eC4Ffm^LD$TVFHilIs%LN+W3&|HZk(USM@uVlCCIWw4)oany8;0b?jw zxCh@EFJ@s^x$D_ST%|rSZ@8(Nz1p%mjjo3_K(ms2%&6%FWOHILdUD%w+nI|lM+7pI zYJ#LDNr!PyzA5!ZU+FZ6gICB(^b}?){Lw4nB-+6Z<$SqEVEdIKDg6UJDK+(%IE}lb zAm71FAXX?N#PJV7SelFzISZVM7a(GQ4hw}41^R$Ow#RPN6~F5!Ci?y1o4X9nf(Hb^ zx6oA2#;h$EI{76~|CB*a>_13s@Zk43ksNf2Sb-de#l(L6H;qKvDY&_=CdWaM{|8>P z0OBNQ%NIaM+X_`(TY10q7pK%|p#km`4iF74g67glYALtJ-L*S1#uJgUc^uQY-DE4! z4Qmrip-<0I{FOHHYUzvE3c9&%!b)VhRT0y06Bp%9$jeSAWbzL+1E+QjO@o>+nVdi@ zQf>FVR>~p6+)F+x)s;TO=V=gM3#Tz*NrOr!QQRbTla26E4+j}H3XJ4IV0=Y^YW!cK zks8m)bDZck!6$Q3kLe!Z57cCO;0#JY>ghJ|u=|EXWjj@R-`t|OVbO-d=t4(9VS%Th zUE#yR9Yybox0j??Zre5PQ{rq-6m^chtZAh8HjXlBz1n+~^}1t5Fug zbzQaNHIvi}P^+ad6PS9;5au-#!}j4isw-&HH2t(O+8)}k8jU7MO>-qo5gZRSk*N6< zbAr{#mozIPX6bsVj<`XnfZDK+kR?156>#u=$aR#% ziUDrQWDw-L!n@D_&X?Qps#Wk19;*_9r{$HW9SF)TiF0sp&>+pdLG4urebixi&0jHd z*@!ObYP-gS4n513RRai^)xCed%n8mcyO8)2QRnd1nYSuxh1)*ZI__CXL> z$2jjeKRNS3)%oiB3Eg7@X_Rta^@DsyH^M~XJZLrDxqEB~96UAAw~hvlERm@X%I6_= z2^#;PUN6 z!b>Amn!E8yoI}dX9%2pN)phvPSAeb&0%bgNV}AldL4D{v-^0tAjEeS(rw`n-u|y|S*+)>hJOjJWM^(); z5uVSvP?8LRX78%}8y$eR$Ubc@XQ0=8nzDb41PHZ7B zLf@HF#w&43Rdfne_*7qjaoQKJ{R%$0cqGsLL_*Yc@@^ERl=n@VJi?IXg#6x0VNe}kOC?!d$g&c}m_<}wd zPWvcua;%t(9tG(WDh~9U-AI<2fC|0?(gRu|8B`M zH_z|n5vmG34-DbqbO`+x6pgN6J2pX9;cDtWyws)W=R5~jqc#%eV#p{m6DP+i{P_cL zr)dY(R}<`K4Uz2B6)ekjm}SO;1`|%UMxxn5avk!qUXz8S4*Z&Wn3Ph~eWXdI;&KWY4%0SN+jyu_Kd_GITQJxIPcRhSUndlFUL??AW zJfU~c!>)*Q+dPJ~J3<^=P7#s;8$9l8bLh zwIm0siMG-s^xyTkCCo++#SXZ`D--olb)N;LVyI_>auF1qX!xF|;-2*k+ElyrP~M37 zgcnkddSUepfa|HbrLt{KS+7;M?a+!R&ROm!KxrR>%VNxby(x$@PEH!Z5r_OZ^d--98R15 z_;afxb?YUx7zNmm-r=-4j3;y|w5KxO1Cwf;=O#|Y5pp5YcfU#va7+J+&Z!$c`_JT{ z|7XcN;3up{lvM?K>L}acBI|%DR%>K!CqWZb3F~q5tA~C+=}e1lVEPEK<@em9={LLJdU8V-vGPTE-;Li5^XVKT?D%SL98V&oKb2| zB%bn#ND-QbcT$T~*Lfg&Yq27;F+qEYdq{UV6V;YliUZ>>7_Z$d_d~~b2D)mOX>aBy zxSbEk^2AWjEhsd5h@XU)pw}gevC;*3yE4>cz-e8DxJoo2<3PmtL{$JWNl*VvT_V?k zt(u@5koQU@m=cwUYoy7TKre!pTLM9~DUpE+=nQha7AsYe#@-rwa009S32GrTx)mGI zh1bGMsX|iJNu0eGRn^dkNFc04DTrXlkfc`wc?Pkl4JzT39p!Q1nQMlbo)7X2uPAje ziSB~LG&7WpU$B?gfza{T;oI zM|em7OQxOxhC(#5B&va?or{V^fm`Dt=JuIV5d$F^~QBr@>b@=ybHQu%rQLMa|DrHWqC zd1*DW#e0AN+!b}wf78oCbf8-zdvqf)2wBz}QI$=F8-+)=uYu~6XB<|#4pq!9@M+$V zc}SCNN^Zk09SG8J7p$bU$Z;5?dZO~E)IESC-Bn$>wJ%> zhF5JkW|2$K!)D>Gw1B8N3`~nLm>CpMGpMh)7e*4bpzzwEFxamy;U-*PIj=P{G^=vG)bhRJBZrlWK^p(4X(jf9C%P9io z0%!1E_W;pgA@-)9s!SxLtw5T_V9yrx1ta8Z(jwfaWa$!~g7)a&tw83+A*`$w@Bt>^ z=PyWWLD=kpin9@3(;yJQIqHC$2qxxKjr1zs>AK%WUg~5+<`^7UH)M@%rf@Yax&IT zGPEKv5F-b3j?1uq zda%+P3UtF_6L789pz1c^jd>7-e7d%l%16@<>+6i;<_pea;pY?mH49r(j>r{AcFhnw zqH`I_RFvH0S?8ywj$+c-1C&oWjTWR7)`2m4sy))neolet6lFc&Vf07Cx)mXj9XDukr5G2wy+Z&BZglKEJNc)Uo zUmjzEU1{pL6(m6Z#*}u6dGZ}l@AMY$TDi^L`VMN{f3+)mBQroaC+3n<QSF1u(H0;nP&W&A9N3YPIcy^&g0}-NPf%&*7g)C&>m?Kpt9PKQD=3`e?g?T(VoT2Tc65fr(FUbZFRkbNzssqp z2*>HridgaHCf;eJnF1ST8BO3mNCmZKa(Wk|=DkSzW+!V99)XLbH^0;#bHXhK&kM(M z{}e}H1OC-WsXoc=rPwP++0BZ$h4bj4{hmUFTu%)P!BD2L6yDRhH+- z&r!&XQVuaeV1<%}$qCh^WHJM*@b0^j=va&tm%oipU{jy?{8RY;JF}*LK9M^@Q}jDo zrR>sSs)fnc7Z9>3-jbdU?wsxs?$(}#-fvo6ql;O99QJ>>pPVRxCY#g94b8_1U+vd4 z@222_zcG#PJ3AqQF4oSDAI6mS1k*&Y#+8)HZT+M!d)C*pr#H>p4HKv(_Y%X$pgyDpUi9@dQny&)Lc9d`oKF zUNSs04aIB$&pMo}qbYp0U7S7pt&dESC~Qojrimi+dAMH82%%Fi!wHd+fW z7#=$Pm2ihsyr0S1P15>Nf92$>zFkN=r7FdVxT-s2~?w$czJ|$j8p0`SbaSF+gB8_Wu&$87?3hmxg^=d>{bWE z(i(Cm1?YbnF6*AqLK-6np?kYUT7P?1dpHUDC#lg-aDoI1jjf8NNo{)BTN>o|nYSp} z4Go0#QnYg2mcwz%vD$IaUfh;lc_t3EY8rjDAa8F^TTh}#)~4wNIq_SGQn_SxzSNwdlu&%Abz=)RpfzA`U9#gM zy)W$}Q+YZ*^slFQ=FPTYJSaVZ~$=e)tpqRU1f ztG-wS9^kWD-}YHO2i7f$e%3VHS!-b!@0tq)Qd&^qTtt--FQoHEV(_BA)$m7|`-R$4 zQ`m?P(gxJloy>3&9&YG&_%~~dlH5}Hrkr4RRFpc9uzZL6J>L6(+~M2Wa(yW1+GleT zmGEv(G!vh}Kq}9n%0E=EpJY*fB=!()nt6?dS}|`n&scXClKgLYDrvrkOhU$CXsZt)$Mif_jWVZ2^Zx?wj1^UMg|dh;4KA*cLSeQ&?(SmdZ?_gDXt z_E^P@a#|E~5VCj%!|i|dzSZK{HRG*xVGKDF4tSIks--NGmy1=c_xdaEV9y(OQBO;+ zj~-yUt&w6Ssfbihyo3|np)dD7^Vq%Rv|2{2^-Nl!-n2(J+c}3jmf6yHdlBYNEzMKO zGtRTsJ4)Ygeive-&gATuBb#;#=gKT0D|cvaRMKxyDi<<~;JF$o_M-}1ByR=LIRUo+ zj;=S^tVHVSeB4^sKt6_>&&-0Ht6%6Uh(ey~Je&|Lft3Kl>OyOc_$hV+D_fjFrxl~iHj z83@%deHZ$s4)n=W^ji;y}D&Z<*dC!z;%d1gxCR1fp z76*WATwsFzZ6R7L#CbbYt!|r$qPK@yMA_2dE6*B9w6jc(>(PN=Qi*9L!Q zB-!7|C^k1)xx|Z7akS2zsc6T_|A_spy2cEAa`7Z~mLs>W7z*_?G(FX*3ijQ1FbXaFt{TXh5 zx7{7%UhRFV_hh=-Q#r4?S*@%FD$S+ZLLsxc9>b)dr=I*?&07F(zr&g=M2VqfSA9@= zscTS429qB0r(9LaU>?g(^FBVpxAa&E^f60~OzzJkRJ`+1bRPk&@dY&umz&F_dXEm=r$ILGr7E`6? za#f{(vJ!5tgZR{{Zk|Au+spff$pCk}W%Wq2GP4@Ol)_|W|4%t9)fc8454;!L3(->@ zazFE~F%}5F$tCc!6|$97m&r%OIB>`B)OWqFvGkMeZxuW(LX_X9AXcWzaM}L zorC`g7MFo{>;NAh2hTQNn21hrJUHL)VrhArqo~N6( z%J^!rbL4Mw2FmY!sLLc&N#&U{+?LvSIX^21SGmQP(q)b29J-4pVhdteCzM#VH72u%o0q$ItS9Y;g{y&CywxzyzSW_U?pUYCn8D%#P{rmM)X!c zC#Tv_(z;;ndm791@8qDY*FyBCdYs{;hR=ZtsgzVxf+dGFN`}|#$=|63CfXeqWE^Nh zD;SxZynUB-49CR`aO$c|AHF5*5r>iPo*#u&FKIO#(`|U}r{-6%m?u_WR?$gRVZCtk z6rui2N0ZRo$YE6xyUN9wq%hpJN&O(t6hD|l^cmcOO*}5|2(6AGS))mjp9PZKN$3OL z>|}aYH5?Disjya%dKpUE#UOJJYWW(*1LK)lR@foBr5_~B*HQM#7o{`sIlobZRp1<0 zDURdG-=X42X8xCtJVd(9S$Bpt=?1%O3zB=o+`ycIlco=yR9-Nso^X4m;bN+Q3?KT{ zgRJI#e_(b+PTox$yd#%D3T_+0=1}f~s@wppIV&4*hpwSltUyoK8=hi2X?4Zub@uBA zNTN#ftiXrZi&VU9#tm~c8vajGf0&j0@+|2Z==0y)9xveLnCXD(dku5$RTPP>=^na> zm&fIVE^<2&yE8{nE-zJ z6n4G_YcUHod;xCvUAS6)6N^!~Z$dvX2qf=?bcppcU0gwLIn~?>`gL4C^$W`##<_ak zDh`U*12uRO-0d(@O#3h+I2Igr14=e8h{SpBqF}1tF(7**Q6NkBuXm#6=nGc_-$??cYEVlWK%Ks`O;C0Mgl?9@)Iv@%RvnnhJpi@PzLcblxI>w$Qr z?->I@;w7+>5iqMx<}3^l{{yXmW=0tnKDb!YPU5xBx~0D&K{wjU6ihKn`iEY#1geT9 z@>{UEL?POGgN~yNxJG-uw%(1mRTeMsHgkbBiSJ>s)PQq%nDVc(OX&x$)eJRe6b#NZ z{$3As9K&G*4$<9|H}V*zjea1EwO|yx!MZd7W&T$<2A;cKSVFJ45H@KC2*M_6q;gCX z>0y24Z~K_1z(@wc?yf`)ke3rBlkUr4?xD&4+sg!rBWO`%aRwadAW|Stu($S`ADKxv zj~S`iSfO=5Nj%h)6L=5d^lk~Tf|i+sYJDh3a}(J$ zWYiv@i_$FVUgcsM@{=X>{4rZf+t{X-NDHQ^PPXCE~*9# z6-f1YkecL;Fb0gJEHz26bdWVQ4efIa>h4YEBI@otAVoD{sb-8F{e1~>%7P#bQ-sTKe$#DM7IB_HM z{szfIV3+qW_oE}cP(iXsW^rfF27mnqYtft&>L)(>7l@J!?%9Wq?y&Oe#Hrue+yaKFChorS?- zH3n^~2^#txG;A!Ld@Z<{ztQX(=P|!RNK%kv=;ku z4yM7PM)6+ua9U_^{S`PdYQecJqL&#YE)<9GW?xX1gEHrllZAs6gT%WaQFZC1nWQ!yYO#@FkkZ-J=1>fp-pHvF7aJP@N|~L9?N`} zmKmDza@qlE?B zb_@9PgIJ3lf8|{7gKOVt#BGGwc@Lg)i}`8Qo_Gg9x0g87`sclm^8 zc;C#aa4eNZ`Tgms)%(ty+V zICEz6hgCjYBgZ) zUZ6N1OhuiC+K+i}e1%A=(2m@~`#6_W7~ej;(VKi9VXW2CynToGmhY<{9cCtf;sU($ zXDX}S!Zjf$=iCb>T{VNFtwnaiD)!@ezCu0FuDvduxz+jP){`o!f-pJtka*(LKm|8O5%s3eyxMFlmVu`3>~qBUuhF_;JlT16DqP zbFC!jnn}lO7a*jKMODrojL`lS(QAKGyXNAo#9Qb(2+_t5)|vrpbgjdG|K!R~aI*c$N-9Q8T8wwz zmv`_CpJS(AZ}K8w@LocaQi@zro z;E0g~BNS!+$$6EFPO~NVQ!-U%J?fNM+!UYT5T_Z#NqpamHY2C`C*IBd+!}q^rDKg3 zdNchAIntxhv&U)OQ7AS;e-LemBn;>z@D(B5Lgs9q#ySa;cEZy}fL=|d25!uL%|}nP z*4kn{2Y1*FPk2N8UHT$*mv6~=l+Ma@Wfm-0btO@ri)L>*HNzTe<|o|k?b$UEoahp@ zo&{?yqbulqZgV`u*5>8LKY8rSva zT84W?x|-bU$Ad3NqJ}-+^x(f+m99;_eEE|9l~&gq-`Vvj;8obizhVz1AN4d8TRKkr z&j~${rD#r1p3njl3T0yyoo~@@MZOj~Umz{-;aoYgca1z7+9qhIe?H$$uGh{_&grgg zKDuu!{~iI!0Z#%F{mc0sbxpS4kPld6wKADSQ@bU~aRp-UMn`;gf1dgI=;zsAGQXNJ zbH2}xk4c)J*4y1dZzt4LvN;a=_ywc{^$aZ)-Y8;qMAnEGVP8WA25s~|>XYOcXIrF{ zm#3mAx-LzHU+M_ff6bQ7UfQmb2=BDj_?4yoLF^!GFt_Lny-nS&jCZMzlf#nsBEW%q$JyVIGQ+jI~O^_oE@1fJ=r!-U9TLLFQb#( z&up_|=2LwZ(=hrnxpIa3nR~GZeYzfD<`7CsRg?(keT6ywTsvG(UAsy3>fmhT$Zo$! z7E%p4JIb}+gb6T#Tg-9vtM~AJJOoAhjh(*`#BCTI^LW&u)1@QSW~;%;sv7>fX`_+3P*ZT%a1}8LNe;NvD;uwqlN>P8IjWeBVvJt#Im$Wv2KkdlQ>Y zjm6#D7Ivk&_%F9$FKatpOF?4=DmW+VyJ32=K7oE<2ddENd=`yWgidL{%?SN}d=S`mx!|XAfH69Cmrj`4;EKoe#f!`G)I3`xl`f z&VEZs>h1Qo-YfpD!~V9A{1N%HrR1EHcX5IALPLstD3ZHK^+FBv56`V;ZxwMic#VG( zAJdU&4{~&MF7xT-KQO3jX!r0b5w#-bhE)$zTArL6Ync#Zk2(pK(PWg?n#;mL#_k?Hu znYJc5F=23AyYK&gyA!iHrv0~1vE|~*B<@VID)+iu~WV!vYXE=sA2RVK40P8BkoYA+0AX(;z<0QgcjDtB-#`e?6ogb9lyVUjZG+Z#wZ#n;wabE5GNX{!6R z6Ple#fz^yO=2{n}@7RMjr!}X}2u}8Gbgw;(ImR=iu6dPdQ9HQJlDW5rqL%Duej+z` z46{KxfZr__Y$Se=Y=~pEggqU%X=(MD+)MHZm*}~xQ0=E0MX46nuxcmp$>*UrDXdS^ z!f^I@yd8hdxZP!pHFI&VZK9I;#GO*d=%7#G_a~x3f9qYRZP7o#TrCo=;?$YPJcNp5 zyBhKlR5~H_>xXet%wtk#Bht_}L2_ZMd&nqnGkVAu8-DX z0p0!>c{u4<$E~X7Eq%3i$Xk}lyHoKe)q;~-VIF{ettlQ8GsWD}Z}2g*s2D1uLh?}> zE4@K=Ps)s)rq0-B{lmnEtj1STcvgez&azI!T|4Dic^W?IEv%^l@@T1>*g|MvjWu5x zGwJHLa6>GhPTR@U&!4)p38)eZQVqT!Pb8dfF$-$Il_=+5$%T{%SlB4(6gbucrsWt~ z3MoewymP!QL6QG6vRS>zr))1pNtX19&*;w`m>*UD9+0D-KW0#0yr-s^j#lUyZ15g! znsy%aqcu88uQf`1N5Xj!sT+yvQ_}L5DYKZ&lL?O67%fU3{cp`jGjONg!bQ^CXljO2 zt(N+wp(sFAI*nc}h>Ec+wc{*xp8V#300hpio}@4*M5nkB61!YL*du9W79d97Aj z!Hk5&qOpH{>h<=}i;qtmJq>vt{Mz-QZ_L_6)g3Ohw@>oxADkonOysz%3$m5TJ~jJ> z?31#GXa7B0-mC*6bB8w$kpl<$o_7>i-C|p7gfSRoC!4X|JS*go$E#E9pBz1%4;*>y z?Uc1bIlV{bhLl1HBfsyD$rkg~x~Y2)BiO4=x!f`R#G`wDpvK2!U1-_0?%mscFn&{VINzrlT(#C7+d+ zh~cDt@6t8z3{OM%z|5N&|I28>RF!HOWtgiHnNc)jBuUw2+;2R7`W-V(Y|EU2?>@Wy zPXvm=1A^T_M+5Kq_wYUK)NMVKPzjY9vr?<$pVCm+C~(`;P~=q9{_<|{xZNw=%iYQD zGoBCL8v1pkjXE&Q$ z>T12vj=A$^bS0g%Dbq8Hrhmxz><-eJ8{@6vqMw|TYHqgNLY!-OGcP73#{|9G`efv- z-!B$DwfuaO>AGi;`B@Ztp4`*f%UW%k3OLa@Wjv zA%Ein5AxT}w>7t({eO`yLN58`b3Br=n614VGb?2TWfaV;>nWixwQ|W*Y~7u6eNOv+ z@%55GUe3NwUT#&=zGhrZQ4?SOXdgQ>W^#0)=;hHXW9r0?_)#pOQ*vzDQ@2~MBTiPA zI_vm#3A`L!CG-lD>6eJBJHy%8oe()qdng|sh8B?vZ~%Xm5jJbpn;RKwrDtvQWCs6n9Bq=G&f+@jIJHfC*#`-2K|Vj4r#!>bPL8b1O?D0PP_wjuLaO!og!a=xN6Xq+u$6H z={M8Jiz!OaY+4(HCZdgcy^_2XAH_j=AWZZh(q8a|4xHl@V>E4CjKfN=&FTG>5V!G4#Xk0Rv z;zUR$tK}oSWm~)l^`t=QCJ2f_|5zBTZ#tfUnw)c8z;Qvsmfn9LSW-4l^SM05H89aF(Ja0K`yL1mTkYrcB6=lXdiUobHiJ>ujT9@2 zSLgt@(Nk|VyWpz&9~{OQ>bmQ6REObOZsIcz5jW9G-KHPhLf2jwY`Y`gV|oxAZ$r@n zUlm)y{r#Lr{V!kXr*q?n`P96H0`V@|5(`|o3(xrsceo59QjsolCR*n(*nvcGfb@vo zrX#M%eDWFG0wctuWYV;>?otP|1Ou5x=lvV?iw8Dh4t?=8CJ0}pN7)8;Jp&wSELi6> z5QgO-*&Dz`R`KMP^S=&(t^DNhen+D)ot`}>--E^zYl;qPqb}>)aKfG;)#o~Tuo@sU z)6nPD0LdH=qB))Cw*xKKXM7$mP^!Qv!9PD5LSnUcr?oGUnsl3yELO6Is z4QUkX>^1A`3yk{+VW43C+AqZjj6#;Su!<``ldp&D{lDNL}NRrR~xH=c=P zqc!l>(Z=XUjhE&HG$f1RbHjuM;4&+zd`7V92jabp7iLhEuM%THIe!?>wUwS;nS;`Q zq-LZXNpYs?som0DxZdV_L%5ymfaW)5jb8#m8qMcR6fLO~F5?TfMDEbz&I+#KuKunP z%%AGwjBzYuW?3aiIY)a(f5&)7Ge^9=fIZT-PWdV&3qLqR%4pX;r`-kIg1e#n11hh7 z$=~0LTK}hFqbmxHdcqZUT>^-6ce%I{t!!0G*ml@H*(7_K?WS#xt+Fje-H$5a4{}oK zsnyA+ajKWm*I!4Ultr?UOTrvTlms)i$KKH-FzzB#K2>|FpEhQqf$YP3li=VMqK$r` zmB-t9*=r{)a-2RDo#TIG^=yU{(4~pEr;0P9{4n~CylQhYXWFZ<@=6eMq+QYxCcE9h zMb{SX;-C0wm!K0oYhDm;OM8`kwg`Jydy?&m8mhby>sqt)hn^0ZmD2a6UQJn(QX+L^ zTGNcl?hD>adRBVstwv{UUFOV`QE`{Q2EUJf`SwZQhfnW!dGPL0-RBW+ouB7_Z<6xN zqX~2DBmGVX_m7yLEqAWsc~|CdUa(}Le1(Dw3i*?BJ93PToDkB}f4oywTZ=QyD|&=J zRNrY#vo4A@C6H-RWgW5hEw+wIO>vSjz*9fHOR|vA`p5Fvv){gcOOJj0qkqD@6W`8F~3zN;e`WtPxRv6vj ze)CVkP9^-G(qG-6RwNPmyHr5TWqs36c$d0&W@M&qPTiJbOSzXEpFAL?RBF?-jpx!F+j=jkkJcC-Yhu~-JGs^ST3VD`hn(1THa-_Oaeorowyf67_%Bi$Qnf<+9WA!BG(MGNKUM~z+UyxI@Jg3bS zZluB12Q!aZ&M2zEa2=IyE29xC-Djq1 z%^>%8JXvk0^-nk^LSYs2;JF!rZt$cTYYi4#%Wc)Z_Nvb9uD^Z$=X2Io-`T{jsIMiv z_zf&P$%+vIV76XKJw=wbBC2fMa9;%%)|NeM!od{ElFZ~(d-A7*rSU=Wwd2DRx+I!O4^pnCoygch zjaEcIY-F)og8sIUobqPbkaMG4o(9jiK#UZ|pnI&L1$zf@UjFX&*Qc1X#g9ruM=zgb zzkdUU29^r^;(yflzH^Z6kyOKq)@0AW8Lsruv}dW6(n_aq$Qa-r=3S|uG%pGN@W#8V zbxEcDWZP)7*#guza&PGtTCh<@s&>Kq-ZKOLa&PZ;t&7pu+9O8GlI=Pu&nqVBZgQS< zbg}=dK9S#xnpM!8uV>X#8GGH=ExSFL<(X%^8y#ysJ%$;)BgKO9Uge{D$mVB{u{E%j zP|u^UttLz~GxSGVUQ*yDYtwbzxN030SIKor8SBIBogw!BY%A2_%1+c#i>;z&s{Tz= zwc1qS!JfVD{_a2Bi`~JVD38b6S^r|pxAKU~(6r5Be%T{5Wc}qD(kr1qX$A-NO}Lzf zaGD-PrQJwJHv%?)J$!d7YW07qlK-Usx&+SGg-OUZE2|l11dzwp%zMn!)6>m!!qdmw zokXeI#wY5k|5@G5Yrd$DW^mpB%e9Ex{b@ zSP_^zB0gJiuH(70=UJ4yajvB~CT6Ri5>TmdC~e{*z_KN~sSgHsB{@BCKlYu3+$Kb8L6{p-zd72`Xmyw99u zJeAJdKloG#SQ``&vLmE_$b#S^%!QofHJ4wc7Qb*3OYYjxvCZ=n|O*d)43P@a3xzV zxw4h+U74{bWo+WG_!Du1;s+$oOlgrZ#yiI>A>~yY*cUtUkj;GE(cBTm9QGOZW%eER z4ffXT|2=9eWe>Gid&`FunEb{u9sZ<&O5u*NPYiO_xv^{=z9A!+mp>wYykNLMywJc{Go0=Sb#DRvV}@ zl@qdshdNM76$`>}IGCdJK)y;oS8FLsh&GSuUA^VpJu~v9uS~m^wu^~Uv1ld#)vMDb z`O}|NgSWo~S9uRT>pNkuI39i6W_)8C?A|a*51V`g38WGSuGBx!mRS zFPOCXrljO zS5ezaF^du4S(|Q4?VfxfDK;rOd3@@C^#5g!@Z{0@=($K+@He`XOH|Dp!X&|>nHw^C zW=zY_GtOn+a%-M8+Hu_3Z1!lLbY>DK8xv59-z1N_CdnrbF+#|0Rc7LCA+%WKsgKCiF&m+;&PR_q zlJ095{nt{oUQA7aS$i)(R}QGnSs{Oum*rJ1%iW|@rnqlmw)GNYHj2wSaG=f6W_V%O z9q7WAacX^_XD*4iaVe)(aU(B&&MBl5Z7>Jm?JGq(!44GZRnY6)g!S5nR%{SF=D%>2 z+qnyZU>_F2qhG-ly^Pb)7hmOHoTYC_Z(qv4yA&qz9R1H1^DVvT3i@OZTH=P_Q=dp$ z$PbQO4!+rKg^6{z*`6`KrJsGSW36M(v$3&%h^^= zkJ784JI`)BWwOdCy^@i`9A=rqW+{i#Qq65!X1l-y9D{tH`1cH`>3`Fwmt%{PAlx@5Xf@!B zzIf;8*Ua{!pe(f|IaHrFzQg?Q2bh5=LEC~8gHHv&391qJ*l(Nbs%?~%V9fVyOdpog zIH^hEw8Ym*#Zq%*4DsyIr&#OQpRe(Ne6jKw$(}VCV^cpTMI_cwn3ZrX(Ubf#t(NE<80>dnLHWu-q!uaQw8bG$o?H(I-Hti(%mTzbg_q+Coc z4OI^**_0vjY3|Qns83s<7yTdp(KtA@t7Np*CYxpw40d7ZJ6XYp$nSZC!?B3a*&LwH z^+vmQXU1n-;$OEit9!P4^TUB1H0Ptfna&M(5%tD5^1ynd56ec?unsn0vQ$Dkj#hIa zmCGEw0J*`KPFN#_(WuvpDJRv^_GykW&J^c6XFlf>yI^}Nj~B~Wp+-;5-&@IZ!M)Xe z)g6u|wTd^VRz{y|NTiiHrG}_v+wpy@Ws3S0DO4`6q!|hF1(Z=dUvS#$oT%R=J``E9IKUMhH_0#^Z=fCGp zF6^#pT~f>WGzoYV^g4KMaM7TkfR(v3w1&c+6p=658L{+mGeOCy6j+XLJ z^|1Z3^QKQ;zhg{gF@4rM+uFKFhOxu5ExmtA<)pTWHxg$j_fGS1=hiC-(Q=gSz2mm? zpmVL`p>2hdOL}Nsq!TTr-6ElUskTgiXK+3W`J|rmV5PWvRQ;m9Q4g`oG>(cdJZ$MvnCRY1z^vGLB^4_0%P|wyxM&{-NAcb@gwY0H>snLK@oaL)vC< zs5g?Nrk$F~+8ZHMl%9f!7PcK=veyXPCH1s2U9KR-p}V+^dUFwZVzsD6_oEN~$IOGi zw+A@ZQc)slvjFJ}I>~g4VOTb4eY|6sKV9CF;3=cM)=!(eguzk_IQ(H%h7*5_YowQ2 zNsUwm^|`W83C2q>OzI+*{FT`hY4jtfvm zJMYT9KlY*BXHWFFAB&O_)2nL*g3Oo*(X^Za;SndGuf1WxTpp$Gk2KmVc=E9G{)xKBs&h_>A*; z=yE$lofRFU?N4kCZ78KLPPFF}?9Qp$?`L;#ii$0RYM2eYAxvxT2=n#FE zp_#Qv-Vo`N<}*oU5Ss7eWI$}h>Dz{hO@~2_x0#7n6KS0~nu&gonLq9E`(XcQG)Z!O zSaSdDxrv9a?MT@2ar@$frO#J>JnP#Pb49Rk-s{E6mYQ1pSpJ4t^7@vtilz;ZyYa1m zY-;@W^k&u_=lhVo*@x##EL5cE;G)%w6f1N-|G>Q6NtVx(V_>#IS-fFegPgv9sBuP{ zjPi-iV#|^n?)xQ2OsTk?DF;2HgaF$|XK$Zz;8!`Mt6Fl}yo5%vFTO7Qa`>wlTP5LE znx)m0A2{mH00KlX;Ucgk{khg1gV zX>(@4FR_hv1iG^M{Kn)Y*>OPWD74qIXE>7&$Mue#5%XKjgl}bjI1<;V_IImBq7W+| zQ=2hC`!A)pR8aVAq-&Gt#{cx3@+|g#(8e0g@Mu=SH8j`RyH7Tsfvz#m z(vE$$1SLT_BQ!RTX}+FGOdsE!5}RB(<$mh2jEP>7Y!#a`i(gVe4rYe`@Vn`psr*Zf zcwpK%R4X?V?k7!3>*9e?SH?TX_=N|S2)Y<(_?Pm%>Fh0} z`H; zW4v<{)p&ioO&x&4vXGHQyWpwnS%6o%vp$6NH9<0{4ISuOM$0y-k8s}{#p!X6M9lfj zPw;9vNgc3AP#>e!g~?eB?%fJ(Hovfw^#4#2gRd(sl|gb2>3~qwdW$No4n6&Jv|!!M zZB~Miovf#`vP&`P9Nh2`Wzo&lC!g#H)#NEKwa)NQpu^;Fyw*i(%w|lWnE^My-Pps- zfJ4mZ*}|_T^Zz#IcWt0?C-B_+HuHdG&mn4TD?Ai6C z;V+bq$wNqD7^obTH%QII81j@CGqG<4b9Gvv^lfR45e|xbqzU+&N+|xyDKZHcF;ljl zc!J7TAQRvzx`;er^xsH*$xRJ@n5h=U)Pw4K^|YEFm*jK2svE5!^8wHI63;oCvC!-T zpHNacs@@>g&S5WSi&6^0o{q9&jHAqAPNdIhZmc%_=^^4J2c2Jl`i``*vGU(!pEN_$ z6obC@hFK6TVGkycbVmnSQ#^=M@C5S{mN1{QKl!uYwe$Kd`pz%bF8W*(HtHKZTV1k| ziWn|>iET!Cs`4o$6a5cmvO==a@1z9XB9Wsncu6FgIhTKF9R?`F(C9sp3xG03itllK zye4s~4Jr0J%-hxvAyZsIy2&o78Z6XY@QOxK5!nxJU>4kWRy{NAz>lO4$Dg&m6M3cS z`FrOAEw!FN3+^g>r*Mfv_3|Id{ULk%ELFp=guDvs6zB>#>KE#p({&gOwy-qGs%jk90`M_z z)W@4gglkdf=$T?W+Z<f=~@imisN0=Q$K zv9p$;8O*cN{`b~n<>}oz{PJ4u>XQqEfBhrf3r0>fp z>Q=nzTC}ml$_ewN^0b%oGpD>4^lXfH6+EdqU7H3DUxOd3z|8uQKDR^~q_ng7(jWD4 z9dmVewR4`dZ&d5bQNn-BYme4uYMEMA!b*ug4{=j^eu1y9X1v6Os8@v%kQ8rbvN z=h@b&y%c|Wuh>+uSV#lYh)%4G4^Z4 zal9X9-cSLrOaI4QDehC|+V?mQxx!sL?BVh}{kOCO-#2}5zIbv!^=9_#_pZC{%zixU zZAQ%D)ZV6L+vl6^AM2Ow{2*V{52Rm8yz-;n_XR(iCWfU~($nR6KJA0QMu^!r9wsL#|!4 z_CU{V?zBpZQ>CG3NQTNiq~pR0vzY$Ob1Aca#$$Y%-h$q9aEqx%8EVYY$`2-3T(*VS?kUye)nW}&^h$D`WC|ChJIWK=T*pRd5=rSP z_Lu6P@&$A%YxoSK(MDZ2URq&N1?8oBlSEIOZIDt;x?#04s^SX$;Jy#Ha>3hCx8an! zAPhi}UlXs`QWBqz!KVBGKRL#np5@jmd^I_63U|YYIaE9kTe{F{2Z56djDDg7gGlxx7%xstIHJ4fW7z-3HQ;4_!lf zI=`K07zXiurGk1~H1FeqibPu-Y2EobBg)vWAJQIp^LrnW+_AvB9`E5B_{2q0Zl#X; zS^cE8Q_Cucr6i#c8SV}Ag<5y*jrNj6qfBeJSOP`jcO{8@vG%fu^xiNl)u=|=BGaIa z7v?h@c0*yBcQFmB1x{XgDm|Df5FtMkwqZW=GCSD|_f(!tl|@5P(Y7e7-I?l&76=q;o}1*togr{Lk8L=)8eEjPmNIPZ3`>U1Fw zdHY-BXQ*StZau8eiu{GxGlmZ`2r_J6MS3s(Y-y#1AR)& z_e-%onmS@7nYnKKYxPjC)rO@Qf|hWPIg%WoSNKK#;CnfXPJE>G2%k$fya;3PS&D9Xw7`3<@YaVi+O06PBvkY)l=3)R`zHDP;b<&9_m)Xr5ce%6`D=RggYVgrU7ly+Y*+u_H<1f-bj>|F zPnJ9va$U=@J=^9ii4pt5uZQIf+Z-x|HVCN~929gUpu2xjzjnUweLnj%^!?;J#_z0O zf4^G3SzVURl!lm_Jih6e-Qu&IR{j`DZdFh2y z7bky6s*pS*Wo263%!=NchOaPP8l!wwpW9k7;jahDG52hJZ0YJ4(!J{|>)|7MNJ*@T zXn5cJFd!|};kE(xP)B`-+n&>Y6KuYyR7DtOy7eToHV2Vtw~gF@*=85&t_YlUZOC01 z#>9j6+E{OlXO(9i8GQ}BPrZG(nT9Z>q>wR~uGmeI{%Nx~`knl6DOd2auEl+`+KNT{ zIoAj#PtMNG*V^obul9v#mmP3p&D5#t2(_eoffVxXa)dmMETtvnZ^pxe+`||77pkE< z(mr{q(wP~CHEcy}d(~UYeA3uw38HlnCucA>azvR zQ@Wt`P%n`-=qne+9pJzZ=tI7iFB9i0bGt8=OUfgqL1In8-*Pg=Mb|@^(OVpS&RB5N zeK=L>nfZ(~?X5S=yVtYd6G)EwVr>{H7{&4F%XowSl(y0P{6+ThQF)(`qU}h}pAZ;b z>)nnQIiCFS=+)yfFEZZs`gSwrr9MC%=hMOewx8wPD(}?FrjGlud{9zA6 zqeC_XM+Qv@ce|crwdbzCEobVsPy$|?b5>2uV>Wqj}BFH@S6Fyg|(0XsDMaZ6`mzwe9#rs#EhOplJ#g){~X;8OPcI zG*dq0rrqV7+Aa9wl3N95cbU_31N*8q{;denms6(}4!X;v*LDMIdotyt0!c1VA4%O01@!4*~I9vzFn zavu!nztr@*SgU=_QJx(slfVD>alorZkL%nocJJVWUC;h{XNz^El`*s0qFk{)jhrLp z(c0LQgxHYJDeua@(>^$3_9rHL_9;*N+efU*ktdIpXK3!A9IGOqgiH;n?%Us0)YaAJ zq~D3asE{?`%Ogi*sg}hXksdZXL=Cz|n8RfsyU%=AE?0kNJ;&d+Af7Mj_nX0E9sS_itdFahnSrd(Y-gcQ%ns4&gggfy+;%g?ZO+KGi*?m&GYUU@ED2$4F zy_i>6O0G-~W)+b=VYIi(iuvV_N+VlI`)d1Sdw{(gGwtGVa_3|!T?J*ha!h#%SG)}@ z>M#k?3sJ?{rIOUfHA%%fsFYMYssUO6<=+~^u?sQgpm@-mJnnRzkMINYB!bfz2%sOOat^dWcPd0wK|D})Ae zof*hm{szYrj`O`W?!endoNm+WYGlnb{rNe$sTIA;$bT!XwbnXmMVYrW*6Yutj-{Th z+|{u@p$m%K*$&VD%c%NOZ`EANez zAt%8?rI4m#kdIvwhr?RaU>62*wpG?h3DiU3#E-$X?}7oihNdgcyVJAHExMyJ^Pu)! z>-nFzmUfDIXdekmqv=)hd7|8+=YZ!5$_&joYqcc@s4L#D@n}QygNGi4%^fQ^`CKGg zDG#{a#@aW+{LHY8RLdzI=?5s{UDEw(ks4w;yMBPec^v8)4xL421O_hU6yppNBz=;saEyav_bO8I< z)3af!LrCOqf%fz$n$0=*X}dAYaE`uS^LW>L|NE6v9)PE!I8U(auiSuhWMAw=dyp5` z*=D>!Z>?EEems{iNxnXSd-f(i=MAtRA5j(7wmw^rg(u=Qa>iED)dx%CnN)n2iInl) zztM-SvX)CtR5qdgg7VIq?{1zL@-_U;y2mf>9=^ToZokKq-W-ZvnX=fZX`Acw#5cFg zlt*YElTUr?`Z4*f|J&4e4Zk)|5IuR7<^I(phUU1MyG))OxgxWkjcHF(jZ`)LW=04(cLmJ;LVMgGE0q+|n^u4m%^{#@jb|S$??km)OJ{1%AOlR?&J$J&hfmZ(|9+2dO7|hTckYu zArC!G4!T&oxlPZjE%D@YN24y^mHr@oSjIn@f@cFP)?eseCovnSv0>8}c(Zt7GmB<= zGrDKCbZ_?jrrpt-nltDF3XofxMndut+$Znk6-?%Pp%zDt6lmL}2C9=#yxx}+@zd2+ zJKC1mPdWBEYq@@R#W;1x68i_$u2hnC3nNGc7{e`72ejuMsL~hiq~CBKti<{9$(!A? zB6C@WGox_E<&1YQY-hct^*%;B5T@^(BoSs;V+YwZBTzi~lF~4d#K_5dK`@dv=3lrQ zE2Esw!?cC}lp4%#9n8r%o*7C%(6wyhF6=BG5}Qf6L6TCG<79`8|24U#pjsM7(=~C9 z@Rv0T?M{2697!H0jq0eDJL56=Kr%rcYo<91O=%;ooVSbTvU`+!5;%WD_}?Ayzp}mt z1$QrF4bxgKfFUlzo1cpe_>FpZu*q^v{hXk`&>I@BjnUlqk4deL1dVsXDGZRha%Mb$ zFU-UwGXr2BpEo*vk#_G(mOr~sT{G4*} z+!{qc+nOBBgWfZq;+|rjO`iGQ|Fl4SwhKriEKFti^NsD38pv7Upa$En+9hYG>jGgZ zXI&0g2I-N1qVfNO%$-!u^O9;Vo6UZbT)jAZOM4w=WVA)YJVF>lO>&2hW+PtibYTde ze=N0XNue4!YHeXdO6j4bJMM)Ce}nHR13%arn5K`YgMRva=c5w0bM95f=l_GdvL%Tb z$(-apNwPU7Zh&oXLn>hjyr{=mLj~nBQX6p%N*M*+{4Sv-IN&pBD(|g3b2kSmMU*>C z)qaA1_Bpuq$?rIU-M?r0#6pvvt|jq!6LLq%&Nn$0wl+a@wuBE>o?ROR<8iyKKu zU4-*&xgJ2eQW-L*`;!6Ng-XZ4#JNi_A&E>txu9Q!4GF_5-xU}0E0pTTapV_(%aO@t z6q)=nRM{ZR`#()*0UcG=bnU*<8YO}T&EW1ZxVyW%JA=Es5AN;^HnF^^~}&;&A;UPIP(3vsQxjHzn4q(C}T{+14?BtlY1ybvz}*f8#K-@(K5q0 zK`JQql0BxywiW*KgT(CDb1ul;CQtP|Q*zhHbuUNl?3Y5C2H(q8KCq8}bKi99c(WZ& zQC}gP^X)IZ5i1!Vo6FdK`RwvF`)0E}G|d**Yb%|<)61qDN?iLp;rHUC0;%;gW;%wt zcdLn7HR79Ws;~Q{<3Q&7^i64ETFJEJv^E*CU2tly-^yl9(ccd{j`mN(2Y+jw*sZ_ByQ%uTg zx8mx{Y|q8c-p=vPZFIe8I6) z|8*2L8rFFR>P0nOk(IW@;t8%Y?vwNi+SK#(D{kk+pQATDmv#`jxuJ{#Q_F`B(+h@m z8(9MfJt#6=>|s=?RK|Xn0@r>;<}5qdstt58123Q;THrQ}qUWSa@@6?kb}`R+i(Eq9 zfxowazS-CC5WM0HjD-ETj5LaQ9>b*oX%3S|p0FqP;8xeDXpEsNex-7VNh<+x5RO-u zs~go->LPT{eDW8MREyS`%*GeZ3|F@uUaW~)G3s6}!@vDjEkt*v%qdBx9&H7d{tf&i zg{bFw4!1xYUV;qw%W*2d)-Yc&nsv^>T#SpbNXH5}#5UNd?exfOge$HstC)@XMlx}c zKVQl4QqLr^xlcccjmoXX#51kXrhmdI;19peNti7v>IVA$zrYCD4UOBMiqNx$Rzx%| zx*d0roz4#5>{V^D+LiqDV{qcbuHx-l%OtEOT!VdORq|`(n&ZbD$s2p)6;W>Ih9GuJF>n_)Z1!z zR`amlgxIY*h|*=MLSCYyyu3;kV0c+ag!hjA(}sE&9kgSaa(cqE)3A?8sn?}#c+`uS zd{w|WQQkv*`GD@9zhF$R1ZRzzDHB7eL0u!oNeVNiR@3jjANz3$`%w|^zBH^QV?j9& z(W|qb=?!J@4maSq?6HHGe@9a#NdO!=5VUsMxVRqCSaTM!}t=J|hU=V5<%0sBKW_#xJTs8)t!5FRSA zpWM#mX9=?EmfmJr{-(Ed-b)EfsQN{Wt{*iy>RR-pxcFb@OjTQAJZ9VHTg7LSX^iK& z{dZ#Ux6Yr}M(6&N61(b0zSQ0BL@B_xZjc^YD@W< zo2uFN`V|T6ku5ba&3~Ftyy<|@Q620UlYTU%WAe!4`zaymTBhWRP*kl0wQ=xiXgSmj z*L#Ox-s!HDAz%X~|?e zi=&keGpVE;+|HAwcw=Kr2b;qu*|&|K+c(7b8tDEUv%(D5{IW~xDwj8oG{u|YIOj8$n<*8$v=}-U&KL@U`34H0!G^8ZFum;(D-CRoKo zkf~8f`cHD8uVCBS!THQYKP)tKV}9lst(1FvW=!(rgxD{sAG<|ff3x|G>)qv#_2MFa z_DJ(MUu*4Qd|IXbcKW4%_}%<_`M8R)dtztB&q%PQOmsN)H^xOiTLa{v8$nfq{t3M2 z|IT-y&j#Bb+X$an-+%n~2KETL9lSNf5c)l2LrCtBtHJYw*96}THii@l`59a>_+z%O z0aN|1+CnW?jKOk!X&8KM#ps}@VY}rs!8gEns_mhvv_*cd6 z(|yBrpU8Q*!-r|CpX{RJPscRJ1;-~xiX+Z(4QAB7j)snQj+IF4Y3EvMCzmNR)P`g! z8tHT33f=>+X`4TEgIE4Ms-0=vmLwFd)R2S-bGVFwy&8r*YhKqLz3{^;yXczEX1 z6R<%2tdvD&K^k0x_$+a~#KQj#(`hGS{!}I^XDa9oF9aVbhpi+>c6`Dmpli2 zsg-P#AJQ4qTq=q^sUi)L4#S`tj(=8J7UbQ$$y(lEI<-A-(BZcYAL*pj@wT_pc{-DP zi^93T0xMx{wUxS3{i@cYdg3|}*=21tnfXGR1q{8Jwii~Jopkq(0nu0wFJz`Z7pc5T zHu)I7_hRg6n&-HoCNqQ{Q#(0@F4K)%|1ue~dRWUU^coDHKXN%y#WrevPhnY8@lZOz zRc&0N=t6GANjam9XKH317#e@VF%+rBGDjkh)<)Z{soH4$o8Au=_!d;` zyI_Ot&OEev_;e@1Hww|Y{)<^xZ>2KwWGdt)z|3%yi6_Ug(f6siTTe$xCHhMmOHZY$ zto$$h-A}`|2nC ztOH+aKi%CkA0|sbFUGI<9QNs9^rM*gxGM>(Q&u_NYkS2m#xvNU z*PbozpBc-N+y8p-qs5Q+34bOgr}lBgs4+sk@vNnaZ8v?Wt(d93(cId++T7IA(%RQn z+vlRsLFy_r>uJk;^I>?8eCVz?Ya8R&Juo1+SZLGi^|CucRs}T(nCElOOm_|4!G9aB z3*V*FrbE^~zWx0F3g{J3(LdO?jkTt!j&z6$hk496t*+gH9a8c%f@g5HzJO`qjqy>x zG4;7K6;vhEFzj#&u|XGggL|Aa*#0qHO}(AcGUZsxtJHPrw=%8HYHk^>a03#1LkrNV zsbiIR_W@=+bWqCT-&UprDvIu#xp+=3*{=YY6;IJ0K21C-eUj6R*G(nO#n9NIDTlF$ z+>=bh3$YknAMvum7YKzo=$rCSkk94nc2QeeythyWC_dxQe?MUu7gR^_H z`d(?JM2^~U-@e8FyX-^WnXRakqjE}+`0j@p2#uW3wPxI`TEOnsd7XR2C?ivL0|Pj7`M zt_t|vP`bZvQqfpO+{3(?elVbR#uxoaw}2DQ?h%}oIC$ay0GB9Al~-hZ=V9TBq5J$DXxUeA<;q|f7hroU%e2B_ci(*HB3BR56Axo<{4fFL9uZ<|3bS*qF-{5U&tq0$Piwa z7BHpOjy-Q9rcuM`J?{@-gq_RYOoCH%J^U?q$#JJ(Pjxu$;$Q>V#IE`pE-+Ii32jhN ze*lwAFX|0C!QFNMmX%8IjlH10p))@HRk(u#$f$M&k=_WJa0UM0Q=G36^t!oVAeaER zqzV4F`}Ag9K})=$*Vl;rH9*FeVY_0e&2GliT;~ajAyt2&m6oD&hhuf~37K4PCA}Uc z;bx13%V8TkFpjAjov5;J!dDyY#(4ULj+2Xbkm0S59h^#@_ix^74YAoIG+|5Pl6>eY zC-K93P^$}Am}M{@x5M%TVyQmCIuK2tU>H~3NHkJ{KD*tpPd_EsdjhtBPDq3u8+)4j zEP)wxBv0Oy-}OabKEyNK4@2a2II(l1y?1e<^MR!d;r;v4xtEK0@HBS1Bavhn^%5fY zOJv&TZFKBHSgU)GnHvsU#Y3ht3?|cTIP1+Oq_ZR6JQyXM5jaDM_FXVQn!D;?P{49PXV|@gvsV{n9 zAn1z)zCj+NI#T_UeEJt`OBk`_WaRM!OtF=*4`c9A7V zJH$eA7vt!ySj1bO!(zu{vvuxmrrXDts)Qz%IXWw%+)lRWCcE;T z-}0qDvJ5t?8hBz+cG^W&;wBY2D|tHaM5Zo$y7QY;KtIkQDcO*?nQ%UQz!Li6Jqp;& zEA%#X=C?E87dk?`I)k4c&!3B!Zgmnisvod1mS=b7;~6}m0#h*)03wugC&Y%o#wON zg^A$e>8XkYORz9oZ)lc;hq6bbcpJO=N$j6)+~o>Rm@G^SLM^fgowmmtGR_gV)!CzexAM+!VNAEBbBU38~26mHa4jXun$#l=v!Bf0X zuHGOj!Vf&xE#MxN1qJVY2j{UV`=}tj7g^_3Jn3q(=ug?}S-@D;VnarAWL|Qr#(JbO$ z-+|N>;!Udaryx8=`?jXqAu3C2F2hdjfYZjy^ZcFFcF_~)MyfT|BpWhV9X_w2`1)S^ zaf9>m1K-=kdkSEFH#nCqkoC)Gn~E^TM#IE%pLhKMw{j`Y^(0p4Dm$)XO&h_5vXb-p zAE)v$vCJMcPZLhpQ&zGyRehhRx>yfBHjQ|61JUS5EKxONdONF_;==h<4nu z5muujn!gZl;R8#}H{|I8T5kb&?46~Jy0Pm+IazbqsdZe#%VBh!cYM#g6=EkRBgxkc z4|$fW)PT%ojmyDy{hoE$fL<9+Owtl7SObr&F1y&4cy0*SUW|n9L2H~vgFWG=<3K!; z*((Q}HEGEAcl63v{w;}h%;4V=`L{?s{VV*=VSe)zGXD%+>Lf>8gwxfN-Q3KXd5!eA z=z~`bKl$%}U?lE|wlETZ-r|gGKv#J6!$InUsNKeETMj#ui9GUPs!>)@JvRsbpmz9l zA%c_Ixy$%;bFr;nZILHS?|nmRU-60H)PLaorC|#K(WjM=l72|i-#o*8Je^FKse_PW zZ?|*`Qh%L@WGzxQj>^9dobv+6|83;@Pw?aYpqN$hp0hJyqb+!5B)m;?xkFx92)Cjs ze({7>yifyKr?*^x8!|K$X|9ic^v=1Iux+ndk3CtZelhQN00haKwfX~@YsFsIXMbh5 zo(_O5d0Ba5vBa0D=zNOS3m|43$j+YP8nLXu6OC!2dbBt)HHP!>fRzj(-fGTlh@R+; z259sUp5+U&cLX1#KlUg9j=IC_^`F>&?s^LE?+>ZUyN)NRJdF+- zhyPH6+(bB^vb;}k&Y@T0zatSgt{sfb_=6-_`7;m;`v)ha7Bb@12DLf8x%o~SXYxK= z>)Syq=24BY5Z?v<30CGdS9(cqK8`igm`xkTZ#2Y{9?1!uh;40$kB}Ya#b|WIarEJO zWNRnd>ogL2n-zbD4NHXu&5so-g1srnr#R1$gXc0L%R2HWql>bkk#h2{+4_(9o+n85$;oor*6z0`(dZ&;j^qpN6+Ia`rt))-@^yrO6F~RxmqZ{nG;Dh^KNl4 zy*}oIy~)xsP+8&i*!YeC4H$>4JV8@FLce(R(r?bV9laS3UUr@}n2W^pW`%q5_jD}n zX@1VD2Q-iO+47+&>TouP@f=%`ofAmv5@ezQ)?J{Q^C2s^kKdYuZEec_sBpSpq{3u9 z$l(rfxo03VBK6cI*|%J8KPndFO)I#=7Xap;*>+Sc)@frx*Aj$;^P3K*M~|D}LA@H#YkL5dMuRiUhgI~;S|yoPweqe-xiXWnc$Q1(g3mlx0-pRUG}d7}=rLHv>g;h& zWXuOi^W}HFt1sa(y<-)&a?XZg**fr^L$Ei;(C;$$?#xMAk@fj2%ij!PZqzN-!5hg` zrKYn8QB`T;l6u5N-C$-Nhi#gNly1cPIgWjJ!A|K|g@V|*GDt{S5bd*!tj+({ zNaQ)ZPZW$a_`cs)c59qYb^f_9B?kRbs;kG@C~MY72a_BiND<mDoU1Rc2YGPgtt&T>pt^%>uuPz4OoHU+&d3DdzZ7mfV~<*JkpOW zW*=)tLuvd}%tXJ~A_No$6K7zBh6J320Z+!{>R|oC!4ZX9F6I+$4 zFB|907mL%7EA8QgEBF8nhzlljT9;tyr}D;q(H&kcnnK7-ASb~e842ax!uZpQe)xjs zxXupz!{-M2ED5>r{+tDS5{cKdle0Y)UwIin^AuK;Ke*m7c4Re{V+lLb3tgKZN&Jj9 zJdOXm4PSc;a&`z`h#8#ttrxiR9^`p7zRDsz7O$st3T+z6s+ri2Ke@&ro^?7;J%j!A z&YbDZu6q63Zk)*Bd`9yVz43=@v0FKLHU}CifoFAi3`lS|>)o6^9LDo3;JJ3NUZ?PS z&*5Dh;QtnJ)j`NyQ*^BN_x;emsbCl{k?gbB+>@-qd(KimPC;)ZZYs|)j`i-2PV#yi zt$2=MNZ@>AZ#w6>Cq6(K&Y2@$^!_nnU~(hYyri*IycKh~gKKd_d$kj%RHNZomd zX`HNmoP+;}$xoqAhw{BR&Q=|);x$m*^|1Tg#6IRmmrf$aIgO@x#FKqS1NvgsnzJ@5 z@Ji1S_1wU=p5i_K=BdV`kvp)<<#{F_FqiZ!AJdWbr`ONC&A!ay>8gSxhQcFRoM#-t z&fdWe_#zpVh{79l_0CwH(Y*UoPQXf}Xb?VA5zgp$&gdP_HMIQ;PNsuh3ue{xu##3z zQan<7hm}0X=OSPCkdt_x*q_r-h4pLAYBlE`1zGhNzP}A*WjYeI6rFj7(-VmdCZX+< z(ak@2*Pm#t4E#3l1Z02oSq>yM8)w$RcVF=oN6A(!=eL(|s`j9HA8`K!e%`?jrtpzrf?|H?d14bEpJq|R%heX`J{mpsE|u5*di_QqGa_=(0g@`y;oVv!eR^TuJ9UUIZaI>+dv9aUxHZ!thqg_5jmY9&iKgZIeWRB)vtoaNJ4HNu!{flF23>me(Y=uq-8!&w1z+X zqX{G!p|;>t_N2z$Yi~~B9SXctQGD_2Jk59B{Q=VBMGX|5ATRrzoA*dXOJBirUdQ^a zjSA!$WEUq_{_2eV_Fp!LU8$ClGip~u8bkiGZVQOJzm;0)FF*VI! zb*o^Mw$rt6*eDrKONoMP_>*o+7yW+O={HW(LOG4s!102J#CxFWH*jh%!Ak1KY%>k6 zl=1RedAj^ux+vBc4$x0FQEj4ZfwMMDX{Q==qamLdC~q<@HeEMWFbT$%QcpUDUuk!! zf|*QTO?9d^x)8Mp!eZu7E~cvPsM=G#3P*Th&uhbACYgz(&BiYSp5i-FzHODa?w{v@(j~2t7Vkj?weFi zY*yB2$2?1z$JkT+&+tO~=vtgPD|K~J>%`(oc~YY?A1F5QiMhJ(J7!YI{*`<-n14wz zR3!~2T1qlBl+GA0m?i6EYp^vxJRpC=T%Jw#NWJOFo1WE)Q^Q!6Dm@>el4q)x2t$TH zoXdILQSR?b1#Q0m53^)nqpi1l0`=VLSJwlFk{OZFDdTL$&CCIg`mVgnAs82o%=~py zml*5L<9|Qb2TyVFU%8a|PwQS=HJ?md zs&%ksjp>QpM(Rbbpf&R%O2}=E9mo>ZF&oTdOlyrN-; zGdszNjztfzLPz#wl9-S9joo)LyW}$Y=CN>k>Tg7YaeZ&WPf7s=Lm5=b`Eqsbp3MO zat(F8an^C3b+mPqr{>^_ql+`AE7G;b9jZ)J_9`cp^U6KN4<3MaT2K8DoKLfusgNjN zfo-<6setJ*eH9tZ)Z0U)U_&}E519I!b1-ZDnRFFh7ZB0q{CR-i}SKiouUoX zo3JiNIJXtZ0%W4w$Dv6ZepzNgj=NgrR zW2yYPL_OgnKChTd_>Fv~jSO5_y$(}hW^1Fr@uj?-9{PgF=}lVz)&Pyjq6qwHk^8F9BbSfv}6uNMj@6eGPU@`K3ZmmDL zrt(AsX0EXtoO%>!X&jxnX=sI-&XM-mjI-%#+QYP<^n2+qGyLs+90#0_T$h=8ny8dg ztEo2ij8a-zNX^S{XI|$(N4)*8J%XR=<$M5R-a>7k=e%$Xmey0Io#tYeww55v-&E^6 zsXna$??r}qQG7t(%6od#-x{5!P)mR{#yY}w*>>Bu%vRVo+j`CN#QdLWi?NTKPf8Wu zB3!yzfc(;sV4FCHu5T?;LWs9)&3c|8mnxhy78#GL|dZorBeDL{Yo{Yqjb(bla^4) zvW!VZe+nCUip@k5jfp=WQ3LExb?7B=p;Q^x3a6~f59F@!Fb7KQ=!T4BUyc%Me$!8Z zO06YA|E1T%2d)6x*@zQip_9lDE_FYlB>Y}qw2f*%rI~x8E5rHHnU5NrXm@$_1omR7 zVV5v~PW{a$ttd+X`oNU#f)a$ON?$yk5G{|BdErjgPVa8g3xL2q`=9TGHXt}}oXxBNzzlbRJ zvu7@1nmSDXc>~VzL(f6Ja1EZYH=FSR&$K7G_*L{AUto4cN!a;{QtNw4%f+gj*eP#j z=^MV+Y2u{`oW!MgVreie4#E3gNK{*bNqGnG>z0AuRL4J@M6K~+rXU|?_S-&szCA>J z*QlI2uh#|baU1Ny9kGkFh#LGG;s@a=lg-XD)oeB#Q|ICI3*xCR7`mbF-cs{jS2&9| zyd4BPKdU$uKeaRaZznhQn0Ne0{{8{^j}9R2(fTl|l#VcAZ#0!BjfKznp3y`%1<4Kv zBKhm^*NYOVdQrj(L<7<6;%VOP5ni|-v6h$rv>)Fc%vWEmP7N$Y6n%p)CE2;lqZX`jr__)@;I;Y!@q#Ae_^`PAG(tqb||Q5Bz}y6yj2llGhN8p z*rRl&ijN}K`4aDV05MB#VxewCGAoImFJ__nkI|fwphPk??*mwYSUS~Pv&R$ZX09%} zkoQ1iV_>8(i0A$K#k=zaxL)CcA>H*qg@Uv$57KX)H@k9FsF zKcTj*v#X_RI2=C(U@dQ!BmzrDea(;GmD9872H<&#oMf}h}2C(eg?BkPdSGR zgan~BGW`#Ai@SLee{r)=R5(eb<02wE4uWt7^xzuz8c!DfALa-ihchify|2Dd{b0{c zrE@1)Z-K8pkJ#48l%0I~ZmkBK!*}84`NHhvnOcH2SpTeduzI}*!ChELq# z5prLglbv8_OD#(bRsZjhyy|3kM-jQ2iEeukXV*kFa>J$7Pb^NoSQX)Ks@eN^elg*4 z4>>KJYkSwC4A_DFM35IxT z7q~N0(F3!Y@mmp;b33fS58;tZpc>;XTA~14Vi)Oy>O*&MQLJl!qT_r-gD=4Bj_Dpc z%&YKZ+q8OAQh-ew_F}OWVFMY|OtQ#NQbtuVns9r*cwdKvS5ph-pi#tS~m;i-8H}L;=*ey3FeqYu^;^JUJAMtHE zgXQ%F-?3)pbrymT%tpKXi#~nH^$)N@<#^9q{LXE3{{*7qJ#>~m;2gI^qCdeEz4mKA@Jx5P8(Nr+a zhG?~E#9?chm#QKev%r&EV4Z*H-Ss3oOD@qFQ7dcS@gk6p0%#m>9=12Q&_E=7E&laG z^vyHwG8N3>C&=q?R=W|JY$Z{1PULVq_l_p-@d$is7BX3cb^HKYww;J?F#5MPwHEcj zk!FBReJ69)6mMz_2tZr#?`)h@FGB91BBB!LM0fOW8F(yDahGBqCzUF0=6THI9a^LP zLa2tEOD=E*f0q)RAW!Rf%4*;Y-&ou2{G7Lb(ObDN7i1-#dP8qD&M>~b*zY%1aV_U- z33&DorkpQBKjwtnsvUMbFY>hZSH@uprJ+nZ6j&l&Kd%EkE9;R;8=6B>YLy&*qXNGL)?7{`7M1FP}Y@pzG?|Bzh? z-?BR>+}~Lh42RJ08`#mAoY~&2Lq+VG8^r85Z__>N+QrEkwFaBp$2I(rz9HavOZgg% zE%L(_9pc$Kl9{T)S67hUjjXsAlls64$AjW{JL1Cl*}hoi-JHU+SpFrTk~Kg|9PG_! zuqy-SsRj}}n5P(u6tv*~ii5X!v8x~~p6~x5tvA8pW{`z$&fd1b2Ux>1WdmW^i8Q3+ zL4M>8J(!UN%fQ>aX$WRF2E)T1j#n^` z)k#2~9An=;W^wP%1#vvd*9`oZAav6i?z)UUJxJ`93?oMcJi;2FQYI{|cfRO&R-+A; z-CN1BjVpa)#lzSGFFI5>3qcCxIwjGjlhI2rsXvp!_@g=FJwT53lM%Og;>i*yXrndc zdIqBF!-PK6XAC04_m1^R!lK#WBb>@<8pQ1IM`)gDAV`H-J{(fy#nZf5>dE~4J8WZKWF~~(nq&NC2Jcsa`n}`&GQ6!*a9SC{2)vyWlBi-am#F?g>(Q7aVvP_F)n+%%d#1sLomY|8+k`m3Zt&*bGu{TPIflnZ6xq9p?3cn5jRtLTQ_($%bLYpik7SKUBeUKa zNKPa{0lllqsh`gC4CgK>NL?Ljv4+9Ah)x5?-0(%4s4h=@3IYTSA~`F?xX<9*a90o55KnO4w zg~{F@MJL?@og9t6s-D%Ge*izO7%T)GL9;h=rW$byyP~Z&p;`U|YrVv&+l;33e%7+f z{~;fVWFNhm0(ykdmFL*`%Xs67)ZDc~POcFL_)w?oCwTMR6FDPa$gO#6rZ$0;`;o_8 z&%b+Dpf%qaK$XH2ssVE1_0HE_`XVsbHDoD$S;^OEq>3Oi{}2To#@^*Y8u##45lHiB zWabKTSdy$!A++peY~@*4x3>`GslqQh94ZU{u!qw<8ANo0VZhp@OPnyfr!N}v8WP=v z7`i1hxfe3$dl&T)*XS6lPnBVHu^A|53t<=&62|C<=sXP2dTJ7NwKhX>AwQfYjff`v zrG@mK8HL7%6GWJ~*yVwE>Lo$PA7s^ijYD%xL%!zHGnikmK{S>ZtuYWkpl6oVsUV!e zVhsTuYKFIwL~ZY4@*7V)li;t~M=VxBtcX8)6R%tl_Tp#fpe{KEEIWqv|H$b)jD$Df zY{VghZ+WwJ>_ijvO+O-;a5&J5iSMc8xP_#TggK=j&)|dCI)&8_oQfoah~0}| zwOgWx-=XEaUPTI=j9o!gc9Gp(iss3NCp!%(%SYXKZT9dp^C!+B=k4#6;T+*9 zmQv3w;1vzU^V|uyVh-UfmGZ5bHlb0+FAG!A9NW;Ht&pwxXqh8&4#;_t{MO&P!bV7xC0iZJuzt&{ES8Df#baA9?rs4WVst&a&yi@OYYYQ zO`aR=ahq%OMSqlFZ5m;Jj^R(2=e@RKx6UBHlgY7!a%%6fhTa-DuTHFiqzq!$nqlw1 zW5c~wFD8$M9w~ztbc?;6M+W~7s!;la^%Ws*-30z-!~Q)+wlX;~n|u=w#D!L~dQQ?6I-DBn7+6`NJ>$r0k3myK(*=A076XNI z-jwQ$&sef3p3w)ZS(NAYR^85^TFir9zd^*10AtETvQwqVCEmvBduyS-5oe6SFM371 zUyt|rP9*i2*rF&Jem&kuI><<&EUQ<9TxW6gw0Fupdr5VeA*Pj z+BGk`Rg+H@{!OD^=mehGc;sdn+F=!I=FR6t@FysHR_?Mbc55cyPXecV0I~B4DuoX7 zx3}`4D)u%n{$PHtRgk}Zv9Yme#arx31YVHLbJfT44#utwL9#nysakNpdZQN?v-jRQ z(;57GF;4f9EQ=)JCB(q&o)ew66CGP0wEaGEW+E1KB6I&CGgJ8eKe?~Qoeq;huZ<2& zp#JX@H3#Lm%4PI(X(XvF_s(wk%Cj%xUx%XA_v621=eeg*MYk9KY8lzK_Slkeb|nW_ zEXkg?;_73N%GvzXcznt_d{4xC`i3?10Yey#Y&-_-xzBG`#9UX`}N ze%-xSj}ofU%bC;k&KP9OCzqp>y)rn!0kI@KP8oDC_W>af6lQu7VD?<3gu&@CTWzQ> zHI$X!7+YAX*@pO>_Ho&IS$~>-NjnWawc+ky<{Cf9Ow4?2ujO>PUMO?4Px@>6W5%*4 zDQJ;ttUx@y!X-H=W5HLqh{0m0@Wj(tzei`yTz4*aOZOkj0=0|Y+b~M3D(|7&b-O8- z$!44-ofIB1J#wI01Pt;4Z2N0nr(KU-pIyh1DlRY9KCz8}ka2i~d!e>RIg`cC8y|^aRP5UX~(sft4eMwu%R-m0U`nMi6-4 zVl-twahx#U(8W^}PNMAUY^4V?)rK((@15R+==dppKE>p^Fd2`O4uNZYB#Ic|Nx@IL zqNnH`kkt10qcyO7-rlZxLVdi$8_4o*;+k;0nqYAm9YJwm9)FTeJ7&1WIj9aEewvI} ze>|FJOa=)9=~+u=!X(T<*SE*^ZAb3@#V`B|o7k4KbcraW3tFp{=R6kgEVGv9z_;54 zobR{ij$uL8yA0q>b_fpSdJR7LK79%PL7d(S|EvX;O~4x}#CMN!4!%;!QrRO>>!`!Y zF&-UR82xe;4f-AZw;av%46E<&c}oAoQ7{CB{KiU9DGAy4)+a~cAA9S+>R{m(;lC8a zON;>h%}EUR9&i3nPRLetbbIW>Tu!Y6{oW6Ku!yf=oXe_6c`<&b+U?_b_=~ABJwhF|4KLD*mues@b+9unImMNU z6$;{a7DgL-s~lROBkSR-_wGnCtmhv`0aKgp#wOj?}U%^){GX+ zWT$h&-`@*Nyb4k9KIF7Fr@%~1)duW4Oo(MKnq&K3u^OkaeO^Y(hRDNmq7E-+_=V^^ zujeM7_8@$Pt=zQ-JJ}vPU6`KFwe$kbAWpG!m15w@jaUUQ(_bsRiX%wO7Er`HhGuw_ znL-F`9iPCr+X^Z%(J(B^H>_l9PUw2Qik?hn?=t$L4Ck>J5>cJ#I~iQ2C=pOFRoXs8 z!=;D<>++|A$h4Z_DmxU%n$PF7oTo0hD!a7_d$kXY&FjCdC*E;kgQwxGoy1pajoeH@ zBOKvPx`PCtMYDKgtyUKWukh0-G>vrj>vI4Se*iI>^tz>+4${wgc#0oXS|`^ zJl9YC7&>q@r!<6f=|}aAfPXj@Np6bgeiRQN7y8Btb4?FC9~08IitFq~7nc>@q7_8L z-{f4J#GU`rg>a7upfJAX8LEz&qwg+&g+%gphr#n2a#G*pu`EL?cHz$DkvpB(^(LJR zC#dvF0-syON%3;Wd3f#$XyQcHeK@Bk8IS4={>1Styx~+9j3bv@x zjby_1>|>|CgHWWfPZ3N=-=bQW2vHR#y>Mj~UFosv8|?8<&ojdc^3L_)2=vfRSXelM z)_BJ=4CFjDLsP--O{^8n6TE?a_YOSYhha3WN%wPqsWn~mMp){0laUUE4Yimsi&=IL zn92TGHL64CM3t3Jic|Tlrf50w$BL1a87%I@tC$M&%zNVb#zJnqTp4^OKl$*&*abUl zbph=2AAF!lF3)2A`3nK0!O)saR#UQjHZlOSv0!~Ty#t7x zJ8)|K#dfeB9)xA}f_O@tPp5wXS;hh67dK-+o}yR6uv&j3!`1Xq-H#k%HRdos*X!e{ z4F-|+cH8A5KVipK*9Dy#4I2C%oxPlz+|BxCt)kk-9qL??sidt*S)EiWanbLyzxO3J zN$#EcAib7-xAV69s9Kv!g?K}l*iKq5KQgA9RPzl>C2J$AoBZ-na|cspIR2Y3o1z}R zRv)-r#z^Ji9gZ+AF@>4un)jLKFjr)-X_~ROTuh1;w!pJp2+t!%xes^PSs0ic_8xYV zU9fkv2RU*%N4UPbC#p`3`PPPE=l<>CCN#ZhHa)a>;_hCq;{5m`!ZzV79z=Sbqf*G3Sx`uoOc24!@JaYO@bXSoc#1J zxJzEhwTvf?f~mf#v#EheH7Sw-zlvc}DLy{ZTYS$BWSJs_W$4vlV(xv^Wq5n6isOIO!!u|J@|Viqi=N*2 zRKD6mm>ew3v6!T$sPo8EZsg2YLT@)E7f}Gos>Hdum&G7ei5So&lmN}hCO(Dl$I3p| zV4lKxqRHb_BZlHP+(1JQhD+f-5#t>yo<`G!l7SXof;UhDJDJG|oJ;(AO>Y2~cTIAM zvtV!-MQua{x{tT%gYcSS4O7r@xy7Qq$2&L#s$i2g;IkCM1NZ`7c#JD_BRiWwW`7B` zbrCwJC{gopdgOizTg5;o+_fY3y-0kHy{l@N#ZRtc-N%BerR$xrYG$;Tx4M2THrtDF zdnyW<7*N9Tutm&^y1O2Oyx&WNwXoBlz>l$&1QRdlh|BHPl9oW=xJ zDIXd38Td7|h>@d+sefQY2B1%m;18DPq%}c?z7sRtFcbi#+mG!(O%H2JV(Pu@iIa@- z9Q0@_{7Y|rZF{2WB3OYtNKO0yW0n}HKR^o3li%Nl&+5nSCV_p;z&|KX+}sXd#txUw z1#-GMskOSmIoXOQQpht}|3G(iL*~S-BExkEETkm)z}1|q-pH{xC%G4GwG52wZ@d;8 z*hwml8@{0PCUSsR$dlGXFU4wawRkw?=ip)N@igNk?4^@`2i?1Ia65N{E9_5UCo6WG zXlOdSR2Z+K9sAJ-9eIsj@LJ+|(EItIFVmi(^yI@_1u<(;X<;(E&DO}a5 z7r|2BBbRduO}z!{Tv#jzQ}zk;`V1z7SUkh^MEF1U!x>l)k8lunY5-`+C6Ju%_&(ka z(}CEdyP&n_4S!-GGsy@h^2T|E#oV(FI7v$|IF}a8-}{MZ7U5Zp#$U+Gj*g~3xj*)x z0NCztszra?Ww`4te#e9Q6saT%7tUFI~~LVHNyU+6OYUU zaXgg8v0=u>zD55m#Fjn;N7;?!)*(ZYj<=Fb?LupC5rMwY$FQQcVtq<;{+kM`$wDTf zO=fA5c8h$mrcR(j>L0x=S*{-Fg{z<+W3UC6!9=WNalLl?H6F@H&T>s+FSnsKdBu_F zkpkq4XAxt(#h0G~PP7lty$LacjQ`OGbX63VbB4NNg}Um6Ko6%9V_jfoObxhytAHHl zr`pCUG=T->H|UjE@*uk8 zvv7voiW|=?8xl4ethXPzgCAMhzW|<~7kP#sL@xjFCY|+b@V@wIR%V7Afot%izJNUb zek@@vv}ZdsQXV0bJi<@>l5jkr8SL+A*hFUXotx-`!+0_qL9pHM>=&dbQ{t`b;4`%4 zN$v~(;!XLnwl<#k53(7zu(Te%Dc;r#&UXy{Mt;vU{Dvah5p^s)c!5mfCHG^96mq~L zxmiBLRG7ok1t#;|;2N9p2QLxHorMSDZz7KAtYsCvff{-}t%rI}X|L4A$FZuf)Mpy( z1n{5Rg%dQw1j9hpRNN#yLwil~gpgmbvL$Wmb4Zzy8AaiZP&ut2#KbJ_kGSSvt zp#k?@&(t9!e8#n?kzB$m9Oll0VUzQP!F4n`G8k>Q9UcFZsylD*PyqYt%E~QV!OPo@ ze}6tJrY^+kZAx^L9SwDc$Y(yjSq!UunM}rJ{FSf7M;(Pb_&2MvP|3;qD6HoO@?7Wm z+KxW=Rt5PJXSFvJWKE8P?(~CA;*;2r=Xydcae?T$C!hZ4(|mLr)`oqjh<0B+0*iQ0 z*c<<#Ln{ncqW16*42J9Q3Es4qQ)eAGbOl%}2H^*ezzb|bb?XE86-DJBTpC5-9*a_A zHBHZCLg`Zcs%ca@MvBkSffL~jIfb=4LzMptjnIe4Y&011InZA(;@kmjZ87zUAL+mT zpq1scHD;a0gF1W2vMlBVHTJC2e^bxY0)72K+pLqNG3*w$i-Tb1sVJAG0J8_sL*HIcJ34SiY-dr|_K_u+i5L2qq9D^)@2FLKgavg+|* zd(AzcS=A)2P+kkws#15>06aYp`8BI}mx|aKRBeVMsl~+IAn*I|9=_o1mjI2aNtH?o zZLiu;Rh1;FL_4TA)b>n>U(bEtcm`pedVm_6#Avt3Dc8_0CZ|6K5+7ah1%3U zZDl4$1UvACSmtR~SLFj@scl4&xrw@)fb;hOQ9jH2bk%E7W2RHvK2gibbf|u62`t12 zCTU;O&gzjKK?s0fajWEEMnV)5VZI;*2k;W9v@<*cDXm3T?IxA_HDP?b!GzbLT1V>C zCW1$0L#Ap{XYq=49?ms}!-UjIx=RPVLf-r;s6njS8hfNN2VozRT5rJ!{9PZwTb4&7 z-UT1`GJ_03b~fRS-lK2cDwf37mE{U+z`T8!ocKyRt{ziT+)LbR-MagglB8DGS9u}~ zQNm7ql`>ShY~ZIm2z#j6Sx$Z+4>o%!@nr?9Q4+Ncl5h>Jw2j!Vtsaflx`kG{pbrCa zIl%oDtX4VLj^5!>y@3Pe6ftup-u0aB?(FAOO*kdmjU9j!;=nQ*}qyjPRw6wJ=VK6-fFVC0ygw6R9G()HjA62 zzOpX&r1q*mRkHKs+pPP0>Ijcf$M~4vd`Dzfi7Jv?`aNQ^8^S8F5Owso;P}#|d~y>e zlI%tsu7&MuK72c!1%qKXQ+|eX)<%QLo>z*id*KxOi)zTv$aPh0f~s#rx@u6f79sYP zPDt0JWw6$+19Ps8FDe=4vvv>I(NX$Hcx^VKn-zG#`xDi#!`iImEN;i9=K}99ip(uy z#`7ua!Hdhj@_p|dMEKAq3lVtie^DzLq7TuotKsTyr9Lz6{fIXYD3zJQ_C&j(A7gUQ z2xM-Z_z0YH6Q1fOAqCuxGv|4T^{YjtW`wo{=C*NEBvrv18Eh)v9m$T7FqxQc)6tyz?S8T2C8NZjM9d<}6S$J`n(QZC!+u`>#uz1Mm9Bp!M z4s+z~ns0aBFL^5Dx)XXKTMNHEmISG*CsY~i7@sjUZBJ@)>WK7bnQ_jF>Tr)${K90H zmGU+zk2uNT*3&>w4{LSEjo!nDbs=XlS}Ap``@8d}hxuquyZH#*@5k80g z3uh}Fydz{x=&I0|kP*S**&6wOv9(~%^+Ll(?Y=VFz0pctzTdaFKAm$cA+0F%iHAY66h4DaVm^`HaK`cGXZRybFbqAHUHi1=k1dn z+npBoIdTELJmrK8@o(AJ)Y06_Qp|eL`q6sT+TOa$a@xGpG@P1zJJ#i2B7uK77k0IV zx>u>IHN4%Uit9XS(8oQ)g~C0Z?}%UY81lKRQltnvg$IY%YO z7DppzbyruWyna-RaH10p)5P*j8A~*uw3>a+`1JO9V0~v=DB85^_B<*7Bv|5C#O(Rl z=ELR>HKISo6pTCht>(|8iT0E-87mzHl@gvMQca81Z)>(|p<=FlLnIyN~oU6G29-hqCaFu4Vlm_M1Ea}J;49Dd$e zsxjUYEqqp^l&5f#m4>zaiL-{QqIkwe8whFyAdt+v`%In8vc3$8I#kWQkybg_G)vQd4l1)(3q=)=#> zBpMfyW?A7JdXQN<9_pj9Xd~f|4O6ZoXCIm4&{JKiz11t?#het+OPiRE<7+x=>I~Q9 zD7q>hT4q{qnzx(s7~4uigsDhsbv2jL)2+GeuCmO#Ey+&JQ7e*5-ln%CQtS(g`@gKF z3l067+hezvgyoMv5smx}qq;>|M80H@2-snzp_r@nHMU4Dd%>gd)LTgM6*b4uuEK&VB zK9jNL`9Snufsk&_ibKDGTI9$7+z%ULZaqRj&zys=LKMu47nvx19a~PtAYEH7MRT`t z+v%w=x?8*VKzq`Y>09CICKU^-b$m0ppt7yB`W@=6D z_*xx9T$+j3an7(&=u2d}i5Z(N=>bzN){5(dNrpOjjCR$R%pd2A4u|SgI@i>P(oe8L z7=#bq7v8g3Ovfz`%XT)Y4w0<@$7m*#18Nyx(Z6*-{9(AKk5?`3D~{ut#*Ei#Wz({y z4N5DUUMXW%<~w^c=S5cqmSCUjzI*-F_?7n^ZVfli@*Hydq~=KI z8~ayO#OwFZqo4kGn(_SV>x}o6KIi^kCuvA#2Q^VFWwi!u33-<5SibDxu|?90n@WkL z&y~tqvS=|+_=9{mbCwP2>vKqMrLS?GOOHqnO&s^j^>hBO3^J_|sSh(E9g*&>8eCf9 zE2)IBq$$qS&OFWB)f@+J?pL{o1Ur|fgVv6z4~?9w9rGNeol{*sl%rY=L!!9G7;5Qi z>+0+0KR#e#VEt^Hvn|VJ5BwI;*uRMHI_rMZY^jT(o;KNSaB7*OGFql@O>30aGVNem zm-HSPS2Bk?2D#QKk($}yBOaEb=yls-tZAGf&y>1~6@*Zx(3RA?X=~9xWt8pi8t!0s z3v|ForJD9xzi3!1_K*{e)v-*;mJwu=Us_*SPgpxzZ(BYyVJSDgnB@hl$F2q`3tU~D z>m9Ywy5r%x?e8?Wj=F}qYba&Zs&MwtXQJq7e3~jq(HkjBdd#eo4eabn=85d#vj9KR z!HnV%JkcgZzX>1#b`b3V{JD4F+x5YG4&s{*rp9dn6`9*XkILd(=cF3h%es3-SqBTO zuFM7hKTkv!ft@@`M7+b$0Q~=*cuCqUcQ8g73osAh6@5wv9r*nn@soSYdT*Pa&Ia~R;cG7 zNakIwo#s$4GVwNnSsI1OulTSAN66gf5+8zxbfL3oKbl}0Ufwi3rAY7ze_dgI<~Dq% zu4vCAc&^LABo>3sS5kp2FP-l1Of18oG4UP&H(wYU|{ahe{X{p|EWx-2B|4H=q|RM^X4 zzdO;=o$w30Q(f`F&>Tdxk$9FKxKJsPtE32(gdtcgFFO2QFM(gS60fqF_#T<6N2gg= zaSnJHyktaM33Tf{XRfQ}-r}z9PICRnN8rB~C{NXndS1gf;hfZtj<1{M>6V`sKdT3; z*3a_AT+=+sG{{&=-XcaCKInJVo9_2ad@p0)n7Jx5*q+@n%~^=)&wI35yj>Is!CLw) zZpvMmTLfFFxsfH*dckV5eY0k_PB4Fwn+pG^6&=>pIX|6oAEP%%E_&^F5&GiSi{Y<3 zMUIc|6Bn7VB&DX~p_Wtr!xk6NHFRw5(ELTh#}~O#ETj0F;v0MAy8`_|yVS4K4gT{@3{5rxMpCXQW=vIPbXYzM{=F#Ea?jEYl%#SIc3`MoVSO zLh}Z!L8!b_3>WCs=9KSMo2orv);y>^)QcM~2tB1><73kzOF7#spH_Z*{7(i92s{xu zCh%}TJO96YOWKy0@5(=f8lD^KUiUZWX2(f;aeHQ_WN&M~YVYh2n60wjHQC)&X+h+Y zj|!Z7o++SQz3Jl^B534dTYGZr|ET4a^R5xj?vC5`O?Hz*aZGj%WDRZ1m%cAYnO0dM ztru(se2V+Lv{klsvNpE(na>z&$tT4CVT9+JR!lwM?(F)LS@j9_YxXbp4i2+39bdAd zGF`o_$slVpgj3>O>5Y8JxW-i4eAJu@CwaR0G}iZ}sgCIc?Duo!G;CLjI0N){2htV+ z_O9Xc=JIUPbLs2p#M-acB5HjPUSU()Vk>iMGqh(=@?{6NOw{f&`FJ~e#Y|LH2|V16 z1U=2#{Y~<7`7!gh8_V38O>SpD!y9^#oxck2Qg;HEQ zqE|312OS$m=im!w4d#$$GJU=#$VGOrx=gO~51q_S)va{7Z*;d~4p}X{tOLw+sHbeD zm#MnC1m5LVpbX{6ISXVBNAsym1TYuuVFGhoCo-4%nQ}(C&!mg3>HxIDE6*gMo>bXb z!fdpju(^D``F8c|BtQBm1Y^7|ctcoR@CB*D!G8wbU zRirV@*=s|N@g`dCC0UonLKuCWOQia8x;)?b+gRLG)|Ab3%h=l(D|dlsyA0k*ESbq3 zU8*6-B;05L|4?8N`%|u-bClt3)eLF0A-o_R;%GT zZ73!ll=2wom?F$SEDx-0Y$KUNT;D2KdYPuk)5XPjF0Hll>R*b-eFMCsgFBhNud%#k z1AB$ct{E}uG3lc-7BIoCkZZW|Knpe$5uZyAd7QC?(IU%Ypr^5N&b}kH((m`*5@N4M zUycfSFTYAxS~C$jfH(G1*V2{%{4G@P{Fc)Y%3C8Y<01SqSp)0 zEtEfBX3oOFx%{%5I|+HzS&q%=<5NPCru^RVYs;^ezoQbfr+Cr^+jF_UXfuR8az%5h z<+nA^wv36^7V`+>BdMVnZ#a*YyH8D36?KW?bZ>S~XWrN#>bHvOl?;c)9>#JOgU@ci zjDQ!!$kD;SgS!Wp37Qz#+5anZ0FRoo%jboao+Fw;UF)vz3S{P0MCQee$LUh~y0mF& zAJZL<2uu5v#({0WryXEWs_y9rGupqv%MynBTbU&v%FAB z;ktk8X6=Bo&V7+s?tycev#Yb5Gsr1B!=01pm(A-Qt(di&`gB789p9DY{miwQO>Xdp<9utn0+(I4CDYE5H$edNCR_(Ts zL>}uC7~vn_Vm8A<>XI*T4ttYtsROS@Ha&%G=|$}Ze3lic_^u9mywp&Rx{_SznX$~F z>_nc@N>=I+`N*R91~btD|B=hA3Ug>xY8tL)RRSC&!*C=kPv^bEL9Snixhx~dreBB4 z@hFwbapcX8k)z#>_3fi3PE=tnT+OT0b+2-jbrq(Yy%t>Cn^axv@7Zs-EUXpF;zuU`KbFn{Jc_&P z;=5z3Q4$F5UMNr~6o=yOT8bBUcZ$6@6fN%Vu7%?6l;BPXaao<6nf-p@`JOz`zAq)& znfcF^bI&HRlk&-9&^9K^Y4TaQrF@E>pe}E(#5{R4wFNN_&G9F=h9~*oC1KXj zhjo<2DL+gtnTEn^A>GQ~ftBihzv^4&o8^1t8|ClHb6SqBd8aWLu5EqhmQ9GhS^C@Y z-}xJjnLQ2w?cV`+&doDv2dnjODyk_|T@RT^9;Px|tp5o9+8FoHWybvA2K3Rh*m^b@ z5C2wFG?T#-A21&|&9p{fQ;(Mkwb@+KR5Dn=D5nq8jKJ$aHk|q^>$-l?n2ZzUIa5n> znt8J@O6B8R5Gx7u}zj)C+gXzY8BQHMBE8zeAM&B2vztr|=|I_}| zRg+z9Unw_IK>C|zSN^CI}C(TVE)0yxoUbsfG80sj_%dw&6cK7UvL zYyW0-CX*T`D7K)BS`#(S8*p7qpPe!_QHwAAwOm|*xU{&{@qq+y^3e49?q2>QdSPLc zlFji)*raSfUf8jFJY%qBK={cc%c+wABa@-p;8*tqaz;T6NXg++%BaQ3kmvmTJk zz_l%A+zG7oFQDu7Wsb}!m>!naF!fW)my`jiJ<=Yg|DCzZebf8Nei6|Mv z3_T}%K~{)8rJV9c`GLGg&MDWHeh?KQ05Y<39(7$^x3rJw3lPxuGCRyXO_*Zk~uN+ zOXdpK9QS2U2VXh0skYE~U`iLBNcEJamJ56}x6Dyi%8R7cXxn2zX__;WPk}49g#N)t zP1KC(=qsk?ZcvWh-&qKS;D9{F)jkb3fhEj9qnPg~cz#|n4;HG3cImFvQ{FFcmn+L7 zq~F<%x(8$;UB9D!;Chd#J=MB&5?#n{ZcbALEtj5`dDJ*q+*jCtGD~u>udI>$2KSEn z!VuGZ{gJ=1TTZKyQ1f&Dx8+|LPb)l*di3w3YEPR!KmNx4IU~W5VfCL3`sAyQ{1Ktq zm*o08pQF&#BFl@lE&i=oi=wLw#pRowYj^b4@a>M5N_U}}(MSE{*^~JwZB)v!q??J4 z6TL}4rVh&(;Ym>c4BisQS{m9Tor%s^XCbG{zSdUB>QSD_uh|u-qlCW-r{hN>T}uvB z4;WN$qV}tvY^0jXh)ZRQb+G-k^JeI@@W&DVi`*9(9r-Fe7`nrmY-5*JQpleJf1oldx4oU|bG^AzzUb zJ0Ax9)#P?3+F7ydQl1)F|zxz6Nimk3vUjm3&OuWEp6++UDAx+hn`R ze%IE^cEOr%NmU-o%cT~gO?X5nehh@MxV~PitfdF82Tlc!QI~!T6u|rctu_P=lE?T8 zI_xoX%EW0PcqQcQ@=d9Zv_gD{8mTr+hR?+Or|5|kD)}+!&dY$Cw%0eJkD3n}cNb+% zLGu}NJ+>1Fu#0MmrSauC0GIv&4A0|Wd{a4PTTe!UTA0n^AJz;GVr9=bU3Q)q!1zFW~X5R4c04)i$bEjnS^@X~DI^ zpYjZASx4oNn9xNbr5q{BLsMaY|Fo)K2fp3+?BK&McbDJUe>d>J{j}mM2w4J~k_=%`;h;`-jBX7ro{H?lYBRV+mvz6gz!7ribR)>ZWR?D**(G%ZVMY0nkV!_ z$dr(i&VG*JXal~AhfNdo&1!q!M^6t=f@iqzs~Th6HlLL@+RB8K2=5fRJ6kZ@_-q9t ze-3{W($4X(wVDzOvQi;&i((72U$f_TWOw{ykF=Mwm9%EF2#S^2!W_5&x0pU(!rv%2 zPDchPKtx&CP1El;w0wfmbp!86r2N4=%l zgL%zQghG-cZ)V5ZR3)z^nV;IozRYpNIWFX2NTZM+om1@Xtgq!RVv6YjlZnl2=eXd{ z;h*D^egE?o^S)#AQa=2S_WR=fJpvg-xDZoc^CDq_SVg)hu1l#zSzZ?%Hd154H$Y#h+*jv*@MT2z{inK6sezo>OrA$tNbT8|Nt%;4E};7w9ar zyg{=VYXi~QY^SsQ!p@+#oY*tqYj;4dH9F6I?C312olyVqSM#;>&i8z9mvlFBmCn4G zUOjDJN~7d~Nk1e#OX`*KI4vb}nzvej9SOoMDcthWI-LDwT|?B+J?!O*&Gt5`a`efl zy4h00V?!F-7b+RTKfywJvA{#W&o|mv-1pYI&fC#j##`OH&%4ZL_!9!vjDJk^#lPgK zmL%&vTN!&1`x9GN+e@$5bG-J}wtimMCtevZbx1qUDKFOlb_Fq=Z!-I;;BW@_AoxpyaU!vDc>Dg^hjyQ5#hX+5x$*}#n%h|79NEI&h7XL$ z2>%xLXK0C#PmYgv!&c5##VT6H$+N|_<|JdaHd1A?xVNl#sCT3cN9Ks?AN@7@VDzD=JlV2GoC|H_Ja4OGxg^yU4g`H#KDCs$ysLM5N{W&kn>aQx zEwOmAky0vsM&@DnZf`~Z2qsA7d9DJCio>Sn!fWv-Ih)c^N#?ozAXYU06db2l)lRah zGF2OEfYb`b$aM=8(GqI8iRYG0`A@zmKa$_ePv!CQ5ow^f%RD_8qwiDu_-1-?@&<~o z>aLfrWA5{wM_#|Lr1~fI*%4!->8jw6J6a~%dO2P@--ombZ4i1i41HC<|G0lG8$Cbxe^p29-jQFo%GU28tdzTW`5-X7C)%@7Xa zG*=h>(rol0S>DgDjozTKceF==cjT*8OeIe;i)|hlqaD{%iFZNMEoMAl=!AEPUb^9K z%(AOV@nRP?YQCl$DsJk5%S%CHFB{5Cu<~ZW0xZN%db1V|%VGf>+=04ZUvIR)55sFp zH>V0|Vyv`8R%K0IAa9Twh-=LM1{3w_+BenZAMgLozto?J-&U+zi%C;lpp%xYJ=9+s z1(@7T6B>)N$=d}5JY9_{?Ay)mTjN>lF6z$iZtp(iRy<8TBR$(ZUp&*jQ+;+dr?%M` zYHlW(Ee&jvBicFL+0A*`@yY(ocE-BE@*8TkwW4M&XKHJV(5|SR{eyibUvA$q-**3f zK3;jfDw^lF!M{!IP+gZ3+e+i)RmxOL8S5zPAggZaz#jUo@_+1mTqah)f$=g9ReOYg zg-oH1_)r`zm6o5$y_NmSCZ(LxM{Xm zMZbfd&H`$AP8!DDDIhnJ3X7RkTkqgu90Fm`^@TX)6xDtN6KUw*=xagL75y5M%JrJ6 z*MvRz1D*6JAt0<1YfGVYh8vZtmR)ejH(1JB#wk1Gb8yE)#m-=$9l(Eg!5S_OLY4$$ zs4yJN2h@bi;W&PS$26C|VguTS(4rBz|K{VXJ>s%cwj2-Tlq|i~I_^oX!V6 zXfd#G=9vC655qTcsrVjO%QozEJ0@M1X2Z^FCOioKs?GL3Pam21J?hj$AB7DH zs~Wn>soA%(BfcqElEr$#VzykCzlclCs?kad`V08Ny_axIyy$zN_SCDJYKRq-WNUXv z$Bd)){J`w7;%re5OB5PuZ4iOD>k2 zkz76XUE0o!L9U#hHC~Iqm--;kSI-~JZq6n~$j_82)_k^Mwz9UdXcVd|MZw^+c24aF zPiqhFXsy(ge3C>}TGBk4llB-kZ3(nKt5Lp1e4pYj(%!0t{1d&R=aDNl^Y_fWnME>3 zWTs`FcI|b4@HFv#^PdXr)=vlDo5Q6R$~^0BjIRrXg+*M5RHAM~B}R3Q%AT!k#M#gU zN2b*;|0EtVO*U3)Z`8*AQ{KX!*)CVcqV&;ek5m6mZId=7y>wcjWE4fh**F z<&N@Ld8Z^Q3Cb;H23TG*xjkF2pVIlhH@fSYfgS2x|9W4#cZ#=}x4Cz^_r15PPxBpO zGv}R@XF3vQ(5A+6&dDp7j6AByo%SbKp#%2p*D` zVaHw9&lnM)So4g$>do)#?r$2v)6>*aEXg?>u3G7PQf4Lv62cPheao8=pAeZeCRtBe zomMl$4+raxH`!lNn_*lv-4P~Br{$r_L1m^=R5>OOk^jK8Y?Lz0GSb@J=CQ@t_t=hG zn^|_sUKAs(@rUS(i$jX33w)C4FrMwEqeek}N+833$al}%#oNw%z}w1~9|o1Ceh%Db zyX{yi*IaNePnpLHRoTL~M*0=(a2xCv$-38C#5Tq@5trbV*4;$3?DA%@sBnuZ#AG<= zUtrtE1y-Q`tqIc9pANDJbKN>H{riE<{tSb58~AKGQ`5mXosSGHB8n=EDv7lShUf z1>=9XV_i4*5}Si8)v!&pZ?iYH2hQ?lcSoLn<+beHZy|@3-ud!p_ zoc(m~+sf3^?pXDMX^Q1W=>M{h$d_33_a91?fBjRnitQ^*C|j;%j>3=g+|AxKVysiM ztPx$tOMe+xsg%m`i68a1p4Z*qRCzz{%Y>vQt|wYwX`S62+C4&zs2OoSEG+blGt^nk z`P%t4GOoAp`99l%qmVW1yPHd*8Jqb64hZ*D+6Xe^+fu@RIPaJkomBzS5Zy z@;bCdSdXwgVT(hbhJ18BbNtV4x0SY}Nlk@H!MA~yzW1&Z=|xhTCAUwindC~UmXesd zHNAf3O4o9CBhO>c0BFt7h%$HDz|E4TsnypDY#Hvh67cvd+2+CSfdM~$R zGvz7kWa|SQK6lESB@G|emsGQtr6~N1J4>>d+q}oHYkm9$yuIB$Tt!?fUF+Ol&uHIg ze|9E`CpjG#;egf(PB6*Bdof8iThnb@9Iu?4Ltca|33=)K*D=JNWbJBsBDa)Mm`x61 zW?IXrtvAqG2ZpK3{qKBDeTFx|TNPCLUw@ohO`D@XWX`%AqppCiO#I1aXu z&Va+sF_$(yG&btn*rvEP@F(2C#6UA`vlhU;dn){@DEQn3$l04r?aePi;{G(ZHnlOv z1-^JsWY$Z)ny@{t;HUZTZSVHKo$#*t2kG;uue}mar#5xP_(P0hVrT2Zke!j^a$L#X zBfnf|N8#uqLkk}&m^=Ty-1ZoEwo_rhJN(Kt!DLMK+uhI79Ler)H@=>Y%ZTeApF8nf zN_ggJZx?N!X^1q<^1?RHam+a~L=9;hx<2$8U;hiu3~@UbI8NH;St`gEgmI=p#$9TO z0)aw-!-2zEcH>HLy?Kr}L@vjSu>@YtvU9X^rL(j1hU1leh0P7Ra8+z<-ei0U{OsT2 zY3XW^u_3K%>gbfTUm+vWIR>Qi? zmS7X?3AX*VUu`F>qO~ZSoU_Rp;6S&`UvRiOiJwYaG$Z|}@W$}Z!mtL%8#&N!3`G}~ zi!G+R#z&q4#9cJc13Chfz~Bp{wkMDme{aTbf`;`&WtHG|YP4+Q9a=?VRnH zZH}#m?VWY7^|PgcWubCJ-V4L{XW=%rcdEWc8wn@oqQ9#Dqi+|pk5#-Uxkh0 zB&nlZM0un9Mg@7$GM=UF6P4Q_9Y&Qh8|}p%ILj# zD?CC|UzUmUZglbn-ZC!mh&A989Z@l?LZMcl%H%3K`JAR~!7chFm{nE0PhImehNR6; zd6zUGF?&Kve8Sg~U$4Zyi#znS(YO1FWl}q3X7`oQ>j-%)lN`T<)r;H|)g$}19MfV# zbGFP`HRrLIeK~y5JF;yG&mL0D7A5B~57nEi|9W4$m%46d4#@1BIWNzSbhzxl+h^JqTGv}{DY;?KIOI7}5}Ud^3!_1vVo_ujqi%mf zoZe@CDwwJ9D=LN2XKuEZwQaM#vc=oh*u2(6%Xnp%v|MOs%4HaVqUt8!81F`p#k0m; z-5u*1?n=s>lo^#7pP{gWzPoF!yMXttZ-+WilZ;`(z4(S~6efxtr0Q_cqAUrPzpbh@ zm+gVIhP9)mnNpm0zpyw+NMVvV25daH`3g$$Nx_B8$fj$X=;FpPqn-)wxGKG2eY8qybKbtE`H_uz~ET`lX;wtm#;P3k2z)pXp@04eOd%o*g&U}%4#8Q< zaxIvGZheFPlm1v6tOeOC|5TM!g&EpO&wTeZ*P+Z3nU2i*nXfZ1xURXAJWgMvU-zF= zdj-7kQp)46{K0Sqi{s;eMHGkwxh=0PovmxE>&OA2)|D37GF*8oH;~UV{dkC~DG~&F z2v>9u#$qw>f?4QmEMS1IxPk(_bMIkaNT3tV#m{1Y>AsYW8Co?aoEAA&+AobqyAlZw zJsa=t<7jqoUbLtl!A&|8Ju<-rc2)?x^Z=e0Mav%a!k> zx^4%q(HmWyg~{=IG$}QhIj>`mpEp?7m;=N4AiS+iZIGU-kH(Q9NPf6a?a~8eb()c2 ztif@pJN)cdLS?Zke8Fy@Rhi87(_j+5q$3zbw(#>bZ^4Rufj`PY^iM7{yg`tfzwnp( zk)OQ;?d)})+0XDVDw`UK+CS!!o>ka~`@mlW879_+nd3!X=RqbUe+UVio}vRisE)^wVV zH3v^&hB$yb_!17~05(8ZBhZ=;`nmKfFu*JUih@Y7X~& zl^qR(cvJ7B*KsxX zzEF1>lUV$yT7PsbbLI~T4O!?+aCCOWIPw#lk{k`3HJsZWZR{8yYnh=j#|Ef{+xXRp#i5_#edj0*|*sj^!@1!4$5i6t^bY`Z;zvSBLx@IxloiXqC`C)c&vNxm(%p!g*^ebru?$vKz^PC;l{V zXHPNrFjr|;FIR@^j{COfj`yl>gTDtGG42L-YTNWzMpe@pa|LmR^glVbQUm-vKP*qL z@D-nzET@rna1T>Vl~Gl9Lr47r)o_+4&Nvjx=gix{|9VL(nX8oij}#6wuC*`$ZEY2p zitAukS4RWA*wBcSbI{W!s+HA4{&xPK{VmWT6=Y_xD9{D2r$9|P7%!Xw_|@S9i9-Jb zTE2?HNOn}m3zV;7DjBxBpur0%Y|h&L;4tBkjzW7Pip?hEd4Hg9AW7Y%PF3fq7gbvT zc3U97Hjw=qk2IH7lnKcW*p}mA4K1Qe*}~LjGIM(!C0N4V^H-KFl4AY(Z#RFPuIzAfM!$(S$>XHU`AEq`;LT(c@B5O z*ZjJIv%_Lo>RJ1ySHhvr@&#>4gq#D@Wg48*7O;bUMDN<3CzR!PK7<_cmY?zoAA+go zDtMb*ASSLvTYr}!P{X(XEpK!G44^zq@(~T!apTv>j2;X4{Cn`YA*B>?YdGLoqMm!NLNw0yv zpIs8{@F@ff_yUTf`Yrr(4}t2BmWTGu@D#=0XzYI3U=3f zsuevY)7K^Di);Dez?&nlroGDb=I8elJ~#c=I>nyZ$6G(})tD;`RbuV;!^%b<&lQ`$ zbde&(r<8~;Ar;$IXjs0)ob#eLMl=l_?s#GiQJxB4jM{3L`$Fog1b^I?&&57({qjD3 zLh|*DV!jORys3`3PZwE1r1VAUmW&Y@?=z-nj&l9yzV0oeCTn+s%is%bR90AyTguV_ zrb*95K|D*pG#~Y775OUMryg=Q>8sGtd@;BNtz8Kt*{E%LVICx&mL|jKiIHv64xxnk z8C7g!)I;5Hq=>+q#D}BD2)(^lBhZscNVNJ`Eug*D+3;&VAXWtd$z_>qIcB+U`E1E% z?F8mw!L6pM?Sr+5)llZh*Tk<(M4KA7v<>iF+pE>pKh(RZtpxm5+UxPS)SV^UX2(&Y z3U9;^-iY_8^apdw|3V%6oHwN*I*s{MU3&v}n7Y(v>U=sFWHxwRC?XaW-{7n9kbdJ0 zGscme@+Nqp-NHZY43)riJrZ?Xrq+VF^FlZ`UvQE=hZ})xj-VPT4dd}S@6>y$+&F)J z&*JoHNp-%~`S|9|w3l6TM^4MpFi+nC zM+ytYS{2_^++2KB(Mg3L7TBHFk;@-FFrue3UWqZ64-9Y@Puri^CBAvw@h|=2TEvGW zc1n4WUeaCMcUFC7K$8`HAYq+J1+?~1a6w}<` z7pA%^@qrr|Jn(Zg9G>L@O}~#rEjHD|mBv zn2~kyPlChTOSK0s2S#cF74T)<9uW&SL!FW#n=xH8P}v;tDZYc={ob$M8oqZGUC;5*cQ_7SJ~a`P&gc=36D?x-+9!>WWa^q1LMfq_ z`7nNBLz#$=VTLwK&p-qJci^R(SDoe;{1<%3eVTE5GB(VJIXEQyo`8owEuhNV za1QQDGe9OQi+P08rbOd`)>%F3{pc#4u_1Lva$=%6@l`^v#QjNAQ)1I*WDfC6@o&@a z1x2xh(%4qt85OoV;#9V-(ZjPRWPgyoRCYOfMz+HdTfzp1$c`D-JFF{ai>w}@w)B2* z`7#ctmrn1N-YnyG=0UiHZ~b=z!{Mf0fCpy>?Y0QZQEk2yC$eLxk=#KpDxZ|{F_%6k zmeADzk%;h5lrS8 z!Mw(KZ6@l{ZvJUFU;X60?3v-|`3C&vIQ6l8R)whX{#uGgdqgqD_<0O@tV~vZ?GyAe8NS zzf+knRnydA%-%<8&*=5)=*{T^TcNyMOJy+~^-)6bC{AG&s2+YpKT$ziB7Kmm!eKiu z-v!~AE$5Zj;s@G8yox`~3$D5vek;>Zp4JZbB@U0#=7Y>uP~ZE{^RAiH4(eI@fDeHa z+7(?!vwzWiS7?AcM+&DczdTQf zOReB`sg=x8*6v|nvRBIYxyblZf0YfEJ6Qffxou_Fm9~{=RAfqly?OS<)QhSX*4K7H zm=w@5A15u0d+|YhH}vhtccnfZ{CYjDVu74$T@k>M!P7=c(pyPov$(HNlbaYADbH}9D8jz54Qw0APn_GXj#OK*bEp^YxP?$>@6-0c&PfP{ znWNFy9f5fxYEP8BDo#TE636$h&ZeW<=2b+ayKKDNtt}5MR=2T5t+UVSd*@B{ z7NG;m@Qw9nQ;(~C0x`Jm%%_L_YK+54y(wt#Ws#w z0UDsZ%unv_iBD60ln13y`xO$$i(ADb;zF?#DBU`tFkUEaK?ioiJSvAjSSs^_Ebp-| zC+3@#~*1EYW3=H6|UilB?|%@Zq87rH-HTl$90_L zC+wkOna8!&!$T+;Pos$4bN46Z#CM z=ThM!Q_D)G`SeCpsKL+ceNcuSWYQ>VPhhFW(iLse>fuE8pRo~M)_?SMgXnxl!LX=d zE=b4cfF~o+IlRDWZ7eRfS?;q#@hopi9kv{_!o>Y($Bd{qu9xMxO9>#%r~ZF)LDoLm z*Erp}slM&s?_Ypx7#TF^n|A1_@CBV{Yd2}jag6Lt_jq1#h~0%%rq%ia{}xy6)aT#s zf8PFn;hTG}dcUgiy2#rv?<;*y{rV{}EN!GKmp{yCA>OpM2|b!^PfSLho&}y4YE>ku z$gLu!iaoPJey+rccZw=$?#UK3UO!}7cZ~Bj} z1b3pRA#?X`-uqskFQ~rKdzOiyp%=kwCs1Z?f4c!`Sr7v-!Xz(f1N5@T^IN0r~fy7J3Kqy%B4`AX2MXVZRC zd-`^HLfxw}f6XYAUOH`BYD{W)>d@4(X>HQ~&FJqc>Phmh^#2gpszn*IgGJ0=g;Xhz z$6q0lVcxJ3;hV!ohF)<#wBNSIEA7D4D~bzn*<|aEsafzgn+tWn*;m^W=W?QR z%IwBrTd|0ljBr69k zv#ix&JeRZAu&cJ7wq@33mifwT^3DS)>V@EstzmJ_3N|&qXng`-{QvX);oa(~>uKvb z=NaK`$xq72GM)T zuFVlr378?Z#r=5U{DGFTIvy6CafbZ|^`#z?v2ME+Y;zCEyT^+?Cq+-bf+hKknXZU_A^LAV?1`8a5gs(1N-4|G?#w;Hk#?{ zAPSYJx5DwnTtm-UM}LY&X0w(K1AUS)38!KwN&vj@jp>2kyfrf>Bn^w(|9<1OiR%?NAbxk^pwv8>IXt1hH@-7I zjr!!1XSTPSf0(w=R7-Z+n})8An32sKl|Nghh;5-C9ldP5ExAAk+sjkX8my6jko!;> z>*muqaD`Dp;xmKS(S7r6w23iNTbx~LNmh6_W5r^)pH>m3nHQNl2jlhn+6;BC@3kkl zdwQlV<9^zW)R5H8DRWa^q%2C^o|Y>kHuIYMuJ^kCXkeHg5nOA^DI67lldD*Y+HyNm zoa001hBi!Hq?U7x{e-o=#f2+Tf9aiAPaG(eH7^d%(CY%&>YWeH&`!jzdHsZAkJP)+c zuHgx>SpTa31d@9Wo$=57-ADK}A2n3~Ir$Ma`DH5N^_-cf=60}rSAi~1W+J4UT7W;C zK#9=X>}N{;0fZ}plV=9!T0xeoOjc=+^YSBb3=0Z@rJUGXMjlZ1R8;(EzJ0yzi~RhVFsCe?alDoNA;(V7FRcRdJ>9qZb;Y9#&JSM(PHB3yfwj;_ED zAo2%&yaV&mdtDLgqlPTaM%i%U&pWvsk*E%Ho&U)xQblPvTd(cRNTN}=%%J`;z#S@q z+ZRXCol8HC6IUN?n08DHYJK$kdTH>ihbS$YFc&-k8%D&Tu_0M;Jc^WUY+VcB6tM}0 z;Y`6tO}_^|_gh>lHj6`<7)Ikd7LRx5QP}ZTVF;N1Ww@;d)AsAyWU^#mZG<)fbf_`T zUuCo@Af%&>!lnvB9Z68qlzqx`skJ$uw!&R3Wma70cdcGzJe~45^6}s&wVx?3+rK^i z(e|}iV$IYEnI(P0_2Ht~o)CU9hdtlG!qbcYQfgi4FQo^UUR3I@lIu%sDc+~pk|M_o zF3Ovl!xgSuH=36EwxxGVs`sr$e9Lc#;W_L~znZzrRRDi0d)lt#w~0d&cP8yjt?YX2 ze;6DgN84+LTnRlE+CQYTBd4vP<)Pd~-YTz9E?DBMM{Jq4jka6XO_omh6Ze*qVI<|3 z=1MO3QGMv<3Zp05PUSL68iW7J2>kUn5|QSbV_?h1YPACY`uqAycm>ZVa@w(s1L@b( z@}yl&y`S1Rt$2EyjB}Yky7zb#UmO1t927d}xtKrA7Yi$wtTh}BL#~ES44V{oCUka) z$I;g=*fjPu7iDWhSxXSMcu)DJc+}iIsA@0OlK%X@OE>`B^gZ;yz)z}z)%B zYqO2HiE0WI)|SE-T?oHx8a{*PnCqUyhjb5!R~J@1!CF+1>`|odv>s6aj{;ByjsXyLToBGvLst=_IdWv_766PExWZT zxplJgKjpe&=XwR)C)UejCDdp_UQnZ^RL%S8_an^D*h27gP-8p$yuf7;^T+DGz*Wr# zLUD#|1kxPvsG-f$R^Y2tT}un>3QP^m zg_qk9&w|Z*8@AVUfp>A34NAwUHYHF$1#Et%P@Vnc4Wy~kVtR}2QZuH2!==@*+w5{~ zHg?aH-k|jo1-rQ-s>3?e13h8#+VD*H1Exu7vVcrS2}nvd^%ZgV5Lk>*MgYPyi$Ja|+5O`nj$*GHy{JK<_grY~Af-g>~E zo_Kcrt>J24v1cd|zx({CYipJ58|8~4YH56)IRD+U?8(5($er?!tf>1WqyJ@BPJ z=@0gR;ok$z2%?c}fIe>p^O1+JBNON}Kfkj%7PKoSK}%8dQ6A`Kr!+E5UvR zg)MIH=^}3MB(nCWzGvfv9j#kA;&FXGVH3WpbBFT5%1EPcJI{St47xR$DamrCB@dY* zWjWQ=iFk%^5j3V-)jUF z)$eqW{YM_ zuEA$T2EmJ`FaHALu_t>E^1z%NWbDy3ZN64pivj=13_K!I6$@;|5pOqo@G2;kxBBzZ zVbu-%6DY`D=Ed3}?VVPTdJGRZV8!rrv2vD>>79kZWJ!`Ht%Kc$a<=uc}(dV^VSz(3fql{@en-WBd4GU zTQ{!I`%I*Ee2+%|Ij(Fsaqt`z*cqs-8DQUx{)kMIKn}uiLGj`FdKc968?{LdcBcP< zrZz%2Yi>+d7(_oGOWfVeshGtXtAwAyX`EjM!vsD-?Anam!dVcI-e3m5vT0*IyQw01 zcYfk+G585dbXpzRdG0nZ;FO*DzVm7zaZTVoxsF?Y74}2?$W?ttd$FJ0e7nG;4$@Cg z#J&6z%Ki{|H657l*n*MVt0ug$v-u=*xHlb`5tQYt9!SJO-uaW%m6L*Hf;V7eywv;S zOYnfMbF;P^CVYxkOdpFgMQ`fzBlr?LWJ0?V&G{Am=YY#w$@NQG$E3vgYH>?G2R|+S zTp(^reCNb*DRa{Yx-?G>f7L*U{>a#E!e2^SrmVA0vH#*c5t13|3p*d)HezeUk%*oV zTf+N>Z3!9Rcx|nq91=I0E19S4iA){EcKZK}u&=CQ5dr}W_p%;5C%$VnTh zhP&YdT#Yw%G-{X!aMkYN?VlUp+EnIo@7d`$P#*~^=pSZVark(xprTBKq0~!jqIE{? zbcNcr0{>rKl*_92g4uYIRujL$=G5vlK)`+??qoCF#C4$(jL@u}CW@z5gGujexWK=| ztn=cvKZhw=Do#d|;9(xbt9&nfxi?@}y*cG^U|penIup;fA)O0KB85a{ zi}D1m;P@ft9?Z@v>nGLA-kGi{>E%+^C!YUyEPh)2kKYy~Oi21Sr6k@9uib9%fBt!a zJo-i>hOV%vctUER+_f}hCil+q&3QVcT4=A(e4+h9es-?4@3sC<=_gGQI89WYY|=B; z5)O-Da$Y*;^YA8n%B|TKGKY6@uuuZs{3W@Jr8^V8PBzUdSx+i4@)9wZU@^A>Aq{6s z!zGkjQ*n_xXnLQ^1ynyfhn7g%`x@RO9X-}T~Y!J-d+`ZAbfL|n6ou<>h zsgFnBUKn+1F1T+d=C9l7Zi;ECfqQ7@p9M@>Nv#Y1PJgloqXWJ_IkX5gTLZL9S`AbO z73nEoFc%CMUr>{NGAuAZ9t8X2xxbjr07X#{-2g*9j$8Q|a^!l>@d8j*Gy7rk;XzVO z{D2$HA!aiZ;X0(y3;s;Sq?!7F;3mQ|^P)-J{=JgRPEY@VNO^}Vx=hb{m9y}IIw|md z+e0)8v`?J!snj7kct1ZAj}xfL%xw8e1EpO{{Lal>_B@+=PEZy3jDk!x+i?PG<0!4+ z9dVtr`k3p;&3oOCie(Jm$TitGc*iUSn1}D^w2+xYsCzB^FK+sr5Cu23gUD;S;v9{Pa~o(4d%etJknUg zPLpe3TT`{QI21J1Z|a@7mw$kMSK^tSp?)-o)9;CtR#Um4WK7i#svCX7JWX6pGB&1l zNnM-LEoEm)kJNE#kJH;RBc2KmaIW94cGQmQKBErqeCu(pI4?odvckz4rl#V9aRv|4z!KjLlv+33W6f^Ae-#ldu3>{_}?WmyB#B8 zR?F&iARDQEtC8gnz*awFUd=mHjaZnqrNl!-`k8$C7d=ia=P{ie`k8smMf}WHa4kbo zC$=E&RYF5wlrA!g>v9wM4}s0s#&hlpKe;Cxa;kB9z+;Gv&%SSY%cOEXMy6~@eUMHq za*_?pYluG6ap!JDj56aHY z74lPsN3dnt%lqYH|6L4olDb^s@AND^`0B`4Cr&QYE24NjU1m9$I^EbCkyRPzF(k0v zBu36Am#?A=YC;cinx_|mo5E_Yz847S5Y$-9Ia4_7&}CJGF}i~%lpCejQ}T7DR-9Vr z5Gt(-Mn`J0NwCqTQ9Eoj?!r%PL6RUxA{7jzo3kSsY(rS4Pnn|;@y!Ew3L|+#xUNNr; zF4J9sczAkwaZsvl%r$)yvda&ZbW0nn-TI3qT=^u$;R8HKjAHtIN@;H0YujNL9Ea@Z zZ56G*D?_DqLJ@O5YU!=`!W?2dZVdIoQz4d3I5j}`N8;%j$)>ZG@WSGmrVpWhm_bDv zjrya$`6fNiHDdCAbVYeUE>H6YY~gO6(VwvIA)bCIYj*Gto>qJLlS3c{Cr~D>V7SqQWI(CSAuy7{&3-A$u?%n*?t8 z81CCuL;KFu{z!*fk-Epk?w7&52~W_U{LMS?0bi<>bk6y9wQKT$z<0fTr0LOma(dNAGmNd7quXSB(@k=?oOEKI>p zH|gOCyEum~kdM!7D7(zrT+6wc%db`VX&qvgcZ?lROR2qEa{{86-APOmN>PmuqQ_oD zUoe7dykf8*e^#8kITLi&N-x-jI;bd{H~t{rOyNC-md2)pStu(u;1zZF`__rZxc0mz zB45d2Uv;P5MxP=?e5<1i!^i3notH=RW zagS)iZue&7&g(FBzQLdv4PxMd|B{a$CJhW?C!NDguz?Nq3ip|Ue5S9z$4^{Gl$^$& ztl(Pz11%^>4Vtw(GHWYne`=UsyrF%_QvLaTD3jQ6e9hu*T}b`7m|t^=>l5K#_NIPq z#C89~)fA!f%}$Jr@yL@sK$hwRJhix&1M&TQ-H`btoNj|9^=07{UT{UEB5mkQ@7D8vdn zm)T_IwlMcqp%L*jUaSSu?v>i(&hbJ{ms8}M@}JvZssA5pVfaLg-2h8RpFJF@Vs_x^z`agXLsxmyX;WyMlS@t7e zWpPjGsL#=l!ceQkCd+F~Fly6%uHadm;eMZ`H{MH*-9}AzfPcUCect^B<-%P!yX$xY zUHL4KWq5|Yd6z%qGqCPEn`I|i-Abx)Hk5Q%-UL3 z0=)7y*w<4|te+075~p!K^{9{ORDbH6^;8S}Kmd|K(>CyCC80(-XLiEQJw}HX6}+q2 zRKaU=O-nzR`X!}K>YcO>nVUVos{iReQ&Va#gWV3HVm;C@UW$rPqwysL<+}@Y|vie0+QORbBu@%P=wU%wSEqenGh}`lk_zZKzSwdg)FQz=f{6<@5BIC57RIMs}mvp@^dyZW2xIb~O zhvBJ|lWw#TvzTO~A#e5$ogT2&Ngzk=5^4{X6Pb~=0#oed&4z@BSsxlvBf zXQx08wu4lpyZMASbQ>7jL(C`XFZ6Wbb^|AyDmIha9x z^_qCU4<7VA{+k(0q}!p)Y{?!`4|rQT`R5Q_d~J5$bpYiX3woMW_1D1J`VbN87U+PB zifE;=fx4$SQO?Tb=^83tH;B_XqQo3flr5kFwW(59GUFUY%pb=498LdLnR+Z8*6S=z z+plyQS-Z5?QoVZk)2eWEno@C=;)=h~Z)^o&9zopd&wsO!$<{S`zOQseSvBZ1y7*iu zlAcnB-T}=_B70>c0_UY`%wm;aCqgX&P3Q&oRRdhdK~#GD{Y^YcWO{C-!~HCcJ63IY zz6FD3W?-lItmCPKvV2C1!Cx`-FJ$LycpJO`$1a7QWgma5G>HA5Afmg$YfsT5{RiJ9 zhU*wWZduP8_ZOeIB^9dB3;CnQF9^RW|t|Sh0NG3YBA+Ma^ z97wpMhtoe@VyjSD^K-se7Lr?(IR86+;|o&`s@e&>fvb2E#}Lzv7vxQ9WA{N}@Zv4re_<;?02|Tq}ItMRoh8mo=6=bguWFs3jq0YZu zBOi>RPA(6okc(dx$O*p@=_ha|hY)2d6Ym13klq>bR22n46ehzr`VWPGgwEPR{pVsH zoxl@uQ}bn~7q9*ueQpZw{v&tB3fn%b63BX9KaflNk<%8_`>kL)u#n$ZkgKk6pDaZD z`Y=D5vOg*dnVLn$6VX?mC*D0GI+YmDc2#nMBhYRO$lvDK{A|iu`7xO7Wr(a8i-hCh|@E{&^PgY_m4{ zUgEA);~b^aF-u^Czj3}U!QS%lcd}FrtEdAyao@U9bsgf`tAOJC!;>~Ko%ujLHk!|p z%;)$Y6QRLW#2bmT67}u~s*uz4{TD!GX41zL;ZtPsns)Qd_VF}g`3ZLJTS-n)7A_y; z-o|p~Z<2?z*j@RUW^|;}90G>gj%&`t-%sIB(&<9VQX9>p%09;@*-A}T72f7yK3^;D zLsLHQ4zheHYK^~$<=coi-N*ome8yG8vsF|qsodouJP&qOamo(!z3Op)UyzNC@f1FS z8`k70{K=J$;TcCWe_F~t&N?}z_zC05Q>i$owkK~-<{j?F&yT^=@-@%zF2AQzNtfa8 z_2Lr@;ytg&99u-u|AZ&=jH`_1{~6Ecy28)DLcaNf({zm!n;Y-K?aY-Hk#k=dImvei zs7uN)qZ!EgZ^?a9xi^Qny3@=bD)Ux~)Ioofz3~2r!@t95secSCQAhcY;%Pj?7v+yo z8wYl1nR-r6W|lT&9PiIuPWc=hDaw<%9~cA4hX0rvlReod3sbEPZpPD%P2fo*w3gZ` z?H9d_(H+iFoY^eig*p0%R1W^(PvSnI7MmbSQZX08({7nmMxG=8jlbq`_LY4QzHqXC zBVHwQmv)$%!OS~_Gwcbr%O=CG8!m>4d*M>UY{V0}AXpL{J35YA{4+ml<0r(ry20i2 zt?TqZ^nPHjFZIeOVG_S9{H9TbuBF~P$ou^t)vk#SI!IpMPn{MPJOaPc#72kz(Svtk z<3bO%%#5Yqn9SFBa?BF;jV0piu??2zS~h1bW;#$3u3-awhy9=%)0k5g<#}Yyfa-F} zhVTq~@NZE(zeCg?lZY$FI3IoK^m;P2?8F9RpAbgIb+J2ZF0<@Nx`*pv@LQ-x#*&@F z&Hr$ga6RGgw&oO#Pz)s4UE-a8P|FGd6>$cGtTHIwO9C^R0zxrl*2u^Em^52vDj{2Y+B9U zkQv%T+~3;xeE0w?_74p_(np(Qv7wx#e6U!oGb}@tobqXLE12Ck^C0%j+?N_E8!c>pv6U4*q=Rc`^-o``?m zI%>oN)R><@)t71sfp+YOxT(IuZFpQDInY;&)ygx8+Dun@gNa0<9!*8Mm|bwce6J1* zgY~r|`sQMigNlHD=N8{>H=SapQHkhu5){Wn9C^lhSH#5DhPDVe&gk~A~^hg+{*QhG)6SL0}6$=p&8gq_2V@6%$;Pi z{vb7pocvxyF(1h49pXYfr>5+8gb!){B@WF>2Pu<&QR{=AbxJ<1hJ8an#Kc%saRPI?*O; zC;4@*SSIpk;bxVI!ZvEIM`WA*MB-h1ii_Zt$=`FsFT|Lxob29YoF??QxzJ3ckO@98 z&2;geg%TrWy6;Q$tZhJ9KcXqx$!9wQo|Ls+voASdAF=5w|Hb9+`Rp8X)*D>?)9;b- z0x^0mc=7}?#c-nNLT207`Q8dytqeIdYq}dnwwB0rd5Nigh}@@nHeW!AZ<9@ilKZS6 zxc|q}Ie^FUy={00i@0slrm1b)PHj82jnuYn+cti+QoE_mv`ypP9qf0X{eRb9Nt8Vi0WzP$%bT)c)Sa2NjcdCX?)2Ik5FBD;!bCK4IknyZb% zhkg~!<%8ERvy={R?k6&*vqX@)Eb`P z1V4R6Q&W0DJp4J&JQ4qMZYEGC<1Y&UjkLtp+~+;>zwr78G~#}=sz4d_h_^N8->G=j zZz9EIG)E?$HV7H^4S9Bn9Xo>@c!2H|UO^jA?2kMQLr>O(2j?*z;TA}7KltJ=2xhoB z!5Bl2{1xtZu7R%luJJC_eb0TDx$aKmySW$NcOB$Q6khSY;QG__kK0Io++?#Dk^X`B zepAzJGZiCLA4~t?ky<7!*Cl2q%RVWMQbtv+{pkc*)_PN|tX{{HREcb>u~--7 z)iqSwe5Vs?C-nvrJ)CINTUJ#T&36#{DVLl{j62B)vl{)eOorf37j%D=9efTQerMM$AR2%8 z=Pf(fmMIv^u*1(I=?$vO2VkKD(|u6Zv*350uYb@hFcrjw4L%3k<|$W;BZ8G4Y}^5_ z%TDzDNpOB|`1n3nZbi_s2m7Te`tc4{cq`6(KX;A>bEIY;7lLh@f@njiOrMG78-%C) z2^u&KNnV(I$tce48C)z7+!A!jb+G;k;$34v2=vhbDQy*TBXZb&N`=rAjqz{B;FB(l zXS*Y4?g5l_0u8U@-RTAGZv`XF06B$%4woY>8i74}Lx1n+>ee6Y;xw=IPndwix9U2^I7!<>O}cy#xZMVJOkosATU@ucIV+OX1rcxUQB>oMrHu}I8Z ze8!JxaaOGEQoM4YRTJTYDUsBk#Sd!q4RSC*y`hx>uI%t|c(KAlw}@Ob`0Hmm_F4+aIag!jrJ z5i+31RXCOO2l6_6p+p~0PBOCnBleKU)BnrvQ^F2X`vu0`jEAo}eR*TC%pPN##Iyg! z@%8mZ^Na?!waXz8Ih#5vBpNRC&xg<%rAj{rgPp~u^~pWdk(U> zC$e{GkvJ)Qq6qu94e3z|S~!QSw6iBaIiCiW`*=;3n@Pl5UQk0=NiRk&-gxZwoOHCk zYXmU4dNiJ_tN2L+S;+vdavy}BisuaBxt^gP`g-z{`E&pZ>I|~#iofTXS%Gzx#fmKh_e`W9Wa5?%W5S!%>GrtdW zlF|77YZ4bN<=GFajUnc8hbrehSo}-yQXM7^(2*Hr=fQ#LnGmx_U!>2{moRbRsctvw z7*p5>l`P?YLKwG`3d9nsku^>j)`^b<*0b*W=&AW%Qc9~2ZEcvTVm*DSxEJ!Y@{nhm{!oYZ8h^KU*o+=L!_cU zvAblmDpBun5aL9zW^oX=tnbjKljj_-MN&l`ZOk=GAdl05*;=rpHm1)}SvJyBs~^6ENT{YKu?HQWZwWAAan7y;(T4_{Vtcw> z7QyD&2R4c0^lBq_W6giq;HBWiJ;;<$=(;^N<^<&II;7Pttut8TMPeY)@Nl^C;Vktr7p425{e*sa0V)#>< zKw%e<(V4-Hxsi|e(N!&=JjQ6@^(_V89O17;u$%jUjKi_3-yk9TApi5Ab;@%3^Z0x$ z{*zpIdTdnwZ6-GVe4iWB3w3;oZ~G0Ril27_B>CZ75c`4SAc0CUL_7nb^OIaB+6D$a!e4 zAd%hk;Ow1vE@RD{Sdl|{vIzJ(fhQdYO}FOzX}qiB!3O2=S*%3^PT^$Jq{z5w_K~*0y!l^-Q`PNiI?uvM^>#735Ir7A{kD+1{GU z+FOlOy2?$Y0rclQ&h8wwT$C*Iby!aEk!#+yb?BKJMmy|99weIa2=DeNv_~}4lI|MROqlhdsf~O!Kqk!PU3cOCo_HMw;$^r%wpcI` z^^(NabCUHLj8DB39+&Op_O`}H=K~I!glACXpw0IBH~WJ$7Bh$Uqa_t`p$2pm46>O` ztl~MAQVTSBZ9H3-$Z}dj{!9nx?FLrQf6_)~Z8c=)^77R{>L<-1Qo9JPkw#hveNBc& zn25*Si=pe^o9#L0+Qd??VNvY|GZg`eoyM}+iZ$Z#)P-_BSh8^Urt~2RqYKmm?*9VX zDFh8(VDWTezd3HgfiHPRgghRe0nQ8u>y_bX8QFm=%W%6t~IjiB@)bp|B5hM z;|9|5GoF_==#Ja?Z-29zV_1z1!HNm&=qJ3lxxkp)z^6sw(UnNOBcR|haI6h{ybwIq zkeBd9?!aG?h`#g14!VwwPz!JOZRGk2vN8@L3;&o75KF_j#-h_|6 z(x^9|*#k#Jfh&bYDZ>?Ik@S&BhLhMu-{{7pv(ta@5ne{$&P5LQ^Hv-!gQIWa|4AfY z%0?EH9qExCsotIl)NQit>e4G=hBUyygS? zNOmG3)Cc;GrC#Wm8G`Jai8LO8PW=b|Z;I^~kGDUNs;DKLKyi3;9sINhdv+i?Fg58r%5R|ljUeB)VCuX?H*!Ezb)lB=NccTyuG>(P6X{+Hl)T^a4m&>| zF})I;jZONBtiKM;zrZ)K(GO@RlptC}p*h$W6 zBd4EeDTB`31j5?~f7JtDALkx*k>hpn|87I8hH`}#@L_rUeebyY7$~U}S}-#&5o^wd zj8}-So`Z9mpy{8|_pGN`-J5aK8?H(++aeV_^gpVLt`4T=c{(~Z3BT19>{egU+j9H~ zNpRO&Bsz7No@nIQVf@7DIg_W@RS{S|Rmr)pkLUCTlSInvTeN~q>U!&T6OrCV_4i_3 zK|UQJGvga4+dL+OB zq(K}~<_$7o9$3FPeI??-4G*y!u7V)0f+M2HMSBGPi>7b%YyS6!sG*LZu>m;mE?TxN zm_qn~F2JjE=x5p(tGPM6CQw%;VjUO2X&Tbw6aJNz&_^x217Vzh7C56GagjCN-cco> zxT(aeS3^-w&fR@;PZY=vL$h_jn;D&H@v^U%GlO+Q&$0A^j zXGoN$p#B(a&=<%K4<7x(NbTZKo(vrwf#Z5(bGF6nwi;QN4jXwJYx5y9f)VvBJJ0~9 zu^DCbL2V>J3*iU)ARLX% zD}^XUB9XY)-i(WVpr2*DmO__D$)-pI2ZkdpXX69f?v)^$kY~H$u1~~X>JeSp2U-@k z;SF@rM0T?r+?XHRncQ)>`U7$)7xY>UEmxTi4&|guV1ee?ScBpGvH0z~@N)*}>oiih zE$BZOt2-GB(Cv*k*!f8%b{3D-{f=jOgFH0Ir>OuJj$$_3DqfTEM-)Z#T|qhxKpuDC z`(|Q5nb?_yNQiSt$m!VVR?B~!Pzz*QLuB9%u9cnL6H%}F(9AicqRn#|S{;WE>nupR zJw7Qr=y?=grv+%Mjyzjh?(>D0$e)d;ZZZH2nFTLqPF`W0g78PgLL2YcpKn;s9{h@# zIH#geNeT8PmluboM_!dcrZwhOm;a@~Lw^zq@5;(*Lq8LUx%?m>s6OZ4gYN~m~=UV|++K%N=!t*s!hpbwdyd%X7aLROjw%{K~O8OH7wV)f6^ z23yf>C-D1d?4(#lQ*=gJXlnyjKwh-_Kk!%pc0^y!`YAXz9a1$D`ad4YcnB#l0_y4t zKaNFH9prbhJZBhJ$cXe1(Zz4*c@aG1j76#Lkc-SCB9vUA_XXn#LA zvI^)>lFsrhIq`8_K1+EYQ2A{%vR&$^2 zyl*Ac&$yunC;g;)+9k##zr-2))P6@2Z*cX$Hooz6a_^7b35 z$X;6T&E=?LAs_A*av=D(l2KtYw{Vi1?-O^%kaL6os{$ z%REb#?st6-c`DhwvVWX@pFGH^#xpvA*CS_gI2oWr%~4d_jo>we88Pk921U$NbX-j^ z{*l!rdiUi4-PR;R(H+`6f`_j^+IJ0Jp?~yu`a%V#UAakY?>1KNJ~Wf){m}x+QkQz5 z;rzWQzMjH#om@t)=S%!TGmz+?iNbu6Co5s0pe@(=}C8syr~7m zDzDR{E`&a=sn9@6Ii;&mqz^dt4wxk?=k=J%tl`v^&q5>rVCSRJir3J$nN44Em`d@4 z%dnR&^EHq7lSW2pD1+r)TLHUKb@_y3}6<$V4)&?&Qfs^aQiB35GIFd^EoFCxf&B0zw01sY3 z&OS%0T}2`+hpsxJElPUh4+Wt9mT0_XP{Do67d)66c*-J~e0Pyq&W4j^;R3(BfRaSF z)~0ZC8l=*1`1~F5#5Y8Co@4PvLm^+hT<-&Y7sdx8Dg{fSGej)tC8+A?|Hp!^@|ife zCJ5hBYV?80Pk-3cZ@l91dIrHI#aLH0UR9y=lEl?hk-z)^-i@U1Z6>k@Kcj>Hk&)jN zE_{hDstJd;LLXU)aZl&BCGq%HM;Dz%Qg;F0|H9tMgfAhEe5^%0Lk{vRM0`qM(}jFu z6j-$<`7ROAc6W5i2oT@`(9m{PeF1&;1-=VIS~Wm(cIK-l&*=0@-OlKU5_lI{fH(KT z2?0pT`mCis&mP8mJ|K0T5PxzY5xR2kgLs9XA{XwllD$ZAk)_iM>gj?k9z>*n7Ls8D zcyKp7y_0_z!PWgZvBq4nF86PaCE1nu*+72V2R$luxQOzu!0!XOVksU; zI`Y43D(Q%#zmxCE_sC*=PX{uESw)%2AWu)U=r8qqdq9RA@d4WDth+}VjrR7F?!q@M zp+kdR`iytSgY}dfDlNbc{$gJ`fnN5}3nI{bOhwZoFyUnK0p>7$V?F5hB)0q)(h%}d z^)?RcF$%Ap`v2KM?a?R0$iD3i6*)Xt$qp|CBECu%^C_(R9K8RLnFG3<06y#I&7pb9 zz8%C*rE=F>L8H&=-!@iT@mnaX{?GdXuV(f2il`s)0XS(S{L>#zuz-__g40D#kc!SrhR5GyP2c0U@9;t8fr}QfmVbCiau6x? zlfHmfX2Cf{(R9h^oftHW2ML!JKFS3CON$=zV2!_mbI)L(Y({5q#~1JtKSyOSim(MG zw5?T&fwOu+#aFQS%0r(i_(KAa2|bV&*I2!e*IvrV)5Y=WE8vfVV1jEP+c?%5%$@9T z#Z7dasN`1hDZJ&xY(y^x^WGoiiPwSe`haK~;@c3_&j!5X1QS{DNCvUN;r=tI^;`@rl8jr^V84aCZ^dg`${Qdz_`6E_#6y64L z|MX-5Tw>ou4af;luLH^6jZ<5Ogr3RySA>3E^JI(hR!o5M*YU16 zSl_>?N*GGtz{=#Ggo6QkA^)Zsvyq77kan%G9;=ee+=^(~T5pfd+#rBRqC_i*5Rb)r ztcLd`z;u{a@}jFF4^D#5t04_ez(;QANo25RfC{sFD?qxi!tL;O9JX6EqB+a(9LG^@ z*P8wocj(DnmCUG>WJ%pn?km@o)81~!&6VQh^Tr_!A25ggvHV&7C(C3MhbXDRSBd=g zpgfu?nbh)oe1Y4sCzpeW7J-r`Q|VNT_~>JJxdAbs_h`#~==pu<&ExFb98i5K&sk)B zJ~Nrlz;Q_S_Rv&3@x2J>qYEC#-^6e0)5A83-czf{@IHzyEK$$Y5-c?af8uZ|YC2GZ z8BWZ+3fQPMakRzMAAK^@;GJ&^QtyZ6u8VxKQpa~6|K9_ypBa3#0lk|QS{RNNU4iry zJ(brXv4map5PC}{rlvtf4?zg?u@aiWbtQR~#FV=rmA$c+S6&-p6xwbe9J39X5CGN8AV%^8UVK8VX)U|n3>=r6_ZMV`8-RSedhyW! zc4IVqvYZ{h$a~*{Z(hN({}HF(%x{-Kf%EWXj^mu_Vr?qk=>9#V?-#U)$n?w0_>e3thx_7G#$xyhO542 zFQ2n(qN05bz8aCWvkzS&>i9%X%@1V%89qB6&E6R5Y|7`SA|sz-!)FKAHs!oK@N`X~ zk{aASoYl4AcYTrJz0s}>IMWVNGl7RaWF!IcTsZ`3bF%MT3!Oi?IGg_48B9 zOTO-~9|!Qftnzww`$8Wzc&ePZokwSUWEDcEi4Nyac>eFKDJ}b1nJZL5_M}21T*Y@f5-TtqMBD)0 z9FCk?#YrD!XYS({_~+HHxj@pDSW6k6C;-}hfzG(f9lj%D3$PRIS%vWIgyI{x$R18a zQjFvjw&25l4|Wi_5wWc23hP^re`hZDILw(inJ?KAZFm^Eh(Q7-K_gG$?Ipg3$A>$Wvh9bM<4f>`$=dci}Is-)>MViiMr$uILYM$^T&;Ed~ zFVJ@&*DS%aSMd756!gU%C}s!G`@ea~H{ivmtm`gP@fdux1x&P?d)$IHgbzh%Ul*%R z;UzfRj)cg9cFfN%WbvYq6!!cJ`xe7H?3_vt&N3qw(+hNJZO=FAw6fuWTncXP3vRv! zUff}pVs(9Z_MUi{KhpE?F!CvgwVhveDp!?J)S|v73fPTY<-APe$R_8Lb5qk} zr(4E(a#7k718^d*&R}_M$4c7>XU;%owuYB8LQfB%mr;0jb9t)^-r`sOOjOB-Jd_gP z&B|!CAkRDekt5N7dFkttnaq(0^xs)8CjEj(b0g1L1XKMv{^bYw(DQ>HZkm}mr!COq zJ2>VUD0w}Ss3X47>b%;(O^cCEB40ECKY<&4@C(Y0hFahAJAZs$jalOyEPi1xu18)B zL2{Jl_kQS%0OUz&WKbmb>v1n~io*I7vb#Ee`O9@~L!m$6kJ9Yx6yCKKdD91e7nRRT zkfR+~!zgI@5ma9qEIfvH2|Kqo^zCLPkNL|-RweG!2FX8-zYCkSJ#s_zHWF5t$b-`H zbe7_`BjDE!=*_iAwf^WvQOghpf-8hH>w#X_#`-Q%J-eOviTMk{ADNf+)B`U^A~7a# z`VDxxcsO*IARfUKN3XI0eiPS|3-prwxUC#c>gQ*SLEdXhyLA* zMB2vp9q59?{Cth`eTk;{h+KKayD#y#O~l`3VaZPAHG{A5SQRaZho!^P_(hJ^AJBGQ zWavWPZ}C2VBs?@7E!&^H5Pg({pSddQ?aA-gA?_??9RgX?Y8Y_LBV*{-zhu#sg&PbAI~8 z^)1M9VIgJ!1qGt@#p(h%`C`Z_k&i2UD;?05HTk(RC*KYfu@otHo&9>sD+=9t9z=1T z-METuxBwd204+u!*RyjaKfZFX8x7DbZO{T$`N@w-Oiy^ui#*pW^id%4x-`hJJa^53 zW^sVk;&^_sUV*wqj58T&7{n^Ga@BNbo>+M81Y9{6>tPo3wI4n74LdIwBp=4#op9nE zo_;^tX+Qs7;OrL`m$_Z{it(CUp|=|eJr}abYKta z@|4IW$6AkE3-gt^`X(JUL-b=ofkR58F^+=BP9B0mEsD;&~5>&K|I?z(9kxl z__gf9YGlC@&U`MsvGV^pOVnM&A)9D^!%HA#2kXegPS@i+h5g-~({0PCG~-;G!u3ti z^3~z&%-G*f^y?3_tDCIabeu|FRuPCj`H;O_=H&;N`9M&g1Quolwg7!odB!E-R&FQz{=@%k_wjwpBvAWuvjz8CR zgD5f}afD6L3%Y6y|EBXwIpG<22~zjrF4g(V0QhbyoIV*E?G5!-<+{F9MT>r8+mYrg zIN`mVsn{7S=qL}nT7;LNC_gV(ipY`ByH3@z{l~fL zTt%F&h4;$HbzzZ+&!?~_0>gU1oFZN$&aMKdSCS`6&wb)}dM1lNLHGFn%!`FTuzRn$ zb~GF+cwfvk6ZSExOJ@SeY%kU&2U-jxk}RSpgk-RmkKw+r#P zbnGoHH~9p~jNb1ao=tS97WwQsxoSR6J0JfO9oq!g2^&dB9SiUGgD+Bnqe7rnu{$Z; z^*7HYvY#?Qo8^!QHF;Iw&N*0{k9P-!57fclil;7z#0dA+dbEJXs=q8(*GC#29~bBEqjJ^Bb|pV&4Ti71fA8 zptnS?XFd#?%g25dWt|22e*u0HH5JA9D#%(yw-J9&=1g;h%Wx%$#p&*2qg$# zo5-3?W={pp=kT7aprjJ~KRthyxwpi>f)WdW)QiGxq7v{EvOvV!&Z661Lx-t&f-1<7 zc5q^QBuqFwU5pbFbSvsEWBG*eJw9M%uQ-n+sLYS2bwD@C?9(6KA#9Ui?pqE?)QFw0 zjkXq5s2RO-zc9ZS^wfw`sl?sHUb)%XSm;M^K_EMt6UxuVbGV?K%W(ZNnHDe?y@2gsmq59?g0WAf&2;Q`ajuekqtAMJ-q=xhT|RD>-7Nt zulIf(FHH;nERTj0GF4>iH({NbSdFli61?;h%d@IHLuoMl0SLUDGOJGQ<>6rd75Ri$z+%;i)2^eZjEA|(JB&?K8rzAOJu_>; zYni~2+pyeDbHCx-S;XuPqgx{J6160Yq717G^f*CUuXrV!S@H7jhjSaE1^>e%`xGp& zjMWwAbQtUgo#kUk#vs|xfe)fVT7QV@79x&+n3}`hOo{MSDv(uPo{aLtc*&y4#L6hW zA)fZhk`YYxLMlsE_AA*&oI#hP$sU}_oTC=J`pFaNjj)Pdvk}-0cgeBKNL`}vH=PEf zWhWXNlFHp<=7mMLAPydbXCY!LDe!DGht1F$e zWXgc#8%a%)QYZN(HA;#~nwdN%WtsE7E49`_k2FS`)sZO0&`F(;9T|~o_c<+5)tiTB z{YvNO6lpE}Al%9!wX;>X&b7I14Vlk7%ih;s+#YS~V0&!MWgS7(^b<9jb*1I#sd3;q z#?g>V+6PJH!;Vfwn+<~Bu3^a>V7^#?<2F_Nm$j~1i1ye0!R>UH(Uxf$>Has%=!I2U z1pDi<)LDKh=cHe49lA$+CU#q!4A}qhH;yAKcnw{a(#S*QTg;eQqQp`mG)SFAAK7+l zsJfrL{;l+a9wa^G-cfiLEuLe~oeNt#B6QV#0;x=CN*fyelQUgFg)O{WW+8A4`Ib5<~tuXc2} zNJR|oBJra&Q1me>3}T3Y`w;{8A@?|moYw?H!H?RJUaqlbIk3`2JQ?{xK*OQj-C)=| zP}~=&^Ecj)pPZrS-`(i3uw-PFqaVV|nZ7WpDY(S>Fto?=P50`8~} zuS!@!ZZFpsL_5|+RtalLR35D-0@spUnqau+EpdU}Zq5RqM)jWaPb>-=6huK1N7Dbcz%{wrj5kHTFN``BHaU#d)2TpJM-!S_7ORsd5~bH zSBHwZr?>d@TXdV4Qej1&d-&fEuK9+qIQTak8nh-7t~B!c16r~>wzG_!NTJF(91rFd zbcV181&(jPJIf)1Ye4-Y@$#OB>;HH?Mv30_0vt7cgxC-l~9+pfDF}fY_>jJ*^V3B_!n4WzEY|MOco|kw zhNtNSmyLlAx+3pk zkFF0Vn~_Lg6+A`b(8RZq|9R1bv#|~yKv^+R))V$>5$Lo$x?P}VE4ZR6_nk+U@fmh# zAAcQ;hAYA;2s|mQu~0NeCiJhc>`$SO1`$UrPZ!XlXo-&AZUPV4$pkd$9nf`O{-Tp* zch7uh2C`H8(9CV|n_S1ry@iimbmPy+GZ@7Ei=(UO;zKeUt@6I+ zp@oMce+P56D_GHERvUt57v630ssZhmhN23C81kS^nKlmU2|>e^XDtHPFGZ(_xchM4 zU69qsqq+ZQ&%W?d&M}^RK7KVZ*L^gUvB>LpJ;jQTaz8PdWf^tL*AQ2kyXH}xdSYhxL`UrJ&N~T;dL1b)m4ENW)r0)D5!wQlV@5u}{%pu`J#v&IksK z<>#B+`2wqW$lm<`Sx9hMC^9AtJHZc0lL&_T$ZBGFjvR1ST`0RGPZI;u7hbCt#5@Ke zSzdzis&cNaksu*tAMWPVB6vmOV|;@BAgs+$^x=6VVJo8MWudldoKgs@Uji?k0-wyl z!<`FDDvFiPLkgTltQg|+52T`KH37Y(0 z^o|RM>x4J%ET341B&mo`;3`O|KdWxTeoW!I!o#3oB^2@E+#b+nB%kWRa~5ESqCr7Z zc#1|y%ZBi!$oSa8d3^){HlUXCK$GFH5nsNAby4SZ7&5Yd5eS1|wZ66IX1)Zti9E*;vOAJY}O< zQFXLL5~qI$DioMGmTC1R!TbaH`((JZFO-)H$$JX=Z^e@p_*@+*tqW`G%J-INu!@{V7O!O}G6F@MFA**m zHb^p0}zHH1OwNR&XD>6BWk+XpeeucYoI20i7sfB!UMX zgAE@c8$^76Ew)D|v`K5^7CElU716zQYXlDgJssi}@QjuZbg5AD~^vHo6Z31o8^6u1M)^LUUpFlR9 zg>Nr$x|h6m_hqofEx1H<&B>4CZN+t~bI)(kM`!w`zM(o{KUvg1SR_$oyDtFMOXzSH zw#Q6p)Zn*=S(AusUFQt$!QWyIO?PO&7Th9gE))1%cTRg261y(Da*L;EOa4tI?3K~* z#T|G_FIlIOP?& zJ>@{Y{^#>iJFFo z?l7aZ9PUZZT1L?(6G2&gYWjlih8z*>YPO ztBaHvtgxS~v=B2Lroahjp@!$gT7HttmCbmjuhIL{FS3kYR4>R^Ri=TA(s$`U^jcIq z)S@C_zh{i4Ih|%cl3Oa%4Q+}#lUWxn>1C4{+a$kQUmc}xQ}3xCnALfT|7TVY#bbSI?^l(Rm<*zl_9I389~0o+bLo zX7$dWZa|j7RWe+Q!a1!th5Xo*FUW-bkIaPZeD=GiEhyBNtonMyEG6kY`k)@zpb~QI zlqEBkqKDpY8?emxQYDp5K0}Vm6DV3_n+IXdw}!TlaD}aKLKGUNs@a>lhMDw-OqnXG z-(t?)aIE9M9+5rU8QHuWtL7^)xGO|vh9YsNkhNBw`u%pSAW-`2jiHnv8zxEWM9tB_%Q)m3iJIDJMd43+`^=&k?$kBRF1?mi>;8?7es_gg-?%IS}q+fVi7GQ5y z=XpP&`CAkD-A;v82z4kf`mv2C%G4WwS~Yli6&ziTeP~SfVHN5Z2h(9WJrylAiLkyl zYEu~cuS<$(N^+BR)Ie2;zMeM^gl$s?J8(F z!njP&zBR;ghqzz6>bfq{H7byqzr~#goZVd!?kU<0J%D_sHkPvVNNvS5%Pm;V!>Q^C zC!2EwoqBUCo3Zkrt7EMGwgt9$TXB0+dv$v%`w3fF=Hz@55=dO38|Ze>{ie-Es1U>S|Zrrfn-N*Qi`a1RGYPi zwJm+7!mM|gye1(VDkB}PP?@_QZu(3oCXq$8hU}^9M1Z#{1C&r@J9WCF;o@LRFV7Wn z)=wI>m;^dfPp6;MdTT|9WQS`rkq$1M5Q=hNi(<=-uRH|N8% z&$)gi|Nb5~D|xQ_k`ZEACAEY8N6)0Wx6$?*F&Yy?rCko8B)FRpW)No7OA9`s(KW&5wuW-{M`a@|3ozVIZH+IZvRPk zqWzK58Ou6PS#yDY)vY-@resX+lvFY4ev*>%#+g$)ZFHhfa43C(ZI12C67T5PY(HY# zZ{5pe!t}~&CYFlM%X8!uX55ulHT9x(iLIjjI=zSAGjXuJ&83!Bib;N+ANpT+I9;lW zq&!JZNFKzT=<>`_?X0z7&eC-{Do5Zq%uBEO#>RQ%@<#Uhwfh_uX_d6M+C}}b5lsKY z=Taf2B#*H+wY{*VW5Uu7o3E{!wWZphp6fTU@b6*0?nJ|-Azr_NPCs|(Ii|6De znzl7^;|%)sA?G^DxWY`4p_*NL>o(oJwGg^H#~DA&XwMw-aGN0$@=LGLy}p)Xcx_vQ zLVKe5Pk|9^ScD>0Q3M^?8V!0C3D%VJI8N>6d_J`oZ65Af%(SCH=$mwOE8bva#;Xzz zZZCsA-;17Ii=AHsp8k!dKL<)Vf{*kh80iS;`WRaN7v8(+#CRt$8+yB(M;Wgigr@r| z8kKZU=nb$3JYgaK$%cKg(DH`fltMcXM;F+ngW!expqn@NqJEOGXg7AEd-BqAvnYK$ z@8~t?zuEzbQx7RG?l>FCEP0NTZBUK6=UmiowEKU#-G()VAY;Fy4>#g-`b@>%0`%$) zkij3Y;vlf|5U}xopkI;s@*SkO4O^){zny?J^%xYChn0qVx!HlO{2nYAO+4TaHd_#X ztBu`v(&C2?`ju1-@9II@Vn_$?ae^*ET_jxApLK8FegQ$uJSl_k!d~c&1iD7 z2a+qZou_$E_1z9KXR;Z|oMI97yDGIq^Su7`rPTTEGP=?sEwg*6Yn7|Md#+a3sOkxq zf|LnrZ|fZ<^)|2`QEloZvd0tYF`~)-RGRF?`?o~;0($!mLd_wp8D?!=Q8v)8ES!l~ z71XkdEI%PPIf<5nvbeJ#QVnUc&)>L^(x3j9MpSqZ;MM(~m z!r?fP#j%?XY(1GtzDL=wcC?=G3wp6+CV!Mr~kk zkaQc3Ga<_Xmy*d6vF&Mq8#|8S1Cs7}7Y^2fw5CP_?R5 z&SMzEjUmQoV<}hM!K~Bv%4ao#2`~>FU46>=RCI*f`Y6Xe{j{gajp8f*{rl_KkCWeR zKbHTj@cU5g?u3Ua&$Z#6A@VLY9g{gW+v2P*)Zxk>skg;#{%4%k1N39w?#v~Ot>$#g zUAe8*-?7ox<$pf#c~F{E9fPh1MEG@fDApBHdvlpK#N}Wn>)4d+$hDY$%)`MhU$J1vdWM)4jURMD>BkILyECLsdQG>%Wtp&cVNwl$Zjui z%@nCVKKVjw0c()$jcu^~p8c(TlRcB2S&dd%JuWws=srb#gltTs8o0bZP=5fm{WNCc zu@Q4TopASm*jO)-vQvyGrio0}{Iz@T2ku~Pv(`uNW6Us*G7&OLnkNU){iih3sRt8n zsUq#hcYGZivOTD%j@PeO3M?bRYU%#JP|2A+9J$M>@OZ{{lv(yE}3b86+Zq1qj- zuKrzLZ}c%sBU_GH>XS9+rsGg*Igwd$=jp`t6gkpI{vdZ!J}Mp6bE?0!Jm{b^U(Kl< zD`U-O^`W}>sM=fgRaZjmW91L@HaLJacp8aT5$xEKD4xsH7w=YE`bPgIvT_5tdmq13 zBk=xRB>i3bB+u8+Gxw<#i;~Zgyno6RN(eqF2gegRQ}$9PGJ7>|l}+NNrub z-k9$9dyrTInfCKpY9fy$Z_N++byAfnQzgi$F2qap);?tVBWWd& zxs%zb^eIQ-`sNYmXsQAEzLFjhiPCYo2eG1N>S(nucyT}YV>n$q%1hU{ zYeTqe43=(2xa|#7<09yuG)S(=KAt1?77C_YijS-jJ~NS}E2^&|v2HiwYkPzp;E(1m ziycskb;MyIPs4i=N+#$dw6W+;fv%*TcpPnAJ; z`l*hh`&K5s9J5e9v0KNPP}KuJdIx6YPLT2_S*)q-#~i(Vo;bSOVx^v1K*G46limkD z&whXNt*{%3H{7@1J-YVl-IqME=bW0QtNoMTn81ZW!-7^aOZJ;zq_5@}VSj)`uPiUH zl=aNu`bce9Il0V4Ee6Di0@#?_rF}X= zqz5UD-EZ}_p3~AN<%BiAo%uD6e2zAD*~XN1d9B6A^BjAq9=1~n&kM^zc?BIzkJ}GB zYWwu}spxaj5#T6k&u??83zg53;dyIp)&{$Vr^FLDho{DXeWBjqCT9x!VF>%X}<8;PAqKd5!n8uPUYEKyCLrXOWO!BzbT zT@w$|`5`M7rOOxw$7jN(4Qb)=n-ZiD0sY=5(e)=9M0HU4q_~({{6JaHoGCY+sLJ?#*5IqC3@10EpW0`%;|saH@>U5~ z=c@l64;I905d+!jx zx`E7H2%f)8Kez|1_X6I968LF1SaNxLx%`yA)6;D)h_40FMhh0l5#&o(Z1N1`E{Mvn zs>r8XmUK*{ID~{sptkuUGP@vA?rF#*F>TWH_;J5*;(($iv@J3y4>;KcP5i+(>>@Uk zh_!zKJ=BSv_ps9EE>FXr8O^F`Y5`!jbp5D z9sjEV4*~}TO$`bR@(Y~eKh?LOW2-fdveq)xT+b}zX6}csqVJ^irqgOP zR9F`MxYd%E4rI&aHcD#spjym2$-0BCDh;hq@nKd}vdLeWWSG^wpbyYmx<|MYn96K( zt#wUyV^`=u4F&6M0cf@$7$bm6u~B%qXQ0_DA~PQ9HON@GN;kYI*q0UXVOsE8y~gW& z9*g{hr5ICl1}JfA7h45;2K#ht1G#~5JGpRdzV8#?+g}cPTI=zd$2Xq^ymo%P{qtU2 z71vSEDYd?1wC^atjefcPy8HI?>B>y|A6Q0@`6@$Qpb0V8ygoH-!-v9$|Ltr zGoO;fKGyev|IdKk0a^S9`*^Gw+HDVI)#y0F!vd)VD$OoBT}=noD>@OL}^lyA2n!1mm?0pz%)H8100X zLEnro-7qeiQ^`xZg#2lbG!6qvXRwTDhN7pc|3I;f!y(~fI7kl0=6@)?L6eQMbP3O>!0EGIIs2R$LG5wrMihNpZeC|pOol`?M{9ni+-&`b-68+_8sf`3br7t)8A%|1F- zJj45Wg}!uRBFR*Gn^sc{a>eT5XPb|W;|D@C@z)Herl%#oj^@f4C5VYUjnv|JDEARd zNt8E(UCZKsC{4BJ7!dnuYTys!QH{X!pMoFeKWahmpl$y0x-HEDmG2;Gx|-OL=z(LJ z?TCzyrZ(mv^`Zlrh91e)UZ5A>;z^DsI`)rTmV$IaoKLUUaz=IhR8Nd9W)>n#50E33 z@Hm|#-^pL@2`&w_>?6K^&(oMGj1Q&p@>gDyVb^2}r|CtJ*>M`~lW`nt{BZh5Zcw8#6*^lOK7F09rvt|vyuwEYzE zs`t~-M{6HCA0K&9;N8xzo&KCktgPL%RJ6Wwoc7Bc7?x^(>L+Px2D{UoO1(U2vwvZq zrPgqHuP2NS_~%S236=i#f_}RL52XGW+%)auv}@8H2&oY~By~iPBVd8=P5TRVk(9xV zaPLgEB;1HC{%2`S&X_E}NBu1mZ%tXI_megIQ~&X)_NS>6+%%0}svG`E4!gCd)Y&W` zy5hSRxw~sibRTo4r>j&>DbDQoNj~TNz69J0s+u}=nsjN3rydY=(|@YZ4eNI)zj@ak z;8cZIZ+A+A6z&`31@vviX`D)p?hZ3pZd91VO9_^kKI!!)+{wldbP$|UKMr=D5D zSVd&%rM}g;Zf3MBlr*`b+R&O}ZH8z4xb?ZZUdboVw|qC78Gp3P?gaXN4{)7xb#b@S z=IK9--k#5vF7j#Rr~1jd-WFi5XwPN8W2^ULcQ^23q=fX5taaYuv)VJ)ui< zM5sb778wDSt<0V~L#*r)w7OK%}h3LDKFovL{H zM9(|X5xayOg;!)Hdf$K^JHS)5@lw`g%3~x_VX5b$<(u?gKEou5J;dA2sdM3x8(@~B z*mRwx4d}#No=J3M*+<3oW1|J#&FIQU>}HtKNc}>z@Eu*qD=7*1MO@|_qn2J@Tk8&Y zmvj%L>vf#+y51d`xbXNeojKa#9m3mk~gHha~5?^*6!;6 z3=`Bko$fso;MkTR*CEKbB=xrSh;5R+p(DvL!zbCNp6^26v%a5vHQx}wtbW=36u*1E z9egkOymnl&_qY8~+behRN|pBvFadkm&S9WD2mX!Aay2AOLpmTgl2=MU@hRUWl2?sR zG?|%f7l>#~MjqtDCrcH)<-4RRS=H>;kJdJ}-nLA(x%A6@fWs5s^J)Wmclc z&2!>FH>q7Lgoh+bUZUhzw_|_2A!=G%y+?=LFW4R3nbkM~%pNUEN?xT1eVjG<262>{ zBye4!4N=(~EL1=it%*=>bUIOT?%S&{wS|==>1Y(r&UkmZGcnl1cCv-)jMo zPF|u~Z^+CTf)^=|CmVUf74Rty#nU~5O4g=i@4cowWgn{5OEbZ$Ihm!K=_mHbl*xJ4 z!PBSB+1T5S@V88)4!s>QzZaHE(rP?MpE$cM20jbu>A%%?gQK@Ci+V?*`o=h`)pM6{EpS$Mc6DBKc6DWQ|8(!v>Y>?#=^B&A zh$a4=L7%F9cIS6bcfEFYpiJafN{DldbFAxxyMk^SzdawN2g+Ql-JZ|!*-_djmCsVg zar;_ZQ|n)%fmNhXOR%RYR%35^F0>|_*JCU(^P}}6$>beC{Cfk|)?JWjPEQ^)uThif zdWv?zec5f-rfQX#6`39zt&L@|bO|4VTYZhcS+nJ^C)q~XE?OU`Hv*(Y z)4!pVa+wV2`_TSNGDpv`g7)S%EZ}asq(9N(w2Jx#y%F+C^j$bkr=Ha2P$Z^DYp&gN zN4Sf+Ga=bJ6LI|LF37XL(wgh9^qEF0vxcXkrK2=T?xQqOKdG&)gRSkXcI$FAjk;PX zswBy;pbBqlyIQm!M%(OAQ~F(Iyd>$_>ALaG7(iz3db+x-L)K-)!cUJU??0mAIp|AR1P^T#Q$#D_ zMK7*pz`OB9+odl?D;fALLy6ZtHhhdB_}muiy^Z~N#Hx~gQBNA~DW$JS`5kvSX5`nO z@8`V!8XX$l_+_;>yFd7R`xo;eZg$ElJ<+m29cbU+Q^K!^|62e4{`>rz`_6Qs3bYSkl_5rE<`}jsUa@sB_{iQsf62??` zccd$;E1zqPE8Lx5%M7>tF}9#Zo8s+$O-_5bk)DWf6W6PhQOOOGdL{lyc$-i!u~gEW zc@Fm`pck$Xqs^&oWAboU=@^-V13}sQ zsPEo~UTI7`qzL)cpNQKR!&_a5YrF6|uP00HA6n`SR>d^qr`}2TC9V;KHnp;2E3haE z5bJM-l)Fof!V+?14v;xo$Wz&@VN}HvFxTyJ?R2eky>c~oyYQBd&~r00H#^lg6X?j- z9)Fb|`uijG26=gcFe0zVEZd~nay{iDUWQgmGx>mJktyr-T{Du+glBQ#|C-09iX9f) z?%zpfjAuytlDx@T(S1O3>gh~BvJFR*VNrp+k+$S$1WGaF%gA&hbW87Kx6;UZ*p}Nd z!RNH^dB3^-X#@HOOb+NDkUQY8e>(s2ekFZBJG$7nTdyjQqrv&*tr^u1|rk#W1Q!!zzh0)T)Pi~nZhpB66v}4N36H4H?0e-g{|AwSS7nsPHrv@z=E=qLlZ$KoQd=d%L7{Z z?Ws?0-f^xiYL}mpv2YXb+9tAEN)X?kPDbTjPAr0x97(>Cgw1x1o*2XMq`V^)UnN)S z3;!RCr*AbGTO;VXR*qSs#gUOKv~k)LZJ(B?wbkD+u`>t?tU#XQFXZ$~kWxePq*VNz zCp|;SeNw1k$}6XpQhS2+TFy@iZDIprBESFoa`N;0&x5~a`mrPCKtF7H1Ko?qoft?pA8cyDbT3CnJO2o!$;5^%q8IOLnEJZMV+}|GGitQ};~sBF(%s zhf=psbu#dazsEPkr>H&L+D929ZT4J6wrp`PaA}lg9dX$;x8BKPk+-Q<`xi$TnSF-O zX~!*FAN7`0-t$#=Xct{!u29!**C}^4{i(6RGeN4WNY=%+czcLXiq9bfBfRr>j}lko9Bk<}N?y zr{v_M?n$MRCL~o$9-ETI<*OAiYI*8NZn>pef_Zf_i4WFL>nK%_BLm46pGF?-aq={- zBXeqiVy`K^REKq{HO5-X*3#C%7Ql?vS8B9!L~bH|^$a(&8cwREX1Hs)ySZ<;`;q5Z z0#8{vrn9BRFFP6eR$XaHpNgyC@wQOSK+kw{E7M!|==+(Qy2Y4l?jVMjMlPgeL9bRK za#_rJi=4!UN(;H6ME__{X0x!-1$(@PCTXU-qPCyhn%v|SCYU#P>UboVzqEz;oz0VI zMC)gff zZb5zeH1bh3u+>>hDJrIlPyv?={>`8~!q+iZTFwO2vE~R?@2CH#9n!w>ydqAVY>Z_+ zt;uuwNmhSVII8m-O%CgG%R{gN)_M5wr>7DSEx1*ciaC}d%$pnib z58MqG74^I)zp*y4$XoQAnt`u+Ki&AdAaUois~^!V=#2HQY%aRFH~Q|ZKU zg$$ReR382?Tj9aqigg!GkC13QX}a2s8CFd}NYlVU*_1}|bm=VKmCdZMG5H-&m?YyN z7o-EIX@qi5F+ol5l@&~-IV6Y5!>|bgE$ux2VYNKL1G0=Bh?%i9YU00Nj~Db95x@%g z-?I^QnSoSU&9kq-iakY-tbA0GY4B??I#2I3zcHI*5ZTQ!@O>BZa&Hsi%}R8#65bvI zuWAo;%o0y_&w1XR$Ji8%k)P6ZeJ!Q0!!AgV)s>d~#BoFu za!A=Md$9AP-1nW?Q~oBkN*bC}FnLr;9+!{yPv2+eu~eg`k~s}nLet6r%Pq%(rZ!*$ zcSnEpp#tx-)Sm8STa>==R=jmP*?>FkG4?P=7*@$OdoOzo9JI*#e@vYPbQM?k_V3u0 zC`pju+G54EP#_eFySo)DQe2C>JEcf*C>pf56)jNQ-93cpwUPV%&gK8E^)V|#uFag; zXX~?{y;r@YT!w)~l3G)%Sw%HCjjM~3vcqfkP+6?z(E4jbwCdVfHMd$z=`8o*4*!F% zcOI1Meo(HX=^FUQHV&)4UN+SSs< zkl!evOq6d^!`eY7(mkr*!?}t-uta6)Hpv4HD<|^&6lpC&S7kCtoMv(&TUR z7(E##-+4q`^Uy;Z$aIV)XLMgZqy7o<>bcSdRM!ah=q={2tl{e>`J6b=Oo!wza#py3 z8d7a(s8oh4?=jODYB7sp5&f30sb93F?k{@U*3$_xh>n`(Fa$TDw`>5tRom%1NCJnK z7oVdL-bDoZ^&xArmYi{4x-H_+Qn^8_xyW&)5m`PbLwgGhrl{M!fiWqSj=dEAeiwZ1 zdJq`B$w$;C^U#I}ZxheSKn`OJs5-%`b(5^hPO=!?=xB)o+x-}pp?lOSC9)hf(H3*a zf}AH}6|4>Epkh_(j$$5QB#4l#=&)ksD_VkSoK0QuJl@W)rlLi*! zJw67wHoTKHNb4w&)6GFT3WoU1RI~-}dj@Khr9nb;;?e2orZq%d8}Me=!OOD^Wa%Xk ziHWvUCSrKGCvRb_xdx)+I$Up`K&VGZdFfHe3jX;eIE$%7mIctt_pl~^ArW(_!%o4n zP6yXAAH?NSWchc#&*ASwsfxD*TUm+NyaGR4k{=qwdWZ?HYpLN*M?Z_cr>daai_#UD zjfnddnxHlr;(}&hkZ|w)Klu0gI{2#iy7&(HD*NyIM_IKE7URKC zO{OAJ4XHar7Ox_8_q$jkv729+E_7Kly3R+S)qdf(Qm|2{F}>g#k6s5Uo=Ao)@ zaIkpwT2{XaT2XLo2K7-mrGn3C zJyN!nV+%5~g8e)O4JIaS)}VS)8ks2s{-6+A@_Y83=-or5jMH^}ozb2;`W~mt7X0oPSgkO)8U6u7@+UKAn<&$j&9IlP zB2H>ct}(mfQe@_7=Ag>d30|{!c+I>@c6iNNGktjk$FJmJN~wx^k{+Fc_-2!-Dt!SP zH=b23N+j`&Jva+*q7kinbTc>~#HV%GV8%!c2HUvj{@fuxDK@zv37 zW$80cqd$5jveXQ(p)5GBDnael2XtCLyqZ?9!3V;oE>7~T>-43m=$A@i4*tXHPO)n zbmwKX>>2vXPLoYI$ssz{_Hk@OUREIsqN8>$p4Ucn{4MUD;8-h-{resn6b! zPV~o$UfwU*hDdCK$V-d4YHdMw{7RSNDDvAQ(8b+|QUx2S;EgFq=gSXBbTwqU6uT-D z8r+9J_Z|x)*r{@`?<(*mdR3>x?mH9AO$BqD@mO!5zx1#5FY<5qr}~@f|1jNoj&Tcy z`uD~WV}Oy>II0gp8p|{Lc{6_BZluvh&bv4};8T!!ts0+OolovZZ_6!PEIMopoC0?E z@3PA-IR)(G8LEyq@u#ccJ*AViJO+lKu{uZ{kA$@X$!5Ys8&BTw59KfAxbj{JRlmoZ z`HgJNTBnee-wFRWbAtd_xqWN(t=D?VRlxI+X<9`$)9%8t^`6*sqUZWqXOuyT|_oTcGH* z8^LqBAbm~HmvP+d@5o6Cey|)!kC@-qj_VedbYswt&f-4Q=dn~)VFgyNEtdGjGl-1 za1Qx_-o_&$(4MSPWiY6}81M8hM2%;N1ReTpcp7t<8vGPT$lCo2i-JU^Z523@Z$T=G z><86+vLE4KEO*hHb{KEBy!?<3o!U|%^mscM*JFshJaQ*xwQ_;(nvF_V7~9X14UZ%G z$;PvPCOSv}g)kI-b~QNdJ&k$V_mzLh9?w?>QRmC3+{BlwN~hZjCamb}`5~-c1eo~K ztiS~BSygPjja=mgeDoDqx?$YgCQO+Sb)7Q!xsC9r7V)TtzqSa!EQYS3j@;2^=ovpd zbS(1a0y*$6&$(#5!WYZTI@d(!b;g(NN401aKFBIo`3@eHU}+Nb5NfkmD$xHSCJ%}! zDD}Wi&qsP+1UWh?=;`)yIL<(3k!7wOT1V6Itd>jg>Fwy@lcDdjH zdI8$>B${Rc9)CAFPJTizf5Z-n9`4z6*o$e|*U?ZH@H&NDv_m3t!Iqp12acE-`yZP4 zGQRaK^76@+i=EQ|bngmQ>ovX0f+fnuRf~D%7l{mx@jegvdv>m=9a203y(_rTt8zs- zkv`GiS_R*?Kj>mHeSSRIsn)E&;3><_N>pMUXAy~}5S7#g2i*^?(U2XINTzK7k%*s9 z*#)j{IiA@zDs}Pf=vl1l_xLLp@cA1uY4tM`lMb5kLCnP};;yCC#iwyhCem0&F7pyB zp;@@2L-B<#uv2BKn)$HMMTzkWv*QaAJD2AkcH};7WcLP`hTH|5??Kx`a()_~Z4~}( zH2y_iV&?{UWviqcQYha2RI(fC}P)KOx`z|-LZo;8c45kD^{}&w&oY&vB4Z&(D3Dv z6elsnZLG-_@{bd^qiyjyiU#NXUZ$cs8=cgd4$vQw-C}rNxvlK@Ws3EM{Oxt-2pqwC zJ4Qz2wdn-^-5jLwMkMwfdM}!e&BE-224o2*BPHkX|HG((*5ge2ph2 zo%eGFe`0$DE8{u(aRg6-8?BdswYr6@9K^ z4K9Lz6JM9HFI&hGv>{87q@QAP*mBSym+^S&kgZKNY7kT3C8trH8ptf(4jGmtrrg7>{NlV1x_*DOl5 zwG3LbEPp9VWRahv5SF-(*@fEJVzN-jklZWy)2E1={{m068W}%L#Vm^ZJA|ylRn{Sv zDP4`oDvd!i9m1;)!K3Yo{XIzsuLKJH8}w*dsSKV>c`9K)!RgrpZ+M}!4qn@%%>O+@ z55nKr>E(1rg3%xo-weck9R71zyvM@i9SY$Cl|vWRVES2WCW!qEH)uEVFO7LlF>-kf~C7JJN{QBrxVty5?+!@4el~Bv6_s+96X-|NX8N(ve{JAM}Up$ ziLUB|z7%|*zhIsE5_xn8#%Wcs$fb$YY7#N`LFSjC1q2VyCG6ID^v?;t&QQ1iI#oe1 zc058J&(jen*i{$u2~+SA1%t_aj-~uu$k!Y)e+$sbtB~WZc&UQ%WFP+HKK}oe0eT#9 zQ61|3ZjkNMnZ)L@uA*7`fpjX#e778C-r(K(0l%OE{y}Eyen}vVA0gKt4V9_#J;)}$ zH;coFvH;!shEPMC^SdM={-EAhDvkb3jK08#f_3tr{GtuciogCTlk?Qigk?5rL ztiZqYC%;Db8deC_rZ_U&i@R|cFC!M;d>p(3cj;^nB}1GWiOWxys+go$0jX<_w2A4# zz8kTcPfaS>m92AP1k$LBY#Vjl1N;k{_mS(u9ll}u#EogkMY zuE9YrCJ#F=4w>x1dyGeCPQrTh=DLbAFY7%W>pPj_It5>11jj_CH_WAuw=kG79>}^j zMne}NKF*AW{uWQOJz1Mw%vN+F>#f)k3-QRl^7r2(u6Re*PYuQh4cS>Df;mh?{DSB= z0469acBv$NLG|cD?+p%rEc|2B`2HK#^cQw)cm6t_Jk&Ai34Me$LCkCbCG%Fc=uyl9 z(j*I9bgJTGLe@Pxtanm+po#BidU@XHYG4$~)K`CUDns(>Hw? zEj)!CTOZAr6aEf`3{`*?vf~kD;0Pys;tyt~jxyhBAuBSDy5elS=3T)K{v_lf8#cHE z_P7`}CJ1`TQ zJ)65egF8KqI^7g7HDmBd265K~622pvNz4Li&e0I>vnEGn{FEZ>foQxMF~>x3Lkfo6 zZ}3p6k{PIr)f2oMrTAMIvG#NPgVV_EA(MF)(O5!P9pbeI*>5L#p9frtV6GHQ?jo|QfL|0x)K-O07Jj$zk#ZB^XCM>d zBroFP_gH*@;^_D)!6>gBzZc-_BZ6ly__but-_HLW!KgHVg-pUH6bv#SsND&cdBKaC zghUAjq`x`0`S48riWl6RbFM~Cumnc|j_l;{BefaPOP*xn;3Jf`M4fnh`7Tk{Dh1$xFCLzoG>MtQqVX ztc*N=%NjWFi=Qz?JvN(0#Ef>%Y<8Sey- zOIY>2RE$@l)28E33l^i%$hY8$8;p$qf|u9^nXQcU<{*paByVK|k;a4v~CvL_{@8Pj{&V4m{Xd>3RJC?X%a9wJ!M$Pf(`V!U5 z#F}nLsxRU5y(0z?48dZSf?%X}a+pDB6ETWlZ55Npiy;GoJG(nqH;O$vhiuC-zJ!*Z z%dVXZ+sqQQ^#(G)2dD|2qf72Gl5!4hcZkSsGn#!dyL-)N61eftsq~aKLZIR~_ zdsR$#c*E5t1rNcbB<9nlu!n?3b`q0?@?Ff<^77bcypJ~=f{$MO{J^WyxW|IiDG%PX zh^H$fiKWO1hebwM0*pUTanw@(V;1yq|KnVWf5S|r_hRDMe2}WHpxn0H!_j2Zf z&n=bpHPMG63KV)mLcUSKF<#sabkr#x+Y^lY#N6i1 zLHXRzy*W)BD>$d`5Q*OBxW#KlTziE>+%++6>lL5$k)8emdB4Tq&+#hZFA84zQ@r;L z{{D^?G>M`k*dKyBK9)7k##P25KY}w_?3%C4zCs6U+#kX6n}f9~PR6bl_NN2;?&ly+ zaNA&3wjOn?pOEu-1%@I7C zbvXnxQ*9pqG5Czi@#sifZ%w{XVaG!T&$=IuR{;d9Gj=6@0?3 zpoE4YZDLOd3nqBW?R*#4AXv1;4iV?6bLQ#1UhqC!yxJaojf-a){QVVf~#A+uh5s`{)+Pv=au&V9f>^eHQwrD&R)!L z6m_)Q91r=rACx@7zW7!4?(i4E0VcS$1xLTQ%9P+biixoAdE_I9VAxIyK119E8+%sl zYB4D;kypQ9#c%UDH~1-7t_6p;#L5V6IKh1^^p4oqU$0;AYm3!4c^?C5_6PTTIMey zSgHtK6~=Q!eMIaIp&{IyquAkZxWY89D3Z@BinLZig3F*&vheJ$yxBs>is>SPyE~OL zb@5mpv`sngkeJg}oL6S#T2hdn#~fnTkl<+-*HVtVS)Th?lsowizE5F(FT=hlh16$c zH6CGK*I=1M%(tE>Fb(8GGxpvr{KH{fUry>1`>=Pt@%B6NeI7C2W6mKj?^`SA>&5Zj z`M55@r}%|46!Wsgbko;dT>|&*9p^3X_<1zRQKCk{ME3|;cXAD4rcxQMM4-Ep`0Lf+ zbB?lG9wCjn@k2&n!H!|o&XA@31z+wWmH9%%nD3df^#guW4E8SoGr(|oc*{x;$?U%- z`<5f{lGxy#m7TL*$nJZ^=Y2vy{)?5`PP}>sJ?CQG8u0v%Xw8GH zp+%p33>n0D?DtEs=`}ePS>MqWp9?mr^YS~U;x4wOnX~uxR{jxM+-KR+j{l1h+ zo9I6v6>#|?XJ?AbdOusqZ1b~pjrl&}j`NiAdtjdN(LaD(Zzba&vm7`cl?vQ_@^-zz zs);W2Eapd$03Ybrk0i^{g_yAj*+r&s)6sPsghL-<-Xqjk!fnxkQr1Y*ptt`Hc%#L1 zTJ2*+wj?K zFH;UUP=-s5d3Tf9K(meZbY13Qp70CnR$!;CIf(n$_>r5)Y7~(C)D&L?d2OF@cdEl$ zwq!MpUHbE{blMuDJxSprv97m^!bc_ z(rxXtt7iC~$UuhjQ3Esl7qK$T9@4>aT6_X zu>Nq0r-PbZXw5UW_zU{tyal~4y(9g98F7K@lBy2Xu2Va{EKdmx(B1AWDe{+T3FAKH zOlXk!Bzd5Fy1v`iTWja~DJ*}4KO!b_dBp4R!r`;SvV|QEZ4nwDvep&ue5jRFve{CM zL|-4ziu6Nir_#2km-7_xWz;VkA3-~o1y5ebh|r_xFTLk`;@@DTTC=2VYAsNf2b_0c zB&qAjXV0$n0>wQ{EvQNMtM=NC3XZAvvRXH#nN&G2+^kHE{guAm@S2?h2W+cBSR6v8 z#s*&U&R_h7Z;@}euPO{RMT`Q}nY$BHwzE9+^A$2}Fk$qgtMQr@9~fwhq{FZu_jL>U zyd^d4?nK>7m@X9vs9=A-As4t_{RFn7k9taZNPS9?s@irCzqMeGr3c1P1DpwqTLo}m z9hr+&9F7GCb*wD%cSOcN5*vRalVW1U{|b1hDEY~+9x$JQlATHopeQ@F4zcex*r@)1 zHERp(UjvO@V9XD|`4z>!%|r~^44rY6+?OM8fE_uW3g~}U1b%i8bW?EjG9r|-9^UPPnOg&VM;x8o?Z_$KW;ZrK%hV;xe#I_2!+vW(*3|{ZF9i+QJFuO6*$OhAjmd*8rOW*} z-GLj)cy2Lty`H|`U)%q!zmET;zn@;;C`zB_GRw!Rq=4LM&nM>x7v!`44I+&@$+x(! zN%CnrH1@)G;<8RsgPX%H+5?l<9eJd(k2>~S@)QN6dhFS*L@S5EIi0o@CYPC4TEO2H zg8^<~jL}^TVChd)s;#-odK_@uu1HP5?zEA8-~`f%N(EndYxaH^5$RJYmt2`D(+6VG z3LtoPqI32Vvo=C!WF1&F?vmHhpw~M>KE^r&2P!VRW?nVz|pHYPD*-xy%Q*bF}6uhMIp; zc^w67LUq=!7dF5ZNJYMGnQ4Zlf2)u87x!27@9_`UhZr-=@z#&TZo9bKtLS0fZtT&& z_=ox1fiEZka`J?+(5!+^eLJP3*eO)(0G#s%!yOUkAj1PTeCr{C72ES$;v( zF0osh)4?(ZcAgfXgjM+^J*&x50p>Fwk{xjL*8<^u5oujY2Td06s(vs6XDy9rv?%$# zRbVRjfs1w0!@gOr&8ue;>lY@g-G%$`9q$nb3cZ%PUzM2N-kH9XAzBZuk(OV358f*u z+$hi3u|G*;VM%Pne#}9|D;rqu_tHywm(l>V%qV)XIw-T{Kaj5i*yFv})}A&O@7{r~ zmT&2*4}eOIln24nQ3W2IZbbTN))UTgJ9*)D%whcmKmP)Aq&bBQ=sh!+)rAb|VfgST zT6wL_W)%G(_vjuOj^mCs&aJM0Lhgnh3F{wzKKy?8{P6Jb_F;4A z56l#@)K%IQ=CYg_UEjFMx(d5==XPf~=N5;{(c6BJH9ZPf>0_mj@*W*XrW#(-!$|ZQ z!vpp{qps>Dsq>opNb=s<%zQ}HT*J){U*v!5Yvudw-A$L)Vee;eCA4;euetwke<6K^ zUI=M#M(uqNS*610yHa>Sf5HLq21z^!`gXq6lU=e?dM#&GqqO_*5sa{Rvb*f-!9E>= zg|Rxwrip0oI`FO)wvV@;us^Xs=i0a1C)k_XbK2i&8(?Hg0J(CH?xbPhG&4zah*`yq z)e2+}-h*174V%R(GN#EyZ|BJ0EagrpH3#+PAr~0GxbFJ3QwGGgWrip zs2}Jdol)A^A2@S{UJE-FeluJTYad$Lb;UkUy#pfFlD<)DX=R;LLcI}c^!SW&=7pKF zX1IqKirqiQ!V}X)aEI_ zB}XQ^k}D_gOwO6ICM8qqywsd&SJM7Ye*^1<>_4GTFy%mDGGCv_bS(m9pUc#YrZ74l z(^HI#R+uzHk?f_MX|5chyFxdImI&<`GS0Qhnd+G1=;#>g*x-2Qh;U|des(N!9PcdYM(KS6(N^o8v= z8{9fo^a%eauiMkw6Xwb1neNHsedJy0s|3!Wm_A0osuwgi(^XQO8TFlP6Qud{cqV`x zRn@<+(<|{DWW0qf@)-Dsu4@sFyiS{IgliLQLFvwB&Xo?2eULqi-Ak`^ti39;R65$L z+a>!>7y>_1l^n*ggj!@a@ZW(|$1O6V*BQtfyO7JK*q|%rUZ*fs$Kiz(jbU2pPcj`TiR$%Fm1~NzkdS<*cix#sx)o_VPKV7w zeY_N%k-E6a9(BlHMfyQ%kx#d58M@8I7!xw)}EYwS|3@b4Ey$u+`yBBkDwq z4To4MJ+e_OoYuz*z-jP>o3GJBH*>2d|Ihs25+J|ViUxWyNz*He%nIk-xQ*M_8% z8ZTh>$l{&u8Bd36tnXL$SZuZXfXiw9wsws4q4Fk*n5Nz`-xg~v^y|khB9*#WD1o?0fh1cqWDYd8{epe8 zy^yv|wyY-p7imSm{Pp4e>z*&BJ{$e)`xk$_&hw#h;<(gryhn7Oc^uEBopH|>;pvrD zE9GfY^Q8Gnqmyr^^i2zMul8j2&Gbham(2Hpo^oStG>i}bMAVH6kGUB$Kc;xJlA&;T z{*da9H|np7N8X~e*WNqaA;lt!M{SI0mML52FPZd=9b=rD)yJCZ=-~KZzocbTOUl)48)1zqOm9lO)z7wEPEg|<)m<+_{Gl_$HiR_~J3~6C zWJrBiU*{;tSbG<(r20}`C-p*3&lBU{wC3Y0XMl;;*qvloutf>6F?T+rAOmir65d@1>tL+0S{!V zy@Y)kJu;otP0Wq5%Vnf?woO$3c2OnWLJE5kDdm;9sU|d4ePEgO1ceCQ72>kwx~a51a+UyGLct^f1fdtXHy1S!-uW$k-ryS7ht({-K{;_pnK& z9Y5PUX_eIkd8@P>7KKwV;8cgDVWwKzK9l|W&@sZEUA<}Z7*D+^X}>4u`*P;<>d&(i z`y{lluGKkevZpQMhKr`ysjHxWq<>(9Uh>9x|?e&3lMvK;Mgi#Qc- zh20AMH6+P7#!*!|{lYx9O?o18kS0*VS6$4 zEdJlT%{_Xkl4Z-cEGq;Jtb=sy|T z;7hw_Zn8E6{JxD8^N8qX;uGIc{#CDPm+UJY z6`bRoGo6*_@QiRYz&>oDqb`@y8&1bqX*l?Y&R~<{srj!0r;rJ*x)CiFVnsCnQV6q^K1cQ!;mnJrJ8Qc1Gqw8I|aTk?q4Lgk}qgb@fJy znm9Jt&u9l>4(lV2k?vAoGi)cMf8jWIs`ev>8ldi%tJ%t$Pkf8qt5e%0Cx4m#B_e5X za<9~V>4qnr`&Jp=y<7S@|F1r`XNkK<`rI^s>bcb8sc%yYqzy>BoK`12A^n*!9qF>e{*xl`TR;^_3^8*X*(T)6* z7XC1FVn~#0rK61f0ZcLz==6rohwSECy0X^Unn?xe;yR5ro1(Ua%X5hw2~&BTSw-*W zyY7j1N1$o@x|@2Ic*FgRbQjWGg6!NoD!)IFIXrB>f-7bq93=7nHU3j@%Pu67slh;^ z1WMR`k>cgoN*F!q$L+-(jqoD>vRhhFt+TpD$)sGNXSXQ0vi0gJu4%cWms5vXr-94m znurd3VSfq_>;okgtXO;L1k&_{T=5!Yie7VBFUbc9)+G^bJuuRYZf13BL7=VFNg1uh zIXc5unbT2IeH6&yADa4W!s$0zo@akt;^Df7^`3lw@%i1V#0u$tf2V*CCh9{{i$Hc` zrnh?f+7vl?K+?0M94U8GFQjkxH20mulD0QLTW@T?DXZ;2h2)C38x@wRQI<}zR+h?{ ze~9T3nKv}Tu~umw0_B1#9;gW3>K{FU`}|ZA;IRHX*fPY907N_opgp9n&7C%}Jl@ ze&^YRW~*TBv*l5WX=m(zI*z~&aZXcJmz>YG%=(>N^n0^fpp>*iDQ7?J3<U3oj7IHIe`zdh9^o5&XsSxv-IF(mq53b;%}~NJw!y#Jj)(U?bo47ZGus zt$HB8Wit&uM*qzp>kp%MeYO8vkpEo`ljt!DoQ?||!5`2bd?nR6+gKQ8Tn;AI(#zob!>DA3P5kXrtk^mmU+ADnhIbpgl8)YR1cX;ssjrwt|# z-X^`1`>yALFUnY8Ii&BEFKQ~D?H+BK`an*FS!NBKm=nm6bhldA*2{Ucsg4b<+M%7p zUWVNbYZEp;bWlhm*SF4SM+SQlt+l!W{-4J1xD0^Xswq9M#pU<%RoLB!XlYtD`+3a= z_o^mSrM5~NEBpg|cfIGm&3tkG1$vs%j@)P$uyD`G(k4yfN<*xiUnbQ?W{Zp$Z6_s96GCa5W?ZX^h zoNt`(h#8(ZRENu6SZk>sRw}|kJeQnb67v!YNf)Wjh+1n0{D3&(jc#z{C4zS@CD)Sj z*e+WG$pe(ur~Bjl&4{3T>lFg59a5>sS)0a zM$Le3>qG`{zg5-P=*#YjPG6sznDRDdOzNn#Q|Y-qGrbAEcKRdZcWa*QnfxpHkkpXT z;gce-W+)f+XNIuI-C^fkyX^leBc(7HbynHt%Kf!l&H-W9BL9qDk#TXRWtnzm%pQ{^ zDly_-SY+r5*J9@bG7vtpZ`tYI_p8Izob;=7R%5joY8_*o16)eTTUQR(bVnU+g4{3A z%9!FS<5`t{E$va->U6Jrn|G|g6mw_BkR97$-Zm3UIcUi2H8S{rn$1ySeGQ&rhF5wDc>v+kfRF%0czG_NTqEW545+ zqqk$XeXZ75y(u>*`|!8*A1uguVQ2Yhf{$WlrlA>M$UiFWK%KrK-y2W&f)h@GpR57I ztS)1r9!Kv;b1>fRjPhm);?W(9T_{e7PF%_*n9%>UdtA!9;%!iB`H$s^O^ zJtzH*%@SbLe`faA?`YbxSO~i})m_gW?XK+J?QZMI@3p*dd~f`wUc)>DXI53YqMFry z6W*OvSN4$Qt|89T_Vema`J$~!U@TbT!htomEpmu9%kj{4H?(Sa#)x_mdU%cSI$;$< zi-c5jjl{3(MAl)7J%&3~7;cA&V1xfuL$%|~dYIwp=?r&uaaD4yAyQ1xG&Naz9!O@g zMLB)3e;|w!L?o{nHSP#zsP%_c;JWz?Zq97P67OMo=C(`iWKDix%?Fr{{|<%83*hCG_ijD}zY=fRP)1-qqFDc?eMT}&HX2ZDSZ6}~m#+b)5X zh@alQeO7-mHTaHXnMZ;({T8g@MbJuHK^&b2MIff>?F7f38}^9dbgbtf zSJ#G00^Ctl=sSR3-397zAb8NHpzGR!rz}NZXUHx$LUaMwb(Y-CReXcfW^HQp zo2iR$0=ZrjIj>2Dz9PtoqaY2ogYzp6L&hqqr}e-=H$f*aWcJlFSh6CCc1qEI@-rC1 zb7YwY-url2`l(Ho_>Rx)bb=|S>2;^^9p_7_o&ssAd~-qp5Rm9 zBv+vgCV&GJI4jXj*NHBqDo9Wih?sX^B?M;YE;xx7L~GBG?(A_j$!O?wFW)EczbC@cB!@w29g19%{lR$+I=*+*^Vq zD?>fZ3r^-ZXR;dE-Nv&Xa30a1?gZwm9JPnMJSUnXJJpS<)MVR%0BH{|%Rz~Tr@ z+#{qTD+r$fU=ntLN;nOAd_C3RZhTfr-XS|*MTx2Evtqr1m`Z`7?7=;2&tF7`b`$Pn zUC=X?d43_#ahX7q2^6B}lolw&gdpxmtn6p5!p60JMI?Wset3ZE8v{bTD`=bFxQcTi zS2A&aRlyp4$GW^j&gO!^6|ySOr5&h;59gU@U&xF_KDMGw`^zL9TY;e+zl!B)Hpa+?Cy6wZ;Bv0OC20 z=d=a4J)OHE<|YYb_Z~h=^nvUGLvxMmlRzXDVa>}SPx+~jE8u97_`3mmrU>_IAko|| zGNQNOEO<;G!cAoT4EWU(92b$*=gdnMv!s1g9zP=Aql{ z4PEV*c&9^jXYAr@AHRurIg2lKB#3}r308ItQr%N;eozp6f<|44XK#V!zy&9J~as0c#4#U1@_UK)s|;3z@PmV`8Z+sELW>`8}zIQiTAa6?~_uJQA!^axh! zvpjzqxSGmXRz*sIeZfQ5PHuX^nuE0&2a10I8hk#-JiO2)aP(}Dw$p2Ng#MBJM4i8* z*E`d}6ARbM2_(4CN|6mWEu+!r42J5jy#cc6)$m$Aq@eyQG;5E;)pBIzSYsHSQ z!rt%AYFxw1X%6oEtnCZj)OqP>D~_L78dOc3REKW4J|ID+aaA+0NWah-R}8GpD|Yuf zUNZta(;oT!k-e4=ykr9RcmsI(Zgdh zU=5VjFydsCrg2?O(O6@o!SZBfmfBi-sQI;cElkU=W>RA0veE`D^k!Hwvw^=V#}u?D z#K_g{iCPP7y1Iu7OG7!4Ubt{NkTfuMndodA1po4Wz{s(3QGC9+?8Wo=CvMJeJ9*Ok339Zmuf+MFEoelSGWtib{PWk}5`VG98#*!OJ8n%L%v9* z;Vd@x5EfMQ1%VO-OVtrPQCp5Sc%x0|_bCM?LP8cEfU-MJKlOQX=BMe5+e?4fI^xwM z;8bII)k>uG4)>@&vqnM28FQKWIoNl~+riu0d(}ISsS}g*K1LQWW=)uQm8{?M|Lxo6 zP4jH=Jojw$KKAw13z_$=hPKXhpCuBF!e^L=)S}uc?S|GI zL}3Z#lXM1Y*os}*ZTlb%S29zTy6TwgJmhTa9POxWPoyIM7g!#d2%(R%U(E%3_9|yH z*CbaFS374>$1QD?+EkeYVyF=Lj30oV$5XeetR)lceWSdTX4o1Bnpj)GwT^))cBmDF z^-RP99E0m+kTngSx~qB({UcoE+#?Xbpv@q6)pJ!@+R< zglE^EDF73L(_qWVxqyS8#akYXR1K%U_mxyq9*a)@49dzYKakg>(+iXNdxa*qfyC-7 z|3x2qgpvomR=RuvHuX3<(QgJPP+kNTn~jX+FR(962ldqnmURpMnE7b_8tA}+X#AXX z0vdQbYw=bcwyoS}ueFB^^#FR%ensM%3mMe;WrpwPE)UQA!}KYwzt+%^#5;I*0EH%uhOqxgs3Dk5D$}Z zIWwn`=0Ae$T=F#Xlmwko$y>$OgLxyyyR9o?GR=vBJvt1z`iXQx*z(&4iI#3ksa`7MlzaTr+ zVG#_WlKTsKu?UkW-pKjj=ZIr^(0iWU6!|@ce=ri?<~MR!YvF_3&fHajgHNSwafPy};KSWcFer!BsfvR$4N#v6$ETk^1qs<|BQCU-g~x9CYV!>**cb zRXroTX}-ZAo-b2RinCUli) z9y;eZ-eN@;${k_vx?-CuU6u!{b?hETH&@w^fgx$Gch1g^KeZc54d#N5#28 zKsXQA25XqqoS zFn_NE`8$9ZMW^pj|3A*p4|*Z}qW^&3^iS7If$U#_t!zhTz-~i|zs5B;Xz zpQ*eF=5lJP1BmCEq9Mk@MzI8q{{z1C8M7%q%n@>cZt8fGk)N7OADBTL@Dkf`gE)5# z)5sS~S;!RJpkMhWerZ{9;{C`mE94lef_*flU**ekW~C%JO@oOe?PaHY0MBy>Ug!}i z4CMAcIDx+*ADIg-@-^fEUy)Dv0Xh6gv?arD&_OJOT?fLSAYHOdCJo zUz9}}KMnH+xL#L&fz2J-pWgg`^MiBlRD9OJ{G_UDrz2erG4g zel1k}LtX;LwzE_Y7VLuBOM6G>WLHdx9MZy-)j64bWVEtdiYJ0^gx7sYIxZhjhN}Om zTU4j|MV=;o3UsziI3cI%)8L^_GxAyOK&t+TO`1+_H7#%ew%>e40sT+^IDex5sQ%E% zW7Wskd}GTYoySvA1GmkE@cr-fSBH&$j=!X?GL>^b-r8!8dUz9xS>IR%FIuWU43_$G zMou#a9EYz1Vlvtpq{f3z*n%$GVvfUSOUDK`pbzLR4E}a9Pc`Tx{u^y{4-dXN5mY1M z2i-PAde3AH{8%P2UPV&+z##3FF3@BA4>;ybOeR?=KLk}!1Qv!^G}d;x1GU}r=(S$R zP&ej9t|mHqEqR&o@diehc|=6nq_<>SwvlbwLBw?xto&y_DV2!-KGDy5G-@|ILc!{i zgl{G|H+PWPTZBJ52>nzmh@JA%O#n6k%Xypl=MmrkL#Ead?Tvz6;5XvTefVNdV&Naj z6jsABis^H=v7dj_W4{v5wve@-&WOy0OTX{i>y7ukb5C;5a@+8;oW4%}E&5esiJ5}t zs|L2F97xC9z8T&D-WPDEH_#)^*VYzWE;RKDWh(ypdwL4`aDV^Alitr1g`0uSlB`Tr zw`(1#g!-sUEmb1q1-739d&!0t4z#ePfh{?q{o>f>Y~X6>`pY@hq1lJ4DjeJ0S-A+g znDQ6hAr~B`bHD4kt2@X9lc{4nl>D+?YKeb88zf0Bxw%pizTz~d0UT9Eq9^MGPQpdC zUT?^>s60k?Cex3Ei@GrW$@kLlcq0oz$^B;Bq@I6X{~3f3yOkMxjfhUWNk^$;4x%9*b}Atf{Gs!Z)C6fG_OdR|YJ_LEnpnc3`yd~Zmq5n4 zCyZz3(U^^iyGjIW9#cRSJSLkI3x8cPe6;NFWcaWJH;IsU+Ex&6b|qfTL0<71Ihx7% z>9vWb^AS_$M%pSOL880639)OAKpGwHi(&p~Xw^Ww|3U}K8RGA(Sk2;aHu#alcsMQ= zg4{k!CL|gOl(_4etSV+91Kgx3{GsrpG-3jWm#RQ-eTM&% z?`K~haN(c*4U80XeW1KFT5bS$QhQ}R2!WnVEdJ5jMpu{5d}S4~?T{)c%hat}MSC6i z_%AbM*)FeyiTMh4zW^NC%cMBPs}8lVa+Gv_@7(U#W^bo?@T~qJZf}dH5}^!M)3nZx z3C=REHm*dc!@1X9Ok1iH0W;Et^&8A&LS0IcFDu>Q(QKvusZ5shNE-s>E!iwf{Wlqp zz60|iCI^NR_4R|X>6+-nwm#x_RfdcH7I>H!pi56!>&V;eVdrPL;WU~aRMft*Yp;~=r+Pk0ax;~;)n8c6!$`d?}Dm_Ps-nWIbV%zaj3o_d?AC->9*n`v5 zv9eNqcth`PL9T5L&vPKV1@P-{WCOLDhwckEv*xO?SR~64ZOnt9A|Yx=Gwv^6Ax=&Y3fkxiA&FrU0g`@ zL~vf^C*}fuiiH+Di}R>OjKULJ0?x9pf4uKMZ(nbB?;dX>UrxWGKW0Xi+sI(vFq#=F z$aEC+Z}9!*+vRKE|4E-g!{M9U#-xBfwp6K{Qe6#@ z&nTUco~UIFW|o4$cMHm`Noyk-1gL@>?j zJ~A`M>W)t|jEJB#J%#7#R*=lb@HQT#lHZs}@oy@WMag$WV$+H02cP@TdKc^j4-F3)-2?!YbP9lrJ)Wc%19J3L}{D$UD}ZJ$)O^(uwKyJfFa-?K7@e?`;uE zb}iLD&N?O1z$|b3ZEj$oywJ`6&mOI7RLk{4OxxiW*xM9mKcTmQG zJqrUV)YzV?)zW%UW34DhF##nFd)^c8c_&?TDNJ(BYQ4111eV&mv$KbyQIE(=;f#L^ zM@>2&fRp`DJJ?G!g~+CM5CzkX?!PPSyWZq(R4j{N1uaKbZ8EYr-ZIGhRKXMbhK{v= zh>DKW{j`c4wU0diWhx5&!S&T;FODaRc$1pS-}DI{qGRQQ@kW2^&*+~_RkW3F9~05O z(PiTT^Iy)9BZ!ARag|%J@eByt4Ek)c$_Y#7u3{hP?3GX6uk(z$iG)wt1a>BI>K@OmRS*X)i%ml z_ctrYBaHFGW*HjP=sXN;-L(I}07+?71;5LUb^ zR(CHEK((Muz9f6`0?*Q8 ziGNm7mCVLxH73(oo=hgVS?uX&c-`#GdK(0b?-F)^A3fwCDm(%s{!S{lEy-xKz_Z&Y zRU%d$O1-Nz+2xI}*e`+gXd=`=clSA`9{j z@k1GDKh-WDHu66{B^S?KjaK|Xz3~F}zZ!MCrN}}|;0tz7K@Sb1hUExW*hJO01zPSu zw0m)~k|)t$2l3xBA}vda(?6m+A5kCa2G02ak#}igZjs*}PbMvviq!AaWR4KkjzlBk z2NSKXzy|+K*IsU-+IXsMxrx3@ka5|I7Tj&cu%g#tTu;Z(xkDdTH#n%v5HFk|?%&Cz zvqYmWxwYAPQzE+YtobA(4*dN!Ycx9GXV!5Z*@e8w-gGhu^{K+03H$)Ie;N}>4&w9G zCOX&2ghk6U==yv_eqEw})FUmI>(RZ`McqyB!Ww#=o-04Yi$0g=st!|1FT=S0UYVoj z*VbrnHQD}xUDsR>xbYNA9c$S#mdVz)h-z&&l2uphtBw`kz=Gi+vlLJDz-tlU~EMy!+3{ zQVT3?_aM8?1U|bz{##9KYeu3;!S(r+EN(j5ESB9jXoB+@Dpkk^QI| z9H-J|gJ~fGseVRnWD!=hK72(*$mf=&PSFhe+cQ{8ZAGT81Sl*6ZX^1C$jQYce;0@` z6tYl_(Svh{bXQZe9gX)WrUd4L!JuX^=W-jVDo$lX@YCjiP3I(xLO=64MOf7^Jf+uo zkSoaW;ZeaQz7zJi`DEO;m>10tW;E5SmgN2>)3LCc&pbj5^V!PGJC9~Zq>!iRNsWIW zQIy~W+Re_MMGbo_b(jt0L%eiG_rO2?hjskIq>q=Z`LPxVpzQ8;5VRl(nknM%RObQt| z&Aw@kZ~ufEaUVREXs+xrxqx#Vr?|qS%>LU&2J?5cc|Y<_HL*Tr=x(eD(qj<0gKa$L z7V+F2o*hpGVlXp(;<);f^!C)j?-`0zt^is7H>-cyx(j1~W#wX}`%s}iN3}FNk#~Fc ztzb3lN|wJa5?LKh*a^G03SUc1REi-(D;V;_(3bD0GK)1ki`3mG3O48(%}8vTnePD} zy=2=8SK0vTU=4UL!Ot}YzikuvsqJ86Ch{3SP=B(h3%^3zlCX$^|05^9pp!V_0a>;U z)ZT~FwcY_At{b{*3ifg*cmF?pv&-nlJ;=)f{yLu6YARWkmE`D;q7Co!eu7&`u#9{_ zo?n5keZx<|ykb#-CTYp1zM;B&ipu<2_T%sD(GA$%lVtYujoOz*&ETp&L)jl4}sB=8ffd7J)fFLLz*dwm49e==F>R_p->e&@gF>(l63jokHM zKJhU-ORxcD!rHt9H?RxIUlz=1KZTE^ChN456?L-5raT#f6s}V6`#QPumQ*Mg^V&t+pLVQEG``j&B=0iczkp0CfofrGUuDl|gp&dOVkRX}RNuAiIdy&0FR>}=m;}x{%93m0H z{4d!12J*Pz_SnU-9SNR_mJdA%X%faWx zB8{1mNx?^BAPJACDeUKZ7qe&P;HR%e#~(u$AE5mNE0^F05X%h@O zU-^eX}g4f z^cLw9%vrfPznq+_m~tR-mL?Le@Vk?*0B0Z=Qup&of}?akD=kn#4>;3MRxuB+%uEf~ zhF1N6T;AgoZmH}$!DO+XNp z3+~6B8;`uLAfvjI-MpKh ztFR~|$(FRj);Gah>c=xybJs5O4uUc16FX4gw(hY`uUIW17lO-AEn{)mY)O+dN!2r@12L7G=lUOUJY`K1d0ggQ zT|CFmN(lZdu?`PdrTe_cd)~p#a|8#RV5?J+3NMl?R!HzlJ?Ha1$Yuugdv5$dfd$JP zlxNW?FIc&v$j1t%r4n3GagIXNxbp<}oj~hUK@NnquM1M4B&#H@*3YVcyp%F10-d4C~sf_Y4=%l|%`i{|rX?v_~puMBvCBQJ^P-p59r#UDD1 zjQ+z;zs;(AU{z9i7jb_CYU(+MV3WJYsz2uOr@_@1NVHF^o{u{uJ`IRM@H$mKNe%uk z?ug(M6Kg5%ugw2KSkFAHV->Et0Z0|W^jU~?7hHfDc{GA^jOHo@3!UKWDuf&rXZ1@2 zGkhiZe{R-6aMih31@SX0e<{dOnD_X4?*tpySKc>?&lcxm5B?M^V}jjGNTgT~30#<-6Eu2Ha)37HhvC0N+RPocAfo)m2JF??Qr?tqx0BG@ZKd6ux)I$uH) zDoBFhKBM3P;w6TwE{c`-0sAGmKn1s;uo7nQ^V5UR6D)jU^2!%h_BlHA3C9Oy+|4^0 z9D=J*FwKeI6|O|^jtL17x=!%TebwS(eoQRyo|{APKc;Xs54p>?kocFpmxHqv%zZzx z`i-~;^@I1ID6bH^RqRv2ESJXT2)?z9$X@>7juzTGn)MdDKZ^G#$ko&c`bz>CDVY2P z7E|CJxn$nK%{~)*Rmh9r$rF5ZQgAQWSeY;E^80v4mp~;6gr?w36H+R)w~!#gruK&G z7hH0JUHv21{1qi9ynMl`Rw)=Ui}@ZIf-4|a&daNWUJ;CPf-f(MLvX<5VlDD=&N;Y( z2=1j|s}wp*tfbhNg552Wv(Fq{w{O{5CAqrtNL^X(l)yaxKbp=0PRi>0|MNWaJTtSi zy>xd;N_U4y3L>o_-J)R77^tKoD2*uL7nBeXq>=9K&IOk3n0R9T?=$=RJ1-X8nR)KL z=bpOfp7S{cShs;(J!h^rn6X%&D@elwZe1S#-%GS~dRV7A8Cxu)>`*Qmr6AjhMG&Mq z=_ZxHSYoq9vzGin{oI&csSB5sVNKC+kdKu}*Al_|6(qfMs3!j6Q^rXN?~m+sVZJYT zjUqWBWwI{OU4nTjc$$JqD4dgP-)$^{XhK0G6`s}^M`Xay2tpI#aFd-93Wmab917DZ zou6W5#g3PPCUwGm+#EWUWn}Rbl9*F6PZGWqL|@5d6q*a(rf{vndm@2i%}elZRXC<1 zYb^vdWJfZ2Uq%s`l$i;wqyyJ0*831n5Guch8iMzk6JC$Z(ZSONZ?#xhPt<}B>!1@Q zvLU)sBwVB-Cp@-biRNQQ6_~#u^3@1`t~gu~$EpN3SoE};KjNQ+&{u*fDEuLLpm#xt zI)tX&7Pi>`!nxPkodBPT;T6ZTz06u@CR$!}glG)$-DJK2RuY7Qq8r3Z5nW!AkxTG* z5q4YTM*1y*1IJz#;2qi1yy4l1Gz!wG;6*yvJNa}pPZoSW!EhAHC-Holi+EFlqnbOe zP)oeKT%=2d--#K2J}PI6)_Tgw&?9YeKaco~a|X!W}wv zEdd4V5eE`#7v+8F%W)R!?B}#`ja_m;j{@whSil$I_fA2*$9%gS9@9|H@n7<1B>%1g z)ic;#LC1U!o!rQUpg~t>cdGGsS;orsJVd+t!_pwyKsX_b`HM`6uJtfte)z2-`zro% z3!dGWf0u<)PBJV-ZXcjgGMImCSR)kU9hL0StJuHo*uMkpXDTN<$s-rr)B+wU&f2n& zIPo{0LJjI-7=y05>|F_H;vm*=mnVn@d&2CZ`9^KVm+G%#>~b2vJ%^S%hQ4^f`!TFd z5K9G5yAsdx;LSb@Yq)d7RL`SXBv)8`GQqqp5!Mf0_F44KLq7R}opgq2D>hK0ruG4J zyUyIQiF#K?qxa+VIsmOKbbXD@zQ(tLMDW_;1JB@;JB>4QJA4=?IW_XGP~8vJ6T*@j zg&e;KXNv9!=ay{Z=TV-Yg6~!o-P8!ZTOXRnVQ&Nz^&+dg&FHD@gJi+q!CMuC*`xe@ z2M!XdAH$=c&Z)Q`=diut+5F>phx_5aptsFct5Y$*gI<%5!Gb?Rj;=~h!I)56Dkzpw zH+P5|6({RS3+>>ZIoqB`e9%XH@F+MK<%rl#C5qV?tp7i3PK1taN`F=rrFxX5 zp*L)&HN!l|?aB|KPnBr0VD1wA+v(_K*8#;ZGdR*L9U7rd(%*ESaqV;}cITYC$@QL> zcoclF^U2`XEdr}O?-jgNPOY9$b4;~yWf$hFpgqZ$^R&yIpKktochU3hSzl`7^2C(* zy%1(Hy584A>F#|Qw=0hse?HQy_Ro3r>foc`-EH^YdipH&q5V(H*`hy{Z~sQA3bTvl zi*03RCVL+pyY=C%XAcUz-eNq9yimwdCaqk%(&r0Ki2R>fCH1Xmn;$-U^!ba7jCP@f z$ToS~6dF?KZr%e?8`Y)$UTLk9s=Z2oosw}aSlrpwTP;?L-yZu{FMQ2#(`*8Yt2 zjNaM31F`lRwXW+e&mvD9_hPM`;G^riEN~X)7O{ zMXGUU^0wLz{JT4F5*=9Wr{*y8qUo{^hQ3#xs~>|B_zCs!FHMJ0nT(y2W_D}s!%JRkJD zcv41Y<4}_KMBdUxP8VHSs8&LPC(>$^+2!>&FY6}dq%946;@lf`I?ucUUllO(+=w3O zDiCTA_$B-2tmoNR{N2o+AvgS}hE5xbe^u6qjMVf_nKg3~1K(NHdMV)Qn$!LNW&W2s zJNaR9!E|5FW&3OQ>DU4Jn-soWIJ)4638%e-)cL^=vW}(|OB;|;)HlHzt|fcDah38s z&eJR5MNA8CP5mp!Yx5?EcfT5RU2!aPuG7D8UDo$FXE;`w7yX;FQ$PV)oc-9}$Eu*N zblr^@8~MUJ*)vG{A~Yh{Bxhk}AY*ox;y-8RRiC;(_Qr#c7V<4*HH~-^ot) z%`(i;0PUgsTEwG>Jf0icbw{%KJkZ0x+&?F{-x{H;*Os_`ca701I)((Jv)ZIodbR3B zy;n&o?Q@!k=6L>zn~?uz!BGW1O8DK|Q;G5SO#3pa=c_!)H8a;48QS#dBY95b&&l_D z{4B3mT^o3q@jT`Il(y+nzL|C#*VCx-@$V$mk82n6oqeT&kWPkzLNHtlsnl zqW_BfByLo6QO``}Xs}TB(DeRkX1bp9vq7GVyK3ZvC?oQa=eX0fM)}KTT}=;Aop{gR z!+z_j_00M&GEKT!Z$o? zL#CNk)4$g|uYB(+;=L33U1Yupw{C>)2IuFT$c)RJl6B4Zoq0q7g~>Z3YEslE-m9)A z>P%~7U{lVT?8!Mv{%_31jv-nn_ifKPPZ#$pt-q4r9$}oOgY>{)e=}(BR1D`w`eEJF znmR*{74|0c3$i?_nD?!`j*elOvM+*N?$2d_f-NJkSFY!0noC7Pc>hhAKa(6`X~fQ`9-i z1jlUf{!iOvmWDSQtjX^c;13n?ctetWY>pwV@Naf%wvd}A0Y}pnDvy3^FEYPR+EJq%-D_Mj-=i40HhEv7d%IXIC>oW6^wJY>M z2{?D_7hHMVQ$SUH)2S)Rc1x=%cgEXHw|xmLp()OTT5r9Y-c5U@HdPje8rTELfnR3L zvd@L`anEy=d$9r3^F9jowC|Y5jp9Zj<7Z=mdD4mwRU!YgJvLwkw||$(Uw((aH+`*Q z+{!I(7HPtt3JmLFh6y&iBhwZ8?7&}QUbKDMTEn|Ol?+uy*=oyVE#8S$as*sphp7Hz=4l9=9H zZq@dZ$$698+Hc6aDM(kA7FgnLR88(CE497jCN~sORKuJH^PnfTyeCnv3Pe&na|`pB z9EGm*$r zPx(Q518syF=jdh)3NH3l$R3utB;#5}wXDx`Mg`WGt3!!O0qV9}Ds;RHdULL(4@jx< zdU4X$*ZoslWM1%%Hm5pfI7@>|=hn6>d+Zg)P5=DuD5hxy#zs#MbAT>ag; zryOV$jln7UPfyT)&>GQkt2{WnceStd4z5P-R^);W@V*^cJZfWiyAsC1QwYlq-)mPbnI5Sszoe{7KMbG^GFd zGAhKE(5?k#%2x3F5q(n9)Lx+fZSWn9%OYilY^fJ ziuj{^BXZu#`6K6B-ywgC;ANwqwbkAq8buucA3VuSJfi@<%~J9PTH$-1a%>^DyBcVx z_ni-%e=}YakkaZqCt;iWYR5QIrjpJ5r}IZ>$eED7r7gHQyBcbtoL3uab@aJje7!RCdmFCTM?a9ra_np}){4>xZ@TPP+dn-&4;}lS6YUIIJ2O zi<_y?-wPJ%BGm`)T?oy#+o55;q7!Hj z9+@NYCHtZK_ZX%8gR(s7i&I)9cTb*|az1TC=H8rjfdb|eD`-!|Tdj+X?BuS{ut#wo zn#k=!De~)EbF2C-xt@>J3fd|Cf9_=wgTTMs2=Zx%=%P`>y`Oj{xz2$)RvFLf8?BK<1lR-A4E;s6$Dibzeoj4Kgms$SmbcAFFu2wj1C0vg8ZLw$TJUmUPvBtSWuRVg zWw0bT95v~ESBPxr4cu3!T2b7MjzABT=5Db$8L{6{o41iZO>a>p--f)?d+IiNr*2iV z@$HIf54At_p03L-6|~nLt}pekwUJ;b{LWovQErahTx_kw+pmQbR42!77QEKb>}p&I zUJrg`%r|50v!N+UmYNM!-XKROPMzs^VSjDSH!GPV$#2oS&T3#34b1iZn{zy8jqlyS45OI6(Glrc2`76}fE@`ze_kpRn z)5u39d>d*pCv&v!$-UTNPPkY2xq{n?IBNY1*<-Dv)KYwFREAoUj3#6wCEDv89}@U& zNk&dt*9v{A_DBsm3WSDPwanGv;Hnqc#aCFkEz8Rsult7c$jug^XU2Y6zw1# z3fpPLHG_5{n1N_J_C-i|GZJjU<1v>?o1#cU4*>#lFD!Kbd#CT75 zD(eG6>wJ$=o;|bf6}?&i+WBiwZ$&j99u1J zZCqAdr}+QkKS`*c$D4OU-g|k!$lE8+`1mI=*CRK0cIdsGK~C3~R824BSsPg-R!g{^ zr&ZoUd4|LdiTd8%UF~m`3zW;5oAp`N-`VNDlfl2N77j0Y;j7g_O5e}}vwrX-)@6Lw ziOdU`A7=H)o|v=5_k;i4z?DEjGKxC}ha%gl!4XEPF%?|aI^eLX)>r0Z;|*gms5iZW ze(+r~tXhsg)du=Bcjt)V-p$_9-W!Cj(zNHC@aho%o$5HKOm|M#$B-EvifHb=5plp% z&pkok?yRipN@pS#)wt7(A?xHCRffmOez;1!X99S21<=4R&7tOP(DNsm#ydg2dlY~PU9uiVoHMJO?o1fpk|~LT>3A*T3&9Qmrxzu)Ea3nHl77P3|0-c z1h=LuIR9^2Z&InEj`N+fR0RDX$`b6KPb7xuY zedhqYfu0}=O6T!RywX07PeEUP>`VhAuav8VYb~fZ3!KH&)sCv64EAUgwWA%(m1Y@m zs2fs)ZQ51H@2E>=a~vIlv%;Ow63O(~M^4tewga7+W!5rV7)63-{k?tnvPWc<%`BVo zb$a*oAJc1Ol*+7{)h@ew&h?xMK5{5?^5zW4-jmfVt3XzVtmj$J=$mlNKQq{gQ^=Lj zL?u~mqV?B1yQ1B{xC8E5o}S<;FQ#Kc{fM&>bG>6C2Ss%T?dA8F8!csSo?idvx zc{gIG=eRqM`&STzhr4FFmbg}fhF!z836$V`T1hBfQRxKIf3eVgP8x}JMXFi^zuLr` zo#PCfcW(wQqAgxze)7V;3^f1)>Lpg*tFXjTKbyS9T$RP4tG zb=Bh`*q>poc3$=Hx zi|7`yQm++y!*@O9wb{$a$q$gxp-BI|h7-k*k%-SGS+-_s$1itlslim3`D- z#yl5l;EZ<#-N!uRJbB%w_6;YBkhOsm>nbzRdKhY|ZqkxnyF6(T)4U&pbQKX1>4|lB za_!Nl=tK3f`e%AaJ(>O=bwI{kLcLNAD!1E_Z#tG54cpO@y4!VhcJGCc+t)sAbP5#m z&C5QOm6-J?dxr0)z`w?Bs{tpQjt=fB?YY?3SfhE+2vou|xnUS)HBL(r@J%*3w0%Hj zkEZwO_s;LN`T9&(18^soyKA@yy1Ihw=WrHLf2GG@RrYw9R)Os749{*NJMTo4_VjYK z(OhaU)XFYltuS|)J*}Sh$MiyILN3p6&h|S(gY1C$2PkI8@ho}=)-wLN;KyYC4mN)> z=bF92D_d#QGhPM{1osDD1>Z7G7`@F@^Hb}tRh;^-0`@~}{`+JHccK2PH2r^0g$_G@ zBQAU%q_<6KVYRC=!ZC{#j^%aF{yX#x%ItB*>E&EEIqjc!6?6r(rOu*IsT;FgYIUPO z{bOqF#)o=PKfV^+-GiVsd<5QLMf;U`)Hok38Qf2Pa%x~CIG3l5U(9wO-H#?`Ez`~* z6KynowBIK?x3PKM*hIyP_-=YIx`6R29=4yNaB?YVYCTcx$vUeW=6v~##~q4T-3zjjCKM})}j zD&>lCUDH3;^XN;oYT9A4P~*`dYsA!JJ@m@@#)GE*ddZL4IdmGaHgg-iHjTv!U-DWvDR>5O3*9 z*5Oj3J?)(ri7zp&Sh6m#4YQNukmD6T5XJ54vv76-} zh|Ta%%x;wtm1-sRec3&+!1I&O20wq8=y|pLb(hp5=|?kN+0(L1W*5s^o{^R|AhmYN zpUHQUAE*4Drf1&Be(KLQ9@}%3OU~nZZ}$ez-iQs}v5{q?wndeU9v=Ng^pNO^(buBp zM!g%=GirHM)o6E2nb^*8)8ao%D3hmOo}zjBB)k#7CiZ1?nW)dau88}f>CSa^0<*p; zr_QpjXUO*pdVq{`u2t_))ijbWA^Aeo4RNwKXzW7Ito0xBRr1};xs%h(_sn<3e>|`+ zINK;{zDrK;5n^&RgWUo%{i(iReSi64{rmlY1hxcEP@ndXHJ$pRh1_0sA(N~mr`qc3 zA-X7Rb^6)U0G`EoC}+_pqyzf=f7A$VcWrZj?s*N)|F@p??%uA$nvGqW6Dm*L*DU%b z{Y52DN9+bSLhQ+x)Q#>}esxp}jkVSrj{{TuANhhg@xFb&JN|CLm&O;?S>*E_GSx~s zehS?r&v-6b#wDp_x?qjtoP3-*x4+5%3s6(~lKYtgcw;HbB6X;JMG(-QT;T+@I5h;YZgzcWlIS@4l#-F?y^oCMsr7RC{k} z&roogm+2XKS(>&lZr2Hx?XM;B4Na@fV|}dH&FjDP_?4haJDGZvAWbiU`X) zB=VNGZ$u~e18spye-9$3?a@3H$kp3L*6~~R0h8#k-p%&MKx_(XNDsxw96`O zwI=p7h;9K#)q&bh{bx??}6ufL`FK{M>kX)(sGU`;d=jk!i2qc12e7JV}&^JF@e zJ7y~lxLcd9nq-(Kg%;b5twLsNBQ2PKE`JDqwiVj0)Ixua(EWNfW z%uk1%?>MI^>LF^QN5Y*`IIrbXzfrT)KF)bm+;w9;acXs?5mg*psP`*P)!%k}?h~P! zpbSmm?(-m?)oj~GoU$g-gG}?j`GhK$o#qe3sXyiCDWVu3S^rY=a)sz}W03!j6V*Iu z>7kvD#p+wc^7`qC&g+g+X0e=3siR(Wc>K@3&UYr>seQlMlgyW2rN8ud2|aVRbTx5B zYc(AGjXpVv>1$H%zCQB0I&q&$Syy~-8Qtt%j>%~03)*SYTR!!4@xBu^B&J&27x97k zpW_?G<&EhW*}*eHFX{Y?I+4EWByE~IZ{*3Ck_p@LR?6Q!f6aVP6Ar`{j2h+1r%zD# zlBrONgs9%?HD_(T4$`^9^#--4jkK!xd$W{CD(x4B{fw9pD5U1TpdOeC=J3sIPmZ1Q zi+@uv(<~c$?9j;+->vj_yl=;u+X5?ndQSOlGwY}9T{-PZDcNRJ#dj!2F5`9XgER0= z+LB>egu8_p^#g2GJCF~nDZ}VIR*34GY;nDzBW=AJ zpax-(0yO7yT8{_Acka^3?4uo}^RI`A2HgC&AD z1LcBoU}6jch4%wB6MWhV`Xa5a^DRXQZ8kRrs|6kmCahlFTtOvsp?}I)`ieF;FI@t=5=N(RUI+5X^ao4F|Hh2;Hq>gKJGcW%PZvHwQScmL#p|rYHFX6orQ#4QC{4oU+3ii+ccAk#0A+O@T;=Dr!_f=)AbE$sCy&+-9b#(>OwS=l*n1X>v{%$HVkP@bAv-ObtD;M6sO##>e- zxVJae9$FJ(K3BEn#GT)8e8cTeqWQMJ_Jj5lt_34(eK^rX=S|QCY53LjMu>h z!JEOIMx?dcuIpH$OsC@NSNMCbBQ7+9y{u$xBpTe%CIe9Y6X+XO8%ugFjH|WEQHYxv4=A^16d$)FZ`j|OMUA{5 z4=F)2IF;C-4tCY2#7$SJ+1%(f00Fr#)m?``h?@d%vxfyxto0PR7JuS6U>dVv#>4!5%=2Q;+X`Hjhht@g1 zrS`4>R`YYckUQwPCIS*{06Vn{`QqSI%4<1vU0)$C*3NIX_EoD;QH+8~}^($UJ^YVHPI z`U5kc{f*-TXLHv+&tz}i$Q#~|BAU3DYe8jSsFQtys=?i%L!^-AbFBugzN)9RdzjwM z*<4wGed%wjR9sb43uv45ZJcxpyQXWc)V-mWRzo8zuq@CZ_^)xns_Gb}R@dIt-y#x! zR9)aGY+o`m!N8vFFU~D;6|ZM*)1YrpGFm!c1J&f!M3ul))4baOZ@{T@npY3}>dUocanPfg3_a+1q$Je?0(c>5yYUs48-C(@X+Wcc?v?NM&2{X4ZuD z{glx6l~}?(q@}LqnxUlgVXY+OnrSQ z$)8jxnZBLry|U{1t_CuV@gUYT#K)dv7BhYiR0Lhv%pRRxFS~#C-Rxg-e)1jnmq8+j zTCGEkl;+MxdU5w2kIQ?*TQM@(ThpsY{OC48y{gT5TTvT>y4D`dquuUrB5Fte5H&Bl zFtMhT=pND2qP~s%(mOq3f#)yxYga?pI=!5}4{WwpS_7gdKVgSH(v$U(uA{DG?jr_q zi}#u4at>71U^%;yeUd-8Fz|KYPT*T&j3donAS-SI!!42Or!@N7)HgdD?{OdZ7fF^A zeO}+GoNYO$bMpIE`QGz)qM~-CamS1&dgY`#F z`25fTyxC-`u?J{JwPf%j&T7l(3y~LW>jlov+=vEN*vt5})i&PUBWbBV{>#0atUo^aOq4<3?Z*by;n> zqyB&@npQ;0_EBvd#7Cb9uGwNxH74PW-VV*9Bkhkw?~idSTtt~ePv4eQ!?q-X=(j3T z?G;B><$L5+eL@|eU&+Gm3<9-b5;=r_W9xfxTil;J@Y&SgETF!>19!*tPontE#Dcv-wx1~=-HSQ`)Fz=-xb<_lf z?0q7D`>DKpS51LBt*Lk_LA}%gZW|5tPdZ~=*Ba~NIUh~Nezno-(u=T{zCgdKmvr@W zea|^!B4?@l`XoJ`o`7F~uRd7&Ry(X^Yo+z-+|ixW-qrRvoz4zKCNjvijB#8d%Te%Q z|6pBH>CP$@xMS>M^wZc4uHSNNBZwyFtxNc?``EkpsS!OzY_ztS1G2+m;y1}gG0ywj zK<8>ntmQ{*5ePqHtd8Jqmb2cpdV&uavL+JA=}j#`Cf#iEkRN%UirSszEf^p|Tyt>$ z#%*40@&;aWm+Pim%^GJ*L5F03So40)VMSkKn#L+ZccmED|0 zJ|%;37geL3z{xsC7U4BI18}$O=<2vmRZaPjid2+bA+q0R2!p z94G@~mml^d9{XJAp27g($~R`0K9Xt6uezTaBqPKzJc@3 zyC7A#l&9cDU*=v_Rq9b`dmC+iLT$^vczg6kL44gW;kQpYk4Nf9v~lzgz2^Lhs8W4r z6+E3c=~X($xx{(gnd2-7B49IOPVwX_%ygD=u2bLOJXlIuPxfpg)lSo?r5#1I{X6R9 zwv!Wj4BlG@*L9-0?kxLIAB@wrAm^8(uhtdL^?S@SbjdCX7p(zJzmYwih+GD-_{yPr z)ZZ1y=YLK;-bQ;d+F~X(q-*Vqb|iID8^}C;j|$inu#=i0L-olnO69~lhYHcU$hFi* zMB=v>rcOg@L@JS0D+s(&V-m}|Qj3;bHzYaKQmb~4sNFO2X-)3)%TUkvAkoWt7JDp-=8ox(O{&Ol#Cz74}F8RUbn3Yt1zTy*7MIrSm(l!1#6>*ZO ze3bu7BIciueBx3>7;SQt_rcZQz_pX9GuuG^tyIcO7l6UY{)g16wIC-LY$-B#rK|gM zW+8aUN#yNHuDaxam*MpW6e`d7QduZ<6QUmrGeRWuc|o?#Zbtcq>c=JF>b#q*PI8*1 z1}2VK+=ePEn8kFY;uos??;`gV$iwbPhEX-BaGSWqB4lzAdBu-H1-N7B$9fA8O)dd? z$yu-p&%ni(i8dDjS*!;3rYKzra@6af6YM1qt$?Esy)jnU>$!;fan)h!Qs<`|CZh zem8NmwuSw+q3tU&xjUn8c2Fa@lj^@FWLmGLa<2z}{v;P#a*TUX8NHq?i|WKtDm#87 zg1gxs2s&2}I$2*v&ZiOebU?X+RGeL;rg12irCO*FmU1b4R+j3|&#+c)pzH5w8-=s) zE$VW+A}z&u{y$VG?hJF9gB<4cP#t*u4I-#%RB}&HzI9X#ePOLI?gsk#NBClVU--WD zSHtgn%WmShp*#YAAkx`LRf+e-+K0@;^bGZaz;V_1*?b2b{W!lKC0Yj+<5yVud}1~JrB9)6YQ>#Vx;x;YljN|U(BDYm1 z@nZg^0{*GhnftOYiI>xZ1f=lmL>_8@doU1PdyXpcKd33cME-X+sF)W(_3CNI+NZ2# z|WYp_Cp%(f5Z-!;F1ljU+$+#beH}eBoeP8phmgt@Pj5`YrIST&<6h9dsX8&3 z=WXsdSAvAxk4n;p;0JVLjCFh~o@b7QKFh$tpNp>Phh&yTvi*GLCHIX6*&kn&xcLvQy za4trXll2=m`5vDaJO`=RNnx(%@dI}wJ6oyr-p{OVqyHk<&&FUbjb_dZ$*SB4eYa5S zzm^)`xyaT>=*Di?ZK=nT%EJ6mJiz+zhS&5jx>lZa32A-GZ=Z8FbCpp93I1>Hh!5e_ zJV3*H;e$rxT@Hb^(;TyS&1SF1qtlzAK^3qZ&%#feS{veMhsua~9rR8SATqRx2~ny)T< zrcsyknjMi!V-J*($~g_3{rgz1ozy`6#vX5Gzb`W{2i8M+D3pcbQbqKF9lge0N+*<; z@TSxzO3#9etZoC+_5=EGE!2>Tn|Q28BPt17^Rpu3D#SVjxpWt6*bJ@zVYVmvjZ}YS zL4h2;BNdV_upq*v@>{9XlFB9vj+K#KF}_sFrSOtUC#j!G4X^$Q-;&y5sZ9}XPv-a8 z@KTVU1`;Hdl~PkA2n;Xz+)eiXG*mjts--3>34g-{CB(Z;K#o1w3z5Qf#tDYsk$SFz zydO=yU@AGgm*JTsJmEZ)OX1s6ZCnV?q)eD%Qm<4Vn=3v^95p*q4=QzZVwa^}&W84a z5gZ@3(79bDe9%*BlCCl{sj$BU9i^8*B7dI4y&^*w`E!+jKjv9EXtoGm(o;sN)5P;l z=9R|GgNz`Rr8)e}Vf{91kP4|N{>VEIdCDGma6X(moUGbzob}%3^!64%-vdiwB6?;y z+;9%6+E~VN)HZd2A7`NJHgG3&lp6ZW+#j65Z{LU~^(h?N5S`-UPEjg|PP4n)seTu1 zi-pL+Y+iGzg#QUYVjYrl5}IeQyHcN28mbjS?-=aNP4?p;bUnxuq=qTT*oB~DT{!6- z^wmJ5VlaMBZ)VdB=`IF;Btwfo|e!6J9Thx-wJdxS^z27XePFn)MP z_^~z|Emg5nH7xarQr#DXeu>cgBBSp`RyV<=8{yJD%vCD5q*76|h194C%7TL#7eoKm zL;JQu_t#>-_p>=mRK+joMh?b@tYZK^O&9*Z34UR9 zo>Ph$2@Zl(&|W}S?tp&(O3d~qxj%-*=3O|>F4nj?l_C=oInR(<E3@3F0E2RqO zl(KktO|enK@PF4bvsY*~!AR)8^4&GyrWpBHYCI2>`6y%Ut z=<@)&Y(-1X$1+Ss?!JOI

#^9hY7jdBbv0nE6IA8_{_gP+O!|sySnrr+lIa)Tn?D zRgWjP#$tEil>9bpt_xoj59=qfo>G-8=Zr_;9g)gUsc9Ar8qsJ{?Jj#O-AT$(`Bxi0 zl)6vBh=^yuGvODhEk6$TZ^y#@8n#?(__>FDd(M1_ib8=gta$=V9!n!<(?`y0(Kl_sx zu1#YVd!X1t>?=6~{QDa8NkDq)Al6>^Qt*dVVGCYMI@Ej!J)g2Gg8xzl$?bx#*$chYhSitk z`!>8Or!Yb25j%DdUcZJETw=uQVV;%~sOW8xtK8~asUUt8mK~v1J~+2JYoW6|9$XS~ z`8)pMz_6Fp3tXSYcp5i(f*$5+!Rbh6B(Z!+NM)Yztlnl`?b%H^7b-kMJcG;3LuybR zP_qJ>qZ!=O5So`^zoqL>BG0%Rw!0auPtXpe!uSz8Bwcc34T9TYhq*L?xo5#2|KiO| z;@s1TN|s*yYZbavgA%>)Hs*4hwhXyggl+f{?{XP8Y8&v-|KjIw{C)pq0#Cm^VzYp_XfVEYE;;r$go4}{iLFzd>dJ-PJ#O!@w3szzu zIv{x+`HaY%;1(3YdX&Wfkh=6T?5KFfFWHH+VUKNFSkvzbYx(`G=K$Oxh#BGu{tx}X zh4)WDzYH`{F`m$fXLo|St&kY$mn3!7kD$$eaPwLuTd-ih#LE4Q5A`pzliFc7b12Px za=B#))@uyN&FRc8Gk;=NyLod;T`D!qrUtHFAoGyXz!XkT9a;g<#M)@39?(1PNzS1$Y^nTudX#PaRt*xRvi-Ph1? zD!y<(c%=?JBJy1U%~PMf?ab2$VL?8E(vx`20I_K{9J~_jt9^856KuPioa6-IdJg>C zgYQ&BJCxv66<+R&MVP?TC-GiCcC0GAm%xf;|C^#EhI2NV%CkG7&CX&0s&SUxOMUYO za@G8xa!y90CDRK}a8L5GiV!|qB>JEMF|W~h@sp^qZ_e*;ASFY|NYg?OI6bc>#`y`k zX&(^joJ5`1dGPF7LXq{*@k*FCH*n?{$yuun7OgF@wGTLXj^ha<$g>%YqGn_bvlh>lKAGnto{Z8U3fACt3j4$AwPgs3> zXqylD5I?sP-&oA)zZ4kNKajb&mX0sIiHhIk^MjC!N=QLNKihb^bbVYC@aS~bn zGb|N?S(OEcM27YBNxa|B@O7I*mDbSVbF`V9oR;7Zmk(V62fwU+*V;n-e1mn83ij4S zCofY$S(n*guV^&7zz>F$lwm>Hj$sF>})a4>obwc6sTJl zK4}I&IKvT&sqk(Gw5N0$6fD3u(G05`2Z`ef_L>LuH3#>(iQx`Vr^A?4hgjckWPckS zp*Hc_#&7Qt7pq7<;Ah<8{7LVM^-y^@QPaH2Dpx+|S$?8GtK10yc zKY@vL0@^+xihq!?N3$OaT|Fh{I2I4~bF|quv}Fc*tRmW^C9`jgP7!PiKl1e$no55> z=_Tievf?}3L-)1^uWprkoEWk%=VMCw|a=?8Z6h zmw}w;MGuu^Mn%vk1>x;n6rQe}6$Y|TJ(0x<%uK9}M3~Q^U2kEp1+nQ`*a{xRdLH0; zXVAHV1Sh9JL4Fa7Ef__Ddee%v%2}gO*dvnjVn*197lac*v{BHRg7+eRV+P+An-I-Q z&_1{Zg9g&;t^rgYi6;9J{WzX~H-IA2BTV|~-C$OUd|%LL1Pv#iISVF^AgKseQ;>bg zMK;NRo`Qi@4a#@LhV^5OU6JZH86lSE<>Cy9&y~hE#A6lfB=}B(^Au!d>5TLejW4(w zf}2%?nY2esb>*j=#!4`QY(69B{C&LkK<^V+l-ul$bco7D$rC&*i4O?QNM0x-I9ge( z75jr^0NuQCC zFKBb;iTlpO^4EeQekd%+KNjbRSZF8l0XH7lOJ*iESGo>fW{iQAOzK72gvaz+PMRLyqbA6W}Ll5y`*zxKcrvq#WUf0Inl%*U2>`uuUbx4 z&9F7^u#ff8H-hOT2t%^>Zum!qdUB?H!K|g~F4lOo=+4h8YVvsHA|9F<4Nvy{W zWj#DW=6e(l*aNNZ!7oM841$u?8HuRMEJSN1BU_K4g`hy4haM7xk-no0Eh06t9=rzB8%4!8A=?>!y9*yw4@J|RS6C@;&h1dMaW=G?g zhv3K6Vs>Sbd_gjO71q+ZxNZ`C64W3I`Ux78ApZz@mz*vOATznBprXeGgGXe`!Xqid zUet%P+Q9D(ptIbqi%biKPzXv$6hJhGbOAmGN5~!RE9Mo?=W6g0iy=KbB@!zU7s2$( zMYN(c6WNPK^Ho7Vb%Bz7*p;UIzni$uO`awQXHTH2#@eI{ogfX0W>Wb7g3P2k>n#uG znb3&}V|MN#Ppk*uuLJ|~Hr3@v;pY)(J{J;thMhRf4qinIyk>PWj~v$dnwOmIv-n3ZD_XQV!bIhQbx`xFXP;g8wJ+PuW4i=@aBO(Y&H}WYoN9U5RT?L~f=q!(PZ- znJ}j$p@ni0r!=S>1$`xUBDblL?411c@H`U^lGC9ecu90pu)hWUP|z4nXfIqL+Fty6 zK|zv;rS#?VK~M3--(&2dSn4itQ#tljq*_p){9*nTB&Fu?zAs3WjWawVduR( zTlOrCQH9qogwG*cIKSpalAn<-73H1=b>XO{I{sesIkMEXN?MqV(VN!084f z<|0NG^Z?krZdnQ6v!9J7K$hzc4{RulOXFI`)Ok@8A zZBaC{+-S>5Q83GdGaFz9yW`t;!%Eg<-3mU8*tsikw@6q7BUi=yugfl%<$dwY;@Ig} z{+4KbEdLjQos#IR_$7jjCP-ODcy@WHQ-s}?8x8RqpE0)F90&&JK|KBi_?N>t?TkiF ze?$MvNg*H9mu%k*c2oHB8T?uuFKagEmjj$L{=`oniM-1Fnb2KuEpt&7TOcLEiN(WX zN>oXnRV@5Rd^_=QL~n}z7Ubp>R(KVzJQU_m=_z~?KDxzkMP?*Elmg`>CQC^I{2})T zUN}V%)=I#iA_cA46N%&q<)WZ{Qh1HRg+Xka__2aeC%Rm0*LC(v?3LiAM?<@OJXNgA zQz(8G-Vi>Pn;Yp%oB&sd=BdQr`FV!Kz(tEothONUltLpF=HEIik%)wFbu7Or$M18I z3?<_s_eMkTkmH$Qb?8$kypN^AYtb27FpFQYBUc$+xb!YkWgvlq#?~1=?86FM@XSI; zl!=TAZn2=o${q`no*#18?*6y3C;fvyzBjHZv1R%SGVx^M8UgD4wdE3&c)H zMAjd2;y`x~vj0>5w-)?zoiaEDzI&%6lK zugUn$iJx{tMg+H0I^&jto*t-|i{>X-qfyMQ0wXnMR_*YQIy1kne5WmQtj0V9VPLSA@cq`(YyZBq~2?ZHaJQK0;;+KeJ6kN(eJVWj;YC$)N=!+(k z^FXfe62p^4W6LN7nTx?Y;_(QI=qsLOqRVt-Oy?!>$(K-9kdXyJPrN-rtQBP5NcLV( zWMxib17!@+P!bU?g2zY-fQ6@G?bAxozPp-nGr^Jm1qejsWv4?lh!Qra}^ zW9jfpHasR=CekJxn#Rn|K6nE_(0^-k0PtY~yq%aosdNA$ZHO%O#nsc(UT#1d+GGXo7aE z{QdCxz9!TXnr=2pL;<97cDH3SOVSn@XBqu!Ku9}`egu-ktw`B!x!iY1h((i!}XuuT#xAoq-dWi0pW;uk)JK7!*eU1sFw<1u?7UR6B1 zR25J4ZFE;}Vw&$l-v;n`JkNN+USGgQooAP&j^D#)#ZxK@mCG`gWUo~WOJW|R+Znd6 z;(b1Z?;bPbME>;{Z|(B`ao{;*>LuKjpPg;XNW-w|wZ&!oVa5*w2f<~w+j-*fg^$_>moY=vY%32vu&B3GHKM8>0_ zzG%RM;dA~cAP-IA_F_Aq^M#}CZ!#m1j(lPM7LE`b)3CZ-4HF;QTt}mT?A1^#DH_a-)7fmYEeFb03 z-CzJB%`ZNmphV|&IGU0#Sa$w^D7EN78S_V)@g z7U?3eg!qBv<%kzs9m)?zoB1l=FkyoE`*#XqTOS1sh1X$ga*U^4<};GnAU>gF*c1(Oqr`)P{8luN#7_&ON#rI*vM5B`i#H@l z=i;Y{hwH?TyT%^;MkIMIH+3sGA)G=^MONNmevRR!>U`Ei6z3|OBzJ&Y*|+m>fFJ8F zG1+o_)~c>nQOov9@A|WaL~dcZqc0 zgZEdF2{Vm*$Yq=kA2Ra_P`w4ZyCPhbjh;OZ&q|M)m(WN~93l}SUBcCJ-**=+A~$-H zJ1kk%GP>yP#>hu^_HZD7dWFv=VxdH)3h*hJLoxnOVvi=WFP@K!6;*-PyTEO|!)L&H zcveCokwM9Hxq`mkjP9Kcr%ZzpSjBTMu|~;(%FVM89DDK9eNfQDD8kc% z%bj})k+`#1Y&mgC-kF@&B=1Z(p(s+(jOR<_w+W-T$(TF^t=BTj5?;TBy?oIPaw-?k zD>q+7yg-RUh`qXjos;~g7jUnI7a}k5TE$}#nl<7KGKRR*EF@w)UPx_L`wZ#d1ciP@ z!~Mq-1oJwMmtcmcF^-^lN#2YfttJ@b;zRr32;tVX=zuNE@;Pg*$WF>hqb2JQ&q(e@ zBkE;_F*s2`2j8XHF>Q|q2C#}$3jxYeoH3jALx#u;r!R$9!~Fk+Lvzs11=)8wxk)z`@c<-h zDH(YUn3Y(qyo@PXl~19y+_(#hzu?VZgJ1uFSJ%Ts2cfe8N_=bd-X}=tICNfpX8Rhh z`4>uWgaU_|%PV-q6V@ma!xJf&IJVdyIS<}vkG3(hW$>Kz*pVEfyL>0t&yZ+?cogDi zinguI?254}(TR(R)(+&hq#t*hv)PZUP(?cA6z0>B_$JTT|D9N+xo9CeF5?A#%^2I^ z&FAej8`rk>spSrx{3@+j_wKQDVb6W@#Z$Mt52YdC|V+*EST6tq|wyurTg@wa3HOv74K zM>}oe#qTCJbg(jTz@L8sr-!q8~TwQ(3pHSvm_zv@?}e?Sv9? zv-T&llMVV-56-8nxLx{_T#WCqqg~;~a?nMxl^bJC-@)IIJe`KjrU*L}i8Yg~z5Zy` ziD=aRyjL74y9Q@&hf7bwThjkcs$=39@fegF4qZ!!V!?VT&prQGH2Z!eBAw4k^x*}w zI*G=R2<+ML9?DILLK$6q7n8iF0N{ z=ab0f3N(Urky_8Xk1&qJ2cGbf=;19ivBYE~9w&Jx(pyA&3yEhUaRuq2CAZFUf|H1y zcxDEporZRc&^oi=h(D1uAJW*8^Uy&4$nA1OxMzagdP(k38GbjCY?Ud{_H8H|VC9Fy zJ1-O{0ta$WDD{NJL{t&ns_o4~h+^X+2T$3sZqOfuP~pj|e? zNfN1-b59Po@DhBx6S>~cZlrSRcoPnP2U;~k1DK3^5Z_fYn`Dn%>`>h>2Pd#g2UyWq zawy(MUe~eqij4OQ84p`H@$`evSE1pjfFh-O~G?C(>t z)EhfXRWe$>Ke{6Ws{fBCZi8wJrdpkE-lIH4R&A{xpLdXx5V4wf}WtqU0(56KA05{PvFMKO}e1^SnVQU6JJut5vx)KW##v`aX33|C4=g}#@ zu@6V#+kDLYL-=DRnE)g3g&H!3*!5WCEDD|b2reEEzTj=@vPOf}IgGB6m+VUH|MgH| zJPgU$?Fs*shVMj{q~C=^#EzoZ7URE4Ux}`0?2p)^|DbJaw6q?2zw0b2YEg{sVLr|{0EA{TzV(k=)fk9D||)=3!sZ_ zS$C}esGEv|-p}lb*sYCJm;Fq&XgYPNo2jQWxZf!0*v@k^sJ80`N~I5En^#se$b$Rr zW>9blHJ1bFJbafLx;=DvtWHh%B1RV)OIE~uv~&YHExw}9=WVi^>YQcATOE($0c#4maX8&mSp+{(QYH%0X5AB*rYrkvIIekm9 zXhp%JNTwbvlKi;dSm7;bg&>|&ZMbGEJN_GV*auJk0tZ#bZY&@V;w2Ow48m|_I(GD> zhSaua;FE1~v|%<~z^>R$f8*A| z6V5Pe$W>yg9IP4BJAq)dffpI)i`ugMOOMN`5haWT~V+; zic(u2Y5z*M?f0zDsJU)W$KM(7{Bnn)w4{o7tTKYC#doONeII1mg>=XKi;TFh=!sHL zxfQOZn2%LUbW~P8;l2H!D)fOqwHzPO71;+yTa=YbrFKK`m|ftQ-nDBXQ~Th^=A57J zJ1X+&-gM&Z@2C@6Z~bQU4P@l}k~J$MIV~l1Yijwl_UVpHExVa-SfH1YV^#*0VkT>N z&5cZRbl)RKJ7ozpd%-@gVV;e^`(Lk&QU3tFw}!h#M8imbRI3;*wtVd7n4QtxqKxpL~D&n)<5*`UUqHrKn-t6k6*TqZrBnbuCyaQS@q_>HN=WgKSYl^JsgW&7G^% zGpG`74>+GWvz@7+2M%-I2X~>LGSRUB9?5HOu)Zc^un;|Nf1t9kHyC|a)J{~! zAK^QTSb~eCobCfM0M>JMela+LljuDUf-tWdl5Wp*gjgV!< zhVaEf8edHPzop(#=Y!^Sn3cs+vwnb_!#(WbU+`W#tnPI5$|_b@+%Au_CD}_tpE%xC z>Z-Q-qchzZLPC3kPjXAi!p1ZPRVAL?J#M92-O0=xgSYsHqZXZ}qd>w~q#jihRSjhE z68y4`E}03E#B}!gFgA7;zQH*n1|!LltOnOB>IhIXY9jd;oQBh>C4tmGoO;%M z^iJOuM}zoS-B^Qb|jWf3*C&mhD`G2&2wR(V?T*0UsSe>&xvtwHD_3M{o6VE&=`)uvA z8i_kzCcj>hHZH5Gf0gm8{if30SyJEXD(d+pVu$yB@w3Y}BR$F+)m7F{GN-h11<7;Dv8$ z&PSm3&dR!(btt=0&rti7P(E~Juws@2YJ zfsObd9Tnz+qO{x{717f>AhJr-qNq(#J)-`ITd3Tpt+#F)82_6k(`y2ZI1})`hUqye#!0cc% z5dSRteKZ7(xiG7o0y>VN{h_^2g>r&sf?Kx^soKp|N)_cDWYET%{|9#A84x}fD5KN_ zWa49x3`VM7D?=P@L1k@XO*ehU?{rETV@xon8Q+0z`G;}CC~y95erR0DR8 zMrM(8^&7?I_|U#<37rG{F=!+uTm^#w;uG(j}HfP=3B;(!FIt9f+vFg46nHbEw&mBrepi7!+o1T-nklD z?)X@#sh(85&P05K63Q2$QI^;E#-Ek_Q|9>e-Kig?tW0j6+%)-zp{8%0`rpm}%rnN! z+!K4Rz4BY@i<}cRFS>k8tC*+J*Q4r04)D$P+;fd`u5mO+s$V;Pac**sb{>b}qJpy7 zW-d^8d*FJ?jpP~0->0S*V7yq5GNV zrZ=bWs#o*+-7lGCKFztI3+d7NOD2S74%|+8pWG{XWO8Imguhu}M=&WA48!E4$8t&%p7^eRH`tu80RaGm|VLRpS&R6 zZd)o-ADOIDU#=uOV(TW-|(}at*p?4Zfj=`Qru6Q_Kqb*=TJnVtQLYW+wHvPBGi) zC=)1Gn8%GvykUj#tB@6%7hbA6&8=2<$))_R_R?IAYL1+ads;7a@M|n{Jd>OX;`_{2 z|51LG*W1U<{rbmHzu=re%fOvLVsLJFi1CM2fca}}@O4`&+vKB6sC`X5AX!nY#7TIG z{vc|tV&8|a=Oy!5t}^j!o?RFnp2v}zdAU115#F7i?e2W8CXR0EY8gzWy&es6jEOm; zi9Rk8FI8Z^OE)<2y5Y?!Qg_*>9@c(xj&fCYcXS)BNY`0MQ|+0uS-wbarXl`)LHUAQ zhl#+8mHK$zI&sP@yC4ik4T;l_z%_M5S;BOh4a`Cw1J_bt^%N7B$H2p~j0~`c**RnB z<2_H*5Nl3_4aUK2&M5OICPPR}?tfu5Ar8w;ETf}KKfoUGn7PBNnUNd9OL(ImR7a^5 zm@>3T$*C-m&ofnPn8maRy;-P#;8IHeM9S=~M(t!DC2W4WSq ziD`I?^`_y`p)#Stp~B((F!AJMZvJ_^t=5L7j}D~@zQV4j^-u9n3Oo!p4R6x|_I;!CJHr zok(WUZo%B_op5dCvNl>ZhynXy5u(3EMuW-fbhn=|vmzA}oh~xR=_B!7S@vNO>rjy# z;$&$I@k<(QnIo5LmHV?N?A_^PzgP)jO)*5ZWq&@2g$ z%T_FL5%aLwhKXfkh`w#I7wec-y$L%o$;@CLHs%_GV0&3*Trk2$DR@=xnbnCa|7OC< zB{{V^K)d3IbftCQa2N9AXJUWQ_0@UOF;i=&cEZ-if>uc_iCMk@t3Pv)8ki@I9Mh zu&T(n)gPQ0+?_m$o+F;K?t-qYj;qR8X|Q!4Mv3A2NmyH!o7b#o_A==c5oTejwLRE6 z$Go#iuyM&$IbXs2^@+)4tISK`Re@f~*AimlH^*&?Pn)#S9||*@N=@Y|;JM{-d6Jze zY9Hybu^{x(Zzi8hDv{(*{E&Duv1{Vx1T~>X{Druyam(UsBwkO>8%)yu_96ANv%F`l zcdys>EOWnf=5w4-ui_uf!zztX52=&Yv&sxvxBFV<&D};WW=y7$YiQ?OS$!uX>qPg6 zc0|?j^>>*{KdVkS=s%u(J;{^YJf&ISOsF8#=^=+5N{ zdlq_cc&B*xd1|`bIW2XP?6u>Wxx6s^5Bk23dBGl`L@rV^&UncGc|cGKin(7p_9K?{=~~Z$rN!1vrsc}g6Ao*_(Uh{ zTGlEfG2Am$JUBSeI`BDAK2$(oU^bAP>P*KXm*HOPnd&*{?(e$fNUaS}(#e^nL2#NW z_Gf&-j?5!`XFSz!h2vlgsS`Q{Urs+X=3;5H(p{VGNMbTpZcUf#*oBSEp_+bY@|whA ziMJC6CV%!Pg_tQSHD_YwA!l0G0%v!}bv3857(X*3`JG6q5VK)ds9m&u+Cc3LyL3o? zMz*OZ9b5D8IMRU?1#)9bn5BCyF(vCC&C$xgXXXH z0cnCfTfQaLv8$LL!iR&O{U1{fri}C}!3^QS#u4j~^n;R4?V}FHQ!dG5wnuR1eRfoG zjd1t&eD*x{l<}l?F9TdRR&A`zCdafv?xgfom%?qa)S1^+%a!b`<}B>^qE2R7`%8Sw zcX;fVj1kP?%WTBMsx(ZmqPz4&=I{5`ix?%%6;?$lT6wE(cNBH?beF*kS_tpYGWR`~ z+w~LdBt;$fwO!gmBys|?7Jr6|&Q$L)^?V8ZJWJHg>Kdkn*HZ5&S(Fm8#thU3%=%px zo)Fp=EE~)j926`W`YF6$Z^`VU$I>M9g5ucfc+9N%crB>j!~XqEO>-_ahwqp@Xu#3x z)Q)S}nM8j=%cxaQYbkByF=Wju;#=0UE}Qwx9>y4bMtD|eZ_p9k7}yZdg13Wem}%AK zZ}tdzrMk&6$d%yMJ^j4xy^B4+y5~4&YriT@q+wQ!8DWgotLl~YT6!hjr~eZ!8r~NA zIaDLGCe%NCKyPGv>^(3Y%IdGoTI;Jcmyd24`-LEk2i){7p2Z>8s{#z*XNJu7F8{JarEHmq^Jr}?IK4+Z1#Qf*7ol4 z6!a{2tMFUSbnb9m)SeIr7g2_j&6rFc)ImHk4;#PEx^3Qq>!xscPq1?-$6X}UOMF}fa$?sfND{IfSosNynQ(xuo<&nKrnBjTBlMUv) zYOb2jT8_?mKM$0G$_V)q)r>sMA1!WvZJpk6+8){&niFag@`P>$F9&_0e_*k77^~T(D0z``9S$#t z!^G=NU}}F|We9n@PE<20Pz8&H%g~RXvYE+;jg;l`dZ{NfyiOQ1^mSoh_*&>iC^s?k zvGC>a!f-^mQK(OFWxyA>=Pw#if?YzHb*~w)_F@B_Jm(OecZTwjj?Xyq;LqTZIV}%U z3aPQ`Uw~|DI$AnPa=w1n)^Qf%Wj~hnGz?}LjA`Njg0cRTWF@I?!p*pkUl)CK#(f_j ziJog1s2wh4-nBJlJuCwS`Mj;I)_#G@q=j}Amd%3Bu=AL!v3s$5uDiT@iz~@l%Xx~4 zf`=TfoxiwtxKn#O`5M8t&@dvCFTLkiXA$+J-OCsn${v`Wav}L@a=(zcv$UtmKDm(m6ER*r^@%pw zna$nBQ_;KB+s%8;bJ4xjRmbUdyj4HKQQ1OXiiOx`bvJM8R!9maq_~pXB^FE=89y#Q zXF|WkipfL#AA;TWi{=}9t(>6TR)0cUcZC}#EnanIG6|=cHhjR5$@#0Z3!3hQV}K*9 ztf2!oYiQ^I{B&|#t9^9)Rv?9r)eUVd3 zmyGVgHc55AZjAN5JM{X^tAVe}y}keb;m5=;d*Y46Bgui3c>le?r{M45ZpK&ZwVch- z#@*a^C31RnpO`;lrbNGv-0LguS%aPJN-Vk^Xmu`lojlHV?&01aBEFBT6*)QLwRg4q zqa%abS1M%vX;jsx!GLlyR60~E_|or6`H*-jKJM$qFYCVS_^KsLOb!P9W;*qe>#6U4 z)WVqWQmu_?9=#xPo6q4r=yt+pnby6?UCgu2bHOvq^Uj^%I_;bbliD%$7qu^^VVAbZ z(a#y-s^EGE=WrhFom||mV3Y{8@;^%oC!CFM7QZ=uV?vFjiYem)=R*oG#8Y+!d64p# zI#~P7(ZE^4mEL{d-NCcW)6sLlJ=di=i)rPQw$cfhCO*RGT+hsJHM3{HKRE;0PNnWu z{8Tl*5UISu106sH@-O1jvEi$sq@X95F3`$6431llfli03n`?t>g{zh8 zKUgoq%*xyczuy(=Iq#{`W(Jk_kZ$*qau`owhTRMHgIN7?*a|J;D<*skKA(HWUb7S| znrF@PMhE>cjGf#4r&0!{d`ig^@PvNXeemwZDW|oEjwa4D&epKp7FVk%i-=>Vli%D2 zE7b<|FZDlV0Mn&wnYY3tgOmIPQ)VTfNj{SDbD&vhh(5y1ZC9Z#F^RnFQme3eQJ;xl z+%7aFR6JZuUtlO!Q@aO|@dTI?>Qk>-Nd00d|DRLor3SR=PScgcbJ6qG)7LZDo!Zsg zv0c@a$x=Ie92vWdL;?<2K=&}=_jhVSesa9ki2B4F6oER@s5f>XZf;CvWd$D0Vb!4( z!uEbtH^FG~3;DPUtflI>0C!Oq*I?HyS2NcGXI|cOympkz%NnJ*QUFfj)QY0K#2cw0 zA0unq+#YUiF&~jT+N$@^JL~_z^%2hm!!y<@yE%E}kIW)y%QW1oa92))b4{XNxlKAO zpI25<*{PzvBNO~to-DcT_4uFL$YuPl>-qyjrS|s+`nj;OLfH#6T!6_i;Z2kuaZ z%TI=EqgmJJ9*zt)N@=SyFK2@Wlqs=ha!U={O^-5CS`%ky9+#5_fn1o;zO;CYw)N4 zr7m~0b3Md6x$SN5+vmIMd*-|3+v*$Zs{>cZWbb=V4o`Y_vU97WkJd=-38UdbCe%)6 z)_f6oYiq-)x`KJ(SLEaN7_*$7AyhB$HbqWZp1d_VUCQN@ZT@wEdBIVkdf`-XB@Q=! zH1k-6?ZMI;d7N6valu*EUC;B;6Y>o3bYaeZ9>;I$esad!sdesvJEou#GiR zDET~>+ynH}dUBQxiS=e$C(TtxX?;iL%rILrzxNYNxQnQV)*^6EGIOy`gWspOupoU?sYRw5gKo;*U)zrF*i^-}#%4?*@AQd95 zqUh=*{Tws&+fY^WS>K~ucF7*K8EbgW`NFlwUBmO6C$*=d`=hhCBfsi~&pWHR6RyT~ z%tihj{zo5Yv@qT5flS^1AL=r@q@nVk%1C^g?he~g)@e9ez$l}`NS$4}Z{0Mrn}>`w z#zpQnk(|(9Rw}TF4X8q&ljkT+dAn}J7rkK;D6AG#9P(THwq=>EO}}y4*h03mhmqb` z#d~%N-w6#0^$eX0O$q<2=P>tL6=0;9s`!Ywjw?PT6Om*=yPuUz-X+;=&pgo8R9cUL z#<+&I&uR}cJL|E*s{Xl2KO~fn)4weFlJ)DvxK#<2lf8j+q0D%?nZTKRq3)lH>eMlL zsCvOM%3arYEAn9U)|g>2G0{sRYI`m*)<#*TLZ3A9*}0Tvj$-b%-f_NxzN%iI zJDrKs-)Gc?A(`#j=LZ;7#n}rvL59+JUoG`^EI(EA6cpJe% zeKW$QA`|b<>FVrw0YBJz@|Yh$H{8V|{X|A%2S^M>ngEVuBl*jEaP*$V9tX(qJJqXz_|tLPV&P*> zq6%4B&LSmS$EgO7*H?z$g~o)sg*Jz3z!3bS(GIqbHe_gvq1(4(fd^ZOR26ozn={eK zuc=Nhr&^a=no51Yt(DFyNXCAleNie5XYon6u=2sF6N?_`puu{pl$Gf$wwGC-$i%tK zyX^BT=1vczN>Pc5=_%?N_pOWMLeCKyltBk&q`xVNw=9KLI*y;79`uzPdo59SUCs1- zzgiRj_c|P9t(5Wdzu>6WFe|4G_HGQAgPBy_n={u$XU5AJ>Z&`LUi=rVqG_zF>fuX#$=sGjZn_5HD50{Vbz9+-4@iDzcmdVP2aDb5(hGA{NU_ zm1^n)*e>=fcgQFh;35q2uC2%uOp?;U0W?mo#Z!Bv^7d$|?Q_hr<~}p8wauyu7C`j- z#Ng{Rf``5ie$+O87lehLN-%!O2C}l-sB~`S3~!;5T7uoT`Q&oeC=Iwz7YLXHxa#`i zY0P5I?-;o!dC{Cq_5BUa^og9DVx~3PlD&QyE~0-1MNrZjMg?awy1u@WUAcg@z6{1r zbe|lQ@-Ru6H=rt;NA4xfu@AzGx(HmvUZ(edwzj}xf0fGDE$sFV`=yl?J_--H8Xs(Q z8ncbsA&I|(j(R~IDuKUqBfVXiaq|hUxUy0b9ki3$!G3B98^P+`CwDlGX-G@hV~Mq1 z2GXPmIJDn*$BWqU#&E=RHRkDY;jQ5l;j(%_e@|^;Gdt7{tjRIv{VX)AlG*szoNn!< z($l>0R;%Y=QCrK~=V8B_fa!~sUdb1fKfxuOM$XewldcbsO*v&Qc!j^!8rm7M z4doqK9Q&zImW9_gjEC9P%40?wHS{a+Db~;n8pBP$wM>dp8iQ<@tWDCs)0U|gY*zKj z;BO(CJFb?~1`(TlpmG+Yya#>tl?hMvtd*RZ-qL=8Pch(@5%Ys$6r217B-jEL_Q1qR7K}&S8-3Q=c?zZdzQ1E zTFh=5cBbr&+y1e^yQ{C7zKDG`;Mt>RZ=ZL0S?YC#xBcJ0k6riqa9oKbIgnN_3CreF zXTb9-5YtytnWL{o<%p^lStFu>ubKCE&qVhgSCA+ygENbBva^M2xci1Dr>}Ixg^0ru zFMM^ps=JP(vC_@nZS)N<3ziT3;IET1DtSrLzlp~aQsM{4kB={%a4->79T=pSvfnF> zoP|AIeUBs7M_!E_5&1eIE%mP6gb3>=$v(&g1gk4j={&00$U3;DROiF*jJ^u@)@NyTDv9_{&&h#n7>}Z z>R?_W*MH8a45H$wHPtS|$xGtg9R<1i9yDKGbWlbRkZx+do8+-dVPcTO>M$7A9?Ji~ zj9c64Y(6!vP$|&O7`u|x0ye`n@MspI#!*MgZRh6>J~NU!LRKbg&jMv!0X*UyPiQ`J4Id{R& z*3c}^JNBS19S8s6DwqVz^2AH15{b#C$HCk8fo))imC+hw-ZL5+U-eshDr1u|+uUb` z?NXfev@oe`W8!%ZGOgv653r2xXU6#jSRZ~zOV$QAcF`(=c0XkX%n4R*(1zWlOW?Hb zfcnkPLG&|ayk{8H|y>}E20S0<%va$%_xpX+2*0o5{yNpFv>5bOsfnMrV+&zF(& zDLE0TS=te8FxaLoN_)=VS1XIP9o7!PVxI*}+*elWHTmH>uqC{QQMx*qxcu101SuQb z4~l#n-0Day$p|K+?PE^eSuk?#!ENsV6;J_8ZZ8mpbwN$Glds5`m8$SYDQNz3@)oeP zBhV_p!H~Mb?1!z~WoBUQDu7yTjeLHB@$n$p>_q1ODE1s`P9LelFEMAs<#5%^VNJ$f zY_uyN9~qFnl4PT1bH(#yURQw#7{t@vgsW~RY$(<6+Ez-d?Y-dVHZoD|F|+CKQ0JNg z=DR+X%5GFlZ}Yx=tRHQr2gwzc06yH0>S?0CvtXDiz`X7BBeiANGdcQD<=J zem%E2(0U33P*0_unyi-93cwfFk@MCKp2@>ZM5{(^X*kkb3^w}9W_>fgS(>*T0Ai{; z*rz19COmcVVDhejy5CQKKoM%tCb)@7U<7)>O_>2N@ejD4vKvnL!{^!|sfjX4okC7b zb&hqubAIQl?8@i5;QS8W@I-Z%5+iT1M}Yn-PW^Wjv+3_!i;06?O21NX&Ik`mk}^h3 zqpj5}Ehkm+8Zfc?lr2(2vJX|v6L_XyVbU#ReYDou)se0;uzER_K}rfbB@CbJU{pzk1wLgL z=H%?KKCl9nkk+nPv8LL8M1q~Qo@%7hUD^lsD@CuN7tojJV~thj1#72Wh^T&u-P6i# z`t|R0E4)F^U{O=5b~9wgmAsIkHDYHSY*lJFTg_#u{aW!cw?LC>R_Z+!I*oFP*Y2sbpf- zgl+M;6ILb`OxX~8YfP7$Id6LRMV(7^Ce1%-hoxu47>#qmu0Q7fR{k~@QaYh`7!=2;u;5^^k-ZjR$AwqTW7K=xW2!>t2jlDj8XOGuya zEa8`=Us5In){<#?X}mT^A~V_1>vZQyWt0PIH%BzKYb>$x7Am7zU8x+0l|QA{)+OV< zzE;mh-D{;)T>ASP1MviSxXUSdY3p~j3u^eyH37i7qZ?PKNxP1C6&#e@G&Zqzxj$rD+=erOYp>1 zz;P#8C+r<~kOLH#+8Az#_aNXF$d~AfX-tl}HQLnyn{a(=EzHN$K-DjSO?ebL)Gxaf zhY}~>W;)??qKZtQD8T9ySG6#68G6{HVv?EKT!C;WJz(s&{*>b7RPfOxfTc>SR#)1} zlcc+NX=!ag3?Xmv8&g1qG9kWUcn;nvufdI*F+aSl)~TwK1*ltuq(s0(AK_8 z?6A~K3zOb<_&t9zlguqJKO~_Qnk3gEN^i#(Z?56aUyHSVS zX_WvqoCaLVTWci!4cnz+@)p^W8&Kh0qim-(v4J}0P^BFV$%T}xXy?~py!(L%UIXfS z3fRx7R%t5+%yL)k$6zuFx1|x_LtCI3`Y5H9S1?z&;TvjC=Sw9bn61Px_2B532tRxZ z9>HlCjW%N|=UN%a)Mdoh{fVZWrd8IOsyF1P_8xPAekjx}xGQid&>3#x`g&$F!I~?j z$RTB?nhhSb-k^HAgN#lOKdi1ims?8>EtsQ%ol_nql>B<}Rsy5;Kwz{;QXZ? zP-ki($1&G#&um|w$SP46qBcjpiJTR2#5={E$vIa2EOoG4#)nYG;Aa1ll(^(=$>)>H zrNpPa_h%1|4rSM$84s)vQd+g7qm1j5yP7w~*VLzbvwCm1%etmIo{@i|u1U{9&u^<& zSNTCrt-aN@JL);FI#!X!$;xRex}RZaZ78RcZgRrU8O5o{M;cw>U1|rGI8N{U3r`L!}3y3ORvo*sKCnU)p0qC3yjF z)&pF3HfxUg9X{S^`UhgHtnySb8dx)?(zW_#;s;6UNBJi64*18Q`Cu09#>J zWeWJL%j94pt&w0~CsCjCTXe#KBWVV{whsKgVS12SpsO0tlTd=U{+rpUAdToC*#hFH z0h)0W%3~xo@jl#d3CP5Ypky?AgVoG(ThGk9obg)l;nbmLp$D2Q zoty=4>@1x>-%}eFye4<)qI$wxcP6H7NNz0`E4bgVz<^A!mXp`}PhP7O1I78LS`2o* zkxDVnr6qfb^QtSglsw8^_=%o?bvnoDrLmKVIKTha;gKE*+lv**4JxfF>+xC|OJ<>= zy$B3UWvb@$@p2={a?G$M*hBHjqS=$j%2!a6cgf_PRIY(rR;h&e@gW6@o2ia=XKS>1 z&FGID-7vf#y=d61vzF8zytAs>q{`wg1lL4 zI$6Uvti~o#K8?sII_NHlmxqF^?hnc}mhS=h@fqO~Z!0Z8ZWj=1_9v2lZwdYz(aT@d zenWPy4q7OS^)uSC3!M)^=_vgbOO@$V;i{6CJ7fKBerFWWr-$2yHxcEQhEcA))!D91 z=gL;O8n}*WYJDveXvc-1DSjdApW3y~ncg{_C~F9w+h?rFeEX(RfsrCL;-`Mf{C@81 zk}uo5hVns*^2p*<+B=+U5f|+cHq$`E1pa{sre%NQ={IItn>X zYk9PxurY4~O`k(OrjF3EI>r#UzJ`mtow8H%TSLrF;2N*$m5mrvrZ+`Qq3%lG%4V~V z@q->2&J$W292h);4>N!o*eY`we5v<9S3Coe)Z6*9c1}vtWBjY*vc(pC-Rhb5@vMjM zA0|Dn^L+ek_lL=!r!pM zH=XmO(oY&q+}BRNpdNEx_soqr8l}YaiiwRr5ao=_Zw-^ zUQMo%5dC%hr%>$4*tZ}1e<_@BD&>0kuH9R!;&%FWN7RZ;h=}*i_C|a5xK>jm9zy1^ zlq1@49lq7Y>S4U`eCU^V;0SHyomSqp-xCv|Mg17PAo^KU{>Ta50?*>IX1#aY0_I~tkW%4~g(Io;xk3Obj z~vYAqaNsiz4$07;1}roo@BVTkmoIA9M#7Wt321cVKpzHy^DeUuLh3( zC5ZaMWFxD~W#lyS1v&`N!0PpbRUc`*s<+nbz(@bRksD0obo-QaTmD-q02-tWsEPV; zGdsZsi>ybKy&J4}GC9^lu-Hv7n)5ZmctQT|JM7aX@b#_8!}Q`zyi{ILVHvFyS5D)3 zU8bYuC_T?7z}%)H3mZ??V+6C=*MmyQCO9M&1>3R~Hshu0Z>pv)3$bfG=n=|c&$4n@_pmGn>1xVB z-{B3bG#L5KV^eGj1w~9(CEwK#V;u@& z`~Q?D5jAcAGd+f00|k^tA?a`MJ*(-1J7WH6mH|0c6d<(!EtxtED|wqt)kVuE$neGrdtn-$jk;b+`xoqdlpoUF3U`(cKto+@!WO z8yx1Z@^hsrJprqo9b8|i!liM~bPaWG)LzTEt(Ku}NqxUWz0dlxz>~cXir(LQzxksz z&nmwe_wio*KmHZ^5WA{UNCTk)7Js{Ew@-~~6VoO2ximG?u1lk*>KgrHM4bDjV-c}M z39yk19c$g+M;wnfQ%_CzU51Sr)C@nTJDB><=v}^}t{Z9^X``_;^vS;}d2M1`{Is|~ zzaIS3_si)oN51xsf07tXnG+gi_L4I@D!bQs-4T-`)QD5wr|#{}o?3flH+dtAZpI<7 z*>;teDG$^L&@^T6{c?L!c@w?oeM2J>BeF(5i^vvn1Kj>>=P7lW)WXahP7~;#{Bz=c z8uM?*RgbTjusQLU3iUHEe^_d zk9pYoU>6{hb`P(3j`Oa|3FdRFH{N^9D|>gi?>Q%F@8x{`qkhp z>em5dmc>L;={QWHtKez0l+2urimUd@Qm|4wu6n+w_O-(0vcscq!M%ty+ zaEy0V_cZZt^Vava^L%kNcFxyqq;wESh-<`QBjJ@!gv-52_*iI2=x=zfSL)3`Pz{$S zszn_wowuFqomU-$w5y6s?r6)FlT2u9V-^_tKgb*9=PY(5_8Uwt%|*BKcxevEt9fce z_`p|@ZO@<{pyJfcItKG{(eRK^(NIHbu@l3+$SBk%oBc06$b+e?o+LY(M6_OuF47hF z$A2>uAe%H7{^3gaxH^4;eW)TU=5h0H>zMsYQb4CXQu}Jh_!^+SBr46Rcw{E+QE$pg zzhGM92|SEJEcR+6JzXZH$!`szYjrKTu|Mbzn*&-)lK-NbHo?vWC*)STZ_g4>7s6*- zPoH>ZCLx@XO46Iqi94+Vsn!^~V#3S1SvgMa7l9m;Get$l?qglxuLJwb10n8qP<2pPo)A>nbK>wM)Utk2J0(T^e1*cdAxF7z0FztjPEwoaa_AWP2`k( zlaB9xWE{4!Ct0cT{bD{Q{xCs=9s%by2j8Nl)e`T|1YI#6lnHtajOt|Sd{fMJW>3~h zA})PxwWnvhHTt^8H)KKtIpzKI`t1O*n#6OxMH8v=NwNu3dD{u-!)9b#&ym-R0WZGD znvX1epl-H^9WBi|_Mji%NtbCsRxAV6rrc!Kh8eYu(nc|(rqRjxi#*#N;~;&FKZ7so zsoxE!3I7}#A3Pc`{LTC)Q<|jsQWBC=rSwYi`oH+2g8f5Qc(2jVDk?p|*E$N1c!Kkc zYoa@|XNAY_Dda8gH9T`Y@7GzXEpI^NB{b|el&2R6&x#HG;caJ@K_@dGK$zR?j775e|x1}3Rw|Mx;NTx<#}r!r^J{{HSh`+t{&2*>JN!ljQyhNnZJo5cc(Lt`hZC083_4>!B)Y)f^UPpLT^Hi!pp*M!$rwBR>7ms zVb!I!+zz{(Mp=b5_u9Ekx9$M(lhOZI%FdK&;Kk!YnFJzTstecrd+mUul5?%|r89%8 zhO49NS630&K4-k+F1gcZaw+LwtB1LWj*h>`sEs0;pGdwayY@oM=Ll+@w2A5jWh{4j z_$|Xf2dvu@e97HLf?il3iHqCyWUwac@C1`cY(LT_!YPr-fHLxA{u{ye|B7H+m zS;70}_tr4Fr}LAOwCrK@k7)o zm%StkV&)N*g3U^PwKw&l-@pq$Ci1R92j)Lu0E7qg=^ z86Wln+`BcvM*IctegmDtWv~GcVUGEXZ1={`&dbb(8^q`R%(mq2Cz~(P(B;Y7XQ$`# ztumCZ?5%2fbu>MwgQU*XFwUC4l11oZo-m7oU`$8$VgYsTHB`mcFh523dKc(ZUrSF^ zNPa{P(8QdE59X^+3rXecwg+&X{i%FT08K_SI9W*BNJIxc|#9DMLCh|Ko4d_ zyx^L(m=dv(Oh7Se<0Yv9U$+|JD|V%-PzTiD61=_Uod4rYdMS!!dy5bFfIcEI7wa^Y zw;jZ%SI9V425IpXZ+;Cvp@W*eAHRMaQR!8%5 zj1KvelbHJy3&RA1y=k2P6;Rfm0T$~Z*s}x*2x=^rId*&-}^uMp9Nk9Q-|y6lZ{K} zJ1fDyLUuL+J#~b-O=%?Nnc7lI)HXT#k^{} z!*j`f*)`AE%n_m{+mlHZJ-{^AA!DYnZ#Br@tg;SS7r?2Vv#wZ|tY_d@G7?|3AV2dn zv0E5j*@N6!5;A0&b@|JISl%*nDW$lYn|jk$M@i=>=R9X`@+~tQZ?$Y%19b=(uFvej z5$5*XVOb7v$Cr)t)vPFo!e9aBkUzsYETmC&8YeGPNe>D(9etuTi3Z)|8ADP&P$Xxlh4ujL*_)`c zi#&wvYYn=q8WT+pLjS7d0@s>rtffRX^?8G?$K6TpzdS9xoqdxd)`A@^5j`ZjS@h+o=aIW2 zs`~bNGP%b%9IInS}cXoGb+cQPJGxKFXld7*Rzx=G6)I;^}6>3F zqVoS+t*m6JeVohNl285~?;(ZCa~D2!jVO0CI%F2pxZcq7Qxhcf7;4dr(PRhdkMNKK z7)zGp9&;KFl9vv#9((LBXpeEABE}k3jqi+d)V;`{n|nZI@5d{jh87dNzn_^E_Zv0x z@m2(t>z~amWL2YyeE+11oWu-+PSyl!QHQ9@*dPwZp!xDrwOhgLnF&nxIZU;6CSABw z>0B*~zk7n5^bM;cdFN`p?{?zyD|o#QV(ksslG%KV7_n#V*FF=cihxae;5 z*0rD#|4#8Mca()>D9&KHQkaG{g}GOYn8Oh-Wt1zSVSgll{~j*w2~?BX5*sbzY^If) zQA=6{l71-F01K9c0pKC>kgu=8)9saPstYsa1M+jGmfYvxQ#s|Os0E}Z|5%u3Yr-=Y zLU&Il*Dwzh$wM^QOEmUMrW$o)9XhkhCG0wMdG#>P;g1j1uj!qQRP_88!fww**RMj` z!Bb4VRA#Ec4Q-y5O|2tkH~#bg8{gyO=r=Q-XL-`|(dtKYo_u;<;?2ts{l1JzxRP8e z5FP3eo}xcB$P`Hh)mM&z?z!HlzI+jld;>jqoln#-Xx`tbN365T$=5W+(xpR|yooBeGhP$kDg?d8*W2Ki1mkgZ>9uFqbom4pVmHO@8fE<|apXo0bSRT9- zo?`Bho~fsu(VmgsFW#o!yYBVQRN62(qg~DP8RPU7dM?9n+@j+%D?Qx9s4$Piw*HJw zT%i=!9y>a?rn&Qa+@50Y4bEv=4rRIB#O$pX3ooG;>Q6e@-Wt`&!giAksUmxuie0#h z#AU^rewOPKTQyZ~;=iw8Zplz17(N_I3~mcr!CRs9`YNM_^}sG9m&HFws~X@1D}bo@ zNls$_SJG85>Kp21HQwE4b{+Kf8!Ftjl@9U> zdi*Hj9rSQ@;-Iddj4V_7`4PE@R@eN#O9YxQch06RPclcsY}n7+tS^?m+t;IL?1b*Rm}mH((qd@bOH#^uvLBjflSPpKHWzfoB9X6*DEyB#Q>0eEvikoU_?&8Z73 z(i7aLnBzGW^vxw^?d9Tm1pjSDI>jF`v-C0(?R=d5$yC6@QfhYnD;bV9oU$1pR^Q+! z{7YU|#V=nCwn)r->&ZE8$sDo_OtDNr?|FH~>bzqQ-mo=Oi_`PjOXLlvk;VO$d2>~m zIZ}?#_X1ayWdB6$`Cf_y|1%4(@vXI+DnJ%GvC4%W2POI-w})fES>*x|w1R5i31Z0g zWG8X9QvLz#!C7-WQe~Q#K=Ct^M;Q+W{gAd%%S8u`svMAp+Jnem zc4I!5&@a20NHz>lSD?f8f!~cpTbBZ7+=3a0_oO~}EQgShWzq)X$^qsy4Lo1YHE4qz##pK7GI>?lV2fE@A31Oa5^S4S!FGnj9y9P zEe&&u=8`v#RkDGm7@+n9N%{-D%XREHqfj_+AXjpe1nX;EqQ+96Z+!NCJruV+;b77p zP$$_!Bk0iHM4q%d7PkkU|8p>2eYj60Y}!4nv|s;(2XxOkXGYi)q~c1Fy5G^$l}uf{ zwlA6bd-aGoUkBfM?=6qzF6tiXy6!CPT+Upb=GrFCdN*R53-VLBAvtP;>Q)w~NJvjo-bipB}O3|&$E!#{>AhkvE>u^}G$bK|19hp9DPq`a(r1!X)D$|{~G zMp;G}Pbu$rpTqaiPg8h6d(+SALho{PSbU05?$1}YtyGq|Dvk30e zow|Yw=4ERs7G;z*9Sw92o8qTx8^Ko$&lUsnD;G7~npDC%^VJ3HWGT+`P3%uA;vdyY z!4Js^N`4I(zPebihaj!ush!E=9-m=UoLC=Qy&7$I&<*o~0Igtp{CfgZcZu%s}~#*?ZNo_vz3u&zJ|Y zgZ-R^mK@3F2J`8DL|=dMH3AQ9Gx{e1eOHc2m%s7V1dZl|QFJ8{MO8Z+(^ON@nO~K= z&SX^{afV{R_zQ;Sf~=vKVVs+p7sa!-b-)oaq^A>@e$i#U;3~D zv(P3B*t0RLN^C3yoRit7 zS@@aY7JJCm#VqMTOx@|v6!2x#@?IjV#o4W)c;xFi_eS zbwKSEVz=T!sT@Tr$xQKtU%*{w`gTULb0@)>`HpKoVf7!g8@G9b{j9B+0{b^!&ULQ& ze-43g3$JWlRaex8b_FT|Q<#JftM_9y1*=fcL|XN@mY)?`&#ca_=;h|j0R9uLH<>dqo9~(2c?r94 zj=Q8qv-IYZD?sVZU~lUou`=DhZ&^XX{+Eh36pZbWyk7$H`Iyu9gx?9aQV+F*^sJVc zlPpfIm|8Cwg3j>Xe}gz)3f^iyvbCCf9Y;!DAR!uPrjo3AU+%dL9e4>paSvLs3#T#6 zN^E9Drty>;`NY$2PawEutZ#P~Eac~?zzQ~9!9FTjOg`~ECpnwz(Pk^r34+Z_aPA7m zP{HE&5Y)XwWK<1F971F@5ihw1C$kji+{cv#>xp1J7aTTTorbr)aC7AdGzfT47f0`sT{hDujemLiK8hUOI zxrc#f> zTAe_CBY1|oyhmF!=uf;yA)YzkHyc-l)86Qto)jFRPS$)sXLZsy=76=l>nlE60_`if z>j$If>vCd3$l5=gtl^xq!Q5jBCsWLB4zZSEl?CfteTJZw!8i5sQgJvCvJon{kOR{INJjGrl zVmn!vi%5PfcNCn$|7U2n_%Fe9B-U2&1PP|U-*|t)@+>%Hh3*k^qJ^Xg-YCJ^DR@ls z@tZvCqx+j3yNoRSi!_MSaRX@(jG87=bN`!08;B3l6phmj9dm%VEHBSE0uN~gxaaBQ zC^`}6)j$G-A5jr&QkJ(UfNvqVjJ!OX;GGpLLm!X^F=KoI{RoqhuJye2E#5~kU<=MA z;Z?-*c4D4(2A(Y+Z^M1PYEG5=p!;(A#3abT`D(}{kN$ZJ2EW*u6tKW|)+`@Oxe7lm#->m)?*5nZXcb2`t3TnN3+@e}M+C2> z&=ER+Ef{VD8y$0e*iR{UC!ybPj2Q7k==H7w;mcP znLT^>%{mI}Cag>n@4p3)W+3lB1}k-$r_0X$O0h}``IVELuS3{Gg{yX?J8Br(rzCrD zhg~_rwW8SFjy#(xb+M;dBh258A^HO_s{tl{_~`%4EDez-GCTG=<`Q~A#rEc!r&y0w z(l~P0Etve=NUN$@Ow>wJ27=m8PfoQvNZ36f`HL#E|W$`iprVgZLDHf`yLVP2=dB3?Xn;()`8~mlMPNmFAM?Oyp=2FL00;Mh8sZT zvmw1s8KmFHQ*{HGw!})ydUPfKTZK%mQ=ZNV?rH1vNnd2P2NN6dnOe{Z_m&>stzcM^ zke_nM;5Al5?DTUaTCfZV9-cCMl}0BCHq~U#{55vrB>#Mc4JwQb3?V->hrMXY-(MwC zDq<&am%~)E0@OUGbK-L$i+%7syL^-OG{{~$KG_s0m_a6bJe&@B$wVDOXDvnUUa{lt zn2)fIbsface?k8G;C=Q$9v^V6PTX%XF>@WBcN?~{5!PZ9Pm~H-SVhk5G+y{%tgDIi zoJ149=1q!m_F7@#DxpCHlTH$nQW~jTN1xwo=`mV;08jK9eKnEjcP^*wH99RP@2n8x zt^m!`5O28;x-3Ws*JymrztGI_{B;5P+^&*y$c4Pd+D(v#J>35fw9PR-Ri6&;N$htG z&i!ZV8&3HedXCB!u}Twc+(@M13pjhhWtWlrZ|CPNk(W+rwu{JqQS3q^PFQB{b%Uqc zhnzqBrc0{g1OAMLF2=dB(8%x6$g!MmiBl*zAu@kEhxvKS+U!wR?m7@F+7Z2%m1~{C zG7QDewnZKXp>1}fsp8Rkf)z+`F+D|Z?PWE#a?cy+>U5l|*7yj+c=w^~c;9c)>lC7$ zJyaPkQ|~y;TMy@?izhwK8J>xh%|S=+UCiob!?75@Da7xD zzbClzvhedvXdr_tALb2vuosodadzaH?jc3p(7&goi|EUVyqkd}4dJ&x^3{+v8Nkkr z=4%-7k%;u4l5^>RWx7h;=^Ap`43?4=WN~s+(=3fe-_4#B;itkck3<`-;j=@qPp7eQ zm02snGv65<_8N=bma6!7=yZ{{et^ea`I|N^!P9=hR_`EsUWVn|kBt#5pDxzQ_sw4s zjEinGY<5md8CFsFTjhE0g8W1<5(++a!6p5I9TQ&OKg70&xJok5UK=lF61%mItkF_r zbOPr`u)vJt^!>%Z1^-Y}ynr8AHNgm4i4!;yl-p6>_!g^l0R26VH4{AIf)iOVkiEs4 z@5AR=goRkjj_<|B-(|mIv5ZMPi32GtjYJIQv}{FA4p8r!kL+|nKQ}~n|KJ&xunS9( zsru;tORPs{PID7Hza_|D1aH>~sU3EB zSQEi#F09HCB8_=i%RQ`NPOh>T&+R|(whPb#8Og-2VP|`>$16BxVg8~FS1*h#`LRF8 z*l)o*FCz2&=#etKv4cHb&py{6_LFWv8CV*6wF&; zv~3#vppu**VSBrAp%T0j-y8O zf&Vk8oqi`51GQ3^YTgU>RtfW9I}r+H7QG4ExX<32u)zs>*w% z<((4o;)D+r$r}njuS`7YO=O|Vw_VAK-|`FE{~{Wx2->$L-{rrp@GW$T$jPl{MfY$v z&#($-I4Q@_)`B(eJ~9+UXJ_Q9rI6g_>|alwWjOCT7^!K7RHY`r@c=15$hrxg_Qu=|OAdBMLcA_5VGWZ_$InZCvM-GKb`LeF+3-df53`$5kLKG8hHVOP*z z?Rks*WR|KSlY&p}C|?W7+Qv|8ABTml&G$(1vTpSCDn9X*FX8W9X8rDP2On?Uf>YNQ z?OP2!^&E*6%yBb#_Zz%l6wl(u>K#Su2a-`-!28spa$FOh6+_NSh;kU4euJHHf-L$> z&Tuw(yusAknE%fcrfXep`uVJ&2TC zWp9M%B_gY%Ji!Il<`cT20B_xab1@#fIg;lTT08~|eviEuEM{l9hsYVaIC~k<+=5xs z&38K9U+1$X63pOM#ny)SI)DvAT{Ih*XOAk)KK=%I;)z;Qn zgn3xcwpi+WtcQr&oATR#IDh5Q^CDtCg>IQcuB-ujD=c#+Rwjz4d&V0G#=q<$mh^JGzl_Dd$qt-B=03AFxwuAQ^q_$(Z%2BDAdz#}pD+`E24U6yMi&o2o&)TH zShrvC9%mw9kI_vcUntmy1uyT-Z=Pla;{=V1 z`wBUc=0up)(Skd8qWaj873^n6yxuF+pqo+&u1t=20jm_l+KVh#9qyF@DHYNj$vWo2 z9(m!aILw=gocMIkg98bi2GV2`Pg?<-vWoR@kEJ~c7JeAk=p~uxdC2I0SkppS&C0CK z19}cyVOxrTBbb2)Pz}jQp#!H8sFxd@-gorM*U(!8=cJTMIt@cZi^RdnD*_$#?sh@7 zy>q8K$~(zhnF)MLLE2RyO_s;i({0>(RSfb5WuYd}pn@L%qcG7Zzrr+mi z<(Q$hRpaIE(no8xxqwO1ef36qGnhj*=-1(N36c=VVpKM!8Xt{eW+ssT6Y!*_!%oON zMTscEnh)l1kDgY)5WW%qkr`wB7NJ;WF5UI7*T|}wmi%m-}5&jr#4l;aGsE>ZsEGUSd7WPz z--G^w@rDU87n$VILj6PQM=iL4Gr^I;@ljo=^pjU|-bP4yvI zoU`|T&#YOqW=)jTT3k)kSPiP)NhF)c+|)#J;2A1kAJ4@$`n>DVv96?pyNp?ZS3*;^ zK=cw*z)Ibz*7xc;n3uTC1jpaZx;c0rN)nR-6>F66kQ3e;959@?^^tQJ4ayDpzFZ-r zrO@l{h*D$-wQM&!Na@0JaW5+RG&URzQgFKDTsh_GXdwUL)oPJz8smFE236W5=CGQh zmdeeve;FnuW}rp+A!e0|<9MTsSD4$(Prbf^?B0a<)snM685};B3N{Dx+b@lW`d`{Z z{~PZ<_aEv0l#@v(6T=b`zDIv=_5IQJH}Mq{U;kK^+&)!IUy@vJNSol0M$B1j^Gwnl$g#Ws9!eYN|s-$LG(B#)nu1`i0D=%}w; z)JCP{|F-8{o@c%8SGnc9@!yTEcM>1o{!f4V@biZ6*^?@#)=Hn9v731cd~o;mi)NG(;;0y$9vT}K7n%~( z&wf}MsWoA$%b`kLtl#DA0(whNBZF5T6eJyLqm>fn(f zb3*roEecNwUme~c%n|a@S>z1){ zWp-S3(`8LiYxt-8&U-I-7P<>$97$`J+A-xza>10c6rCg8?R_1!+U72?FTR!?mF;pP zX)T*SO6qC2xEH`DrH?iReKCx^(2c3fGSVEBFz4hON^a{>TPH`HvslpkATjvQpe(Km zjyUTCC6^Q?OvPopC~87CTO_WcbFC$AVCUjIp7w7r0^>mlfvmccy5u6BQ2q7e>NVe8 zPX_*FGtx?@%}tw?p2_X^WcOFlB8~m#9br5!Ae+UyOp-Q1SGAPb)9xp`I|@`iiVoNS zIEPa(6xW2U;z8-79A#->ZD5n^1MI`>+3a0xJ*>qo@9`x1U2KXw*9&79C$>IX>ba=d z;*C%=82!mP4`FJX5>x)>JPrXJMVp=RB1&hcLq}gt@9&;-?osYJ?)UClo@j3)Uu}OK zwFq8F|Kg!!fqQcClRjY>o3GlS=nX^1G+Z7f|H+QD4Cy95b|-K=>P==yP-2*8K56S~ z|IhBR-?q20@3cL&rdcBJ^jwIG_ixfAV&DYfjA<}|yqqnEm$iM`TlO72(#H^qXObcB z@p@6rg*?+MqCan`6-Bi>4#iMM=3Uzw7vW4B6P=fk{l4STd4gHv%xJM*$VZeB7R}Pw z`is@HjI+FAF6wXcUm29P57;Rdt2D9I3R^$7M4;7ya z4`XkQy&igf!_Cw8ZvF4W>-wLSgmbB0&ogzD(OP&SPLStWirMS9riCmCPmZXWrCOFt z5uxE@g6BHES*qa;bz16cNprYEW3w8$mKXd~Y(goa%#hM?C7u@9pI^(_C|i1X)!?#@ zbC$yrdr!5CzMgI)^>$LB#J=%~#Q$G^xKoz8m#f`{4vK7xw<)$}NKExKA)7Dls_eZ+Ubl{c(TXqF=jb@$u5b-#Omw@OV;1Ad$Fl{+dtG_(x2+P z;oF4&-9J9BZ>@hlt&dyAD5L1p&PqLOI^{`(I+8=5SPYF8_ zdNX*VYmcL}y(?~F9c}nyw&{mb==XFwe|_FM#1}o zj|UAUVz-p*m_yWx-a8qM(|4y`NNd5yFpK+zdx9s_yVE<&x7q)zHqj_0mQ$M8vOE6_ zIvcEn6b~-pYHq)w1dHSJ(f<10C}tnyakENS=NrYujq*WDS2i)sapZDNa~@?c&0MG8 zEaiA?b6L;H5n=(OnA*vkn2|kQOgolZF|BucL3d^EVE<&Tm9f`cAxO-YKLr<-1dI88 z@@i{AZ#_V7*YMvfpt=3U*m|(XAEgyA76|`IYm`4MrjW>Niye}(t3yK}}GwxfMbzn39+ z#(E9kKWbgwZJZR=Nb{8q)?G}2w+Y%6JUnDwNMuM{P;r-TUtukvyca#@d=O?kyb)Y% z@;qkFV#mv7c$!;G*?0Ll4f%;`?LU+%(d?J`%Sh7ltHpfvJo_@%rvH+DIQ@IZS{;f2sn->MSDsr};XQWL(GdrfEVx|mvSqV> zv-=!bU0&DFpteDaU8S9^?G>z{N*U=A%7}-|g0vDhNIto+MYS|UR8`vYQEn#T>SILf zQMib%BIbE~7jciT?0fE=#2%LF-lg6FzO(-2+GV4JxKh4mnaqh19XsutY(dsYC0Mcx z?F?D3qQx@HxLcd6FEX~`$G(Ow7{To7DyZyKYO%Ft4tojr+uXKi?3pQKou{zLLU^hl zRMUO;yp6qmydLi>-@pE~YGF1|9%dqYqki4seM!SC_iSw)ogHm$kEI*x*wh8F{@1aO zCf&S$dG>{ni{-A4zWwn@|F?0m15;}I9OgSI6Q3)}R>7X+m>qOAv~9%Jtl6@c$+0GT z&1^j*=7bD(yihiY(L#Iiyi(0sE!-2iIB&ipYKi5gFO;5D@|U91^S_DmWNshQ&Hjs= zVzgHyy%8DlDaU{O7GEIl_b-D!?TP9C>C~5H-?sdim_EawS2(1cxB2XC?WvYZ(klIo zw{ZIK6uvm(VwQE;UPd;}ek{_F ztwH9EVaSfu#GK#sQ zMZVtnLND>X@YVPK>u<$GZa>@y%Id8->$%x8))+_e?05n>{U>}2eCzOT?9WVU9<8xH z$6&j;cuC5lw6_elb^yCfu>WJR%4)6$(R; z1nPJv{vyqw4qnE-fFCfOM__&O;3qPVEYd)GK!x5`jaJ8~r_};Xj5W~X^?gPsetH{D z6@!?a83V6<39e!>^+rd0l$Yo|nM9bwtWr^GL?>*YPOtS7n=N<2rB;!8;nMaO4qAnA zT$)6T+d=JqkE$>q%ImxIGGBp-YJ$qH@pDC~*DBK`3G5oLk1~A$_4{jm2Gg5K+7WG- zR!_^O1#6L9owZu1zL`2$fUg_Ctm$;-BtxZK%ynPK*)20OK)>_ZpZw%)J~1!Q1AO9U zvad59aYLE4sVU|nJ3WDK*g$nS5VTl=PWMAtp}t_eNSJ8rPsQyRD%VeRKTE**=AuKp zmu`efe>gDTnH}$tszzU&4=>|r{T5H_CCqQdqt&jcC$lMTCe9pxYF(J_AI870(ax|Z zF)JIccd?&sIG%i+;V6IMx_X52%y&=3Ib=3dn-i$6XD~N(kX=?kn2C&#vPlM0LdUuG z{qRWX4Ri5OEQ){B52+>!_!)A4xjcBQtMrnYFb##mIC!R>{Bs3bfUA6+0jJKS>laPc z)(K72X?he5#hG-dALA}~Mcl|W`Gvchooc!f@8cvB26^y2ZHY@(4JjWUULWwh*~_Hs zMCLu}!+>Ydm0Sl4*%+=y_}S&(3DeXY9p>@I5!ZCz&pyHp80LWL z?lb(H2wPc$_p}0ET#31p->LDVsqh~2-oL=YyfTI|5Ap*Cn9SgkH}vVl*i_M%3EzEE z4V(_Lv*~f0auX-Y!}#$>DD&l4__~CPb^+%QkZ^tG`|_!0{B@{=k9Zq-nrCcF?UFPr zK04MP^XOfH*Y#fX`|tX*!T+^>(e-uP_v)w6Z_R$pNL%9lLw_UYwU%*a4S5mXKg+eq z3sLoQ=gM0r-<*6}-W_@N=BgMqFY;ZMzal1wM}{>Db%oXly%O3Y?0VRzuz6uSLi2}Y z3Yz4YXN{KK<|?g;FUp-Kt!?t{#F6o1zg>=<_4VSH6<@->)`>0p?R5O-A7fMhbT{?q zF?JC@o7ieOHaW++KDgXeqf41@b-F$}Z#XYIuQ?w(Uoq#D>U4q?8@h(OPLYvn1oh@C zKUrz1v#{e=o1t`)CY#f=xxQoWqUq@=RoG{f_s7k|7m4+Mh)JHLLMeZx#;1+W2=<)t z{_gjx)Ae+t7JH&g;|`FO%}XYeZtducJf(6g#^3FcuPKVPp{+YR2rfIGGof|VzS36B zdS0m|KSA*@oayLexSDs;Zm31r$5g<7&$rii$yd_1~I)(z4H`IfTV(#87LTF%zWR>$UNkLzbkq$Q6c%Gbq- zLO%1ozMB*A%-_WC@JF#%*v8(4gW4*6G`{xFnD?AP-+49Ys}nq_g!|(-CLCrM4|GA# zPQ)JQf8<;2+u|$6hRPnAPk(5h6VJ#SErV>P{ZD5*S1k7}w`-E)6`leejn&?;)a>y= zpL@Su{5<)|i-#j0Jbw`PX!O&HFYmrf`uuDB#+1{ZHF~7n(q1h1NcewQW@KNNGdcIr zys>$^=e?7=bwv%9*?^D3=%vLi9a_uaAQzRdU>`gy|V`(Hxh3b7Y$Xj)xwdEF_^u}*TH z2re3SHGE;F&6&b7g@qpvEgQ0mjo6bMIqc7@7w{-aryBhvosu3&)!0XypyaWRwq3D* zbDVL8xb8adI||#cS)NN1%&+X`i%(BUnUHiWaZy5KLY0K)39l2&CY?wglv*RbjJv*f zr2j5haJwif6|9l=g^nrC*UnAO$Bw0Tx3#8a5|zhA;^}U1R5vE$J4tiooyvAgf2)Rr z*GStSyd|Bsqt=G(O#7((Paeb+(k|mq?W1q7Cr3u!v|TATlQ$;kN@xMqIDZR8vr>Uc8$II`az zvVJordmrI9Q3cj|G7d#&{J;Ctc~)xTo3hc{-CN6B$=lpJ#T(=8=5w;e>4JJ&OVw+c z+l4aHGkLkCr>&wxaBUCD7t$iMRM@t#BVoUXEe{)Eon48*?>9&7@9<7#|p>MP;$4|dRfVWO_JagsZbs$FD;@;Fmk z4knUU>z{tk*3V?#dMer8;BUh9**FC^SC9HD`R{`1Ci=GdB>zADN$OhdtKP@7h^M4M zii52KC+%AtMV!&jFy{ovD*Gf`9jk1)j}P8Gyn1@z7SM(X$`*J66{GhNrtMHWvmvpQ zxp+wT66k;&b`{ffP2t-XzXfBIMAD&5?;XZFF3_+MqTHOjupk>*Ty z9S-sbeGcj$G~YGE8SGeV%VPZp7sJew0S0M`JA+T}%l?e9;L5k4-fQgVsDY<{HvE=S z^=iznbu#zlOvehuT3XZ0Y&}*Un?N9FkDZL%2)9E z?{Z50Vp?z@{?KduvEE-jpYZ%$ zlb(WC<{eLd|21u~Sry)3qV*joF*|!HZEOU-4zuWHn_Ul_I7>Q~*r(VOYh|Ul6e;90 zMrq~AeTDsh;5m0lU7-zO*YZY`I9Kr!vyzR|sV|FZqNb`v*#iDRt3nUR$CkoX#(O-& z=A*+nCu}Anf5A&_ymh;65e{w*9bS7ydzfv7C0(u|ZDwn>s%L^73c}_4gt`Sk!wzaO z)%1V#$KlDaK&=eYk2H$onO_oIIt-k$8~+I#HCz{Usguo3XYeO%jBoA}xar?;4rDhloNHA)4yzfr*;!LdFU=fhKb&@Q8e6!J_o+xk zYMp0dDy}L;#86>|(NR0?Ti}+`N+;Eb?-qOM)0Pk6@4CL3`g;HCM{m;JSz^9@nf858 zQl$*TA0r&Hb_m)NzB#KS>TB*S`4<(eUO1#kP?1uFrx%RKZ_hIxklO? zidCFu45pj4!FLsY;hX1<=NkLXKY6}--g^#vhT&g1*PW5^N5%=ZiJnOtl{P4CYg(~% zDWjtMmgg9|2R9pw#e<4!tM8f=GBi9QbNQ@yvfYTxnf*g#aOCZ*S+nGh_#8GPLkuN_&}BGd(8#aK-|6Cy&d!*!$iq`TX8b-b3D1_{`72 zIZN>M_XYdmJk)V`i_AArk_ox!^Bqw{GW{a^NymBT3Rj7s$w6a+at3vAHFJKqH?>W+ zY?7~tezT8Z)04<6OZ|2I1=$nZ$^W6@v27jr%&{FPIwHz(t@8mE`h=fckJVW;(Qbv_PX zk!;q8)w;2>;a9R^4HOkks1`d?lU2u^`3PrXJHLya3;6OZ6$evSHbwCj34=FP7(ClY8%c%O4pjR=U98qn)7Z4L z+kcS0w~dbZW;H`?sQp6*AHj~1xCNvBoEtrcwFY%}dvM=QrH$0SEH$7g#(`&ippYqZ6w9G7~C*#*IL7`^Cvr?3~`xIV=A zotgSt)Q4y3UN&d9-7_4gm#_ozo0-$>4pwP_Z^;!HjYFUw4PV0}dIhTXZRTQOy?8=; zE31ltkKzE^N!vbKd)t2NQ@nfk)2Ce^?nKQpgqk*v$oCLE@+;i;;_13(rQV&4f}<>0 zER>q&wU`%&t18U3AL64mp^xNW}|BN4&TGzM6TwuxX8WQ$*mMu9Z<%uYmv*?%-H%q-M zy{7c1k`IfmFEl>y`y63eriTu77P4NFnz6^uW+dq?aP?abTI>tz`G_X{9L#Y$|8Va# z_n~xu>X?*#$!R~nC#EIjPY857E`GPf$H&i1OiL=8R>|{JjS(_i3%Q z)wP0noEKt0%_x14CaP_G(>y0L@}xgX^`$IJ*_To>HFH|^^c5M3XQnrdiTu`jc2gFk z7kGEJ@O6!ht7o!eD90*7skQrp^+U8 zOjoI~>|$?kc1vH&7IZ5|E%Pl6EO(V^N`I<=;bL>4lo@Um*86CQ>Q(gv$p43SUf*bp zqg(bt_zgF&oj6qvXR}ytQHNg(=-qF_w{(WZA8p1M)s5Y}i)VB@o@ynS_#a@DqicSg z%KIiy6+Tm_3SY7@tQpVT2@rjepQ@ftW)AZixuiF}$Gk=klqhAu?F(_tDT_{0LJ#*` zC`WcXf`7+7yf|jjZ;24&P*ojAw{!!9=n)ilw57q*EJ0c1L+3OWjdoSOn$iQE1CMnE zwc9axwh<_;voH()FGylJJ3trV4!Hxrql@S=Zt-;n=Zk+}yiVdj6UFS@C$k3%sczz3 zyr7!G5!Hfsxds1Lm+YF1%Igb%K64cg5my591)ESXmggxbiArD&43HfqT3!S0@x^+-+hja4rQp68sn3gPc-=Hi`1jvZi~VPfx6)GU-;T$wLcs@umj~wv9v<|{HNsWL zRm;`HRmt_r8R5J}J$ynbDXlc~=ni#?Z?(4%(xm8VWO6p2~6!HQ-Xv zXCC1uik(+D$Ndi%knCWlQdF};jD_ZNp`-Lvu59VbR-c)+!L~T7V*RWvm4A_Z=}ci z!B4(VE5GQmh2zy9-P20JUo?@**`B#FLRUsi%lasCOpYm0{wR0Uw5Yu~{>tvnRy1p_ z%rC}aP|?j z+&y3n_Okb)2a3+ts4wdAy+L#ZHc2<680kH_hh=QMdJYeKfzvjU-AomT^VRh@BIh=I zUK{I)9 z5SdN1-p6}uD|+FQy3RSNRe{vh$8eUf^K?iqqd5)C z0A!~2sA`OmZta;iv0ejU_`>YAwHQ=mmU}|AF{&qd6O_OmId_wLHrB<-hKd(%0E1j*tzoCn_fkuu9U#X`O zcwXngqzOzQ?&XYMVD_T`3iSo>ZL48D3ZhYHZ^nZjn$Z=jj8EASu-Isr-CSry|KOPk zWsl7)rm{0}=5-?nzkfX{{R&j?8$m1wIS+l|-II8iQR@9H1arnA9+t9kclQIkJMbNY^nzQ%Y4^p z=62fh)r$$BW&EC_oUubVyG=!7T8p@4`#B{h@_7R)@qlAaIukb#1@Ku{lpRF__#Bb2}@8fkgbDh?biDxha(SgrU zl;3Y>+QGsr<>JcKg9q-;2^fcZcLVR}4yR5N!s&x%qQ<=j>d7q}M+JP@XobJzF7Weg z{h)3^-yFnMY{yQTnLHKMq%Jt7g-DzDsV?l8++}R1DsHBFd=tG1?phhs({88aNZ#@z zI&pBqoA{^kbrZ@ZuKzJOd3CCmKHU@HU#a=f!ITVaU9sx)v-&vux>^S12tE;9HDr9q z%8=n91w(cP2L*QxI^=S>CON~MmmRAdqa0lvFHH7Ub%6gj zUu*9wPq^p1TY!hm2}V+Vj2@_;wB4v}Pjk)cFj+C4I%7Lg`8}%ql2lvMm@jybQ&lu` z#PPU*oum$3LnnegRrD$E^UwA~-!}4Yw6OVMd$;17-w`%ogkA)nzArG@p;X4psG8fr z2o|SjpM*!>RC3rQPUS{Ay1CFm{$aks{XGS@wtBi#SM;24mk;!=M4i3taf`t*_%NQ5 zDfEla&`bWm&Xc2Iag(S3dJ(r@89Ujj*_WQ`VlsaoIL9~?TWdLuiFk^CrFJ>Q1n_ha z_2i$E$1C`^z`l#)R1aTx3LDUoufkLKKcgdBvGMFWZO+EX!7v9`xe6<&Bf8VI-J`GK ze5K${c++Ue>|i#Yn?;=Cy`YmlM3skd3w4;Q{sNma63^Q?R1zPkVb&AD^3hpzpwWJ) z=QY+C?7Zh`orp(nEw;9$(E-1}gi|qdr11f_>Za^}9;u(y9n6cZr#eqyVl0%&vf9jp z?4wTVLMF|{yW4`p=21BF?p*mVOoGg#*D{3YvjBv9nD~4dkDJTn-aFJS3HZ$A1VNP* z^HM*ZFpRDh1Iw`ic~vjm& zy+O>0Na7Rj-xea*>7VDkF%{SbQ~{f)ek+TwIVT~wKiB0`tffxK38xmQs|KNH`Gx&R z9e?Jn%H+v{pq*^Y2mDL5?BjaxV+JuD)krq>kToJY9m9!!0X*^t_7fg3>hRuI2(`s; z?0(U4EnXw@X|G#49ScM8D=^@nrHF!u`8d4D&>t5nG4 z;L%$NFHoA4;(lDgAGIGR+0FNkpo>*YAD~~;dr+M-l?r+bk&p1~+LU8*cKJ7{KPdPr zo|uQrX2(c5c@Nuq&oPPd8QEF#n%x=+6RR0I9NNJGh zarq?nfv(chy^*{Y>$v-H|N2AfXQdO&7gK(zda z932Dt2xoRVFgqRtqCE&=IY?GC;8T{sTV(z@H!IS6Dj>|pce4rmD#ydp&nKEJGyX&` zQy!N8o3u{OqV!j0Dihg}lfpi6MIJAG|G7cvSCCVG5b_JW-v5R}I1OU8a^?rXL|i3i zrSc9w5VuFd-)(>y?VxX_?~_*@?tkkWXFaVNxcIZW zUmc`YRqaezJn`S+>ybZ(wV9>4vzOJ9Y<%jgSE4=%VK&l*^Yt@!-sWQG)qcx%@MT^+ zAag47@Z9c%!{vC+V>ny*3c^o}WSht?oZkOJG5ZpXk%ejPfG62Y>aq($3u1XQ_7*Mr zx$(~?R%AQ!F?gkH_?zDY@y{Z64?=all8)1SHe9TP*`7gM$&EAdRxuom>BmvMI2)Sk zN+ZQ3)E)`osNyKbw}Moeq7ufyj7Q@aS(*B)El){dwhosuzq0Xm3uk>Fu8%S3x~jk! zpCrx=!quS_O7GIrEO-&0WMgl|2ewR%hs|;mWk(P>lZg}oKl~W_`%}2`y?;)qq_H1$ zA$@ECd|{`@I*)ntt+*R*CMrJDH{n5wvoG5UYQRAy8TG-4U%;7NiH=A4sU+}HcB;x^ zusPw>Z+AI+9r+DUz9BJGH=`Ym}z{6A|j>??Uuk0uIA57%~u?c(2s}lWQ$|}1` zcA)xN!5x#uN_6~hQ;{3|l)>lP%GBBhDvecOz(2@(*M1@bm2OlLDDym=Wni1^|3HQ1 zVH*REFe8|bI84s?13X)T|NaeM`4*gsy6owEL%rOJ3j02Yw-1b7W@Zv^a6YI0oV)D9 zPoJkA@6Y|HC9V?_c{0xDdy`<9yD2)UFnGf^OwGJHb^vOI?+h z^OuRN+7-oHzys_E|J#Y!{eU^Qzz!n6{!YKFZ$ru40rt$PyR|ee7d71%HkP+E3zFU6 zi!0a>I0QvsN7=_Gxh$IWr>2{aaM#_U7t;6PQ5(blwWexLHB>E5EPAhw)hdB1UW5Mr zg!5=7jslG}DSK&N0Wx{p2kcDS^KlSusvS~|Lms{N1=G3*H_^i`V z`xT(N`_41vG#gSU7U2%J=Q{lbyOUq8P6TqZ1+j&c1Yh2OO!AccG==w7h6&q1hM2@z zpTa3L;V{$5j#=3kl1|pDD;FkaE+*R_6B~il*P_uXN%ixMZuo9qw;gxYhBN&K+#%fX zQFTxq&f!yUXKH%ZPj8uOWc;$+{oc%cpQn4S!4C(r&q1C#*m$1s&BhG;fM#-!53(gH zh8kG;S%Ky-gW<1&$l`WpY$U!{#djx}SNe|}yMb+=1c2o!KrRXAxW+Cs3vMWZq2u_D*86YrDpgGH0-B8wgz>~J8=x%L-tMjr+X+C%3D3y*Ke5*5Ay8FCA6UsMM_ZKwWEL1&r< zH?W20(`lXs@#QnVgG;w@$JT@8FTmcIu$djW^RGdSvxw|fKsFbMPw`;WBShyi%uR15 zLR11%D4YTf{!8NDTvQqbsj2((Uq5i#2hjz5NF2LICD0Mny@%`Wf))7>ydT&Ma*k8i znkye*B*((cNNkr_0K#iQ@1qkDc-haM%vsL#V!pdR3ffG3mE^xKWG-HYMd?ArUc@5`5_eVt1e*((%DES}BxG~zeZ zr<2nF=0>4Xs>JT%Ydp#Sk$Z1awJ501KG2uz!*kLf9%;2uggdNIoXvI+&o1LpwuI+4UHDg=4?l8`%|6YQ(#lWUWs712E}n!@+Q_eU_XZ&4jI z7sh~_e8i#}#L3}2mp$M#*1)GPr`pWIzK*hd>Rez4AN9u-;#+5`i1Xk(C$4N;*`xBz zC<*3^CLXcFmuNIg8cyt)2hIr<8kqB`M+c*c)W8k(xVnK(LKW(%fn32cprU+CbNtR; zmCWpRn89nkLl4}GQ&W?3Gk~~xgYS!EBS%S)Q!;pE0_RA;>*xe0DBwGkiid2#DasB4 z+yK96P+=~ErQOetlfUrry(df;D|7a160s+vPx#CxlHEl5!ompiI%xAD%+FYOxhrIZ z-9{VKEHT0XaTNQ?SAqB9VX8Z!@y{y_6wgx`?E;NvVx!Y5IFJ22;f>kfeVgAfo46Ls z&KMCUbqwBhE5sX23HA{0;FJ+!W;1H)Gk)r<64a*JC+#Rc0e_pDgau*;cAWI2dKfO} zmKR8mU^`_YlUd!EqNlO(ZzTHBt6Fg?Z zRV~7OU%(vj2r*KcLQQ#t7_mtj#TgF&>pM*;5zX|twlesJkQmiaL{MrUrNzCZwboSz?{Pa z@Jtz@jk&}Kp~vZCQnwaQX(uLzCbA3Ri&B+sX)enewo6u#yGX;tS@hQKQB~|g*)yGJ zH;vk~z3?ZMniC)WUEJkF91hDc#~)>uLZ|Xln@FE-tae_@0V@&)CX|W&JK&`s37s0)2Y6Wz%-}xj!~zek?)K{crtZLQIxVx zIV+b?%HGv1)L7T_B0OPfT$K~3QI?abwu?2`V^Im#VkPG+o4i!|LC)WW;^8UJ&~BpQ zdytvVKR1Ct?!t{G(ao6%HrY=7)SArIket($d6sIN1f9)3eTdRcB|rKryEuk!-Z-vb z1l(YM9IGmlAye_#C=cV8&d)4^IUhncI862^L~iL1lh_zu<2jgP6dd0`xWH>jv)*9u23)aGcR?H z`_lwwv={8z11jZN#JAIAs{P#I9o(DyFo-p%0K9O%Hgwp7*xOM8rlJz>djR~-7Wk(v z?6a@NGv5N-{EjCf2rZLSTux1WlUlknO5tvx<^4ZdJBj|z9V*it?CvaL?5BUJ=wGNV z%D_@)qMmI+hMOY0cYs|ByC^F+1esx}~g79~R!;h$Bw z1G#yX{q&2zQF&!CFHr+egN1$v`>+YL{~MU*5Q^>Npx%FAIUkc58#A4B8s2U%EYu5h zv!l#2I{9JVRU^1zIq*Ss$2&i z^zkgD@`_vOz8n`SfRoR{RrKO)w57itW-jM0mp3|tkZRF6>Q2R7K&%b632gRjNayYh zwL?Hzv;$nZhda=LPx6d&F%2E~B_kXE&Bf_@$K4C#9nV2od=##=0GP2N82m9Csi#o? zUgbLc#pn6Xc@Jzm*g|J23@3rnaqZ zlyqH6<*9!KyIfPc3RkukWs1lR`x&X8K|o(tk6=J zyem8fc|c4%L7a7|Y~H|SE;Z)R&EHJUcM`pi@ks*R^>0+9x$u`UI0bvjcMW0k0^11g zaknq?6>ydd>_qsN&u|}>Hif8P6kOYpsjluYt%X5Zm%$(%d7YB5m@Uv|ZR7hrWXgbB zTnITP;MD$(KgpoPaNbwIgDMG@a5-nOI-P)GRO{2ZACw7nmxrCGrjRV!*d^EAQtIYRoG182XXvzw(^S zBD;&k#@t}k=ir9Ue0D47AP?8#jF2CVkN~!rLALC~U6@IBZA&MoHu|HT@M}k?b4pVC zUSR4w5AG&`-6%PD%HrYwuJMGg;(at`|HmuX%;83B)SO-5$KG&G_rs%41sS?{?IIwf zZ(!d=pp{>#k8}R?0&{Ua?YLD1x`h9K+e2SsTWh?t6yokmGIpt-bxk-Ga!1bi6<8n# zcPHQlc7-Qr2%q*3x+yzAIL(NjfxT;^U@v=u&{M(8WBFb6$?4s=-ivqw+Edpo=SiHx z2F7#X-p`!hNEp|r!e+6EG!RVv4PJ79u+IFz^)FAS;JPuI&Q&B?s6YDx-+__lv0wau zu%U&;w?yZLa8$#II8BVh;J2&frfneA)p|Fh6;D-=ctFfe7N|-MF_-wXlF$BtS}Nd| z)_^CY6Hnh(?oxTqKsd~U6I{QIr(z7cyFub^&{`&Q2)dw4`c-(8(bT_-!Cu2TK?h)_ z0$wu%sPnGDgl-}>c#U6BpCnQ*1pFIEaL#MveV7Cjahz&mFE!pRUdsn+EzJ|qm$P>O z4S))EuS!&`4|ADDjBCv7@klb&MV`C*iauG64zaF2K2hf{n(cmWOx@OAl#gw5a# zTN2lkVHNWVe}mw5!;cn%>Fmx)h5=Ay<0n7{t~3E&76%*2QpLMA3) zKZ6U){q%V{MFw|r2b*&JH*=p0{H#_!z#Lm)b-Ht(9`V_W)6oj-2FVFNI1Dpf45sKT zPtt1qTt1N1H^Jx~W8&hC*af8NlT0d--kiQrv4JoMwP|MK0Fwc0QLl8M7W#|3(uX{C zm7iHePc9#EB92~OU`NMvV&((-r$;zF1<^u}r^l8R{-^@g{0Z2XUx-ElXV`#WUun>C zG2ZzE?oB-1f?!ViQh3jmoQfTI&h+9+MZ&fZ=D9e4rnwf8DMehxQ+|oqR2E%b;H!GMd)zbHFCuFH*OQyCfp|3c~)!aeHcMWI5YN|$VkU}6v6+*|+ z2xXZ@PF+fb7|Yf0P{(P)BGF3Z?8hm%!+q$>9s9u<2`GcRfQ!3uWk+(AykxQyc>Nhf zh<^OeE<6LTaEqJ?rc$^g73iH5r+4BMzrq2|A*$RaN?zi<-h=0zK-VD`yumCS;w+q; zmsG{e==Zf3R)civqM+Y|=JT^24Wl)Hx?lpGzmn)w29OKtp~CwgC%6gE!+9cZb2`l7 z#F*SD-+S{eUehlb1Ewkjn{%0%rAWzO<2L+EO+JegZlxu6a1iIW4>|3M&<_@-7+Jt3 z9pqi_BX=Dk6PJWYK;$n$Bw4|^ zPA~&oFTTLk?&3^t01v8QtP`B)!BjSTcuoq7a5_SJUhP-9%3t-Y^!!7~>ce@4*RqY! zphq!E{6yxR!jxYH81^x6Zhe^s`AFAr9ew~!K})aMI}i<`I7{pep*zU*kQhT2tcu2} z1C9wR;pH0htRH|=yuv+bDdvDln=bq1vPvQ4HhPv{rSc-q2gVir92#kMrb;$yo%Qxy z*(p@jb=V&pE=N#POpr8~)L2x$I_!Hl+_p9F&@FiFfbu(m9#T8*+*>qUt;uxLz)u~C zran}UOF3Pwz$DFJYNzt#d<3`j0vm{82XPzqWT1D{gp;27vtmC>zKi92kD)$W1Y#73 zNP)ibP7wMWVr6|YTvphxfFp5*pXevx=erWVK8{b@kSZe%Ht4(V;NO?RpEW_Tlo`DI zkn7rzSBwUCz2)6G(XZtIt0Di=4VDysw&)$@>ZxyYc)z zG$K&ZhBN(VrwR+BCb?&x7M6>RKq6MzD&Oas`yVlHsi1;{EL0&&!26qEU4pqAyLbvJ zaekIkYwm>Aok8BjT@ln@Rw~Jwb~W*!p!3hph;z=b2>IFZ9<1qUd#c-mUoT zuYT$}=g|Wh3km?&z#|6w*PGz-Zqw74MReRkXYMF71MT6py3?yo;aaz2S|=Wa@tDdZ z1J<+v*ti(+(L*%&8-x(ZG})-^WnwE-0H`9JtP$|R4kLaJM%^O8#IJ)Ty3ZMI47ZfR znGZ$FTwEKZ#`#b9ulNhFyK#;-2vt%sP;eifl-FGQz1)GieA2*{krJGY)#&q0^p@pe z$Z|0W@sVnJ4=7?5wN1eNR_7WFVhZ3r{OAV$yaw|wCT_Lj?(FC4jU<;|BW787ezsE! z-zAF&oW5h}0Cym_o`lb>&wDIOM30uA$WclK<-7bFTudJElv&^SjB`o2df#uMyK+vG z(HS2W?ul#Ykrc(zaJl4?<`biC!%HnEP6z7EBm7%WSkr*FZ8}JDqfm^QhJjK%`-Gdw zE_pH$hlZ_`~$|~}@Ma7wP z)#{nY>4E-7_89>qx{1zsH#%H9%^^Y=dbvw@j@!~LtV8#wqjZER$MV87w5pw9Q7?k) z_UliXznWtBjCnktXN1}yiLYS5O`Lr;PM8)WhHhdZuGv@rSap*2R-bOx789jm%6fEk z*RB7u%X+`%mU2rzPsTcdf-{LsJ{Cpx04=xXWhS{3yD}Hh?JAE(>kK{E#hj!bbmn_f z-DEZ=z*ZdwJI!J1bAsNGdm2g%_{<$YE#w3n-a-LefK01U$M&QSpGp+C3KO<~3e;_O zM2l6K=QIX%Uz7YjfZo9w$&gy2FZn2YIRU-pwbEif$s?nWUQHXo-EX7j(njiq%}i`O zKC47nzgdgfUZDlNr8JcB2!UAO1RB(N{G@ztfjHGz-MCT8scif1rPr17^0D zv|l_a>_mq)MxW25+CS<^H8;L`xAYGNn`p>iN8oY)k)NZbiIXp~H8YpI3eCID-Mws# z(|^$lsSRK?7x@0i^zu?QL7Tv=(Gf9HZm2}zj(Z8MaSog<*Wjo2FBu_B_#HiWVVIki zC;_jcyxy$+tGSqP$_log%oDKxXLo!Xh)OZv=~9ev|`nlHvLY0dTJ#s%{j z7~?iwIp)uw{y+lO;td ztc1$DM4QmjIIDG22l++j;6v1rT32JX@I*>hj#xk2dg169Y3psNCEpd=8&O(Qf4FY~ z{<-CR)%}aqSgnEq8$l+1NZw0CgO>^h2_upv6GMUoSY@M=K8^EwNd2ZB*WT&F%v^Z# z*1-cU!D6v)#oZx}uH$Daz^S0Nk6`^#^e|VFJ96kvw6%DYM4-TGgrioFc~R&pJ(gpX znQU!uj!*Go+$EaPffz@AolP&WA*#N1ppm&$EKyW-ec^!zNVDX>l+u==mTHz^N*Q^Y zc*K0h^{j~F!B_t=)vL`jatSl&c7Kun1>;%8tMqaf<6CrtIq?JfY>;_2^4(hE{UvnG z(cF&(%&&DIQtcHYrP1pYds)p-AD|2=JPM5G{JB3m7xyNa^l?F5Vl^Bn#%o^l9t()?v~5=y|$1p2!+h^%$@kuduky% z-C2z>=6j(g3cd=;Uga^~g5{LC@=e$PMa(7?FiRMv^@>_kb(;S>+mHA7ax&!`r1jCC z8RdjFu$H6gmpq2!{=&rjb^QmPN_p8p9}O1}rA;@(hNv~h5%oHfJFc6fs9-9Q zA7|lIRo^&|AKMAvZ0~K)LeB@!8L#BuruNY*GA~g_Y9>ocJEc2U<_`MYTlj+=1$nI^ zXZ3^KZDGXgXSqI2$bWwb-^D%h0!y^*jossz;q2{P<;Z52tW)K)LWbT+E$v(3+2fw) z&gB{Gt?nPIJ;p(>u`JOad&X>OBWqd971=IT68agJwLjJ0{0H%dd*s{df2xkxyO=Y? zL-IY#L0dT{e|9>@IQKi+*_T+SDQ%@XLU$uUOJy4VICu3Qy$UhTF1wYp))My8j%|*4 zjyv}0w)2+Fayv29l=XIMHR8iFTp2H^P4y7;0*j^WN(o`jn zB|$1J7BpXI!&xhL63^FysYO#hBsWhPms&r4g}Z_;Rvm0C6@q#C58_$Ot|%i`J?GOr z58RX8cF#!f4u2ngvT#t|ZH;zxbG;2Z8XO3t_hCD;+BF2~{jfPqu|6XqmPfhpTjBgpc+#fwlebdzy z`WmyZ_(J+1cUSr;iA>_X5+?{5##BA8=JAL6hx-co^7#h%;(goMUO!P=1WUZpoJXye z&ivdM5a}DRbY&r%nFNP)k=e7c{x0B~A?gy%trH_fLz<+Vvuv~GvQ@Obx0bb5wS?hy zJWXVWuNl}7?bL7Ja&6+HlAFFpyvf!Nx=uUf0!k|-4-+F-rITdsXtR>h7@bEIEfi;j z-pr&F)i=Ufk7Q=J6KDo~Cq3;i=<*U_xDLXVH6{w0xv(Wd>chz4=i`TtoRw)Yi z*J`$`_CM_r_FA?yOH-w<)Jqs@tkJCMZC^UEbGCOXj0 zM9T6gi^ecrpP~gBjhV@g!q?8L)Up0<%V}R~Utur7biTtnL|H2x6mA*W^;7Cqe^VS@ zpZd?KKCQ3u-uzV@%X9u6H|u11B6HYbTVdB9@9V6gHcj)~-u>FC+#>2=UaRG}O7S)XW>0QcXbN@xNDP*)y- zuC}GDv&Sr-w3+VkV$k*oRM5TP;V#fKO#=&dq6$1Ix}{urIrXr#Ax55)yGhT5=BAqr z(FIl860HW+cVQ}obgF$f{qa0_3tWMPsQUjn!#AMgtN7B-)Mfn$aW8>SIK?<^X2EUq zf_y>gY*}K7wj5I)$#>}nCc=eNVt~9ive{%1{n|Tpf;YhEw4q`eMHQZxiMu4JxLi*5 zP&2jy;gYZdopA;Ev0Pc{tu(^@b)bA4&6`WCf~!#sTy$AD^nB#X zNpwK`c%Y1++DgKwV;uZg8cHSyYSv+BCkmNujYa5~T5GIH=d+&Gdce{o83)aVXv93k z>Bn$mpJAd$85__d7uWWyUDU4XMzxHVs>SMY#uuJJKH56B{cUoN(b|+9?%x9K&oVHP&>Tl+=dSAI?Ga6)M%IKJp*WJPM&3nK< zK`Viu{R;T`^5T2yfR<)wV-Dzcy>?J50C$?n>>ykh^T|V$*_I*JNZSJ2Q(L;tYPZ=# z>|yqt_FViC>`!d7Y`JWEti`P7E&VJtEcGoTEVt-G&$C{&Ua)qvp0MmuhRF`;1XBQ~ z!4_kv3!K6);xg%`d{U`v`5pXJRw+zYNT8A$Lsy_XtllJ{0dtfWq&D(lIhFbJtb9c% z;W$`%(2FmXOUnE3T<9m>_^BQJ2R(9JBSzFG$_e4O*X7XG3X-278x6qDEQ;F#aQKt@qDKLOwO zMuqW>sx@5b&qTyw{V}@eBkC^V#Y>Rl1vvRKW?>^li}ij>@0$D|eqZdA&wFF~#a#ci z{Oic?-+uH->+KolZ?4_fqO_s@Qr?>x+tP}rE>E$iPEU)?@Op=8PGOil$(mum>y(1l z23-l77gQ?ff~&Wylq-*`imQift?P*Em}{D=fNQ%m#5vvJa$L0UvY)c2+VkQqgQL0q zgY6{Id$}AZ_7`fKb8w_s2fD1t#C#UKp?^@@7n7R8?>3-I5e5Pp&wp(sbQOP>>{L`0 z>S{}rHML+DYN6{2%)_>axyy?xxgZ==BQyrH1PfW@1Jzp$$a}k35ikDx%yTZaX2DDJk=#j&VbbC>+QUjPpDo}z3&L9NmNLn| z$W_UV?>IS^@FQ)(S?PiIUN6f&YL1OKc7#|SGVi!t*`ZujUMY8#kszK6QZMnoS=KnD z%~xOH(^3w+HcbCw)CG5?(Py8+6Blky(Bsr)xXcvuHSm4&`TbqAXL?=Sib}xfb>{gg z#!kq4M1s|Dwy%l0tqFm|&R<8y{~w;t0z8Vd zd;2>(Gplg}5+Jy{yF+nWyg>0HFJ6ikDHJVQ++9ks;;yB*y9N&-5MQ5}-S0Qs>;JLW zCShgf(eoU+?{ng^X1aKAvyM^_QUqs_TKht_7Xgr+K1Zb+GpCE+c(=b zSYs@OP0z*dLW+Nj`pCD&8|&@rt?fInEY=nU`UpwJn_`r-Q(S9|BJ)&lZI|++Z;N-i zH=nPm@<83{|J6|0xDg(0W%+yZoE(#iNVCLja406@Vf^7X{I~VM?{yA*0j)FDzZ6R$ z57F%>c%~At0{<5{#wxh0-c;Pa?|hOk#5b1gt!35r=;K?EInBY*UL;->EerrPlY$5K zI5FS0+Rt!`dVybjP0ruRWYE6~Lu7JQLpzX~dQuOSGa3P{#RhMq7u=aU(D zJaXcgI1gXPX7*`IVJ8v4?RZQ(;mN!TqVa^G4rfVme16;UF{}q2Rm6B741_GKV%NXL zll2QRwz))~3gWFOgg>GbjDyo~Q|I7G-ND(gnv+ClT9zZexR;pYKH_q}2NqyYw@~{i zcYK$9RaiIu!9KVGH^2wM(89oYq z$-Q?+-cIi1I)-Du-8q-OWWBHbYW>sX$K#*2d*%4>L;7gX1;J+R6zUJP*&=Md@)^H-OG-(h>tpxCAIqDRurT++=zl|VS-ux@8#bY-T{i3%P3HDC zTWD(7@$g;Yr^7~sezcFbwXpWG?4h1bF_V*QVEKi0eupyOyB$sGv`ck&@=ej=g}Q)Q-sl+R!iL=1cJWwiCaNUSoPM5$hySddC!xZ>8^VUn8=UO~4aTji^Xf@RK|6X|4g`^%ift zo`1GKQHq&?afYG7Fi!95u$WYF9a5o_kt(NnqpA^|YJM5=6^PhWUXc&?*zi;ByWyLt8Bx|4?N^ zC!r6%m3wH_)j089aMpFeyW$`!yqGB11>zUKfybS~4m(36W|NSLPUVouuq+i3BZM{n zDr!gHVDAxc3+0m*E##MKGV(s@wc!`v(CoiHH+(zm`OwE_ADw<$>~-Cg+u2jJ>!!(} z`y;&JOYEhjWM9#&{wYasS0zcW%e|kUTFVg@IAS$NTjL}1d-6Zd+a`B`sHXNqQe|p= z9QKCzN~pU6&&B$dgpg9FwU^n&FCYf9I*_o2BLp{4HdP`{gx^ z*n7FHlt4z3Q0<|wig%!AnrD%Bpz=~%WB6V?C(ko4vh22Gn8%yON_BB$=l35XyML7)O-nXQJrWkP#mRuQ65JAPKTX{#z0x zyZ8|#&)7hJ|2&XU2g#ce0-~{||BHV>&l>P7@?gsk$G%Eaepad|b;uT%qbw%x z+(&d_KR%XKpi?e_J2`>}=oHBBD3A$v4XuUeq*u?W)`k&4sZgH4lsgloS$Z~xBJN1v$gI`}{E_D^xUWjSd(_t?nb4AaM z8WqtZbd}X9KQ(TJWxX})+;Gcnd`147`JV$#+mg z`=s7e-;xLN0vSWs2Cf-YAqEd*KdGa1hlhdLB6SEJ&~zCbw&LiE9N<#s)2Y_f5qZB zi>KF3%&U7~pnneeN`4@7;ykq?vD7AbXl4lgiC%>eXQ^+TB5VOcT@s)7EReG=krcPl zz&{%Xn=ATg1E9Gs-j2v&8e%Q`x)Nd&iqeHu%Nf z81HD$Wp^(3B3F4=oU6X;FIOk_d{J*{Uqk9W_0@(D$?HG_;EOPq3?pr*w(`69hqxkW zDRe>>Zk5NFYEZZ22g^#!aEoTHWG-(q$d|;`c*}2qgvf(ecqTUCay;vEIO7i)`!Z&U zLI+y^0Q7%2kLF~uXo9bP5;47Tpk(8SK2ImJ+Gk@v;td_xL6u>Uo?;g@0gcg=h^uOx zBNmemN=4-#(3hp&UOLT&FKYB+1O%OU1rmS@urpL`R)Kx4SK-%_8euh7=eCh#kfvRhcri~Riqe;A$#6~tep1#&;rLn1MA zP0z^|xE{}NJ|P|iXvo{=c z+P}oikF#@|g1FAs{`Aix7D?6tvi=t~rhr!v;WXGlT`nMYe1(|FB9KcuvfqF=J_+2Q zQRo8`D~z39niXCJoxL(KyhDcn;caPx4yD3C`4dFMSCBG0VQ$U<^Rv+3nH&t!Tm|h3 z6yk#F&I7Z%2j)%+x$xwShEg0UBTgtfCn9Y6y6?so);I!p8dS zufnO;7i{WFA`S2Go@St@d&u5DiTGS4;@O))2ITmA6MJ3)PWlEus-?!mczSB%#dlyg zbO>w&)AR^=UJtI+zQ8iWNKh%Ou{1Uid0Yv0wTR&tqD*_h-;74u^<-` zl|G|yDRxvh??n98C46gqS-w`vBv{hhl^xV|T7vBSQ+YrfZmQ}d)>4A#^>9#Fi;yF| zU^w3=c4o#8T-(^sxPqK!QOK{6_~u55^~4mUi4UKsUcqrTQRC%A0OMf19A^frz+s9bcFJiIy1D?Hjc>49RgIvkBPzokTlVY7eyP;GOEDg%m>4j6@R-W9791r?eHc z(NL`9{V)t0fg|}4jBbwwdp<9SSJmr37Y*`A3NrJR_}d1OY$zD}Zmj)6+IqE>S`Jjl z1~q}GYI{z})?hTx!hU+pxopHn)3Z0+B-&iqP%N-ZJE(N`-gMP~oG}SB7W5uYg*Gy)+co<3oH6Uca5lbYCLWpYh_Yghe$34B3yyG~*O8f~;W8 z2Y7$5wRceU6 z;K1A#y<$8e_6?8J6s?;D!5O&)f&OnIF39Zo zeD)4rnM1_*cVUCCV^_{0rqvhLQAsetkJ%doL2i8ET$%>sy(zk`UN5@@r?msD(Gc(; z%kWig!w3D9eB=knp=Z$A!PYW^1=>OOu~0B0jW}b+flhye9W@s;STC|&6(e)&U&c%L zyfz|b^AcX2T z-hv*rRBA%DlaAtbq{mG>*qu4qmx2#yg;cQN`Ra)*Nf7TDry0v35uf83DZ&{0iQ9&e z)9$8}E+t9Zq`J~+q{Ut$2m+tdd19GV9w;Imk_yRviS9O`&e_i(OZtjANc>;HV;lq( z+DM#FK9Ez`2vx+ti4OE4C#(e4HXQlB8#L*0*k{>zc6Gd`!+!<-+;`;Ndkn7j4{f2g zft(x)tjWnpg%_-?SLmI;!Pl2K8MeZ~T#mo`wU&!LzLb4vzz^OQtwyhlejR^$82U;( zuc3ob1Y?A{Ba=e@yKh2ak> z&MMsjW>~K^Gm^8eF7KZNBUFXCkd!Z7zr$9hdcuAr|!WQZz1AM^u8F^biHT z4;IUS-9D5x@t##tDNvJVBDUQpaDjK}o8~XdT3N!5$pmE-gQr-*BY2+mG9P_!7N`D6 zc8Up)VP&2IIdbd6Tgk!`(g((%M5gB^z8b!+zP-Lu$^ks5Pq4!Fl5`Xj>dnWp6Y+t>!-5(NU*<7!zCY0f22xRbBe{(>vO?R!6s?I(@Q{q1*YLR|U}aVe zW=h)up06uf;vKwFlf_cfeknytCWmsY)KA=JbmAWq$rhv#L%b^VFupRj6X%L^#8%>c z&Z9~AOiGajd|)iyH@ebJqpqeu6pEgKmB7pyCtaZv;b zQ=5I;0dDa?=3Hk?41&MVhyRbkO4v?@ghybx9)Vd~Ktw49j_)>Xsv-1hEcmS*co&~= zPY3!2KpQYzmATe%KD!x7b`~V(C1OE04G%%Qr4i{#LEBu(YR<;jScttd6K_?2`uLAO ziYx9XJ}QG&%V6E>dGgz$<#&T?bAwazKeXvj%;RqGmUF57Rzye#$2Em@nvd0g7`$vg zcrfMt^U30no9Oy3UvA%iYB9|7-t%_y8I)_vGPS$r*2b|5A90p%g1z4rduJ;4YHxDV z+=Ag=ifk#@kteOumXg4-7KIy-155li{H(*Eh2q$O1)0OfWU!b3d!;j4!B!-I>R(M{ zcNCddCs4iksgxfJ=pwRaHJ+<(V2SsUMd>;Gw>`#6RB>~IUJH{h5jEV04ch{(vm{)M zKk%~fCohzx>Q(yQAbVlC5 z8LZ}QVA|`j(=tKC7KFi}Gl~a-(Eb)L+!ggIXGRwolWqLBh}Nya%WMU~SBQOXW6a-y za{ZT9oMrtzWF}N3Pi}DYVVpp>Sa&~i!i1pdsMyRcz<|Djl|$`Oe7Nsny@Q%$?X*UV zs>OLQ05sQD-aE~6O%UU0#?OD8wY{C0y2{l(+&ct}gmttWxv-nnnuZ*z$!Rhi zPvtaN(bJJfzZ08U3tn#@*V_xOaV`v_ruf-?;PB33`7LBEViR*>m%^Sj;M@4h!_9ul zhn3Num9&uf*mZWhM1SkEz9%3{Pl7`DLY&fzKl3VH%_=bK$_K#wQ1K&=+FY6MOZU$7 ze&g*xMUMzhsOk6w3WFFQ07f>8t3LyuITx9}nDz4wbF&b9;wzyeC;KAS&qI6=bI3N; zBJhU1rzh}Ybpr|76~t!(Y>K)t7RinQnszTzaRs{DkH`iGbuhOR3A#j-_!(NO3#oR5 z)9j|Og;k#sM5PuYqP|vK2!r@JHp_O{Swry4?qrwD!jtqGwC*s_Vqf6|6#)C<19QER z@o&zoG+;~*p;7;a4&Dlm%?dKFKAjPr zPPLbZ+EMV2UT|}J{P{TDbMPL`2KB4g7u$@qXoeT~IcTYc$h^s%UK@~$x6lJ#V2$lT z?!ZK0$1lXD=nNWdD)P+fZ$$6!!Z)i8f^;G}_)?+|dbZX_XfHam{u_Lj-(bau5MkPd zCarrf1a|u;R;&Je3$yM5t7i#v^CzUzXik`AXh4^^Zw8zT6JG7SNVy7ds;U#?EsC^M z`Q~jtaf$Q8N&Kx9*waNwr5Vge9>YJJy!nZ4U*e4Z;E#v9aSE?@J0#kEuxZa(>&dK| z&piLDTs4t3AJ05~g&9&61n>vAB=f5&pZ}VIhX4iEo6vY#IjAMtEKL^+c+`#WdHDQ59HBeMXk$}Cn(Z8XQhtTxHGkxv|FcLs=2 z--Dmj&Ts{8(Ji3{YiT@~%v0b%~^d8-tJwk4DqpQ%#e{;h=YGOi1=tP|1)Cr z&G5qw(=LO3{})X6?LZA|pmRu)+vqe?IFka*?0hW$e$4D@R#F%UALr3hWNJKo)XShy zPT=85;WX4&NjXlqFI;UfmR~BFV0N+AFQKs|V7-lEl`Z95nv6VY5vT#*s1UYcEzW>3 z?BG*KfDqUWgSgWTPP#-Q6&1+8nZX%2kF&J_wpm5m)rmHaL_U6lY<-KhIgNV_VfUV3 z{WOCwrfYat@GY!^u{@78{}g%gBc6q$_!i0v6UmHR&Hq3hrWErP^#1IrMujE4)@P0{ zA3pG6@F(ixEvb)IvD{zR?M=Bcc=mN^*os$?M>aBzwIXj) zCO(lm?Av_wzl^Yh{8M)HucLVG9w8atV3T)aoOOQOGjbHxW~PgPY#q(_x{xueiS{1m z^)ht_ISuNfbLU4c>$;Slb!-`PqgyMBnYlyAqHy->B36JEUP&7mZDqg|u0uLr1<$Xc z=Pp1S`P2Uirto5{;Nn;{ecAoGj_gFb>Kbi3WK;&&WO4uy8}9;2^+(Z1@OZz z!>()2V-URDWO!<`gKV|}=$!H35+8DIEJE{~h;Fxmwet!*dT!>bI{H^x{0AmKOz-dk-yorq8O5YDtyJuux9?jqMiVI zG7QAm4W#gU_Hk!2=4A_w@yMMwx{Zm*um7Q)@1;V?7tt&gkgDM0X(rVNTN43V@B|p` z2H>0y!RIK;%DT;Yx(r{_4~&G3HKwyn1B|0?4-aQd_h2_fqhkz)uQ!F+ZNbT*F#q>> zd_{{W$1A-UorYvlveFSW_c^Tf&hYV_ ztj(dU%)ilWAEK4y1ijYvkqncuBi1n|Gx)nAjKw`jzx-$r`_YugllN86;qwqLO-Hn) zm$2OHa6@2vK2gumd^(pnxUslafmQnkwwnyz=sqiRADY27^o_Hi#XcFFU;({Y zCdb)R&Dfnc*yqDwR8+PB+hDY2;p0$xS#CNe4Jk>%Fegnwt zQ_82u--wxjSubiJ(<^Qz!`lF)Zyq_Q?HpksJoH0gP{@9??BoOm6OE^%lf zPp}+yc2*O7mKL(HdCC4!fd7p~H+%%9FAlj`n3G3E<{aje1F;HAVQ1<&LMT1ukASz= zoqkd6{!g`{$$!!6?~U0Lg0kxIVFroqyo*90clZ6Zl`}0Z< zq;h98c%92Qm`|-^2A*<14SDCH4>$S$HXb|B6_UxX)d+OTVzkkNtdrwd3wj=G3EXcR z7^x$%=i9(#cA#af<)od#db-Yh)W9F|8}l(e_7E=a}xS^63B&ll5GrcCwy=%vll}wDOaDWqy?eSr410^y6 zzxxKH-56q9E75XCvAUDdy2heuOa}#Y2fbk<_nrvX={6Y1!(jAWY9VxkQTRspU;{g} za?B)LP}X~GMzJDm_$iiZDtMuW=n8MKymGYXWVrjsmkb_zgXcR>1J5AO9ZxrJF7W)1 zm3!)a?XCZ7zzCwhme>;p#!k~^^9xIo^@eRVHEs8Yq=vi?*&dQRq?^5mt)|su{>$_O zRb0K)**3y*n1~#z?%#@BT|^z|zm+~p1EmRQ<;U1&PAWlm#Rqqo95D|JjX66+<9BfV zQ^+|p8V&ail^=6U`6L_Oz0;ronh>Ad2df}}c2yaKOB*zbpW&=N;MAG}Cx0;#?=14} zBA%I_@P57L4C|p)z)w{feSHbKt(nuV1s;T!cxak|?VN$lPym}-KtD|~ROTFAi4JoC z-RJ`|Qixb-U;K^3sU>GMZpA(zBLO+TVgd({RXYE*6{qY-Rt16DEj{rOg9^@`G0DX-WSBYyQFN?W2j zUzCwBB#*&YnXx-- zOU_7VJNE$i1F8PW#wn)Tw%p-GqL;@t&m$+iPI#D5C?PG+q}<7I9b(T!Cq#9OXb|?; zu37$-n;ZB0n<`~JN1VwyZ?mUoU&!vBQ_dkfuR4EpWw=JW3wYwalYITu!~W4id#R!M zxivOqSLoKT^sr-LF=2H=yN1lQr`Ue6mA1L8d#!b?OD$W?Lrt&G}|XzmTjr+ zv~`^2rs=En%J>OH<#eqXG2dO(m3<2GznRzVIqaF_835Mik!P^ChOd&+LhVPiza84a z?`TI=SWl;k#IGbLW)f_nvhsfP@Kkw&94>c|#==0m!P&A8ZKV_byJ5t@d!QAZ#8O%9 zH~2>d`3pygjHFQGq!#$Idhp;rvd<@|gJJZo1zA!brovZhOVq)OW@n7_EE4|%F>z08 z3|eF?(T%f)W&+$K{2Qa-gGlTVVFMXPmcnk@Pb@>{K!>YEu&oV5 zVZVZ@jUw0DAdt})$P^w*taXNe8a(Q6*`r0-qk5#c1akZ%{@nh=PfL+wYNW9yXvqfn zjj>NS^CzJTJm3T?hh0z>|5yM|Luq^=abzs|%~&3d#wP}_fd&(uoq@h-12tNb9Aksn z|8X!IzTmZO8JLeJ`v5lbQ>_B0V~)R6FdM+%{)Ya$3d4jxBnd7;#f(x;v+JNxb~P=@_w6U?7I!J)4ZiPyt`~YR;no8u>9s z{|Rx+lIU>Vunns4>MeW_6OnN98FK+N%orqC4|M*naBC*1gQ%X?%e&MgdG@*&yVtw_ zb!WH}JjFdFJa*3~_YL<+>P(jPob}B0E`^#Ww(xRib9>T zK%7uoi~=>5YCZ(+zMi!f)npT``K%`EcFQ5EmOnE7&%e{NHS5gh8E=<7+jPI#E$=n+ zwI8lOz4hgO@nZH^!(C~hJOPylX zwwFsRRyJSTnD_Qvl1ClnYMD7A^~Q&uue(3@JX&>s?%lk1C)_*maM81uuk(INO5foU z{eMb5Yzg7XQO?+&x%#L_$^*1u~H2x)(FkiF|56KBD8~H5iCAGh5N6(A2hCj2H zv6PdF8!D(%J%yZ=viE0fNi%(YpIR~1{ke8(T56%MC)3Vm9WmaG+hDla70Rmhh#UF z5JrQM-G}YsAirfSD5r(SdSGfB5C{ET>PviUt!NNi8h;U1kjV#31340lD%svso^|ep zuA@$y^MGTmBi%8Fs;>9lgS^F+IL!i6_?dCBlwcZQ{?*a}L}72+YTIA7g|_Cl=hm{; z_LkD-YjR%jpd}0@7=oGJhMqK#sJooUot0c}m(y+Y7W9=+63KY?QG4uv5Ks*@jPu23 z)Wvq27MV|($Cz)JF2csGB7Vk0d5!%z5sl<8B;gxsJ7rK^yojRsLX-iDQGKVTX}QR# z(;HN0HS+PbA!@gW=~KnIe|2VJ)%{<1~>4cZQMuX5Gr@^+zCgF|>Mc7>n16^qp@~vB%@+hY)*CO_wEMXx4v5NUFZ8>lFhQSI9pCN*RypC z`4oCJ?0Q&6Xxoqw+eq^fsjAUz_!&JdNj*Y@{uWyLx6}zg>pM+_%ikZd?UV-0`hOB-%K&4PV!Xpd#8~(!a{6f4|vHE!freara%_j{@>KKdgg8DO`-Cj z-_ytI@gDJQP}ZpXwaflTaNX8`G+zc*a5r9F-6MTZ_?N0$ap(cVja`ji&f5xxXZ~JV zva-W>(c2qVYi(Z-<-A(U|3_dWI>UJEgR}VJ`+@oX1O57yzb8J|;aF%lh%!2`QA_)a zQkic8mEHGI`}Vxg=c}#^$7ius*`%!Jaaegz{_Cx3F*wt0i8OzM1^N^_FqZ5SO|h`| zV|Dii4OR?0=Mp)p6F>uX!Lx7z_EdkW?^FVHa$9!DY4TloaxG*Zb!>;jT>pUHEQsxx z;f4kmtg`l0yzcKK%;6p5tEYUcPSO7MUkvOr^Z{?#55C_Zu>kdN%bJFmcU$gR58CS6 zJK8l{Wm_KW1#<^ewzOZ|Wqd@$;ut#16|CveARzW|mZkdI`V_ClH^NtjN)hd}vHn@) zILIL@Lv!p%y(V=JEbW1KIdWq)#DZeDMm~ZIc-~*(qwGQk#0BIBNCiE6Us<6n2QAi? zEW8&%0{4Sgz5@HeKvtjAFzAPXBsxUK<#Ql+tVD|rfnBhRm5ni=Pv`l2Q)&B_G6Pia zBc&@g(^_~*SMV<`#hMSp3Y>`Fq7kR&dEQaxYA7bWi${5{XG$otj{#@1>B*St*2ms21AepBFOr>E;5HF`Mh;g65A zpS?@U_^|uS-t5IFeAngMwwUn!Q72-%=iU^*E^p=h{S!YYo=e=Ge^uTMd5*>wk4y+j zHr*ETYJ&Hmvs%vDtoxb&Wd4vfH9Oi7>T2hC=$oUpH6((B?r8bl);HvC=-sd(;akIJ zh35(H7}g;4p#8A5kXaQw8mg*q-7|B>XQ*G=eBSg)N$&A!eadgCPrkOxIG1H{#Jl3C z0~MnV@Fxm2rS0Zg_TypiA_v6ej=LN;AWn?E6!ju}Sx7PKJNdP-lcB1ArdmO<_(ZSI z{n~ZXIo~lVXK}Wg^&zWW_P04Nkmr@WyOm=8{)Udm8{$2<|38so_7OFr-il*DI9ZAA zip*O8)cQVlt&NCuAN=NtM1&WCb6yYg^d(iVPJ>u@f>+G~@@fLiv|)w@fdXVhIj+p~ z_3^gxbal^kr8(z0hf_aGcAa!>ai51jFk11c%lx$rNy2ndln0p>nt!6!awBUo>v>C@ zrLnn_sk=N}`jwc_ef&(})W-S>N^z7@$Ct}n*|Wmk!#&TP-xH1R;f&H4&QESbLp0?l zM3ZKM%-e$>_NaIXE5$A9oJF5_9K`TxwBTC8K*K7$a~;Ub@Hf7<9pFj)RM?(~AK4AI zaS9Qc{6v)>VeR~eHtmLa7!U8sBitqGKNN)23p{FZ)Q8B2RTD{mg#_9)RIRJVW9!C) zjq3us{0^MQnfUXDU_P6kyXhpGF)n(gt;0iRM*NmIV4pi#(8w?UXpZH{AN zA!$4~qXBY$Q>3|qWxVx>Ey=zwqzGEuz>v!JdDdUeEo4D_2?waX7OCc@+Sn`aIIrEi z-_ywR#l6k_hx>%P5;fF|QZK!-=JKC4j5Z2VA9jK=F(fY{bKkVif7T3+V_ zIKW?Th#Jho9w|v4z>FX{NCVG?(VpZ zlF1cbWjwUq&U@|m%fm09ylT4j^8S)%>)(v~bT4g9&U=rlH4;OuJHrd->X{fQKE6Ui zji&WlH+s-`bEE6^cGNgfVOjCCd_Tr?vzHLxD-)f!GyY0_^Rd_4Qm?u{tM)kk!Snn1 zAG~;&`|0wRwcpK2`97nt>%M9b&sv^`j*6NPC&iod{hHXm;E+PQ3Koc&GKtIWu(jI2pHtDH4Gc@*-Z7>0_IWs5o1a@LXn z0&hmN!lvNkj)z#u9h^awmeUN=-K`xT{+WS z%6PQ~)qlpqxNQRx;<~g%_LARaCal#gFk_&&gA4g#TjaYP5Y8q%}HVy=|o%FE%7~UEq<+Y~e<~o+kmMPX1wo)PW!nQ^fi0&4f6SpH*iChz7S4Le8YinB} zD~9`OAMYX82gj+L5;-5UpJZRpKAXKi`%w1V?EX289Gjhk-P^nc)u;ZYLM`c#>7(VA zt!K!l&{<)L;a$Qjvr_hjb_|(kn`$Xz`d92F6bcmAW-HBoBdNlA0!!^NGNhh&iuabc z9{FQ-D`(Vj|AIhq;gqoic|h`+#+ycAH8cei&{C|!?(a%HfNRt_?SRMmIw-tveaE~V zsf5+QyWU$Fe*HV;wfa=M=Rb!ow2-_2--_ixRIZi{rm`kKHLjLQJ;YSuJHu&zP0g)% zVKRjIVtqf7X=t8O4^GD)phzG4SC9u`9^BiZQZZACc^djt4f{1)6>D2llyRe4$`zY& z{nL{-JDwkT)aL%GyL<0`e}BlMrO!qtoqJ#T^RDz5$2f1Q|97dkZDz!ixZ3$f7p_vW zdb#429#oO5oviAt{Gh_zG7XB?EqE~gN%Yf@4{}0aujg=fue8f4;>XhOYP~7`IytHB z>y~fMyj}SI#K#&b310@MSIHjls;tyBjFRWrT7?gfJ`rcn(=vW`{IfhGbN><7FQ!zK zDZ&=kB4m%Pl=TqaiiOf6W1P@6a6#*)wpKPFX;R-d zQ!FUjjOWPm@Q+qb-R*1SHFzXY1>*w)$dx{k&T|C)}4^=bR55Hpilz$vMs(tMiO2()(V?6Bup$N4{?vY#$YR zBkZ^E9pN3}ay#hV_>fflK)c5_%J#4ImSu+dj(lDGS;+ABRzG?-x{o5xJ#Td*3dq%jf{g+sm?SJPR0T% zEnV@A@zsU*@WQ*z`!hUFpXZwAkmrgg(TfM%m!kC341vvt(jfnSkrL&8WcM(_eiF!T zR0#jyE$R$^1VQX3XZJ#?X>~(GYm7G4Ro&{lv)tcX7$g=n_eyL($}+JOQgL^ zOHYrmB=L! zF6WaQ%VSs?fD#A%}MCgM0R zHHnzbUSc(CKp_qRS@?k*Bo-pgJ|e3*pq>hWJefn}#)rqT6}i)U5VJ`%zT>>93tHfR z#Q0|5r#?;GrZ$oDlK8XN;5!{b>~k;?$Huhw3K>7Muo+)shy6vypHakkD}nlZ2{Y(t z@Fpg(P+LH7bcD-R6^wOvuq}dN18m1p#?4}?RMFJcT*9)z($dn|yh4r=Qv!9=)}F48 z&6xw!o}@;7E}Rnhv?yiU=eRFNzYa+EXUxg^n%&-U#95!UlIbg~Z3#5tEJ`x3w$%t- z5WXvNK=j?1Td{-UX2z9^`z|&RT`ejqVpC{{eW2yF{Hr*cS{beV#kE@Mk4Tg=-dmp2 z?)9$8&hd_2Ic0LaQx|P#K-%NVw~)T;E5QP>Taz(RZ`3QxJg?}Tl190tKK{A5L_VV_K9mpkf9 zYI(*JZO3-o}_hoo8z(TI(p3HB2=JP4v_IcS+4M7B$@AM&xsnt+`69c;i&P~jQi zrQTtG9bu&};&XcBB!<5V1X1KuL6E1zx9LCz z>V=?nmV^4902ZzTSznv*{0*b8aG2p}*C2=g1uM@47S)QZO`|pcwc{|O_9rb}OK)}b%>-=pQT&_*mPN0a zx{hnl;`LEnZ8+n;jPZGf7d(tvN#toKg7}7B=+zld(VFMnKfrzBIQbJ;dvU}dBS75P z!R85|Ub47%GRV#kU;)#?#0b0}$qJ36T{60ahY@ztYl&~=C;nCg$zC6uxIz%87t5!t zNP2yB$MJqVj~L>GI#WXbr(<9e_+&lsJH0tohJrWiMfA2I%)dmwW8-t-?26)Cw<)OG zF1-6KS>wxcHH9`kW{mI9hxfF?$X)UT?+{Dt_1f?j?xeS=A&AHBT)#I+zcw&O3eu)5 z`tyvv`JNrB^F>0qPbA-ygRxA~)q%;5B6?f}q-7^iK!a%AK;o>Ov8Af~94ku@PLw%Kh?#tgXwto!EUHL1#AN zN|hPGGF+i3y^W-W4p#az*6D2?&uLcIIsC$Rl35=ajG&SAQ;>UB=NlEdZw%v!LzZUinbdVk9ES(#aT!#j78#V?q- zbVks{{&q79D*cgzb8ceZCH9PmvHi;DKhsVRvtVX5h4Y?`zNoBO)ahV9ve_MOo(iw| z=!rtk8Ie}&@;CvkSU#k2Zdx15IL7hF%WM~>hb5TR0*r4wpNk2uRQ(F6jL1ty`YCHO ziNDjivxRFF;5x;5#xveRa7XJH{?D{fKO-{v`ClcNB&5L`TAan2kZ7%yu@BIuuZ;5t zK9fxw<>2cQvzE+A`~zz97<>6P_syW~R$3a(Q{Mv`Ez0C-x|I9MU+KZ$`nY`J4mxK^ z9|&Q;538dNq@`v2y|8CYo9PKU0Q|G|MFecIbou60o@|TVEpUo`1K-%4cgMF#gf3aDDdmiXj?z3gy!U!3&gS_ZQ_8QNb0FMjMl8 z?;Gys3a@*nSMnlpVzp8Avhj6^gWGtoV=n-seDMgGPG5fnq^pB zdAWi<_kQ+OfX_%gLg;NgE!Edt0Uo*}4dqjGnY(JNe|^Q6nRg7M;3I;+B58-7waUvL za0Ppz@_C6KgmYh=-Bf@vC`t=r`CJaW`*HB}x=YVK@r?*tQyG+Pby}8-(SOI;xCf-^ zGER0fupxinvaa;qr|&u|ce8R&JqK8U;5x}2995aMqPHwpa8AfW$9uULYbW#ZlKb7~ ze0#}m&?TYFxEcAp%HM!97y*4hns`lL&-z}_-_d1@{;JF!b;g`7v2{tHzbgjYkcTlX zNGtT&59Qm&;ArZ5N9N(<-YKkyS4hJr?5ww3nLIx9wk$JHg74*~z2^VFqVzLN@14HN z^f^=+PknXhf9s2o;GV;)_!rUW~IgH>Q2Hsb> zn!a`o!TAQD!dzvuU-c8}6+i!Phv*}1=5G2}_=Ek`=Uxr25t(c0vu&e|GX2&6DZwl0 zl^gWC>%2&v85tV9tIBxm`$=!9BRGEgS`&ib)B9lxj<68?t&c@SaEA4D=3ocCV<$al z*7V(!8Jszdxzbyu&~{yp`WYF4)|eSN3qSRTzB}@06i~gSe>9F9v^gXSw3|+duV72M8 zCYzCt;I74JMM36S-$Pzxr>^JgD@cjKA8GVIlotQQ*? z-Z#k0i^zb}oLl$#tgi7D2==fH_sGxsvvL)^@<1j}4`Uq4)eCVRl;sR5LGNQ|v3@G( zt3V%qeg0%-N}tjH<}tw9G6r9<@mpU}4x~*wSM#IW<>G$D*~j`?_aeRCasnl>a`cL1 z3Fs>gL5Md+ODICWbPY$Jm1x>l9=)MHyIbFnR#{;}*_mbPZ2sTs=Iz^i1WhdarbyML&o2G4TdR z#lw4AaNhLO?!UF7OT7OcfuIc3_m@7ex;)T#-hVT%%VWK6MzNsW)OS=QpYzZX{iJi# z2P^N#F+MiN)+PTmO{L*YeGhPrSDjMd^B3^L?Wd!CU1f}@DuC6 z$9MGIuAdVE{nvMp%KFnsGl44=VH^tv=Tl#I`ak_zdgTdy|Ld|sU!4)mQUUH-n9t_n zf4Z*ypZxky=Ka@iea(x(nf`BdLW9z}a8Ro0n!2u~>-$wd!}Zb7M@3&-`hL*&j=n?m zQP&ZJ`u%k&q3iR>^yePy^g2&{mHeNs5kfn3ZPUa(^;y%$&&j@uW3AUhA8n2Hs_W$i z=&fG+;dSt&xQF!A^~pD^xz|Vo-BQr4Wqtqa`%#yddV6$fqE}(l^(s3*?YydMFnasU z!L?W&9kDU~gX-KbFY~Cc4t*X|S?5k#ukQ+7cI)d=UtPL1jtt6EeH^m++;bjxXwMT? zeg^l~XC*hYq3dTl)7HU!>Yurey?2u}tFy&*?N!%+^z&VpqDHQ(>v@GZ6HBl^%J3-6 z`mi&HEU2m}mwE$fc&~<_TR(l4cokA;goln1? zE?f0)|KGaT&vSim*lCBZ!}{oZ7N5=Jw=OyK=U3YBky(64kJEzJ2&JF;8rP+|zWY;n z{}Z3`up7f@g?|3&t=B6JK4jJ(G4ILrK$imgUe$NGzBWDd$rZd~I`8Y&)kE}}E9iwc zIiqz=TCba;O97D<{x|xu+&K>qT{|{&9lb{;t{98lD;=~4Y6R_p{Io ztd*xo8r=fddDf*_V{NfHnsF+~;LuNE&92AJy+R+0VU7Fm-hTjrzf3iP%om zO8GYgwhMoWp?J)yiA4e_p4hAjDIMRuc-HdqFOQ!-Z}|RG`d&4|Rx5X)Q0r2^l|5Bv zM2T$$N9QRTdC2-i6M39$7?GR?1M#I66u#2Jg+%<FS#g}mF5X%?TV{w#>7v>-*kGO@_6*)`p-(e-u~%pmQy`z?h&Nzra)f^f%^Nb#cEb{9ZZ1y{cMC?tO!7swBY%1^CEb_iD*~>ir0P{u zv}}Jm@$Rws_b%Wmnr!G2(C|H1Qf$6F-npJ8p3a^Y zWMI75QOYInmE*{e|AVQGsR$9ScXARnGNMhTOodHf&x_JIp2H78~!!V z4|7H@%;nBqJNNY1hLH|?NmEaQ=Bwpulx@kF{&iJqiO&^MR($IHY5u496!YgcsV~2* zPn(@FA!}GpS7%vws%M7pi;{p>@Hd#|y~+E$hm0#9y+3%~y5>6jIL72$&+e98KD#zC zl%hFNj?PY}>#L`dazN{8h!L;L9V~}z*Fv_3m5=x>a(+~==nv5)V)DeCjy6PRL{5&l z7Ir7(kZqEsxv8jB*!V3t(~eqowUcs`3>^)9gMCT9smc#zH||d!>A8kQ!W83RG9Xl! zE14RZds?PjXW0hYGwrbNG!z0{6oF+-8jplsT?zYPI)%Iof zg7y)%U#ycYKba?(7Em?dvshg0Yg|i}Iy@CR!%#J=vXaMF*4x)}$X(L?z_rVD#Fg%9 z2QImT=Q+6fuijB$$L1)-)ko9-XoG)q9SG^h_zzyfNE+fFqV=Wq{mEjL?)lkM(39bQ z=zio*a{JxIJwu4m;9-E0Fo@l_|zt$K29f*PO@v)HH@T+#u@e z#7KRJq!l!7!mk_y@2dd6R}wX70MahWn1>ulZNad`FJ9xb_?l?PRqF%#p@w8?|2$OOpt0KACvn3OvRy$$GVkD2m0uo2=sb zz@uG*O}7GceJ8bynuWK1veH~Bq=XScjv~K)Bjrcs59K0=&DKO2bCC_l>i?A-IJxnC z8v}pA(3_}TB+k~H_+bSiY{$H3Km^nyXHzZZqq0MtMz)2ni; zcnb95PI~$_$R1mVKm96l)rS?9h*tRx{Ob8&;XWB+h`H1!W>Z8Ehz@NA-PRRPRAbKa z?y&2AhKD-@`BahfMz6rN6yNH2{ErLS#djF5+Ay%+lgawF(9(F@*ihU6vpG|IAubWi zg7QlscS0iBIX3gSN(|y>;SIU}{soV^f}HIwVd*@VWVxhVoVwxHrNOXJdx0hW#`qkj zS*M`?dK8tbj|!LIIvxqK9h(t%vcVnn@gO}Bxt=pYLS4YWyo$)y8a&N+;ZH}x@+iqC zMd1~%jG;GiFh8H5)g26aKy{DvPq5|s!kO!fzjz|OT8p)M6ko{=&cF}o24>EuGJLZw zsKb89?f!V)ng`FG$9Q7v1#ZKQN!O-oF`%o)g9T~^`hALei1*Cri+1SPj2$rVb?Qg&m$iL$Ol8~=cxwk*un zzqraA|2qFYcn-s{rz?_m;Ip9uKL71Rh?0q+IjNR$n;6Sx0v-LG+dnnq}D0b^xvT;>{gWj5)*j3m;S&ZfaRzNtpyXS%lDM)-p zz_;FrsKi~^?-O|62alsTpEVHe*#$oATh8%NwCb1GHwV~BGubh{@T7NPUroc8|BlnI zFRbo2AgvpaC;oM-W! zj_|P`!NjXT){x&hMMUrzE0E`vK|!Ywv;3kJh81QZZqfth>v(Eo^$}JY>IS~iF8VIH z2RUA5woFUXe-qLm z^i9ZBdwpA9%Lp(HDaLieX>^P+Xb$;|i^cx(&*n4Mu#lc%vm^RPWknlfH^iQZ?HIct zrcbmQ`D4V{Fnj1w`$OyZmMm&74GAL1dI(F%I5V7VtFMp}kHFB?W{$s*tMokcxd0ZN z04wn}?8$Sm)01FJ_fZ99lef9Y?9Oo7ox>clj>3*fjuy^tu7BOVz4?_l>TJIjC<~8o zI(d2e8lO-PDj!(H6e=AZP)_?C-eKNy-nQPG-hIAQWs+7WP?V}T52V4SgXW!}A8i>g>F zl-){}(gDs&A97{2V_&Xf4~LKqDN@^}4n&qOQNNHQ;#>I8UzIRl5qI63!RdEXF1=gx z^6=wP_e$O>c765LomabD-*juh{b^4Rygv1*Nv6{?QfOk$AF(NRQl6CwHxnAfC+0dD zH8J$Dxs9=RxD_1f{o(b{GA`c>*Tn|p`Oik_3FVq(c6txB{g9VpYKY>hG}OB#z+ zDfmyq<5)*{ds{m>pYTFkuXOfhc$J7e?P{7_;JF9p`C{+WE#NOt1_Pb%HB40*V ziro}jKQHOZEq){4|yx#rPI@|3_P)3reFj4&t zCSDI%q>ahnmkQ#+O`Nv{Ssrs~2O*LWP1HwK-_7aqvAyfUpl!XJax?)RHtE(a;HOgGxlYEfs3ks=Z*&*Cx;H zYBf{s4Li9v@#+4YxlM?Den4W@0GHfYsD|W>C-0D+k$Eif^%(fBH_?(hlh<)NnH`&g zYd#4F%S=syn&i!BLw&_M@bt=q${WRugi=3k44HCXfgQd~rqtp@inj<&K}u(kneiy~0v~h6J|?q7Wo+O)L}mJdt+-|g z7)l|bmw?JBM&^jOaF8ccPjDmIN(zbRz?R%0-)Je?Ux06Kg4x^#Ouz+D0e6i@jPux& zg^gdpz5WCa`w6;)o$Mv$1GkXM?WnEt9l4;+5ykxm88{m)tpz8`8nRy;rB^RGJ*%J} z-B9-NxS(V!4b(r$b9@%Yau#^U*VJ98iO(zt&7(EAfy3k>(Q`dK#tiozE{4+ zU?fXXnXrJiR11fj>?9l7qd+}$ADx-n9em3Kati8^_>Ew(`WOXRG-svD@^$##J1xDf z@2%Br4Q+*O=V0W{vRpQ&f)?s3AA+xwOm5HjVo7Pa6eVww3z*iLKAQ5PDZ5SEOw~AD zOmZh_J2gDNH~vdcKarE}f5c1c6BldD$=aEis2(%?AE%cd9c_gE7eZ#A6U;$JazVJr zL~@L*xSP;1cEFpw01CqEFGei8D z4<+ApaUM0%rS_Bedo|4N2f|o%(Vt*?p5S}A#IeSMXk%t7%B&z0%63*~Sy=R{>Q_ar zC^^@5p)oBcTjC;o2<6bUs-RK43`U^SskVFwJ-`fSDHV(JOV8u9 z`}6PSzPs~YsYm~N9`bf;%7M(oo?3?crUD_K!@ZFWqAo}L8JgQVNsQGNyJ}?KPFFhH$T4kEM{JHUof<`osXWD*I9UP$#2VEEaxs;qV)P=CkiNeZbhB47ngqtXudD* zp|0t!%AS@Axe}!vw#^as;_4(sB(5wtwb0#yeSC|cb-?jDdt+8o=I+c#nVqxb z>_^#u=d5zfa87eAb076&c}u`S>8n)&$@BkMItw_d%CC>#oSB^sc9)RuPU-HJZs|r^ z{-AV9i?oD-NT)Q2Al)h5-7MQRdE@;)%jD;PVfFx%>|5ku5) zFK{sMD$s=)qjAQ2GaieXE~UtZ5=z%|C&wJ;M%UVqZtj!r^X|^{L3VX{9K-cgIzE@l zFY(zoa?W>y#~;P4xb}Kc#|Ot$XS}nBtBC8av!b)23n2(l~Oh8dMT;CFfrNVsPMGn~At)Gqcfm6P4@AmYgX>HTyrG1-z&2zwK z1;&{vc71HZ5q+z}$-L3>juQG4^*be1ns0w&)um(L1)TB=gExY0nCTfxr`dcdN$#fZ z)1K+)9Q~cYF^w;syh618Se>ubmNPN^r>3z(_oqI2x8_S>{@M@qPf#bf?XvMZ)YoAv=-e?N6dmSQpsRjZlJ5j z;F;f&o}!Oe;K9d$*T@88STAsNxxqs9K>H_IEkU$AB!69!>{oa6_~HzbJ2iTM{M7d5p>YH*2&_9b|zy1+UnZH2a)n-c3H0yxr zG*{5|zQ728hyT_36HN1Fd4duO=4+%{PrV7h=M;G_ebdG48FYQjrdPfQ^A{#Efp>yc zmYm#i>3h~_rgDz%_urLj%3fHY24Kr7+NX$mTEgTo24t5T-SO6LOU|GmQxN_pj)^0_ zKT7XiQTaR(S27ru#yqo!GS47!ZJGakh6wEe8h9`fz$Lo`G0=bX-#mids3y_P zV&q^p75j!D21^q6)PhqkfmrY)xquMkQLv&>#9U(ylA0?~+F&v$^&Bhp2HFowFR7u` z+lUW1nUz=~5G^<Rdoc^u-V9DkXNmi!Qwi3_y z58w3<*uf|`ZT7(6^gAnXUhb`YP+F_An6Q^w?XC=$n@KszR~ExQuK>w+%6w#n(?wYm z-=?&hP2Gh5)ImPU$;iu2*Qe88V9!cP+lgiyp*ae`>)W!7VFO37qItpgf zs0=RZS)!Lry2wP)T)~g=f)%pzk+)5C&Tj0WNf#j9v^eiI#^a-TlY4QL~ zu(wrVM9RbZ&Lvk;i&(ca*{tI9=Z3>;-Oa2IpY=R=4Zmk?j@Uzy?s?2I4h4C6O&%)0 z#@esrq>P23`VzT@la!3w!Y@<@AF&dgS+P=a@&olbS?OT%`f>(#gC+|lhW-=2i8-*S z-Lf*nDRdNMQ(L0?wb=2QWIx2DhYO(Xmg6yR=6jz|4T&bFTZW2aQEHt6LGY#GXd~ZW zD%9e96=&VM;sY)s=e7@CyT7>JRFG2D*%N^~5m*(4Ki300H4lXGMR38dIkOMQFl>RV zqCa;bYQLgdZBcm<7_?HH;1T3EPDwAx|3oo$%SrzH6yMQ_DolWT`!55T7f%hMC?3#2 za*{hivwPswt4W5VF}gYtKerO=+SyJ)&ekKd27dZWWcwk$PCs7N@u8+rt5}A%`UDd6 z9~i|-RoL?`pb^$n$=L*Y_5#n9 zM($12WOLvFYG~$I@^NpeO(k(>0=H9?I~Vtzog9@wu82Cns6LCTS~$<`LK;1+lc<2b z&8SH!_`Aipqb976z`r%(&$;+rDpwWN+c-X-8Ou=X|JSeyt679vlEqrbur~r3rE=}U z$YU)&-IVj&1nI7V_RCH6OjNSJR0qSkZYkuhWd;(l7yoWg-Krv|Bs0${>f284yLiSr zc43`Hqm{;Cm-@3F&8W41jl_J#H@o>ZQ3VzCJ|X{N|HWPgkttDcZNPK%<5RuxRmyV* zpV7^`$m1_T@&pgtZqBKw%85#zz~sec?4LVhU9)p9nYa&ucllD!6g9xie5=BKJ|PFX zKcluL*oIG1;Y;Az1xIXdKCO|zdWodm%)kIB>`?_)qaD$P;59DBI|Rx{AaO*k&q7YG zvbPh#?zaWII-Bcd=JfmnCte5)V&};~hM=?R!lm*QUcDUTWY5v7-Jjg_dQSNSu3ePt ziAriXGG2oR-u63Zw2z05mG;OlH;1|Qb>I|q@Sse?Zn_=-(AlV*c^@qT3E7DP|xSw=G^a? zqiv8kT6v8Xfx3ZW!4#u88Ln<*9qQ6u_P6|uj^tQlkg=DFN+jI=rktj9Qj4ggV5_Rh zbmjVZWdAd#z`|Du7Mci<$}&FUM|uPn<27w0L+a!I-!K74wr>-^MZoNNp3~L>y;zUu zf6ST)+UKy1{(1WI<^YuZ!1=41-J(rrnCQ{_eOJyHF$>RlEv)@!unsjEw zT?Xr75ByDm(0`2n7HqEHp?g>1Tm6XU$p)(XU$Du)^0N>9mc$+8XJ7InT^?lNCa>#g zigcu)Dl#*O?;Ff+H$y8FLMC-~TA*MA>O)ApKw5~?Ezpkw86#@m0&!TF{T6mzoQyB% zCV~DCRqkB;O(9;{`8zw~b3*oGIL87hkWB5`!*iL-Q15r z3FPALKJlAFRAa=fjPtC5k5v#Tph7%}IC*c;H1D`efiMs_=set+Kz<~mli#v>;`y^= zT&)Uqi2VGWIIUN)6X&?zU3MgvrxPfOFSuWUGZSc%FaHQ^gh1Nn>`*hTkl_6)%3TR8Xfk*4j&}-M zDdbXg6^Q%I#lGkn*6v}3?!M2ie&lKbD=4hY7lemEm`3mrs0)z;iw4Z-oyRmLUbg4hqEa1D^LhGI@cOf56=cWU|1H2+XFy5(c@mXzsZj z+NV0Q_%-q-FgRh{rNE5{ixpSW$dCCSr&RvT)7m_DX`xHk0$ol z!j1`BT8Ph<;5okZFbM3GK>rGKs?cZRj=$in1m;h8)C$*d^T`N)#M!cVpSU043C3sa z_7_~EKuZZkkiZlR+-VedSqN$Q8hNRN*HMoD%f~8--URW!FFX91RZigB1#(khC&eij zy8){Oa`OdIE3i)jttLEuaX$hhFYu*eZNGRb0?{w}ImG!C2x2$SS&;8-j2F}wJJAQJ zZ^-Ut;}bFXdDoE-fr=KmUh&1Z?oIe(Lic!(x-Xb5@%KW%3lA(aYbX%SCD{Ri?i6zL30bC>m-`XjB4R>_ z@OiSZRszi~PLM$67v>YfpRdHfiy^U2eE*l!)lY#&I?jLZ{J)ltWF165fY4RKrUhAR zf$|krN7$zlTq!T>5W+o)n&)FI!vpT%BhM{%Eu2?2zF*iNff^H7NO4VZ=i<*|<qBBiMmXMbSt|+jJ0;wvjp}=SftbS2m#kr^KTv;Hf zEj}TTzyh--_CwgUFBpFz=|y;I@lF*jAh4Y&JXe5Ed_nQatVSZc`J8nSuZQe0SxHW& z=nKftb64a(8{tc|=GBt_)*e79oa_|%-d8feC+1%^>3`FK`?7?Zyui#uR ziN^j0%_nliCAk}$yLitjeZlKB`bRvS!0&#=la3=(TP=yGu(vL6dhJ3vU?557r2SrNQ0Zd zZ$!lNEfGOO_VFvODYT-2_RhsxROh#qSq~>zrL)-fCHR<&u#2a-z76woY5ul4{<_F2 zh&vK7k3gOasT92-QLJQEULtxCc3NmH(Wes6ZU%X3aZ<#md>QgDyeXkQ1o~WP51~^9 zmR{(V`|OpN)U}0t;Q_w?F01HAzeMv5U(UMF>IGRFfxrHmI}H4+G+hey{X#8&J-w`wmxCX=f6H3jkz8_H!aHS>TqV#v-Qn+IG3FB zURFEP>X6^ncUD~RLtrwzM?cvcn0362jNDB*yVT7J8dZ!E#^1&s^MtjYwTWc9?=kBJ zm7x8`V`Hwl!7}ak@^B@ST2$Sp?3V{iA@*gsC0iLam|oBvcIBdIfZI|JYK&LqLsZiu z<;BQhH~T2vzlY6nuv4Be>oZGc8!NDbXYDVYXD(!<^}U&&4&XA@4|b~bKjja#D(JG( z;3Lo5Z_Lid7^=JV46Fnf6Bco;p*v_4k@fIcSdb&vx+(o3a>db0c82NKPTlA-*_jJ9feI*iB7!P@;tExWqX zU)pC@0V`P{WkW*dxKE#Z#}1Fbk`$G`*`L*VAfMBAIIcU}!ff-})jgz$J7;KE*vYWe zu-RcFL+^y7Ig2|UYYkxfOVh($Yu!b|t7K{uSuk>P#IVqE&N7PMDB`P@wmbQsq`}E6 zQy+Ma1=d@k%3SS|eo~*K4N-2{WzCpC5C5OOxO=D^D>`h&PizAvn=)q&|1t3fUi8E389k zmXKF^MdhMZ!gvKc!);@%-Ah@o4be+!JER7|b7>tDI>cBXa?&UtonF(v5pqBJQ1%VD$h2q=?&jL3hp`BcUo_V9b z@2}KniF@O(#CJ>zORp5XEN^rk46PR~g%x&3t z`?w}Cjr~BT`{CO|wyIl<&FLExm&AHwa>t%a=#cg~Fhf?HJKgs}N4U2-3d!dJv(tJc zhQvv+t>d;Oc1c_4Z(*I2JE`ZDN>V9fvNu<1F!4b`?xbU>&HQieIgZG%pOKIX5z|Bb z%CTTl+LOd4@n_?!Cl~i_v_?9*hBu3zmgR8fh{y)+vT7zHA^m!C^`!5T3#Fe743)FF zZie58nx8o_x?E&T=u=06{J|W~Ba?EqD2zwGXD)g>vk={l* zY!|oQnJ=tsQe}0O-rbqcwZVB^f31|W8wEFcZ>3dERZ_o6yXW~f@U7KDd8N;Hx!g_N zO+#8ZS7|HcV=%Ay!Kv&BzBKd5+4W8#UBcH!ZjY{*S&god$sOv~7fF+X&Ab!Rs;4eb zEtkH{+cL1s_yC{wD`R)ynO9H0pK?4oXG&aZf@f`@nw3Xh3kqbORM)KJZ;{?FrFrty zlyV-oFY4E|BHt z=wBnQx|~Xb;L!9|$)gj)l44VqdTW?6?)>;rZ`ikCZ$gSVKFeQO!-L}jqk?%XL$2b8 z3uzR#E9|4Ylry_B%b4a(Or4$bYwAZ&TJVlM+W8{1QAC>vJM^w|mD13B;LGg!DZPUC zMIhduuHSGcMGT0#6jeO(d{|Len!+St|2&T~y-s?Z=bFE@`BsWmKfs&UUH@B&xB3U} zraw!LNW354D4|YLr_@x>$UtdqKnfFK6NA6{Cwrqkx6%)J_W4=_vsfdT4BiXvPtMUQ zV>}7W4RjB7HVa8z)V_{Wt}u7B`>t!1zvtr;sPYG)81yg-#0q=%jUi%_E zJ_D8P(jY_fol2dYWF#C+Jf3pHTgS?+4+_l{IXc=M{XC*$NPFc}AU^d(Lf*K(ajO!` zrVlp?Y1Kp5N6yZ?B=g0{O`%b`!#d^7n;MhUFL`L%DF1T%qV9D!h=|J6I6Oy4Q}vAT zr^lDPI?+rllKQ7_zJ1=2Exc>gPJYSy&PZ5U5%T*lHL#AHvzaWbXVAjsKQxiz)gQL zYG7Dy2c1&E2EJ5p)xchBmbR1OE+aB`%F-kHMtB|P6?>L%b;`?xOY!X!6dPf@GtB^-Gi+4LgnR_Q-8 zOYkpWx+jw-zo(ct+`lw9)G99bRR6@XmQ#mG2aNH)p=s5VdnbOAn4FY5t)cILaah`- z7Sf&iVl`4OWeo~e^Cx@fv0l4<3;l&*`*OiNb{>xCp}yk&^?`Lp&}u1nP|s@r)4S`7 zwc6@-*|67GOW-K!Xco7Y*xlt`>NomB$9d-qus%QO13+Ztv|mxzi?Q0s%eC6BUqb`o zZ*keXhc~Qo9X&E{#G~E5Q^9Qw${YP+{?~P|V^8pt4 zdmEGN)=Dp}nSMcgr<}9j1|NC9P194xCBI2&Uu#_8B3*KH3z(2lid$p zE%naQ+CW(P*rWsT#p0t9bEls5Wwp!c+1Ery_tfk6g$HR~+VSk0^idY|BJ}fmP(s@dy-elel^n;PSdSHOj#$KxYswX?^g^UQ9 z<+|&*sGW!5tu@|uH7Wx?P}A;dRX6tf>w3qe-%9%{J<@kFSV&r^6?1iW?{GUpPUwB) zlg2(@e0o}1YWgAHRb#qb*rB;Mh8+*D6Fwqzp(~F*OD+ZSI>>K328&qfAqEuOfr9wWOb#MU0(3ILX86n%cCZ~P7{-`~O9<|S)}R8*Ov_S9BuUm-=={3d&=F;P}J?c#Pxb-;L#=qPf>ly2f@{bEvw4O@ulpWRF=kA z70gpcYq*p0%1_iej*G6Z+@0L5LrOU-XcwgK%}s$jzFI!nZv;}z{_-pBsWUd@th=Ur znCn+PlhWVv1zP*Ic`Cpbx6@ZD7&LE6Ra8s!>bV^Y^if(?^_aY#48;}jY1gD3@)&r~ z{4m>8lUFbW{CcnfvN6ctJGyKkHA!K3(rDNSKr9s zQ2Tq76iJ+6-UI`r8YO9KV{ z4}AOmzXkhSf5;3)cD8XZgfD-gdy4C%en|?XLcx;}KKDn`#vl zpB-uKFj8QM>TlFyw!>38;D*7t6bIUNDn)!rJ19QfkvX?F`L^*Bn=GX&qQ~5)rLwb91Zwst=k}gMlzjo zhICqvQ*NrAz+t_lC*_npR4NIF^>0j+lE7Jr^hh0JRJ_IQ0btx-OL9% z^R}7IJ|~@44rn7B8=M7Px19$aueJ3`SqW^8(I8kF+}j58uANuuprxZDuR5;lL3O$O z%&KVw{QZ5~=~#;O9S)eraQh$(zQ56FQj@77K?y!5b32n;dIskkeXM!XawS^ZphatK zmGyQvBeTDo=Xly5X$9dP9&DCZ9y&I=weVlU3x)Yzv$bLN4}lh*-%|Ib>`oo*863!M z-&S8Z|8Z+!+d>bAEOKmB7F+iN$=>RoYv~(26G6V6Fu#%NDg)IGFns+h7m$`&ea-tu zCO9;IgTuVMIz>~!&X-bCq*7KJ^khNrdd~>&JpV3ZjMPE<*IAgZuLJHQt{?Srat(8& zf3An%E`715k6$u9(n@WJ(-BfOB+>alJ-gD+x*B-seV<+|{Qzv~Z~f1WczctwOMAfy zn4#C!<|}8UymSUsf)RL{+0trcH-P7B8Iw4dfC_0aeJNI z2oy{)c<|O~E8x;kp$b_He9Hfr*^OsT$dLrvDk=}q-++JDMD>8N$W zs2Xe?C>OXM$jnrX6|lU|0B2NyT528nv|YzafCu?xFc92t95k<4r|n)$cWTaD(9_my z<`#Woa_Ak?XLXj2$ZwU^%qVHCwo~5GCwdkP;ojg7X2ku^m}Q=}674vcI&V^a%`bO> zN0td*W|A=-9QYLGadbA{nS(*!#EZEwFzS`#J?VrH#lxM2h zB{Dgu;7mIKPOmOZX0zc%TMPSpKQ#7GwVmeC8tcXNmD&dNTP0Ci2`=juJZPP*A@(zA z4m!3YotU+laBxQJqMnco!7+M>oJyQg+&pGZw)!$1$qBZxEUd4Gz-j-XbO#@`hAycM zXsExzI_IKp?4#$bDaf-|b_LKsN5SFTA%9d?+C%5;H`bqKxOu`j0#ouHkY|6vcz*`` z=yP5ZlyhJvUw|X7WF0}Wer0+=Ke(z_p#RpBRIN-`)7P+pts$qok?z<1)?m!9` ziEt2(bHEAykEwROnVvd>_kB;6?mXGBljOUykmG8GO^yJ&y%5BXn590D%vuFz6IX`u z>>v4exe!^R{&r(4pIORS80;Oq9z0}JwBpc&tI+=!^*eeY{gnDvzG2@ms~Zi2d3i@= zv$Wk?o~yRir#U>1t&SafX>FMD7xEQqjRRA9$(#XBvH?tolfaU1k-r5QxdqffWnSGu zz1;`DkPj66BUZ{K&9I%Inmd5ZtO`bR2k7YzRMZ7S+!4?`*;1f?-zm?o@2=1h_a<}SN;^h@m5!hE3!>QjUIE$KCV^j^44+_2 zdkRyw4k)wKaAtQ$YD?8y^c+2q9&&Pf!@d_F_jVc|q6=8OLdr+wCuXVGu$+%p?<elgE%dY)x0`QS#OILB07vS1$$so&aiJqGO{nou;Q@)XOP%kOtcQ ztZC*0V-}3xxy%?d!SdTN(qgc8m$=eSb|#YL5h13ml7IK~s z&4YAkowU!(g|wNDxvrNX?cA3`8oFdhIkgVHVA0@G|5K*>ef0MZ7BG{n(b7~nZdZcC zE@-zg`v-r6gTJ-c?H%lG>09T|AKYm;Gdk`K^87QI=rJ9x)f?tsP?EQh#8mTzx!vr} zOwyyqD!NW|b0f3hCL-&DtAOf=PbuHy|BKJ=^g2+sn*xFYDM&wdXgUI zNYrQOk2D`1S(5CfUbB)u%4(pEZ*wv}Nn_yp%%K!kRI)D(;HCW<+-@;4^j$$bpEZ}5 zy_h6i*{sf#Kc?rIZswCsxO@6mKOmItMDjCzIzqN^_Wpi3a1 z*V3uj3nbMtxJ2E`FJQA5;CIAO%SwbFbO!j(`bg+iWb{3_>!nCpJb0z*U|_CMV~U5F zcpvjXF37E6xP3&|(Rwh(Y4Q%ZZD+tDTL!dwS2aeht@YMQY9~NpH&w>SXVKXy?0Yt9 z0auA_Ix>YaoGISd?Kjp(F!UG@fjQ2q z3AU`8ox{2v9OoOArX{_Io$zVQho}!LKVJR(9l6UN0&r!i(T)d>7=6B4Osa1T_Z3Zl zka8=zL`p(xvL`jL&0ejI4A~Rzj;fGZ&N43ZUr{L$n?h^3zSf`6mHNFrRH>)!bkq;o z6#7&6pApFsVxR1zwp|(H#71B0aoUz_(pvudgW;Kz{$Do`Ji+ry5YEDnZyx^T@B* zr&OsH_Bk`11`l|mF!dcXw#(uxRtI6HrF6LanH!W|{ zFR^z&{`mgNyN~ZrfBGDkoLtH)8z1e-is-az56-Y>FxnTDek)~K@;AwiQkti=@rDGe z*h|$t&K{waB63BhMed1QnrVCZu+Z?3kB*v5rP_sG&>nVf-SLE3Cy}lZu3fJCF0V@u z3AhfsD!5uYvpHsK7nC%qm7PwE_LRaCkh2y~I--BOJ2DX^tSo{b&O2(*n z)nvS+y6SScOVZF>55eobqDR}1_Q1#d0w1apJ(`N^ba> z?;~HG@k$-M3gI7Yq7Si#GFDjvpKdoLOj*qD(L~_I$)H$$VKP1h2l67&lvAi|T2yCG zf*%71YkzBPFeP&;yb%#bUN|TIHA*oJF_HkT&T zZ__lFSiSA;QU^5RVLbGu=*T?uU>vlkA?dB@rTZ1!=OW`|8Cleq@(eb;@ZSTCe%t^o4$v7%lCS9clLYH?*fE7@Gls)suhT!Y-LL)V6O4?XOD4%KUY*M4VnXR2eN zBZyb-*7hq+<&Ug`n~nu1-Mwe=QrjwvnBCb`zsTIegL-LwxHeL4tCS!+P{f{Vb*4|D zmpz*b!EDv9RdUGAZ=IE#n;bXvE9A5u!$CfYn(#WQ9yz=g>~90>DZPceO%FU7G96Pe z{(#L3mB8|oNU3QqGqMX$;gZ+NE zZIYi;dxZRKD|CtIsK^1s&19ulfsebP-R{#A-Gq@+%FO%3!8YB&iR7y`%&pEeQRB%$MAIUd*i8j!;Vl|X&oJJov&SGLSDL(oU0vic%J>_ z7cevBM$@bV579_=t538Ej{VL7u9>cAS50SjM-twxTm4Zf#<$|9ehLgWI4K-FVhnqA=8&b z?BO#lqmFTb4s)HJz+ai%FyC&B6g{N>wv@D-cg(fgGkyN5)ers;gWN=YEZ!uTxEHYN zKCJB@M26pBL3_cdG)F#32hu-q3^mjr0ANA`$Q{Yi{7H6UuQkdZC;clYD`DDAt-4+g z=9LI7AE<_0ay{%=C3HzHShUxG{ShdXAl(F!_ILDX=Qa-zb8a>w@s+D>H3WgkU4PZvqN@btzGad!j_y_u12O^9aRu%cNn#Xa}xyrSh{;)L1 z6#bprQ*jf~OvcMuMm~h;2{JPo&~G7nb-bx0V&2|bWvxElVi#c4s;YgJib)>>r$ z#?*rbOq_V29H;lsFVDvh3+Gja*mD{)4$C9&$Eb4kH7k+DJ;EfzTETCOE9L~dEPmH+ zwTNb@wbXEBA(OVYn_G-1Lo-Gi4TuG2*ej%;@bfy*r@9@_50*R2qCfYFv4zZc3o{Yy zP(6B0{-uZiHF%$rW*_4kQxWe3Cm7?+1C}OrhPQ07Izr3IM5k0e$P|v5+Fm8aZfhiY z^Q3;8Q26s#A2+`*_~DmN|HKtc$?AJyZc{$!m7LQZidI(I8O-Iakos*>dV-bkza)Q3 zV~^K=%xovm(ONqfg|rTxA67klba;XA5n-)D10mB~UooZSx|T!Rq0UhkGWE=20_Sn9 zF8X{koF=7Rf4iQz=DJomb2{>AALaG-PO~@}fc8NvSj{|R4V6C2If!K1YXh}bAeCZ> z*N>3hnWr{|A*n1~A)CRmEu^#Rraf2sLw>I`gVE!lW3uxzuUXFHj`d8v{fC;&JWwHN zOnrNTW?925!y8sMsj2)m`||{D|0l#(@9A;NO7JPG>b5>uY6T0Ee?lj6VcOjk$Kl$ZiO0qJYtiTV%#9_!k z2w1BW8N@+MZGK=5wF(o-{Vffn({vg!oKwxgJg#SSAs464P>}3ZCh~+G=)J4XUJCDd z9c*0f>4{v0-!hsmzAVfLSqr}2DXoDaX`PkRT1?I06>}Xddgas1^<+GCIH4SL+V&@R z_ca}lyU5#F^fgtcOS>x?Ydcu6F+{Wv%xYLP7ZKWWB87Ey;5D|x?CW$)_qA$R*@$Wr zxndZ+Ba1DM)rq{FL>$lr1nMyGWx{7H17F`heTHMbHIk)&ix^DXxPlKVqv30e*}4=x{f=>>z%d6YJYlDE6JgBa=w*6C}dpp@16Ht7en&6 z{|;Hr^z^k_DFxn2^Jn8R9rXj5Y`@-mV~5kNZ|?GDSxdi63nojSln@nqeuGa0_VTpbpmnatksnmMQ`Zeyy(8S6*UYhx6Vm(6^&_p9iYw3tNlw3v6p?v zTx)zL(*DYLOI@=H9@Y196}aY}a|esi;qQ=>zH&u8A{Tv8m+7f)O83noBr0INAv@cc zU2G2qa*6CFx6_tx*?VEcQSmzmABhc4P~^omX-rb&kJL`FZ>CgW3x4DeC-B$s0Q zieV3Cf#Vz_4VSMHKh<&EV-KIW);eRg2hx_{{q*cfxnnnc%<|#Jhix%!5^|>14J6nD zn78bK&1SHcAThtj|He})eMK7apl7f5dw+Ij-MR2So=P*7q1tT6A=hR1%&?>3^&{L7 zdBRtOZV#F0Y_B&{SIBkf@t5ewK1LS5lJZX74g%_!>-UfcA#ItV)!WfX%c10!R*-2P zKt5+Y8PT3nID8*tk-JCq<^9a;_q{T6W0*d-+0ohA$$5d?;9J#@i%Ki4nRo;3%_`O! zyOUg14U)fG>MZQa;+pL2>bR?EY5}>ay~`Y6EDe4gY##iF7_A-s_5o`dh+e^)ELfAv z(KE1`{f!wPqm^6Rqx5n6e>^d!GIs=n)p@4!OS)usf85=`biSRX*d*pFonf z(m7l}>P?NK2=V)9vSqcgyglFm-Az>_zcs=-$)~206{}26e;pcRDjgEn;aNLrRR?Q2 zf*L_7J~7q&4^MKH&y4owO81p-`EZOO;9A`eOw(?14s4V;gz;9qiCg)?aAyPWabL;20_kBjY9W z2bc^LW=sW$w5L!JsIfXC38HK?3EB)`}kTUDMZtX;uf`>i^#4OBMWu-&XPJCX~8 zlZRZ+8}gJhz!K}~SaQpyFqK?`*jA!1( zsXG!M#f^=99xEs8NbcM?`RGRiX z)7y2&IlY0tMEhHfMH6p?tFXLWmFi79I4&=67CJEp{f0TpTm$FUd3%TaM*Yf>*)=jG z!hJksrE8y~m-a#4Wq&qf;CyOoPGc7DL-{*(gVtIf%#`b|G%vOJ)$CRzOjVbtyS2wp zctmWo4V=Udw0tk~G3fK(42i15QEX`xwXG-EeUDOG36~c!tF8xgY8wVDf2%+aIM5E7 zd8vR^l=qPp>LXvKLfDqbvK>B9L!#w}M1SM)R1fg1KfqkFAxARxz#hcn zed!|1B;7y~O4tvrpQ&G!fv31W*`ga(b+QS$(Hs});`Px>eH2EYPH0Zi2U(dvji<8m zJHPABZ!VKdt3!P%yIlis@d6dq9&i^dr^~lIxzT}kJocy-9#l9Cm4nH^M8Zh2AOB3u zUWuf4gd?dBv{R^lYjc1dzwP#e-n(SIg!&nWNbxm)(8GHj9FJf>jSm# zD873%&v}@hiQDM+>Tr&ZVS;=&Vyu6(ZQ5J4xk6vAalk*`b20U0a*pIV$x*5E(&zd9 z1aUV*I?SByHnJiO1n1d1IEi_gRpCAA!z8{fRMP63!_5uk!>(KJ?XI$^oYdMl);LGF zj=>lB8pfcv`a{j5wj?KfMA;9T;TlY3o0TC%%}-(NnMHJRR?e?%P->F%>#yC@!u4qV zB79r@)J|kRy!HobhwJf#i(4h^Wgrb4+F|`Gr^7YGRf8#vgB-fPR&AyOy5WJ`fP?3I@C=#k-{84fV7(=7PbSBBjtt*=cBz*=22P?s@P=jte+(XjU%9r~ zj>^M#Nd5^p%WjcBpi3S-+10uLS5|#yy8TM7y|J|nOu>D!=6; z76yxb#rg9Ip(C=V+n@J{ZoN<9lz&kn{iqh%pW2SXhB9T=v zv^_*?SBG~-wz9*(wuon|LKpf8>|hLM@(w*RaWKrBldvR8L23f3_K$i=DJLgc?Tjh@ zr=Hzu^-`~-v`RgnmgJf5uWf9#mXK%2qg;doZoA#ZDhdii(_z3Mc)&T%8Sg0P=*+ar>uNPvkH#zYsFj?>7s|^13;~%?2|kiH z(kf;W{(v9SN!J`B9a9`79251iT21w-Je#~rf9pTKAsid+vD?U(ltNlJIC~B_PEcJv zqrZVC<{8zvvdB>r_CicYDFRj^Gy8u4J5bGz;^dWpGw+?!9r(V$URL~wqrE8PsqA2u)X z`UNKLrNZPl6j^whQ8COx?~{W5xy#P4BM;k~%v30{u@y8;dw9?)TTS2(KMD)tY`$*- zEW}OaU*yBo>_s)OB7WEcs?V{+bU%P${;fC z@Wy*pf0;mIH~^m$-%O`^GYt>07uiOyds!-#XLs$0Nd4A3@f z$H+|$(^RrXClwo3$v^2^d(8SfsV5Y{<~~pkQ8)e?+(dx-?+1OAo{ve*=|qB8k>=a- zU|4i6!SqudK7q}6GkLKIk9j%J-7D!dtARBdO(o_f>$uc9kN40O%*bEFU*XJ%ZeUvE zD+Zzco51GqBWFFEbQ=%1CVBH?oaD~rjeRgyuE0LGGKu@l@9{fAta12GW6>Gi;01aJ zM&LC4YDJ}!cr$OXEKRYM#juzQu_2wP{nnti7yvObgi6a~DxRI>YTR`Sb)Q{SjoY!0 z&ykY;MEBX)<0^drBfBY)UlrEv9n-Fz%5!2uFfVWq6sF#M5vjUNEl=Y+8*$IwValjY z+#zwD6KJ8S_yFa|$X_Mu?|>fq$jLbfx8_xH0lBDpkH$COWgX|lJkB^v<={FVj8*T2 z?$qr2uqggxd9D8u&!powcV#|iQ>Cx`hHUWSU`2lx@1*oaX_L|lrcd`Yf>$c1vC%wf zwLPSz+#{mi`h3&+BB`-x4D|2CbGXHBeTmx9Q013lHQ>M={4%Dk=N4 z@3aOWa$0EZ$t8wr+tfnp4CMu}!b76p1!VmT;fwTw-Rca8%qyBx4@53^BKsisX)4-+HzC*OSz`+bu-K`1pAFMdZ)bksQ8 zZ6Ak~WI47V4^eg`JNXh%(m`#t4IEQmSWS7 zMi=lvaAg|#qK2SbvdAB>WP`y-m}s@j$jo^VT{ro;fKFJ!r`w{}a-lD>qUV}n50_D0 zI}J`@3;L=$9?&K@_e$ZFhgn5IM;)*-^ZQSB3wTuSQ?FEET#sQj4`Vae@$)a|ARuLz zi&0Swhs|pZQBi;j`S;X%s^YzMM7}oKXX$Vj%nhlWxP**8*JS<_hjl!Kr#1$C)s%Q( zF&^9?e8V~9E?R^3%R=0>Sn5Zu;x{Hdr29R-Cce+!7;kCjpbz#}2x!6c#67Ww;8W~M z4n7_nOk=|&e{?$dBA6Fm<~-y!W?1!E`@>RqJe1i=xViuy{~xvI#F>M^3XRe0g3KDD zeN=m?cR|gBl3lzC3u`#_^KFdI848xNxHbu#S2Ee}fOZ4Skfe>GW>TuKo!ttYS*+6T8ws4TZf)2M%H_i+EsPX7g|F(N!{%*QP5c!YI2Zec}ApTQ90{~ zxBDlV%6(M)2iju(aC_@M&y)tPZXhh}1C5P1+oOr`C&TE~18Z{;oZc4pvJ@Qu>#gtb zu*<>XSQEQAk}BXD>SlZKivPAwkR^D9OqPWeXDiWCemdBP;N=WK#tUMnj==#okZNH^ z_G<;!FoNA%PCOo@vR{oHMk6AYvdEN=z2ArI3jViD zIgHKmNrEMKBB=kZL>}%C3sgrp<-~uV1Ur0jwAM*{1i`2^gXcMm z?oEOXxSr`VPE)rWXN)i=!8hqQ27oME%xWDW{_acdQanRtJedKU=xW4$CCIWzDlO!o zUB${}r27-SLp6$ZeEWHyEnEzOWm z$_1&FXCiCvSNnm@z7MzeC2a=iv?=OokYyfDZ+&|!i1qI5%2@k<(poYTAJvOmUwy4U zfeK1{-nkeAQ!@T-fW0_{$C7U6q2s+~1{>5{&gmp1rxm!rxp)E*tokfi?+4*=zyJ(} z-8LE-H+i1N;8ogz#oS{5C*3B`ld8BuBG(81_JFu^79PcEIQ@RX8{deWoCNzQ<_2Fz ze@ZeAK97WNsrI^+`k+V<$ zy*(3M6=W|rbCm&j&xO#BG1d$GVJ{i<0r-YaeDf{Te;u%jWh}NL z;yJ0^EJgws;whA)Ua*DSTvqV78_}};?VkKhf~n^$UG-Uzp;j<`3`3?S@m=CI2Hjqf zUD(ap2ymK)(R0umOygx{zia^+HkpXXMP9WvSD#5#c9vj6VCd1qTU*s|wtGmp@$Ra@;dJGl&kyQ3NXdBfS zV!`E9*?&U@B8iQk5xrc;j+{gSx1g`*lIJOdK0Oylm}^(mAIlUd|gTSVfUqP7CsLH{FjE6r{X4yP zJiFj8uHoC`?+}bNdXd%64a00xqE2dCMEaBA{a?XUZgADHc4& z7$VIPc-wC^A9<uzYw}U$ccudU%llqvziXwK^_~qKmQ6VZ-+E1$ zEx62ws zuKKprm>B6-qSx&7^AuplRcZSHe%mVtRNnW)ENRYmKGL&kDL08Bf>LoR?ay<*k)vgt91Ts?<22wWHf!qO&;QbhG?ko;r-iyg?@!DE(P!0DDtUm z$iu8cKlMX`3-E1T&Oj=XnuT}N;2xVH@m1iv5%Unmq)p*viMeVI@$WYCw0)59a_m8A zzF`1Z##2;B^P&9&m+5LGeFwUD19`a7_z5nm4gI*gU-1U7lH)HA@A(JgJ^Cpt+54e* z`X}-9MQxUG@=GwAp+P3ckYOyhiX} zk;AS9);K3#zeQ}A%8zMd(j#F(QSFrkAhWB@WT-X z!qg*p(8Qd(=fsi^$PwH^lbt|TS0Hcwxr>_IR}G$F1i$&0ijJ5NoksTJDAF*5JFJCd zw8pbsO!o64TK`|>>9nxptodm917zhQz)+qyE>pwIOl@>Mxs@86#KYKkKN%B0-sZpf z6}`#Jx~w>&zz>|`vS9yCTe*1Zr{vV9qfcLeM17BLIDo8;MfwI}c{fOp@H)GaX*q-c z{funlKCJf$a(6wbAN<8sgqGl^6O^JzK~*(My-ppzBstMNWJFiV2gw=K!~?spWMjfs z3$+nEl!kH%FRhPKl{s4m4BgMcKV2fC{6n4%!m%Q2c@+-GKI9O@Tt>myC>Xm0GuJE5 z%Mv6b%szuIX-Onh0ROrz`sOqqdnHciDE6@zJM1Qg+l^M4j@DnDp^Luax9y0`T9f+; zBTIA;$(c+BeF>jUqKY$?m3@KU5z`&-;bF|j1MkSn_eLi6z|@lu?LG$P=U+IJW4OC- z@c(M?)0tDbnppN7v0gTiky+8lAIO|;;hjI=e-A}N%*0;pLORY8mmNfwreZ6qq7B5< z@F#fff|=J%UQ@6kx6uX_$*EA zlkjXC^HhD={hsL2n#8$+k1~nx7Sq^0R29TLOb4emiL2fv<`MH~PveK2B3jyuA2^>A z+#}-*Rza%kuwz}xIF4bBzem?KN7rSt)5tuZV;A-k%N`>de~F}qaAFJKo94rdjKD%m z=(%X}|IPW_O3uO)WFbhsP0XtNG8;1uJud1L?J{bAoA3y(R-aW-kk#u5_ZPTX-ky*~1^u z?p@idHat-?@S)*R#|lBna{#f!a77B!ZdQ7-h-o9e8(5>}@1his6|aU@!0S6711} zSMoNJaEe_L^WiV@dl835WXPLf;*91~&ym{YJVOigb#^ka4)k+2yC5gB3Fop0E7Ouc z=fLv*hg{4@gAJx0F%itr31WyMoZdzFCl533D=x!+-rydta|eDRo;IA!qx7AG%0;Q^ zRi+Y}2VX~#{nROBbaq*)-V=!iZpj|{QYw(IY(hS?gc1cB<0jeAWmIvd;nQrE&!Lsv zRCX$0`Erw^|BtCJBf!WMMAwIrt;#Ex;2TPE)?={D{dl(1RNrcn<(0|UWy7QC$UX_K z>R#-m0w(zvbZ>QLi&eo7or=Ht$;t-Sx(9i_;rJt6cz-=CQ3H0p3%?o7NuJ4T8fRum zhQHc@_x8oVnS;M@lr#4U>ms;azc4S0DXnkV>vT>-5u$@3#M1l8s=wtNq)KsMi?5)0 z{(`4#H*+0sA;S*VMpS1D@kFuMwqN;7L-c{*sS^|J1auZT^3>!C(*IKOIbGnxbf*`4+HRqU&nD()7@99PMtbccM+auE&n>iioVM09R6e(9=RFMxX&v5I>= zhaG+|{J;`_#d1C*yL^%{+zJ=95*_Y5qRt6;7^749K>X(dM*0dIRRXp(gWq`uW3`5v z?#TT8*T2ue%|@@iU)V3Bduj@P!0-ae%+phL#6BY6?TpAXz8?(Q?gXZ93OkbIYYg{g^c7#nt_Z_&PhoE?#`c4ZIs!4{0*-E*<(`|+x8xTb_nH+oTL0{Q>fDcZOj<6KGOgk)nR zj2`}okl;$7QDK%YKC)O!U$|u7gk;gW-*QXdc}Cf(z&rP9YKe2cPp_F3%GVS z=DM^8Tjj>0l;u-uuwpCod-=F4<6HpaOzQu-Wd`tnPFC1E=G5r){F={A=6V0KiN-1C ze^`ZI`AWtfW@Xfjb1`f3Y5B31@%X??pv7aXvMAnT^cQW;{q_M#HRYXIi35HxcmJIk zZgi|;Fzh}nJ@}3@egr@AzE%=LC;$rch7%yscbGd`3>;rq3Nu*&6Hmf>Z^50mt z{q#{hNd4SKe!d*^AK~$*gRqRnh?G8I15V(TF0p1}$vmf%*EtN{$V;`#Lac8HmU|oP zxd!NX6T3f@^{^9O=>wd>MzT0gy&1OmEaMwN^cIEXDu@CgJ2vbTx!xg+(KPJ;6BvX* zotiQ{ZgIxBKi7<8w@-4frYfkeRuLsvq#nb`m3gS5vWu_^`X=SNqd~^1G;7+^v^N>? z&ZSysai^)8^{_3c*AiO~>j(2Rx(GTXvpkX7M=wW3?lUSt!!(yZ8I8&^aVyND-Kdy`mKo=e5kDf4oA<$OaE_C#=TM~jpyt{zUSv$L}* zm6IK{O70->sN|v&Gr;`G)ZH{+UPCq622>3XIfKbp3sNo059d9{ZF@#W1h0JdGLB2m zP0ChnvAYnev-zCJ`;oJ=_NqBu|JWy{e@`u*S~swdmFAqnnr&%xCoVJ~|o7TaWGo~oXfhx*OwO*Q9Ta!SFvxQ_jhIFHw z(GYWM`cnOr?~$8qBxH7bb4J(!`fAjt^T!l4Tq$aKls|h=RF?7Rp>l%Ir(l;$xc8#$ z&ZK2Sjn&i@$@!xLou8e@U5}K4+ARI0TM?o;udqA5yS`XU5Zza`W$M35hU<#!4`*}_ zRTq%SPIL>P&EYV>Z#mI;58W;5Q`2{exFP{2X9qEAS$forAzp8x52ORg0V&LspW4Sv zwrsXgYko^-Q)j7-5Uv;2jQhQ*zS2V65}JG-PVqB>)M-VWV$L$LsSatrw%&f1$TmzS@T?b<{pqp7e33IP#?A~QQylIw{&ucfh9qZLe(Ey-Z&FY*nagA7CwG zEl2I>3hQI59Ub&t>rm7=eJtP2%gFj1q7Uu|Pgr zZFQXTz}137r<0rku3oM?s6;O+mDG)@owYj$Rks7CcoKLlO)o&4RKT6cm{vti9)@mf zFq+ee`WQD>M*J*Ylk1U1cqS)Fr^R+cf__(%=mO?+s<*_w2e|@Qh zxrFl6PI9xg<>!0Wt z^g+!~$I>&Xr+dDzg~~3K{M-@g3+kUm?xuQqtq-}E6r~eds;}A;eT%y)UOXJ1eVCk8 zcl{cw)8bh22rS56Jp|u1#FO8=kH4?UDQF`-%FCVPUoWBesEu#=!AhG7|MJFj61xen zmB_!1OhjWUAP<7R3gJT)Js9-$2-JU>ne8WzfPKG>Z|+6j=n_FGhiR`5)U6vP7*H+GU#5T{i&)V2B-ZW1-#<|s9^?YRI_HxqV z2Wh71h53Nxi)D;uq&WlC;Xf$dE&3oTa88h)?2Xzbzjy#|A4R-uoCLNRMDY+l&FH6; zhZw6bj7~oHePZ*>tjh=VycnYUu}eV>_|=J2;RR8JH$@olp3KShm9)I5y{hSru^#78 zTQ8>;=>c`mO{5_48CLeXR+V~&30eic5a-*r6f3Z5B>9Upp19jjG)^rW3PxUw7UZ}v zmd`(mCoU-4;hMdr;o^M|;V%&7BbbW8V2ThFZ3?wr>7bGF;x<-YEi$Ag)YgNv-e_Td zQ!|vL4`FW3G4nI9tt}O^b4JFe)RD=35|iRX;+Mr=OxT%JGBq}Rr{lM4F||neEV|9D z%eb6cB)L>#`GgJ$#}bRD%ues`{7cIwmNvDpbhoy%a)PyKq*Oy_uP3Yh(3C#Z_PVo3 z*G%KBzq~&9)be}p_uQ{AJ$NI$RogsfW~e!tj%BUQDdv~-WjtkD#0kfHykouX-Y>l) zymNcc^16reG?wlghfM3`thtEa1k&dWNQP(%&K13g>>#O1@$LL@yIxr`zd;jS{Hxu0}P%IFwR8 zIy6MkZr0Xu_Hj+3*`6T7$#Bz^$rnr(hmq0sVdh7H9ye!)0uQl{*lYyo zvOOsDDV)x3u;(vg9f8gxePL5u!$MpliXG`up_WGv(HthnB0fP~(VHklqCdb#A~&P^ zd}$E!SYo3?u+cBDlW(zpn|YVS-Q}R_u&{nrTfnN_!WnwQ$S$lTs+>%;^Dl@w6-)8} z-+mO8S};90>C=W%yd(RnsaTs#$PW26HPLsZVd6S>Pc6Z<*fBKYL0U}emDF)*@6w;x zC0AKBLn{vZC%U(2D-?g{unZ;DH|0&znxrbpms2v*w%fKjPeOCP10 zl^m{H&Qh*AN`k7>5pVa{&(OoxU% zwlFa0W7`9|Gpw==w^g@UY}c%lteLHwECH5D<`?L|F3SDovT_Z1gd8n5r@pk5In>`gbsf8=%29C0QYKnuCgqp%2FiJLlOVPnV=PGJWY;he;-+648W;-_qO4RZB$Ep@$h zwNS28C4UTm)dXc@h*nU0tA^8`;G1%S(~lof0li8sigg)7-gGmgI}8Tl30&59=HfYe zybI{7P7=dDBbF$P?>ZrRNxeZ?U#OqSpnJm(YWV<`SH7C~K(`Y8fy0-}Hw!qwO(b zjCbxxI*Ysp6;+`|b%ywe)m8$P?hT%)CVhaeQK^vyeqjyuC~M)JchckIBC%q9H#!^6 z;1=n#l%Hy$%&<27h$@GX?>odw66vUah)AZb7KJi$x%yP?h|=f+7%YHT`y@>F1R^-& zMC{wJS%!XP5ZTw$#D+Tfw=RBgJF#kWqMvj+3zUbgUO`^6q`MzAB)O?O%0RhOkp0K` zQ^IlVWj?wp<`yeap&8|cr-y>6xp3nv%oXWiq39OA!p zh;gzedVzrhsc1g~GpBPxKxY(-XE}p-1$_x_(?_JSR7RZZ9;%s?HI7ypv(q}K>M7Gx zqtmWt1Uvs$4id}huu%K-V`_QVNPBeJv6Q~aw&a`1(^D-O0nWB+CwGiUcOH6bosg?Y zJ%tgxa~$1IoUZrE0BXSxi5YT$<)ZbQZM4^5uNa%l`hy-A&rl?sp{q}VJlGUuzGa?j z2?Q_yvX-zlv30Svv(>WYu)Va-v-(@-SU#9bQEUEI?nNh98|wD`a($DN4r}!+8!ZPd z-7QDW+fAJ~1)+oR69ng=H^xJ%-rDLT-0P{0Y9P&)ib!q6KkkZpTQ$^m-7(F6H{)%~Ws)>aXZuw#k*~JmUP~T;^J>yi;4~+c;V83c1MfaQbIO zH$2uLRBIjBsg1$kg~(0~fm<8{C;Jg!a}ADSFw8|>aIKx%!0T9srr?MfAf0C@!K3tw zFfv>4b74|Tdd>x#-0~dxIOoqUrPs?ARG1&N?9_uTV_)y1?leR`A|H@j$cv;kBH2Or zK>ZxGU4Nmroef%_EQ}QE5CziRn4H2SScj7+*+<|ZYO`mv!WM;qr%O?tQVVpt1JCmt zbg~>yV<+s)8+`90>{2H(MUkwHTwFab?Ck+m3FBZMb+l3fRT`7YneD}I+R+!EAv-Ry zVo&QO_?%?0;{d#6XX3Drd};$M^*3s20%4n8xckx7Z8ANwN)ZE;mVU$ZWD)nkp37Kn z7o$E4bwGJ>5c{(a7Gf9t;Zm-&2gUptc8`WKITjzj49_>1-}#IFzjkz=uZU>Y(wnjd z5lb(WX3fY9gptMm3C_siE@_}$&?r+k{CTF{REO$^W$ z_Q%Y;mm!b62F7O=SZ1->p1P0iL`){QFir{+4uMF<(StXOv>sM!8r+(l9tqo-@e$G@ zd828Txrk+mCB*X59B9sM$|IMe!Z14-+p%IcB9KJtG*+3dmfV()C{IVxLv#pL#23&| z`hhV*1e@z(an( zJGJ7KkKQhQ(9;b&m^Lms@If%8sb0$4iCHS*7umbUnlNq+EHkRNU6*&bMl^8tg zbLvzg@p}oZl$|h~@$kyU8O^JFN{ZeDR<#&E_h+6WIrI7$ky!}4-~f9@rV?&8S>np9 z?W`cBk|3pFWYW$t_rJLMB~X#hT3Ny=-3ye_uAa_8j`j9T_InvGGs@a8+UGesI1AEk zq^#0d$)YTy`-s9B#uIsmlF`|o*-_Lv(e+7bsEvoiNJl%ARX9cFU^i72znQ&aR9Osj zbH);!k(Yc7)$TANbwe?i&6GkHIzM_6oS>uJesclKLd!$TAIne6MN2rnT%G1S^z6Ar z=brqQQ0f_;TE1ECT2@=iTdtcM&<|mdsUW*jFy#TAj5LK&w@}t}8GXS}DU!&nHhSJ= zFzz=%qqE4|O6>E^?2{s#){tK-uZ~r8dWZ!o3zXWbtlgr|@C!1ppWuML5RLRv4=7oc zYxHS*?y9DIQzF$_a5NUM!4G)fSh$U*?4ZR|@>gWd&LqBX#P|Hb2VwZhF^qaqa%jfM zS;^!SYLdAzX811g$p`Wq34#vqQIq(2Df!4d#97zq*EI$ICxdENgIBu1mUJfrvYMFZ zIe6Pi&N+j8%3~PR<>1mbu*pWfiE%PocAm92Ec-1yeJ=290g%lRe*Yyoh1Z~h>?l4G zv?Anwyjdm9KxJ*{hPMoCe4qM?3hst_Uu`2wwQp3@hY{^$rK70ReO0KATCB1743FO5 zy`E9&rDf9sz-iZs47{;f?ZIBzQCrr4363W3Rmn3hv#?3yurX(O^5SFxR+1Zd2-1q- z*}wAy@j?ps`J3#}32=;|&ALa%ZV6r5E|BZ!$!F$A^R|tA>@u$Ym640%^FUCj1)h;L zodi0cz8(k*yqat1kYrYgr7s-gX#}0p@rYQ%R!BFWrT@td%uQ&_hHd*6w+-EpUcORlz zC((Mm&=)n$Yw<1Id0*57v&o(8AP?*Zi}H;1_y+x1hOUB8EWEtPm>ZQu*}yMW7>kb{ zP409U@D|{Pww%7SnYy#0*pDaVz(N`M1MoC+$@YlC1=#f_?EE@JCTC%F<`5-SKy~^T z5s-|2uQ7gMG5O~LTss&ZJ(L-_L@Z>eD=MQWbSU$A57$zBrZRx zDX<7p?4xB|`8d`skNaQLsDr8X7_4Tc=cyl>`x9za^lh!Nc{R~R+#y!`0`f6BzBy6y zl%&3K7#x3A7=^zz8{UsotiXUV;DSM9T92T7%u3hTFkPi9xT4L)ZZ;6Ah()AmsS%Y1 z<>U+GWJinlh!@_FcR9rhX-%)mW~fD)OUH@a+R=e!gB*zxvm2+)pOxC6zg&#IBrB@0 z@~nv$AlC~hM#s>tXf3glzr2MgWET37*{q%nR)*7E0vi#{=r0l1aCx}aFo32 zD!8lDSd%$qYV*LIHfP7orn_Kev{HW5-<6`WSQZw5`E9I%&ZsA=qTI;K+L;E1G>dcS zFPF!IJ?d+5>MN=fI%!|%K3avyW+E}H(P1n%9N#!r#1a_p4^-J)CTCO)K2u<)U80Vp z6g#>k9ZIjEuhdW=q_Cf^Z)>U{>H(^>e259&xOeglVRWa9A?KG&tUFq5rt~KM zoa5Z?^uu4Q=6t3ObSGbc{^|l=>^q;*1-tu?>$S6mQ*)#^synYa=hAyGOr1_2<6yV| zWA`0l7yV!qio@DuCa(FSuc7m7R}fT?d{wRmid}1(NuQ&)@+g^3#Z-sXkjhE5nc+z3 zhg3zL3A^NFs*9hQXSC%vhv7K+Hr>+~lgAk+kLT}5dY8n?K4fkR(53i2 zRRZPZGobCe;y{?ES6HqC#4BfsGf&|=#$(~)SZfX3sql8A;LfwtqxdVeEEm8m+q8|K z`+e}Y&)~x{p(PKYT6ZZu&d%ba@9}jGPq+s4$0UAt7MhkD=wmArPwZg7eu3ZkNz`nd zH@$~kHa!yfPG+o7BlcZga+Nl`$z#yqZQ`j+_?b=E(K2M-#={AfhC3a{EF3{!F`Rw; zi|Sn$-EebD)6rROLc#eJ{BeV<=Qq6m9qjA~)J#3V!Y=wd{Gfue0JttEv29mSRyAzI zDWXgx^S6(+8X$~@<9tTnfiY?j9qtCBF%(eg78HD_kj#p%__!EI$CXa(t0=gR+C;wR zwWcVU*3x_ZB3&(dgR=Uf?283um!}SWGTH)_+~j9Zon}XD%@wkxR(61Kj;?WvprJDG zCtLa)>(Lo&cadIGqghEWU{O?j(=@R#8p4~>E;1Uc#cQxi1>K8?$n&E3zM{8c1SX)( z%0rwlQCmBZXL!mPd%Jl0FW7b?ms|*2e}$Z3eb^jd>|PI;t_09aAF|4=80|e+!ONf` zGo6W^(|58mS6B7n${N743e~%J|Sr^ z5e=nv;$2j0P3ikETK|hxU}MTyfF@9$0Q?I*p#j#OeEXJBKUAhSozvrbex4lP9r zjC3QgrlCMe#~vA~=1_c64_*xzt0?p;Mm*ublFmjU>x1PBr;|+qa9|7`hB`38>V8L* zT7W)2Ip}evXx-dTgiMmmKIkrAly-`pg>Nte`|0jfL%pNk(rhqk$LX=qOJ0d;cRy89 zXUN07r6wR*OV$dZu1}#e(s9%W#wqgoiSGx&N)&~2D?}^*)+SH7UJZ6R|M>{O(-&on!1`8**A)n`F*r*I8Bvy;wJ-kj<1l^kwe zt+C#goP@&3CA&~Kj1UVm(}z3?rg>nf(OA^qpwl044Ey1Euanu1RDY^N$%Dq~cj@y` zpL>YKPD~U(fTO3NJD$lt-GSXtbAM#s!_m^0B}2AYddX~8;RMTKSff^O4-rBr%vBoI zKv#GzhI_rsv$Uqy^&zRM`~^0rApC!*If0%dDRl7~LZ<2j6)n$UpSF=5d?&5Kw;f{d z{1Dd)&D}-x-dOO`aQ!RwxiAuy$nZQAH^7fZppa{VMlp<)Jsn?N4*g0K;*_zVlfL+m zD{!jqr3aw8UcxRS#q}V~1+WLRr~z{er^Lo|&VE2wjD?`#n=tcFu%9>3{cdL-BiQ#3 z)Pw3J)gRq{N&U6HkZQ-(#5C`SY&wEhjIJm-^dofR8AbM~itf@sxuc2ZTheKEBvvt& z$}M`CYQxD2+UPPkL0hYzqHeT5YPu6t`DL&x@}Xpja|cluG7ihw6VGuFt(VDdbkx~L z_mn^);#?>_9}w^7ql%{hy&)^JN4(%lb9t=DVyYFIOH0vdtc2UYPo1NvS+(ZeQ3doR zmGH>{rO42PRW6=BUaLVlJ(pcJih=Op95ch8RZilP^sN) zh?*t}^-T_X;C&@BDk1JgmHPl)#8_g|m#on{LIY;>GZjlm*`K>n+twupF9UO#l|7P& zjBJ9CD8@(!_xi*QAE~^l$!;r4Wy4!g&J*%n5b`f8u!O_3hDpBPV!YqUmp`ORjSK*0TyVKEjUtk}XL;-gl z-}{9Kw4*zLT~HPFwE(qOQLx@W@KxuDi{puJmx6cF&`^a@4bhNXQAhrD3=LQ(_MJe_ zu;%b6x7bS)dAeW3q(N{vQUyV{soUKtxzvga5E!h(K zK|f?KH=K0+4vC@fcIy$7ga7XIuWHC1b|u`8Lu7sN-G(b2wUMQ!8fO^J1;U-)ZWqM~PsHgOE!cnP_sXjH3 zUrk43J6efex=pLZnHynh4`Q*?;JO85oz2+7aP~wD3dLhEvv1%_zMv1C!K{D67cM2U z@r8AIj6BX@*5g>-yAKR926WOFOfJ&9dLBBsoy1S?h2EU(`x}-$iG1KeVy?mPVwG3{ zZ_(HmCE6~D)$B{{S!-0VnbD;LV?)*v3+e3LoveWQ=nXc)V!3tBYZi8pV+urV;Vo9= z6rYuJI(iE>G`gMiMemuPJsAYPH8cnh;AgLb82d5ut>8KYk7hg%+Jp1toH~H=vVt;= zlhKWnx^og&=Yi45!-(g{rxxH}naMS#x<7*j@AA4roO=d4v=EG*pM1g|vObfjaCt+H z_8u$qD{ADeJnKGc7Yd`ySwIe?9_X+WUTPjYI0DN!hWVSsT7Ly<83|9gpA3bcI8@l` zenggIGP;W5oF^f{pG5G97PK8HD2Qsq3TMXZY{N?$KKch5g`2Qm-|0hloP2r*BD9&X zZ0lGfX;_J-oC9$b{`(;(g$+;wlwxQeLO5Auntl+>c|)8eef8w`BP4%%|NrI=IZ2vz zJ`sI<0M(j9=+kh@y$cKZREkE+mdJS?Q|NuVM(PH3@pjilZxK#^u0(AhSMCWDWv2tO z!GX;nYV{%$c!s#f4<>sd8M|PiHhAz9m9Q02TKTb)-nyfN!(ubM)@G1F6x9ObIL)BC z`!Ni{BqFm&tgkP+^z~?LYr|^GuoltOv5(|5fKB+|(x}o3h!e>p`D0$};X#mI7Qq{?^;r@EXZpSFsuLuHt*9eCl-;upH` zgcF;ugS8HEAH(*%;iTrDJ@;{8h1iYkL3Ozyr|A7nu1q3R7v}y5TUnnop8E2s z-`V2>$hmDL&biE*v0^_q6FF2OMr?(R4+Gs8y;%pK5lT?oWvB~VA=%`LoFTAFN)mO}vbQ^gtVuN3=!8CwvARU9wnB{Q0)4Ck zJEmxP;l-!8M`EV~$PTUsJ)U3;1BDP23_XcFrt813lSN@V+p>1w(;;gYIQ!&r zzGkw53piUU3dW<9?uF`R3^|f3?v*I#@>41IN;(aiItY#o6xtG3*C5CH4I5Gf^mP4;W}Y%dydA%|3ibH*1_MLd!! z^f)PoN`$W<$wPSlY20}n2xdH4iCe_eMx96;Umvh2>+r4tVEqMX)4GB^4zt<@VNEJv z^B=SBOTZU37Hi{ilgUcA2CWSx&it1COM6p}WI8Ynmlj57ij+?!5&6~*I3wRxme5TAz9{RS0)$)5VS z%v64zfNO1yo!gBUd4%%eHEZt{V=)s%VrGZW#WuHP#V>;8$%;i>4L=wO+mnq7{|00% zHlXtvN$h?Ny;esUj~lFmXzayO6x7x5D*@axoMs5Y}Vk9f05%KnCa*J8muk^noJ5o!0$x}Yz z?kZxfC!xaYMn=U3_xb^*{w+KD1bM{9?6;r#46gU)Z#eN00g zlmHi#8~yKJdVN#{U(i9lW8M71E7XE9YLEXvi0XYEjJQrrwt!i`jXrT68Kn>K@3qP2 z<%av-#(6}`K<7QtPc4NB)_I4UwUEnAmnU?EJ}`PW8Ig&w@@Ki{F&^#0G-lk_t@G1T zp66Rg&axYy_yix=k?|kGDro}0vmI3WLM$nD010T+^cE2hfze~ZSL2wqx}fD+thxF4 zoQBx+=GcKkL^ZXfPvo;EgHd;(pRA|-L`_ly>%UANz?l?Zg`w#59>brFz=9eI{Wm;k zFVrO^i0{2v@wZqtMz^e3F!*btruKM^@~CoxVDnb<3~Lzwj(GhB?2*kx4vmOPZd1*9 zimX)zt1AW-stH_k6VF%@@9@pjC6_aSvD4+r!mg%vEe}`91moEs-1i8p>j3wjM^9FV z@24{^tx&wR!8R?UlSL@%?GP!R9QZZR*?!ilQH^M()+vh{dx%U@vw(E$p#)9CNFizjt|Do*t zkF1Maq>E=M+j`{4>Fxy@dV3=E5Cp&7D}ArCJhp|!^K(LgRp70iF?wt>a5+5 zdS0}^bBPLGVlnHIOMO7ruM08gUa;nRBEjt9N%GM@$uS$Xj_IfhI^kRDuu|*5qg`c2 zh7iTKM}wCWeOLtkNFr|(2>$*?PV*)6sI&5lbLG0M(pADdaXQ(U3$Pw-pQ8`*U?7(X|?E=Pg}F2Kr;5uN0oHna9i=)2&e`_iAi zG`nCO(a~${YbP?6c1EKly^>e4GPW~%A?&K+L=r{~Xg%yn2W)bC_=B6w!ygd#POdfq ztN#wp_8@ydGa0q%jAc`7@-mpfY(&GeSzB{p9|Ad*pr_k`HysKmR*|l~9l*Am;ibP} z>2k8dTVm_}CCcIqCThnG1=}5-q%92pbXMMev>jzpd6c43ZwZk_E>`ksBCLMw-5}zZ zV`PNP)E#`FYPkjT8o};yGdmCAonu%F>7JUfkHjNJW%gaJ^9EaIR5YEyhW(8XAJ0>t zBfn4w4fI)}fv;p}cfsH0#-~lgQpR!bGhsWs>3^Z4j@O5R7p9Rx@5Ox2g@wLMv@(E9 zRWY&x$H=D^B6bR3PG4eCvy=BWD(LSqD!+*eI&pu8xyo+FuL2C*T2@C@d`uVcbppQf z8oAV2bm~chFONqHHGoQ?2Er_uxCB_3)AV;AN&P`@c25(SobIS!&q^uMJ9#c+*Fm|#x>|QGI&;{;!2lgWmyP$`V7j!*YilY8v7&u@r9;pkMbv<~suDVTaKx`kc zUxJZ-gvPxnY?yJ5ib=GPO>;8a+qnNk_ESYZ`3KQlOSp(qd{-f>SeqF9Gj_KDT#Hc; zyNxW`R17&4?hw|xbzbE_G{RQ3gDI^yz>_CTZ5I+$!W!)c3vXRfj?d&TtpRn z6)oUswL2ZB|3Xu`+5J@b0A~=0rr`_t=PDWGIjp=}jNB3wCX=xx4bWjbSfMU*cxyo@ zrx~FrFika1MO-f`#A0jlMO&H8fAEUk$OATKCZ4hn&aqb8qiqQw_H4+mzCrC}4&vg^ z;J4z~iH=y$7x3O6;B%{^o(+d*S^)~34^}t{+&lqyZ&AH}Ka!ND6BsHk^+XlLkvC?YsA($$@+Z6%ACbo-effFus>C}|G}W`nT*0%u34HHKft~Y^5k=FuxES1 zhAfB6jT6U6_cBpxXc4>XolqY|NocxoI=!)bD$ z1}tPXxQTzj0k_~k!uY=zd{%k9IB_k}a5|svg=*MAhBggb(}(reoS3{NV{@E-Xn{og z_y*#-UwD~v%c0dhwu2Da0C#yFA z58H?8$G6y%3PfFYl(6%#QQN?3JLr3ri0-mKy5v6i;hA`KR5zfNZdjh_L`Q~hU?Fq= zn0?Uzt?OEz=x=nAet5Wx>?I5H@kbZ{lK2eMRb1=@+g6dvknw6>wG4evS8Hd8;xmND z;z;_`ob>2NA7i}>5DTsVoBZS&+1*#@A20wc^GfeURq!@=-X*Yq3t@})pqd%aY^(+2 zbO8}AA`2cz{M;Mg`~#e@nEjEHU0Dae`H=Cpv#SfcV?6oWg?Qcd*q76=YTn?(`&cEH z5Q+Nifb<8x{w&?UPJ6~V3M_61f34sihT{wRlKYzpib)`+uotb+0DS*NEaN|1p(0ud z2c0zv<3Bc`a!x_v@(tfM1>3HJ(O+TH3$PbX!7wyq9ybzk%_k%10uu@-g&)&v?Hln* zjMkEUWFqrfma|mXqTZ}QeTSVM(O0!bYEk8H*DzO%>#pJh;=Ja5gLW||+FPB^tIlkl z2E`@{%^0Wac+ycI4lf~y%t24>2mOFcYOl0s`fK+?)Pm>WDP7pJV(w;SOh%FYZbFP% zRVXLEB+KR{t>A2n4Di5lBEYLWZzizqKCwES{#s%=D?RUW!`ZdqnGX~B6a$eQ;+>08 zR3_JP?i-rtE1a0q9=2jVG2|_t?1NZ}x|b&~ z-!XKun!x(&NXD=W^S_EHG8mivfl&&_j$Op#PRBm`V$ZH%pH35ty#SLLwcJtM$5yQE zEcVVq?D}DBfl<5dAZwI}H#fR-PQrs4-C?@IZ9JyJX(6__GIKVU*Dx@Q7iz<$jBo;b zL2wU4!%>Vgkh*cc&VE!OHS}g^pURSjb)Z6NCay#+7X%~HlO1u23a4dUEr8K?aNQfA zilSrz+LEc>L>IEWaw1)WZ{j7pvtJj3H^Z^Q$KfVd!nV}mHH{eQ4ZiCG*@kSUKd35V z#iqh~y?|Cl73hBdUEA%B6g!i{63u%|3*;YS7Gbbnox04oYNYmv{D?$VSvPT&(8HZT zPWlNQf?KJF_^q#E9#f*ZsC9$2hPAY1iz!<26&JWikg+*P#&8r}QIC;(S;F1!#m6)S zi~Ry=CwunJC6I7ata4obAhzZ1hbGQpHeA#8@r!?H_Yw)&)l75xaOcA%-X(2hT2y*l$9|=|J6ZZ;{$qV(``0#;6SWjh z;Ta8s^RKvpbG`!1U(i<`<`li^@=0+J9R4D3%->>JSvSqMOtT)aIxW-9p|U3I(s!$! zP(FGosxn0@1_mjKCHae-#U}d4y@9U|hp%hN??Xye$Fsw zvU7`Tp)y;Y3+LM#lzR*m){g!b*~No+;89rSqWW3X@O!ju#6%Hzpep!`mYg9qnf;rY ztlu>((087@xzrPF&n?C)P>9zrutHubeHf>6eEMqbuI_ecC%-xtMeZDw)%)=kyWu?p zShs%o)8;U84M2#ez)8{cV=W55Tm^fao&D7tRb^{FZ*zwI-hdN$3b7(k!Lmkg zpg$f<7sOpKlB0wP;%sSzT$YZHhdJkHm%Kw7BUTsu+(q?pY7tw~Pu~kJD~%|=FZ;3# z9`Pmn{kvY8I5P`8o=E?pabWjaaiUUV zIMYvX*N=z=7HD(S{p{QXn+F<~H?ArtSqMFzh#5!pH7m09510tDsddkXV)_g^gAH^Lp9>3jlTph-C09{8J*QzWe5fb&gNZJReR?5mC2PHf zobfhlao~WlhmSy3W$E!hhIbFrUumtiSn95?soB}HQ+0Z^k;l1!R;dA6%KMzibwDr) z-9T_^DxBLLJ37*efUb)<0x_rh^c|U@eM*Yp8c2S6vv?rI0gf0xlfJy67nNm77xO zU)!A19BvAiD@&(^a_(EGCT>yV*^ZoFLp6{dYF~*RhBJ#bIj5xsarPUu0rfo`@L{5X zd04{!e7e5?S>-%(GTzroU!>+JX~yVB;SlnozPAw7ltABbTzVu&GS|(`+08ply4*ls zD7|KP#DG%U5_Q~xTgb^O8H~!RC_LM3d}2GI?xKwBC{%S5`TRi1B;Ijv)Ms!mv8wFn z6wA-l@qShp^3+E`h_hi?Qt35O5+B-@7=181p%=;_m9Z*B4j`2Z%~xnrno*m-R?S2e z!z6YTKP9VEkC)Dl(TEZv$$B={_VLuuls(Ey<*@Rd(-*Gd*EH=QXkBwJAztVLgSrDw zdOS1!3GOQho6U)r%y}m~YBjXThtOX%m)-JWQwsHLwapbdvm@Sg*R-GW=NFo0&60>fi=V~fk_Z7PG<%F;QsSjrU8nHL;6ZJ%a z6#9a~wtzV9fFFzDksMgfZsa5?5{K2mnq)>_w~-8$3ceaf&&5|#GW`Ztpm`}MW}`!c zH_DHk?1|#Ao;QSSnDfMSszl>OW2j>u1R;80tPPxJf&wHHhoi&{koDSzH z*DR$8wR8d0W6xBtD8F4DW9=xIEtOeSfcQUa8UQb&P|Ep zhmsXq&pC4SIgfG$?BPUW+MQhK0K8#d_@0ME8k~$q{arKixel#7+;cFPyfK-T41D)b z-WdujVj^E(iubPciFp|)g8)V&JxP%+Cde}Qf;gImiSbjWL|5@Wc_H#VR>ij zA>S2yP-hXwP9FuUoaXi-n_NTA#F<6$rdZQfYI0}G@1$nv9@dg=*+x&9taJveBgu4R z`NXsNxl8C1G=D0l#VyG#Bo`S;1F=Il`oizWP>2d~(;g319r*eR>}GH0tr8C#9Z!dR;N5 zL2UD+uJ+ezM>5t|gdBPW*T3oZq)&fN{fhqC`e(t|;5ci1SW?NftM*LFSFN=WA{8|` z%uZ_?Z?|uzfSN%)vS~SDavjKBDfh6PqqEJ=9Gq#7*D-UX^bvdbQk-LIZhPRnD9}G! zLe9&1LV~9ScgmZV>rnO^L7V;O`$St$m|931gyoFaJ2Xc>c-=y`X>>drfDWk@m=M(m zb?JApznrR|^>>N(8L2)=Uhya5n*aJ7yZBd?-^b!_Bn77pw0CzMRO^y&zD>{nP<5T_ zq9dFAX?nKwgtY$YT{6zv`#B3Kaq4p22MzBMX`g(?^w1n{DPZg6waNR8&n`}I9q5#A!7eL_mOWLJvQVJr;Yv2i;tU_-*?-bblGH_=B^!3dQ zUr>Uc)UC`h=0TPpmNwRZtY@qTts|{&D(4PSVXMmde)E|S61?Y-jAX|UJH*uo66yQ@Z&Z0 zAkHZXql?UK&U0!@r;I+J85z`<4W6YRitYX6cP@i9#(*skqkvqGH*L!mU1WT2qKLf& zb9{@K;XLg4E_5)v$U3|fZS>m-C*S^s^F-gF_h?0A(VdE>PUQb*V=c@mBHqJr{y>MW z>H;j99h>!(O6;}ZwLb9nEwHV<@Vk@H9*m*Bs2u3>JSXuqBAPCVGH9Qc2c1tXBKMAr zuM7i~9X-G~5N~~=kR;;yA0Aex8yM9%zo9hO4~K<{qM9%dEMh;NV>R7$BI%esQK}28 ze}H$G#1r6^TJV*DM548rvmM0KUSR3!*v%l~*X?8uMBi$r zLJS^2ZZ!*EKH!=}II$zx`}WvD30A>iBQldaoxyVjkW*O!hJVUxxJ6bd4E>tG{+~*| z$OoO>1+)iC$RSOIwHS?pVgUKb-f*2GVGcIH_`Qd*DojqZ2{rn`HvSAxvXLVS-3Ki&a`uNU`InlVV@Grmy!6Ub~1 zVidQ)@-4)Zl!Ko*3nw~|Y-At!r%gQHAFfi8`)bJ@w4?r`F;7+)wkws0`zHLx3G(&N zVPSJJUVX``jOAXdgAw1M58J{g>?IE*@f2gQnFsJ-8{k$u;kT@0J)e;gx&sRT%>MT$ zkKKYC+A`jA4Lfj?cQ53#3c%bw;jYf}-WZ-FHymUg;^^}5K`Os_iy1phUg;G$CKo^H z!Ih>`BR7G&>Bzn2B>MgYhjoK@K4N4Od0!yk&A~in@LQK)epi8wjk8t0@~p;q_kihd z#_wjLpXW>1uIv2v8)n(TnAyPm7BVL(jNnIR{{w&j*8$Q22GGIS3V&vBr%s+*AQ$EY zpM2#R?vWe4;ps*DgYhy>AuNH0upBc|5UpKi)`yw3tni!3bXxq%>jfiwhw;0~UA*Rs zDoA+NLOh`OnUaTpj2zB zDJ?Difa94G>@FdlH?6arv}Ut?x3;v-2jkTyYDqO!q0>_d%QlOP)8kdm@^F}#^chzwBCinav#mfLP{{f(^Mno~u zJI>@Xu{cEA=`=l!gog2Hj?+780ceAO;daT7$G?9W=R z15=s>_M`*&G}yCipAs3pLur@^#ZU{d>_9P;%w%)w*1XWA80RzpA)Yj$&SJb!Q1R$-&e$P7s3mSg*X0AX018-kjc~m zOoh`6C4b(UXKDu{G#~GkE>b{7hidtmGDZkwdwU|0%^Nwdd4`@}Sy8e(NGk=n+Qv9KL@ScE@0z@{|3L z`O1rR4uy-}goW4urrnAMvl0tD2AvMZGwFOvlDmc8Lv8G;>FAd6ByDGEY|65fzf%sT z{7k8kIwEx=9c$uJ%cQMItCnud@VD1@%yPbV6(W1Nl5G1Fa_!ea2fe`t)#zR{p4pqr zJ;yM%2B(}03%P{xyMpz(%rnM4f8S z0k1(`S-cM0LTrDm8?8;OqV<$zkj2Zg&KzK#YI@1p0^87MJ|Z(d4~4>EG=dT;tIBYL zMJ1bLbfupF2dAM0p9p{Tjy!lRnEXh*r=8fP6ty4KIM1=1a>CWpCAywD@6ll*(AC+s z)0OUOjE*%LMy-Pyp}tY`aI*b9)IGDv9T+F*Z17m+Pwet2{N@IJm*j-Ac}#U%U%D*bp~kEN*_Io4 zeH0(eFJDpY;WscHgs_cM}b*Vnxru z1NTC4Tb4RvCn(`58238e$De|k6LgX9Vq@5gRoNNsVf4e;GY7HAAFzjRa(w>(-z(MV zmMUY@)398|c{Ik!2KTV}ckwf?xU$hX)##Dh0Q)|cxnIq0-$MR*6MwD-k*;F5ZpZ7K zxZSyf~T{9y$rAZ6dz=qkYjWuKg>J#lcm_n?Ci()82R5ge1*~5H4sef$JG@4#2=pJ zGuHn(9^?r&;km~q7$>C}eXu0n<%4a{gva&g-$CHK+$bK6Zq!tXcaRhzw8fltfBT}h0v zoogFD#hdFIJ}Z&=jmBbK16w^{hJWKJ&D@dEmEZ7_?|AZPzFzYrKNvy7Pen5?m*6*# zpg%szxZLM6zVUnMASi{;7Wrh_De&nse%{G%{pPp7v1*M^$iPz@J-G`qFXg}+Rr#t3 zGN{g%aS}p(?z#m#x*KyhkgtAt^(Kr(KE}#8{le%?o{7<^1fprjySlIsn(`?{uwR+D zZ(~dY@Si#Gqq+F4EO=NiUIN}iBa~jujfCAk-tsnOh4B9OM zb}9fO3+7*Wnd=~~pfe&rS@DLac*NZp=gAr!__JVLi}9(($@3)`t780Kd9Y{`=C(EC zQ;&UXoW|!$OmY5eIR zQ?Byq#>@DR;paa$|EDtpIzKf|5)ipF3-@N>XGWLoUyOxuR-AEqQmkjK2%ed+^6AFB z5Y~7;!^yKc`3w`Y9mMW7DjkY219^EF-NcP&Hr{E>x|ypO?@eKpQrY*$X(|TVGx0nE zcdjtn3g6LqkCPEJp3b;;W2G4X{%@yxaV6trSOsG?3oxJMm=9yEwr1oSW1Fh6CXH1P z%*+&Jt}F2W6?he6{(`tGWA&zSbz=mLku)L>W5v;ufPcF@BcicpbZmpMcZ_Fn@T5j2 z*WjQoVQY@El6j{e*e@?LSd3S3u5GM|40hZ{-tm|f`xtwh#M9>DJ*7SG z$jo#9VQ1gMo}K4YAFu4W-QVCGKxJw zvppEk`dl+RpKF{x;b2^h)o09VAZs!!e+GJH!o>VKxW*Sg_YOGVJQnOGqx6w0aJm}z zUW7X@!yYQZ-52`b2$k~uUtxA%RzAhdnl-NB;E8PD_*}ftc&G8KK3w1U^tbFu>C_ zW0(B5Q{2ou2T!tARX*GBwRf?}CwZ!Kp0WGMy%;C?7^}hP2>)NF__vItmAkEkJ!k|X zE9Z$O3`_NxF?qtO`Q};i#vU}DG{vLX|LxiLR_?Aaqhs{kZ$kvp8B5xZS*XW4{;$h< zAfu3t6=kd~!v^K%{)~vsh#qgS2Jd^k+GECj6Fh27x=LLlci91MBNyuU9Q4($L`_Ls zs%yK!cyxzL7*6k)L;5Fl%tLrOe>j4Zumkn!y>gIlT4t2tB z{yYpj+Z(1l7ko%E=q(!Tx}JEx7~NAMKuhW9h?c^=_GRQkU>zG%Je#o*WJV8h&00?uTGyyXh5$Wp#T zn>mfy%7NZzhc=LiDi%dYI9(ko!^OQo{WA+TstWwI4NZiLS0FuI+M&eRN2PXFFzamm_-~kx4zLZo z&>#MS%PGK0>;kS|0P}PnKJW`zI-SaoAN19^4A(XbjkysW22<BDV^0%#7}?F5`NdaVy9Y=XQ@hT=|@au?Lj;}3Nae@IE5Q}(`b_`xWS1GmLS57^8dw}>&1uEP88?7*)ilYHlWAbO%IB-(k%Gtrt}w7$!+aN`_P{H zNITZ!Ao1`xR+7=xC^tU)2R3H|HmNFgWUt|!H?dQfp_@HQCMyALKsnamAntYzF~n77 z<{NuJ!cQ3Wo4)v11HBj+$~bA`6}I*?RxE;8Yar^1mMBmfV<8&xcP-9kDT0kMdO2mL z=B6Ut-%!@n4y^MN)|_$bl7KHN&HflmTz(1eSAqS_!%8nk^@Z_OgzQ{yGH3!!{B2a1 z##!k_S;xQeXm?q&r-^ZPVAE!B^%iIxa*!vq>k5{@AFXs9#&;^uaS#+?uz`2@o%2LU z2SCV1Y;*)Q*Ez=9I2+7}pG4xu)A;`-qH=}5M# z8Mcg|^nz&>Qd^}AP2QOFGOQi`RvPn(*4 zAmg(=hqI?^3n!FT(-)!5$t=~E+nVZ|eJm#}Rjr$>pE+BioUIP8Dz=<9-FnZu5=K$6 z?6tS>*@}2YdyVrp`z-R&dO|#$%kJ#$ zjB!kNRK!AlwLj-8!(PDA)e%X5s4m#WMy|WA?#gc^oSgke>TGAjQj~yMS?1Y=x7jiG z@!Th|9@9{U6hO;)8nn_MJ#0N{n7ZIAx5EPZvkR7iWlNAfPZ37oA?8SVs8wrbdPu(O zlsU7dhh>fBg5{azo#mzFvSl-@QbA6x7|lr(^G!C>Bu=bsM~B?P;uiM%I&D7c1G^%AO#QI;s@6;0`=o})kC0ThS3^jtje zE2`B8u(ltOqpm>Z#45Phm-xM(c)p8pV8g&%*~K(=(*yR^S(w00;ICeI>ooTF46ssG z#_JW#Pc+(bgM%)Gg$iMG2VggP!<4qgHnn9JPr?V@WB1m;;_hY7rJ+AFI;VbSw`^jy zhk{@_z~&AlA2c7EwFu182Noj>N~^onM*Pd~@8z0r@T!@?_*KEHt+3zy*msNJOCPc0 zg2@_FzGET2MgUwuyx9Q}; zBQF`{k>u<}x>`lj-=i~CY!%@MtDqz33j4Q?PKbZV|Fr?NoM2T3p>Q99l@>~jYqBfIb-_8_Sp}@{)A7J@)Un(# z#?jP~&*8Gau|Kfiw|}&IIhs3GI}#nO(5eKxmIIE$lw@TpJ>KSnD%Vo&vI^TeopT8W zqw45SmBJAD2WOr?HB~UrG+!~NoAX*)S;kqmv%>wYovn-6?P=Crwz9TrwyL&*Hh){Z z^_lgEb)9v#b&PeKb&7Qnx!*h1WUHU8kgc#Sw=Laz$vVNB%X-Pu*^+FIFc&f3Fm*Eh zl1Iy_bY4wj?j&(N=-vlUYA{WQ;OCYx7a_2T8PqXtp=ZP}vI&F9Rz@%u$6+0>g1+~m zjUESHu0pMJPCXBQcR~w(SI@>8ya3jlNS#bm>d302erqGg$+Jws=98#fZd%G&mslTJ zHERGTJ2@Q=BfvmFW5cUhCBo(Vx9b;>Y;4e}?@Y7q{z|`PZ`8ma)ZStHq9pjfxHZRWQ!)cga7a;=d$J zOsbforG8GoZr|kWr8v~y^z4~Vt;`WLT;-AXL)N)v=#IY@mb+}-0ym(gZ`reyaFc#o)3Hx7!`Oha719vz{3Gm0`~g* z`}fPV&F{HyypP4l>h0|nU<{;6O1qP~FZEdJht$Gp)6>4E^+U9E;*~{)HDQjen&FsVdREfS}0lgQSd&8 zQSG_KU8q|=$zx3#r#=690xnZ9~2(lRlG9KZn)vXbwVA z9~@LapghP!uF3~xo1(>_>YvE6L80&CcI5YF4+`h3N%TkSJY?>pr67AX+Ii_ z$ta#SaXxMa-l-n3bQ?M-WRw4orLzE!>gv|;@sT7X!QI{6wYa;xyBBDY;#M4rI}~@9 z;#w$f#a)UfAu@CPzQcc?Jd^^FBYUsC z%qn8P19LHm`mqCf{Rve0yMsyeQ^k$}ORyf+|1z@SIZW=>bEe&LItK2Asn8KT6K^l#}Qq9FzN0 z13Q^5{Kk}|6DLwzYL-FFrf2h{Hc~NeCc~S@pZoA#D^j;-A{$Ld@2CQw`wLfglQV#r1C1=UM3Ix>xTXVb~})^H`0xsvL1(gg1OU+(zv2H$*L=|Zd-CHhkT50k%KoPYJRdGur`BsS#T;ZVB##`=SA>6 z@=>3><0R|?AL;^pl++FyTWI5bL)|#L5vj)nt|y&Lyq=IOVR3xd_^I)+@!J!YCmu|C z8Hmzz7%9zbW&_*@R2&m!>d1XLcLt%jZqa#q z1wtiCh=F~$2&a~5#%WH{cfkw6TfwivRC+nRp58z&qi5EQ;B!vbi^0Ex4}wpFuYz}i z$Ab%kJ%ih zbc$Y6oliE`ai0^wmlgs~oQpbhCU~m#Vs^6hRUmMBpkgqHdT#a)b+tS0I%kP>PVbX+ z>3iFlVPD37`s-trPuiD%zSa8fB+k%>TVp|AXK^pv8_jRQG)aBqtHnKxX%cfJ#*U5s z-YroKt~LI%&N*KAi?5ja7v&!N5G}5{tAvYUL3x{^f;qfMUh=2sixyDdgN*+btfDRF zQ2*85d$WZ#ipU)~A*yI}!RV1uMIy&XtPi{GtL-i7*@hQdOHW_#5nukW!Qnqg$jQ=i z>KzLo5cbj6)O%Z-q)tUIcA7kte#jyECFkXF@^_}fmBh+IdAAd4MGftusPv4tPob6l z9Hhh}>#;f0h|*^Vawmnsv&oS#G@)AJkfgVPzWO~wur8w85aijxp(z?0gXER?zje^|uxjq9`;>C> z9Puq0M|EKiEVfe8^Q(v2AHnYj znZ?z0(>nL8^SIY7!#gOynTpf;cjs?Z^$((1Q$V^zEnGk-;8t^fw+q{4sBacHr`)vg zZr0%<6Qg`ai+!@(LP{+@;|yv8rfh-J2)5ov@tzbfA5b!?Dc}@5#=GN)xRL5shI=)S zsdE`}?v9+4#pusv5O>o>sp*bK{iQVejQ79?{zkob%&ASibdCBhv)j(;Znw4Cm{UPQ z9%nM&(a3G429M&}2b{FjWVgV_*SG6gt$8P+@ksY`KZDKgR(BA|H|X-dhpn>SK46`M zP1DjyWBg=XF?N_2@Y>12N%M$4TM0Bqatbxv22NL=W>G7%)z8WVUZttK7{9*<(qcJY zHt_F>mfK5f$Rd_=28C4jkHI8pC#O+PD>;c*&DFH(S#<5+$`j>Uavu6{L*xrE2Iec@ zlzeJ!cm@Wj-;&B%PW}wICq>9r<@w}!m6fr|OmvG=!nFyYvvQoQCP)V)8ClI+d<=A{ zAFKDSydS*oSE;r17d@f%oQ9!UXe9C@0v3573I^-R9EP$czJd^+2~+9{ zZ(|k6@Q@}>2`9{6VOsi(;DkW7z_P$s9Jkup_~wcSr16q2XN{72KK+()%YHA8)V}&pB{ZqaKn+fy)^!Et2!9Z?s>$>wUTXZ++jq^*zan%x^{s@rT6ne6S(PXY)R zX+7QDXL2ifG6?_fFke^lDCve zCwfZSk3Q`%xwgBWy zbu=*>a9`5Age%|I#`TEH@%>Buh@?sSG%J&Pf!OqupgE_F&q-17mtz)wz5Zp}*QnUD z@l}H!dw^&tB|I^nOrAvLp;*N^X*>#;iN7WGPC61yV-*%gDPz2+!-5g-lg&>S8F9$} zn9u7ZjmKAWsf&uNltO*rndSc!z9HF$$WxJ-A}>U^VL@M#r>OQ^38!`~ucT7TYtuaE zy=Qzq{WJX){lk1MyoNSQEvfi$Fj)aVs~#A#*-SY$gDxwE+CXb2G|TBW)uiWC7%hN{ zRMXp;5h+$#bCQt>*U6%|TC_Jap|m{3{tDXf13WpM9O96f&pdA|0&RXBPs-=!E*O?` zoe5}kSVBvbtTGYpUQ%VuM~ST+s}h%Wp^h|EZh*G%5M{SKUCJxsLJiwup3~30B#e`) zC|A^bS_#j6?UGtlX(9~~{)LC!mKyL6M_@&DkZ&u;)y&!{^&Vb^^TmDO6n9%M@C7Sl zRkwGuzHf@6e3fcxjNF%KP}5y(XR}h7%Z)?a!7tWhy8#|O>(Iz)1tYGy2nNEfh#P4D zhL0EJ#tL-a9uv89(G@-fGW-wbL@C89)E^aD*(c~~w`B!ZrTcym*8de@0vN1)Xkt6y zvHxQYA9N?6;d31?Ec~#zo_M#s_!ILngW1_~v8|BcY_m6_Gc7RnsbRNuenDkF9}~kC zOt-*JxT=%h{?&@)qn35onhF~+FMaUe=r8}rN=_jZck?(NI|0Px4(_OuS$&5_=12WsIzrj>Uyb3`87Ewfmis6Qu7DHeO=2tev$fAKf`P#Oz{H@b ze>L+sjf5z)0)Lk!d6&4uZDBt*b_B&hRFatVcT$638)Jj@+CjPchib1S9);Ps$j)cw zz?3{lAijX%>16Cm$Q?;-&-QZALwtU zwuf4=unqsDGHGK4t=)EWI=&gGmCiEz?P<@4C0GmH>AdD;Cp<_c7LMQh;T;$oDpEg=u^Uy@fNwz(c3Ag}iIXgLcUV8llmMp->PI61H>&?~q>&up%nnRnlTGn;|lq>N@u1bNCo%#f;4sa{}4wnZv0Ux$0T zfsADpD&i+uZ|A9`HcIK_C-PI}D_oY%9@QI5Cvc;-UR|dAO?M~-b=PBgmC}oT`EYF< z)yxoe2JEsWXqES+_c9vJb{F$qw$$IhelMKvBF@9Rw3s|5Nc3=EI`9~zB7XT^RKzYd_bpjto^6++WjCLfeD*l zIz#T$UigEl)^hq159uD2ql0XUCz)|f#si`vT>P5SF)+3&IaCIsV-h@_?D$oNEA^D- zN?F{8R?DSPjF^EQV-aeBs>}_Sd&vV|HozRUo%D(L`ieUK1s&$XRAVN2PYHVC z6MkSRyHcU;CAZm+p7b%RHBt7Kd5DjjrbIoq2@dN}oVX%5kyASl>8RYcN;4g0yN6z7Fm z*{G=()4%A0%~AGV_qq57CwLI`$D(ovu@TIsfo4u)q&`+pXH+mZTZNp(`0@S>Lt`mj zd$9a&4F^>ME3ajfKaXLu^2FZfEXCO%5;ouoX7}~U)A5FP&|I+Yn-xrtnbBNnwkFEe za*B`{wr94L4-JKbXtD0JPMM;)*cgfTbvt}V`@z9YbhC?*bhIA9IesPn4Kpph^AJ7Q zndaZ-ZmXr;q<0vITeMW(gP(uJT+7WTllf7|rB9^pDGdl+PwTl6%0jtLACrd8U0-S1WnsL*fvWp`XD%yy?_plK(fS zLmxQ1vpGfX%PZwF@-lkCX~jlpxS9KY-R3($6THGJ;WUXN_i}9GR>E+?IPBcNU)+uUDi`QbiZY z0j^k6ohrg%@hbh;jB`l`irjaT~r-PlSLmUw;2G&V!M-@XMLOuW)*$p zI+91+;`VkXGmC2q6T6f9Rah(K=X5KlP0%W8Gu6RLB{^RFO1JI~6QkkizVw&o$jg*& z>P_`ubp$T+_h4~;pig*!3Bp#8DYM~tZG(H?jfgY>f1v{M8zM|?vhTHE^uIDWYfTR_ zjJbVAGLp_9Qsyu@>jy3@i78TOa#Dj%<M9pHP^q$fUXgCrHSP_kX;atSH&8rsw$$ z)X){s45i7>)`5cxDbiI0;V>8m+%$A?UeiCWPnSHq_&ZtiRi-MRP=&eyb1?>wssqHl zOPqIQP+#aktX##pSd^cWiRpMHt}ryATgQnT>Ub{X-!h;}-qgJZ%IO1``G)v$R6s{y z{SQ5<&UA}M(UDAsqJO;~T>k9z8t>tzkOuC^OFHPEP#(INv+>0&p4JQVf2t ziKs-sux3*cy>xmoEBudM=s|L`kgH)Wy3||g2lU7H`#u^+3HW0!V~$(shc4+eltUhq z*_DA&?^2mM&Umuc`eFyEk(>z!(Z@`%2PyCAhHS^TZ#$}>p-ygB@lU1%E%9qgkAlVy zT!YS&Go_b*k=Ba`QFz2Z92MGppjM9Borrp$U^Hy!9KFJM-`h6KO~x8MG59E$M}MK; zHtw27P^sHZ&#g1an2y#vVqIIa4q6e7nDON_6OFUXL;f<-m>2lW$F}Y0?s9So-n!cc z#f}6pLz&ENCi(|XXQ8BYUOuB_Qy<~(;Dw!&M%)ED{$~_F9>_)1GC1LBo&)qoGpUtO zBN>SMWP7EBIza2>(U|Dp^u%i0;H}?7snw!#%0ZlXBgM*>m6~c*^#rH=Kndk#xZTfC z@D{-T?RU=#d&IWVpPYtKQhl*AZYEot47h4sWk%4O?tW9|x3QoW{h;lhvA#|-;k!daIiQpmmsGc z%Vg^?sIw$^E-=NY%D$q7Tp!-;9+ZFc!&5)WE^@(^HiDfr%06vXu}nIa>6z7Bw+d59 z*yxYXf&saLd3++e!3(TC=4B&ZZ>M|pJo+YmA!=8JsADd}noa>;W;oSXS0}%n(P|DG zH4h!``<#zE-CW{t?B*J1I!sX_ls0l3okMkY{|NBxqWw*LkOO2ay zWzDY+k`IfLuo5+mrmWAY&KGwPx<>yg*|nS6L#@1~D^=uTVz`^k?rAmx$x+bAXCAb6 zI0uBSFrTBG@)Mz}{YXEXG(TZUyeHvl;?v-6>mOmi z^4#;mx5R(XciVGUX)E5euNiBD+XIP#NxI*v>~5Eys>8gQ{QLby{JXtlwEJ>l@sjh& zI>*Vk$sCIEQi4O)0H&@5PTyJS;^iWe+=Crf2iN#f)>w0m@gCo=Y4j$NnbWO?PB8)R z5V@4nUO6t0kah{%oa3mEl`%3Hca0v_6h{-M$w$==o?_n0-r=5@*jkuIdrn~gq zdE@>h-jSLptJJBQ;IXus+J1Gd(jD*GTrlI_v-;A22AYWaTN7DRMk$MwCdz5Brat=S z1DJP&u(xT6!H&?L)iaH3^EHw31Bi#JWZ%V^pY#SLP}IEwXSSO?1EzHba}PcLyGC;} zfn2+Sy@uJ>LiotP!d({3{)V3wm4nK-D2gWQ$b$a0tI`WQOjq$G6E=sOFgG2Ix*)we z5V2-ZTWVm--U)p{Vw8Zz(**3}0+H(>{~rQMbqGj^{z4kC4n>*y4I%bkqLzP8hkrW= z#dc^K^~NjqBK}?PK%3SkTd4)d$SdR&r%I+=Mm5wZt(*Ey{wmIMOW4KCD|!`ujsD2E zVHI$;CzbfDh)DMgbb~PSYYuski0i~-}%p-Vis5e-n zeVkL~CcRZq4ju^BFeY1R-MzR1Z&8=v#u=^MQ&P#f#ZvB2JDeF z#hpObEQ-C*s%!3kVp7@yMbGy~lufv?NTI?99sQbD?FDbYY(XPrlV@0i__9C8~vmL0*CRfiEf2A!#a zKbULnIc_Yyr zpB)jPzFj~q_0j3Y?s|cuVKGo0)ld-~D#SX)>|e>X%;1V(Vo)(QnY--s?tU>F*wgo9 zhMUEM?mBz58D(VEC4H}+-z;gbawDbMimUoPKY5O7{nU-}6tTPeo1NUMO!afvd~J>3 zeS8+{gTYz{x?w3(4(cp7h*ESt90i73$-!tpCNftg|Cr3|YBy-5U%}68M*Du0J(*7O zB2YMG(a>IL4FgSc$NJ5l=p1q#AuC$tweV-GAQ_xvx_t*%v*uPQ`?m8=$S0RmFKY8V zeLX|8W6D0Fj)osl0p?^L>MUKYry`T)Ut)ox5nJIF1?cxSTJ%-9<|9oP|Q z6WpcuGD|U$66vW<05A27KJ`PZ3s1QqtLi`Z7xbS7$=%U4t0WF~m(pPfGoKnu%v5$> zcZ9f7Mh8oCRa?m~KM?9VUswx&)5-oj_@BPmoMO*#8;J)wJul+_-CVjWe0DxqFO7`) ztw6>=-hdvMtgkn7I){Xua;qoj5vK4u920DydVN|b3b>*Uh*Ppf_U&0OQdbWOlPX~ zl-bW(y_Rv!ROxeFlJ{xleCfi{g=Y#+9hTiUKr1D`aQ9frjS9i8foXwd!FC2ZJG|d9 z@KsBS|IwAJZ*3-mHDbn8#>`?@)O&6VH&zyuW{#C;B4V~(aDmpDnBvT zz0Kq%zg!C+sf^?-Wtb(j0Ld{*-YowrUt?NRU0BYkIsliiK6?knn_w4aS>0riId%qwi=j^=tk!p{S97Epzxr^0w5oE4YTD_w#YXmxopXLNfMPwz4PEs3Ye5UYcI#u<)--xs;O`b@o` zo>X2-O@+pG38QDAMq-YHVhLjtp9BL3ak7xneQAHjKkm5|w2!)eX|Ce;MElzM zclkg0QhD2`v0^1>nK393nRp?7PyF44w1HB_BYUN2DVsedePez7y*aekQaZP!c{GqB zadG@ekQ~Va%?-bET-240o_*eX-dCPPb)0-qz!BQ~#rRJzX|!QoRCDKwr{x1`F;89Z z2X7wKx88VXg9l#babN=sSEnd5<@wT4YLN3xuT!HaSr^T>+92zKoQN@K%kH(~%ua?^ z_Xh_CN(7n)jxq<&rF)If#wl|wID|f&e9M?JjIrl|m|REgR$7dcZY%RN%k$Qo)py9d z#*$>&X%FI-27TBo&Yz2+O0Datvb|GAi#)F;s$r?#V zVKPp{rJ18AC#%>Xm67+#4pZLTN~}CuJ||rfSCL_4M)h<$UlRs4=aG9xTrC$+Q)uUwcqa2^|M3p@e)3fEjMet2SCnh=7O9(PxJ#YNc7Ebb4m1lj_!qV5 zU;WB1L+=^QlO0ZN_Tay;R8o-Ht~ImTADzF2U#T$nGSQ!+ERhRIYd9Sb*-tp z?_5VLr*zQ@d58KU{oj3seRn`86s0eBlpXsHj!sXiwh!VgIjcHW>q@t$xu>SKTp2E< z6n5CZn@>13eh!`w9@kTv_y{}8+(mSs5<>ZmTiUU#2XIKHaTdfG7tLo@DyJD3g0gfi zT~U+1pe^%2^x^XRUiyWsBM08^qj6gp&U~&AbDC!8Is8MMj+5pnx79K9r#GvWl`c{j zVU(kT-duxD-C(>x%cAi!8ocm$I1wvgQ5~SGFo`NSC3DH|tfrZq(Bqjx;`xGaQ#$&e zgXoZcv`*Mxou7q*M7zoANo|y8Hb}&4YF?$VR6uC#+@MR^4KMjDbbJdqHF3glQAys2 zA4e1JZz}zrV`Qiq+}A|bh4k(*LB>u+X~Xq!Vk%@0F|SDfJ&Ey&M!SIWg8{bDr7ON=7D-PTsEW zr+1p$*T%a=YozQJle^EYYG!AHGtszbriWcL9FL)p{;}xpBF=U&&IW%DY)l%G6qA%8 z_)Ra(&*&;%manOm&|s(sy0(pH3fQGcrcUc&1XNc4;=~%St8p0v;;03NXj9cbNbo*b9~#mdmMcwV)WI?{c(t!U~4rHE2W_Dc`o zXSAkvd+WvvZ8^`2s@YLc$)Tm7!fz=m?p|`O{lRL1a!IQb+a-=oe3!T<>2E6VPsUB_ zmUBiJARUnhD}SICSx|l=Cn|4B3Vr)>kUM?_h1`80GYi!Dz4o<@M1A z8BmaSscBC!6-oW({u==jo#x9;10+y$bj z4AJJ&Gf40&VO{;%eKS0V)EK!g9dD5?TqiI)&4s$4$u6Y7J!# zovZcC9cr*+zB;$v*Fr2_r$2*>`CX16JL|{9?lTqmbP%Y0KzXkLqql;7UI{myy#b}j zt%*0{uYJGp{bu}?#EHRW=6(?7Z=Jo z)l%A@=-|bJ-FqdUA~TJqYyMgoBvzAZqQsX$T?e18q*_&plRAs%-KvgAr8Ay&pN35O zlX1|fW?a#0=--2}!Jc|&`g|MYXG*z1~~k^qH}$i{(>dI{b_8qh*+z-sBYKOA2p4h_h=``z>CI1&MYd*d=xb zr|mW8mit)vDn6E0ful>5d&*6vv%+iVmE|`V>sN!9f=j5^s@v<`cj9?DUTLnrqqfc| zwGnnXozQXZN9{S@?hT&H#iesF`S^MmkByy!R9;VUgI|pA+Y_t2ec7JQ)PJDRL##+Q z`8ytXniM7a&;^>s^fQWn^mDR|#cCRl>@DZr;TfnM=3KwdL_u*TQp?o^Ie1wpi;~_0 z<&0VdCSq3YclCe*HicPVGN#n0(AkL-zexYdmxw<#sdG-s-KaKNxrI^9?Pu$D8gPVl zq}S|Tzt#{uWntCA;WQ{rW!}}ElY1Ne<)L;paA#$i2;QI*P)NFl7FaZs{8wmj_qVDM z>m%`Wzv!$*r+qTaES1^GH15_9wv;Xce#rOj9nKt_MO4@VJK2wo#LM)=+cJy(j~YBX zJfNP;)8;zWV0ewA>-iCO+aS6PTXB8q$>}1~a1-2=BvJO#L#c9h6-1Mln+O-Dzb{B`+Nc^025girJP$RnnYk{B_tD4^V?U zOyB*w9m%A1JM+GEbe?Kbb*w@Esk}YN)b%JmDY#FsYL2(_35n7Sb*1NFFBUMzIsms-rR4765syo-7ZF-GddN`V; z_l^EmKIf*JNA$oKt}30R%T+;G3x{S1vzS}LJ26s@hPM!pF6tUNos><8w~v|U^lHIA zaA7kCcj$M_o=#?QkNi>{;c4LQ;XUD*q`gv7$c@lLUg|udtMS%e>a2196M9OCte~u( z#omX$C;mBM@4}vj4GlZ!-|Xwh-dL%YQl3d`#Yw_sbh8C#Ci|gJC~IRHut9hwy3$v9 zq_O~i*5-10GMg~&qlVSe{Kq(KL^6MPW0gkzy_$Gdic*rRyVMhEEpRqFq?5u9XRY;y zZoeLMf-Cidh6I+Vnezdpbwj7T9cwNzX6bRkNd30n%&ck8bMK1xjoE66THdJK;|vCPds0i}dwW;icN0^wvrB5(dPtj(?Hx zPf`hew<*$5z()iQL3x~|`ZK@%o0;83P=T@V&j*2^-S70bMQgdyM_&wrc^hwdFmG*u z&_vFw9q{h+$Az^BzZBNUAK}fTz7r=o&CJ=s3B2QP3F8yrCB+51nUXU}*dolT14#M~VHN zlvWR8roIO(?tj)+_l;CUYwk-3dmQm5nUkzYvbEuT{SQ6a)d>>JbVo)(I6oZuLU8`S zI=hKQ<3WklgEz61PF!`k6K_BXjl|)yu}l{M&GXY}KVP6S%PiGoI{PoZ*MhiN{EAA% z5n-jcMp_Nhy_Nb{{ise?*C?gsj$#@2i?!R>6U+?GW@F;9#12W-!ETJw2N=oCpTSv& zbkRO>vVJleqE>whq|e{Z6A-rliif2Uau$?>Gr+f8qApPT!fn~4WL9R#I-OwwFO9O| z9U^Z6JL(zOt0Q)0&f$I566;Uvuyu)#6-+uGGHY6IsK!(}!FBZA`V=sNZSAsd4Y8)2 zhAOB&9k26RAN6NBpLo&v(^Aa5Wd6y`{T3Yuv9kO^d8C?Zf3*lbG4$Bo>)^PSkTJ!% z2Z+06nQ8v%=5V@OtBnZ#U7%s0Hk>r-F?vKFtS?OLw=<*bVP~?I8Q+4P1Ky;JiN_O+ zglCEU0uyx6I_Jz4ODS`;0p3f#3I09)mi}43U%Z7qPt*mngR>tlD!h<9~R@dkT7fM=kFU zrJ?*%Y$KduPoIHBFjJ2So`4UqO+RgT3V+9FR>8mlpCZ*7gXSgW9Ige!MMp30pl!Y$`A?=QQxhHjy zAsttGYgIitJffz{Rm99ryb%#RometqYW$}7@d^L%{KNI7MyweLF7*L(zD2?Y@c>=+ zfbvmYp*foDInGJjP;IT0mvcxCC|-lU^Jet=HiAwW>1w!m{H;vZZg{$SlY7r;qm-87 zT6>rNEOFWQe6hE`?fG^n=5*Zbgp&cu4B8z9N4$x0Sy`#1m`cb;WxjqSFlt>m8)nKR|+2$@jhaE#Od%JVY_{oJrBuz3rXvRhD>sIa{Bj2 zBep!s{f*EX+l#v3YbL3+?6G**oiYRF96apDp`TbCjKCt0Vj{?kUZ67v(+8bnEMQt$ z+#MutlGmtNU^dpHuK%EoQ?JOH)KLhc(AXN~*(UH5T2smX0avI48125y>-T`8t;J-z ztJTfyYAj+leKz+aM7sp*5<0E0it&gwjNmg5JVBn$yXd5pZpWZpX%bk-@b5*OHg>Fpc#DY^q5 zF}tM5+u^pQRT4m2HG*StNSY4&Z8qw=2f;#2k@853$d^ts>B|gDBooNQHi3Fca}(<% zj!Z0;)IH$SMLMpP+}z?8X}hc_|A2rwA=VJif()9$u4!%Mz#A?W){~9^IgOKY|hbh1mY5E#&`PO;d}G==)|6Z z_j+;bg}sgL!58ZfV?$stirQr$+UYJ_j1FB_`x z$C$5|hacZWEv%M7Nn@>gL%pYN1i9E-87Q}vYJ9?!X9QRO~jOB zai%rhY-udj>*@>i+QvxO`HP%t!hNxXTn$c8XLYpNgYTMw%&!v)9TT*lJc*vs-nHJ= z-X-8B-zhbjIS&<Z>+s(LNA!6&*}NU0)n2hI612XcAb}rBi>ztQvU2(H? zQ(g|w<0{p1B{@>M4LV{s)An(oCQHDHt_TJ^h5d|v#WX%HShc|&79;olAXbydfRFj2 z+UjcXF{|ZF(sVM5_Tb&4&5=fZW0p}ItnVl~Pwj=%q{a#CA0&EduaeWbonFK+ZPi`o6%S7HlgfcAnI^|!}Xv&h}u(xxxa zBmPqC+!!%7+xI7l=Zz6UJ?(s0gpMn5r6_;T^3QJF~D$s;}D!b!_>)edvi2<4sBRtDqu;L5;+K*L~? z-rH*Kj+4f!e(z1+F8mWZ`uciaD$!CE_X3Q9zM!M-28ZLu6K?Ia%j4pGoYQZgG+uft zzM&rJ?G(1_T1U;JChk3U7w3vwP^<&~F+FbJN5#Q{O%G!SPKm#O>66{e;yC#~HPU<1 zci!*#2lzAka(d1vnWeFAayx=r@_2A+@Llkd?i&59hs=!%v-|46Bre3ynnX?D1v`?5 z3Gg0#v~u9BmRnTlLoSAQIh@(#YdGGAn5Yf{gSv^BQHLq*VQ||$K%S2SBfK5VT~}Di z)rFtI_8+lDvVqamrv2@X&J1w+-^6cB-8{?}LaZAFrf&cOqzCCy zrgd7||Ipd*%TuT;N zEc33=PHp3x8U8U@_o&p-nWJ|^y@^anmKfoLhlghmEA6k~E9=eTk+m;4eWifyB7kMM zL>810%-KX7cgB+qoaD@~z;R`?YnjdU27#`LN8(3)zZds7ZvXd&3G0*AB29Qe=%yrk z3WR-$ND;L+JdA4|7@g zgDCi1s))Y60WWHh*jSL<)10`2QO9@nqxv@eU%j-k-Kb{%YyM0xeksaQA?4PzMA1P% z-q$6n^_-lgzk|$QPu(9aOk^Su<+MSmp*MSSqgB-|#sqCKU3pvj2nR1oag~FdbXCcl zVwfz{;wi_0Bw1k$Fjm5{yJ2o5vXyWS!<2SF84PFbU59slA4jB$)@0c4sM}c9THbx1EHJI!TF%AY-2Z{%J z2eJk$>r;)_W|Zx9Ho)}$!}$!#xQn@0zZCeCm?B}(_g--qW4FZSkIVgieSDw9zJYQ2 zB6GdH)?FiRmM^K2x2b<~_~T?(qUt2ilcITwL&;l4H;KF$9`Eydsw&sS%Wh*>cM3>_ zrFMImg(#GYVN6X#S(Q&nsiXp;4U(a>{f{}!sI4~(?g%ssw1Nvckp9^xW4$%s*(kDy?9wXl@_^WFxYvuZJAsgxe{Wk2@jG)pHQokKNh16cjG z@acO9t$9k9q%^pSZ z!M=?nyFW*tey1{6E-HP)@%Jw}J=yKmbb6xke#^&xKW^n>B3KYUVh8YT+fg78h(XoC z16EV!DSMUmN@KDRRZb)M#qa2)_?*5lo?so28KvL^?g1v{cXV}*qqQ+v`2d>j2@}kw zZc4}CtZI)E*b-xsG1=H;JT)?yL(SV}L;6tb?9s%n{p8Ed<^9SRa1zfry{37~d#A(F zvXuJrH1UL+)42cwxrFI6i^J5d1S_&H9SxN}Pb@sT74{r^rTy5hjsjU-6izau16UO< z`8;y?_BgB+q35-dN>Sqe#yKnTpsNgb?Ix_8e%flSm9_vR?G0o?Q@cg%0p@#sYw&!a zd_W8ogo)QZ*q_X?y!8wuM{_YC4MLH5qt@878I6!;@Uq*e%jBYBL1(5hG%5P~sjv4w z9(#Y`ZPmAp-+lh@@$Yo?hi^yNh46QYV`!h_Yvw>wT#w6_kK0(uzDe6q^XHPZn5oTMBy(K)O)O_*)VT`@NFan8*2NT*Q zd`{?^v@F=soaFo^zE{q9O8c{f4~fW|%k{u;)L;@e4_0&@ z-uHED7*p;{D2t>P(}29cE)PziTYD);lMJ2hu^Mt~T0J)H~i=pN#OlHc?eUv2BKj-rD{M1~Cyl+$a=``WW@i zuGT#JGKkLFqfKlscY|8%k3%7 z3imcx_X)f=m3nQnC)RV-Q`%Eii&y%}XT@+~Fzf7ydDe(9_Rx=eqYpRgg4CZ4{u>P% z@dZ4@Kj17Dq7&ExeX6sZHnYK@y{7J1U@tMV>b;Xr#ZQV$ANwLkj@uT$Hn7KPB_;PZ zi zbF~7M;|aGj+^t?p8#?3p)p$9%^p{)GzGd7CE)L`j913L7TbU{8JY-NFX(@c${o})y zh9&yX_#(X-HCNW@aZh&|+9Ro%PQs@+Lv4JXs(+|ik!fZ*xISI23HBRjq~MWy$^Dgg z%5^#>FrLN5?mN4`)ztKEo_ldl;zSg2X24uZnUVIhzF4z}&)=NQxUT(6{xX>k@2{Z!{{j=em_R-phmC{w3=~XefJC|jI-(-| z?Q>3+AKai@!Wwa$)Qz0_lhR$C1sC{|a)VqX0nWu_`w2O3d;L&weDDle*>A=_^xg4< zXHHTcrbK=iHkPyuy~Np~EKXz6bq2gpaW}}!Z~{)oX+cYe(f>K%bj0s7KQS?@93%gN zqdp!6Si+R{?`5pM9C0eZJN5i2L^K_qDU-=!h zds*CI@=+^yWyTbX!o@e-BD%xTDu*6gNxaBXqS3HRz6JYYAs&T2rLJO_@SAhY`eGE- z_XHLueMx+p*e0n>;9_vFQNW-^I=5BwiSQKCx@Cr1{n^D|{Ed@ao#&z%+tg+Jp+al~PI@?fvL46_Giz zdDMZZ^igw@agj513K7be+x z&FuP`z^0^nN#l|#fW~;C&oW!t$=$s|TF@@(lmloe4OWk-S+vbs7f)qx3124vO@E27 zh_L?t{JvqHwrX-2)fT6%-4jkzMbHrOb_V*UCGnX{C&i0H$YJNuCn#)Zv5J`Ujp9aW z&bT~yhAMdW(3|Q&4e^pHzX@kZ z5!T>k=A%jIkW@qS(ghiOQZ7O@URO*eoCN2a#WDloR9}Rq-60#58ju48&q$Vc`PZuZKpD;GM*V@oC~Z#MJ*5 z`?c=3axrsb(|%tYA56%cBm}Mn76gCSuP}`n;+zyp%Inl;o^!s+VRgb|!fQu#j%X8+ zJK|+{*YJJJO9uNsc*)R(zP4Eg6|7}uTI&!M4?08c9O`zj+=KW~$Ftk}#CO$SEv!!1CI3wnTmtl)6G6hf zg-7WTLrxZ3QRT6~VXN+P&WtwHK+izmjz^2KB^6O})>A`#aPyey`B@s8q4VwHp!-+g z!t}`=Y^So5)0eE_OvXX&nAAc!q8`yIc)_Aq zyGhNLR}FwHkAw}d6Rn`7@K&aiL6)%lfZIK7BnXUa_dQsKMVT6!XV zlqRDWcv{%xuBP8xnW$&?oA*^yEf&?){sE}%=l!QN{9Zg#^pES`DR8vT_q-@?;e7zoPk zlhRx5sj6y6Wu^R&q)Ii2ac5C)OGp258a%g+U`+lp4Kt)OvlKV+hry#sZ4#ot=ZUqy zo&7dDrheSb`29(T^)A+I$AD83L~(5^Jf}~>61qsAY{SfmZ;MSPSYdlE7%eded7>XsHgH;DX(^6qW4beq#QzZV>6wGvEaL_ zb2`;Pbz_2(gIsJnp2;%b_nyCG}6{5HTfz!DOoUd~3Autm%`^X1&W;+^Yy-;O5 zj^^turWd8*FEmEwI0`k%+~RVag71;}d_iZol-ra^s==Kf#F=`4?btJ&Furyjx{BM# zd4{rc>!A(XjyifisE_-cz1g_uDJXHd_~Lehc{>QUTabHAPX?6-Ue##u12s_=>jhUV zlsgu3uA-g16Ebq!2;XCGaqkGv9cEFl)otp0 z`k3d)oeF7PwUH=Uwb3$a$JIt?oAw3!`$WEpDsvcK$t_TIBHF2*nBR_nW+%WW%kr+1N#sZudz7SaES@`8`+OdxmQ*4Q7Fn2)^m6mYD= zq`6G6-tt^u3fbvu`Cy4kCFc4t1DP< ztUt(XFQW7G3sLYGCs-U9^j~0RH4zWOz^?=|F&fR8V&b1fkNK=^5Bd?MSRb)4D?Z>K zeO^pYe$tOQe?{pVyc&bk_#zqVAw2R5Iz>>_*o2QB{*)-KK0^U{F1lq&Ff68^AU}!j z#79u}Bhhwy0hT1Bm>+V6o5Jc*=w|g`Ld9;2X+H-{0XP| z4DK~fgK?-`-f?o#{k{gvCI$QF0-Dj$%)xu1ZIuq<{o`7}7Pk^JNiPDd1Krl68{3KhF}M?%*w14=d-iS~l~*15*+`h)K| z4)5^8Fj;D|@*~*Or-*N<#3)c{CqYG5fSLL92PaNNxp_YOuRL$*Cf$Ocx(2MLkV{{36nv`u@bXhoIj#dgGKKh<7}AS;r#7mtd(e9wMO3IL zjbf6siu~{S7U7l1p-R3%UB~GIs zI0pTopPgSp9VRvR=>3HpZ4-rTpmOqovUtj=)dKX-an?%#kaNd4I|rhrQWJdn zPy8Oz_6;cuo9w4ftj*)BW)H3l6=3PshBup=b$K6rK`XA~UuQ3$J@H44a@2W+Phc@l zjh_F%CdU!|m!VO68|A;`cy<)W^B^a>eTnR$b5t|?_!V+gddWw~apn?isokg_haAi9 zQgI3F)@ZZ>gQ!Y}{6?JXA#*9=_i^S9P2HvB6 zx{o(iidg>#z4cgDc4u_H|Kmg%%e`g*({u(kv>{9!tKoXtgn8f*aFt`Y@8Njw)aUz# z)EBSwW`@Gik%VX5$6X>z6kY0WT){j#sS|GON94 zw}&|B^Wej@VCPhV$DE&eW_nOn1wlB@K{KK{?ED-|X5W#cwnEjum)so1ig5WUbF~qm zj!cyQd!ixsH>+tKisYf%-9<~uAwIb;L9y{$0pcAyEq0v1ejYRQ|dl>#u4 zx3Cs}B|q9mT`9vSYmaXEMk3f7B2_N5M?$*BbGe7mX`TfamSe24PSl|pT@A&v2gHXt zM3L&~jg&>nb{;2jQC8>;YJ@1({(tBXPvexWOf;>57UMYl1C|jT`=bS~p_jFRs5Xb6 z{eY9TI^4wRtjIaILJp^f9m=29^G-jYjvDf@Nn{P|VZHSRVbzxCHk&^^uxb? zZ7*llYpS(m_&uo1Zg#TA@`JiL%^fWP3Adm4{*|vwP4^%Z_ZEq2j{C!d<^|7g4<}Ds z-bIpgmk!8k6oa>bnSM%K&rICxh#tohrt9a~`R{O|5SgCjV)wOU*0hV*n@X%jbQ+EZ zc74{xOVmFHu^LLTx;nBR{~=11ARp_=M>l@|iKthQkD}P0%pp-=$z)%168+Y}Z-TN;m)J-zeJ7h)g zs9;0!p&0R@CRb7vRW(1Tz>s^D#lIv6Bc6?q(7wM;6dUT+bn|i!rA7CyE>C(1YcAv) z^POjZiq%(@^J~+O6ECBa#wkub`V(wZ8CJ|Zlu5?2Ix?Ymx1Y863n$xh&M=v;8N>d* z!nM8Nt==Y99ED-OofWf}_!aV|40*a1At&w5Ol}-+s|PV56K)u{$@Ug;;tnTfjUnQRoO?^@?Yom0j1D9lVA;wuIf@5)Ff}A8rH}iBhN8N$22;@8-T{u(QUqUJmee zxtKof;2A1nYEh#;JV-WD32&m13hWs^|0ub_pX`+JASWBL+j5gVmS;`OByUI}VGSTk}bqkruDG3X?gWA%UG+IExuF5_Ny@+SVJ+oZ5^ z)Bf0h4sSjbrJwS%!-#-`So5!hXt6LWsto!I0-gjrV9NLAyS3sePvYO73X$Ne+M_em z8&r1@KIa^tQHS^!ayf4x3iX-yqyc`g7p?nRLf6> z)SWlIfp>79&j@*1+~FKrOT2821H11>)VtR|Jl7cUH)BBEwwv?lj`u z1U?q>UC#171nwy0OO>2c<_LdZ2{oN}U`swasW}bTv$jjXR-J*y#AKdKdDg*WR>^X{ zekoPTX`XA4tScKQYfK!2kIj)=S69LLN4yj=KDS6+W+NQShx^| zGzvn`yeZ!~q`8sE4tPZ5{GT7gCss?yQ8<>*ji#<@&0Ajv@@N@a!PQtZ2goAJv!l`z z!F!P3zG7umWN7XgA=rh|0`b&m-|>5iPMHTa5L zoKH6WwO2f+H=No&{-!d|s68JoSc8>Vd*!HKJMmR(QEk1&9=pnFn#a1T#;y-J$Z14~ zvRuV1BH?442vQRpi;+>}BSIRi&y{eDGcn`YM8s}IrC5j9J(=kK5+qV6W*fpPcl%Lgk znrLuZaTAiS`uH&uwpZ?dc(Lwjdc(pc3da&&ExGi zrV7jHreWP>WBs*eM{VOxDeQm-yu(hs#UiZytL%{0)M23E*i}Q>EjA3K`RLpm0uvVA zgGT)wa#DH7$1AFcPeh%6h(y2h9;=dTh4BtT-hL(@AIKqg^V55gi)3MsCc=xd$V>|G z<_54E_i+UuSt%*lgCXy_Tx1F9iGXSNZ>}G!WdLz#D{Jiuu{{a(K${#Op1ku5x_3eT zl$<)YBD z4>>+Nyw#AioJ<72#m-sG3YoylSjk&`OuR_Nz2)S}1k@j{bH?rE`R(H*y-I8dIW~qI z1C#g&^_N4QegAV?`^*(QB+g&tD~=NZPyXmH-Q_gDP9!_Z_gKSe_y@ar6(_-d-snv} zKjifm@^cJ%mA?HEfu9gzUb447@J17Ggoxq^6(B-YWk=QH4OZseXXf2&Tz|+lFXW^e zaxoOpSP3}`8eE-AZs6hR`dJxXo=yzw@^9|o5cd)CwtmLG{X*<|N)%tu`ftfP$m3?E zqtl2iU^9Cpf%Ot{tPJ^C-6F60pL0=4R$XPTq%wOjTKLLYca$~1hqZr)Gfd>~LitEu zYLO~LoPn&Atv@pTcQBT2puRDiY`s4FzBu<#mt8uR>Fs9r;bzv|7}j>k_dFMCB;>P^ zojsm~|BGUsh1?`VZhWzP1i8DAPj)09sfg#<_=;jw5h3@~0=&0W+_}!x(39t?Z*jlp zIr;zM96H4tyu;te@*P5cwCVWXKGtyPGzeu`l{nd_v%W90=HHTo{tIG$7n6eFM71(p zOE{k!I$i(g!V{`~^Aq*+lapoOT0)MIDf$2E;6Wx(7j61cJ&mE3sKL(5%x7n1--R4r zE3w}5bC(KFFm&!eCg#SlifrE8SFZXJZ)pRW?oz6WJ^#njS-@FUb#45fx-|_mbPt^( zA)V47p&%g$A}I}mARvt(CEZ;jQqqkeAl=8LH9dkgEi~VS z-sUUzhmFj=xy-%u{HzRKdw)EQcC;;kx4Diu+*0hv8#3Ij*()YzS^QS4)f~*AIC{1b zPcjH^pa(Xy2z{Y5H*+!*`qM)j7-wM>%CkdWVs7uob9+PPr2_k0Ri6DBE$NMAiz7A? z$2s`Q)Mp5K<_ zt8A7n$xHtWwaDD`YF#YckJ#0@e2wDY)o5c7KU(;8k+i36);>6i_jF=RWAXTe?$%>Q zz+g@kW+qi&cIKr$$@I2RvpmJuWk%&KqvPgk1({ai6^C{^Y2AVy1DJB$yy z*C=Xw$*W6BIc+`cJB^(q)O6}chnn5>_Q7t!nfi1yJTz1KOOdpmWVgF2eWlK!sa7NN zDm=SYtz*cT3bGX*IK)3E2Dp}$vz67c3Jai07M{o=)<`5wjz^foe`7zOpmp zgdVg|JdI>l7Gxf_Ap*957}{Yxl?BYA5<~=cvrCPHFLWh#&Bgrf%nbj6xtPIPTEW`h z#%!+4D!Ie{XYEaYq^{-zBOy1_n-9D(q-XUac@O8y~o{ zMer&Aj7_S@+?>a{+sui48Q#=5=5TXXvV{#5r}(M({)r_AMFU+_+eGu;jD zaFeIXVD07N4soorSL`?II1`S*YxxPAwhKGr!5XxoKYC)rTVpp$(2Ejnc~9TJ=JRj( zE>x2pM4LSHcr2~SPd^vTvdjhecOkySzAwDXGPJT3KY>Ms-wWL*q5CEjX3O%PSS)uE z_dJciup6K4I5zJIBP+At#`22h`c8UErmY&!nV0L;V!vz4KJo?M8)E+}XI)?Pf`=A` zvb-qKHlZI&;+CtW(PE*H{tnypj=3WAVD+povD*u;>whZO7Q2~Hlod+cLSH#D%O-_$ z%``s!kUd&xdf&&!CDGf$Ye}R>?(v%ke9y#67ss}L%WNCWENjMo5Xp=cyUKlh5TPrQ zm)@v^RjfdpbJ1@?t5|qZLciFbwP%U@T*F$P=SxKK-_m~ZdpE5T%GyF-xClFRQ+(zD z*yV}D_y%#Wl055m=F@C^kO44pjA0i#K#Og5q3U=8-(c-KV?%53=^WhE&l3rMY7(JDi`}y1p?jg>5!un_D%Js1Z?HI*cv|X(1WbU6xPYX{?jEc|-zQCMV z!x>a)J|3ly-L$J6JLk{D8Astwbf*_uGFzL_?{#T!8SXCBcAwDW*Lfll-73LTcj2Tq zH0%8>cvl`;C!R%UXN&JbSKH)!M%H?Jn>9a#8oE$^uFR_veNZr~2QpcU!e&z7$o}|3Btpo(o*I=qD%d)R+x2 z?-!cj9FzWkE{c&CCv2fVkC-1Xq3SKP)5JA}Ius)=4U#7tb#| zDB(kj(F$-UiR(nr2f`D~#=9k=jH&;>*2Eb>sLKDZ4I=*YoH>4oEF2XM{g61D`Rk?(lV+*B!hN zp-lgb>x(rP$DPYCH-*BummUxb+i$a;KR4rBpPAEwIar?e31-i0S#ht!c=NY;m&MF3 z$frML-c`<8wc@lTycD6|F2-4S&vCR?jDBpE#mLV0oIFWPR-e6P7GA=x9cKQXr)@%+ zPDDz|aW!H84BCG?YZYGOIbPGZa@IA4rm4`!6I$ka){_X$U$GMeuvVgngoP6=5N!~% zM<}3Myhqr!0Hf=q4MNRZ`17^c;Y3zLjI+?W7JI=R`sja3r+FBic=}ZM`zB+Wz&aGl z=Hi4PMnjw!Qkh%AXMVs-=w}9LXAGYy%LOo|jh0X_&ppJ95X#&h`XHPZ3e9jY zE!OCNakdg3y7(is-1V&I5$df@`Y%_OjW0)wMds@ZcFN}L|JCWO0^Cnn;#bU`8`!LC z{4MP6d!AREW5m70IZG%A3;kfx3nteVJBQGPS6M^ik7%8+^3JR_3C(t~y9iZuu{uQi zU9>}-YsDIt@N1Kq7s7@=;_pPpOPqXzJb~zyx3uRqwlstP=b#tsvS;?hBL7ItL|EoN zc*jEPssdvXMeimvFK=U;E@2JtX7#doeql3&ofPfP;QBT`iHO$K;)KwaS4(=MB3IAG zyTnOVtbEbVaGqMICkyrSbXq2!T%+aU+$a7PqxpofK7-G7fUgty(!vW6=i>L=DU7>R zrNzBCKTaj8IfGXBr@hsfH&I+$SOp*RAc-dzTFl!yOU=tV`z*&ZKg4zKWzAaQ7l^2~ zIBkm^OGJ1jMqIqY=|`bKpARoUoM%79o>DhOj}&7@=Hn%H!q}|6HimnOaTKEO5PoESR=cq5arC_KNAmEKBD~_6jk##4 zM6~KP^HH3Ruk!az#`GaAdqpcV7$X;-$`kV&4$9)6I9A|7Y;?G(K(7+W*A?#91to-;0$hoS807w)>vIu zS_9$=<++2%h>1VK3X9f@9a#7!iP+8?jKdlBilf93V1CH*UC%NOB8Oa!$n?J2|T5j{wYe^MC`>4JJ3CPau?^3CB*#} z6ZP8070zKfo-<~`kNBT8RcND7!7j(0zrxcS#C|Ch_9`)o?>KdDA>T8LYiwa;o-pU! zygQsHN~hPw+`Y>he#iO}=Yrf>b~b_*XD}kquoU-c`$J})SZgLTN95RBv66;i--cuB zgzxD@4dNWnx1AIFQJ(NQ{h)I9IPMfl|8Z8LwP{&4*1^5q{4|^%6&VBv;~U_2$@Iqm z;&$SGkNLMy;`Z}7Ve=e}ZyHwS5m!IW?B9_U8xZmOZCIl1c!`_np=HDcm+`MXti}YM zrz9(1%#r?_F~8>D6?i@m&z8pP19L6Nd%UdexGd}AW}N+5)-EB-cS+~23f4>PUKXDa z3ep#|M*So`d4ZNZpgnKtnH0uDoYY?M|Jzttu{()Tma!QB)7l=1zdD5V*c^MCi+Pkn z`-G1o;wj=ZCB{t75-AhqpeTbnYFml93T-V$tVU>HT}y2N(9b zB|HBRR(~U|e~;+nxUBQ_4f0kK$OwHP3$Tsee!$Nwlh5nIs;NXC;|>wi{!~dt5orh` zue{oxNsZDO=@&3RZuyd-Lu;f{aswp}X03eEs*n@KyZT0V{aNrKNUC>mfu2Ios4gg;)nv^rczHjA z-K{p25noWnb%K1!53H1}XvjT>x3Ux3%HD9_szgYzQ?lPZCFZ+@G5X0-kb3zTS&=(Sr5*iklp6J=fo^`o zH^zT0@K|qZ-3;ZE14vc{-xZ~KTkk$QLy?<4dUuE8yHL>{Syd3J?wh^iTrGp1tH z`LIE*8}d4Pf^i;1T7q8PD&vTU$Fdika3`rYSgiJt>r>Cs9S87B`f*uE0;Th>d;ryy zQI2``Eb|0>Bsqd}f;aRX=6-uVSn)Wyt+YAR#M-BK4_x(i@)h@23YIe0hn&hC?RS^$ za=IR=cckHVHDd*uMblwX@qx=!?b(jyaPM`3Tk(oqU78l69K_lQ7eEI)JFFZ|b*9$a z*$dqvOL55&j&W#Sy|#*mI!cArFxO&Fjj%mo$G!91J+*(N26kWLSg=oUlD^Me2lsh> zwA|WKS^u57LfXtxyap^2pXs_W-fl15SGH=6oNKkyic5NIz0_BsQ+M7!JXq7*7pkSy zau#v_?(XCINA*bmn9BntGc(ibrWHwVojD+oU=#^$gCV&Ol`A==`k_@Y)lD!5TGddo zC{9i130JuLQ|i;E$fHBQo9*?upcX8mmxK{^m~;S+;&s}4^i0;ld-;ZXZ`uEoFVojK z(3y(L8}!8r=_M5q9f{hmvsRkrV6OU(YN*|;$k)mt^QrgNOnOT$L91L+99+R=jTgc0!QH{rFfBK;3pqAQE99r(zlKRJSRO;>L!+Ki*LZ9= zt!Z|3#|5b%jJ<+YxspJ3l35VFXi8q zs;NcO7NobzY~(K+e63eRmA$-m$28$z*ce<8xJ^A}vj1M7zHS@Otev5TC});ZepK30 zS@6Alhm}`~oOuuFqSS^e=5Am)pHne4RCxi{eq*VZV>wu#X;e#mi|*nZo}e39z5?)f z7PaS6vmR;nuu9qAg;eRLyhUx`?Bfc#Ub;%VUcfUro1S~jj{5^_X7ePfRJ7`@_wKsh zQem6J?uI=GyBU@cRxEsaxHDo<#FmJW5m&=khK0}wk9Q7L8^T#!o)uTsIoy5O`!al3 zWSyugQQt;B3QzUkb-!`e*7B&s;rN)Mq*4EIOudSlR5A5OWxM=@tj8^4){h-^i1wEN zsrn6?CsERq&<`*}F9gG1QvX`7L|yxLc4tQ=`Cs^x8=?_9RPC?SlS@ktiQ+G2-}@3Y z!3nHyfcl!*%4%MVm8Hr$`sXpVMA6iSrJ;P$72d#!)Dc~mHgmU+p#PsTmxEybr>cYD z*KMSL$CsiVCKcmTP%CKwzBnAkh?-da2u_2!K?O`8+x9OQ%~2rxFT=_?m`LU!{DNYk zDfSWTtyvrnh~}WkHyO2HG~R|r$sFGOnZ1HhR#7B1yCzYz|Fe;vN@UJWAZPhf=^n-8?9noFJFsio3Q}#SA&|q zQlDo00q;ezP))cL=b*;18!T=~Fu#|m8Y)2^#|vA|8rGl>9=)@nR`!0giIG?D8LY{U zu}IG_R#;!6q*F^S4o-arwF_UOWi*`Hv6tYkD>5Pt;O1Or??zSqB=vlMqhOwF*P!p) zfE!rN+!+IdKs)$&yiy)?>Y8OKZS=9OS&QuDp?%n`{c=ZT0aX!Cs8%sKZM-G_v5xA; z)zmp`vA-n~xEuVyFj~4C-1I#7ATLT0u*e>!HY5k@Z#3KlM;r^NWou(ip?`{*o6W`6 zO%$r;P>DQTIf9nhKPbY~a2&MjS`Jf#ue^%hQr}L6!VR=Byr5&lnK!TP)_8VR$P~*` zJ=Ssy`eQ9V;zW>Aqrjwl?Rd0P@7iDExAi0!Rgz5CM05itOCw;st`48%Gd!{ZoS|%d z#Rqt`ZFtvcsjeIbzI!M&0dDOT46B#m)G=YsDB&1Np78)ZmIzku5R8U$y&>WtsZsDr{ga}+dE2Xqo%f>D*x8!ZLav?F?Hv2Y;Iq0Y^%{EPlsCyDrcs5UHv zf0&KTf@U+Ak@CO-RgSgd&dPM|z>{}zf|v^ipcLrJvG{3asB!s>c}T7eoXbcMr48|H z|D+D*2^Fek@z#b*k2&!kC8ym6Z}VQL8`zVUFqlrmO5EnGdko}He%8Po5FalbtE6gZ za4m)Rc)7F_4Y)s9J1tP+Xl>oKme~_v*vf;3%x-FOGl)xc3{A2xp&|4s6@%x%x$ zU%^6NRQi#soPwcE*xYZZKNGqOO?m2$RPd~qhJvM<4ia!MxyGmVd$?}4GV=ezjPM)3 z9fh{S8e%QGIpy?a?Z$zMZ$ceFoSY5i6sJ@O-n%^Zm)13y2OQQWi@E~pa!ax5|7H9N zOOx=*TY$|y15&&;yHzVtS7kw*mPZM(9;!W#&}AD$E14h*ilX?pj9lLu&NRh|4?S{}m-sJ+f>zlXa$mQmRQo~{L%rk>!z{VJ<_(%jaeY z7GQ%+^Z@FW0_3ARQ2{sB8bbx#VDibm`F}I3yybu+V?MP*m0*CVM8)%IvjG}y?ZAcA zBpZ5wv$e>yUE(E>vLaKFFYEj%BCL%$t0p;q1QB)?ZvPn6XCA1!dRLvV7FGYiE}xW# zp$pOx<-3>i*UEXN8Wo)<)r;zCIA-sm3Gp|q>1)6|y#xpGJ8NkUn7lP$OjfWbj3Z9a zn%Gnc&V~53yz+7Wti(OPWG@*3mg9HOoIC0FhhVA-Fe`qB8Rwy7!Ms%-9DGe)<>bQ5 zG)+!}UE~4^Gi#Vt)1(=U!ztE#ajfZBI9Uc!qjp(pMWtX~xW%*4hkL-MRpUHA!|{z& zNjBsqux}NDsbL(};kI;@Q(+>t?zgE2cyF~uWvdyHA(5&118oaGw)RIX`B-fE0sh_B zPGF}UXOE=$VL8@;?25e~nQ(R7~!mKGZHdhr9B-70-9xO5s07 zCPvrG{%KsV9DnD?h-(~sC&m?3J^Y2|8`LWgxYxnLbTYbdZ1$Yha+k~VEO&!kE8|LM z8x(oLyWZ7Qd#dzQPAE&LB;D!!()Eq&0$P_|wV6Dh8o&xLXza5Ts#4&4g>8BxHMmOy z6@8D=Q&Lx_=Zw(~vuka`Pwb`SqfYD_*vICe(ApEmm-G51=1P@=7c_x&FgZ82&pHPwsR!B;5vlrriPRnmIHKJI|qZ~)B6@14zEM_o-} zDemGq=?QpJJj*<$JH~A~PiiyaCK!Wq&H&gKhfv3%P&+gd8{C{3It+A7MaTHi9cpyu zS?RDcy*0*A|0|d>FYE912t4{h)Ei$g0!CAF3!I>jt>yMt#AXDVH_S01bdtKUY1RPF z;mhrdp$gIn6thmUXYYemXB_n%x2Qs$C|^>ux&CrLcEhqFw=?gj*L%18S@C<(H>zJP zd+pJ!6OZn_IiFg=T&tGzmJFZky`$Z?|MA^OE||FL<(}u$UL1J+*Si%d8+=h_7e_ti zE`8oft3xH=A?LsDRbeTSO|wPEUCj}j^F-X!Z2v{(@{Z89Ngb(n`q!~Y^?3V4zt8bU zzQjV__`5|~6uOkx7dJPmx2LAM5Z3m8neCPw@67G#8MZupX?V}D4xS^No>DpOzoZ@` z&0$FQP$X_9_izlgwg)F>j!!L>9QJ-t(xmqVK7LFa?zatJ=!EQtJ-ddq$toTEAw&N- z{yoq4cJRA3?@xd1nI7YBr9U%g*x%#jR-?au1|b_ql=ype9lh#(m;iRENAQuagRD7= z4Iu6*T~N!ruZ0zfx)C!rdqVbz>;_zllf18;Ym{u#c<`uuLQSQC%55#L`<2J=Ru5b4 zZSR@n8mA3Wwnyyu4<^B(;`&sqeFieV1qif-;0wB8 zrw`FXJ9&-{_-W_Wrp~*rVV)P>d{n%*hGS?_crVnnJG)PzHT;=6mrBWbN;z1YUcjr_ z*fqs90M@`rXR^APh>;?ZzlAMgFgwFuIH12atKk7fpzJK0(bNHdZ>}|85pC#bji45) zxn-JjP!=CzBIis(=Q>|I)10TA)nP~?U_mM7fZ**R7{NK|Y+ z*uLUYA#iKiVOiRse3VLtW*Oi3^QKq&Smu4xcTe8leOKtiS1DS?PXBe?X*sFgZ)PS0 zQ+yB7U8#4I$A8H4VeN;<$=g#lr|roYz%qNsd(`@KBtQQs&?2l&~w;3IP9me8{S_%k6j5`xY|!{M$N%9 z$71P(Ttc0z{p0)F+nx%bW!b`yV(ki<B{i7lw>}u=ez{ z{|sfoDt<%`Q9Ig9{$BdTafNfyaigYwIj|Nro6Wuo{w0BXD9?0|uBg{sn>`7r(-ctS z>`A`x&)Hr*dU!e-FNKmB{{`^tRS{}a@v#KNaOP_k54rJJxgF6{hu&8d*}XYG#$R{we7n-=tV+PT!#5ee-PS29|d- zv8C>z|I8@;Cx6e(*XbqFUFk#8%Vl^nA7)PRWe}Yl<3HnX5hxPup@)oz)_v5P%P6sG z6WD(H%kv!H+f~iZ#P&9$61rM{$yJl&DCaeIy0>BY-tcDOrNgFrHo8t~InnC$Qjhx@ zwx*E$m+}eEuv7gDF3kR%_E)JMZL`)E8_~w~xobN-f+v+F@W6%4g2v@wli-x#MDBjt z8UuI9c6`2yMA^Q!e=$$$^@DW+htT6GMb-H+c!1l&e;04oHOrXU%_OvOZEV&tvon4P zQN>Vx{L2;O)qy$VIVz^6CBROZxv)fT;S;TH`FR?x3 z6=TVBJ|Rh(hCeMLM-8y#%Zc+}MkV?_EPGW@JTHc~QB_XFTb88xWLOK3C;FBZmWvwY z6P);7v%ma8?bTg;`!C4#;+azS6^BM!AjniI+nnoLV9D4=F!OJy5FJnAJnYj=Q5}(+6 z?Z#woHaLDjb=sxuP>QRa)z4uNs6dpoo%EIC7iy#a;2FAd?)*i1A~#kSYnz;dTvuHW z!411y-{7gHtG)5h55h$~ohaN-=nU6VJj!j@>wZPa`Y)I~+bRDj#fXCarVde^YA zlA43Imfxxcb4w~`=Cj~yCs6lu-EorhTT$@Og+l9KYW2a{A5H}7gFS~h!)?dcoI)S* z+CjZ#w6vRyXkjw4PqAr_`8$E0cuww0pdjuMJu3}<@gGMaA_qs=Nz#@>NkiCET=YV z1<2nQAZ6N+bKHq7JV$)!SFq{X@wfKyj`{yzJ0kHkwK$7?Nq@9p#?&HnseA@afE zdRO_$N#3`UO!msGI+r=*VOR40ll=A_BP4Kx8o6PCh!J^mF@{Ox+yxF#7-xZ0 z$-~cz^8Xw>UlL<+h|yZc{8__i|Di|UkyjVkC_kRxJF>Kipk`M8l;sM! z$fyf6Ul=`=kJwceW<_h-D|)62JXV z9b+M|=^>C<|Euy;u;>E!bw4YcENZz0x>DrN1qw}|Y%-a>0&SO`g|QKz6gZf7e1`KA zvvwcz?HIH00i*0-MhTQi0a_cNExTD&J&6jHpmsDH6=;=+6^bYcyfC7h#+o^twQkX3$Flclw?&5LmMpeN zMTwCUnAv3d_cE*e0KIjDT>l;3A?mdSdg3nsKS0&NMldv6Sk(u3-+9)fs3^P0odsG$ zjLJvuA?C`Bto~X?|4gL%`8QVgUf%nP5pvNJIkV=Tur;}vyYbkhiu6-eW_3BnMc~;4 zLSOV&9s08mn7Zk_rqCnpSv#?`Ra8_7^kp=kY)hYwWA2Zqx}^iZFU<3Z86gle0-K!4 z*nFf_$^32dv;rfUo0q`32|S!YWD10ZumOq8%O^aMurtT_{y#jDK+-m07FS^wJ6Uy) z`T0$H=L7RM7wxY|%PV0uL>;0`4F3-Ow~8n4O0{SiYLdmAYC$x05$K~E*wXvVt);{_ zOA~iG%PzT!2+djBVi)^?pC9KvaQV~A)0uDmu!z6&Ge2x1owDprQ=Z@q@x&_Bn;JxR zn`7a0m@HPp9`%q}v59`Df(3ZUeE*krz9ar8)_!9!6{k6U%Qd=Z6uns5F*1Ya7@k-`aVog^eKc zUy=yjT9`QUN^__VX%)Hx8^t85M@x#cHvAf8;81Hy^mq;ZwF^dooUrDU;(0Gp-!YT@ zH zVi(-OXGiecnXJr5S(R3;u|hpL!wQ?-m**PB>S{-yJOZCnG^?duiT%wX%HE2Rsmw|g zx@MQDH)#*v<^*wvj*R5zoY{vlKKs~T60tW9ekahGk<6s%tQngFn<8+JqV`0fUj(Kl z5Q?XDN8l_O0G8qjj3sAa1+Rc|+7M<;3ijz7E9n#~YAL&46Rc24dS?~>W3-&VOK&29u?kBS|pxw1x-g4H<>TlA9>Chw&RlcHs>%aRYvoP2`AU zr86KIOVKkcsgW-nN+Cva$4(-8(Ui5hmNh+zxXMNNtZot=sBBfmXZ{bh)k}6$X4XM| z-~C-PUDQ9fD= z>+%w`Gxu1R$x_sWE$gO@Z-ynP#)#ekaZ-x&VKK=gJ;hg@&l;YDRlLYt?8t0-FBOH0 z>^mZg9muB?hC%AJbQ#U68N}TyGndX%7xWElFE_nk0!-alEaeOOAQHgbb!OG4=qQY) zo>U5buys2(v+`F)?-?uN4W7>mGCGw(3T48W$zjwsI1M(4nt23)>Jv%`a)^$hv$cMVbX`A&W0DNeZIH4-?X`B=z0G`y&R+wg2YG8ZYR@}i*SvvBLpQR(^NrHRX?>7hj7;yT;0CyghX?xxd%&1D z4bDUp*2F`4JluC5jZcY&eZ%Zj%%kv$H3DJrgK^K8V0O3qlDS$y6=7rfgd9mWRZc7cT_w8;S*CC8Uc^YsgVP#IwC)$8bh}~b z`x$m%6FtEYOv~BfJUN9mdIszIP8bEY*-xmvUk>)|5Atja$?;`i8IDNfsX~{?PTs;= z#Yj!aR-KWkb%aIHE7PY`OhyuM{0=)KYSNQAZTvxRzm`VJ2>|*x5kYI}XklMAyunJo z3F+lh2Yu|GoF{ow^1_eK)Kh6gGBPr=qxkj4zrvpiE-QCt&5Swe)zd#sUy|MwrHG$= zH~fuY>}*edeFn-4=gDlG)J*3`*8PX~>h!)|k!sdJ9y!Sm9JvThbo^-xWc*c1mm@B%gi))uNQ~OkF$LYJV z93>qKb%CdTpRrZH%4k;)jt;&JF3`&wd&!$!L>cF6blr~o+xx;ZqcR3_y8R_RZ$?_i z+suc)J^nU<{b&!}59|(1349Z18R!9%YD%CVeDyQ*LU6WsGd-{_{0Jw1K{9ti(0WH; ze06L6wT;?AZM(KYo2o59IW)g>tFy1GI?BIEo<&~68wp=%aqp+Z1y4A~Xl>P=)Uf`7 zX3R^uyOOR9RFA-M+=b}iY`Fm#gO0WZA89G$EV^x}dKcr4(ZXDU64pX&=)Xo~V+(Aw zkAr97%*+mF=2eu!C&O8pY-lJWwnH;3%GyGts~o<^5uy%TVYS;t8Tc1o^qp4{dyN&OSNZMLmKNjqOGGBq+8c|D{mC6hx+&`-*Dd>U%)>z_=E8^Rm{~Hg)Ja**4Xi= za2?dY(6{Q>j6GIC$7Okt_Lr-zr>Hl-w+YI_3VD*bpfPh1)tN5mSN+;$R|ij56tg>d zzl7nos`GcXv{D}S-UINw@0MGl5qbeW>ObV^QYFVNa5H;}?8jlr;jn-?Rll*tELh!FZ=RgbeL4N?>;xk5*$8fSYMUl_# z=2#88Y*%d5pZ1@jGH7xX*GjnVxHCNiy(PUh;FB##HFcCy2?WO&G~_C2s_V47tT!yI zeArrVC(mlvBJ=`JN+$7cy(9#sQR!AK5A=p+iz6 z>}wmTj4tG87#asx>;dbh)fAp67%`ZG*W_W!b>*q@Ck(8sz;CsXF5@8#g&`nD+8{N8 zU+`0@*-(lg5!0~S2JIqNu2wkefr>FSXJaZBn*z**?p*IA&IK zuBdM#Mu+|BDetc33OdKRwz+@sb`5VF`Bzk@=wQ^eNGoiOd%t?b5pI>%8wOVUiw3p_ zQ;cEuW5+i6Pc)22$^9J1tz-IKf9uR~>BG`$r=3kZmtHh;h;OyOSKwOUc3@ecP9WL; zpZ~SL5j?$avIn5M zv`DWQj0*JfH}W5Wb-fmu-c;*c=zD1udDFdU=*FNAJ3%^#Cw_smMNzEXG3kyhtMOV< zrytJZtFG&=Wv+6r70y&ts(w|UQJ0?xC*)*#8VX-NxrMS(Nm2@+g!}=%+KcR?*TAgw zvFo8~JPdw;1NsBKj*)2WL!qD((ci|fTinMp&VgpaZhckoBI*KN0~Z5Jf}8X!MzZ

~=QvbPu~9{!c`7WLV^dh@T^xMdXjj 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�T86Y42PZF`jU zmHn5)gAVWWuy#?2F&(r2o_%??b%F>S!>|+-H9$JydRL#a!E6-@3@-5#8(PXa**DBd7Lw zbE$POR9U{NmUPLUSZ_=30#A%PQ=6*fmUJ-ZYl+$p0_ncN@tfRE{ac&j+<}I3ac!3p zl0J8AN4st)I+zL6o@SWOEoTTWbE@PnQWv|4wK5aM(VEr@qcgR}%YzN|2}W+~KN}Sd z6tkO43t`htfa|&-=YiUCD>VR$@SyfsPPIDucYHJxzI=Y?QMZSEAHRH2FX_9?q);7? z8I_)GOH6FIPoC-Tlhol^;@u%P7u_6rZ}9VeA8zO283;m z-V<9a=e?Y_bM%S*80`yBayLiYu%RO^bl8?)RGExdkRo+PBjhi3%Xd`7{0iGaF4a;x zp~G9uvC7(|@AL;UNKK{INV}cB-q%&1W-pfg#P`m)ceq}uR~*-kb-q`r^^(iKk9>de zLx0{jPtboG<3lF6R$jWKr`PxWm2(4Z3ZQ*WLce5Ds9#yHFFh3|O* z1ZxA^HkTW1^$x*X=oJ1IJWQ6bf*s*FEfrBb=*BizkHhWoA90K$p$Kr}JMCz25T_jp zQVyl6T1>mHl|^s-0(C(ZL4L=|@zS@BH(=8A&^Ro9yzEqNDP5>Y8>yN~5hYH3;Mj($ z`Z09vvJrc@ZY{Kb2-RVKtHU#VU|(w$s%+=6V)3vq=^NO~t5Ey;tNFS0*7}(|Ye|^x z+mip!jaNE{%vZ=X|k;eEQmt| zZ{Ay(rF2%3L+5~l^>~VCo9_R-GZLuZ|{D%U%e#=UB zBq~2R3%YN(2e^}+bJRIfTf2d=Kaj&e&X>!7I8f7QXn!l!QG22WeA)HJ8L2InuY_`2 zxAlg>-vg%u7lM6^K34xw9ceinAaj+1N)tFy60qAZP=w7xW!`M6qbJ%gQPHZ%+3ya~ z^#=GHnU-!9#v7V}UePhK=0l0gAGNw!9&$+M%-6(sM_6ZxRt^Kbd=)?FDkzo(cyNtj zA~4XaJAl`>66XB}RvEC_g+baj2TxUoQ%MUDDht7j^`%~R8d#x4@X4dajURtP{#_}d z_F!MXkN$0Mc{Tg`X7cQ+^pCVxzN0*%_N9$;GSR6&wUa1%?xa$+D#|Odqn5z3jHt-%3V59*I3q(t$m&snZ@o8bnx%|Y!N2|UG6$ruP3@f$ zma+;ai%}U3{e|>ZW>@0L3+$jdP#@y|I^$Am!ITppPp8DEZ}vUXTZING$DME7+fi$* z?^>u%k(S%d%t#~7m~K`Ny^?deT7}6`M`OxnFO&UpOtUC=_-ywV+AX;&>Z}Fiyy`LM zMo)+EpCXS$DbbChjz-K0E9N=s+^H6a>p=yZ<%O%^nYvC3cg8q(X^HA9WrsXo`W|-Z z7ubis_7JciD~Vu#M!%S5Y1kGvli?538&l^q&**E`ur6AWR)rBR@cf0=KT z?~(7QKNOg#M|0}fZ4c!XFqcexm~B$|ki%H2FVPDaWy~Gc*w6s!bE^6>P#mA&Owm%+ zzc}Glmj;s;?ZTr#4@HwDsW{!2A|Q@J|z^h>Glc*dOCMjcNnv>FTIz2{U0D4VI! z{EL&*H=KsDp;sTFlvbLfl{Ju><49#A+}RU2*G~Zh*b%R}2>6$J@^Vh6t>tB4>qm!r z+rzCyGRQ7!(kI)4LAzW93zkZRFTSw?^GL>=&HehxjCHmYr1Q#=d3 zdA+M$(aIciZAR4ll$Z4%7rg)Jy{8Y1XK&xm$oMtX-LoyaTkQGl{>bjmlE&fW(=QV5 zjlVJT+SfNvJb3WBclt4@P?SG+W}(*c4+_b7{)yV8RQ7j#-|f|+XWu?Q`zAIe&TQ+6 z$#J_-tC9!HTq^yt*oFMNvm5T1P(gp*w7w~Y(=PgUSy#2_$T4w6^Uf;JrQojo&vH+W zZ564wzm^|Zuknmhg3FDfc1fv#`X@TCqdki~@7;g7aymPz>p{h=MWZp^3V?`O8vHRZ z%b)3c=Ii309H^joq~7R(W2wB9y=#X2o#RWYFz;rzNc;KYy$_2&yhvV<`eSC4{>uJZ zdFw3Wx#oH7?&Lfp54PjOUacU# zw|>WO8?HYvn%fJdD%v^s%dmoxEx}~OMZOCQ_dL?}$bryH>nP{I;?_93ouidpOkJ*x zaISQQIq#{TD5zCYTlNv%%&H*GitDrWoY;i==0VP|gRE`V6F5PlnTL0%fzKqTHP+ar zYx=z4h~VMiApK|KI(+n7LwDfPk;&Dzmxeexg{qUOSYWo{o<*qs8ADB2fB7UFEd!}S z>Z?y>@+#mqg zNhLX>mqR<-06$tK^o{)&CvMwRVP#oET<>?l=q*5>4k3G(&Wee%SAlKNSt%Ltll*F> zSRK*1I&JT;yV&=LQVLDlO~xN&v(n7MaFtn(M${v&S4JxbsN8xODr2uRCmRNN(H!O` zYi;PN^g@}dt)pIfu(OgjKSZTxsUo{(_Ce5bzG4ztG%6HyVkk#xPsajYG;|4 zBr5T}$nC5m$MM+y&hc0(2ik5r>YR7+W@eKecxm4y-jQHtvo>-L?}Ueb%@I##{ts|~ z1w$>-+^uhYP9Cux{ZJC@=_0b0Ysd^y1pueXT%xH>tlO}T6mZOgJ3pIx4Snd9^mAwV z3iaIQtqbN?RO@uJuG;fBBXp;R^%~Wn%IwpLTC{Y!CX|E=a)AT&xvppfxBfcaq;cMSl60~ zW^?#7ni5ec2g}6<@WjiAPBZ}FpOLli|I5z55f7p*)+!ln>P<4C9XRiIA-2<$^IZ=x z=AA;*VBtzJhl09V2R~RhduiyF<2gRbJ=o-KONa0(U%`sC0VLul#wFU-z`h>(PTDDN zpm&p~Wr~oeqljG8+G;G(aSHWi`X;htr|iLwr;;fzfD6d2q)MY5{}KJ2X>>t3^FXkp zK8Gl7C48Tv$~IN7sa@5Q)kRd6R&{K)2a&to`hSg`3AAljRii>ND@Q>Nnuce zGy*~ekq8;|LM74{0uq!E#UY3-8WOdzL>W@FqA&`y&;rH5P%MZMQUXc^A(R?Gkv1=Z zG=xB!*T0(o{qi~2+UG{<+;Pv@d+oJm^Ur^-we~(|?^REQc*?=64qdYGEt{Xc_3~}+ z-~JzVd~^HR+wZmQV_VMMeA~v4)vuD@Rlg~IY(3xRLG`PMUnt%mwe82ZJ$2jOTCMv< zTVAyJ$LpTn_t&puZ?4~qo>k|w&#Py=ePGiQ>X$PAXY<=PKfIp8@h|l|)H7?f=n$hEGwYeXz6_P$wBg>w;rvAfq1?8~1QgvMY&i$;~dvX2V_BZSI z>VHsIEIwHGo#d&7TkBWxc}Dh@`gR~I^Sr)(yZ*fTb?fu%_p0x%tGExVD^FL~6_)es z={B#a-!wk9t`Wbpe$BhLuB!h=J#+CDbq(aoLnqc%tY5C*`({O}C)e*|KV0W2r`OYR z-dxY&xyQj9>M1C{ao{IveaFYw4DrWmmB;^H*D(I~f%jGq@;miQqF+Do?)nb=XX@AT zm(;UL4sLkq#y_qndtFq&BK~asR`#sAr{FWikfRSh_~7;XPv5t1_iJuF>E>H+ddk<| zbmM1lJmaQc{^muuUccuN2aeycw|=X!W7FL?-0i?i_Pp+v9pCt&8$Wf!Ki=??8!!IG z2XFnrzUw#q?beSR_OnO)>5*q1`JA2qX~%DEdGm&i2OhikpX%2v7wmn;fv0c0aqI6L ze&tc$e%u)+{N)LsJ^qi5z4)k49)8&NKiPbzjlWa)efx$(8{e?y)!Scj_|7A*KkCaz zUvu=qqaJtU&Yi!uW6#z<-~74y?fk*Q>%1B@PuX-t%?h7d-!T1fJ(J_e%_natC`@N58YV(-!to3br0Qt zRIR0c<^B&G*jjfy-n#Kcn}2`Huh+Mn-`INL*2}j1ZLNE~x1KC>ZasbGshiH(eBqY2 zY<*+>!tng^_Pop$h;gGbkQa2M2b3684uN#9l1!|q!5CZ>!&1 zytl5bee>W?RloD9I;*^_82ZTK>B|m%yvCue^(&7T)j8G?o6bCVpFJ0R^Ve^9*jFBY z)t$d|_b>hERd4&sGro4k&1dcV;)X3-zpuUr`@yX*-}rO;ue|jKZhGeRfA*EPU;PtT zANG}JUAO(~Z@J}n_dRFhOSe7c@Jo+)*^zHK;@rdUw*8r#-+$;2_rG=Tu05}>_0V5? z=zg2GY=7n9=O1}q{aWnl$Gr0BdmQykM||S&7aaEV9sjqUbaDKSzufUFhdu7_+YUc( z=c{%;Yv&gaKec|P_VgVWZ@;d-7ktyUtG8Xa{fr%--tqXuo_pA~!%o`qSM^(oJ)8Dz zxci}ZRS$dS{&V(!p}zOKtiDZhPSFf8G76`u+IJ_x_K)Z?5a;oA$nC&y)9@w&(u!OYLj-yn62=ijnW!|M1G! zf37FvTvb;k|Ga+RdPzO?=qYud!s`z`Yr~`JH}kh_`s2;_-f~fmDHqmV>z}P>%kA9! zfm%8Kwe_vfF*RE5ttU)XF1RttYF!Xw!jurqOfic{O*c zU#;9+EV!)BL!Me!Ixj1ZJ*0ZCuhsYBH`I0JqlPcP~*Asbm)_KZ*tLHL( zcl}EHi~FzG|M9xse(ZsB5ByR6;^jwbF8t-Xr*~u3zO3%(eeuC(AADi0vHYnTZ+@$; zpPW{`)zj-r^1bW#`n&2Z?O*FYs|VFnh(26*Hhh1v=cnqv_~+M3$Y<9tHO{R6N7T0| zrkB`iA-D`gZ)Hnr&RV|D*fwR=){)*}=zF z@A}7emHV{%*5Hlx9r`Qky7a~Ml$(>Q=J{pW8Fg35zFI%$r8RH9pyvA5*LR2ys#*Fw zYDV+AI(}01u-ohE_pa(w9$u@3eyQ%GI%30H>%NF<>yD(4)XIqWuNu4RSFJCv`TGB= zdmnzYusgB7OURuCkFI-SvVPKg>vufgQ}-7ALPo*Rbx_~5Hby4&ic`eyJ2<;&02-3@2g+0AW*^oJ`uFRwh${jOON<2m*B)WYt;b^q## zHR^0FNxRFw>&k-M=XrhINm0*mT)Y2~XVz}3aq!x@!|f9_VqIG2{O>92-%&G$H`d>8 zm+sfr74 zzpb#lrpi89e;=>AnXU0BUK~|p$#<6JXO#~>B%#t^Ca{7g0bdudG7Ub^_P`vt|=@3x{!Wn z#pRN+BP;jS%)40jA1g<8R(8F=GVc7kXX-(9E$AV|rWaStE~$*m8V-k*2VbZw8NXe# zjR)5i%p9t(g9PZM|>pp1BR>WmetEni?A` zZ?3HG)U(3e`-+L5Dv$HT@RQ5OSbu9_bb0Cg)4Jms9w(s^mkJ zC0U;?_duP&axZ|%;?Je&U7nqU2O@${nlUg#Nhhw8KISJ=N+UcR?-BuvQj z{&WBBXG+5-O5aB+=6_Xo|8-d(pYlBCtRImz$Fj}{>vdq&WZqe+H_WnxVr4g^Un8IoqD`Seb;wW{e8VY_tlx$aiu>`wSGYT zpI+O?*S&bD^VMSFRaGl%*lnt^JXJfZQruD{xwkkg#bu?(dz7}*iley?I?qqf$}OL* zxc}W+43hoH`nMK4{;sUaeacxMWOwx;msbpPuXFToJ z%WFMNR%pyx7yHYayp#8N&iRdNp5&?QS>q=wJZvkL&e92lBw^fUOE(`yz81c!9-nC_URtU*+_jlCstU{Ib zD9E#;E6RCFdhUh3XXR$rWVln|5l`zC)WL%PpfN; zStmPBF39ufvl39&Y&@oXJ-vFq@2e5$A;rn>F4VHl(&1GjPdSgzJ8M5rXJ;LZ<7@Ba z;$&9;xlhUe-fHzd)$Z=a*z|qyDr;AMVJ%Wut@VQYN*b%Q+)^Ir2@#i9p8ai&Qy;Ck zWObcnRo1KhbfNIEI`WaK@$uUKT%mVU#VGw~{<5A4&)NTKN!nG|Wo@C{JAY-x;U5ae ztbp<_l_$F@Q?lAnBAmP8b4T~)`rlC=oKPNQ&5f*3bC2@*uC<@_b&fCJ?ozlV=69|* zCw^HY;>%@U?uQP`uBfdmOZwGop4D9y6{}r!{O`+?Kd+wX9ras)zbN~&D%uSdhdgON zYa)EUTK-KPdDq%V`e#-1LuGB&l+GIB+Y95YGIChy+*W2(jR)jDee zZ7xrD7i!m+Md@k2TOdJ0Pp-({wa~gtNj#w}IkN0L zvi7q&Qy7|6Aj8tE?i`e}u2FEmZ;f_8P|s+1QjN@yuKw|i8ddUCi{wRC%*k4gS=a5< z>XotzT-M$TB3Yj%49&`HN3Q)Ru4$F~`Ln)IMw#5_p0yA1Jd3S`Lsn+Xs!qGgtE@S3 zO+{~4u{0dIwmeQe6Vdcld2T|UA(5UjYnWtJs#|J5OxjqoHrBXvu<|%EcbBHDj&z_( zvg%L%Qj3*eZzyZNQW~$V|F4zK>x<)86@Riy`=vETy{AT@zo@Mb7U#p4ta7=xtWJ!g zCu^3af68i2tap-FWYvlsN#Dv^U&mD>(%WT*5FTX>`our)VgI4BKll4zS30uVMOGKe znswn`;+f;S*KCZPSvewocUI2K(+G|#E$L^o`q|}`vFWEiUlM{;<}vBX^Bjdp%c?n9 z2_!AE(#^@Wb$mrEYocUbysS|c4>AKvpBkozuVHl<&3)rx$;lP-d#v?<-&GvCXE7nq zC&(IbdA>zf2~7N5VKyt=+^6bi^{X(Oza!STm^B;2o%G^a*(hrsMkjZuA76E{R&6vV z-?BSKo z&5^z^m}M>C^h~iNSf@|FOX2oyYqhtnap=a1Q<#}G8xzBDBF_|I-I$Fv`eqEw%4`|e z^0bfq?JKrqjjixBYvrY9Nv6ln^lo>n3_PX&POJZ{qnLSV))_mz;=)S4S^qNQbmkeG zt1N8Fzub@X=+4S-S>rA1za?*zBUzCv2xrxij3gUsCYOxL>NM$*!|=_wBNIQew$_d1 zW9A3{T-^NPn(nNi5)02*>p`-T*a;;yYcORriCO6I=<*C(o zgoT;$WCiDIYBb3#B&#UpNd;L6F9@aQxT=n2jkl~dn|}M|@*^W~)_%(B9gLZ|Hh9BY ztE>W&|BU5X(JreP1)I$6BX@rxmesT}<4P^+QYXC?rId3lt+%YTX<4*nO_W3-dE*Oh z1;v`SKALr{GQUYAeaF`L5RWZQjjo%m@jtclLJC{fUOTWjqLr~8P4P1A^-{zm8SJsd zAcrB z^3y1Q8F3nYl7TW(gyd-BNZ#86nm3W#x`QGT;-9#rr|e!2gp!NOHrgUO+lPk6Jhes+ z_WrU?*ZWpmaJ+Mlz9KfxJw3XxuaPyE5~Pu9WJgw#9r+ByQYTRjN;#fa5H;46P)hXiNgwGYBAZs| zbbHLaj(pnEo-7J}{ZB6(B;*b@sF%JE3Hp{eFvr)fu}!S8<~Xv09ucO78p-_V5Zlg> zNNXHt{-ddF8%GpJ`)1(q60BCX(ic8sTc9 zpJfrbi@uzV6ZH}t8wPGst@Z$YGem9ZggrN z{9wEuWp%sG2wBq{Qc8Q^R%c~<;1=G{OUpWsffCxgm(NyW#)v(}-d;$q#0PB9wtQ+8 z<1CzoH`+-Z^k`GYy~vv*({kZlkK2u(S=C;FbFv_7Bkri{1Iz+aZhppzzq;bid+dlhOly~92c8v8VH(x0}VxgriTMns`= zbwtU`Y3a&$TmD2QCDX|9si2TgE)HZ${Z)E5_=#6_bN-Y%%?RVzWzj7Vv=y&fmp+OB-P(;vJr~S0irO zrVVzE3=$D~n(nbiU9#6)9K8zaU@&R~kx0w+PFSc9SffRtU@VOoERxarREBnelvf2} z!_3rWB*kFV4xi+yd$33D#=ex$P92m{6MmUrVu4?MmWviJfJ1PS+3Na!tHsQpvsYPQ zC64;p5ums5yj(kBcKWYXq~aGi_m=%+O4zn7%xMOi5n$D}i*vlfU$@-DCj3HAtYw5l znUlBpAo8A1%D1IWOZn_A6N0t?2)=-?c`sMr+v4RjzTyW*p4l z)Eaw_pxwQSR>7Ls>Cx!da;+y$l*dN$-mA>1Jw_Sy@FNn&Xc%#NB(h;d$@2@!Xw7^2 z4#rh&9(6`XM>>9XZ_;O5jRzKETjY#eO0srrMi*Ng2ct%6jNKSr^CTX1y!8`~ij^`z zR4KNU8J5#F43vfOqT9mIvDIACekAs(m$vXc*FE#Al>9CNnU3aN6K`5Onw4UCY@%$O zUovJpOH3VKV1SQfnSSy~L>w*Ib99MR{+aKlhsWwsUPsl~rjA_27wdOvth0V>jF*;( zJ@FDQl5E|R1bxTvf{8;}px#G14kV_0?TW^z7GLqx5AQ~fC-ZV==KF4IH zc%&U{p#&e0V@YhV_n&3L5hKWFN#={(#~L6X(?Ind5quih>TkC*moi! zXJ?PwE0Gd~5dj$8eU<$cC0yw@o{b$nrFo;=C97zMf7sTuIs8k@G3MBe&&xQqg!~ z;qu*nM?2h?k@5_FYmYW#YwTXm@QB>%dm=q%*o?0z#2R00w~uW}&`^WN^)Ic(L#y?z zC62Zb?MTmY8EBgkM|CJip1|T|4nzXEi?8_QIpBC^)|p68fqx*@$40HlmOUc|*iBvR zjRY;UFYr6&W;52sQl#mB_VlbRh~(6Wb872bD{q^$~ zUT9HU?3PHxbG)~=Ao8h)M{Pw%Wf@Ny;LITBIbGWkS#;nfBS5^xvmU)2f1|(iUgU^S z@XVZuE3`xlIn6eWXfGe4oY{JJzn<&OZw&Ec#dl<*Lkq6)u9dKy=HeUSliB51+c4Ib2MNBOP_tYjP z_A(69gm<v0pGtOh1;ouT0(J*F%+UyHp0eiuTzH=;1S^K5T zF6~SqI(M{hOFd|hmbhSl>l6nO)`v!{w<1d>V7HbUwU#3OU6R~bYSUg=!bnPt!co0Y zI@v`zesE;YCq3k|Bb$s&EclNnYEX~)0;7|;WC~i^6VL;f5eN7p+wqCHdgOHdwrq~W zC>Q)zTj|}LiRwfGY~XCSM~KLpGhJEaa1a^e+x~(f%rF*OzFrHhjt};wj6$&nJ7kr7 zBTM9yc{(3OE_Ox#Xp7sHqR)9emLQE;SYk^~f^=)f!i0%?I3EhE;A zigmyXe?=8MiAv(Z_Y1I-NXT#YW(>hN(HLK7PKh3mTiK2!X^X{vOURi-@Jg;an+-p; zVPq^4;yuha*XS!~)gJR(pzXs|yvRfk<3L&jhsX;G$-!mR#}T8W7qrqAzufZEm~q~M zFJh?=#$EeMjTSbzPHaWIgjwro4oilcI6$)CnqTvHNVT8wY;MP{UZ?zogEx`u_tw{-ehq*_M@qZ>J4W=QF;+dixFbqCIu-UFM)^L=-fZeUlc$Jopg&q6^Q^F8{=oW9asMtl8F& zThv^y9{qmjq`gY}N`#V$<9Mvy^gcx1k zQ9Z>=Fp}Bb60~hcdAKF&_#T^)I7)?sGoPAEGBjr;8@{%6^b3gyEyACcntJ{3$kH{CW;{EqQ<7I?1|ME}XDjzdE{|nqh^@^hBLL?` zLM?hik2A*B?=HN4HXiHkB|DItk2TM&=*Y}y^%VMU^z zZLSbBFJukg5V>Y$>`%*FzZtK~cyBXEcD%7pU$X}T#=IbQUDBHIUoT=W$M9j!vaqC& zyN$2BBZsS7+>@zasU6#>*NDd3F=un6|FI$^9Va87R--hfbhOt*-~Kk@gZ3PVP4>6* zmM9}F9PYDv+Y?{=bVj%MiR5@b+JgTXLG*COGQQYH;jf;i9^1__M{edH)Q?`S@QuAy z>ubH*A_DeRu>edMLFTr4W_)Bo+l?IhJ&r0bc=qUt1bZTSAN4lQ_?G@9+2BjO$GLMD zpIKGsUTTY4qe(62UyieL9Q4YW9a+-|S-WEuABj8o>ACS6k9WLz-#WqPca#J4$S1V+uN+i{yC1O~<|c;hjw15@E45nteJ(S*lt|g-+0HkDcZ3>%NRk!FR{Z< zY+lAP`_{xZwNi6DPVU@Mri_t^&HWNpaWgk!b02GD^gc)NIyT}Ln2O#Q8OyjT*_=Zz zQN~x8-Tg^hp}w5grx!E>v;u285{Xo6v45c?Cy zl(X;Xt{i$ASx+W7YZx(UnP3@--BaV?=#9~^R`&Zf`-I1%r;#K(8C}Nj1Y?(duc*zK zYRQ=Ua=>WOf78#W9!PYb+twO6&nNMF_9(SeF4As|5mDk;ukjZt@(K@9X7t>O6!VL^ zqg?ZntP8TTx3^1F?9v!o5{r)#<00v}M{G`;B4$I;f-22+)EfeH{D7zS(*$ zmnb$;aH$zTUK^QXO&%mGmRUQZ1a|iP_M$L!^mxf(qA%N5kLJkuFPo!p?(fjW^^wf+ z(ry_YW15`jxcmtV(B9s6571kptY@&fy};L4wxxQyT)_-V;7m_5+UYe8qtU*?y&kz_ zsT@R4yc~O7BNT3Dq$WbaffpQ{b7I73K5pEIYPYi7_@`$O${BGaF;yGrqiO7Rb zqdfLiMrO7XpCTQs8!4jBJ2r!AZxeGPk0j0$GdlG>Txmh8*oTkZ7c5KENT$r5j))Nn zJPsl@cQv}l9Bd%-ufSTl0NIWj@S zQ-Y6JF~*RVM3B5>ZaLQB99`zj$YifAbE|R5mc43!&(Zqin0}8oph@Inm$=KC#u{XE z+^rEqy`(%q`p_irT3ZaltlA%~mW)Y1`1fYPMz`kJ6Ex zd`KO74&_wA?LN)@n0#m*@MX*o`yh@)l5q&*A`dKMb?g&`^o1iQ(~fI|{+c-@pckp* zYd!su4QjNDY%sk|?V8uo8!L$qS51wTXC~l3V?QFF_Si3*v?Apo z2JgZM_SqsAf+IOhT+%A9v89&Z(I*j!mRR5N;Hr9CI~I!4*uUTjXMn4-Q7zLSvu(B& z+tF>!K4-^Q%Y!S&$c~6W<<2Z@E+Ku{3*!rZc=nI4_^GemPp*2GI`o-6L+mVU zyHYPPizoiBPM)?-qRH%KJTrqw;Lph0c!`iDu}3-4mva8)QuN8SjHAyrG@;DyR3;BJw-`>8Id2$AUrR#7g94 zn{nGnj*QfD{ECdcf<4-dD&GZ~Da2d(e%b;)wuG4v#C${od(oWt(Q<0X{(ZOq8W#`a zv)T5o;tvmzEb5K898&Y@5xKM)`96}?d4Xp<0>xMvogzB=t!CPQ9^QA%m7=_v`L^UU zb+ZLuvz?cpYdg0em0QbCvKXG2?bs5|$*uL{H6m+du&ept{4ug&VWfjl>Vlsb7&neE zUe9&pwl%w@p3F7}{n$2+E~19+rNzxfkf#?yA9c0JJ+n*P^GQtX!LUs`a#YDYwFpHMWQv01Dp|y_R^B}%51Y2%2^!JgR1qkc9yTF$_ImG zJUV+kPnFT?o~@s4^c85&46V6_$1&!zdO$s}bi4hXy^`C0#;-e?59pI|go~Zq zco6w`ft~A}16e0t_RKzVMTHnP(~!y4OTMFTy?Dwyl2=hQx93l#f~`Cv!b*xP_>fxU zu2P6c_P~#toxh-&s|R^G+hV_^GEYv8ltnM2U+{>9;Hnl;wmkLurzG#%$0t}uzP?Zr zZOKY99q$;`wU{=@YaizO=3#2r1XFC+M{{npQ>*1b^bFbm^ zS`$}mVg#5?}%k0ipQ}{Ot28lh&1@3t?gMxK9clplp4v_)$<;)(_+2& z=$m6tBcvU2U_>v+m@BQu1P|4QPxLrFuEYa;mLs4tVndxVLxPFi!2+a*0pT#m!(G2) zjyzClJk_gz-A><^ErP1;W0m_{`yTsa-N+W1B<~Mt4nc;ynm~ zIekwwU=>lOb!?|c%kR4Loek(Df*?h-y7xk_zS=g|VnG6HoJTElE*3mizX5r z?HWt(MY5wv^d9VnK!H-cz4m1zpj+rWVV5)wnPPStmHL@4)IT9OMWAN^l?JqiG z4eeTK+~hCt5@NpGxYw>E%7jhGqT-|ISoF=Mm#67 zo*{q@Z6c5Vo)N~bWQuss^MTa11co$MlTqTCddP@hL}x?|OC4Q04sg0>dmXVz0W)eN z73;}Byp7iX-!19}>%GI(Pg;YTxkG$bEkFXcb)9hwW(AqmjDo9r-?50i(FY?4&-+MZ z`~3!aOKhyMsu2XovBCJGb9_%;)0a9LcL~~LgSDDP%89;M&5ND_Zmd^^b;dV)-TO55 zEiW><7AzzB&3;&jnn${!7*fvtJ&oSB22MofJyiNtXD9O<4sXDPBWMa=$bop9<0)ysMMMo8O|9tWh1B^R$gxv?Vt?vW z0{)Ti)?6c=+6U+xHEhplCvswr{bWIJkNzk{Og$Fdm{+Nxqp5AFJGK+Mkp*ny75;Wa zv`a>)JBUXI(y0ZyL`0(Q3x2(})_NTSMiXPtYRlp$rb*!3uFd;I~5Y*Ww z7m(Yrn7K}b=(E!=5h>dQQC>?eYLG?Q7YD{+`uXK(jW5I?GMUNR8rw#HmsmSKiIUi9 z=lY+~r%&o^8`jGqkfu)TQIC?qHhaxicoqxV4>Lg2X%{c%t+a}-V(1?2K+67hy!L^V z)Xo;H*6L;pb}C()oiX(I2zSJ)V;t+S$VgFwb!_*0$4r|Ntss%HbhO?!Sd=&z3&$vH z_?epV14P<`(Yn?j#GIA3mtrj5k!e;&Pq!zdW*lh^MvXqm+nNlPGfJFsMRwS;p5JW~ z9=F%j9(!aYIBzCXGndj2Emjw?7&DVdi)(+s5`T!XxTl0yq_>~?ulD8l3DIc;#;7Tm zcI{PkWWG2uLd51zq7zH(OTsk%@k`v>hH)zzjMS=6GlTG4)?>3zM~GLAhkPOidQ22& zDI#oXM+rYi_EFb}gjc~Y*5?S);UwGS9pfQAQF{7#oLHx(nTd?-If@1&?<4d#o9IbP zbkEGj=g3rJ@~ZXBGigT~@o#T~ggjyvgm0pU{?-k~wol#Qjoy~itbvDl@5~WD+D4Oo zg1V7Ol)AQ3jW@RUp0?VqKf!+XUJo5XxlSKT@dwn|Bl|d`g?q9X9kYBQMjQApmpotd zj3d&+sW2g$^Pak%TT>1yax>D!iTcFycAeu;fo-KGq1n;A4LZ=3t^bw85LrP;RRh_(2HVo_2?rf$}0N3_5`a_XWl{<^^g!Is@L{uLoXGSb5uFD#Dab|Qf;T!x6j%N6tht2=htK+QK8&8GBU51*4G~*bW~- zuD55~Ky_K4I^FkRZ@lR-D&rL6OHb?EC1Ch;iQ0il^D0GgmCM@ZLSHLOKSFtd)H;Mz+HvvD7AYig>ev8bqgAxAZN? zne}oVENo-G6vn|ic}`r2I-Kq-2$Q>hwBQBoZL5QSxAps&L=Sd>IXdQ8Iis_$8$D^8 zK}n{9sB&V9T!;-~rDP-4M?eoxtW8^6dY8EZ zVrVpfL{`6v!pMa7C8a^c>x?|vfLI$1V%6gaexOB8scSs89{ytE%uZX^*F`MUpB~Nn z<5qNz?OShKV~i;AJuz?3jg#mQJ@&LA9QNP(kv1}R89y>#si})Jd2eQk4d=}4*@F;& z`?9o>mA*eG^Ei^T?=?E3uguy5*;PVr#FH=mu-Aa~cC>jQS{R-1G=* z$C_Gg=A;I32J8M^bjn9WZ8@{4fXWyF3c}uq&Tw9K6$0!Ey40mRJ}xIBNfc?MO>2=CkRI7zf(7U}-sWv|;39%0|rD zj}5%yHL+!+v)?1nVm-f=PwwhXY>55zO>8L-#$W+?O)X;0JQa=c7@3~oIv0`gqutG} zjx92qMfg9y=NSKymAsE^^0qTkPpm6`Gkf&*cHqkYNL>G{$U2RaD9<>y#@SL3Xgsjh zsLc`WJ=qOsU{oR)zw<3$c*!iVF(Y2|*jOE#z?jG~9=4z2XZ(UDD+V;a*xQIVqUejI z$YCqT>3#XuT~9|G$8D`%tw$`Ev9j&@?b_qjEhV*F{pW}hgV{Lih(_9g6BeYloQFGN zJTg2#R0EZ+e&R<)b(C^Eqa9^1L}4yGCD@+eFW?lDe@y7>(IvEae-zwHgfY znZ7QT)30z09KmONM?z}Hm+|G1NCgKNi=^1M-hc4mNMyk{c(0A4j^18csb?c&Bd4XO z1zAIHN;WrgIo9(o?HYRF5*% zW8ppsDs3(u_uPh$*qT-&YG?{}(T`{P3Zk+dt{FWsSdR;`y19~)=Jq&~!WQ(;mZi*@ zDZXMK9%vi7h+XTAB(g3?nCrE7Icj^e#Cn#utma;@a(pC5f>d7lv?Y6BXzkQ$Y{zX% z$C7TZ=&9Qv; z_OjOiWsW1iCB-@sbIYuWwz=(G!~RJ&!hNMt3OZe;2jZoMj`Dm>hA4qfdoV^O+rB_p zd%(e?qA$|oNo3u#7JX1hL542vX`5mLwnWB=#fWF3EBb7K%@|L;8{36%nYWI=2TXRF zE8r{+L=Df;s8){577*1wA_Kji5g)_I?0fD;n~p2CfPh%huE%(D2;OvE(1O9VF>)Z8 z5q$M(1X+~&V~-~G=C@j80a3z#&;q%R3pMzL%3LQOotu&uksR$Efy4`xoP!#bNbh+_ zY)M__7(`oJjA-}c9lx0mY2mT%C)gUT$8&kz^4q8OC%8~EtzK`{UzNOMF8H*pkqPUum02MuMPJ)8S_fmze9v4Qooy4}JqxmRBy-$I$UrQc zkFl5cu*nr7&>M+iR9+k>OF$_WMnB`}=xOxH3~&)&uu@v~l$eo_^A+r0Q@VJwXSrjo zX+SOPq34U=-3MZsqQ}~?1;)Wp>x`eNFDkT!n|LPT?P0d4&oTU^EbnN_r(9=F0PBNs zk0_vOo8(o{@3=>{QR!=1S_Y#MW9me*ezr`|!5(Um2`~>N(Ay)lBg6P4Zz3M~%>ZI! zHp+=HV&=ILVTAab`FJvNR6Iu?@ePJ`PO42!E!*#UyoZ~#mNY_P!$)32F{c!>3*F8r`9nrC@hGuy8Al-i4kV&ua@uFb&V9E~34NA~JS zr*@uGuMFhJ>$aAy_|Ot#D^l%8BH3{w$iW}tpmbQOE!fp@z<=b*0W&$lM&4;W20=4Gd?~ELyYL>!immk(P*4K z2S{w%eB?3KQMz&*fydvOIlh5=JCKR5wFP8o*Wa)oUxIGX_XhX zQi>dSBbLTvv@flq5p1ZLvSlfCa$N1y5KH>MRiC{AZCu+ot-xl+RFG{fWgJL5?nZN7 z_=Dx?L;5aj;>~yhe`6=3dRnQwky#U1a-A&&Ii;vQc}%GcXe-b%zN-;isVT~$;`yYJ ziBI5459$opvoG+_?^x0Qj2vmL41DMaA$ergSkt4#gPuR_e|;>OInDCdvKvqMb6>Av(?uBN1<6pB{BaIkGkKV~p01 z0Z7DVd>;Lg5jooR*z-MpiC<$!M8g%49Km1ttN{!AjNejPV^g+Fj8+sh30Xn#^eFKD55kXY}%?bcQz z00teOco-HKAFu1eBJ7MeprzgMyvyQW&q{-Y42a~8IsTe$AQ#Q6<)Rubc^OH0JACHgP#%=AzO8B6sTIx3-jRp0@J@TU4kvrv`iEV{^NlE9v zxjOqj+W7BngIxD|`Z1T|5!?jfkq^j^)kdS`jSOo%#-5)xjiU@iYS z9tSBU3;lkDCtL)#lxt=4f^u0zW`RUB6Rkcv`V?)x=;O0TE4Q*Yb8Gacx9x{k(V-5< zjW^yXclJ>J#M4!LqB;5fF-ZG6P8)Ny1Y1I4QIQB3Tc)Ra%{A7f2z!%1wWd=5OS{j?|NkBQsM4s^! z-IkkKT6BVvHI0X#Gc$ra9E$X4HOfW=zUhm6i?`Sn=EbY%MOq|k16yE?#940lk>Z!^ zGk>s|o-+P}J2LeHP3<@AqjqzsOJg0cx#b;2&CD_$i4_)t@aQuZj=t+N(&2+~9ec5k zqH(rv*X|g^et597+S<&aA}cRs1%vGOY|@yw_C&GA{+14#*M$As8y0YcJQ#5qc|?== zOGIJv$dZ2(dOLH7C-u}b<2}x3g7_-Oz@8(`F8M4o<+1G@@s>HN&CIr#Ig2bfj*?Rn zpTI@!L~p`pjy(RkFMGiQzwbWZ`@s9$@4ojv<@5_) z_`H|= None: - try: - async with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening task and cancel after brief demo - # In production, you would typically await connection.start_listening() directly - # which runs until the connection closes or is interrupted - listen_task = asyncio.create_task(connection.start_listening()) - await asyncio.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting - listen_task.cancel() - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/listen/v1/connect/main.py b/examples/listen/v1/connect/main.py deleted file mode 100644 index f4a016c9..00000000 --- a/examples/listen/v1/connect/main.py +++ /dev/null @@ -1,31 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -client = DeepgramClient() - -try: - with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/connect/with_auth_token.py b/examples/listen/v1/connect/with_auth_token.py deleted file mode 100644 index 762498b4..00000000 --- a/examples/listen/v1/connect/with_auth_token.py +++ /dev/null @@ -1,38 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/connect/with_raw_response.py b/examples/listen/v1/connect/with_raw_response.py deleted file mode 100644 index 43c5342b..00000000 --- a/examples/listen/v1/connect/with_raw_response.py +++ /dev/null @@ -1,31 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -client = DeepgramClient() - -try: - with client.listen.v1.with_raw_response.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_file/async.py b/examples/listen/v1/media/transcribe_file/async.py deleted file mode 100644 index 67afb75b..00000000 --- a/examples/listen/v1/media/transcribe_file/async.py +++ /dev/null @@ -1,30 +0,0 @@ -import asyncio -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - # Path to audio file from fixtures - script_dir = os.path.dirname(os.path.abspath(__file__)) - audio_path = os.path.join(script_dir, "..", "..", "..", "..", "fixtures", "audio.wav") - - with open(audio_path, "rb") as audio_file: - audio_data = audio_file.read() - - print("Request sent") - response = await client.listen.v1.media.transcribe_file( - request=audio_data, - model="nova-3", - ) - print("Response received") - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/listen/v1/media/transcribe_file/main.py b/examples/listen/v1/media/transcribe_file/main.py deleted file mode 100644 index da75541d..00000000 --- a/examples/listen/v1/media/transcribe_file/main.py +++ /dev/null @@ -1,26 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - # Path to audio file from fixtures - script_dir = os.path.dirname(os.path.abspath(__file__)) - audio_path = os.path.join(script_dir, "..", "..", "..", "..", "fixtures", "audio.wav") - - with open(audio_path, "rb") as audio_file: - audio_data = audio_file.read() - - print("Request sent") - response = client.listen.v1.media.transcribe_file( - request=audio_data, - model="nova-3", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_file/with_auth_token.py b/examples/listen/v1/media/transcribe_file/with_auth_token.py deleted file mode 100644 index c619b544..00000000 --- a/examples/listen/v1/media/transcribe_file/with_auth_token.py +++ /dev/null @@ -1,33 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - # Path to audio file from fixtures - script_dir = os.path.dirname(os.path.abspath(__file__)) - audio_path = os.path.join(script_dir, "..", "..", "..", "..", "fixtures", "audio.wav") - - with open(audio_path, "rb") as audio_file: - audio_data = audio_file.read() - - print("Request sent") - response = client.listen.v1.media.transcribe_file( - request=audio_data, - model="nova-3", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_file/with_raw_response.py b/examples/listen/v1/media/transcribe_file/with_raw_response.py deleted file mode 100644 index 4eec3ce5..00000000 --- a/examples/listen/v1/media/transcribe_file/with_raw_response.py +++ /dev/null @@ -1,26 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - # Path to audio file from fixtures - script_dir = os.path.dirname(os.path.abspath(__file__)) - audio_path = os.path.join(script_dir, "..", "..", "..", "..", "fixtures", "audio.wav") - - with open(audio_path, "rb") as audio_file: - audio_data = audio_file.read() - - print("Request sent") - response = client.listen.v1.media.with_raw_response.transcribe_file( - request=audio_data, - model="nova-3", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_url/async.py b/examples/listen/v1/media/transcribe_url/async.py deleted file mode 100644 index c86a996e..00000000 --- a/examples/listen/v1/media/transcribe_url/async.py +++ /dev/null @@ -1,22 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - print("Request sent") - response = await client.listen.v1.media.transcribe_url( - model="nova-3", - url="https://dpgr.am/spacewalk.wav", - ) - print("Response received") - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/listen/v1/media/transcribe_url/main.py b/examples/listen/v1/media/transcribe_url/main.py deleted file mode 100644 index 654c148f..00000000 --- a/examples/listen/v1/media/transcribe_url/main.py +++ /dev/null @@ -1,17 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - response = client.listen.v1.media.transcribe_url( - model="nova-3", - url="https://dpgr.am/spacewalk.wav", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_url/with_auth_token.py b/examples/listen/v1/media/transcribe_url/with_auth_token.py deleted file mode 100644 index a90556d3..00000000 --- a/examples/listen/v1/media/transcribe_url/with_auth_token.py +++ /dev/null @@ -1,24 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - print("Request sent") - response = client.listen.v1.media.transcribe_url( - model="nova-3", - url="https://dpgr.am/spacewalk.wav", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v1/media/transcribe_url/with_raw_response.py b/examples/listen/v1/media/transcribe_url/with_raw_response.py deleted file mode 100644 index 1ea08727..00000000 --- a/examples/listen/v1/media/transcribe_url/with_raw_response.py +++ /dev/null @@ -1,17 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - response = client.listen.v1.media.with_raw_response.transcribe_url( - model="nova-3", - url="https://dpgr.am/spacewalk.wav", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/listen/v2/connect/async.py b/examples/listen/v2/connect/async.py deleted file mode 100644 index 43bafcb1..00000000 --- a/examples/listen/v2/connect/async.py +++ /dev/null @@ -1,36 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - async with client.listen.v2.connect(model="flux-general-en", encoding="linear16", sample_rate="16000") as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening task and cancel after brief demo - # In production, you would typically await connection.start_listening() directly - # which runs until the connection closes or is interrupted - listen_task = asyncio.create_task(connection.start_listening()) - await asyncio.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting - listen_task.cancel() - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) - - diff --git a/examples/listen/v2/connect/main.py b/examples/listen/v2/connect/main.py deleted file mode 100644 index bbe23aa4..00000000 --- a/examples/listen/v2/connect/main.py +++ /dev/null @@ -1,33 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -client = DeepgramClient() - -try: - with client.listen.v2.connect(model="flux-general-en", encoding="linear16", sample_rate="16000") as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") - - diff --git a/examples/listen/v2/connect/with_auth_token.py b/examples/listen/v2/connect/with_auth_token.py deleted file mode 100644 index acbbdb9f..00000000 --- a/examples/listen/v2/connect/with_auth_token.py +++ /dev/null @@ -1,40 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - with client.listen.v2.connect(model="flux-general-en", encoding="linear16", sample_rate="16000") as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") - - diff --git a/examples/listen/v2/connect/with_raw_response.py b/examples/listen/v2/connect/with_raw_response.py deleted file mode 100644 index ace1dd8d..00000000 --- a/examples/listen/v2/connect/with_raw_response.py +++ /dev/null @@ -1,33 +0,0 @@ -import threading -import time - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -client = DeepgramClient() - -try: - with client.listen.v2.with_raw_response.connect(model="flux-general-en", encoding="linear16", sample_rate="16000") as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") - - diff --git a/examples/read/v1/text/analyze/async.py b/examples/read/v1/text/analyze/async.py deleted file mode 100644 index d929c051..00000000 --- a/examples/read/v1/text/analyze/async.py +++ /dev/null @@ -1,26 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - print("Request sent") - response = await client.read.v1.text.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True, - ) - print("Response received") - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/read/v1/text/analyze/main.py b/examples/read/v1/text/analyze/main.py deleted file mode 100644 index e2b5345f..00000000 --- a/examples/read/v1/text/analyze/main.py +++ /dev/null @@ -1,21 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - response = client.read.v1.text.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True, - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/read/v1/text/analyze/with_auth_token.py b/examples/read/v1/text/analyze/with_auth_token.py deleted file mode 100644 index b6bc20a7..00000000 --- a/examples/read/v1/text/analyze/with_auth_token.py +++ /dev/null @@ -1,28 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - print("Request sent") - response = client.read.v1.text.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True, - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/read/v1/text/analyze/with_raw_response.py b/examples/read/v1/text/analyze/with_raw_response.py deleted file mode 100644 index e30b81e5..00000000 --- a/examples/read/v1/text/analyze/with_raw_response.py +++ /dev/null @@ -1,21 +0,0 @@ -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - response = client.read.v1.text.with_raw_response.analyze( - request={"text": "Hello, world!"}, - language="en", - sentiment=True, - summarize=True, - topics=True, - intents=True, - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/requirements.txt b/examples/requirements.txt deleted file mode 100644 index ce531c38..00000000 --- a/examples/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -json5 -python-dotenv>=1.0.0 diff --git a/examples/speak/v1/audio/generate/async.py b/examples/speak/v1/audio/generate/async.py deleted file mode 100644 index bbf638a7..00000000 --- a/examples/speak/v1/audio/generate/async.py +++ /dev/null @@ -1,22 +0,0 @@ -import asyncio -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - print("Request sent") - response = client.speak.v1.audio.generate( - text="Hello, this is a sample text to speech conversion.", - ) - print("Response received") - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/speak/v1/audio/generate/main.py b/examples/speak/v1/audio/generate/main.py deleted file mode 100644 index 2c6aabc5..00000000 --- a/examples/speak/v1/audio/generate/main.py +++ /dev/null @@ -1,18 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - response = client.speak.v1.audio.generate( - text="Hello, this is a sample text to speech conversion.", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/speak/v1/audio/generate/with_auth_token.py b/examples/speak/v1/audio/generate/with_auth_token.py deleted file mode 100644 index bcd896a9..00000000 --- a/examples/speak/v1/audio/generate/with_auth_token.py +++ /dev/null @@ -1,25 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - print("Request sent") - response = client.speak.v1.audio.generate( - text="Hello, this is a sample text to speech conversion.", - ) - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/speak/v1/audio/generate/with_raw_response.py b/examples/speak/v1/audio/generate/with_raw_response.py deleted file mode 100644 index 9de6f440..00000000 --- a/examples/speak/v1/audio/generate/with_raw_response.py +++ /dev/null @@ -1,18 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import DeepgramClient - -client = DeepgramClient() - -try: - print("Request sent") - with client.speak.v1.audio.with_raw_response.generate( - text="Hello, this is a sample text to speech conversion.", - ) as response: - print("Response received") -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/speak/v1/connect/async.py b/examples/speak/v1/connect/async.py deleted file mode 100644 index 4439308f..00000000 --- a/examples/speak/v1/connect/async.py +++ /dev/null @@ -1,45 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -client = AsyncDeepgramClient() - -async def main() -> None: - try: - async with client.speak.v1.connect(model="aura-2-asteria-en", encoding="linear16", sample_rate=24000) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening task and cancel after brief demo - # In production, you would typically await connection.start_listening() directly - # which runs until the connection closes or is interrupted - listen_task = asyncio.create_task(connection.start_listening()) - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - print("Send Flush message") - await connection.send_control(SpeakV1ControlMessage(type="Flush")) - print("Send Close message") - await connection.send_control(SpeakV1ControlMessage(type="Close")) - - await asyncio.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting - listen_task.cancel() - except Exception as e: - print(f"Caught: {e}") - -asyncio.run(main()) diff --git a/examples/speak/v1/connect/main.py b/examples/speak/v1/connect/main.py deleted file mode 100644 index 6e7710c8..00000000 --- a/examples/speak/v1/connect/main.py +++ /dev/null @@ -1,43 +0,0 @@ - -from dotenv import load_dotenv - -load_dotenv() - -import threading -import time - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -client = DeepgramClient() - -try: - with client.speak.v1.connect(model="aura-2-asteria-en", encoding="linear16", sample_rate=24000) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - print("Send Flush message") - connection.send_control(SpeakV1ControlMessage(type="Flush")) - print("Send Close message") - connection.send_control(SpeakV1ControlMessage(type="Close")) - - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/speak/v1/connect/with_auth_token.py b/examples/speak/v1/connect/with_auth_token.py deleted file mode 100644 index d39d134c..00000000 --- a/examples/speak/v1/connect/with_auth_token.py +++ /dev/null @@ -1,50 +0,0 @@ - -from dotenv import load_dotenv - -load_dotenv() - -import threading -import time - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -try: - # Using access token instead of API key - authClient = DeepgramClient() - - print("Request sent") - authResponse = authClient.auth.v1.tokens.grant() - print("Response received") - - client = DeepgramClient(access_token=authResponse.access_token) - - with client.speak.v1.connect(model="aura-2-asteria-en", encoding="linear16", sample_rate=24000) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - print("Send Flush message") - connection.send_control(SpeakV1ControlMessage(type="Flush")) - print("Send Close message") - connection.send_control(SpeakV1ControlMessage(type="Close")) - - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/examples/speak/v1/connect/with_raw_response.py b/examples/speak/v1/connect/with_raw_response.py deleted file mode 100644 index 838eaaa0..00000000 --- a/examples/speak/v1/connect/with_raw_response.py +++ /dev/null @@ -1,43 +0,0 @@ - -from dotenv import load_dotenv - -load_dotenv() - -import threading -import time - -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -client = DeepgramClient() - -try: - with client.speak.v1.with_raw_response.connect(model="aura-2-asteria-en", encoding="linear16", sample_rate=24000) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # EXAMPLE ONLY: Start listening in a background thread for demo purposes - # In production, you would typically call connection.start_listening() directly - # which blocks until the connection closes, or integrate into your async event loop - threading.Thread(target=connection.start_listening, daemon=True).start() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - print("Send Flush message") - connection.send_control(SpeakV1ControlMessage(type="Flush")) - print("Send Close message") - connection.send_control(SpeakV1ControlMessage(type="Close")) - - time.sleep(3) # EXAMPLE ONLY: Wait briefly to see some events before exiting -except Exception as e: - print(f"Caught: {e}") diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 3806ff37..00000000 --- a/mypy.ini +++ /dev/null @@ -1,3 +0,0 @@ -[mypy] -plugins = pydantic.mypy -exclude = examples/.* diff --git a/poetry.lock b/poetry.lock index 7b42b5ff..88167ca9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -38,13 +38,13 @@ trio = ["trio (>=0.26.1)"] [[package]] name = "certifi" -version = "2025.10.5" +version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" files = [ - {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, - {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, + {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, + {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 31a5535b..74873a64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,9 @@ [project] name = "deepgram-sdk" -dynamic = ["version"] [tool.poetry] name = "deepgram-sdk" -version = "5.3.0" +version = "5.3.1" description = "" readme = "README.md" authors = [] @@ -26,11 +25,13 @@ classifiers = [ "Operating System :: Microsoft :: Windows", "Topic :: Software Development :: Libraries :: Python Modules", "Typing :: Typed", - "License :: OSI Approved :: MIT License", + "License :: OSI Approved :: MIT License" +] +packages = [ + { include = "deepgram", from = "src"} ] -packages = [{ include = "deepgram", from = "src" }] -[project.urls] +[tool.poetry.urls] Repository = 'https://github.com/deepgram/deepgram-python-sdk' [tool.poetry.dependencies] @@ -50,7 +51,7 @@ types-python-dateutil = "^2.9.0.20240316" ruff = "==0.11.5" [tool.pytest.ini_options] -testpaths = ["tests"] +testpaths = [ "tests" ] asyncio_mode = "auto" [tool.mypy] @@ -61,20 +62,20 @@ line-length = 120 [tool.ruff.lint] select = [ - "E", # pycodestyle errors - "F", # pyflakes - "I", # isort + "E", # pycodestyle errors + "F", # pyflakes + "I", # isort ] ignore = [ - "E402", # Module level import not at top of file - "E501", # Line too long - "E711", # Comparison to `None` should be `cond is not None` - "E712", # Avoid equality comparisons to `True`; use `if ...:` checks - "E721", # Use `is` and `is not` for type comparisons, or `isinstance()` for insinstance checks - "E722", # Do not use bare `except` - "E731", # Do not assign a `lambda` expression, use a `def` - "F821", # Undefined name - "F841", # Local variable ... is assigned to but never used + "E402", # Module level import not at top of file + "E501", # Line too long + "E711", # Comparison to `None` should be `cond is not None` + "E712", # Avoid equality comparisons to `True`; use `if ...:` checks + "E721", # Use `is` and `is not` for type comparisons, or `isinstance()` for insinstance checks + "E722", # Do not use bare `except` + "E731", # Do not assign a `lambda` expression, use a `def` + "F821", # Undefined name + "F841" # Local variable ... is assigned to but never used ] [tool.ruff.lint.isort] diff --git a/reference.md b/reference.md index 54899f1e..8e7fcede 100644 --- a/reference.md +++ b/reference.md @@ -163,6 +163,41 @@ client = DeepgramClient( api_key="YOUR_API_KEY", ) client.listen.v1.media.transcribe_url( + callback="callback", + callback_method="POST", + extra="extra", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding="linear16", + filler_words=True, + keywords="keywords", + language="language", + measurements=True, + model="nova-3", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact="redact", + replace="replace", + search="search", + smart_format=True, + utterances=True, + utt_split=1.1, + version="latest", + mip_opt_out=True, url="https://dpgr.am/spacewalk.wav", ) @@ -877,7 +912,9 @@ from deepgram import DeepgramClient client = DeepgramClient( api_key="YOUR_API_KEY", ) -client.manage.v1.models.list() +client.manage.v1.models.list( + include_outdated=True, +) ``` @@ -1078,6 +1115,8 @@ client = DeepgramClient( ) client.manage.v1.projects.get( project_id="123456-7890-1234-5678-901234", + limit=1.1, + page=1.1, ) ``` @@ -1383,6 +1422,7 @@ client = DeepgramClient( ) client.manage.v1.projects.keys.list( project_id="123456-7890-1234-5678-901234", + status="active", ) ``` @@ -1849,6 +1889,7 @@ client = DeepgramClient( ) client.manage.v1.projects.models.list( project_id="123456-7890-1234-5678-901234", + include_outdated=True, ) ``` @@ -2000,6 +2041,8 @@ Generates a list of requests for a specific project

```python +import datetime + from deepgram import DeepgramClient client = DeepgramClient( @@ -2007,8 +2050,20 @@ client = DeepgramClient( ) client.manage.v1.projects.requests.list( project_id="123456-7890-1234-5678-901234", + start=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + end=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + limit=1.1, + page=1.1, accessor="12345678-1234-1234-1234-123456789012", request_id="12345678-1234-1234-1234-123456789012", + deployment="hosted", + endpoint="listen", + method="sync", + status="succeeded", ) ``` @@ -2239,10 +2294,50 @@ client = DeepgramClient( ) client.manage.v1.projects.usage.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) ``` @@ -2816,7 +2911,10 @@ client = DeepgramClient( ) client.manage.v1.projects.billing.breakdown.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + deployment="hosted", tag="tag1", line_item="streaming::nova-3", ) @@ -2951,6 +3049,8 @@ client = DeepgramClient( ) client.manage.v1.projects.billing.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) ``` @@ -3038,6 +3138,7 @@ client = DeepgramClient( ) client.manage.v1.projects.billing.purchases.list( project_id="123456-7890-1234-5678-901234", + limit=1.1, ) ``` @@ -3523,10 +3624,51 @@ client = DeepgramClient( ) client.manage.v1.projects.usage.breakdown.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", + grouping="accessor", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) ``` @@ -3958,6 +4100,8 @@ client = DeepgramClient( ) client.manage.v1.projects.usage.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) ``` @@ -4044,6 +4188,18 @@ client = DeepgramClient( api_key="YOUR_API_KEY", ) client.read.v1.text.analyze( + callback="callback", + callback_method="POST", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + language="language", request={"url": "url"}, ) diff --git a/scripts/run_examples.sh b/scripts/run_examples.sh deleted file mode 100755 index 329a9504..00000000 --- a/scripts/run_examples.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash - -# Check for DEEPGRAM_API_KEY in environment or .env file -if [ -z "$DEEPGRAM_API_KEY" ] && [ ! -f .env ] || ([ -f .env ] && ! grep -q "DEEPGRAM_API_KEY" .env); then - echo "❌ DEEPGRAM_API_KEY not found in environment variables or .env file" - echo "Please set up your Deepgram API key before running examples" - echo "You can:" - echo " 1. Export it: export DEEPGRAM_API_KEY=your_key_here" - echo " 2. Add it to a .env file: echo 'DEEPGRAM_API_KEY=your_key_here' > .env" - exit 1 -fi - -echo "βœ… DEEPGRAM_API_KEY found, proceeding with examples..." -echo "" - - -echo "✨✨✨✨ Running speak/v1/audio/generate/ examples ✨✨✨✨" - -echo "Running speak/v1/audio/generate/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/audio/generate/main.py -echo "Running speak/v1/audio/generate/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/audio/generate/async.py -echo "Running speak/v1/audio/generate/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/audio/generate/with_raw_response.py -echo "Running speak/v1/audio/generate/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/audio/generate/with_auth_token.py - -echo "✨✨✨✨ Running speak/v1/connect/ examples ✨✨✨✨" - -echo "Running speak/v1/connect/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/connect/main.py -echo "Running speak/v1/connect/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/connect/async.py -echo "Running speak/v1/connect/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/connect/with_raw_response.py -echo "Running speak/v1/connect/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/speak/v1/connect/with_auth_token.py - -echo "✨✨✨✨ Running read/v1/text/analyze/ examples ✨✨✨✨" - -echo "Running read/v1/text/analyze/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/read/v1/text/analyze/main.py -echo "Running read/v1/text/analyze/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/read/v1/text/analyze/async.py -echo "Running read/v1/text/analyze/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/read/v1/text/analyze/with_raw_response.py -echo "Running read/v1/text/analyze/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/read/v1/text/analyze/with_auth_token.py - -echo "✨✨✨✨ Running listen/v1/connect/ examples ✨✨✨✨" - -echo "Running listen/v1/connect/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/connect/main.py -echo "Running listen/v1/connect/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/connect/async.py -echo "Running listen/v1/connect/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/connect/with_raw_response.py -echo "Running listen/v1/connect/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/connect/with_auth_token.py - -echo "✨✨✨✨ Running listen/v1/media/transcribe_file/ examples ✨✨✨✨" - -echo "Running listen/v1/media/transcribe_file/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_file/main.py -echo "Running listen/v1/media/transcribe_file/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_file/async.py -echo "Running listen/v1/media/transcribe_file/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_file/with_raw_response.py -echo "Running listen/v1/media/transcribe_file/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_file/with_auth_token.py - -echo "✨✨✨✨ Running listen/v1/media/transcribe_url/ examples ✨✨✨✨" - -echo "Running listen/v1/media/transcribe_url/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_url/main.py -echo "Running listen/v1/media/transcribe_url/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_url/async.py -echo "Running listen/v1/media/transcribe_url/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_url/with_raw_response.py -echo "Running listen/v1/media/transcribe_url/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v1/media/transcribe_url/with_auth_token.py - -echo "✨✨✨✨ Running listen/v2/connect/ examples ✨✨✨✨" - -echo "Running listen/v2/connect/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v2/connect/main.py -echo "Running listen/v2/connect/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v2/connect/async.py -echo "Running listen/v2/connect/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v2/connect/with_raw_response.py -echo "Running listen/v2/connect/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/listen/v2/connect/with_auth_token.py - -echo "✨✨✨✨ Running agent/v1/connect/ examples ✨✨✨✨" - -echo "Running agent/v1/connect/main.py" -DEEPGRAM_DEBUG=1 poetry run python examples/agent/v1/connect/main.py -echo "Running agent/v1/connect/async.py" -DEEPGRAM_DEBUG=1 poetry run python examples/agent/v1/connect/async.py -echo "Running agent/v1/connect/with_raw_response.py" -DEEPGRAM_DEBUG=1 poetry run python examples/agent/v1/connect/with_raw_response.py -echo "Running agent/v1/connect/with_auth_token.py" -DEEPGRAM_DEBUG=1 poetry run python examples/agent/v1/connect/with_auth_token.py \ No newline at end of file diff --git a/src/deepgram/agent/__init__.py b/src/deepgram/agent/__init__.py index 148ad154..40acb778 100644 --- a/src/deepgram/agent/__init__.py +++ b/src/deepgram/agent/__init__.py @@ -7,7 +7,445 @@ if typing.TYPE_CHECKING: from . import v1 -_dynamic_imports: typing.Dict[str, str] = {"v1": ".v1"} + from .v1 import ( + AgentV1AgentAudioDone, + AgentV1AgentAudioDoneParams, + AgentV1AgentStartedSpeaking, + AgentV1AgentStartedSpeakingParams, + AgentV1AgentThinking, + AgentV1AgentThinkingParams, + AgentV1ConversationText, + AgentV1ConversationTextParams, + AgentV1ConversationTextRole, + AgentV1Error, + AgentV1ErrorParams, + AgentV1FunctionCallRequest, + AgentV1FunctionCallRequestFunctionsItem, + AgentV1FunctionCallRequestFunctionsItemParams, + AgentV1FunctionCallRequestParams, + AgentV1InjectAgentMessage, + AgentV1InjectAgentMessageParams, + AgentV1InjectUserMessage, + AgentV1InjectUserMessageParams, + AgentV1InjectionRefused, + AgentV1InjectionRefusedParams, + AgentV1KeepAlive, + AgentV1KeepAliveParams, + AgentV1PromptUpdated, + AgentV1PromptUpdatedParams, + AgentV1ReceiveFunctionCallResponse, + AgentV1ReceiveFunctionCallResponseParams, + AgentV1SendFunctionCallResponse, + AgentV1SendFunctionCallResponseParams, + AgentV1Settings, + AgentV1SettingsAgent, + AgentV1SettingsAgentContext, + AgentV1SettingsAgentContextMessagesItem, + AgentV1SettingsAgentContextMessagesItemContent, + AgentV1SettingsAgentContextMessagesItemContentParams, + AgentV1SettingsAgentContextMessagesItemContentRole, + AgentV1SettingsAgentContextMessagesItemFunctionCalls, + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem, + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams, + AgentV1SettingsAgentContextMessagesItemFunctionCallsParams, + AgentV1SettingsAgentContextMessagesItemParams, + AgentV1SettingsAgentContextParams, + AgentV1SettingsAgentListen, + AgentV1SettingsAgentListenParams, + AgentV1SettingsAgentListenProvider, + AgentV1SettingsAgentListenProviderParams, + AgentV1SettingsAgentParams, + AgentV1SettingsAgentSpeak, + AgentV1SettingsAgentSpeakEndpoint, + AgentV1SettingsAgentSpeakEndpointEndpoint, + AgentV1SettingsAgentSpeakEndpointEndpointParams, + AgentV1SettingsAgentSpeakEndpointParams, + AgentV1SettingsAgentSpeakEndpointProvider, + AgentV1SettingsAgentSpeakEndpointProviderAwsPolly, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, + AgentV1SettingsAgentSpeakEndpointProviderCartesia, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams, + AgentV1SettingsAgentSpeakEndpointProviderDeepgram, + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, + AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabs, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProviderOpenAi, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, + AgentV1SettingsAgentSpeakEndpointProviderParams, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakEndpointProvider_Cartesia, + AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams, + AgentV1SettingsAgentSpeakEndpointProvider_Deepgram, + AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAi, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams, + AgentV1SettingsAgentSpeakItem, + AgentV1SettingsAgentSpeakItemEndpoint, + AgentV1SettingsAgentSpeakItemEndpointParams, + AgentV1SettingsAgentSpeakItemParams, + AgentV1SettingsAgentSpeakItemProvider, + AgentV1SettingsAgentSpeakItemProviderAwsPolly, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType, + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, + AgentV1SettingsAgentSpeakItemProviderAwsPollyParams, + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, + AgentV1SettingsAgentSpeakItemProviderCartesia, + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, + AgentV1SettingsAgentSpeakItemProviderCartesiaParams, + AgentV1SettingsAgentSpeakItemProviderCartesiaVoice, + AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams, + AgentV1SettingsAgentSpeakItemProviderDeepgram, + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, + AgentV1SettingsAgentSpeakItemProviderDeepgramParams, + AgentV1SettingsAgentSpeakItemProviderElevenLabs, + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, + AgentV1SettingsAgentSpeakItemProviderElevenLabsParams, + AgentV1SettingsAgentSpeakItemProviderOpenAi, + AgentV1SettingsAgentSpeakItemProviderOpenAiModel, + AgentV1SettingsAgentSpeakItemProviderOpenAiParams, + AgentV1SettingsAgentSpeakItemProviderOpenAiVoice, + AgentV1SettingsAgentSpeakItemProviderParams, + AgentV1SettingsAgentSpeakItemProvider_AwsPolly, + AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakItemProvider_Cartesia, + AgentV1SettingsAgentSpeakItemProvider_CartesiaParams, + AgentV1SettingsAgentSpeakItemProvider_Deepgram, + AgentV1SettingsAgentSpeakItemProvider_DeepgramParams, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabs, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakItemProvider_OpenAi, + AgentV1SettingsAgentSpeakItemProvider_OpenAiParams, + AgentV1SettingsAgentSpeakParams, + AgentV1SettingsAgentThink, + AgentV1SettingsAgentThinkContextLength, + AgentV1SettingsAgentThinkContextLengthParams, + AgentV1SettingsAgentThinkEndpoint, + AgentV1SettingsAgentThinkEndpointParams, + AgentV1SettingsAgentThinkFunctionsItem, + AgentV1SettingsAgentThinkFunctionsItemEndpoint, + AgentV1SettingsAgentThinkFunctionsItemEndpointParams, + AgentV1SettingsAgentThinkFunctionsItemParams, + AgentV1SettingsAgentThinkParams, + AgentV1SettingsAgentThinkProvider, + AgentV1SettingsAgentThinkProviderCredentials, + AgentV1SettingsAgentThinkProviderCredentialsCredentials, + AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams, + AgentV1SettingsAgentThinkProviderCredentialsCredentialsType, + AgentV1SettingsAgentThinkProviderCredentialsModel, + AgentV1SettingsAgentThinkProviderCredentialsParams, + AgentV1SettingsAgentThinkProviderModel, + AgentV1SettingsAgentThinkProviderModelParams, + AgentV1SettingsAgentThinkProviderParams, + AgentV1SettingsAgentThinkProviderThree, + AgentV1SettingsAgentThinkProviderThreeModel, + AgentV1SettingsAgentThinkProviderThreeParams, + AgentV1SettingsAgentThinkProviderTwo, + AgentV1SettingsAgentThinkProviderTwoModel, + AgentV1SettingsAgentThinkProviderTwoParams, + AgentV1SettingsAgentThinkProviderZero, + AgentV1SettingsAgentThinkProviderZeroModel, + AgentV1SettingsAgentThinkProviderZeroParams, + AgentV1SettingsApplied, + AgentV1SettingsAppliedParams, + AgentV1SettingsAudio, + AgentV1SettingsAudioInput, + AgentV1SettingsAudioInputEncoding, + AgentV1SettingsAudioInputParams, + AgentV1SettingsAudioOutput, + AgentV1SettingsAudioOutputEncoding, + AgentV1SettingsAudioOutputParams, + AgentV1SettingsAudioParams, + AgentV1SettingsFlags, + AgentV1SettingsFlagsParams, + AgentV1SettingsParams, + AgentV1SpeakUpdated, + AgentV1SpeakUpdatedParams, + AgentV1UpdatePrompt, + AgentV1UpdatePromptParams, + AgentV1UpdateSpeak, + AgentV1UpdateSpeakParams, + AgentV1UpdateSpeakSpeak, + AgentV1UpdateSpeakSpeakEndpoint, + AgentV1UpdateSpeakSpeakEndpointParams, + AgentV1UpdateSpeakSpeakParams, + AgentV1UpdateSpeakSpeakProvider, + AgentV1UpdateSpeakSpeakProviderAwsPolly, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType, + AgentV1UpdateSpeakSpeakProviderAwsPollyEngine, + AgentV1UpdateSpeakSpeakProviderAwsPollyParams, + AgentV1UpdateSpeakSpeakProviderAwsPollyVoice, + AgentV1UpdateSpeakSpeakProviderCartesia, + AgentV1UpdateSpeakSpeakProviderCartesiaModelId, + AgentV1UpdateSpeakSpeakProviderCartesiaParams, + AgentV1UpdateSpeakSpeakProviderCartesiaVoice, + AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams, + AgentV1UpdateSpeakSpeakProviderDeepgram, + AgentV1UpdateSpeakSpeakProviderDeepgramModel, + AgentV1UpdateSpeakSpeakProviderDeepgramParams, + AgentV1UpdateSpeakSpeakProviderElevenLabs, + AgentV1UpdateSpeakSpeakProviderElevenLabsModelId, + AgentV1UpdateSpeakSpeakProviderElevenLabsParams, + AgentV1UpdateSpeakSpeakProviderOpenAi, + AgentV1UpdateSpeakSpeakProviderOpenAiModel, + AgentV1UpdateSpeakSpeakProviderOpenAiParams, + AgentV1UpdateSpeakSpeakProviderOpenAiVoice, + AgentV1UpdateSpeakSpeakProviderParams, + AgentV1UpdateSpeakSpeakProvider_AwsPolly, + AgentV1UpdateSpeakSpeakProvider_AwsPollyParams, + AgentV1UpdateSpeakSpeakProvider_Cartesia, + AgentV1UpdateSpeakSpeakProvider_CartesiaParams, + AgentV1UpdateSpeakSpeakProvider_Deepgram, + AgentV1UpdateSpeakSpeakProvider_DeepgramParams, + AgentV1UpdateSpeakSpeakProvider_ElevenLabs, + AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams, + AgentV1UpdateSpeakSpeakProvider_OpenAi, + AgentV1UpdateSpeakSpeakProvider_OpenAiParams, + AgentV1UserStartedSpeaking, + AgentV1UserStartedSpeakingParams, + AgentV1Warning, + AgentV1WarningParams, + AgentV1Welcome, + AgentV1WelcomeParams, + ) +_dynamic_imports: typing.Dict[str, str] = { + "AgentV1AgentAudioDone": ".v1", + "AgentV1AgentAudioDoneParams": ".v1", + "AgentV1AgentStartedSpeaking": ".v1", + "AgentV1AgentStartedSpeakingParams": ".v1", + "AgentV1AgentThinking": ".v1", + "AgentV1AgentThinkingParams": ".v1", + "AgentV1ConversationText": ".v1", + "AgentV1ConversationTextParams": ".v1", + "AgentV1ConversationTextRole": ".v1", + "AgentV1Error": ".v1", + "AgentV1ErrorParams": ".v1", + "AgentV1FunctionCallRequest": ".v1", + "AgentV1FunctionCallRequestFunctionsItem": ".v1", + "AgentV1FunctionCallRequestFunctionsItemParams": ".v1", + "AgentV1FunctionCallRequestParams": ".v1", + "AgentV1InjectAgentMessage": ".v1", + "AgentV1InjectAgentMessageParams": ".v1", + "AgentV1InjectUserMessage": ".v1", + "AgentV1InjectUserMessageParams": ".v1", + "AgentV1InjectionRefused": ".v1", + "AgentV1InjectionRefusedParams": ".v1", + "AgentV1KeepAlive": ".v1", + "AgentV1KeepAliveParams": ".v1", + "AgentV1PromptUpdated": ".v1", + "AgentV1PromptUpdatedParams": ".v1", + "AgentV1ReceiveFunctionCallResponse": ".v1", + "AgentV1ReceiveFunctionCallResponseParams": ".v1", + "AgentV1SendFunctionCallResponse": ".v1", + "AgentV1SendFunctionCallResponseParams": ".v1", + "AgentV1Settings": ".v1", + "AgentV1SettingsAgent": ".v1", + "AgentV1SettingsAgentContext": ".v1", + "AgentV1SettingsAgentContextMessagesItem": ".v1", + "AgentV1SettingsAgentContextMessagesItemContent": ".v1", + "AgentV1SettingsAgentContextMessagesItemContentParams": ".v1", + "AgentV1SettingsAgentContextMessagesItemContentRole": ".v1", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls": ".v1", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem": ".v1", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams": ".v1", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams": ".v1", + "AgentV1SettingsAgentContextMessagesItemParams": ".v1", + "AgentV1SettingsAgentContextParams": ".v1", + "AgentV1SettingsAgentListen": ".v1", + "AgentV1SettingsAgentListenParams": ".v1", + "AgentV1SettingsAgentListenProvider": ".v1", + "AgentV1SettingsAgentListenProviderParams": ".v1", + "AgentV1SettingsAgentParams": ".v1", + "AgentV1SettingsAgentSpeak": ".v1", + "AgentV1SettingsAgentSpeakEndpoint": ".v1", + "AgentV1SettingsAgentSpeakEndpointEndpoint": ".v1", + "AgentV1SettingsAgentSpeakEndpointEndpointParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice": ".v1", + "AgentV1SettingsAgentSpeakEndpointProviderParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi": ".v1", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams": ".v1", + "AgentV1SettingsAgentSpeakItem": ".v1", + "AgentV1SettingsAgentSpeakItemEndpoint": ".v1", + "AgentV1SettingsAgentSpeakItemEndpointParams": ".v1", + "AgentV1SettingsAgentSpeakItemParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice": ".v1", + "AgentV1SettingsAgentSpeakItemProviderCartesia": ".v1", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId": ".v1", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice": ".v1", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderDeepgram": ".v1", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel": ".v1", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs": ".v1", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId": ".v1", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderOpenAi": ".v1", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel": ".v1", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams": ".v1", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice": ".v1", + "AgentV1SettingsAgentSpeakItemProviderParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi": ".v1", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams": ".v1", + "AgentV1SettingsAgentSpeakParams": ".v1", + "AgentV1SettingsAgentThink": ".v1", + "AgentV1SettingsAgentThinkContextLength": ".v1", + "AgentV1SettingsAgentThinkContextLengthParams": ".v1", + "AgentV1SettingsAgentThinkEndpoint": ".v1", + "AgentV1SettingsAgentThinkEndpointParams": ".v1", + "AgentV1SettingsAgentThinkFunctionsItem": ".v1", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint": ".v1", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams": ".v1", + "AgentV1SettingsAgentThinkFunctionsItemParams": ".v1", + "AgentV1SettingsAgentThinkParams": ".v1", + "AgentV1SettingsAgentThinkProvider": ".v1", + "AgentV1SettingsAgentThinkProviderCredentials": ".v1", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials": ".v1", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams": ".v1", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType": ".v1", + "AgentV1SettingsAgentThinkProviderCredentialsModel": ".v1", + "AgentV1SettingsAgentThinkProviderCredentialsParams": ".v1", + "AgentV1SettingsAgentThinkProviderModel": ".v1", + "AgentV1SettingsAgentThinkProviderModelParams": ".v1", + "AgentV1SettingsAgentThinkProviderParams": ".v1", + "AgentV1SettingsAgentThinkProviderThree": ".v1", + "AgentV1SettingsAgentThinkProviderThreeModel": ".v1", + "AgentV1SettingsAgentThinkProviderThreeParams": ".v1", + "AgentV1SettingsAgentThinkProviderTwo": ".v1", + "AgentV1SettingsAgentThinkProviderTwoModel": ".v1", + "AgentV1SettingsAgentThinkProviderTwoParams": ".v1", + "AgentV1SettingsAgentThinkProviderZero": ".v1", + "AgentV1SettingsAgentThinkProviderZeroModel": ".v1", + "AgentV1SettingsAgentThinkProviderZeroParams": ".v1", + "AgentV1SettingsApplied": ".v1", + "AgentV1SettingsAppliedParams": ".v1", + "AgentV1SettingsAudio": ".v1", + "AgentV1SettingsAudioInput": ".v1", + "AgentV1SettingsAudioInputEncoding": ".v1", + "AgentV1SettingsAudioInputParams": ".v1", + "AgentV1SettingsAudioOutput": ".v1", + "AgentV1SettingsAudioOutputEncoding": ".v1", + "AgentV1SettingsAudioOutputParams": ".v1", + "AgentV1SettingsAudioParams": ".v1", + "AgentV1SettingsFlags": ".v1", + "AgentV1SettingsFlagsParams": ".v1", + "AgentV1SettingsParams": ".v1", + "AgentV1SpeakUpdated": ".v1", + "AgentV1SpeakUpdatedParams": ".v1", + "AgentV1UpdatePrompt": ".v1", + "AgentV1UpdatePromptParams": ".v1", + "AgentV1UpdateSpeak": ".v1", + "AgentV1UpdateSpeakParams": ".v1", + "AgentV1UpdateSpeakSpeak": ".v1", + "AgentV1UpdateSpeakSpeakEndpoint": ".v1", + "AgentV1UpdateSpeakSpeakEndpointParams": ".v1", + "AgentV1UpdateSpeakSpeakParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPolly": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice": ".v1", + "AgentV1UpdateSpeakSpeakProviderCartesia": ".v1", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId": ".v1", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice": ".v1", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderDeepgram": ".v1", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel": ".v1", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderElevenLabs": ".v1", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId": ".v1", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderOpenAi": ".v1", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel": ".v1", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams": ".v1", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice": ".v1", + "AgentV1UpdateSpeakSpeakProviderParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly": ".v1", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider_Cartesia": ".v1", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider_Deepgram": ".v1", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs": ".v1", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams": ".v1", + "AgentV1UpdateSpeakSpeakProvider_OpenAi": ".v1", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams": ".v1", + "AgentV1UserStartedSpeaking": ".v1", + "AgentV1UserStartedSpeakingParams": ".v1", + "AgentV1Warning": ".v1", + "AgentV1WarningParams": ".v1", + "AgentV1Welcome": ".v1", + "AgentV1WelcomeParams": ".v1", + "v1": ".v1", +} def __getattr__(attr_name: str) -> typing.Any: @@ -31,4 +469,223 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["v1"] +__all__ = [ + "AgentV1AgentAudioDone", + "AgentV1AgentAudioDoneParams", + "AgentV1AgentStartedSpeaking", + "AgentV1AgentStartedSpeakingParams", + "AgentV1AgentThinking", + "AgentV1AgentThinkingParams", + "AgentV1ConversationText", + "AgentV1ConversationTextParams", + "AgentV1ConversationTextRole", + "AgentV1Error", + "AgentV1ErrorParams", + "AgentV1FunctionCallRequest", + "AgentV1FunctionCallRequestFunctionsItem", + "AgentV1FunctionCallRequestFunctionsItemParams", + "AgentV1FunctionCallRequestParams", + "AgentV1InjectAgentMessage", + "AgentV1InjectAgentMessageParams", + "AgentV1InjectUserMessage", + "AgentV1InjectUserMessageParams", + "AgentV1InjectionRefused", + "AgentV1InjectionRefusedParams", + "AgentV1KeepAlive", + "AgentV1KeepAliveParams", + "AgentV1PromptUpdated", + "AgentV1PromptUpdatedParams", + "AgentV1ReceiveFunctionCallResponse", + "AgentV1ReceiveFunctionCallResponseParams", + "AgentV1SendFunctionCallResponse", + "AgentV1SendFunctionCallResponseParams", + "AgentV1Settings", + "AgentV1SettingsAgent", + "AgentV1SettingsAgentContext", + "AgentV1SettingsAgentContextMessagesItem", + "AgentV1SettingsAgentContextMessagesItemContent", + "AgentV1SettingsAgentContextMessagesItemContentParams", + "AgentV1SettingsAgentContextMessagesItemContentRole", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams", + "AgentV1SettingsAgentContextMessagesItemParams", + "AgentV1SettingsAgentContextParams", + "AgentV1SettingsAgentListen", + "AgentV1SettingsAgentListenParams", + "AgentV1SettingsAgentListenProvider", + "AgentV1SettingsAgentListenProviderParams", + "AgentV1SettingsAgentParams", + "AgentV1SettingsAgentSpeak", + "AgentV1SettingsAgentSpeakEndpoint", + "AgentV1SettingsAgentSpeakEndpointEndpoint", + "AgentV1SettingsAgentSpeakEndpointEndpointParams", + "AgentV1SettingsAgentSpeakEndpointParams", + "AgentV1SettingsAgentSpeakEndpointProvider", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakEndpointProviderParams", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakItem", + "AgentV1SettingsAgentSpeakItemEndpoint", + "AgentV1SettingsAgentSpeakItemEndpointParams", + "AgentV1SettingsAgentSpeakItemParams", + "AgentV1SettingsAgentSpeakItemProvider", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakItemProviderCartesia", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakItemProviderDeepgram", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProviderOpenAi", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakItemProviderParams", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakParams", + "AgentV1SettingsAgentThink", + "AgentV1SettingsAgentThinkContextLength", + "AgentV1SettingsAgentThinkContextLengthParams", + "AgentV1SettingsAgentThinkEndpoint", + "AgentV1SettingsAgentThinkEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItem", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItemParams", + "AgentV1SettingsAgentThinkParams", + "AgentV1SettingsAgentThinkProvider", + "AgentV1SettingsAgentThinkProviderCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType", + "AgentV1SettingsAgentThinkProviderCredentialsModel", + "AgentV1SettingsAgentThinkProviderCredentialsParams", + "AgentV1SettingsAgentThinkProviderModel", + "AgentV1SettingsAgentThinkProviderModelParams", + "AgentV1SettingsAgentThinkProviderParams", + "AgentV1SettingsAgentThinkProviderThree", + "AgentV1SettingsAgentThinkProviderThreeModel", + "AgentV1SettingsAgentThinkProviderThreeParams", + "AgentV1SettingsAgentThinkProviderTwo", + "AgentV1SettingsAgentThinkProviderTwoModel", + "AgentV1SettingsAgentThinkProviderTwoParams", + "AgentV1SettingsAgentThinkProviderZero", + "AgentV1SettingsAgentThinkProviderZeroModel", + "AgentV1SettingsAgentThinkProviderZeroParams", + "AgentV1SettingsApplied", + "AgentV1SettingsAppliedParams", + "AgentV1SettingsAudio", + "AgentV1SettingsAudioInput", + "AgentV1SettingsAudioInputEncoding", + "AgentV1SettingsAudioInputParams", + "AgentV1SettingsAudioOutput", + "AgentV1SettingsAudioOutputEncoding", + "AgentV1SettingsAudioOutputParams", + "AgentV1SettingsAudioParams", + "AgentV1SettingsFlags", + "AgentV1SettingsFlagsParams", + "AgentV1SettingsParams", + "AgentV1SpeakUpdated", + "AgentV1SpeakUpdatedParams", + "AgentV1UpdatePrompt", + "AgentV1UpdatePromptParams", + "AgentV1UpdateSpeak", + "AgentV1UpdateSpeakParams", + "AgentV1UpdateSpeakSpeak", + "AgentV1UpdateSpeakSpeakEndpoint", + "AgentV1UpdateSpeakSpeakEndpointParams", + "AgentV1UpdateSpeakSpeakParams", + "AgentV1UpdateSpeakSpeakProvider", + "AgentV1UpdateSpeakSpeakProviderAwsPolly", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice", + "AgentV1UpdateSpeakSpeakProviderCartesia", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams", + "AgentV1UpdateSpeakSpeakProviderDeepgram", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams", + "AgentV1UpdateSpeakSpeakProviderElevenLabs", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams", + "AgentV1UpdateSpeakSpeakProviderOpenAi", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice", + "AgentV1UpdateSpeakSpeakProviderParams", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams", + "AgentV1UpdateSpeakSpeakProvider_Cartesia", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams", + "AgentV1UpdateSpeakSpeakProvider_Deepgram", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams", + "AgentV1UpdateSpeakSpeakProvider_OpenAi", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams", + "AgentV1UserStartedSpeaking", + "AgentV1UserStartedSpeakingParams", + "AgentV1Warning", + "AgentV1WarningParams", + "AgentV1Welcome", + "AgentV1WelcomeParams", + "v1", +] diff --git a/src/deepgram/agent/v1/__init__.py b/src/deepgram/agent/v1/__init__.py index 31fcb147..0786c47b 100644 --- a/src/deepgram/agent/v1/__init__.py +++ b/src/deepgram/agent/v1/__init__.py @@ -6,8 +6,448 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .types import ( + AgentV1AgentAudioDone, + AgentV1AgentStartedSpeaking, + AgentV1AgentThinking, + AgentV1ConversationText, + AgentV1ConversationTextRole, + AgentV1Error, + AgentV1FunctionCallRequest, + AgentV1FunctionCallRequestFunctionsItem, + AgentV1InjectAgentMessage, + AgentV1InjectUserMessage, + AgentV1InjectionRefused, + AgentV1KeepAlive, + AgentV1PromptUpdated, + AgentV1ReceiveFunctionCallResponse, + AgentV1SendFunctionCallResponse, + AgentV1Settings, + AgentV1SettingsAgent, + AgentV1SettingsAgentContext, + AgentV1SettingsAgentContextMessagesItem, + AgentV1SettingsAgentContextMessagesItemContent, + AgentV1SettingsAgentContextMessagesItemContentRole, + AgentV1SettingsAgentContextMessagesItemFunctionCalls, + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem, + AgentV1SettingsAgentListen, + AgentV1SettingsAgentListenProvider, + AgentV1SettingsAgentSpeak, + AgentV1SettingsAgentSpeakEndpoint, + AgentV1SettingsAgentSpeakEndpointEndpoint, + AgentV1SettingsAgentSpeakEndpointProvider, + AgentV1SettingsAgentSpeakEndpointProviderAwsPolly, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, + AgentV1SettingsAgentSpeakEndpointProviderCartesia, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice, + AgentV1SettingsAgentSpeakEndpointProviderDeepgram, + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabs, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, + AgentV1SettingsAgentSpeakEndpointProviderOpenAi, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly, + AgentV1SettingsAgentSpeakEndpointProvider_Cartesia, + AgentV1SettingsAgentSpeakEndpointProvider_Deepgram, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAi, + AgentV1SettingsAgentSpeakItem, + AgentV1SettingsAgentSpeakItemEndpoint, + AgentV1SettingsAgentSpeakItemProvider, + AgentV1SettingsAgentSpeakItemProviderAwsPolly, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType, + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, + AgentV1SettingsAgentSpeakItemProviderCartesia, + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, + AgentV1SettingsAgentSpeakItemProviderCartesiaVoice, + AgentV1SettingsAgentSpeakItemProviderDeepgram, + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, + AgentV1SettingsAgentSpeakItemProviderElevenLabs, + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, + AgentV1SettingsAgentSpeakItemProviderOpenAi, + AgentV1SettingsAgentSpeakItemProviderOpenAiModel, + AgentV1SettingsAgentSpeakItemProviderOpenAiVoice, + AgentV1SettingsAgentSpeakItemProvider_AwsPolly, + AgentV1SettingsAgentSpeakItemProvider_Cartesia, + AgentV1SettingsAgentSpeakItemProvider_Deepgram, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabs, + AgentV1SettingsAgentSpeakItemProvider_OpenAi, + AgentV1SettingsAgentThink, + AgentV1SettingsAgentThinkContextLength, + AgentV1SettingsAgentThinkEndpoint, + AgentV1SettingsAgentThinkFunctionsItem, + AgentV1SettingsAgentThinkFunctionsItemEndpoint, + AgentV1SettingsAgentThinkProvider, + AgentV1SettingsAgentThinkProviderCredentials, + AgentV1SettingsAgentThinkProviderCredentialsCredentials, + AgentV1SettingsAgentThinkProviderCredentialsCredentialsType, + AgentV1SettingsAgentThinkProviderCredentialsModel, + AgentV1SettingsAgentThinkProviderModel, + AgentV1SettingsAgentThinkProviderThree, + AgentV1SettingsAgentThinkProviderThreeModel, + AgentV1SettingsAgentThinkProviderTwo, + AgentV1SettingsAgentThinkProviderTwoModel, + AgentV1SettingsAgentThinkProviderZero, + AgentV1SettingsAgentThinkProviderZeroModel, + AgentV1SettingsApplied, + AgentV1SettingsAudio, + AgentV1SettingsAudioInput, + AgentV1SettingsAudioInputEncoding, + AgentV1SettingsAudioOutput, + AgentV1SettingsAudioOutputEncoding, + AgentV1SettingsFlags, + AgentV1SpeakUpdated, + AgentV1UpdatePrompt, + AgentV1UpdateSpeak, + AgentV1UpdateSpeakSpeak, + AgentV1UpdateSpeakSpeakEndpoint, + AgentV1UpdateSpeakSpeakProvider, + AgentV1UpdateSpeakSpeakProviderAwsPolly, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType, + AgentV1UpdateSpeakSpeakProviderAwsPollyEngine, + AgentV1UpdateSpeakSpeakProviderAwsPollyVoice, + AgentV1UpdateSpeakSpeakProviderCartesia, + AgentV1UpdateSpeakSpeakProviderCartesiaModelId, + AgentV1UpdateSpeakSpeakProviderCartesiaVoice, + AgentV1UpdateSpeakSpeakProviderDeepgram, + AgentV1UpdateSpeakSpeakProviderDeepgramModel, + AgentV1UpdateSpeakSpeakProviderElevenLabs, + AgentV1UpdateSpeakSpeakProviderElevenLabsModelId, + AgentV1UpdateSpeakSpeakProviderOpenAi, + AgentV1UpdateSpeakSpeakProviderOpenAiModel, + AgentV1UpdateSpeakSpeakProviderOpenAiVoice, + AgentV1UpdateSpeakSpeakProvider_AwsPolly, + AgentV1UpdateSpeakSpeakProvider_Cartesia, + AgentV1UpdateSpeakSpeakProvider_Deepgram, + AgentV1UpdateSpeakSpeakProvider_ElevenLabs, + AgentV1UpdateSpeakSpeakProvider_OpenAi, + AgentV1UserStartedSpeaking, + AgentV1Warning, + AgentV1Welcome, + ) from . import settings -_dynamic_imports: typing.Dict[str, str] = {"settings": ".settings"} + from .requests import ( + AgentV1AgentAudioDoneParams, + AgentV1AgentStartedSpeakingParams, + AgentV1AgentThinkingParams, + AgentV1ConversationTextParams, + AgentV1ErrorParams, + AgentV1FunctionCallRequestFunctionsItemParams, + AgentV1FunctionCallRequestParams, + AgentV1InjectAgentMessageParams, + AgentV1InjectUserMessageParams, + AgentV1InjectionRefusedParams, + AgentV1KeepAliveParams, + AgentV1PromptUpdatedParams, + AgentV1ReceiveFunctionCallResponseParams, + AgentV1SendFunctionCallResponseParams, + AgentV1SettingsAgentContextMessagesItemContentParams, + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams, + AgentV1SettingsAgentContextMessagesItemFunctionCallsParams, + AgentV1SettingsAgentContextMessagesItemParams, + AgentV1SettingsAgentContextParams, + AgentV1SettingsAgentListenParams, + AgentV1SettingsAgentListenProviderParams, + AgentV1SettingsAgentParams, + AgentV1SettingsAgentSpeakEndpointEndpointParams, + AgentV1SettingsAgentSpeakEndpointParams, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams, + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams, + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams, + AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams, + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams, + AgentV1SettingsAgentSpeakEndpointProviderParams, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams, + AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams, + AgentV1SettingsAgentSpeakItemEndpointParams, + AgentV1SettingsAgentSpeakItemParams, + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams, + AgentV1SettingsAgentSpeakItemProviderAwsPollyParams, + AgentV1SettingsAgentSpeakItemProviderCartesiaParams, + AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams, + AgentV1SettingsAgentSpeakItemProviderDeepgramParams, + AgentV1SettingsAgentSpeakItemProviderElevenLabsParams, + AgentV1SettingsAgentSpeakItemProviderOpenAiParams, + AgentV1SettingsAgentSpeakItemProviderParams, + AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakItemProvider_CartesiaParams, + AgentV1SettingsAgentSpeakItemProvider_DeepgramParams, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakItemProvider_OpenAiParams, + AgentV1SettingsAgentSpeakParams, + AgentV1SettingsAgentThinkContextLengthParams, + AgentV1SettingsAgentThinkEndpointParams, + AgentV1SettingsAgentThinkFunctionsItemEndpointParams, + AgentV1SettingsAgentThinkFunctionsItemParams, + AgentV1SettingsAgentThinkParams, + AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams, + AgentV1SettingsAgentThinkProviderCredentialsParams, + AgentV1SettingsAgentThinkProviderModelParams, + AgentV1SettingsAgentThinkProviderParams, + AgentV1SettingsAgentThinkProviderThreeParams, + AgentV1SettingsAgentThinkProviderTwoParams, + AgentV1SettingsAgentThinkProviderZeroParams, + AgentV1SettingsAppliedParams, + AgentV1SettingsAudioInputParams, + AgentV1SettingsAudioOutputParams, + AgentV1SettingsAudioParams, + AgentV1SettingsFlagsParams, + AgentV1SettingsParams, + AgentV1SpeakUpdatedParams, + AgentV1UpdatePromptParams, + AgentV1UpdateSpeakParams, + AgentV1UpdateSpeakSpeakEndpointParams, + AgentV1UpdateSpeakSpeakParams, + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams, + AgentV1UpdateSpeakSpeakProviderAwsPollyParams, + AgentV1UpdateSpeakSpeakProviderCartesiaParams, + AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams, + AgentV1UpdateSpeakSpeakProviderDeepgramParams, + AgentV1UpdateSpeakSpeakProviderElevenLabsParams, + AgentV1UpdateSpeakSpeakProviderOpenAiParams, + AgentV1UpdateSpeakSpeakProviderParams, + AgentV1UpdateSpeakSpeakProvider_AwsPollyParams, + AgentV1UpdateSpeakSpeakProvider_CartesiaParams, + AgentV1UpdateSpeakSpeakProvider_DeepgramParams, + AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams, + AgentV1UpdateSpeakSpeakProvider_OpenAiParams, + AgentV1UserStartedSpeakingParams, + AgentV1WarningParams, + AgentV1WelcomeParams, + ) +_dynamic_imports: typing.Dict[str, str] = { + "AgentV1AgentAudioDone": ".types", + "AgentV1AgentAudioDoneParams": ".requests", + "AgentV1AgentStartedSpeaking": ".types", + "AgentV1AgentStartedSpeakingParams": ".requests", + "AgentV1AgentThinking": ".types", + "AgentV1AgentThinkingParams": ".requests", + "AgentV1ConversationText": ".types", + "AgentV1ConversationTextParams": ".requests", + "AgentV1ConversationTextRole": ".types", + "AgentV1Error": ".types", + "AgentV1ErrorParams": ".requests", + "AgentV1FunctionCallRequest": ".types", + "AgentV1FunctionCallRequestFunctionsItem": ".types", + "AgentV1FunctionCallRequestFunctionsItemParams": ".requests", + "AgentV1FunctionCallRequestParams": ".requests", + "AgentV1InjectAgentMessage": ".types", + "AgentV1InjectAgentMessageParams": ".requests", + "AgentV1InjectUserMessage": ".types", + "AgentV1InjectUserMessageParams": ".requests", + "AgentV1InjectionRefused": ".types", + "AgentV1InjectionRefusedParams": ".requests", + "AgentV1KeepAlive": ".types", + "AgentV1KeepAliveParams": ".requests", + "AgentV1PromptUpdated": ".types", + "AgentV1PromptUpdatedParams": ".requests", + "AgentV1ReceiveFunctionCallResponse": ".types", + "AgentV1ReceiveFunctionCallResponseParams": ".requests", + "AgentV1SendFunctionCallResponse": ".types", + "AgentV1SendFunctionCallResponseParams": ".requests", + "AgentV1Settings": ".types", + "AgentV1SettingsAgent": ".types", + "AgentV1SettingsAgentContext": ".types", + "AgentV1SettingsAgentContextMessagesItem": ".types", + "AgentV1SettingsAgentContextMessagesItemContent": ".types", + "AgentV1SettingsAgentContextMessagesItemContentParams": ".requests", + "AgentV1SettingsAgentContextMessagesItemContentRole": ".types", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls": ".types", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem": ".types", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams": ".requests", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams": ".requests", + "AgentV1SettingsAgentContextMessagesItemParams": ".requests", + "AgentV1SettingsAgentContextParams": ".requests", + "AgentV1SettingsAgentListen": ".types", + "AgentV1SettingsAgentListenParams": ".requests", + "AgentV1SettingsAgentListenProvider": ".types", + "AgentV1SettingsAgentListenProviderParams": ".requests", + "AgentV1SettingsAgentParams": ".requests", + "AgentV1SettingsAgentSpeak": ".types", + "AgentV1SettingsAgentSpeakEndpoint": ".types", + "AgentV1SettingsAgentSpeakEndpointEndpoint": ".types", + "AgentV1SettingsAgentSpeakEndpointEndpointParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice": ".types", + "AgentV1SettingsAgentSpeakEndpointProviderParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly": ".types", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia": ".types", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram": ".types", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs": ".types", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams": ".requests", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi": ".types", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams": ".requests", + "AgentV1SettingsAgentSpeakItem": ".types", + "AgentV1SettingsAgentSpeakItemEndpoint": ".types", + "AgentV1SettingsAgentSpeakItemEndpointParams": ".requests", + "AgentV1SettingsAgentSpeakItemParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider": ".types", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly": ".types", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials": ".types", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType": ".types", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine": ".types", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice": ".types", + "AgentV1SettingsAgentSpeakItemProviderCartesia": ".types", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId": ".types", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice": ".types", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderDeepgram": ".types", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel": ".types", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs": ".types", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId": ".types", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderOpenAi": ".types", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel": ".types", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams": ".requests", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice": ".types", + "AgentV1SettingsAgentSpeakItemProviderParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly": ".types", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia": ".types", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram": ".types", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs": ".types", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams": ".requests", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi": ".types", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams": ".requests", + "AgentV1SettingsAgentSpeakParams": ".requests", + "AgentV1SettingsAgentThink": ".types", + "AgentV1SettingsAgentThinkContextLength": ".types", + "AgentV1SettingsAgentThinkContextLengthParams": ".requests", + "AgentV1SettingsAgentThinkEndpoint": ".types", + "AgentV1SettingsAgentThinkEndpointParams": ".requests", + "AgentV1SettingsAgentThinkFunctionsItem": ".types", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint": ".types", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams": ".requests", + "AgentV1SettingsAgentThinkFunctionsItemParams": ".requests", + "AgentV1SettingsAgentThinkParams": ".requests", + "AgentV1SettingsAgentThinkProvider": ".types", + "AgentV1SettingsAgentThinkProviderCredentials": ".types", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials": ".types", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams": ".requests", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType": ".types", + "AgentV1SettingsAgentThinkProviderCredentialsModel": ".types", + "AgentV1SettingsAgentThinkProviderCredentialsParams": ".requests", + "AgentV1SettingsAgentThinkProviderModel": ".types", + "AgentV1SettingsAgentThinkProviderModelParams": ".requests", + "AgentV1SettingsAgentThinkProviderParams": ".requests", + "AgentV1SettingsAgentThinkProviderThree": ".types", + "AgentV1SettingsAgentThinkProviderThreeModel": ".types", + "AgentV1SettingsAgentThinkProviderThreeParams": ".requests", + "AgentV1SettingsAgentThinkProviderTwo": ".types", + "AgentV1SettingsAgentThinkProviderTwoModel": ".types", + "AgentV1SettingsAgentThinkProviderTwoParams": ".requests", + "AgentV1SettingsAgentThinkProviderZero": ".types", + "AgentV1SettingsAgentThinkProviderZeroModel": ".types", + "AgentV1SettingsAgentThinkProviderZeroParams": ".requests", + "AgentV1SettingsApplied": ".types", + "AgentV1SettingsAppliedParams": ".requests", + "AgentV1SettingsAudio": ".types", + "AgentV1SettingsAudioInput": ".types", + "AgentV1SettingsAudioInputEncoding": ".types", + "AgentV1SettingsAudioInputParams": ".requests", + "AgentV1SettingsAudioOutput": ".types", + "AgentV1SettingsAudioOutputEncoding": ".types", + "AgentV1SettingsAudioOutputParams": ".requests", + "AgentV1SettingsAudioParams": ".requests", + "AgentV1SettingsFlags": ".types", + "AgentV1SettingsFlagsParams": ".requests", + "AgentV1SettingsParams": ".requests", + "AgentV1SpeakUpdated": ".types", + "AgentV1SpeakUpdatedParams": ".requests", + "AgentV1UpdatePrompt": ".types", + "AgentV1UpdatePromptParams": ".requests", + "AgentV1UpdateSpeak": ".types", + "AgentV1UpdateSpeakParams": ".requests", + "AgentV1UpdateSpeakSpeak": ".types", + "AgentV1UpdateSpeakSpeakEndpoint": ".types", + "AgentV1UpdateSpeakSpeakEndpointParams": ".requests", + "AgentV1UpdateSpeakSpeakParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider": ".types", + "AgentV1UpdateSpeakSpeakProviderAwsPolly": ".types", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials": ".types", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType": ".types", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine": ".types", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice": ".types", + "AgentV1UpdateSpeakSpeakProviderCartesia": ".types", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId": ".types", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice": ".types", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderDeepgram": ".types", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel": ".types", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderElevenLabs": ".types", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId": ".types", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderOpenAi": ".types", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel": ".types", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams": ".requests", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice": ".types", + "AgentV1UpdateSpeakSpeakProviderParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly": ".types", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider_Cartesia": ".types", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider_Deepgram": ".types", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs": ".types", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams": ".requests", + "AgentV1UpdateSpeakSpeakProvider_OpenAi": ".types", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams": ".requests", + "AgentV1UserStartedSpeaking": ".types", + "AgentV1UserStartedSpeakingParams": ".requests", + "AgentV1Warning": ".types", + "AgentV1WarningParams": ".requests", + "AgentV1Welcome": ".types", + "AgentV1WelcomeParams": ".requests", + "settings": ".settings", +} def __getattr__(attr_name: str) -> typing.Any: @@ -31,4 +471,223 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["settings"] +__all__ = [ + "AgentV1AgentAudioDone", + "AgentV1AgentAudioDoneParams", + "AgentV1AgentStartedSpeaking", + "AgentV1AgentStartedSpeakingParams", + "AgentV1AgentThinking", + "AgentV1AgentThinkingParams", + "AgentV1ConversationText", + "AgentV1ConversationTextParams", + "AgentV1ConversationTextRole", + "AgentV1Error", + "AgentV1ErrorParams", + "AgentV1FunctionCallRequest", + "AgentV1FunctionCallRequestFunctionsItem", + "AgentV1FunctionCallRequestFunctionsItemParams", + "AgentV1FunctionCallRequestParams", + "AgentV1InjectAgentMessage", + "AgentV1InjectAgentMessageParams", + "AgentV1InjectUserMessage", + "AgentV1InjectUserMessageParams", + "AgentV1InjectionRefused", + "AgentV1InjectionRefusedParams", + "AgentV1KeepAlive", + "AgentV1KeepAliveParams", + "AgentV1PromptUpdated", + "AgentV1PromptUpdatedParams", + "AgentV1ReceiveFunctionCallResponse", + "AgentV1ReceiveFunctionCallResponseParams", + "AgentV1SendFunctionCallResponse", + "AgentV1SendFunctionCallResponseParams", + "AgentV1Settings", + "AgentV1SettingsAgent", + "AgentV1SettingsAgentContext", + "AgentV1SettingsAgentContextMessagesItem", + "AgentV1SettingsAgentContextMessagesItemContent", + "AgentV1SettingsAgentContextMessagesItemContentParams", + "AgentV1SettingsAgentContextMessagesItemContentRole", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams", + "AgentV1SettingsAgentContextMessagesItemParams", + "AgentV1SettingsAgentContextParams", + "AgentV1SettingsAgentListen", + "AgentV1SettingsAgentListenParams", + "AgentV1SettingsAgentListenProvider", + "AgentV1SettingsAgentListenProviderParams", + "AgentV1SettingsAgentParams", + "AgentV1SettingsAgentSpeak", + "AgentV1SettingsAgentSpeakEndpoint", + "AgentV1SettingsAgentSpeakEndpointEndpoint", + "AgentV1SettingsAgentSpeakEndpointEndpointParams", + "AgentV1SettingsAgentSpeakEndpointParams", + "AgentV1SettingsAgentSpeakEndpointProvider", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakEndpointProviderParams", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakItem", + "AgentV1SettingsAgentSpeakItemEndpoint", + "AgentV1SettingsAgentSpeakItemEndpointParams", + "AgentV1SettingsAgentSpeakItemParams", + "AgentV1SettingsAgentSpeakItemProvider", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakItemProviderCartesia", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakItemProviderDeepgram", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProviderOpenAi", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakItemProviderParams", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakParams", + "AgentV1SettingsAgentThink", + "AgentV1SettingsAgentThinkContextLength", + "AgentV1SettingsAgentThinkContextLengthParams", + "AgentV1SettingsAgentThinkEndpoint", + "AgentV1SettingsAgentThinkEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItem", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItemParams", + "AgentV1SettingsAgentThinkParams", + "AgentV1SettingsAgentThinkProvider", + "AgentV1SettingsAgentThinkProviderCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType", + "AgentV1SettingsAgentThinkProviderCredentialsModel", + "AgentV1SettingsAgentThinkProviderCredentialsParams", + "AgentV1SettingsAgentThinkProviderModel", + "AgentV1SettingsAgentThinkProviderModelParams", + "AgentV1SettingsAgentThinkProviderParams", + "AgentV1SettingsAgentThinkProviderThree", + "AgentV1SettingsAgentThinkProviderThreeModel", + "AgentV1SettingsAgentThinkProviderThreeParams", + "AgentV1SettingsAgentThinkProviderTwo", + "AgentV1SettingsAgentThinkProviderTwoModel", + "AgentV1SettingsAgentThinkProviderTwoParams", + "AgentV1SettingsAgentThinkProviderZero", + "AgentV1SettingsAgentThinkProviderZeroModel", + "AgentV1SettingsAgentThinkProviderZeroParams", + "AgentV1SettingsApplied", + "AgentV1SettingsAppliedParams", + "AgentV1SettingsAudio", + "AgentV1SettingsAudioInput", + "AgentV1SettingsAudioInputEncoding", + "AgentV1SettingsAudioInputParams", + "AgentV1SettingsAudioOutput", + "AgentV1SettingsAudioOutputEncoding", + "AgentV1SettingsAudioOutputParams", + "AgentV1SettingsAudioParams", + "AgentV1SettingsFlags", + "AgentV1SettingsFlagsParams", + "AgentV1SettingsParams", + "AgentV1SpeakUpdated", + "AgentV1SpeakUpdatedParams", + "AgentV1UpdatePrompt", + "AgentV1UpdatePromptParams", + "AgentV1UpdateSpeak", + "AgentV1UpdateSpeakParams", + "AgentV1UpdateSpeakSpeak", + "AgentV1UpdateSpeakSpeakEndpoint", + "AgentV1UpdateSpeakSpeakEndpointParams", + "AgentV1UpdateSpeakSpeakParams", + "AgentV1UpdateSpeakSpeakProvider", + "AgentV1UpdateSpeakSpeakProviderAwsPolly", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice", + "AgentV1UpdateSpeakSpeakProviderCartesia", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams", + "AgentV1UpdateSpeakSpeakProviderDeepgram", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams", + "AgentV1UpdateSpeakSpeakProviderElevenLabs", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams", + "AgentV1UpdateSpeakSpeakProviderOpenAi", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice", + "AgentV1UpdateSpeakSpeakProviderParams", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams", + "AgentV1UpdateSpeakSpeakProvider_Cartesia", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams", + "AgentV1UpdateSpeakSpeakProvider_Deepgram", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams", + "AgentV1UpdateSpeakSpeakProvider_OpenAi", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams", + "AgentV1UserStartedSpeaking", + "AgentV1UserStartedSpeakingParams", + "AgentV1Warning", + "AgentV1WarningParams", + "AgentV1Welcome", + "AgentV1WelcomeParams", + "settings", +] diff --git a/src/deepgram/agent/v1/requests/__init__.py b/src/deepgram/agent/v1/requests/__init__.py new file mode 100644 index 00000000..b0e8707e --- /dev/null +++ b/src/deepgram/agent/v1/requests/__init__.py @@ -0,0 +1,351 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .agent_v1agent_audio_done import AgentV1AgentAudioDoneParams + from .agent_v1agent_started_speaking import AgentV1AgentStartedSpeakingParams + from .agent_v1agent_thinking import AgentV1AgentThinkingParams + from .agent_v1conversation_text import AgentV1ConversationTextParams + from .agent_v1error import AgentV1ErrorParams + from .agent_v1function_call_request import AgentV1FunctionCallRequestParams + from .agent_v1function_call_request_functions_item import AgentV1FunctionCallRequestFunctionsItemParams + from .agent_v1inject_agent_message import AgentV1InjectAgentMessageParams + from .agent_v1inject_user_message import AgentV1InjectUserMessageParams + from .agent_v1injection_refused import AgentV1InjectionRefusedParams + from .agent_v1keep_alive import AgentV1KeepAliveParams + from .agent_v1prompt_updated import AgentV1PromptUpdatedParams + from .agent_v1receive_function_call_response import AgentV1ReceiveFunctionCallResponseParams + from .agent_v1send_function_call_response import AgentV1SendFunctionCallResponseParams + from .agent_v1settings import AgentV1SettingsParams + from .agent_v1settings_agent import AgentV1SettingsAgentParams + from .agent_v1settings_agent_context import AgentV1SettingsAgentContextParams + from .agent_v1settings_agent_context_messages_item import AgentV1SettingsAgentContextMessagesItemParams + from .agent_v1settings_agent_context_messages_item_content import ( + AgentV1SettingsAgentContextMessagesItemContentParams, + ) + from .agent_v1settings_agent_context_messages_item_function_calls import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsParams, + ) + from .agent_v1settings_agent_context_messages_item_function_calls_function_calls_item import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams, + ) + from .agent_v1settings_agent_listen import AgentV1SettingsAgentListenParams + from .agent_v1settings_agent_listen_provider import AgentV1SettingsAgentListenProviderParams + from .agent_v1settings_agent_speak import AgentV1SettingsAgentSpeakParams + from .agent_v1settings_agent_speak_endpoint import AgentV1SettingsAgentSpeakEndpointParams + from .agent_v1settings_agent_speak_endpoint_endpoint import AgentV1SettingsAgentSpeakEndpointEndpointParams + from .agent_v1settings_agent_speak_endpoint_provider import ( + AgentV1SettingsAgentSpeakEndpointProviderParams, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams, + AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_cartesia import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_deepgram import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_eleven_labs import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams, + ) + from .agent_v1settings_agent_speak_endpoint_provider_open_ai import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams, + ) + from .agent_v1settings_agent_speak_item import AgentV1SettingsAgentSpeakItemParams + from .agent_v1settings_agent_speak_item_endpoint import AgentV1SettingsAgentSpeakItemEndpointParams + from .agent_v1settings_agent_speak_item_provider import ( + AgentV1SettingsAgentSpeakItemProviderParams, + AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams, + AgentV1SettingsAgentSpeakItemProvider_CartesiaParams, + AgentV1SettingsAgentSpeakItemProvider_DeepgramParams, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakItemProvider_OpenAiParams, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyParams, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams, + ) + from .agent_v1settings_agent_speak_item_provider_cartesia import AgentV1SettingsAgentSpeakItemProviderCartesiaParams + from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams, + ) + from .agent_v1settings_agent_speak_item_provider_deepgram import AgentV1SettingsAgentSpeakItemProviderDeepgramParams + from .agent_v1settings_agent_speak_item_provider_eleven_labs import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsParams, + ) + from .agent_v1settings_agent_speak_item_provider_open_ai import AgentV1SettingsAgentSpeakItemProviderOpenAiParams + from .agent_v1settings_agent_think import AgentV1SettingsAgentThinkParams + from .agent_v1settings_agent_think_context_length import AgentV1SettingsAgentThinkContextLengthParams + from .agent_v1settings_agent_think_endpoint import AgentV1SettingsAgentThinkEndpointParams + from .agent_v1settings_agent_think_functions_item import AgentV1SettingsAgentThinkFunctionsItemParams + from .agent_v1settings_agent_think_functions_item_endpoint import ( + AgentV1SettingsAgentThinkFunctionsItemEndpointParams, + ) + from .agent_v1settings_agent_think_provider import AgentV1SettingsAgentThinkProviderParams + from .agent_v1settings_agent_think_provider_credentials import AgentV1SettingsAgentThinkProviderCredentialsParams + from .agent_v1settings_agent_think_provider_credentials_credentials import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams, + ) + from .agent_v1settings_agent_think_provider_model import AgentV1SettingsAgentThinkProviderModelParams + from .agent_v1settings_agent_think_provider_three import AgentV1SettingsAgentThinkProviderThreeParams + from .agent_v1settings_agent_think_provider_two import AgentV1SettingsAgentThinkProviderTwoParams + from .agent_v1settings_agent_think_provider_zero import AgentV1SettingsAgentThinkProviderZeroParams + from .agent_v1settings_applied import AgentV1SettingsAppliedParams + from .agent_v1settings_audio import AgentV1SettingsAudioParams + from .agent_v1settings_audio_input import AgentV1SettingsAudioInputParams + from .agent_v1settings_audio_output import AgentV1SettingsAudioOutputParams + from .agent_v1settings_flags import AgentV1SettingsFlagsParams + from .agent_v1speak_updated import AgentV1SpeakUpdatedParams + from .agent_v1update_prompt import AgentV1UpdatePromptParams + from .agent_v1update_speak import AgentV1UpdateSpeakParams + from .agent_v1update_speak_speak import AgentV1UpdateSpeakSpeakParams + from .agent_v1update_speak_speak_endpoint import AgentV1UpdateSpeakSpeakEndpointParams + from .agent_v1update_speak_speak_provider import ( + AgentV1UpdateSpeakSpeakProviderParams, + AgentV1UpdateSpeakSpeakProvider_AwsPollyParams, + AgentV1UpdateSpeakSpeakProvider_CartesiaParams, + AgentV1UpdateSpeakSpeakProvider_DeepgramParams, + AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams, + AgentV1UpdateSpeakSpeakProvider_OpenAiParams, + ) + from .agent_v1update_speak_speak_provider_aws_polly import AgentV1UpdateSpeakSpeakProviderAwsPollyParams + from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams, + ) + from .agent_v1update_speak_speak_provider_cartesia import AgentV1UpdateSpeakSpeakProviderCartesiaParams + from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams + from .agent_v1update_speak_speak_provider_deepgram import AgentV1UpdateSpeakSpeakProviderDeepgramParams + from .agent_v1update_speak_speak_provider_eleven_labs import AgentV1UpdateSpeakSpeakProviderElevenLabsParams + from .agent_v1update_speak_speak_provider_open_ai import AgentV1UpdateSpeakSpeakProviderOpenAiParams + from .agent_v1user_started_speaking import AgentV1UserStartedSpeakingParams + from .agent_v1warning import AgentV1WarningParams + from .agent_v1welcome import AgentV1WelcomeParams +_dynamic_imports: typing.Dict[str, str] = { + "AgentV1AgentAudioDoneParams": ".agent_v1agent_audio_done", + "AgentV1AgentStartedSpeakingParams": ".agent_v1agent_started_speaking", + "AgentV1AgentThinkingParams": ".agent_v1agent_thinking", + "AgentV1ConversationTextParams": ".agent_v1conversation_text", + "AgentV1ErrorParams": ".agent_v1error", + "AgentV1FunctionCallRequestFunctionsItemParams": ".agent_v1function_call_request_functions_item", + "AgentV1FunctionCallRequestParams": ".agent_v1function_call_request", + "AgentV1InjectAgentMessageParams": ".agent_v1inject_agent_message", + "AgentV1InjectUserMessageParams": ".agent_v1inject_user_message", + "AgentV1InjectionRefusedParams": ".agent_v1injection_refused", + "AgentV1KeepAliveParams": ".agent_v1keep_alive", + "AgentV1PromptUpdatedParams": ".agent_v1prompt_updated", + "AgentV1ReceiveFunctionCallResponseParams": ".agent_v1receive_function_call_response", + "AgentV1SendFunctionCallResponseParams": ".agent_v1send_function_call_response", + "AgentV1SettingsAgentContextMessagesItemContentParams": ".agent_v1settings_agent_context_messages_item_content", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams": ".agent_v1settings_agent_context_messages_item_function_calls_function_calls_item", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams": ".agent_v1settings_agent_context_messages_item_function_calls", + "AgentV1SettingsAgentContextMessagesItemParams": ".agent_v1settings_agent_context_messages_item", + "AgentV1SettingsAgentContextParams": ".agent_v1settings_agent_context", + "AgentV1SettingsAgentListenParams": ".agent_v1settings_agent_listen", + "AgentV1SettingsAgentListenProviderParams": ".agent_v1settings_agent_listen_provider", + "AgentV1SettingsAgentParams": ".agent_v1settings_agent", + "AgentV1SettingsAgentSpeakEndpointEndpointParams": ".agent_v1settings_agent_speak_endpoint_endpoint", + "AgentV1SettingsAgentSpeakEndpointParams": ".agent_v1settings_agent_speak_endpoint", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams": ".agent_v1settings_agent_speak_endpoint_provider_cartesia", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams": ".agent_v1settings_agent_speak_endpoint_provider_cartesia_voice", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams": ".agent_v1settings_agent_speak_endpoint_provider_deepgram", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams": ".agent_v1settings_agent_speak_endpoint_provider_eleven_labs", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams": ".agent_v1settings_agent_speak_endpoint_provider_open_ai", + "AgentV1SettingsAgentSpeakEndpointProviderParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakItemEndpointParams": ".agent_v1settings_agent_speak_item_endpoint", + "AgentV1SettingsAgentSpeakItemParams": ".agent_v1settings_agent_speak_item", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams": ".agent_v1settings_agent_speak_item_provider_aws_polly_credentials", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams": ".agent_v1settings_agent_speak_item_provider_aws_polly", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams": ".agent_v1settings_agent_speak_item_provider_cartesia", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams": ".agent_v1settings_agent_speak_item_provider_cartesia_voice", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams": ".agent_v1settings_agent_speak_item_provider_deepgram", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams": ".agent_v1settings_agent_speak_item_provider_eleven_labs", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams": ".agent_v1settings_agent_speak_item_provider_open_ai", + "AgentV1SettingsAgentSpeakItemProviderParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakParams": ".agent_v1settings_agent_speak", + "AgentV1SettingsAgentThinkContextLengthParams": ".agent_v1settings_agent_think_context_length", + "AgentV1SettingsAgentThinkEndpointParams": ".agent_v1settings_agent_think_endpoint", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams": ".agent_v1settings_agent_think_functions_item_endpoint", + "AgentV1SettingsAgentThinkFunctionsItemParams": ".agent_v1settings_agent_think_functions_item", + "AgentV1SettingsAgentThinkParams": ".agent_v1settings_agent_think", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams": ".agent_v1settings_agent_think_provider_credentials_credentials", + "AgentV1SettingsAgentThinkProviderCredentialsParams": ".agent_v1settings_agent_think_provider_credentials", + "AgentV1SettingsAgentThinkProviderModelParams": ".agent_v1settings_agent_think_provider_model", + "AgentV1SettingsAgentThinkProviderParams": ".agent_v1settings_agent_think_provider", + "AgentV1SettingsAgentThinkProviderThreeParams": ".agent_v1settings_agent_think_provider_three", + "AgentV1SettingsAgentThinkProviderTwoParams": ".agent_v1settings_agent_think_provider_two", + "AgentV1SettingsAgentThinkProviderZeroParams": ".agent_v1settings_agent_think_provider_zero", + "AgentV1SettingsAppliedParams": ".agent_v1settings_applied", + "AgentV1SettingsAudioInputParams": ".agent_v1settings_audio_input", + "AgentV1SettingsAudioOutputParams": ".agent_v1settings_audio_output", + "AgentV1SettingsAudioParams": ".agent_v1settings_audio", + "AgentV1SettingsFlagsParams": ".agent_v1settings_flags", + "AgentV1SettingsParams": ".agent_v1settings", + "AgentV1SpeakUpdatedParams": ".agent_v1speak_updated", + "AgentV1UpdatePromptParams": ".agent_v1update_prompt", + "AgentV1UpdateSpeakParams": ".agent_v1update_speak", + "AgentV1UpdateSpeakSpeakEndpointParams": ".agent_v1update_speak_speak_endpoint", + "AgentV1UpdateSpeakSpeakParams": ".agent_v1update_speak_speak", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams": ".agent_v1update_speak_speak_provider_aws_polly_credentials", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams": ".agent_v1update_speak_speak_provider_aws_polly", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams": ".agent_v1update_speak_speak_provider_cartesia", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams": ".agent_v1update_speak_speak_provider_cartesia_voice", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams": ".agent_v1update_speak_speak_provider_deepgram", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams": ".agent_v1update_speak_speak_provider_eleven_labs", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams": ".agent_v1update_speak_speak_provider_open_ai", + "AgentV1UpdateSpeakSpeakProviderParams": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams": ".agent_v1update_speak_speak_provider", + "AgentV1UserStartedSpeakingParams": ".agent_v1user_started_speaking", + "AgentV1WarningParams": ".agent_v1warning", + "AgentV1WelcomeParams": ".agent_v1welcome", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "AgentV1AgentAudioDoneParams", + "AgentV1AgentStartedSpeakingParams", + "AgentV1AgentThinkingParams", + "AgentV1ConversationTextParams", + "AgentV1ErrorParams", + "AgentV1FunctionCallRequestFunctionsItemParams", + "AgentV1FunctionCallRequestParams", + "AgentV1InjectAgentMessageParams", + "AgentV1InjectUserMessageParams", + "AgentV1InjectionRefusedParams", + "AgentV1KeepAliveParams", + "AgentV1PromptUpdatedParams", + "AgentV1ReceiveFunctionCallResponseParams", + "AgentV1SendFunctionCallResponseParams", + "AgentV1SettingsAgentContextMessagesItemContentParams", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsParams", + "AgentV1SettingsAgentContextMessagesItemParams", + "AgentV1SettingsAgentContextParams", + "AgentV1SettingsAgentListenParams", + "AgentV1SettingsAgentListenProviderParams", + "AgentV1SettingsAgentParams", + "AgentV1SettingsAgentSpeakEndpointEndpointParams", + "AgentV1SettingsAgentSpeakEndpointParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams", + "AgentV1SettingsAgentSpeakEndpointProviderParams", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakItemEndpointParams", + "AgentV1SettingsAgentSpeakItemParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyParams", + "AgentV1SettingsAgentSpeakItemProviderCartesiaParams", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams", + "AgentV1SettingsAgentSpeakItemProviderDeepgramParams", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProviderOpenAiParams", + "AgentV1SettingsAgentSpeakItemProviderParams", + "AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams", + "AgentV1SettingsAgentSpeakItemProvider_CartesiaParams", + "AgentV1SettingsAgentSpeakItemProvider_DeepgramParams", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams", + "AgentV1SettingsAgentSpeakItemProvider_OpenAiParams", + "AgentV1SettingsAgentSpeakParams", + "AgentV1SettingsAgentThinkContextLengthParams", + "AgentV1SettingsAgentThinkEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItemEndpointParams", + "AgentV1SettingsAgentThinkFunctionsItemParams", + "AgentV1SettingsAgentThinkParams", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams", + "AgentV1SettingsAgentThinkProviderCredentialsParams", + "AgentV1SettingsAgentThinkProviderModelParams", + "AgentV1SettingsAgentThinkProviderParams", + "AgentV1SettingsAgentThinkProviderThreeParams", + "AgentV1SettingsAgentThinkProviderTwoParams", + "AgentV1SettingsAgentThinkProviderZeroParams", + "AgentV1SettingsAppliedParams", + "AgentV1SettingsAudioInputParams", + "AgentV1SettingsAudioOutputParams", + "AgentV1SettingsAudioParams", + "AgentV1SettingsFlagsParams", + "AgentV1SettingsParams", + "AgentV1SpeakUpdatedParams", + "AgentV1UpdatePromptParams", + "AgentV1UpdateSpeakParams", + "AgentV1UpdateSpeakSpeakEndpointParams", + "AgentV1UpdateSpeakSpeakParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams", + "AgentV1UpdateSpeakSpeakProviderAwsPollyParams", + "AgentV1UpdateSpeakSpeakProviderCartesiaParams", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams", + "AgentV1UpdateSpeakSpeakProviderDeepgramParams", + "AgentV1UpdateSpeakSpeakProviderElevenLabsParams", + "AgentV1UpdateSpeakSpeakProviderOpenAiParams", + "AgentV1UpdateSpeakSpeakProviderParams", + "AgentV1UpdateSpeakSpeakProvider_AwsPollyParams", + "AgentV1UpdateSpeakSpeakProvider_CartesiaParams", + "AgentV1UpdateSpeakSpeakProvider_DeepgramParams", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams", + "AgentV1UpdateSpeakSpeakProvider_OpenAiParams", + "AgentV1UserStartedSpeakingParams", + "AgentV1WarningParams", + "AgentV1WelcomeParams", +] diff --git a/src/deepgram/agent/v1/requests/agent_v1agent_audio_done.py b/src/deepgram/agent/v1/requests/agent_v1agent_audio_done.py new file mode 100644 index 00000000..43b4f013 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1agent_audio_done.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1AgentAudioDoneParams(typing_extensions.TypedDict): + type: typing.Literal["AgentAudioDone"] + """ + Message type identifier indicating the agent has finished sending audio + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1agent_started_speaking.py b/src/deepgram/agent/v1/requests/agent_v1agent_started_speaking.py new file mode 100644 index 00000000..39861c94 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1agent_started_speaking.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1AgentStartedSpeakingParams(typing_extensions.TypedDict): + type: typing.Literal["AgentStartedSpeaking"] + """ + Message type identifier for agent started speaking + """ + + total_latency: float + """ + Seconds from receiving the user's utterance to producing the agent's reply + """ + + tts_latency: float + """ + The portion of total latency attributable to text-to-speech + """ + + ttt_latency: float + """ + The portion of total latency attributable to text-to-text (usually an LLM) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1agent_thinking.py b/src/deepgram/agent/v1/requests/agent_v1agent_thinking.py new file mode 100644 index 00000000..13434cbc --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1agent_thinking.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1AgentThinkingParams(typing_extensions.TypedDict): + type: typing.Literal["AgentThinking"] + """ + Message type identifier for agent thinking + """ + + content: str + """ + The text of the agent's thought process + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1conversation_text.py b/src/deepgram/agent/v1/requests/agent_v1conversation_text.py new file mode 100644 index 00000000..ea0601e3 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1conversation_text.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1conversation_text_role import AgentV1ConversationTextRole + + +class AgentV1ConversationTextParams(typing_extensions.TypedDict): + type: typing.Literal["ConversationText"] + """ + Message type identifier for conversation text + """ + + role: AgentV1ConversationTextRole + """ + Identifies who spoke the statement + """ + + content: str + """ + The actual statement that was spoken + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1error.py b/src/deepgram/agent/v1/requests/agent_v1error.py new file mode 100644 index 00000000..23547cb7 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1error.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1ErrorParams(typing_extensions.TypedDict): + type: typing.Literal["Error"] + """ + Message type identifier for error responses + """ + + description: str + """ + A description of what went wrong + """ + + code: str + """ + Error code identifying the type of error + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1function_call_request.py b/src/deepgram/agent/v1/requests/agent_v1function_call_request.py new file mode 100644 index 00000000..b00cc6d4 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1function_call_request.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1function_call_request_functions_item import AgentV1FunctionCallRequestFunctionsItemParams + + +class AgentV1FunctionCallRequestParams(typing_extensions.TypedDict): + type: typing.Literal["FunctionCallRequest"] + """ + Message type identifier for function call requests + """ + + functions: typing.Sequence[AgentV1FunctionCallRequestFunctionsItemParams] + """ + Array of functions to be called + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1function_call_request_functions_item.py b/src/deepgram/agent/v1/requests/agent_v1function_call_request_functions_item.py new file mode 100644 index 00000000..bdc26719 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1function_call_request_functions_item.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1FunctionCallRequestFunctionsItemParams(typing_extensions.TypedDict): + id: str + """ + Unique identifier for the function call + """ + + name: str + """ + The name of the function to call + """ + + arguments: str + """ + JSON string containing the function arguments + """ + + client_side: bool + """ + Whether the function should be executed client-side + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1inject_agent_message.py b/src/deepgram/agent/v1/requests/agent_v1inject_agent_message.py new file mode 100644 index 00000000..8fb718bd --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1inject_agent_message.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1InjectAgentMessageParams(typing_extensions.TypedDict): + type: typing.Literal["InjectAgentMessage"] + """ + Message type identifier for injecting an agent message + """ + + message: str + """ + The statement that the agent should say + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1inject_user_message.py b/src/deepgram/agent/v1/requests/agent_v1inject_user_message.py new file mode 100644 index 00000000..86583a81 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1inject_user_message.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1InjectUserMessageParams(typing_extensions.TypedDict): + type: typing.Literal["InjectUserMessage"] + """ + Message type identifier for injecting a user message + """ + + content: str + """ + The specific phrase or statement the agent should respond to + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1injection_refused.py b/src/deepgram/agent/v1/requests/agent_v1injection_refused.py new file mode 100644 index 00000000..e19f3241 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1injection_refused.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1InjectionRefusedParams(typing_extensions.TypedDict): + type: typing.Literal["InjectionRefused"] + """ + Message type identifier for injection refused + """ + + message: str + """ + Details about why the injection was refused + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1keep_alive.py b/src/deepgram/agent/v1/requests/agent_v1keep_alive.py new file mode 100644 index 00000000..125eb8ae --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1keep_alive.py @@ -0,0 +1,16 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1KeepAliveParams(typing_extensions.TypedDict): + """ + Send a control message to the agent + """ + + type: typing.Literal["KeepAlive"] + """ + Message type identifier + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1prompt_updated.py b/src/deepgram/agent/v1/requests/agent_v1prompt_updated.py new file mode 100644 index 00000000..40d5a426 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1prompt_updated.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1PromptUpdatedParams(typing_extensions.TypedDict): + type: typing.Literal["PromptUpdated"] + """ + Message type identifier for prompt update confirmation + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1receive_function_call_response.py b/src/deepgram/agent/v1/requests/agent_v1receive_function_call_response.py new file mode 100644 index 00000000..05f8050b --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1receive_function_call_response.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1ReceiveFunctionCallResponseParams(typing_extensions.TypedDict): + """ + Function call response message used bidirectionally: + + β€’ **Client β†’ Server**: Response after client executes a function + marked as client_side: true + β€’ **Server β†’ Client**: Response after server executes a function + marked as client_side: false + + The same message structure serves both directions, enabling a unified + interface for function call responses regardless of execution location. + """ + + type: typing.Literal["FunctionCallResponse"] + """ + Message type identifier for function call responses + """ + + id: typing_extensions.NotRequired[str] + """ + The unique identifier for the function call. + + β€’ **Required for client responses**: Should match the id from + the corresponding `FunctionCallRequest` + β€’ **Optional for server responses**: Server may omit when responding + to internal function executions + """ + + name: str + """ + The name of the function being called + """ + + content: str + """ + The content or result of the function call + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1send_function_call_response.py b/src/deepgram/agent/v1/requests/agent_v1send_function_call_response.py new file mode 100644 index 00000000..765b6f7c --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1send_function_call_response.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SendFunctionCallResponseParams(typing_extensions.TypedDict): + """ + Function call response message used bidirectionally: + + β€’ **Client β†’ Server**: Response after client executes a function + marked as client_side: true + β€’ **Server β†’ Client**: Response after server executes a function + marked as client_side: false + + The same message structure serves both directions, enabling a unified + interface for function call responses regardless of execution location. + """ + + type: typing.Literal["FunctionCallResponse"] + """ + Message type identifier for function call responses + """ + + id: typing_extensions.NotRequired[str] + """ + The unique identifier for the function call. + + β€’ **Required for client responses**: Should match the id from + the corresponding `FunctionCallRequest` + β€’ **Optional for server responses**: Server may omit when responding + to internal function executions + """ + + name: str + """ + The name of the function being called + """ + + content: str + """ + The content or result of the function call + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings.py b/src/deepgram/agent/v1/requests/agent_v1settings.py new file mode 100644 index 00000000..2f748dcd --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1settings_agent import AgentV1SettingsAgentParams +from .agent_v1settings_audio import AgentV1SettingsAudioParams +from .agent_v1settings_flags import AgentV1SettingsFlagsParams + + +class AgentV1SettingsParams(typing_extensions.TypedDict): + type: typing.Literal["Settings"] + tags: typing_extensions.NotRequired[typing.Sequence[str]] + """ + Tags to associate with the request + """ + + experimental: typing_extensions.NotRequired[bool] + """ + To enable experimental features + """ + + flags: typing_extensions.NotRequired[AgentV1SettingsFlagsParams] + mip_opt_out: typing_extensions.NotRequired[bool] + """ + To opt out of Deepgram Model Improvement Program + """ + + audio: AgentV1SettingsAudioParams + agent: AgentV1SettingsAgentParams diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent.py new file mode 100644 index 00000000..c048a616 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1settings_agent_context import AgentV1SettingsAgentContextParams +from .agent_v1settings_agent_listen import AgentV1SettingsAgentListenParams +from .agent_v1settings_agent_speak import AgentV1SettingsAgentSpeakParams +from .agent_v1settings_agent_think import AgentV1SettingsAgentThinkParams + + +class AgentV1SettingsAgentParams(typing_extensions.TypedDict): + language: typing_extensions.NotRequired[str] + """ + Agent language + """ + + context: typing_extensions.NotRequired[AgentV1SettingsAgentContextParams] + """ + Conversation context including the history of messages and function calls + """ + + listen: typing_extensions.NotRequired[AgentV1SettingsAgentListenParams] + think: typing_extensions.NotRequired[AgentV1SettingsAgentThinkParams] + speak: typing_extensions.NotRequired[AgentV1SettingsAgentSpeakParams] + greeting: typing_extensions.NotRequired[str] + """ + Optional message that agent will speak at the start + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_context.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context.py new file mode 100644 index 00000000..a27f848a --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1settings_agent_context_messages_item import AgentV1SettingsAgentContextMessagesItemParams + + +class AgentV1SettingsAgentContextParams(typing_extensions.TypedDict): + """ + Conversation context including the history of messages and function calls + """ + + messages: typing_extensions.NotRequired[typing.Sequence[AgentV1SettingsAgentContextMessagesItemParams]] + """ + Conversation history as a list of messages and function calls + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item.py new file mode 100644 index 00000000..cf31d658 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_context_messages_item_content import AgentV1SettingsAgentContextMessagesItemContentParams +from .agent_v1settings_agent_context_messages_item_function_calls import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsParams, +) + +AgentV1SettingsAgentContextMessagesItemParams = typing.Union[ + AgentV1SettingsAgentContextMessagesItemContentParams, AgentV1SettingsAgentContextMessagesItemFunctionCallsParams +] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_content.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_content.py new file mode 100644 index 00000000..1a541ffc --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_content.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_context_messages_item_content_role import ( + AgentV1SettingsAgentContextMessagesItemContentRole, +) + + +class AgentV1SettingsAgentContextMessagesItemContentParams(typing_extensions.TypedDict): + """ + Conversation text as part of the conversation history + """ + + type: typing.Literal["History"] + """ + Message type identifier for conversation text + """ + + role: AgentV1SettingsAgentContextMessagesItemContentRole + """ + Identifies who spoke the statement + """ + + content: str + """ + The actual statement that was spoken + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls.py new file mode 100644 index 00000000..cdc5733c --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1settings_agent_context_messages_item_function_calls_function_calls_item import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams, +) + + +class AgentV1SettingsAgentContextMessagesItemFunctionCallsParams(typing_extensions.TypedDict): + """ + Client-side or server-side function call request and response as part of the conversation history + """ + + type: typing.Literal["History"] + function_calls: typing.Sequence[AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams] + """ + List of function call objects + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py new file mode 100644 index 00000000..9efeb23e --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItemParams(typing_extensions.TypedDict): + id: str + """ + Unique identifier for the function call + """ + + name: str + """ + Name of the function called + """ + + client_side: bool + """ + Indicates if the call was client-side or server-side + """ + + arguments: str + """ + Arguments passed to the function + """ + + response: str + """ + Response from the function call + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen.py new file mode 100644 index 00000000..3eb2aa41 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1settings_agent_listen_provider import AgentV1SettingsAgentListenProviderParams + + +class AgentV1SettingsAgentListenParams(typing_extensions.TypedDict): + provider: typing_extensions.NotRequired[AgentV1SettingsAgentListenProviderParams] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen_provider.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen_provider.py new file mode 100644 index 00000000..ad746f50 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_listen_provider.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentListenProviderParams(typing_extensions.TypedDict): + type: typing.Literal["deepgram"] + """ + Provider type for speech-to-text + """ + + model: typing_extensions.NotRequired[str] + """ + Model to use for speech to text + """ + + keyterms: typing_extensions.NotRequired[typing.Sequence[str]] + """ + Prompt key-term recognition (nova-3 'en' only) + """ + + smart_format: typing_extensions.NotRequired[bool] + """ + Applies smart formatting to improve transcript readability (Deepgram providers only) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak.py new file mode 100644 index 00000000..19f7c7df --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak.py @@ -0,0 +1,10 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_speak_endpoint import AgentV1SettingsAgentSpeakEndpointParams +from .agent_v1settings_agent_speak_item import AgentV1SettingsAgentSpeakItemParams + +AgentV1SettingsAgentSpeakParams = typing.Union[ + AgentV1SettingsAgentSpeakEndpointParams, typing.Sequence[AgentV1SettingsAgentSpeakItemParams] +] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint.py new file mode 100644 index 00000000..d90614be --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint.py @@ -0,0 +1,14 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1settings_agent_speak_endpoint_endpoint import AgentV1SettingsAgentSpeakEndpointEndpointParams +from .agent_v1settings_agent_speak_endpoint_provider import AgentV1SettingsAgentSpeakEndpointProviderParams + + +class AgentV1SettingsAgentSpeakEndpointParams(typing_extensions.TypedDict): + provider: AgentV1SettingsAgentSpeakEndpointProviderParams + endpoint: typing_extensions.NotRequired[AgentV1SettingsAgentSpeakEndpointEndpointParams] + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_endpoint.py new file mode 100644 index 00000000..3bc9c86f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_endpoint.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentSpeakEndpointEndpointParams(typing_extensions.TypedDict): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing_extensions.NotRequired[str] + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing_extensions.NotRequired[typing.Dict[str, str]] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider.py new file mode 100644 index 00000000..bbe15771 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider.py @@ -0,0 +1,75 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams, +) +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams, +) + + +class AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams(typing_extensions.TypedDict): + type: typing.Literal["deepgram"] + model: AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel + + +class AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams(typing_extensions.TypedDict): + type: typing.Literal["eleven_labs"] + model_id: AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId + language_code: typing_extensions.NotRequired[str] + + +class AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams(typing_extensions.TypedDict): + type: typing.Literal["cartesia"] + model_id: AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId + voice: AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + + +class AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams(typing_extensions.TypedDict): + type: typing.Literal["open_ai"] + model: AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel + voice: AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice + + +class AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams(typing_extensions.TypedDict): + type: typing.Literal["aws_polly"] + voice: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice + language_code: str + engine: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams + + +AgentV1SettingsAgentSpeakEndpointProviderParams = typing.Union[ + AgentV1SettingsAgentSpeakEndpointProvider_DeepgramParams, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakEndpointProvider_CartesiaParams, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAiParams, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPollyParams, +] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py new file mode 100644 index 00000000..58af5935 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderAwsPollyParams(typing_extensions.TypedDict): + voice: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice + """ + AWS Polly voice name + """ + + language_code: str + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py new file mode 100644 index 00000000..97ad74b1 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsParams(typing_extensions.TypedDict): + type: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing_extensions.NotRequired[str] + """ + Required for STS only + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia.py new file mode 100644 index 00000000..e2fe184f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderCartesiaParams(typing_extensions.TypedDict): + model_id: AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId + """ + Cartesia model ID + """ + + voice: AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + """ + Cartesia language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py new file mode 100644 index 00000000..51bd279a --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py @@ -0,0 +1,15 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoiceParams(typing_extensions.TypedDict): + mode: str + """ + Cartesia voice mode + """ + + id: str + """ + Cartesia voice ID + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_deepgram.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_deepgram.py new file mode 100644 index 00000000..8ac99acc --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_deepgram.py @@ -0,0 +1,13 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderDeepgramParams(typing_extensions.TypedDict): + model: AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel + """ + Deepgram TTS model + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py new file mode 100644 index 00000000..0dd894f2 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderElevenLabsParams(typing_extensions.TypedDict): + model_id: AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId + """ + Eleven Labs model ID + """ + + language_code: typing_extensions.NotRequired[str] + """ + Eleven Labs optional language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_open_ai.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_open_ai.py new file mode 100644 index 00000000..7e4226b8 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_endpoint_provider_open_ai.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_endpoint_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, +) +from ..types.agent_v1settings_agent_speak_endpoint_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderOpenAiParams(typing_extensions.TypedDict): + model: AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel + """ + OpenAI TTS model + """ + + voice: AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice + """ + OpenAI voice + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item.py new file mode 100644 index 00000000..14a7707f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item.py @@ -0,0 +1,14 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1settings_agent_speak_item_endpoint import AgentV1SettingsAgentSpeakItemEndpointParams +from .agent_v1settings_agent_speak_item_provider import AgentV1SettingsAgentSpeakItemProviderParams + + +class AgentV1SettingsAgentSpeakItemParams(typing_extensions.TypedDict): + provider: AgentV1SettingsAgentSpeakItemProviderParams + endpoint: typing_extensions.NotRequired[AgentV1SettingsAgentSpeakItemEndpointParams] + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_endpoint.py new file mode 100644 index 00000000..c1851824 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_endpoint.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentSpeakItemEndpointParams(typing_extensions.TypedDict): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing_extensions.NotRequired[str] + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing_extensions.NotRequired[typing.Dict[str, str]] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider.py new file mode 100644 index 00000000..97afd28b --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider.py @@ -0,0 +1,75 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, +) +from ..types.agent_v1settings_agent_speak_item_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, +) +from ..types.agent_v1settings_agent_speak_item_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, +) +from ..types.agent_v1settings_agent_speak_item_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, +) +from ..types.agent_v1settings_agent_speak_item_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, +) +from ..types.agent_v1settings_agent_speak_item_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiModel, +) +from ..types.agent_v1settings_agent_speak_item_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiVoice, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams, +) +from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams, +) + + +class AgentV1SettingsAgentSpeakItemProvider_DeepgramParams(typing_extensions.TypedDict): + type: typing.Literal["deepgram"] + model: AgentV1SettingsAgentSpeakItemProviderDeepgramModel + + +class AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams(typing_extensions.TypedDict): + type: typing.Literal["eleven_labs"] + model_id: AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId + language_code: typing_extensions.NotRequired[str] + + +class AgentV1SettingsAgentSpeakItemProvider_CartesiaParams(typing_extensions.TypedDict): + type: typing.Literal["cartesia"] + model_id: AgentV1SettingsAgentSpeakItemProviderCartesiaModelId + voice: AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + + +class AgentV1SettingsAgentSpeakItemProvider_OpenAiParams(typing_extensions.TypedDict): + type: typing.Literal["open_ai"] + model: AgentV1SettingsAgentSpeakItemProviderOpenAiModel + voice: AgentV1SettingsAgentSpeakItemProviderOpenAiVoice + + +class AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams(typing_extensions.TypedDict): + type: typing.Literal["aws_polly"] + voice: AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice + language_code: str + engine: AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams + + +AgentV1SettingsAgentSpeakItemProviderParams = typing.Union[ + AgentV1SettingsAgentSpeakItemProvider_DeepgramParams, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabsParams, + AgentV1SettingsAgentSpeakItemProvider_CartesiaParams, + AgentV1SettingsAgentSpeakItemProvider_OpenAiParams, + AgentV1SettingsAgentSpeakItemProvider_AwsPollyParams, +] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly.py new file mode 100644 index 00000000..9ad0d3cd --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, +) +from ..types.agent_v1settings_agent_speak_item_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams, +) + + +class AgentV1SettingsAgentSpeakItemProviderAwsPollyParams(typing_extensions.TypedDict): + voice: AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice + """ + AWS Polly voice name + """ + + language_code: str + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py new file mode 100644 index 00000000..0abde626 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType, +) + + +class AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsParams(typing_extensions.TypedDict): + type: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing_extensions.NotRequired[str] + """ + Required for STS only + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia.py new file mode 100644 index 00000000..e09e6c0a --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams, +) + + +class AgentV1SettingsAgentSpeakItemProviderCartesiaParams(typing_extensions.TypedDict): + model_id: AgentV1SettingsAgentSpeakItemProviderCartesiaModelId + """ + Cartesia model ID + """ + + voice: AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + """ + Cartesia language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia_voice.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia_voice.py new file mode 100644 index 00000000..fd595ae2 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_cartesia_voice.py @@ -0,0 +1,15 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1SettingsAgentSpeakItemProviderCartesiaVoiceParams(typing_extensions.TypedDict): + mode: str + """ + Cartesia voice mode + """ + + id: str + """ + Cartesia voice ID + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_deepgram.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_deepgram.py new file mode 100644 index 00000000..af59d2d2 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_deepgram.py @@ -0,0 +1,13 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, +) + + +class AgentV1SettingsAgentSpeakItemProviderDeepgramParams(typing_extensions.TypedDict): + model: AgentV1SettingsAgentSpeakItemProviderDeepgramModel + """ + Deepgram TTS model + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_eleven_labs.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_eleven_labs.py new file mode 100644 index 00000000..007161e4 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_eleven_labs.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, +) + + +class AgentV1SettingsAgentSpeakItemProviderElevenLabsParams(typing_extensions.TypedDict): + model_id: AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId + """ + Eleven Labs model ID + """ + + language_code: typing_extensions.NotRequired[str] + """ + Eleven Labs optional language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_open_ai.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_open_ai.py new file mode 100644 index 00000000..d2c8bf31 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_speak_item_provider_open_ai.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_speak_item_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiModel, +) +from ..types.agent_v1settings_agent_speak_item_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiVoice, +) + + +class AgentV1SettingsAgentSpeakItemProviderOpenAiParams(typing_extensions.TypedDict): + model: AgentV1SettingsAgentSpeakItemProviderOpenAiModel + """ + OpenAI TTS model + """ + + voice: AgentV1SettingsAgentSpeakItemProviderOpenAiVoice + """ + OpenAI voice + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think.py new file mode 100644 index 00000000..2d5d22c2 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1settings_agent_think_context_length import AgentV1SettingsAgentThinkContextLengthParams +from .agent_v1settings_agent_think_endpoint import AgentV1SettingsAgentThinkEndpointParams +from .agent_v1settings_agent_think_functions_item import AgentV1SettingsAgentThinkFunctionsItemParams +from .agent_v1settings_agent_think_provider import AgentV1SettingsAgentThinkProviderParams + + +class AgentV1SettingsAgentThinkParams(typing_extensions.TypedDict): + provider: AgentV1SettingsAgentThinkProviderParams + endpoint: typing_extensions.NotRequired[AgentV1SettingsAgentThinkEndpointParams] + """ + Optional for non-Deepgram LLM providers. When present, must include url field and headers object + """ + + functions: typing_extensions.NotRequired[typing.Sequence[AgentV1SettingsAgentThinkFunctionsItemParams]] + prompt: typing_extensions.NotRequired[str] + context_length: typing_extensions.NotRequired[AgentV1SettingsAgentThinkContextLengthParams] + """ + Specifies the number of characters retained in context between user messages, agent responses, and function calls. This setting is only configurable when a custom think endpoint is used + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_context_length.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_context_length.py new file mode 100644 index 00000000..f96cd4c3 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_context_length.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkContextLengthParams = typing.Union[typing.Literal["max"], float] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_endpoint.py new file mode 100644 index 00000000..396bbc07 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_endpoint.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentThinkEndpointParams(typing_extensions.TypedDict): + """ + Optional for non-Deepgram LLM providers. When present, must include url field and headers object + """ + + url: typing_extensions.NotRequired[str] + """ + Custom LLM endpoint URL + """ + + headers: typing_extensions.NotRequired[typing.Dict[str, str]] + """ + Custom headers for the endpoint + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item.py new file mode 100644 index 00000000..7ddb30e9 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1settings_agent_think_functions_item_endpoint import AgentV1SettingsAgentThinkFunctionsItemEndpointParams + + +class AgentV1SettingsAgentThinkFunctionsItemParams(typing_extensions.TypedDict): + name: typing_extensions.NotRequired[str] + """ + Function name + """ + + description: typing_extensions.NotRequired[str] + """ + Function description + """ + + parameters: typing_extensions.NotRequired[typing.Dict[str, typing.Optional[typing.Any]]] + """ + Function parameters + """ + + endpoint: typing_extensions.NotRequired[AgentV1SettingsAgentThinkFunctionsItemEndpointParams] + """ + The Function endpoint to call. if not passed, function is called client-side + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item_endpoint.py new file mode 100644 index 00000000..19e76bdc --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_functions_item_endpoint.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentThinkFunctionsItemEndpointParams(typing_extensions.TypedDict): + """ + The Function endpoint to call. if not passed, function is called client-side + """ + + url: typing_extensions.NotRequired[str] + """ + Endpoint URL + """ + + method: typing_extensions.NotRequired[str] + """ + HTTP method + """ + + headers: typing_extensions.NotRequired[typing.Dict[str, str]] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider.py new file mode 100644 index 00000000..76d1a6a4 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_think_provider_credentials import AgentV1SettingsAgentThinkProviderCredentialsParams +from .agent_v1settings_agent_think_provider_model import AgentV1SettingsAgentThinkProviderModelParams +from .agent_v1settings_agent_think_provider_three import AgentV1SettingsAgentThinkProviderThreeParams +from .agent_v1settings_agent_think_provider_two import AgentV1SettingsAgentThinkProviderTwoParams +from .agent_v1settings_agent_think_provider_zero import AgentV1SettingsAgentThinkProviderZeroParams + +AgentV1SettingsAgentThinkProviderParams = typing.Union[ + AgentV1SettingsAgentThinkProviderZeroParams, + AgentV1SettingsAgentThinkProviderCredentialsParams, + AgentV1SettingsAgentThinkProviderTwoParams, + AgentV1SettingsAgentThinkProviderThreeParams, + AgentV1SettingsAgentThinkProviderModelParams, +] diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials.py new file mode 100644 index 00000000..d17d2bf2 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_think_provider_credentials_model import ( + AgentV1SettingsAgentThinkProviderCredentialsModel, +) +from .agent_v1settings_agent_think_provider_credentials_credentials import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams, +) + + +class AgentV1SettingsAgentThinkProviderCredentialsParams(typing_extensions.TypedDict): + type: typing_extensions.NotRequired[typing.Literal["aws_bedrock"]] + model: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderCredentialsModel] + """ + AWS Bedrock model to use + """ + + temperature: typing_extensions.NotRequired[float] + """ + AWS Bedrock temperature (0-2) + """ + + credentials: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams] + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials_credentials.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials_credentials.py new file mode 100644 index 00000000..7534b574 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_credentials_credentials.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_agent_think_provider_credentials_credentials_type import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentialsType, +) + + +class AgentV1SettingsAgentThinkProviderCredentialsCredentialsParams(typing_extensions.TypedDict): + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ + + type: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderCredentialsCredentialsType] + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ + + region: typing_extensions.NotRequired[str] + """ + AWS region + """ + + access_key_id: typing_extensions.NotRequired[str] + """ + AWS access key + """ + + secret_access_key: typing_extensions.NotRequired[str] + """ + AWS secret access key + """ + + session_token: typing_extensions.NotRequired[str] + """ + AWS session token (required for STS only) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_model.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_model.py new file mode 100644 index 00000000..c2837c7f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_model.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAgentThinkProviderModelParams(typing_extensions.TypedDict): + type: typing_extensions.NotRequired[typing.Literal["groq"]] + model: typing_extensions.NotRequired[typing.Literal["openai/gpt-oss-20b"]] + """ + Groq model to use + """ + + temperature: typing_extensions.NotRequired[float] + """ + Groq temperature (0-2) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_three.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_three.py new file mode 100644 index 00000000..769453ad --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_three.py @@ -0,0 +1,19 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_think_provider_three_model import AgentV1SettingsAgentThinkProviderThreeModel + + +class AgentV1SettingsAgentThinkProviderThreeParams(typing_extensions.TypedDict): + type: typing_extensions.NotRequired[typing.Literal["google"]] + model: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderThreeModel] + """ + Google model to use + """ + + temperature: typing_extensions.NotRequired[float] + """ + Google temperature (0-2) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_two.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_two.py new file mode 100644 index 00000000..4be24295 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_two.py @@ -0,0 +1,19 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_think_provider_two_model import AgentV1SettingsAgentThinkProviderTwoModel + + +class AgentV1SettingsAgentThinkProviderTwoParams(typing_extensions.TypedDict): + type: typing_extensions.NotRequired[typing.Literal["anthropic"]] + model: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderTwoModel] + """ + Anthropic model to use + """ + + temperature: typing_extensions.NotRequired[float] + """ + Anthropic temperature (0-1) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_zero.py b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_zero.py new file mode 100644 index 00000000..15419372 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_agent_think_provider_zero.py @@ -0,0 +1,19 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.agent_v1settings_agent_think_provider_zero_model import AgentV1SettingsAgentThinkProviderZeroModel + + +class AgentV1SettingsAgentThinkProviderZeroParams(typing_extensions.TypedDict): + type: typing_extensions.NotRequired[typing.Literal["open_ai"]] + model: typing_extensions.NotRequired[AgentV1SettingsAgentThinkProviderZeroModel] + """ + OpenAI model to use + """ + + temperature: typing_extensions.NotRequired[float] + """ + OpenAI temperature (0-2) + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_applied.py b/src/deepgram/agent/v1/requests/agent_v1settings_applied.py new file mode 100644 index 00000000..32bca304 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_applied.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SettingsAppliedParams(typing_extensions.TypedDict): + type: typing.Literal["SettingsApplied"] + """ + Message type identifier for settings applied confirmation + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_audio.py b/src/deepgram/agent/v1/requests/agent_v1settings_audio.py new file mode 100644 index 00000000..0c09d60f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_audio.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1settings_audio_input import AgentV1SettingsAudioInputParams +from .agent_v1settings_audio_output import AgentV1SettingsAudioOutputParams + + +class AgentV1SettingsAudioParams(typing_extensions.TypedDict): + input: typing_extensions.NotRequired[AgentV1SettingsAudioInputParams] + """ + Audio input configuration settings. If omitted, defaults to encoding=linear16 and sample_rate=24000. Higher sample rates like 44100 Hz provide better audio quality. + """ + + output: typing_extensions.NotRequired[AgentV1SettingsAudioOutputParams] + """ + Audio output configuration settings + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_audio_input.py b/src/deepgram/agent/v1/requests/agent_v1settings_audio_input.py new file mode 100644 index 00000000..91931180 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_audio_input.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_audio_input_encoding import AgentV1SettingsAudioInputEncoding + + +class AgentV1SettingsAudioInputParams(typing_extensions.TypedDict): + """ + Audio input configuration settings. If omitted, defaults to encoding=linear16 and sample_rate=24000. Higher sample rates like 44100 Hz provide better audio quality. + """ + + encoding: AgentV1SettingsAudioInputEncoding + """ + Audio encoding format + """ + + sample_rate: float + """ + Sample rate in Hz. Common values are 16000, 24000, 44100, 48000 + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_audio_output.py b/src/deepgram/agent/v1/requests/agent_v1settings_audio_output.py new file mode 100644 index 00000000..32273699 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_audio_output.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1settings_audio_output_encoding import AgentV1SettingsAudioOutputEncoding + + +class AgentV1SettingsAudioOutputParams(typing_extensions.TypedDict): + """ + Audio output configuration settings + """ + + encoding: typing_extensions.NotRequired[AgentV1SettingsAudioOutputEncoding] + """ + Audio encoding format for streaming TTS output + """ + + sample_rate: typing_extensions.NotRequired[float] + """ + Sample rate in Hz + """ + + bitrate: typing_extensions.NotRequired[float] + """ + Audio bitrate in bits per second + """ + + container: typing_extensions.NotRequired[str] + """ + Audio container format. If omitted, defaults to 'none' + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1settings_flags.py b/src/deepgram/agent/v1/requests/agent_v1settings_flags.py new file mode 100644 index 00000000..737233a4 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1settings_flags.py @@ -0,0 +1,10 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1SettingsFlagsParams(typing_extensions.TypedDict): + history: typing_extensions.NotRequired[bool] + """ + Enable or disable history message reporting + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1speak_updated.py b/src/deepgram/agent/v1/requests/agent_v1speak_updated.py new file mode 100644 index 00000000..908d6639 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1speak_updated.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1SpeakUpdatedParams(typing_extensions.TypedDict): + type: typing.Literal["SpeakUpdated"] + """ + Message type identifier for speak update confirmation + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_prompt.py b/src/deepgram/agent/v1/requests/agent_v1update_prompt.py new file mode 100644 index 00000000..8f363a56 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_prompt.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1UpdatePromptParams(typing_extensions.TypedDict): + type: typing.Literal["UpdatePrompt"] + """ + Message type identifier for prompt update request + """ + + prompt: str + """ + The new system prompt to be used by the agent + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak.py b/src/deepgram/agent/v1/requests/agent_v1update_speak.py new file mode 100644 index 00000000..b86d1240 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .agent_v1update_speak_speak import AgentV1UpdateSpeakSpeakParams + + +class AgentV1UpdateSpeakParams(typing_extensions.TypedDict): + type: typing.Literal["UpdateSpeak"] + """ + Message type identifier for updating the speak model + """ + + speak: AgentV1UpdateSpeakSpeakParams + """ + Configuration for the speak model. Optional, defaults to latest deepgram TTS model + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak.py new file mode 100644 index 00000000..16a16e01 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .agent_v1update_speak_speak_endpoint import AgentV1UpdateSpeakSpeakEndpointParams +from .agent_v1update_speak_speak_provider import AgentV1UpdateSpeakSpeakProviderParams + + +class AgentV1UpdateSpeakSpeakParams(typing_extensions.TypedDict): + """ + Configuration for the speak model. Optional, defaults to latest deepgram TTS model + """ + + provider: AgentV1UpdateSpeakSpeakProviderParams + endpoint: typing_extensions.NotRequired[AgentV1UpdateSpeakSpeakEndpointParams] + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_endpoint.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_endpoint.py new file mode 100644 index 00000000..43cdb3af --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_endpoint.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1UpdateSpeakSpeakEndpointParams(typing_extensions.TypedDict): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing_extensions.NotRequired[str] + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing_extensions.NotRequired[typing.Dict[str, str]] diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider.py new file mode 100644 index 00000000..5e9804ef --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider.py @@ -0,0 +1,61 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_aws_polly_engine import AgentV1UpdateSpeakSpeakProviderAwsPollyEngine +from ..types.agent_v1update_speak_speak_provider_aws_polly_voice import AgentV1UpdateSpeakSpeakProviderAwsPollyVoice +from ..types.agent_v1update_speak_speak_provider_cartesia_model_id import AgentV1UpdateSpeakSpeakProviderCartesiaModelId +from ..types.agent_v1update_speak_speak_provider_deepgram_model import AgentV1UpdateSpeakSpeakProviderDeepgramModel +from ..types.agent_v1update_speak_speak_provider_eleven_labs_model_id import ( + AgentV1UpdateSpeakSpeakProviderElevenLabsModelId, +) +from ..types.agent_v1update_speak_speak_provider_open_ai_model import AgentV1UpdateSpeakSpeakProviderOpenAiModel +from ..types.agent_v1update_speak_speak_provider_open_ai_voice import AgentV1UpdateSpeakSpeakProviderOpenAiVoice +from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams, +) +from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams + + +class AgentV1UpdateSpeakSpeakProvider_DeepgramParams(typing_extensions.TypedDict): + type: typing.Literal["deepgram"] + model: AgentV1UpdateSpeakSpeakProviderDeepgramModel + + +class AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams(typing_extensions.TypedDict): + type: typing.Literal["eleven_labs"] + model_id: AgentV1UpdateSpeakSpeakProviderElevenLabsModelId + language_code: typing_extensions.NotRequired[str] + + +class AgentV1UpdateSpeakSpeakProvider_CartesiaParams(typing_extensions.TypedDict): + type: typing.Literal["cartesia"] + model_id: AgentV1UpdateSpeakSpeakProviderCartesiaModelId + voice: AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + + +class AgentV1UpdateSpeakSpeakProvider_OpenAiParams(typing_extensions.TypedDict): + type: typing.Literal["open_ai"] + model: AgentV1UpdateSpeakSpeakProviderOpenAiModel + voice: AgentV1UpdateSpeakSpeakProviderOpenAiVoice + + +class AgentV1UpdateSpeakSpeakProvider_AwsPollyParams(typing_extensions.TypedDict): + type: typing.Literal["aws_polly"] + voice: AgentV1UpdateSpeakSpeakProviderAwsPollyVoice + language_code: str + engine: AgentV1UpdateSpeakSpeakProviderAwsPollyEngine + credentials: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams + + +AgentV1UpdateSpeakSpeakProviderParams = typing.Union[ + AgentV1UpdateSpeakSpeakProvider_DeepgramParams, + AgentV1UpdateSpeakSpeakProvider_ElevenLabsParams, + AgentV1UpdateSpeakSpeakProvider_CartesiaParams, + AgentV1UpdateSpeakSpeakProvider_OpenAiParams, + AgentV1UpdateSpeakSpeakProvider_AwsPollyParams, +] diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly.py new file mode 100644 index 00000000..bd1ee63d --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_aws_polly_engine import AgentV1UpdateSpeakSpeakProviderAwsPollyEngine +from ..types.agent_v1update_speak_speak_provider_aws_polly_voice import AgentV1UpdateSpeakSpeakProviderAwsPollyVoice +from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams, +) + + +class AgentV1UpdateSpeakSpeakProviderAwsPollyParams(typing_extensions.TypedDict): + voice: AgentV1UpdateSpeakSpeakProviderAwsPollyVoice + """ + AWS Polly voice name + """ + + language_code: str + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1UpdateSpeakSpeakProviderAwsPollyEngine + credentials: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly_credentials.py new file mode 100644 index 00000000..ff643278 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_aws_polly_credentials.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_aws_polly_credentials_type import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType, +) + + +class AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsParams(typing_extensions.TypedDict): + type: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing_extensions.NotRequired[str] + """ + Required for STS only + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia.py new file mode 100644 index 00000000..58f9727d --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_cartesia_model_id import AgentV1UpdateSpeakSpeakProviderCartesiaModelId +from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams + + +class AgentV1UpdateSpeakSpeakProviderCartesiaParams(typing_extensions.TypedDict): + model_id: AgentV1UpdateSpeakSpeakProviderCartesiaModelId + """ + Cartesia model ID + """ + + voice: AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams + language: typing_extensions.NotRequired[str] + """ + Cartesia language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia_voice.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia_voice.py new file mode 100644 index 00000000..3ff2e8be --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_cartesia_voice.py @@ -0,0 +1,15 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class AgentV1UpdateSpeakSpeakProviderCartesiaVoiceParams(typing_extensions.TypedDict): + mode: str + """ + Cartesia voice mode + """ + + id: str + """ + Cartesia voice ID + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_deepgram.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_deepgram.py new file mode 100644 index 00000000..5252dd10 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_deepgram.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_deepgram_model import AgentV1UpdateSpeakSpeakProviderDeepgramModel + + +class AgentV1UpdateSpeakSpeakProviderDeepgramParams(typing_extensions.TypedDict): + model: AgentV1UpdateSpeakSpeakProviderDeepgramModel + """ + Deepgram TTS model + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_eleven_labs.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_eleven_labs.py new file mode 100644 index 00000000..d7a1320b --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_eleven_labs.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_eleven_labs_model_id import ( + AgentV1UpdateSpeakSpeakProviderElevenLabsModelId, +) + + +class AgentV1UpdateSpeakSpeakProviderElevenLabsParams(typing_extensions.TypedDict): + model_id: AgentV1UpdateSpeakSpeakProviderElevenLabsModelId + """ + Eleven Labs model ID + """ + + language_code: typing_extensions.NotRequired[str] + """ + Eleven Labs optional language code + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_open_ai.py b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_open_ai.py new file mode 100644 index 00000000..9994267f --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1update_speak_speak_provider_open_ai.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.agent_v1update_speak_speak_provider_open_ai_model import AgentV1UpdateSpeakSpeakProviderOpenAiModel +from ..types.agent_v1update_speak_speak_provider_open_ai_voice import AgentV1UpdateSpeakSpeakProviderOpenAiVoice + + +class AgentV1UpdateSpeakSpeakProviderOpenAiParams(typing_extensions.TypedDict): + model: AgentV1UpdateSpeakSpeakProviderOpenAiModel + """ + OpenAI TTS model + """ + + voice: AgentV1UpdateSpeakSpeakProviderOpenAiVoice + """ + OpenAI voice + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1user_started_speaking.py b/src/deepgram/agent/v1/requests/agent_v1user_started_speaking.py new file mode 100644 index 00000000..c883119c --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1user_started_speaking.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1UserStartedSpeakingParams(typing_extensions.TypedDict): + type: typing.Literal["UserStartedSpeaking"] + """ + Message type identifier indicating that the user has begun speaking + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1warning.py b/src/deepgram/agent/v1/requests/agent_v1warning.py new file mode 100644 index 00000000..f1e75051 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1warning.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1WarningParams(typing_extensions.TypedDict): + """ + Notifies the client of non-fatal errors or warnings + """ + + type: typing.Literal["Warning"] + """ + Message type identifier for warnings + """ + + description: str + """ + Description of the warning + """ + + code: str + """ + Warning code identifier + """ diff --git a/src/deepgram/agent/v1/requests/agent_v1welcome.py b/src/deepgram/agent/v1/requests/agent_v1welcome.py new file mode 100644 index 00000000..5168a4f0 --- /dev/null +++ b/src/deepgram/agent/v1/requests/agent_v1welcome.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class AgentV1WelcomeParams(typing_extensions.TypedDict): + type: typing.Literal["Welcome"] + """ + Message type identifier for welcome message + """ + + request_id: str + """ + Unique identifier for the request + """ diff --git a/src/deepgram/agent/v1/socket_client.py b/src/deepgram/agent/v1/socket_client.py index f76fc9e4..a59856c5 100644 --- a/src/deepgram/agent/v1/socket_client.py +++ b/src/deepgram/agent/v1/socket_client.py @@ -1,5 +1,4 @@ # This file was auto-generated by Fern from our API Definition. -# Enhanced with binary message support, comprehensive socket types, and send methods. import json import typing @@ -9,62 +8,49 @@ import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.pydantic_utilities import parse_obj_as +from .types.agent_v1agent_audio_done import AgentV1AgentAudioDone +from .types.agent_v1agent_started_speaking import AgentV1AgentStartedSpeaking +from .types.agent_v1agent_thinking import AgentV1AgentThinking +from .types.agent_v1conversation_text import AgentV1ConversationText +from .types.agent_v1error import AgentV1Error +from .types.agent_v1function_call_request import AgentV1FunctionCallRequest +from .types.agent_v1inject_agent_message import AgentV1InjectAgentMessage +from .types.agent_v1inject_user_message import AgentV1InjectUserMessage +from .types.agent_v1injection_refused import AgentV1InjectionRefused +from .types.agent_v1keep_alive import AgentV1KeepAlive +from .types.agent_v1prompt_updated import AgentV1PromptUpdated +from .types.agent_v1receive_function_call_response import AgentV1ReceiveFunctionCallResponse +from .types.agent_v1send_function_call_response import AgentV1SendFunctionCallResponse +from .types.agent_v1settings import AgentV1Settings +from .types.agent_v1settings_applied import AgentV1SettingsApplied +from .types.agent_v1speak_updated import AgentV1SpeakUpdated +from .types.agent_v1update_prompt import AgentV1UpdatePrompt +from .types.agent_v1update_speak import AgentV1UpdateSpeak +from .types.agent_v1user_started_speaking import AgentV1UserStartedSpeaking +from .types.agent_v1warning import AgentV1Warning +from .types.agent_v1welcome import AgentV1Welcome try: from websockets.legacy.client import WebSocketClientProtocol # type: ignore except ImportError: from websockets import WebSocketClientProtocol # type: ignore -# Socket message types -from ...extensions.types.sockets import ( - AgentV1AgentAudioDoneEvent, - AgentV1AgentStartedSpeakingEvent, - AgentV1AgentThinkingEvent, - AgentV1AudioChunkEvent, - AgentV1ControlMessage, - AgentV1ConversationTextEvent, - AgentV1ErrorEvent, - AgentV1FunctionCallRequestEvent, - AgentV1FunctionCallResponseMessage, - AgentV1HistoryFunctionCalls, - AgentV1HistoryMessage, - AgentV1InjectAgentMessageMessage, - AgentV1InjectionRefusedEvent, - AgentV1InjectUserMessageMessage, - AgentV1MediaMessage, - AgentV1PromptUpdatedEvent, - AgentV1SettingsAppliedEvent, - # Send message types - AgentV1SettingsMessage, - AgentV1SpeakUpdatedEvent, - AgentV1UpdatePromptMessage, - AgentV1UpdateSpeakMessage, - AgentV1UserStartedSpeakingEvent, - AgentV1WarningEvent, - # Receive event types - AgentV1WelcomeMessage, -) - -# Response union type with binary support V1SocketClientResponse = typing.Union[ - AgentV1WelcomeMessage, - AgentV1SettingsAppliedEvent, - AgentV1HistoryMessage, - AgentV1HistoryFunctionCalls, - AgentV1ConversationTextEvent, - AgentV1UserStartedSpeakingEvent, - AgentV1AgentThinkingEvent, - AgentV1FunctionCallRequestEvent, - AgentV1FunctionCallResponseMessage, # Bidirectional: Server β†’ Client function responses - AgentV1AgentStartedSpeakingEvent, - AgentV1AgentAudioDoneEvent, - AgentV1PromptUpdatedEvent, - AgentV1SpeakUpdatedEvent, - AgentV1InjectionRefusedEvent, - AgentV1ErrorEvent, - AgentV1WarningEvent, - AgentV1AudioChunkEvent, # Binary audio data - bytes, # Raw binary audio chunks + AgentV1ReceiveFunctionCallResponse, + AgentV1PromptUpdated, + AgentV1SpeakUpdated, + AgentV1InjectionRefused, + AgentV1Welcome, + AgentV1SettingsApplied, + AgentV1ConversationText, + AgentV1UserStartedSpeaking, + AgentV1AgentThinking, + AgentV1FunctionCallRequest, + AgentV1AgentStartedSpeaking, + AgentV1AgentAudioDone, + AgentV1Error, + AgentV1Warning, + str, ] @@ -73,114 +59,108 @@ def __init__(self, *, websocket: WebSocketClientProtocol): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is for audio chunks).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - async def __aiter__(self): async for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore async def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages for Agent conversations. Emits events in the following order: - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received (binary audio or JSON events) + - EventType.MESSAGE for each message received - EventType.ERROR if an error occurs - EventType.CLOSE when connection is closed """ await self._emit_async(EventType.OPEN, None) try: async for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore await self._emit_async(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - await self._emit_async(EventType.ERROR, exc) + await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) - async def recv(self) -> V1SocketClientResponse: + async def send_agent_v_1_settings(self, message: AgentV1Settings) -> None: """ - Receive a message from the websocket connection. - Handles both binary and JSON messages. + Send a message to the websocket connection. + The message will be sent as a AgentV1Settings. """ - data = await self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + await self._send_model(message) - async def _send(self, data: typing.Any) -> None: + async def send_agent_v_1_update_speak(self, message: AgentV1UpdateSpeak) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateSpeak. """ - if isinstance(data, (bytes, bytearray)): - await self._websocket.send(data) - elif isinstance(data, dict): - await self._websocket.send(json.dumps(data)) - else: - await self._websocket.send(data) + await self._send_model(message) - async def _send_model(self, data: typing.Any) -> None: + async def send_agent_v_1_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: """ - Send a Pydantic model to the websocket connection. + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectUserMessage. """ - await self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - async def send_settings(self, message: AgentV1SettingsMessage) -> None: - """Send initial agent configuration settings.""" await self._send_model(message) - async def send_control(self, message: AgentV1ControlMessage) -> None: - """Send a control message (keep_alive, etc.).""" + async def send_agent_v_1_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectAgentMessage. + """ await self._send_model(message) - async def send_update_speak(self, message: AgentV1UpdateSpeakMessage) -> None: - """Update the agent's speech synthesis settings.""" + async def send_agent_v_1_send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1SendFunctionCallResponse. + """ await self._send_model(message) - async def send_update_prompt(self, message: AgentV1UpdatePromptMessage) -> None: - """Update the agent's system prompt.""" + async def send_agent_v_1_keep_alive(self, message: AgentV1KeepAlive) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1KeepAlive. + """ await self._send_model(message) - async def send_inject_user_message(self, message: AgentV1InjectUserMessageMessage) -> None: - """Inject a user message into the conversation.""" + async def send_agent_v_1_update_prompt(self, message: AgentV1UpdatePrompt) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdatePrompt. + """ await self._send_model(message) - async def send_inject_agent_message(self, message: AgentV1InjectAgentMessageMessage) -> None: - """Inject an agent message into the conversation.""" + async def send_agent_v_1_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ await self._send_model(message) - async def send_function_call_response(self, message: AgentV1FunctionCallResponseMessage) -> None: - """Send the result of a function call back to the agent.""" - await self._send_model(message) + async def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = await self._websocket.recv() + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore + + async def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) - async def send_media(self, message: AgentV1MediaMessage) -> None: - """Send binary audio data to the agent.""" - await self._send(message) + async def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + await self._send(data.dict()) class V1SocketClient(EventEmitterMixin): @@ -188,111 +168,105 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is for audio chunks).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - def __iter__(self): for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages for Agent conversations. Emits events in the following order: - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received (binary audio or JSON events) + - EventType.MESSAGE for each message received - EventType.ERROR if an error occurs - EventType.CLOSE when connection is closed """ self._emit(EventType.OPEN, None) try: for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore self._emit(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - self._emit(EventType.ERROR, exc) + self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) - def recv(self) -> V1SocketClientResponse: + def send_agent_v_1_settings(self, message: AgentV1Settings) -> None: """ - Receive a message from the websocket connection. - Handles both binary and JSON messages. + Send a message to the websocket connection. + The message will be sent as a AgentV1Settings. """ - data = self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + self._send_model(message) - def _send(self, data: typing.Any) -> None: + def send_agent_v_1_update_speak(self, message: AgentV1UpdateSpeak) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateSpeak. """ - if isinstance(data, (bytes, bytearray)): - self._websocket.send(data) - elif isinstance(data, dict): - self._websocket.send(json.dumps(data)) - else: - self._websocket.send(data) + self._send_model(message) - def _send_model(self, data: typing.Any) -> None: + def send_agent_v_1_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: """ - Send a Pydantic model to the websocket connection. + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectUserMessage. """ - self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - def send_settings(self, message: AgentV1SettingsMessage) -> None: - """Send initial agent configuration settings.""" self._send_model(message) - def send_control(self, message: AgentV1ControlMessage) -> None: - """Send a control message (keep_alive, etc.).""" + def send_agent_v_1_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectAgentMessage. + """ self._send_model(message) - def send_update_speak(self, message: AgentV1UpdateSpeakMessage) -> None: - """Update the agent's speech synthesis settings.""" + def send_agent_v_1_send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1SendFunctionCallResponse. + """ self._send_model(message) - def send_update_prompt(self, message: AgentV1UpdatePromptMessage) -> None: - """Update the agent's system prompt.""" + def send_agent_v_1_keep_alive(self, message: AgentV1KeepAlive) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1KeepAlive. + """ self._send_model(message) - def send_inject_user_message(self, message: AgentV1InjectUserMessageMessage) -> None: - """Inject a user message into the conversation.""" + def send_agent_v_1_update_prompt(self, message: AgentV1UpdatePrompt) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdatePrompt. + """ self._send_model(message) - def send_inject_agent_message(self, message: AgentV1InjectAgentMessageMessage) -> None: - """Inject an agent message into the conversation.""" + def send_agent_v_1_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ self._send_model(message) - def send_function_call_response(self, message: AgentV1FunctionCallResponseMessage) -> None: - """Send the result of a function call back to the agent.""" - self._send_model(message) + def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = self._websocket.recv() + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore + + def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) - def send_media(self, message: AgentV1MediaMessage) -> None: - """Send binary audio data to the agent.""" - self._send(message) + def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + self._send(data.dict()) diff --git a/src/deepgram/agent/v1/types/__init__.py b/src/deepgram/agent/v1/types/__init__.py new file mode 100644 index 00000000..9007d199 --- /dev/null +++ b/src/deepgram/agent/v1/types/__init__.py @@ -0,0 +1,482 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .agent_v1agent_audio_done import AgentV1AgentAudioDone + from .agent_v1agent_started_speaking import AgentV1AgentStartedSpeaking + from .agent_v1agent_thinking import AgentV1AgentThinking + from .agent_v1conversation_text import AgentV1ConversationText + from .agent_v1conversation_text_role import AgentV1ConversationTextRole + from .agent_v1error import AgentV1Error + from .agent_v1function_call_request import AgentV1FunctionCallRequest + from .agent_v1function_call_request_functions_item import AgentV1FunctionCallRequestFunctionsItem + from .agent_v1inject_agent_message import AgentV1InjectAgentMessage + from .agent_v1inject_user_message import AgentV1InjectUserMessage + from .agent_v1injection_refused import AgentV1InjectionRefused + from .agent_v1keep_alive import AgentV1KeepAlive + from .agent_v1prompt_updated import AgentV1PromptUpdated + from .agent_v1receive_function_call_response import AgentV1ReceiveFunctionCallResponse + from .agent_v1send_function_call_response import AgentV1SendFunctionCallResponse + from .agent_v1settings import AgentV1Settings + from .agent_v1settings_agent import AgentV1SettingsAgent + from .agent_v1settings_agent_context import AgentV1SettingsAgentContext + from .agent_v1settings_agent_context_messages_item import AgentV1SettingsAgentContextMessagesItem + from .agent_v1settings_agent_context_messages_item_content import AgentV1SettingsAgentContextMessagesItemContent + from .agent_v1settings_agent_context_messages_item_content_role import ( + AgentV1SettingsAgentContextMessagesItemContentRole, + ) + from .agent_v1settings_agent_context_messages_item_function_calls import ( + AgentV1SettingsAgentContextMessagesItemFunctionCalls, + ) + from .agent_v1settings_agent_context_messages_item_function_calls_function_calls_item import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem, + ) + from .agent_v1settings_agent_listen import AgentV1SettingsAgentListen + from .agent_v1settings_agent_listen_provider import AgentV1SettingsAgentListenProvider + from .agent_v1settings_agent_speak import AgentV1SettingsAgentSpeak + from .agent_v1settings_agent_speak_endpoint import AgentV1SettingsAgentSpeakEndpoint + from .agent_v1settings_agent_speak_endpoint_endpoint import AgentV1SettingsAgentSpeakEndpointEndpoint + from .agent_v1settings_agent_speak_endpoint_provider import ( + AgentV1SettingsAgentSpeakEndpointProvider, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly, + AgentV1SettingsAgentSpeakEndpointProvider_Cartesia, + AgentV1SettingsAgentSpeakEndpointProvider_Deepgram, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAi, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPolly, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, + ) + from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, + ) + from .agent_v1settings_agent_speak_endpoint_provider_cartesia import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesia, + ) + from .agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, + ) + from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice, + ) + from .agent_v1settings_agent_speak_endpoint_provider_deepgram import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgram, + ) + from .agent_v1settings_agent_speak_endpoint_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, + ) + from .agent_v1settings_agent_speak_endpoint_provider_eleven_labs import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabs, + ) + from .agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, + ) + from .agent_v1settings_agent_speak_endpoint_provider_open_ai import AgentV1SettingsAgentSpeakEndpointProviderOpenAi + from .agent_v1settings_agent_speak_endpoint_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, + ) + from .agent_v1settings_agent_speak_endpoint_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, + ) + from .agent_v1settings_agent_speak_item import AgentV1SettingsAgentSpeakItem + from .agent_v1settings_agent_speak_item_endpoint import AgentV1SettingsAgentSpeakItemEndpoint + from .agent_v1settings_agent_speak_item_provider import ( + AgentV1SettingsAgentSpeakItemProvider, + AgentV1SettingsAgentSpeakItemProvider_AwsPolly, + AgentV1SettingsAgentSpeakItemProvider_Cartesia, + AgentV1SettingsAgentSpeakItemProvider_Deepgram, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabs, + AgentV1SettingsAgentSpeakItemProvider_OpenAi, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly import AgentV1SettingsAgentSpeakItemProviderAwsPolly + from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, + ) + from .agent_v1settings_agent_speak_item_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, + ) + from .agent_v1settings_agent_speak_item_provider_cartesia import AgentV1SettingsAgentSpeakItemProviderCartesia + from .agent_v1settings_agent_speak_item_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, + ) + from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoice, + ) + from .agent_v1settings_agent_speak_item_provider_deepgram import AgentV1SettingsAgentSpeakItemProviderDeepgram + from .agent_v1settings_agent_speak_item_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, + ) + from .agent_v1settings_agent_speak_item_provider_eleven_labs import AgentV1SettingsAgentSpeakItemProviderElevenLabs + from .agent_v1settings_agent_speak_item_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, + ) + from .agent_v1settings_agent_speak_item_provider_open_ai import AgentV1SettingsAgentSpeakItemProviderOpenAi + from .agent_v1settings_agent_speak_item_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiModel, + ) + from .agent_v1settings_agent_speak_item_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakItemProviderOpenAiVoice, + ) + from .agent_v1settings_agent_think import AgentV1SettingsAgentThink + from .agent_v1settings_agent_think_context_length import AgentV1SettingsAgentThinkContextLength + from .agent_v1settings_agent_think_endpoint import AgentV1SettingsAgentThinkEndpoint + from .agent_v1settings_agent_think_functions_item import AgentV1SettingsAgentThinkFunctionsItem + from .agent_v1settings_agent_think_functions_item_endpoint import AgentV1SettingsAgentThinkFunctionsItemEndpoint + from .agent_v1settings_agent_think_provider import AgentV1SettingsAgentThinkProvider + from .agent_v1settings_agent_think_provider_credentials import AgentV1SettingsAgentThinkProviderCredentials + from .agent_v1settings_agent_think_provider_credentials_credentials import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentials, + ) + from .agent_v1settings_agent_think_provider_credentials_credentials_type import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentialsType, + ) + from .agent_v1settings_agent_think_provider_credentials_model import ( + AgentV1SettingsAgentThinkProviderCredentialsModel, + ) + from .agent_v1settings_agent_think_provider_model import AgentV1SettingsAgentThinkProviderModel + from .agent_v1settings_agent_think_provider_three import AgentV1SettingsAgentThinkProviderThree + from .agent_v1settings_agent_think_provider_three_model import AgentV1SettingsAgentThinkProviderThreeModel + from .agent_v1settings_agent_think_provider_two import AgentV1SettingsAgentThinkProviderTwo + from .agent_v1settings_agent_think_provider_two_model import AgentV1SettingsAgentThinkProviderTwoModel + from .agent_v1settings_agent_think_provider_zero import AgentV1SettingsAgentThinkProviderZero + from .agent_v1settings_agent_think_provider_zero_model import AgentV1SettingsAgentThinkProviderZeroModel + from .agent_v1settings_applied import AgentV1SettingsApplied + from .agent_v1settings_audio import AgentV1SettingsAudio + from .agent_v1settings_audio_input import AgentV1SettingsAudioInput + from .agent_v1settings_audio_input_encoding import AgentV1SettingsAudioInputEncoding + from .agent_v1settings_audio_output import AgentV1SettingsAudioOutput + from .agent_v1settings_audio_output_encoding import AgentV1SettingsAudioOutputEncoding + from .agent_v1settings_flags import AgentV1SettingsFlags + from .agent_v1speak_updated import AgentV1SpeakUpdated + from .agent_v1update_prompt import AgentV1UpdatePrompt + from .agent_v1update_speak import AgentV1UpdateSpeak + from .agent_v1update_speak_speak import AgentV1UpdateSpeakSpeak + from .agent_v1update_speak_speak_endpoint import AgentV1UpdateSpeakSpeakEndpoint + from .agent_v1update_speak_speak_provider import ( + AgentV1UpdateSpeakSpeakProvider, + AgentV1UpdateSpeakSpeakProvider_AwsPolly, + AgentV1UpdateSpeakSpeakProvider_Cartesia, + AgentV1UpdateSpeakSpeakProvider_Deepgram, + AgentV1UpdateSpeakSpeakProvider_ElevenLabs, + AgentV1UpdateSpeakSpeakProvider_OpenAi, + ) + from .agent_v1update_speak_speak_provider_aws_polly import AgentV1UpdateSpeakSpeakProviderAwsPolly + from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials, + ) + from .agent_v1update_speak_speak_provider_aws_polly_credentials_type import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType, + ) + from .agent_v1update_speak_speak_provider_aws_polly_engine import AgentV1UpdateSpeakSpeakProviderAwsPollyEngine + from .agent_v1update_speak_speak_provider_aws_polly_voice import AgentV1UpdateSpeakSpeakProviderAwsPollyVoice + from .agent_v1update_speak_speak_provider_cartesia import AgentV1UpdateSpeakSpeakProviderCartesia + from .agent_v1update_speak_speak_provider_cartesia_model_id import AgentV1UpdateSpeakSpeakProviderCartesiaModelId + from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoice + from .agent_v1update_speak_speak_provider_deepgram import AgentV1UpdateSpeakSpeakProviderDeepgram + from .agent_v1update_speak_speak_provider_deepgram_model import AgentV1UpdateSpeakSpeakProviderDeepgramModel + from .agent_v1update_speak_speak_provider_eleven_labs import AgentV1UpdateSpeakSpeakProviderElevenLabs + from .agent_v1update_speak_speak_provider_eleven_labs_model_id import ( + AgentV1UpdateSpeakSpeakProviderElevenLabsModelId, + ) + from .agent_v1update_speak_speak_provider_open_ai import AgentV1UpdateSpeakSpeakProviderOpenAi + from .agent_v1update_speak_speak_provider_open_ai_model import AgentV1UpdateSpeakSpeakProviderOpenAiModel + from .agent_v1update_speak_speak_provider_open_ai_voice import AgentV1UpdateSpeakSpeakProviderOpenAiVoice + from .agent_v1user_started_speaking import AgentV1UserStartedSpeaking + from .agent_v1warning import AgentV1Warning + from .agent_v1welcome import AgentV1Welcome +_dynamic_imports: typing.Dict[str, str] = { + "AgentV1AgentAudioDone": ".agent_v1agent_audio_done", + "AgentV1AgentStartedSpeaking": ".agent_v1agent_started_speaking", + "AgentV1AgentThinking": ".agent_v1agent_thinking", + "AgentV1ConversationText": ".agent_v1conversation_text", + "AgentV1ConversationTextRole": ".agent_v1conversation_text_role", + "AgentV1Error": ".agent_v1error", + "AgentV1FunctionCallRequest": ".agent_v1function_call_request", + "AgentV1FunctionCallRequestFunctionsItem": ".agent_v1function_call_request_functions_item", + "AgentV1InjectAgentMessage": ".agent_v1inject_agent_message", + "AgentV1InjectUserMessage": ".agent_v1inject_user_message", + "AgentV1InjectionRefused": ".agent_v1injection_refused", + "AgentV1KeepAlive": ".agent_v1keep_alive", + "AgentV1PromptUpdated": ".agent_v1prompt_updated", + "AgentV1ReceiveFunctionCallResponse": ".agent_v1receive_function_call_response", + "AgentV1SendFunctionCallResponse": ".agent_v1send_function_call_response", + "AgentV1Settings": ".agent_v1settings", + "AgentV1SettingsAgent": ".agent_v1settings_agent", + "AgentV1SettingsAgentContext": ".agent_v1settings_agent_context", + "AgentV1SettingsAgentContextMessagesItem": ".agent_v1settings_agent_context_messages_item", + "AgentV1SettingsAgentContextMessagesItemContent": ".agent_v1settings_agent_context_messages_item_content", + "AgentV1SettingsAgentContextMessagesItemContentRole": ".agent_v1settings_agent_context_messages_item_content_role", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls": ".agent_v1settings_agent_context_messages_item_function_calls", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem": ".agent_v1settings_agent_context_messages_item_function_calls_function_calls_item", + "AgentV1SettingsAgentListen": ".agent_v1settings_agent_listen", + "AgentV1SettingsAgentListenProvider": ".agent_v1settings_agent_listen_provider", + "AgentV1SettingsAgentSpeak": ".agent_v1settings_agent_speak", + "AgentV1SettingsAgentSpeakEndpoint": ".agent_v1settings_agent_speak_endpoint", + "AgentV1SettingsAgentSpeakEndpointEndpoint": ".agent_v1settings_agent_speak_endpoint_endpoint", + "AgentV1SettingsAgentSpeakEndpointProvider": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice": ".agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia": ".agent_v1settings_agent_speak_endpoint_provider_cartesia", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId": ".agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice": ".agent_v1settings_agent_speak_endpoint_provider_cartesia_voice", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram": ".agent_v1settings_agent_speak_endpoint_provider_deepgram", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel": ".agent_v1settings_agent_speak_endpoint_provider_deepgram_model", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs": ".agent_v1settings_agent_speak_endpoint_provider_eleven_labs", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId": ".agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi": ".agent_v1settings_agent_speak_endpoint_provider_open_ai", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel": ".agent_v1settings_agent_speak_endpoint_provider_open_ai_model", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice": ".agent_v1settings_agent_speak_endpoint_provider_open_ai_voice", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi": ".agent_v1settings_agent_speak_endpoint_provider", + "AgentV1SettingsAgentSpeakItem": ".agent_v1settings_agent_speak_item", + "AgentV1SettingsAgentSpeakItemEndpoint": ".agent_v1settings_agent_speak_item_endpoint", + "AgentV1SettingsAgentSpeakItemProvider": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly": ".agent_v1settings_agent_speak_item_provider_aws_polly", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials": ".agent_v1settings_agent_speak_item_provider_aws_polly_credentials", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType": ".agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine": ".agent_v1settings_agent_speak_item_provider_aws_polly_engine", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice": ".agent_v1settings_agent_speak_item_provider_aws_polly_voice", + "AgentV1SettingsAgentSpeakItemProviderCartesia": ".agent_v1settings_agent_speak_item_provider_cartesia", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId": ".agent_v1settings_agent_speak_item_provider_cartesia_model_id", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice": ".agent_v1settings_agent_speak_item_provider_cartesia_voice", + "AgentV1SettingsAgentSpeakItemProviderDeepgram": ".agent_v1settings_agent_speak_item_provider_deepgram", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel": ".agent_v1settings_agent_speak_item_provider_deepgram_model", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs": ".agent_v1settings_agent_speak_item_provider_eleven_labs", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId": ".agent_v1settings_agent_speak_item_provider_eleven_labs_model_id", + "AgentV1SettingsAgentSpeakItemProviderOpenAi": ".agent_v1settings_agent_speak_item_provider_open_ai", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel": ".agent_v1settings_agent_speak_item_provider_open_ai_model", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice": ".agent_v1settings_agent_speak_item_provider_open_ai_voice", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi": ".agent_v1settings_agent_speak_item_provider", + "AgentV1SettingsAgentThink": ".agent_v1settings_agent_think", + "AgentV1SettingsAgentThinkContextLength": ".agent_v1settings_agent_think_context_length", + "AgentV1SettingsAgentThinkEndpoint": ".agent_v1settings_agent_think_endpoint", + "AgentV1SettingsAgentThinkFunctionsItem": ".agent_v1settings_agent_think_functions_item", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint": ".agent_v1settings_agent_think_functions_item_endpoint", + "AgentV1SettingsAgentThinkProvider": ".agent_v1settings_agent_think_provider", + "AgentV1SettingsAgentThinkProviderCredentials": ".agent_v1settings_agent_think_provider_credentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials": ".agent_v1settings_agent_think_provider_credentials_credentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType": ".agent_v1settings_agent_think_provider_credentials_credentials_type", + "AgentV1SettingsAgentThinkProviderCredentialsModel": ".agent_v1settings_agent_think_provider_credentials_model", + "AgentV1SettingsAgentThinkProviderModel": ".agent_v1settings_agent_think_provider_model", + "AgentV1SettingsAgentThinkProviderThree": ".agent_v1settings_agent_think_provider_three", + "AgentV1SettingsAgentThinkProviderThreeModel": ".agent_v1settings_agent_think_provider_three_model", + "AgentV1SettingsAgentThinkProviderTwo": ".agent_v1settings_agent_think_provider_two", + "AgentV1SettingsAgentThinkProviderTwoModel": ".agent_v1settings_agent_think_provider_two_model", + "AgentV1SettingsAgentThinkProviderZero": ".agent_v1settings_agent_think_provider_zero", + "AgentV1SettingsAgentThinkProviderZeroModel": ".agent_v1settings_agent_think_provider_zero_model", + "AgentV1SettingsApplied": ".agent_v1settings_applied", + "AgentV1SettingsAudio": ".agent_v1settings_audio", + "AgentV1SettingsAudioInput": ".agent_v1settings_audio_input", + "AgentV1SettingsAudioInputEncoding": ".agent_v1settings_audio_input_encoding", + "AgentV1SettingsAudioOutput": ".agent_v1settings_audio_output", + "AgentV1SettingsAudioOutputEncoding": ".agent_v1settings_audio_output_encoding", + "AgentV1SettingsFlags": ".agent_v1settings_flags", + "AgentV1SpeakUpdated": ".agent_v1speak_updated", + "AgentV1UpdatePrompt": ".agent_v1update_prompt", + "AgentV1UpdateSpeak": ".agent_v1update_speak", + "AgentV1UpdateSpeakSpeak": ".agent_v1update_speak_speak", + "AgentV1UpdateSpeakSpeakEndpoint": ".agent_v1update_speak_speak_endpoint", + "AgentV1UpdateSpeakSpeakProvider": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProviderAwsPolly": ".agent_v1update_speak_speak_provider_aws_polly", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials": ".agent_v1update_speak_speak_provider_aws_polly_credentials", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType": ".agent_v1update_speak_speak_provider_aws_polly_credentials_type", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine": ".agent_v1update_speak_speak_provider_aws_polly_engine", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice": ".agent_v1update_speak_speak_provider_aws_polly_voice", + "AgentV1UpdateSpeakSpeakProviderCartesia": ".agent_v1update_speak_speak_provider_cartesia", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId": ".agent_v1update_speak_speak_provider_cartesia_model_id", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice": ".agent_v1update_speak_speak_provider_cartesia_voice", + "AgentV1UpdateSpeakSpeakProviderDeepgram": ".agent_v1update_speak_speak_provider_deepgram", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel": ".agent_v1update_speak_speak_provider_deepgram_model", + "AgentV1UpdateSpeakSpeakProviderElevenLabs": ".agent_v1update_speak_speak_provider_eleven_labs", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId": ".agent_v1update_speak_speak_provider_eleven_labs_model_id", + "AgentV1UpdateSpeakSpeakProviderOpenAi": ".agent_v1update_speak_speak_provider_open_ai", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel": ".agent_v1update_speak_speak_provider_open_ai_model", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice": ".agent_v1update_speak_speak_provider_open_ai_voice", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_Cartesia": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_Deepgram": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs": ".agent_v1update_speak_speak_provider", + "AgentV1UpdateSpeakSpeakProvider_OpenAi": ".agent_v1update_speak_speak_provider", + "AgentV1UserStartedSpeaking": ".agent_v1user_started_speaking", + "AgentV1Warning": ".agent_v1warning", + "AgentV1Welcome": ".agent_v1welcome", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "AgentV1AgentAudioDone", + "AgentV1AgentStartedSpeaking", + "AgentV1AgentThinking", + "AgentV1ConversationText", + "AgentV1ConversationTextRole", + "AgentV1Error", + "AgentV1FunctionCallRequest", + "AgentV1FunctionCallRequestFunctionsItem", + "AgentV1InjectAgentMessage", + "AgentV1InjectUserMessage", + "AgentV1InjectionRefused", + "AgentV1KeepAlive", + "AgentV1PromptUpdated", + "AgentV1ReceiveFunctionCallResponse", + "AgentV1SendFunctionCallResponse", + "AgentV1Settings", + "AgentV1SettingsAgent", + "AgentV1SettingsAgentContext", + "AgentV1SettingsAgentContextMessagesItem", + "AgentV1SettingsAgentContextMessagesItemContent", + "AgentV1SettingsAgentContextMessagesItemContentRole", + "AgentV1SettingsAgentContextMessagesItemFunctionCalls", + "AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem", + "AgentV1SettingsAgentListen", + "AgentV1SettingsAgentListenProvider", + "AgentV1SettingsAgentSpeak", + "AgentV1SettingsAgentSpeakEndpoint", + "AgentV1SettingsAgentSpeakEndpointEndpoint", + "AgentV1SettingsAgentSpeakEndpointProvider", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPolly", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakEndpointProviderCartesia", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgram", + "AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAi", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel", + "AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly", + "AgentV1SettingsAgentSpeakEndpointProvider_Cartesia", + "AgentV1SettingsAgentSpeakEndpointProvider_Deepgram", + "AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakEndpointProvider_OpenAi", + "AgentV1SettingsAgentSpeakItem", + "AgentV1SettingsAgentSpeakItemEndpoint", + "AgentV1SettingsAgentSpeakItemProvider", + "AgentV1SettingsAgentSpeakItemProviderAwsPolly", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine", + "AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice", + "AgentV1SettingsAgentSpeakItemProviderCartesia", + "AgentV1SettingsAgentSpeakItemProviderCartesiaModelId", + "AgentV1SettingsAgentSpeakItemProviderCartesiaVoice", + "AgentV1SettingsAgentSpeakItemProviderDeepgram", + "AgentV1SettingsAgentSpeakItemProviderDeepgramModel", + "AgentV1SettingsAgentSpeakItemProviderElevenLabs", + "AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId", + "AgentV1SettingsAgentSpeakItemProviderOpenAi", + "AgentV1SettingsAgentSpeakItemProviderOpenAiModel", + "AgentV1SettingsAgentSpeakItemProviderOpenAiVoice", + "AgentV1SettingsAgentSpeakItemProvider_AwsPolly", + "AgentV1SettingsAgentSpeakItemProvider_Cartesia", + "AgentV1SettingsAgentSpeakItemProvider_Deepgram", + "AgentV1SettingsAgentSpeakItemProvider_ElevenLabs", + "AgentV1SettingsAgentSpeakItemProvider_OpenAi", + "AgentV1SettingsAgentThink", + "AgentV1SettingsAgentThinkContextLength", + "AgentV1SettingsAgentThinkEndpoint", + "AgentV1SettingsAgentThinkFunctionsItem", + "AgentV1SettingsAgentThinkFunctionsItemEndpoint", + "AgentV1SettingsAgentThinkProvider", + "AgentV1SettingsAgentThinkProviderCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentials", + "AgentV1SettingsAgentThinkProviderCredentialsCredentialsType", + "AgentV1SettingsAgentThinkProviderCredentialsModel", + "AgentV1SettingsAgentThinkProviderModel", + "AgentV1SettingsAgentThinkProviderThree", + "AgentV1SettingsAgentThinkProviderThreeModel", + "AgentV1SettingsAgentThinkProviderTwo", + "AgentV1SettingsAgentThinkProviderTwoModel", + "AgentV1SettingsAgentThinkProviderZero", + "AgentV1SettingsAgentThinkProviderZeroModel", + "AgentV1SettingsApplied", + "AgentV1SettingsAudio", + "AgentV1SettingsAudioInput", + "AgentV1SettingsAudioInputEncoding", + "AgentV1SettingsAudioOutput", + "AgentV1SettingsAudioOutputEncoding", + "AgentV1SettingsFlags", + "AgentV1SpeakUpdated", + "AgentV1UpdatePrompt", + "AgentV1UpdateSpeak", + "AgentV1UpdateSpeakSpeak", + "AgentV1UpdateSpeakSpeakEndpoint", + "AgentV1UpdateSpeakSpeakProvider", + "AgentV1UpdateSpeakSpeakProviderAwsPolly", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials", + "AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType", + "AgentV1UpdateSpeakSpeakProviderAwsPollyEngine", + "AgentV1UpdateSpeakSpeakProviderAwsPollyVoice", + "AgentV1UpdateSpeakSpeakProviderCartesia", + "AgentV1UpdateSpeakSpeakProviderCartesiaModelId", + "AgentV1UpdateSpeakSpeakProviderCartesiaVoice", + "AgentV1UpdateSpeakSpeakProviderDeepgram", + "AgentV1UpdateSpeakSpeakProviderDeepgramModel", + "AgentV1UpdateSpeakSpeakProviderElevenLabs", + "AgentV1UpdateSpeakSpeakProviderElevenLabsModelId", + "AgentV1UpdateSpeakSpeakProviderOpenAi", + "AgentV1UpdateSpeakSpeakProviderOpenAiModel", + "AgentV1UpdateSpeakSpeakProviderOpenAiVoice", + "AgentV1UpdateSpeakSpeakProvider_AwsPolly", + "AgentV1UpdateSpeakSpeakProvider_Cartesia", + "AgentV1UpdateSpeakSpeakProvider_Deepgram", + "AgentV1UpdateSpeakSpeakProvider_ElevenLabs", + "AgentV1UpdateSpeakSpeakProvider_OpenAi", + "AgentV1UserStartedSpeaking", + "AgentV1Warning", + "AgentV1Welcome", +] diff --git a/src/deepgram/extensions/types/sockets/speak_v1_text_message.py b/src/deepgram/agent/v1/types/agent_v1agent_audio_done.py similarity index 59% rename from src/deepgram/extensions/types/sockets/speak_v1_text_message.py rename to src/deepgram/agent/v1/types/agent_v1agent_audio_done.py index a6d49bfa..95f3f376 100644 --- a/src/deepgram/extensions/types/sockets/speak_v1_text_message.py +++ b/src/deepgram/agent/v1/types/agent_v1agent_audio_done.py @@ -1,4 +1,4 @@ -# Speak V1 Text Message - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,20 +6,16 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class SpeakV1TextMessage(UniversalBaseModel): +class AgentV1AgentAudioDone(UniversalBaseModel): + type: typing.Literal["AgentAudioDone"] = pydantic.Field(default="AgentAudioDone") """ - Request to convert text to speech + Message type identifier indicating the agent has finished sending audio """ - - type: typing.Literal["Speak"] - """Message type identifier""" - - text: str - """The input text to be converted to speech""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1agent_started_speaking.py b/src/deepgram/agent/v1/types/agent_v1agent_started_speaking.py new file mode 100644 index 00000000..e6c47c6f --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1agent_started_speaking.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1AgentStartedSpeaking(UniversalBaseModel): + type: typing.Literal["AgentStartedSpeaking"] = pydantic.Field(default="AgentStartedSpeaking") + """ + Message type identifier for agent started speaking + """ + + total_latency: float = pydantic.Field() + """ + Seconds from receiving the user's utterance to producing the agent's reply + """ + + tts_latency: float = pydantic.Field() + """ + The portion of total latency attributable to text-to-speech + """ + + ttt_latency: float = pydantic.Field() + """ + The portion of total latency attributable to text-to-text (usually an LLM) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1agent_thinking.py b/src/deepgram/agent/v1/types/agent_v1agent_thinking.py new file mode 100644 index 00000000..4b63c92f --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1agent_thinking.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1AgentThinking(UniversalBaseModel): + type: typing.Literal["AgentThinking"] = pydantic.Field(default="AgentThinking") + """ + Message type identifier for agent thinking + """ + + content: str = pydantic.Field() + """ + The text of the agent's thought process + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1conversation_text.py b/src/deepgram/agent/v1/types/agent_v1conversation_text.py new file mode 100644 index 00000000..9888c93b --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1conversation_text.py @@ -0,0 +1,33 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1conversation_text_role import AgentV1ConversationTextRole + + +class AgentV1ConversationText(UniversalBaseModel): + type: typing.Literal["ConversationText"] = pydantic.Field(default="ConversationText") + """ + Message type identifier for conversation text + """ + + role: AgentV1ConversationTextRole = pydantic.Field() + """ + Identifies who spoke the statement + """ + + content: str = pydantic.Field() + """ + The actual statement that was spoken + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1conversation_text_role.py b/src/deepgram/agent/v1/types/agent_v1conversation_text_role.py new file mode 100644 index 00000000..785333dd --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1conversation_text_role.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1ConversationTextRole = typing.Union[typing.Literal["user", "assistant"], typing.Any] diff --git a/src/deepgram/extensions/types/sockets/agent_v1_error_event.py b/src/deepgram/agent/v1/types/agent_v1error.py similarity index 50% rename from src/deepgram/extensions/types/sockets/agent_v1_error_event.py rename to src/deepgram/agent/v1/types/agent_v1error.py index 004151b7..e0c01466 100644 --- a/src/deepgram/extensions/types/sockets/agent_v1_error_event.py +++ b/src/deepgram/agent/v1/types/agent_v1error.py @@ -1,4 +1,4 @@ -# Agent V1 Error Event - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,23 +6,26 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class AgentV1ErrorEvent(UniversalBaseModel): +class AgentV1Error(UniversalBaseModel): + type: typing.Literal["Error"] = pydantic.Field(default="Error") """ - Receive an error message from the server when an error occurs + Message type identifier for error responses + """ + + description: str = pydantic.Field() + """ + A description of what went wrong + """ + + code: str = pydantic.Field() + """ + Error code identifying the type of error """ - - type: typing.Literal["Error"] - """Message type identifier for error responses""" - - description: str - """A description of what went wrong""" - - code: str - """Error code identifying the type of error""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1function_call_request.py b/src/deepgram/agent/v1/types/agent_v1function_call_request.py new file mode 100644 index 00000000..4c5e7c4a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1function_call_request.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1function_call_request_functions_item import AgentV1FunctionCallRequestFunctionsItem + + +class AgentV1FunctionCallRequest(UniversalBaseModel): + type: typing.Literal["FunctionCallRequest"] = pydantic.Field(default="FunctionCallRequest") + """ + Message type identifier for function call requests + """ + + functions: typing.List[AgentV1FunctionCallRequestFunctionsItem] = pydantic.Field() + """ + Array of functions to be called + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1function_call_request_functions_item.py b/src/deepgram/agent/v1/types/agent_v1function_call_request_functions_item.py new file mode 100644 index 00000000..dcd75dd4 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1function_call_request_functions_item.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1FunctionCallRequestFunctionsItem(UniversalBaseModel): + id: str = pydantic.Field() + """ + Unique identifier for the function call + """ + + name: str = pydantic.Field() + """ + The name of the function to call + """ + + arguments: str = pydantic.Field() + """ + JSON string containing the function arguments + """ + + client_side: bool = pydantic.Field() + """ + Whether the function should be executed client-side + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/listen_v1_speech_started_event.py b/src/deepgram/agent/v1/types/agent_v1inject_agent_message.py similarity index 53% rename from src/deepgram/extensions/types/sockets/listen_v1_speech_started_event.py rename to src/deepgram/agent/v1/types/agent_v1inject_agent_message.py index b9b4900a..6711f6dc 100644 --- a/src/deepgram/extensions/types/sockets/listen_v1_speech_started_event.py +++ b/src/deepgram/agent/v1/types/agent_v1inject_agent_message.py @@ -1,4 +1,4 @@ -# Listen V1 Speech Started Event - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,23 +6,21 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class ListenV1SpeechStartedEvent(UniversalBaseModel): +class AgentV1InjectAgentMessage(UniversalBaseModel): + type: typing.Literal["InjectAgentMessage"] = pydantic.Field(default="InjectAgentMessage") """ - vad_events is true and speech has been detected + Message type identifier for injecting an agent message + """ + + message: str = pydantic.Field() + """ + The statement that the agent should say """ - - type: typing.Literal["SpeechStarted"] - """Message type identifier""" - - channel: typing.List[int] - """The channel""" - - timestamp: float - """The timestamp""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1inject_user_message.py b/src/deepgram/agent/v1/types/agent_v1inject_user_message.py new file mode 100644 index 00000000..78a3ebf9 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1inject_user_message.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1InjectUserMessage(UniversalBaseModel): + type: typing.Literal["InjectUserMessage"] = pydantic.Field(default="InjectUserMessage") + """ + Message type identifier for injecting a user message + """ + + content: str = pydantic.Field() + """ + The specific phrase or statement the agent should respond to + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1injection_refused.py b/src/deepgram/agent/v1/types/agent_v1injection_refused.py new file mode 100644 index 00000000..b185fccc --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1injection_refused.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1InjectionRefused(UniversalBaseModel): + type: typing.Literal["InjectionRefused"] = pydantic.Field(default="InjectionRefused") + """ + Message type identifier for injection refused + """ + + message: str = pydantic.Field() + """ + Details about why the injection was refused + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/agent_v1_control_message.py b/src/deepgram/agent/v1/types/agent_v1keep_alive.py similarity index 60% rename from src/deepgram/extensions/types/sockets/agent_v1_control_message.py rename to src/deepgram/agent/v1/types/agent_v1keep_alive.py index 270e0e12..49266088 100644 --- a/src/deepgram/extensions/types/sockets/agent_v1_control_message.py +++ b/src/deepgram/agent/v1/types/agent_v1keep_alive.py @@ -1,4 +1,4 @@ -# Agent V1 Control Message - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,18 +6,21 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class AgentV1ControlMessage(UniversalBaseModel): +class AgentV1KeepAlive(UniversalBaseModel): """ Send a control message to the agent """ - - type: typing.Literal["KeepAlive"] = "KeepAlive" - """Message type identifier""" + + type: typing.Literal["KeepAlive"] = pydantic.Field(default="KeepAlive") + """ + Message type identifier + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file + extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/speak_v1_control_message.py b/src/deepgram/agent/v1/types/agent_v1prompt_updated.py similarity index 60% rename from src/deepgram/extensions/types/sockets/speak_v1_control_message.py rename to src/deepgram/agent/v1/types/agent_v1prompt_updated.py index 9715792e..f4827a96 100644 --- a/src/deepgram/extensions/types/sockets/speak_v1_control_message.py +++ b/src/deepgram/agent/v1/types/agent_v1prompt_updated.py @@ -1,4 +1,4 @@ -# Speak V1 Control Message - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,17 +6,16 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class SpeakV1ControlMessage(UniversalBaseModel): +class AgentV1PromptUpdated(UniversalBaseModel): + type: typing.Literal["PromptUpdated"] = pydantic.Field(default="PromptUpdated") """ - Control messages for managing the Text to Speech WebSocket connection + Message type identifier for prompt update confirmation """ - - type: typing.Literal["Flush", "Clear", "Close"] - """Message type identifier""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1receive_function_call_response.py b/src/deepgram/agent/v1/types/agent_v1receive_function_call_response.py new file mode 100644 index 00000000..8bf4d3ce --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1receive_function_call_response.py @@ -0,0 +1,54 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1ReceiveFunctionCallResponse(UniversalBaseModel): + """ + Function call response message used bidirectionally: + + β€’ **Client β†’ Server**: Response after client executes a function + marked as client_side: true + β€’ **Server β†’ Client**: Response after server executes a function + marked as client_side: false + + The same message structure serves both directions, enabling a unified + interface for function call responses regardless of execution location. + """ + + type: typing.Literal["FunctionCallResponse"] = pydantic.Field(default="FunctionCallResponse") + """ + Message type identifier for function call responses + """ + + id: typing.Optional[str] = pydantic.Field(default=None) + """ + The unique identifier for the function call. + + β€’ **Required for client responses**: Should match the id from + the corresponding `FunctionCallRequest` + β€’ **Optional for server responses**: Server may omit when responding + to internal function executions + """ + + name: str = pydantic.Field() + """ + The name of the function being called + """ + + content: str = pydantic.Field() + """ + The content or result of the function call + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1send_function_call_response.py b/src/deepgram/agent/v1/types/agent_v1send_function_call_response.py new file mode 100644 index 00000000..d493cbaa --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1send_function_call_response.py @@ -0,0 +1,54 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SendFunctionCallResponse(UniversalBaseModel): + """ + Function call response message used bidirectionally: + + β€’ **Client β†’ Server**: Response after client executes a function + marked as client_side: true + β€’ **Server β†’ Client**: Response after server executes a function + marked as client_side: false + + The same message structure serves both directions, enabling a unified + interface for function call responses regardless of execution location. + """ + + type: typing.Literal["FunctionCallResponse"] = pydantic.Field(default="FunctionCallResponse") + """ + Message type identifier for function call responses + """ + + id: typing.Optional[str] = pydantic.Field(default=None) + """ + The unique identifier for the function call. + + β€’ **Required for client responses**: Should match the id from + the corresponding `FunctionCallRequest` + β€’ **Optional for server responses**: Server may omit when responding + to internal function executions + """ + + name: str = pydantic.Field() + """ + The name of the function being called + """ + + content: str = pydantic.Field() + """ + The content or result of the function call + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings.py b/src/deepgram/agent/v1/types/agent_v1settings.py new file mode 100644 index 00000000..201533d3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings.py @@ -0,0 +1,40 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent import AgentV1SettingsAgent +from .agent_v1settings_audio import AgentV1SettingsAudio +from .agent_v1settings_flags import AgentV1SettingsFlags + + +class AgentV1Settings(UniversalBaseModel): + type: typing.Literal["Settings"] = "Settings" + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + Tags to associate with the request + """ + + experimental: typing.Optional[bool] = pydantic.Field(default=None) + """ + To enable experimental features + """ + + flags: typing.Optional[AgentV1SettingsFlags] = None + mip_opt_out: typing.Optional[bool] = pydantic.Field(default=None) + """ + To opt out of Deepgram Model Improvement Program + """ + + audio: AgentV1SettingsAudio + agent: AgentV1SettingsAgent + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent.py b/src/deepgram/agent/v1/types/agent_v1settings_agent.py new file mode 100644 index 00000000..3f4f6f81 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_context import AgentV1SettingsAgentContext +from .agent_v1settings_agent_listen import AgentV1SettingsAgentListen +from .agent_v1settings_agent_speak import AgentV1SettingsAgentSpeak +from .agent_v1settings_agent_think import AgentV1SettingsAgentThink + + +class AgentV1SettingsAgent(UniversalBaseModel): + language: typing.Optional[str] = pydantic.Field(default=None) + """ + Agent language + """ + + context: typing.Optional[AgentV1SettingsAgentContext] = pydantic.Field(default=None) + """ + Conversation context including the history of messages and function calls + """ + + listen: typing.Optional[AgentV1SettingsAgentListen] = None + think: typing.Optional[AgentV1SettingsAgentThink] = None + speak: typing.Optional[AgentV1SettingsAgentSpeak] = None + greeting: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional message that agent will speak at the start + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py new file mode 100644 index 00000000..635f68b5 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_context_messages_item import AgentV1SettingsAgentContextMessagesItem + + +class AgentV1SettingsAgentContext(UniversalBaseModel): + """ + Conversation context including the history of messages and function calls + """ + + messages: typing.Optional[typing.List[AgentV1SettingsAgentContextMessagesItem]] = pydantic.Field(default=None) + """ + Conversation history as a list of messages and function calls + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item.py new file mode 100644 index 00000000..2061fd2d --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item.py @@ -0,0 +1,12 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_context_messages_item_content import AgentV1SettingsAgentContextMessagesItemContent +from .agent_v1settings_agent_context_messages_item_function_calls import ( + AgentV1SettingsAgentContextMessagesItemFunctionCalls, +) + +AgentV1SettingsAgentContextMessagesItem = typing.Union[ + AgentV1SettingsAgentContextMessagesItemContent, AgentV1SettingsAgentContextMessagesItemFunctionCalls +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content.py new file mode 100644 index 00000000..9bc207ab --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_context_messages_item_content_role import ( + AgentV1SettingsAgentContextMessagesItemContentRole, +) + + +class AgentV1SettingsAgentContextMessagesItemContent(UniversalBaseModel): + """ + Conversation text as part of the conversation history + """ + + type: typing.Literal["History"] = pydantic.Field(default="History") + """ + Message type identifier for conversation text + """ + + role: AgentV1SettingsAgentContextMessagesItemContentRole = pydantic.Field() + """ + Identifies who spoke the statement + """ + + content: str = pydantic.Field() + """ + The actual statement that was spoken + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content_role.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content_role.py new file mode 100644 index 00000000..19a3bcc0 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_content_role.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentContextMessagesItemContentRole = typing.Union[typing.Literal["user", "assistant"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls.py new file mode 100644 index 00000000..6759f8b3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_context_messages_item_function_calls_function_calls_item import ( + AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem, +) + + +class AgentV1SettingsAgentContextMessagesItemFunctionCalls(UniversalBaseModel): + """ + Client-side or server-side function call request and response as part of the conversation history + """ + + type: typing.Literal["History"] = "History" + function_calls: typing.List[AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem] = ( + pydantic.Field() + ) + """ + List of function call objects + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py new file mode 100644 index 00000000..9fead900 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_messages_item_function_calls_function_calls_item.py @@ -0,0 +1,42 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentContextMessagesItemFunctionCallsFunctionCallsItem(UniversalBaseModel): + id: str = pydantic.Field() + """ + Unique identifier for the function call + """ + + name: str = pydantic.Field() + """ + Name of the function called + """ + + client_side: bool = pydantic.Field() + """ + Indicates if the call was client-side or server-side + """ + + arguments: str = pydantic.Field() + """ + Arguments passed to the function + """ + + response: str = pydantic.Field() + """ + Response from the function call + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_listen.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen.py new file mode 100644 index 00000000..22951f00 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_listen_provider import AgentV1SettingsAgentListenProvider + + +class AgentV1SettingsAgentListen(UniversalBaseModel): + provider: typing.Optional[AgentV1SettingsAgentListenProvider] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py new file mode 100644 index 00000000..07de7713 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentListenProvider(UniversalBaseModel): + type: typing.Literal["deepgram"] = pydantic.Field(default="deepgram") + """ + Provider type for speech-to-text + """ + + model: typing.Optional[str] = pydantic.Field(default=None) + """ + Model to use for speech to text + """ + + keyterms: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + Prompt key-term recognition (nova-3 'en' only) + """ + + smart_format: typing.Optional[bool] = pydantic.Field(default=None) + """ + Applies smart formatting to improve transcript readability (Deepgram providers only) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak.py new file mode 100644 index 00000000..1599944d --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_speak_endpoint import AgentV1SettingsAgentSpeakEndpoint +from .agent_v1settings_agent_speak_item import AgentV1SettingsAgentSpeakItem + +AgentV1SettingsAgentSpeak = typing.Union[AgentV1SettingsAgentSpeakEndpoint, typing.List[AgentV1SettingsAgentSpeakItem]] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint.py new file mode 100644 index 00000000..e6647bee --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_endpoint import AgentV1SettingsAgentSpeakEndpointEndpoint +from .agent_v1settings_agent_speak_endpoint_provider import AgentV1SettingsAgentSpeakEndpointProvider + + +class AgentV1SettingsAgentSpeakEndpoint(UniversalBaseModel): + provider: AgentV1SettingsAgentSpeakEndpointProvider + endpoint: typing.Optional[AgentV1SettingsAgentSpeakEndpointEndpoint] = pydantic.Field(default=None) + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_endpoint.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_endpoint.py new file mode 100644 index 00000000..e4dfb433 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_endpoint.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentSpeakEndpointEndpoint(UniversalBaseModel): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing.Optional[str] = pydantic.Field(default=None) + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing.Optional[typing.Dict[str, str]] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider.py new file mode 100644 index 00000000..63f4da9f --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider.py @@ -0,0 +1,121 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, +) +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice, +) +from .agent_v1settings_agent_speak_endpoint_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, +) +from .agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, +) +from .agent_v1settings_agent_speak_endpoint_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, +) +from .agent_v1settings_agent_speak_endpoint_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, +) + + +class AgentV1SettingsAgentSpeakEndpointProvider_Deepgram(UniversalBaseModel): + type: typing.Literal["deepgram"] = "deepgram" + model: AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs(UniversalBaseModel): + type: typing.Literal["eleven_labs"] = "eleven_labs" + model_id: AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId + language_code: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakEndpointProvider_Cartesia(UniversalBaseModel): + type: typing.Literal["cartesia"] = "cartesia" + model_id: AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId + voice: AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice + language: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakEndpointProvider_OpenAi(UniversalBaseModel): + type: typing.Literal["open_ai"] = "open_ai" + model: AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel + voice: AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly(UniversalBaseModel): + type: typing.Literal["aws_polly"] = "aws_polly" + voice: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice + language_code: str + engine: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +AgentV1SettingsAgentSpeakEndpointProvider = typing.Union[ + AgentV1SettingsAgentSpeakEndpointProvider_Deepgram, + AgentV1SettingsAgentSpeakEndpointProvider_ElevenLabs, + AgentV1SettingsAgentSpeakEndpointProvider_Cartesia, + AgentV1SettingsAgentSpeakEndpointProvider_OpenAi, + AgentV1SettingsAgentSpeakEndpointProvider_AwsPolly, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py new file mode 100644 index 00000000..dcc0771d --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine, +) +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderAwsPolly(UniversalBaseModel): + voice: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice = pydantic.Field() + """ + AWS Polly voice name + """ + + language_code: str = pydantic.Field() + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py new file mode 100644 index 00000000..3aef30ab --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentials(UniversalBaseModel): + type: AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing.Optional[str] = pydantic.Field(default=None) + """ + Required for STS only + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type.py new file mode 100644 index 00000000..515f0617 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_credentials_type.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderAwsPollyCredentialsType = typing.Union[ + typing.Literal["sts", "iam"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine.py new file mode 100644 index 00000000..2f182419 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_engine.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderAwsPollyEngine = typing.Union[ + typing.Literal["generative", "long-form", "standard", "neural"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice.py new file mode 100644 index 00000000..0079e7b3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_aws_polly_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderAwsPollyVoice = typing.Union[ + typing.Literal["Matthew", "Joanna", "Amy", "Emma", "Brian", "Arthur", "Aria", "Ayanda"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia.py new file mode 100644 index 00000000..a57d83f6 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia.py @@ -0,0 +1,34 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_endpoint_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderCartesia(UniversalBaseModel): + model_id: AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId = pydantic.Field() + """ + Cartesia model ID + """ + + voice: AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice + language: typing.Optional[str] = pydantic.Field(default=None) + """ + Cartesia language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id.py new file mode 100644 index 00000000..b81e30b3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderCartesiaModelId = typing.Union[ + typing.Literal["sonic-2", "sonic-multilingual"], typing.Any +] diff --git a/src/deepgram/extensions/types/sockets/listen_v1_control_message.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py similarity index 59% rename from src/deepgram/extensions/types/sockets/listen_v1_control_message.py rename to src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py index 1e3ff4e0..52d23801 100644 --- a/src/deepgram/extensions/types/sockets/listen_v1_control_message.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_cartesia_voice.py @@ -1,4 +1,4 @@ -# Listen V1 Control Message - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,17 +6,21 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class ListenV1ControlMessage(UniversalBaseModel): +class AgentV1SettingsAgentSpeakEndpointProviderCartesiaVoice(UniversalBaseModel): + mode: str = pydantic.Field() """ - Control messages for managing the Speech to Text WebSocket connection + Cartesia voice mode + """ + + id: str = pydantic.Field() + """ + Cartesia voice ID """ - - type: typing.Literal["Finalize", "CloseStream", "KeepAlive"] - """Message type identifier""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram.py new file mode 100644 index 00000000..c77c94b1 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderDeepgram(UniversalBaseModel): + model: AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel = pydantic.Field() + """ + Deepgram TTS model + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram_model.py new file mode 100644 index 00000000..161119d8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_deepgram_model.py @@ -0,0 +1,72 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderDeepgramModel = typing.Union[ + typing.Literal[ + "aura-asteria-en", + "aura-luna-en", + "aura-stella-en", + "aura-athena-en", + "aura-hera-en", + "aura-orion-en", + "aura-arcas-en", + "aura-perseus-en", + "aura-angus-en", + "aura-orpheus-en", + "aura-helios-en", + "aura-zeus-en", + "aura-2-amalthea-en", + "aura-2-andromeda-en", + "aura-2-apollo-en", + "aura-2-arcas-en", + "aura-2-aries-en", + "aura-2-asteria-en", + "aura-2-athena-en", + "aura-2-atlas-en", + "aura-2-aurora-en", + "aura-2-callista-en", + "aura-2-cora-en", + "aura-2-cordelia-en", + "aura-2-delia-en", + "aura-2-draco-en", + "aura-2-electra-en", + "aura-2-harmonia-en", + "aura-2-helena-en", + "aura-2-hera-en", + "aura-2-hermes-en", + "aura-2-hyperion-en", + "aura-2-iris-en", + "aura-2-janus-en", + "aura-2-juno-en", + "aura-2-jupiter-en", + "aura-2-luna-en", + "aura-2-mars-en", + "aura-2-minerva-en", + "aura-2-neptune-en", + "aura-2-odysseus-en", + "aura-2-ophelia-en", + "aura-2-orion-en", + "aura-2-orpheus-en", + "aura-2-pandora-en", + "aura-2-phoebe-en", + "aura-2-pluto-en", + "aura-2-saturn-en", + "aura-2-selene-en", + "aura-2-thalia-en", + "aura-2-theia-en", + "aura-2-vesta-en", + "aura-2-zeus-en", + "aura-2-sirio-es", + "aura-2-nestor-es", + "aura-2-carina-es", + "aura-2-celeste-es", + "aura-2-alvaro-es", + "aura-2-diana-es", + "aura-2-aquila-es", + "aura-2-selena-es", + "aura-2-estrella-es", + "aura-2-javier-es", + ], + typing.Any, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py new file mode 100644 index 00000000..5e4c8f6b --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderElevenLabs(UniversalBaseModel): + model_id: AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId = pydantic.Field() + """ + Eleven Labs model ID + """ + + language_code: typing.Optional[str] = pydantic.Field(default=None) + """ + Eleven Labs optional language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id.py new file mode 100644 index 00000000..4ed8c7e8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_eleven_labs_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderElevenLabsModelId = typing.Union[ + typing.Literal["eleven_turbo_v2_5", "eleven_monolingual_v1", "eleven_multilingual_v2"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai.py new file mode 100644 index 00000000..d2da0b7c --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai.py @@ -0,0 +1,33 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_endpoint_provider_open_ai_model import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel, +) +from .agent_v1settings_agent_speak_endpoint_provider_open_ai_voice import ( + AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice, +) + + +class AgentV1SettingsAgentSpeakEndpointProviderOpenAi(UniversalBaseModel): + model: AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel = pydantic.Field() + """ + OpenAI TTS model + """ + + voice: AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice = pydantic.Field() + """ + OpenAI voice + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_model.py new file mode 100644 index 00000000..f83a1943 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_model.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderOpenAiModel = typing.Union[typing.Literal["tts-1", "tts-1-hd"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_voice.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_voice.py new file mode 100644 index 00000000..0e8a10eb --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_endpoint_provider_open_ai_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakEndpointProviderOpenAiVoice = typing.Union[ + typing.Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item.py new file mode 100644 index 00000000..632e3fae --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_endpoint import AgentV1SettingsAgentSpeakItemEndpoint +from .agent_v1settings_agent_speak_item_provider import AgentV1SettingsAgentSpeakItemProvider + + +class AgentV1SettingsAgentSpeakItem(UniversalBaseModel): + provider: AgentV1SettingsAgentSpeakItemProvider + endpoint: typing.Optional[AgentV1SettingsAgentSpeakItemEndpoint] = pydantic.Field(default=None) + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_endpoint.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_endpoint.py new file mode 100644 index 00000000..20661736 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_endpoint.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentSpeakItemEndpoint(UniversalBaseModel): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing.Optional[str] = pydantic.Field(default=None) + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing.Optional[typing.Dict[str, str]] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider.py new file mode 100644 index 00000000..872a1027 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider.py @@ -0,0 +1,117 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, +) +from .agent_v1settings_agent_speak_item_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoice, +) +from .agent_v1settings_agent_speak_item_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, +) +from .agent_v1settings_agent_speak_item_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, +) +from .agent_v1settings_agent_speak_item_provider_open_ai_model import AgentV1SettingsAgentSpeakItemProviderOpenAiModel +from .agent_v1settings_agent_speak_item_provider_open_ai_voice import AgentV1SettingsAgentSpeakItemProviderOpenAiVoice + + +class AgentV1SettingsAgentSpeakItemProvider_Deepgram(UniversalBaseModel): + type: typing.Literal["deepgram"] = "deepgram" + model: AgentV1SettingsAgentSpeakItemProviderDeepgramModel + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakItemProvider_ElevenLabs(UniversalBaseModel): + type: typing.Literal["eleven_labs"] = "eleven_labs" + model_id: AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId + language_code: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakItemProvider_Cartesia(UniversalBaseModel): + type: typing.Literal["cartesia"] = "cartesia" + model_id: AgentV1SettingsAgentSpeakItemProviderCartesiaModelId + voice: AgentV1SettingsAgentSpeakItemProviderCartesiaVoice + language: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakItemProvider_OpenAi(UniversalBaseModel): + type: typing.Literal["open_ai"] = "open_ai" + model: AgentV1SettingsAgentSpeakItemProviderOpenAiModel + voice: AgentV1SettingsAgentSpeakItemProviderOpenAiVoice + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1SettingsAgentSpeakItemProvider_AwsPolly(UniversalBaseModel): + type: typing.Literal["aws_polly"] = "aws_polly" + voice: AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice + language_code: str + engine: AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +AgentV1SettingsAgentSpeakItemProvider = typing.Union[ + AgentV1SettingsAgentSpeakItemProvider_Deepgram, + AgentV1SettingsAgentSpeakItemProvider_ElevenLabs, + AgentV1SettingsAgentSpeakItemProvider_Cartesia, + AgentV1SettingsAgentSpeakItemProvider_OpenAi, + AgentV1SettingsAgentSpeakItemProvider_AwsPolly, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly.py new file mode 100644 index 00000000..fe39ac45 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_engine import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine, +) +from .agent_v1settings_agent_speak_item_provider_aws_polly_voice import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice, +) + + +class AgentV1SettingsAgentSpeakItemProviderAwsPolly(UniversalBaseModel): + voice: AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice = pydantic.Field() + """ + AWS Polly voice name + """ + + language_code: str = pydantic.Field() + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine + credentials: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py new file mode 100644 index 00000000..856d8463 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type import ( + AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType, +) + + +class AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentials(UniversalBaseModel): + type: AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing.Optional[str] = pydantic.Field(default=None) + """ + Required for STS only + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type.py new file mode 100644 index 00000000..648a685c --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_credentials_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderAwsPollyCredentialsType = typing.Union[typing.Literal["sts", "iam"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_engine.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_engine.py new file mode 100644 index 00000000..5d67c9f3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_engine.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderAwsPollyEngine = typing.Union[ + typing.Literal["generative", "long-form", "standard", "neural"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_voice.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_voice.py new file mode 100644 index 00000000..d475903a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_aws_polly_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderAwsPollyVoice = typing.Union[ + typing.Literal["Matthew", "Joanna", "Amy", "Emma", "Brian", "Arthur", "Aria", "Ayanda"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia.py new file mode 100644 index 00000000..ee1e1022 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia.py @@ -0,0 +1,34 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_cartesia_model_id import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaModelId, +) +from .agent_v1settings_agent_speak_item_provider_cartesia_voice import ( + AgentV1SettingsAgentSpeakItemProviderCartesiaVoice, +) + + +class AgentV1SettingsAgentSpeakItemProviderCartesia(UniversalBaseModel): + model_id: AgentV1SettingsAgentSpeakItemProviderCartesiaModelId = pydantic.Field() + """ + Cartesia model ID + """ + + voice: AgentV1SettingsAgentSpeakItemProviderCartesiaVoice + language: typing.Optional[str] = pydantic.Field(default=None) + """ + Cartesia language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_model_id.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_model_id.py new file mode 100644 index 00000000..198b4533 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderCartesiaModelId = typing.Union[ + typing.Literal["sonic-2", "sonic-multilingual"], typing.Any +] diff --git a/src/deepgram/extensions/types/sockets/speak_v1_control_event.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_voice.py similarity index 57% rename from src/deepgram/extensions/types/sockets/speak_v1_control_event.py rename to src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_voice.py index 65732cc5..69a92e8e 100644 --- a/src/deepgram/extensions/types/sockets/speak_v1_control_event.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_cartesia_voice.py @@ -1,4 +1,4 @@ -# Speak V1 Control Event - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing @@ -6,20 +6,21 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class SpeakV1ControlEvent(UniversalBaseModel): +class AgentV1SettingsAgentSpeakItemProviderCartesiaVoice(UniversalBaseModel): + mode: str = pydantic.Field() """ - Control event responses (Flushed, Cleared) + Cartesia voice mode + """ + + id: str = pydantic.Field() + """ + Cartesia voice ID """ - - type: typing.Literal["Flushed", "Cleared"] - """Message type identifier""" - - sequence_id: int - """The sequence ID of the response""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram.py new file mode 100644 index 00000000..0775d562 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_deepgram_model import ( + AgentV1SettingsAgentSpeakItemProviderDeepgramModel, +) + + +class AgentV1SettingsAgentSpeakItemProviderDeepgram(UniversalBaseModel): + model: AgentV1SettingsAgentSpeakItemProviderDeepgramModel = pydantic.Field() + """ + Deepgram TTS model + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram_model.py new file mode 100644 index 00000000..ed69d46f --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_deepgram_model.py @@ -0,0 +1,72 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderDeepgramModel = typing.Union[ + typing.Literal[ + "aura-asteria-en", + "aura-luna-en", + "aura-stella-en", + "aura-athena-en", + "aura-hera-en", + "aura-orion-en", + "aura-arcas-en", + "aura-perseus-en", + "aura-angus-en", + "aura-orpheus-en", + "aura-helios-en", + "aura-zeus-en", + "aura-2-amalthea-en", + "aura-2-andromeda-en", + "aura-2-apollo-en", + "aura-2-arcas-en", + "aura-2-aries-en", + "aura-2-asteria-en", + "aura-2-athena-en", + "aura-2-atlas-en", + "aura-2-aurora-en", + "aura-2-callista-en", + "aura-2-cora-en", + "aura-2-cordelia-en", + "aura-2-delia-en", + "aura-2-draco-en", + "aura-2-electra-en", + "aura-2-harmonia-en", + "aura-2-helena-en", + "aura-2-hera-en", + "aura-2-hermes-en", + "aura-2-hyperion-en", + "aura-2-iris-en", + "aura-2-janus-en", + "aura-2-juno-en", + "aura-2-jupiter-en", + "aura-2-luna-en", + "aura-2-mars-en", + "aura-2-minerva-en", + "aura-2-neptune-en", + "aura-2-odysseus-en", + "aura-2-ophelia-en", + "aura-2-orion-en", + "aura-2-orpheus-en", + "aura-2-pandora-en", + "aura-2-phoebe-en", + "aura-2-pluto-en", + "aura-2-saturn-en", + "aura-2-selene-en", + "aura-2-thalia-en", + "aura-2-theia-en", + "aura-2-vesta-en", + "aura-2-zeus-en", + "aura-2-sirio-es", + "aura-2-nestor-es", + "aura-2-carina-es", + "aura-2-celeste-es", + "aura-2-alvaro-es", + "aura-2-diana-es", + "aura-2-aquila-es", + "aura-2-selena-es", + "aura-2-estrella-es", + "aura-2-javier-es", + ], + typing.Any, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs.py new file mode 100644 index 00000000..eef39c34 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_eleven_labs_model_id import ( + AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId, +) + + +class AgentV1SettingsAgentSpeakItemProviderElevenLabs(UniversalBaseModel): + model_id: AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId = pydantic.Field() + """ + Eleven Labs model ID + """ + + language_code: typing.Optional[str] = pydantic.Field(default=None) + """ + Eleven Labs optional language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs_model_id.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs_model_id.py new file mode 100644 index 00000000..cc33cedf --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_eleven_labs_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderElevenLabsModelId = typing.Union[ + typing.Literal["eleven_turbo_v2_5", "eleven_monolingual_v1", "eleven_multilingual_v2"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai.py new file mode 100644 index 00000000..fc8b1d57 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_speak_item_provider_open_ai_model import AgentV1SettingsAgentSpeakItemProviderOpenAiModel +from .agent_v1settings_agent_speak_item_provider_open_ai_voice import AgentV1SettingsAgentSpeakItemProviderOpenAiVoice + + +class AgentV1SettingsAgentSpeakItemProviderOpenAi(UniversalBaseModel): + model: AgentV1SettingsAgentSpeakItemProviderOpenAiModel = pydantic.Field() + """ + OpenAI TTS model + """ + + voice: AgentV1SettingsAgentSpeakItemProviderOpenAiVoice = pydantic.Field() + """ + OpenAI voice + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_model.py new file mode 100644 index 00000000..4f633312 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_model.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderOpenAiModel = typing.Union[typing.Literal["tts-1", "tts-1-hd"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_voice.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_voice.py new file mode 100644 index 00000000..d49e2db8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_speak_item_provider_open_ai_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentSpeakItemProviderOpenAiVoice = typing.Union[ + typing.Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think.py new file mode 100644 index 00000000..7247b0ea --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think.py @@ -0,0 +1,34 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_context_length import AgentV1SettingsAgentThinkContextLength +from .agent_v1settings_agent_think_endpoint import AgentV1SettingsAgentThinkEndpoint +from .agent_v1settings_agent_think_functions_item import AgentV1SettingsAgentThinkFunctionsItem +from .agent_v1settings_agent_think_provider import AgentV1SettingsAgentThinkProvider + + +class AgentV1SettingsAgentThink(UniversalBaseModel): + provider: AgentV1SettingsAgentThinkProvider + endpoint: typing.Optional[AgentV1SettingsAgentThinkEndpoint] = pydantic.Field(default=None) + """ + Optional for non-Deepgram LLM providers. When present, must include url field and headers object + """ + + functions: typing.Optional[typing.List[AgentV1SettingsAgentThinkFunctionsItem]] = None + prompt: typing.Optional[str] = None + context_length: typing.Optional[AgentV1SettingsAgentThinkContextLength] = pydantic.Field(default=None) + """ + Specifies the number of characters retained in context between user messages, agent responses, and function calls. This setting is only configurable when a custom think endpoint is used + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_context_length.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_context_length.py new file mode 100644 index 00000000..daac7703 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_context_length.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkContextLength = typing.Union[typing.Literal["max"], float] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_endpoint.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_endpoint.py new file mode 100644 index 00000000..1e17900b --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_endpoint.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentThinkEndpoint(UniversalBaseModel): + """ + Optional for non-Deepgram LLM providers. When present, must include url field and headers object + """ + + url: typing.Optional[str] = pydantic.Field(default=None) + """ + Custom LLM endpoint URL + """ + + headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Custom headers for the endpoint + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item.py new file mode 100644 index 00000000..a787f583 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_functions_item_endpoint import AgentV1SettingsAgentThinkFunctionsItemEndpoint + + +class AgentV1SettingsAgentThinkFunctionsItem(UniversalBaseModel): + name: typing.Optional[str] = pydantic.Field(default=None) + """ + Function name + """ + + description: typing.Optional[str] = pydantic.Field(default=None) + """ + Function description + """ + + parameters: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = pydantic.Field(default=None) + """ + Function parameters + """ + + endpoint: typing.Optional[AgentV1SettingsAgentThinkFunctionsItemEndpoint] = pydantic.Field(default=None) + """ + The Function endpoint to call. if not passed, function is called client-side + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item_endpoint.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item_endpoint.py new file mode 100644 index 00000000..e8e48f39 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_functions_item_endpoint.py @@ -0,0 +1,33 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentThinkFunctionsItemEndpoint(UniversalBaseModel): + """ + The Function endpoint to call. if not passed, function is called client-side + """ + + url: typing.Optional[str] = pydantic.Field(default=None) + """ + Endpoint URL + """ + + method: typing.Optional[str] = pydantic.Field(default=None) + """ + HTTP method + """ + + headers: typing.Optional[typing.Dict[str, str]] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider.py new file mode 100644 index 00000000..7ec860c8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_v1settings_agent_think_provider_credentials import AgentV1SettingsAgentThinkProviderCredentials +from .agent_v1settings_agent_think_provider_model import AgentV1SettingsAgentThinkProviderModel +from .agent_v1settings_agent_think_provider_three import AgentV1SettingsAgentThinkProviderThree +from .agent_v1settings_agent_think_provider_two import AgentV1SettingsAgentThinkProviderTwo +from .agent_v1settings_agent_think_provider_zero import AgentV1SettingsAgentThinkProviderZero + +AgentV1SettingsAgentThinkProvider = typing.Union[ + AgentV1SettingsAgentThinkProviderZero, + AgentV1SettingsAgentThinkProviderCredentials, + AgentV1SettingsAgentThinkProviderTwo, + AgentV1SettingsAgentThinkProviderThree, + AgentV1SettingsAgentThinkProviderModel, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials.py new file mode 100644 index 00000000..8b323a5c --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_provider_credentials_credentials import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentials, +) +from .agent_v1settings_agent_think_provider_credentials_model import AgentV1SettingsAgentThinkProviderCredentialsModel + + +class AgentV1SettingsAgentThinkProviderCredentials(UniversalBaseModel): + type: typing.Optional[typing.Literal["aws_bedrock"]] = None + model: typing.Optional[AgentV1SettingsAgentThinkProviderCredentialsModel] = pydantic.Field(default=None) + """ + AWS Bedrock model to use + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + AWS Bedrock temperature (0-2) + """ + + credentials: typing.Optional[AgentV1SettingsAgentThinkProviderCredentialsCredentials] = pydantic.Field(default=None) + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials.py new file mode 100644 index 00000000..2a059394 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials.py @@ -0,0 +1,49 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_provider_credentials_credentials_type import ( + AgentV1SettingsAgentThinkProviderCredentialsCredentialsType, +) + + +class AgentV1SettingsAgentThinkProviderCredentialsCredentials(UniversalBaseModel): + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ + + type: typing.Optional[AgentV1SettingsAgentThinkProviderCredentialsCredentialsType] = pydantic.Field(default=None) + """ + AWS credentials type (STS short-lived or IAM long-lived) + """ + + region: typing.Optional[str] = pydantic.Field(default=None) + """ + AWS region + """ + + access_key_id: typing.Optional[str] = pydantic.Field(default=None) + """ + AWS access key + """ + + secret_access_key: typing.Optional[str] = pydantic.Field(default=None) + """ + AWS secret access key + """ + + session_token: typing.Optional[str] = pydantic.Field(default=None) + """ + AWS session token (required for STS only) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials_type.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials_type.py new file mode 100644 index 00000000..fea822de --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_credentials_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkProviderCredentialsCredentialsType = typing.Union[typing.Literal["sts", "iam"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_model.py new file mode 100644 index 00000000..1ac2698e --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_credentials_model.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkProviderCredentialsModel = typing.Union[ + typing.Literal["anthropic/claude-3-5-sonnet-20240620-v1:0", "anthropic/claude-3-5-haiku-20240307-v1:0"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_model.py new file mode 100644 index 00000000..21f947bf --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_model.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsAgentThinkProviderModel(UniversalBaseModel): + type: typing.Optional[typing.Literal["groq"]] = None + model: typing.Optional[typing.Literal["openai/gpt-oss-20b"]] = pydantic.Field(default=None) + """ + Groq model to use + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + Groq temperature (0-2) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three.py new file mode 100644 index 00000000..a87873d0 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_provider_three_model import AgentV1SettingsAgentThinkProviderThreeModel + + +class AgentV1SettingsAgentThinkProviderThree(UniversalBaseModel): + type: typing.Optional[typing.Literal["google"]] = None + model: typing.Optional[AgentV1SettingsAgentThinkProviderThreeModel] = pydantic.Field(default=None) + """ + Google model to use + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + Google temperature (0-2) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three_model.py new file mode 100644 index 00000000..166399c5 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_three_model.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkProviderThreeModel = typing.Union[ + typing.Literal["gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two.py new file mode 100644 index 00000000..5dd79754 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_provider_two_model import AgentV1SettingsAgentThinkProviderTwoModel + + +class AgentV1SettingsAgentThinkProviderTwo(UniversalBaseModel): + type: typing.Optional[typing.Literal["anthropic"]] = None + model: typing.Optional[AgentV1SettingsAgentThinkProviderTwoModel] = pydantic.Field(default=None) + """ + Anthropic model to use + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + Anthropic temperature (0-1) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two_model.py new file mode 100644 index 00000000..00f9393c --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_two_model.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkProviderTwoModel = typing.Union[ + typing.Literal["claude-3-5-haiku-latest", "claude-sonnet-4-20250514"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero.py new file mode 100644 index 00000000..0118390a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_agent_think_provider_zero_model import AgentV1SettingsAgentThinkProviderZeroModel + + +class AgentV1SettingsAgentThinkProviderZero(UniversalBaseModel): + type: typing.Optional[typing.Literal["open_ai"]] = None + model: typing.Optional[AgentV1SettingsAgentThinkProviderZeroModel] = pydantic.Field(default=None) + """ + OpenAI model to use + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + OpenAI temperature (0-2) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero_model.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero_model.py new file mode 100644 index 00000000..2fd8bf88 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_think_provider_zero_model.py @@ -0,0 +1,10 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAgentThinkProviderZeroModel = typing.Union[ + typing.Literal[ + "gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini" + ], + typing.Any, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_applied.py b/src/deepgram/agent/v1/types/agent_v1settings_applied.py new file mode 100644 index 00000000..a17ad602 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_applied.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsApplied(UniversalBaseModel): + type: typing.Literal["SettingsApplied"] = pydantic.Field(default="SettingsApplied") + """ + Message type identifier for settings applied confirmation + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_audio.py b/src/deepgram/agent/v1/types/agent_v1settings_audio.py new file mode 100644 index 00000000..29350538 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_audio.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_audio_input import AgentV1SettingsAudioInput +from .agent_v1settings_audio_output import AgentV1SettingsAudioOutput + + +class AgentV1SettingsAudio(UniversalBaseModel): + input: typing.Optional[AgentV1SettingsAudioInput] = pydantic.Field(default=None) + """ + Audio input configuration settings. If omitted, defaults to encoding=linear16 and sample_rate=24000. Higher sample rates like 44100 Hz provide better audio quality. + """ + + output: typing.Optional[AgentV1SettingsAudioOutput] = pydantic.Field(default=None) + """ + Audio output configuration settings + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_audio_input.py b/src/deepgram/agent/v1/types/agent_v1settings_audio_input.py new file mode 100644 index 00000000..8b9cae76 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_audio_input.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_audio_input_encoding import AgentV1SettingsAudioInputEncoding + + +class AgentV1SettingsAudioInput(UniversalBaseModel): + """ + Audio input configuration settings. If omitted, defaults to encoding=linear16 and sample_rate=24000. Higher sample rates like 44100 Hz provide better audio quality. + """ + + encoding: AgentV1SettingsAudioInputEncoding = pydantic.Field() + """ + Audio encoding format + """ + + sample_rate: float = pydantic.Field() + """ + Sample rate in Hz. Common values are 16000, 24000, 44100, 48000 + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_audio_input_encoding.py b/src/deepgram/agent/v1/types/agent_v1settings_audio_input_encoding.py new file mode 100644 index 00000000..232072d3 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_audio_input_encoding.py @@ -0,0 +1,10 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAudioInputEncoding = typing.Union[ + typing.Literal[ + "linear16", "linear32", "flac", "alaw", "mulaw", "amr-nb", "amr-wb", "opus", "ogg-opus", "speex", "g729" + ], + typing.Any, +] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_audio_output.py b/src/deepgram/agent/v1/types/agent_v1settings_audio_output.py new file mode 100644 index 00000000..e0c0efc8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_audio_output.py @@ -0,0 +1,42 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1settings_audio_output_encoding import AgentV1SettingsAudioOutputEncoding + + +class AgentV1SettingsAudioOutput(UniversalBaseModel): + """ + Audio output configuration settings + """ + + encoding: typing.Optional[AgentV1SettingsAudioOutputEncoding] = pydantic.Field(default=None) + """ + Audio encoding format for streaming TTS output + """ + + sample_rate: typing.Optional[float] = pydantic.Field(default=None) + """ + Sample rate in Hz + """ + + bitrate: typing.Optional[float] = pydantic.Field(default=None) + """ + Audio bitrate in bits per second + """ + + container: typing.Optional[str] = pydantic.Field(default=None) + """ + Audio container format. If omitted, defaults to 'none' + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1settings_audio_output_encoding.py b/src/deepgram/agent/v1/types/agent_v1settings_audio_output_encoding.py new file mode 100644 index 00000000..f4b7ca42 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_audio_output_encoding.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1SettingsAudioOutputEncoding = typing.Union[typing.Literal["linear16", "mulaw", "alaw"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1settings_flags.py b/src/deepgram/agent/v1/types/agent_v1settings_flags.py new file mode 100644 index 00000000..db3e96cd --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1settings_flags.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SettingsFlags(UniversalBaseModel): + history: typing.Optional[bool] = pydantic.Field(default=None) + """ + Enable or disable history message reporting + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1speak_updated.py b/src/deepgram/agent/v1/types/agent_v1speak_updated.py new file mode 100644 index 00000000..aeba09d8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1speak_updated.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1SpeakUpdated(UniversalBaseModel): + type: typing.Literal["SpeakUpdated"] = pydantic.Field(default="SpeakUpdated") + """ + Message type identifier for speak update confirmation + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_prompt.py b/src/deepgram/agent/v1/types/agent_v1update_prompt.py new file mode 100644 index 00000000..a479b01b --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_prompt.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1UpdatePrompt(UniversalBaseModel): + type: typing.Literal["UpdatePrompt"] = pydantic.Field(default="UpdatePrompt") + """ + Message type identifier for prompt update request + """ + + prompt: str = pydantic.Field() + """ + The new system prompt to be used by the agent + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak.py b/src/deepgram/agent/v1/types/agent_v1update_speak.py new file mode 100644 index 00000000..f776f945 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak import AgentV1UpdateSpeakSpeak + + +class AgentV1UpdateSpeak(UniversalBaseModel): + type: typing.Literal["UpdateSpeak"] = pydantic.Field(default="UpdateSpeak") + """ + Message type identifier for updating the speak model + """ + + speak: AgentV1UpdateSpeakSpeak = pydantic.Field() + """ + Configuration for the speak model. Optional, defaults to latest deepgram TTS model + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak.py new file mode 100644 index 00000000..3ad7b53a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_endpoint import AgentV1UpdateSpeakSpeakEndpoint +from .agent_v1update_speak_speak_provider import AgentV1UpdateSpeakSpeakProvider + + +class AgentV1UpdateSpeakSpeak(UniversalBaseModel): + """ + Configuration for the speak model. Optional, defaults to latest deepgram TTS model + """ + + provider: AgentV1UpdateSpeakSpeakProvider + endpoint: typing.Optional[AgentV1UpdateSpeakSpeakEndpoint] = pydantic.Field(default=None) + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_endpoint.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_endpoint.py new file mode 100644 index 00000000..2c65c454 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_endpoint.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1UpdateSpeakSpeakEndpoint(UniversalBaseModel): + """ + Optional if provider is Deepgram. Required for non-Deepgram TTS providers. + When present, must include url field and headers object. Valid schemes are https and wss with wss only supported for Eleven Labs. + """ + + url: typing.Optional[str] = pydantic.Field(default=None) + """ + Custom TTS endpoint URL. Cannot contain `output_format` or `model_id` query + parameters when the provider is Eleven Labs. + """ + + headers: typing.Optional[typing.Dict[str, str]] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider.py new file mode 100644 index 00000000..8d89f941 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider.py @@ -0,0 +1,105 @@ +# This file was auto-generated by Fern from our API Definition. + +from __future__ import annotations + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials, +) +from .agent_v1update_speak_speak_provider_aws_polly_engine import AgentV1UpdateSpeakSpeakProviderAwsPollyEngine +from .agent_v1update_speak_speak_provider_aws_polly_voice import AgentV1UpdateSpeakSpeakProviderAwsPollyVoice +from .agent_v1update_speak_speak_provider_cartesia_model_id import AgentV1UpdateSpeakSpeakProviderCartesiaModelId +from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoice +from .agent_v1update_speak_speak_provider_deepgram_model import AgentV1UpdateSpeakSpeakProviderDeepgramModel +from .agent_v1update_speak_speak_provider_eleven_labs_model_id import AgentV1UpdateSpeakSpeakProviderElevenLabsModelId +from .agent_v1update_speak_speak_provider_open_ai_model import AgentV1UpdateSpeakSpeakProviderOpenAiModel +from .agent_v1update_speak_speak_provider_open_ai_voice import AgentV1UpdateSpeakSpeakProviderOpenAiVoice + + +class AgentV1UpdateSpeakSpeakProvider_Deepgram(UniversalBaseModel): + type: typing.Literal["deepgram"] = "deepgram" + model: AgentV1UpdateSpeakSpeakProviderDeepgramModel + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1UpdateSpeakSpeakProvider_ElevenLabs(UniversalBaseModel): + type: typing.Literal["eleven_labs"] = "eleven_labs" + model_id: AgentV1UpdateSpeakSpeakProviderElevenLabsModelId + language_code: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1UpdateSpeakSpeakProvider_Cartesia(UniversalBaseModel): + type: typing.Literal["cartesia"] = "cartesia" + model_id: AgentV1UpdateSpeakSpeakProviderCartesiaModelId + voice: AgentV1UpdateSpeakSpeakProviderCartesiaVoice + language: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1UpdateSpeakSpeakProvider_OpenAi(UniversalBaseModel): + type: typing.Literal["open_ai"] = "open_ai" + model: AgentV1UpdateSpeakSpeakProviderOpenAiModel + voice: AgentV1UpdateSpeakSpeakProviderOpenAiVoice + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class AgentV1UpdateSpeakSpeakProvider_AwsPolly(UniversalBaseModel): + type: typing.Literal["aws_polly"] = "aws_polly" + voice: AgentV1UpdateSpeakSpeakProviderAwsPollyVoice + language_code: str + engine: AgentV1UpdateSpeakSpeakProviderAwsPollyEngine + credentials: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +AgentV1UpdateSpeakSpeakProvider = typing.Union[ + AgentV1UpdateSpeakSpeakProvider_Deepgram, + AgentV1UpdateSpeakSpeakProvider_ElevenLabs, + AgentV1UpdateSpeakSpeakProvider_Cartesia, + AgentV1UpdateSpeakSpeakProvider_OpenAi, + AgentV1UpdateSpeakSpeakProvider_AwsPolly, +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly.py new file mode 100644 index 00000000..b0f91e2d --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly.py @@ -0,0 +1,35 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_aws_polly_credentials import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials, +) +from .agent_v1update_speak_speak_provider_aws_polly_engine import AgentV1UpdateSpeakSpeakProviderAwsPollyEngine +from .agent_v1update_speak_speak_provider_aws_polly_voice import AgentV1UpdateSpeakSpeakProviderAwsPollyVoice + + +class AgentV1UpdateSpeakSpeakProviderAwsPolly(UniversalBaseModel): + voice: AgentV1UpdateSpeakSpeakProviderAwsPollyVoice = pydantic.Field() + """ + AWS Polly voice name + """ + + language_code: str = pydantic.Field() + """ + Language code (e.g., "en-US") + """ + + engine: AgentV1UpdateSpeakSpeakProviderAwsPollyEngine + credentials: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials.py new file mode 100644 index 00000000..0ec682b2 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_aws_polly_credentials_type import ( + AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType, +) + + +class AgentV1UpdateSpeakSpeakProviderAwsPollyCredentials(UniversalBaseModel): + type: AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType + region: str + access_key_id: str + secret_access_key: str + session_token: typing.Optional[str] = pydantic.Field(default=None) + """ + Required for STS only + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials_type.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials_type.py new file mode 100644 index 00000000..984051d8 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_credentials_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderAwsPollyCredentialsType = typing.Union[typing.Literal["sts", "iam"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_engine.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_engine.py new file mode 100644 index 00000000..2a641f24 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_engine.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderAwsPollyEngine = typing.Union[ + typing.Literal["generative", "long-form", "standard", "neural"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_voice.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_voice.py new file mode 100644 index 00000000..2be92987 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_aws_polly_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderAwsPollyVoice = typing.Union[ + typing.Literal["Matthew", "Joanna", "Amy", "Emma", "Brian", "Arthur", "Aria", "Ayanda"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia.py new file mode 100644 index 00000000..d95a4127 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_cartesia_model_id import AgentV1UpdateSpeakSpeakProviderCartesiaModelId +from .agent_v1update_speak_speak_provider_cartesia_voice import AgentV1UpdateSpeakSpeakProviderCartesiaVoice + + +class AgentV1UpdateSpeakSpeakProviderCartesia(UniversalBaseModel): + model_id: AgentV1UpdateSpeakSpeakProviderCartesiaModelId = pydantic.Field() + """ + Cartesia model ID + """ + + voice: AgentV1UpdateSpeakSpeakProviderCartesiaVoice + language: typing.Optional[str] = pydantic.Field(default=None) + """ + Cartesia language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_model_id.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_model_id.py new file mode 100644 index 00000000..0cee24cd --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderCartesiaModelId = typing.Union[ + typing.Literal["sonic-2", "sonic-multilingual"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_voice.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_voice.py new file mode 100644 index 00000000..2a6a918f --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_cartesia_voice.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1UpdateSpeakSpeakProviderCartesiaVoice(UniversalBaseModel): + mode: str = pydantic.Field() + """ + Cartesia voice mode + """ + + id: str = pydantic.Field() + """ + Cartesia voice ID + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/listen_v1_utterance_end_event.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram.py similarity index 55% rename from src/deepgram/extensions/types/sockets/listen_v1_utterance_end_event.py rename to src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram.py index c60f281c..b4376c38 100644 --- a/src/deepgram/extensions/types/sockets/listen_v1_utterance_end_event.py +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram.py @@ -1,28 +1,22 @@ -# Listen V1 Utterance End Event - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing import pydantic from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_deepgram_model import AgentV1UpdateSpeakSpeakProviderDeepgramModel -class ListenV1UtteranceEndEvent(UniversalBaseModel): +class AgentV1UpdateSpeakSpeakProviderDeepgram(UniversalBaseModel): + model: AgentV1UpdateSpeakSpeakProviderDeepgramModel = pydantic.Field() """ - An utterance has ended + Deepgram TTS model """ - - type: typing.Literal["UtteranceEnd"] - """Message type identifier""" - - channel: typing.List[int] - """The channel""" - - last_word_end: float - """The last word end""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram_model.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram_model.py new file mode 100644 index 00000000..2e0a9ab9 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_deepgram_model.py @@ -0,0 +1,72 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderDeepgramModel = typing.Union[ + typing.Literal[ + "aura-asteria-en", + "aura-luna-en", + "aura-stella-en", + "aura-athena-en", + "aura-hera-en", + "aura-orion-en", + "aura-arcas-en", + "aura-perseus-en", + "aura-angus-en", + "aura-orpheus-en", + "aura-helios-en", + "aura-zeus-en", + "aura-2-amalthea-en", + "aura-2-andromeda-en", + "aura-2-apollo-en", + "aura-2-arcas-en", + "aura-2-aries-en", + "aura-2-asteria-en", + "aura-2-athena-en", + "aura-2-atlas-en", + "aura-2-aurora-en", + "aura-2-callista-en", + "aura-2-cora-en", + "aura-2-cordelia-en", + "aura-2-delia-en", + "aura-2-draco-en", + "aura-2-electra-en", + "aura-2-harmonia-en", + "aura-2-helena-en", + "aura-2-hera-en", + "aura-2-hermes-en", + "aura-2-hyperion-en", + "aura-2-iris-en", + "aura-2-janus-en", + "aura-2-juno-en", + "aura-2-jupiter-en", + "aura-2-luna-en", + "aura-2-mars-en", + "aura-2-minerva-en", + "aura-2-neptune-en", + "aura-2-odysseus-en", + "aura-2-ophelia-en", + "aura-2-orion-en", + "aura-2-orpheus-en", + "aura-2-pandora-en", + "aura-2-phoebe-en", + "aura-2-pluto-en", + "aura-2-saturn-en", + "aura-2-selene-en", + "aura-2-thalia-en", + "aura-2-theia-en", + "aura-2-vesta-en", + "aura-2-zeus-en", + "aura-2-sirio-es", + "aura-2-nestor-es", + "aura-2-carina-es", + "aura-2-celeste-es", + "aura-2-alvaro-es", + "aura-2-diana-es", + "aura-2-aquila-es", + "aura-2-selena-es", + "aura-2-estrella-es", + "aura-2-javier-es", + ], + typing.Any, +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs.py new file mode 100644 index 00000000..7f9f994a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_eleven_labs_model_id import AgentV1UpdateSpeakSpeakProviderElevenLabsModelId + + +class AgentV1UpdateSpeakSpeakProviderElevenLabs(UniversalBaseModel): + model_id: AgentV1UpdateSpeakSpeakProviderElevenLabsModelId = pydantic.Field() + """ + Eleven Labs model ID + """ + + language_code: typing.Optional[str] = pydantic.Field(default=None) + """ + Eleven Labs optional language code + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs_model_id.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs_model_id.py new file mode 100644 index 00000000..fdbba96c --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_eleven_labs_model_id.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderElevenLabsModelId = typing.Union[ + typing.Literal["eleven_turbo_v2_5", "eleven_monolingual_v1", "eleven_multilingual_v2"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai.py new file mode 100644 index 00000000..fcd28a96 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_v1update_speak_speak_provider_open_ai_model import AgentV1UpdateSpeakSpeakProviderOpenAiModel +from .agent_v1update_speak_speak_provider_open_ai_voice import AgentV1UpdateSpeakSpeakProviderOpenAiVoice + + +class AgentV1UpdateSpeakSpeakProviderOpenAi(UniversalBaseModel): + model: AgentV1UpdateSpeakSpeakProviderOpenAiModel = pydantic.Field() + """ + OpenAI TTS model + """ + + voice: AgentV1UpdateSpeakSpeakProviderOpenAiVoice = pydantic.Field() + """ + OpenAI voice + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_model.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_model.py new file mode 100644 index 00000000..94c2069a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_model.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderOpenAiModel = typing.Union[typing.Literal["tts-1", "tts-1-hd"], typing.Any] diff --git a/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_voice.py b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_voice.py new file mode 100644 index 00000000..bc5fdeb9 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1update_speak_speak_provider_open_ai_voice.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +AgentV1UpdateSpeakSpeakProviderOpenAiVoice = typing.Union[ + typing.Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"], typing.Any +] diff --git a/src/deepgram/agent/v1/types/agent_v1user_started_speaking.py b/src/deepgram/agent/v1/types/agent_v1user_started_speaking.py new file mode 100644 index 00000000..ac4d838a --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1user_started_speaking.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1UserStartedSpeaking(UniversalBaseModel): + type: typing.Literal["UserStartedSpeaking"] = pydantic.Field(default="UserStartedSpeaking") + """ + Message type identifier indicating that the user has begun speaking + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1warning.py b/src/deepgram/agent/v1/types/agent_v1warning.py new file mode 100644 index 00000000..cdfacea7 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1warning.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1Warning(UniversalBaseModel): + """ + Notifies the client of non-fatal errors or warnings + """ + + type: typing.Literal["Warning"] = pydantic.Field(default="Warning") + """ + Message type identifier for warnings + """ + + description: str = pydantic.Field() + """ + Description of the warning + """ + + code: str = pydantic.Field() + """ + Warning code identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/agent/v1/types/agent_v1welcome.py b/src/deepgram/agent/v1/types/agent_v1welcome.py new file mode 100644 index 00000000..972f8104 --- /dev/null +++ b/src/deepgram/agent/v1/types/agent_v1welcome.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentV1Welcome(UniversalBaseModel): + type: typing.Literal["Welcome"] = pydantic.Field(default="Welcome") + """ + Message type identifier for welcome message + """ + + request_id: str = pydantic.Field() + """ + Unique identifier for the request + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/client.py b/src/deepgram/client.py deleted file mode 100644 index 456d3129..00000000 --- a/src/deepgram/client.py +++ /dev/null @@ -1,258 +0,0 @@ -""" -Custom client entrypoints that extend the generated BaseClient/AsyncBaseClient. - -Adds support for `access_token` alongside `api_key` with the following rules: -- If `access_token` is provided, it takes precedence and sets `Authorization: bearer ` -- When `access_token` is used, `api_key` is forced to "token" to satisfy the generator, - but the Authorization header is overridden for all HTTP and WebSocket requests. -""" - -import os -import platform -import sys -import types -import uuid -from typing import Any, Dict, Optional - -from .base_client import AsyncBaseClient, BaseClient - -from deepgram.core.client_wrapper import BaseClientWrapper -from deepgram.extensions.core.instrumented_http import InstrumentedAsyncHttpClient, InstrumentedHttpClient -from deepgram.extensions.core.instrumented_socket import apply_websocket_instrumentation -from deepgram.extensions.core.telemetry_events import TelemetryHttpEvents, TelemetrySocketEvents -from deepgram.extensions.telemetry.batching_handler import BatchingTelemetryHandler -from deepgram.extensions.telemetry.handler import TelemetryHandler -from deepgram.extensions.telemetry.proto_encoder import encode_telemetry_batch - - -def _create_telemetry_context(session_id: str) -> Dict[str, Any]: - """Create telemetry context with SDK and environment information.""" - try: - # Get package version - try: - from . import version - package_version = version.__version__ - except ImportError: - package_version = "unknown" - - return { - "package_name": "python-sdk", - "package_version": package_version, - "language": "python", - "runtime_version": f"python {sys.version.split()[0]}", - "os": platform.system().lower(), - "arch": platform.machine(), - "session_id": session_id, - "environment": os.getenv("DEEPGRAM_ENV", "prod"), - } - except Exception: - # Fallback minimal context - return { - "package_name": "python-sdk", - "language": "python", - "session_id": session_id, - } - - -def _setup_telemetry( - session_id: str, - telemetry_opt_out: bool, - telemetry_handler: Optional[TelemetryHandler], - client_wrapper: BaseClientWrapper, -) -> Optional[TelemetryHandler]: - """Setup telemetry for the client.""" - if telemetry_opt_out: - return None - - # Use provided handler or create default batching handler - if telemetry_handler is None: - try: - context = _create_telemetry_context(session_id) - telemetry_handler = BatchingTelemetryHandler( - endpoint="https://telemetry.dx.deepgram.com/v1/telemetry", - api_key=client_wrapper.api_key, - context_provider=lambda: context, - synchronous=True, # Use synchronous mode for reliability in short-lived scripts - batch_size=1, # Send immediately for short-lived scripts - encode_batch=encode_telemetry_batch, # Add proto encoder - ) - except Exception: - # If we can't create the handler, disable telemetry - return None - - # Setup HTTP instrumentation - try: - http_events = TelemetryHttpEvents(telemetry_handler) - - # Replace the HTTP client with instrumented version - if hasattr(client_wrapper, 'httpx_client'): - original_client = client_wrapper.httpx_client - if hasattr(original_client, 'httpx_client'): # It's already our HttpClient - instrumented_client = InstrumentedHttpClient( - delegate=original_client, - events=http_events, - ) - client_wrapper.httpx_client = instrumented_client - except Exception: - # If instrumentation fails, continue without it - pass - - # Setup WebSocket instrumentation - try: - socket_events = TelemetrySocketEvents(telemetry_handler) - # Apply WebSocket instrumentation to capture connections in generated code - apply_websocket_instrumentation(socket_events) - except Exception: - # If WebSocket instrumentation fails, continue without it - pass - - return telemetry_handler - - -def _setup_async_telemetry( - session_id: str, - telemetry_opt_out: bool, - telemetry_handler: Optional[TelemetryHandler], - client_wrapper: BaseClientWrapper, -) -> Optional[TelemetryHandler]: - """Setup telemetry for the async client.""" - if telemetry_opt_out: - return None - - # Use provided handler or create default batching handler - if telemetry_handler is None: - try: - context = _create_telemetry_context(session_id) - telemetry_handler = BatchingTelemetryHandler( - endpoint="https://telemetry.dx.deepgram.com/v1/telemetry", - api_key=client_wrapper.api_key, - context_provider=lambda: context, - synchronous=True, # Use synchronous mode for reliability in short-lived scripts - batch_size=1, # Send immediately for short-lived scripts - encode_batch=encode_telemetry_batch, # Add proto encoder - ) - except Exception: - # If we can't create the handler, disable telemetry - return None - - # Setup HTTP instrumentation - try: - http_events = TelemetryHttpEvents(telemetry_handler) - - # Replace the HTTP client with instrumented version - if hasattr(client_wrapper, 'httpx_client'): - original_client = client_wrapper.httpx_client - if hasattr(original_client, 'httpx_client'): # It's already our AsyncHttpClient - instrumented_client = InstrumentedAsyncHttpClient( - delegate=original_client, - events=http_events, - ) - client_wrapper.httpx_client = instrumented_client - except Exception: - # If instrumentation fails, continue without it - pass - - # Setup WebSocket instrumentation - try: - socket_events = TelemetrySocketEvents(telemetry_handler) - # Apply WebSocket instrumentation to capture connections in generated code - apply_websocket_instrumentation(socket_events) - except Exception: - # If WebSocket instrumentation fails, continue without it - pass - - return telemetry_handler - - -def _apply_bearer_authorization_override(client_wrapper: BaseClientWrapper, bearer_token: str) -> None: - """Override header providers to always use a Bearer authorization token. - - This updates both: - - client_wrapper.get_headers() used by WebSocket clients - - client_wrapper.httpx_client.base_headers used by HTTP clients - """ - original_get_headers = client_wrapper.get_headers - - def _get_headers_with_bearer(_self: Any) -> Dict[str, str]: - headers = original_get_headers() - headers["Authorization"] = f"bearer {bearer_token}" - return headers - - # Override on wrapper for WebSockets - client_wrapper.get_headers = types.MethodType(_get_headers_with_bearer, client_wrapper) # type: ignore[method-assign] - - # Override on HTTP client for REST requests - if hasattr(client_wrapper, "httpx_client") and hasattr(client_wrapper.httpx_client, "base_headers"): - client_wrapper.httpx_client.base_headers = client_wrapper.get_headers - -class DeepgramClient(BaseClient): - def __init__(self, *args, **kwargs) -> None: - access_token: Optional[str] = kwargs.pop("access_token", None) - telemetry_opt_out: bool = bool(kwargs.pop("telemetry_opt_out", True)) - telemetry_handler: Optional[TelemetryHandler] = kwargs.pop("telemetry_handler", None) - - # Generate a session id up-front so it can be placed into headers for all transports - generated_session_id = str(uuid.uuid4()) - - # Ensure headers object exists for pass-through custom headers - headers: Optional[Dict[str, str]] = kwargs.get("headers") - if headers is None: - headers = {} - kwargs["headers"] = headers - - # Ensure every request has a session identifier header - headers["x-deepgram-session-id"] = generated_session_id - - # If an access_token is provided, force api_key to a placeholder that will be overridden - if access_token is not None: - kwargs["api_key"] = "token" - - super().__init__(*args, **kwargs) - self.session_id = generated_session_id - - if access_token is not None: - _apply_bearer_authorization_override(self._client_wrapper, access_token) - - # Setup telemetry - self._telemetry_handler = _setup_telemetry( - session_id=generated_session_id, - telemetry_opt_out=telemetry_opt_out, - telemetry_handler=telemetry_handler, - client_wrapper=self._client_wrapper, - ) - -class AsyncDeepgramClient(AsyncBaseClient): - def __init__(self, *args, **kwargs) -> None: - access_token: Optional[str] = kwargs.pop("access_token", None) - telemetry_opt_out: bool = bool(kwargs.pop("telemetry_opt_out", True)) - telemetry_handler: Optional[TelemetryHandler] = kwargs.pop("telemetry_handler", None) - - # Generate a session id up-front so it can be placed into headers for all transports - generated_session_id = str(uuid.uuid4()) - - # Ensure headers object exists for pass-through custom headers - headers: Optional[Dict[str, str]] = kwargs.get("headers") - if headers is None: - headers = {} - kwargs["headers"] = headers - - # Ensure every request has a session identifier header - headers["x-deepgram-session-id"] = generated_session_id - - # If an access_token is provided, force api_key to a placeholder that will be overridden - if access_token is not None: - kwargs["api_key"] = "token" - - super().__init__(*args, **kwargs) - self.session_id = generated_session_id - - if access_token is not None: - _apply_bearer_authorization_override(self._client_wrapper, access_token) - - # Setup telemetry - self._telemetry_handler = _setup_async_telemetry( - session_id=generated_session_id, - telemetry_opt_out=telemetry_opt_out, - telemetry_handler=telemetry_handler, - client_wrapper=self._client_wrapper, - ) \ No newline at end of file diff --git a/src/deepgram/core/client_wrapper.py b/src/deepgram/core/client_wrapper.py index 806d0202..24b4997b 100644 --- a/src/deepgram/core/client_wrapper.py +++ b/src/deepgram/core/client_wrapper.py @@ -23,11 +23,10 @@ def __init__( def get_headers(self) -> typing.Dict[str, str]: headers: typing.Dict[str, str] = { + "User-Agent": "deepgram-sdk/5.3.1", "X-Fern-Language": "Python", - "X-Fern-SDK-Name": "deepgram", - # x-release-please-start-version - "X-Fern-SDK-Version": "5.3.0", - # x-release-please-end + "X-Fern-SDK-Name": "deepgram-sdk", + "X-Fern-SDK-Version": "5.3.1", **(self.get_custom_headers() or {}), } headers["Authorization"] = f"Token {self.api_key}" diff --git a/src/deepgram/core/http_sse/__init__.py b/src/deepgram/core/http_sse/__init__.py new file mode 100644 index 00000000..730e5a33 --- /dev/null +++ b/src/deepgram/core/http_sse/__init__.py @@ -0,0 +1,42 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from ._api import EventSource, aconnect_sse, connect_sse + from ._exceptions import SSEError + from ._models import ServerSentEvent +_dynamic_imports: typing.Dict[str, str] = { + "EventSource": "._api", + "SSEError": "._exceptions", + "ServerSentEvent": "._models", + "aconnect_sse": "._api", + "connect_sse": "._api", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = ["EventSource", "SSEError", "ServerSentEvent", "aconnect_sse", "connect_sse"] diff --git a/src/deepgram/core/http_sse/_api.py b/src/deepgram/core/http_sse/_api.py new file mode 100644 index 00000000..f900b3b6 --- /dev/null +++ b/src/deepgram/core/http_sse/_api.py @@ -0,0 +1,112 @@ +# This file was auto-generated by Fern from our API Definition. + +import re +from contextlib import asynccontextmanager, contextmanager +from typing import Any, AsyncGenerator, AsyncIterator, Iterator, cast + +import httpx +from ._decoders import SSEDecoder +from ._exceptions import SSEError +from ._models import ServerSentEvent + + +class EventSource: + def __init__(self, response: httpx.Response) -> None: + self._response = response + + def _check_content_type(self) -> None: + content_type = self._response.headers.get("content-type", "").partition(";")[0] + if "text/event-stream" not in content_type: + raise SSEError( + f"Expected response header Content-Type to contain 'text/event-stream', got {content_type!r}" + ) + + def _get_charset(self) -> str: + """Extract charset from Content-Type header, fallback to UTF-8.""" + content_type = self._response.headers.get("content-type", "") + + # Parse charset parameter using regex + charset_match = re.search(r"charset=([^;\s]+)", content_type, re.IGNORECASE) + if charset_match: + charset = charset_match.group(1).strip("\"'") + # Validate that it's a known encoding + try: + # Test if the charset is valid by trying to encode/decode + "test".encode(charset).decode(charset) + return charset + except (LookupError, UnicodeError): + # If charset is invalid, fall back to UTF-8 + pass + + # Default to UTF-8 if no charset specified or invalid charset + return "utf-8" + + @property + def response(self) -> httpx.Response: + return self._response + + def iter_sse(self) -> Iterator[ServerSentEvent]: + self._check_content_type() + decoder = SSEDecoder() + charset = self._get_charset() + + buffer = "" + for chunk in self._response.iter_bytes(): + # Decode chunk using detected charset + text_chunk = chunk.decode(charset, errors="replace") + buffer += text_chunk + + # Process complete lines + while "\n" in buffer: + line, buffer = buffer.split("\n", 1) + line = line.rstrip("\r") + sse = decoder.decode(line) + # when we reach a "\n\n" => line = '' + # => decoder will attempt to return an SSE Event + if sse is not None: + yield sse + + # Process any remaining data in buffer + if buffer.strip(): + line = buffer.rstrip("\r") + sse = decoder.decode(line) + if sse is not None: + yield sse + + async def aiter_sse(self) -> AsyncGenerator[ServerSentEvent, None]: + self._check_content_type() + decoder = SSEDecoder() + lines = cast(AsyncGenerator[str, None], self._response.aiter_lines()) + try: + async for line in lines: + line = line.rstrip("\n") + sse = decoder.decode(line) + if sse is not None: + yield sse + finally: + await lines.aclose() + + +@contextmanager +def connect_sse(client: httpx.Client, method: str, url: str, **kwargs: Any) -> Iterator[EventSource]: + headers = kwargs.pop("headers", {}) + headers["Accept"] = "text/event-stream" + headers["Cache-Control"] = "no-store" + + with client.stream(method, url, headers=headers, **kwargs) as response: + yield EventSource(response) + + +@asynccontextmanager +async def aconnect_sse( + client: httpx.AsyncClient, + method: str, + url: str, + **kwargs: Any, +) -> AsyncIterator[EventSource]: + headers = kwargs.pop("headers", {}) + headers["Accept"] = "text/event-stream" + headers["Cache-Control"] = "no-store" + + async with client.stream(method, url, headers=headers, **kwargs) as response: + yield EventSource(response) diff --git a/src/deepgram/core/http_sse/_decoders.py b/src/deepgram/core/http_sse/_decoders.py new file mode 100644 index 00000000..339b0890 --- /dev/null +++ b/src/deepgram/core/http_sse/_decoders.py @@ -0,0 +1,61 @@ +# This file was auto-generated by Fern from our API Definition. + +from typing import List, Optional + +from ._models import ServerSentEvent + + +class SSEDecoder: + def __init__(self) -> None: + self._event = "" + self._data: List[str] = [] + self._last_event_id = "" + self._retry: Optional[int] = None + + def decode(self, line: str) -> Optional[ServerSentEvent]: + # See: https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation # noqa: E501 + + if not line: + if not self._event and not self._data and not self._last_event_id and self._retry is None: + return None + + sse = ServerSentEvent( + event=self._event, + data="\n".join(self._data), + id=self._last_event_id, + retry=self._retry, + ) + + # NOTE: as per the SSE spec, do not reset last_event_id. + self._event = "" + self._data = [] + self._retry = None + + return sse + + if line.startswith(":"): + return None + + fieldname, _, value = line.partition(":") + + if value.startswith(" "): + value = value[1:] + + if fieldname == "event": + self._event = value + elif fieldname == "data": + self._data.append(value) + elif fieldname == "id": + if "\0" in value: + pass + else: + self._last_event_id = value + elif fieldname == "retry": + try: + self._retry = int(value) + except (TypeError, ValueError): + pass + else: + pass # Field is ignored. + + return None diff --git a/src/deepgram/core/http_sse/_exceptions.py b/src/deepgram/core/http_sse/_exceptions.py new file mode 100644 index 00000000..81605a8a --- /dev/null +++ b/src/deepgram/core/http_sse/_exceptions.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import httpx + + +class SSEError(httpx.TransportError): + pass diff --git a/src/deepgram/core/http_sse/_models.py b/src/deepgram/core/http_sse/_models.py new file mode 100644 index 00000000..1af57f8f --- /dev/null +++ b/src/deepgram/core/http_sse/_models.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import json +from dataclasses import dataclass +from typing import Any, Optional + + +@dataclass(frozen=True) +class ServerSentEvent: + event: str = "message" + data: str = "" + id: str = "" + retry: Optional[int] = None + + def json(self) -> Any: + """Parse the data field as JSON.""" + return json.loads(self.data) diff --git a/src/deepgram/core/pydantic_utilities.py b/src/deepgram/core/pydantic_utilities.py index 8906cdfa..185e5c4f 100644 --- a/src/deepgram/core/pydantic_utilities.py +++ b/src/deepgram/core/pydantic_utilities.py @@ -220,7 +220,9 @@ def universal_root_validator( ) -> Callable[[AnyCallable], AnyCallable]: def decorator(func: AnyCallable) -> AnyCallable: if IS_PYDANTIC_V2: - return cast(AnyCallable, pydantic.model_validator(mode="before" if pre else "after")(func)) # type: ignore[attr-defined] + # In Pydantic v2, for RootModel we always use "before" mode + # The custom validators transform the input value before the model is created + return cast(AnyCallable, pydantic.model_validator(mode="before")(func)) # type: ignore[attr-defined] return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload] return decorator diff --git a/src/deepgram/extensions/__init__.py b/src/deepgram/extensions/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/deepgram/extensions/core/__init__.py b/src/deepgram/extensions/core/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/deepgram/extensions/core/instrumented_http.py b/src/deepgram/extensions/core/instrumented_http.py deleted file mode 100644 index 214683ac..00000000 --- a/src/deepgram/extensions/core/instrumented_http.py +++ /dev/null @@ -1,395 +0,0 @@ -from __future__ import annotations - -import time -import typing - -import httpx -from ...core.file import File -from ...core.http_client import AsyncHttpClient as GeneratedAsyncHttpClient -from ...core.http_client import HttpClient as GeneratedHttpClient -from ...core.request_options import RequestOptions - - -class HttpEvents(typing.Protocol): - def on_http_request( - self, - *, - method: str, - url: str, - headers: typing.Union[typing.Mapping[str, str], None], - extras: typing.Union[typing.Mapping[str, str], None] = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: ... - - def on_http_response( - self, - *, - method: str, - url: str, - status_code: int, - duration_ms: float, - headers: typing.Union[typing.Mapping[str, str], None], - extras: typing.Union[typing.Mapping[str, str], None] = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: ... - - def on_http_error( - self, - *, - method: str, - url: str, - error: BaseException, - duration_ms: float, - request_details: typing.Mapping[str, typing.Any] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: ... - - -def _compose_url(base_url: typing.Optional[str], path: typing.Optional[str]) -> str: - if base_url is None or path is None: - return "" - return f"{base_url}/{path}" if not str(base_url).endswith("/") else f"{base_url}{path}" - - -class InstrumentedHttpClient(GeneratedHttpClient): - def __init__(self, *, delegate: GeneratedHttpClient, events: HttpEvents | None): - super().__init__( - httpx_client=delegate.httpx_client, - base_timeout=delegate.base_timeout, - base_headers=delegate.base_headers, - base_url=delegate.base_url, - ) - self._delegate = delegate - self._events = events - - def request( - self, - path: typing.Optional[str] = None, - *, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None, - files: typing.Optional[ - typing.Union[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]], - typing.List[typing.Tuple[str, File]], - ] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, - omit: typing.Optional[typing.Any] = None, - force_multipart: typing.Optional[bool] = None, - ) -> httpx.Response: - url = _compose_url(base_url, path) - - start = time.perf_counter() - try: - if self._events is not None: - # Filter request headers for telemetry extras - try: - from .telemetry_events import ( - capture_request_details, - # filter_sensitive_headers, # No longer needed - using privacy-focused capture - ) - # No longer filter headers - use privacy-focused request_details instead - extras = None - request_details = capture_request_details( - method=method, - url=url, - headers=headers, - params=params, - json=json, - data=data, - files=files, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - except Exception: - extras = None - request_details = None - - self._events.on_http_request( - method=method, - url=url or "", - headers=headers, - extras=extras, - request_details=request_details, - ) - except Exception: - pass - try: - resp = super().request( - path=path, - method=method, - base_url=base_url, - params=params, - json=json, - data=data, - content=content, - files=files, - headers=headers, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - duration_ms = (time.perf_counter() - start) * 1000.0 - try: - if self._events is not None: - response_headers = typing.cast(typing.Union[typing.Mapping[str, str], None], getattr(resp, "headers", None)) - # Filter response headers for telemetry extras - try: - from .telemetry_events import ( - capture_response_details, - # filter_sensitive_headers, # No longer needed - using privacy-focused capture - ) - # No longer filter response headers - use privacy-focused response_details instead - extras = None - response_details = capture_response_details(resp) - except Exception: - extras = None - response_details = None - - self._events.on_http_response( - method=method, - url=url or "", - status_code=resp.status_code, - duration_ms=duration_ms, - headers=response_headers, - extras=extras, - response_details=response_details, - ) - except Exception: - pass - return resp - except Exception as exc: - duration_ms = (time.perf_counter() - start) * 1000.0 - try: - if self._events is not None: - # Capture comprehensive error details - try: - from .telemetry_events import ( - capture_request_details, - capture_response_details, - ) - - # Capture full request details - request_details = capture_request_details( - method=method, - url=url, - headers=headers, - params=params, - json=json, - data=data, - files=files, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - - # Try to capture response details from exception - response_details = {} - if hasattr(exc, 'response'): - response_details = capture_response_details(exc.response) - elif hasattr(exc, 'status_code'): - response_details['status_code'] = getattr(exc, 'status_code', None) - if hasattr(exc, 'headers'): - response_details['headers'] = dict(getattr(exc, 'headers', {})) - - except Exception: - request_details = None - response_details = None - - self._events.on_http_error( - method=method, - url=url or "", - error=exc, - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - raise - - # Inherit stream() from base class without modification - - -class InstrumentedAsyncHttpClient(GeneratedAsyncHttpClient): - def __init__(self, *, delegate: GeneratedAsyncHttpClient, events: HttpEvents | None): - super().__init__( - httpx_client=delegate.httpx_client, - base_timeout=delegate.base_timeout, - base_headers=delegate.base_headers, - base_url=delegate.base_url, - ) - self._delegate = delegate - self._events = events - - async def request( - self, - path: typing.Optional[str] = None, - *, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None, - files: typing.Optional[ - typing.Union[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]], - typing.List[typing.Tuple[str, File]], - ] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, - omit: typing.Optional[typing.Any] = None, - force_multipart: typing.Optional[bool] = None, - ) -> httpx.Response: - url = _compose_url(base_url, path) - - start = time.perf_counter() - try: - if self._events is not None: - # Filter request headers for telemetry extras - try: - from .telemetry_events import ( - capture_request_details, - # filter_sensitive_headers, # No longer needed - using privacy-focused capture - ) - # No longer filter headers - use privacy-focused request_details instead - extras = None - request_details = capture_request_details( - method=method, - url=url, - headers=headers, - params=params, - json=json, - data=data, - files=files, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - except Exception: - extras = None - request_details = None - - self._events.on_http_request( - method=method, - url=url or "", - headers=headers, - extras=extras, - request_details=request_details, - ) - except Exception: - pass - try: - resp = await super().request( - path=path, - method=method, - base_url=base_url, - params=params, - json=json, - data=data, - content=content, - files=files, - headers=headers, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - duration_ms = (time.perf_counter() - start) * 1000.0 - try: - if self._events is not None: - response_headers = typing.cast(typing.Union[typing.Mapping[str, str], None], getattr(resp, "headers", None)) - # Filter response headers for telemetry extras - try: - from .telemetry_events import ( - capture_response_details, - # filter_sensitive_headers, # No longer needed - using privacy-focused capture - ) - # No longer filter response headers - use privacy-focused response_details instead - extras = None - response_details = capture_response_details(resp) - except Exception: - extras = None - response_details = None - - self._events.on_http_response( - method=method, - url=url or "", - status_code=resp.status_code, - duration_ms=duration_ms, - headers=response_headers, - extras=extras, - response_details=response_details, - ) - except Exception: - pass - return resp - except Exception as exc: - duration_ms = (time.perf_counter() - start) * 1000.0 - try: - if self._events is not None: - # Capture comprehensive error details - try: - from .telemetry_events import ( - capture_request_details, - capture_response_details, - ) - - # Capture full request details - request_details = capture_request_details( - method=method, - url=url, - headers=headers, - params=params, - json=json, - data=data, - files=files, - request_options=request_options, - retries=retries, - omit=omit, - force_multipart=force_multipart, - ) - - # Try to capture response details from exception - response_details = {} - if hasattr(exc, 'response'): - response_details = capture_response_details(exc.response) - elif hasattr(exc, 'status_code'): - response_details['status_code'] = getattr(exc, 'status_code', None) - if hasattr(exc, 'headers'): - response_details['headers'] = dict(getattr(exc, 'headers', {})) - - except Exception: - request_details = None - response_details = None - - self._events.on_http_error( - method=method, - url=url or "", - error=exc, - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - raise - - # Inherit stream() from base class without modification - - diff --git a/src/deepgram/extensions/core/instrumented_socket.py b/src/deepgram/extensions/core/instrumented_socket.py deleted file mode 100644 index 128bec9d..00000000 --- a/src/deepgram/extensions/core/instrumented_socket.py +++ /dev/null @@ -1,407 +0,0 @@ -""" -Instrumented WebSocket clients for telemetry. - -This module provides WebSocket client wrappers that automatically capture -telemetry events, following the same pattern as instrumented_http.py. -""" - -import functools -import time -import typing -from contextlib import asynccontextmanager, contextmanager -from typing import Union - -import websockets.exceptions -import websockets.sync.client as websockets_sync_client - -try: - from websockets.legacy.client import connect as websockets_client_connect # type: ignore -except ImportError: - from websockets import connect as websockets_client_connect # type: ignore - -try: - import websockets.sync.connection as websockets_sync_connection - from websockets.legacy.client import WebSocketClientProtocol # type: ignore -except ImportError: - try: - import websockets.sync.connection as websockets_sync_connection - from websockets import WebSocketClientProtocol # type: ignore - except ImportError: - # Fallback types - WebSocketClientProtocol = typing.Any # type: ignore[misc,assignment] - websockets_sync_connection = typing.Any # type: ignore[misc,assignment] - - -class SocketEvents(typing.Protocol): - """Protocol for WebSocket telemetry events.""" - - def on_ws_connect( - self, - *, - url: str, - headers: Union[typing.Mapping[str, str], None] = None, - extras: Union[typing.Mapping[str, str], None] = None, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: ... - - def on_ws_error( - self, - *, - url: str, - error: BaseException, - duration_ms: float, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - response_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: ... - - def on_ws_close( - self, - *, - url: str, - duration_ms: float, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - response_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: ... - - -def _capture_request_details(method: str, url: str, headers: Union[typing.Dict[str, str], None] = None, **kwargs) -> typing.Dict[str, typing.Any]: - """Capture request details for telemetry (avoiding circular import).""" - details: typing.Dict[str, typing.Any] = { - "method": method, - "url": url, - } - if headers: - details["headers"] = dict(headers) - - # Add connection parameters for WebSocket requests - for key, value in kwargs.items(): - if value is not None: - details[key] = value - - return details - - -def _capture_response_details(**kwargs) -> typing.Dict[str, typing.Any]: - """Capture response details for telemetry (avoiding circular import).""" - details = {} - for key, value in kwargs.items(): - if value is not None: - details[key] = value - return details - - -def _instrument_sync_connect(original_connect, events: Union[SocketEvents, None] = None): - """Wrap sync websockets.sync.client.connect to add telemetry.""" - - @functools.wraps(original_connect) - def instrumented_connect(uri, *args, additional_headers: Union[typing.Dict[str, str], None] = None, **kwargs): - start_time = time.perf_counter() - - # Capture detailed request information including all connection parameters - request_details = _capture_request_details( - method="WS_CONNECT", - url=str(uri), - headers=additional_headers, - function_name="websockets.sync.client.connect", - connection_args=args, - connection_kwargs=kwargs, - ) - - # Emit connect event - if events: - try: - events.on_ws_connect( - url=str(uri), - headers=additional_headers, - request_details=request_details, - ) - except Exception: - pass - - try: - # Call original connect - connection = original_connect(uri, *args, additional_headers=additional_headers, **kwargs) - - # Wrap the connection to capture close event - if events: - original_close = connection.close - - def instrumented_close(*close_args, **close_kwargs): - duration_ms = (time.perf_counter() - start_time) * 1000 - response_details = _capture_response_details( - status_code=1000, # Normal close - duration_ms=duration_ms - ) - - try: - events.on_ws_close( - url=str(uri), - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - - return original_close(*close_args, **close_kwargs) - - connection.close = instrumented_close - - return connection - - except Exception as error: - import traceback - - duration_ms = (time.perf_counter() - start_time) * 1000 - - # Capture detailed error information - response_details = _capture_response_details( - error=error, - duration_ms=duration_ms, - error_type=type(error).__name__, - error_message=str(error), - stack_trace=traceback.format_exc(), - function_name="websockets.sync.client.connect", - timeout_occurred="timeout" in str(error).lower() or "timed out" in str(error).lower(), - ) - - # Capture WebSocket handshake response headers if available - try: - # Handle InvalidStatusCode exceptions (handshake failures) - if error.__class__.__name__ == 'InvalidStatusCode': - # Status code is directly available - if hasattr(error, 'status_code'): - response_details["handshake_status_code"] = error.status_code - - # Headers are directly available as e.headers - if hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - - # Some versions might have response_headers - elif hasattr(error, 'response_headers') and error.response_headers: - response_details["handshake_response_headers"] = dict(error.response_headers) - - # Handle InvalidHandshake exceptions (protocol-level failures) - elif error.__class__.__name__ == 'InvalidHandshake': - response_details["handshake_error_type"] = "InvalidHandshake" - if hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - - # Generic fallback for any exception with headers - elif hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - elif hasattr(error, 'response_headers') and error.response_headers: - response_details["handshake_response_headers"] = dict(error.response_headers) - - # Capture status code if available (for any exception type) - if hasattr(error, 'status_code') and not response_details.get("handshake_status_code"): - response_details["handshake_status_code"] = error.status_code - - except Exception: - # Don't let header extraction fail the error handling - pass - - if events: - try: - events.on_ws_error( - url=str(uri), - error=error, - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - raise - - return instrumented_connect - - -def _instrument_async_connect(original_connect, events: Union[SocketEvents, None] = None): - """Wrap async websockets.connect to add telemetry.""" - - @functools.wraps(original_connect) - def instrumented_connect(uri, *args, extra_headers: Union[typing.Dict[str, str], None] = None, **kwargs): - start_time = time.perf_counter() - - # Capture detailed request information including all connection parameters - request_details = _capture_request_details( - method="WS_CONNECT", - url=str(uri), - headers=extra_headers, - function_name="websockets.client.connect", - connection_args=args, - connection_kwargs=kwargs, - ) - - # Emit connect event - if events: - try: - events.on_ws_connect( - url=str(uri), - headers=extra_headers, - request_details=request_details, - ) - except Exception: - pass - - # Return an async context manager - @asynccontextmanager - async def instrumented_context(): - try: - # Call original connect - async with original_connect(uri, *args, extra_headers=extra_headers, **kwargs) as connection: - # Wrap the connection to capture close event - if events: - original_close = connection.close - - async def instrumented_close(*close_args, **close_kwargs): - duration_ms = (time.perf_counter() - start_time) * 1000 - response_details = _capture_response_details( - status_code=1000, # Normal close - duration_ms=duration_ms - ) - - try: - events.on_ws_close( - url=str(uri), - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - - return await original_close(*close_args, **close_kwargs) - - connection.close = instrumented_close - - yield connection - - # Also emit close event when context exits (if connection wasn't manually closed) - if events: - try: - duration_ms = (time.perf_counter() - start_time) * 1000 - response_details = _capture_response_details( - status_code=1000, # Normal close - duration_ms=duration_ms - ) - events.on_ws_close( - url=str(uri), - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - - except Exception as error: - import traceback - - duration_ms = (time.perf_counter() - start_time) * 1000 - - # Capture detailed error information - response_details = _capture_response_details( - error=error, - duration_ms=duration_ms, - error_type=type(error).__name__, - error_message=str(error), - stack_trace=traceback.format_exc(), - function_name="websockets.client.connect", - timeout_occurred="timeout" in str(error).lower() or "timed out" in str(error).lower(), - ) - - # Capture WebSocket handshake response headers if available - try: - # Handle InvalidStatusCode exceptions (handshake failures) - if error.__class__.__name__ == 'InvalidStatusCode': - # Status code is directly available - if hasattr(error, 'status_code'): - response_details["handshake_status_code"] = error.status_code - - # Headers are directly available as e.headers - if hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - - # Some versions might have response_headers - elif hasattr(error, 'response_headers') and error.response_headers: - response_details["handshake_response_headers"] = dict(error.response_headers) - - # Handle InvalidHandshake exceptions (protocol-level failures) - elif error.__class__.__name__ == 'InvalidHandshake': - response_details["handshake_error_type"] = "InvalidHandshake" - if hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - - # Generic fallback for any exception with headers - elif hasattr(error, 'headers') and error.headers: - response_details["handshake_response_headers"] = dict(error.headers) - elif hasattr(error, 'response_headers') and error.response_headers: - response_details["handshake_response_headers"] = dict(error.response_headers) - - # Capture status code if available (for any exception type) - if hasattr(error, 'status_code') and not response_details.get("handshake_status_code"): - response_details["handshake_status_code"] = error.status_code - - except Exception: - # Don't let header extraction fail the error handling - pass - - if events: - try: - events.on_ws_error( - url=str(uri), - error=error, - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - raise - - return instrumented_context() - - return instrumented_connect - - -def apply_websocket_instrumentation(socket_events: Union[SocketEvents, None] = None): - """Apply WebSocket instrumentation globally using monkey-patching.""" - try: - # Patch sync websockets - if not hasattr(websockets_sync_client.connect, '_deepgram_instrumented'): # type: ignore[attr-defined] - original_sync_connect = websockets_sync_client.connect - websockets_sync_client.connect = _instrument_sync_connect(original_sync_connect, socket_events) - websockets_sync_client.connect._deepgram_instrumented = True # type: ignore[attr-defined] - except Exception: - pass - - try: - # Patch async websockets (legacy) - try: - from websockets.legacy.client import connect as legacy_connect - if not hasattr(legacy_connect, '_deepgram_instrumented'): # type: ignore[attr-defined] - instrumented_legacy = _instrument_async_connect(legacy_connect, socket_events) - - # Replace in the module - import websockets.legacy.client as legacy_client - legacy_client.connect = instrumented_legacy - instrumented_legacy._deepgram_instrumented = True # type: ignore[attr-defined] - except ImportError: - pass - - # Patch async websockets (current) - try: - from websockets import connect as current_connect - if not hasattr(current_connect, '_deepgram_instrumented'): # type: ignore[attr-defined] - instrumented_current = _instrument_async_connect(current_connect, socket_events) - - # Replace in the module - import websockets - websockets.connect = instrumented_current - instrumented_current._deepgram_instrumented = True # type: ignore[attr-defined] - except ImportError: - pass - - except Exception: - pass diff --git a/src/deepgram/extensions/core/telemetry_events.py b/src/deepgram/extensions/core/telemetry_events.py deleted file mode 100644 index 9eaa8a87..00000000 --- a/src/deepgram/extensions/core/telemetry_events.py +++ /dev/null @@ -1,306 +0,0 @@ -from __future__ import annotations - -from typing import Any, Dict, Mapping - -from ..telemetry.handler import TelemetryHandler -from .instrumented_http import HttpEvents -from .instrumented_socket import SocketEvents - - -class TelemetryHttpEvents(HttpEvents): - def __init__(self, handler: TelemetryHandler): - self._handler = handler - - def on_http_request( - self, - *, - method: str, - url: str, - headers: Mapping[str, str] | None, - extras: Mapping[str, str] | None = None, - request_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_http_request( - method=method, - url=url, - headers=headers, - extras=extras, - request_details=request_details, - ) - except Exception: - pass - - def on_http_response( - self, - *, - method: str, - url: str, - status_code: int, - duration_ms: float, - headers: Mapping[str, str] | None, - extras: Mapping[str, str] | None = None, - response_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_http_response( - method=method, - url=url, - status_code=status_code, - duration_ms=duration_ms, - headers=headers, - extras=extras, - response_details=response_details, - ) - except Exception: - pass - - def on_http_error( - self, - *, - method: str, - url: str, - error: BaseException, - duration_ms: float, - request_details: Mapping[str, Any] | None = None, - response_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_http_error( - method=method, - url=url, - error=error, - duration_ms=duration_ms, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - - -class TelemetrySocketEvents(SocketEvents): - """Implementation of WebSocket events that forwards to a telemetry handler.""" - - def __init__(self, handler: TelemetryHandler): - self._handler = handler - - def on_ws_connect( - self, - *, - url: str, - headers: Mapping[str, str] | None = None, - extras: Mapping[str, str] | None = None, - request_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_ws_connect( - url=url, - headers=headers, - extras=extras, - request_details=request_details, - ) - except Exception: - pass - - def on_ws_error( - self, - *, - url: str, - error: BaseException, - duration_ms: float, - request_details: Mapping[str, Any] | None = None, - response_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_ws_error( - url=url, - error=error, - extras=None, - request_details=request_details, - response_details=response_details, - ) - except Exception: - pass - - def on_ws_close( - self, - *, - url: str, - duration_ms: float, - request_details: Mapping[str, Any] | None = None, - response_details: Mapping[str, Any] | None = None, - ) -> None: - try: - self._handler.on_ws_close( - url=url, - ) - except Exception: - pass - - -def filter_sensitive_headers(headers: Mapping[str, str] | None) -> Dict[str, str] | None: - """Filter out sensitive headers from telemetry, keeping all safe headers.""" - if not headers: - return None - - # Headers to exclude from telemetry for security - sensitive_prefixes = ('authorization', 'sec-', 'cookie', 'x-api-key', 'x-auth') - sensitive_headers = {'authorization', 'cookie', 'set-cookie', 'x-api-key', 'x-auth-token', 'bearer'} - - filtered_headers = {} - for key, value in headers.items(): - key_lower = key.lower() - - # Skip sensitive headers - if key_lower in sensitive_headers: - continue - if any(key_lower.startswith(prefix) for prefix in sensitive_prefixes): - continue - - filtered_headers[key] = str(value) - - return filtered_headers if filtered_headers else None - - -def extract_deepgram_headers(headers: Mapping[str, str] | None) -> Dict[str, str] | None: - """Extract x-dg-* headers from response headers.""" - if not headers: - return None - - dg_headers = {} - for key, value in headers.items(): - if key.lower().startswith('x-dg-'): - dg_headers[key.lower()] = str(value) - - return dg_headers if dg_headers else None - - -def capture_request_details( - method: str | None = None, - url: str | None = None, - headers: Mapping[str, str] | None = None, - params: Mapping[str, Any] | None = None, - **kwargs -) -> Dict[str, Any]: - """Capture comprehensive request details for telemetry (keys only for privacy).""" - details: Dict[str, Any] = {} - - if method: - details['method'] = method - - # For URL, capture the structure but not query parameters with values - if url: - details['url_structure'] = _extract_url_structure(url) - - # For headers, capture only the keys (not values) for privacy - if headers: - details['header_keys'] = sorted(list(headers.keys())) - details['header_count'] = len(headers) - - # For query parameters, capture only the keys (not values) for privacy - if params: - details['param_keys'] = sorted(list(params.keys())) - details['param_count'] = len(params) - - # For body content, capture type information but not actual content - if 'json' in kwargs and kwargs['json'] is not None: - details['has_json_body'] = True - details['json_body_type'] = type(kwargs['json']).__name__ - - if 'data' in kwargs and kwargs['data'] is not None: - details['has_data_body'] = True - details['data_body_type'] = type(kwargs['data']).__name__ - - if 'content' in kwargs and kwargs['content'] is not None: - details['has_content_body'] = True - details['content_body_type'] = type(kwargs['content']).__name__ - - if 'files' in kwargs and kwargs['files'] is not None: - details['has_files'] = True - details['files_type'] = type(kwargs['files']).__name__ - - # Capture any additional request context (excluding sensitive data) - safe_kwargs = ['timeout', 'follow_redirects', 'max_redirects'] - for key in safe_kwargs: - if key in kwargs and kwargs[key] is not None: - details[key] = kwargs[key] - - return details - - -def _extract_url_structure(url: str) -> Dict[str, Any]: - """Extract URL structure without exposing sensitive query parameter values.""" - try: - from urllib.parse import parse_qs, urlparse - - parsed = urlparse(url) - structure: Dict[str, Any] = { - 'scheme': parsed.scheme, - 'hostname': parsed.hostname, - 'port': parsed.port, - 'path': parsed.path, - } - - # For query string, only capture the parameter keys, not values - if parsed.query: - query_params = parse_qs(parsed.query, keep_blank_values=True) - structure['query_param_keys'] = sorted(list(query_params.keys())) - structure['query_param_count'] = len(query_params) - - return structure - except Exception: - # If URL parsing fails, just return a safe representation - return {'url_parse_error': True, 'url_length': len(url)} - - -def capture_response_details(response: Any = None, **kwargs) -> Dict[str, Any]: - """Capture comprehensive response details for telemetry (keys only for privacy).""" - details = {} - - if response is not None: - # Try to extract common response attributes - try: - if hasattr(response, 'status_code'): - details['status_code'] = response.status_code - if hasattr(response, 'headers'): - # For response headers, capture only keys (not values) for privacy - headers = response.headers - details['response_header_keys'] = sorted(list(headers.keys())) - details['response_header_count'] = len(headers) - - # Extract request_id for server-side correlation (this is safe to log) - request_id = (headers.get('x-request-id') or - headers.get('X-Request-Id') or - headers.get('x-dg-request-id') or - headers.get('X-DG-Request-Id') or - headers.get('request-id') or - headers.get('Request-Id')) - if request_id: - details['request_id'] = request_id - - if hasattr(response, 'reason_phrase'): - details['reason_phrase'] = response.reason_phrase - if hasattr(response, 'url'): - # For response URL, capture structure but not full URL - details['response_url_structure'] = _extract_url_structure(str(response.url)) - except Exception: - pass - - # Capture any additional response context (excluding sensitive data) - safe_kwargs = ['duration_ms', 'error', 'error_type', 'error_message', 'stack_trace', - 'timeout_occurred', 'function_name'] - for key in safe_kwargs: - if key in kwargs and kwargs[key] is not None: - details[key] = kwargs[key] - - # Also capture any other non-sensitive context - for key, value in kwargs.items(): - if (key not in safe_kwargs and - value is not None and - key not in ['headers', 'params', 'json', 'data', 'content']): # Exclude potentially sensitive data - details[key] = value - - return details - - - diff --git a/src/deepgram/extensions/telemetry/__init__.py b/src/deepgram/extensions/telemetry/__init__.py deleted file mode 100644 index a0fd2921..00000000 --- a/src/deepgram/extensions/telemetry/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Deepgram telemetry package. - -Provides batching telemetry handler, HTTP instrumentation, and protobuf encoding utilities. -""" - -__all__ = [ - "batching_handler", - "handler", - "instrumented_http", - "proto_encoder", -] - - diff --git a/src/deepgram/extensions/telemetry/batching_handler.py b/src/deepgram/extensions/telemetry/batching_handler.py deleted file mode 100644 index 00cdc4db..00000000 --- a/src/deepgram/extensions/telemetry/batching_handler.py +++ /dev/null @@ -1,658 +0,0 @@ -from __future__ import annotations - -import atexit -import base64 -import os -import queue -import threading -import time -import traceback -import typing -import zlib -from collections import Counter -from typing import List - -import httpx -from .handler import TelemetryHandler - - -class BatchingTelemetryHandler(TelemetryHandler): - """ - Non-blocking telemetry handler that batches events and flushes in the background. - - - Enqueues events quickly; never blocks request path - - Flushes when batch size or max interval is reached - - Errors trigger an immediate flush attempt - - Best-effort delivery; drops on full queue rather than blocking - """ - - def __init__( - self, - *, - endpoint: str, - api_key: str | None = None, - batch_size: int = 20, - max_interval_seconds: float = 5.0, - max_queue_size: int = 1000, - client: typing.Optional[httpx.Client] = None, - encode_batch: typing.Optional[typing.Callable[..., bytes]] = None, - encode_batch_iter: typing.Optional[typing.Callable[..., typing.Iterator[bytes]]] = None, - content_type: str = "application/x-protobuf", - context_provider: typing.Optional[typing.Callable[[], typing.Mapping[str, typing.Any]]] = None, - max_consecutive_failures: int = 5, - synchronous: bool = False, - ) -> None: - self._endpoint = endpoint - self._api_key = api_key - self._batch_size = max(1, batch_size) - self._max_interval = max(0.25, max_interval_seconds) - self._client = client or httpx.Client(timeout=5.0) - self._encode_batch = encode_batch - self._encode_batch_iter = encode_batch_iter - # Always protobuf by default - self._content_type = content_type - self._context_provider = context_provider or (lambda: {}) - self._debug = str(os.getenv("DEEPGRAM_DEBUG", "")).lower() in ("1", "true") - self._max_consecutive_failures = max(1, max_consecutive_failures) - self._consecutive_failures = 0 - self._disabled = False - self._synchronous = bool(synchronous) - if self._synchronous: - # In synchronous mode, we do not spin a worker; we stage events locally - self._buffer_sync: List[dict] = [] - else: - self._queue: queue.Queue[dict] = queue.Queue(maxsize=max_queue_size) - self._stop_event = threading.Event() - self._flush_event = threading.Event() - self._worker = threading.Thread(target=self._run, name="dg-telemetry-worker", daemon=True) - self._worker.start() - # Ensure we flush at process exit so short-lived scripts still send (or surface errors in debug) - atexit.register(self.close) - - # --- TelemetryHandler interface --- - - def on_http_request( - self, - *, - method: str, - url: str, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - event = { - "type": "http_request", - "ts": time.time(), - "method": method, - "url": url, - } - # Extract request_id from request_details for server-side correlation - if request_details and "request_id" in request_details: - event["request_id"] = request_details["request_id"] - if extras: - event["extras"] = dict(extras) - if request_details: - event["request_details"] = dict(request_details) - self._enqueue(event) - - def on_http_response( - self, - *, - method: str, - url: str, - status_code: int, - duration_ms: float, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - event = { - "type": "http_response", - "ts": time.time(), - "method": method, - "url": url, - "status_code": status_code, - "duration_ms": duration_ms, - } - # Extract request_id from response_details for server-side correlation - if response_details and "request_id" in response_details: - event["request_id"] = response_details["request_id"] - if extras: - event["extras"] = dict(extras) - if response_details: - event["response_details"] = dict(response_details) - self._enqueue(event) - # Only promote 5XX server errors to ErrorEvent (not 4XX client errors) - try: - if int(status_code) >= 500: - self._enqueue({ - "type": "http_error", - "ts": time.time(), - "method": method, - "url": url, - "error": f"HTTP_{status_code}", - "status_code": status_code, - "handled": True, - }, force_flush=True) - except Exception: - pass - - def on_http_error( - self, - *, - method: str, - url: str, - error: BaseException, - duration_ms: float, - request_details: typing.Mapping[str, typing.Any] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - # Filter out 4XX client errors - only capture 5XX server errors and unhandled exceptions - if response_details: - status_code = response_details.get('status_code') - if status_code and isinstance(status_code, int) and 400 <= status_code < 500: - # Skip 4XX client errors (auth failures, bad requests, etc.) - return - - stack: str = "" - try: - stack = "".join(traceback.format_exception(type(error), error, getattr(error, "__traceback__", None))) - except Exception: - pass - - event = { - "type": "http_error", - "ts": time.time(), - "method": method, - "url": url, - "error": type(error).__name__, - "message": str(error), - "stack_trace": stack, - "handled": False, - "duration_ms": duration_ms, - } - - # Extract request_id for server-side correlation - if response_details and "request_id" in response_details: - event["request_id"] = response_details["request_id"] - elif request_details and "request_id" in request_details: - event["request_id"] = request_details["request_id"] - - # Add comprehensive error context - if request_details: - event["request_details"] = dict(request_details) - if response_details: - event["response_details"] = dict(response_details) - - self._enqueue(event, force_flush=True) - - # --- Optional WebSocket signals -> mapped to telemetry --- - def on_ws_connect( - self, - *, - url: str, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - event = { - "type": "ws_connect", - "ts": time.time(), - "url": url, - } - if extras: - event["extras"] = dict(extras) - if request_details: - event["request_details"] = dict(request_details) - self._enqueue(event) - - - def on_ws_error( - self, - *, - url: str, - error: BaseException, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - # Use stack trace from response_details if available, otherwise generate it - stack: str = "" - if response_details and response_details.get("stack_trace"): - stack = response_details["stack_trace"] - else: - try: - stack = "".join(traceback.format_exception(type(error), error, getattr(error, "__traceback__", None))) - except Exception: - pass - - event = { - "type": "ws_error", - "ts": time.time(), - "url": url, - "error": type(error).__name__, - "message": str(error), - "stack_trace": stack, - "handled": False, - } - - # Add comprehensive error context from response_details - if response_details: - event["response_details"] = dict(response_details) - # Extract specific error details to event level for easier access - if "error_type" in response_details: - event["error_type"] = response_details["error_type"] - if "error_message" in response_details: - event["error_message"] = response_details["error_message"] - if "function_name" in response_details: - event["function_name"] = response_details["function_name"] - if "duration_ms" in response_details: - event["duration_ms"] = response_details["duration_ms"] - if "timeout_occurred" in response_details: - event["timeout_occurred"] = response_details["timeout_occurred"] - if "handshake_response_headers" in response_details: - event["handshake_response_headers"] = response_details["handshake_response_headers"] - if "handshake_status_code" in response_details: - event["handshake_status_code"] = response_details["handshake_status_code"] - if "handshake_reason_phrase" in response_details: - event["handshake_reason_phrase"] = response_details["handshake_reason_phrase"] - if "handshake_error_type" in response_details: - event["handshake_error_type"] = response_details["handshake_error_type"] - - # Add request context - if request_details: - event["request_details"] = dict(request_details) - # Extract specific request details for easier access - if "function_name" in request_details: - event["sdk_function"] = request_details["function_name"] - if "connection_kwargs" in request_details: - event["connection_params"] = request_details["connection_kwargs"] - - # Build comprehensive extras with all enhanced telemetry details - enhanced_extras = dict(extras) if extras else {} - - # Add all response details to extras - if response_details: - for key, value in response_details.items(): - if key not in enhanced_extras and value is not None: - enhanced_extras[key] = value - - # Add all request details to extras - if request_details: - for key, value in request_details.items(): - if key not in enhanced_extras and value is not None: - enhanced_extras[key] = value - - # Add all event-level details to extras - event_extras = { - "error_type": event.get("error_type"), - "error_message": event.get("error_message"), - "function_name": event.get("function_name"), - "sdk_function": event.get("sdk_function"), - "duration_ms": event.get("duration_ms"), - "timeout_occurred": event.get("timeout_occurred"), - "handshake_status_code": event.get("handshake_status_code"), - "handshake_reason_phrase": event.get("handshake_reason_phrase"), - "handshake_error_type": event.get("handshake_error_type"), - "connection_params": event.get("connection_params"), - } - - # Add handshake response headers to extras - handshake_headers = event.get("handshake_response_headers") - if handshake_headers and hasattr(handshake_headers, 'items'): - for header_name, header_value in handshake_headers.items(): # type: ignore[attr-defined] - safe_header_name = header_name.lower().replace('-', '_') - enhanced_extras[f"handshake_{safe_header_name}"] = str(header_value) - - # Merge event extras, excluding None values - for key, value in event_extras.items(): - if value is not None: - enhanced_extras[key] = value - - # Store the comprehensive extras - if enhanced_extras: - event["extras"] = enhanced_extras - - self._enqueue(event, force_flush=True) - - def on_ws_close( - self, - *, - url: str, - ) -> None: - # Close should force a final flush so debug printing happens during short-lived runs - event = { - "type": "ws_close", - "ts": time.time(), - "url": url, - } - self._enqueue(event, force_flush=True) - - # Optional: uncaught errors from external hooks - def on_uncaught_error(self, *, error: BaseException) -> None: - stack: str = "" - try: - stack = "".join(traceback.format_exception(type(error), error, getattr(error, "__traceback__", None))) - except Exception: - pass - self._enqueue({ - "type": "uncaught_error", - "ts": time.time(), - "error": type(error).__name__, - "message": str(error), - "stack_trace": stack, - "handled": False, - }, force_flush=True) - - # --- Internal batching --- - - def _enqueue(self, event: dict, *, force_flush: bool = False) -> None: - if self._disabled: - return - if self._synchronous: - # Stage locally and flush according to thresholds immediately in caller thread - self._buffer_sync.append(event) # type: ignore[attr-defined] - if len(self._buffer_sync) >= self._batch_size or force_flush: # type: ignore[attr-defined] - try: - self._flush(self._buffer_sync) # type: ignore[attr-defined] - finally: - self._buffer_sync = [] # type: ignore[attr-defined] - return - try: - self._queue.put_nowait(event) - except queue.Full: - # Best-effort: drop rather than blocking request path - return - # Wake worker if we hit batch size or need immediate flush - if self._queue.qsize() >= self._batch_size or force_flush: - self._flush_event.set() - - def _run(self) -> None: - last_flush = time.time() - buffer: List[dict] = [] - while not self._stop_event.is_set(): - if self._disabled: - break - timeout = max(0.0, self._max_interval - (time.time() - last_flush)) - try: - item = self._queue.get(timeout=timeout) - buffer.append(item) - except queue.Empty: - pass - - # Conditions to flush: batch size, interval elapsed, or explicit signal - should_flush = ( - len(buffer) >= self._batch_size - or (time.time() - last_flush) >= self._max_interval - or self._flush_event.is_set() - ) - if should_flush and buffer: - self._flush(buffer) - buffer = [] - last_flush = time.time() - self._flush_event.clear() - - # Drain on shutdown - if buffer: - self._flush(buffer) - - def _flush(self, batch: List[dict]) -> None: - try: - # Choose streaming iterator if provided; otherwise bytes encoder. - # If no encoder provided, drop silently to avoid memory use. - context = self._context_provider() or {} - - # Extract enhanced telemetry details from events and add to context extras - enhanced_extras = {} - for event in batch: - # Merge event extras - event_extras = event.get("extras", {}) - if event_extras: - for key, value in event_extras.items(): - if value is not None: - enhanced_extras[key] = value - - # Merge request_details (privacy-focused request structure) - request_details = event.get("request_details", {}) - if request_details: - for key, value in request_details.items(): - if value is not None: - enhanced_extras[f"request_{key}"] = value - - # Merge response_details (privacy-focused response structure) - response_details = event.get("response_details", {}) - if response_details: - for key, value in response_details.items(): - if value is not None: - enhanced_extras[f"response_{key}"] = value - - # Add enhanced extras to context - if enhanced_extras: - context = dict(context) # Make a copy - context["extras"] = enhanced_extras - if self._encode_batch_iter is not None: - try: - plain_iter = self._encode_batch_iter(batch, context) # type: ignore[misc] - except TypeError: - plain_iter = self._encode_batch_iter(batch) # type: ignore[misc] - elif self._encode_batch is not None: - try: - data = self._encode_batch(batch, context) # type: ignore[misc] - except TypeError: - data = self._encode_batch(batch) # type: ignore[misc] - plain_iter = iter([data]) - else: - # Use built-in protobuf encoder when none provided - from .proto_encoder import encode_telemetry_batch_iter - - try: - plain_iter = encode_telemetry_batch_iter(batch, context) - except Exception: - if self._debug: - raise - return - - headers = {"content-type": self._content_type, "content-encoding": "gzip"} - if self._api_key: - headers["authorization"] = f"Bearer {self._api_key}" - if self._debug: - # Mask sensitive headers for debug output - dbg_headers = dict(headers) - if "authorization" in dbg_headers: - dbg_headers["authorization"] = "Bearer ***" - # Summarize event types and include a compact context view - try: - type_counts = dict(Counter(str(e.get("type", "unknown")) for e in batch)) - except Exception: - type_counts = {} - ctx_view = {} - try: - # Show a stable subset of context keys if present - for k in ( - "sdk_name", - "sdk_version", - "language", - "runtime_version", - "os", - "arch", - "session_id", - "app_name", - "app_version", - "environment", - "project_id", - ): - v = context.get(k) - if v: - ctx_view[k] = v - except Exception: - pass - # Compute full bodies in debug mode to print exact payload - # Determine uncompressed bytes for the batch - try: - if self._encode_batch_iter is not None: - raw_body = b"".join(plain_iter) - elif self._encode_batch is not None: - # "data" exists from above branch - raw_body = data - else: - from .proto_encoder import encode_telemetry_batch - - raw_body = encode_telemetry_batch(batch, context) - except Exception: - raw_body = b"" - # Gzip-compress to match actual wire payload - try: - compressor = zlib.compressobj(wbits=31) - compressed_body = compressor.compress(raw_body) + compressor.flush() - except Exception: - compressed_body = b"" - # Print full payload (compressed, base64) and sizes - print( - f"[deepgram][telemetry] POST {self._endpoint} " - f"events={len(batch)} headers={dbg_headers} types={type_counts} context={ctx_view}" - ) - try: - b64 = base64.b64encode(compressed_body).decode("ascii") if compressed_body else "" - except Exception: - b64 = "" - print( - f"[deepgram][telemetry] body.compressed.b64={b64} " - f"size={len(compressed_body)}B raw={len(raw_body)}B" - ) - try: - if self._debug: - # Send pre-built compressed body in debug mode - resp = self._client.post(self._endpoint, content=compressed_body, headers=headers) - else: - # Stream in normal mode - resp = self._client.post(self._endpoint, content=self._gzip_iter(plain_iter), headers=headers) - if self._debug: - try: - status = getattr(resp, "status_code", "unknown") - print(f"[deepgram][telemetry] -> {status}") - except Exception: - pass - except Exception as exc: - # Log the error in debug mode instead of raising from a worker thread - if self._debug: - try: - print(f"[deepgram][telemetry] -> error: {type(exc).__name__}: {exc}") - except Exception: - pass - # Re-raise to outer handler to count failure/disable logic - raise - # Success: reset failure count - self._consecutive_failures = 0 - except Exception: - # Swallow errors; telemetry is best-effort - self._consecutive_failures += 1 - if self._consecutive_failures >= self._max_consecutive_failures: - self._disable() - - def close(self) -> None: - if self._debug: - print("[deepgram][telemetry] close() called") - - if self._synchronous: - # Flush any staged events synchronously - buf = getattr(self, "_buffer_sync", []) - if buf: - if self._debug: - print(f"[deepgram][telemetry] flushing {len(buf)} staged events on close") - try: - self._flush(buf) - finally: - self._buffer_sync = [] # type: ignore[attr-defined] - elif self._debug: - print("[deepgram][telemetry] no staged events to flush") - try: - self._client.close() - except Exception: - pass - return - # First, try to flush any pending events - if self._debug: - print(f"[deepgram][telemetry] flushing pending events, queue size: {self._queue.qsize()}") - try: - self.flush() - except Exception: - if self._debug: - raise - - self._stop_event.set() - # Drain any remaining events synchronously to ensure a final flush - drain: List[dict] = [] - try: - while True: - drain.append(self._queue.get_nowait()) - except queue.Empty: - pass - if drain: - if self._debug: - print(f"[deepgram][telemetry] draining {len(drain)} remaining events on close") - try: - self._flush(drain) - except Exception: - if self._debug: - raise - elif self._debug: - print("[deepgram][telemetry] no remaining events to drain") - # Give the worker a moment to exit cleanly - self._worker.join(timeout=1.0) - try: - self._client.close() - except Exception: - pass - - def flush(self) -> None: - """ - Force a synchronous flush of any staged or queued events. - - - In synchronous mode, this flushes the local buffer immediately. - - In background mode, this drains the queue and flushes in the caller thread. - Note: this does not capture items already pulled into the worker's internal buffer. - """ - if self._disabled: - return - if self._synchronous: - buf = getattr(self, "_buffer_sync", []) - if buf: - try: - self._flush(buf) - finally: - self._buffer_sync = [] # type: ignore[attr-defined] - return - drain: List[dict] = [] - try: - while True: - drain.append(self._queue.get_nowait()) - except queue.Empty: - pass - if drain: - self._flush(drain) - - @staticmethod - def _gzip_iter(data_iter: typing.Iterator[bytes]) -> typing.Iterator[bytes]: - compressor = zlib.compressobj(wbits=31) - for chunk in data_iter: - if not isinstance(chunk, (bytes, bytearray)): - chunk = bytes(chunk) - if chunk: - out = compressor.compress(chunk) - if out: - yield out - tail = compressor.flush() - if tail: - yield tail - - def _disable(self) -> None: - # Toggle off for this session: drop all future events, stop worker, clear queue fast - self._disabled = True - try: - while True: - self._queue.get_nowait() - except queue.Empty: - pass - self._stop_event.set() - - diff --git a/src/deepgram/extensions/telemetry/handler.py b/src/deepgram/extensions/telemetry/handler.py deleted file mode 100644 index 362e0497..00000000 --- a/src/deepgram/extensions/telemetry/handler.py +++ /dev/null @@ -1,88 +0,0 @@ -from __future__ import annotations - -import typing -from datetime import datetime - -from .models import ErrorEvent, ErrorSeverity, TelemetryEvent - - -class TelemetryHandler: - """ - Interface for SDK telemetry. Users can supply a custom implementation. - All methods are optional to implement. - """ - - def on_http_request( - self, - *, - method: str, - url: str, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - pass - - def on_http_response( - self, - *, - method: str, - url: str, - status_code: int, - duration_ms: float, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - pass - - def on_http_error( - self, - *, - method: str, - url: str, - error: BaseException, - duration_ms: float, - request_details: typing.Mapping[str, typing.Any] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - pass - - # WebSocket telemetry methods - def on_ws_connect( - self, - *, - url: str, - headers: typing.Mapping[str, str] | None, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - pass - - def on_ws_error( - self, - *, - url: str, - error: BaseException, - extras: typing.Mapping[str, str] | None = None, - request_details: typing.Mapping[str, typing.Any] | None = None, - response_details: typing.Mapping[str, typing.Any] | None = None, - ) -> None: - pass - - def on_ws_close( - self, - *, - url: str, - ) -> None: - pass - - # Optional: global uncaught errors from sys/threading hooks - def on_uncaught_error(self, *, error: BaseException) -> None: - pass - - -class NoOpTelemetryHandler(TelemetryHandler): - pass - - diff --git a/src/deepgram/extensions/telemetry/models.py b/src/deepgram/extensions/telemetry/models.py deleted file mode 100644 index 85790649..00000000 --- a/src/deepgram/extensions/telemetry/models.py +++ /dev/null @@ -1,180 +0,0 @@ -""" -Generated Pydantic models from telemetry.proto -Auto-generated - do not edit manually -""" - -from __future__ import annotations - -import typing -from datetime import datetime -from enum import Enum - -import pydantic -from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class ErrorSeverity(str, Enum): - """Error severity level enum.""" - UNSPECIFIED = "ERROR_SEVERITY_UNSPECIFIED" - INFO = "ERROR_SEVERITY_INFO" - WARNING = "ERROR_SEVERITY_WARNING" - ERROR = "ERROR_SEVERITY_ERROR" - CRITICAL = "ERROR_SEVERITY_CRITICAL" - - -class TelemetryContext(UniversalBaseModel): - """ - Represents common context about the SDK/CLI and environment producing telemetry. - """ - - package_name: typing.Optional[str] = None - """e.g., "node-sdk", "python-sdk", "cli" """ - - package_version: typing.Optional[str] = None - """e.g., "3.2.1" """ - - language: typing.Optional[str] = None - """e.g., "node", "python", "go" """ - - runtime_version: typing.Optional[str] = None - """e.g., "node 20.11.1", "python 3.11.6" """ - - os: typing.Optional[str] = None - """e.g., "darwin", "linux", "windows" """ - - arch: typing.Optional[str] = None - """e.g., "arm64", "amd64" """ - - app_name: typing.Optional[str] = None - """host application name (if known) """ - - app_version: typing.Optional[str] = None - """host application version (if known) """ - - environment: typing.Optional[str] = None - """e.g., "prod", "staging", "dev" """ - - session_id: typing.Optional[str] = None - """client session identifier """ - - installation_id: typing.Optional[str] = None - """stable machine/install identifier when available """ - - project_id: typing.Optional[str] = None - """project/workspace identifier if applicable """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class TelemetryEvent(UniversalBaseModel): - """ - Telemetry event payload carrying arbitrary attributes and metrics. - """ - - name: str - """event name, e.g., "request.start" """ - - time: datetime - """event timestamp (UTC) """ - - attributes: typing.Optional[typing.Dict[str, str]] = None - """string attributes (tags) """ - - metrics: typing.Optional[typing.Dict[str, float]] = None - """numeric metrics """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ErrorEvent(UniversalBaseModel): - """ - Structured error event. - """ - - type: typing.Optional[str] = None - """error type/class, e.g., "TypeError" """ - - message: typing.Optional[str] = None - """error message """ - - stack_trace: typing.Optional[str] = None - """stack trace if available """ - - file: typing.Optional[str] = None - """source file (if known) """ - - line: typing.Optional[int] = None - """source line number """ - - column: typing.Optional[int] = None - """source column number """ - - severity: ErrorSeverity = ErrorSeverity.UNSPECIFIED - """severity level """ - - handled: bool = False - """whether the error was handled """ - - time: datetime - """error timestamp (UTC) """ - - attributes: typing.Optional[typing.Dict[str, str]] = None - """additional context as key/value """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class Record(UniversalBaseModel): - """ - A single record may be telemetry or error. - """ - - telemetry: typing.Optional[TelemetryEvent] = None - error: typing.Optional[ErrorEvent] = None - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class TelemetryBatch(UniversalBaseModel): - """ - Batch payload sent to the ingestion endpoint. - The entire batch may be gzip-compressed; server accepts raw or gzip. - """ - - context: TelemetryContext - """shared context for the batch """ - - records: typing.List[Record] - """telemetry and error records """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/telemetry/proto_encoder.py b/src/deepgram/extensions/telemetry/proto_encoder.py deleted file mode 100644 index a085ed0e..00000000 --- a/src/deepgram/extensions/telemetry/proto_encoder.py +++ /dev/null @@ -1,379 +0,0 @@ -from __future__ import annotations -# isort: skip_file - -import struct -import time -import typing -from typing import Dict, List - - -# --- Protobuf wire helpers (proto3) --- - -def _varint(value: int) -> bytes: - if value < 0: - # For this usage we only encode non-negative values - value &= (1 << 64) - 1 - out = bytearray() - while value > 0x7F: - out.append((value & 0x7F) | 0x80) - value >>= 7 - out.append(value) - return bytes(out) - - -def _key(field_number: int, wire_type: int) -> bytes: - return _varint((field_number << 3) | wire_type) - - -def _len_delimited(field_number: int, payload: bytes) -> bytes: - return _key(field_number, 2) + _varint(len(payload)) + payload - - -def _string(field_number: int, value: str) -> bytes: - data = value.encode("utf-8") - return _len_delimited(field_number, data) - - -def _bool(field_number: int, value: bool) -> bytes: - return _key(field_number, 0) + _varint(1 if value else 0) - - -def _int64(field_number: int, value: int) -> bytes: - return _key(field_number, 0) + _varint(value) - - -def _double(field_number: int, value: float) -> bytes: - return _key(field_number, 1) + struct.pack(" bytes: - sec = int(ts_seconds) - nanos = int(round((ts_seconds - sec) * 1_000_000_000)) - if nanos >= 1_000_000_000: - sec += 1 - nanos -= 1_000_000_000 - msg = bytearray() - msg += _int64(1, sec) - if nanos: - msg += _key(2, 0) + _varint(nanos) - return bytes(msg) - - -# Map encoders: map and map -def _map_str_str(field_number: int, items: typing.Mapping[str, str] | None) -> bytes: - if not items: - return b"" - out = bytearray() - for k, v in items.items(): - entry = _string(1, k) + _string(2, v) - out += _len_delimited(field_number, entry) - return bytes(out) - - -def _map_str_double(field_number: int, items: typing.Mapping[str, float] | None) -> bytes: - if not items: - return b"" - out = bytearray() - for k, v in items.items(): - entry = _string(1, k) + _double(2, float(v)) - out += _len_delimited(field_number, entry) - return bytes(out) - - -# --- Schema-specific encoders (deepgram.dxtelemetry.v1) --- - -def _encode_telemetry_context(ctx: typing.Mapping[str, typing.Any]) -> bytes: - # Map SDK context keys to proto fields - package_name = ctx.get("sdk_name") or ctx.get("package_name") or "python-sdk" - package_version = ctx.get("sdk_version") or ctx.get("package_version") or "" - language = ctx.get("language") or "python" - runtime_version = ctx.get("runtime_version") or "" - os_name = ctx.get("os") or "" - arch = ctx.get("arch") or "" - app_name = ctx.get("app_name") or "" - app_version = ctx.get("app_version") or "" - environment = ctx.get("environment") or "" - session_id = ctx.get("session_id") or "" - installation_id = ctx.get("installation_id") or "" - project_id = ctx.get("project_id") or "" - - msg = bytearray() - if package_name: - msg += _string(1, package_name) - if package_version: - msg += _string(2, package_version) - if language: - msg += _string(3, language) - if runtime_version: - msg += _string(4, runtime_version) - if os_name: - msg += _string(5, os_name) - if arch: - msg += _string(6, arch) - if app_name: - msg += _string(7, app_name) - if app_version: - msg += _string(8, app_version) - if environment: - msg += _string(9, environment) - if session_id: - msg += _string(10, session_id) - if installation_id: - msg += _string(11, installation_id) - if project_id: - msg += _string(12, project_id) - - # Include extras as additional context attributes (field 13) - extras = ctx.get("extras", {}) - if extras: - # Convert extras to string-string map for protobuf - extras_map = {} - for key, value in extras.items(): - if value is not None: - extras_map[str(key)] = str(value) - msg += _map_str_str(13, extras_map) - - return bytes(msg) - - -def _encode_telemetry_event(name: str, ts: float, attributes: Dict[str, str] | None, metrics: Dict[str, float] | None) -> bytes: - msg = bytearray() - msg += _string(1, name) - msg += _len_delimited(2, _timestamp_message(ts)) - msg += _map_str_str(3, attributes) - msg += _map_str_double(4, metrics) - return bytes(msg) - - -# ErrorSeverity enum values: ... INFO=1, WARNING=2, ERROR=3, CRITICAL=4 -def _encode_error_event( - *, - err_type: str, - message: str, - severity: int, - handled: bool, - ts: float, - attributes: Dict[str, str] | None, - stack_trace: str | None = None, - file: str | None = None, - line: int | None = None, - column: int | None = None, -) -> bytes: - msg = bytearray() - if err_type: - msg += _string(1, err_type) - if message: - msg += _string(2, message) - if stack_trace: - msg += _string(3, stack_trace) - if file: - msg += _string(4, file) - if line is not None: - msg += _key(5, 0) + _varint(line) - if column is not None: - msg += _key(6, 0) + _varint(column) - msg += _key(7, 0) + _varint(severity) - msg += _bool(8, handled) - msg += _len_delimited(9, _timestamp_message(ts)) - msg += _map_str_str(10, attributes) - return bytes(msg) - - -def _encode_record(record: bytes, kind_field_number: int) -> bytes: - # kind_field_number: 1 for telemetry, 2 for error - return _len_delimited(2, _len_delimited(kind_field_number, record)) - - -def _normalize_events(events: List[dict]) -> List[bytes]: - out: List[bytes] = [] - for e in events: - etype = e.get("type") - ts = float(e.get("ts", time.time())) - if etype == "http_request": - attrs = { - "method": str(e.get("method", "")), - # Note: URL is never logged for privacy - } - # Add request_id if present in headers for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - rec = _encode_telemetry_event("http.request", ts, attrs, None) - out.append(_encode_record(rec, 1)) - elif etype == "http_response": - attrs = { - "method": str(e.get("method", "")), - "status_code": str(e.get("status_code", "")), - # Note: URL is never logged for privacy - } - # Add request_id if present in headers for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - metrics = {"duration_ms": float(e.get("duration_ms", 0.0))} - rec = _encode_telemetry_event("http.response", ts, attrs, metrics) - out.append(_encode_record(rec, 1)) - elif etype == "http_error": - attrs = { - "method": str(e.get("method", "")), - # Note: URL is never logged for privacy - } - # Include status_code if present - sc = e.get("status_code") - if sc is not None: - attrs["status_code"] = str(sc) - # Add request_id if present in headers for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - rec = _encode_error_event( - err_type=str(e.get("error", "Error")), - message=str(e.get("message", "")), - severity=3, - handled=bool(e.get("handled", True)), - ts=ts, - attributes=attrs, - stack_trace=str(e.get("stack_trace", "")) or None, - ) - out.append(_encode_record(rec, 2)) - elif etype == "ws_connect": - attrs = { - # Note: URL is never logged for privacy - "connection_type": "websocket", - } - # Add request_id if present for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - rec = _encode_telemetry_event("ws.connect", ts, attrs, None) - out.append(_encode_record(rec, 1)) - elif etype == "ws_error": - attrs = { - # Note: URL is never logged for privacy - "connection_type": "websocket", - } - - # Add detailed error information to attributes - if e.get("error_type"): - attrs["error_type"] = str(e["error_type"]) - if e.get("function_name"): - attrs["function_name"] = str(e["function_name"]) - if e.get("sdk_function"): - attrs["sdk_function"] = str(e["sdk_function"]) - if e.get("timeout_occurred"): - attrs["timeout_occurred"] = str(e["timeout_occurred"]) - if e.get("duration_ms"): - attrs["duration_ms"] = str(e["duration_ms"]) - - # Add WebSocket handshake failure details - if e.get("handshake_status_code"): - attrs["handshake_status_code"] = str(e["handshake_status_code"]) - if e.get("handshake_reason_phrase"): - attrs["handshake_reason_phrase"] = str(e["handshake_reason_phrase"]) - if e.get("handshake_error_type"): - attrs["handshake_error_type"] = str(e["handshake_error_type"]) - if e.get("handshake_response_headers"): - # Include important handshake response headers - handshake_headers = e["handshake_response_headers"] - for header_name, header_value in handshake_headers.items(): - # Prefix with 'handshake_' to distinguish from request headers - safe_header_name = header_name.lower().replace('-', '_') - attrs[f"handshake_{safe_header_name}"] = str(header_value) - - # Add connection parameters if available - if e.get("connection_params"): - for key, value in e["connection_params"].items(): - if value is not None: - attrs[f"connection_{key}"] = str(value) - - # Add request_id if present for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - - # Include ALL extras in the attributes for comprehensive telemetry - extras = e.get("extras", {}) - if extras: - for key, value in extras.items(): - if value is not None and key not in attrs: - attrs[str(key)] = str(value) - - rec = _encode_error_event( - err_type=str(e.get("error_type", e.get("error", "Error"))), - message=str(e.get("error_message", e.get("message", ""))), - severity=3, - handled=bool(e.get("handled", True)), - ts=ts, - attributes=attrs, - stack_trace=str(e.get("stack_trace", "")) or None, - ) - out.append(_encode_record(rec, 2)) - elif etype == "uncaught_error": - rec = _encode_error_event( - err_type=str(e.get("error", "Error")), - message=str(e.get("message", "")), - severity=4 if not bool(e.get("handled", False)) else 3, - handled=bool(e.get("handled", False)), - ts=ts, - attributes=None, - stack_trace=str(e.get("stack_trace", "")) or None, - ) - out.append(_encode_record(rec, 2)) - elif etype == "ws_close": - attrs = { - # Note: URL is never logged for privacy - "connection_type": "websocket", - } - # Add request_id if present for server-side correlation - request_id = e.get("request_id") - if request_id: - attrs["request_id"] = str(request_id) - rec = _encode_telemetry_event("ws.close", ts, attrs, None) - out.append(_encode_record(rec, 1)) - elif etype == "telemetry_event": - # Generic telemetry event with custom name - name = e.get("name", "unknown") - attrs = dict(e.get("attributes", {})) - metrics = e.get("metrics", {}) - # Convert metrics to float values - if metrics: - metrics = {k: float(v) for k, v in metrics.items()} - rec = _encode_telemetry_event(name, ts, attrs, metrics) - out.append(_encode_record(rec, 1)) - elif etype == "error_event": - # Generic error event - attrs = dict(e.get("attributes", {})) - rec = _encode_error_event( - err_type=str(e.get("error_type", "Error")), - message=str(e.get("message", "")), - severity=int(e.get("severity", 3)), - handled=bool(e.get("handled", True)), - ts=ts, - attributes=attrs, - stack_trace=str(e.get("stack_trace", "")) or None, - file=str(e.get("file", "")) or None, - line=int(e.get("line", 0)) if e.get("line") else None, - column=int(e.get("column", 0)) if e.get("column") else None, - ) - out.append(_encode_record(rec, 2)) - else: - # Unknown event: drop silently - continue - return out - - -def encode_telemetry_batch(events: List[dict], context: typing.Mapping[str, typing.Any]) -> bytes: - ctx = _encode_telemetry_context(context) - records = b"".join(_normalize_events(events)) - batch = _len_delimited(1, ctx) + records - return batch - - -def encode_telemetry_batch_iter(events: List[dict], context: typing.Mapping[str, typing.Any]) -> typing.Iterator[bytes]: - # Streaming variant: yield small chunks (context first, then each record) - yield _len_delimited(1, _encode_telemetry_context(context)) - for rec in _normalize_events(events): - yield rec - - diff --git a/src/deepgram/extensions/types/__init__.py b/src/deepgram/extensions/types/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/deepgram/extensions/types/sockets/__init__.py b/src/deepgram/extensions/types/sockets/__init__.py deleted file mode 100644 index 2bf7ab2d..00000000 --- a/src/deepgram/extensions/types/sockets/__init__.py +++ /dev/null @@ -1,217 +0,0 @@ -# Socket message types - protected from auto-generation - -# isort: skip_file - -import typing -from importlib import import_module - -if typing.TYPE_CHECKING: - # Speak socket types - from .speak_v1_text_message import SpeakV1TextMessage - from .speak_v1_control_message import SpeakV1ControlMessage - from .speak_v1_audio_chunk_event import SpeakV1AudioChunkEvent - from .speak_v1_metadata_event import SpeakV1MetadataEvent - from .speak_v1_control_event import SpeakV1ControlEvent - from .speak_v1_warning_event import SpeakV1WarningEvent - - # Listen socket types - from .listen_v1_media_message import ListenV1MediaMessage - from .listen_v1_control_message import ListenV1ControlMessage - from .listen_v1_results_event import ListenV1ResultsEvent - from .listen_v1_metadata_event import ListenV1MetadataEvent - from .listen_v1_utterance_end_event import ListenV1UtteranceEndEvent - from .listen_v1_speech_started_event import ListenV1SpeechStartedEvent - - # Listen V2 socket types - from .listen_v2_media_message import ListenV2MediaMessage - from .listen_v2_control_message import ListenV2ControlMessage - from .listen_v2_connected_event import ListenV2ConnectedEvent - from .listen_v2_turn_info_event import ListenV2TurnInfoEvent - from .listen_v2_fatal_error_event import ListenV2FatalErrorEvent - - # Agent socket types - Main message types - from .agent_v1_settings_message import AgentV1SettingsMessage - from .agent_v1_update_speak_message import AgentV1UpdateSpeakMessage - from .agent_v1_update_prompt_message import AgentV1UpdatePromptMessage - from .agent_v1_inject_user_message_message import AgentV1InjectUserMessageMessage - from .agent_v1_inject_agent_message_message import AgentV1InjectAgentMessageMessage - from .agent_v1_function_call_response_message import AgentV1FunctionCallResponseMessage - from .agent_v1_control_message import AgentV1ControlMessage - from .agent_v1_media_message import AgentV1MediaMessage - from .agent_v1_welcome_message import AgentV1WelcomeMessage - from .agent_v1_settings_applied_event import AgentV1SettingsAppliedEvent - from .agent_v1_conversation_text_event import AgentV1ConversationTextEvent - from .agent_v1_user_started_speaking_event import AgentV1UserStartedSpeakingEvent - from .agent_v1_agent_thinking_event import AgentV1AgentThinkingEvent - from .agent_v1_function_call_request_event import AgentV1FunctionCallRequestEvent - from .agent_v1_agent_started_speaking_event import AgentV1AgentStartedSpeakingEvent - from .agent_v1_agent_audio_done_event import AgentV1AgentAudioDoneEvent - from .agent_v1_prompt_updated_event import AgentV1PromptUpdatedEvent - from .agent_v1_speak_updated_event import AgentV1SpeakUpdatedEvent - from .agent_v1_injection_refused_event import AgentV1InjectionRefusedEvent - from .agent_v1_error_event import AgentV1ErrorEvent - from .agent_v1_warning_event import AgentV1WarningEvent - from .agent_v1_audio_chunk_event import AgentV1AudioChunkEvent - - # Agent socket types - Nested configuration types - from .agent_v1_settings_message import ( - AgentV1AudioInput, - AgentV1AudioOutput, - AgentV1AudioConfig, - AgentV1HistoryMessage, - AgentV1FunctionCall, - AgentV1HistoryFunctionCalls, - AgentV1Flags, - AgentV1Context, - AgentV1ListenProvider, - AgentV1Listen, - AgentV1Endpoint, - AgentV1AwsCredentials, - AgentV1Function, - AgentV1OpenAiThinkProvider, - AgentV1AwsBedrockThinkProvider, - AgentV1AnthropicThinkProvider, - AgentV1GoogleThinkProvider, - AgentV1GroqThinkProvider, - AgentV1Think, - AgentV1DeepgramSpeakProvider, - AgentV1ElevenLabsSpeakProvider, - AgentV1CartesiaVoice, - AgentV1CartesiaSpeakProvider, - AgentV1OpenAiSpeakProvider, - AgentV1AwsPollySpeakProvider, - AgentV1SpeakProviderConfig, - AgentV1Agent, - ) - - # Union types for socket clients - from .socket_client_responses import ( - SpeakV1SocketClientResponse, - ListenV1SocketClientResponse, - ListenV2SocketClientResponse, - AgentV1SocketClientResponse, - # Backward compatibility aliases - SpeakSocketClientResponse, - ListenSocketClientResponse, - AgentSocketClientResponse, - ) - -__all__ = [ - # Speak socket types - "SpeakV1TextMessage", - "SpeakV1ControlMessage", - "SpeakV1AudioChunkEvent", - "SpeakV1MetadataEvent", - "SpeakV1ControlEvent", - "SpeakV1WarningEvent", - - # Listen socket types - "ListenV1MediaMessage", - "ListenV1ControlMessage", - "ListenV1ResultsEvent", - "ListenV1MetadataEvent", - "ListenV1UtteranceEndEvent", - "ListenV1SpeechStartedEvent", - - # Listen V2 socket types - "ListenV2MediaMessage", - "ListenV2ControlMessage", - "ListenV2ConnectedEvent", - "ListenV2TurnInfoEvent", - "ListenV2FatalErrorEvent", - - # Agent socket types - Main message types - "AgentV1SettingsMessage", - "AgentV1UpdateSpeakMessage", - "AgentV1UpdatePromptMessage", - "AgentV1InjectUserMessageMessage", - "AgentV1InjectAgentMessageMessage", - "AgentV1FunctionCallResponseMessage", - "AgentV1ControlMessage", - "AgentV1MediaMessage", - "AgentV1WelcomeMessage", - "AgentV1SettingsAppliedEvent", - "AgentV1ConversationTextEvent", - "AgentV1UserStartedSpeakingEvent", - "AgentV1AgentThinkingEvent", - "AgentV1FunctionCallRequestEvent", - "AgentV1AgentStartedSpeakingEvent", - "AgentV1AgentAudioDoneEvent", - "AgentV1PromptUpdatedEvent", - "AgentV1SpeakUpdatedEvent", - "AgentV1InjectionRefusedEvent", - "AgentV1ErrorEvent", - "AgentV1WarningEvent", - "AgentV1AudioChunkEvent", - - # Agent socket types - Nested configuration types - "AgentV1AudioInput", - "AgentV1AudioOutput", - "AgentV1AudioConfig", - "AgentV1HistoryMessage", - "AgentV1FunctionCall", - "AgentV1HistoryFunctionCalls", - "AgentV1Flags", - "AgentV1Context", - "AgentV1ListenProvider", - "AgentV1Listen", - "AgentV1Endpoint", - "AgentV1AwsCredentials", - "AgentV1Function", - "AgentV1OpenAiThinkProvider", - "AgentV1AwsBedrockThinkProvider", - "AgentV1AnthropicThinkProvider", - "AgentV1GoogleThinkProvider", - "AgentV1GroqThinkProvider", - "AgentV1Think", - "AgentV1DeepgramSpeakProvider", - "AgentV1ElevenLabsSpeakProvider", - "AgentV1CartesiaVoice", - "AgentV1CartesiaSpeakProvider", - "AgentV1OpenAiSpeakProvider", - "AgentV1AwsPollySpeakProvider", - "AgentV1SpeakProviderConfig", - "AgentV1Agent", - - # Union types - "SpeakV1SocketClientResponse", - "ListenV1SocketClientResponse", - "ListenV2SocketClientResponse", - "AgentV1SocketClientResponse", - - # Backward compatibility aliases - "SpeakSocketClientResponse", - "ListenSocketClientResponse", - "AgentSocketClientResponse", -] - - -def __getattr__(name: str) -> typing.Any: - if name in __all__: - # Handle special case for union types - if name.endswith("SocketClientResponse"): - return getattr(import_module(".socket_client_responses", package=__name__), name) - - # Handle nested types from agent_v1_settings_message - nested_agent_types = { - "AgentV1AudioInput", "AgentV1AudioOutput", "AgentV1AudioConfig", - "AgentV1HistoryMessage", "AgentV1FunctionCall", "AgentV1HistoryFunctionCalls", - "AgentV1Flags", "AgentV1Context", "AgentV1ListenProvider", "AgentV1Listen", - "AgentV1Endpoint", "AgentV1AwsCredentials", "AgentV1Function", - "AgentV1OpenAiThinkProvider", "AgentV1AwsBedrockThinkProvider", - "AgentV1AnthropicThinkProvider", "AgentV1GoogleThinkProvider", - "AgentV1GroqThinkProvider", "AgentV1Think", "AgentV1DeepgramSpeakProvider", - "AgentV1ElevenLabsSpeakProvider", "AgentV1CartesiaVoice", - "AgentV1CartesiaSpeakProvider", "AgentV1OpenAiSpeakProvider", - "AgentV1AwsPollySpeakProvider", "AgentV1SpeakProviderConfig", - "AgentV1Agent" - } - - if name in nested_agent_types: - return getattr(import_module(".agent_v1_settings_message", package=__name__), name) - - # Convert CamelCase to snake_case for other types - import re - module_name = re.sub('([A-Z]+)', r'_\1', name).lower().lstrip('_') - return getattr(import_module(f".{module_name}", package=__name__), name) - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/src/deepgram/extensions/types/sockets/agent_v1_agent_audio_done_event.py b/src/deepgram/extensions/types/sockets/agent_v1_agent_audio_done_event.py deleted file mode 100644 index b1c4c280..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_agent_audio_done_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# Agent V1 Agent Audio Done Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1AgentAudioDoneEvent(UniversalBaseModel): - """ - Get signals that the server has finished sending the final audio segment to the client - """ - - type: typing.Literal["AgentAudioDone"] = "AgentAudioDone" - """Message type identifier indicating the agent has finished sending audio""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_agent_started_speaking_event.py b/src/deepgram/extensions/types/sockets/agent_v1_agent_started_speaking_event.py deleted file mode 100644 index 4484892c..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_agent_started_speaking_event.py +++ /dev/null @@ -1,33 +0,0 @@ -# Agent V1 Agent Started Speaking Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1AgentStartedSpeakingEvent(UniversalBaseModel): - """ - Get notified when the server begins streaming an agent's audio response for playback. - This message is only sent when the experimental flag is enabled - """ - - type: typing.Literal["AgentStartedSpeaking"] = "AgentStartedSpeaking" - """Message type identifier for agent started speaking""" - - total_latency: float - """Seconds from receiving the user's utterance to producing the agent's reply""" - - tts_latency: float - """The portion of total latency attributable to text-to-speech""" - - ttt_latency: float - """The portion of total latency attributable to text-to-text (usually an LLM)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_agent_thinking_event.py b/src/deepgram/extensions/types/sockets/agent_v1_agent_thinking_event.py deleted file mode 100644 index ea02b83a..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_agent_thinking_event.py +++ /dev/null @@ -1,26 +0,0 @@ -# Agent V1 Agent Thinking Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1AgentThinkingEvent(UniversalBaseModel): - """ - Inform the client when the agent is processing information - """ - - type: typing.Literal["AgentThinking"] = "AgentThinking" - """Message type identifier for agent thinking""" - - content: str - """The text of the agent's thought process""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_audio_chunk_event.py b/src/deepgram/extensions/types/sockets/agent_v1_audio_chunk_event.py deleted file mode 100644 index ddc079e5..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_audio_chunk_event.py +++ /dev/null @@ -1,9 +0,0 @@ -# Agent V1 Audio Chunk Event - protected from auto-generation - -# This represents binary audio data received from the Voice Agent WebSocket -# The actual data is bytes, but we define this as a type alias for clarity -AgentV1AudioChunkEvent = bytes -""" -Raw binary audio data generated by Deepgram's Voice Agent API. -Content-Type: application/octet-stream -""" diff --git a/src/deepgram/extensions/types/sockets/agent_v1_conversation_text_event.py b/src/deepgram/extensions/types/sockets/agent_v1_conversation_text_event.py deleted file mode 100644 index f3934985..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_conversation_text_event.py +++ /dev/null @@ -1,29 +0,0 @@ -# Agent V1 Conversation Text Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1ConversationTextEvent(UniversalBaseModel): - """ - Facilitate real-time communication by relaying spoken statements from both the user and the assistant - """ - - type: typing.Literal["ConversationText"] = "ConversationText" - """Message type identifier for conversation text""" - - role: typing.Literal["user", "assistant"] - """Identifies who spoke the statement""" - - content: str - """The actual statement that was spoken""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_function_call_request_event.py b/src/deepgram/extensions/types/sockets/agent_v1_function_call_request_event.py deleted file mode 100644 index 0a719b0f..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_function_call_request_event.py +++ /dev/null @@ -1,50 +0,0 @@ -# Agent V1 Function Call Request Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1FunctionCallRequestFunction(UniversalBaseModel): - """Function call request details""" - - id: str - """Unique identifier for the function call""" - - name: str - """The name of the function to call""" - - arguments: str - """JSON string containing the function arguments""" - - client_side: bool - """Whether the function should be executed client-side""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1FunctionCallRequestEvent(UniversalBaseModel): - """ - Client-side or server-side function call request sent by the server - """ - - type: typing.Literal["FunctionCallRequest"] = "FunctionCallRequest" - """Message type identifier for function call requests""" - - functions: typing.List[AgentV1FunctionCallRequestFunction] - """Array of functions to be called""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_function_call_response_message.py b/src/deepgram/extensions/types/sockets/agent_v1_function_call_response_message.py deleted file mode 100644 index 6dde0df2..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_function_call_response_message.py +++ /dev/null @@ -1,32 +0,0 @@ -# Agent V1 Function Call Response Message - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1FunctionCallResponseMessage(UniversalBaseModel): - """ - Client-side or server-side function call response sent by the server - """ - - type: typing.Literal["FunctionCallResponse"] = "FunctionCallResponse" - """Message type identifier for function call responses""" - - name: str - """The name of the function being called""" - - content: str - """The content or result of the function call""" - - id: typing.Optional[str] = None - """The unique identifier for the function call (optional but recommended for traceability)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_inject_agent_message_message.py b/src/deepgram/extensions/types/sockets/agent_v1_inject_agent_message_message.py deleted file mode 100644 index 1c00546d..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_inject_agent_message_message.py +++ /dev/null @@ -1,26 +0,0 @@ -# Agent V1 Inject Agent Message Message - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1InjectAgentMessageMessage(UniversalBaseModel): - """ - Immediately trigger an agent response during a conversation - """ - - type: typing.Literal["InjectAgentMessage"] = "InjectAgentMessage" - """Message type identifier for injecting an agent message""" - - message: str - """The statement that the agent should say""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_inject_user_message_message.py b/src/deepgram/extensions/types/sockets/agent_v1_inject_user_message_message.py deleted file mode 100644 index 0e7da495..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_inject_user_message_message.py +++ /dev/null @@ -1,26 +0,0 @@ -# Agent V1 Inject User Message Message - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1InjectUserMessageMessage(UniversalBaseModel): - """ - Send a text based message to the agent - """ - - type: typing.Literal["InjectUserMessage"] = "InjectUserMessage" - """Message type identifier for injecting a user message""" - - content: str - """The specific phrase or statement the agent should respond to""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_injection_refused_event.py b/src/deepgram/extensions/types/sockets/agent_v1_injection_refused_event.py deleted file mode 100644 index c0f93373..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_injection_refused_event.py +++ /dev/null @@ -1,26 +0,0 @@ -# Agent V1 Injection Refused Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1InjectionRefusedEvent(UniversalBaseModel): - """ - Receive injection refused message - """ - - type: typing.Literal["InjectionRefused"] = "InjectionRefused" - """Message type identifier for injection refused""" - - message: str - """Details about why the injection was refused""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_media_message.py b/src/deepgram/extensions/types/sockets/agent_v1_media_message.py deleted file mode 100644 index c3c9ffdb..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_media_message.py +++ /dev/null @@ -1,9 +0,0 @@ -# Agent V1 Media Message - protected from auto-generation - -# This represents binary media data sent to the Voice Agent WebSocket -# The actual data is bytes, but we define this as a type alias for clarity -AgentV1MediaMessage = bytes -""" -Raw binary audio data sent to Deepgram's Voice Agent API for processing. -Content-Type: application/octet-stream -""" diff --git a/src/deepgram/extensions/types/sockets/agent_v1_prompt_updated_event.py b/src/deepgram/extensions/types/sockets/agent_v1_prompt_updated_event.py deleted file mode 100644 index 0d0db586..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_prompt_updated_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# Agent V1 Prompt Updated Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1PromptUpdatedEvent(UniversalBaseModel): - """ - Confirms that an UpdatePrompt message from the client has been applied - """ - - type: typing.Literal["PromptUpdated"] = "PromptUpdated" - """Message type identifier for prompt update confirmation""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_settings_applied_event.py b/src/deepgram/extensions/types/sockets/agent_v1_settings_applied_event.py deleted file mode 100644 index 6987e368..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_settings_applied_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# Agent V1 Settings Applied Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1SettingsAppliedEvent(UniversalBaseModel): - """ - Confirm the server has successfully received and applied the Settings message - """ - - type: typing.Literal["SettingsApplied"] = "SettingsApplied" - """Message type identifier for settings applied confirmation""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_settings_message.py b/src/deepgram/extensions/types/sockets/agent_v1_settings_message.py deleted file mode 100644 index ccb57e84..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_settings_message.py +++ /dev/null @@ -1,685 +0,0 @@ -# Agent V1 Settings Message - protected from auto-generation - -import typing - -try: - from typing import Annotated # type: ignore[attr-defined,assignment] -except ImportError: - from typing_extensions import Annotated # type: ignore[import-untyped,assignment] - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - -# Cross-version constrained types -if IS_PYDANTIC_V2: - IntContextLength = Annotated[int, pydantic.Field(ge=2)] # type: ignore[misc,assignment,attr-defined,valid-type] - Temperature0to2 = Annotated[float, pydantic.Field(ge=0, le=2)] # type: ignore[misc,assignment,attr-defined,valid-type] - Temperature0to1 = Annotated[float, pydantic.Field(ge=0, le=1)] # type: ignore[misc,assignment,attr-defined,valid-type] -else: - IntContextLength = pydantic.conint(ge=2) # type: ignore[attr-defined,misc,assignment,no-redef,valid-type] - Temperature0to2 = pydantic.confloat(ge=0, le=2) # type: ignore[attr-defined,misc,assignment,no-redef,valid-type] - Temperature0to1 = pydantic.confloat(ge=0, le=1) # type: ignore[attr-defined,misc,assignment,no-redef,valid-type] - - -class AgentV1AudioInput(UniversalBaseModel): - """Audio input configuration settings""" - - encoding: typing.Literal[ - "linear16", "linear32", "flac", "alaw", "mulaw", - "amr-nb", "amr-wb", "opus", "ogg-opus", "speex", "g729" - ] = "linear16" - """Audio encoding format""" - - sample_rate: int = 24000 - """Sample rate in Hz. Common values are 16000, 24000, 44100, 48000""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1AudioOutput(UniversalBaseModel): - """Audio output configuration settings""" - - encoding: typing.Optional[typing.Literal["linear16", "mulaw", "alaw"]] = "linear16" - """Audio encoding format for streaming TTS output""" - - sample_rate: typing.Optional[int] = None - """Sample rate in Hz""" - - bitrate: typing.Optional[int] = None - """Audio bitrate in bits per second""" - - container: typing.Optional[str] = None - """Audio container format. If omitted, defaults to 'none'""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1AudioConfig(UniversalBaseModel): - """Audio configuration settings""" - - input: typing.Optional[AgentV1AudioInput] = None - """Audio input configuration""" - - output: typing.Optional[AgentV1AudioOutput] = None - """Audio output configuration""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1HistoryMessage(UniversalBaseModel): - """Conversation text as part of the conversation history""" - - type: typing.Literal["History"] = "History" - """Message type identifier for conversation text""" - - role: typing.Literal["user", "assistant"] - """Identifies who spoke the statement""" - - content: str - """The actual statement that was spoken""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1FunctionCall(UniversalBaseModel): - """Function call in conversation history""" - - id: str - """Unique identifier for the function call""" - - name: str - """Name of the function called""" - - client_side: bool - """Indicates if the call was client-side or server-side""" - - arguments: str - """Arguments passed to the function""" - - response: str - """Response from the function call""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1HistoryFunctionCalls(UniversalBaseModel): - """Client-side or server-side function call request and response as part of the conversation history""" - - type: typing.Literal["History"] = "History" - """Message type identifier""" - - function_calls: typing.List[AgentV1FunctionCall] - """List of function call objects""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1Flags(UniversalBaseModel): - """Agent flags configuration""" - - history: bool = True - """Enable or disable history message reporting""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Context configuration -class AgentV1Context(UniversalBaseModel): - """Conversation context including the history of messages and function calls""" - - messages: typing.Optional[typing.List[typing.Union[AgentV1HistoryMessage, AgentV1HistoryFunctionCalls]]] = None - """Conversation history as a list of messages and function calls""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Listen provider configuration -class AgentV1ListenProvider(UniversalBaseModel): - """Listen provider configuration""" - - type: typing.Literal["deepgram"] = "deepgram" - """Provider type for speech-to-text""" - - model: str - """Model to use for speech to text""" - - keyterms: typing.Optional[typing.List[str]] = None - """Prompt key-term recognition (nova-3 'en' only)""" - - smart_format: typing.Optional[bool] = False - """Applies smart formatting to improve transcript readability (Deepgram providers only)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1Listen(UniversalBaseModel): - """Listen configuration""" - - provider: AgentV1ListenProvider - """Listen provider configuration""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Endpoint configuration -class AgentV1Endpoint(UniversalBaseModel): - """Custom endpoint configuration""" - - url: str - """Custom endpoint URL""" - - headers: typing.Optional[typing.Dict[str, str]] = None - """Custom headers for the endpoint""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# AWS Credentials -class AgentV1AwsCredentials(UniversalBaseModel): - """AWS credentials configuration""" - - type: typing.Literal["sts", "iam"] - """AWS credentials type (STS short-lived or IAM long-lived)""" - - region: str - """AWS region""" - - access_key_id: str - """AWS access key""" - - secret_access_key: str - """AWS secret access key""" - - session_token: typing.Optional[str] = None - """AWS session token (required for STS only)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Function definition -class AgentV1Function(UniversalBaseModel): - """Function definition for think provider""" - - name: str - """Function name""" - - description: typing.Optional[str] = None - """Function description""" - - parameters: typing.Optional[typing.Dict[str, typing.Any]] = None - """Function parameters""" - - endpoint: typing.Optional[AgentV1Endpoint] = None - """The Function endpoint to call. if not passed, function is called client-side""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Think provider configurations -class AgentV1OpenAiThinkProvider(UniversalBaseModel): - """OpenAI think provider configuration""" - - type: typing.Literal["open_ai"] = "open_ai" - """Provider type""" - - model: typing.Literal[ - "gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", - "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini" - ] - """OpenAI model to use""" - - temperature: typing.Optional[Temperature0to2] = None # type: ignore[valid-type] - """OpenAI temperature (0-2)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1AwsBedrockThinkProvider(UniversalBaseModel): - """AWS Bedrock think provider configuration""" - - type: typing.Literal["aws_bedrock"] = "aws_bedrock" - """Provider type""" - - model: typing.Literal[ - "anthropic/claude-3-5-sonnet-20240620-v1:0", - "anthropic/claude-3-5-haiku-20240307-v1:0" - ] - """AWS Bedrock model to use""" - - temperature: typing.Optional[Temperature0to2] = None # type: ignore[valid-type] - """AWS Bedrock temperature (0-2)""" - - credentials: typing.Optional[AgentV1AwsCredentials] = None - """AWS credentials type (STS short-lived or IAM long-lived)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1AnthropicThinkProvider(UniversalBaseModel): - """Anthropic think provider configuration""" - - type: typing.Literal["anthropic"] = "anthropic" - """Provider type""" - - model: typing.Literal["claude-3-5-haiku-latest", "claude-sonnet-4-20250514"] - """Anthropic model to use""" - - temperature: typing.Optional[Temperature0to1] = None # type: ignore[valid-type] - """Anthropic temperature (0-1)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1GoogleThinkProvider(UniversalBaseModel): - """Google think provider configuration""" - - type: typing.Literal["google"] = "google" - """Provider type""" - - model: typing.Literal["gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash"] - """Google model to use""" - - temperature: typing.Optional[Temperature0to2] = None # type: ignore[valid-type] - """Google temperature (0-2)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1GroqThinkProvider(UniversalBaseModel): - """Groq think provider configuration""" - - type: typing.Literal["groq"] = "groq" - """Provider type""" - - model: typing.Literal["openai/gpt-oss-20b"] - """Groq model to use""" - - temperature: typing.Optional[Temperature0to2] = None # type: ignore[valid-type] - """Groq temperature (0-2)""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Think configuration -class AgentV1Think(UniversalBaseModel): - """Think configuration""" - - provider: typing.Union[ - AgentV1OpenAiThinkProvider, AgentV1AwsBedrockThinkProvider, - AgentV1AnthropicThinkProvider, AgentV1GoogleThinkProvider, - AgentV1GroqThinkProvider - ] - """Think provider configuration""" - - endpoint: typing.Optional[AgentV1Endpoint] = None - """Optional for non-Deepgram LLM providers. When present, must include url field and headers object""" - - functions: typing.Optional[typing.List[AgentV1Function]] = None - """Function definitions""" - - prompt: typing.Optional[str] = None - """System prompt""" - - context_length: typing.Optional[typing.Union[typing.Literal["max"], IntContextLength]] = None # type: ignore[valid-type] - """Specifies the number of characters retained in context between user messages, agent responses, and function calls""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Speak provider configurations -class AgentV1DeepgramSpeakProvider(UniversalBaseModel): - """Deepgram speak provider configuration""" - - type: typing.Literal["deepgram"] = "deepgram" - """Provider type""" - - model: typing.Literal[ - # Aura-1 English Voices - "aura-asteria-en", "aura-luna-en", "aura-stella-en", "aura-athena-en", - "aura-hera-en", "aura-orion-en", "aura-arcas-en", "aura-perseus-en", - "aura-angus-en", "aura-orpheus-en", "aura-helios-en", "aura-zeus-en", - # Aura-2 English Voices - "aura-2-amalthea-en", "aura-2-andromeda-en", "aura-2-apollo-en", - "aura-2-arcas-en", "aura-2-aries-en", "aura-2-asteria-en", - "aura-2-athena-en", "aura-2-atlas-en", "aura-2-aurora-en", - "aura-2-callista-en", "aura-2-cora-en", "aura-2-cordelia-en", - "aura-2-delia-en", "aura-2-draco-en", "aura-2-electra-en", - "aura-2-harmonia-en", "aura-2-helena-en", "aura-2-hera-en", - "aura-2-hermes-en", "aura-2-hyperion-en", "aura-2-iris-en", - "aura-2-janus-en", "aura-2-juno-en", "aura-2-jupiter-en", - "aura-2-luna-en", "aura-2-mars-en", "aura-2-minerva-en", - "aura-2-neptune-en", "aura-2-odysseus-en", "aura-2-ophelia-en", - "aura-2-orion-en", "aura-2-orpheus-en", "aura-2-pandora-en", - "aura-2-phoebe-en", "aura-2-pluto-en", "aura-2-saturn-en", - "aura-2-selene-en", "aura-2-thalia-en", "aura-2-theia-en", - "aura-2-vesta-en", "aura-2-zeus-en", - # Aura-2 Spanish Voices - "aura-2-sirio-es", "aura-2-nestor-es", "aura-2-carina-es", - "aura-2-celeste-es", "aura-2-alvaro-es", "aura-2-diana-es", - "aura-2-aquila-es", "aura-2-selena-es", "aura-2-estrella-es", - "aura-2-javier-es" - ] - """Deepgram TTS model""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1ElevenLabsSpeakProvider(UniversalBaseModel): - """Eleven Labs speak provider configuration""" - - type: typing.Literal["eleven_labs"] = "eleven_labs" - """Provider type""" - - model_id: typing.Literal["eleven_turbo_v2_5", "eleven_monolingual_v1", "eleven_multilingual_v2"] - """Eleven Labs model ID""" - - language_code: typing.Optional[str] = None - """Eleven Labs optional language code""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1CartesiaVoice(UniversalBaseModel): - """Cartesia voice configuration""" - - mode: str - """Cartesia voice mode""" - - id: str - """Cartesia voice ID""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1CartesiaSpeakProvider(UniversalBaseModel): - """Cartesia speak provider configuration""" - - type: typing.Literal["cartesia"] = "cartesia" - """Provider type""" - - model_id: typing.Literal["sonic-2", "sonic-multilingual"] - """Cartesia model ID""" - - voice: AgentV1CartesiaVoice - """Cartesia voice configuration""" - - language: typing.Optional[str] = None - """Cartesia language code""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1OpenAiSpeakProvider(UniversalBaseModel): - """OpenAI speak provider configuration""" - - type: typing.Literal["open_ai"] = "open_ai" - """Provider type""" - - model: typing.Literal["tts-1", "tts-1-hd"] - """OpenAI TTS model""" - - voice: typing.Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"] - """OpenAI voice""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1AwsPollySpeakProvider(UniversalBaseModel): - """AWS Polly speak provider configuration""" - - type: typing.Literal["aws_polly"] = "aws_polly" - """Provider type""" - - voice: typing.Literal["Matthew", "Joanna", "Amy", "Emma", "Brian", "Arthur", "Aria", "Ayanda"] - """AWS Polly voice name""" - - language_code: str - """Language code (e.g., "en-US")""" - - engine: typing.Literal["generative", "long-form", "standard", "neural"] - """AWS Polly engine""" - - credentials: AgentV1AwsCredentials - """AWS credentials""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -# Speak configuration -class AgentV1SpeakProviderConfig(UniversalBaseModel): - """Speak provider configuration wrapper""" - - provider: typing.Union[ - AgentV1DeepgramSpeakProvider, AgentV1ElevenLabsSpeakProvider, - AgentV1CartesiaSpeakProvider, AgentV1OpenAiSpeakProvider, - AgentV1AwsPollySpeakProvider - ] - """Speak provider configuration""" - - endpoint: typing.Optional[AgentV1Endpoint] = None - """Optional if provider is Deepgram. Required for non-Deepgram TTS providers""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - - -# Agent configuration -class AgentV1Agent(UniversalBaseModel): - """Agent configuration""" - - language: typing.Optional[typing.Literal["en", "es"]] = "en" - """Agent language""" - - context: typing.Optional[AgentV1Context] = None - """Conversation context including the history of messages and function calls""" - - listen: typing.Optional[AgentV1Listen] = None - """Listen configuration""" - - think: AgentV1Think - """Think configuration""" - - speak: typing.Union[AgentV1SpeakProviderConfig, typing.List[AgentV1SpeakProviderConfig]] - """Speak configuration - can be single provider or array of providers""" - - greeting: typing.Optional[str] = None - """Optional message that agent will speak at the start""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class AgentV1SettingsMessage(UniversalBaseModel): - """ - Configure the voice agent and sets the input and output audio formats - """ - - type: typing.Literal["Settings"] = "Settings" - """Message type identifier""" - - audio: AgentV1AudioConfig - """Audio configuration settings""" - - agent: AgentV1Agent - """Agent configuration with proper nested types""" - - tags: typing.Optional[typing.List[str]] = None - """Tags to associate with the request""" - - experimental: typing.Optional[bool] = False - """To enable experimental features""" - - flags: typing.Optional[AgentV1Flags] = None - """Agent flags configuration""" - - mip_opt_out: typing.Optional[bool] = False - """To opt out of Deepgram Model Improvement Program""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_speak_updated_event.py b/src/deepgram/extensions/types/sockets/agent_v1_speak_updated_event.py deleted file mode 100644 index bd518819..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_speak_updated_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# Agent V1 Speak Updated Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1SpeakUpdatedEvent(UniversalBaseModel): - """ - Confirms that an UpdateSpeak message from the client has been applied - """ - - type: typing.Literal["SpeakUpdated"] = "SpeakUpdated" - """Message type identifier for speak update confirmation""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_update_prompt_message.py b/src/deepgram/extensions/types/sockets/agent_v1_update_prompt_message.py deleted file mode 100644 index 5cd34061..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_update_prompt_message.py +++ /dev/null @@ -1,26 +0,0 @@ -# Agent V1 Update Prompt Message - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1UpdatePromptMessage(UniversalBaseModel): - """ - Send a message to update the system prompt of the agent - """ - - type: typing.Literal["UpdatePrompt"] = "UpdatePrompt" - """Message type identifier for prompt update request""" - - prompt: str - """The new system prompt to be used by the agent""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_update_speak_message.py b/src/deepgram/extensions/types/sockets/agent_v1_update_speak_message.py deleted file mode 100644 index cb391739..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_update_speak_message.py +++ /dev/null @@ -1,31 +0,0 @@ -# Agent V1 Update Speak Message - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - -# Import the complete speak provider types from settings message -from .agent_v1_settings_message import ( - AgentV1SpeakProviderConfig, -) - - -class AgentV1UpdateSpeakMessage(UniversalBaseModel): - """ - Send a message to change the Speak model in the middle of a conversation - """ - - type: typing.Literal["UpdateSpeak"] = "UpdateSpeak" - """Message type identifier for updating the speak model""" - - speak: AgentV1SpeakProviderConfig - """Configuration for the speak model with proper nested types""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_user_started_speaking_event.py b/src/deepgram/extensions/types/sockets/agent_v1_user_started_speaking_event.py deleted file mode 100644 index 786e6c50..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_user_started_speaking_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# Agent V1 User Started Speaking Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1UserStartedSpeakingEvent(UniversalBaseModel): - """ - Notify the client that the user has begun speaking - """ - - type: typing.Literal["UserStartedSpeaking"] = "UserStartedSpeaking" - """Message type identifier indicating that the user has begun speaking""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/agent_v1_warning_event.py b/src/deepgram/extensions/types/sockets/agent_v1_warning_event.py deleted file mode 100644 index 296ec399..00000000 --- a/src/deepgram/extensions/types/sockets/agent_v1_warning_event.py +++ /dev/null @@ -1,29 +0,0 @@ -# Agent V1 Warning Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class AgentV1WarningEvent(UniversalBaseModel): - """ - Notifies the client of non-fatal errors or warnings - """ - - type: typing.Literal["Warning"] = "Warning" - """Message type identifier for warnings""" - - description: str - """Description of the warning""" - - code: str - """Warning code identifier""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow \ No newline at end of file diff --git a/src/deepgram/extensions/types/sockets/listen_v1_media_message.py b/src/deepgram/extensions/types/sockets/listen_v1_media_message.py deleted file mode 100644 index 3719cbc4..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v1_media_message.py +++ /dev/null @@ -1,9 +0,0 @@ -# Listen V1 Media Message - protected from auto-generation - -# This represents binary media data sent to the WebSocket -# The actual data is bytes, but we define this as a type alias for clarity -ListenV1MediaMessage = bytes -""" -Audio data transmitted as raw binary WebSocket messages. -Content-Type: application/octet-stream -""" diff --git a/src/deepgram/extensions/types/sockets/listen_v1_metadata_event.py b/src/deepgram/extensions/types/sockets/listen_v1_metadata_event.py deleted file mode 100644 index d55c46df..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v1_metadata_event.py +++ /dev/null @@ -1,41 +0,0 @@ -# Listen V1 Metadata Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class ListenV1MetadataEvent(UniversalBaseModel): - """ - Metadata event - these are usually information describing the connection - """ - - type: typing.Literal["Metadata"] - """Message type identifier""" - - transaction_key: typing.Optional[str] = None - """The transaction key (deprecated)""" - - request_id: str - """The request ID""" - - sha256: str - """The sha256""" - - created: str - """The created timestamp""" - - duration: float - """The duration""" - - channels: float - """The channels""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/listen_v1_results_event.py b/src/deepgram/extensions/types/sockets/listen_v1_results_event.py deleted file mode 100644 index ee879279..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v1_results_event.py +++ /dev/null @@ -1,156 +0,0 @@ -# Listen V1 Results Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class ListenV1Word(UniversalBaseModel): - """Word in transcription results""" - word: str - """The word of the transcription""" - - start: float - """The start time of the word""" - - end: float - """The end time of the word""" - - confidence: float - """The confidence of the word""" - - language: typing.Optional[str] = None - """The language of the word""" - - punctuated_word: typing.Optional[str] = None - """The punctuated word of the word""" - - speaker: typing.Optional[int] = None - """The speaker of the word""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ListenV1Alternative(UniversalBaseModel): - """Alternative transcription result""" - transcript: str - """The transcript of the transcription""" - - confidence: float - """The confidence of the transcription""" - - languages: typing.Optional[typing.List[str]] = None - """The languages of the transcription""" - - words: typing.List[ListenV1Word] - """Array of words in the transcription""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ListenV1Channel(UniversalBaseModel): - """Channel transcription results""" - alternatives: typing.List[ListenV1Alternative] - """Array of alternative transcription results""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ListenV1ModelInfo(UniversalBaseModel): - """Model information""" - name: str - """The name of the model""" - - version: str - """The version of the model""" - - arch: str - """The arch of the model""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ListenV1ResultsMetadata(UniversalBaseModel): - """Results metadata""" - request_id: str - """The request ID""" - - model_info: ListenV1ModelInfo - """Model information""" - - model_uuid: str - """The model UUID""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class ListenV1ResultsEvent(UniversalBaseModel): - """ - Deepgram has responded with a transcription - """ - - type: typing.Literal["Results"] - """Message type identifier""" - - channel_index: typing.List[int] - """The index of the channel""" - - duration: float - """The duration of the transcription""" - - start: float - """The start time of the transcription""" - - is_final: typing.Optional[bool] = None - """Whether the transcription is final""" - - speech_final: typing.Optional[bool] = None - """Whether the transcription is speech final""" - - channel: ListenV1Channel - """Channel transcription results""" - - metadata: ListenV1ResultsMetadata - """Results metadata""" - - from_finalize: typing.Optional[bool] = None - """Whether the transcription is from a finalize message""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/listen_v2_connected_event.py b/src/deepgram/extensions/types/sockets/listen_v2_connected_event.py deleted file mode 100644 index 39e97087..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v2_connected_event.py +++ /dev/null @@ -1,23 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from typing import Optional - -from ....core.pydantic_utilities import UniversalBaseModel - - -class ListenV2ConnectedEvent(UniversalBaseModel): - type: str - request_id: str - sequence_id: int - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" diff --git a/src/deepgram/extensions/types/sockets/listen_v2_control_message.py b/src/deepgram/extensions/types/sockets/listen_v2_control_message.py deleted file mode 100644 index cc69837d..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v2_control_message.py +++ /dev/null @@ -1,23 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from typing import Literal - -from ....core.pydantic_utilities import UniversalBaseModel - - -class ListenV2ControlMessage(UniversalBaseModel): - """Control messages for managing the Speech to Text WebSocket connection""" - - type: Literal["CloseStream"] - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" diff --git a/src/deepgram/extensions/types/sockets/listen_v2_fatal_error_event.py b/src/deepgram/extensions/types/sockets/listen_v2_fatal_error_event.py deleted file mode 100644 index eb7107ab..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v2_fatal_error_event.py +++ /dev/null @@ -1,24 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from typing import Optional - -from ....core.pydantic_utilities import UniversalBaseModel - - -class ListenV2FatalErrorEvent(UniversalBaseModel): - type: str - sequence_id: int - code: str - description: str - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" diff --git a/src/deepgram/extensions/types/sockets/listen_v2_media_message.py b/src/deepgram/extensions/types/sockets/listen_v2_media_message.py deleted file mode 100644 index 79a7f054..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v2_media_message.py +++ /dev/null @@ -1,19 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from ....core.pydantic_utilities import UniversalBaseModel - - -class ListenV2MediaMessage(UniversalBaseModel): - """Audio data is transmitted as raw binary WebSocket messages""" - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" diff --git a/src/deepgram/extensions/types/sockets/listen_v2_turn_info_event.py b/src/deepgram/extensions/types/sockets/listen_v2_turn_info_event.py deleted file mode 100644 index ab099dd9..00000000 --- a/src/deepgram/extensions/types/sockets/listen_v2_turn_info_event.py +++ /dev/null @@ -1,47 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from typing import List, Optional - -from ....core.pydantic_utilities import UniversalBaseModel - - -class ListenV2TurnInfoEventWordsItem(UniversalBaseModel): - word: str - confidence: float - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" - - -class ListenV2TurnInfoEvent(UniversalBaseModel): - type: str - request_id: str - sequence_id: int - event: str - turn_index: int - audio_window_start: float - audio_window_end: float - transcript: str - words: List[ListenV2TurnInfoEventWordsItem] - end_of_turn_confidence: float - - def json(self, **kwargs) -> str: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().json(**kwargs_with_defaults) - - def dict(self, **kwargs) -> dict: - kwargs_with_defaults = {"by_alias": True, "exclude_unset": True, **kwargs} - return super().dict(**kwargs_with_defaults) - - class Config: - frozen = True - extra = "forbid" diff --git a/src/deepgram/extensions/types/sockets/socket_client_responses.py b/src/deepgram/extensions/types/sockets/socket_client_responses.py deleted file mode 100644 index 7e8f1f48..00000000 --- a/src/deepgram/extensions/types/sockets/socket_client_responses.py +++ /dev/null @@ -1,121 +0,0 @@ -# Socket client response union types - protected from auto-generation - -import typing - -# Import all event types for union definitions -if typing.TYPE_CHECKING: - from .agent_v1_agent_audio_done_event import AgentV1AgentAudioDoneEvent - from .agent_v1_agent_started_speaking_event import AgentV1AgentStartedSpeakingEvent - from .agent_v1_agent_thinking_event import AgentV1AgentThinkingEvent - from .agent_v1_audio_chunk_event import AgentV1AudioChunkEvent - from .agent_v1_conversation_text_event import AgentV1ConversationTextEvent - from .agent_v1_error_event import AgentV1ErrorEvent - from .agent_v1_function_call_request_event import AgentV1FunctionCallRequestEvent - from .agent_v1_function_call_response_message import AgentV1FunctionCallResponseMessage - from .agent_v1_injection_refused_event import AgentV1InjectionRefusedEvent - from .agent_v1_prompt_updated_event import AgentV1PromptUpdatedEvent - from .agent_v1_settings_applied_event import AgentV1SettingsAppliedEvent - - # History messages may also be emitted by the server - from .agent_v1_settings_message import AgentV1HistoryFunctionCalls, AgentV1HistoryMessage - from .agent_v1_speak_updated_event import AgentV1SpeakUpdatedEvent - from .agent_v1_user_started_speaking_event import AgentV1UserStartedSpeakingEvent - from .agent_v1_warning_event import AgentV1WarningEvent - from .agent_v1_welcome_message import AgentV1WelcomeMessage - from .listen_v1_metadata_event import ListenV1MetadataEvent - from .listen_v1_results_event import ListenV1ResultsEvent - from .listen_v1_speech_started_event import ListenV1SpeechStartedEvent - from .listen_v1_utterance_end_event import ListenV1UtteranceEndEvent - from .listen_v2_connected_event import ListenV2ConnectedEvent - from .listen_v2_fatal_error_event import ListenV2FatalErrorEvent - from .listen_v2_turn_info_event import ListenV2TurnInfoEvent - from .speak_v1_audio_chunk_event import SpeakV1AudioChunkEvent - from .speak_v1_control_event import SpeakV1ControlEvent - from .speak_v1_metadata_event import SpeakV1MetadataEvent - from .speak_v1_warning_event import SpeakV1WarningEvent - -# Speak socket client can receive these message types (including binary audio) -# Import the actual types for proper resolution -from .speak_v1_audio_chunk_event import SpeakV1AudioChunkEvent -from .speak_v1_control_event import SpeakV1ControlEvent -from .speak_v1_metadata_event import SpeakV1MetadataEvent -from .speak_v1_warning_event import SpeakV1WarningEvent - -SpeakV1SocketClientResponse = typing.Union[ - SpeakV1AudioChunkEvent, # Binary audio data - SpeakV1MetadataEvent, # JSON metadata - SpeakV1ControlEvent, # JSON control responses (Flushed, Cleared) - SpeakV1WarningEvent, # JSON warnings - bytes, # Raw binary audio chunks -] - -# Listen socket client only receives JSON events -# Import the actual types for proper resolution -from .listen_v1_metadata_event import ListenV1MetadataEvent -from .listen_v1_results_event import ListenV1ResultsEvent -from .listen_v1_speech_started_event import ListenV1SpeechStartedEvent -from .listen_v1_utterance_end_event import ListenV1UtteranceEndEvent - -ListenV1SocketClientResponse = typing.Union[ - ListenV1ResultsEvent, - ListenV1MetadataEvent, - ListenV1UtteranceEndEvent, - ListenV1SpeechStartedEvent, -] - -# Listen V2 socket client receives JSON events -# Import the actual types for proper resolution -from .listen_v2_connected_event import ListenV2ConnectedEvent -from .listen_v2_fatal_error_event import ListenV2FatalErrorEvent -from .listen_v2_turn_info_event import ListenV2TurnInfoEvent - -ListenV2SocketClientResponse = typing.Union[ - ListenV2ConnectedEvent, - ListenV2TurnInfoEvent, - ListenV2FatalErrorEvent, -] - -# Agent socket client can receive both JSON events and binary audio -# Import the actual types for proper resolution -from .agent_v1_agent_audio_done_event import AgentV1AgentAudioDoneEvent -from .agent_v1_agent_started_speaking_event import AgentV1AgentStartedSpeakingEvent -from .agent_v1_agent_thinking_event import AgentV1AgentThinkingEvent -from .agent_v1_audio_chunk_event import AgentV1AudioChunkEvent -from .agent_v1_conversation_text_event import AgentV1ConversationTextEvent -from .agent_v1_error_event import AgentV1ErrorEvent -from .agent_v1_function_call_request_event import AgentV1FunctionCallRequestEvent -from .agent_v1_function_call_response_message import AgentV1FunctionCallResponseMessage -from .agent_v1_injection_refused_event import AgentV1InjectionRefusedEvent -from .agent_v1_prompt_updated_event import AgentV1PromptUpdatedEvent -from .agent_v1_settings_applied_event import AgentV1SettingsAppliedEvent -from .agent_v1_settings_message import AgentV1HistoryFunctionCalls, AgentV1HistoryMessage -from .agent_v1_speak_updated_event import AgentV1SpeakUpdatedEvent -from .agent_v1_user_started_speaking_event import AgentV1UserStartedSpeakingEvent -from .agent_v1_warning_event import AgentV1WarningEvent -from .agent_v1_welcome_message import AgentV1WelcomeMessage - -AgentV1SocketClientResponse = typing.Union[ - AgentV1WelcomeMessage, - AgentV1SettingsAppliedEvent, - AgentV1HistoryMessage, - AgentV1HistoryFunctionCalls, - AgentV1ConversationTextEvent, - AgentV1UserStartedSpeakingEvent, - AgentV1AgentThinkingEvent, - AgentV1FunctionCallRequestEvent, - AgentV1FunctionCallResponseMessage, # Bidirectional: Server β†’ Client function responses - AgentV1AgentStartedSpeakingEvent, - AgentV1AgentAudioDoneEvent, - AgentV1PromptUpdatedEvent, - AgentV1SpeakUpdatedEvent, - AgentV1InjectionRefusedEvent, - AgentV1ErrorEvent, - AgentV1WarningEvent, - AgentV1AudioChunkEvent, # Binary audio data - bytes, # Raw binary audio chunks -] - -# Backward compatibility aliases -SpeakSocketClientResponse = SpeakV1SocketClientResponse -ListenSocketClientResponse = ListenV1SocketClientResponse -AgentSocketClientResponse = AgentV1SocketClientResponse diff --git a/src/deepgram/extensions/types/sockets/speak_v1_audio_chunk_event.py b/src/deepgram/extensions/types/sockets/speak_v1_audio_chunk_event.py deleted file mode 100644 index 12f21cde..00000000 --- a/src/deepgram/extensions/types/sockets/speak_v1_audio_chunk_event.py +++ /dev/null @@ -1,9 +0,0 @@ -# Speak V1 Audio Chunk Event - protected from auto-generation - -# This represents binary audio data received from the WebSocket -# The actual data is bytes, but we define this as a type alias for clarity -SpeakV1AudioChunkEvent = bytes -""" -Audio data in the format specified by the request parameters. -Content-Type: application/octet-stream -""" diff --git a/src/deepgram/extensions/types/sockets/speak_v1_metadata_event.py b/src/deepgram/extensions/types/sockets/speak_v1_metadata_event.py deleted file mode 100644 index a8f16f41..00000000 --- a/src/deepgram/extensions/types/sockets/speak_v1_metadata_event.py +++ /dev/null @@ -1,35 +0,0 @@ -# Speak V1 Metadata Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class SpeakV1MetadataEvent(UniversalBaseModel): - """ - Metadata sent after the WebSocket handshake - """ - - type: typing.Literal["Metadata"] - """Message type identifier""" - - request_id: str - """Unique identifier for the request""" - - model_name: str - """Name of the model being used""" - - model_version: str - """Version of the model being used""" - - model_uuid: str - """Unique identifier for the model""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/deepgram/extensions/types/sockets/speak_v1_warning_event.py b/src/deepgram/extensions/types/sockets/speak_v1_warning_event.py deleted file mode 100644 index e5072763..00000000 --- a/src/deepgram/extensions/types/sockets/speak_v1_warning_event.py +++ /dev/null @@ -1,29 +0,0 @@ -# Speak V1 Warning Event - protected from auto-generation - -import typing - -import pydantic -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel - - -class SpeakV1WarningEvent(UniversalBaseModel): - """ - Warning event from the TTS WebSocket - """ - - type: typing.Literal["Warning"] - """Message type identifier""" - - description: str - """A description of what went wrong""" - - code: str - """Error code identifying the type of error""" - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/__init__.py b/src/deepgram/listen/__init__.py index 6186f5b4..0e163447 100644 --- a/src/deepgram/listen/__init__.py +++ b/src/deepgram/listen/__init__.py @@ -7,7 +7,92 @@ if typing.TYPE_CHECKING: from . import v1, v2 -_dynamic_imports: typing.Dict[str, str] = {"v1": ".v1", "v2": ".v2"} + from .v1 import ( + ListenV1CloseStream, + ListenV1CloseStreamParams, + ListenV1CloseStreamType, + ListenV1Finalize, + ListenV1FinalizeParams, + ListenV1FinalizeType, + ListenV1KeepAlive, + ListenV1KeepAliveParams, + ListenV1KeepAliveType, + ListenV1Metadata, + ListenV1MetadataParams, + ListenV1Results, + ListenV1ResultsChannel, + ListenV1ResultsChannelAlternativesItem, + ListenV1ResultsChannelAlternativesItemParams, + ListenV1ResultsChannelAlternativesItemWordsItem, + ListenV1ResultsChannelAlternativesItemWordsItemParams, + ListenV1ResultsChannelParams, + ListenV1ResultsMetadata, + ListenV1ResultsMetadataModelInfo, + ListenV1ResultsMetadataModelInfoParams, + ListenV1ResultsMetadataParams, + ListenV1ResultsParams, + ListenV1SpeechStarted, + ListenV1SpeechStartedParams, + ListenV1UtteranceEnd, + ListenV1UtteranceEndParams, + ) + from .v2 import ( + ListenV2CloseStream, + ListenV2CloseStreamParams, + ListenV2CloseStreamType, + ListenV2Connected, + ListenV2ConnectedParams, + ListenV2FatalError, + ListenV2FatalErrorParams, + ListenV2TurnInfo, + ListenV2TurnInfoEvent, + ListenV2TurnInfoParams, + ListenV2TurnInfoWordsItem, + ListenV2TurnInfoWordsItemParams, + ) +_dynamic_imports: typing.Dict[str, str] = { + "ListenV1CloseStream": ".v1", + "ListenV1CloseStreamParams": ".v1", + "ListenV1CloseStreamType": ".v1", + "ListenV1Finalize": ".v1", + "ListenV1FinalizeParams": ".v1", + "ListenV1FinalizeType": ".v1", + "ListenV1KeepAlive": ".v1", + "ListenV1KeepAliveParams": ".v1", + "ListenV1KeepAliveType": ".v1", + "ListenV1Metadata": ".v1", + "ListenV1MetadataParams": ".v1", + "ListenV1Results": ".v1", + "ListenV1ResultsChannel": ".v1", + "ListenV1ResultsChannelAlternativesItem": ".v1", + "ListenV1ResultsChannelAlternativesItemParams": ".v1", + "ListenV1ResultsChannelAlternativesItemWordsItem": ".v1", + "ListenV1ResultsChannelAlternativesItemWordsItemParams": ".v1", + "ListenV1ResultsChannelParams": ".v1", + "ListenV1ResultsMetadata": ".v1", + "ListenV1ResultsMetadataModelInfo": ".v1", + "ListenV1ResultsMetadataModelInfoParams": ".v1", + "ListenV1ResultsMetadataParams": ".v1", + "ListenV1ResultsParams": ".v1", + "ListenV1SpeechStarted": ".v1", + "ListenV1SpeechStartedParams": ".v1", + "ListenV1UtteranceEnd": ".v1", + "ListenV1UtteranceEndParams": ".v1", + "ListenV2CloseStream": ".v2", + "ListenV2CloseStreamParams": ".v2", + "ListenV2CloseStreamType": ".v2", + "ListenV2Connected": ".v2", + "ListenV2ConnectedParams": ".v2", + "ListenV2FatalError": ".v2", + "ListenV2FatalErrorParams": ".v2", + "ListenV2TurnInfo": ".v2", + "ListenV2TurnInfoEvent": ".v2", + "ListenV2TurnInfoParams": ".v2", + "ListenV2TurnInfoWordsItem": ".v2", + "ListenV2TurnInfoWordsItemParams": ".v2", + "v1": ".v1", + "v2": ".v2", +} def __getattr__(attr_name: str) -> typing.Any: @@ -31,4 +116,46 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["v1", "v2"] +__all__ = [ + "ListenV1CloseStream", + "ListenV1CloseStreamParams", + "ListenV1CloseStreamType", + "ListenV1Finalize", + "ListenV1FinalizeParams", + "ListenV1FinalizeType", + "ListenV1KeepAlive", + "ListenV1KeepAliveParams", + "ListenV1KeepAliveType", + "ListenV1Metadata", + "ListenV1MetadataParams", + "ListenV1Results", + "ListenV1ResultsChannel", + "ListenV1ResultsChannelAlternativesItem", + "ListenV1ResultsChannelAlternativesItemParams", + "ListenV1ResultsChannelAlternativesItemWordsItem", + "ListenV1ResultsChannelAlternativesItemWordsItemParams", + "ListenV1ResultsChannelParams", + "ListenV1ResultsMetadata", + "ListenV1ResultsMetadataModelInfo", + "ListenV1ResultsMetadataModelInfoParams", + "ListenV1ResultsMetadataParams", + "ListenV1ResultsParams", + "ListenV1SpeechStarted", + "ListenV1SpeechStartedParams", + "ListenV1UtteranceEnd", + "ListenV1UtteranceEndParams", + "ListenV2CloseStream", + "ListenV2CloseStreamParams", + "ListenV2CloseStreamType", + "ListenV2Connected", + "ListenV2ConnectedParams", + "ListenV2FatalError", + "ListenV2FatalErrorParams", + "ListenV2TurnInfo", + "ListenV2TurnInfoEvent", + "ListenV2TurnInfoParams", + "ListenV2TurnInfoWordsItem", + "ListenV2TurnInfoWordsItemParams", + "v1", + "v2", +] diff --git a/src/deepgram/listen/client.py b/src/deepgram/listen/client.py index 8475d7f0..8a81d4ea 100644 --- a/src/deepgram/listen/client.py +++ b/src/deepgram/listen/client.py @@ -9,14 +9,13 @@ if typing.TYPE_CHECKING: from .v1.client import AsyncV1Client, V1Client - from .v2.client import AsyncV2Client, V2Client + class ListenClient: def __init__(self, *, client_wrapper: SyncClientWrapper): self._raw_client = RawListenClient(client_wrapper=client_wrapper) self._client_wrapper = client_wrapper self._v1: typing.Optional[V1Client] = None - self._v2: typing.Optional[V2Client] = None @property def with_raw_response(self) -> RawListenClient: @@ -37,22 +36,12 @@ def v1(self): self._v1 = V1Client(client_wrapper=self._client_wrapper) return self._v1 - # TODO: Manual workaround due to fern generator bug - @property - def v2(self): - if self._v2 is None: - from .v2.client import V2Client # noqa: E402 - - self._v2 = V2Client(client_wrapper=self._client_wrapper) - return self._v2 - class AsyncListenClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): self._raw_client = AsyncRawListenClient(client_wrapper=client_wrapper) self._client_wrapper = client_wrapper self._v1: typing.Optional[AsyncV1Client] = None - self._v2: typing.Optional[AsyncV2Client] = None @property def with_raw_response(self) -> AsyncRawListenClient: @@ -72,12 +61,3 @@ def v1(self): self._v1 = AsyncV1Client(client_wrapper=self._client_wrapper) return self._v1 - - # TODO: Manual workaround due to fern generator bug - @property - def v2(self): - if self._v2 is None: - from .v2.client import AsyncV2Client # noqa: E402 - - self._v2 = AsyncV2Client(client_wrapper=self._client_wrapper) - return self._v2 diff --git a/src/deepgram/listen/v1/__init__.py b/src/deepgram/listen/v1/__init__.py index a3dcf43f..f19d2fd1 100644 --- a/src/deepgram/listen/v1/__init__.py +++ b/src/deepgram/listen/v1/__init__.py @@ -6,6 +6,23 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .types import ( + ListenV1CloseStream, + ListenV1CloseStreamType, + ListenV1Finalize, + ListenV1FinalizeType, + ListenV1KeepAlive, + ListenV1KeepAliveType, + ListenV1Metadata, + ListenV1Results, + ListenV1ResultsChannel, + ListenV1ResultsChannelAlternativesItem, + ListenV1ResultsChannelAlternativesItemWordsItem, + ListenV1ResultsMetadata, + ListenV1ResultsMetadataModelInfo, + ListenV1SpeechStarted, + ListenV1UtteranceEnd, + ) from . import media from .media import ( MediaTranscribeRequestCallbackMethod, @@ -18,7 +35,48 @@ MediaTranscribeResponse, MediaTranscribeResponseParams, ) + from .requests import ( + ListenV1CloseStreamParams, + ListenV1FinalizeParams, + ListenV1KeepAliveParams, + ListenV1MetadataParams, + ListenV1ResultsChannelAlternativesItemParams, + ListenV1ResultsChannelAlternativesItemWordsItemParams, + ListenV1ResultsChannelParams, + ListenV1ResultsMetadataModelInfoParams, + ListenV1ResultsMetadataParams, + ListenV1ResultsParams, + ListenV1SpeechStartedParams, + ListenV1UtteranceEndParams, + ) _dynamic_imports: typing.Dict[str, str] = { + "ListenV1CloseStream": ".types", + "ListenV1CloseStreamParams": ".requests", + "ListenV1CloseStreamType": ".types", + "ListenV1Finalize": ".types", + "ListenV1FinalizeParams": ".requests", + "ListenV1FinalizeType": ".types", + "ListenV1KeepAlive": ".types", + "ListenV1KeepAliveParams": ".requests", + "ListenV1KeepAliveType": ".types", + "ListenV1Metadata": ".types", + "ListenV1MetadataParams": ".requests", + "ListenV1Results": ".types", + "ListenV1ResultsChannel": ".types", + "ListenV1ResultsChannelAlternativesItem": ".types", + "ListenV1ResultsChannelAlternativesItemParams": ".requests", + "ListenV1ResultsChannelAlternativesItemWordsItem": ".types", + "ListenV1ResultsChannelAlternativesItemWordsItemParams": ".requests", + "ListenV1ResultsChannelParams": ".requests", + "ListenV1ResultsMetadata": ".types", + "ListenV1ResultsMetadataModelInfo": ".types", + "ListenV1ResultsMetadataModelInfoParams": ".requests", + "ListenV1ResultsMetadataParams": ".requests", + "ListenV1ResultsParams": ".requests", + "ListenV1SpeechStarted": ".types", + "ListenV1SpeechStartedParams": ".requests", + "ListenV1UtteranceEnd": ".types", + "ListenV1UtteranceEndParams": ".requests", "MediaTranscribeRequestCallbackMethod": ".media", "MediaTranscribeRequestCustomIntentMode": ".media", "MediaTranscribeRequestCustomTopicMode": ".media", @@ -54,6 +112,33 @@ def __dir__(): __all__ = [ + "ListenV1CloseStream", + "ListenV1CloseStreamParams", + "ListenV1CloseStreamType", + "ListenV1Finalize", + "ListenV1FinalizeParams", + "ListenV1FinalizeType", + "ListenV1KeepAlive", + "ListenV1KeepAliveParams", + "ListenV1KeepAliveType", + "ListenV1Metadata", + "ListenV1MetadataParams", + "ListenV1Results", + "ListenV1ResultsChannel", + "ListenV1ResultsChannelAlternativesItem", + "ListenV1ResultsChannelAlternativesItemParams", + "ListenV1ResultsChannelAlternativesItemWordsItem", + "ListenV1ResultsChannelAlternativesItemWordsItemParams", + "ListenV1ResultsChannelParams", + "ListenV1ResultsMetadata", + "ListenV1ResultsMetadataModelInfo", + "ListenV1ResultsMetadataModelInfoParams", + "ListenV1ResultsMetadataParams", + "ListenV1ResultsParams", + "ListenV1SpeechStarted", + "ListenV1SpeechStartedParams", + "ListenV1UtteranceEnd", + "ListenV1UtteranceEndParams", "MediaTranscribeRequestCallbackMethod", "MediaTranscribeRequestCustomIntentMode", "MediaTranscribeRequestCustomTopicMode", diff --git a/src/deepgram/listen/v1/media/client.py b/src/deepgram/listen/v1/media/client.py index 047dfac4..ab81ae3b 100644 --- a/src/deepgram/listen/v1/media/client.py +++ b/src/deepgram/listen/v1/media/client.py @@ -206,6 +206,41 @@ def transcribe_url( api_key="YOUR_API_KEY", ) client.listen.v1.media.transcribe_url( + callback="callback", + callback_method="POST", + extra="extra", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding="linear16", + filler_words=True, + keywords="keywords", + language="language", + measurements=True, + model="nova-3", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact="redact", + replace="replace", + search="search", + smart_format=True, + utterances=True, + utt_split=1.1, + version="latest", + mip_opt_out=True, url="https://dpgr.am/spacewalk.wav", ) """ @@ -661,6 +696,41 @@ async def transcribe_url( async def main() -> None: await client.listen.v1.media.transcribe_url( + callback="callback", + callback_method="POST", + extra="extra", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding="linear16", + filler_words=True, + keywords="keywords", + language="language", + measurements=True, + model="nova-3", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact="redact", + replace="replace", + search="search", + smart_format=True, + utterances=True, + utt_split=1.1, + version="latest", + mip_opt_out=True, url="https://dpgr.am/spacewalk.wav", ) diff --git a/src/deepgram/listen/v1/requests/__init__.py b/src/deepgram/listen/v1/requests/__init__.py new file mode 100644 index 00000000..519d1bb8 --- /dev/null +++ b/src/deepgram/listen/v1/requests/__init__.py @@ -0,0 +1,73 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .listen_v1close_stream import ListenV1CloseStreamParams + from .listen_v1finalize import ListenV1FinalizeParams + from .listen_v1keep_alive import ListenV1KeepAliveParams + from .listen_v1metadata import ListenV1MetadataParams + from .listen_v1results import ListenV1ResultsParams + from .listen_v1results_channel import ListenV1ResultsChannelParams + from .listen_v1results_channel_alternatives_item import ListenV1ResultsChannelAlternativesItemParams + from .listen_v1results_channel_alternatives_item_words_item import ( + ListenV1ResultsChannelAlternativesItemWordsItemParams, + ) + from .listen_v1results_metadata import ListenV1ResultsMetadataParams + from .listen_v1results_metadata_model_info import ListenV1ResultsMetadataModelInfoParams + from .listen_v1speech_started import ListenV1SpeechStartedParams + from .listen_v1utterance_end import ListenV1UtteranceEndParams +_dynamic_imports: typing.Dict[str, str] = { + "ListenV1CloseStreamParams": ".listen_v1close_stream", + "ListenV1FinalizeParams": ".listen_v1finalize", + "ListenV1KeepAliveParams": ".listen_v1keep_alive", + "ListenV1MetadataParams": ".listen_v1metadata", + "ListenV1ResultsChannelAlternativesItemParams": ".listen_v1results_channel_alternatives_item", + "ListenV1ResultsChannelAlternativesItemWordsItemParams": ".listen_v1results_channel_alternatives_item_words_item", + "ListenV1ResultsChannelParams": ".listen_v1results_channel", + "ListenV1ResultsMetadataModelInfoParams": ".listen_v1results_metadata_model_info", + "ListenV1ResultsMetadataParams": ".listen_v1results_metadata", + "ListenV1ResultsParams": ".listen_v1results", + "ListenV1SpeechStartedParams": ".listen_v1speech_started", + "ListenV1UtteranceEndParams": ".listen_v1utterance_end", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "ListenV1CloseStreamParams", + "ListenV1FinalizeParams", + "ListenV1KeepAliveParams", + "ListenV1MetadataParams", + "ListenV1ResultsChannelAlternativesItemParams", + "ListenV1ResultsChannelAlternativesItemWordsItemParams", + "ListenV1ResultsChannelParams", + "ListenV1ResultsMetadataModelInfoParams", + "ListenV1ResultsMetadataParams", + "ListenV1ResultsParams", + "ListenV1SpeechStartedParams", + "ListenV1UtteranceEndParams", +] diff --git a/src/deepgram/listen/v1/requests/listen_v1close_stream.py b/src/deepgram/listen/v1/requests/listen_v1close_stream.py new file mode 100644 index 00000000..c75ad0e1 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1close_stream.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.listen_v1close_stream_type import ListenV1CloseStreamType + + +class ListenV1CloseStreamParams(typing_extensions.TypedDict): + type: ListenV1CloseStreamType + """ + Message type identifier + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1finalize.py b/src/deepgram/listen/v1/requests/listen_v1finalize.py new file mode 100644 index 00000000..8dd6d16e --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1finalize.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.listen_v1finalize_type import ListenV1FinalizeType + + +class ListenV1FinalizeParams(typing_extensions.TypedDict): + type: ListenV1FinalizeType + """ + Message type identifier + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1keep_alive.py b/src/deepgram/listen/v1/requests/listen_v1keep_alive.py new file mode 100644 index 00000000..b40242bd --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1keep_alive.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.listen_v1keep_alive_type import ListenV1KeepAliveType + + +class ListenV1KeepAliveParams(typing_extensions.TypedDict): + type: ListenV1KeepAliveType + """ + Message type identifier + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1metadata.py b/src/deepgram/listen/v1/requests/listen_v1metadata.py new file mode 100644 index 00000000..2b648b48 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1metadata.py @@ -0,0 +1,42 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class ListenV1MetadataParams(typing_extensions.TypedDict): + type: typing.Literal["Metadata"] + """ + Message type identifier + """ + + transaction_key: str + """ + The transaction key + """ + + request_id: str + """ + The request ID + """ + + sha256: str + """ + The sha256 + """ + + created: str + """ + The created + """ + + duration: float + """ + The duration + """ + + channels: float + """ + The channels + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1results.py b/src/deepgram/listen/v1/requests/listen_v1results.py new file mode 100644 index 00000000..ad57f7c5 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results.py @@ -0,0 +1,46 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .listen_v1results_channel import ListenV1ResultsChannelParams +from .listen_v1results_metadata import ListenV1ResultsMetadataParams + + +class ListenV1ResultsParams(typing_extensions.TypedDict): + type: typing.Literal["Results"] + """ + Message type identifier + """ + + channel_index: typing.Sequence[float] + """ + The index of the channel + """ + + duration: float + """ + The duration of the transcription + """ + + start: float + """ + The start time of the transcription + """ + + is_final: typing_extensions.NotRequired[bool] + """ + Whether the transcription is final + """ + + speech_final: typing_extensions.NotRequired[bool] + """ + Whether the transcription is speech final + """ + + channel: ListenV1ResultsChannelParams + metadata: ListenV1ResultsMetadataParams + from_finalize: typing_extensions.NotRequired[bool] + """ + Whether the transcription is from a finalize message + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1results_channel.py b/src/deepgram/listen/v1/requests/listen_v1results_channel.py new file mode 100644 index 00000000..f27e364d --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results_channel.py @@ -0,0 +1,10 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .listen_v1results_channel_alternatives_item import ListenV1ResultsChannelAlternativesItemParams + + +class ListenV1ResultsChannelParams(typing_extensions.TypedDict): + alternatives: typing.Sequence[ListenV1ResultsChannelAlternativesItemParams] diff --git a/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item.py b/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item.py new file mode 100644 index 00000000..5e52e389 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from .listen_v1results_channel_alternatives_item_words_item import ListenV1ResultsChannelAlternativesItemWordsItemParams + + +class ListenV1ResultsChannelAlternativesItemParams(typing_extensions.TypedDict): + transcript: str + """ + The transcript of the transcription + """ + + confidence: float + """ + The confidence of the transcription + """ + + languages: typing.Sequence[str] + words: typing.Sequence[ListenV1ResultsChannelAlternativesItemWordsItemParams] diff --git a/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item_words_item.py b/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item_words_item.py new file mode 100644 index 00000000..6252f31b --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results_channel_alternatives_item_words_item.py @@ -0,0 +1,40 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class ListenV1ResultsChannelAlternativesItemWordsItemParams(typing_extensions.TypedDict): + word: str + """ + The word of the transcription + """ + + start: float + """ + The start time of the word + """ + + end: float + """ + The end time of the word + """ + + confidence: float + """ + The confidence of the word + """ + + language: str + """ + The language of the word + """ + + punctuated_word: str + """ + The punctuated word of the word + """ + + speaker: typing_extensions.NotRequired[float] + """ + The speaker of the word + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1results_metadata.py b/src/deepgram/listen/v1/requests/listen_v1results_metadata.py new file mode 100644 index 00000000..fb5037c8 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results_metadata.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from .listen_v1results_metadata_model_info import ListenV1ResultsMetadataModelInfoParams + + +class ListenV1ResultsMetadataParams(typing_extensions.TypedDict): + request_id: str + """ + The request ID + """ + + model_info: ListenV1ResultsMetadataModelInfoParams + model_uuid: str + """ + The model UUID + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1results_metadata_model_info.py b/src/deepgram/listen/v1/requests/listen_v1results_metadata_model_info.py new file mode 100644 index 00000000..f953fdce --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1results_metadata_model_info.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class ListenV1ResultsMetadataModelInfoParams(typing_extensions.TypedDict): + name: str + """ + The name of the model + """ + + version: str + """ + The version of the model + """ + + arch: str + """ + The arch of the model + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1speech_started.py b/src/deepgram/listen/v1/requests/listen_v1speech_started.py new file mode 100644 index 00000000..1cc1dcfa --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1speech_started.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class ListenV1SpeechStartedParams(typing_extensions.TypedDict): + type: typing.Literal["SpeechStarted"] + """ + Message type identifier + """ + + channel: typing.Sequence[float] + """ + The channel + """ + + timestamp: float + """ + The timestamp + """ diff --git a/src/deepgram/listen/v1/requests/listen_v1utterance_end.py b/src/deepgram/listen/v1/requests/listen_v1utterance_end.py new file mode 100644 index 00000000..37ae57b8 --- /dev/null +++ b/src/deepgram/listen/v1/requests/listen_v1utterance_end.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class ListenV1UtteranceEndParams(typing_extensions.TypedDict): + type: typing.Literal["UtteranceEnd"] + """ + Message type identifier + """ + + channel: typing.Sequence[float] + """ + The channel + """ + + last_word_end: float + """ + The last word end + """ diff --git a/src/deepgram/listen/v1/socket_client.py b/src/deepgram/listen/v1/socket_client.py index 10ea9759..f34f6511 100644 --- a/src/deepgram/listen/v1/socket_client.py +++ b/src/deepgram/listen/v1/socket_client.py @@ -1,5 +1,4 @@ # This file was auto-generated by Fern from our API Definition. -# Enhanced with binary message support, comprehensive socket types, and send methods. import json import typing @@ -9,29 +8,20 @@ import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.pydantic_utilities import parse_obj_as +from .types.listen_v1close_stream import ListenV1CloseStream +from .types.listen_v1finalize import ListenV1Finalize +from .types.listen_v1keep_alive import ListenV1KeepAlive +from .types.listen_v1metadata import ListenV1Metadata +from .types.listen_v1results import ListenV1Results +from .types.listen_v1speech_started import ListenV1SpeechStarted +from .types.listen_v1utterance_end import ListenV1UtteranceEnd try: from websockets.legacy.client import WebSocketClientProtocol # type: ignore except ImportError: from websockets import WebSocketClientProtocol # type: ignore -# Socket message types -from ...extensions.types.sockets import ( - ListenV1ControlMessage, - ListenV1MediaMessage, - ListenV1MetadataEvent, - ListenV1ResultsEvent, - ListenV1SpeechStartedEvent, - ListenV1UtteranceEndEvent, -) - -# Response union type (Listen only receives JSON events) -V1SocketClientResponse = typing.Union[ - ListenV1ResultsEvent, - ListenV1MetadataEvent, - ListenV1UtteranceEndEvent, - ListenV1SpeechStartedEvent, -] +V1SocketClientResponse = typing.Union[ListenV1Results, ListenV1Metadata, ListenV1UtteranceEnd, ListenV1SpeechStarted] class AsyncV1SocketClient(EventEmitterMixin): @@ -39,37 +29,13 @@ def __init__(self, *, websocket: WebSocketClientProtocol): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - async def __aiter__(self): async for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore async def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established @@ -80,48 +46,63 @@ async def start_listening(self): await self._emit_async(EventType.OPEN, None) try: async for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore await self._emit_async(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - await self._emit_async(EventType.ERROR, exc) + await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) + async def send_listen_v_1_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ + await self._send_model(message) + + async def send_listen_v_1_finalize(self, message: ListenV1Finalize) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1Finalize. + """ + await self._send_model(message) + + async def send_listen_v_1_close_stream(self, message: ListenV1CloseStream) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1CloseStream. + """ + await self._send_model(message) + + async def send_listen_v_1_keep_alive(self, message: ListenV1KeepAlive) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1KeepAlive. + """ + await self._send_model(message) + async def recv(self) -> V1SocketClientResponse: """ Receive a message from the websocket connection. """ data = await self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore async def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - await self._websocket.send(data) - elif isinstance(data, dict): - await self._websocket.send(json.dumps(data)) - else: - await self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) async def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - await self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - async def send_control(self, message: ListenV1ControlMessage) -> None: - """Send a control message (keep_alive, finalize, etc.).""" - await self._send_model(message) - - async def send_media(self, message: ListenV1MediaMessage) -> None: - """Send binary audio data for transcription.""" - await self._send(message) + await self._send(data.dict()) class V1SocketClient(EventEmitterMixin): @@ -129,37 +110,13 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - def __iter__(self): for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established @@ -170,45 +127,60 @@ def start_listening(self): self._emit(EventType.OPEN, None) try: for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore self._emit(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - self._emit(EventType.ERROR, exc) + self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) + def send_listen_v_1_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ + self._send_model(message) + + def send_listen_v_1_finalize(self, message: ListenV1Finalize) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1Finalize. + """ + self._send_model(message) + + def send_listen_v_1_close_stream(self, message: ListenV1CloseStream) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1CloseStream. + """ + self._send_model(message) + + def send_listen_v_1_keep_alive(self, message: ListenV1KeepAlive) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1KeepAlive. + """ + self._send_model(message) + def recv(self) -> V1SocketClientResponse: """ Receive a message from the websocket connection. """ data = self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - self._websocket.send(data) - elif isinstance(data, dict): - self._websocket.send(json.dumps(data)) - else: - self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - def send_control(self, message: ListenV1ControlMessage) -> None: - """Send a control message (keep_alive, finalize, etc.).""" - self._send_model(message) - - def send_media(self, message: ListenV1MediaMessage) -> None: - """Send binary audio data for transcription.""" - self._send(message) + self._send(data.dict()) diff --git a/src/deepgram/listen/v1/types/__init__.py b/src/deepgram/listen/v1/types/__init__.py new file mode 100644 index 00000000..2168d44b --- /dev/null +++ b/src/deepgram/listen/v1/types/__init__.py @@ -0,0 +1,80 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .listen_v1close_stream import ListenV1CloseStream + from .listen_v1close_stream_type import ListenV1CloseStreamType + from .listen_v1finalize import ListenV1Finalize + from .listen_v1finalize_type import ListenV1FinalizeType + from .listen_v1keep_alive import ListenV1KeepAlive + from .listen_v1keep_alive_type import ListenV1KeepAliveType + from .listen_v1metadata import ListenV1Metadata + from .listen_v1results import ListenV1Results + from .listen_v1results_channel import ListenV1ResultsChannel + from .listen_v1results_channel_alternatives_item import ListenV1ResultsChannelAlternativesItem + from .listen_v1results_channel_alternatives_item_words_item import ListenV1ResultsChannelAlternativesItemWordsItem + from .listen_v1results_metadata import ListenV1ResultsMetadata + from .listen_v1results_metadata_model_info import ListenV1ResultsMetadataModelInfo + from .listen_v1speech_started import ListenV1SpeechStarted + from .listen_v1utterance_end import ListenV1UtteranceEnd +_dynamic_imports: typing.Dict[str, str] = { + "ListenV1CloseStream": ".listen_v1close_stream", + "ListenV1CloseStreamType": ".listen_v1close_stream_type", + "ListenV1Finalize": ".listen_v1finalize", + "ListenV1FinalizeType": ".listen_v1finalize_type", + "ListenV1KeepAlive": ".listen_v1keep_alive", + "ListenV1KeepAliveType": ".listen_v1keep_alive_type", + "ListenV1Metadata": ".listen_v1metadata", + "ListenV1Results": ".listen_v1results", + "ListenV1ResultsChannel": ".listen_v1results_channel", + "ListenV1ResultsChannelAlternativesItem": ".listen_v1results_channel_alternatives_item", + "ListenV1ResultsChannelAlternativesItemWordsItem": ".listen_v1results_channel_alternatives_item_words_item", + "ListenV1ResultsMetadata": ".listen_v1results_metadata", + "ListenV1ResultsMetadataModelInfo": ".listen_v1results_metadata_model_info", + "ListenV1SpeechStarted": ".listen_v1speech_started", + "ListenV1UtteranceEnd": ".listen_v1utterance_end", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "ListenV1CloseStream", + "ListenV1CloseStreamType", + "ListenV1Finalize", + "ListenV1FinalizeType", + "ListenV1KeepAlive", + "ListenV1KeepAliveType", + "ListenV1Metadata", + "ListenV1Results", + "ListenV1ResultsChannel", + "ListenV1ResultsChannelAlternativesItem", + "ListenV1ResultsChannelAlternativesItemWordsItem", + "ListenV1ResultsMetadata", + "ListenV1ResultsMetadataModelInfo", + "ListenV1SpeechStarted", + "ListenV1UtteranceEnd", +] diff --git a/src/deepgram/listen/v1/types/listen_v1close_stream.py b/src/deepgram/listen/v1/types/listen_v1close_stream.py new file mode 100644 index 00000000..6c11646f --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1close_stream.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1close_stream_type import ListenV1CloseStreamType + + +class ListenV1CloseStream(UniversalBaseModel): + type: ListenV1CloseStreamType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1close_stream_type.py b/src/deepgram/listen/v1/types/listen_v1close_stream_type.py new file mode 100644 index 00000000..e5332dfd --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1close_stream_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV1CloseStreamType = typing.Union[typing.Literal["Finalize", "CloseStream", "KeepAlive"], typing.Any] diff --git a/src/deepgram/listen/v1/types/listen_v1finalize.py b/src/deepgram/listen/v1/types/listen_v1finalize.py new file mode 100644 index 00000000..ffd48baa --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1finalize.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1finalize_type import ListenV1FinalizeType + + +class ListenV1Finalize(UniversalBaseModel): + type: ListenV1FinalizeType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1finalize_type.py b/src/deepgram/listen/v1/types/listen_v1finalize_type.py new file mode 100644 index 00000000..c8e1de82 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1finalize_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV1FinalizeType = typing.Union[typing.Literal["Finalize", "CloseStream", "KeepAlive"], typing.Any] diff --git a/src/deepgram/listen/v1/types/listen_v1keep_alive.py b/src/deepgram/listen/v1/types/listen_v1keep_alive.py new file mode 100644 index 00000000..96d3e67a --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1keep_alive.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1keep_alive_type import ListenV1KeepAliveType + + +class ListenV1KeepAlive(UniversalBaseModel): + type: ListenV1KeepAliveType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1keep_alive_type.py b/src/deepgram/listen/v1/types/listen_v1keep_alive_type.py new file mode 100644 index 00000000..36b22ae4 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1keep_alive_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV1KeepAliveType = typing.Union[typing.Literal["Finalize", "CloseStream", "KeepAlive"], typing.Any] diff --git a/src/deepgram/listen/v1/types/listen_v1metadata.py b/src/deepgram/listen/v1/types/listen_v1metadata.py new file mode 100644 index 00000000..d86a5253 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1metadata.py @@ -0,0 +1,52 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV1Metadata(UniversalBaseModel): + type: typing.Literal["Metadata"] = pydantic.Field(default="Metadata") + """ + Message type identifier + """ + + transaction_key: str = pydantic.Field() + """ + The transaction key + """ + + request_id: str = pydantic.Field() + """ + The request ID + """ + + sha256: str = pydantic.Field() + """ + The sha256 + """ + + created: str = pydantic.Field() + """ + The created + """ + + duration: float = pydantic.Field() + """ + The duration + """ + + channels: float = pydantic.Field() + """ + The channels + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results.py b/src/deepgram/listen/v1/types/listen_v1results.py new file mode 100644 index 00000000..d86fb5c0 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results.py @@ -0,0 +1,56 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1results_channel import ListenV1ResultsChannel +from .listen_v1results_metadata import ListenV1ResultsMetadata + + +class ListenV1Results(UniversalBaseModel): + type: typing.Literal["Results"] = pydantic.Field(default="Results") + """ + Message type identifier + """ + + channel_index: typing.List[float] = pydantic.Field() + """ + The index of the channel + """ + + duration: float = pydantic.Field() + """ + The duration of the transcription + """ + + start: float = pydantic.Field() + """ + The start time of the transcription + """ + + is_final: typing.Optional[bool] = pydantic.Field(default=None) + """ + Whether the transcription is final + """ + + speech_final: typing.Optional[bool] = pydantic.Field(default=None) + """ + Whether the transcription is speech final + """ + + channel: ListenV1ResultsChannel + metadata: ListenV1ResultsMetadata + from_finalize: typing.Optional[bool] = pydantic.Field(default=None) + """ + Whether the transcription is from a finalize message + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results_channel.py b/src/deepgram/listen/v1/types/listen_v1results_channel.py new file mode 100644 index 00000000..ce58c5f3 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results_channel.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1results_channel_alternatives_item import ListenV1ResultsChannelAlternativesItem + + +class ListenV1ResultsChannel(UniversalBaseModel): + alternatives: typing.List[ListenV1ResultsChannelAlternativesItem] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item.py b/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item.py new file mode 100644 index 00000000..d4be6fa0 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1results_channel_alternatives_item_words_item import ListenV1ResultsChannelAlternativesItemWordsItem + + +class ListenV1ResultsChannelAlternativesItem(UniversalBaseModel): + transcript: str = pydantic.Field() + """ + The transcript of the transcription + """ + + confidence: float = pydantic.Field() + """ + The confidence of the transcription + """ + + languages: typing.List[str] + words: typing.List[ListenV1ResultsChannelAlternativesItemWordsItem] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item_words_item.py b/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item_words_item.py new file mode 100644 index 00000000..0a490289 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results_channel_alternatives_item_words_item.py @@ -0,0 +1,52 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV1ResultsChannelAlternativesItemWordsItem(UniversalBaseModel): + word: str = pydantic.Field() + """ + The word of the transcription + """ + + start: float = pydantic.Field() + """ + The start time of the word + """ + + end: float = pydantic.Field() + """ + The end time of the word + """ + + confidence: float = pydantic.Field() + """ + The confidence of the word + """ + + language: str = pydantic.Field() + """ + The language of the word + """ + + punctuated_word: str = pydantic.Field() + """ + The punctuated word of the word + """ + + speaker: typing.Optional[float] = pydantic.Field(default=None) + """ + The speaker of the word + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results_metadata.py b/src/deepgram/listen/v1/types/listen_v1results_metadata.py new file mode 100644 index 00000000..92518626 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results_metadata.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v1results_metadata_model_info import ListenV1ResultsMetadataModelInfo + + +class ListenV1ResultsMetadata(UniversalBaseModel): + request_id: str = pydantic.Field() + """ + The request ID + """ + + model_info: ListenV1ResultsMetadataModelInfo + model_uuid: str = pydantic.Field() + """ + The model UUID + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1results_metadata_model_info.py b/src/deepgram/listen/v1/types/listen_v1results_metadata_model_info.py new file mode 100644 index 00000000..19e04fa8 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1results_metadata_model_info.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV1ResultsMetadataModelInfo(UniversalBaseModel): + name: str = pydantic.Field() + """ + The name of the model + """ + + version: str = pydantic.Field() + """ + The version of the model + """ + + arch: str = pydantic.Field() + """ + The arch of the model + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1speech_started.py b/src/deepgram/listen/v1/types/listen_v1speech_started.py new file mode 100644 index 00000000..ce42f749 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1speech_started.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV1SpeechStarted(UniversalBaseModel): + type: typing.Literal["SpeechStarted"] = pydantic.Field(default="SpeechStarted") + """ + Message type identifier + """ + + channel: typing.List[float] = pydantic.Field() + """ + The channel + """ + + timestamp: float = pydantic.Field() + """ + The timestamp + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v1/types/listen_v1utterance_end.py b/src/deepgram/listen/v1/types/listen_v1utterance_end.py new file mode 100644 index 00000000..39cb1100 --- /dev/null +++ b/src/deepgram/listen/v1/types/listen_v1utterance_end.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV1UtteranceEnd(UniversalBaseModel): + type: typing.Literal["UtteranceEnd"] = pydantic.Field(default="UtteranceEnd") + """ + Message type identifier + """ + + channel: typing.List[float] = pydantic.Field() + """ + The channel + """ + + last_word_end: float = pydantic.Field() + """ + The last word end + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v2/__init__.py b/src/deepgram/listen/v2/__init__.py index 5cde0202..db7c724c 100644 --- a/src/deepgram/listen/v2/__init__.py +++ b/src/deepgram/listen/v2/__init__.py @@ -2,3 +2,74 @@ # isort: skip_file +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .types import ( + ListenV2CloseStream, + ListenV2CloseStreamType, + ListenV2Connected, + ListenV2FatalError, + ListenV2TurnInfo, + ListenV2TurnInfoEvent, + ListenV2TurnInfoWordsItem, + ) + from .requests import ( + ListenV2CloseStreamParams, + ListenV2ConnectedParams, + ListenV2FatalErrorParams, + ListenV2TurnInfoParams, + ListenV2TurnInfoWordsItemParams, + ) +_dynamic_imports: typing.Dict[str, str] = { + "ListenV2CloseStream": ".types", + "ListenV2CloseStreamParams": ".requests", + "ListenV2CloseStreamType": ".types", + "ListenV2Connected": ".types", + "ListenV2ConnectedParams": ".requests", + "ListenV2FatalError": ".types", + "ListenV2FatalErrorParams": ".requests", + "ListenV2TurnInfo": ".types", + "ListenV2TurnInfoEvent": ".types", + "ListenV2TurnInfoParams": ".requests", + "ListenV2TurnInfoWordsItem": ".types", + "ListenV2TurnInfoWordsItemParams": ".requests", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "ListenV2CloseStream", + "ListenV2CloseStreamParams", + "ListenV2CloseStreamType", + "ListenV2Connected", + "ListenV2ConnectedParams", + "ListenV2FatalError", + "ListenV2FatalErrorParams", + "ListenV2TurnInfo", + "ListenV2TurnInfoEvent", + "ListenV2TurnInfoParams", + "ListenV2TurnInfoWordsItem", + "ListenV2TurnInfoWordsItemParams", +] diff --git a/src/deepgram/listen/v2/requests/__init__.py b/src/deepgram/listen/v2/requests/__init__.py new file mode 100644 index 00000000..96ce5ece --- /dev/null +++ b/src/deepgram/listen/v2/requests/__init__.py @@ -0,0 +1,50 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .listen_v2close_stream import ListenV2CloseStreamParams + from .listen_v2connected import ListenV2ConnectedParams + from .listen_v2fatal_error import ListenV2FatalErrorParams + from .listen_v2turn_info import ListenV2TurnInfoParams + from .listen_v2turn_info_words_item import ListenV2TurnInfoWordsItemParams +_dynamic_imports: typing.Dict[str, str] = { + "ListenV2CloseStreamParams": ".listen_v2close_stream", + "ListenV2ConnectedParams": ".listen_v2connected", + "ListenV2FatalErrorParams": ".listen_v2fatal_error", + "ListenV2TurnInfoParams": ".listen_v2turn_info", + "ListenV2TurnInfoWordsItemParams": ".listen_v2turn_info_words_item", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "ListenV2CloseStreamParams", + "ListenV2ConnectedParams", + "ListenV2FatalErrorParams", + "ListenV2TurnInfoParams", + "ListenV2TurnInfoWordsItemParams", +] diff --git a/src/deepgram/listen/v2/requests/listen_v2close_stream.py b/src/deepgram/listen/v2/requests/listen_v2close_stream.py new file mode 100644 index 00000000..70e4f760 --- /dev/null +++ b/src/deepgram/listen/v2/requests/listen_v2close_stream.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.listen_v2close_stream_type import ListenV2CloseStreamType + + +class ListenV2CloseStreamParams(typing_extensions.TypedDict): + type: ListenV2CloseStreamType + """ + Message type identifier + """ diff --git a/src/deepgram/listen/v2/requests/listen_v2connected.py b/src/deepgram/listen/v2/requests/listen_v2connected.py new file mode 100644 index 00000000..c931eec2 --- /dev/null +++ b/src/deepgram/listen/v2/requests/listen_v2connected.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class ListenV2ConnectedParams(typing_extensions.TypedDict): + type: typing.Literal["Connected"] + """ + Message type identifier + """ + + request_id: str + """ + The unique identifier of the request + """ + + sequence_id: float + """ + Starts at `0` and increments for each message the server sends + to the client. This includes messages of other types, like + `TurnInfo` messages. + """ diff --git a/src/deepgram/listen/v2/requests/listen_v2fatal_error.py b/src/deepgram/listen/v2/requests/listen_v2fatal_error.py new file mode 100644 index 00000000..05cb3041 --- /dev/null +++ b/src/deepgram/listen/v2/requests/listen_v2fatal_error.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class ListenV2FatalErrorParams(typing_extensions.TypedDict): + type: typing.Literal["Error"] + """ + Message type identifier + """ + + sequence_id: float + """ + Starts at `0` and increments for each message the server sends + to the client. This includes messages of other types, like + `Connected` messages. + """ + + code: str + """ + A string code describing the error, e.g. `INTERNAL_SERVER_ERROR` + """ + + description: str + """ + Prose description of the error + """ diff --git a/src/deepgram/listen/v2/requests/listen_v2turn_info.py b/src/deepgram/listen/v2/requests/listen_v2turn_info.py new file mode 100644 index 00000000..d1a15fec --- /dev/null +++ b/src/deepgram/listen/v2/requests/listen_v2turn_info.py @@ -0,0 +1,65 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..types.listen_v2turn_info_event import ListenV2TurnInfoEvent +from .listen_v2turn_info_words_item import ListenV2TurnInfoWordsItemParams + + +class ListenV2TurnInfoParams(typing_extensions.TypedDict): + """ + Describes the current turn and latest state of the turn + """ + + type: typing.Literal["TurnInfo"] + request_id: str + """ + The unique identifier of the request + """ + + sequence_id: float + """ + Starts at `0` and increments for each message the server sends to the client. This includes messages of other types, like `Connected` messages. + """ + + event: ListenV2TurnInfoEvent + """ + The type of event being reported. + + - **Update** - Additional audio has been transcribed, but the turn state hasn't changed + - **StartOfTurn** - The user has begun speaking for the first time in the turn + - **EagerEndOfTurn** - The system has moderate confidence that the user has finished speaking for the turn. This is an opportunity to begin preparing an agent reply + - **TurnResumed** - The system detected that speech had ended and therefore sent an **EagerEndOfTurn** event, but speech is actually continuing for this turn + - **EndOfTurn** - The user has finished speaking for the turn + """ + + turn_index: float + """ + The index of the current turn + """ + + audio_window_start: float + """ + Start time in seconds of the audio range that was transcribed + """ + + audio_window_end: float + """ + End time in seconds of the audio range that was transcribed + """ + + transcript: str + """ + Text that was said over the course of the current turn + """ + + words: typing.Sequence[ListenV2TurnInfoWordsItemParams] + """ + The words in the `transcript` + """ + + end_of_turn_confidence: float + """ + Confidence that no more speech is coming in this turn + """ diff --git a/src/deepgram/listen/v2/requests/listen_v2turn_info_words_item.py b/src/deepgram/listen/v2/requests/listen_v2turn_info_words_item.py new file mode 100644 index 00000000..397157f5 --- /dev/null +++ b/src/deepgram/listen/v2/requests/listen_v2turn_info_words_item.py @@ -0,0 +1,15 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions + + +class ListenV2TurnInfoWordsItemParams(typing_extensions.TypedDict): + word: str + """ + The individual punctuated, properly-cased word from the transcript + """ + + confidence: float + """ + Confidence that this word was transcribed correctly + """ diff --git a/src/deepgram/listen/v2/socket_client.py b/src/deepgram/listen/v2/socket_client.py index ded23989..4bc7247c 100644 --- a/src/deepgram/listen/v2/socket_client.py +++ b/src/deepgram/listen/v2/socket_client.py @@ -1,5 +1,4 @@ # This file was auto-generated by Fern from our API Definition. -# Enhanced with binary message support, comprehensive socket types, and send methods. import json import typing @@ -9,27 +8,17 @@ import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.pydantic_utilities import parse_obj_as +from .types.listen_v2close_stream import ListenV2CloseStream +from .types.listen_v2connected import ListenV2Connected +from .types.listen_v2fatal_error import ListenV2FatalError +from .types.listen_v2turn_info import ListenV2TurnInfo try: from websockets.legacy.client import WebSocketClientProtocol # type: ignore except ImportError: from websockets import WebSocketClientProtocol # type: ignore -# Socket message types -from ...extensions.types.sockets import ( - ListenV2ConnectedEvent, - ListenV2ControlMessage, - ListenV2FatalErrorEvent, - ListenV2MediaMessage, - ListenV2TurnInfoEvent, -) - -# Response union type (Listen V2 only receives JSON events) -V2SocketClientResponse = typing.Union[ - ListenV2ConnectedEvent, - ListenV2TurnInfoEvent, - ListenV2FatalErrorEvent, -] +V2SocketClientResponse = typing.Union[ListenV2Connected, ListenV2TurnInfo, ListenV2FatalError] class AsyncV2SocketClient(EventEmitterMixin): @@ -37,37 +26,13 @@ def __init__(self, *, websocket: WebSocketClientProtocol): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V2SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - async def __aiter__(self): async for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V2SocketClientResponse, json.loads(message)) # type: ignore async def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established @@ -78,48 +43,49 @@ async def start_listening(self): await self._emit_async(EventType.OPEN, None) try: async for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V2SocketClientResponse, json_data) # type: ignore await self._emit_async(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - await self._emit_async(EventType.ERROR, exc) + await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) + async def send_listen_v_2_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ + await self._send_model(message) + + async def send_listen_v_2_close_stream(self, message: ListenV2CloseStream) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV2CloseStream. + """ + await self._send_model(message) + async def recv(self) -> V2SocketClientResponse: """ Receive a message from the websocket connection. """ data = await self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V2SocketClientResponse, json_data) # type: ignore async def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - await self._websocket.send(data) - elif isinstance(data, dict): - await self._websocket.send(json.dumps(data)) - else: - await self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) async def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - await self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - async def send_control(self, message: ListenV2ControlMessage) -> None: - """Send a control message.""" - await self._send_model(message) - - async def send_media(self, message: ListenV2MediaMessage) -> None: - """Send binary audio data for transcription.""" - await self._send(message) + await self._send(data.dict()) class V2SocketClient(EventEmitterMixin): @@ -127,37 +93,13 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V2SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - def __iter__(self): for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V2SocketClientResponse, json.loads(message)) # type: ignore def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established @@ -168,45 +110,46 @@ def start_listening(self): self._emit(EventType.OPEN, None) try: for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V2SocketClientResponse, json_data) # type: ignore self._emit(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - self._emit(EventType.ERROR, exc) + self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) + def send_listen_v_2_media(self, message: str) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a str. + """ + self._send_model(message) + + def send_listen_v_2_close_stream(self, message: ListenV2CloseStream) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV2CloseStream. + """ + self._send_model(message) + def recv(self) -> V2SocketClientResponse: """ Receive a message from the websocket connection. """ data = self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V2SocketClientResponse, json_data) # type: ignore def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - self._websocket.send(data) - elif isinstance(data, dict): - self._websocket.send(json.dumps(data)) - else: - self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - def send_control(self, message: ListenV2ControlMessage) -> None: - """Send a control message.""" - self._send_model(message) - - def send_media(self, message: ListenV2MediaMessage) -> None: - """Send binary audio data for transcription.""" - self._send(message) + self._send(data.dict()) diff --git a/src/deepgram/listen/v2/types/__init__.py b/src/deepgram/listen/v2/types/__init__.py new file mode 100644 index 00000000..229417bf --- /dev/null +++ b/src/deepgram/listen/v2/types/__init__.py @@ -0,0 +1,56 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .listen_v2close_stream import ListenV2CloseStream + from .listen_v2close_stream_type import ListenV2CloseStreamType + from .listen_v2connected import ListenV2Connected + from .listen_v2fatal_error import ListenV2FatalError + from .listen_v2turn_info import ListenV2TurnInfo + from .listen_v2turn_info_event import ListenV2TurnInfoEvent + from .listen_v2turn_info_words_item import ListenV2TurnInfoWordsItem +_dynamic_imports: typing.Dict[str, str] = { + "ListenV2CloseStream": ".listen_v2close_stream", + "ListenV2CloseStreamType": ".listen_v2close_stream_type", + "ListenV2Connected": ".listen_v2connected", + "ListenV2FatalError": ".listen_v2fatal_error", + "ListenV2TurnInfo": ".listen_v2turn_info", + "ListenV2TurnInfoEvent": ".listen_v2turn_info_event", + "ListenV2TurnInfoWordsItem": ".listen_v2turn_info_words_item", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "ListenV2CloseStream", + "ListenV2CloseStreamType", + "ListenV2Connected", + "ListenV2FatalError", + "ListenV2TurnInfo", + "ListenV2TurnInfoEvent", + "ListenV2TurnInfoWordsItem", +] diff --git a/src/deepgram/listen/v2/types/listen_v2close_stream.py b/src/deepgram/listen/v2/types/listen_v2close_stream.py new file mode 100644 index 00000000..00376ced --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2close_stream.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v2close_stream_type import ListenV2CloseStreamType + + +class ListenV2CloseStream(UniversalBaseModel): + type: ListenV2CloseStreamType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v2/types/listen_v2close_stream_type.py b/src/deepgram/listen/v2/types/listen_v2close_stream_type.py new file mode 100644 index 00000000..2ac3484e --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2close_stream_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV2CloseStreamType = typing.Union[typing.Literal["Finalize", "CloseStream", "KeepAlive"], typing.Any] diff --git a/src/deepgram/listen/v2/types/listen_v2connected.py b/src/deepgram/listen/v2/types/listen_v2connected.py new file mode 100644 index 00000000..29108f24 --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2connected.py @@ -0,0 +1,34 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV2Connected(UniversalBaseModel): + type: typing.Literal["Connected"] = pydantic.Field(default="Connected") + """ + Message type identifier + """ + + request_id: str = pydantic.Field() + """ + The unique identifier of the request + """ + + sequence_id: float = pydantic.Field() + """ + Starts at `0` and increments for each message the server sends + to the client. This includes messages of other types, like + `TurnInfo` messages. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v2/types/listen_v2fatal_error.py b/src/deepgram/listen/v2/types/listen_v2fatal_error.py new file mode 100644 index 00000000..1eccfabc --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2fatal_error.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV2FatalError(UniversalBaseModel): + type: typing.Literal["Error"] = pydantic.Field(default="Error") + """ + Message type identifier + """ + + sequence_id: float = pydantic.Field() + """ + Starts at `0` and increments for each message the server sends + to the client. This includes messages of other types, like + `Connected` messages. + """ + + code: str = pydantic.Field() + """ + A string code describing the error, e.g. `INTERNAL_SERVER_ERROR` + """ + + description: str = pydantic.Field() + """ + Prose description of the error + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v2/types/listen_v2turn_info.py b/src/deepgram/listen/v2/types/listen_v2turn_info.py new file mode 100644 index 00000000..80006b6b --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2turn_info.py @@ -0,0 +1,75 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .listen_v2turn_info_event import ListenV2TurnInfoEvent +from .listen_v2turn_info_words_item import ListenV2TurnInfoWordsItem + + +class ListenV2TurnInfo(UniversalBaseModel): + """ + Describes the current turn and latest state of the turn + """ + + type: typing.Literal["TurnInfo"] = "TurnInfo" + request_id: str = pydantic.Field() + """ + The unique identifier of the request + """ + + sequence_id: float = pydantic.Field() + """ + Starts at `0` and increments for each message the server sends to the client. This includes messages of other types, like `Connected` messages. + """ + + event: ListenV2TurnInfoEvent = pydantic.Field() + """ + The type of event being reported. + + - **Update** - Additional audio has been transcribed, but the turn state hasn't changed + - **StartOfTurn** - The user has begun speaking for the first time in the turn + - **EagerEndOfTurn** - The system has moderate confidence that the user has finished speaking for the turn. This is an opportunity to begin preparing an agent reply + - **TurnResumed** - The system detected that speech had ended and therefore sent an **EagerEndOfTurn** event, but speech is actually continuing for this turn + - **EndOfTurn** - The user has finished speaking for the turn + """ + + turn_index: float = pydantic.Field() + """ + The index of the current turn + """ + + audio_window_start: float = pydantic.Field() + """ + Start time in seconds of the audio range that was transcribed + """ + + audio_window_end: float = pydantic.Field() + """ + End time in seconds of the audio range that was transcribed + """ + + transcript: str = pydantic.Field() + """ + Text that was said over the course of the current turn + """ + + words: typing.List[ListenV2TurnInfoWordsItem] = pydantic.Field() + """ + The words in the `transcript` + """ + + end_of_turn_confidence: float = pydantic.Field() + """ + Confidence that no more speech is coming in this turn + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/listen/v2/types/listen_v2turn_info_event.py b/src/deepgram/listen/v2/types/listen_v2turn_info_event.py new file mode 100644 index 00000000..d2a0510f --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2turn_info_event.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV2TurnInfoEvent = typing.Union[ + typing.Literal["Update", "StartOfTurn", "EagerEndOfTurn", "TurnResumed", "EndOfTurn"], typing.Any +] diff --git a/src/deepgram/listen/v2/types/listen_v2turn_info_words_item.py b/src/deepgram/listen/v2/types/listen_v2turn_info_words_item.py new file mode 100644 index 00000000..58ae2f98 --- /dev/null +++ b/src/deepgram/listen/v2/types/listen_v2turn_info_words_item.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ListenV2TurnInfoWordsItem(UniversalBaseModel): + word: str = pydantic.Field() + """ + The individual punctuated, properly-cased word from the transcript + """ + + confidence: float = pydantic.Field() + """ + Confidence that this word was transcribed correctly + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/manage/v1/models/client.py b/src/deepgram/manage/v1/models/client.py index bc16c9e1..9ae001ca 100644 --- a/src/deepgram/manage/v1/models/client.py +++ b/src/deepgram/manage/v1/models/client.py @@ -50,7 +50,9 @@ def list( client = DeepgramClient( api_key="YOUR_API_KEY", ) - client.manage.v1.models.list() + client.manage.v1.models.list( + include_outdated=True, + ) """ _response = self._raw_client.list(include_outdated=include_outdated, request_options=request_options) return _response.data @@ -133,7 +135,9 @@ async def list( async def main() -> None: - await client.manage.v1.models.list() + await client.manage.v1.models.list( + include_outdated=True, + ) asyncio.run(main()) diff --git a/src/deepgram/manage/v1/projects/billing/breakdown/client.py b/src/deepgram/manage/v1/projects/billing/breakdown/client.py index 5ccef016..34bfbcf0 100644 --- a/src/deepgram/manage/v1/projects/billing/breakdown/client.py +++ b/src/deepgram/manage/v1/projects/billing/breakdown/client.py @@ -86,7 +86,10 @@ def list( ) client.manage.v1.projects.billing.breakdown.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + deployment="hosted", tag="tag1", line_item="streaming::nova-3", ) @@ -186,7 +189,10 @@ async def list( async def main() -> None: await client.manage.v1.projects.billing.breakdown.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + deployment="hosted", tag="tag1", line_item="streaming::nova-3", ) diff --git a/src/deepgram/manage/v1/projects/billing/fields/client.py b/src/deepgram/manage/v1/projects/billing/fields/client.py index 00682a0d..749103cc 100644 --- a/src/deepgram/manage/v1/projects/billing/fields/client.py +++ b/src/deepgram/manage/v1/projects/billing/fields/client.py @@ -62,6 +62,8 @@ def list( ) client.manage.v1.projects.billing.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) """ _response = self._raw_client.list(project_id, start=start, end=end, request_options=request_options) @@ -127,6 +129,8 @@ async def list( async def main() -> None: await client.manage.v1.projects.billing.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) diff --git a/src/deepgram/manage/v1/projects/billing/purchases/client.py b/src/deepgram/manage/v1/projects/billing/purchases/client.py index 7bed75c3..7afe4f92 100644 --- a/src/deepgram/manage/v1/projects/billing/purchases/client.py +++ b/src/deepgram/manage/v1/projects/billing/purchases/client.py @@ -58,6 +58,7 @@ def list( ) client.manage.v1.projects.billing.purchases.list( project_id="123456-7890-1234-5678-901234", + limit=1.1, ) """ _response = self._raw_client.list(project_id, limit=limit, request_options=request_options) @@ -119,6 +120,7 @@ async def list( async def main() -> None: await client.manage.v1.projects.billing.purchases.list( project_id="123456-7890-1234-5678-901234", + limit=1.1, ) diff --git a/src/deepgram/manage/v1/projects/client.py b/src/deepgram/manage/v1/projects/client.py index 439f0220..33b0fc8c 100644 --- a/src/deepgram/manage/v1/projects/client.py +++ b/src/deepgram/manage/v1/projects/client.py @@ -111,6 +111,8 @@ def get( ) client.manage.v1.projects.get( project_id="123456-7890-1234-5678-901234", + limit=1.1, + page=1.1, ) """ _response = self._raw_client.get(project_id, limit=limit, page=page, request_options=request_options) @@ -371,6 +373,8 @@ async def get( async def main() -> None: await client.manage.v1.projects.get( project_id="123456-7890-1234-5678-901234", + limit=1.1, + page=1.1, ) diff --git a/src/deepgram/manage/v1/projects/keys/client.py b/src/deepgram/manage/v1/projects/keys/client.py index 88885f1e..698bf841 100644 --- a/src/deepgram/manage/v1/projects/keys/client.py +++ b/src/deepgram/manage/v1/projects/keys/client.py @@ -66,6 +66,7 @@ def list( ) client.manage.v1.projects.keys.list( project_id="123456-7890-1234-5678-901234", + status="active", ) """ _response = self._raw_client.list(project_id, status=status, request_options=request_options) @@ -241,6 +242,7 @@ async def list( async def main() -> None: await client.manage.v1.projects.keys.list( project_id="123456-7890-1234-5678-901234", + status="active", ) diff --git a/src/deepgram/manage/v1/projects/models/client.py b/src/deepgram/manage/v1/projects/models/client.py index 6ff8474f..9f78ba4d 100644 --- a/src/deepgram/manage/v1/projects/models/client.py +++ b/src/deepgram/manage/v1/projects/models/client.py @@ -59,6 +59,7 @@ def list( ) client.manage.v1.projects.models.list( project_id="123456-7890-1234-5678-901234", + include_outdated=True, ) """ _response = self._raw_client.list( @@ -159,6 +160,7 @@ async def list( async def main() -> None: await client.manage.v1.projects.models.list( project_id="123456-7890-1234-5678-901234", + include_outdated=True, ) diff --git a/src/deepgram/manage/v1/projects/requests/client.py b/src/deepgram/manage/v1/projects/requests/client.py index a8e0246d..6d1435aa 100644 --- a/src/deepgram/manage/v1/projects/requests/client.py +++ b/src/deepgram/manage/v1/projects/requests/client.py @@ -93,6 +93,8 @@ def list( Examples -------- + import datetime + from deepgram import DeepgramClient client = DeepgramClient( @@ -100,8 +102,20 @@ def list( ) client.manage.v1.projects.requests.list( project_id="123456-7890-1234-5678-901234", + start=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + end=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + limit=1.1, + page=1.1, accessor="12345678-1234-1234-1234-123456789012", request_id="12345678-1234-1234-1234-123456789012", + deployment="hosted", + endpoint="listen", + method="sync", + status="succeeded", ) """ _response = self._raw_client.list( @@ -238,6 +252,7 @@ async def list( Examples -------- import asyncio + import datetime from deepgram import AsyncDeepgramClient @@ -249,8 +264,20 @@ async def list( async def main() -> None: await client.manage.v1.projects.requests.list( project_id="123456-7890-1234-5678-901234", + start=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + end=datetime.datetime.fromisoformat( + "2024-01-15 09:30:00+00:00", + ), + limit=1.1, + page=1.1, accessor="12345678-1234-1234-1234-123456789012", request_id="12345678-1234-1234-1234-123456789012", + deployment="hosted", + endpoint="listen", + method="sync", + status="succeeded", ) diff --git a/src/deepgram/manage/v1/projects/usage/breakdown/client.py b/src/deepgram/manage/v1/projects/usage/breakdown/client.py index 57532bbd..1f0822cb 100644 --- a/src/deepgram/manage/v1/projects/usage/breakdown/client.py +++ b/src/deepgram/manage/v1/projects/usage/breakdown/client.py @@ -238,10 +238,51 @@ def get( ) client.manage.v1.projects.usage.breakdown.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", + grouping="accessor", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) """ _response = self._raw_client.get( @@ -527,10 +568,51 @@ async def get( async def main() -> None: await client.manage.v1.projects.usage.breakdown.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", + grouping="accessor", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) diff --git a/src/deepgram/manage/v1/projects/usage/client.py b/src/deepgram/manage/v1/projects/usage/client.py index d2c1c7e0..6ffad7f2 100644 --- a/src/deepgram/manage/v1/projects/usage/client.py +++ b/src/deepgram/manage/v1/projects/usage/client.py @@ -242,10 +242,50 @@ def get( ) client.manage.v1.projects.usage.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) """ _response = self._raw_client.get( @@ -545,10 +585,50 @@ async def get( async def main() -> None: await client.manage.v1.projects.usage.get( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", accessor="12345678-1234-1234-1234-123456789012", + alternatives=True, + callback_method=True, + callback=True, + channels=True, + custom_intent_mode=True, + custom_intent=True, + custom_topic_mode=True, + custom_topic=True, + deployment="hosted", + detect_entities=True, + detect_language=True, + diarize=True, + dictation=True, + encoding=True, + endpoint="listen", + extra=True, + filler_words=True, + intents=True, + keyterm=True, + keywords=True, + language=True, + measurements=True, + method="sync", model="6f548761-c9c0-429a-9315-11a1d28499c8", + multichannel=True, + numerals=True, + paragraphs=True, + profanity_filter=True, + punctuate=True, + redact=True, + replace=True, sample_rate=True, + search=True, + sentiment=True, + smart_format=True, + summarize=True, tag="tag1", + topics=True, + utt_split=True, + utterances=True, + version=True, ) diff --git a/src/deepgram/manage/v1/projects/usage/fields/client.py b/src/deepgram/manage/v1/projects/usage/fields/client.py index d810f50f..c1e144ab 100644 --- a/src/deepgram/manage/v1/projects/usage/fields/client.py +++ b/src/deepgram/manage/v1/projects/usage/fields/client.py @@ -62,6 +62,8 @@ def list( ) client.manage.v1.projects.usage.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) """ _response = self._raw_client.list(project_id, start=start, end=end, request_options=request_options) @@ -127,6 +129,8 @@ async def list( async def main() -> None: await client.manage.v1.projects.usage.fields.list( project_id="123456-7890-1234-5678-901234", + start="start", + end="end", ) diff --git a/src/deepgram/read/v1/text/client.py b/src/deepgram/read/v1/text/client.py index b906e76a..d04b8a7c 100644 --- a/src/deepgram/read/v1/text/client.py +++ b/src/deepgram/read/v1/text/client.py @@ -108,6 +108,18 @@ def analyze( api_key="YOUR_API_KEY", ) client.read.v1.text.analyze( + callback="callback", + callback_method="POST", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + language="language", request={"url": "url"}, ) """ @@ -227,6 +239,18 @@ async def analyze( async def main() -> None: await client.read.v1.text.analyze( + callback="callback", + callback_method="POST", + sentiment=True, + summarize="v2", + tag="tag", + topics=True, + custom_topic="custom_topic", + custom_topic_mode="extended", + intents=True, + custom_intent="custom_intent", + custom_intent_mode="extended", + language="language", request={"url": "url"}, ) diff --git a/src/deepgram/speak/__init__.py b/src/deepgram/speak/__init__.py index 148ad154..73eda24c 100644 --- a/src/deepgram/speak/__init__.py +++ b/src/deepgram/speak/__init__.py @@ -7,7 +7,53 @@ if typing.TYPE_CHECKING: from . import v1 -_dynamic_imports: typing.Dict[str, str] = {"v1": ".v1"} + from .v1 import ( + SpeakV1Clear, + SpeakV1ClearParams, + SpeakV1ClearType, + SpeakV1Cleared, + SpeakV1ClearedParams, + SpeakV1ClearedType, + SpeakV1Close, + SpeakV1CloseParams, + SpeakV1CloseType, + SpeakV1Flush, + SpeakV1FlushParams, + SpeakV1FlushType, + SpeakV1Flushed, + SpeakV1FlushedParams, + SpeakV1FlushedType, + SpeakV1Metadata, + SpeakV1MetadataParams, + SpeakV1Text, + SpeakV1TextParams, + SpeakV1Warning, + SpeakV1WarningParams, + ) +_dynamic_imports: typing.Dict[str, str] = { + "SpeakV1Clear": ".v1", + "SpeakV1ClearParams": ".v1", + "SpeakV1ClearType": ".v1", + "SpeakV1Cleared": ".v1", + "SpeakV1ClearedParams": ".v1", + "SpeakV1ClearedType": ".v1", + "SpeakV1Close": ".v1", + "SpeakV1CloseParams": ".v1", + "SpeakV1CloseType": ".v1", + "SpeakV1Flush": ".v1", + "SpeakV1FlushParams": ".v1", + "SpeakV1FlushType": ".v1", + "SpeakV1Flushed": ".v1", + "SpeakV1FlushedParams": ".v1", + "SpeakV1FlushedType": ".v1", + "SpeakV1Metadata": ".v1", + "SpeakV1MetadataParams": ".v1", + "SpeakV1Text": ".v1", + "SpeakV1TextParams": ".v1", + "SpeakV1Warning": ".v1", + "SpeakV1WarningParams": ".v1", + "v1": ".v1", +} def __getattr__(attr_name: str) -> typing.Any: @@ -31,4 +77,27 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["v1"] +__all__ = [ + "SpeakV1Clear", + "SpeakV1ClearParams", + "SpeakV1ClearType", + "SpeakV1Cleared", + "SpeakV1ClearedParams", + "SpeakV1ClearedType", + "SpeakV1Close", + "SpeakV1CloseParams", + "SpeakV1CloseType", + "SpeakV1Flush", + "SpeakV1FlushParams", + "SpeakV1FlushType", + "SpeakV1Flushed", + "SpeakV1FlushedParams", + "SpeakV1FlushedType", + "SpeakV1Metadata", + "SpeakV1MetadataParams", + "SpeakV1Text", + "SpeakV1TextParams", + "SpeakV1Warning", + "SpeakV1WarningParams", + "v1", +] diff --git a/src/deepgram/speak/v1/__init__.py b/src/deepgram/speak/v1/__init__.py index 40fff37f..c874ef09 100644 --- a/src/deepgram/speak/v1/__init__.py +++ b/src/deepgram/speak/v1/__init__.py @@ -6,6 +6,21 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .types import ( + SpeakV1Clear, + SpeakV1ClearType, + SpeakV1Cleared, + SpeakV1ClearedType, + SpeakV1Close, + SpeakV1CloseType, + SpeakV1Flush, + SpeakV1FlushType, + SpeakV1Flushed, + SpeakV1FlushedType, + SpeakV1Metadata, + SpeakV1Text, + SpeakV1Warning, + ) from . import audio from .audio import ( AudioGenerateRequestCallbackMethod, @@ -13,11 +28,42 @@ AudioGenerateRequestEncoding, AudioGenerateRequestModel, ) + from .requests import ( + SpeakV1ClearParams, + SpeakV1ClearedParams, + SpeakV1CloseParams, + SpeakV1FlushParams, + SpeakV1FlushedParams, + SpeakV1MetadataParams, + SpeakV1TextParams, + SpeakV1WarningParams, + ) _dynamic_imports: typing.Dict[str, str] = { "AudioGenerateRequestCallbackMethod": ".audio", "AudioGenerateRequestContainer": ".audio", "AudioGenerateRequestEncoding": ".audio", "AudioGenerateRequestModel": ".audio", + "SpeakV1Clear": ".types", + "SpeakV1ClearParams": ".requests", + "SpeakV1ClearType": ".types", + "SpeakV1Cleared": ".types", + "SpeakV1ClearedParams": ".requests", + "SpeakV1ClearedType": ".types", + "SpeakV1Close": ".types", + "SpeakV1CloseParams": ".requests", + "SpeakV1CloseType": ".types", + "SpeakV1Flush": ".types", + "SpeakV1FlushParams": ".requests", + "SpeakV1FlushType": ".types", + "SpeakV1Flushed": ".types", + "SpeakV1FlushedParams": ".requests", + "SpeakV1FlushedType": ".types", + "SpeakV1Metadata": ".types", + "SpeakV1MetadataParams": ".requests", + "SpeakV1Text": ".types", + "SpeakV1TextParams": ".requests", + "SpeakV1Warning": ".types", + "SpeakV1WarningParams": ".requests", "audio": ".audio", } @@ -48,5 +94,26 @@ def __dir__(): "AudioGenerateRequestContainer", "AudioGenerateRequestEncoding", "AudioGenerateRequestModel", + "SpeakV1Clear", + "SpeakV1ClearParams", + "SpeakV1ClearType", + "SpeakV1Cleared", + "SpeakV1ClearedParams", + "SpeakV1ClearedType", + "SpeakV1Close", + "SpeakV1CloseParams", + "SpeakV1CloseType", + "SpeakV1Flush", + "SpeakV1FlushParams", + "SpeakV1FlushType", + "SpeakV1Flushed", + "SpeakV1FlushedParams", + "SpeakV1FlushedType", + "SpeakV1Metadata", + "SpeakV1MetadataParams", + "SpeakV1Text", + "SpeakV1TextParams", + "SpeakV1Warning", + "SpeakV1WarningParams", "audio", ] diff --git a/src/deepgram/speak/v1/requests/__init__.py b/src/deepgram/speak/v1/requests/__init__.py new file mode 100644 index 00000000..4e8e1826 --- /dev/null +++ b/src/deepgram/speak/v1/requests/__init__.py @@ -0,0 +1,59 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .speak_v1clear import SpeakV1ClearParams + from .speak_v1cleared import SpeakV1ClearedParams + from .speak_v1close import SpeakV1CloseParams + from .speak_v1flush import SpeakV1FlushParams + from .speak_v1flushed import SpeakV1FlushedParams + from .speak_v1metadata import SpeakV1MetadataParams + from .speak_v1text import SpeakV1TextParams + from .speak_v1warning import SpeakV1WarningParams +_dynamic_imports: typing.Dict[str, str] = { + "SpeakV1ClearParams": ".speak_v1clear", + "SpeakV1ClearedParams": ".speak_v1cleared", + "SpeakV1CloseParams": ".speak_v1close", + "SpeakV1FlushParams": ".speak_v1flush", + "SpeakV1FlushedParams": ".speak_v1flushed", + "SpeakV1MetadataParams": ".speak_v1metadata", + "SpeakV1TextParams": ".speak_v1text", + "SpeakV1WarningParams": ".speak_v1warning", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "SpeakV1ClearParams", + "SpeakV1ClearedParams", + "SpeakV1CloseParams", + "SpeakV1FlushParams", + "SpeakV1FlushedParams", + "SpeakV1MetadataParams", + "SpeakV1TextParams", + "SpeakV1WarningParams", +] diff --git a/src/deepgram/speak/v1/requests/speak_v1clear.py b/src/deepgram/speak/v1/requests/speak_v1clear.py new file mode 100644 index 00000000..6ffc2f3e --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1clear.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.speak_v1clear_type import SpeakV1ClearType + + +class SpeakV1ClearParams(typing_extensions.TypedDict): + type: SpeakV1ClearType + """ + Message type identifier + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1cleared.py b/src/deepgram/speak/v1/requests/speak_v1cleared.py new file mode 100644 index 00000000..e1f1784b --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1cleared.py @@ -0,0 +1,16 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.speak_v1cleared_type import SpeakV1ClearedType + + +class SpeakV1ClearedParams(typing_extensions.TypedDict): + type: SpeakV1ClearedType + """ + Message type identifier + """ + + sequence_id: float + """ + The sequence ID of the response + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1close.py b/src/deepgram/speak/v1/requests/speak_v1close.py new file mode 100644 index 00000000..7a3219c3 --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1close.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.speak_v1close_type import SpeakV1CloseType + + +class SpeakV1CloseParams(typing_extensions.TypedDict): + type: SpeakV1CloseType + """ + Message type identifier + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1flush.py b/src/deepgram/speak/v1/requests/speak_v1flush.py new file mode 100644 index 00000000..8bafc736 --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1flush.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.speak_v1flush_type import SpeakV1FlushType + + +class SpeakV1FlushParams(typing_extensions.TypedDict): + type: SpeakV1FlushType + """ + Message type identifier + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1flushed.py b/src/deepgram/speak/v1/requests/speak_v1flushed.py new file mode 100644 index 00000000..674cb52d --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1flushed.py @@ -0,0 +1,16 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing_extensions +from ..types.speak_v1flushed_type import SpeakV1FlushedType + + +class SpeakV1FlushedParams(typing_extensions.TypedDict): + type: SpeakV1FlushedType + """ + Message type identifier + """ + + sequence_id: float + """ + The sequence ID of the response + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1metadata.py b/src/deepgram/speak/v1/requests/speak_v1metadata.py new file mode 100644 index 00000000..89fb6809 --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1metadata.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class SpeakV1MetadataParams(typing_extensions.TypedDict): + type: typing.Literal["Metadata"] + """ + Message type identifier + """ + + request_id: str + """ + Unique identifier for the request + """ + + model_name: str + """ + Name of the model being used + """ + + model_version: str + """ + Version of the model being used + """ + + model_uuid: str + """ + Unique identifier for the model + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1text.py b/src/deepgram/speak/v1/requests/speak_v1text.py new file mode 100644 index 00000000..78873194 --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1text.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class SpeakV1TextParams(typing_extensions.TypedDict): + type: typing.Literal["Speak"] + """ + Message type identifier + """ + + text: str + """ + The input text to be converted to speech + """ diff --git a/src/deepgram/speak/v1/requests/speak_v1warning.py b/src/deepgram/speak/v1/requests/speak_v1warning.py new file mode 100644 index 00000000..ca6c78f8 --- /dev/null +++ b/src/deepgram/speak/v1/requests/speak_v1warning.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions + + +class SpeakV1WarningParams(typing_extensions.TypedDict): + type: typing.Literal["Warning"] + """ + Message type identifier + """ + + description: str + """ + A description of what went wrong + """ + + code: str + """ + Error code identifying the type of error + """ diff --git a/src/deepgram/speak/v1/socket_client.py b/src/deepgram/speak/v1/socket_client.py index 6d4b77aa..e370f3ca 100644 --- a/src/deepgram/speak/v1/socket_client.py +++ b/src/deepgram/speak/v1/socket_client.py @@ -1,5 +1,4 @@ # This file was auto-generated by Fern from our API Definition. -# Enhanced with binary message support, comprehensive socket types, and send methods. import json import typing @@ -9,30 +8,21 @@ import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.pydantic_utilities import parse_obj_as +from .types.speak_v1clear import SpeakV1Clear +from .types.speak_v1cleared import SpeakV1Cleared +from .types.speak_v1close import SpeakV1Close +from .types.speak_v1flush import SpeakV1Flush +from .types.speak_v1flushed import SpeakV1Flushed +from .types.speak_v1metadata import SpeakV1Metadata +from .types.speak_v1text import SpeakV1Text +from .types.speak_v1warning import SpeakV1Warning try: from websockets.legacy.client import WebSocketClientProtocol # type: ignore except ImportError: from websockets import WebSocketClientProtocol # type: ignore -# Socket message types -from ...extensions.types.sockets import ( - SpeakV1AudioChunkEvent, - SpeakV1ControlEvent, - SpeakV1ControlMessage, - SpeakV1MetadataEvent, - SpeakV1TextMessage, - SpeakV1WarningEvent, -) - -# Response union type with binary support -V1SocketClientResponse = typing.Union[ - SpeakV1AudioChunkEvent, # Binary audio data - SpeakV1MetadataEvent, # JSON metadata - SpeakV1ControlEvent, # JSON control responses (Flushed, Cleared) - SpeakV1WarningEvent, # JSON warnings - bytes, # Raw binary audio chunks -] +V1SocketClientResponse = typing.Union[str, SpeakV1Metadata, SpeakV1Flushed, SpeakV1Cleared, SpeakV1Warning] class AsyncV1SocketClient(EventEmitterMixin): @@ -40,90 +30,80 @@ def __init__(self, *, websocket: WebSocketClientProtocol): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is for audio chunks).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - async def __aiter__(self): async for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore async def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received (binary or JSON) + - EventType.MESSAGE for each message received - EventType.ERROR if an error occurs - EventType.CLOSE when connection is closed """ await self._emit_async(EventType.OPEN, None) try: async for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore await self._emit_async(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - await self._emit_async(EventType.ERROR, exc) + await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) + async def send_speak_v_1_text(self, message: SpeakV1Text) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Text. + """ + await self._send_model(message) + + async def send_speak_v_1_flush(self, message: SpeakV1Flush) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Flush. + """ + await self._send_model(message) + + async def send_speak_v_1_clear(self, message: SpeakV1Clear) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Clear. + """ + await self._send_model(message) + + async def send_speak_v_1_close(self, message: SpeakV1Close) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Close. + """ + await self._send_model(message) + async def recv(self) -> V1SocketClientResponse: """ Receive a message from the websocket connection. - Handles both binary and JSON messages. """ data = await self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore async def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - await self._websocket.send(data) - elif isinstance(data, dict): - await self._websocket.send(json.dumps(data)) - else: - await self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) async def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - await self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - async def send_text(self, message: SpeakV1TextMessage) -> None: - """Send a text message to generate speech.""" - await self._send_model(message) - - async def send_control(self, message: SpeakV1ControlMessage) -> None: - """Send a control message (flush, clear, etc.).""" - await self._send_model(message) + await self._send(data.dict()) class V1SocketClient(EventEmitterMixin): @@ -131,87 +111,77 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): super().__init__() self._websocket = websocket - def _is_binary_message(self, message: typing.Any) -> bool: - """Determine if a message is binary data.""" - return isinstance(message, (bytes, bytearray)) - - def _handle_binary_message(self, message: bytes) -> typing.Any: - """Handle a binary message (returns as-is for audio chunks).""" - return message - - def _handle_json_message(self, message: str) -> typing.Any: - """Handle a JSON message by parsing it.""" - json_data = json.loads(message) - return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore - - def _process_message(self, raw_message: typing.Any) -> typing.Tuple[typing.Any, bool]: - """Process a raw message, detecting if it's binary or JSON.""" - if self._is_binary_message(raw_message): - processed = self._handle_binary_message(raw_message) - return processed, True - else: - processed = self._handle_json_message(raw_message) - return processed, False - def __iter__(self): for message in self._websocket: - processed_message, _ = self._process_message(message) - yield processed_message + yield parse_obj_as(V1SocketClientResponse, json.loads(message)) # type: ignore def start_listening(self): """ Start listening for messages on the websocket connection. - Handles both binary and JSON messages. Emits events in the following order: - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received (binary or JSON) + - EventType.MESSAGE for each message received - EventType.ERROR if an error occurs - EventType.CLOSE when connection is closed """ self._emit(EventType.OPEN, None) try: for raw_message in self._websocket: - parsed, is_binary = self._process_message(raw_message) + json_data = json.loads(raw_message) + parsed = parse_obj_as(V1SocketClientResponse, json_data) # type: ignore self._emit(EventType.MESSAGE, parsed) except (websockets.WebSocketException, JSONDecodeError) as exc: - # Do not emit an error for a normal/clean close - if not isinstance(exc, websockets.exceptions.ConnectionClosedOK): - self._emit(EventType.ERROR, exc) + self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) + def send_speak_v_1_text(self, message: SpeakV1Text) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Text. + """ + self._send_model(message) + + def send_speak_v_1_flush(self, message: SpeakV1Flush) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Flush. + """ + self._send_model(message) + + def send_speak_v_1_clear(self, message: SpeakV1Clear) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Clear. + """ + self._send_model(message) + + def send_speak_v_1_close(self, message: SpeakV1Close) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Close. + """ + self._send_model(message) + def recv(self) -> V1SocketClientResponse: """ Receive a message from the websocket connection. - Handles both binary and JSON messages. """ data = self._websocket.recv() - processed_message, _ = self._process_message(data) - return processed_message + json_data = json.loads(data) + return parse_obj_as(V1SocketClientResponse, json_data) # type: ignore def _send(self, data: typing.Any) -> None: """ - Send data as binary or JSON depending on type. + Send a message to the websocket connection. """ - if isinstance(data, (bytes, bytearray)): - self._websocket.send(data) - elif isinstance(data, dict): - self._websocket.send(json.dumps(data)) - else: - self._websocket.send(data) + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - self._send(data.dict(exclude_unset=True, exclude_none=True)) - - # Enhanced send methods for specific message types - def send_text(self, message: SpeakV1TextMessage) -> None: - """Send a text message to generate speech.""" - self._send_model(message) - - def send_control(self, message: SpeakV1ControlMessage) -> None: - """Send a control message (flush, clear, etc.).""" - self._send_model(message) + self._send(data.dict()) diff --git a/src/deepgram/speak/v1/types/__init__.py b/src/deepgram/speak/v1/types/__init__.py new file mode 100644 index 00000000..72a25d1b --- /dev/null +++ b/src/deepgram/speak/v1/types/__init__.py @@ -0,0 +1,74 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .speak_v1clear import SpeakV1Clear + from .speak_v1clear_type import SpeakV1ClearType + from .speak_v1cleared import SpeakV1Cleared + from .speak_v1cleared_type import SpeakV1ClearedType + from .speak_v1close import SpeakV1Close + from .speak_v1close_type import SpeakV1CloseType + from .speak_v1flush import SpeakV1Flush + from .speak_v1flush_type import SpeakV1FlushType + from .speak_v1flushed import SpeakV1Flushed + from .speak_v1flushed_type import SpeakV1FlushedType + from .speak_v1metadata import SpeakV1Metadata + from .speak_v1text import SpeakV1Text + from .speak_v1warning import SpeakV1Warning +_dynamic_imports: typing.Dict[str, str] = { + "SpeakV1Clear": ".speak_v1clear", + "SpeakV1ClearType": ".speak_v1clear_type", + "SpeakV1Cleared": ".speak_v1cleared", + "SpeakV1ClearedType": ".speak_v1cleared_type", + "SpeakV1Close": ".speak_v1close", + "SpeakV1CloseType": ".speak_v1close_type", + "SpeakV1Flush": ".speak_v1flush", + "SpeakV1FlushType": ".speak_v1flush_type", + "SpeakV1Flushed": ".speak_v1flushed", + "SpeakV1FlushedType": ".speak_v1flushed_type", + "SpeakV1Metadata": ".speak_v1metadata", + "SpeakV1Text": ".speak_v1text", + "SpeakV1Warning": ".speak_v1warning", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + if module_name == f".{attr_name}": + return module + else: + return getattr(module, attr_name) + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = [ + "SpeakV1Clear", + "SpeakV1ClearType", + "SpeakV1Cleared", + "SpeakV1ClearedType", + "SpeakV1Close", + "SpeakV1CloseType", + "SpeakV1Flush", + "SpeakV1FlushType", + "SpeakV1Flushed", + "SpeakV1FlushedType", + "SpeakV1Metadata", + "SpeakV1Text", + "SpeakV1Warning", +] diff --git a/src/deepgram/speak/v1/types/speak_v1clear.py b/src/deepgram/speak/v1/types/speak_v1clear.py new file mode 100644 index 00000000..b528050a --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1clear.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .speak_v1clear_type import SpeakV1ClearType + + +class SpeakV1Clear(UniversalBaseModel): + type: SpeakV1ClearType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1clear_type.py b/src/deepgram/speak/v1/types/speak_v1clear_type.py new file mode 100644 index 00000000..93317162 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1clear_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV1ClearType = typing.Union[typing.Literal["Flush", "Clear", "Close"], typing.Any] diff --git a/src/deepgram/extensions/types/sockets/agent_v1_welcome_message.py b/src/deepgram/speak/v1/types/speak_v1cleared.py similarity index 55% rename from src/deepgram/extensions/types/sockets/agent_v1_welcome_message.py rename to src/deepgram/speak/v1/types/speak_v1cleared.py index 19950a5a..9e88c530 100644 --- a/src/deepgram/extensions/types/sockets/agent_v1_welcome_message.py +++ b/src/deepgram/speak/v1/types/speak_v1cleared.py @@ -1,25 +1,27 @@ -# Agent V1 Welcome Message - protected from auto-generation +# This file was auto-generated by Fern from our API Definition. import typing import pydantic from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .speak_v1cleared_type import SpeakV1ClearedType -class AgentV1WelcomeMessage(UniversalBaseModel): +class SpeakV1Cleared(UniversalBaseModel): + type: SpeakV1ClearedType = pydantic.Field() """ - Confirms that the WebSocket connection has been successfully opened + Message type identifier + """ + + sequence_id: float = pydantic.Field() + """ + The sequence ID of the response """ - - type: typing.Literal["Welcome"] - """Message type identifier""" - - request_id: str - """Unique identifier for the request""" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: + class Config: frozen = True smart_union = True diff --git a/src/deepgram/speak/v1/types/speak_v1cleared_type.py b/src/deepgram/speak/v1/types/speak_v1cleared_type.py new file mode 100644 index 00000000..2e2b0158 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1cleared_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV1ClearedType = typing.Union[typing.Literal["Flushed", "Cleared"], typing.Any] diff --git a/src/deepgram/speak/v1/types/speak_v1close.py b/src/deepgram/speak/v1/types/speak_v1close.py new file mode 100644 index 00000000..f801dc92 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1close.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .speak_v1close_type import SpeakV1CloseType + + +class SpeakV1Close(UniversalBaseModel): + type: SpeakV1CloseType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1close_type.py b/src/deepgram/speak/v1/types/speak_v1close_type.py new file mode 100644 index 00000000..c3381c96 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1close_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV1CloseType = typing.Union[typing.Literal["Flush", "Clear", "Close"], typing.Any] diff --git a/src/deepgram/speak/v1/types/speak_v1flush.py b/src/deepgram/speak/v1/types/speak_v1flush.py new file mode 100644 index 00000000..bfa3f72c --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1flush.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .speak_v1flush_type import SpeakV1FlushType + + +class SpeakV1Flush(UniversalBaseModel): + type: SpeakV1FlushType = pydantic.Field() + """ + Message type identifier + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1flush_type.py b/src/deepgram/speak/v1/types/speak_v1flush_type.py new file mode 100644 index 00000000..eaf4237f --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1flush_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV1FlushType = typing.Union[typing.Literal["Flush", "Clear", "Close"], typing.Any] diff --git a/src/deepgram/speak/v1/types/speak_v1flushed.py b/src/deepgram/speak/v1/types/speak_v1flushed.py new file mode 100644 index 00000000..6a5fd2c2 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1flushed.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .speak_v1flushed_type import SpeakV1FlushedType + + +class SpeakV1Flushed(UniversalBaseModel): + type: SpeakV1FlushedType = pydantic.Field() + """ + Message type identifier + """ + + sequence_id: float = pydantic.Field() + """ + The sequence ID of the response + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1flushed_type.py b/src/deepgram/speak/v1/types/speak_v1flushed_type.py new file mode 100644 index 00000000..4651ac44 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1flushed_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV1FlushedType = typing.Union[typing.Literal["Flushed", "Cleared"], typing.Any] diff --git a/src/deepgram/speak/v1/types/speak_v1metadata.py b/src/deepgram/speak/v1/types/speak_v1metadata.py new file mode 100644 index 00000000..4502f0c6 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1metadata.py @@ -0,0 +1,42 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SpeakV1Metadata(UniversalBaseModel): + type: typing.Literal["Metadata"] = pydantic.Field(default="Metadata") + """ + Message type identifier + """ + + request_id: str = pydantic.Field() + """ + Unique identifier for the request + """ + + model_name: str = pydantic.Field() + """ + Name of the model being used + """ + + model_version: str = pydantic.Field() + """ + Version of the model being used + """ + + model_uuid: str = pydantic.Field() + """ + Unique identifier for the model + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1text.py b/src/deepgram/speak/v1/types/speak_v1text.py new file mode 100644 index 00000000..94ec70c8 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1text.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SpeakV1Text(UniversalBaseModel): + type: typing.Literal["Speak"] = pydantic.Field(default="Speak") + """ + Message type identifier + """ + + text: str = pydantic.Field() + """ + The input text to be converted to speech + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/deepgram/speak/v1/types/speak_v1warning.py b/src/deepgram/speak/v1/types/speak_v1warning.py new file mode 100644 index 00000000..95815596 --- /dev/null +++ b/src/deepgram/speak/v1/types/speak_v1warning.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SpeakV1Warning(UniversalBaseModel): + type: typing.Literal["Warning"] = pydantic.Field(default="Warning") + """ + Message type identifier + """ + + description: str = pydantic.Field() + """ + A description of what went wrong + """ + + code: str = pydantic.Field() + """ + Error code identifying the type of error + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/tests/integrations/__init__.py b/tests/integrations/__init__.py deleted file mode 100644 index b1b8a3cb..00000000 --- a/tests/integrations/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Integration tests for Deepgram Python SDK clients.""" diff --git a/tests/integrations/conftest.py b/tests/integrations/conftest.py deleted file mode 100644 index 60c51220..00000000 --- a/tests/integrations/conftest.py +++ /dev/null @@ -1,73 +0,0 @@ -"""Shared configuration and fixtures for integration tests.""" - -import os -import pytest -from unittest.mock import Mock, AsyncMock -import asyncio -from typing import Optional, Dict, Any - -# Mock environment variables for testing -TEST_API_KEY = "test_api_key_12345" -TEST_ACCESS_TOKEN = "test_access_token_67890" - -@pytest.fixture(scope="session") -def event_loop(): - """Create an instance of the default event loop for the test session.""" - loop = asyncio.new_event_loop() - yield loop - loop.close() - -@pytest.fixture -def mock_api_key(): - """Provide a mock API key for testing.""" - return TEST_API_KEY - -@pytest.fixture -def mock_access_token(): - """Provide a mock access token for testing.""" - return TEST_ACCESS_TOKEN - -@pytest.fixture -def mock_env_vars(monkeypatch): - """Mock environment variables.""" - monkeypatch.setenv("DEEPGRAM_API_KEY", TEST_API_KEY) - monkeypatch.setenv("DEEPGRAM_ENV", "test") - -@pytest.fixture -def mock_websocket(): - """Mock websocket connection for testing.""" - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock() - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - return mock_ws - -@pytest.fixture -def mock_async_websocket(): - """Mock async websocket connection for testing.""" - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock() - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - return mock_ws - -@pytest.fixture -def sample_audio_data(): - """Sample audio data for testing.""" - return b'\x00\x01\x02\x03\x04\x05' * 100 # 600 bytes of sample audio - -@pytest.fixture -def sample_text(): - """Sample text for testing.""" - return "Hello, this is a test message for speech synthesis." - -@pytest.fixture -def mock_http_response(): - """Mock HTTP response.""" - mock_response = Mock() - mock_response.status_code = 200 - mock_response.json.return_value = {"success": True, "message": "Test response"} - mock_response.headers = {"Content-Type": "application/json"} - return mock_response diff --git a/tests/integrations/test_advanced_features.py b/tests/integrations/test_advanced_features.py deleted file mode 100644 index 4384a6b2..00000000 --- a/tests/integrations/test_advanced_features.py +++ /dev/null @@ -1,601 +0,0 @@ -""" -Integration tests for advanced/specialized features. - -This module tests advanced features including: -- Agent Settings APIs (think models, configuration) -- Advanced Management APIs (project distribution credentials, scopes) -- Self-hosted client features -- Advanced telemetry and instrumentation features -""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch -import httpx -import json -from typing import Dict, Any - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment - -# Import clients for advanced features -from deepgram.agent.v1.settings.client import SettingsClient, AsyncSettingsClient -from deepgram.agent.v1.settings.think.client import ThinkClient, AsyncThinkClient -from deepgram.agent.v1.settings.think.models.client import ModelsClient as ThinkModelsClient, AsyncModelsClient as AsyncThinkModelsClient -from deepgram.self_hosted.client import SelfHostedClient, AsyncSelfHostedClient - -# Import response types (if they exist) -try: - from deepgram.types.agent_think_models_v1response import AgentThinkModelsV1Response -except ImportError: - # AgentThinkModelsV1Response might not exist, create a placeholder - AgentThinkModelsV1Response = Dict[str, Any] - - -class TestAgentSettingsAPI: - """Test Agent Settings API advanced features.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_agent_settings_client_initialization(self, sync_client_wrapper): - """Test Agent Settings client initialization.""" - client = SettingsClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._think is None # Lazy loaded - - def test_async_agent_settings_client_initialization(self, async_client_wrapper): - """Test Async Agent Settings client initialization.""" - client = AsyncSettingsClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._think is None # Lazy loaded - - def test_agent_settings_think_property_lazy_loading(self, sync_client_wrapper): - """Test Agent Settings think property lazy loading.""" - client = SettingsClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._think is None - - # Access triggers lazy loading - think_client = client.think - assert client._think is not None - assert isinstance(think_client, ThinkClient) - - # Subsequent access returns same instance - assert client.think is think_client - - def test_async_agent_settings_think_property_lazy_loading(self, async_client_wrapper): - """Test Async Agent Settings think property lazy loading.""" - client = AsyncSettingsClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._think is None - - # Access triggers lazy loading - think_client = client.think - assert client._think is not None - assert isinstance(think_client, AsyncThinkClient) - - # Subsequent access returns same instance - assert client.think is think_client - - def test_agent_think_client_initialization(self, sync_client_wrapper): - """Test Agent Think client initialization.""" - client = ThinkClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._models is None # Lazy loaded - - def test_async_agent_think_client_initialization(self, async_client_wrapper): - """Test Async Agent Think client initialization.""" - client = AsyncThinkClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._models is None # Lazy loaded - - def test_agent_think_models_property_lazy_loading(self, sync_client_wrapper): - """Test Agent Think models property lazy loading.""" - client = ThinkClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._models is None - - # Access triggers lazy loading - models_client = client.models - assert client._models is not None - assert isinstance(models_client, ThinkModelsClient) - - # Subsequent access returns same instance - assert client.models is models_client - - def test_async_agent_think_models_property_lazy_loading(self, async_client_wrapper): - """Test Async Agent Think models property lazy loading.""" - client = AsyncThinkClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._models is None - - # Access triggers lazy loading - models_client = client.models - assert client._models is not None - assert isinstance(models_client, AsyncThinkModelsClient) - - # Subsequent access returns same instance - assert client.models is models_client - - def test_agent_think_models_list(self, sync_client_wrapper): - """Test Agent Think models list functionality.""" - # Mock the raw client's list method directly - client = ThinkModelsClient(client_wrapper=sync_client_wrapper) - - # Mock the raw client response - mock_response = Mock() - mock_response.data = {"models": [{"id": "test-model", "name": "Test Model"}]} - - with patch.object(client._raw_client, 'list', return_value=mock_response) as mock_list: - result = client.list() - - assert result is not None - mock_list.assert_called_once_with(request_options=None) - - @pytest.mark.asyncio - async def test_async_agent_think_models_list(self, async_client_wrapper): - """Test Async Agent Think models list functionality.""" - # Mock the raw client's list method directly - client = AsyncThinkModelsClient(client_wrapper=async_client_wrapper) - - # Mock the raw client response - mock_response = Mock() - mock_response.data = {"models": [{"id": "test-model", "name": "Test Model"}]} - - with patch.object(client._raw_client, 'list', return_value=mock_response) as mock_list: - result = await client.list() - - assert result is not None - mock_list.assert_called_once_with(request_options=None) - - def test_agent_think_models_list_with_request_options(self, sync_client_wrapper): - """Test Agent Think models list with request options.""" - # Mock the raw client's list method directly - client = ThinkModelsClient(client_wrapper=sync_client_wrapper) - - # Mock the raw client response - mock_response = Mock() - mock_response.data = {"models": []} - - request_options = RequestOptions( - additional_headers={"Custom-Header": "test-value"}, - timeout_in_seconds=30.0 - ) - - with patch.object(client._raw_client, 'list', return_value=mock_response) as mock_list: - result = client.list(request_options=request_options) - - assert result is not None - mock_list.assert_called_once_with(request_options=request_options) - - @patch('httpx.Client.request') - def test_agent_think_models_list_api_error(self, mock_request, sync_client_wrapper): - """Test Agent Think models list API error handling.""" - # Mock error response - mock_response = Mock() - mock_response.status_code = 401 - mock_response.json.return_value = {"error": "Unauthorized"} - mock_response.headers = {"content-type": "application/json"} - mock_request.return_value = mock_response - - client = ThinkModelsClient(client_wrapper=sync_client_wrapper) - - with pytest.raises((ApiError, Exception)): - client.list() - - @patch('httpx.AsyncClient.request') - @pytest.mark.asyncio - async def test_async_agent_think_models_list_api_error(self, mock_request, async_client_wrapper): - """Test Async Agent Think models list API error handling.""" - # Mock error response - mock_response = Mock() - mock_response.status_code = 500 - mock_response.json.return_value = {"error": "Internal Server Error"} - mock_response.headers = {"content-type": "application/json"} - mock_request.return_value = mock_response - - client = AsyncThinkModelsClient(client_wrapper=async_client_wrapper) - - with pytest.raises((ApiError, Exception)): - await client.list() - - -class TestSelfHostedClient: - """Test Self-hosted client advanced features.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_self_hosted_client_initialization(self, sync_client_wrapper): - """Test Self-hosted client initialization.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_async_self_hosted_client_initialization(self, async_client_wrapper): - """Test Async Self-hosted client initialization.""" - client = AsyncSelfHostedClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_self_hosted_client_v1_property_lazy_loading(self, sync_client_wrapper): - """Test Self-hosted client v1 property lazy loading.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_async_self_hosted_client_v1_property_lazy_loading(self, async_client_wrapper): - """Test Async Self-hosted client v1 property lazy loading.""" - client = AsyncSelfHostedClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_self_hosted_client_integration_with_main_client(self, mock_api_key): - """Test Self-hosted client integration with main DeepgramClient.""" - client = DeepgramClient(api_key=mock_api_key) - - # Access self-hosted client through main client - self_hosted = client.self_hosted - assert self_hosted is not None - assert isinstance(self_hosted, SelfHostedClient) - - def test_async_self_hosted_client_integration_with_main_client(self, mock_api_key): - """Test Async Self-hosted client integration with main DeepgramClient.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access self-hosted client through main client - self_hosted = client.self_hosted - assert self_hosted is not None - assert isinstance(self_hosted, AsyncSelfHostedClient) - - -class TestAdvancedManagementFeatures: - """Test advanced management API features.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_project_member_scopes_client_access(self, mock_api_key): - """Test access to project member scopes client.""" - client = DeepgramClient(api_key=mock_api_key) - - # Access member scopes through projects client - projects_client = client.manage.v1.projects - - # Try to access members and then scopes - try: - members_client = projects_client.members - if members_client is not None and hasattr(members_client, 'scopes'): - scopes_client = members_client.scopes - assert scopes_client is not None - except AttributeError: - # It's acceptable if this advanced feature isn't fully implemented - pass - - def test_async_project_member_scopes_client_access(self, mock_api_key): - """Test async access to project member scopes client.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access member scopes through projects client - projects_client = client.manage.v1.projects - - # Try to access members and then scopes - try: - members_client = projects_client.members - if members_client is not None and hasattr(members_client, 'scopes'): - scopes_client = members_client.scopes - assert scopes_client is not None - except AttributeError: - # It's acceptable if this advanced feature isn't fully implemented - pass - - def test_project_advanced_operations_availability(self, mock_api_key): - """Test availability of advanced project operations.""" - client = DeepgramClient(api_key=mock_api_key) - projects_client = client.manage.v1.projects - - # Check that advanced operations are available - advanced_operations = [ - 'keys', 'members', 'requests', 'usage', 'billing', 'models' - ] - - for operation in advanced_operations: - assert hasattr(projects_client, operation), f"Missing {operation} operation" - - # Try to access the property to trigger lazy loading - try: - sub_client = getattr(projects_client, operation) - assert sub_client is not None - except Exception: - # Some advanced features might not be fully implemented - pass - - # Check that billing has purchases and balances sub-clients - billing_client = projects_client.billing - assert hasattr(billing_client, 'purchases'), "Missing purchases under billing" - assert hasattr(billing_client, 'balances'), "Missing balances under billing" - - def test_async_project_advanced_operations_availability(self, mock_api_key): - """Test availability of advanced project operations for async client.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - projects_client = client.manage.v1.projects - - # Check that advanced operations are available - advanced_operations = [ - 'keys', 'members', 'requests', 'usage', 'billing', 'models' - ] - - for operation in advanced_operations: - assert hasattr(projects_client, operation), f"Missing {operation} operation" - - # Try to access the property to trigger lazy loading - try: - sub_client = getattr(projects_client, operation) - assert sub_client is not None - except Exception: - # Some advanced features might not be fully implemented - pass - - # Check that billing has purchases and balances sub-clients - billing_client = projects_client.billing - assert hasattr(billing_client, 'purchases'), "Missing purchases under billing" - assert hasattr(billing_client, 'balances'), "Missing balances under billing" - - -class TestAdvancedIntegrationScenarios: - """Test advanced integration scenarios combining multiple features.""" - - def test_agent_settings_with_management_workflow(self, mock_api_key): - """Test workflow combining agent settings and management APIs.""" - client = DeepgramClient(api_key=mock_api_key) - - # Access both agent settings and management clients - agent_settings = client.agent.v1.settings - management = client.manage.v1 - - assert agent_settings is not None - assert management is not None - - # Verify they use the same underlying client infrastructure - assert agent_settings._client_wrapper is not None - assert management._client_wrapper is not None - - @pytest.mark.asyncio - async def test_async_agent_settings_with_management_workflow(self, mock_api_key): - """Test async workflow combining agent settings and management APIs.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access both agent settings and management clients - agent_settings = client.agent.v1.settings - management = client.manage.v1 - - assert agent_settings is not None - assert management is not None - - # Verify they use the same underlying client infrastructure - assert agent_settings._client_wrapper is not None - assert management._client_wrapper is not None - - def test_self_hosted_with_advanced_features_workflow(self, mock_api_key): - """Test workflow combining self-hosted client with other advanced features.""" - client = DeepgramClient(api_key=mock_api_key) - - # Access multiple advanced clients - self_hosted = client.self_hosted - management = client.manage - agent = client.agent - - assert self_hosted is not None - assert management is not None - assert agent is not None - - # Verify all clients share the same base infrastructure - base_clients = [self_hosted, management, agent] - for base_client in base_clients: - assert hasattr(base_client, '_client_wrapper') - - @pytest.mark.asyncio - async def test_async_self_hosted_with_advanced_features_workflow(self, mock_api_key): - """Test async workflow combining self-hosted client with other advanced features.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access multiple advanced clients - self_hosted = client.self_hosted - management = client.manage - agent = client.agent - - assert self_hosted is not None - assert management is not None - assert agent is not None - - # Verify all clients share the same base infrastructure - base_clients = [self_hosted, management, agent] - for base_client in base_clients: - assert hasattr(base_client, '_client_wrapper') - - def test_advanced_error_handling_across_features(self, mock_api_key): - """Test error handling consistency across advanced features.""" - client = DeepgramClient(api_key=mock_api_key) - - # Test that all advanced clients handle initialization properly - advanced_clients = [ - client.agent.v1.settings, - client.manage.v1, - client.self_hosted, - ] - - for adv_client in advanced_clients: - assert adv_client is not None - assert hasattr(adv_client, '_client_wrapper') - - # Test that raw response access works - if hasattr(adv_client, 'with_raw_response'): - raw_client = adv_client.with_raw_response - assert raw_client is not None - - @pytest.mark.asyncio - async def test_async_advanced_error_handling_across_features(self, mock_api_key): - """Test async error handling consistency across advanced features.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Test that all advanced clients handle initialization properly - advanced_clients = [ - client.agent.v1.settings, - client.manage.v1, - client.self_hosted, - ] - - for adv_client in advanced_clients: - assert adv_client is not None - assert hasattr(adv_client, '_client_wrapper') - - # Test that raw response access works - if hasattr(adv_client, 'with_raw_response'): - raw_client = adv_client.with_raw_response - assert raw_client is not None - - -class TestAdvancedFeatureErrorHandling: - """Test error handling for advanced features.""" - - @patch('httpx.Client.request') - def test_agent_settings_network_error_handling(self, mock_request, mock_api_key): - """Test network error handling in agent settings.""" - # Mock network error - mock_request.side_effect = httpx.ConnectError("Connection failed") - - client = DeepgramClient(api_key=mock_api_key) - think_models_client = client.agent.v1.settings.think.models - - with pytest.raises((httpx.ConnectError, ApiError, Exception)): - think_models_client.list() - - @patch('httpx.AsyncClient.request') - @pytest.mark.asyncio - async def test_async_agent_settings_network_error_handling(self, mock_request, mock_api_key): - """Test async network error handling in agent settings.""" - # Mock network error - mock_request.side_effect = httpx.ConnectError("Connection failed") - - client = AsyncDeepgramClient(api_key=mock_api_key) - think_models_client = client.agent.v1.settings.think.models - - with pytest.raises((httpx.ConnectError, ApiError, Exception)): - await think_models_client.list() - - def test_client_wrapper_integration_across_advanced_features(self, mock_api_key): - """Test client wrapper integration across advanced features.""" - client = DeepgramClient(api_key=mock_api_key) - - # Get client wrappers from different advanced features - agent_wrapper = client.agent.v1.settings._client_wrapper - manage_wrapper = client.manage.v1._client_wrapper - - # They should have the same configuration - assert agent_wrapper.api_key == manage_wrapper.api_key - assert agent_wrapper.get_environment() == manage_wrapper.get_environment() - - @pytest.mark.asyncio - async def test_async_client_wrapper_integration_across_advanced_features(self, mock_api_key): - """Test async client wrapper integration across advanced features.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Get client wrappers from different advanced features - agent_wrapper = client.agent.v1.settings._client_wrapper - manage_wrapper = client.manage.v1._client_wrapper - - # They should have the same configuration - assert agent_wrapper.api_key == manage_wrapper.api_key - assert agent_wrapper.get_environment() == manage_wrapper.get_environment() diff --git a/tests/integrations/test_agent_client.py b/tests/integrations/test_agent_client.py deleted file mode 100644 index 46a7f165..00000000 --- a/tests/integrations/test_agent_client.py +++ /dev/null @@ -1,636 +0,0 @@ -"""Integration tests for Agent client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch, MagicMock -from contextlib import contextmanager, asynccontextmanager -import httpx -import websockets.exceptions -import json -import asyncio -from json.decoder import JSONDecodeError - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.core.events import EventType -from deepgram.environment import DeepgramClientEnvironment - -# Import Agent clients -from deepgram.agent.client import AgentClient, AsyncAgentClient -from deepgram.agent.v1.client import V1Client as AgentV1Client, AsyncV1Client as AgentAsyncV1Client - -# Import Agent raw clients -from deepgram.agent.v1.raw_client import RawV1Client as AgentRawV1Client, AsyncRawV1Client as AgentAsyncRawV1Client - -# Import Agent socket clients -from deepgram.agent.v1.socket_client import V1SocketClient as AgentV1SocketClient, AsyncV1SocketClient as AgentAsyncV1SocketClient - -# Import socket message types -from deepgram.extensions.types.sockets import ( - AgentV1SettingsMessage, - AgentV1ControlMessage, - AgentV1MediaMessage, -) - - -class TestAgentClient: - """Test cases for Agent Client.""" - - def test_agent_client_initialization(self, mock_api_key): - """Test AgentClient initialization.""" - client = DeepgramClient(api_key=mock_api_key).agent - assert client is not None - assert hasattr(client, 'v1') - - def test_async_agent_client_initialization(self, mock_api_key): - """Test AsyncAgentClient initialization.""" - client = AsyncDeepgramClient(api_key=mock_api_key).agent - assert client is not None - assert hasattr(client, 'v1') - - def test_agent_client_with_raw_response(self, mock_api_key): - """Test AgentClient with_raw_response property.""" - client = DeepgramClient(api_key=mock_api_key).agent - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - def test_async_agent_client_with_raw_response(self, mock_api_key): - """Test AsyncAgentClient with_raw_response property.""" - client = AsyncDeepgramClient(api_key=mock_api_key).agent - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - -class TestAgentRawV1Client: - """Test cases for Agent V1 Raw Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_sync_agent_raw_client_initialization(self, sync_client_wrapper): - """Test synchronous agent raw client initialization.""" - client = AgentRawV1Client(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._client_wrapper is sync_client_wrapper - - def test_async_agent_raw_client_initialization(self, async_client_wrapper): - """Test asynchronous agent raw client initialization.""" - client = AgentAsyncRawV1Client(client_wrapper=async_client_wrapper) - assert client is not None - assert client._client_wrapper is async_client_wrapper - - @patch('websockets.sync.client.connect') - def test_sync_agent_connect_success(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test successful synchronous Agent WebSocket connection.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = AgentRawV1Client(client_wrapper=sync_client_wrapper) - - with client.connect() as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - @patch('deepgram.agent.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_agent_connect_success(self, mock_websocket_connect, async_client_wrapper, mock_async_websocket): - """Test successful asynchronous Agent WebSocket connection.""" - mock_websocket_connect.return_value.__aenter__ = AsyncMock(return_value=mock_async_websocket) - mock_websocket_connect.return_value.__aexit__ = AsyncMock(return_value=None) - - client = AgentAsyncRawV1Client(client_wrapper=async_client_wrapper) - - async with client.connect() as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - def test_agent_url_construction(self, sync_client_wrapper): - """Test Agent WebSocket URL construction.""" - client = AgentRawV1Client(client_wrapper=sync_client_wrapper) - - # Mock the websocket connection to capture the URL - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.return_value.__enter__ = Mock(return_value=Mock()) - mock_connect.return_value.__exit__ = Mock(return_value=None) - - try: - with client.connect() as connection: - pass - except: - pass # We just want to check the URL construction - - # Verify the URL was constructed for Agent endpoint - call_args = mock_connect.call_args - if call_args and len(call_args[0]) > 0: - url = call_args[0][0] - assert "agent" in url.lower() - - -class TestAgentV1SocketClient: - """Test cases for Agent V1 Socket Client.""" - - def test_agent_sync_socket_client_initialization(self): - """Test Agent synchronous socket client initialization.""" - mock_ws = Mock() - client = AgentV1SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_agent_async_socket_client_initialization(self): - """Test Agent asynchronous socket client initialization.""" - mock_ws = AsyncMock() - client = AgentAsyncV1SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_agent_sync_send_settings(self): - """Test Agent synchronous settings message sending.""" - mock_ws = Mock() - client = AgentV1SocketClient(websocket=mock_ws) - - # Mock settings message - mock_settings_msg = Mock(spec=AgentV1SettingsMessage) - mock_settings_msg.dict.return_value = {"type": "SettingsConfiguration"} - - client.send_settings(mock_settings_msg) - - mock_settings_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - def test_agent_sync_send_control(self): - """Test Agent synchronous control message sending.""" - mock_ws = Mock() - client = AgentV1SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=AgentV1ControlMessage) - mock_control_msg.dict.return_value = {"type": "KeepAlive"} - - client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - def test_agent_sync_send_media(self, sample_audio_data): - """Test Agent synchronous media message sending.""" - mock_ws = Mock() - client = AgentV1SocketClient(websocket=mock_ws) - - client.send_media(sample_audio_data) - - mock_ws.send.assert_called_once_with(sample_audio_data) - - @pytest.mark.asyncio - async def test_agent_async_send_settings(self): - """Test Agent asynchronous settings message sending.""" - mock_ws = AsyncMock() - client = AgentAsyncV1SocketClient(websocket=mock_ws) - - # Mock settings message - mock_settings_msg = Mock(spec=AgentV1SettingsMessage) - mock_settings_msg.dict.return_value = {"type": "SettingsConfiguration"} - - await client.send_settings(mock_settings_msg) - - mock_settings_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - @pytest.mark.asyncio - async def test_agent_async_send_control(self): - """Test Agent asynchronous control message sending.""" - mock_ws = AsyncMock() - client = AgentAsyncV1SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=AgentV1ControlMessage) - mock_control_msg.dict.return_value = {"type": "KeepAlive"} - - await client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - @pytest.mark.asyncio - async def test_agent_async_send_media(self, sample_audio_data): - """Test Agent asynchronous media message sending.""" - mock_ws = AsyncMock() - client = AgentAsyncV1SocketClient(websocket=mock_ws) - - await client.send_media(sample_audio_data) - - mock_ws.send.assert_called_once_with(sample_audio_data) - - -class TestAgentIntegrationScenarios: - """Test Agent API integration scenarios.""" - - @patch('websockets.sync.client.connect') - def test_agent_conversation_workflow(self, mock_websocket_connect, mock_api_key, sample_audio_data): - """Test complete Agent conversation workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=[ - '{"type": "Welcome", "request_id": "req-123"}', - '{"type": "ConversationText", "role": "assistant", "content": "Hello!"}', - b'\x00\x01\x02\x03' # Audio chunk - ]) - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Welcome", "request_id": "req-123"}', - '{"type": "ConversationText", "role": "assistant", "content": "Hello!"}', - b'\x00\x01\x02\x03' # Audio chunk - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect and interact with agent - with client.agent.v1.with_raw_response.connect() as connection: - # Send settings - connection.send_settings(Mock()) - - # Send control message - connection.send_control(Mock()) - - # Send audio data - connection.send_media(sample_audio_data) - - # Receive agent response - result = connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('websockets.sync.client.connect') - def test_agent_function_call_workflow(self, mock_websocket_connect, mock_api_key): - """Test Agent function call workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=[ - '{"type": "Welcome", "request_id": "func-req-123"}', - '{"type": "FunctionCallRequest", "function_name": "get_weather", "arguments": {"location": "New York"}}' - ]) - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Welcome", "request_id": "func-req-123"}', - '{"type": "FunctionCallRequest", "function_name": "get_weather", "arguments": {"location": "New York"}}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect and handle function calls - with client.agent.v1.with_raw_response.connect() as connection: - # Send settings with function definitions - connection.send_settings(Mock()) - - # Send user message that triggers function call - connection.send_media(b'User asks about weather') - - # Receive function call request - result = connection.recv() - assert result is not None - - # Send function call response - connection.send_control(Mock()) # Function response message - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('websockets.sync.client.connect') - def test_agent_event_driven_workflow(self, mock_websocket_connect, mock_api_key): - """Test Agent event-driven workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Welcome", "request_id": "event-agent-123"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Mock event handlers - on_open = Mock() - on_message = Mock() - on_close = Mock() - on_error = Mock() - - # Connect with event handlers - with client.agent.v1.with_raw_response.connect() as connection: - # Set up event handlers - connection.on(EventType.OPEN, on_open) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, on_close) - connection.on(EventType.ERROR, on_error) - - # Start listening (this will process the mock messages) - connection.start_listening() - - # Verify event handlers were set up - assert hasattr(connection, 'on') - - @patch('deepgram.agent.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_agent_conversation_workflow(self, mock_websocket_connect, mock_api_key, sample_audio_data): - """Test async Agent conversation workflow.""" - # Mock async websocket connection - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock(side_effect=[ - '{"type": "Welcome", "request_id": "async-agent-123"}', - '{"type": "ConversationText", "role": "assistant", "content": "Hello from async agent!"}' - ]) - - async def mock_aiter(): - yield '{"type": "Welcome", "request_id": "async-agent-123"}' - yield '{"type": "ConversationText", "role": "assistant", "content": "Hello from async agent!"}' - - mock_ws.__aiter__ = Mock(return_value=mock_aiter()) - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Connect and interact with agent - async with client.agent.v1.with_raw_response.connect() as connection: - # Send settings - await connection.send_settings(Mock()) - - # Send control message - await connection.send_control(Mock()) - - # Send audio data - await connection.send_media(sample_audio_data) - - # Receive agent response - result = await connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('deepgram.agent.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_agent_function_call_workflow(self, mock_websocket_connect, mock_api_key): - """Test async Agent function call workflow.""" - # Mock async websocket connection - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock(side_effect=[ - '{"type": "Welcome", "request_id": "async-func-123"}', - '{"type": "FunctionCallRequest", "function_name": "get_weather", "arguments": {"location": "San Francisco"}}' - ]) - - async def mock_aiter(): - yield '{"type": "Welcome", "request_id": "async-func-123"}' - yield '{"type": "FunctionCallRequest", "function_name": "get_weather", "arguments": {"location": "San Francisco"}}' - - mock_ws.__aiter__ = Mock(return_value=mock_aiter()) - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Connect and handle function calls - async with client.agent.v1.with_raw_response.connect() as connection: - # Send settings with function definitions - await connection.send_settings(Mock()) - - # Send user message that triggers function call - await connection.send_media(b'User asks about weather in SF') - - # Receive function call request - result = await connection.recv() - assert result is not None - - # Send function call response - await connection.send_control(Mock()) # Function response message - - # Verify websocket operations - mock_ws.send.assert_called() - - def test_complete_agent_workflow_sync(self, mock_api_key): - """Test complete Agent workflow using sync client.""" - with patch('websockets.sync.client.connect') as mock_websocket_connect: - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Welcome", "request_id": "complete-sync-123"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested agent functionality - with client.agent.v1.with_raw_response.connect() as connection: - # Send initial settings - connection.send_settings(Mock()) - - # Send user audio - connection.send_media(b'Hello agent') - - # Process response - for message in connection: - if isinstance(message, dict) and message.get('type') == 'Welcome': - break - - # Verify the connection was established - mock_websocket_connect.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_agent_workflow_async(self, mock_api_key): - """Test complete Agent workflow using async client.""" - with patch('deepgram.agent.v1.raw_client.websockets_client_connect') as mock_websocket_connect: - # Mock async websocket connection - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - - async def mock_aiter(): - yield '{"type": "Welcome", "request_id": "complete-async-123"}' - - mock_ws.__aiter__ = Mock(return_value=mock_aiter()) - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested agent functionality - async with client.agent.v1.with_raw_response.connect() as connection: - # Send initial settings - await connection.send_settings(Mock()) - - # Send user audio - await connection.send_media(b'Hello async agent') - - # Process response - async for message in connection: - if isinstance(message, dict) and message.get('type') == 'Welcome': - break - - # Verify the connection was established - mock_websocket_connect.assert_called_once() - - def test_agent_client_property_isolation(self, mock_api_key): - """Test that agent clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - # Verify clients are different instances - assert client1.agent is not client2.agent - - # Verify nested clients are also different - agent1 = client1.agent.v1 - agent2 = client2.agent.v1 - - assert agent1 is not agent2 - - @pytest.mark.asyncio - async def test_mixed_sync_async_agent_clients(self, mock_api_key): - """Test mixing sync and async agent clients.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - # Verify clients are different types - assert type(sync_client.agent) != type(async_client.agent) - - # Verify nested clients are also different types - sync_agent = sync_client.agent.v1 - async_agent = async_client.agent.v1 - - assert type(sync_agent) != type(async_agent) - assert isinstance(sync_agent, AgentV1Client) - assert isinstance(async_agent, AgentAsyncV1Client) - - -class TestAgentErrorHandling: - """Test Agent client error handling.""" - - @patch('websockets.sync.client.connect') - def test_websocket_connection_error_handling(self, mock_websocket_connect, mock_api_key): - """Test WebSocket connection error handling.""" - mock_websocket_connect.side_effect = websockets.exceptions.ConnectionClosedError(None, None) - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(websockets.exceptions.ConnectionClosedError): - with client.agent.v1.with_raw_response.connect() as connection: - pass - - @patch('websockets.sync.client.connect') - def test_generic_websocket_error_handling(self, mock_websocket_connect, mock_api_key): - """Test generic WebSocket error handling.""" - mock_websocket_connect.side_effect = Exception("Generic Agent WebSocket error") - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(Exception) as exc_info: - with client.agent.v1.with_raw_response.connect() as connection: - pass - - assert "Generic Agent WebSocket error" in str(exc_info.value) - - @patch('deepgram.agent.v1.raw_client.websockets_sync_client.connect') - def test_agent_invalid_credentials_error(self, mock_websocket_connect, mock_api_key): - """Test Agent connection with invalid credentials.""" - mock_websocket_connect.side_effect = websockets.exceptions.InvalidStatusCode( - status_code=401, headers={} - ) - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(ApiError) as exc_info: - with client.agent.v1.with_raw_response.connect() as connection: - pass - - assert exc_info.value.status_code == 401 - assert "invalid credentials" in exc_info.value.body.lower() - - @patch('deepgram.agent.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_websocket_connection_error_handling(self, mock_websocket_connect, mock_api_key): - """Test async WebSocket connection error handling.""" - mock_websocket_connect.side_effect = websockets.exceptions.ConnectionClosedError(None, None) - - client = AsyncDeepgramClient(api_key=mock_api_key) - - with pytest.raises(websockets.exceptions.ConnectionClosedError): - async with client.agent.v1.with_raw_response.connect() as connection: - pass - - def test_client_wrapper_integration(self, mock_api_key): - """Test integration with client wrapper.""" - client = DeepgramClient(api_key=mock_api_key).agent - assert client._client_wrapper is not None - assert client._client_wrapper.api_key == mock_api_key - - def test_socket_client_error_scenarios(self, sample_audio_data): - """Test Agent socket client error scenarios.""" - mock_ws = Mock() - mock_ws.send = Mock(side_effect=Exception("Send error")) - - client = AgentV1SocketClient(websocket=mock_ws) - - # Test that send errors are properly propagated - with pytest.raises(Exception) as exc_info: - client.send_media(sample_audio_data) - - assert "Send error" in str(exc_info.value) - - @pytest.mark.asyncio - async def test_async_socket_client_error_scenarios(self, sample_audio_data): - """Test async Agent socket client error scenarios.""" - mock_ws = AsyncMock() - mock_ws.send = AsyncMock(side_effect=Exception("Async send error")) - - client = AgentAsyncV1SocketClient(websocket=mock_ws) - - # Test that async send errors are properly propagated - with pytest.raises(Exception) as exc_info: - await client.send_media(sample_audio_data) - - assert "Async send error" in str(exc_info.value) diff --git a/tests/integrations/test_auth_client.py b/tests/integrations/test_auth_client.py deleted file mode 100644 index 22fbb99f..00000000 --- a/tests/integrations/test_auth_client.py +++ /dev/null @@ -1,597 +0,0 @@ -"""Integration tests for Auth client implementations.""" - -import pytest -import httpx -from unittest.mock import Mock, AsyncMock, patch - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment -from deepgram.types.grant_v1response import GrantV1Response - -from deepgram.auth.client import AuthClient, AsyncAuthClient -from deepgram.auth.v1.client import V1Client as AuthV1Client, AsyncV1Client as AuthAsyncV1Client -from deepgram.auth.v1.tokens.client import TokensClient, AsyncTokensClient - - -class TestAuthClient: - """Test cases for Auth Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_auth_client_initialization(self, sync_client_wrapper): - """Test AuthClient initialization.""" - client = AuthClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_async_auth_client_initialization(self, async_client_wrapper): - """Test AsyncAuthClient initialization.""" - client = AsyncAuthClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_auth_client_v1_property_lazy_loading(self, sync_client_wrapper): - """Test AuthClient v1 property lazy loading.""" - client = AuthClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, AuthV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_async_auth_client_v1_property_lazy_loading(self, async_client_wrapper): - """Test AsyncAuthClient v1 property lazy loading.""" - client = AsyncAuthClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, AuthAsyncV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_auth_client_raw_response_access(self, sync_client_wrapper): - """Test AuthClient raw response access.""" - client = AuthClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_auth_client_raw_response_access(self, async_client_wrapper): - """Test AsyncAuthClient raw response access.""" - client = AsyncAuthClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_auth_client_integration_with_main_client(self, mock_api_key): - """Test AuthClient integration with main DeepgramClient.""" - client = DeepgramClient(api_key=mock_api_key) - - auth_client = client.auth - assert auth_client is not None - assert isinstance(auth_client, AuthClient) - - def test_async_auth_client_integration_with_main_client(self, mock_api_key): - """Test AsyncAuthClient integration with main AsyncDeepgramClient.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - auth_client = client.auth - assert auth_client is not None - assert isinstance(auth_client, AsyncAuthClient) - - -class TestAuthV1Client: - """Test cases for Auth V1 Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_auth_v1_client_initialization(self, sync_client_wrapper): - """Test AuthV1Client initialization.""" - client = AuthV1Client(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._tokens is None # Lazy loaded - - def test_async_auth_v1_client_initialization(self, async_client_wrapper): - """Test AsyncAuthV1Client initialization.""" - client = AuthAsyncV1Client(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._tokens is None # Lazy loaded - - def test_auth_v1_client_tokens_property_lazy_loading(self, sync_client_wrapper): - """Test AuthV1Client tokens property lazy loading.""" - client = AuthV1Client(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._tokens is None - - # Access triggers lazy loading - tokens_client = client.tokens - assert client._tokens is not None - assert isinstance(tokens_client, TokensClient) - - # Subsequent access returns same instance - assert client.tokens is tokens_client - - def test_async_auth_v1_client_tokens_property_lazy_loading(self, async_client_wrapper): - """Test AsyncAuthV1Client tokens property lazy loading.""" - client = AuthAsyncV1Client(client_wrapper=async_client_wrapper) - - # Initially None - assert client._tokens is None - - # Access triggers lazy loading - tokens_client = client.tokens - assert client._tokens is not None - assert isinstance(tokens_client, AsyncTokensClient) - - # Subsequent access returns same instance - assert client.tokens is tokens_client - - def test_auth_v1_client_raw_response_access(self, sync_client_wrapper): - """Test AuthV1Client raw response access.""" - client = AuthV1Client(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_auth_v1_client_raw_response_access(self, async_client_wrapper): - """Test AsyncAuthV1Client raw response access.""" - client = AuthAsyncV1Client(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - -class TestTokensClient: - """Test cases for Tokens Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_grant_response(self): - """Mock grant response data.""" - return { - "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", - "expires_in": 30 - } - - def test_tokens_client_initialization(self, sync_client_wrapper): - """Test TokensClient initialization.""" - client = TokensClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_async_tokens_client_initialization(self, async_client_wrapper): - """Test AsyncTokensClient initialization.""" - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_tokens_client_raw_response_access(self, sync_client_wrapper): - """Test TokensClient raw response access.""" - client = TokensClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_tokens_client_raw_response_access(self, async_client_wrapper): - """Test AsyncTokensClient raw response access.""" - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') - def test_tokens_client_grant_default_ttl(self, mock_grant, sync_client_wrapper, mock_grant_response): - """Test TokensClient grant with default TTL.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = TokensClient(client_wrapper=sync_client_wrapper) - - result = client.grant() - - assert result is not None - assert isinstance(result, GrantV1Response) - assert result.access_token == mock_grant_response["access_token"] - assert result.expires_in == mock_grant_response["expires_in"] - - # Verify raw client was called with correct parameters - mock_grant.assert_called_once_with(ttl_seconds=..., request_options=None) - - @patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') - def test_tokens_client_grant_custom_ttl(self, mock_grant, sync_client_wrapper, mock_grant_response): - """Test TokensClient grant with custom TTL.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = TokensClient(client_wrapper=sync_client_wrapper) - - custom_ttl = 60 - result = client.grant(ttl_seconds=custom_ttl) - - assert result is not None - assert isinstance(result, GrantV1Response) - - # Verify raw client was called with custom TTL - mock_grant.assert_called_once_with(ttl_seconds=custom_ttl, request_options=None) - - @patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') - def test_tokens_client_grant_with_request_options(self, mock_grant, sync_client_wrapper, mock_grant_response): - """Test TokensClient grant with request options.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = TokensClient(client_wrapper=sync_client_wrapper) - - request_options = RequestOptions( - additional_headers={"X-Custom-Header": "test-value"} - ) - result = client.grant(ttl_seconds=45, request_options=request_options) - - assert result is not None - assert isinstance(result, GrantV1Response) - - # Verify raw client was called with request options - mock_grant.assert_called_once_with(ttl_seconds=45, request_options=request_options) - - @patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') - @pytest.mark.asyncio - async def test_async_tokens_client_grant_default_ttl(self, mock_grant, async_client_wrapper, mock_grant_response): - """Test AsyncTokensClient grant with default TTL.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - result = await client.grant() - - assert result is not None - assert isinstance(result, GrantV1Response) - assert result.access_token == mock_grant_response["access_token"] - assert result.expires_in == mock_grant_response["expires_in"] - - # Verify async raw client was called with correct parameters - mock_grant.assert_called_once_with(ttl_seconds=..., request_options=None) - - @patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') - @pytest.mark.asyncio - async def test_async_tokens_client_grant_custom_ttl(self, mock_grant, async_client_wrapper, mock_grant_response): - """Test AsyncTokensClient grant with custom TTL.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - custom_ttl = 120 - result = await client.grant(ttl_seconds=custom_ttl) - - assert result is not None - assert isinstance(result, GrantV1Response) - - # Verify async raw client was called with custom TTL - mock_grant.assert_called_once_with(ttl_seconds=custom_ttl, request_options=None) - - @patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') - @pytest.mark.asyncio - async def test_async_tokens_client_grant_with_request_options(self, mock_grant, async_client_wrapper, mock_grant_response): - """Test AsyncTokensClient grant with request options.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = GrantV1Response(**mock_grant_response) - mock_grant.return_value = mock_response - - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - request_options = RequestOptions( - additional_headers={"X-Custom-Header": "async-test-value"} - ) - result = await client.grant(ttl_seconds=90, request_options=request_options) - - assert result is not None - assert isinstance(result, GrantV1Response) - - # Verify async raw client was called with request options - mock_grant.assert_called_once_with(ttl_seconds=90, request_options=request_options) - - -class TestAuthIntegrationScenarios: - """Test Auth integration scenarios.""" - - def test_complete_auth_workflow_sync(self, mock_api_key): - """Test complete Auth workflow using sync client.""" - with patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') as mock_grant: - # Mock the response - mock_response = Mock() - mock_response.data = GrantV1Response( - access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", - expires_in=30 - ) - mock_grant.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested auth functionality - result = client.auth.v1.tokens.grant(ttl_seconds=60) - - assert result is not None - assert isinstance(result, GrantV1Response) - assert result.access_token is not None - assert result.expires_in == 30 - - # Verify the call was made - mock_grant.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_auth_workflow_async(self, mock_api_key): - """Test complete Auth workflow using async client.""" - with patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') as mock_grant: - # Mock the async response - mock_response = Mock() - mock_response.data = GrantV1Response( - access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", - expires_in=60 - ) - mock_grant.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested auth functionality - result = await client.auth.v1.tokens.grant(ttl_seconds=120) - - assert result is not None - assert isinstance(result, GrantV1Response) - assert result.access_token is not None - assert result.expires_in == 60 - - # Verify the call was made - mock_grant.assert_called_once() - - def test_auth_client_property_isolation(self, mock_api_key): - """Test that auth clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - auth1 = client1.auth - auth2 = client2.auth - - # Verify they are different instances - assert auth1 is not auth2 - assert auth1._client_wrapper is not auth2._client_wrapper - - # Verify nested clients are also different - tokens1 = auth1.v1.tokens - tokens2 = auth2.v1.tokens - - assert tokens1 is not tokens2 - - @pytest.mark.asyncio - async def test_mixed_sync_async_auth_clients(self, mock_api_key): - """Test mixing sync and async auth clients.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - sync_auth = sync_client.auth - async_auth = async_client.auth - - # Verify they are different types - assert type(sync_auth) != type(async_auth) - assert isinstance(sync_auth, AuthClient) - assert isinstance(async_auth, AsyncAuthClient) - - # Verify nested clients are also different types - sync_tokens = sync_auth.v1.tokens - async_tokens = async_auth.v1.tokens - - assert type(sync_tokens) != type(async_tokens) - assert isinstance(sync_tokens, TokensClient) - assert isinstance(async_tokens, AsyncTokensClient) - - -class TestAuthErrorHandling: - """Test Auth client error handling.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') - def test_tokens_client_api_error_handling(self, mock_grant, sync_client_wrapper): - """Test TokensClient API error handling.""" - # Mock an API error - mock_grant.side_effect = ApiError( - status_code=401, - headers={}, - body="Invalid API key" - ) - - client = TokensClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - client.grant() - - assert exc_info.value.status_code == 401 - assert "Invalid API key" in str(exc_info.value.body) - - @patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') - @pytest.mark.asyncio - async def test_async_tokens_client_api_error_handling(self, mock_grant, async_client_wrapper): - """Test AsyncTokensClient API error handling.""" - # Mock an API error - mock_grant.side_effect = ApiError( - status_code=403, - headers={}, - body="Insufficient permissions" - ) - - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - await client.grant() - - assert exc_info.value.status_code == 403 - assert "Insufficient permissions" in str(exc_info.value.body) - - @patch('deepgram.auth.v1.tokens.raw_client.RawTokensClient.grant') - def test_tokens_client_network_error_handling(self, mock_grant, sync_client_wrapper): - """Test TokensClient network error handling.""" - # Mock a network error - mock_grant.side_effect = httpx.ConnectError("Connection failed") - - client = TokensClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(httpx.ConnectError): - client.grant() - - @patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') - @pytest.mark.asyncio - async def test_async_tokens_client_network_error_handling(self, mock_grant, async_client_wrapper): - """Test AsyncTokensClient network error handling.""" - # Mock a network error - mock_grant.side_effect = httpx.ConnectError("Async connection failed") - - client = AsyncTokensClient(client_wrapper=async_client_wrapper) - - with pytest.raises(httpx.ConnectError): - await client.grant() - - def test_client_wrapper_integration(self, sync_client_wrapper): - """Test integration with client wrapper.""" - client = AuthClient(client_wrapper=sync_client_wrapper) - - # Test that client wrapper methods are accessible - assert hasattr(client._client_wrapper, 'get_environment') - assert hasattr(client._client_wrapper, 'get_headers') - assert hasattr(client._client_wrapper, 'api_key') - - environment = client._client_wrapper.get_environment() - headers = client._client_wrapper.get_headers() - api_key = client._client_wrapper.api_key - - assert environment is not None - assert isinstance(headers, dict) - assert api_key is not None diff --git a/tests/integrations/test_base_client.py b/tests/integrations/test_base_client.py deleted file mode 100644 index c293fb91..00000000 --- a/tests/integrations/test_base_client.py +++ /dev/null @@ -1,217 +0,0 @@ -"""Integration tests for BaseClient and AsyncBaseClient.""" - -import pytest -from unittest.mock import Mock, patch -import httpx - -from deepgram.base_client import BaseClient, AsyncBaseClient -from deepgram.environment import DeepgramClientEnvironment -from deepgram.core.api_error import ApiError - - -class TestBaseClient: - """Test cases for BaseClient.""" - - def test_base_client_initialization(self, mock_api_key): - """Test BaseClient initialization.""" - client = BaseClient(api_key=mock_api_key) - - assert client is not None - assert client._client_wrapper is not None - - def test_base_client_initialization_without_api_key(self): - """Test BaseClient initialization fails without API key.""" - with patch.dict('os.environ', {}, clear=True): - with pytest.raises(ApiError) as exc_info: - BaseClient() - - assert "api_key" in str(exc_info.value.body).lower() - - def test_base_client_with_environment(self, mock_api_key): - """Test BaseClient with specific environment.""" - client = BaseClient( - api_key=mock_api_key, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - assert client is not None - - def test_base_client_with_custom_headers(self, mock_api_key): - """Test BaseClient with custom headers.""" - headers = {"X-Custom-Header": "test-value"} - client = BaseClient(api_key=mock_api_key, headers=headers) - - assert client is not None - - def test_base_client_with_timeout(self, mock_api_key): - """Test BaseClient with custom timeout.""" - client = BaseClient(api_key=mock_api_key, timeout=120.0) - - assert client is not None - - def test_base_client_with_follow_redirects(self, mock_api_key): - """Test BaseClient with follow_redirects setting.""" - client = BaseClient(api_key=mock_api_key, follow_redirects=False) - - assert client is not None - - def test_base_client_with_custom_httpx_client(self, mock_api_key): - """Test BaseClient with custom httpx client.""" - custom_client = httpx.Client(timeout=30.0) - client = BaseClient(api_key=mock_api_key, httpx_client=custom_client) - - assert client is not None - - def test_base_client_property_access(self, mock_api_key): - """Test BaseClient property access.""" - client = BaseClient(api_key=mock_api_key) - - # Test that all properties are accessible - assert client.agent is not None - assert client.auth is not None - assert client.listen is not None - assert client.manage is not None - assert client.read is not None - assert client.self_hosted is not None - assert client.speak is not None - - def test_base_client_timeout_defaulting(self, mock_api_key): - """Test BaseClient timeout defaulting behavior.""" - # Test with no timeout specified - client = BaseClient(api_key=mock_api_key) - assert client is not None - - # Test with custom httpx client that has timeout - custom_client = httpx.Client(timeout=45.0) - client = BaseClient(api_key=mock_api_key, httpx_client=custom_client) - assert client is not None - - -class TestAsyncBaseClient: - """Test cases for AsyncBaseClient.""" - - def test_async_base_client_initialization(self, mock_api_key): - """Test AsyncBaseClient initialization.""" - client = AsyncBaseClient(api_key=mock_api_key) - - assert client is not None - assert client._client_wrapper is not None - - def test_async_base_client_initialization_without_api_key(self): - """Test AsyncBaseClient initialization fails without API key.""" - with patch.dict('os.environ', {}, clear=True): - with pytest.raises(ApiError) as exc_info: - AsyncBaseClient() - - assert "api_key" in str(exc_info.value.body).lower() - - def test_async_base_client_with_environment(self, mock_api_key): - """Test AsyncBaseClient with specific environment.""" - client = AsyncBaseClient( - api_key=mock_api_key, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - assert client is not None - - def test_async_base_client_with_custom_headers(self, mock_api_key): - """Test AsyncBaseClient with custom headers.""" - headers = {"X-Custom-Header": "test-value"} - client = AsyncBaseClient(api_key=mock_api_key, headers=headers) - - assert client is not None - - def test_async_base_client_with_timeout(self, mock_api_key): - """Test AsyncBaseClient with custom timeout.""" - client = AsyncBaseClient(api_key=mock_api_key, timeout=120.0) - - assert client is not None - - def test_async_base_client_with_follow_redirects(self, mock_api_key): - """Test AsyncBaseClient with follow_redirects setting.""" - client = AsyncBaseClient(api_key=mock_api_key, follow_redirects=False) - - assert client is not None - - def test_async_base_client_with_custom_httpx_client(self, mock_api_key): - """Test AsyncBaseClient with custom httpx async client.""" - custom_client = httpx.AsyncClient(timeout=30.0) - client = AsyncBaseClient(api_key=mock_api_key, httpx_client=custom_client) - - assert client is not None - - def test_async_base_client_property_access(self, mock_api_key): - """Test AsyncBaseClient property access.""" - client = AsyncBaseClient(api_key=mock_api_key) - - # Test that all properties are accessible - assert client.agent is not None - assert client.auth is not None - assert client.listen is not None - assert client.manage is not None - assert client.read is not None - assert client.self_hosted is not None - assert client.speak is not None - - def test_async_base_client_timeout_defaulting(self, mock_api_key): - """Test AsyncBaseClient timeout defaulting behavior.""" - # Test with no timeout specified - client = AsyncBaseClient(api_key=mock_api_key) - assert client is not None - - # Test with custom httpx client that has timeout - custom_client = httpx.AsyncClient(timeout=45.0) - client = AsyncBaseClient(api_key=mock_api_key, httpx_client=custom_client) - assert client is not None - - -class TestBaseClientWrapperIntegration: - """Test BaseClient integration with client wrapper.""" - - def test_sync_client_wrapper_creation(self, mock_api_key): - """Test synchronous client wrapper creation.""" - client = BaseClient(api_key=mock_api_key) - - wrapper = client._client_wrapper - assert wrapper is not None - assert hasattr(wrapper, 'get_environment') - assert hasattr(wrapper, 'get_headers') - assert hasattr(wrapper, 'api_key') - - def test_async_client_wrapper_creation(self, mock_api_key): - """Test asynchronous client wrapper creation.""" - client = AsyncBaseClient(api_key=mock_api_key) - - wrapper = client._client_wrapper - assert wrapper is not None - assert hasattr(wrapper, 'get_environment') - assert hasattr(wrapper, 'get_headers') - assert hasattr(wrapper, 'api_key') - - def test_client_wrapper_environment_access(self, mock_api_key): - """Test client wrapper environment access.""" - client = BaseClient( - api_key=mock_api_key, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - environment = client._client_wrapper.get_environment() - assert environment is not None - assert hasattr(environment, 'production') - - def test_client_wrapper_headers_access(self, mock_api_key): - """Test client wrapper headers access.""" - custom_headers = {"X-Test-Header": "test-value"} - client = BaseClient(api_key=mock_api_key, headers=custom_headers) - - headers = client._client_wrapper.get_headers() - assert isinstance(headers, dict) - assert "X-Test-Header" in headers - assert headers["X-Test-Header"] == "test-value" - - def test_client_wrapper_api_key_access(self, mock_api_key): - """Test client wrapper API key access.""" - client = BaseClient(api_key=mock_api_key) - - api_key = client._client_wrapper.api_key - assert api_key == mock_api_key diff --git a/tests/integrations/test_client.py b/tests/integrations/test_client.py deleted file mode 100644 index db465d93..00000000 --- a/tests/integrations/test_client.py +++ /dev/null @@ -1,450 +0,0 @@ -"""Integration tests for DeepgramClient and AsyncDeepgramClient.""" - -import pytest -from unittest.mock import Mock, patch, MagicMock -import uuid -from typing import Dict, Any - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.base_client import BaseClient, AsyncBaseClient -from deepgram.environment import DeepgramClientEnvironment -from deepgram.core.api_error import ApiError - - -class TestDeepgramClient: - """Test cases for DeepgramClient (synchronous).""" - - def test_client_initialization_with_api_key(self, mock_api_key): - """Test client initialization with API key.""" - client = DeepgramClient(api_key=mock_api_key) - - assert client is not None - assert isinstance(client, BaseClient) - assert hasattr(client, 'session_id') - assert isinstance(client.session_id, str) - - # Verify UUID format - try: - uuid.UUID(client.session_id) - except ValueError: - pytest.fail("session_id should be a valid UUID") - - def test_client_initialization_with_access_token(self, mock_access_token): - """Test client initialization with access token.""" - client = DeepgramClient(access_token=mock_access_token) - - assert client is not None - assert isinstance(client, BaseClient) - assert hasattr(client, 'session_id') - - def test_client_initialization_with_env_var(self, mock_env_vars, mock_api_key): - """Test client initialization using environment variable simulation.""" - # Since environment variable mocking is complex, test with direct API key - # This still validates the client initialization path - client = DeepgramClient(api_key=mock_api_key) - - assert client is not None - assert isinstance(client, BaseClient) - - def test_client_initialization_with_custom_headers(self, mock_api_key): - """Test client initialization with custom headers.""" - custom_headers = {"X-Custom-Header": "test-value"} - client = DeepgramClient(api_key=mock_api_key, headers=custom_headers) - - assert client is not None - assert isinstance(client, BaseClient) - - def test_client_initialization_with_environment(self, mock_api_key): - """Test client initialization with specific environment.""" - client = DeepgramClient( - api_key=mock_api_key, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - assert client is not None - assert isinstance(client, BaseClient) - - def test_client_initialization_without_credentials(self): - """Test client initialization fails without credentials.""" - with patch.dict('os.environ', {}, clear=True): - with pytest.raises(ApiError) as exc_info: - DeepgramClient() - - assert "api_key" in str(exc_info.value.body).lower() - - def test_client_properties_lazy_loading(self, mock_api_key): - """Test that client properties are lazily loaded.""" - client = DeepgramClient(api_key=mock_api_key) - - # Initially, properties should be None - assert client._agent is None - assert client._auth is None - assert client._listen is None - assert client._manage is None - assert client._read is None - assert client._self_hosted is None - assert client._speak is None - - # Access properties to trigger lazy loading - agent = client.agent - auth = client.auth - listen = client.listen - manage = client.manage - read = client.read - self_hosted = client.self_hosted - speak = client.speak - - # Properties should now be loaded - assert client._agent is not None - assert client._auth is not None - assert client._listen is not None - assert client._manage is not None - assert client._read is not None - assert client._self_hosted is not None - assert client._speak is not None - - # Subsequent access should return the same instances - assert client.agent is agent - assert client.auth is auth - assert client.listen is listen - assert client.manage is manage - assert client.read is read - assert client.self_hosted is self_hosted - assert client.speak is speak - - @patch('deepgram.client._setup_telemetry') - def test_client_telemetry_setup(self, mock_setup_telemetry, mock_api_key): - """Test that telemetry is properly set up.""" - mock_setup_telemetry.return_value = Mock() - - client = DeepgramClient( - api_key=mock_api_key, - telemetry_opt_out=False - ) - - mock_setup_telemetry.assert_called_once() - assert hasattr(client, '_telemetry_handler') - - def test_client_telemetry_opt_out(self, mock_api_key): - """Test that telemetry can be opted out.""" - client = DeepgramClient( - api_key=mock_api_key, - telemetry_opt_out=True - ) - - assert client._telemetry_handler is None - - @patch('deepgram.client._apply_bearer_authorization_override') - def test_client_bearer_token_override(self, mock_apply_bearer, mock_access_token, mock_api_key): - """Test that bearer token authorization is properly applied.""" - client = DeepgramClient(access_token=mock_access_token) - - mock_apply_bearer.assert_called_once_with( - client._client_wrapper, - mock_access_token - ) - - def test_client_session_id_in_headers(self, mock_api_key): - """Test that session ID is added to headers.""" - client = DeepgramClient(api_key=mock_api_key) - - headers = client._client_wrapper.get_headers() - assert "x-deepgram-session-id" in headers - assert headers["x-deepgram-session-id"] == client.session_id - - def test_client_with_custom_httpx_client(self, mock_api_key): - """Test client initialization with custom httpx client.""" - import httpx - custom_client = httpx.Client(timeout=30.0) - - client = DeepgramClient( - api_key=mock_api_key, - httpx_client=custom_client - ) - - assert client is not None - assert isinstance(client, BaseClient) - - def test_client_timeout_configuration(self, mock_api_key): - """Test client timeout configuration.""" - client = DeepgramClient( - api_key=mock_api_key, - timeout=120.0 - ) - - assert client is not None - assert isinstance(client, BaseClient) - - def test_client_follow_redirects_configuration(self, mock_api_key): - """Test client redirect configuration.""" - client = DeepgramClient( - api_key=mock_api_key, - follow_redirects=False - ) - - assert client is not None - assert isinstance(client, BaseClient) - - -class TestAsyncDeepgramClient: - """Test cases for AsyncDeepgramClient (asynchronous).""" - - def test_async_client_initialization_with_api_key(self, mock_api_key): - """Test async client initialization with API key.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - assert hasattr(client, 'session_id') - assert isinstance(client.session_id, str) - - # Verify UUID format - try: - uuid.UUID(client.session_id) - except ValueError: - pytest.fail("session_id should be a valid UUID") - - def test_async_client_initialization_with_access_token(self, mock_access_token): - """Test async client initialization with access token.""" - client = AsyncDeepgramClient(access_token=mock_access_token) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - assert hasattr(client, 'session_id') - - def test_async_client_initialization_with_env_var(self, mock_env_vars, mock_api_key): - """Test async client initialization using environment variable simulation.""" - # Since environment variable mocking is complex, test with direct API key - # This still validates the async client initialization path - client = AsyncDeepgramClient(api_key=mock_api_key) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - - def test_async_client_initialization_without_credentials(self): - """Test async client initialization fails without credentials.""" - with patch.dict('os.environ', {}, clear=True): - with pytest.raises(ApiError) as exc_info: - AsyncDeepgramClient() - - assert "api_key" in str(exc_info.value.body).lower() - - def test_async_client_properties_lazy_loading(self, mock_api_key): - """Test that async client properties are lazily loaded.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Initially, properties should be None - assert client._agent is None - assert client._auth is None - assert client._listen is None - assert client._manage is None - assert client._read is None - assert client._self_hosted is None - assert client._speak is None - - # Access properties to trigger lazy loading - agent = client.agent - auth = client.auth - listen = client.listen - manage = client.manage - read = client.read - self_hosted = client.self_hosted - speak = client.speak - - # Properties should now be loaded - assert client._agent is not None - assert client._auth is not None - assert client._listen is not None - assert client._manage is not None - assert client._read is not None - assert client._self_hosted is not None - assert client._speak is not None - - # Subsequent access should return the same instances - assert client.agent is agent - assert client.auth is auth - assert client.listen is listen - assert client.manage is manage - assert client.read is read - assert client.self_hosted is self_hosted - assert client.speak is speak - - @patch('deepgram.client._setup_async_telemetry') - def test_async_client_telemetry_setup(self, mock_setup_telemetry, mock_api_key): - """Test that async telemetry is properly set up.""" - mock_setup_telemetry.return_value = Mock() - - client = AsyncDeepgramClient( - api_key=mock_api_key, - telemetry_opt_out=False - ) - - mock_setup_telemetry.assert_called_once() - assert hasattr(client, '_telemetry_handler') - - def test_async_client_telemetry_opt_out(self, mock_api_key): - """Test that async telemetry can be opted out.""" - client = AsyncDeepgramClient( - api_key=mock_api_key, - telemetry_opt_out=True - ) - - assert client._telemetry_handler is None - - @patch('deepgram.client._apply_bearer_authorization_override') - def test_async_client_bearer_token_override(self, mock_apply_bearer, mock_access_token): - """Test that bearer token authorization is properly applied for async client.""" - client = AsyncDeepgramClient(access_token=mock_access_token) - - mock_apply_bearer.assert_called_once_with( - client._client_wrapper, - mock_access_token - ) - - def test_async_client_session_id_in_headers(self, mock_api_key): - """Test that session ID is added to headers for async client.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - headers = client._client_wrapper.get_headers() - assert "x-deepgram-session-id" in headers - assert headers["x-deepgram-session-id"] == client.session_id - - def test_async_client_with_custom_httpx_client(self, mock_api_key): - """Test async client initialization with custom httpx client.""" - import httpx - custom_client = httpx.AsyncClient(timeout=30.0) - - client = AsyncDeepgramClient( - api_key=mock_api_key, - httpx_client=custom_client - ) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - - def test_async_client_timeout_configuration(self, mock_api_key): - """Test async client timeout configuration.""" - client = AsyncDeepgramClient( - api_key=mock_api_key, - timeout=120.0 - ) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - - def test_async_client_follow_redirects_configuration(self, mock_api_key): - """Test async client redirect configuration.""" - client = AsyncDeepgramClient( - api_key=mock_api_key, - follow_redirects=False - ) - - assert client is not None - assert isinstance(client, AsyncBaseClient) - - -class TestClientUtilityFunctions: - """Test utility functions used by clients.""" - - def test_create_telemetry_context(self): - """Test telemetry context creation.""" - from deepgram.client import _create_telemetry_context - - with patch('deepgram.client.sys.version', '3.9.0 (default, Oct 9 2020, 15:07:18)'), \ - patch('deepgram.client.platform.system', return_value='Linux'), \ - patch('deepgram.client.platform.machine', return_value='x86_64'): - - session_id = str(uuid.uuid4()) - context = _create_telemetry_context(session_id) - - assert context["package_name"] == "python-sdk" - assert context["language"] == "python" - assert context["runtime_version"] == "python 3.9.0" - assert context["os"] == "linux" - assert context["arch"] == "x86_64" - assert context["session_id"] == session_id - assert "package_version" in context - assert "environment" in context - - def test_create_telemetry_context_fallback(self): - """Test telemetry context creation with fallback.""" - from deepgram.client import _create_telemetry_context - - with patch('deepgram.client.sys.version', side_effect=Exception("Test error")): - session_id = str(uuid.uuid4()) - context = _create_telemetry_context(session_id) - - assert context["package_name"] == "python-sdk" - assert context["language"] == "python" - assert context["session_id"] == session_id - - def test_setup_telemetry(self, mock_api_key): - """Test telemetry setup.""" - from deepgram.client import _setup_telemetry - from deepgram.core.client_wrapper import SyncClientWrapper - - with patch('deepgram.extensions.telemetry.batching_handler.BatchingTelemetryHandler') as mock_handler_class: - mock_handler = Mock() - mock_handler_class.return_value = mock_handler - - client_wrapper = SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - session_id = str(uuid.uuid4()) - result = _setup_telemetry( - session_id=session_id, - telemetry_opt_out=False, - telemetry_handler=None, - client_wrapper=client_wrapper - ) - - assert result is not None # The actual handler is created, not the mock - # The handler class may not be called directly due to internal implementation - # Just verify that a result was returned - - def test_setup_telemetry_opt_out(self, mock_api_key): - """Test telemetry setup with opt-out.""" - from deepgram.client import _setup_telemetry - from deepgram.core.client_wrapper import SyncClientWrapper - - client_wrapper = SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - session_id = str(uuid.uuid4()) - result = _setup_telemetry( - session_id=session_id, - telemetry_opt_out=True, - telemetry_handler=None, - client_wrapper=client_wrapper - ) - - assert result is None - - def test_apply_bearer_authorization_override(self, mock_api_key): - """Test bearer authorization override.""" - from deepgram.client import _apply_bearer_authorization_override - from deepgram.core.client_wrapper import SyncClientWrapper - - client_wrapper = SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - bearer_token = "test_bearer_token" - _apply_bearer_authorization_override(client_wrapper, bearer_token) - - headers = client_wrapper.get_headers() - assert headers["Authorization"] == f"bearer {bearer_token}" diff --git a/tests/integrations/test_integration_scenarios.py b/tests/integrations/test_integration_scenarios.py deleted file mode 100644 index fc442d66..00000000 --- a/tests/integrations/test_integration_scenarios.py +++ /dev/null @@ -1,286 +0,0 @@ -"""End-to-end integration test scenarios across multiple products.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch, MagicMock -import json -import asyncio - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.events import EventType - - -class TestMultiProductIntegrationScenarios: - """Test integration scenarios that span multiple Deepgram products.""" - - @patch('deepgram.listen.v1.socket_client.V1SocketClient._handle_json_message') - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_listen_to_speak_workflow(self, mock_websocket_connect, mock_handle_json, mock_api_key, sample_audio_data, sample_text): - """Test workflow from Listen transcription to Speak TTS.""" - # Mock Listen websocket connection - mock_listen_ws = Mock() - mock_listen_ws.send = Mock() - mock_listen_ws.recv = Mock(side_effect=[ - '{"type": "Results", "channel": {"alternatives": [{"transcript": "Hello world"}]}}' - ]) - mock_listen_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Results", "channel": {"alternatives": [{"transcript": "Hello world"}]}}' - ])) - mock_listen_ws.__enter__ = Mock(return_value=mock_listen_ws) - mock_listen_ws.__exit__ = Mock(return_value=None) - - # Mock Speak websocket connection - mock_speak_ws = Mock() - mock_speak_ws.send = Mock() - mock_speak_ws.recv = Mock(side_effect=[b'\x00\x01\x02\x03']) # Audio chunk - mock_speak_ws.__iter__ = Mock(return_value=iter([b'\x00\x01\x02\x03'])) - mock_speak_ws.__enter__ = Mock(return_value=mock_speak_ws) - mock_speak_ws.__exit__ = Mock(return_value=None) - - # Alternate between Listen and Speak connections - mock_websocket_connect.side_effect = [mock_listen_ws, mock_speak_ws] - - # Mock the JSON message handler to return simple objects - mock_handle_json.return_value = {"type": "Results", "channel": {"alternatives": [{"transcript": "Hello world"}]}} - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Step 1: Transcribe audio with Listen - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as listen_conn: - listen_conn.send_media(sample_audio_data) - transcription_result = listen_conn.recv() - assert transcription_result is not None - - # Step 2: Generate speech from transcription with Speak - with client.speak.v1.with_raw_response.connect(model="aura-asteria-en") as speak_conn: - speak_conn.send_text(Mock()) # Would use transcription text - audio_result = speak_conn.recv() - assert audio_result is not None - - # Verify both connections were established - assert mock_websocket_connect.call_count == 2 - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_agent_with_listen_speak_integration(self, mock_websocket_connect, mock_api_key, sample_audio_data): - """Test Agent integration with Listen and Speak capabilities.""" - # Mock Agent websocket connection - mock_agent_ws = Mock() - mock_agent_ws.send = Mock() - mock_agent_ws.recv = Mock(side_effect=[ - '{"type": "Welcome", "request_id": "agent-123"}', - '{"type": "ConversationText", "role": "assistant", "content": "How can I help you?"}', - b'\x00\x01\x02\x03' # Generated speech audio - ]) - mock_agent_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Welcome", "request_id": "agent-123"}', - '{"type": "ConversationText", "role": "assistant", "content": "How can I help you?"}', - b'\x00\x01\x02\x03' - ])) - mock_agent_ws.__enter__ = Mock(return_value=mock_agent_ws) - mock_agent_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_agent_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect to Agent (which internally uses Listen and Speak) - with client.agent.v1.with_raw_response.connect() as agent_conn: - # Send initial settings - agent_conn.send_settings(Mock()) - - # Send user audio (Listen functionality) - agent_conn.send_media(sample_audio_data) - - # Receive welcome message - welcome = agent_conn.recv() - assert welcome is not None - - # Receive conversation response - response = agent_conn.recv() - assert response is not None - - # Receive generated audio (Speak functionality) - audio = agent_conn.recv() - assert audio is not None - - # Verify connection was established - mock_websocket_connect.assert_called_once() - - def test_multi_client_concurrent_usage(self, mock_api_key): - """Test concurrent usage of multiple product clients.""" - client = DeepgramClient(api_key=mock_api_key) - - # Access multiple product clients concurrently - listen_client = client.listen - speak_client = client.speak - agent_client = client.agent - auth_client = client.auth - manage_client = client.manage - read_client = client.read - self_hosted_client = client.self_hosted - - # Verify all clients are properly initialized - assert listen_client is not None - assert speak_client is not None - assert agent_client is not None - assert auth_client is not None - assert manage_client is not None - assert read_client is not None - assert self_hosted_client is not None - - # Verify they're all different instances - clients = [listen_client, speak_client, agent_client, auth_client, - manage_client, read_client, self_hosted_client] - for i, client1 in enumerate(clients): - for j, client2 in enumerate(clients): - if i != j: - assert client1 is not client2 - - @pytest.mark.asyncio - async def test_async_multi_product_workflow(self, mock_api_key): - """Test async workflow across multiple products.""" - with patch('deepgram.auth.v1.tokens.raw_client.AsyncRawTokensClient.grant') as mock_grant, \ - patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') as mock_analyze: - - # Mock auth token generation - from deepgram.types.grant_v1response import GrantV1Response - mock_auth_response = Mock() - mock_auth_response.data = GrantV1Response(access_token="temp_token", expires_in=3600) - mock_grant.return_value = mock_auth_response - - # Mock text analysis - from deepgram.types.read_v1response import ReadV1Response - from deepgram.types.read_v1response_metadata import ReadV1ResponseMetadata - from deepgram.types.read_v1response_results import ReadV1ResponseResults - mock_read_response = Mock() - mock_read_response.data = ReadV1Response( - metadata=ReadV1ResponseMetadata(), - results=ReadV1ResponseResults() - ) - mock_analyze.return_value = mock_read_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Step 1: Generate temporary token - token_result = await client.auth.v1.tokens.grant(ttl_seconds=3600) - assert token_result is not None - assert isinstance(token_result, GrantV1Response) - - # Step 2: Analyze text - from deepgram.requests.read_v1request_text import ReadV1RequestTextParams - text_request = ReadV1RequestTextParams(text="Sample text for analysis") - analysis_result = await client.read.v1.text.analyze( - request=text_request, - sentiment=True, - topics=True - ) - assert analysis_result is not None - assert isinstance(analysis_result, ReadV1Response) - - # Verify both calls were made - mock_grant.assert_called_once() - mock_analyze.assert_called_once() - - def test_client_isolation_across_products(self, mock_api_key): - """Test that product clients maintain proper isolation.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - # Verify top-level product clients are isolated - assert client1.listen is not client2.listen - assert client1.speak is not client2.speak - assert client1.agent is not client2.agent - assert client1.auth is not client2.auth - assert client1.manage is not client2.manage - assert client1.read is not client2.read - assert client1.self_hosted is not client2.self_hosted - - # Verify nested clients are also isolated - assert client1.listen.v1 is not client2.listen.v1 - assert client1.speak.v1 is not client2.speak.v1 - assert client1.agent.v1 is not client2.agent.v1 - assert client1.auth.v1 is not client2.auth.v1 - assert client1.manage.v1 is not client2.manage.v1 - assert client1.read.v1 is not client2.read.v1 - assert client1.self_hosted.v1 is not client2.self_hosted.v1 - - @pytest.mark.asyncio - async def test_mixed_sync_async_multi_product(self, mock_api_key): - """Test mixing synchronous and asynchronous clients across products.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - # Verify sync and async clients are different types - assert type(sync_client.listen) != type(async_client.listen) - assert type(sync_client.speak) != type(async_client.speak) - assert type(sync_client.agent) != type(async_client.agent) - assert type(sync_client.auth) != type(async_client.auth) - assert type(sync_client.manage) != type(async_client.manage) - assert type(sync_client.read) != type(async_client.read) - assert type(sync_client.self_hosted) != type(async_client.self_hosted) - - # Verify nested clients are also different types - assert type(sync_client.listen.v1) != type(async_client.listen.v1) - assert type(sync_client.speak.v1) != type(async_client.speak.v1) - assert type(sync_client.agent.v1) != type(async_client.agent.v1) - assert type(sync_client.auth.v1) != type(async_client.auth.v1) - assert type(sync_client.manage.v1) != type(async_client.manage.v1) - assert type(sync_client.read.v1) != type(async_client.read.v1) - assert type(sync_client.self_hosted.v1) != type(async_client.self_hosted.v1) - - -class TestErrorHandlingScenarios: - """Test error handling across integration scenarios.""" - - def test_connection_failure_handling(self, mock_api_key): - """Test connection failure handling.""" - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.side_effect = ConnectionError("Network unavailable") - - client = DeepgramClient(api_key=mock_api_key) - - # Test that connection failures are properly handled across products - with pytest.raises(ConnectionError): - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - pass - - with pytest.raises(ConnectionError): - with client.speak.v1.with_raw_response.connect() as connection: - pass - - with pytest.raises(ConnectionError): - with client.agent.v1.with_raw_response.connect() as connection: - pass - - def test_message_processing_error_handling(self, mock_api_key): - """Test message processing error handling.""" - with patch('websockets.sync.client.connect') as mock_connect: - # Mock websocket that sends invalid JSON - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=['{"invalid": json}']) - mock_ws.__iter__ = Mock(return_value=iter(['{"invalid": json}'])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_connect.return_value = mock_ws - - client = DeepgramClient(api_key=mock_api_key) - - # Test that invalid JSON raises JSONDecodeError - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - with pytest.raises(json.JSONDecodeError): - connection.recv() - - @pytest.mark.asyncio - async def test_async_connection_failure_handling(self, mock_api_key): - """Test async connection failure handling.""" - with patch('deepgram.listen.v1.raw_client.websockets_client_connect') as mock_connect: - mock_connect.side_effect = ConnectionError("Async network unavailable") - - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Test that async connection failures are properly handled - with pytest.raises(ConnectionError): - async with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - pass \ No newline at end of file diff --git a/tests/integrations/test_listen_client.py b/tests/integrations/test_listen_client.py deleted file mode 100644 index 34a22d26..00000000 --- a/tests/integrations/test_listen_client.py +++ /dev/null @@ -1,1226 +0,0 @@ -"""Integration tests for Listen client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch, MagicMock -from contextlib import contextmanager, asynccontextmanager -import httpx -import websockets.exceptions -import json -import asyncio -from json.decoder import JSONDecodeError - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.core.events import EventType -from deepgram.environment import DeepgramClientEnvironment - -# Import Listen clients -from deepgram.listen.client import ListenClient, AsyncListenClient -from deepgram.listen.v1.client import V1Client as ListenV1Client, AsyncV1Client as ListenAsyncV1Client -from deepgram.listen.v2.client import V2Client as ListenV2Client, AsyncV2Client as ListenAsyncV2Client - -# Import Listen raw clients -from deepgram.listen.v1.raw_client import RawV1Client as ListenRawV1Client, AsyncRawV1Client as ListenAsyncRawV1Client -from deepgram.listen.v2.raw_client import RawV2Client as ListenRawV2Client, AsyncRawV2Client as ListenAsyncRawV2Client - -# Import Listen socket clients -from deepgram.listen.v1.socket_client import V1SocketClient as ListenV1SocketClient, AsyncV1SocketClient as ListenAsyncV1SocketClient -from deepgram.listen.v2.socket_client import V2SocketClient as ListenV2SocketClient, AsyncV2SocketClient as ListenAsyncV2SocketClient - -# Import Listen media clients -from deepgram.listen.v1.media.client import MediaClient, AsyncMediaClient - -# Import socket message types -from deepgram.extensions.types.sockets import ( - ListenV1ControlMessage, - ListenV1MediaMessage, - ListenV2ControlMessage, - ListenV2MediaMessage, -) - -# Import request and response types for mocking -from deepgram.types.listen_v1response import ListenV1Response -from deepgram.listen.v1.media.types.media_transcribe_request_callback_method import MediaTranscribeRequestCallbackMethod -from deepgram.listen.v1.media.types.media_transcribe_request_summarize import MediaTranscribeRequestSummarize -from deepgram.listen.v1.media.types.media_transcribe_request_custom_topic_mode import MediaTranscribeRequestCustomTopicMode -from deepgram.listen.v1.media.types.media_transcribe_request_custom_intent_mode import MediaTranscribeRequestCustomIntentMode -from deepgram.listen.v1.media.types.media_transcribe_request_encoding import MediaTranscribeRequestEncoding -from deepgram.listen.v1.media.types.media_transcribe_request_model import MediaTranscribeRequestModel -from deepgram.listen.v1.media.types.media_transcribe_request_version import MediaTranscribeRequestVersion - - -class TestListenClient: - """Test cases for Listen Client.""" - - def test_listen_client_initialization(self, mock_api_key): - """Test ListenClient initialization.""" - client = DeepgramClient(api_key=mock_api_key).listen - assert client is not None - assert hasattr(client, 'v1') - assert hasattr(client, 'v2') - - def test_async_listen_client_initialization(self, mock_api_key): - """Test AsyncListenClient initialization.""" - client = AsyncDeepgramClient(api_key=mock_api_key).listen - assert client is not None - assert hasattr(client, 'v1') - assert hasattr(client, 'v2') - - def test_listen_client_with_raw_response(self, mock_api_key): - """Test ListenClient with_raw_response property.""" - client = DeepgramClient(api_key=mock_api_key).listen - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - def test_async_listen_client_with_raw_response(self, mock_api_key): - """Test AsyncListenClient with_raw_response property.""" - client = AsyncDeepgramClient(api_key=mock_api_key).listen - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - -class TestListenRawV1Client: - """Test cases for Listen V1 Raw Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_sync_raw_client_initialization(self, sync_client_wrapper): - """Test synchronous raw client initialization.""" - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._client_wrapper is sync_client_wrapper - - def test_async_raw_client_initialization(self, async_client_wrapper): - """Test asynchronous raw client initialization.""" - client = ListenAsyncRawV1Client(client_wrapper=async_client_wrapper) - assert client is not None - assert client._client_wrapper is async_client_wrapper - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_sync_connect_success(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test successful synchronous WebSocket connection.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - with client.connect(model="nova-2-general") as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_sync_connect_with_all_parameters(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test synchronous connection with all parameters.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - with client.connect( - model="nova-2-general", - encoding="linear16", - sample_rate="16000", - channels="1", - language="en-US", - punctuate="true", - smart_format="true", - diarize="true", - interim_results="true", - utterance_end_ms="1000", - vad_events="true", - authorization="Bearer test_token" - ) as connection: - assert connection is not None - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_sync_connect_invalid_credentials(self, mock_websocket_connect, sync_client_wrapper): - """Test synchronous connection with invalid credentials.""" - mock_websocket_connect.side_effect = websockets.exceptions.InvalidStatusCode( - status_code=401, headers={} - ) - - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - with client.connect(model="nova-2-general") as connection: - pass - - assert exc_info.value.status_code == 401 - assert "invalid credentials" in exc_info.value.body.lower() - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_sync_connect_unexpected_error(self, mock_websocket_connect, sync_client_wrapper): - """Test synchronous connection with unexpected error.""" - mock_websocket_connect.side_effect = Exception("Unexpected connection error") - - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - with pytest.raises(Exception) as exc_info: - with client.connect(model="nova-2-general") as connection: - pass - - assert "Unexpected connection error" in str(exc_info.value) - - @patch('deepgram.listen.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_connect_success(self, mock_websocket_connect, async_client_wrapper, mock_async_websocket): - """Test successful asynchronous WebSocket connection.""" - mock_websocket_connect.return_value.__aenter__ = AsyncMock(return_value=mock_async_websocket) - mock_websocket_connect.return_value.__aexit__ = AsyncMock(return_value=None) - - client = ListenAsyncRawV1Client(client_wrapper=async_client_wrapper) - - async with client.connect(model="nova-2-general") as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - @patch('deepgram.listen.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_connect_with_all_parameters(self, mock_websocket_connect, async_client_wrapper, mock_async_websocket): - """Test asynchronous connection with all parameters.""" - mock_websocket_connect.return_value.__aenter__ = AsyncMock(return_value=mock_async_websocket) - mock_websocket_connect.return_value.__aexit__ = AsyncMock(return_value=None) - - client = ListenAsyncRawV1Client(client_wrapper=async_client_wrapper) - - async with client.connect( - model="nova-2-general", - encoding="linear16", - sample_rate="16000", - channels="1" - ) as connection: - assert connection is not None - - @patch('deepgram.listen.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_connect_invalid_credentials(self, mock_websocket_connect, async_client_wrapper): - """Test asynchronous connection with invalid credentials.""" - mock_websocket_connect.side_effect = websockets.exceptions.InvalidStatusCode( - status_code=401, headers={} - ) - - client = ListenAsyncRawV1Client(client_wrapper=async_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - async with client.connect(model="nova-2-general") as connection: - pass - - assert exc_info.value.status_code == 401 - assert "invalid credentials" in exc_info.value.body.lower() - - def test_sync_query_params_construction(self, sync_client_wrapper): - """Test query parameters are properly constructed.""" - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - # Mock the websocket connection to capture the URL - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.return_value.__enter__ = Mock(return_value=Mock()) - mock_connect.return_value.__exit__ = Mock(return_value=None) - - try: - with client.connect( - model="nova-2-general", - encoding="linear16", - sample_rate="16000", - punctuate="true" - ) as connection: - pass - except: - pass # We just want to check the URL construction - - # Verify the URL was constructed with query parameters - call_args = mock_connect.call_args - if call_args and len(call_args[0]) > 0: - url = call_args[0][0] - assert "model=nova-2-general" in url - assert "encoding=linear16" in url - assert "sample_rate=16000" in url - assert "punctuate=true" in url - - def test_sync_headers_construction(self, sync_client_wrapper): - """Test headers are properly constructed.""" - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - # Mock the websocket connection to capture headers - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.return_value.__enter__ = Mock(return_value=Mock()) - mock_connect.return_value.__exit__ = Mock(return_value=None) - - try: - with client.connect( - model="nova-2-general", - authorization="Bearer custom_token" - ) as connection: - pass - except: - pass # We just want to check the headers construction - - # Verify headers were passed - call_args = mock_connect.call_args - if call_args and 'additional_headers' in call_args[1]: - headers = call_args[1]['additional_headers'] - assert 'Authorization' in headers - - def test_sync_request_options(self, sync_client_wrapper): - """Test request options are properly handled.""" - client = ListenRawV1Client(client_wrapper=sync_client_wrapper) - - request_options = RequestOptions( - additional_headers={"Custom-Header": "custom-value"}, - timeout_in_seconds=30.0 - ) - - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.return_value.__enter__ = Mock(return_value=Mock()) - mock_connect.return_value.__exit__ = Mock(return_value=None) - - try: - with client.connect( - model="nova-2-general", - request_options=request_options - ) as connection: - pass - except: - pass # We just want to check the options handling - - # Verify request options were applied - call_args = mock_connect.call_args - assert call_args is not None - - -class TestListenRawV2Client: - """Test cases for Listen V2 Raw Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - def test_sync_raw_v2_client_initialization(self, sync_client_wrapper): - """Test synchronous raw V2 client initialization.""" - client = ListenRawV2Client(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._client_wrapper is sync_client_wrapper - - @patch('deepgram.listen.v2.raw_client.websockets_sync_client.connect') - def test_sync_v2_connect_success(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test successful V2 synchronous WebSocket connection.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = ListenRawV2Client(client_wrapper=sync_client_wrapper) - - with client.connect(model="nova-2-general", encoding="linear16", sample_rate="16000") as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - -class TestListenV1SocketClient: - """Test cases for Listen V1 Socket Client.""" - - @pytest.fixture - def mock_sync_websocket(self): - """Create a mock synchronous websocket.""" - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock() - mock_ws.__iter__ = Mock(return_value=iter([])) - return mock_ws - - @pytest.fixture - def mock_async_websocket(self): - """Create a mock asynchronous websocket.""" - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock() - mock_ws.__aiter__ = AsyncMock(return_value=iter([])) - return mock_ws - - def test_sync_socket_client_initialization(self, mock_sync_websocket): - """Test synchronous socket client initialization.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - assert client is not None - assert client._websocket is mock_sync_websocket - - def test_async_socket_client_initialization(self, mock_async_websocket): - """Test asynchronous socket client initialization.""" - client = ListenAsyncV1SocketClient(websocket=mock_async_websocket) - assert client is not None - assert client._websocket is mock_async_websocket - - def test_is_binary_message_detection(self, mock_sync_websocket): - """Test binary message detection.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - # Test with bytes - assert client._is_binary_message(b'binary data') is True - - # Test with bytearray - assert client._is_binary_message(bytearray(b'binary data')) is True - - # Test with string - assert client._is_binary_message('text data') is False - - # Test with dict - assert client._is_binary_message({'key': 'value'}) is False - - def test_handle_binary_message(self, mock_sync_websocket, sample_audio_data): - """Test binary message handling.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - # Test handling binary audio data - result = client._handle_binary_message(sample_audio_data) - assert result == sample_audio_data - - def test_handle_json_message_success(self, mock_sync_websocket): - """Test successful JSON message handling.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - json_message = '{"type": "Metadata", "request_id": "test-123", "sha256": "abc123", "created": "2023-01-01T00:00:00Z", "duration": 5.0, "channels": 1}' - result = client._handle_json_message(json_message) - - assert result is not None - assert result.type == "Metadata" - assert result.request_id == "test-123" - assert result.sha256 == "abc123" - - def test_handle_json_message_invalid(self, mock_sync_websocket): - """Test invalid JSON message handling.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - invalid_json = '{"invalid": json}' - - # Should raise JSONDecodeError for invalid JSON - with pytest.raises(json.JSONDecodeError): - client._handle_json_message(invalid_json) - - @patch('deepgram.listen.v1.socket_client.V1SocketClient._handle_json_message') - def test_sync_iteration(self, mock_handle_json, mock_sync_websocket): - """Test synchronous iteration over websocket messages.""" - mock_sync_websocket.__iter__ = Mock(return_value=iter([ - '{"type": "Metadata", "request_id": "test-1"}', - b'\x00\x01\x02\x03', - '{"type": "Results", "channel_index": [0]}' - ])) - - # Mock the JSON handling to return simple objects - mock_handle_json.side_effect = [ - {"type": "Metadata", "request_id": "test-1"}, - {"type": "Results", "channel_index": [0]} - ] - - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - messages = list(client) - assert len(messages) == 3 - assert messages[0]["type"] == "Metadata" - assert messages[1] == b'\x00\x01\x02\x03' - assert messages[2]["type"] == "Results" - - @patch('deepgram.listen.v1.socket_client.AsyncV1SocketClient._handle_json_message') - @pytest.mark.asyncio - async def test_async_iteration(self, mock_handle_json, mock_async_websocket): - """Test asynchronous iteration over websocket messages.""" - async def mock_aiter(): - yield '{"type": "Metadata", "request_id": "test-1"}' - yield b'\x00\x01\x02\x03' - yield '{"type": "Results", "channel_index": [0]}' - - mock_async_websocket.__aiter__ = Mock(return_value=mock_aiter()) - - # Mock the JSON message handler to return simple objects - mock_handle_json.side_effect = [ - {"type": "Metadata", "request_id": "test-1"}, - {"type": "Results", "channel_index": [0]} - ] - - client = ListenAsyncV1SocketClient(websocket=mock_async_websocket) - - messages = [] - async for message in client: - messages.append(message) - - assert len(messages) == 3 - assert messages[0]["type"] == "Metadata" - assert messages[1] == b'\x00\x01\x02\x03' - assert messages[2]["type"] == "Results" - - def test_sync_recv_binary(self, mock_sync_websocket, sample_audio_data): - """Test synchronous receive of binary data.""" - mock_sync_websocket.recv.return_value = sample_audio_data - - client = ListenV1SocketClient(websocket=mock_sync_websocket) - result = client.recv() - - assert result == sample_audio_data - mock_sync_websocket.recv.assert_called_once() - - def test_sync_recv_json(self, mock_sync_websocket): - """Test synchronous receive of JSON data.""" - json_message = '{"type": "Metadata", "request_id": "test-123", "sha256": "abc123", "created": "2023-01-01T00:00:00Z", "duration": 5.0, "channels": 1}' - mock_sync_websocket.recv.return_value = json_message - - client = ListenV1SocketClient(websocket=mock_sync_websocket) - result = client.recv() - - assert result.type == "Metadata" - assert result.request_id == "test-123" - mock_sync_websocket.recv.assert_called_once() - - @pytest.mark.asyncio - async def test_async_recv_binary(self, mock_async_websocket, sample_audio_data): - """Test asynchronous receive of binary data.""" - mock_async_websocket.recv.return_value = sample_audio_data - - client = ListenAsyncV1SocketClient(websocket=mock_async_websocket) - result = await client.recv() - - assert result == sample_audio_data - mock_async_websocket.recv.assert_called_once() - - def test_sync_send_binary(self, mock_sync_websocket, sample_audio_data): - """Test synchronous sending of binary data.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - client.send_media(sample_audio_data) - - mock_sync_websocket.send.assert_called_once_with(sample_audio_data) - - def test_sync_send_dict(self, mock_sync_websocket): - """Test synchronous sending of dictionary data.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - message_dict = {"type": "Metadata", "request_id": "test-123"} - - control_message = ListenV1ControlMessage(type="KeepAlive") - client.send_control(control_message) - - mock_sync_websocket.send.assert_called_once() - # Verify JSON was sent - call_args = mock_sync_websocket.send.call_args[0] - sent_data = call_args[0] - assert isinstance(sent_data, str) - parsed = json.loads(sent_data) - assert parsed["type"] == "KeepAlive" - - def test_sync_send_string(self, mock_sync_websocket): - """Test synchronous sending of string data.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - message_str = '{"type": "KeepAlive"}' - - # For string data, we'll use the private _send method for testing - client._send(message_str) - - mock_sync_websocket.send.assert_called_once_with(message_str) - - def test_sync_send_pydantic_model(self, mock_sync_websocket): - """Test synchronous sending of Pydantic model.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - control_message = ListenV1ControlMessage(type="KeepAlive") - client.send_control(control_message) - - mock_sync_websocket.send.assert_called_once() - - def test_sync_send_control(self, mock_sync_websocket): - """Test synchronous control message sending.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - # Mock control message - mock_control_msg = Mock(spec=ListenV1ControlMessage) - mock_control_msg.dict.return_value = {"type": "KeepAlive"} - - client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_sync_websocket.send.assert_called_once() - - def test_sync_send_media(self, mock_sync_websocket, sample_audio_data): - """Test synchronous media message sending.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - client.send_media(sample_audio_data) - - mock_sync_websocket.send.assert_called_once_with(sample_audio_data) - - @patch('deepgram.listen.v1.socket_client.V1SocketClient._handle_json_message') - def test_sync_start_listening_with_event_handler(self, mock_handle_json, mock_sync_websocket): - """Test synchronous start_listening with event handler.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - # Mock websocket iteration - mock_sync_websocket.__iter__ = Mock(return_value=iter([ - '{"type": "Metadata", "request_id": "test-123"}', - '{"type": "Results", "channel_index": [0], "is_final": true}' - ])) - - # Mock the JSON message handler to return simple objects - mock_handle_json.side_effect = [ - {"type": "Metadata", "request_id": "test-123"}, - {"type": "Results", "channel_index": [0], "is_final": True} - ] - - # Mock event handler - event_handler = Mock() - client.on(EventType.OPEN, event_handler) - client.on(EventType.MESSAGE, event_handler) - client.on(EventType.CLOSE, event_handler) - - # Start listening (this will iterate through the mock messages) - client.start_listening() - - # Verify event handler was called - assert event_handler.call_count >= 1 - - def test_sync_start_listening_with_error(self, mock_sync_websocket): - """Test synchronous start_listening with error.""" - client = ListenV1SocketClient(websocket=mock_sync_websocket) - - # Mock websocket to raise a websocket exception - from websockets.exceptions import WebSocketException - mock_sync_websocket.__iter__ = Mock(side_effect=WebSocketException("Connection error")) - - # Mock error handler - error_handler = Mock() - client.on(EventType.ERROR, error_handler) - - # Start listening (this should trigger error) - client.start_listening() - - # Verify error handler was called - error_handler.assert_called() - - -class TestListenV2SocketClient: - """Test cases for Listen V2 Socket Client.""" - - def test_v2_sync_socket_client_initialization(self): - """Test V2 synchronous socket client initialization.""" - mock_ws = Mock() - client = ListenV2SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_v2_async_socket_client_initialization(self): - """Test V2 asynchronous socket client initialization.""" - mock_ws = AsyncMock() - client = ListenAsyncV2SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_v2_sync_send_control(self): - """Test V2 synchronous control message sending.""" - mock_ws = Mock() - client = ListenV2SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=ListenV2ControlMessage) - mock_control_msg.dict.return_value = {"type": "KeepAlive"} - - client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - @pytest.mark.asyncio - async def test_v2_async_send_control(self): - """Test V2 asynchronous control message sending.""" - mock_ws = AsyncMock() - client = ListenAsyncV2SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=ListenV2ControlMessage) - mock_control_msg.dict.return_value = {"type": "KeepAlive"} - - await client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - -class TestListenMediaClient: - """Test cases for Listen Media Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock() - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock() - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_listen_response(self): - """Mock listen response data.""" - mock_response = Mock(spec=ListenV1Response) - mock_response.metadata = Mock() - mock_response.results = Mock() - return mock_response - - def test_media_client_initialization(self, sync_client_wrapper): - """Test MediaClient initialization.""" - client = MediaClient(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._raw_client is not None - - def test_async_media_client_initialization(self, async_client_wrapper): - """Test AsyncMediaClient initialization.""" - client = AsyncMediaClient(client_wrapper=async_client_wrapper) - assert client is not None - assert client._raw_client is not None - - def test_media_client_raw_response_access(self, sync_client_wrapper): - """Test MediaClient raw response access.""" - client = MediaClient(client_wrapper=sync_client_wrapper) - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_media_client_raw_response_access(self, async_client_wrapper): - """Test AsyncMediaClient raw response access.""" - client = AsyncMediaClient(client_wrapper=async_client_wrapper) - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') - def test_media_client_transcribe_url(self, mock_transcribe, sync_client_wrapper, mock_listen_response): - """Test MediaClient transcribe_url method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = MediaClient(client_wrapper=sync_client_wrapper) - - result = client.transcribe_url( - url="https://example.com/audio.mp3", - model="nova-2-general" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - assert result.metadata is not None - assert result.results is not None - - # Verify the call was made - mock_transcribe.assert_called_once() - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') - def test_media_client_transcribe_url_with_all_features(self, mock_transcribe, sync_client_wrapper, mock_listen_response): - """Test MediaClient transcribe_url with all features enabled.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = MediaClient(client_wrapper=sync_client_wrapper) - - result = client.transcribe_url( - url="https://example.com/audio.mp3", - model="nova-2-general", - language="en-US", - encoding="linear16", - smart_format=True, - punctuate=True, - diarize=True, - summarize="v2", - sentiment=True, - topics=True, - intents=True, - custom_topic_mode="extend", - custom_intent_mode="extend" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - - # Verify the call was made with all parameters - mock_transcribe.assert_called_once() - call_args = mock_transcribe.call_args - assert "model" in call_args[1] - assert "smart_format" in call_args[1] - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_file') - def test_media_client_transcribe_file(self, mock_transcribe, sync_client_wrapper, mock_listen_response, sample_audio_data): - """Test MediaClient transcribe_file method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = MediaClient(client_wrapper=sync_client_wrapper) - - # Create a mock file-like object - from io import BytesIO - audio_file = BytesIO(sample_audio_data) - - result = client.transcribe_file( - request=audio_file, - model="nova-2-general" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - - # Verify the call was made - mock_transcribe.assert_called_once() - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') - def test_media_client_transcribe_url_with_callback(self, mock_transcribe, sync_client_wrapper, mock_listen_response): - """Test MediaClient transcribe_url with callback configuration.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = MediaClient(client_wrapper=sync_client_wrapper) - - result = client.transcribe_url( - url="https://example.com/audio.mp3", - model="nova-2-general", - callback="https://example.com/callback", - callback_method="POST" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - - # Verify the call was made - mock_transcribe.assert_called_once() - - @patch('deepgram.listen.v1.media.raw_client.AsyncRawMediaClient.transcribe_url') - @pytest.mark.asyncio - async def test_async_media_client_transcribe_url(self, mock_transcribe, async_client_wrapper, mock_listen_response): - """Test AsyncMediaClient transcribe_url method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = AsyncMediaClient(client_wrapper=async_client_wrapper) - - result = await client.transcribe_url( - url="https://example.com/audio.mp3", - model="nova-2-general" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - - # Verify the call was made - mock_transcribe.assert_called_once() - - @patch('deepgram.listen.v1.media.raw_client.AsyncRawMediaClient.transcribe_file') - @pytest.mark.asyncio - async def test_async_media_client_transcribe_file(self, mock_transcribe, async_client_wrapper, mock_listen_response, sample_audio_data): - """Test AsyncMediaClient transcribe_file method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_listen_response - mock_transcribe.return_value = mock_response - - client = AsyncMediaClient(client_wrapper=async_client_wrapper) - - # Create a mock file-like object - from io import BytesIO - audio_file = BytesIO(sample_audio_data) - - result = await client.transcribe_file( - request=audio_file, - model="nova-2-general" - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - - # Verify the call was made - mock_transcribe.assert_called_once() - - -class TestListenIntegrationScenarios: - """Test Listen API integration scenarios.""" - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_listen_v1_transcription_workflow(self, mock_websocket_connect, mock_api_key, sample_audio_data): - """Test complete Listen V1 transcription workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=[ - '{"type": "Metadata", "request_id": "test-123", "sha256": "abc123", "created": "2023-01-01T00:00:00Z", "duration": 1.0, "channels": 1}', - '{"type": "Metadata", "request_id": "test-456", "sha256": "def456", "created": "2023-01-01T00:00:01Z", "duration": 2.0, "channels": 1}' - ]) - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Metadata", "request_id": "test-123", "sha256": "abc123", "created": "2023-01-01T00:00:00Z", "duration": 1.0, "channels": 1}', - '{"type": "Metadata", "request_id": "test-456", "sha256": "def456", "created": "2023-01-01T00:00:01Z", "duration": 2.0, "channels": 1}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect and send audio - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - # Send control message - connection.send_control(Mock()) - - # Send audio data - connection.send_media(sample_audio_data) - - # Receive transcription results - result = connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('deepgram.listen.v2.socket_client.V2SocketClient._handle_json_message') - @patch('deepgram.listen.v2.raw_client.websockets_sync_client.connect') - def test_listen_v2_transcription_workflow(self, mock_websocket_connect, mock_handle_json, mock_api_key, sample_audio_data): - """Test complete Listen V2 transcription workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=[ - '{"type": "Connected", "request_id": "test-v2-123"}', - '{"type": "TurnInfo", "request_id": "test-v2-123", "turn_id": "turn-1"}' - ]) - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Connected", "request_id": "test-v2-123"}', - '{"type": "TurnInfo", "request_id": "test-v2-123", "turn_id": "turn-1"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Mock the JSON message handler to return simple objects - mock_handle_json.return_value = {"type": "Connected", "request_id": "test-v2-123"} - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect and send audio - with client.listen.v2.with_raw_response.connect( - model="nova-2-general", - encoding="linear16", - sample_rate=16000 - ) as connection: - # Send control message - connection.send_control(Mock()) - - # Send audio data - connection.send_media(sample_audio_data) - - # Receive transcription results - result = connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('deepgram.listen.v1.socket_client.V1SocketClient._handle_json_message') - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_listen_event_driven_workflow(self, mock_websocket_connect, mock_handle_json, mock_api_key): - """Test Listen event-driven workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Metadata", "request_id": "event-test-123"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Mock the JSON message handler to return simple objects - mock_handle_json.return_value = {"type": "Metadata", "request_id": "event-test-123"} - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Mock event handlers - on_open = Mock() - on_message = Mock() - on_close = Mock() - on_error = Mock() - - # Connect with event handlers - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - # Set up event handlers - connection.on(EventType.OPEN, on_open) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, on_close) - connection.on(EventType.ERROR, on_error) - - # Start listening (this will process the mock messages) - connection.start_listening() - - # Verify event handlers were set up (they may or may not be called depending on mock behavior) - assert hasattr(connection, 'on') - - @patch('deepgram.listen.v1.socket_client.AsyncV1SocketClient._handle_json_message') - @patch('deepgram.listen.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_listen_transcription_workflow(self, mock_websocket_connect, mock_handle_json, mock_api_key, sample_audio_data): - """Test async Listen transcription workflow.""" - # Mock async websocket connection - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock(side_effect=[ - '{"type": "Metadata", "request_id": "async-test-123"}', - '{"type": "Results", "channel_index": [0]}' - ]) - - async def mock_aiter(): - yield '{"type": "Metadata", "request_id": "async-test-123"}' - yield '{"type": "Results", "channel_index": [0]}' - - mock_ws.__aiter__ = Mock(return_value=mock_aiter()) - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Mock the JSON message handler to return simple objects - mock_handle_json.return_value = {"type": "Metadata", "request_id": "async-test-123"} - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Connect and send audio - async with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - # Send control message - await connection.send_control(Mock()) - - # Send audio data - await connection.send_media(sample_audio_data) - - # Receive transcription results - result = await connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - def test_complete_listen_media_workflow_sync(self, mock_api_key): - """Test complete Listen Media workflow using sync client.""" - with patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') as mock_transcribe: - # Mock the response with Mock objects to avoid Pydantic validation - mock_response = Mock() - mock_response.data = Mock(spec=ListenV1Response) - mock_response.data.metadata = Mock() - mock_response.data.metadata.request_id = "media-sync-123" - mock_response.data.results = Mock() - mock_response.data.results.channels = [Mock()] - mock_response.data.results.channels[0].alternatives = [Mock()] - mock_response.data.results.channels[0].alternatives[0].transcript = "This is a test transcription." - mock_transcribe.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested listen media functionality - result = client.listen.v1.media.transcribe_url( - url="https://example.com/test-audio.mp3", - model="nova-2-general", - smart_format=True, - punctuate=True - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - assert result.metadata is not None - assert result.results is not None - - # Verify the call was made - mock_transcribe.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_listen_media_workflow_async(self, mock_api_key): - """Test complete Listen Media workflow using async client.""" - with patch('deepgram.listen.v1.media.raw_client.AsyncRawMediaClient.transcribe_url') as mock_transcribe: - # Mock the async response with Mock objects to avoid Pydantic validation - mock_response = Mock() - mock_response.data = Mock(spec=ListenV1Response) - mock_response.data.metadata = Mock() - mock_response.data.metadata.request_id = "media-async-456" - mock_response.data.results = Mock() - mock_response.data.results.channels = [Mock()] - mock_response.data.results.channels[0].alternatives = [Mock()] - mock_response.data.results.channels[0].alternatives[0].transcript = "This is an async test transcription." - mock_transcribe.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested listen media functionality - result = await client.listen.v1.media.transcribe_url( - url="https://example.com/test-audio-async.mp3", - model="nova-2-general", - topics=True, - sentiment=True - ) - - assert result is not None - assert isinstance(result, ListenV1Response) - assert result.metadata is not None - assert result.results is not None - - # Verify the call was made - mock_transcribe.assert_called_once() - - -class TestListenErrorHandling: - """Test Listen client error handling.""" - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') - def test_media_client_api_error_handling(self, mock_transcribe, mock_api_key): - """Test MediaClient API error handling.""" - # Mock an API error - mock_transcribe.side_effect = ApiError( - status_code=400, - headers={}, - body="Invalid request parameters" - ) - - client = DeepgramClient(api_key=mock_api_key).listen.v1.media - - with pytest.raises(ApiError) as exc_info: - client.transcribe_url(url="https://example.com/audio.mp3") - - assert exc_info.value.status_code == 400 - assert "Invalid request parameters" in str(exc_info.value.body) - - @patch('deepgram.listen.v1.media.raw_client.RawMediaClient.transcribe_url') - def test_media_client_network_error_handling(self, mock_transcribe, mock_api_key): - """Test MediaClient network error handling.""" - # Mock a network error - mock_transcribe.side_effect = httpx.ConnectError("Connection failed") - - client = DeepgramClient(api_key=mock_api_key).listen.v1.media - - with pytest.raises(httpx.ConnectError): - client.transcribe_url(url="https://example.com/audio.mp3") - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_websocket_connection_error_handling(self, mock_websocket_connect, mock_api_key): - """Test WebSocket connection error handling.""" - mock_websocket_connect.side_effect = websockets.exceptions.ConnectionClosedError(None, None) - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(websockets.exceptions.ConnectionClosedError): - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - pass - - @patch('deepgram.listen.v1.raw_client.websockets_sync_client.connect') - def test_generic_websocket_error_handling(self, mock_websocket_connect, mock_api_key): - """Test generic WebSocket error handling.""" - mock_websocket_connect.side_effect = Exception("Generic WebSocket error") - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(Exception) as exc_info: - with client.listen.v1.with_raw_response.connect(model="nova-2-general") as connection: - pass - - assert "Generic WebSocket error" in str(exc_info.value) - - -class TestListenSocketClientErrorScenarios: - """Test Listen socket client error scenarios.""" - - def test_json_decode_error_handling(self, mock_websocket): - """Test JSON decode error handling.""" - mock_websocket.recv.return_value = '{"invalid": json}' - - client = ListenV1SocketClient(websocket=mock_websocket) - - # Should raise JSONDecodeError for invalid JSON - with pytest.raises(json.JSONDecodeError): - client.recv() - - def test_connection_closed_ok_no_error_emission(self, mock_websocket): - """Test that normal connection closure doesn't emit error.""" - mock_websocket.__iter__ = Mock(side_effect=websockets.exceptions.ConnectionClosedOK(None, None)) - - client = ListenV1SocketClient(websocket=mock_websocket) - - # Mock error handler - error_handler = Mock() - client.on(EventType.ERROR, error_handler) - - # Start listening (should handle ConnectionClosedOK gracefully) - client.start_listening() - - # Error handler should not be called for normal closure - error_handler.assert_not_called() - - @pytest.mark.asyncio - async def test_async_connection_closed_ok_no_error_emission(self, mock_async_websocket): - """Test that async normal connection closure doesn't emit error.""" - async def mock_aiter(): - raise websockets.exceptions.ConnectionClosedOK(None, None) - yield # This will never be reached, but makes it a generator - - mock_async_websocket.__aiter__ = Mock(return_value=mock_aiter()) - - client = ListenAsyncV1SocketClient(websocket=mock_async_websocket) - - # Mock error handler - error_handler = Mock() - client.on(EventType.ERROR, error_handler) - - # Start listening (should handle ConnectionClosedOK gracefully) - await client.start_listening() - - # Error handler should not be called for normal closure - error_handler.assert_not_called() diff --git a/tests/integrations/test_manage_client.py b/tests/integrations/test_manage_client.py deleted file mode 100644 index 886ce89d..00000000 --- a/tests/integrations/test_manage_client.py +++ /dev/null @@ -1,823 +0,0 @@ -"""Integration tests for Manage client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch -import httpx -import json - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment - -from deepgram.manage.client import ManageClient, AsyncManageClient -from deepgram.manage.v1.client import V1Client as ManageV1Client, AsyncV1Client as ManageAsyncV1Client -from deepgram.manage.v1.projects.client import ProjectsClient, AsyncProjectsClient -from deepgram.manage.v1.models.client import ModelsClient, AsyncModelsClient - -# Import response types for mocking -from deepgram.types.list_projects_v1response import ListProjectsV1Response -from deepgram.types.get_project_v1response import GetProjectV1Response -from deepgram.types.list_models_v1response import ListModelsV1Response -from deepgram.types.get_model_v1response import GetModelV1Response -from deepgram.types.get_model_v1response_batch import GetModelV1ResponseBatch -from deepgram.types.get_model_v1response_metadata import GetModelV1ResponseMetadata - - -class TestManageClient: - """Test cases for Manage Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_manage_client_initialization(self, sync_client_wrapper): - """Test ManageClient initialization.""" - client = ManageClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_async_manage_client_initialization(self, async_client_wrapper): - """Test AsyncManageClient initialization.""" - client = AsyncManageClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_manage_client_v1_property_lazy_loading(self, sync_client_wrapper): - """Test ManageClient v1 property lazy loading.""" - client = ManageClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, ManageV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_async_manage_client_v1_property_lazy_loading(self, async_client_wrapper): - """Test AsyncManageClient v1 property lazy loading.""" - client = AsyncManageClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, ManageAsyncV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_manage_client_raw_response_access(self, sync_client_wrapper): - """Test ManageClient raw response access.""" - client = ManageClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_manage_client_raw_response_access(self, async_client_wrapper): - """Test AsyncManageClient raw response access.""" - client = AsyncManageClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_manage_client_integration_with_main_client(self, mock_api_key): - """Test ManageClient integration with main DeepgramClient.""" - client = DeepgramClient(api_key=mock_api_key) - - manage_client = client.manage - assert manage_client is not None - assert isinstance(manage_client, ManageClient) - - def test_async_manage_client_integration_with_main_client(self, mock_api_key): - """Test AsyncManageClient integration with main AsyncDeepgramClient.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - manage_client = client.manage - assert manage_client is not None - assert isinstance(manage_client, AsyncManageClient) - - -class TestManageV1Client: - """Test cases for Manage V1 Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_manage_v1_client_initialization(self, sync_client_wrapper): - """Test ManageV1Client initialization.""" - client = ManageV1Client(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._projects is None # Lazy loaded - assert client._models is None # Lazy loaded - - def test_async_manage_v1_client_initialization(self, async_client_wrapper): - """Test AsyncManageV1Client initialization.""" - client = ManageAsyncV1Client(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._projects is None # Lazy loaded - assert client._models is None # Lazy loaded - - def test_manage_v1_client_projects_property_lazy_loading(self, sync_client_wrapper): - """Test ManageV1Client projects property lazy loading.""" - client = ManageV1Client(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._projects is None - - # Access triggers lazy loading - projects_client = client.projects - assert client._projects is not None - assert isinstance(projects_client, ProjectsClient) - - # Subsequent access returns same instance - assert client.projects is projects_client - - def test_async_manage_v1_client_projects_property_lazy_loading(self, async_client_wrapper): - """Test AsyncManageV1Client projects property lazy loading.""" - client = ManageAsyncV1Client(client_wrapper=async_client_wrapper) - - # Initially None - assert client._projects is None - - # Access triggers lazy loading - projects_client = client.projects - assert client._projects is not None - assert isinstance(projects_client, AsyncProjectsClient) - - # Subsequent access returns same instance - assert client.projects is projects_client - - def test_manage_v1_client_models_property_lazy_loading(self, sync_client_wrapper): - """Test ManageV1Client models property lazy loading.""" - client = ManageV1Client(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._models is None - - # Access triggers lazy loading - models_client = client.models - assert client._models is not None - assert isinstance(models_client, ModelsClient) - - # Subsequent access returns same instance - assert client.models is models_client - - def test_async_manage_v1_client_models_property_lazy_loading(self, async_client_wrapper): - """Test AsyncManageV1Client models property lazy loading.""" - client = ManageAsyncV1Client(client_wrapper=async_client_wrapper) - - # Initially None - assert client._models is None - - # Access triggers lazy loading - models_client = client.models - assert client._models is not None - assert isinstance(models_client, AsyncModelsClient) - - # Subsequent access returns same instance - assert client.models is models_client - - -class TestProjectsClient: - """Test cases for Projects Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_projects_list_response(self): - """Mock projects list response data.""" - return { - "projects": [ - { - "project_id": "project-123", - "name": "Test Project 1", - "company": "Test Company" - }, - { - "project_id": "project-456", - "name": "Test Project 2", - "company": "Test Company" - } - ] - } - - @pytest.fixture - def mock_project_get_response(self): - """Mock project get response data.""" - return { - "project_id": "project-123", - "name": "Test Project", - "company": "Test Company" - } - - def test_projects_client_initialization(self, sync_client_wrapper): - """Test ProjectsClient initialization.""" - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_async_projects_client_initialization(self, async_client_wrapper): - """Test AsyncProjectsClient initialization.""" - client = AsyncProjectsClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_projects_client_raw_response_access(self, sync_client_wrapper): - """Test ProjectsClient raw response access.""" - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_projects_client_raw_response_access(self, async_client_wrapper): - """Test AsyncProjectsClient raw response access.""" - client = AsyncProjectsClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.list') - def test_projects_client_list(self, mock_list, sync_client_wrapper, mock_projects_list_response): - """Test ProjectsClient list method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = ListProjectsV1Response(**mock_projects_list_response) - mock_list.return_value = mock_response - - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - result = client.list() - - assert result is not None - assert isinstance(result, ListProjectsV1Response) - assert len(result.projects) == 2 - assert result.projects[0].project_id == "project-123" - - # Verify raw client was called with correct parameters - mock_list.assert_called_once_with(request_options=None) - - @patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.get') - def test_projects_client_get(self, mock_get, sync_client_wrapper, mock_project_get_response): - """Test ProjectsClient get method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = GetProjectV1Response(**mock_project_get_response) - mock_get.return_value = mock_response - - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - result = client.get(project_id) - - assert result is not None - assert isinstance(result, GetProjectV1Response) - assert result.project_id == project_id - - # Verify raw client was called with correct parameters - mock_get.assert_called_once_with( - project_id, - limit=None, - page=None, - request_options=None - ) - - @patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.list') - def test_projects_client_list_with_request_options(self, mock_list, sync_client_wrapper, mock_projects_list_response): - """Test ProjectsClient list with request options.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = ListProjectsV1Response(**mock_projects_list_response) - mock_list.return_value = mock_response - - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - request_options = RequestOptions( - additional_headers={"X-Custom-Header": "test-value"} - ) - result = client.list(request_options=request_options) - - assert result is not None - assert isinstance(result, ListProjectsV1Response) - - # Verify raw client was called with request options - mock_list.assert_called_once_with(request_options=request_options) - - @patch('deepgram.manage.v1.projects.raw_client.AsyncRawProjectsClient.list') - @pytest.mark.asyncio - async def test_async_projects_client_list(self, mock_list, async_client_wrapper, mock_projects_list_response): - """Test AsyncProjectsClient list method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = ListProjectsV1Response(**mock_projects_list_response) - mock_list.return_value = mock_response - - client = AsyncProjectsClient(client_wrapper=async_client_wrapper) - - result = await client.list() - - assert result is not None - assert isinstance(result, ListProjectsV1Response) - assert len(result.projects) == 2 - assert result.projects[0].project_id == "project-123" - - # Verify async raw client was called with correct parameters - mock_list.assert_called_once_with(request_options=None) - - @patch('deepgram.manage.v1.projects.raw_client.AsyncRawProjectsClient.get') - @pytest.mark.asyncio - async def test_async_projects_client_get(self, mock_get, async_client_wrapper, mock_project_get_response): - """Test AsyncProjectsClient get method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = GetProjectV1Response(**mock_project_get_response) - mock_get.return_value = mock_response - - client = AsyncProjectsClient(client_wrapper=async_client_wrapper) - - project_id = "project-456" - result = await client.get(project_id, limit=10, page=1) - - assert result is not None - assert isinstance(result, GetProjectV1Response) - assert result.project_id == "project-123" # From mock response - - # Verify async raw client was called with correct parameters - mock_get.assert_called_once_with( - project_id, - limit=10, - page=1, - request_options=None - ) - - -class TestModelsClient: - """Test cases for Models Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_models_list_response(self): - """Mock models list response data.""" - return { - "models": [ - { - "model_id": "nova-2-general", - "name": "Nova 2 General", - "canonical_name": "nova-2-general", - "architecture": "nova-2", - "language": "en", - "version": "2024-01-09", - "uuid": "uuid-123", - "batch": False, - "streaming": True - }, - { - "model_id": "nova-2-medical", - "name": "Nova 2 Medical", - "canonical_name": "nova-2-medical", - "architecture": "nova-2", - "language": "en", - "version": "2024-01-09", - "uuid": "uuid-456", - "batch": True, - "streaming": True - } - ] - } - - @pytest.fixture - def mock_model_get_response(self): - """Mock model get response data.""" - return { - "model_id": "nova-2-general", - "name": "Nova 2 General", - "canonical_name": "nova-2-general", - "architecture": "nova-2", - "language": "en", - "version": "2024-01-09", - "uuid": "uuid-123", - "batch": False, - "streaming": True - } - - def test_models_client_initialization(self, sync_client_wrapper): - """Test ModelsClient initialization.""" - client = ModelsClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_async_models_client_initialization(self, async_client_wrapper): - """Test AsyncModelsClient initialization.""" - client = AsyncModelsClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_models_client_raw_response_access(self, sync_client_wrapper): - """Test ModelsClient raw response access.""" - client = ModelsClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_models_client_raw_response_access(self, async_client_wrapper): - """Test AsyncModelsClient raw response access.""" - client = AsyncModelsClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.manage.v1.models.raw_client.RawModelsClient.list') - def test_models_client_list(self, mock_list, sync_client_wrapper, mock_models_list_response): - """Test ModelsClient list method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = ListModelsV1Response(**mock_models_list_response) - mock_list.return_value = mock_response - - client = ModelsClient(client_wrapper=sync_client_wrapper) - - result = client.list() - - assert result is not None - assert isinstance(result, ListModelsV1Response) - assert len(result.models) == 2 - assert result.models[0]["model_id"] == "nova-2-general" - - # Verify raw client was called with correct parameters - mock_list.assert_called_once_with(include_outdated=None, request_options=None) - - @patch('deepgram.manage.v1.models.raw_client.RawModelsClient.list') - def test_models_client_list_include_outdated(self, mock_list, sync_client_wrapper, mock_models_list_response): - """Test ModelsClient list with include_outdated parameter.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = ListModelsV1Response(**mock_models_list_response) - mock_list.return_value = mock_response - - client = ModelsClient(client_wrapper=sync_client_wrapper) - - result = client.list(include_outdated=True) - - assert result is not None - assert isinstance(result, ListModelsV1Response) - - # Verify raw client was called with include_outdated parameter - mock_list.assert_called_once_with(include_outdated=True, request_options=None) - - @patch('deepgram.manage.v1.models.raw_client.RawModelsClient.get') - def test_models_client_get(self, mock_get, sync_client_wrapper, mock_model_get_response): - """Test ModelsClient get method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = Mock(spec=GetModelV1ResponseBatch) - # Set attributes from mock data - for key, value in mock_model_get_response.items(): - setattr(mock_response.data, key, value) - mock_get.return_value = mock_response - - client = ModelsClient(client_wrapper=sync_client_wrapper) - - model_id = "nova-2-general" - result = client.get(model_id) - - assert result is not None - assert isinstance(result, (GetModelV1ResponseBatch, GetModelV1ResponseMetadata)) - assert result.model_id == model_id - - # Verify raw client was called with correct parameters - mock_get.assert_called_once_with(model_id, request_options=None) - - @patch('deepgram.manage.v1.models.raw_client.AsyncRawModelsClient.list') - @pytest.mark.asyncio - async def test_async_models_client_list(self, mock_list, async_client_wrapper, mock_models_list_response): - """Test AsyncModelsClient list method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = ListModelsV1Response(**mock_models_list_response) - mock_list.return_value = mock_response - - client = AsyncModelsClient(client_wrapper=async_client_wrapper) - - result = await client.list(include_outdated=False) - - assert result is not None - assert isinstance(result, ListModelsV1Response) - assert len(result.models) == 2 - assert result.models[1]["model_id"] == "nova-2-medical" - - # Verify async raw client was called with correct parameters - mock_list.assert_called_once_with(include_outdated=False, request_options=None) - - @patch('deepgram.manage.v1.models.raw_client.AsyncRawModelsClient.get') - @pytest.mark.asyncio - async def test_async_models_client_get(self, mock_get, async_client_wrapper, mock_model_get_response): - """Test AsyncModelsClient get method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = Mock(spec=GetModelV1ResponseBatch) - # Set attributes from mock data - for key, value in mock_model_get_response.items(): - setattr(mock_response.data, key, value) - mock_get.return_value = mock_response - - client = AsyncModelsClient(client_wrapper=async_client_wrapper) - - model_id = "nova-2-medical" - result = await client.get(model_id) - - assert result is not None - assert isinstance(result, (GetModelV1ResponseBatch, GetModelV1ResponseMetadata)) - assert result.model_id == "nova-2-general" # From mock response - - # Verify async raw client was called with correct parameters - mock_get.assert_called_once_with(model_id, request_options=None) - - -class TestManageIntegrationScenarios: - """Test Manage integration scenarios.""" - - def test_complete_manage_workflow_sync(self, mock_api_key): - """Test complete Manage workflow using sync client.""" - with patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.list') as mock_list: - # Mock the response - mock_response = Mock() - mock_response.data = Mock(spec=ListProjectsV1Response) - mock_project = Mock() - mock_project.project_id = "project-123" - mock_project.name = "Test Project" - mock_project.company = "Test Company" - mock_response.data.projects = [mock_project] - mock_list.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested manage functionality - result = client.manage.v1.projects.list() - - assert result is not None - assert isinstance(result, ListProjectsV1Response) - assert len(result.projects) == 1 - - # Verify the call was made - mock_list.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_manage_workflow_async(self, mock_api_key): - """Test complete Manage workflow using async client.""" - with patch('deepgram.manage.v1.models.raw_client.AsyncRawModelsClient.list') as mock_list: - # Mock the async response - mock_response = Mock() - mock_response.data = ListModelsV1Response( - models=[ - Mock(model_id="nova-2-general", name="Nova 2 General") - ] - ) - mock_list.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested manage functionality - result = await client.manage.v1.models.list() - - assert result is not None - assert isinstance(result, ListModelsV1Response) - assert len(result.models) == 1 - - # Verify the call was made - mock_list.assert_called_once() - - def test_manage_client_property_isolation(self, mock_api_key): - """Test that manage clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - manage1 = client1.manage - manage2 = client2.manage - - # Verify they are different instances - assert manage1 is not manage2 - assert manage1._client_wrapper is not manage2._client_wrapper - - # Verify nested clients are also different - projects1 = manage1.v1.projects - projects2 = manage2.v1.projects - - assert projects1 is not projects2 - - def test_manage_nested_client_access(self, mock_api_key): - """Test accessing deeply nested manage clients.""" - client = DeepgramClient(api_key=mock_api_key) - - # Test access to v1 clients - manage_v1_projects = client.manage.v1.projects - manage_v1_models = client.manage.v1.models - - # Verify all are properly initialized - assert manage_v1_projects is not None - assert manage_v1_models is not None - - # Verify they are different client types - assert type(manage_v1_projects).__name__ == 'ProjectsClient' - assert type(manage_v1_models).__name__ == 'ModelsClient' - - -class TestManageErrorHandling: - """Test Manage client error handling.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.list') - def test_projects_client_api_error_handling(self, mock_list, sync_client_wrapper): - """Test ProjectsClient API error handling.""" - # Mock an API error - mock_list.side_effect = ApiError( - status_code=403, - headers={}, - body="Insufficient permissions" - ) - - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - client.list() - - assert exc_info.value.status_code == 403 - assert "Insufficient permissions" in str(exc_info.value.body) - - @patch('deepgram.manage.v1.models.raw_client.AsyncRawModelsClient.get') - @pytest.mark.asyncio - async def test_async_models_client_api_error_handling(self, mock_get, async_client_wrapper): - """Test AsyncModelsClient API error handling.""" - # Mock an API error - mock_get.side_effect = ApiError( - status_code=404, - headers={}, - body="Model not found" - ) - - client = AsyncModelsClient(client_wrapper=async_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - await client.get("non-existent-model") - - assert exc_info.value.status_code == 404 - assert "Model not found" in str(exc_info.value.body) - - @patch('deepgram.manage.v1.projects.raw_client.RawProjectsClient.get') - def test_projects_client_network_error_handling(self, mock_get, sync_client_wrapper): - """Test ProjectsClient network error handling.""" - # Mock a network error - mock_get.side_effect = httpx.ConnectError("Connection failed") - - client = ProjectsClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(httpx.ConnectError): - client.get("project-123") - - def test_client_wrapper_integration(self, sync_client_wrapper): - """Test integration with client wrapper.""" - client = ManageClient(client_wrapper=sync_client_wrapper) - - # Test that client wrapper methods are accessible - assert hasattr(client._client_wrapper, 'get_environment') - assert hasattr(client._client_wrapper, 'get_headers') - assert hasattr(client._client_wrapper, 'api_key') - - environment = client._client_wrapper.get_environment() - headers = client._client_wrapper.get_headers() - api_key = client._client_wrapper.api_key - - assert environment is not None - assert isinstance(headers, dict) - assert api_key is not None diff --git a/tests/integrations/test_read_client.py b/tests/integrations/test_read_client.py deleted file mode 100644 index 1bd07b57..00000000 --- a/tests/integrations/test_read_client.py +++ /dev/null @@ -1,772 +0,0 @@ -"""Integration tests for Read client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch -import httpx -import json - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment - -from deepgram.read.client import ReadClient, AsyncReadClient -from deepgram.read.v1.client import V1Client as ReadV1Client, AsyncV1Client as ReadAsyncV1Client -from deepgram.read.v1.text.client import TextClient, AsyncTextClient - -# Import request and response types for mocking -from deepgram.requests.read_v1request_text import ReadV1RequestTextParams -from deepgram.requests.read_v1request_url import ReadV1RequestUrlParams -from deepgram.types.read_v1response import ReadV1Response -from deepgram.read.v1.text.types.text_analyze_request_callback_method import TextAnalyzeRequestCallbackMethod -from deepgram.read.v1.text.types.text_analyze_request_summarize import TextAnalyzeRequestSummarize -from deepgram.read.v1.text.types.text_analyze_request_custom_topic_mode import TextAnalyzeRequestCustomTopicMode -from deepgram.read.v1.text.types.text_analyze_request_custom_intent_mode import TextAnalyzeRequestCustomIntentMode - - -class TestReadClient: - """Test cases for Read Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_read_client_initialization(self, sync_client_wrapper): - """Test ReadClient initialization.""" - client = ReadClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_async_read_client_initialization(self, async_client_wrapper): - """Test AsyncReadClient initialization.""" - client = AsyncReadClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_read_client_v1_property_lazy_loading(self, sync_client_wrapper): - """Test ReadClient v1 property lazy loading.""" - client = ReadClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, ReadV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_async_read_client_v1_property_lazy_loading(self, async_client_wrapper): - """Test AsyncReadClient v1 property lazy loading.""" - client = AsyncReadClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, ReadAsyncV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_read_client_raw_response_access(self, sync_client_wrapper): - """Test ReadClient raw response access.""" - client = ReadClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_read_client_raw_response_access(self, async_client_wrapper): - """Test AsyncReadClient raw response access.""" - client = AsyncReadClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_read_client_integration_with_main_client(self, mock_api_key): - """Test ReadClient integration with main DeepgramClient.""" - client = DeepgramClient(api_key=mock_api_key) - - read_client = client.read - assert read_client is not None - assert isinstance(read_client, ReadClient) - - def test_async_read_client_integration_with_main_client(self, mock_api_key): - """Test AsyncReadClient integration with main AsyncDeepgramClient.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - read_client = client.read - assert read_client is not None - assert isinstance(read_client, AsyncReadClient) - - -class TestReadV1Client: - """Test cases for Read V1 Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_read_v1_client_initialization(self, sync_client_wrapper): - """Test ReadV1Client initialization.""" - client = ReadV1Client(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._text is None # Lazy loaded - - def test_async_read_v1_client_initialization(self, async_client_wrapper): - """Test AsyncReadV1Client initialization.""" - client = ReadAsyncV1Client(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._text is None # Lazy loaded - - def test_read_v1_client_text_property_lazy_loading(self, sync_client_wrapper): - """Test ReadV1Client text property lazy loading.""" - client = ReadV1Client(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._text is None - - # Access triggers lazy loading - text_client = client.text - assert client._text is not None - assert isinstance(text_client, TextClient) - - # Subsequent access returns same instance - assert client.text is text_client - - def test_async_read_v1_client_text_property_lazy_loading(self, async_client_wrapper): - """Test AsyncReadV1Client text property lazy loading.""" - client = ReadAsyncV1Client(client_wrapper=async_client_wrapper) - - # Initially None - assert client._text is None - - # Access triggers lazy loading - text_client = client.text - assert client._text is not None - assert isinstance(text_client, AsyncTextClient) - - # Subsequent access returns same instance - assert client.text is text_client - - def test_read_v1_client_raw_response_access(self, sync_client_wrapper): - """Test ReadV1Client raw response access.""" - client = ReadV1Client(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_read_v1_client_raw_response_access(self, async_client_wrapper): - """Test AsyncReadV1Client raw response access.""" - client = ReadAsyncV1Client(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - -class TestTextClient: - """Test cases for Text Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_text_request_url(self): - """Mock text analysis request with URL.""" - return ReadV1RequestUrlParams(url="https://example.com/article.html") - - @pytest.fixture - def mock_text_request_text(self): - """Mock text analysis request with direct text.""" - return ReadV1RequestTextParams( - text="This is a sample text for analysis. It contains positive sentiment and discusses technology topics." - ) - - @pytest.fixture - def mock_text_analysis_response(self): - """Mock text analysis response data.""" - from deepgram.types.read_v1response_metadata import ReadV1ResponseMetadata - from deepgram.types.read_v1response_results import ReadV1ResponseResults - - return ReadV1Response( - metadata=ReadV1ResponseMetadata(), - results=ReadV1ResponseResults() - ) - - def test_text_client_initialization(self, sync_client_wrapper): - """Test TextClient initialization.""" - client = TextClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_async_text_client_initialization(self, async_client_wrapper): - """Test AsyncTextClient initialization.""" - client = AsyncTextClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_text_client_raw_response_access(self, sync_client_wrapper): - """Test TextClient raw response access.""" - client = TextClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_text_client_raw_response_access(self, async_client_wrapper): - """Test AsyncTextClient raw response access.""" - client = AsyncTextClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_analyze_url(self, mock_analyze, sync_client_wrapper, mock_text_request_url, mock_text_analysis_response): - """Test TextClient analyze method with URL.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = TextClient(client_wrapper=sync_client_wrapper) - - result = client.analyze(request=mock_text_request_url) - - assert result is not None - assert isinstance(result, ReadV1Response) - assert result.metadata is not None - - # Verify raw client was called with correct parameters - mock_analyze.assert_called_once_with( - request=mock_text_request_url, - callback=None, - callback_method=None, - sentiment=None, - summarize=None, - tag=None, - topics=None, - custom_topic=None, - custom_topic_mode=None, - intents=None, - custom_intent=None, - custom_intent_mode=None, - language=None, - request_options=None - ) - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_analyze_text_with_all_features(self, mock_analyze, sync_client_wrapper, mock_text_request_text, mock_text_analysis_response): - """Test TextClient analyze method with text and all features enabled.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = TextClient(client_wrapper=sync_client_wrapper) - - result = client.analyze( - request=mock_text_request_text, - sentiment=True, - summarize=True, - topics=True, - custom_topic=["technology", "AI"], - custom_topic_mode="extended", - intents=True, - custom_intent=["inform", "explain"], - custom_intent_mode="strict", - language="en" - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - - # Verify raw client was called with all parameters - mock_analyze.assert_called_once_with( - request=mock_text_request_text, - callback=None, - callback_method=None, - sentiment=True, - summarize=True, - tag=None, - topics=True, - custom_topic=["technology", "AI"], - custom_topic_mode="extended", - intents=True, - custom_intent=["inform", "explain"], - custom_intent_mode="strict", - language="en", - request_options=None - ) - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_analyze_with_callback(self, mock_analyze, sync_client_wrapper, mock_text_request_url, mock_text_analysis_response): - """Test TextClient analyze method with callback configuration.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = TextClient(client_wrapper=sync_client_wrapper) - - callback_url = "https://example.com/callback" - result = client.analyze( - request=mock_text_request_url, - callback=callback_url, - callback_method="POST", - sentiment=True - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - - # Verify raw client was called with callback parameters - mock_analyze.assert_called_once_with( - request=mock_text_request_url, - callback=callback_url, - callback_method="POST", - sentiment=True, - summarize=None, - tag=None, - topics=None, - custom_topic=None, - custom_topic_mode=None, - intents=None, - custom_intent=None, - custom_intent_mode=None, - language=None, - request_options=None - ) - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_analyze_with_request_options(self, mock_analyze, sync_client_wrapper, mock_text_request_text, mock_text_analysis_response): - """Test TextClient analyze method with request options.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = TextClient(client_wrapper=sync_client_wrapper) - - request_options = RequestOptions( - additional_headers={"X-Custom-Header": "test-value"} - ) - result = client.analyze( - request=mock_text_request_text, - topics=True, - request_options=request_options - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - - # Verify raw client was called with request options - mock_analyze.assert_called_once_with( - request=mock_text_request_text, - callback=None, - callback_method=None, - sentiment=None, - summarize=None, - tag=None, - topics=True, - custom_topic=None, - custom_topic_mode=None, - intents=None, - custom_intent=None, - custom_intent_mode=None, - language=None, - request_options=request_options - ) - - @patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') - @pytest.mark.asyncio - async def test_async_text_client_analyze_url(self, mock_analyze, async_client_wrapper, mock_text_request_url, mock_text_analysis_response): - """Test AsyncTextClient analyze method with URL.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = AsyncTextClient(client_wrapper=async_client_wrapper) - - result = await client.analyze(request=mock_text_request_url) - - assert result is not None - assert isinstance(result, ReadV1Response) - assert result.metadata is not None - - # Verify async raw client was called with correct parameters - mock_analyze.assert_called_once_with( - request=mock_text_request_url, - callback=None, - callback_method=None, - sentiment=None, - summarize=None, - tag=None, - topics=None, - custom_topic=None, - custom_topic_mode=None, - intents=None, - custom_intent=None, - custom_intent_mode=None, - language=None, - request_options=None - ) - - @patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') - @pytest.mark.asyncio - async def test_async_text_client_analyze_with_all_features(self, mock_analyze, async_client_wrapper, mock_text_request_text, mock_text_analysis_response): - """Test AsyncTextClient analyze method with all features enabled.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_text_analysis_response - mock_analyze.return_value = mock_response - - client = AsyncTextClient(client_wrapper=async_client_wrapper) - - result = await client.analyze( - request=mock_text_request_text, - sentiment=True, - summarize=True, - topics=True, - custom_topic="machine learning", - custom_topic_mode="strict", - intents=True, - custom_intent=["question", "request"], - custom_intent_mode="extended", - language="en" - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - - # Verify async raw client was called with all parameters - mock_analyze.assert_called_once_with( - request=mock_text_request_text, - callback=None, - callback_method=None, - sentiment=True, - summarize=True, - tag=None, - topics=True, - custom_topic="machine learning", - custom_topic_mode="strict", - intents=True, - custom_intent=["question", "request"], - custom_intent_mode="extended", - language="en", - request_options=None - ) - - -class TestReadIntegrationScenarios: - """Test Read integration scenarios.""" - - def test_complete_read_workflow_sync(self, mock_api_key): - """Test complete Read workflow using sync client.""" - with patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') as mock_analyze: - # Mock the response - mock_response = Mock() - mock_response.data = Mock(spec=ReadV1Response) - mock_response.data.metadata = Mock() - mock_response.data.results = Mock() - mock_response.data.results.summary = {"text": "Test summary"} - mock_response.data.results.sentiments = { - "average": {"sentiment": "positive", "sentiment_score": 0.7} - } - # Set request_id for assertion - mock_response.data.request_id = "req-sync-123" - mock_analyze.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Create request - request = ReadV1RequestTextParams(text="This is a test text for sentiment analysis.") - - # Access nested read functionality - result = client.read.v1.text.analyze( - request=request, - sentiment=True, - summarize=True - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - assert result.request_id == "req-sync-123" - - # Verify the call was made - mock_analyze.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_read_workflow_async(self, mock_api_key): - """Test complete Read workflow using async client.""" - with patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') as mock_analyze: - # Mock the async response - mock_response = Mock() - mock_response.data = Mock(spec=ReadV1Response) - mock_response.data.metadata = Mock() - mock_response.data.results = Mock() - mock_response.data.results.topics = { - "segments": [ - { - "topics": [{"topic": "technology", "confidence_score": 0.9}] - } - ] - } - # Set request_id for assertion - mock_response.data.request_id = "req-async-456" - mock_analyze.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Create request - request = ReadV1RequestUrlParams(url="https://example.com/tech-article.html") - - # Access nested read functionality - result = await client.read.v1.text.analyze( - request=request, - topics=True, - custom_topic=["AI", "machine learning"] - ) - - assert result is not None - assert isinstance(result, ReadV1Response) - assert result.request_id == "req-async-456" - - # Verify the call was made - mock_analyze.assert_called_once() - - def test_read_client_property_isolation(self, mock_api_key): - """Test that read clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - read1 = client1.read - read2 = client2.read - - # Verify they are different instances - assert read1 is not read2 - assert read1._client_wrapper is not read2._client_wrapper - - # Verify nested clients are also different - text1 = read1.v1.text - text2 = read2.v1.text - - assert text1 is not text2 - - @pytest.mark.asyncio - async def test_mixed_sync_async_read_clients(self, mock_api_key): - """Test mixing sync and async read clients.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - sync_read = sync_client.read - async_read = async_client.read - - # Verify they are different types - assert type(sync_read) != type(async_read) - assert isinstance(sync_read, ReadClient) - assert isinstance(async_read, AsyncReadClient) - - # Verify nested clients are also different types - sync_text = sync_read.v1.text - async_text = async_read.v1.text - - assert type(sync_text) != type(async_text) - assert isinstance(sync_text, TextClient) - assert isinstance(async_text, AsyncTextClient) - - -class TestReadErrorHandling: - """Test Read client error handling.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_api_error_handling(self, mock_analyze, sync_client_wrapper): - """Test TextClient API error handling.""" - # Mock an API error - mock_analyze.side_effect = ApiError( - status_code=400, - headers={}, - body="Invalid request parameters" - ) - - client = TextClient(client_wrapper=sync_client_wrapper) - request = ReadV1RequestTextParams(text="Test text") - - with pytest.raises(ApiError) as exc_info: - client.analyze(request=request) - - assert exc_info.value.status_code == 400 - assert "Invalid request parameters" in str(exc_info.value.body) - - @patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') - @pytest.mark.asyncio - async def test_async_text_client_api_error_handling(self, mock_analyze, async_client_wrapper): - """Test AsyncTextClient API error handling.""" - # Mock an API error - mock_analyze.side_effect = ApiError( - status_code=429, - headers={}, - body="Rate limit exceeded" - ) - - client = AsyncTextClient(client_wrapper=async_client_wrapper) - request = ReadV1RequestUrlParams(url="https://example.com/article.html") - - with pytest.raises(ApiError) as exc_info: - await client.analyze(request=request) - - assert exc_info.value.status_code == 429 - assert "Rate limit exceeded" in str(exc_info.value.body) - - @patch('deepgram.read.v1.text.raw_client.RawTextClient.analyze') - def test_text_client_network_error_handling(self, mock_analyze, sync_client_wrapper): - """Test TextClient network error handling.""" - # Mock a network error - mock_analyze.side_effect = httpx.ConnectError("Connection failed") - - client = TextClient(client_wrapper=sync_client_wrapper) - request = ReadV1RequestTextParams(text="Test text") - - with pytest.raises(httpx.ConnectError): - client.analyze(request=request) - - @patch('deepgram.read.v1.text.raw_client.AsyncRawTextClient.analyze') - @pytest.mark.asyncio - async def test_async_text_client_network_error_handling(self, mock_analyze, async_client_wrapper): - """Test AsyncTextClient network error handling.""" - # Mock a network error - mock_analyze.side_effect = httpx.ConnectError("Async connection failed") - - client = AsyncTextClient(client_wrapper=async_client_wrapper) - request = ReadV1RequestUrlParams(url="https://example.com/article.html") - - with pytest.raises(httpx.ConnectError): - await client.analyze(request=request) - - def test_invalid_request_parameters(self, sync_client_wrapper): - """Test handling of invalid request parameters.""" - client = TextClient(client_wrapper=sync_client_wrapper) - - # Test with invalid request (None) - with pytest.raises((TypeError, AttributeError)): - client.analyze(request=None) - - def test_client_wrapper_integration(self, sync_client_wrapper): - """Test integration with client wrapper.""" - client = ReadClient(client_wrapper=sync_client_wrapper) - - # Test that client wrapper methods are accessible - assert hasattr(client._client_wrapper, 'get_environment') - assert hasattr(client._client_wrapper, 'get_headers') - assert hasattr(client._client_wrapper, 'api_key') - - environment = client._client_wrapper.get_environment() - headers = client._client_wrapper.get_headers() - api_key = client._client_wrapper.api_key - - assert environment is not None - assert isinstance(headers, dict) - assert api_key is not None diff --git a/tests/integrations/test_self_hosted_client.py b/tests/integrations/test_self_hosted_client.py deleted file mode 100644 index a10f2c38..00000000 --- a/tests/integrations/test_self_hosted_client.py +++ /dev/null @@ -1,736 +0,0 @@ -"""Integration tests for SelfHosted client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch -import httpx -import json - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment - -from deepgram.self_hosted.client import SelfHostedClient, AsyncSelfHostedClient -from deepgram.self_hosted.v1.client import V1Client as SelfHostedV1Client, AsyncV1Client as SelfHostedAsyncV1Client -from deepgram.self_hosted.v1.distribution_credentials.client import ( - DistributionCredentialsClient, - AsyncDistributionCredentialsClient -) - -# Import response types for mocking -from deepgram.types.list_project_distribution_credentials_v1response import ListProjectDistributionCredentialsV1Response -from deepgram.types.create_project_distribution_credentials_v1response import CreateProjectDistributionCredentialsV1Response -from deepgram.types.get_project_distribution_credentials_v1response import GetProjectDistributionCredentialsV1Response -from deepgram.self_hosted.v1.distribution_credentials.types.distribution_credentials_create_request_scopes_item import DistributionCredentialsCreateRequestScopesItem - - -class TestSelfHostedClient: - """Test cases for SelfHosted Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_self_hosted_client_initialization(self, sync_client_wrapper): - """Test SelfHostedClient initialization.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_async_self_hosted_client_initialization(self, async_client_wrapper): - """Test AsyncSelfHostedClient initialization.""" - client = AsyncSelfHostedClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._v1 is None # Lazy loaded - - def test_self_hosted_client_v1_property_lazy_loading(self, sync_client_wrapper): - """Test SelfHostedClient v1 property lazy loading.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, SelfHostedV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_async_self_hosted_client_v1_property_lazy_loading(self, async_client_wrapper): - """Test AsyncSelfHostedClient v1 property lazy loading.""" - client = AsyncSelfHostedClient(client_wrapper=async_client_wrapper) - - # Initially None - assert client._v1 is None - - # Access triggers lazy loading - v1_client = client.v1 - assert client._v1 is not None - assert isinstance(v1_client, SelfHostedAsyncV1Client) - - # Subsequent access returns same instance - assert client.v1 is v1_client - - def test_self_hosted_client_raw_response_access(self, sync_client_wrapper): - """Test SelfHostedClient raw response access.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_self_hosted_client_raw_response_access(self, async_client_wrapper): - """Test AsyncSelfHostedClient raw response access.""" - client = AsyncSelfHostedClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_self_hosted_client_integration_with_main_client(self, mock_api_key): - """Test SelfHostedClient integration with main DeepgramClient.""" - client = DeepgramClient(api_key=mock_api_key) - - self_hosted_client = client.self_hosted - assert self_hosted_client is not None - assert isinstance(self_hosted_client, SelfHostedClient) - - def test_async_self_hosted_client_integration_with_main_client(self, mock_api_key): - """Test AsyncSelfHostedClient integration with main AsyncDeepgramClient.""" - client = AsyncDeepgramClient(api_key=mock_api_key) - - self_hosted_client = client.self_hosted - assert self_hosted_client is not None - assert isinstance(self_hosted_client, AsyncSelfHostedClient) - - -class TestSelfHostedV1Client: - """Test cases for SelfHosted V1 Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_self_hosted_v1_client_initialization(self, sync_client_wrapper): - """Test SelfHostedV1Client initialization.""" - client = SelfHostedV1Client(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._client_wrapper is sync_client_wrapper - assert client._distribution_credentials is None # Lazy loaded - - def test_async_self_hosted_v1_client_initialization(self, async_client_wrapper): - """Test AsyncSelfHostedV1Client initialization.""" - client = SelfHostedAsyncV1Client(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._client_wrapper is async_client_wrapper - assert client._distribution_credentials is None # Lazy loaded - - def test_self_hosted_v1_client_distribution_credentials_property_lazy_loading(self, sync_client_wrapper): - """Test SelfHostedV1Client distribution_credentials property lazy loading.""" - client = SelfHostedV1Client(client_wrapper=sync_client_wrapper) - - # Initially None - assert client._distribution_credentials is None - - # Access triggers lazy loading - dist_creds_client = client.distribution_credentials - assert client._distribution_credentials is not None - assert isinstance(dist_creds_client, DistributionCredentialsClient) - - # Subsequent access returns same instance - assert client.distribution_credentials is dist_creds_client - - def test_async_self_hosted_v1_client_distribution_credentials_property_lazy_loading(self, async_client_wrapper): - """Test AsyncSelfHostedV1Client distribution_credentials property lazy loading.""" - client = SelfHostedAsyncV1Client(client_wrapper=async_client_wrapper) - - # Initially None - assert client._distribution_credentials is None - - # Access triggers lazy loading - dist_creds_client = client.distribution_credentials - assert client._distribution_credentials is not None - assert isinstance(dist_creds_client, AsyncDistributionCredentialsClient) - - # Subsequent access returns same instance - assert client.distribution_credentials is dist_creds_client - - def test_self_hosted_v1_client_raw_response_access(self, sync_client_wrapper): - """Test SelfHostedV1Client raw response access.""" - client = SelfHostedV1Client(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_self_hosted_v1_client_raw_response_access(self, async_client_wrapper): - """Test AsyncSelfHostedV1Client raw response access.""" - client = SelfHostedAsyncV1Client(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - -class TestDistributionCredentialsClient: - """Test cases for Distribution Credentials Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def mock_distribution_credentials_list_response(self): - """Mock distribution credentials list response data.""" - mock_response = Mock(spec=ListProjectDistributionCredentialsV1Response) - # Mock distribution credentials list - mock_cred1 = Mock() - mock_cred1.distribution_credentials_id = "cred-123" - mock_cred2 = Mock() - mock_cred2.distribution_credentials_id = "cred-456" - mock_response.distribution_credentials = [mock_cred1, mock_cred2] - return mock_response - - @pytest.fixture - def mock_distribution_credentials_create_response(self): - """Mock distribution credentials create response data.""" - mock_response = Mock(spec=CreateProjectDistributionCredentialsV1Response) - mock_response.distribution_credentials_id = "cred-new-789" - mock_response.username = "test_user" - mock_response.password = "test_password" - return mock_response - - @pytest.fixture - def mock_distribution_credentials_get_response(self): - """Mock distribution credentials get response data.""" - mock_response = Mock(spec=GetProjectDistributionCredentialsV1Response) - mock_response.distribution_credentials_id = "cred-123" - return mock_response - - def test_distribution_credentials_client_initialization(self, sync_client_wrapper): - """Test DistributionCredentialsClient initialization.""" - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_async_distribution_credentials_client_initialization(self, async_client_wrapper): - """Test AsyncDistributionCredentialsClient initialization.""" - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - assert client is not None - assert client._raw_client is not None - - def test_distribution_credentials_client_raw_response_access(self, sync_client_wrapper): - """Test DistributionCredentialsClient raw response access.""" - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_distribution_credentials_client_raw_response_access(self, async_client_wrapper): - """Test AsyncDistributionCredentialsClient raw response access.""" - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.list') - def test_distribution_credentials_client_list(self, mock_list, sync_client_wrapper, mock_distribution_credentials_list_response): - """Test DistributionCredentialsClient list method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_list_response - mock_list.return_value = mock_response - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - result = client.list(project_id) - - assert result is not None - assert isinstance(result, ListProjectDistributionCredentialsV1Response) - # Basic assertion - response is valid - # Response structure is valid - - # Verify raw client was called with correct parameters - mock_list.assert_called_once_with(project_id, request_options=None) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.create') - def test_distribution_credentials_client_create(self, mock_create, sync_client_wrapper, mock_distribution_credentials_create_response): - """Test DistributionCredentialsClient create method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_create_response - mock_create.return_value = mock_response - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - scopes = ["self-hosted:products", "self-hosted:product:api"] - result = client.create( - project_id, - scopes=scopes, - provider="quay", - comment="Test credentials" - ) - - assert result is not None - assert isinstance(result, CreateProjectDistributionCredentialsV1Response) - assert result.distribution_credentials_id == "cred-new-789" - assert result.username == "test_user" - assert result.password == "test_password" - - # Verify raw client was called with correct parameters - mock_create.assert_called_once_with( - project_id, - scopes=scopes, - provider="quay", - comment="Test credentials", - request_options=None - ) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.get') - def test_distribution_credentials_client_get(self, mock_get, sync_client_wrapper, mock_distribution_credentials_get_response): - """Test DistributionCredentialsClient get method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_get_response - mock_get.return_value = mock_response - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - credentials_id = "cred-123" - result = client.get(project_id, credentials_id) - - assert result is not None - assert isinstance(result, GetProjectDistributionCredentialsV1Response) - # Basic assertions - the response structure is valid - - # Verify raw client was called with correct parameters - mock_get.assert_called_once_with(project_id, credentials_id, request_options=None) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.delete') - def test_distribution_credentials_client_delete(self, mock_delete, sync_client_wrapper, mock_distribution_credentials_get_response): - """Test DistributionCredentialsClient delete method.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_get_response - mock_delete.return_value = mock_response - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - credentials_id = "cred-123" - result = client.delete(project_id, credentials_id) - - assert result is not None - assert isinstance(result, GetProjectDistributionCredentialsV1Response) - - # Verify raw client was called with correct parameters - mock_delete.assert_called_once_with(project_id, credentials_id, request_options=None) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.list') - def test_distribution_credentials_client_list_with_request_options(self, mock_list, sync_client_wrapper, mock_distribution_credentials_list_response): - """Test DistributionCredentialsClient list with request options.""" - # Mock the raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_list_response - mock_list.return_value = mock_response - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - project_id = "project-123" - request_options = RequestOptions( - additional_headers={"X-Custom-Header": "test-value"} - ) - result = client.list(project_id, request_options=request_options) - - assert result is not None - assert isinstance(result, ListProjectDistributionCredentialsV1Response) - - # Verify raw client was called with request options - mock_list.assert_called_once_with(project_id, request_options=request_options) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.list') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_list(self, mock_list, async_client_wrapper, mock_distribution_credentials_list_response): - """Test AsyncDistributionCredentialsClient list method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_list_response - mock_list.return_value = mock_response - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - project_id = "project-456" - result = await client.list(project_id) - - assert result is not None - assert isinstance(result, ListProjectDistributionCredentialsV1Response) - # Basic assertion - response is valid - assert result.distribution_credentials[1].distribution_credentials_id == "cred-456" - - # Verify async raw client was called with correct parameters - mock_list.assert_called_once_with(project_id, request_options=None) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.create') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_create(self, mock_create, async_client_wrapper, mock_distribution_credentials_create_response): - """Test AsyncDistributionCredentialsClient create method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_create_response - mock_create.return_value = mock_response - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - project_id = "project-456" - scopes = ["self-hosted:products"] - result = await client.create( - project_id, - scopes=scopes, - provider="quay", - comment="Async test credentials" - ) - - assert result is not None - assert isinstance(result, CreateProjectDistributionCredentialsV1Response) - assert result.distribution_credentials_id == "cred-new-789" - - # Verify async raw client was called with correct parameters - mock_create.assert_called_once_with( - project_id, - scopes=scopes, - provider="quay", - comment="Async test credentials", - request_options=None - ) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.get') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_get(self, mock_get, async_client_wrapper, mock_distribution_credentials_get_response): - """Test AsyncDistributionCredentialsClient get method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_get_response - mock_get.return_value = mock_response - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - project_id = "project-456" - credentials_id = "cred-456" - result = await client.get(project_id, credentials_id) - - assert result is not None - assert isinstance(result, GetProjectDistributionCredentialsV1Response) - # Basic assertions - the response structure is valid # From mock response - - # Verify async raw client was called with correct parameters - mock_get.assert_called_once_with(project_id, credentials_id, request_options=None) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.delete') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_delete(self, mock_delete, async_client_wrapper, mock_distribution_credentials_get_response): - """Test AsyncDistributionCredentialsClient delete method.""" - # Mock the async raw client response - mock_response = Mock() - mock_response.data = mock_distribution_credentials_get_response - mock_delete.return_value = mock_response - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - project_id = "project-456" - credentials_id = "cred-456" - result = await client.delete(project_id, credentials_id) - - assert result is not None - assert isinstance(result, GetProjectDistributionCredentialsV1Response) - - # Verify async raw client was called with correct parameters - mock_delete.assert_called_once_with(project_id, credentials_id, request_options=None) - - -class TestSelfHostedIntegrationScenarios: - """Test SelfHosted integration scenarios.""" - - def test_complete_self_hosted_workflow_sync(self, mock_api_key): - """Test complete SelfHosted workflow using sync client.""" - with patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.list') as mock_list: - # Mock the response - mock_response = Mock() - mock_response.data = Mock(spec=ListProjectDistributionCredentialsV1Response) - mock_credential = Mock() - mock_credential.distribution_credentials_id = "cred-sync-123" - mock_credential.comment = "Sync test credentials" - mock_credential.scopes = ["read", "write"] - mock_credential.provider = "quay" - mock_response.data.distribution_credentials = [mock_credential] - mock_list.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested self-hosted functionality - result = client.self_hosted.v1.distribution_credentials.list("project-123") - - assert result is not None - assert isinstance(result, ListProjectDistributionCredentialsV1Response) - assert len(result.distribution_credentials) == 1 - assert result.distribution_credentials[0].distribution_credentials_id == "cred-sync-123" - - # Verify the call was made - mock_list.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_self_hosted_workflow_async(self, mock_api_key): - """Test complete SelfHosted workflow using async client.""" - with patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.create') as mock_create: - # Mock the async response - mock_response = Mock() - mock_response.data = Mock(spec=CreateProjectDistributionCredentialsV1Response) - mock_response.data.distribution_credentials_id = "cred-async-456" - mock_response.data.comment = "Async test credentials" - mock_response.data.scopes = ["read"] - mock_response.data.provider = "quay" - mock_response.data.username = "async_user" - mock_response.data.password = "async_password" - # Set required fields - mock_response.data.member = Mock() - mock_response.data.distribution_credentials = Mock() - mock_create.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested self-hosted functionality - result = await client.self_hosted.v1.distribution_credentials.create( - "project-456", - scopes=["self-hosted:products"], - provider="quay" - ) - - assert result is not None - assert isinstance(result, CreateProjectDistributionCredentialsV1Response) - assert result.distribution_credentials_id == "cred-async-456" - assert result.username == "async_user" - - # Verify the call was made - mock_create.assert_called_once() - - def test_self_hosted_client_property_isolation(self, mock_api_key): - """Test that self-hosted clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - self_hosted1 = client1.self_hosted - self_hosted2 = client2.self_hosted - - # Verify they are different instances - assert self_hosted1 is not self_hosted2 - assert self_hosted1._client_wrapper is not self_hosted2._client_wrapper - - # Verify nested clients are also different - dist_creds1 = self_hosted1.v1.distribution_credentials - dist_creds2 = self_hosted2.v1.distribution_credentials - - assert dist_creds1 is not dist_creds2 - - @pytest.mark.asyncio - async def test_mixed_sync_async_self_hosted_clients(self, mock_api_key): - """Test mixing sync and async self-hosted clients.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - sync_self_hosted = sync_client.self_hosted - async_self_hosted = async_client.self_hosted - - # Verify they are different types - assert type(sync_self_hosted) != type(async_self_hosted) - assert isinstance(sync_self_hosted, SelfHostedClient) - assert isinstance(async_self_hosted, AsyncSelfHostedClient) - - # Verify nested clients are also different types - sync_dist_creds = sync_self_hosted.v1.distribution_credentials - async_dist_creds = async_self_hosted.v1.distribution_credentials - - assert type(sync_dist_creds) != type(async_dist_creds) - assert isinstance(sync_dist_creds, DistributionCredentialsClient) - assert isinstance(async_dist_creds, AsyncDistributionCredentialsClient) - - -class TestSelfHostedErrorHandling: - """Test SelfHosted client error handling.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock(spec=httpx.Client) - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock(spec=httpx.AsyncClient) - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.list') - def test_distribution_credentials_client_api_error_handling(self, mock_list, sync_client_wrapper): - """Test DistributionCredentialsClient API error handling.""" - # Mock an API error - mock_list.side_effect = ApiError( - status_code=404, - headers={}, - body="Project not found" - ) - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - client.list("non-existent-project") - - assert exc_info.value.status_code == 404 - assert "Project not found" in str(exc_info.value.body) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.create') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_api_error_handling(self, mock_create, async_client_wrapper): - """Test AsyncDistributionCredentialsClient API error handling.""" - # Mock an API error - mock_create.side_effect = ApiError( - status_code=400, - headers={}, - body="Invalid scopes provided" - ) - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - with pytest.raises(ApiError) as exc_info: - await client.create( - "project-123", - scopes=["invalid_scope"], - provider="quay" - ) - - assert exc_info.value.status_code == 400 - assert "Invalid scopes provided" in str(exc_info.value.body) - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.RawDistributionCredentialsClient.get') - def test_distribution_credentials_client_network_error_handling(self, mock_get, sync_client_wrapper): - """Test DistributionCredentialsClient network error handling.""" - # Mock a network error - mock_get.side_effect = httpx.ConnectError("Connection failed") - - client = DistributionCredentialsClient(client_wrapper=sync_client_wrapper) - - with pytest.raises(httpx.ConnectError): - client.get("project-123", "cred-123") - - @patch('deepgram.self_hosted.v1.distribution_credentials.raw_client.AsyncRawDistributionCredentialsClient.delete') - @pytest.mark.asyncio - async def test_async_distribution_credentials_client_network_error_handling(self, mock_delete, async_client_wrapper): - """Test AsyncDistributionCredentialsClient network error handling.""" - # Mock a network error - mock_delete.side_effect = httpx.ConnectError("Async connection failed") - - client = AsyncDistributionCredentialsClient(client_wrapper=async_client_wrapper) - - with pytest.raises(httpx.ConnectError): - await client.delete("project-456", "cred-456") - - def test_client_wrapper_integration(self, sync_client_wrapper): - """Test integration with client wrapper.""" - client = SelfHostedClient(client_wrapper=sync_client_wrapper) - - # Test that client wrapper methods are accessible - assert hasattr(client._client_wrapper, 'get_environment') - assert hasattr(client._client_wrapper, 'get_headers') - assert hasattr(client._client_wrapper, 'api_key') - - environment = client._client_wrapper.get_environment() - headers = client._client_wrapper.get_headers() - api_key = client._client_wrapper.api_key - - assert environment is not None - assert isinstance(headers, dict) - assert api_key is not None diff --git a/tests/integrations/test_speak_client.py b/tests/integrations/test_speak_client.py deleted file mode 100644 index 2b722f3a..00000000 --- a/tests/integrations/test_speak_client.py +++ /dev/null @@ -1,763 +0,0 @@ -"""Integration tests for Speak client implementations.""" - -import pytest -from unittest.mock import Mock, AsyncMock, patch, MagicMock -from contextlib import contextmanager, asynccontextmanager -import httpx -import websockets.exceptions -import json -import asyncio -from json.decoder import JSONDecodeError - -from deepgram import DeepgramClient, AsyncDeepgramClient -from deepgram.core.client_wrapper import SyncClientWrapper, AsyncClientWrapper -from deepgram.core.api_error import ApiError -from deepgram.core.request_options import RequestOptions -from deepgram.core.events import EventType -from deepgram.environment import DeepgramClientEnvironment - -# Import Speak clients -from deepgram.speak.client import SpeakClient, AsyncSpeakClient -from deepgram.speak.v1.client import V1Client as SpeakV1Client, AsyncV1Client as SpeakAsyncV1Client - -# Import Speak raw clients -from deepgram.speak.v1.raw_client import RawV1Client as SpeakRawV1Client, AsyncRawV1Client as SpeakAsyncRawV1Client - -# Import Speak socket clients -from deepgram.speak.v1.socket_client import V1SocketClient as SpeakV1SocketClient, AsyncV1SocketClient as SpeakAsyncV1SocketClient - -# Import Speak audio clients -from deepgram.speak.v1.audio.client import AudioClient, AsyncAudioClient - -# Import socket message types -from deepgram.extensions.types.sockets import ( - SpeakV1TextMessage, - SpeakV1ControlMessage, -) - -# Import request and response types for mocking -from deepgram.speak.v1.audio.types.audio_generate_request_callback_method import AudioGenerateRequestCallbackMethod -from deepgram.speak.v1.audio.types.audio_generate_request_container import AudioGenerateRequestContainer -from deepgram.speak.v1.audio.types.audio_generate_request_encoding import AudioGenerateRequestEncoding -from deepgram.speak.v1.audio.types.audio_generate_request_model import AudioGenerateRequestModel - - -class TestSpeakClient: - """Test cases for Speak Client.""" - - def test_speak_client_initialization(self, mock_api_key): - """Test SpeakClient initialization.""" - client = DeepgramClient(api_key=mock_api_key).speak - assert client is not None - assert hasattr(client, 'v1') - - def test_async_speak_client_initialization(self, mock_api_key): - """Test AsyncSpeakClient initialization.""" - client = AsyncDeepgramClient(api_key=mock_api_key).speak - assert client is not None - assert hasattr(client, 'v1') - - def test_speak_client_with_raw_response(self, mock_api_key): - """Test SpeakClient with_raw_response property.""" - client = DeepgramClient(api_key=mock_api_key).speak - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - def test_async_speak_client_with_raw_response(self, mock_api_key): - """Test AsyncSpeakClient with_raw_response property.""" - client = AsyncDeepgramClient(api_key=mock_api_key).speak - raw_client = client.with_raw_response - assert raw_client is not None - assert hasattr(raw_client, '_client_wrapper') - - -class TestSpeakRawV1Client: - """Test cases for Speak V1 Raw Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=Mock(), - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=AsyncMock(), - timeout=60.0 - ) - - def test_sync_speak_raw_client_initialization(self, sync_client_wrapper): - """Test synchronous speak raw client initialization.""" - client = SpeakRawV1Client(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._client_wrapper is sync_client_wrapper - - def test_async_speak_raw_client_initialization(self, async_client_wrapper): - """Test asynchronous speak raw client initialization.""" - client = SpeakAsyncRawV1Client(client_wrapper=async_client_wrapper) - assert client is not None - assert client._client_wrapper is async_client_wrapper - - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_sync_speak_connect_success(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test successful synchronous Speak WebSocket connection.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = SpeakRawV1Client(client_wrapper=sync_client_wrapper) - - with client.connect() as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_sync_speak_connect_with_parameters(self, mock_websocket_connect, sync_client_wrapper, mock_websocket): - """Test synchronous Speak connection with parameters.""" - mock_websocket_connect.return_value.__enter__ = Mock(return_value=mock_websocket) - mock_websocket_connect.return_value.__exit__ = Mock(return_value=None) - - client = SpeakRawV1Client(client_wrapper=sync_client_wrapper) - - with client.connect( - model="aura-asteria-en", - encoding="linear16", - sample_rate="24000" - ) as connection: - assert connection is not None - - @patch('deepgram.speak.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_speak_connect_success(self, mock_websocket_connect, async_client_wrapper, mock_async_websocket): - """Test successful asynchronous Speak WebSocket connection.""" - mock_websocket_connect.return_value.__aenter__ = AsyncMock(return_value=mock_async_websocket) - mock_websocket_connect.return_value.__aexit__ = AsyncMock(return_value=None) - - client = SpeakAsyncRawV1Client(client_wrapper=async_client_wrapper) - - async with client.connect() as connection: - assert connection is not None - assert hasattr(connection, '_websocket') - - def test_speak_query_params_construction(self, sync_client_wrapper): - """Test Speak query parameters are properly constructed.""" - client = SpeakRawV1Client(client_wrapper=sync_client_wrapper) - - # Mock the websocket connection to capture the URL - with patch('websockets.sync.client.connect') as mock_connect: - mock_connect.return_value.__enter__ = Mock(return_value=Mock()) - mock_connect.return_value.__exit__ = Mock(return_value=None) - - try: - with client.connect( - model="aura-asteria-en", - encoding="linear16", - sample_rate="24000" - ) as connection: - pass - except: - pass # We just want to check the URL construction - - # Verify the URL was constructed with query parameters - call_args = mock_connect.call_args - if call_args and len(call_args[0]) > 0: - url = call_args[0][0] - assert "model=aura-asteria-en" in url - assert "encoding=linear16" in url - assert "sample_rate=24000" in url - - -class TestSpeakV1SocketClient: - """Test cases for Speak V1 Socket Client.""" - - def test_speak_sync_socket_client_initialization(self): - """Test Speak synchronous socket client initialization.""" - mock_ws = Mock() - client = SpeakV1SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_speak_async_socket_client_initialization(self): - """Test Speak asynchronous socket client initialization.""" - mock_ws = AsyncMock() - client = SpeakAsyncV1SocketClient(websocket=mock_ws) - - assert client is not None - assert client._websocket is mock_ws - - def test_speak_sync_send_text(self): - """Test Speak synchronous text message sending.""" - mock_ws = Mock() - client = SpeakV1SocketClient(websocket=mock_ws) - - # Mock text message - mock_text_msg = Mock(spec=SpeakV1TextMessage) - mock_text_msg.dict.return_value = {"type": "Speak", "text": "Hello world"} - - client.send_text(mock_text_msg) - - mock_text_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - def test_speak_sync_send_control(self): - """Test Speak synchronous control message sending.""" - mock_ws = Mock() - client = SpeakV1SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=SpeakV1ControlMessage) - mock_control_msg.dict.return_value = {"type": "Flush"} - - client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - @pytest.mark.asyncio - async def test_speak_async_send_text(self): - """Test Speak asynchronous text message sending.""" - mock_ws = AsyncMock() - client = SpeakAsyncV1SocketClient(websocket=mock_ws) - - # Mock text message - mock_text_msg = Mock(spec=SpeakV1TextMessage) - mock_text_msg.dict.return_value = {"type": "Speak", "text": "Hello world"} - - await client.send_text(mock_text_msg) - - mock_text_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - @pytest.mark.asyncio - async def test_speak_async_send_control(self): - """Test Speak asynchronous control message sending.""" - mock_ws = AsyncMock() - client = SpeakAsyncV1SocketClient(websocket=mock_ws) - - # Mock control message - mock_control_msg = Mock(spec=SpeakV1ControlMessage) - mock_control_msg.dict.return_value = {"type": "Flush"} - - await client.send_control(mock_control_msg) - - mock_control_msg.dict.assert_called_once() - mock_ws.send.assert_called_once() - - -class TestSpeakAudioClient: - """Test cases for Speak Audio Client.""" - - @pytest.fixture - def sync_client_wrapper(self, mock_api_key): - """Create a sync client wrapper for testing.""" - mock_httpx_client = Mock() - return SyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def async_client_wrapper(self, mock_api_key): - """Create an async client wrapper for testing.""" - mock_httpx_client = AsyncMock() - return AsyncClientWrapper( - environment=DeepgramClientEnvironment.PRODUCTION, - api_key=mock_api_key, - headers={}, - httpx_client=mock_httpx_client, - timeout=60.0 - ) - - @pytest.fixture - def sample_audio_chunks(self): - """Sample audio chunks for testing.""" - return [ - b'\x00\x01\x02\x03\x04\x05', - b'\x06\x07\x08\x09\x0a\x0b', - b'\x0c\x0d\x0e\x0f\x10\x11' - ] - - def test_audio_client_initialization(self, sync_client_wrapper): - """Test AudioClient initialization.""" - client = AudioClient(client_wrapper=sync_client_wrapper) - assert client is not None - assert client._raw_client is not None - - def test_async_audio_client_initialization(self, async_client_wrapper): - """Test AsyncAudioClient initialization.""" - client = AsyncAudioClient(client_wrapper=async_client_wrapper) - assert client is not None - assert client._raw_client is not None - - def test_audio_client_raw_response_access(self, sync_client_wrapper): - """Test AudioClient raw response access.""" - client = AudioClient(client_wrapper=sync_client_wrapper) - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - def test_async_audio_client_raw_response_access(self, async_client_wrapper): - """Test AsyncAudioClient raw response access.""" - client = AsyncAudioClient(client_wrapper=async_client_wrapper) - raw_client = client.with_raw_response - assert raw_client is not None - assert raw_client is client._raw_client - - @patch('deepgram.speak.v1.audio.raw_client.RawAudioClient.generate') - def test_audio_client_generate(self, mock_generate, sync_client_wrapper, sample_audio_chunks): - """Test AudioClient generate method.""" - # Mock the raw client response with context manager - mock_response = Mock() - mock_data_response = Mock() - mock_data_response.data = iter(sample_audio_chunks) - mock_response.__enter__ = Mock(return_value=mock_data_response) - mock_response.__exit__ = Mock(return_value=None) - mock_generate.return_value = mock_response - - client = AudioClient(client_wrapper=sync_client_wrapper) - - response = client.generate( - text="Hello, world!", - model="aura-asteria-en" - ) - audio_chunks = list(response) - assert len(audio_chunks) == 3 - assert audio_chunks[0] == sample_audio_chunks[0] - - # Verify the call was made - mock_generate.assert_called_once() - - @patch('deepgram.speak.v1.audio.raw_client.RawAudioClient.generate') - def test_audio_client_generate_with_all_options(self, mock_generate, sync_client_wrapper, sample_audio_chunks): - """Test AudioClient generate with all options.""" - # Mock the raw client response with context manager - mock_response = Mock() - mock_data_response = Mock() - mock_data_response.data = iter(sample_audio_chunks) - mock_response.__enter__ = Mock(return_value=mock_data_response) - mock_response.__exit__ = Mock(return_value=None) - mock_generate.return_value = mock_response - - client = AudioClient(client_wrapper=sync_client_wrapper) - - response = client.generate( - text="Hello, world!", - model="aura-asteria-en", - encoding="linear16", - container="wav", - sample_rate=22050, - callback="https://example.com/callback", - callback_method="POST" - ) - audio_chunks = list(response) - assert len(audio_chunks) == 3 - - # Verify the call was made with all parameters - mock_generate.assert_called_once() - call_args = mock_generate.call_args - assert "model" in call_args[1] - assert "encoding" in call_args[1] - assert "sample_rate" in call_args[1] - - @patch('deepgram.speak.v1.audio.raw_client.AsyncRawAudioClient.generate') - @pytest.mark.asyncio - async def test_async_audio_client_generate(self, mock_generate, async_client_wrapper, sample_audio_chunks): - """Test AsyncAudioClient generate method.""" - # Mock the async raw client response with context manager - mock_response = AsyncMock() - mock_data_response = AsyncMock() - - async def mock_aiter_data(): - for chunk in sample_audio_chunks: - yield chunk - - mock_data_response.data = mock_aiter_data() - mock_response.__aenter__ = AsyncMock(return_value=mock_data_response) - mock_response.__aexit__ = AsyncMock(return_value=None) - mock_generate.return_value = mock_response - - client = AsyncAudioClient(client_wrapper=async_client_wrapper) - - response = client.generate( - text="Hello, world!", - model="aura-asteria-en" - ) - audio_chunks = [] - async for chunk in response: - audio_chunks.append(chunk) - - assert len(audio_chunks) == 3 - assert audio_chunks[0] == sample_audio_chunks[0] - - # Verify the call was made - mock_generate.assert_called_once() - - @patch('deepgram.speak.v1.audio.raw_client.AsyncRawAudioClient.generate') - @pytest.mark.asyncio - async def test_async_audio_client_generate_with_options(self, mock_generate, async_client_wrapper, sample_audio_chunks): - """Test AsyncAudioClient generate with options.""" - # Mock the async raw client response with context manager - mock_response = AsyncMock() - mock_data_response = AsyncMock() - - async def mock_aiter_data(): - for chunk in sample_audio_chunks: - yield chunk - - mock_data_response.data = mock_aiter_data() - mock_response.__aenter__ = AsyncMock(return_value=mock_data_response) - mock_response.__aexit__ = AsyncMock(return_value=None) - mock_generate.return_value = mock_response - - client = AsyncAudioClient(client_wrapper=async_client_wrapper) - - response = client.generate( - text="Hello, world!", - model="aura-asteria-en", - encoding="linear16", - sample_rate=22050 - ) - audio_chunks = [] - async for chunk in response: - audio_chunks.append(chunk) - - assert len(audio_chunks) == 3 - - # Verify the call was made - mock_generate.assert_called_once() - call_args = mock_generate.call_args - - assert call_args[1]["sample_rate"] == 22050 - - -class TestSpeakIntegrationScenarios: - """Test Speak API integration scenarios.""" - - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_speak_tts_workflow(self, mock_websocket_connect, mock_api_key, sample_text): - """Test complete Speak TTS workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.recv = Mock(side_effect=[ - b'\x00\x01\x02\x03', # Audio chunk - '{"type": "Metadata", "request_id": "speak-123", "model_name": "aura-asteria-en", "model_version": "1.0", "model_uuid": "uuid-123"}' - ]) - mock_ws.__iter__ = Mock(return_value=iter([ - b'\x00\x01\x02\x03', # Audio chunk - '{"type": "Metadata", "request_id": "speak-123", "model_name": "aura-asteria-en", "model_version": "1.0", "model_uuid": "uuid-123"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Connect and send text - with client.speak.v1.with_raw_response.connect() as connection: - # Send text message - connection.send_text(Mock()) - - # Send control message - connection.send_control(Mock()) - - # Receive audio data - result = connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - @patch('deepgram.speak.v1.socket_client.V1SocketClient._handle_json_message') - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_speak_event_driven_workflow(self, mock_websocket_connect, mock_handle_json, mock_api_key): - """Test Speak event-driven workflow.""" - # Mock websocket connection - mock_ws = Mock() - mock_ws.send = Mock() - mock_ws.__iter__ = Mock(return_value=iter([ - '{"type": "Metadata", "request_id": "speak-event-123"}' - ])) - mock_ws.__enter__ = Mock(return_value=mock_ws) - mock_ws.__exit__ = Mock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Mock the JSON message handler to return simple objects - mock_handle_json.return_value = {"type": "Metadata", "request_id": "speak-event-123"} - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Mock event handlers - on_open = Mock() - on_message = Mock() - on_close = Mock() - on_error = Mock() - - # Connect with event handlers - with client.speak.v1.with_raw_response.connect() as connection: - # Set up event handlers - connection.on(EventType.OPEN, on_open) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, on_close) - connection.on(EventType.ERROR, on_error) - - # Start listening (this will process the mock messages) - connection.start_listening() - - # Verify event handlers were set up - assert hasattr(connection, 'on') - - @patch('deepgram.speak.v1.raw_client.websockets_client_connect') - @pytest.mark.asyncio - async def test_async_speak_tts_workflow(self, mock_websocket_connect, mock_api_key): - """Test async Speak TTS workflow.""" - # Mock async websocket connection - mock_ws = AsyncMock() - mock_ws.send = AsyncMock() - mock_ws.recv = AsyncMock(side_effect=[ - b'\x00\x01\x02\x03', # Audio chunk - '{"type": "Metadata", "request_id": "async-speak-123"}' - ]) - - async def mock_aiter(): - yield b'\x00\x01\x02\x03' # Audio chunk - yield '{"type": "Metadata", "request_id": "async-speak-123"}' - - mock_ws.__aiter__ = Mock(return_value=mock_aiter()) - mock_ws.__aenter__ = AsyncMock(return_value=mock_ws) - mock_ws.__aexit__ = AsyncMock(return_value=None) - mock_websocket_connect.return_value = mock_ws - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Connect and send text - async with client.speak.v1.with_raw_response.connect() as connection: - # Send text message - await connection.send_text(Mock()) - - # Send control message - await connection.send_control(Mock()) - - # Receive audio data - result = await connection.recv() - assert result is not None - - # Verify websocket operations - mock_ws.send.assert_called() - - def test_complete_speak_audio_workflow_sync(self, mock_api_key): - """Test complete Speak Audio workflow using sync client.""" - with patch('deepgram.speak.v1.audio.raw_client.RawAudioClient.generate') as mock_generate: - # Mock the response with context manager - mock_response = Mock() - mock_data_response = Mock() - mock_data_response.data = iter([ - b'\x00\x01\x02\x03', - b'\x04\x05\x06\x07', - b'\x08\x09\x0a\x0b' - ]) - mock_response.__enter__ = Mock(return_value=mock_data_response) - mock_response.__exit__ = Mock(return_value=None) - mock_generate.return_value = mock_response - - # Initialize client - client = DeepgramClient(api_key=mock_api_key) - - # Access nested speak audio functionality - response = client.speak.v1.audio.generate( - text="Hello, this is a test of the Deepgram TTS API.", - model="aura-asteria-en", - encoding="linear16", - sample_rate=24000 - ) - audio_chunks = list(response) - assert len(audio_chunks) == 3 - assert audio_chunks[0] == b'\x00\x01\x02\x03' - - # Verify the call was made - mock_generate.assert_called_once() - - @pytest.mark.asyncio - async def test_complete_speak_audio_workflow_async(self, mock_api_key): - """Test complete Speak Audio workflow using async client.""" - with patch('deepgram.speak.v1.audio.raw_client.AsyncRawAudioClient.generate') as mock_generate: - # Mock the async response with context manager - mock_response = AsyncMock() - mock_data_response = AsyncMock() - - async def mock_aiter_data(): - yield b'\x00\x01\x02\x03' - yield b'\x04\x05\x06\x07' - yield b'\x08\x09\x0a\x0b' - - mock_data_response.data = mock_aiter_data() - mock_response.__aenter__ = AsyncMock(return_value=mock_data_response) - mock_response.__aexit__ = AsyncMock(return_value=None) - mock_generate.return_value = mock_response - - # Initialize async client - client = AsyncDeepgramClient(api_key=mock_api_key) - - # Access nested speak audio functionality - response = client.speak.v1.audio.generate( - text="Hello, this is an async test of the Deepgram TTS API.", - model="aura-asteria-en", - encoding="linear16" - ) - audio_chunks = [] - async for chunk in response: - audio_chunks.append(chunk) - - assert len(audio_chunks) == 3 - assert audio_chunks[0] == b'\x00\x01\x02\x03' - - # Verify the call was made - mock_generate.assert_called_once() - - def test_speak_client_property_isolation(self, mock_api_key): - """Test that speak clients are properly isolated between instances.""" - client1 = DeepgramClient(api_key=mock_api_key) - client2 = DeepgramClient(api_key=mock_api_key) - - # Verify clients are different instances - assert client1.speak is not client2.speak - - # Verify nested clients are also different - speak1 = client1.speak.v1 - speak2 = client2.speak.v1 - - assert speak1 is not speak2 - - @pytest.mark.asyncio - async def test_mixed_sync_async_speak_clients(self, mock_api_key): - """Test mixing sync and async speak clients.""" - sync_client = DeepgramClient(api_key=mock_api_key) - async_client = AsyncDeepgramClient(api_key=mock_api_key) - - # Verify clients are different types - assert type(sync_client.speak) != type(async_client.speak) - - # Verify nested clients are also different types - sync_speak = sync_client.speak.v1 - async_speak = async_client.speak.v1 - - assert type(sync_speak) != type(async_speak) - assert isinstance(sync_speak, SpeakV1Client) - assert isinstance(async_speak, SpeakAsyncV1Client) - - -class TestSpeakErrorHandling: - """Test Speak client error handling.""" - - @patch('deepgram.speak.v1.audio.raw_client.RawAudioClient.generate') - def test_audio_client_api_error_handling(self, mock_generate, mock_api_key): - """Test AudioClient API error handling.""" - # Mock an API error - mock_generate.side_effect = ApiError( - status_code=400, - headers={}, - body="Invalid request parameters" - ) - - client = DeepgramClient(api_key=mock_api_key).speak.v1.audio - - with pytest.raises(ApiError) as exc_info: - response = client.generate(text="Hello world") - list(response) - - assert exc_info.value.status_code == 400 - assert "Invalid request parameters" in str(exc_info.value.body) - - @patch('deepgram.speak.v1.audio.raw_client.AsyncRawAudioClient.generate') - @pytest.mark.asyncio - async def test_async_audio_client_api_error_handling(self, mock_generate, mock_api_key): - """Test AsyncAudioClient API error handling.""" - # Mock an API error - mock_generate.side_effect = ApiError( - status_code=429, - headers={}, - body="Rate limit exceeded" - ) - - client = AsyncDeepgramClient(api_key=mock_api_key).speak.v1.audio - - with pytest.raises(ApiError) as exc_info: - response = client.generate(text="Hello world") - async for chunk in response: - pass - - assert exc_info.value.status_code == 429 - assert "Rate limit exceeded" in str(exc_info.value.body) - - @patch('deepgram.speak.v1.audio.raw_client.RawAudioClient.generate') - def test_audio_client_network_error_handling(self, mock_generate, mock_api_key): - """Test AudioClient network error handling.""" - # Mock a network error - mock_generate.side_effect = httpx.ConnectError("Connection failed") - - client = DeepgramClient(api_key=mock_api_key).speak.v1.audio - - with pytest.raises(httpx.ConnectError): - response = client.generate(text="Hello world") - list(response) - - @patch('deepgram.speak.v1.audio.raw_client.AsyncRawAudioClient.generate') - @pytest.mark.asyncio - async def test_async_audio_client_network_error_handling(self, mock_generate, mock_api_key): - """Test AsyncAudioClient network error handling.""" - # Mock a network error - mock_generate.side_effect = httpx.ConnectError("Async connection failed") - - client = AsyncDeepgramClient(api_key=mock_api_key).speak.v1.audio - - with pytest.raises(httpx.ConnectError): - response = client.generate(text="Hello world") - async for chunk in response: - pass - - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_websocket_connection_error_handling(self, mock_websocket_connect, mock_api_key): - """Test WebSocket connection error handling.""" - mock_websocket_connect.side_effect = websockets.exceptions.ConnectionClosedError(None, None) - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(websockets.exceptions.ConnectionClosedError): - with client.speak.v1.with_raw_response.connect() as connection: - pass - - @patch('deepgram.speak.v1.raw_client.websockets_sync_client.connect') - def test_generic_websocket_error_handling(self, mock_websocket_connect, mock_api_key): - """Test generic WebSocket error handling.""" - mock_websocket_connect.side_effect = Exception("Generic WebSocket error") - - client = DeepgramClient(api_key=mock_api_key) - - with pytest.raises(Exception) as exc_info: - with client.speak.v1.with_raw_response.connect() as connection: - pass - - assert "Generic WebSocket error" in str(exc_info.value) - - def test_client_wrapper_integration(self, mock_api_key): - """Test integration with client wrapper.""" - client = DeepgramClient(api_key=mock_api_key).speak.v1.audio - assert client._raw_client is not None - assert client._raw_client._client_wrapper.api_key == mock_api_key diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py deleted file mode 100644 index 535fa1c9..00000000 --- a/tests/unit/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Unit tests for Deepgram Python SDK diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py deleted file mode 100644 index 87ed0698..00000000 --- a/tests/unit/conftest.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -Shared fixtures and configuration for unit tests. -""" -from typing import Any, Dict - -import pytest - - -@pytest.fixture -def sample_timestamp(): - """Sample timestamp for testing.""" - return "2023-01-01T00:00:00Z" - - -@pytest.fixture -def sample_request_id(): - """Sample request ID for testing.""" - return "test-request-123" - - -@pytest.fixture -def sample_channel_data(): - """Sample channel data for testing.""" - return [0, 1] - - -@pytest.fixture -def sample_audio_data(): - """Sample binary audio data for testing.""" - return b"\x00\x01\x02\x03\x04\x05" * 100 - - -@pytest.fixture -def sample_transcription_text(): - """Sample transcription text.""" - return "Hello, this is a test transcription." - - -@pytest.fixture -def sample_metadata(): - """Sample metadata for various events.""" - return { - "request_id": "test-request-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1 - } - - -@pytest.fixture -def sample_function_call(): - """Sample function call data for Agent testing.""" - return { - "id": "func-123", - "name": "get_weather", - "arguments": '{"location": "New York"}', - "client_side": False - } - - -@pytest.fixture -def valid_model_data(): - """Factory for creating valid model test data.""" - def _create_data(model_type: str, **overrides) -> Dict[str, Any]: - """Create valid data for different model types.""" - base_data = { - "listen_v1_metadata": { - "type": "Metadata", - "request_id": "test-123", - "sha256": "abc123", - "created": "2023-01-01T00:00:00Z", - "duration": 1.0, - "channels": 1 - }, - "listen_v1_results": { - "type": "Results", - "channel_index": [0], - "duration": 1.0, - "start": 0.0, - "is_final": True, - "channel": { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [] - } - ] - }, - "metadata": { - "request_id": "test-123", - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - }, - "model_uuid": "model-uuid-123" - } - }, - "speak_v1_metadata": { - "type": "Metadata", - "request_id": "speak-123", - "model_name": "aura-asteria-en", - "model_version": "1.0", - "model_uuid": "uuid-123" - }, - "agent_v1_welcome": { - "type": "Welcome", - "request_id": "req-123" - }, - "agent_v1_conversation_text": { - "type": "ConversationText", - "role": "assistant", - "content": "Hello!" - }, - "agent_v1_function_call_request": { - "type": "FunctionCallRequest", - "functions": [ - { - "id": "func-123", - "name": "get_weather", - "arguments": "{}", - "client_side": False - } - ] - } - } - - data = base_data.get(model_type, {}) - data.update(overrides) - return data - - return _create_data - - -@pytest.fixture -def invalid_model_data(): - """Factory for creating invalid model test data.""" - def _create_invalid_data(model_type: str, field_to_break: str) -> Dict[str, Any]: - """Create invalid data by removing or corrupting specific fields.""" - valid_data = { - "listen_v1_metadata": { - "type": "Metadata", - "request_id": "test-123", - "sha256": "abc123", - "created": "2023-01-01T00:00:00Z", - "duration": 1.0, - "channels": 1 - } - } - - data = valid_data.get(model_type, {}).copy() - - # Remove or corrupt the specified field - if field_to_break in data: - if field_to_break == "type": - data[field_to_break] = "InvalidType" - elif field_to_break in ["duration", "channels"]: - data[field_to_break] = "not_a_number" - else: - del data[field_to_break] - - return data - - return _create_invalid_data diff --git a/tests/unit/test_agent_v1_models.py b/tests/unit/test_agent_v1_models.py deleted file mode 100644 index 97dd6526..00000000 --- a/tests/unit/test_agent_v1_models.py +++ /dev/null @@ -1,661 +0,0 @@ -""" -Unit tests for Agent V1 socket event models. -""" -import pytest -from pydantic import ValidationError - -from deepgram.extensions.types.sockets.agent_v1_agent_started_speaking_event import AgentV1AgentStartedSpeakingEvent -from deepgram.extensions.types.sockets.agent_v1_agent_thinking_event import AgentV1AgentThinkingEvent -from deepgram.extensions.types.sockets.agent_v1_control_message import AgentV1ControlMessage -from deepgram.extensions.types.sockets.agent_v1_conversation_text_event import AgentV1ConversationTextEvent -from deepgram.extensions.types.sockets.agent_v1_error_event import AgentV1ErrorEvent -from deepgram.extensions.types.sockets.agent_v1_function_call_request_event import AgentV1FunctionCallRequestEvent -from deepgram.extensions.types.sockets.agent_v1_function_call_response_message import AgentV1FunctionCallResponseMessage -from deepgram.extensions.types.sockets.agent_v1_warning_event import AgentV1WarningEvent -from deepgram.extensions.types.sockets.agent_v1_welcome_message import AgentV1WelcomeMessage - - -class TestAgentV1WelcomeMessage: - """Test AgentV1WelcomeMessage model.""" - - def test_valid_welcome_message(self, valid_model_data): - """Test creating a valid welcome message.""" - data = valid_model_data("agent_v1_welcome") - message = AgentV1WelcomeMessage(**data) - - assert message.type == "Welcome" - assert message.request_id == "req-123" - - def test_welcome_message_serialization(self, valid_model_data): - """Test welcome message serialization.""" - data = valid_model_data("agent_v1_welcome") - message = AgentV1WelcomeMessage(**data) - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "Welcome" - assert message_dict["request_id"] == "req-123" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"Welcome"' in json_str - assert '"request_id":"req-123"' in json_str - - def test_welcome_message_missing_required_fields(self): - """Test welcome message with missing required fields.""" - # Missing request_id - with pytest.raises(ValidationError) as exc_info: - AgentV1WelcomeMessage( - type="Welcome" - ) - assert "request_id" in str(exc_info.value) - - def test_welcome_message_wrong_type(self): - """Test welcome message with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - AgentV1WelcomeMessage( - type="ConversationText", # Wrong type - request_id="req-123" - ) - assert "Input should be 'Welcome'" in str(exc_info.value) - - -class TestAgentV1ConversationTextEvent: - """Test AgentV1ConversationTextEvent model.""" - - def test_valid_conversation_text_event(self, valid_model_data): - """Test creating a valid conversation text event.""" - data = valid_model_data("agent_v1_conversation_text") - event = AgentV1ConversationTextEvent(**data) - - assert event.type == "ConversationText" - assert event.role == "assistant" - assert event.content == "Hello!" - - def test_conversation_text_event_serialization(self, valid_model_data): - """Test conversation text event serialization.""" - data = valid_model_data("agent_v1_conversation_text") - event = AgentV1ConversationTextEvent(**data) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "ConversationText" - assert event_dict["role"] == "assistant" - assert event_dict["content"] == "Hello!" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"ConversationText"' in json_str - assert '"role":"assistant"' in json_str - - def test_conversation_text_event_missing_required_fields(self): - """Test conversation text event with missing required fields.""" - # Missing role - with pytest.raises(ValidationError) as exc_info: - AgentV1ConversationTextEvent( - type="ConversationText", - content="Hello!" - ) - assert "role" in str(exc_info.value) - - # Missing content - with pytest.raises(ValidationError) as exc_info: - AgentV1ConversationTextEvent( - type="ConversationText", - role="assistant" - ) - assert "content" in str(exc_info.value) - - def test_conversation_text_event_valid_roles(self): - """Test conversation text event with valid roles.""" - valid_roles = ["user", "assistant"] - - for role in valid_roles: - event = AgentV1ConversationTextEvent( - type="ConversationText", - role=role, - content="Test content" - ) - assert event.role == role - - def test_conversation_text_event_invalid_role(self): - """Test conversation text event with invalid role.""" - with pytest.raises(ValidationError) as exc_info: - AgentV1ConversationTextEvent( - type="ConversationText", - role="system", # Invalid role - content="Hello!" - ) - assert "Input should be 'user' or 'assistant'" in str(exc_info.value) - - def test_conversation_text_event_empty_content(self): - """Test conversation text event with empty content.""" - event = AgentV1ConversationTextEvent( - type="ConversationText", - role="assistant", - content="" - ) - - assert event.content == "" - - def test_conversation_text_event_long_content(self): - """Test conversation text event with very long content.""" - long_content = "This is a very long message. " * 1000 # ~30KB - event = AgentV1ConversationTextEvent( - type="ConversationText", - role="assistant", - content=long_content - ) - - assert len(event.content) > 20000 - - -class TestAgentV1FunctionCallRequestEvent: - """Test AgentV1FunctionCallRequestEvent model.""" - - def test_valid_function_call_request_event(self, valid_model_data): - """Test creating a valid function call request event.""" - data = valid_model_data("agent_v1_function_call_request") - event = AgentV1FunctionCallRequestEvent(**data) - - assert event.type == "FunctionCallRequest" - assert len(event.functions) == 1 - assert event.functions[0].id == "func-123" - assert event.functions[0].name == "get_weather" - assert event.functions[0].arguments == "{}" - assert event.functions[0].client_side is False - - def test_function_call_request_event_serialization(self, valid_model_data): - """Test function call request event serialization.""" - data = valid_model_data("agent_v1_function_call_request") - event = AgentV1FunctionCallRequestEvent(**data) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "FunctionCallRequest" - assert len(event_dict["functions"]) == 1 - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"FunctionCallRequest"' in json_str - assert '"name":"get_weather"' in json_str - - def test_function_call_request_event_missing_required_fields(self): - """Test function call request event with missing required fields.""" - # Missing functions - with pytest.raises(ValidationError) as exc_info: - AgentV1FunctionCallRequestEvent( - type="FunctionCallRequest" - ) - assert "functions" in str(exc_info.value) - - def test_function_call_request_event_empty_functions(self): - """Test function call request event with empty functions list.""" - event = AgentV1FunctionCallRequestEvent( - type="FunctionCallRequest", - functions=[] - ) - - assert event.type == "FunctionCallRequest" - assert len(event.functions) == 0 - - def test_function_call_request_event_multiple_functions(self, sample_function_call): - """Test function call request event with multiple functions.""" - functions = [ - sample_function_call, - { - "id": "func-456", - "name": "get_time", - "arguments": '{"timezone": "UTC"}', - "client_side": True - } - ] - - event = AgentV1FunctionCallRequestEvent( - type="FunctionCallRequest", - functions=functions - ) - - assert len(event.functions) == 2 - assert event.functions[0].name == "get_weather" - assert event.functions[1].name == "get_time" - assert event.functions[1].client_side is True - - def test_function_call_request_event_invalid_function_structure(self): - """Test function call request event with invalid function structure.""" - # Missing required function fields - with pytest.raises(ValidationError) as exc_info: - AgentV1FunctionCallRequestEvent( - type="FunctionCallRequest", - functions=[{ - "id": "func-123", - "name": "get_weather" - # Missing arguments and client_side - }] - ) - # The validation error should mention missing fields - error_str = str(exc_info.value) - assert "arguments" in error_str or "client_side" in error_str - - -class TestAgentV1FunctionCallResponseMessage: - """Test AgentV1FunctionCallResponseMessage model.""" - - def test_valid_function_call_response_message(self): - """Test creating a valid function call response message.""" - message = AgentV1FunctionCallResponseMessage( - type="FunctionCallResponse", - name="get_weather", - content='{"temperature": 25, "condition": "sunny"}' - ) - - assert message.type == "FunctionCallResponse" - assert message.name == "get_weather" - assert message.content == '{"temperature": 25, "condition": "sunny"}' - - def test_function_call_response_message_serialization(self): - """Test function call response message serialization.""" - message = AgentV1FunctionCallResponseMessage( - type="FunctionCallResponse", - name="get_weather", - content='{"temperature": 25, "condition": "sunny"}' - ) - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "FunctionCallResponse" - assert message_dict["name"] == "get_weather" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"FunctionCallResponse"' in json_str - assert '"name":"get_weather"' in json_str - - def test_function_call_response_message_missing_required_fields(self): - """Test function call response message with missing required fields.""" - # Missing name - with pytest.raises(ValidationError) as exc_info: - AgentV1FunctionCallResponseMessage( - type="FunctionCallResponse", - content='{"temperature": 25}' - ) - assert "name" in str(exc_info.value) - - # Missing content - with pytest.raises(ValidationError) as exc_info: - AgentV1FunctionCallResponseMessage( - type="FunctionCallResponse", - name="get_weather" - ) - assert "content" in str(exc_info.value) - - -class TestAgentV1AgentThinkingEvent: - """Test AgentV1AgentThinkingEvent model.""" - - def test_valid_agent_thinking_event(self): - """Test creating a valid agent thinking event.""" - event = AgentV1AgentThinkingEvent( - type="AgentThinking", - content="I'm thinking about your request..." - ) - - assert event.type == "AgentThinking" - assert event.content == "I'm thinking about your request..." - - def test_agent_thinking_event_serialization(self): - """Test agent thinking event serialization.""" - event = AgentV1AgentThinkingEvent( - type="AgentThinking", - content="Processing your request..." - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "AgentThinking" - assert event_dict["content"] == "Processing your request..." - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"AgentThinking"' in json_str - assert '"content":"Processing your request..."' in json_str - - def test_agent_thinking_event_wrong_type(self): - """Test agent thinking event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - AgentV1AgentThinkingEvent( - type="UserStartedSpeaking", # Wrong type - content="Test content" - ) - assert "Input should be 'AgentThinking'" in str(exc_info.value) - - -class TestAgentV1AgentStartedSpeakingEvent: - """Test AgentV1AgentStartedSpeakingEvent model.""" - - def test_valid_agent_started_speaking_event(self): - """Test creating a valid agent started speaking event.""" - event = AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency=150.5, - tts_latency=50.2, - ttt_latency=100.3 - ) - - assert event.type == "AgentStartedSpeaking" - assert event.total_latency == 150.5 - assert event.tts_latency == 50.2 - assert event.ttt_latency == 100.3 - - def test_agent_started_speaking_event_serialization(self): - """Test agent started speaking event serialization.""" - event = AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency=150.5, - tts_latency=50.2, - ttt_latency=100.3 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "AgentStartedSpeaking" - assert event_dict["total_latency"] == 150.5 - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"AgentStartedSpeaking"' in json_str - assert '"total_latency":150.5' in json_str - - def test_agent_started_speaking_event_missing_required_fields(self): - """Test agent started speaking event with missing required fields.""" - # Missing total_latency - with pytest.raises(ValidationError) as exc_info: - AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - tts_latency=50.2, - ttt_latency=100.3 - ) - assert "total_latency" in str(exc_info.value) - - def test_agent_started_speaking_event_invalid_data_types(self): - """Test agent started speaking event with invalid data types.""" - # Invalid total_latency type - with pytest.raises(ValidationError) as exc_info: - AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency="not_a_number", - tts_latency=50.2, - ttt_latency=100.3 - ) - assert "Input should be a valid number" in str(exc_info.value) - - -class TestAgentV1ErrorEvent: - """Test AgentV1ErrorEvent model.""" - - def test_valid_error_event(self): - """Test creating a valid error event.""" - event = AgentV1ErrorEvent( - type="Error", - description="Function call failed", - code="FUNCTION_CALL_ERROR" - ) - - assert event.type == "Error" - assert event.description == "Function call failed" - assert event.code == "FUNCTION_CALL_ERROR" - - def test_error_event_serialization(self): - """Test error event serialization.""" - event = AgentV1ErrorEvent( - type="Error", - description="Function call failed", - code="FUNCTION_CALL_ERROR" - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Error" - assert event_dict["description"] == "Function call failed" - assert event_dict["code"] == "FUNCTION_CALL_ERROR" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Error"' in json_str - assert '"description":"Function call failed"' in json_str - - def test_error_event_missing_required_fields(self): - """Test error event with missing required fields.""" - # Missing description - with pytest.raises(ValidationError) as exc_info: - AgentV1ErrorEvent( - type="Error", - code="FUNCTION_CALL_ERROR" - ) - assert "description" in str(exc_info.value) - - # Missing code - with pytest.raises(ValidationError) as exc_info: - AgentV1ErrorEvent( - type="Error", - description="Function call failed" - ) - assert "code" in str(exc_info.value) - - -class TestAgentV1WarningEvent: - """Test AgentV1WarningEvent model.""" - - def test_valid_warning_event(self): - """Test creating a valid warning event.""" - event = AgentV1WarningEvent( - type="Warning", - description="Connection quality degraded", - code="CONNECTION_WARNING" - ) - - assert event.type == "Warning" - assert event.description == "Connection quality degraded" - assert event.code == "CONNECTION_WARNING" - - def test_warning_event_serialization(self): - """Test warning event serialization.""" - event = AgentV1WarningEvent( - type="Warning", - description="Connection quality degraded", - code="CONNECTION_WARNING" - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Warning" - assert event_dict["description"] == "Connection quality degraded" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Warning"' in json_str - - -class TestAgentV1ControlMessage: - """Test AgentV1ControlMessage model.""" - - def test_valid_control_message(self): - """Test creating a valid control message.""" - message = AgentV1ControlMessage( - type="KeepAlive" - ) - - assert message.type == "KeepAlive" - - def test_control_message_serialization(self): - """Test control message serialization.""" - message = AgentV1ControlMessage(type="KeepAlive") - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "KeepAlive" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"KeepAlive"' in json_str - - -class TestAgentV1MediaMessage: - """Test AgentV1MediaMessage model.""" - - def test_valid_media_message(self, sample_audio_data): - """Test creating a valid media message.""" - # AgentV1MediaMessage is typically just bytes - assert isinstance(sample_audio_data, bytes) - assert len(sample_audio_data) > 0 - - def test_empty_media_message(self): - """Test empty media message.""" - empty_data = b"" - assert isinstance(empty_data, bytes) - assert len(empty_data) == 0 - - -class TestAgentV1ModelIntegration: - """Integration tests for Agent V1 models.""" - - def test_model_roundtrip_serialization(self, valid_model_data): - """Test that models can be serialized and deserialized.""" - # Test conversation text event roundtrip - conversation_data = valid_model_data("agent_v1_conversation_text") - original_event = AgentV1ConversationTextEvent(**conversation_data) - - # Serialize to JSON and back - json_str = original_event.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_event = AgentV1ConversationTextEvent(**parsed_data) - - assert original_event.type == reconstructed_event.type - assert original_event.role == reconstructed_event.role - assert original_event.content == reconstructed_event.content - - def test_comprehensive_function_call_scenarios(self): - """Test comprehensive function call scenarios.""" - # Test various function call types - function_scenarios = [ - { - "id": "weather-1", - "name": "get_weather", - "arguments": '{"location": "New York", "units": "metric"}', - "client_side": False - }, - { - "id": "time-1", - "name": "get_current_time", - "arguments": '{"timezone": "America/New_York"}', - "client_side": True - }, - { - "id": "calc-1", - "name": "calculate", - "arguments": '{"expression": "2 + 2"}', - "client_side": False - } - ] - - for scenario in function_scenarios: - event = AgentV1FunctionCallRequestEvent( - type="FunctionCallRequest", - functions=[scenario] - ) - assert len(event.functions) == 1 - assert event.functions[0].name == scenario["name"] - assert event.functions[0].client_side == scenario["client_side"] - - def test_latency_measurements_edge_cases(self): - """Test latency measurements with edge cases.""" - # Test with zero latencies - event = AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency=0.0, - tts_latency=0.0, - ttt_latency=0.0 - ) - assert event.total_latency == 0.0 - - # Test with very high latencies - event = AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency=99999.999, - tts_latency=50000.0, - ttt_latency=49999.999 - ) - assert event.total_latency == 99999.999 - - # Test with fractional latencies - event = AgentV1AgentStartedSpeakingEvent( - type="AgentStartedSpeaking", - total_latency=123.456789, - tts_latency=45.123456, - ttt_latency=78.333333 - ) - assert event.total_latency == 123.456789 - - def test_error_and_warning_comprehensive(self): - """Test comprehensive error and warning scenarios.""" - # Test common error scenarios - error_scenarios = [ - { - "description": "Function 'get_weather' not found", - "code": "FUNCTION_NOT_FOUND" - }, - { - "description": "Invalid function arguments provided", - "code": "INVALID_ARGUMENTS" - }, - { - "description": "Function execution timeout", - "code": "FUNCTION_TIMEOUT" - }, - { - "description": "Rate limit exceeded for function calls", - "code": "RATE_LIMIT_EXCEEDED" - } - ] - - for scenario in error_scenarios: - event = AgentV1ErrorEvent( - type="Error", - description=scenario["description"], - code=scenario["code"] - ) - assert event.description == scenario["description"] - assert event.code == scenario["code"] - - # Test common warning scenarios - warning_scenarios = [ - { - "description": "Function call taking longer than expected", - "code": "FUNCTION_SLOW_WARNING" - }, - { - "description": "Connection quality may affect performance", - "code": "CONNECTION_QUALITY_WARNING" - } - ] - - for scenario in warning_scenarios: - event = AgentV1WarningEvent( - type="Warning", - description=scenario["description"], - code=scenario["code"] - ) - assert event.description == scenario["description"] - assert event.code == scenario["code"] - - def test_model_immutability(self, valid_model_data): - """Test that models are properly validated on construction.""" - data = valid_model_data("agent_v1_conversation_text") - event = AgentV1ConversationTextEvent(**data) - - # Models should be immutable by default in Pydantic v2 - # Test that we can access all fields - assert event.type == "ConversationText" - assert event.role is not None - assert event.content is not None diff --git a/tests/unit/test_api_response_models.py b/tests/unit/test_api_response_models.py deleted file mode 100644 index 7479e2fa..00000000 --- a/tests/unit/test_api_response_models.py +++ /dev/null @@ -1,626 +0,0 @@ -""" -Unit tests for core API response models. -""" -import pytest -from pydantic import ValidationError - -# Import the core API response models -from deepgram.types.listen_v1response import ListenV1Response -from deepgram.types.read_v1response import ReadV1Response -from deepgram.types.speak_v1response import SpeakV1Response -from deepgram.types.error_response_modern_error import ErrorResponseModernError -from deepgram.types.error_response_legacy_error import ErrorResponseLegacyError - - -class TestListenV1Response: - """Test ListenV1Response model.""" - - def test_valid_listen_response(self): - """Test creating a valid listen response.""" - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - }, - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [ - { - "word": "Hello", - "start": 0.0, - "end": 0.5, - "confidence": 0.95 - }, - { - "word": "world", - "start": 0.6, - "end": 1.0, - "confidence": 0.95 - } - ] - } - ] - } - ] - } - } - - response = ListenV1Response(**response_data) - - assert response.metadata is not None - assert response.results is not None - assert response.metadata.request_id == "req-123" - assert response.metadata.duration == 1.5 - assert response.metadata.channels == 1 - - def test_listen_response_serialization(self): - """Test listen response serialization.""" - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [] - } - ] - } - ] - } - } - - response = ListenV1Response(**response_data) - - # Test dict conversion - response_dict = response.model_dump() - assert "metadata" in response_dict - assert "results" in response_dict - assert response_dict["metadata"]["request_id"] == "req-123" - - # Test JSON serialization - json_str = response.model_dump_json() - assert '"request_id":"req-123"' in json_str - assert '"transcript":"Hello world"' in json_str - - def test_listen_response_missing_required_fields(self): - """Test listen response with missing required fields.""" - # Missing metadata - with pytest.raises(ValidationError) as exc_info: - ListenV1Response( - results={ - "channels": [] - } - ) - assert "metadata" in str(exc_info.value) - - # Missing results - with pytest.raises(ValidationError) as exc_info: - ListenV1Response( - metadata={ - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": [] - } - ) - assert "results" in str(exc_info.value) - - def test_listen_response_empty_channels(self): - """Test listen response with empty channels.""" - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 0, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [] - } - } - - response = ListenV1Response(**response_data) - assert len(response.results.channels) == 0 - assert response.metadata.channels == 0 - - def test_listen_response_multiple_alternatives(self): - """Test listen response with multiple alternatives.""" - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [] - }, - { - "transcript": "Hello word", - "confidence": 0.85, - "words": [] - } - ] - } - ] - } - } - - response = ListenV1Response(**response_data) - assert len(response.results.channels) == 1 - assert len(response.results.channels[0].alternatives) == 2 - assert response.results.channels[0].alternatives[0].confidence == 0.95 - assert response.results.channels[0].alternatives[1].confidence == 0.85 - - -class TestReadV1Response: - """Test ReadV1Response model.""" - - def test_valid_read_response(self): - """Test creating a valid read response.""" - response_data = { - "metadata": { - "request_id": "read-123", - "created": "2023-01-01T00:00:00Z", - "language": "en", - "model": "nova-2-general", - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "summary": { - "text": "This is a summary of the analyzed text.", - "start_word": 0, - "end_word": 10 - } - } - } - - response = ReadV1Response(**response_data) - - assert response.metadata is not None - assert response.results is not None - assert response.metadata.request_id == "read-123" - assert response.metadata.language == "en" - assert response.results.summary.text == "This is a summary of the analyzed text." - - def test_read_response_serialization(self): - """Test read response serialization.""" - response_data = { - "metadata": { - "request_id": "read-123", - "created": "2023-01-01T00:00:00Z", - "language": "en", - "model": "nova-2-general" - }, - "results": { - "summary": { - "text": "Summary text", - "start_word": 0, - "end_word": 5 - } - } - } - - response = ReadV1Response(**response_data) - - # Test dict conversion - response_dict = response.model_dump() - assert "metadata" in response_dict - assert "results" in response_dict - assert response_dict["metadata"]["request_id"] == "read-123" - - # Test JSON serialization - json_str = response.model_dump_json() - assert '"request_id":"read-123"' in json_str - assert '"text":"Summary text"' in json_str - - def test_read_response_missing_required_fields(self): - """Test read response with missing required fields.""" - # Missing metadata - with pytest.raises(ValidationError) as exc_info: - ReadV1Response( - results={ - "summary": { - "text": "Summary", - "start_word": 0, - "end_word": 1 - } - } - ) - assert "metadata" in str(exc_info.value) - - def test_read_response_optional_fields(self): - """Test read response with optional fields.""" - response_data = { - "metadata": { - "request_id": "read-123", - "created": "2023-01-01T00:00:00Z", - "language": "en", - "model": "nova-2-general", - "intents_info": { - "model_uuid": "intent-model-123" - }, - "sentiment_info": { - "model_uuid": "sentiment-model-123" - }, - "topics_info": { - "model_uuid": "topics-model-123" - }, - "summary_info": { - "model_uuid": "summary-model-123" - } - }, - "results": { - "summary": { - "text": "Summary with all optional metadata", - "start_word": 0, - "end_word": 5 - } - } - } - - response = ReadV1Response(**response_data) - assert response.metadata.intents_info is not None - assert response.metadata.sentiment_info is not None - assert response.metadata.topics_info is not None - assert response.metadata.summary_info is not None - - -class TestSpeakV1Response: - """Test SpeakV1Response model.""" - - def test_valid_speak_response(self, sample_audio_data): - """Test creating a valid speak response.""" - # SpeakV1Response is typically just bytes (audio data) - assert isinstance(sample_audio_data, bytes) - assert len(sample_audio_data) > 0 - - def test_empty_speak_response(self): - """Test empty speak response.""" - empty_audio = b"" - assert isinstance(empty_audio, bytes) - assert len(empty_audio) == 0 - - def test_large_speak_response(self): - """Test large speak response.""" - large_audio = b"\x00\x01\x02\x03" * 50000 # 200KB - assert isinstance(large_audio, bytes) - assert len(large_audio) == 200000 - - def test_speak_response_audio_formats(self): - """Test speak response with different audio format headers.""" - # WAV header simulation - wav_header = b"RIFF\x24\x08\x00\x00WAVEfmt " - wav_audio = wav_header + b"\x00\x01" * 1000 - assert isinstance(wav_audio, bytes) - assert wav_audio.startswith(b"RIFF") - - # MP3 header simulation - mp3_header = b"\xff\xfb" # MP3 sync word - mp3_audio = mp3_header + b"\x00\x01" * 1000 - assert isinstance(mp3_audio, bytes) - assert mp3_audio.startswith(b"\xff\xfb") - - -class TestErrorResponseModern: - """Test ErrorResponseModernError model.""" - - def test_valid_modern_error_response(self): - """Test creating a valid modern error response.""" - error_data = { - "message": "Invalid API key", - "category": "authentication_error" - } - - response = ErrorResponseModernError(**error_data) - assert response.message == "Invalid API key" - assert response.category == "authentication_error" - - -class TestErrorResponseLegacy: - """Test ErrorResponseLegacyError model.""" - - def test_valid_legacy_error_response(self): - """Test creating a valid legacy error response.""" - error_data = { - "err_code": "INVALID_AUTH", - "err_msg": "Invalid credentials provided" - } - - response = ErrorResponseLegacyError(**error_data) - assert response.err_code == "INVALID_AUTH" - assert response.err_msg == "Invalid credentials provided" - - def test_error_response_serialization(self): - """Test error response serialization.""" - error_data = { - "err_code": "RATE_LIMIT", - "err_msg": "Rate limit exceeded" - } - - response = ErrorResponseLegacyError(**error_data) - - # Test dict conversion - response_dict = response.model_dump() - assert response_dict["err_code"] == "RATE_LIMIT" - assert response_dict["err_msg"] == "Rate limit exceeded" - - # Test JSON serialization - json_str = response.model_dump_json() - assert '"err_code":"RATE_LIMIT"' in json_str - assert '"err_msg":"Rate limit exceeded"' in json_str - - -class TestAPIResponseModelIntegration: - """Integration tests for API response models.""" - - def test_model_roundtrip_serialization(self): - """Test that models can be serialized and deserialized.""" - # Test listen response roundtrip - original_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [] - } - ] - } - ] - } - } - - original_response = ListenV1Response(**original_data) - - # Serialize to JSON and back - json_str = original_response.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_response = ListenV1Response(**parsed_data) - - assert original_response.metadata.request_id == reconstructed_response.metadata.request_id - assert original_response.metadata.duration == reconstructed_response.metadata.duration - assert len(original_response.results.channels) == len(reconstructed_response.results.channels) - - def test_model_validation_edge_cases(self): - """Test edge cases in model validation.""" - # Test with very long transcript - long_transcript = "word " * 10000 # ~50KB - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1000.0, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": long_transcript, - "confidence": 0.95, - "words": [] - } - ] - } - ] - } - } - - response = ListenV1Response(**response_data) - assert len(response.results.channels[0].alternatives[0].transcript) > 40000 - - def test_model_with_extreme_numeric_values(self): - """Test models with extreme numeric values.""" - # Test with very high confidence and long duration - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 99999.999999, - "channels": 1000, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Test", - "confidence": 1.0, - "words": [] - } - ] - } - ] - } - } - - response = ListenV1Response(**response_data) - assert response.metadata.duration == 99999.999999 - assert response.metadata.channels == 1000 - assert response.results.channels[0].alternatives[0].confidence == 1.0 - - def test_comprehensive_error_scenarios(self): - """Test comprehensive error scenarios.""" - # Test various HTTP error codes and messages - error_scenarios = [ - { - "message": "Bad Request - Invalid parameters", - "type": "bad_request_error" - }, - { - "message": "Unauthorized - Invalid API key", - "type": "authentication_error" - }, - { - "message": "Forbidden - Insufficient permissions", - "type": "permission_error" - }, - { - "message": "Not Found - Resource does not exist", - "type": "not_found_error" - }, - { - "message": "Too Many Requests - Rate limit exceeded", - "type": "rate_limit_error" - }, - { - "message": "Internal Server Error", - "type": "server_error" - }, - { - "message": "Service Unavailable - Try again later", - "type": "service_unavailable_error" - } - ] - - for scenario in error_scenarios: - error_response = ErrorResponseModernError( - message=scenario["message"], - category=scenario["type"] - ) - assert error_response.message == scenario["message"] - assert error_response.category == scenario["type"] - - def test_model_comparison_and_equality(self): - """Test model equality comparison.""" - response_data = { - "metadata": { - "transaction_key": "deprecated", - "request_id": "req-123", - "sha256": "abc123def456", - "created": "2023-01-01T00:00:00Z", - "duration": 1.5, - "channels": 1, - "models": ["nova-2-general"], - "model_info": { - "name": "nova-2-general", - "version": "1.0", - "arch": "nova" - } - }, - "results": { - "channels": [ - { - "alternatives": [ - { - "transcript": "Hello world", - "confidence": 0.95, - "words": [] - } - ] - } - ] - } - } - - response1 = ListenV1Response(**response_data) - response2 = ListenV1Response(**response_data) - - # Same data should be equal - assert response1 == response2 - - # Different data should not be equal - different_data = response_data.copy() - different_data["metadata"]["request_id"] = "req-456" - response3 = ListenV1Response(**different_data) - assert response1 != response3 diff --git a/tests/unit/test_core_file.py b/tests/unit/test_core_file.py deleted file mode 100644 index 4f7ba397..00000000 --- a/tests/unit/test_core_file.py +++ /dev/null @@ -1,279 +0,0 @@ -""" -Unit tests for core file handling utilities. -""" -import io -import pytest - -from deepgram.core.file import ( - convert_file_dict_to_httpx_tuples, - with_content_type -) - - -class TestConvertFileDictToHttpxTuples: - """Test convert_file_dict_to_httpx_tuples function.""" - - def test_simple_file_dict(self): - """Test converting a simple file dictionary.""" - file_content = b"test content" - file_dict = {"audio": file_content} - - result = convert_file_dict_to_httpx_tuples(file_dict) - - assert result == [("audio", file_content)] - - def test_multiple_files(self): - """Test converting dictionary with multiple files.""" - file_dict = { - "audio": b"audio content", - "metadata": "metadata content" - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - expected = [ - ("audio", b"audio content"), - ("metadata", "metadata content") - ] - assert sorted(result) == sorted(expected) - - def test_file_list(self): - """Test converting dictionary with list of files.""" - file_dict = { - "documents": [ - b"document1 content", - b"document2 content", - "document3 content" - ] - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - expected = [ - ("documents", b"document1 content"), - ("documents", b"document2 content"), - ("documents", "document3 content") - ] - assert result == expected - - def test_mixed_files_and_lists(self): - """Test converting dictionary with both single files and file lists.""" - file_dict = { - "single_file": b"single content", - "multiple_files": [ - b"multi1 content", - b"multi2 content" - ] - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - expected = [ - ("single_file", b"single content"), - ("multiple_files", b"multi1 content"), - ("multiple_files", b"multi2 content") - ] - assert sorted(result) == sorted(expected) - - def test_tuple_file_format(self): - """Test converting files in tuple format.""" - file_dict = { - "file_with_name": ("test.txt", b"content"), - "file_with_content_type": ("test.json", b'{"key": "value"}', "application/json") - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - expected = [ - ("file_with_name", ("test.txt", b"content")), - ("file_with_content_type", ("test.json", b'{"key": "value"}', "application/json")) - ] - assert sorted(result) == sorted(expected) - - def test_io_objects(self): - """Test converting with IO objects.""" - file_content = io.BytesIO(b"io content") - file_dict = {"io_file": file_content} - - result = convert_file_dict_to_httpx_tuples(file_dict) - - assert result == [("io_file", file_content)] - - def test_empty_dict(self): - """Test converting empty dictionary.""" - result = convert_file_dict_to_httpx_tuples({}) - assert result == [] - - def test_empty_list_value(self): - """Test converting dictionary with empty list value.""" - file_dict = {"empty_files": []} - - result = convert_file_dict_to_httpx_tuples(file_dict) - - assert result == [] - - -class TestWithContentType: - """Test with_content_type function.""" - - def test_simple_file_content(self): - """Test adding content type to simple file content.""" - file_content = b"test content" - - result = with_content_type(file=file_content, default_content_type="application/octet-stream") - - expected = (None, file_content, "application/octet-stream") - assert result == expected - - def test_string_file_content(self): - """Test adding content type to string file content.""" - file_content = "test content" - - result = with_content_type(file=file_content, default_content_type="text/plain") - - expected = (None, file_content, "text/plain") - assert result == expected - - def test_io_file_content(self): - """Test adding content type to IO file content.""" - file_content = io.BytesIO(b"io content") - - result = with_content_type(file=file_content, default_content_type="application/octet-stream") - - expected = (None, file_content, "application/octet-stream") - assert result == expected - - def test_two_element_tuple(self): - """Test adding content type to (filename, content) tuple.""" - file_tuple = ("test.txt", b"file content") - - result = with_content_type(file=file_tuple, default_content_type="text/plain") - - expected = ("test.txt", b"file content", "text/plain") - assert result == expected - - def test_three_element_tuple_with_content_type(self): - """Test handling (filename, content, content_type) tuple.""" - file_tuple = ("test.json", b'{"key": "value"}', "application/json") - - result = with_content_type(file=file_tuple, default_content_type="text/plain") - - # Should keep the existing content type - expected = ("test.json", b'{"key": "value"}', "application/json") - assert result == expected - - def test_three_element_tuple_with_none_content_type(self): - """Test handling tuple with None content type.""" - file_tuple = ("test.txt", b"content", None) - - result = with_content_type(file=file_tuple, default_content_type="text/plain") - - # Should use the default content type - expected = ("test.txt", b"content", "text/plain") - assert result == expected - - def test_four_element_tuple_with_headers(self): - """Test handling (filename, content, content_type, headers) tuple.""" - headers = {"X-Custom": "value"} - file_tuple = ("test.txt", b"content", "text/plain", headers) - - result = with_content_type(file=file_tuple, default_content_type="application/octet-stream") - - # Should keep the existing content type and headers - expected = ("test.txt", b"content", "text/plain", headers) - assert result == expected - - def test_four_element_tuple_with_none_content_type(self): - """Test handling tuple with None content type and headers.""" - headers = {"X-Custom": "value"} - file_tuple = ("test.txt", b"content", None, headers) - - result = with_content_type(file=file_tuple, default_content_type="application/json") - - # Should use default content type but keep headers - expected = ("test.txt", b"content", "application/json", headers) - assert result == expected - - def test_invalid_tuple_length(self): - """Test handling tuple with invalid length.""" - invalid_tuple = ("a", "b", "c", "d", "e") # 5 elements - - with pytest.raises(ValueError, match="Unexpected tuple length: 5"): - with_content_type(file=invalid_tuple, default_content_type="text/plain") - - def test_single_element_tuple(self): - """Test handling single element tuple.""" - invalid_tuple = ("only_one",) # 1 element - - with pytest.raises(ValueError, match="Unexpected tuple length: 1"): - with_content_type(file=invalid_tuple, default_content_type="text/plain") - - -class TestFileTyping: - """Test file type definitions and edge cases.""" - - def test_various_file_content_types(self): - """Test that various FileContent types work correctly.""" - # Test bytes - bytes_content = b"bytes content" - result = with_content_type(file=bytes_content, default_content_type="application/octet-stream") - assert result[1] == bytes_content - - # Test string - string_content = "string content" - result = with_content_type(file=string_content, default_content_type="text/plain") - assert result[1] == string_content - - # Test IO - io_content = io.BytesIO(b"io content") - result = with_content_type(file=io_content, default_content_type="application/octet-stream") - assert result[1] == io_content - - def test_file_dict_with_various_types(self): - """Test file dict conversion with various file types.""" - string_io = io.StringIO("string io content") - bytes_io = io.BytesIO(b"bytes io content") - - file_dict = { - "bytes": b"bytes content", - "string": "string content", - "string_io": string_io, - "bytes_io": bytes_io, - "tuple_basic": ("file.txt", b"content"), - "tuple_with_type": ("file.json", b'{}', "application/json"), - "tuple_with_headers": ("file.xml", b"", "application/xml", {"X-Custom": "header"}) - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - # Should have 7 tuples - assert len(result) == 7 - - # Check that all keys are preserved - keys = [item[0] for item in result] - expected_keys = ["bytes", "string", "string_io", "bytes_io", "tuple_basic", "tuple_with_type", "tuple_with_headers"] - assert sorted(keys) == sorted(expected_keys) - - def test_complex_file_combinations(self): - """Test complex combinations of file types and lists.""" - file_dict = { - "mixed_list": [ - b"raw bytes", - ("named.txt", "string content"), - ("typed.json", b'{"test": true}', "application/json"), - io.BytesIO(b"io stream") - ], - "single_complex": ("complex.xml", io.StringIO("content"), "application/xml", {"Encoding": "utf-8"}) - } - - result = convert_file_dict_to_httpx_tuples(file_dict) - - # Should have 5 total items (4 from list + 1 single) - assert len(result) == 5 - - # All should have "mixed_list" or "single_complex" as key - mixed_items = [item for item in result if item[0] == "mixed_list"] - single_items = [item for item in result if item[0] == "single_complex"] - - assert len(mixed_items) == 4 - assert len(single_items) == 1 diff --git a/tests/unit/test_core_jsonable_encoder.py b/tests/unit/test_core_jsonable_encoder.py deleted file mode 100644 index 4ec341e5..00000000 --- a/tests/unit/test_core_jsonable_encoder.py +++ /dev/null @@ -1,372 +0,0 @@ -""" -Unit tests for core JSON encoder functionality. -""" -import pytest -import datetime as dt -import base64 -import dataclasses -from enum import Enum -from pathlib import Path, PurePath -from typing import Dict, List, Any, Optional, Set -from unittest.mock import Mock, patch -import io - -from pydantic import BaseModel -from deepgram.core.jsonable_encoder import jsonable_encoder - - -# Test models and enums -class JsonTestEnum(str, Enum): - VALUE_ONE = "value_one" - VALUE_TWO = "value_two" - - -class SimpleModel(BaseModel): - name: str - age: int - active: bool = True - - -@dataclasses.dataclass -class JsonTestDataclass: - name: str - value: int - optional: Optional[str] = None - - -class TestJsonableEncoder: - """Test jsonable_encoder function.""" - - def test_simple_types(self): - """Test encoding simple Python types.""" - # Strings - assert jsonable_encoder("hello") == "hello" - - # Numbers - assert jsonable_encoder(42) == 42 - assert jsonable_encoder(3.14) == 3.14 - - # Booleans - assert jsonable_encoder(True) is True - assert jsonable_encoder(False) is False - - # None - assert jsonable_encoder(None) is None - - def test_collections(self): - """Test encoding collection types.""" - # Lists - assert jsonable_encoder([1, 2, 3]) == [1, 2, 3] - assert jsonable_encoder(["a", "b", "c"]) == ["a", "b", "c"] - - # Tuples (should become lists) - assert jsonable_encoder((1, 2, 3)) == [1, 2, 3] - - # Sets (should become lists) - result = jsonable_encoder({1, 2, 3}) - assert isinstance(result, list) - assert sorted(result) == [1, 2, 3] - - # Dictionaries - test_dict = {"key1": "value1", "key2": 42} - assert jsonable_encoder(test_dict) == test_dict - - def test_datetime_objects(self): - """Test encoding datetime objects.""" - # datetime - dt_obj = dt.datetime(2023, 12, 25, 10, 30, 45) - result = jsonable_encoder(dt_obj) - assert isinstance(result, str) - assert "2023-12-25T10:30:45" in result - - # date - date_obj = dt.date(2023, 12, 25) - result = jsonable_encoder(date_obj) - assert isinstance(result, str) - assert "2023-12-25" in result - - # time - time_obj = dt.time(10, 30, 45) - result = jsonable_encoder(time_obj) - assert isinstance(result, str) - assert "10:30:45" in result - - # timedelta - delta_obj = dt.timedelta(days=5, hours=3, minutes=30) - result = jsonable_encoder(delta_obj) - # Should be encoded as string in ISO format or total seconds - assert isinstance(result, (float, str)) - - def test_enum_encoding(self): - """Test encoding enum values.""" - assert jsonable_encoder(JsonTestEnum.VALUE_ONE) == "value_one" - assert jsonable_encoder(JsonTestEnum.VALUE_TWO) == "value_two" - - def test_pydantic_model_encoding(self): - """Test encoding Pydantic models.""" - model = SimpleModel(name="John", age=30) - result = jsonable_encoder(model) - - expected = {"name": "John", "age": 30, "active": True} - assert result == expected - - def test_dataclass_encoding(self): - """Test encoding dataclass objects.""" - dataclass_obj = JsonTestDataclass(name="Test", value=42, optional="optional_value") - result = jsonable_encoder(dataclass_obj) - - expected = {"name": "Test", "value": 42, "optional": "optional_value"} - assert result == expected - - def test_dataclass_with_none_values(self): - """Test encoding dataclass with None values.""" - dataclass_obj = JsonTestDataclass(name="Test", value=42) # optional defaults to None - result = jsonable_encoder(dataclass_obj) - - expected = {"name": "Test", "value": 42, "optional": None} - assert result == expected - - def test_path_objects(self): - """Test encoding Path and PurePath objects.""" - # Path object - path_obj = Path("/tmp/test.txt") - result = jsonable_encoder(path_obj) - assert result == str(path_obj) - - # PurePath object - pure_path_obj = PurePath("/tmp/pure_test.txt") - result = jsonable_encoder(pure_path_obj) - assert result == str(pure_path_obj) - - def test_bytes_encoding(self): - """Test encoding bytes objects.""" - bytes_data = b"hello world" - result = jsonable_encoder(bytes_data) - - # Should be base64 encoded - expected = base64.b64encode(bytes_data).decode() - assert result == expected - - def test_nested_structures(self): - """Test encoding nested data structures.""" - nested_data = { - "user": SimpleModel(name="Alice", age=25), - "timestamps": [ - dt.datetime(2023, 1, 1, 12, 0, 0), - dt.datetime(2023, 1, 2, 12, 0, 0) - ], - "metadata": { - "enum_value": JsonTestEnum.VALUE_ONE, - "path": Path("/tmp/file.txt"), - "data": JsonTestDataclass(name="nested", value=100) - } - } - - result = jsonable_encoder(nested_data) - - # Check structure is preserved - assert "user" in result - assert "timestamps" in result - assert "metadata" in result - - # Check user model is encoded - assert result["user"]["name"] == "Alice" - assert result["user"]["age"] == 25 - - # Check timestamps are encoded as strings - assert all(isinstance(ts, str) for ts in result["timestamps"]) - - # Check nested metadata - assert result["metadata"]["enum_value"] == "value_one" - assert result["metadata"]["path"] == "/tmp/file.txt" - assert result["metadata"]["data"]["name"] == "nested" - - def test_custom_encoder(self): - """Test using custom encoder functions.""" - class CustomClass: - def __init__(self, value): - self.value = value - - def custom_encoder(obj): - return f"custom_{obj.value}" - - custom_obj = CustomClass("test") - result = jsonable_encoder(custom_obj, custom_encoder={CustomClass: custom_encoder}) - - assert result == "custom_test" - - def test_custom_encoder_inheritance(self): - """Test custom encoder with inheritance.""" - class BaseClass: - def __init__(self, value): - self.value = value - - class DerivedClass(BaseClass): - pass - - def base_encoder(obj): - return f"base_{obj.value}" - - derived_obj = DerivedClass("derived") - result = jsonable_encoder(derived_obj, custom_encoder={BaseClass: base_encoder}) - - assert result == "base_derived" - - def test_generator_encoding(self): - """Test encoding generator objects.""" - def test_generator(): - yield 1 - yield 2 - yield 3 - - gen = test_generator() - result = jsonable_encoder(gen) - - # Generator should be converted to list - assert result == [1, 2, 3] - - def test_complex_nested_with_custom_encoders(self): - """Test complex nested structure with custom encoders.""" - class SpecialValue: - def __init__(self, data): - self.data = data - - def special_encoder(obj): - return {"special": obj.data} - - complex_data = { - "models": [ - SimpleModel(name="User1", age=20), - SimpleModel(name="User2", age=30) - ], - "special": SpecialValue("important_data"), - "mixed_list": [ - JsonTestEnum.VALUE_ONE, - dt.datetime(2023, 6, 15), - {"nested": SpecialValue("nested_data")} - ] - } - - result = jsonable_encoder(complex_data, custom_encoder={SpecialValue: special_encoder}) - - # Check models are encoded - assert len(result["models"]) == 2 - assert result["models"][0]["name"] == "User1" - - # Check custom encoder is used - assert result["special"] == {"special": "important_data"} - assert result["mixed_list"][2]["nested"] == {"special": "nested_data"} - - # Check enum and datetime are encoded - assert result["mixed_list"][0] == "value_one" - assert isinstance(result["mixed_list"][1], str) - - def test_pydantic_model_with_custom_config(self): - """Test Pydantic model with custom JSON encoders in config.""" - class ModelWithCustomEncoder(BaseModel): - name: str - special_field: Any - - class Config: - json_encoders = { - str: lambda v: v.upper() - } - - model = ModelWithCustomEncoder(name="test", special_field="special") - result = jsonable_encoder(model) - - # The custom encoder from model config should be applied - # Note: This tests the integration with Pydantic's config - assert "name" in result - assert "special_field" in result - - def test_edge_cases(self): - """Test edge cases and unusual inputs.""" - # Empty collections - assert jsonable_encoder([]) == [] - assert jsonable_encoder({}) == {} - assert jsonable_encoder(set()) == [] - - # Nested empty collections - assert jsonable_encoder({"empty": []}) == {"empty": []} - - # Very deep nesting - deep_dict = {"level": {"level": {"level": "deep_value"}}} - result = jsonable_encoder(deep_dict) - assert result["level"]["level"]["level"] == "deep_value" - - def test_circular_reference_handling(self): - """Test that circular references are handled gracefully.""" - # Create a structure that could cause infinite recursion - data = {"self_ref": None} - # Don't actually create circular reference as it would cause issues - # Instead test that normal references work fine - shared_dict = {"shared": "value"} - data = {"ref1": shared_dict, "ref2": shared_dict} - - result = jsonable_encoder(data) - assert result["ref1"]["shared"] == "value" - assert result["ref2"]["shared"] == "value" - - def test_io_objects(self): - """Test encoding IO objects.""" - # StringIO - string_io = io.StringIO("test content") - result = jsonable_encoder(string_io) - # Should be converted to some JSON-serializable form - assert isinstance(result, (str, dict, list)) - - # BytesIO - bytes_io = io.BytesIO(b"test content") - result = jsonable_encoder(bytes_io) - # Should be handled appropriately - assert result is not None - - -class TestJsonableEncoderEdgeCases: - """Test edge cases and error conditions.""" - - def test_none_custom_encoder(self): - """Test that None custom_encoder is handled properly.""" - result = jsonable_encoder("test", custom_encoder=None) - assert result == "test" - - def test_empty_custom_encoder(self): - """Test that empty custom_encoder dict is handled properly.""" - result = jsonable_encoder("test", custom_encoder={}) - assert result == "test" - - def test_unicode_strings(self): - """Test encoding unicode strings.""" - unicode_data = { - "chinese": "δ½ ε₯½δΈ–η•Œ", - "emoji": "πŸš€πŸŒŸπŸ’«", - "mixed": "Hello δΈ–η•Œ 🌍", - "special_chars": "cafΓ© naΓ―ve rΓ©sumΓ©" - } - - result = jsonable_encoder(unicode_data) - assert result == unicode_data # Should pass through unchanged - - def test_very_large_numbers(self): - """Test encoding very large numbers.""" - large_int = 2**100 - large_float = float('1e308') - - assert jsonable_encoder(large_int) == large_int - assert jsonable_encoder(large_float) == large_float - - def test_special_float_values(self): - """Test encoding special float values.""" - import math - - # Note: These might be handled differently by the encoder - # The exact behavior depends on the implementation - result_inf = jsonable_encoder(float('inf')) - result_ninf = jsonable_encoder(float('-inf')) - result_nan = jsonable_encoder(float('nan')) - - # Just ensure they don't crash and return something - assert result_inf is not None - assert result_ninf is not None - assert result_nan is not None diff --git a/tests/unit/test_core_models.py b/tests/unit/test_core_models.py deleted file mode 100644 index 2b430999..00000000 --- a/tests/unit/test_core_models.py +++ /dev/null @@ -1,430 +0,0 @@ -""" -Unit tests for core data models and utilities. -""" -import pytest -from pydantic import ValidationError - -# Import core utility models -from deepgram.extensions.telemetry.models import TelemetryEvent, TelemetryContext -from deepgram.core.api_error import ApiError -from deepgram.environment import DeepgramClientEnvironment - - -class TestTelemetryModels: - """Test telemetry-related models.""" - - def test_valid_telemetry_event(self): - """Test creating a valid telemetry event.""" - from datetime import datetime - event = TelemetryEvent( - name="connection_started", - time=datetime.now(), - attributes={"connection_type": "websocket"}, - metrics={} - ) - - assert event.name == "connection_started" - assert event.time is not None - assert event.attributes["connection_type"] == "websocket" - assert event.metrics == {} - - def test_telemetry_event_serialization(self): - """Test telemetry event serialization.""" - from datetime import datetime - event = TelemetryEvent( - name="audio_sent", - time=datetime.now(), - attributes={"bytes_sent": "1024"}, - metrics={"latency": 50.5} - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["name"] == "audio_sent" - assert event_dict["attributes"]["bytes_sent"] == "1024" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"name":"audio_sent"' in json_str - assert '"bytes_sent":"1024"' in json_str - - def test_telemetry_event_missing_required_fields(self): - """Test telemetry event with missing required fields.""" - # Missing name - from datetime import datetime - with pytest.raises(ValidationError) as exc_info: - TelemetryEvent( - time=datetime.now(), - attributes={}, - metrics={} - ) - assert "name" in str(exc_info.value) - - # Missing time - from datetime import datetime - with pytest.raises(ValidationError) as exc_info: - TelemetryEvent( - name="connection_started", - attributes={}, - metrics={} - ) - assert "time" in str(exc_info.value) - - def test_telemetry_event_optional_metadata(self): - """Test telemetry event with optional metadata.""" - from datetime import datetime - # Event without attributes/metrics - event = TelemetryEvent( - name="connection_closed", - time=datetime.now(), - attributes={}, - metrics={} - ) - - assert event.attributes == {} - assert event.metrics == {} - - # Event with complex attributes and metrics - complex_attributes = { - "connection_type": "websocket", - "bytes_sent": "1024", - "bytes_received": "2048", - "error_count": "0", - "model_name": "nova-2-general", - "model_version": "1.0" - } - - complex_metrics = { - "connection_duration": 30.5, - "latency": 150.0 - } - - event_with_data = TelemetryEvent( - name="connection_summary", - time=datetime.now(), - attributes=complex_attributes, - metrics=complex_metrics - ) - - assert event_with_data.attributes["bytes_sent"] == "1024" - assert event_with_data.attributes["model_name"] == "nova-2-general" - assert event_with_data.metrics["connection_duration"] == 30.5 - - def test_telemetry_context_model(self): - """Test telemetry context model.""" - context = TelemetryContext( - session_id="session-123", - request_id="req-456" - ) - - assert context.session_id == "session-123" - assert context.request_id == "req-456" - - def test_telemetry_context_serialization(self): - """Test telemetry context serialization.""" - context = TelemetryContext( - session_id="session-123", - request_id="req-456" - ) - - # Test dict conversion - context_dict = context.model_dump() - assert context_dict["session_id"] == "session-123" - assert context_dict["request_id"] == "req-456" - - # Test JSON serialization - json_str = context.model_dump_json() - assert '"session_id":"session-123"' in json_str - assert '"request_id":"req-456"' in json_str - - -class TestApiError: - """Test ApiError model.""" - - def test_api_error_creation(self): - """Test creating an API error.""" - error = ApiError( - status_code=401, - body="Unauthorized: Invalid API key" - ) - - assert error.status_code == 401 - assert error.body == "Unauthorized: Invalid API key" - assert "401" in str(error) - assert "Unauthorized" in str(error) - - def test_api_error_with_headers(self): - """Test API error with headers.""" - headers = { - "Content-Type": "application/json", - "X-RateLimit-Remaining": "0" - } - - error = ApiError( - status_code=429, - body="Rate limit exceeded", - headers=headers - ) - - assert error.status_code == 429 - assert error.headers["Content-Type"] == "application/json" - assert error.headers["X-RateLimit-Remaining"] == "0" - - def test_api_error_common_scenarios(self): - """Test common API error scenarios.""" - # 400 Bad Request - bad_request = ApiError( - status_code=400, - body="Bad Request: Invalid parameters" - ) - assert bad_request.status_code == 400 - - # 401 Unauthorized - unauthorized = ApiError( - status_code=401, - body="Unauthorized: Invalid API key" - ) - assert unauthorized.status_code == 401 - - # 403 Forbidden - forbidden = ApiError( - status_code=403, - body="Forbidden: Insufficient permissions" - ) - assert forbidden.status_code == 403 - - # 404 Not Found - not_found = ApiError( - status_code=404, - body="Not Found: Resource does not exist" - ) - assert not_found.status_code == 404 - - # 429 Too Many Requests - rate_limit = ApiError( - status_code=429, - body="Too Many Requests: Rate limit exceeded" - ) - assert rate_limit.status_code == 429 - - # 500 Internal Server Error - server_error = ApiError( - status_code=500, - body="Internal Server Error" - ) - assert server_error.status_code == 500 - - def test_api_error_json_body(self): - """Test API error with JSON body.""" - json_body = '{"error": {"message": "Invalid model", "type": "validation_error"}}' - - error = ApiError( - status_code=400, - body=json_body - ) - - assert error.status_code == 400 - assert "validation_error" in error.body - assert "Invalid model" in error.body - - def test_api_error_empty_body(self): - """Test API error with empty body.""" - error = ApiError( - status_code=500, - body="" - ) - - assert error.status_code == 500 - assert error.body == "" - - -class TestDeepgramClientEnvironment: - """Test DeepgramClientEnvironment enum.""" - - def test_environment_values(self): - """Test environment enum values.""" - # Test production environment - prod_env = DeepgramClientEnvironment.PRODUCTION - assert prod_env is not None - - # Test that we can access the production URL - assert hasattr(prod_env, 'production') or str(prod_env) == "https://api.deepgram.com" - - def test_environment_string_representation(self): - """Test environment string representation.""" - prod_env = DeepgramClientEnvironment.PRODUCTION - env_str = str(prod_env) - - # Should contain a valid URL - assert "https://" in env_str or "deepgram" in env_str.lower() - - def test_environment_comparison(self): - """Test environment comparison.""" - env1 = DeepgramClientEnvironment.PRODUCTION - env2 = DeepgramClientEnvironment.PRODUCTION - - # Same environments should be equal - assert env1 == env2 - assert env1 is env2 # Enum instances should be the same object - - -class TestCoreModelIntegration: - """Integration tests for core models.""" - - def test_telemetry_event_comprehensive_scenarios(self): - """Test comprehensive telemetry event scenarios.""" - # Connection lifecycle events - connection_events = [ - { - "event_type": "connection_started", - "metadata": {"connection_type": "websocket", "url": "wss://api.deepgram.com"} - }, - { - "event_type": "audio_sent", - "metadata": {"bytes_sent": "1024", "chunk_count": "1"} - }, - { - "event_type": "transcription_received", - "metadata": {"transcript_length": "50", "confidence": "0.95"} - }, - { - "event_type": "connection_closed", - "metadata": {"duration": "30.5", "reason": "client_disconnect"} - } - ] - - from datetime import datetime, timedelta - for i, event_data in enumerate(connection_events): - event = TelemetryEvent( - name=event_data["event_type"], - time=datetime.now() + timedelta(seconds=i), - attributes=event_data["metadata"], - metrics={} - ) - - assert event.name == event_data["event_type"] - assert event.time is not None - assert event.attributes == event_data["metadata"] - - def test_api_error_with_telemetry_context(self): - """Test API error in the context of telemetry.""" - # Simulate an error that would generate telemetry - error = ApiError( - status_code=429, - body="Rate limit exceeded", - headers={"X-RateLimit-Reset": "1609459200"} - ) - - # Create a telemetry event for this error - from datetime import datetime - error_event = TelemetryEvent( - name="api_error", - time=datetime.now(), - attributes={ - "status_code": str(error.status_code), - "error_body": error.body, - "rate_limit_reset": error.headers.get("X-RateLimit-Reset") if error.headers else None - }, - metrics={} - ) - - assert error_event.attributes["status_code"] == "429" - assert error_event.attributes["error_body"] == "Rate limit exceeded" - assert error_event.attributes["rate_limit_reset"] == "1609459200" - - def test_telemetry_headers_structure(self): - """Test telemetry-related headers structure.""" - telemetry_headers = { - "X-Deepgram-Session-ID": "session-123", - "X-Deepgram-Request-ID": "req-456", - "X-Deepgram-SDK-Version": "1.0.0", - "X-Deepgram-Platform": "python" - } - - # Test that we can create and validate header structures - assert telemetry_headers["X-Deepgram-Session-ID"] == "session-123" - assert telemetry_headers["X-Deepgram-Request-ID"] == "req-456" - assert telemetry_headers["X-Deepgram-SDK-Version"] == "1.0.0" - assert telemetry_headers["X-Deepgram-Platform"] == "python" - - def test_model_serialization_consistency(self): - """Test that all models serialize consistently.""" - # Test telemetry event - from datetime import datetime - event = TelemetryEvent( - name="test_event", - time=datetime.now(), - attributes={"test": "True"}, - metrics={"value": 42.0} - ) - - # Serialize and deserialize - json_str = event.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_event = TelemetryEvent(**parsed_data) - - assert event.name == reconstructed_event.name - # Compare timestamps allowing for timezone differences during serialization - assert event.time.replace(tzinfo=None) == reconstructed_event.time.replace(tzinfo=None) - assert event.attributes == reconstructed_event.attributes - assert event.metrics == reconstructed_event.metrics - - def test_model_validation_edge_cases(self): - """Test model validation edge cases.""" - # Test with very long strings - from datetime import datetime - long_name = "test_event_" + "x" * 10000 - event = TelemetryEvent( - name=long_name, - time=datetime.now(), - attributes={}, - metrics={} - ) - assert len(event.name) > 10000 - - # Test with complex string attributes (since attributes must be Dict[str, str]) - complex_attributes = { - "connection_type": "websocket", - "bytes_sent": "1024", - "bytes_received": "2048", - "error_count": "0", - "model_name": "nova-2-general", - "model_version": "1.0" - } - - event_with_complex_attributes = TelemetryEvent( - name="complex_test", - time=datetime.now(), - attributes=complex_attributes, - metrics={} - ) - - assert event_with_complex_attributes.attributes["bytes_sent"] == "1024" - assert event_with_complex_attributes.attributes["model_name"] == "nova-2-general" - - def test_error_handling_comprehensive(self): - """Test comprehensive error handling scenarios.""" - # Test various error status codes with realistic bodies - error_scenarios = [ - (400, '{"error": "Invalid request format"}'), - (401, '{"error": "Authentication failed", "code": "AUTH_001"}'), - (403, '{"error": "Access denied", "resource": "/v1/listen"}'), - (404, '{"error": "Model not found", "model": "invalid-model"}'), - (422, '{"error": "Validation failed", "fields": ["model", "language"]}'), - (429, '{"error": "Rate limit exceeded", "retry_after": 60}'), - (500, '{"error": "Internal server error", "incident_id": "inc-123"}'), - (502, '{"error": "Bad gateway", "upstream": "transcription-service"}'), - (503, '{"error": "Service unavailable", "maintenance": true}') - ] - - for status_code, body in error_scenarios: - error = ApiError( - status_code=status_code, - body=body, - headers={"Content-Type": "application/json"} - ) - - assert error.status_code == status_code - assert "error" in error.body - assert error.headers["Content-Type"] == "application/json" diff --git a/tests/unit/test_core_query_encoder.py b/tests/unit/test_core_query_encoder.py deleted file mode 100644 index 48380c2f..00000000 --- a/tests/unit/test_core_query_encoder.py +++ /dev/null @@ -1,347 +0,0 @@ -""" -Unit tests for core query encoder functionality. -""" -from pydantic import BaseModel - -from deepgram.core.query_encoder import encode_query, single_query_encoder, traverse_query_dict - - -class TestTraverseQueryDict: - """Test traverse_query_dict function.""" - - def test_simple_dict(self): - """Test traversing a simple flat dictionary.""" - input_dict = {"key1": "value1", "key2": "value2"} - result = traverse_query_dict(input_dict) - - expected = [("key1", "value1"), ("key2", "value2")] - assert sorted(result) == sorted(expected) - - def test_nested_dict(self): - """Test traversing a nested dictionary.""" - input_dict = { - "level1": { - "level2": "value", - "level2b": "value2" - } - } - result = traverse_query_dict(input_dict) - - expected = [("level1[level2]", "value"), ("level1[level2b]", "value2")] - assert sorted(result) == sorted(expected) - - def test_deeply_nested_dict(self): - """Test traversing a deeply nested dictionary.""" - input_dict = { - "level1": { - "level2": { - "level3": "deep_value" - } - } - } - result = traverse_query_dict(input_dict) - - expected = [("level1[level2][level3]", "deep_value")] - assert result == expected - - def test_dict_with_list_values(self): - """Test traversing dictionary with list values.""" - input_dict = { - "simple_list": ["item1", "item2"], - "complex_list": [{"nested": "value1"}, {"nested": "value2"}] - } - result = traverse_query_dict(input_dict) - - expected = [ - ("simple_list", "item1"), - ("simple_list", "item2"), - ("complex_list[nested]", "value1"), - ("complex_list[nested]", "value2") - ] - assert sorted(result) == sorted(expected) - - def test_with_key_prefix(self): - """Test traversing with a key prefix.""" - input_dict = {"key": "value"} - result = traverse_query_dict(input_dict, "prefix") - - expected = [("prefix[key]", "value")] - assert result == expected - - def test_empty_dict(self): - """Test traversing an empty dictionary.""" - result = traverse_query_dict({}) - assert result == [] - - def test_mixed_types(self): - """Test traversing dictionary with mixed value types.""" - input_dict = { - "string": "text", - "number": 42, - "boolean": True, - "none": None, - "nested": {"inner": "value"} - } - result = traverse_query_dict(input_dict) - - expected = [ - ("string", "text"), - ("number", 42), - ("boolean", True), - ("none", None), - ("nested[inner]", "value") - ] - assert sorted(result) == sorted(expected) - - -class QueryTestModel(BaseModel): - """Test Pydantic model for query encoder tests.""" - name: str - age: int - active: bool = True - - class Config: - extra = "allow" - - -class TestSingleQueryEncoder: - """Test single_query_encoder function.""" - - def test_simple_value(self): - """Test encoding a simple value.""" - result = single_query_encoder("key", "value") - assert result == [("key", "value")] - - def test_pydantic_model(self): - """Test encoding a Pydantic model.""" - model = QueryTestModel(name="John", age=30) - result = single_query_encoder("user", model) - - expected = [ - ("user[name]", "John"), - ("user[age]", 30), - ("user[active]", True) - ] - assert sorted(result) == sorted(expected) - - def test_dict_value(self): - """Test encoding a dictionary value.""" - dict_value = {"nested": "value", "count": 5} - result = single_query_encoder("data", dict_value) - - expected = [ - ("data[nested]", "value"), - ("data[count]", 5) - ] - assert sorted(result) == sorted(expected) - - def test_list_of_simple_values(self): - """Test encoding a list of simple values.""" - list_value = ["item1", "item2", "item3"] - result = single_query_encoder("items", list_value) - - expected = [ - ("items", "item1"), - ("items", "item2"), - ("items", "item3") - ] - assert result == expected - - def test_list_of_pydantic_models(self): - """Test encoding a list of Pydantic models.""" - models = [ - QueryTestModel(name="John", age=30), - QueryTestModel(name="Jane", age=25, active=False) - ] - result = single_query_encoder("users", models) - - expected = [ - ("users[name]", "John"), - ("users[age]", 30), - ("users[active]", True), - ("users[name]", "Jane"), - ("users[age]", 25), - ("users[active]", False) - ] - assert sorted(result) == sorted(expected) - - def test_list_of_dicts(self): - """Test encoding a list of dictionaries.""" - dict_list = [ - {"name": "Item1", "value": 10}, - {"name": "Item2", "value": 20} - ] - result = single_query_encoder("data", dict_list) - - expected = [ - ("data[name]", "Item1"), - ("data[value]", 10), - ("data[name]", "Item2"), - ("data[value]", 20) - ] - assert sorted(result) == sorted(expected) - - def test_mixed_list(self): - """Test encoding a list with mixed types.""" - mixed_list = ["simple", {"nested": "value"}, 42] - result = single_query_encoder("mixed", mixed_list) - - expected = [ - ("mixed", "simple"), - ("mixed[nested]", "value"), - ("mixed", 42) - ] - # Can't sort tuples with mixed types, so check length and contents - assert len(result) == len(expected) - for item in expected: - assert item in result - - -class TestEncodeQuery: - """Test encode_query function.""" - - def test_none_query(self): - """Test encoding None query.""" - result = encode_query(None) - assert result is None - - def test_empty_query(self): - """Test encoding empty query.""" - result = encode_query({}) - assert result == [] - - def test_simple_query(self): - """Test encoding a simple query dictionary.""" - query = { - "name": "John", - "age": 30, - "active": True - } - result = encode_query(query) - - expected = [ - ("name", "John"), - ("age", 30), - ("active", True) - ] - assert sorted(result) == sorted(expected) - - def test_complex_query(self): - """Test encoding a complex query with nested structures.""" - query = { - "user": { - "name": "John", - "details": { - "age": 30, - "active": True - } - }, - "tags": ["python", "testing"], - "metadata": [ - {"key": "version", "value": "1.0"}, - {"key": "env", "value": "test"} - ] - } - result = encode_query(query) - - expected = [ - ("user[name]", "John"), - ("user[details][age]", 30), - ("user[details][active]", True), - ("tags", "python"), - ("tags", "testing"), - ("metadata[key]", "version"), - ("metadata[value]", "1.0"), - ("metadata[key]", "env"), - ("metadata[value]", "test") - ] - assert sorted(result) == sorted(expected) - - def test_query_with_pydantic_models(self): - """Test encoding query containing Pydantic models.""" - model = QueryTestModel(name="Alice", age=28) - query = { - "user": model, - "simple": "value" - } - result = encode_query(query) - - expected = [ - ("user[name]", "Alice"), - ("user[age]", 28), - ("user[active]", True), - ("simple", "value") - ] - assert sorted(result) == sorted(expected) - - def test_query_with_special_values(self): - """Test encoding query with special values like None, empty strings.""" - query = { - "empty_string": "", - "none_value": None, - "zero": 0, - "false": False, - "empty_list": [], - "empty_dict": {} - } - result = encode_query(query) - - expected = [ - ("empty_string", ""), - ("none_value", None), - ("zero", 0), - ("false", False) - ] - assert sorted(result) == sorted(expected) - - -class TestQueryEncoderEdgeCases: - """Test edge cases and error conditions.""" - - def test_circular_reference_protection(self): - """Test that circular references don't cause infinite loops.""" - # Create a circular reference - dict_a = {"name": "A"} - dict_b = {"name": "B", "ref": dict_a} - dict_a["ref"] = dict_b - - # This should not hang or crash - # Note: The current implementation doesn't handle circular refs, - # but it should at least not crash for reasonable depths - query = {"data": {"simple": "value"}} # Use a safe query instead - result = encode_query(query) - assert result == [("data[simple]", "value")] - - def test_very_deep_nesting(self): - """Test handling of very deep nesting.""" - # Create a deeply nested structure - deep_dict = {"value": "deep"} - for i in range(10): - deep_dict = {f"level{i}": deep_dict} - - result = traverse_query_dict(deep_dict) - assert len(result) == 1 - # The key should have many levels of nesting - key, value = result[0] - assert value == "deep" - assert key.count("[") == 10 # Should have 10 levels of nesting - - def test_unicode_and_special_characters(self): - """Test handling of unicode and special characters.""" - query = { - "unicode": "Hello δΈ–η•Œ", - "special_chars": "!@#$%^&*()", - "spaces": "value with spaces", - "nested": { - "Γ©moji": "πŸš€", - "quotes": 'value"with"quotes' - } - } - result = encode_query(query) - - # Should handle all characters properly - assert ("unicode", "Hello δΈ–η•Œ") in result - assert ("special_chars", "!@#$%^&*()") in result - assert ("spaces", "value with spaces") in result - assert ("nested[Γ©moji]", "πŸš€") in result - assert ("nested[quotes]", 'value"with"quotes') in result diff --git a/tests/unit/test_core_serialization.py b/tests/unit/test_core_serialization.py deleted file mode 100644 index 3d039bcb..00000000 --- a/tests/unit/test_core_serialization.py +++ /dev/null @@ -1,409 +0,0 @@ -""" -Unit tests for core serialization functionality. -""" -import pytest -import typing -from typing import Dict, List, Set, Optional, Union, Any -from typing_extensions import TypedDict, Annotated - -from pydantic import BaseModel -from deepgram.core.serialization import ( - FieldMetadata, - convert_and_respect_annotation_metadata -) - - -class TestFieldMetadata: - """Test FieldMetadata class.""" - - def test_field_metadata_creation(self): - """Test creating FieldMetadata instance.""" - metadata = FieldMetadata(alias="field_name") - assert metadata.alias == "field_name" - - def test_field_metadata_with_different_aliases(self): - """Test FieldMetadata with various alias formats.""" - # Simple alias - metadata1 = FieldMetadata(alias="simple_alias") - assert metadata1.alias == "simple_alias" - - # Snake case - metadata2 = FieldMetadata(alias="snake_case_alias") - assert metadata2.alias == "snake_case_alias" - - # Camel case - metadata3 = FieldMetadata(alias="camelCaseAlias") - assert metadata3.alias == "camelCaseAlias" - - # With special characters - metadata4 = FieldMetadata(alias="field-with-dashes") - assert metadata4.alias == "field-with-dashes" - - -# Test models for serialization tests -class SimpleTestModel(BaseModel): - name: str - age: int - active: bool = True - - -class SerializationTestTypedDict(TypedDict): - name: str - value: int - optional_field: Optional[str] - - -class SerializationTestTypedDictWithAlias(TypedDict): - name: Annotated[str, FieldMetadata(alias="display_name")] - value: Annotated[int, FieldMetadata(alias="numeric_value")] - normal_field: str - - -class TestConvertAndRespectAnnotationMetadata: - """Test convert_and_respect_annotation_metadata function.""" - - def test_none_object(self): - """Test handling None object.""" - result = convert_and_respect_annotation_metadata( - object_=None, - annotation=str, - direction="read" - ) - assert result is None - - def test_simple_type_passthrough(self): - """Test that simple types pass through unchanged.""" - # String - result = convert_and_respect_annotation_metadata( - object_="test_string", - annotation=str, - direction="read" - ) - assert result == "test_string" - - # Integer - result = convert_and_respect_annotation_metadata( - object_=42, - annotation=int, - direction="read" - ) - assert result == 42 - - # Boolean - result = convert_and_respect_annotation_metadata( - object_=True, - annotation=bool, - direction="read" - ) - assert result is True - - def test_pydantic_model_from_dict_read(self): - """Test converting dict to Pydantic model (read direction).""" - input_dict = {"name": "John", "age": 30, "active": False} - - result = convert_and_respect_annotation_metadata( - object_=input_dict, - annotation=SimpleTestModel, - direction="read" - ) - - # Should process the dict for Pydantic model compatibility - assert isinstance(result, dict) - assert result["name"] == "John" - assert result["age"] == 30 - assert result["active"] is False - - def test_pydantic_model_from_dict_write(self): - """Test converting dict from Pydantic model (write direction).""" - input_dict = {"name": "Alice", "age": 25} - - result = convert_and_respect_annotation_metadata( - object_=input_dict, - annotation=SimpleTestModel, - direction="write" - ) - - # Should process the dict appropriately - assert isinstance(result, dict) - assert result["name"] == "Alice" - assert result["age"] == 25 - - def test_typed_dict_basic(self): - """Test handling basic TypedDict.""" - input_dict = {"name": "Test", "value": 100, "optional_field": "optional"} - - result = convert_and_respect_annotation_metadata( - object_=input_dict, - annotation=SerializationTestTypedDict, - direction="read" - ) - - assert isinstance(result, dict) - assert result["name"] == "Test" - assert result["value"] == 100 - assert result["optional_field"] == "optional" - - def test_dict_type_annotation(self): - """Test handling Dict type annotation.""" - input_dict = {"key1": "value1", "key2": "value2"} - - result = convert_and_respect_annotation_metadata( - object_=input_dict, - annotation=Dict[str, str], - direction="read" - ) - - assert isinstance(result, dict) - assert result == input_dict - - def test_list_type_annotation(self): - """Test handling List type annotation.""" - input_list = ["item1", "item2", "item3"] - - result = convert_and_respect_annotation_metadata( - object_=input_list, - annotation=List[str], - direction="read" - ) - - assert isinstance(result, list) - assert result == input_list - - def test_set_type_annotation(self): - """Test handling Set type annotation.""" - input_set = {"item1", "item2", "item3"} - - result = convert_and_respect_annotation_metadata( - object_=input_set, - annotation=Set[str], - direction="read" - ) - - assert isinstance(result, set) - assert result == input_set - - def test_nested_dict_with_list(self): - """Test handling nested Dict with List values.""" - input_dict = { - "list1": ["a", "b", "c"], - "list2": ["x", "y", "z"] - } - - result = convert_and_respect_annotation_metadata( - object_=input_dict, - annotation=Dict[str, List[str]], - direction="read" - ) - - assert isinstance(result, dict) - assert result["list1"] == ["a", "b", "c"] - assert result["list2"] == ["x", "y", "z"] - - def test_nested_list_with_dicts(self): - """Test handling List containing dicts.""" - input_list = [ - {"name": "Item1", "value": 1}, - {"name": "Item2", "value": 2} - ] - - result = convert_and_respect_annotation_metadata( - object_=input_list, - annotation=List[Dict[str, Any]], - direction="read" - ) - - assert isinstance(result, list) - assert len(result) == 2 - assert result[0]["name"] == "Item1" - assert result[1]["value"] == 2 - - def test_union_type_annotation(self): - """Test handling Union type annotation.""" - # Test with string (first type in union) - result1 = convert_and_respect_annotation_metadata( - object_="test_string", - annotation=Union[str, int], - direction="read" - ) - assert result1 == "test_string" - - # Test with int (second type in union) - result2 = convert_and_respect_annotation_metadata( - object_=42, - annotation=Union[str, int], - direction="read" - ) - assert result2 == 42 - - def test_optional_type_annotation(self): - """Test handling Optional type annotation.""" - # Test with None - result1 = convert_and_respect_annotation_metadata( - object_=None, - annotation=Optional[str], - direction="read" - ) - assert result1 is None - - # Test with actual value - result2 = convert_and_respect_annotation_metadata( - object_="test_value", - annotation=Optional[str], - direction="read" - ) - assert result2 == "test_value" - - def test_string_not_treated_as_sequence(self): - """Test that strings are not treated as sequences.""" - test_string = "hello" - - result = convert_and_respect_annotation_metadata( - object_=test_string, - annotation=str, - direction="read" - ) - - # String should pass through unchanged, not be treated as sequence of chars - assert result == "hello" - assert isinstance(result, str) - - def test_complex_nested_structure(self): - """Test handling complex nested data structures.""" - complex_data = { - "users": [ - {"name": "John", "age": 30}, - {"name": "Jane", "age": 25} - ], - "metadata": { - "version": "1.0", - "tags": ["python", "testing"] - }, - "flags": {"active", "verified"} - } - - result = convert_and_respect_annotation_metadata( - object_=complex_data, - annotation=Dict[str, Any], - direction="read" - ) - - assert isinstance(result, dict) - assert len(result["users"]) == 2 - assert result["users"][0]["name"] == "John" - assert result["metadata"]["version"] == "1.0" - assert "python" in result["metadata"]["tags"] - - def test_inner_type_parameter(self): - """Test using inner_type parameter.""" - input_data = ["item1", "item2"] - - result = convert_and_respect_annotation_metadata( - object_=input_data, - annotation=List[str], - inner_type=List[str], - direction="read" - ) - - assert isinstance(result, list) - assert result == input_data - - def test_both_read_and_write_directions(self): - """Test that both read and write directions work.""" - test_dict = {"key": "value"} - - # Test read direction - result_read = convert_and_respect_annotation_metadata( - object_=test_dict, - annotation=Dict[str, str], - direction="read" - ) - assert result_read == test_dict - - # Test write direction - result_write = convert_and_respect_annotation_metadata( - object_=test_dict, - annotation=Dict[str, str], - direction="write" - ) - assert result_write == test_dict - - -class TestSerializationEdgeCases: - """Test edge cases and error conditions.""" - - def test_empty_collections(self): - """Test handling empty collections.""" - # Empty dict - result = convert_and_respect_annotation_metadata( - object_={}, - annotation=Dict[str, str], - direction="read" - ) - assert result == {} - - # Empty list - result = convert_and_respect_annotation_metadata( - object_=[], - annotation=List[str], - direction="read" - ) - assert result == [] - - # Empty set - result = convert_and_respect_annotation_metadata( - object_=set(), - annotation=Set[str], - direction="read" - ) - assert result == set() - - def test_mismatched_types(self): - """Test handling when object type doesn't match annotation.""" - # This should generally pass through unchanged or handle gracefully - result = convert_and_respect_annotation_metadata( - object_="string_value", - annotation=int, # Annotation says int, but object is string - direction="read" - ) - # Should not crash and return something reasonable - assert result == "string_value" - - def test_deeply_nested_structures(self): - """Test handling deeply nested structures.""" - deep_structure = { - "level1": { - "level2": { - "level3": { - "level4": ["deep", "values"] - } - } - } - } - - result = convert_and_respect_annotation_metadata( - object_=deep_structure, - annotation=Dict[str, Any], - direction="read" - ) - - assert result["level1"]["level2"]["level3"]["level4"] == ["deep", "values"] - - def test_unicode_and_special_characters(self): - """Test handling unicode and special characters.""" - unicode_data = { - "chinese": "δ½ ε₯½δΈ–η•Œ", - "emoji": "πŸš€πŸŒŸ", - "special": "cafΓ© naΓ―ve", - "mixed": ["Hello", "δΈ–η•Œ", "🌍"] - } - - result = convert_and_respect_annotation_metadata( - object_=unicode_data, - annotation=Dict[str, Any], - direction="read" - ) - - assert result["chinese"] == "δ½ ε₯½δΈ–η•Œ" - assert result["emoji"] == "πŸš€πŸŒŸ" - assert result["special"] == "cafΓ© naΓ―ve" - assert "δΈ–η•Œ" in result["mixed"] diff --git a/tests/unit/test_core_utils.py b/tests/unit/test_core_utils.py deleted file mode 100644 index 2e24587a..00000000 --- a/tests/unit/test_core_utils.py +++ /dev/null @@ -1,280 +0,0 @@ -""" -Unit tests for core utility functions. -""" -import pytest -from typing import Dict, Any, Optional, Mapping - -from deepgram.core.remove_none_from_dict import remove_none_from_dict - - -class TestRemoveNoneFromDict: - """Test remove_none_from_dict function.""" - - def test_empty_dict(self): - """Test removing None values from empty dictionary.""" - result = remove_none_from_dict({}) - assert result == {} - - def test_no_none_values(self): - """Test dictionary with no None values.""" - input_dict = { - "string": "value", - "number": 42, - "boolean": True, - "list": [1, 2, 3], - "dict": {"nested": "value"} - } - result = remove_none_from_dict(input_dict) - assert result == input_dict - - def test_all_none_values(self): - """Test dictionary with all None values.""" - input_dict = { - "key1": None, - "key2": None, - "key3": None - } - result = remove_none_from_dict(input_dict) - assert result == {} - - def test_mixed_none_and_values(self): - """Test dictionary with mix of None and non-None values.""" - input_dict = { - "keep_string": "value", - "remove_none": None, - "keep_number": 42, - "remove_another_none": None, - "keep_boolean": False, - "keep_empty_string": "", - "keep_zero": 0 - } - result = remove_none_from_dict(input_dict) - - expected = { - "keep_string": "value", - "keep_number": 42, - "keep_boolean": False, - "keep_empty_string": "", - "keep_zero": 0 - } - assert result == expected - - def test_preserve_falsy_values(self): - """Test that falsy values (except None) are preserved.""" - input_dict = { - "empty_string": "", - "zero": 0, - "false": False, - "empty_list": [], - "empty_dict": {}, - "none_value": None - } - result = remove_none_from_dict(input_dict) - - expected = { - "empty_string": "", - "zero": 0, - "false": False, - "empty_list": [], - "empty_dict": {} - } - assert result == expected - - def test_nested_structures_with_none(self): - """Test that nested structures containing None are preserved.""" - input_dict = { - "nested_dict": {"inner": None, "keep": "value"}, - "nested_list": [None, "keep", None], - "remove_this": None - } - result = remove_none_from_dict(input_dict) - - expected = { - "nested_dict": {"inner": None, "keep": "value"}, - "nested_list": [None, "keep", None] - } - assert result == expected - - def test_complex_data_types(self): - """Test with complex data types.""" - class CustomObject: - def __init__(self, value): - self.value = value - - def __eq__(self, other): - return isinstance(other, CustomObject) and self.value == other.value - - custom_obj = CustomObject("test") - input_dict = { - "custom_object": custom_obj, - "tuple": (1, 2, 3), - "set": {1, 2, 3}, - "none_value": None - } - result = remove_none_from_dict(input_dict) - - expected = { - "custom_object": custom_obj, - "tuple": (1, 2, 3), - "set": {1, 2, 3} - } - assert result == expected - - def test_original_dict_unchanged(self): - """Test that original dictionary is not modified.""" - original = { - "keep": "value", - "remove": None - } - original_copy = original.copy() - - result = remove_none_from_dict(original) - - # Original should be unchanged - assert original == original_copy - - # Result should be different - assert result == {"keep": "value"} - assert result != original - - def test_return_type(self): - """Test that function returns correct type.""" - input_dict = {"key": "value", "none_key": None} - result = remove_none_from_dict(input_dict) - - # Should return a Dict, not the original Mapping type - assert isinstance(result, dict) - assert not isinstance(result, type(input_dict)) or isinstance(input_dict, dict) - - def test_with_mapping_input(self): - """Test with different Mapping types as input.""" - from collections import OrderedDict, defaultdict - - # Test with OrderedDict - ordered_dict = OrderedDict([("keep", "value"), ("remove", None)]) - result = remove_none_from_dict(ordered_dict) - assert result == {"keep": "value"} - assert isinstance(result, dict) # Should return regular dict - - # Test with defaultdict - default_dict = defaultdict(str) - default_dict["keep"] = "value" - default_dict["remove"] = None - result = remove_none_from_dict(default_dict) - assert result == {"keep": "value"} - assert isinstance(result, dict) # Should return regular dict - - def test_unicode_keys(self): - """Test with unicode keys.""" - input_dict = { - "english": "value", - "δΈ­ζ–‡": "chinese", - "espaΓ±ol": None, - "русский": "russian", - "Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©": None, - "πŸ”‘": "emoji_key" - } - result = remove_none_from_dict(input_dict) - - expected = { - "english": "value", - "δΈ­ζ–‡": "chinese", - "русский": "russian", - "πŸ”‘": "emoji_key" - } - assert result == expected - - def test_numeric_and_special_keys(self): - """Test with numeric and special character keys.""" - input_dict = { - 1: "numeric_key", - "normal_key": "value", - (1, 2): "tuple_key", - "remove_me": None, - 42: None - } - result = remove_none_from_dict(input_dict) - - expected = { - 1: "numeric_key", - "normal_key": "value", - (1, 2): "tuple_key" - } - assert result == expected - - -class TestRemoveNoneFromDictEdgeCases: - """Test edge cases and error conditions.""" - - def test_very_large_dict(self): - """Test with a very large dictionary.""" - # Create a large dictionary with alternating None and non-None values - large_dict = {} - for i in range(1000): - if i % 2 == 0: - large_dict[f"key_{i}"] = f"value_{i}" - else: - large_dict[f"key_{i}"] = None - - result = remove_none_from_dict(large_dict) - - # Should have 500 items (half of original) - assert len(result) == 500 - - # All values should be non-None - for value in result.values(): - assert value is not None - - # All keys should be even-numbered - for key in result.keys(): - key_num = int(key.split("_")[1]) - assert key_num % 2 == 0 - - def test_deeply_nested_with_none_values(self): - """Test that function only processes top level (doesn't recurse).""" - input_dict = { - "level1": { - "level2": { - "level3": None, - "keep": "value" - }, - "also_none": None - }, - "top_level_none": None - } - result = remove_none_from_dict(input_dict) - - # Only top-level None should be removed - expected = { - "level1": { - "level2": { - "level3": None, # This None should remain - "keep": "value" - }, - "also_none": None # This None should remain - } - } - assert result == expected - - def test_performance_with_many_none_values(self): - """Test performance with dictionary having many None values.""" - import time - - # Create dictionary with mostly None values - large_dict = {f"key_{i}": None for i in range(10000)} - large_dict.update({f"keep_{i}": f"value_{i}" for i in range(100)}) - - start_time = time.time() - result = remove_none_from_dict(large_dict) - end_time = time.time() - - # Should complete quickly (less than 1 second) - assert (end_time - start_time) < 1.0 - - # Should only have the 100 non-None values - assert len(result) == 100 - - # All remaining values should be non-None - for key, value in result.items(): - assert key.startswith("keep_") - assert value is not None diff --git a/tests/unit/test_http_internals.py b/tests/unit/test_http_internals.py deleted file mode 100644 index 05c015a2..00000000 --- a/tests/unit/test_http_internals.py +++ /dev/null @@ -1,820 +0,0 @@ -""" -Unit tests for HTTP internals and client wrappers. -Tests HTTP client functionality, response wrappers, retry logic, and request options. -""" - -import pytest -import asyncio -import time -import typing -from unittest.mock import Mock, patch, MagicMock -from datetime import datetime, timezone -import httpx - -from deepgram.core.http_client import ( - HttpClient, - AsyncHttpClient, - get_request_body, - _parse_retry_after, - _should_retry, - _retry_timeout, - INITIAL_RETRY_DELAY_SECONDS, - MAX_RETRY_DELAY_SECONDS -) -from deepgram.core.http_response import BaseHttpResponse, HttpResponse, AsyncHttpResponse -from deepgram.core.client_wrapper import BaseClientWrapper, SyncClientWrapper, AsyncClientWrapper -from deepgram.core.request_options import RequestOptions -from deepgram.environment import DeepgramClientEnvironment - - -class TestHttpClientUtilities: - """Test HTTP client utility functions.""" - - def test_parse_retry_after_ms_header(self): - """Test parsing retry-after-ms header.""" - headers = httpx.Headers({"retry-after-ms": "1500"}) - result = _parse_retry_after(headers) - # The actual implementation has a bug: it compares string > 0 which is always True - # So it should work and return 1.5, but the implementation might have issues - # Let's test what actually happens - if result is not None: - assert result == 1.5 - else: - # Implementation might not handle this correctly - pass - - def test_parse_retry_after_ms_header_zero(self): - """Test parsing retry-after-ms header with zero value.""" - headers = httpx.Headers({"retry-after-ms": "0"}) - result = _parse_retry_after(headers) - # String "0" > 0 is True in Python, so this returns 0/1000 = 0 - if result is not None: - assert result == 0 - else: - # Implementation might not handle this correctly - pass - - def test_parse_retry_after_ms_header_invalid(self): - """Test parsing invalid retry-after-ms header.""" - headers = httpx.Headers({"retry-after-ms": "invalid"}) - result = _parse_retry_after(headers) - assert result is None - - def test_parse_retry_after_seconds_header(self): - """Test parsing retry-after header with seconds.""" - headers = httpx.Headers({"retry-after": "120"}) - result = _parse_retry_after(headers) - assert result == 120.0 - - def test_parse_retry_after_http_date_header(self): - """Test parsing retry-after header with HTTP date.""" - future_time = time.time() + 60 - http_date = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(future_time)) - headers = httpx.Headers({"retry-after": http_date}) - result = _parse_retry_after(headers) - # Should be approximately 60 seconds (allowing some tolerance) - assert result is not None - assert 55 <= result <= 65 - - def test_parse_retry_after_invalid_date(self): - """Test parsing retry-after header with invalid date.""" - headers = httpx.Headers({"retry-after": "invalid-date"}) - result = _parse_retry_after(headers) - assert result is None - - def test_parse_retry_after_no_header(self): - """Test parsing when no retry-after header is present.""" - headers = httpx.Headers({}) - result = _parse_retry_after(headers) - assert result is None - - def test_should_retry_429(self): - """Test should_retry with 429 status code.""" - response = Mock() - response.status_code = 429 - assert _should_retry(response) is True - - def test_should_retry_502(self): - """Test should_retry with 502 status code.""" - response = Mock() - response.status_code = 502 - assert _should_retry(response) is True - - def test_should_retry_503(self): - """Test should_retry with 503 status code.""" - response = Mock() - response.status_code = 503 - assert _should_retry(response) is True - - def test_should_retry_504(self): - """Test should_retry with 504 status code.""" - response = Mock() - response.status_code = 504 - assert _should_retry(response) is True - - def test_should_not_retry_200(self): - """Test should_retry with 200 status code.""" - response = Mock() - response.status_code = 200 - assert _should_retry(response) is False - - def test_should_not_retry_400(self): - """Test should_retry with 400 status code.""" - response = Mock() - response.status_code = 400 - assert _should_retry(response) is False - - def test_should_retry_500(self): - """Test should_retry with 500 status code.""" - response = Mock() - response.status_code = 500 - # 500 >= 500 is True, so it should retry - assert _should_retry(response) is True - - def test_retry_timeout_with_retry_after(self): - """Test retry timeout calculation with retry-after header.""" - response = Mock() - response.headers = httpx.Headers({"retry-after": "30"}) - result = _retry_timeout(response, retries=1) - assert result == 30.0 - - def test_retry_timeout_without_retry_after(self): - """Test retry timeout calculation without retry-after header.""" - response = Mock() - response.headers = httpx.Headers({}) - result = _retry_timeout(response, retries=1) - # Should use exponential backoff with jitter, so it won't be exact - expected = INITIAL_RETRY_DELAY_SECONDS * (2 ** 1) - # Result should be within reasonable range due to jitter - assert 0.5 <= result <= expected - - def test_retry_timeout_max_delay(self): - """Test retry timeout calculation with maximum delay.""" - response = Mock() - response.headers = httpx.Headers({}) - result = _retry_timeout(response, retries=10) - # Should be capped at MAX_RETRY_DELAY_SECONDS with jitter applied - # Jitter reduces the delay by up to 25% - min_expected = MAX_RETRY_DELAY_SECONDS * 0.75 - assert min_expected <= result <= MAX_RETRY_DELAY_SECONDS - - def test_get_request_body_json_only(self): - """Test get_request_body with JSON only.""" - json_data = {"key": "value"} - json_body, data_body = get_request_body( - json=json_data, - data=None, - request_options=None, - omit=None - ) - assert json_body == json_data - assert data_body is None - - def test_get_request_body_data_only(self): - """Test get_request_body with data only.""" - form_data = {"field": "value"} - json_body, data_body = get_request_body( - json=None, - data=form_data, - request_options=None, - omit=None - ) - assert json_body is None - assert data_body == form_data - - def test_get_request_body_both_json_and_data(self): - """Test get_request_body with both JSON and data.""" - json_data = {"json_key": "json_value"} - form_data = {"form_key": "form_value"} - json_body, data_body = get_request_body( - json=json_data, - data=form_data, - request_options=None, - omit=None - ) - # The implementation might prioritize one over the other - # Let's check what actually happens - if json_body is not None: - assert isinstance(json_body, dict) - if data_body is not None: - assert isinstance(data_body, dict) - - def test_get_request_body_empty_json(self): - """Test get_request_body with empty JSON.""" - json_body, data_body = get_request_body( - json={}, - data=None, - request_options=None, - omit=None - ) - assert json_body is None # Empty JSON should become None - assert data_body is None - - def test_get_request_body_empty_data(self): - """Test get_request_body with empty data.""" - json_body, data_body = get_request_body( - json=None, - data={}, - request_options=None, - omit=None - ) - assert json_body is None - assert data_body is None # Empty data should become None - - def test_get_request_body_with_request_options(self): - """Test get_request_body with additional body parameters.""" - request_options: RequestOptions = { - "additional_body_parameters": {"extra_param": "extra_value"} - } - json_data = {"original": "data"} - - json_body, data_body = get_request_body( - json=json_data, - data=None, - request_options=request_options, - omit=None - ) - - # Should merge additional parameters - expected = {"original": "data", "extra_param": "extra_value"} - assert json_body == expected - assert data_body is None - - -class TestHttpClient: - """Test HttpClient class.""" - - def test_http_client_initialization(self): - """Test HttpClient initialization.""" - mock_httpx_client = Mock(spec=httpx.Client) - base_timeout = lambda: 30.0 - base_headers = lambda: {"Authorization": "Token test"} - base_url = lambda: "https://api.deepgram.com" - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=base_timeout, - base_headers=base_headers, - base_url=base_url - ) - - assert client.httpx_client == mock_httpx_client - assert client.base_timeout == base_timeout - assert client.base_headers == base_headers - assert client.base_url == base_url - - def test_get_base_url_with_provided_url(self): - """Test get_base_url with provided URL.""" - mock_httpx_client = Mock(spec=httpx.Client) - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {}, - base_url=lambda: "https://default.com" - ) - - result = client.get_base_url("https://custom.com") - assert result == "https://custom.com" - - def test_get_base_url_with_default_url(self): - """Test get_base_url with default URL.""" - mock_httpx_client = Mock(spec=httpx.Client) - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {}, - base_url=lambda: "https://default.com" - ) - - result = client.get_base_url(None) - assert result == "https://default.com" - - def test_get_base_url_no_default_raises_error(self): - """Test get_base_url raises error when no URL is available.""" - mock_httpx_client = Mock(spec=httpx.Client) - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {}, - base_url=None - ) - - with pytest.raises(ValueError, match="A base_url is required"): - client.get_base_url(None) - - @patch('time.sleep') - def test_request_with_retry(self, mock_sleep): - """Test HTTP request with retry logic.""" - mock_httpx_client = Mock(spec=httpx.Client) - - # First call returns 429, second call returns 200 - mock_response_429 = Mock() - mock_response_429.status_code = 429 - mock_response_429.headers = httpx.Headers({"retry-after": "1"}) - - mock_response_200 = Mock() - mock_response_200.status_code = 200 - - mock_httpx_client.request.side_effect = [mock_response_429, mock_response_200] - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - request_options: RequestOptions = {"max_retries": 2} - - result = client.request( - path="/v1/test", - method="GET", - request_options=request_options - ) - - # Verify that retry logic was attempted - assert mock_httpx_client.request.call_count >= 1 - # The exact result depends on the implementation - - def test_request_max_retries_exceeded(self): - """Test HTTP request when max retries are exceeded.""" - mock_httpx_client = Mock(spec=httpx.Client) - - mock_response_429 = Mock() - mock_response_429.status_code = 429 - mock_response_429.headers = httpx.Headers({}) - - mock_httpx_client.request.return_value = mock_response_429 - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - request_options: RequestOptions = {"max_retries": 1} - - result = client.request( - path="/v1/test", - method="GET", - request_options=request_options, - retries=2 # Already exceeded max_retries - ) - - # Should return the failed response without retrying - assert result == mock_response_429 - assert mock_httpx_client.request.call_count == 1 - - def test_request_with_custom_headers(self): - """Test HTTP request with custom headers.""" - mock_httpx_client = Mock(spec=httpx.Client) - mock_response = Mock() - mock_response.status_code = 200 - mock_httpx_client.request.return_value = mock_response - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - custom_headers = {"X-Custom": "value"} - request_options: RequestOptions = { - "additional_headers": {"X-Additional": "additional"} - } - - client.request( - path="/v1/test", - method="POST", - headers=custom_headers, - request_options=request_options - ) - - # Verify headers were merged correctly - call_args = mock_httpx_client.request.call_args - headers = call_args[1]["headers"] - assert "Authorization" in headers # Base header - assert "X-Custom" in headers # Custom header - assert "X-Additional" in headers # Request options header - - def test_request_with_files_and_force_multipart(self): - """Test HTTP request with files and force multipart.""" - mock_httpx_client = Mock(spec=httpx.Client) - mock_response = Mock() - mock_response.status_code = 200 - mock_httpx_client.request.return_value = mock_response - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {}, - base_url=lambda: "https://api.deepgram.com" - ) - - # Test force_multipart when no files are provided - client.request( - path="/v1/test", - method="POST", - force_multipart=True - ) - - call_args = mock_httpx_client.request.call_args - files = call_args[1]["files"] - assert files is not None # Should have FORCE_MULTIPART - - def test_stream_context_manager(self): - """Test stream context manager.""" - mock_httpx_client = Mock(spec=httpx.Client) - mock_stream = Mock() - mock_httpx_client.stream.return_value.__enter__ = Mock(return_value=mock_stream) - mock_httpx_client.stream.return_value.__exit__ = Mock(return_value=None) - - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - with client.stream(path="/v1/test", method="GET") as stream: - assert stream == mock_stream - - mock_httpx_client.stream.assert_called_once() - - -class TestAsyncHttpClient: - """Test AsyncHttpClient class.""" - - def test_async_http_client_initialization(self): - """Test AsyncHttpClient initialization.""" - mock_httpx_client = Mock(spec=httpx.AsyncClient) - base_timeout = lambda: 30.0 - base_headers = lambda: {"Authorization": "Token test"} - base_url = lambda: "https://api.deepgram.com" - - client = AsyncHttpClient( - httpx_client=mock_httpx_client, - base_timeout=base_timeout, - base_headers=base_headers, - base_url=base_url - ) - - assert client.httpx_client == mock_httpx_client - assert client.base_timeout == base_timeout - assert client.base_headers == base_headers - assert client.base_url == base_url - - @pytest.mark.asyncio - async def test_async_request_with_retry(self): - """Test async HTTP request with retry logic.""" - mock_httpx_client = Mock(spec=httpx.AsyncClient) - - # First call returns 503, second call returns 200 - mock_response_503 = Mock() - mock_response_503.status_code = 503 - mock_response_503.headers = httpx.Headers({"retry-after": "2"}) - - mock_response_200 = Mock() - mock_response_200.status_code = 200 - - mock_httpx_client.request.side_effect = [mock_response_503, mock_response_200] - - client = AsyncHttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - request_options: RequestOptions = {"max_retries": 2} - - with patch('asyncio.sleep') as mock_sleep: - result = await client.request( - path="/v1/test", - method="GET", - request_options=request_options - ) - - # Verify that retry logic was attempted - assert mock_httpx_client.request.call_count >= 1 - # The exact result depends on the implementation - - @pytest.mark.asyncio - async def test_async_stream_context_manager(self): - """Test async stream context manager.""" - # This test is complex to mock properly, so let's just verify the client - # has the stream method and it's callable - mock_httpx_client = Mock(spec=httpx.AsyncClient) - - client = AsyncHttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {"Authorization": "Token test"}, - base_url=lambda: "https://api.deepgram.com" - ) - - # Verify stream method exists and is callable - assert hasattr(client, 'stream') - assert callable(client.stream) - - -class TestHttpResponse: - """Test HTTP response wrapper classes.""" - - def test_base_http_response(self): - """Test BaseHttpResponse functionality.""" - mock_httpx_response = Mock(spec=httpx.Response) - mock_httpx_response.headers = httpx.Headers({ - "Content-Type": "application/json", - "X-Request-ID": "123456" - }) - - response = BaseHttpResponse(mock_httpx_response) - - assert response._response == mock_httpx_response - # httpx.Headers normalizes header names to lowercase - assert response.headers == { - "content-type": "application/json", - "x-request-id": "123456" - } - - def test_http_response(self): - """Test HttpResponse functionality.""" - mock_httpx_response = Mock(spec=httpx.Response) - mock_httpx_response.headers = httpx.Headers({"Content-Type": "application/json"}) - mock_httpx_response.close = Mock() - - data = {"result": "success"} - response = HttpResponse(mock_httpx_response, data) - - assert response._response == mock_httpx_response - assert response._data == data - assert response.data == data - assert response.headers == {"content-type": "application/json"} - - # Test close method - response.close() - mock_httpx_response.close.assert_called_once() - - @pytest.mark.asyncio - async def test_async_http_response(self): - """Test AsyncHttpResponse functionality.""" - mock_httpx_response = Mock(spec=httpx.Response) - mock_httpx_response.headers = httpx.Headers({"Content-Type": "application/json"}) - mock_httpx_response.aclose = Mock(return_value=asyncio.Future()) - mock_httpx_response.aclose.return_value.set_result(None) - - data = {"result": "success"} - response = AsyncHttpResponse(mock_httpx_response, data) - - assert response._response == mock_httpx_response - assert response._data == data - assert response.data == data - assert response.headers == {"content-type": "application/json"} - - # Test async close method - await response.close() - mock_httpx_response.aclose.assert_called_once() - - -class TestClientWrappers: - """Test client wrapper classes.""" - - def test_base_client_wrapper(self): - """Test BaseClientWrapper functionality.""" - wrapper = BaseClientWrapper( - api_key="test_key", - headers={"X-Custom": "value"}, - environment=DeepgramClientEnvironment.PRODUCTION, - timeout=60.0 - ) - - assert wrapper.api_key == "test_key" - assert wrapper._headers == {"X-Custom": "value"} - assert wrapper._environment == DeepgramClientEnvironment.PRODUCTION - assert wrapper._timeout == 60.0 - - def test_base_client_wrapper_get_headers(self): - """Test BaseClientWrapper header generation.""" - wrapper = BaseClientWrapper( - api_key="test_key", - headers={"X-Custom": "value"}, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - headers = wrapper.get_headers() - - assert "Authorization" in headers - assert headers["Authorization"] == "Token test_key" - assert "X-Fern-Language" in headers - assert headers["X-Fern-Language"] == "Python" - assert "X-Fern-SDK-Name" in headers - assert "X-Fern-SDK-Version" in headers - assert "X-Custom" in headers - assert headers["X-Custom"] == "value" - - def test_base_client_wrapper_custom_headers_none(self): - """Test BaseClientWrapper with no custom headers.""" - wrapper = BaseClientWrapper( - api_key="test_key", - environment=DeepgramClientEnvironment.PRODUCTION - ) - - headers = wrapper.get_headers() - assert "Authorization" in headers - assert "X-Fern-Language" in headers - - def test_base_client_wrapper_getters(self): - """Test BaseClientWrapper getter methods.""" - wrapper = BaseClientWrapper( - api_key="test_key", - headers={"X-Custom": "value"}, - environment=DeepgramClientEnvironment.PRODUCTION, - timeout=120.0 - ) - - assert wrapper.get_custom_headers() == {"X-Custom": "value"} - assert wrapper.get_environment() == DeepgramClientEnvironment.PRODUCTION - assert wrapper.get_timeout() == 120.0 - - def test_sync_client_wrapper(self): - """Test SyncClientWrapper functionality.""" - mock_httpx_client = Mock(spec=httpx.Client) - - wrapper = SyncClientWrapper( - api_key="test_key", - headers={"X-Custom": "value"}, - environment=DeepgramClientEnvironment.PRODUCTION, - timeout=60.0, - httpx_client=mock_httpx_client - ) - - assert isinstance(wrapper.httpx_client, HttpClient) - assert wrapper.httpx_client.httpx_client == mock_httpx_client - - def test_async_client_wrapper(self): - """Test AsyncClientWrapper functionality.""" - mock_httpx_client = Mock(spec=httpx.AsyncClient) - - wrapper = AsyncClientWrapper( - api_key="test_key", - headers={"X-Custom": "value"}, - environment=DeepgramClientEnvironment.PRODUCTION, - timeout=60.0, - httpx_client=mock_httpx_client - ) - - assert isinstance(wrapper.httpx_client, AsyncHttpClient) - assert wrapper.httpx_client.httpx_client == mock_httpx_client - - -class TestRequestOptions: - """Test RequestOptions TypedDict.""" - - def test_request_options_all_fields(self): - """Test RequestOptions with all fields.""" - options: RequestOptions = { - "timeout_in_seconds": 30, - "max_retries": 3, - "additional_headers": {"X-Custom": "value"}, - "additional_query_parameters": {"param": "value"}, - "additional_body_parameters": {"body_param": "value"}, - "chunk_size": 8192 - } - - assert options["timeout_in_seconds"] == 30 - assert options["max_retries"] == 3 - assert options["additional_headers"]["X-Custom"] == "value" - assert options["additional_query_parameters"]["param"] == "value" - assert options["additional_body_parameters"]["body_param"] == "value" - assert options["chunk_size"] == 8192 - - def test_request_options_partial_fields(self): - """Test RequestOptions with partial fields.""" - options: RequestOptions = { - "timeout_in_seconds": 60, - "additional_headers": {"Authorization": "Bearer token"} - } - - assert options["timeout_in_seconds"] == 60 - assert options["additional_headers"]["Authorization"] == "Bearer token" - # Other fields should not be required - assert "max_retries" not in options - assert "chunk_size" not in options - - def test_request_options_empty(self): - """Test empty RequestOptions.""" - options: RequestOptions = {} - - # Should be valid empty dict - assert isinstance(options, dict) - assert len(options) == 0 - - -class TestHttpInternalsEdgeCases: - """Test edge cases and error scenarios for HTTP internals.""" - - def test_parse_retry_after_with_large_ms_value(self): - """Test parsing retry-after-ms with very large value.""" - headers = httpx.Headers({"retry-after-ms": "999999999"}) - result = _parse_retry_after(headers) - # The implementation might not handle this correctly due to string comparison - if result is not None: - assert result == 999999999 / 1000 - else: - # Implementation might not handle this correctly - pass - - def test_parse_retry_after_with_negative_seconds(self): - """Test parsing retry-after with negative seconds.""" - headers = httpx.Headers({"retry-after": "-10"}) - result = _parse_retry_after(headers) - # The implementation might not parse negative values as valid integers - # Let's check what actually happens - if result is not None: - assert result == 0.0 # Should be clamped to 0 - else: - # Implementation might reject negative values entirely - pass - - def test_retry_timeout_with_very_large_retry_after(self): - """Test retry timeout with very large retry-after value.""" - response = Mock() - response.headers = httpx.Headers({"retry-after": "999999"}) - result = _retry_timeout(response, retries=1) - # Very large retry-after values should fall back to exponential backoff - # So the result should be within the exponential backoff range - assert 0.5 <= result <= 10.0 - - def test_get_request_body_with_omit_parameter(self): - """Test get_request_body with omit parameter.""" - json_data = {"keep": "this", "omit": "this"} - json_body, data_body = get_request_body( - json=json_data, - data=None, - request_options=None, - omit=["omit"] - ) - - # The actual implementation might not handle omit in get_request_body - # This test verifies the function doesn't crash with omit parameter - assert json_body is not None - assert data_body is None - - def test_http_client_with_none_base_url_callable(self): - """Test HttpClient with None base_url callable.""" - mock_httpx_client = Mock(spec=httpx.Client) - client = HttpClient( - httpx_client=mock_httpx_client, - base_timeout=lambda: 30.0, - base_headers=lambda: {}, - base_url=None - ) - - # Should work when explicit base_url is provided - result = client.get_base_url("https://explicit.com") - assert result == "https://explicit.com" - - def test_http_response_with_complex_data_types(self): - """Test HttpResponse with complex data types.""" - mock_httpx_response = Mock(spec=httpx.Response) - mock_httpx_response.headers = httpx.Headers({}) - mock_httpx_response.close = Mock() - - # Test with various data types - complex_data = { - "list": [1, 2, 3], - "nested": {"inner": "value"}, - "none_value": None, - "boolean": True, - "number": 42.5 - } - - response = HttpResponse(mock_httpx_response, complex_data) - assert response.data == complex_data - assert response.data["list"] == [1, 2, 3] - assert response.data["nested"]["inner"] == "value" - assert response.data["none_value"] is None - - def test_client_wrapper_with_different_environments(self): - """Test client wrapper with different environments.""" - for env in [DeepgramClientEnvironment.PRODUCTION, DeepgramClientEnvironment.AGENT]: - wrapper = BaseClientWrapper( - api_key="test_key", - environment=env - ) - assert wrapper.get_environment() == env - - def test_client_wrapper_headers_with_special_characters(self): - """Test client wrapper headers with special characters.""" - wrapper = BaseClientWrapper( - api_key="test_key_with_special_chars_!@#$%", - headers={"X-Special": "value_with_unicode_ζ΅‹θ―•"}, - environment=DeepgramClientEnvironment.PRODUCTION - ) - - headers = wrapper.get_headers() - assert headers["Authorization"] == "Token test_key_with_special_chars_!@#$%" - assert headers["X-Special"] == "value_with_unicode_ζ΅‹θ―•" diff --git a/tests/unit/test_listen_v1_models.py b/tests/unit/test_listen_v1_models.py deleted file mode 100644 index 3beb2ff3..00000000 --- a/tests/unit/test_listen_v1_models.py +++ /dev/null @@ -1,378 +0,0 @@ -""" -Unit tests for Listen V1 socket event models. -""" -import pytest -from pydantic import ValidationError - -from deepgram.extensions.types.sockets.listen_v1_metadata_event import ListenV1MetadataEvent -from deepgram.extensions.types.sockets.listen_v1_results_event import ListenV1ResultsEvent -from deepgram.extensions.types.sockets.listen_v1_speech_started_event import ListenV1SpeechStartedEvent -from deepgram.extensions.types.sockets.listen_v1_utterance_end_event import ListenV1UtteranceEndEvent -from deepgram.extensions.types.sockets.listen_v1_control_message import ListenV1ControlMessage -from deepgram.extensions.types.sockets.listen_v1_media_message import ListenV1MediaMessage - - -class TestListenV1MetadataEvent: - """Test ListenV1MetadataEvent model.""" - - def test_valid_metadata_event(self, valid_model_data): - """Test creating a valid metadata event.""" - data = valid_model_data("listen_v1_metadata") - event = ListenV1MetadataEvent(**data) - - assert event.type == "Metadata" - assert event.request_id == "test-123" - assert event.sha256 == "abc123" - assert event.created == "2023-01-01T00:00:00Z" - assert event.duration == 1.0 - assert event.channels == 1 - - def test_metadata_event_serialization(self, valid_model_data): - """Test metadata event serialization.""" - data = valid_model_data("listen_v1_metadata") - event = ListenV1MetadataEvent(**data) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Metadata" - assert event_dict["request_id"] == "test-123" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Metadata"' in json_str - assert '"request_id":"test-123"' in json_str - - def test_metadata_event_missing_required_fields(self): - """Test metadata event with missing required fields.""" - # Missing request_id - with pytest.raises(ValidationError) as exc_info: - ListenV1MetadataEvent( - type="Metadata", - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration=1.0, - channels=1 - ) - assert "request_id" in str(exc_info.value) - - # Missing sha256 - with pytest.raises(ValidationError) as exc_info: - ListenV1MetadataEvent( - type="Metadata", - request_id="test-123", - created="2023-01-01T00:00:00Z", - duration=1.0, - channels=1 - ) - assert "sha256" in str(exc_info.value) - - def test_metadata_event_wrong_type(self): - """Test metadata event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1MetadataEvent( - type="Results", # Wrong type - request_id="test-123", - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration=1.0, - channels=1 - ) - assert "Input should be 'Metadata'" in str(exc_info.value) - - def test_metadata_event_invalid_data_types(self): - """Test metadata event with invalid data types.""" - # Invalid duration type - with pytest.raises(ValidationError) as exc_info: - ListenV1MetadataEvent( - type="Metadata", - request_id="test-123", - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration="not_a_number", - channels=1 - ) - assert "Input should be a valid number" in str(exc_info.value) - - # Invalid channels type - with pytest.raises(ValidationError) as exc_info: - ListenV1MetadataEvent( - type="Metadata", - request_id="test-123", - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration=1.0, - channels="not_a_number" - ) - assert "Input should be a valid number" in str(exc_info.value) - - -class TestListenV1ResultsEvent: - """Test ListenV1ResultsEvent model.""" - - def test_valid_results_event(self, valid_model_data): - """Test creating a valid results event.""" - data = valid_model_data("listen_v1_results") - event = ListenV1ResultsEvent(**data) - - assert event.type == "Results" - assert event.channel_index == [0] - assert event.duration == 1.0 - assert event.start == 0.0 - assert event.is_final is True - assert event.channel is not None - assert event.metadata is not None - - def test_results_event_serialization(self, valid_model_data): - """Test results event serialization.""" - data = valid_model_data("listen_v1_results") - event = ListenV1ResultsEvent(**data) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Results" - assert event_dict["channel_index"] == [0] - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Results"' in json_str - - def test_results_event_missing_required_fields(self): - """Test results event with missing required fields.""" - # Missing channel - with pytest.raises(ValidationError) as exc_info: - ListenV1ResultsEvent( - type="Results", - channel_index=[0], - duration=1.0, - start=0.0, - is_final=True, - metadata={"request_id": "test-123"} - ) - assert "channel" in str(exc_info.value) - - def test_results_event_wrong_type(self): - """Test results event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1ResultsEvent( - type="Metadata", # Wrong type - channel_index=[0], - duration=1.0, - start=0.0, - is_final=True, - channel={"alternatives": []}, - metadata={"request_id": "test-123"} - ) - assert "Input should be 'Results'" in str(exc_info.value) - - -class TestListenV1SpeechStartedEvent: - """Test ListenV1SpeechStartedEvent model.""" - - def test_valid_speech_started_event(self): - """Test creating a valid speech started event.""" - event = ListenV1SpeechStartedEvent( - type="SpeechStarted", - channel=[0], - timestamp=1672531200.0 - ) - - assert event.type == "SpeechStarted" - assert event.channel == [0] - assert event.timestamp == 1672531200.0 - - def test_speech_started_event_serialization(self): - """Test speech started event serialization.""" - event = ListenV1SpeechStartedEvent( - type="SpeechStarted", - channel=[0], - timestamp=1672531200.0 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "SpeechStarted" - assert event_dict["channel"] == [0] - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"SpeechStarted"' in json_str - - def test_speech_started_event_missing_fields(self): - """Test speech started event with missing required fields.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1SpeechStartedEvent( - type="SpeechStarted", - channel=[0] - # Missing timestamp - ) - assert "timestamp" in str(exc_info.value) - - def test_speech_started_event_wrong_type(self): - """Test speech started event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1SpeechStartedEvent( - type="Results", # Wrong type - channel=[0], - timestamp="2023-01-01T00:00:00Z" - ) - assert "Input should be 'SpeechStarted'" in str(exc_info.value) - - -class TestListenV1UtteranceEndEvent: - """Test ListenV1UtteranceEndEvent model.""" - - def test_valid_utterance_end_event(self): - """Test creating a valid utterance end event.""" - event = ListenV1UtteranceEndEvent( - type="UtteranceEnd", - channel=[0], - last_word_end=1.5 - ) - - assert event.type == "UtteranceEnd" - assert event.channel == [0] - assert event.last_word_end == 1.5 - - def test_utterance_end_event_serialization(self): - """Test utterance end event serialization.""" - event = ListenV1UtteranceEndEvent( - type="UtteranceEnd", - channel=[0], - last_word_end=1.5 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "UtteranceEnd" - assert event_dict["last_word_end"] == 1.5 - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"UtteranceEnd"' in json_str - - def test_utterance_end_event_missing_fields(self): - """Test utterance end event with missing required fields.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1UtteranceEndEvent( - type="UtteranceEnd", - channel=[0] - # Missing last_word_end - ) - assert "last_word_end" in str(exc_info.value) - - def test_utterance_end_event_invalid_data_types(self): - """Test utterance end event with invalid data types.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1UtteranceEndEvent( - type="UtteranceEnd", - channel=[0], - last_word_end="not_a_number" - ) - assert "Input should be a valid number" in str(exc_info.value) - - -class TestListenV1ControlMessage: - """Test ListenV1ControlMessage model.""" - - def test_valid_control_message(self): - """Test creating a valid control message.""" - message = ListenV1ControlMessage( - type="KeepAlive" - ) - - assert message.type == "KeepAlive" - - def test_control_message_serialization(self): - """Test control message serialization.""" - message = ListenV1ControlMessage(type="KeepAlive") - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "KeepAlive" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"KeepAlive"' in json_str - - def test_control_message_missing_type(self): - """Test control message with missing type field.""" - with pytest.raises(ValidationError) as exc_info: - ListenV1ControlMessage() - assert "type" in str(exc_info.value) - - -class TestListenV1MediaMessage: - """Test ListenV1MediaMessage model.""" - - def test_valid_media_message(self, sample_audio_data): - """Test creating a valid media message.""" - # ListenV1MediaMessage is typically just bytes - assert isinstance(sample_audio_data, bytes) - assert len(sample_audio_data) > 0 - - def test_empty_media_message(self): - """Test empty media message.""" - empty_data = b"" - assert isinstance(empty_data, bytes) - assert len(empty_data) == 0 - - -class TestListenV1ModelIntegration: - """Integration tests for Listen V1 models.""" - - def test_model_roundtrip_serialization(self, valid_model_data): - """Test that models can be serialized and deserialized.""" - # Test metadata event roundtrip - metadata_data = valid_model_data("listen_v1_metadata") - original_event = ListenV1MetadataEvent(**metadata_data) - - # Serialize to JSON and back - json_str = original_event.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_event = ListenV1MetadataEvent(**parsed_data) - - assert original_event.type == reconstructed_event.type - assert original_event.request_id == reconstructed_event.request_id - assert original_event.sha256 == reconstructed_event.sha256 - assert original_event.duration == reconstructed_event.duration - - def test_model_validation_edge_cases(self): - """Test edge cases in model validation.""" - # Test with very long strings - long_string = "x" * 10000 - event = ListenV1MetadataEvent( - type="Metadata", - request_id=long_string, - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration=1.0, - channels=1 - ) - assert len(event.request_id) == 10000 - - # Test with extreme numeric values - event = ListenV1MetadataEvent( - type="Metadata", - request_id="test-123", - sha256="abc123", - created="2023-01-01T00:00:00Z", - duration=999999.999999, - channels=999999 - ) - assert event.duration == 999999.999999 - assert event.channels == 999999 - - def test_model_immutability(self, valid_model_data): - """Test that models are properly validated on construction.""" - data = valid_model_data("listen_v1_metadata") - event = ListenV1MetadataEvent(**data) - - # Models should be immutable by default in Pydantic v2 - # Test that we can access all fields - assert event.type == "Metadata" - assert event.request_id is not None - assert event.sha256 is not None - assert event.created is not None - assert event.duration is not None - assert event.channels is not None diff --git a/tests/unit/test_listen_v2_models.py b/tests/unit/test_listen_v2_models.py deleted file mode 100644 index 9da429ae..00000000 --- a/tests/unit/test_listen_v2_models.py +++ /dev/null @@ -1,418 +0,0 @@ -""" -Unit tests for Listen V2 socket event models. -""" -import pytest -from pydantic import ValidationError - -from deepgram.extensions.types.sockets.listen_v2_connected_event import ListenV2ConnectedEvent -from deepgram.extensions.types.sockets.listen_v2_turn_info_event import ListenV2TurnInfoEvent -from deepgram.extensions.types.sockets.listen_v2_fatal_error_event import ListenV2FatalErrorEvent -from deepgram.extensions.types.sockets.listen_v2_control_message import ListenV2ControlMessage -from deepgram.extensions.types.sockets.listen_v2_media_message import ListenV2MediaMessage - - -class TestListenV2ConnectedEvent: - """Test ListenV2ConnectedEvent model.""" - - def test_valid_connected_event(self): - """Test creating a valid connected event.""" - event = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=1 - ) - - assert event.type == "Connected" - assert event.request_id == "req-123" - assert event.sequence_id == 1 - - def test_connected_event_serialization(self): - """Test connected event serialization.""" - event = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=1 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Connected" - assert event_dict["request_id"] == "req-123" - assert event_dict["sequence_id"] == 1 - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Connected"' in json_str - assert '"request_id":"req-123"' in json_str - - def test_connected_event_missing_required_fields(self): - """Test connected event with missing required fields.""" - # Missing request_id - with pytest.raises(ValidationError) as exc_info: - ListenV2ConnectedEvent( - type="Connected", - sequence_id=1 - ) - assert "request_id" in str(exc_info.value) - - # Missing sequence_id - with pytest.raises(ValidationError) as exc_info: - ListenV2ConnectedEvent( - type="Connected", - request_id="req-123" - ) - assert "sequence_id" in str(exc_info.value) - - def test_connected_event_wrong_type(self): - """Test connected event with wrong type field.""" - # Note: ListenV2ConnectedEvent doesn't enforce specific type values, - # so this should succeed but with the wrong type value - event = ListenV2ConnectedEvent( - type="Results", # Wrong type but still valid string - request_id="req-123", - sequence_id=1 - ) - assert event.type == "Results" # It accepts any string - - def test_connected_event_invalid_data_types(self): - """Test connected event with invalid data types.""" - # Invalid sequence_id type - with pytest.raises(ValidationError) as exc_info: - ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id="not_a_number" - ) - assert "Input should be a valid integer" in str(exc_info.value) - - -class TestListenV2TurnInfoEvent: - """Test ListenV2TurnInfoEvent model.""" - - def test_valid_turn_info_event(self): - """Test creating a valid turn info event.""" - event = ListenV2TurnInfoEvent( - type="TurnInfo", - request_id="req-123", - sequence_id=1, - event="TurnInfo", - turn_index=0, - audio_window_start=0.0, - audio_window_end=1.5, - transcript="Hello world", - words=[], - end_of_turn_confidence=0.95 - ) - - assert event.type == "TurnInfo" - assert event.request_id == "req-123" - assert event.sequence_id == 1 - assert event.event == "TurnInfo" - assert event.turn_index == 0 - assert event.audio_window_start == 0.0 - assert event.audio_window_end == 1.5 - assert event.transcript == "Hello world" - - def test_turn_info_event_serialization(self): - """Test turn info event serialization.""" - event = ListenV2TurnInfoEvent( - type="TurnInfo", - request_id="req-123", - sequence_id=1, - event="TurnInfo", - turn_index=0, - audio_window_start=0.0, - audio_window_end=1.5, - transcript="Hello world", - words=[], - end_of_turn_confidence=0.95 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "TurnInfo" - assert event_dict["turn_index"] == 0 - assert event_dict["transcript"] == "Hello world" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"TurnInfo"' in json_str - assert '"transcript":"Hello world"' in json_str - - def test_turn_info_event_missing_required_fields(self): - """Test turn info event with missing required fields.""" - # Missing event field - with pytest.raises(ValidationError) as exc_info: - ListenV2TurnInfoEvent( - type="TurnInfo", - request_id="req-123", - sequence_id=1, - turn_index=0, - audio_window_start=0.0, - audio_window_end=1.5, - transcript="Hello world", - words=[], - end_of_turn_confidence=0.95 - ) - assert "event" in str(exc_info.value) - - def test_turn_info_event_invalid_data_types(self): - """Test turn info event with invalid data types.""" - # Invalid audio_window_start type - with pytest.raises(ValidationError) as exc_info: - ListenV2TurnInfoEvent( - type="TurnInfo", - request_id="req-123", - sequence_id=1, - event="TurnInfo", - turn_index=0, - audio_window_start="not_a_number", - audio_window_end=1.5, - transcript="Hello world", - words=[], - end_of_turn_confidence=0.95 - ) - assert "Input should be a valid number" in str(exc_info.value) - - # Invalid audio_window_end type - with pytest.raises(ValidationError) as exc_info: - ListenV2TurnInfoEvent( - type="TurnInfo", - request_id="req-123", - sequence_id=1, - event="TurnInfo", - turn_index=0, - audio_window_start=0.0, - audio_window_end="not_a_number", - transcript="Hello world", - words=[], - end_of_turn_confidence=0.95 - ) - assert "Input should be a valid number" in str(exc_info.value) - - -class TestListenV2FatalErrorEvent: - """Test ListenV2FatalErrorEvent model.""" - - def test_valid_fatal_error_event(self): - """Test creating a valid fatal error event.""" - event = ListenV2FatalErrorEvent( - type="FatalError", - sequence_id=1, - code="500", - description="Internal server error" - ) - - assert event.type == "FatalError" - assert event.sequence_id == 1 - assert event.code == "500" - assert event.description == "Internal server error" - - def test_fatal_error_event_serialization(self): - """Test fatal error event serialization.""" - event = ListenV2FatalErrorEvent( - type="FatalError", - sequence_id=1, - code="500", - description="Internal server error" - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "FatalError" - assert event_dict["code"] == "500" - assert event_dict["description"] == "Internal server error" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"FatalError"' in json_str - assert '"code":"500"' in json_str - - def test_fatal_error_event_missing_required_fields(self): - """Test fatal error event with missing required fields.""" - # Missing code - with pytest.raises(ValidationError) as exc_info: - ListenV2FatalErrorEvent( - type="FatalError", - sequence_id=1, - description="Internal server error" - ) - assert "code" in str(exc_info.value) - - # Missing description - with pytest.raises(ValidationError) as exc_info: - ListenV2FatalErrorEvent( - type="FatalError", - sequence_id=1, - code=500 - ) - assert "description" in str(exc_info.value) - - def test_fatal_error_event_wrong_type(self): - """Test fatal error event with wrong type field.""" - # Note: ListenV2FatalErrorEvent doesn't enforce specific type values, - # so this should succeed but with the wrong type value - event = ListenV2FatalErrorEvent( - type="Connected", # Wrong type but still valid string - sequence_id=1, - code="500", - description="Internal server error" - ) - assert event.type == "Connected" # It accepts any string - - def test_fatal_error_event_invalid_data_types(self): - """Test fatal error event with invalid data types.""" - # Invalid sequence_id type - with pytest.raises(ValidationError) as exc_info: - ListenV2FatalErrorEvent( - type="FatalError", - sequence_id="not_a_number", - code="500", - description="Internal server error" - ) - assert "Input should be a valid integer" in str(exc_info.value) - - -class TestListenV2ControlMessage: - """Test ListenV2ControlMessage model.""" - - def test_valid_control_message(self): - """Test creating a valid control message.""" - message = ListenV2ControlMessage( - type="CloseStream" - ) - - assert message.type == "CloseStream" - - def test_control_message_serialization(self): - """Test control message serialization.""" - message = ListenV2ControlMessage(type="CloseStream") - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "CloseStream" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"CloseStream"' in json_str - - def test_control_message_missing_type(self): - """Test control message with missing type field.""" - with pytest.raises(ValidationError) as exc_info: - ListenV2ControlMessage() - assert "type" in str(exc_info.value) - - -class TestListenV2MediaMessage: - """Test ListenV2MediaMessage model.""" - - def test_valid_media_message(self): - """Test creating a valid media message.""" - # ListenV2MediaMessage appears to be an empty model - message = ListenV2MediaMessage() - - # Test that it can be instantiated - assert message is not None - - def test_media_message_serialization(self): - """Test media message serialization.""" - message = ListenV2MediaMessage() - - # Test dict conversion - message_dict = message.model_dump() - assert isinstance(message_dict, dict) - - # Test JSON serialization - json_str = message.model_dump_json() - assert isinstance(json_str, str) - - -class TestListenV2ModelIntegration: - """Integration tests for Listen V2 models.""" - - def test_model_roundtrip_serialization(self): - """Test that models can be serialized and deserialized.""" - # Test connected event roundtrip - original_event = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=1 - ) - - # Serialize to JSON and back - json_str = original_event.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_event = ListenV2ConnectedEvent(**parsed_data) - - assert original_event.type == reconstructed_event.type - assert original_event.request_id == reconstructed_event.request_id - assert original_event.sequence_id == reconstructed_event.sequence_id - - def test_model_validation_edge_cases(self): - """Test edge cases in model validation.""" - # Test with very long strings - long_string = "x" * 10000 - event = ListenV2ConnectedEvent( - type="Connected", - request_id=long_string, - sequence_id=999999 - ) - assert len(event.request_id) == 10000 - assert event.sequence_id == 999999 - - # Test with negative sequence_id (should be allowed if not restricted) - event = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=0 - ) - assert event.sequence_id == 0 - - def test_model_comparison(self): - """Test model equality comparison.""" - event1 = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=1 - ) - event2 = ListenV2ConnectedEvent( - type="Connected", - request_id="req-123", - sequence_id=1 - ) - event3 = ListenV2ConnectedEvent( - type="Connected", - request_id="req-456", - sequence_id=1 - ) - - # Same data should be equal - assert event1 == event2 - # Different data should not be equal - assert event1 != event3 - - def test_error_event_comprehensive(self): - """Test comprehensive error event scenarios.""" - # Test common HTTP error codes - error_codes = [400, 401, 403, 404, 429, 500, 502, 503] - error_messages = [ - "Bad Request", - "Unauthorized", - "Forbidden", - "Not Found", - "Too Many Requests", - "Internal Server Error", - "Bad Gateway", - "Service Unavailable" - ] - - for code, message in zip(error_codes, error_messages): - event = ListenV2FatalErrorEvent( - type="FatalError", - sequence_id=code, - code=str(code), - description=message - ) - assert event.code == str(code) - assert event.description == message diff --git a/tests/unit/test_manage_billing_fields.py b/tests/unit/test_manage_billing_fields.py deleted file mode 100644 index 76f8aadd..00000000 --- a/tests/unit/test_manage_billing_fields.py +++ /dev/null @@ -1,498 +0,0 @@ -""" -Unit tests for manage projects billing fields models and methods. - -This module tests the billing fields list methods including: -- ListBillingFieldsV1Response model validation -- Sync and async client methods -- Request parameter handling -- Error scenarios -""" - -import pytest -from pydantic import ValidationError - -from deepgram.types.list_billing_fields_v1response import ListBillingFieldsV1Response -from deepgram.types.list_billing_fields_v1response_deployments_item import ( - ListBillingFieldsV1ResponseDeploymentsItem, -) - - -class TestListBillingFieldsV1Response: - """Test ListBillingFieldsV1Response model.""" - - def test_valid_billing_fields_response_full(self): - """Test creating a valid billing fields response with all fields.""" - response_data = { - "accessors": [ - "12345678-1234-1234-1234-123456789012", - "87654321-4321-4321-4321-210987654321", - ], - "deployments": ["hosted", "beta", "self-hosted", "dedicated"], - "tags": ["tag1", "tag2", "production"], - "line_items": { - "streaming::nova-3": "Nova-3 Streaming", - "batch::nova-2": "Nova-2 Batch", - "streaming::enhanced": "Enhanced Streaming", - }, - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert len(response.accessors) == 2 - assert response.accessors[0] == "12345678-1234-1234-1234-123456789012" - assert response.deployments is not None - assert len(response.deployments) == 4 - assert "hosted" in response.deployments - assert response.tags is not None - assert len(response.tags) == 3 - assert "production" in response.tags - assert response.line_items is not None - assert len(response.line_items) == 3 - assert response.line_items["streaming::nova-3"] == "Nova-3 Streaming" - - def test_valid_billing_fields_response_minimal(self): - """Test creating a billing fields response with minimal fields.""" - response_data = {} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is None - assert response.deployments is None - assert response.tags is None - assert response.line_items is None - - def test_billing_fields_response_empty_lists(self): - """Test billing fields response with empty lists.""" - response_data = { - "accessors": [], - "deployments": [], - "tags": [], - "line_items": {}, - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors == [] - assert response.deployments == [] - assert response.tags == [] - assert response.line_items == {} - - def test_billing_fields_response_with_accessors_only(self): - """Test billing fields response with only accessors.""" - response_data = { - "accessors": [ - "11111111-1111-1111-1111-111111111111", - "22222222-2222-2222-2222-222222222222", - ] - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert len(response.accessors) == 2 - assert response.deployments is None - assert response.tags is None - assert response.line_items is None - - def test_billing_fields_response_with_deployments_only(self): - """Test billing fields response with only deployments.""" - response_data = {"deployments": ["hosted", "dedicated"]} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is None - assert response.deployments is not None - assert len(response.deployments) == 2 - assert "hosted" in response.deployments - assert "dedicated" in response.deployments - assert response.tags is None - assert response.line_items is None - - def test_billing_fields_response_with_tags_only(self): - """Test billing fields response with only tags.""" - response_data = {"tags": ["development", "staging", "production"]} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is None - assert response.deployments is None - assert response.tags is not None - assert len(response.tags) == 3 - assert "production" in response.tags - assert response.line_items is None - - def test_billing_fields_response_with_line_items_only(self): - """Test billing fields response with only line_items.""" - response_data = { - "line_items": { - "streaming::nova-3": "Nova-3 Streaming", - "batch::whisper": "Whisper Batch", - } - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is None - assert response.deployments is None - assert response.tags is None - assert response.line_items is not None - assert len(response.line_items) == 2 - assert response.line_items["batch::whisper"] == "Whisper Batch" - - def test_billing_fields_response_serialization(self): - """Test billing fields response serialization.""" - response_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "deployments": ["hosted"], - "tags": ["test-tag"], - "line_items": {"streaming::nova-3": "Nova-3 Streaming"}, - } - - response = ListBillingFieldsV1Response(**response_data) - - # Test dict conversion - response_dict = response.model_dump() - assert "accessors" in response_dict - assert "deployments" in response_dict - assert "tags" in response_dict - assert "line_items" in response_dict - assert response_dict["accessors"][0] == "12345678-1234-1234-1234-123456789012" - - # Test JSON serialization - json_str = response.model_dump_json() - assert '"accessors"' in json_str - assert '"deployments"' in json_str - assert '"tags"' in json_str - assert '"line_items"' in json_str - assert "12345678-1234-1234-1234-123456789012" in json_str - - def test_billing_fields_response_immutability(self): - """Test that billing fields response is immutable (frozen).""" - response = ListBillingFieldsV1Response( - accessors=["12345678-1234-1234-1234-123456789012"] - ) - - with pytest.raises((AttributeError, ValidationError)): - response.accessors = ["new-accessor"] - - def test_billing_fields_response_extra_fields_allowed(self): - """Test that billing fields response allows extra fields.""" - response_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "extra_field": "extra_value", - "custom_data": {"nested": "value"}, - } - - # Should not raise an error due to extra="allow" - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert hasattr(response, "extra_field") - assert hasattr(response, "custom_data") - - def test_billing_fields_response_roundtrip_serialization(self): - """Test that billing fields response can be serialized and deserialized.""" - original_data = { - "accessors": [ - "12345678-1234-1234-1234-123456789012", - "87654321-4321-4321-4321-210987654321", - ], - "deployments": ["hosted", "beta"], - "tags": ["tag1", "tag2"], - "line_items": { - "streaming::nova-3": "Nova-3 Streaming", - "batch::nova-2": "Nova-2 Batch", - }, - } - - original_response = ListBillingFieldsV1Response(**original_data) - - # Serialize to JSON and back - json_str = original_response.model_dump_json() - import json - - parsed_data = json.loads(json_str) - reconstructed_response = ListBillingFieldsV1Response(**parsed_data) - - assert original_response.accessors == reconstructed_response.accessors - assert original_response.deployments == reconstructed_response.deployments - assert original_response.tags == reconstructed_response.tags - assert original_response.line_items == reconstructed_response.line_items - - def test_billing_fields_response_with_many_accessors(self): - """Test billing fields response with many accessors.""" - # Simulate a response with many accessors - accessors = [ - f"{i:08x}-1234-1234-1234-123456789012" for i in range(100) - ] - response_data = {"accessors": accessors} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert len(response.accessors) == 100 - assert response.accessors[0] == "00000000-1234-1234-1234-123456789012" - assert response.accessors[99] == "00000063-1234-1234-1234-123456789012" - - def test_billing_fields_response_with_many_tags(self): - """Test billing fields response with many tags.""" - # Simulate a response with many tags - tags = [f"tag-{i}" for i in range(50)] - response_data = {"tags": tags} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.tags is not None - assert len(response.tags) == 50 - assert "tag-0" in response.tags - assert "tag-49" in response.tags - - def test_billing_fields_response_with_many_line_items(self): - """Test billing fields response with many line_items.""" - # Simulate a response with many line items - line_items = { - f"streaming::model-{i}": f"Model {i} Streaming" for i in range(20) - } - response_data = {"line_items": line_items} - - response = ListBillingFieldsV1Response(**response_data) - - assert response.line_items is not None - assert len(response.line_items) == 20 - assert response.line_items["streaming::model-0"] == "Model 0 Streaming" - assert response.line_items["streaming::model-19"] == "Model 19 Streaming" - - def test_billing_fields_response_with_special_characters_in_tags(self): - """Test billing fields response with special characters in tags.""" - response_data = { - "tags": [ - "tag-with-dashes", - "tag_with_underscores", - "tag.with.dots", - "tag:with:colons", - "tag/with/slashes", - ] - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.tags is not None - assert len(response.tags) == 5 - assert "tag-with-dashes" in response.tags - assert "tag/with/slashes" in response.tags - - def test_billing_fields_response_with_unicode_in_line_items(self): - """Test billing fields response with unicode characters.""" - response_data = { - "line_items": { - "streaming::nova-3": "Nova-3 Streaming πŸš€", - "batch::model-ζ΅‹θ―•": "Test Model ζ΅‹θ―•", - "streaming::Γ©moji": "Γ‰moji Model with accΓ©nts", - } - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.line_items is not None - assert response.line_items["streaming::nova-3"] == "Nova-3 Streaming πŸš€" - assert response.line_items["batch::model-ζ΅‹θ―•"] == "Test Model ζ΅‹θ―•" - assert response.line_items["streaming::Γ©moji"] == "Γ‰moji Model with accΓ©nts" - - def test_billing_fields_response_comparison(self): - """Test billing fields response equality comparison.""" - response_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "deployments": ["hosted"], - "tags": ["tag1"], - "line_items": {"streaming::nova-3": "Nova-3 Streaming"}, - } - - response1 = ListBillingFieldsV1Response(**response_data) - response2 = ListBillingFieldsV1Response(**response_data) - - # Same data should be equal - assert response1 == response2 - - # Different data should not be equal - different_data = response_data.copy() - different_data["accessors"] = ["87654321-4321-4321-4321-210987654321"] - response3 = ListBillingFieldsV1Response(**different_data) - assert response1 != response3 - - -class TestListBillingFieldsV1ResponseDeploymentsItem: - """Test ListBillingFieldsV1ResponseDeploymentsItem type.""" - - def test_deployments_item_literal_values(self): - """Test that deployments item accepts literal values.""" - valid_deployments = ["hosted", "beta", "self-hosted", "dedicated"] - - for deployment in valid_deployments: - deployment_value: ListBillingFieldsV1ResponseDeploymentsItem = deployment - assert isinstance(deployment_value, str) - - def test_deployments_item_custom_value(self): - """Test that deployments item accepts custom values due to typing.Any.""" - # String not in literals - custom_deployment: ListBillingFieldsV1ResponseDeploymentsItem = ( - "custom-deployment" - ) - assert isinstance(custom_deployment, str) - assert custom_deployment == "custom-deployment" - - def test_deployments_item_in_response(self): - """Test deployments item usage within a response.""" - response_data = { - "deployments": ["hosted", "beta", "custom-deployment", "self-hosted"] - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.deployments is not None - assert len(response.deployments) == 4 - assert "hosted" in response.deployments - assert "custom-deployment" in response.deployments - - -class TestBillingFieldsResponseIntegration: - """Integration tests for billing fields response models.""" - - def test_realistic_billing_fields_response(self): - """Test a realistic billing fields response with typical data.""" - response_data = { - "accessors": [ - "a1b2c3d4-5678-90ab-cdef-1234567890ab", - "b2c3d4e5-6789-01bc-def0-234567890abc", - "c3d4e5f6-7890-12cd-ef01-34567890abcd", - ], - "deployments": ["hosted", "self-hosted"], - "tags": [ - "production", - "customer-123", - "region-us-east", - "team-engineering", - ], - "line_items": { - "streaming::nova-3": "Nova-3 Streaming Transcription", - "streaming::nova-2": "Nova-2 Streaming Transcription", - "batch::nova-3": "Nova-3 Batch Transcription", - "batch::whisper": "Whisper Batch Transcription", - "streaming::enhanced": "Enhanced Streaming Transcription", - "tts::aura": "Aura Text-to-Speech", - }, - } - - response = ListBillingFieldsV1Response(**response_data) - - # Verify all fields are present and correct - assert len(response.accessors) == 3 - assert len(response.deployments) == 2 - assert len(response.tags) == 4 - assert len(response.line_items) == 6 - - # Verify specific values - assert "customer-123" in response.tags - assert "hosted" in response.deployments - assert response.line_items["tts::aura"] == "Aura Text-to-Speech" - - def test_billing_fields_response_with_date_filters(self): - """Test billing fields response scenario with date-filtered data.""" - # This represents a response for a specific date range - response_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "deployments": ["hosted"], - "tags": ["q1-2024", "january"], - "line_items": { - "streaming::nova-3": "Nova-3 Streaming", - "batch::nova-2": "Nova-2 Batch", - }, - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert len(response.accessors) == 1 - assert "q1-2024" in response.tags - assert len(response.line_items) == 2 - - def test_billing_fields_response_empty_results(self): - """Test billing fields response with no data for the period.""" - # This represents a response for a period with no billing data - response_data = { - "accessors": [], - "deployments": [], - "tags": [], - "line_items": {}, - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors == [] - assert response.deployments == [] - assert response.tags == [] - assert response.line_items == {} - - def test_billing_fields_response_partial_data(self): - """Test billing fields response with partial data.""" - # Some projects might only have certain fields populated - response_data = { - "deployments": ["hosted"], - "line_items": {"streaming::nova-3": "Nova-3 Streaming"}, - } - - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is None - assert response.deployments is not None - assert response.tags is None - assert response.line_items is not None - - def test_multiple_billing_fields_responses_comparison(self): - """Test comparing multiple billing fields responses.""" - response1_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "tags": ["january"], - } - - response2_data = { - "accessors": [ - "12345678-1234-1234-1234-123456789012", - "87654321-4321-4321-4321-210987654321", - ], - "tags": ["february"], - } - - response1 = ListBillingFieldsV1Response(**response1_data) - response2 = ListBillingFieldsV1Response(**response2_data) - - # Verify they are different - assert response1 != response2 - assert len(response1.accessors) == 1 - assert len(response2.accessors) == 2 - - def test_billing_fields_response_model_evolution(self): - """Test that the model handles potential future fields gracefully.""" - # Simulate a response with additional fields that might be added in the future - response_data = { - "accessors": ["12345678-1234-1234-1234-123456789012"], - "deployments": ["hosted"], - "tags": ["tag1"], - "line_items": {"streaming::nova-3": "Nova-3 Streaming"}, - # Future fields - "future_field_1": "some_value", - "future_field_2": {"nested": "data"}, - "future_field_3": [1, 2, 3], - } - - # Should not raise an error due to extra="allow" - response = ListBillingFieldsV1Response(**response_data) - - assert response.accessors is not None - assert response.deployments is not None - assert response.tags is not None - assert response.line_items is not None - assert hasattr(response, "future_field_1") - assert hasattr(response, "future_field_2") - assert hasattr(response, "future_field_3") - diff --git a/tests/unit/test_speak_v1_models.py b/tests/unit/test_speak_v1_models.py deleted file mode 100644 index d4e7873e..00000000 --- a/tests/unit/test_speak_v1_models.py +++ /dev/null @@ -1,462 +0,0 @@ -""" -Unit tests for Speak V1 socket event models. -""" -import pytest -from pydantic import ValidationError - -from deepgram.extensions.types.sockets.speak_v1_metadata_event import SpeakV1MetadataEvent -from deepgram.extensions.types.sockets.speak_v1_control_event import SpeakV1ControlEvent -from deepgram.extensions.types.sockets.speak_v1_warning_event import SpeakV1WarningEvent -from deepgram.extensions.types.sockets.speak_v1_audio_chunk_event import SpeakV1AudioChunkEvent -from deepgram.extensions.types.sockets.speak_v1_text_message import SpeakV1TextMessage -from deepgram.extensions.types.sockets.speak_v1_control_message import SpeakV1ControlMessage - - -class TestSpeakV1MetadataEvent: - """Test SpeakV1MetadataEvent model.""" - - def test_valid_metadata_event(self, valid_model_data): - """Test creating a valid metadata event.""" - data = valid_model_data("speak_v1_metadata") - event = SpeakV1MetadataEvent(**data) - - assert event.type == "Metadata" - assert event.request_id == "speak-123" - assert event.model_name == "aura-asteria-en" - assert event.model_version == "1.0" - assert event.model_uuid == "uuid-123" - - def test_metadata_event_serialization(self, valid_model_data): - """Test metadata event serialization.""" - data = valid_model_data("speak_v1_metadata") - event = SpeakV1MetadataEvent(**data) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Metadata" - assert event_dict["request_id"] == "speak-123" - assert event_dict["model_name"] == "aura-asteria-en" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Metadata"' in json_str - assert '"request_id":"speak-123"' in json_str - - def test_metadata_event_missing_required_fields(self): - """Test metadata event with missing required fields.""" - # Missing request_id - with pytest.raises(ValidationError) as exc_info: - SpeakV1MetadataEvent( - type="Metadata", - model_name="aura-asteria-en", - model_version="1.0", - model_uuid="uuid-123" - ) - assert "request_id" in str(exc_info.value) - - # Missing model_name - with pytest.raises(ValidationError) as exc_info: - SpeakV1MetadataEvent( - type="Metadata", - request_id="speak-123", - model_version="1.0", - model_uuid="uuid-123" - ) - assert "model_name" in str(exc_info.value) - - def test_metadata_event_wrong_type(self): - """Test metadata event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - SpeakV1MetadataEvent( - type="Audio", # Wrong type - request_id="speak-123", - model_name="aura-asteria-en", - model_version="1.0", - model_uuid="uuid-123" - ) - assert "Input should be 'Metadata'" in str(exc_info.value) - - def test_metadata_event_optional_fields(self): - """Test metadata event with minimal required fields.""" - event = SpeakV1MetadataEvent( - type="Metadata", - request_id="speak-123", - model_name="aura-asteria-en", - model_version="1.0", - model_uuid="uuid-123" - ) - - assert event.type == "Metadata" - assert event.request_id == "speak-123" - assert event.model_name == "aura-asteria-en" - - -class TestSpeakV1ControlEvent: - """Test SpeakV1ControlEvent model.""" - - def test_valid_control_event(self): - """Test creating a valid control event.""" - event = SpeakV1ControlEvent( - type="Flushed", - sequence_id=1 - ) - - assert event.type == "Flushed" - assert event.sequence_id == 1 - - def test_control_event_serialization(self): - """Test control event serialization.""" - event = SpeakV1ControlEvent( - type="Flushed", - sequence_id=1 - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Flushed" - assert event_dict["sequence_id"] == 1 - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Flushed"' in json_str - assert '"sequence_id":1' in json_str - - def test_control_event_missing_required_fields(self): - """Test control event with missing required fields.""" - # Missing sequence_id - with pytest.raises(ValidationError) as exc_info: - SpeakV1ControlEvent( - type="Flushed" - ) - assert "sequence_id" in str(exc_info.value) - - def test_control_event_wrong_type(self): - """Test control event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - SpeakV1ControlEvent( - type="Metadata", # Wrong type - sequence_id=1 - ) - assert "Input should be 'Flushed'" in str(exc_info.value) - - def test_control_event_invalid_data_types(self): - """Test control event with invalid data types.""" - # Invalid sequence_id type - with pytest.raises(ValidationError) as exc_info: - SpeakV1ControlEvent( - type="Flushed", - sequence_id="not_a_number" - ) - assert "Input should be a valid integer" in str(exc_info.value) - - -class TestSpeakV1WarningEvent: - """Test SpeakV1WarningEvent model.""" - - def test_valid_warning_event(self): - """Test creating a valid warning event.""" - event = SpeakV1WarningEvent( - type="Warning", - description="Audio quality may be degraded", - code="AUDIO_QUALITY_WARNING" - ) - - assert event.type == "Warning" - assert event.description == "Audio quality may be degraded" - assert event.code == "AUDIO_QUALITY_WARNING" - - def test_warning_event_serialization(self): - """Test warning event serialization.""" - event = SpeakV1WarningEvent( - type="Warning", - description="Audio quality may be degraded", - code="AUDIO_QUALITY_WARNING" - ) - - # Test dict conversion - event_dict = event.model_dump() - assert event_dict["type"] == "Warning" - assert event_dict["description"] == "Audio quality may be degraded" - assert event_dict["code"] == "AUDIO_QUALITY_WARNING" - - # Test JSON serialization - json_str = event.model_dump_json() - assert '"type":"Warning"' in json_str - assert '"description":"Audio quality may be degraded"' in json_str - - def test_warning_event_missing_required_fields(self): - """Test warning event with missing required fields.""" - # Missing description - with pytest.raises(ValidationError) as exc_info: - SpeakV1WarningEvent( - type="Warning", - code="AUDIO_QUALITY_WARNING" - ) - assert "description" in str(exc_info.value) - - # Missing code - with pytest.raises(ValidationError) as exc_info: - SpeakV1WarningEvent( - type="Warning", - description="Audio quality may be degraded" - ) - assert "code" in str(exc_info.value) - - def test_warning_event_wrong_type(self): - """Test warning event with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - SpeakV1WarningEvent( - type="Error", # Wrong type - description="Audio quality may be degraded", - code="AUDIO_QUALITY_WARNING" - ) - assert "Input should be 'Warning'" in str(exc_info.value) - - -class TestSpeakV1AudioChunkEvent: - """Test SpeakV1AudioChunkEvent model.""" - - def test_valid_audio_chunk_event(self, sample_audio_data): - """Test creating a valid audio chunk event.""" - # SpeakV1AudioChunkEvent is typically just bytes - assert isinstance(sample_audio_data, bytes) - assert len(sample_audio_data) > 0 - - def test_empty_audio_chunk(self): - """Test empty audio chunk.""" - empty_data = b"" - assert isinstance(empty_data, bytes) - assert len(empty_data) == 0 - - def test_large_audio_chunk(self): - """Test large audio chunk.""" - large_data = b"\x00\x01\x02\x03" * 10000 # 40KB - assert isinstance(large_data, bytes) - assert len(large_data) == 40000 - - -class TestSpeakV1TextMessage: - """Test SpeakV1TextMessage model.""" - - def test_valid_text_message(self): - """Test creating a valid text message.""" - message = SpeakV1TextMessage( - type="Speak", - text="Hello, world!" - ) - - assert message.type == "Speak" - assert message.text == "Hello, world!" - - def test_text_message_serialization(self): - """Test text message serialization.""" - message = SpeakV1TextMessage( - type="Speak", - text="Hello, world!" - ) - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "Speak" - assert message_dict["text"] == "Hello, world!" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"Speak"' in json_str - assert '"text":"Hello, world!"' in json_str - - def test_text_message_missing_required_fields(self): - """Test text message with missing required fields.""" - # Missing text - with pytest.raises(ValidationError) as exc_info: - SpeakV1TextMessage( - type="Speak" - ) - assert "text" in str(exc_info.value) - - def test_text_message_wrong_type(self): - """Test text message with wrong type field.""" - with pytest.raises(ValidationError) as exc_info: - SpeakV1TextMessage( - type="Control", # Wrong type - text="Hello, world!" - ) - assert "Input should be 'Speak'" in str(exc_info.value) - - def test_text_message_empty_text(self): - """Test text message with empty text.""" - message = SpeakV1TextMessage( - type="Speak", - text="" - ) - - assert message.type == "Speak" - assert message.text == "" - - def test_text_message_long_text(self): - """Test text message with very long text.""" - long_text = "Hello, world! " * 1000 # ~14KB - message = SpeakV1TextMessage( - type="Speak", - text=long_text - ) - - assert message.type == "Speak" - assert len(message.text) > 10000 - - def test_text_message_special_characters(self): - """Test text message with special characters.""" - special_text = "Hello! 🌍 こんにけは δ½ ε₯½ 🎡 ñÑéíóú @#$%^&*()_+-=[]{}|;':\",./<>?" - message = SpeakV1TextMessage( - type="Speak", - text=special_text - ) - - assert message.type == "Speak" - assert message.text == special_text - - -class TestSpeakV1ControlMessage: - """Test SpeakV1ControlMessage model.""" - - def test_valid_control_message(self): - """Test creating a valid control message.""" - message = SpeakV1ControlMessage( - type="Flush" - ) - - assert message.type == "Flush" - - def test_control_message_serialization(self): - """Test control message serialization.""" - message = SpeakV1ControlMessage(type="Flush") - - # Test dict conversion - message_dict = message.model_dump() - assert message_dict["type"] == "Flush" - - # Test JSON serialization - json_str = message.model_dump_json() - assert '"type":"Flush"' in json_str - - def test_control_message_missing_type(self): - """Test control message with missing type field.""" - with pytest.raises(ValidationError) as exc_info: - SpeakV1ControlMessage() - assert "type" in str(exc_info.value) - - def test_control_message_different_types(self): - """Test control message with different valid types.""" - valid_types = ["Flush", "Clear", "Close"] - - for control_type in valid_types: - message = SpeakV1ControlMessage(type=control_type) - assert message.type == control_type - - -class TestSpeakV1ModelIntegration: - """Integration tests for Speak V1 models.""" - - def test_model_roundtrip_serialization(self, valid_model_data): - """Test that models can be serialized and deserialized.""" - # Test metadata event roundtrip - metadata_data = valid_model_data("speak_v1_metadata") - original_event = SpeakV1MetadataEvent(**metadata_data) - - # Serialize to JSON and back - json_str = original_event.model_dump_json() - import json - parsed_data = json.loads(json_str) - reconstructed_event = SpeakV1MetadataEvent(**parsed_data) - - assert original_event.type == reconstructed_event.type - assert original_event.request_id == reconstructed_event.request_id - assert original_event.model_name == reconstructed_event.model_name - - def test_model_validation_edge_cases(self): - """Test edge cases in model validation.""" - # Test with very long strings - long_string = "x" * 10000 - event = SpeakV1MetadataEvent( - type="Metadata", - request_id=long_string, - model_name="aura-asteria-en", - model_version="1.0", - model_uuid="uuid-123" - ) - assert len(event.request_id) == 10000 - - def test_comprehensive_text_scenarios(self): - """Test comprehensive text message scenarios.""" - test_cases = [ - # Empty text - "", - # Simple text - "Hello, world!", - # Text with numbers - "The year is 2023 and the temperature is 25.5 degrees.", - # Text with punctuation - "Hello! How are you? I'm fine, thanks. What about you...", - # Text with newlines - "Line 1\nLine 2\nLine 3", - # Text with tabs - "Column1\tColumn2\tColumn3", - # Mixed case - "MiXeD CaSe TeXt", - # Only numbers - "1234567890", - # Only symbols - "!@#$%^&*()", - ] - - for text in test_cases: - message = SpeakV1TextMessage( - type="Speak", - text=text - ) - assert message.text == text - assert message.type == "Speak" - - def test_model_immutability(self, valid_model_data): - """Test that models are properly validated on construction.""" - data = valid_model_data("speak_v1_metadata") - event = SpeakV1MetadataEvent(**data) - - # Models should be immutable by default in Pydantic v2 - # Test that we can access all fields - assert event.type == "Metadata" - assert event.request_id is not None - assert event.model_name is not None - assert event.model_version is not None - assert event.model_uuid is not None - - def test_warning_event_comprehensive(self): - """Test comprehensive warning event scenarios.""" - # Test common warning scenarios - warning_scenarios = [ - { - "description": "Audio quality may be degraded due to low bitrate", - "code": "AUDIO_QUALITY_WARNING" - }, - { - "description": "Rate limit approaching", - "code": "RATE_LIMIT_WARNING" - }, - { - "description": "Model switching to fallback version", - "code": "MODEL_FALLBACK_WARNING" - }, - { - "description": "Connection quality poor", - "code": "CONNECTION_WARNING" - } - ] - - for scenario in warning_scenarios: - event = SpeakV1WarningEvent( - type="Warning", - description=scenario["description"], - code=scenario["code"] - ) - assert event.description == scenario["description"] - assert event.code == scenario["code"] diff --git a/tests/unit/test_telemetry_batching_handler.py b/tests/unit/test_telemetry_batching_handler.py deleted file mode 100644 index 6721f7ee..00000000 --- a/tests/unit/test_telemetry_batching_handler.py +++ /dev/null @@ -1,833 +0,0 @@ -""" -Unit tests for batching telemetry handler. -Tests batching logic, background processing, error handling, and synchronous mode. -""" - -import pytest -import time -import threading -import queue -from unittest.mock import Mock, patch, MagicMock -import httpx - -from deepgram.extensions.telemetry.batching_handler import BatchingTelemetryHandler - - -class TestBatchingTelemetryHandler: - """Test BatchingTelemetryHandler initialization and basic functionality.""" - - def test_handler_initialization_default(self): - """Test handler initialization with default parameters.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key" - ) - - assert handler._endpoint == "https://telemetry.deepgram.com/v1/events" - assert handler._api_key == "test_key" - assert handler._batch_size == 20 - assert handler._max_interval == 5.0 - assert handler._content_type == "application/x-protobuf" - assert handler._max_consecutive_failures == 5 - assert handler._consecutive_failures == 0 - assert handler._disabled is False - assert handler._synchronous is False - - def test_handler_initialization_custom_params(self): - """Test handler initialization with custom parameters.""" - mock_client = Mock(spec=httpx.Client) - mock_encoder = Mock() - mock_context_provider = Mock(return_value={"app": "test"}) - - handler = BatchingTelemetryHandler( - endpoint="https://custom.endpoint.com/events", - api_key="custom_key", - batch_size=50, - max_interval_seconds=10.0, - max_queue_size=2000, - client=mock_client, - encode_batch=mock_encoder, - content_type="application/json", - context_provider=mock_context_provider, - max_consecutive_failures=3, - synchronous=True - ) - - assert handler._endpoint == "https://custom.endpoint.com/events" - assert handler._api_key == "custom_key" - assert handler._batch_size == 50 - assert handler._max_interval == 10.0 - assert handler._content_type == "application/json" - assert handler._max_consecutive_failures == 3 - assert handler._synchronous is True - assert handler._client == mock_client - assert handler._encode_batch == mock_encoder - assert handler._context_provider == mock_context_provider - - def test_handler_initialization_synchronous_mode(self): - """Test handler initialization in synchronous mode.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - assert handler._synchronous is True - assert hasattr(handler, '_buffer_sync') - assert handler._buffer_sync == [] - # Should not have worker thread attributes in sync mode - assert not hasattr(handler, '_queue') - assert not hasattr(handler, '_worker') - - def test_handler_initialization_async_mode(self): - """Test handler initialization in asynchronous mode.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=False - ) - - assert handler._synchronous is False - assert hasattr(handler, '_queue') - assert hasattr(handler, '_worker') - assert isinstance(handler._queue, queue.Queue) - assert isinstance(handler._worker, threading.Thread) - assert handler._worker.daemon is True - - # Clean up - handler.close() - - def test_handler_parameter_validation(self): - """Test parameter validation and bounds checking.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - batch_size=0, # Should be clamped to 1 - max_interval_seconds=0.1, # Should be clamped to 0.25 - max_consecutive_failures=0 # Should be clamped to 1 - ) - - assert handler._batch_size == 1 - assert handler._max_interval == 0.25 - assert handler._max_consecutive_failures == 1 - - # Clean up - handler.close() - - -class TestBatchingTelemetryHandlerSynchronous: - """Test BatchingTelemetryHandler in synchronous mode.""" - - def test_sync_event_buffering(self): - """Test event buffering in synchronous mode.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - # Add some events - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - handler.on_http_response( - method="GET", - url="https://api.deepgram.com/v1/test", - status_code=200, - duration_ms=150.0, - headers={"content-type": "application/json"} - ) - - # Events should be buffered locally - assert len(handler._buffer_sync) == 2 - assert handler._buffer_sync[0]["type"] == "http_request" - assert handler._buffer_sync[1]["type"] == "http_response" - assert handler._buffer_sync[0]["method"] == "GET" - assert handler._buffer_sync[1]["status_code"] == 200 - - def test_sync_event_context_enrichment(self): - """Test event context enrichment in synchronous mode.""" - mock_context_provider = Mock(return_value={ - "app_name": "test_app", - "version": "1.0.0", - "environment": "test" - }) - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - context_provider=mock_context_provider - ) - - handler.on_http_request( - method="POST", - url="https://api.deepgram.com/v1/listen", - headers={"Authorization": "Token test"}, - extras={"client": "python-sdk"} - ) - - assert len(handler._buffer_sync) == 1 - event = handler._buffer_sync[0] - assert event["type"] == "http_request" - assert event["method"] == "POST" - assert event["extras"]["client"] == "python-sdk" - assert "ts" in event # Timestamp should be added - - @patch('httpx.Client') - def test_sync_flush_success(self, mock_client_class): - """Test successful flush in synchronous mode.""" - mock_client = Mock() - mock_response = Mock() - mock_response.status_code = 200 - mock_client.post.return_value = mock_response - mock_client_class.return_value = mock_client - - mock_encoder = Mock(return_value=b"encoded_batch_data") - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - encode_batch=mock_encoder - ) - - # Add events to buffer - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # Flush should succeed - handler.flush() - - # Verify encoder was called - mock_encoder.assert_called_once() - - # Verify HTTP client was called correctly - # The actual implementation uses Bearer auth and gzip compression - mock_client.post.assert_called_once() - call_args = mock_client.post.call_args - assert call_args[0][0] == "https://telemetry.deepgram.com/v1/events" - assert "content" in call_args[1] - assert call_args[1]["headers"]["authorization"] == "Bearer test_key" - assert call_args[1]["headers"]["content-type"] == "application/x-protobuf" - assert call_args[1]["headers"]["content-encoding"] == "gzip" - - # Buffer should be cleared after successful flush - assert len(handler._buffer_sync) == 0 - - @patch('httpx.Client') - def test_sync_flush_http_error(self, mock_client_class): - """Test flush with HTTP error in synchronous mode.""" - mock_client = Mock() - mock_response = Mock() - mock_response.status_code = 500 - mock_response.text = "Internal Server Error" - mock_client.post.return_value = mock_response - mock_client_class.return_value = mock_client - - mock_encoder = Mock(return_value=b"encoded_batch_data") - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - encode_batch=mock_encoder, - max_consecutive_failures=2 - ) - - # Add event to buffer - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # First flush should handle HTTP 500 error - check if it's treated as failure - handler.flush() - # The implementation might not treat HTTP 500 as a failure for telemetry - # Let's just verify the handler is still operational - assert handler._disabled is False - - # Add another event and check if handler continues working - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test2", - headers={"Authorization": "Token test"} - ) - handler.flush() - # Handler should still be operational for telemetry - assert handler._disabled is False - - @patch('httpx.Client') - def test_sync_flush_network_error(self, mock_client_class): - """Test flush with network error in synchronous mode.""" - mock_client = Mock() - mock_client.post.side_effect = httpx.ConnectError("Connection failed") - mock_client_class.return_value = mock_client - - mock_encoder = Mock(return_value=b"encoded_batch_data") - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - encode_batch=mock_encoder - ) - - # Add event to buffer - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # Flush should handle network error gracefully - handler.flush() - assert handler._consecutive_failures == 1 - assert handler._disabled is False - - def test_sync_disabled_handler_skips_events(self): - """Test that disabled handler skips new events.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - # Manually disable handler - handler._disabled = True - - # Add event - should be ignored - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - assert len(handler._buffer_sync) == 0 - - -class TestBatchingTelemetryHandlerAsynchronous: - """Test BatchingTelemetryHandler in asynchronous mode.""" - - def test_async_event_enqueuing(self): - """Test event enqueuing in asynchronous mode.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - max_queue_size=100, - synchronous=False - ) - - try: - # Add events - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/listen", - headers={"Authorization": "Token test"} - ) - - # Give worker thread a moment to process - time.sleep(0.1) - - # Queue should have received events (or they should be processed) - # We can't easily check queue contents since worker processes them - # But we can verify no exceptions were raised - assert not handler._disabled - - finally: - handler.close() - - def test_async_queue_full_drops_events(self): - """Test that full queue drops events rather than blocking.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - max_queue_size=2, # Very small queue - synchronous=False - ) - - try: - # Fill up the queue - for i in range(10): # More events than queue size - handler.on_http_request( - method="GET", - url=f"https://api.deepgram.com/v1/test{i}", - headers={"Authorization": "Token test"} - ) - - # Should not block or raise exception - # Some events should be dropped - assert not handler._disabled - - finally: - handler.close() - - def test_async_force_flush_on_error(self): - """Test that error events trigger immediate flush.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - batch_size=100, # Large batch size - synchronous=False - ) - - try: - # Add regular event (should not trigger immediate flush) - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # Add error event (should trigger immediate flush) - handler.on_http_error( - method="POST", - url="https://api.deepgram.com/v1/error", - error=Exception("Test error"), - duration_ms=1000.0 - ) - - # Give worker thread time to process - time.sleep(0.2) - - # Should not be disabled - assert not handler._disabled - - finally: - handler.close() - - def test_async_worker_thread_properties(self): - """Test worker thread properties and lifecycle.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=False - ) - - try: - # Worker should be running - assert handler._worker.is_alive() - assert handler._worker.daemon is True - assert handler._worker.name == "dg-telemetry-worker" - - # Stop event should not be set initially - assert not handler._stop_event.is_set() - - finally: - handler.close() - - # After close, stop event should be set - assert handler._stop_event.is_set() - - def test_async_close_waits_for_worker(self): - """Test that close() waits for worker thread to finish.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=False - ) - - # Add some events - for i in range(5): - handler.on_http_request( - method="GET", - url=f"https://api.deepgram.com/v1/test{i}", - headers={"Authorization": "Token test"} - ) - - worker_thread = handler._worker - assert worker_thread.is_alive() - - # Close should wait for worker to finish - handler.close() - - # Worker should be stopped (give it a moment to finish) - time.sleep(0.1) - assert handler._stop_event.is_set() - # Worker thread may still be alive briefly due to daemon status - - -class TestBatchingTelemetryHandlerEventTypes: - """Test different event types with BatchingTelemetryHandler.""" - - def test_http_request_event_structure(self): - """Test HTTP request event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_http_request( - method="POST", - url="https://api.deepgram.com/v1/listen", - headers={"Authorization": "Token abc123", "Content-Type": "application/json"}, - extras={"sdk": "python", "version": "3.2.1"}, - request_details={"request_id": "req-123", "payload_size": 1024} - ) - - assert len(handler._buffer_sync) == 1 - event = handler._buffer_sync[0] - - assert event["type"] == "http_request" - assert event["method"] == "POST" - assert event["url"] == "https://api.deepgram.com/v1/listen" - assert "ts" in event - assert event["request_id"] == "req-123" - assert event["extras"]["sdk"] == "python" - assert event["request_details"]["payload_size"] == 1024 - - def test_http_response_event_structure(self): - """Test HTTP response event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_http_response( - method="GET", - url="https://api.deepgram.com/v1/projects", - status_code=200, - duration_ms=245.7, - headers={"content-type": "application/json"}, - extras={"region": "us-east-1"}, - response_details={"request_id": "req-456", "response_size": 2048} - ) - - assert len(handler._buffer_sync) == 1 - event = handler._buffer_sync[0] - - assert event["type"] == "http_response" - assert event["method"] == "GET" - assert event["status_code"] == 200 - assert event["duration_ms"] == 245.7 - assert "ts" in event - assert event["request_id"] == "req-456" - assert event["extras"]["region"] == "us-east-1" - assert event["response_details"]["response_size"] == 2048 - - def test_http_response_5xx_creates_error_event(self): - """Test that 5XX HTTP responses create additional error events.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_http_response( - method="POST", - url="https://api.deepgram.com/v1/listen", - status_code=503, - duration_ms=5000.0, - headers={"content-type": "application/json"}, - response_details={"request_id": "req-error"} - ) - - # Check if any events were created - # The handler might immediately flush events or filter them - if len(handler._buffer_sync) >= 1: - response_event = handler._buffer_sync[0] - assert response_event["type"] == "http_response" - assert response_event["status_code"] == 503 - else: - # Events may have been immediately flushed due to force_flush or filtered - # This is acceptable behavior for telemetry - pass - - def test_http_response_4xx_no_error_event(self): - """Test that 4XX HTTP responses do not create error events.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_http_response( - method="POST", - url="https://api.deepgram.com/v1/listen", - status_code=401, - duration_ms=100.0, - headers={"content-type": "application/json"} - ) - - # Should only create response event, no error event for 4XX - assert len(handler._buffer_sync) == 1 - assert handler._buffer_sync[0]["type"] == "http_response" - assert handler._buffer_sync[0]["status_code"] == 401 - - def test_http_error_event_structure(self): - """Test HTTP error event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - test_error = ConnectionError("Network timeout") - handler.on_http_error( - method="PUT", - url="https://api.deepgram.com/v1/models", - error=test_error, - duration_ms=5000.0, - request_details={"request_id": "req-error", "retry_count": 2}, - response_details={"status_code": 503} - ) - - # The handler may not create events for 5XX status codes in response_details - # Let's check what actually gets created - if len(handler._buffer_sync) > 0: - event = handler._buffer_sync[0] - assert event["type"] == "http_error" - assert event["method"] == "PUT" - assert event["error"] == "ConnectionError" - assert event["message"] == "Network timeout" - assert "stack_trace" in event - else: - # Handler filtered out this error due to 5XX status code - pass - - def test_http_error_skips_4xx_client_errors(self): - """Test that HTTP error handler skips 4XX client errors.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - auth_error = Exception("Unauthorized") - handler.on_http_error( - method="GET", - url="https://api.deepgram.com/v1/projects", - error=auth_error, - duration_ms=100.0, - response_details={"status_code": 401} - ) - - # Should skip 4XX client errors - assert len(handler._buffer_sync) == 0 - - def test_websocket_connect_event_structure(self): - """Test WebSocket connect event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/speak", - headers={"Authorization": "Token xyz789"}, - extras={"protocol": "websocket", "version": "v1"}, - request_details={"session_id": "ws-connect-123"} - ) - - assert len(handler._buffer_sync) == 1 - event = handler._buffer_sync[0] - - assert event["type"] == "ws_connect" - assert event["url"] == "wss://api.deepgram.com/v1/speak" - assert "ts" in event - assert event["extras"]["protocol"] == "websocket" - assert event["request_details"]["session_id"] == "ws-connect-123" - - def test_websocket_error_event_structure(self): - """Test WebSocket error event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - ws_error = ConnectionError("WebSocket connection closed unexpectedly") - handler.on_ws_error( - url="wss://api.deepgram.com/v1/agent", - error=ws_error, - extras={"reconnect_attempt": "3"}, - request_details={"session_id": "ws-error-456"}, - response_details={ - "close_code": 1006, - "close_reason": "Abnormal closure", - "stack_trace": "Custom stack trace" - } - ) - - # Check if event was created (may be filtered) - if len(handler._buffer_sync) > 0: - event = handler._buffer_sync[0] - assert event["type"] == "ws_error" - assert event["url"] == "wss://api.deepgram.com/v1/agent" - assert event["error"] == "ConnectionError" - assert event["message"] == "WebSocket connection closed unexpectedly" - assert "stack_trace" in event - else: - # Event may have been filtered - pass - - def test_websocket_close_event_structure(self): - """Test WebSocket close event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - handler.on_ws_close(url="wss://api.deepgram.com/v1/listen") - - # Check if event was created - if len(handler._buffer_sync) > 0: - event = handler._buffer_sync[0] - assert event["type"] == "ws_close" - assert event["url"] == "wss://api.deepgram.com/v1/listen" - assert "ts" in event - else: - # Event may have been filtered or immediately flushed - pass - - def test_uncaught_error_event_structure(self): - """Test uncaught error event structure.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - uncaught_error = RuntimeError("Unexpected application error") - handler.on_uncaught_error(error=uncaught_error) - - # Check if event was created - if len(handler._buffer_sync) > 0: - event = handler._buffer_sync[0] - assert event["type"] == "uncaught_error" - assert event["error"] == "RuntimeError" - assert event["message"] == "Unexpected application error" - assert "stack_trace" in event - assert "ts" in event - else: - # Event may have been filtered or immediately flushed - pass - - -class TestBatchingTelemetryHandlerEdgeCases: - """Test edge cases and error scenarios.""" - - def test_handler_with_no_api_key(self): - """Test handler initialization with no API key.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key=None, - synchronous=True - ) - - assert handler._api_key is None - - # Should still buffer events - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - assert len(handler._buffer_sync) == 1 - - def test_handler_with_debug_mode(self): - """Test handler behavior with debug mode enabled.""" - with patch.dict('os.environ', {'DEEPGRAM_DEBUG': '1'}): - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - assert handler._debug is True - - def test_handler_context_provider_exception(self): - """Test handler with context provider that raises exception.""" - def failing_context_provider(): - raise Exception("Context provider failed") - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - context_provider=failing_context_provider - ) - - # Should handle context provider exception gracefully - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - assert len(handler._buffer_sync) == 1 - - def test_handler_with_custom_encoder_exception(self): - """Test handler with encoder that raises exception.""" - def failing_encoder(events, context): - raise Exception("Encoder failed") - - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True, - encode_batch=failing_encoder - ) - - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # Flush should handle encoder exception gracefully - handler.flush() - assert handler._consecutive_failures == 1 - - def test_handler_close_multiple_times(self): - """Test that calling close() multiple times is safe.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=False - ) - - # Close multiple times should not raise - handler.close() - handler.close() - handler.close() - - # Worker should be stopped - assert handler._stop_event.is_set() - - def test_handler_close_synchronous_mode(self): - """Test close() in synchronous mode.""" - handler = BatchingTelemetryHandler( - endpoint="https://telemetry.deepgram.com/v1/events", - api_key="test_key", - synchronous=True - ) - - # Add events - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"} - ) - - # Close should flush remaining events if any exist - handler.close() - # The actual close() method handles flushing internally - # Just verify it doesn't raise an exception diff --git a/tests/unit/test_telemetry_handler.py b/tests/unit/test_telemetry_handler.py deleted file mode 100644 index a3f09801..00000000 --- a/tests/unit/test_telemetry_handler.py +++ /dev/null @@ -1,511 +0,0 @@ -""" -Unit tests for telemetry handler infrastructure. -Tests the base TelemetryHandler interface and custom implementations. -""" - -import pytest -import typing -from typing import Union -import time -from unittest.mock import Mock, patch - -from deepgram.extensions.telemetry.handler import TelemetryHandler - - -class TestTelemetryHandler: - """Test the base TelemetryHandler interface.""" - - def test_handler_interface_methods_exist(self): - """Test that all interface methods exist and are callable.""" - handler = TelemetryHandler() - - # HTTP methods - assert callable(handler.on_http_request) - assert callable(handler.on_http_response) - assert callable(handler.on_http_error) - - # WebSocket methods - assert callable(handler.on_ws_connect) - assert callable(handler.on_ws_error) - assert callable(handler.on_ws_close) - - # Uncaught error method - assert callable(handler.on_uncaught_error) - - def test_handler_methods_do_nothing_by_default(self): - """Test that default implementation methods do nothing (no exceptions).""" - handler = TelemetryHandler() - - # HTTP methods should not raise - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"}, - extras={"client": "python-sdk"}, - request_details={"request_id": "test-123"} - ) - - handler.on_http_response( - method="GET", - url="https://api.deepgram.com/v1/test", - status_code=200, - duration_ms=150.5, - headers={"content-type": "application/json"}, - extras={"client": "python-sdk"}, - response_details={"request_id": "test-123"} - ) - - handler.on_http_error( - method="POST", - url="https://api.deepgram.com/v1/test", - error=Exception("Test error"), - duration_ms=1000.0, - request_details={"request_id": "test-456"}, - response_details={"status_code": 500} - ) - - # WebSocket methods should not raise - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/listen", - headers={"Authorization": "Token test"}, - extras={"version": "v1"}, - request_details={"session_id": "ws-123"} - ) - - handler.on_ws_error( - url="wss://api.deepgram.com/v1/listen", - error=ConnectionError("Connection lost"), - extras={"reconnect": "true"}, - request_details={"session_id": "ws-123"}, - response_details={"code": 1006} - ) - - handler.on_ws_close(url="wss://api.deepgram.com/v1/listen") - - # Uncaught error method should not raise - handler.on_uncaught_error(error=RuntimeError("Uncaught error")) - - -class CustomTelemetryHandler(TelemetryHandler): - """Custom implementation for testing inheritance.""" - - def __init__(self): - self.events = [] - - def on_http_request( - self, - *, - method: str, - url: str, - headers: Union[typing.Mapping[str, str], None], - extras: Union[typing.Mapping[str, str], None] = None, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: - self.events.append({ - "type": "http_request", - "method": method, - "url": url, - "headers": dict(headers) if headers is not None else None, - "extras": dict(extras) if extras is not None else None, - "request_details": dict(request_details) if request_details is not None else None, - }) - - def on_http_response( - self, - *, - method: str, - url: str, - status_code: int, - duration_ms: float, - headers: Union[typing.Mapping[str, str], None], - extras: Union[typing.Mapping[str, str], None] = None, - response_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: - self.events.append({ - "type": "http_response", - "method": method, - "url": url, - "status_code": status_code, - "duration_ms": duration_ms, - "headers": dict(headers) if headers else None, - "extras": dict(extras) if extras else None, - "response_details": dict(response_details) if response_details else None, - }) - - def on_http_error( - self, - *, - method: str, - url: str, - error: BaseException, - duration_ms: float, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - response_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: - self.events.append({ - "type": "http_error", - "method": method, - "url": url, - "error": str(error), - "error_type": type(error).__name__, - "duration_ms": duration_ms, - "request_details": dict(request_details) if request_details else None, - "response_details": dict(response_details) if response_details else None, - }) - - def on_ws_connect( - self, - *, - url: str, - headers: Union[typing.Mapping[str, str], None], - extras: Union[typing.Mapping[str, str], None] = None, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: - self.events.append({ - "type": "ws_connect", - "url": url, - "headers": dict(headers) if headers else None, - "extras": dict(extras) if extras else None, - "request_details": dict(request_details) if request_details else None, - }) - - def on_ws_error( - self, - *, - url: str, - error: BaseException, - extras: Union[typing.Mapping[str, str], None] = None, - request_details: Union[typing.Mapping[str, typing.Any], None] = None, - response_details: Union[typing.Mapping[str, typing.Any], None] = None, - ) -> None: - self.events.append({ - "type": "ws_error", - "url": url, - "error": str(error), - "error_type": type(error).__name__, - "extras": dict(extras) if extras else None, - "request_details": dict(request_details) if request_details else None, - "response_details": dict(response_details) if response_details else None, - }) - - def on_ws_close( - self, - *, - url: str, - ) -> None: - self.events.append({ - "type": "ws_close", - "url": url, - }) - - def on_uncaught_error(self, *, error: BaseException) -> None: - self.events.append({ - "type": "uncaught_error", - "error": str(error), - "error_type": type(error).__name__, - }) - - -class TestCustomTelemetryHandler: - """Test custom telemetry handler implementation.""" - - def test_custom_handler_inheritance(self): - """Test that custom handler properly inherits from base.""" - handler = CustomTelemetryHandler() - assert isinstance(handler, TelemetryHandler) - - def test_http_request_tracking(self): - """Test HTTP request event tracking.""" - handler = CustomTelemetryHandler() - - handler.on_http_request( - method="POST", - url="https://api.deepgram.com/v1/listen", - headers={"Authorization": "Token abc123", "Content-Type": "application/json"}, - extras={"sdk": "python", "version": "3.2.1"}, - request_details={"request_id": "req-456", "payload_size": 1024} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "http_request" - assert event["method"] == "POST" - assert event["url"] == "https://api.deepgram.com/v1/listen" - assert event["headers"]["Authorization"] == "Token abc123" - assert event["extras"]["sdk"] == "python" - assert event["request_details"]["request_id"] == "req-456" - - def test_http_response_tracking(self): - """Test HTTP response event tracking.""" - handler = CustomTelemetryHandler() - - handler.on_http_response( - method="GET", - url="https://api.deepgram.com/v1/projects", - status_code=200, - duration_ms=245.7, - headers={"content-type": "application/json"}, - extras={"region": "us-east-1"}, - response_details={"request_id": "req-789", "response_size": 2048} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "http_response" - assert event["method"] == "GET" - assert event["status_code"] == 200 - assert event["duration_ms"] == 245.7 - assert event["headers"]["content-type"] == "application/json" - assert event["extras"]["region"] == "us-east-1" - assert event["response_details"]["response_size"] == 2048 - - def test_http_error_tracking(self): - """Test HTTP error event tracking.""" - handler = CustomTelemetryHandler() - - test_error = ConnectionError("Network timeout") - handler.on_http_error( - method="PUT", - url="https://api.deepgram.com/v1/models", - error=test_error, - duration_ms=5000.0, - request_details={"request_id": "req-error", "retry_count": 2}, - response_details={"status_code": 503, "server_error": "Service Unavailable"} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "http_error" - assert event["method"] == "PUT" - assert event["error"] == "Network timeout" - assert event["error_type"] == "ConnectionError" - assert event["duration_ms"] == 5000.0 - assert event["request_details"]["retry_count"] == 2 - assert event["response_details"]["status_code"] == 503 - - def test_websocket_connect_tracking(self): - """Test WebSocket connection event tracking.""" - handler = CustomTelemetryHandler() - - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/speak", - headers={"Authorization": "Token xyz789"}, - extras={"protocol": "websocket", "version": "v1"}, - request_details={"session_id": "ws-connect-123"} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "ws_connect" - assert event["url"] == "wss://api.deepgram.com/v1/speak" - assert event["headers"]["Authorization"] == "Token xyz789" - assert event["extras"]["protocol"] == "websocket" - assert event["request_details"]["session_id"] == "ws-connect-123" - - def test_websocket_error_tracking(self): - """Test WebSocket error event tracking.""" - handler = CustomTelemetryHandler() - - ws_error = ConnectionError("WebSocket connection closed unexpectedly") - handler.on_ws_error( - url="wss://api.deepgram.com/v1/agent", - error=ws_error, - extras={"reconnect_attempt": "3"}, - request_details={"session_id": "ws-error-456"}, - response_details={"close_code": 1006, "close_reason": "Abnormal closure"} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "ws_error" - assert event["url"] == "wss://api.deepgram.com/v1/agent" - assert event["error"] == "WebSocket connection closed unexpectedly" - assert event["error_type"] == "ConnectionError" - assert event["extras"]["reconnect_attempt"] == "3" - assert event["response_details"]["close_code"] == 1006 - - def test_websocket_close_tracking(self): - """Test WebSocket close event tracking.""" - handler = CustomTelemetryHandler() - - handler.on_ws_close(url="wss://api.deepgram.com/v1/listen") - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "ws_close" - assert event["url"] == "wss://api.deepgram.com/v1/listen" - - def test_uncaught_error_tracking(self): - """Test uncaught error event tracking.""" - handler = CustomTelemetryHandler() - - uncaught_error = RuntimeError("Unexpected application error") - handler.on_uncaught_error(error=uncaught_error) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["type"] == "uncaught_error" - assert event["error"] == "Unexpected application error" - assert event["error_type"] == "RuntimeError" - - def test_multiple_events_tracking(self): - """Test tracking multiple events in sequence.""" - handler = CustomTelemetryHandler() - - # HTTP request - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={"Authorization": "Token test"}, - ) - - # HTTP response - handler.on_http_response( - method="GET", - url="https://api.deepgram.com/v1/test", - status_code=200, - duration_ms=100.0, - headers={"content-type": "application/json"}, - ) - - # WebSocket connect - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/listen", - headers={"Authorization": "Token test"}, - ) - - # WebSocket close - handler.on_ws_close(url="wss://api.deepgram.com/v1/listen") - - assert len(handler.events) == 4 - assert handler.events[0]["type"] == "http_request" - assert handler.events[1]["type"] == "http_response" - assert handler.events[2]["type"] == "ws_connect" - assert handler.events[3]["type"] == "ws_close" - - def test_handler_with_none_values(self): - """Test handler methods with None optional parameters.""" - handler = CustomTelemetryHandler() - - # Test with minimal parameters (None optionals) - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers=None, - extras=None, - request_details=None - ) - - handler.on_ws_connect( - url="wss://api.deepgram.com/v1/listen", - headers=None, - extras=None, - request_details=None - ) - - assert len(handler.events) == 2 - assert handler.events[0]["headers"] is None - assert handler.events[0]["extras"] is None - assert handler.events[0]["request_details"] is None - assert handler.events[1]["headers"] is None - assert handler.events[1]["extras"] is None - assert handler.events[1]["request_details"] is None - - -class TestTelemetryHandlerEdgeCases: - """Test edge cases and error scenarios for telemetry handlers.""" - - def test_handler_with_empty_collections(self): - """Test handler with empty dictionaries.""" - handler = CustomTelemetryHandler() - - handler.on_http_request( - method="GET", - url="https://api.deepgram.com/v1/test", - headers={}, - extras={}, - request_details={} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - # Empty dicts are converted to empty dicts, not None - assert event["headers"] == {} - assert event["extras"] == {} - assert event["request_details"] == {} - - def test_handler_with_unicode_data(self): - """Test handler with Unicode strings.""" - handler = CustomTelemetryHandler() - - handler.on_http_request( - method="POST", - url="https://api.deepgram.com/v1/ζ΅‹θ―•", - headers={"User-Agent": "SDKζ΅‹θ―•"}, - extras={"description": "тСст"}, - request_details={"message": "πŸš€ Test"} - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert "ζ΅‹θ―•" in event["url"] - assert event["headers"]["User-Agent"] == "SDKζ΅‹θ―•" - assert event["extras"]["description"] == "тСст" - assert event["request_details"]["message"] == "πŸš€ Test" - - def test_handler_with_large_data(self): - """Test handler with large data structures.""" - handler = CustomTelemetryHandler() - - large_headers = {f"header_{i}": f"value_{i}" for i in range(100)} - large_extras = {f"extra_{i}": f"data_{i}" for i in range(50)} - - handler.on_http_response( - method="POST", - url="https://api.deepgram.com/v1/large", - status_code=200, - duration_ms=2500.0, - headers=large_headers, - extras=large_extras, - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert len(event["headers"]) == 100 - assert len(event["extras"]) == 50 - assert event["headers"]["header_50"] == "value_50" - assert event["extras"]["extra_25"] == "data_25" - - def test_handler_with_nested_error_details(self): - """Test handler with complex nested error details.""" - handler = CustomTelemetryHandler() - - complex_error = ValueError("Complex validation error") - nested_details = { - "error_context": { - "validation_errors": [ - {"field": "audio", "message": "Invalid format"}, - {"field": "model", "message": "Not supported"} - ], - "request_metadata": { - "timestamp": time.time(), - "client_version": "3.2.1", - "feature_flags": {"new_models": True, "beta_features": False} - } - } - } - - handler.on_http_error( - method="POST", - url="https://api.deepgram.com/v1/validate", - error=complex_error, - duration_ms=150.0, - response_details=nested_details - ) - - assert len(handler.events) == 1 - event = handler.events[0] - assert event["error_type"] == "ValueError" - assert event["response_details"]["error_context"]["validation_errors"][0]["field"] == "audio" - assert event["response_details"]["error_context"]["request_metadata"]["client_version"] == "3.2.1" - assert event["response_details"]["error_context"]["request_metadata"]["feature_flags"]["new_models"] is True diff --git a/tests/unit/test_telemetry_models.py b/tests/unit/test_telemetry_models.py deleted file mode 100644 index ce0ce585..00000000 --- a/tests/unit/test_telemetry_models.py +++ /dev/null @@ -1,719 +0,0 @@ -""" -Unit tests for telemetry models. -Tests the Pydantic models used for telemetry data structures. -""" - -import pytest -import typing -from datetime import datetime, timezone -from enum import Enum -import pydantic - -from deepgram.extensions.telemetry.models import ( - ErrorSeverity, - TelemetryContext, - TelemetryEvent, - ErrorEvent -) - - -class TestErrorSeverity: - """Test ErrorSeverity enum.""" - - def test_error_severity_values(self): - """Test that all error severity values are defined correctly.""" - assert ErrorSeverity.UNSPECIFIED == "ERROR_SEVERITY_UNSPECIFIED" - assert ErrorSeverity.INFO == "ERROR_SEVERITY_INFO" - assert ErrorSeverity.WARNING == "ERROR_SEVERITY_WARNING" - assert ErrorSeverity.ERROR == "ERROR_SEVERITY_ERROR" - assert ErrorSeverity.CRITICAL == "ERROR_SEVERITY_CRITICAL" - - def test_error_severity_is_string_enum(self): - """Test that ErrorSeverity is a string enum.""" - assert issubclass(ErrorSeverity, str) - assert issubclass(ErrorSeverity, Enum) - - def test_error_severity_string_representation(self): - """Test string representation of error severity values.""" - # In Python, string enums return their value when converted to string - assert ErrorSeverity.ERROR.value == "ERROR_SEVERITY_ERROR" - assert ErrorSeverity.WARNING.value == "ERROR_SEVERITY_WARNING" - - def test_error_severity_comparison(self): - """Test error severity comparison.""" - # String comparison should work - assert ErrorSeverity.ERROR == "ERROR_SEVERITY_ERROR" - assert ErrorSeverity.WARNING != "ERROR_SEVERITY_ERROR" - - # Enum comparison should work - assert ErrorSeverity.ERROR == ErrorSeverity.ERROR - assert ErrorSeverity.ERROR != ErrorSeverity.WARNING - - def test_error_severity_iteration(self): - """Test that all error severity values can be iterated.""" - severities = list(ErrorSeverity) - assert len(severities) == 5 - assert ErrorSeverity.UNSPECIFIED in severities - assert ErrorSeverity.INFO in severities - assert ErrorSeverity.WARNING in severities - assert ErrorSeverity.ERROR in severities - assert ErrorSeverity.CRITICAL in severities - - -class TestTelemetryContext: - """Test TelemetryContext model.""" - - def test_telemetry_context_creation_empty(self): - """Test creating empty TelemetryContext.""" - context = TelemetryContext() - - assert context.package_name is None - assert context.package_version is None - assert context.language is None - assert context.runtime_version is None - assert context.os is None - assert context.arch is None - assert context.app_name is None - assert context.app_version is None - assert context.environment is None - assert context.session_id is None - assert context.installation_id is None - assert context.project_id is None - - def test_telemetry_context_creation_full(self): - """Test creating TelemetryContext with all fields.""" - context = TelemetryContext( - package_name="python-sdk", - package_version="3.2.1", - language="python", - runtime_version="python 3.11.6", - os="darwin", - arch="arm64", - app_name="test_app", - app_version="1.0.0", - environment="test", - session_id="session-123", - installation_id="install-456", - project_id="project-789" - ) - - assert context.package_name == "python-sdk" - assert context.package_version == "3.2.1" - assert context.language == "python" - assert context.runtime_version == "python 3.11.6" - assert context.os == "darwin" - assert context.arch == "arm64" - assert context.app_name == "test_app" - assert context.app_version == "1.0.0" - assert context.environment == "test" - assert context.session_id == "session-123" - assert context.installation_id == "install-456" - assert context.project_id == "project-789" - - def test_telemetry_context_partial_fields(self): - """Test creating TelemetryContext with partial fields.""" - context = TelemetryContext( - package_name="python-sdk", - package_version="3.2.1", - language="python", - environment="production" - ) - - assert context.package_name == "python-sdk" - assert context.package_version == "3.2.1" - assert context.language == "python" - assert context.environment == "production" - # Unspecified fields should be None - assert context.runtime_version is None - assert context.os is None - assert context.arch is None - assert context.app_name is None - assert context.app_version is None - assert context.session_id is None - assert context.installation_id is None - assert context.project_id is None - - def test_telemetry_context_serialization(self): - """Test TelemetryContext serialization.""" - context = TelemetryContext( - package_name="python-sdk", - package_version="3.2.1", - language="python", - os="linux", - arch="x86_64" - ) - - # Test model_dump (Pydantic v2) or dict (Pydantic v1) - try: - data = context.model_dump() - except AttributeError: - data = context.dict() - - assert data["package_name"] == "python-sdk" - assert data["package_version"] == "3.2.1" - assert data["language"] == "python" - assert data["os"] == "linux" - assert data["arch"] == "x86_64" - assert data["runtime_version"] is None - - def test_telemetry_context_deserialization(self): - """Test TelemetryContext deserialization.""" - data = { - "package_name": "node-sdk", - "package_version": "2.1.0", - "language": "node", - "runtime_version": "node 18.17.0", - "os": "windows", - "arch": "x64" - } - - context = TelemetryContext(**data) - - assert context.package_name == "node-sdk" - assert context.package_version == "2.1.0" - assert context.language == "node" - assert context.runtime_version == "node 18.17.0" - assert context.os == "windows" - assert context.arch == "x64" - - def test_telemetry_context_extra_fields_allowed(self): - """Test that TelemetryContext allows extra fields.""" - # This should not raise due to extra="allow" - context = TelemetryContext( - package_name="python-sdk", - custom_field="custom_value", - another_field=123 - ) - - assert context.package_name == "python-sdk" - # Extra fields should be accessible (depending on Pydantic version) - try: - data = context.model_dump() - except AttributeError: - data = context.dict() - - assert "custom_field" in data or hasattr(context, 'custom_field') - - def test_telemetry_context_immutability(self): - """Test that TelemetryContext is immutable (frozen=True).""" - context = TelemetryContext( - package_name="python-sdk", - package_version="3.2.1" - ) - - # Should not be able to modify fields - with pytest.raises((pydantic.ValidationError, AttributeError, TypeError)): - context.package_name = "modified-sdk" - - def test_telemetry_context_unicode_values(self): - """Test TelemetryContext with Unicode values.""" - context = TelemetryContext( - package_name="python-sdk", - app_name="桋试应用", - environment="тСст", - session_id="πŸš€session-123" - ) - - assert context.package_name == "python-sdk" - assert context.app_name == "桋试应用" - assert context.environment == "тСст" - assert context.session_id == "πŸš€session-123" - - -class TestTelemetryEvent: - """Test TelemetryEvent model.""" - - def test_telemetry_event_creation_minimal(self): - """Test creating minimal TelemetryEvent.""" - event_time = datetime.now(timezone.utc) - event = TelemetryEvent( - name="test.event", - time=event_time - ) - - assert event.name == "test.event" - assert event.time == event_time - assert event.attributes is None - assert event.metrics is None - - def test_telemetry_event_creation_full(self): - """Test creating TelemetryEvent with all fields.""" - event_time = datetime.now(timezone.utc) - attributes = {"service": "deepgram", "version": "3.2.1", "region": "us-east-1"} - metrics = {"duration_ms": 150.5, "payload_size": 1024.0, "response_size": 2048.0} - - event = TelemetryEvent( - name="http.request.completed", - time=event_time, - attributes=attributes, - metrics=metrics - ) - - assert event.name == "http.request.completed" - assert event.time == event_time - assert event.attributes == attributes - assert event.metrics == metrics - - def test_telemetry_event_missing_required_fields(self): - """Test TelemetryEvent validation with missing required fields.""" - # Missing name - with pytest.raises(pydantic.ValidationError) as exc_info: - TelemetryEvent(time=datetime.now(timezone.utc)) - - errors = exc_info.value.errors() - field_names = [error["loc"][0] for error in errors] - assert "name" in field_names - - # Missing time - with pytest.raises(pydantic.ValidationError) as exc_info: - TelemetryEvent(name="test.event") - - errors = exc_info.value.errors() - field_names = [error["loc"][0] for error in errors] - assert "time" in field_names - - def test_telemetry_event_wrong_types(self): - """Test TelemetryEvent validation with wrong types.""" - # Wrong name type - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name=123, # Should be string - time=datetime.now(timezone.utc) - ) - - # Wrong time type - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name="test.event", - time="not_a_datetime" # Should be datetime - ) - - # Wrong attributes type - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name="test.event", - time=datetime.now(timezone.utc), - attributes="not_a_dict" # Should be dict - ) - - # Wrong metrics type - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name="test.event", - time=datetime.now(timezone.utc), - metrics="not_a_dict" # Should be dict - ) - - def test_telemetry_event_attributes_validation(self): - """Test TelemetryEvent attributes validation.""" - event_time = datetime.now(timezone.utc) - - # Valid string attributes - event = TelemetryEvent( - name="test.event", - time=event_time, - attributes={"key1": "value1", "key2": "value2"} - ) - assert event.attributes == {"key1": "value1", "key2": "value2"} - - # Invalid attributes (non-string values) - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name="test.event", - time=event_time, - attributes={"key1": "value1", "key2": 123} # 123 is not string - ) - - def test_telemetry_event_metrics_validation(self): - """Test TelemetryEvent metrics validation.""" - event_time = datetime.now(timezone.utc) - - # Valid float metrics - event = TelemetryEvent( - name="test.event", - time=event_time, - metrics={"metric1": 123.45, "metric2": 67.89} - ) - assert event.metrics == {"metric1": 123.45, "metric2": 67.89} - - # Invalid metrics (non-float values) - with pytest.raises(pydantic.ValidationError): - TelemetryEvent( - name="test.event", - time=event_time, - metrics={"metric1": 123.45, "metric2": "not_a_float"} - ) - - def test_telemetry_event_serialization(self): - """Test TelemetryEvent serialization.""" - event_time = datetime(2023, 12, 1, 12, 0, 0, tzinfo=timezone.utc) - event = TelemetryEvent( - name="api.request", - time=event_time, - attributes={"method": "POST", "endpoint": "/v1/listen"}, - metrics={"duration_ms": 250.0, "size_bytes": 1024.0} - ) - - try: - data = event.model_dump() - except AttributeError: - data = event.dict() - - assert data["name"] == "api.request" - assert data["attributes"]["method"] == "POST" - assert data["metrics"]["duration_ms"] == 250.0 - - def test_telemetry_event_deserialization(self): - """Test TelemetryEvent deserialization.""" - data = { - "name": "websocket.error", - "time": "2023-12-01T12:00:00Z", - "attributes": {"url": "wss://api.deepgram.com", "error_type": "ConnectionError"}, - "metrics": {"reconnect_attempts": 3.0, "downtime_ms": 5000.0} - } - - event = TelemetryEvent(**data) - - assert event.name == "websocket.error" - assert event.attributes["url"] == "wss://api.deepgram.com" - assert event.metrics["reconnect_attempts"] == 3.0 - - def test_telemetry_event_immutability(self): - """Test that TelemetryEvent is immutable.""" - event_time = datetime.now(timezone.utc) - event = TelemetryEvent( - name="test.event", - time=event_time - ) - - # Should not be able to modify fields - with pytest.raises((pydantic.ValidationError, AttributeError, TypeError)): - event.name = "modified.event" - - def test_telemetry_event_extra_fields_allowed(self): - """Test that TelemetryEvent allows extra fields.""" - event_time = datetime.now(timezone.utc) - - # This should not raise due to extra="allow" - event = TelemetryEvent( - name="test.event", - time=event_time, - custom_field="custom_value", - another_field=123 - ) - - assert event.name == "test.event" - assert event.time == event_time - - def test_telemetry_event_unicode_values(self): - """Test TelemetryEvent with Unicode values.""" - event_time = datetime.now(timezone.utc) - event = TelemetryEvent( - name="ζ΅‹θ―•.δΊ‹δ»Ά", - time=event_time, - attributes={"描述": "тСст", "emoji": "πŸš€"}, - metrics={"ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°": 123.45} - ) - - assert event.name == "ζ΅‹θ―•.δΊ‹δ»Ά" - assert event.attributes["描述"] == "тСст" - assert event.attributes["emoji"] == "πŸš€" - assert event.metrics["ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°"] == 123.45 - - -class TestErrorEvent: - """Test ErrorEvent model.""" - - def test_error_event_creation_minimal(self): - """Test creating minimal ErrorEvent.""" - event_time = datetime.now(timezone.utc) - event = ErrorEvent( - type="ConnectionError", - message="Connection failed", - severity=ErrorSeverity.ERROR, - time=event_time - ) - - assert event.type == "ConnectionError" - assert event.message == "Connection failed" - assert event.severity == ErrorSeverity.ERROR - assert event.time == event_time - assert event.stack_trace is None - assert event.handled is False # Default value - - def test_error_event_creation_full(self): - """Test creating ErrorEvent with all fields.""" - event_time = datetime.now(timezone.utc) - stack_trace = "Traceback (most recent call last):\n File ...\nConnectionError: Connection failed" - - event = ErrorEvent( - type="ConnectionError", - message="Network timeout occurred", - severity=ErrorSeverity.CRITICAL, - time=event_time, - stack_trace=stack_trace, - handled=False - ) - - assert event.type == "ConnectionError" - assert event.message == "Network timeout occurred" - assert event.severity == ErrorSeverity.CRITICAL - assert event.time == event_time - assert event.stack_trace == stack_trace - assert event.handled is False - - def test_error_event_missing_required_fields(self): - """Test ErrorEvent validation with missing required fields.""" - event_time = datetime.now(timezone.utc) - - # All fields are optional except time, so we test missing time - # Missing time (required field) - with pytest.raises(pydantic.ValidationError) as exc_info: - ErrorEvent( - type="ConnectionError", - message="Connection failed", - severity=ErrorSeverity.ERROR - ) - errors = exc_info.value.errors() - field_names = [error["loc"][0] for error in errors] - assert "time" in field_names - - # Since most fields are optional, let's just test that we can create - # a minimal valid ErrorEvent - minimal_event = ErrorEvent(time=event_time) - assert minimal_event.time == event_time - assert minimal_event.type is None - assert minimal_event.message is None - assert minimal_event.severity == ErrorSeverity.UNSPECIFIED # Default value - - def test_error_event_wrong_types(self): - """Test ErrorEvent validation with wrong types.""" - event_time = datetime.now(timezone.utc) - - # Wrong type field - with pytest.raises(pydantic.ValidationError): - ErrorEvent( - type=123, # Should be string - message="Connection failed", - severity=ErrorSeverity.ERROR, - time=event_time - ) - - # Since most fields are optional and have default values, - # let's test that the model accepts valid values - valid_event = ErrorEvent( - type="ConnectionError", - message="Connection failed", - severity=ErrorSeverity.ERROR, - time=event_time, - handled=True - ) - - assert valid_event.type == "ConnectionError" - assert valid_event.message == "Connection failed" - assert valid_event.severity == ErrorSeverity.ERROR - assert valid_event.handled is True - - def test_error_event_severity_enum_values(self): - """Test ErrorEvent with different severity values.""" - event_time = datetime.now(timezone.utc) - - for severity in ErrorSeverity: - event = ErrorEvent( - type="TestError", - message="Test message", - severity=severity, - time=event_time - ) - assert event.severity == severity - - def test_error_event_serialization(self): - """Test ErrorEvent serialization.""" - event_time = datetime(2023, 12, 1, 12, 0, 0, tzinfo=timezone.utc) - event = ErrorEvent( - type="ValidationError", - message="Invalid input data", - severity=ErrorSeverity.WARNING, - time=event_time, - stack_trace="Stack trace here", - handled=True - ) - - try: - data = event.model_dump() - except AttributeError: - data = event.dict() - - assert data["type"] == "ValidationError" - assert data["message"] == "Invalid input data" - assert data["severity"] == "ERROR_SEVERITY_WARNING" - assert data["stack_trace"] == "Stack trace here" - assert data["handled"] is True - - def test_error_event_deserialization(self): - """Test ErrorEvent deserialization.""" - data = { - "type": "TimeoutError", - "message": "Request timed out", - "severity": "ERROR_SEVERITY_ERROR", - "time": "2023-12-01T12:00:00Z", - "stack_trace": "Traceback...", - "handled": False - } - - event = ErrorEvent(**data) - - assert event.type == "TimeoutError" - assert event.message == "Request timed out" - assert event.severity == ErrorSeverity.ERROR - assert event.stack_trace == "Traceback..." - assert event.handled is False - - def test_error_event_immutability(self): - """Test that ErrorEvent is immutable.""" - event_time = datetime.now(timezone.utc) - event = ErrorEvent( - type="TestError", - message="Test message", - severity=ErrorSeverity.ERROR, - time=event_time - ) - - # Should not be able to modify fields - with pytest.raises((pydantic.ValidationError, AttributeError, TypeError)): - event.type = "ModifiedError" - - def test_error_event_unicode_values(self): - """Test ErrorEvent with Unicode values.""" - event_time = datetime.now(timezone.utc) - event = ErrorEvent( - type="УникодОшибка", - message="ζ΅‹θ―•ι”™θ――ζΆˆζ― 🚨", - severity=ErrorSeverity.CRITICAL, - time=event_time, - stack_trace="Stack trace with тСст unicode" - ) - - assert event.type == "УникодОшибка" - assert event.message == "ζ΅‹θ―•ι”™θ――ζΆˆζ― 🚨" - assert "тСст" in event.stack_trace - - def test_error_event_large_stack_trace(self): - """Test ErrorEvent with large stack trace.""" - event_time = datetime.now(timezone.utc) - large_stack_trace = "Traceback (most recent call last):\n" + " Line of stack trace\n" * 1000 - - event = ErrorEvent( - type="LargeStackError", - message="Error with large stack trace", - severity=ErrorSeverity.ERROR, - time=event_time, - stack_trace=large_stack_trace - ) - - assert event.type == "LargeStackError" - assert len(event.stack_trace) > 10000 - assert event.stack_trace.startswith("Traceback") - - -class TestTelemetryModelIntegration: - """Test integration scenarios with telemetry models.""" - - def test_complete_telemetry_scenario(self): - """Test a complete telemetry scenario with all models.""" - # Create context - context = TelemetryContext( - package_name="python-sdk", - package_version="3.2.1", - language="python", - runtime_version="python 3.11.6", - os="darwin", - arch="arm64", - environment="production" - ) - - # Create telemetry event - event_time = datetime.now(timezone.utc) - telemetry_event = TelemetryEvent( - name="http.request.completed", - time=event_time, - attributes={"method": "POST", "endpoint": "/v1/listen", "status": "success"}, - metrics={"duration_ms": 245.5, "payload_size": 1024.0, "response_size": 2048.0} - ) - - # Create error event - error_event = ErrorEvent( - type="ConnectionError", - message="Network timeout during request", - severity=ErrorSeverity.WARNING, - time=event_time, - handled=True - ) - - # Verify all models are properly created - assert context.package_name == "python-sdk" - assert telemetry_event.name == "http.request.completed" - assert error_event.type == "ConnectionError" - assert error_event.severity == ErrorSeverity.WARNING - - def test_model_serialization_consistency(self): - """Test that all models serialize consistently.""" - event_time = datetime(2023, 12, 1, 12, 0, 0, tzinfo=timezone.utc) - - context = TelemetryContext(package_name="test-sdk", package_version="1.0.0") - telemetry_event = TelemetryEvent(name="test.event", time=event_time) - error_event = ErrorEvent( - type="TestError", - message="Test message", - severity=ErrorSeverity.INFO, - time=event_time - ) - - # All models should serialize without errors - try: - context_data = context.model_dump() - telemetry_data = telemetry_event.model_dump() - error_data = error_event.model_dump() - except AttributeError: - context_data = context.dict() - telemetry_data = telemetry_event.dict() - error_data = error_event.dict() - - # Verify basic structure - assert isinstance(context_data, dict) - assert isinstance(telemetry_data, dict) - assert isinstance(error_data, dict) - - assert "package_name" in context_data - assert "name" in telemetry_data - assert "type" in error_data - - def test_model_validation_edge_cases(self): - """Test model validation with edge cases.""" - event_time = datetime.now(timezone.utc) - - # Empty string values - context = TelemetryContext(package_name="", package_version="") - assert context.package_name == "" - assert context.package_version == "" - - # Empty attributes and metrics - telemetry_event = TelemetryEvent( - name="test.event", - time=event_time, - attributes={}, - metrics={} - ) - assert telemetry_event.attributes == {} - assert telemetry_event.metrics == {} - - # Empty stack trace - error_event = ErrorEvent( - type="TestError", - message="", - severity=ErrorSeverity.UNSPECIFIED, - time=event_time, - stack_trace="" - ) - assert error_event.message == "" - assert error_event.stack_trace == "" diff --git a/tests/unit/test_type_definitions.py b/tests/unit/test_type_definitions.py deleted file mode 100644 index cad86e95..00000000 --- a/tests/unit/test_type_definitions.py +++ /dev/null @@ -1,431 +0,0 @@ -""" -Unit tests for auto-generated type definitions. - -This module tests the various auto-generated type definitions including: -- Simple type aliases -- Union types -- Pydantic models -- Optional/Any types -""" - -import typing -import pytest -import pydantic -from unittest.mock import Mock - -# Import the types we want to test -from deepgram.types.error_response import ErrorResponse -from deepgram.types.error_response_text_error import ErrorResponseTextError -from deepgram.types.error_response_legacy_error import ErrorResponseLegacyError -from deepgram.types.error_response_modern_error import ErrorResponseModernError -from deepgram.types.listen_v1model import ListenV1Model -from deepgram.types.listen_v1callback import ListenV1Callback -from deepgram.types.listen_v1tag import ListenV1Tag -from deepgram.types.listen_v1response import ListenV1Response -from deepgram.types.listen_v1response_metadata import ListenV1ResponseMetadata -from deepgram.types.listen_v1response_results import ListenV1ResponseResults - - -class TestSimpleTypeAliases: - """Test simple type aliases like str, Optional[Any], etc.""" - - def test_error_response_text_error_is_str(self): - """Test that ErrorResponseTextError is a str type alias.""" - assert ErrorResponseTextError == str - - def test_error_response_text_error_usage(self): - """Test that ErrorResponseTextError can be used as a string.""" - error_message: ErrorResponseTextError = "Authentication failed" - assert isinstance(error_message, str) - assert error_message == "Authentication failed" - - def test_listen_v1callback_is_optional_any(self): - """Test that ListenV1Callback is Optional[Any].""" - assert ListenV1Callback == typing.Optional[typing.Any] - - def test_listen_v1callback_usage(self): - """Test that ListenV1Callback can accept None or any value.""" - callback1: ListenV1Callback = None - callback2: ListenV1Callback = "http://example.com/webhook" - callback3: ListenV1Callback = {"url": "http://example.com", "method": "POST"} - - assert callback1 is None - assert isinstance(callback2, str) - assert isinstance(callback3, dict) - - def test_listen_v1tag_is_optional_any(self): - """Test that ListenV1Tag is Optional[Any].""" - assert ListenV1Tag == typing.Optional[typing.Any] - - def test_listen_v1tag_usage(self): - """Test that ListenV1Tag can accept None or any value.""" - tag1: ListenV1Tag = None - tag2: ListenV1Tag = "my-tag" - tag3: ListenV1Tag = ["tag1", "tag2"] - - assert tag1 is None - assert isinstance(tag2, str) - assert isinstance(tag3, list) - - -class TestUnionTypes: - """Test union types like ErrorResponse and ListenV1Model.""" - - def test_error_response_union_structure(self): - """Test that ErrorResponse is a union of the three error types.""" - assert ErrorResponse == typing.Union[ErrorResponseTextError, ErrorResponseLegacyError, ErrorResponseModernError] - - def test_error_response_accepts_string(self): - """Test that ErrorResponse can accept a string (ErrorResponseTextError).""" - error: ErrorResponse = "Simple error message" - assert isinstance(error, str) - - def test_error_response_accepts_legacy_error(self): - """Test that ErrorResponse can accept ErrorResponseLegacyError.""" - legacy_error = ErrorResponseLegacyError( - err_code="AUTH_001", - err_msg="Invalid API key", - request_id="req_123" - ) - error: ErrorResponse = legacy_error - assert isinstance(error, ErrorResponseLegacyError) - - def test_error_response_accepts_modern_error(self): - """Test that ErrorResponse can accept ErrorResponseModernError.""" - modern_error = ErrorResponseModernError( - category="authentication", - message="Invalid API key provided", - details="The API key is missing or malformed", - request_id="req_456" - ) - error: ErrorResponse = modern_error - assert isinstance(error, ErrorResponseModernError) - - def test_listen_v1model_union_structure(self): - """Test that ListenV1Model is a union of literal strings and Any.""" - # Check that it's a union type - origin = typing.get_origin(ListenV1Model) - assert origin is typing.Union - - # Check that it includes typing.Any as one of the union members - args = typing.get_args(ListenV1Model) - assert typing.Any in args - - def test_listen_v1model_accepts_literal_values(self): - """Test that ListenV1Model accepts predefined literal values.""" - valid_models = [ - "nova-3", "nova-2", "nova", "enhanced", "base", - "meeting", "phonecall", "finance", "custom" - ] - - for model in valid_models: - model_value: ListenV1Model = model - assert isinstance(model_value, str) - - def test_listen_v1model_accepts_any_value(self): - """Test that ListenV1Model accepts any value due to typing.Any.""" - # String not in literals - custom_model: ListenV1Model = "my-custom-model" - assert isinstance(custom_model, str) - - # Non-string value - numeric_model: ListenV1Model = 123 - assert isinstance(numeric_model, int) - - # Complex value - dict_model: ListenV1Model = {"name": "custom", "version": "1.0"} - assert isinstance(dict_model, dict) - - -class TestPydanticModels: - """Test Pydantic models like ErrorResponseLegacyError, ErrorResponseModernError, etc.""" - - def test_error_response_legacy_error_creation(self): - """Test creating ErrorResponseLegacyError with all fields.""" - error = ErrorResponseLegacyError( - err_code="AUTH_001", - err_msg="Invalid API key", - request_id="req_123" - ) - - assert error.err_code == "AUTH_001" - assert error.err_msg == "Invalid API key" - assert error.request_id == "req_123" - - def test_error_response_legacy_error_optional_fields(self): - """Test creating ErrorResponseLegacyError with optional fields.""" - error = ErrorResponseLegacyError() - - assert error.err_code is None - assert error.err_msg is None - assert error.request_id is None - - def test_error_response_legacy_error_partial_fields(self): - """Test creating ErrorResponseLegacyError with some fields.""" - error = ErrorResponseLegacyError(err_code="ERR_001") - - assert error.err_code == "ERR_001" - assert error.err_msg is None - assert error.request_id is None - - def test_error_response_legacy_error_serialization(self): - """Test serialization of ErrorResponseLegacyError.""" - error = ErrorResponseLegacyError( - err_code="AUTH_001", - err_msg="Invalid API key", - request_id="req_123" - ) - - # Test serialization - use model_dump if available (Pydantic V2), otherwise dict - try: - serialized = error.model_dump() - except AttributeError: - serialized = error.dict() - - expected = { - "err_code": "AUTH_001", - "err_msg": "Invalid API key", - "request_id": "req_123" - } - assert serialized == expected - - def test_error_response_legacy_error_immutability(self): - """Test that ErrorResponseLegacyError is immutable (frozen).""" - error = ErrorResponseLegacyError(err_code="TEST") - - with pytest.raises((AttributeError, pydantic.ValidationError)): - error.err_code = "CHANGED" - - def test_error_response_modern_error_creation(self): - """Test creating ErrorResponseModernError with all fields.""" - error = ErrorResponseModernError( - category="authentication", - message="Invalid API key provided", - details="The API key is missing or malformed", - request_id="req_456" - ) - - assert error.category == "authentication" - assert error.message == "Invalid API key provided" - assert error.details == "The API key is missing or malformed" - assert error.request_id == "req_456" - - def test_error_response_modern_error_optional_fields(self): - """Test creating ErrorResponseModernError with optional fields.""" - error = ErrorResponseModernError() - - assert error.category is None - assert error.message is None - assert error.details is None - assert error.request_id is None - - def test_error_response_modern_error_serialization(self): - """Test serialization of ErrorResponseModernError.""" - error = ErrorResponseModernError( - category="validation", - message="Invalid input", - details="The request body contains invalid data" - ) - - # Test serialization - use model_dump if available (Pydantic V2), otherwise dict - try: - serialized = error.model_dump() - except AttributeError: - serialized = error.dict() - - expected = { - "category": "validation", - "message": "Invalid input", - "details": "The request body contains invalid data", - "request_id": None - } - assert serialized == expected - - def test_error_response_modern_error_immutability(self): - """Test that ErrorResponseModernError is immutable (frozen).""" - error = ErrorResponseModernError(category="test") - - with pytest.raises((AttributeError, pydantic.ValidationError)): - error.category = "changed" - - -class TestComplexPydanticModels: - """Test complex Pydantic models with nested structures.""" - - def test_listen_v1response_structure_validation(self): - """Test that ListenV1Response validates required fields.""" - # Test that missing required fields raise validation errors - with pytest.raises(pydantic.ValidationError) as exc_info: - ListenV1Response() - - error = exc_info.value - assert "metadata" in str(error) - assert "results" in str(error) - - def test_listen_v1response_type_annotations(self): - """Test that ListenV1Response has correct type annotations.""" - # Check that the model has the expected fields - fields = ListenV1Response.model_fields if hasattr(ListenV1Response, 'model_fields') else ListenV1Response.__fields__ - - assert "metadata" in fields - assert "results" in fields - - # Check that these are the only required fields - assert len(fields) == 2 - - -class TestTypeDefinitionEdgeCases: - """Test edge cases and error conditions for type definitions.""" - - def test_error_response_legacy_error_extra_fields_allowed(self): - """Test that ErrorResponseLegacyError allows extra fields.""" - # This should not raise an error due to extra="allow" - error = ErrorResponseLegacyError( - err_code="TEST", - extra_field="extra_value", - another_field=123 - ) - - assert error.err_code == "TEST" - # Extra fields should be accessible - assert hasattr(error, "extra_field") - assert hasattr(error, "another_field") - - def test_error_response_modern_error_extra_fields_allowed(self): - """Test that ErrorResponseModernError allows extra fields.""" - # This should not raise an error due to extra="allow" - error = ErrorResponseModernError( - category="test", - custom_field="custom_value", - numeric_field=456 - ) - - assert error.category == "test" - # Extra fields should be accessible - assert hasattr(error, "custom_field") - assert hasattr(error, "numeric_field") - - def test_listen_v1response_missing_required_fields(self): - """Test that ListenV1Response raises error for missing required fields.""" - with pytest.raises(pydantic.ValidationError): - ListenV1Response() - - with pytest.raises(pydantic.ValidationError): - ListenV1Response(metadata=Mock()) - - with pytest.raises(pydantic.ValidationError): - ListenV1Response(results=Mock()) - - def test_error_response_legacy_error_wrong_types(self): - """Test that ErrorResponseLegacyError validates field types.""" - # Since all fields are Optional[str], non-string values should be handled - # Pydantic might coerce or raise validation errors depending on the value - try: - error = ErrorResponseLegacyError(err_code=123) # int instead of str - # If it doesn't raise, check if it was coerced to string - assert isinstance(error.err_code, (str, int)) - except pydantic.ValidationError: - # This is also acceptable behavior - pass - - def test_error_response_modern_error_wrong_types(self): - """Test that ErrorResponseModernError validates field types.""" - # Since all fields are Optional[str], non-string values should be handled - try: - error = ErrorResponseModernError(category=456) # int instead of str - # If it doesn't raise, check if it was coerced to string - assert isinstance(error.category, (str, int)) - except pydantic.ValidationError: - # This is also acceptable behavior - pass - - -class TestTypeDefinitionIntegration: - """Test integration scenarios with type definitions.""" - - def test_error_response_union_type_checking(self): - """Test that different error types can be used interchangeably.""" - errors: list[ErrorResponse] = [ - "Simple string error", - ErrorResponseLegacyError(err_code="LEG_001", err_msg="Legacy error"), - ErrorResponseModernError(category="modern", message="Modern error") - ] - - assert len(errors) == 3 - assert isinstance(errors[0], str) - assert isinstance(errors[1], ErrorResponseLegacyError) - assert isinstance(errors[2], ErrorResponseModernError) - - def test_listen_v1model_in_function_signature(self): - """Test using ListenV1Model in function signatures.""" - def process_model(model: ListenV1Model) -> str: - return f"Processing model: {model}" - - # Test with literal values - result1 = process_model("nova-3") - assert result1 == "Processing model: nova-3" - - # Test with custom values (typing.Any allows this) - result2 = process_model("custom-model") - assert result2 == "Processing model: custom-model" - - # Test with non-string values - result3 = process_model(123) - assert result3 == "Processing model: 123" - - def test_type_definitions_serialization_consistency(self): - """Test that type definitions serialize consistently.""" - legacy_error = ErrorResponseLegacyError(err_code="TEST", err_msg="Test message") - modern_error = ErrorResponseModernError(category="test", message="Test message") - - # Both should be serializable - try: - legacy_dict = legacy_error.model_dump() - except AttributeError: - legacy_dict = legacy_error.dict() - - try: - modern_dict = modern_error.model_dump() - except AttributeError: - modern_dict = modern_error.dict() - - assert isinstance(legacy_dict, dict) - assert isinstance(modern_dict, dict) - assert "err_code" in legacy_dict - assert "category" in modern_dict - - def test_type_definitions_with_none_values(self): - """Test type definitions with None values.""" - # Test that optional fields can be explicitly set to None - legacy_error = ErrorResponseLegacyError( - err_code=None, - err_msg=None, - request_id=None - ) - - modern_error = ErrorResponseModernError( - category=None, - message=None, - details=None, - request_id=None - ) - - assert legacy_error.err_code is None - assert modern_error.category is None - - def test_type_definitions_with_unicode_values(self): - """Test type definitions with Unicode values.""" - legacy_error = ErrorResponseLegacyError( - err_code="ζ΅‹θ―•_001", - err_msg="Unicode error message: 🚨", - request_id="req_ζ΅‹θ―•_123" - ) - - modern_error = ErrorResponseModernError( - category="тСст", - message="Error with Γ©mojis: πŸ”₯", - details="DΓ©tails de l'erreur" - ) - - assert legacy_error.err_code == "ζ΅‹θ―•_001" - assert modern_error.message == "Error with Γ©mojis: πŸ”₯" diff --git a/websockets-reference.md b/websockets-reference.md deleted file mode 100644 index 87634eca..00000000 --- a/websockets-reference.md +++ /dev/null @@ -1,1199 +0,0 @@ -# WebSocket Reference - -## Listen V1 Connect - -
client.listen.v1.connect(...) -
-
- -#### πŸ“ Description - -
-
- -
-
- -Transcribe audio and video using Deepgram's speech-to-text WebSocket - -
-
-
-
- -#### πŸ”Œ Usage - -
-
- -
-
- -```python -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -client = DeepgramClient( - api_key="YOUR_API_KEY", -) - -with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - connection.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import ListenV1MediaMessage - connection.send_media(ListenV1MediaMessage(audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import ListenV1ControlMessage - connection.send_control(ListenV1ControlMessage(type="KeepAlive")) - -``` - -
-
-
-
- -#### πŸ”Œ Async Usage - -
-
- -
-
- -```python -import asyncio -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV1SocketClientResponse - -client = AsyncDeepgramClient( - api_key="YOUR_API_KEY", -) - -async def main(): - async with client.listen.v1.connect(model="nova-3") as connection: - def on_message(message: ListenV1SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - await connection.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import ListenV1MediaMessage - await connection.send_media(ListenV1MediaMessage(audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import ListenV1ControlMessage - await connection.send_control(ListenV1ControlMessage(type="KeepAlive")) - -asyncio.run(main()) - -``` - -
-
-
-
- -#### πŸ“€ Send Methods - -
-
- -
-
- -**`send_media(message)`** β€” Send binary audio data for transcription - -- `ListenV1MediaMessage(audio_bytes)` - -
-
- -
-
- -**`send_control(message)`** β€” Send control messages to manage the connection - -- `ListenV1ControlMessage(type="KeepAlive")` β€” Keep the connection alive -- `ListenV1ControlMessage(type="Finalize")` β€” Finalize the transcription - -
-
-
-
- -#### βš™οΈ Parameters - -
-
- -
-
- -**model:** `str` β€” AI model to use for the transcription - -
-
- -
-
- -**callback:** `typing.Optional[str]` β€” URL to which we'll make the callback request - -
-
- -
-
- -**callback_method:** `typing.Optional[str]` β€” HTTP method by which the callback request will be made - -
-
- -
-
- -**channels:** `typing.Optional[str]` β€” Number of independent audio channels contained in submitted audio - -
-
- -
-
- -**diarize:** `typing.Optional[str]` β€” Recognize speaker changes. Each word in the transcript will be assigned a speaker number starting at 0 - -
-
- -
-
- -**dictation:** `typing.Optional[str]` β€” Dictation mode for controlling formatting with dictated speech - -
-
- -
-
- -**encoding:** `typing.Optional[str]` β€” Specify the expected encoding of your submitted audio - -
-
- -
-
- -**endpointing:** `typing.Optional[str]` β€” Control when speech recognition ends - -
-
- -
-
- -**extra:** `typing.Optional[str]` β€” Arbitrary key-value pairs that are attached to the API response - -
-
- -
-
- -**filler_words:** `typing.Optional[str]` β€” Include filler words like "uh" and "um" in transcripts - -
-
- -
-
- -**interim_results:** `typing.Optional[str]` β€” Return partial transcripts as audio is being processed - -
-
- -
-
- -**keyterm:** `typing.Optional[str]` β€” Key term prompting can boost or suppress specialized terminology and brands - -
-
- -
-
- -**keywords:** `typing.Optional[str]` β€” Keywords can boost or suppress specialized terminology and brands - -
-
- -
-
- -**language:** `typing.Optional[str]` β€” BCP-47 language tag that hints at the primary spoken language - -
-
- -
-
- -**mip_opt_out:** `typing.Optional[str]` β€” Opts out requests from the Deepgram Model Improvement Program - -
-
- -
-
- -**multichannel:** `typing.Optional[str]` β€” Transcribe each audio channel independently - -
-
- -
-
- -**numerals:** `typing.Optional[str]` β€” Convert numbers from written format to numerical format - -
-
- -
-
- -**profanity_filter:** `typing.Optional[str]` β€” Remove profanity from transcripts - -
-
- -
-
- -**punctuate:** `typing.Optional[str]` β€” Add punctuation and capitalization to the transcript - -
-
- -
-
- -**redact:** `typing.Optional[str]` β€” Redaction removes sensitive information from your transcripts - -
-
- -
-
- -**replace:** `typing.Optional[str]` β€” Search for terms or phrases in submitted audio and replaces them - -
-
- -
-
- -**sample_rate:** `typing.Optional[str]` β€” Sample rate of the submitted audio - -
-
- -
-
- -**search:** `typing.Optional[str]` β€” Search for terms or phrases in submitted audio - -
-
- -
-
- -**smart_format:** `typing.Optional[str]` β€” Apply formatting to transcript output for improved readability - -
-
- -
-
- -**tag:** `typing.Optional[str]` β€” Label your requests for the purpose of identification during usage reporting - -
-
- -
-
- -**utterance_end_ms:** `typing.Optional[str]` β€” Length of time in milliseconds of silence to wait for before finalizing speech - -
-
- -
-
- -**vad_events:** `typing.Optional[str]` β€” Return Voice Activity Detection events via the websocket - -
-
- -
-
- -**version:** `typing.Optional[str]` β€” Version of the model to use - -
-
- -
-
- -**authorization:** `typing.Optional[str]` β€” Use your API key for authentication, or alternatively generate a temporary token and pass it via the token query parameter. - -**Example:** `token %DEEPGRAM_API_KEY%` or `bearer %DEEPGRAM_TOKEN%` - -
-
- -
-
- -**request_options:** `typing.Optional[RequestOptions]` β€” Request-specific configuration. - -
-
-
-
- -
-
-
- -## Listen V2 Connect - -
client.listen.v2.connect(...) -
-
- -#### πŸ“ Description - -
-
- -
-
- -Real-time conversational speech recognition with contextual turn detection for natural voice conversations - -
-
-
-
- -#### πŸ”Œ Usage - -
-
- -
-
- -```python -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -client = DeepgramClient( - api_key="YOUR_API_KEY", -) - -with client.listen.v2.connect( - model="flux-general-en", - encoding="linear16", - sample_rate="16000" -) as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - connection.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import ListenV2MediaMessage - connection.send_media(ListenV2MediaMessage(data=audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import ListenV2ControlMessage - connection.send_control(ListenV2ControlMessage(type="CloseStream")) - -``` - -
-
-
-
- -#### πŸ”Œ Async Usage - -
-
- -
-
- -```python -import asyncio -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ListenV2SocketClientResponse - -client = AsyncDeepgramClient( - api_key="YOUR_API_KEY", -) - -async def main(): - async with client.listen.v2.connect( - model="flux-general-en", - encoding="linear16", - sample_rate="16000" - ) as connection: - def on_message(message: ListenV2SocketClientResponse) -> None: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - await connection.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import ListenV2MediaMessage - await connection.send_media(ListenV2MediaMessage(data=audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import ListenV2ControlMessage - await connection.send_control(ListenV2ControlMessage(type="CloseStream")) - -asyncio.run(main()) - -``` - -
-
-
-
- -#### πŸ“€ Send Methods - -
-
- -
-
- -**`send_media(message)`** β€” Send binary audio data for transcription - -- `ListenV2MediaMessage(data=audio_bytes)` - -
-
- -
-
- -**`send_control(message)`** β€” Send control messages to manage the connection - -- `ListenV2ControlMessage(type="CloseStream")` β€” Close the audio stream - -
-
-
-
- -#### βš™οΈ Parameters - -
-
- -
-
- -**model:** `str` β€” AI model used to process submitted audio - -
-
- -
-
- -**encoding:** `str` β€” Specify the expected encoding of your submitted audio - -
-
- -
-
- -**sample_rate:** `str` β€” Sample rate of the submitted audio - -
-
- -
-
- -**eager_eot_threshold:** `typing.Optional[str]` β€” Threshold for eager end-of-turn detection - -
-
- -
-
- -**eot_threshold:** `typing.Optional[str]` β€” Threshold for end-of-turn detection - -
-
- -
-
- -**eot_timeout_ms:** `typing.Optional[str]` β€” Timeout in milliseconds for end-of-turn detection - -
-
- -
-
- -**keyterm:** `typing.Optional[str]` β€” Key term prompting can boost or suppress specialized terminology and brands - -
-
- -
-
- -**mip_opt_out:** `typing.Optional[str]` β€” Opts out requests from the Deepgram Model Improvement Program - -
-
- -
-
- -**tag:** `typing.Optional[str]` β€” Label your requests for the purpose of identification during usage reporting - -
-
- -
-
- -**authorization:** `typing.Optional[str]` β€” Use your API key for authentication, or alternatively generate a temporary token and pass it via the token query parameter. - -**Example:** `token %DEEPGRAM_API_KEY%` or `bearer %DEEPGRAM_TOKEN%` - -
-
- -
-
- -**request_options:** `typing.Optional[RequestOptions]` β€” Request-specific configuration. - -
-
-
-
- -
-
-
- -## Speak V1 Connect - -
client.speak.v1.connect(...) -
-
- -#### πŸ“ Description - -
-
- -
-
- -Convert text into natural-sounding speech using Deepgram's TTS WebSocket - -
-
-
-
- -#### πŸ”Œ Usage - -
-
- -
-
- -```python -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -client = DeepgramClient( - api_key="YOUR_API_KEY", -) - -with client.speak.v1.connect( - model="aura-2-asteria-en", - encoding="linear16", - sample_rate=24000 -) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - connection.start_listening() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1TextMessage - connection.send_text(SpeakV1TextMessage(text="Hello, world!")) - - # Send control messages - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - connection.send_control(SpeakV1ControlMessage(type="Flush")) - connection.send_control(SpeakV1ControlMessage(type="Close")) - -``` - -
-
-
-
- -#### πŸ”Œ Async Usage - -
-
- -
-
- -```python -import asyncio -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import SpeakV1SocketClientResponse - -client = AsyncDeepgramClient( - api_key="YOUR_API_KEY", -) - -async def main(): - async with client.speak.v1.connect( - model="aura-2-asteria-en", - encoding="linear16", - sample_rate=24000 - ) as connection: - def on_message(message: SpeakV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - connection.on(EventType.OPEN, lambda _: print("Connection opened")) - connection.on(EventType.MESSAGE, on_message) - connection.on(EventType.CLOSE, lambda _: print("Connection closed")) - connection.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - await connection.start_listening() - - # Send text to be converted to speech - from deepgram.extensions.types.sockets import SpeakV1TextMessage - await connection.send_text(SpeakV1TextMessage(text="Hello, world!")) - - # Send control messages - from deepgram.extensions.types.sockets import SpeakV1ControlMessage - await connection.send_control(SpeakV1ControlMessage(type="Flush")) - await connection.send_control(SpeakV1ControlMessage(type="Close")) - -asyncio.run(main()) - -``` - -
-
-
-
- -#### πŸ“€ Send Methods - -
-
- -
-
- -**`send_text(message)`** β€” Send text to be converted to speech - -- `SpeakV1TextMessage(text="Hello, world!")` - -
-
- -
-
- -**`send_control(message)`** β€” Send control messages to manage speech synthesis - -- `SpeakV1ControlMessage(type="Flush")` β€” Process all queued text immediately -- `SpeakV1ControlMessage(type="Clear")` β€” Clear the text queue -- `SpeakV1ControlMessage(type="Close")` β€” Close the connection - -
-
-
-
- -#### βš™οΈ Parameters - -
-
- -
-
- -**encoding:** `typing.Optional[str]` β€” Specify the expected encoding of your output audio - -
-
- -
-
- -**mip_opt_out:** `typing.Optional[str]` β€” Opts out requests from the Deepgram Model Improvement Program - -
-
- -
-
- -**model:** `typing.Optional[str]` β€” AI model used to process submitted text - -
-
- -
-
- -**sample_rate:** `typing.Optional[str]` β€” Sample rate for the output audio - -
-
- -
-
- -**authorization:** `typing.Optional[str]` β€” Use your API key for authentication, or alternatively generate a temporary token and pass it via the token query parameter. - -**Example:** `token %DEEPGRAM_API_KEY%` or `bearer %DEEPGRAM_TOKEN%` - -
-
- -
-
- -**request_options:** `typing.Optional[RequestOptions]` β€” Request-specific configuration. - -
-
-
-
- -
-
-
- -## Agent V1 Connect - -
client.agent.v1.connect(...) -
-
- -#### πŸ“ Description - -
-
- -
-
- -Build a conversational voice agent using Deepgram's Voice Agent WebSocket - -
-
-
-
- -#### πŸ”Œ Usage - -
-
- -
-
- -```python -from deepgram import DeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SocketClientResponse, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -client = DeepgramClient( - api_key="YOUR_API_KEY", -) - -with client.agent.v1.connect() as agent: - # Configure the agent - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=44100, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ), - prompt='Reply only and explicitly with "OK".', - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - agent.send_settings(settings) - - def on_message(message: AgentV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - agent.on(EventType.OPEN, lambda _: print("Connection opened")) - agent.on(EventType.MESSAGE, on_message) - agent.on(EventType.CLOSE, lambda _: print("Connection closed")) - agent.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - agent.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import AgentV1MediaMessage - agent.send_media(AgentV1MediaMessage(data=audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import AgentV1ControlMessage - agent.send_control(AgentV1ControlMessage(type="KeepAlive")) - -``` - -
-
-
-
- -#### πŸ”Œ Async Usage - -
-
- -
-
- -```python -import asyncio -from deepgram import AsyncDeepgramClient -from deepgram.core.events import EventType -from deepgram.extensions.types.sockets import ( - AgentV1Agent, - AgentV1AudioConfig, - AgentV1AudioInput, - AgentV1DeepgramSpeakProvider, - AgentV1Listen, - AgentV1ListenProvider, - AgentV1OpenAiThinkProvider, - AgentV1SettingsMessage, - AgentV1SocketClientResponse, - AgentV1SpeakProviderConfig, - AgentV1Think, -) - -client = AsyncDeepgramClient( - api_key="YOUR_API_KEY", -) - -async def main(): - async with client.agent.v1.connect() as agent: - # Configure the agent - settings = AgentV1SettingsMessage( - audio=AgentV1AudioConfig( - input=AgentV1AudioInput( - encoding="linear16", - sample_rate=16000, - ) - ), - agent=AgentV1Agent( - listen=AgentV1Listen( - provider=AgentV1ListenProvider( - type="deepgram", - model="nova-3", - smart_format=True, - ) - ), - think=AgentV1Think( - provider=AgentV1OpenAiThinkProvider( - type="open_ai", - model="gpt-4o-mini", - temperature=0.7, - ) - ), - speak=AgentV1SpeakProviderConfig( - provider=AgentV1DeepgramSpeakProvider( - type="deepgram", - model="aura-2-asteria-en", - ) - ), - ), - ) - - await agent.send_settings(settings) - - def on_message(message: AgentV1SocketClientResponse) -> None: - if isinstance(message, bytes): - print("Received audio event") - else: - msg_type = getattr(message, "type", "Unknown") - print(f"Received {msg_type} event") - - agent.on(EventType.OPEN, lambda _: print("Connection opened")) - agent.on(EventType.MESSAGE, on_message) - agent.on(EventType.CLOSE, lambda _: print("Connection closed")) - agent.on(EventType.ERROR, lambda error: print(f"Caught: {error}")) - - # Start listening - await agent.start_listening() - - # Send audio data - from deepgram.extensions.types.sockets import AgentV1MediaMessage - await agent.send_media(AgentV1MediaMessage(data=audio_bytes)) - - # Send control messages - from deepgram.extensions.types.sockets import AgentV1ControlMessage - await agent.send_control(AgentV1ControlMessage(type="KeepAlive")) - -asyncio.run(main()) - -``` - -
-
-
-
- -#### βš™οΈ Parameters - -
-
- -
-
- -**authorization:** `typing.Optional[str]` β€” Use your API key for authentication, or alternatively generate a temporary token and pass it via the token query parameter. - -**Example:** `token %DEEPGRAM_API_KEY%` or `bearer %DEEPGRAM_TOKEN%` - -
-
- -
-
- -**request_options:** `typing.Optional[RequestOptions]` β€” Request-specific configuration. - -
-
-
-
- -#### πŸ“€ Send Methods - -
-
- -
-
- -**`send_settings(message)`** β€” Send initial agent configuration settings - -- `AgentV1SettingsMessage(...)` β€” Configure audio, listen, think, and speak providers - -
-
- -
-
- -**`send_media(message)`** β€” Send binary audio data to the agent - -- `AgentV1MediaMessage(data=audio_bytes)` - -
-
- -
-
- -**`send_control(message)`** β€” Send control messages (keep_alive, etc.) - -- `AgentV1ControlMessage(type="KeepAlive")` - -
-
- -
-
- -**`send_update_speak(message)`** β€” Update the agent's speech synthesis settings - -- `AgentV1UpdateSpeakMessage(...)` β€” Modify TTS configuration during conversation - -
-
- -
-
- -**`send_update_prompt(message)`** β€” Update the agent's system prompt - -- `AgentV1UpdatePromptMessage(...)` β€” Change the agent's behavior instructions - -
-
- -
-
- -**`send_inject_user_message(message)`** β€” Inject a user message into the conversation - -- `AgentV1InjectUserMessageMessage(...)` β€” Add a simulated user input - -
-
- -
-
- -**`send_inject_agent_message(message)`** β€” Inject an agent message into the conversation - -- `AgentV1InjectAgentMessageMessage(...)` β€” Add a simulated agent response - -
-
- -
-
- -**`send_function_call_response(message)`** β€” Send the result of a function call back to the agent - -- `AgentV1FunctionCallResponseMessage(...)` β€” Provide function execution results - -
-
-
-
- -
-
-

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