diff --git a/.gitignore b/.gitignore
index ed90f2f7a841da90717ad986c7bb57dbc86a8876..0faf3e4c3ecc7ff5de08a7c56ee313c488b183f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,6 +64,8 @@ docs/_build/
 # Generated files
 aleksis/node_modules/
 aleksis/static/
+aleksis/whoosh_index/
+poetry.lock
 
 .coverage
 .mypy_cache/
@@ -72,3 +74,8 @@ htmlcov/
 maintenance_mode_state.txt
 media/
 package-lock.json
+
+# VSCode
+.vscode/
+.history/
+*.code-workspace
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cc15c9b2b0ac33b6b83e0ebe72830d702b8ffad8..2bd4eb0e0ed3cec81b274735ef25ce3facb5e66f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,11 +1,36 @@
 include:
     - project: "AlekSIS/official/AlekSIS"
       file: /ci/general.yml
-#   - project: "AlekSIS/official/AlekSIS"
-#     file: /ci/test.yml
+    - project: "AlekSIS/official/AlekSIS"
+      file: /ci/prepare/lock.yml
     - project: "AlekSIS/official/AlekSIS"
       file: /ci/test/lint.yml
     - project: "AlekSIS/official/AlekSIS"
       file: /ci/test/security.yml
     - project: "AlekSIS/official/AlekSIS"
       file: /ci/build/dist.yml
+    - project: "AlekSIS/official/AlekSIS"
+      file: /ci/docker/dist.yml
+
+variables:
+  GIT_SUBMODULE_STRATEGY: recursive
+  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+  FF_NETWORK_PER_BUILD: "true"
+  POETRY_REPOSITORIES_GITLAB_URL: "$CI_API_V4_URL/projects/${CI_PROJECT_ID}/packages/pypi"
+  POETRY_HTTP_BASIC_GITLAB_USERNAME: gitlab-ci-token
+  POETRY_HTTP_BASIC_GITLAB_PASSWORD: "$CI_JOB_TOKEN"
+  POETRY_PYPI_TOKEN_PYPI: "$TICDESK_PUBLISH_TOKEN"
+
+deploy_gitlab:
+  interruptible: true
+  stage: publish
+  script:
+    - if [ x$CI_COMMIT_REF_NAME = x$CI_COMMIT_TAG ]; then
+       if ! [ "$(poetry version | cut -d" " -f2)" = $CI_COMMIT_REF_NAME ]; then
+        echo "Package version does not match tag. Aborting build of tag!" >/dev/fd/2 ;
+        exit 1 ;
+       fi ;
+      else
+       poetry version $(poetry version | cut -d" " -f2)+$(date --date=${CI_COMMIT_TIMESTAMP} +%Y%m%d%H%M%S).${CI_COMMIT_SHORT_SHA} ;
+      fi
+    - poetry publish -r gitlab
diff --git a/README.rst b/README.rst
index 9ef4e10a7c31bf8f927e4b9673fda6d91cb12b33..d2a5be6057f7d7b1db07a61b767fb51cdf568a36 100644
--- a/README.rst
+++ b/README.rst
@@ -16,7 +16,8 @@ Licence
 
 ::
 
-  Copyright © 2021 Dominik George <dominik.george@teckids.org>
+  Copyright © 2018, 2021 Dominik George <dominik.george@teckids.org>
+  Copyright © 2019, 2022 Tom Teichler <tom.teichler@teckids.org>
 
   Licenced under the EUPL, version 1.2 or later
 
@@ -32,6 +33,6 @@ AlekSIS® is a registered trademark of the AlekSIS open source project, represen
 by Teckids e.V. Please refer to the `trademark policy`_ for hints on using the trademark
 AlekSIS®.
 
-.. _AlekSIS: https://edugit.org/AlekSIS/AlekSIS
+.. _AlekSIS®: https://edugit.org/AlekSIS/AlekSIS
 .. _European Union Public Licence: https://eupl.eu/
 .. _trademark policy: https://aleksis.org/pages/about
diff --git a/aleksis/apps/paweljong/apps.py b/aleksis/apps/paweljong/apps.py
index 561fcf43e5fdf4eefab981d57afb2696b188b814..2699ec48f7098e814b7fa535f254d9c81de7435c 100644
--- a/aleksis/apps/paweljong/apps.py
+++ b/aleksis/apps/paweljong/apps.py
@@ -7,7 +7,10 @@ class DefaultConfig(AppConfig):
     dist_name = "AlekSIS-App-Paweljong"
 
     urls = {
-        "Repository": "https://edugit.org//hacknfun//AlekSIS-App-Paweljong",
+        "Repository": "https://edugit.org/Teckids/hacknfun/AlekSIS-App-Paweljong",
     }
     licence = "EUPL-1.2+"
-    copyright_info = (([2021], "Dominik George", "dominik.george@.org"),)
+    copyright_info = (
+        ([2018, 2021], "Dominik George", "dominik.george@teckids.org"),
+        ([2019, 2022], "Tom Teichler", "tom.teichler@teckids.org"),
+    )
diff --git a/aleksis/apps/paweljong/filters.py b/aleksis/apps/paweljong/filters.py
index f4b44dfcb935438308865ac7c291c5043378ceec..430b07b5d05a626d0d53254c0bf4517cf679e392 100644
--- a/aleksis/apps/paweljong/filters.py
+++ b/aleksis/apps/paweljong/filters.py
@@ -5,27 +5,27 @@ from material import Layout, Row
 
 from aleksis.core.filters import MultipleCharFilter
 
-from .models import EventRegistration, FeedbackAspect, Voucher
+from .models import Event, EventRegistration, Terms, Voucher
 
 
 class EventRegistrationFilter(FilterSet):
     class Meta:
         model = EventRegistration
-        fields = ["person", "event", "accept_sepa", "date_registred"]
+        fields = ["person", "event", "accept_sepa", "date_registered"]
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
         self.form.layout = Layout(
             Row("person", "event"),
-            Row("accept_sepa", "date_registred"),
+            Row("accept_sepa", "date_registered"),
         )
 
 
 class VoucherFilter(FilterSet):
     event = MultipleCharFilter(
         [
-            "event__short_name__icontains",
+            "event__display_name__icontains",
         ],
         label=_("Search by event"),
     )
@@ -48,7 +48,21 @@ class VoucherFilter(FilterSet):
         self.form.layout = Layout(Row("event", "name"))
 
 
-class FeedbackAspectsFilter(FilterSet):
+class TermsFilter(FilterSet):
     class Meta:
-        model = FeedbackAspect
-        fields = ["aspect"]
+        model = Terms
+        fields = ["title"]
+
+
+class EventFilter(FilterSet):
+    class Meta:
+        model = Event
+        fields = ["display_name", "published", "place"]
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        self.form.layout = Layout(
+            Row("display_name"),
+            Row("published", "place"),
+        )
diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py
index 0fe993f2361a43f25f3dd454b35496bbb893ffca..c7c1fe899e8da459713138c352ac301a3223c459 100644
--- a/aleksis/apps/paweljong/forms.py
+++ b/aleksis/apps/paweljong/forms.py
@@ -1,20 +1,16 @@
-import re
-from collections import OrderedDict
-
 from django import forms
+from django.forms import fields
 from django.utils.translation import ugettext_lazy as _
 
-import phonenumbers
+from allauth.account.views import SignupForm
 from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget
-from django_starfield import Stars
 from material import Fieldset, Layout, Row
+from phonenumber_field.formfields import PhoneNumberField
 
-from aleksis.core.forms import AccountRegisterForm
 from aleksis.core.mixins import ExtensibleForm
 from aleksis.core.models import Group, Person
-from aleksis.core.util.core_helpers import get_site_preferences
 
-from .models import Event, EventRegistration, FeedbackAspect, Voucher
+from .models import Event, EventRegistration, Terms, Voucher
 
 COMMENT_CHOICES = [
     ("first", _("Only first name")),
@@ -33,186 +29,50 @@ LICENCE_CHOICES = [
     (
         "CC-BY-SA-4.0+",
         _(
-            "Creative Commons with attribution and distribution only"
+            "Creative Commons with attribution and distribution only "
             "under the same conditions, 4.0 or later"
         ),
     ),
 ]
 
-NEWSLETTER_CHOICES = get_site_preferences()["paweljong__newsletter_choices"].split(",")
-
-
-def is_phonenumber(number):
-    try:
-        phonenumbers.parse(number, "DE")
-    except BaseException:
-        raise forms.ValidationError(_("%s is not a valid phone number") % number)
-
-
-def is_valid_voucher_for(event_cn):
-    def _is_valid_voucher(code):
-        if Voucher.objects.filter(code=code, event_cn=event_cn, used=False).count() == 0:
-            raise forms.ValidationError(_("The voucher is invalid!"))
-
-    return _is_valid_voucher
-
-
-def clean_phonenumber(field):
-    def _clean_phonenumber(obj):
-        value = obj.cleaned_data[field]
-
-        if value:
-            pn = phonenumbers.parse(value, "DE")
-            value = phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.E164)
-
-        return value
-
-    return _clean_phonenumber
-
-
-class EventAdditionalSurveyForm(forms.Form):
-    def __init__(self, event, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-        self.add_fields_from_ldap(event)
-
-    def add_fields_from_ldap(self, event, before=None):
-        new_fields = OrderedDict()
-
-        for field in event.registration_fields:
-            label, help_text, *choices = field.split("|")
-            var = re.sub(r"[^A-Za-z0-9]|^(?=\d)", "_", label)
-
-            if choices:
-                choices_map = [
-                    (re.sub(r"[^A-Za-z0-9]|^(?=\d)", "_", choice), choice) for choice in choices
-                ]
-                field_attr = forms.ChoiceField(
-                    label=label,
-                    help_text=help_text,
-                    choices=choices_map,
-                    required=False,
-                )
-            else:
-                field_attr = forms.CharField(label=label, help_text=help_text, required=False)
-
-            new_fields[var] = field_attr
-
-        if before:
-            before_field_index = list(self.fields.keys()).index(before)
-            field_names = list(self.fields.keys())
-            new_field_order = (
-                field_names[: before_field_index - 1]
-                + list(new_fields.keys())
-                + field_names[before_field_index - 1 :]
-            )
-
-        self.fields.update(new_fields)
-
-        if before:
-            self.order_fields(new_field_order)
-
-
-class EventFeedbackForm(ExtensibleForm):
-    class Meta:
-        model = FeedbackAspect
-        fields = []
-
-    layout = Layout(
-        Fieldset(
-            _("Comments"),
-            Row("comment_private", "comment_public", "comment_public_info"),
-        ),
-        Fieldset(
-            _("Photos"),
-            Row("photos", "photos_licence"),
-        ),
-        Fieldset(
-            _("Feedback aspects"),
-        ),
-    )
-
-    comment_private = forms.CharField(
-        required=False,
-        label=_("Comment for the team"),
-        help_text=_(
-            "This comment is for the team only. You can write down everything you"
-            "would like to give us as feedback here."
-        ),
-        widget=forms.Textarea,
-    )
-
-    comment_public = forms.CharField(
-        required=False,
-        label=_("Comment for the website"),
-        help_text=_(
-            "This comment is for the report on our website. Tell in detail about what"
-            "you experienced, what you liked, what you learned and everything else"
-            "you can think of."
-        ),
-        widget=forms.Textarea,
-    )
-
-    comment_public_info = forms.ChoiceField(
-        label=_("Information in the comment"),
-        choices=COMMENT_CHOICES,
-        help_text=_("What information would you like to use to publish your comment?"),
-    )
-
-    photos = forms.ImageField(
-        label=_("Photos"),
-        widget=forms.ClearableFileInput(attrs={"multiple": True}),
-        required=False,
-        help_text=_(
-            "If you want to contribute photos to the report, you can upload them here. You can"
-            "select multiple files in most file selection dialogs with CTRL + click."
-        ),
-    )
-
-    photos_licence = forms.ChoiceField(
-        label=_("Photo licence"),
-        choices=LICENCE_CHOICES,
-        required=False,
-        help_text=_("If you upload photos, choose a license here."),
-    )
-
-    def __init__(self, event, *args, **kwargs):
-        super(EventFeedbackForm, self).__init__(*args, **kwargs)
-        self._event = event
-
-        for aspect in event.feedback_aspects.all():
-            field = forms.IntegerField(
-                widget=Stars,
-                required=False,
-            )
-            self.fields[aspect.aspect] = field
-            node = Fieldset(f"{aspect.aspect}", f"{aspect.aspect}")
-            self.add_node_to_layout(node)
 
-
-class EditEventForm(forms.ModelForm):
+class EditEventForm(ExtensibleForm):
     """Form to create or edit an event."""
 
     layout = Layout(
         Fieldset(
             _("Base data"),
-            "group",
+            "linked_group",
             Row("display_name", "description"),
             Row("place", "published"),
             Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction")),
-            Fieldset(_("Event details"), Row("cost", "max_participants")),
-            Fieldset(_("Feedback aspects"), "feedback_aspects"),
+            Fieldset(_("Event details"), Row("cost", "max_participants"), "information"),
+            Fieldset(_("Terms"), "terms"),
         ),
     )
 
     class Meta:
         model = Event
-        exclude = []
+        fields = [
+            "linked_group",
+            "display_name",
+            "description",
+            "place",
+            "published",
+            "date_event",
+            "date_registration",
+            "date_retraction",
+            "cost",
+            "max_participants",
+            "terms",
+            "information",
+        ]
         widgets = {
-            "group": ModelSelect2Widget(
-                search_fields=["name__icontains", "short_name__icontains"],
+            "linked_group": ModelSelect2Widget(
+                search_fields=["name__icontains"],
                 attrs={"data-minimum-input-length": 0, "class": "browser-default"},
             ),
-            "feedback_aspects": ModelSelect2MultipleWidget(
+            "terms": ModelSelect2MultipleWidget(
                 search_fields=["aspect__icontains"],
                 attrs={"data-minimum-input-length": 0, "class": "browser-default"},
             ),
@@ -225,10 +85,20 @@ class EditVoucherForm(forms.ModelForm):
     class Meta:
         model = Voucher
         exclude = ["code", "used_person_uid", "used", "deleted"]
+        widgets = {
+            "event": ModelSelect2Widget(
+                search_fields=["display_name__icontains"],
+                attrs={"data-minimum-input-length": 0, "class": "browser-default"},
+            ),
+            "person": ModelSelect2Widget(
+                search_fields=["first_name__icontains", "last_name__icontains"],
+                attrs={"data-minimum-input-length": 0, "class": "browser-default"},
+            ),
+        }
         help_texts = {
-            "event": _("Event the voucher is valid for."),
-            "person": _("Person the voucher is valid for."),
-            "discount": _("Voucher discount."),
+            "event": _("Event the voucher is valid for"),
+            "person": _("Person the voucher is valid for"),
+            "discount": _("Voucher discount"),
         }
 
 
@@ -238,42 +108,28 @@ class GenerateListForm(forms.Form):
     group = forms.ModelChoiceField(
         label=_("Group"),
         queryset=Group.objects.all(),
-        help_text=_("Select group to generate list."),
+        help_text=_("Select group to generate list"),
     )
 
     template = forms.ChoiceField(
         label=_("Template"),
         choices=TEMPLATE_CHOICES,
-        help_text=_("Select template to generate list."),
+        help_text=_("Select template to generate list"),
     )
 
     landscape = forms.BooleanField(
         label=_("Landscape"),
-        help_text=_("Select if output should be in landscape."),
+        help_text=_("Select if output should be in landscape"),
+        required=False,
     )
 
 
-class RegisterEventForm(forms.ModelForm):
-    """Form to register for an event."""
+class RegisterEventGuardians(ExtensibleForm):
+    class Meta:
+        model = EventRegistration
+        fields = []
 
     layout = Layout(
-        Fieldset(
-            _("Address data"),
-            Row("street", "housenumber"),
-            Row("postal_code", "place"),
-        ),
-        Fieldset(
-            _("Contact details"),
-            Row("mobile_number", "email"),
-        ),
-        Fieldset(
-            _("Personal data"),
-            Row("date_of_birth", "sex"),
-        ),
-        Fieldset(
-            _("School details"),
-            Row("school", "school_place", "school_class"),
-        ),
         Fieldset(
             _("Guardians personal data"),
             Row("guardian_first_name", "guardian_last_name"),
@@ -282,101 +138,71 @@ class RegisterEventForm(forms.ModelForm):
             _("Guardians contact details"),
             Row("guardian_email", "guardian_mobile_number"),
         ),
-        Fieldset(
-            _("General event information"),
-            Row("event", "person"),
-            Row("comment", "channel"),
-        ),
-        Fieldset(
-            _("Financial data"),
-            "voucher_code",
-            Row("iban", "donation", "accept_sepa"),
-        ),
-        Fieldset(
-            _("Declaration of consent"),
-            Row("accept_terms", "accept_data", "accept_general_terms"),
-        ),
     )
 
-    class Meta:
-        model = EventRegistration
-        exclude = ["date_registred", "voucher"]
-        help_texts = {
-            "voucher": _(
-                "If you have a voucher for the event, enter the code here."
-                "It will be charged automatically."
-            ),
-            "donation": (
-                "Our association would like to offer all children and young"
-                "people the opportunity to participate in our events. Often,"
-                "however, the family fee cannot be paid. We therefore have a"
-                "budget from which we can promote participation after we have"
-                "carefully examined the necessity and eligibility. We rely on"
-                "donations for this budget. If you would like to donate a voluntary"
-                "additional amount for this budget, please indicate this here. We do"
-                "not permanently save whether and if so in what amount donations are"
-                "made and also not within the association, e.g. passed on to leisure supervisors."
-            ),
-            "accept_sepa": _(
-                "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn with"
-                "creditor ID DE70FZT00001497650, to collect the participant fee from my account"
-                "once using the SEPA core direct debit. At the same time, I instruct my bank to"
-                "redeem the SEPA core direct debit withdrawn from my account by  e.V."
-            ),
-            "iban": _(
-                "If your parents want to pay by SEPA direct debit,"
-                "please let them fill out this field."
-            ),
-            "accept_terms": _(
-                "Parents: My child filled out the registration form together with me, but myself,"
-                "and I agree to the participation, the terms of use and the terms and conditions."
-                "I am aware that the registration is binding and that withdrawal is only possible"
-                "in exceptional cases with a valid reason. In addition, I agree to pay the"
-                "participation fee in advance and agree to the reimbursement guidelines"
-                "mentioned above."
-            ),
-            "accept_data": _(
-                "I consent to the processing of my data as stated in the"
-                "terms of use and all the data provided is correct. If I am under the"
-                "age of 16, my parents also agree to this and I can prove this on request"
-                "(e.g. by making contact with my parents)."
-            ),
-            "accept_general_terms": _("I agree with the" "AGB and have read them."),
-            "channel": _("How did you find out about the event?"),
-        }
-
     guardian_first_name = forms.CharField(
-        label=_("Guardians first name"),
+        label=_("Guardian's first name"),
         help_text=_(
-            "Please enter the first name of the legal guardian who will fill in the registration"
+            "Please enter the first name of the legal guardian who will fill in the registration "
             "with you and who can be reached during the event in an emergency."
         ),
     )
 
     guardian_last_name = forms.CharField(
-        label=_("Guardians last name"),
+        label=_("Guardian's last name"),
         help_text=_(
-            "Please enter the last name of the legal guardian who will fill in the registration"
+            "Please enter the last name of the legal guardian who will fill in the registration "
             "with you and who can be reached during the event in an emergency."
         ),
     )
 
-    guardian_mobile_number = forms.CharField(
-        label=_("Guardians mobile number"),
+    guardian_mobile_number = PhoneNumberField(
+        label=_("Guardian's mobile number"),
         help_text=_(
-            "We need the mobile phone number for emergencies if we"
+            "We need the mobile phone number for emergencies if we "
             "urgently need to reach your parents during the event."
         ),
     )
 
     guardian_email = forms.EmailField(
-        label=_("Guardians email address"),
+        label=_("Guardian's email address"),
     )
 
-    voucher_code = forms.CharField(
-        label=_("Voucher code"),
-        help_text=_("If you have a voucher code, type it in here."),
-        required=False,
+
+class RegisterEventContactDetails(ExtensibleForm):
+    class Meta:
+        model = Group
+        fields = []
+
+    layout = Layout(
+        Fieldset(
+            _("Personal data"),
+            Row("first_name", "last_name"),
+            Row("date_of_birth", "sex"),
+        ),
+        Fieldset(
+            _("Address data"),
+            Row("street", "housenumber"),
+            Row("postal_code", "place"),
+        ),
+        Fieldset(
+            _("Contact details"),
+            Row("mobile_number", "email"),
+        ),
+        Fieldset(
+            _("School details"),
+            Row("school", "school_place", "school_class"),
+        ),
+    )
+
+    first_name = forms.CharField(
+        label=_("First name"),
+        disabled=True,
+    )
+
+    last_name = forms.CharField(
+        label=_("Last name"),
+        disabled=True,
     )
 
     street = forms.CharField(
@@ -395,15 +221,14 @@ class RegisterEventForm(forms.ModelForm):
         label=_("Place"),
     )
 
-    mobile_number = forms.CharField(
+    mobile_number = PhoneNumberField(
         label=_("Mobile number"),
         required=False,
         help_text=_(
-            "Your mobile number helps us to reach you in an emergency during the event, e.g."
-            "if you are alone with your group at a conference or similar. If you don't have a"
+            "Your mobile number helps us to reach you in an emergency during the event, e.g. "
+            "if you are alone with your group at a conference or similar. If you don't have a "
             "cell phone, you can leave the field blank."
         ),
-        validators=[is_phonenumber],
     )
 
     date_of_birth = forms.DateField(
@@ -413,9 +238,8 @@ class RegisterEventForm(forms.ModelForm):
     sex = forms.ChoiceField(
         label=_("Sex"),
         help_text=_(
-            "For various reasons, e.g. because we have to keep gender segregation during the night"
-            "for legal reasons, we need to know if you are a boy or a girl. With some names this is"
-            "not always immediately recognizable, so we ask you to indicate it here."
+            "For various reasons, e.g. because we have to keep gender segregation during the night "
+            "for legal reasons, we need to know if you are a boy or a girl."
         ),
         choices=Person.SEX_CHOICES,
         initial=None,
@@ -423,31 +247,132 @@ class RegisterEventForm(forms.ModelForm):
 
     email = forms.EmailField(
         label=_("Email address"),
+        help_text=_(
+            "Please use your personal e-mail address here, which you will check "
+            "personally. Important information will always be sent to your parents "
+            "as well. Do not use an e-mail address owned by your parents here."
+        ),
     )
 
     school = forms.CharField(
         label=_("School"),
-        help_text=_("Please enter the name of your school as exactly as it should be written."),
+        help_text=_("Please enter the name of your school."),
     )
 
     school_place = forms.CharField(
         label=_("School place"),
-        help_text=_("Enter the place (city) where your school is located (without a district)."),
+        help_text=_("Enter the place (city) where your school is located."),
     )
 
     school_class = forms.CharField(
         label=_("School class"),
-        help_text=_("Please enter the class you are going to (e.g. 8a)."),
+        help_text=_("Please enter the class you are in (e.g. 8a)."),
+    )
+
+
+class RegisterEventAdditional(ExtensibleForm):
+
+    layout = Layout(
+        Fieldset(
+            _("Medical information / intolerances"),
+            Row("medical_information"),
+        ),
+        Fieldset(
+            _("Other remarks"),
+            Row("comment"),
+        ),
     )
 
-    def __init__(self, *args, **kwargs):
+    class Meta:
+        model = EventRegistration
+        fields = ["medical_information", "comment"]
+        help_texts = {
+            "medical_information": _(
+                "If there are any medically important things we need to "
+                "consider, e.g. when making food or to make sure you take "
+                "prescribed medication, please enter it here."
+            ),
+            "comment": _("You can write down any remarks you want to tell us here."),
+        }
+
+    def __init__(self, event, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-        self.fields["event"].disabled = True
-        self.fields["person"].disabled = True
-        self.fields["accept_terms"].required = True
-        self.fields["accept_general_terms"].required = True
-        self.fields["accept_data"].required = True
+        for field in event.linked_group.additional_fields.all():
+            field_instance = getattr(fields, field.field_type)(
+                required=field.required,
+                help_text=field.help_text,
+            )
+            self.fields[field.title] = field_instance
+            node = Fieldset(f"{field.title}", f"{field.title}")
+            self.add_node_to_layout(node)
+
+
+class RegisterEventFinancial(ExtensibleForm):
+    """Form to register for an event."""
+
+    layout = Layout(
+        Fieldset(
+            _("Financial data"),
+            "voucher_code",
+            Row("accept_sepa", "iban"),
+            "donation",
+        ),
+    )
+
+    voucher_code = forms.CharField(
+        label=_("Voucher code"),
+        help_text=_("If you have a voucher code, type it in here."),
+        required=False,
+    )
+
+    def clean(self):
+        if self.cleaned_data["accept_sepa"]:
+            if not self.cleaned_data["iban"]:
+                raise forms.ValidationError(_("Please enter your IBAN"))
+
+    class Meta:
+        model = EventRegistration
+        fields = ["voucher_code", "iban", "donation", "accept_sepa"]
+        help_texts = {
+            "donation": _(
+                "Our association would like to offer all children and young "
+                "people the opportunity to participate in our events. Sometimes, "
+                "however, families cannot afford the full fee. We therefore have a "
+                "budget from which we can promote participation after we have "
+                "carefully examined the necessity and eligibility. We rely on "
+                "donations for this budget. If you would like to donate a voluntary "
+                "additional amount for this budget, please indicate this here."
+            ),
+            "accept_sepa": _(
+                "Parents: I authorize the creditor Teckids e.V., Kennedyallee 18, 53175 Bonn with "
+                "creditor ID DE70ZZZ00001497650, to collect the participant fee from my account "
+                "once using the SEPA core direct debit. At the same time, I instruct my bank to "
+                "redeem the SEPA core direct debit withdrawn from my account by Teckids e.V."
+            ),
+            "iban": _(
+                "If your parents want to pay by SEPA direct debit, "
+                "please let them fill out this field."
+            ),
+        }
+
+
+class RegisterEventConsent(ExtensibleForm):
+    class Meta:
+        model = EventRegistration
+        fields = []
+
+    def __init__(self, event, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        for field in event.terms.all():
+            field_instance = forms.BooleanField(
+                required=True,
+                label=field.confirmation_text,
+            )
+            self.fields[f"consent_{field.pk}"] = field_instance
+            node = Row(f"consent_{field.pk}")
+            self.add_node_to_layout(node)
 
 
 class EditEventRegistrationForm(forms.ModelForm):
@@ -456,7 +381,7 @@ class EditEventRegistrationForm(forms.ModelForm):
         Fieldset(
             _("General event information"),
             Row("event", "person"),
-            Row("comment", "channel"),
+            Row("comment"),
         ),
         Fieldset(
             _("Financial data"),
@@ -477,52 +402,71 @@ class EditEventRegistrationForm(forms.ModelForm):
                 "It will be charged automatically."
             ),
             "donation": (
-                "Our association would like to offer all children and young"
-                "people the opportunity to participate in our events. Often,"
-                "however, the family fee cannot be paid. We therefore have a"
-                "budget from which we can promote participation after we have"
-                "carefully examined the necessity and eligibility. We rely on"
-                "donations for this budget. If you would like to donate a voluntary"
-                "additional amount for this budget, please indicate this here. We do not"
-                "permanently save whether and if so in what amount donations are made"
-                "and also not within the association, e.g. passed on to leisure supervisors."
+                "Our association would like to offer all children and young "
+                "people the opportunity to participate in our events. Often, "
+                "however, the family fee cannot be paid. We therefore have a "
+                "budget from which we can promote participation after we have "
+                "carefully examined the necessity and eligibility. We rely on "
+                "donations for this budget. If you would like to donate a voluntary "
+                "additional amount for this budget, please indicate this here. We do not "
+                "permanently save whether and if so in what amount donations are made "
+                "and also not within the association, e.g. passed on to leisure supervisors. "
             ),
             "accept_sepa": _(
-                "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn with"
-                "creditor ID DE70FZT00001497650, to collect the participant fee from my account"
-                "once using the SEPA core direct debit. At the same time, I instruct my bank"
+                "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn with "
+                "creditor ID DE70FZT00001497650, to collect the participant fee from my account "
+                "once using the SEPA core direct debit. At the same time, I instruct my bank "
                 "to redeem the SEPA core direct debit withdrawn from my account by  e.V."
             ),
             "iban": _(
-                "If your parents want to pay by SEPA direct debit,"
+                "If your parents want to pay by SEPA direct debit, "
                 "please let them fill out this field."
             ),
             "accept_terms": _(
-                "Parents: My child filled out the registration form together with me, but myself,"
-                "and I agree to the participation, the terms of use and the terms and conditions."
-                "I am aware that the registration is binding and that withdrawal is only possible"
-                "in exceptional cases with a valid reason. In addition, I agree to pay the"
-                "participation fee in advance and agree to the reimbursement"
+                "Parents: My child filled out the registration form together with me, but myself, "
+                "and I agree to the participation, the terms of use and the terms and conditions. "
+                "I am aware that the registration is binding and that withdrawal is only possible "
+                "in exceptional cases with a valid reason. In addition, I agree to pay the "
+                "participation fee in advance and agree to the reimbursement "
                 "guidelines mentioned above."
             ),
             "accept_data": _(
-                "I consent to the processing of my data as stated in the"
-                "terms of use and all the data provided is correct. If I am under"
-                "the age of 16, my parents also agree to this and I can prove this on"
+                "I consent to the processing of my data as stated in the "
+                "terms of use and all the data provided is correct. If I am under "
+                "the age of 16, my parents also agree to this and I can prove this on "
                 "request (e.g. by making contact with my parents)."
             ),
             "accept_general_terms": _("I agree with the" "AGB and have read them."),
-            "channel": _("How did you find out about the event?"),
         }
         exclude = []
 
 
-class EditFeedbackAspectForm(forms.ModelForm):
+class EditTermForm(forms.ModelForm):
     class Meta:
-        model = FeedbackAspect
+        model = Terms
         exclude = []
 
 
-date_of_birth = forms.DateField(label=_("Date of birth"))
-extend_register_form = Fieldset(date_of_birth)
-AccountRegisterForm.add_node_to_layout(extend_register_form)
+class RegisterEventAccount(SignupForm, ExtensibleForm):
+    """Form to register new user accounts."""
+
+    class Meta:
+        model = EventRegistration
+        fields = []
+
+    layout = Layout(
+        Fieldset(
+            _("Base data"),
+            Row("first_name", "last_name", "date_of_birth"),
+        ),
+        Fieldset(
+            _("Account data"),
+            "username",
+            Row("email", "email2"),
+            Row("password1", "password2"),
+        ),
+    )
+
+    first_name = forms.CharField(label=_("First name"))
+    last_name = forms.CharField(label=_("Last name"))
+    date_of_birth = forms.DateField(label=_("Date of birth"))
diff --git a/aleksis/apps/paweljong/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/paweljong/locale/de_DE/LC_MESSAGES/django.po
index f9afd270224952e0b35af279732a9b91048dd2d0..49fdf93cc540f85e50871d48e45b52b89be4ba3e 100644
--- a/aleksis/apps/paweljong/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/paweljong/locale/de_DE/LC_MESSAGES/django.po
@@ -3,581 +3,506 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-11-30 16:04+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2022-02-20 22:27+0000\n"
+"PO-Revision-Date: 2022-02-20 22:28+0000\n"
+"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n"
+"Language-Team: German <https://translate.edugit.org/projects/hacknfun/"
+"aleksis-app-paweljong/de/>\n"
+"Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.8\n"
 
 #: aleksis/apps/paweljong/filters.py:30
 msgid "Search by event"
-msgstr ""
+msgstr "Suche Veranstaltung"
 
 #: aleksis/apps/paweljong/filters.py:38
 msgid "Search by name"
-msgstr ""
+msgstr "Suche Name"
 
-#: aleksis/apps/paweljong/forms.py:20 aleksis/apps/paweljong/models.py:82
+#: aleksis/apps/paweljong/forms.py:16
 msgid "Only first name"
-msgstr ""
+msgstr "Nur Vorname"
 
-#: aleksis/apps/paweljong/forms.py:21 aleksis/apps/paweljong/models.py:83
+#: aleksis/apps/paweljong/forms.py:17
 msgid "First name and age"
-msgstr ""
+msgstr "Vor- und Nachname"
 
-#: aleksis/apps/paweljong/forms.py:22 aleksis/apps/paweljong/models.py:84
+#: aleksis/apps/paweljong/forms.py:18
 msgid "First name, last name and age"
-msgstr ""
+msgstr "Vor-, Nachname und Alter"
 
-#: aleksis/apps/paweljong/forms.py:26
+#: aleksis/apps/paweljong/forms.py:22
 msgid "Signature list"
-msgstr ""
+msgstr "Unterschriftenliste"
 
-#: aleksis/apps/paweljong/forms.py:27
+#: aleksis/apps/paweljong/forms.py:23
 msgid "Participants list"
-msgstr ""
+msgstr "Anwesenheitsliste"
 
-#: aleksis/apps/paweljong/forms.py:28
+#: aleksis/apps/paweljong/forms.py:24
 msgid "Corona attendance list"
-msgstr ""
+msgstr "Corona-Anwesenheitsliste"
 
-#: aleksis/apps/paweljong/forms.py:32 aleksis/apps/paweljong/models.py:88
+#: aleksis/apps/paweljong/forms.py:28
 msgid "Creative Commons with attribution, 4.0 or later"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:36 aleksis/apps/paweljong/models.py:92
-msgid "Creative Commons with attribution and distribution onlyunder the same conditions, 4.0 or later"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:49
-#, python-format
-msgid "%s is not a valid phone number"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:55
-msgid "The voucher is invalid!"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:122
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:18
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:50
-msgid "Comments"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:126 aleksis/apps/paweljong/forms.py:162
-#: aleksis/apps/paweljong/models.py:111
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:24
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:56
-msgid "Photos"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:130 aleksis/apps/paweljong/forms.py:203
-#: aleksis/apps/paweljong/models.py:40
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:6
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:7
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:21
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:55
-msgid "Feedback aspects"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:136
-msgid "Comment for the team"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:138
-msgid "This comment is for the team only. You can write down everything youwould like to give us as feedback here."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:146
-msgid "Comment for the website"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:148
-msgid "This comment is for the report on our website. Tell in detail about whatyou experienced, what you liked, what you learned and everything elseyou can think of."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:156 aleksis/apps/paweljong/models.py:108
-msgid "Information in the comment"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:158
-msgid "What information would you like to use to publish your comment?"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:166
-msgid "If you want to contribute photos to the report, you can upload them here. You canselect multiple files in most file selection dialogs with CTRL + click."
-msgstr ""
+msgstr "Creative Commons mit Namensnennung 4.0 International (CC BY 4.0) oder neuer"
 
-#: aleksis/apps/paweljong/forms.py:172 aleksis/apps/paweljong/models.py:113
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:29
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:61
-msgid "Photo licence"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:175
-msgid "If you upload photos, choose a license here."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:32
+msgid "Creative Commons with attribution and distribution only under the same conditions, 4.0 or later"
+msgstr "Creative Commons mit  Namensnennung und Weitergabe unter gleichen Bedingungen, 4.0 oder später"
 
-#: aleksis/apps/paweljong/forms.py:197
+#: aleksis/apps/paweljong/forms.py:44 aleksis/apps/paweljong/forms.py:459
 msgid "Base data"
-msgstr ""
+msgstr "Basisdaten"
 
-#: aleksis/apps/paweljong/forms.py:201
+#: aleksis/apps/paweljong/forms.py:48
 msgid "Date data"
-msgstr ""
+msgstr "Kalenderdaten"
 
-#: aleksis/apps/paweljong/forms.py:202
+#: aleksis/apps/paweljong/forms.py:49
 msgid "Event details"
-msgstr ""
+msgstr "Veranstaltungsdetails"
 
-#: aleksis/apps/paweljong/forms.py:229
-msgid "Event the voucher is valid for."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:50 aleksis/apps/paweljong/menus.py:29
+#: aleksis/apps/paweljong/models.py:42
+#: aleksis/apps/paweljong/templates/paweljong/term/list.html:6
+#: aleksis/apps/paweljong/templates/paweljong/term/list.html:7
+msgid "Terms"
+msgstr "Bedingungen"
 
-#: aleksis/apps/paweljong/forms.py:230
-msgid "Person the voucher is valid for."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:99
+msgid "Event the voucher is valid for"
+msgstr "Veranstaltungsgutschein ist gültig für"
 
-#: aleksis/apps/paweljong/forms.py:231
-msgid "Voucher discount."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:100
+msgid "Person the voucher is valid for"
+msgstr "Person, für die der Gutschein gültig ist"
+
+#: aleksis/apps/paweljong/forms.py:101
+msgid "Voucher discount"
+msgstr "Rabatt"
 
-#: aleksis/apps/paweljong/forms.py:239 aleksis/apps/paweljong/models.py:22
+#: aleksis/apps/paweljong/forms.py:109 aleksis/apps/paweljong/models.py:27
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:8
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:40
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:36
 msgid "Group"
-msgstr ""
+msgstr "Gruppe"
 
-#: aleksis/apps/paweljong/forms.py:241
-msgid "Select group to generate list."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:111
+msgid "Select group to generate list"
+msgstr "Gruppe auswählen, für die die Liste generiert werden soll"
 
-#: aleksis/apps/paweljong/forms.py:245
+#: aleksis/apps/paweljong/forms.py:115
 msgid "Template"
-msgstr ""
+msgstr "Vorlage"
 
-#: aleksis/apps/paweljong/forms.py:247
-msgid "Select template to generate list."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:117
+msgid "Select template to generate list"
+msgstr "Vorlage auswählen, um Liste zu generieren"
 
-#: aleksis/apps/paweljong/forms.py:251
+#: aleksis/apps/paweljong/forms.py:121
 msgid "Landscape"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:252
-msgid "Select if output should be in landscape."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:261
-msgid "Address data"
-msgstr ""
+msgstr "Querformat"
 
-#: aleksis/apps/paweljong/forms.py:266
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:35
-msgid "Contact details"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:270
-msgid "Personal data"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:274
-msgid "School details"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:122
+msgid "Select if output should be in landscape"
+msgstr "Wähle, ob die Ausgabe im Querformat sein soll"
 
-#: aleksis/apps/paweljong/forms.py:278
+#: aleksis/apps/paweljong/forms.py:134
 msgid "Guardians personal data"
-msgstr ""
+msgstr "Persönliche Daten der Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:282
+#: aleksis/apps/paweljong/forms.py:138
 msgid "Guardians contact details"
-msgstr ""
+msgstr "Kontaktdaten der Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:286 aleksis/apps/paweljong/forms.py:457
-msgid "General event information"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:144
+msgid "Guardian's first name"
+msgstr "Vorname des Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:291 aleksis/apps/paweljong/forms.py:462
-msgid "Financial data"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:296 aleksis/apps/paweljong/forms.py:467
-msgid "Declaration of consent"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:306 aleksis/apps/paweljong/forms.py:476
-msgid "If you have a voucher for the event, enter the code here.It will be charged automatically."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:321
-msgid "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn withcreditor ID DE70FZT00001497650, to collect the participant fee from my accountonce using the SEPA core direct debit. At the same time, I instruct my bank toredeem the SEPA core direct debit withdrawn from my account by  e.V."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:327 aleksis/apps/paweljong/forms.py:497
-msgid "If your parents want to pay by SEPA direct debit,please let them fill out this field."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:331
-msgid "Parents: My child filled out the registration form together with me, but myself,and I agree to the participation, the terms of use and the terms and conditions.I am aware that the registration is binding and that withdrawal is only possiblein exceptional cases with a valid reason. In addition, I agree to pay theparticipation fee in advance and agree to the reimbursement guidelinesmentioned above."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:146
+msgid "Please enter the first name of the legal guardian who will fill in the registration with you and who can be reached during the event in an emergency."
+msgstr "Bitte gib den Vornamen des Erziehungsberechtigten ein, der die Anmeldung mit Dir ausfüllt und in Notfällen während der Veranstaltung erreichbar ist."
 
-#: aleksis/apps/paweljong/forms.py:339
-msgid "I consent to the processing of my data as stated in theterms of use and all the data provided is correct. If I am under theage of 16, my parents also agree to this and I can prove this on request(e.g. by making contact with my parents)."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:152
+msgid "Guardian's last name"
+msgstr "Nachname des Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:344 aleksis/apps/paweljong/forms.py:514
-msgid "I agree with theAGB and have read them."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:154
+msgid "Please enter the last name of the legal guardian who will fill in the registration with you and who can be reached during the event in an emergency."
+msgstr "Bitte gib den Nachnamen des Erziehungsberechtigten ein, der die Anmeldung mit Dir ausfüllt und in Notfällen während der Veranstaltung erreichbar ist."
 
-#: aleksis/apps/paweljong/forms.py:345 aleksis/apps/paweljong/forms.py:515
-msgid "How did you find out about the event?"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:160
+msgid "Guardian's mobile number"
+msgstr "Handynummer des Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:349
-msgid "Guardians first name"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:162
+msgid "We need the mobile phone number for emergencies if we urgently need to reach your parents during the event."
+msgstr "Wir benötigen die Handynummer für Notfälle, wenn wir deine Eltern während der Veranstaltung dringend erreichen müssen."
 
-#: aleksis/apps/paweljong/forms.py:351
-msgid "Please enter the first name of the legal guardian who will fill in the registrationwith you and who can be reached during the event in an emergency."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:168
+msgid "Guardian's email address"
+msgstr "E-Mail-Adresse des Erziehungsberechtigten"
 
-#: aleksis/apps/paweljong/forms.py:357
-msgid "Guardians last name"
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:359
-msgid "Please enter the last name of the legal guardian who will fill in the registrationwith you and who can be reached during the event in an emergency."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:179
+msgid "Personal data"
+msgstr "Persönliche Daten"
 
-#: aleksis/apps/paweljong/forms.py:365
-msgid "Guardians mobile number"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:184
+msgid "Address data"
+msgstr "Addressdaten"
 
-#: aleksis/apps/paweljong/forms.py:367
-msgid "We need the mobile phone number for emergencies if weurgently need to reach your parents during the event."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:189
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:35
+msgid "Contact details"
+msgstr "Kontaktdaten"
 
-#: aleksis/apps/paweljong/forms.py:373
-msgid "Guardians email address"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:193
+msgid "School details"
+msgstr "Angaben zur Schule"
 
-#: aleksis/apps/paweljong/forms.py:377
-msgid "Voucher code"
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:199 aleksis/apps/paweljong/forms.py:470
+#: aleksis/apps/paweljong/templates/paweljong/print/corona.html:20
+#: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:20
+#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:21
+#: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:21
+msgid "First name"
+msgstr "Vorname"
 
-#: aleksis/apps/paweljong/forms.py:378
-msgid "If you have a voucher code, type it in here."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:204 aleksis/apps/paweljong/forms.py:471
+#: aleksis/apps/paweljong/templates/paweljong/print/corona.html:19
+#: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:19
+#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:20
+#: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:20
+msgid "Last name"
+msgstr "Nachname"
 
-#: aleksis/apps/paweljong/forms.py:383
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:18
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:61
+#: aleksis/apps/paweljong/forms.py:209
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:18
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:71
 msgid "Street"
-msgstr ""
+msgstr "Straße"
 
-#: aleksis/apps/paweljong/forms.py:387
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:19
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:62
+#: aleksis/apps/paweljong/forms.py:213
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:19
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:72
 msgid "Housenumber"
-msgstr ""
+msgstr "Hausnummer"
 
-#: aleksis/apps/paweljong/forms.py:391
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:20
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:63
+#: aleksis/apps/paweljong/forms.py:217
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:20
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:73
 msgid "Postal code"
-msgstr ""
+msgstr "Postleitzahl"
 
-#: aleksis/apps/paweljong/forms.py:395
+#: aleksis/apps/paweljong/forms.py:221
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:11
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:43
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:21
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:64
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:39
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:21
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:74
 msgid "Place"
-msgstr ""
+msgstr "Stadt"
 
-#: aleksis/apps/paweljong/forms.py:399
+#: aleksis/apps/paweljong/forms.py:225
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:22
 #: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:23
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:17
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:27
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:60
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:70
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:17
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:27
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:70
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:80
 msgid "Mobile number"
-msgstr ""
+msgstr "Handynummer"
 
-#: aleksis/apps/paweljong/forms.py:402
-msgid "Your mobile number helps us to reach you in an emergency during the event, e.g.if you are alone with your group at a conference or similar. If you don't have acell phone, you can leave the field blank."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:228
+msgid "Your mobile number helps us to reach you in an emergency during the event, e.g. if you are alone with your group at a conference or similar. If you don't have a cell phone, you can leave the field blank."
+msgstr "deine Handynummer hilft uns, dich bei Notfällen während der Veranstaltung zu erreichen, z.B. wenn du alleine mit deiner Gruppe auf einer Konferenz unterwegs bist. Wenn du kein Handy hast, kannst du dieses Feld ignorieren."
 
-#: aleksis/apps/paweljong/forms.py:410 aleksis/apps/paweljong/forms.py:526
+#: aleksis/apps/paweljong/forms.py:235 aleksis/apps/paweljong/forms.py:472
 #: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:22
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:15
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:47
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:15
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:58
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:15
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:68
 msgid "Date of birth"
-msgstr ""
+msgstr "Geburtsdatum"
 
-#: aleksis/apps/paweljong/forms.py:414
+#: aleksis/apps/paweljong/forms.py:239
 msgid "Sex"
-msgstr ""
+msgstr "Geschlecht"
 
-#: aleksis/apps/paweljong/forms.py:416
-msgid "For various reasons, e.g. because we have to keep gender segregation during the nightfor legal reasons, we need to know if you are a boy or a girl. With some names this isnot always immediately recognizable, so we ask you to indicate it here."
-msgstr ""
-
-#: aleksis/apps/paweljong/forms.py:425
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:16
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:48
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:16
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:26
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:59
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:69
+#: aleksis/apps/paweljong/forms.py:241
+msgid "For various reasons, e.g. because we have to keep gender segregation during the night for legal reasons, we need to know if you are a boy or a girl."
+msgstr "Aus verschiedenen Gründen, z.B da wir aus rechtlichen Gründen die Geschlechtertrennung während der Nacht aufrechterhalten müssen, müssen wir wissen, ob du ein Junge oder ein Mädchen bist."
+
+#: aleksis/apps/paweljong/forms.py:249
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:16
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:26
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:69
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:79
 msgid "Email address"
-msgstr ""
+msgstr "E-Mail-Adresse"
 
-#: aleksis/apps/paweljong/forms.py:429
-#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:24
+#: aleksis/apps/paweljong/forms.py:251
+msgid "Please use your personal e-mail address here, which you will check personally. Important information will always be sent to your parents as well. Do not use an e-mail address owned by your parents here."
+msgstr "Bitte nutze hier deine persönliche E-Mail-Adresse, welche du persönlich abrufst. Wichtige Informationen senden wir immer zusätzlich an deine Eltern. Bitte nutze hier nicht die E-Mail-Adresse deiner Eltern."
+
+#: aleksis/apps/paweljong/forms.py:258
 msgid "School"
-msgstr ""
+msgstr "Schule"
 
-#: aleksis/apps/paweljong/forms.py:430
-msgid "Please enter the name of your school as exactly as it should be written."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:259
+msgid "Please enter the name of your school."
+msgstr "Bitte trage den Namen deiner Schule ein."
 
-#: aleksis/apps/paweljong/forms.py:434
+#: aleksis/apps/paweljong/forms.py:263
 msgid "School place"
-msgstr ""
+msgstr "Ort der Schule"
 
-#: aleksis/apps/paweljong/forms.py:435
-msgid "Enter the place (city) where your school is located (without a district)."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:264
+msgid "Enter the place (city) where your school is located."
+msgstr "Bitte trage die Stadt ein, wo sich deine Schule befindet."
 
-#: aleksis/apps/paweljong/forms.py:439
-#: aleksis/apps/paweljong/model_extensions.py:9
+#: aleksis/apps/paweljong/forms.py:268 aleksis/apps/paweljong/models.py:130
 msgid "School class"
-msgstr ""
+msgstr "Schulklasse"
 
-#: aleksis/apps/paweljong/forms.py:440
-msgid "Please enter the class you are going to (e.g. 8a)."
-msgstr ""
+#: aleksis/apps/paweljong/forms.py:269
+msgid "Please enter the class you are in (e.g. 8a)."
+msgstr "Bitte trage die Klasse ein, in die du gehst (z.B. 8a)."
+
+#: aleksis/apps/paweljong/forms.py:277 aleksis/apps/paweljong/models.py:135
+msgid "Medical information / intolerances"
+msgstr "Medizinische Informationen / Intoleranzen"
+
+#: aleksis/apps/paweljong/forms.py:281
+msgid "Other remarks"
+msgstr "Sonstige Anmerkungen"
+
+#: aleksis/apps/paweljong/forms.py:291
+msgid "If there are any medically important things we need to consider, e.g. when making food or to make sure you take prescribed medication, please enter it here."
+msgstr "Wenn es medizinisch wichtige Dinge gibt, die wir berücksichtigen müssen, z.B bei der Zubereitung von Speisen oder zur Sicherstellung der Einnahme verordneter Medikamente, trage diese bitte hier ein."
 
-#: aleksis/apps/paweljong/forms.py:491
-msgid "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn withcreditor ID DE70FZT00001497650, to collect the participant fee from my accountonce using the SEPA core direct debit. At the same time, I instruct my bankto redeem the SEPA core direct debit withdrawn from my account by  e.V."
+#: aleksis/apps/paweljong/forms.py:295
+msgid "You can write down any remarks you want to tell us here."
+msgstr "Du kannst hier alles rein schreiben, was du uns mitteilen möchtest."
+
+#: aleksis/apps/paweljong/forms.py:316 aleksis/apps/paweljong/forms.py:387
+msgid "Financial data"
+msgstr "Angaben zur Bezahlung"
+
+#: aleksis/apps/paweljong/forms.py:324
+msgid "Voucher code"
+msgstr "Gutscheincode"
+
+#: aleksis/apps/paweljong/forms.py:325
+msgid "If you have a voucher code, type it in here."
+msgstr "Wenn du einen Gutscheincode hast, gib diesen hier ein."
+
+#: aleksis/apps/paweljong/forms.py:332
+msgid "Please enter your IBAN"
+msgstr "Bitte trage eine IBAN ein"
+
+#: aleksis/apps/paweljong/forms.py:339
+msgid "Our association would like to offer all children and young people the opportunity to participate in our events. Sometimes, however, families cannot afford the full fee. We therefore have a budget from which we can promote participation after we have carefully examined the necessity and eligibility. We rely on donations for this budget. If you would like to donate a voluntary additional amount for this budget, please indicate this here."
+msgstr "Unser Verein möchte allen Kindern und Jugendlichen die Möglichkeit bieten, an unseren Veranstaltungen teilzunehmen. Manchmal können sich Familien jedoch nicht die volle Gebühr leisten. Wir haben also ein Budget, aus dem wir die Teilnahme fördern können, nachdem wir die Notwendigkeit und Förderfähigkeit sorgfältig geprüft haben. Für dieses Budget sind wir auf Spenden angewiesen. Wenn Sie für dieses Budget einen freiwilligen Zusatzbetrag spenden möchten, geben Sie dies bitte hier an."
+
+#: aleksis/apps/paweljong/forms.py:348
+msgid "Parents: I authorize the creditor Teckids e.V., Kennedyallee 18, 53175 Bonn with creditor ID DE70ZZZ00001497650, to collect the participant fee from my account once using the SEPA core direct debit. At the same time, I instruct my bank to redeem the SEPA core direct debit withdrawn from my account by Teckids e.V."
+msgstr "Eltern: Ich ermächtige den Gläubiger Teckids e.V., Kennedyallee 18, 53175 Bonn mit der Gläubiger-ID DE70ZZZ00001497650, den Teilnehmerbeitrag einmalig per SEPA-Basislastschrift von meinem Konto einzuziehen. Zugleich weise ich mein Kreditinstitut an, die von Teckids e.V. von meinem Konto eingezogene SEPA-Basislastschrift einzulösen."
+
+#: aleksis/apps/paweljong/forms.py:354 aleksis/apps/paweljong/forms.py:422
+msgid "If your parents want to pay by SEPA direct debit, please let them fill out this field."
+msgstr "Wenn deine Eltern per SEPA-Lastschrift bezahlen möchten, lasse sie dieses Feld ausfüllen."
+
+#: aleksis/apps/paweljong/forms.py:382
+msgid "General event information"
+msgstr "Generelle Veranstaltungsinformationen"
+
+#: aleksis/apps/paweljong/forms.py:392
+msgid "Declaration of consent"
+msgstr "Einverständniserklärung"
+
+#: aleksis/apps/paweljong/forms.py:401
+msgid "If you have a voucher for the event, enter the code here.It will be charged automatically."
+msgstr "Wenn du einen Gutschein für diese Veranstaltung hast, gib den Code hier ein. Er wird automatisch verrechnet."
+
+#: aleksis/apps/paweljong/forms.py:416
+msgid "Parents: I authorize the creditor  e.V., Rochusstr. 2-4, 53123 Bonn with creditor ID DE70FZT00001497650, to collect the participant fee from my account once using the SEPA core direct debit. At the same time, I instruct my bank to redeem the SEPA core direct debit withdrawn from my account by  e.V."
+msgstr "Eltern: Ich ermächtige den Gläubiger Teckids e.V., Kennedyallee 18, 53175 Bonn mit der Gläubiger-ID DE70ZZZ00001497650, den Teilnehmerbeitrag einmalig per SEPA-Basislastschrift von meinem Konto einzuziehen. Zugleich weise ich mein Kreditinstitut an, die von Teckids e.V. von meinem Konto eingezogene SEPA-Basislastschrift einzulösen."
+
+#: aleksis/apps/paweljong/forms.py:426
+msgid "Parents: My child filled out the registration form together with me, but myself, and I agree to the participation, the terms of use and the terms and conditions. I am aware that the registration is binding and that withdrawal is only possible in exceptional cases with a valid reason. In addition, I agree to pay the participation fee in advance and agree to the reimbursement guidelines mentioned above."
 msgstr ""
 
-#: aleksis/apps/paweljong/forms.py:501
-msgid "Parents: My child filled out the registration form together with me, but myself,and I agree to the participation, the terms of use and the terms and conditions.I am aware that the registration is binding and that withdrawal is only possiblein exceptional cases with a valid reason. In addition, I agree to pay theparticipation fee in advance and agree to the reimbursementguidelines mentioned above."
+#: aleksis/apps/paweljong/forms.py:434
+msgid "I consent to the processing of my data as stated in the terms of use and all the data provided is correct. If I am under the age of 16, my parents also agree to this and I can prove this on request (e.g. by making contact with my parents)."
 msgstr ""
 
-#: aleksis/apps/paweljong/forms.py:509
-msgid "I consent to the processing of my data as stated in theterms of use and all the data provided is correct. If I am underthe age of 16, my parents also agree to this and I can prove this onrequest (e.g. by making contact with my parents)."
+#: aleksis/apps/paweljong/forms.py:439
+msgid "I agree with theAGB and have read them."
 msgstr ""
 
+#: aleksis/apps/paweljong/forms.py:463
+msgid "Account data"
+msgstr "Kontodaten"
+
 #: aleksis/apps/paweljong/menus.py:6
 #: aleksis/apps/paweljong/templates/paweljong/event/list.html:5
 #: aleksis/apps/paweljong/templates/paweljong/event/list.html:6
 msgid "Events"
-msgstr ""
+msgstr "Veranstaltungen"
 
-#: aleksis/apps/paweljong/menus.py:11 aleksis/apps/paweljong/models.py:119
-#: aleksis/apps/paweljong/models.py:120
+#: aleksis/apps/paweljong/menus.py:18 aleksis/apps/paweljong/models.py:85
+#: aleksis/apps/paweljong/models.py:86
 #: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:6
 #: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:7
 msgid "Vouchers"
-msgstr ""
-
-#: aleksis/apps/paweljong/menus.py:23
-msgid "Voucher overview"
-msgstr ""
-
-#: aleksis/apps/paweljong/menus.py:34
-msgid "Create voucher"
-msgstr ""
-
-#: aleksis/apps/paweljong/menus.py:47
-msgid "Event management"
-msgstr ""
-
-#: aleksis/apps/paweljong/menus.py:59
-msgid "Create event"
-msgstr ""
+msgstr "Gutscheine"
 
-#: aleksis/apps/paweljong/menus.py:70
-msgid "Manage feedback aspects"
-msgstr ""
-
-#: aleksis/apps/paweljong/menus.py:81
+#: aleksis/apps/paweljong/menus.py:40
 msgid "Generate participant list"
-msgstr ""
+msgstr "Teilnehmerlisten generieren"
 
-#: aleksis/apps/paweljong/menus.py:92
-msgid "Manage upcoming events"
-msgstr ""
+#: aleksis/apps/paweljong/menus.py:51
+#: aleksis/apps/paweljong/templates/paweljong/event/list.html:10
+msgid "Upcoming events"
+msgstr "Anstehende Veranstaltungen"
 
-#: aleksis/apps/paweljong/menus.py:103
-msgid "Manage registrations"
-msgstr ""
+#: aleksis/apps/paweljong/menus.py:62
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:6
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:7
+msgid "Registrations"
+msgstr "Anmeldungen"
 
-#: aleksis/apps/paweljong/model_extensions.py:8
-msgid "Name of school"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:15
+msgid "Title"
+msgstr "Titel"
 
-#: aleksis/apps/paweljong/model_extensions.py:10
-msgid "Place of the school"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:16
+msgid "Term"
+msgstr "Bedingung"
+
+#: aleksis/apps/paweljong/models.py:17
+msgid "Confirmation text"
+msgstr "Bestätigungstext"
 
-#: aleksis/apps/paweljong/models.py:20
+#: aleksis/apps/paweljong/models.py:25
 msgid "Display name"
-msgstr ""
+msgstr "Anzeigename"
 
-#: aleksis/apps/paweljong/models.py:24
+#: aleksis/apps/paweljong/models.py:29
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:9
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:41
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:37
 msgid "Description"
-msgstr ""
+msgstr "Beschreibung"
 
-#: aleksis/apps/paweljong/models.py:25
+#: aleksis/apps/paweljong/models.py:30
 msgid "Publish"
-msgstr ""
+msgstr "Veröffentlichen"
 
-#: aleksis/apps/paweljong/models.py:29
+#: aleksis/apps/paweljong/models.py:34
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:12
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:44
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:40
 msgid "Date of event"
-msgstr ""
+msgstr "Datum der Veranstaltung"
 
-#: aleksis/apps/paweljong/models.py:30
+#: aleksis/apps/paweljong/models.py:35
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:13
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:45
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:41
 msgid "Registration deadline"
-msgstr ""
+msgstr "Anmeldungsschluss"
 
-#: aleksis/apps/paweljong/models.py:31
+#: aleksis/apps/paweljong/models.py:36
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:14
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:46
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:42
 msgid "Retraction deadline"
-msgstr ""
+msgstr "Kündigungsfrist"
 
-#: aleksis/apps/paweljong/models.py:34
+#: aleksis/apps/paweljong/models.py:39
 msgid "Cost in €"
-msgstr ""
+msgstr "Kosten in €"
 
-#: aleksis/apps/paweljong/models.py:35
+#: aleksis/apps/paweljong/models.py:40
 msgid "Maximum participants"
-msgstr ""
+msgstr "Maximale Teilnehmerzahl"
 
-#: aleksis/apps/paweljong/models.py:36
-msgid "Website of event"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:78
-msgid "Event feedback"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:79
-msgid "Event feedbacks"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:99 aleksis/apps/paweljong/models.py:126
-#: aleksis/apps/paweljong/models.py:157 aleksis/apps/paweljong/tables.py:11
-#: aleksis/apps/paweljong/tables.py:28 aleksis/apps/paweljong/tables.py:43
-#: aleksis/apps/paweljong/tables.py:57
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:8
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:10
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:40
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:42
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:8
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:10
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:51
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:53
+#: aleksis/apps/paweljong/models.py:41
+msgid "Information about the event"
+msgstr "Informationen über die Veranstaltung"
+
+#: aleksis/apps/paweljong/models.py:92 aleksis/apps/paweljong/models.py:125
+#: aleksis/apps/paweljong/tables.py:11 aleksis/apps/paweljong/tables.py:28
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:4
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:8
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:10
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:61
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:63
 msgid "Event"
-msgstr ""
+msgstr "Veranstaltung"
 
-#: aleksis/apps/paweljong/models.py:102 aleksis/apps/paweljong/models.py:133
-#: aleksis/apps/paweljong/models.py:158 aleksis/apps/paweljong/tables.py:60
+#: aleksis/apps/paweljong/models.py:99 aleksis/apps/paweljong/models.py:126
+#: aleksis/apps/paweljong/tables.py:31
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:12
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:65
 msgid "Person"
-msgstr ""
+msgstr "Person"
 
-#: aleksis/apps/paweljong/models.py:105
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:20
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:52
-msgid "Private comment"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:106
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:21
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:53
-msgid "Public comment"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:142
+#: aleksis/apps/paweljong/models.py:108
 msgid "Used by"
-msgstr ""
+msgstr "Benutzt von"
 
-#: aleksis/apps/paweljong/models.py:154
-#: aleksis/apps/paweljong/templates/paweljong/register.html:4
-#: aleksis/apps/paweljong/templates/paweljong/register.html:5
-#: aleksis/apps/paweljong/templates/paweljong/register.html:9
-msgid "Registration"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:127
+msgid "Registration date"
+msgstr "Anmeldedatum"
 
-#: aleksis/apps/paweljong/models.py:155
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:6
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:7
-msgid "Registrations"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:129
+msgid "Name of school"
+msgstr "Name der Schule"
 
-#: aleksis/apps/paweljong/models.py:159
-msgid "Registration date"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:131
+msgid "Place of the school"
+msgstr "Ort der Schule"
 
-#: aleksis/apps/paweljong/models.py:161
+#: aleksis/apps/paweljong/models.py:133
 msgid "Comment / remarks"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:162
-msgid "Channel"
-msgstr ""
+msgstr "Kommentar / Anmerkungen"
 
-#: aleksis/apps/paweljong/models.py:166
+#: aleksis/apps/paweljong/models.py:140
 msgid "Voucher"
-msgstr ""
+msgstr "Gutschein"
 
-#: aleksis/apps/paweljong/models.py:170
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:31
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:74
+#: aleksis/apps/paweljong/models.py:144
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:31
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:84
 msgid "Donation"
-msgstr ""
+msgstr "Spende"
 
-#: aleksis/apps/paweljong/models.py:172
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:122
+#: aleksis/apps/paweljong/models.py:147
+msgid "Accepted terms"
+msgstr "Akzeptierte Bedingungen"
+
+#: aleksis/apps/paweljong/models.py:151
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:131
 msgid "SEPA direct debit"
-msgstr ""
+msgstr "SEPA-Lastschriftmandat"
 
-#: aleksis/apps/paweljong/models.py:174
+#: aleksis/apps/paweljong/models.py:153
 msgid "IBAN (for SEPA direct debit)"
-msgstr ""
-
-#: aleksis/apps/paweljong/models.py:179
-msgid "Delcaration of consent by parents"
-msgstr ""
+msgstr "IBAN (für SEPA-Lastschriftmandat)"
 
-#: aleksis/apps/paweljong/models.py:180
-msgid "Declaration of consent data protection"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:163 aleksis/apps/paweljong/views.py:310
+msgid "Event registration"
+msgstr "Veranstaltungsanmeldung"
 
-#: aleksis/apps/paweljong/models.py:182
-msgid "Declatation of consent terms and condition"
-msgstr ""
+#: aleksis/apps/paweljong/models.py:164
+msgid "Event registrations"
+msgstr "Veranstaltungsanmeldungen"
 
 #: aleksis/apps/paweljong/preferences.py:17
 msgid "Newsletter choices (comma-seperated)"
@@ -587,654 +512,650 @@ msgstr ""
 msgid "POST url for Sympa"
 msgstr ""
 
-#: aleksis/apps/paweljong/preferences.py:35
-msgid "Channel choices"
-msgstr ""
-
-#: aleksis/apps/paweljong/tables.py:12 aleksis/apps/paweljong/tables.py:29
-#: aleksis/apps/paweljong/tables.py:44
+#: aleksis/apps/paweljong/tables.py:12
 msgid "Date"
-msgstr ""
+msgstr "Datum"
 
-#: aleksis/apps/paweljong/tables.py:13 aleksis/apps/paweljong/tables.py:45
+#: aleksis/apps/paweljong/tables.py:13
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:16
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:48
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:44
 msgid "Max. participants"
-msgstr ""
+msgstr "Maximale Teilnehmerzahl"
 
-#: aleksis/apps/paweljong/tables.py:14 aleksis/apps/paweljong/tables.py:46
+#: aleksis/apps/paweljong/tables.py:14
 msgid "Registration until"
-msgstr ""
+msgstr "Anmeldung möglich bis"
 
 #: aleksis/apps/paweljong/tables.py:19 aleksis/apps/paweljong/tables.py:20
-msgid "Register"
-msgstr ""
-
-#: aleksis/apps/paweljong/tables.py:34 aleksis/apps/paweljong/tables.py:35
-msgid "Feedback"
-msgstr ""
-
-#: aleksis/apps/paweljong/tables.py:49 aleksis/apps/paweljong/tables.py:68
-#: aleksis/apps/paweljong/tables.py:99 aleksis/apps/paweljong/tables.py:100
+#: aleksis/apps/paweljong/tables.py:39 aleksis/apps/paweljong/tables.py:70
+#: aleksis/apps/paweljong/tables.py:71
 #: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:21
 msgid "Edit"
-msgstr ""
+msgstr "Bearbeiten"
 
-#: aleksis/apps/paweljong/tables.py:58
+#: aleksis/apps/paweljong/tables.py:29
 msgid "Amount"
-msgstr ""
+msgstr "Betrag"
 
-#: aleksis/apps/paweljong/tables.py:59
+#: aleksis/apps/paweljong/tables.py:30
 msgid "Code"
-msgstr ""
+msgstr "Code"
 
-#: aleksis/apps/paweljong/tables.py:64 aleksis/apps/paweljong/tables.py:65
+#: aleksis/apps/paweljong/tables.py:35 aleksis/apps/paweljong/tables.py:36
 #: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:28
 msgid "Delete"
-msgstr ""
+msgstr "Löschen"
 
-#: aleksis/apps/paweljong/tables.py:71
+#: aleksis/apps/paweljong/tables.py:42
 #: aleksis/apps/paweljong/templates/paweljong/print/manage.html:11
 msgid "Print"
-msgstr ""
+msgstr "Drucken"
 
-#: aleksis/apps/paweljong/tables.py:85
+#: aleksis/apps/paweljong/tables.py:56
 msgid "View registration"
-msgstr ""
+msgstr "Anmeldung ansehen"
 
-#: aleksis/apps/paweljong/tables.py:86
+#: aleksis/apps/paweljong/tables.py:57
 msgid "View"
-msgstr ""
+msgstr "Ansehen"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/create.html:4
+#: aleksis/apps/paweljong/templates/paweljong/event/create.html:5
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:20
+msgid "Create event"
+msgstr "Veranstaltung erstellen"
 
 #: aleksis/apps/paweljong/templates/paweljong/event/edit.html:4
 #: aleksis/apps/paweljong/templates/paweljong/event/edit.html:5
 msgid "Edit event"
-msgstr ""
+msgstr "Veranstaltung bearbeiten"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:4
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:5
-msgid "Feedback on an event"
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:32
+#, python-format
+msgid ""
+"\n"
+"               The event takes place in <strong>%(event.place)s</strong>\n"
+"               (Information on overnight stays and shared trips see description)\n"
+"             "
 msgstr ""
+"\n"
+"               Die Veranstaltung findet in<strong>%(event.place)s</strong> statt\n"
+"               (Informationen über Übernachtungen und Ausflüge findest du in der Beschreibung)\n"
+"             "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:9
-msgid "Feedback on"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:38
+msgid "Registration possible until"
+msgstr "Anmeldung möglich bis"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:16
-msgid "How does the feedback work?"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:41
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:15
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:43
+msgid "Cost"
+msgstr "Kosten"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:18
-msgid ""
-"\n"
-"       The feedback consists of three parts.\n"
-"      "
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:41
+msgid "incl. program, overnight stays, trips and meals"
+msgstr "inkl. Programm, Ãœbernachtungen Fahrten und Mahlzeiten"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:24
-msgid "Evaluation of the program points from 1 (not good) to 5 (very good)"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:42
+msgid "(if part of the event)"
+msgstr "(falls Teil der Veranstaltung)"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:27
-msgid "Private commentary where you can tell us what you liked, what didn't, what we should do differently, etc."
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:45
+msgid "Booked participants slots"
+msgstr "Gebuchte Teilnehmerplätze"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:30
-msgid "Comment for the report, which helps us and other children to learn as much as possible about the event. What you have experienced yourself is very interesting for the next participants!"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:45
+msgid "of"
+msgstr "von"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/feedback.html:34
-msgid "Your feedback will be emailed to us. We may contact you again."
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:58
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:60
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:101
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:111
+msgid "Register now"
+msgstr "Jetzt anmelden"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/list.html:10
-#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:10
-msgid "Upcoming events"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/full.html:62
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:77
+msgid "Not available"
+msgstr "Nicht verfügbar"
 
 #: aleksis/apps/paweljong/templates/paweljong/event/list.html:17
 msgid "Events you've taken part"
-msgstr ""
+msgstr "Veranstaltungen an denen du teilgenommen hast"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:5
 #: aleksis/apps/paweljong/templates/paweljong/event/manage.html:6
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:7
 msgid "Manage events"
-msgstr ""
+msgstr "Veranstaltungen verwalten"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:4
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:5
-msgid "Event registration"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:11
+msgid "Filter events"
+msgstr "Veranstaltungen filtern"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:9
-msgid "Registration for"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:14
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:14
+#: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:14
+msgid "Search"
+msgstr "Suche"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:16
-msgid "Information for parents"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:18
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:18
+#: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:18
+msgid "Clear"
+msgstr "Leeren"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:18
-msgid ""
-"\n"
-"       Please go through the registration with your child.  It is important\n"
-"       to us to train important skills in dealing with the Internet and\n"
-"       responsibility in general with the registration.\n"
-"      "
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/manage.html:23
+msgid "Selected events"
+msgstr "Ausgewähle Veranstaltungen"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:26
-msgid "Information for children"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:4
+msgid "Register for"
+msgstr "Anmelden für"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:28
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:20
 msgid ""
 "\n"
-"       Please read everything carefully with your parents and then send your\n"
-"       registration together with them!\n"
-"      "
+"           Welcome to the registration for this event! Please make sure to fill in\n"
+"           the registration yourself, as the child who wants to participate.\n"
+"           You should fill in the registration together with a parent (or other legal\n"
+"           guardian).\n"
+"           "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:39
-msgid "Information about the event"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:41
-msgid ""
 "\n"
-"       Please read the\n"
-"      "
-msgstr ""
+"           Willkommen bei der Anmeldung für diese Veranstaltung! Bitte achte darauf,\n"
+"           die Anmeldung selbst auszufüllen. Du solltest diese Anmeldung zusammen mit\n"
+"           deinen Eltern oder Erziehungsberechtigten ausfüllen.\n"
+"           "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:46
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:28
 msgid ""
 "\n"
-"        website of the event\n"
-"       "
+"           We ask parents to not fill in the registration on behalf of their child.\n"
+"           "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:51
-msgid ""
 "\n"
-"       carefully together with your parents.\n"
-"      "
-msgstr ""
+"           Wir bitten die Eltern darum, diese Anmeldung nicht stellvertretend für ihr Kind auszufüllen.\n"
+"           "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:57
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:33
 msgid ""
 "\n"
-"        The event will take place from\n"
-"       "
+"           Every participant needs a personal e-mail address. This address must be one\n"
+"           that you, the participating child, check and read yourself, not one owned by your\n"
+"           parents. Of course, we will always send important information to your parents as well.\n"
+"           "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:63
-msgid ""
 "\n"
-"       at\n"
-"       "
-msgstr ""
+"           Jeder Teilnehmende benötigt seine eigene E-Mail-Adresse. Diese Adresse muss eine Adresse sein,\n"
+"           die du selbst abrufst und liest, und die nicht deinen Eltern gehört.\n"
+"           Wichtige Informationen senden wir natürlich immer zusätzlich an deine Eltern.\n"
+"           "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:71
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:40
 msgid ""
 "\n"
-"        Registration is possible until\n"
-"       "
+"           If you do not have a personal e-mail address yet, and do not want or cannot register\n"
+"           one with one of the \"big\" providers (keep in mind that Google, Outlook, etc. are\n"
+"           allowed from 16 years only, and often collect and analyse your private mail), you can\n"
+"           register an e-mail address with us.\n"
+"           "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:77
-msgid ""
 "\n"
-"        the number of participants is limited to\n"
-"       "
-msgstr ""
+"           Wenn du bisher keine eigene E-Mail-Adresse hast, und keine bei den \"großen\"\n"
+"           Anbietern anlegen kannst oder möchtest (Denke daran, dass Google, Outund etc.\n"
+"           Accounts erst ab 16 erlauben, und oft deine Daten sammeln und analysieren), kannst du\n"
+"           Dir bei uns eine E-Mail-Adresse registrieren.\n"
+"           "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:83
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:48
 msgid ""
 "\n"
-"        participants\n"
-"       "
+"           If you already have a user account with Teckids, do not register a new one. Login\n"
+"           with your existing username and password. If you have forgotten your password, please\n"
+"           send us an e-mail (pelase do this yourself, with the help of your parents, if needed).\n"
+"           "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:88
-msgid ""
 "\n"
-"        The participation fee is\n"
-"       "
-msgstr ""
+"           Wenn du bereits einen Teckids-Account hast, lege Dir bitte keinen neuen an. Melde\n"
+"           dich mit deinem vorhandenen Benutzernamen und Passwort an. Wenn du dein\n"
+"           Passwort vergessen hast, schreibe uns bitte eine E-Mail (bitte mache das selbst mit der Hilfe\n"
+"           deiner Eltern, falls nötig).\n"
+"           "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:94
-msgid ""
-"\n"
-"        and must be paid in advance and within 7 days after receipt of the\n"
-"        invoice.  Cancellation with reimbursement is possible until\n"
-"       "
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:62
+msgid "I already have an account"
+msgstr "Ich habe bereits ein Konto"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:67
+msgid "I have a personal email address"
+msgstr "Ich habe eine persönliche E-Mail-Adresse"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register.html:101
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:72
+msgid "I don't have a personal email address"
+msgstr "Ich habe keine persönliche E-Mail-Adresse"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:85
 msgid ""
 "\n"
-"        and only for good reason.\n"
-"       "
+"         If you already have a Teckids account, please login here. If you forgot your password,\n"
+"         or have problems logging in, please send us an e-mail.\n"
+"         "
 msgstr ""
+"\n"
+"         Wenn du bereits einen Teckids-Account hast, melde dich bitte hier an. Wenn du dein Passwort\n"
+"         vergessen hast, oder Probleme bei der Anmeldung hast, sende uns bitte eine E-Mail.\n"
+"         "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:4
-msgid "Zusätzliche Angaben zur Veranstaltungsanmeldung"
-msgstr ""
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:90
+msgid "Login"
+msgstr "Anmelden"
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:7
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:94
 msgid ""
 "\n"
-"  Bitte lies dir mit deinen Eltern gemeinsam alles genau durch und schicke\n"
-"  deine Anmeldung dann mit ihnen gemeinsam ab!\n"
-" "
+"         You can now choose a personal e-mail address hosted on our servers.\n"
+"         For information about receiving mails, see <a\n"
+"         href=\"https://leopard.institute/pages/services.html\">\n"
+"         https://leopard.institute/pages/services.html</a>\n"
+"         "
 msgstr ""
+"\n"
+"         Du kannst Dir jetzt eine bei uns gehostete E-Mail-Adresse aussuchen.\n"
+"         Informationen, wie Du deine Mails abrufen kannst, findest Du unter <a\n"
+"         href=\"https://leopard.institute/pages/services.html\">\n"
+"         https://leopard.institute/pages/services.html</a>\n"
+"         "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:14
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:105
 msgid ""
 "\n"
-"  Bitte gehen Sie die Anmeldung mit Ihrem Kind gemeinsam durch. Uns ist es\n"
-"  wichtig, schon mit der Anmeldung wichtige Kompetenzen im Umgang mit dem\n"
-"  Internet und Verantwortung im Allgemeinen zu trainieren.\n"
-" "
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:23
-msgid "Zusätzliche Angaben zu"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:29
-msgid "Fehler"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:39
-msgid "Anmeldung erfolgreich"
+"         You will be asked for your existing, personal e-mail address. Please remember\n"
+"         that you should not use an address owned by your parents. If you do not have\n"
+"         a personal e-mail address, please choose the respective option instead!\n"
+"         "
 msgstr ""
+"\n"
+"         du wirst nach deiner persönliche E-Mail-Adresse gefragt werden. Bitte denke daran,\n"
+"         dass du keine Adresse nutzen solltest, die deinen Eltern gehört. Wenn du keine persönliche\n"
+"         E-Mail-Adresse hast, nutze die dafür vorgesehen Option!\n"
+"         "
 
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:43
+#: aleksis/apps/paweljong/templates/paweljong/event/register_start.html:116
 msgid ""
 "\n"
-"      Du hast deien Angaben erfolgreich eingesendet.\n"
-"     "
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event/register_additional.html:52
-msgid "Absenden"
+"         Registration is no longer possible.\n"
+"         "
 msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:104
+"\n"
+"         Die Anmeldung ist nicht mehr möglich.\n"
+"         "
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html:37
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html:51
+msgid "first step"
+msgstr "Erster Schritt"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html:41
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html:55
+msgid "previous step"
+msgstr "Vorheriger Schritt"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html:44
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html:58
+msgid "Next"
+msgstr "Weiter"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html:34
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:45
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:100
+msgid "Consents"
+msgstr "Einverständnisse"
+
+#: aleksis/apps/paweljong/templates/paweljong/event/registered.html:4
+#: aleksis/apps/paweljong/templates/paweljong/event/registered.html:5
+msgid "Registered successfully"
+msgstr "Erfolgreich angemeldet"
+
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:113
 msgid "Registration information"
-msgstr ""
+msgstr "Anmeldungsinformationen"
 
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:124
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:34
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:77
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:133
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:34
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:87
 msgid "IBAN"
-msgstr ""
+msgstr "IBAN"
 
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:133
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:155
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:49
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:104
+msgid "Accepted"
+msgstr "Akzeptiert"
+
+#: aleksis/apps/paweljong/templates/paweljong/event_registration/full.html:186
 msgid "Guardians / Parents "
-msgstr ""
+msgstr "Erziehungsberechtigte / Eltern "
 
 #: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:11
 msgid "Filter registrations"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:14
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:14
-#: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:14
-msgid "Search"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:18
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:18
-#: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:18
-msgid "Clear"
-msgstr ""
+msgstr "Anmeldungen filtern"
 
 #: aleksis/apps/paweljong/templates/paweljong/event_registration/list.html:22
 msgid "Selected registrations"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/edit.html:4
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/edit.html:5
-msgid "Edit feedback aspect"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:11
-msgid "Filter feedback_aspects"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:20
-msgid "Create feedback aspect"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html:23
-msgid "Selected feedback aspects"
-msgstr ""
+msgstr "Ausgewählte Anmeldungen"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:5
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:12
 msgid "Corona"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/print/corona.html:19
-#: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:19
-#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:20
-#: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:20
-msgid "Last name"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/print/corona.html:20
-#: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:20
-#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:21
-#: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:21
-msgid "First name"
-msgstr ""
+msgstr "Corona"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:21
 msgid "Address"
-msgstr ""
+msgstr "Adresse"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:23
 msgid "Arrival"
-msgstr ""
+msgstr "Ankunft"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/corona.html:24
 msgid "Departure"
-msgstr ""
+msgstr "Abreise"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:5
 #: aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html:12
 msgid "attendance list"
-msgstr ""
+msgstr "Anwesenheitsliste"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:5
 #: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:12
 msgid "participant list"
-msgstr ""
+msgstr "Teilnehmerliste"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:19
 msgid "Photo"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/paweljong/print/list_participants.html:25
-msgid "Class"
-msgstr ""
+msgstr "Foto"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:5
 #: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:12
 msgid "signature list"
-msgstr ""
+msgstr "Unterschriftenliste"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:16
 msgid "Meeting"
-msgstr ""
+msgstr "Treffen"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/list_sign.html:22
 msgid "Signature"
-msgstr ""
+msgstr "Unterschrift"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/manage.html:4
 #: aleksis/apps/paweljong/templates/paweljong/print/manage.html:5
 msgid "Generate list"
-msgstr ""
+msgstr "Liste generieren"
 
 #: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:5
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:8
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:12
 msgid "Voucher for "
-msgstr ""
+msgstr "Gutschein für "
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:16
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:20
 msgid "Voucher for"
-msgstr ""
+msgstr "Gutschein für"
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:16
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:20
 msgid "to visit event"
-msgstr ""
+msgstr "für die Veranstaltung"
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:16
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:20
 msgid "on"
-msgstr ""
+msgstr "am"
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:16
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:20
 msgid "at"
-msgstr ""
+msgstr "in"
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:17
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:21
 msgid "To use the voucher, register for the event "
-msgstr ""
+msgstr "Um den Gutschein zu nutzen, registriere dich für die Veranstaltung "
 
-#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:17
+#: aleksis/apps/paweljong/templates/paweljong/print/voucher.html:21
 msgid "here"
-msgstr ""
+msgstr "hier"
+
+#: aleksis/apps/paweljong/templates/paweljong/register.html:4
+#: aleksis/apps/paweljong/templates/paweljong/register.html:5
+#: aleksis/apps/paweljong/templates/paweljong/register.html:9
+msgid "Registration"
+msgstr "Anmeldung"
+
+#: aleksis/apps/paweljong/templates/paweljong/term/create.html:4
+#: aleksis/apps/paweljong/templates/paweljong/term/create.html:5
+#: aleksis/apps/paweljong/templates/paweljong/term/list.html:11
+msgid "Create term"
+msgstr "Bedingung erstellen"
+
+#: aleksis/apps/paweljong/templates/paweljong/term/edit.html:4
+#: aleksis/apps/paweljong/templates/paweljong/term/edit.html:5
+msgid "Edit term"
+msgstr "Bedingung bearbeiten"
+
+#: aleksis/apps/paweljong/templates/paweljong/voucher/create.html:4
+#: aleksis/apps/paweljong/templates/paweljong/voucher/create.html:5
+msgid "Create voucher"
+msgstr "Gutschein erstellen"
 
 #: aleksis/apps/paweljong/templates/paweljong/voucher/edit.html:4
 #: aleksis/apps/paweljong/templates/paweljong/voucher/edit.html:5
 msgid "Edit voucher"
-msgstr ""
+msgstr "Gutschein bearbeiten"
 
 #: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:11
 msgid "Filter vouchers"
-msgstr ""
+msgstr "Gutscheine filtern"
 
 #: aleksis/apps/paweljong/templates/paweljong/voucher/list.html:22
 msgid "Selected vouchers"
-msgstr ""
+msgstr "Ausgewählte Gutscheine"
 
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:3
 msgid "New event"
-msgstr ""
+msgstr "Neue Veranstaltung"
 
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:6
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:35
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:31
 #, python-format
 msgid " An event was created: %(new_event)s"
-msgstr ""
+msgstr " Eine Veranstaltung wurde erstellt: %(new_event)s"
 
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:10
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:42
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:38
 msgid "Published"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:15
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:47
-msgid "Cost"
-msgstr ""
+msgstr "Veröffentlicht"
 
 #: aleksis/apps/paweljong/templates/templated_email/event_created.email:17
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:49
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:45
 msgid "Owners"
-msgstr ""
+msgstr "Besitzer"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:26
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:65
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:22
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:55
 #, python-format
 msgid ""
 "\n"
 "        The event was created by %(sender)s\n"
 "    "
 msgstr ""
+"\n"
+"        Die Veranstaltung wurde von %(sender)s erstellt\n"
+"    "
 
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:30
-#: aleksis/apps/paweljong/templates/templated_email/event_created.email:71
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:32
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:66
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:43
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:89
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:26
+#: aleksis/apps/paweljong/templates/templated_email/event_created.email:61
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:53
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:111
 msgid "Your AlekSIS team"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:3
-msgid "New feedback on"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:6
-#, python-format
-msgid "New feedback on: %(feedback.event)s"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:12
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:12
-msgid "Person "
-msgstr ""
+msgstr "Dein AlekSIS-Team"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:14
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:46
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:14
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:25
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:57
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:68
-msgid "Name"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:22
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:54
-msgid "Public comment info"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_feedback.html:37
-#, python-format
-msgid "New feedback.event: %(feedback.event)s"
-msgstr ""
-
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:3
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:3
 msgid "New registration"
-msgstr ""
+msgstr "Neue Anmeldung"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:6
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:6
 #, python-format
 msgid "New registration: %(event)s"
-msgstr ""
+msgstr "Neue Anmeldung: %(event)s"
+
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:14
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:25
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:67
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:78
+msgid "Name"
+msgstr "Name"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:23
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:66
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:23
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:76
 msgid "Guardian"
-msgstr ""
+msgstr "Erziehungsberechtigter"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:29
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:72
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:29
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:82
 msgid "Financial details"
-msgstr ""
+msgstr "Angaben zur Bezahlung"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:33
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:76
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:33
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:86
 msgid "Accept SEPA"
-msgstr ""
+msgstr "SEPA-Lastschriftmandat"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:37
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:80
-msgid "Declarations"
-msgstr ""
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:37
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:90
+msgid "Additional"
+msgstr "Zusätzliches"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:39
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:82
-msgid "Consent by parents"
-msgstr ""
+#: aleksis/apps/paweljong/templates/templated_email/event_registered.email:58
+#, python-format
+msgid "New registration: %(registration)s"
+msgstr "Neue Anmeldung: %(registration)s"
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:40
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:83
-msgid "Data protection"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:48 aleksis/apps/paweljong/views.py:60
+msgid "The event has been saved."
+msgstr "Die Veranstaltung wurde gespeichert."
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:41
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:84
-msgid "Terms and conditions"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:152
+msgid "The event registration has been created."
+msgstr "Die Veranstaltungsanmeldung wurde erstellt."
 
-#: aleksis/apps/paweljong/templates/templated_email/event_registred.email:48
-#, python-format
-msgid "New registration: %(registration)s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:164
+msgid "The event registration has been saved."
+msgstr "Die Veranstaltungsanmeldung wurde gespeichert."
 
-#: aleksis/apps/paweljong/views.py:105
-msgid "Registration is no longer possible"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:185
+msgid "The registration has been saved."
+msgstr "Die Anmeldung wurde gespeichert."
 
-#: aleksis/apps/paweljong/views.py:110
-msgid "You are already registred."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:222
+msgid "The registration has been deleted."
+msgstr "Die Veranstaltung wurde gelöscht."
 
-#: aleksis/apps/paweljong/views.py:177
-msgid "You entered an invalid voucher code!"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:234
+msgid "The voucher has been created."
+msgstr "Der Gutschein wurde erstellt."
 
-#: aleksis/apps/paweljong/views.py:195
-msgid "You have successfully registered for the event. Please give usup to two days to process your registration. You will thenreceive an email from us."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:246
+msgid "The voucher has been saved."
+msgstr "Der Gutschein wurde gespeichert."
 
-#: aleksis/apps/paweljong/views.py:202
-msgid "You registred for an event"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:256
+msgid "The voucher has been deleted."
+msgstr "Der Gutschein wurde gelöscht."
 
-#: aleksis/apps/paweljong/views.py:203
-#, python-format
-msgid "You registred for the event %s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:299
+msgid "Create e-mail address"
+msgstr "E-Mail-Adresse erstellen"
 
-#: aleksis/apps/paweljong/views.py:234
-msgid "You did not take part in this event."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:301
+msgid "All participants need a personal e-mail address, which they check and read temselves. We offer the possibility to register an e-mail address on our secure servers, made for young users. For information about receiving mails, see: <a href='https://leopard.institute/pages/services.html'>https://leopard.institute/pages/services.html</a>."
+msgstr "Alle Teilnehmenden brauchen eine persönliche Adresse, die sie selbst abrufen und lesen. Wir bieten die Möglichkeit an, E-Mail-Adressen auf unseren sicheren Servern zu registrieren. Informationen, wie Du deine Mails abrufen kannst, findest Du unter <a href='https://leopard.institute/pages/services.html'>https://leopard.institute/pages/services.html</a>."
 
-#: aleksis/apps/paweljong/views.py:255
-msgid "Feedback successfully submitted."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:312
+msgid "First, please enter some basic information about yourself, and check whether all information is correct."
+msgstr "Zuerst, gib bitte einige Informationen über dich an und prüfe, dass alle Informationen korrekt sind."
 
-#: aleksis/apps/paweljong/views.py:259
-msgid "You submitted feedback"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:318
+msgid "Contact information"
+msgstr "Kontaktinformationen"
 
-#: aleksis/apps/paweljong/views.py:260
-#, python-format
-msgid "You submitted feedback for %s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:320
+msgid "Tell us how we can contact you. You will receive information about the event by e-mail. Please use your personal e-mail address where you will read mails yourself, not an address of your parents. We will always send all important information to your parents as well, and you will enter their e-mail address on the next page."
+msgstr "Teile uns mit, wie wir dich erreichen können. Du wirst Informationen zu der Veranstaltung per E-Mail erhalten. Bitte nutze deine persönliche E-Mail-Adresse, die selbst liest, nicht die E-Mail-Adresse deiner Eltern. Wir senden wichtige Informationen immer zusätzlich an deine Eltern. Ihre E-Mail-Adresse wirst du im nächsten Schritt eingeben."
 
-#: aleksis/apps/paweljong/views.py:298
-msgid "The event has been saved."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:329
+msgid "Legal guardians / parents"
+msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/apps/paweljong/views.py:348
-msgid "You deleted a voucher!"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:331
+msgid "Tell us how we can reach your parents or other legal guardians. This should be the person who was present when you registered for the event (which is now). If you want to add another parent, please tell us later as a comment."
+msgstr "Teile uns mit, wie wir deine Eltern oder Erziehungsberechtigten während der Veranstaltung erreichen können. Das sollte eine Person sein, die während der Anmeldung (also jetzt gerade), bei Dir ist. Wenn du einen weiteren Erziehungsberechtigten angeben möchtest, kannst du uns das später als Kommentar mitteilen."
 
-#: aleksis/apps/paweljong/views.py:349
-#, python-format
-msgid "You deleted the voucher with ID %s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:339
+msgid "Additional registration information"
+msgstr "Zusätzliche Anmeldungsinformationen"
 
-#: aleksis/apps/paweljong/views.py:355
-msgid "The voucher was successfully deleted."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:341
+msgid "Please answer the following questions as precisely as you can, so we can make sure your event attendance will be organised as wel las possible."
+msgstr "Bitte beantworte die folgenden Fragen so genau wie möglich, sodass wir sicher gehen können, dass deine Teilnahme bei der Veranstaltung so gut wie möglich organisiert ist."
 
-#: aleksis/apps/paweljong/views.py:384
-msgid "You have created a voucher."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:347
+msgid "Payment"
+msgstr "Bezahlung"
 
-#: aleksis/apps/paweljong/views.py:386
-#, python-format
-msgid "You have created a voucher for %s for %s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:349
+msgid "By default, we will send you an invoice, which you or your parents can pay by bank transfer. You can also choose to pay by direct debit – please make sure to enter exactly what your parents tell you."
+msgstr "Standardmäßig senden wir eine Rechnung, welche du oder deine Eltern per Banküberweisung bezahlen könnt. Du kannst auch per Lastschrift bezahlen ­– bitte trage hier genau das ein, was deine Eltern dir sagen."
 
-#: aleksis/apps/paweljong/views.py:393
-msgid "The voucher has been saved."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:356
+msgid "Consent"
+msgstr "Einverständnis"
 
-#: aleksis/apps/paweljong/views.py:474
-msgid "Registration was successfully deleted."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:358
+msgid "Lastly, please read the terms and conditions carefully, together with your parents. After that, you will need to confirm that you agree with everything yourself, and that your parents also agree."
+msgstr "Zuletzt lies bitte alle Bedingungen sorgfältig zusammen mit deinen Eltern durch. Danach musst du bestätigen, dass du und deine Eltern alles gelesen habt und akzeptiert."
 
-#: aleksis/apps/paweljong/views.py:497
-msgid "The registration has been saved."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:457 aleksis/apps/paweljong/views.py:572
+msgid "You entered an invalid voucher code!"
+msgstr "Du hast einen ungütigen Gutscheincode eingegeben!"
 
-#: aleksis/apps/paweljong/views.py:562
-msgid "You have create a feedback aspect."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:593
+msgid "You have successfully registered for the event. Please give us up to two days to process your registration. You will then receive an email from us."
+msgstr "Du hast dich erfolgreich zu der Veranstaltung angemeldet. Bitte gib uns ein paar Tage, um deine Anmeldung zu bearbeiten. Du wirst dann eine E-Mail von uns bekommen."
 
-#: aleksis/apps/paweljong/views.py:563
-#, python-format
-msgid "You have created the feedback aspect: %s"
-msgstr ""
+#: aleksis/apps/paweljong/views.py:600
+msgid "You registered for an event"
+msgstr "Du hast dich zu einer Veranstaltung angemeldet"
 
-#: aleksis/apps/paweljong/views.py:569
-msgid "The feedback aspect has been saved."
-msgstr ""
+#: aleksis/apps/paweljong/views.py:601
+#, python-format
+msgid "You registered for the event %s"
+msgstr "Du hast dich zur Veranstaltung %s angemeldet"
+
+#: aleksis/apps/paweljong/views.py:657
+msgid "The term has been created."
+msgstr "Die Bedingung wurde erfolgreich erstellt."
+
+#: aleksis/apps/paweljong/views.py:669
+msgid "The term has been saved."
+msgstr "Die Bedingung wurde gespeichert."
+
+#~ msgid ""
+#~ "\n"
+#~ "         You can now choose a personal e-mail address hosted on our servers.\n"
+#~ "         "
+#~ msgstr ""
+#~ "\n"
+#~ "         du kannst eine persönliche E-Mail-Adresse wählen, die auf unseren Servern gehostet wird.\n"
+#~ "         "
+
+#~ msgid "Declarations"
+#~ msgstr "Erklärungen"
diff --git a/aleksis/apps/paweljong/menus.py b/aleksis/apps/paweljong/menus.py
index 073566e3f55629d88b8f876ad556e6d85de1a581..227309d55086d9cfe7c5a38f725ca4abf674c9d1 100644
--- a/aleksis/apps/paweljong/menus.py
+++ b/aleksis/apps/paweljong/menus.py
@@ -4,47 +4,6 @@ MENUS = {
     "NAV_MENU_CORE": [
         {
             "name": _("Events"),
-            "url": "events",
-            "icon": "event",
-        },
-        {
-            "name": _("Vouchers"),
-            "url": "#",
-            "icon": "confirmation_number",
-            "root": True,
-            "validators": [
-                (
-                    "aleksis.core.util.predicates.permission_validator",
-                    "paweljong.view_vouchers_rule",
-                )
-            ],
-            "submenu": [
-                {
-                    "name": _("Voucher overview"),
-                    "url": "vouchers",
-                    "icon": "confirmation_number",
-                    "validators": [
-                        (
-                            "aleksis.core.util.predicates.permission_validator",
-                            "paweljong.change_vouchers_rule",
-                        )
-                    ],
-                },
-                {
-                    "name": _("Create voucher"),
-                    "url": "create_vouchers",
-                    "icon": "post_add",
-                    "validator": [
-                        (
-                            "aleksis.core.util.predicates.permission_validator",
-                            "paweljong.create_vouchers_rule",
-                        )
-                    ],
-                },
-            ],
-        },
-        {
-            "name": _("Event management"),
             "url": "#",
             "icon": "event_note",
             "root": True,
@@ -56,24 +15,24 @@ MENUS = {
             ],
             "submenu": [
                 {
-                    "name": _("Create event"),
-                    "url": "create_event",
-                    "icon": "event_available",
+                    "name": _("Vouchers"),
+                    "url": "vouchers",
+                    "icon": "confirmation_number",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
-                            "paweljong.create_events_rule",
+                            "paweljong.view_vouchers_rule",
                         )
                     ],
                 },
                 {
-                    "name": _("Manage feedback aspects"),
-                    "url": "feedback_aspects",
-                    "icon": "rate_review",
+                    "name": _("Terms"),
+                    "url": "terms",
+                    "icon": "gavel",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
-                            "paweljong.view_feedback_aspects_rule",
+                            "paweljong.view_terms_rule",
                         )
                     ],
                 },
@@ -89,9 +48,9 @@ MENUS = {
                     ],
                 },
                 {
-                    "name": _("Manage upcoming events"),
+                    "name": _("Upcoming events"),
                     "url": "manage_events",
-                    "icon": "change",
+                    "icon": "edit",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -100,7 +59,7 @@ MENUS = {
                     ],
                 },
                 {
-                    "name": _("Manage registrations"),
+                    "name": _("Registrations"),
                     "url": "registrations",
                     "icon": "how_to_reg",
                     "validators": [
diff --git a/aleksis/apps/paweljong/migrations/0001_initial.py b/aleksis/apps/paweljong/migrations/0001_initial.py
index 2ca1cd2a0be1aac31e5114b1835cd7a84250bab3..dcf701643554cf11e03015205704ed6e2e3623bd 100644
--- a/aleksis/apps/paweljong/migrations/0001_initial.py
+++ b/aleksis/apps/paweljong/migrations/0001_initial.py
@@ -11,7 +11,7 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('core', '0028_alter_globalpermissions_options'),
+        ('core', '0035_preference_model_unique'),
         ('sites', '0002_alter_domain_unique'),
     ]
 
@@ -80,7 +80,7 @@ class Migration(migrations.Migration):
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('extended_data', models.JSONField(default=dict, editable=False)),
-                ('date_registred', models.DateTimeField(auto_now_add=True, verbose_name='Registration date')),
+                ('date_registered', models.DateTimeField(auto_now_add=True, verbose_name='Registration date')),
                 ('comment', models.TextField(blank=True, default='', verbose_name='Comment / remarks')),
                 ('channel', models.CharField(blank=True, default='', max_length=255, verbose_name='Channel')),
                 ('donation', models.PositiveIntegerField(blank=True, null=True, verbose_name='Donation')),
diff --git a/aleksis/apps/paweljong/migrations/0003_alter_event_feedback_aspects.py b/aleksis/apps/paweljong/migrations/0003_alter_event_feedback_aspects.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d1d673bacf4fb403f29270d9c739cfadcf2165a
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0003_alter_event_feedback_aspects.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2022-02-13 14:44
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0002_event_website'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='event',
+            name='feedback_aspects',
+            field=models.ManyToManyField(blank=True, null=True, related_name='event', to='paweljong.FeedbackAspect', verbose_name='Feedback aspects'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0004_richtext_field_information.py b/aleksis/apps/paweljong/migrations/0004_richtext_field_information.py
new file mode 100644
index 0000000000000000000000000000000000000000..428b54724e90ae09ebb521f2cfd49511bfcf7a2c
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0004_richtext_field_information.py
@@ -0,0 +1,30 @@
+# Generated by Django 3.2.12 on 2022-02-16 18:52
+
+import ckeditor.fields
+from django.db import migrations
+import django_iban.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0003_alter_event_feedback_aspects'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='event',
+            name='website',
+        ),
+        migrations.AddField(
+            model_name='event',
+            name='information',
+            field=ckeditor.fields.RichTextField(default='', verbose_name='Information about the event'),
+            preserve_default=False,
+        ),
+        migrations.AlterField(
+            model_name='eventregistration',
+            name='iban',
+            field=django_iban.fields.IBANField(blank=True, enforce_database_constraint=True, max_length=34, null=True, verbose_name='IBAN (for SEPA direct debit)'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0005_eventregistration_medical_information.py b/aleksis/apps/paweljong/migrations/0005_eventregistration_medical_information.py
new file mode 100644
index 0000000000000000000000000000000000000000..23bd625af560e29e4d303600f180b3b70fb168b7
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0005_eventregistration_medical_information.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2022-02-16 21:05
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0004_richtext_field_information'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='eventregistration',
+            name='medical_information',
+            field=models.TextField(blank=True, default='', verbose_name='Medical information / intolerances'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0006_unique_constraints.py b/aleksis/apps/paweljong/migrations/0006_unique_constraints.py
new file mode 100644
index 0000000000000000000000000000000000000000..945d2e5457bc33d54a0c8d0ea7bd3b45f8a68780
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0006_unique_constraints.py
@@ -0,0 +1,25 @@
+# Generated by Django 3.2.12 on 2022-02-18 14:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0005_eventregistration_medical_information'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='eventregistration',
+            options={'verbose_name': 'Event registration', 'verbose_name_plural': 'Event registrations'},
+        ),
+        migrations.AddConstraint(
+            model_name='eventfeedback',
+            constraint=models.UniqueConstraint(fields=('person', 'event'), name='unique_person_feedback_per_event'),
+        ),
+        migrations.AddConstraint(
+            model_name='eventregistration',
+            constraint=models.UniqueConstraint(fields=('person', 'event'), name='unique_person_registration_per_event'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0007_terms.py b/aleksis/apps/paweljong/migrations/0007_terms.py
new file mode 100644
index 0000000000000000000000000000000000000000..71a1002345d32764c50d81555c1f18ce5caab7cc
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0007_terms.py
@@ -0,0 +1,65 @@
+# Generated by Django 3.2.12 on 2022-02-20 15:24
+
+import ckeditor.fields
+import django.contrib.sites.managers
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sites', '0002_alter_domain_unique'),
+        ('paweljong', '0006_unique_constraints'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='eventregistration',
+            name='channel',
+        ),
+        migrations.AddField(
+            model_name='eventregistration',
+            name='school',
+            field=models.CharField(default='', max_length=255, verbose_name='Name of school'),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='eventregistration',
+            name='school_class',
+            field=models.CharField(default='', max_length=255, verbose_name='School class'),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='eventregistration',
+            name='school_place',
+            field=models.CharField(default='', max_length=255, verbose_name='Place of the school'),
+            preserve_default=False,
+        ),
+        migrations.AlterField(
+            model_name='event',
+            name='feedback_aspects',
+            field=models.ManyToManyField(blank=True, related_name='event', to='paweljong.FeedbackAspect', verbose_name='Feedback aspects'),
+        ),
+        migrations.CreateModel(
+            name='Terms',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('extended_data', models.JSONField(default=dict, editable=False)),
+                ('title', models.CharField(max_length=255, verbose_name='Title')),
+                ('term', ckeditor.fields.RichTextField(verbose_name='Term')),
+                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
+            ],
+            options={
+                'abstract': False,
+            },
+            managers=[
+                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
+            ],
+        ),
+        migrations.AddField(
+            model_name='event',
+            name='terms',
+            field=models.ManyToManyField(blank=True, related_name='event', to='paweljong.Terms', verbose_name='Terms'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0008_remove_terms_from_event.py b/aleksis/apps/paweljong/migrations/0008_remove_terms_from_event.py
new file mode 100644
index 0000000000000000000000000000000000000000..244a64bee546ef81c26f85272b03e776dc68af02
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0008_remove_terms_from_event.py
@@ -0,0 +1,25 @@
+# Generated by Django 3.2.12 on 2022-02-20 16:53
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0007_terms'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='eventregistration',
+            name='accept_data',
+        ),
+        migrations.RemoveField(
+            model_name='eventregistration',
+            name='accept_general_terms',
+        ),
+        migrations.RemoveField(
+            model_name='eventregistration',
+            name='accept_terms',
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0009_remove_feedback.py b/aleksis/apps/paweljong/migrations/0009_remove_feedback.py
new file mode 100644
index 0000000000000000000000000000000000000000..bfc6f06ab0bc083e4801407432e7b9650cc235be
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0009_remove_feedback.py
@@ -0,0 +1,27 @@
+# Generated by Django 3.2.12 on 2022-02-20 17:36
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0008_remove_terms_from_event'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='feedbackaspect',
+            name='site',
+        ),
+        migrations.RemoveField(
+            model_name='event',
+            name='feedback_aspects',
+        ),
+        migrations.DeleteModel(
+            name='EventFeedback',
+        ),
+        migrations.DeleteModel(
+            name='FeedbackAspect',
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0010_term_confirmation_text.py b/aleksis/apps/paweljong/migrations/0010_term_confirmation_text.py
new file mode 100644
index 0000000000000000000000000000000000000000..27a4643e3ae9f479f2de5a96c7970c2976101aa0
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0010_term_confirmation_text.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.12 on 2022-02-20 21:23
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0009_remove_feedback'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='terms',
+            name='confirmation_text',
+            field=models.TextField(default='', verbose_name='Confirmation text'),
+            preserve_default=False,
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/migrations/0011_registration_accepted_terms.py b/aleksis/apps/paweljong/migrations/0011_registration_accepted_terms.py
new file mode 100644
index 0000000000000000000000000000000000000000..7114f5c9a5f4450d4e2f7ccb9d30cf799de985ee
--- /dev/null
+++ b/aleksis/apps/paweljong/migrations/0011_registration_accepted_terms.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2022-02-20 22:01
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('paweljong', '0010_term_confirmation_text'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='eventregistration',
+            name='accepted_terms',
+            field=models.ManyToManyField(related_name='registrations', to='paweljong.Terms', verbose_name='Accepted terms'),
+        ),
+    ]
diff --git a/aleksis/apps/paweljong/model_extensions.py b/aleksis/apps/paweljong/model_extensions.py
deleted file mode 100644
index 09f8924238190ac1365e7b7e3bcb447259e5661d..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/model_extensions.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.utils.translation import gettext_lazy as _
-
-from jsonstore import CharField
-
-from aleksis.core.models import Person
-
-# Additional fields for persons
-Person.field(school=CharField(verbose_name=_("Name of school")))
-Person.field(school_class=CharField(verbose_name=_("School class")))
-Person.field(school_place=CharField(verbose_name=_("Place of the school")))
diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py
index c8e21ca94d291b08e45de53b2ee30a11da8163a9..6148f135e102823466f3d566b9774885c9b364b7 100644
--- a/aleksis/apps/paweljong/models.py
+++ b/aleksis/apps/paweljong/models.py
@@ -1,18 +1,23 @@
+from datetime import datetime
+
 from django.db import models
-from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
+from ckeditor.fields import RichTextField
 from django_iban.fields import IBANField
 
 from aleksis.core.mixins import ExtensibleModel
 from aleksis.core.models import Group, Person
+from aleksis.core.util.core_helpers import generate_random_code
 
 
-class FeedbackAspect(ExtensibleModel):
-    aspect = models.CharField(max_length=100)
+class Terms(ExtensibleModel):
+    title = models.CharField(max_length=255, verbose_name=_("Title"))
+    term = RichTextField(verbose_name=_("Term"))
+    confirmation_text = models.TextField(verbose_name=_("Confirmation text"))
 
     def __str__(self) -> str:
-        return self.aspect
+        return self.title
 
 
 class Event(ExtensibleModel):
@@ -33,85 +38,46 @@ class Event(ExtensibleModel):
     # Other details
     cost = models.IntegerField(verbose_name=_("Cost in €"))
     max_participants = models.PositiveSmallIntegerField(verbose_name=_("Maximum participants"))
-    website = models.CharField(verbose_name=_("Website of event"), max_length=255)
-
-    # Feedback
-    feedback_aspects = models.ManyToManyField(
-        FeedbackAspect, verbose_name=_("Feedback aspects"), related_name="event"
-    )
+    information = RichTextField(verbose_name=_("Information about the event"))
+    terms = models.ManyToManyField(Terms, verbose_name=_("Terms"), related_name="event", blank=True)
 
     def __str__(self) -> str:
         return self.display_name
 
     def can_register(self, request=None):
-        now = timezone.now()
+        now = datetime.today().date()
 
         if request and request.user.is_authenticated:
+            if request.user.person in self.linked_group.members.all():
+                return False
+
+            if EventRegistration.objects.filter(person=request.user.person).exists():
+                return False
+
             if (
                 Voucher.objects.filter(event=self, person=request.user.person, used=False).count()
                 > 0
             ):
                 return True
 
-        if self.group.members.count() >= self.max_participants:
+        if self.linked_group.members.count() >= self.max_participants:
             return False
 
         if self.date_registration:
-            return self.date_registration >= timezone.now()
-        return self.date_event > timezone.now()
+            return self.date_registration >= now
+        return self.date_event > now
 
     @property
     def booked_percentage(self):
-        return self.group.members.count() / self.max_participants * 100
+        return self.linked_group.members.count() / self.max_participants * 100
 
     @property
     def members_persons(self):
-        return self.group.members.all()
+        return self.linked_group.members.all()
 
     @property
     def owners_persons(self):
-        return self.group.owners.all()
-
-
-class EventFeedback(ExtensibleModel):
-    class Meta:
-        verbose_name = _("Event feedback")
-        verbose_name_plural = _("Event feedbacks")
-
-    COMMENT_CHOICES = [
-        ("first", _("Only first name")),
-        ("first_age", _("First name and age")),
-        ("first_last_age", _("First name, last name and age")),
-    ]
-
-    LICENCE_CHOICES = [
-        ("CC-BY-4.0+", _("Creative Commons with attribution, 4.0 or later")),
-        (
-            "CC-BY-SA-4.0+",
-            _(
-                "Creative Commons with attribution and distribution only"
-                "under the same conditions, 4.0 or later"
-            ),
-        ),
-    ]
-
-    event = models.ForeignKey(
-        Event, on_delete=models.CASCADE, verbose_name=_("Event"), related_name="feedback"
-    )
-    person = models.ForeignKey(
-        Person, on_delete=models.CASCADE, verbose_name=_("Person"), related_name="feedback"
-    )
-
-    comment_private = models.TextField(verbose_name=_("Private comment"), blank=True)
-    comment_public = models.TextField(verbose_name=_("Public comment"), blank=True)
-    comment_public_info = models.CharField(
-        choices=COMMENT_CHOICES, verbose_name=_("Information in the comment"), max_length=255
-    )
-
-    photos = models.ImageField(verbose_name=_("Photos"), upload_to="feedback/", blank=True)
-    photos_licence = models.CharField(
-        choices=LICENCE_CHOICES, verbose_name=_("Photo licence"), max_length=255
-    )
+        return self.linked_group.owners.all()
 
 
 class Voucher(ExtensibleModel):
@@ -148,18 +114,26 @@ class Voucher(ExtensibleModel):
     def __str__(self) -> str:
         return self.code
 
+    def save(self, *args, **kwargs):
+        if not self.code:
+            self.code = generate_random_code(5, 3)
+        super().save(*args, **kwargs)
+
 
 class EventRegistration(ExtensibleModel):
-    class Meta:
-        verbose_name = _("Registration")
-        verbose_name_plural = _("Registrations")
 
     event = models.ForeignKey(Event, on_delete=models.CASCADE, verbose_name=_("Event"))
     person = models.ForeignKey(Person, on_delete=models.CASCADE, verbose_name=_("Person"))
-    date_registred = models.DateTimeField(auto_now_add=True, verbose_name=_("Registration date"))
+    date_registered = models.DateTimeField(auto_now_add=True, verbose_name=_("Registration date"))
+
+    school = models.CharField(verbose_name=_("Name of school"), max_length=255)
+    school_class = models.CharField(verbose_name=_("School class"), max_length=255)
+    school_place = models.CharField(verbose_name=_("Place of the school"), max_length=255)
 
     comment = models.TextField(verbose_name=_("Comment / remarks"), blank=True, default="")
-    channel = models.CharField(verbose_name=_("Channel"), max_length=255, blank=True, default="")
+    medical_information = models.TextField(
+        verbose_name=_("Medical information / intolerances"), blank=True, default=""
+    )
     voucher = models.ForeignKey(
         Voucher,
         on_delete=models.CASCADE,
@@ -168,19 +142,28 @@ class EventRegistration(ExtensibleModel):
         null=True,
     )
     donation = models.PositiveIntegerField(verbose_name=_("Donation"), blank=True, null=True)
+    accepted_terms = models.ManyToManyField(
+        Terms,
+        verbose_name=_("Accepted terms"),
+        related_name="registrations",
+    )
 
     accept_sepa = models.BooleanField(verbose_name=_("SEPA direct debit"))
     iban = IBANField(
         verbose_name=_("IBAN (for SEPA direct debit)"),
         enforce_database_constraint=True,
         null=True,
-    )
-
-    accept_terms = models.BooleanField(verbose_name=_("Delcaration of consent by parents"))
-    accept_data = models.BooleanField(verbose_name=_("Declaration of consent data protection"))
-    accept_general_terms = models.BooleanField(
-        verbose_name=_("Declatation of consent terms and condition")
+        blank=True,
     )
 
     def __str__(self) -> str:
         return f"{self.event}, {self.person.first_name} {self.person.last_name}"
+
+    class Meta:
+        verbose_name = _("Event registration")
+        verbose_name_plural = _("Event registrations")
+        constraints = [
+            models.UniqueConstraint(
+                fields=["person", "event"], name="unique_person_registration_per_event"
+            )
+        ]
diff --git a/aleksis/apps/paweljong/preferences.py b/aleksis/apps/paweljong/preferences.py
index d48689d83bcc05c732e0cba4ec365447b92e97e6..a41b5d01971ea609407d92d57584202e027cb6aa 100644
--- a/aleksis/apps/paweljong/preferences.py
+++ b/aleksis/apps/paweljong/preferences.py
@@ -24,12 +24,3 @@ class WWSPostUrl(StringPreference):
     default = ""
     required = False
     verbose_name = _("POST url for Sympa")
-
-
-@site_preferences_registry.register
-class ChannelChoices(StringPreference):
-    section = paweljong
-    name = "channel_choices"
-    default = ""
-    requred = False
-    verbose_name = _("Channel choices")
diff --git a/aleksis/apps/paweljong/rules.py b/aleksis/apps/paweljong/rules.py
index 50723ee8a95718a1752a6c13822948db7e50aab6..99254b87447353cbc6c437845bf3e7d61ebdcad5 100644
--- a/aleksis/apps/paweljong/rules.py
+++ b/aleksis/apps/paweljong/rules.py
@@ -9,7 +9,7 @@ from aleksis.core.util.predicates import (
     is_group_member,
 )
 
-from .models import Event, EventRegistration, FeedbackAspect, Voucher
+from .models import Event, EventRegistration, Terms, Voucher
 from .predicates import (
     is_own_registration,
     is_own_voucher,
@@ -104,9 +104,8 @@ is_own_voucher_predicate = has_person & (is_own_voucher)
 rules.add_perm("paweljong.is_own_voucher_rule", is_own_voucher_predicate)
 
 
-# View feedback aspects
-view_feedback_aspects_predicate = has_person & (
-    has_global_perm("paweljong.view_feedback_aspect")
-    | has_any_object("paweljong.view_feedback_aspect", FeedbackAspect)
+# View terms
+view_terms_predicate = has_person & (
+    has_global_perm("paweljong.view_term") | has_any_object("paweljong.view_term", Terms)
 )
-rules.add_perm("paweljong.view_feedback_aspects_rule", view_feedback_aspects_predicate)
+rules.add_perm("paweljong.view_terms_rule", view_terms_predicate)
diff --git a/aleksis/apps/paweljong/settings.py b/aleksis/apps/paweljong/settings.py
new file mode 100644
index 0000000000000000000000000000000000000000..3eb621d36624c29954cd0e7a493f4bbb27ae7526
--- /dev/null
+++ b/aleksis/apps/paweljong/settings.py
@@ -0,0 +1 @@
+INSTALLED_APPS = ["django_starfield", "formtools"]
diff --git a/aleksis/apps/paweljong/static/.keepdir b/aleksis/apps/paweljong/static/.keepdir
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/aleksis/apps/paweljong/static/css/paweljong.css b/aleksis/apps/paweljong/static/css/paweljong.css
new file mode 100644
index 0000000000000000000000000000000000000000..99c7a34797ca3d85042364cdefd5df7ef981ead7
--- /dev/null
+++ b/aleksis/apps/paweljong/static/css/paweljong.css
@@ -0,0 +1,52 @@
+img.max-size-600 {
+    max-width: 600px;
+    max-height: 600px;
+}
+
+img.person-photo-print {
+    max-height: 100px;
+}
+
+time.icon {
+	font-size: 1em; /* change icon size */
+	display: block;
+	position: relative;
+	width: 7em;
+	height: 7em;
+	background-color: #fff;
+	border-radius: 0.6em;
+	box-shadow: 0 1px 0 #bdbdbd, 0 2px 0 #fff, 0 3px 0 #bdbdbd, 0 4px 0 #fff, 0 5px 0 #bdbdbd, 0 0 0 1px #bdbdbd;
+	overflow: hidden;
+}
+
+time.icon * {
+	display: block;
+	width: 100%;
+	font-size: 1em;
+	font-weight: bold;
+	font-style: normal;
+	text-align: center;
+}
+
+time.icon strong {
+	position: absolute;
+	top: 0;
+	padding: 0.4em 0;
+	color: #fff;
+	background-color: #FF6600;
+	border-bottom: 1px dashed #FF9955;
+	box-shadow: 0 2px 0 #FF9955;
+}
+
+time.icon em {
+	position: absolute;
+	bottom: 0.3em;
+	color: #005EBE;
+}
+
+time.icon span {
+	font-size: 2.8em;
+	letter-spacing: -0.05em;
+	padding-top: 0.8em;
+	color: #0606FA;
+}
diff --git a/aleksis/apps/paweljong/tables.py b/aleksis/apps/paweljong/tables.py
index 60aa6c7d8ca18bb1cc706e32cd8ad0e1894987c1..88ff66b83020bd2c06dbc0c130e4295ccc0fa3e9 100644
--- a/aleksis/apps/paweljong/tables.py
+++ b/aleksis/apps/paweljong/tables.py
@@ -4,38 +4,6 @@ import django_tables2 as tables
 from django_tables2.utils import A
 
 
-class EventsTable(tables.Table):
-    class Meta:
-        attrs = {"class": "responsive-table highlight"}
-
-    display_name = tables.Column(verbose_name=_("Event"))
-    date_event = tables.Column(verbose_name=_("Date"))
-    max_participants = tables.Column(verbose_name=_("Max. participants"))
-    date_registration = tables.Column(verbose_name=_("Registration until"))
-
-    short_name = tables.LinkColumn(
-        "register_event_by_id",
-        args=[A("id")],
-        verbose_name=_("Register"),
-        text=_("Register"),
-    )
-
-
-class ParticipatedEventsTable(tables.Table):
-    class Meta:
-        attrs = {"class": "responsive-table highlight"}
-
-    display_name = tables.Column(verbose_name=_("Event"))
-    date_event = tables.Column(verbose_name=_("Date"))
-
-    short_name = tables.LinkColumn(
-        "feedback_event_by_id",
-        args=[A("id")],
-        verbose_name=_("Feedback"),
-        text=_("Feedback"),
-    )
-
-
 class ManageEventsTable(tables.Table):
     class Meta:
         attrs = {"class": "responsive-table highlight"}
@@ -45,8 +13,11 @@ class ManageEventsTable(tables.Table):
     max_participants = tables.Column(verbose_name=_("Max. participants"))
     date_registration = tables.Column(verbose_name=_("Registration until"))
 
-    short_name = tables.LinkColumn(
-        "edit_event_by_id", args=[A("id")], verbose_name=_("Edit"), text=_("Edit")
+    edit = tables.LinkColumn(
+        "edit_event_by_slug",
+        args=[A("linked_group__short_name")],
+        verbose_name=_("Edit"),
+        text=_("Edit"),
     )
 
 
@@ -59,16 +30,16 @@ class VouchersTable(tables.Table):
     code = tables.Column(verbose_name=_("Code"))
     person = tables.Column(verbose_name=_("Person"))
     deleted = tables.LinkColumn(
-        "delete_voucher_by_id",
+        "delete_voucher_by_pk",
         args=[A("id")],
         verbose_name=_("Delete"),
         text=_("Delete"),
     )
     edit = tables.LinkColumn(
-        "edit_voucher_by_id", args=[A("id")], verbose_name=_("Edit"), text=_("Edit")
+        "edit_voucher_by_pk", args=[A("id")], verbose_name=_("Edit"), text=_("Edit")
     )
     print_voucher = tables.LinkColumn(
-        "print_voucher_by_id", args=[A("id")], verbose_name=_("Print"), text=_("Print")
+        "print_voucher_by_pk", args=[A("id")], verbose_name=_("Print"), text=_("Print")
     )
 
 
@@ -78,23 +49,23 @@ class EventRegistrationsTable(tables.Table):
 
     person = tables.Column()
     event = tables.Column()
-    date_registred = tables.Column()
+    date_registered = tables.Column()
     view = tables.LinkColumn(
-        "registration_by_id",
+        "registration_by_pk",
         args=[A("id")],
         verbose_name=_("View registration"),
         text=_("View"),
     )
 
 
-class FeedbackAspectsTable(tables.Table):
+class TermsTable(tables.Table):
     class Meta:
         attrs = {"class": "responsive-table highlight"}
 
-    aspect = tables.Column()
+    title = tables.Column()
 
     edit = tables.LinkColumn(
-        "edit_feedback_aspect_by_id",
+        "edit_term_by_pk",
         args=[A("id")],
         verbose_name=_("Edit"),
         text=_("Edit"),
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/create.html b/aleksis/apps/paweljong/templates/paweljong/event/create.html
new file mode 100644
index 0000000000000000000000000000000000000000..66611ee318621d25386f23b239441c42a0172030
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/create.html
@@ -0,0 +1,22 @@
+{% extends "core/base.html" %}
+{% load material_form i18n any_js %}
+
+{% block page_title %}{% blocktrans %}Create event{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Create event{% endblocktrans %}{% endblock %}
+
+{% block extra_head %}
+    {{ form.media.css }}
+    {% include_css "select2-materialize" %}
+{% endblock %}
+
+{% block content %}
+
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+  {% include_js "select2-materialize" %}
+  {{ form.media.js }}
+
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/edit.html b/aleksis/apps/paweljong/templates/paweljong/event/edit.html
index 61d7275df4296a3d42fdf8bcbbaff8d668b4e13a..256ca05e12fb9027093e4646b87d1b25b4a8548b 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event/edit.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event/edit.html
@@ -5,7 +5,7 @@
 {% block browser_title %}{% blocktrans %}Edit event{% endblocktrans %}{% endblock %}
 
 {% block extra_head %}
-    {{ edit_event_form.media.css }}
+    {{ form.media.css }}
     {% include_css "select2-materialize" %}
 {% endblock %}
 
@@ -13,10 +13,10 @@
 
   <form method="post">
     {% csrf_token %}
-    {% form form=edit_event_form %}{% form %}
+    {% form form=form %}{% form %}
     {% include "core/partials/save_button.html" %}
   </form>
   {% include_js "select2-materialize" %}
-  {{ edit_event_form.media.js }}
+  {{ form.media.js }}
 
 {% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/feedback.html b/aleksis/apps/paweljong/templates/paweljong/event/feedback.html
deleted file mode 100644
index d3bb5a2c52663d44293a4e25ccd9edeacafe2684..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/paweljong/event/feedback.html
+++ /dev/null
@@ -1,46 +0,0 @@
-{% extends "core/base.html" %}
-{% load material_form i18n %}
-
-{% block page_title %}{% blocktrans %}Feedback on an event{% endblocktrans %}{% endblock %}
-{% block browser_title %}{% blocktrans %}Feedback on an event{% endblocktrans %}{% endblock %}
-
-{% block content %}
- <h5>
-  {% blocktrans %}Feedback on{% endblocktrans %} {{ event.display_name }}
- </h5>
-
- <div class="row">
-  <div class="col s12 m12">
-   <div class="card info">
-    <div class="card-content">
-     <span class="card-title">{% blocktrans %}How does the feedback work?{% endblocktrans %}</span>
-     <p>
-      {% blocktrans %}
-       The feedback consists of three parts.
-      {% endblocktrans %}
-     </p>
-     <ul>
-      <li>
-       {% blocktrans %}Evaluation of the program points from 1 (not good) to 5 (very good){% endblocktrans %}
-      </li>
-      <li>
-       {% blocktrans %}Private commentary where you can tell us what you liked, what didn't, what we should do differently, etc.{% endblocktrans %}
-      </li>
-      <li>
-       {% blocktrans %}Comment for the report, which helps us and other children to learn as much as possible about the event. What you have experienced yourself is very interesting for the next participants!{% endblocktrans %}
-      </li>
-     </ul>
-     <p>
-      {% blocktrans %}Your feedback will be emailed to us. We may contact you again.{% endblocktrans %}
-     </p>
-    </div>
-   </div>
-  </div>
- </div>
-
-  <form method="post" enctype="multiform/formdata">
-    {% csrf_token %}
-    {% form form=feedback_form %}{% endform %}
-    {% include "core/partials/save_button.html" %}
-  </form>
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/full.html b/aleksis/apps/paweljong/templates/paweljong/event/full.html
new file mode 100644
index 0000000000000000000000000000000000000000..1bbdf1cd5537050ebd2926610a7f060fea82a75e
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/full.html
@@ -0,0 +1,69 @@
+{% extends "core/base.html" %}
+{% load material_form i18n any_js coerce static %}
+
+{% block browser_title %}{% blocktrans %}Event{% endblocktrans %} {{ event.display_name }}{% endblock %}
+
+{% block extra_head %}
+  <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
+{% endblock %}
+
+{% block content %}
+
+ <div class="card">
+   <div class="card-content">
+     <div class="row">
+       <div class="col s1">
+         <time datetime="{{ event.date_event|date:'Y-m-d' }}" class="icon">
+           <em>{{ event.date_event|date:'l' }}</em>
+           <strong>{{ event.date_event|date:'F' }}</strong>
+           <span>{{ event.date_event|date:'d' }}</span>
+         </time>
+       </div>
+       <div class="col s11">
+         <span class="card-title">
+          {{ event.display_name }}
+         </span>
+         <ul>
+           <li>
+             {{ event.description }}
+           </li>
+           <br />
+           <li>
+             {% blocktrans %}
+               The event takes place in <strong>{{ event.place }}</strong>
+               (Information on overnight stays and shared trips see description)
+             {% endblocktrans %}
+           </li>
+           <li>
+             {% trans "Registration possible until" %} <strong>{{ event.date_registration }}</strong>
+           </li>
+           <li>
+             {% trans "Cost" %}: <strong>{{ event.cost }} €</strong> {% trans "incl. program, overnight stays, trips and meals" %}
+             {% trans "(if part of the event)" %}
+           </li>
+           <li>
+             {% trans "Booked participants slots" %}: <strong>{{ event.linked_group.members.count }} {% trans "of" %} {{ event.max_participants }}</strong>
+           </li>
+           <div class="progress">
+             <div class="determinate" style="min-width: 2em;width:{{ event.booked_percentage|coerce_max:100|floatformat:0 }}%">
+             </div>
+           </div>
+           <p class="center">{{ event.booked_percentage|coerce_max:100 }} %</p>
+         </ul>
+       </div>
+     </div>
+   </div>
+   <div class="card-action">
+     {% if can_register and not is_authenticated %}
+       <a href="{% url "register_event_by_slug_start" event.linked_group.short_name %}">{% trans "Register now" %}</a>
+     {% elif can_register and is_authenticated %}
+       <a href="{% url "register_event_by_slug" event.linked_group.short_name %}">{% trans "Register now" %}</a>
+     {% else %}
+       <a href="#">{% trans "Not available" %}</a>
+     {% endif %}
+   </div>
+ </div>
+
+ {{ event.information | safe }}
+
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/manage.html b/aleksis/apps/paweljong/templates/paweljong/event/manage.html
index 3ecb26394bfbd2b16c709e310d095fc24e0b8490..bf3179cf26c04317250d28a08655e1727a6f62c4 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event/manage.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event/manage.html
@@ -1,15 +1,26 @@
 {% extends "core/base.html" %}
-{% load i18n %}
+{% load material_form i18n %}
+
 {% load render_table from django_tables2 %}
 
 {% block page_title %}{% blocktrans %}Manage events{% endblocktrans %}{% endblock %}
 {% block browser_title %}{% blocktrans %}Manage events{% endblocktrans %}{% endblock %}
 
 {% block content %}
- <h5>
-  {% blocktrans %}Upcoming events{% endblocktrans %}
- </h5>
 
- {% render_table object_list %}
+  <h5>{% trans "Filter events" %}</h5>
+  <form method="get">
+    {% form form=events_filter.form %}{% endform %}
+    {% trans "Search" as caption %}
+    {% include "core/partials/save_button.html" with caption=caption icon="search" %}
+    <button type="reset" class="btn red waves-effect waves-light">
+      <i class="material-icons left">clear</i>
+      {% trans "Clear" %}
+    </button>
+    <a class="btn colour-primary waves-effect waves-light" href="{% url 'create_event' %}">{% trans "Create event" %}</a>
+  </form>
+
+  <h5>{% trans "Selected events" %}</h5>
+  {% render_table events_table %}
 
 {% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register.html b/aleksis/apps/paweljong/templates/paweljong/event/register.html
deleted file mode 100644
index 0613fb71937f1bed58211b4bd986b5d862afae0d..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/paweljong/event/register.html
+++ /dev/null
@@ -1,116 +0,0 @@
-{% extends "core/base.html" %}
-{% load material_form i18n %}
-
-{% block page_title %}{% blocktrans %}Event registration{% endblocktrans %}{% endblock %}
-{% block browser_title %}{% blocktrans %}Event registration{% endblocktrans %}{% endblock %}
-
-{% block content %}
- <h5>
-  {% blocktrans %}Registration for{% endblocktrans %} {{ event.display_name }}
- </h5>
-
- <div class="row">
-  <div class="col s12 m6">
-   <div class="card info">
-    <div class="card-content">
-     <span class="card-title">{% blocktrans %}Information for parents{% endblocktrans %}</span>
-     <p>
-      {% blocktrans %}
-       Please go through the registration with your child.  It is important
-       to us to train important skills in dealing with the Internet and
-       responsibility in general with the registration.
-      {% endblocktrans %}
-     </p>
-    </div>
-    <div class="card-content">
-     <span class="card-title">{% blocktrans %}Information for children{% endblocktrans %}</span>
-     <p>
-      {% blocktrans %}
-       Please read everything carefully with your parents and then send your
-       registration together with them!
-      {% endblocktrans %}
-     </p>
-    </div>    
-   </div>
-  </div>
-  <div class="col s12 m6">
-   <div class="card info">
-    <div class="card-content">
-     <span class="card-title">{% blocktrans %}Information about the event{% endblocktrans %}</span>
-     <p>
-      {% blocktrans %}
-       Please read the
-      {% endblocktrans %}
-      
-      <a href="{{ event.website }}">
-       {% blocktrans %}
-        website of the event
-       {% endblocktrans %}
-      </a>
-      
-      {% blocktrans %}
-       carefully together with your parents.
-      {% endblocktrans %}
-     </p>
-     <ul>
-      <li>
-       {% blocktrans %}
-        The event will take place from
-       {% endblocktrans %}
-
-       {{ event.date_event }}
-
-       {% blocktrans %}
-       at
-       {% endblocktrans %}
-
-       {{ event.l }}
-
-      </li>
-      <li>
-       {% blocktrans %}
-        Registration is possible until
-       {% endblocktrans %}
-
-       {{ event.date_registration }};
-
-       {% blocktrans %}
-        the number of participants is limited to
-       {% endblocktrans %}
-       
-       {{ event.max_participants }}
-
-       {% blocktrans %}
-        participants
-       {% endblocktrans %}.
-      </li>
-      <li>
-       {% blocktrans %}
-        The participation fee is
-       {% endblocktrans %}
-
-       {{ event.cost }} €
-
-       {% blocktrans %}
-        and must be paid in advance and within 7 days after receipt of the
-        invoice.  Cancellation with reimbursement is possible until
-       {% endblocktrans %}
-
-       {{ event.date_retraction }}
-
-       {% blocktrans %}
-        and only for good reason.
-       {% endblocktrans %}
-      </li>
-     </ul>
-    </div>
-   </div>
-  </div>
- </div>
-
- <form method="post">
-   {% csrf_token %}
-   {% form form=register_form %}{% endform %}
-   {% include "core/partials/save_button.html" %}
- </form>
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register_additional.html b/aleksis/apps/paweljong/templates/paweljong/event/register_additional.html
deleted file mode 100644
index c89b1d30c7530af5e7b1aeee9c684865d948d828..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/paweljong/event/register_additional.html
+++ /dev/null
@@ -1,55 +0,0 @@
-{% extends "ticdesk/base_with_info_sidebar.html" %}
-{% load  i18n %}
-
-{% block page_title %}{% blocktrans %}Zusätzliche Angaben zur Veranstaltungsanmeldung{% endblocktrans %}{% endblock %}
-
-{% block content_info_children %}
- {% blocktrans %}
-  Bitte lies dir mit deinen Eltern gemeinsam alles genau durch und schicke
-  deine Anmeldung dann mit ihnen gemeinsam ab!
- {% endblocktrans %}
-{% endblock %}
-
-{% block content_info_parents %}
- {% blocktrans %}
-  Bitte gehen Sie die Anmeldung mit Ihrem Kind gemeinsam durch. Uns ist es
-  wichtig, schon mit der Anmeldung wichtige Kompetenzen im Umgang mit dem
-  Internet und Verantwortung im Allgemeinen zu trainieren.
- {% endblocktrans %}
-{% endblock %}
-
-{% block content %}
- <h5>
-  {% blocktrans %}Zusätzliche Angaben zu{% endblocktrans %} {{ event.display_name }}
- </h5>
-
- {% if error %}
-  <div class="alert alert-danger">
-   <div class="alert-heading">
-    {% blocktrans %}Fehler{% endblocktrans %}
-   </div>
-   <hr>
-    <p>
-     {{ error }}
-    </p>
-  </div>
- {% elif success %}
-  <div class="alert alert-success">
-   <div class="alert-heading">
-    {% blocktrans %}Anmeldung erfolgreich{% endblocktrans %}
-   </div>
-   <hr>
-    <p>
-     {% blocktrans %}
-      Du hast deien Angaben erfolgreich eingesendet.
-     {% endblocktrans %}
-    </p>
-  </div>
- {% else %}
-  <form method="post">
-   {% csrf_token %}
-   {% bootstrap_form register_form %}
-   <input type="submit" value="{% blocktrans %}Absenden{% endblocktrans %}" />
-  </form>
- {% endif %}
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register_start.html b/aleksis/apps/paweljong/templates/paweljong/event/register_start.html
new file mode 100644
index 0000000000000000000000000000000000000000..46d579b03eba1fbddb59714b204dc610ac92e80a
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/register_start.html
@@ -0,0 +1,123 @@
+{% extends "core/base.html" %}
+{% load i18n static %}
+
+{% block browser_title %}{% blocktrans %}Register for{% endblocktrans %} {{ event.display_name }}{% endblock %}
+
+{% block extra_head %}
+  <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
+{% endblock %}
+
+{% block content %}
+
+ <div class="card">
+   <div class="card-content">
+     <div class="row">
+       <div class="col s12">
+         <span class="card-title">
+          {{ event.display_name }}
+         </span>
+         <p>
+           {% blocktrans %}
+           Welcome to the registration for this event! Please make sure to fill in
+           the registration yourself, as the child who wants to participate.
+           You should fill in the registration together with a parent (or other legal
+           guardian).
+           {% endblocktrans %}
+         </p>
+         <p>
+           {% blocktrans %}
+           We ask parents to not fill in the registration on behalf of their child.
+           {% endblocktrans %}
+         </p>
+         <p>
+           {% blocktrans %}
+           Every participant needs a personal e-mail address. This address must be one
+           that you, the participating child, check and read yourself, not one owned by your
+           parents. Of course, we will always send important information to your parents as well.
+           {% endblocktrans %}
+         </p>
+         <p>
+           {% blocktrans %}
+           If you do not have a personal e-mail address yet, and do not want or cannot register
+           one with one of the "big" providers (keep in mind that Google, Outlook, etc. are
+           allowed from 16 years only, and often collect and analyse your private mail), you can
+           register an e-mail address with us.
+           {% endblocktrans %}
+         </p>
+         <p>
+           {% blocktrans %}
+           If you already have a user account with Teckids, do not register a new one. Login
+           with your existing username and password. If you have forgotten your password, please
+           send us an e-mail (pelase do this yourself, with the help of your parents, if needed).
+           {% endblocktrans %}
+         </p>
+       </div>
+     </div>
+   </div>
+   <div class="card-tabs">
+     <ul class="tabs tabs-fixed-width">
+       {% if can_register %}
+       <li class="tab">
+         <a href="#already_registered">
+           {% trans "I already have an account" %}
+         </a>
+       </li>
+       <li class="tab">
+         <a href="#without_email">
+           {% trans "I have a personal email address" %}
+         </a>
+       </li>
+       <li class="tab">
+         <a href="#with_email">
+            {% trans "I don't have a personal email address" %}
+         </a>
+       </li>
+       {% else %}
+       <li class="tab">
+         <a href="#not_possible">{% trans "Not available" %}</a>
+       </li>
+     {% endif %}
+   </div>
+   <div class="card-content grey lighten-4">
+     {% if can_register %}
+     <div id="already_registered">
+       <p>
+         {% blocktrans %}
+         If you already have a Teckids account, please login here. If you forgot your password,
+         or have problems logging in, please send us an e-mail.
+         {% endblocktrans %}
+       </p>
+       <a href="{% url "login" %}?next=/app/paweljong/event/{{ event.linked_group.short_name }}/register">{% trans "Login" %}</a>
+     </div>
+     <div id="with_email">
+       <p>
+         {% blocktrans %}
+         You can now choose a personal e-mail address hosted on our servers.
+         For information about receiving mails, see <a
+         href="https://leopard.institute/pages/services.html">
+         https://leopard.institute/pages/services.html</a>
+         {% endblocktrans %}
+       </p>
+       <a href="{% url "set_email_needed" event.linked_group.short_name %}">{% trans "Register now" %}</a>
+     </div>
+     <div id="without_email">
+       <p>
+         {% blocktrans %}
+         You will be asked for your existing, personal e-mail address. Please remember
+         that you should not use an address owned by your parents. If you do not have
+         a personal e-mail address, please choose the respective option instead!
+         {% endblocktrans %}
+       </p>
+       <a href="{% url "register_event_by_slug" event.linked_group.short_name %}">{% trans "Register now" %}</a>
+     </div>
+     {% else %}
+     <div id="not_possible">
+       <p>
+         {% blocktrans %}
+         Registration is no longer possible.
+         {% endblocktrans %}
+     </div>
+     {% endif %}
+   </div>
+ </div>
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html b/aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html
new file mode 100644
index 0000000000000000000000000000000000000000..8e3d8a191b132efd426fda25aadd04738821ea7c
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/register_wizard.html
@@ -0,0 +1,47 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block browser_title %}{{ browser_title }}{% endblock %}
+{% block page_title %}{{ page_title }}{% endblock %}
+
+{% block content %}
+ <div class="row">
+  <div class="col s12">
+   <div class="card info">
+    <div class="card-content">
+     <span class="card-title">{{ info_title }}</span>
+     <p>
+       {{ info_text | safe }}
+     </p>
+    </div>
+   </div>
+  </div>
+ </div>
+
+ <form method="post" enctype="multipart/form-data">
+     {% csrf_token %}
+     {{ wizard.form.media }}
+     {{ wizard.management_form }}
+     {% if wizard.form.forms %}
+         {{ wizard.form.management_form }}
+         {% for form in wizard.form.forms %}
+             {% form form=form %}{% endform %}
+         {% endfor %}
+     {% else %}
+         {% form form=wizard.form %}{% endform %}
+     {% endif %}
+ 
+     {% if wizard.steps.prev %}
+         <button type="submit" value="{{ wizard.steps.first }}" class="btn waves-effect waves-light color-primary" name="wizard_goto_step">
+             <i class="material-icons left">first_page</i>
+             {% trans "first step" %}
+         </button>
+         <button type="submit" value="{{ wizard.steps.prev }}" class="btn waves-effect waves-light color-secondary" name="wizard_goto_step">
+             <i class="material-icons left">arrow_back_ios</i>
+             {% trans "previous step" %}
+         </button>
+     {% endif %}
+     {% trans "Next" as caption %}
+     {% include "core/partials/save_button.html" with caption=caption icon="navigate_next" %}
+ </form>
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html b/aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html
new file mode 100644
index 0000000000000000000000000000000000000000..69deda222e63d88e4fcb3d36ae72de3369f69ae8
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/register_wizard_consent.html
@@ -0,0 +1,61 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block browser_title %}{{ browser_title }}{% endblock %}
+{% block page_title %}{{ page_title }}{% endblock %}
+
+{% block content %}
+ <div class="row">
+  <div class="col s12">
+   <div class="card info">
+    <div class="card-content">
+     <span class="card-title">{{ info_title }}</span>
+     <p>
+       {{ info_text | safe }}
+     </p>
+    </div>
+   </div>
+  </div>
+ </div>
+
+ <div class="row">
+  {% for term in event.terms.all %}
+  <div class="col s12">
+   <div class="card">
+     <div class="card-content">
+      <span class="card-title">{{ term.title }}</span>
+      {{ term.term | safe}}
+     </div>
+    </div>
+  </div>
+  {% endfor %}
+ </div>
+
+ <h5>{% trans "Consents" %}</h5>
+ <form method="post" enctype="multipart/form-data">
+     {% csrf_token %}
+     {{ wizard.form.media }}
+     {{ wizard.management_form }}
+     {% if wizard.form.forms %}
+         {{ wizard.form.management_form }}
+         {% for form in wizard.form.forms %}
+             {% form form=form %}{% endform %}
+         {% endfor %}
+     {% else %}
+         {% form form=wizard.form %}{% endform %}
+     {% endif %}
+ 
+     {% if wizard.steps.prev %}
+         <button type="submit" value="{{ wizard.steps.first }}" class="btn waves-effect waves-light color-primary" name="wizard_goto_step">
+             <i class="material-icons left">first_page</i>
+             {% trans "first step" %}
+         </button>
+         <button type="submit" value="{{ wizard.steps.prev }}" class="btn waves-effect waves-light color-secondary" name="wizard_goto_step">
+             <i class="material-icons left">arrow_back_ios</i>
+             {% trans "previous step" %}
+         </button>
+     {% endif %}
+     {% trans "Next" as caption %}
+     {% include "core/partials/save_button.html" with caption=caption icon="navigate_next" %}
+ </form>
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/registered.html b/aleksis/apps/paweljong/templates/paweljong/event/registered.html
new file mode 100644
index 0000000000000000000000000000000000000000..5100c5c815ed1a9f922a8de040267966d6219a7a
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/event/registered.html
@@ -0,0 +1,12 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block page_title %}{% blocktrans %}Registered successfully{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Registered successfully{% endblocktrans %}{% endblock %}
+
+{% block content %}
+
+
+  {{ form_data }}
+
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
index f6a95d25a5606489d8943b4547307c09802e3815..0f2bbcd6672e75f7c08372d465c6f9a65493799f 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
@@ -10,20 +10,20 @@
 {% block content %}
   <h4>{{ registration }} </h4>
 
-  {% has_perm 'ticdesk.manage_registration' user registration as can_manage_registration %}
-  {% has_perm 'ticdesk.delete_registration' user registration as can_delete_registration %}
+  {% has_perm 'paweljong.manage_registration' user registration as can_manage_registration %}
+  {% has_perm 'paweljong.delete_registration' user registration as can_delete_registration %}
 
   {% if can_manage_registration or can_manage_registration_preferences or can_delete_registration %}
     <p>
       {% if can_manage_registration %}
-        <a href="{% url 'edit_registration_by_id' registration.id %}" class="btn waves-effect waves-light">
+        <a href="{% url 'edit_registration_by_pk' registration.pk %}" class="btn waves-effect waves-light">
           <i class="material-icons left">edit</i>
           {% trans "Edit" %}
         </a>
       {% endif %}
 
       {% if can_delete_registration %}
-        <a href="{% url 'delete_registration_by_id' registration.id %}" class="btn waves-effect waves-light red">
+        <a href="{% url 'delete_registration_by_pk' registration.pk %}" class="btn waves-effect waves-light red">
           <i class="material-icons left">delete</i>
           {% trans "Delete" %}
         </a>
@@ -98,6 +98,15 @@
             <td colspan="3">{{ registration.person.date_of_birth|date }}</td>
           </tr>
         {% endif %}
+        <tr>
+          <td></td>
+          <td>
+            <i class="material-icons small">school</i>
+          </td>
+          <td>{{ registration.school_class }}</td>
+          <td>{{ registration.school }}</td>
+          <td>{{ registration.school_place }}</td>
+        </tr>
       </table>
     </div>
     <div class="col s12 m12">
@@ -107,25 +116,69 @@
           <td>
             <i class="material-icons small">local_activity</a>
           </td>
-          <td colspan="3"><a href="{% url 'edit_event_by_id' registration.event.id %}">{{ registration.event }}</a></td>
+          <td colspan="3"><a href="{% url 'edit_event_by_slug' registration.event.linked_group.short_name %}">{{ registration.event }}</a></td>
         </tr>
         <tr>
           <td>
-            <i class="material-icons small">redeem</a>
+            <i class="material-icons small">redeem</i>
           </td>
-          <td colspan="3">{{ registration.donation }}</td>
+          <td colspan="3">{{ registration.donation }}€</td>
         </tr>
         <tr>
           <td>
-            <i class="material-icons small">payment</a>
+            <i class="material-icons small">payment</i>
           </td>
           <td>{% trans "SEPA direct debit" %}: {{ registration.accept_sepa }}</td>
           {% if registration.accept_sepa %}
             <td>{% trans "IBAN" %}: {{ registration.iban }}</td>
           {% endif %}
         </tr>
+        {% if registration.extended_data %}
+          {% for field, value in registration.extended_data.items %}
+            <tr>
+              <td>
+                {{ field }}
+              </td>
+              <td>
+                {{ value }}
+              </td>
+            </tr>
+          {% endfor %}
+        {% endif %}
+        {% if registration.accepted_terms %}
+          {% for term in registration.accepted_terms.all %}
+            <tr>
+              <td>
+                {{ term }}
+              </td>
+              <td>
+                {% trans "Accepted" %}
+              </td>
+            </tr>
+          {% endfor %}
+        {% endif %}
+
+        <tr>
+          <tr>
+            <td>
+              <i class="material-icons small">medical_services</i>
+            </td>
+            <td>
+              {{ registration.medical_information }}
+            </td>
+          </tr>
+        </tr>
+        <tr>
+          <tr>
+            <td>
+              <i class="material-icons small">question_answer</i>
+            </td>
+            <td>
+              {{ registration.comment }}
+            </td>
+          </tr>
+        </tr>
       </table>
-      </p>
     </div>
   </div>
 
diff --git a/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/edit.html b/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/edit.html
deleted file mode 100644
index 96f73df934d06b93ad7bba523f10c904bb5e947c..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/edit.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "core/base.html" %}
-{% load material_form i18n %}
-
-{% block page_title %}{% blocktrans %}Edit feedback aspect{% endblocktrans %}{% endblock %}
-{% block browser_title %}{% blocktrans %}Edit feedback aspect{% endblocktrans %}{% endblock %}
-
-{% block content %}
-  <form method="post">
-    {% csrf_token %}
-    {% form form=edit_feedback_aspect_form %}{% endform %}
-    {% include "core/partials/save_button.html" %}
-  </form>
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html b/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html
deleted file mode 100644
index 8b02215db8474853eb095ee7f8f2b967cd2c261a..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/paweljong/feedback_aspect/list.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "core/base.html" %}
-{% load material_form i18n %}
-
-{% load render_table from django_tables2 %}
-
-{% block page_title %}{% blocktrans %}Feedback aspects{% endblocktrans %}{% endblock %}
-{% block browser_title %}{% blocktrans %}Feedback aspects{% endblocktrans %}{% endblock %}
-
-{% block content %}
-
-  <h5>{% trans "Filter feedback_aspects" %}</h5>
-  <form method="get">
-    {% form form=feedback_aspects_filter.form %}{% endform %}
-    {% trans "Search" as caption %}
-    {% include "core/partials/save_button.html" with caption=caption icon="search" %}
-    <button type="reset" class="btn red waves-effect waves-light">
-      <i class="material-icons left">clear</i>
-      {% trans "Clear" %}
-    </button>
-    <a class="btn colour-primary waves-effect waves-light" href="{% url 'create_feedback_aspect' %}">{% trans "Create feedback aspect" %}</a>
-  </form>
-
-  <h5>{% blocktrans %}Selected feedback aspects{% endblocktrans %}</h5>
-    {% render_table feedback_aspects_table %}
-
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/print/corona.html b/aleksis/apps/paweljong/templates/paweljong/print/corona.html
index 5f06adfa8aa0fef1c7e1f855332449f1dc5eb848..1ecf0e79096f707baadbefcfe204c83f862836d2 100644
--- a/aleksis/apps/paweljong/templates/paweljong/print/corona.html
+++ b/aleksis/apps/paweljong/templates/paweljong/print/corona.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block extra_head %}
-    <link rel="stylesheet" href="{% static 'ticdesk.css' %}">
+    <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
 {% endblock %}
 
 {% block browser_title %}{{ group }} — {% trans "Corona" %}{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html b/aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html
index 00645156d75413b00db0dd355076d848a2eb03f4..8c27ec1bff26eba50780ed21c7a4bbd57eca7111 100644
--- a/aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html
+++ b/aleksis/apps/paweljong/templates/paweljong/print/list_attendance.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block extra_head %}
-    <link rel="stylesheet" href="{% static 'ticdesk.css' %}">
+    <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
 {% endblock %}
 
 {% block browser_title %}{{ group }} — {% trans "attendance list" %}{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/print/list_participants.html b/aleksis/apps/paweljong/templates/paweljong/print/list_participants.html
index 3ab8aa80d0242eeb2b37da4fb1590ba1985ce7ed..f6b9ea3d15a0bd2b6285e290f71201fd093d3942 100644
--- a/aleksis/apps/paweljong/templates/paweljong/print/list_participants.html
+++ b/aleksis/apps/paweljong/templates/paweljong/print/list_participants.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block extra_head %}
-    <link rel="stylesheet" href="{% static 'css/ticdesk/ticdesk.css' %}">
+     <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
 {% endblock %}
 
 {% block browser_title %}{{ group }} — {% trans "participant list" %}{% endblock %}
@@ -21,8 +21,6 @@
                 <th class="table-print">{% trans "First name" %}</th>
                 <th class="table-print">{% trans "Date of birth" %}</th>
                 <th class="table-print">{% trans "Mobile number" %}</th>
-                <th class="table-print">{% trans "School" %}</th>
-                <th class="table-print">{% trans "Class" %}</th>
             </tr>
         </thead>
         <tbody>
@@ -43,8 +41,6 @@
                     <td class="table-print">{{ person.first_name }}</td>
                     <td class="table-print">{{ person.date_of_birth }}</td>
                     <td class="table-print">{{ person.mobile_number }}</td>
-                    <td class="table-print">{{ person.school }}</td>
-                    <td class="table-print">{{ person.school_class }}</td>
                 </tr>
             {% endfor %}
         </tbody>
diff --git a/aleksis/apps/paweljong/templates/paweljong/print/list_sign.html b/aleksis/apps/paweljong/templates/paweljong/print/list_sign.html
index 499105aae70dd65a249971eab84e4c03cc201a76..cd6e41c710b58a1b2129e488ee263631ab155713 100644
--- a/aleksis/apps/paweljong/templates/paweljong/print/list_sign.html
+++ b/aleksis/apps/paweljong/templates/paweljong/print/list_sign.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block extra_head %}
-    <link rel="stylesheet" href="{% static 'ticdesk.css' %}">
+     <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
 {% endblock %}
 
 {% block browser_title %}{{ group }} — {% trans "signature list" %}{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/print/voucher.html b/aleksis/apps/paweljong/templates/paweljong/print/voucher.html
index 2102cd43900b5f0b5c9b87ba04b062d9f4ef246f..59bb677c7505381a10585a2ce8b0c4ef7bcaf65c 100644
--- a/aleksis/apps/paweljong/templates/paweljong/print/voucher.html
+++ b/aleksis/apps/paweljong/templates/paweljong/print/voucher.html
@@ -5,6 +5,10 @@
     {% trans "Voucher for "%} {{ voucher.event }}
 {% endblock %}
 
+{% block extra_head %}
+  <link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
+{% endblock %}
+
 {% block browser_title %}{% trans "Voucher for "%} {{ voucher.event }}{% endblock %}
 
 {% block content %}
@@ -14,7 +18,7 @@
         <h3>{{ voucher.event }}<h3>
         <h4>{{ voucher.code }}</h4>
         <p>{% trans "Voucher for" %} {{ voucher.person.first_name }} {{ voucher.person.last_name }} {% trans "to visit event" %} {{ voucher.event }} {% trans "on" %} {{ voucher.event.date_event }} {% trans "at" %} {{ voucher.event.place }}!</p>
-        <p>{% trans "To use the voucher, register for the event " %} <a href="{% url 'register_event_by_id' voucher.event.id %}">{% trans "here" %}</a></p>
+        <p>{% trans "To use the voucher, register for the event " %} <a href="{% url 'register_event_by_pk' voucher.event.pk %}">{% trans "here" %}</a></p>
     </div>
 
 {% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/term/create.html b/aleksis/apps/paweljong/templates/paweljong/term/create.html
new file mode 100644
index 0000000000000000000000000000000000000000..e3db75f36e5325a3b9690bf15d92268d6ced1366
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/term/create.html
@@ -0,0 +1,19 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block page_title %}{% blocktrans %}Create term{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Create term{% endblocktrans %}{% endblock %}
+
+{% block extra_head %}
+    {{ form.media.css }}
+{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+
+  {{ form.media.js }}
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/term/edit.html b/aleksis/apps/paweljong/templates/paweljong/term/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..1dcdc77e3b8c4507ba29715cb6ed9b27aafdef39
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/term/edit.html
@@ -0,0 +1,18 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block page_title %}{% blocktrans %}Edit term{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Edit term{% endblocktrans %}{% endblock %}
+
+{% block extra_head %}
+    {{ form.media.css }}
+{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+  {{ form.media.js }}
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/term/list.html b/aleksis/apps/paweljong/templates/paweljong/term/list.html
new file mode 100644
index 0000000000000000000000000000000000000000..9af632127a1484984dcf4f0aca3ae11e449db534
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/term/list.html
@@ -0,0 +1,14 @@
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% load render_table from django_tables2 %}
+
+{% block page_title %}{% blocktrans %}Terms{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Terms{% endblocktrans %}{% endblock %}
+
+{% block content %}
+
+    <a class="btn colour-primary waves-effect waves-light" href="{% url 'create_term' %}">{% trans "Create term" %}</a>
+    {% render_table table %}
+
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/voucher/create.html b/aleksis/apps/paweljong/templates/paweljong/voucher/create.html
new file mode 100644
index 0000000000000000000000000000000000000000..8e130babd885fd46019391819b0fbebf706b6831
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/paweljong/voucher/create.html
@@ -0,0 +1,20 @@
+{% extends "core/base.html" %}
+{% load material_form i18n any_js %}
+
+{% block page_title %}{% blocktrans %}Create voucher{% endblocktrans %}{% endblock %}
+{% block browser_title %}{% blocktrans %}Create voucher{% endblocktrans %}{% endblock %}
+
+{% block extra_head %}
+    {{ form.media.css }}
+    {% include_css "select2-materialize" %}
+{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+  {{ form.media.js }}
+  {% include_js "select2-materialize" %}
+{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/paweljong/voucher/edit.html b/aleksis/apps/paweljong/templates/paweljong/voucher/edit.html
index 7b9e0ec2318c8ec1132055f4f4c9f73366d2d9f2..1c6fbdabc3abfba36c647f1d1801618d3d2f3f3e 100644
--- a/aleksis/apps/paweljong/templates/paweljong/voucher/edit.html
+++ b/aleksis/apps/paweljong/templates/paweljong/voucher/edit.html
@@ -1,13 +1,20 @@
 {% extends "core/base.html" %}
-{% load material_form i18n %}
+{% load material_form i18n any_js %}
 
 {% block page_title %}{% blocktrans %}Edit voucher{% endblocktrans %}{% endblock %}
 {% block browser_title %}{% blocktrans %}Edit voucher{% endblocktrans %}{% endblock %}
 
+{% block extra_head %}
+    {{ form.media.css }}
+    {% include_css "select2-materialize" %}
+{% endblock %}
+
 {% block content %}
   <form method="post">
     {% csrf_token %}
-    {% form form=edit_voucher_form %}{% endform %}
+    {% form form=form %}{% endform %}
     {% include "core/partials/save_button.html" %}
   </form>
+  {{ form.media.js }}
+  {% include_js "select2-materialize" %}
 {% endblock %}
diff --git a/aleksis/apps/paweljong/templates/templated_email/event_created.email b/aleksis/apps/paweljong/templates/templated_email/event_created.email
index d82ac8357ee758b2a71b0c415b920ce896be8959..ff4816364cccb6f08f5cdb91b304cbfda43d3603 100644
--- a/aleksis/apps/paweljong/templates/templated_email/event_created.email
+++ b/aleksis/apps/paweljong/templates/templated_email/event_created.email
@@ -18,10 +18,6 @@
     {% for owner in new_event.group.owners.all %}
         * {{ owner }}
     {% endfor %}
-    * {% trans "Feedback aspects" %}:
-    {% for aspect in new_event.feedback_aspects.all %}
-         * {{ aspect }}
-    {% endfor %}
 
     {% blocktrans with sender=person %}
         The event was created by {{ sender }}
@@ -52,12 +48,6 @@
                 <li> {{ owner }}</li>
             {% endfor %}
 	    </ul>
-            <li> {% trans "Feedback aspects" %}</li>
-            <ul>
-            {% for aspect in new_event.feedback_aspects.all %}
-                 <li> {{ aspect }}</li>
-            {% endfor %}
-            </ul>
 	</ul>
     </blockquote>
 
diff --git a/aleksis/apps/paweljong/templates/templated_email/event_feedback.html b/aleksis/apps/paweljong/templates/templated_email/event_feedback.html
deleted file mode 100644
index 9d0e5556af8afd455f547304386b0315ee58f67b..0000000000000000000000000000000000000000
--- a/aleksis/apps/paweljong/templates/templated_email/event_feedback.html
+++ /dev/null
@@ -1,69 +0,0 @@
-{% load i18n %}
-
-{% block subject %} {% trans "New feedback on" %} {{ feedback.event }} {% endblock %}
-
-{% block plain %}
-    {% blocktrans with feedback.event=feedback.event %}New feedback on: {{ feedback.event }}{% endblocktrans %}
-
-    *** {% trans "Event" %} *****
-
-    * {% trans "Event" %}: {{ feedback.event }}
-
-    **** {% trans "Person " %} ****
-
-    * {% trans "Name" %}: {{ feedback.person }}
-    * {% trans "Date of birth" %}: {{ feedback.person.date_of_birth }}
-    * {% trans "Email address" %}: {{ feedback.person.email }}
-
-    **** {% trans "Comments" %} ****
-
-    * {% trans "Private comment" %}: {{ feedback.comment_private }}
-    * {% trans "Public comment" %}: {{ feedback.comment_public }}
-    * {% trans "Public comment info" %}: {{ feedback.comment_public_info }}
-
-    **** {% trans 'Photos' %} ****
-    
-    {% for photo in feedback.photos %}
-        * {{ photo }}
-    {% endfor %}
-    * {% trans "Photo licence" %}: {{ feedback.photos_licence }}
-
-
-    {% trans "Your AlekSIS team" %}
-{% endblock %}
-
-{% block html %}
-<main>
-    <p>{% blocktrans with new_feedback.event=new_feedback.event %}New feedback.event: {{ feedback.event}}{% endblocktrans %}</p>
-
-    <blockquote>
-        <h5>{% trans "Event" %}</h5>
-            <ul>
-                <li>{% trans "Event" %}: {{ feedback.event.feedback.event }}</li>
-            </ul>
-        <h5>{% trans "Person" %</h5>
-        <ul>
-            <li>{% trans "Name" %}: {{ feedback.event.person }}</li>
-            <li>{% trans "Date of birth" %}: {{ feedback.event.date_of_birth }}</li>
-            <li>{% trans "Email address" %}: {{ feedback.event.person.email }}</li>
-        </ul>
-        <h5>{% trans "Comments" %}</h5>
-        <ul>
-            <li>{% trans "Private comment" %}: {{ feedback.comment_private }}</li>
-            <li>{% trans "Public comment" %}: {{ feedback.comment_public }}</li>
-            <li>{% trans "Public comment info" %}: {{ feedback.comment_public_info }}</li>
-        </ul>
-        <h5>{% trans "Photos" %}</h5>
-        {% for photo in feedback.photos %}
-          <img src="{{ photo }}" alt="Feedback photo"></img>
-        {% endfor %}
-        <ul>
-          <li>{% trans "Photo licence" %}: {{ feedback.photos_licence }}</li>
-        </ul>
-    </blockquote>
-
-    <p>
-        <i>{% trans "Your AlekSIS team" %}</i>
-    </p>
-</main>
-{% endblock %}
diff --git a/aleksis/apps/paweljong/templates/templated_email/event_registred.email b/aleksis/apps/paweljong/templates/templated_email/event_registered.email
similarity index 74%
rename from aleksis/apps/paweljong/templates/templated_email/event_registred.email
rename to aleksis/apps/paweljong/templates/templated_email/event_registered.email
index da83ae3eb4a976d82870724edaee78499cdb2f27..7625aff61ab5ee5115856dad8f68a5c59c92f293 100644
--- a/aleksis/apps/paweljong/templates/templated_email/event_registred.email
+++ b/aleksis/apps/paweljong/templates/templated_email/event_registered.email
@@ -9,7 +9,7 @@
 
     * {% trans "Event" %}: {{ registration.event }}
 
-    **** {% trans "Person " %} ****
+    **** {% trans "Person" %} ****
 
     * {% trans "Name" %}: {{ registration.person }}
     * {% trans "Date of birth" %}: {{ registration.date_of_birth }}
@@ -34,11 +34,21 @@
         * {% trans "IBAN" %}: {{ registration.iban }}
     {% endif %}
 
-    **** {% trans "Declarations" %} ****
+    **** {% trans "Additional" %} ****
 
-    * {% trans "Consent by parents" %}: {{ registration.accept_terms }}
-    * {% trans "Data protection" %}: {{ registration.accept_data }}
-    * {% trans "Terms and conditions" %}: {{ registration.accept_general_terms }}
+    {% if registration.extended_data %}
+      {% for field, value in registration.extended_data.items %}
+          * {{ field }}: {{ value }}
+      {% endfor %}
+    {% endif %}
+
+    **** {% trans "Consents" %} ****
+
+    {% if registration.accepted_terms %}
+      {% for term in registration.accepted_terms.all %}
+          * {{ term.title }}: {% trans "Accepted" %}
+      {% endfor %}
+    {% endif %}
 
     {% trans "Your AlekSIS team" %}
 {% endblock %}
@@ -52,7 +62,7 @@
             <ul>
                 <li>{% trans "Event" %}: {{ registration.event }}</li>
             </ul>
-        <h5>{% trans "Person " %</h5>
+        <h5>{% trans "Person" %}</h5>
         <ul>
             <li>{% trans "Name" %}: {{ registration.person }}</li>
             <li>{% trans "Date of birth" %}: {{ registration.date_of_birth }}</li>
@@ -77,12 +87,24 @@
 	        <li>{% trans "IBAN" %}: {{ registration.iban }}</li>
 	    {% endif %}
 	</ul>
-	<h5>{% trans "Declarations" %}</h5>
-	<ul>
-	    <li>{% trans "Consent by parents" %}: {{ registration.accept_terms }}</li>
-	    <li>{% trans "Data protection" %}: {{ registration.accept_data }}</li>
-	    <li>{% trans "Terms and conditions" %}: {{ registration.accept_general_terms }}</li>
-	</ul>
+	<h5>{% trans "Additional" %}</h5>
+        {% if registration.extended_data %}
+          <ul>
+          {% for field, value in registration.extended_data.items %}
+            <li>
+              {{ field }}: {{ value }}
+            </li>
+          {% endfor %}
+          <ul>
+        {% endif %}
+        <h5>{% trans "Consents" %}</h5>
+	{% if registration.accepted_terms %}
+          <ul>
+          {% for term in registration.accepted_terms.all %}
+            <li>{{ term.title }}: {% trans "Accepted" %}</li>
+          {% endfor %}
+          </ul>
+        {% endif %}
     </blockquote>
 
     <p>
diff --git a/aleksis/apps/paweljong/templatetags/coerce.py b/aleksis/apps/paweljong/templatetags/coerce.py
new file mode 100644
index 0000000000000000000000000000000000000000..606331df83060a131d68fab705ee26ef763628b1
--- /dev/null
+++ b/aleksis/apps/paweljong/templatetags/coerce.py
@@ -0,0 +1,13 @@
+from django import template
+
+register = template.Library()
+
+
+@register.filter
+def coerce_max(value, arg):
+    return arg if value > arg else value
+
+
+@register.filter
+def coerce_min(value, arg):
+    return arg if value < arg else value
diff --git a/aleksis/apps/paweljong/urls.py b/aleksis/apps/paweljong/urls.py
index bad236b36099dfbf3807df0486a4a61104e21f92..7dd949c9f5dedf76c1d58ef175f981b698ea2784 100644
--- a/aleksis/apps/paweljong/urls.py
+++ b/aleksis/apps/paweljong/urls.py
@@ -1,41 +1,84 @@
 from django.urls import path
 
+from aleksis.apps.postbuero.forms import MailAddForm
+
 from . import views
+from .forms import (
+    RegisterEventAccount,
+    RegisterEventAdditional,
+    RegisterEventConsent,
+    RegisterEventContactDetails,
+    RegisterEventFinancial,
+    RegisterEventGuardians,
+)
+
+register_forms = [
+    ("email", MailAddForm),
+    ("register", RegisterEventAccount),
+    ("contact_details", RegisterEventContactDetails),
+    ("guardians", RegisterEventGuardians),
+    ("additional", RegisterEventAdditional),
+    ("financial", RegisterEventFinancial),
+    ("consent", RegisterEventConsent),
+]
+condition_dict = {
+    "email": views.is_email_needed,
+    "register": views.is_person_anonymous,
+}
 
 urlpatterns = [
-    path("event/<int:id_>/edit", views.edit_event, name="edit_event_by_id"),
-    path("event/<int:id_>/feedback", views.feedback_event, name="feedback_event_by_id"),
-    path("event/<int:id_>/register", views.register_event, name="register_event_by_id"),
-    path("events/create", views.edit_event, name="create_event"),
-    path("events/manage", views.ManageEvents.as_view(), name="manage_events"),
-    path("events/", views.events, name="events"),
-    path("vouchers/create", views.edit_voucher, name="create_vouchers"),
-    path("vouchers/<int:id_>/delete", views.delete_voucher, name="delete_voucher_by_id"),
-    path("vouchers/<int:id_>/edit", views.edit_voucher, name="edit_voucher_by_id"),
-    path("vouchers/<int:id_>/print", views.print_voucher, name="print_voucher_by_id"),
+    path("event/<slug:slug>/edit", views.EditEventView.as_view(), name="edit_event_by_slug"),
+    path(
+        "event/<slug:slug>/register",
+        views.RegisterEventWizardView.as_view(register_forms, condition_dict=condition_dict),
+        name="register_event_by_slug",
+    ),
+    path("event/<slug:slug>", views.EventFullView.as_view(), name="event_by_name"),
+    path(
+        "event/<slug:slug>/start",
+        views.RegisterEventStart.as_view(),
+        name="register_event_by_slug_start",
+    ),
+    path("misc/set_email_needed/<slug:slug>", views.set_email_needed, name="set_email_needed"),
+    path("events/create", views.CreateEventView.as_view(), name="create_event"),
+    path("events/manage", views.manage_events, name="manage_events"),
+    path("vouchers/create", views.VoucherCreateView.as_view(), name="create_vouchers"),
+    path(
+        "vouchers/<int:pk>/delete", views.VoucherDeleteView.as_view(), name="delete_voucher_by_pk"
+    ),
+    path("vouchers/<int:pk>/edit", views.VoucherEditView.as_view(), name="edit_voucher_by_pk"),
+    path("vouchers/<int:pk>/print", views.print_voucher, name="print_voucher_by_pk"),
     path("vouchers/", views.vouchers, name="vouchers"),
     path("event/lists/generate", views.generate_lists, name="generate_lists"),
     path("event/registrations/list", views.registrations, name="registrations"),
-    path("event/registrations/<int:id_>", views.registration, name="registration_by_id"),
     path(
-        "event/registrations/<int:id_>/edit",
-        views.edit_registration,
-        name="edit_registration_by_id",
+        "event/registrations/<int:pk>",
+        views.EventRegistrationDetailView.as_view(),
+        name="registration_by_pk",
+    ),
+    path(
+        "event/registrations/<int:pk>/edit",
+        views.EventRegistrationEditView.as_view(),
+        name="edit_registration_by_pk",
+    ),
+    path(
+        "event/registrations/<int:pk>/delete",
+        views.EventRegistrationDeleteView.as_view(),
+        name="delete_registration_by_pk",
     ),
     path(
-        "event/registrations/<int:id_>/delete",
-        views.delete_registration,
-        name="delete_registration_by_id",
+        "event/terms/list",
+        views.TermListView.as_view(),
+        name="terms",
     ),
-    path("event/feedback_aspects/list", views.feedback_aspects, name="feedback_aspects"),
     path(
-        "event/feedback_aspects/create",
-        views.edit_feedback_aspect,
-        name="create_feedback_aspect",
+        "event/terms/create",
+        views.TermCreateView.as_view(),
+        name="create_term",
     ),
     path(
-        "event/feedback_aspects/<int:id_>/edit",
-        views.edit_feedback_aspect,
-        name="edit_feedback_aspect_by_id",
+        "event/terms/<int:pk>/edit",
+        views.TermEditView.as_view(),
+        name="edit_term_by_pk",
     ),
 ]
diff --git a/aleksis/apps/paweljong/util.py b/aleksis/apps/paweljong/util.py
index ade0bd41dc5e7d287f09a658b15f87cd92d13119..f540e7e36c96d91312fb40c7294273721072a724 100644
--- a/aleksis/apps/paweljong/util.py
+++ b/aleksis/apps/paweljong/util.py
@@ -1,6 +1,4 @@
 import os
-import random
-import string
 from tempfile import mkstemp
 from textwrap import wrap
 
@@ -76,11 +74,3 @@ def upload_file_to_media_url(file, subdir="", prefix="upload_"):
     url = "%s/%s/%s" % (settings.MEDIA_URL, subdir, basename)
 
     return url
-
-
-def generate_code():
-    alphabet = string.ascii_uppercase + string.digits
-    length = 8
-    code = "".join(random.choice(alphabet) for _ in range(length))  # noqa
-
-    return code
diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py
index 515bef9f933133b5afcdd4554493e5eb6045ae17..7c24722a261ee699cc59f72af4f8dd89188974eb 100644
--- a/aleksis/apps/paweljong/views.py
+++ b/aleksis/apps/paweljong/views.py
@@ -1,319 +1,84 @@
-from typing import Optional
-
-from django.contrib.auth.decorators import login_required
+from django.conf import settings
+from django.contrib.auth import get_user_model
 from django.http import HttpRequest, HttpResponse
 from django.shortcuts import redirect, render
+from django.urls import reverse_lazy
 from django.utils import timezone
+from django.utils.decorators import method_decorator
+from django.utils.text import slugify
 from django.utils.translation import ugettext as _
-from django.views.generic.list import ListView
+from django.views.decorators.cache import never_cache
+from django.views.generic.detail import DetailView
 
 import reversion
 from django_tables2 import RequestConfig
-from reversion.views import create_revision
+from django_tables2.views import SingleTableView
+from formtools.wizard.views import SessionWizardView
+from reversion.views import RevisionMixin
 from rules.contrib.views import PermissionRequiredMixin, permission_required
 from templated_email import send_templated_mail
 
+from aleksis.apps.postbuero.models import MailAddress
+from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
 from aleksis.core.models import Activity, Person
 from aleksis.core.util import messages
-from aleksis.core.util.core_helpers import lazy_preference, objectgetter_optional
+from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional
 
-from .filters import EventRegistrationFilter, FeedbackAspectsFilter, VoucherFilter
+from .filters import EventFilter, EventRegistrationFilter, VoucherFilter
 from .forms import (
     EditEventForm,
     EditEventRegistrationForm,
-    EditFeedbackAspectForm,
+    EditTermForm,
     EditVoucherForm,
-    EventFeedbackForm,
     GenerateListForm,
-    RegisterEventForm,
-)
-from .models import Event, EventRegistration, FeedbackAspect, Voucher
-from .tables import (
-    EventRegistrationsTable,
-    EventsTable,
-    FeedbackAspectsTable,
-    ParticipatedEventsTable,
-    VouchersTable,
 )
-from .util import generate_code
-
-
-def events(request):
-    context = {}
-
-    # Get all upcoming events
-    now = timezone.datetime.today()
-    events = Event.objects.filter(date_event__gte=now, published=True)
-
-    # Build table
-    events_table = EventsTable(events)
-    RequestConfig(request).configure(events_table)
-    context["events_table"] = events_table
-
-    if request.user.is_authenticated:
-        # Get all events the person participated in.
-        current_person = Person.objects.get(user__username=request.user.username)
-        participated_events = Event.objects.filter(group__members=current_person)
-
-        # Build table
-        participated_events_table = ParticipatedEventsTable(participated_events)
-        RequestConfig(request).configure(participated_events_table)
-        context["participated_events_table"] = participated_events_table
-
-    return render(request, "paweljong/_event/list.html", context)
-
-
-@create_revision
-@login_required
-def register_event(request, id_):
-    context = {}
-
-    # Get current person and event
-    event = Event.objects.get(id=id_)
-    context["event"] = event
-
-    initial = {
-        "person": request.user.person,
-        "event": event,
-        "school": request.user.person.school,
-        "school_place": request.user.person.school_place,
-        "school_class": request.user.person.school_class,
-        "mobile_number": request.user.person.mobile_number,
-        "email": request.user.person.email,
-        "street": request.user.person.street,
-        "place": request.user.person.place,
-        "housenumber": request.user.person.housenumber,
-        "sex": request.user.person.sex,
-        "date_of_birth": request.user.person.date_of_birth,
-        "postal_code": request.user.person.postal_code,
-    }
-
-    if request.user.person.guardians.first():
-        initial.update(
-            {
-                "guardian_first_name": request.user.person.guardians.first().first_name,
-                "guardian_last_name": request.user.person.guardians.first().last_name,
-                "guardian_mobile_number": request.user.person.guardians.first().mobile_number,
-                "guardian_email": request.user.person.guardians.first().email,
-            }
-        )
-
-    register_form = RegisterEventForm(initial=initial)
-
-    # Produce error if registration is not possible
-    if not event.can_register(request):
-        messages.error(request, _("Registration is no longer possible"))
-        return redirect("events")
-
-    # Check whether person is already a member of the event
-    if request.user.person in event.group.members.all():
-        messages.success(request, _("You are already registred."))
-        return redirect("events")
+from .models import Event, EventRegistration, Terms, Voucher
+from .tables import EventRegistrationsTable, ManageEventsTable, TermsTable, VouchersTable
 
-    if request.method == "POST":
-        register_form = RegisterEventForm(request.POST, initial=initial)
-        if register_form.is_valid():
-            # Update person information if changed
-            if (
-                "school" in register_form.changed_data
-                or "school_class" in register_form.changed_data
-                or "school_place" in register_form.changed_data
-                or "mobile" in register_form.changed_data
-                or "sex" in register_form.changed_data
-                or "date_of_birth" in register_form.changed_data
-            ):
-                request.user.person.school = register_form.cleaned_data["school"]
-                request.user.person.school_class = register_form.cleaned_data["school_class"]
-                request.user.person.school_place = register_form.cleaned_data["school_place"]
-                request.user.person.mobile_number = register_form.cleaned_data["mobile_number"]
-                request.user.person.sex = register_form.cleaned_data["sex"]
-                request.user.person.date_of_birth = register_form.cleaned_data["date_of_birth"]
-
-                request.user.person.save()
-
-            # Store postal address in database
-            if (
-                "postal_code" in register_form.changed_data
-                or "place" in register_form.changed_data
-                or "street" in register_form.changed_data
-            ):
-
-                request.user.person.street = register_form.cleaned_data["steet"]
-                request.user.person.postal_code = register_form.cleaned_data["postal_code"]
-                request.user.person.place = register_form.cleaned_data["place"]
-
-                request.user.person.save()
-
-            if (
-                "guardian_first_name" in register_form.changed_data
-                or "guardian_last_name" in register_form.changed_data
-                or "guardian_mobile_number" in register_form.changed_data
-                or "guardian_email" in register_form.changed_data
-            ):
-                guardian = Person.objects.get_or_create(
-                    defaults={
-                        "first_name": register_form.cleaned_data["guardian_first_name"],
-                        "last_name": register_form.cleaned_data["guardian_last_name"],
-                        "mobile_number": register_form.cleaned_data["guardian_mobile_number"],
-                    },
-                    email=register_form.cleaned_data["guardian_email"],
-                )
-
-                request.user.person.guardians.add(guardian[0])
-                request.user.person.save()
-
-            # Add the current person to the event
-            event.add_member(request.user.person)
-            event.save()
-
-            registration = register_form.save(commit=True)
-            if "voucher_code" in register_form.changed_data:
-                voucher = Voucher.objects.get(code=register_form.cleaned_data["voucher_code"])
-                if voucher:
-                    registration.voucher = voucher
-                    with reversion.create_revision():
-                        registration.save()
-                else:
-                    messages.error(request, _("You entered an invalid voucher code!"))
-
-            send_templated_mail(
-                template_name="event_registred",
-                from_email=lazy_preference("mail", "address"),
-                recipient_list=["orga@.org"],
-                headers={
-                    "reply_to": [
-                        request.person.email,
-                        request.person.guardians.first().email,
-                    ],
-                },
-                context=context,
-            )
-
-            messages.success(
-                request,
-                _(
-                    "You have successfully registered for the event. Please give us"
-                    "up to two days to process your registration. You will then"
-                    "receive an email from us."
-                ),
-            )
-
-            act = Activity(
-                title=_("You registred for an event"),
-                description=_("You registred for the event %s" % event.display_name),
-                app="TIC-Desk",
-                user=request.user.person,
-            )
-            act.save()
-
-    context["register_form"] = register_form
-
-    return render(request, "paweljong/_event/register.html", context)
+User = get_user_model()
 
 
-@login_required
-def feedback_event(request, id_):
-    context = {}
-
-    # Get current person and event
-    current_person = Person.objects.get(user__username=request.user.username)
-    event = Event.objects.get(id=id_)
-    context["event"] = event
-
-    # Prepare the form
-    initial = {
-        "event": event,
-        "person": current_person,
-    }
+@method_decorator(never_cache, name="dispatch")
+class CreateEventView(PermissionRequiredMixin, AdvancedCreateView):
+    form_class = EditEventForm
+    model = Event
+    permission_required = "paweljong.change_event"
+    template_name = "paweljong/event/create.html"
+    success_url = reverse_lazy("mange_events")
+    success_message = _("The event has been saved.")
 
-    feedback_form = EventFeedbackForm(event, initial=initial)
-
-    # Check whether person is a member of the event
-    if current_person not in event.group.members.all():
-        return redirect("events")
-        messages.error(request, _("You did not take part in this event."))
-
-    if request.method == "POST":
-        if feedback_form.is_valid():
-            feedback = feedback_form.save(commit=True)
-            context["feedback"] = feedback
-            # Handle photo uploads, if any
-
-            send_templated_mail(
-                template_name="event_feedback",
-                from_email=lazy_preference("mail", "address"),
-                recipient_list=["verein@.org"],
-                headers={
-                    "reply_to": [
-                        request.person.email,
-                    ],
-                },
-                context=context,
-            )
-
-            # Set success
-            messages.success(request, _("Feedback successfully submitted."))
-            return redirect("events")
-
-            act = Activity(
-                title=_("You submitted feedback"),
-                description=_("You submitted feedback for %s" % event.display_name),
-                app="TIC-Desk",
-                user=request.user.person,
-            )
-            act.save()
 
-    context["feedback_form"] = feedback_form
+@method_decorator(never_cache, name="dispatch")
+class EditEventView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView):
+    form_class = EditEventForm
+    model = Event
+    slug_field = "linked_group__short_name"
+    permission_required = "paweljong.change_event"
+    context_object_name = "manage_events"
+    template_name = "paweljong/event/edit.html"
+    success_url = reverse_lazy("manage_events")
+    success_message = _("The event has been saved.")
 
-    return render(request, "paweljong/_event/feedback.html", context)
 
-
-@permission_required("paweljong.change_event", fn=objectgetter_optional(Event, None, False))
-def edit_event(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
-    """View to edit or create an event."""
+@permission_required("paweljong.change_events")
+def manage_events(request: HttpRequest) -> HttpResponse:
+    """List view listing all registrations."""
     context = {}
 
-    event = objectgetter_optional(Event, None, False)(request, id_)
-    context["event"] = event
-
-    if event:
-        # Edit form for existing event
-        edit_event_form = EditEventForm(request.POST or None, instance=event)
-    else:
-        # Empty form to create a new event
-        edit_event_form = EditEventForm(request.POST or None)
-
-    if request.method == "POST":
-        if edit_event_form.is_valid():
-            with reversion.create_revision():
-                new_event = edit_event_form.save()
-                context["new_event"] = new_event
-                context["person"] = request.user.person
-                send_templated_mail(
-                    template_name="event_created",
-                    from_email=lazy_preference("mail", "address"),
-                    recipient_list=["orga@.org"],
-                    context=context,
-                )
-            messages.success(request, _("The event has been saved."))
-
-            return redirect("events")
-
-    context["edit_event_form"] = edit_event_form
-
-    return render(request, "paweljong/_event/edit.html", context)
-
+    # Get all registrations
+    now = timezone.datetime.today()
+    events = Event.objects.filter(date_event__gte=now)
 
-class ManageEvents(ListView, PermissionRequiredMixin):
-    """View listing upcoming events."""
+    # Get filter
+    events_filter = EventFilter(request.GET, queryset=events)
+    context["events_filter"] = events_filter
 
-    template_name = "paweljong/_event/manage.html"
-    permission_required = "paweljong.change_events"
-    context = {}
+    # Build table
+    events_table = ManageEventsTable(events_filter.qs)
+    RequestConfig(request).configure(events_table)
+    context["events_table"] = events_table
 
-    def get_queryset(self):
-        now = timezone.datetime.today()
-        return Event.objects.filter(date_event__gte=now)
+    return render(request, "paweljong/event/manage.html", context)
 
 
 @permission_required("paweljong.view_vouchers")
@@ -335,70 +100,6 @@ def vouchers(request):
     return render(request, "paweljong/voucher/list.html", context)
 
 
-@permission_required("paweljong.delete_voucher")
-def delete_voucher(request, id_):
-    context = {}
-
-    current_voucher = Voucher.objects.get(id=id_)
-    current_voucher.deleted = True
-    with reversion.create_revision():
-        current_voucher.save()
-
-    act = Activity(
-        title=_("You deleted a voucher!"),
-        description=_("You deleted the voucher with ID %s" % current_voucher.id),
-        app="TIC-Desk",
-        user=request.user.person,
-    )
-    act.save()
-
-    messages.success(request, _("The voucher was successfully deleted."))
-
-    return redirect("vouchers")
-
-
-@permission_required("paweljong.change_voucher", fn=objectgetter_optional(Voucher, None, False))
-def edit_voucher(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
-    """View to edit or create a voucher."""
-    context = {}
-
-    voucher = objectgetter_optional(Voucher, None, False)(request, id_)
-    context["voucher"] = voucher
-
-    if id_:
-        # Edit form for existing voucher
-        edit_voucher_form = EditVoucherForm(request.POST or None, instance=voucher)
-    else:
-        # Empty form to create a new voucher
-        edit_voucher_form = EditVoucherForm(request.POST or None)
-
-    if request.method == "POST":
-        if edit_voucher_form.is_valid():
-            voucher = edit_voucher_form.save(commit=True)
-            if not voucher.code:
-                voucher.code = generate_code()
-            with reversion.create_revision():
-                voucher.save()
-
-            act = Activity(
-                title=_("You have created a voucher."),
-                description=_(
-                    "You have created a voucher for %s for %s" % (voucher.person, voucher.event)
-                ),
-                app="TIC-Desk",
-                user=request.user.person,
-            )
-            act.save()
-
-            messages.success(request, _("The voucher has been saved."))
-
-            return redirect("vouchers")
-
-    context["edit_voucher_form"] = edit_voucher_form
-
-    return render(request, "paweljong/voucher/edit.html", context)
-
-
 @permission_required("paweljong.generate_lists")
 def generate_lists(request: HttpRequest) -> HttpResponse:
     context = {}
@@ -439,51 +140,38 @@ def registrations(request: HttpRequest) -> HttpResponse:
     return render(request, "paweljong/event_registration/list.html", context)
 
 
-@permission_required(
-    "paweljong.view_registration",
-    fn=objectgetter_optional(EventRegistration, "request.user.person", True),
-)
-def registration(request: HttpRequest, id_) -> HttpResponse:
-    context = {}
-
-    registration = objectgetter_optional(EventRegistration, "request.user.person", True)(
-        request, id_
-    )
-
-    context["registration"] = registration
-
-    return render(request, "paweljong/event_registration/full.html", context)
-
-
-@permission_required(
-    "paweljong.delete_registrations",
-    fn=objectgetter_optional(EventRegistration, None, False),
-)
-def delete_registration(request: HttpRequest, id_) -> HttpResponse:
-    context = {}
-
-    registration = EventRegistration.objects.get(id=id_)
-
-    person = registration.person
+@method_decorator(never_cache, name="dispatch")
+class EventRegistrationCreateView(PermissionRequiredMixin, AdvancedCreateView):
+    """Create view for event registrations."""
 
-    registration.event.remove_member(registration.person)
-    registration.event.save()
+    model = EventRegistration
+    form_class = EditEventRegistrationForm
+    permission_required = "paweljong.manage_registration"
+    template_name = "paweljong/event_registration/create.html"
+    success_url = reverse_lazy("event_registrations")
+    success_message = _("The event registration has been created.")
 
-    registration.delete()
 
-    messages.success(request, _("Registration was successfully deleted."))
+@method_decorator(never_cache, name="dispatch")
+class EventRegistrationEditView(PermissionRequiredMixin, AdvancedEditView):
+    """Edit view for event registrations."""
 
-    return redirect("registrations")
+    model = EventRegistration
+    form_class = EditEventRegistrationForm
+    permission_required = "paweljong.manage_eventregistration"
+    template_name = "paweljong/event_registration/edit.html"
+    success_url = reverse_lazy("event_registrations")
+    success_message = _("The event registration has been saved.")
 
 
 @permission_required(
     "paweljong.manage_registrations",
     fn=objectgetter_optional(EventRegistration, None, False),
 )
-def edit_registration(request: HttpRequest, id_) -> HttpResponse:
+def edit_registration(request: HttpRequest, pk) -> HttpResponse:
     context = {}
 
-    registration = objectgetter_optional(EventRegistration, None, False)(request, id_)
+    registration = objectgetter_optional(EventRegistration, None, False)(request, pk)
 
     edit_event_registration_form = EditEventRegistrationForm(
         request.POST or None, instance=registration
@@ -504,72 +192,475 @@ def edit_registration(request: HttpRequest, id_) -> HttpResponse:
 
 
 @permission_required("paweljong.is_own_voucher", fn=objectgetter_optional(Voucher, None, False))
-def print_voucher(request: HttpRequest, id_) -> HttpResponse:
+def print_voucher(request: HttpRequest, pk) -> HttpResponse:
     context = {}
 
-    voucher = Voucher.objects.get(id=id_)
+    voucher = Voucher.objects.get(id=pk)
     context["voucher"] = voucher
 
     return render(request, "paweljong/print/voucher.html", context)
 
 
-@permission_required("paweljong.view_feedback_aspects")
-def feedback_aspects(request: HttpRequest) -> HttpResponse:
-    """List view listing all feedback_aspects."""
-    context = {}
+class EventRegistrationDetailView(PermissionRequiredMixin, DetailView):
+    """Detail view for an application instance."""
 
-    # Get all feedback_aspects
-    feedback_aspects = FeedbackAspect.objects.all()
+    context_object_name = "registration"
+    permission_required = "paweljong.view_registration"
+    template_name = "paweljong/event_registration/full.html"
 
-    # Get filter
-    feedback_aspects_filter = FeedbackAspectsFilter(request.GET, queryset=feedback_aspects)
-    context["feedback_aspects_filter"] = feedback_aspects_filter
+    def get_queryset(self):
+        return EventRegistration.objects.all()
 
-    # Build table
-    feedback_aspects_table = FeedbackAspectsTable(feedback_aspects_filter.qs)
-    RequestConfig(request).configure(feedback_aspects_table)
-    context["feedback_aspects_table"] = feedback_aspects_table
 
-    return render(request, "paweljong/feedback_aspect/list.html", context)
+class EventRegistrationDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
+    """Delete view for registrations."""
 
+    model = EventRegistration
+    permission_required = "paweljong.delete_eventregistration"
+    template_name = "core/pages/delete.html"
+    success_url = reverse_lazy("registrations")
+    success_message = _("The registration has been deleted.")
 
-@permission_required(
-    "paweljong.change_feedback_aspect",
-    fn=objectgetter_optional(FeedbackAspect, None, False),
-)
-def edit_feedback_aspect(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
-    """View to edit or create an feedback_aspect."""
-    context = {}
 
-    feedback_aspect = objectgetter_optional(FeedbackAspect, None, False)(request, id_)
-    context["feedback_aspect"] = feedback_aspect
+@method_decorator(never_cache, name="dispatch")
+class VoucherCreateView(PermissionRequiredMixin, AdvancedCreateView):
+    """Create view for vouchers."""
 
-    if id_:
-        # Edit form for existing feedback_aspect
-        edit_feedback_aspect_form = EditFeedbackAspectForm(
-            request.POST or None, instance=feedback_aspect
-        )
-    else:
-        # Empty form to create a new feedback_aspect
-        edit_feedback_aspect_form = EditFeedbackAspectForm(request.POST or None)
+    model = Voucher
+    form_class = EditVoucherForm
+    permission_required = "paweljong.add_voucher"
+    template_name = "paweljong/voucher/create.html"
+    success_url = reverse_lazy("vouchers")
+    success_message = _("The voucher has been created.")
 
-    if request.method == "POST":
-        if edit_feedback_aspect_form.is_valid():
-            with reversion.create_revision():
-                aspect = edit_feedback_aspect_form.save(commit=True)
 
-                act = Activity(
-                    title=_("You have create a feedback aspect."),
-                    description=_("You have created the feedback aspect: %s" % aspect),
-                    app="TIC-Desk",
-                    user=request.user.person,
+@method_decorator(never_cache, name="dispatch")
+class VoucherEditView(PermissionRequiredMixin, AdvancedEditView):
+    """Edit view for vouchers."""
+
+    model = Voucher
+    form_class = EditVoucherForm
+    permission_required = "paweljong.edit_voucher"
+    template_name = "paweljong/voucher/edit.html"
+    success_url = reverse_lazy("vouchers")
+    success_message = _("The voucher has been saved.")
+
+
+class VoucherDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
+    """Delete view for vouchers."""
+
+    model = Voucher
+    permission_required = "paweljong.delete_voucher"
+    template_name = "core/pages/delete.html"
+    success_url = reverse_lazy("vouchers")
+    success_message = _("The voucher has been deleted.")
+
+
+def is_person_anonymous(wizard):
+    return wizard.request.user.is_anonymous
+
+
+def set_email_needed(request, slug):
+    request.session["email_needed"] = True
+
+    return redirect("register_event_by_slug", slug)
+
+
+def is_email_needed(wizard):
+    if hasattr(wizard.request.session, "email_needed"):
+        wizard.request.session.pop("email_needed")
+        return True
+
+
+TEMPLATES = {
+    "email": "paweljong/event/register_wizard.html",
+    "register": "paweljong/event/register_wizard.html",
+    "contact_details": "paweljong/event/register_wizard.html",
+    "guardians": "paweljong/event/register_wizard.html",
+    "additional": "paweljong/event/register_wizard.html",
+    "financial": "paweljong/event/register_wizard.html",
+    "consent": "paweljong/event/register_wizard_consent.html",
+}
+
+
+class RegisterEventWizardView(SessionWizardView):
+    template_name = "paweljong/event/register_wizard.html"
+    file_storage = settings.DEFAULT_FILE_STORAGE
+
+    def get_template_names(self):
+        return [TEMPLATES[self.steps.current]]
+
+    def get_context_data(self, form, **kwargs):
+        context = super().get_context_data(form, **kwargs)
+        context["event"] = Event.objects.get(linked_group__short_name=self.kwargs["slug"])
+
+        if self.steps.current == "email":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Create e-mail address")
+            context["info_text"] = _(
+                "All participants need a personal e-mail address, which they check and read "
+                "temselves. We offer the possibility to register an e-mail address "
+                "on our secure servers, made for young users. For information about receiving "
+                "mails, see: "
+                "<a href='https://leopard.institute/pages/services.html'>https://leopard.institute/pages/services.html</a>."  # noqa
+            )
+        elif self.steps.current == "register":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Event registration")
+            context["info_text"] = _(
+                "First, please enter some basic information about yourself, and check "
+                "whether all information is correct."
+            )
+        elif self.steps.current == "contact_details":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Contact information")
+            context["info_text"] = _(
+                "Tell us how we can contact you. You will receive information about "
+                "the event by e-mail. Please use your personal e-mail address "
+                "where you will read mails yourself, not an address of your parents. "
+                "We will always send all important information to your parents as well, "
+                "and you will enter their e-mail address on the next page."
+            )
+        elif self.steps.current == "guardians":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Legal guardians / parents")
+            context["info_text"] = _(
+                "Tell us how we can reach your parents or other legal guardians. "
+                "This should be the person who was present when you registered for the "
+                "event (which is now). If you want to add another parent, please tell us "
+                "later as a comment."
+            )
+        elif self.steps.current == "additional":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Additional registration information")
+            context["info_text"] = _(
+                "Please answer the following questions as precisely as you can, so "
+                "we can make sure your event attendance will be organised as wel las possible."
+            )
+        elif self.steps.current == "financial":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Payment")
+            context["info_text"] = _(
+                "By default, we will send you an invoice, which you or your parents "
+                "can pay by bank transfer. You can also choose to pay by direct debit – "
+                "please make sure to enter exactly what your parents tell you."
+            )
+        elif self.steps.current == "consent":
+            context["page_title"] = ""
+            context["browser_title"] = ""
+            context["info_title"] = _("Consent")
+            context["info_text"] = _(
+                "Lastly, please read the terms and conditions carefully, together "
+                "with your parents. After that, you will need to confirm that you "
+                "agree with everything yourself, and that your parents also agree."
+            )
+
+        return context
+
+    def get_form_kwargs(self, step):
+        kwargs = super().get_form_kwargs()
+        if step == "email":
+            kwargs["request"] = self.request
+        if step == "additional":
+            event = Event.objects.get(linked_group__short_name=self.kwargs["slug"])
+            kwargs["event"] = event
+        if step == "consent":
+            event = Event.objects.get(linked_group__short_name=self.kwargs["slug"])
+            kwargs["event"] = event
+        return kwargs
+
+    def get_form_initial(self, step):
+
+        initial = self.initial_dict.get(step, {})
+
+        if step == "register":
+            cleaned_data_email = self.get_cleaned_data_for_step("email")
+            if cleaned_data_email:
+                domain = cleaned_data_email["domain"]
+                email = f"{cleaned_data_email['local_part']}@{domain.domain}"
+                initial.update(
+                    {
+                        "email": email,
+                        "email2": email,
+                    }
                 )
-                act.save()
 
-            messages.success(request, _("The feedback aspect has been saved."))
+        if step == "guardians":
+            if hasattr(self.request.user, "person"):
+                person = self.request.user.person
+                if person.guardians.first():
+                    initial.update(
+                        {
+                            "guardian_first_name": person.guardians.first().first_name,
+                            "guardian_last_name": person.guardians.first().last_name,
+                            "guardian_mobile_number": person.guardians.first().mobile_number,
+                            "guardian_email": person.guardians.first().email,
+                        }
+                    )
+
+        if step == "contact_details":
+            if hasattr(self.request.user, "person"):
+                person = self.request.user.person
+                initial.update(
+                    {
+                        "first_name": person.first_name,
+                        "last_name": person.last_name,
+                        "mobile_number": person.mobile_number,
+                        "email": person.email,
+                        "street": person.street,
+                        "place": person.place,
+                        "housenumber": person.housenumber,
+                        "sex": person.sex,
+                        "date_of_birth": person.date_of_birth,
+                        "postal_code": person.postal_code,
+                    }
+                )
+
+            else:
+                cleaned_data_register = self.get_cleaned_data_for_step("register")
+                if cleaned_data_register:
+                    initial.update(
+                        {
+                            "first_name": cleaned_data_register["first_name"],
+                            "last_name": cleaned_data_register["last_name"],
+                            "email": cleaned_data_register["email"],
+                            "date_of_birth": cleaned_data_register["date_of_birth"],
+                        }
+                    )
+
+        return self.initial_dict.get(step, initial)
+
+    def done(self, form_list, **kwargs):
+
+        event = Event.objects.get(linked_group__short_name=self.kwargs["slug"])
+        cleaned_data_email = self.get_cleaned_data_for_step("email")
+        cleaned_data_contact_details = self.get_cleaned_data_for_step("contact_details")
+        cleaned_data_guardians = self.get_cleaned_data_for_step("guardians")
+        cleaned_data_register = self.get_cleaned_data_for_step("register")
+        cleaned_data_additional = self.get_cleaned_data_for_step("additional")
+        cleaned_data_financial = self.get_cleaned_data_for_step("financial")
+        cleaned_data_consent = self.get_cleaned_data_for_step("consent")
+
+        if cleaned_data_financial["voucher_code"]:
+            vouchers = Voucher.objects.filter(
+                person=person, event=event, used=False, code=cleaned_data_financial["voucher_code"]
+            )
+            if vouchers:
+                voucher = vouchers.first()
+            else:
+                messages.error(self.request, _("You entered an invalid voucher code!"))
+
+        # Create email address
+        if cleaned_data_email:
+            _email = MailAddress.objects.create(
+                local_part=cleaned_data_email["local_part"],
+                domain=cleaned_data_email["domain"],
+            )
+
+        # Create user
+        if cleaned_data_register:
+            user = User.objects.create(
+                username=cleaned_data_register["username"],
+                email=cleaned_data_register["email"],
+            )
+            user.set_password(cleaned_data_register["password1"])
+            user.save()
+        else:
+            user = self.request.user
+
+        person, created = Person.objects.get_or_create(
+            user=user,
+            defaults={
+                "email": cleaned_data_contact_details["email"],
+                "first_name": cleaned_data_contact_details["first_name"],
+                "last_name": cleaned_data_contact_details["last_name"],
+            },
+        )
+
+        if (
+            "mobile_number" in cleaned_data_contact_details
+            or "sex" in cleaned_data_contact_details
+            or "date_of_birth" in cleaned_data_contact_details
+        ):
+            person.mobile_number = cleaned_data_contact_details["mobile_number"]
+            person.sex = cleaned_data_contact_details["sex"]
+            person.date_of_birth = cleaned_data_contact_details["date_of_birth"]
+
+            person.save()
+
+        # Store postal address in database
+        if (
+            "postal_code" in cleaned_data_contact_details
+            or "place" in cleaned_data_contact_details
+            or "street" in cleaned_data_contact_details
+        ):
+
+            person.street = cleaned_data_contact_details["street"]
+            person.postal_code = cleaned_data_contact_details["postal_code"]
+            person.place = cleaned_data_contact_details["place"]
+            person.housenumber = cleaned_data_contact_details["housenumber"]
+            person.save()
+
+        if (
+            "guardian_first_name" in cleaned_data_guardians
+            or "guardian_last_name" in cleaned_data_guardians
+            or "guardian_mobile_number" in cleaned_data_guardians
+            or "guardian_email" in cleaned_data_guardians
+        ):
+            guardian, created = Person.objects.get_or_create(
+                defaults={
+                    "mobile_number": cleaned_data_guardians["guardian_mobile_number"],
+                },
+                first_name=cleaned_data_guardians["guardian_first_name"],
+                last_name=cleaned_data_guardians["guardian_last_name"],
+                email=cleaned_data_guardians["guardian_email"],
+            )
+
+            person.guardians.add(guardian)
+            person.save()
+
+        if cleaned_data_email:
+            _email.person = person
+            _email.save()
+
+        # Add the current person to the event
+        event.linked_group.members.add(person)
+
+        registration = EventRegistration.objects.create(
+            event=event,
+            person=person,
+            medical_information=cleaned_data_additional["medical_information"],
+            donation=cleaned_data_financial["donation"],
+            accept_sepa=cleaned_data_financial["accept_sepa"],
+            iban=cleaned_data_financial["iban"],
+            school=cleaned_data_contact_details["school"],
+            school_class=cleaned_data_contact_details["school_class"],
+            school_place=cleaned_data_contact_details["school_place"],
+        )
+        for field in event.linked_group.additional_fields.all():
+            registration.extended_data[
+                slugify(field.title).replace("-", "_")
+            ] = cleaned_data_additional[field.title]
+
+        for field in cleaned_data_consent:
+            pk = int(field.split("_")[1])
+            term = Terms.objects.get(id=pk)
+            registration.accepted_terms.add(term)
+
+        registration.save()
+
+        if cleaned_data_financial["voucher_code"]:
+            vouchers = Voucher.objects.filter(
+                person=person, event=event, used=False, code=cleaned_data_financial["voucher_code"]
+            )
+            if vouchers:
+                voucher = vouchers.first()
+                registration.voucher = voucher
+                voucher.used = True
+                with reversion.create_revision():
+                    voucher.save()
+                    registration.save()
+            else:
+                messages.error(self.request, _("You entered an invalid voucher code!"))
+
+        context = {}
+        context["registration"] = registration
+
+        send_templated_mail(
+            template_name="event_registered",
+            from_email=get_site_preferences()["mail__address"],
+            recipient_list=["orga@teckids.org"],
+            headers={
+                "reply_to": [
+                    person.email,
+                    person.guardians.first().email,
+                ],
+            },
+            context=context,
+        )
+
+        messages.success(
+            self.request,
+            _(
+                "You have successfully registered for the event. Please give us "
+                "up to two days to process your registration. You will then "
+                "receive an email from us."
+            ),
+        )
+
+        act = Activity(
+            title=_("You registered for an event"),
+            description=_("You registered for the event %s" % event.display_name),
+            app="Paweljong",
+            user=person,
+        )
+
+        return redirect("index")
+
+
+class EventFullView(DetailView):
+
+    model = Event
+    slug_field = "linked_group__short_name"
+    template_name = "paweljong/event/full.html"
+    object_context_name = "event"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        context["can_register"] = context["event"].can_register(request=self.request)
+        context["is_authenticated"] = self.request.user.is_authenticated
+        return context
+
+
+class RegisterEventStart(DetailView):
+
+    model = Event
+    slug_field = "linked_group__short_name"
+    template_name = "paweljong/event/register_start.html"
+    object_context_name = "event"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        context["can_register"] = context["event"].can_register(request=self.request)
+        return context
+
+
+class TermListView(PermissionRequiredMixin, SingleTableView):
+    """Table of all terms."""
+
+    model = Terms
+    table_class = TermsTable
+    permission_required = "paweljong.view_terms"
+    template_name = "paweljong/term/list.html"
+
+
+@method_decorator(never_cache, name="dispatch")
+class TermCreateView(PermissionRequiredMixin, AdvancedCreateView):
+    """Create view for terms."""
+
+    model = Terms
+    form_class = EditTermForm
+    permission_required = "paweljong.add_terms"
+    template_name = "paweljong/term/create.html"
+    success_url = reverse_lazy("terms")
+    success_message = _("The term has been created.")
 
-            return redirect("feedback_aspects")
 
-    context["edit_feedback_aspect_form"] = edit_feedback_aspect_form
+@method_decorator(never_cache, name="dispatch")
+class TermEditView(PermissionRequiredMixin, AdvancedEditView):
+    """Edit view for terms."""
 
-    return render(request, "paweljong/feedback_aspect/edit.html", context)
+    model = Terms
+    form_class = EditTermForm
+    permission_required = "paweljong.edit_terms"
+    template_name = "paweljong/term/edit.html"
+    success_url = reverse_lazy("terms")
+    success_message = _("The term has been saved.")
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index 7e3cd94bd389a10750c3d86368adcced4c6d6a09..0000000000000000000000000000000000000000
--- a/poetry.lock
+++ /dev/null
@@ -1,5209 +0,0 @@
-[[package]]
-name = "alabaster"
-version = "0.7.12"
-description = "A configurable sidebar-enabled Sphinx theme"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "aleksis-builddeps"
-version = "5+20211130151050.f0145936"
-description = "AlekSIS (School Information System) — Build/Dev dependencies for apps"
-category = "dev"
-optional = false
-python-versions = ">=3.9,<4.0"
-
-[package.dependencies]
-black = ">=21.10b0,<22.0"
-curlylint = ">=0.13.0,<0.14.0"
-django-stubs = ">=1.1,<2.0"
-flake8 = ">=4.0.0,<5.0.0"
-flake8-bandit = ">=2.1.2,<3.0.0"
-flake8-black = ">=0.2.0,<0.3.0"
-flake8-builtins = ">=1.4.1,<2.0.0"
-flake8-django = ">=1.0.0,<2.0.0"
-flake8-docstrings = ">=1.5.0,<2.0.0"
-flake8-fixme = ">=1.1.1,<2.0.0"
-flake8-isort = ">=4.0.0,<5.0.0"
-flake8-mypy = ">=17.8.0,<18.0.0"
-flake8-rst-docstrings = ">=0.2.0,<0.3.0"
-freezegun = ">=1.1.0,<2.0.0"
-isort = ">=5.0.0,<6.0.0"
-pytest = ">=6.0,<7.0"
-pytest-cov = ">=3.0.0,<4.0.0"
-pytest-django = ">=4.1,<5.0"
-pytest-django-testing-postgresql = ">=0.1,<0.2"
-pytest-sugar = ">=0.9.2,<0.10.0"
-safety = ">=1.8.5,<2.0.0"
-selenium = ">=4.0.0,<5.0.0"
-sphinx = ">=3.0,<4.0"
-sphinx-autodoc-typehints = ">=1.7,<2.0"
-sphinx_materialdesign_theme = ">=0.1.11,<0.2.0"
-sphinxcontrib-django = ">=0.5.0,<0.6.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "aleksis-core"
-version = "2.2+20211129202100.032a3cac"
-description = "AlekSIS (School Information System) — Core"
-category = "main"
-optional = false
-python-versions = ">=3.9,<4.0"
-
-[package.dependencies]
-bs4 = ">=0.0.1,<0.0.2"
-calendarweek = ">=0.5.0,<0.6.0"
-Celery = {version = ">=5.0.0,<6.0.0", extras = ["django", "redis"]}
-celery-haystack-ng = ">=0.20,<0.21"
-celery-progress = ">=0.1.0,<0.2.0"
-colour = ">=0.1.5,<0.2.0"
-Django = ">=3.2.5,<4.0.0"
-django-allauth = ">=0.46.0,<0.47.0"
-django-any-js = ">=1.1,<2.0"
-django-bleach = ">=0.9.0,<0.10.0"
-django-cachalot = ">=2.3.2,<3.0.0"
-django-cache-memoize = ">=0.1.6,<0.2.0"
-django-celery-beat = ">=2.2.0,<3.0.0"
-django-celery-email = ">=3.0.0,<4.0.0"
-django-celery-results = ">=2.0.1,<3.0.0"
-django-ckeditor = ">=6.0.0,<7.0.0"
-django-cleanup = ">=5.1.0,<6.0.0"
-django-colorfield = ">=0.4.0,<0.5.0"
-django-dbbackup = ">=3.3.0,<4.0.0"
-django-debug-toolbar = ">=3.2,<4.0"
-django-dynamic-preferences = ">=1.11,<2.0"
-django-extensions = ">=3.1.1,<4.0.0"
-django-favicon-plus-reloaded = ">=1.1.2,<2.0.0"
-django-filter = ">=2.2.0,<3.0.0"
-django-guardian = ">=2.2.0,<3.0.0"
-django-haystack = ">=3.1,<4.0"
-django-health-check = ">=3.12.1,<4.0.0"
-django-impersonate = ">=1.4,<2.0"
-django-ipware = ">=4.0,<5.0"
-django-js-reverse = ">=0.9.1,<0.10.0"
-django-jsonstore = ">=0.5.0,<0.6.0"
-django-maintenance-mode = ">=0.16.0,<0.17.0"
-django-material = ">=1.6.0,<2.0.0"
-django-menu-generator-ng = ">=1.2.3,<2.0.0"
-django-model-utils = ">=4.0.0,<5.0.0"
-django-oauth-toolkit = ">=1.5.0,<2.0.0"
-django-phonenumber-field = {version = ">=5.2,<6.0", extras = ["phonenumbers"]}
-django-polymorphic = ">=3.0.0,<4.0.0"
-django-prometheus = ">=2.1.0,<3.0.0"
-django-redis = ">=5.0.0,<6.0.0"
-django-reversion = ">=4.0.0,<5.0.0"
-django-sass-processor = "1.0"
-django_select2 = ">=7.1,<8.0"
-django-tables2 = ">=2.1,<3.0"
-django-templated-email = ">=3.0.0,<4.0.0"
-django-titofisto = ">=0.2.0,<0.3.0"
-django-two-factor-auth = {version = ">=1.12.1,<2.0.0", extras = ["call", "phonenumbers", "sms", "yubikey"]}
-django-uwsgi-ng = ">=1.1.0,<2.0.0"
-django_widget_tweaks = ">=1.4.5,<2.0.0"
-django-yarnpkg = ">=6.0,<7.0"
-djangorestframework = ">=3.12.4,<4.0.0"
-dynaconf = {version = ">=3.1,<4.0", extras = ["ini", "toml", "yaml"]}
-haystack-redis = ">=0.0.1,<0.0.2"
-html2text = ">=2020.0.0,<2021.0.0"
-ipython = ">=7.20.0,<8.0.0"
-libsass = ">=0.21.0,<0.22.0"
-license-expression = ">=1.2,<2.0"
-psutil = ">=5.7.0,<6.0.0"
-psycopg2 = ">=2.8,<3.0"
-python-gnupg = ">=0.4.7,<0.5.0"
-rules = ">=2.2,<3.0"
-sentry-sdk = ">=1.4.3,<2.0.0"
-spdx-license-list = ">=0.5.0,<0.6.0"
-Whoosh = ">=2.7.4,<3.0.0"
-
-[package.extras]
-s3 = ["boto3 (>=1.17.33,<2.0.0)", "django-storages (>=1.11.1,<2.0.0)"]
-ldap = ["django-auth-ldap (>=3.0,<4.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "amqp"
-version = "5.0.6"
-description = "Low-level AMQP client for Python (fork of amqplib)."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-vine = "5.0.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "appnope"
-version = "0.1.2"
-description = "Disable App Nap on macOS >= 10.9"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "asgiref"
-version = "3.4.1"
-description = "ASGI specs, helper code, and adapters"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "asn1crypto"
-version = "1.4.0"
-description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "async-generator"
-version = "1.10"
-description = "Async generators and context managers for Python 3.5+"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "atomicwrites"
-version = "1.4.0"
-description = "Atomic file writes."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "attrs"
-version = "21.2.0"
-description = "Classes Without Boilerplate"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.extras]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
-docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
-tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
-tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "babel"
-version = "2.9.1"
-description = "Internationalization utilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-pytz = ">=2015.7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "backcall"
-version = "0.2.0"
-description = "Specifications for callback functions passed in to an API"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "bandit"
-version = "1.7.1"
-description = "Security oriented static analyser for python code."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
-GitPython = ">=1.0.1"
-PyYAML = ">=5.3.1"
-stevedore = ">=1.20.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.10.0"
-description = "Screen-scraping library"
-category = "main"
-optional = false
-python-versions = ">3.0.0"
-
-[package.dependencies]
-soupsieve = ">1.2"
-
-[package.extras]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "billiard"
-version = "3.6.4.0"
-description = "Python multiprocessing fork with improvements and bugfixes"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "black"
-version = "21.11b1"
-description = "The uncompromising code formatter."
-category = "dev"
-optional = false
-python-versions = ">=3.6.2"
-
-[package.dependencies]
-click = ">=7.1.2"
-mypy-extensions = ">=0.4.3"
-pathspec = ">=0.9.0,<1"
-platformdirs = ">=2"
-regex = ">=2021.4.4"
-tomli = ">=0.2.6,<2.0.0"
-typing-extensions = [
-    {version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
-    {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
-]
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-python2 = ["typed-ast (>=1.4.3)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "bleach"
-version = "4.1.0"
-description = "An easy safelist-based HTML-sanitizing tool."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-packaging = "*"
-six = ">=1.9.0"
-webencodings = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "boolean.py"
-version = "3.8"
-description = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "bs4"
-version = "0.0.1"
-description = "Screen-scraping library"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-beautifulsoup4 = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "calendarweek"
-version = "0.5.0"
-description = "Utilities for working with calendar weeks in Python and Django"
-category = "main"
-optional = false
-python-versions = ">=3.7,<4.0"
-
-[package.extras]
-django = ["Django (>=2.2,<4.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "celery"
-version = "5.2.1"
-description = "Distributed Task Queue."
-category = "main"
-optional = false
-python-versions = ">=3.7,"
-
-[package.dependencies]
-billiard = ">=3.6.4.0,<4.0"
-click = ">=8.0,<9.0"
-click-didyoumean = ">=0.0.3"
-click-plugins = ">=1.1.1"
-click-repl = ">=0.2.0"
-Django = {version = ">=1.11", optional = true, markers = "extra == \"django\""}
-kombu = ">=5.2.2,<6.0"
-pytz = ">0.dev.0"
-redis = {version = ">=3.4.1,<4.0.0", optional = true, markers = "extra == \"redis\""}
-vine = ">=5.0.0,<6.0"
-
-[package.extras]
-arangodb = ["pyArango (>=1.3.2)"]
-auth = ["cryptography"]
-azureblockblob = ["azure-storage-blob (==12.9.0)"]
-brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"]
-cassandra = ["cassandra-driver (<3.21.0)"]
-consul = ["python-consul2"]
-cosmosdbsql = ["pydocumentdb (==2.3.2)"]
-couchbase = ["couchbase (>=3.0.0)"]
-couchdb = ["pycouchdb"]
-django = ["Django (>=1.11)"]
-dynamodb = ["boto3 (>=1.9.178)"]
-elasticsearch = ["elasticsearch"]
-eventlet = ["eventlet (>=0.32.0)"]
-gevent = ["gevent (>=1.5.0)"]
-librabbitmq = ["librabbitmq (>=1.5.0)"]
-memcache = ["pylibmc"]
-mongodb = ["pymongo[srv] (>=3.3.0,<3.12.1)"]
-msgpack = ["msgpack"]
-pymemcache = ["python-memcached"]
-pyro = ["pyro4"]
-pytest = ["pytest-celery"]
-redis = ["redis (>=3.4.1,<4.0.0)"]
-s3 = ["boto3 (>=1.9.125)"]
-slmq = ["softlayer-messaging (>=1.0.3)"]
-solar = ["ephem"]
-sqlalchemy = ["sqlalchemy"]
-sqs = ["kombu"]
-tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"]
-yaml = ["PyYAML (>=3.10)"]
-zookeeper = ["kazoo (>=1.3.1)"]
-zstd = ["zstandard"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "celery-haystack-ng"
-version = "0.20.post2"
-description = "An app for integrating Celery with Haystack"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-celery = ">=4.0"
-django-appconf = ">=0.4.1"
-django-haystack = ">=2.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "celery-progress"
-version = "0.1.1"
-description = "Drop in, configurable, dependency-free progress bars for your Django/Celery applications."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-rabbitmq = ["channels-rabbitmq"]
-redis = ["channels-redis"]
-websockets = ["channels"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "certifi"
-version = "2021.10.8"
-description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "cffi"
-version = "1.15.0"
-description = "Foreign Function Interface for Python calling C code."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-pycparser = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "charset-normalizer"
-version = "2.0.8"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
-optional = false
-python-versions = ">=3.5.0"
-
-[package.extras]
-unicode_backport = ["unicodedata2"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "click"
-version = "8.0.3"
-description = "Composable command line interface toolkit"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "click-didyoumean"
-version = "0.3.0"
-description = "Enables git-like *did-you-mean* feature in click"
-category = "main"
-optional = false
-python-versions = ">=3.6.2,<4.0.0"
-
-[package.dependencies]
-click = ">=7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "click-plugins"
-version = "1.1.1"
-description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-click = ">=4.0"
-
-[package.extras]
-dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "click-repl"
-version = "0.2.0"
-description = "REPL plugin for Click"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-click = "*"
-prompt-toolkit = "*"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "colorama"
-version = "0.4.4"
-description = "Cross-platform colored terminal text."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "colour"
-version = "0.1.5"
-description = "converts and manipulates various color representation (HSL, RVB, web, X11, ...)"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-test = ["nose"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "configobj"
-version = "5.0.6"
-description = "Config file reading, writing and validation."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "coverage"
-version = "6.2"
-description = "Code coverage measurement for Python"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
-
-[package.extras]
-toml = ["tomli"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "cryptography"
-version = "36.0.0"
-description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-cffi = ">=1.12"
-
-[package.extras]
-docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
-docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
-pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
-sdist = ["setuptools_rust (>=0.11.4)"]
-ssh = ["bcrypt (>=3.1.5)"]
-test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "curlylint"
-version = "0.13.0"
-description = "{{ 🎀}} Experimental HTML templates linting for Jinja, Nunjucks, Django templates, Twig, Liquid"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-attrs = ">=17.2.0"
-click = ">=6.5"
-parsy = "1.1.0"
-pathspec = ">=0.6,<1"
-toml = ">=0.9.4"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "decorator"
-version = "5.1.0"
-description = "Decorators for Humans"
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "defusedxml"
-version = "0.7.1"
-description = "XML bomb protection for Python stdlib modules"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "deprecated"
-version = "1.2.13"
-description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-wrapt = ">=1.10,<2"
-
-[package.extras]
-dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "dj-database-url"
-version = "0.5.0"
-description = "Use Database URLs in your Django Application."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django"
-version = "3.2.9"
-description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-asgiref = ">=3.3.2,<4"
-pytz = "*"
-sqlparse = ">=0.2.2"
-
-[package.extras]
-argon2 = ["argon2-cffi (>=19.1.0)"]
-bcrypt = ["bcrypt"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-allauth"
-version = "0.46.0"
-description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.0"
-pyjwt = {version = ">=1.7", extras = ["crypto"]}
-python3-openid = ">=3.0.8"
-requests = "*"
-requests-oauthlib = ">=0.3.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-any-js"
-version = "1.1"
-description = "Include JavaScript/CSS libraries with readable template tags"
-category = "main"
-optional = false
-python-versions = ">=3.7,<4.0"
-
-[package.dependencies]
-Django = ">=2.2,<4.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-appconf"
-version = "1.0.5"
-description = "A helper class for handling configuration defaults of packaged apps gracefully."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-django = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-bleach"
-version = "0.9.0"
-description = "Easily use bleach with Django models and templates"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-bleach = ">=1.5.0"
-Django = ">=1.11"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-cachalot"
-version = "2.4.4"
-description = "Caches your Django ORM queries and automatically invalidates them."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.2,<3.3"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-cache-memoize"
-version = "0.1.10"
-description = "Django utility for a memoization decorator that uses the Django cache framework."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-dev = ["flake8", "tox", "twine", "therapist", "black"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-celery-beat"
-version = "2.2.1"
-description = "Database-backed Periodic Tasks."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-celery = ">=5.0,<6.0"
-Django = ">=2.2,<4.0"
-django-timezone-field = ">=4.1.0,<5.0"
-python-crontab = ">=2.3.4"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-celery-email"
-version = "3.0.0"
-description = "An async Django email backend using celery"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-celery = ">=4.0"
-django = ">=2.2"
-django-appconf = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-celery-results"
-version = "2.2.0"
-description = "Celery result backends for Django."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-celery = ">=5.0,<6.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-ckeditor"
-version = "6.2.0"
-description = "Django admin CKEditor integration."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django-js-asset = ">=1.2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-cleanup"
-version = "5.2.0"
-description = "Deletes old files."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-colorfield"
-version = "0.4.5"
-description = "simple color field for your models with a nice color-picker in the admin-interface."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-dbbackup"
-version = "3.3.0"
-description = "Management commands to help backup and restore a project database and media"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=1.5"
-pytz = "*"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-debug-toolbar"
-version = "3.2.2"
-description = "A configurable set of panels that display various debug information about the current request/response."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Django = ">=2.2"
-sqlparse = ">=0.2.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-dynamic-preferences"
-version = "1.11.0"
-description = "Dynamic global and instance settings for your django project"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = ">=1.11"
-persisting-theory = ">=0.2.1"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-extensions"
-version = "3.1.5"
-description = "Extensions for Django"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-favicon-plus-reloaded"
-version = "1.1.3"
-description = "simple Django app which allows you to upload a image and it renders a wide variety for html link tags to display the favicon"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = "*"
-pillow = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-filter"
-version = "2.4.0"
-description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-Django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-formtools"
-version = "2.3"
-description = "A set of high-level abstractions for Django forms"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-guardian"
-version = "2.4.0"
-description = "Implementation of per object permissions for Django."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-Django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-haystack"
-version = "3.1.1"
-description = "Pluggable search for Django."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.2"
-
-[package.extras]
-elasticsearch = ["elasticsearch (>=5,<6)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-health-check"
-version = "3.16.4"
-description = "Run checks on services like databases, queue servers, celery processes, etc."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-iban-field"
-version = "0.8"
-description = "IBAN field for django with validation and optional postgresql in database constraint checking"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-impersonate"
-version = "1.7.3"
-description = "Django app to allow superusers to impersonate other users."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-ipware"
-version = "4.0.0"
-description = "A Django application to retrieve user's IP address"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-js-asset"
-version = "1.2.2"
-description = "script tag with additional attributes for django.forms.Media"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-js-reverse"
-version = "0.9.1"
-description = "Javascript url handling for Django that doesn't hurt."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=1.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-jsonstore"
-version = "0.5.0"
-description = "Expose JSONField data as a virtual django model fields."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=1.11"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-maintenance-mode"
-version = "0.16.1"
-description = "django-maintenance-mode shows a 503 error page when maintenance-mode is on."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-material"
-version = "1.10.0"
-description = "Material design for django forms and admin"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-menu-generator-ng"
-version = "1.2.3"
-description = "A straightforward menu generator for Django"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-model-utils"
-version = "4.2.0"
-description = "Django model mixins and utilities"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.0.1"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-oauth-toolkit"
-version = "1.5.0"
-description = "OAuth2 Provider for Django"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = ">=2.2"
-jwcrypto = ">=0.8.0"
-oauthlib = ">=3.1.0"
-requests = ">=2.13.0"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-otp"
-version = "1.1.2"
-description = "A pluggable framework for adding two-factor authentication to Django using one-time passwords."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = ">=2.2"
-
-[package.extras]
-qrcode = ["qrcode"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-otp-yubikey"
-version = "1.0.1"
-description = "A django-otp plugin that verifies YubiKey OTP tokens."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django-otp = ">=1.0.0"
-YubiOTP = ">=0.2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-phonenumber-field"
-version = "5.2.0"
-description = "An international phone number field for django models."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Django = ">=2.2"
-phonenumbers = {version = ">=7.0.2", optional = true, markers = "extra == \"phonenumbers\""}
-
-[package.extras]
-phonenumbers = ["phonenumbers (>=7.0.2)"]
-phonenumberslite = ["phonenumberslite (>=7.0.2)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-polymorphic"
-version = "3.1.0"
-description = "Seamless polymorphic inheritance for Django models"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.1"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-prometheus"
-version = "2.1.0"
-description = "Django middlewares to monitor your application with Prometheus.io."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-prometheus-client = ">=0.7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-redis"
-version = "5.0.0"
-description = "Full featured redis cache backend for Django."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Django = ">=2.2"
-redis = ">=3.0.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-render-block"
-version = "0.8.1"
-description = "Render a particular block from a template to a string."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-reversion"
-version = "4.0.1"
-description = "An extension to the Django web framework that provides version control for model instances."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-django = ">=2.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-sass-processor"
-version = "1.0.0"
-description = "SASS processor to compile SCSS files into *.css, while rendering, or offline."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-management_command = ["django-compressor (>=2.4)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-select2"
-version = "7.9.0"
-description = "Select2 option fields for Django"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = ">=2.2"
-django-appconf = ">=0.6.0"
-
-[package.extras]
-test = ["pytest", "pytest-cov", "pytest-django", "selenium"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-stubs"
-version = "1.9.0"
-description = "Mypy stubs for Django"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-django = "*"
-django-stubs-ext = ">=0.3.0"
-mypy = ">=0.910"
-toml = "*"
-types-pytz = "*"
-types-PyYAML = "*"
-typing-extensions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-stubs-ext"
-version = "0.3.1"
-description = "Monkey-patching and extensions for django-stubs"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-django = "*"
-typing-extensions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-tables2"
-version = "2.4.1"
-description = "Table/data-grid framework for Django"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=1.11"
-
-[package.extras]
-tablib = ["tablib"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-templated-email"
-version = "3.0.0"
-description = "A Django oriented templated / transaction email abstraction"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django-render-block = ">=0.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-timezone-field"
-version = "4.2.1"
-description = "A Django app providing database and form fields for pytz timezone objects."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-django = ">=2.2"
-pytz = "*"
-
-[package.extras]
-rest_framework = ["djangorestframework (>=3.0.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-titofisto"
-version = "0.2.0"
-description = "Django Time-Token File Storage"
-category = "main"
-optional = false
-python-versions = ">=3.9,<4.0"
-
-[package.dependencies]
-Django = ">2.2,<4.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-two-factor-auth"
-version = "1.13.1"
-description = "Complete Two-Factor Authentication for Django"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-Django = ">=2.2"
-django-formtools = "*"
-django-otp = ">=0.8.0"
-django-otp-yubikey = {version = "*", optional = true, markers = "extra == \"yubikey\""}
-django-phonenumber-field = ">=1.1.0,<6"
-phonenumbers = {version = ">=7.0.9,<8.99", optional = true, markers = "extra == \"phonenumbers\""}
-qrcode = ">=4.0.0,<6.99"
-twilio = {version = ">=6.0", optional = true, markers = "extra == \"call\""}
-
-[package.extras]
-call = ["twilio (>=6.0)"]
-phonenumbers = ["phonenumbers (>=7.0.9,<8.99)"]
-phonenumberslite = ["phonenumberslite (>=7.0.9,<8.99)"]
-sms = ["twilio (>=6.0)"]
-yubikey = ["django-otp-yubikey"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-uwsgi-ng"
-version = "1.1.2"
-description = "uWSGI stuff for Django projects"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-uwsgi = ["uwsgi"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-widget-tweaks"
-version = "1.4.9"
-description = "Tweak the form field rendering in templates, not in python-level form definitions."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "django-yarnpkg"
-version = "6.0.1"
-description = "Integrate django with yarnpkg"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django = "*"
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "djangorestframework"
-version = "3.12.4"
-description = "Web APIs for Django, made easy."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-django = ">=2.2"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "docutils"
-version = "0.16"
-description = "Docutils -- Python Documentation Utilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "dparse"
-version = "0.5.1"
-description = "A parser for Python dependency files"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-packaging = "*"
-pyyaml = "*"
-toml = "*"
-
-[package.extras]
-pipenv = ["pipenv"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "dynaconf"
-version = "3.1.7"
-description = "The dynamic configurator for your Python Project"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[package.dependencies]
-configobj = {version = "*", optional = true, markers = "extra == \"ini\""}
-"ruamel.yaml" = {version = "*", optional = true, markers = "extra == \"yaml\""}
-toml = {version = "*", optional = true, markers = "extra == \"toml\""}
-
-[package.extras]
-all = ["redis", "ruamel.yaml", "configobj", "hvac"]
-configobj = ["configobj"]
-ini = ["configobj"]
-redis = ["redis"]
-toml = ["toml"]
-vault = ["hvac"]
-yaml = ["ruamel.yaml"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8"
-version = "4.0.1"
-description = "the modular source code checker: pep8 pyflakes and co"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-mccabe = ">=0.6.0,<0.7.0"
-pycodestyle = ">=2.8.0,<2.9.0"
-pyflakes = ">=2.4.0,<2.5.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-bandit"
-version = "2.1.2"
-description = "Automated security testing with bandit and flake8."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-bandit = "*"
-flake8 = "*"
-flake8-polyfill = "*"
-pycodestyle = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-black"
-version = "0.2.3"
-description = "flake8 plugin to call black as a code style validator"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-black = "*"
-flake8 = ">=3.0.0"
-toml = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-builtins"
-version = "1.5.3"
-description = "Check for python builtins being used as variables or parameters."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = "*"
-
-[package.extras]
-test = ["coverage", "coveralls", "mock", "pytest", "pytest-cov"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-django"
-version = "1.1.1"
-description = "Plugin to catch bad style specific to Django Projects"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-docstrings"
-version = "1.6.0"
-description = "Extension for flake8 which uses pydocstyle to check docstrings"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = ">=3"
-pydocstyle = ">=2.1"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-fixme"
-version = "1.1.1"
-description = "Check for FIXME, TODO and other temporary developer notes. Plugin for flake8."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-isort"
-version = "4.1.1"
-description = "flake8 plugin that integrates isort ."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = ">=3.2.1,<5"
-isort = ">=4.3.5,<6"
-testfixtures = ">=6.8.0,<7"
-
-[package.extras]
-test = ["pytest-cov"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-mypy"
-version = "17.8.0"
-description = "A plugin for flake8 integrating mypy."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-attrs = "*"
-flake8 = ">=3.0.0"
-mypy = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-polyfill"
-version = "1.0.2"
-description = "Polyfill package for Flake8 plugins"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "flake8-rst-docstrings"
-version = "0.2.3"
-description = "Python docstring reStructuredText (RST) validator"
-category = "dev"
-optional = false
-python-versions = ">=3.3"
-
-[package.dependencies]
-flake8 = ">=3.0.0"
-pygments = "*"
-restructuredtext-lint = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "freezegun"
-version = "1.1.0"
-description = "Let your Python tests travel through time"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-python-dateutil = ">=2.7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "gitdb"
-version = "4.0.9"
-description = "Git Object Database"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-smmap = ">=3.0.1,<6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "gitpython"
-version = "3.1.24"
-description = "GitPython is a python library used to interact with Git repositories"
-category = "dev"
-optional = false
-python-versions = ">=3.7"
-
-[package.dependencies]
-gitdb = ">=4.0.1,<5"
-typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""}
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "h11"
-version = "0.12.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "haystack-redis"
-version = "0.0.1"
-description = "Use redis as a persistence layer for Whoosh and Haystack"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-django-haystack = "*"
-redis = "*"
-whoosh = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "html2text"
-version = "2020.1.16"
-description = "Turn HTML into equivalent Markdown-structured text."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "idna"
-version = "3.3"
-description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "imagesize"
-version = "1.3.0"
-description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "iniconfig"
-version = "1.1.1"
-description = "iniconfig: brain-dead simple config-ini parsing"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "ipython"
-version = "7.30.0"
-description = "IPython: Productive Interactive Computing"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[package.dependencies]
-appnope = {version = "*", markers = "sys_platform == \"darwin\""}
-backcall = "*"
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-decorator = "*"
-jedi = ">=0.16"
-matplotlib-inline = "*"
-pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
-pickleshare = "*"
-prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0"
-pygments = "*"
-traitlets = ">=4.2"
-
-[package.extras]
-all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"]
-doc = ["Sphinx (>=1.3)"]
-kernel = ["ipykernel"]
-nbconvert = ["nbconvert"]
-nbformat = ["nbformat"]
-notebook = ["notebook", "ipywidgets"]
-parallel = ["ipyparallel"]
-qtconsole = ["qtconsole"]
-test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "isort"
-version = "5.10.1"
-description = "A Python utility / library to sort Python imports."
-category = "dev"
-optional = false
-python-versions = ">=3.6.1,<4.0"
-
-[package.extras]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
-requirements_deprecated_finder = ["pip-api", "pipreqs"]
-pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
-plugins = ["setuptools"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "jedi"
-version = "0.18.1"
-description = "An autocompletion tool for Python that can be used for text editors."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-parso = ">=0.8.0,<0.9.0"
-
-[package.extras]
-qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
-testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "jinja2"
-version = "3.0.3"
-description = "A very fast and expressive template engine."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "jwcrypto"
-version = "1.0"
-description = "Implementation of JOSE Web standards"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-cryptography = ">=2.3"
-deprecated = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "kombu"
-version = "5.2.2"
-description = "Messaging library for Python."
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[package.dependencies]
-amqp = ">=5.0.6,<6.0.0"
-vine = "*"
-
-[package.extras]
-azureservicebus = ["azure-servicebus (>=7.0.0)"]
-azurestoragequeues = ["azure-storage-queue"]
-consul = ["python-consul (>=0.6.0)"]
-librabbitmq = ["librabbitmq (>=2.0.0)"]
-mongodb = ["pymongo (>=3.3.0,<3.12.1)"]
-msgpack = ["msgpack"]
-pyro = ["pyro4"]
-qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"]
-redis = ["redis (>=3.4.1,<4.0.0)"]
-slmq = ["softlayer-messaging (>=1.0.3)"]
-sqlalchemy = ["sqlalchemy"]
-sqs = ["boto3 (>=1.9.12)", "pycurl (>=7.44.1,<7.45.0)", "urllib3 (>=1.26.7)"]
-yaml = ["PyYAML (>=3.10)"]
-zookeeper = ["kazoo (>=1.3.1)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "libsass"
-version = "0.21.0"
-description = "Sass for Python: A straightforward binding of libsass for Python."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-six = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "license-expression"
-version = "1.2"
-description = "license-expression is small utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-"boolean.py" = ">=3.6,<4.0.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "markupsafe"
-version = "2.0.1"
-description = "Safely add untrusted strings to HTML/XML markup."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "matplotlib-inline"
-version = "0.1.3"
-description = "Inline Matplotlib backend for Jupyter"
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-traitlets = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "mccabe"
-version = "0.6.1"
-description = "McCabe checker, plugin for flake8"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "mypy"
-version = "0.910"
-description = "Optional static typing for Python"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-mypy-extensions = ">=0.4.3,<0.5.0"
-toml = "*"
-typing-extensions = ">=3.7.4"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "mypy-extensions"
-version = "0.4.3"
-description = "Experimental type system extensions for programs checked with the mypy typechecker."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "oauthlib"
-version = "3.1.1"
-description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-rsa = ["cryptography (>=3.0.0,<4)"]
-signals = ["blinker (>=1.4.0)"]
-signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "outcome"
-version = "1.1.0"
-description = "Capture the outcome of Python function calls."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-attrs = ">=19.2.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "packaging"
-version = "21.3"
-description = "Core utilities for Python packages"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "parso"
-version = "0.8.2"
-description = "A Python Parser"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
-testing = ["docopt", "pytest (<6.0.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "parsy"
-version = "1.1.0"
-description = "easy-to-use parser combinators, for parsing in pure Python"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pathspec"
-version = "0.9.0"
-description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pbr"
-version = "5.8.0"
-description = "Python Build Reasonableness"
-category = "dev"
-optional = false
-python-versions = ">=2.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "persisting-theory"
-version = "0.2.1"
-description = "Registries that can autodiscover values accross your project apps"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pexpect"
-version = "4.8.0"
-description = "Pexpect allows easy control of interactive console applications."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-ptyprocess = ">=0.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pg8000"
-version = "1.23.0"
-description = "PostgreSQL interface library"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-scramp = ">=1.4.1"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "phonenumbers"
-version = "8.12.38"
-description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pickleshare"
-version = "0.7.5"
-description = "Tiny 'shelve'-like database with concurrency support"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pillow"
-version = "8.4.0"
-description = "Python Imaging Library (Fork)"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "platformdirs"
-version = "2.4.0"
-description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
-test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pluggy"
-version = "1.0.0"
-description = "plugin and hook calling mechanisms for python"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "prometheus-client"
-version = "0.12.0"
-description = "Python client for the Prometheus monitoring system."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.extras]
-twisted = ["twisted"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "prompt-toolkit"
-version = "3.0.23"
-description = "Library for building powerful interactive command lines in Python"
-category = "main"
-optional = false
-python-versions = ">=3.6.2"
-
-[package.dependencies]
-wcwidth = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "psutil"
-version = "5.8.0"
-description = "Cross-platform lib for process and system monitoring in Python."
-category = "main"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.extras]
-test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "psycopg2"
-version = "2.9.2"
-description = "psycopg2 - Python-PostgreSQL Database Adapter"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "ptyprocess"
-version = "0.7.0"
-description = "Run a subprocess in a pseudo terminal"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "py"
-version = "1.11.0"
-description = "library with cross-python path, ini-parsing, io, code, log facilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pycodestyle"
-version = "2.8.0"
-description = "Python style guide checker"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pycparser"
-version = "2.21"
-description = "C parser in Python"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pycryptodome"
-version = "3.11.0"
-description = "Cryptographic library for Python"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pydocstyle"
-version = "6.1.1"
-description = "Python docstring style checker"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-snowballstemmer = "*"
-
-[package.extras]
-toml = ["toml"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pyflakes"
-version = "2.4.0"
-description = "passive checker of Python programs"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pygments"
-version = "2.10.0"
-description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pyjwt"
-version = "2.3.0"
-description = "JSON Web Token implementation in Python"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""}
-
-[package.extras]
-crypto = ["cryptography (>=3.3.1)"]
-dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"]
-docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
-tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pyopenssl"
-version = "21.0.0"
-description = "Python wrapper module around the OpenSSL library"
-category = "dev"
-optional = false
-python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*"
-
-[package.dependencies]
-cryptography = ">=3.3"
-six = ">=1.5.2"
-
-[package.extras]
-docs = ["sphinx", "sphinx-rtd-theme"]
-test = ["flaky", "pretend", "pytest (>=3.0.1)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pyparsing"
-version = "3.0.6"
-description = "Python parsing module"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-diagrams = ["jinja2", "railroad-diagrams"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytest"
-version = "6.2.5"
-description = "pytest: simple powerful testing with Python"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
-attrs = ">=19.2.0"
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=0.12,<2.0"
-py = ">=1.8.2"
-toml = "*"
-
-[package.extras]
-testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytest-cov"
-version = "3.0.0"
-description = "Pytest plugin for measuring coverage."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-coverage = {version = ">=5.2.1", extras = ["toml"]}
-pytest = ">=4.6"
-
-[package.extras]
-testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytest-django"
-version = "4.4.0"
-description = "A Django plugin for pytest."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-pytest = ">=5.4.0"
-
-[package.extras]
-docs = ["sphinx", "sphinx-rtd-theme"]
-testing = ["django", "django-configurations (>=2.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytest-django-testing-postgresql"
-version = "0.1.post0"
-description = "Use a temporary PostgreSQL database with pytest-django"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-dj-database-url = "*"
-"testing.postgresql" = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytest-sugar"
-version = "0.9.4"
-description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-packaging = ">=14.1"
-pytest = ">=2.9"
-termcolor = ">=1.1.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "python-crontab"
-version = "2.6.0"
-description = "Python Crontab API"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-python-dateutil = "*"
-
-[package.extras]
-cron-description = ["cron-descriptor"]
-cron-schedule = ["croniter"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "python-dateutil"
-version = "2.8.2"
-description = "Extensions to the standard Python datetime module"
-category = "main"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-
-[package.dependencies]
-six = ">=1.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "python-gnupg"
-version = "0.4.8"
-description = "A wrapper for the Gnu Privacy Guard (GPG or GnuPG)"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "python3-openid"
-version = "3.2.0"
-description = "OpenID support for modern servers and consumers."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-defusedxml = "*"
-
-[package.extras]
-mysql = ["mysql-connector-python"]
-postgresql = ["psycopg2"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pytz"
-version = "2021.3"
-description = "World timezone definitions, modern and historical"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "pyyaml"
-version = "6.0"
-description = "YAML parser and emitter for Python"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "qrcode"
-version = "6.1"
-description = "QR Code image generator"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-six = "*"
-
-[package.extras]
-dev = ["tox", "pytest", "mock"]
-maintainer = ["zest.releaser"]
-pil = ["pillow"]
-test = ["pytest", "pytest-cov", "mock"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "redis"
-version = "3.5.3"
-description = "Python client for Redis key-value store"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.extras]
-hiredis = ["hiredis (>=0.1.3)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "regex"
-version = "2021.11.10"
-description = "Alternative regular expression module, to replace re."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "requests"
-version = "2.26.0"
-description = "Python HTTP for Humans."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
-idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
-urllib3 = ">=1.21.1,<1.27"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
-use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "requests-oauthlib"
-version = "1.3.0"
-description = "OAuthlib authentication support for Requests."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-oauthlib = ">=3.0.0"
-requests = ">=2.0.0"
-
-[package.extras]
-rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "restructuredtext-lint"
-version = "1.3.2"
-description = "reStructuredText linter"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-docutils = ">=0.11,<1.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "ruamel.yaml"
-version = "0.17.17"
-description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
-category = "main"
-optional = false
-python-versions = ">=3"
-
-[package.dependencies]
-"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""}
-
-[package.extras]
-docs = ["ryd"]
-jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "ruamel.yaml.clib"
-version = "0.2.6"
-description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "rules"
-version = "2.2"
-description = "Awesome Django authorization, without the database"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "safety"
-version = "1.10.3"
-description = "Checks installed dependencies for known vulnerabilities."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-Click = ">=6.0"
-dparse = ">=0.5.1"
-packaging = "*"
-requests = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "scramp"
-version = "1.4.1"
-description = "An implementation of the SCRAM protocol."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-asn1crypto = ">=1.4.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "selenium"
-version = "4.1.0"
-description = ""
-category = "dev"
-optional = false
-python-versions = "~=3.7"
-
-[package.dependencies]
-trio = ">=0.17,<1.0"
-trio-websocket = ">=0.9,<1.0"
-urllib3 = {version = ">=1.26,<2.0", extras = ["secure"]}
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sentry-sdk"
-version = "1.5.0"
-description = "Python client for Sentry (https://sentry.io)"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-certifi = "*"
-urllib3 = ">=1.10.0"
-
-[package.extras]
-aiohttp = ["aiohttp (>=3.5)"]
-beam = ["apache-beam (>=2.12)"]
-bottle = ["bottle (>=0.12.13)"]
-celery = ["celery (>=3)"]
-chalice = ["chalice (>=1.16.0)"]
-django = ["django (>=1.8)"]
-falcon = ["falcon (>=1.4)"]
-flask = ["flask (>=0.11)", "blinker (>=1.1)"]
-httpx = ["httpx (>=0.16.0)"]
-pure_eval = ["pure-eval", "executing", "asttokens"]
-pyspark = ["pyspark (>=2.4.4)"]
-rq = ["rq (>=0.6)"]
-sanic = ["sanic (>=0.8)"]
-sqlalchemy = ["sqlalchemy (>=1.2)"]
-tornado = ["tornado (>=5)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "smmap"
-version = "5.0.0"
-description = "A pure Python implementation of a sliding window memory map manager"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sniffio"
-version = "1.2.0"
-description = "Sniff out which async library your code is running under"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "snowballstemmer"
-version = "2.2.0"
-description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sortedcontainers"
-version = "2.4.0"
-description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "soupsieve"
-version = "2.3.1"
-description = "A modern CSS selector implementation for Beautiful Soup."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "spdx-license-list"
-version = "0.5.2"
-description = "A simple tool/library for working with SPDX license definitions."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinx"
-version = "3.5.4"
-description = "Python documentation generator"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-alabaster = ">=0.7,<0.8"
-babel = ">=1.3"
-colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
-docutils = ">=0.12,<0.17"
-imagesize = "*"
-Jinja2 = ">=2.3"
-packaging = "*"
-Pygments = ">=2.0"
-requests = ">=2.5.0"
-snowballstemmer = ">=1.1"
-sphinxcontrib-applehelp = "*"
-sphinxcontrib-devhelp = "*"
-sphinxcontrib-htmlhelp = "*"
-sphinxcontrib-jsmath = "*"
-sphinxcontrib-qthelp = "*"
-sphinxcontrib-serializinghtml = "*"
-
-[package.extras]
-docs = ["sphinxcontrib-websupport"]
-lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"]
-test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinx-autodoc-typehints"
-version = "1.12.0"
-description = "Type hints (PEP 484) support for the Sphinx autodoc extension"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-Sphinx = ">=3.0"
-
-[package.extras]
-test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"]
-type_comments = ["typed-ast (>=1.4.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinx-materialdesign-theme"
-version = "0.1.11"
-description = "Sphinx Material Design Theme"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-applehelp"
-version = "1.0.2"
-description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-lint = ["flake8", "mypy", "docutils-stubs"]
-test = ["pytest"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-devhelp"
-version = "1.0.2"
-description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-lint = ["flake8", "mypy", "docutils-stubs"]
-test = ["pytest"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-django"
-version = "0.5.1"
-description = "Improve the Sphinx autodoc for Django classes."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-htmlhelp"
-version = "2.0.0"
-description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-lint = ["flake8", "mypy", "docutils-stubs"]
-test = ["pytest", "html5lib"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-jsmath"
-version = "1.0.1"
-description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-test = ["pytest", "flake8", "mypy"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-qthelp"
-version = "1.0.3"
-description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-lint = ["flake8", "mypy", "docutils-stubs"]
-test = ["pytest"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sphinxcontrib-serializinghtml"
-version = "1.1.5"
-description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.extras]
-lint = ["flake8", "mypy", "docutils-stubs"]
-test = ["pytest"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "sqlparse"
-version = "0.4.2"
-description = "A non-validating SQL parser."
-category = "main"
-optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "stevedore"
-version = "3.5.0"
-description = "Manage dynamic plugins for Python applications"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-pbr = ">=2.0.0,<2.1.0 || >2.1.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "termcolor"
-version = "1.1.0"
-description = "ANSII Color formatting for output in terminal."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "testfixtures"
-version = "6.18.3"
-description = "A collection of helpers and mock objects for unit tests and doc tests."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.extras]
-build = ["setuptools-git", "wheel", "twine"]
-docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
-test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "testing.common.database"
-version = "2.0.3"
-description = "utilities for testing.* packages"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.extras]
-testing = ["nose"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "testing.postgresql"
-version = "1.3.0"
-description = "automatically setups a postgresql instance in a temporary directory, and destroys it after testing"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-pg8000 = ">=1.10"
-"testing.common.database" = "*"
-
-[package.extras]
-testing = ["sqlalchemy", "nose", "psycopg2"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-category = "main"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "tomli"
-version = "1.2.2"
-description = "A lil' TOML parser"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "traitlets"
-version = "5.1.1"
-description = "Traitlets Python configuration system"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[package.extras]
-test = ["pytest"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "trio"
-version = "0.19.0"
-description = "A friendly Python library for async concurrency and I/O"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-async-generator = ">=1.9"
-attrs = ">=19.2.0"
-cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""}
-idna = "*"
-outcome = "*"
-sniffio = "*"
-sortedcontainers = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "trio-websocket"
-version = "0.9.2"
-description = "WebSocket library for Trio"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-async-generator = ">=1.10"
-trio = ">=0.11"
-wsproto = ">=0.14"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "twilio"
-version = "7.3.1"
-description = "Twilio API client and TwiML generator"
-category = "main"
-optional = false
-python-versions = ">=3.6.0"
-
-[package.dependencies]
-PyJWT = ">=2.0.0,<3.0.0"
-pytz = "*"
-requests = ">=2.0.0"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "types-pytz"
-version = "2021.3.1"
-description = "Typing stubs for pytz"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "types-pyyaml"
-version = "6.0.1"
-description = "Typing stubs for PyYAML"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "typing-extensions"
-version = "4.0.0"
-description = "Backported and Experimental Type Hints for Python 3.6+"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "urllib3"
-version = "1.26.7"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-
-[package.dependencies]
-certifi = {version = "*", optional = true, markers = "extra == \"secure\""}
-cryptography = {version = ">=1.3.4", optional = true, markers = "extra == \"secure\""}
-idna = {version = ">=2.0.0", optional = true, markers = "extra == \"secure\""}
-pyOpenSSL = {version = ">=0.14", optional = true, markers = "extra == \"secure\""}
-
-[package.extras]
-brotli = ["brotlipy (>=0.6.0)"]
-secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
-socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "vine"
-version = "5.0.0"
-description = "Promises, promises, promises."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "wcwidth"
-version = "0.2.5"
-description = "Measures the displayed width of unicode strings in a terminal"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "webencodings"
-version = "0.5.1"
-description = "Character encoding aliases for legacy web content"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "whoosh"
-version = "2.7.4"
-description = "Fast, pure-Python full text indexing, search, and spell checking library."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "wrapt"
-version = "1.13.3"
-description = "Module for decorators, wrappers and monkey patching."
-category = "main"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "wsproto"
-version = "1.0.0"
-description = "WebSockets state-machine based protocol implementation"
-category = "dev"
-optional = false
-python-versions = ">=3.6.1"
-
-[package.dependencies]
-h11 = ">=0.9.0,<1"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[[package]]
-name = "yubiotp"
-version = "1.0.0.post1"
-description = "A library for verifying YubiKey OTP tokens, both locally and through a Yubico web service."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-pycryptodome = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
-[metadata]
-lock-version = "1.1"
-python-versions = "^3.9"
-content-hash = "4fba522bc9b8e3ead49950003648e14b7dcd33d404ec2689344e23b1b3974c35"
-
-[metadata.files]
-alabaster = [
-    {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"},
-    {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
-]
-aleksis-builddeps = [
-    {file = "AlekSIS-Builddeps-5+20211130151050.f0145936.tar.gz", hash = "sha256:171550b13c27fff17e1dd04d146a7c01c688856a0fb0e0a8d7d702ed20a409d2"},
-    {file = "AlekSIS_Builddeps-5+20211130151050.f0145936-py3-none-any.whl", hash = "sha256:945a1522f8540c1342614f2e38c6463a6ea94a536d631b39f0568baab83829f2"},
-]
-aleksis-core = [
-    {file = "AlekSIS-Core-2.2+20211129202100.032a3cac.tar.gz", hash = "sha256:e752af44c539ccb287c30bbc135e1d70aca246da5f1755945da468ced03ba8dc"},
-    {file = "AlekSIS_Core-2.2+20211129202100.032a3cac-py3-none-any.whl", hash = "sha256:b380f6797c58a13c3bb62f168b2e871036b6f973208d8da0fa4469d7e02dd487"},
-]
-amqp = [
-    {file = "amqp-5.0.6-py3-none-any.whl", hash = "sha256:493a2ac6788ce270a2f6a765b017299f60c1998f5a8617908ee9be082f7300fb"},
-    {file = "amqp-5.0.6.tar.gz", hash = "sha256:03e16e94f2b34c31f8bf1206d8ddd3ccaa4c315f7f6a1879b7b1210d229568c2"},
-]
-appnope = [
-    {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
-    {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
-]
-asgiref = [
-    {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"},
-    {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"},
-]
-asn1crypto = [
-    {file = "asn1crypto-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bcdf33c861c7d40bdcd74d8e4dd7661aac320fcdf40b9a3f95b4ee12fde2fa8"},
-    {file = "asn1crypto-1.4.0.tar.gz", hash = "sha256:f4f6e119474e58e04a2b1af817eb585b4fd72bdd89b998624712b5c99be7641c"},
-]
-async-generator = [
-    {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"},
-    {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"},
-]
-atomicwrites = [
-    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
-    {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
-]
-attrs = [
-    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
-    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
-]
-babel = [
-    {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
-    {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
-]
-backcall = [
-    {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
-    {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
-]
-bandit = [
-    {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"},
-    {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"},
-]
-beautifulsoup4 = [
-    {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"},
-    {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
-]
-billiard = [
-    {file = "billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b"},
-    {file = "billiard-3.6.4.0.tar.gz", hash = "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547"},
-]
-black = [
-    {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"},
-    {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"},
-]
-bleach = [
-    {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
-    {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"},
-]
-"boolean.py" = [
-    {file = "boolean.py-3.8-py2.py3-none-any.whl", hash = "sha256:d75da0fd0354425fa64f6bbc6cec6ae1485d0eec3447b73187ff8cbf9b572e26"},
-    {file = "boolean.py-3.8.tar.gz", hash = "sha256:cc24e20f985d60cd4a3a5a1c0956dd12611159d32a75081dabd0c9ab981acaa4"},
-]
-bs4 = [
-    {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"},
-]
-calendarweek = [
-    {file = "calendarweek-0.5.0-py3-none-any.whl", hash = "sha256:f2003e6e0264d3d1320fc99ae6d70e60174c2664e5640c6aa31ad38e229d942d"},
-    {file = "calendarweek-0.5.0.tar.gz", hash = "sha256:32f5c8663799a2f5a0b8909976c7a3ae77397acd7e7c31d1456ece5b452988a5"},
-]
-celery = [
-    {file = "celery-5.2.1-py3-none-any.whl", hash = "sha256:cc63ea6572d558be65297ba6db7a7979e64c0a3d0d61212d6302ef1ca05a0d22"},
-    {file = "celery-5.2.1.tar.gz", hash = "sha256:b41a590b49caf8e6498a57db628e580d5f8dc6febda0f42de5d783aed5b7f808"},
-]
-celery-haystack-ng = [
-    {file = "celery-haystack-ng-0.20.post2.tar.gz", hash = "sha256:d2e077851f13dddc36fc86134c7c8a937e46ae75e576eb8e77e03b03977fc7bb"},
-    {file = "celery_haystack_ng-0.20.post2-py2.py3-none-any.whl", hash = "sha256:a13e00f2c29411b06c6cdf59ad6a90b6c158e3384e7ec6d6d64f6a69e8ff299a"},
-]
-celery-progress = [
-    {file = "celery-progress-0.1.1.tar.gz", hash = "sha256:b2622d1b410a763412810f0293153c984f4a0220b76769bd701b5b45e583ddad"},
-    {file = "celery_progress-0.1.1-py3-none-any.whl", hash = "sha256:36a1e58b4408c9bf6aa63908204b50960b005db8e13f3c94ce6f8d6a2a4d4a6c"},
-]
-certifi = [
-    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
-    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
-]
-cffi = [
-    {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
-    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
-    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
-    {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
-    {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
-    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
-    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
-    {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
-    {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
-    {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
-    {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
-    {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
-    {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
-    {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
-    {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
-    {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
-    {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
-    {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
-    {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
-    {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
-    {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
-    {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
-    {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
-    {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
-    {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
-]
-charset-normalizer = [
-    {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"},
-    {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"},
-]
-click = [
-    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
-    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
-]
-click-didyoumean = [
-    {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"},
-    {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"},
-]
-click-plugins = [
-    {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
-    {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
-]
-click-repl = [
-    {file = "click-repl-0.2.0.tar.gz", hash = "sha256:cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8"},
-    {file = "click_repl-0.2.0-py3-none-any.whl", hash = "sha256:94b3fbbc9406a236f176e0506524b2937e4b23b6f4c0c0b2a0a83f8a64e9194b"},
-]
-colorama = [
-    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
-    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
-]
-colour = [
-    {file = "colour-0.1.5-py2.py3-none-any.whl", hash = "sha256:33f6db9d564fadc16e59921a56999b79571160ce09916303d35346dddc17978c"},
-    {file = "colour-0.1.5.tar.gz", hash = "sha256:af20120fefd2afede8b001fbef2ea9da70ad7d49fafdb6489025dae8745c3aee"},
-]
-configobj = [
-    {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"},
-]
-coverage = [
-    {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"},
-    {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"},
-    {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"},
-    {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"},
-    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"},
-    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"},
-    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"},
-    {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"},
-    {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"},
-    {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"},
-    {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"},
-    {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"},
-    {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"},
-    {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"},
-    {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"},
-    {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"},
-    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"},
-    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"},
-    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"},
-    {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"},
-    {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"},
-    {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"},
-    {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"},
-    {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"},
-    {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"},
-    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"},
-    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"},
-    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"},
-    {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"},
-    {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"},
-    {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"},
-    {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"},
-    {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"},
-    {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"},
-    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"},
-    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"},
-    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"},
-    {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"},
-    {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"},
-    {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"},
-    {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"},
-    {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"},
-    {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"},
-    {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"},
-    {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"},
-    {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"},
-    {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"},
-]
-cryptography = [
-    {file = "cryptography-36.0.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:9511416e85e449fe1de73f7f99b21b3aa04fba4c4d335d30c486ba3756e3a2a6"},
-    {file = "cryptography-36.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:97199a13b772e74cdcdb03760c32109c808aff7cd49c29e9cf4b7754bb725d1d"},
-    {file = "cryptography-36.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:494106e9cd945c2cadfce5374fa44c94cfadf01d4566a3b13bb487d2e6c7959e"},
-    {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6fbbbb8aab4053fa018984bb0e95a16faeb051dd8cca15add2a27e267ba02b58"},
-    {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:684993ff6f67000a56454b41bdc7e015429732d65a52d06385b6e9de6181c71e"},
-    {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c702855cd3174666ef0d2d13dcc879090aa9c6c38f5578896407a7028f75b9f"},
-    {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d91bc9f535599bed58f6d2e21a2724cb0c3895bf41c6403fe881391d29096f1d"},
-    {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b17d83b3d1610e571fedac21b2eb36b816654d6f7496004d6a0d32f99d1d8120"},
-    {file = "cryptography-36.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8982c19bb90a4fa2aad3d635c6d71814e38b643649b4000a8419f8691f20ac44"},
-    {file = "cryptography-36.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:24469d9d33217ffd0ce4582dfcf2a76671af115663a95328f63c99ec7ece61a4"},
-    {file = "cryptography-36.0.0-cp36-abi3-win32.whl", hash = "sha256:f6a5a85beb33e57998dc605b9dbe7deaa806385fdf5c4810fb849fcd04640c81"},
-    {file = "cryptography-36.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:2deab5ec05d83ddcf9b0916319674d3dae88b0e7ee18f8962642d3cde0496568"},
-    {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2049f8b87f449fc6190350de443ee0c1dd631f2ce4fa99efad2984de81031681"},
-    {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a776bae1629c8d7198396fd93ec0265f8dd2341c553dc32b976168aaf0e6a636"},
-    {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:aa94d617a4cd4cdf4af9b5af65100c036bce22280ebb15d8b5262e8273ebc6ba"},
-    {file = "cryptography-36.0.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5c49c9e8fb26a567a2b3fa0343c89f5d325447956cc2fc7231c943b29a973712"},
-    {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef216d13ac8d24d9cd851776662f75f8d29c9f2d05cdcc2d34a18d32463a9b0b"},
-    {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231c4a69b11f6af79c1495a0e5a85909686ea8db946935224b7825cfb53827ed"},
-    {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f92556f94e476c1b616e6daec5f7ddded2c082efa7cee7f31c7aeda615906ed8"},
-    {file = "cryptography-36.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d73e3a96c38173e0aa5646c31bf8473bc3564837977dd480f5cbeacf1d7ef3a3"},
-    {file = "cryptography-36.0.0.tar.gz", hash = "sha256:52f769ecb4ef39865719aedc67b4b7eae167bafa48dbc2a26dd36fa56460507f"},
-]
-curlylint = [
-    {file = "curlylint-0.13.0-py3-none-any.whl", hash = "sha256:63e5fc98f99c7b0eab0c4e3390356ad569b7bb3eecb6da115e6cb9ee98eb738f"},
-    {file = "curlylint-0.13.0.tar.gz", hash = "sha256:0d38839f126b3fdd2561a7efa65d15a1c842aac98e555b2381f7c79478e1ff25"},
-]
-decorator = [
-    {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"},
-    {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"},
-]
-defusedxml = [
-    {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
-    {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
-]
-deprecated = [
-    {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"},
-    {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"},
-]
-dj-database-url = [
-    {file = "dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163"},
-    {file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"},
-]
-django = [
-    {file = "Django-3.2.9-py3-none-any.whl", hash = "sha256:e22c9266da3eec7827737cde57694d7db801fedac938d252bf27377cec06ed1b"},
-    {file = "Django-3.2.9.tar.gz", hash = "sha256:51284300f1522ffcdb07ccbdf676a307c6678659e1284f0618e5a774127a6a08"},
-]
-django-allauth = [
-    {file = "django-allauth-0.46.0.tar.gz", hash = "sha256:8217b8dc46f85812ff209fc542f4bf378f1751cdbe867008169d4c85685df50d"},
-]
-django-any-js = [
-    {file = "django-any-js-1.1.tar.gz", hash = "sha256:2972946902ba049f73bf8bb87e0a0118f77a8c9dca89438f193598bff758422f"},
-    {file = "django_any_js-1.1-py3-none-any.whl", hash = "sha256:1499934e293bbcaad29b8edaaefca87dda79eb3df1faeaaea67b80e2866ae1f8"},
-]
-django-appconf = [
-    {file = "django-appconf-1.0.5.tar.gz", hash = "sha256:be3db0be6c81fa84742000b89a81c016d70ae66a7ccb620cdef592b1f1a6aaa4"},
-    {file = "django_appconf-1.0.5-py3-none-any.whl", hash = "sha256:ae9f864ee1958c815a965ed63b3fba4874eec13de10236ba063a788f9a17389d"},
-]
-django-bleach = [
-    {file = "django-bleach-0.9.0.tar.gz", hash = "sha256:d76534566987187da35c60d9097bc18e6d8aadc2d8743cee46b820940e45cea7"},
-    {file = "django_bleach-0.9.0-py2.py3-none-any.whl", hash = "sha256:12aeffd1b9f96d91d92bb04e9ce46dba29294c7fc1c6678d111e769d279bad3e"},
-]
-django-cachalot = [
-    {file = "django-cachalot-2.4.4.tar.gz", hash = "sha256:8489a74e9a689437f81fa61705b154a4be3cac1b62b61f68215d79668c9ac037"},
-    {file = "django_cachalot-2.4.4-py3-none-any.whl", hash = "sha256:f8995a85197ac290e63a2f97c577cc9825000fe081b08d5c7d35079e7f1daa43"},
-]
-django-cache-memoize = [
-    {file = "django-cache-memoize-0.1.10.tar.gz", hash = "sha256:63e8faa245a41c0dbad843807e9f21a6e59eba8e6e50df310fdf6485a6749843"},
-    {file = "django_cache_memoize-0.1.10-py3-none-any.whl", hash = "sha256:676299313079cde9242ae84db0160e80b1d44e8dd6bc9b1f4f1247e11b30c9e0"},
-]
-django-celery-beat = [
-    {file = "django-celery-beat-2.2.1.tar.gz", hash = "sha256:97ae5eb309541551bdb07bf60cc57cadacf42a74287560ced2d2c06298620234"},
-    {file = "django_celery_beat-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab43049634fd18dc037927d7c2c7d5f67f95283a20ebbda55f42f8606412e66c"},
-]
-django-celery-email = [
-    {file = "django-celery-email-3.0.0.tar.gz", hash = "sha256:5546cbba80952cc3b8a0ffa4206ce90a4a996a7ffd1c385a2bdb65903ca18ece"},
-    {file = "django_celery_email-3.0.0-py2.py3-none-any.whl", hash = "sha256:0f72da39cb2ea83c69440566e87f27cd72f68f247f98ce99fb29889fcf329406"},
-]
-django-celery-results = [
-    {file = "django_celery_results-2.2.0-py2.py3-none-any.whl", hash = "sha256:d5f83fad9091e52cd6dbb3ca80632153ad14b6cdac4d73258e040f92717237cb"},
-    {file = "django_celery_results-2.2.0.tar.gz", hash = "sha256:cc0285090a306f97f1d4b7929ed98af0475bf6db2568976b3387de4fbe812edc"},
-]
-django-ckeditor = [
-    {file = "django-ckeditor-6.2.0.tar.gz", hash = "sha256:df64dc9e62790ef824f609605d31be847bdbce1cc7aa94e49bd5ca60d7aa79bb"},
-    {file = "django_ckeditor-6.2.0-py2.py3-none-any.whl", hash = "sha256:9f66420907e41f5b4e698fa5671a00a86995776735f2c4696174aed4640fcbd8"},
-]
-django-cleanup = [
-    {file = "django-cleanup-5.2.0.tar.gz", hash = "sha256:909d10ff574f5ce1a40fa63bd5c94c9ed866fd7ae770994c46cdf66c3db3e846"},
-    {file = "django_cleanup-5.2.0-py2.py3-none-any.whl", hash = "sha256:193cf69de54b9fc0a0f4547edbb3a63bbe01728cb029f9f4b7912098cc1bced7"},
-]
-django-colorfield = [
-    {file = "django-colorfield-0.4.5.tar.gz", hash = "sha256:66d7cb628d05c0eb09e25b0923e36bf6fbd3e339c568a199e66b34463119ca13"},
-    {file = "django_colorfield-0.4.5-py3-none-any.whl", hash = "sha256:579128d008b2d15e4df64f102b1ad58432de1b6f1017221c316d630e5c62960a"},
-]
-django-dbbackup = [
-    {file = "django-dbbackup-3.3.0.tar.gz", hash = "sha256:bb109735cae98b64ad084e5b461b7aca2d7b39992f10c9ed9435e3ebb6fb76c8"},
-]
-django-debug-toolbar = [
-    {file = "django-debug-toolbar-3.2.2.tar.gz", hash = "sha256:8c5b13795d4040008ee69ba82dcdd259c49db346cf7d0de6e561a49d191f0860"},
-    {file = "django_debug_toolbar-3.2.2-py3-none-any.whl", hash = "sha256:d7bab7573fab35b0fd029163371b7182f5826c13da69734beb675c761d06a4d3"},
-]
-django-dynamic-preferences = [
-    {file = "django-dynamic-preferences-1.11.0.tar.gz", hash = "sha256:f214c938b5872a17647e2b2ccfd9ad00a90a3c6c4aa83fa65d3c5c446e7a66c7"},
-    {file = "django_dynamic_preferences-1.11.0-py2.py3-none-any.whl", hash = "sha256:31aecebcbfcfb970b78cfa3e5f8cc9f77638efe8e7c90f205a48b01c45ee5002"},
-]
-django-extensions = [
-    {file = "django-extensions-3.1.5.tar.gz", hash = "sha256:28e1e1bf49f0e00307ba574d645b0af3564c981a6dfc87209d48cb98f77d0b1a"},
-    {file = "django_extensions-3.1.5-py3-none-any.whl", hash = "sha256:9238b9e016bb0009d621e05cf56ea8ce5cce9b32e91ad2026996a7377ca28069"},
-]
-django-favicon-plus-reloaded = [
-    {file = "django-favicon-plus-reloaded-1.1.3.tar.gz", hash = "sha256:36c2a1cefc201df8bd132492e2440ccdc3d9ceb8e421b2ca181a4704ebacd190"},
-    {file = "django_favicon_plus_reloaded-1.1.3-py3-none-any.whl", hash = "sha256:a60b438360e82bf7075b856ff6a80bae20c825373a58deac627810e478c42be3"},
-]
-django-filter = [
-    {file = "django-filter-2.4.0.tar.gz", hash = "sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06"},
-    {file = "django_filter-2.4.0-py3-none-any.whl", hash = "sha256:e00d32cebdb3d54273c48f4f878f898dced8d5dfaad009438fe61ebdf535ace1"},
-]
-django-formtools = [
-    {file = "django-formtools-2.3.tar.gz", hash = "sha256:9663b6eca64777b68d6d4142efad8597fe9a685924673b25aa8a1dcff4db00c3"},
-    {file = "django_formtools-2.3-py3-none-any.whl", hash = "sha256:4699937e19ee041d803943714fe0c1c7ad4cab802600eb64bbf4cdd0a1bfe7d9"},
-]
-django-guardian = [
-    {file = "django-guardian-2.4.0.tar.gz", hash = "sha256:c58a68ae76922d33e6bdc0e69af1892097838de56e93e78a8361090bcd9f89a0"},
-    {file = "django_guardian-2.4.0-py3-none-any.whl", hash = "sha256:440ca61358427e575323648b25f8384739e54c38b3d655c81d75e0cd0d61b697"},
-]
-django-haystack = [
-    {file = "django-haystack-3.1.1.tar.gz", hash = "sha256:6d05756b95d7d5ec1dbd4668eb999ced1504b47f588e2e54be53b1404c516a82"},
-    {file = "django_haystack-3.1.1-py3-none-any.whl", hash = "sha256:970ebc6362f3f84861209154ec34b57f3e87d2d7922f948df80177f0e2e3ced7"},
-]
-django-health-check = [
-    {file = "django-health-check-3.16.4.tar.gz", hash = "sha256:334bcbbb9273a6dbd9c928e78474306e623dfb38cc442281cb9fd230a20a7fdb"},
-    {file = "django_health_check-3.16.4-py2.py3-none-any.whl", hash = "sha256:86a8869d67e72394a1dd73e37819a7d2cfd915588b96927fda611d7451fd4735"},
-]
-django-iban-field = [
-    {file = "django_iban_field-0.8-py2.py3-none-any.whl", hash = "sha256:9d11eacb49b939702aa169aa0a3c9880970ed087c236279c32c26f86c7e10092"},
-]
-django-impersonate = [
-    {file = "django-impersonate-1.7.3.tar.gz", hash = "sha256:282003957577c7143fe31e5861f8fffdf6fe0c25557aedb28fcf8b11474eaa23"},
-]
-django-ipware = [
-    {file = "django-ipware-4.0.0.tar.gz", hash = "sha256:1294f916f3b3475e40e1b0ec1bd320aa2397978eae672721c81cbc2ed517e9ee"},
-    {file = "django_ipware-4.0.0-py2.py3-none-any.whl", hash = "sha256:116bd0d7940f09bf7ffd465943992e23d87e772a9d6c0d3a57b74040589a383b"},
-]
-django-js-asset = [
-    {file = "django-js-asset-1.2.2.tar.gz", hash = "sha256:c163ae80d2e0b22d8fb598047cd0dcef31f81830e127cfecae278ad574167260"},
-    {file = "django_js_asset-1.2.2-py2.py3-none-any.whl", hash = "sha256:8ec12017f26eec524cab436c64ae73033368a372970af4cf42d9354fcb166bdd"},
-]
-django-js-reverse = [
-    {file = "django-js-reverse-0.9.1.tar.gz", hash = "sha256:2a392d169f44e30b883c30dfcfd917a14167ce8fe196c99d2385b31c90d77aa0"},
-    {file = "django_js_reverse-0.9.1-py2.py3-none-any.whl", hash = "sha256:8134c2ab6307c945edfa90671ca65e85d6c1754d48566bdd6464be259cc80c30"},
-]
-django-jsonstore = [
-    {file = "django-jsonstore-0.5.0.tar.gz", hash = "sha256:896dc10b08f59807eda1c6cebf43cd26e50d0db29d13495c027dc31e464be3c3"},
-    {file = "django_jsonstore-0.5.0-py2-none-any.whl", hash = "sha256:9630c1fb43ae9f8e32733c5cf7d4c3775ba6f08532f517c64025053352d72844"},
-]
-django-maintenance-mode = [
-    {file = "django-maintenance-mode-0.16.1.tar.gz", hash = "sha256:da1f77f431ab5c55913459adb3c259e091f783ffc72de701690826aaaccce4ca"},
-    {file = "django_maintenance_mode-0.16.1-py3-none-any.whl", hash = "sha256:1bfac0b34429a9f6dbb0db169fb753f49f24ca155ae148d7526ff395303c158d"},
-]
-django-material = [
-    {file = "django-material-1.10.0.tar.gz", hash = "sha256:3cc015500939a63606c1522119fddc4c86facb6d1bbfa8fc76bdc8878e8252f5"},
-    {file = "django_material-1.10.0-py2.py3-none-any.whl", hash = "sha256:50e4764fa0cb504cf1f6d497f86c6294ff3fbf43bdbf0e4c612e3681fa9000a0"},
-]
-django-menu-generator-ng = [
-    {file = "django-menu-generator-ng-1.2.3.tar.gz", hash = "sha256:0c21a094b094add909655728b6b2d4a8baa5a2047da8f649be52589bea0e3ba2"},
-]
-django-model-utils = [
-    {file = "django-model-utils-4.2.0.tar.gz", hash = "sha256:e7a95e102f9c9653427eadab980d5d59e1dea972913b9c9e01ac37f86bba0ddf"},
-    {file = "django_model_utils-4.2.0-py3-none-any.whl", hash = "sha256:a768a25c80514e0ad4e4a6f9c02c44498985f36c5dfdea47b5b1e8cf994beba6"},
-]
-django-oauth-toolkit = [
-    {file = "django-oauth-toolkit-1.5.0.tar.gz", hash = "sha256:650e5ef2244d1d8db8f507137e0d1e8b8aad1f4086a4a610526e8851f9a38308"},
-    {file = "django_oauth_toolkit-1.5.0-py3-none-any.whl", hash = "sha256:b2e346a7c1e222774bfb370f21b556b92b408395b4c23914e2d1b241b2e5376a"},
-]
-django-otp = [
-    {file = "django-otp-1.1.2.tar.gz", hash = "sha256:a4253a6c6773fc5881bc26c5db64d568c49938730fced2bab33db9e24c425794"},
-    {file = "django_otp-1.1.2-py3-none-any.whl", hash = "sha256:4cc9f4310fb6b760d6a14ca900f687af13b6b672dda95bed4b0e2e31318e6bde"},
-]
-django-otp-yubikey = [
-    {file = "django-otp-yubikey-1.0.1.tar.gz", hash = "sha256:5917b9134fa408d12b94bdb4d3cac23e4586ae99c3a42fcb1d2c287c182e6c77"},
-    {file = "django_otp_yubikey-1.0.1-py2.py3-none-any.whl", hash = "sha256:5a1b59be47088a3eccf376ca27d708bdcccfeb30324bb5ca01ed2d669b73756c"},
-]
-django-phonenumber-field = [
-    {file = "django-phonenumber-field-5.2.0.tar.gz", hash = "sha256:52b2e5970133ec5ab701218b802f7ab237229854dc95fd239b7e9e77dc43731d"},
-    {file = "django_phonenumber_field-5.2.0-py3-none-any.whl", hash = "sha256:5547fb2b2cc690a306ba77a5038419afc8fa8298a486fb7895008e9067cc7e75"},
-]
-django-polymorphic = [
-    {file = "django-polymorphic-3.1.0.tar.gz", hash = "sha256:d6955b5308bf6e41dcb22ba7c96f00b51dfa497a8a5ab1e9c06c7951bf417bf8"},
-    {file = "django_polymorphic-3.1.0-py3-none-any.whl", hash = "sha256:08bc4f4f4a773a19b2deced5a56deddd1ef56ebd15207bf4052e2901c25ef57e"},
-]
-django-prometheus = [
-    {file = "django-prometheus-2.1.0.tar.gz", hash = "sha256:dd3f8da1399140fbef5c00d1526a23d1ade286b144281c325f8e409a781643f2"},
-    {file = "django_prometheus-2.1.0-py2.py3-none-any.whl", hash = "sha256:c338d6efde1ca336e90c540b5e87afe9287d7bcc82d651a778f302b0be17a933"},
-]
-django-redis = [
-    {file = "django-redis-5.0.0.tar.gz", hash = "sha256:048f665bbe27f8ff2edebae6aa9c534ab137f1e8fa7234147ef470df3f3aa9b8"},
-    {file = "django_redis-5.0.0-py3-none-any.whl", hash = "sha256:97739ca9de3f964c51412d1d7d8aecdfd86737bb197fce6e1ff12620c63c97ee"},
-]
-django-render-block = [
-    {file = "django-render-block-0.8.1.tar.gz", hash = "sha256:edbc5d444cc50f3eb3387cf17f6f1014bf19d6018f680861cdeae9e0306003fa"},
-    {file = "django_render_block-0.8.1-py3-none-any.whl", hash = "sha256:903969efd0949f750c5fe71affe6e6b1ea66d03005c102a67fda36d5b9f4e1e1"},
-]
-django-reversion = [
-    {file = "django-reversion-4.0.1.tar.gz", hash = "sha256:6991f16e5d3a972912db3d56e3a714d10b07becd566ab87f85f2e9b671981339"},
-    {file = "django_reversion-4.0.1-py3-none-any.whl", hash = "sha256:2e40ed41e08cdd83a05dc70a1974feface52a61ba7d289727117163052081ae6"},
-]
-django-sass-processor = [
-    {file = "django-sass-processor-1.0.0.tar.gz", hash = "sha256:cb90efee38cd7b0fe727c78d8993ad7804de33f40328200dfc1a481307ef0466"},
-]
-django-select2 = [
-    {file = "django-select2-7.9.0.tar.gz", hash = "sha256:4494cf5fa13333ddbd34e4dbeca4b44a22ed6367342cccd24f6f122f6ef4a20b"},
-    {file = "django_select2-7.9.0-py2.py3-none-any.whl", hash = "sha256:40d42643b459f79c31598fa5645f5f7e8edda8350a78761ab6c06105ca588872"},
-]
-django-stubs = [
-    {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"},
-    {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"},
-]
-django-stubs-ext = [
-    {file = "django-stubs-ext-0.3.1.tar.gz", hash = "sha256:783c198d7e39a41be0b90fd843fa2770243a642922af679be4b19e03b82c8c28"},
-    {file = "django_stubs_ext-0.3.1-py3-none-any.whl", hash = "sha256:a51a3e9e844d4e1cacaaedbb33bf3def78a3956eed5d9575a640bd97ccd99cec"},
-]
-django-tables2 = [
-    {file = "django-tables2-2.4.1.tar.gz", hash = "sha256:6c72dd208358539e789e4c0efd7d151e43283a4aa4093a35f44c43489e7ddeaa"},
-    {file = "django_tables2-2.4.1-py2.py3-none-any.whl", hash = "sha256:50762bf3d7c61a4eb70e763c3e278650d7266bb78d0497fc8fafcf4e507c9a64"},
-]
-django-templated-email = [
-    {file = "django-templated-email-3.0.0.tar.gz", hash = "sha256:49d61840ec551e640adaf341146e94d6f9058ae01df964480850bf988046e5eb"},
-    {file = "django_templated_email-3.0.0-py3-none-any.whl", hash = "sha256:bf1b68ffe6c8794c0c50e2ce20e3a166c6d511b3879abbd3cf059a3fc2fe2e60"},
-]
-django-timezone-field = [
-    {file = "django-timezone-field-4.2.1.tar.gz", hash = "sha256:97780cde658daa5094ae515bb55ca97c1352928ab554041207ad515dee3fe971"},
-    {file = "django_timezone_field-4.2.1-py3-none-any.whl", hash = "sha256:6dc782e31036a58da35b553bd00c70f112d794700025270d8a6a4c1d2e5b26c6"},
-]
-django-titofisto = [
-    {file = "django-titofisto-0.2.0.tar.gz", hash = "sha256:e181081a8c9c5c8da9f15458d996624f9e19c98d2882a5d4f199b39dd0787ad6"},
-    {file = "django_titofisto-0.2.0-py3-none-any.whl", hash = "sha256:38d5298fe64d3c12a3a48767d8f1af4bd86cfc12787af0faaf3e141a29a12bb8"},
-]
-django-two-factor-auth = [
-    {file = "django-two-factor-auth-1.13.1.tar.gz", hash = "sha256:a20e03d256fd9fd668988545f052cedcc47e5a981888562e5e27d0bb83deae89"},
-    {file = "django_two_factor_auth-1.13.1-py2.py3-none-any.whl", hash = "sha256:d270d4288731233621a9462a89a8dfed2dcb86fa354125c816a89772d55f9e29"},
-]
-django-uwsgi-ng = [
-    {file = "django-uwsgi-ng-1.1.2.tar.gz", hash = "sha256:1df2ffa642f7a831bd8d7f7e459f7b0821113b37174ccf4bf977e4467d45d9b3"},
-    {file = "django_uwsgi_ng-1.1.2-py3-none-any.whl", hash = "sha256:8b1a489a1ed9e56da0efadfa86ec306b532e5cd953fe34b234aaefc26898c649"},
-]
-django-widget-tweaks = [
-    {file = "django-widget-tweaks-1.4.9.tar.gz", hash = "sha256:19bcb66a4a9e68493ced04e7124882d753c5be517ed001556f9e35a40147f545"},
-    {file = "django_widget_tweaks-1.4.9-py2.py3-none-any.whl", hash = "sha256:d6c64fbf92cd2df9031f597c1374982233c05a1190d295c39d1c57ce007569c7"},
-]
-django-yarnpkg = [
-    {file = "django-yarnpkg-6.0.1.tar.gz", hash = "sha256:aa059347b246c6f242401581d2c129bdcb45aa726be59fe2f288762a9843348a"},
-]
-djangorestframework = [
-    {file = "djangorestframework-3.12.4-py3-none-any.whl", hash = "sha256:6d1d59f623a5ad0509fe0d6bfe93cbdfe17b8116ebc8eda86d45f6e16e819aaf"},
-    {file = "djangorestframework-3.12.4.tar.gz", hash = "sha256:f747949a8ddac876e879190df194b925c177cdeb725a099db1460872f7c0a7f2"},
-]
-docutils = [
-    {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
-    {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
-]
-dparse = [
-    {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"},
-    {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
-]
-dynaconf = [
-    {file = "dynaconf-3.1.7-py2.py3-none-any.whl", hash = "sha256:f52fe5db7622da56a552275e8f64e4df46e3b4ae11158831b042e8ba2f6d1c96"},
-    {file = "dynaconf-3.1.7.tar.gz", hash = "sha256:e9d80b46ba4d9372f2f40c812594c963f74178140c0b596e57f2881001fc4d35"},
-]
-flake8 = [
-    {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
-    {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
-]
-flake8-bandit = [
-    {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
-]
-flake8-black = [
-    {file = "flake8-black-0.2.3.tar.gz", hash = "sha256:c199844bc1b559d91195ebe8620216f21ed67f2cc1ff6884294c91a0d2492684"},
-    {file = "flake8_black-0.2.3-py3-none-any.whl", hash = "sha256:cc080ba5b3773b69ba102b6617a00cc4ecbad8914109690cfda4d565ea435d96"},
-]
-flake8-builtins = [
-    {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"},
-    {file = "flake8_builtins-1.5.3-py2.py3-none-any.whl", hash = "sha256:7706babee43879320376861897e5d1468e396a40b8918ed7bccf70e5f90b8687"},
-]
-flake8-django = [
-    {file = "flake8-django-1.1.1.tar.gz", hash = "sha256:fb4e8f669d3cf44297bb6e1c5d0a358ab0aba373cd4c69268cf2798de6bcbd9b"},
-    {file = "flake8_django-1.1.1-py3-none-any.whl", hash = "sha256:c71da0e61b6119dae91cbffdbdb00f1d6ebe3f5d0c43f5bf136929997ab0b72d"},
-]
-flake8-docstrings = [
-    {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
-    {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"},
-]
-flake8-fixme = [
-    {file = "flake8-fixme-1.1.1.tar.gz", hash = "sha256:50cade07d27a4c30d4f12351478df87339e67640c83041b664724bda6d16f33a"},
-    {file = "flake8_fixme-1.1.1-py2.py3-none-any.whl", hash = "sha256:226a6f2ef916730899f29ac140bed5d4a17e5aba79f00a0e3ae1eff1997cb1ac"},
-]
-flake8-isort = [
-    {file = "flake8-isort-4.1.1.tar.gz", hash = "sha256:d814304ab70e6e58859bc5c3e221e2e6e71c958e7005239202fee19c24f82717"},
-    {file = "flake8_isort-4.1.1-py3-none-any.whl", hash = "sha256:c4e8b6dcb7be9b71a02e6e5d4196cefcef0f3447be51e82730fb336fff164949"},
-]
-flake8-mypy = [
-    {file = "flake8-mypy-17.8.0.tar.gz", hash = "sha256:47120db63aff631ee1f84bac6fe8e64731dc66da3efc1c51f85e15ade4a3ba18"},
-    {file = "flake8_mypy-17.8.0-py35.py36-none-any.whl", hash = "sha256:cff009f4250e8391bf48990093cff85802778c345c8449d6498b62efefeebcbc"},
-]
-flake8-polyfill = [
-    {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"},
-    {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
-]
-flake8-rst-docstrings = [
-    {file = "flake8-rst-docstrings-0.2.3.tar.gz", hash = "sha256:3045794e1c8467fba33aaea5c246b8369efc9c44ef8b0b20199bb6df7a4bd47b"},
-    {file = "flake8_rst_docstrings-0.2.3-py3-none-any.whl", hash = "sha256:565bbb391d7e4d0042924102221e9857ad72929cdd305b26501736ec22c1451a"},
-]
-freezegun = [
-    {file = "freezegun-1.1.0-py2.py3-none-any.whl", hash = "sha256:2ae695f7eb96c62529f03a038461afe3c692db3465e215355e1bb4b0ab408712"},
-    {file = "freezegun-1.1.0.tar.gz", hash = "sha256:177f9dd59861d871e27a484c3332f35a6e3f5d14626f2bf91be37891f18927f3"},
-]
-gitdb = [
-    {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
-    {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
-]
-gitpython = [
-    {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"},
-    {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"},
-]
-h11 = [
-    {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
-    {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
-]
-haystack-redis = [
-    {file = "haystack-redis-0.0.1.tar.gz", hash = "sha256:ccfea88bdc1387c9f7f6f19e9bc062a3612039ef94cfd3e78cf59a96ddd269b2"},
-    {file = "haystack_redis-0.0.1-py3-none-any.whl", hash = "sha256:4fdeee5a9d8daadb1fed4584fd2ffbb25b1ed2315dacb97b53093756d6b54467"},
-]
-html2text = [
-    {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"},
-    {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"},
-]
-idna = [
-    {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
-    {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
-]
-imagesize = [
-    {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"},
-    {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
-]
-iniconfig = [
-    {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
-    {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
-]
-ipython = [
-    {file = "ipython-7.30.0-py3-none-any.whl", hash = "sha256:c8f3e07aefb9cf9e067f39686f035ce09b27a1ee602116a3030b91b6fc138ee4"},
-    {file = "ipython-7.30.0.tar.gz", hash = "sha256:d41f8e80b99690122400f9b2069b12f670246a1b4cc5d332bd6c4e2500e6d6fb"},
-]
-isort = [
-    {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
-    {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
-]
-jedi = [
-    {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"},
-    {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
-]
-jinja2 = [
-    {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
-    {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
-]
-jwcrypto = [
-    {file = "jwcrypto-1.0-py2.py3-none-any.whl", hash = "sha256:db93a656d9a7a35dda5a68deb5c9f301f4e60507d8aef1559e0637b9ac497137"},
-    {file = "jwcrypto-1.0.tar.gz", hash = "sha256:f88816eb0a41b8f006af978ced5f171f33782525006cdb055b536a40f4d46ac9"},
-]
-kombu = [
-    {file = "kombu-5.2.2-py3-none-any.whl", hash = "sha256:d36f0cde6a18d9eb7b6b3aa62a59bfdff7f5724689850e447eca5be8efc9d501"},
-    {file = "kombu-5.2.2.tar.gz", hash = "sha256:0f5d0763fb916808f617b886697b2be28e6bc35026f08e679697fc814b48a608"},
-]
-libsass = [
-    {file = "libsass-0.21.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb"},
-    {file = "libsass-0.21.0-cp27-cp27m-win32.whl", hash = "sha256:a005f298f64624f313a3ac618ab03f844c71d84ae4f4a4aec4b68d2a4ffe75eb"},
-    {file = "libsass-0.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:6b984510ed94993708c0d697b4fef2d118929bbfffc3b90037be0f5ccadf55e7"},
-    {file = "libsass-0.21.0-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e25dd9047a9392d3c59a0b869e0404f2b325a03871ee45285ee33b3664f5613"},
-    {file = "libsass-0.21.0-cp36-abi3-macosx_10_14_x86_64.whl", hash = "sha256:12f39712de38689a8b785b7db41d3ba2ea1d46f9379d81ea4595802d91fa6529"},
-    {file = "libsass-0.21.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e2b1a7d093f2e76dc694c17c0c285e846d0b0deb0e8b21dc852ba1a3a4e2f1d6"},
-    {file = "libsass-0.21.0-cp36-abi3-win32.whl", hash = "sha256:abc29357ee540849faf1383e1746d40d69ed5cb6d4c346df276b258f5aa8977a"},
-    {file = "libsass-0.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:659ae41af8708681fa3ec73f47b9735a6725e71c3b66ff570bfce78952f2314e"},
-    {file = "libsass-0.21.0.tar.gz", hash = "sha256:d5ba529d9ce668be9380563279f3ffe988f27bc5b299c5a28453df2e0b0fbaf2"},
-]
-license-expression = [
-    {file = "license-expression-1.2.tar.gz", hash = "sha256:7960e1dfdf20d127e75ead931476f2b5c7556df05b117a73880b22ade17d1abc"},
-    {file = "license_expression-1.2-py2.py3-none-any.whl", hash = "sha256:6d97906380cecfc758a77f6d38c6760f2afade7e83d2b8295e234fe21f486fb8"},
-]
-markupsafe = [
-    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
-    {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
-]
-matplotlib-inline = [
-    {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"},
-    {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"},
-]
-mccabe = [
-    {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
-    {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
-]
-mypy = [
-    {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
-    {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
-    {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
-    {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
-    {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
-    {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
-    {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
-    {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
-    {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
-    {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
-    {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
-    {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
-    {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
-    {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
-    {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
-    {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
-    {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
-]
-mypy-extensions = [
-    {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
-    {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
-]
-oauthlib = [
-    {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"},
-    {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"},
-]
-outcome = [
-    {file = "outcome-1.1.0-py2.py3-none-any.whl", hash = "sha256:c7dd9375cfd3c12db9801d080a3b63d4b0a261aa996c4c13152380587288d958"},
-    {file = "outcome-1.1.0.tar.gz", hash = "sha256:e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967"},
-]
-packaging = [
-    {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
-    {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
-]
-parso = [
-    {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"},
-    {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"},
-]
-parsy = [
-    {file = "parsy-1.1.0-py3-none-any.whl", hash = "sha256:25bd5cea2954950ebbfdf71f8bdaf7fd45a5df5325fd36a1064be2204d9d4c94"},
-    {file = "parsy-1.1.0.tar.gz", hash = "sha256:36173ba01a5372c7a1b32352cc73a279a49198f52252adf1c8c1ed41d1f94e8d"},
-]
-pathspec = [
-    {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
-    {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
-]
-pbr = [
-    {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"},
-    {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"},
-]
-persisting-theory = [
-    {file = "persisting-theory-0.2.1.tar.gz", hash = "sha256:00ff7dcc8f481ff75c770ca5797d968e8725b6df1f77fe0cf7d20fa1e5790c0a"},
-]
-pexpect = [
-    {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"},
-    {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
-]
-pg8000 = [
-    {file = "pg8000-1.23.0-py3-none-any.whl", hash = "sha256:e339f09f676629c0806c8dcc6fdc89ca6dba817e20702448c5172e85d133419d"},
-    {file = "pg8000-1.23.0.tar.gz", hash = "sha256:a413e00141342813a2ca47e8b7b0549ff338cca02bc819076b6d70f12d755c79"},
-]
-phonenumbers = [
-    {file = "phonenumbers-8.12.38-py2.py3-none-any.whl", hash = "sha256:95c8a30157323a73a4f9207792e3ed69b626b4c74d8fc44064f25e7fb56cfc94"},
-    {file = "phonenumbers-8.12.38.tar.gz", hash = "sha256:3cda1d1cea9a6801babf825e6c0f6a9776ea6d8a68b81b256178f8e5aa813344"},
-]
-pickleshare = [
-    {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"},
-    {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
-]
-pillow = [
-    {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"},
-    {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"},
-    {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"},
-    {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"},
-    {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"},
-    {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"},
-    {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"},
-    {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"},
-    {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"},
-    {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"},
-    {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"},
-    {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"},
-    {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"},
-    {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"},
-    {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"},
-    {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"},
-    {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"},
-    {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"},
-    {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"},
-]
-platformdirs = [
-    {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
-    {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
-]
-pluggy = [
-    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
-    {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
-]
-prometheus-client = [
-    {file = "prometheus_client-0.12.0-py2.py3-none-any.whl", hash = "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0"},
-    {file = "prometheus_client-0.12.0.tar.gz", hash = "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5"},
-]
-prompt-toolkit = [
-    {file = "prompt_toolkit-3.0.23-py3-none-any.whl", hash = "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d"},
-    {file = "prompt_toolkit-3.0.23.tar.gz", hash = "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf"},
-]
-psutil = [
-    {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"},
-    {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"},
-    {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"},
-    {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"},
-    {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"},
-    {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"},
-    {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"},
-    {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"},
-    {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"},
-    {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"},
-    {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"},
-    {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"},
-    {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"},
-    {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"},
-    {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"},
-    {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"},
-    {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"},
-    {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"},
-    {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"},
-    {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"},
-    {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"},
-    {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"},
-    {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"},
-    {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"},
-    {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"},
-    {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"},
-    {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"},
-    {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"},
-]
-psycopg2 = [
-    {file = "psycopg2-2.9.2-cp310-cp310-win32.whl", hash = "sha256:6796ac614412ce374587147150e56d03b7845c9e031b88aacdcadc880e81bb38"},
-    {file = "psycopg2-2.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:dfc32db6ce9ecc35a131320888b547199f79822b028934bb5b332f4169393e15"},
-    {file = "psycopg2-2.9.2-cp36-cp36m-win32.whl", hash = "sha256:77d09a79f9739b97099d2952bbbf18eaa4eaf825362387acbb9552ec1b3fa228"},
-    {file = "psycopg2-2.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f65cba7924363e0d2f416041b48ff69d559548f2cb168ff972c54e09e1e64db8"},
-    {file = "psycopg2-2.9.2-cp37-cp37m-win32.whl", hash = "sha256:b8816c6410fa08d2a022e4e38d128bae97c1855e176a00493d6ec62ccd606d57"},
-    {file = "psycopg2-2.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:26322c3f114de1f60c1b0febf8fdd595c221b4f624524178f515d07350a71bd1"},
-    {file = "psycopg2-2.9.2-cp38-cp38-win32.whl", hash = "sha256:77b9105ef37bc005b8ffbcb1ed6d8685bb0e8ce84773738aa56421a007ec5a7a"},
-    {file = "psycopg2-2.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:91c7fd0fe9e6c118e8ff5b665bc3445781d3615fa78e131d0b4f8c85e8ca9ec8"},
-    {file = "psycopg2-2.9.2-cp39-cp39-win32.whl", hash = "sha256:a761b60da0ecaf6a9866985bcde26327883ac3cdb90535ab68b8d784f02b05ef"},
-    {file = "psycopg2-2.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:fd7ddab7d6afee4e21c03c648c8b667b197104713e57ec404d5b74097af21e31"},
-    {file = "psycopg2-2.9.2.tar.gz", hash = "sha256:a84da9fa891848e0270e8e04dcca073bc9046441eeb47069f5c0e36783debbea"},
-]
-ptyprocess = [
-    {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
-    {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
-]
-py = [
-    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
-    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
-]
-pycodestyle = [
-    {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
-    {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
-]
-pycparser = [
-    {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
-    {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
-]
-pycryptodome = [
-    {file = "pycryptodome-3.11.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ffd0cac13ff41f2d15ed39dc6ba1d2ad88dd2905d656c33d8235852f5d6151fd"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:ead516e03dfe062aefeafe4a29445a6449b0fc43bc8cb30194b2754917a63798"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4ce6b09547bf2c7cede3a017f79502eaed3e819c13cdb3cb357aea1b004e4cc6"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:014c758af7fa38cab85b357a496b76f4fc9dda1f731eb28358d66fef7ad4a3e1"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a843350d08c3d22f6c09c2f17f020d8dcfa59496165d7425a3fba0045543dda7"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:53989477044be41fa4a63da09d5038c2a34b2f4554cfea2e3933b17186ee9e19"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-win32.whl", hash = "sha256:f9bad2220b80b4ed74f089db012ab5ab5419143a33fad6c8aedcc2a9341eac70"},
-    {file = "pycryptodome-3.11.0-cp27-cp27m-win_amd64.whl", hash = "sha256:3c7ed5b07274535979c730daf5817db5e983ea80b04c22579eee8da4ca3ae4f8"},
-    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:8f3a60926be78422e662b0d0b18351b426ce27657101c8a50bad80300de6a701"},
-    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:fce7e22d96030b35345637c563246c24d4513bd3b413e1c40293114837ab8912"},
-    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:bc3c61ff92efdcc14af4a7b81da71d849c9acee51d8fd8ac9841a7620140d6c6"},
-    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:b33c9b3d1327d821e28e9cc3a6512c14f8b17570ddb4cfb9a52247ed0fcc5d8b"},
-    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:75e78360d1dd6d02eb288fd8275bb4d147d6e3f5337935c096d11dba1fa84748"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:621a90147a5e255fdc2a0fec2d56626b76b5d72ea9e60164c9a5a8976d45b0c9"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:0ca7a6b4fc1f9fafe990b95c8cda89099797e2cfbf40e55607f2f2f5a3355dcb"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b59bf823cfafde8ef1105d8984f26d1694dff165adb7198b12e3e068d7999b15"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:ce81b9c6aaa0f920e2ab05eb2b9f4ccd102e3016b2f37125593b16a83a4b0cc2"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ae29fcd56152f417bfba50a36a56a7a5f9fb74ff80bab98704cac704de6568ab"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:ae31cb874f6f0cedbed457c6374e7e54d7ed45c1a4e11a65a9c80968da90a650"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-win32.whl", hash = "sha256:6db1f9fa1f52226621905f004278ce7bd90c8f5363ffd5d7ab3755363d98549a"},
-    {file = "pycryptodome-3.11.0-cp35-abi3-win_amd64.whl", hash = "sha256:d7e5f6f692421e5219aa3b545eb0cffd832cd589a4b9dcd4a5eb4260e2c0d68a"},
-    {file = "pycryptodome-3.11.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:da796e9221dda61a0019d01742337eb8a322de8598b678a4344ca0a436380315"},
-    {file = "pycryptodome-3.11.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ed45ef92d21db33685b789de2c015e9d9a18a74760a8df1fc152faee88cdf741"},
-    {file = "pycryptodome-3.11.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4169ed515742425ff21e4bd3fabbb6994ffb64434472fb72230019bdfa36b939"},
-    {file = "pycryptodome-3.11.0-pp27-pypy_73-win32.whl", hash = "sha256:f19edd42368e9057c39492947bb99570dc927123e210008f2af7cf9b505c6892"},
-    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06162fcfed2f9deee8383fd59eaeabc7b7ffc3af50d3fad4000032deb8f700b0"},
-    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:6eda8a3157c91ba60b26a07bedd6c44ab8bda6cd79b6b5ea9744ba62c39b7b1e"},
-    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ff701fc283412e651eaab4319b3cd4eaa0827e94569cd37ee9075d5c05fe655"},
-    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:2a4bcc8a9977fee0979079cd33a9e9f0d3ddba5660d35ffe874cf84f1dd399d2"},
-    {file = "pycryptodome-3.11.0.tar.gz", hash = "sha256:428096bbf7a77e207f418dfd4d7c284df8ade81d2dc80f010e92753a3e406ad0"},
-]
-pydocstyle = [
-    {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
-    {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"},
-]
-pyflakes = [
-    {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
-    {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
-]
-pygments = [
-    {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
-    {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
-]
-pyjwt = [
-    {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"},
-    {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"},
-]
-pyopenssl = [
-    {file = "pyOpenSSL-21.0.0-py2.py3-none-any.whl", hash = "sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6"},
-    {file = "pyOpenSSL-21.0.0.tar.gz", hash = "sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3"},
-]
-pyparsing = [
-    {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
-    {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
-]
-pytest = [
-    {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
-    {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
-]
-pytest-cov = [
-    {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
-    {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
-]
-pytest-django = [
-    {file = "pytest-django-4.4.0.tar.gz", hash = "sha256:b5171e3798bf7e3fc5ea7072fe87324db67a4dd9f1192b037fed4cc3c1b7f455"},
-    {file = "pytest_django-4.4.0-py3-none-any.whl", hash = "sha256:65783e78382456528bd9d79a35843adde9e6a47347b20464eb2c885cb0f1f606"},
-]
-pytest-django-testing-postgresql = [
-    {file = "pytest-django-testing-postgresql-0.1.post0.tar.gz", hash = "sha256:78b0c58930084cb4393407b2e5a2a3b8734c627b841ecef7d62d39bbfb8e8a45"},
-    {file = "pytest_django_testing_postgresql-0.1.post0-py3-none-any.whl", hash = "sha256:78e52e3d1b0ef5f906d5d69247dd6ac7dfb10d840bd81abab92f3f8c30872cd3"},
-]
-pytest-sugar = [
-    {file = "pytest-sugar-0.9.4.tar.gz", hash = "sha256:b1b2186b0a72aada6859bea2a5764145e3aaa2c1cfbb23c3a19b5f7b697563d3"},
-]
-python-crontab = [
-    {file = "python-crontab-2.6.0.tar.gz", hash = "sha256:1e35ed7a3cdc3100545b43e196d34754e6551e7f95e4caebbe0e1c0ca41c2f1b"},
-]
-python-dateutil = [
-    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
-    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
-]
-python-gnupg = [
-    {file = "python-gnupg-0.4.8.tar.gz", hash = "sha256:b64de1ae5cedf872b437201a566fa2c62ce0c95ea2e30177eb53aee1258507d7"},
-    {file = "python_gnupg-0.4.8-py2.py3-none-any.whl", hash = "sha256:93a521501d6c2785d96b190aec7125ba89c1c2fe708b0c98af3fb32b59026ab8"},
-]
-python3-openid = [
-    {file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"},
-    {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"},
-]
-pytz = [
-    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
-    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
-]
-pyyaml = [
-    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
-    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
-    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
-    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
-    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
-    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
-    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
-    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
-    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
-    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
-    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
-    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
-    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
-    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
-    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
-    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
-    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
-    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
-]
-qrcode = [
-    {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"},
-    {file = "qrcode-6.1.tar.gz", hash = "sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"},
-]
-redis = [
-    {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"},
-    {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"},
-]
-regex = [
-    {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"},
-    {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"},
-    {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"},
-    {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"},
-    {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"},
-    {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"},
-    {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"},
-    {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"},
-    {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"},
-    {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"},
-    {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"},
-    {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"},
-    {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"},
-    {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"},
-    {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"},
-    {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"},
-    {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"},
-    {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"},
-    {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"},
-    {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"},
-    {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"},
-    {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"},
-    {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"},
-    {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"},
-]
-requests = [
-    {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
-    {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
-]
-requests-oauthlib = [
-    {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"},
-    {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"},
-]
-restructuredtext-lint = [
-    {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
-]
-"ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.17-py3-none-any.whl", hash = "sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f"},
-    {file = "ruamel.yaml-0.17.17.tar.gz", hash = "sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be"},
-]
-"ruamel.yaml.clib" = [
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"},
-    {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"},
-]
-rules = [
-    {file = "rules-2.2.tar.gz", hash = "sha256:9bae429f9d4f91a375402990da1541f9e093b0ac077221d57124d06eeeca4405"},
-]
-safety = [
-    {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"},
-    {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"},
-]
-scramp = [
-    {file = "scramp-1.4.1-py3-none-any.whl", hash = "sha256:93c9cc2ffe54a451e02981c07a5a23cbd830701102789939cfb4ff91efd6ca8c"},
-    {file = "scramp-1.4.1.tar.gz", hash = "sha256:f964801077be9be2a1416ffe255d2d78834b3d9d5c8ce5d28f76a856f209f70e"},
-]
-selenium = [
-    {file = "selenium-4.1.0-py3-none-any.whl", hash = "sha256:27e7b64df961d609f3d57237caa0df123abbbe22d038f2ec9e332fb90ec1a939"},
-]
-sentry-sdk = [
-    {file = "sentry-sdk-1.5.0.tar.gz", hash = "sha256:789a11a87ca02491896e121efdd64e8fd93327b69e8f2f7d42f03e2569648e88"},
-    {file = "sentry_sdk-1.5.0-py2.py3-none-any.whl", hash = "sha256:0db297ab32e095705c20f742c3a5dac62fe15c4318681884053d0898e5abb2f6"},
-]
-six = [
-    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
-    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-smmap = [
-    {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
-    {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
-]
-sniffio = [
-    {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"},
-    {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"},
-]
-snowballstemmer = [
-    {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
-    {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
-]
-sortedcontainers = [
-    {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"},
-    {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
-]
-soupsieve = [
-    {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"},
-    {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"},
-]
-spdx-license-list = [
-    {file = "spdx_license_list-0.5.2-py3-none-any.whl", hash = "sha256:1b338470c7b403dbecceca563a316382c7977516128ca6c1e8f7078e3ed6e7b0"},
-    {file = "spdx_license_list-0.5.2.tar.gz", hash = "sha256:952996f72ab807972dc2278bb9b91e5294767211e51f09aad9c0e2ff5b82a31b"},
-]
-sphinx = [
-    {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"},
-    {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"},
-]
-sphinx-autodoc-typehints = [
-    {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"},
-    {file = "sphinx_autodoc_typehints-1.12.0-py3-none-any.whl", hash = "sha256:5e81776ec422dd168d688ab60f034fccfafbcd94329e9537712c93003bddc04a"},
-]
-sphinx-materialdesign-theme = [
-    {file = "sphinx_materialdesign_theme-0.1.11.tar.gz", hash = "sha256:6e9dae4c6e5ba23c0657a94c1cf65f64be9c8bc1594a6fb41815f7daa3326aa9"},
-]
-sphinxcontrib-applehelp = [
-    {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
-    {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"},
-]
-sphinxcontrib-devhelp = [
-    {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
-    {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
-]
-sphinxcontrib-django = [
-    {file = "sphinxcontrib-django-0.5.1.tar.gz", hash = "sha256:3b48a9067d8db4713d47e3a4160af10288d02d448c866d1b44b001adbe74cc1e"},
-    {file = "sphinxcontrib_django-0.5.1-py2.py3-none-any.whl", hash = "sha256:73ef7fdbf2ed6d4f35b7ae709032bd5ac493d93cedd0624ea7b51bf5fce41267"},
-]
-sphinxcontrib-htmlhelp = [
-    {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"},
-    {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"},
-]
-sphinxcontrib-jsmath = [
-    {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
-    {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
-]
-sphinxcontrib-qthelp = [
-    {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"},
-    {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
-]
-sphinxcontrib-serializinghtml = [
-    {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
-    {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
-]
-sqlparse = [
-    {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"},
-    {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
-]
-stevedore = [
-    {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"},
-    {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"},
-]
-termcolor = [
-    {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
-]
-testfixtures = [
-    {file = "testfixtures-6.18.3-py2.py3-none-any.whl", hash = "sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"},
-    {file = "testfixtures-6.18.3.tar.gz", hash = "sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d"},
-]
-"testing.common.database" = [
-    {file = "testing.common.database-2.0.3-py2.py3-none-any.whl", hash = "sha256:e3ed492bf480a87f271f74c53b262caf5d85c8bc09989a8f534fa2283ec52492"},
-    {file = "testing.common.database-2.0.3.tar.gz", hash = "sha256:965d80b2985315325dc358c3061b174a712f4d4d5bf6a80b58b11f9a1dd86d73"},
-]
-"testing.postgresql" = [
-    {file = "testing.postgresql-1.3.0-py2.py3-none-any.whl", hash = "sha256:1b41daeb98dfc8cd4a584bb91e8f5f4ab182993870f95257afe5f1ba6151a598"},
-    {file = "testing.postgresql-1.3.0.tar.gz", hash = "sha256:8e1a69760369a7a8ffe63a66b6d95a5cd82db2fb976e4a8f85ffd24fbfc447d8"},
-]
-toml = [
-    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
-    {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
-tomli = [
-    {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
-    {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
-]
-traitlets = [
-    {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"},
-    {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"},
-]
-trio = [
-    {file = "trio-0.19.0-py3-none-any.whl", hash = "sha256:c27c231e66336183c484fbfe080fa6cc954149366c15dc21db8b7290081ec7b8"},
-    {file = "trio-0.19.0.tar.gz", hash = "sha256:895e318e5ec5e8cea9f60b473b6edb95b215e82d99556a03eb2d20c5e027efe1"},
-]
-trio-websocket = [
-    {file = "trio-websocket-0.9.2.tar.gz", hash = "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe"},
-    {file = "trio_websocket-0.9.2-py3-none-any.whl", hash = "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc"},
-]
-twilio = [
-    {file = "twilio-7.3.1-py2.py3-none-any.whl", hash = "sha256:fc3f5c34abd7b7cda9f4802909d01e65bf296a3b237fea4cd17e969cc838645a"},
-    {file = "twilio-7.3.1.tar.gz", hash = "sha256:b61a1209136e7e3d0b9e50653a821ef6a81b87f3b7c513144e5f0d955dca5bba"},
-]
-types-pytz = [
-    {file = "types-pytz-2021.3.1.tar.gz", hash = "sha256:dffd77f3efecd3b1555f187a9bf3a638d55fac296700b829c41bd51ec72a6eb7"},
-    {file = "types_pytz-2021.3.1-py3-none-any.whl", hash = "sha256:d58a0688094b768d8e21c044e45861cbcaecba0494fd5b9c5feb3e1739211606"},
-]
-types-pyyaml = [
-    {file = "types-PyYAML-6.0.1.tar.gz", hash = "sha256:2e27b0118ca4248a646101c5c318dc02e4ca2866d6bc42e84045dbb851555a76"},
-    {file = "types_PyYAML-6.0.1-py3-none-any.whl", hash = "sha256:d5b318269652e809b5c30a5fe666c50159ab80bfd41cd6bafe655bf20b29fcba"},
-]
-typing-extensions = [
-    {file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"},
-    {file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"},
-]
-urllib3 = [
-    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
-    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
-]
-vine = [
-    {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"},
-    {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"},
-]
-wcwidth = [
-    {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
-    {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
-]
-webencodings = [
-    {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
-    {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
-]
-whoosh = [
-    {file = "Whoosh-2.7.4-py2.py3-none-any.whl", hash = "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852"},
-    {file = "Whoosh-2.7.4.tar.gz", hash = "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83"},
-    {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"},
-]
-wrapt = [
-    {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"},
-    {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"},
-    {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"},
-    {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"},
-    {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"},
-    {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"},
-    {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"},
-    {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"},
-    {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"},
-    {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"},
-    {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"},
-    {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"},
-    {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"},
-    {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"},
-    {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"},
-    {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"},
-    {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"},
-    {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"},
-    {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"},
-    {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"},
-    {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"},
-    {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"},
-    {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"},
-    {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"},
-    {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"},
-    {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"},
-    {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"},
-    {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"},
-    {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"},
-    {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"},
-    {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"},
-    {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"},
-    {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"},
-    {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"},
-    {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"},
-    {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"},
-    {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"},
-    {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"},
-    {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"},
-    {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"},
-    {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"},
-    {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"},
-    {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"},
-    {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"},
-    {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"},
-    {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"},
-    {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"},
-    {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"},
-    {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"},
-    {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"},
-    {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"},
-]
-wsproto = [
-    {file = "wsproto-1.0.0-py3-none-any.whl", hash = "sha256:d8345d1808dd599b5ffb352c25a367adb6157e664e140dbecba3f9bc007edb9f"},
-    {file = "wsproto-1.0.0.tar.gz", hash = "sha256:868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38"},
-]
-yubiotp = [
-    {file = "YubiOTP-1.0.0.post1-py2.py3-none-any.whl", hash = "sha256:7ad57011866e0bc6c6d179ffbc3926fcc0e82d410178a6d01ba4da0f88332878"},
-    {file = "YubiOTP-1.0.0.post1.tar.gz", hash = "sha256:c13825f7b76a69afb92f19521f4dea9f5031d70f45123b505dc2e0ac03132065"},
-]
diff --git a/pyproject.toml b/pyproject.toml
index 5097ddfb9fec6263979c7824cf43e05f8c7d570f..72db250b5bebaf41fcd9bd8e8a58f8174f4b5bb8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,11 +8,10 @@ readme = "README.rst"
 include = ["CHANGELOG.rst", "LICENCE.rst", "aleksis/**/*.mo"]
 
 description = "AlekSIS (School Information System) — App Paweljong (Camp/Event management)"
-authors = ["Dominik George <dominik.george@teckids.org>"]
+authors = ["Tom Teichler <tom.teichler@teckids.org>", "Dominik George <dominik.george@teckids.org>"]
 license = "EUPL-1.2-or-later"
-homepage = "https://aleksis.org"
-repository = "https://edugit.org/Teckids/hacknfun//AlekSIS-App-Paweljong"
-documentation = "https://aleksis.org/official/AlekSIS/docs/html/"
+homepage = "https://hacknfun.camp"
+repository = "https://edugit.org/Teckids/hacknfun/AlekSIS-App-Paweljong"
 classifiers = [
     "Environment :: Web Environment",
     "Intended Audience :: Education",
@@ -26,8 +25,11 @@ secondary = true
 
 [tool.poetry.dependencies]
 python = "^3.9"
-aleksis-core = "^2.2"
+aleksis-core = "^2.7"
 django-iban-field = "^0.8"
+django-formtools = "^2.3"
+django-starfield = "^1.0"
+aleksis-app-postbuero = "1.0+20220218233830.a212f707"
 
 [tool.poetry.dev-dependencies]
 aleksis-builddeps = "*"
diff --git a/tox.ini b/tox.ini
index f09d243fd2ddcd42c0eae1a6c298c08eb9557a13..6ba5d926ea520a574125f4a9717b93ba0020a2c3 100644
--- a/tox.ini
+++ b/tox.ini
@@ -35,6 +35,7 @@ commands =
 
 [testenv:build]
 commands_pre =
+    poetry install
     poetry run sh -c "cd aleksis; aleksis-admin compilemessages"
 commands = poetry build
 
@@ -46,6 +47,11 @@ commands =
     poetry run isort aleksis/
     poetry run black aleksis/
 
+[testenv:makemessages]
+commands =
+    poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
+    poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
+
 [flake8]
 max_line_length = 100
 exclude = migrations,tests