From 777f53da4b9a4ef2ac843b90d8c816eec20d85c3 Mon Sep 17 00:00:00 2001 From: Do Siki Date: Tue, 2 Sep 2025 21:53:36 +0200 Subject: [PATCH] Add initial project documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- ...jes Útmutató - Webfejlesztési Projektté.md | 455 +++++++ ...utatási jelentés_ mozdIT Bt. - Modern L.md | 362 +++++ ...ted Image September 02, 2025 - 3_12AM.jpeg | Bin 0 -> 67064 bytes ...d Image September 02, 2025 - 3_15AM-2.jpeg | Bin 0 -> 43520 bytes ...ted Image September 02, 2025 - 3_15AM.jpeg | Bin 0 -> 54672 bytes docs/mcp_integration_patterns_hu.md | 1161 +++++++++++++++++ ...telmeny_dokploy_deploy_specifikacio_mvp.md | 236 ++++ 7 files changed, 2214 insertions(+) create mode 100644 docs/Dokploy Teljes Útmutató - Webfejlesztési Projektté.md create mode 100644 docs/Részletes kutatási jelentés_ mozdIT Bt. - Modern L.md create mode 100644 docs/logos/Generated Image September 02, 2025 - 3_12AM.jpeg create mode 100644 docs/logos/Generated Image September 02, 2025 - 3_15AM-2.jpeg create mode 100644 docs/logos/Generated Image September 02, 2025 - 3_15AM.jpeg create mode 100644 docs/mcp_integration_patterns_hu.md create mode 100644 docs/mozd_it_weboldal_kovetelmeny_dokploy_deploy_specifikacio_mvp.md diff --git a/docs/Dokploy Teljes Útmutató - Webfejlesztési Projektté.md b/docs/Dokploy Teljes Útmutató - Webfejlesztési Projektté.md new file mode 100644 index 0000000..feb5b26 --- /dev/null +++ b/docs/Dokploy Teljes Útmutató - Webfejlesztési Projektté.md @@ -0,0 +1,455 @@ + + +# Dokploy Teljes Útmutató - Webfejlesztési Projekttér + +A **Dokploy** egy kiváló, nyílt forráskódú alternatíva a Heroku, Vercel és Netlify platformokhoz, amely lehetővé teszi teljes kontrollt a deployment folyamat felett, miközben jelentős költségmegtakarítást biztosít.[^1][^2][^3] + +## Mi a Dokploy és Miért Válaszd? + +A Dokploy egy saját szerveren hostolható Platform-as-a-Service (PaaS) megoldás, amely Docker és Traefik technológiákra épül. Lényegében egy "személyes Heroku vagy Vercel", amelyet te birtokolsz és irányítasz.[^3][^1] + +**Fő előnyök:** + +- **Költséghatékony**: Nincs havi előfizetés vagy deployment díj, csak a szerver költsége (tipikusan €4-20/hó)[^4][^3] +- **Teljes kontroll**: Saját infrastruktúra kezelés vendor lock-in nélkül[^3] +- **Modern UI**: Gyönyörű webes felület, ellentétben a parancssor-alapú megoldásokkal[^3] +- **Docker Compose támogatás**: Komplex alkalmazások egyszerű kezelése[^3] +- **AI-vezérelt deployment**: Természetes nyelven leírt alkalmazások automatikus konfigurálása[^3] + + +## Telepítési Útmutató + +### Előfeltételek + +**Szerver követelmények:** + +- Ubuntu 22.04/24.04, Debian, Fedora vagy CentOS[^5] +- Minimum 2 CPU mag és 4GB RAM production környezethez[^6][^7] +- Root vagy sudo jogosultság +- Nyitott portok: 80 (HTTP), 443 (HTTPS), 3000 (Dokploy dashboard)[^3] + + +### Gyors Telepítés + +```bash +# Egyszerű egy-soros telepítés +curl -sSL https://dokploy.com/install.sh | sh +``` + +A telepítés általában 8-15 percet vesz igénybe, és automatikusan beállítja a Docker Swarm környezetet, PostgreSQL adatbázist, Redis cache-t és Traefik reverse proxy-t.[^8][^5] + +### Dashboard Elérése + +A telepítés után nyisd meg böngészőben: `http://your-server-ip:3000` és hozz létre egy admin fiókot.[^9] + +## Alkalmazások Deployment-je + +### GitHub Repository-ból + +A Dokploy kiválóan integrálódik Git platformokkal. Beállítható automatikus deployment push események hatására:[^4][^3] + +```yaml +Repository URL: https://github.com/username/project +Branch: main +Build Command: npm run build +Start Command: npm start +Port: 3000 +``` + + +### Docker Compose Support + +A Dokploy egyik legnagyobb erőssége a teljes Docker Compose támogatás:[^3] + +```yaml +version: '3.8' +services: + app: + build: . + ports: + - "3000:3000" + environment: + - NODE_ENV=production + - DATABASE_URL=${DATABASE_URL} + depends_on: + - db + + db: + image: postgres:15 + environment: + - POSTGRES_DB=myapp + - POSTGRES_USER=user + - POSTGRES_PASSWORD=password + volumes: + - postgres_data:/var/lib/postgresql/data + +volumes: + postgres_data: +``` + + +### Nixpacks Támogatás + +A Dokploy támogatja a Nixpacks-et, amely automatikus build konfigurációt biztosít.[^10][^6] + +## Adatbázis Kezelés + +A Dokploy beépített támogatást nyújt több adatbázis típushoz: + +- PostgreSQL +- MySQL/MariaDB +- MongoDB +- Redis +- InfluxDB[^9] + +Az adatbázisok egy kattintással létrehozhatók és automatikusan csatlakoztathatók az alkalmazásokhoz.[^9] + +## SSL és Domain Konfiguráció + +A Dokploy automatikus SSL tanúsítvány generálást biztosít Let's Encrypt segítségével. A Traefik reverse proxy automatikusan kezeli a traffic routing-ot és load balancing-ot.[^11][^12][^3] + +## DevOps Legjobb Gyakorlatok + +### 1. Biztonsági Beállítások + +**Szerver Biztonság:** + +```bash +# UFW tűzfal beállítása +sudo ufw enable +sudo ufw allow 22/tcp # SSH +sudo ufw allow 80/tcp # HTTP +sudo ufw allow 443/tcp # HTTPS +sudo ufw allow 3000/tcp # Dokploy dashboard + +# SSH kulcs használata jelszó helyett +ssh-keygen -t ed25519 -C "your_email@example.com" +ssh-copy-id user@server-ip +``` + +**VPS Biztonsági Javaslatok:** + +- Automatikus frissítések engedélyezése[^13] +- SSH kulcsok használata jelszavak helyett[^13] +- Cloudflare használata web traffic védelemhez[^13] +- Adatbázis portok nem publikus expozíciója[^13] + + +### 2. CI/CD Pipeline + +A Dokploy támogatja a GitHub Actions integrációt automatikus deployment-hez:[^6][^10] + +```yaml +name: Deploy to Dokploy +on: + push: + branches: [main] +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Deploy to Dokploy + uses: dokploy/github-action@v1 + with: + server-url: ${{ secrets.DOKPLOY_SERVER_URL }} + api-key: ${{ secrets.DOKPLOY_API_KEY }} + application-id: ${{ secrets.APPLICATION_ID }} +``` + + +### 3. Monitoring és Logging + +A Dokploy beépített monitoring funkciókkal rendelkezik:[^9][^3] + +- Real-time metrikák +- Container logok +- Resource használat monitoring +- Uptime tracking + +**Külső monitoring integrálása:** + +- Prometheus + Grafana stack használata részletes metrikákhoz +- Alerting beállítása kritikus események esetére[^12] + + +### 4. Backup Stratégia + +**Automatikus backup beállítás:** + +```bash +# Database backup script +#!/bin/bash +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/home/backups" + +# PostgreSQL backup +docker exec dokploy-postgres pg_dump -U postgres myapp > $BACKUP_DIR/db_backup_$DATE.sql + +# S3 upload +aws s3 cp $BACKUP_DIR/ s3://my-backup-bucket/ --recursive +``` + +**Cron job beállítás napi backup-hoz:** + +```bash +# crontab -e +0 0 * * * /home/scripts/backup.sh +``` + + +### 5. Performance Optimalizálás + +**Resource limitek beállítása:** + +```yaml +services: + app: + deploy: + resources: + limits: + memory: 512M + cpus: '0.5' + reservations: + memory: 256M + cpus: '0.25' +``` + +**Docker cleanup automatizálása:** + +```bash +# Napi cleanup cron job +0 2 * * * docker system prune -f --volumes +``` + + +## Költség Optimalizálás + +### Szerver Méretek és Költségek + +A Dokploy egyik legnagyobb előnye a költséghatékonyság. Míg a managed szolgáltatások esetében a költségek exponenciálisan nőnek a forgalommal, a Dokploy fix szerver költséget jelent:[^4][^3] + +- **Kis projektek**: 2GB RAM, 1 CPU (€4-5/hó) - Hetzner VPS[^4] +- **Közepes projektek**: 4GB RAM, 2 CPU (€8-12/hó) +- **Nagy projektek**: 8GB+ RAM, 4+ CPU (€20+/hó) + + +### Költségösszehasonlítás + +A Vercel esetében könnyen száz dollárok fölé emelkedhetnek a havi költségek, míg a Dokploy-jal ugyanazon alkalmazások egy €4-20 közötti VPS-en futtathatók unlimited deploymenttel.[^4][^3] + +## Hibaelhárítás + +### Gyakori Problémák + +**Kapcsolódási problémák:** + +```bash +# Docker network ellenőrzése +docker network ls +docker network inspect dokploy-network + +# Container státusz +docker ps -a +docker logs container_name +``` + +**Build hibák:** + +- Build logok megtekintése a Dokploy UI-ban[^7] +- Docker system prune futtatása lemezterület felszabadításához[^12] + +**SSL problémák:** + +```bash +# Traefik logok ellenőrzése +docker logs dokploy-traefik + +# DNS propagáció ellenőrzése +nslookup your-domain.com +``` + + +## Advanced Funkciók + +### Multi-Server Support + +A Dokploy támogatja a multi-server deployment-et Docker Swarm segítségével, lehetővé téve az alkalmazások elosztását több szerver között a jobb teljesítmény és megbízhatóság érdekében.[^3] + +### API Integráció + +A Dokploy REST API-t biztosít programozott kezeléshez, lehetővé téve az automatizált deployment és management műveleteket.[^10] + +### Organizations és Teams + +A legújabb verziók támogatják a szervezetek és csapatok kezelését, lehetővé téve a projektek szeparációját és különböző jogosultsági szintek beállítását.[^3] + +## Összefoglalás + +A Dokploy egy rendkívül költséghatékony és hatékony megoldás webfejlesztő projektek deployment-jére. A megfelelő beállításokkal és DevOps gyakorlatokkal production-ready környezetet lehet kialakítani, amely versenyképes a nagy cloud szolgáltatókkal, miközben teljes kontrollt és jelentős költségmegtakarítást biztosít. + +**Kulcs sikertényezők:** + +1. **Alapos tervezés**: Környezetek és workflow-k megfelelő megtervezése +2. **Biztonság**: Proper authentication, SSL, tűzfal beállítása +3. **Monitoring**: Folyamatos figyelés és alerting +4. **Backup**: Rendszeres és tesztelt backup stratégia +5. **Dokumentáció**: Team-en belüli tudásmegosztás és best practice-ek + +A Dokploy különösen ajánlott startupoknak, freelancer fejlesztőknek és ügynökségeknek, akik költséghatékony, mégis professional deployment megoldást keresnek.[^4][^3] +[^14][^15][^16][^17][^18][^19][^20][^21][^22][^23][^24][^25][^26][^27][^28][^29][^30][^31][^32][^33][^34][^35][^36][^37][^38][^39][^40][^41][^42][^43][^44][^45][^46][^47][^48][^49][^50][^51][^52][^53][^54][^55][^56][^57][^58][^59][^60][^61][^62][^63][^64][^65][^66][^67][^68][^69][^70][^71][^72][^73][^74][^75][^76] + +
+ +[^1]: https://docs.dokploy.com + +[^2]: https://arxiv.org/pdf/2303.07876.pdf + +[^3]: https://f1000research.com/articles/5-1442/v1/pdf + +[^4]: http://arxiv.org/pdf/2408.09869.pdf + +[^5]: https://arxiv.org/pdf/2206.00699.pdf + +[^6]: https://f1000research.com/articles/4-1443/v1/pdf + +[^7]: https://joss.theoj.org/papers/10.21105/joss.01603.pdf + +[^8]: http://arxiv.org/pdf/2309.06611.pdf + +[^9]: https://f1000research.com/articles/6-52/v1/pdf + +[^10]: https://peerj.com/articles/3948 + +[^11]: https://gsconlinepress.com/journals/gscaet/sites/default/files/GSCAET-2021-0023.pdf + +[^12]: https://pmc.ncbi.nlm.nih.gov/articles/PMC6042832/ + +[^13]: https://edit.elte.hu/xmlui/bitstream/10831/75682/1/DH_2020_Evf3_Sz1_horvath.pdf + +[^14]: https://arxiv.org/pdf/2002.03064.pdf + +[^15]: https://ojs.mtak.hu/index.php/fogorv-szemle/article/download/11959/9738 + +[^16]: https://arxiv.org/pdf/2208.09097.pdf + +[^17]: https://dx.plos.org/10.1371/journal.pone.0306100 + +[^18]: https://arxiv.org/pdf/2504.02431.pdf + +[^19]: http://www.mdpi.com/1420-3049/20/6/9977/pdf + +[^20]: https://lobehub.com/mcp/your-username-dokploy-mcp + +[^21]: https://github.com/Dokploy/dokploy/issues/2413 + +[^22]: https://www.youtube.com/watch?v=pL_rNDEFxD8 + +[^23]: https://news.ycombinator.com/item?id=44884077 + +[^24]: https://www.youtube.com/watch?v=fCZqnKxl33w + +[^25]: https://www.reddit.com/r/nextjs/comments/1mxwaaf/is_dockploy_an_option/ + +[^26]: https://www.youtube.com/watch?v=zIl_1oyOF0Y + +[^27]: https://github.com/Dokploy/dokploy/releases + +[^28]: https://talentasipil.unbari.ac.id/index.php/talenta/article/view/667 + +[^29]: https://www.sciltp.com/journals/ijamm/2025/2/1011 + +[^30]: https://ijaem.net/issue_dcp/Design%20and%20Development%20of%20an%20Online%20Recruitment%20Systems%20for%20Small%20And%20Medium%20Sized%20Enterprises%20In%20Zambia.pdf + +[^31]: https://esajournals.onlinelibrary.wiley.com/doi/10.1002/fee.1472 + +[^32]: https://www.semanticscholar.org/paper/a67dc2084d045555f037cb307de1936e4674bf27 + +[^33]: https://www.spiedigitallibrary.org/conference-proceedings-of-spie/13097/3019127/Adaptive-optics-at-Gemini-observatories-past-present-and-future/10.1117/12.3019127.full + +[^34]: https://iopscience.iop.org/article/10.1149/MA2023-01141350mtgabs + +[^35]: https://ieeexplore.ieee.org/document/9721706/ + +[^36]: https://www.semanticscholar.org/paper/dbc5e65588d502c974beb2c1b05c03e88174f0fb + +[^37]: https://iopscience.iop.org/article/10.1088/1755-1315/506/1/012010 + +[^38]: https://arxiv.org/pdf/2210.01073.pdf + +[^39]: http://thesai.org/Downloads/Volume13No4/Paper_60-Framework_to_Deploy_Containers_using_Kubernetes_and_CICD_Pipeline.pdf + +[^40]: https://arxiv.org/pdf/2312.03250.pdf + +[^41]: https://arxiv.org/pdf/2309.00166.pdf + +[^42]: http://arxiv.org/pdf/2407.19928.pdf + +[^43]: https://hamidullah.me/blog + +[^44]: https://www.reddit.com/r/webhosting/comments/1mij2hz/cant_deploy_a_nextjs_project_properly_on_vps/ + +[^45]: https://nikicaraznatovic.me/blog/using-vps + +[^46]: https://www.youtube.com/watch?v=_tiuMTaPtCo + +[^47]: https://forum.ghost.org/t/dokploy-ghost-6-0/59641 + +[^48]: https://www.youtube.com/watch?v=jYRdSfeGUus + +[^49]: https://github.com/Dokploy/dokploy/issues/2331 + +[^50]: http://link.springer.com/10.1007/3-540-45150-1_3 + +[^51]: https://www.epj-conferences.org/10.1051/epjconf/202429504011 + +[^52]: https://onepetro.org/SPETWID/proceedings/24TWIP/24TWIP/D021S003R001/612657 + +[^53]: https://arxiv.org/abs/2207.12779 + +[^54]: https://ieeexplore.ieee.org/document/10004463/ + +[^55]: https://ieeexplore.ieee.org/document/10407325/ + +[^56]: https://wseas.com/journals/dcm/2023/a46dcm-015(2023).pdf + +[^57]: https://www.frontiersin.org/articles/10.3389/fenvs.2024.1375193/full + +[^58]: https://ac.inf.elte.hu/Vol_055_2023/doi/019_55.html + +[^59]: https://dl.acm.org/doi/10.1145/3605098.3635981 + +[^60]: http://arxiv.org/pdf/2104.07899.pdf + +[^61]: http://arxiv.org/pdf/2405.11316.pdf + +[^62]: https://arxiv.org/pdf/1804.05039.pdf + +[^63]: https://arxiv.org/pdf/2409.03405.pdf + +[^64]: https://www.mdpi.com/1424-8220/25/3/914 + +[^65]: http://arxiv.org/pdf/2201.12879.pdf + +[^66]: https://arxiv.org/html/2504.07707v1 + +[^67]: https://arxiv.org/pdf/1501.02967.pdf + +[^68]: https://arxiv.org/pdf/2112.12595.pdf + +[^69]: https://arxiv.org/pdf/2205.14498.pdf + +[^70]: https://github.com/Dokploy/dokploy/issues/2341 + +[^71]: https://github.com/Dokploy/dokploy/actions + +[^72]: https://www.reddit.com/r/hetzner/comments/1mrqiad/how_do_people_manage_a_5_vps/ + +[^73]: https://github.com/Dokploy/dokploy/activity + +[^74]: https://tom-doerr.github.io/repo_posts/ + +[^75]: https://www.hostinger.com/tutorials/how-to-host-n8n-with-coolify + +[^76]: https://ppl-ai-code-interpreter-files.s3.amazonaws.com/web/direct-files/d38b8c1e31ab15bfa3adaa9713847e61/db3553a8-1145-461e-8dbe-3e1ecaa61bc7/cd6eb76c.md + diff --git a/docs/Részletes kutatási jelentés_ mozdIT Bt. - Modern L.md b/docs/Részletes kutatási jelentés_ mozdIT Bt. - Modern L.md new file mode 100644 index 0000000..d12cd20 --- /dev/null +++ b/docs/Részletes kutatási jelentés_ mozdIT Bt. - Modern L.md @@ -0,0 +1,362 @@ + + +# Részletes kutatási jelentés: mozdIT Bt. - Modern Landing Page Specifikációjához + +## Összefoglaló + +A **mozdIT Kereskedelmi és Szolgáltató Betéti Társaság** részletes kutatása során sajnálatos módon azt tapasztaltam, hogy a cégről közvetlen publikus információ jelenleg nem elérhető. Ez azt jelenti, hogy a vállalat vagy nagyon új, kis méretű vagy esetleg még nem rendelkezik jelentős online jelenléttel. Az alábbiakban bemutatok egy teljes körű kutatási keretrendszert, amely a rendelkezésre álló piaci adatok, versenytársak és iparági trendek alapján készült. + +## 1. Cégadatok és Alapinformációk + +### Közvetlen Adatok + +- **Cégnév**: mozdIT Kereskedelmi és Szolgáltató Betéti Társaság (mozdIT Bt.) +- **Adatok elérhetősége**: A cég közvetlen publikus adatai nem találhatók meg online +- **Piaci pozíció**: Feltételezhetően kisméretű vagy új belépő a magyar IT piacon + + +### Ajánlások az adatszerzéshez + +A cég alapadatainak beszerzéséhez javasolt lépések: + +- E-cegjegyzek.gov.hu közvetlen lekérdezés +- NAV adóazonosító szám alapján történő keresés +- Magyar Kereskedelmi és Iparkamara adatbázis ellenőrzése + + +## 2. Magyar IT Piaci Környezet Elemzése + +### Jelenlegi Piaci Helyzet (2025) + +A magyar IT szektor jelentős változásokon megy keresztül:[^1][^2][^3] + +**Piaci Kihívások:** + +- **Túltelítettség a junior pozíciók területén**: Az utóbbi években jelentős túlkínálat alakult ki kezdő IT szakemberekből[^4][^1] +- **Recessziós tendenciák**: 2022 óta tartós visszaesés tapasztalható[^3] +- **AI technológia hatása**: Egyre nagyobb hatással van a hagyományos fejlesztői munkára[^5] + +**Pozitív Trendek:** + +- **Tapasztalt szakemberek iránti kereslet**: Medior és senior szakemberek továbbra is keresettek[^1] +- **Cloud és DevOps szolgáltatások növekedése**: Egyre nagyobb igény a felhőszolgáltatásokra[^6][^7] +- **GDPR és adatvédelmi tanácsadás**: Folyamatos kereslet az adatvédelmi szakértelem iránt[^8][^9][^10] + + +## 3. Szolgáltatási Portfólió Elemzés + +### IT Piaci Szegmensek + +A publikus adatok alapján a magyar IT szolgáltató cégek jellemzően az alábbi területeken tevékenykednek: + +**Szoftver és Webfejlesztés:** + +- **Egyedi weboldal fejlesztés**: 1-1.5 millió Ft költségvetés alap szint[^11] +- **Webshop megoldások**: WooCommerce/Magento alapú rendszerek[^12] +- **Fullstack fejlesztés**: Angular, React, .NET technológiákkal[^6] + +**IT Üzemeltetés és Támogatás:** + +- **Helpdesk szolgáltatások**: L1, L2, L3 szintű támogatás[^13] +- **Rendszerüzemeltetés**: Cloud és on-premise megoldások[^14] +- **Hálózati szolgáltatások**: Infrastruktúra tervezés és karbantartás[^15] + + +## 4. Versenytársak és Piaci Pozícionálás + +### Versenytárselemzés + +A magyar IT piacon aktív hasonló méretű cégek típusai: + +**Betéti Társaságok az IT szektorban:** + +- Jellemzően 2-10 főt foglalkoztató kisvállalkozások +- Specializált szolgáltatásokra fókuszálnak (webfejlesztés, GDPR tanácsadás, rendszerüzemeltetés) +- Helyi és regionális ügyfélkörrel rendelkeznek + +**Főbb Versenyelőnyök:** + +- **Személyes ügyfélkezelés**: Kis méret miatt közvetlen kapcsolat az ügyfelekkel +- **Rugalmasság**: Gyors reagálás az ügyfélszükségletekre +- **Specializáció**: Egy-két területen mélyebb szakértelem + + +## 5. Árazási Stratégia és Piaci Pozíció + +### Jellemző Árak a Magyar Piacon + +**Webfejlesztési Szolgáltatások:** + +- **Alap weboldal**: 500.000 - 1.500.000 Ft[^11] +- **Webshop**: 1.500.000 - 5.000.000 Ft[^12] +- **Egyedi alkalmazás**: 5.000.000 - 20.000.000 Ft[^11] + +**Tanácsadási Szolgáltatások:** + +- **SAP tanácsadó junior**: 600.000 - 1.000.000 Ft/hó bruttó[^16] +- **GDPR tanácsadás**: 100-300 EUR/óra[^17] +- **IT tanácsadás**: Változó, projektfüggő[^18] + + +## 6. Technológiai Trendek és Lehetőségek + +### Növekvő Igényű Területek + +**Cloud Szolgáltatások:** + +- Egyre több cég áll át felhőalapú megoldásokra[^6] +- Azure, AWS szakértelem keresett + +**Adatvédelem és Biztonság:** + +- GDPR compliance folyamatos igény[^9][^8] +- Kiberbiztonság egyre fontosabb + +**Automatizáció és AI Integráció:** + +- Tesztautomatizálás szakértők keresettek[^19] +- AI-alapú megoldások bevezetésében segítségnyújtás + + +## 7. Landing Page Tartalmi Javaslatok + +### Javasolt Struktúra mozdIT Bt. számára + +**Hero Szekció:** + +``` +"Megbízható IT partnere a digitális átállásban" +- Személyes ügyfélkezelés +- Gyors reakcióidő +- Szakértő csapat +``` + +**Szolgáltatások:** + +1. **Webfejlesztés és -tervezés** + - Egyedi weboldalak + - E-kereskedelmi megoldások + - Responsive dizájn +2. **IT Tanácsadás és Támogatás** + - Rendszerüzemeltetés + - GDPR compliance + - Biztonsági audit +3. **Cloud Migráció** + - Felhőstratégia tervezés + - Migráció végrehajtás + - Folyamatos támogatás + +**Versenyelőnyök:** + +- 🤝 Személyes kapcsolat minden ügyféllel +- ⚡ Gyors reakcióidő és rugalmasság +- 🎯 Specializált szakértelem +- 💰 Versenyképes árazás + + +## 8. Marketing és Pozícionálási Stratégia + +### Célpiac Azonosítás + +**Elsődleges célcsoport:** + +- 10-50 fős KKV-k +- Helyi szolgáltató cégek +- Startup vállalkozások + +**Másodlagos célcsoport:** + +- Nagyobb cégek részleges projektjei +- Non-profit szervezetek +- Önkormányzatok + + +### Ajánlott Pozícionálás + +"A mozdIT Bt. - Az Ön megbízható helyi IT partnere, aki személyesen ismeri az Ön üzleti kihívásait és testreszabott megoldásokat nyújt." + +## 9. Következtetések és Ajánlások + +### Stratégiai Irányok + +1. **Specializáció**: Egy-két területen való elmélyülés (pl. GDPR + webfejlesztés) +2. **Helyi fókusz**: Regionális piacon való erős pozíció kialakítása +3. **Hosszútávú kapcsolatok**: Ügyfél-megtartáson alapuló üzleti modell + +### Landing Page Fejlesztési Prioritások + +1. **Hitelesség építése**: Esetanulmányok, referenciák hangsúlyozása +2. **Személyes kapcsolat**: A csapat bemutatása, elérhetőségek kiemelése +3. **Gyors kapcsolatfelvétel**: Egyszerű kapcsolatfelvételi folyamat + +**Megjegyzés**: Ez a kutatás a jelenleg elérhető publikus információkon alapul. A mozdIT Bt. pontos profilját és szolgáltatásait csak közvetlen megkeresés vagy belső információk alapján lehet meghatározni. +[^20][^21][^22][^23][^24][^25][^26][^27][^28][^29][^30][^31][^32][^33][^34][^35][^36][^37][^38][^39][^40][^41][^42][^43][^44][^45][^46][^47][^48][^49][^50][^51][^52][^53][^54][^55][^56][^57][^58][^59][^60][^61][^62][^63][^64][^65][^66][^67][^68][^69][^70][^71][^72][^73][^74][^75][^76][^77][^78][^79][^80][^81][^82][^83] + +
+ +[^1]: https://www.reddit.com/r/programmingHungary/comments/1m68lwk/válság_van_az_it_piacon/ + +[^2]: https://www.reddit.com/r/programmingHungary/comments/1hy21an/no_fluff_jobs_fizet%C3%A9si_ir%C3%A1nyt%C5%B1_2025_salary_guide/ + +[^3]: https://www.reddit.com/r/programmingHungary/comments/1lr3tml/professionhu_it_%C3%A1ll%C3%A1shirdet%C3%A9sek_20202025/ + +[^4]: https://www.reddit.com/r/jobshungary/comments/1lbw0zg/az_it_munkaer%C5%91piac_az_ai_miatt_gyeng%C3%A9lkedik_vagy/ + +[^5]: https://www.reddit.com/r/programmingHungary/comments/1lzoqc5/miért_a_fejleszt%C3%A9st_baszogatjuk_aival/ + +[^6]: https://www.reddit.com/r/programmingHungary/comments/16rlecs/fullstack_vagy_cloud_ir%C3%A1ny/ + +[^7]: https://www.reddit.com/r/programmingHungary/comments/15tnmnp/cloud_architect_pozicio_magyarorszagon/ + +[^8]: https://www.reddit.com/r/hungary/comments/1mnm00y/az_euba_is_j%C3%B6n_a_szem%C3%A9lyivel_internetez%C3%A9s/ + +[^9]: https://www.reddit.com/r/programmingHungary/comments/1dctprl/gdpr_kij%C3%A1tszhat%C3%B3_hashel%C3%A9ssel/ + +[^10]: https://www.reddit.com/r/Netwrix/comments/n4u9ng/top_gdpr_solutions_for_security_and_consent/?tl=hu + +[^11]: https://www.reddit.com/r/programmingHungary/comments/1n024ze/egyedi_weboldal_fejleszt%C3%A9s/ + +[^12]: https://www.reddit.com/r/programmingHungary/comments/1kcjaai/van_itt_olyan_aki_az_ingyen_weboldalt_programban/ + +[^13]: https://www.reddit.com/r/ITCareerQuestions/comments/172j27a/could_you_explain_l1_l2_l3_it_terms/?tl=hu + +[^14]: https://www.reddit.com/r/hungary/comments/1m24aiz/magyar_nagyv%C3%A1llalat_%C3%A9s_a_ho_elt%C3%B6rl%C3%A9s_esete/ + +[^15]: https://www.reddit.com/r/ITCareerQuestions/comments/14qnsvj/networking_vs_cybersecurity/ + +[^16]: https://www.reddit.com/r/programmingHungary/comments/1kazdc6/sap_tan%C3%A1csad%C3%B3_junior_fizet%C3%A9s/ + +[^17]: https://www.reddit.com/r/InternalAudit/comments/1guxv9t/how_much_does_iso_27001_really_cost_could_use/?tl=hu + +[^18]: https://www.reddit.com/r/consulting/comments/1c9bjaw/blended_it_consultancy_hourly_rates/?tl=hu + +[^19]: https://www.reddit.com/r/programmingHungary/comments/1mpf19l/mennyi_a_jelenlegi_brutt%C3%B3_fizet%C3%A9sed_itban/ + +[^20]: https://www.reddit.com/r/hungary/comments/14j5bm4/hol_lehet_30_%C3%A9vesk%C3%A9nt_ismerkedni_ak%C3%A1r_kapcsolat/ + +[^21]: https://www.reddit.com/r/jobshungary/comments/1fp717x/van_itt_olyan_aki_t%C3%A9nyleg_szereti_a_munk%C3%A1j%C3%A1t/ + +[^22]: https://www.reddit.com/r/hungary/comments/1laahev/több_sz%C3%A1zezren_n%C3%A9zt%C3%A9k_meg_a_tisza_politikus%C3%A1r%C3%B3l/ + +[^23]: https://www.reddit.com/r/hungarian/comments/dmlmjb/mozogmozgatmozdulmozdít/ + +[^24]: https://www.reddit.com/r/hungary/comments/1jr57lx/orbán_bejelentette_hogy_jogszab%C3%A1llyal_fognak/ + +[^25]: https://www.reddit.com/r/askhungary/comments/16y1o4p/miért_nem_tal%C3%A1ltok_p%C3%A1rt/ + +[^26]: https://www.reddit.com/r/hungary/comments/1ksjiyz/ott_megy_az_unok%C3%A1m_a_magyar_p%C3%A9terrel/ + +[^27]: https://www.reddit.com/r/talk_hunfluencers/comments/161585s/lilg_avagy_hogyan_legy%C3%BCnk_men%C5%91k_egy_rossz/ + +[^28]: https://www.reddit.com/r/betterCallSaul/comments/um5ik5/probably_another_reason_why_jimmy_was_pissed_who/?tl=hu + +[^29]: https://www.reddit.com/r/AskALiberal/new/?tl=hu + +[^30]: https://www.reddit.com/r/programmingHungary/ + +[^31]: https://www.reddit.com/r/askhungary/comments/1m73xr1/mi_t%C3%B6rt%C3%A9nt_most_a_hardverapr%C3%B3_szervereivel/ + +[^32]: https://www.reddit.com/r/hungary/comments/r50q14/lazulós_it_c%C3%A9gek/ + +[^33]: https://www.reddit.com/r/programmingHungary/comments/1byvxo9/mikorra_saccolj%C3%A1tok_az_itpiac_talpra%C3%A1ll%C3%A1s%C3%A1t/ + +[^34]: https://www.reddit.com/r/programmingHungary/comments/12knbke/ígéretes_magyar_tech_cegek/ + +[^35]: https://www.reddit.com/r/jobshungary/comments/1mcfe3d/állami_szf%C3%A9r%C3%A1ban_mindenhol_ennyire_le_van/ + +[^36]: https://www.reddit.com/r/IndiaTax/comments/15lffxx/how_much_tds_to_deduct_for_it_consultants_working/?tl=hu + +[^37]: https://www.reddit.com/r/programmingHungary/comments/1601537/ithálózatokkal_foglalkoz%C3%B3_magyar_subreddit/ + +[^38]: https://www.reddit.com/r/ItaliaPersonalFinance/comments/zejjjx/cosa_fareste_con_60000/?tl=hu + +[^39]: https://www.reddit.com/r/hungary/comments/1lrhc8n/one_magyarorsz%C3%A1g_rant/ + +[^40]: https://www.reddit.com/r/AskProgramming/comments/1bbywhr/friend_quitting_his_current_programming_job/?tl=hu + +[^41]: https://www.reddit.com/r/askhungary/comments/1i1rg95/nem_fogok_tudni_diplom%C3%A1t_szerezni_mert_nincsenek/ + +[^42]: https://www.reddit.com/r/networking/comments/2s6ty1/what_do_you_actually_do_as_a_ccna_in_the_field/?tl=hu + +[^43]: https://www.reddit.com/r/programmingHungary/comments/1adtkia/a_fejleszt%C5%91_c%C3%A9gek_honnan_szerzik_a_projektjeiket/ + +[^44]: https://www.reddit.com/r/AskEngineers/comments/halolb/is_engineering_management_a_good_choice/?tl=hu + +[^45]: https://www.reddit.com/r/hungary/comments/1i3at6k/lázár_53000_m%C3%A1v_dolgoz%C3%B3ra_hivatkozik_val%C3%B3j%C3%A1ban/ + +[^46]: https://www.reddit.com/r/jobshungary/comments/1i27owg/introvertáltak_ti_mit_dolgoztok/ + +[^47]: https://www.reddit.com/r/CartalkHungary/comments/1hs0lbi/a_v%C3%A1lyirajong%C3%B3k_megnyugodhatnak/ + +[^48]: https://www.reddit.com/r/hungary/comments/ygf3r3/mi_volt_a_legh%C3%BCly%C3%A9bb_k%C3%A9rd%C3%A9s_amit_a_munkahelyeden/ + +[^49]: https://www.reddit.com/r/Brunei/comments/1463vcg/rbrunei_daily_random_discussion_and_small/?tl=hu + +[^50]: https://www.reddit.com/r/hungary/comments/1ljnu7g/létezik_egy%C3%A1ltal%C3%A1n_one_%C3%BCgyf%C3%A9lszolg%C3%A1lat/ + +[^51]: https://www.reddit.com/r/askhungary/comments/1jrl6sc/netflix_%C3%A1tver%C3%A9s_hivatalos_telefonsz%C3%A1mmal/ + +[^52]: https://www.reddit.com/r/hungary/comments/znkfcr/betekintés_az_%C3%BCgyf%C3%A9lszolg%C3%A1lat_munk%C3%A1j%C3%A1ba/ + +[^53]: https://www.reddit.com/r/hungary/comments/12dkont/a_betan%C3%ADtott_jelleg%C5%B1_hos_it_mel%C3%B3kra_ekkora/ + +[^54]: https://www.reddit.com/r/jobshungary/comments/1fqjy66/4_h%C3%B3napja_munkan%C3%A9lk%C3%BCli_vagyok_informatika/ + +[^55]: https://www.reddit.com/r/hungary/comments/u15zze/akik_dolgoztatok_%C3%BCgyf%C3%A9lszolg%C3%A1laton_vagy/ + +[^56]: https://www.reddit.com/r/jobshungary/comments/1ha5i7p/ügyfélszolgálati_munka/ + +[^57]: https://www.reddit.com/r/jobshungary/comments/1hzzasd/vodafone_one_call_center_munkat%C3%A1rs_fizet%C3%A9s/ + +[^58]: https://www.reddit.com/r/askhungary/comments/1fks87z/kiflihunál_dolgozott_m%C3%A1r_valaki/ + +[^59]: https://www.reddit.com/r/cybersecurity/comments/1077u03/what_do_security_engineers_do_how_to_become_one/ + +[^60]: https://www.reddit.com/r/programmingHungary/comments/1cosvrp/a_hostingb%C3%A1zis_aj%C3%A1nlott_vps_szolg%C3%A1ltat%C3%B3/ + +[^61]: https://www.reddit.com/r/Netwrix/comments/t07brg/how_to_comply_with_gdpr/?tl=hu + +[^62]: https://www.reddit.com/r/cybersecurity/comments/ti6a1n/how_to_get_started_into_cybersecurity/ + +[^63]: https://www.reddit.com/r/it/comments/1j2f8qn/choosing_between_cybersecurity_and_it_degree_will/ + +[^64]: https://www.reddit.com/r/programmingHungary/comments/1do07is/ha_az_egyetemi_informatika_szakok_nem_j%C3%B3k_arra/ + +[^65]: https://www.reddit.com/r/programmingHungary/comments/1c9b3or/mennyibe_ker%C3%BCl_egy_webshop_lefejleszt%C3%A9se/ + +[^66]: https://www.reddit.com/r/systems_engineering/comments/19214ht/writing_a_effective_systems_engineering/?tl=hu + +[^67]: https://www.reddit.com/r/webdev/comments/1c1al5o/website_development_for_small_businesses_pricing/?tl=hu + +[^68]: https://www.reddit.com/r/askhungary/comments/1it2ssy/mi_volt_a_legnagyobb_baki_amit_elk%C3%B6vett%C3%A9l_a/ + +[^69]: https://www.reddit.com/r/programmingHungary/comments/15tvus6/első_freelancer_munka_mennyit_k%C3%A9rjek/ + +[^70]: https://www.reddit.com/r/programmingHungary/comments/1k32rq7/szoftverfejlesztő_c%C3%A9gek_j%C3%B6v%C5%91je/ + +[^71]: https://www.reddit.com/r/kiszamolo/comments/13pjinu/mivel_%C3%A9rdemes_foglalkozni_ami_ma_j%C3%B3_meg%C3%A9lhet%C3%A9st/ + +[^72]: https://www.reddit.com/r/hungary/comments/tyd4qf/jól_keres%C5%91_it_programoz%C3%B3k_fejleszt%C5%91k_adjatok/ + +[^73]: https://www.reddit.com/r/programmingHungary/comments/1jnydqa/mindspire_v%C3%A9lem%C3%A9ny/ + +[^74]: https://www.reddit.com/r/writing/comments/1afxf91/bad_experience_with_writing_competitions_or_bardsy/?tl=hu + +[^75]: https://www.reddit.com/r/programmingHungary/comments/1hr4nxb/gazdaságinformatika_2025ben/ + +[^76]: https://www.reddit.com/r/programmingHungary/comments/16lq5nk/its_v%C3%A1llalkoz%C3%A1s_ind%C3%ADt%C3%A1sa/ + +[^77]: https://www.reddit.com/r/programmingHungary/comments/1jtgzt1/mps_salary_guide_2025/ + +[^78]: https://www.reddit.com/r/programmingHungary/comments/1d9cpmj/mikor_fog_helyre%C3%A1llni_az_it_szektor/ + +[^79]: https://www.reddit.com/r/programmingHungary/comments/14s3s5g/change_my_mind_it_munkaer%C5%91piac_sosem_fog_teljesen/ + +[^80]: https://www.reddit.com/r/kiszamolo/comments/18zzfiu/meddig_lesz_m%C3%A9g_ilyen_felkapottj%C3%B3l_fizetett_az/ + +[^81]: https://www.reddit.com/r/kiszamolo/comments/1e68r9i/it_meddig_lesz_ennyire_t%C3%BAl%C3%A9rt%C3%A9kelve/ + +[^82]: https://www.reddit.com/r/hungary/comments/z484vy/büfészakból_it_szektor_avagy_hogyan_v%C3%A1ltsak/ + +[^83]: https://www.reddit.com/r/jobshungary/comments/1mi888f/miért_nem_%C3%B6szt%C3%B6nzik_a_korm%C3%A1nyok_a_c%C3%A9geket_a_home/ + diff --git a/docs/logos/Generated Image September 02, 2025 - 3_12AM.jpeg b/docs/logos/Generated Image September 02, 2025 - 3_12AM.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c2e4938cf7a7d395bd228ba0abc1651c8f90cf06 GIT binary patch literal 67064 zcmbTedmxkl`#*kfjv+d%LJpm4-SIgG&%)cp`{cItCGgpBVJBbnO3pD~_a# z{qKA9!nrrdVrg;sOboLI!7j##Eym2fL)76;3C#Qhy$F3^uwvp8l2XzOWMtuj{6z>B zBPNCw7n6_>hpsVU@I4~FSYpX)eM`xultWT${BWBhuiuegyY)%QGHT7>Is=bWQ43_2 zuTWG{*3i_#6V?+q|6^!myk*_+j{-Zlad8%4XA_5JWkcfEMG@#)exdno1fYLzllZtKh5mF z6Z_wJ{Xn)M*!hPT7AqzpCMG5!DFF{jX-V`UEh9bukonI;ZvG*UJ{11@n1eh?iVPM#atsICx!uK5?hRrkeP{rY=b|Io;uSKL-NZ@4fNCwjdG3KHd(6|{4`8t0x4xv=)5by}E zQUiy)Bzna$5f=v9}AAtSi|KJ6?P*v0diw#b&z3}}{)&tS;7`Pdh7-eaY~=6=ucID@>c(cHBh{pbv)PEh9gI%bJTHs@ zw=?x<>0;OW?9jVZgZX?^PN*2rrkQ`A3Uk#n6K3>aulPb7!p`$x5g2SLUm0=1bGaC@ zHb^}Tx|bo)O47w~)HWEfi>(VD5yZ%kP@OP#Hpv7Ab%e_sPZyu2`?2!QW?aK$#Ad^7 z=uGq2PS{x@#){UKk7($svDr?TGF=>e$Pb}dw^~RQ;$YxpkWfL5^>L~bwhc$6SV-lo z+ZsWacwV|Vj|(puOoL=(3njG1Cs~It5DnF2972}#sOcc zLqi1djcizm`BhQBibJUU)957VsGj_NR^lj?2##7~v4D)rL)hqOi$+pLK|NeRa#Clw zsv9Z7q3+V)CjbaB1b^@2@gy;oRtZ`n9rRMCy7aUks11k$2cc2W>#Zj30 zWw3npi8$nEP4ZbxmkkryR)#B}RPhiEZ55^i4dKBo(EQ#KbF7tocmw|0+H^&x^4nk%;bESbH0EXYfJDver0?s2Y=OU{|IR z?1T-Y(`I+Fk-Q}1j2LKal0w##9|@_Z(-F3SU{#`$HCsQMYfSu=|<@iJ=VAjtUQED6)+^AI{=ya(F0geg*Fwou1**mD*{cCLe|DE z`40eKS@Ywy`VS<;X8%PpJ;h3#2Lr!|0%(gal>`n{l|ojT-&EL9TnmBSk4HF-@hUZC z$m$-lj)W%KBU9f(QlG4iL*(ls7=4xSQ(Ct+_iAXf4OgfTgOTZ6UND*OMsuKLlX*>aArCkhP2xCEYPFsr)m`USu z8W}5y>e;xn>0-o}s`t3*5>+@kDmB_dmg$hfr}`%&_>4p*;(%`hm7hm5En)_9M>Y2P zcF8S#bnolvTL4sB5dFHyi1un?VHRl6nY;Y)bO}LxCJJ&+7;xj|UsYMhd7XuD(RqNp6hC?X!a| zPR98GQsNE<^I_+EMS+28inIU&m)LmA&O)l5MbI;&`+`9<0aGBm9nXQzL9BTcQB6fQ z05;qQFo6Ou=!r!8Uv*W4=AdN_u-)@oO`u^A9**5_M#C5ZaN<$`8sQePd?ipv32hA> zU@;*?t;7MfaA0|;up!wmIBFy6*@)VRpLH9607_I` zjJPU5T5MhP0h5g~;?+hx3lW?eew7!rhv(!Yx<~ODNfH_+O}Dly%zd4i=%;mA5eN)l zdNl}0&h z7|Z8vCl7@j151#u4cw5&E;z$sN}>jPHH`x+M=BUgm;-4}-wM2wI$xNw9Hw4Ah`YRPZ!#-mpZ*WtwD_;A(75 zvcp1z>A9Rq2%#>bSkYjm{4GJ~II0{~xC6_?fB?zb8mmBBQiVvwT>XrQ$j);H{y>;l zNGj9TtP^8X33fomBQo8nOatf1L`*A7te*i7C{ENp) zclB^oP)r7%gH4G1i?3AA`XpH(fLjT2cwU(XQVLK7_>1b0A7Gy|B4D~wJ+77Zpzulo z0wHal2ir?SZG^(~w6wO>kF;Z2XkZg!{#sk55$-sTqXhIRh5{=~9fJYjGv@mO*dyrg z@ZeKeBc4nPTpq`X$x_*hcl9!2sC<-M&3}Ft)o%h_-wLltt%><->(2uX4*`lt^aH@LH5mpRJV=FE zaeBx~e>XFctw!TY%{9!32CNGSJ*eG5SsTiXC2-+v1k)6c!Z=gkHVhptD1#XB0ze~l z)6SwHWs11GJR~Ut>@C483s85Gs_a5wByn&dd_G1`0+;s!og;89JQr*c#hQqC!~g;O zYp;Oxf^h`Hk3e%kI^S^6*4XnVlmL4r9!IUl9;7hA_+yzaV5uA9prdW5`a7X(%5*)O zkq~(qBuiU#n@+F?;7EeL{gV zN4cUL+7U*N;EN8WjhF}f7Lr0TS&gX()`O*%lQBYR{T2Wll)p%*P+$aa zMmS88^1K;~V<-e0quND-$@^JJ00v1)s5qg_{=a@0><>S?$Q0CkoHS7!J>j*~GFm~|QO z7I`!L8^HY-^d4wHGTGmbjHq)l2Mra3Y5cv?)lkOp8?H_gps_^0((_Zjfw8DTBw0T!ig|9uwyX1 z7hJWGJjAmpW+_Zm7d{8hQ>o=*@E>H3?y&)@+Gb5;gEMMlMZ1fo@+kw`CD7f2jaghN z2`V~Z-3B&7+i(r6tU(_cTGchXhl-`5P?2~WuycCeJ9T^u)`~zk&jY|`g7|#HXccC3 z{1_lUI2~9jx?*`r&}^bqeO!Dp;;I6~z6m^6@IU6wgn&gW;lu;m$(HJ|LG6*HIoKQ2 ziALLneo96;X)gFK^a|B1!WJj2a69UI0&GffqC8B|cYZ$>vMu;h~H)k^d_}Eo++WXVhxL+-($BOJI_2Ui4+S= znO0qmm4yB`BaV=R^QBAc0rD~3^5k3`z+_@q5ZTnlJAk+qyXadJ`QkZ%KX%{?? zh_GLBfwOX_X+74e1V(0$O=OQ1D6`%qb&yV=OQS-;&W9;z)3h>0LF6~ECI_8Xfqwvc zY6Y@ce#;UBgeM{dR>>rv?`OB&67~6TRAJLC;40=|8j#VudebxxmT7?nCb$S_If~i1 zBwTs4kQ3{Ie?yEa5!F}+nsfEjvb}>LlL$T?lL4<>YlXDHJv590N zIBD2kF99!z>=ba(!iiz9wyg3*A-5b4%)llV?Grp!FrVo9fOh}}MP4w0#S25p z0<7$OJb?=yuavF6HPOFk#~~K%V)HyIG6vBoaSch>LfrP45HK-#j#Pc3>afK-9`Hbq zNC{QcsM$K(R3h4%_>OuOJw~6bsF~QaU7W}1v9mY_h7{p;@R<+;!yRmoPj(9fr)`v1 zhLZ+*6bCELodlDE-Wf(`fSXn_nsKcZ_X6jnZ^4-N*c7>(W+HO1hG~rMDM`hQL?Nmu z>D8+;qHR#esw!J$vQ}BnD~1vc+KeLi-&JN)1}rc*4^|j$awPo_7u zL;gvKk#SXULCm_q3}fTXx@f4~01Rd7+eKPQWdmfwD_AfuG%8VvYI-F&VK^j-2Pg{; z1ZvbIK??x!6X3QFAQkXNC}oP{oUVC)7wg5M0SqxEbR-bfVX_XslkiQv3`eEHz6WDu z2XH`P!VvTaEF{fnupnpVU7=AJPFzBK4+>Tg0D$UB-jNGx+l22493!w8aolF zg$~#@pmqe>n^BbZ%gK*Kp^LH&1}1Cm#)dtoM+5wqqoBS3P=4^rfk~jE$a4as6vA(D zT7_jAjl!g497YOYOil60?r(t>pzSjegjWWD2K3S>BSvl%)s%&xag<7cdkXjpJ18Jr zRD`ZnCt4pm<0s0Doi!xk_^J~DZQC>PkR3fc|_4|PGuupS4h{Y}l zm=Qk+L0W@&?U=?KNrpT#b}7 zn%^Fy3=AI}Pl%zYP|9F>WvHuHbrg;Lf?Yzp!%_dvPMpW<;R9gv+T$e|GVa-$$^bfX zQFPSODWS8lfJv;trCrros6|9Fo8myvWw+A=z)(OhcqJerJ+cZDAt`U6yyv!~Zjb}& zIIu<#svyS60DMo_3swp|7)3Pd@)J`>3OpEc-b^aNtSg9!gn%^Ufo)pX)l@<|`eY?g z7!W&nBy2B+!clxjzM>f(<7WfL7Rgg%-{eH05^?_PM$UT>yo@-Y_@IB(F_h#`Y-|aL z6Fr!Ecoq~SB-yM>zjB@ufFVN7mjUn}Eh5z)h#Xnm8AF?d=&~Y}AHb``%Co_Cfa%~Q z8>fr+S)iBW+p=|G$tpEzsE-9p?ZsTE3DH@m?G`GAj+&B$nCdW?SUXdX&M2e@sswO5 z=?X-o7w{W(1K5Db84$DqLc%<#iJz>o80TX7qbO5gfvs7ZudPxOZ6S?c!=lqL^Fba^ zNlh9Afx!L8#3$PZ5Iqa^lq$7N)bczSD@QYKv*`NUu}oKwcp+>p=rvu&NE3E7*hes+ z32});h*a^zKuYnF2}ujciX6ps3Dm*L1D_7zq5&v*2=V~XsN&1PPg8`sxQHtWK-JPE zK5#RDWVjH3VIyUzya@glz=E~s)f4Bx1Iwy|Kp!?5q%C8+&4``m^2)9fd z8~L~l2XmEiaXgB8KCACCfVgS}ODY0Z)xZ=%kLU(uKR)Eny~s#ZyEk^?_u<4jgv{BkQv5uv_qI}ra725ykJmcu)UfrFP~qsQshiOiPWvmvIwyzK z>O7gEi3p#F@5U@rt7%Nw@d1*k?3hdVk2&ONb{AIn(%J2f)1xeb?pJ|JW}?UPkw4?4 zA&J;K(>(*$U-uGEY!+;>?lYJ&>p8d3P@ogNR=;(>Q`DvisUw@agB_Wsn{&!Fsz>+R zlNGF`*oUu7ns7k~P<4ZCH6!umNm#Q9(_a{^e&ZLJ*g`iiesf4K(<}SH`y|RZ~3@lL@F9 zQRJb1cnBnF3ZSAiAGcql^U>~at?HddBp`al?Q`t z1pv@dNGRV>7QP|8h9o&F^CNe9t57@tYSX3!O1xQ*@cJ|9ahvGxNfP7PbV|yfPZ9yY z$+l0T+HXBI%ar2%W3yx(UDNkcv_?`3ViNBjQ@o7SlJ$yLYM&Xpa`3*3)v2tAhyP4S z_kKDid&2qW$?F&IH*~1Ki;YcFn$`X|AQUSbpG=W2EBd%@NPC5Og7A3k9HLqoX0C9~ zZ}a9XT2A3iMU~)1@;PGW0O@6f``Sqr(d8+R*)I`t$#xNoMEo!9L#FKw4w|#aV_VlW z2RhGAxQJet&mn`mau)nhS|##tx$Z+mi7lF4bUR4Ur{g*V^$XSy{zO1=CxhKY%k#q9GzKfZI&UU|pmgUNf znj04vB=iRj95!&X9hVQzd-TOo@b0Sp1(j0HnqI$UXu;hscMMLcK-y8&9<8 zu5hP6UMQ$I?Ju~$1;C;8UxB0Wznp_zHUe9hYpUfd= z$z#ig_kLOOuD1R*x2R)0qQq?4aH&)34YLN3dR{bf&!tfO499$7=+Wm^q6oqMkk@Zt z9#e9>9+>(v%Kni>|ITIOIX>-0UfG1LuDQFzy^9^VUN6)8qj8=%Pk!vtD+wC7LfRUJ zGToRr15l7Ul2V%mv2OpS7^(oGZMeL&s|YTI4gI9XGv#s*$) zYXVL#P`i2GiU%PIAX8#$BWO?s%(wdAG$%$v8#umaQ*1el9t4bjn!e#fk)SKUXh!^~%@$_afcT9d$EbXV*w==B=luun#`^zHGhK;#2WYt+Q3+ z!#4bBX1PC;Dj_l6?pIiPw7Jn`GB(k+_Sw$^9nX_DErCsaK*>ghacpRR+Z-~Da~34N zYx7GFHCPh3vXo_e(<8Jyal!1*Pw!TNis&Yt-n7^~_21m>!?vG?OqP3j?7JCDwfPEJ$(|S8cY5BeO;RKu2&`%=C(iB@YvWh*;P4^DseK<|LyELVK_(adaM2Vp1pQ>eL`+n7AA8)@-8hHFV z!eusPdfC*L(1oJFd#0;f!q%7nTdw)fC*mC9{?CCS^{MW{+l$xi+FrLN2f;ARZw!x$ z8fL?sr<&2$$2teorl-?>#$IYf+qapc9L;NjT?+XU~VrVItz?25;?9OFn|k3{@& z&;MBy-FQj(&*re=l89?*3a#qjrrjsfq8gu1FKKHlOxi?uTUC8#(H7lXezG8sB_x+2 zvxqT?nJiQDt6I}*Z0=hXmw5*H5J>;(Kwqqekt?H|{4;z(uWLZ=M8x$<=ktU7#-5H@ z?;$@yPIU2d)5R|f4z&DoxB0hw`1=lkyylRzv-#~3b#Vso``o`hKuYOKQuj8uxf#x+ z7D-QAS*vXt+?{xD`^4vFuf3UbNO8@H_&G!^$Kj&#$OFgzh|KAwUmmY`WGcU+n_5RjygQfag6`H%8KL@Z_57j82955>BA6@L4$`E($^=6n1PSJ&@9 ztpmIbN=!E@t-H$HqSv|W;;Jd;RBcPnG|r&Sy>zW)V%q{K)@kC~iGWAcF{1kLmriU& z>_oSE_lA~(ciBQ$(Zglyg?}F48b<3nOFg=&p>=;eC;dh0QwOG(iTa=H6&>3>TiK9u zBrkj0q66N=H{z&=<`CC!DW@!QGJ8bb5^dKtFE<*mU45hO+Q-ssmMT$Z762%6M5>FeoXtc*1bJ>Q+V&qZF8Hd$!gMT9h*+oV*-DjMR5g>AI&;O#GAjyyz82J zao&d*v32L3Yt!nYuEC17)Tqq^7hT>3ywx+E+B5U(SFU<%^3q}5Cx09VpX9jbFtZ$- z;$yxhn?G8%b{%iUX)RmZGs`5d^4cMnvLL$0nwWR68tW0?;{fU6lXQ~ISwbE{WkM(x z4Uj@C2*M&&*=URjxFuBP@cPKQg%HmOf_%=>WYT;fRCqTT>=_de7C?sJ$CN-6iE=en zw)z&bQS$z%i;4y;a1>iJn(Sq!i-b0!xnRKBtWp&s5dl4rhWvF8W8y@E;QbPa+sqeI zOtiy|$Yr8y*ZebDTt zUs5?Y4u5@eDvxLvP&>Pz-D_XADKV_i{ok;%DTg_vgdD0nIP++F*`VWlq3)&H)6Pe= zrz*F6c%^#Yaq{0Qom?x0-6wY!FEKsR=Ds5IU*WQ&vqhM=0YI zslg0J`srn#C8S^P^m7o?ET(?i#5CI87}xNidk*=ap6aD^!}Z@BO4pB!+1HGAZsx{+ zhc%OxcuM(7;`?>1D(`}+c z81K75$)fn~2&sH}sD9}8Lr2cKw10>_vd1`Czkf%X?Tk(3vLDf(k5vcoG>dg#w3YoC zIrd=J)j5PzFuS`*C;ZDCqF5yL^Xc@~!QQcF`=9Zq)r+6T*DlrEWi#8;=W|r3SMqAl zm~6zMBlq`xI+V4);>@uv>^Opx&C0B9rM-(RM>bF73dd&`ydLbSu=5iroO9NVK2xqy z`AoJe_ql73r?z~U=f~K70T1mwWHjS@(}jm76a7onpD#JoA&*9k=Dh3$Ct3dMO z-W~Gh^C=<3I4WXW*4~*J9Q3{#xrt=*E-J<~Bd-^gjPIvu<(8ZmA2qk?4|T z6K9Xb?|y4r`_(KBNQcz>87ZAgg1|GdbCQz<0pEgn{t~9k38;yqo}xp7*|708)uM+eGs^>fvfgmnuW-F2y4*?wb6n#Wt0? z;80L&8nQJYv`{-AT3|p7fPn_(B_LG=F^+(YYr_DC){vmno8&`Di?}vw0+vI;9sr~* zfdPe_Xl?_A*K_cKW`P5}h&IxnuKzRU8ET`3E6t0wF`QECNZHCPk(C_t-^m z7fW`lLlbQ^P*gVHW+r^ymdFUl1nT%GiH3$h#%gGv@GNz0a*VljXIo4fHGG%K6YSGs zntG$co95i-QR{>OF&dkGR=zSLIbLSGC`^&-wFt&{_Xk=wtYbtZSH;XB%BDfWp7I8B zBVk|j%?(Qu60XOO9m5;kVB)kQXWB^yYI{2}`G@z3KXFVAwhTA7o34^I`r>)f^;&&I zV$OuBci+M(o6v1DTvO+nT)~H{30J-PW^Qx0cJ$WY3;Y?;!ToGLa_;bm(}PGi#HbCI zG@7+FdB)+qv@`SEvbfIhklox&EyC+(7)O_y+FqT}mG6l&=1q1FUT5yjxS*lCj#VLZ z|Neq?V`9kzMN6hvfpc4)wtT;6TkCA{c!Q2*s^^X8`Il0Zyy6visoylkYZj;HeCLcA zi-M+1zunEu2cKd2=i=h8T9#88;Y0gZSFvyB-tPO^7Wunl*<_Bo+kp{#Jk^;AeIcPJ?P{)VCHip@F9#LfGHbuP_FNhDHBD-x0? zMxmsb;^x<={ZFD&dNhPj3E#L-<69oguZgaYgrK?xR842Z__;d1bG#J3ShTBU#=64I zsOSL6rq zD%7Nl4{Wokiw`|nu<5xKi`>n+c)|Jo=0;DZfAkf*?E< zZAoA#kx4i{1l04K=vzjJh`+T9__veIq0neIyWr)6&JAY-a|mOh=7WPT?34CbCot#7 zMrD_gQ@!=imb=!a-hO3pQ8khJ&g$#(!pXD>-Y;H#+L_Jgrxi~4pKLewxM90x%iyjX zk1eI56xQ6S;zigL=QZ>m8yp|I@buQ+NM{Qnn||qxk@KIVoL_ca^_~@veToV%i_vGp zX4i+}g&idk%d1+dE^YDb8h`R9Bcf2^-M%*oN>cI{8}4vw6D8Bqw7I@pf!HR#BWAd$~BTz-)tiry;AjQF-UX&@1QF-`x&R@=gZBELR(Sb&ge|a0rQIz%1_U+TY76|+yLUMTHIOT^3R27i~;gHg>x?=2cIv` z_0%N9lQzg#aO5r56uK3&9ixg@h6W8PlwS+1ded-3VL^cRYR$$Wx!)D*S;f7NC)h&@ zo-Hex1=ErU(~))Yee%2hmmw~E^pG=FBxig?)~PsWfIFF zg^4R9Ang7;_UZJkXc-$WgbH~}1m_W39uG-PD1Ot1BrI7AY&sk2-7)lqs&u^S`3x4V zJqeO{c~D)|6c;HAh5V2TvazYu7Lx%CLu;4b06&!{06LN&nJEIOhafNoQWa=uBpYfX z2oRSs9s!DK%xi}<6BA!fgXo7m4ULjiL6MkTO=D!5t)xl~WCDOXz$hSBEuj_cIz>G^ zxeGaE!sq*U*@>Lq5cHE>w(t=iqml8hxdQ^vdMJnN1XX~52=O+hGf?#BaePm6qyWGl!6*J<#sA2K^BkdB@#jB9o2EU5&nqHSn*ygQ_Ly`e zvGen{hF2XqDNj}0IU<&2w(n_Wm7`7tF-Bfr9S-+5erZTBdA8=! zhOXG}xnl=~4SlNx&h(6|+E9~2Ypz=Fyl%r6iTGD9+PUSB10FnI$kJR{$$W6Dz9^-Qp?f)I$5zh z=Y%{H$=Nl=>#=H_{>Zbjb)W_upAuP;@n!oK@_3DSY`SMK zUy!K6|6Pq$V^e1&RI0IO&?>WSHq0|n@U3qX$qLLot@tRS%#AQO9u;bGFEF<(KuAxv zN?hvb?`Lpgdrin>oFgJ{vkI}nCfmPWZELgP=|xtkUu*1z+2wVn-fb&IBfr$`Vm_G; zsUa#7l&?2qWjG1zFqIL8b4b2=pPj&`(Ymae?x%UX)lB;vJ=yPMbY_~l5j`bb+MM$9 zR$6{l-+qBQT;qP^@$l(paXK|VbMKSJTD`WuJ*#{V9~$3tT{%VGZt2ka!}7;Q`qkbq zS6!dKr)UmQ5NUP1Y&zZZ+~F1kQoz0V9x!%SXx;lmP-^O7Z}&F&*1fuszF#2=TB~F? zDU?)v{B>!TRUp+iARB5s_$aN-QKGpbi@qhrWBZY96A#2bzDiYckTzAGC4bPa+w-;f zX=0zFz~}qxvRg-n&*(~a$LWr-Qsr&c(r64d@%vj?EF;st)qe6@pDg&wEgThr1Epqj zdyB&Nuc8QDk<`e~g}QF}p92lc)l`Jz7a+)_7-&0dW@qzt&C>l9VRs%J<0A(i@n7apSvx3qOht^cuRPi+Nn1ULsg^KBxZuY|1 zmK=t;vB=6tI&jKyh2Aq4*>i7yx_pXRusS|2v+nfT3*vjSo$U{7i95&6=&dn`it~$m zerEc$g}w-zY5{J z%cPWLk-u{$i$w;)izUq}1+qulnk9bvJbSrPEAsttwzrdEDPC2{vBgT!_t@756K7|V zifPSDW-Dh&vF^3wO*G}p+w%{YswV_mwpOc&Kl#n}xu3c)Vn?dHFydlCNb6O@a&ugP z-Hg`m^WM*IZrNn$VWMX&r?3hvXz{wLQ}jdY=?~SaM!Y*;TG5{9H3;_4AvgK_8giiZ zBM7ZGLV>*o+Kl%q{cg!~-x_Ua({d#t-q+$4XW z;P~ddXJd7uSpBP=8@= z;EJ~^4vSWl8ayq3@B8Yi;D}30+kjQUL-X$u0!7hA4FCKtN`A1+bqmd6&$owGZ%yXe z(~2LYB?|nOJTRn&JlVOY);(9D_p2bbaa;K(?p~iKgYC)hCm-Emt%(_08*57BA3U%6 z((_G6<*Y*JI-z%Yl{&o$89Zmw@8fRp`At&xiMrV#x^(A#lEHbECA!#e zfeIxFv%9kI_b2Zbt9*HzF|5fR_aZSA#TXk(1sjEj4)u1C!e(WQC)A$VuucDc*)gbF z@oDF#A=t`>biMn$4pkrpxp*>WOFLq-{)_ zePHFOdT1)6rxNF9XCY1F!GSLVq$?_HKH7uY=+bL_o5wGTqOxoMZmZ`{9mMpvx+X>^#Ee8)5YipCR>vwG%} zr?1KRzEPfy2{ja$$(Btni@iK;5VoAhJLKvSyL**^ZnXhnt&6eR{j5&h`|`n))6$-Q&|9YF@W*%|E`e zY4);jUYt`XteC88^Hp+PgqcWP*IIl`{ULRC+R54Q;+wUlrbmmOZ(QP9*Cur29+`en z9JIf+_Q8`GF}~N+JbNEop;|osQRf~%cY1?xUH$OelC}gbrQN$#7LkvNxhLgk-<%ZC zAKam(d;F~pK^dYru`x_BUAi+<`2?cjSG>p+)9QG6c5$8Q;x@Zwb;R4YW^v`eEW00F z{d&N0ed)DhxtwK`_$vi&8Eog>A?lwx`V6Ox0y$$o!rIPY*3^JPw*;4;uli!2K#Cpe zo2zB*Hm%nJ)cEVnfoYn^tW}rgt}v>A1Qw~3oHZ=j64~DPQ+M(uht%Z!tVZPS#e_e2bn zOujtLc~F(AE;emi{C+sf?AQotY{ATZ^_Ds0igRn?)kp6KeJ*ui35R_W9Sg&kI|P#n zZ$ErfA$e7GBx)vqx*p9hj5#Z_tZU1zeGYzS8(_;xiqN3IKdS;K!Il^oGR8TK~IS3)+fE=p}xj^`4b#G>9SBG37gv_qX##% zUdR=$bbA+7ZkF)uck81^zXghWX4?N;n!2y_de2ZTIJ3(|(G^XEuc0Rduj7Lr^z2da z_apRw3C8!{*SpVQq+|F+5M7NrA6{)Os3`LsoGKk(Ij!Fkq$YRgqiZ+mY*1j!CE*{f zn)j^_S};|cC)4DPxV??dOCINmbgqn&OsaAfeD=hVgJpLIAO5k zdC2QeAC@Q{x@>0}xBcw>^(>op42hlY!81Y7--+2u`aOr{JoT%`hgDw}Y!Ro*E0t4^ z6{z>8aJ?IXdhZs7R_R|@e&vB~Tz{1bCMsdg{Y>?=IP>P2Sd!NX(pZ2fT#|d)@XF{P z)`{IM2PY28@$$T!_Lu>a*p7q(PIy~j75#Dm&YB&a!fB7Dq zo<%F+{}a~zTNb~&pdh!lPpfY80)AutcjbLYZbVtD&;Y=Fv5ZYNEixMyUJeQH@jRy8 z_xpkPq79~T#xl(NoA$=PLC$OzMGAk66$vBCny(H{YYm>bq7~WOuiQAaKwy4kawO#P zwy&S0!J%&oe;%&*CyRLETF0IJXV&5` z4h&Y6<3c0+gvAy9dkga%eSCt}2T_}?rT1rAR(gusgC{FICS`&*tPpB z`(rb08wRzm`h+Tl4~ee`KJ)GS8QL`WUZAO(A*Om(iaFf7q%0}H5Dv=C*IC&aFSLw+$#P>()*0njL&pS|aghP&anXPg`xS+zKtFrl5*!fAxh2t71dV z6{crP=a4(Q^Ub=-DZ7g&(nwZkR!5c}df<4IPqlSCn}WMBl^Ord2po zH5+quL_sW2*CEWTfZk^PPoqTEM=jy67e><2k2dLr1)u();?6qwqs=~0VPf{h98z=P zwY&1inrYJDx_u_0SMHVvei`jhzq;Nofyz#3ZddHiKXR_5l~$G5*r;Q7nyqsCwc)43 zlWslEDZ=Kf`RYpDvKv2YAJ?|}wEtg$k&~~H%JK?lk^F{uen#GluMbZQykE|D{r72{ z-=$B;&l!WA--oNRx0VKo6?#)SCwnJNHTT<|m$;Dr(&NUBS3#4buYYw{ef430xs-)?udfvE zR#lZga^%o8OI6F9-|eM>fp^*_HnG;Zbz>FEy*4hJ>0hmp1=3oqcS9Tce7(y)C;SqlSm&tE4lem0|{K~>V1$)lMJsfnnFMJ=P zq^fvi-`>NEtXHw}&BBj{7ySi4s2l-4g&~mO9HYg;GL0>8G}0Cvxv}z@o2TcHM)lUV zXE$WXZQ2rQCv;j`cN8|&Th0DXY9pN)3_e-)&6vBnXywu^o0qwqtW*@>tsbgq=6MUd zg1m$7HvOc(y861YY2W+mN;$@ZiZ!YaA1Z8>UKQ(dF*`gjqQr*e^@Q6T+o(`dpOjy8 z`r-lRW`Xf7*=0>qmRbu|&yMkfJl*5oH1xhac}Q;8vfU(-X8572C3XtC_=%sYyG<3^ z92bWg3B%*tiWmI6bzr~M?USp+-{tH)^h@>BLzApE#aXdY&C5+m!razJSA^=N50|St z=r(V==F<4beBT|P)1i^wdcUM|ev8_Rtw=2?bBMZQsn6vTgU{a?nwXN>_AOi0G)oQfH74iZH!E1S0xeDAJb2vW_r(ewO!C!KKG%p;>gUlyyeE!(K5-?bZ z^y4x1Xc4TP2+&ZL48F%O9HVMS3wxE|umXl#M&ORab!fpjS`iCuc(TU29u6;}MTO`w z9wm+@oR2~(mC&dal-xqWE~I586NxDl3rQNBE}B02#kG-ZV{AJ%xddac&*X?3xSwI|-DaDH_do??A( z5)bNMq&C{`J9}U>#x|yC*@M}FDy=Q$Q_2gon=XlbHlF%oXRyR>X`D^B&FJR!%*#Pp zj5i6?F+6{}l!BE^OENJ?xX|J`wQr%1y3Ty3xcQv%U8Q-0P|? znwoJ$b{4e-`mH@ja%)fDTl?(UdGl`alJk@ac}M5EhBu@^2ggYD!AIuHZG>9x`9lSk zZ3my;6%KF9)Y8LOITG8qb;|_r=`0K1^X_}*^PCSW`YXsiU(@dVR*HDSsnQs*8|u`? zvGa$$U#%umsZL^9@E1W?d2b-I!^Kz!FNFL~29s&C4412dshf1depvtS)paq;oDRqN zBC0lV>Z26I$ZImeJ1U&WZ~C4C+<#1&)#n$le%#;V^W*c6Z^$pw~X%BjS2QkUX_q) z_&B!1ZP{i;_L-3-3d2J)&DEk~7hfvp90>WfqI-HO;^xF2MZaCf&SRAE$3ylG^uF56 z@4swqI{Wy&Rl?%P)2(-7RYc1wt1g~&99TPtBqUJP?zKJoIjC?lB}RE@4MUD)AE35W znDD&iO3%GJm)!`K7y3W`vAHTN+2dfWK68>BupD>~aa}S&W6+9?-4aLDQ$&Iv?YYSzXfCiq3or`^4rFmiECd66gG{8_kx%$YIb+G>xrF_YoG`* zj?=5$#Es{W#A9hQ3u$ruhz4r>>yI-L<8oCRPoEal4IHY?6D14UTi;qMk9v_hvU03n zi!247_S4&$`%SX?oC@lz9g9v=K1}#x*4C1C)a#apovbJ=`lmMkfYZd;_Xm`B9JX#J zI8}UGT9qF>er{UTyCrA2eOuu%_uNE>OAf-kQ_B+~j8w3ktdb8%O4^qv9I_2KlXA!2 zeeYi@yQ}<`ZH)t=>{Fv{->D5QKXggKQ)@f6b5!>;$JHf7OLx?cL<^+^3X|rS7tA46 z&qzH!+}TABW~w@7`|Y)>%C0VJ_qtfJ#d7QKC}Gq)?vr0d6ZDIJ!wo11RSMs|q zWoNJcu)U;Zy{>E8=NY3%=cTQ8_M7f<{iJwfh2uBNX==N}?!J}Bn}^L38XKEAX-|Fn zIzn2Tmyrj11aVxqrFBR4p8j#E;r7O7%hra5_4t=N7$|l0AJ*;5J5{l1;}fIPzA{f! zqQFx19-BCvtV(KWN=STOqBDIW^yURMC8FqusQGJ^&wIbP@Sii$5ywe5+9X4?OSmQI zjPAnox+m^`{J!OombvSYe#Q51Gkgb6)3B=7gQj++DSZv4IU)B4+6$&~>ZY0&3cCI7 zc73cVwZy+YF;JWH?K{EnL1A7l$+z=fMuPG6BbTE&47Ad=I=YFM^Ch-EDh@5-jEl68 z&j2`Ha;-K?AsaCydgp6sAO}U9QWxErX_Kr#=XYlx1o677ZBF>ho(}v&eQ5BlWzc%n zka5nR2W=H^7kamNmudU7)<06--pd`{*s&HX_~Lem9de`fNlmo;*O`3{9a_`4V=ac$ z8y(Mg2}zdEhBpsLY_QQONxWt6c{8#3BdI_wI>O)G{_RBOVyXT`hS^tNsGYyCOeZ&5g%2J3()~S>=BxE2Ikkkf*^#V z3oIC25+jGUCs1lr1jF?31$2!ceK(b8akTa8QkUn|SIeq!JJ$CvA4*MyLf>Q6M z6~A*u93S#UeTV6F$u>;BiJ7o(&CZdJn@vkh%901#D}$Vc3Q-%n;Up^!?A-f7!33BS zgA7Ky;g3CnV)LN0%mFp@0FX7V9ghL%54uAkMm}v2Ql4s`nF!%}k(2oWtfqkLRZdH^ z0=WMiR6vm)PFT7nuI<(ekyagW7~}(l9w3~8(Jch@OO^oe8iF^b4a)9S-}zq7fSl%naFZ4DdJPg{5k)6k{B*B+tb8&5l=c*A-mK@ayp521FWz|IyDamh2xjc;?EKmJ z;n%W=hgDTtk@ChtcQk{HR3XQX!gU>6{~dO+bsOas0|u)dUgB$J9*^ylFw8eCEk7nRhq zpTwAF>PlI;=u27k^QfJhah6^%5MmbU4}3HF*rRN~sUu)0eq4QjFE%Sp~_+W%om3VU)=|NN)0TaSg$swfJp zqX)tU2?|tf_@yke?TqKkPbsAXC3l`jc%OR0)r0g8-B7()yTpf{ zS(x&mWT(1VO9NdgyVLb^B?sM}g6VCnQajcv@|DE+w500Su0;Wy=!U=pAnE?>(}+1` zy}Tw+Xxs<%mq%|+zhS?9r^%^@;jTmZN=WbuJn5~6XxCWQqiX2=7qA;P1;o$?$y?V( zPIHBAm=8Qkn~S<05<7cI=k^x5>8p$3^Sn=i?;9VTdmC6Uk??2Zxa7CJwkh^|YlRi1 z{9Z)&+gXxO$kBp~fmUe_7M`||EUc?G+y z<+l+jzrjmRvt|K%Arrm*E5DlspidLEOH~N1ZF7wRk7p}28c@VYCmmvDHe2-l8xAbi zSKLoDEB7{x+wFWV5-EQEmauNSMwAO5L{u4kE55IM$F^Jkpm^J6XE-1K+{M!XWgb6o zG-AI0_D9Qk3hvf|nndKn7w$DE$F}v;-tTE_Jn<$imonl+F6wf~eL1Vl+o-YA;eXyN zrj_UL;r9grVQvo|w`ufgACsHn#TXGh(cv%DMO&({9F})*X}DXzrRS#RZ&O(g!_|XT zqGeOu?%ZA40oNnB8MS`nRuiK+o94LuHSw*2>wPx5OIafZoEk3&$|G*vs}C_4IP3JW zD6m3UGa8QA^z&5swSqmNW{0;rJ-A~4JKY_z!Tn&((#~AKRl3kk9E)oPWp$alWhUW+7%Hw6EEn42pX!rie61}hu zZSlYrD*23k+}HlSdwS;buTG=fnbxDOcqZa8Z)T-C{-<9Jq zJ#IW2A)j*4wM^O!vnrme9BEhxQB#~@57juAnl@ef=xIYk3MJ~?@{fQ3p1niXGU0U= z*_yeiCdTQD_AkWP_q94_toC%wJ*Ypn1!*Z}8$v5a_QnQ;_NG#Ww4}U_yX!Y-m75R4 z%c3Y66SPEb9Wdfy!#DJuY84V0n(2Gd`A62OJgWSwVfSw3`RQpPxfM%oc6=n&qWzMV zc)qP$+S)}IyW$xb==)knF=qRi zl^;|@(6`)FN4NKJ)1-hJizzd^+?wK~1B)Jk0q!ka`ZlH)-Nyi`_nCh!G;rX`zsNY2 zGT`nopLF|?hmp0V)s$t=lb3uwF0K&*QQx|1l$ymE^UqEX0j9?*nmN`1@m7w)M(&@H zfvi5v1De7Y3of%?zwON|RBOiCQs)%#wrRfR>*f@$gK096v3Wvt_H@Frl?|3IDVKX} zmQ729&jDG9;iwU91+v37=GPT9)bQp0j}!J(^Bs>ZwGrl3$*$wh{p!UNlc}D^K0TDw z^mIDk%@yX_dBM*8i~75>e6%8z-Cs!9T`Vt+-N$z3(vg?@sfF*$5qoyt%(COsjJIzU zqo0{?#%m#4P>qre;@p2BZ!yz9vlJmErFlhA>o4Pl3sc?C*hvvD?_0egC88Xw(0_Vw zgvj2HtN%EPNQOOz>xtJFyu|dd*PRlH^y}A=|88i{JCF7iXQFEy>0f%vJDKRF#O7pW zAcz#FQ!Dkuj+~*-B7ksF3^E^{Rt~sXY)y~*dydfoNl3cF(FErQ?EgJbfQ(`UYIXf< zO$o(^fjCIh065z9{$VZup;dtIavaPz0KXEfUbBJa>eUTx%?wG!qgnNh;+%DrTeG3nRnXnF z({)jf7mNzIytq}^BuQO&2G4#Hj4s`~Ge0LPT6+};0N3EH4d-xml36ZLDveD?uuX!|AkDa!dS6*Woo9B zzm_*sd~;*`*X0v%csXqS0o3Ron60{FGvyHJZozWN<@UvySRP=H+0y6^zFb#6XSPH6 zFrF+XZ{D76D5i#c3gAX9bQaKcu5^adhHXUUAcJ zE02DBx!bT|j~HG>+A40ndviZAIqhdMQ0utcx_$Y?_7Y1LUGffTkS3pMO+V?m5sVZV z6Mgp_q40qd_?xw@U>|HA;}~%74PzXQl20%$wOBD{M*OdWKcJ3 zp0?O^F?byPadlq7`KzKq`+9iX-WQ#@UJ7SuB6(v*vZHmY7blU|L@B2}&RB=M!l*$reM0o&t*@_1i=^Rm!;ik_=Qci%^!YR2 zz&7B2Jl|iIngPQf8Ws&(-o4fkJ?!vcVosGQ^r9l<*TOe$s@h4WZ48i!%<_b2G#(iH zYmx(Jc-xXbE&0}dOTMO=I(pHlG_rUkCE%E$+s=K_RP)wH0+Q;S4U={Y4QC&pQ7aQ~ zQBgE0`cdIrt!F%^E498FeTyt-^HvaH+)kkwfSE$_c5hg*lLGp!<>ZUR)|__!RoAim zM>~{68CR@p7g5I=&fgz*pmEe!_wRI0q(LjzH|^YYB|DWm7Y{M^!}a#ItZ@qL?2c8I zBE`&a*852{JG)0X201#^TLU6|?-$hs7;jeFsH9!3=PxiV(7lQm`(1Id+p}b38B-G3 zt~o6ui16XJ2{A^$sC3@Ef9=ex#fe*jifkD)K~@Ag1kWTNk8VZsp(@BOW{>)BRcqW1 ze;K;f(fCttTP@Omq}UsIj0ifEG-sGe;DNs8AX2|uaqgawVurc^5*t^x9WOy5+#HMnWevi&!gLTy*D{JenlD!H* zH5<};ir2ID_j4{)m9~3(ZZXuM#mh=NtR*& z#^p(o0;#s}*X;;})@o)KuF@~6#@^x&vOU1eU+sz>7thQ~g{+&Ccq+Fkn?wJ^VmlXPqEn$6UY+eJ8Fc6EtIGif zuASg7eId6|U}4)r0qa=u5OR6imRsV47bZU8v@L&a^Z~l>ivZ7?=Ei}b9p~D5tLJNJ ztOrVDo|*P$REQVtIJvCkH#u@e-$kNp^H&#+|60~#4_-6?SdFq^Z^Y1e!NgAbls}(>XRp_S$GBj7blY6CA`QIq}elw3F3U zQJHb_3XeT6T=_bor+LJkN$rjDv2S0;CE6Ydh~}(sulthsH;!v6IXOxBL2C!i|G2C= z9Qc6Kd{_-DQRqZ}ztcQO^5mhMDmogG zXCtsZML7hxLz3@SIO78W0zBwyy6&|TnX&z0kXZ_9x<_V)=S@W~!-^hX_x-YD-0ko+ z&QC_o6S^nVzhnONwoD2PsX=F~t(q)Z#_tAA6zqsZJ7UZMasmN=htUrx%_)M@fZU$YnbWuGxHkc zk10-mJggmcj6C#5)}qljek7#oxAb3#$JKy1g!do|;ZtwLktZyHKVcHo!}S+UIP;{E zONoQaO1cKm(W`e(z7z=5c4~w@`3rexK-8J$c|&=qmgYP@%z{qgzHlg ze!tr-DTc+0%u4#6pZ1GY!i-ImN&m=!hN^vVK&l3}DY-R$Ery3$Qpa91>(C(=a=K*tU2Gu=06N81=-LVZ!8j_T zlnro#f&~U5K3VmbIm2wWV_(sEZFIZ49vzNIzcOY5J3F0K1dvQGx3lEwMww(iaLtUQ zU*>Q?-$CO7LpVr1uz%TDdayig>8B~P` z`?um#&rfpJzpc77P&H#5vx)Hw&i9xVMkb&}eh|x+#}gf1E+V}n>m@w%V_zFey}e+* zT-8U}rcQykxlcZIz=J=AogI5u**g<(tDT>tv$E9sec;l(T6!EZWh5B+W0D2Rjyy!> zY08C3I5|sCT8s#aRwFd-A8dHo%uQnXev}H0aHynCQDpan4~LXxF?n70&R~)4k(PYB z!XgfrPt89Q{2B}c)$LE-F+X*~=|ln#Td5Xjy!Rt+vpbK0O!?5@U}l2@^{dcLY69|t zyrD7n>tkNiz&Bm&aO1|}FWdDwx0-8jb=4c*(hG>|?b#UPC+(!SqFl(P1dW}w?PukD zkrf=`7k@4Gjecpo2iN}KPUSfsJr(L;^UU@hW6o>|$|&9%Ab6s@0Y zeaoxmPrk;T^xgi(ZH+9(eW6%ar@ba>ZUd)JRSUFSriIn{3f(pqt>+G0~EZkCFO^uq%ZL)Il5?@e5(aeNN zyY9fHIo-#p&lyVZsA9b!0x52N2d7%yVO$jJC$nh2NvE1;&*DFtoOvHE_t}=eV=bo7 zvrW$WESY!qZrjplZT08ue<7#tnoo;{PiXR7<=s97eB570mZF=@oZ>Hg!Ok|>{eC8U zoacS}br0QE3-|1g21_rmPQ(|Febos)WXO`2yhO3Zv%(uyzAlb_j?$HDDPuT(+PdVH zzz5}NQpue(<`P}4*56qhu8B3COWGB@Hdo9IJasDleS~SJRBhAuLM%}tC35(pd|-A8 zDFfccKGfp%8kflD(6)H88mr2{9^b5n&>J;x{3dLH1f{anNWgb7gL`VZP$Ie&wzvHk zvK?C5PixU{LQtU! z=l(*B=zsc7^+(FWZ7@_F`9`}%eAg#|!R6)K+I|U;%p+iecHn20vA^~;-@)hVu=N4& zD`eALUoPNE!>zn@hG%7svY77{UC69(UX98k{Drh$ChN3T^3CCRs@{FogLEJH;C#U^ zd|@ib%X^B^Gr)2`K&PpuB8ZmcDXc4iaVs6VzrglQR2YbA&*6%oZ*1i5HtXB|g}eq2 zV`%=z>Ad&*NzZ`X1Qq16D&Z_vHX~~>X)W;=V$p2-khwf_!$Bm*+2O@{$qu}vU@^er zKxTO#@fvxBqC&RIo@y^b*f_2!Y!e0hz}e0oA5z_MfB(e7k!jR5dp4Dkt<(cCe<`9! z=)o-?M$@|ZAB|4PpH0fm%0jnaIiKPE6Gn?T=@v%mj^v6LVJ`B+7Qt)?T}m#6WV*CE3zmPHE#a@PYe<2g;g)rG6^G}$;zmQ*BBvKv0_7_Ep{M&2S z@{lBJB<7rq)Q82=aUuOC6~=?kDanCNtmpM+S4_X#FFv0zUg z(|^?$xA1roCoDV4G_Qn2^aY!1^Pb3d1@?NC!JX;!uibLUpHNnd$e9=XY;dZZcwS=Z$Wn=+WDCkc<|w8G`f5^zkT$V7v1HE9^cRv#T3OISlli2)pL|0< zc^72ZOB49h-cO3PV_T$|mGutCKFzvOty!RwOiiS;LaV0;`Z9c}aJ+YzKePPD>^@J0 z>QLQ3Hv*v7)YUptXbSsL2q63++(z(Jh7vc73FYW_{`%Rs3#+Gl>{lex^Wj&pNXgB} z3!herFvUhsd}ZH>VcKa<)+l!eizMLO&p0ykO5AT7?0v+6e;yhH z4WcK1K#Vo%d~RKRV2%%iv50%D0K8=5c2)&%yD!9aO&3I1SVEqQDQ0QE^`T{W^b#}0q2g-CkprT~_&rJGH!~=vpKqd*m!vOWGlqHONb=ba#S1304 z|LvYY)`Y7n*e@MQ1^`5{LvpQLP)GVo5wP2I1nohx$16Q?pDcN%+cV)f8kZ3>(6t-M z+W(vQ0O;ox*)WSq1k0t<{k1hA*=*E%&8__eQ46tBxCG#r}x}Ds8tw#jtIab)2er^`+tqY{U@iM zywT+XOpS+5>#`LAsl2^kT?iWH$Kh$8A5LWLKaEtvhdvDT%6=g6y6@0;@E3jA;Chlo z(;ZoRpbiDgz1VUhoew2%2Q513WQkmyZVBIgxx$V`GVm-|s9uD6SQsF!>ZN* zGZseC15b)EJGn&TT>5^~@=!sC`9HENa>p_Ck{_#of||riJ?6 z9-G0&!$%{P(QDu|VN&eabQ*bR=B|5*0%7zg$RY+8r$@FzXDh$_g#_csp`?s-2fmUV z5?pTmV@wlL>8JX>`4~arqT0=w17uz!IV7=8bZMA?6@%dlwGT|nsCvt zDXaSMO6bmmYV||vhe&F}5HGZ0*$?gwDz2z^&3S-V} zY2*=+{%t)wc_|=ZvUWW!p)?w&D?TAymX`ELw|&;yJFt#F-{&XIN?+Huys9F+$HPOm z#kEZ}9g#P3fn~OAv|a~aQkG%G>eOs=F=jR1=4|EZ`87=uMiaegMncLK*{jFaP`v90 z$)jti;Gw9R%5GeZP1o|8bg^W4O@(a4@1Qkzd@wVhL)c7v8wS zAu%al^K~2evA4v@HvuxB?DZA-mQw#90%%)v?vb8xGh#(GZYD;~?o~pDh23^9QsZ#H z0%y(~pY1(qOGA~ww&iRJ2nkx1gtfXfd7^fXOZKm2SADx@A~3Za!tvMCesudU^H?8h zGkKwf5xPl*(Sn`&)^dPE4aTy>XOs206;Cy7Cd!|w<_)%wyxirk@%)&MP5l=K6Q|Lu zmo`)8;vO#67P=doM&IwziQku0pNR4DYM3xj@hNNEon&hW8=mpOIG1E`j!j(i5a{1W zUspvBhRvHL85(^Eh?K-N2s_mXj{C|4`zy-Ue(96?0dtTr?}_TTbO)#c(HMafBS{Pv zcfuM%1|OTP3^g_R#5t&LmpQKYltdI=tx0e@(*8#I;uE8c6JQaXCyuUql@{P9P3 zTFTBfzs&n&lkOK;JztR(JZ}hh5$@_Ge_XC8z}t7RxYyQAMC*E1HtZTy`i-_L9`KLV zAu7z9^XDS6;?<3Z;$EM~)|A#{{NTq&`*d|p3A12@KN4?8!jpZSS$Jt9Cu=u*yGiJ> z4t`>r98H0Gx&ryIZE#T5IBaddYzND}#q<8V4(F`hh16PW)Ls73Fyk;4k1%pK)RlK0 z%M6aA}{q?KJm#1yS*!aI63AL3VGq8`qwMp87|PaB39gmcQhIzQ5X# z_nw1DfnZk3>|EX5Dxgrp#!{z33#LvRU%+?ZayV`4r2{RfYuVNa$)8DU$@ zpu4$lxsRA^cuM^mjC#@=3MKvb+RAs7PF-ZBcHm*A0d@Oh_h}B`v%2dk^YTdWG6| z8ViCXj|shwG~M5Y&Prrg7N9$nZMf*1H;TP=Gs26h5$mNy4&cip>wWJe|) z*+Tn|cxL$I=@Xx(L*GzPGF@2d^a8~zmL1xMJEmGf@?hvkYOhpEm&M)l0ukA5Wy|YG z>-Qa(cfV2~&Tk34@46k5^=X}bsc*y& zT(Cn%)i*-W?K-*yp_hxj~V#`-kukpH!qXUtJ~ z%ZwYN)n`~1YP=RA+rv2~M}2&I@8LcpImut=4J7aOC;PpZ%!Xe%Ui7rP)FxFW&7*y| zX302Wy+Wtmj+Z78cQK?zkvVTePhvMWrfxbp;92(Pap{TTr!N^JDVzN5Y7m${WWcK1IsBlc=25)T0tC0+SA1g=|TiP=_XZ%?Ul%cn_sVtyYx8)od3jFdWO z2ay?OFu_mgcA>N2L5A(pWt3IlRoX+O{b5BuJgqz-`c;G3ku&@a`O)p@c)0EBwUMY+ zJ0{Vq=}G3B-=)fk>od22&f4=ryF-sz*3 z%Cg^ID7X1}?6hgWM4uqLm=m9t9t+KEo*%#M3qYkZ-X6boFw@EypTRoi(=qs5vKGGJ zXL0dz0*AG=UVi6^li^ot1yW8N-4RWH@DjlR_Cy4cD8<+Q?1~?~6}ty0U5U=K6TPLfKNJuvlG`Qw2SrNwk32Bs`2BjM14o3Lh3HKn;|TvXIekZ7_{ z47J=7Uj9&xX@Zj_(kbx>Cci};P!+Q=6D28+u*|6GLe!>(8Wh~JPyL1Dn3(swVh{cV z@Z#M-ulodnK4CN8+k+P zeju}oC;VXF=h@z%o~+m~BR9yA2X;_N`;|OouvV?>TY#y;5F#CuN6@xzt1Wi#7-5g5}J2&>)Bmr z!ayD#Jjb77hXi60B_U5Z2zdf+G+=7vTxJ2THW9jdasI~|CI4CAotr=x-Y`g9DCLmso|O4+B!0!oRUSuvPT0g)UItm3)2e`%I5 z;GYI#T2T6cSmG@BuE5C9117%!)*f;u>KK=}Y&WH|0I2m_LTY~0Gg zw*3?YJW7N7Ay6+_p_XFTxKfN8b7qpSot3XMj?xkV$xH(O(uP31QlPfhWerDa>0?=1 z_Y~(nx773CLOY zl+M5oS2Fc6C?kd$8du4o=ay>%UQy-}D3Y7cvG-upF`GfesTL*GhSWz>yFYO3D>hXe ze<9U(_K@~ln~2?fe^8T1`(a|3PWFC~AV8-t_lSTvm=8NSGw2)!mc1-e2QPh=3PvdB z5%U$>-`n-*ul?%_LDhQ@icKD|VIXf)&F9@`QGqa>J!to@`GiUky%VNK&G=u9GfF38 zkY~YrTm@GY6WwM2A^ z{rA?Gt_gEf`jI&3Dd$xhjB@>}3-gkqfm88h%hO~|obK1_wJ8e)?Fv-snAfc+c~m)D z4j~k&M$xoJ+#HgYiLu67Oh_9GI~?ixmjC^nN8hRBgXc`}F+*HsdcoevyTJmzAefW3 znF8u~MfqO{7yMimxxjgt_geH5putxau?Hh3`R)J^|Q1_E!I%=A}qx7 zx9(F^l{*PvyWP$t8pSDVU#XH$-3A`1PE_+VAH0#fss}>H|1?p3vcSh*_Oo`C(?e&q zVGrz;v4~m=uAR}w8ZR0`X`$Fp=KEKj2oYhLzclK@=gaODHv`xO9)2>t^m)EQx8e__ z!BS&I=hI9#t~Nb{fhO6@4*t{V!_Y_H?mP=0@gpoSwj+glDSsiFU^yNZ4r@W%sd_ct z1u_tv{ zwLR4aJq^cyjLEP+`Chfya+udehKsh-CljBaM|S1O-vE>Ij@A|9i8uLrz1fK!hQO9Kn<)e79Fs*yTn zPn3UcU1wH}Y|)d@GsXi9hpP%K@2{(MqHMwmn<*bzsUL4}sBjjDU-Z+Ra-LWKcS-ir zZN}9E;vogpsMB{oZ;EiT8G2OV7~(1uOIKp>jX33LA{yY7gd-*QYN)Xa=nx)Q`A9SQ z1%h?__e4X+$lxOVq<2pd8k|m&S(@5E z=QQcmh<)-CWycpC`&_s&qTo<#!0aEDigskNsdl7#wmNQE!~~gQ$^N zvPke|tZ~>y_Cu6Tg+Fd+!l#vep@b7)5N8vDdtsMi9Cb|@(+e+SE9bLR{x6{pKs7r6 ztS&RWSb)Wrg%!~4U+LKlB0&IZh9|x3iE?EJl1&~P$%@-|WSvhuDg}7iZ@C`D1Gk#E zxB&n%8Ebx@2@kUc*+6b!jR&$DOlwU}hJbv<$q!&`391i_?y$}b)NzD>DPiAX5cmKb z)A4BB|AviVvzJ3}l0b6ns}!&aylnzm(Wfuyv_bX+s9<~`dQIv~?mxzMIau-m!cq_T zQ>`;Q8AmdV$3Q3doyb0F2Ukg7B@)kfYU?lZg)&e(c(FMsi9$_C7_EkOb_p@oaEK@! z3Km564hiw(ovnv2Xcd&uHl}OEjW$fX+`HqvF!yZ#ej)`9MY0ciTT)@*iMfk-ry=K4 zX85$Rwy*BH`fWv76wz}J)e`{LBu9P?!^%(&EBxojw2N{OW1h=qcU@td+yQKUY|jL> z=JtfHnyNl}KIejA9Ix65urLuD7s)me;d2cIfC2SQe2Ds z3lXUX4@=_}F#6NC_F^)809|*_Jj#2fBN@`&Hnl08{tq*F;8I zV?2W157lE@WXKm!!T^5x8hGC)3A9LG@M0G^i%LStbV9RS|3VHvBTw4vSm%ts}LPOTylGbM@~!HqXKLXz*7tS|3cN-vLX6cEoS z&)0iQXE_tQqDFBm;I=pteMRkdzh2IT@UtiuZIWEbfca=f;Gx?Y+l;gA1R|Sjr+Suyzahd&E97oUZdvTd7{JC=U0*BiIbX* zM}*#bW6a3P7<-x^@x!2JcU*bJ!6o9xgInX%5Dg4Nj`zQ)_vSS{VnQ<67%) zDXZ2%B(t;(?DX&(GI!?F-XglFFxO{AlhU?%?#pkR7RJG%z zpO-vVwbcq=A4^M8qA-evg*k6sJcZG~7^WSo&@1VVqe*o7R%KfMka;KPLL7O=PKD7I zU)A#b-!z7bXS!Fc;jO-HIge;hDtg9o+GJsOxoDagXvwQ{bxl~Lm z5o^C|yRf_Hq=XT>%NNZ9l!nU?AfUd#eX3mM?%?lR;Kto zCxmT?>FJr{$MdC%A5}SUoy@(}{hUGFEiDUudn8up#6ZUft1SIXpSd}-EfTjOY}v!V zBA%|k96!f<<5F{BSZ|!ozSZCkHsY6tY!z&W9TfOJ1D|!@g$mz=Hk^4|>2=Dj_|swC zR2&zw?8^`@@Iki;mVnuk5 zvCpugZY1^~z1z74-7f3zq3#C!g#?k8$)Asua%ZQ@r+zNZ?JlZc^IK|Y@&mqBf8+gI z=6EQD+cZ7A;UskD-;s}8H^+;Dm!O2||F3(fI+)qE3v5YW#|%Le&+OzXPQdiyv!1QO zZqR3Kv-{c91nsHc?f8tpkODtL;6Z1$A=+>sTn2#NYKnY2_4ud@EhfjW7%3S}yF^9I zBTIv60s$w30WJCd{LG^;OW>IXl!zla;Phj}!ztX4c6-QG)AdS1&fB^dglV<+f%tON zbI&7;dI%gkiB8Z_RQbTKV;#5`PE1VO(vMSU(JW+$`O0qrskgax=$l}YrUa8Q=;i?_XoLeJ{TPJ2E2A>u~4J1r8)$m&9!Ew)=JGM77 zZniHWU~TTZ;_ZVZrH6h4$PgzjF7xl{52UzQKx9ZJx)>q~a z;@#-uscZit)MSQ1N+LbOAX$zsu?2@WU|s;hE&%aC9)&4oCLYQR905VH=VpN)>K}xO z>ku#??`5fh2vC@(2`e#^zWbYky?}h*JhdLRM|-H7Y$>^bekQqR zMg8Q-KcPxOlS5H?hQlLQCxr)-l~1lc&}!af-`+qBF;bl5ThAA#wGDmC+TpEvEd z`<%;B?@;W|Ma!$=y+go_Gn#ppS2E38@&v&nYSm{6KeVPM?4a0;3QfM0AZu|8H>S_< za8Ng*s&(FqM+pH@JT_%LdQGQ_gD$z+UFzYxFu1HbP(_AcKZAMXEi_L_$+*C z`sF;H)m@xnpS`{9@)u&f>eRFldF!Ij#Tx=qrFZY1k|9h2vKd`}eS&?pg!bEL+NcWpshv%*xH4)-O%PGcx=GuvSWq&}FBONoI&C1e$Vc zY3U9?v}}1id{Q>`d+G_Yd`gGpav! zC7H%gYX0HFuRH%39cp4gU!7}%JL5Q#JGJj8Y@qs9iVRcze-2sC8gj&%8#*YLxLl1j zt95d=aA_9e9`d&+%uUG2VC2tPrQcCvZ$NwJ@t`Uf%1<2<~~s~KL~vm+Yb51;RjFgvjDUWg4c z11?3#AuDYO9(|AQAoCC9t+uNEd9g@7Ri-iW$D!W8kb7>?cVE811fG7h>?ZgZ67F&`@exek zOSX!rSOgu(n7u%bC|B7CuW015+F^woeTar%`r%t9)CD^$Dc&11f#BI8ry8P09e%bh=f>^`|K5EE0Oedt2W_wNE*{o2WI zDn=A%k?Ehd&QP?Ty-3yKZD*U~zdGn}z?A@#f1Y0NAiw67;;DZlgBtBAc*BBPOcPp8 z&R%o#^e8&*?GZ!EHB^5k0K~-9Ya?6z2eOVfrwNK{+=K)CMu;=&>PhT5i#JB><-KSU1vSC35Xn_UcmviyZK z==9Tc{#V=+TBh$9B29F1ls~F#X}>g0rfLaq{S4VLIFL@E{e+$9rRx7z%CWdQVG_`& z#ki55!j^3YP}`}J6D!2q|F_%wEJMgz49X0XOdO{#dj2hYWcAI~OCEl$NZy>Qym44Q zvOU9$S9CLjeO{6@03wy}!qkF>bCX%m^{p0H6UJ6ubr{$WmRS8;BtH?+@A8PKa8JNK z7#HX)Ugq&G-uV`n4FH`*=|Z{K=S?`$i!8QI;myLGmkZ*%&Z(k-H}(6S*acFh7VrHA4j;Q z{{)%Cu9-=!!|pURO3mYPNAk-q=xK1fLg@xp+7 zPG@UDL=xm5`cs6h-YU?I}8EfH;?BeKsSWdlA5a6p4lhyO}?55OFD)j7{N;-W5Z@@gGcgdr0ua+k zEB8PY-=qAYeS+Cy1)%SsWp=MUs~>MkJAXdiZ2a}gda9^Bb{KGOYx{fSSb#s=c^4tdfom~=1s!xlv-pQ5^RQ+NQsbRLLwzEfn`~GIo(y>g=xGXE1uGiAGNG_S z<)=z4$_fY0cQRAbLZLBDYn#Qr12FQ%;|nuTG?=PnSf|s_zSL&Sdz5YOZ#e_%M}K7x zRKWzw!KcA19^FvQ*9iO9VH7`&)}{stGx2(P3dg<|JUC83 z?V);W_L9Dq&qD4sGGX zd6vz>j`ZN~Rt;`1fj#I8!JCp}*7?)xyrbml%T#1F_hOm=kqu4c(Fti3x|*n2aP8_+ za*XE*K-F7kza7(i@Jn=i=b+ciQhy6}CdX1qiRyiH1E1q9Ry@7mCHVqFY<{thn^2Rq z)@z>$PGt}A*O3_Wi68R%HKllXnl0*fKmhxUa);6sYxx)zI+L4_yZoV|VyF(s%<)Z4 zdn!>KeO>Y+5gNSX!m`4-STiUxxy}%^*qt8Nx64>ct60Ob)mi2Eq~FD@)fpaM*>~b_ z@b3E=q?b6p`%D0BI*>BgpPO@6ZB$ob3q0Fy3)1)QA9a|nr>NnjPS-^mBe(q;r_4y+ zmeyx%_}r%iMf@MXKj@_%)2k=wPbWmsRQ$Ds_zBh-an5;L8_%C~H99fHY;=4-_49J! zp{MG{073+72i`YLfn0W=>v&g1J?loUgSRQX0HH+fDK}@Cv;bRKou4MMoqtjQRv$^@ zqFf-zG@@B<;Gu^cR_q)@ek7X)r_Db-!1aild+Z%*dX>SlXLEi=44=7VI-E1r4U#B2 z4kAzBlM@SzIE<0=cM2{XRQw!8h)bbzD0tc+id_v(7@0kmljRfNxz?P`>LSb7`Aw6r zz$g986V?xYfsK%nII{b^f$)s>$0KS?3)kg(C(*DUBijQ9*CI9imVHTTFJ#bLkRxWZ=*^ ziJ?GrZ)8xyk<-7X6AUL`rt^oywBzxn-0Ke?#FP!BbjRiU2u z$|KGTyLr0*?p$Ofs#ZNviAJURR=uO#$e}3U>pdpL&=1sg;3c=b zurpGU_>wrqKsEl$--Z_WJq5LV3pTiPDq-;58n-kif_l|EDHnf(8HdUC=273Oq$?kU zEEowo-vm;2rng=xFTuxm&k;QX!ii@RXN7lG9o?E*OKw?NM$%T3Cvs^_p5&Z*jiN^Lsa z)Qd+CW2I)9M(aG6_RB~#*4CPBJ5gqB+<{*2llgXIE$&U7-$DOuDP}3`;Wlgx7}6=! z(w(@2ui8#C>|?^Dn*-o%nqU+3zEMry7c zCD7KUUp0CIAF`7Cz`X+xY zQ#Cbz|K43dN@TBEBQ97K=5y~9aSBl-;b#_*$*2Z}8gY6#vD%*a=Xem{jaoelmYR-9JzDA z+0H#EHxHCB(~02B&BiP*UUGCn@~}8`sS``kL^t zSQV9gxqtY*+}NGi!AI|-@5it0?LdLf8B5(sJK9YUuY!6S zu)>{Ik|r7nZSaS#&70r7{7(BN?#Ya%cmdb)d(0N22J>zz#(L(ILVoc!Fo3%OD)4E( z;)5|=?ph0w6BaLEIS)J7xG_e%sibxn=%@Lw3ALzCCmEgyQ&-j5KM*l(i5p?p$rjUy zsDaey1#Q!!`enkrc>_mR)XsK4x(u0gEqO3Gmt%J@rLBPchFo~wGRbBY{*7^)!4oD) z9Bkz~Y#*dtf0oDp0on7}=<)F$vB`Gjh>L}^Awp&vBNpYdK8&hIm8M2@qb{sC-V3OpH;k*Oa-!! zoZlApLMyZftBz~oU#*(qt~|$fDSsgGv(86OC@yD&bZ%@3UNM8^9VzH1JBw_??>z4RbCdmqGN%h4~U>8>0tR-kg#s zQBBC1%rEc^ocVHGsa@mCf#Fgy^{*5DYX|&~e03GA|Z3gT=QplS5cqzfl5gip)h z_GEv~pEOpyg7mAFK0TYbV7Q!!$h(KsyK(W_vzG71=F1z)gHFT@t(h7*ZavM@r(|0U zO|^TLYI3Skyh}Ty&0+jAs1^3qCdSdH6Xg4UAip!lDwRNoRZenCvWN|5(Wz3WOz;eH zyzDP`#;0NdBqFGm^lY4;m5it9Zc}D$_n$Bq!*GAMyv)SQoVYt@6?D zo9J0nqw6Wt;5FwNb_NSg?=`3rp3B+&mChTeLEU-ckVuk8jmy3p_&9OtxoXn~D0erC z>Vl&f@lYZWY8YKVuKrTDPWZd>+@pClz?E1(`RU1&J@cTMG%WCZ%98*#0VmyQP(_r_D^m=J|;V z9~{4n^sNsE?}Xz8Mkeb7W3SV_V@jgZC*;z0a5#mH0^FJP@^a-c4#G|oo~K65a|*+I zsd4`U>)_uSYx3e(WfI&K_gAtdk|7Y*>KBTjUFSjjly}|C%rDR<0NEMUWR=5VlyvoW za)RB7nkenPi;iAI<*DfCIvKL#dQ->%)%_&;Qblb9tg0+{5BG~|wlYdw%sJJ?Yl1aa zc{W!P-iW6ilHG4qd)}f%2v#c+l3%U78%)MimBUQQs>B090@pu<&epkx!>@ot(2YjE zGv4Qi+T-VB#frAs1tM|e=f-5OJo70&P7~?=wLN17mWU~>=_jOCzft-cwikt=u}tBf zA%$xRspy;Tati!OhN8iKjX(At)IIuJ+^+$u8y}DOxzo})wBCZ?(Dc#5KJ$J|hRUgk z%yXT10^K%wv-*YYQ7zxNLmcOlCj6@>Kh#<76cUNWZTqx*X^l))$6jkTB44|{F}y6h z*g$(mX`$d zLlDYr*UKw4b~NZ9yjY^CqA$^eh>4jQ%zCWTbxa)4mSeUYwfUcF}~KC*c-9<6mj9HDsLW4inCIw{t8w6g~aYpQFDd z-g#r5^~~9Ww#m*n`7Z8J3>{p7uZ&S`3u2slkPFYs@yuPRYb2MLqn2#XjCyNAsKEQbF=k zuGsu;C%K$Z%v45b-U^(=NGz^8qj*iswB5XK|2%XJ0fhdTD?v98-^P~+I7$&mC#54$ zZVG#VbV+oCwwzL0_msuYRY^?KB=o_rg5S3q#P?F}0vIKV{%bq>_aZ=iUeCV3tv4A0 zXZSfwdI}%S3Dbn~+Eb6bQWClvT+ztKJ{ESC>@eDWlK#)~} z8q1r2ZJZ&FO-S`rLc-GU%B{&6Go|oHXqo&EXN6T>Wn)729LdX_PDQf|(MFIHsDl9C zabom@tk%A(b4j0q&2*O#?yEJVevxF1YT&x{kd!cA@+)UT=#;`UhUB==&sf(JFC-r% z{AOI11WGfb@7huLB#q+s4x_ahi#})Nv2ml#4oR`nHrYb~+Or9st7K));Gflt*}EWo z_t{361-i^h&%d969gOGdYd8`9u_Z6#A|S;ZE}T-u<-_mrMHNirRzY4ZUngIB!H@&W zef-gx?EMPkQ?==h1vIX@c>zb2qVKt%jpp0Ba+gf4Fg7S%Z0UMaHvuG?#sZe2Lx7w0BtUakpoZ}v*>~H4sfcKbee$Di4|OSuw*d?+1nNdb+%HYw5Pt1sj30N4p=9l;EyLrkxs+3}YKDxjWLd6~od5Ss`mT*XC3 zUm;XP)hW4mt)=QEEvBw;!d)sgCY@Fi))4O=;f1t{DV^kxgdG!d31Rdrig)|&{_udG z#`nIuwkO4Q8*azxyw_?*!9v!ei^zx@eKo2jjb7#AC+F;qpT4}G(AX@7WVc;>BOYs& zxllW^t2}isb$^?+wY~8sg24T=pUMH+{-4QTKl}=cp7h3Pvk&)|l{?XN*sEeuJP9l- zb9iXTpf90wdQUk4H@)XEQJ`s-UVX93IMQL#=<&1TKBPMrzlFz!R@SjCp9{8J?(LU2 zi->t3t6!jp&!YQUI8;0eLuAo(2r2P1K0Idf4{E(fGz!H~_w|1A<;YA$-`=}=Ll3C{ zD_iO8%V7ra=yPxiMoG_H$U*C(A-wJ~$THyA|Hd-y+3SG_DNbqDbn7OJ-HUb+{hn_P z{46dm=Rms|Yjn%E^i~X+O)HoY8T#mUO8(sQQF`!^DaH(LgNF( z>tujQ-UUL%^73*#*^qFSmXF;854(4ko1U>>OT1MOSO1sHVdbJ(Z zoS*2Ecp{PgiG?*^pMAP+<4kEKQME|l0t5nuD37a_s2P*X^NpwBe2t$oWXf&~e)eqq zRR~>{6d&E)(wxNF(v#p$K0?T@v`?Pn#|+C5tV8Xe=N4iU9o5BD4vj`T5H_6lbvb{L zD4+^5S~HH5v2TaMY>4q#eL`eRhI8RXC#;pT<`XR&-XDJ;t=|g*pw%Ri@VI1W-t_#@ zypoctCvmX8Q^(^XSn6?!(`M2!qItSAOB4lWtm=;~vfAUNuBx}|x(4h!H^Apjc5ffd zA5g4;PEK%>_csMd93;eH52fb1$L}p!ojQEg0wh(P{+iHwBEj@QONM*$Zcd{23f)G@ z@VXp(X175t#~u~{wsIW%Wi(S0Jju70Wg z9pt)t%vqZ+a>6FP+WhVoLD;YN^({pnlHPVp=%V08ArVPRtkma_?(B$%URjlXtOh6S;_ymR&}SLyyTS*q3cMQ_jZ=lmJqKamS`2he&ae#Bfw>`;aAKxhO7UF5 z+>4WfW#K%6+^|fGhal<*(Gp|vP=|9yPs~<%1}^ND!Ai)-&6poFlPjw|G-6yFt(744 zOK006YTC$YMT zA<<8}j&sjA)OAZuBn9Uulvkrm&U^I;M(b3i+tXyo!FgdYvfmWwQwhvXjp=*=$QMe?gkyZHm<70FVGbJ6$TZ+c z903Nh9pIjVWq{%h8Y)~<|2E8|mOZc0;nD*yxG6n!nLb~g_iAXG7?{{EX+ZV*1U_ww zY2gu>@J^ip2Cb*GuWcU|K5}j{xI3b$Ke+?B!4R6pmq8nO)Mio}Z-h>bk*{U|gN*Mk z!0%i51Fg$&Yi#55`BT>darRO_Bt-c|($6BX0|n`6lk{3)4!pV5t`+B2p4fJAT3uoh z8Fj6$OSRagtWRZl_Vbs>7LoI}Z^sq<;zxt7;Bcbp4QOhuifaWKN=hUX38PJfAglUu z)w-Ss&us$HBXF4+T}ffD>`S*7i_Q2;KHUCp#rodk?w<(Cm5m9|+P5MeYd0 zV?4ZN6;^(!(I}W-(ex|?0|~FiUO_c^Ap1G7Lo7t@QMDu;VuC@^qgj(K6Q z{a45pr8Icyy@|~w_zgJj8Zl}g=ps{?hi^Q{yjeoM zwx*|?ePiv|K6dT9;oTXByGa>Oyc>Yo+Wgw1*QU-x57vr`DaY$-ujjv+7;m%w(rR+W z%>8*!9@pMZkF{U3l}FeTesR&y(PL1zs&P*(hr_Otn_Wob!j`4i+!I(6JhTQ34LH2$ zoY%Dy*8~4RK1Qz`^@o25vm?(GB$bJ}_No{T?r~hy8i7u(#Y1cR$&J|ICy|m@;tQ>> zKp;0E8eC-UqthxlUG8nbwr!_%e*Cr}I#TYxfdAoKQd^r|W|Ii}cB(~wqTrH}4)^i6{B*R#?FbP7;?+C=U|td+K|;(!io>0qi-yhf zmlUP?^LkV)n@>f@UGj~xu>m&Jd$l}}SHUYlo z^hAT`LCUo;?Sh<(m7cfy3(7494zQJ-7|zZ=JNxXFoTDMF*Nn z)Nvc|lNHcBjR0HDJe8QuWsAfi+h4VOala^{O(1^+w|Z>q25)DR9VfP!z#XMkq{Y$aXS*Hhmt=ubT~^hkUZJ zLWOE)LV=T?F=iK5@t@(`h4NAudGiO-p@#>f)@Fj{Qg<`2fc`ofEXfwscm?RciD8Cn za$^8x=$3^)A9V-7i7jqGZ{AHW!Y|}_KzG(gnKR?ZgJi_;7oXj2XeHVcY8Vpf53AF06V+&Ce)jr^@Dp|(W^nkYtzLhWZc3Si{fW$V5^c9NF--oUf zMX!MO7BE5cz>x2*kEAlt+W&d6{;;+IOe1FH7o0}L{EGblpQu5~1NXrEyN9YnbQ~PK z<2d}mFt}QzrtgeB-Tv~I2f<#sO1bwB51m=#&rV^9I46AsXf=rN#>XA*+&p`$Thh$C z`A<8$%bu^;bW$?20PZ`+2HoX|14{$yd!Bg@hC~%;1`H4~+YJHRQZO_@=RF`$-u*69 z%THleAYEkGxEwhaMU1wq7|RdRGdUy`{hjh;`H=xGnO}OSDvds}B->I436tzaa)!xt z)k(NdIoiW&+S_ay_T$Ez=F(ji`xi2K`&Y`zrzi_Cvz_@|&1K7NPG8K|jE?Bn4>I)8CPlk}7-@gQ#ei$v71kOBwTCKvI8vy9G zBpNqMPXPkJoe)6%(+@8M-cIR;ARkeX>6~fYtT1H=I04M_8K0dwu+ba^!Ch!XiIn2s zu-zO%%e0$F;H*w`O7k%gE@CnILZ=4|TLnB@L8x zjr(UX6k%03jTH-=v@(OBEtLSH4YUGA%rbuIM@_Yz<>ab6!X3vV%?0YPDVHqPGF;3U}!WNd=mSuf_9VvaLz2h z|9v~pX#6ubg9vkA`2mkxrM`VH47#(x&r5N*DPWMnG zBRZ1)><{GD)ov?uGM@PPn{mhW@gm>^E93UhZU1kP1q!W$z!il>$-uFu2Uw=e z%&%5Zx#&ec48<_M4_{{PPkeMvfv`w&gJ{x?JJkAjB8IKV2TP3;o zBpAyo_9HMznp5gsvq2$=Q}5M-KJc| zGA7t(fX@4ikEa)e9^S95c>B$;$T`89L@m{ zmBbdrS5I1^jEQZDKzI~F_-dJzO3wqpk@_pM1WR|VAQ!0oW3E7e_Yde@W+xs8;Z0_+ zZ{U5L;Q{%0Wl6Ol_tenHkICHv+8x$z!+4;bYhzOZ`V8nw_z7IST+^|EDi$~B` zXTNcp3B_{rGTV3@h_V2GQF$c}c8fUJw|o|3!)6UZNDf*H9A8F5`C`(m;Rnm{u1Pr#~%SfD8vPACgYa|0bkR9 z(YsgR9ltt~3)Dps!plI7lv4|l1LrK}S&KtT%s=P&!yz7(40kgbC7q~k3e!b_#rPZG zehCXEF(1JxQTB>8Jwn;=&34Z5#F#F&+MF$vh{)eN<~5%@mwC$|L{6#!LP}e@-sQ7YUvw{)xv=|Onq!*9S%D}6F>C(iW zQ!CbucH)(BYZi>qE~^d75p)u}atv8!*|i63dMaO-g=|0$_%@9}b_g)7R{zU)1HX`& zOfdLcMqfZ4h%RPR0f*4PU+GDA;BIj)FXssO;}ux5*uQKO;4-DN&%#t8kvmZ$K;|wl z`ACtkwF1Ll^zk2v$;7VJ#ZYJ}SS&bf$v5M^*XoGWE&uc*AeQOM^-XuF6EQPXp zUIH6ZyS)!X9?$ZgwmRWUXJ0Fs5Ls+*zv`%HE1hf4cXS6wmVO99^3{+paRB{$gwpN zJ25JMrCsBd*xUGriHQ$KYS>8ciP+~`d{FlRkv-+X`J;7j5>x_uYm6M)kG65?n?dGk zPD6S6O5##D3~wMD)1aa0L5aE?@s^#=hF{E6$EvF4Xe#gv?n;Q~6NFOai5;RDSkfOR zqKH?a&#?R$gy2#%W8x%Om6sRs(<0zNi7j4p{oTH(_HgkDc0z#kTqOz*KH8LXm|iC> zR-}NjrvrS@-srEmr}!-uu-YC0Yp;+Y*$dR=xXPrugdqhAJC?zY8PT-7&Ghx2atYH1 z`*F@yu+WTN<@ zl1{5jVj@UreIh5V0xVN9wx$+MD801{EbixW#AYq0)4+I9M|q7f6Ra$^{d=axA3BB_*-W6iiIZcti9a;1mzm5wisu4w*%r z#~<^%mzdKxb6({N=f9{t^)9dgmqC)4xvxx<)7vqY!2MN622{)-9URPlDPVcVq7Nzt zZVR*pn73E7ihK?5M(m)f0OfW5c7df8q#5|!%d>!rg7Qzp?#^sqNC|=r>ce@>M{yY_ z4~5t&%nFr|F*7Znn%Df!K{wFr?$I>;SS1aw)7LL(hS-$BzUTIz^Zv1H9dmqME`Cc} z2KZ!R$){Q|_yyfwPI|2=Luku<u`XO=$m2O0fp2Q6X!A!t>dzi`X8hDE?SO{TTd` z;0Fgd8YdB?-(KAn^lq6?-{Dj8L_Bp=4+XE{qX~|Zp7wg%n7Z`p4IJ(45FKe_<6j|u zS0WctY!`rflNuVPNFFV;CtEo_tT{Fv`sko&=qvV=L3vcvK0;3LO59s>yj(T;)LR9KI>S7Skx)cj>emB2UDeBW9dV0tksp~iex3%-`$R}-2^jFfh>bx%WBv^DEobK$fRTl^1L=9xl(TZlj*R{tI6@C z7Fa#5fw_7#SZb>*m8z5BO;!32?-~xz@AGkC`|MD5*_>XA(}-qpX;3X&)m~EaQ%^lk zk1fy_UflQqF9~Nqr+c`6EVYw{ITU6dWp0d*rvouC{y>-j_)08^^cZ3@k*}c&S?trD z*PEBnW3m3(>dZ&dce>|RBEac=2=+4r?R@)|TG}0CQ+n3xAFV%3a5^FbllWMA^S%yF zO*H=Yhvl?;y;Xyh-Si=o8NTZqjdr9EsHuhCG1Xa#mu0qJp`X=Oo!&Ek7&I1VlLICk zwU1E&`dDU0cv{!-+euWYwEBm3y6iN-+Bj|y2hL3JJy>s~++w;G4L9C7{C2C~&bJEb zN$ZpqNWZmc+WV&5(S%+(9b-FfK+_6rg>RXw%>04)?gQ4>Yz(g2nR~(HKu{u2Hu^AB zZ@`y6YwW^>7%uSTLjt>aPKLp19jqC764f+V;|?~er6$nP2JK*CnmIXSJr=c);l2wr z3QzDfk5o!YEW^AR^%C{&ocSE>2-UL(O}p|50I$VC<4cT@jymY#w~B+g&UIsI-^C+3 zDRuo+yMm+q-!uo)G2fSOm8>S?J{PVv%&B}7CYh1M^-g-WXe%STp!<=mZk{D!`uzjl z^PR)*rX{?7cZ*-T5_egAXiAv;(pLPG<(s6V?}z&>-`x_Hsg@j(Q9?Y$9{@&V8LIfo zl!>Xp$17XaI+u-Ot;gpA#9x1p%(L;6&efoFaWHTh zp=bW&V}h-_f-S>V^VA#T$mgG`cTwq>1)TWXlw75P8~h{EOvNZtCJYWfUmjrSy4VR{_(w1WWK$f5jsAM-Y zUE^b7vEWK_J-waIgZ$R{eYA^FL*qhCM-zzfE#5L9eUrUm?(w^ZS7{Q<$7ibkuf`BB zCIr(==n2?*Oe;Lrl_5X)+<<;bijh2byjE?-6?%wf4^E!@PG&f^wO?T>sm>rK_ZG$6rsNsZi37XOcwQs1a2zo}{LSaS0eAE_M?U znly*7Z_?%WMC8-W>%ZWlQJ+dhhC{JxlI5$O3mJm}6P214hBBif%JFSn`xw@DuHVQ= z*+5P3Fod?@EBDyKE)K9kF7z@B$QwDh?p|(bvhaq`=8<*LaN`36Mtj=80BK^jv+oOE z17fwN>U{J-rTj>R6e(ch71Cg8XGnq1I2g4a1z3qB^I=lY9Q66Pc-pl)de`q9fz|u% zN7L;T8{xmx7#Abri@v{oyaK^tTgXw%7U@tY?>mFdVnc&Mu5)50vUe zPgEDaR&N&eFh6?4#_*&qVZPO`iLJ6xGl zBE>eqwCxE5Co~HL2gpx0gS&`M(N}HFpt}bK$Fu7=z^qL2r7DfhZugh1(|L+}+VJCx zAvv8LsIj*p%Dc-qWqY*`gk2>HH(-R@X0ZEKMLv9}{`AOT_R^pQFvD?tQZRlc=-ZL$ zn$E|TdV-0UU)X1Xh`{5gVp2eRpQSHx1n*d6cE;??Fg8s;H+wgG`}EkaF`#S`iOSJT zwGFgXDK(W9PB0Yv{pwZaY4Z~q<<}q~wyXG+WdMmz6CANqqfmjcz_=T>4pkRq-3?{+ zJUv8TB$VCJOkmmh&~V{f!!p9ea{^>aR=gk5N+8Q?ozb^E6e=?xbyYia{nX_@5ckX5 zLYw{M>izpRPK>OT`1~Lh-WxdXJ0IX^!nn)TlfUKv;C5WD&`qWvF$hs9L3zT5U2W-U zGz&K`Z>$aB{TIZFa9q|M12emQ^}Aus><5}yT92|G=1Y{FXqrA|msVstru?ns;)C2N zRToSx&72w%W(-Po*II?Ct7^*j10f%XdnHOd7vT{5AxT|T>5>-}@lvQsZUd{=FMFILJMRxVrSPAZr!;WHTZ3*z?eTKEq2{`M`3v#F3~5mXg;F!#&!$$4hc4)PXoAuwgM=t z{dI4L(*vJ6xW9$#7H=3(uS;YO&Qz=hQ%`uHN|7b*?-nZVdyMl8NV%1~m%4KD^Glw_ zeWZxoWcHj0Hb@Y=U)+taFT+geX;tA0eS_lhgIN-RE;X3vNo8iAzWzu!#{Dig3Is7o zzPPXuYP%&)WkvRYFF}OH893Q_#NjpOP>`XM?W@jph0|DB!H%T`{Wd;SGUl}BF5xbK zSLu;8K7Ny^5x+(`!AP(2-4i|Dw&!?LF9)z~y>fy_Y9Fs}`7C1RDQ>%TI`#0vwB&n? zKFaufW=12%gRI8j;vu$dP6;V^E3hJRLWYB0sukZ$;HOV%bd+}!$e_$S9NyLY1Y z3I4vx`POB}gNWeY~^PBckZWtFR4W%P&U)`*TR8R4q z-QvoTdP&GU7$iiM*w1Oa-*~vUTW$h%7KuPNU;TP@KBHud&fgiiohc{{d_c1lBCrH= z{1X)SR<)P$w9p$z6{0Lhu*9PA^^5eL!+hWCCDbk-&d5|SqV#~`qqC96vaO5?X2(LQ z{ioHTk?=YQY4;pWc3w%$^`i3c0%55MpJjqpm6(E^Ma^vDY9%crncY=zIe6`z{8a77 zSF7*6ei@2=R5IirOm=o=x@3r<>G|{m@Y?B&!&P0l8Xv-;;VrsN2X~KK*2rb~c>Qbk z!cqx{ODA%|y96h(&4ISIcjArI6W-+>xF80UzqVb@mFcIio?nDp_Yr-+aJ>xP=yQyr zx6q^EUZI$02S;g8a%F(%*QM$QWBMivq(_;Z$ug7SnJh0RHoDkoPIL6jogNIW6(3yL z>t!!1<1eAc?J|~bE-|Y?voTTnmg+)B4}^PC(DauKrDkI9WJNSB{A7RMotTj&SPgsa zXAPHvFUO>m9G!yXze8B%CLc_IAH7?wLB>= z;h*p;lOeRTT|nZ;1t;M4(X%w6)MJcJIG=Zo&on&RPH@olQozE zmE^Z?6#pdojB`wHA*ZJhV#t+qdW^F++_h*^O<^G*P_2se%GsIiSEtsGQ}OzF=|f){ z3xPuV!Z`lJ;i#b(67^iP_wGSLI(LeCzwyV%=WCxxX@ikFD zb%c@M;gx&sV}07aGd+fJmy}qKe4Cwx9sQt6>m|>(I?9t@O&70=ke97eZ3a|1$4>WT zJSJNRXY1!g>eT}(S2o-W5n~HIqOG-D@xts*x8`}tMRkwINgE|E-+khvEX&Vz?gYd& z)|p!%+?!sR-0Kre+xcC*u>m}pe*4vYw_Ym4R(%GD^m1nA&FQ31xDyW%UW``IfhLtu z4VL`K&%Y`g=aMCjUg~Lmy}1u}^6<(1_v;@<=^+mDt4#MAvOpa|9wQ>5<%27)ijhA>Xd?L-&8mV&+s}@iUdv_cs7T_O zaD5ZQO1*DU&r+|+x;HPymxtT_!JTMs4_w$ic9|MiwE`)guwYBU42d9Lz zPa-?@LZ8y^k%xiNmR~a-up6YeaA(-JaHix@a4E2Pf_Z5}XbzOgV#V}<|CGr9DU>|@ zpE7xy^KT7o1Yc%=J>MBuAUkJ1EXgnwK@HLeH|;2X66ItCe$dhd+lc_JbG?%XKYQWP z9|+Eu_9UnLaL!1LE)csSMs*qb<~*oDpq8d6c}^42R0C2sXvATf;M>c-zzz0LodRy+ ziyo@cUjaMUxw+ijxeFs=rx6qr^Yrz79bgrxP9p2 z;>Z_+bDCiJkUSEi@Qsm0fHDk6P}A5smEPcj9;Y<&Ch0=imuyT+1g{pX{_nqmT|Tfl z>=1N8L(Uh7^@jG=7P7caqhV6db(#gQCTCirwVTq)hE|?ZjCN@in|HY*Mbp98A?q(WmfjW^1Qe8O* zs!9hDP*%o3?Lbe}_p)2gNW{UE1oTY+SIHgaQd$SW(ehdg4ch=bKg2XhmI+~k>Hla! zPp%wO40p@Rc_b5K#w09p+A-m39(Iei>=#_h%LrCfgVBAsi$)IcuJ8imLDz%25;9ni zC0Js2&uZYk?13{**GTPYEPW~UttM@dK2nea�pKkvaWQr(qDS4-5gHL7{%zxns=`ydPbuOCz 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 TF>^c#%R_*8PFJ|?e}4U6SF@mV literal 0 HcmV?d00001 diff --git a/docs/logos/Generated Image September 02, 2025 - 3_15AM-2.jpeg b/docs/logos/Generated Image September 02, 2025 - 3_15AM-2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..19e7d3a6095c6bb31a168e26b648e84a71ef9429 GIT binary patch literal 43520 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 literal 0 HcmV?d00001 diff --git a/docs/logos/Generated Image September 02, 2025 - 3_15AM.jpeg b/docs/logos/Generated Image September 02, 2025 - 3_15AM.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2030e9a8975e1e7f436bd07cb843e1f1398a3cf4 GIT binary patch literal 54672 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 { + const testUser = await mcp.getTestUser(browserName); + + await page.goto('/login'); + await page.fill('[data-testid="username"]', testUser.email); + await page.fill('[data-testid="password"]', testUser.password); + + await expect(page).toHaveURL('/dashboard'); +}); +``` + +**LLM minőségbiztosítási feldolgozás**: +- **Lefedettség elemzés**: Claude biztosítja, hogy a tesztek lefedik a boldog utat, hiba szcenáriókat és határ feltételeket +- **Teljesítmény megfontolások**: Megfelelő várakozásokat és timeout kezelést ad hozzá +- **Akadálymentesség validáció**: Beépíti az ARIA címke tesztelést és billentyűzetes navigációt +- **Böngészők közötti kompatibilitás**: Generál böngésző-specifikus teszt variációkat, amikor szükséges +- **Karbantartási intelligencia**: Olyan teszteket hoz létre, amelyek ellenállnak a kisebb UI változásoknak + +**Valós világbeli hatás**: Az Azure DevOps csapatok óráról percekre csökkentették a teszt készítési időt, a generált tesztek olyan szélsőséges eseteket fedtek le, amelyeket a manuális tesztelés gyakran kihagyott. Egy csapat kritikus hibát fedezett fel a keresési funkcióban ("Star Wars" keresése elrontotta a UI-t), amely hónapokig rejtve maradt a manuális tesztelésben. + +**LLM folyamatos tanulás**: Claude tanul a teszt végrehajtási eredményekből, automatikusan javasol javításokat a teszt stratégiákhoz és azonosítja a mintákat a hibákban különböző alkalmazások között. + +## Autentikáció és session kezelési minták + +### OAuth 2.1 kötelező implementáció + +Az **MCP 2025 specifikáció kötelezővé teszi az OAuth 2.1-et** minden production szerver számára, jelentős érettséget képviselve a vállalati szintű biztonság felé. Kulcs követelmények: + +- **PKCE (Proof Key for Code Exchange) kötelező** minden klienshez S256 kód kihívás módszerrel +- **Dynamic Client Registration (DCR)** támogatás RFC7591 szerint a zökkenőmentes kliens bevezetéshez +- **Authorization Server Metadata** megfelelőség RFC8414 szerint az endpoint felfedezéshez + +```http +# Authorizációs kérés PKCE-vel +GET /oauth/authorize? + response_type=code& + client_id=mcp-client& + code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM& + code_challenge_method=S256& + resource=https://mcp.example.com + +# Token csere +POST /oauth/token +Content-Type: application/x-www-form-urlencoded + +grant_type=authorization_code& +code=SplxlOBeZQQYbYS6WxSbIA& +code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk& +resource=https://mcp.example.com +``` + +### Session életciklus és elosztott kihívások + +Az MCP session kezelés egyedi kihívásokkal néz szembe az elosztott környezetekben. A sessionök az inicializációs fázisban jönnek létre és több eszköz meghívás során fenn kell tartani őket: + +```http +POST /mcp HTTP/1.1 +Content-Type: application/json +Mcp-Session-Id: cb7ed84c-8f2f-4109-b571-2f9fb025a5c2 + +{ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "database_query", + "arguments": {"query": "SELECT * FROM users WHERE active=true"} + } +} +``` + +**Production telepítési kihívás**: Multi-worker környezetek (Kubernetes, Docker Swarm) session affinitási problémákba ütköznek, ahol az egyik workerben létrehozott sessionök elérhetetlenné válnak a másikból. Megoldások: + +- **Ragadós sessionök** NGINX Plus dinamikus térképezéssel +- **Megosztott állapot tárolás** Redis klaszterekkel bérlő izolációval +- **Állapot nélküli tervezés** JWT-alapú session tokenek használatával + +NGINX Plus konfiguráció session ragadáshoz: +```nginx +upstream mcp_servers { + sticky learn create=$upstream_cookie_jsessionid + lookup=$cookie_jsessionid + zone=client_sessions:1m; + server backend1:8080; + server backend2:8080; +} +``` + +## Hibakezelés és ellenállóság mechanizmusok + +### Átfogó hiba osztályozási keretrendszer + +Az MCP háromszintű hiba modellt implementál, amely strukturált hiba válaszokat biztosít, lehetővé téve az intelligens kliens viselkedést: + +**Szállítási szintű hibák**: Hálózati timeout-ok, autentikációs hibák, kapcsolat létrehozási problémák +**Protokoll szintű hibák**: Szabványosított JSON-RPC hibakódok specifikus kliens akció útmutatással +**Alkalmazás szintű hibák**: Eszköz-specifikus hibák kontextuális hiba információval + +```json +{ + "jsonrpc": "2.0", + "id": "request-123", + "error": { + "code": -32802, + "message": "Erőforrás átmenetileg nem elérhető", + "data": { + "retry_after": 30, + "resource_id": "database-primary", + "suggested_action": "retry_with_backoff" + } + } +} +``` + +### Circuit breaker és újrapróbálkozási minták + +A production MCP implementációk kifinomult ellenállóság mintákat igényelnek a részleges hibák és szolgáltatás degradációs kezeléshez: + +```python +class CircuitBreaker: + def __init__(self, failure_threshold=3, recovery_timeout=30): + self.failure_count = 0 + self.failure_threshold = failure_threshold + self.is_open = False + self.last_failure_time = None + + async def call(self, func): + if self.is_open: + if time.time() - self.last_failure_time > self.recovery_timeout: + self.is_open = False # Fél-nyitott állapot + self.failure_count = 0 + else: + raise Exception("Circuit breaker nyitva van") + + try: + result = await func() + self.failure_count = 0 # Reset sikernél + return result + except Exception as e: + self.failure_count += 1 + self.last_failure_time = time.time() + if self.failure_count >= self.failure_threshold: + self.is_open = True + raise +``` + +**Exponenciális visszalépés zajjal** megelőzi a thundering herd problémákat: + +```python +async def retry_with_backoff(operation, max_attempts=3): + for attempt in range(max_attempts): + try: + return await operation() + except Exception as e: + if attempt == max_attempts - 1: + raise + delay = min(2 ** attempt + random.uniform(0, 1), 60) + await asyncio.sleep(delay) +``` + +## Teljesítmény optimalizálás és benchmarkolás + +### Valós világbeli teljesítmény adatok + +**Twilio MCP Server benchmark eredmények** konkrét teljesítmény metrikákat biztosítanak production telepítésekhez: + +- **Sebesség javulás**: 20,5%-kal gyorsabb feladat befejezés a nem MCP implementációkhoz képest +- **API hatékonyság**: 19,2%-os csökkentés a szükséges API hívásokban intelligens kontextus cache-elés révén +- **Sikerességi arány**: 100%-os feladat sikerességi arány vs 92,3% hagyományos integrációkkal +- **Token költség hatás**: 27,5%-os növekedés token használatban a javított kontextus miatt, de **28,5%-kal több cache olvasás** és **53,7%-kal több cache írás** hatékony optimalizálási stratégiákat jelez + +### Kontextus optimalizálási stratégiák + +Az MCP szerverek kifinomult cache-elést implementálnak a token fogyasztás minimalizálásához a kontextus gazdagság fenntartása mellett: + +```python +@lru_cache(maxsize=1000) +async def database_tool(query_hash: str, query: str): + cached_result = await redis_client.get(f"db:query:{query_hash}") + + if cached_result: + return json.loads(cached_result) + + result = await execute_database_query(query) + await redis_client.setex( + f"db:query:{query_hash}", + 300, # 5 perces TTL + json.dumps(result) + ) + return result +``` + +### Szállítási réteg teljesítmény megfontolások + +A különböző MCP szállítási mechanizmusok eltérő teljesítmény karakterisztikákat mutatnak: + +| Szállítás | Késleltetés (p99) | Áteresztőképesség | Használati eset | +|-----------|------------------|-------------------|-----------------| +| STDIO (helyi) | 1ms | 200K ops/s | Fejlesztés, helyi eszközök | +| HTTP + SSE | 15ms | 50K ops/s | Távoli szerverek, web integráció | +| WebSocket | 5ms | 100K ops/s | Valós idejű, kétirányú kommunikáció | + +**HTTP kapcsolat pooling** jelentősen javítja a teljesítményt távoli MCP szerverekhez: + +```python +async with httpx.AsyncClient( + timeout=httpx.Timeout(30.0, connect=5.0), + limits=httpx.Limits(max_connections=10, max_keepalive_connections=5) +) as client: + response = await client.post('/mcp', json=request_payload) +``` + +## Haladó eszköz láncolás és vezénylés + +### Szekvenciális eszköz láncolás eredmény átadással + +A modern MCP implementációk kifinomult eszköz láncolást támogatnak, ahol az egyik eszköz kimenetei automatikusan a következő eszközök bemenetei lesznek: + +```json +{ + "tools": [ + { + "name": "analyze_codebase", + "arguments": {"repository": "company/api-service"} + }, + { + "name": "generate_tests", + "arguments": { + "code_analysis": "PROMPT_ARGUMENT: használd a komplexitási metrikákat az előző elemzésből" + } + }, + { + "name": "create_pull_request", + "arguments": { + "tests": "PROMPT_ARGUMENT: a teszt fájlok a 2. lépésből", + "title": "PROMPT_ARGUMENT: leíró cím az elemzés alapján" + } + } + ] +} +``` + +Ez a minta **60-80%-kal csökkenti a token használatot** a szekvenciális egyedi eszköz hívásokhoz képest, miközben atomi multi-eszköz műveleteket tesz lehetővé teljes visszagörgetési képességekkel. + +### Dinamikus képesség kompozíció + +A vállalati MCP telepítések növekvően használnak dinamikus eszköz regisztrációt a változó adatforrások és üzleti követelményekhez való alkalmazkodáshoz: + +```python +class DynamicToolRegistry: + async def connect_to_data_source(self, data_source: DataSourceConfig): + schema = await self.analyze_data_schema(data_source) + generated_tools = [] + + for entity in schema.entities: + crud_tools = self.generate_crud_tools(entity, data_source) + for tool in crud_tools: + await self.register_tool(tool, data_source.security_context) + generated_tools.append(tool.name) + + await self.notify_list_changed() + return generated_tools +``` + +Ez a megközelítés **kontextus-tudatos eszköz generálást** tesz lehetővé, ahol az MCP szerverek automatikusan létrehozzák a megfelelő eszközöket a kapcsolódó rendszerek alapján, csökkentve a manuális eszköz konfigurációs igényt és javítva a rendszer alkalmazkodóképességét. + +### Multi-agent munkafolyamat vezénylés + +A haladó MCP implementációk több specializált agenst koordinálnak kifinomult vezénylési mintákon keresztül: + +- **Agent átadások** teljes kontextus megőrzéssel az átmenetek során +- **Elosztott döntéshozatal** ahol több agent hozzájárul a komplex problémamegoldáshoz +- **Hibatűrő koordináció** automatikus failover és helyreállítási mechanizmusokkal + +A **mcp-agent keretrendszer** ezt a mintát mutatja be a gyakorlatban: + +```python +from mcp_agent.workflows.orchestrator import Orchestrator + +orchestrator = Orchestrator( + worker_agents=[data_analyst, report_generator, reviewer_agent], + plan_type="iterative", + error_handling="compensating_transactions" +) + +result = await orchestrator.generate_str( + "Elemezd a Q4 eladási adatokat, generálj vezetői összefoglalót és küldd jóváhagyásra" +) +``` + +## Production telepítés és vállalati minták + +### Biztonság és megfelelőség architektúra + +A production MCP telepítések átfogó biztonsági intézkedéseket igényelnek az autentikáció, authorizáció és adatvédelem kezeléséhez: + +**Multi-réteg autentikáció**: +- OAuth 2.1 PKCE-vel kliens autentikációhoz +- mTLS szolgáltatások közötti kommunikációhoz +- SPIFFE/SPIRE munkaterhelés identitás kezeléshez +- Képesség-alapú hozzáférés kontroll finom szemcsés engedélyekhez + +**GDPR/CCPA megfelelőség** architektúrális minta szerint változik: + +| Minta | Adat törlés | Helyi vezérlés | Audit nyomvonal | +|-------|-------------|----------------|-----------------| +| Szerver oldali cache | Közvetlen kulcs törlés | Redis klaszter elhelyezés | Teljes naplózás | +| Kliens pointerek | Tárolás törlés szükséges | CDN geo-korlátozások | Hozzáférés naplózás | +| Állapottal rendelkező payload-ok | Komplex kliens oldali adat | Kliens tárolás | Korlátozott láthatóság | + +### Konténer vezénylés és skálázás + +A Kubernetes telepítések horizontális skálázást és hibatűrést tesznek lehetővé: + +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mcp-server-cluster +spec: + serviceName: mcp-server + replicas: 3 + template: + spec: + containers: + - name: mcp-server + image: mcp-server:latest + env: + - name: STATE_STORE + value: "redis://redis-cluster:6379" + - name: OAUTH_ENDPOINT + value: "https://auth.company.com" + resources: + requests: + memory: "512Mi" + cpu: "500m" + limits: + memory: "1Gi" + cpu: "1000m" +``` + +**Teljesítmény monitoring** kulcs metrikákra fókuszál: +- Kérés késleltetés percentilisei (p50, p95, p99) +- Eszköz végrehajtási sikerességi arányok +- Token fogyasztási minták +- Cache találat/miss arányok +- Aktív session számok + +## Gyakori hiba szcenáriók és megoldások + +### Autentikáció és session hibák + +**Session affinitási problémák** terheléselosztott környezetekben: +``` +Hiba: "Nem található session ID-hoz: cb7ed84c-8f2f-4109-b571-2f9fb025a5c2" +Alapok: Session létrehozva A workerben, kérés B workerhez irányítva +``` + +**Megoldási minták**: +- Redis-alapú megosztott session tárolás implementálása +- JWT tokenek használata állapot nélküli session kezeléshez +- Terheléselosztó ragadós sessionök konfigurálása + +### Eszköz végrehajtási timeout-ok és erőforrás korlátok + +**Erőforrás kimerülés kezelés**: +```json +{ + "jsonrpc": "2.0", + "id": "req-456", + "error": { + "code": -32801, + "message": "Tartalom túl nagy", + "data": { + "max_size": 1048576, + "actual_size": 2097152, + "suggested_action": "chunk_request" + } + } +} +``` + +**Rate limiting válaszok** irányítják a kliens viselkedést: +```http +HTTP/1.1 429 Too Many Requests +Retry-After: 30 +X-RateLimit-Limit: 100 +X-RateLimit-Remaining: 0 +X-RateLimit-Reset: 1640995260 + +{ + "error": { + "code": 429, + "message": "Rate limit túllépve", + "retry_after": 30 + } +} +``` + +## Jövőbeli megfontolások és feltörekvő minták + +Az **MCP ökoszisztéma folytatja a gyors evolúciót** vállalati igényeket kielégítő feltörekvő mintákkal: + +- **Kvantum számítástechnika integráció** ultra-gyors kontextus feldolgozáshoz specializált alkalmazásokban +- **AI-vezérelt optimalizálás** önmaga tanuló késleltetés csökkentést és erőforrás allokációt lehetővé téve +- **Neuromorphic számítástechnikai architektúrák** hatékony AI-eszköz interakciós mintákhoz tervezve + +A **token költség optimalizálás** kulcs fókusz marad, az implementációk mutatják az utat a csökkentett overhead felé a kifinomult kontextus kezelés fenntartása mellett. A jelenlegi telepítések demonstrálják, hogy bár az MCP 25-30%-os token overhead-et bevezet, az operációs előnyök (gyorsabb befejezés, magasabb sikerességi arányok, csökkentett fejlesztési idő) erős ROI indoklást biztosítanak. + +## Következtetés + +Az MCP kísérleti protokollból production-kész szabvánnyá érett, amely kifinomult AI-eszköz integrációkat tesz lehetővé. **A valós világbeli telepítések mérhető javulásokat mutatnak**: 20%+ sebesség nyereségek, 100%-os feladat sikerességi arányok és jelentős csökkentés a fejlesztési időben. A protokoll evolúciója a kötelező OAuth 2.1 autentikáció és kifinomult vezénylési minták felé a vállalati AI munkafolyamatok alapvető szabványaként pozicionálja. + +Az MCP-vel való siker megköveteli a **háromszintű architektúra** megértését, a **megfelelő autentikáció és session kezelés** implementálását, az **ellenálló hibakezelés** tervezését és a **nagy léptékű teljesítmény** optimalizálását. Az itt dokumentált minták technikai alapot biztosítanak production-kész MCP integrációk építéséhez, amelyek áthidalják a beszélgetési AI-t és a strukturált vállalati rendszereket, lehetővé téve az AI-vezérelt fejlesztői környezetek következő generációját. + +## Gyakorlati implementációs útmutató + +### MCP szerver felállítás lépésről lépésre + +**1. Alapvető MCP szerver inicializálás** + +```python +from mcp.server import Server +from mcp.types import Tool, TextContent +import asyncio + +# MCP szerver példány létrehozása +app = Server("Hungarian-Dev-Tools") + +@app.list_tools() +async def list_tools(): + return [ + Tool( + name="create_hungarian_docs", + description="Magyar nyelvű dokumentáció generálása", + inputSchema={ + "type": "object", + "properties": { + "project_name": {"type": "string"}, + "language": {"type": "string", "default": "hu"} + } + } + ) + ] + +@app.call_tool() +async def call_tool(name: str, arguments: dict): + if name == "create_hungarian_docs": + return TextContent( + type="text", + text=f"Magyar dokumentáció generálva: {arguments['project_name']}" + ) + +# Szerver indítása +if __name__ == "__main__": + asyncio.run(app.run()) +``` + +**2. Claude Code konfiguráció** + +```json +{ + "mcpServers": { + "hungarian-dev-tools": { + "command": "python", + "args": ["hungarian_mcp_server.py"], + "env": { + "PYTHONPATH": "/path/to/mcp/server" + } + } + } +} +``` + +### Hibakeresési és monitoring technikák + +**MCP kommunikáció naplózása** + +```python +import logging +from mcp.server.stdio import stdio_server + +# Részletes logging beállítása +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('mcp_server.log'), + logging.StreamHandler() + ] +) + +logger = logging.getLogger("hungarian-mcp") + +@app.call_tool() +async def call_tool(name: str, arguments: dict): + logger.info(f"Eszköz hívás: {name} argumentumokkal: {arguments}") + + try: + result = await process_tool_call(name, arguments) + logger.info(f"Sikeres válasz: {len(str(result))} karakter") + return result + except Exception as e: + logger.error(f"Hiba történt: {e}") + raise +``` + +**Teljesítmény metrikák gyűjtése** + +```python +import time +from dataclasses import dataclass +from typing import Dict, List + +@dataclass +class ToolMetrics: + call_count: int = 0 + total_duration: float = 0.0 + error_count: int = 0 + last_called: float = 0.0 + +class MetricsCollector: + def __init__(self): + self.metrics: Dict[str, ToolMetrics] = {} + + async def track_tool_call(self, tool_name: str, func): + start_time = time.time() + + if tool_name not in self.metrics: + self.metrics[tool_name] = ToolMetrics() + + metric = self.metrics[tool_name] + metric.call_count += 1 + metric.last_called = start_time + + try: + result = await func() + duration = time.time() - start_time + metric.total_duration += duration + + logger.info(f"Eszköz {tool_name} - Időtartam: {duration:.2f}s") + return result + except Exception as e: + metric.error_count += 1 + logger.error(f"Eszköz {tool_name} hiba: {e}") + raise + + def get_performance_report(self) -> str: + report = "=== MCP Teljesítmény Jelentés ===\n" + + for tool_name, metric in self.metrics.items(): + avg_duration = metric.total_duration / max(metric.call_count, 1) + error_rate = metric.error_count / max(metric.call_count, 1) * 100 + + report += f""" +Eszköz: {tool_name} +- Hívások száma: {metric.call_count} +- Átlagos időtartam: {avg_duration:.3f}s +- Hibaarány: {error_rate:.1f}% +- Legutóbbi hívás: {time.ctime(metric.last_called)} +""" + return report + +# Globális metrics collector +metrics = MetricsCollector() +``` + +### Biztonsági best practice-ek + +**Input validáció és sanitizáció** + +```python +from marshmallow import Schema, fields, ValidationError +import re + +class GitHubToolSchema(Schema): + repo = fields.Str(required=True, validate=lambda x: bool(re.match(r'^[\w\.-]+/[\w\.-]+, x))) + branch = fields.Str(missing='main', validate=lambda x: bool(re.match(r'^[\w\.-/]+, x))) + action = fields.Str(required=True, validate=lambda x: x in ['read', 'write', 'delete']) + +@app.call_tool() +async def call_github_tool(name: str, arguments: dict): + schema = GitHubToolSchema() + + try: + validated_args = schema.load(arguments) + except ValidationError as e: + logger.error(f"Validációs hiba: {e.messages}") + raise ValueError(f"Érvénytelen paraméterek: {e.messages}") + + # Biztonságos végrehajtás validált argumentumokkal + return await execute_github_operation(validated_args) +``` + +**Hozzáférés-vezérlés implementáció** + +```python +from functools import wraps +from typing import Set + +class PermissionManager: + def __init__(self): + self.user_permissions: Dict[str, Set[str]] = { + "admin": {"read", "write", "delete", "admin"}, + "developer": {"read", "write"}, + "viewer": {"read"} + } + + def has_permission(self, user_role: str, required_permission: str) -> bool: + return required_permission in self.user_permissions.get(user_role, set()) + +permission_manager = PermissionManager() + +def require_permission(permission: str): + def decorator(func): + @wraps(func) + async def wrapper(*args, **kwargs): + # Felhasználói szerepkör lekérése (session-ből vagy token-ből) + user_role = get_current_user_role() + + if not permission_manager.has_permission(user_role, permission): + raise PermissionError(f"Nincs jogosultság '{permission}' művelethez") + + return await func(*args, **kwargs) + return wrapper + return decorator + +@app.call_tool() +@require_permission("write") +async def create_repository(name: str, arguments: dict): + # Csak 'write' jogosultsággal rendelkező felhasználók hívhatják meg + return await github_create_repo(arguments) +``` + +### Skálázhatóság és load balancing + +**Redis-alapú session megosztás** + +```python +import redis.asyncio as redis +import json +from typing import Optional + +class RedisSessionManager: + def __init__(self, redis_url: str = "redis://localhost:6379"): + self.redis_pool = redis.ConnectionPool.from_url(redis_url) + self.redis_client = redis.Redis(connection_pool=self.redis_pool) + + async def store_session(self, session_id: str, data: dict, ttl: int = 3600): + """Session adatok tárolása Redis-ben""" + await self.redis_client.setex( + f"mcp:session:{session_id}", + ttl, + json.dumps(data) + ) + + async def get_session(self, session_id: str) -> Optional[dict]: + """Session adatok lekérése""" + data = await self.redis_client.get(f"mcp:session:{session_id}") + return json.loads(data) if data else None + + async def delete_session(self, session_id: str): + """Session törlése""" + await self.redis_client.delete(f"mcp:session:{session_id}") + +# Globális session manager +session_manager = RedisSessionManager() + +@app.initialize() +async def initialize(session_id: str): + # Session inicializálás és tárolás + session_data = { + "created_at": time.time(), + "user_id": get_authenticated_user_id(), + "permissions": get_user_permissions() + } + + await session_manager.store_session(session_id, session_data) + logger.info(f"Session inicializálva: {session_id}") +``` + +**Kubernetes deployment konfiguráció** + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hungarian-mcp-server + labels: + app: hungarian-mcp +spec: + replicas: 3 + selector: + matchLabels: + app: hungarian-mcp + template: + metadata: + labels: + app: hungarian-mcp + spec: + containers: + - name: mcp-server + image: hungarian-mcp:latest + ports: + - containerPort: 8080 + env: + - name: REDIS_URL + value: "redis://redis-cluster:6379" + - name: LOG_LEVEL + value: "INFO" + - name: METRICS_ENABLED + value: "true" + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "512Mi" + cpu: "500m" + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 5 + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 +--- +apiVersion: v1 +kind: Service +metadata: + name: hungarian-mcp-service +spec: + selector: + app: hungarian-mcp + ports: + - port: 80 + targetPort: 8080 + type: LoadBalancer +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: hungarian-mcp-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: hungarian-mcp-server + minReplicas: 2 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: 80 +``` + +### Fejlett eszköz készítés minták + +**Dinamikus eszköz regisztráció** + +```python +from typing import Dict, Any, List +import inspect + +class DynamicToolRegistry: + def __init__(self, server: Server): + self.server = server + self.registered_tools: Dict[str, Tool] = {} + + def register_tool_from_function(self, func, name: str = None, description: str = None): + """Python függvényből automatikusan eszköz regisztrálása""" + tool_name = name or func.__name__ + tool_description = description or func.__doc__ or f"Automatically generated tool for {func.__name__}" + + # Függvény szignatúra elemzése + sig = inspect.signature(func) + properties = {} + required = [] + + for param_name, param in sig.parameters.items(): + if param_name in ['self', 'cls']: + continue + + param_type = "string" # Alapértelmezett + if param.annotation == int: + param_type = "integer" + elif param.annotation == float: + param_type = "number" + elif param.annotation == bool: + param_type = "boolean" + + properties[param_name] = {"type": param_type} + + if param.default == param.empty: + required.append(param_name) + + # Eszköz schema generálása + input_schema = { + "type": "object", + "properties": properties, + "required": required + } + + tool = Tool( + name=tool_name, + description=tool_description, + inputSchema=input_schema + ) + + self.registered_tools[tool_name] = tool + + # Eszköz handler regisztrálása + @self.server.call_tool() + async def tool_handler(name: str, arguments: dict): + if name == tool_name: + try: + # Argumentumok átadása a függvénynek + if inspect.iscoroutinefunction(func): + result = await func(**arguments) + else: + result = func(**arguments) + + return TextContent(type="text", text=str(result)) + except Exception as e: + logger.error(f"Hiba az eszköz végrehajtása során {tool_name}: {e}") + raise + + logger.info(f"Dinamikusan regisztrált eszköz: {tool_name}") + return tool + +# Használat példa +def calculate_hungarian_tax(gross_income: int, tax_year: int = 2024) -> str: + """Magyar adókalkulátor - bruttó jövedelem alapján számítja ki a fizetendő adót""" + + # 2024-es magyar adótáblázat (egyszerűsített) + tax_rates = { + 2024: { + "personal_allowance": 77300, # Személyi kedvezmény + "tax_rate": 0.15 # SZJA alapkulcs + } + } + + if tax_year not in tax_rates: + return f"Nincs adat a {tax_year} adóévhez" + + rates = tax_rates[tax_year] + taxable_income = max(0, gross_income - rates["personal_allowance"]) + tax_amount = taxable_income * rates["tax_rate"] + net_income = gross_income - tax_amount + + return f""" +Magyar adókalkuláció ({tax_year}): +- Bruttó jövedelem: {gross_income:,} Ft +- Személyi kedvezmény: {rates['personal_allowance']:,} Ft +- Adóalap: {taxable_income:,} Ft +- SZJA ({rates['tax_rate']*100}%): {tax_amount:,} Ft +- Nettó jövedelem: {net_income:,} Ft +""" + +# Dinamikus regisztráció +tool_registry = DynamicToolRegistry(app) +tool_registry.register_tool_from_function( + calculate_hungarian_tax, + description="Magyar személyijövedelemadó kalkulátor" +) +``` + +**Kontextus-tudatos eszközök** + +```python +class ContextAwareToolMixin: + def __init__(self): + self.context_history: List[Dict[str, Any]] = [] + self.user_preferences: Dict[str, Any] = {} + + async def add_context(self, context: Dict[str, Any]): + """Kontextus hozzáadása a történethez""" + context['timestamp'] = time.time() + self.context_history.append(context) + + # Csak az utolsó 50 kontextust tartjuk meg + if len(self.context_history) > 50: + self.context_history = self.context_history[-50:] + + def get_relevant_context(self, query: str, limit: int = 5) -> List[Dict[str, Any]]: + """Releváns kontextus lekérése a query alapján""" + # Egyszerű kulcsszó alapú relevanciavizsgálat + query_words = set(query.lower().split()) + scored_contexts = [] + + for ctx in self.context_history: + ctx_text = str(ctx.get('content', '')) + ctx_words = set(ctx_text.lower().split()) + + # Jaccard similarity + intersection = len(query_words.intersection(ctx_words)) + union = len(query_words.union(ctx_words)) + + if union > 0: + similarity = intersection / union + scored_contexts.append((similarity, ctx)) + + # Relevancia szerint rendezés + scored_contexts.sort(key=lambda x: x[0], reverse=True) + return [ctx for _, ctx in scored_contexts[:limit]] + +class SmartDocumentationTool(ContextAwareToolMixin): + def __init__(self): + super().__init__() + self.project_docs: Dict[str, str] = {} + + async def generate_documentation(self, + project_name: str, + code_context: str, + doc_type: str = "API") -> str: + """Intelligens dokumentáció generálás kontextus alapján""" + + # Releváns kontextus lekérése + relevant_contexts = self.get_relevant_context( + f"{project_name} {code_context} {doc_type}" + ) + + # Kontextus alapján dokumentáció stílus személyreszabása + style_preferences = self.user_preferences.get('doc_style', 'detailed') + language = self.user_preferences.get('language', 'hungarian') + + doc_template = self._get_doc_template(doc_type, style_preferences, language) + + # Kontextus integráció + context_summary = self._summarize_context(relevant_contexts) + + documentation = doc_template.format( + project_name=project_name, + code_context=code_context, + context_summary=context_summary, + timestamp=time.strftime('%Y-%m-%d %H:%M:%S') + ) + + # Kontextus frissítése + await self.add_context({ + 'type': 'documentation_generated', + 'project': project_name, + 'doc_type': doc_type, + 'content': documentation[:500] # Csak az első 500 karakter tárolása + }) + + return documentation + + def _get_doc_template(self, doc_type: str, style: str, language: str) -> str: + templates = { + 'API': { + 'hungarian': { + 'brief': "# {project_name} API Dokumentáció\n\n{code_context}\n\nGenerálva: {timestamp}", + 'detailed': """# {project_name} API Részletes Dokumentáció + +## Áttekintés +{code_context} + +## Kontextus alapú javaslatok +{context_summary} + +## Használati példák +[Automatikusan generált példák következnek...] + +--- +Dokumentáció generálva: {timestamp} +Korábbi kontextus alapján személyre szabva. +""" + } + } + } + + return templates.get(doc_type, {}).get(language, {}).get(style, + "# {project_name}\n{code_context}\n\nGenerated: {timestamp}") + + def _summarize_context(self, contexts: List[Dict[str, Any]]) -> str: + if not contexts: + return "Nincs korábbi kontextus elérhető." + + summary_parts = [] + for ctx in contexts: + ctx_type = ctx.get('type', 'unknown') + content_preview = str(ctx.get('content', ''))[:100] + summary_parts.append(f"- {ctx_type}: {content_preview}...") + + return "Korábbi munkák alapján:\n" + "\n".join(summary_parts) + +# Regisztráció +smart_doc_tool = SmartDocumentationTool() + +@app.call_tool() +async def smart_documentation(name: str, arguments: dict): + if name == "generate_smart_docs": + return TextContent( + type="text", + text=await smart_doc_tool.generate_documentation( + arguments.get('project_name'), + arguments.get('code_context'), + arguments.get('doc_type', 'API') + ) + ) +``` + +Ez a teljes magyar nyelvű MCP dokumentáció gyakorlati implementációs útmutatókkal, monitoring technikákkal, biztonsági best practice-ekkel és fejlett eszközkészítési mintákkal egészíti ki az eredeti tartalmat. \ No newline at end of file diff --git a/docs/mozd_it_weboldal_kovetelmeny_dokploy_deploy_specifikacio_mvp.md b/docs/mozd_it_weboldal_kovetelmeny_dokploy_deploy_specifikacio_mvp.md new file mode 100644 index 0000000..f4a9b63 --- /dev/null +++ b/docs/mozd_it_weboldal_kovetelmeny_dokploy_deploy_specifikacio_mvp.md @@ -0,0 +1,236 @@ +# mozdIT Bt. — Weboldal követelmény + Dokploy deploy specifikáció (MVP) + +## 0) Rövid összefoglaló +Cél: minimális, de komplett, mobil‑első, gyors és biztonságos **bemutatkozó weboldal** a mozdIT Bt.-nek, kiemelt **Webmail** linkkel és rövid, egyedi bemutatkozással. A később készülő **admin aloldal** (szerver‑monitoring/menedzsment) helye előkészítve. Deployment és tesztelés: **Dokploy** környezetben. + +--- + +## 1) MVP oldalak és funkciók +**Oldalak** +- **Kezdőlap**: rövid, egyedi bemutatkozó szöveg; CTA: **Webmail** link (külső URL); szolgáltatások rövid dobozai. +- **Rólunk**: rövid történet, működés óta, személyes ügyfélkezelés, megbízhatóság. +- **Szolgáltatások**: web hosting, email szolgáltatás, DNS adminisztráció (rövid leírás + kapcsolat CTA). +- **Kapcsolat**: űrlap (név, email, üzenet, GDPR checkbox); cég e‑mail, telefonszám (ha lesz), cégnév, székhely. +- **Admin** (előre jelzett aloldal): `/` route fenntartva; tartalom később. + +**Funkciók (MVP)** +- Reszponzív navigáció (hamburger mobilon, sticky header desktopon). +- Űrlapvalidáció (frontend: required + e‑mail forma; backend: spam‑védett endpoint). +- SEO alapok (title/description per oldal, OG, sitemap, robots). +- Analytics: Plausible (cookieless) vagy GA4 (cookie‑consenttel). + +--- + +## 2) Nem‑funkcionális követelmények +- **Reszponzivitás:** mobile‑first; töréspontok: 360 / 640 / 768 / 1024 / 1280+ px. +- **Teljesítmény:** Lighthouse (mobil/desktop) ≥ 90; képek WebP/AVIF; lazy‑load; kritikus CSS minimalizálás. +- **A11y:** WCAG 2.1 AA (fókusz, ARIA, kontraszt ≥ 4.5:1, logikus heading). +- **Biztonság:** HTTPS, alap CSP, XSS/CSRF védelem, input szűrés a backend felé. +- **Megfigyelhetőség:** Sentry (client) + alap logok; uptime healthcheck. + +--- + +## 3) Technológiai stack +- **Frontend:** Next.js (React + TypeScript) — SSG/SSR vegyes; App Router. +- **UI:** Tailwind CSS + egyszerű saját komponensek (később: shadcn/ui opcionális). +- **Űrlapok:** React Hook Form + Zod. +- **State:** minimális local state + SWR (ha kell fetch). +- **Teszt:** Jest + Testing Library (unit), Playwright (E2E — smoke a fő flow‑kra). +- **CMS (opcionális később):** Strapi/Sanity; MVP‑ben statikus tartalom JSON/MDX. + +Projekt‑struktúra (rövid): +``` +/src + /app (Next.js routes) + /components + /styles + /lib + /tests (unit + e2e cfg) +/public +``` + +--- + +## 4) Tartalom (MVP) — copy irány +- **Hero cím** (Kezdőlap): „Megbízható web‑ és email‑szolgáltatás **személyre szabott támogatással**.” +- **Alcím:** „Kis ügyfélkör, nagy figyelem: stabil tárhely, üzembiztos levelezés és DNS adminisztráció — gyors reakcióval.” +- **USP bullet‑ek:** személyes ügyfélkezelés; gyors reagálás; stabil háttér; rugalmas támogatás. +- **Webmail gomb:** „Ugrás a Webmailre”. +- **Rólunk rövid:** mióta működtök; miért a kicsi ügyfélkör; megbízhatóság/folyamatos támogatás. +- **Szolgáltatás dobozok:** Web Hosting / Email / DNS Admin (1–2 mondat/elem, Kapcsolat CTA). + +*(Megjegyzés: a végleges szöveg a review során finomhangolható.)* + +--- + +## 5) Dokploy környezet — architektúra és folyamat + +### 5.1 Környezetek +- **Staging**: `staging.mozdit.hu` (pl. alap auth / IP‑korlátozás, ha kell) +- **Production**: `mozdit.hu` (www → apex redirect vagy fordítva) + +### 5.2 Alap komponensek +- **Reverse proxy/ingress**: Dokploy beépített (Traefik/Nginx környezet — a dokploy stack szerint). +- **App konténer**: Next.js app (Node 20) — SSG build + Node futtatás (vagy statikus export + Nginx). +- **Opció**: CDN (Cloudflare) a statikus assetekhez. + +### 5.3 Environment változók (példa) +- `NEXT_PUBLIC_WEBMAIL_URL=https://webmail.mozdit.hu` +- `COMPANY_NAME=mozdIT Bt.` +- `SITE_URL=https://mozdit.hu` +- `ANALYTICS_PROVIDER=plausible|ga4` +- `PLAUSIBLE_DOMAIN=mozdit.hu` (ha Plausible) +- `GA4_ID=G-XXXXXXX` (ha GA4) +- `CONTACT_API_URL=https://api.mozdit.hu/contact` (ha külön backend) + +### 5.4 Healthcheck & readiness +- HTTP GET `/api/health` → `{status:"ok"}` +- Staging/prod deploy csak zöld health esetén; rollback automatikus szabály (utolsó zöld image). + +--- + +## 6) Docker & build + +### 6.1 Next.js multi‑stage Dockerfile (Node 20) +```dockerfile +# 1) Build stage +FROM node:20-alpine AS builder +WORKDIR /app +COPY package.json package-lock.json* pnpm-lock.yaml* yarn.lock* ./ +RUN npm ci --prefer-offline --no-audit --legacy-peer-deps || npm ci +COPY . . +RUN npm run build + +# 2) Run stage (Node server) +FROM node:20-alpine AS runner +WORKDIR /app +ENV NODE_ENV=production +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/public ./public +COPY --from=builder /app/package.json ./package.json +RUN npm ci --omit=dev --prefer-offline --no-audit || true +EXPOSE 3000 +HEALTHCHECK --interval=30s --timeout=5s --retries=5 CMD wget -qO- http://localhost:3000/api/health || exit 1 +CMD ["npm","start"] +``` +*Megjegyzés:* Ha **statikus export** (SSG only) elegendő, választható Nginx runtime is. + +### 6.2 Dokploy app (magas szint) +- **Repository link** + **branch per environment** (`main` → prod, `develop` → staging) vagy tag‑alapú deploy. +- **Build & deploy**: Dockerfile alapján; port 3000; domain mapping staging/prod; env‑ek UI‑ból/secret store‑ból. +- **Zero‑downtime**: rolling frissítés (legalább 2 replika prod‑on, ha erőforrás engedi). + +--- + +## 7) CI/CD (példa: GitHub Actions) +Workflow: **lint → unit → build → e2e (smoke, staging) → Dokploy deploy → Lighthouse check (staging) → prod release** + +`.github/workflows/ci.yml` (részlet): +```yaml +name: CI +on: + push: + branches: ["main", "develop"] +jobs: + build-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: { node-version: 20 } + - run: npm ci + - run: npm run lint && npm run test -- --ci + - run: npm run build + docker: + needs: build-test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build & push image + uses: docker/build-push-action@v5 + with: + push: true + context: . + tags: registry.example.com/mozdit/site:${{ github.sha }} + deploy-staging: + needs: docker + runs-on: ubuntu-latest + steps: + - name: Trigger Dokploy staging deploy + run: | + curl -X POST "$DOKPLOY_STAGING_HOOK" -H "Authorization: Bearer $DOKPLOY_TOKEN" \ + -d '{"image":"registry.example.com/mozdit/site:${{ github.sha }}"}' + environment: staging + lighthouse: + needs: deploy-staging + runs-on: ubuntu-latest + steps: + - name: Lighthouse CI + run: npx @lhci/cli autorun --collect.url=https://staging.mozdit.hu + deploy-prod: + if: github.ref == 'refs/heads/main' + needs: lighthouse + runs-on: ubuntu-latest + steps: + - name: Trigger Dokploy prod deploy + run: | + curl -X POST "$DOKPLOY_PROD_HOOK" -H "Authorization: Bearer $DOKPLOY_TOKEN" \ + -d '{"image":"registry.example.com/mozdit/site:${{ github.sha }}"}' + environment: production +``` +*Megjegyzés:* a Dokploy‑oldali webhook/API URL és token a platform beállításától függ; ha Git integrációt használtok, a "Trigger" lépés helyett **auto‑deploy** szabály is beállítható. + +--- + +## 8) Tesztelés a Dokploy stagingen +- **Smoke E2E** (Playwright): 3 alap flow → kezdőlap betölt, Webmail link működik, Kapcsolat űrlap hibakezelés OK. +- **Vizsgálatok**: Lighthouse (mobil & desktop), A11y ellenőrző (axe), 404/500 oldal viselkedés. +- **Megfigyelés**: Sentry DSN kapcsolva; health endpoint figyelése. + +--- + +## 9) Biztonság & adatvédelem +- HTTPS (Let’s Encrypt / Dokploy integráció), HSTS. +- **CSP** baseline (script‑src 'self' + szükséges 3rd party); **Referrer‑Policy**, **X‑Frame‑Options** (SAMEORIGIN), **X‑Content‑Type‑Options**. +- **GDPR**: cookie banner ha GA4; Plausible esetén banner elhagyható. +- Kapcsolat űrlap: captcha/light rate‑limit, backend input validáció, e‑mail küldés queue‑val (ha szükséges). + +--- + +## 10) Rollback, backup, verziózás +- **Release tag** (semver) + image tag; Dokploy‑ban korábbi image visszagörgetés. +- **Konfig backup**: env‑ek és Dokploy app export; infra‑as‑code (Dockerfile, workflow‑k) GIT‑ben. + +--- + +## 11) Elfogadási kritériumok (MVP) +- Kezdőlap, Rólunk, Szolgáltatások, Kapcsolat elérhető és reszponzív. +- Webmail link jól működik (új lapon, nofollow opcionális). +- Lighthouse ≥ 90 minden fő mérőszámon stagingen. +- Űrlap hibák/fókuszállapotok a11y‑konformak. +- CI pipeline zöld, staging deploy automatikus; prod deploy csak zöld staging után. + +--- + +## 12) Kezdő feladatlista (ticket sablonok) +1. **Repo & Next.js bootstrap** — *Acceptance*: app indul dev módban; TS, ESLint, Prettier beállítva. +2. **Tailwind + alap layout** — *Acceptance*: reszponzív header/footer; tipográfia, színek. +3. **Kezdőlap (Hero + USP + Webmail CTA)** — *Acceptance*: 1s alatt festődik mobilon; link működik. +4. **Rólunk oldal** — *Acceptance*: heading‑hierarchia helyes; szövegek MDX‑ből tölthetők. +5. **Szolgáltatások oldal** — *Acceptance*: 3 doboz + CTA → Kapcsolat. +6. **Kapcsolat űrlap + API stub** — *Acceptance*: validáció, hibák; egyszerű spam‑védelem. +7. **/api/health endpoint** — *Acceptance*: `{status:"ok"}` JSON. +8. **Dockerfile + Dokploy staging app** — *Acceptance*: buildel, deployol, domain él. +9. **CI (lint, unit) + Staging deploy trigger** — *Acceptance*: PR‑re fut; stagingre pushol. +10. **Playwright smoke E2E + Lighthouse CI** — *Acceptance*: fut stagingen, riport mentve. +11. **Prod app + domain + HTTPS** — *Acceptance*: élő site; automatikus HTTPS; monitoring bekapcsolva. + +--- + +## 13) Későbbi bővítések +- Blog/Újdonságok; többnyelvűség; admin aloldal funkciói; CDN cache; képgenerálás; CMS integráció. + +--- + +*Megjegyzés:* A végleges Dokploy beállítások (webhook/API, auto‑deploy, replika szám, storage) a rendelkezésre álló szerver erőforrásoktól és a Dokploy verziójától függően finomhangolandók. +