Das Problem ist, dass es da nichts gibt, was man freigeben könnte.
[ddci2] Patch um CAMs dynamisch mit jedem Device verwenden zu können
-
-
-
"Multiple Channel Support" und "Multiple Transponder Decoding" ist aber zwei paar Stiefel!
-
Hi!
Ich war ja lange weg vom VDR und auch fast 2 Monate auf den Philippinen auf Urlaub.
Ich hatte im Urlaub Kontakt zu 3PO und Klaus bez. SatIP und ddci2 Plugin, konnte aber nichts machen, da zu schlechtes iNet.Ich hab dann nach meiner Rückkehr meinen VDR auf die neue yaVDR 0.6.0 Distribution aufgerüstet, damit ich am ddci2 Plugin weiter basteln kann.
Vor ein paar Tagen hat mich ein User wg. dem CI Plugin angesprochen und seit damals werkle ich an dem Ding wieder.
Ich habe von diesem Thread nichts gewusst, weil ich nicht so viel im Forum bin.Na wie auch immer, ich habe unabhängig von diesem Patch eine fast identische Lösung gebaut. Die macht nur jetzt alles richtig im Assign und loggt auch was da passiert (Debug Logging).
Ihr findet die Version 0.0.14 im git.
Mir gefällt der Ansatz auch insofern nicht so ganz, weil da für jedes Device ein (virtueller) cCiCamSlot angelegt wird. Das hat zur Folge, daß z.B. im Setup/CAM-Menü alle diese CAMs separat auftauchen, und VDR bei der Suche nach einem geeigneten CAM um einen Kanal zu entschlüsseln diese alle durchprobiert, obwohl es letztlich immer die gleiche Smartcard ist und ein Versuch reichen würde.
Das ging anno dazumal, als ich das Plugin geschrieben habe, nicht anders, ob der internen Struktur im VDR und seit damals schläft die Sache. Ist erst mit VDR 2.1.7 ermöglicht worden (da hab ich einen Patch an Klaus gesendet), hatte aber dann keine Zeit und auch keinen 2ten VDR, um mich damit zu beschäftigt
Mir schwebt da eher sowas vor:
- für jedes physikalische Interface gibt es einen cCiAdapter
- für jedes physikalische CAM gibt es einen cCiCamSlot
- wenn ein cCiCamSlot MTD kann, dann legt er zur Laufzeit in cCiCamSlot::Assign() einen virtuellen cCiCamSlot an, der die eigentliche Arbeit übernimmt
- im Setup/CAM-Menü erscheinen nur die physikalischen CAMs (bzw. cCiCamSlots)Das klingt sehr gut und sollte sich auch nur im Plugin so bauen lassen. Bin nur nicht sicher, ob die VDR Basisklassen das so zulassen. Das sieht man aber erst bei der Implementierung, ob man da was im VDR ändern muss.
Ich kann mir eigentlich nicht vorstellen, daß es dazu Änderungen auf Treiberseite bedarf, denn der Datenfluß zu und vom CAM funktioniert ja bereits.
Nein, im Treiber muss man nichts machen. Da gehört es auch nicht hin, weil das dem Konzept "Treiber macht nur LowLevel/Userspace macht Logik" zuwieder laufen würde. Man könnte aber eine Library machen, die dann von anderen Programmen und ddci2 verwendet werden kann. Das aber ist viel Aufwand und der VDR selbst macht schon sehr viel, was in so einer Library sein würde.
LG,
Jasmin -
Das klingt sehr gut und sollte sich auch nur im Plugin so bauen lassen. Bin nur nicht sicher, ob die VDR Basisklassen das so zulassen. Das sieht man aber erst bei der Implementierung, ob man da was im VDR ändern muss.
Update: Klaus ist dabei das MTD nun doch in den VDR einzubauen. Das Plugin macht dann nur die Anbindung an die DD Hardware über die Kernel Schnittstelle. Er sagte es wären zu viele Änderungen im VDR notwendig gewesen und dann hat er es lieber gleich dort eingebaut.
Er hat auch einen Bug im ddci2 Plugin gefunden, der sich nur bei MTD auswirkt.
Die neue Version 0.0.15 findet ihr im git. -
Kurze Zwischenfrage, lässt sich das Plugin auch für eine OctopusNet S2 MAX nutzen? Das darin verbaute CI dürfte ja das Gleiche sein, wie das externe PCIe Modell...
-
-
sicher, so wie es jetzt implementiert ist das Plugin für den VDR.
Ihr legt aber immer einen so großen Wert darauf, dass das CI ein eigenes Stück HW ist und man sich von dem Gedanken lösen muss das es einer DVB Karte fix zuzuordnen ist. Ok, das der MTD Support nicht in den Treiber gehört wurde ja hinreichend diskutiert, aber wäre es hier nicht konsequent das Ganze trotzdem separat, bspw in einem Daemon mit einer API hinzustellen damit auch andere Programme, zB vdr, minisatip, konkurrierend zugreifen können.
Oder verkompliziert dies das Unterfangen zu sehr?
Christian
-
Es geht ja nicht nur darum, dass das CI mit den DVB-Daten gefüttert werden muss, es muss ja nebenbei auch noch ein paar Steuerbefehle bekommen. Deshalb kann es nicht so ohne weiteres extern betrieben werden.
Und wenn, dann müsste man wieder ein neues vdr-Plugin schreiben, welches dann den "ddcidaemon" benutzt. Da hat man also nichts gewonnen. Es muss halt ein "DVB-Master-Programm" geben, welches die DVB-Daten fertig für die nutzenden Programme abliefert. Und das kann der vdr genauso gut erledigen.
Lars.
-
Ich habe es, um den Aufwand minimal zu halten und möglichst wenig Code zu duplizieren, jetzt einfach mal an strategischen Stellen im VDR eingebaut. Das ddci2-Plugin braucht nur einige wenige zusätzliche Aufrufe zu machen, um MTD zu nutzen. Es wäre auf diese Weise auch leicht möglich, Plugins für andere CI-Adapter zu schreiben, die MTD können, denn um die eigentlichen Probleme kümmert sich VDR.
Freilich steht es jedem frei, alles was für MTD notwendig ist aus dem VDR-Code zu nehmen und eine entsprechende Lib zu schreiben. Die Hauptarbeit war ja erstmal herauszufinden, an welchen Stellen die PIDs, SIDs und CATs angepasst werden müssen, damit das funktioniert, und die Datenströme geeignet zusammen- und wieder auseinanderzuführen. Dieses Wissen steht dann allgemein zur Verfügung und kann beliebig weitergenutzt werden (the beauty of open source ;-).Konkret: das Entschlüsseln von mehreren Kanälen von unterschiedlichen Transpondern habe ich bereits hinbekommen. Momentan arbeite ich noch daran, den Gesamtablauf sauber hinzubekommen (zur Zeit läuft es noch unter recht "kontrollierten Bedingungen" ;-). Sobald alles stabil läuft gibt's die Version 2.3.3 ;-).
Klaus
-
Ihr legt aber immer einen so großen Wert darauf, dass das CI ein eigenes Stück HW ist und man sich von dem Gedanken lösen muss das es einer DVB Karte fix zuzuordnen ist.
Mit Verlaub, das ist wirklich genial und man kann damit auch Tuner von anderen Herstellern benutzen (weiter verwenden) und dennoch verschlüsselte Programme schauen.
... aber wäre es hier nicht konsequent das Ganze trotzdem separat, bspw in einem Daemon mit einer API hinzustellen damit auch andere Programme, zB vdr, minisatip, konkurrierend zugreifen können.
So etwas ähnliches hatte ich mal vor, aber ich habe es dann gelassen, weil der VDR das ganze CAM Handling bereits implementiert hatte. Man hätte im Grunde ein neues CAM API erfinden müssen und alle Programme hätten ihren CAM Code darauf anpassen müssen. Und konkurrierend über mehrere Programme hinweg ..., na viel Spaß. Da würde man viel in den Programme umbauen (ersetzen/löschen) müssen.
Oder verkompliziert dies das Unterfangen zu sehr?
Ja!
Es ist halt so, dass jedes Programm das selbst implementieren muss. Und auf lange Sicht kann es gut sein, dass CI Module nicht mehr verfügbar sind, oder durch den CI+ Schmarrn ersetzt werden. Es gibt da zwar alternativen, aber ... . Also lohnt sich der Aufwand jetzt nicht mehr.
LG,
Jasmin -
Hallo,
funktioniert die aktuelle Version (0.0.15) noch mit VDR 2.2?
Weil ich habe eine Octopus mini V2 + DuoFlex S2 + Duoflex CI + FlexCI
Mit der alten Version vom ddci2 zeigt VDR alle CI Slots an, mit der neuen nur noch das erste.Muss man noch irgendwas einstellen?
Gruß Karl
Edit: Mit dem Patch von Klaus, funktioniert es wie es soll
-
funktioniert die aktuelle Version (0.0.15) noch mit VDR 2.2?
Ja, sollte es, nur ...
Mit der alten Version vom ddci2 zeigt VDR alle CI Slots an, mit der neuen nur noch das erste.
... da hat die Jasmin anscheinend was vermurkst, weil sie mal wieder nur auf dem VDR mit einem CI getestet hat. Der andere VDR zeigt mir das gleiche Verhalten wie bei dir:
Code
Display MoreMar 11 20:13:22 vdr2 vdr: [1234] starting plugin: ddci2 Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Inf: plugin version 0.0.15 initializing (compiled for VDR version 2.2.0) Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: found DD CI adapter '/dev/dvb/adapter3/ci0' Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: found DD CI adapter '/dev/dvb/adapter2/ci0' Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Inf: found 2 DD CI adapters Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: Try to open ca2 Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: Try to open ci2-w Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: Try to open ci2-r Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Inf: Creating DdCiAdapter 0 (/dev/dvb/adapter2/ca0) Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: DdCiTsSend for /dev/dvb/adapter2/ci0 created Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: DdCiTsRecvDeliver for /dev/dvb/adapter2/ci0 created Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: DdCiTsRecv for /dev/dvb/adapter2/ci0 created Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter2/ca0) created: DescrNum: 0, DescrType: 0, SlotNum: 1, , SlotTy pe: 2 Mar 11 20:13:22 vdr2 vdr: [1234] DDCI-Inf: plugin started
Scheint so, als ob ich das was in der Initialisierungschleife vergessen habe, weil es da wird auch "/dev/dvb/adapter3/ci0" vergessen.
Ich schau mir das gleich an.Edit: Mit dem Patch von Klaus, funktioniert es wie es soll
Klaus hat im Grunde nur ein "return true" bool in die Assign Funktion gemacht. Ich hab aber auch an der Initialisierung gedreht.
-
Eine neue Version 0.0.16 ist im git.
Wem interessiert was es war (klick
In Version 0.0.14 hat das Plugin nur so viele logische CAMs für den VDR angelegt, wie Devices gefunden wurden. Jetzt ist aber die Anzahl der Devices nicht unbedingt gleich der Anzahl der vorhandenen CI Slots. Deshalb habe ich das geändert.
Dummerweise habe ich die Schleife über alle Devices ersatzlos gestrichen, weshalb nur immer der erste CI Slot initialisiert wurde.LG,
Jasmin -
Grunsätzlich funktionieren tut es,
Code
Display MoreMar 11 21:13:38 [vdr] [10157] DDCI-Inf: plugin version 0.0.16 initializing (compiled for VDR version 2.2.0) Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: found DD CI adapter '/dev/dvb/adapter0/ci1' Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: found DD CI adapter '/dev/dvb/adapter0/ci0' Mar 11 21:13:38 [vdr] [10157] DDCI-Inf: found 2 DD CI adapters Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: Try to open ca0 Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: Try to open ci0-w Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: Try to open ci0-r Mar 11 21:13:38 [vdr] [10157] DDCI-Inf: Creating DdCiAdapter 0 (/dev/dvb/adapter0/ca0) Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: DdCiTsSend for /dev/dvb/adapter0/ci0 created Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: DdCiTsRecvDeliver for /dev/dvb/adapter0/ci0 created Mar 11 21:13:38 [vdr] [10157] DDCI-Dbg: DdCiTsRecv for /dev/dvb/adapter0/ci0 created Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) created: DescrNum: 0, DescrType: 0, SlotNum: 1, , SlotType: 2 Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: Try to open ca0 Mar 11 21:13:39 [vdr] [10214] DDCI adapter /dev/dvb/adapter0/ca0 thread started (pid=10157, tid=10214, prio=high) Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: Try to open ci0-w Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: Try to open ci0-r Mar 11 21:13:39 [vdr] [10216] DDCI Recv (/dev/dvb/adapter0/ci0) thread started (pid=10157, tid=10216, prio=high) Mar 11 21:13:39 [vdr] [10157] DDCI-Inf: Creating DdCiAdapter 0 (/dev/dvb/adapter0/ca1) Mar 11 21:13:39 [vdr] [10215] DDCI Send (/dev/dvb/adapter0/ci0) thread started (pid=10157, tid=10215, prio=high) Mar 11 21:13:39 [vdr] [10217] DDCI Recv Deliver (/dev/dvb/adapter0/ci0) thread started (pid=10157, tid=10217, prio=high) Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: DdCiTsSend for /dev/dvb/adapter0/ci1 created Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: DdCiTsRecvDeliver for /dev/dvb/adapter0/ci1 created Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: DdCiTsRecv for /dev/dvb/adapter0/ci1 created Mar 11 21:13:39 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca1) created: DescrNum: 0, DescrType: 0, SlotNum: 1, , SlotType: 2 Mar 11 21:13:39 [vdr] [10157] DDCI-Inf: plugin started Mar 11 21:13:39 [vdr] [10218] DDCI adapter /dev/dvb/adapter0/ca1 thread started (pid=10157, tid=10218, prio=high) Mar 11 21:13:39 [vdr] [10219] DDCI Send (/dev/dvb/adapter0/ci1) thread started (pid=10157, tid=10219, prio=high) Mar 11 21:13:39 [vdr] [10220] DDCI Recv (/dev/dvb/adapter0/ci1) thread started (pid=10157, tid=10220, prio=high) Mar 11 21:13:39 [vdr] [10221] DDCI Recv Deliver (/dev/dvb/adapter0/ci1) thread started (pid=10157, tid=10221, prio=high) Mar 11 21:13:48 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:48 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) assigned to device 1 Mar 11 21:13:48 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:48 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StartDecrypting()) Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StartDecrypting()) Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) unassigned from device 1 Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) assigned to device 1 Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:50 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StartDecrypting()) Mar 11 21:13:51 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StartDecrypting()) Mar 11 21:13:51 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:51 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) unassigned from device 1 Mar 11 21:13:53 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:53 [vdr] [10157] DDCI-Dbg: DdCiAdapter(/dev/dvb/adapter0/ca0) assigned to device 1 Mar 11 21:13:53 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StopDecrypting()) Mar 11 21:13:53 [vdr] [10157] DDCI-Dbg (virtual void DdCiCamSlot::StartDecrypting()) Mar 11 21:14:20 [vdr] [10219] DDCI Send (/dev/dvb/adapter0/ci1) thread ended (pid=10157, tid=10219) Mar 11 21:14:20 [vdr] [10221] DDCI Recv Deliver (/dev/dvb/adapter0/ci1) thread ended (pid=10157, tid=10221) Mar 11 21:14:20 [vdr] [10220] DDCI Recv (/dev/dvb/adapter0/ci1) thread ended (pid=10157, tid=10220) Mar 11 21:14:21 [vdr] [10218] DDCI adapter /dev/dvb/adapter0/ca1 thread ended (pid=10157, tid=10218)
leider aber bekomme ich beim Beenden des VDR einen segfault:
Code.... Mar 11 21:14:28 [vdr] [10157] deleting plugin: softhddevice Mar 11 21:14:28 [root] Focus: 1 Mar 11 21:14:28 [vdr] [10157] deleting plugin: ddci2 Mar 11 21:14:28 [G2V gg_switchhook.sh] /_config/bin/gg_switchhook.sh -switch ActWin <(1058, 1888) 0(Gg_launcher)> Mar 11 21:14:28 [kernel] DDCI adapter /d[10214]: segfault at 7f6fbb77bb82 ip 00007f6fbb77bb82 sp 00007f6fa1469630 error 14 in ISO8859-9.so[7f6fbb981000+2000] Mar 11 21:14:30 [root] Focus: (1058, 1888) 0(Gg_launcher) - 11104 Mar 11 21:14:31 [su] pam_unix(su:session): session closed for user root ...
-
-
[...] Jetzt sollte aber wirklich alles wieder funktionieren.
Ja, jetzt lässt sich der VDR wieder sauber beenden.Code
Display More.... Mar 11 21:51:23 [vdr] [703] EPGSearch: conflictcheck thread ended (pid=523, tid=703) Mar 11 21:51:23 [vdr] [523] deleting plugin: softhddevice Mar 11 21:51:23 [root] Focus: 1 Mar 11 21:51:23 [vdr] [523] deleting plugin: ddci2 Mar 11 21:51:23 [G2V gg_switchhook.sh] /_config/bin/gg_switchhook.sh -switch ActWin <(1058, 1888) 0(Gg_launcher)> Mar 11 21:51:24 [vdr] [523] max. latency time 1 seconds Mar 11 21:51:24 [vdr] [523] caught signal 1 Mar 11 21:51:24 [vdr] [523] exiting, exit code 1 Mar 11 21:51:25 [root] Focus: (1058, 1888) 0(Gg_launcher) - 806 Mar 11 21:51:26 [su] pam_unix(su:session): session closed for user root ....
-
Das gehört vlt. nicht unbedingt hierher, aber kann mir Jemand die Syntax für das "Redirecten" erklären?
Ich versuche gerade mit meinem Test-SATIP-Server mit einer Cine S2 + DuoFlex C/T + FlexCI, das CAM mit der Flex C/T zu "pipen", aber leider verstehe ich diese Anleitung nicht.
Das Setup sieht so aus:
dmesg
Code
Display More[ 179.767459] DDBridge: Digital Devices PCIE bridge driver 0.9.28, Copyright (C) 2010-16 Digital Devices GmbH [ 179.767869] DDBridge: device name: Digital Devices Cine S2 V6.5 DVB adapter [ 179.767888] DDBridge: HW 0001000d REGMAP 00010004 [ 179.767954] DDBridge: using 1 MSI interrupt(s) [ 179.767977] DDBridge: link 0 vendor dd01 device 0003 subvendor dd01 subdevice 0021 [ 179.769945] DDBridge: Port 0: Link 0, Link Port 0 (TAB 1): DUAL DVB-S2 [ 179.771435] DDBridge: XO2 ID 04 [ 179.901425] DDBridge: Port 1: Link 0, Link Port 1 (TAB 2): DUAL DVB-C/T/T2 [ 179.902762] DDBridge: Port 2: Link 0, Link Port 2 (TAB 3): CI [ 179.905364] DDBridge: Port 3: Link 0, Link Port 3 (TAB 4): NO MODULE [ 179.906817] DDBridge: 0 netstream channels [ 179.906820] DVB: registering new adapter (DDBridge) [ 180.212579] STV0900 version 0x30 [ 180.213148] LNBx2x attached on addr=a [ 180.213151] stv6110x_attach: Attaching STV6110x [ 180.213153] DDBridge: attach tuner input 0 adr 60 [ 180.213359] ddbridge 0000:01:00.0: DVB: registering adapter 0 frontend 0 (STV090x Multistandard)... [ 180.272584] STV0900 version 0x30 [ 180.273150] LNBx2x attached on addr=8 [ 180.273152] stv6110x_attach: Attaching STV6110x [ 180.273154] DDBridge: attach tuner input 1 adr 63 [ 180.273359] ddbridge 0000:01:00.0: DVB: registering adapter 0 frontend 1 (STV090x Multistandard)... [ 180.273956] attach [ 180.273958] is24Mhz = 0 [ 180.275208] ChipID = B1 [ 180.545837] ddbridge 0000:01:00.0: DVB: registering adapter 0 frontend 2 (CXD2837 DVB-C DVB-T/T2)... [ 180.546686] attach [ 180.546689] is24Mhz = 0 [ 180.547608] ChipID = B1 [ 180.900762] ddbridge 0000:01:00.0: DVB: registering adapter 0 frontend 3 (CXD2837 DVB-C DVB-T/T2)... [ 180.915992] Attached CXD2099AR at 40 [ 190.213598] dvb_ca adapter 0: DVB CAM detected and initialised successfully
/dev/dvbWie müssen denn die Werte für A, B, C, D sein, wenn ich "frontend2", dem "ca0" zuordnen will?
echo "AB CD" > /sys/class/ddbridge/ddbridge0/redirect
-
Vielleicht 02 02? Welche Kombinationen hast du schon ausprobiert? Ich meine, dass man den redirect vor dem ersten Zugriff setzen muss, also vdr stoppen, Treiber neu laden, redirect setzen, vdr starten.
Aber das sollte mit ddci2 ja eigentlich nicht mehr nötig sein.
Lars
-
Es geht nicht um einen VDR.
Leider ist das "Ausprobieren" nur wie Fischen im trüben Wasser, ich würde halt gerne sicher sein, dass das redirect richtig ist.
Participate now!
Don’t have an account yet? Register yourself now and be a part of our community!