diff --git a/.checkpoint-pending.txt b/.checkpoint-pending.txt
index c32e70f..1154b34 100644
--- a/.checkpoint-pending.txt
+++ b/.checkpoint-pending.txt
@@ -1,2 +1,2 @@
S09
-Teilgebiet 01 Iteration Links umgesetzt: alle URLs in cv.md auf explizite Markdown-Links migriert, damit Pandoc echte w:hyperlink-Elemente in die DOCX emittiert (vorher Plain-Text-only, Word zeigte sie nicht als Links und kein Hover funktionierte; im PDF wurden sie ueber Words eigene URL-Erkennung beim PDF-Export trotzdem klickbar, was die Inkonsistenz erklaerte). E-Mail als Pandoc-Autolink-Form mit spitzen Klammern (mailto), Telefon als tel:-Link mit Display-Spaces und URL-ohne-Spaces gem RFC 3966, Web-Links als doppelte-Bracket-Markdown-Syntax mit sichtbaren aeusseren eckigen Klammern als einheitlicher Anzeigetext-Stil. Display-Texte: Link zum Profil fuer LinkedIn und Freelance.de, destengs.de fuer Website (bewusster Wechsel von .com auf .de stimmiger zur deutschen Primaersprache), Dissertation fuer Promotion, Link zum Zertifikat funktioniert nur im Browser fuer TUEV-Zertifikat. TUEV-Link-Problem in Word diagnostiziert: certif-id.com liegt hinter Cloudflare-Bot-Schutz und blockiert Words urlmon-Pre-Flight-Anfrage mit 403; Direkt-Klick aus Word schlaegt mit Die angeforderten Informationen koennen nicht heruntergeladen werden fehl trotz funktionierender URL im Browser. Optionen A (destengs.de-Redirect), B (LinkedIn-Safety-Redirect), C (kein Link) abgewogen und verworfen, Option D gewaehlt: direkter TUEV-Link beibehalten mit erklaerendem Display-Text der den Empfaenger ueber die Word-Einschraenkung informiert. Thomas hat zusaetzlich eine kuerzere TUEV-Direkt-URL besorgt (perscert-tuv.certif-id.com/expert/public/share/7MR0WDzG106JDCqV_RW7) statt der urspruenglichen 130-Zeichen-Hash-URL. Zwischenfall: zweite Edit-Tool-Truncation in dieser Session auf cv.md beim Edit der TUEV- und Promotion-Zeile, die Schluss-Zeile Dissertation fuenf Veroeffentlichungen ein Patent eine Erfindungsmeldung wurde mitten im Wort abgeschnitten. Reparatur identisch zum S08-Pattern: git HEAD-Version als Input, alle 7 Link-Replacements in einem Python-Script atomar via os.replace zurueckgeschrieben mit count==1-Check pro Replacement. Lehre fuer kommende Sessions: Edit-Tool fuer cv.md generell nicht mehr verwenden, Python-aus-git-Pattern bevorzugen. Build und visuelle Bestaetigung durch Thomas erfolgt fuer DOCX und PDF. teilgebiete/01-lebenslauf.md um Iteration-Links-Block ergaenzt.
+Teilgebiet 01 Iteration C Foto-Einbindung umgesetzt. Header als 2-Spalten-Grid-Table in cv.md mit Strich-Verhaeltnis 112:60 (= 65,1%/34,9% Spaltenbreite, ca. 10,15/5,43 cm bei 16 cm Textbreite). Foto rechts oben, 4,06x4,06 cm, beide Dimensionen explizit im Markdown um Pandocs Default-Wrapper keepaspectratio mit height=textheight zu vermeiden, der die Layout-Box auf 24cm Hoehe streckt und die Tabellen-Zeile zerschiesst. DOCX-Header-Spacing per neuer 4. Modifikation in build/post-process-docx.py (process_header_table): findet erste Tabelle, setzt Heading1-spacing-before=0 und Foto-Paragraph spacing-before=100 (=5pt) plus jc=right. PDF-Layout via neuem Pandoc-Lua-Filter build/header-image-wrap.lua: wrappt das Header-Foto im LaTeX-Output mit hfill+raisebox(-height)[0pt][0pt]{...}, hfill schiebt rechtsbuendig in raggedright-p-Spalte, raisebox setzt Bild-Top auf Cell-Top und reportet null Hoehe an die Tabellen-Zeile. Filter prueft FORMAT=latex und Image-Pfad enthaelt foto, DOCX bleibt unberuehrt. Lua-Filter-Erste-Version (Image durch RawInline ersetzt mit gebackenem Pfad) hat Pandocs Image-Resource-Resolution gebrochen und LuaLaTeX scheiterte mit File foto.jpg not found, Fix: Filter gibt Lua-Liste zurueck mit Original-img-Element zwischen RawInline-Wrappern. Template-Hotfixes fuer PDF: renewcommand-nolinkurl-zu-Plaintext (verhindert at-xverbatim-Bruch in longtable-Minipage durch URL-Display-Text-Verbatim-Mode), titlespacing-section-before=0pt fuer H1-Top-Alignment. cv.md: Pipe-Alignment in Grid Table programmatisch via Python ljust und Pipe-Position-Eindeutigkeitscheck (Pandoc 3.x ist beim Grid-Table-Pipe-Alignment streng, Sandbox-Pandoc 2.9 ist toleranter und damit irrefuehrend). build.ps1 erweitert um lua-filter-Argument in PDF und DOCX, plus Read-Host-Wait-on-Error entfernt (blockiert AI-Agents und CI), durch Start-Sleep 3s am Ende ersetzt. header-image-wrap.lua als Pflichtdatei in Test-Path-Check aufgenommen. Vier weitere Edit-Tool-Truncation-Vorfaelle in S09 (cv.md, template.tex zweimal, build.ps1), Lehre verschaerft Edit-Tool fuer jede nicht-triviale Modifikation auf NTFS-Mount-Dateien meiden. Sandbox-NTFS-Stale-Read auf DOCX-Output (DOCX-Datei als not a zip file, Workaround DOCX im Sandbox neu generieren). Sandbox-NTFS-Mount kann auch Datei-Schreiben mit open(w) verweigern obwohl os.path.exists True liefert, Workaround tmp-Datei plus os.rename. Build und visuelle Bestaetigung durch Thomas erfolgt fuer DOCX und PDF. teilgebiete/01-lebenslauf.md um Iteration-C-Block ergaenzt und Naechste-Schritte-Liste auf S10-Plan umgestellt (1 DOCX-Heading-Farben pruefen, 2 Doublecheck der generierten Texte mindestens elektrischer-Gehaeuse ist sinnverkehrt, 3 Buzzword-Kompetenzen brainstormen mindestens Umgang mit quantisierten LLMs fehlt, 4 PDF-Spacings H1/H2/Kontaktdaten und hellgraue Trennlinien korrigieren, 5 Hyphenation-Feintuning, 6 Teilgebiet abschliessen). agent-prompt.md Aktueller-Stand-Block fuer S10 fortgeschrieben.
diff --git a/agent-prompt.md b/agent-prompt.md
index 782ec1b..2104027 100644
--- a/agent-prompt.md
+++ b/agent-prompt.md
@@ -85,34 +85,43 @@ Setze zwischen sinnvollen Zwischenständen Checkpoints (z.B. nach "Marketing.md
## Aktueller Stand / Nächste Aufgabe
-**Letzte Session:** S08 (2026-04-26)
+**Letzte Session:** S09 (2026-04-27)
-**Was wurde gemacht:** Iteration B fuer das DOCX abgeschlossen, plus zwei zusätzliche Anpassungen:
-- **B4.1 — Heading-Farben in destengsblue** (`build/build-reference-docx.py` Funktion `set_heading_colors`, color val=`0B5394`, themeColor accent1 entfernt). H1, H2, H3 alle in destengsblue.
-- **B4.2 — Heading-Trennlinien direkt am Stil verworfen.** Bottom-Border + Indent-Trick (`hanging`) erzeugte in Word linksbündige statt zentrierte Linien. Wichtige Lehre: Words `right`-Indent begrenzt sowohl Text als auch Border — eine Border *schmaler als der Heading-Text* ist über den Stil selbst nicht abbildbar.
-- **B4.3 — Markdown-HRs aus cv.md entfernt** (21 alleinstehende `---`-Zeilen). Quelle der wahrgenommenen „Doppellinien": Pandoc-DOCX-Konvertierung von `---` zu VML-`` (Embossed-Look). Tabellen-Strich-Zeilen blieben unangetastet. **Vorfall:** Sandbox-NTFS-Stale-Read der cv.md (20043 statt 20201 Bytes) hätte fast die Live-Datei truncated, sofortige Wiederherstellung aus `git show HEAD` + HR-Removal erneut mit der git-Version als Input.
-- **B4.4 — H2-Trennlinien via Post-Processing** (`build/post-process-docx.py` um Funktion erweitert): nach jedem H2-Absatz ein leerer Trenn-Absatz mit linksbündiger Bottom-Border, schwarz (`000000`), 8,6 cm Linienlänge (right-Indent 4196 dxa), 1,25 pt dick (sz=10).
-- **B5 — Trainings als Tabelle** (cv.md): Trainings-Bullet-Liste durch Pandoc-Multiline-Tabelle ersetzt (analog Ausbildung), Inhalte normal nicht fett.
-- **B6 — Bullet-Einzüge verkleinert** (`build/post-process-docx.py` modifiziert `numbering.xml` direkt; Pandoc IGNORIERT die `numbering.xml`-Werte der reference.docx, daher MUSS das im Post-Processing passieren). E1: Einzug 0,25 cm + Sondereinzug 0,35 cm (left=340/hanging=198 dxa); E2: Einzug 0,80 cm + Sondereinzug 0,40 cm (left=681/hanging=227 dxa). Word-Konvention: „Einzug links" = `(left - hanging)` = Bullet-Position; „Sondereinzug Hängend" = `hanging`.
+**Was wurde in S09 gemacht:**
-**Nächste Aufgabe:** Teilgebiet 01 — verbleibende Iterationen:
-1. **C — Foto-Einbindung** in cv.md mit Pandoc-Image-Syntax und Template-Anpassung für Position/Größe (z.B. oben rechts neben Name, ca. 3 cm).
-2. **D — Hyphenation-Feintuning für PDF** — kurze Wortteile am Zeilenanfang mit höherer Penalty oder `\hyphenation`-Ausnahmen reduzieren.
+S09 — **Iteration „Links"** in cv.md: alle nackten URLs auf explizite Markdown-Link-Syntax migriert, damit Pandoc echte Hyperlink-Elemente in DOCX (``) und PDF (`\href`) emittiert. E-Mail als Pandoc-Autolink-Form ``, Telefon als `[+49 ...](tel:+49...)`-Link, Web-Links als `[[text]](url)` mit sichtbaren äußeren eckigen Klammern. Display-Texte „Link zum Profil" für LinkedIn/Freelance.de, „destengs.de" für Website (`.com` → `.de`), „Dissertation" für Promotion, „Link zum Zertifikat (funktioniert nur im Browser)" für TÜV. TÜV-Link diagnostiziert: certif-id.com hinter Cloudflare-Bot-Schutz, Word-urlmon-Pre-Flight-Anfrage scheitert mit 403, Direkt-Klick aus Word funktioniert nicht trotz funktionierender URL im Browser. Optionen A (destengs.de-Redirect), B (LinkedIn-Safety-Redirect), C (kein Link) abgewogen, D gewählt: direkter Link mit erklärendem Display-Text. Detaillierte Doku siehe `teilgebiete/01-lebenslauf.md` Block „Iteration Links (S09)".
-Nach D): Status von Teilgebiet 01 in `zentral-index.md` auf „abgeschlossen" setzen (R2-OK von Thomas). Anschließend nächstes Teilgebiet nach Priorität (laut Index Teilgebiet 02 „Zeugnis von ASMPT").
+S09 — **Iteration C: Foto-Einbindung via Grid Table.**
-**Offene Punkte (unverändert seit S04):** Zuschnitt und Festpreise der KI-Produkte (marketing.md Abschnitt 2), KMU-Direkthonorarsatz festlegen (marketing.md Abschnitt 2), Vergütungsmodell-Wahl bei erstem konkreten Fall (Notiz in marketing.md Abschnitt 2).
+- Header-Layout als 2-Spalten-Grid-Table in cv.md (Name+Kontaktdaten links, Foto rechts), Spalten-Verhältnis 65:35 (LEFT_W=112, RIGHT_W=60 Striche).
+- Pandoc 3.x ist beim Pipe-Alignment in Grid Tables strikt (Pandoc 2.9 ist toleranter und damit irreführend für Sandbox-Tests). Grid Table programmatisch in Python aufbauen mit `ljust(LEFT_W)` und Pipe-Position-Eindeutigkeitscheck.
+- DOCX-Header-Spacing per neuer 4. Modifikation in `build/post-process-docx.py` (`process_header_table`): H1-spacing-before = 0, Foto-Paragraph-spacing-before = 5 pt + jc=right.
+- Foto-Größe 4,06 × 4,06 cm, beide Dimensionen explizit im Markdown — verhindert Pandoc-Default `keepaspectratio,height=\textheight`, der die Image-Layout-Box auf 24 cm Höhe streckt und das Tabellen-Layout zerschießt.
+- PDF-Layout via Pandoc-Lua-Filter `build/header-image-wrap.lua`: wrappt das Header-Foto im LaTeX-Output mit `\hfill\raisebox{-\height}[0pt][0pt]{...}`. `\hfill` schiebt rechtsbündig in der `\raggedright`-p-Spalte, `\raisebox` setzt Bild-Top auf Cell-Top und reportet null Höhe an die Tabellen-Zeile. Filter prüft `FORMAT="latex"` und Image-Pfad enthält „foto"; DOCX bleibt unberührt.
+- Lua-Filter-Erste-Version (Image durch RawInline ersetzt) hat Pandocs Image-Resource-Resolution gebrochen → `File 'foto.jpg' not found`. Fix: Filter gibt Lua-Liste zurück, in der das Original-`img`-Element zwischen RawInline-Wrappern erhalten bleibt.
+- Template-Hotfixes für PDF: `\renewcommand{\nolinkurl}[1]{#1}` (verhindert `\@xverbatim`-Bruch in `longtable`-Minipage durch URL-Display-Text-Verbatim), `\titlespacing*{\section}{0pt}{0pt}{0.5em}` (H1-Top-Alignment).
+- `build/build.ps1`: `--lua-filter=$luaFilter` zu PDF- und DOCX-Pandoc-Calls hinzugefügt; `Read-Host`-Wait-on-Error entfernt (blockiert AI-Agents/CI), durch `Start-Sleep -Seconds 3` am Ende bei Fehler ersetzt.
+
+**Vier weitere Edit-Tool-Truncation-Vorfälle in S09** (cv.md, template.tex zweimal, build.ps1). Lehre verschärft: Edit-Tool für jede nicht-triviale Modifikation auf NTFS-Mount-Dateien meiden, generell Python-aus-git-HEAD- oder Python-aus-Disk-Pattern bevorzugen.
+
+**Nächste Aufgabe (S10) in dieser Reihenfolge (von Thomas vorgegeben):**
+
+1. **DOCX: Blau ist nicht DesTEngS-Blau.** Heading-Farben prüfen — Soll: `#0B5394`. `build/build-reference-docx.py` Funktion `set_heading_colors` setzt zwar ``, aber Word rendert ggf. trotzdem den Theme-Aptos-Blau, weil das Heading-Style einen `themeColor`-Verweis behält oder weil das Theme dominiert. Prüfen, ob das `themeColor`-Attribut wirklich entfernt ist und ob die Farbe direkt am Run statt am Stil gesetzt werden muss.
+2. **Doublecheck der neu generierten Texte in cv.md.** Mindestens „elektrischer Gehäuse" ist sinnverkehrt (vermutlich aus V9/V10-KI-Iterationen). cv.md komplett auf Sinn- und Sprachfehler durchgehen, vermutlich Konkordanz-/Stil-Fehler an mehreren Stellen.
+3. **Buzzword-Kompetenzen-Brainstorm.** Kenntnisse-Abschnitt erweitern. Mindestens „Umgang mit quantisierten LLMs" ergänzen. Weitere KI-Begriffe für Agentur-Keyword-Matching identifizieren (Quantization, GGUF, GPTQ, AWQ, Inference-Optimierung, vLLM, llama.cpp, Ollama-Deployment etc.).
+4. **PDF: Abstände H1 / H2 „Kontaktdaten" / Kontaktdaten-Bullet-Liste stimmen nicht** (Folge der C4c-Spacing-Änderung). Plus: hellgraue Trennlinien (rulegray = `#BFBFBF`) sind inakzeptabel — Farbe oder Linienführung überdenken (Trennlinien stehen nach H1 und H2 im titlesec-Format-Block).
**Hinweise für die nächste Session:**
-- **Word-Indent-Konvention (S08-Lehre):** Word zeigt im Absatz-Dialog „Einzug links" als `(left - hanging)`, NICHT als `left`. „Sondereinzug Hängend" ist `hanging`. Daher gilt: `left = (gewünschter Einzug + gewünschter Hanging-Indent)` in dxa.
-- **Word-Border-Limit (S08-Lehre):** Words paragraph-Border folgt den Indents; eine Border *schmaler als der Heading-Text* geht NICHT über `` auf dem Heading-Stil, weil der right-Indent auch den Text begrenzt. Lösung wenn nötig: separater Trenn-Absatz nach dem Heading via Post-Processing.
-- **Pandoc IGNORIERT die `numbering.xml` der reference.docx (S08-Lehre).** Wer Bullet-Einzüge ändern will, muss das im Post-Processing tun, nicht in `build-reference-docx.py`.
-- **Pandoc generiert für Markdown-`---` im DOCX VML-Horizontal-Lines (``)** — sehen aus wie Doppellinien (Embossed). Im PDF rendert Pandoc dieselbe Quelle als saubere zentrierte Halblinie. Wenn man saubere DOCX-Trennung braucht: HRs in cv.md entfernen oder Pandoc-Lua-Filter für DOCX-Build.
-- **Sandbox-NTFS-Stale-Reads sind häufiger und kritischer als gedacht (S08-Lehre).** Sandbox kann auch git-Status, Datei-Existenz und Datei-Inhalte verzerrt sehen, ohne dass die echte Datei betroffen ist. **Bei jedem Sandbox-Schreiben auf eine grössere NTFS-Mount-Datei: ERST git-Version verifizieren und als Input verwenden, NICHT blind dem Sandbox-Read trauen.** Bei seltsamen git-status-Outputs aus der Sandbox: erst Thomas auf PowerShell `git status` ausführen lassen.
-- **Edit-Tool truncated regelmäßig** (mehrfach in S07 und S08 erlebt — Skript-Dateien, `.checkpoint-pending.txt`, `agent-prompt.md`, `teilgebiete/01-lebenslauf.md`). Faustregel: Bei jedem Edit auf NTFS-Mount-Datei nach `Edit` mit `wc -c` und `tail -c 80` verifizieren. Bei längeren Edits oder wenn das Risiko hoch ist: lieber per Heredoc/Python aus der git-Version neu schreiben.
-- **Sandbox-Pandoc ist 2.9.x, Thomas' System läuft Pandoc 3.x.** Output-Unterschiede zwischen den Versionen können Build-Probleme verursachen. Sandbox-Pandoc emittiert weder die calc-basierten Spaltenbreiten (`p{... * \real{...}}`) noch `\def\LTcaptype{none}` — beides Pandoc-3.x-Eigenheiten. Bei Fehlern, die nur auf Thomas' System auftreten, **synthetisch das Pandoc-3.x-Output-Fragment in einer Mini-Tex-Datei nachbauen** und damit gegen das Template kompilieren.
-- **Sandbox kann nichts an `.git/` schreiben** (NTFS-Permission-Issue): Lock-Files, korrupte Index — alles muss von PowerShell aus repariert werden.
-- **`checkpoint.ps1` ist robust** gegen Anführungszeichen, Pipes, Whitespace-Anomalien und Index-Lock-Reste. `.checkpoint-pending.txt` darf ganz normal Sonderzeichen enthalten.
-- **`build.ps1` pausiert bei Fehler 3 Sekunden pro fehlgeschlagenem Schritt.** Nicht überrascht sein, wenn ein fehlerhafter Lauf entsprechend länger braucht.
-- **`build/build-reference-docx.py` muss VOR `build.ps1` manuell aufgerufen werden, wenn `templates/reference.docx` neu gebaut werden soll.** Das Skript ist nicht in `build.ps1` integriert (würde jeden Build verlangsamen und Pandoc-Default-Reference jedes Mal neu ziehen). Wenn jemand die `reference.docx` von Hand in Word editiert, gehen die Änderungen beim nächsten Skript-Lauf verloren — Stile gehören also ins Skript, nicht in Word.
-- **DOCX-Pipeline ist jetzt 3-stufig mit drei Post-Processing-Modifikationen:** (1) `build/build-reference-docx.py` baut die `reference.docx` (manuell aufrufen, wenn Stile geändert werden sollen), (2) `build/build.ps1` baut PDF und DOCX, (3) `build/post-process-docx.py` wird automatisch aus `build.ps1` aufgerufen und macht: 3-3-Listen-Bullet-Regel, H2-Trennlinien-Einfügung, Bullet-Einzug-Anpassung in `numbering.xml`. Wer das Bullet-Verhalten oder Trennlinien ändern will, fasst das Post-Processing-Skript an.
+
+- **Pandoc 3.x ist beim Grid-Table-Pipe-Alignment strikt (S09-Lehre).** Grid Tables programmatisch bauen mit `ljust()`-Padding und Pipe-Position-Verifikation, nicht von Hand. Sandbox-Pandoc 2.9 ist toleranter und kann beim Testen den Eindruck erwecken, dass etwas funktioniert, was bei Thomas (Pandoc 3.x) nicht funktioniert.
+- **Pandoc 3.x emittiert in p-Spalten mit nur einem Image-Element keine `\begin{minipage}`-Wrapper (S09-Lehre).** Das Image landet direkt in der `p{calc...}`-Spalte und unterliegt der `\parbox[t]`-Baseline-Logik (Image-Bottom = Baseline = Cell-Top, Image ragt nach oben heraus). Lösung: Lua-Filter mit `\raisebox{-\height}[0pt][0pt]{...}`.
+- **Pandoc emittiert für href mit URL-Display-Text `\nolinkurl{}` (Verbatim-Mode, S09-Lehre).** In `longtable`-Minipage bricht das mit `! Paragraph ended before \@xverbatim was complete.` ab. Fix mit `\renewcommand{\nolinkurl}[1]{#1}` ist drin.
+- **Pandoc-3.x-`keepaspectratio,height=\textheight`-Default ist tückisch (S09-Lehre).** Layout-Box wird auf textheight gestreckt selbst wenn das Bild visuell klein ist — beide Dimensionen explizit setzen, wenn das Bild in einer Tabelle ist.
+- **Lua-Filter müssen das `img`-Element im AST belassen, sonst kein Resource-Path-Resolution (S09-Lehre).** Lua-Liste-Return mit `{RawInline, img, RawInline}` statt einzelnes RawInline mit gebackenem Pfad.
+- **Edit-Tool-Truncation auf NTFS-Mount-Dateien ist nach S07/S08/S09 ein systematisches Problem** — durchgehend Python-aus-git-HEAD- oder Python-aus-Disk-Pattern verwenden (atomar via `os.replace`). Sandbox kann zudem stale-reads liefern (z.B. DOCX als „not a zip file"), bei Verdacht git-Version verifizieren oder Build neu erzeugen.
+- **`build.ps1` ist jetzt nicht-blockierend (S09-Lehre).** AI-Agents und CI-Systeme können das Skript aufrufen ohne Read-Host-Hänger. Bei Fehler 3 s Pause am Ende plus 3 s pro fehlgeschlagenem Schritt.
+- **Sandbox-Index-Lock-Issue:** Sandbox kann nichts an `.git/` schreiben (NTFS-Permission-Issue), Index-Lock-Reste muss Thomas auf PowerShell beseitigen. Bei dauerhaftem Lock-File-Vorhandensein zeigt `git status` eine Warning, aber lesende git-Operations (show, log) funktionieren weiter.
+- **DOCX-Pipeline ist 3-stufig mit vier Post-Processing-Modifikationen:** (1) `build/build-reference-docx.py` baut die `reference.docx` (manuell aufrufen), (2) `build/build.ps1` baut PDF und DOCX, (3) `build/post-process-docx.py` macht: 3-3-Listen-Bullet-Regel, H2-Trennlinien, Bullet-Einzüge in `numbering.xml`, Header-Tabellen-H1-Spacing-und-Foto-Spacing.
+- **Kein Hyphenation-Feintuning (Iteration D) in S09.** Steht in S10-Liste hinter den vier Korrektur-Punkten.
+
+**Offene Punkte (unverändert seit S04):** Zuschnitt und Festpreise der KI-Produkte (marketing.md Abschnitt 2), KMU-Direkthonorarsatz festlegen (marketing.md Abschnitt 2), Vergütungsmodell-Wahl bei erstem konkreten Fall (Notiz in marketing.md Abschnitt 2).
diff --git a/artefakte/01-lebenslauf/build/build.ps1 b/artefakte/01-lebenslauf/build/build.ps1
index 1c60ea7..23df83a 100644
--- a/artefakte/01-lebenslauf/build/build.ps1
+++ b/artefakte/01-lebenslauf/build/build.ps1
@@ -1,170 +1,190 @@
-#Requires -Version 5.1
-<#
-.SYNOPSIS
- Baut den DesTEngS-Lebenslauf aus source/cv.md in PDF und DOCX.
-
-.DESCRIPTION
- Deterministischer Build ohne GUI oder Komfortfunktionen.
- - PDF via Pandoc + LuaLaTeX, nutzt templates/template.tex
- - DOCX via Pandoc, nutzt templates/reference.docx
- - DOCX-Post-Processing via build/post-process-docx.py
- (Listen-Bullet-Schutz nach 3-3-Regel)
- - Log in output/build.log (ueberschrieben pro Build)
- - Fortschritt wird zusaetzlich in der Konsole angezeigt
- - Exit-Code 0 = alle Schritte erfolgreich, 1 = mindestens ein Fehler
-
-.NOTES
- Voraussetzungen auf dem System:
- - Pandoc (im PATH)
- - MiKTeX mit LuaLaTeX
- - Python 3 (im PATH) fuer Post-Processing
- - System-Fonts: IBM Plex Sans und IBM Plex Mono fuer Windows installiert
- MiKTeX mit "Install missing packages on the fly: Yes" zieht fehlende
- LaTeX-Pakete beim ersten Lauf automatisch.
-
- Hinweis: templates/reference.docx wird NICHT bei jedem Build neu gebaut.
- Bei Stiländerungen vorher manuell `python build/build-reference-docx.py`
- aufrufen.
-#>
-
-$ErrorActionPreference = 'Continue'
-$PSNativeCommandUseErrorActionPreference = $false
-
-# --- Pfade (alle relativ zum Speicherort dieses Skripts) ---------------------
-$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
-$baseDir = Split-Path -Parent $scriptDir
-$sourceFile = Join-Path $baseDir 'source\cv.md'
-$sourceDir = Join-Path $baseDir 'source'
-$templateTex = Join-Path $baseDir 'templates\template.tex'
-$referenceDoc = Join-Path $baseDir 'templates\reference.docx'
-$outputDir = Join-Path $baseDir 'output'
-$outputPdf = Join-Path $outputDir 'Lebenslauf_Dr-Ing_Thomas_Langer.pdf'
-$outputDocx = Join-Path $outputDir 'Lebenslauf_Dr-Ing_Thomas_Langer.docx'
-$logFile = Join-Path $outputDir 'build.log'
-
-# --- Output-Ordner sicherstellen ---------------------------------------------
-if (-not (Test-Path $outputDir)) {
- New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
-}
-
-# --- Log initialisieren (UTF-8 ohne BOM) -------------------------------------
-$utf8NoBom = New-Object System.Text.UTF8Encoding $false
-function Write-Log {
- param([string]$Line)
- [System.IO.File]::AppendAllText($logFile, $Line + [Environment]::NewLine, $utf8NoBom)
-}
-[System.IO.File]::WriteAllText($logFile, '', $utf8NoBom)
-
-$startTs = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
-Write-Host ""
-Write-Host "===== Build gestartet: $startTs =====" -ForegroundColor Cyan
-Write-Log "===== Build gestartet: $startTs ====="
-Write-Log "Source: $sourceFile"
-Write-Log "Template-TEX: $templateTex"
-Write-Log "Reference: $referenceDoc"
-Write-Log "Output-Dir: $outputDir"
-Write-Log ''
-
-$overallExit = 0
-
-# --- Pflichtdateien pruefen --------------------------------------------------
-foreach ($f in @($sourceFile, $templateTex, $referenceDoc)) {
- if (-not (Test-Path $f)) {
- Write-Host "FEHLER: Pflichtdatei fehlt: $f" -ForegroundColor Red
- Write-Log "FEHLER: Pflichtdatei fehlt: $f"
- $overallExit = 1
- }
-}
-if ($overallExit -ne 0) {
- Write-Host "===== Abbruch: Pflichtdateien fehlen =====" -ForegroundColor Red
- Write-Log "===== Abbruch: Pflichtdateien fehlen ====="
- Start-Sleep -Seconds 3
- exit $overallExit
-}
-
-# --- PDF-Build ---------------------------------------------------------------
-Write-Host ""
-Write-Host "[1/3] PDF wird erzeugt (Pandoc + LuaLaTeX) ..." -ForegroundColor Yellow
-Write-Log "--- Pandoc -> PDF (LuaLaTeX) ---"
-$pdfArgs = @(
- '--from=markdown+smart',
- '--pdf-engine=lualatex',
- "--template=$templateTex",
- "--resource-path=$sourceDir",
- "--output=$outputPdf",
- $sourceFile
-)
-Write-Log ('Cmd: pandoc ' + ($pdfArgs -join ' '))
-$pdfOutput = & pandoc @pdfArgs 2>&1
-$pdfExit = $LASTEXITCODE
-$pdfOutput | ForEach-Object { Write-Log ([string]$_) }
-if ($pdfExit -eq 0 -and (Test-Path $outputPdf)) {
- $sizeKB = [math]::Round((Get-Item $outputPdf).Length / 1KB, 1)
- Write-Host " PDF OK ($sizeKB KB): $outputPdf" -ForegroundColor Green
- Write-Log "PDF OK: $outputPdf ($sizeKB KB)"
-} else {
- Write-Host " PDF FEHLER (Exit $pdfExit) - Details siehe build.log" -ForegroundColor Red
- Write-Log "PDF FEHLER (Exit $pdfExit)"
- $overallExit = 1
- Start-Sleep -Seconds 3
-}
-
-# --- DOCX-Build --------------------------------------------------------------
-Write-Host ""
-Write-Host "[2/3] DOCX wird erzeugt (Pandoc) ..." -ForegroundColor Yellow
-Write-Log "--- Pandoc -> DOCX ---"
-$docxArgs = @(
- '--from=markdown+smart',
- "--reference-doc=$referenceDoc",
- "--resource-path=$sourceDir",
- "--output=$outputDocx",
- $sourceFile
-)
-Write-Log ('Cmd: pandoc ' + ($docxArgs -join ' '))
-$docxOutput = & pandoc @docxArgs 2>&1
-$docxExit = $LASTEXITCODE
-$docxOutput | ForEach-Object { Write-Log ([string]$_) }
-if ($docxExit -eq 0 -and (Test-Path $outputDocx)) {
- $sizeKB = [math]::Round((Get-Item $outputDocx).Length / 1KB, 1)
- Write-Host " DOCX OK ($sizeKB KB): $outputDocx" -ForegroundColor Green
- Write-Log "DOCX OK: $outputDocx ($sizeKB KB)"
-
- # --- Post-Processing: Listen-Bullet-Schutz (3-3-Regel) ------------------
- Write-Host ""
- Write-Host "[3/3] DOCX-Post-Processing (Listen-Bullet-Schutz) ..." -ForegroundColor Yellow
- Write-Log "--- Post-Process DOCX ---"
- $postScript = Join-Path $scriptDir 'post-process-docx.py'
- if (Test-Path $postScript) {
- $ppOutput = & python $postScript 2>&1
- $ppExit = $LASTEXITCODE
- $ppOutput | ForEach-Object {
- Write-Log ([string]$_)
- Write-Host " $_"
- }
- if ($ppExit -ne 0) {
- Write-Host " POST-PROCESS FEHLER (Exit $ppExit)" -ForegroundColor Red
- Write-Log "POST-PROCESS FEHLER (Exit $ppExit)"
- $overallExit = 1
- Start-Sleep -Seconds 3
- }
- } else {
- Write-Host " Hinweis: $postScript nicht vorhanden, uebersprungen" -ForegroundColor Yellow
- Write-Log "Hinweis: post-process-docx.py nicht vorhanden, uebersprungen"
- }
-} else {
- Write-Host " DOCX FEHLER (Exit $docxExit) - Details siehe build.log" -ForegroundColor Red
- Write-Log "DOCX FEHLER (Exit $docxExit)"
- $overallExit = 1
- Start-Sleep -Seconds 3
-}
-
-$endTs = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
-Write-Host ""
-if ($overallExit -eq 0) {
- Write-Host "===== Build beendet: $endTs, Exit-Code $overallExit (OK) =====" -ForegroundColor Cyan
-} else {
- Write-Host "===== Build beendet: $endTs, Exit-Code $overallExit (FEHLER) =====" -ForegroundColor Red
-}
-Write-Log "===== Build beendet: $endTs, Exit-Code $overallExit ====="
-
-exit $overallExit
+#Requires -Version 5.1
+<#
+.SYNOPSIS
+ Baut den DesTEngS-Lebenslauf aus source/cv.md in PDF und DOCX.
+
+.DESCRIPTION
+ Deterministischer Build ohne GUI oder Komfortfunktionen.
+ - PDF via Pandoc + LuaLaTeX, nutzt templates/template.tex
+ - DOCX via Pandoc, nutzt templates/reference.docx
+ - DOCX-Post-Processing via build/post-process-docx.py
+ (Listen-Bullet-Schutz nach 3-3-Regel)
+ - Log in output/build.log (ueberschrieben pro Build)
+ - Fortschritt wird zusaetzlich in der Konsole angezeigt
+ - Exit-Code 0 = alle Schritte erfolgreich, 1 = mindestens ein Fehler
+
+.NOTES
+ Voraussetzungen auf dem System:
+ - Pandoc (im PATH)
+ - MiKTeX mit LuaLaTeX
+ - Python 3 (im PATH) fuer Post-Processing
+ - System-Fonts: IBM Plex Sans und IBM Plex Mono fuer Windows installiert
+ MiKTeX mit "Install missing packages on the fly: Yes" zieht fehlende
+ LaTeX-Pakete beim ersten Lauf automatisch.
+
+ Hinweis: templates/reference.docx wird NICHT bei jedem Build neu gebaut.
+ Bei Stiländerungen vorher manuell `python build/build-reference-docx.py`
+ aufrufen.
+#>
+
+$ErrorActionPreference = 'Continue'
+$PSNativeCommandUseErrorActionPreference = $false
+
+# --- Pfade (alle relativ zum Speicherort dieses Skripts) ---------------------
+$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
+$baseDir = Split-Path -Parent $scriptDir
+$sourceFile = Join-Path $baseDir 'source\cv.md'
+$sourceDir = Join-Path $baseDir 'source'
+$templateTex = Join-Path $baseDir 'templates\template.tex'
+$referenceDoc = Join-Path $baseDir 'templates\reference.docx'
+$outputDir = Join-Path $baseDir 'output'
+$outputPdf = Join-Path $outputDir 'Lebenslauf_Dr-Ing_Thomas_Langer.pdf'
+$outputDocx = Join-Path $outputDir 'Lebenslauf_Dr-Ing_Thomas_Langer.docx'
+$logFile = Join-Path $outputDir 'build.log'
+$luaFilter = Join-Path $scriptDir 'header-image-wrap.lua'
+
+# --- Output-Ordner sicherstellen ---------------------------------------------
+if (-not (Test-Path $outputDir)) {
+ New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
+}
+
+# --- Log initialisieren (UTF-8 ohne BOM) -------------------------------------
+$utf8NoBom = New-Object System.Text.UTF8Encoding $false
+function Write-Log {
+ param([string]$Line)
+ [System.IO.File]::AppendAllText($logFile, $Line + [Environment]::NewLine, $utf8NoBom)
+}
+[System.IO.File]::WriteAllText($logFile, '', $utf8NoBom)
+
+$startTs = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
+Write-Host ""
+Write-Host "===== Build gestartet: $startTs =====" -ForegroundColor Cyan
+Write-Log "===== Build gestartet: $startTs ====="
+Write-Log "Source: $sourceFile"
+Write-Log "Template-TEX: $templateTex"
+Write-Log "Reference: $referenceDoc"
+Write-Log "Output-Dir: $outputDir"
+Write-Log ''
+
+$overallExit = 0
+
+# --- Pflichtdateien pruefen --------------------------------------------------
+foreach ($f in @($sourceFile, $templateTex, $referenceDoc, $luaFilter)) {
+ if (-not (Test-Path $f)) {
+ Write-Host "FEHLER: Pflichtdatei fehlt: $f" -ForegroundColor Red
+ Write-Log "FEHLER: Pflichtdatei fehlt: $f"
+ $overallExit = 1
+ }
+}
+if ($overallExit -ne 0) {
+ Write-Host "===== Abbruch: Pflichtdateien fehlen =====" -ForegroundColor Red
+ Write-Log "===== Abbruch: Pflichtdateien fehlen ====="
+ Start-Sleep -Seconds 3
+ exit $overallExit
+}
+
+# --- PDF-Build ---------------------------------------------------------------
+Write-Host ""
+Write-Host "[1/3] PDF wird erzeugt (Pandoc + LuaLaTeX) ..." -ForegroundColor Yellow
+Write-Log "--- Pandoc -> PDF (LuaLaTeX) ---"
+$pdfArgs = @(
+ '--from=markdown+smart',
+ '--pdf-engine=lualatex',
+ "--template=$templateTex",
+ "--lua-filter=$luaFilter",
+ "--resource-path=$sourceDir",
+ "--output=$outputPdf",
+ $sourceFile
+)
+Write-Log ('Cmd: pandoc ' + ($pdfArgs -join ' '))
+$pdfOutput = & pandoc @pdfArgs 2>&1
+$pdfExit = $LASTEXITCODE
+$pdfOutput | ForEach-Object { Write-Log ([string]$_) }
+if ($pdfExit -eq 0 -and (Test-Path $outputPdf)) {
+ $sizeKB = [math]::Round((Get-Item $outputPdf).Length / 1KB, 1)
+ Write-Host " PDF OK ($sizeKB KB): $outputPdf" -ForegroundColor Green
+ Write-Log "PDF OK: $outputPdf ($sizeKB KB)"
+} else {
+ Write-Host " PDF FEHLER (Exit $pdfExit) - Details siehe build.log" -ForegroundColor Red
+ Write-Log "PDF FEHLER (Exit $pdfExit)"
+ $overallExit = 1
+ Start-Sleep -Seconds 3
+}
+
+# --- DOCX-Build --------------------------------------------------------------
+Write-Host ""
+Write-Host "[2/3] DOCX wird erzeugt (Pandoc) ..." -ForegroundColor Yellow
+Write-Log "--- Pandoc -> DOCX ---"
+$docxArgs = @(
+ '--from=markdown+smart',
+ "--reference-doc=$referenceDoc",
+ "--lua-filter=$luaFilter",
+ "--resource-path=$sourceDir",
+ "--output=$outputDocx",
+ $sourceFile
+)
+Write-Log ('Cmd: pandoc ' + ($docxArgs -join ' '))
+$docxOutput = & pandoc @docxArgs 2>&1
+$docxExit = $LASTEXITCODE
+$docxOutput | ForEach-Object { Write-Log ([string]$_) }
+if ($docxExit -eq 0 -and (Test-Path $outputDocx)) {
+ $sizeKB = [math]::Round((Get-Item $outputDocx).Length / 1KB, 1)
+ Write-Host " DOCX OK ($sizeKB KB): $outputDocx" -ForegroundColor Green
+ Write-Log "DOCX OK: $outputDocx ($sizeKB KB)"
+
+ # --- Post-Processing: Listen-Bullet-Schutz (3-3-Regel) ------------------
+ Write-Host ""
+ Write-Host "[3/3] DOCX-Post-Processing (Listen-Bullet-Schutz) ..." -ForegroundColor Yellow
+ Write-Log "--- Post-Process DOCX ---"
+ $postScript = Join-Path $scriptDir 'post-process-docx.py'
+ if (Test-Path $postScript) {
+ $ppOutput = & python $postScript 2>&1
+ $ppExit = $LASTEXITCODE
+ $ppOutput | ForEach-Object {
+ Write-Log ([string]$_)
+ Write-Host " $_"
+ }
+ if ($ppExit -ne 0) {
+ Write-Host " POST-PROCESS FEHLER (Exit $ppExit)" -ForegroundColor Red
+ Write-Log "POST-PROCESS FEHLER (Exit $ppExit)"
+ $overallExit = 1
+ Start-Sleep -Seconds 3
+ }
+ } else {
+ Write-Host " Hinweis: $postScript nicht vorhanden, uebersprungen" -ForegroundColor Yellow
+ Write-Log "Hinweis: post-process-docx.py nicht vorhanden, uebersprungen"
+ }
+} else {
+ Write-Host " DOCX FEHLER (Exit $docxExit) - Details siehe build.log" -ForegroundColor Red
+ Write-Log "DOCX FEHLER (Exit $docxExit)"
+ $overallExit = 1
+ Start-Sleep -Seconds 3
+}
+
+$endTs = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
+Write-Host ""
+if ($overallExit -eq 0) {
+ Write-Host "===== Build beendet: $endTs, Exit-Code $overallExit (OK) =====" -ForegroundColor Cyan
+} else {
+ Write-Host "===== Build beendet: $endTs, Exit-Code $overallExit (FEHLER) =====" -ForegroundColor Red
+}
+Write-Log "===== Build beendet: $endTs, Exit-Code $overallExit ====="
+
+# Bei Fehler: auf Enter warten, damit Fenster nicht zumacht und User die
+# rote Fehlermeldung im Scrollback in Ruhe lesen kann. Die Start-Sleep-3
+# nach jedem fehlgeschlagenen Schritt allein reicht nicht, weil nachfolgende
+# Schritte (DOCX, Post-Process) die rote Zeile aus dem sichtbaren Bereich
+# scrollen koennen.
+if ($overallExit -ne 0) {
+ # Bei Fehler: 3 Sekunden Pause, damit ein Mensch die rote Fehlermeldung
+ # im Scrollback noch lesen kann, bevor das PowerShell-Fenster zugeht.
+ # KEIN Read-Host: das Skript muss auch nicht-interaktiv von AI-Agents
+ # oder CI-Systemen ausfuehrbar sein. Die zusaetzliche Pause kommt OBEN-
+ # DRAUF zur Start-Sleep-3-pro-Fehler-Schritt-Pause weiter oben.
+ Write-Host ""
+ Write-Host "Build hatte Fehler. Details siehe build.log." -ForegroundColor Yellow
+ Write-Host "Fenster schliesst in 3 Sekunden ..." -ForegroundColor Yellow
+ Start-Sleep -Seconds 3
+}
+
+exit $overallExit
diff --git a/artefakte/01-lebenslauf/build/header-image-wrap.lua b/artefakte/01-lebenslauf/build/header-image-wrap.lua
new file mode 100644
index 0000000..b20e607
--- /dev/null
+++ b/artefakte/01-lebenslauf/build/header-image-wrap.lua
@@ -0,0 +1,26 @@
+-- header-image-wrap.lua
+-- Wrappt das Header-Foto im PDF-Output mit \hfill\raisebox{-\height}[0pt][0pt]{...},
+-- damit es in der rechten Tabellen-Zelle rechtsbuendig sitzt und die Bild-Top auf
+-- der Cell-Top steht (statt durch parbox-[t]-Baseline-Logik nach oben aus der Zelle
+-- herauszuragen).
+--
+-- Wirkt nur bei LaTeX-Output (FORMAT-Variable) und nur fuer Bilder mit "foto" im
+-- Dateinamen. DOCX bleibt unberuehrt: Pandoc rendert das Image-Element normal,
+-- und das DOCX-Post-Processing kuemmert sich um Rechtsbuendig + Spacing.
+--
+-- Wichtig: Das Image-Element MUSS im AST bleiben, damit Pandoc seine Resource-
+-- Path-Resolution (Image-Datei finden, ggf. in den LaTeX-Build-Tempdir kopieren)
+-- weiterhin durchfuehrt. Wenn das Image durch ein einzelnes RawInline mit
+-- gebackenem Pfad ersetzt wuerde, wuerde LuaLaTeX die Datei nicht finden:
+-- ! Package luatex.def Error: File `foto-...jpg' not found.
+-- Deshalb geben wir eine Liste mit RawInline + Image + RawInline zurueck.
+
+function Image(img)
+ if not FORMAT:match("latex") then return nil end
+ if not img.src:match("foto") then return nil end
+ return {
+ pandoc.RawInline("latex", "\\hfill\\raisebox{-\\height}[0pt][0pt]{"),
+ img,
+ pandoc.RawInline("latex", "}")
+ }
+end
diff --git a/artefakte/01-lebenslauf/build/post-process-docx.py b/artefakte/01-lebenslauf/build/post-process-docx.py
index 3e8fbc9..cf92853 100644
--- a/artefakte/01-lebenslauf/build/post-process-docx.py
+++ b/artefakte/01-lebenslauf/build/post-process-docx.py
@@ -31,6 +31,17 @@ abbilden koennen:
(left - hanging) = Bullet-Position; "Sondereinzug Haengend" = hanging.
Daher rechnen wir: left = (gewuenschter Einzug + gewuenschter Hanging) in dxa.
+4. Header-Tabelle (S10) — Foto-Position und H1-Spacing:
+ - Erste Tabelle des Dokuments ist unsere Header-Tabelle (Name + Kontaktdaten
+ in linker Zelle, Foto in rechter Zelle).
+ - Im Heading1-Absatz der linken Zelle wird ``
+ gesetzt, damit die H1-Oberkante an der Spalten-Oberkante steht
+ (Pandoc/Word-Default: 18 pt vor H1).
+ - Im Foto-Absatz der rechten Zelle wird ``
+ (= 5 pt) gesetzt und das `` von `left` auf `right` geaendert,
+ damit das Foto an die rechte Spaltenkante rueckt und die Oberkante
+ mit der H1-Oberkante in einer Linie liegt.
+
Voraussetzungen: nur Python-Stdlib.
"""
@@ -209,6 +220,88 @@ def process_numbering_xml(xml):
new_xml = XML_DECL + ET.tostring(root, encoding="unicode")
return new_xml, stats
+def modify_ppr(p_xml, spacing_before=None, jc=None):
+ """In einem ...-Block die Eigenschaften setzen.
+
+ spacing_before: str (Wert in 1/20 pt, z.B. "0" oder "100"), oder None
+ jc: str ("left", "right", "center", "both"), oder None
+ """
+ ppr_re = re.compile(r"(.*?)", re.DOTALL)
+ m = ppr_re.search(p_xml)
+ if m is None:
+ # kein pPr -> einen leeren pPr direkt nach hinzufuegen
+ # und rekursiv aufrufen
+ new_p = p_xml.replace("", "", 1)
+ return modify_ppr(new_p, spacing_before=spacing_before, jc=jc)
+
+ inner = m.group(1)
+ new_inner = inner
+
+ if jc is not None:
+ jc_re = re.compile(r'')
+ if jc_re.search(new_inner):
+ new_inner = jc_re.sub(f'', new_inner)
+ else:
+ new_inner = new_inner + f''
+
+ if spacing_before is not None:
+ sp_re = re.compile(r'')
+ sm = sp_re.search(new_inner)
+ if sm:
+ sp_xml = sm.group()
+ if 'w:before=' in sp_xml:
+ new_sp = re.sub(r'w:before="[^"]*"',
+ f'w:before="{spacing_before}"', sp_xml)
+ else:
+ new_sp = sp_xml.replace(''
+
+ if new_inner == inner:
+ return p_xml
+ return p_xml.replace(f"{inner}",
+ f"{new_inner}", 1)
+
+
+HEADING1_RE = re.compile(r'')
+
+def process_header_table(xml):
+ """Modifiziert die ERSTE ... im Dokument.
+
+ - Heading1-Paragraph der linken Zelle: spacing-before = 0 (statt 18 pt)
+ - Foto-Paragraph der rechten Zelle (enthaelt ):
+ spacing-before = 100 (= 5 pt) und jc = right (statt left).
+ """
+ stats = {"h1_modified": 0, "foto_modified": 0}
+ tbl_re = re.compile(r'.*?', re.DOTALL)
+ tbl_m = tbl_re.search(xml)
+ if tbl_m is None:
+ return xml, stats
+
+ tbl = tbl_m.group()
+ new_tbl = tbl
+
+ p_re = re.compile(r']*>.*?', re.DOTALL)
+ for pm in list(p_re.finditer(tbl)):
+ p_xml = pm.group()
+ if HEADING1_RE.search(p_xml):
+ new_p = modify_ppr(p_xml, spacing_before="0")
+ if new_p != p_xml:
+ new_tbl = new_tbl.replace(p_xml, new_p, 1)
+ stats["h1_modified"] += 1
+ elif '' in p_xml:
+ new_p = modify_ppr(p_xml, spacing_before="100", jc="right")
+ if new_p != p_xml:
+ new_tbl = new_tbl.replace(p_xml, new_p, 1)
+ stats["foto_modified"] += 1
+
+ if new_tbl == tbl:
+ return xml, stats
+ return xml.replace(tbl, new_tbl, 1), stats
+
+
def main():
if not DOCX_FILE.exists():
sys.stderr.write(f"FEHLER: {DOCX_FILE} existiert nicht. "
@@ -220,6 +313,7 @@ def main():
members = {name: z.read(name) for name in z.namelist()}
doc_xml = members["word/document.xml"].decode("utf-8")
+ doc_xml, header_stats = process_header_table(doc_xml)
new_doc_xml, doc_stats = process_document_xml(doc_xml)
members["word/document.xml"] = new_doc_xml.encode("utf-8")
@@ -245,6 +339,8 @@ def main():
log(f" H2-Trenn-Absaetze eingefuegt: {doc_stats['separators_added']}")
log(f" numbering.xml abstractNum-Eintraege: {num_stats['abstractNums']}")
log(f" numbering.xml lvls modifiziert: {num_stats['lvls_modified']}")
+ log(f" Header-Tabelle H1 modifiziert: {header_stats['h1_modified']}")
+ log(f" Header-Tabelle Foto modifiziert: {header_stats['foto_modified']}")
log("Fertig.")
return 0
diff --git a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx
index 3093922..3a6fc59 100644
Binary files a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx and b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx differ
diff --git a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf
index 6b588ea..c1e1307 100644
--- a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf
+++ b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf
@@ -1,7 +1,7 @@
%PDF-1.5
%
1 0 obj
-<< /S /GoTo /D (Doc-Start) >>
+<< /S /GoTo /D (none.1) >>
endobj
4 0 obj
(\376\377\000L\000e\000b\000e\000n\000s\000l\000a\000u\000f\000\040\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r)
@@ -15,236 +15,1705 @@ endobj
endobj
9 0 obj
-<< /S /GoTo /D (section*.1) >>
+<< /S /GoTo /D (section*.2) >>
endobj
-11 0 obj
+12 0 obj
(\376\377\000Z\000u\000s\000a\000m\000m\000e\000n\000f\000a\000s\000s\000u\000n\000g)
endobj
-12 0 obj
-<< /S /GoTo /D (section*.1) >>
+13 0 obj
+<< /S /GoTo /D (section*.2) >>
endobj
-14 0 obj
+15 0 obj
(\376\377\000P\000r\000o\000j\000e\000k\000t\000e\000\040\000a\000l\000s\000\040\000f\000r\000e\000i\000b\000e\000r\000u\000f\000l\000i\000c\000h\000e\000r\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t)
endobj
-15 0 obj
-<< /S /GoTo /D (section*.2) >>
+16 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-18 0 obj
+19 0 obj
(\376\377\000S\000e\000i\000t\000\040\000J\000u\000l\000i\000\040\0002\0000\0001\0001\000\040\040\024\000\040\000I\000n\000h\000a\000b\000e\000r\000\040\000v\000o\000n\000\040\000D\000e\000s\000T\000E\000n\000g\000S\000\040\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r\000,\000\040\000n\000a\000h\000e\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-19 0 obj
-<< /S /GoTo /D (section*.2) >>
+20 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-21 0 obj
+22 0 obj
(\376\377\000A\000u\000g\000.\000\040\0002\0000\0002\0004\000\040\040\023\000\040\000F\000e\000b\000.\000\040\0002\0000\0002\0006\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000A\000S\000M\000P\000T\000\040\000\050\000I\000n\000d\000u\000s\000t\000r\000i\000e\000l\000l\000e\000\040\000B\000e\000s\000t\000\374\000c\000k\000u\000n\000g\000s\000m\000a\000s\000c\000h\000i\000n\000e\000n\000\051\000,\000\040\000S\000y\000s\000t\000e\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000A\000b\000t\000e\000i\000l\000u\000n\000g\000\040\000R\000\046\000D\000\040\0003\0008\000,\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-22 0 obj
-<< /S /GoTo /D (section*.2) >>
+23 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-24 0 obj
+25 0 obj
(\376\377\000S\000e\000p\000.\000\040\0002\0000\0002\0005\000\040\040\023\000\040\000F\000e\000b\000.\000\040\0002\0000\0002\0006\000\040\040\024\000\040\000P\000r\000o\000j\000e\000k\000t\000\040\040\036\000K\000i\000s\000c\000h\000d\000l\000e\040\035\000,\000\040\000G\000e\000s\000c\000h\000\344\000f\000t\000s\000k\000o\000n\000z\000e\000p\000t\000\040\000v\000o\000n\000\040\0002\000\040\000p\000o\000t\000e\000n\000z\000i\000e\000l\000l\000e\000n\000\040\000G\000r\000\374\000n\000d\000e\000r\000n\000:)
endobj
-25 0 obj
-<< /S /GoTo /D (section*.2) >>
+26 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-27 0 obj
+28 0 obj
(\376\377\000J\000a\000n\000.\000\040\040\023\000\040\000F\000e\000b\000.\000\040\0002\0000\0002\0006\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000L\000u\000m\000i\000z\000\040\000\050\000M\000a\000r\000k\000e\000t\000i\000n\000g\000-\000D\000i\000e\000n\000s\000t\000l\000e\000i\000s\000t\000e\000r\000\051\000,\000\040\000T\000a\000u\000f\000k\000i\000r\000c\000h\000e\000n\000:)
endobj
-28 0 obj
-<< /S /GoTo /D (section*.2) >>
+29 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-30 0 obj
+31 0 obj
(\376\377\000N\000o\000v\000.\000\040\0002\0000\0002\0000\000\040\040\023\000\040\000M\000a\000i\000\040\0002\0000\0002\0004\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000A\000S\000M\000P\000T\000\040\000\050\000I\000n\000d\000u\000s\000t\000r\000i\000e\000l\000l\000e\000\040\000B\000e\000s\000t\000\374\000c\000k\000u\000n\000g\000s\000m\000a\000s\000c\000h\000i\000n\000e\000n\000\051\000,\000\040\000S\000y\000s\000t\000e\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000A\000b\000t\000e\000i\000l\000u\000n\000g\000\040\000R\000\046\000D\000\040\0003\0008\000,\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-31 0 obj
-<< /S /GoTo /D (section*.2) >>
+32 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-33 0 obj
+34 0 obj
(\376\377\000A\000u\000g\000.\000\040\0002\0000\0001\0008\000\040\040\023\000\040\000J\000u\000l\000i\000\040\0002\0000\0002\0000\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000M\000a\000g\000n\000a\000\040\000E\000l\000e\000c\000t\000r\000o\000n\000i\000c\000s\000\040\000E\000u\000r\000o\000p\000e\000\040\000\050\000A\000u\000t\000o\000m\000o\000b\000i\000l\000-\000Z\000u\000l\000i\000e\000f\000e\000r\000e\000r\000\051\000,\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-34 0 obj
-<< /S /GoTo /D (section*.2) >>
+35 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-36 0 obj
+37 0 obj
(\376\377\000N\000o\000v\000.\000\040\0002\0000\0001\0004\000\040\040\023\000\040\000J\000u\000l\000i\000\040\0002\0000\0001\0008\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000I\000n\000f\000i\000n\000e\000o\000n\000,\000\040\000A\000b\000t\000e\000i\000l\000u\000n\000g\000\040\000D\000E\000S\000\040\000T\000C\000P\000\040\000P\000C\000B\000,\000\040\000G\000r\000o\000\337\000r\000a\000u\000m\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-37 0 obj
-<< /S /GoTo /D (section*.2) >>
+38 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-39 0 obj
+40 0 obj
(\376\377\000A\000p\000r\000.\000\040\040\023\000\040\000A\000u\000g\000.\000\040\0002\0000\0001\0005\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000K\000a\000t\000h\000r\000e\000i\000n\000.\000n\000e\000t\000.\000t\000e\000c\000h\000\040\000\050\000U\000b\000i\000d\000y\000n\000e\000-\000N\000a\000c\000h\000f\000o\000l\000g\000e\000r\000\051\000,\000\040\000U\000l\000m\000:)
endobj
-40 0 obj
-<< /S /GoTo /D (section*.2) >>
+41 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-42 0 obj
+43 0 obj
(\376\377\000S\000e\000p\000.\000\040\0002\0000\0001\0001\000\040\040\023\000\040\000J\000u\000l\000i\000\040\0002\0000\0001\0004\000\040\040\024\000\040\000C\000o\000n\000s\000u\000l\000t\000a\000n\000t\000\040\000b\000e\000i\000\040\000A\000l\000c\000a\000t\000e\000l\000-\000L\000u\000c\000e\000n\000t\000,\000\040\000A\000b\000t\000e\000i\000l\000u\000n\000g\000\040\000M\000S\000/\000E\000,\000\040\000S\000t\000u\000t\000t\000g\000a\000r\000t\000:)
endobj
-43 0 obj
-<< /S /GoTo /D (section*.2) >>
+44 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-45 0 obj
+46 0 obj
(\376\377\000J\000u\000l\000i\000\040\0002\0000\0001\0001\000\040\040\024\000\040\000G\000r\000\374\000n\000d\000u\000n\000g\000\040\000v\000o\000n\000\040\000D\000e\000s\000T\000E\000n\000g\000S\000\040\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r\000\040\000\050\000I\000n\000g\000e\000n\000i\000e\000u\000r\000b\000\374\000r\000o\000\051\000,\000\040\000n\000a\000h\000e\000\040\000U\000l\000m)
endobj
-46 0 obj
-<< /S /GoTo /D (section*.2) >>
+47 0 obj
+<< /S /GoTo /D (section*.3) >>
endobj
-48 0 obj
+49 0 obj
(\376\377\000B\000e\000r\000u\000f\000l\000i\000c\000h\000e\000\040\000S\000t\000a\000t\000i\000o\000n\000e\000n\000\040\000v\000o\000r\000\040\000d\000e\000r\000\040\000S\000e\000l\000b\000s\000t\000\344\000n\000d\000i\000g\000k\000e\000i\000t)
endobj
-49 0 obj
-<< /S /GoTo /D (section*.3) >>
+50 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-52 0 obj
+53 0 obj
(\376\377\000J\000u\000l\000i\000\040\0002\0000\0000\0006\000\040\040\023\000\040\000J\000u\000n\000i\000\040\0002\0000\0001\0001\000\040\040\024\000\040\000H\000e\000a\000d\000\040\000o\000f\000\040\000R\000F\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000b\000e\000i\000\040\000U\000b\000i\000d\000y\000n\000e\000\040\000\050\000S\000t\000a\000r\000t\000u\000p\000,\000\040\000c\000a\000.\000\040\0006\0000\000\040\000M\000i\000t\000a\000r\000b\000e\000i\000t\000e\000r\000,\000\040\000a\000k\000t\000i\000v\000e\000\040\000A\000n\000t\000e\000n\000n\000e\000n\000\040\000f\000\374\000r\000\040\000M\000o\000b\000i\000l\000f\000u\000n\000k\000-\000B\000a\000s\000i\000s\000s\000t\000a\000t\000i\000o\000n\000e\000n\000\051\000,\000\040\000A\000b\000t\000e\000i\000l\000u\000n\000g\000\040\000E\000n\000g\000i\000n\000e\000e\000r\000i\000n\000g\000,\000\040\000U\000l\000m\000:)
endobj
-53 0 obj
-<< /S /GoTo /D (section*.3) >>
+54 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-55 0 obj
+56 0 obj
(\376\377\000J\000a\000n\000.\000\040\0002\0000\0000\0003\000\040\040\023\000\040\000J\000u\000n\000i\000\040\0002\0000\0000\0006\000\040\040\024\000\040\000E\000n\000t\000w\000i\000c\000k\000l\000u\000n\000g\000s\000i\000n\000g\000e\000n\000i\000e\000u\000r\000\040\000b\000e\000i\000\040\000T\000o\000s\000h\000i\000b\000a\000\040\000E\000l\000e\000c\000t\000r\000o\000n\000i\000c\000s\000\040\000E\000u\000r\000o\000p\000e\000,\000\040\000E\000u\000r\000o\000p\000e\000a\000n\000\040\000L\000S\000I\000\040\000D\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t\000\040\000a\000n\000d\000\040\000E\000n\000g\000i\000n\000e\000e\000r\000i\000n\000g\000\040\000C\000e\000n\000t\000r\000e\000,\000\040\000D\000\374\000s\000s\000e\000l\000d\000o\000r\000f\000:)
endobj
-56 0 obj
-<< /S /GoTo /D (section*.3) >>
+57 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-58 0 obj
+59 0 obj
(\376\377\000D\000e\000z\000.\000\040\0002\0000\0000\0000\000\040\040\023\000\040\000D\000e\000z\000.\000\040\0002\0000\0000\0002\000\040\040\024\000\040\000E\000n\000t\000w\000i\000c\000k\000l\000u\000n\000g\000s\000i\000n\000g\000e\000n\000i\000e\000u\000r\000\040\000b\000e\000i\000\040\000M\000u\000l\000t\000i\000l\000i\000n\000k\000\040\000T\000e\000c\000h\000n\000o\000l\000o\000g\000y\000\040\000\050\000S\000t\000a\000r\000t\000u\000p\000\040\000m\000i\000t\000\040\000b\000i\000s\000\040\000z\000u\000\040\0003\0006\0000\000\040\000M\000i\000t\000a\000r\000b\000e\000i\000t\000e\000r\000n\000\040\000w\000e\000l\000t\000w\000e\000i\000t\000,\000\040\000I\000C\000s\000\040\000u\000n\000d\000\040\000M\000o\000d\000u\000l\000e\000\040\000f\000\374\000r\000\040\000f\000a\000s\000e\000r\000o\000p\000t\000i\000s\000c\000h\000e\000\040\000\334\000b\000e\000r\000t\000r\000a\000g\000u\000n\000g\000s\000s\000y\000s\000t\000e\000m\000e\000\051\000,\000\040\000B\000e\000r\000l\000i\000n\000:)
endobj
-59 0 obj
-<< /S /GoTo /D (section*.3) >>
+60 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-61 0 obj
+62 0 obj
(\376\377\000N\000o\000v\000.\000\040\0001\0009\0009\0008\000\040\040\023\000\040\000N\000o\000v\000.\000\040\0002\0000\0000\0000\000\040\040\024\000\040\000E\000n\000t\000w\000i\000c\000k\000l\000u\000n\000g\000s\000i\000n\000g\000e\000n\000i\000e\000u\000r\000\040\000b\000e\000i\000\040\000S\000i\000e\000m\000e\000n\000s\000,\000\040\000B\000e\000r\000e\000i\000c\000h\000\040\000I\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000C\000o\000m\000m\000u\000n\000i\000c\000a\000t\000i\000o\000n\000\040\000N\000e\000t\000w\000o\000r\000k\000s\000,\000\040\000M\000\374\000n\000c\000h\000e\000n\000:)
endobj
-62 0 obj
-<< /S /GoTo /D (section*.3) >>
+63 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-64 0 obj
+65 0 obj
(\376\377\000O\000k\000t\000.\000\040\0001\0009\0009\0004\000\040\040\023\000\040\000O\000k\000t\000.\000\040\0001\0009\0009\0008\000\040\040\024\000\040\000W\000i\000s\000s\000e\000n\000s\000c\000h\000a\000f\000t\000l\000i\000c\000h\000e\000r\000\040\000M\000i\000t\000a\000r\000b\000e\000i\000t\000e\000r\000\040\000a\000m\000\040\000F\000e\000r\000d\000i\000n\000a\000n\000d\000-\000B\000r\000a\000u\000n\000-\000I\000n\000s\000t\000i\000t\000u\000t\000\040\000f\000\374\000r\000\040\000H\000\366\000c\000h\000s\000t\000f\000r\000e\000q\000u\000e\000n\000z\000t\000e\000c\000h\000n\000i\000k\000,\000\040\000B\000e\000r\000l\000i\000n\000:)
endobj
-65 0 obj
-<< /S /GoTo /D (section*.3) >>
+66 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-67 0 obj
+68 0 obj
(\376\377\000S\000e\000p\000.\000\040\0001\0009\0009\0002\000\040\040\023\000\040\000A\000u\000g\000.\000\040\0001\0009\0009\0003\000\040\040\024\000\040\000S\000t\000u\000d\000e\000n\000t\000i\000s\000c\000h\000e\000\040\000H\000i\000l\000f\000s\000k\000r\000a\000f\000t\000\040\000a\000m\000\040\000F\000e\000r\000d\000i\000n\000a\000n\000d\000-\000B\000r\000a\000u\000n\000-\000I\000n\000s\000t\000i\000t\000u\000t\000\040\000f\000\374\000r\000\040\000H\000\366\000c\000h\000s\000t\000f\000r\000e\000q\000u\000e\000n\000z\000t\000e\000c\000h\000n\000i\000k\000,\000\040\000B\000e\000r\000l\000i\000n\000:)
endobj
-68 0 obj
-<< /S /GoTo /D (section*.3) >>
+69 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-70 0 obj
+71 0 obj
(\376\377\000J\000a\000n\000.\000\040\0001\0009\0009\0000\000\040\040\023\000\040\000M\000\344\000r\000z\000\040\0001\0009\0009\0002\000\040\040\024\000\040\000S\000t\000u\000d\000e\000n\000t\000i\000s\000c\000h\000e\000\040\000H\000i\000l\000f\000s\000k\000r\000a\000f\000t\000\040\000a\000m\000\040\000H\000a\000h\000n\000-\000M\000e\000i\000t\000n\000e\000r\000-\000I\000n\000s\000t\000i\000t\000u\000t\000,\000\040\000B\000e\000r\000l\000i\000n\000:)
endobj
-71 0 obj
-<< /S /GoTo /D (section*.3) >>
+72 0 obj
+<< /S /GoTo /D (section*.4) >>
endobj
-73 0 obj
+74 0 obj
(\376\377\000A\000u\000s\000b\000i\000l\000d\000u\000n\000g)
endobj
-74 0 obj
-<< /S /GoTo /D (none.1) >>
+75 0 obj
+<< /S /GoTo /D (none.2) >>
endobj
-77 0 obj
+78 0 obj
(\376\377\000T\000r\000a\000i\000n\000i\000n\000g\000s)
endobj
-78 0 obj
-<< /S /GoTo /D (none.2) >>
+79 0 obj
+<< /S /GoTo /D (none.3) >>
endobj
-81 0 obj
+82 0 obj
(\376\377\000K\000e\000n\000n\000t\000n\000i\000s\000s\000e)
endobj
-82 0 obj
-<< /S /GoTo /D [ 83 0 R /Fit ] >>
+83 0 obj
+<< /S /GoTo /D [ 84 0 R /Fit ] >>
endobj
-91 0 obj
-<< /Filter /FlateDecode /Length 3125 >>
+93 0 obj
+<< /Filter /FlateDecode /Length 3184 >>
stream
-x[ˎ+
WF`hfJ.M~?(RJvU!+ߋ7Qn4[%8w-^߿[%1[~?kt_@ͳ51} t Q淒(o/?t|dDDkYј%@V'eUY)`]OE6_.+h$rgW~)b"4g+C{cNXBĮUynFMM\P@TFP'-8/*VD\qNNin<]ܔjpM"JF_NZlo$u=:TbXb.g+}R%41;T$ 7hԪͫxUq\Q; %y&K)xԫz&M0k$|ks"?UGp -mS;^.a`EQSQV)#'ِ^]-IDa0M,;-|[M*Ǒ!@t'ii -{h1
,dE8ZtzeMT۪T8-ùmtIg Xn4sg5F+ZQۉV8HRԇ32iIodbu㠋sCrDwp |sW 8@5ʼnnpuqblLqƊ|c
-ȗY3
+8#kY ۡ
-vn3"p#FiwQ)FЗyx
rX94=]N+C
NaXSo`rA6IKp `~|JQH֒ǑX ڱO)NsT)WX 0uavr`wlwp_P CTШ43)wIlU/n9KS%X{3a[)cjGqxznD Rh/_l?ڵN]jpwM(.uL+9_-fT<KGf.4Z| K8* D
8sQĕI"GYaCw
_Sb|1T[XR?@ڥՋ_pUoR-xƗL7#+V(amj<Ҏ50xr
-AP
J֓/f٫ F0<;HGAQ0K#5`KPNAY
w
D',qЋ)V'~gb\dsw?wrz8ٶzeR-j"L`vND v^߇h-Ul[P26z}&m
,diw|q
=v-kIGQz |#T!B