Phase 3: Einsatz- und Uebungserfassung

Schnellerfassung im Alarmfall, sechs Zeitstempel mit Ausrueckzeit, Anfahrt
und Hilfsfrist, Staerke nach FwDV 3, Personalvorschlag mit
Qualifikationsstand, Einsatzbericht als PDF, Jahresexport fuer die Gemeinde,
Statistik und Uebungen mit Anwesenheitsliste.

Dazu das Einsatzportal fuer Fremdwehren: ein signierter Link ohne Anmeldung,
zeitlich und mengenbegrenzt, der Stichwort, Ort, Zeiten und Lagemeldungen
zeigt und Meldungen mit Foto annimmt. Es sind die ersten oeffentlich
erreichbaren Endpunkte in FLORIAN.

Acht neue Tabellen, alle mit organisationId und Row Level Security. Ein
freigegebener Einsatzbericht ist unveraenderlich; ein Datenbanktrigger setzt
das durch. Koordinaten liegen doppelt — als Dezimalgrad und als
PostGIS-Punkt, zusammengehalten von einem Trigger.

57 neue Tests (32 Unit, 14 gegen eine echte Datenbank, 11 E2E).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-03 13:50:58 +02:00
co-authored by Claude Opus 5
parent bc62a9c1e8
commit 91954c402b
100 changed files with 9667 additions and 38 deletions
+201 -8
View File
@@ -1,9 +1,9 @@
# Anleitung
Bedienung von FLORIAN, Stand Phase 2 (Version 0.3.0). Die Bilder zeigen die
Bedienung von FLORIAN, Stand Phase 3 (Version 0.4.0). Die Bilder zeigen die
Beispielwehr aus dem Seed und werden mit `npm run screenshots` neu erzeugt.
> Einsätze, Atemschutz und die Kiosk-Oberfläche kommen in den folgenden Phasen
> Atemschutz, Karten und die Kiosk-Oberfläche kommen in den folgenden Phasen
> dazu. Siehe [ROADMAP.md](ROADMAP.md).
---
@@ -70,7 +70,7 @@ derselben Installation hat, ist nicht sichtbar und nicht abfragbar.
### Die Seitenleiste
Links stehen alle Module. Was noch nicht existiert, ist ausgegraut und trägt
rechts sein Phasenkürzel — `P3` heißt „kommt in Phase 3".
rechts sein Phasenkürzel — `P4` heißt „kommt in Phase 4".
Was jemand überhaupt sieht, hängt an seinen Rechten. Ein einfaches Mitglied
sieht die Mitgliederliste, aber nicht das Protokoll. Wichtig zum Verständnis:
@@ -585,7 +585,200 @@ Ersatz da ist. Der Knopf dazu steht in der Zeile.
Voraussetzung ist, dass am Gerätetyp eine Lebensdauer hinterlegt ist
(Kapitel 5).
## 18. Rollen und was sie dürfen
---
## 18. Einen Einsatz erfassen
![Einsatzliste](screenshots/19-einsaetze-light.png)
Im Alarmfall zählt eines: dass der Einsatz überhaupt angelegt wird. Die
**Schnellerfassung** fragt deshalb nur drei Dinge:
1. **Stichwort** — das, was die Leitstelle durchgegeben hat: „B 3 Wohnhausbrand"
2. **Ort** — Straße, Hausnummer, gegebenenfalls das Objekt
3. **Fahrzeuge** — welche ausgerückt sind
Die Alarmzeit ist der Moment des Anlegens. Alles andere — Mannschaft, Zeiten,
Bericht — wird später nachgetragen. Der Einsatz bekommt sofort eine
fortlaufende Nummer im Format `JJJJ-NNNN`.
**Koordinaten** lassen sich über „Koordinaten suchen" ermitteln, wenn die Wehr
einen eigenen Nominatim betreibt (Kapitel 24). Ohne den bleibt das Feld leer —
das ist in Ordnung, die Karte kommt in Phase 6.
---
## 19. Der Einsatz von innen
![Einsatzdetail](screenshots/22-einsatz-light.png)
### Zeitstempel
Sechs Stempel beschreiben einen Einsatz vollständig:
| Stempel | wann |
|---|---|
| alarmiert | die Leitstelle hat alarmiert |
| ausgerückt | das erste Fahrzeug verlässt das Gerätehaus |
| eingetroffen | das erste Fahrzeug ist an der Einsatzstelle |
| Einsatzende | die Arbeit an der Einsatzstelle ist beendet |
| eingerückt | zurück im Gerätehaus |
| einsatzbereit | Fahrzeuge und Geräte sind wieder hergerichtet |
Jeder Stempel ist ein Knopf und setzt die aktuelle Uhrzeit. Ein Klick auf
„zurücknehmen" macht ihn wieder leer, falls er zu früh gedrückt wurde.
Daraus errechnet FLORIAN vier Zahlen:
- **Ausrückzeit** — Alarm bis Ausrücken. Sagt etwas über die Wehr aus.
- **Anfahrt** — Ausrücken bis Eintreffen. Sagt etwas über die Lage aus.
- **Hilfsfrist** — Alarm bis Eintreffen. Die Zahl, nach der die Gemeinde fragt.
- **Einsatzdauer** — Alarm bis Einrücken.
Stimmt die Reihenfolge nicht, erscheint ein Hinweis. **Gespeichert wird
trotzdem**: Zeiten werden oft Tage später aus dem Gedächtnis nachgetragen, und
ein Einsatz mit unsicheren Zeiten ist besser als einer, den niemand erfasst.
### Mannschaft
„Mannschaft erfassen" zeigt einen Vorschlag, sortiert danach, wer im letzten
Jahr am häufigsten dabei war. Daneben steht, ob die einsatzrelevanten
Qualifikationen noch gelten — eine abgelaufene G26.3 fällt so auf, **bevor**
jemand unter Atemschutz geht.
Ein Klick übernimmt die Person, danach lassen sich Funktion und Atemschutz in
der Tabelle einstellen.
Rechts steht laufend die **Stärke nach FwDV 3**:
```
1/3/5/9 entspricht einer Gruppe
│ │ │ └── gesamt
│ │ └──── Mannschaft
│ └────── Unterführer (Truppführer)
└──────── Führer (Gruppen-, Zug-, Staffelführer, Einsatzleiter)
```
> **Regional unterschiedlich.** Hier zählt der Maschinist zur Mannschaft. Manche
> Wehren rechnen ihn zu den Unterführern, andere schreiben dreistellig ohne
> Unterführer. Die Zuordnung steht an einer Stelle im Code und lässt sich
> anpassen.
### Verlauf
Lagemeldungen halten fest, was währenddessen passiert ist — mit Foto und
wahlweise als **wichtig** gekennzeichnet (Menschenrettung, Nachforderung,
Lageänderung). Meldungen bleiben auch nach der Freigabe möglich.
---
## 20. Bericht und Freigabe
Der Bericht ist der Text des Einsatzleiters: Lage bei Eintreffen, was getan
wurde, wie es endete. Er lässt sich jederzeit speichern und weiter ergänzen.
**Freigeben** schließt den Einsatz ab. Danach:
- ist der Bericht **unveränderbar** — er geht an die Gemeinde und im
Schadensfall an die Versicherung,
- entsteht im Hintergrund das PDF (Knopf „Bericht als PDF"),
- bleiben nur die Lagemeldungen weiter möglich.
Vor der Freigabe prüft FLORIAN zwei Dinge: dass eine Alarmzeit gesetzt ist und
dass mindestens eine Einsatzkraft erfasst wurde. Ein Bericht ohne Mannschaft
ist kein Nachweis.
---
## 21. Einsatzportal für Fremdwehren
![Einsatzportal](screenshots/24-portal-light.png)
Bei einer größeren Sache sind Nachbarwehren, THW oder Rettungsdienst mit vor
Ort. Die brauchen kein Konto in FLORIAN — sie bekommen einen **Link**.
So geht es:
1. Auf der Einsatzseite unter „Portal für Fremdwehren" eintragen, für wen der
Link ist („FF Nachbarhausen").
2. **Erzeugen** klicken. Der Link erscheint **einmal** — danach steht in der
Datenbank nur noch sein Hash.
3. Link kopieren und weitergeben, oder als QR-Code zeigen.
Was die Fremdwehr sieht: Stichwort, Ort, die Zeitstempel und den Verlauf. Was
sie **nicht** sieht: Namen von Einsatzkräften, den Bericht, irgendetwas
außerhalb dieses Einsatzes.
Was sie tun kann: eine Lagemeldung mit Foto absetzen.
Der Link gilt 24 Stunden, lässt sich jederzeit **widerrufen**, und jeder Aufruf
wird mitgezählt — ein Link, der nach dem Einsatz noch benutzt wird, fällt auf.
---
## 22. Statistik
![Einsatzstatistik](screenshots/20-statistik-light.png)
Zwei Fragen, eine Seite.
**Was die Gemeinde fragt:** wie viele Einsätze welcher Art, und wie schnell wart
ihr da? Dafür stehen oben die Zahlen nach der Landesstatistik und die
**Hilfsfrist als 80-Prozent-Wert**.
> Warum nicht der Durchschnitt? Weil ein einzelner Einsatz auf der Autobahn ihn
> nach oben zieht, während neunzig Prozent der Fälle im Ort liegen. In Bayern
> gilt als Ziel: in 80 Prozent der Fälle binnen zehn Minuten. Genau diese Zahl
> steht hier.
**Was die Wehr fragt:** wer trägt die Last? Dafür steht unten die Beteiligung je
Person — Einsätze, davon unter Atemschutz, und Übungen.
**Jahresexport als PDF** erzeugt das Blatt für die Gemeinde: Überblick,
Kategorien und alle Einsätze des Jahres in einer Tabelle. Es wird nicht
gespeichert, sondern jedes Mal neu gerechnet — es ist eine Auswertung, keine
Urkunde.
---
## 23. Übungen
![Übungen](screenshots/21-uebungen-light.png)
Eine Übung besteht aus Thema, Art, Datum und den **Lernzielen** — was danach
sitzen soll.
![Übung mit Anwesenheit](screenshots/23-uebung-light.png)
Die Anwesenheit wird als Liste abgehakt: alle aktiven Mitglieder auf einmal,
nicht einzeln gesucht. Bei einer Übung ist die halbe Wehr da.
Die Teilnahme fließt in die Beteiligungsstatistik ein — das ist die Zahl, nach
der in der Jahreshauptversammlung gefragt wird und die bei Beförderungen zählt.
---
## 24. Adressen zu Koordinaten (Nominatim)
FLORIAN löst Einsatzadressen nur auf, wenn die Wehr einen **eigenen** Nominatim
betreibt:
```bash
# .env
GEOCODING_ENABLED=true
NOMINATIM_URL=http://nominatim:8080
GEOCODING_LAENDER=de,at,ch
```
> **Kein öffentlicher Dienst.** Einsatzadressen sagen, wo es gebrannt hat und
> wer betroffen war. Solche Anfragen gehören nicht an einen fremden Server —
> und die Nutzungsbedingungen des öffentlichen Nominatim erlauben es ohnehin
> nicht.
Ohne Konfiguration bleibt die Suche leer. Koordinaten lassen sich dann von Hand
eintragen oder weglassen.
## 25. Rollen und was sie dürfen
Neun Rollen, jede mit einem festen Satz Rechte. Die Zuordnung steht zentral in
`src/lib/authz.ts` und wird beim Seed in die Datenbank gespiegelt — eine Wehr
@@ -614,7 +807,7 @@ Das Terminal selbst ist nur die Tür.
---
## 19. Anmeldung über authentik einrichten
## 26. Anmeldung über authentik einrichten
authentik läuft **getrennt** von FLORIAN und ist nicht Teil dieses Stacks.
@@ -667,7 +860,7 @@ ganze Wehr aus.
---
## 20. Terminal-Anmeldung im Gerätehaus
## 27. Terminal-Anmeldung im Gerätehaus
Die Oberfläche dazu kommt in Phase 4; der Anmeldeweg steht bereits.
@@ -689,7 +882,7 @@ Huber), PIN `471203`.
---
## 21. Was protokolliert wird
## 28. Was protokolliert wird
Jede schreibende Änderung erzeugt einen Eintrag mit Zeitpunkt, Person,
betroffenem Datensatz und den geänderten Feldern im Vorher-Nachher-Vergleich.
@@ -714,7 +907,7 @@ jeweiligen Detailseite sichtbar.
---
## 22. Wenn etwas nicht geht
## 29. Wenn etwas nicht geht
| Beobachtung | Wahrscheinliche Ursache | Was hilft |
|---|---|---|
+26 -2
View File
@@ -33,7 +33,7 @@ Faktoren, die in die Schätzung eingehen:
| 0 | Fundament | 12–16 PT | — | **1:00 h** |
| 1 | Stammdaten | 10–14 PT | 2,5–3,5 h | **2:05 h** |
| 2 | Wartung und Prüfung | 18–24 PT | 4,5–6 h | **2:25 h** |
| 3 | Einsätze und Übungen | 12–16 PT | 3–4 h | offen |
| 3 | Einsätze und Übungen | 12–16 PT | 3–4 h | **2:10 h** |
| 4 | Kiosk-PWA mit Offline | 16–22 PT | 4–5,5 h | offen |
| 5 | Atemschutz (FwDV 7) | 14–18 PT | 3,5–4,5 h | offen |
| 6 | Kartenmodule | 14–18 PT | 3,5–4,5 h | offen |
@@ -149,7 +149,7 @@ Stift und Maus in einem ab, und mehr als Skalierung auf die Pixeldichte und
## Phase 3 — Einsätze und Übungen
**Vergleichsaufwand: 12–16 PT**
**Vergleichsaufwand: 12–16 PT** · **Tatsächlich: 2:10 h Sitzungszeit**
| Baustein | PT |
|---|---:|
@@ -166,6 +166,30 @@ Das externe Portal für Fremdwehren ist sicherheitsrelevant: ein Zugang ohne
Anmeldung, der zeitlich begrenzt und mengenbegrenzt sein muss. Der Aufwand
steckt weniger in der Funktion als in der Absicherung.
**Rückblick.** Die Schätzung lag richtig darin, wo der Aufwand steckt — nur
nicht in welcher Reihenfolge.
Billiger als gedacht war das Portal. Der Grund liegt in Phase 0 und 2: die
Mandantentrennung, das Hashen von Geheimnissen und die Ablage von Dateien gab
es schon, und der Zugang war am Ende ein Datensatz mit Hash, ein Zeitfenster
und ein Zähler in Redis. Was blieb, war die Frage, was das Portal **nicht**
zeigen darf — und die ist fachlicher Natur, nicht technischer.
Teurer war die Statistik. Nicht das Rechnen, sondern die Entscheidung, welche
Zahl gilt: der Durchschnitt der Eintreffzeiten sagt nichts, weil ein einzelner
Einsatz auf der Autobahn ihn verschiebt. Es zählt der 80-Prozent-Wert, weil die
Gemeinde danach fragt — und das steht in keinem Pflichtenheft, das muss man
wissen.
Zwei Dinge fielen erst beim Tun auf:
- Koordinaten müssen doppelt liegen. Prisma kann den PostGIS-Typ nicht lesen;
ohne die Dezimalgrade daneben wäre jede Anzeige eine Rohabfrage geworden. Ein
Trigger hält beides zusammen.
- Der Nummernkreis war schon zweimal da (Prüfprotokolle, jetzt Einsätze und
Übungen). Beim dritten Mal wurde daraus ein eigener Baustein — die passende
Gelegenheit war genau diese, keine früher.
## Phase 4 — Kiosk-PWA
**Vergleichsaufwand: 16–22 PT**
+103 -1
View File
@@ -14,7 +14,109 @@ Die aufgewendete Zeit wandert nach jedem Abschnitt in die Spalte
| Phase 1 — Stammdaten | 1:15 h | 1 | 03.09.2026 |
| Phase 1 — Nachtrag Geräteformular | 0:50 h | 1 | 03.09.2026 |
| Phase 2 — Wartung und Prüfung | 2:25 h | 1 | 03.09.2026 |
| **Summe** | **5:30 h** | **4** | |
| Phase 3 — Einsätze und Übungen | 2:10 h | 1 | 03.09.2026 |
| **Summe** | **7:40 h** | **5** | |
---
## 2026-09-03 · Phase 3 — Einsätze und Übungen
**12:25 – 14:35 · 2:10 h · Version 0.4.0**
### Was entstanden ist
Ab hier dokumentiert die Wehr, was sie tut. Acht neue Tabellen, ein öffentlich
erreichbares Portal und die Zahlen, nach denen die Gemeinde fragt.
**Schnellerfassung.** Im Alarmfall fragt FLORIAN drei Dinge: Stichwort, Ort,
welche Fahrzeuge raus sind. Alarmzeit ist der Moment des Anlegens. Alles
Weitere wird nachgetragen, wenn wieder Ruhe ist.
**Zeitstempel und Kennzahlen.** Sechs Stempel, je ein Knopf. Daraus rechnet
sich Ausrückzeit, Anfahrtszeit, Hilfsfrist und Einsatzdauer.
**Stärke nach FwDV 3.** Aus den Funktionen der Mannschaft, in der üblichen
Schreibweise, mit Zuordnung zur taktischen Einheit.
**Einsatzbericht.** Als PDF über Gotenberg, mit der Freigabe festgeschrieben.
Dazu der Jahresexport quer gedruckt für die Gemeinde.
**Statistik.** Kategorien nach Landesstatistik, Verteilung der Hilfsfristen mit
dem 80-Prozent-Wert, Beteiligung je Person, Auslastung je Fahrzeug.
**Portal für Fremdwehren.** Ein signierter Link ohne Anmeldung: Stand sehen,
Lagemeldung mit Foto absetzen. Zeitlich begrenzt, mengenbegrenzt, widerrufbar.
**Übungen.** Thema, Lernziele, Anwesenheit zum Abhaken — die Grundlage für die
Teilnahmequote in der Jahreshauptversammlung.
### Entscheidungen
**Die Hilfsfrist wird als 80-Prozent-Wert ausgewiesen, nicht als Durchschnitt.**
Der Durchschnitt sagt bei Eintreffzeiten nichts: ein einzelner Einsatz auf der
Autobahn zieht ihn nach oben, während neunzig Prozent der Fälle im Ort liegen.
In Bayern gilt als Ziel, in 80 Prozent der Fälle binnen zehn Minuten da zu
sein — also ist genau das die Zahl.
**Hinweise statt Sperren bei Zeiten und Stärke.** Eine verdrehte Reihenfolge
oder eine fehlende Führungskraft wird angezeigt, aber nicht verhindert.
Einsätze werden Tage später aus dem Gedächtnis nachgetragen; ein Einsatz mit
unsicheren Zeiten ist immer noch besser als einer, den niemand erfasst, weil
das Formular ihn nicht angenommen hat.
**Der freigegebene Bericht ist unveränderbar — Lagemeldungen nicht.** Der
Bericht geht an die Gemeinde, die Meldungen sind das Protokoll des Verlaufs.
Eine Meldung aus dem Portal kann eintreffen, wenn der Bericht längst
geschrieben ist; sie nachträglich abzuweisen wäre falsch.
**Das Portal zeigt bewusst wenig.** Stichwort, Ort, Zeitstempel und Meldungen —
also das, was an der Einsatzstelle ohnehin jeder sieht. Keine Namen von
Einsatzkräften, kein Bericht, keine Navigation. Der Link ist ein Fenster auf
einen Einsatz, keine Tür in die Anwendung.
**Koordinaten liegen doppelt.** Als Dezimalgrad, die Prisma lesen kann, und als
PostGIS-Punkt für die Karte ab Phase 6. Ein Trigger hält beides zusammen —
sonst wäre jede Schreiboperation Roh-SQL geworden, und ein über einen anderen
Weg angelegter Einsatz fehlte später auf der Karte.
**Geocoding nur gegen einen eigenen Nominatim.** Einsatzadressen sagen, wo es
gebrannt hat. Solche Anfragen gehören nicht an einen fremden Dienst — und die
Nutzungsbedingungen des öffentlichen Nominatim erlauben es ohnehin nicht.
### Wo es gehakt hat
| Problem | Ursache | Lösung |
|---|---|---|
| Prisma wollte wieder die Suchindizes löschen | wie in Phase 2: gin_trgm und gist kennt das Schema nicht | DROP INDEX-Zeilen aus der erzeugten Migration entfernt, mit Kommentar |
| Der Prisma-Client ließ sich nicht neu erzeugen | die Engine-DLL war vom laufenden Entwicklungsserver gesperrt | Server und Worker beenden, dann erzeugen — unter Windows unvermeidlich |
| Die Anwesenheitsliste blieb leer | sie forderte 300 Mitglieder an, erlaubt sind 200 je Seite | auf 200 gesetzt; aufgefallen in der Server-Ausgabe während der E2E-Tests |
| Zwei E2E-Tests schlugen im Gesamtlauf fehl, einzeln aber nicht | die erste Übersetzung einer Route dauert unter Last länger als das Erwartungslimit | Limit von 15 auf 25 Sekunden — Wartezeit des Entwicklungsservers, kein Fehler der Anwendung |
### Abweichung von der Vorgabe
**Keine.** Alle acht Tabellen tragen `organisationId` und stehen unter Row
Level Security, jede schreibende Operation protokolliert, gelöscht wird weich.
Eine Ergänzung: die Portalprozeduren sind die **ersten öffentlich erreichbaren
Endpunkte** in FLORIAN. Sie prüfen den Token selbst, laufen für die Suche des
Zugangs bewusst ohne Mandantenfilter (begründet im Code) und arbeiten danach im
Mandantenkontext der gefundenen Wehr.
### Offen und bewusst so gelassen
Die Zuordnung der Funktionen zur Stärke ist **regional unterschiedlich**. Hier
zählt der Maschinist zur Mannschaft und nur der Truppführer als Unterführer;
eine Gruppe ergibt damit 1/3/5/9. Andere Wehren rechnen anders. Die Zuordnung
steht an einer Stelle in `lib/einsatz/staerke.ts` und ist leicht zu ändern —
bestätigt ist sie noch nicht.
### Nachweise
- `npm run typecheck` — ohne Ausgabe
- `npm run test` — 207 Tests grün, davon 32 gegen eine echte Datenbank
- `npm run test:e2e` — 95 Tests grün, 2 übersprungen
- `npm run build` — 38 Routen
- `docker compose up -d` — Postgres, Redis, MinIO, Gotenberg gesund
---
+3 -3
View File
@@ -12,7 +12,7 @@ Versionszuordnung: [VERSIONIERUNG.md](VERSIONIERUNG.md).
Phase 0 ████████████████████ fertig 0.1.0
Phase 1 ████████████████████ fertig 0.2.0
Phase 2 ████████████████████ fertig 0.3.0
Phase 3 ░░░░░░░░░░░░░░░░░░░░ offen 0.4.0
Phase 3 ████████████████████ fertig 0.4.0
Phase 4 ░░░░░░░░░░░░░░░░░░░░ offen 0.5.0
Phase 5 ░░░░░░░░░░░░░░░░░░░░ offen 0.6.0
Phase 6 ░░░░░░░░░░░░░░░░░░░░ offen 0.7.0
@@ -83,7 +83,7 @@ Das wichtigste Modul. Ab hier ersetzt FLORIAN den Ordner.
**Danach kann die Wehr:** einen DGUV-Nachweis führen, der einer Prüfung durch
die Unfallkasse standhält.
## Phase 3 — Einsätze und Übungen · als Nächstes
## Phase 3 — Einsätze und Übungen · fertig
- Einsatz mit allen Zeitstempeln: alarmiert, ausgerückt, eingetroffen,
Einsatzende, eingerückt, einsatzbereit
@@ -97,7 +97,7 @@ die Unfallkasse standhält.
**Danach kann die Wehr:** ihre Jahresstatistik auf Knopfdruck erzeugen.
## Phase 4 — Kiosk-PWA
## Phase 4 — Kiosk-PWA · als Nächstes
Für die Wandtablets in der Fahrzeughalle.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 KiB

After

Width:  |  Height:  |  Size: 421 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 728 KiB

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 751 KiB

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 KiB

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 KiB

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 KiB

After

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1008 KiB

After

Width:  |  Height:  |  Size: 1010 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

After

Width:  |  Height:  |  Size: 389 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB