Taking the contents from the dev branch

This commit is contained in:
Jürgen Edelbluth 2024-04-13 11:18:40 +02:00
parent 3271ed39df
commit 46a9e433b4
Signed by: jed
GPG Key ID: 6DEAEDD5CDB646DF
61 changed files with 1586 additions and 0 deletions

32
.ci/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,32 @@
pipeline {
agent any
stages {
stage('Installation') {
steps {
sh 'python3.11 -m venv .venv'
sh '(source .venv/bin/activate; pip install -r requirements.txt)'
}
}
stage('Build Docs') {
steps {
sh '(source .venv/bin/activate; mkdocs build)'
}
}
}
post {
success {
deleteDir()
}
always {
withCredentials([string(credentialsId: 'solawi-suite-notification-email', variable: 'EMAIL')]) {
mail to: '$EMAIL',
subject: "[${currentBuild.fullDisplayName}] ${currentBuild.currentResult}",
body: "Duration: ${currentBuild.durationString} / Jenkins URL: ${env.BUILD_URL}"
}
}
}
}

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
site/
.cache/
venv/
.venv/
.DS_Store/

3
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

8
.idea/documentation.iml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/documentation.iml" filepath="$PROJECT_DIR$/.idea/documentation.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -1,2 +1,8 @@
# Handbuch Solawi Suite
```bash
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
mkdocs serve
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

94
docs/account/login.md Normal file
View File

@ -0,0 +1,94 @@
# Login
![Login-Maske](login-screen.webp)
Es gibt zwei Möglichkeiten, sich an der [solawi-suite] anzumelden:
1. Standardmäßig per Benutzername/Kennwort und zweitem Faktor (TOTP[^1]) — das sind die Daten, die du bei der
[Registrierung](../registration/index.md) angegeben hast.
2. Die Anmeldung per Passkey — dazu musst du jedoch bereits einen Passkey hinterlegt haben. Wie das geht, erklären wir
dir [hier](self-service.md#passkeys-verwalten).
## Anmeldung per Benutzername/Kennwort und zweitem Faktor
Nach der Eingabe von Benutzername und Kennwort wirst du zur Eingabe des Einmalpassworts aufgefordert. Bitte beachte: Ein
Einmalpasswort kann nur ein einziges Mal verwendet werden.
### Passwort vergessen?
Du kannst die Funktion "Passwort vergessen" nutzen, die du direkt beim Login-Formular siehst.
!["Passwort vergessen"-Link](forgot-password-link.webp)
Nach Eingabe deiner E-Mail-Adresse erhältst du eine E-Mail mit weiteren Instruktionen.
!["Passwort vergessen"-Formular](forgot-password-form.webp)
!!! tip "Begrenzte Gültigkeit"
Die Informationen aus der E-Mail haben nur eine begrenzte Gültigkeit. Während diese jedoch noch nicht abgelaufen
ist, ist es nicht möglich, erneut Anweisungen anzufordern.
Wenn du weitere Unterstützung brauchst, [kontaktiere uns einfach](/ui/contact).
### TOTP-Generator / Geheimnis / Konfiguration verloren?
Hier kannst du einen deiner Notfallcodes verwenden. Das sind einmalig verwendbare Codes, die du dir selbst erzeugen
kannst. Damit du im Notfall auch welche zur Verfügung hast, warnt dich das System, wenn die Codes knapp werden.
Um einen Notfallcode zu verwenden, klicke einfach unterhalb des TOTP-Einmal-Passwort-Feldes auf den entsprechenden Link.
![Login mit Notfallcode](forgot-otp-secret-link.webp)
!!! tip "Groß-/Kleinschreibung beachten"
Notfallcodes sind in der Datenbank wie Passwörter gespeichert. Achte daher bei der Eingabe auf Groß- und
Kleinschreibung, da nur so ein Vergleich erfolgreich sein kann.
Nach erfolgreichem Login solltest du den verwendeten Code von deiner Liste streichen.
_Siehe auch: [:octicons-arrow-right-24: Notfallcodes erneuern](self-service.md#notfallcodes-erneuern)._
## Anmeldung per Passkey
Wenn du bereits einen Passkey ([wie hier beschrieben](self-service.md#passkeys-verwalten)) erstellt hast, kannst du die
komfortabelst Art der Anmeldung verwenden. Klicke einfach auf die Schaltfläche:
![Mit Passkey-Login beginnen](init-passkey-login.webp)
Je nach Betriebssystem/Browser/App wirst du nun gebeten, den passenden Passkey auszuwählen und freizugeben:
![Passkey-Auswahl](passkey-select.webp)
Danach bist du bereits angemeldet!
!!! info "Passkeys — gerätegebunden, synchronisiert, individuell?"
Manche synchronisieren ihre Passkeys mit einer Cloudlösung, andere nutzen auch dafür einen Passwortmanager. Wieder
andere erzeugen auf jedem Gerät, dass sie verwenden wollen, einen individuellen Schlüssel.
Alle Verfahren haben Vor- und Nachteile. Wir limitieren jedoch nicht die Anzahl der Passkeys, die du für dein
Benutzerkonto hinterlegst. Du kannst jederzeit entscheiden, welche deiner Passkeys gültig sind und kannst nicht
mehr benötigte Passkeys problemlos löschen.
Wenn dir kein Passkey mehr zur Verfügung steht, logge dich normal mit Benutzernamen, Kennwort und zweitem Faktor an
und erstelle einen neuen Passkey.
## Besonderheiten bei deinem ersten Login
Wenn du dich nach erfolgreicher Registrierung erstmals einloggst, wirst du zwei Warnungen sehen:
![Warnungen beim ersten Login](first-login.webp)
Damit du dein Konto sicher benutzen kannst, bitten wir dich, Notfallcodes (für den Fall, dass du keine TOTPs mehr zur
Verfügung hast) und einen Passkey zu erstellen. Du kannst beide Meldungen ignorieren und schließen, sie kommen aber
wieder.
Bei den Notfallcodes erhältst du zukünftig auch Warnungen, wenn die verfügbare Anzahl unter ein gewisses Minimum fällt.
[^1]: TOTP steht für "Time-based one-time password" und ist eine gängige Form für einen zweiten Faktor für die Anmeldung
an (Web-)Applikationen. Die Erzeugung ist standardisiert, so dass eine breite Auswahl an Apps und Tools für fast
jede Plattform zur Verfügung steht.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/Time-based_one-time_password).

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,95 @@
# Kontoverwaltung
Du findest die Funktionen des Kontoverwaltung (Selbst-Service) hier:
![Zugriff auf den Selbst-Service](self-service-access.webp)
Damit stehen dir diese Funktionen zur Verfügung:
![Selbst-Service Funktionen](self-service-tools.webp)
## Passkeys verwalten
### Was sind Passkeys?
Passkeys sind eine moderne, passwortlose Authentifizierungstechnologie. Sie sind eine Alternative zu gewöhnlichen
Passwörtern und vereinfachen dir den Zugang zur [solawi-suite].
!!! info inline end "Wichtig!"
Dein privater Schlüssel und deine (biometrischen) Daten, die du zur Entsperrung verwendest, bleiben sicher auf
deinem Gerät und werden zu keinem Zeitpunkt an unsere Server übermittelt.
Ein Passkey besteht aus zwei Teilen: Einem individuellen öffentlichen Schlüssel, den wir auf unseren Servern speichern,
und dem dazugehörigen privaten Schlüssel, der sicher verwahrt auf deinem Gerät verbleibt. Wenn du dich anmeldest prüfen
wir anhand einer einmaligen "Challenge" — einem langen Zufallscode, der dein Gerät mit deinem privaten Schlüssel
signiert, ob eben dieser privater Schlüssel zu dem öffentlichen Schlüssel passt, den wir von dir kennen.
Für diese Prüfung wirst du gegebenenfalls aufgefordert, dein Gerät oder deinen Zugangsdatenspeicher zu entsperren, z. B.
mittels Fingerabruck, Gesichtsscan oder auch einer PIN. Der Rest der Prozedur verläuft vollautomatisch und dauert nur
wenige Sekunden.
!!! warning "Kompatibles Gerät / kompatibler Browser benötigt"
Für die Verwendung von Passkeys benötigst du ein kompatibles Endgerät. Moderne Mobilgeräte, Browser aller großen
Hersteller und wichtigsten Betriebssysteme sind heute für die Verwendung von Passkeys geeignet.
### Neuen Passkey anlegen
Die Erzeugung eines neuen Passkeys ist mit nur wenigen Schritten erledigt. Klicke auf die folgende Schaltfläche:
![Neuen Passkey erstellen](new-passkey-button.webp)
Je nach Gerät bzw. Browser erscheint nun ein Dialog, der dich durch die erforderlichen Schritte zur Herstellung und
Speicherung deines Passkeys führt:
![Erstellung eines neuen Passkeys](new-passkey-generation.webp)
Wenn alles geklappt hat, hast du nun die Möglichkeit, deinem neuen Passkey einen Namen zu geben und seine Gültigkeit zu
definieren.
![Passkey-EInstellungen](passkey-settings.webp)
Das war's! Ab sofort kannst du dich [mit deinem Passkey anmelden](login.md#anmeldung-per-passkey).
!!! tip "Gerät nicht unterstützt?"
Wenn dein Geräte nicht direkt unterstützt wird, sollte versucht werden, dir eine Alternative unter Verwendung deines
Mobiltelefons oder eines Sicherheitssticks angeboten werden. So kannst du auch dann von den Vorteilen des Passkeys
profitieren.
Wenn du dich dann per Passkey anmelden möchstest, brauchst du natürlich wieder dein Mobiltelefon oder den
Sicherheitsstick.
![Alternatives System verwenden](passkey-alternative.webp)
## Passwort ändern
Hier kannst du dein Passwort ändern. Mit der erfolgreichen Änderung deines Passworts wirst du automatisch von allen
Sitzungen abgemeldet und musst dich neu einloggen.
## Einmal-Passwort-Geheimnis ändern
Hier kannst du ein neues Geheimnis bzw. eine neue Konfiguration für deine TOTP[^1]-App bzw. dein TOTP-Tool erhalten. Mit
der erfolgreichen Aktivierung wirst du automatisch von allen Sitzungen abgemeldet und musst dich erneut einloggen.
## Notfallcodes erneuern
Hier generierst du 10 neue Notfallcodes. Damit werden alle ggf. noch vorhandenen Notfallcodes ungültig. Da die neuen
Codes nur ein einziges Mal angezeigt werden, speichere sie direkt ab oder drucke sie aus.
Verwahre sie sorgfältig und sicher, damit niemand sonst Zugriff auf dein Konto erhalten kann.
## Abmelden (Logout)
Dies beendet deine aktuelle Sitzung.
## Von allen Sitzungen abmelden
Dies meldet dich von allen Sitzungen ab.
[^1]: TOTP steht für "Time-based one-time password" und ist eine gängige Form für einen zweiten Faktor für die Anmeldung
an (Web-)Applikationen. Die Erzeugung ist standardisiert, so dass eine breite Auswahl an Apps und Tools für fast
jede Plattform zur Verfügung steht.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/Time-based_one-time_password).

77
docs/index.md Normal file
View File

@ -0,0 +1,77 @@
# 🧑‍🌾 [solawi-suite] 🌾 Handbuch
!!! tip "Das Handbuch befindet sich noch im Aufbau."
Wir arbeiten immer wieder an diesem digitalen Handbuch. Aktuell gibt es mehr Lücken als Inhalt, das wird sich aber
im Laufe der Zeit noch ändern.
---
## Für Mitglieder
Dieser Teil richtet sich an Teilnehmer:innen von Veranstaltungen von SoLaWis, die die [solawi-suite] als Software
einsetzen.
<div class="grid cards" markdown>
- **[Digitales Gebot für Mitglieder](modules/bidding/members.md)**
---
Du sollst als Mitglied einer SoLaWi dein Gebot digital abgeben? Das ist ganz einfach. Wir erklären dir, wie das
funktioniert.
[:octicons-arrow-right-24: Digitales Gebot für Mitglieder](modules/bidding/members.md)
</div>
## Für Anwender der [solawi-suite]
Dieser Teil richtet sich an diejenigen, die mit der [solawi-suite]-Software Digitalisierungsaufgaben innerhalb ihrer
SoLaWis wahrnehmen.
<div class="grid cards" markdown>
- **[Registrierung](registration/index.md)**
---
Hier erklären wir dir, wie die Registrierung funktioniert.
[:octicons-arrow-right-24: Registrierung](registration/index.md)
- **[Login](account/login.md)**
---
Hier beschreiben wir, wie du dich anmelden kannst.
[:octicons-arrow-right-24: Login](account/login.md)
- **[Digitales Gebot](modules/bidding/index.md)**
---
Das "Digitale Gebot" ist unser erstes Modul. Hier erklären wir dir, wie du das Modul einsetzt und digitale Gebote
im Rahmen einer Veranstaltung abgeben lässt.
[:octicons-arrow-right-24: Digitales Gebot](modules/bidding/index.md)
- **[Beamer-Verbindung](modules/beamer/index.md)**
---
Mit dem Beamer-System kannst du verschiedene Ansichten auf entfernten Displays oder Beamern anzeigen, ohne dass dein
Rechner oder mobiles Endgerät damit verbunden sein muss.
[:octicons-arrow-right-24: Beamer-Verbindung](modules/beamer/index.md)
- **[Kontoverwaltung](account/self-service.md)**
---
Lerne die Funktionen kennen, mit denen du dein Benutzerkonto verwalten kannst.
[:octicons-arrow-right-24: Login](account/self-service.md)
</div>

View File

@ -0,0 +1,7 @@
# Modul: Abholgemeinschaft
!!! warning "Das Modul steht noch nicht zur Verfügung."
Das Modul "Abholgemeinschaft" ist noch nicht fertig und steht noch nicht zur Verfügung.
Die Dokumentation ist entsprechend auch noch nicht verfügbar.

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@ -0,0 +1,46 @@
# Modul: Beamer-Verbindung
Dieses Modul ermöglicht die Wiedergabe von Informationen auf anderen Geräten, die z. B. mit einem Beamer diese
Informationen projizieren.
## Grundaufbau
![Grundaufbau](connection-diagram.webp)
- Auf den an den Beamern angeschlossenen Geräten wird im Browser die Webseite
[https://solawi.me/beamer/](https://solawi.me/beamer/) aufgerufen. Hierfür ist kein Benutzerkonto erforderlich!
- Jedes Gerät erhält dabei eine individuelle Identifikationsnummer (Screen Code), die für die weitere Konfiguration
benötigt wird. Sie kann abgelesen werden, indem man mit der Maus über die kleine schwarze Leiste im Kopfbereich der
im Browser aufgerufenen Seite fährt:
![Screen Code](beamer-screen-code.webp)
- Mit einem Tastendruck auf `F` lässt sich das Bild im Browser auf "Vollbild" schalten. So wirkt es bei der Projektion
optimal.
- Ein:e eingeloggte:r Benutzer:in mit Zugriff auf das Beamer-Modul (z. B. die Veranstaltungsleitung oder ein
Teammitglied) kann nun den Screen Code hinzufügen. Dazu wird in der [solawi-suite] das Modul "Beamer-Verbindung"
ausgewählt. Im entsprechenden Eingabefeld wird die Identifikationsnummer eingetragen.
![Code hinzufügen](beamer-add-connection.webp)
- **Die Verbindung gilt nur für das Endgerät, auf dem der Screen Code erfasst wurde!** Ein Screen Code kann auf mehreren
Geräten von Teammitgliedern oder Veranstaltungsleiter:innen erfasst werden.
- Im Anschluss an die Erfassung steht die Verbindung zur Verfügung:
![Beamer-Liste](beamer-list.webp)
- Es können beliebig viele Verbindungen hinzugefügt werden.
- Es gibt folgende Optionen pro Verbindung:
- Sprechblase: Test-Nachricht senden und als Folie anzeigen
- Pfeil-Kreis: Zurücksetzen der Verbindung, Standard-Folie anzeigen
- Mülleimer: Verbindung trennen
!!! warning "Konfiguration wird nicht persistiert!"
Die verbundenen Anzeigen werden nicht in der Datenbank persistiert und stehen nur so lange zur Verfügung, bis die
jeweilige Sitzung des jeweiligen Teammitglieds oder Veranstaltungsleitung geschlossen wird, z. B. durch Logout.
In verschiedenen Anwendungen gibt es Schaltflächen, mit denen sich ein Status oder eine Folie zum Kontext passend an
alle verbundenen Anzeigen übermittelt werden kann. Diese Schaltflächen sehen üblicherweise so aus:
![Beamer-Button](beamer-button.webp)

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -0,0 +1,425 @@
# Modul: Digitales Gebot
Die Gebotsrunden für den monatlichen Solidarbeitrags für ein Wirtschaftsjahr sind anstrengend und zeitraubend. Manuelle
Auszählungen sind fehleranfällig und müssen mehrfach kontrolliert werden
Dieses Modul ermöglicht die digitale interaktive Erfassung von Geboten, beispielsweise während einer Hauptversammlung.
So sind Gebotsrunden innerhalb weniger Minuten durchführbar und die Ergebnisse stehen nach Sekunden fest. Entsprechende
Reports ermöglichen Orga-Teams und Finanz-AKs eine zügige Weiterverarbeitung.
!!! info "Für Mitglieder von Orga- und Finanzteams"
Die nachfolgende Dokumentation richtet sich an die Mitglieder von Orga- oder Finanzteams, die Gebotsrunden
organisieren und dazu ein Benutzerkonto für die [solawi-suite] haben.
Mitglieder, die Gebote abgeben wollen, benötigen kein Benutzerkonto. Für die Verwendung des Moduls aus Sicht
gebotsabgebender Mitglieder [gibt es eine eigenständige Dokumentation](members.md).
## Begriffserklärung
Ereignis
: Ein Ereignis ist eine Veranstaltung, auf der Gebote abgegeben werden sollen. Das kann beispielsweise eine
Jahreshauptversammlung oder eine Gründungsveranstaltung sein.
Ereignis-PIN
: Zahlencode, mit dem bei einem Ereignis ein Gebot abgegeben werden kann.
Anteil
: Ein Anteil bezeichnet den Ernteanteil, für den ein Gebot abgegeben werden soll.
Anteils-ID
: Kennung eines Anteils, mit dem ein Gebot zugeordnet wird.
Anteils-PIN
: Zahlencode, mit dem ein Gebot für einen spezifischen Anteil abgegeben werden kann.
Gebotsrunde
: In einer Runde werden Gebote für alle Anteile eingesammelt.
Finanzplan
: Hier wird der Bedarf für ein Wirtschaftsjahr hinterlegt. Anhand des Finanzplans wird berechnet, ob eine Gebotsrunde
erfolgreich war oder nicht.
## Eigene Ereignisse
Mit "eigenen Ereignissen" sind all die Ereignisse gemeint, die mit dem eingeloggten Benutzerkonto angelegt und verwaltet
werden, oder solche Ereignisse, die mit der Funktion [Ereignis übertragen](#ereignis-an-anderen-besitzerin-übertragen)
an das aktuell eingeloggte Benutzerkonto übertragen wurden.
### Ereignis anlegen
Ein neues Ereignis kann im Reiter "Eigene Ereignisse" mit der grünen Schaltfläche "Neues Ereignis" angelegt werden.
![Schaltfläche "Neues Ereignis"](new-event.webp)
Für ein neues Ereignis können nun einige Informationen erfasst werden.
![Formular "Neues Ereignis"](new-event-form.webp)
Name
: Der Name des Ereignisses, z. B. "Jahreshauptversammlung 2024". Dieser Name wird an verschiedenen Stellen angezeigt,
unter anderem bei der Ausgabe auf Beamern oder in der Gebotsabgabemaske für Mitglieder. Auch die Auswertungen tragen
dies als Titel.
Aktiviert
: Wenn eingeschaltet, kann das Ereignis im Rahmen des angegebenen Zeitfensters für die Gebotsabgabe genutzt werden.
Aktiv ab
: Hier beginnt das Zeitfenster, in dem das Ereignis aktiv ist. Der Standardwert liegt weit in der Vergangenheit.
Aktiv bis
: Hier endet das Zeitfenster, in dem das Ereignis aktiv ist. Der Standardwert liegt weit in der Zukunft.
!!! tip "Kombination aus 'Aktiviert', 'Aktiv ab' und 'Aktiv bis'"
Damit ein Ereignis als "aktiv" gilt, müssen alle drei Bedingungen erfüllt sein:
- Die Option "Aktiviert" muss aktiv sein
- Der aktuelle Zeitpunkt muss nach dem "Aktiv ab"-Zeitpunkt liegen
- Der aktuelle Zeitpunkt muss vor dem "Aktiv bis"-Zeitpunkt liegen
!!! note "Bitte beachten"
Die Funktionen für Teammitglieder stehen nur dann zur Verfügung, wenn ein Ereignis aktiviert ist und man sich
innerhalb des angegebenen Zeitfensters befindet.
Alle Angaben können nachträglich bearbeitet werden.
### Ereignis aufrufen
Ereignisse können durch Klick auf den Namen in der Ereignis-Liste aufgerufen werden.
![Ereignis-Liste](open-event.webp)
### Ereignis-Optionen
![Ereignis-Optionen](event-header.webp)
Bei Ereignissen stehen folgende Optionen zur Verfügung:
An Beamer senden
: Hiermit wird eine virtuelle Folie an alle angeschlossenen Beamer gesendet, die Zugangsinformationen zum aktuellen
Ereignis enthält.
: ![Ereignis-Darstellung in der Beamer-Ansicht](event-beamer.webp)
Team verwalten
: Hier kann das Team verwaltet werden, welches an dem Ereignis mitarbeiten soll.
Bearbeiten
: Hier werden die Details, die schon bei der Anlage eines Ereignisses angegeben wurden, bearbeitet. Unter anderem kann
hier das Ereignis aktiviert, deaktiviert und umbenannt werden.
Übertragen
: Mit dieser Funktion kann man den Besitz des Ereignisses an eine:n andere:n Benutzer:in übertragen. Siehe dazu:
[:octicons-arrow-right-24: Ereignis übertragen](#ereignis-an-anderen-besitzerin-übertragen).
Archivieren
: Mit dieser Funktion wird das Ereignis mit allen gesammelten Daten, wie Anteilen, Geboten und Auswertungen, archiviert.
Nach der Archivierung kann das Ereignis nicht mehr bearbeitet werden. Es ist dann nur noch dem Besitzer möglich, die
Ergebnisdokumente abzurufen oder das Ereignis endgültig zu löschen.
Ereignis-PIN neu erstellen
: ![Ereignis-PIN neu erstellen](renew-event-pin.webp)
: Mit dieser Funktion wird eine neue Ereignis-PIN erzeugt.
!!! warning "Alle Zugangslinks werden ungültig!"
Wenn eine neue Ereignis-PIN erstellt wird, werden alle Direktzugangslinks ungültig. Dieser Vorgang lässt sich zudem
nicht rückgängig machen. Die Ereignis-PIN wird zufällig erstellt.
Zugangslinks anzeigen
: Mit dieser Funktion kann man sich Zugangsinformationen für das Ereignis anzeigen lassen, z. B. um sie Einladungen
hinzuzufügen.
: ![Zugangslinks](event-links.webp)
: Der Direktzugang ermöglicht die Gebotsabgabe ohne Eingabe der Ereignis-PIN.
!!! tip "Direkt-Link oder Zugang mit PIN?"
Der Vorteil am Zugang mit PIN liegt darin, dass der QR-Code deutlich weniger komplex ist und daher auch von größerer
Entfernung gut gescannt werden kann. Will oder kann man den QR-Code nicht verwenden, ist der aufzurufende Link sehr
kurz.
Der Direktzugangs-Link lässt sich praktisch nur bei elektronischen Einladungen verwenden.
### Finanzplan hinterlegen
![Widget "Finanzplan"](fiscal-plan-widget.webp)
Hier kann der Finanzierungsbedarf für das Wirtschaftsjahr festgelegt werden. Außerdem werden hier Regeln für die Abgabe
von Geboten definiert.
![Finanzplan](fiscal-plan.webp)
Benötigter Betrag
: Dies definiert den benötigten Gesamtbetrag für das Wirtschaftsjahr.
Monate
: Gibt an, wie viele Monate das Wirtschaftsjahr hat. Mit diesem Wert werden die monatlichen Gebote multipliziert, um den
Gesamtbetrag der Gebote zu ermitteln.
Minimalbetrag auf Basis des mittleren Solidarbeitrags
: Wenn größer als Null, definiert dieser Wert den Prozentsatz des mittleren Solidarbeitrags als Mindestgebot. Der
mittlere Solidarbeitrag wird natürlich auf die Anteilsgröße bezogen und berechnet sich aus dem Finanzierungsbedarfs
geteilt durch die Anteile.
Standardgebot auf Basis des mittleren Solidarbeitrags
: Wenn kein Gebot für einen Anteil während einer Runde abgegeben wurde und kein Vorabgebot vorlag, wird dieser Wert
herangezogen. Der mittlere Solidarbeitrag wird auch hier auf die Anteilsgröße bezogen.
Standardgebot auf Basis des Durchschnitts aller abgegebenen Gebote
: Wenn kein Gebot für einen Anteil während einer Runde abgegeben wurde und kein Vorabgebot vorlag, wird dieser Wert
herangezogen. Als Basis gilt der Durchschnitt aller abgegebenen Gebote. Der Wert wird auf die Anteilsgröße bezogen.
!!! info "Kumulative Berechnung des Standardgebots"
Wenn beide Angaben für das Standardgebot größer als Null sind, werden beide Beträge berechnet und addiert.
!!! note "Jeweils gültiger Finanzplan"
Eine Gebotsrunde wird immer auf Basis des jeweils zu Beginn der Runde hinterlegten Finanzplans durchgeführt und
ausgewertet.
Anteilswerte anzeigen
: Hier kann ausgewählt werden, welche Anteilsgrößen in diversen Ansichten ausgegeben werden. Selbstverständlich können
davon abweichende Anteilsgrößen bei der Anlage von Anteilen angegeben werden. Dies ist eine rein informative
Konfiguration.
### Anteile definieren
![Widget "Anteile"](shares-widget.webp)
Hier werden Anteile definiert, für die Gebote abgegeben werden können.
#### Anteil hinzufügen
Mit dieser Option kann ein Anteil hinzugefügt werden. Dazu müssen diese Informationen angegeben werden:
![Neuen Anteil anlegen](share-new.webp)
Anteils-ID
: Identifikation des Anteils, z. B. `0116b`. Mit dieser Identifikation muss sich der/die Besitzer:in für die
Gebotsabgabe anmelden.
Teiler
: Dies gibt die Anteilsgröße an. Ein Teiler von 1 steht dabei für einen ganzen Anteil, 2 für einen halben und 4 für
einen viertel Anteil.
Anteilseigner
: Name des/der Anteils-Besitzer:in. _Die Angabe ist optional_.
Anteilseigner E-Mail
: E-Mail-Adresse des/der Anteils-Besitzer:in. _Die Angabe ist optional_.
#### Anteilsliste importieren
Die manuelle Anlage von Anteilen ist unter Umständen sehr zeitaufwändig. Daher gibt es die Möglichkeit, eine ganze Liste
von Anteilen aus einer CSV[^csv]-Datei zu importieren.
Das hier verwendete Format entspricht dem Standard-Export-Format von Microsoft Excel:
- Zeichensatz: **UTF-8 (bevorzugt ohne BOM)**
- Zeilenenden: **`CFLF` (`\r\n`)**
- Feldtrenner: **`;`**
- keine Kopfzeile
- kein Quoting
- Escape-Zeichen: **`\ `**
Es werden vier Spalten erwartet:
| Spalte | Inhalt |
|:------:|---------------------------|
| A | Anteils-ID |
| B | Teiler |
| C | Anteilseigner |
| D | Anteilseinger E-Mail |
Dazu gibt es noch diese Optionen:
![Import-Optionen](share-import-options.webp)
Anteile mit gleicher ID überschreiben
: Wenn beim Import bereits vorhandene Anteile gefunden werden, werden diese mit den in der Import-Datei angegebenen
Werten überschrieben.
Fehler ignorieren
: Fehler einfach überspringen.
#### Anteilskärtchen drucken
Für die Abgabe von Geboten werden nicht nur die Anteils-IDs gebraucht, sondern auch eine PIN. Um die Verteilung dieser
Informationen bei einer Veranstaltung zu vereinfachen, können mit dieser Option Kärtchen erzeugt werden, die dem
Mitglied zum Beispiel beim Check-In für die Veranstaltung ausgehändigt werden können.
![Anteilskärtchen](share-cards.webp)
Die Karten liegen als PDF-Datei vor. Sie können direkt gedruckt oder für spätere Verwendung heruntergeladen werden.
#### Anteil bearbeiten oder löschen
Klickt man die ID eines Anteils in der Liste an, so kann der Anteil bearbeitet oder gelöscht werden.
![Anteil bearbeiten](share-edit.webp)
Die Angaben entsprechen den Angaben, die bei der Anlage gemacht wurden.
### Vorabgebote erfassen
Möglicherweise kann ein Mitglied nicht an der Veranstaltung teilnehmen und gibt vorab ein Gebot ab. Dies kann
entsprechend im System erfasst werden. Zur Liste der erfassten Vorabgebote kommt man über das entsprechende Widget:
![Gebote-Widget](pre-bid-widget.webp)
Für die Erfassung gelangt man über die grüne Schaltfläche "Vorabgebot hinzufügen". Dann sind diese Angaben erforderlich:
![Formular "Vorabgebot"](pre-bid-form.webp)
Anteils-ID
: Die ID des Anteils, für den das Vorabgebot abgegeben wird.
Gültig ab Runde
: Es ist grundsätzlich möglich, mehrere Vorabgebote für einen Anteil abzugeben. Diese Angabe definiert, ab welcher Runde
dieses Gebot gelten soll.
Fester Gebotsbetrag
: Angabe über die Höhe des Gebots auf monatlicher Basis.
Prozentsatz vom mittleren Solidarbeitrag
: Auf Basis der Anteilsgröße wird der angegebene Teil vom mittleren Solidarbeitrags bestimmt.
Prozentsatz vom Mittelwert aller abgegebenen Gebote
: Auf Basis der Anteilsgröße wird der angegebene Teil vom Durchschnitt aller abgegebenen Gebote berechnet.
!!! info "Kumulative Berechnung des Vorabgebots"
Das endgültige Gebot wird als Summe aus allen drei Komponenten "Fester Gebotsbetrag", "Prozentsatz vom mittleren
Solidarbeitrags" und "Prozentsagt vom Mittelwert aller abgegebenen Gebote" berechnet. "Genullte" Angaben werden
nicht berücksichtigt.
Soll beispielsweise nur ein fester Betrag verwendet werden, sind die beiden Prozentangaben auf Null zu setzen.
!!! warning "Vorabgebot unterhalb des Mindestgebots"
Liegt das während einer Runde berechnete Gebot aus dem Vorabgebot unter dem Mindestgebot aus dem Finanzplan, wird
das Vorabgebot automatisch bis zum Erreichen des Mindestgebots angehoben.
Ein entsprechender Ausweis ist im Bericht über die Runde zu sehen.
### Runde durchführen
Mit der Auswahl von "Runde starten" beginnt die Gebotsrunde. Nun kann sich jedes Mitglied anmelden und sein Gebot
abgeben _(siehe auch: [:octicons-arrow-right-24: Digitales Gebot für Mitglieder](members.md))_.
Die Gebotsabgabe ist so lange möglich, bis die Runde gestoppt wird. Dann erfolgt sogleich die Auswertung.
!!! info "Keine Änderungen während einer Runde"
Während eine Runde läuft, lassen sich keine Änderungen am Finanzplan, den Anteilen oder den Vorabgeboten vornehmen.
#### Ergebnisbericht erhalten
Mit dem Beenden der Runde wird das Ergebnis berechnet.
![Ergebnis](round-result.webp)
Man kann direkt erkennen, ob die Runde erfolgreich war oder nicht. Außerdem kann man direkt einen PDF-Bericht abrufen:
![Ergebnis-PDF](round-result-pdf.webp)
Auf den Folgeseiten enthält der Bericht detaillierte Informationen über die Zusammensetzung/Entstehung der jeweiligen
Gebote:
![Ergebnis-Detail](round-result-detail.webp)
Die PDF-Datei kann direkt heruntergeladen oder ausgedruckt werden.
!!! tip "Die Ergebnisse bleiben erhalten"
Die Ergebnisse der einzelnen Runden können jederzeit wieder abgerufen werden, solange das Ereignis nicht gelöscht
oder archiviert wurde.
### Ereignis an andere:n Besitzer:in übertragen
Mit dieser Funktion ist es möglich, das Ereignis an einen anderen Benutzer zu übertragen.
![Ereignis übertragen](transfer-event.webp)
Für die Übertragung können folgende Angaben gemacht werden:
E-Mail-Adresse
: Dies ist die E-Mail-Adresse des Benutzers, an den das Ereignis übertragen werden soll. Dieser Benutzer muss bereits
ein Konto besitzen und Zugriff auf das Modul "Digitales Gebot" haben.
Im Team verbleiben
: Setze diese Option, wenn du nach der Übertragung selbst im Team verbleiben möchtest. Anschließend kannst du noch die
Berechtigungen definieren, die du haben möchtest.
!!! tip "Berechtigungen liegen ab dann beim neuen Besitzer"
Der neue Besitzer kann natürlich deine Berechtigungen als Teammitglied wieder bearbeiten.
Aktiviert
: Legt fest, ob du ein aktives Teammitglied bist.
Aktiv ab / Aktiv bis
: Legt das Zeitfenster fest, in dem deine Teammitgliedschaft aktiv ist. Auch hier gilt: Alle drei Einstellungen
(Aktiviert, Aktiv ab, Aktiv bis) müssen passen, damit die Mitgliedschaft vom System als aktiv betrachtet wird.
Berechtigung: Vorabgebot erfassen
: Legt fest, ob du als Teammitglied Vorabgebote erfassen und bearbeiten darfst.
Berechtigung: Gebot erfassen
: Legt fest, ob du während laufender Gebotsrunden Gebote von Mitgliedern erfassen darfst, z. B. um ihnen zu helfen,
wenn die Erfassung über eigene Geräte nicht funktioniert.
Berechtigung: Runde starten
: Legt fest, ob du eine Gebotsrunde starten darfst.
Berechtigung: Runde beenden
: Legt fest, ob du eine Gebotsrunde beenden darfst.
Berechtigung: Auswertung abrufen
: Legt fest, ob du Zugriff auf die ausführlichen Ergebnisse einer Runde hast.
### Ereignis-Team verwalten
Um die Arbeit während einer Veranstaltung besser verteilen zu können, lässt sich ein Team aufbauen. Voraussetzungen für
potentielle Teammitglieder sind, dass sie über einen Benutzeraccount der [solawi-suite] und die Zugangsberechtigung für
das Modul "Digitales Gebot" verfügen.
#### Team-Mitglied hinzufügen
#### Team-Mitglieder verwalten
## Ereignisse im Team
### Gebote
#### Vorabgebote erfassen
#### Gebote erfassen
### Runden
### Ergebnisse
## Archivierte Ereignisse
Im Reiter "Archivierte Ereignisse" finden sich all die Ereignisse, die mit der Funktion "Archivieren" archiviert wurden.
Die Ereignisse können zwar nicht mehr bearbeitet werden, aber es ist möglich, die Runden-Ergebnisse abzurufen und die
Ereignisse mitsamt der Ergebnisse endgültig zu löschen.
![Archivierte Ergebnisse](archived-result-list.webp)
## Beamer-Funktionen
An verschiedenen Stellen gibt es die Möglichkeit, die vorliegenden Informationen an angeschlossene Beamer zu senden.
Dazu müssen Beamer verbunden sein. Mehr Details dazu: [:octicons-arrow-right-24: Beamer-Modul](../beamer/index.md).
[^csv]: CSV steht für "Comma-separated values" und beschreibt ein textbasiertes menschenlesbares Dateiformat für
tabellarische Daten. Viele Programme zur Tabellenkalkulation beherrschen CSV als Export-Format. Leider gibt es
keinen einheitlichen Standard zum Aufbau.
Weitere Informationen bei [Wikipedia](https://de.wikipedia.org/wiki/CSV_(Dateiformat)).

View File

@ -0,0 +1,117 @@
# Digitales Gebotsverfahren für Mitglieder
_Liebes Mitglied!_
Du bist eingeladen, im Rahmen einer Veranstaltung dein Gebot zur Finanzierung der SoLaWi _digital_ abzugeben. Früher
wurden die Gebote auf kleinen Zetteln während der entsprechenden Versammlungen eingesammelt und mühsam von Hand
ausgezählt um festzustellen, ob eine Bieterrunde bzw. Gebotsrunde erfolgreich war oder ob es eine weitere Runde geben
muss.
Das "Digitale Gebot" der [solawi-suite] von [solawi.me](https://solawi.me/) erleichtert diesen Prozess für alle
Beteiligten und automatisiert zeitraubende und fehleranfällige Auszählungen. Im folgenden erklären wir dir, wie die
digitale Gebotsabgabe funktioniert, was du dazu brauchst und wie du Unterstützung finden kannst.
!!! important "Deine SoLaWi und die [solawi-suite]"
Die [solawi-suite] unter [https://solawi.me/](https://solawi.me/) ist "nur" die Software, die deine SoLaWi zur
Durchführung der Bieterrunden verwendet.
Wenn du Fragen, Anregungen oder Fehlermeldungen zur Software an sich hast, kannst du uns gerne
[kontaktieren](/ui/contact), aber in allen Fragen rund um deine SoLaWi wende dich bitte an die jeweiligen
Ansprechpersonen aus euren Kontakt-/Orga-Teams/Kreisen. Sie helfen dir sicherlich weiter.
## Deine Zutaten für eine gelungene Bieterrunde
Um ein Gebot abzugeben, brauchst du diese Dinge:
- Deine Anteils-ID und eine Anteils-PIN (beides wird dir vorab von deinem Orga-Team ausgehändigt)
- Dein internetfähiges Mobiltelefon (Smartphone), Tablet oder deinen (mobilen) Computer; _wenn du über kein eigenes
Gerät verfügst, kannst du auch das Gerät eines anderen Teilnehmers verwenden, die Abstimmung ist nicht gerätegebunden
und es gibt keine langen Passwörter, die du irgendwo eintippen musst_
!!! tip inline end "Internetzugang während Veranstaltungen"
Manche SoLaWis stellen währennd ihrer Veranstaltungen ein Drahtlosnetzwerk (WLAN) mit Internetzugang zur Verfügung.
- Einen Zugang zur Runde, der auf diesen Wegen erfolgen kann:
- Ein Direktlink, der dich direkt zum Formular für die Abgabe führt, und der dir z. B. per E-Mail oder als QR-Code
zugegangen ist.
- Eine Ereignis-PIN, mit der du unter [https://solawi.me/bid/go](https://solawi.me/bid/go) zur Bieterrrunde dazu
stoßen kannst
Was du jedoch auf keinen Fall benötigst: Du brauchst kein Benutzerkonto für die [solawi-suite].
## In drei Schritten zum Gebot
Wir erklären dir nun Schritt für Schritt, wie die Gebotsabgabe funktioniert.
### 1. Gebotsseite aufrufen
<div class="grid cards" markdown>
- **Aufruf mit Ereignis-PIN**
---
Öffne mit deinem Browser [https://solawi.me/bid/go](https://solawi.me/bid/go). Gib anschließend die 12-stellige
numerische Ereignis-PIN ein, die allen Teilnehmern zur Verfügung gestellt wurde. Die Leerzeichen zwischen den
Dreiergruppen musst du nicht mit eingeben.
![Einem Ereignis beitreten](enter-event-form.webp)
Klicke anschließend auf die Schaltfläche "beitreten".
- **Aufruf mit Direktlink**
---
Du kommst direkt auf der Seite zur Gebotsabgabe an.
</div>
### 2. Auf den Beginn der Runde warten.
![Aktuell keine Gebotsrunde](no-round.webp){align=right width=200}
Solange die Veranstaltungsleitung noch keine Gebotsrunde eröffnet hat, kannst du kein Gebot abgeben. Dieses Vorgehen
stellt sicher, dass dein Gebot der richtigen Runde zugeordnet werden kann und so eine saubere Auszählung möglich ist.
Sobald bekannt gegeben wird, dass die Runde eröffnet wurde, klicke auf den "Aktualisieren"-Knopf.
### 3. Dein Gebot erfassen
![Gebotsabgabe-Formular](bid-form.webp){align=right width=200}
Bei eröffneter Runde hast du nun Zugriff auf ein Formular, in dem du diese Daten erfasst:
- Deine Anteils-ID
- Deine Anteils-PIN
- Den Gebotsbetrag pro Monat (bitte verzichte auf Tausender-Trennzeichen)
Klicke nun auf die Schaltfläche "Gebot abgeben". Deine Eingaben werden nun überprüft, und dein Gebot abgespeichert.
!!! danger "Gebote sind bindend!"
Du kannst nur ein Gebot pro Runde abgeben. Ein einmal abgegebenes Gebot kann nicht mehr verändert werden.
#### Sonderfall: Unterschreitung des Mindestgebots
Deine SoLaWi kann festlegen, dass es ein Mindestgebot gibt. Wenn dein Gebot diesen Betrag unterschreitet, erhältst du
eine entsprechende Meldung und musst dein Gebot erhöhen. Erst dann ist die Gebotsabgabe erfolgreich.
## Was passiert eigentlich, wenn du kein gültiges Gebot in einer Runde abgibst?
Deine SoLaWi kann Regeln festlegen, was passiert, wenn ein:e Anteilseigner:in nicht bietet. Das kann vom Einsetzen eines
definierten Mindestbetrags bis zu einem prozentualen Anteil der abgegebenen Gebote oder einer Kombination von Regeln
bestehen. Dein Orga- oder Finanz-Team klärt darüber auf.
## Ende der Runde
Nach einer gewissen Zeit beendet die Veranstaltungsleitung die Runde. Die Auswertung erfolgt nun automatisch, und das
Ergebnis wird bekannt gegeben.
## Vorab Gebote abgeben
Bei einigen SoLaWis ist es möglich, dass du Gebote vorab der Veranstaltungsleitung mitteilen kannst. Diese "Vorabgebote"
werden dann durch das Veranstaltungsteam vor Beginn der Gebotsrunden erfasst.
Entsprechend kannst du selbst mit Anteils-ID und Anteils-PIN keine Gebote abgeben, wenn bereits ein gültiges Vorabgebot
für deinen Anteil vorliegt.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

127
docs/registration/index.md Normal file
View File

@ -0,0 +1,127 @@
# Registrierung
!!! tip "Hinweis"
Die Registrierung ist aktuell nur für Mitglieder von SoLaWis möglich, mit denen wir Kontakt stehen. Die
Registrierung erfolgt dann entweder im Selbst-Service mit einer E-Mail-Adresse mit der Domain der SoLaWi, oder per
Einladung durch einen der Administratoren.
Wir freuen uns, mit euch in Kontakt zu treten und eine Zusammenarbeit zu diskutieren.
[Kontaktinformationen](/ui/contact)
## Voraussetzungen
Für eine erfolgreiche Registrierung brauchst Du ein paar wenige Voraussetzungen, egal ob du dich im Selbst-Service oder
mit einer Einladung von uns registrierst:
1. Einen Internetzugang und einen modernen Webbrowser. Aktuell testen wir hauptsächlich mit Mozilla Firefox. Theoretisch
sollten aber alle anderen verbreiteten Browser auch funktionieren.
2. Eine gültige E-Mail-Adresse, an die wir dir deine persönlichen Informationen zur Registrierung schicken können.
3. Grundsätzlich sollten alle Funktionen der [solawi-suite] auf mobilen Endgeräten funktionieren. Für die Durchführung
der Registrierung empfehlen wir jedoch ein Tablet oder einen Desktop-Rechner, das vereinfacht die Einrichtung der
Zwei-Faktor-Authentifizierung.
!!! tip inline end "Passkeys"
Nach erfolgreicher Registrierung kannst du dir den Zugang mittels Passkey einrichten. Was Passkeys sind, wo die
Vorteile für dich liegen und was du dazu tun musst, erklären wir dir
[:octicons-arrow-right-24: hier](../account/self-service.md#passkeys-verwalten)
4. Apropos Zwei-Faktor-Authentifizierung: Du benötigst eine App oder ein anderes Tool, um sogenannte TOTPs[^1] zu
erzeugen. Das sind sechsstellige Zahlencodes, mit denen du deine Identität bestätigst. Eine Registrierung ohne die
sofortige Einrichtung der Zwei-Faktor-Authentifizierung ist nicht möglich. Hier eine Auswahl an Apps:
- FreeOTP
([iOS](https://apps.apple.com/us/app/freeotp-authenticator/id872559395),
[Android](https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp))
- Microsoft Authenticator
([iOS](https://apps.apple.com/de/app/microsoft-authenticator/id983156458),
[Android](https://play.google.com/store/apps/details?id=com.azure.authenticator))
- Twilio Authy
([iOS](https://apps.apple.com/in/app/twilio-authy/id494168017),
[Android](https://play.google.com/store/apps/details?id=com.authy.authy&hl=en_IN))
Alle Apps haben ihre spezifischen Vor- und Nachteile, weswegen wir für keine davon eine explizite Empfehlung
aussprechen. Eventuell ist aber eine davon bereits bei dir im Einsatz.
Neben den genannten Apps können viele Passwort-Manager, wie beispielsweise [Passbolt](https://www.passbolt.com/),
[Bitwarden](https://bitwarden.com/) oder [LastPass](https://www.lastpass.com/) ebenso zur Verwaltung von TOTPs
verwendet werden. Hier gibt es meist noch Browser-Plugins, die eine komfortable Nutzung ermöglichen.
5. Du benötigst ein starkes Passwort, welches diesen Regeln entspricht:
- Mindestens 10 Zeichen lang, bis zu 1024 Zeichen
- Es darf keine zu große Ähnlichkeit mit deiner E-Mail-Adresse oder deinen Namensinformatioen haben
- Es darf nicht zu gewöhnlich sein
- Es darf nicht nur ausschließlich aus Zahlen bestehen
[^1]: TOTP steht für "Time-based one-time password" und ist eine gängige Form für einen zweiten Faktor für die Anmeldung
an (Web-)Applikationen. Die Erzeugung ist standardisiert, so dass eine breite Auswahl an Apps und Tools für fast
jede Plattform zur Verfügung steht.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/Time-based_one-time_password).
## Ablauf
### Registrierungsmail erhalten
<div class="grid cards" markdown>
- **Registrierung im Selbst-Service**
---
1. Besuche die Seite [Registrierung](/users/register).
2. Gib deine E-Mail-Adresse mit der Domain deiner SoLaWi ein.
3. Das System schickt dir innerhalb weniger Minuten eine E-Mail mit einem persönlichen Registrierungslink an die
angegebene Adresse. Mit einem Klick auf diesen Link kannst Du mit dem Registrierungsprozess beginnen.
- **Registrierung auf Einladung**
---
Du erhältst nach Rücksprache mit uns eine E-Mail vom [solawi-suite]-System, welche einen individuellen nur für dich
bestimmten Link zur Registrierung enthält. Mit einem Klick auf diesen Link kannst Du mit dem Registrierungsprozess
beginnen.
</div>
!!! warning "Gültigkeit der Links"
Die Links, die dir per E-Mail geschickt werden, sind für exakt eine Registrierung gültig und individuell nur für
dich, da damit bereits deine E-Mail-Adresse verbunden ist.
Die Registrierungslinks sind außerdem **nur für 48 Stunden gültig**. Während der Link noch gültig ist, kannst du
keinen neuen Link für die gleiche E-Mail-Adresse anfordern. Sollte keine Registrierung durchgeführt werden, löschen
wir deine E-Mail-Adresse nach dem Ablauf der Gültigkeit automatisch wieder aus dem System.
Schaue auch in deinem **Spam-Ordner** nach. Wir verwenden zwar SPF[^11], DKIM[^12] und DMARC[^13], aber dennoch
kommt es von Zeit zu Zeit vor, dass die Nachrichten im Spam landen.
[^11]: SPF steht für "Sender Policy Framework" und beschreibt ein Regelwerk, welches definiert, welche Server Mails für
eine bestimmte Domain versenden dürfen.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/Sender_Policy_Framework).
[^12]: DKIM steht für "DomainKeys Identified Mail" und stellt sicher, dass wir wirklich der Absender sind, der wir
vorgeben, zu sein.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/DomainKeys_Identified_Mail).
[^13]: DMARC steht für "Domain-based Message Authentication, Reporting and Conformance" und basiert auf der Verwendung
von SPF und DKIM.
Weitere Infos bei [Wikipedia](https://de.wikipedia.org/wiki/DMARC).
## Registrierung durchführen
Mit dem Klick auf den Link kommst du zu diesem Formular:
![Online-Formular zur Registrierung](registration.webp)
Fülle es mit deinem Namen aus, und gib dein Passwort zwei Mal ein. Scanne nun den QR-Code mit deiner TOTP-App oder
konfiguriere dein Tool mit dem Secret, welches unter dem QR-Code angegeben ist. Lasse deine App oder dein Tool einen
Code generieren und gib ihn ein.
Das war es schon. Du bist nun registriert.
## Erstes Login
Du kannst dich ab sofort anmelden. Möglicherweise stehen dir noch nicht alle Module zur Verfügung, denn für manche
benötigst du eine manuelle Freischaltung durch einen der Admins.
_Mehr Infos zum Login findest du hier: [:octicons-arrow-right-24: Login](../account/login.md)._

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

89
mkdocs.yml Normal file
View File

@ -0,0 +1,89 @@
site_name: 🧑‍🌾 [solawi-suite] 🌾 Handbuch
site_author: Jürgen Edelbluth
site_dir: site/solawi-suite-manual/
site_description: Handbuch für die 🧑‍🌾 [solawi-suite] 🌾
theme:
name: material
custom_dir: overrides
language: de
logo: /favicon.png
favicon: /favicon.ico
features:
- navigation.footer
- header.autohide
- navigation.tabs
- navigation.sections
- search.suggest
- search.highlight
- search.share
- content.action.edit
icon:
repo: fontawesome/brands/git-alt
edit: material/pencil
view: material/eye
extra:
homepage: /
generator: true
repo_url: https://git.codebau.dev/solawi-suite
repo_name: git.codebau.dev
edit_uri_template: https://git.codebau.dev/solawi-suite/documentation/src/branch/dev/docs/{path}
plugins:
- search
- minify:
minify_html: true
minify_js: true
minify_css: true
htmlmin_opts:
remove_comments: true
cache_safe: true
- offline
- privacy
- glightbox
extra_javascript:
- "/ui/matomo.js"
markdown_extensions:
- admonition
- abbr
- footnotes
- toc:
title: Auf dieser Seite
toc_depth: 3
- tables
- meta
- pymdownx.tabbed:
alternate_style: true
- pymdownx.tasklist:
custom_checkbox: true
clickable_checkbox: false
- pymdownx.superfences
- def_list
- attr_list
- md_in_html
- pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
copyright: Jürgen Edelbluth, <a href="https://solawi.me/">solawi.me</a>
nav:
- '↩ zurück zur [solawi-suite]': /
- 'Startseite Handbuch': index.md
- 'Registrierung': registration/index.md
- 'Benutzerkonto':
- 'Login': account/login.md
- 'Kontoverwaltung': account/self-service.md
- 'Module':
- 'Abholgemeinschaft': modules/ahg/index.md
- 'Beamer-Verbindung': modules/beamer/index.md
- 'Digitales Gebot': modules/bidding/index.md
- 'Digitales Gebot für Mitglieder': modules/bidding/members.md
- 'Kontakt': /ui/contact
- 'Impressum/Datenschutz': /ui/impressum

View File

@ -0,0 +1,11 @@
<div class="md-copyright">
<p><a href="/ui/impressum">Impressum / Datenschutz</a> | <a href="/ui/contact">Kontakt</a></p>
<p>
{% if config.copyright %}
Copyright &copy; 2023-{{ build_date_utc.strftime('%Y') }} {{ config.copyright }}
{% endif %}
{% if not config.extra.generator == false %}
<br>Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">Material for MkDocs</a>
{% endif %}
</p>
</div>

429
requirements.txt Normal file
View File

@ -0,0 +1,429 @@
babel==2.14.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \
--hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287
beautifulsoup4==4.12.3 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \
--hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed
certifi==2024.2.2 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \
--hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1
charset-normalizer==3.3.2 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
--hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
--hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \
--hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \
--hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \
--hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \
--hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \
--hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \
--hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \
--hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \
--hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \
--hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \
--hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \
--hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \
--hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \
--hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \
--hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \
--hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \
--hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \
--hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \
--hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \
--hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \
--hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \
--hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \
--hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \
--hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \
--hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \
--hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \
--hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \
--hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \
--hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \
--hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \
--hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \
--hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \
--hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \
--hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \
--hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \
--hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \
--hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \
--hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \
--hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \
--hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \
--hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \
--hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \
--hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \
--hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \
--hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \
--hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \
--hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \
--hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \
--hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \
--hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \
--hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \
--hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \
--hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \
--hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \
--hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \
--hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \
--hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \
--hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \
--hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \
--hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \
--hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \
--hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \
--hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \
--hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \
--hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \
--hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \
--hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \
--hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \
--hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \
--hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \
--hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \
--hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \
--hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \
--hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \
--hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \
--hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \
--hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \
--hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \
--hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \
--hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \
--hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \
--hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \
--hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \
--hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \
--hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \
--hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
click==8.1.7 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \
--hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de
colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
csscompressor==0.9.5 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05
editorconfig==0.12.4 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80
ghp-import==2.1.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \
--hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343
htmlmin2==0.1.13 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2
idna==3.6 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
jinja2==3.1.3 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \
--hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90
jsbeautifier==1.15.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24
jsmin==3.0.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc
markdown==3.6 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f \
--hash=sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224
markupsafe==2.1.5 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \
--hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \
--hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \
--hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \
--hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \
--hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \
--hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \
--hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \
--hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \
--hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \
--hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \
--hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \
--hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \
--hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \
--hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \
--hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \
--hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \
--hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \
--hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \
--hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \
--hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \
--hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \
--hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \
--hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \
--hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \
--hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \
--hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \
--hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \
--hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \
--hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \
--hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \
--hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \
--hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \
--hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \
--hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \
--hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \
--hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \
--hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \
--hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \
--hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \
--hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \
--hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \
--hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \
--hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \
--hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \
--hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \
--hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \
--hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \
--hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \
--hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \
--hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \
--hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \
--hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \
--hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \
--hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \
--hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \
--hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \
--hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \
--hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \
--hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68
mergedeep==1.3.4 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8 \
--hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307
mkdocs-glightbox==0.3.7 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:4e890140a97dd4ad128cb92174384bd0ac33adec3304bbd2b7c48d0847685c4f \
--hash=sha256:9659631a9829d93d8fb0ce3a20a10261c258605ba4dc87a3b7b5d847b93a276d
mkdocs-material-extensions==1.3.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \
--hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31
mkdocs-material==9.5.17 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4 \
--hash=sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571
mkdocs-mermaid2-plugin==1.1.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:4e25876b59d1e151ca33a467207b346404b4a246f4f24af5e44c32408e175882 \
--hash=sha256:bea5f3cbe6cb76bad21b81e49a01e074427ed466666c5d404e62fe8698bc2d7c
mkdocs-minify-plugin==0.8.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6 \
--hash=sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d
mkdocs-redirects==1.2.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861
mkdocs==1.5.3 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1 \
--hash=sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2
mkdocs[i18n]==1.5.3 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1 \
--hash=sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2
packaging==24.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \
--hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9
paginate==0.5.6 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d
pathspec==0.12.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \
--hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712
platformdirs==4.2.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 \
--hash=sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768
pygments==2.17.2 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \
--hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367
pymdown-extensions==10.7.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584 \
--hash=sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4
python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \
--hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427
pyyaml-env-tag==0.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \
--hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069
pyyaml==6.0.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \
--hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \
--hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \
--hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \
--hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \
--hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \
--hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \
--hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \
--hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \
--hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \
--hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \
--hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \
--hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \
--hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \
--hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \
--hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \
--hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \
--hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \
--hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \
--hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \
--hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \
--hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \
--hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \
--hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \
--hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \
--hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \
--hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \
--hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \
--hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \
--hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \
--hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \
--hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \
--hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \
--hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \
--hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \
--hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \
--hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \
--hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \
--hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \
--hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \
--hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \
--hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \
--hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \
--hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \
--hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \
--hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \
--hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \
--hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \
--hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \
--hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \
--hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f
regex==2023.12.25 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \
--hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \
--hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \
--hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \
--hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \
--hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \
--hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \
--hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \
--hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \
--hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \
--hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \
--hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \
--hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \
--hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \
--hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \
--hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \
--hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \
--hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \
--hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \
--hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \
--hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \
--hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \
--hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \
--hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \
--hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \
--hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \
--hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \
--hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \
--hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \
--hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \
--hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \
--hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \
--hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \
--hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \
--hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \
--hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \
--hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \
--hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \
--hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \
--hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \
--hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \
--hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \
--hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \
--hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \
--hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \
--hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \
--hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \
--hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \
--hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \
--hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \
--hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \
--hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \
--hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \
--hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \
--hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \
--hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \
--hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \
--hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \
--hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \
--hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \
--hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \
--hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \
--hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \
--hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \
--hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \
--hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \
--hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \
--hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \
--hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \
--hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \
--hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \
--hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \
--hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \
--hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \
--hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \
--hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \
--hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \
--hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \
--hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \
--hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \
--hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \
--hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \
--hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \
--hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \
--hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \
--hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \
--hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \
--hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \
--hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \
--hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \
--hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \
--hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \
--hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988
requests==2.31.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
--hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
setuptools==69.2.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \
--hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c
six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
soupsieve==2.5 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690 \
--hash=sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7
urllib3==2.2.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \
--hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19
watchdog==4.0.0 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257 \
--hash=sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca \
--hash=sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b \
--hash=sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85 \
--hash=sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b \
--hash=sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19 \
--hash=sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50 \
--hash=sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92 \
--hash=sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269 \
--hash=sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f \
--hash=sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c \
--hash=sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b \
--hash=sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87 \
--hash=sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b \
--hash=sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b \
--hash=sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8 \
--hash=sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c \
--hash=sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3 \
--hash=sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7 \
--hash=sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605 \
--hash=sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935 \
--hash=sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b \
--hash=sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927 \
--hash=sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101 \
--hash=sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07 \
--hash=sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec \
--hash=sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4 \
--hash=sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245 \
--hash=sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d