From 2644e60bb6ea4d4e66344af3532f1d1a6a7f0caa Mon Sep 17 00:00:00 2001 From: Leonardo Date: Thu, 23 Apr 2026 07:05:24 -0300 Subject: [PATCH] =?UTF-8?q?CRM=20WhatsApp=20Grupo=203=20completo=20+=20Mar?= =?UTF-8?q?co=20A/B=20(Asaas)=20+=20admin=20SaaS=20+=20refactors=20polim?= =?UTF-8?q?=C3=B3rficos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sessão 11+: fechamento do CRM de WhatsApp com dois providers (Evolution/Twilio), sistema de créditos com Asaas/PIX, polimorfismo de telefones/emails, e integração admin SaaS no /saas/addons existente. ═══════════════════════════════════════════════════════════════════════════ GRUPO 3 — WORKFLOW / CRM (completo) ═══════════════════════════════════════════════════════════════════════════ 3.1 Tags · migration conversation_tags + seed de 5 system tags · composable useConversationTags.js · popover + pills no drawer e nos cards do Kanban. 3.2 Atribuição de conversa a terapeuta · migration 20260421000012 com PK (tenant_id, thread_key), UPSERT, RLS que valida assignee como membro ativo do mesmo tenant · view conversation_threads expandida com assigned_to + assigned_at · composable useConversationAssignment.js · drawer com Select filtrável + botão "Assumir" · inbox com filtro aside (Todas/Minhas/Não atribuídas) e chip do responsável em cada card (destaca "Eu" em azul). 3.3 Notas internas · migration conversation_notes · composable + seção colapsável no drawer · apenas o criador pode editar/apagar (RLS). 3.5 Converter desconhecido em paciente · botão + dialog quick-cadastro · "Vincular existente" com Select filter de até 500 pacientes · cria telefone WhatsApp (vinculado) via upsertWhatsappForExisting. 3.6 Histórico de conversa no prontuário · nova aba "Conversas" em PatientProntuario.vue · PatientConversationsTab.vue com stats (total / recebidas / enviadas / primeira / última), SelectButton de filtro, timeline com bolhas por direção, mídia inline (imagem/áudio/vídeo/doc via signed URL), indicadores ✓ ✓✓ de delivery, botão "Abrir no CRM". ═══════════════════════════════════════════════════════════════════════════ MARCO A — UNIFICAÇÃO WHATSAPP (dois providers mutuamente exclusivos) ═══════════════════════════════════════════════════════════════════════════ - Página chooser ConfiguracoesWhatsappChooserPage.vue com 2 cards (Pessoal/ Oficial), deactivate via edge function deactivate-notification-channel - send-whatsapp-message refatorada com roteamento por provider; Twilio deduz 1 crédito antes do envio e refunda em falha - Paridade Twilio (novo): módulo compartilhado supabase/functions/_shared/ whatsapp-hooks.ts com lógica provider-agnóstica (opt-in, opt-out, auto- reply, schedule helpers em TZ São Paulo, makeTwilioCreditedSendFn que envolve envio em dedução atômica + rollback). Consumido por Evolution E Twilio inbound. Evolution refatorado (~290 linhas duplicadas removidas). - Bucket privado whatsapp-media · decrypt via Evolution getBase64From MediaMessage · upload com path tenant/yyyy/mm · signed URLs on-demand ═══════════════════════════════════════════════════════════════════════════ MARCO B — SISTEMA DE CRÉDITOS WHATSAPP + ASAAS ═══════════════════════════════════════════════════════════════════════════ Banco: - Migration 20260421000007_whatsapp_credits (4 tabelas: balance, transactions, packages, purchases) + RPCs add_whatsapp_credits e deduct_whatsapp_credits (atômicas com SELECT FOR UPDATE) - Migration 20260421000013_tenant_cpf_cnpj (coluna em tenants com CHECK de 11 ou 14 dígitos) Edge functions: - create-whatsapp-credit-charge · Asaas v3 (sandbox + prod) · PIX com QR code · getOrCreateAsaasCustomer patcha customer existente com CPF quando está faltando - asaas-webhook · recebe PAYMENT_RECEIVED/CONFIRMED e credita balance Frontend (tenant): - Página /configuracoes/creditos-whatsapp com saldo + loja + histórico - Dialog de confirmação com CPF/CNPJ (validação via isValidCPF/CNPJ de utils/validators, formatação on-blur, pré-fill de tenants.cpf_cnpj, persiste no primeiro uso) · fallback sandbox 24971563792 REMOVIDO - Composable useWhatsappCredits extrai erros amigáveis via error.context.json() Frontend (SaaS admin): - Em /saas/addons (reuso do pattern existente, não criou página paralela): - Aba 4 "Pacotes WhatsApp" — CRUD whatsapp_credit_packages com DataTable, toggle is_active inline, dialog de edição com validação - Aba 5 "Topup WhatsApp" — tenant Select com saldo ao vivo · RPC add_whatsapp_credits com p_admin_id = auth.uid() (auditoria) · histórico das últimas 20 transações topup/adjustment/refund ═══════════════════════════════════════════════════════════════════════════ GRUPO 2 — AUTOMAÇÃO ═══════════════════════════════════════════════════════════════════════════ 2.3 Auto-reply · conversation_autoreply_settings + conversation_autoreply_ log · 3 modos de schedule (agenda das regras semanais, business_hours custom, custom_window) · cooldown por thread · respeita opt-out · agora funciona em Evolution E Twilio (hooks compartilhados) 2.4 Lembretes de sessão · conversation_session_reminders_settings + _logs · edge send-session-reminders (cron) · janelas 24h e 2h antes · Twilio deduz crédito com rollback em falha ═══════════════════════════════════════════════════════════════════════════ GRUPO 5 — COMPLIANCE (LGPD Art. 18 §2) ═══════════════════════════════════════════════════════════════════════════ 5.2 Opt-out · conversation_optouts + conversation_optout_keywords (10 system seed + custom por tenant) · detecção por regex word-boundary e normalização (lowercase + strip acentos + pontuação) · ack automático (deduz crédito em Twilio) · opt-in via "voltar", "retornar", "reativar", "restart" · página /configuracoes/conversas-optouts com CRUD de keywords ═══════════════════════════════════════════════════════════════════════════ REFACTOR POLIMÓRFICO — TELEFONES + EMAILS ═══════════════════════════════════════════════════════════════════════════ - contact_types + contact_phones (entity_type + entity_id) — migration 20260421000008 · contact_email_types + contact_emails — 20260421000011 - Componentes ContactPhonesEditor.vue e ContactEmailsEditor.vue (add/edit/ remove com confirm, primary selector, WhatsApp linked badge) - Composables useContactPhones.js + useContactEmails.js com unsetOtherPrimaries() e validação - Trocado em PatientsCadastroPage.vue e MedicosPage.vue (removidos campos legados telefone/telefone_alternativo e email_principal/email_alternativo) - Migration retroativa v2 (20260421000010) detecta conversation_messages e cria/atualiza phone como WhatsApp vinculado ═══════════════════════════════════════════════════════════════════════════ POLIMENTO VISUAL + INFRA ═══════════════════════════════════════════════════════════════════════════ - Skeletons simplificados no dashboard do terapeuta - Animações fade-up com stagger via [--delay:Xms] (fix specificity sobre .dash-card box-shadow transition) - ConfirmDialog com group="conversation-drawer" (evita montagem duplicada) - Image preview PrimeVue com botão de download injetado via MutationObserver (fetch + blob para funcionar cross-origin) - Áudio/vídeo com preload="metadata" e controles de velocidade do browser - friendlySendError() mapeia códigos do edge pra mensagens pt-BR via error.context.json() - Teleport #cfg-page-actions para ações globais de Configurações - Brotli/Gzip + auto-import Vue/PrimeVue + bundle analyzer - AppLayout consolidado (removidas duplicatas por área) + RouterPassthrough - Removido console.trace debug que estava em watch de router e queries Supabase (degradava perf pra todos) - Realtime em conversation_messages via publication supabase_realtime - Notifier global flutuante com beep + toggle mute (4 camadas: badge + sino + popup + browser notification) ═══════════════════════════════════════════════════════════════════════════ MIGRATIONS NOVAS (13) ═══════════════════════════════════════════════════════════════════════════ 20260420000001_patient_intake_invite_info_rpc 20260420000002_audit_logs_lgpd 20260420000003_audit_logs_unified_view 20260420000004_lgpd_export_patient_rpc 20260420000005_conversation_messages 20260420000005_search_global_rpc 20260420000006_conv_messages_notifications 20260420000007_notif_channels_saas_admin_insert 20260420000008_conv_messages_realtime 20260420000009_conv_messages_delivery_status 20260421000001_whatsapp_media_bucket 20260421000002_conversation_notes 20260421000003_conversation_tags 20260421000004_conversation_autoreply 20260421000005_conversation_optouts 20260421000006_session_reminders 20260421000007_whatsapp_credits 20260421000008_contact_phones 20260421000009_retroactive_whatsapp_link 20260421000010_retroactive_whatsapp_link_v2 20260421000011_contact_emails 20260421000012_conversation_assignments 20260421000013_tenant_cpf_cnpj ═══════════════════════════════════════════════════════════════════════════ EDGE FUNCTIONS NOVAS / MODIFICADAS ═══════════════════════════════════════════════════════════════════════════ Novas: - _shared/whatsapp-hooks.ts (módulo compartilhado) - asaas-webhook - create-whatsapp-credit-charge - deactivate-notification-channel - evolution-webhook-provision - evolution-whatsapp-inbound - get-intake-invite-info - notification-webhook - send-session-reminders - send-whatsapp-message - submit-patient-intake - twilio-whatsapp-inbound ═══════════════════════════════════════════════════════════════════════════ FRONTEND — RESUMO ═══════════════════════════════════════════════════════════════════════════ Composables novos: useAddonExtrato, useAuditoria, useAutoReplySettings, useClinicKPIs, useContactEmails, useContactPhones, useConversationAssignment, useConversationNotes, useConversationOptouts, useConversationTags, useConversations, useLgpdExport, useSessionReminders, useWhatsappCredits Stores: conversationDrawerStore Componentes novos: ConversationDrawer, GlobalInboundNotifier, GlobalSearch, ContactEmailsEditor, ContactPhonesEditor Páginas novas: CRMConversasPage, PatientConversationsTab, AddonsExtratoPage, AuditoriaPage, NotificationsHistoryPage, ConfiguracoesWhatsappChooserPage, ConfiguracoesConversasAutoreplyPage, ConfiguracoesConversasOptoutsPage, ConfiguracoesConversasTagsPage, ConfiguracoesCreditosWhatsappPage, ConfiguracoesLembretesSessaoPage Utils novos: addonExtratoExport, auditoriaExport, excelExport, lgpdExportFormats Páginas existentes alteradas: ClinicDashboard, PatientsCadastroPage, PatientCadastroDialog, PatientsListPage, MedicosPage, PatientProntuario, ConfiguracoesWhatsappPage, SaasWhatsappPage, ConfiguracoesRecursosExtrasPage, ConfiguracoesPage, AgendaTerapeutaPage, AgendaClinicaPage, NotificationItem, NotificationDrawer, AppLayout, AppTopbar, useMenuBadges, patientsRepository, SaasAddonsPage (aba 4 + 5 WhatsApp) Routes: routes.clinic, routes.configs, routes.therapist atualizados Menus: clinic.menu, therapist.menu, saas.menu atualizados ═══════════════════════════════════════════════════════════════════════════ NOTAS - Após subir, rodar supabase functions serve --no-verify-jwt --env-file supabase/functions/.env pra carregar o módulo _shared - WHATSAPP_SETUP.md reescrito (~400 linhas) com setup completo dos 3 providers + troubleshooting + LGPD - HANDOFF.md atualizado com estado atual e próximos passos Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 13 +- Atestado_Psicológico_1774873197838.pdf | Bin 79162 -> 0 bytes Atestado_Psicológico_1774873520538.pdf | Bin 79162 -> 0 bytes HANDOFF.md | 208 +- WHATSAPP_SETUP.md | 518 ++ database-novo/agenciapsi-db-dashboard.html | 22 +- database-novo/db.config.json | 50 +- .../fix_template_keys_rename_en_to_pt.sql | 163 + ...0000001_patient_intake_invite_info_rpc.sql | 107 + .../20260420000002_audit_logs_lgpd.sql | 199 + ...20260420000003_audit_logs_unified_view.sql | 148 + ...20260420000004_lgpd_export_patient_rpc.sql | 225 + .../20260420000005_conversation_messages.sql | 263 + .../20260420000005_search_global_rpc.sql | 275 + ...0420000006_conv_messages_notifications.sql | 117 + ...00007_notif_channels_saas_admin_insert.sql | 26 + .../20260420000008_conv_messages_realtime.sql | 12 + ...20000009_conv_messages_delivery_status.sql | 17 + .../20260421000001_whatsapp_media_bucket.sql | 91 + .../20260421000002_conversation_notes.sql | 116 + .../20260421000003_conversation_tags.sql | 226 + .../20260421000004_conversation_autoreply.sql | 143 + .../20260421000005_conversation_optouts.sql | 226 + .../20260421000006_session_reminders.sql | 152 + .../20260421000007_whatsapp_credits.sql | 342 + .../20260421000008_contact_phones.sql | 356 + ...260421000009_retroactive_whatsapp_link.sql | 64 + ...421000010_retroactive_whatsapp_link_v2.sql | 95 + .../20260421000011_contact_emails.sql | 266 + ...0260421000012_conversation_assignments.sql | 203 + .../20260421000013_tenant_cpf_cnpj.sql | 31 + database-novo/schema/00_full/schema.sql | 7859 +++++++++++++++-- .../schema/01_extensions/extensions.sql | 2 +- database-novo/schema/03_functions/_all.sql | 2078 ++++- database-novo/schema/03_functions/auth.sql | 2 +- .../schema/03_functions/extensions.sql | 2 +- .../schema/03_functions/pgbouncer.sql | 2 +- database-novo/schema/03_functions/public.sql | 2078 ++++- .../schema/03_functions/realtime.sql | 2 +- database-novo/schema/03_functions/storage.sql | 2 +- .../03_functions/supabase_functions.sql | 2 +- .../schema/04_tables/addons_cr_ditos.sql | 76 +- .../schema/04_tables/agenda_agendamento.sql | 2 +- .../04_tables/central_saas_docs_faq.sql | 2 +- .../04_tables/comunica_o_notifica_es.sql | 62 +- .../04_tables/crm_conversas_whatsapp.sql | 155 + database-novo/schema/04_tables/documentos.sql | 3 +- .../schema/04_tables/estrutura_calend_rio.sql | 2 +- database-novo/schema/04_tables/financeiro.sql | 5 +- database-novo/schema/04_tables/outros.sql | 260 +- database-novo/schema/04_tables/pacientes.sql | 248 +- .../schema/04_tables/saas_planos.sql | 5 +- .../04_tables/seguran_a_rate_limiting.sql | 15 + .../schema/04_tables/servi_os_prontu_rios.sql | 2 +- .../schema/04_tables/tenants_multi_tenant.sql | 2 +- database-novo/schema/05_views/views.sql | 140 +- database-novo/schema/06_indexes/indexes.sql | 186 +- .../schema/07_foreign_keys/constraints.sql | 238 +- database-novo/schema/08_triggers/triggers.sql | 66 +- database-novo/schema/09_policies/policies.sql | 549 +- index.html | 3 +- package-lock.json | 1505 +++- package.json | 1 + src/assets/styles.scss | 49 + src/components/ComponentCadastroRapido.vue | 10 +- .../agenda/AgendaSlotsPorDiaCard.vue | 4 +- .../conversations/ConversationDrawer.vue | 1177 +++ .../conversations/GlobalInboundNotifier.vue | 372 + .../notifications/NotificationDrawer.vue | 49 +- .../notifications/NotificationItem.vue | 32 +- src/components/search/GlobalSearch.vue | 677 ++ src/components/search/pagesIndex.js | 115 + src/components/ui/ContactEmailsEditor.vue | 248 + src/components/ui/ContactPhonesEditor.vue | 342 + src/components/ui/PatientCadastroDialog.vue | 26 + src/composables/useAddonExtrato.js | 209 + src/composables/useAuditoria.js | 206 + src/composables/useAutoReplySettings.js | 127 + src/composables/useClinicKPIs.js | 239 + src/composables/useContactEmails.js | 185 + src/composables/useContactPhones.js | 199 + src/composables/useConversationAssignment.js | 154 + src/composables/useConversationNotes.js | 178 + src/composables/useConversationOptouts.js | 203 + src/composables/useConversationTags.js | 260 + src/composables/useConversations.js | 268 + src/composables/useLgpdExport.js | 108 + src/composables/useMenuBadges.js | 44 +- src/composables/useSessionReminders.js | 123 + src/composables/useWhatsappCredits.js | 144 + .../components/ProximosFeriadosCard.vue | 3 +- .../agenda/pages/AgendaClinicaPage.vue | 10 +- .../agenda/pages/AgendaRecorrenciasPage.vue | 158 +- .../agenda/pages/AgendaTerapeutaPage.vue | 65 +- .../pages/AgendamentosRecebidosPage.vue | 4 +- .../agenda/pages/CompromissosDeterminados.vue | 22 +- .../conversations/CRMConversasPage.vue | 531 ++ .../documents/DocumentTemplatesPage.vue | 192 +- src/features/documents/DocumentsListPage.vue | 398 +- .../components/DocumentTemplateEditor.vue | 198 +- .../pages/FinanceiroDashboardPage.vue | 5 +- src/features/patients/PatientsListPage.vue | 57 +- .../cadastro/PatientsCadastroPage.vue | 140 +- .../cadastro/PatientsExternalLinkPage.vue | 2 +- .../recebidos/CadastrosRecebidosPage.vue | 14 +- .../patients/grupos/GruposPacientesPage.vue | 8 +- src/features/patients/medicos/MedicosPage.vue | 57 +- .../prontuario/PatientConversationsTab.vue | 221 + .../patients/prontuario/PatientProntuario.vue | 8 + .../patients/services/patientsRepository.js | 9 +- src/features/patients/tags/TagsPage.vue | 8 +- src/layout/AppLayout.vue | 4 + src/layout/AppMenu.vue | 14 +- src/layout/AppTopbar.vue | 29 + src/layout/ConfiguracoesPage.vue | 461 +- .../configuracoes/AddonsExtratoPage.vue | 345 + src/layout/configuracoes/AuditoriaPage.vue | 434 + .../ConfiguracoesAgendadorPage.vue | 14 +- .../ConfiguracoesConversasAutoreplyPage.vue | 400 + .../ConfiguracoesConversasOptoutsPage.vue | 374 + .../ConfiguracoesConversasTagsPage.vue | 391 + .../ConfiguracoesCreditosWhatsappPage.vue | 425 + .../ConfiguracoesLembretesSessaoPage.vue | 348 + .../ConfiguracoesRecursosExtrasPage.vue | 11 +- .../ConfiguracoesTwilioWhatsappPage.vue | 16 +- .../ConfiguracoesWhatsappChooserPage.vue | 340 + .../ConfiguracoesWhatsappPage.vue | 134 +- .../ConfiguracoesWhatsappTemplatesPage.vue | 376 + src/navigation/menus/clinic.menu.js | 8 + src/navigation/menus/therapist.menu.js | 7 + src/router/routes.clinic.js | 10 + src/router/routes.configs.js | 54 +- src/router/routes.therapist.js | 18 + src/stores/conversationDrawerStore.js | 407 + src/stores/notificationStore.js | 71 + src/utils/addonExtratoExport.js | 243 + src/utils/auditoriaExport.js | 206 + src/utils/excelExport.js | 153 + src/utils/lgpdExportFormats.js | 298 + src/views/pages/account/ProfilePage.vue | 42 +- src/views/pages/auth/SecurityPage.vue | 45 +- .../pages/billing/ClinicMeuPlanoPage.vue | 2 +- .../pages/billing/TherapistMeuPlanoPage.vue | 2 +- .../pages/billing/TherapistUpgradePage.vue | 2 +- src/views/pages/billing/UpgradePage.vue | 2 +- src/views/pages/clinic/ClinicDashboard.vue | 211 +- src/views/pages/editor/EditorDashboard.vue | 26 +- src/views/pages/portal/PortalDashboard.vue | 25 +- .../public/CadastroPacienteExterno.backup.vue | 1445 +++ .../pages/public/CadastroPacienteExterno.vue | 2103 +++-- src/views/pages/saas/SaasAddonsPage.vue | 476 +- src/views/pages/saas/SaasDashboard.vue | 2 +- src/views/pages/saas/SaasDocsPage.vue | 48 +- .../pages/saas/SaasDocumentTemplatesPage.vue | 18 +- .../pages/saas/SaasEmailTemplatesPage.vue | 17 +- src/views/pages/saas/SaasFaqPage.vue | 51 +- src/views/pages/saas/SaasFeaturesPage.vue | 35 +- src/views/pages/saas/SaasFeriadosPage.vue | 32 +- .../pages/saas/SaasGlobalNoticesPage.vue | 17 +- src/views/pages/saas/SaasLoginCarousel.vue | 35 +- .../saas/SaasNotificationTemplatesPage.vue | 100 +- .../pages/saas/SaasPlanFeaturesMatrixPage.vue | 35 +- src/views/pages/saas/SaasPlanLimitsPage.vue | 35 +- src/views/pages/saas/SaasPlansPage.vue | 35 +- src/views/pages/saas/SaasPlansPublicPage.vue | 35 +- src/views/pages/saas/SaasSecurityPage.vue | 12 +- .../pages/saas/SaasSubscriptionEventsPage.vue | 35 +- .../pages/saas/SaasSubscriptionHealthPage.vue | 31 +- .../pages/saas/SaasSubscriptionsPage.vue | 31 +- src/views/pages/saas/SaasSupportPage.vue | 31 +- .../pages/saas/SaasTenantFeaturesPage.vue | 20 +- src/views/pages/saas/SaasTwilioConfigPage.vue | 21 +- src/views/pages/saas/SaasWhatsappPage.vue | 44 +- .../pages/saas/SubscriptionIntentsPage.vue | 31 +- .../saas/development/SaasDevelopmentPage.vue | 26 +- .../pages/supervisor/SupervisorDashboard.vue | 26 +- .../therapist/NotificationsHistoryPage.vue | 569 ++ src/views/pages/therapist/RelatoriosPage.vue | 6 +- .../pages/therapist/TherapistDashboard.vue | 204 +- supabase/functions/_shared/whatsapp-hooks.ts | 371 + supabase/functions/asaas-webhook/index.ts | 148 + .../create-whatsapp-credit-charge/index.ts | 303 + .../deactivate-notification-channel/index.ts | 100 + .../evolution-webhook-provision/index.ts | 166 + .../evolution-whatsapp-inbound/index.ts | 485 + .../functions/get-intake-invite-info/index.ts | 145 + .../{index.js => index.ts} | 0 .../functions/send-session-reminders/index.ts | 475 + .../functions/send-whatsapp-message/index.ts | 329 + .../{index.js => index.ts} | 0 .../twilio-whatsapp-inbound/index.ts | 221 + 191 files changed, 38629 insertions(+), 3756 deletions(-) delete mode 100644 Atestado_Psicológico_1774873197838.pdf delete mode 100644 Atestado_Psicológico_1774873520538.pdf create mode 100644 WHATSAPP_SETUP.md create mode 100644 database-novo/fixes/fix_template_keys_rename_en_to_pt.sql create mode 100644 database-novo/migrations/20260420000001_patient_intake_invite_info_rpc.sql create mode 100644 database-novo/migrations/20260420000002_audit_logs_lgpd.sql create mode 100644 database-novo/migrations/20260420000003_audit_logs_unified_view.sql create mode 100644 database-novo/migrations/20260420000004_lgpd_export_patient_rpc.sql create mode 100644 database-novo/migrations/20260420000005_conversation_messages.sql create mode 100644 database-novo/migrations/20260420000005_search_global_rpc.sql create mode 100644 database-novo/migrations/20260420000006_conv_messages_notifications.sql create mode 100644 database-novo/migrations/20260420000007_notif_channels_saas_admin_insert.sql create mode 100644 database-novo/migrations/20260420000008_conv_messages_realtime.sql create mode 100644 database-novo/migrations/20260420000009_conv_messages_delivery_status.sql create mode 100644 database-novo/migrations/20260421000001_whatsapp_media_bucket.sql create mode 100644 database-novo/migrations/20260421000002_conversation_notes.sql create mode 100644 database-novo/migrations/20260421000003_conversation_tags.sql create mode 100644 database-novo/migrations/20260421000004_conversation_autoreply.sql create mode 100644 database-novo/migrations/20260421000005_conversation_optouts.sql create mode 100644 database-novo/migrations/20260421000006_session_reminders.sql create mode 100644 database-novo/migrations/20260421000007_whatsapp_credits.sql create mode 100644 database-novo/migrations/20260421000008_contact_phones.sql create mode 100644 database-novo/migrations/20260421000009_retroactive_whatsapp_link.sql create mode 100644 database-novo/migrations/20260421000010_retroactive_whatsapp_link_v2.sql create mode 100644 database-novo/migrations/20260421000011_contact_emails.sql create mode 100644 database-novo/migrations/20260421000012_conversation_assignments.sql create mode 100644 database-novo/migrations/20260421000013_tenant_cpf_cnpj.sql create mode 100644 database-novo/schema/04_tables/crm_conversas_whatsapp.sql create mode 100644 database-novo/schema/04_tables/seguran_a_rate_limiting.sql create mode 100644 src/components/conversations/ConversationDrawer.vue create mode 100644 src/components/conversations/GlobalInboundNotifier.vue create mode 100644 src/components/search/GlobalSearch.vue create mode 100644 src/components/search/pagesIndex.js create mode 100644 src/components/ui/ContactEmailsEditor.vue create mode 100644 src/components/ui/ContactPhonesEditor.vue create mode 100644 src/composables/useAddonExtrato.js create mode 100644 src/composables/useAuditoria.js create mode 100644 src/composables/useAutoReplySettings.js create mode 100644 src/composables/useClinicKPIs.js create mode 100644 src/composables/useContactEmails.js create mode 100644 src/composables/useContactPhones.js create mode 100644 src/composables/useConversationAssignment.js create mode 100644 src/composables/useConversationNotes.js create mode 100644 src/composables/useConversationOptouts.js create mode 100644 src/composables/useConversationTags.js create mode 100644 src/composables/useConversations.js create mode 100644 src/composables/useLgpdExport.js create mode 100644 src/composables/useSessionReminders.js create mode 100644 src/composables/useWhatsappCredits.js create mode 100644 src/features/conversations/CRMConversasPage.vue create mode 100644 src/features/patients/prontuario/PatientConversationsTab.vue create mode 100644 src/layout/configuracoes/AddonsExtratoPage.vue create mode 100644 src/layout/configuracoes/AuditoriaPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesConversasAutoreplyPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesConversasOptoutsPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesConversasTagsPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesCreditosWhatsappPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesLembretesSessaoPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesWhatsappChooserPage.vue create mode 100644 src/layout/configuracoes/ConfiguracoesWhatsappTemplatesPage.vue create mode 100644 src/stores/conversationDrawerStore.js create mode 100644 src/utils/addonExtratoExport.js create mode 100644 src/utils/auditoriaExport.js create mode 100644 src/utils/excelExport.js create mode 100644 src/utils/lgpdExportFormats.js create mode 100644 src/views/pages/public/CadastroPacienteExterno.backup.vue create mode 100644 src/views/pages/therapist/NotificationsHistoryPage.vue create mode 100644 supabase/functions/_shared/whatsapp-hooks.ts create mode 100644 supabase/functions/asaas-webhook/index.ts create mode 100644 supabase/functions/create-whatsapp-credit-charge/index.ts create mode 100644 supabase/functions/deactivate-notification-channel/index.ts create mode 100644 supabase/functions/evolution-webhook-provision/index.ts create mode 100644 supabase/functions/evolution-whatsapp-inbound/index.ts create mode 100644 supabase/functions/get-intake-invite-info/index.ts rename supabase/functions/notification-webhook/{index.js => index.ts} (100%) create mode 100644 supabase/functions/send-session-reminders/index.ts create mode 100644 supabase/functions/send-whatsapp-message/index.ts rename supabase/functions/submit-patient-intake/{index.js => index.ts} (100%) create mode 100644 supabase/functions/twilio-whatsapp-inbound/index.ts diff --git a/.gitignore b/.gitignore index 1dd5a6c..6901089 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,9 @@ coverage .nitro .cache .output -# .env +.env +.env.local +.env.*.local dist/ dist-*/ .DS_Store @@ -16,6 +18,10 @@ api-generator/typedoc.json Dev-documentacao/ supabase/* !supabase/functions/ +# Mas os .env dentro de functions NÃO vão pro git (sobrescreve a negação acima) +supabase/functions/.env +supabase/functions/.env.local +supabase/functions/.env.* evolution-api/ # Backups locais do banco — não comitar (regeneráveis via db.cjs backup) @@ -27,3 +33,8 @@ playwright-report/ # Config local do Claude Code (cada dev tem o seu) .claude/settings.local.json + +# Notas locais do dev e rascunhos de commit — não subir +informacoes Gerais.txt +pasteds.txt +commit.txt diff --git a/Atestado_Psicológico_1774873197838.pdf b/Atestado_Psicológico_1774873197838.pdf deleted file mode 100644 index 35e27fe1bfd4367f6632cbf9f8a124cc0dcb07fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79162 zcmeFZcU+U(vM?OQvc)&v);Af9L%3eRt)TCzDyvnwd3OYi6yP z^+f)Lk+F)p>Lo#W)>z3W!AsH?r7<2T!ONG`U=g>xrPXe@`+5uVuUPLOoU}T>)>cr> z);k0fiuLpkk=FPt!phsr-~Ct2ZE5F=d<0k*tg4}{`}d-)p)IYWsjjM{^LL!Cj+Q1; zP|Xk%gyT~Vk=FbRr7Kqiy@R}d2=L?kUj-3Vv-A$~#ra9=Y76q~LvUDcceLO|RgH@m zFKU3L!v!x&n+OIAg4O>ITz`n8sja1|t*xnbQ5USOuC1eUNmJ{RwB|)s=}Q`5Rdsdn zCEbgf8af*4>ROu8o@hZevy0M37(wU{LH@?;ZzBEZ{r{$$5J5Eyf3FZ}=O3E0mHtbY zLVu|0hpc~V2>$nmf`8MhF~8e_YQMUNc>jQ;)l9tu!@P0+p6-HbcA*})zi9r4{?!H5 zAVHoOFaIE4X*Gm@(Dk4Y|9?XWsu}xZLvV(E?pS_T_*!!R+ZPQm_&+e$`mZxr`4toB z_0N|;`@bQ9jYpt=a43Jo{j=4e^WPBShZ_E6g6RIIf*A5Am%lgmpRWV;AJgIACe>f3 z_y0N&|Hk`YG!oSRK860#O!zke{$=`C|6#NK>q_|7$?8 z!SEj~?EiT%{FVQ|#we)&=SK0b?9FiQf&QNVg8u*KhVk$H|Cb5zpW8+!_gg+jeEaX= zj^q29|J5x1mt27Qe{THjBG4X~!2etN|GQ0du<<~7d-8qUzYA=J{>w@N;qS$FaQ6Ntgu-E#NjFFK68!~8wHZB2gV`$&IW$PI6-AqIU56ZB&Z zqVwM)6@*5e#jJ)~2()&NG688G{J^_9nRYyl>K zUw`zU|D9hjc>sXU8UP^h@b5T}CjdazJpka$;NNj_&j5gve*gfLoqxyuT_?BPvF?8% zcYuH0@8bgitQG?R#~lFx;g0}-pz~kq_?Lemn>4>lf-e__|MCR{0=xmz05d=kz!RX# zhco~e0qOv)y&-@h;Gn>P0|x{S@-GJu9z1mT*iVP~<>b+$M~(@dJatOwq>zyCX$etb z5iy{U(3xM(h)GIHNl6Kd%E-x_lan|nb?yg|ef*|}4;?=7(@!VPi3o|D`)`-MR{)`( z4p<*37T6~P*e|qCKxp6IJAfo#-TMXh@yoyU7I5hBfrCE@?B92UU+wTSV4uK&ef#(G zk%tZ*Ikf*MVBda$0|yTYojUxBu=-CTK$+`Z8c;iT&(ue!MT38r{nZwp)^o`tlvsX7 zOIrsU68F6Hh@2*_tU?}a7?zjv`rTRkyMGk&DU19Ej(=nQ11t1*IsOeh2skFd7g9(- z2yhj!@Z#U){J#QjyU0bufTx;RQ8FQ!tW_99XQ;@LQILFNLA$;0YWCpJ@vI$9uqNz% ziWT!i57?TvirP`oJn`|M;%o!Eoe=Ze2)#P43)=4eNNVC|DX1S;-uB~2AN`u@Utz_-2}B=JODk`)p~R= z+3NvT$%So|msjj<6@86&C~hpvJwv>>jP@-wj{cd6p}fZ4`-;BY6Q>`wYrGB6ou}^s zR)25yYFXWm)h+EBudrPCl;`9(cB7?>2C<3Eh9c5AHM>`Q5}&hoiBA?QJ2UQ#^>d_B zs^FSE-A1irBG_Oe`OOn35Gv|~jrjIV(&)H&hy;Yw>8`CSWKg$I7*pL!4o(xzNs3D9D(XbUmLs&w@C41!qU=kobNCm zPeU1=((EYy#G3at5T95Cim}M=lxkOZxgR0@!mBc%qEtcgtRYfl$s-2!06TlUMRV2L zp%ziCjP*(nLwb1Bn~NfhQ%gys=2R(F)2C6(uE@^XSovlRktczo-{B+DFf;r6WxCs7 zx4SPv^WT1F9?JivP5o)8hvi+F3a88HP1ibS35m5CIx1_|gm&k;d)0t*6r*m)UnR(x z8sJ0ml!k@->;X)v%?)oGZfRX(!zW)(N#d2(T(A2VS6C)FP^U_gDwa)RfM&qk^j$I6 zNpV{C&9YBtBqEMi7WG6@sm6M7X;p```(&~6jlPo9{#+miQwJ#j{W#Y?JmCEor=v4W z^eKCqgq_Rt0&+kK!9*LyDVDbnXz&eRDC+BY;=VzR8!8z<;-?(qDHXhop9+aWmpO?p zltaA#tGV;fYIF$9*#orA?E#jg_5j_*hqm;1-FtxC@oEcNHiX_tB9HdZaXn2ofqv7v zv4s;#!gv`_xJejXe?0Ger;VH%+_;5}qC{}*ObpcW4qE}+sL}0F{NcLEid_XTSW+2Q zw|EhAuA=g+Az|gPC%KYHVVy!7EmQmqV{K$9EW8oCCf@Mt?h}uy2Ox>Lc?+mxM1FP4 zBQ>W4u{O+cF>+%P3^G^^kC4d-)9>0=I>%k)94WW$wS^*|MT6NYX_9to=cy4&!}u&C zcy|Ckd~w7o*X+wtZL3n7ff}GyjFm#kmHh0$2hmTnX+?v5MKubqPQ>t}>G=ga6A(CD zkB6iDn*G7*8Ij9#vwj+su{)F6}6g+G>$t%_=o{z^Yf{=R8X*Fi3mz6#p zn%zz1RgEa{u*(DEVz0$Y#@DOC^oQ=1L66&e$Tul94pYQc1Li8Y8;f1`n+CIButAUv zDCTBJhQpR!kFs;uAm_1XS#?#F7V!(BvUxxuANydCck{ICH9>g)l8i?)6VsUFpX zB)Tl0y5h8z6=;)bvZFw+(Y>=~rS?@R%Oo$^;)0s;OY^FsKP+SA@+nl0R}Hpmhrn~W z*qVlB@A(5zyVnvw8@J>ok($&KikPHKBcn|jY2Y59pm^tikJQ4<9$@aCRNN@N^5nI- z`LuL1_YyOO1oQ5<`hp_x~P2VN_IzJ5^4|N z?ShZ5tG`f`dyreNn}A!qr5DyaT=KyzOIG!S7lBwtp=K_rpaNLifbn5W5yvts|BH+I z(qlRH+*BGiw4L0a&^Sjov8(PdmXQglf0`2|e}&lheI#Zkzpo@S;$}^+^QR(OrmoXQ zrHOe{_3S!@i5!c9zy>g8vroF4N9>v9Uh1zHQ*%}{-?)UG?2>@<4J*sb3X<1mchxf| zA1|&?A;OAsr9RIEcXx<;V!?}%vftF(>IM@A>|Oxf+>|BNxHgu4!I6RXbe4D{J5}Re zm99+SSK|+$Z}Qk`rxD#6@Um*)Qhx6?@&QNALHRsun5ICPPScbK5J+an%}MbNFY)=Nwk2KI zr6ics=i=?rlot9`%S_he8?)A_FHg00t)cb=yosxdG@d`*yHoWTiI|jk$GF|2 z8(gMKZUlz$P%>a4eeLnY3at$ZH_dl-XD%hGT0!P;P*+7Mh;`Z*wz6QELVTmc(7HsL_X7pOlH`r@%0~n-my^JAW&r{*C{vA>0;v1r%+S4_*CInuhU>UBP zQT(E-7d8+8|3Ef>!tOTR2pF5p949wYo^qIIuSJh5f)3fs$PIk z_uAl#GGgr?sFr)$J24Em)h^^DW{=*FBV=agH%8t{+5?!?Liv7)39)Ut+jX^Y#fdT- z9UW%|a%G!Wv5m@qjjtK+oPC+6)(EFGM20Izet0qg98oIfHoi`ShoK_J8b8UZEM$A0x~_{Na|xCyXw(GCG`4h%ucv`nECa7!QBC^dTbn`ei5hFm3Y zH>O98pn-i3MNxAo*_E3qnppJ}sw_(8d;2s2vXz8$#b;~aN6ajMkeyUJ*w!0%p{0dp zy_08}$3!D|ve)Ly+%wlM3RR3cP5P6&**o5giWWAR{bxD7e+C_~q6wV|EU+ajdC-Xs@7@1F{*OZb zXE6NFMED=e@c(P82GBl`jq!!D)qYLWoGFYJVCJwo?^M-F9Zbw zp~5H8(o2eG}9QXTAEv#l&w z_bakJ?}PNGqJ?St6a|x(*7J~_ClXL@XZQM;++ZFTs7ambS*l%gy7R2R^!?Z37lVon zpj8nbaRUymrZkAGxJ-uC7jRYtihplEyWzaG?9qmKl)jYp+8{5E?sFX>PhfULD`V#% zQC`NBV5?QDUxZ(5-3Tq(11Og|yhxPnGtDFrAK6n{)8gyRNv#>ChyCMfXN{dRrfw^9 zp02)YKi;HAmi=O2>*Vz%vyXE10UZ&Is9)=!(Qhd1^E?5C4IVvbpmJZ2qoKgc@qY3} zmSfQ>Z~WE1Xq(yan`F+h0Awim!+=F_K2ffSaxc}0w;JLSPik1QdmK5&70Ufw=koIN z+DfQQ(D^KPOQj2Cs-d(!m~_TcGN_Wszf1p=ojm$GdXEU`291>KnL)1<>biV zjNUm1jtnEkl3~BR%vlvE|J@m5=v$~8Zf?kJafi3Q)h~x)hZ<)sf#OZ2=XYF!ZV%-&f2(^A6qT~p9viu@`#Jm zf>p~E#@V;OVekEAv&k?~FxPUR(!|Eh8!b_8 zVoxJRpVyLugzPNMW^dPg6KQhe`bN_0Spz*Tzv``n+lU=Vk+Rks3DdOu@+juj#I(@q zgvrBB0*@}*Sm;#qksVYwv#s-2f!2wl5+Hgw2nQ}Iq{z(rEymR0!s zk}HMIDk`!dMSB?Ht&DDm5qx|S4l%)$JrllYmy>8<*P>UP?5e7JT#}ydBvxs7>PDli z7|kBL+_ALWK!q^FUP7JFY1;Z}mbeOBshg1!5_8tkB!);HX3_ zNhb-MnF9{IqQX*m^C+Rf$mH4@d^~|6Kd6v$LDJ`#52s77KSPWCszT``Ax)y^?U%Lo zTs2j_)wAZ}9Ck+S}&Sr9aO=lE#A&p#v-k}Z4i&XToR6%8LFC0;sy+}`5_5gcE zRX#n(9v#g6S>?rbmhj`@5PI4mw&uMiZY?bV)YfKSU8?;D0p%|-0}4Y$kgY>~yX)gR zA~IWlcl=y$BiyHe=rw2+$VsFbH+}Cu{~bFyvaOZ+q|Z-CSeVJdkP z>SSW!N5`8JqLJ`WdsDaDMXzb+-UWPrUlFPrU>Di_KG}Hrb6u>=+N_jIpd=iRI^WIe zi7E0;P&t;8-?cDW-L$A6XI0c=N^Zc1?;rSwKJcGfp?kQe{1;N4cYmifny?~oqLt?` zwBujsc7kseMXW9M07)lmavVOznN3G(=nOKV(xSjZT9o3iePcmwtSQcXN3-b5W(*D2 zZQsLgzcgX)=NaOBD*rKlGVG;H!1#fTZoAX5W_qcAOloP}B8Y*4R8jtt25P5kV%M|Y z#x`0HHZMJ@ssSDxzc;((G#3Uln%rbAnkeiR3y0?BWqU9`gB{PgJ-sCVoQZ<}zM)6S zXd=K+)np}H<{*X@_UjT)y4{{1Cs*_6wP>Tfy-_g;U;b1xmJ}O@?$`soIVj%C*jh2% z9jn>{@ZN+wzR5P<129CcE`E>Q16V4A{=PlTExyqZhP?UG`&`R<)nWGax!v+lm@H0% zs_H5yoxtSXnV(tqJWns%ZT&9JzOdulxSpKcJ{E9${!LJQ`bNX=?{||U!u0j|OEyBAuTkIa?cImj+Nt5+;*larP)>e{HG?7Gii&)9G zD^q)S!l3m+h>gkaOS67|>YXDg z_w>|vMPmzyANzu%O1z;z(-NM*v1PknB;Vg3e1u-(;BE`2Is?4T7ev~Eq^ zqOg1ZZ9rGY;*OWiCoDTU?C3@TdOt3OKsg%CF%R!jmkqhCE5Rl%qBa8kNHhMS1)DNq z*Oos#-vhiqmbjA!-vb+XG~Ov)Kdua&jA@*FcK>Dj>rT@4{o>1h+|jH@G@; zhri@$G28aFVD=w8k6o3i=zAz+)}Ud5~P=3Opn@5_#P zR%P_E^!E4Bl8!gzZT&hv0peDeSNT}vUC&pG9~@&KNhzj-4d!{?Mgg&SZMWTT*(dWE z$SijY*~ly_Nt*kYnCogl@_u7-q3`_%6V0D#en;&-HmK|r%r>gj`|HB{r$Ud#*WZ!q zPKf;zII#z~XMULGw#F{r0|Yu>-E!C1IfhBQ?du$L+kkB=|5D4`>}-9j-TrDjw^liu z20v7tv=Udv^|2ZY(f+C1)`j-9Qvn!$2>h_Ry#NC5mRUFImux2v(5jCU%Gz%i5a{>I zMl6F2(SeHEdy{B%TekF#wC+LDsgMd^TgVwB~5wYo~V6f*-V%gQ=yl zoSt~Oapi1iq%5m%pz1q?`-Sdzz3pAL7|42<2e&l~Bd42sEpeI;tDOMbEO3(`HdNo+ z_8+14L*A9_ZbJi+E@h2t>oTS9Vckr-cBf4V6*d+5J?|Wm)}eU8&7d-`ZjFaQ7KCV6 zZN8w^pRl&JsRmMz92*Pkr;SN^tTBslGE493?5td|aqyiQ*)b+c`wj|EW&9=*Yviyk z-u+Ga^nlb{LI|~z3Jq@q&NPb7cQX^W2|OLf$BmQqJ_e4|xwPrSmH15m8M9%waVJ7e z4(8jJWTK0h+qkiKO~kYQdb3wO3O@sHjZo>6zFgT}Ca;P;FH<6QW zpjA@V42>Yn2fUOOZY(tSP6KW&zg|RwFs;bOJD)Dc=+RRgw+xTh|4u7LPtP^MOZ*$X z0vu)-DiMngomWX6yk8n=={d=ElR|b)RZ8!>>mxS5Z=cyve=xRgho{#w?U21(SzbIZ zhF&usHrP^J<$_c>Xka3BIy8ZW^{0^V({+RVLk8A6ZJe%HMmiyPqTJn)2@VwLT{{`0 zVtM1M1H8SeS@udw)DR2?`3i$s?Yqj`Y(g^)u2gxO9SE$3A~dp^jCyiKlCUfA%{*Np zySe4HOiTM^co^@e+Dh_L6v-onNC;mS*9Vffg(MQT<9!P{9dFJ}R+cCos&WDOi`%Ct z<(@8}W|{YaA6PL&Ow@AH;L)kb#o^qe833L#Ya-2@O(Tp=z^MrT3A0NslaS5%=9FvP)$NohDGWx*-oq}ai^J;UBT(9okrwrF#Gb! z;?27CMAiE5T9K4Ki=zg%5fR|Cg~+C6neeUlt2Cev$8F0nw3y58;AAD?Z_l3<_V-S3 zSyF{~+!k9}&ce&DkQD0>PIU87`P zwRzw(WY;qv2774So(2q2to5?eT`}dT0p0MjMBo*E_Sq4@bDN*aFWy|}w?|t!9|Rj1 zj#=1=T$V zY;d}wr|TS>!=KHnUC{7;6?29KA)RekpF@>w^Sy60zB!p!6ylO=o7Y(g9(}5<7sWAB zcW#uGBjm6?A2+fh3Q6?U=a|TVWGEPmFL1?VbIYv4C&%Bkj6NPh^B(pzYt!oqy^qjD zmy*vF<7{kE_H=fo)0MQbHFxgJ4&~}@*DJ3<2K)BLGo^qFUO2dLqr9vuyPGLb4Ur%< zoD79+^A5a4pK??kV8S)+hO-{zm?|6&sE#aOCSX(cZ z6c^sTij-+<%czT|eu3EM#cDj^-J0936RSg(K4tZ|qz}xD7+EHriZs7p40Jv5BTp?; zv@rnGo_szE|Je{K^(XWgw%l(?4W+A5++Kq^16V=*BCkEs2griX^AG=>mip!Wf3wRnO zok^fy7*h$TB%D}tV1;ngjvu^tTF{hH3X!l}NV@-Ayv-oSGzAo}^y~WF?w+EhrtW%_ z#aq=oQguP*IQR@hE;ai0@;D0_t=(T7bFM^ti5_{~rZ*s4Jg>4FL5s0uxgD3c;avpZ z0p%>OVq!G~s;~W1*XI9-n8&C}Z$^|AlJZ%+uz-5+qjgiuw9;d~?@5JAWI?_{ATm3b zxnW0owpgrM<2OTrYk`3w4ShvVTzZjtvHT2Z1Dm!7knsY%tsA3+i01V3a6 z#=B7B*L5|?6-(I}9s0za99+X8?wS?S`WLUzO7kXg+R^#cwq#=pC5*Ua)W>0kFIoQf zvqi3HWH|PNuokVk*7-Y1mTcaDBw={O`MWP=yRu&vqXVk2VE`Zmk)LZ!L3xvNPs}JY z5Ot$HRI6$Ps;+RWgD%?T`oz8Zfao?xY)$;p@et1}4n=O906~3c5S{AM?i~CBK*OH6 ziz9q@-I~7-G)iru%+NG@?7(gHC|bgz)gC}LHV!v&=yi1su!%$~tE)xoL%p7K?6$S6 zA?BAx6C4EIOqkf*s_Ok{Z!+EkdpGOjD{pOy1?g&K_mnY+!rU2)Th_UKaQL{EnokEp z%tXH~C?bL>>X*sy=<=HI#RGzj{5qWy{-y$rD(w{8nOC8%75DY3@n{^;TPr$Y-TpfB zRYU{8PsdG6^n$NozN5B75PJY8v>UCg@_BBLOkVy=EhFEztN@FZua`qk#Pi;&wV<%a z63?s+rP)Y{Vcf{c8K?8@M!e#C7vi%YmI8oDSN12}w>T)TtZWQ9 zrk;OR+^$uucOhZpmnFc@F7pM*%OBKA$21;94T}Dh7pR=YQAo5zQSyS57Hz<8zw3HJ z9~d(=<1-C;`{*qT_JM>RdCE>;LG_I`5`!;G6x^;AS8tws(0Uf3!V8&gN7+8VNUF}S z_79j#<1bvw$AdW|w9_vI4mJ8R9cV;n<;pqdP!Yu)36US^qhYKw{mM^=hC9 z?L04Z_C4F0d`DQ&;KL-TZ7#h$HpJElrNC$VLcsCC#JZ(Vk7ThF)7JTdCp^TxDCx`y zBP+ud#ag0{n0`QapUd(IZFeJ%y!uGG*{#h2Et3DNlSL_6_e|NHOE&|`xe;`K0{B&Plp6`g|<=%*0VY0 z_gnVa#s? zb$1kgwK)X|>AJEwoAKL$OFCRPn-HgaT&a zlW7`f+$d=UzS9mO*JXgQ28I(;Qzt@e_8_v;oOtT z8JS8atw__j(6h+bFJRS)#Ts}uu0r^CqWB&lew`Om%|0)TNI;(Bsyv?n{24WWJ1Gh2V)z9DH(8d-NW$%y0^Zh8(>#-qiRF>!IRq8FV@rsKhS&^4uxKq2a8k2z0tH%nyt3$ zq{TQ$Ik95Hg?2;XSwV~>>(8i`c}#_9)H#GkYfQ-(D&?jx71}fsTpamz$fegRH~_9y zAHz0NX)m#NSb|rCDf_Cnc|Id{!Px`o9D~cY+T2T7Pe+4n@RuH*Hr4F+fqK7J{&`Fp zc&FS1RGno{l@cFhg`8tAab&*bWjzG^HYtf{UigM?7jZ_fevW*OKPzr>-8i+?HU;dG zBPLs$nXs(8?UZG`^L{~q6c+fVvVPzoaIo`sRX!3PSYx{hR4*NaYz^jTHaNrYNIC7h zc+fXuUL}X4;?h0tSki~rMM_$YE9uu+YoaIy-$RH?o^a8i0HA)f)w+MLB}TZ?F(^Z~ zFs6RxMvLOy%>bl0w2Ng#9D=z@IMtg{NA&lp9ypXmvF8RyFuKQ|WGmU0vlab{$_+sC z$mSHiGhJ{vKFig5JUb&&<08FaaMdL)Ff2;-da|qR-9AT1M82t%roNG*tbKI{mcPf} z7#lv&FGUD(Vuz%O^;%IV>qbgPSOe}v6iB(h-aEFU$G}l#aKL}X-+&FnGTWxBXW5X! zQcCu375ju95xwYS~lfheKQ^;Wl_QQ0qX&mzRBALnI%@OZaOOGXdaNo689j z!OY9UGiqKobvF9!4{`1Olo}*zqTqQ!LU*TTVo_;)7Th**ZVzBj)Bf<#>*IO#3}?T9 z#Z(grj=@xhrJV?g>CjK9uH6Gr7y;0*-`pO3HMFylgj_D|I96iPEEi+~UgU2OKw&W0 zX0F$%RFyLKI)!G{jOs~GxvK8#HpkTU94S6Hs|krfOt|iyg5AjL_|RY3(e+V>D6dmI zIT6yK5EaSkd(tt^V)1l`G>PeIJO2uVOfh@DE!c2Cg_{BU0>rLKm7J<{VsNW8$yXi??oB6{(|t~qD90pyW`kjn{ri^(3} zRMSMq@%%!1<|<8RNV=BWxdza}EJKvq3aSh|=;_TtE1!#rmnRU_9gs-OY*or0;1VWa z&iI#GuR&iOmU52gC7eqmWGZMl`Ih2l$IeyDcHy3e^3NwnU6X%x_w$HxqI?|$ZFxzf zLgO}46PTgzVQ8ad_laOaVZ!zKkqY<`Eh}71W-~m5FmQ`?0+OZG|R@mo#QNC?qIBl`5B zwvH-1Bj7Dp7R50xyZY4fiJTd5J1StrXuPi7hjHcYi)e8nYKmZ+l6;pU*H74Vt;jPE zQT`4dNhi`c-dM`~`=bYdYkyKtI}@DEk`N9WQ3sK)>CU)}sBmhdbE6hnY!yC5-*!oI zQyp4}oQi=m9W?~A4j#Ii>ctV$8IljwGCz>ZhPGA~5JED0LsD5_AYy6%?PL0qZ}gct zDKkI=_$AQuK=N@*3yIQ2?Z!pdMQj8pTI4-IaImT*>@+gKU&Ub^5nE8z_M&f?X5W~T za+n#jPW>iR=e+WX%WxhNMqU*MQWYDT}E~7!+I$3Xs)JYCWQ0) z@^7WTpZkFQ9`wr}>?zI#(Dd`dq?9XqVc>3xZU;XVHEFfjx}shlxZ0dBG^@by4uvCI zZx1c@YR(%VotdppEj^uPBXGFTl?G|~Yk%GxF{Lv;$j>%F5E zq_Gg-g)ua8DMl8AsEK7S^?h>zn->y5|}rb)m~XsiqBgb^$g@ z6t3TeX&Rk;KRx}B(p09u(1RrM^o(wlj6z>=He~`+<2?S-iAoNbowjO(S}A!Yao3m~ zaL6u1@=<6;VV&XYuSb=68(TH-&rPXsm83~roXe;TD0u8=cS5P`9} z#W0~r+#iDCsyx2b+c(YUf!DAtWz|4nDJ8G^1EgEKvY!6Q<=Hb&UIq8=VtHR=j`4sD zvBcch_FYO#Vna+r_sV$Ya+S=6^}BZUd3%+_OTwXV;=Y2s)yvGK_MgdkYjTT|P%Z4n z73W1nTsVDGX^9jXAijJ=&+%7x)3HLa>KgaIXcG{>|-c!rwo^(NBe z#r215Sf`tQM6)5}l$l0(AFxmARHuHoL`b4 z`y>h8t#3+U+tdL=SNb~D%xt!PdVh7Ga}U4D=iV?Zlz zXx)X=I!Za2p}9xq4rWf>Dz$QGr9IS(q=-ExrX5cbLZry(I!z)2$}{S#XhbE2LIta( z)f;v_-D3j?q-)z5azRnzI|!C}$^->RT?#V#I_BN2`djU5GuIsjy-=SzH?*i&01s{- zkt@){&V!MNj8C*g+we{LNTX)1n`cDM+StA~3t?GFgOOYXR=0_x6{hGOgKU};Pnwab z78^4N506o;D%{_N&3B?>^JLDm5ua{4EQbXwD$SK-L>?{FKUd0f(o45&s=GW$VZ$Ic zq~AW(xx8XMPjv0;-x}4d!0OeH*@>Clcu0iO$e5~X$}Ek>_&@qe?cC8(q1^iK;c+=OJ8U(PvG~?CuNSs|;UM~PC{?goFBIJw!9kW(o$dZf z3X?#Ol{W#c1`>QFZ^2-Efdp(&yu??kFI;CTUq?{z?SU3)b^|tIGUaGUQVmgyhsaY) zjZ%I3%tgBRR<7xL0kxLEu%niu3_n*%Sx1SAm1643)NYzB#Apx<*I7jdL=GfA-m<|p zi?V)RbrO7hJpD3M5=+ep?eZA zIyE&-807UrpOX-rjT%{%HeAxh!? zzyJum>krCP@QQ*1wGzKf=zX?sGP%TQjh{9cgl}TI)iQE#s@^(r;r(Lza3|yJy&9Ts+8wZ2 zP{3r_yE0iBoJ(C}au%HbjDx6^wGG_$J4Ar_`u!b3xOJg^*O)4)IHi69e97C=2bB(L zRk8(d{j^BUOr$H0XjjEL}f8M#vM5x+{YYWomdW;qJ3xe zOLYPK^nz8^qYu5+vTWAiZT*CF;ef>^GvcuPb0W(fSIX}IfPXI2U+cLz`ZkpfO~EV6 zP)=>m-qq!;g72nKb%U`Y0coOm5dSGtSGmm2T+i@8f%Vb2yu1K&;~Cwv)*F@_*_S1E z#G%Lz$syCk;UlI>?V|Q*__yQrt+>Y3;h=!5v`50OXz~HLh74#Ejny4?CE;uNtA&~V zjkc|PRGAl0OYm6i`Bu7SaHV;F;G-i~Dfy{rGl>~6X+{Bu0x^aUd=Uy5jY#hQ(&j?p zZPmo6ID4A<7Zr!ou9)ncv6UN2w_2b0(!E?3*f(Ktt*~_tMT0*Ma`WT|;c}rhb=8Uk zm;DQ{;Eu@eqpMNW!leTX?`m8YEAdxdSi_1J6swszV9Sn#r%zb{5xP(<3MoDpD1F-= z@tY^|ROMu43q|>H{x9&txco<{+K&iE9tsN8A3~}MOw^t@hkhrEM2K2D29g?AYa=7G z(vEUZe?@;eYnw#!ps2UZ$mj}bHx46^YXjG~0La(vrRIB$rtOIVRHgaR=^Om?!3PqB z5@Hu*Y@BNwL7~XR_*9*myO;T$SS3y?pFG2!b{J6sOD-iyhuVqr(iOlT0@hZHkl)r9 zo>~9ycw%99n+6VmT zh6a5K;)k$(M}wO%6m%)PpbS(~wXpfY2Z9aM)t=$4a7gcaS05Wk4^PbLxyN00O~u{H zU24sV0FYxoA z_vXq=;1>50Jx;-c7B1{?^IqcF8*4$FHy%a9S^NibjCYnc_ubzAC+{@e^?n{@F@_4| zAB++dth`(BP0DHOu9{sLwU9`@O?-6JP^_lWO=vMz-qg#;s3&@Dy8dQ3Nk&qlIk?uj zIDN=i7MDKnjk@B5s#fr#${5T|xmpG|k(scCdrDYh9h6t?bxI*I`Q{DfvIr%~8~DUs z{xgDnSF!o%#FN9KpZf2G7o_b0)Y~+o@iSI7m^6>_*8)9n?|qmovC;+V~*-cIk_%c$Zot4k~8sf%V6|NE%oU80P0xC#**gh2evoNztLqf0IDrc zY)fcQ$>T!94hP*O8mLL(N45s;-S81L&+@raS!Lm9XUWEuGM6HmP@!Zbg-PbY%6CM+ z?56d9VvVwV(_GX_`zm!%DRg_K=i_wy#RL(I2c5%JhzZ-ja9D5z9aj66^kiYguVYDP zv9EWA)nmDl@7x?T@tN6Dn;HM0$FVSMqXDdU^5b-k+DqIWMZTvsPk`~NtPsp}^B|S+ zn($DJswuwVr0U@Q8NeUYNb~ZEs=j{3MZ_?E?Xz6>M@PRM4+j}Hg%-**Grr+?O~Bed ztpi$Jy$`~;cadd-_K1ShVdhnWisWq&%lF-=O~OjGoegKKaI0m?1X=2be#9y2$5tC2)W?#M4yK6&4z@fe41IF6&2HG@i-N(x86q5>wef7D?#fm{tUeT*3akNz0 z`r$^En5xqqs(m^xr0;Ctb2pPlQR^tUOLB;K;ZP>q`rV)MbJi-JZ!TQYMU5f6=$St~ zCl`&=jM9doOOv!7yR9)1{-Nia=cVb2dT*0ki9cj~;$0$)I#B{x8s@Y-^e{lS# zLw4*3v0~L-PD|+x;J)51Y+GrnKUw>8<-d5y%#8dMVXxdP&kuy5+4$fnybKk&=KbYmlmetR0H*t5Ob^F;5nl?5b}=|W=!D4{v# znEgd3OexJuVI&$qjsyZdR{{u5FSF+%DueZLJrBGGWL0`p4A97&fr-}#$h^mN1lVPI znWZk7AMtdi^0IN}y#P-Jjq#FF88>j-?7Fdf8 z=RX{L7Eq$7HMsS3TwD3(h&mgD?G-PKyq-t}{&_?6e zh0yioJ;153o)leK6Q$e1R$mdaP%zV~XmUiiQ~6t?N(ha|5fg03?J|&sb=zH}l{A5~L29N9!VNx4MYlI+fnv!4^q#jV89~E!1e=9la#E#3F86?;slC zwAE=DHbCTcGH{os&LS3pS1{IdW&!qNl44r)1CRttKZn51LaBKpcN(YsnNEu$%S9DK zev4nOn3!*JZw6Y04A<}jeew9IO-5#7Hid(8@~$58n@>;o>9yN>cRclVTD^_0oU5u$ zT=6YXpcofjv1Jk}L*U*jcur!VOL@UC%l?rYIj5?IA#PElF#cxhSD~K%rOM$yHOhL| zVjf$yW^7T&=rv6dYsY-z@DqLh4$y!y5&_B!_=K}+muy}NH+QBrH3raLLMbXLaEKh% zVt?MEjzJ4$bmzO`)I*QQ^$=y-$ulFF%W{gOY^0&Y+`BEJE1R>rzqoAtu>cDal~*4s zs8pD_78wJ}Xle(_%9bFiYB3m|A6ZrlpEJkk^TiFRHuQw*uOBK`X3l7B4COjYcBef+ zL&TV~z4+&{aF0cx<`O?Id#@1gS;ihnX@~n&bp{&e8(5qB=$%lUdvG;9&eNwo~q-N)vqNEsD=jT$tqBv;rZFrsbXCU z>7aYp&|+Sz`-k$mZ^-M3BO1COKY0gNvU1R8QG6emGG)?Q=dYh(0hj2-V$8FaGG(jl zl}IRzvFB)y|Aj? zF`%m10&2@6fMK3#U0=h!u?s)-A=3i%GmrG5XkI3-Sm!Gafkn>GLJc{M$>qX65K9wG*PC* zpE=-n_PS4H*N|U7r6expP@{PGOc7J)=My(sULuYNNWf|>l`0xq%kGBd2M-|wVebiW z6IuWCL)wjZYOs^kia|!uWX^`oL4-}@@q!al(E03AQGoc|oRddYUl zN_6P1EG2kbnLCfK_y(j}o7517@!4sj@7qHOZL=2?NBpWvv^Y$jI_;89cQv`F#Ehm6 z)t9Mqx~4SB^43;T851hC8ykAy%m^)OL`K>hQ?2_z)&3OE?Dd2Tn@= zaCamCZazmv8)J4-G~(y5~- zwGqbTkYUST2GC;q_a)<9g1F%?Jt{#psc;}@rs~}{qFrkQH6m~9nb9R(jt#Bvm(m}F}S1GBbXnD$r2>$L8QJ<68v&TBJsv%sl!60 zAUMC&NoAel9WH+#|KwpQVt)LcQUA{;%|T9-oFwGwoJ?~Pd8UX=jnf=#wUJneCNq** z_=eZVrI4(IIG4ziG3fGNDqSS8mGydhD90>iIvg{Qw@B*L2IU2JFGKoB_)OPXKgAbM zHL^G{&O$E?=NBC2FY5=Ytlej1dG*Bb+{j@E<=LiGe_EYHJ#Ck7eogip8Vo4rXFsxS zH-DF~92j3>1UJ!6DMl}s{y*HkXH=7E+xP3}IOA9c5l}!KX-a4V5|F0jK&S=`X%Gk~ zorHjd-sDzq5Q4xY7|s@>8_rv>X z^MMsuxh}$Wp4V}m$8r4szmr$(I;%Tu+dQY67hKk{C_k$~d-39ab~-E8^rET&@gvB3 zd9%WoAMcRumhdB|nPX>pW9wk*g*AUGLE2j@{^ewLE1JzbeR^H%k#_}obI-)T#uV0{ zW@)K>`1`)`*R+?Hf<{=MlYGxqIO!bPoa*+uU)sVPDatNsKZYt3G|Tv?4@0VZrRrg> z*4f5qngIqV`{=A)#C4U6U*}PR$XqzOgEWl{Dx|UsCnaoyzXu$CR_l9Z0>z0V(SV@s z3eF&7qJ+e|pG{lMQd{k&$T!|5%0SLF!#2<*9y`3F0 zIKK+$JSF>h{u=^%g^eedqnNdEV929;X9)h3Xjk%QU z(M{_YFZ*))ttc5N@uAWAy9x`~|3IVyqP6ctzMxhhqsSCv+u zYYBZHQB{4ub-^gPgIcA2O!Y{8Gv!ue)CJadlz4uZ z)ajoMIOJ3F;i_4fcuU?ikMOt~6Ua&jE&?w4Am(fjVrPF@95wY zWBLFT)%^R`_JkuFjgO9Uup&0@NXu{jwAi1dETac@MtU7#4@1K zQzzSvoYj1P&d&8_TWLl(afs|f&+u>AxA#*UM++3;z1x4$w8MStz?t@oU%f zuXJa5>59|&3rLhl=P=|%M!5lJRH$vRY;@~Y0x$09W7vj2|E(dUA8%9c=t^{Hjx&G8 zg^x48(4uMg&NGq_1J z=?OrqW2B2JF)HjfsZDV|?R8L11lqNv5fOn`Zdtn?MA6{C1v@CV9vB*C2!C{%3x(Mv z>ZN+Eo!GnO<2g^S*mN|g+=)8h`hs-iV1_7w0Ge38$v60^?k?L}CFmo}@)+3s@tTZ{ zp+Tjq8Xl-Tz=qlr(nJvGr=QQpo)6D0`?h{Coa@Uu5g>RS=AxP^HH7@2`2VpTAThHcvxjLncN@R^Y(7+ zRN9MIErxSPD%V<>TKf7C#>xU-SZd*?DKD&J!6bqdxcC%*41+c79n{zXLq0aTBh<{Cd<94 z7n{jnnw%b5E`PfW=+ps{suikWsM)g}6awnd^B=WF>s1lUm<><0O{yFcb}3-S;y5Od zN-Hc&da?^(6WKB{$Tx7$DF%D1f4aQo{y1bN0uS*_+&4xyyny3B8dWaXVB0WTP@ z)g7NHuR$@i=lse!5SZIpMXMV8-ve*T!GR6Z<+C9LjIEruyj}Uh713_#Tk9+qurR%r z_AP%$(d$buuZ;7ZXpJWCxz}!0eO~QJKp%bC_}*T@DtkQ|BS?2=S}!2& zO6i5mBik3A&KhL7ec4N!aQtE27u_?)o*zE95D%=5LwMSjoz)JA1r#{M@S zNxX%le7;C0u)Xb3td@Xi%;V$l3L43G9=CcIEV~X9FsQWkWB* zP83$y#DR*t&YGhv-`=jtKnKae5$b86P>{P;tO9_R7RjoRo$uFqv}82fh{ zb>0_F_K?z%lc&5S7uV4y$^=@i#s+KJN2DX4d$uuqPN#|>vT8;e|jA<~(q{(f+ilB8>>Wgyi)H(lqA z>LZi~mv5C6XIz>P2gU%YDUJ0}*FxuGUuX2$fipiYWT&Vnny3~O`y7j7v+N&PfzT=% ze@~8DZvpHx9UKe#dz?;HLmf~v=hhdz@%@E>S_v9Zx>w?CHV`!w>gjN>$$jOQP>TH% z)db$se6qXJ0qONvP96TwG=RnpguP@w={CV~`-hoNc1sE4$R<}tSy6^bsdyo#k(v=X zz+H&%!7h-x?iQ_SO%{%ZmrQoPE-&?YKRVFdMtf-zRg}#*Hfqup=HLlc>s&ndI*+{= zY|5D#sWJw87U#mg)X(N^G|oQ^58EqCkghML2BmDYi~g?5?_;~91D^jDTMOxGl0S^H z9m@ch=47E#(gth8&Sf5d7f`;2z?dUi!9ffUxM8TUX)k6m@XP$o+ zC7ga5Q|snUsZ(-;P3dzZtRBVnQW;Z>(xSwBJ#r=!XF}{lnrdPux3mWHzwd*#;7(~e zS$;0f>u@|eR_+vo3pw89lXCpBrz4HljaT_0hy=El`UyW{x!<|s z8=_%n;ozPt>_wb{Qs>v}eJR6o+}_~gS_r7=cz(8gv#e1)S~}#paQL2|&i8$atp-2$ z@pf;q(RnxMFLiLrVdeH*aV}2mVDEi{-&%%BV4W@I+p&5X&?G&iVM~f(}u6Gh{iQ&`tuLP z^At-^{M+BR7cfYVWd}Jvjhd1rbQ_Z*>{c8dF;wNK{-L{rnOhe`XZ)I+;%X5SX;3Gq zjv~K8E&~CG#%#xI61^3Kt^rQd4sNi$v=1L1J^CJi@S zS&m=ACJQ28qFC~qa%Yd}fR*vhiiH3bb_U3b4=D55d@3iO1_wP263BOGGSg1}Src-P zb_*AxLQm?ItGl7onrj(Cy%BGY@@y zDZ3Vn!)_!Uu*HoUtbGH*#D(^mFlgVk$#*k z=8_6glS1L!v@>2?^sfw%68?aVQeyr;rU!spS=D@Q4hpT=Eh-VW$4ES#7}}z4@RMueUybOjS*4=nGw}gr?xzk&nhW=;bCwrFO}Ez5Y`R10kk|z zXcnt10Ed75<%hSzBi#p#VPOwrEjhfn^00E4HWg=Cl=|#B$NFP^ZB-?ThgwV<#SUrY z{`PL!Jvm^iY23)Ifmr%vOLDp_3@XiNkbmHj)=RE)u_yXl$MouT3e#ujf3~I1zDW1r zX?c4xD+7_4S@mTR7ofwjfV`hGTuy$px{;6a0h0#tp@^iAD~s#`NkSuGUR8+YEP5M^@u$Uxzr_ zP4TLY?$CxR#AwnJ=pl*j`#4{-3J-^^$Hg16tFGEpU2n8hMK#UVEm-xDN9E8I~l0&etdB(sapv3p1xLpE1_W_=B-Jx?{uSJ_3o7pa=2zWIe3^kZXeG#YOid5L{m{E}WpCCI} zd){XiEM*za$3eN@aE+8m4mD_Fb5=K}{?;@i|KZ6pqC|J#w&9@uCJ4TFVfG@my?iIks~y%!HNRVKXp`z#jyimAY|cucp9iwB2{-VCJx3? zh640GZRa#VSv_)c6z*FcE`e7tbn8A%eQL^NPDGfB0nkHG=3ALD)xN`!*@fo{ulVR- zL}xV%NP^rDIg`khCg;bbIL)s}po~IKWiT2i+-4trtYCi_wPgo&z79PiRdsDhZ{|{? zYnd+klBm9q+L4_%49v2||5;w(cQMk{#m(RHE<`b=^PCEZP1~Iz@9E>q;drRc>%@oL zi9L|NQY;vzpjZb|azY(?|psok5! z?}PCCDpR^Aq_OY)hH*6z9kv?mtDsw6f#oG*FIK4o#a<&uQxW^P3B zvrU`Iu+6Q3!t*{GcruOR?M25pB7%)`yKeZG+P7h!(_^agFNsGk4OqyM77SCUDfJ6i zFsi6@jEaf|QTEf%=Ds&x4JN4R^-v|}=S|Vf$7#WIN(RM6B04ADqNjq&8ZNYsqdv_XBwFb87y- zpPf-s6uk48v~uiVoTOJQi|4l`R{EDe^!8R60n=NlWTy43?5+Yal+zP{%le38-z;Ig z{$c^r6n%_cu1=BN>?TZqj* zE|^_xup`#YwW4eoNm($So(S(Ebo#ygu$4sUyN)TIs`zq=COR6Q(-qB@G2%K-apDyY z<@i9oKc*tb!y&SxI3eOj#THhHLtNS{WPIPZOzN%+=LeUG79w2@ z6i~Rwf^-@q=`l}>PHZGTtE+wJ8|A?^_{cE|U=^90`jc#u5S7J6g-bkHVcD%%u_H2~7!8z~OXYz^+tG0~Rem1P^ zgYk#;PGDyc@^pt!`p9>rYnfRS{IbNTfQY2+lg%M(5V&V(u8y!!tsgJ^(0uu0e(XPW zz9Ep3N_wSrOXVXgEUKTca*?F+!_Hp*TrX_K9RGLDj}m`1GDZet?n7NRs?yH=vKhLS zlXy0y4j*9y>|pK@q6LKub0<3SPl{exHv-MZ@f%^pxRtOgz`JID&HVKL`ZyHHb!@qA zgN0_tV6604&d&IHdZw;GPd;eM#!-tk-OqKOL z9a+uT3x=C4@tgLlETl84LF&X_>}COtgZ!22hiJi3?sxk<(YDkY0njkCQ`^+T?)4%F zF&nq;`TK=@VqjnGC!Ghhe8b2zg}%&+B1{3aROSgO&(1VIa+ZR!lniv# zSccVR-u1t{qFEqq{KV<5>?O6p=1f)rAp(Zoo`ibs0*Y%3+GA`?cXK^ z*}>@}dS{Xnd|bMY#d)#&;rc6$s_4rPAXHWuq@&*o15jZQ&FejlhsC%FG#DMs6m#YwV$r%@1DiJ zI%!Qep-zmDjfV}x{w*`K&=}ftiEf(z1PE`TALd&3SlX##XLr=FaFU~7^q>t8C0H1( zeaio-;{UF!pZ@&cE9+)1jAg4>-G7w^&aaCdDQg~UpyxJE1?~ar_FL3~afZ;jG(hv#R_jixgw_83pY_pEfcSU~R_c_vKb=?7IK^EG_fqq2PTF>NJb@&+_ z^sd)J7&@AwH^ApuoWVSdn*&u79qbZ+u-FClvK%%3_CKACfa8g{2#bunDU%|lSKh1Z zNas#h!1sM1JE)F%pwfh=Mq!~zLr#_aHD^7ehPP#Pj=&U8+<=1slpWQ4P!8&wC>L_d zGZg7g4$u8M>J`kX_Y$A{z>xqs#de3CqmO-YHUz6)!DgO~6xMiqe-xTzR3W_AkH8D6 z=-R24Hp++Awl`IR4xM*0&FQ1ueJrM{wK3&CUef7(4Fy?Ps#5aiy@0)@>K^VKLJDQ+ z%ScDFkWO&2e&lr|Np`k?DfOS+E+KPWW~W$4YXN9wLpiOYVaBxF_*Z&EiKI-f(ka|V zmCtdAcg$1HcNo)(3Hg?*mB$$lyZ4tnRTJx#fq35n`%|PSQmn`JDyNmHY=FN0p>@JO zB&tkElaV=p4ip@AmbKt{#;hPy5Gyuw^5h1FbK$QoEk6wvpeU&_#Nv$fXDF6O8{>-z zi^gRSvM&d+I9v9cN~*p=5x;Y+i^TODw3s&aki69{U3aM;Tkj3w@{5SG2XU7* zGD$Id3WcS6U$orrLk6~-z1hTapnmO1DkUF5H))*4s8VQy_0rYCr?Q98DwHU;Hstl( zWzF9iYMh5cX1HUrCc|&}O0;%1qON=_e`VH0x6@I{qVVuXt=sII&2T3t$;%rZk*Z@4 z19(dAshsM7d`aYdjL+${2N&*}#_eW^qLMG-GfXAcjzT?Q$|?-BpEP4!tu|*JclLoA zcQnvh1X7MdZB?M+dq8Bl_pznV-bMBT7uV79*2aYC$Zdgz?;ssMK)ED9pft7n?{GXi zQV8q%$`rJo@8(Im60q<-b1mG6u84a0rtQ48;k@^-lJRS4lN3>lEnWeyU;fwhGu~v# z>^ySkZJC9A6;A=-0Kd~bS4s$w0N`yT19gy{7df1_lu-Y<=qs&y$W{2>O_k9x`C3yq zdaSQ+pvUgV_sInwq^o&z23o3kX^QLXVX9kt`$?Rh$Dp647j8hBb`xKIH275dQJ_aB5Vx!`S+GJLZG) zFUR|rN?*F_aGso#DisLi|DjX>|D`+}o;*rkUDFKCC-!H3Wc}JIOH0TN@kyItrYp7- zOGm*e!f>M3m{#I*HS6QNo~K;@X8ZznC~rNhvVISc`+Z-GdFh)k5^To^ZQ1OoF)+3f z>s@Ol`lgp#S0v5jL^Tndp*eZt(m1kOh8yEhb3NNLp#|`r@Y=S%9ls1J>zAo z#;`?YT{T1($!$$AK}*b;-7?M~jU|Uvj6Ljv1@xvuA<8;IS*lR*)C9QRmY&-5o56n+ zHUHiF`9nd&WaJ#;wpX*{0zJZafqlF*9*1dpmqeWolOo@6a=>EGiID$sTr@%m=`}DG z!e8GIsRcpGt5jurq--DXH+qGSQ_8td|2cENi-DW^7H`fH!(1bzft=_Am*2#hYew+Q z@G54t&GnYS()TGU%K~csjEp^W{t{Roz?79B`hm>EE5$BDTrAm;E*MDEqweNtz6i$2 zs~)sK!(;h6Xv@!71i*HqRGWoVDQtv5s3~+Vd_MK1@r!-?`XLh>`}g#Eg)-)J)QkJ3 z1WMvBv!7d}kdOxQ71mxc9Qw~+{pahz8%|Y5Dv?*kI_%f3>Xq(GJe?7j1IC1O!Q)io z|JeA?yZ-t9QEX;sZ+EmY7jcKAj8zA2Y$>{ zz;HX@M`VU)z{Ef*V|Wz*!{Z+c->wjp>57tEw1p?lS-{IStwZ$_Xz$S$y@4GpFEiW( zH5Z1)ncZvr|Ni_pjXv$$ClF2;5wr=TnK1Y=*WEiCg^Fz1&=M(Lly>a_K-s|Ij$CO% z3VyLK;J1#2KL52V(A#u}Bw$^RLK`#Wer28Hot1~%WX+0@y?nKxBLHwYaM=_U%O!A8 zh<-tjlHyA!-V<+Jhm0S}g<(|I!L0fq;}?o)`3^puiO7aXPVJkzVP_=d`e%y~fOT$S zLkcsPco&en`9tmhbJhNjy!ydyP4WA_ekF8Alo<2n$k}}PvLrYW;m}<&1VP$1W32n( zFfk*CvsNVEEL1$4k>=2^MLw)nv%(|U+nYEedYnb(Mx2Y^Oe*kf$la37nIzC3*%`&Y zRZ|I<>ZhUz+oUevS5+T7xSmox;wd}rw3g?Dr8sF*bp5J+&=GBJ>{WN|y-plMrKJ5L z*V)-gu~~M4Q1%Y%)-Jnc90*|vYpA?GTwV=(x=wR%B0OLseK^P zE1c+{$jbX%FKzIebFBJkd5GPC4-vr7_qVlg6lc(RNj^`tG}3BKywD6)CmSW)$5g?k4>}v;vAai2k8QvgLU?=)iMhjdJ(g*Rt7t4mATf%?CpJ!IBC_qdto* zF6KHp9c$)8S|)<3Y(BMiooR>2&E&#BFmWj-_dwA5PU;norw=FMr_uBtOcQL2tdl_Y z!}P(l;HY*tK!sXlO$In7%F@3-ZYm+@m4(p$nS5se!O+vAjXpWFBorvNXhG7Q)ZzGw zA<&Xs6pP{K!q(9^|JTQIBdsi5!CEaHSR78W7JMm8&G2v(*F`R=4Q#J&96q#=fa+j` z1?PB#xh~4daNoKeWRm-rp+z!E$444&!6F6lh(`L-+_CwDTdxGG(zG|<86p-g`)1n* zx+=4%McFPBSom@sT@W6OCAN=_Pc@x?&$uedHqNxn8>*bgy{blN0u~msee13t5YW0j zn~sq1AcTr;L!I8!6NN2R|6UE2fLUeoJPU zT4|cM`4`# zi4uUm);Wcr8$aj5$>z7yS;1ll+R&B4;~*%mp&4Wu_9yUy|4W@a;Y3_lFuqU&$Lqf+ro{x z-EbPvgD8i@AvlI`vBoz&9PM75WG!STe>OJPkKMO5#J5zUP7amZ===#%MKKX8d$n@n z_(MtehqkS+llYSsDqLUJ1Ycncm9;YH3bE1F^_;o3@l?+3fMUND;+xcd1fP$09(Pr> zkiiKxwG~d)w}z#!+^ouQlB4Dv$Izty;OOnafte;csNC!LIbY?8vojm z>~hA@IpI^WfWveub>+Nb$(J|NoI^Xm$mR-Uhl2&O*uhul&-~>51pPHGS+$RQ1kma4 z6U-f|I0ASrJK=aEiTI8>-IPH_2BbWXNeh;MzP(Dm(WbibEUTA{I$m77iq&Ba1<;8jbwbv9Fmwg#oeX=ZD1YpV!>B z4()F!Qtu49(p;u=Pa7GI3XnmVi|0D%?mu4(-`0EORhQ$8 z)>XgTh??rq_-sMR5ta~q(sQw6ARATqmD%>1k=}^G+rPJL<%TEsKI!vAxM;2@TR#_S zU8uF_NoJ|1d$eCbUR1LQh4B}l-}kAl&Ngq*UC&ppC<WW)A=8_7%d0Rfc(XWDyiI6qc>HKA zTiDgVeYUUkiIHa#pIgB92_3pLYT4k-TPK8?1v;xU?&}zquvsn?^2GPGPmA zwAQOu;f?5mH?i};Z$5Tz6av+8PP)gu3RPI!rE4Vz{QvTcNg6eIb$i&f z)-?~9N4z>0)?f-MOIo?8@uqFOFMrQM5TkNo>Av4n)#})1C(Jp6njw#h*0xORy+>-; zFY#lOSf7n2Q!I`EzIV-o5EIe}l-zZQiPVd23mtm;1y(GK4ROuSC?FOGdrQYoOHM{k zId_2gG`Vl&>$&n;DsXeR^L&llf>W&q3MX+5;V$Boek+?OPm3R3%zC)l z{5$;kG!X&qgn#mw6CE@3bd2$IS+6qMwP(S=JLd1j+qKALH{ZKhPr|K=Ld4cEe>B)N z_l^stf3aGxPWuri-i>K&%d^h!xj&JUXd~$a0Z-K!i`|n;XDyxFPBxEmO$Y4X!SEWC z)fG?O8J_i$sze@~GEkTi8TV-j!F6o(<*kkNp zJz4LIBNA#`t@Q~4ZSjTcdO43%#5kj?13#-4IS8&IRhbZ3c5=SUCMzB&zN#$BYV#Wrd(~UuK9zhU z?Z=w2$EUxJtbfp1796KmV9^yaC)KS|S^T;9obd^Nw{o}u9nxJwD`X@OhraA}ZbrPU zQ;lmXu_zYJLOonT!R#WG7(Ojm{Mz7L{$!5npo2Vx#OeBjY)GzDC96iIWLTw( zg}qzC+KnGHI===L)T!4WdZ)cEepFaELSEw!yk9Mj+CaqYHI40Xp!o$$57(xcjb7RhvT&?;S=K55dR<%Y${#v)L*+?JU>p-J1<&m#zOC-AoN6?Gpw&9>l787m6w~Tny}}GT zH{p4(9KVU<2g)s?>k}vxcs&M!punu)aOs_wxW8dFhBJgq__b<~6)pz@5}Qr0<`*hR z1Dh`qio>gv_CgY$oYR#It8&c(x@VcPFd=&Qtd1O$q+)8{+UPOyh5my2w6tSvF$l`u9zU%VfUgBR~A5WbwQ5oNp#dyYt_mB!!^v|U!hXS-*atG8$ z2HFqR7AG#OKAIi>=6y%2qF*V!_x+mh+tH+|g()tjtVHzwsfD6; zWc@<^z4!1~cDyl%mT6^OSP`C86*cb@q0*Uqt@w%ho4M=o_@?mz`y=V%{8XCSSG54z z#UCAeVsYjT1F`!ZviwZ$UIX1~Y5cP*y1OEi{IV*~=l*>So8i7|q`H|Fwp$HIOkckm z`o77K?JwN9MukNx*hSxW#gW&2r7g&16|J#2bvP_CCxFU@IjN`$j~oe$(LeX1>mGV3 zn-L3p8~PFs)dudJqF9lMT10qPm`wD7oOH`R|5eKCdu9gro6gKEY$%gR7aN0f?2RGC z!T8WmEf$h#dSN{#wRmg$Ua0$AAd@4>P4c110ks_|{uNm+{ctH}8!rdX0n8ou#AIG- zo{uK;nw|62kEx68hTWjYw=K|$MXD1cGlUG`cE!7@%SX)c%8pC7!x@L&14>Gkfjs4p z%+VDQ;?uWo2ZFc!j;YjhenTqh47&ID24&DH>!v`}qQzG9P1S{vLTIRAj<&WPTX&-P zvPJJUZJZV&Q-cjp_4W@3D+H>op{%lItR7{K#0{lL)6kUXi(7B2&FRlAZpc#Q=WZyN zQf!2S*afF70e#$ScK)-*P-|@fJr^du?`B!7rtl5=Mg#Ln`%!bhCtXKBc zRQE9Y_DP#?w&3ch>mMSv5+D~~#oH>BSk#^6Z8?>TR`(Bva$Krx7h!TRr`$`gdSo#d z!ZDk}Dq0@>cnvXaf+n)4;U?yG#=i+Mj*Wd*TDQotxjyCqcTyEU6P=>iou-Y} zQbOGJV;}TKTt%%?JI^Nd1W?F6sq4Pf1#ui8y?# zIGN=t@eb2`GSy0*j8hVISPZL8pGA(Y#f%6^HDb&mYH^vS@AzzB&NY`*aiEu#X$CkVk<_aczyg zR}VM->r3a#Tz2TpL!ysyfaY&>a<$czb7fchNmJG_zDYNFmd4xj?{R-hVMX=H)xf;p zm$^M~9wOhoG0iFZ+rzDccytj;x@RPPUG4OU zXY_OG#=OVISg2rXPP{QyxkF^Z`p8DPRvv@qIzoViRXgq6-wS_>d-XAZ=EZPvCpM1qi+U?y{5lg2 zsk-&U(IXmYLHyXzeAXeh7h?V{(n4o8F2YiRJv{)3e%=c((x`V}t~lT3KkEu}zgtKz z9hyV)M_qLecBJ-9e}Y-_R#cnHr5o#lwjNh(C6awCuDqN5Jt(bAgzIK~Xf7>gRt+{{ zvN@;l#lbd3MAb;CuZ+#i*VnMSA6|5cH{e{Aqw`+x1S#VlNp;twu*B_@{)%IF7%D}& z0muA{klzoB=Z8NcN`ENCyg+t!D>TC$cy>A0~s4&pn$@OvB?r*6?9h+?Iu z6P~`$D7hWyBGRymy4dK(Wc9V1r!Q0u~+u-z^>VwSNd`$sCZw zt1P*Vq-a%cf8V#0ADf3=SMM2^3o$m)3`~IUY0t+q5hjm>QXgC|MB!HOiu*P_+uT|A z1#JA4*jqb8Q?f9k-HG=(&ewiMj8}_lYpn?~4dPR2k$MMo+g{#OW@CHPx%iONPYB7zG z5lY1ZFbBc3I9OFlCKVt5>^KdzPPbD)c}dG1Dsz~B`6B&dS{$;`^9jbaF0OXoPc<2f zwPp4*&mpbB$(P1pct&I{zD~9&XP|*mAu&I#W1j!MB{5KFV^G3}w{^xJ1x2k6^4pj& z>+Qyz;6+-YoF9`HUIu8VGAfTI@7``i`*1%XT`%q8maoDGcgs{9@MX*N zppyNxExjiep%0Ybp=84Fvz^5{&y-ZSKEFh{lQ%B8E?%K5z9hy@mxU(cvVSkm4iCS!z5^Cg7It&faU8n7|Klz`I z`R4~qQ!K$fl)<`<^aN@@Y8+L2)u*P5XQ+mq?zdT>mEjm7qvtV~|LZX8>b9_le16vh zgv%I%09yW3Z=>?oOwPQ{W=UVlyGfy~706Y6j$v+?uqP9&>s;1+md|3@qFlfm(YX;V zLy|+8Nn5U!6-FgyH?I2c|2pme^5Ot8wzYgCH;KiYwwaR^W8_Oy5jI6$WE69{Sx#}% z3O=BQ4hbwV`q%$*rbX{EWX{Io~gOJv7UQBROanEM)AW z5YaW;R&fPc1XE+S(Go$o{##%e7ka0x#gzH%wsESG13H|`UBkLs^p__ij7j>)SrdW) z52@Y%>+Jznc}2}Pa7sOJoAxJ^-?aTpWQ$E1sqxJ_4Hg4sfT zEu*DYTP-aB+obG~NmbFsn=gm(({LQm^Hu?)q{P>~vR&!>zTU=;mStFQ{v;lts#KfM zGH`-(wKG+$bJ8q#hI+d!jK}ttp*MY#!&JRrx^a>D_V2Z+F(R{3P55ndX^J_z_G)QK zxcBAart!_+cSM+{k4DCr6k-JAKq2W&;TE~KP1q>ABuo$5MbGxj_173oeBiKHW7|Hz zZZ$Lv-)t>X9x*pc$$&Xx7njDYtJKSK_(k##PRZ;KE_3oLmEVdFGru^46D!zO(67CP zBAbK910x7O#V#P=cYH|nxDKJ+Vr`-b1V<-e=s%X}N?M&l9qJbp-jhyi6=ALhc-?mu z{^+Sr^v05|8E&B#hDL@A%7aJK_WBVXGb&Zlb^xSyTct_H7GU5af27Yg7w*w^bNI)H zwCb^qhvREclzg+lx-KBxXCyx5YngIw6Hi@LRMv%Ao;FtboqR&wmKi7&<}3e^Wr(aD zVzOb7=$a25?RhFvZ(rmT5I(~k>GQlJyQ4(?7>Pr|ZPL-tT_JW#J`_z&jeA|*yfi5~ zxkjol#0FdV%#wLq+d3X@wjI<`TlH8Q)fWWN9%I_N9PBaN>rUAu#y;vX3_lZmjEJIM z=nT|vUpyrzj5)Un@P>uSf@8zdXC|B?;E_BJyH~AX?Yuu5S5<}stC8V->lm)E(n76} z?kb}!u#*SbMQ>6k@pTca#JC?~e4YlIWY~rHuFM@f?C!Dd%(II6nQ^+x1U~Z&l_I1s zbfkXl|Gazi@0GzJj@wVy<=`z>c07^sC*Mq0Z{Ju}9Kmf5)(l9Ysmm?UGRw+N0SGu* z!=6>nG9D!qc$b7xCPs53g|rKEu+X=HtB;W_Eu6AJD0GvWzmdFow!MBU$Mz?VXyAxp z9;SYL4e82nms690RB{MOv4V0bP#0j+F552CS-NY_^O2%wB-XM?g10urQSTDQQ^GnF zbd)T6$7xPG6xeOO?imA-tsqmX;e-b5-fbY)@srCyNVu3vlkOOGH0KwLVnz*zZ<84ev&xC4R2 zNzvAu&rKXHeVWUwJ@86o3-0~1s#8y;JDHGFV(1mGWiiEOg-@8%XRwur*JOQ zdv-x5?zd8MZ*6XLBOJw=UjXbxEnAqjXAK4Qjmw+q04oRF)_OH*7#5`bFJ~cN!!l6rugXfy^|&4c zUh5cK80BVeZyKkDtLX=J$BB6tfnU~pVjxC)n#JNsF{O?c!Wp%DrkJDB^{I`eTUddA zdyE6HDoynUYfz?5ARTF|&zfv%-({_K4zDIjiqN8tK{uj87xeF_#7{pK8A>vKe(0Wy zYr~(WF%Z|}`j@ZkSP`qYor1vl%BHxQpriD>mCdeOVdR)4MAE zIvQd?nAu6N%U;WK$PnI!2PXCyndgK?A0 zoj+D3t&rb`#6j{$F{|SCPw#bB?2i8B@MB8zbXk!))}1Nc2}TCGq<(PKNt zMVEg?fmWY&B~-i>({P3B*V0%XwB~rvBZ((uX9Io_p2+ixsR5oGSD<2rPlqrnpEgU9 z?kbPR0vASd+#I)@tzkK(P`wgs^EsOn?hXe%ISo1?uP1sAyc=lEUz5hd)DYLv(9GgG zw}m4Bq*33^m*t*dg}0u1O>X;Tu$>u4#C3-?cxbBV3gFOc zBCO#KS25S`fZxAh%Eya&?RA}n@1=C{k!B5Z#cG$Q3bX7=1)syMg3cN@nX@F)Gp=JQ9|k7Sbj~l zX)a%Z>ez~@yb`Q!Z*85!jhV<5n5!W+uPO~vzb)l#i7x~6-IJS>BO(|68rJ_N36XE@ z($UEy8C+7wUGD8hG{PZ0j)2DPxm%7Rp)Td>k|pK_D@TakRKGe#Rz+G+rz-hc(fSfX z{v7%2u&kTKEy;l6RL6MpScfJ$EZg_K(I!6H**=e)o|~CG9l{|FN^eoF1Xwx@o^h^u z+54vL_Deok3DRT@av7?Sg00!`Q6W7jb_w^QU^R|?-NxaR%mr+WFrNTe%H` zdzHgx-}m{WuWhO7Z}~26{kaBV%}?T(ZD~`qPi9SD_M=nm{O@{a8$3{}A7XgXlC-Fp z$+#D_b>4%n`?Vm71I8mBfW`0oAO*aLv{I7YotHLbKCkxC0`$7m|3+Gy2@sbU{tzsExK4?=$?My1K=I2}(@o-pgBGgu$XLD+rcJ2kQ-W830SPMA^{wlQ^ z<{ZmzEhe}Oe|UC}-R}63sTgM=>$zhSa^UU2T3x8{U)6_NLi>+iI~-viqqCx@DM4-> zj%@i>mbD}`9`?Yt*NOsDOR%9>hv4|em`err`5t#K{y5px^nVfeUSUn9QTs2WGFF^H zh)ACCcVpyBM3pjpaJO`AV5NbL;{i!Q0ZMth;-?_mrw-% z?|l2Z_Tm2aKH4Wa&6OwbyPj3GZjtx)O^X^zB0jm7 z;E4nLA>iPR0CUkABl3V?pZWH`fUxBZc}f_5v&X{p%_elMwPgsrnxG*Bl}0P186?`z z2TkR>F5hddH9RNGH4uiP6qHdnA-$2;^&8p#QAeA#qhS^{%biuiA-_X27nz_;L`|$b^RYMzg67(Qzic_EMVjT=ku*!_Ab?|VfbXn#H zz*?v9c9|F@QF=Hj1khy9y_is_D`tt#IZVGh%rc3(_};#huemJRux-(w8L_)@(0uvq ztEr07tia6k1nda!4%bZi2bJ-8-d6vd2^wlsZ%GD}dwn`n*_Ab)ZFjXFtS$A2lOlb# zS{WHSx;Z%pQqSDGBk@jnN^s4gd%wf&y50!*-p=je96?G_aBnLP0ax)eBIi3zIe`*` z4?KX(6@LUX3#r^k+Rm+3Wm!wNd}810EVG@+HwrE(u~f2YKsjO$TFFP7qs3Kn#2y$B8(kFnAj8@VZC)N^#?O ziHVQUkS6m)k6K+|(t4y|;&LyS>flMR?HxwQ6Bg)0kXD6Hbqi#Q9|CUZhPB#z5?^bOqpV= zRShjgE9U@g)_DzW#pFKM?S?m93qmHW`!ANyIN~0UmkRa$R10rB(ttKa^T^X`s z7Z>X*NbR(2{GVnEo0=a?b|qeiPwZthB$5&ag8zF^IeisLu>{I;K;{WkTyx(b2?`3# zjdsdbtdwKQ&4GHMC2b{EjcV4u#i{DLAR-La?q4M;FoSE&k<1Ou0q_V!N-0*2pMn6mS%p^%Iz%*WK%G~bk;{Dze4A@O~Wy4w0zT0KQ!k|eT3 zN;-xgWy zlhZrIk3Nah#Gxg}jlDH>P$0fYAN~3S$>Ahj(|yi%aKx70m|nKwLUy<8M1 zse|YvCmeIXV)}uc2KxF37u8dx-wy#RpdqlL@FYqH9+rm-q#$<*1Td%~qW^rReVJTp zgKujw-~u#)K4FA2detKHeAVwYpdC?P(D7gWamN>ezWYzmPEu!6oftYO`jmj3u%x6l zTZ>YeQo1RBZu$H3%ZZg&c)jP74t}$E-S!n}RZEyWs#LhmdFmJ{(r#(2Vb43?I_huC zij@Jn4$>8^JGTig7|E;A7ny#n2$+!JHc8-RZjn{6a$qVaiq)WN4T50$Wf~;Nc>(Oi zNn)uQ1ZRF}gt-D1OCe(@|kr*Em?wNm3z8s}0lc6Y^(XJuLqFQh?HS_M5M z-v!k1=s&E&y;ao??q5Wi>|e36@s_%|djt-#3>AxXuvw*Q+5e3HT`1M53XiYMa$V$W zjd3WkzLbQax6E*$%}JQOV5II!jOTM3O8XY6i=3%@21#Szq2MlM>f*>9(bzQ~&dOhM zB_;XH?Fn@Oad8`1O7BgoYD{VF&LQ8{Gal=Z*;gQ=1Q-z z%!AUXQ=Bj23@W|E%%pM6BM= z>Y;A}MRtg;5n$`_)T4rq*u8quRkUwO=&x$HThr<~+wNL&Ly*QR`CmrBcR?fM+C5}F{y%J&PyLq)rm!q&VO zb)&GUw7_YQoVlU7dgj>Z+Jt9T;u4Du9e~FQr#Xe;i+$d9jOI)man>U825+lHyDa%j zzO4oxt-6(!Ugch)vsNL~p~Bd-Y!bEG*4ZUpe^smyT55hXDVg?p zsMbWb%wtY+O@^39dVE*ZT&(5NG~R{{msoXhPMr;HQ_wVc!PDfU>WPYC)PYbzGt?MN zVOr*=wV158S;3=5Bw+Hp{QWdlJ8d$IC~q6k=<{vZ<86xs&W5A3&H}b_zE9~xpHAyQ zF28MYPwp=KJ!nyi`Tc5;&bcJQ5M)4##(3Y{Y)A1-`PJa1i3*}Q*fMz5NaO!*IrC>+r40qX#_@4H{LHG5bIaA;SNXEWs%k^~YQoIj4P zpgsVGtE_fFS)*<)mTC6%Ru+4in+s$~h&9g@HNO^lZhrw`K<0%t8UcqYOGNvI_?Iyq z<_FY9%r*M@w|%7Ml1vP-aRfJuswaT?0uEsgAx&htg-v)mjk$%9u$K`g!{&~$|XkWZ_otTl` z^Isp!YSd$$8!}XtmK7v)?kh>Qm}Wc`h({Ta`Ba{?Xmsfu(ewrEmV+JkIgj%?i)glP zR=1to^E3)r{T*QuKi(7R`UbD`$6;by$bft#3h5i-@stX%LRRu$Q$|dK>XIw1(I(9n zX2dsIXG5QiZG(nToF?1jCyD4qE#rA%yn`3|l;<2+X%Lj;o<^Hr1?GS&{~1XI7S%Y{ z-dH?oszk2eNvMDeKs;Ut@gsWSh#%3Tawh)DyRZi_k2Y+_<`w&5KFF&VdZ(mcUxSuf z!&jrvJL*SA=LQ7Lkt!PII#?dN5%(K%hs5X;`?GPY0u8$x8=JfCXTdE&6{E{YuB~p6 zW)R=~usV%D^vmYCVBr|GZ#Ij%gk=k%S=-h~0>Z6OL*NmqlZY&3-qGz@`uiK#zd>*i5-wV;EP@(N1<*rCjcVb;{Vs zbfud+%rAH$*J?aSNPFOWEzx2htz zo5#K;l!&XQ?CHC>qKp^ur2bw)g9Kn~&u^X}QTeaqh-QO73=~A!(Y(Q+_cDe_8jmw? z6r{|`QDd)%`b$|fvwO<^yDynhPTe8H}fseE7+8j8^XSf!6@Kz3%#A8dQgjYK^{G{%SWp%CLAxdgA{OoA&CLVNJ){<1Ae^h792R&_U#d~4M!qu``tf8e`j4)* zieEgh1lnA^v35_U+GR`M#6OytmG^2bQ!3*4IoNfB$mRWbwU34`w_gzV#3ypPJz5A+ z-hfjMpV(F}BL5dppbtLLle2;;7TNm8){XkZ|n@KGh-Bmlh-JNpYcF@3JfN5TvpR94c4|AHw%!Op1jz#T#2T&%aMnFe=J2FRQY{k|#XSd))F3hqAyS zab}kX!+EWOmidb(-bGV|efne+Mqj51n!tr2besx|k?D@s7hgQBTuz>Y9@bi#YVXYr zgex3e;Yz!0E1qqdl%a=t)^FDsPlhsA+oB!o9C@y@tAf=GUl_hM3@%Km6TAFj;k%l$ zhW4_|iT^GfVultu@W^JULkuRRZ04L7LR;zfNM`q?X5e!5>w&7b|ePd=x2t_ef+rS0?O^q;QCa4Zk8QyoYtck&ydfM02?~g zAn7Lxb!Si)NcRjQ^JpKz1>3D`Pmk`$ILUylxS|G}?U&M(oQWziETjM6@*8`b`4Jz~ zWhM9?^nC#h*acZ<%)C_#zD9JUW>6ozTA6OY{jArUxTWSTrSgP!CIWu03@W;H zrBxa&Ge!qG9^sijHMZ_I_MyoQhK7RYDo4DvihwqdI9xPpj7%d%|0RPyEq|JAYZ3Fs7^_dZ z?d0H~!vYM25$Z?>hMmp$?n%))7~4OaO3maagn+PoWA zJ+0BeTUDl&5(;`eD5JXj()ao@g5ld9zun*=-bYQpA3c7cagcql^|j|0oAQKTJi+>_ zl|4WY-1zt{>(|1J1GN_wnwf}&+nj{97u!#@jgvRO@ei$9@4GlN`)sJf$kPau70_i~ zmENY~l@u+5?=wmv1Lmz6yD925_KAaKI;~`dZxQ?*i5(>|;>uzvFp&n+Q=}r&6#V^# zt$@Sa!$zmk_HAFwZNcs3#Y3&y!u9C>>9z>Kx}uQuF4j!fq*26@^xdT;-`Ggzn~g3t zQQ*ZsbNZd4(fN|C1*Y_2HnFv6~{eH`*`5DjE==QNNQ1)TZu5-H@wD508iknz)5FRy6e>4ZkNk zo{|B0EMO~cJLG8oaS^Y=?;s3}6yG)(-qC*i&oI7p0c=EvTz|ea6Y4m*Mgknr> z@_CWTwasrAwII0fG_ndBU>d;v-=(<^ybJCIX$%(6u+6Xvcs^~*k0&49icB-Y=ukiP znTd-t@b>vRM6_QbsrJNJ&;iaM*-+Rd+jAjcDJ$yb$L{=`i`9zuYiW)BO#gii`ugUI zbGT6*;=H75%e#UoJFAhM)J2qlXiM7(OtAz32mn>lS2eEA>%l_{lWOG`8ok=8<6Etk zf|lRs#h`0{*L&$;kYkrcB2%ZPA?_buD#&hBr_=7K%kJ0erGV0FNr+B&_I%_RL) z&y;(*jj0_dUcHFf4_`PF8-NXUNWuUK=NH7pf3E^LyanM+TF^Hp0t;tast4I-vSKrg zY)p?lV#85>W4g5Z57SqG-4L~v>ifQJk~yu`5*gBlxDOT0|A)Eu{vR4$O;jWYj`j|N zMIOL6v$*_UZB42)7r?^ck;WXs#7$t|ukqI4EJ>z6KL47-8#&@rNhdEcZFkLD-6e(#!()t@4R>QawHHnpBKSs2c%WgVbj(48v2RrIASrdU8g&THJYb*U}eq z!dp&gC?h`i1iWxG|2#*!;OH$!s#5-TpPGOkC)8%pc(T%N`_M;B>(D)R#F?D%PSZX} z=4ECpIrDbIRtj&9RN60|@6)x+hc?~Ybp`%N-Rj{uD_Rd8o2!Eyw+8!=J51i5+Tvi$J9jCmamQbbt$nzeT z-0`LFW8Fp11smYgK8$t8#B? z2oRlL!{)HMcN5@(7y1kU{nfmHU5OcM@Y*5or*9)b#RSQwQAJw8nRvlhW@o$Gab%MW zBvO+lCT=KI)koJrU$e`hC;%SLJ$d|tF+!7dFS>Wb=CBWy@6GRTs*03>cUNqn`5V?L z=|Ay|-QBF}nyc1o|8Keui*_8k7zc1UC`Z~8-gic+(1Olzza<0_JM4SS21tuG^;;>} zVrQKIl$13{dU7HU-#X3d(Ot67hSK{6Zbv^VM-5AS>d?P?PJt9ZmxTFgj<7ja z)+LV?``B|+&OShl*5H+V$!P3+TVRx;ti^k4y3U}Y%YNm6dPmL=4OadV6gg|SG9E$RE&&|SXyQM2Y27l!vvo9)&0&2K^Y=9a)z>7y|pYM zh=kEu2{3C2z$udUyh{G!LPulVDgH14!04}S-C*paeUy#9^7{v4yHC5cR7;9gt3hNV z%YB-5R85*Z;5nA}JV^Uwhl0hBA9JuD)o`-pwoDKFSc$F9%ou;-6u`fL?`2FcIvV$^ zrPdBE_zJsi2jZ`0vVWQ_?f%q||HU&Q9cJGj+u%xNA-}d1ynCNhP)4lQFH4-7@@+CE zt~&a4X&PrLR`1_pPlsf+*148(28X0Iu_Nw@PX5})f?6ucsOjk%J|Dc0!=1o|5coT2 z=)YM%O*^?&cC!yYlSoXIBOmeGfBL0UJATh6(&?;nVN_De{8^AC6c4&0Qkr{`Zr(Ba zy5#};$Kj3n70{EQCecP&4~SjHcDhtbm`z4co+Bh{W?8G?9)?GdzA9Yil7r(iP49bS zYZAW~K)RDro^Q8`pJs8O=I#Db-bjmi9=$a$feT+B6(wJy)!m_+&YCN#waJm!rlqj6 zOj~=2Qt#pqjq8hAFf){yYu>gMXeC!uRgjS$tqZVVLHM z?Z~8PlJWE9agD8Q1VXN5HwP#lHgvd^1AH;Fg;uDs3;7L@vV9j?H>;Fb5YrWNEg+;2 z+D(E9F}OhBFnn+f`ut&N>czp_0kR6x0tJ@WS;1|>6{>MP2D6&xTBpeQDr)EBw-`06 znmu^}h3gB_hHlP5%K9ftM|b9Iwh~8v?u-KPlR6%cl}im+2DJl)@O|9kjB~C4npfWH zcx-0}h5+_M!NK5b+mTIjmCQsUu${V%CF|bn`&Qc!5h)8Iv4b;;l9tE=L-)OSu+vfM zb^e*ld^>wCF7VD6e%S?UjSno5q^U&z#+gl^gF;#^3|byB6XOuAR9*aIXJ37HDk}Xa zOBi)-qqn2!0KA*UfvK0epmYXb^ZcI2-{^GCtgwcUZzS{`<>19JS_(SbZaZU;935yk-(Ue)q}8$@QN8 z2e;98%_m#;)F9@i=&DW>4#h7pHeDK<95HLUHq>vgpK9k-lET%m`$~4+sGt5Z6<|Ks zB^QE`(Tt_OvLiprb3Hq_|C zM5F8RogtT7hQgPgS_H20<#!M}WW8QK+tca?6wf#c4n<-IvLVC?2QVm%5hTjEE!K3 zoX3*JJ`KCwx+s}>GrLMNMTFbK#A`Hj8&n*3oD*$!3Z0h{sP%7tyZrS@7Wzy*Zo+pQD4+4k>Vs0m*|Nwh|4i}F?UQhD{%2_2S%1evlT<(k;O$|Yn4|f z_4_FXSsYKs&L}e{)ggC$$IF6wk^X(WpnUk!j^(|k+Bb7M>;5&m4n8Q;Vf@fR%dO-3 zf%RnvIhU4hGsY&qkC?Qg3fA*|w@f$}H}xeC{7etVoO-V{dWG@+Qz6Rwqhu&!F6-59 zsaxo9l3O)fKiHD6$K?b(;bC)}`oo7)MsUdP-85q_{{}{CPSe{ z1gh4VJziPDNS6CFU@g6p{36D(Wjem?OY=-#cak29A6R-8#PdKcOM*K*nfBCj6<}X( zLeJ1qqIov7)9Ds8kW@6HR>_Fd^$1t)6|t>Pvr-b#LmEo7mKeIM@h=_**R|Do))eRw z3hQ)!{+3@p5xQLZXEJ|2{qE9@@xar%H%r>B*eDda17(-Z=|Cnq9g56n$FB1B4`DwK zlH4G`$UeT%`TQtXR4U?a!&smt0Q@og`xpc`>2n=!#Nrk&b4z5;&a;A)mJ{t}#ZrkK z!OT+cIXsVKf3=K2#bd?#VmYLT6HY9}yqS$p@wczC2fm8L+98oVl#-GI$3&T5g3F!$ zY_bM&i@Fv~o&OpXE2^zrNugEDH4PrjY}2y9v|yD=c^0*=yfi;HuRh!_enlTv9nug? zFCNr}frUskH%7cgxGC~!TGV26SOpJe&TmokqM=`NanVop zg4SCEa&CS2Zel#>QWh$dh(ossM2qKe7g4-BZPu=gFN=cE4~#Q$RaMpBr+SEkMa4q^ zKHK$g$iTjA&)&*k9C%z$jR78uE7{mpuvAO1+pXI54SvncVxx9RDPlvX8$KE%Rohd$ z_@Y!UNWGGg(VNT4F={F^?>I7g{`|KKjp5$UozNn-iAi-JkiE)w=LTyG> zTSqI!w|bdbnNEH;S83wzdyer1dxy^7Nk8XIS2jK?g&I?dS+(j8*;Xri__t(wCtv)` z)(6D&MJok9V)U)c)Ik4wR?YL5$cV_-;ST#|MUO5i$j0bev}3wJXGvK}MR?~(T6^(y zD}bV`67bANEz_kQ^7)uQraSkaVS-lD`j^=+_00Z=n+ecC+WTYjUNdA;a)mFeyET_F zvivvo7cCiYQ)J(*J9L`p>gr6f^<`4RWa&Ka{w3;{TD{JdIjdqk6Kk}z#4J|*NY`;T zQx0(Z;6bqLzt6YEPS-)MQ=7b$Ec#7HFQAN7@B-xMj}u0-Fwp^ZiACCl&%c?2REo-GwJw^V zR4*cE>E$V!oqCP+I*%nQ+dT4nD{F=Z5>J{v`Tn8sQG!!!#92Jb1MD1m$PTIThuN1q z%rOD(gAvc4)oMWCz82`+QX$1GIl=J_(RtRAJSa!6G#YY| z`A4&#+`s5Jp*bp7ZC+hIjr4UTc&KDoC%!ul_h?vBB{4hfL9CalT(xAs8Lq*=SW^<4 ziqbLFERT!l^4n+uS8fuK5FV+Qo^abBDbX$cv6~9gze%L_xn}`#h@X_pd#{d1-}S3s zeA$qmru0WVtxHbe!QIK`oU`Mc@5#aFO%KtC&&#@`i9O}{eJmm ze*|h`Ipkg5ny1gkO`G{heP%;|=ofMUN^hRU>bvjGQ>q{?Fdq~(8d0DpV>a1ml+xL} z;F@&Wk+uAdJ}=7LTV@?eQJI$jj=3DYcPM@G`|zwS3Sj1$wPXpwF?pz4J3RzKB;V)b zh%g{cNMI3`{qoiqy*6qvr!~-(Um}JY+K42{ifq;t0{t4e*;;NIi6yPOICC+An7c?I z7|tbzNO^vO@y{iUnGS{>Iv4$Rp@ZT5+%@PMddl(=iTu#_)B+*HC=ACs9J?R`ZO!J; zsLbN>x^=sdKg$cqBIO8MSy({8HQx~CfvNv;XUOO@YRTu0$Wm&HSBo4p6~b1d*pi*B zNY~cII=vlVTql8}rSIRo?Jlf0s1r{>9~U?Y*5TIcd?l>V)O_x_^*T#~c5Wf?!SHxSF}=0``^7taiz6!4MpX|VNR z=L~2B2?idODQ@}e9eFv}RVieT8Icm!mkj^@Q{#2MxOOuQoE5w3PR^J|CVKVKmeCig zC^|aun@AlUP71I=uisO0CQa_!=TryeT`6#4sQ)=JbGY<>C$<_d zkTGq#2mr|YQvX&Fv~qyxzc^~X`Q!WtFU zMoMjShcaOpV5JLur!cMawXh=zze-z~@d9bF*+?Zbm{wmr%?$9>PegL;RLIA z_On7}sJdhIIe)8EoDb@ zjtDZ`_@1CF>D353o48y*vAnrxV_8{@?7R92gIT@2Dpcq8W6AD0TvZn;5hel71Mvrq zxm&$EHR|_lB8)DssbJ<3`=ixuvoM^s-gahZ|ALbF@&-1Tj=qGoW&K>HAL= ze8rB@VAzlf7LYEPU(f}hIrRWY-alG;dB8CAn0Q8D9dEk=&ffp*aj*ja$2xB$^g^!@ z<)|%JAcJaFg$ndlGVyQ1TIYRqs%Vz)QzBKB>E!r0s)0*GU{Ap$60z?$YKxbpS8A7L z&Y?H)(>K%jiM#4BXwX!xf8iGdBa-j@AH61$r>Ut-5t_6(@6L3RXXv6YhdwJ75fV3J?i*pzpfxx&P(P8gP25!FK* zdM{Dw_bQwX1_upL-^z+baqW7$7;K*|CfKZKga-=KQgdl>FLqxIbfELf+o4`nHbmU& z5Lr$dLV*Hnd6#MhwMxHl=Ny=O6*0Q^>nj)){oU&IKmnS8jRW*fX>N)xgHes&c&>#d z8?A{kmeL}2G{v~*|Eti7QZo!iDIP2F%V;7qV(9wce6Gq5X_Km+Bcs&B<6b)9?WEDV{>><~2!#RWD@$cf>e({8e z4tD*Fj|#q)zwC?E+2hdMbtSz3lsY zs*}bol1x!5(IAuJkpLMkfrAT~dCIW)8PQB*V^z2_wu0~)Ugon(O@{=96RMtq!)tnzCN53ykTSX< zb0p`S@h64xrA0yaM>Fx}z@S&kjF4TEFZK6%RI~FO92Gl#x2Nro3fd4wqr6WLxrSoN zI)a}BR!bixWs6`*q&T*YS<&2CSCB^GV}{ zxS1e8UL^b@I{@*-TwJCF5YQ1>~_W|#l?*-(g!_MmRBb~2J^gl6!q7aCkyEdWd~QJrx;?S zi~JjA#|f>o9<>X^SM1&`?Sd!a6S{E-I^C~D?B#Ym{-sxZ;jTA&K^nRIshdn~!18S5 z5o42*M2uXY#GV=w^Byd{NLPucudrTi|Ie=9sqMwvU%k>!4wb@^G`%T_{ElYmfLLJ> zY$lxEsS7U*2=Jj2s?2rmeM$;T3h*#}jSEsZmR7kxnDE|Y^3#fD^j6ZsZO5fxCi!7r zMTw!Up;*i1iQw%HA=@5bNAt~|F!|u~?}D^3-IN2mmamii+@nI}~Wc zfGcU!Nbp9XB5{9Wouc5MH$Bf2+s$1ot>{PecXy6H=`sTw0&u9o z84{sz^toQ!tEue@E=Iy2YB1~_8_q6`fI|tsWS!=#}cR7XRdZ+S| zPq$@(^5}}(`rAfA8Hp6%0&2z*Ie;MZQ-27i-hG|KWV`e~v&ldb(?w@j{w#&CS=G;wkcbYJJ#<3`+puFL<-%0$Z+^H(eTy4dTY2%LWdiv z0gVO;o?jb13NT zl*2i@&wTJqN!q9aHv-Q1*hKl*+Uz;GmNUk?>U*6y9G5g0!bKUNx{A?*!>QA*pFddB zQf;Ky6riP5`no3q7Ci+qTmH>kyE{6%n-=QdM0+70lgJKa53s!aPNMR{)e;@gdG?$A zaCM{N0UJQg1yV0`IkwDerq7o9x_57J=2{P9vF0|@3gX6SFoq)dQK0oZGbD0^Hw=Or zDK}k{Be63k%F{vFE=HI)NUIq)VTlNo&F*OKNvOH`ot9>QxoELxvKykyfNOiFrOy7s zryrif@hk}z!n5?*mA5;_NzNwt-NPexh?h~kWRa(2_9gQ68mikS{LZ&-yN^%P9t^wB zFUnr8WzoK9cu4u0@s4D%2f@(-wpriHA|oi`ny&ob6@#?X49Utg_=%RR zGNgD@e7(7jnh_)WiPA65R*cZZ9LDvdKJ@|SnX#vZH8%SEk$TX1A~`UtYDdR6`qOFD z`Md7aX2_BX-Wd9IxKWF$TEFe3(d&(=wS$2}CTnbZ7L5e1eWW6n{xe1YXKGB(agPG@y&GK!$)~U;(e^gTSma6DUKWf z150B7#^K)Uokdm(R=Q&{pBfOZ#-dZP>-v^`>qXOvnllPa^$1gNuCd4Z(uq02?P#>} z*{6!AH1t;Lv{~}aboO7Jl?K@lN+v6ATk(_T23ZwFRLeb*hahfvKl`rF{EFu5KAVME zYO~}&@;e#2hOQYNR!Ihf(*Or+beN%|Gd6r;7laAYmZI5tw=bMDyWU7i6N$B`d-7}% z6!@flyI1%olwv7S>SNfVTH}(>1EO$>)mq!1&3b%(V!c5el(td;`2sJ^aT%S#I?&v;9o8xLQhWjCD4`x11*w4)`+?YxVlO@fA`7hXbOoj+GE(Z@PHfVG|IDJXQnm)7Y zLT`d53zsyLXYdl()YEw}#RDjNsbqVlc#1D$*&I5YG#++1IG%3!V*1m|x9sUYPg{e2 zG>sg#F_b|rmFPXD9@@DU0c|u6n!MTM%`Wq-FC0ct8!o{8N?k=37NN zDUMcymY4_GW$0i?ho8;vp3KxLDg&VRvYqQK>jU#dtJE=&G31Ie-dxfkt3#5#P!yL< z9}Dlk{3*!nuMgd-2dP_BMt5S~>m~|zkPbNBke?T%YDX|p8%9!eNn6H(`E25|sFJH*JUc290 zw0XdyT@fLQkW%mJ-)VVmP#V$Qv5pe(*1=Q>V6d5pA%YM@zG5-pYxWD&qrDR*-d=#p0L&RV1(MbGsvuMdJ0e#7lk{PsO$}C4{@i}1 z*V#+_kr%nCBl(mB@Yi0^NU@72Z_bN52c2S$;wcz9!XD7L#yUjcZ9Y^xkgrwCktXxR3Dh8q*t8y+TGkS~18>O4Zz; z<*{=a_4`g<24hnf*4A@YxdRfe82Rt@`2zcA&nj+Z^4co+p-Oz#ttf_h7>TBGGnJ`0 zhHf{;Wp79c6Cs{4)K|O|&tnc5mS<_=d8=J?1&x|(pCDg;b zYehQOip#@qey0ZD>SX!y1+d4cU+0;+RG8*#+dG7f_F>*v$M-9pvJ&z998m z?_#;oD3kR;cXFPgN0F?sL|IXDcEx7MWus~MUf4z5^U#<_RBE$#zdAf#)TpLPQ(pZc zroJl-)m*P*?-|kmIprCVxRB}=Sn;&mY2^B+VWmQ~hFFqq$zLes{q>aFF1jdqhz?q! z3Yx#-ebc98fHHC=p*Wa<9$uy~1P!vbbS0ZM3v%|!HJZYjp2`u$3sm;#It(52 zyq{w2=>w!q^1ku5u4{)+wNKCg*mP6nB6}-<7Gm*y!kD);^jXS*GijR{;RBgXq*KtM8!j*dC`i^mq5VMz3t;WM<%G3HpU^O2=9kFW6!HUh1TwdlzuwfSrU9(CDH4P#RmS&=VZ{Z_ zOLQ3ARgu?Codwbef(jl9^gj1R=`m9ZL8ECjaPfuK+X(>)ibeGwvhI127VnEnSHV2f z_09B>;bl}@^D+xjE2z6XwkRQfqnbU+l2ks!#HW&)Y{juyaK`O4I^f2`^)^K-mYX9`9vn|%^X7>}Z0lxDwH*cH(gV}EQq`>Y7bpnM$&Wf+e@5@o75U-@QI z=>X-HmeSkq2VH*jvBgJ3pRAHp!3YOZH9vJ~%MucLy`uI{xp#Mp0BGGV-KB?Fzy*6g zLrJL~IER44oQo4%%2V|Td5_G1K?{jkBNMCG2brp(C`hM|`!;&62yU49q^Q3M`p}mj zZY|mZL_NSdroeQ*=7)(~Ixk_{Hjq$(+T9!^u`K90qC?}x4dP8cI{Lx>3cVg4uo%+?$>nb?^C-*Ql#TK~73GJ2 zfV$g;t%2FZj|dr1ED6Nk_SZ9xoA)+<@ihM@vH$EzIlTW_0faMu;C8FQ9@#l5_Lu#; zh|yXLs5sriB%qNmF0kb&A-Jsu{jlkW=Mrge<$^_h%ijE;zj1zu=Aw-~3BbX*MnpC3 z+xISN086zmlvqPtGrj%T-i;*H4Qpxq!6XsDw3BLi6d*C);*40#VvL<&;439ZmCa^c zlPIF2(|P?VI^C>WffLy_Jd#> zq|%kbhDM^E^w;{W^Q_i>+oq*qZbfTU3fY2}Risd9>J2m*2^m6khu{u@hpyO3x|Q z8IX+c+4X&z#g!Dvcns$H6T(FAy;{^mVLGD3hj7;YNMi9PbBQM9TP*@ZXi-Pe-XAk0 zuneAK!4OA$K9Xrt;gZs+vX_G5m77ZB?G9s~XJeki}4f_fHnST}5 z2bk!2*(}=%%v6HWH>nwAC2*D~#GDZ>^Ay~-{4-f})WClD}oq9AKcOLYyX?oKUz94pdKxG6=yB!o4GIT)Y9v@-0f^ zxW2hX^n6|`OlI7dN*y3nHQAn96p_q-Tm>Wn%?T_I^9Zio!~bb{{eSp?ZD(uNee5#$ zd06F*PgDKYGn8$boS`QP>Q+>IH#NFjnDaBif86QgBukxPQ)1a_?0pUi61z%_zf_M( z9I}_mC~b)Bd(8t*O1GY7?aSGC1^Rj^qbD6oMXPaFq>M5hXNY-)BaiCVUtZ?Cbn&5- zO#x;nbA{zv&)ncrxWW@_I0_P1Iti#7LskhZJOQk)ErI3XGHxI>tg!qx`bGapl&Mbd ze7Z`}j8e;5h&Z_L3tHzz$(1d~-maZ(K$VJAc)|GIfZ8gPz9@Jd$|7XQF zaP;-zzTzuhf!?#z{ga-Z@>^kiz2G_zd2B^yN9##dKrc{RpHOdE*{C-!lv8tiFoT3q zeO{K`=`QzbM@W6xKi#>zG`^I!5I%QyG;Fc_4Nh;)HN@IKF_LB zXE>?2|LS>+@1Zrr_-MHN7f+*K&%5952d=7?1u~{n#`mUr2NtDkPdW&G@KeyT@rh0Vc@HtskM0i%FBm4)lQHg?_{a+9(`TS_gezDJ){zE$vjWQf{^q1xedR_~8AvC0yUV(txna zFaC?(NaV(@?86@{jjtbqTi;UEb-f~s8x5_ndk#6_)?%b-GiJCn&v~DPpo79K81Me< za~Do~NRfH#PR;*m?>(TJ%=Ug^)T1+lqceyRrO5z-h9)I+EJH#S5J(6R0wbM-B7uNZ z9cM%c0z)uCsv00bLV}be5}JNyI z&QqyrX}Xi&S()rgYaN~bQPg2F z+3+siD>fTYRsskI;^iD%CR{3{lM7uAR<@0#AU06O@9i*Fr%({dEeuh$gJD)tw#q{E zEn2eBCxuUtsPh+6{eByv1v`C=AS%24L{0K0>-!c3VzpiK#-7K}l;fo8DvRku<3^5& z<#we2hfXNN1V2FCJmUDnow0{+%q8k(RU(oa&gQHNi>j`%9bE#$bqP9f>f_?nd_|87 zsu;+{wM*x0i~UZ{I)#>84}Qo4D2$#CI2uNI7LqEi{@9LEm?o`a6m;(O>BW)|;;@yb zNnS{PhWXq95@Y>F!zrRSJNWTTO@o3XWRl9hv#w`Iiv|y#iPUYlcm!0}AB~Gz{=PO^ z2Gg>-^W@-R@tj_ zY9tv@K}gyBAZbzjgjs<*0~Tf`bz)h(xU3zXe1#~1qW)aOawGT6bqce z!5dq$gtT`gsa2W^YsetfcEo-6(<6L{Sl2rhw%T1wm)N%Q<3#(**wov;oq)25XcZ2l z805=GxN(<9e8xqnTFGwYE3FjW0B=jh$3#lrs-3dR*{8HWM5ca1X^ot|veT2_oXxYr z6gT!*qp-9%<1|7Moh;UaCTa0rkvb0|{67 z@Z-?$W7AGH2!!D7-(07t?0yFY6bjz4O~$m@%QloP1fP?TwVNWUklH6KZv8mf7PP0j zFz$uOD&(CABx9mG<0kmyTLzViDX%PMDDMCvI6c5cS*yZzkb8Ha zT2vfs!^n3L>quAV1$BAq)v_4no|7UtchDi31e9-c^qu_KLDI@?YPb-CEppRgX{x3= zS=*+wT&Hm02-}aG!6z#^GCw?7kM9m{H{rn2oSfPbrpW85k6BmY^wD*ad&`HU4jK~{ z!A_p&flZ1O*PkxWM5V0!Arey17M$fIWzpu;A60W{rfXXwUeR5i)u5$kQ73#qz#HB% zM=?n^Y#L@UobE7UYg8e(8+JI#(%AlDh*@#7y+rhG^7(x)FZ^cW(uDhzG;vn*+`=m8 zSfz%G#rzpB{|7`CqTgT{idoh#h-4v_vWJO*lcj@5$M;Oi*g3Fo>xtiY5qO00(JX&y zW?%|w8Kd%4{V9zCh=GQNi=6v5O{p61rwOn>>tvw)mjq;VFjCjiq9fWD+8UZ7I|U6J zXF?~(HeeI!kp?9*bhjLs&AAje@k@_|ZGk%zu9W}_{=d^~XqW>@ZKc?+CoEjtD(7X%^gu|mykW)*UsX3PY&ttGP+ z$PT?6elP%m?74@c zWqjtaeeF%#*~J$a?&evLmwI6nm3GPnz(a5V}VuV^L5aVZO3 zn8jsLuKvk#(mTZr%?>~&(52fP2i;A&2#-!r7HS+QfBp`fw7OZ_f9lGhJSD5tf**|| z`x%s^7ubVhn46SMksGLh0pggA1#{*})8KYoG!!tuopRKlF-n`*Q`osTA|wd#76EF> z$DI1i_3l2+YcTG`*DGi8(2qo8`lJAgy>Wr8hF^YuYG>5#X%kRNlHJAIe4NFcePVXH z0nR3JIL_OwX*}I0veu;GmlByDJ5)>}PEB&Uua}j0YoyGTY-cIls9?ZXn1a#p8~an( z(-HY(Aqw(~ek{8~I)SZnhdH;U7%N`<>%DOB3}wFCX_t!_Qo=g2Y`C!VK9rqA__;{NdZOfNq z8eW$AjlFE0hwb1nBTPCQZnoO6E1t{j^r-}#LD+-yOik29Y=BaNN(KTfc6zdL2MXAG zERXb2Up0z=E*7Trv4;X%(ZIuZB-uLLYzo2_m{h^+o+C<_DF!UUvI41II5LTJE<|7S zu(%>$UQF&N_p?6uT#4JYbC+ESO)?p{fJa`u9Yu>6sV30t!{_!h=N^7sU%2~+NEz_H zq9L|8FB8l~ya9adXcLf^)-p51MaXfrX~p-@y?V)qASilqMfKTN`a73|eqx&Xn_pp=FlT3|pZR1zC*CI+k388{QKr7KuuW5QGy|6StlB)o?>Vt( zn-Fm#ozrYYkza-S{m;z9%uKzxt|q6Li2s;}-ODyAFKx??(^g`pba`dGUNJ=2-DW0H z18`}@^`Q}Azd7=hwDFZ%V`o~uYqO+`d2CN?3kvZ*_+1FxPwJI;cA8slG}U1K?i zq>meU}r! zh}bXIyUXDi()qQNtNdP=FnXcnB) zzR0nTH#&nt{WdUym^VJ2JB8SMkUPweNPig;7qLa&w9qt~&M%hh&}!|Ae>H^gcH!-)?KWO1*SkDr~??$+xgQE-=MFw zXzqSOowyd%E@Ny&90IAqq$blI>b$EKXvSs+R4C}SY7-HyVq|p_ZArdjliMlv0-8$9M9Wy1C$FCdmS;X#v4QXGiqmCU zL<7NNVO)Xvw>FOwTnX7(_6)mFklSp{%@2qJxFf+Ae{;r3`tb%efTx;RZSvG(n)fo` zcH{)6oO_b({N~OF8wCY|E?O?{;4Z_*B`|N23%dH_S@6e+$XL}{d8?yo!tpJytuL{ zX@pm}kSla#pB?$=HVrlXyous5H&FTaO_cP}6Bsc0N>e1iolx5N^vErpUY`eL<&;!a za@VGyZLVZ^c#edTQS^ioi1dUxCN=x&;u>m_ye7m^_>>Xx07$z_c zdXt6V3go3A5gmasV01U;Sv|Ujf`D3rZoo;PUUTiu>E=`%cy;BHo?KbI^h%@(Q{y+A z@TUlYsVY_A&4jTGGC!}^bKq%p$H{An;-Z*$mG@_HA zL(+hSWZCQx@?)k`xiRo`$K?tHUkjQF!Dxh=tK>A&Ywl!>8dmj>9Mp~cZJMXI@O4pA zh_0_|!O!=5E!MH*Z&0hW3b%(g$N<*z)WPwuBLYnG+!xP2YFcwujTm^c#e$3%4%4z^ zX}K;^r&l1{VLAyETb=KlQB-pjaRQ$n4!rf$IJ(o8b>2BSqJJo|inRN-c3ClK)4m%n zs2#d`_&f;G@D|YB;5NKX_BlW4+$`gE|9(bma4M5JImbsSCQmNkOCy3IVj!dyt#q(T z6)s#SM_ZwaT8Hty(19N0Yu(c_b9ocb>vI}QjrL{#@4Mpv$0d8A{YS2|d9Sz>Y8F^N z+!~@om#$c|!FgrWx;;E-cSat4wl(-f#1s=)`xw}$CH9Z{KD*S zXFg4JLg2_66cQn>2!qFp*BG0zXk#@58h_&1_ z4ZcFi+5c!gVSeMQfVng8*H2DU$9IDyz~DqVZ-N$;9HA51l7g)1#$CJ(t^owNygSMtpInYhhylGl*R`@SYgWoQnjLkKYYYTC41a>NWrm^ zrW`-)L9g7m??uJE-!D|4v=Y|Wdhd)73DMRC{_5#n!_{zDl3R;e(-ffEu)_6t%KD(O z{WuDkwE-Sr32)64!awCm*K(IH*xjE3H5_{(otd0=Z_t@LbIvE@Ok%%{|ncEAt0q+h2TkxK3FAYQeI;bqC zhUw_4F*O_Kd37gR;qAv|aA+6^K@&j2b6|FR@U<6)9%+*`ZZ)tYLF2S}d(#EHqX2PZ zrF3(9D-BnC=BBru4n|&H!ST|iJ&AXt5m!#t*!biFMr0c#uhIp~wLqey0$9YNi7X?`{ZCTTU+az#HhiKw3QeR5r!*N>hwOw$kz@&yg^60l?~(! z_t}JnJ!N^=eD_rW6$VF!nk`=}cI{MEpP@-+qT9jHSw^{-HY6Uh(-_m{%fIR3pJs3)3}4Vcz(-bw>`*SG_3c-(I%WN zvCms?1X8(+Z`@+(xpoXk*r*b@<_Zs(fXTU@E7S%H<2fbw-iuHv@_|+Ek%rY+eP#TJ zm^l8c-Yc_lkjbR>x`wl@dJAhy2ektkv?n{@8L_wgW02Gi%-I}mKX~M=od<6b?~N9N z&|#~ym6y}soVpXCeL1jYMExo05brU8IIvvv!PLQVwczY*+l$BhA|bk|X{aFKaYlSV9ugIBCh)i6 zg>vwM(|foR#GYYZlLEJayo4{m-`}2=nJ^wbT{vA{R<8At`G?4jM#LKv6T<0$epYFC z9h?(BP#7H~CN&Eza?Uj^<-l-@6`ml3AGAcV5zXBA^hmhBYnS1*2>yvZmi4WQLLFZ+ zUE{f!5sjHHk|xYK_V{1E~uuN0?=YIf$E zacn#;z8&o!jMhs-sfU9gdUg3i%fR$A?2+KiGx@}n`E}`*P#6Le5dw)ked|<~l8fWL zt1g;Y6V_%Olbv2_4eR;kKSnYZaMEkO^=n@wyo!AX-$O3wWmem{-i*`AxBoP0%;iCGX24$ z9Gy{-b$k8&Amh#EnI7%rHA7G`zg*9ZcPR(%Zo%`4n;J-ue18?}{_}d~_npzEm#=q9 zA;Y;4;rDEFfHaIhiS}>ykwPL?kc`+osxj94`hAlhx7WhDiI?K zUIaf)BKRZ1Uc9jtbs;29s+GR7DY_uF;&|=$ynH9_QS~TU)U~y|FKnn80cs!WXb$df z-lT5v1*e}lEBK%*$F7y#W)dX7sZ%tEHK;}Uj3BX%sk^Ij&mP?RAHP+6`Sl9|Ul90$ zz<*l=_Mao-#gDZHm$SyOw72vWM%WODO$~>_hhutMW>!6pWKT>SI~xd97k%rvzl1Dlz;o+?(1ha>zE#|NsUu!U$T9HJVy>J7Xk$T!fF;u5$ODfqzs&l|?ZZ;q1+HhF^zU=!@oh0#NTmCoW``gY5wf1n zDs2ae2O}cbi5A=+2C_fCY}ifqIdQ^yty9&Gh>4(;ITRpm`@qYzRQPaE1c5*}*mv~m z?J3l zG}UTwL`c((0)fPDTBg9@1Fs%LUlukh%&!F9b6wI+j(d4~`AYkg_mj4TyK5O~C;8=2 z7<_F6$^An_PNVM>f2Ck>=UVFJ_{P3bOaPS@q>X|}$*$u7k6?JraCSd((rHN9RXgx7 z6>spB{q-G{xHabM>J4m=@f;)8swvXIE$wFSN-`5nFYJ%3%wA9J;xgjrN1|e$X zY+8dMO|-*2fR-fnhe$y>pamiT8wE6|48`ml9>8n`v!hjtjJyLO_uuo(hQ!3$0FK8* zF2ZI$zDo5`)yqn|{w33|TQoIHGeWt)RJVfHJYnn;TVTlB|o9zPo*E624P3VAuHn)a&5+<2;Wk&5RIP8G-T zpAe=?5aXf+O-K0)hwy~gx=+=!g8GMe8QrhVmFb-t%JXQ3nE)IC0~Cr)?R40*(Q@-B$W2<2%U9^=oCKc}*+(m0lNVv^rFCye__3Rml|*LbdZhxZ zdL)7mU7cw6lnJO249Dq|2~=z-Sbli;Z#%5x8fImy;SP|}_85q632k}}ia7A(c~AY> zMfcF_i^uaI3l~&Esz$w2dVb;Y$0rMnq2?NTtU1O+9p83-dV-Vbw8PzRv9r&ruS4wn>?{#4 zosYrN6KS~!CfunWWVGQvCLEWFSSKtrpE&H*o!39&79pCch=5eq%nc_+83l+tz`||% z5n?^&^0b?BhIP_4+0iiJi5_eJF1dL=MEyHl49X4?SO-|E28EZ!7mR17DXI7Bjk2Q4 z^L!)fJiBr88*0{3#M$r4E=2GAnvhStpcdu?3wtnDu8}-4)$o%`^UVkN;-W3m*g*1% zhvmUAiF?1jILmlQJ{9T*b6l3H1$xl=fCW{dP4+=24zZ$R zND;$i*P3q(kdBl)mze+rI@rD4vrk;XOo>Q4Z6~TyH_{O>EqO@a`SdEr$(@SHKL*040tOkWnul3iF@jq3sCq6d0BD< z^T7z?MA?BuEo#^Y7b@2jkGeZm|wa+j&u(}=C|7uR^F*k1SEM0nSEZzif$ zt4C`RO{Aw|NFaO30ZL70A)-%yTe9pc+Kod|j%w;E#C|uhXNdBpiuP~o;?>P825Rh$ zBB5}b^m{GRUPtGAQaQ8}9>e+-I~XUM?{0V8ap5zPGry6(7g3|p=h4_z5Dk7X6EzPz zg!=XBRZp^Ytko2U>kqJsj*Dm0+D_J|N6D9;#*5XC^Nx1?mpr)strGpr0=?9N^@6h< zG|JqJOI+&m)m%h1>3apSv~+v>Scx^*>}Hfqwa65+&aed82NeMH!VkAC~(Dy_m0orZN4NdCC++;F>#v97`nce z``7eNbp5A^?~(wsX3I)cH0hOXk+;w({vmQELTai(@w-PeU+49YEvtPwYDdZ+BgmG^A1cAzxj7$VLxbIs zk?5)ymQtsiBWPoEdkJX??(`sSy4!NjbO~I(ac{GXTdDEqh0TX0Xg{&p`UPzrVjfRG> zdwJ{RRZQ{YvJ^iv$L=$*E8|k>(rvLiVG4FJm|B~f(zd17U#STri?^F)I*aq{n#zc1 z?2;2#9~(sATV_{qZko<(^o1eB$6*3M03_ma$byH5;hp66i23Ds39pLoNuISwxAYVe z^73u>JtVk5OiYsB$K>0xM2<$xH5mPNH5!gT_QAuG>o5Wy(V#ooSSrZn;3^z{;p^8{ zf;Su~m!wVS&3ms9d$Vk=KQBX~@=`aI88()|MX~KRSI1U^Jk_)7Mj0M=m6e}W)higr zJQ#4ho=>?p&|EWGF?Y=>Il6c~)yzNxEUJRA(%lCssTXi5k(MW}B~Ll*VBTg92gWa}WsBa(IrIEJ z&M+@K0oq>(1uQnidnUu59mru0jsxydwvy5bMo0JqzI_VlP%DEIS@Z>FFxe(_97xtv z;p!Ty`suDt*BtI>+C`1JF>g{pd8U%VIriDPot#uhhOTiS>DmX3}UEkND&p!3Q zbPj)iklL(KF;-mPs;Z;Gu_7JQlsPmyxU~jfs_(sUSa_^VaH5@N@=clk$CK0Js3yBR z-keH;Ib7S(1Q|-f*>)sP;pGmHqi2)7H&4T)k9CH$YJf5g5deej*|UYj8#nsvW!e*S zbBf@w;RwX}=s!g6`L6NS2j)h#X31UyooH>$(vw#C@-j$ix1yJr+ZZ*2$gb#6M(h1Iu)l~KrRFq%wEv0a>QsQ9-V;D1@f z43G4G5H9{m0Gi{%dP?tR^@b8(^PYA&D)klC!Zyk2o`Z0xg~{bd}yxdLZ`!5)7c zzCb@-%;o7430$K>$Sc*A9nH2fs55`uf|ktsgdsl=!Dx^+xz-G7{!rSk6_FOH)j$`V z`mWS0W%%MR8MvUBfcoyIB42kWET*HicB^qH7t_>N3;Fq0iL%3l_Ky<^x+O`X5f}~7 zR4p8>d_7~o6t07*Gv-zGrs9PaduPN17EUx^zIU*g@^VeAW3}3%mqGDs-hanTjQME# zUUSLWI#CHXW+s?zk19cFBvf^*?2Q!x+eOl|M%IOPXB6*EmBFIrjnKUk{>dLN?H$T6 ztP^+*vVvA_zvB4yYPS$cRX0MyEyos`Cu?zfn3UyutiRuodN`79A~QZ>nwQX(C)jJogl>yN~40Lbz6iZEt?=iM1Yc&}&H^14*DfOadRSPiS-e zPOgoWoLeZFN{H+mu;**v<5g9J0}Lpx5udDXSzh`(#Q!J$iH7wxl=C#NxYqJ9m^}~h zqs(ViKLel1S&b8V0UY(}r1uVQ<@SDRQg^v?=%QUaqrA$Y{Ssf|5xTIQ48b4g4b(Ugo(7{9pjirl8EJ6%~ z-DtjbJ*Q-diB51qTuYNFVeuML3Ep9P^6f^FC6x;4F%~6>50B1XB2hyF7P=>`>&Z!j z(p$^VnF)G=RtJ_CbiF^lm!)q}$`V9;)IFpdg1lZm1(?nDdaQtSgc9G#l|CGhz;^|y z@MSb)AiHq$C~RDpUTfS!h&>MFIxUeKBiTYzpaeQary)zqN}UwOXFHPGPx5f`5bi{N zcSf|I%jNH`%moR)_A7ib6GrncMe15+y*AWwl9#7$8$~0a(5=$#=-)qB%Z7$^?1Y9^ zENs5vE(X>WmL4wj47DsEs?{)^=0PBkM9b4}k;Rn9k zeLpSSF%QsZOr|n$_YGeQ+S8HmMAV804^%X156tkxoD#?bp4pmsyh)Hyd z^)&&Mm*U7IR7jjFd6hU8rb=!PNSL)Z#c+mH$SG3N>Q1V}`qK8*uymvq*RCW-;0fu& z$9IzZ+bueM8oKR6V!^YDb>kZbG~Qe0*%S|gMy99Up;NpoTJQ1hxq`P4UF#w@(o4>G zUxb?UD&UIn&3pMZ&+>S1Qu*!e63NaJe(}Gb_h^Rn1Pk&>m-^psr@HL^Jl`$DT{WC?L7>z=@#%;X;vsrr z*tC1h%#@c7pmwz-rB3mZ_>}DlF&Hr6eaoFi_?z{(m`6X|;X?p+o~Dq4P>Zo5v^p0jaB@s{P5LMUUn+U=S(faqCZcfwo4pKk)h0 zI=*4pI9OH^2gABfMc&<0&k;u#j@O($71ov6V-bsA(*sC1Ig=mU&JC_EbQ+hXpg-Ct zmVV?3goL;L57mO0ft-tYw26ZE#);F%^Hn04pU8eqeE0-6QD9Iy5{=GL-O%;ib8XTF zVZB&9$M&>=M%O@DmF%5J4c>%Uo!+NP*~lwKCA#i~6I%CWGfci_he!unMGC#9PO zY2aAdw?0#JQ1;$+&hv>5CEIDwn}0LMZl4@HNT@A}xbjxME95@wJwnj1u)~&Ty|nwL zq+}*Q3~+8SV}Zs$Xq$A#tT~WYVhg4v)=^Trw={y5`aXT!@!R_V>;>!t2x=57FM&9#J=B{M zdK&K}{}5TTj6Z$fMQhQKNtVo_okM|}m}Igmekzer+Tz5TIKIk|dUVikzd3RqR$f+CoJh{^P3jQo$;==Q)!QSGSnMA3?JjjWU0I`7Yqt6%^zsF zG>tR`*E0|#x8-tf(lq0-QkAD3_(HYE2TQ*~R9uU|#{Ao$m^$AEJwOcA))2ZnVnyFP z`RZCER?pd|v!a7=c4;#^USi=?{!C53=EZ`NBrzIcFNO(oS~l9es&e$cAIo`c!lb(Q zr>J;S6}R5VV1V!#^=MjqW*wPNq)r`fJsDbst9Q z|DSl2{3o~9>^~C~&OCx;^ zq~$HmVT?()jZ(T>1B@#2q3E`xtAA-J#rr(8$vd=yiJ<@g}Ki=v&^c8Ea@$~xY_IKFc_>1!sYX^)^$_gkSZ}vA% znUuo-O`GDIZQs88DaJkdJ+LtbSk!OSOT7J*2bkMvKmStP7woN~1?y$x36E=`n!qFlZ zUnIz;-TW?TI;4HXWWYMG>yb;&foWJF)3O&tFV-AiM9@EGz7_71|C^_3KEV0qp;V=- z64pyssK??eXx!-+siazfgh>Lu?#p)vPoNzwF&wQ5UV1@sEJ;>83LI31c^@&x+*?l? zc`EhDe>qB8LgkK(iSf~QfTR$dXfW(F-^Ryq++!xRsz0MvG2+Z_ZYSi|_SGA+#sq~lv zp_7A+ok~QVAiu5_`U%R?Pg#3VabYBJaDid$ShNr@zHf!*$xr~;U zRw?K4Zj8M0yNj2^+Cy9UFo64~TgtPh4ImCxKI5C6NGRdj>5Qk1$dGuf^Oh#br>U_v ztM*piZL?Su^xepdy+vW%RN_9#y@zFPN?5=Hx8p9IFUv=GuE22e8?e4&pHC_?QQZD; zRGEZi;_`ZRb+yB@VT@nRXhc#G%!$JZQBz{QA3Apt;Kic5C6<&H!M1+>rV_O(;ifc! zP3K*COjZiZlbt4ceVDxWma(n09Th2f*28EK#?Z+Ca^LBf z&QE5$P;M((Yf(BjD#UvF0(2W?;@(uRFPFwy|CFR0W6w-KnVXw5MQFg>ee|Cnmk0hB z67>o84hzTmTnqXf3h~5HZngmecz)q$8*QX9yx^@MlO@PV@Yq zK|MK5%|C@x~F>RRfW=R`G30now& zLV}^!!hPhTOY8KJ=mQ=4OPucKbNiP#Jssd|{v}TT-}7poKmTv(G&QvWg#IHm9q2A@aNzt#&30ASqwB~J76i2Rp0J$-Gx zzxG2Ez9RE{wK diff --git a/Atestado_Psicológico_1774873520538.pdf b/Atestado_Psicológico_1774873520538.pdf deleted file mode 100644 index 5f3d12dead386333540f7f915dcc579c00718ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79162 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 LM9-Xo*_r)6tuc;K diff --git a/HANDOFF.md b/HANDOFF.md index 4565daa..8736ac3 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,4 +1,4 @@ -# HANDOFF — 2026-04-19 (após Sessões 1-10) +# HANDOFF — 2026-04-21 (CRM WhatsApp Grupo 3 + Marco B/credits + Asaas + polimento) Documento de continuidade. **Quando voltar, comece lendo esta página.** Todo o estado vive no banco (`/saas/desenvolvimento` → Auditoria/Verificações/Testes). @@ -9,107 +9,165 @@ Todo o estado vive no banco (`/saas/desenvolvimento` → Auditoria/Verificaçõe | | | |---|---| -| **A# auditoria** abertos | **1** (A#31 — reformular pra "Preparação pra deploy") | -| **V# verificações** abertos | 14 (todos médios/baixos adiados, plano completo no DB) | | **🔴 Críticos** | **0** ✅ | | **🟠 Altos** | **0** ✅ | -| **Áreas auditadas** | **15** (todas as principais do SaaS) | +| 🟡 Médios adiados | 8 | +| 🟢 Baixos adiados | 7 | | Vitest | 208/208 | | SQL integration | 33/33 | | E2E (Playwright) | 5/5 | -| Migrations totais | 18 | -| Último commit | `d6eb992` (pushed ao Gitea) | +| Migrations totais | **36** (23 → 36) | +| Edge functions | **20** | +| Fases Opção C concluídas | **5 + 5b + Grupo 3 inteiro + Marco A + Marco B (Asaas) + admin SaaS** | --- -## 🎯 Próxima sessão — A#31-rev (Preparação pra deploy) +## 🎯 O que rolou hoje (2026-04-21) -**Contexto:** A#31 era "Deploy real" mas você não tem cloud Supabase nem -secrets reais ainda (MVP). Precisa virar **preparação** — deixar tudo -pronto pra quando criar a cloud você executar sozinho com mínimo atrito. +### ✅ Grupo 3 completo — Workflow / CRM -**Tarefas (~2-3h, zero risco):** +- **3.1 Tags** — migration `conversation_tags` + 5 system tags seed · composable `useConversationTags.js` · popover + pills no drawer · pills nos cards do Kanban +- **3.2 Atribuição de conversa a terapeuta** (HOJE de tarde) — migration `conversation_assignments` (PK `(tenant_id, thread_key)`, UPSERT, RLS membro-ativo + valida assignee como membro do mesmo tenant) + view `conversation_threads` expandida com `assigned_to` · composable `useConversationAssignment.js` · drawer com Select filtrável + "Assumir" · inbox com filtro aside "Todas/Minhas/Não atribuídas" + chip no card +- **3.3 Notas internas** — `conversation_notes` + composable + seção colapsável no drawer +- **3.5 Converter número desconhecido em paciente** — botão + dialog quick-cadastro e "Vincular existente" com Select filter + 500 pacientes +- **3.6 Histórico de conversa no prontuário** (HOJE) — nova aba "Conversas" no `PatientProntuario.vue` com `PatientConversationsTab.vue` (stats + filter + timeline + mídia + "Abrir no CRM") -1. **`DEPLOY.md`** na raiz — checklist de 8 passos com comandos exatos + - diagnóstico de erros comuns + ordem de execução -2. **Validar migrations num container limpo** — recriar banco do zero, - aplicar as 18 migrations + seeds em ordem, garantir zero erro -3. **`.env.example`** completo — todas VITE_ vars + cada secret de edge - function listado com instrução -4. **Auditoria das edge functions** — CORS, fallback de env var ausente, - error handling. Documentar quais env cada uma precisa -5. **Script `db.cjs deploy-check`** — comando que valida pré-condições - antes de deploy (ordena migrations, verifica diffs, lista secrets) -6. **Atualizar HANDOFF.md** com seção "Pra deployar" +### ✅ Marco A — Unificação WhatsApp (dois providers) -**Quando voltar, é só dizer "começa A#31-rev" e eu sigo o plano.** +- **Evolution (pessoal, free)** + **Twilio (AgenciaPSI Oficial, créditos)** — mutuamente exclusivos por tenant +- Página chooser `ConfiguracoesWhatsappChooserPage.vue` com 2 cards + deactivate via edge `deactivate-notification-channel` +- `send-whatsapp-message` refatorada — roteamento por provider; Twilio deduz crédito ANTES e refunda em falha +- **Paridade Twilio** (HOJE) — módulo compartilhado `supabase/functions/_shared/whatsapp-hooks.ts` (provider-agnóstico) consumido por Evolution **e** Twilio inbound. Hooks: opt-in/opt-out/auto-reply + schedule helpers + `makeTwilioCreditedSendFn` (dedução + rollback). Evolution refatorado (~290 linhas duplicadas removidas). Twilio agora roda mesmo pipeline de hooks (antes só inseria a mensagem e saía) + +### ✅ Marco B — Sistema de créditos WhatsApp + Asaas + +- Migration `whatsapp_credits` (4 tabelas: balance, transactions, packages, purchases) + 2 RPCs atômicas (`add_whatsapp_credits`, `deduct_whatsapp_credits`) +- Edge `create-whatsapp-credit-charge` — integração Asaas v3 (PIX sandbox + prod); `getOrCreateAsaasCustomer` patcha customer existente com CPF quando falta +- Edge `asaas-webhook` — recebe `PAYMENT_RECEIVED/CONFIRMED` e credita balance +- Página tenant `/configuracoes/creditos-whatsapp` — saldo + loja + histórico + dialog PIX com QR code +- **CPF/CNPJ no dialog de compra** (HOJE) — migration `20260421000013_tenant_cpf_cnpj.sql` (coluna + CHECK 11/14 dígitos), dialog de confirmação com validação (`isValidCPF`/`isValidCNPJ` de `utils/validators`), formatação on-blur, pré-fill de `tenants.cpf_cnpj`, persiste automaticamente no primeiro uso. Fallback sandbox removido + +### ✅ Admin SaaS — gestão de créditos (HOJE) + +Integrado em `/saas/addons` (reuso do pattern existente, não criou página paralela): +- **Aba 4 "Pacotes WhatsApp"** — CRUD `whatsapp_credit_packages` com DataTable (destaque, posição, preço + BRL/msg), toggle `is_active` inline, dialog de edição com validação +- **Aba 5 "Topup WhatsApp"** — tenant Select filtrável com saldo ao vivo; RPC `add_whatsapp_credits` com `p_admin_id = auth.uid()` (auditoria); histórico das últimas 20 transações topup/adjustment/refund + +### ✅ Grupo 2 Automação + +- **2.3 Auto-reply** — `conversation_autoreply_settings` + `conversation_autoreply_log`; schedule por modo (`agenda` / `business_hours` / `custom`); cooldown por thread; respeita opt-out; agora funciona em **ambos** providers +- **2.4 Lembretes de sessão** — `conversation_session_reminders_*`; edge `send-session-reminders` (cron); já trata Twilio com dedução + rollback + +### ✅ Grupo 5 Compliance (LGPD Art. 18 §2) + +- **5.2 Opt-out** — `conversation_optouts` + `conversation_optout_keywords` (10 keywords system + custom); detecção por regex word-boundary; ack automático; opt-in via "voltar/retornar/reativar/restart" +- Página `/configuracoes/conversas-optouts` + +### ✅ Refactor polimórfico — telefones + emails + +- `contact_types` + `contact_phones` (polimórfico: `entity_type` + `entity_id`) — migration 20260421000008 +- `contact_email_types` + `contact_emails` — migration 20260421000011 +- Componentes `ContactPhonesEditor.vue` + `ContactEmailsEditor.vue` +- Trocado em `PatientsCadastroPage.vue`, `MedicosPage.vue` +- Migration retroativa v2: detecta conversas e cria/atualiza phone como WhatsApp (vinculado) + +### ✅ Polimento visual — sessão manhã + +- Skeletons simplificados no dashboard terapeuta · animações fade-up com stagger por `[--delay:Xms]` (fix specificity sobre `.dash-card`) +- ConfirmDialog com `group="conversation-drawer"` (evita duplicata) +- Image preview PrimeVue com botão **download** injetado via MutationObserver (fetch + blob pra cross-origin) +- Audio/video com `preload="metadata"`, controles de velocidade herdados do browser +- `friendlySendError()` no drawer store — mapeia códigos pt-BR via `error.context.json()` +- Teleport `#cfg-page-actions` pra ações globais da Configurações +- Brotli/Gzip + auto-import Vue/PrimeVue + bundle analyzer + +### ✅ Infra geral + +- Bucket privado `whatsapp-media` + decrypt via Evolution `getBase64FromMediaMessage` + upload + signed URLs on-demand +- Realtime em `conversation_messages` via publication `supabase_realtime` +- `AppLayout` consolidado (removido duplicatas por área) + `RouterPassthrough` +- `console.trace` debug removido (watch router/Supabase) que degradava perf --- -## 📚 Memória persistente (carregada automaticamente) +## 🎯 Próxima sessão (começar por aqui) -Já saved no memory system (`MEMORY.md` — não precisa lembrar): -- **Sanitização sempre** — trim, length, regex em toda entrada/saída -- **Priorização por severidade** — críticos+altos imediatos, médios/baixos adiam com plano -- **Self-hosted > provider externo** — LGPD/clínico -- **Gotcha supabase_admin** — `psql -U supabase_admin -h localhost` direto pra ALTER POLICY em tabelas owned -- **Tracking dev_*_items** — A#/V#/T# vivem no DB, UI `/saas/desenvolvimento` -- **Project Overview** + **MVP Assessment** +Do CRM WhatsApp ainda restam: + +### Grupo 3 (resto) +- **3.4 SLA / alerta** — conversa sem resposta > X min. Trigger `conversation_sla_rules` + worker cron +- **3.7 Bot auto-triagem** — pergunta nome/horário antes de sair pro humano + +### Grupo 6 — Conexão resiliente +- **6.1 Heartbeat** — cron verifica Evolution; dispara incident se desconectado > N min +- **6.2 Alerta** quando celular desconecta (notification + e-mail admin tenant) +- **6.3 Reconnect automático** (tentar re-init da instância) + +### Grupo 7 — Analytics +- **7.1 Tempo médio de primeira resposta** (card no ClinicDashboard + filtro por terapeuta) + +### Grupo 8 — Integrações +- **8.2 Botão na agenda** "Lembrar paciente da sessão" — dispara `send-whatsapp-message` com template `lembrete_sessao` +- **8.3 Status sessão dispara mensagem** (ex: cancelada → aviso auto) +- **8.4 Link agendador cria lead** — quando paciente preenche intake mas não finaliza, aparece no CRM como thread + +### Outros blocos +- **Notificação de saldo baixo WhatsApp** — trigger em `whatsapp_credits_balance` quando `balance < low_balance_threshold`; e-mail + toast +- **Dashboard saas de receita créditos** — total arrecadado Asaas por mês, pacotes mais vendidos +- **Retention policy 5.1** — apagar/anonimizar conversas > X dias (configurável por tenant) +- **5.4** — seção de conversas no LGPD export do paciente --- -## 📦 Commits relevantes +## 🔧 Setup Evolution/WhatsApp / Asaas -``` -d6eb992 Sessoes 6cont-10: hardening em 6 areas + scan completo do SaaS ← último -7c20b51 Sessoes 1-6 acumuladas: hardening B2, defesa em camadas, +192 testes -d088a89 (commit anterior do projeto) -``` +Tudo em **`WHATSAPP_SETUP.md`**. Resumo crítico: + +1. `supabase functions serve --no-verify-jwt --env-file supabase/functions/.env` em terminal separado +2. `.env` do functions tem: `SUPABASE_URL`, `SUPABASE_ANON_KEY`, `SUPABASE_SERVICE_ROLE_KEY`, `ASAAS_API_KEY`, `ASAAS_API_URL=https://api-sandbox.asaas.com/v3` +3. Evolution: `/saas/whatsapp` cadastra creds global → `/configuracoes/whatsapp-pessoal` conecta QR +4. Twilio: `/saas/twilio-whatsapp` provisiona subconta → tenant ativa em `/configuracoes/whatsapp-oficial` (usa créditos) + +⚠️ Após editar qualquer `supabase/functions/**` precisa reiniciar o `supabase functions serve` — ele não tem hot reload. --- -## 🗂️ Áreas auditadas (15) +## 🌲 Deploy options (guardadas pra depois) -| Área | Estado | -|---|---| -| auth, router, stores, agenda, seguranca, saas | 100% fechado/ok | -| **pacientes** ✨ | **100% fechado** (V#9 — script extraído; template breakdown adiado pra quando houver E2E) | -| **documentos** ✨ | 100% fechado | -| **calendario** ✨ | 100% fechado | -| **servicos** ✨ | 100% fechado | -| financeiro | 5 fechados, 6 médios/baixos adiados | -| comunicacao | 5 fechados, 5 médios/baixos adiados | -| tenants | 6 fechados, 2 baixos adiados | -| addons | 3 resolvidos, 1 médio adiado | -| central_saas | 1 alto fechado, 2 médios adiados | - -✨ = áreas 100% fechadas (zero pendência). +- **(a)** Smoke test de infra — subir pra Supabase cloud + hospedagem só pra testar sozinho. ~2-3h. +- **(b)** Beta fechado com clínicas — precisa: 3.4 SLA, 6.1 heartbeat, 7.1 analytics, retention policy, tour/onboarding refinamento. +- **(c)** [em andamento] Fechar gaps funcionais. --- -## ⚠️ Pendências documentadas no DB (14 V# adiados) +## 📦 Commits -Todos médios/baixos com plano completo em `dev_verificacoes_items.acao_sugerida`. -**Não esquecer.** Sprint dedicado de polimento depois do deploy. +Tem um **`commit.txt`** pronto na raiz com mensagem consolidada pra um commit único de tudo que está pendente. `git status` mostra ~160 arquivos modificados/criados. Conferir `commit.txt` antes de usar. -- **financeiro** (6): parcelamento CHECK, payouts flow, recurrence DELETE, - composables, máscara PIX, dashboard inadimplência -- **comunicacao** (5): notifications/schedules silos, email_templates_global - filtros, retention notification_logs, dashboard health, audit dismissals -- **tenants** (2): owner_users policies, company_profiles + dev_user_credentials -- **central_saas** (2): rate limit voto, valores tipo_acesso -- **addons** (1): UI de extrato - -Plus (não V#): -- **PatientsCadastroPage template breakdown** — 1951 linhas. Esperar E2E -- **Sprint de polimento** dos 14 médios/baixos juntos +Se preferir quebrar em commits menores, os grupos lógicos são: +1. Migrations CRM + créditos + polimorfismo (pasta `database-novo/migrations/20260420*` + `20260421*`) +2. Edge functions (pasta `supabase/functions/`) +3. Frontend CRM (`src/components/conversations/`, `src/features/conversations/`, `src/features/patients/prontuario/PatientConversationsTab.vue`) +4. Composables novos (`src/composables/useConversation*.js`, `useWhatsappCredits.js`, `useContact*.js`, `useAutoReplySettings.js`, `useSessionReminders.js`) +5. Páginas config novas (`src/layout/configuracoes/*`) +6. Admin SaaS (`SaasAddonsPage.vue` com 2 tabs novas) +7. Refactors (PatientsCadastro/Medicos trocando pra ContactEditors; AppLayout; router) --- -## 🛠️ Stack lembretes (caso precise) +## ⚠️ Pendências conhecidas + +- **15 V# adiados** (8 médios + 7 baixos) — sprint de polimento depois do beta +- **Tour guiado / onboarding wizard** — refino deixado pro fim +- **Dashboard SaaS de receita Asaas** — falta página +- **Rotação de credenciais Twilio** (segurança) — se subconta vazar, precisa de flow pra regenerar + +--- + +## 🛠️ Stack lembretes - **DB local:** `docker exec -i supabase_db_agenciapsi-primesakai psql -U postgres -d postgres` -- **DB local como supabase_admin (pra ALTER POLICY em tabelas owned):** +- **DB como supabase_admin (ALTER POLICY em tabelas owned):** ```bash docker exec -i -e PGPASSWORD=postgres -e PGCLIENTENCODING=UTF8 \ supabase_db_agenciapsi-primesakai \ @@ -117,7 +175,19 @@ Plus (não V#): ``` - **Vitest:** `npx vitest run` - **SQL integration:** `node database-novo/tests/run.cjs` -- **E2E:** `npx playwright test` (precisa dev server: `npm run dev`) +- **Edge functions serve:** `supabase functions serve --no-verify-jwt --env-file supabase/functions/.env` +- **Evolution Manager:** `http://localhost:8080/manager/` +- **Supabase Studio:** `http://localhost:54323` +- **Asaas sandbox:** `https://sandbox.asaas.com` (login separado do prod) + +--- + +## 📚 Memória persistente (carregada automaticamente) + +Já saved em `MEMORY.md`: +- Project overview · MVP Assessment · Deploy options +- Sanitização sempre · Priorização por severidade · Self-hosted > provider externo +- Gotcha supabase_admin · Tracking dev_*_items --- diff --git a/WHATSAPP_SETUP.md b/WHATSAPP_SETUP.md new file mode 100644 index 0000000..f5d62a8 --- /dev/null +++ b/WHATSAPP_SETUP.md @@ -0,0 +1,518 @@ +# WhatsApp Setup — CRM de Conversas + Créditos + Automações + +Guia end-to-end do subsistema de WhatsApp do AgenciaPSI. Cobre **WhatsApp Pessoal** (Evolution, gratuito), **WhatsApp Oficial AgenciaPSI** (Twilio com créditos), **Asaas** (gateway de pagamento), e todas as automações (auto-reply, lembretes, opt-out, tags, notas). + +--- + +## 🎯 Arquitetura + +### Dois provedores, escolha exclusiva por tenant + +``` +┌─────────────────────────────────────────────────┐ +│ Tenant escolhe 1 canal em /configuracoes/whatsapp │ +└─────────────────────────────────────────────────┘ + │ │ + ▼ ▼ +┌────────────────────┐ ┌──────────────────────┐ +│ WhatsApp Pessoal │ │ WhatsApp Oficial │ +│ (Evolution) │ │ AgenciaPSI (Twilio) │ +│ │ │ │ +│ • Gratuito │ │ • Consome créditos │ +│ • QR code │ │ • API oficial Meta │ +│ • Celular real │ │ • Zero ban risk │ +│ • Docker self-host │ │ • Cloud gerenciado │ +│ • Tier free do SaaS │ │ • Tier pago do SaaS │ +└────────────────────┘ └──────────────────────┘ + │ │ + └───────────┬────────────────┘ + ▼ + ┌─────────────────────────┐ + │ Edge Functions │ + │ │ + │ • send-whatsapp-message │ ← rota por provider + │ • send-session-reminders │ ← idem + │ • evolution-whatsapp-inbound (auto-reply, opt-out) + │ • twilio-whatsapp-inbound (⚠ sem auto-reply ainda) + │ • create-whatsapp-credit-charge (Asaas PIX) + │ • asaas-webhook (credita saldo) + └─────────────────────────┘ + │ + ▼ + ┌─────────────────────────┐ + │ PostgreSQL │ + │ │ + │ conversation_messages │ + │ conversation_notes │ + │ conversation_tags │ + │ conversation_optouts │ + │ conversation_autoreply_* │ + │ session_reminder_* │ + │ whatsapp_credits_* │ + │ whatsapp_credit_packages │ + └─────────────────────────┘ +``` + +### Dedução de créditos + +``` +Usuário envia pelo drawer / lembrete dispara / auto-reply + ↓ +Edge function detecta provider do canal ativo + ↓ + Evolution? Twilio? + ↓ ↓ + Envia direto deduct_whatsapp_credits(1) ← atômico, lock, valida saldo + ↓ ↓ + Registra msg ┌──── OK ────┐ ┌── insufficient ──┐ + ↓ ↓ + send Twilio return 402 + ↓ + ┌── ok ──┐ ┌── fail ──┐ + ↓ ↓ + Registra add_whatsapp_credits(1, 'refund') + msg +``` + +--- + +## 🔧 Setup completo (dev local) + +### 1. Supabase local + edge functions + +```bash +# Subir stack Supabase local (Postgres + Auth + Storage + etc) +npx supabase start + +# Em outro terminal: rodar edge functions +supabase functions serve --no-verify-jwt --env-file supabase/functions/.env +``` + +**Funções carregadas:** + +| Função | URL | Uso | +|---|---|---| +| `evolution-whatsapp-inbound` | `?tenant_id=` | Webhook Evolution: inbound msgs + auto-reply + opt-out | +| `evolution-webhook-provision` | — | Configura webhook na Evolution | +| `twilio-whatsapp-inbound` | `?tenant_id=` | Webhook Twilio (inbound only; sem auto-reply ainda) | +| `send-whatsapp-message` | — | Envio unificado: detecta provider, deduz crédito se Twilio | +| `send-session-reminders` | — | Cron/manual: dispara lembretes 24h e 2h antes | +| `create-whatsapp-credit-charge` | — | Cria PIX Asaas pra compra de créditos | +| `asaas-webhook` | — | Recebe eventos Asaas e credita saldo | +| `deactivate-notification-channel` | — | Desativa canal (usado ao trocar provider) | + +**Flag `--no-verify-jwt`:** necessária porque webhooks externos (Twilio, Evolution, Asaas) não mandam JWT. + +### 2. Evolution API (WhatsApp Pessoal — tier gratuito) + +```bash +# Subir Evolution + Postgres + Redis +docker compose -f evolution-api/docker-compose.yml up -d + +# Verificar status +docker ps --filter name=evolution_api +``` + +Evolution roda em `http://localhost:8080` com API key `minha_chave_123` (ver `evolution-api/docker-compose.yml`). + +### 3. Asaas (pagamentos — tier pago) + +Ativa só em prod ou quando quiser testar compra de créditos end-to-end. + +**Passo 1 — Criar conta sandbox:** +1. https://sandbox.asaas.com (gratuito, CPF qualquer) +2. Menu → Integrações → Integrações Avançadas → API → copia a API key (começa com `$aact_...`) + +**Passo 2 — Configurar env:** + +Edita `supabase/functions/.env`: +```env +ASAAS_API_KEY=$aact_sua_chave_aqui +ASAAS_API_URL=https://sandbox.asaas.com/api/v3 +ASAAS_WEBHOOK_TOKEN= # opcional, pra autenticar webhook +``` + +**Passo 3 — Reiniciar functions serve:** +```bash +# Ctrl+C no terminal do serve +supabase functions serve --no-verify-jwt --env-file supabase/functions/.env +``` + +**Passo 4 — (Opcional) Expor webhook via ngrok pro Asaas alcançar:** +```bash +# Outro terminal +ngrok http 54321 +# Copia a URL (ex: https://abc123.ngrok.app) +``` + +Configura no Asaas: +- Dashboard → Integrações → Webhooks → **Adicionar** +- URL: `https://abc123.ngrok.app/functions/v1/asaas-webhook` +- Eventos: marca **Cobranças** (PAYMENT_RECEIVED, PAYMENT_CONFIRMED, PAYMENT_OVERDUE, PAYMENT_DELETED, PAYMENT_REFUNDED) +- Token (opcional): cadastra o mesmo valor de `ASAAS_WEBHOOK_TOKEN` + +**Em produção:** +```bash +supabase secrets set ASAAS_API_KEY="$aact_prod_key" +supabase secrets set ASAAS_API_URL="https://api.asaas.com/v3" +supabase secrets set ASAAS_WEBHOOK_TOKEN="token_seguro" +``` + +Webhook da prod aponta pro URL real do Supabase cloud (sem ngrok). + +--- + +## 📋 Features & como testar + +### A. Envio manual via drawer + +**Onde:** drawer de qualquer conversa (clica no card do Kanban em `/therapist/conversas`) + +**Fluxo:** +1. Compose no drawer → `store.sendMessage()` → chama `send-whatsapp-message` edge function +2. Function detecta provider ativo em `notification_channels` +3. Evolution: envia direto via `/message/sendText/{instance}` +4. Twilio: `deduct_whatsapp_credits(1)` → se OK envia via Twilio API → se falhar, refunda +5. Registra em `conversation_messages` (direction=outbound, delivery_status=sent/queued) + +**Testar sem Twilio real** (valida dedução + rollback): +- Topup 100 créditos via SQL (ver seção 🧪 mais abaixo) +- Criar canal Twilio fake via SQL +- Enviar msg → deduz, tenta enviar, falha com 401, refunda → saldo volta ao original + +### B. Lembretes automáticos de sessão (2.4) + +**Onde:** `/configuracoes/lembretes-sessao` + +**Config:** +- Toggle on/off +- Ativa lembretes 24h e/ou 2h antes da sessão +- Templates com variáveis: `{{nome_paciente}}`, `{{data_sessao}}`, `{{hora_sessao}}`, `{{modalidade}}`, `{{nome_clinica}}` +- Quiet hours (default 22h-8h SP) +- Respeitar opt-out (LGPD — recomendado ON) + +**Como dispara:** +- Cron hit `send-session-reminders` a cada 15min (pg_cron comentado na migration; em prod configure via Supabase Dashboard → Database → Cron Jobs) +- Em dev: botão **"Testar agora"** na página dispara manualmente + +**Query do worker:** busca `agenda_eventos` com `status='agendado'` dentro de: +- Janela 24h: `inicio_em` entre `now+23h45min` e `now+24h15min` +- Janela 2h: `inicio_em` entre `now+1h45min` e `now+2h15min` + +**Anti-dup:** UNIQUE `(event_id, reminder_type)` no `session_reminder_logs`. + +**Testar:** +```sql +-- Cria evento daqui a ~2h (no horário de SP) +-- Pelo UI da agenda é mais fácil; via SQL: +INSERT INTO agenda_eventos (tenant_id, owner_id, patient_id, inicio_em, fim_em, status, modalidade, tipo, titulo) +VALUES ( + '', + '', + (SELECT id FROM patients WHERE tenant_id='' LIMIT 1), + now() + interval '2 hours', + now() + interval '3 hours', + 'agendado', + 'presencial', + 'session', + 'Teste lembrete' +); +``` +Depois clica **"Testar agora"** em `/configuracoes/lembretes-sessao`. + +### C. Auto-reply fora do horário (2.3) + +**Onde:** `/configuracoes/conversas-autoreply` + +**Config:** +- Toggle on/off + mensagem + cooldown (minutos entre auto-replies pra mesma thread) +- 3 modos: + - **Seguir agenda** — usa `agenda_regras_semanais` dos membros ativos do tenant + - **Horário de funcionamento** — janela semanal editável (armazena em JSONB `business_hours`) + - **Custom** — janela específica pro auto-reply (`custom_window`) + +**Como dispara:** +- Webhook Evolution `evolution-whatsapp-inbound` recebe msg +- Depois de inserir msg, chama `maybeSendAutoReply()` +- Checa: enabled, não está em horário útil, não está em cooldown +- Se OK → envia via Evolution (futuro: rotear pra Twilio se provider='twilio') + +**⚠ Limitação:** atualmente **só funciona com Evolution**. Pra Twilio precisa implementar a mesma lógica em `twilio-whatsapp-inbound` (dívida técnica). + +**Testar:** +- Ativa feature + define janela custom (ex: seg-sex 9h-18h) +- Fora dessa janela, paciente manda msg → chega no inbox + auto-reply é enviado de volta em ~1s + +### D. Opt-out LGPD (5.2) + +**Onde:** `/configuracoes/conversas-optouts` + +**Como funciona:** +- Paciente envia "PARAR", "SAIR", "CANCELAR", "STOP", etc (keyword match case-insensitive sem acentos) +- Edge function `evolution-whatsapp-inbound` detecta → registra em `conversation_optouts` → envia msg de confirmação +- Paciente envia "VOLTAR" / "RETORNAR" → reativa (opted_back_in_at preenchido) +- Auto-reply e lembretes **respeitam opt-out** automaticamente (skip + log `opted_out`) +- Envio manual do terapeuta NÃO é bloqueado (relação terapêutica existe) + +**Keywords padrão:** 10 palavras (configuráveis na página — pode adicionar custom do tenant). + +**Testar:** +- Manda mensagem com "parar" pelo WhatsApp conectado +- Volta em `/configuracoes/conversas-optouts` → número aparece na lista +- Nova mensagem que dispararia auto-reply → não dispara mais + +### E. Notas internas (3.3) + +**Onde:** dentro do drawer de conversa, seção "Notas internas" collapsible + +**Como funciona:** +- CRUD simples por thread +- Visível apenas pra membros ativos do tenant +- Edição/remoção só pelo criador (ou SaaS admin) +- Soft delete (`deleted_at`) +- **NÃO vai pro paciente** — apenas anotação interna da equipe + +### F. Tags na conversa (3.1) + +**Onde:** +- **Gestão:** `/configuracoes/conversas-tags` (CRUD de tags custom; system tags são read-only) +- **Aplicação:** dentro do drawer de conversa + pills visíveis nos cards do Kanban + +**Tags system (seedadas):** Urgente (🔴), Primeira consulta (🔵), Remarcação (🟡), Confirmada (🟢), Follow-up (🟣) + +**Custom:** tenant cria suas próprias com nome + slug + cor + ícone (primeicons). + +### G. Mídia (áudio / imagem / vídeo / documento) + +**Arquitetura:** +- Evolution manda URLs encriptadas do Meta CDN (não tocam direto) +- Edge function `evolution-whatsapp-inbound` chama `/chat/getBase64FromMediaMessage/{instance}` do Evolution → decripta +- Decoda base64 → faz upload no bucket **privado `whatsapp-media`** +- Path: `///_.` +- Salva apenas o PATH em `media_url`, NÃO URL pública +- Frontend (`ConversationDrawer`) gera **signed URL on-demand** (1h TTL) ao renderizar + +**LGPD:** bucket privado, RLS só permite membros ativos do tenant; path tenant-scoped; signed URLs expiram. + +**Player de áudio:** `