From 86e641b282c646ba5e49548e09b4df5f141b86d5 Mon Sep 17 00:00:00 2001 From: Vladimir Buzalka Date: Sun, 19 Apr 2026 13:43:46 +0200 Subject: [PATCH] notebookvb --- Insurance/StahováníZpráv/01_prihlaseni.py | 134 ++++++++++ Insurance/StahováníZpráv/02_stahuj_vse.py | 298 ++++++++++++++++++++++ Insurance/StahováníZpráv/vzp_cookies.json | 122 +++++++++ 3 files changed, 554 insertions(+) create mode 100644 Insurance/StahováníZpráv/01_prihlaseni.py create mode 100644 Insurance/StahováníZpráv/02_stahuj_vse.py create mode 100644 Insurance/StahováníZpráv/vzp_cookies.json diff --git a/Insurance/StahováníZpráv/01_prihlaseni.py b/Insurance/StahováníZpráv/01_prihlaseni.py new file mode 100644 index 0000000..5f10862 --- /dev/null +++ b/Insurance/StahováníZpráv/01_prihlaseni.py @@ -0,0 +1,134 @@ +""" +01 - Přihlášení na VZP Point (Inbox) +Otevře Chrome, přihlásí se certifikátem a naviguje na schránku zpráv. +Okno zůstane otevřené — skript čeká na stisk Enter. +Použití: python 01_prihlaseni.py +""" + +import json +import os +import re +import sys +import time +import winreg + +INBOX_URL = "https://point.vzp.cz/Inbox/Message" +CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile")) +COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vzp_cookies.json")) + + +def load_cookies(context) -> int: + """Načte dříve uložené cookies (včetně session-only) zpět do kontextu.""" + if not os.path.exists(COOKIES_FILE): + return 0 + try: + with open(COOKIES_FILE, "r", encoding="utf-8") as f: + cookies = json.load(f) + context.add_cookies(cookies) + return len(cookies) + except Exception as e: + print(f" Chyba při načítání cookies: {e}") + return 0 + + +def save_cookies(context) -> int: + """Uloží VZP cookies (i session-only) do JSON souboru.""" + try: + all_cookies = context.cookies() + vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")] + with open(COOKIES_FILE, "w", encoding="utf-8") as f: + json.dump(vzp, f, indent=2, ensure_ascii=False) + return len(vzp) + except Exception as e: + print(f" Chyba při ukládání cookies: {e}") + return 0 + + +def _delete_chrome_cert_policy() -> None: + """Smaže AutoSelectCertificateForUrls politiku — Chrome pak zobrazí dialog přirozeně.""" + key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls" + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, access=winreg.KEY_SET_VALUE) + winreg.DeleteValue(key, "1") + winreg.CloseKey(key) + except Exception: + pass + + +def main() -> None: + try: + from playwright.sync_api import sync_playwright + except ImportError: + print("Chybí playwright: pip install playwright && playwright install chrome") + sys.exit(1) + + _delete_chrome_cert_policy() + + with sync_playwright() as p: + context = p.chromium.launch_persistent_context( + user_data_dir=CHROME_PROFILE, + channel="chrome", + headless=False, + slow_mo=200, + ignore_https_errors=True, + args=["--force-renderer-accessibility"], + ) + try: + # Načti dříve uložené cookies (vč. session-only) z JSON + loaded = load_cookies(context) + startup = context.cookies() + vzp_start = [c for c in startup if "vzp.cz" in c.get("domain", "")] + print(f"Profil: {CHROME_PROFILE}") + print(f"Cookies z JSON: {loaded}, VZP v kontextu: {len(vzp_start)}") + + page = context.new_page() + + print("Naviguji na VZP Point...") + try: + page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) + except Exception as e: + print(f"Navigace: {e}") + + if page.url.startswith("https://auth.vzp.cz/signin"): + print("Přihlašovací stránka — klikám na 'Certifikát'...") + cert_btn = page.locator("a, button").filter(has_text=re.compile(r"certifikát", re.I)).first + cert_btn.wait_for(state="visible", timeout=10_000) + cert_btn.click(no_wait_after=True) + + print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...") + time.sleep(30) + + page = context.new_page() + try: + page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) + except Exception as e: + print(f"Navigace po auth: {e}") + + if not page.url.startswith("https://point.vzp.cz"): + print(f"Přihlášení selhalo. URL: {page.url}") + return + + print(f"OK — přihlášení úspěšné. URL: {page.url}") + + # Diagnostika: cookies po auth + after = context.cookies() + vzp_after = [c for c in after if "vzp.cz" in c.get("domain", "")] + print(f"Cookies po auth: VZP: {len(vzp_after)}") + for c in vzp_after: + exp = c.get("expires", -1) + persistent = "PERSISTENT" if exp > 0 else "SESSION-ONLY" + # Zkrácený název pro přehlednost + name = c["name"][:60] + print(f" - {name} ({c['domain']}) [{persistent}]") + + print("Okno zůstane otevřené. Stiskněte Enter pro zavření...") + input() + + finally: + saved = save_cookies(context) + print(f"Uloženo {saved} VZP cookies do {COOKIES_FILE}") + context.close() + + +if __name__ == "__main__": + main() diff --git a/Insurance/StahováníZpráv/02_stahuj_vse.py b/Insurance/StahováníZpráv/02_stahuj_vse.py new file mode 100644 index 0000000..4a5c99e --- /dev/null +++ b/Insurance/StahováníZpráv/02_stahuj_vse.py @@ -0,0 +1,298 @@ +""" +02 - Stažení VŠECH zpráv z VZP Point schránky (jednorázová akce) +Projde celý seznam (lazy-load), stáhne všechny soubory a pojmenuje je: + YYYY-MM-DD Kategorie Název (původní_název).přípona +Použití: python 02_stahuj_vse.py +""" + +import json +import os +import re +import sys +import time +import winreg +from datetime import datetime +from pathlib import Path + +INBOX_URL = "https://point.vzp.cz/Inbox/Message" +CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile")) +COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vzp_cookies.json")) +DOWNLOAD_DIR = os.path.join(os.path.dirname(__file__), "Staženo") + + +def load_cookies(context) -> int: + if not os.path.exists(COOKIES_FILE): + return 0 + try: + with open(COOKIES_FILE, "r", encoding="utf-8") as f: + cookies = json.load(f) + context.add_cookies(cookies) + return len(cookies) + except Exception: + return 0 + + +def save_cookies(context) -> int: + try: + all_cookies = context.cookies() + vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")] + with open(COOKIES_FILE, "w", encoding="utf-8") as f: + json.dump(vzp, f, indent=2, ensure_ascii=False) + return len(vzp) + except Exception: + return 0 + +print(f"Chrome profil: {CHROME_PROFILE}") +print(f"Profil existuje: {os.path.exists(CHROME_PROFILE)}") + + +def _delete_chrome_cert_policy() -> None: + key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls" + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, access=winreg.KEY_SET_VALUE) + winreg.DeleteValue(key, "1") + winreg.CloseKey(key) + except Exception: + pass + + +def parse_date(date_str: str) -> str: + """Převede '16. 4. 2026 09:02' na '2026-04-16'.""" + try: + dt = datetime.strptime(date_str.strip(), "%d. %m. %Y %H:%M") + return dt.strftime("%Y-%m-%d") + except Exception: + return "0000-00-00" + + +def safe_filename(name: str) -> str: + """Odstraní znaky nevhodné pro název souboru.""" + return re.sub(r'[\\/:*?"<>|]', "_", name).strip() + + +def build_filename(date_str: str, category: str, title: str, original: str) -> str: + """Sestaví název souboru: YYYY-MM-DD Kategorie Název (původní).ext""" + orig_path = Path(original) + stem = orig_path.stem + ext = orig_path.suffix # včetně tečky + name = f"{parse_date(date_str)} {safe_filename(category)} {safe_filename(title)} ({safe_filename(stem)}){ext}" + # Windows limit 255 znaků + if len(name) > 240: + name = name[:230] + f"({safe_filename(stem)}){ext}" + return name + + +def load_all_messages(page, max_clicks: int = 0) -> None: + """Opakovaně kliká na 'Načíst další záznamy' (přes JS). max_clicks=0 = bez omezení.""" + clicks = 0 + while True: + if max_clicks and clicks >= max_clicks: + break + # Hledáme tlačítko přes JS — robustnější než Playwright selektor + before_count = page.evaluate("document.querySelectorAll('.InboxMessage').length") + clicked = page.evaluate("""() => { + const btn = Array.from(document.querySelectorAll('a')).find(a => a.innerText.includes('Načíst další')); + if (btn) { btn.scrollIntoView(); btn.click(); return true; } + return false; + }""") + if not clicked: + break + clicks += 1 + # Počkáme až se načtou nové zprávy (counter se zvýší) + try: + page.wait_for_function( + f"document.querySelectorAll('.InboxMessage').length > {before_count}", + timeout=15_000, + ) + except Exception: + print(f" [{clicks}] Nové zprávy nenačteny, končím.") + break + after_count = page.evaluate("document.querySelectorAll('.InboxMessage').length") + print(f" [{clicks}] Načteno {after_count} zpráv (přibyly {after_count - before_count})") + time.sleep(0.3) + + +def collect_messages(page) -> list[dict]: + """Projde DOM přes JS a vrátí seznam zpráv se všemi potřebnými údaji.""" + data = page.evaluate("""() => { + const results = []; + for (const msg of document.querySelectorAll('.InboxMessage')) { + // Kategorie: title atribut ikony v .InboxMessage-row--type + const typeIcon = msg.querySelector('.InboxMessage-row--type i[title]'); + const category = typeIcon ? typeIcon.title.trim() : ''; + + // Název + název souboru: z title atributů na h3 a a.InboxMessage-title-link + const titleEl = msg.querySelector('h3.InboxMessage-title'); + const title = titleEl ? titleEl.title.trim() : ''; + const linkEl = msg.querySelector('a.InboxMessage-title-link'); + const linkTitle = linkEl ? linkEl.title.trim() : ''; // "Stáhnout soubor xyz.pdf" + const original = linkTitle.split(/\\s+/).pop(); // "xyz.pdf" + + // Datum: .InboxMessage-row bez dalších modifikátorů + let date = ''; + for (const row of msg.querySelectorAll('.InboxMessage-row')) { + if (row.className.trim() === 'InboxMessage-row') { + date = row.innerText.trim(); + break; + } + } + + results.push({ title, category, date, original }); + } + return results; + }""") + + # Playwright locatory — každá zpráva má svůj download link uvnitř .InboxMessage + inbox_msgs = page.locator(".InboxMessage").all() + messages = [] + for i, item in enumerate(data): + if i < len(inbox_msgs): + msg_el = inbox_msgs[i] + dl = msg_el.locator(".InboxMessage-row--download .i-l") + if dl.count() > 0: + item["link_locator"] = dl + item["link_type"] = "download" + else: + zobrazit = msg_el.locator(".InboxMessage-row--download .i-r-1") + item["link_locator"] = zobrazit if zobrazit.count() > 0 else None + item["link_type"] = "zobrazit" if zobrazit.count() > 0 else None + item["msg_locator"] = msg_el + else: + item["link_locator"] = None + item["link_type"] = None + messages.append(item) + + return messages + + +def main() -> None: + try: + from playwright.sync_api import sync_playwright + except ImportError: + print("Chybí playwright: pip install playwright && playwright install chrome") + sys.exit(1) + + os.makedirs(DOWNLOAD_DIR, exist_ok=True) + _delete_chrome_cert_policy() + + with sync_playwright() as p: + context = p.chromium.launch_persistent_context( + user_data_dir=CHROME_PROFILE, + channel="chrome", + headless=False, + slow_mo=100, + ignore_https_errors=True, + accept_downloads=True, + args=["--force-renderer-accessibility"], + downloads_path=DOWNLOAD_DIR, + ) + try: + loaded = load_cookies(context) + print(f"Cookies načtené z JSON: {loaded}") + + page = context.new_page() + + print("Naviguji na VZP Point schránku...") + try: + page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) + except Exception as e: + print(f"Navigace: {e}") + + if page.url.startswith("https://auth.vzp.cz/signin"): + print("Přihlašovací stránka — klikám na 'Certifikát'...") + cert_btn = page.locator("a, button").filter(has_text=re.compile(r"certifikát", re.I)).first + cert_btn.wait_for(state="visible", timeout=10_000) + cert_btn.click(no_wait_after=True) + print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...") + time.sleep(60) + page = context.new_page() + try: + page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) + except Exception as e: + print(f"Navigace po auth: {e}") + if not page.url.startswith("https://point.vzp.cz"): + print(f"Přihlášení selhalo. URL: {page.url}") + return + + print("Přihlášení OK. Načítám všechny zprávy (lazy-load)...") + page.wait_for_load_state("networkidle", timeout=15_000) + load_all_messages(page, max_clicks=0) + + print("Sbírám seznam zpráv...") + messages = collect_messages(page) + print(f"Nalezeno {len(messages)} zpráv.") + + already = set(os.listdir(DOWNLOAD_DIR)) + downloaded = 0 + skipped = 0 + + for i, msg in enumerate(messages, 1): + filename = build_filename(msg["date"], msg["category"], msg["title"], msg["original"]) + target = os.path.join(DOWNLOAD_DIR, filename) + + if filename in already or os.path.exists(target): + skipped += 1 + continue + + if msg["link_locator"] is None: + print(f"[{i}/{len(messages)}] Přeskakuji (bez odkazu): {filename}") + continue + + print(f"[{i}/{len(messages)}] Stahuji: {filename}") + + if msg["link_type"] == "download": + try: + with page.expect_download(timeout=30_000) as dl_info: + msg["link_locator"].dispatch_event("click") + dl_info.value.save_as(target) + already.add(filename) + downloaded += 1 + time.sleep(0.3) + except Exception as e: + print(f" Chyba při stahování '{filename}': {e}") + + elif msg["link_type"] == "zobrazit": + try: + msg["link_locator"].click() + # Počkej na rozbalený obsah + footer = msg["msg_locator"].locator(".InboxMessage-footer") + footer.wait_for(state="visible", timeout=10_000) + time.sleep(0.5) + + # Ulož text zprávy jako .txt (bez sekce příloh) + text_el = footer.locator("div").first + text = text_el.inner_text().strip() + txt_target = Path(target).with_suffix(".txt") + txt_target.write_text(text, encoding="utf-8") + already.add(txt_target.name) + downloaded += 1 + print(f" Uložen text: {txt_target.name}") + + # Stáhni přílohy uvnitř zprávy + attach_links = footer.locator("a.i-l").all() + for al in attach_links: + orig = al.get_attribute("title", timeout=2_000) or "" + orig_name = orig.split()[-1] if orig else "priloha" + att_filename = build_filename(msg["date"], msg["category"], msg["title"], orig_name) + att_target = os.path.join(DOWNLOAD_DIR, att_filename) + if not os.path.exists(att_target): + with page.expect_download(timeout=30_000) as dl_info: + al.dispatch_event("click") + dl_info.value.save_as(att_target) + already.add(att_filename) + downloaded += 1 + print(f" Stažena příloha: {att_filename}") + time.sleep(0.3) + except Exception as e: + print(f" Chyba při zobrazení '{filename}': {e}") + + print(f"\nHotovo. Staženo: {downloaded}, přeskočeno (již existuje): {skipped}") + + finally: + saved = save_cookies(context) + print(f"Uloženo {saved} VZP cookies.") + context.close() + + +if __name__ == "__main__": + main() diff --git a/Insurance/StahováníZpráv/vzp_cookies.json b/Insurance/StahováníZpráv/vzp_cookies.json new file mode 100644 index 0000000..c142d62 --- /dev/null +++ b/Insurance/StahováníZpráv/vzp_cookies.json @@ -0,0 +1,122 @@ +[ + { + "name": "ai_user", + "value": "wIhK13IopJb2nNjRoWMJvz|2026-04-19T06:43:49.112Z", + "domain": "auth.vzp.cz", + "path": "/", + "expires": 1808117029.11323, + "httpOnly": false, + "secure": true, + "sameSite": "None" + }, + { + "name": ".Idm.DSID", + "value": "0ecc5408-424f-4c12-8363-906a5db2146b", + "domain": "auth.vzp.cz", + "path": "/", + "expires": 1808117548.882756, + "httpOnly": true, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "ai_user", + "value": "McvWEZRk5dmTYStEe5/hwu|2026-04-19T06:43:55.622Z", + "domain": "point.vzp.cz", + "path": "/", + "expires": 1808117035.623945, + "httpOnly": false, + "secure": true, + "sameSite": "None" + }, + { + "name": "ARRAffinity", + "value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2", + "domain": ".point.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "ARRAffinitySameSite", + "value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2", + "domain": ".point.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "None" + }, + { + "name": "ARRAffinity", + "value": "123f0451d6e23dba3c23f29a23c095e2b0d94b97199afeda26565c8c745dfaad", + "domain": ".auth.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "ARRAffinitySameSite", + "value": "123f0451d6e23dba3c23f29a23c095e2b0d94b97199afeda26565c8c745dfaad", + "domain": ".auth.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "None" + }, + { + "name": "ARRAffinity", + "value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2", + "domain": ".auth-cert27.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "ARRAffinitySameSite", + "value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2", + "domain": ".auth-cert27.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "None" + }, + { + "name": ".AspNetCore.IdmLocalAuth", + "value": "CfDJ8NceE7GPS1hCryl8w53d2tP-WDIbKwQOm0PlEZKlhcodUJYYecsniNTkHawEjQ9PMigigH1LFBhyMF7juithdonBzehldUgN-wgWEuahycGLsUeAcTFiBMy_6h8pgbR086OAxegeBHFmiuMKXJxch88_QC_j1TeStgcgTazXIh7SpKi4fG6kyOxEr5VGMy0xlLviRmbGriAQr19-ptAJf1EGLiIDN2xx0JWapl8KPc1mVAEmwQRbXxW-WXQSDiio6TWvKVdeWy5UCk7QC-wHMfWr9CQ6UoemOFoXvmX9BmqnTtJg6_cXYyc3T1dJunc67a-JlUZJlwblj2ePi2c4KrpYAzE6gH9mheOkTgzJ9kgbEFJ4psimmWexS2SDnMCxNCRp9RFhlipc-RIMJx4NgDhvFy3nKWKP2vxkj0Y-WTiJQSkJzJSR8T_M5WaUnGPy2wTxOelTupjzsHvCad8OonqjSrzYnWBp1NdkuEbl7S3vQ_QHmpygTGGGw4mljcjJb-iFAjafrVsvmkZEdNPACHM7UG-URBhLJh_uWHxZvei8qhW_F86hqqbpraPAfBTw9ShEGCx5vkwuLANbACvIvmkvsRww4BUaHuDy3IugYqI8Xy_34k1eKpaxyNYMZY7kbParYXGy9UZXV0p0DEGAbG52dXiBwpoBXlfXDWrw9hNHpilvZ9fueTa8J2TaMA_FFqbNO8CLSrosfzj3JQ0hTD6HumaX6QircCyHPFHwlcUX", + "domain": "auth.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": ".BDesk.FrontUI.IdmAuth.Cookie", + "value": "CfDJ8COR4DcdV-9Jh-xmwD9F8p2T8-lGdNJ7_FMrxohKxLpsmMzG5wkVsVU5Z-xejDVwd_2hWYl61EWRFn2H7xzIbstM1Iu0A5eSfpu7tcvhYqOlSk3UNtHC2Z7YFXIufMqx8q5GmfItsUdDhoG1dbqsuJ_VYObJnXBKu8oSxUTYYl_di9etizSM9854nu2TzhE0i9VolXLBOIfaOrQR5__es8iCWWJ8fWgSuUUjFF8UEfxcUK2KWC9z8DIgN7R-ZD5vsJ7WXNPNzicwt5ExcK-CmOdsOeKl-O_WDbLcCWYmm12YNvyJxESmnsgyGi37HSezTRyS34MR_FpeYGw3G2CRFVCwvRLAWA2Y90TQ3uhNkSpnZbrN6mgnPUQAq5tjx5PD7Tnh2V8Emmvr2_XS4gOPP6ZB5DUvZxhC4R1Zheisr1wbj1K6wLW7POqdfPAmkxugPvgK0Vp12OGrDrBkip1_9sZt5Z5AyNfhf8_6rYRQ4ZiUNE69C4c5p3BmQET6Amd4daH4vIsTp6ilPa2Xei2QIqyIhAt87Uk0bIu3DofYQQ0gsRZ_qyo7cwLbTEZU7uGmV5lRGUqW0X0oZSYxgP4wiZmpnt9zmZh56-TRWrNGNdenAGeTEDIVqf0s2ct6Z69HRGmHwmgvKuycvew38rfpdwAmvi9gfXzkoDOqf_EaO6XvDWUbNanTJ9QyWMK2PaPdSQc6ZqyZqxzMgl7Ihg8zNZestjz0z2VL4N3iCL0slnLPJrASV3C1Ky8sstjRz5R4J4AaZgxAQTByhMV5rKlBP-Vk7tSxi2w6FyMn_5D5ENzIvfI43G0qgL72Ss3u1j_NCytlT6ROKWY-OTQDcVOwhncK3oulafxLVTIEy5zTt8EU9DGMS_3-Pf2NLVGAyuiFD2lJzEkQpzpvt0bjj-L0njVUHTmGibi8RopAu7sgu-ASVFhH7qAqalE2gv7elkyL9nGeehy3rpBQ5NnuJd5Xv2nUzsxJxfXgZooddCyE3xVAFYd5RRby6iQek264lzXWdbuEZSMNADwiqJvWgAkuMNtBOIUipf5btRZCmCGBxB3WjjnDMCsdI3LHU-7-Pvyc1iuHAijcVLu0fVR-OJMz3RdISl4svmFJO6hERBlN_abxC_i25eeck9GuEWZkVo-Hj0c0BQghZ_Jy22iILQLcgcszOLtQlPWT_szDM4BkuHMzgf3QOJg-Qdqt77MqgUyIz9eta5zTnqLCi7GkKQtvgAgCKJ_LmhEUvA2jCDkc7dW8GS-t-JjqYOOpt3hbI1drX90T72iXtFAqxVsXwYBQ6-_AzZEw7pGl9idizQOIcX7_hiOgn8cl1aQ6JO9DJ6nxM-aSCj34wb_y4wY9MBRgutjhOmR5hFP4l4gLP06po8e-nbTHHiY7Fcj2V4AessnoJZuf9zk8E5wTo--5nxQzpHFDHcuJNv_rooeZ7H7pr0qGck4uP0_RHLtTCRxWLz9dlcPFMwvRhvB4tScd5nXnRRbxoNKSZ6cFSYGTnGU2-GG1GIgwOBb3LBAUVFxFBz6kq_U4iSmcfFDmgJRATxf-AZwWN4SK_e3T1k3emxGPf7SZCk7IRjaVly4YCbZs4UmrW3XoYG9O0zU2-UTb9x-aQ7YM8gVlcyUEeUhBsmsom-7X45ZceTBbUTzdJSDeNH0rpKnKSLeHu6lHnAa2LX3gSQPUy6ah-fOePE3qAw25G6sEIvvgcfentJEWzrcpPqf7jbYe5_D6GHJiBEgWo_NC-IntOU4tcGCotCws9MbGC278vBsNfAeiaKdiPtwswl7JkOZzJJKLhjoFoArvsIHAtzEIO3h-XPuS4aprh7JjCprwMRJzq8bz0BZkn5z44u__JkfnfSlKgi2v5eemMec6_MhSPM8K5hYFAmUf5l5CbF7RM16K56V4YMIgNnIoVUue5rxO74krJ75JRzyN1h1i325fTK5y-rLvzSGNJmruwGckeoFT5D7ir1P7YTAQCzBgns53HbIEhYwBv1e4XnOiy8JozX_8bO2NupbSEKmxn-5n9DfjeUsnq8WdX1scVC4g-qWtsI83uePA64hMvdwtuCl8vRXQQ591-hHsKnrC5IGxharce74_OLY-ztmPOaeUFi22bWYr5bqSCTUT9t5AN7Pe0-pKUHw7iedjU2CF77vLg14oQfwYy12xFpy5wq_rGCWpqTsQBaQAc2cLqudgBQhL1qnEGbHX5HqGJhH2RhhWKaLWV69x2jEgdGSUIJ_qXpws2CSggcZP_3CrdeXumPm61hGzgbhBacyR5xI1xB2jYoLraPO5Fx-xxNkhESjqvdaxZ9Mhs7l3_az7byf_GVBa0dtInqXwpRIJzg1CZYGKf6VeTDKO6_CghT4V9CHB3LtAvx96Pwd3UP1-9RYsrXIUFO06MivvzI4f3i0K_kFpWyOiIGoxZo9F50gjpvM_HNAqH3TGNwoMWi03TxAScdvILQ5EeZfivPeeTDIggR4JWHIhWE75Xrum3-b4CU76PLnWNNExJCMghwruGnwZ17K1aeOUCSpaT6KZ9XXtFqLsLRRiR9Zu2h3dgyq9-PsTzOafitknWu7K17DUiq5AAnA", + "domain": "point.vzp.cz", + "path": "/", + "expires": -1, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "ai_session", + "value": "BonOMZ0/OAueln06g3C+LL|1776598812296|1776598887566", + "domain": "point.vzp.cz", + "path": "/", + "expires": 1776600687.567691, + "httpOnly": false, + "secure": true, + "sameSite": "None" + } +] \ No newline at end of file