From fa8c39c54ceddf6a625b52ee6687cd14330136e1 Mon Sep 17 00:00:00 2001 From: armanvibecoding <219570442+armanvibecoding@users.noreply.github.com> Date: Thu, 6 Aug 2026 00:38:28 +0300 Subject: [PATCH 1/2] Rebrand platform as FitmentOps --- .github/pull_request_template.md | 25 + .github/workflows/ci.yml | 18 +- .../Backend/AutoPartsStore.API/Program.cs | 4 +- .../Services/EmailService.cs | 6 +- .../AutoPartsStore.API/appsettings.json | 8 +- AutoPartsStore/Frontend/client/.env.example | 6 + AutoPartsStore/Frontend/client/index.html | 7 +- .../Frontend/client/package-lock.json | 4 +- AutoPartsStore/Frontend/client/package.json | 2 +- .../Frontend/client/src/components/Footer.jsx | 9 +- .../Frontend/client/src/components/Header.jsx | 5 +- .../client/src/components/SeoHead.jsx | 2 +- .../Frontend/client/src/config/brand.js | 10 + .../Frontend/client/src/pages/AboutPage.jsx | 56 +- .../Frontend/client/src/pages/CareerPage.jsx | 135 +- .../Frontend/client/src/pages/ContactPage.jsx | 173 +-- .../Frontend/client/src/pages/FAQPage.jsx | 259 ++-- .../client/src/pages/ProductDetailPage.jsx | 3 +- .../Frontend/client/src/pages/ReturnsPage.jsx | 144 +- AutoPartsStore/start-backend.bat | 2 +- AutoPartsStore/start-backend.ps1 | 2 +- AutoPartsStore/start-frontend.bat | 2 +- AutoPartsStore/start-frontend.ps1 | 2 +- CONTRIBUTING.md | 65 + parca muh.sln => FitmentOps.sln | 4 +- README.md | 1172 +++-------------- SECURITY.md | 33 + docs/README.tr.md | 141 ++ google.html | Bin 3778 -> 0 bytes search2.html | Bin 8614 -> 0 bytes search_result.html | Bin 199460 -> 0 bytes unnamed.jpg | Bin 105822 -> 0 bytes 32 files changed, 729 insertions(+), 1570 deletions(-) create mode 100644 .github/pull_request_template.md create mode 100644 AutoPartsStore/Frontend/client/src/config/brand.js create mode 100644 CONTRIBUTING.md rename parca muh.sln => FitmentOps.sln (97%) create mode 100644 SECURITY.md create mode 100644 docs/README.tr.md delete mode 100644 google.html delete mode 100644 search2.html delete mode 100644 search_result.html delete mode 100644 unnamed.jpg diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..55f6305 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +## Summary + +Describe the problem and the outcome of this change. + +## Impact + +- Users/operators affected: +- Data or schema impact: +- Configuration impact: +- Compatibility impact: + +## Validation + +- [ ] Relevant automated tests pass +- [ ] Formatting and lint checks pass +- [ ] Dependency and secret scans pass +- [ ] Failure paths were exercised +- [ ] Migration/rollback notes are included when applicable + +## Security and operations + +- Authentication/authorization impact: +- Personal or payment data impact: +- Logging/metrics/alerting impact: +- Rollout and rollback plan: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 58c1be7..98d567a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,15 +56,15 @@ jobs: - name: Start frontend for browser smoke working-directory: AutoPartsStore/Frontend/client run: | - npm run dev -- --host 127.0.0.1 --port 4173 --strictPort > "$RUNNER_TEMP/parca-vite.log" 2>&1 & - echo $! > "$RUNNER_TEMP/parca-vite.pid" + npm run dev -- --host 127.0.0.1 --port 4173 --strictPort > "$RUNNER_TEMP/fitmentops-vite.log" 2>&1 & + echo $! > "$RUNNER_TEMP/fitmentops-vite.pid" for attempt in {1..40}; do if curl --fail --silent http://127.0.0.1:4173/ >/dev/null; then exit 0 fi sleep 0.25 done - cat "$RUNNER_TEMP/parca-vite.log" + cat "$RUNNER_TEMP/fitmentops-vite.log" exit 1 - name: Run checkout browser smoke @@ -75,8 +75,8 @@ jobs: - name: Stop frontend browser-smoke server if: always() run: | - if [ -f "$RUNNER_TEMP/parca-vite.pid" ]; then - kill "$(cat "$RUNNER_TEMP/parca-vite.pid")" 2>/dev/null || true + if [ -f "$RUNNER_TEMP/fitmentops-vite.pid" ]; then + kill "$(cat "$RUNNER_TEMP/fitmentops-vite.pid")" 2>/dev/null || true fi - name: Set up .NET @@ -88,16 +88,16 @@ jobs: run: dotnet tool restore - name: Restore backend - run: dotnet restore "parca muh.sln" + run: dotnet restore FitmentOps.sln - name: Audit NuGet dependencies - run: dotnet list "parca muh.sln" package --vulnerable --include-transitive + run: dotnet list FitmentOps.sln package --vulnerable --include-transitive - name: Build backend with warnings as errors - run: dotnet build "parca muh.sln" --configuration Release --no-restore -warnaserror + run: dotnet build FitmentOps.sln --configuration Release --no-restore -warnaserror - name: Verify backend formatting - run: dotnet format "parca muh.sln" --verify-no-changes --no-restore + run: dotnet format FitmentOps.sln --verify-no-changes --no-restore - name: Verify EF Core migration snapshot env: diff --git a/AutoPartsStore/Backend/AutoPartsStore.API/Program.cs b/AutoPartsStore/Backend/AutoPartsStore.API/Program.cs index 7e308cc..e0d17a0 100644 --- a/AutoPartsStore/Backend/AutoPartsStore.API/Program.cs +++ b/AutoPartsStore/Backend/AutoPartsStore.API/Program.cs @@ -119,8 +119,8 @@ ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, - ValidIssuer = builder.Configuration["Jwt:Issuer"] ?? "AutoPartsStore", - ValidAudience = builder.Configuration["Jwt:Audience"] ?? "AutoPartsStoreUsers", + ValidIssuer = builder.Configuration["Jwt:Issuer"] ?? "FitmentOps.API", + ValidAudience = builder.Configuration["Jwt:Audience"] ?? "FitmentOps.Web", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)) }; }); diff --git a/AutoPartsStore/Backend/AutoPartsStore.API/Services/EmailService.cs b/AutoPartsStore/Backend/AutoPartsStore.API/Services/EmailService.cs index a3ed3e1..a569cf7 100644 --- a/AutoPartsStore/Backend/AutoPartsStore.API/Services/EmailService.cs +++ b/AutoPartsStore/Backend/AutoPartsStore.API/Services/EmailService.cs @@ -23,7 +23,7 @@ public async Task SendOrderConfirmationEmail(Order order) var body = $@"
-Merhaba {Encode(order.CustomerName)},
Siparişiniz başarıyla alınmıştır.
@@ -47,7 +47,7 @@ public async Task SendOrderConfirmationEmail(Order order)Siparişinizi buradan takip edebilirsiniz.
Teşekkür ederiz!
-Parça Mühendisi
+FitmentOps
"; @@ -99,7 +99,7 @@ private async Task SendEmail(string toEmail, string subject, string body) var smtpHost = _configuration["EmailSettings:SmtpServer"]; var smtpPortValue = _configuration["EmailSettings:SmtpPort"]; var fromEmail = _configuration["EmailSettings:SenderEmail"]; - var senderName = _configuration["EmailSettings:SenderName"] ?? "Parça Mühendisi"; + var senderName = _configuration["EmailSettings:SenderName"] ?? "FitmentOps"; var username = _configuration["EmailSettings:Username"]; var fromPassword = _configuration["EmailSettings:Password"]; diff --git a/AutoPartsStore/Backend/AutoPartsStore.API/appsettings.json b/AutoPartsStore/Backend/AutoPartsStore.API/appsettings.json index 87a6020..63329f1 100644 --- a/AutoPartsStore/Backend/AutoPartsStore.API/appsettings.json +++ b/AutoPartsStore/Backend/AutoPartsStore.API/appsettings.json @@ -26,11 +26,11 @@ ] }, "ConnectionStrings": { - "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=AutoPartsStoreDb;Trusted_Connection=true;MultipleActiveResultSets=true" + "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=FitmentOpsDb;Trusted_Connection=true;MultipleActiveResultSets=true" }, "Jwt": { - "Issuer": "AutoPartsStore", - "Audience": "AutoPartsStoreUsers" + "Issuer": "FitmentOps.API", + "Audience": "FitmentOps.Web" }, "HostedCheckout": { "ReservationLifetime": "00:15:00" @@ -84,7 +84,7 @@ "SmtpServer": "smtp.gmail.com", "SmtpPort": 587, "SenderEmail": "", - "SenderName": "AutoParts Store", + "SenderName": "FitmentOps", "AdminEmail": "", "Username": "", "Password": "" diff --git a/AutoPartsStore/Frontend/client/.env.example b/AutoPartsStore/Frontend/client/.env.example index 52892ac..606dd0e 100644 --- a/AutoPartsStore/Frontend/client/.env.example +++ b/AutoPartsStore/Frontend/client/.env.example @@ -2,5 +2,11 @@ # Development ortamı için varsayılan değer VITE_API_BASE_URL=http://localhost:5167/api +# Optional public brand/contact settings. Blank values are hidden in the UI. +VITE_SUPPORT_EMAIL= +VITE_SUPPORT_PHONE= +VITE_BUSINESS_ADDRESS= +VITE_CAREER_EMAIL= + # Production ortamı için bu değeri değiştirin: # VITE_API_BASE_URL=https://your-production-api.com/api diff --git a/AutoPartsStore/Frontend/client/index.html b/AutoPartsStore/Frontend/client/index.html index 51a480e..e4bb059 100644 --- a/AutoPartsStore/Frontend/client/index.html +++ b/AutoPartsStore/Frontend/client/index.html @@ -1,10 +1,11 @@ - + - + + -© 2025 Parça Mühendisi. Tüm hakları saklıdır.
+© {new Date().getFullYear()} {brand.name}. Apache-2.0 lisansı ile sunulur.
- Parça Mühendisi olarak, 2010 yılından bu yana otomotiv sektöründe - kaliteli ve güvenilir yedek parça tedariki konusunda müşterilerimize - hizmet vermekteyiz. Türkiye'nin dört bir yanına ulaşan geniş ürün - yelpazemiz ve uzman ekibimizle, aracınız için ihtiyaç duyduğunuz - her türlü yedek parçayı en uygun fiyatlarla sunuyoruz. + {brand.name}, otomotiv satış sonrası pazarı için araç uyumluluğu, + ürün kataloğu, sipariş, ödeme, sevkiyat, iade ve B2B süreçlerini + tek bir operasyon platformunda birleştiren açık kaynaklı bir + yazılım projesidir.
- Türkiye'nin en güvenilir ve tercih edilen otomotiv yedek parça - tedarikçisi olmak, müşterilerimize en kaliteli ürünleri en hızlı - şekilde ulaştırmak vizyonumuzun temelini oluşturmaktadır. + Platform, doğrulanmamış bir parçayı uyumlu göstermemeyi ve harici + sağlayıcı yapılandırılmadığında işlemleri güvenli biçimde kapalı + tutmayı temel alır. Fitment sonucu; katalog kanıtı, kaynak ve güven + seviyesiyle birlikte değerlendirilir.
- Müşteri memnuniyetini ön planda tutarak, orijinal ve kaliteli - yedek parçaları uygun fiyatlarla sunmak, hızlı ve güvenilir - teslimat ile müşterilerimizin ihtiyaçlarını en iyi şekilde - karşılamaktır. -
-- Tüm ürünlerimiz, uluslararası kalite standartlarına uygun olarak - seçilmekte ve test edilmektedir. Orijinal parça üreticileri ve - güvenilir tedarikçilerle çalışarak, müşterilerimize en kaliteli - ürünleri sunmayı garanti ediyoruz. + Bu sürüm üretim öncesi mühendislik aşamasındadır. Gerçek ödeme, + e-belge, kargo ve pazaryeri işlemleri; sağlayıcı sözleşmeleri, + hukuki kontroller ve sandbox sertifikasyonu tamamlanmadan + etkinleştirilmez.
- Otomotiv sektöründe büyüyen ve gelişen ekibimizin bir parçası olmak - ister misiniz? Parça Mühendisi olarak, yetenekli ve tutkulu - profesyonelleri aramaktayız. Birlikte büyüyelim! + Proje; güvenli e-ticaret, araç uyumluluğu, operasyon otomasyonu ve + gözlemlenebilirlik alanlarında çalışan geliştiricilere açık bir + mühendislik zemini sunar.
{job.description}
- -İlgilendiğiniz pozisyon için başvurunuzu yapın
-İnsan Kaynakları ekibimiz başvurunuzu inceler
-Uygun adaylarla telefon veya yüz yüze görüşme
-Teknik ve kişisel yetkinlik değerlendirmesi
-Başarılı adaylara iş teklifi sunulur
-+ Şu anda doğrulanmış bir açık pozisyon yayınlanmamıştır. Yeni bir + pozisyon oluştuğunda rol, lokasyon, çalışma biçimi ve başvuru + kanalı bu sayfada açıkça belirtilir. +
+ {brand.careerEmail && ( ++ Kariyer iletişimi: {brand.careerEmail} +
+ )}
- Kariyer fırsatları hakkında daha fazla bilgi almak için:
- E-posta: kariyer@parcamuhendisi.com
- Telefon: 0850 123 45 67
+ Kod katkıları için repository içindeki katkı rehberini ve açık
+ issue’ları inceleyebilirsiniz.
0850 123 45 67
-Hafta içi 09:00 - 18:00
+info@parcamuhendisi.com
-24 saat içinde yanıt
+ ) : ( +
+ Bu ortam için destek e-postası henüz yapılandırılmamıştır.
+ Operatör, VITE_SUPPORT_EMAIL değerini tanımladığında
+ iletişim formu etkinleşir.
+
{brand.supportPhone}
+Atatürk Mahallesi
-Otomotiv Caddesi No: 123
-Kadıköy / İstanbul
+ )} + + {brand.businessAddress && ( +{brand.businessAddress}
+Pazartesi - Cuma: 09:00 - 18:00
-Cumartesi: 09:00 - 15:00
-Pazar: Kapalı
-- Aklınıza takılan soruların cevaplarını burada bulabilirsiniz. - Aradığınız soruyu bulamadıysanız, müşteri hizmetlerimizle - iletişime geçmekten çekinmeyin. -
-- Parça Mühendisi olarak, müşteri memnuniyeti bizim için en önemli - önceliktir. Satın aldığınız ürünlerle ilgili herhangi bir sorun - yaşamanız durumunda, kolay iade ve değişim sürecimizden - faydalanabilirsiniz. + {brand.name}, teslim edilmiş sipariş kalemleri için adet kontrollü + iade talebi, inceleme ve sonuçlandırma akışı sağlar. Bağlayıcı iade + koşulları checkout sırasında kabul edilen güncel ve sürümlü yasal + metinlerdir.
Müşteri hizmetlerimizi arayarak veya e-posta göndererek iade talebinizi oluşturun
+Teslim edilen kalem ve adet için tekil RMA talebi oluşturulur.
İade talebiniz değerlendirilir ve onaylanır
+Talep nedeni, sipariş durumu ve daha önce iade edilen adetler doğrulanır.
Ürünü size gönderdiğimiz kargo koduyla ücretsiz iade edin
+Onaylanan ürün operasyon ekibi tarafından teslim alınır.
Ürün depomuzda kontrol edilir
+Ürün ve talep kanıtları kayıt altına alınarak sonuçlandırılır.
Ödemeniz 3-5 iş günü içinde hesabınıza iade edilir
+Uygun talep, doğrulanmış ödeme referansıyla kısmi veya tam iadeye bağlanır.
- Satın aldığınız ürünü değiştirmek istiyorsanız, aynı iade süreci - geçerlidir. İade talebinizde "değişim" seçeneğini belirtmeniz - yeterlidir. Değişim yapmak istediğiniz ürün stoklarımızda mevcut - ise, ürününüz depoya ulaştıktan sonra yeni ürün tarafınıza - gönderilir. -
-- Eğer size ulaşan ürün hatalı veya hasarlı ise, lütfen ürünü teslim - aldığınız anda kargo görevlisinin önünde kontrol ediniz ve tutanak - tutunuz. Hatalı veya hasarlı ürünler için kargo ücreti tarafımızdan - karşılanır ve en kısa sürede yeni ürün tarafınıza gönderilir. -
-- İade edilen ürünlerin bedeli, ödeme şeklinize göre aşağıdaki - sürelerde tarafınıza iade edilir: -
-
- İade ve değişim işlemleri için müşteri hizmetlerimizle iletişime geçebilirsiniz:
- Telefon: 0850 123 45 67
- E-posta: iade@parcamuhendisi.com
- Çalışma Saatleri: Hafta içi 09:00 - 18:00
+ Araç uyumluluğuyla ilgili taleplerde seçilen araç konfigürasyonu,
+ gösterilen güven bandı, OEM kodu ve katalog kaynağı inceleme
+ kanıtının parçasıdır. Unknown sonucu olumlu uyumluluk
+ garantisi değildir.
- Ürün depomuzda teslim alındıktan sonra 2-3 iş günü içinde - kontrolü yapılır ve uygunsa iadesi gerçekleştirilir. Para - iadeniz 3-5 iş günü içinde hesabınıza yansır. -
-- Hayır, montajı yapılmış veya kullanılmış ürünler iade kabul - edilmemektedir. Ancak üründe üretim hatası varsa garanti - kapsamında değerlendirilebilir. -
-- Kampanyalı ürünlerde de iade hakkınız bulunmaktadır. Ancak bazı - özel kampanyalarda iade koşulları farklılık gösterebilir. - Detaylar için kampanya açıklamasını inceleyiniz. -
-- Derhal müşteri hizmetlerimizle iletişime geçin. Yanlış gönderilen - ürünler için tüm kargo masrafları tarafımızca karşılanır ve doğru - ürün en kısa sürede size ulaştırılır. -
-Yayın ortamında tanımlanmış iletişim kanalını kullanarak sipariş numaranızla destek alın.
+ İletişim sayfasına git
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-### 🚀 Gelecek Özellikler
-
-- [ ] Akıllı Ürün Öneri Sistemi (AI Recommender System)
-- [ ] Yorum Analizi (Sentiment Analysis)
-- [ ] Akıllı Chatbot (AI Customer Assistant)
-- [ ] Canlı chat desteği
-- [ ] Sahte Yorum Tespiti
-- [ ] Ürün karşılaştırma
-- [ ] Gelişmiş filtreleme seçenekleri
-- [ ] UBL-TR elektronik asıl, doğrulama/görüntüleme bileşeni ve izin verilen müşteri görünümüyle e-Fatura/e-Arşiv arşivi
-- [ ] Çoklu dil desteği
-- [ ] Kampanya ve kupon sistemi
-- [ ] SMS bildirimleri
-- [ ] Sosyal medya entegrasyonu
-- [ ] HttpOnly cookie için token storage
-- [ ] Password complexity artırma
-- [ ] Checkout, provider webhook ve kullanıcı yazma uçlarında dağıtık rate-limit store’u (yerel fixed-window politikaları tamamlandı)
-
-### 🙏 Teşekkürler
-
-Bu projeyi geliştirirken kullanılan açık kaynak kütüphanelere ve topluluk katkılarına teşekkürler.
-
-### ⭐ Yıldız Verin!
-
-Bu projeyi beğendiyseniz yıldız vermeyi unutmayın! ⭐
----
-
-
-## 🇬🇧 English
-
-A development-stage automotive spare parts e-commerce platform built with an ASP.NET Core 9.0 Web API backend and React 19 frontend.
-
-> **Status**: The project is not production-ready yet. Server-priced checkout, hosted-payment reservation coordination, payment/refund state machines, partial shipment/RMA, B2B pricing/RFQ/supplier foundations, fail-closed marketplace boundaries, verified fitment and garage/maintenance flows are implemented. Real payment, carrier, electronic-invoice and marketplace adapters intentionally remain disabled until credentials, legal/KVKK decisions, sandbox certification and real SQL Server gates are complete.
-
-### 🎯 Project Highlights
-
-- **Secure Development Baseline**: Mandatory external JWT secret, protected order lookup and rate-limited guest tracking
-- **Comprehensive Validation**: Full validation with Data Annotations on 8 entity models
-- **Controlled Commerce Core**: Idempotent checkout, monotonic payment/refund transitions and append-only provider event records
-- **Secure Configuration**: Environment variables, JWT secret management
-- **Error Handling**: Global Exception Handler + Error Boundary
-- **API Documentation**: Consistent endpoint structure with RESTful API
-
-### ✨ Features
-
-#### Customer Features
-- **Product Catalog System**: Filter by categories and brands
-- **Advanced Search**: Search by product name, brand, and part number
-- **Cart Management**: Real-time cart updates
-- **Wishlist**: Save and manage favorite products (persistent with localStorage)
-- **User Profile**: Profile information and order statistics
-- **Order History**: Detailed view of all orders
-- **Product Reviews**: Star-based rating and comment system
-- **Garage and Maintenance Journal**: Multiple catalog vehicles, odometer, service history, date/km reminders and links back to previously used parts
-- **Verified Fitment Confidence**: Thresholded confidence bands and automatic product checks for the selected garage vehicle
-- **B2B Center**: Dealer application, bulk RFQ, quote review and acceptance
-- **Notification System**: User feedback with toast notifications
-- **Pagination**: Efficient product listing (12 products/page)
-- **404 Page**: Custom error page
-- **Error Boundary**: React error catching mechanism
-
-#### Admin Features
-- **Dashboard**: Professional statistics and overview
-- **Product Management**: CRUD operations (Create, Update, Delete)
-- **Order Management**: Order status updates
-- **Category Management**: Create and edit categories
-- **Brand Management**: Manage vehicle and part brands
-- **Stock Control**: Automatic inventory tracking
-- **Email Notifications**: Automatic emails for order confirmations
-- **Payment Operations**: Payment list, manual collection and gross/refund/net finance summary
-- **Fulfillment Operations**: Partial/multiple shipments, tracking data and explicit shipment commands
-- **RMA Operations**: Quantity-bounded return requests and inspection lifecycle for delivered orders
-- **Integration Readiness**: Fail-closed payment and Turkish electronic-invoice capability status
-- **B2B, Supplier and Channel Operations**: Price groups/rules, RFQ, supplier sourcing and marketplace drift/inbox status
-- **Garage Support View**: Read-only operational metadata without exposing email, phone, VIN, plate or private maintenance notes
-
-#### Technical Features
-- **JWT Authentication**: Secure authentication
-- **Role-Based Authorization**: Admin and user roles
-- **Responsive Design**: Mobile-friendly interface
-- **Context API**: Global state management
-- **RESTful API**: Standard API structure
-- **Entity Framework Core**: ORM and database management
-- **Global Exception Handler**: Centralized error handling
-- **Model Validations**: Data Annotations on all models
-- **Environment Variables**: Secure configuration management
-- **Hosted-payment boundary**: No card/PAN/CVV model; an unconfigured online gateway fails closed
-- **Durable processing foundation**: PaymentAttempt, PaymentTransaction, Refund, PaymentEvent and bounded outbox
-- **After-sales core**: Shipment/ShipmentItem and ReturnRequest/ReturnItem with idempotency, concurrency and quantity bounds
-- **Turkish e-document boundary**: Provider-neutral immutable amount/tax snapshots and a disabled gateway that never fabricates success
-- **Garage persistence**: Ownership-scoped, idempotent and concurrency-safe maintenance/reminder records without plate or VIN storage
-- **SEO and web security**: Product JSON-LD/canonical metadata, paged sitemaps, fail-closed robots, validated exact-origin CORS, HSTS and production security headers
-
-### 🏗️ Technology and Architecture Decisions
-
-#### Backend Architecture
-- **Entity Framework Core**: Database management with Code-First approach
-- **Controller + service boundaries**: Critical checkout, order, payment, refund and outbox behavior lives in services
-- **DTO Pattern**: Controlled admin and external API response models
-- **Dependency Injection**: .NET Core built-in DI container
-- **Middleware Pipeline**: Global error catching and authentication
-
-#### Frontend Architecture
-- **Context API**: Global state management (Auth, Cart, Wishlist, Notification)
-- **Component-Based**: Reusable and modular component structure
-- **Custom Hooks**: useAuth, useCart, useWishlist, useNotification
-- **Axios Interceptors**: Automatic token injection and error handling
-- **Error Boundary**: React error catching pattern
-
-#### Security Strategy
-- **BCrypt**: Password hashing (cost factor: 10)
-- **JWT**: Stateless authentication (24-hour expiration)
-- **Data Annotations**: Model-level input validation
-- **Environment Variables**: Secure storage of sensitive information
-- **CORS Policy**: Origin control
-- **Rate limiting**: IP-based limits for authentication and guest order tracking
-- **Secret/PII protection**: No default admin password; provider tokens, identity and idempotency fields are excluded from general JSON
-
-### 🛠 Technology Stack
-
-#### Backend
-- ASP.NET Core 9.0 Web API
-- Entity Framework Core 9.0
-- SQL Server / SQL Server LocalDB
-- JWT Authentication
-- AutoMapper
-- BCrypt.Net (Password hashing)
-- MailKit (Email service)
-
-#### Frontend
-- React 19
-- React Router v8.3
-- Axios
-- Context API (Auth, Cart, Wishlist, Notification)
-- CSS3 (Custom styling)
-
-### 📦 Installation
-
-#### Requirements
-- .NET 9.0 SDK
-- Node.js (v20 or higher; CI uses Node.js 22)
-- SQL Server or SQL Server LocalDB
-- Git
-
-#### Backend Setup
-
-1. Clone the repository:
-```bash
-git clone
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
-
-
-
----
+Real SQL Server race tests run in CI with SQL Server 2022. Staging assurance requires explicit staging URLs and credentials; missing prerequisites fail the gate instead of producing a simulated success.
-
+## Security
----
+Please read [SECURITY.md](SECURITY.md) before reporting a vulnerability. Do not place credentials, personal data, exploit details, or production logs in a public issue.
-### 🚀 Future Features
+The main security invariants are:
-- [ ] AI Recommender System
-- [ ] Sentiment analysis for comments
-- [ ] AI Customer Assistant
-- [ ] Live chat support
-- [ ] Fake Review Detection
-- [ ] Product comparison
-- [ ] Advanced filtering options
-- [ ] e-Invoice/e-Archive storage for the signed UBL-TR original plus validation/rendering components and an allowed customer view
-- [ ] Multi-language support
-- [ ] Campaign and coupon system
-- [ ] SMS notifications
-- [ ] Social media integration
-- [ ] HttpOnly cookie for token storage
-- [ ] Enhanced password complexity
-- [ ] Distributed rate-limit storage for checkout, provider webhooks and user writes (local fixed-window policies are implemented)
+- no default administrator credentials;
+- no card PAN or CVV persistence;
+- exact-origin CORS validation;
+- bounded rate limits for sensitive endpoints;
+- provider events are idempotent and do not persist raw sensitive payloads;
+- external integrations fail closed when unavailable or unconfigured;
+- critical administrative actions are policy-gated and auditable.
-### 🙏 Acknowledgments
+## Contributing
-Thanks to the open-source libraries and community contributions used in developing this project.
+See [CONTRIBUTING.md](CONTRIBUTING.md) for branch, test, and pull-request expectations. Changes affecting checkout, payment, refunds, inventory, migrations, authorization, or personal data require regression tests and explicit rollout notes.
-### ⭐ Give it a Star!
+## License
-If you liked this project, don't forget to give it a star! ⭐
+Licensed under the [Apache License 2.0](LICENSE). Product names and external provider trademarks remain the property of their respective owners.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..77278a2
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,33 @@
+# Security Policy
+
+## Supported code
+
+Security fixes target the latest commit on the default branch. Older commits and local forks are not maintained releases.
+
+## Reporting a vulnerability
+
+Use [GitHub private vulnerability reporting](https://github.com/armanvibecoding/FitmentOps/security/advisories/new). Do not open a public issue for a suspected vulnerability.
+
+Include only the minimum information needed to reproduce and assess the problem:
+
+- affected commit and component;
+- prerequisites and reproduction steps;
+- expected and observed behavior;
+- realistic impact;
+- a minimal proof of concept with secrets and personal data removed.
+
+Do not test against systems or accounts you do not own. Do not access, retain, or disclose other users' data. Reports that require credential theft, CAPTCHA bypass, social engineering, destructive load, or third-party disruption are outside the permitted testing scope.
+
+## Secret handling
+
+Never commit passwords, API keys, signing secrets, provider tokens, cookies, personal exports, or production logs. Use environment variables or the deployment platform's managed secret store. If a secret is exposed, revoke and rotate it before removing it from Git history.
+
+## Security-sensitive changes
+
+Changes to authentication, authorization, checkout, payments, refunds, webhooks, inventory, migrations, personal data, audit records, or provider adapters require:
+
+1. a regression test covering the security invariant;
+2. explicit failure-path behavior;
+3. dependency and secret scans;
+4. rollout and rollback notes;
+5. review of logs, metrics, and retained data.
diff --git a/docs/README.tr.md b/docs/README.tr.md
new file mode 100644
index 0000000..a49c43a
--- /dev/null
+++ b/docs/README.tr.md
@@ -0,0 +1,141 @@
+# FitmentOps
+
+**Araç uyumluluğu odaklı otomotiv ticaret ve operasyon platformu**
+
+[Ana README](../README.md) · [Güvenlik politikası](../SECURITY.md) · [Katkı rehberi](../CONTRIBUTING.md)
+
+FitmentOps; araç uyumluluğu kanıtını, ürün keşfini, checkout işlemlerini, ödeme ve iade durumlarını, sevkiyatı, RMA süreçlerini, B2B fiyatlandırmayı, tedarikçi yönetimini ve yönetim operasyonlarını tek platformda birleştirir.
+
+> [!IMPORTANT]
+> Proje üretim öncesi mühendislik aşamasındadır. Gerçek ödeme, e-belge, kargo ve pazaryeri adaptörleri; sağlayıcı sözleşmeleri, hukuki kontroller ve sandbox sertifikasyonu tamamlanana kadar güvenli biçimde kapalıdır.
+
+## Temel fark
+
+Standart e-ticarette ürünün stokta olması yeterli olabilir. Otomotiv satış sonrası pazarında ise doğru ürünün yanlış araca satılması ciddi iade ve güvenlik riski oluşturur. FitmentOps bu nedenle araç uyumluluğunu basit bir filtre değil, kaynak ve güven seviyesiyle kanıtlanan bir domain kararı olarak ele alır.
+
+- Kanıt yoksa sistem olumlu uyumluluk iddiasında bulunmaz ve `Unknown` döner.
+- Fiyat ve stok tarayıcıdan kabul edilmez; sunucuda yeniden hesaplanır.
+- Checkout işlemleri idempotency anahtarı ve süreli stok rezervasyonuyla korunur.
+- Ödeme, iade, sevkiyat ve RMA geçişleri açık durum makineleriyle yönetilir.
+- Yapılandırılmamış sağlayıcı başarılıymış gibi davranmaz.
+- Kritik yönetim işlemleri rol/politika ayrımı ve doğrulanabilir audit zinciriyle korunur.
+
+## Özellik alanları
+
+### Müşteri deneyimi
+
+- Kategori, marka, ürün kodu ve OEM/interchange kodu araması
+- Marka → model → nesil → motor → konfigürasyon araç ağacı
+- `Exact`, `Compatible` ve güvenli `Unknown` uyumluluk sonucu
+- Çoklu araç garajı, kilometre ve bakım günlüğü
+- Favoriler, sepet, profil, sipariş geçmişi ve takip
+- Sürümlü ön bilgilendirme ve mesafeli satış kabulü
+- Bayi başvurusu, toplu RFQ ve teklif kabulü
+
+### Ticaret çekirdeği
+
+- Sunucu fiyatlı ve idempotent sipariş oluşturma
+- Süreli ve eşzamanlılığa dayanıklı stok rezervasyonu
+- Hosted-payment sağlayıcı sınırı
+- Ödeme girişimi, işlem, provider olayı ve mutabakat kayıtları
+- Tam/kısmi iade ve fazla iade engeli
+- Çoklu/kısmi sevkiyat ve takip bilgisi
+- Adet kontrollü iade/RMA ve inceleme yaşam döngüsü
+- Transactional outbox ve bounded worker yapısı
+
+### Yönetim ve operasyon
+
+- Ürün, kategori, marka, sipariş ve kullanıcı yönetimi
+- Ödeme, iade, sevkiyat ve RMA operasyon ekranları
+- Araç ağacı, uyumluluk, kod, kaynak ve güven yönetimi
+- Sürümlü yasal metin yayınlama
+- B2B fiyat listesi, kural, RFQ ve tedarikçi teklifi yönetimi
+- Pazaryeri yetenek, fiyat/stok sapması ve inbox görünümü
+- SHA-256 zincirli append-only audit kontrolü
+- Health, readiness, correlation ID ve operasyon backlog ölçümleri
+
+## Hızlı başlangıç
+
+Gereksinimler:
+
+- .NET SDK 9
+- Node.js 22+
+- SQL Server veya SQL Server LocalDB
+- Git
+
+```bash
+git clone https://github.com/armanvibecoding/FitmentOps.git
+cd FitmentOps
+dotnet tool restore
+dotnet restore FitmentOps.sln
+```
+
+JWT anahtarını ve gerekirse bağlantı dizesini ortam değişkeniyle tanımlayın:
+
+```powershell
+$env:Jwt__Key = "en-az-32-karakterlik-rastgele-gelistirme-anahtari"
+$env:ConnectionStrings__DefaultConnection = "Server=(localdb)\mssqllocaldb;Database=FitmentOpsDb;Trusted_Connection=true;TrustServerCertificate=true"
+```
+
+Veritabanını oluşturup API’yi çalıştırın:
+
+```bash
+dotnet tool run dotnet-ef database update --project AutoPartsStore/Backend/AutoPartsStore.API/AutoPartsStore.API.csproj --startup-project AutoPartsStore/Backend/AutoPartsStore.API/AutoPartsStore.API.csproj
+dotnet run --project AutoPartsStore/Backend/AutoPartsStore.API/AutoPartsStore.API.csproj
+```
+
+Frontend için `AutoPartsStore/Frontend/client/.env.example` dosyasını `.env.local` olarak kopyalayıp değerleri doldurun. Ardından:
+
+```bash
+cd AutoPartsStore/Frontend/client
+npm ci
+npm run dev
+```
+
+## Entegrasyonların gerçek durumu
+
+| Alan | Varsayılan durum | Canlıya geçiş koşulu |
+| --- | --- | --- |
+| Online ödeme | Kapalı ve fail-closed | Gerçek gateway adaptörü, credential güvenliği, callback doğrulaması ve sandbox sertifikasyonu |
+| E-belge | Kapalı ve fail-closed | Sağlayıcı adaptörü, UBL-TR/provider çıktısı doğrulaması ve hukuki onay |
+| Kargo | Domain akışı hazır | Taşıyıcı adaptörü, etiket/takip mutabakatı ve hata kurtarma |
+| Pazaryerleri | Sınırlar hazır | Kanal bazlı listing, sipariş, webhook, rate-limit ve drift adaptörleri |
+| SMTP | İsteğe bağlı | TLS destekli SMTP yapılandırması |
+
+iyzico için imzalama ve yanıt imzası doğrulama primitive’leri bulunur; ancak canlı bir iyzico gateway’i kayıtlı değildir. Bu iki durum birbirine eşit değildir.
+
+## Test ve kalite
+
+Ana doğrulama komutları:
+
+```bash
+dotnet build FitmentOps.sln --configuration Release --no-restore -warnaserror
+dotnet format FitmentOps.sln --verify-no-changes --no-restore
+dotnet test AutoPartsStore/Backend/AutoPartsStore.API.Tests/AutoPartsStore.API.Tests.csproj --configuration Release --no-build
+dotnet test AutoPartsStore/Backend/AutoPartsStore.API.IntegrationTests/AutoPartsStore.API.IntegrationTests.csproj --configuration Release --no-build
+python scripts/scan_secrets.py
+
+cd AutoPartsStore/Frontend/client
+npm run lint
+npm test
+npm run build
+npm audit --audit-level=high
+```
+
+CI; gerçek SQL Server migration/eşzamanlı checkout testlerini de çalıştırır. CodeQL ayrı workflow’dur. Staging assurance ise gerçek staging URL ve kimlik bilgileri olmadan başarılı sayılmaz.
+
+## Canlıya geçiş kontrolü
+
+Canlı satıştan önce en az şu işler tamamlanmalıdır:
+
+1. Üretim SQL Server yedekleme, geri dönüş ve migration runbook’u.
+2. Ödeme ve e-belge sağlayıcı sandbox sertifikasyonu.
+3. Kargo ve pazaryeri hata/mutabakat senaryoları.
+4. KVKK, çerez, mesafeli satış, iade ve veri saklama kararları.
+5. Secret store, TLS, DNS, e-posta doğrulaması ve erişim politikaları.
+6. Staging Playwright, ZAP ve k6 kapılarının gerçek ortamda geçmesi.
+7. Alarm, dashboard, on-call ve olay müdahale süreçleri.
+
+## Lisans
+
+Proje [Apache License 2.0](../LICENSE) ile lisanslanmıştır. Ürün adları ve harici sağlayıcı markaları ilgili sahiplerine aittir.
diff --git a/google.html b/google.html
deleted file mode 100644
index 150ddc8ba90791b112e206c185642a30c8d8388c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3778
zcmd6qZ%-3J5XQ&1CVq#CQD10VgrEedT0w*eqM(UNjA^fjQlMAw3WWe)UHv_~J@04>
z<`Sdka_#QU?EHOpX79)M8+P6FZduP7yoZ+9qD9uS&`Lwk9P=rgj%U`mcgHewFoKr?fI&e*>BZ@CpC` diff --git a/search_result.html b/search_result.html deleted file mode 100644 index d2e78b00d1379b1d1d0ad1ff0d18c20ef1931fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199460 zcmeFaX;YThw(pH^ch&w3o3KvV>?k7Gp)nRBD#iu{jV3$Cq7zU$0YQ@G*F0b0e1rXJ z)p?%(Z~pJWoL6(hjZs&!c8UV7W;SDvevH{%|KI=nuJ4<^+kKDw#`|XaUiMA(P4xBm zE%)v8t@W+;ec$)p!F7M%Lf=Z?R^N@j0lnGL)qqN__RaRK_bsKT@$5sYd+m^S>wVj) z2L0^xZT4O3JFlO;^fRcxBYlH?8|q<6PcQV1rl0eD9}ZxlXZJ!&*ZO|!TkM-_X>q%6 zUUe1)cM~3Zj+1UEL4r`G%gJ@6h|tpz7D}zOEKKV_Q^@JF4+UZSAJ^ za#`S6SBvYa@A7MX!+n?g?)E+D`?l}C#_&?V!+r1jUJITf{a#TEE2^<7C>ZB0jrvaC zrM?I1@x9(Y?|Y&85A}AwZ(42M@B2Yl;J#mwf-UIwv#55vZ%mXM)Ahgi{hLOx()UU= zW>j`v_4ZW$w))!9HSekUi+&jG`O0`r>qV7aNN>OCJExyb^~!(V?x^h@LA bi& z*fS*S30hNmOYOYY@0Nb}OZjSBv<@e)h{h`#!8uU`j^qmd*$|}Lx-QEc)$6pN+fL(O zleB^l+S%08$3;&w>3UZ5n$g?0sn2%!#>8*);?#LzWKHdjtF4!!*N)n|Bu;#<-d5DY zYyCVG_x>opeknQlQ9VuyKl^&N*Y`+QD}BETqYIMPVbOjs;qj{QwI>*+)XtQ!J}rnQ zRsXFdVo0SQsQgp$`mE~SSIhU*|4(Y|v1$X&ir%iN=F7f|8qr?gSo*o8@hqz6`)Xlc z?^jiFRuElO`N#UbuQ4yEt*5Fnua-AbPa}H9@4m*hlFDCFy$7oQNblzoriOHVTccmm z^KrGaCTM+P~Ck|AX58Rds;pS3TQPi^%$(sPIHwYhBQdqf35* zpW#4w0S>5h^rqgzKX5RdZ=PL}UR}_$QYWIZ*1K@|E%ksUIF)L>)m^`O6qQe`s^1GI zxC=?|@B43!X;IJ7$p3L-rSEJi&HDwFeXHk`zHnk)zrUv1%jwE3y*ja|mRD2?2>XTc z_qs-h #qd+phgM> zjt6mRC7aaVOMQkk9Ixe!i)%?kE=Z!5yHEk_4;>TovVE*E)*1W)WpgAWqUEKc2XxlD zFxf90qQlUa=vJhDD@i?91Igd&SE*iqmQ#DLQ+rUbl!4cx-B#idyc+zQ?Y@)hbxoAJ z{uw1C>z5nS d^h^;)|q1CsY zc;#?xQP&n0U%gkpp_zjC4 zh>11kHEL>-zrd^^!gA(m(3Xy$c;2d8ByyI~t`m(dQlI=kDpaBmERw zqLaS{HM{q7+);iimb*jn`FW>%Ux$sh^wR&RnTu|Di+__(a#vREH$_d0(mvLl*Q85k z^khJ>!2@Yj{1cuL%bYuSL#E?e-)TK{#J(Ya$DX~jAm6B6tk!$gCsuf^*3nf9dUjL# zFR~@q($g|qaz_0=l$GCU=@mG46_af$LL5JM52Q~8&jUTd>snR&i+c84f45Spi;7Pv zHL3A3maFnyuBe5J@-K)mFDWh@($kB2dO@+h?|4ordpcvO+#S6eO>Ir2XolEjQt=_J z;)T-g6+v-DSHt?x{YACR^{hPAMYTDr`^&l>O82j&*=F?=zZIBi$vzzSQ|W$MFg?{Z zPl!b+^FWd9BRwDL)Eqy6gAokt=c2}juMAY9>XC79e?eoQe|+aLmBDWwR=fDll%SVs z#mke5 vf39sPUZa 4jsr2k^6-X z3!TyCI*bD!Fm%<21AGv(!HwiSHYF$3IK^W^w!r}rrFp>5-|KmE6y(J7d+x|#ljSG> z0Y^ImahYYkgHws`9siU*6xz<^=*RWoaN{7TYM5p^x*G17?vzC~CRKi0I9hDrwAXqw z9iAt12qr^bk#%xJK=?69_NFuiBSEkHSBjDs(tmU|_jje&Jj$u`AD ZnM!T<`=QYAd`hBg^o3bL%jS?HW9+AF$rwrcvlncEo8F{9=bIOOk z)w7q9mIu;^Q{u35iof2eg)4%7NO#++`;*$+)>uC1&0RfzsJ_WJ-PivYs=cQY_cY3j zf?`@dzE``KMAH$$^H><3Q7^aj{Eo_!UEG(p#pfT>-w$f#k+d**-D#D6l{j`=^|w{? zqIm9w-cGBn9sMp#lWrug8db@6x+7cqT<~2GM7M>T+Zx5R-aS+QbApU D|)= z!JPV9P|q(^_O0~yihed#W=T*?>;Ixg_&_CZt55iESZ%yj?|Z6)?N}9dz|z|^x@El` zkp2Itn7Cg(-xbxMsA)}{PCjHoe|gH^n;IFu$AB_MF3 < z4UN#VOgF@N d8fHLlNLvgX^v_7Z7Z81{$R?aSCCG2+w<()w z+ss8b)dDT!7Y0Y%7FN+Qcw%@aZs~&FH>qo1e@0NuR sBn%ux4)wIS^sFE|qn11~6I$g=>MQ#2(^C~)1HIiZ9OXH f`I7Kzjrgs4UJ^8?G_ufk89G1lTb|Ae zLm!i5?Fa*8I*Bwx8-47wek*YWJV91Apm`*&V@{gr1ex|veox%=IK3w(xp+{bY=adF zZiASGpIrZzEY}_V(!*`h4Nr(UAu>_{!-I~dCp%x(9hXJK3%=KB-M!~}<@+(&Bl^f? zqV?&HwKyd{Aey7Z#ncmV+=QUItfyGs3o0?5VwqvxUDdlW)gUgKNHyU^QyN*@6kdot zN=+B wa9?VM a+3C3~xO?wIUmy&=*!L_UBQz~&W*|xy_ zADK2|;-dSa#*!drWx{Pyh1|x7yh;2{W_VfGgbz->=C){=`7UTPDc)p$e_8FkNff;! z{4A^d1KqI-U{9D?)jhuO58{vudjCZCS4CGaMqc8Du=`Xsh+y0vJ~XQ(hzqvWFY5$` zbvGsm(FxBbE6-GBUq94;u718gf56Qvf@?&hhr_Q*gD{@U(k8=#d`nNK1?5kAvL_yy z7yJ(o_ a(w;9oBR3qEfXkY91zI1qK zsNj^_dON0iZ$#_Y;tR4-+oIe%wYZ`_@2dTW;=6OY-xZf|KcV+;Ri2d|aL)W!q;apB zk9g>kFmPTNnXc)-IY}1TLE`ms;pDEOE>`0`*67~~tM~N7`juskn>gT!@N%`l+;R0? z*62rRp6}HQ*}XEJ0)`Lb$=~#gukP97Yq}$kdO=#?gDfmjV!vvWSJ@W4 8G@PQCvM*f%I=_oXmZbAtbBQ9ojp>Cv(r;OT;*_dpqI?>`XiU zM l#xTY1`WxQR_ej0Ux-;UBhR|Q!w zdhmGq=Xf~l9aj9YQmWeV_$4{+%fR|III~yCugFg+HUD?=e6sh!s`pQgi+lCE9C6}z z&C6$Kdab*PV90dd)BAmSI?R=ldm-07FRyb_`tz>hHC8l_$g}w%&(muuiL1kFy`>rt z _xD7jVV(VR z;e1KFe ZNG#P}k>*5#CH5#@EcZu Dn(dX@kY_?V~uHCBVji4C-K#NN$WdN;DPw@g=A$} zyhl_$F1l _hmi%Zef zZ;SCp29P;J_H=v@|DOEne0g753q7%^zf(y|>}w3H=waUBvgB%38e&T{yrQwb74^s! zel5NXt-B!{jR?c9WEbY8S)U8b%zb|l=6(`($=$pWudz1hkzl i%&uaim6`s{)*%1Zn)7sagj1C4NA67)`^m=X`oOI{YlMGr-p2O8hwr1hR_?05C- zUNOc$p8PP{VZnG_kXJ`~S)-g127VIHO^TLpG}@;si?_r28TNmUrCjZV-d|Py1!>FR zxj*JeFA8e*9S+sTip;RSU`_vbL}Bu%(;6ppb8p1KkCYi15e|NkT(QdHw(L~)YQElB zL(*7raZ%FrKz~Q||FP)7tl2YBWL#8W9m$k5-#tB_RoM-}o@w)?B`u)*Az6_(l8{-+ z$`fgWF<}vn{78^7Q~pF(tR7=lV_)N7on>&)mxl6FEKHtRTGvQe6T}KZb_KrEDCcyC z)$*fqT}I)?+T?i8$t^s1sw$-u*q%a8&l^l{oK(_- ZPjqZU)Jf$bw`u#!A{v4xa&Z|0F=DhEVs_b!}5qGnm z`9sq5tW5ktmf)`LFKWDSFsmwwZvQN!eV<0#7QOFDr?OXdQS^HyeM%I|{$w)b_ayVf zqWrMNPXzx&($4H!Dc^r&o?g~ypmN)|u_ZrBPFdTI?dOC7Rtz%dIik_OPcuqSRN|%V zKYOjA{-1%~8-lpos2@pZ!`G}$<7|Ol-9J(J31MkS^k;3TGYPDTpVGT?dj4k^^@Zfa zRAu^-C`Oinb#%M>zmoJaGwqi&GU(12uL>9V6zrk@L0s_lM;m^`s%#2->EFvjvchyo zlJ-LXS+#mg+_|8iO^pNZ=SMwX(^ZaH2flDz5m4R}&e(Y{Ax>e{04Hhe3zj`yU(^UL z=`E|dhJ;gMIQS`JwO1(r-1~)M#p5f<6tlNT+mg7DHB!sEW^e4tgX=++s+RkE-{0k@ zSJ!{CI`KDQmNibXx~*RChP2w8Fzz*?&ihB-?QO27R$q&cwzR4+;NH>7gf0E92x9h= zusVn}oJ+cjmFqsQCa*wbb>eq=&;M`r1GKCPYu5W&C4N!4=#{x$yh!5WGqn-0zL*ua z{CWpf%%eRP$Fa+!dNu^o%ewbfjmD!mlW=`nWq(%LUlI*`#cIzgKG*exm8Vr|fJb&4 ztO^2JH3iwfQ^yD`o>e(ka!jbFCJop19=KKx@WXn{UDaS6K)<90&Y&08PNJ7qRT7+f z 3_vMP_b)hk?srud#eH^z2aRGR7R5g?N?ko2E-1F>fHbb|D(bYtw^ zV$~)4lpbmP@B%y27&R+yPo~y aHJI5gz!9`9XZ7sP(TTu_W&ndx9fO5TwTZjn7CspQV; zy6&IV+Aj%LZO>1uA6A^e1MnK_1i^*( lBm+|Pj#+A8;(XgT(jI$Tp zl%_OV1_}%aD(j1%b=`Ir)wKg|XI1i<1Yx(5oP=V@h_bZK+Q{t=45wRU3@uXElpa6( z(y&dee`AN!qFO@pK%@8KH&%oqd+@~>>EOTX>8JLUaeY`HXEX!$jqu=eB=V~L%z16K zo79X}s@%ZJc(@D><_rz*NkA7ix#1gWdd7{kvYsyUv27P?G=mGCCQNaf(qhur@Y+`5 z8+1APk2U@9&w%=8UvQjRMmhM0v#6k@+YTsm4`>GXl|Ak788XGWEz}`f^+98DX;#s> z6 ^Oy#X%8n|66cZ`HX4orkq{-A|+c;at@m_2=#dzWVaL*ozqyl`Ku`Ny98A zz4VPR+kDf;%|~k$pDBYqgU{L5iIieP!bXPGw2xpr 0ceL_RI_x{`4mqc%XH+ws{WwuDivj)9sXf$GJDF+1=E2Tq^-4i{~+gOusS_VplSMXXC*wpWG;s$&{ z_Db{jtXg0v7k3-_oz?HIezyyq?43BA!E;JuXFu#i)gr=(vzgdCwW;^k^1x($i#5aB zA56A8*Kl0Wn+`plAg7fxYBfh9_^0eVW4~M70 rc&pF&G51DSp2R(;ooE3mK6d%B!xAk?5xL&E@A$7KoO)6`KsdznEa-$-_9z^ z@|#tS+ *IjQ#RxFLMWbqNqbe#16aDYO76)u(Qp20W6(SEqDt)!h$kRpVRqN|A}kZGmIBq z)num=P3SAm79vuk6nhhqW==ieiv5%1!NFYYQUs6SW=`+HMYs204=JM!_BnH!5AAT8 zClOM=G$4CrdC$&gc1f8xskNmySa;XuOh3wU&+bCB$u*Us-Cxo*^?`Ure}B_B93^uK z;SJ#o9g7D3-?}2sA?CfNd-g()ru*t0rHpCfX>{{-)kpe)3~Py9Aa-}ubtc&x@b5VA zy6SVTCpCVS%-{>X*VUq~ZXR3_dtW=aBYwXwxNium9C6QT kZowqG@#wB57I&z)2l{yP8b Yp9;ej6C_InHfQa6#|END3qt2 znGSWy3=JmfS?% 3nBIv<5?{BfUX4GgZw70@%D<%99GW$~U051a)JkL{#B^H{f23(&cQu=@TxjicLG z;*CevOYgwT3B2JG_yop#>YsHoRamd9WVyS4Kyd}@P2d+e dnv zE29VTknLaKL7;K6$BQ3T#xa9>3m?;K-S@=)HKU@);oK8 uRjMO zc%PU8@12q2&9BQsAPr=Wd`E;puRa@vEArIL@o*{@wZR$lLve~2UcYlp;bnYmz(ri_ zx4)?kVs?Ct@|qFl8OHaW68X%RDEp0SQ!~7lz*u!QkNV8F5PRGZ_YVoeY7Z-V(gtVr zoHHle8Z+27+$$YCRWlKIPR3u9Lw_CaKiMP8{rJ=#w?e!_7Gkg~Ega2LqD~JoIK)x- zN{;uS88b;lu^Xaz!1!9V$sfgOF5jiODP|hUXK)S!{-AT 1o0X9i9EXi<+e3S;!>o$ns;G- zpxcb _*oab6ZwLlIh3B%wLKS9sP78;~w Jki|RWxdZWV*|hG%(x!r%>gBGKzHk2m21Wnk;6pdZuBg^*)7?KNxil1 zftH-lX08Noj|@MK6844a^Lg+=)kEV6Q9*O$1M($-h8byE8|?VgJ~e{8fo&+!7xDaI z?+r6^-p W?O(T Jhk_TUS>|y` >FLe#*wGvoH=EIPEe0$or zN6K^P=e0wz(t>OnrO;h BP*gmSYf2(QJLF0UZ0MG$z#y#Nwx5w z>M{3wQ>{C9nq?Snq37r`zj2%sIOW?E=rC6OEOu;0`@1%-x1ZI-DzP-SC@4B7SwPDU zNXL`;TN5?;+6NIM=N+RDu8I5cY2Z5a8YjEpI}rWyY*0_E2hjoKz)M?z{BZtQ={pj~ zkU6Jzwq}kbi5l_m$x(9>)-Ni17#G#wk=bfny;d*hGEINdb7kyFKvS^}hnWfcCF}A_ zn(MHt-V`2y{gmumH|yBv2#*XNWGzUuT=w%gZwzjJ-;rAUMtmv!U0`m{K4PDZkM{RS z2vo>EI4zYc(8BiMUp7~uarUR>ht+P_GIAM~Cg)lQL`zoAp()Wf8;Ls9E4?^pAU-xI zjkdN{Yx@4o!oZ3AjeIUr#abo2aQBZSR7c24u{t;8NXdDRI$wCc6zM_Vkx?fSg|}J7 z1_i9e_H+d`@nW~cEl3Aa5xzE0%^l3jEDBoi2CtR*A4c(B&%65=U^4W2E=|w;)O$Ur zJiyHkA8^_?8o&@o-MWS(PHN)Fw97UL%|Q!DGMdA))t)7PrylUAnSmxM!M7r&0+Tz! zj$?;9q~8m3Id&kDA&23($a6| *v@ zaN$B~YgTiCri68=*IXQ3yZu`VZUb9@1heYe=d_m)`6NwN4+3FuG4=$=$f$SwM&$L* zc JmpdGmXstta~)WZyGiJ z)miCWW`2JW^lfl5zYClJQ+Qpp+8b0^-jT-)ACdw* 0 B7ukmPch=SA zJ67tI_jnQIJ$`t3&p9gPJv>t0Ge=k62M^(iw~yKDv-w5|I|kycZnsf==Jm>GaCR*b z8D=b1OS1lzi~%d+{AFF%BS3{H*F68bgc_St-m}u$K7Y=*g%(AFlwK0^sfVwT^o(o$ zTx{xuSBvhzO5}WEhTJ2VN?7n(kBFN1CL) <*gsKGAM{WOYvXAR9v-MZ?)y#pOx9p#BxiB1`Pt`|>TpWV6csiXlAl4*_{sdb{y z60c@qtVz+Lj@@m)@nZ22*z=H~1Lv7DIQxD>xXAOgl=n!zb`5>%c09KSA3?cKqub%* zt5XpU!{6(5wDtP7n!SuTJWcWq%t&+}HLD0_1Qis-C&I4#OD3NE$@T*JapnlV2s0zA z>Dn-stvG*0UU52c5ML}Y&$Q#%nHG479n55Gu=IQZf@`uNyrV7nfjLLsBhhgmWf%kV zF3!3T8+e|T^7CEZMcv05IcN03b c__-2yibDGN}p9}qn#*q)xxb!f*R=r*d+%VS} zme_NcjE41~@Rlt)E0|m|V9C!7FLRRR_?XFMHjaACciB&Bo2PT%d>M!{+02_rU75l4 znoIjqlp54~=4RjybC35 %|YdUyfOIgo>*CF;)Vs(rNVSF!}oYINu_R=QHpU$6mcR;$xm z;DBd9zN)9CWy62m( 8 -F|z5V2@^9hO%}vwoIU`rez04vl${@Fv@6X^q|Xrpw;l)e`c=e+=430eNJ2z#fx!XyBZTsTb3)7x8 z29~y*F}n(FAq?-DEazp7>WQS}zA*k$znlchcSeTvdqu5yW#5|cwWK-5J=va1$}147 zU(sIn7pnhIbevD#=6%JE)*;LpIWLV(@%MP<(;Vfp%B*O&%&@#X{I)gO{W+b-!xy0T z1>JM?Jf?WrzB@XL6^#RF9W*B)Gh**8W;J$se_Y&sEnIZ}%5Zqjdr4=KUytvF`8#v$ zSBiJu@5C1debPMN)aA<|e5dKUexfZ$va7-$J1v_0969n8@n+5{6HipvYc_QSxqSGa z^@NA-ctE3Y#sqyGc8&y5d1!`f;)P!9CmtNKTkfbiFaD_RXd`mGElxwD@zoS!B5e0r zaaZ>oOBFYD+?6XS1KVVk@zR@~6#JWy{!-7tq4vQ%8@QfuL`>iQ{Wi~}G~vK@mDD3z zf#P0M>xh-vSNdiyq#Z&|fMj1iaWE2!_XNy92z)_nqHBAlP#(VFO|!o`RlFMHr22Rx zDDcw!g*5Qr925R$#PPHb%;g+m>{Y`*zz?Gg(AZ {7r53Ij&Hbn9>QLBsb}o7z+G+GN>j2vMz0I; zyQ*9u)#L%T6^XQ+@?+lciXB!?qg&dz$apJd1BpWi;9pkz^lT9kgUhfwf_CBm;SPWK z%|pFGceJlsU`9U1>p92J4rD&yP_JO2Ew5x{E*`I#xs+8|u{y8w)ZTH{(BT`eYV>DC zPtI8yO!*c3XRgtv#L-;8Rm(i*Cr%jR9a4rL>lQdmjA)shRo*W*B8y`GKUx?Oj-XJP zp>LiWM9#-P J)aR CfJHO0)< z;e5u5Wb2lIbUtDH=<&mQ?4JR k42WG&H^y_PF` zF?WzdXoC-n @G?t;e}C2ia4Jyu&Q`(dQ4ZX?cU#{*d`dZ5pGyVNe ~$}daA?K$OqchS>;{H@C8Y0%>Re>Mvuo@3Z%L8Qph)3bF(UgbsDUDu%@#g z2CtT1(Ps7%i_J+JaLa3HLb8u>SLWxd9(pd({+xDfZ|Zh9?3L|Kw@4vY5@Z{MexXi% z3|{jC-mtNyoj8@^fXFILbw&v19Tpd`Z`8QpYlzm1b>FR*y`)%4&-1`Fx6~%y3_Jt` zo(1~7dy4Cp&YlxlDKu^S4&$a(SSd<-?{2sK#^h?6^}AUW$32JbM#h#n1NWUIk9mVd z;b$l5FQoCQ?z09Z=FXbJyOHY{upi)&SId?=lbd5Gaqubolo<(eM(k}_7q!`$xTOD{ zGeaWCr`Df){Z!1oc%NI$8=0O*tzW3Fia?hyrI=|TX|if2-)nGP22aCRk=+Z tYlGx}G;3Fon}aw7Jx5Qm}321P?O zti7~yA3Jd$xyUGoWva^wd0qShv=|h__SzrdZ!f#l4FheXyPT_rimWiKpST2^SPmk$ zh&|%j@#3>twGGYjd?N2kmhrT*d`J;%{P1Xi2|GsV|CEJX)Jeehy0OdnboSKxRjRGU zeMJ +PxzF+S0hcc$Xqm)5w9e>|^PuGk^2269%K zV7E)V^_#p8=dbVr=z-IPUMEZ41`FpSwa2x#=C+)0%s0YJTMJ;o84K{g)A0iEHH<;i zHp)aEt8Ur*l@EwAj)LPZGV0A5^=uM&A+GlvcO9qJ2#!0D96X`-vI_NbJhdl;{vhIG zH9aj4>aL`WxnNgP!OGTdv=|UP_64B`G6+RR5=HD;;e{?~^!P0qXY@s6$#_DKwc-D* zYMS!{aP4hfzGecd?!Q}i)b-gH2T0U{i7B*xO>=8*JDfYwhMZVFGXQGIWZOh7g z)?qFu4NS=_Ii5o;<&!x&BorJ)_Q9iP1r%#B;AnQrE=vx{M8Kb>3@5%gnn5y4dr^ L+e9V{4eB#wK&XQGXELtRcyIwb2`sBQeFX*uMXt*p#fqi>V-i2a% zpkFM R!?8^Z|`}?YYli>-; z#A~F?qUPqX1EpoiXF_0^iNjtenxfaLqv2gU r zvfdqkaI^c4vN@)SjDj)ANV>HixC|Xe9ux^R&sr*xy_uxn@ji1&r1DXcva%dD$@fTV zdp*8h3TKz)uu8OF>P|dVO9iFp4>G2&C3(<|4Cu9kj6_uy{1%QkkJ7%aog?jP=8i19 z*Mo3nY*pov*1>1 EeGYn|4lDmM!eGbYRcnvJ^ zF_|f>?S}*>r(m+;#L#dmtlu3UqV_&Ad?l}-!6(Hd%<+b=%)K*R!5O&}+Sv2)=7m+= zKhqPRzjjjm6D#d9cXO^9>rPK h1OL(vC9!O!Zg)GBnoRAwl=q^cV?E;fNhR2hkNTxOk9b_ZzE2qAX?_Ou zh8A4ZYfYs(CzB1%^`_F8T`SrLN3?Hjq0yoj-sE1Q{6op6%X3wh=RTLGMY!sQX8J8N ztQ52b_gSB1Ow;re(8}JgjMQh}$Tqp^%f? (i0C`XFZqmSJP^5J?RVl>$*=x@9nu% zv`+XDZqwc*Sj4N#ard+&iM$yrTd)u0k;o+MOIA4JcuM+#wTa$w)gGM#NBA+02`Pts zc~vkzu_OMfE{^?B(J#5YZFzG02lAaYedNXL)q~M9YMr0(a$m*&B?K3OBcZZGCQk#WbMrN+7? zjdVj=;$ez=JYz)syVcQA*rq}KhCSome6p4O^3XX^dR1?)rxw72H5)#l^VICtVx6Az zshnL$Y~qu$$z$ 1^k3wHz8a_V2KZ=7aoX>qEEh^+sovnJoMG zTjGUR@3D?N>_x#f~fi=Y23&RENVSadU<>CGn*FMLD0ALh0z+tyjyNN?3?k5&N^& zQc@$v8Rd-+Vs!5dD)AO@8*_$)Oe&El{9djF8`pCzk>~Cm8`j4Zxc!?-dA$;TEZ+}) zp#S@VHhOQP$lqk`7KIDG7sd{Z_R=w~D9u^}vdXL|XC1W9>g lcSk=$3M7K&v5sHtt*eV|xTRrS%(HqL!HkK&VOyt>C0GoScF))zhZjp{fqWZvE9 zb=bFwvun1J<|8KmS@dND%^JC-GQU@C$C)EmC6?`!D^9tb3-hZjMzy z*zg!*b;g2xxc56#jvZ0x`i~7iH_q9iCFCy8^JHv#wj{;@R7A&tFTSP_Fyya$aW+6( zZ!rTDxyJ0-Mtfxa1NYr9z!^k9+`Sc6%LY_s&L4~BtRz=$5E^TBY_$8FRgb%j3#xBo zUhAf$CC{8iW +ObhOZ12V?CZ0 zSm|&>@Dd{>e^Tz-cGjkRQr$I8#<#5&HUSMz_8;E|8$ukqrEe7AM=}fQr>xHBtur?_ zD|cQKUa#kUiryyzzITc?J>ygM$1E~&+Oo ZTyXmHs(b_HJv`&qt(BKYwlX7(ZwlY|j7=)Ch66sI(=R>(nMP-$@iTymHFv-< zD~hcqT$yvL9POFG-{f_9{%~LanIqZLf984OET4t+g!L5N=(Lc^)=N~e$}FXMzABjm z+Tnt?T$jUuE-V9aHKSp+4v#V0F6aqw=2@m()*3(L?DtAl%p!puW|Dl4Sj=ZMDP=9u zcFHPx@;K$k(#X;GaHr>Q$*)_#M1*l&5TQR=!x6TGoO(QkpEgw6GtbONGt0_pM8mT3 zWZ&?E29lTcpZaeJJU*QCkA*~^FdxpTbIj|k3i{@$b2+zz*2?oD%)t=@#Q6y1{E#=F zAz&HI8i>90&G#h_at0*d09a1ruD6sWmsqaZl4X)Fp>h5PBk^vFdONJ0MB}5&;5T+q z @mVuP^3U;0Siu(IUEmmDtRXbzg0U&m60qqDEv3$qBxa zMkSX|6i$wq2%jv!{XV4EnZN c_-Yupj8(43y#|2_DuVjruB#{({>mE|4RNhEwX{jO$N zxHo3+CEahD`b;|Ztr^Ro+Meg;;gD*JP!9QMYBS@%>I>x)x(8BD10F%5E!T!H&boBI z7Tlo~$S*bRGrWl2;EXida0^fdUNVL99F(6it6lC&cpw;9&(pp`89&lk?PXuGF< ?xMOJ6)U+noxh7GXP`@YM;m# z+fnZ2 MhhBxlShB57XNQtr$~$K^hdk2u|^d`@iS z{#iTxUixrZFje=_ {Q5YbCq{} *t&Rv7@S>4H=cX2N}Ew)hNvf znqDP7T-~39@2dW!_ax+q4a@%5K6dY8pOj|*Q8MyOndQg&JF4C5LyC2mrSGS7^;i+c zYgy!J(O^tD=^gE>e OHn#MMmn2q=uZQ!*#SpK#zW59p8 zUDny~t% Z^|C-l>X1lv*N3w%^cim)jXp& zzv(yh4X~3LCVS0{FM7Z`_4^yp5l lYv zPmY2fslK_tUs&o-9uHS_TUVZ$+)iso4$m z$h3y>#7V(8thMT_9tT$|egAQSukj(nQ06;D0fqyJs@Jm#N@q0IR0n97 Q}jqVYE0_>hODGl#hlgprXk^IRB}R$2_}|xRfoES$8f+K$SZB$(n!d- zoJy1iTb|8AYru)lRj=r3q3^#{()}Pe7gCSsRjNBz(07S#B&?iuu5w{nvdTSG3N_0C zX_X3`N^322OQQwucCKb_mUnHM6#PIzX7}h}q3<8!Lu?j4KebBwwVgPW=Xy?yR-E8= z7%iE1&$J9VtB##{ery!*(po9~@Fkqi9K|VlT%46zrRyn`FR2x6LnkabG6Ka|eYKP% z4Q{8ODt0X?Q6qRFOC*^0%pq8hm6Avp=eA&P$j{eXZRZwFwk+!e%vEV+CY@85gUXYF zpsKs@58_NnPQY|&Y?Ie|WNM=$y6Kft*Oa5I;-`Hi>@@ YN44Hx|2TAinv< z+Y)X+$=pf?AG;6{3UZAuW;95f=U#f_?`=u=uWAV{|A%`0hwlEN{_&TPg3t&=ON_l= z+P+` 3XKZJYD6Os;;in%cFNrmDMD- z1?{-T?OY5N37-c@Sl`hv-TGcq>*&*2n1Q~3m!E(neTg45$A_eCBd-l*yxIke`X&2D z9?5ao)?`lMOF2j&obULUGR~UAZ@DC%1QrYn+Pw@jEhXROme3^lq^oKHtaDN=?GR6p z%_3vb-;uU vu3m}Go!a?p $hM*vOA&euIjifjEdBUG_WHr dkHR zR>ck{R@-wu+$W+RGH_KXC^1Ve8Nd2sIsuPeBivomFS#+Y)%pH#OjmnZl_p=%uUET6 z!+NYxVgn0k|M@T;@6N5&@sT0Go26Ggx! xN0y(DtytQS|amH{W%`2xu~Re_?y5L^seip(kF}l!KJ^SN am!)V>&j*ACwbouUKz55RbpNQ?}; tC)M?)w)#SUoyMlm;rmh9F^C$ zXPP*=%RFMN2F1KK(U#NxHBv-r_&xR+l^QT8<*Ye$B8I%LvM&|ye-LjGDL+!}NzI-x zPxnC4(0y_9oUHsE(e}CKV(zQlOWp723FYso{+w*wbJ;cOZR(lZ`&D_U>BI*=sr+ba z|BiImetQ2%7 Rf9s!RFFbjI;`syDBCaN=C&`A?nlJbxy5*n@dTmU}_{k1A4| zPjI|fA8V?2N%ckq*N|%esAn^3pK-3LzY*Q q&W--IHs`%iU`e8TWPipy=?t$};#?AdBUG<7Tmm3xg zFNA-_?cJS|f)zQNP3_%P|7*en@Brtd^#5tX``r#6@z{Fr*X=$|@GdAq0PdeOo;lf{ z3u#=82jAeX?soP6tzdkg=n0&_@kH=F7F<6iIPN9>GJfBu_NwigKd5&{xS!L1+T#p5 z(`iNjP505nFO++)KH#sNRDM+TW>s%g&&`il^dI{E+7tbrtES # zfn9jyXR*fE&{x6&>$(QgSJJMCV=gA0Fr>e?Bs*7i&;F>1&K=Jwby@E?E1vs1dN zEqm%Qw_uO`lG+G31FG vl~VX~P0uR(Cr9}kxn$T!dm#2? z42Ln7EwLjoqCNcfbE1~_Zh=)iq3~sL)@C3{6`s7;pZHAu<7W6TwRk1fXpmSi@B;Sn zFgUm0-dyI23DI{#)Vv^SzS3V}%b4k?wm4tB$ry-LFN}Cn8Gw>fa2t6f)=)B+%8K#Q z5AnCQ*98@|gKMf~oatkZ3VzJKShtv|J~vRtY4vy2c Btwl4hM)R>6SSEts#&s} z-4C4BW5{@3=jfwm@)>_sE At|FsFxSl^uR`25KEoW4a<`( lP>EJ1{;vdd`8IvaW9p_x!)Ae3@ z8qbE3mVcsto~p-TLG(y%z3kMX)WdW=EvW8G`@cMBk9YL{Jk90)An6>}+e!UE@rdiY z>H1Pzh0ZT!%$oVKTJ23UqpJpl=OzcRq5#c`%#hz%7Ot`XM7_i{hiT+0e~w9m!s9$; zHH0H{%@Cg;zkcBaGf1 __PtRr9CJM==|FzSWBY4(FIT-w}Ae+?SS){<@HN7R(6_ubO0bi2aT2J1(pH zPwIR6oHu6{mAO=Q2jTyC4YgOel1K7eyeaS8s+Ov@!44=^gXUFDv3i~r?W{{?R~ArJ zTVXYA*;jSf5qV+c&MUUzLB2iVRd)U2C03ZRvTjiSHx#A%+c`+|w4Qi90DBKu!S8m+ z;39w5^qw`YtO+M$%aav7v3=nVsPWu6$<{mP&_B!-vk!_@+L2qwyI`fM*Til}m%LGX zV8W|m>*ZMc8Ev@^_W>;{_Stoo%dofYks!e@iF)uc^N~P~_QUtY!-@GBPQYTt;d+9U z{Q-=Z5th_o7Z$q=!B3NZNAnOAw@xD)g&rlB7^8Qtu+Cj%q}d0F%yKeEFMQTZKkXdY z vU*E7*Eu2F~*u(s;s&MkP*MqWY{!P4A(Dc88syHF1F7N%d_$%iqLCej=mW z#sNOP0p7xc!k=bE6MG1WJ2{8K^g| QJ1(Y>Ae4kgxV z#6D`Y@sRMw>V~rkql_)~GNEI{5yES|NGfpNgh9o!%Y(wY4aZEXFl!&5c8zjHELy&={P7=d1!eh2#x(DB*py z>{;@OUb&9Hg;cNQSpoC|bv%yf-8)g-uTSp0(1E6X$9=gjo|!N#D|!oG% }-SEhM zO1RqR&sEPFnGpv QLH39tlep0 z# ;2zJxYku$;my(|gHCTIq-NOgN+wfd+btf3o7-ut4lK7eR2dtJ` z=vby|uXVV*kJlEqUf*98;GNs>ZVBM^x0Ii&FEYMRc3M3GCF@7M*K<1IU@AdAegK!> z-BM| W&!gRFEB78Jb9H;0rQ9u wT zEG@f`;B0byw!zNuxh9-a#>QoSIcJWE7ROXOc9Srp&MXofi<~)A%*t?Jf* si6Y_!wK+T0YkacxD^WP#&CktubDk z_gUcGFjg#c
n8uFR?5=KPdj?dR~7A1<9~}IFXYQgDOkubGl-#^|GE0>v}|g zucVo 3~d7ktL7;M z?x@E#(6Xw+(9tVb%=H9p?D60kt6=HXBf8LedQta&e^G7vExouMdd~2(znGT%bU9rE z#fWeWL~sLtjX7hF@>kUgV*!5`#T#5vkA8s$UBTKFYG3N$+*h;_zwDD^w2U0O+|z&B z8B(kBot84?Vw_Me=w^(YZl p%%- z_G{#(1rRe1V1WuiY|0rra|=|vn#KlB7#%dDolG e2FLwZ!b6wYaGjv~oRTyjMzrN!D!|@=IEQx0as38|M kE@dGK{bPcL`4 z$dmy8@It13e`@1GD$lItWl63v^e#QSkj8@NMlayqqXb`9)i!)Xi}63V99&PE{lW?G zP{*7KjJ-ifucHZyfR888@SXkxpW$L`0Uu8cA(X*yx1`XHc>}Hr&SgxdFW6 +q4VGeG@&82h7WDvHZH5BfZA< lZhoIe{kfqMtQ>Q+y!Bd77Ju=colgy@Zg#I>_sf~15f5G+e&c#F* zuZT3KQHpXN4f3(9){H-BXsDws^Xx7Ov}-DD7{La3@Y+l2xewX_@_+?N1QOZ^z3Bd_ zffe9g?w@iQ0@p(C&^orua0YcO&7u8GX?iq=1)U9x$6+mEtA_lWW5PZ_TWbxj=pC*y zb>Z<09d$#pgU&z>m4VVaJFs{~rO{s0u+4 T(SQ+Y} z!Tb!p7Fv>VV9Q*FHL$=AU(za1(T`{do}-Vr<{hIBn1@9ZzX#q~mFiEwp-qMo9%zXc z@f^^(#uk0i3w&X0(TAnb7==Sa-=hnH$KgciJgT3u1o4Ra1# ^O=h-_Ir+N*-XqqIh2?Y+5#7050f^-VEG zXx#(-88es%U(_>X)-b?l-3N|FC40z?DToCH&*1M$XB0>(&lshl%6O(9!@>Gg&P<8k z@1;8QHJZ51TGV4QEy2HO2^~#!-ka{0tr#n#FjR&Bi9~u$b3 QL5NoVZVpWSJ0J8GJk>eg{sNBbq2<}Qm~XDpT!V+V=@yLAGRO}~~vQyR->eh-X7 z<)Cpq3;dbNA%~%1z`f UWB0~Gtx90e1oLPw6{E85w}jlg z^GAwjWS7X!vJN2D^Klj?xs;2=v)6)*j0jOG=lR0d7t`p_ALw16K9|M=+;I1t?$BMA z^bX80f?>6Q$B6#OJ#tFvte!s5dvay$=wl{mUh{OLva#No#7;hT%&{YQMx}453_E>x zm3d(&(7x{3p);X!Z}p!YV(WU(Ec89CdEPoGM>`X`pGiAxHd6bSRL48eHichy$4sgG z+cYxg|5+&wZubkw$%3)^?&u5@-ZG`W7evkkl7|5MUstY~oo9x^>yH1DYOi5MsxOE~ z*~2*}{z7)K*+{lyy#+l%g6DMqTGxyEKdis_c$RZ~Df}?B1AnoWqbiTbcTvyg^@AMq zAK712YuwMNw-L4ZuPfCflBP}lvM+5{qyHmH^{<~G)zChqnwenB)z_70vd5lj!>axz z&sm<4TcjD=!|v=^$r*o @T zC7V|{df^SxGS}FCr2Jo3p7HUQHA1|Pf3`K|E8^j~^lFWrSF|<0r`pVJ;jiMKer _TFZAzAeoddtqnC`UWXx+hx!y}TP8>(6d?)?9Fn2Y+8B@v^=D zaaDJ>^}AGXLhlky?4BhWUCo-8!~N@CXKG`H*K>BvkvF4T=5JTUU&o7W%bD+9&f2@4 z+Nbwe#l~7k;%lE+WnIQ8+pOdI)P01^Oy(VHZR;i2kr`NFXB^*opl@R+=2}_b#)^SF z+YF>w&ph}4dFEq@YFH6+OFafYoP{DzCBMS%!uA O8U-Me!}b$*|1@?A2}cAE2DJO-A?V7b-8x0zKXl(oBz>1zQ~tp-*{tf zm*=X%V$6ldHSgAiUv^)?dF*_e6>M14><@c~M}55udmQ1mSE8Ns5%?5dKkL3(Ez?V_ z;7HdZUs10W=h{|#!}_yECf>#x8ob3V!4>b3?ccxd!z+!w+r4b>e|lDpRfUeMUngl{ z&WL$8=3VeO$#CIaUly(Kz8!mGg~&azmzvBHF*^1i8_#JH)bYA5W^m_K24BHmKjrZL z@f5H|K0oGPFRL~ptI7_<5# e-k%+Op+GK-H+R?gY-%aT~4 za^}*JcyjN^H8Vi=`^httRig%R0drrD `%}NKf!E61p%8Hx<8GdpD zWEAi+@FB?fbABR`0` 3KQp4?HwZ z0Q5 *dF5^JvB$J=1d{VhT6FUuS^<3P;QePuma^T5+s z8egeryX)BV(qG;IQJ#{MF d~*w+H=SY^&{LeiF$WpbbOHX~oh-cfQJQ%Sq{ z{F}3a^|V^!B#rnAa(p2kIP=q^zm3dE1!vR}KV=)V&d*^jaAE}WiA%DU?0#U^&gwyH zKDFSq-T>!2;exUJO_q_<*|J=c1LK)n;;cJk%IAQ1? FQIxe766CG=dFD6xz@2vX?F(X8)h}N|7Dj)Lt{r!zQ1=x2T+Xa&$@F zGR|K(rF~_Lz$bUOzj4)DPaYXNAamI^2sjG_8^C@}&JHnlXsx`@JB#lX7=0+Yh&I6y zeEm7Tqy1dtfxqBLcAJ8I0 37C0}qxD{kr+7`OGy z$u_3-a-tx7$O! {Lh;snXh)fej-u_0b*WbJ25eOmqA6m`HoS6K3rLK*k) z8D*;POA2x(%)Z*#k;L54RrivdC>>lu+1*3RqAieXxEv1x4&F#H3qA)DjaFGsPrp^q zXT(3~tkc3Nt3!X*9a1u{yW`-KeDP{(1qj&n>C-d5Q%m)px79B_qZ#Mb<96ziuTP!S zGix7aRkxLu!XpHWNC}qZgLb518QF(zjbfZbC7-gy?3}UnK4F#?OB$6lu Azmi8jrFZ$dTQAXWXfWt ubU>_bVEOzn;NqYG?FhAo-DT zwgY?D?ez~zS8;-yZ4}p(#TI=lT%a}abg)Zg5LP9ZNIMp8Ri&`#_+0jQ;mfidV_#BP z&yQje;S(?rXFb|8rRD6Wa&EM3Dy`xX$B7_@i}_tn10dt(FT)H9BD_AoXHFhn=+klR z@xfWuQfRX{Wt184vIV#U&EN>otuE`y2ek=*;2rW+9I(XPGFrcRehKBseNbvmW3SgV z9kH;C({nS`w(~B55<1%A>!_At^gi&HFmVzPqhsC?f1htim@Xwu^O69dV*NtB1 )tJ3C92qHZ;2HN%>LkK617x$ZBUrQLolD4rf^i9 z>jy v=bM!l+1u+KHsgEbx^O=I?^c-ytst$EIQ@@IbSpQ?M z=$yunUSOXC`jGFDE!40On1esugSjfpnKPka(0!rbSj&KP?dvJ0x-mCV$I8B*x53C* zLz24pN{)pLem5@3@7+dZWBA5961XI8=Rf+P F(15rJjTzb|G&}YRx*b*q z{YfqdPXCa6))<$mj!dD4?eAo6uGhm#xwlWNzpfEvoF1=lG9RB>ms4_%12=jN%XJ)h zqt0>Qj5^1~Yt%dLxI(*SJXZNWzdxQdVVhTz*8J2KqF(0FjFaQR(rn38{JpK1uD`dH zOtIs>p4K`IHe=TliG$R$KY>(Y#6a3Ol%#_y#YTFPEUdiQ}=od=C_Aa<&$p;%nK` zH_`&EBF3Kney*dZCE*pnmM@H<0UZS}bB!m&%5JPVD|PvT&8i?E{}0@6I&kpyNuP`q zTCplsyQ&5Ecy1GWj^|YRY}NA2Z=Tcmv1&(^wcm+XWb2KO4s@&;aZWfQRC{XyLut*9 z+eXzh R>Kl6O0aD@bKlvGLv1jRMO!U%Lw$#0~nIpGq>xSxZ zDiVXmDbGZ3)CoR0imF6I_GH?|ja`Dy(6GumWxe*O6fJ_ca1;dLQxo;QS6}gc^H@n< z<*F)2G~33vM#}Jb$TJYF5KSOs=9cVpz)g-pBPzAmLnIGRuxH+NB4z|e+AXp1i}C@E z+Q*c)xZR1=zit#0p4!oIA$TAPj~JJ4U{xvWnB-SIugB+(n865nYcw)mJ91vfte=+U z&{y?-sM%H~sL`zz;zR4@_7aSV3@GuT%k>@&vwE5JTxfk?ha|@{q@f<)Wo=w)yLcKc zRL380nXg1@u>sC7WDboo;F>6qoXeIZig6$9)3crod$OjssaJ;@FW36K8Mz;p3kium zZWL_kT2I`!s`WtV2EM9U=d)h3HI_wUb#mjhWg5ZX%{Ji)v skKzPMY!vW#?yt%*y=B(O$?s|W9&KGR zn{P`futMN7_uj-L{s{a;4uBjD*_SGui;_Hij;v+MNWYo=slRpR2OhW1Fbu$Cs&vad zvKEuMFyq@%6`Bf5Uxg4pi0?x1wHHpfX!0SxTAh!`oFJ>!_Ta?hXY< lyp(`@+iXhK zsg$ZyH9rg6v!-?|*SV%Sx|#*g=WLswntAnRhB35yl^)G wf%$% zcFNheKP g;Ya4E2m!u8)3n zcKfePT$b+R=ji=~VaJiy|Mgg 0xwd)R@Tzsye_MMZP~bIOc~YqWtm5PFf}N4tOryqcq0 zi=6wqdhb ^NSbxfIKZWv*&+W___5=)=-~ zc$+k_XLYM@$deL(&~o)noV>scLfs$vRprURlEtXjI%@U i9ZbbIy!CA9B|5254FL z9zGEs5`NQ v*AhE2^dhs*7r)hmT>3OHjw)PIOiV@9Hju35y zSICzb$jAn)v S?;0@WEh2k#bb6e$CJ2l8Zv417%GhSa4eZ)1kI9 z${66(vv}jvM_t?6Kd9*ptKYDa(qB=AT4im%r#0K@Ju<_tGp9N+#=QiwpR*%^Jw5QI zwX(1AO`~t?{&Jl@rFT^#;5Ox56N>K^ZvyYcrcs^}(JMQ?;@a^xlnb6C3mdf}*WrHH zUyS6$+s)Kw+`-}O>vdV=A}C}# 2P5Y%9{-fius zyMVLgJ$m$WX9|1`Ou Pb+HyxF?t0C~8H0Mu5&jGnd+pc+g)~9nhX*ubf0KgR|K4Y1}QPw?Qvv zUjqMo!gch+N{=iDdz$GQ>eMg44Vn3YT|*-WwHJk*EMZW 1N#sV z6Jx};I^p~Uaj3I5E*twq&|n!tuA>EVCwP`FU%e(D6mMb`_qd<}I+r));(A6Di}GNa zSjg`fan|4DSQdqAzk||@F=L#}%PmRsq( 5cnm- z%~=QF4jtwe7E}UUJ#Mj^Szobo!{yOWK@BKCTfvWk_rL~iPZpBE{AP?j;^u{eo{@D{ z2?S*LQj8Y67F_H(21A0T!xw&-%0acjBeF<-z`im$RPWEtBjEdtjD*$te5IY}p3#Qh zd!W{!I(;~I!P`tJd+Ej*n^i-E#F#j$oEFlF;i&$C}EO_dsI!{Py+1J#fOEfw?Wk z2rkL`tqox~d&6^jH>+RHAb78LaAr`;@6dqQ`UU-zBeq}TcD-JZNQbfc85U?w^otUB z3;_}TcwnIPyVg`67~1wGyPe=LzM~y2BP)(;h?U^HSDkjSFnABnK4-0G`Ks5co`M7P z^yXfG9UTxO@P4*TIdWf_Uhp4f@f338mnnuc5kr;j;j08E^EF>M(tQ)XvMSYg(9rUj zpOm^2P6;UAssFfsBf92tjvltvC-e^8W&Xf^+Z*i0&BSxa-C{)#bHY`?G~RiSokUuu zrDMR5$6&8IAcME&q;uJ0>G$Rdr00%)!9{2YLmRz-M`rQLdmv+9h+Cor`Yi787=Q<@ zYdq3EaTZTQkD^g^5?iN@IlYPcSg~Ev FP6|IUJNk7O?}}o?5C5Yi F`z1xzMSat8snw7F-c!;RZ%;TTAqr?W1cT zJ@^FYlFlpZ8mBImW5vUI4-b@6t K$?(*5Qp> zje3rW;COHVbwb+kV~|dK9;oQ`n?5(^tRMml> s7; zFTDpMW;UT4{6l;h*vxa1XdlYKe_1oRCDS0_-PO!&)<#%Je1daD+vgHRBE}_upS6CR z&%yo+;@0RPdt)JkeuE7P9AZu4n*FwMjX%Wb Eg#&>T?$86s22sPP)B zr3~XM!D%VYo)DNq=dmV|xbU3X!CyvGLtDdcjN+wa-CFfpuuaq@gAx&dwVzwSn#8C| z{Z{54-l;Yx&bx;1q7IzJ-j;pAX)i2$9p(tvf=|g=Zm2X`FL(&9%@Ek0GDcd1m%{>3 z3oODHF6DN)CfAFVv&M2hJyY9H;mvw(2ESrcSS3ptbSk~}-fQ;KI%SNJ?(LSN1S0C7 zd&r%|eSH+1l)y?o;{&YO^C&Z*@X3;-ggG_hB$tK9kjkh_HZ-sb@2$$;KzAAH$)piV zFJetCMq8!sEx8f9<}U T8n$*zfyCzQ zbMycg+U{aw@u}d7z?`ATWy y~L{73WqPm9*(Bf-A&Ss6$zZ1 zkBOKwMeupTW? zv_=bJN8KKMGv7`89V0*|(l@i ZpVQ;i*R>{|$3#EK*!jC*1QvU+Zvchx7Mv(KqN z=RB;fXdf$#-i3!;-#QZ6gx|^x4Y
)z2moQvZ-s7baE4#LLzoGr!(-x?#qqwjQY`h#2YZq&xNG1t09P6)9h{j* zo6$;&+kKi`9jRcvCGSxYGr`$6)uG8LpzRfws#nT6xGiHaXr5|<5dd?g9 zcGi@h!L0kmI#l;^#eIe_^B_7h*F#HecFEZA-HS`2oO9JvX>7zLJF 9^7+NAwXx>*DVA~S)qrq# zOJ_n)sD-FYS@vrog|t=Px1HhT9hby}oZt2R!AV+82*OL?L?v1-ORyFQDf7u@(TYo8 z1uS*oq4$zLOAIT3Bt$$8UaBnu%QtG7Q=*!0&!khh+D{%GOZ>c|3@#FB&20YR^vU-L z>&*KCKj*V?QX?miabDFm{c>JarV})(m*yl&PGkEf)$=J_gTfM=Fs5JHg{!fKrWYL5 zy#%MO1s(8Suw>AUGdO#%7uv~MJTe8eW6IJJHm?mvAaLG2WNo7}!Xf?t*disSj3o$< z__Q<%GK~EAj5^L5XAOMGL!1HTGwR5?nzrav^lY3!x1!U)cBJdzTUt7!R vG_7y)AjW`RB8QnOKvw8L&o+sKHT1_Nq;b?RsSQ$%{I4kaqbIvByDV$BN zxSTM?sdTTU7n=RxC)*aZoy_KQQsKN3Um cE1HT$(bZPY%G&nFg|TZtdhIq(hmMw+nv&g$TKb2TU{c~`h2&Vyh3^_TDH z@J$Q$9P 2d@m`Ou&EBdCTXe zReq6H@%P_yHkBuM7Q5;lIN*B6$<9%Pr&<3Ro4?bB-vcfB6KCMRoKwF Cz13s@dw>A2U`n{rG*3h9D=F_u#YU5XZ|6@%&%kKk~`$3e#?h|!w=-nOt@a^k+ zs{bf`Gl6(>TXKT#zmX!`Zr?9(NzS_l&yKae{5ThC<9sUkm-Ver=9S-R NvAq6J@^8Ww;4@yGeNHqH&fy`)j_6{vR_G11T!{T-4Fna(R3 ?Zq3qg~Kgt|qHN9&bWYX??URJ|=(8*SG%oyn7*O-csvc*7*45<2}jd zipF_ae|JUSiyG0(q?ySQ?Tey&8Z{PW_D?a=OM<^j(`ChB50jkU(&!$GdzoQb*U0aQ z!koA HXSBw*@_4FC7-e$k^W!C4IW(1<`s(a`{ZWyRW~`HSQn8$yfC3>&q#A z&!%9%E2#DaCoAE85PY|!JuZs#R&+Iye8wlD2_7lm5?@f+hlNcXkjE7f4c;7nD_K~m zkB0rdo=reGBW}QB<)qntVfLvYT$V<>EzS2>_ Oxu=|6aPw6jT+6)f;T2Q_b6tC3xilhe*27h!+FujzP*cROD;?iyXP6?ya z!sz>C?Y}mZuSLx}@=DNUM5$|n2l>7u`$ZglSNB+DwAy3w!<6vqa|SFOUsig0jeq7O zuVAvOv+?zR5?>G(yh&OOejrPIPclwaz?|TW=F>Pw>auF` zrO!WROf;#n->Qv&NTcJ+kDTQ>DIWVt_V*`Y>5)dyI{8Ii-x9@NN_#%iXs7km`%9ti z@uR=CD4P=ph;3P0^6!e%S&Q@gept=I%oJbC7|>6*_&)dSm3L%znE!ezXvmon{i5I7 z<9_DEm=UkP^_L@vH^`h3v41c8u>%;WUY)pbg6NlQ#$eJqL%QR%C$wn!^+9JT+=p`( z#@=y9gIC2Gi?)%F (yoR68CMStMt|8OxA uNd%a=n3QyV3}RH+hp z&Dkn+bxEo64W*flB!^9}M^lHH^~i(49nALs#|fU%)`fIM2CQFt7WrRElCUUAAp;L4 z$f?z3qA3N F `GDKYHEPUbcK_}z-<8JO_4k4K3T?Y3^M0$U z3}+nG?Nhf_@EE)jo>d~I>G^{`zZaaeG~3~tXyq^-Lf>cogAKF(KFVSfIn{ZI+Gq;a z;DWO}4-03}i#aUx?V$LJFLPf^@P3_a_G{sXj91ln{XsB1Nb*T^urL30SF-wpWMx#g zVN?;?ZT*GAw&lT&Yn+_k9?`?`eYdYU)`zvR-uwUCJJ+o$k}XkNf6o~G4s3h$F6- Av+`V7(yh6Xh`E`Dr?~6$onQP_3waP0Ng8{6S85uca z#*7*B9*GxC!h;?$&U=hU%isbd^0f0=M!EyXTH(q%d!n&nt6V=GV|~;z)}6zV>HUcl z+?7K2lFnr`!#HEzOLmHBIMWbUl--ZVSk=NJ18*1)RMjG?)o6jSnOQl5Tx`X?38;CP zwLQgL-h{>{Xfwv#Pq7;vus?n8R&I5vbIf8ZHBT^OM!4OAGww4kHLf8jcZm7C&PcC9 zz3Tf5tl1If{T)1~*igRDl^bJ~O6y$e0Q-R4e+cPhh!M{-8a2*WjCqoKPZQ4?=1N5B zE+SnVk9nO#8mf;~AKMJ0JPQYMh2Df>wb{H)t93BV?-rvr(p!0D1zgiii)Tr{Oi66aSbWh<* zulP2>$XEG(gH{jHUNq0hiv{p|=2xTe*E(I_PP6v{+BF_df4NZ?`+Ro1x1j24%)F6G zo6Ng8x9{lV``&$nuE&75(+nH$yq);eEOWWeOim_ALkqdlCYy
3t~nEVFBj%PchQS~gSsRoaVZSk-q~A$N}rU2k<9wUsNJ;fF|5 zQ>^Q^%;p+0$S!j`!y3Pjgf#*t#%T8zSwt #-(3Wd{w5RFl?k)SS5wovch+I-`nM)s9oFA=+e=fAkcXS)yGuq8+6 Ua(WTDwLuGRJQdq6K{@Lo@n@hbdvka;o2c@$i% zpy^$x^rtm>H9;D5Aa%^p=VjW3#s62H6Ph8YEnD!Ksay&-cPS{mxs6fj<}PbP^o_;- z)w`D`>J&bw7xPJtlZebI*O=FGG^=BZYVt-^Uj$1-K)MgD8s(ZRj8(56HG*RQHdCnm zO`ZA-dzSfMomw=*SjSTJS;ysA>Mcqy&G)rF1{b)-==E`F-P9+#dWcEw`ueBLHmlB1 z-6~%2ko^E oJ9`V7n}z23PfakQ5om4znaG?ZSB2|hlusk+ z>I9$0*|!E6y}4-GAFr}jl%melMlEm}uJjHn7C&Y6xK`^|ULIn@by?cUspXzlwu&G9 zLYc#vn=w}TF4f0s?@zOFlr6cFZ=!j%RC6`$^{7_i`EA}Iw0Os}NB5#1%)R0$`VR|s zJ?kjf2Z@~~X1eZK^u3Wuy@4e=?=cZWo_82M19~0wU_GW)>sZ1AP;C+WpVv#@^|4mR zUH_at00l4FNLqL9vRj|*p(lIj=h#DYPE#!_1>2CNGy&lmv zO0_xL#5jnETyUQ@a>Ym({qK<%rft@Y &2BsYX2*Goatp5xRE;H15WZ)*24( z{Pv|M+*}yfxN<^dJXtl*9&KYJfU>dnBk}tpVYSLBGS79NG#V{n@=eO%aw_);BR~6* zBHal*A!P$hY@&HYRfMWUAMr18M ?nOQ+_q9to`D&39E`De!e(c|zPV4Y)&`)kJG$CgNMP1~rX0_@ajm%TC`{LbZ zKs!TGyY(V_>!l=1$U|Fq2jP^<_OYYxrXJNI!b@9tvmVK bJ^A)Z-9HZyO|7Or^p8#O|+>VAA(O&xR$Irji8guW)HdxU*rnrjdF zRd;*DJ}{pCKR_3I&GjMH@gV=V()AVi>pXa~4uQ6rb)LTq-&;Wn7Q2tQe}m^%(EYTT zKji;DEv-4Tz<*^W``@7bAbPNIH}_cW_Hz#y%t|ZLZnqkuy6lODC`T`v(TRp=U7Qjr zcDyyj!OE&Q&KhEMKdNg>S=Om*`tE{XTQki0#aTC$a>_2+cj{uFmWhyygw~oF`D)0B z${*%AC{@}zq^OYD%pOuki}+WoNJM}8NIub YGaDMOO^1vK4;yqpUCg$`f^N(FdoL zPpRo{q5WB9NS)c1zGWwUd)@GywyvlRr6 t&+27r zgtpR#t_G&osqC@Ej`godk9tWi@ow9cT1aZq@m!2`9tf?L+n;`#wc#(LhmCy&JuI*r zCs(P*I?nH1Ba<5a(XXXOr8cJbY6$s#1bKUeZ>#*>;J*GOy=VH`^s;F|*XuUK+>h{M zgz73+)U~1xgY>1orcdnx?c-hc9r+x_*!<|;vrgQ37fr~x-XU;ct;`|T&3iPX(4h3T zJz|}yY3aRO<@*)BhX!ZV>~(mYafp-LeUB|@30Y*n#mm^OW@XgSiDq@8S(O~aqGA3R zzPGB6?)Yj}opzYxqGNS}KeQw5>X8qrgrW7_j4V$e`_XlzlU?{*=}6z-F5FqyIofv@ zo@%uMeNyTK=KDV5vr!mI4B_EYKbq#AIg!=`t4gY0TRZBUsVDq#u11`m@gK;Q7l8b~ zehNE`Szv=mltNrG?5h49^%C1$Kyor>>|gmm#HY!`Wx{J1T4Nu!?!cBg()!!PpK`Ey zliH=kskWLvWUe>Jx0?xX#>qwNum`Cz$-(-tsVjNK*&Zd+H8iR{?%zXRvofRgM*5K4 zaz1-M-zMohV(-+XLc20D?Gob@-iSpC*ql?npfR&yt yRm$1VXBGDmgQ))b9-Nk| z;X`q3R=x1A_NqSq#(4X%>YIzD4(I#gy1J>~wC?K%wS9O}y(*qU3;b)JbJOna{4)C8 z`LCegy#x vgVR@LtfLx6_}Yx3 z)Z;eFbwAmQ6=tmG>61q5sS8GAr2Zg1aO?Cx#x>t# v2C zE@ex#JbSddeWzH?FQeUD_zK$10a~b0mg?7@e-b{z?^(amYoXo9oUaW&t9w{i-^f8D z3f28b`9H>w5yG2%GrvPE$J{4#K%{l^xojD}D*aVz_-2Rcu^Ql>dw@A&))~@P=M#Tk z-_-_sjGCm;`uA87MiW})dlhUBzyZyqo92^Ig`Qrx&b>kOAx}HD?LF46wY?wGW*x7V zRg(*^?bc`IjGg$bPJC8BuFtBP^Lc!Apyqw$d)I<;RA4jop$} 4Kii>$R7wVg=esPGFNya!mr@7)3n|= zj6d5&TKFybcD`mdn%YGB*m5T6(ec9CbR2Jv?zJwQww;JRj5y(ldJC Y&)Kr8%I{Yl~Rv2}iX9-|(p z_eqN~-|8H4?*pW_r+BTj{`Yb6Rm3&E=dS0x#mGE^)H#$Jel5Sx_*c-3GF6L}&?NPx zegCn2=0;f^LNBN}Q|deBQYoLSD;eSEeIxeNlk^RZbJz2CHu*M^X4~h@yfKF=pHrsn z?NiF{L-b*_4fQ0oFTF-lf#W2$Pd&)&Dl2 k0-O4h=l?un z)kc<9R0P$Jw9k6fkF;}mUwz86qMoqM=a~ynG>wWQ2Yfe+_&M*p#+|*Mb*r%Woak03 zy48=XTa8v$#qrgxj@p@yi-vX77(&m=u{e>DudJf=R(Z<|RBKupQ)7Nr)aZG}_a9#) zJK5X6o?oh(NnIiakMrK1wYl(+?AG)Gb+Q~8XY63azA5?Ux(uPicy_xwPQKoU1h|0g zrxsO>GOWwZuFS8g)%6x*I1cR97(;1Hh &dwx%T3s{! zg%+N2BENl+#*#B$y;dR~)t%#Qq1VSrM8Z<_#7&^5mI^A>k!dl|G9V|<@P?0XK53O+ z^L>klxYKjvndH)z?^VNAS_!*@Scz!Hc `l=QSV|fSuWbue)&$2?Jer_uVTWd$XbB?v9zB$f%jQGTz^nWn58%Brp z`+a _gO*{C?_3)+<7q7k(V;M|Rq|j*Gt93I5PPvyESERJqx6b -Zx_kV3z_?q~H+Pi vCx6pV?H9I3Ut-Nm?|3R+kMKlY|^9l7$>R0rCRN%J{pR^9iDA(2x@7b&V&Xt4@ zt84sOD~w!Y)sCW#4MQ7SXmh2qh!kY4$D)-r)o9e~7}}!Me{xMoBRG4n@2{4AQs4hX zKht{fqvoug{~>&e?Yqly(ahQ*&vBYs4bQSev{zp|3nx_WFn%hcwIY7$M~>z^*^$4E zPGw&B_qQX5_M>FJiWJ$LQ8nAPM(Q3uHKStLu$Nh6xNB6lxI&+2QiThvNQCF!+%nH( z_xmr&g7G!|fo6lLskrK`hf(}*`j=Y0S5YTK-_kBW!XG%Q)?(>|H8l|XEGHJ6K@uzV zA1A; %CM zk|+L!U(i-XQ&MxQ`ry>&9AnOLt7hx%CjH84DB)iWxI&*a?o+6p(|{}MV(rl6{J+|~42;h}T4iTK##kxgd|ry7<1H9z@zgiq`Idit5Vt+jO2$@HnIZ;f!r zdwSxGGPVA`wMNw3B5yi8b82H|(W&EwPcGMmH2zdi;M$*9PrJ^F)^8c!H1)Lk ro^ z_lU{xwNy`)^DOMEz+KKE5C(NSHO9xh{nZC(y{7gV-m+EhnZ>6LS$sFSeTT!QJlY~_Tij=Ef3i6SMh)yw^OS1dPV-7l|`(lsQ=6ORXt(qQ`RrB{=VKU zKj{;*(!Rbe;~+gn&};FekzHzDR@T>|5V4egGyc)qj?te_84LO2d%^N4)uBbLv)(>- zO0}o@ZjgaD&q}fS &Mlx#w)Ahc ?6dUguMbh#FZ#AiD-gJTgXH&mcgY#X+d0j^e>-@&KB=yEA zWaiK5<>~|SLG uUi@86mJ@& zpL;xGeGGeucXj8>GUgzkR<8UbkB%ITy` K6CUrTt92 z8kOl8@135odWAlRYFqn{v%{qd-|!4t8w18Wr~Zc2>^Z~wip)l|-o+EfVIH^fn$LLS zV`k_bGc^kI<{X{}#}9aZj=Op_Ht6FfpX~WRfchMJ(O*ve9Sz)b|Cadu`>Fqh?C#!| zb1T 0O&2-etCBfz9_fwU6F@Jsi*xEhyJNS7`Yv pC`J?(HA2;+=;Kl|Kc?z~QSJhl2FZN--Jd8rNSktMoJ zZ#xNh85eo m;r%c-R~ zWO5emePX|l-=MQ!pw8SXC|*3uE5*vMv~!+3O|uCWdzZ2=!Q naC{~WmGT0Un*X(Mig !+XPCUMvNxjL}*r!sBOYZTE0Dc4z!|EK};HTASVf zJS{_5 8k*++ z%2lLhxw&%2Hh))GQ-5I<%AsC>gYxMG?~45HF)*bb;yE;)8mhh2zg98x%u=tJ58!=c zkd!r*YqgweJ2ea1Gd9oj-?)@j?r1^vzctG?Xd<#zxg>?^^%t&tx%OhXS;G8c*^N zjNIV6cpB%L@g>#j&X1VOb>`TrWTViARmil9=I@KFIW490tlug6n&ZClD`j@OvyD0n zW6(^Ta$^mO_ooJblC!%G-_YN`0-<`yr9_cREph5Pkx4(j;#VKY;7?T@tJrEjUZ*|I zIF6N&*F~@Ldh3dC2Wejo#^+gM@orifYj6$sjdMuAa*gwFqWk>6WkIPqPN!@p}RO z_Jmbs#T9Y?fHwEQwyR7j{x^D6N|*p&o;CKAwpyr_A1>2_tG631!0Jo#5Hqfn-{b;u zO-@*%KJ8ClVRo2N)kc!3FWKHx)0E_Hrxx;_N$v(m&Dw`qT|Vz>RFiwd=!_