What should be in data/GROUPS?
"GROUPS" files indicate lists of groups. One group per line, and the definition
uses the syntax "A::B::C" (without the quotes).

A is the human readable name for this group.
B is the group identified. It must be unique.
C is the list of sources for the data. It is a list of C1::C2 values (separated
by ::), C1 indicating how the URL in C2 should be interpreted.
Accepted values for C1:
- celcat: Expects an URL to a XML file generated by CELCAT.
- lazy_ics: Expects an URL to an ICS file. The filtering is "lazy", meaning that
   if an class name is part of an ICS event summary (even if it's not the whole
   summary), it will be considered part of this class (e.g. the event summary
   "Lego exam for class 3" will be matched by a class filtering for
   "Lego exam"). Events belonging to multiple classes are put in "unknown" and
   generate a warning in the logs.
- ics: Expects an URL to an ICS file. The filtering is strict, meaning that
   if the class name is not exactly the value of an ICS event summary, it
   will not get the event.
- lazy_ics_nouid: Imagine, for some reaaally weird reason, the ICS calendar
   you took as input had invalid UIDs (or repeating ones). This will behave like
   lazy_ics, but replaces all the UIDs from the input by (hopefully) sane ones.
- ics_nouid: Take a guess (or look at lazy_ics_nouid).
- dhx_cal: I don't remember exacly. Its was for the M2RIT_RO class, the url
   being http://m2rit-ro.recherche.enac.fr/calendrier/php/events.php.
- camsi: Parsing for the (likely no longer functioning) CAMSI website.

All Students::M2RIT_RO::dhx_cal::http://m2rit-ro.recherche.enac.fr/calendrier/php/events.php::lazy_ics::http://www.laas.fr/template/laas-cnrs-2009/support/protected/modules/seminaires/seminaires/calendrier/seminaires_laas.ics::lazy_ics::https://www.multiagentsystems.org/calendar/seminaires_toulouse.ics

What should be in data/CLASSES?
Same idea as the GROUPS, each line is an A::B::C entry.
C is unique ID for the class. Multiple fields sharing the same C values allow
   for multiple filters for that class.
B is the filter. It should also be unique. That text will be used to determine
   if an event belongs to the class.
A is the human readable name of the class. It should only be defined once per
   class (preferably at the first occurrence of the matching C value).

Optimisation numérique locale::Opti num locale::ONL
::TD Opti num locale Groupe B::ONL
::TD Opti num locale Groupe A::ONL
::TD Opti num locale::ONL
::TP Opti num locale::ONL
::TD A Opti num locale::ONL
::TD B Opti num locale::ONL
::TP A Opti num locale::ONL
::TP B Opti num locale::ONL
::EXAMEN : Opti num locale::ONL
::EXAMEN Opti num locale::ONL
::EXAMEN 1 - Opti num locale::ONL