We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
ZVA-SEK has been added. Thanks, great job. But there is a problem.
First of all: Thanks to 5ila5 for doing the job. Thats awesome.

But all entries are one day ahead.
I created the entries using the "static" configuration, and compared to the import there is one day "shift".
Maybe because there is an alarm in the ICS-file?
Or am i doing something wrong?

![image](https://user-images.githubusercontent.com/115486571/226136239-f3b9384a-4ea7-4dba-8cc4-d01e0585cf56.png)

Greetings, Holger.

PS.: @5ila5: whenever you are in the area of Kassel, send me a note, and i will show you the finest brewery in the area (beers on me).

  sources:
    - name: static
      calendar_title: Papier
      args:
        type: Altpapier
        frequency: WEEKLY
        interval: 4
        start: '2023-01-16'
        until: '2023-12-18'
        excludes:
          - '2023-04-10'
        dates:
          - '2023-04-15'
          - '2023-03-01'
    - name: static
      calendar_title: Bio
      args:
        type: Biomuell
        frequency: WEEKLY
        interval: 2
        start: '2023-01-06'
        until: '2023-12-22'
        excludes:
          - '2023-09-29'
        dates:
          - '2023-09-23'
    - name: static
      calendar_title: Rest
      args:
        type: Restmuell
        frequency: WEEKLY
        interval: 3
        start: '2023-01-17'
        until: '2023-12-19'
        excludes:
          - '2023-09-29'
        dates:
          - '2023-09-23'
    - name: static
      calendar_title: Gelb
      args:
        type: Gelbe
        frequency: WEEKLY
        interval: 4
        start: '2023-01-18'
        until: '2023-12-20'
    - name: zva_sek_de
      calendar_title: "ZVA"
      args:
        bezirk: "Felsberg"
        ortsteil: "Felsberg"


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py`
Content:
```
1 import re
2 import requests
3 from datetime import datetime
4 
5 from bs4 import BeautifulSoup
6 
7 from waste_collection_schedule import Collection  # type: ignore[attr-defined]
8 from waste_collection_schedule.service.ICS import ICS
9 
10 TITLE = "Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis"
11 DESCRIPTION = "Source for ZVA (Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis)."
12 URL = "https://www.zva-sek.de"
13 TEST_CASES = {
14     "Fritzlar": {
15         "bezirk": "Fritzlar",
16         "ortsteil": "Fritzlar-kernstadt",
17         "strasse": "Ahornweg",
18     },
19     "Ottrau": {
20         "bezirk": "Ottrau",
21         "ortsteil": "immichenhain",
22         "strasse": "",
23     },
24     "Knüllwald": {
25         "bezirk": "Knüllwald",
26         "ortsteil": "Hergetsfeld",
27     },
28 }
29 SERVLET = (
30     "https://www.zva-sek.de/module/abfallkalender/generate_ical.php"
31 )
32 MAIN_URL = "https://www.zva-sek.de/online-dienste/abfallkalender-{year}/{file}"
33 API_URL = "https://www.zva-sek.de/module/abfallkalender/{file}"
34 
35 
36 class Source:
37     def __init__(
38         self, bezirk: str, ortsteil: str, strasse: str = None
39     ):
40         self._bezirk = bezirk
41         self._ortsteil = ortsteil
42         self._street = strasse if strasse != "" else None
43         self._ics = ICS()
44 
45     def fetch(self):
46         session = requests.session()
47         year = datetime.now().year
48 
49         bezirk_id = None
50         ortsteil_id = None
51 
52         # get bezirke id
53         r = session.get(MAIN_URL.format(
54             year=year, file=f"abfallkalender-{year}.html"))
55         if (r.status_code == 404):  # try last year URL if this year is not available
56             r = session.get(MAIN_URL.format(
57                 year=year, file=f"abfallkalender-{year-1}.html"))
58         r.raise_for_status()
59         
60         soup = BeautifulSoup(r.text, features="html.parser")
61         for option in soup.find("select", {"name": "ak_bezirk"}).find_all("option"):
62             if option.text.lower() == self._bezirk.lower():
63                 self._bezirk = option.get("value")
64                 bezirk_id = option.get("value")
65                 break
66 
67         if not bezirk_id:
68             raise Exception(f"bezirk not found")
69 
70         # get ortsteil id
71         r = session.get(API_URL.format(
72             file="get_ortsteile.php"), params={"bez_id": bezirk_id})
73         r.raise_for_status()
74         last_orts_id = None
75         for part in r.text.split(";")[2:-1]:
76             # part is "f.ak_ortsteil.options[5].text = 'Alte Kasseler Straße'" or "ak_ortsteil.options[6].value = '2'"
77             if ("length" in part):
78                 continue
79             if part.split(" = ")[1][1:-1].lower() == self._ortsteil.lower():
80                 ortsteil_id = last_orts_id
81                 break
82             last_orts_id = part.split(" = ")[1][1:-1]
83 
84         if not ortsteil_id:
85             raise Exception(f"ortsteil not found")
86 
87         street_id = None
88 
89         # get street id if steet given
90         if self._street is not None:
91             r = session.get(API_URL.format(
92                 file="get_strassen.php"), params={"ot_id": ortsteil_id.split("-")[0]})
93             r.raise_for_status()
94             last_street_id = None
95             for part in r.text.split(";")[2:-1]: 
96                 # part is "f.ak_strasse.options[5].text = 'Alte Kasseler Straße'" or "ak_strasse.options[6].value = '2'"
97                 if ("length" in part):
98                     continue
99                 if part.split(" = ")[1][1:-1].lower() == self._street.lower():
100                     street_id = last_street_id
101                     break
102                 last_street_id = part.split(" = ")[1][1:-1]
103 
104             if not street_id:
105                 raise Exception(f"street not found")
106 
107         args = {
108             "year": str(year),
109             "ak_bezirk": bezirk_id,
110             "ak_ortsteil": ortsteil_id,
111             "alle_arten": "",
112         }
113         if self._street is not None:
114             args["ak_strasse"] = street_id
115 
116         r = session.post(
117             SERVLET,
118             data=args,
119         )
120 
121         r.raise_for_status()
122         dates = self._ics.convert(r.text)
123 
124         entries = []
125         for d in dates:
126             entries.append(Collection(d[0], re.sub(
127                 "[ ]*am [0-9]+.[0-9]+.[0-9]+[ ]*", "", d[1])))
128         return entries
129
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py
--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py
+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py
@@ -109,6 +109,8 @@
             "ak_bezirk": bezirk_id,
             "ak_ortsteil": ortsteil_id,
             "alle_arten": "",
+            "iCalEnde": 6,
+            "iCalBeginn": 17,
         }
         if self._street is not None:
             args["ak_strasse"] = street_id

{"golden_diff": "diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py\n--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py\n+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py\n@@ -109,6 +109,8 @@\n             \"ak_bezirk\": bezirk_id,\n             \"ak_ortsteil\": ortsteil_id,\n             \"alle_arten\": \"\",\n+            \"iCalEnde\": 6,\n+            \"iCalBeginn\": 17,\n         }\n         if self._street is not None:\n             args[\"ak_strasse\"] = street_id\n", "issue": "ZVA-SEK has been added. Thanks, great job. But there is a problem.\nFirst of all: Thanks to 5ila5 for doing the job. Thats awesome.\r\n\r\nBut all entries are one day ahead.\r\nI created the entries using the \"static\" configuration, and compared to the import there is one day \"shift\".\r\nMaybe because there is an alarm in the ICS-file?\r\nOr am i doing something wrong?\r\n\r\n![image](https://user-images.githubusercontent.com/115486571/226136239-f3b9384a-4ea7-4dba-8cc4-d01e0585cf56.png)\r\n\r\nGreetings, Holger.\r\n\r\nPS.: @5ila5: whenever you are in the area of Kassel, send me a note, and i will show you the finest brewery in the area (beers on me).\r\n\r\n  sources:\r\n    - name: static\r\n      calendar_title: Papier\r\n      args:\r\n        type: Altpapier\r\n        frequency: WEEKLY\r\n        interval: 4\r\n        start: '2023-01-16'\r\n        until: '2023-12-18'\r\n        excludes:\r\n          - '2023-04-10'\r\n        dates:\r\n          - '2023-04-15'\r\n          - '2023-03-01'\r\n    - name: static\r\n      calendar_title: Bio\r\n      args:\r\n        type: Biomuell\r\n        frequency: WEEKLY\r\n        interval: 2\r\n        start: '2023-01-06'\r\n        until: '2023-12-22'\r\n        excludes:\r\n          - '2023-09-29'\r\n        dates:\r\n          - '2023-09-23'\r\n    - name: static\r\n      calendar_title: Rest\r\n      args:\r\n        type: Restmuell\r\n        frequency: WEEKLY\r\n        interval: 3\r\n        start: '2023-01-17'\r\n        until: '2023-12-19'\r\n        excludes:\r\n          - '2023-09-29'\r\n        dates:\r\n          - '2023-09-23'\r\n    - name: static\r\n      calendar_title: Gelb\r\n      args:\r\n        type: Gelbe\r\n        frequency: WEEKLY\r\n        interval: 4\r\n        start: '2023-01-18'\r\n        until: '2023-12-20'\r\n    - name: zva_sek_de\r\n      calendar_title: \"ZVA\"\r\n      args:\r\n        bezirk: \"Felsberg\"\r\n        ortsteil: \"Felsberg\"\r\n\n", "before_files": [{"content": "import re\nimport requests\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\n\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\n\nTITLE = \"Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis\"\nDESCRIPTION = \"Source for ZVA (Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis).\"\nURL = \"https://www.zva-sek.de\"\nTEST_CASES = {\n    \"Fritzlar\": {\n        \"bezirk\": \"Fritzlar\",\n        \"ortsteil\": \"Fritzlar-kernstadt\",\n        \"strasse\": \"Ahornweg\",\n    },\n    \"Ottrau\": {\n        \"bezirk\": \"Ottrau\",\n        \"ortsteil\": \"immichenhain\",\n        \"strasse\": \"\",\n    },\n    \"Kn\u00fcllwald\": {\n        \"bezirk\": \"Kn\u00fcllwald\",\n        \"ortsteil\": \"Hergetsfeld\",\n    },\n}\nSERVLET = (\n    \"https://www.zva-sek.de/module/abfallkalender/generate_ical.php\"\n)\nMAIN_URL = \"https://www.zva-sek.de/online-dienste/abfallkalender-{year}/{file}\"\nAPI_URL = \"https://www.zva-sek.de/module/abfallkalender/{file}\"\n\n\nclass Source:\n    def __init__(\n        self, bezirk: str, ortsteil: str, strasse: str = None\n    ):\n        self._bezirk = bezirk\n        self._ortsteil = ortsteil\n        self._street = strasse if strasse != \"\" else None\n        self._ics = ICS()\n\n    def fetch(self):\n        session = requests.session()\n        year = datetime.now().year\n\n        bezirk_id = None\n        ortsteil_id = None\n\n        # get bezirke id\n        r = session.get(MAIN_URL.format(\n            year=year, file=f\"abfallkalender-{year}.html\"))\n        if (r.status_code == 404):  # try last year URL if this year is not available\n            r = session.get(MAIN_URL.format(\n                year=year, file=f\"abfallkalender-{year-1}.html\"))\n        r.raise_for_status()\n        \n        soup = BeautifulSoup(r.text, features=\"html.parser\")\n        for option in soup.find(\"select\", {\"name\": \"ak_bezirk\"}).find_all(\"option\"):\n            if option.text.lower() == self._bezirk.lower():\n                self._bezirk = option.get(\"value\")\n                bezirk_id = option.get(\"value\")\n                break\n\n        if not bezirk_id:\n            raise Exception(f\"bezirk not found\")\n\n        # get ortsteil id\n        r = session.get(API_URL.format(\n            file=\"get_ortsteile.php\"), params={\"bez_id\": bezirk_id})\n        r.raise_for_status()\n        last_orts_id = None\n        for part in r.text.split(\";\")[2:-1]:\n            # part is \"f.ak_ortsteil.options[5].text = 'Alte Kasseler Stra\u00dfe'\" or \"ak_ortsteil.options[6].value = '2'\"\n            if (\"length\" in part):\n                continue\n            if part.split(\" = \")[1][1:-1].lower() == self._ortsteil.lower():\n                ortsteil_id = last_orts_id\n                break\n            last_orts_id = part.split(\" = \")[1][1:-1]\n\n        if not ortsteil_id:\n            raise Exception(f\"ortsteil not found\")\n\n        street_id = None\n\n        # get street id if steet given\n        if self._street is not None:\n            r = session.get(API_URL.format(\n                file=\"get_strassen.php\"), params={\"ot_id\": ortsteil_id.split(\"-\")[0]})\n            r.raise_for_status()\n            last_street_id = None\n            for part in r.text.split(\";\")[2:-1]: \n                # part is \"f.ak_strasse.options[5].text = 'Alte Kasseler Stra\u00dfe'\" or \"ak_strasse.options[6].value = '2'\"\n                if (\"length\" in part):\n                    continue\n                if part.split(\" = \")[1][1:-1].lower() == self._street.lower():\n                    street_id = last_street_id\n                    break\n                last_street_id = part.split(\" = \")[1][1:-1]\n\n            if not street_id:\n                raise Exception(f\"street not found\")\n\n        args = {\n            \"year\": str(year),\n            \"ak_bezirk\": bezirk_id,\n            \"ak_ortsteil\": ortsteil_id,\n            \"alle_arten\": \"\",\n        }\n        if self._street is not None:\n            args[\"ak_strasse\"] = street_id\n\n        r = session.post(\n            SERVLET,\n            data=args,\n        )\n\n        r.raise_for_status()\n        dates = self._ics.convert(r.text)\n\n        entries = []\n        for d in dates:\n            entries.append(Collection(d[0], re.sub(\n                \"[ ]*am [0-9]+.[0-9]+.[0-9]+[ ]*\", \"\", d[1])))\n        return entries\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py"}], "after_files": [{"content": "import re\nimport requests\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\n\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\n\nTITLE = \"Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis\"\nDESCRIPTION = \"Source for ZVA (Zweckverband Abfallwirtschaft Schwalm-Eder-Kreis).\"\nURL = \"https://www.zva-sek.de\"\nTEST_CASES = {\n    \"Fritzlar\": {\n        \"bezirk\": \"Fritzlar\",\n        \"ortsteil\": \"Fritzlar-kernstadt\",\n        \"strasse\": \"Ahornweg\",\n    },\n    \"Ottrau\": {\n        \"bezirk\": \"Ottrau\",\n        \"ortsteil\": \"immichenhain\",\n        \"strasse\": \"\",\n    },\n    \"Kn\u00fcllwald\": {\n        \"bezirk\": \"Kn\u00fcllwald\",\n        \"ortsteil\": \"Hergetsfeld\",\n    },\n}\nSERVLET = (\n    \"https://www.zva-sek.de/module/abfallkalender/generate_ical.php\"\n)\nMAIN_URL = \"https://www.zva-sek.de/online-dienste/abfallkalender-{year}/{file}\"\nAPI_URL = \"https://www.zva-sek.de/module/abfallkalender/{file}\"\n\n\nclass Source:\n    def __init__(\n        self, bezirk: str, ortsteil: str, strasse: str = None\n    ):\n        self._bezirk = bezirk\n        self._ortsteil = ortsteil\n        self._street = strasse if strasse != \"\" else None\n        self._ics = ICS()\n\n    def fetch(self):\n        session = requests.session()\n        year = datetime.now().year\n\n        bezirk_id = None\n        ortsteil_id = None\n\n        # get bezirke id\n        r = session.get(MAIN_URL.format(\n            year=year, file=f\"abfallkalender-{year}.html\"))\n        if (r.status_code == 404):  # try last year URL if this year is not available\n            r = session.get(MAIN_URL.format(\n                year=year, file=f\"abfallkalender-{year-1}.html\"))\n        r.raise_for_status()\n        \n        soup = BeautifulSoup(r.text, features=\"html.parser\")\n        for option in soup.find(\"select\", {\"name\": \"ak_bezirk\"}).find_all(\"option\"):\n            if option.text.lower() == self._bezirk.lower():\n                self._bezirk = option.get(\"value\")\n                bezirk_id = option.get(\"value\")\n                break\n\n        if not bezirk_id:\n            raise Exception(f\"bezirk not found\")\n\n        # get ortsteil id\n        r = session.get(API_URL.format(\n            file=\"get_ortsteile.php\"), params={\"bez_id\": bezirk_id})\n        r.raise_for_status()\n        last_orts_id = None\n        for part in r.text.split(\";\")[2:-1]:\n            # part is \"f.ak_ortsteil.options[5].text = 'Alte Kasseler Stra\u00dfe'\" or \"ak_ortsteil.options[6].value = '2'\"\n            if (\"length\" in part):\n                continue\n            if part.split(\" = \")[1][1:-1].lower() == self._ortsteil.lower():\n                ortsteil_id = last_orts_id\n                break\n            last_orts_id = part.split(\" = \")[1][1:-1]\n\n        if not ortsteil_id:\n            raise Exception(f\"ortsteil not found\")\n\n        street_id = None\n\n        # get street id if steet given\n        if self._street is not None:\n            r = session.get(API_URL.format(\n                file=\"get_strassen.php\"), params={\"ot_id\": ortsteil_id.split(\"-\")[0]})\n            r.raise_for_status()\n            last_street_id = None\n            for part in r.text.split(\";\")[2:-1]: \n                # part is \"f.ak_strasse.options[5].text = 'Alte Kasseler Stra\u00dfe'\" or \"ak_strasse.options[6].value = '2'\"\n                if (\"length\" in part):\n                    continue\n                if part.split(\" = \")[1][1:-1].lower() == self._street.lower():\n                    street_id = last_street_id\n                    break\n                last_street_id = part.split(\" = \")[1][1:-1]\n\n            if not street_id:\n                raise Exception(f\"street not found\")\n\n        args = {\n            \"year\": str(year),\n            \"ak_bezirk\": bezirk_id,\n            \"ak_ortsteil\": ortsteil_id,\n            \"alle_arten\": \"\",\n            \"iCalEnde\": 6,\n            \"iCalBeginn\": 17,\n        }\n        if self._street is not None:\n            args[\"ak_strasse\"] = street_id\n\n        r = session.post(\n            SERVLET,\n            data=args,\n        )\n\n        r.raise_for_status()\n        dates = self._ics.convert(r.text)\n\n        entries = []\n        for d in dates:\n            entries.append(Collection(d[0], re.sub(\n                \"[ ]*am [0-9]+.[0-9]+.[0-9]+[ ]*\", \"\", d[1])))\n        return entries\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/zva_sek_de.py"}]}